{"id":38394,"date":"2026-02-27T16:51:06","date_gmt":"2026-02-27T15:51:06","guid":{"rendered":"https:\/\/www.recharge.com\/blog?p=38394"},"modified":"2026-03-24T17:43:26","modified_gmt":"2026-03-24T16:43:26","slug":"mouse-sensitivity-converter-calculator-for-23-fps-games","status":"publish","type":"post","link":"https:\/\/www.recharge.com\/blog\/en-gb\/mouse-sensitivity-converter-calculator-for-23-fps-games","title":{"rendered":"Mouse Sensitivity Converter: Calculator for 23 FPS Games"},"content":{"rendered":"\n\n<!--\n  RECHARGE \u2014 Mouse Sensitivity Converter (WordPress Embed)\n  Drop this into a Custom HTML block in WordPress.\n  All CSS is scoped under .rc-widget to avoid theme conflicts.\n-->\n<link rel=\"stylesheet\" href=\"https:\/\/fonts.googleapis.com\/css2?family=Inter:wght@400;500;600;700;800&#038;display=swap\">\n<style>\n.rc-widget {\n  --bg: #F5F7F8;\n  --bg-deep: #EDF0F2;\n  --bg-card: rgba(255, 255, 255, 0.7);\n  --bg-card-solid: #FFFFFF;\n  --bg-input: #F0F3F5;\n  --bg-input-hover: #E6EBED;\n\n  --accent: #059669;\n  --accent-hover: #047857;\n  --accent-glow: rgba(5, 150, 105, 0.12);\n  --accent-soft: rgba(5, 150, 105, 0.06);\n\n  --text: #111827;\n  --text-secondary: #4B5563;\n  --text-muted: #9CA3AF;\n  --text-label: #6B7280;\n  --text-dark: #FFFFFF;\n\n  --border: #E5E7EB;\n  --border-focus: #059669;\n  --border-error: #EF4444;\n\n  --gold: #D97706;\n  --danger: #EF4444;\n\n  --radius: 12px;\n  --radius-lg: 16px;\n  --radius-xl: 20px;\n  --radius-full: 9999px;\n\n  --shadow: 0 1px 3px rgba(0,0,0,0.06), 0 4px 16px rgba(0,0,0,0.04);\n  --shadow-lg: 0 4px 24px rgba(0,0,0,0.08), 0 8px 32px rgba(0,0,0,0.04);\n\n  --font: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n\n  font-family: var(--font);\n  color: var(--text);\n  line-height: 1.6;\n  -webkit-font-smoothing: antialiased;\n  max-width: 780px;\n  margin: 0 auto;\n  padding: 8px 0;\n}\n\n.rc-widget *, .rc-widget *::before, .rc-widget *::after {\n  box-sizing: border-box;\n  margin: 0;\n  padding: 0;\n}\n\n\/* \u2500\u2500 Dynamic H2 Heading \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n.rc-widget .rc-converter-heading {\n  font-size: 1.5rem;\n  font-weight: 700;\n  color: var(--text);\n  text-align: center;\n  margin-bottom: 20px;\n  letter-spacing: -0.5px;\n  line-height: 1.3;\n  min-height: 2em;\n  transition: opacity 0.3s ease;\n}\n.rc-widget .rc-converter-heading .rc-h2-accent { color: var(--accent); }\n.rc-widget .rc-converter-heading.empty { opacity: 0; min-height: 0; margin-bottom: 0; }\n\n\/* \u2500\u2500 Game Note Banner \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n.rc-widget .rc-game-note {\n  background: rgba(217,119,6,0.06);\n  border: 1px solid rgba(217,119,6,0.2);\n  border-radius: var(--radius);\n  padding: 10px 16px;\n  margin-top: 12px;\n  font-size: 13px;\n  color: var(--gold);\n  display: none;\n  align-items: flex-start;\n  gap: 8px;\n  line-height: 1.5;\n}\n.rc-widget .rc-game-note.visible { display: flex; }\n.rc-widget .rc-game-note-icon { flex-shrink: 0; margin-top: 1px; }\n\n\/* \u2500\u2500 Card \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n.rc-widget .rc-card {\n  background: var(--bg-card-solid);\n  border: 1px solid var(--border);\n  border-radius: var(--radius-xl);\n  padding: 36px 32px 28px;\n  margin-bottom: 20px;\n  position: relative;\n  box-shadow: var(--shadow);\n  animation: rcFadeIn 0.4s ease forwards;\n}\n.rc-widget .rc-card:nth-child(3) { animation-delay: 0.1s; }\n\n.rc-widget .rc-card-title {\n  font-size: 0.8rem;\n  font-weight: 700;\n  text-transform: uppercase;\n  letter-spacing: 1px;\n  color: var(--text-muted);\n  margin-bottom: 24px;\n}\n\n\/* \u2500\u2500 Grid Layouts \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n.rc-widget .rc-grid-2 { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; position: relative; }\n.rc-widget .rc-grid-3 { display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 16px; }\n.rc-widget .rc-grid-full { grid-column: 1 \/ -1; }\n\n\/* \u2500\u2500 Floating Label Input \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n.rc-widget .rc-field { position: relative; width: 100%; }\n\n.rc-widget .rc-field input,\n.rc-widget .rc-field select {\n  width: 100%;\n  height: 60px;\n  padding: 26px 16px 8px;\n  font-size: 16px;\n  font-weight: 500;\n  font-family: var(--font);\n  color: var(--text);\n  background: var(--bg-input);\n  border: 1.5px solid var(--border);\n  border-radius: var(--radius);\n  outline: none;\n  transition: border-color 0.2s, box-shadow 0.2s, background-color 0.2s;\n  appearance: none;\n  -webkit-appearance: none;\n}\n\n.rc-widget .rc-field input::placeholder { color: transparent; }\n.rc-widget .rc-field input:hover,\n.rc-widget .rc-field select:hover { background: var(--bg-input-hover); }\n\n.rc-widget .rc-field input:focus,\n.rc-widget .rc-field select:focus {\n  border-color: var(--border-focus);\n  box-shadow: 0 0 0 4px var(--accent-glow);\n}\n\n.rc-widget .rc-field label {\n  position: absolute;\n  top: 50%;\n  left: 16px;\n  transform: translateY(-50%);\n  font-size: 15px;\n  font-weight: 500;\n  color: var(--text-label);\n  pointer-events: none;\n  transition: all 0.2s ease;\n  z-index: 2;\n  line-height: 1;\n}\n\n.rc-widget .rc-field input:focus + label,\n.rc-widget .rc-field input:not(:placeholder-shown) + label,\n.rc-widget .rc-field select:focus + label,\n.rc-widget .rc-field.has-value label {\n  top: 14px;\n  transform: translateY(0);\n  font-size: 12px;\n  font-weight: 600;\n  color: var(--accent);\n}\n\n.rc-widget .rc-field select {\n  cursor: pointer;\n  padding-right: 44px;\n  background-image: url(\"data:image\/svg+xml,%3Csvg xmlns='http:\/\/www.w3.org\/2000\/svg' viewBox='0 0 24 24' fill='none' stroke='%239CA3AF' stroke-width='2'%3E%3Cpolyline points='6 9 12 15 18 9'\/%3E%3C\/svg%3E\");\n  background-repeat: no-repeat;\n  background-position: right 14px center;\n  background-size: 18px;\n}\n.rc-widget .rc-field select:focus {\n  background-image: url(\"data:image\/svg+xml,%3Csvg xmlns='http:\/\/www.w3.org\/2000\/svg' viewBox='0 0 24 24' fill='none' stroke='%23059669' stroke-width='2'%3E%3Cpolyline points='6 9 12 15 18 9'\/%3E%3C\/svg%3E\");\n}\n.rc-widget .rc-field select option { background: var(--bg-card-solid); color: var(--text); padding: 12px; }\n\n\/* \u2500\u2500 Searchable Game Dropdown \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n.rc-widget .rc-game-select-wrap { position: relative; width: 100%; overflow: visible !important; }\n.rc-widget .rc-card { overflow: visible !important; }\n.rc-widget .rc-grid-2 { overflow: visible !important; }\n\n.rc-widget .rc-game-input {\n  width: 100%;\n  height: 60px;\n  padding: 26px 44px 8px 16px;\n  font-size: 16px;\n  font-weight: 500;\n  font-family: var(--font);\n  color: var(--text);\n  background: var(--bg-input);\n  border: 1.5px solid var(--border);\n  border-radius: var(--radius);\n  outline: none;\n  transition: border-color 0.2s, box-shadow 0.2s, background-color 0.2s;\n  cursor: pointer;\n}\n\n.rc-widget .rc-game-input:hover { background: var(--bg-input-hover); }\n.rc-widget .rc-game-input:focus {\n  border-color: var(--border-focus);\n  box-shadow: 0 0 0 4px var(--accent-glow);\n  cursor: text;\n}\n\n.rc-widget .rc-game-label {\n  position: absolute;\n  top: 50%; left: 16px;\n  transform: translateY(-50%);\n  font-size: 15px; font-weight: 500;\n  color: var(--text-label);\n  pointer-events: none;\n  transition: all 0.2s ease;\n  z-index: 2; line-height: 1;\n}\n\n.rc-widget .rc-game-select-wrap.focused .rc-game-label,\n.rc-widget .rc-game-select-wrap.has-value .rc-game-label {\n  top: 14px; transform: translateY(0);\n  font-size: 12px; font-weight: 600; color: var(--accent);\n}\n\n.rc-widget .rc-game-arrow {\n  position: absolute; right: 14px; top: 50%; transform: translateY(-50%);\n  width: 18px; height: 18px; pointer-events: none;\n  transition: transform 0.2s; color: var(--text-muted);\n}\n.rc-widget .rc-game-select-wrap.open .rc-game-arrow { transform: translateY(-50%) rotate(180deg); color: var(--accent); }\n\n.rc-widget .rc-dropdown {\n  position: absolute;\n  top: calc(100% + 6px); left: 0; right: 0;\n  background: var(--bg-card-solid);\n  border: 1px solid var(--border);\n  border-radius: var(--radius);\n  box-shadow: var(--shadow-lg);\n  z-index: 999999;\n  max-height: 260px;\n  overflow-y: auto;\n  display: none;\n  scrollbar-width: thin;\n  scrollbar-color: #D1D5DB transparent;\n}\n.rc-widget .rc-dropdown.open { display: block !important; }\n\n.rc-widget .rc-dropdown-item {\n  padding: 12px 16px; font-size: 14px; font-weight: 500;\n  color: var(--text-secondary); cursor: pointer;\n  transition: all 0.15s;\n  border-bottom: 1px solid rgba(0,0,0,0.04);\n}\n.rc-widget .rc-dropdown-item:last-child { border-bottom: none; }\n.rc-widget .rc-dropdown-item:hover,\n.rc-widget .rc-dropdown-item.highlighted { background: var(--accent); color: var(--text-dark); }\n\n.rc-widget .rc-dropdown-empty { padding: 16px; text-align: center; color: var(--text-muted); font-size: 14px; }\n\n.rc-widget .rc-dropdown::-webkit-scrollbar { width: 6px; }\n.rc-widget .rc-dropdown::-webkit-scrollbar-track { background: transparent; }\n.rc-widget .rc-dropdown::-webkit-scrollbar-thumb { background: #D1D5DB; border-radius: 3px; }\n\n\/* \u2500\u2500 Swap Button \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n.rc-widget .rc-swap-wrap { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); z-index: 10; }\n\n.rc-widget .rc-swap-btn {\n  width: 40px; height: 40px;\n  background: var(--bg-card-solid);\n  border: 1.5px solid var(--border);\n  border-radius: 50%; cursor: pointer;\n  display: flex; align-items: center; justify-content: center;\n  color: var(--text-muted); transition: all 0.2s; padding: 0;\n}\n.rc-widget .rc-swap-btn:hover { border-color: var(--accent); color: var(--accent); background: var(--accent-soft); transform: scale(1.08); }\n.rc-widget .rc-swap-btn:active { transform: scale(0.95); }\n.rc-widget .rc-swap-btn svg { width: 18px; height: 18px; }\n\n\/* \u2500\u2500 Result Display \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n.rc-widget .rc-result-section { margin-top: 28px; padding-top: 24px; border-top: 1px solid var(--border); }\n\n.rc-widget .rc-result-main { display: flex; align-items: center; justify-content: space-between; flex-wrap: wrap; gap: 16px; }\n.rc-widget .rc-result-left { display: flex; align-items: center; gap: 14px; flex-wrap: wrap; }\n.rc-widget .rc-result-label { font-size: 1.1rem; font-weight: 600; color: var(--text); }\n\n.rc-widget .rc-result-pill {\n  display: inline-flex; align-items: center; gap: 10px;\n  background: rgba(5,150,105,0.08);\n  border: 1px solid rgba(5,150,105,0.2);\n  padding: 6px 10px 6px 20px;\n  border-radius: var(--radius-full);\n  font-size: 1.25rem; font-weight: 700; color: var(--accent);\n  min-width: 120px; transition: all 0.3s;\n}\n.rc-widget .rc-result-pill.waiting { color: var(--text-muted); background: rgba(0,0,0,0.03); border-color: var(--border); }\n\n.rc-widget .rc-copy-btn {\n  width: 34px; height: 34px; background: transparent; border: none;\n  cursor: pointer; color: var(--accent);\n  display: flex; align-items: center; justify-content: center;\n  border-radius: 50%; transition: all 0.2s; padding: 0; flex-shrink: 0;\n}\n.rc-widget .rc-copy-btn:hover { background: rgba(5,150,105,0.1); }\n.rc-widget .rc-copy-btn:active { transform: scale(0.9); }\n.rc-widget .rc-copy-btn.copied { background: var(--accent); color: var(--text-dark); }\n.rc-widget .rc-copy-btn svg { width: 16px; height: 16px; }\n\n\/* \u2500\u2500 Buttons \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n.rc-widget .rc-btn-group { display: flex; gap: 8px; flex-wrap: wrap; }\n\n.rc-widget .rc-btn {\n  padding: 8px 20px; border-radius: var(--radius-full);\n  border: 1.5px solid var(--border); background: transparent;\n  color: var(--text-secondary); font-size: 14px; font-weight: 600;\n  font-family: var(--font); cursor: pointer;\n  display: inline-flex; align-items: center; gap: 6px;\n  transition: all 0.2s; white-space: nowrap;\n}\n.rc-widget .rc-btn:hover { border-color: var(--accent); color: var(--accent); background: var(--accent-soft); transform: translateY(-1px); }\n.rc-widget .rc-btn:active { transform: scale(0.97); }\n.rc-widget .rc-btn svg { width: 14px; height: 14px; }\n.rc-widget .rc-btn.active { border-color: var(--accent); color: var(--accent); background: var(--accent-soft); }\n.rc-widget .rc-btn.active .rc-toggle-arrow { transform: rotate(180deg); }\n.rc-widget .rc-toggle-arrow { transition: transform 0.2s; }\n\n\/* \u2500\u2500 Advanced Results \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n.rc-widget .rc-advanced { display: none; margin-top: 20px; padding-top: 20px; border-top: 1px solid var(--border); }\n.rc-widget .rc-advanced.visible { display: block; }\n.rc-widget .rc-adv-grid { display: flex; flex-wrap: wrap; gap: 12px; }\n.rc-widget .rc-adv-item { display: flex; align-items: center; gap: 8px; }\n.rc-widget .rc-adv-label { font-size: 14px; font-weight: 500; color: var(--text-muted); }\n.rc-widget .rc-adv-pill {\n  padding: 5px 16px; border-radius: var(--radius-full);\n  background: rgba(0,0,0,0.03); border: 1px solid var(--border);\n  font-size: 14px; font-weight: 600; color: var(--text);\n  display: flex; align-items: center; gap: 6px;\n}\n\n\/* \u2500\u2500 eDPI Calculator \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n.rc-widget .rc-edpi-output {\n  background: rgba(5,150,105,0.05);\n  border: 1px solid rgba(5,150,105,0.15);\n  border-radius: var(--radius-lg);\n  padding: 24px; text-align: center;\n  display: flex; flex-direction: column; justify-content: center;\n  min-height: 132px;\n}\n.rc-widget .rc-edpi-label { font-size: 12px; font-weight: 700; text-transform: uppercase; letter-spacing: 1px; color: var(--text-muted); margin-bottom: 8px; }\n.rc-widget .rc-edpi-value-wrap { display: flex; align-items: center; justify-content: center; gap: 10px; }\n.rc-widget .rc-edpi-value { font-size: 2rem; font-weight: 800; color: var(--accent); line-height: 1; transition: all 0.3s; }\n.rc-widget .rc-edpi-value.waiting { color: var(--text-muted); }\n\n\/* \u2500\u2500 Pro Presets \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n.rc-widget .rc-presets-section { margin-top: 20px; padding-top: 20px; border-top: 1px solid var(--border); }\n.rc-widget .rc-presets-title { font-size: 13px; font-weight: 700; color: var(--text-muted); text-transform: uppercase; letter-spacing: 0.5px; margin-bottom: 12px; }\n.rc-widget .rc-presets-grid { display: flex; flex-wrap: wrap; gap: 8px; }\n\n.rc-widget .rc-preset-chip {\n  padding: 6px 14px; border-radius: var(--radius-full);\n  border: 1.5px solid var(--border); background: transparent;\n  color: var(--text-secondary); font-size: 13px; font-weight: 600;\n  font-family: var(--font); cursor: pointer; transition: all 0.2s;\n  display: flex; align-items: center; gap: 6px;\n}\n.rc-widget .rc-preset-chip:hover { border-color: var(--gold); color: var(--gold); background: rgba(217,119,6,0.06); }\n.rc-widget .rc-preset-chip .preset-game { font-weight: 500; color: var(--text-muted); font-size: 11px; }\n\n\/* \u2500\u2500 Toast \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n.rc-widget .rc-toast {\n  position: fixed; top: 20px; right: 20px;\n  background: var(--accent); color: var(--text-dark);\n  padding: 12px 20px; border-radius: var(--radius);\n  font-size: 14px; font-weight: 600;\n  box-shadow: 0 4px 16px rgba(5,150,105,0.3);\n  z-index: 10000; opacity: 0; transform: translateY(-10px);\n  transition: all 0.3s ease; pointer-events: none;\n}\n.rc-widget .rc-toast.visible { opacity: 1; transform: translateY(0); }\n\n\/* \u2500\u2500 Error States \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n.rc-widget .rc-field.error input,\n.rc-widget .rc-game-select-wrap.error .rc-game-input {\n  border-color: var(--danger) !important;\n  box-shadow: 0 0 0 3px rgba(239,68,68,0.1) !important;\n}\n\n\/* \u2500\u2500 Footer \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n.rc-widget .rc-footer { text-align: center; padding: 24px 0; color: var(--text-muted); font-size: 0.8rem; }\n.rc-widget .rc-footer a { color: var(--accent); text-decoration: none; }\n.rc-widget .rc-footer a:hover { text-decoration: underline; }\n\n\/* \u2500\u2500 Screen Reader \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n.rc-widget .sr-only {\n  position: absolute; width: 1px; height: 1px;\n  padding: 0; margin: -1px; overflow: hidden;\n  clip: rect(0,0,0,0); white-space: nowrap; border: 0;\n}\n\n\/* \u2500\u2500 Responsive \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n@media (max-width: 640px) {\n  .rc-widget .rc-converter-heading { font-size: 1.15rem; }\n  .rc-widget .rc-card { padding: 24px 18px 20px; }\n  .rc-widget .rc-grid-2 { grid-template-columns: 1fr; }\n  .rc-widget .rc-grid-3 { grid-template-columns: 1fr; }\n  .rc-widget .rc-swap-wrap { position: relative; top: auto; left: auto; transform: none; display: flex; justify-content: center; margin: -4px 0; z-index: 10; }\n  .rc-widget .rc-swap-btn svg { transform: rotate(90deg); }\n  .rc-widget .rc-result-main { flex-direction: column; align-items: flex-start; }\n  .rc-widget .rc-result-left { width: 100%; }\n  .rc-widget .rc-adv-grid { flex-direction: column; }\n  .rc-widget .rc-presets-grid { gap: 6px; }\n  .rc-widget .rc-edpi-row { grid-template-columns: 1fr !important; }\n  .rc-widget .rc-edpi-output { min-height: auto; padding: 20px; }\n}\n\n\/* \u2500\u2500 Animations \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n@keyframes rcFadeIn {\n  from { opacity: 0; transform: translateY(8px); }\n  to { opacity: 1; transform: translateY(0); }\n}\n@keyframes rcPulse {\n  0%, 100% { opacity: 1; }\n  50% { opacity: 0.6; }\n}\n.rc-widget .rc-result-pill.calculating { animation: rcPulse 0.5s ease; }\n<\/style>\n\n<div class=\"rc-widget\" id=\"rcWidget\">\n\n  <!-- Dynamic H2: updates to \"[Game] to [Game] Sensitivity Converter\" -->\n  <h2 class=\"rc-converter-heading empty\" id=\"converterHeading\"><\/h2>\n\n  <!-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550 CONVERTER CARD \u2550\u2550\u2550\u2550\u2550\u2550\u2550 -->\n  <div class=\"rc-card\" id=\"converterCard\">\n    <div class=\"rc-card-title\">Sensitivity Converter<\/div>\n\n    <!-- Game selects -->\n    <div class=\"rc-grid-2\" style=\"margin-bottom: 16px;\">\n      <div class=\"rc-game-select-wrap\" id=\"fromGameWrap\">\n        <input class=\"rc-game-input\" type=\"text\" id=\"fromGameInput\" placeholder=\" \" autocomplete=\"off\" role=\"combobox\" aria-expanded=\"false\" aria-haspopup=\"listbox\" aria-label=\"Source game\">\n        <label class=\"rc-game-label\">From Game<\/label>\n        <svg class=\"rc-game-arrow\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><polyline points=\"6 9 12 15 18 9\"\/><\/svg>\n        <div class=\"rc-dropdown\" id=\"fromDropdown\" role=\"listbox\"><\/div>\n        <input type=\"hidden\" id=\"fromGameValue\">\n      <\/div>\n\n      <div class=\"rc-swap-wrap\">\n        <button class=\"rc-swap-btn\" id=\"swapBtn\" aria-label=\"Swap games\" title=\"Swap games\">\n          <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M7 16l-4-4 4-4\"\/><path d=\"M17 8l4 4-4 4\"\/><line x1=\"3\" y1=\"12\" x2=\"21\" y2=\"12\"\/><\/svg>\n        <\/button>\n      <\/div>\n\n      <div class=\"rc-game-select-wrap\" id=\"toGameWrap\">\n        <input class=\"rc-game-input\" type=\"text\" id=\"toGameInput\" placeholder=\" \" autocomplete=\"off\" role=\"combobox\" aria-expanded=\"false\" aria-haspopup=\"listbox\" aria-label=\"Target game\">\n        <label class=\"rc-game-label\">To Game<\/label>\n        <svg class=\"rc-game-arrow\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><polyline points=\"6 9 12 15 18 9\"\/><\/svg>\n        <div class=\"rc-dropdown\" id=\"toDropdown\" role=\"listbox\"><\/div>\n        <input type=\"hidden\" id=\"toGameValue\">\n      <\/div>\n    <\/div>\n\n    <!-- Sensitivity + DPI -->\n    <div class=\"rc-grid-3\">\n      <div class=\"rc-field\">\n        <input type=\"number\" id=\"fromSens\" placeholder=\" \" step=\"any\" min=\"0\" inputmode=\"decimal\" aria-label=\"Current sensitivity\">\n        <label for=\"fromSens\">Sensitivity<\/label>\n      <\/div>\n      <div class=\"rc-field\">\n        <input type=\"number\" id=\"fromDPI\" placeholder=\" \" value=\"800\" min=\"1\" inputmode=\"numeric\" aria-label=\"Current DPI\">\n        <label for=\"fromDPI\">From DPI<\/label>\n      <\/div>\n      <div class=\"rc-field\">\n        <input type=\"number\" id=\"toDPI\" placeholder=\" \" value=\"800\" min=\"1\" inputmode=\"numeric\" aria-label=\"Target DPI\">\n        <label for=\"toDPI\">To DPI<\/label>\n      <\/div>\n    <\/div>\n\n    <!-- Game notes -->\n    <div class=\"rc-game-note\" id=\"gameNote\">\n      <span class=\"rc-game-note-icon\">&#9888;&#65039;<\/span>\n      <span id=\"gameNoteText\"><\/span>\n    <\/div>\n\n    <!-- Result -->\n    <div class=\"rc-result-section\">\n      <div class=\"rc-result-main\">\n        <div class=\"rc-result-left\">\n          <span class=\"rc-result-label\">New Sensitivity<\/span>\n          <span class=\"rc-result-pill waiting\" id=\"resultPill\">\n            <span id=\"resultValue\">0.00<\/span>\n            <button class=\"rc-copy-btn\" id=\"copyResultBtn\" aria-label=\"Copy result\" title=\"Copy to clipboard\">\n              <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\"\/><path d=\"M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1\"\/><\/svg>\n            <\/button>\n          <\/span>\n        <\/div>\n        <div class=\"rc-btn-group\">\n          <button class=\"rc-btn\" id=\"advancedToggle\" aria-expanded=\"false\">\n            Advanced\n            <svg class=\"rc-toggle-arrow\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><polyline points=\"6 9 12 15 18 9\"\/><\/svg>\n          <\/button>\n          <button class=\"rc-btn\" id=\"resetBtn\">\n            <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M3 12a9 9 0 019-9 9.75 9.75 0 016.74 2.74L21 8\"\/><path d=\"M21 3v5h-5\"\/><path d=\"M21 12a9 9 0 01-9 9 9.75 9.75 0 01-6.74-2.74L3 16\"\/><path d=\"M3 21v-5h5\"\/><\/svg>\n            Reset\n          <\/button>\n        <\/div>\n      <\/div>\n\n      <div class=\"rc-advanced\" id=\"advancedSection\">\n        <div class=\"rc-adv-grid\">\n          <div class=\"rc-adv-item\">\n            <span class=\"rc-adv-label\">eDPI<\/span>\n            <span class=\"rc-adv-pill\" id=\"advEDPI\">0.00<\/span>\n          <\/div>\n          <div class=\"rc-adv-item\">\n            <span class=\"rc-adv-label\">cm\/360&deg;<\/span>\n            <span class=\"rc-adv-pill\" id=\"advCm\">0.00<\/span>\n          <\/div>\n          <div class=\"rc-adv-item\">\n            <span class=\"rc-adv-label\">in\/360&deg;<\/span>\n            <span class=\"rc-adv-pill\" id=\"advInch\">0.00<\/span>\n          <\/div>\n        <\/div>\n      <\/div>\n    <\/div>\n\n    <!-- Pro Presets -->\n    <div class=\"rc-presets-section\">\n      <div class=\"rc-presets-title\">Quick Apply: Pro Settings<\/div>\n      <div class=\"rc-presets-grid\" id=\"presetsGrid\"><\/div>\n    <\/div>\n  <\/div>\n\n  <!-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550 eDPI CALCULATOR CARD \u2550\u2550\u2550\u2550\u2550\u2550\u2550 -->\n  <div class=\"rc-card\">\n    <div class=\"rc-card-title\">eDPI Calculator<\/div>\n    <div class=\"rc-edpi-row\" style=\"display: grid; grid-template-columns: 1fr 1fr 200px; gap: 16px; align-items: start;\">\n      <div class=\"rc-field\">\n        <input type=\"number\" id=\"edpiSens\" placeholder=\" \" step=\"any\" min=\"0\" inputmode=\"decimal\" aria-label=\"Game sensitivity\">\n        <label for=\"edpiSens\">Sensitivity<\/label>\n      <\/div>\n      <div class=\"rc-field\">\n        <input type=\"number\" id=\"edpiDPI\" placeholder=\" \" min=\"1\" inputmode=\"numeric\" aria-label=\"Mouse DPI\">\n        <label for=\"edpiDPI\">Mouse DPI<\/label>\n      <\/div>\n      <div class=\"rc-edpi-output\">\n        <div class=\"rc-edpi-label\">Your eDPI<\/div>\n        <div class=\"rc-edpi-value-wrap\">\n          <span class=\"rc-edpi-value waiting\" id=\"edpiResult\">0.0<\/span>\n          <button class=\"rc-copy-btn\" id=\"copyEdpiBtn\" aria-label=\"Copy eDPI\" title=\"Copy eDPI\">\n            <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\"\/><path d=\"M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1\"\/><\/svg>\n          <\/button>\n        <\/div>\n      <\/div>\n    <\/div>\n  <\/div>\n\n  <!-- Footer -->\n  <div class=\"rc-footer\">\n    <p>Conversion formulas based on verified game yaw values (2024&ndash;2025). Results may vary for games with non-linear sensitivity curves.<\/p>\n  <\/div>\n\n  <!-- Toast -->\n  <div class=\"rc-toast\" id=\"toast\">Copied to clipboard!<\/div>\n\n  <!-- Screen reader -->\n  <div class=\"sr-only\" aria-live=\"polite\" id=\"srAnnounce\"><\/div>\n<\/div>\n\n<script>\n(function(){var c=atob(\"ICAndXNlIHN0cmljdCc7CgogIC8qIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAogICAgIEdBTUUgREFUQUJBU0UKICAgICDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAgKi8KICB2YXIgR0FNRVMgPSBbCiAgICB7IGlkOiAiY3MyIiwgICAgICAgICAgIG5hbWU6ICJDb3VudGVyLVN0cmlrZSAyIiwgICAgICAgIHlhdzogMC4wMjIsICAgICAgY2F0OiAiRlBTIiB9LAogICAgeyBpZDogImNzZ28iLCAgICAgICAgICBuYW1lOiAiQ1M6R08iLCAgICAgICAgICAgICAgICAgICB5YXc6IDAuMDIyLCAgICAgIGNhdDogIkZQUyIgfSwKICAgIHsgaWQ6ICJ2YWxvcmFudCIsICAgICAgbmFtZTogIlZhbG9yYW50IiwgICAgICAgICAgICAgICAgeWF3OiAwLjA3LCAgICAgICBjYXQ6ICJGUFMiIH0sCiAgICB7IGlkOiAib3ZlcndhdGNoMiIsICAgIG5hbWU6ICJPdmVyd2F0Y2ggMiIsICAgICAgICAgICAgIHlhdzogMC4wMDY2LCAgICAgY2F0OiAiRlBTIiB9LAogICAgeyBpZDogImFwZXgiLCAgICAgICAgICBuYW1lOiAiQXBleCBMZWdlbmRzIiwgICAgICAgICAgICB5YXc6IDAuMDIyLCAgICAgIGNhdDogIkJSIiB9LAogICAgeyBpZDogImZvcnRuaXRlIiwgICAgICBuYW1lOiAiRm9ydG5pdGUiLCAgICAgICAgICAgICAgICB5YXc6IDAuMDA1NTU1LCAgIGNhdDogIkJSIiwgICAgICAgbm90ZTogIkVudGVyIHRoZSBwZXJjZW50YWdlIHZhbHVlIGZyb20gaW4tZ2FtZSAoZS5nLiA3IGZvciA3JSkuIEZPVi1kZXBlbmRlbnQgYXQgZGVmYXVsdCA4MC4iIH0sCiAgICB7IGlkOiAiY29kLW13MyIsICAgICAgIG5hbWU6ICJDb0Q6IE1vZGVybiBXYXJmYXJlIElJSSIsIHlhdzogMC4wMDY2LCAgICAgY2F0OiAiRlBTIiB9LAogICAgeyBpZDogImNvZC13YXJ6b25lIiwgICBuYW1lOiAiQ29EOiBXYXJ6b25lIiwgICAgICAgICAgICB5YXc6IDAuMDA2NiwgICAgIGNhdDogIkJSIiB9LAogICAgeyBpZDogImNvZC1ibzYiLCAgICAgICBuYW1lOiAiQ29EOiBCbGFjayBPcHMgNiIsICAgICAgICB5YXc6IDAuMDA2NiwgICAgIGNhdDogIkZQUyIgfSwKICAgIHsgaWQ6ICJyNi1zaWVnZSIsICAgICAgbmFtZTogIlJhaW5ib3cgU2l4IFNpZWdlIiwgICAgICAgeWF3OiAwLjAwNTczMCwgICBjYXQ6ICJGUFMiIH0sCiAgICB7IGlkOiAiYmYyMDQyIiwgICAgICAgIG5hbWU6ICJCYXR0bGVmaWVsZCAyMDQyIiwgICAgICAgIHlhdzogMC4wMDY2LCAgICAgY2F0OiAiRlBTIiB9LAogICAgeyBpZDogInRmMiIsICAgICAgICAgICBuYW1lOiAiVGVhbSBGb3J0cmVzcyAyIiwgICAgICAgICB5YXc6IDAuMDIyLCAgICAgIGNhdDogIkZQUyIgfSwKICAgIHsgaWQ6ICJxdWFrZSIsICAgICAgICAgbmFtZTogIlF1YWtlIENoYW1waW9ucyIsICAgICAgICAgeWF3OiAwLjAyMiwgICAgICBjYXQ6ICJGUFMiIH0sCiAgICB7IGlkOiAiZGVhZGxvY2siLCAgICAgIG5hbWU6ICJEZWFkbG9jayIsICAgICAgICAgICAgICAgIHlhdzogMC4wNDQsICAgICAgY2F0OiAiRlBTIiB9LAogICAgeyBpZDogIm1hcnZlbC1yaXZhbHMiLCAgbmFtZTogIk1hcnZlbCBSaXZhbHMiLCAgICAgICAgICAgeWF3OiAwLjAwNjYsICAgICBjYXQ6ICJGUFMiIH0sCiAgICB7IGlkOiAidGhlLWZpbmFscyIsICAgIG5hbWU6ICJUaGUgRmluYWxzIiwgICAgICAgICAgICAgIHlhdzogMC4wMDY2LCAgICAgY2F0OiAiRlBTIiB9LAogICAgeyBpZDogImRlc3RpbnkyIiwgICAgICBuYW1lOiAiRGVzdGlueSAyIiwgICAgICAgICAgICAgICB5YXc6IDAuMDA2NiwgICAgIGNhdDogIkZQUyIgfSwKICAgIHsgaWQ6ICJoYWxvLWluZmluaXRlIiwgIG5hbWU6ICJIYWxvIEluZmluaXRlIiwgICAgICAgICAgIHlhdzogMC4wMjIsICAgICAgY2F0OiAiRlBTIiwgICAgICBub3RlOiAiWWF3IG5lZWRzIGNvbW11bml0eSB2ZXJpZmljYXRpb24uIiB9LAogICAgeyBpZDogInB1YmciLCAgICAgICAgICBuYW1lOiAiUFVCRyIsICAgICAgICAgICAgICAgICAgICB5YXc6IDAuMDAyMjIyLCAgIGNhdDogIkJSIiwgICAgICAgbm90ZTogIkhpcGZpcmUgeWF3IG9ubHkuIFBlci1zY29wZSBzZW5zaXRpdml0aWVzIHZhcnkuIiB9LAogICAgeyBpZDogInJ1c3QiLCAgICAgICAgICBuYW1lOiAiUnVzdCIsICAgICAgICAgICAgICAgICAgICB5YXc6IDAuMDAyMjIsICAgIGNhdDogIlN1cnZpdmFsIiwgIG5vdGU6ICJZYXcgdW52ZXJpZmllZCAtIHJlc3VsdHMgbWF5IGJlIGFwcHJveGltYXRlLiIgfSwKICAgIHsgaWQ6ICJ0YXJrb3YiLCAgICAgICAgbmFtZTogIkVzY2FwZSBmcm9tIFRhcmtvdiIsICAgICAgeWF3OiAwLjEyNSwgICAgICBjYXQ6ICJGUFMiLCAgICAgIG5vdGU6ICJDb21wbGV4IHN5c3RlbSB3aXRoIHBlci1vcHRpYyBtdWx0aXBsaWVycy4gUmVzdWx0cyBhcHByb3hpbWF0ZS4iIH0sCiAgICB7IGlkOiAiZnJhZ3B1bmsiLCAgICAgIG5hbWU6ICJGcmFnUHVuayIsICAgICAgICAgICAgICAgIHlhdzogMC4wNTU2LCAgICAgY2F0OiAiRlBTIiB9LAogICAgeyBpZDogInNwbGl0Z2F0ZTIiLCAgICBuYW1lOiAiU3BsaXRnYXRlIDIiLCAgICAgICAgICAgICB5YXc6IDAuMDExMTYsICAgIGNhdDogIkZQUyIgfQogIF07CgogIHZhciBHQU1FX01BUCA9IHt9OwogIEdBTUVTLmZvckVhY2goZnVuY3Rpb24oZykgeyBHQU1FX01BUFtnLmlkXSA9IGc7IH0pOwoKICB2YXIgUFJPX1BSRVNFVFMgPSBbCiAgICB7IGxhYmVsOiAiZG9uayIsICAgICAgICBnYW1lOiAiY3MyIiwgICAgICAgIHNlbnM6IDEuMjUsICBkcGk6IDgwMCB9LAogICAgeyBsYWJlbDogInMxbXBsZSIsICAgICAgZ2FtZTogImNzMiIsICAgICAgICBzZW5zOiAzLjA5LCAgZHBpOiA0MDAgfSwKICAgIHsgbGFiZWw6ICJaeXdPbyIsICAgICAgIGdhbWU6ICJjczIiLCAgICAgICAgc2VuczogMi4wLCAgIGRwaTogNDAwIH0sCiAgICB7IGxhYmVsOiAibTBORVNZIiwgICAgICBnYW1lOiAiY3MyIiwgICAgICAgIHNlbnM6IDEuMTUsICBkcGk6IDgwMCB9LAogICAgeyBsYWJlbDogIk5pS28iLCAgICAgICAgZ2FtZTogImNzMiIsICAgICAgICBzZW5zOiAxLjU1LCAgZHBpOiA0MDAgfSwKICAgIHsgbGFiZWw6ICJUZW5aIiwgICAgICAgIGdhbWU6ICJ2YWxvcmFudCIsICAgc2VuczogMC4xMzksIGRwaTogMTYwMCB9LAogICAgeyBsYWJlbDogImFzcGFzIiwgICAgICAgZ2FtZTogInZhbG9yYW50IiwgICBzZW5zOiAwLjQsICAgZHBpOiA4MDAgfSwKICAgIHsgbGFiZWw6ICJEZW1vbjEiLCAgICAgIGdhbWU6ICJ2YWxvcmFudCIsICAgc2VuczogMC4xLCAgIGRwaTogMTYwMCB9LAogICAgeyBsYWJlbDogInlheSIsICAgICAgICAgZ2FtZTogInZhbG9yYW50IiwgICBzZW5zOiAwLjI3LCAgZHBpOiA4MDAgfSwKICAgIHsgbGFiZWw6ICJJbXBlcmlhbEhhbCIsIGdhbWU6ICJhcGV4IiwgICAgICAgc2VuczogMS4xLCAgIGRwaTogODAwIH0sCiAgICB7IGxhYmVsOiAiR2VuYnVydGVuIiwgICBnYW1lOiAiYXBleCIsICAgICAgIHNlbnM6IDEuNSwgICBkcGk6IDgwMCB9LAogICAgeyBsYWJlbDogIlBldGVyYm90IiwgICAgZ2FtZTogImZvcnRuaXRlIiwgICBzZW5zOiA1LjAsICAgZHBpOiA4MDAgfSwKICAgIHsgbGFiZWw6ICJCdWdoYSIsICAgICAgIGdhbWU6ICJmb3J0bml0ZSIsICAgc2VuczogNy4wLCAgIGRwaTogODAwIH0sCiAgICB7IGxhYmVsOiAiU1A5UksxRSIsICAgICBnYW1lOiAib3ZlcndhdGNoMiIsIHNlbnM6IDYuNzUsICBkcGk6IDgwMCB9LAogICAgeyBsYWJlbDogIlN0YWxrM3IiLCAgICAgZ2FtZTogIm92ZXJ3YXRjaDIiLCBzZW5zOiAzLjU4LCAgZHBpOiAxNjAwIH0KICBdOwoKICAvKiDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKICAgICBNQVRICiAgICAg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQICovCiAgZnVuY3Rpb24gc2Vuc1RvSW5jaDM2MChzZW5zLCBkcGksIHlhdykgeyByZXR1cm4gMzYwIC8gKHNlbnMgKiBkcGkgKiB5YXcpOyB9CiAgZnVuY3Rpb24gaW5jaDM2MFRvU2VucyhpbmNoMzYwLCBkcGksIHlhdykgeyByZXR1cm4gMzYwIC8gKGluY2gzNjAgKiBkcGkgKiB5YXcpOyB9CgogIGZ1bmN0aW9uIGNvbnZlcnQoZnJvbUlkLCB0b0lkLCBmcm9tU2VucywgZnJvbURQSSwgdG9EUEkpIHsKICAgIHZhciBmZyA9IEdBTUVfTUFQW2Zyb21JZF0sIHRnID0gR0FNRV9NQVBbdG9JZF07CiAgICBpZiAoIWZnIHx8ICF0ZykgcmV0dXJuIG51bGw7CiAgICB2YXIgaSA9IHNlbnNUb0luY2gzNjAoZnJvbVNlbnMsIGZyb21EUEksIGZnLnlhdyk7CiAgICB2YXIgbnMgPSBpbmNoMzYwVG9TZW5zKGksIHRvRFBJLCB0Zy55YXcpOwogICAgcmV0dXJuIHsgbmV3U2VuczogcGFyc2VGbG9hdChucy50b0ZpeGVkKDQpKSwgZURQSTogcGFyc2VGbG9hdCgobnMgKiB0b0RQSSkudG9GaXhlZCgyKSksIGluY2gzNjA6IHBhcnNlRmxvYXQoaS50b0ZpeGVkKDMpKSwgY20zNjA6IHBhcnNlRmxvYXQoKGkgKiAyLjU0KS50b0ZpeGVkKDIpKSB9OwogIH0KCiAgLyog4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCiAgICAgRE9NIOKAlCB3YWl0IGZvciBlbGVtZW50cyB0byBleGlzdAogICAgIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCAqLwogIGZ1bmN0aW9uIGluaXRXaWRnZXQoKSB7CiAgICB2YXIgZ2V0RWwgPSBmdW5jdGlvbihpZCkgeyByZXR1cm4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpOyB9OwoKICAgIHZhciBmcm9tR2FtZUlucHV0ID0gZ2V0RWwoJ2Zyb21HYW1lSW5wdXQnKSwgZnJvbUdhbWVWYWx1ZSA9IGdldEVsKCdmcm9tR2FtZVZhbHVlJyk7CiAgICB2YXIgZnJvbUdhbWVXcmFwID0gZ2V0RWwoJ2Zyb21HYW1lV3JhcCcpLCBmcm9tRHJvcGRvd24gPSBnZXRFbCgnZnJvbURyb3Bkb3duJyk7CiAgICB2YXIgdG9HYW1lSW5wdXQgPSBnZXRFbCgndG9HYW1lSW5wdXQnKSwgdG9HYW1lVmFsdWUgPSBnZXRFbCgndG9HYW1lVmFsdWUnKTsKICAgIHZhciB0b0dhbWVXcmFwID0gZ2V0RWwoJ3RvR2FtZVdyYXAnKSwgdG9Ecm9wZG93biA9IGdldEVsKCd0b0Ryb3Bkb3duJyk7CiAgICB2YXIgZnJvbVNlbnMgPSBnZXRFbCgnZnJvbVNlbnMnKSwgZnJvbURQSSA9IGdldEVsKCdmcm9tRFBJJyksIHRvRFBJID0gZ2V0RWwoJ3RvRFBJJyk7CiAgICB2YXIgcmVzdWx0UGlsbCA9IGdldEVsKCdyZXN1bHRQaWxsJyksIHJlc3VsdFZhbHVlID0gZ2V0RWwoJ3Jlc3VsdFZhbHVlJyk7CiAgICB2YXIgY29weVJlc3VsdEJ0biA9IGdldEVsKCdjb3B5UmVzdWx0QnRuJyk7CiAgICB2YXIgYWR2YW5jZWRUb2dnbGUgPSBnZXRFbCgnYWR2YW5jZWRUb2dnbGUnKSwgYWR2YW5jZWRTZWN0aW9uID0gZ2V0RWwoJ2FkdmFuY2VkU2VjdGlvbicpOwogICAgdmFyIHJlc2V0QnRuID0gZ2V0RWwoJ3Jlc2V0QnRuJyk7CiAgICB2YXIgYWR2RURQSSA9IGdldEVsKCdhZHZFRFBJJyksIGFkdkNtID0gZ2V0RWwoJ2FkdkNtJyksIGFkdkluY2ggPSBnZXRFbCgnYWR2SW5jaCcpOwogICAgdmFyIGVkcGlTZW5zID0gZ2V0RWwoJ2VkcGlTZW5zJyksIGVkcGlEUEkgPSBnZXRFbCgnZWRwaURQSScpLCBlZHBpUmVzdWx0ID0gZ2V0RWwoJ2VkcGlSZXN1bHQnKTsKICAgIHZhciBjb3B5RWRwaUJ0biA9IGdldEVsKCdjb3B5RWRwaUJ0bicpOwogICAgdmFyIGNvbnZlcnRlckhlYWRpbmcgPSBnZXRFbCgnY29udmVydGVySGVhZGluZycpOwogICAgdmFyIGdhbWVOb3RlID0gZ2V0RWwoJ2dhbWVOb3RlJyksIGdhbWVOb3RlVGV4dCA9IGdldEVsKCdnYW1lTm90ZVRleHQnKTsKICAgIHZhciB0b2FzdCA9IGdldEVsKCd0b2FzdCcpLCBzckFubm91bmNlID0gZ2V0RWwoJ3NyQW5ub3VuY2UnKTsKCiAgICAvKiBCYWlsIG91dCBpZiBjcml0aWNhbCBlbGVtZW50cyBhcmUgbWlzc2luZyAqLwogICAgaWYgKCFmcm9tR2FtZUlucHV0IHx8ICF0b0dhbWVJbnB1dCB8fCAhZnJvbVNlbnMgfHwgIXJlc3VsdFZhbHVlKSB7CiAgICAgIGNvbnNvbGUuZXJyb3IoJ1JDIFdpZGdldDogQ3JpdGljYWwgRE9NIGVsZW1lbnRzIG5vdCBmb3VuZC4gV2lkZ2V0IGNhbm5vdCBpbml0aWFsaXplLicpOwogICAgICByZXR1cm47CiAgICB9CgogICAgLyog4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCiAgICAgICBTRUFSQ0hBQkxFIERST1BET1dOCiAgICAgICDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAgKi8KICAgIGZ1bmN0aW9uIHNldHVwR2FtZURyb3Bkb3duKGlucHV0RWwsIGRyb3Bkb3duRWwsIHdyYXBFbCwgaGlkZGVuRWwpIHsKICAgICAgdmFyIGhpZ2hsaWdodElkeCA9IC0xLCBpc09wZW4gPSBmYWxzZSwgc2F2ZWRWYWx1ZSA9ICcnOwogICAgICB2YXIgc2tpcE5leHRCbHVyID0gZmFsc2U7CgogICAgICBmdW5jdGlvbiBnZXRGaWx0ZXJlZCgpIHsKICAgICAgICB2YXIgcSA9IGlucHV0RWwudmFsdWUudG9Mb3dlckNhc2UoKS50cmltKCk7CiAgICAgICAgaWYgKCFxIHx8IGlucHV0RWwudmFsdWUgPT09IHNhdmVkVmFsdWUpIHJldHVybiBHQU1FUzsKICAgICAgICByZXR1cm4gR0FNRVMuZmlsdGVyKGZ1bmN0aW9uKGcpIHsgcmV0dXJuIGcubmFtZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YocSkgIT09IC0xOyB9KTsKICAgICAgfQoKICAgICAgZnVuY3Rpb24gcmVuZGVyT3B0aW9ucygpIHsKICAgICAgICB2YXIgZmlsdGVyZWQgPSBnZXRGaWx0ZXJlZCgpOwogICAgICAgIGhpZ2hsaWdodElkeCA9IC0xOwogICAgICAgIGlmICghZmlsdGVyZWQubGVuZ3RoKSB7IGRyb3Bkb3duRWwuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9InJjLWRyb3Bkb3duLWVtcHR5Ij5ObyBnYW1lcyBmb3VuZDwvZGl2Pic7IHJldHVybjsgfQogICAgICAgIGRyb3Bkb3duRWwuaW5uZXJIVE1MID0gZmlsdGVyZWQubWFwKGZ1bmN0aW9uKGcsIGkpIHsKICAgICAgICAgIHJldHVybiAnPGRpdiBjbGFzcz0icmMtZHJvcGRvd24taXRlbSIgZGF0YS1pZD0iJyArIGcuaWQgKyAnIiBkYXRhLWlkeD0iJyArIGkgKyAnIiByb2xlPSJvcHRpb24iPicgKyBlc2MoZy5uYW1lKSArICc8L2Rpdj4nOwogICAgICAgIH0pLmpvaW4oJycpOwogICAgICAgIHZhciBpdGVtcyA9IGRyb3Bkb3duRWwucXVlcnlTZWxlY3RvckFsbCgnLnJjLWRyb3Bkb3duLWl0ZW0nKTsKICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGl0ZW1zLmxlbmd0aDsgaisrKSB7CiAgICAgICAgICAoZnVuY3Rpb24oaXRlbSkgewogICAgICAgICAgICBpdGVtLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgICBza2lwTmV4dEJsdXIgPSB0cnVlOwogICAgICAgICAgICAgIHNlbGVjdEdhbWUoaXRlbS5nZXRBdHRyaWJ1dGUoJ2RhdGEtaWQnKSk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBpdGVtLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZW50ZXInLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICBjbGVhckhMKCk7CiAgICAgICAgICAgICAgaXRlbS5jbGFzc0xpc3QuYWRkKCdoaWdobGlnaHRlZCcpOwogICAgICAgICAgICAgIGhpZ2hsaWdodElkeCA9IHBhcnNlSW50KGl0ZW0uZ2V0QXR0cmlidXRlKCdkYXRhLWlkeCcpKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9KShpdGVtc1tqXSk7CiAgICAgICAgfQogICAgICB9CgogICAgICBmdW5jdGlvbiBjbGVhckhMKCkgewogICAgICAgIHZhciBlbHMgPSBkcm9wZG93bkVsLnF1ZXJ5U2VsZWN0b3JBbGwoJy5yYy1kcm9wZG93bi1pdGVtJyk7CiAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBlbHMubGVuZ3RoOyBqKyspIHsgZWxzW2pdLmNsYXNzTGlzdC5yZW1vdmUoJ2hpZ2hsaWdodGVkJyk7IH0KICAgICAgfQoKICAgICAgZnVuY3Rpb24gb3BlbigpIHsKICAgICAgICBpZiAoaXNPcGVuKSByZXR1cm47IGlzT3BlbiA9IHRydWU7IHNhdmVkVmFsdWUgPSBpbnB1dEVsLnZhbHVlOwogICAgICAgIGlmIChoaWRkZW5FbC52YWx1ZSkgaW5wdXRFbC52YWx1ZSA9ICcnOwogICAgICAgIGRyb3Bkb3duRWwuY2xhc3NMaXN0LmFkZCgnb3BlbicpOwogICAgICAgIGRyb3Bkb3duRWwuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7CiAgICAgICAgd3JhcEVsLmNsYXNzTGlzdC5hZGQoJ29wZW4nLCAnZm9jdXNlZCcpOwogICAgICAgIGlucHV0RWwuc2V0QXR0cmlidXRlKCdhcmlhLWV4cGFuZGVkJywgJ3RydWUnKTsKICAgICAgICByZW5kZXJPcHRpb25zKCk7CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIGNsb3NlKCkgewogICAgICAgIGlmICghaXNPcGVuKSByZXR1cm47IGlzT3BlbiA9IGZhbHNlOwogICAgICAgIGRyb3Bkb3duRWwuY2xhc3NMaXN0LnJlbW92ZSgnb3BlbicpOwogICAgICAgIGRyb3Bkb3duRWwuc3R5bGUuZGlzcGxheSA9ICcnOwogICAgICAgIHdyYXBFbC5jbGFzc0xpc3QucmVtb3ZlKCdvcGVuJywgJ2ZvY3VzZWQnKTsKICAgICAgICBpbnB1dEVsLnNldEF0dHJpYnV0ZSgnYXJpYS1leHBhbmRlZCcsICdmYWxzZScpOwogICAgICAgIGlmIChoaWRkZW5FbC52YWx1ZSkgeyBpbnB1dEVsLnZhbHVlID0gR0FNRV9NQVBbaGlkZGVuRWwudmFsdWVdID8gR0FNRV9NQVBbaGlkZGVuRWwudmFsdWVdLm5hbWUgOiAnJzsgd3JhcEVsLmNsYXNzTGlzdC5hZGQoJ2hhcy12YWx1ZScpOyB9CiAgICAgICAgZWxzZSB7IGlucHV0RWwudmFsdWUgPSAnJzsgd3JhcEVsLmNsYXNzTGlzdC5yZW1vdmUoJ2hhcy12YWx1ZScpOyB9CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIHNlbGVjdEdhbWUoaWQpIHsKICAgICAgICBoaWRkZW5FbC52YWx1ZSA9IGlkOwogICAgICAgIHZhciBnYW1lID0gR0FNRV9NQVBbaWRdOwogICAgICAgIGlucHV0RWwudmFsdWUgPSBnYW1lID8gZ2FtZS5uYW1lIDogJyc7CiAgICAgICAgd3JhcEVsLmNsYXNzTGlzdC5hZGQoJ2hhcy12YWx1ZScpOyB3cmFwRWwuY2xhc3NMaXN0LnJlbW92ZSgnZXJyb3InKTsKICAgICAgICBjbG9zZSgpOyBkb0NvbnZlcnRlckNhbGMoKTsgYW5ub3VuY2UoJ1NlbGVjdGVkOiAnICsgKGdhbWUgPyBnYW1lLm5hbWUgOiAnJykpOwogICAgICB9CgogICAgICBpbnB1dEVsLmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3VzJywgZnVuY3Rpb24oZSkgewogICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgICAgb3BlbigpOwogICAgICB9LCB0cnVlKTsKCiAgICAgIGlucHV0RWwuYWRkRXZlbnRMaXN0ZW5lcignYmx1cicsIGZ1bmN0aW9uKCkgewogICAgICAgIGlmIChza2lwTmV4dEJsdXIpIHsgc2tpcE5leHRCbHVyID0gZmFsc2U7IHJldHVybjsgfQogICAgICAgIHNldFRpbWVvdXQoY2xvc2UsIDIwMCk7CiAgICAgIH0pOwoKICAgICAgaW5wdXRFbC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsIGZ1bmN0aW9uKGUpIHsKICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpOwogICAgICAgIGlmICghaXNPcGVuKSBvcGVuKCk7CiAgICAgICAgcmVuZGVyT3B0aW9ucygpOwogICAgICB9KTsKCiAgICAgIGlucHV0RWwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbihlKSB7CiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgICBpZiAoIWlzT3Blbikgb3BlbigpOwogICAgICB9KTsKCiAgICAgIGlucHV0RWwuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgZnVuY3Rpb24oZSkgewogICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgIH0pOwoKICAgICAgaW5wdXRFbC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgZnVuY3Rpb24oZSkgewogICAgICAgIHZhciBpdGVtcyA9IGRyb3Bkb3duRWwucXVlcnlTZWxlY3RvckFsbCgnLnJjLWRyb3Bkb3duLWl0ZW0nKTsKICAgICAgICBpZiAoZS5rZXkgPT09ICdBcnJvd0Rvd24nKSB7IGUucHJldmVudERlZmF1bHQoKTsgZS5zdG9wUHJvcGFnYXRpb24oKTsgaWYgKCFpc09wZW4pIG9wZW4oKTsgaWYgKGl0ZW1zLmxlbmd0aCkgeyBoaWdobGlnaHRJZHggPSBNYXRoLm1pbihoaWdobGlnaHRJZHggKyAxLCBpdGVtcy5sZW5ndGggLSAxKTsgY2xlYXJITCgpOyBpdGVtc1toaWdobGlnaHRJZHhdLmNsYXNzTGlzdC5hZGQoJ2hpZ2hsaWdodGVkJyk7IGl0ZW1zW2hpZ2hsaWdodElkeF0uc2Nyb2xsSW50b1ZpZXcoe2Jsb2NrOiAnbmVhcmVzdCd9KTsgfSB9CiAgICAgICAgZWxzZSBpZiAoZS5rZXkgPT09ICdBcnJvd1VwJykgeyBlLnByZXZlbnREZWZhdWx0KCk7IGUuc3RvcFByb3BhZ2F0aW9uKCk7IGlmIChpdGVtcy5sZW5ndGgpIHsgaGlnaGxpZ2h0SWR4ID0gTWF0aC5tYXgoaGlnaGxpZ2h0SWR4IC0gMSwgMCk7IGNsZWFySEwoKTsgaXRlbXNbaGlnaGxpZ2h0SWR4XS5jbGFzc0xpc3QuYWRkKCdoaWdobGlnaHRlZCcpOyBpdGVtc1toaWdobGlnaHRJZHhdLnNjcm9sbEludG9WaWV3KHtibG9jazogJ25lYXJlc3QnfSk7IH0gfQogICAgICAgIGVsc2UgaWYgKGUua2V5ID09PSAnRW50ZXInKSB7IGUucHJldmVudERlZmF1bHQoKTsgZS5zdG9wUHJvcGFnYXRpb24oKTsgaWYgKGhpZ2hsaWdodElkeCA+PSAwICYmIGl0ZW1zW2hpZ2hsaWdodElkeF0pIHNlbGVjdEdhbWUoaXRlbXNbaGlnaGxpZ2h0SWR4XS5nZXRBdHRyaWJ1dGUoJ2RhdGEtaWQnKSk7IH0KICAgICAgICBlbHNlIGlmIChlLmtleSA9PT0gJ0VzY2FwZScpIHsgZS5zdG9wUHJvcGFnYXRpb24oKTsgY2xvc2UoKTsgaW5wdXRFbC5ibHVyKCk7IH0KICAgICAgfSk7CgogICAgICByZXR1cm4geyBzZWxlY3RHYW1lOiBzZWxlY3RHYW1lLCBjbG9zZTogY2xvc2UsIGdldFZhbHVlOiBmdW5jdGlvbigpIHsgcmV0dXJuIGhpZGRlbkVsLnZhbHVlOyB9IH07CiAgICB9CgogICAgdmFyIGZyb21HYW1lREQgPSBzZXR1cEdhbWVEcm9wZG93bihmcm9tR2FtZUlucHV0LCBmcm9tRHJvcGRvd24sIGZyb21HYW1lV3JhcCwgZnJvbUdhbWVWYWx1ZSk7CiAgICB2YXIgdG9HYW1lREQgPSBzZXR1cEdhbWVEcm9wZG93bih0b0dhbWVJbnB1dCwgdG9Ecm9wZG93biwgdG9HYW1lV3JhcCwgdG9HYW1lVmFsdWUpOwoKICAgIC8qIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAogICAgICAgQ09OVkVSVEVSCiAgICAgICDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAgKi8KICAgIGZ1bmN0aW9uIHVwZGF0ZUhlYWRpbmcoKSB7CiAgICAgIHZhciBmID0gZnJvbUdhbWVWYWx1ZS52YWx1ZSwgdCA9IHRvR2FtZVZhbHVlLnZhbHVlOwogICAgICBpZiAoZiAmJiB0KSB7IGNvbnZlcnRlckhlYWRpbmcuaW5uZXJIVE1MID0gJzxzcGFuIGNsYXNzPSJyYy1oMi1hY2NlbnQiPicgKyBlc2MoR0FNRV9NQVBbZl0gPyBHQU1FX01BUFtmXS5uYW1lIDogZikgKyAnPC9zcGFuPiB0byA8c3BhbiBjbGFzcz0icmMtaDItYWNjZW50Ij4nICsgZXNjKEdBTUVfTUFQW3RdID8gR0FNRV9NQVBbdF0ubmFtZSA6IHQpICsgJzwvc3Bhbj4gU2Vuc2l0aXZpdHkgQ29udmVydGVyJzsgY29udmVydGVySGVhZGluZy5jbGFzc0xpc3QucmVtb3ZlKCdlbXB0eScpOyB9CiAgICAgIGVsc2UgaWYgKGYpIHsgY29udmVydGVySGVhZGluZy5pbm5lckhUTUwgPSAnPHNwYW4gY2xhc3M9InJjLWgyLWFjY2VudCI+JyArIGVzYyhHQU1FX01BUFtmXSA\/IEdBTUVfTUFQW2ZdLm5hbWUgOiBmKSArICc8L3NwYW4+IFNlbnNpdGl2aXR5IENvbnZlcnRlcic7IGNvbnZlcnRlckhlYWRpbmcuY2xhc3NMaXN0LnJlbW92ZSgnZW1wdHknKTsgfQogICAgICBlbHNlIGlmICh0KSB7IGNvbnZlcnRlckhlYWRpbmcuaW5uZXJIVE1MID0gJ0NvbnZlcnQgdG8gPHNwYW4gY2xhc3M9InJjLWgyLWFjY2VudCI+JyArIGVzYyhHQU1FX01BUFt0XSA\/IEdBTUVfTUFQW3RdLm5hbWUgOiB0KSArICc8L3NwYW4+JzsgY29udmVydGVySGVhZGluZy5jbGFzc0xpc3QucmVtb3ZlKCdlbXB0eScpOyB9CiAgICAgIGVsc2UgeyBjb252ZXJ0ZXJIZWFkaW5nLmlubmVySFRNTCA9ICcnOyBjb252ZXJ0ZXJIZWFkaW5nLmNsYXNzTGlzdC5hZGQoJ2VtcHR5Jyk7IH0KICAgIH0KCiAgICBmdW5jdGlvbiB1cGRhdGVHYW1lTm90ZXMoKSB7CiAgICAgIHZhciBmID0gZnJvbUdhbWVWYWx1ZS52YWx1ZSwgdCA9IHRvR2FtZVZhbHVlLnZhbHVlLCBub3RlcyA9IFtdOwogICAgICBpZiAoZiAmJiBHQU1FX01BUFtmXSAmJiBHQU1FX01BUFtmXS5ub3RlKSBub3Rlcy5wdXNoKEdBTUVfTUFQW2ZdLm5hbWUgKyAnOiAnICsgR0FNRV9NQVBbZl0ubm90ZSk7CiAgICAgIGlmICh0ICYmIEdBTUVfTUFQW3RdICYmIEdBTUVfTUFQW3RdLm5vdGUgJiYgdCAhPT0gZikgbm90ZXMucHVzaChHQU1FX01BUFt0XS5uYW1lICsgJzogJyArIEdBTUVfTUFQW3RdLm5vdGUpOwogICAgICBpZiAobm90ZXMubGVuZ3RoKSB7IGdhbWVOb3RlVGV4dC50ZXh0Q29udGVudCA9IG5vdGVzLmpvaW4oJyBcdTAwQjcgJyk7IGdhbWVOb3RlLmNsYXNzTGlzdC5hZGQoJ3Zpc2libGUnKTsgfQogICAgICBlbHNlIHsgZ2FtZU5vdGUuY2xhc3NMaXN0LnJlbW92ZSgndmlzaWJsZScpOyB9CiAgICB9CgogICAgZnVuY3Rpb24gZG9Db252ZXJ0ZXJDYWxjKCkgewogICAgICB2YXIgZiA9IGZyb21HYW1lVmFsdWUudmFsdWUsIHQgPSB0b0dhbWVWYWx1ZS52YWx1ZTsKICAgICAgdmFyIHMgPSBwYXJzZUZsb2F0KGZyb21TZW5zLnZhbHVlKSwgZEYgPSBwYXJzZUZsb2F0KGZyb21EUEkudmFsdWUpLCBkVCA9IHBhcnNlRmxvYXQodG9EUEkudmFsdWUpOwogICAgICB1cGRhdGVIZWFkaW5nKCk7IHVwZGF0ZUdhbWVOb3RlcygpOwogICAgICBpZiAoIWYgfHwgIXQgfHwgaXNOYU4ocykgfHwgcyA8PSAwIHx8IGlzTmFOKGRGKSB8fCBkRiA8PSAwIHx8IGlzTmFOKGRUKSB8fCBkVCA8PSAwKSB7CiAgICAgICAgcmVzdWx0VmFsdWUudGV4dENvbnRlbnQgPSAnMC4wMCc7IHJlc3VsdFBpbGwuY2xhc3NMaXN0LmFkZCgnd2FpdGluZycpOyByZXN1bHRQaWxsLmNsYXNzTGlzdC5yZW1vdmUoJ2NhbGN1bGF0aW5nJyk7CiAgICAgICAgYWR2RURQSS50ZXh0Q29udGVudCA9ICcwLjAwJzsgYWR2Q20udGV4dENvbnRlbnQgPSAnMC4wMCc7IGFkdkluY2gudGV4dENvbnRlbnQgPSAnMC4wMCc7IHJldHVybjsKICAgICAgfQogICAgICB2YXIgciA9IGNvbnZlcnQoZiwgdCwgcywgZEYsIGRUKTsgaWYgKCFyKSByZXR1cm47CiAgICAgIHJlc3VsdFBpbGwuY2xhc3NMaXN0LnJlbW92ZSgnd2FpdGluZycpOyByZXN1bHRQaWxsLmNsYXNzTGlzdC5hZGQoJ2NhbGN1bGF0aW5nJyk7CiAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7IHJlc3VsdFBpbGwuY2xhc3NMaXN0LnJlbW92ZSgnY2FsY3VsYXRpbmcnKTsgfSwgMzAwKTsKICAgICAgcmVzdWx0VmFsdWUudGV4dENvbnRlbnQgPSByLm5ld1NlbnM7IGFkdkVEUEkudGV4dENvbnRlbnQgPSByLmVEUEk7IGFkdkNtLnRleHRDb250ZW50ID0gci5jbTM2MDsgYWR2SW5jaC50ZXh0Q29udGVudCA9IHIuaW5jaDM2MDsKICAgICAgYW5ub3VuY2UoJ0NvbnZlcnRlZDogJyArIHIubmV3U2VucyArICcgc2Vuc2l0aXZpdHkgaW4gJyArIChHQU1FX01BUFt0XSA\/IEdBTUVfTUFQW3RdLm5hbWUgOiB0KSk7CiAgICB9CgogICAgZnJvbVNlbnMuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCBkb0NvbnZlcnRlckNhbGMpOwogICAgZnJvbURQSS5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsIGRvQ29udmVydGVyQ2FsYyk7CiAgICB0b0RQSS5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsIGRvQ29udmVydGVyQ2FsYyk7CgogICAgLyogU3dhcCAqLwogICAgZ2V0RWwoJ3N3YXBCdG4nKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uKCkgewogICAgICB2YXIgdGYgPSBmcm9tR2FtZVZhbHVlLnZhbHVlLCB0biA9IGZyb21HYW1lSW5wdXQudmFsdWUsIHRkID0gZnJvbURQSS52YWx1ZTsKICAgICAgZnJvbUdhbWVWYWx1ZS52YWx1ZSA9IHRvR2FtZVZhbHVlLnZhbHVlOyBmcm9tR2FtZUlucHV0LnZhbHVlID0gdG9HYW1lSW5wdXQudmFsdWU7CiAgICAgIGZyb21HYW1lV3JhcC5jbGFzc0xpc3QudG9nZ2xlKCdoYXMtdmFsdWUnLCAhIWZyb21HYW1lVmFsdWUudmFsdWUpOwogICAgICB0b0dhbWVWYWx1ZS52YWx1ZSA9IHRmOyB0b0dhbWVJbnB1dC52YWx1ZSA9IHRuOwogICAgICB0b0dhbWVXcmFwLmNsYXNzTGlzdC50b2dnbGUoJ2hhcy12YWx1ZScsICEhdG9HYW1lVmFsdWUudmFsdWUpOwogICAgICBmcm9tRFBJLnZhbHVlID0gdG9EUEkudmFsdWU7IHRvRFBJLnZhbHVlID0gdGQ7CiAgICAgIHZhciBjdiA9IHBhcnNlRmxvYXQocmVzdWx0VmFsdWUudGV4dENvbnRlbnQpOwogICAgICBpZiAoIWlzTmFOKGN2KSAmJiBjdiA+IDApIGZyb21TZW5zLnZhbHVlID0gY3Y7CiAgICAgIGRvQ29udmVydGVyQ2FsYygpOyBhbm5vdW5jZSgnR2FtZXMgYW5kIHNldHRpbmdzIHN3YXBwZWQnKTsKICAgIH0pOwoKICAgIC8qIEFkdmFuY2VkIHRvZ2dsZSAqLwogICAgYWR2YW5jZWRUb2dnbGUuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbigpIHsKICAgICAgdmFyIHYgPSBhZHZhbmNlZFNlY3Rpb24uY2xhc3NMaXN0LnRvZ2dsZSgndmlzaWJsZScpOwogICAgICBhZHZhbmNlZFRvZ2dsZS5jbGFzc0xpc3QudG9nZ2xlKCdhY3RpdmUnLCB2KTsKICAgICAgYWR2YW5jZWRUb2dnbGUuc2V0QXR0cmlidXRlKCdhcmlhLWV4cGFuZGVkJywgdik7CiAgICAgIGFubm91bmNlKHYgPyAnQWR2YW5jZWQgcmVzdWx0cyBzaG93bicgOiAnQWR2YW5jZWQgcmVzdWx0cyBoaWRkZW4nKTsKICAgIH0pOwoKICAgIC8qIFJlc2V0ICovCiAgICByZXNldEJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uKCkgewogICAgICBmcm9tR2FtZVZhbHVlLnZhbHVlID0gJyc7IGZyb21HYW1lSW5wdXQudmFsdWUgPSAnJzsgZnJvbUdhbWVXcmFwLmNsYXNzTGlzdC5yZW1vdmUoJ2hhcy12YWx1ZScsICdlcnJvcicpOwogICAgICB0b0dhbWVWYWx1ZS52YWx1ZSA9ICcnOyB0b0dhbWVJbnB1dC52YWx1ZSA9ICcnOyB0b0dhbWVXcmFwLmNsYXNzTGlzdC5yZW1vdmUoJ2hhcy12YWx1ZScsICdlcnJvcicpOwogICAgICBmcm9tU2Vucy52YWx1ZSA9ICcnOyBmcm9tRFBJLnZhbHVlID0gJzgwMCc7IHRvRFBJLnZhbHVlID0gJzgwMCc7CiAgICAgIHJlc3VsdFZhbHVlLnRleHRDb250ZW50ID0gJzAuMDAnOyByZXN1bHRQaWxsLmNsYXNzTGlzdC5hZGQoJ3dhaXRpbmcnKTsKICAgICAgYWR2RURQSS50ZXh0Q29udGVudCA9ICcwLjAwJzsgYWR2Q20udGV4dENvbnRlbnQgPSAnMC4wMCc7IGFkdkluY2gudGV4dENvbnRlbnQgPSAnMC4wMCc7CiAgICAgIHVwZGF0ZUhlYWRpbmcoKTsgdXBkYXRlR2FtZU5vdGVzKCk7IGFubm91bmNlKCdBbGwgZmllbGRzIHJlc2V0Jyk7CiAgICB9KTsKCiAgICAvKiBDb3B5IOKAlCB3aXRoIGZhbGxiYWNrIGZvciBIVFRQIC8gaWZyYW1lIC8gb2xkZXIgYnJvd3NlcnMgKi8KICAgIGZ1bmN0aW9uIGNvcHlUb0NsaXBib2FyZCh0ZXh0LCBidG4pIHsKICAgICAgaWYgKCF0ZXh0IHx8IHRleHQgPT09ICcwLjAwJyB8fCB0ZXh0ID09PSAnMC4wJykgeyBhbm5vdW5jZSgnTm8gdmFsdWUgdG8gY29weScpOyByZXR1cm47IH0KCiAgICAgIGZ1bmN0aW9uIG9uU3VjY2VzcygpIHsKICAgICAgICBidG4uY2xhc3NMaXN0LmFkZCgnY29waWVkJyk7CiAgICAgICAgYnRuLmlubmVySFRNTCA9ICc8c3ZnIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMi41IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiPjxwb2x5bGluZSBwb2ludHM9IjIwIDYgOSAxNyA0IDEyIi8+PC9zdmc+JzsKICAgICAgICBzaG93VG9hc3QoKTsgYW5ub3VuY2UoJ0NvcGllZDogJyArIHRleHQpOwogICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICBidG4uY2xhc3NMaXN0LnJlbW92ZSgnY29waWVkJyk7CiAgICAgICAgICBidG4uaW5uZXJIVE1MID0gJzxzdmcgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiPjxyZWN0IHg9IjkiIHk9IjkiIHdpZHRoPSIxMyIgaGVpZ2h0PSIxMyIgcng9IjIiLz48cGF0aCBkPSJNNSAxNUg0YTIgMiAwIDAxLTItMlY0YTIgMiAwIDAxMi0yaDlhMiAyIDAgMDEyIDJ2MSIvPjwvc3ZnPic7CiAgICAgICAgfSwgMjAwMCk7CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIGZhbGxiYWNrQ29weSgpIHsKICAgICAgICB0cnkgewogICAgICAgICAgdmFyIHRhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGV4dGFyZWEnKTsKICAgICAgICAgIHRhLnZhbHVlID0gdGV4dDsKICAgICAgICAgIHRhLnN0eWxlLnBvc2l0aW9uID0gJ2ZpeGVkJzsKICAgICAgICAgIHRhLnN0eWxlLmxlZnQgPSAnLTk5OTlweCc7CiAgICAgICAgICB0YS5zdHlsZS50b3AgPSAnLTk5OTlweCc7CiAgICAgICAgICB0YS5zdHlsZS5vcGFjaXR5ID0gJzAnOwogICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0YSk7CiAgICAgICAgICB0YS5mb2N1cygpOwogICAgICAgICAgdGEuc2VsZWN0KCk7CiAgICAgICAgICB2YXIgb2sgPSBkb2N1bWVudC5leGVjQ29tbWFuZCgnY29weScpOwogICAgICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZCh0YSk7CiAgICAgICAgICBpZiAob2spIHsgb25TdWNjZXNzKCk7IH0gZWxzZSB7IGFubm91bmNlKCdDb3B5IGZhaWxlZCcpOyB9CiAgICAgICAgfSBjYXRjaCAoZXJyKSB7IGFubm91bmNlKCdDb3B5IGZhaWxlZCcpOyB9CiAgICAgIH0KCiAgICAgIGlmIChuYXZpZ2F0b3IuY2xpcGJvYXJkICYmIHdpbmRvdy5pc1NlY3VyZUNvbnRleHQpIHsKICAgICAgICBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dCh0ZXh0KS50aGVuKG9uU3VjY2VzcykuY2F0Y2goZmFsbGJhY2tDb3B5KTsKICAgICAgfSBlbHNlIHsKICAgICAgICBmYWxsYmFja0NvcHkoKTsKICAgICAgfQogICAgfQoKICAgIGNvcHlSZXN1bHRCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbigpIHsgY29weVRvQ2xpcGJvYXJkKHJlc3VsdFZhbHVlLnRleHRDb250ZW50LCBjb3B5UmVzdWx0QnRuKTsgfSk7CiAgICBjb3B5RWRwaUJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uKCkgeyBjb3B5VG9DbGlwYm9hcmQoZWRwaVJlc3VsdC50ZXh0Q29udGVudCwgY29weUVkcGlCdG4pOyB9KTsKCiAgICBmdW5jdGlvbiBzaG93VG9hc3QoKSB7IHRvYXN0LmNsYXNzTGlzdC5hZGQoJ3Zpc2libGUnKTsgc2V0VGltZW91dChmdW5jdGlvbigpIHsgdG9hc3QuY2xhc3NMaXN0LnJlbW92ZSgndmlzaWJsZScpOyB9LCAyNTAwKTsgfQoKICAgIC8qIGVEUEkgQ2FsY3VsYXRvciAqLwogICAgZnVuY3Rpb24gZG9FZHBpQ2FsYygpIHsKICAgICAgdmFyIHMgPSBwYXJzZUZsb2F0KGVkcGlTZW5zLnZhbHVlKSwgZCA9IHBhcnNlRmxvYXQoZWRwaURQSS52YWx1ZSk7CiAgICAgIGlmIChpc05hTihzKSB8fCBzIDw9IDAgfHwgaXNOYU4oZCkgfHwgZCA8PSAwKSB7IGVkcGlSZXN1bHQudGV4dENvbnRlbnQgPSAnMC4wJzsgZWRwaVJlc3VsdC5jbGFzc0xpc3QuYWRkKCd3YWl0aW5nJyk7IHJldHVybjsgfQogICAgICB2YXIgZSA9IHMgKiBkOwogICAgICBlZHBpUmVzdWx0LnRleHRDb250ZW50ID0gcGFyc2VGbG9hdChlLnRvRml4ZWQoMSkpOyBlZHBpUmVzdWx0LmNsYXNzTGlzdC5yZW1vdmUoJ3dhaXRpbmcnKTsKICAgICAgYW5ub3VuY2UoJ2VEUEk6ICcgKyBlLnRvRml4ZWQoMSkpOwogICAgfQogICAgZWRwaVNlbnMuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCBkb0VkcGlDYWxjKTsKICAgIGVkcGlEUEkuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCBkb0VkcGlDYWxjKTsKCiAgICAvKiBQcm8gcHJlc2V0cyAqLwogICAgZnVuY3Rpb24gcmVuZGVyUHJlc2V0cygpIHsKICAgICAgdmFyIGdyaWQgPSBnZXRFbCgncHJlc2V0c0dyaWQnKTsKICAgICAgaWYgKCFncmlkKSByZXR1cm47CiAgICAgIGdyaWQuaW5uZXJIVE1MID0gUFJPX1BSRVNFVFMubWFwKGZ1bmN0aW9uKHApIHsKICAgICAgICB2YXIgZ2FtZSA9IEdBTUVfTUFQW3AuZ2FtZV07CiAgICAgICAgdmFyIHNuID0gZ2FtZSA\/IGdhbWUubmFtZS5yZXBsYWNlKCdDb3VudGVyLVN0cmlrZSAyJywgJ0NTMicpLnJlcGxhY2UoJ092ZXJ3YXRjaCAyJywgJ09XMicpLnJlcGxhY2UoJ0FwZXggTGVnZW5kcycsICdBcGV4JykucmVwbGFjZSgnRXNjYXBlIGZyb20gVGFya292JywgJ0VGVCcpIDogcC5nYW1lOwogICAgICAgIHJldHVybiAnPGJ1dHRvbiBjbGFzcz0icmMtcHJlc2V0LWNoaXAiIGRhdGEtZ2FtZT0iJyArIHAuZ2FtZSArICciIGRhdGEtc2Vucz0iJyArIHAuc2VucyArICciIGRhdGEtZHBpPSInICsgcC5kcGkgKyAnIj4nICsgZXNjKHAubGFiZWwpICsgJyA8c3BhbiBjbGFzcz0icHJlc2V0LWdhbWUiPicgKyBzbiArICcgJyArIHAuc2VucyArICdAJyArIHAuZHBpICsgJzwvc3Bhbj48L2J1dHRvbj4nOwogICAgICB9KS5qb2luKCcnKTsKICAgICAgdmFyIGNoaXBzID0gZ3JpZC5xdWVyeVNlbGVjdG9yQWxsKCcucmMtcHJlc2V0LWNoaXAnKTsKICAgICAgZm9yICh2YXIgY2kgPSAwOyBjaSA8IGNoaXBzLmxlbmd0aDsgY2krKykgewogICAgICAgIChmdW5jdGlvbihjaGlwKSB7CiAgICAgICAgICBjaGlwLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGZyb21HYW1lREQuc2VsZWN0R2FtZShjaGlwLmdldEF0dHJpYnV0ZSgnZGF0YS1nYW1lJykpOwogICAgICAgICAgICBmcm9tU2Vucy52YWx1ZSA9IGNoaXAuZ2V0QXR0cmlidXRlKCdkYXRhLXNlbnMnKTsKICAgICAgICAgICAgZnJvbURQSS52YWx1ZSA9IGNoaXAuZ2V0QXR0cmlidXRlKCdkYXRhLWRwaScpOwogICAgICAgICAgICBkb0NvbnZlcnRlckNhbGMoKTsgYW5ub3VuY2UoJ0FwcGxpZWQgJyArIGNoaXAudGV4dENvbnRlbnQudHJpbSgpICsgJyBzZXR0aW5ncycpOwogICAgICAgICAgfSk7CiAgICAgICAgfSkoY2hpcHNbY2ldKTsKICAgICAgfQogICAgfQoKICAgIC8qIENsb3NlIGRyb3Bkb3ducyBvbiBvdXRzaWRlIGNsaWNrIOKAlCB1c2UgdGltZW91dCB0byBhdm9pZCByYWNlIHdpdGggb3BlbiAqLwogICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgZnVuY3Rpb24oZSkgewogICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgIGlmICghZnJvbUdhbWVXcmFwLmNvbnRhaW5zKGUudGFyZ2V0KSkgZnJvbUdhbWVERC5jbG9zZSgpOwogICAgICAgIGlmICghdG9HYW1lV3JhcC5jb250YWlucyhlLnRhcmdldCkpIHRvR2FtZURELmNsb3NlKCk7CiAgICAgIH0sIDEwKTsKICAgIH0pOwoKICAgIC8qIEluaXQgKi8KICAgIHJlbmRlclByZXNldHMoKTsKICB9CgogIC8qIFV0aWxpdGllcyAob3V0c2lkZSBpbml0V2lkZ2V0IHNvIHRoZXkgYXJlIGF2YWlsYWJsZSkgKi8KICBmdW5jdGlvbiBlc2MocykgeyB2YXIgZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOyBkLnRleHRDb250ZW50ID0gU3RyaW5nKHMpOyByZXR1cm4gZC5pbm5lckhUTUw7IH0KICBmdW5jdGlvbiBhbm5vdW5jZShtc2cpIHsKICAgIHZhciBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzckFubm91bmNlJyk7CiAgICBpZiAoZWwpIHsgZWwudGV4dENvbnRlbnQgPSBtc2c7IHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7IGVsLnRleHRDb250ZW50ID0gJyc7IH0sIDE1MDApOyB9CiAgfQoKICAvKiDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKICAgICBTQUZFIElOSVQg4oCUIHdvcmtzIGV2ZW4gaWYgc2NyaXB0IGlzIG1vdmVkL2RlZmVycmVkCiAgICAg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQICovCiAgaWYgKGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICdsb2FkaW5nJykgewogICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIGluaXRXaWRnZXQpOwogIH0gZWxzZSB7CiAgICBpbml0V2lkZ2V0KCk7CiAgfQoK\");var s=document.createElement(\"script\");s.textContent=c;document.currentScript.parentNode.insertBefore(s,document.currentScript);})()\n<\/script>\n\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-mouse-sensitivity-converter-convert-your-sens-between-23-fps-games-instantly\">Mouse Sensitivity Converter \u2014 Convert Your Sens Between 23 FPS Games Instantly<\/h2>\n\n\n\n<p>A mouse sensitivity converter is a free, browser-based calculator that translates your mouse settings from one game to another using verified yaw values. Muscle memory is critical for consistent aim. If you have spent hundreds of hours mastering your flick shots in <em>Counter-Strike 2<\/em>, you shouldn&#8217;t have to relearn your aim when you switch to <em>Valorant<\/em> or <em>Deadlock<\/em>.<\/p>\n\n\n\n<p>This tool ensures that a 360-degree turn in your source game requires the exact same physical mouse movement in your target game. It uses the universal <code>inches_per_360<\/code> formula to guarantee mathematical accuracy across 23 major PC titles.<\/p>\n\n\n\n<div style=\"background-color: #f9f9f9; padding: 20px; border-radius: 8px; margin-bottom: 20px;\">\n<h3 style=\"margin-top: 0;\">Summary<\/h3>\n<p>You rely on muscle memory to hit your shots. When you switch between FPS games, different game engines interpret your mouse movements differently. This article explains how you can instantly convert your sensitivity settings to maintain a consistent 360-degree turn distance across all your favorite shooters. You will find verified conversion math for 2026&#8217;s top titles, pro player settings, and a clear explanation of technical terms like eDPI and cm\/360.<\/p>\n<\/div>\n\n\n\n<div style=\"background-color: #fff3cd; border-left: 4px solid #ffc107; padding: 20px; margin-bottom: 20px;\">\n<h3 style=\"margin-top: 0;\">TL;DR<\/h3>\n<ul style=\"margin-bottom: 0;\">\n<li><strong>Consistency is key:<\/strong> You should keep your physical mouse distance (cm\/360) the same across all games to preserve muscle memory.<\/li>\n<li><strong>Game engines vary:<\/strong> A sensitivity of &#8220;2.0&#8221; in CS2 is not the same as &#8220;2.0&#8221; in Apex Legends or Overwatch due to different &#8220;yaw&#8221; values.<\/li>\n<li><strong>DPI matters:<\/strong> You can use this tool to adjust your sensitivity even if you change your mouse DPI (e.g., moving from 400 to 1600).<\/li>\n<li><strong>Know your eDPI:<\/strong> Your true sensitivity is a combination of your hardware DPI and in-game settings.<\/li>\n<li><strong>Use the tool:<\/strong> Input your current game and settings above to get your exact numbers for your new game instantly.<\/li>\n<\/ul>\n<\/div>\n\n\n\n<div style=\"background: linear-gradient(135deg, #07F288 0%, #7BF8BE 100%); color: #0a3d2e; padding: 25px; border-radius: 12px; margin-bottom: 30px;\">\n<h3 style=\"margin-top: 0; color: #0a3d2e;\">\ud83d\udccd Table of Contents<\/h3>\n<ul style=\"list-style-type: none; padding-left: 0;\">\n<li style=\"margin-bottom: 8px;\"><a style=\"text-decoration: none; color: #0a3d2e; font-weight: 600;\" href=\"#how-to-convert\">How to Convert Your Mouse Sensitivity in 4 Steps<\/a><\/li>\n<li style=\"margin-bottom: 8px;\"><a style=\"text-decoration: none; color: #0a3d2e; font-weight: 600;\" href=\"#cs2-converter\">Counter-Strike 2 (CS2) Sensitivity Converter<\/a><\/li>\n<li style=\"margin-bottom: 8px;\"><a style=\"text-decoration: none; color: #0a3d2e; font-weight: 600;\" href=\"#valorant-converter\">Valorant Sensitivity Converter<\/a><\/li>\n<li style=\"margin-bottom: 8px;\"><a style=\"text-decoration: none; color: #0a3d2e; font-weight: 600;\" href=\"#overwatch2-converter\">Overwatch 2 Sensitivity Converter<\/a><\/li>\n<li style=\"margin-bottom: 8px;\"><a style=\"text-decoration: none; color: #0a3d2e; font-weight: 600;\" href=\"#apex-converter\">Apex Legends Sensitivity Converter<\/a><\/li>\n<li style=\"margin-bottom: 8px;\"><a style=\"text-decoration: none; color: #0a3d2e; font-weight: 600;\" href=\"#fortnite-converter\">Fortnite Sensitivity Converter<\/a><\/li>\n<li style=\"margin-bottom: 8px;\"><a style=\"text-decoration: none; color: #0a3d2e; font-weight: 600;\" href=\"#cod-converter\">Call of Duty Sensitivity Converter<\/a><\/li>\n<li style=\"margin-bottom: 8px;\"><a style=\"text-decoration: none; color: #0a3d2e; font-weight: 600;\" href=\"#other-games\">Other Popular Shooters (R6, BF2042, Deadlock, etc.)<\/a><\/li>\n<li style=\"margin-bottom: 8px;\"><a style=\"text-decoration: none; color: #0a3d2e; font-weight: 600;\" href=\"#technical-guide\">Technical Guide: cm\/360 and eDPI<\/a><\/li>\n<li style=\"margin-bottom: 8px;\"><a style=\"text-decoration: none; color: #0a3d2e; font-weight: 600;\" href=\"#pro-settings\">Pro Player Sensitivity Settings (2025)<\/a><\/li>\n<li style=\"margin-bottom: 8px;\"><a style=\"text-decoration: none; color: #0a3d2e; font-weight: 600;\" href=\"#faq\">Frequently Asked Questions<\/a><\/li>\n<\/ul>\n<\/div>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"how-to-convert\">How to Convert Your Mouse Sensitivity in 4 Steps<\/h2>\n\n\n\n<p>You can synchronize your aim across every game in your library in seconds. Follow these four simple steps using the calculator above:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Select Source Game:<\/strong> Choose the game you currently play and are comfortable with from the dropdown menu.<\/li>\n\n\n\n<li><strong>Enter Settings:<\/strong> Input your current in-game sensitivity and your mouse DPI (e.g., 800 or 1600).<\/li>\n\n\n\n<li><strong>Select Target Game:<\/strong> Choose the new game you want to play.<\/li>\n\n\n\n<li><strong>View Result:<\/strong> The tool instantly displays your new converted sensitivity, eDPI, and cm\/360 stats.<\/li>\n<\/ol>\n\n\n\n<p><strong>Tip:<\/strong> Use the &#8220;Swap&#8221; feature if you need to quickly reverse the calculation to see what your new settings would look like in your original game.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"cs2-converter\">Counter-Strike 2 (CS2) Sensitivity Converter<\/h2>\n\n\n\n<p>CS2 remains the gold standard for sensitivity tuning because of its legacy Source engine mechanics. Most converters use CS2 as the baseline &#8220;1.0&#8221; for calculations. The game uses a default <code>m_yaw<\/code> value of <strong>0.022<\/strong>.<\/p>\n\n\n\n<div style=\"background-color: #e3f2fd; border-left: 5px solid #2196f3; padding: 15px; margin: 20px 0;\"><strong>Pro Context (2026):<\/strong> While 400 DPI was the historic standard for Counter-Strike, many top pros like m0NESY and NiKo have shifted to higher DPIs (800 or 1600) to reduce input latency. They adjust their in-game sensitivity lower to compensate, keeping their effective speed the same.<\/div>\n\n\n\n<p>A typical eDPI range for competitive CS2 players falls between 560 and 1236. If you fall outside this range, you might find your aim inconsistent compared to the average player base.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"valorant-converter\">Valorant Sensitivity Converter<\/h2>\n\n\n\n<p>When converting from CS2 to Valorant, the math is straightforward. Valorant uses a yaw value of <strong>0.07<\/strong>. Because 0.07 is roughly 3.18 times larger than 0.022, you simply divide your CS2 sensitivity by 3.18 to get your Valorant sensitivity.<\/p>\n\n\n\n<p><strong>Key Considerations:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Hardware:<\/strong> Lightweight wireless mice, like the Razer Viper V3 Pro, dominate the scene. Pros like TenZ and aspas prefer these for micro-adjustments.<\/li>\n\n\n\n<li><strong>Field of View (FOV):<\/strong> Valorant has a fixed 103\u00b0 FOV.<\/li>\n\n\n\n<li><strong>Scopes:<\/strong> Scoped sensitivity multipliers are specific here. Most players leave them at 1.0, but some adjust them to achieve a &#8220;1:1&#8221; feel relative to hipfire.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"overwatch2-converter\">Overwatch 2 Sensitivity Converter<\/h2>\n\n\n\n<p>Overwatch 2 is faster and more vertical than tactical shooters. The game uses a yaw value of <strong>0.0066<\/strong>. Because tracking fast-moving targets (like Tracer or Genji) is essential, the average eDPI is generally higher here (3000\u20136600) than in CS2 or Valorant.<\/p>\n\n\n\n<p>You should also note that Overwatch allows specific settings per hero. For example, Widowmaker and Ana players often set their &#8220;Relative Aim Sensitivity While Zoomed&#8221; to <strong>37.89%<\/strong>. This specific number makes small flicks while zoomed in feel identical to your hipfire aim.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"apex-converter\">Apex Legends Sensitivity Converter<\/h2>\n\n\n\n<p>Apex Legends is built on a heavily modified version of the Source engine. This is good news for conversion: it shares the exact same <strong>0.022<\/strong> yaw value as CS2. If you play CS2 at sensitivity 1.5, your Apex Legends hipfire sensitivity is also 1.5.<\/p>\n\n\n\n<p>While the hipfire conversion is 1:1, you must consider ADS (Aim Down Sights) multipliers. Most players keep the ADS multiplier at 1.0 for consistency. Additionally, the standard competitive FOV in Apex is usually maxed out at 110, which can make the sensitivity &#8220;feel&#8221; different visually, even if the distance is physically the same.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"fortnite-converter\">Fortnite Sensitivity Converter<\/h2>\n\n\n\n<p>Fortnite sensitivity conversion requires careful attention because the game uses a percentage-based slider. If you input &#8220;7&#8221; in the settings, the game engine reads it as 7.0% (or a 0.07 internal multiplier). The technical yaw value is <strong>0.005555<\/strong>.<\/p>\n\n\n\n<p><strong>Settings to watch:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>X and Y Axis:<\/strong> You can set horizontal (X) and vertical (Y) sensitivity separately. Most competitive players keep these locked to the same number for muscle memory consistency.<\/li>\n\n\n\n<li><strong>Targeting Multiplier:<\/strong> This affects your aim speed when holding right-click.<\/li>\n<\/ul>\n\n\n\n<p>Top pros like Peterbot or Bugha often favor raw eDPI clusters between 40 and 56, favoring speed for building mechanics over pure precision aiming.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"cod-converter\">Call of Duty Sensitivity Converter \u2014 Modern Warfare III, Warzone &amp; Black Ops 6<\/h2>\n\n\n\n<p>Recent Call of Duty titles, including <em>Modern Warfare III<\/em>, <em>Warzone<\/em>, and <em>Black Ops 6<\/em>, simplify things by sharing a unified engine standard. They all utilize the <strong>0.0066<\/strong> yaw value, which is identical to Overwatch 2.<\/p>\n\n\n\n<p>When setting up your mouse, pay attention to the &#8220;ADS Sensitivity Transition Timing.&#8221; You also have a choice between &#8220;Legacy&#8221; and &#8220;Relative&#8221; ADS mouse sensitivity modes. The &#8220;Monitor Distance Coefficient&#8221; (default 1.33) is designed to standardize your aim across different zoom levels, helping you snap to targets consistently regardless of the optic you are using.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"other-games\">Other Popular Shooters<\/h2>\n\n\n\n<div style=\"grid-template-columns: 1fr 1fr; gap: 20px;\">\n<div>\n<h3 style=\"margin-top: 0;\">Rainbow Six Siege<\/h3>\n<p>Siege uses Ubisoft&#8217;s &#8220;visuomotor gain&#8221; model with a default yaw of <strong>0.00573<\/strong>. The complexity here lies in the scopes; you have sliders for 1.0x, 2.5x, and more, ranging from 1\u2013200. This tool calculates your standard hipfire, which acts as the baseline for all scopes.<\/p>\n<\/div>\n<div>\n<h3 style=\"margin-top: 0;\">Battlefield 2042<\/h3>\n<p>Running on the Frostbite engine, Battlefield 2042 uses a yaw of <strong>0.0066<\/strong>. This matches the CoD standard. Consistent aim is vital here to transition smoothly between large-scale vehicle warfare and tight infantry combat.<\/p>\n<\/div>\n<\/div>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-team-fortress-2-quake-champions-sensitivity-converter\">Team Fortress 2 &amp; Quake Champions Sensitivity Converter<\/h3>\n\n\n\n<p>These are the grandfathers of modern aim. Both games run on classic engines (Source and id Tech) and use the standard <strong>0.022<\/strong> yaw. This means you have a direct 1:1 conversion with CS2 and Apex Legends. If you are looking for other <a href=\"https:\/\/www.recharge.com\/blog\/en-gb\/ie\/steam-games-to-try\">popular Steam games<\/a> to test your raw aim, these titles remain the best training grounds.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-deadlock-sensitivity-converter\">Deadlock Sensitivity Converter<\/h3>\n\n\n\n<p>As Valve&#8217;s new MOBA-shooter hybrid, Deadlock operates on Source 2. However, the math is slightly different. It uses a yaw of <strong>0.044<\/strong>. This is exactly <strong>2x<\/strong> the CS2 yaw. If your CS2 sensitivity is 2.0, your Deadlock sensitivity should be set to 1.0.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-marvel-rivals-sensitivity-converter\">Marvel Rivals Sensitivity Converter<\/h3>\n\n\n\n<p>Built on Unreal Engine 5, Marvel Rivals utilizes a yaw of <strong>0.0066<\/strong>. Players coming from Overwatch 2 will find the sensitivity scale identical (1:1 conversion), making the transition to this hero shooter seamless.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-the-finals-sensitivity-converter\">The Finals Sensitivity Converter<\/h3>\n\n\n\n<p>The Finals, an Unreal Engine 5 shooter by Embark, uses a corrected yaw of <strong>0.0066<\/strong>. Competitive sensitivity here typically ranges from 14\u201357 at 800 DPI, depending heavily on whether you play the fast &#8220;Light&#8221; class or the slower &#8220;Heavy&#8221; class.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-destiny-2-sensitivity-converter\">Destiny 2 Sensitivity Converter<\/h3>\n\n\n\n<p>Destiny 2 shares the common <strong>0.0066<\/strong> yaw value found in CoD and Overwatch. Be aware that Destiny 2 has a hard cap on turn speed while sprinting. No amount of sensitivity increase can override this engine limitation.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-halo-infinite-sensitivity-converter\">Halo Infinite Sensitivity Converter<\/h3>\n\n\n\n<p>Halo Infinite uses a yaw of <strong>0.022<\/strong>, matching CS2 and Apex. While Halo is traditionally controller-dominant, Mouse and Keyboard (MnK) players rely on this 1:1 conversion to maintain their tracking skills from tactical shooters.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-pubg-sensitivity-converter\">PUBG Sensitivity Converter<\/h3>\n\n\n\n<p>PUBG has a hipfire yaw of <strong>0.002222<\/strong>. The game features a very complex per-scope system (General, Vehicle, 2x, 3x, etc.). This tool converts the &#8220;General\/Hipfire&#8221; sensitivity, which sets the baseline for all other scopes.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-escape-from-tarkov-sensitivity-converter\">Escape from Tarkov Sensitivity Converter<\/h3>\n\n\n\n<p>Tarkov is unique. The yaw is roughly <strong>0.125<\/strong>, but your actual turn speed is affected by your in-game armor, helmet penalties, and weapon ergonomics. The converter provides your <em>baseline<\/em> sensitivity, but your loadout will alter how the mouse feels in every raid.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-rust-sensitivity-converter\">Rust Sensitivity Converter<\/h3>\n\n\n\n<p>Rust uses a yaw of approximately <strong>0.00222<\/strong>. Due to frequent Unity updates, you should treat these results as a starting point for fine-tuning rather than an absolute rule.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-fragpunk-sensitivity-converter\">FragPunk Sensitivity Converter<\/h3>\n\n\n\n<p>FragPunk, one of the <a href=\"https:\/\/www.recharge.com\/blog\/en-gb\/ie\/new-games-2025\">new games released in 2025<\/a>, has a confirmed yaw of <strong>0.0556<\/strong>. This distinct value requires precise conversion if you are coming from traditional tactical shooters.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-splitgate-2-sensitivity-converter\">Splitgate 2 Sensitivity Converter<\/h3>\n\n\n\n<p>For the portal-based shooter sequel, the confirmed yaw is <strong>0.01116<\/strong>. This ensures your portal flicks remain accurate.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"technical-guide\">What Is cm\/360 and Why It Matters for Aiming<\/h2>\n\n\n\n<p>cm\/360 (centimeters per 360-degree turn) is the only &#8220;true&#8221; universal language of sensitivity. A sensitivity setting of &#8220;2.0&#8221; means something different in every game engine, but &#8220;34cm\/360&#8221; is the same physical distance on your mousepad everywhere.<\/p>\n\n\n\n<p>By measuring sensitivity in centimeters, you remove the confusion of game engines. For example, a low-sensitivity player might use 50cm\/360 (moving the mouse 50cm to do a full circle), while a high-sensitivity player might use 20cm\/360.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-understanding-edpi-your-real-sensitivity-number\">Understanding eDPI \u2014 Your Real Sensitivity Number<\/h2>\n\n\n\n<p>eDPI stands for &#8220;effective Dots Per Inch.&#8221; The formula is simple: <code>eDPI = Sensitivity \u00d7 DPI<\/code>.<\/p>\n\n\n\n<p>This number allows players with different mice to compare their &#8220;true&#8221; in-game speed. For example, Player A using 400 DPI and sensitivity 2.0 has an eDPI of 800. Player B using 800 DPI and sensitivity 1.0 <em>also<\/em> has an eDPI of 800. Their aim speed is identical.<\/p>\n\n\n\n<p>However, eDPI is not transferable across different games. An eDPI of 800 in CS2 is vastly different from an eDPI of 800 in Valorant. If you are <a href=\"https:\/\/www.recharge.com\/blog\/en-gb\/ie\/build-a-cheap-gaming-pc\">optimizing your gaming PC setup<\/a>, deciding on a standard DPI (like 800 or 1600) is the first step to consistent aim.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"pro-settings\">Pro Player Sensitivity Settings (2025)<\/h2>\n\n\n\n<p>Seeing what the pros use can give you a good baseline. Notice the trend toward 1600 DPI and lighter mice (under 60g) in recent years.<\/p>\n\n\n\n<div>\n<table style=\"width: 100%; border-collapse: collapse; margin-bottom: 20px;\">\n<thead>\n<tr style=\"background-color: #000; color: #fff; text-align: left;\">\n<th style=\"padding: 12px; border: 1px solid #ddd;\">Player Name<\/th>\n<th style=\"padding: 12px; border: 1px solid #ddd;\">Game<\/th>\n<th style=\"padding: 12px; border: 1px solid #ddd;\">DPI<\/th>\n<th style=\"padding: 12px; border: 1px solid #ddd;\">Sensitivity<\/th>\n<th style=\"padding: 12px; border: 1px solid #ddd;\">eDPI<\/th>\n<th style=\"padding: 12px; border: 1px solid #ddd;\">Mouse<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"padding: 10px; border: 1px solid #ddd;\">donk<\/td>\n<td style=\"padding: 10px; border: 1px solid #ddd;\">CS2<\/td>\n<td style=\"padding: 10px; border: 1px solid #ddd;\">800<\/td>\n<td style=\"padding: 10px; border: 1px solid #ddd;\">1.25<\/td>\n<td style=\"padding: 10px; border: 1px solid #ddd;\">1000<\/td>\n<td style=\"padding: 10px; border: 1px solid #ddd;\">Logitech G Pro X SL 2<\/td>\n<\/tr>\n<tr style=\"background-color: #f9f9f9;\">\n<td style=\"padding: 10px; border: 1px solid #ddd;\">m0NESY<\/td>\n<td style=\"padding: 10px; border: 1px solid #ddd;\">CS2<\/td>\n<td style=\"padding: 10px; border: 1px solid #ddd;\">400<\/td>\n<td style=\"padding: 10px; border: 1px solid #ddd;\">2.30<\/td>\n<td style=\"padding: 10px; border: 1px solid #ddd;\">920<\/td>\n<td style=\"padding: 10px; border: 1px solid #ddd;\">Logitech G Pro X SL 2<\/td>\n<\/tr>\n<tr>\n<td style=\"padding: 10px; border: 1px solid #ddd;\">TenZ<\/td>\n<td style=\"padding: 10px; border: 1px solid #ddd;\">Valorant<\/td>\n<td style=\"padding: 10px; border: 1px solid #ddd;\">1600<\/td>\n<td style=\"padding: 10px; border: 1px solid #ddd;\">0.175<\/td>\n<td style=\"padding: 10px; border: 1px solid #ddd;\">280<\/td>\n<td style=\"padding: 10px; border: 1px solid #ddd;\">Razer Viper V3 Pro<\/td>\n<\/tr>\n<tr style=\"background-color: #f9f9f9;\">\n<td style=\"padding: 10px; border: 1px solid #ddd;\">aspas<\/td>\n<td style=\"padding: 10px; border: 1px solid #ddd;\">Valorant<\/td>\n<td style=\"padding: 10px; border: 1px solid #ddd;\">800<\/td>\n<td style=\"padding: 10px; border: 1px solid #ddd;\">0.40<\/td>\n<td style=\"padding: 10px; border: 1px solid #ddd;\">320<\/td>\n<td style=\"padding: 10px; border: 1px solid #ddd;\">Razer DeathAdder V3<\/td>\n<\/tr>\n<tr>\n<td style=\"padding: 10px; border: 1px solid #ddd;\">ImperialHal<\/td>\n<td style=\"padding: 10px; border: 1px solid #ddd;\">Apex Legends<\/td>\n<td style=\"padding: 10px; border: 1px solid #ddd;\">800<\/td>\n<td style=\"padding: 10px; border: 1px solid #ddd;\">1.3<\/td>\n<td style=\"padding: 10px; border: 1px solid #ddd;\">1040<\/td>\n<td style=\"padding: 10px; border: 1px solid #ddd;\">Logitech G Pro X SL<\/td>\n<\/tr>\n<tr style=\"background-color: #f9f9f9;\">\n<td style=\"padding: 10px; border: 1px solid #ddd;\">Bugha<\/td>\n<td style=\"padding: 10px; border: 1px solid #ddd;\">Fortnite<\/td>\n<td style=\"padding: 10px; border: 1px solid #ddd;\">800<\/td>\n<td style=\"padding: 10px; border: 1px solid #ddd;\">6.0%<\/td>\n<td style=\"padding: 10px; border: 1px solid #ddd;\">48<\/td>\n<td style=\"padding: 10px; border: 1px solid #ddd;\">Logitech G Pro X SL<\/td>\n<\/tr>\n<tr>\n<td style=\"padding: 10px; border: 1px solid #ddd;\">Stalk3r<\/td>\n<td style=\"padding: 10px; border: 1px solid #ddd;\">Overwatch 2<\/td>\n<td style=\"padding: 10px; border: 1px solid #ddd;\">800<\/td>\n<td style=\"padding: 10px; border: 1px solid #ddd;\">7.00<\/td>\n<td style=\"padding: 10px; border: 1px solid #ddd;\">5600<\/td>\n<td style=\"padding: 10px; border: 1px solid #ddd;\">Logitech G Pro X SL 2<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-how-the-conversion-formula-works\">How the Conversion Formula Works<\/h2>\n\n\n\n<p>We believe in transparency. The tool calculates your settings using the standard physics of mouse movement. The core formula to find the physical distance of a 360-degree turn is:<\/p>\n\n\n\n<p class=\"has-text-align-center\">inches_per_360 = 360 \/ (sensitivity \u00d7 DPI \u00d7 yaw)<\/p>\n\n\n\n<p>The converter reverses this formula for your target game. For example, if you convert a CS2 sensitivity of 2.0 at 400 DPI to Valorant, the math looks like this: <code>2.0 \/ 3.1818 = 0.628<\/code>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"faq\">Frequently Asked Questions<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-how-do-i-convert-cs2-sensitivity-to-valorant\">How do I convert CS2 sensitivity to Valorant?<\/h3>\n\n\n\n<p>Divide your CS2 sensitivity by <strong>3.1818<\/strong>. Alternatively, you can simply use the tool above for an instant, precise calculation.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-is-cm-360-the-same-as-edpi\">Is cm\/360 the same as eDPI?<\/h3>\n\n\n\n<p>No. eDPI is a digital number specific to one game engine. cm\/360 is a physical measurement of mouse distance on your desk, which applies to the real world.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-does-sensitivity-conversion-work-for-scoped-ads\">Does sensitivity conversion work for scoped\/ADS?<\/h3>\n\n\n\n<p>This converter calculates your hipfire (general) sensitivity. Most games have separate multipliers for ADS (Aim Down Sights) that scale off this hipfire value, so getting the hipfire right is the first step.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-can-i-convert-between-different-dpis\">Can I convert between different DPIs?<\/h3>\n\n\n\n<p>Yes. Our tool allows you to input a different DPI for your target game. It will mathematically adjust the required sensitivity to keep your cm<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Convert mouse sensitivity instantly between CS2, Valorant, Overwatch 2, and 20+ FPS games. Maintain muscle memory with accurate eDPI and cm\/360 calculations.<\/p>\n","protected":false},"author":49,"featured_media":38381,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"cos_headline_score":0,"cos_seo_score":0,"cos_headline_text":"Mouse Sensitivity Converter: Calculator for 23 FPS Games","cos_headline_has_been_analyzed":false,"cos_last_analyzed_headline":[],"_hreflang_tags":"","footnotes":"","jetpack_publicize_message":"","jetpack_is_tweetstorm":false,"jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","enabled":false}}},"categories":[23],"tags":[],"class_list":["post-38394","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-digital-lifestyle-old"],"jetpack_publicize_connections":[],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.4 (Yoast SEO v21.0) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Mouse Sensitivity Converter: Calculator for 23 FPS Games<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.recharge.com\/blog\/en-gb\/mouse-sensitivity-converter-calculator-for-23-fps-games\" \/>\n<meta property=\"og:locale\" content=\"en_GB\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Mouse Sensitivity Converter: Calculator for 23 FPS Games\" \/>\n<meta property=\"og:description\" content=\"Convert mouse sensitivity instantly between CS2, Valorant, Overwatch 2, and 20+ FPS games. Maintain muscle memory with accurate eDPI and cm\/360 calculations.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.recharge.com\/blog\/en-gb\/mouse-sensitivity-converter-calculator-for-23-fps-games\" \/>\n<meta property=\"og:site_name\" content=\"Recharge Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-02-27T15:51:06+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-03-24T16:43:26+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/creativegroup-blog-prd-eu-west-1-recharge-blog.s3.eu-west-1.amazonaws.com\/blog\/wp-content\/uploads\/2026\/02\/27164737\/hero-image-en-110.png\" \/>\n\t<meta property=\"og:image:width\" content=\"900\" \/>\n\t<meta property=\"og:image:height\" content=\"491\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Conor Byrne\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.recharge.com\/blog\/en-gb\/mouse-sensitivity-converter-calculator-for-23-fps-games\",\"url\":\"https:\/\/www.recharge.com\/blog\/en-gb\/mouse-sensitivity-converter-calculator-for-23-fps-games\",\"name\":\"Mouse Sensitivity Converter: Calculator for 23 FPS Games\",\"isPartOf\":{\"@id\":\"https:\/\/www.recharge.com\/blog\/en-gb\/#website\"},\"datePublished\":\"2026-02-27T15:51:06+00:00\",\"dateModified\":\"2026-03-24T16:43:26+00:00\",\"author\":{\"@id\":\"https:\/\/www.recharge.com\/blog\/en-gb\/#\/schema\/person\/857508b94164c3cdc1f206b5c30d31a6\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.recharge.com\/blog\/en-gb\/mouse-sensitivity-converter-calculator-for-23-fps-games#breadcrumb\"},\"inLanguage\":\"en-GB\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.recharge.com\/blog\/en-gb\/mouse-sensitivity-converter-calculator-for-23-fps-games\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.recharge.com\/blog\/en-gb\/mouse-sensitivity-converter-calculator-for-23-fps-games#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.recharge.com\/blog\/en-gb\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Mouse Sensitivity Converter: Calculator for 23 FPS Games\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.recharge.com\/blog\/en-gb\/#website\",\"url\":\"https:\/\/www.recharge.com\/blog\/en-gb\/\",\"name\":\"Recharge Blog\",\"description\":\"Everything about online safety, smart spending &amp; your digital lifestyle.\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.recharge.com\/blog\/en-gb\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"en-GB\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.recharge.com\/blog\/en-gb\/#\/schema\/person\/857508b94164c3cdc1f206b5c30d31a6\",\"name\":\"Conor Byrne\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-GB\",\"@id\":\"https:\/\/www.recharge.com\/blog\/en-gb\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/624bd2d0a75e67e81c16920493bcda346cb5cfd0f77cfdff3a72413de0254eeb?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/624bd2d0a75e67e81c16920493bcda346cb5cfd0f77cfdff3a72413de0254eeb?s=96&d=mm&r=g\",\"caption\":\"Conor Byrne\"},\"description\":\"My passion for the e-commerce and fintech space started years ago with my first gaming console, giving me firsthand experience with the world of digital credit and top-ups. As a blog copywriter here at Recharge.com, I now get to use that insight to create clear, helpful content that makes navigating gift cards and online payments a breeze for our community.\",\"url\":\"https:\/\/www.recharge.com\/blog\/en-gb\/author\/conor-byrne\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Mouse Sensitivity Converter: Calculator for 23 FPS Games","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.recharge.com\/blog\/en-gb\/mouse-sensitivity-converter-calculator-for-23-fps-games","og_locale":"en_GB","og_type":"article","og_title":"Mouse Sensitivity Converter: Calculator for 23 FPS Games","og_description":"Convert mouse sensitivity instantly between CS2, Valorant, Overwatch 2, and 20+ FPS games. Maintain muscle memory with accurate eDPI and cm\/360 calculations.","og_url":"https:\/\/www.recharge.com\/blog\/en-gb\/mouse-sensitivity-converter-calculator-for-23-fps-games","og_site_name":"Recharge Blog","article_published_time":"2026-02-27T15:51:06+00:00","article_modified_time":"2026-03-24T16:43:26+00:00","og_image":[{"width":900,"height":491,"url":"https:\/\/creativegroup-blog-prd-eu-west-1-recharge-blog.s3.eu-west-1.amazonaws.com\/blog\/wp-content\/uploads\/2026\/02\/27164737\/hero-image-en-110.png","type":"image\/png"}],"author":"Conor Byrne","twitter_card":"summary_large_image","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.recharge.com\/blog\/en-gb\/mouse-sensitivity-converter-calculator-for-23-fps-games","url":"https:\/\/www.recharge.com\/blog\/en-gb\/mouse-sensitivity-converter-calculator-for-23-fps-games","name":"Mouse Sensitivity Converter: Calculator for 23 FPS Games","isPartOf":{"@id":"https:\/\/www.recharge.com\/blog\/en-gb\/#website"},"datePublished":"2026-02-27T15:51:06+00:00","dateModified":"2026-03-24T16:43:26+00:00","author":{"@id":"https:\/\/www.recharge.com\/blog\/en-gb\/#\/schema\/person\/857508b94164c3cdc1f206b5c30d31a6"},"breadcrumb":{"@id":"https:\/\/www.recharge.com\/blog\/en-gb\/mouse-sensitivity-converter-calculator-for-23-fps-games#breadcrumb"},"inLanguage":"en-GB","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.recharge.com\/blog\/en-gb\/mouse-sensitivity-converter-calculator-for-23-fps-games"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.recharge.com\/blog\/en-gb\/mouse-sensitivity-converter-calculator-for-23-fps-games#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.recharge.com\/blog\/en-gb"},{"@type":"ListItem","position":2,"name":"Mouse Sensitivity Converter: Calculator for 23 FPS Games"}]},{"@type":"WebSite","@id":"https:\/\/www.recharge.com\/blog\/en-gb\/#website","url":"https:\/\/www.recharge.com\/blog\/en-gb\/","name":"Recharge Blog","description":"Everything about online safety, smart spending &amp; your digital lifestyle.","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.recharge.com\/blog\/en-gb\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"en-GB"},{"@type":"Person","@id":"https:\/\/www.recharge.com\/blog\/en-gb\/#\/schema\/person\/857508b94164c3cdc1f206b5c30d31a6","name":"Conor Byrne","image":{"@type":"ImageObject","inLanguage":"en-GB","@id":"https:\/\/www.recharge.com\/blog\/en-gb\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/624bd2d0a75e67e81c16920493bcda346cb5cfd0f77cfdff3a72413de0254eeb?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/624bd2d0a75e67e81c16920493bcda346cb5cfd0f77cfdff3a72413de0254eeb?s=96&d=mm&r=g","caption":"Conor Byrne"},"description":"My passion for the e-commerce and fintech space started years ago with my first gaming console, giving me firsthand experience with the world of digital credit and top-ups. As a blog copywriter here at Recharge.com, I now get to use that insight to create clear, helpful content that makes navigating gift cards and online payments a breeze for our community.","url":"https:\/\/www.recharge.com\/blog\/en-gb\/author\/conor-byrne"}]}},"jetpack_featured_media_url":"https:\/\/creativegroup-blog-prd-eu-west-1-recharge-blog.s3.eu-west-1.amazonaws.com\/blog\/wp-content\/uploads\/2026\/02\/27164737\/hero-image-en-110.png","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.recharge.com\/blog\/en-gb\/wp-json\/wp\/v2\/posts\/38394","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.recharge.com\/blog\/en-gb\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.recharge.com\/blog\/en-gb\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.recharge.com\/blog\/en-gb\/wp-json\/wp\/v2\/users\/49"}],"replies":[{"embeddable":true,"href":"https:\/\/www.recharge.com\/blog\/en-gb\/wp-json\/wp\/v2\/comments?post=38394"}],"version-history":[{"count":5,"href":"https:\/\/www.recharge.com\/blog\/en-gb\/wp-json\/wp\/v2\/posts\/38394\/revisions"}],"predecessor-version":[{"id":38748,"href":"https:\/\/www.recharge.com\/blog\/en-gb\/wp-json\/wp\/v2\/posts\/38394\/revisions\/38748"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.recharge.com\/blog\/en-gb\/wp-json\/wp\/v2\/media\/38381"}],"wp:attachment":[{"href":"https:\/\/www.recharge.com\/blog\/en-gb\/wp-json\/wp\/v2\/media?parent=38394"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.recharge.com\/blog\/en-gb\/wp-json\/wp\/v2\/categories?post=38394"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.recharge.com\/blog\/en-gb\/wp-json\/wp\/v2\/tags?post=38394"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}