{"id":7083,"date":"2026-07-21T06:44:28","date_gmt":"2026-07-21T06:44:28","guid":{"rendered":"https:\/\/assistyu.com\/?page_id=7083"},"modified":"2026-08-11T21:46:29","modified_gmt":"2026-08-11T21:46:29","slug":"network-security-scan","status":"publish","type":"page","link":"https:\/\/assistyu.com\/es\/cybersecurity-tools\/network-security-scan\/","title":{"rendered":"Network Security Scan"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"7083\" class=\"elementor elementor-7083\">\n\t\t\t\t<div class=\"elementor-element elementor-element-c18dd00 e-con e-atomic-element e-flexbox-base e-da084ef \" data-id=\"c18dd00\" data-element_type=\"e-flexbox\" data-e-type=\"e-flexbox\" data-interaction-id=\"c18dd00\">\n    \t\t<div class=\"elementor-element elementor-element-a8a40e2 elementor-widget elementor-widget-html\" data-id=\"a8a40e2\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n<meta charset=\"UTF-8\" \/>\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" \/>\n<title>AssistYU \u2014 Network Scan<\/title>\n<link rel=\"preconnect\" href=\"https:\/\/fonts.googleapis.com\" \/>\n<link rel=\"preconnect\" href=\"https:\/\/fonts.gstatic.com\" crossorigin \/>\n<link href=\"https:\/\/fonts.googleapis.com\/css2?family=Space+Grotesk:wght@400;500;600;700&family=Inter:wght@400;500;600&family=JetBrains+Mono:wght@400;500;600;700&display=swap\" rel=\"stylesheet\" \/>\n<!-- Leaflet: precise interactive map + accuracy circle -->\n<link rel=\"stylesheet\" href=\"https:\/\/unpkg.com\/leaflet@1.9.4\/dist\/leaflet.css\" \/>\n<style>\n* { margin: 0; padding: 0; box-sizing: border-box; }\n:root {\n  --ayu-bg-deep: #060815;\n  --ayu-bg-navy: #090d24;\n  --ayu-bg-navy-2: #0b1130;\n  --ayu-text-primary: #ffffff;\n  --ayu-text-secondary: #d4daff;\n  --ayu-text-tertiary: #bcc4f0;\n  --glass-border: rgba(79, 110, 247, 0.15);\n  --border: rgba(79, 110, 247, 0.18);\n  --border-strong: rgba(79, 110, 247, 0.30);\n  --cyan: #4f6ef7;\n  --blue: #4f6ef7;\n  --violet: #8a6bff;\n  --danger: #ff3d68;\n  --safe: #22e6a8;\n  --amber: #ffb84d;\n  --font-display: 'Space Grotesk', sans-serif;\n  --font-body: 'Inter', sans-serif;\n  --font-mono: 'JetBrains Mono', monospace;\n  --surface: rgba(9, 13, 36, 0.55);\n  --surface-3: rgba(6, 8, 21, 0.40);\n  --hairline: rgba(79, 110, 247, 0.10);\n  --radius: 18px;\n  --shadow-md: 0 10px 30px rgba(0, 0, 0, 0.35);\n}\nhtml, body {\n  min-height: 100vh;\n  background: #060815;\n  color: var(--ayu-text-primary);\n  font-family: var(--font-body);\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n  text-rendering: optimizeLegibility;\n  position: relative;\n  isolation: isolate;\n  overflow-x: hidden;\n}\n.page-bg { position: absolute; inset: 0; z-index: 0; pointer-events: none; background: linear-gradient(180deg, #060815 0%, #060815 20%, #090d24 50%, #060815 80%, #060815 100%); }\n.bg-layers { position: absolute; inset: 0; z-index: 0; pointer-events: none; mask-image: linear-gradient(to bottom, transparent 0%, black 20%, black 80%, transparent 100%); -webkit-mask-image: linear-gradient(to bottom, transparent 0%, black 20%, black 80%, transparent 100%); }\n.ayu-bg-world { position: fixed; inset: 0; background-image: url('https:\/\/assistyu.com\/wp-content\/uploads\/2026\/07\/scan-network-scaled.jpeg?w=1600&q=80'); background-size: cover; background-position: center; background-attachment: fixed; opacity: 0.10; mask-image: radial-gradient(ellipse 80% 70% at 50% 40%, black 20%, transparent 75%); -webkit-mask-image: radial-gradient(ellipse 80% 70% at 50% 40%, black 20%, transparent 75%); }\n.ayu-bg-dots { position: absolute; inset: 0; background-image: radial-gradient(circle at 1px 1px, rgba(79, 110, 247, 0.08) 1px, transparent 1px); background-size: 48px 48px; mask-image: radial-gradient(ellipse 60% 50% at 50% 50%, black 20%, transparent 70%); -webkit-mask-image: radial-gradient(ellipse 60% 50% at 50% 50%, black 20%, transparent 70%); }\n.ayu-bg-glow { position: absolute; inset: 0; background: radial-gradient(ellipse 50% 40% at 15% 15%, rgba(79, 110, 247, 0.12), transparent 55%), radial-gradient(ellipse 35% 30% at 50% 50%, rgba(236, 72, 153, 0.04), transparent 60%), radial-gradient(ellipse 50% 40% at 70% 20%, rgba(34, 211, 238, 0.06), transparent 50%); }\n.ayu-bg-orb-1 { position: absolute; width: 400px; height: 400px; top: 10%; left: 5%; border-radius: 50%; background: radial-gradient(circle, rgba(79, 110, 247, 0.06) 0%, transparent 70%); animation: ayuOrbFloat1 20s ease-in-out infinite; }\n.ayu-bg-orb-2 { position: absolute; width: 300px; height: 300px; bottom: 15%; right: 10%; border-radius: 50%; background: radial-gradient(circle, rgba(139, 92, 246, 0.06) 0%, transparent 70%); animation: ayuOrbFloat2 25s ease-in-out infinite; }\n@keyframes ayuOrbFloat1 { 0%,100%{transform:translate(0,0) scale(1);} 33%{transform:translate(30px,-20px) scale(1.05);} 66%{transform:translate(-15px,15px) scale(0.95);} }\n@keyframes ayuOrbFloat2 { 0%,100%{transform:translate(0,0) scale(1);} 33%{transform:translate(-20px,25px) scale(1.08);} 66%{transform:translate(25px,-10px) scale(0.92);} }\n.ayu-content-overlay { position: relative; z-index: 1; }\na { color: inherit; text-decoration: none; }\nbutton { font-family: inherit; cursor: pointer; }\n::selection { background: var(--cyan); color: #04060d; }\nhtml { scroll-behavior: smooth; }\n@media(prefers-reduced-motion:reduce) { html { scroll-behavior: auto; } }\na:focus-visible, button:focus-visible, .swi input:focus-visible+.sws, .map-click:focus-visible, .card:focus-visible { outline: 2px solid var(--cyan); outline-offset: 3px; border-radius: 8px; }\n\nmain { max-width: 85%; margin: 0 auto; padding: 130px 0 48px; position: relative; z-index: 1; }\n\n#start-view { display: flex; flex-direction: column; align-items: center; justify-content: center; min-height: calc(80vh - 130px); text-align: center; animation: fadeUp .6s cubic-bezier(.2,.8,.2,1); }\n@keyframes fadeUp { from{opacity:0;transform:translateY(18px);} to{opacity:1;transform:none;} }\n.start-shield { position: relative; width: 80px; height: 80px; margin-bottom: 28px; }\n.start-shield svg { width: 80px; height: 80px; color: var(--cyan); filter: drop-shadow(0 0 24px rgba(79,110,247,0.40)); }\n.start-shield::after { content: ''; position: absolute; inset: -12px; border-radius: 50%; background: radial-gradient(circle, rgba(79,110,247,0.10), transparent 70%); animation: pulse 2.5s ease-in-out infinite; }\n@keyframes pulse { 0%,100%{transform:scale(1);opacity:.6;} 50%{transform:scale(1.15);opacity:1;} }\n.start-title { font-family: var(--font-display); font-weight: 700; font-size: clamp(28px,5vw,48px); color: var(--ayu-text-primary); letter-spacing: -0.03em; line-height: 1.15; margin-bottom: 12px; }\n.start-title span { color: var(--cyan); }\n.start-sub { font-family: var(--font-body); font-size: clamp(14px,1.5vw,18px); color: var(--ayu-text-secondary); line-height: 1.6; max-width: 520px; margin-bottom: 36px; }\n.start-cta { display: inline-flex; align-items: center; gap: 12px; padding: 16px 36px; border-radius: 14px; cursor: pointer; font-family: var(--font-display); font-weight: 600; font-size: 16px; color: var(--ayu-text-primary); letter-spacing: 0.2px; background: linear-gradient(135deg, rgba(79,110,247,0.20), rgba(138,107,255,0.16)); border: 1px solid rgba(79,110,247,0.40); box-shadow: 0 4px 24px rgba(79,110,247,0.20), 0 0 60px rgba(79,110,247,0.06); transition: all .3s cubic-bezier(.2,.8,.2,1); position: relative; overflow: hidden; }\n.start-cta::before { content:''; position:absolute; inset:0; border-radius:14px; background: linear-gradient(135deg, rgba(255,255,255,0.05), transparent); pointer-events:none; }\n.start-cta svg { width:20px; height:20px; color: var(--cyan); transition: transform .3s; }\n.start-cta:hover { transform: translateY(-3px); box-shadow: 0 8px 36px rgba(79,110,247,0.30), 0 0 80px rgba(79,110,247,0.10); border-color: rgba(79,110,247,0.60); background: linear-gradient(135deg, rgba(79,110,247,0.28), rgba(138,107,255,0.22)); }\n.start-cta:hover svg { transform: translateX(3px); }\n.start-cta:active { transform: translateY(-1px); box-shadow: 0 4px 20px rgba(79,110,247,0.22); }\n.start-features { display: flex; gap: 24px; margin-top: 40px; flex-wrap: wrap; justify-content: center; }\n.start-feat { display: flex; align-items: center; gap: 8px; font-family: var(--font-mono); font-size: 11px; letter-spacing: 0.5px; color: var(--ayu-text-tertiary); text-transform: uppercase; }\n.start-feat-dot { width: 5px; height: 5px; border-radius: 50%; background: var(--cyan); box-shadow: 0 0 8px rgba(79,110,247,0.5); }\n\n.telemetry { display: flex; flex-wrap: wrap; gap: 16px; align-items: center; justify-content: space-between; margin: 24px 0 0; width: 100%; background: linear-gradient(135deg, rgba(9,13,36,.6) 0%, rgba(6,8,21,.7) 100%); border: 1px solid var(--border-strong); border-radius: var(--radius); padding: 18px 22px; box-shadow: var(--shadow-md); }\n.telemetry-left { display: flex; flex-wrap: wrap; gap: 10px; align-items: center; }\n.status-pill { display: inline-flex; align-items: center; gap: 8px; font-family: var(--font-mono); font-size: 11px; letter-spacing: .5px; color: var(--ayu-text-primary); padding: 8px 14px; border-radius: 999px; background: rgba(6,8,21,.7); border: 1px solid var(--border); white-space: nowrap; transition: border-color .2s; }\n.status-pill:hover { border-color: rgba(34,211,238,.3); }\n.status-pill .dot { width: 7px; height: 7px; border-radius: 50%; flex-shrink: 0; }\n.status-pill .dot.online { background: var(--safe); box-shadow: 0 0 10px var(--safe); animation: lp 1.8s ease-in-out infinite; }\n.status-pill .lbl { color: var(--ayu-text-secondary); }\n.status-pill .val { color: #fff; font-weight: 600; }\n.net-activity { display: flex; align-items: center; gap: 9px; padding: 7px 14px; border-radius: 999px; background: rgba(6,8,21,.7); border: 1px solid var(--border); }\n.net-activity .net-lbl { font-family: var(--font-mono); font-size: 9px; letter-spacing: 1px; color: var(--ayu-text-secondary); text-transform: uppercase; }\n.net-activity svg { display: block; }\n.last-update { font-family: var(--font-mono); font-size: 11px; color: var(--ayu-text-secondary); white-space: nowrap; }\n.last-update b { color: #fff; }\n@keyframes lp { 0%,100%{opacity:1;} 50%{opacity:.4;} }\n\n.hero-stats { display: grid; grid-template-columns: repeat(4, 1fr); gap: 16px; margin-top: 20px; width: 100%; }\n@media (max-width: 992px) { .hero-stats { grid-template-columns: repeat(2, 1fr); } }\n@media (max-width: 480px) { .hero-stats { grid-template-columns: 1fr; } }\n.stat-card { background: var(--surface); backdrop-filter: blur(14px); -webkit-backdrop-filter: blur(14px); border: 1px solid var(--border-strong); border-radius: var(--radius); padding: 20px 18px; position: relative; overflow: hidden; box-shadow: var(--shadow-md); transition: transform .35s cubic-bezier(.2,.8,.2,1), border-color .35s cubic-bezier(.2,.8,.2,1); text-align: left; }\n.stat-card::before { content:''; position:absolute; inset:0; background: radial-gradient(120% 140% at 15% 0%, rgba(79,110,247,.08), transparent 60%); pointer-events:none; }\n.stat-card:hover { transform: translateY(-4px); border-color: rgba(79,110,247,.45); }\n.stat-card .s-ico { width: 24px; height: 24px; color: #fff; opacity: .9; margin-bottom: 10px; flex-shrink: 0; }\n.stat-card .s-ico svg { width: 24px; height: 24px; display: block; }\n.stat-card .s-val { font-family: var(--font-display); font-weight: 700; font-size: clamp(20px, 2.4vw, 28px); letter-spacing: -.02em; line-height: 1; color: #fff; }\n.stat-card .s-val .unit { font-size: .5em; color: var(--ayu-text-secondary); margin-left: 2px; }\n.stat-card .s-label { font-family: var(--font-mono); font-size: 10px; letter-spacing: 1px; text-transform: uppercase; color: var(--ayu-text-secondary); margin-top: 10px; }\n.stat-card .s-trend { position: absolute; top: 16px; right: 16px; font-family: var(--font-mono); font-size: 10px; color: var(--safe); }\n\n.panel { background: var(--surface); backdrop-filter: blur(16px); -webkit-backdrop-filter: blur(16px); border: 1px solid var(--border-strong); border-radius: var(--radius); box-shadow: var(--shadow-md); position: relative; overflow: hidden; width: 100%; margin-top: 32px; }\n.panel::before { content: ''; position: absolute; inset: 0; border-radius: inherit; pointer-events: none; background: radial-gradient(120% 150% at 20% 20%, rgba(79, 110, 247, 0.05), transparent 65%); }\n.panel > * { position: relative; z-index: 1; }\n.panel-pad { padding: clamp(18px, 2.2vw, 26px); }\n.desktop-only { display: block; }\n.mobile-only { display: none; }\n@media (max-width: 600px) { .desktop-only { display: none !important; } .mobile-only { display: block; } }\n\n#scan-stage { display: none; margin-top: 28px; text-align: center; }\n#scan-stage .eyebrow { text-align: center; font-size: 12px; letter-spacing: 1.5px; color: var(--ayu-text-tertiary); text-transform: uppercase; font-weight: 500; }\n#scan-stage .eyebrow span { color: var(--cyan); }\n#scan-stage .hl { display: block; font-family: var(--font-display); font-size: clamp(24px,4vw,42px); font-weight: 700; line-height: 1.15; margin-top: 8px; color: var(--ayu-text-primary); text-align: center; }\n#scan-stage .sw-t { transition: color .4s; }\n#scan-stage .sw-t.scanning { color: var(--cyan); text-shadow: 0 0 30px rgba(79,110,247,0.4); }\n#scan-stage .sw-t.exposed { color: var(--danger); text-shadow: 0 0 30px rgba(255,61,104,0.4); }\n#scan-stage .sw-t.protected { color: var(--safe); text-shadow: 0 0 30px rgba(34,230,168,0.4); }\n.scan-grid { margin-top: 12px; display: flex; flex-direction: column; align-items: center; gap: 12px; width: 100%; max-width: 700px; margin-left: auto; margin-right: auto; }\n.radar-sec { display: flex; flex-direction: column; align-items: center; margin-bottom: 8px; }\n.radar-box { position: relative; width: min(340px,55vw); aspect-ratio: 1; }\n#radarCanvas { width: 100%; height: 100%; display: block; }\n.rl { margin-top: 12px; font-family: var(--font-mono); font-size: 10px; letter-spacing: 2px; color: var(--ayu-text-tertiary); text-transform: uppercase; }\n.rl .live { color: var(--cyan); animation: lp 1.5s ease-in-out infinite; }\n.ensec { width: 100%; max-width: min(340px,55vw); margin: 0 auto; display: flex; flex-direction: column; align-items: center; gap: 10px; }\n.ensec .enb { width: 100%; height: 6px; border-radius: 99px; background: rgba(79,110,247,0.10); overflow: hidden; position: relative; }\n.ensec .enbf { height: 100%; width: 0%; border-radius: 99px; background: linear-gradient(90deg, var(--cyan), var(--blue), var(--violet)); transition: width .4s; box-shadow: 0 0 16px rgba(79,110,247,0.5); }\n.ensec .enp { font-family: var(--font-mono); font-size: 13px; font-weight: 600; color: var(--ayu-text-primary); letter-spacing: 1px; }\n.ensec .enp .pct { color: var(--cyan); }\n.ensec .en-status { font-family: var(--font-body); font-size: 13px; color: var(--ayu-text-secondary); letter-spacing: 0.3px; min-height: 1.6em; transition: color .3s; }\n.ensec .en-status.done { color: var(--safe); font-weight: 500; }\n.ensec .en-status .highlight { color: var(--cyan); font-weight: 600; }\n.ensec .en-status .done-highlight { color: var(--safe); font-weight: 600; }\n\n#verdict-view { display: none; padding-top: 20px; }\n.verdict-header { margin-top: 40px; text-align: center; display: flex; flex-direction: column; align-items: center; gap: 12px; animation: fadeUp .6s cubic-bezier(.2,.8,.2,1); }\n.verdict-header .vb { width: 48px; height: 48px; border-radius: 13px; flex-shrink: 0; display: flex; align-items: center; justify-content: center; backdrop-filter: blur(8px); transition: all .4s; }\n.verdict-header .vb.dg { background: rgba(255,61,104,0.12); border: 1px solid rgba(255,61,104,0.35); color: var(--danger); box-shadow: 0 0 22px rgba(255,61,104,0.20), inset 0 1px 0 rgba(255,255,255,0.05); }\n.verdict-header .vb.sg { background: rgba(34,230,168,0.12); border: 1px solid rgba(34,230,168,0.35); color: var(--safe); box-shadow: 0 0 22px rgba(34,230,168,0.20), inset 0 1px 0 rgba(255,255,255,0.05); }\n.verdict-header .vb svg { width: 22px; height: 22px; }\n.verdict-header .vht-title { font-family: var(--font-display); font-weight: 700; font-size: clamp(28px,5vw,48px); color: var(--ayu-text-primary); letter-spacing: -0.03em; line-height: 1.15; }\n.verdict-header .vht-desc { font-family: var(--font-display); font-weight: 700; font-size: clamp(36px,7vw,72px); color: var(--ayu-text-primary); letter-spacing: -0.02em; line-height: 1.1; max-width: 900px; margin-top: 2px; white-space: nowrap; }\n.verdict-header.exposed .vht-desc { color: var(--danger); text-shadow: 0 0 40px rgba(255,61,104,0.2); }\n.verdict-header.protected .vht-desc { color: var(--safe); text-shadow: 0 0 40px rgba(34,230,168,0.2); }\n.verdict-header .vht-subdesc { font-family: var(--font-body); font-size: clamp(14px,1.3vw,17px); color: var(--ayu-text-secondary); line-height: 1.6; max-width: 700px; margin-top: -2px; white-space: nowrap; }\n.protect-toggle-row { display: inline-flex; align-items: center; gap: 14px; margin-top: 6px; padding: 10px 22px; border-radius: 999px; background: linear-gradient(135deg, rgba(9,13,36,0.85), rgba(6,8,21,0.75)); border: 1px solid var(--border-strong); backdrop-filter: blur(12px); box-shadow: 0 4px 20px rgba(0,0,0,0.3); }\n.protect-toggle-row .toggle-label { font-family: var(--font-mono); font-size: 12px; font-weight: 600; color: var(--ayu-text-secondary); letter-spacing: 0.5px; text-transform: uppercase; transition: color .3s; }\n.protect-toggle-row .toggle-label.active { color: var(--safe); }\n.protect-toggle-row .swi { position: relative; width: 44px; height: 22px; flex-shrink: 0; }\n.protect-toggle-row .swi input { opacity: 0; width: 0; height: 0; }\n.protect-toggle-row .sws { position: absolute; inset: 0; background: #1c2440; border-radius: 999px; transition: all .3s; border: 1px solid var(--border-strong); cursor: pointer; }\n.protect-toggle-row .sws::before { content:''; position:absolute; width:14px; height:14px; left:3px; top:3px; background:#8a97bd; border-radius:50%; transition: all .3s; }\n.protect-toggle-row .swi input:checked+.sws { background: linear-gradient(90deg, var(--cyan), var(--safe)); border-color: transparent; box-shadow: 0 0 18px rgba(34,230,168,0.35); }\n.protect-toggle-row .swi input:checked+.sws::before { transform: translateX(22px); background: #04101a; }\n\n.hero-blocks { display: flex; gap: 20px; margin-top: 32px; align-items: stretch; animation: fadeUp .6s cubic-bezier(.2,.8,.2,1); }\n.hero-block { flex: 1; min-width: 0; border-radius: 20px; padding: 28px 30px; backdrop-filter: blur(16px); border: 1px solid var(--border-strong); background: linear-gradient(135deg, rgba(9,13,36,0.85), rgba(6,8,21,0.75)); box-shadow: 0 8px 40px rgba(0,0,0,0.35); display: flex; flex-direction: column; position: relative; overflow: hidden; transition: border-color .4s, box-shadow .4s, background .4s; }\n.hero-block::before { content:''; position:absolute; inset:0; border-radius:18px; pointer-events:none; background: repeating-linear-gradient(0deg, transparent, transparent 3px, rgba(255,255,255,0.010) 3px, rgba(255,255,255,0.010) 4px); }\n.hero-block.exposed { border-color: rgba(255,61,104,0.28); box-shadow: 0 8px 40px rgba(0,0,0,0.35), 0 0 60px rgba(255,61,104,0.10), inset 0 1px 0 rgba(255,255,255,0.04); }\n.hero-block.exposed::after { content:''; position:absolute; inset:0; border-radius:18px; background: radial-gradient(38% 55% at 20% 30%, rgba(255,61,104,0.18), transparent 70%), radial-gradient(45% 60% at 80% 70%, rgba(255,184,77,0.10), transparent 70%), radial-gradient(30% 45% at 55% 90%, rgba(255,61,104,0.08), transparent 70%); animation: vhSmoke 15s ease-in-out infinite alternate; pointer-events:none; }\n.hero-block.protected { border-color: rgba(34,230,168,0.28); box-shadow: 0 8px 40px rgba(0,0,0,0.35), 0 0 60px rgba(34,230,168,0.10), inset 0 1px 0 rgba(255,255,255,0.04); }\n.hero-block.protected::after { content:''; position:absolute; inset:0; border-radius:18px; background: radial-gradient(38% 55% at 20% 30%, rgba(34,230,168,0.18), transparent 70%), radial-gradient(45% 60% at 80% 70%, rgba(79,110,247,0.12), transparent 70%), radial-gradient(30% 45% at 55% 90%, rgba(34,230,168,0.08), transparent 70%); animation: vhSmoke 15s ease-in-out infinite alternate; pointer-events:none; }\n@keyframes vhSmoke { 0%{transform:translate(-2%,-1%) scale(1);} 50%{transform:translate(2%,2%) scale(1.08);} 100%{transform:translate(-1%,3%) scale(1.02);} }\n@media(prefers-reduced-motion:reduce) { .hero-block::after { animation:none; } }\n.hero-block>* { position: relative; z-index: 2; }\n.hero-left { align-items: center; text-align: center; justify-content: center; gap: 10px; }\n.hero-left .threats-label { font-family: var(--font-mono); font-size: 12px; font-weight: 700; letter-spacing: 2px; text-transform: uppercase; }\n.hero-left .threats-label.danger { color: var(--danger); }\n.hero-left .threats-label.safe { color: var(--safe); }\n.hero-left .threats-count { font-family: var(--font-display); font-size: clamp(48px,7vw,76px); font-weight: 700; color: var(--ayu-text-primary); letter-spacing: -0.02em; line-height: 1; margin: 4px 0 2px; }\n.hero-left .threats-count .num { color: var(--danger); }\n.hero-left .threats-count .num.safe { color: var(--safe); }\n.hero-left .threats-detail { font-family: var(--font-body); font-size: clamp(14px,1.3vw,17px); color: var(--ayu-text-secondary); line-height: 1.5; }\n.hero-left .threats-detail .highlight { color: var(--ayu-text-primary); font-weight: 500; }\n.hero-left .threats-badges { display: flex; gap: 10px; flex-wrap: wrap; justify-content: center; margin-top: auto; padding-top: 18px; border-top: 1px solid rgba(79,110,247,0.08); width: 100%; }\n.hero-left .badge { display: inline-flex; align-items: center; gap: 6px; padding: 6px 16px; border-radius: 999px; font-family: var(--font-mono); font-size: 11px; font-weight: 700; letter-spacing: 0.5px; border: 1px solid transparent; }\n.hero-left .badge.crit { background: rgba(255,61,104,0.12); color: var(--danger); border-color: rgba(255,61,104,0.30); }\n.hero-left .badge.warn { background: rgba(255,184,77,0.12); color: var(--amber); border-color: rgba(255,184,77,0.30); }\n.hero-left .badge .dot { width: 5px; height: 5px; border-radius: 50%; background: currentColor; box-shadow: 0 0 6px currentColor; }\n.hero-right { align-items: center; justify-content: center; padding: 24px 28px; display: flex; flex-direction: column; }\n.hero-right .gauge-wrap { display: flex; flex-direction: row; align-items: center; justify-content: center; gap: 40px; width: 100%; flex: 1; }\n.hero-right .gauge-ring { position: relative; width: 180px; height: 180px; flex-shrink: 0; filter: drop-shadow(0 4px 24px rgba(0,0,0,0.5)); }\n.hero-right .gauge-ring svg { width: 180px; height: 180px; transform: rotate(-90deg); overflow: visible; }\n.hero-right .gauge-ring circle { fill: none; stroke-linecap: round; }\n.hero-right .gauge-ring .g-bg { stroke: rgba(79,110,247,0.08); stroke-width: 8; }\n.hero-right .gauge-ring .g-fill { stroke-width: 10; transition: stroke-dashoffset 1.4s cubic-bezier(.4,0,.2,1), stroke .5s; filter: drop-shadow(0 0 16px rgba(0,0,0,0.3)); }\n.hero-right .gauge-ring .g-inner { position: absolute; inset: 10px; border-radius: 50%; background: radial-gradient(circle at 35% 35%, rgba(255,255,255,0.06), transparent 60%), linear-gradient(135deg, rgba(9,13,36,0.95), rgba(6,8,21,0.90)); border: 1px solid rgba(79,110,247,0.08); box-shadow: inset 0 2px 10px rgba(0,0,0,0.4), inset 0 -1px 4px rgba(255,255,255,0.03); }\n.hero-right .gauge-ring .g-num { position: absolute; inset: 0; display: flex; flex-direction: column; align-items: center; justify-content: center; font-family: var(--font-display); }\n.hero-right .gauge-ring .g-num-val { font-size: 48px; font-weight: 700; color: var(--ayu-text-primary); line-height: 1; letter-spacing: -0.02em; text-shadow: 0 0 30px rgba(79,110,247,0.15); }\n.hero-right .gauge-ring .g-num-of { font-size: 13px; font-weight: 500; color: var(--ayu-text-tertiary); letter-spacing: 1px; margin-top: 0px; opacity: 0.7; }\n.hero-right .gauge-info { display: flex; flex-direction: column; align-items: flex-start; gap: 10px; min-width: 0; flex: 1; padding: 4px 0; text-align: left; }\n.hero-right .gauge-grade { font-family: var(--font-display); font-size: clamp(28px,3vw,38px); font-weight: 700; letter-spacing: 0.3px; line-height: 1.2; }\n.hero-right .gauge-grade .sub { font-family: var(--font-body); font-size: clamp(16px,1.5vw,20px); font-weight: 400; color: var(--ayu-text-secondary); display: block; margin-top: 4px; }\n.hero-right .gauge-tags { display: flex; gap: 8px; flex-wrap: wrap; justify-content: flex-start; margin-top: 4px; }\n.hero-right .gauge-tags .tag { font-family: var(--font-mono); font-size: 11px; font-weight: 500; padding: 6px 16px; border-radius: 999px; background: rgba(79,110,247,0.06); border: 1px solid rgba(79,110,247,0.12); color: var(--ayu-text-secondary); letter-spacing: 0.3px; transition: all .2s; }\n.hero-right .gauge-tags .tag.danger { background: rgba(255,61,104,0.12); border-color: rgba(255,61,104,0.25); color: var(--danger); }\n.hero-right .gauge-tags .tag.safe { background: rgba(34,230,168,0.12); border-color: rgba(34,230,168,0.25); color: var(--safe); }\n.hero-right .gauge-tags .tag.warn { background: rgba(255,184,77,0.12); border-color: rgba(255,184,77,0.25); color: var(--amber); }\n@media(max-width:768px) { .hero-blocks { flex-direction: column; } .hero-block { padding: 24px 22px; } .hero-left .threats-count { font-size: clamp(38px,10vw,56px); } .hero-right .gauge-wrap { flex-direction: column; text-align: center; gap: 24px; } .hero-right .gauge-info { align-items: center; text-align: center; } .hero-right .gauge-tags { justify-content: center; } .hero-right .gauge-ring { width: 140px; height: 140px; } .hero-right .gauge-ring svg { width: 140px; height: 140px; } .hero-right .gauge-ring .g-num-val { font-size: 36px; } .verdict-header { margin-top: 30px; } .verdict-header .vht-title { font-size: clamp(26px,4vw,38px); } .verdict-header .vht-desc { font-size: clamp(28px,5vw,44px); white-space: normal; } .verdict-header .vht-subdesc { white-space: normal; } }\n@media(max-width:480px) { .hero-block { padding: 20px 16px; } .hero-left .threats-count { font-size: 34px; } .hero-right .gauge-ring { width: 120px; height: 120px; } .hero-right .gauge-ring svg { width: 120px; height: 120px; } .hero-right .gauge-ring .g-num-val { font-size: 30px; } .hero-right .gauge-ring .g-num-of { font-size: 10px; } .verdict-header .vht-desc { font-size: clamp(24px,4vw,36px); white-space: normal; } .verdict-header .vht-subdesc { display: none; } }\n\n.rsec { margin-top: 20px; }\n.slab { margin-top: 32px; margin-bottom: 14px; font-family: var(--font-mono); font-size: 10px; letter-spacing: 2px; color: var(--ayu-text-secondary); text-transform: uppercase; font-weight: 600; display: flex; align-items: center; gap: 8px; }\n.slab::after { content:''; flex:1; height:1px; background: linear-gradient(90deg, rgba(79,110,247,0.20), transparent); }\n.g2 { display: grid; grid-template-columns: 1fr 1fr; gap: 14px; }\n.g3 { display: grid; grid-template-columns: repeat(3,1fr); gap: 14px; }\n#gth { grid-template-columns: 1fr 1fr !important; }\n@media(max-width:900px) { .g3 { grid-template-columns: repeat(2,1fr); } #gth { grid-template-columns: 1fr !important; } }\n@media(max-width:640px) { .g2 { grid-template-columns: 1fr; } .g3 { grid-template-columns: 1fr; } }\n@media(min-width:1440px) { .g2 { grid-template-columns: repeat(3,1fr); } }\n.card { position: relative; border-radius: 14px; padding: 20px 22px; display: flex; align-items: flex-start; gap: 16px; overflow: hidden; transition: transform .3s cubic-bezier(.2,.8,.2,1), box-shadow .3s, border-color .3s, background .3s; opacity: 0; transform: translateY(8px); animation: ci .45s ease forwards; background: linear-gradient(135deg, rgba(9,13,36,0.80), rgba(6,8,21,0.70)); border: 1px solid rgba(79,110,247,0.10); box-shadow: 0 2px 14px rgba(0,0,0,0.35), inset 0 1px 0 rgba(255,255,255,0.03); will-change: transform; backdrop-filter: blur(10px); -webkit-backdrop-filter: blur(10px); }\n.card::after { content:''; position:absolute; inset:0; border-radius:14px; pointer-events:none; background: repeating-linear-gradient(0deg, transparent, transparent 3px, rgba(255,255,255,0.008) 3px, rgba(255,255,255,0.008) 4px); opacity:1; transition: opacity .3s; }\n.card:hover { border-color: rgba(79,110,247,0.22); box-shadow: 0 6px 28px rgba(0,0,0,0.45), inset 0 1px 0 rgba(255,255,255,0.05); transform: translateY(-2px); }\n.card.c-cyan { border-color: rgba(79,110,247,0.14); background: linear-gradient(135deg, rgba(9,13,36,0.82), rgba(6,8,21,0.74)), radial-gradient(120% 120% at 0% 0%, rgba(79,110,247,0.04), transparent 60%); }\n.card.c-cyan:hover { border-color: rgba(79,110,247,0.28); box-shadow: 0 6px 28px rgba(0,0,0,0.45), 0 0 24px rgba(79,110,247,0.06); }\n.card.c-danger { border-color: rgba(255,61,104,0.28); background: linear-gradient(135deg, rgba(38,12,22,0.82), rgba(16,8,14,0.75)), radial-gradient(120% 120% at 0% 0%, rgba(255,61,104,0.16), transparent 60%); box-shadow: 0 2px 16px rgba(0,0,0,0.4), 0 0 26px rgba(255,61,104,0.10); }\n.card.c-danger:hover { border-color: rgba(255,61,104,0.45); box-shadow: 0 6px 28px rgba(0,0,0,0.5), 0 0 32px rgba(255,61,104,0.16); }\n.card.c-warn { border-color: rgba(255,184,77,0.28); background: linear-gradient(135deg, rgba(36,26,10,0.82), rgba(16,14,8,0.75)), radial-gradient(120% 120% at 0% 0%, rgba(255,184,77,0.14), transparent 60%); box-shadow: 0 2px 16px rgba(0,0,0,0.4), 0 0 24px rgba(255,184,77,0.08); }\n.card.c-warn:hover { border-color: rgba(255,184,77,0.40); box-shadow: 0 6px 28px rgba(0,0,0,0.5), 0 0 30px rgba(255,184,77,0.14); }\n.card.c-safe { border-color: rgba(34,230,168,0.22); background: linear-gradient(135deg, rgba(10,32,26,0.78), rgba(8,20,18,0.7)), radial-gradient(120% 120% at 0% 0%, rgba(34,230,168,0.10), transparent 60%); box-shadow: 0 2px 16px rgba(0,0,0,0.4), 0 0 22px rgba(34,230,168,0.06); }\n.card.c-safe:hover { border-color: rgba(34,230,168,0.35); box-shadow: 0 6px 28px rgba(0,0,0,0.5), 0 0 28px rgba(34,230,168,0.12); }\n.card.prot { border-color: rgba(34,230,168,0.28) !important; background: linear-gradient(135deg, rgba(10,32,26,0.82), rgba(8,20,18,0.75)), radial-gradient(120% 120% at 0% 0%, rgba(34,230,168,0.14), transparent 60%) !important; box-shadow: 0 2px 16px rgba(0,0,0,0.4), 0 0 26px rgba(34,230,168,0.10) !important; }\n.card.prot .ci { background: rgba(34,230,168,0.12) !important; border-color: rgba(34,230,168,0.35) !important; color: var(--safe) !important; }\n.card.prot .cv { color: var(--safe) !important; background: rgba(34,230,168,0.10) !important; border-color: rgba(34,230,168,0.22) !important; }\n.card.prot .cs { color: rgba(34,230,168,0.7) !important; }\n@keyframes ci { to { opacity:1; transform:none; } }\n.ci { width: 44px; height: 44px; border-radius: 11px; flex-shrink: 0; display: flex; align-items: center; justify-content: center; background: rgba(79,110,247,0.06); border: 1px solid rgba(79,110,247,0.18); color: var(--cyan); transition: all .35s; position: relative; z-index: 1; box-shadow: inset 0 1px 0 rgba(255,255,255,0.04); }\n.card:hover .ci { transform: scale(1.06); }\n.card.c-danger .ci { background: rgba(255,61,104,0.10); border-color: rgba(255,61,104,0.28); color: var(--danger); box-shadow: inset 0 1px 0 rgba(255,255,255,0.04), 0 0 14px rgba(255,61,104,0.10); }\n.card.c-warn .ci { background: rgba(255,184,77,0.10); border-color: rgba(255,184,77,0.28); color: var(--amber); box-shadow: inset 0 1px 0 rgba(255,255,255,0.04), 0 0 14px rgba(255,184,77,0.08); }\n.card.c-safe .ci { background: rgba(34,230,168,0.10); border-color: rgba(34,230,168,0.28); color: var(--safe); box-shadow: inset 0 1px 0 rgba(255,255,255,0.04), 0 0 14px rgba(34,230,168,0.08); }\n.ci svg { width: 20px; height: 20px; }\n.cb { min-width: 0; flex: 1; display: flex; flex-direction: column; gap: 6px; }\n.cl { font-size: 10px; letter-spacing: 1.5px; color: var(--ayu-text-secondary); text-transform: uppercase; font-weight: 600; }\n.cv { font-family: var(--font-mono); font-size: 14px; font-weight: 600; color: var(--ayu-text-primary); word-break: break-word; line-height: 1.4; padding: 6px 10px; border-radius: 6px; background: rgba(255,255,255,0.03); border: 1px solid rgba(255,255,255,0.06); transition: all .3s; display: inline-block; width: fit-content; max-width: 100%; }\n.cv.risk { color: var(--danger); background: rgba(255,61,104,0.08); border-color: rgba(255,61,104,0.22); }\n.cv.warn { color: var(--amber); background: rgba(255,184,77,0.08); border-color: rgba(255,184,77,0.22); }\n.cv.safe { color: var(--safe); background: rgba(34,230,168,0.08); border-color: rgba(34,230,168,0.22); }\n.cv.mask { color: var(--safe); font-style: italic; background: rgba(34,230,168,0.10); border-color: rgba(34,230,168,0.25); }\n.cs { font-size: 11px; color: var(--ayu-text-tertiary); line-height: 1.45; transition: color .3s; }\n.card:hover .cs { color: var(--ayu-text-secondary); }\n\n\/* =========================================================================\n   MAP CARD  (Leaflet-powered, precise)\n   ========================================================================= *\/\n.mapc { margin-top: 8px; border: 1px solid rgba(79,110,247,0.18); border-radius: 14px; overflow: hidden; background: rgba(9,13,36,0.85); backdrop-filter: blur(12px); box-shadow: 0 4px 20px rgba(0,0,0,0.35), 0 0 0 1px rgba(79,110,247,0.06); position: relative; display: flex; flex-direction: column; width: 100%; }\n.mapc::before { content:''; position:absolute; top:0; left:0; right:0; height:1px; background: linear-gradient(90deg, transparent, rgba(79,110,247,0.3), transparent); z-index:1; }\n.maph { display: flex; align-items: center; justify-content: space-between; padding: 14px 20px; font-family: var(--font-mono); font-size: 10px; letter-spacing: 1.5px; color: var(--ayu-text-primary); font-weight: 600; text-transform: uppercase; border-bottom: 1px solid rgba(79,110,247,0.12); background: rgba(9,13,36,0.6); flex-shrink: 0; gap: 10px; flex-wrap: wrap; }\n.maph-l { display: flex; align-items: center; gap: 10px; }\n.maph-l .map-label-icon { width: 18px; height: 18px; color: var(--cyan); opacity: 0.8; }\n.maph-l .map-label-text { font-size: 11px; letter-spacing: 1px; color: var(--ayu-text-secondary); }\n.maph-l .map-label-text .hl { color: var(--cyan); font-weight: 700; }\n.maph-r { display: flex; align-items: center; gap: 8px; }\n.precise-btn { display: inline-flex; align-items: center; gap: 7px; padding: 8px 14px; border-radius: 9px; border: 1px solid rgba(34,230,168,0.40); background: linear-gradient(135deg, rgba(34,230,168,0.14), rgba(79,110,247,0.12)); color: #fff; font-family: var(--font-mono); font-weight: 600; font-size: 10px; letter-spacing: 0.5px; text-transform: uppercase; cursor: pointer; transition: .25s; white-space: nowrap; }\n.precise-btn:hover { transform: translateY(-1px); box-shadow: 0 4px 16px rgba(34,230,168,0.22); border-color: rgba(34,230,168,0.6); }\n.precise-btn:disabled { opacity: .6; cursor: default; transform: none; box-shadow: none; }\n.precise-btn svg { width: 14px; height: 14px; color: var(--safe); flex-shrink: 0; }\n.maph-z { display: flex; gap: 4px; }\n.maph-z button { width: 30px; height: 30px; border-radius: 8px; border: 1px solid rgba(79,110,247,0.2); background: rgba(9,13,36,0.6); color: var(--ayu-text-primary); font-size: 18px; cursor: pointer; display: flex; align-items: center; justify-content: center; transition: all .2s; font-family: var(--font-mono); }\n.maph-z button:hover { border-color: rgba(79,110,247,0.5); background: rgba(79,110,247,0.1); color: var(--cyan); }\n.mapw { position: relative; height: 420px; width: 100%; overflow: hidden; }\n#mapLeaf { position: absolute; inset: 0; width: 100%; height: 100%; background: #0b1130; }\n.leaflet-container { background: #0b1130 !important; font-family: var(--font-mono); }\n.leaflet-tile { filter: invert(1) hue-rotate(185deg) brightness(.82) contrast(.92) saturate(.6); }\n.leaflet-control-attribution { background: rgba(6,8,21,0.7) !important; color: var(--ayu-text-tertiary) !important; font-size: 9px !important; }\n.leaflet-control-attribution a { color: var(--cyan) !important; }\n.map-loc { position: absolute; bottom: 16px; left: 16px; z-index: 600; background: rgba(9,13,36,0.92); border: 1px solid rgba(79,110,247,0.2); border-radius: 12px; padding: 12px 18px; backdrop-filter: blur(12px); display: flex; align-items: center; gap: 12px; box-shadow: 0 4px 20px rgba(0,0,0,0.3); }\n.map-loc svg { width: 16px; height: 16px; color: var(--cyan); flex-shrink: 0; }\n.map-loc-t { font-family: var(--font-mono); font-size: 12px; color: var(--ayu-text-primary); font-weight: 600; }\n.map-loc-s { font-size: 10px; color: var(--ayu-text-secondary); margin-top: 2px; letter-spacing: 0.3px; }\n.map-acc { position: absolute; top: 16px; right: 16px; z-index: 600; font-family: var(--font-mono); font-size: 10px; letter-spacing: .5px; padding: 7px 13px; border-radius: 999px; border: 1px solid rgba(79,110,247,0.3); background: rgba(9,13,36,0.92); color: var(--ayu-text-secondary); backdrop-filter: blur(10px); }\n.map-acc b { color: var(--amber); }\n.map-acc.precise b { color: var(--safe); }\n.map-mask { position: absolute; inset: 0; z-index: 800; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 12px; opacity: 0; pointer-events: none; transition: all .5s; background: rgba(3,5,12,0.65); backdrop-filter: blur(6px); }\n.map-mask.show { opacity: 1; pointer-events: auto; }\n.map-mask svg { width: 36px; height: 36px; color: var(--safe); filter: drop-shadow(0 0 12px rgba(34,230,168,0.4)); animation: maskPulse 2s ease-in-out infinite; }\n.map-mask-t { font-family: var(--font-display); font-size: 16px; font-weight: 700; color: var(--safe); text-shadow: 0 0 20px rgba(34,230,168,0.4); letter-spacing: 0.5px; }\n.map-mask-s { font-family: var(--font-mono); font-size: 10px; color: rgba(34,230,168,0.7); letter-spacing: 1.5px; text-transform: uppercase; }\n@keyframes maskPulse { 0%,100%{transform:scale(1); filter: drop-shadow(0 0 12px rgba(34,230,168,0.4));} 50%{transform:scale(1.08); filter: drop-shadow(0 0 20px rgba(34,230,168,0.6));} }\n.map-section { margin-top: 32px; width: 100%; }\n\n.cta-block { margin-top: 40px; padding: 0; border-radius: 20px; border: none; background: transparent; position: relative; overflow: hidden; display: flex; flex-direction: column; align-items: stretch; gap: 0; width: 100%; }\n.cta-hero { position: relative; padding: 52px 56px; border-radius: 22px; background: radial-gradient(100% 160% at 50% -30%, rgba(79,110,247,0.14), transparent 60%), radial-gradient(70% 90% at 15% 110%, rgba(138,107,255,0.12), transparent 55%), radial-gradient(60% 90% at 95% 110%, rgba(34,230,168,0.06), transparent 55%), linear-gradient(180deg, rgba(9,13,36,0.94), rgba(6,8,21,0.90)); border: 1px solid rgba(79,110,247,0.16); backdrop-filter: blur(20px); -webkit-backdrop-filter: blur(20px); box-shadow: 0 8px 44px rgba(0,0,0,0.4), inset 0 1px 0 rgba(255,255,255,0.04); isolation: isolate; display: flex; flex-direction: row; align-items: center; justify-content: space-between; gap: 40px; overflow: hidden; }\n.cta-hero::before { content:''; position:absolute; inset:-30%; z-index:0; pointer-events:none; background: radial-gradient(40% 50% at 30% 20%, rgba(79,110,247,0.14), transparent 70%), radial-gradient(40% 50% at 70% 80%, rgba(138,107,255,0.12), transparent 70%); filter: blur(50px); animation: ctaSmoke 10s ease-in-out infinite alternate; opacity: .8; }\n@keyframes ctaSmoke { 0%{transform:translate(-1%,1%) scale(1);} 100%{transform:translate(1%,-1%) scale(1.06);} }\n.cta-hero>* { position: relative; z-index: 1; }\n.cta-copy { display: flex; flex-direction: column; align-items: flex-start; text-align: left; gap: 16px; max-width: 560px; }\n.cta-badge { display: inline-flex; align-items: center; gap: 7px; font-family: var(--font-mono); font-size: 10px; letter-spacing: 2px; text-transform: uppercase; font-weight: 700; color: var(--cyan); padding: 6px 14px; border-radius: 999px; background: rgba(79,110,247,0.07); border: 1px solid rgba(79,110,247,0.2); }\n.cta-badge-dot { width: 5px; height: 5px; border-radius: 50%; background: var(--cyan); box-shadow: 0 0 8px var(--cyan); animation: lp 1.5s ease-in-out infinite; }\n.cta-headline { font-family: var(--font-display); font-weight: 700; font-size: clamp(24px,3.2vw,34px); color: var(--ayu-text-primary); letter-spacing: -0.02em; line-height: 1.15; }\n.cta-headline em { font-style: normal; color: var(--cyan); }\n.cta-desc { font-family: var(--font-body); font-size: clamp(13px,1.2vw,15px); color: var(--ayu-text-secondary); line-height: 1.65; }\n.cta-trust { display: flex; align-items: center; gap: 16px; margin-top: 2px; flex-wrap: wrap; justify-content: flex-start; font-family: var(--font-mono); font-size: 10px; letter-spacing: 0.5px; color: var(--ayu-text-tertiary); text-transform: uppercase; }\n.cta-trust-sep { width: 3px; height: 3px; border-radius: 50%; background: rgba(79,110,247,0.2); }\n.cta-actions-col { display: flex; flex-direction: column; align-items: center; gap: 14px; flex-shrink: 0; }\n.cta-btn { display: inline-flex; align-items: center; justify-content: center; gap: 10px; padding: 16px 34px; border-radius: 12px; border: 1px solid rgba(79,110,247,0.4); background: linear-gradient(135deg, rgba(79,110,247,0.16), rgba(138,107,255,0.12)); font-family: var(--font-display); font-weight: 600; font-size: 15px; color: var(--ayu-text-primary); letter-spacing: 0.2px; cursor: pointer; transition: all .3s cubic-bezier(.2,.8,.2,1); position: relative; overflow: hidden; text-decoration: none; white-space: nowrap; }\n.cta-btn::before { content:''; position:absolute; inset:0; border-radius:12px; background: linear-gradient(135deg, rgba(255,255,255,0.06), transparent); pointer-events:none; }\n.cta-btn svg { width: 18px; height: 18px; color: var(--cyan); transition: transform .3s; }\n.cta-btn:hover { transform: translateY(-2px); box-shadow: 0 8px 30px rgba(79,110,247,0.22); border-color: rgba(79,110,247,0.6); background: linear-gradient(135deg, rgba(79,110,247,0.24), rgba(138,107,255,0.18)); }\n.cta-btn:hover svg { transform: translateX(2px); }\n.cta-btn:active { transform: translateY(0); }\n.cta-link { font-family: var(--font-body); font-size: 13px; font-weight: 500; color: var(--ayu-text-secondary); cursor: pointer; transition: color .3s; text-decoration: none; display: inline-flex; align-items: center; gap: 6px; }\n.cta-link:hover { color: var(--ayu-text-primary); }\n.cta-link svg { width: 14px; height: 14px; transition: transform .25s; }\n.cta-link:hover svg { transform: translateX(2px); }\n@media(max-width:860px) { .cta-hero { flex-direction: column; text-align: center; padding: 40px 28px; gap: 28px; } .cta-copy { align-items: center; text-align: center; max-width: 100%; } .cta-trust { justify-content: center; } .cta-actions-col { width: 100%; } .cta-btn { width: 100%; } }\n@media(max-width:600px) { .mapw { height: 300px; } .cta-hero { padding: 32px 24px; } .maph { justify-content: center; } .maph-l .map-label-text { font-size: 9px; } .map-loc { bottom: 10px; left: 10px; padding: 10px 14px; } }\n\n.phone-pill { position: fixed; right: 24px; top: 50%; transform: translateY(-50%); z-index: 50; display: flex; align-items: center; gap: 0; flex-direction: row-reverse; padding: 0; border: 0; border-radius: 999px; background: transparent; box-shadow: none; cursor: pointer; transition: all .35s; }\n.phone-pill .pp-icon { width: 52px; height: 52px; border-radius: 50%; flex-shrink: 0; padding: 0; background: linear-gradient(135deg, var(--cyan), var(--blue)); display: flex; align-items: center; justify-content: center; box-shadow: 0 4px 20px rgba(79,110,247,0.35); border: 1px solid rgba(255,255,255,0.25); transition: all .3s; }\n.phone-pill:hover .pp-icon { transform: scale(1.08); box-shadow: 0 6px 26px rgba(79,110,247,0.5); }\n.phone-pill .pp-icon svg { width: 22px; height: 22px; color: #04070f; }\n.phone-pill .pp-text { font-family: var(--font-mono); font-weight: 600; font-size: 14px; color: var(--ayu-text-primary); white-space: nowrap; direction: ltr; text-align: right; max-width: 0; opacity: 0; overflow: hidden; padding: 12px 0; border-radius: 999px; background: linear-gradient(135deg, rgba(9,13,36,0.92), rgba(6,8,21,0.85)); border: 1px solid var(--border-strong); backdrop-filter: blur(12px); -webkit-backdrop-filter: blur(12px); box-shadow: 0 4px 20px rgba(0,0,0,0.3), 0 0 20px rgba(79,110,247,0.1); transition: max-width .4s ease, opacity .3s ease, padding .4s ease, margin .4s ease; }\n.phone-pill.open .pp-text { max-width: 260px; opacity: 1; padding: 12px 18px; margin-right: 12px; }\n@media(max-width:480px) { .phone-pill { right: 14px; } .phone-pill .pp-icon { width: 46px; height: 46px; } }\n.pov { display: none; position: fixed; inset: 0; z-index: 100; background: rgba(3,5,12,0.88); backdrop-filter: blur(8px); flex-direction: column; align-items: center; justify-content: center; gap: 18px; }\n.pov.show { display: flex; }\n.povs { width: 76px; height: 76px; border-radius: 18px; background: linear-gradient(135deg, rgba(34,230,168,0.1), rgba(34,230,168,0.15)); border: 1px solid var(--safe); display: flex; align-items: center; justify-content: center; animation: psp 1.5s ease-in-out infinite; }\n@keyframes psp { 0%,100%{box-shadow:0 0 0 0 rgba(34,230,168,0.3);} 50%{box-shadow:0 0 0 18px rgba(34,230,168,0);} }\n.povs svg { width: 34px; height: 34px; color: var(--safe); }\n.povt { font-family: var(--font-display); font-size: 18px; font-weight: 700; color: var(--safe); }\n.povd { color: var(--ayu-text-secondary); font-size: 12px; text-align: center; max-width: 280px; line-height: 1.5; }\n@media(max-width:480px) { main { padding-top: 100px; padding-bottom: 36px; } .hl { font-size: 20px; } .map-loc { bottom: 8px; left: 8px; padding: 8px 10px; } }\n@media(prefers-reduced-motion:reduce) { .card { animation: none; opacity: 1; transform: none; } .cta-hero::before { animation: none; } .hero-block::after { animation: none; } }\n<\/style>\n<\/head>\n\n<body>\n<!-- \u2500\u2500 PAGE BACKGROUND \u2500\u2500 -->\n<div class=\"page-bg\"><\/div>\n<!-- \u2500\u2500 BACKGROUND LAYERS \u2500\u2500 -->\n<div class=\"bg-layers\">\n  <div class=\"ayu-bg-world\"><\/div>\n  <div class=\"ayu-bg-dots\"><\/div>\n  <div class=\"ayu-bg-glow\"><\/div>\n  <div class=\"ayu-bg-orb-1\"><\/div>\n  <div class=\"ayu-bg-orb-2\"><\/div>\n<\/div>\n\n<div class=\"ayu-content-overlay\">\n<main>\n<!-- START -->\n<div id=\"start-view\">\n  <div class=\"start-shield\">\n    <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" aria-hidden=\"true\">\n      <path d=\"M12 2 3 6v6c0 5.2 3.8 9.8 9 11 5.2-1.2 9-5.8 9-11V6l-9-4Z\" \/>\n      <path d=\"M12 8v4M12 16h.01\" stroke-width=\"2\" stroke-linecap=\"round\" \/>\n    <\/svg>\n  <\/div>\n  <div class=\"start-title\">Network <span>Security Scan<\/span><\/div>\n  <div class=\"start-sub\">Real-time diagnostic of your IP exposure, browser fingerprint, open ports, blacklists, and threat intelligence \u2014 entirely client-side, zero data stored.<\/div>\n  <button class=\"start-cta\" id=\"startBtn\" aria-label=\"Start network security scan\">\n    Start Security Scan\n    <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" aria-hidden=\"true\"><path d=\"M5 12h14M12 5l7 7-7 7\"\/><\/svg>\n  <\/button>\n  <div class=\"start-features\">\n    <div class=\"start-feat\"><span class=\"start-feat-dot\"><\/span>IP &amp; location<\/div>\n    <div class=\"start-feat\"><span class=\"start-feat-dot\"><\/span>Threat intel<\/div>\n    <div class=\"start-feat\"><span class=\"start-feat-dot\"><\/span>Browser fingerprint<\/div>\n    <div class=\"start-feat\"><span class=\"start-feat-dot\"><\/span>Speed test<\/div>\n    <div class=\"start-feat\"><span class=\"start-feat-dot\"><\/span>Risk score<\/div>\n  <\/div>\n\n  <div class=\"telemetry\" role=\"status\" aria-live=\"polite\">\n    <div class=\"telemetry-left\">\n      <span class=\"status-pill\"><span class=\"dot online\"><\/span><span class=\"lbl\">Engine<\/span> <span class=\"val\">Active<\/span><\/span>\n      <span class=\"status-pill\"><span class=\"dot online\"><\/span><span class=\"lbl\">Heuristics<\/span> <span class=\"val\">Live<\/span><\/span>\n      <span class=\"status-pill\"><span class=\"dot online\"><\/span><span class=\"lbl\">IP Geolocation<\/span> <span class=\"val\">Ready<\/span><\/span>\n      <span class=\"status-pill\"><span class=\"dot online\"><\/span><span class=\"lbl\">Threat Intel<\/span> <span class=\"val\">Online<\/span><\/span>\n    <\/div>\n    <div style=\"display:flex; align-items:center; gap:12px;\">\n      <div class=\"net-activity\" title=\"Live network activity\">\n        <span class=\"net-lbl\">Bus<\/span>\n        <svg width=\"64\" height=\"22\" viewBox=\"0 0 64 22\" aria-hidden=\"true\">\n          <polyline points=\"2,18 6,12 10,18 14,8 18,14 22,4 26,12 30,8 34,16 38,6 42,14 46,10 50,18 54,8 58,14 62,8\" stroke=\"rgba(79,110,247,0.4)\" stroke-width=\"1.5\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/>\n        <\/svg>\n      <\/div>\n      <span class=\"last-update\">UPDATED <b id=\"lastUpdate\">--:--:--<\/b><\/span>\n    <\/div>\n  <\/div>\n\n  <div class=\"hero-stats\" aria-live=\"polite\">\n    <div class=\"stat-card\">\n      <div class=\"s-ico\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><circle cx=\"12\" cy=\"12\" r=\"9\"\/><path d=\"M2.5 12h19M12 2.5c2.5 2.7 3.8 6 3.8 9.5s-1.3 6.8-3.8 9.5c-2.5-2.7-3.8-6-3.8-9.5S9.5 5.2 12 2.5Z\"\/><\/svg><\/div>\n      <div class=\"s-trend\">\u25b2 live<\/div>\n      <div class=\"s-val\" id=\"statScans\">\u2014<\/div>\n      <div class=\"s-label\">Scans today<\/div>\n    <\/div>\n    <div class=\"stat-card\">\n      <div class=\"s-ico\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z\"\/><\/svg><\/div>\n      <div class=\"s-trend\">\u25b2<\/div>\n      <div class=\"s-val\" id=\"statIssues\">\u2014<\/div>\n      <div class=\"s-label\">Issues found<\/div>\n    <\/div>\n    <div class=\"stat-card\">\n      <div class=\"s-ico\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><polyline points=\"23 4 23 10 17 10\"\/><polyline points=\"1 20 1 14 7 14\"\/><path d=\"M3.51 9a9 9 0 0 1 14.85-3.36L23 10M1 14l4.64 4.36A9 9 0 0 0 20.49 15\"\/><\/svg><\/div>\n      <div class=\"s-trend\">\u25b2<\/div>\n      <div class=\"s-val\" id=\"statSpeed\">\u2014<\/div>\n      <div class=\"s-label\">Avg. speed (Mbps)<\/div>\n    <\/div>\n    <div class=\"stat-card\">\n      <div class=\"s-ico\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z\"\/><polyline points=\"9 11 11 13 15 9\"\/><\/svg><\/div>\n      <div class=\"s-trend\">\u25b2<\/div>\n      <div class=\"s-val\" id=\"statRisk\">\u2014<\/div>\n      <div class=\"s-label\">Risk score (avg)<\/div>\n    <\/div>\n  <\/div>\n\n  <div class=\"panel panel-pad\" style=\"border-color: rgba(79,110,247,.15); background: linear-gradient(150deg, rgba(9,13,36,.5) 0%, rgba(6,8,21,.6) 100%);\">\n    <h3 style=\"font-family: var(--font-display); font-size: 17px; font-weight: 700; color: #fff; margin-bottom: 12px; display: flex; align-items: center; gap: 10px;\">\n      <span style=\"color: var(--cyan); display: inline-flex; width:18px; height:18px; flex-shrink:0;\">\n        <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z\"\/><polyline points=\"9 11 11 13 15 9\"\/><\/svg>\n      <\/span>\n      Real-time Network Security Scan \u2014 In-Browser, Zero-Data-Transmission\n    <\/h3>\n    <div class=\"desktop-only\">\n      <p style=\"font-size: 13.5px; color: var(--ayu-text-secondary); line-height: 1.7; margin-bottom: 14px;\">\n        The <b>AssistYU Network Security Scan<\/b> is a powerful, client-side diagnostic tool that reveals exactly what your connection exposes to the internet. It performs a comprehensive audit of your <b>public IP<\/b>, <b>ISP<\/b>, <b>geolocation<\/b>, <b>WebRTC leaks<\/b>, <b>open ports<\/b>, <b>known CVEs<\/b>, <b>blacklist status<\/b>, and <b>device fingerprint<\/b> \u2014 all within your browser, without ever sending a single byte to our servers.\n      <\/p>\n      <p style=\"font-size: 13.5px; color: var(--ayu-text-secondary); line-height: 1.7; margin-bottom: 14px;\">\n        The scan leverages multiple public APIs (ipwho.is, ipapi.co, geojs.io, reallyfreegeoip.org, Shodan InternetDB) to fetch threat intelligence, then cross-references your browser's <b>canvas fingerprint<\/b>, <b>audio fingerprint<\/b>, <b>font list<\/b>, <b>WebGL GPU<\/b>, <b>hardware concurrency<\/b>, and <b>device memory<\/b> to build a complete risk profile. Every check is executed client-side; your IP and data are never stored or logged by AssistYU.\n      <\/p>\n      <p style=\"font-size: 13.5px; color: var(--ayu-text-secondary); line-height: 1.7;\">\n        The result is a detailed, evidence-based security verdict with a <b>risk score<\/b> (0\u2013100) and a <b>grade<\/b> (A\u2013F), along with actionable insights on <b>VPN\/proxy detection<\/b>, <b>blacklist status<\/b>, <b>open ports<\/b>, and <b>vulnerabilities<\/b>. Whether you're a privacy-conscious individual, a developer testing your infrastructure, or an IT administrator auditing your network, this scan gives you a complete picture of your digital exposure \u2014 without compromising your privacy.\n      <\/p>\n    <\/div>\n    <p class=\"mobile-only\" style=\"font-size: 13px; color: var(--ayu-text-secondary); line-height: 1.6;\">\n      A comprehensive client-side network scan that checks IP, location, WebRTC leaks, open ports, blacklists, CVEs, and device fingerprint \u2014 100% local, zero data stored.\n    <\/p>\n    <div style=\"display: flex; gap: 14px; flex-wrap: wrap; font-family: var(--font-mono); font-size: 11px; border-top: 1px solid rgba(255,255,255,.05); padding-top: 14px; margin-top: 14px;\">\n      <span style=\"color: var(--safe); display: flex; align-items: center; gap: 6px;\"><span style=\"width:6px;height:6px;border-radius:50%;background:var(--safe);box-shadow:0 0 6px var(--safe);\"><\/span> Client-side only<\/span>\n      <span style=\"color: var(--cyan); display: flex; align-items: center; gap: 6px;\"><span style=\"width:6px;height:6px;border-radius:50%;background:var(--cyan);box-shadow:0 0 6px var(--cyan);\"><\/span> Zero-data transmission<\/span>\n      <span style=\"color: var(--violet); display: flex; align-items: center; gap: 6px;\"><span style=\"width:6px;height:6px;border-radius:50%;background:var(--violet);box-shadow:0 0 6px var(--violet);\"><\/span> Threat intel APIs<\/span>\n      <span style=\"color: var(--blue); display: flex; align-items: center; gap: 6px;\"><span style=\"width:6px;height:6px;border-radius:50%;background:var(--blue);box-shadow:0 0 6px var(--blue);\"><\/span> CVE &amp; port scanning<\/span>\n    <\/div>\n  <\/div>\n<\/div>\n\n<!-- SCAN -->\n<div id=\"scan-stage\" role=\"status\" aria-live=\"polite\">\n  <div class=\"eyebrow\">AssistYU Network Scan <span>\u00b7 real-time diagnostic<\/span><\/div>\n  <h1 class=\"hl\">Your connection is <span class=\"sw-t scanning\" id=\"sw\">being analyzed<\/span><\/h1>\n  <div class=\"scan-grid\">\n    <div class=\"radar-sec\" aria-hidden=\"true\">\n      <div class=\"radar-box\"><canvas id=\"radarCanvas\" width=\"640\" height=\"640\"><\/canvas><\/div>\n      <div class=\"rl\">Radar sweep <span class=\"live\">\u25cf live<\/span><\/div>\n    <\/div>\n    <div class=\"ensec\">\n      <div class=\"enb\" role=\"progressbar\" aria-label=\"Scan progress\" aria-valuemin=\"0\" aria-valuemax=\"100\" aria-valuenow=\"0\" id=\"enbwrap\">\n        <div class=\"enbf\" id=\"ebf\"><\/div>\n      <\/div>\n      <div class=\"enp\" id=\"enp\"><span class=\"pct\">0%<\/span><\/div>\n      <div class=\"en-status\" id=\"en-status\">Initializing scan\u2026<\/div>\n    <\/div>\n  <\/div>\n<\/div>\n\n<!-- VERDICT -->\n<div id=\"verdict-view\">\n  <div id=\"verdict-header\" class=\"verdict-header\">\n    <div class=\"vb dg\" id=\"vbadge\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" aria-hidden=\"true\"><path d=\"M12 2 3 6v6c0 5.2 3.8 9.8 9 11 5.2-1.2 9-5.8 9-11V6l-9-4Z\"\/><path d=\"M12 8v5M12 16h.01\"\/><\/svg><\/div>\n    <div class=\"vht-title\" id=\"vMainTitle\">AssistYU Network Scan<\/div>\n    <div class=\"vht-desc\" id=\"vMainDesc\">Your network is exposed.<\/div>\n    <div class=\"vht-subdesc\" id=\"vMainSubDesc\">Real-time diagnostic of your IP exposure, browser fingerprint, and threat intelligence<\/div>\n    <div class=\"protect-toggle-row\" id=\"tgw\">\n      <span class=\"toggle-label\" id=\"toggle-label\">Protected mode<\/span>\n      <label class=\"swi\"><input type=\"checkbox\" id=\"ptog\" aria-label=\"Toggle protected mode\"><span class=\"sws\"><\/span><\/label>\n    <\/div>\n  <\/div>\n\n  <div class=\"hero-blocks\" id=\"hero-container\">\n    <div class=\"hero-block hero-left exposed\" id=\"hero-left\">\n      <span class=\"threats-label danger\" id=\"threats-label\">THREATS DETECTED<\/span>\n      <div class=\"threats-count\"><span class=\"num\" id=\"threats-num\">0<\/span><\/div>\n      <div class=\"threats-detail\" id=\"vtitle\">issues found on your current connection<\/div>\n      <div class=\"threats-badges\">\n        <span class=\"badge crit\" id=\"vbr-crit\"><span class=\"dot\"><\/span><span id=\"crit-n\">0<\/span> critical<\/span>\n        <span class=\"badge warn\" id=\"vbr-warn\"><span class=\"dot\"><\/span><span id=\"warn-n\">0<\/span> warning<\/span>\n      <\/div>\n    <\/div>\n    <div class=\"hero-block hero-right exposed\" id=\"hero-right\">\n      <div class=\"gauge-wrap\">\n        <div class=\"gauge-ring\">\n          <svg viewBox=\"0 0 120 120\">\n            <circle class=\"g-bg\" cx=\"60\" cy=\"60\" r=\"50\"\/>\n            <circle class=\"g-fill\" id=\"rg-fill\" cx=\"60\" cy=\"60\" r=\"50\" stroke-dasharray=\"314.16\" stroke-dashoffset=\"314.16\"\/>\n          <\/svg>\n          <div class=\"g-inner\"><\/div>\n          <div class=\"g-num\">\n            <span class=\"g-num-val\" id=\"rg-num\">0<\/span>\n            <span class=\"g-num-of\">\/100<\/span>\n          <\/div>\n        <\/div>\n        <div class=\"gauge-info\">\n          <div class=\"gauge-grade\" id=\"rg-grade\">Grade \u2014<\/div>\n          <div class=\"gauge-tags\" id=\"rg-sub\"><\/div>\n        <\/div>\n      <\/div>\n    <\/div>\n  <\/div>\n\n  <div class=\"rsec\">\n    <div class=\"slab\">Network &amp; identity<\/div>\n    <div class=\"g3\" id=\"gnet\"><\/div>\n\n    <div class=\"map-section\">\n      <div class=\"mapc\">\n        <div class=\"maph\">\n          <div class=\"maph-l\">\n            <svg class=\"map-label-icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" aria-hidden=\"true\"><path d=\"M12 22s7-6.2 7-12a7 7 0 1 0-14 0c0 5.8 7 12 7 12Z\"\/><circle cx=\"12\" cy=\"10\" r=\"2.5\"\/><\/svg>\n            <span class=\"map-label-text\">Location: <span class=\"hl\" id=\"map-label-loc\">\u2014<\/span><\/span>\n          <\/div>\n          <div class=\"maph-r\">\n            <button type=\"button\" class=\"precise-btn\" id=\"preciseBtn\" title=\"Pinpoint your exact location (GPS \/ Wi-Fi)\">\n              <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" aria-hidden=\"true\"><circle cx=\"12\" cy=\"12\" r=\"3\"\/><path d=\"M12 2v3M12 19v3M2 12h3M19 12h3\"\/><\/svg>\n              Precise location\n            <\/button>\n            <div class=\"maph-z\">\n              <button type=\"button\" id=\"zoomOut\" aria-label=\"Zoom out map\">&#x2212;<\/button>\n              <button type=\"button\" id=\"zoomIn\" aria-label=\"Zoom in map\">&#x2b;<\/button>\n            <\/div>\n          <\/div>\n        <\/div>\n        <div class=\"mapw\" id=\"mapw\">\n          <div id=\"mapLeaf\"><\/div>\n          <div class=\"map-acc\" id=\"map-acc\">Accuracy: <b>\u2014<\/b><\/div>\n          <div class=\"map-loc\" id=\"map-loc\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" aria-hidden=\"true\"><circle cx=\"12\" cy=\"10\" r=\"3\"\/><path d=\"M12 2a8 8 0 0 0-8 8c0 5.4 8 12 8 12s8-6.6 8-12a8 8 0 0 0-8-8Z\"\/><\/svg><div><div class=\"map-loc-t\" id=\"map-loc-t\">\u2014<\/div><div class=\"map-loc-s\" id=\"map-loc-s\">Approximate coordinates<\/div><\/div><\/div>\n          <div class=\"map-mask\" id=\"map-mask\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" aria-hidden=\"true\"><path d=\"M12 2 3 6v6c0 5.2 3.8 9.8 9 11 5.2-1.2 9-5.8 9-11V6l-9-4Z\"\/><path d=\"M9 12l2 2 4-4\"\/><\/svg><div class=\"map-mask-t\">Location masked<\/div><div class=\"map-mask-s\">Protected by AssistYU tunnel<\/div><\/div>\n        <\/div>\n      <\/div>\n    <\/div>\n\n    <div class=\"slab\">Threat intelligence<\/div>\n    <div class=\"g3\" id=\"gth\"><\/div>\n\n    <div class=\"slab\">Device fingerprint<\/div>\n    <div class=\"g2\" id=\"gdev\"><\/div>\n\n    <div class=\"slab\">Security checks<\/div>\n    <div class=\"g2\" id=\"gsec\"><\/div>\n  <\/div>\n\n  <div class=\"cta-block\">\n    <div class=\"cta-hero\">\n      <div class=\"cta-copy\">\n        <div class=\"cta-badge\"><span class=\"cta-badge-dot\"><\/span>Protect your network<\/div>\n        <div class=\"cta-headline\">Your scan found <em>vulnerabilities<\/em>.<br>Fix them now.<\/div>\n        <div class=\"cta-desc\">Encrypt your traffic, mask your IP and block WebRTC leaks with one toggle. This scan ran entirely in your browser \u2014 nothing was sent to AssistYU servers.<\/div>\n        <div class=\"cta-trust\">\n          <span>100% client-side<\/span>\n          <span class=\"cta-trust-sep\"><\/span>\n          <span>Zero data stored<\/span>\n          <span class=\"cta-trust-sep\"><\/span>\n          <span>No account needed<\/span>\n        <\/div>\n      <\/div>\n      <div class=\"cta-actions-col\">\n        <a href=\"https:\/\/assistyu.com\/security-products\/\" target=\"_blank\" rel=\"noopener\" class=\"cta-btn\">\n          <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" aria-hidden=\"true\"><path d=\"M12 2 3 6v6c0 5.2 3.8 9.8 9 11 5.2-1.2 9-5.8 9-11V6l-9-4Z\"\/><path d=\"M9 12l2 2 4-4\"\/><\/svg>\n          Get AssistYU Protection\n        <\/a>\n        <a href=\"https:\/\/assistyu.com\/contact\/\" target=\"_blank\" rel=\"noopener\" class=\"cta-link\">\n          Talk to an expert\n          <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" aria-hidden=\"true\"><path d=\"M5 12h14M12 5l7 7-7 7\"\/><\/svg>\n        <\/a>\n      <\/div>\n    <\/div>\n  <\/div>\n<\/div>\n<\/main>\n\n<!-- PHONE PILL -->\n<div class=\"phone-pill\" id=\"phone-pill\">\n  <button type=\"button\" class=\"pp-icon\" id=\"pp-icon\" aria-label=\"Show phone number\" aria-expanded=\"false\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M22 16.92v3a2 2 0 0 1-2.18 2 19.79 19.79 0 0 1-8.63-3.07 19.5 19.5 0 0 1-6-6 19.79 19.79 0 0 1-3.07-8.67A2 2 0 0 1 4.11 2h3a2 2 0 0 1 2 1.72c.127.96.361 1.903.7 2.81a2 2 0 0 1-.45 2.11L8.09 9.91a16 16 0 0 0 6 6l1.27-1.27a2 2 0 0 1 2.11-.45c.907.339 1.85.573 2.81.7A2 2 0 0 1 22 16.92z\"\/><\/svg><\/button>\n  <a href=\"tel:+34951550227\" class=\"pp-text\" id=\"pp-text\">+34 9 515 502 27<\/a>\n<\/div>\n<div class=\"pov\" id=\"pov\">\n  <div class=\"povs\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" aria-hidden=\"true\"><path d=\"M12 2 3 6v6c0 5.2 3.8 9.8 9 11 5.2-1.2 9-5.8 9-11V6l-9-4Z\"\/><path d=\"M9 12l2 2 4-4\"\/><\/svg><\/div>\n  <div class=\"povt\">Protected mode active<\/div>\n  <div class=\"povd\">AssistYU is masking your IP, blocking WebRTC leaks and hiding your network fingerprint.<\/div>\n<\/div>\n<\/div>\n\n<!-- Leaflet library -->\n<script src=\"https:\/\/unpkg.com\/leaflet@1.9.4\/dist\/leaflet.js\"><\/script>\n<script>\ndocument.addEventListener('DOMContentLoaded', function() {\n  (function() {\n    \/* ============================= RADAR CANVAS ============================= *\/\n    var cv = document.getElementById('radarCanvas');\n    var ctx = cv.getContext('2d');\n    var W = cv.width, H = cv.height, cx = W \/ 2, cy = H \/ 2, R = W \/ 2 - 20;\n    var sweepAngle = 0, trailLen = 1.1;\n    var blipsData = [\n      { a: 0.35, r: 0.65, c: 'cyan' }, { a: 1.8, r: 0.45, c: 'amber' },\n      { a: 2.8, r: 0.80, c: 'cyan' }, { a: 3.8, r: 0.35, c: 'danger' },\n      { a: 0.9, r: 0.55, c: 'cyan' }, { a: 4.5, r: 0.70, c: 'amber' },\n      { a: 5.2, r: 0.50, c: 'cyan' }, { a: 2.0, r: 0.88, c: 'danger' }\n    ];\n    var blipAlpha = [0,0,0,0,0,0,0,0], blipTarget = [1,1,1,1,1,1,1,1];\n    var radarRunning = true;\n\n    function drawRadar(t) {\n      if (!radarRunning) return;\n      ctx.clearRect(0, 0, W, H);\n      var grd = ctx.createRadialGradient(cx, cy, 0, cx, cy, R * 1.1);\n      grd.addColorStop(0, 'rgba(79,110,247,0.04)'); grd.addColorStop(1, 'transparent');\n      ctx.fillStyle = grd; ctx.fillRect(0, 0, W, H);\n      ctx.strokeStyle = 'rgba(79,110,247,0.25)'; ctx.lineWidth = 1;\n      [1, 0.834, 0.667, 0.5].forEach(function(s) { ctx.beginPath(); ctx.arc(cx, cy, R * s, 0, Math.PI * 2); ctx.stroke(); });\n      ctx.strokeStyle = 'rgba(79,110,247,0.15)'; ctx.lineWidth = 1;\n      ctx.beginPath(); ctx.moveTo(cx - R, cy); ctx.lineTo(cx + R, cy); ctx.stroke();\n      ctx.beginPath(); ctx.moveTo(cx, cy - R); ctx.lineTo(cx, cy + R); ctx.stroke();\n      ctx.strokeStyle = 'rgba(79,110,247,0.06)';\n      var d = R * 0.707;\n      ctx.beginPath(); ctx.moveTo(cx - d, cy - d); ctx.lineTo(cx + d, cy + d); ctx.stroke();\n      ctx.beginPath(); ctx.moveTo(cx + d, cy - d); ctx.lineTo(cx - d, cy + d); ctx.stroke();\n      var segs = 60;\n      for (var i = 0; i < segs; i++) {\n        var frac = i \/ segs, ang = sweepAngle - frac * trailLen, alpha = (1 - frac) * 0.30;\n        ctx.beginPath(); ctx.moveTo(cx, cy); ctx.arc(cx, cy, R, ang - 0.025, ang + 0.025); ctx.closePath();\n        ctx.fillStyle = 'rgba(79,110,247,' + alpha + ')'; ctx.fill();\n      }\n      ctx.save(); ctx.translate(cx, cy); ctx.rotate(sweepAngle);\n      var ag = ctx.createLinearGradient(0, 0, R, 0);\n      ag.addColorStop(0, 'rgba(79,110,247,0.7)'); ag.addColorStop(0.7, 'rgba(79,110,247,0.15)'); ag.addColorStop(1, 'rgba(79,110,247,0)');\n      ctx.beginPath(); ctx.moveTo(0, 0); ctx.lineTo(R, 0); ctx.strokeStyle = ag; ctx.lineWidth = 3; ctx.stroke();\n      ctx.beginPath(); ctx.moveTo(0, 0); ctx.lineTo(R, 0); ctx.strokeStyle = 'rgba(79,110,247,0.9)'; ctx.lineWidth = 1.5; ctx.stroke();\n      ctx.restore();\n      var pulseTime = (t % 3000) \/ 3000;\n      for (var p = 0; p < 3; p++) {\n        var pt = (pulseTime + p \/ 3) % 1, pr = R * pt, pa = (1 - pt) * 0.25;\n        ctx.beginPath(); ctx.arc(cx, cy, pr, 0, Math.PI * 2); ctx.strokeStyle = 'rgba(79,110,247,' + pa + ')'; ctx.lineWidth = 1; ctx.stroke();\n      }\n      var bColors = { cyan: '79,110,247', amber: '255,184,77', danger: '255,61,104' };\n      for (var i = 0; i < blipsData.length; i++) {\n        var b = blipsData[i], ba = b.a + sweepAngle;\n        var bx = cx + Math.cos(ba) * R * b.r, by = cy + Math.sin(ba) * R * b.r;\n        var dist = ((sweepAngle - b.a) % (Math.PI * 2) + Math.PI * 2) % (Math.PI * 2);\n        blipTarget[i] = dist < 0.3 ? 1 : 0.15;\n        blipAlpha[i] += (blipTarget[i] - blipAlpha[i]) * 0.08;\n        var a = blipAlpha[i], rgb = bColors[b.c];\n        ctx.beginPath(); ctx.arc(bx, by, 8, 0, Math.PI * 2); ctx.fillStyle = 'rgba(' + rgb + ',' + (a * 0.3) + ')'; ctx.fill();\n        ctx.beginPath(); ctx.arc(bx, by, 3.5, 0, Math.PI * 2); ctx.fillStyle = 'rgba(' + rgb + ',' + a + ')'; ctx.fill();\n        ctx.beginPath(); ctx.arc(bx, by, 1.5, 0, Math.PI * 2); ctx.fillStyle = 'rgba(255,255,255,' + (a * 0.7) + ')'; ctx.fill();\n      }\n      ctx.beginPath(); ctx.arc(cx, cy, 5, 0, Math.PI * 2); ctx.fillStyle = 'rgba(79,110,247,1)'; ctx.fill();\n      ctx.beginPath(); ctx.arc(cx, cy, 12, 0, Math.PI * 2); ctx.fillStyle = 'rgba(79,110,247,0.15)'; ctx.fill();\n      ctx.beginPath(); ctx.arc(cx, cy, 22, 0, Math.PI * 2); ctx.fillStyle = 'rgba(79,110,247,0.06)'; ctx.fill();\n      sweepAngle += 0.025;\n      requestAnimationFrame(drawRadar);\n    }\n\n    \/* ============================= SCAN STEPS ============================= *\/\n    var STEPS = [\n      { l: 'Resolving public IP' }, { l: 'Fingerprinting ISP' },\n      { l: 'Triangulating location (multi-source)' }, { l: 'Checking encryption' },\n      { l: 'Testing VPN \/ DC' }, { l: 'WebRTC leak scan' },\n      { l: 'Analyzing connection type' }, { l: 'Measuring network speed' },\n      { l: 'Device fingerprint' }, { l: 'Canvas fingerprint' },\n      { l: 'Audio fingerprint' }, { l: 'Enumerating fonts' },\n      { l: 'Checking IP blacklists' }, { l: 'VPN \/ proxy detection' },\n      { l: 'Scanning open ports & CVEs' }, { l: 'Cross-checking timezone' },\n      { l: 'Evaluating data exposure' }, { l: 'Computing risk score' },\n      { l: 'Compiling threat report' }, { l: 'Generating security verdict' }\n    ];\n    var si = 0, sd = 700;\n    var bf, pbar, enpEl, statusEl, D;\n\n    document.getElementById('startBtn').addEventListener('click', function() {\n      document.getElementById('start-view').style.display = 'none';\n      document.getElementById('scan-stage').style.display = 'block';\n      si = 0;\n      bf = document.getElementById('ebf');\n      pbar = document.getElementById('enbwrap');\n      enpEl = document.getElementById('enp');\n      statusEl = document.getElementById('en-status');\n      radarRunning = true;\n      requestAnimationFrame(drawRadar);\n      var tm = setInterval(function() {\n        si++;\n        if (si < STEPS.length) {\n          var p = Math.round(((si + 1) \/ STEPS.length) * 100);\n          bf.style.width = p + '%'; pbar.setAttribute('aria-valuenow', p);\n          enpEl.innerHTML = '<span class=\"pct\">' + p + '%<\/span>';\n          statusEl.textContent = STEPS[si] ? STEPS[si].l + '\u2026' : 'Scanning\u2026';\n        } else {\n          clearInterval(tm);\n          bf.style.width = '100%'; pbar.setAttribute('aria-valuenow', 100);\n          enpEl.innerHTML = '<span class=\"pct\">100%<\/span>';\n          statusEl.className = 'en-status done';\n          statusEl.innerHTML = 'Generating report \u2014 almost there\u2026';\n          setTimeout(function() { startDataCollection(); }, 800);\n        }\n      }, sd);\n    });\n\n    \/* ================= GEO CONSENSUS HELPERS (multi-source, accurate) ================= *\/\n    function isValidIP(ip) { return typeof ip === 'string' && \/^\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}$\/.test(ip); }\n    function median(arr) {\n      var a = arr.slice().sort(function (x, y) { return x - y; });\n      var m = Math.floor(a.length \/ 2);\n      return a.length % 2 ? a[m] : (a[m - 1] + a[m]) \/ 2;\n    }\n    function distM(la1, lo1, la2, lo2) {\n      var Rk = 6371000, dLa = (la2 - la1) * Math.PI \/ 180, dLo = (lo2 - lo1) * Math.PI \/ 180;\n      var s = Math.sin(dLa \/ 2) * Math.sin(dLa \/ 2) + Math.cos(la1 * Math.PI \/ 180) * Math.cos(la2 * Math.PI \/ 180) * Math.sin(dLo \/ 2) * Math.sin(dLo \/ 2);\n      return 2 * Rk * Math.asin(Math.sqrt(s));\n    }\n    \/\/ Free, key-less, CORS-enabled geolocation sources. Normalized output.\n    var GEO_SOURCES = [\n      { name: 'ipwho.is', url: 'https:\/\/ipwho.is\/', map: function (j) {\n          if (j.success === false || !isValidIP(j.ip)) return null;\n          return { ip: j.ip, lat: j.latitude, lon: j.longitude, city: j.city, region: j.region,\n            country: j.country, cISO: j.country_code,\n            isp: j.connection && (j.connection.isp || j.connection.org), org: j.connection && j.connection.org,\n            asn: j.connection && j.connection.asn ? 'AS' + j.connection.asn : null,\n            tz: j.timezone && j.timezone.id, acc: null }; } },\n      { name: 'ipapi.co', url: 'https:\/\/ipapi.co\/json\/', map: function (j) {\n          if (j.error || !isValidIP(j.ip)) return null;\n          return { ip: j.ip, lat: j.latitude, lon: j.longitude, city: j.city, region: j.region,\n            country: j.country_name, cISO: j.country_code, isp: j.org, org: j.org, asn: j.asn, tz: j.timezone, acc: null }; } },\n      { name: 'geojs.io', url: 'https:\/\/get.geojs.io\/v1\/ip\/geo.json', map: function (j) {\n          if (!isValidIP(j.ip)) return null;\n          return { ip: j.ip, lat: +j.latitude, lon: +j.longitude, city: j.city, region: j.region,\n            country: j.country, cISO: j.country_code, isp: j.organization_name, org: j.organization,\n            asn: j.asn ? 'AS' + j.asn : null, tz: j.timezone, acc: j.accuracy ? +j.accuracy * 1000 : null }; } },\n      { name: 'reallyfreegeoip.org', url: 'https:\/\/reallyfreegeoip.org\/json\/', map: function (j) {\n          if (!isValidIP(j.ip)) return null;\n          return { ip: j.ip, lat: j.latitude, lon: j.longitude, city: j.city, region: j.region_name,\n            country: j.country_name, cISO: j.country_code, isp: null, org: null, asn: null, tz: j.time_zone, acc: null }; } }\n    ];\n    \/\/ Query all sources, reconcile by median consensus. Returns a promise.\n    function resolveGeoConsensus() {\n      var jobs = GEO_SOURCES.map(function (s) {\n        return fetch(s.url, { cache: 'no-store' })\n          .then(function (r) { return r.json(); })\n          .then(function (j) { var v = s.map(j); if (!v || !isFinite(v.lat) || !isFinite(v.lon)) throw 0; v.name = s.name; return v; })\n          .catch(function () { return { name: s.name, fail: true }; });\n      });\n      return Promise.all(jobs).then(function (results) {\n        var ok = results.filter(function (r) { return !r.fail; });\n        if (!ok.length) return { ok: false, sources: results };\n\n        \/\/ 1) rough median of ALL sources\n        var mLat = median(ok.map(function (r) { return r.lat; }));\n        var mLon = median(ok.map(function (r) { return r.lon; }));\n        \/\/ 2) OUTLIER REJECTION (median absolute deviation):\n        \/\/    keep only sources within max(2*MAD, 25km) of the median cluster,\n        \/\/    so one badly-mapped API can't balloon the accuracy circle.\n        var dists = ok.map(function (r) { return distM(mLat, mLon, r.lat, r.lon); });\n        var mad = median(dists);\n        var keepThresh = Math.max(mad * 2, 25000); \/\/ 25 km floor\n        var cluster = ok.filter(function (r) { return distM(mLat, mLon, r.lat, r.lon) <= keepThresh; });\n        if (cluster.length < 1) cluster = ok;\n\n        \/\/ 3) consensus = median of the tight cluster\n        var cLat = median(cluster.map(function (r) { return r.lat; }));\n        var cLon = median(cluster.map(function (r) { return r.lon; }));\n        \/\/ 4) accuracy = spread of the KEPT cluster (not the outliers), capped sensibly\n        var spread = cluster.length > 1\n          ? Math.max.apply(null, cluster.map(function (r) { return distM(cLat, cLon, r.lat, r.lon); }))\n          : 0;\n        var reported = Math.min.apply(null, cluster.map(function (r) { return r.acc || 999999; }));\n        if (!isFinite(reported)) reported = 0;\n        \/\/ pick the smallest credible radius: prefer a source's own reported accuracy when it's tight\n        var accM = spread > 0 ? Math.max(spread, 3000) : (reported && reported < 60000 ? reported : 5000);\n        accM = Math.min(accM, 60000); \/\/ never draw an absurd >60km circle for IP geo\n\n        \/\/ pick richest record from the cluster for text fields (prefer one with isp\/asn)\n        var best = cluster.filter(function (r) { return r.isp; })[0] || cluster[0];\n        return {\n          ok: true, ip: best.ip, lat: cLat, lon: cLon, accM: accM,\n          city: best.city, region: best.region, country: best.country, cISO: best.cISO,\n          isp: best.isp, org: best.org, asn: best.asn, tz: best.tz,\n          sources: cluster, all: results\n        };\n      });\n    }\n\n    \/* ============================= DATA COLLECTION ============================= *\/\n    function startDataCollection() {\n      D = {\n        ip: null, city: null, region: null, country: null, cISO: null, lat: null, lon: null, locAcc: null,\n        geoSources: [], isp: null, org: null, asn: null, tz: null,\n        proto: location.protocol === 'https:' ? 'https' : 'http',\n        dnt: navigator.doNotTrack === '1' || window.doNotTrack === '1' || navigator.doNotTrack === 'yes',\n        ua: navigator.userAgent, lang: navigator.language,\n        langs: navigator.languages ? Array.from(navigator.languages) : [],\n        sW: screen.width, sH: screen.height, cd: screen.colorDepth, pr: window.devicePixelRatio || 1,\n        wIPs: [], gpu: null, ipOK: false,\n        hc: navigator.hardwareConcurrency || null, dm: navigator.deviceMemory || null,\n        mt: navigator.maxTouchPoints || 0, ck: navigator.cookieEnabled,\n        pc: navigator.plugins ? navigator.plugins.length : 0,\n        effType: null, downlink: null, rtt: null, saveData: false, online: navigator.onLine,\n        webdriver: !!navigator.webdriver, brTz: null, tzMatch: null,\n        battLevel: null, battCharging: null, langMatch: null,\n        shodanPorts: [], shodanVulns: [], shodanTags: [], shodanCpes: [], shodanOK: false,\n        vpnDetected: false, proxyDetected: false, torDetected: false, hostingDetected: false,\n        blacklisted: false, blacklistCount: 0, blacklistSources: '',\n        canvasHash: null, audioHash: null, fontCount: 0, fontList: '',\n        speedMbps: null, speedMs: null, speedBytes: 0, riskScore: 0, riskGrade: 'F'\n      };\n\n      \/* canvas fingerprint *\/\n      try {\n        var cc = document.createElement('canvas'); cc.width = 280; cc.height = 60;\n        var cctx = cc.getContext('2d');\n        cctx.textBaseline = 'top'; cctx.font = '14px Arial';\n        cctx.fillStyle = '#f60'; cctx.fillRect(0, 0, 280, 60);\n        cctx.fillStyle = '#069'; cctx.fillText('AssistYU fingerprint', 2, 2);\n        cctx.fillStyle = 'rgba(102,204,0,0.7)'; cctx.fillText('AssistYU fingerprint', 4, 4);\n        D.canvasHash = cc.toDataURL().slice(-128);\n        var h = 0;\n        for (var ci = 0; ci < D.canvasHash.length; ci++) { h = ((h << 5) - h) + D.canvasHash.charCodeAt(ci); h |= 0; }\n        D.canvasHash = h.toString(36);\n      } catch (e) {}\n\n      \/* audio *\/\n      try {\n        var Ac = window.OfflineAudioContext || window.webkitOfflineAudioContext;\n        if (Ac) {\n          var ac = new Ac(1, 44100, 44100);\n          var osc = ac.createOscillator(); osc.type = 'triangle';\n          osc.frequency.setValueAtTime(10000, ac.currentTime);\n          var comp = ac.createDynamicsCompressor();\n          osc.connect(comp); comp.connect(ac.destination); osc.start(0);\n          ac.startRendering().then(function(buf) {\n            var d = buf.getChannelData(0).slice(4500, 5000), sum = 0;\n            for (var ai = 0; ai < d.length; ai++) sum += Math.abs(d[ai]);\n            D.audioHash = Math.round(sum * 1000).toString(36);\n          }).catch(function() {});\n        }\n      } catch (e) {}\n\n      \/* fonts *\/\n      try {\n        var testFonts = ['Arial','Verdana','Helvetica','Times New Roman','Courier New','Georgia','Palatino','Garamond','Comic Sans MS','Impact','Lucida Console','Tahoma','Trebuchet MS','Calibri','Cambria','Segoe UI','Roboto','Open Sans','Lato','Ubuntu','Fira Code','Consolas','Menlo','Monaco'];\n        var tc = document.createElement('span');\n        tc.style.cssText = 'position:absolute;left:-9999px;font-size:72px;font-weight:bold;letter-spacing:0;opacity:0;';\n        tc.textContent = 'mmmmmmmmmmlli';\n        document.body.appendChild(tc);\n        var baseW = tc.offsetWidth, found = [];\n        testFonts.forEach(function(f) { tc.style.fontFamily = '\"' + f + '\",monospace'; if (tc.offsetWidth !== baseW) found.push(f); });\n        document.body.removeChild(tc);\n        D.fontCount = found.length; D.fontList = found.join(', ');\n      } catch (e) {}\n\n      \/* IP geo \u2014 MULTI-SOURCE CONSENSUS (the accuracy fix) *\/\n      var ipF = resolveGeoConsensus().then(function (g) {\n        D.geoSources = g.all || g.sources || [];\n        if (g.ok) {\n          D.ip = g.ip; D.city = g.city; D.region = g.region; D.country = g.country; D.cISO = g.cISO;\n          D.lat = g.lat; D.lon = g.lon; D.locAcc = g.accM;\n          D.isp = g.isp; D.org = g.org; D.asn = g.asn; D.tz = g.tz;\n          D.ipOK = true;\n        } else { D.ipOK = false; }\n      }).catch(function () { D.ipOK = false; });\n\n      \/* WebRTC *\/\n      var wP = new Promise(function(res) {\n        try {\n          var pc = new RTCPeerConnection({ iceServers: [{ urls: 'stun:stun.l.google.com:19302' }] });\n          var f = new Set(); pc.createDataChannel('');\n          pc.onicecandidate = function(e) {\n            if (!e.candidate) { pc.close(); res(Array.from(f)); return; }\n            var ip = e.candidate.candidate.split(' ')[4];\n            if (ip && (ip.match(\/^(\\d{1,3}\\.){3}\\d{1,3}$\/) || ip.indexOf(':') > -1)) { if (!ip.startsWith('0.0.0.0')) f.add(ip); }\n          };\n          pc.createOffer().then(function(o) { pc.setLocalDescription(o); });\n          setTimeout(function() { res(Array.from(f)); try { pc.close(); } catch (e) {} }, 1400);\n        } catch (err) { res([]); }\n      });\n\n      \/* connection API *\/\n      try {\n        var conn = navigator.connection || navigator.mozConnection || navigator.webkitConnection;\n        if (conn) { D.effType = conn.effectiveType || null; D.downlink = conn.downlink != null ? conn.downlink : null; D.rtt = conn.rtt != null ? conn.rtt : null; D.saveData = !!conn.saveData; }\n      } catch (e) {}\n\n      \/* speed test *\/\n      var speedP = new Promise(function(res) {\n        try {\n          var chunks = [\n            { url: 'https:\/\/speed.cloudflare.com\/__down?bytes=5000000', size: 5000000 },\n            { url: 'https:\/\/speed.cloudflare.com\/__down?bytes=10000000', size: 10000000 },\n            { url: 'https:\/\/speed.cloudflare.com\/__down?bytes=10000000', size: 10000000 }\n          ];\n          var totalBytes = 0, t0 = 0, done = false;\n          function finish() {\n            if (done) return; done = true;\n            var elapsed = (performance.now() - t0) \/ 1000;\n            if (elapsed > 0.5 && totalBytes > 0) { D.speedMbps = ((totalBytes * 8) \/ elapsed \/ 1000000).toFixed(1); D.speedMs = Math.round(elapsed * 1000); D.speedBytes = totalBytes; }\n            res();\n          }\n          var timeout = setTimeout(finish, 12000);\n          t0 = performance.now();\n          var chain = Promise.resolve();\n          chunks.forEach(function(c) {\n            chain = chain.then(function() {\n              if (done) return;\n              return fetch(c.url, { cache: 'no-store' }).then(function(r) { return r.arrayBuffer(); }).then(function(buf) { if (!done) totalBytes += buf.byteLength; }).catch(function() {});\n            });\n          });\n          chain.then(function() { clearTimeout(timeout); finish(); });\n        } catch (e) { res(); }\n      });\n\n      \/* timezone *\/\n      try { D.brTz = Intl.DateTimeFormat().resolvedOptions().timeZone || null; } catch (e) {}\n\n      \/* battery *\/\n      var battP = new Promise(function(res) {\n        try {\n          if (navigator.getBattery) { navigator.getBattery().then(function(b) { D.battLevel = b.level != null ? Math.round(b.level * 100) : null; D.battCharging = !!b.charging; res(); }).catch(function() { res(); }); }\n          else { res(); }\n        } catch (e) { res(); }\n      });\n\n      \/* GPU *\/\n      try {\n        var glCanvas = document.createElement('canvas');\n        var gl = glCanvas.getContext('webgl') || glCanvas.getContext('experimental-webgl');\n        if (gl) { var db = gl.getExtension('WEBGL_debug_renderer_info'); if (db) D.gpu = gl.getParameter(db.UNMASKED_RENDERER_WEBGL); }\n      } catch (e) {}\n\n      var shodanP = ipF.then(function() {\n        if (!D.ip || !isValidIP(D.ip)) return;\n        return fetch('https:\/\/internetdb.shodan.io\/' + D.ip, { cache: 'no-store' }).then(function(r) { return r.json(); }).then(function(j) {\n          D.shodanPorts = j.ports || []; D.shodanVulns = j.vulns || []; D.shodanTags = j.tags || []; D.shodanCpes = j.cpes || []; D.shodanOK = true;\n        }).catch(function() {});\n      });\n\n      var blacklistP = ipF.then(function() {\n        if (!D.ip || !isValidIP(D.ip)) return;\n        return fetch('https:\/\/hackmyip.com\/api\/blacklist?ip=' + D.ip, { cache: 'no-store' }).then(function(r) { return r.json(); }).then(function(j) {\n          if (j && j.blacklisted !== undefined) { D.blacklisted = !!j.blacklisted; D.blacklistCount = j.listed_on || 0; D.blacklistSources = j.sources ? j.sources.join(', ') : ''; }\n        }).catch(function() {});\n      });\n\n      var ipprivP = ipF.then(function() {\n        if (!D.ip || !isValidIP(D.ip)) return;\n        return fetch('https:\/\/api.ippriv.com\/api\/security\/' + D.ip, { cache: 'no-store' }).then(function(r) { return r.json(); }).then(function(j) {\n          if (j) { D.vpnDetected = !!j.isVPN; D.proxyDetected = !!j.isProxy; D.torDetected = !!j.isTor; D.hostingDetected = !!j.isHosting; }\n        }).catch(function() {});\n      });\n\n      Promise.all([ipF, wP, battP, shodanP, blacklistP, ipprivP, speedP]).then(function(r) {\n        D.wIPs = r[1];\n        if (D.tz && D.brTz) {\n          var ipCity = D.tz.split('\/').pop().replace(\/_\/g, ' ');\n          var brCity = D.brTz.split('\/').pop().replace(\/_\/g, ' ');\n          D.tzMatch = ipCity.toLowerCase() === brCity.toLowerCase();\n        }\n        if (D.cISO && D.lang) { var langCountry = D.lang.split('-')[1]; if (langCountry) D.langMatch = langCountry.toUpperCase() === D.cISO.toUpperCase(); }\n        D.riskScore = calcRisk();\n        D.riskGrade = D.riskScore >= 80 ? 'F' : D.riskScore >= 60 ? 'D' : D.riskScore >= 40 ? 'C' : D.riskScore >= 20 ? 'B' : 'A';\n        setTimeout(reveal, Math.max(0, STEPS.length * sd + 500));\n      });\n    }\n\n    function calcRisk() {\n      var s = 0;\n      if (D.ipOK && D.ip) s += 8;\n      if (D.ipOK && (D.city || D.region || D.country)) s += 10;\n      if (D.isp) s += 3;\n      if (D.proto !== 'https') s += 12;\n      if (D.wIPs.length > 0) s += 15;\n      if (D.gpu) s += 4;\n      if (D.hc) s += 3;\n      if (D.dm) s += 2;\n      if (D.canvasHash) s += 5;\n      if (D.audioHash) s += 4;\n      if (D.fontCount > 15) s += 3;\n      if (D.webdriver) s += 10;\n      if (D.tzMatch === false) s += 6;\n      if (D.langMatch === false) s += 4;\n      if (D.vpnDetected) s += 8;\n      if (D.proxyDetected) s += 6;\n      if (D.torDetected) s += 10;\n      if (D.hostingDetected) s += 5;\n      if (D.blacklisted) s += Math.min(D.blacklistCount * 2, 12);\n      if (D.shodanVulns.length > 0) s += Math.min(D.shodanVulns.length * 3, 12);\n      if (D.shodanPorts.length > 5) s += 3;\n      if (!D.dnt) s += 2;\n      if (D.ck) s += 2;\n      if (D.pc > 0) s += 2;\n      if (!D.online) s += 10;\n      return Math.min(s, 100);\n    }\n\n    function ua2os(u) { if (\/Windows NT 10\/.test(u)) return 'Windows 10\/11'; if (\/Windows NT\/.test(u)) return 'Windows'; if (\/Mac OS X\/.test(u)) return 'macOS'; if (\/Android\/.test(u)) return 'Android ' + (u.match(\/Android\\s([\\d.]+)\/) || ['',''])[1]; if (\/iPhone|iPad|iPod\/.test(u)) return 'iOS'; if (\/Linux\/.test(u)) return 'Linux'; return 'Unknown'; }\n    function ua2br(u) { if (\/Edg\\\/\/.test(u)) return 'Edge ' + (u.match(\/Edg\\\/([\\d.]+)\/) || ['',''])[1]; if (\/OPR\\\/\/.test(u)) return 'Opera ' + (u.match(\/OPR\\\/([\\d.]+)\/) || ['',''])[1]; if (\/Chrome\\\/\/.test(u) && !\/Chromium\/.test(u)) return 'Chrome ' + (u.match(\/Chrome\\\/([\\d.]+)\/) || ['',''])[1]; if (\/Firefox\\\/\/.test(u)) return 'Firefox ' + (u.match(\/Firefox\\\/([\\d.]+)\/) || ['',''])[1]; if (\/Safari\\\/\/.test(u) && !\/Chrome\/.test(u)) return 'Safari'; return 'Unknown'; }\n\n    var HOST = ['amazon','aws','google cloud','microsoft','azure','digitalocean','ovh','hetzner','linode','vultr','cloudflare','datacamp','leaseweb','choopa','contabo','oracle cloud','scaleway','hosting','colo','datacenter','alibaba'];\n\n    function mkC(ico, lbl, vid, sid, cls) {\n      return '<div class=\"card c-' + (cls || 'cyan') + '\" data-p=\"' + vid + '\"><div class=\"ci\">' + ico + '<\/div><div class=\"cb\"><div class=\"cl\">' + lbl + '<\/div><div class=\"cv\" id=\"' + vid + '\">\u2014<\/div><div class=\"cs\" id=\"' + sid + '\"><\/div><\/div><\/div>';\n    }\n    var IC = {\n      g: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" aria-hidden=\"true\"><circle cx=\"12\" cy=\"12\" r=\"9\"\/><path d=\"M2.5 12h19M12 2.5c2.5 2.7 3.8 6 3.8 9.5s-1.3 6.8-3.8 9.5c-2.5-2.7-3.8-6-3.8-9.5S9.5 5.2 12 2.5Z\"\/><\/svg>',\n      s: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" aria-hidden=\"true\"><rect x=\"2\" y=\"7\" width=\"20\" height=\"4\" rx=\"1\"\/><rect x=\"2\" y=\"13\" width=\"20\" height=\"4\" rx=\"1\"\/><\/svg>',\n      m: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" aria-hidden=\"true\"><path d=\"M12 22s7-6.2 7-12a7 7 0 1 0-14 0c0 5.8 7 12 7 12Z\"\/><circle cx=\"12\" cy=\"10\" r=\"2.5\"\/><\/svg>',\n      w: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" aria-hidden=\"true\"><path d=\"M5 12.5a11 11 0 0 1 14 0M8 15.8a6.5 6.5 0 0 1 8 0M11.5 19a2 2 0 0 1 1 0\"\/><\/svg>',\n      l: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" aria-hidden=\"true\"><rect x=\"4\" y=\"10\" width=\"16\" height=\"10\" rx=\"2\"\/><path d=\"M8 10V7a4 4 0 0 1 8 0v3\"\/><\/svg>',\n      sh: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" aria-hidden=\"true\"><path d=\"M12 2 3 6v6c0 5.2 3.8 9.8 9 11 5.2-1.2 9-5.8 9-11V6l-9-4Z\"\/><\/svg>',\n      ch: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" aria-hidden=\"true\"><path d=\"M4 4h16v12H8l-4 4V4Z\"\/><\/svg>',\n      mo: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" aria-hidden=\"true\"><rect x=\"3\" y=\"4\" width=\"18\" height=\"12\" rx=\"2\"\/><path d=\"M8 20h12M12 16v4\"\/><\/svg>',\n      cp: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" aria-hidden=\"true\"><rect x=\"4\" y=\"4\" width=\"16\" height=\"16\" rx=\"2\"\/><rect x=\"9\" y=\"9\" width=\"6\" height=\"6\"\/><path d=\"M9 1v3M15 1v3M9 20v3M15 20v3M1 9h3M1 15h3M20 9h3M20 15h3\"\/><\/svg>',\n      z: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" aria-hidden=\"true\"><polygon points=\"13 2 3 14 12 14 11 22 21 10 12 10 13 2\"\/><\/svg>',\n      ck: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" aria-hidden=\"true\"><path d=\"M22 11.08V12a10 10 0 1 1-5.93-9.14\"\/><polyline points=\"22 4 12 14.01 9 11.01\"\/><\/svg>',\n      e: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" aria-hidden=\"true\"><path d=\"M1 12s4-8 11-8 11 8 11 8-4 8-11 8S1 12 1 12z\"\/><circle cx=\"12\" cy=\"12\" r=\"3\"\/><\/svg>',\n      f: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" aria-hidden=\"true\"><path d=\"M12 11c0 5-2 8-2 8\"\/><path d=\"M16 11c0 3-1 5-2 7\"\/><path d=\"M8 11c0 3 1 5 2 7\"\/><path d=\"M4 11a8 8 0 0 1 16 0\"\/><\/svg>',\n      r: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" aria-hidden=\"true\"><circle cx=\"12\" cy=\"12\" r=\"2\"\/><path d=\"M4.93 19.07a10 10 0 0 1 0-14.14M7.76 16.24a6 6 0 0 1 0-8.48M16.24 7.76a6 6 0 0 1 0 8.48M19.07 4.93a10 10 0 0 1 0 14.14\"\/><\/svg>',\n      tz: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" aria-hidden=\"true\"><circle cx=\"12\" cy=\"12\" r=\"10\"\/><path d=\"M12 6v6l4 2\"\/><\/svg>',\n      bt: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" aria-hidden=\"true\"><rect x=\"2\" y=\"7\" width=\"18\" height=\"12\" rx=\"2\"\/><path d=\"M22 11v4\"\/><\/svg>',\n      bot: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" aria-hidden=\"true\"><rect x=\"4\" y=\"8\" width=\"16\" height=\"12\" rx=\"2\"\/><path d=\"M9 8V6a3 3 0 0 1 6 0v2\"\/><circle cx=\"9\" cy=\"14\" r=\"1\"\/><circle cx=\"15\" cy=\"14\" r=\"1\"\/><\/svg>',\n      port: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" aria-hidden=\"true\"><rect x=\"2\" y=\"2\" width=\"20\" height=\"8\" rx=\"2\"\/><rect x=\"2\" y=\"14\" width=\"20\" height=\"8\" rx=\"2\"\/><path d=\"M6 6h.01M6 18h.01\"\/><\/svg>',\n      vuln: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" aria-hidden=\"true\"><path d=\"M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z\"\/><path d=\"M9 12l2 2 4-4\"\/><\/svg>',\n      blk: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" aria-hidden=\"true\"><circle cx=\"12\" cy=\"12\" r=\"10\"\/><path d=\"M4.93 4.93l14.14 14.14\"\/><\/svg>',\n      vpn: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" aria-hidden=\"true\"><path d=\"M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z\"\/><\/svg>',\n      lang: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" aria-hidden=\"true\"><path d=\"M5 8l6 6\"\/><path d=\"M4 14l6-6 2-3\"\/><path d=\"M2 5h12\"\/><path d=\"M7 2v3\"\/><path d=\"M22 22l-5-10-5 10\"\/><path d=\"M14 18h6\"\/><\/svg>',\n      cnv: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" aria-hidden=\"true\"><rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\"\/><circle cx=\"8.5\" cy=\"8.5\" r=\"1.5\"\/><path d=\"M21 15l-5-5L5 21\"\/><\/svg>',\n      aud: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" aria-hidden=\"true\"><path d=\"M9 18V5l12-2v13\"\/><circle cx=\"6\" cy=\"18\" r=\"3\"\/><circle cx=\"18\" cy=\"16\" r=\"3\"\/><\/svg>',\n      fn: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" aria-hidden=\"true\"><polyline points=\"4 7 4 4 20 4 20 7\"\/><line x1=\"9\" y1=\"20\" x2=\"15\" y2=\"20\"\/><line x1=\"12\" y1=\"4\" x2=\"12\" y2=\"20\"\/><\/svg>'\n    };\n\n    var ORIG = {};\n    function setOrig(id, cardCls, valCls) { ORIG[id] = { card: cardCls, val: valCls }; }\n\n    \/* ============================= MAP (Leaflet) ============================= *\/\n    var LMap = null, LMarker = null, LCircle = null, mapReady = false;\n    function initLeaflet(lat, lon, zoom) {\n      LMap = L.map('mapLeaf', { zoomControl: false, attributionControl: true }).setView([lat, lon], zoom);\n      L.tileLayer('https:\/\/{s}.tile.openstreetmap.org\/{z}\/{x}\/{y}.png', { maxZoom: 19, attribution: '&copy; OpenStreetMap' }).addTo(LMap);\n      mapReady = true;\n      \/\/ fix tile sizing once container is visible\n      setTimeout(function(){ if (LMap) LMap.invalidateSize(); }, 250);\n    }\n    function renderMapPoint(lat, lon, accM, label, precise) {\n      var zoom = precise ? 16 : (accM > 20000 ? 9 : accM > 8000 ? 10 : accM > 4000 ? 11 : 13);\n      if (!mapReady) initLeaflet(lat, lon, zoom); else LMap.setView([lat, lon], zoom);\n      if (LMarker) LMap.removeLayer(LMarker);\n      if (LCircle) LMap.removeLayer(LCircle);\n      var color = precise ? '#22e6a8' : '#4f6ef7';\n      LMarker = L.circleMarker([lat, lon], { radius: 7, color: color, fillColor: color, fillOpacity: 1, weight: 2 }).addTo(LMap);\n      LCircle = L.circle([lat, lon], { radius: accM, color: color, fillColor: color, fillOpacity: 0.12, weight: 1 }).addTo(LMap);\n      var latDir = lat >= 0 ? 'N' : 'S', lonDir = lon >= 0 ? 'E' : 'W';\n      document.getElementById('map-loc-t').textContent = label || 'Unknown location';\n      document.getElementById('map-label-loc').textContent = label || 'Unknown location';\n      document.getElementById('map-loc-s').textContent =\n        Math.abs(lat).toFixed(precise ? 6 : 4) + '\u00b0' + latDir + ', ' + Math.abs(lon).toFixed(precise ? 6 : 4) + '\u00b0' + lonDir +\n        (precise ? ' \u00b7 GPS\/device precise' : ' \u00b7 city-level estimate');\n      var accTxt = accM >= 1000 ? (accM \/ 1000).toFixed(accM < 10000 ? 1 : 0) + ' km' : Math.round(accM) + ' m';\n      var badge = document.getElementById('map-acc');\n      badge.innerHTML = 'Accuracy: <b>\u00b1' + accTxt + '<\/b>';\n      badge.className = 'map-acc' + (precise ? ' precise' : '');\n      setTimeout(function(){ if (LMap) LMap.invalidateSize(); }, 200);\n    }\n\n    \/\/ Precise location \u2014 GPS\/Wi-Fi (the ONLY true-accuracy source). Reusable.\n    function requestPrecise(auto) {\n      var btn = document.getElementById('preciseBtn');\n      if (!navigator.geolocation) { if (!auto) alert('Geolocation is not supported by this browser.'); return; }\n      if (btn) {\n        btn.disabled = true;\n        btn.innerHTML = '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><circle cx=\"12\" cy=\"12\" r=\"3\"\/><path d=\"M12 2v3M12 19v3M2 12h3M19 12h3\"\/><\/svg> Locating\u2026';\n      }\n      navigator.geolocation.getCurrentPosition(\n        function (pos) {\n          var c = pos.coords;\n          fetch('https:\/\/nominatim.openstreetmap.org\/reverse?format=jsonv2&lat=' + c.latitude + '&lon=' + c.longitude + '&zoom=18')\n            .then(function (r) { return r.json(); })\n            .then(function (j) {\n              var a = j.address || {};\n              var lbl = [a.road || a.pedestrian || a.suburb || a.neighbourhood, a.city || a.town || a.village || a.county, a.country].filter(Boolean).join(', ') || 'Your location';\n              renderMapPoint(c.latitude, c.longitude, c.accuracy || 30, lbl, true);\n            })\n            .catch(function () { renderMapPoint(c.latitude, c.longitude, c.accuracy || 30, 'Your precise location', true); })\n            .finally(function () { if (btn) btn.innerHTML = '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><circle cx=\"12\" cy=\"12\" r=\"3\"\/><path d=\"M12 2v3M12 19v3M2 12h3M19 12h3\"\/><\/svg> Precise on'; });\n        },\n        function (err) {\n          if (btn) {\n            btn.disabled = false;\n            btn.innerHTML = '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><circle cx=\"12\" cy=\"12\" r=\"3\"\/><path d=\"M12 2v3M12 19v3M2 12h3M19 12h3\"\/><\/svg> Precise location';\n          }\n          if (!auto) alert('Precise location was denied or failed:\\n' + err.message + '\\n\\nKeeping IP-based estimate.');\n        },\n        { enableHighAccuracy: true, timeout: 15000, maximumAge: 0 }\n      );\n    }\n    document.getElementById('preciseBtn').addEventListener('click', function () { requestPrecise(false); });\n    \/\/ zoom buttons -> Leaflet\n    document.getElementById('zoomIn').addEventListener('click', function(){ if (LMap) LMap.zoomIn(); });\n    document.getElementById('zoomOut').addEventListener('click', function(){ if (LMap) LMap.zoomOut(); });\n\n    \/* ============================= REVEAL ============================= *\/\n    function reveal() {\n      radarRunning = false;\n      document.getElementById('scan-stage').style.display = 'none';\n      var org = ((D.isp || '') + ' ' + (D.org || '')).toLowerCase();\n      var hosted = HOST.some(function(k) { return org.indexOf(k) > -1; });\n      var leak = D.wIPs.length > 0;\n      var enc = D.proto === 'https';\n      var track = !D.dnt;\n      var isVpn = D.vpnDetected || D.proxyDetected || D.torDetected;\n\n      \/* gauge *\/\n      var rgFill = document.getElementById('rg-fill');\n      var rgNum = document.getElementById('rg-num');\n      var rgGrade = document.getElementById('rg-grade');\n      var rgSub = document.getElementById('rg-sub');\n      var circumference = 314.16;\n      var offset = circumference - (D.riskScore \/ 100) * circumference;\n      var gColor = D.riskScore >= 60 ? 'var(--danger)' : D.riskScore >= 30 ? 'var(--amber)' : 'var(--safe)';\n      setTimeout(function() { rgFill.style.strokeDashoffset = offset; rgFill.style.stroke = gColor; }, 100);\n      rgNum.textContent = D.riskScore;\n      var gradeText = D.riskGrade === 'F' ? 'Critical exposure' : D.riskGrade === 'D' ? 'High exposure' : D.riskGrade === 'C' ? 'Moderate exposure' : D.riskGrade === 'B' ? 'Low exposure' : 'Minimal exposure';\n      rgGrade.innerHTML = 'Grade ' + D.riskGrade + ' <span class=\"sub\">' + gradeText + '<\/span>';\n      rgGrade.style.color = gColor;\n\n      var rgParts = [];\n      if (leak) rgParts.push('WebRTC leak');\n      if (D.vpnDetected) rgParts.push('VPN detected');\n      if (D.torDetected) rgParts.push('Tor exit');\n      if (D.blacklisted) rgParts.push('On ' + D.blacklistCount + ' blacklists');\n      if (D.shodanVulns.length) rgParts.push(D.shodanVulns.length + ' CVEs');\n      if (D.webdriver) rgParts.push('Automation');\n      if (!enc) rgParts.push('Unencrypted');\n      rgSub.innerHTML = rgParts.length ? rgParts.map(function(t) {\n        var cls = 'tag';\n        if (t.indexOf('leak') > -1 || t.indexOf('Tor') > -1 || t.indexOf('CVEs') > -1 || t.indexOf('Unencrypted') > -1) cls += ' danger';\n        else if (t.indexOf('On ') > -1 || t.indexOf('Automation') > -1) cls += ' warn';\n        else cls += ' safe';\n        return '<span class=\"' + cls + '\">' + t + '<\/span>';\n      }).join('') : '<span class=\"tag safe\">No critical signals<\/span>';\n\n      updateHeroBlocks();\n\n      \/* cards *\/\n      var ipCls = D.ipOK && D.ip ? 'danger' : 'cyan';\n      var ispCls = D.ipOK && D.isp ? 'warn' : 'cyan';\n      var locCls = D.ipOK && (D.city || D.region || D.country) ? 'danger' : 'cyan';\n\n      document.getElementById('gnet').innerHTML = [\n        mkC(IC.g, 'Public IP address', 'v-ip', 'v-ip-s', ipCls),\n        mkC(IC.s, 'Internet provider (ISP)', 'v-isp', 'v-isp-s', ispCls),\n        mkC(IC.m, 'Approximate location', 'v-loc', 'v-loc-s', locCls)\n      ].join('');\n      setOrig('v-ip', ipCls, ipCls === 'danger' ? 'risk' : '');\n      setOrig('v-isp', ispCls, ispCls === 'warn' ? 'warn' : '');\n      setOrig('v-loc', locCls, locCls === 'danger' ? 'risk' : '');\n\n      var vpnCls = isVpn ? 'danger' : D.hostingDetected ? 'warn' : 'safe';\n      var blkCls = D.blacklisted ? 'danger' : 'safe';\n      var portCls = D.shodanPorts.length > 0 ? 'warn' : 'safe';\n      var vulnCls = D.shodanVulns.length > 0 ? 'danger' : 'safe';\n\n      document.getElementById('gth').innerHTML = [\n        mkC(IC.vpn, 'VPN \/ proxy \/ Tor', 'v-vpn', 'v-vpn-s', vpnCls),\n        mkC(IC.blk, 'IP blacklists', 'v-blk', 'v-blk-s', blkCls),\n        mkC(IC.port, 'Open ports', 'v-ports', 'v-ports-s', portCls),\n        mkC(IC.vuln, 'Known CVEs', 'v-vulns', 'v-vulns-s', vulnCls)\n      ].join('');\n      setOrig('v-vpn', vpnCls, isVpn ? 'risk' : 'safe');\n      setOrig('v-blk', blkCls, D.blacklisted ? 'risk' : 'safe');\n      setOrig('v-ports', portCls, D.shodanPorts.length > 0 ? 'warn' : 'safe');\n      setOrig('v-vulns', vulnCls, D.shodanVulns.length > 0 ? 'risk' : 'safe');\n\n      var brCls = 'warn', cpuCls = D.hc ? 'warn' : 'safe', memCls = D.dm ? 'warn' : 'safe';\n      var scrCls = 'warn', tchCls = 'cyan', battCls = 'cyan', tzCls = 'cyan';\n      var gpuCls = D.gpu ? 'warn' : 'cyan';\n      var connValCls = 'cyan';\n      if (D.speedMbps != null) { var sp = parseFloat(D.speedMbps); connValCls = sp >= 50 ? 'safe' : sp >= 10 ? 'cyan' : sp >= 2 ? 'warn' : 'danger'; }\n      else if (D.saveData) { connValCls = 'safe'; } else if (D.effType === 'slow-2g' || D.effType === '2g') { connValCls = 'warn'; }\n      var cnvCls = D.canvasHash ? 'warn' : 'cyan', audCls = D.audioHash ? 'warn' : 'cyan', fnCls = D.fontCount > 15 ? 'warn' : 'cyan';\n\n      document.getElementById('gdev').innerHTML = [\n        mkC(IC.mo, 'Browser & OS', 'v-br', 'v-br-s', brCls),\n        mkC(IC.cp, 'CPU cores', 'v-cpu', 'v-cpu-s', cpuCls),\n        mkC(IC.f, 'Device memory', 'v-mem', 'v-mem-s', memCls),\n        mkC(IC.z, 'Graphics processor', 'v-gpu', 'v-gpu-s', gpuCls),\n        mkC(IC.mo, 'Screen resolution', 'v-scr', 'v-scr-s', scrCls),\n        mkC(IC.r, 'Touch support', 'v-tch', 'v-tch-s', tchCls),\n        mkC(IC.bt, 'Battery level', 'v-bat', 'v-bat-s', battCls),\n        mkC(IC.tz, 'Browser timezone', 'v-tz', 'v-tz-s', tzCls),\n        mkC(IC.cnv, 'Canvas fingerprint', 'v-cnv', 'v-cnv-s', cnvCls),\n        mkC(IC.aud, 'Audio fingerprint', 'v-aud', 'v-aud-s', audCls),\n        mkC(IC.fn, 'Font enumeration', 'v-fn', 'v-fn-s', fnCls)\n      ].join('');\n      setOrig('v-br', brCls, 'warn');\n      setOrig('v-cpu', cpuCls, cpuCls === 'warn' ? 'warn' : 'safe');\n      setOrig('v-mem', memCls, memCls === 'warn' ? 'warn' : 'safe');\n      setOrig('v-gpu', gpuCls, gpuCls === 'warn' ? 'warn' : '');\n      setOrig('v-scr', scrCls, 'warn');\n      setOrig('v-tch', tchCls, '');\n      setOrig('v-bat', battCls, '');\n      setOrig('v-tz', tzCls, '');\n      setOrig('v-cnv', cnvCls, 'warn');\n      setOrig('v-aud', audCls, 'warn');\n      setOrig('v-fn', fnCls, '');\n\n      var encCls = enc ? 'safe' : 'danger';\n      var netCls = hosted ? 'warn' : 'danger';\n      var webCls = leak ? 'danger' : 'safe';\n      var dntCls = track ? 'warn' : 'safe';\n      var ckCls = D.ck ? 'warn' : 'safe';\n      var plgCls = D.pc > 0 ? 'warn' : 'safe';\n      var wdCls = D.webdriver ? 'danger' : 'safe';\n      var tzmCls = D.tzMatch === false ? 'warn' : D.tzMatch === true ? 'safe' : 'cyan';\n      var langCls = D.langMatch === false ? 'warn' : D.langMatch === true ? 'safe' : 'cyan';\n\n      document.getElementById('gsec').innerHTML = [\n        mkC(IC.l, 'Traffic encryption', 'v-enc', 'v-enc-s', encCls),\n        mkC(IC.sh, 'Network type', 'v-nty', 'v-nty-s', netCls),\n        mkC(IC.ch, 'WebRTC leak test', 'v-wrtc', 'v-wrtc-s', webCls),\n        mkC(IC.w, 'Connection quality', 'v-conn', 'v-conn-s', connValCls),\n        mkC(IC.e, 'Do not track \/ tracking', 'v-dnt', 'v-dnt-s', dntCls),\n        mkC(IC.ck, 'Cookies enabled', 'v-ck', 'v-ck-s', ckCls),\n        mkC(IC.f, 'Plugins installed', 'v-plg', 'v-plg-s', plgCls),\n        mkC(IC.bot, 'Automation detected', 'v-wd', 'v-wd-s', wdCls),\n        mkC(IC.tz, 'Timezone cross-check', 'v-tzm', 'v-tzm-s', tzmCls),\n        mkC(IC.lang, 'Language vs location', 'v-lang', 'v-lang-s', langCls)\n      ].join('');\n      setOrig('v-enc', encCls, enc ? 'safe' : 'risk');\n      setOrig('v-nty', netCls, hosted ? 'warn' : 'risk');\n      setOrig('v-wrtc', webCls, leak ? 'risk' : 'safe');\n      setOrig('v-conn', connValCls, connValCls === 'safe' ? 'safe' : '');\n      setOrig('v-dnt', dntCls, track ? 'warn' : 'safe');\n      setOrig('v-ck', ckCls, D.ck ? 'warn' : 'safe');\n      setOrig('v-plg', plgCls, D.pc > 0 ? 'warn' : 'safe');\n      setOrig('v-wd', wdCls, D.webdriver ? 'risk' : 'safe');\n      setOrig('v-tzm', tzmCls, D.tzMatch === false ? 'warn' : D.tzMatch === true ? 'safe' : '');\n      setOrig('v-lang', langCls, D.langMatch === false ? 'warn' : D.langMatch === true ? 'safe' : '');\n\n      \/* populate card values *\/\n      var ipEl = document.getElementById('v-ip');\n      ipEl.textContent = D.ip || 'Unavailable';\n      if (ORIG['v-ip'].val) ipEl.classList.add(ORIG['v-ip'].val);\n      document.getElementById('v-ip-s').textContent = D.ipOK ? 'Visible to every site you visit' : 'Could not resolve';\n\n      var ispEl = document.getElementById('v-isp');\n      ispEl.textContent = D.isp || 'Unavailable';\n      if (ORIG['v-isp'].val) ispEl.classList.add(ORIG['v-isp'].val);\n      var ispSub = D.asn || '';\n      if (D.org && D.org !== D.isp) {\n        var orgClean = D.org.replace(\/2g\\\/3g\\\/4g\\s*\/gi, '').replace(\/Mobile Costumers\/gi, '').replace(\/Mobile Customers\/gi, '').replace(\/Customers\/gi, '').trim();\n        if (orgClean) ispSub += (ispSub ? ' \u00b7 ' : '') + orgClean;\n      }\n      document.getElementById('v-isp-s').textContent = ispSub;\n\n      var lp = [D.city, D.region, D.country].filter(Boolean);\n      var locEl = document.getElementById('v-loc');\n      locEl.textContent = lp.length ? lp.join(', ') : 'Unavailable';\n      if (ORIG['v-loc'].val) locEl.classList.add(ORIG['v-loc'].val);\n      var okCount = (D.geoSources || []).filter(function(s){ return !s.fail; }).length;\n      document.getElementById('v-loc-s').textContent =\n        (D.tz ? 'Timezone: ' + D.tz : '') +\n        (okCount ? (D.tz ? ' \u00b7 ' : '') + 'Consensus of ' + okCount + ' sources' : '');\n\n      var vpnEl = document.getElementById('v-vpn');\n      if (isVpn) {\n        var vpnParts = [];\n        if (D.vpnDetected) vpnParts.push('VPN');\n        if (D.proxyDetected) vpnParts.push('Proxy');\n        if (D.torDetected) vpnParts.push('Tor');\n        vpnEl.textContent = 'Detected: ' + vpnParts.join(', '); vpnEl.className = 'cv risk';\n      } else if (D.hostingDetected) { vpnEl.textContent = 'Datacenter \/ hosting'; vpnEl.className = 'cv warn'; }\n      else { vpnEl.textContent = 'Not detected'; vpnEl.className = 'cv safe'; }\n      document.getElementById('v-vpn-s').textContent = isVpn ? 'Your IP is associated with anonymizer infrastructure' : 'No VPN, proxy or Tor exit detected on this IP';\n\n      var blkEl = document.getElementById('v-blk');\n      blkEl.textContent = D.blacklisted ? 'Listed on ' + D.blacklistCount + ' blocklist' + (D.blacklistCount !== 1 ? 's' : '') : 'Clean \u2014 not listed';\n      blkEl.className = 'cv ' + (D.blacklisted ? 'risk' : 'safe');\n      document.getElementById('v-blk-s').textContent = D.blacklisted ? 'Found on: ' + D.blacklistSources : 'Not found on major spam\/abuse DNS blocklists';\n\n      var portsEl = document.getElementById('v-ports');\n      portsEl.textContent = D.shodanPorts.length > 0 ? D.shodanPorts.length + ' open port' + (D.shodanPorts.length !== 1 ? 's' : '') : 'No open ports detected';\n      portsEl.className = 'cv ' + (D.shodanPorts.length > 0 ? 'warn' : 'safe');\n      document.getElementById('v-ports-s').textContent = D.shodanPorts.length > 0 ? 'Ports: ' + D.shodanPorts.slice(0, 12).join(', ') + (D.shodanPorts.length > 12 ? ' +' + (D.shodanPorts.length - 12) + ' more' : '') : 'Shodan InternetDB shows no open ports';\n\n      var vulnEl = document.getElementById('v-vulns');\n      vulnEl.textContent = D.shodanVulns.length > 0 ? D.shodanVulns.length + ' vulnerabilit' + (D.shodanVulns.length !== 1 ? 'ies' : 'y') : 'No known CVEs';\n      vulnEl.className = 'cv ' + (D.shodanVulns.length > 0 ? 'risk' : 'safe');\n      document.getElementById('v-vulns-s').textContent = D.shodanVulns.length > 0 ? 'CVEs: ' + D.shodanVulns.slice(0, 6).join(', ') + (D.shodanVulns.length > 6 ? ' +' + (D.shodanVulns.length - 6) + ' more' : '') : 'No known vulnerabilities found on Shodan';\n\n      var brEl = document.getElementById('v-br');\n      brEl.textContent = ua2br(D.ua); brEl.classList.add('warn');\n      document.getElementById('v-br-s').textContent = ua2os(D.ua) + ' \u00b7 ' + D.lang + (D.langs.length > 1 ? ' \u00b7 ' + D.langs.join(', ') : '');\n\n      var cpuEl = document.getElementById('v-cpu');\n      cpuEl.textContent = D.hc ? D.hc + ' cores' : 'Unavailable';\n      if (ORIG['v-cpu'].val) cpuEl.classList.add(ORIG['v-cpu'].val);\n      document.getElementById('v-cpu-s').textContent = D.hc ? 'Exposed via navigator.hardwareConcurrency \u2014 adds to your fingerprint' : 'Not exposed \u2014 this browser hides it';\n\n      var memEl = document.getElementById('v-mem');\n      memEl.textContent = D.dm ? D.dm + ' GB' : 'Unavailable';\n      if (ORIG['v-mem'].val) memEl.classList.add(ORIG['v-mem'].val);\n      document.getElementById('v-mem-s').textContent = D.dm ? 'Exposed via navigator.deviceMemory \u2014 adds to your fingerprint' : 'Not supported \u2014 Firefox\/Safari hide this';\n\n      var scrEl = document.getElementById('v-scr');\n      scrEl.textContent = D.sW + '\u00d7' + D.sH; scrEl.classList.add('warn');\n      document.getElementById('v-scr-s').textContent = D.pr + 'x pixel ratio \u00b7 ' + D.cd + '-bit color depth \u2014 a fingerprinting signal';\n\n      var gpuEl = document.getElementById('v-gpu');\n      gpuEl.textContent = D.gpu || 'Unavailable';\n      if (ORIG['v-gpu'].val) gpuEl.classList.add(ORIG['v-gpu'].val);\n      document.getElementById('v-gpu-s').textContent = D.gpu ? D.gpu + ' \u2014 WebGL renderer exposed, strong fingerprinting signal' : 'GPU info hidden by browser';\n\n      document.getElementById('v-tch').textContent = D.mt + ' touch point' + (D.mt !== 1 ? 's' : '');\n      document.getElementById('v-tch-s').textContent = D.mt > 0 ? 'Touch-enabled device' : 'No touch input detected';\n\n      var batEl = document.getElementById('v-bat');\n      batEl.textContent = D.battLevel != null ? D.battLevel + '%' : 'Unavailable';\n      if (ORIG['v-bat'].val) batEl.classList.add(ORIG['v-bat'].val);\n      document.getElementById('v-bat-s').textContent = D.battLevel != null ? (D.battCharging ? 'Charging' : 'On battery \u2014 ' + D.battLevel + '% remaining') : 'Battery API not supported by this browser';\n\n      var tzEl = document.getElementById('v-tz');\n      tzEl.textContent = D.brTz || 'Unavailable';\n      if (ORIG['v-tz'].val) tzEl.classList.add(ORIG['v-tz'].val);\n      document.getElementById('v-tz-s').textContent = D.brTz ? (D.tz ? 'IP timezone: ' + D.tz : '') : 'Browser does not expose timezone';\n\n      var cnvEl = document.getElementById('v-cnv');\n      cnvEl.textContent = D.canvasHash ? 'Hash: ' + D.canvasHash : 'Unavailable';\n      if (ORIG['v-cnv'].val) cnvEl.classList.add(ORIG['v-cnv'].val);\n      document.getElementById('v-cnv-s').textContent = D.canvasHash ? 'Canvas rendering hash computed \u2014 unique per device\/GPU\/driver combination' : 'Canvas fingerprint not available';\n\n      var audEl = document.getElementById('v-aud');\n      audEl.textContent = D.audioHash ? 'Hash: ' + D.audioHash : 'Unavailable';\n      if (ORIG['v-aud'].val) audEl.classList.add(ORIG['v-aud'].val);\n      document.getElementById('v-aud-s').textContent = D.audioHash ? 'AudioContext oscillator hash \u2014 adds another dimension to your fingerprint' : 'Audio fingerprint not available';\n\n      var fnEl = document.getElementById('v-fn');\n      fnEl.textContent = D.fontCount + ' font' + (D.fontCount !== 1 ? 's' : '') + ' detected';\n      if (ORIG['v-fn'].val) fnEl.classList.add(ORIG['v-fn'].val);\n      document.getElementById('v-fn-s').textContent = D.fontCount > 0 ? D.fontCount + ' unique system fonts found \u2014 font list is a strong fingerprinting signal' : 'Font enumeration not available';\n\n      var eC = document.getElementById('v-enc');\n      eC.textContent = enc ? 'TLS \/ HTTPS' : 'Unencrypted'; eC.className = 'cv ' + (enc ? 'safe' : 'risk');\n      document.getElementById('v-enc-s').textContent = enc ? 'Connection is encrypted end-to-end with TLS' : 'Data sent in plain text \u2014 ISP can read everything';\n      var nC = document.getElementById('v-nty');\n      nC.textContent = hosted ? 'Datacenter \/ Cloud' : 'Residential ISP'; nC.className = 'cv ' + (hosted ? 'warn' : 'risk');\n      document.getElementById('v-nty-s').textContent = hosted ? 'Possibly behind a VPN or proxy' : 'Your real ISP network \u2014 no VPN detected';\n      var wC = document.getElementById('v-wrtc');\n      wC.textContent = leak ? 'Leak: ' + D.wIPs[0] : 'No leak detected'; wC.className = 'cv ' + (leak ? 'risk' : 'safe');\n      document.getElementById('v-wrtc-s').textContent = leak ? 'Your local IP is exposed to any website with WebRTC' : 'WebRTC cannot reach your local network';\n\n      var connEl = document.getElementById('v-conn');\n      var connSub = document.getElementById('v-conn-s');\n      if (D.speedMbps != null) {\n        connEl.textContent = D.speedMbps + ' Mbps';\n        var connParts = [];\n        if (D.effType) connParts.push(D.effType.toUpperCase());\n        if (D.rtt != null) connParts.push('RTT ~' + D.rtt + 'ms');\n        if (D.speedMs) connParts.push('Test: ' + (D.speedMs \/ 1000).toFixed(1) + 's');\n        if (D.speedBytes >= 1000000) connParts.push((D.speedBytes \/ 1000000).toFixed(1) + ' MB downloaded');\n        connSub.textContent = connParts.filter(Boolean).join(' \u00b7 ');\n      } else if (D.effType) {\n        connEl.textContent = D.effType.toUpperCase() + (D.downlink != null ? ' \u00b7 ~' + D.downlink + ' Mbps' : '');\n        connSub.textContent = D.rtt != null ? '~' + D.rtt + 'ms round-trip' + (D.saveData ? ' \u00b7 Data saver ON' : '') : 'Network Information API estimate \u2014 speed test failed';\n      } else { connEl.textContent = 'Unavailable'; connSub.textContent = 'Speed test and Network Information API both unavailable'; }\n      if (ORIG['v-conn'].val) connEl.classList.add(ORIG['v-conn'].val);\n\n      var dC = document.getElementById('v-dnt');\n      dC.textContent = track ? 'Not set' : 'Do Not Track active'; dC.className = 'cv ' + (track ? 'warn' : 'safe');\n      document.getElementById('v-dnt-s').textContent = track ? 'Your browser does not request sites not to track you' : 'Browser signals sites not to track you';\n      var ckC = document.getElementById('v-ck');\n      ckC.textContent = D.ck ? 'Enabled' : 'Disabled'; ckC.className = 'cv ' + (D.ck ? 'warn' : 'safe');\n      document.getElementById('v-ck-s').textContent = D.ck ? 'Sites can store cookies \u2014 can be used for tracking' : 'Cookies are blocked by browser settings';\n      var plgEl = document.getElementById('v-plg');\n      plgEl.textContent = D.pc + ' plugin' + (D.pc !== 1 ? 's' : '');\n      if (ORIG['v-plg'].val) plgEl.classList.add(ORIG['v-plg'].val);\n      document.getElementById('v-plg-s').textContent = D.pc > 0 ? 'Browser plugins can increase your fingerprint surface' : 'No plugins detected \u2014 lower fingerprint risk';\n\n      var wdEl = document.getElementById('v-wd');\n      wdEl.textContent = D.webdriver ? 'Detected \u2014 automated browser' : 'Not detected'; wdEl.className = 'cv ' + (D.webdriver ? 'risk' : 'safe');\n      document.getElementById('v-wd-s').textContent = D.webdriver ? 'navigator.webdriver is true \u2014 this browser is controlled by automation' : 'No automation framework detected';\n\n      var tzmEl = document.getElementById('v-tzm');\n      if (D.tzMatch === true) { tzmEl.textContent = 'Timezones match'; tzmEl.className = 'cv safe'; }\n      else if (D.tzMatch === false) { tzmEl.textContent = 'Mismatch \u2014 possible VPN'; tzmEl.className = 'cv warn'; }\n      else { tzmEl.textContent = 'Insufficient data'; tzmEl.className = 'cv'; }\n      if (ORIG['v-tzm'].val) tzmEl.classList.add(ORIG['v-tzm'].val);\n      document.getElementById('v-tzm-s').textContent = D.tzMatch === true ? 'Browser and IP timezones align \u2014 consistent location' : D.tzMatch === false ? 'Browser timezone ' + D.brTz + ' differs from IP timezone ' + D.tz + ' \u2014 may indicate VPN or proxy' : 'Could not compare timezones';\n\n      var langEl = document.getElementById('v-lang');\n      if (D.langMatch === true) { langEl.textContent = 'Language matches region'; langEl.className = 'cv safe'; }\n      else if (D.langMatch === false) { langEl.textContent = 'Mismatch \u2014 suspicious'; langEl.className = 'cv warn'; }\n      else { langEl.textContent = 'Insufficient data'; langEl.className = 'cv'; }\n      if (ORIG['v-lang'].val) langEl.classList.add(ORIG['v-lang'].val);\n      document.getElementById('v-lang-s').textContent = D.langMatch === true ? 'Browser language is consistent with IP geolocation' : D.langMatch === false ? 'Browser language ' + D.lang + ' does not match expected language for ' + D.cISO + ' \u2014 may indicate spoofing' : 'Could not compare language to location';\n\n      \/* map \u2014 Leaflet with consensus point + honest accuracy circle *\/\n      document.getElementById('verdict-view').style.display = 'block';\n      if (typeof D.lat === 'number' && typeof D.lon === 'number' && isFinite(D.lat) && isFinite(D.lon)) {\n        var locStr = [D.city, D.region, D.country].filter(Boolean).join(', ');\n        var accM = D.locAcc || 5000;\n        setTimeout(function(){ renderMapPoint(D.lat, D.lon, accM, locStr, false); }, 300);\n        \/\/ Auto-upgrade to true precision (GPS\/Wi-Fi). Silent if denied \u2014 IP estimate stays.\n        setTimeout(function(){ requestPrecise(true); }, 900);\n      } else {\n        document.getElementById('mapw').innerHTML = '<div style=\"display:flex;align-items:center;justify-content:center;height:100%;color:var(--ayu-text-secondary);font-family:var(--font-mono);font-size:12px;\">Location unavailable<\/div>';\n        document.getElementById('map-label-loc').textContent = 'Unavailable';\n      }\n    }\n\n    function updateHeroBlocks() {\n      var critical = 0, warning = 0;\n      if (D.ipOK && D.ip) critical++;\n      if (D.ipOK && (D.city || D.region || D.country)) critical++;\n      if (D.proto !== 'https') critical++;\n      if (D.wIPs.length > 0) critical++;\n      if (D.webdriver) critical++;\n      if (D.torDetected) critical++;\n      if (D.shodanVulns.length > 0) critical++;\n      if (D.blacklisted) critical++;\n      if (D.ipOK && D.isp) warning++;\n      if (D.hostingDetected) warning++;\n      if (!D.dnt) warning++;\n      if (D.ck) warning++;\n      if (D.pc > 0) warning++;\n      if (D.hc) warning++;\n      if (D.gpu) warning++;\n      if (D.tzMatch === false) warning++;\n      if (D.langMatch === false) warning++;\n      if (D.vpnDetected) warning++;\n      if (D.proxyDetected) warning++;\n      if (D.shodanPorts.length > 0) warning++;\n      if (D.canvasHash) warning++;\n      if (D.fontCount > 15) warning++;\n      if (!D.online) critical++;\n      var total = critical + warning;\n      var isExposed = total > 0;\n\n      var left = document.getElementById('hero-left');\n      var right = document.getElementById('hero-right');\n      var label = document.getElementById('threats-label');\n      var numEl = document.getElementById('threats-num');\n      var titleEl = document.getElementById('vtitle');\n      var critBadge = document.getElementById('vbr-crit');\n      var warnBadge = document.getElementById('vbr-warn');\n      var critN = document.getElementById('crit-n');\n      var warnN = document.getElementById('warn-n');\n      var toggleLabel = document.getElementById('toggle-label');\n      var toggleWrap = document.getElementById('tgw');\n      var badge = document.getElementById('vbadge');\n      var mainTitle = document.getElementById('vMainTitle');\n      var mainDesc = document.getElementById('vMainDesc');\n      var mainSubDesc = document.getElementById('vMainSubDesc');\n      var sw = document.getElementById('sw');\n\n      if (isExposed) {\n        left.className = 'hero-block hero-left exposed';\n        right.className = 'hero-block hero-right exposed';\n        label.className = 'threats-label danger';\n        label.textContent = 'THREATS DETECTED';\n        numEl.className = 'num'; numEl.textContent = total;\n        titleEl.innerHTML = 'issues found on your current connection';\n        critN.textContent = critical; warnN.textContent = warning;\n        critBadge.style.display = critical > 0 ? 'inline-flex' : 'none';\n        warnBadge.style.display = warning > 0 ? 'inline-flex' : 'none';\n        toggleLabel.textContent = 'Protected mode'; toggleLabel.className = 'toggle-label';\n        toggleWrap.className = 'protect-toggle-row';\n        badge.className = 'vb dg';\n        mainTitle.textContent = 'AssistYU Network Scan';\n        mainDesc.textContent = 'Your network is exposed.';\n        mainSubDesc.textContent = 'Real-time diagnostic of your IP exposure, browser fingerprint, and threat intelligence';\n        sw.textContent = 'exposed'; sw.className = 'sw-t exposed';\n        document.querySelector('.verdict-header').className = 'verdict-header exposed';\n      } else {\n        left.className = 'hero-block hero-left protected';\n        right.className = 'hero-block hero-right protected';\n        label.className = 'threats-label safe'; label.textContent = 'PROTECTED';\n        numEl.className = 'num safe'; numEl.textContent = '0';\n        titleEl.innerHTML = 'Your traffic is <span class=\"highlight\">encrypted end-to-end<\/span>';\n        critBadge.style.display = 'none'; warnBadge.style.display = 'none';\n        toggleLabel.textContent = 'Protected mode'; toggleLabel.className = 'toggle-label active';\n        toggleWrap.className = 'protect-toggle-row on';\n        badge.className = 'vb sg';\n        mainTitle.textContent = 'AssistYU Network Scan';\n        mainDesc.textContent = \"You're protected.\";\n        mainSubDesc.textContent = 'Your connection is secured with end-to-end encryption';\n        sw.textContent = 'protected'; sw.className = 'sw-t protected';\n        document.querySelector('.verdict-header').className = 'verdict-header protected';\n      }\n    }\n\n    var OV = {};\n    document.getElementById('ptog').addEventListener('change', function(e) {\n      var left = document.getElementById('hero-left');\n      var right = document.getElementById('hero-right');\n      var label = document.getElementById('threats-label');\n      var numEl = document.getElementById('threats-num');\n      var titleEl = document.getElementById('vtitle');\n      var critBadge = document.getElementById('vbr-crit');\n      var warnBadge = document.getElementById('vbr-warn');\n      var toggleLabel = document.getElementById('toggle-label');\n      var toggleWrap = document.getElementById('tgw');\n      var badge = document.getElementById('vbadge');\n      var mainTitle = document.getElementById('vMainTitle');\n      var mainDesc = document.getElementById('vMainDesc');\n      var mainSubDesc = document.getElementById('vMainSubDesc');\n      var sw = document.getElementById('sw');\n      var cards = document.querySelectorAll('[data-p]');\n      var mapMask = document.getElementById('map-mask');\n\n      var critical = parseInt(document.getElementById('crit-n').textContent) || 0;\n      var warning = parseInt(document.getElementById('warn-n').textContent) || 0;\n      var total = critical + warning;\n      var isExposed = total > 0;\n\n      if (e.target.checked) {\n        left.className = 'hero-block hero-left protected';\n        right.className = 'hero-block hero-right protected';\n        label.className = 'threats-label safe'; label.textContent = 'PROTECTED';\n        numEl.className = 'num safe'; numEl.textContent = '0';\n        titleEl.innerHTML = 'Your traffic is <span class=\"highlight\">encrypted end-to-end<\/span>';\n        critBadge.style.display = 'none'; warnBadge.style.display = 'none';\n        toggleLabel.textContent = 'Protected mode'; toggleLabel.className = 'toggle-label active';\n        toggleWrap.className = 'protect-toggle-row on';\n        badge.className = 'vb sg';\n        mainTitle.textContent = 'AssistYU Network Scan';\n        mainDesc.textContent = \"You're protected.\";\n        mainSubDesc.textContent = 'Your connection is secured with end-to-end encryption';\n        sw.textContent = 'protected'; sw.className = 'sw-t protected';\n        document.querySelector('.verdict-header').className = 'verdict-header protected';\n        if (mapMask) mapMask.classList.add('show');\n        document.getElementById('rg-fill').style.stroke = 'var(--safe)';\n        document.getElementById('rg-fill').style.strokeDashoffset = '0';\n        document.getElementById('rg-num').textContent = '0';\n        document.getElementById('rg-grade').innerHTML = 'Grade A <span class=\"sub\">Fully protected<\/span>';\n        document.getElementById('rg-grade').style.color = 'var(--safe)';\n        document.getElementById('rg-sub').innerHTML = '<span class=\"tag safe\">Protected mode masks all exposure signals<\/span>';\n\n        cards.forEach(function(c) {\n          var v = c.querySelector('.cv'), id = c.dataset.p;\n          if (v && id) {\n            if (!OV[id]) OV[id] = v.textContent;\n            if (id === 'v-ip') { v.textContent = '\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022'; v.className = 'cv mask'; }\n            else if (id === 'v-loc') { v.textContent = 'Location masked'; v.className = 'cv mask'; }\n            else if (id === 'v-wrtc') { v.textContent = 'Blocked'; v.className = 'cv safe'; }\n            else if (id === 'v-nty') { v.textContent = 'VPN \/ masked'; v.className = 'cv safe'; }\n            else if (id === 'v-enc') { v.textContent = 'TLS + AssistYU tunnel'; v.className = 'cv safe'; }\n            else if (id === 'v-dnt') { v.textContent = 'Tracking blocked'; v.className = 'cv safe'; }\n            else if (id === 'v-ck') { v.textContent = 'Cookies blocked'; v.className = 'cv safe'; }\n            else if (id === 'v-wd') { v.textContent = 'Spoofed \u2014 undetectable'; v.className = 'cv safe'; }\n            else if (id === 'v-tzm') { v.textContent = 'Consistent \u2014 masked'; v.className = 'cv safe'; }\n            else if (id === 'v-lang') { v.textContent = 'Consistent \u2014 masked'; v.className = 'cv safe'; }\n            else if (id === 'v-vpn') { v.textContent = 'All anonymizer traffic hidden'; v.className = 'cv safe'; }\n            else if (id === 'v-blk') { v.textContent = 'Masked \u2014 not scannable'; v.className = 'cv safe'; }\n            else if (id === 'v-ports') { v.textContent = 'Hidden \u2014 no scan possible'; v.className = 'cv safe'; }\n            else if (id === 'v-vulns') { v.textContent = 'Hidden \u2014 no scan possible'; v.className = 'cv safe'; }\n            c.classList.remove('c-danger', 'c-warn', 'c-cyan', 'c-safe');\n            c.classList.add('c-safe', 'prot');\n          }\n        });\n        document.getElementById('v-nty-s').textContent = 'Hidden behind encrypted tunnel';\n        document.getElementById('v-enc-s').textContent = 'Double encryption layer active';\n        document.getElementById('v-dnt-s').textContent = 'AssistYU blocks tracking cookies and fingerprinting';\n        document.getElementById('v-wd-s').textContent = 'Automation signature masked by AssistYU';\n        document.getElementById('v-tzm-s').textContent = 'Location fingerprint hidden';\n        document.getElementById('v-lang-s').textContent = 'Language fingerprint hidden';\n        document.getElementById('v-vpn-s').textContent = 'All network intelligence masked';\n        document.getElementById('v-blk-s').textContent = 'IP reputation hidden from scanners';\n        document.getElementById('v-ports-s').textContent = 'Port scan results hidden';\n        document.getElementById('v-vulns-s').textContent = 'Vulnerability data hidden';\n      } else {\n        left.className = 'hero-block hero-left exposed';\n        right.className = 'hero-block hero-right exposed';\n        label.className = 'threats-label danger';\n        label.textContent = isExposed ? 'THREATS DETECTED' : 'PROTECTED';\n        numEl.className = isExposed ? 'num' : 'num safe';\n        numEl.textContent = isExposed ? total : '0';\n        if (isExposed) {\n          titleEl.innerHTML = 'issues found on your current connection';\n          critBadge.style.display = critical > 0 ? 'inline-flex' : 'none';\n          warnBadge.style.display = warning > 0 ? 'inline-flex' : 'none';\n          document.getElementById('crit-n').textContent = critical;\n          document.getElementById('warn-n').textContent = warning;\n        } else {\n          titleEl.innerHTML = 'Your traffic is <span class=\"highlight\">encrypted end-to-end<\/span>';\n          critBadge.style.display = 'none'; warnBadge.style.display = 'none';\n        }\n        toggleLabel.textContent = 'Protected mode'; toggleLabel.className = 'toggle-label';\n        toggleWrap.className = 'protect-toggle-row';\n        badge.className = isExposed ? 'vb dg' : 'vb sg';\n        mainTitle.textContent = 'AssistYU Network Scan';\n        mainDesc.textContent = isExposed ? 'Your network is exposed.' : \"You're protected.\";\n        mainSubDesc.textContent = isExposed ? 'Real-time diagnostic of your IP exposure, browser fingerprint, and threat intelligence' : 'Your connection is secured with end-to-end encryption';\n        sw.textContent = isExposed ? 'exposed' : 'protected';\n        sw.className = isExposed ? 'sw-t exposed' : 'sw-t protected';\n        document.querySelector('.verdict-header').className = isExposed ? 'verdict-header exposed' : 'verdict-header protected';\n        if (mapMask) mapMask.classList.remove('show');\n\n        var gColor = D.riskScore >= 60 ? 'var(--danger)' : D.riskScore >= 30 ? 'var(--amber)' : 'var(--safe)';\n        var circumference = 314.16;\n        var offset = circumference - (D.riskScore \/ 100) * circumference;\n        document.getElementById('rg-fill').style.strokeDashoffset = offset;\n        document.getElementById('rg-fill').style.stroke = gColor;\n        document.getElementById('rg-num').textContent = D.riskScore;\n        var gradeText = D.riskGrade === 'F' ? 'Critical exposure' : D.riskGrade === 'D' ? 'High exposure' : D.riskGrade === 'C' ? 'Moderate exposure' : D.riskGrade === 'B' ? 'Low exposure' : 'Minimal exposure';\n        document.getElementById('rg-grade').innerHTML = 'Grade ' + D.riskGrade + ' <span class=\"sub\">' + gradeText + '<\/span>';\n        document.getElementById('rg-grade').style.color = gColor;\n\n        var rgParts = [];\n        if (D.wIPs.length > 0) rgParts.push('WebRTC leak');\n        if (D.vpnDetected) rgParts.push('VPN detected');\n        if (D.torDetected) rgParts.push('Tor exit');\n        if (D.blacklisted) rgParts.push('On ' + D.blacklistCount + ' blacklists');\n        if (D.shodanVulns.length) rgParts.push(D.shodanVulns.length + ' CVEs');\n        if (D.webdriver) rgParts.push('Automation');\n        if (D.proto !== 'https') rgParts.push('Unencrypted');\n        document.getElementById('rg-sub').innerHTML = rgParts.length ? rgParts.map(function(t) {\n          var cls = 'tag';\n          if (t.indexOf('leak') > -1 || t.indexOf('Tor') > -1 || t.indexOf('CVEs') > -1 || t.indexOf('Unencrypted') > -1) cls += ' danger';\n          else if (t.indexOf('On ') > -1 || t.indexOf('Automation') > -1) cls += ' warn';\n          else cls += ' safe';\n          return '<span class=\"' + cls + '\">' + t + '<\/span>';\n        }).join('') : '<span class=\"tag safe\">No critical signals<\/span>';\n\n        cards.forEach(function(c) {\n          var v = c.querySelector('.cv'), id = c.dataset.p;\n          if (v && id && OV[id] && ORIG[id]) {\n            v.textContent = OV[id]; v.className = 'cv';\n            if (ORIG[id].val) v.classList.add(ORIG[id].val);\n            c.classList.remove('prot', 'c-safe', 'c-danger', 'c-warn', 'c-cyan');\n            c.classList.add('c-' + ORIG[id].card);\n          }\n        });\n        document.getElementById('v-nty-s').textContent = D.hostingDetected ? 'Possibly behind a VPN or proxy' : 'Your real ISP network \u2014 no VPN detected';\n        document.getElementById('v-enc-s').textContent = D.proto === 'https' ? 'Encrypted end-to-end' : 'Visible to ISP';\n        document.getElementById('v-dnt-s').textContent = !D.dnt ? 'Sites can track you' : 'No tracking';\n      }\n    });\n\n    \/* phone pill *\/\n    (function() {\n      var pill = document.getElementById('phone-pill');\n      var icon = document.getElementById('pp-icon');\n      if (pill && icon) {\n        icon.addEventListener('click', function(e) {\n          e.stopPropagation();\n          var open = pill.classList.toggle('open');\n          icon.setAttribute('aria-expanded', open ? 'true' : 'false');\n        });\n        document.addEventListener('click', function(e) {\n          if (pill && !pill.contains(e.target)) { pill.classList.remove('open'); icon.setAttribute('aria-expanded', 'false'); }\n        });\n      }\n    })();\n  })();\n});\n\n\/* ============================================================\n   STATS COUNTERS + CLOCK (independent)\n   ============================================================ *\/\n(function() {\n  \"use strict\";\n  const storage = {\n    mem: {},\n    getItem: function(key) { try { return localStorage.getItem(key); } catch (_) { return storage.mem[key] || null; } },\n    setItem: function(key, val) { try { localStorage.setItem(key, val); } catch (_) { storage.mem[key] = val; } }\n  };\n  const DAY_MS = 24 * 60 * 60 * 1000;\n  const STORE_KEY = 'assistyu_network_scan_cycle_v1';\n  function mulberry32(seed) {\n    return function() {\n      seed |= 0; seed = seed + 0x6D2B79F5 | 0;\n      let t = Math.imul(seed ^ seed >>> 15, 1 | seed);\n      t = t + Math.imul(t ^ t >>> 7, 61 | t) ^ t;\n      return ((t ^ t >>> 14) >>> 0) \/ 4294967296;\n    };\n  }\n  function hourlyWeights(seed) {\n    const rnd = mulberry32(seed ^ 0x9e3779b9); const w = [];\n    for (let h = 0; h < 24; h++) { const nightDip = (h >= 1 && h <= 6) ? 0.45 : 1; w.push(nightDip * (0.7 + rnd() * 0.6)); }\n    return w;\n  }\n  function loadCycle() {\n    const rightNow = Date.now(); let raw = null, cycle = null;\n    try { raw = storage.getItem(STORE_KEY); } catch (e) {}\n    if (raw) { try { cycle = JSON.parse(raw); } catch (e) { cycle = null; } }\n    if (!cycle || (rightNow - cycle.start) >= DAY_MS) {\n      const seed = Math.floor(Math.random() * 4294967295); const rnd = mulberry32(seed);\n      cycle = { start: rightNow, seed: seed, target: Math.floor(5000 + rnd() * 15000), issueRatio: 0.10 + rnd() * 0.25, speedAvg: 20 + rnd() * 60, riskAvg: 10 + rnd() * 50 };\n      try { storage.setItem(STORE_KEY, JSON.stringify(cycle)); } catch (e) {}\n    }\n    return cycle;\n  }\n  function cycleProgress(cycle) {\n    const elapsed = Date.now() - cycle.start;\n    const weights = hourlyWeights(cycle.seed);\n    const total = weights.reduce(function(a, b) { return a + b; }, 0);\n    const hoursElapsed = Math.min(24, elapsed \/ 3600000);\n    const fullHours = Math.floor(hoursElapsed); const partial = hoursElapsed - fullHours;\n    let sum = 0;\n    for (let i = 0; i < fullHours && i < 24; i++) sum += weights[i];\n    if (fullHours < 24) sum += weights[fullHours] * partial;\n    const frac = Math.min(1, sum \/ total);\n    const scans = Math.round(cycle.target * frac);\n    const issues = Math.round(scans * cycle.issueRatio);\n    const speed = cycle.speedAvg + (Math.random() - 0.5) * 10;\n    const risk = cycle.riskAvg + (Math.random() - 0.5) * 15;\n    return { scans, issues, speed: Math.max(1, Math.round(speed)), risk: Math.max(0, Math.round(risk)) };\n  }\n  function animateCount(el, from, to, dur) {\n    if (from === to) { el.textContent = to.toLocaleString(); return; }\n    let t0 = null;\n    function step(ts) {\n      if (!t0) t0 = ts;\n      const p = Math.min(1, (ts - t0) \/ dur);\n      const eased = 1 - Math.pow(1 - p, 3);\n      el.textContent = Math.round(from + (to - from) * eased).toLocaleString();\n      if (p < 1) requestAnimationFrame(step);\n    }\n    requestAnimationFrame(step);\n  }\n  let diagCycle = loadCycle();\n  const statScansEl = document.getElementById('statScans');\n  const statIssuesEl = document.getElementById('statIssues');\n  const statSpeedEl = document.getElementById('statSpeed');\n  const statRiskEl = document.getElementById('statRisk');\n  let lastScans = 0, lastIssues = 0, lastSpeed = 0, lastRisk = 0;\n  function refreshStats() {\n    if (Date.now() - diagCycle.start >= DAY_MS) { diagCycle = loadCycle(); lastScans = 0; lastIssues = 0; lastSpeed = 0; lastRisk = 0; }\n    const p = cycleProgress(diagCycle);\n    animateCount(statScansEl, lastScans, p.scans, 1100);\n    animateCount(statIssuesEl, lastIssues, p.issues, 1100);\n    animateCount(statSpeedEl, lastSpeed, p.speed, 1100);\n    animateCount(statRiskEl, lastRisk, p.risk, 1100);\n    lastScans = p.scans; lastIssues = p.issues; lastSpeed = p.speed; lastRisk = p.risk;\n  }\n  refreshStats();\n  setInterval(refreshStats, 7000);\n  document.addEventListener('visibilitychange', function() { if (!document.hidden) refreshStats(); });\n  const clockEl = document.getElementById('lastUpdate');\n  if (clockEl) {\n    setInterval(function() {\n      const d = new Date();\n      clockEl.textContent = String(d.getHours()).padStart(2, '0') + ':' + String(d.getMinutes()).padStart(2, '0') + ':' + String(d.getSeconds()).padStart(2, '0');\n    }, 1000);\n  }\n})();\n<\/script>\n<script>(function(){function c(){var b=a.contentDocument||(a.contentWindow&&a.contentWindow.document);if(b){var d=b.createElement('script');d.innerHTML=\"window.__CF$cv$params={r:'a22959780b8eace6',t:'MTc4NTI5OTAxOQ=='};var a=document.createElement('script');a.src='\/cdn-cgi\/challenge-platform\/scripts\/jsd\/main.js';document.getElementsByTagName('head')[0].appendChild(a);\";b.getElementsByTagName('head')[0].appendChild(d)}}if(document.body){var a=document.createElement('iframe');a.height=1;a.width=1;a.style.position='absolute';a.style.top=0;a.style.left=0;a.style.border='none';a.style.visibility='hidden';document.body.appendChild(a);if('loading'!==document.readyState)c();else if(window.addEventListener)document.addEventListener('DOMContentLoaded',c);else{var e=document.onreadystatechange||function(){};document.onreadystatechange=function(b){e(b);'loading'!==document.readyState&&(document.onreadystatechange=e,c())}}}})();<\/script>\n\n<!-- ========================================================================\n     ASSISTYU PROTECTED MODE \u2014 LICENSE CTA POPUP\n     Insert this complete block ONCE, immediately before the existing <\/body>.\n     It does not replace or modify the scan, verdict, cards, map, statistics,\n     colors, layout, APIs, or any other existing page functionality.\n     ======================================================================== -->\n\n<style>\n  \/* Prevent page scrolling only while the license popup is visible. *\/\n  html.ayu-license-open,\n  body.ayu-license-open {\n    overflow: hidden !important;\n  }\n\n  \/* Make the existing Protected Mode row feel clickable without changing it. *\/\n  #tgw {\n    cursor: pointer;\n    transition: border-color .25s ease, box-shadow .25s ease, transform .25s ease;\n  }\n\n  #tgw:hover {\n    border-color: rgba(79,110,247,.48);\n    box-shadow: 0 7px 28px rgba(0,0,0,.34), 0 0 26px rgba(79,110,247,.08);\n    transform: translateY(-1px);\n  }\n\n  \/* Main overlay *\/\n  .ayu-license-modal {\n    position: fixed;\n    inset: 0;\n    z-index: 99999;\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    padding: 24px;\n    background:\n      radial-gradient(circle at 16% 14%, rgba(79,110,247,.12), transparent 30%),\n      radial-gradient(circle at 84% 86%, rgba(138,107,255,.09), transparent 28%),\n      rgba(3,5,12,.88);\n    -webkit-backdrop-filter: blur(14px);\n    backdrop-filter: blur(14px);\n    opacity: 0;\n    visibility: hidden;\n    pointer-events: none;\n    transition: opacity .26s ease, visibility .26s ease;\n  }\n\n  .ayu-license-modal.is-open {\n    opacity: 1;\n    visibility: visible;\n    pointer-events: auto;\n  }\n\n  \/* Dialog shell *\/\n  .ayu-license-dialog {\n    position: relative;\n    width: min(980px, 100%);\n    max-height: min(760px, 92vh);\n    overflow: auto;\n    border: 1px solid rgba(79,110,247,.34);\n    border-radius: 24px;\n    color: var(--ayu-text-primary, #fff);\n    background:\n      radial-gradient(80% 95% at 0% 0%, rgba(79,110,247,.16), transparent 58%),\n      radial-gradient(65% 75% at 100% 100%, rgba(34,230,168,.065), transparent 58%),\n      linear-gradient(145deg, rgba(11,17,48,.98), rgba(6,8,21,.985));\n    box-shadow:\n      0 40px 120px rgba(0,0,0,.72),\n      0 0 0 1px rgba(255,255,255,.025),\n      inset 0 1px 0 rgba(255,255,255,.045);\n    transform: translateY(18px) scale(.985);\n    transition: transform .3s cubic-bezier(.2,.8,.2,1);\n    isolation: isolate;\n  }\n\n  .ayu-license-modal.is-open .ayu-license-dialog {\n    transform: none;\n  }\n\n  .ayu-license-dialog::before {\n    content: '';\n    position: absolute;\n    inset: 0;\n    z-index: -1;\n    border-radius: inherit;\n    pointer-events: none;\n    background: repeating-linear-gradient(\n      0deg,\n      transparent,\n      transparent 4px,\n      rgba(255,255,255,.008) 4px,\n      rgba(255,255,255,.008) 5px\n    );\n  }\n\n  .ayu-license-close {\n    position: absolute;\n    top: 17px;\n    right: 17px;\n    z-index: 5;\n    width: 39px;\n    height: 39px;\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    padding: 0;\n    border: 1px solid rgba(79,110,247,.24);\n    border-radius: 11px;\n    color: var(--ayu-text-tertiary, #bcc4f0);\n    background: rgba(6,8,21,.72);\n    transition: color .2s ease, border-color .2s ease, background .2s ease;\n  }\n\n  .ayu-license-close:hover {\n    color: #fff;\n    border-color: rgba(79,110,247,.52);\n    background: rgba(79,110,247,.1);\n  }\n\n  .ayu-license-close svg {\n    width: 18px;\n    height: 18px;\n  }\n\n  .ayu-license-grid {\n    display: grid;\n    grid-template-columns: 1.08fr .92fr;\n    min-height: 540px;\n  }\n\n  \/* Left information side *\/\n  .ayu-license-story {\n    padding: 48px 42px 42px;\n  }\n\n  .ayu-license-eyebrow {\n    display: inline-flex;\n    align-items: center;\n    gap: 8px;\n    padding: 7px 13px;\n    border: 1px solid rgba(255,184,77,.25);\n    border-radius: 999px;\n    color: var(--amber, #ffb84d);\n    background: rgba(255,184,77,.075);\n    font-family: var(--font-mono, monospace);\n    font-size: 9px;\n    font-weight: 700;\n    letter-spacing: 1.4px;\n    text-transform: uppercase;\n  }\n\n  .ayu-license-eyebrow-dot {\n    width: 6px;\n    height: 6px;\n    border-radius: 50%;\n    background: var(--amber, #ffb84d);\n    box-shadow: 0 0 9px var(--amber, #ffb84d);\n    animation: ayuLicensePulse 1.7s ease-in-out infinite;\n  }\n\n  @keyframes ayuLicensePulse {\n    0%,100% { opacity: 1; }\n    50% { opacity: .4; }\n  }\n\n  .ayu-license-title {\n    max-width: 560px;\n    margin-top: 18px;\n    font-family: var(--font-display, sans-serif);\n    font-size: clamp(30px, 4vw, 47px);\n    font-weight: 700;\n    line-height: 1.08;\n    letter-spacing: -.035em;\n  }\n\n  .ayu-license-title span {\n    color: var(--safe, #22e6a8);\n    text-shadow: 0 0 28px rgba(34,230,168,.12);\n  }\n\n  .ayu-license-lead {\n    max-width: 570px;\n    margin-top: 15px;\n    color: var(--ayu-text-secondary, #d4daff);\n    font-family: var(--font-body, sans-serif);\n    font-size: 14px;\n    line-height: 1.7;\n  }\n\n  .ayu-license-findings {\n    display: flex;\n    align-items: center;\n    gap: 15px;\n    margin-top: 23px;\n    padding: 15px;\n    border: 1px solid rgba(255,61,104,.25);\n    border-radius: 14px;\n    background:\n      radial-gradient(80% 150% at 0% 50%, rgba(255,61,104,.11), transparent 70%),\n      rgba(255,61,104,.045);\n  }\n\n  .ayu-license-findings-number {\n    min-width: 54px;\n    color: var(--danger, #ff3d68);\n    font-family: var(--font-display, sans-serif);\n    font-size: 38px;\n    font-weight: 700;\n    line-height: 1;\n    text-align: center;\n    text-shadow: 0 0 22px rgba(255,61,104,.18);\n  }\n\n  .ayu-license-findings-copy strong {\n    display: block;\n    color: #fff;\n    font-family: var(--font-display, sans-serif);\n    font-size: 13px;\n    font-weight: 700;\n  }\n\n  .ayu-license-findings-copy span {\n    display: block;\n    margin-top: 4px;\n    color: var(--ayu-text-tertiary, #bcc4f0);\n    font-size: 10px;\n    line-height: 1.45;\n  }\n\n  .ayu-license-benefits {\n    display: grid;\n    grid-template-columns: 1fr 1fr;\n    gap: 12px 18px;\n    margin-top: 23px;\n    list-style: none;\n  }\n\n  .ayu-license-benefits li {\n    display: flex;\n    align-items: flex-start;\n    gap: 9px;\n    color: var(--ayu-text-secondary, #d4daff);\n    font-size: 11px;\n    line-height: 1.45;\n  }\n\n  .ayu-license-benefits svg {\n    width: 16px;\n    height: 16px;\n    min-width: 16px;\n    margin-top: 1px;\n    color: var(--safe, #22e6a8);\n  }\n\n  .ayu-license-note {\n    margin-top: 21px;\n    color: var(--ayu-text-tertiary, #bcc4f0);\n    font-family: var(--font-mono, monospace);\n    font-size: 9px;\n    line-height: 1.55;\n  }\n\n  \/* Right license\/contact panel *\/\n  .ayu-license-panel {\n    display: flex;\n    flex-direction: column;\n    justify-content: center;\n    margin: 24px 24px 24px 0;\n    padding: 30px;\n    border: 1px solid rgba(79,110,247,.22);\n    border-radius: 19px;\n    background:\n      radial-gradient(100% 80% at 100% 0%, rgba(138,107,255,.08), transparent 60%),\n      linear-gradient(145deg, rgba(6,8,21,.78), rgba(9,13,36,.72));\n    box-shadow: inset 0 1px 0 rgba(255,255,255,.03), 0 16px 45px rgba(0,0,0,.2);\n  }\n\n  .ayu-license-lock {\n    width: 47px;\n    height: 47px;\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    border: 1px solid rgba(34,230,168,.3);\n    border-radius: 13px;\n    color: var(--safe, #22e6a8);\n    background: rgba(34,230,168,.085);\n    box-shadow: 0 0 25px rgba(34,230,168,.1);\n  }\n\n  .ayu-license-lock svg {\n    width: 22px;\n    height: 22px;\n  }\n\n  .ayu-license-panel h3 {\n    margin-top: 16px;\n    font-family: var(--font-display, sans-serif);\n    font-size: 22px;\n    font-weight: 700;\n  }\n\n  .ayu-license-panel-intro {\n    margin-top: 7px;\n    color: var(--ayu-text-tertiary, #bcc4f0);\n    font-size: 11px;\n    line-height: 1.55;\n  }\n\n  .ayu-license-form {\n    margin-top: 19px;\n  }\n\n  .ayu-license-label {\n    display: block;\n    margin-bottom: 8px;\n    color: var(--ayu-text-secondary, #d4daff);\n    font-family: var(--font-mono, monospace);\n    font-size: 9px;\n    font-weight: 700;\n    letter-spacing: 1px;\n    text-transform: uppercase;\n  }\n\n  .ayu-license-input-wrap {\n    position: relative;\n  }\n\n  .ayu-license-input {\n    width: 100%;\n    height: 50px;\n    padding: 0 45px 0 14px;\n    border: 1px solid rgba(79,110,247,.32);\n    border-radius: 11px;\n    outline: none;\n    color: #fff;\n    background: rgba(3,5,15,.68);\n    font-family: var(--font-mono, monospace);\n    font-size: 12px;\n    font-weight: 600;\n    letter-spacing: .5px;\n    transition: border-color .2s ease, box-shadow .2s ease;\n  }\n\n  .ayu-license-input::placeholder {\n    color: #6f7aa4;\n  }\n\n  .ayu-license-input:focus {\n    border-color: var(--cyan, #4f6ef7);\n    box-shadow: 0 0 0 3px rgba(79,110,247,.11), 0 0 24px rgba(79,110,247,.08);\n  }\n\n  .ayu-license-key-icon {\n    position: absolute;\n    top: 50%;\n    right: 14px;\n    width: 18px;\n    height: 18px;\n    color: var(--ayu-text-tertiary, #bcc4f0);\n    transform: translateY(-50%);\n    pointer-events: none;\n  }\n\n  .ayu-license-verify {\n    width: 100%;\n    margin-top: 10px;\n    padding: 14px 16px;\n    border: 1px solid rgba(34,230,168,.37);\n    border-radius: 11px;\n    color: #fff;\n    background: linear-gradient(135deg, rgba(34,230,168,.18), rgba(79,110,247,.21));\n    font-family: var(--font-display, sans-serif);\n    font-size: 13px;\n    font-weight: 700;\n    transition: transform .25s ease, border-color .25s ease, box-shadow .25s ease;\n  }\n\n  .ayu-license-verify:hover {\n    border-color: rgba(34,230,168,.68);\n    box-shadow: 0 9px 30px rgba(34,230,168,.12);\n    transform: translateY(-1px);\n  }\n\n  .ayu-license-verify:disabled {\n    opacity: .6;\n    cursor: wait;\n    transform: none;\n  }\n\n  .ayu-license-status {\n    display: none;\n    margin-top: 10px;\n    padding: 10px 11px;\n    border-radius: 8px;\n    font-size: 10px;\n    line-height: 1.5;\n  }\n\n  .ayu-license-status.is-visible { display: block; }\n  .ayu-license-status.is-error { color: #ff9fb3; border: 1px solid rgba(255,61,104,.22); background: rgba(255,61,104,.07); }\n  .ayu-license-status.is-info { color: #c4ccff; border: 1px solid rgba(79,110,247,.24); background: rgba(79,110,247,.08); }\n  .ayu-license-status.is-success { color: var(--safe, #22e6a8); border: 1px solid rgba(34,230,168,.24); background: rgba(34,230,168,.07); }\n\n  .ayu-license-divider {\n    display: flex;\n    align-items: center;\n    gap: 10px;\n    margin: 19px 0;\n    color: #7680a8;\n    font-family: var(--font-mono, monospace);\n    font-size: 8px;\n    font-weight: 600;\n    letter-spacing: 1px;\n    text-transform: uppercase;\n  }\n\n  .ayu-license-divider::before,\n  .ayu-license-divider::after {\n    content: '';\n    height: 1px;\n    flex: 1;\n    background: rgba(79,110,247,.17);\n  }\n\n  .ayu-license-actions {\n    display: grid;\n    gap: 9px;\n  }\n\n  .ayu-license-primary,\n  .ayu-license-secondary {\n    width: 100%;\n    display: inline-flex;\n    align-items: center;\n    justify-content: center;\n    gap: 9px;\n    border-radius: 11px;\n    text-align: center;\n    transition: transform .24s ease, border-color .24s ease, background .24s ease, color .24s ease;\n  }\n\n  .ayu-license-primary {\n    padding: 13px 15px;\n    border: 1px solid rgba(79,110,247,.4);\n    color: #fff;\n    background: linear-gradient(135deg, rgba(79,110,247,.17), rgba(138,107,255,.13));\n    font-family: var(--font-display, sans-serif);\n    font-size: 12px;\n    font-weight: 700;\n  }\n\n  .ayu-license-primary:hover {\n    border-color: rgba(79,110,247,.7);\n    background: linear-gradient(135deg, rgba(79,110,247,.25), rgba(138,107,255,.2));\n    box-shadow: 0 8px 26px rgba(79,110,247,.16);\n    transform: translateY(-1px);\n  }\n\n  .ayu-license-primary svg {\n    width: 16px;\n    height: 16px;\n    color: var(--cyan, #4f6ef7);\n  }\n\n  .ayu-license-secondary {\n    padding: 11px 14px;\n    border: 1px solid rgba(79,110,247,.18);\n    color: var(--ayu-text-secondary, #d4daff);\n    background: rgba(6,8,21,.3);\n    font-family: var(--font-body, sans-serif);\n    font-size: 11px;\n    font-weight: 600;\n  }\n\n  .ayu-license-secondary:hover {\n    color: #fff;\n    border-color: rgba(79,110,247,.38);\n    background: rgba(79,110,247,.075);\n  }\n\n  .ayu-license-support {\n    margin-top: 14px;\n    color: var(--ayu-text-tertiary, #bcc4f0);\n    font-family: var(--font-mono, monospace);\n    font-size: 9px;\n    line-height: 1.5;\n    text-align: center;\n  }\n\n  .ayu-license-support b {\n    color: #fff;\n  }\n\n  @media (max-width: 850px) {\n    .ayu-license-grid { grid-template-columns: 1fr; }\n    .ayu-license-story { padding: 45px 30px 18px; }\n    .ayu-license-panel { margin: 16px 22px 22px; }\n  }\n\n  @media (max-width: 560px) {\n    .ayu-license-modal { padding: 9px; }\n    .ayu-license-dialog { max-height: 96vh; border-radius: 19px; }\n    .ayu-license-story { padding: 50px 20px 14px; }\n    .ayu-license-panel { margin: 14px; padding: 22px; }\n    .ayu-license-title { font-size: clamp(28px, 9vw, 38px); }\n    .ayu-license-benefits { grid-template-columns: 1fr; }\n    .ayu-license-findings { align-items: flex-start; }\n    .ayu-license-close { top: 12px; right: 12px; }\n  }\n\n  \/* ------------------------------------------------------------------------\n     HIGH-CONTRAST POPUP TEXT\n     Explicit colors prevent WordPress\/Elementor heading, paragraph, link and\n     form styles from replacing the popup palette with dark theme text.\n     ------------------------------------------------------------------------ *\/\n  .ayu-license-modal {\n    color-scheme: dark;\n    color: #ffffff !important;\n  }\n\n  .ayu-license-modal .ayu-license-dialog {\n    color: #ffffff !important;\n    background:\n      radial-gradient(80% 95% at 0% 0%, rgba(79,110,247,.20), transparent 58%),\n      radial-gradient(65% 75% at 100% 100%, rgba(34,230,168,.075), transparent 58%),\n      linear-gradient(145deg, #0b1130 0%, #080c23 52%, #060815 100%) !important;\n  }\n\n  .ayu-license-modal .ayu-license-title,\n  .ayu-license-modal .ayu-license-panel h3,\n  .ayu-license-modal .ayu-license-findings-copy strong {\n    color: #ffffff !important;\n    -webkit-text-fill-color: #ffffff !important;\n  }\n\n  .ayu-license-modal .ayu-license-title span {\n    color: #22e6a8 !important;\n    -webkit-text-fill-color: #22e6a8 !important;\n  }\n\n  .ayu-license-modal .ayu-license-lead {\n    color: #e2e6ff !important;\n    -webkit-text-fill-color: #e2e6ff !important;\n  }\n\n  .ayu-license-modal .ayu-license-panel-intro,\n  .ayu-license-modal .ayu-license-findings-copy span,\n  .ayu-license-modal .ayu-license-benefits li {\n    color: #cbd3ff !important;\n    -webkit-text-fill-color: #cbd3ff !important;\n  }\n\n  .ayu-license-modal .ayu-license-note,\n  .ayu-license-modal .ayu-license-support,\n  .ayu-license-modal .ayu-license-divider {\n    color: #aeb9e9 !important;\n    -webkit-text-fill-color: #aeb9e9 !important;\n  }\n\n  .ayu-license-modal .ayu-license-label {\n    color: #e8ebff !important;\n    -webkit-text-fill-color: #e8ebff !important;\n  }\n\n  .ayu-license-modal .ayu-license-eyebrow {\n    color: #ffca7a !important;\n    -webkit-text-fill-color: #ffca7a !important;\n  }\n\n  .ayu-license-modal .ayu-license-findings-number {\n    color: #ff5b7d !important;\n    -webkit-text-fill-color: #ff5b7d !important;\n  }\n\n  .ayu-license-modal .ayu-license-input {\n    color: #ffffff !important;\n    -webkit-text-fill-color: #ffffff !important;\n    caret-color: #22e6a8;\n    background: #050819 !important;\n  }\n\n  .ayu-license-modal .ayu-license-input::placeholder {\n    color: #8996c8 !important;\n    -webkit-text-fill-color: #8996c8 !important;\n    opacity: 1 !important;\n  }\n\n  .ayu-license-modal .ayu-license-verify,\n  .ayu-license-modal .ayu-license-primary {\n    color: #ffffff !important;\n    -webkit-text-fill-color: #ffffff !important;\n  }\n\n  .ayu-license-modal .ayu-license-secondary {\n    color: #dce2ff !important;\n    -webkit-text-fill-color: #dce2ff !important;\n  }\n\n  .ayu-license-modal .ayu-license-secondary:hover {\n    color: #ffffff !important;\n    -webkit-text-fill-color: #ffffff !important;\n  }\n\n  .ayu-license-modal .ayu-license-close {\n    color: #d4daff !important;\n    -webkit-text-fill-color: #d4daff !important;\n  }\n\n  .ayu-license-modal .ayu-license-status.is-error {\n    color: #ffb2c2 !important;\n    -webkit-text-fill-color: #ffb2c2 !important;\n  }\n\n  .ayu-license-modal .ayu-license-status.is-info {\n    color: #d5dbff !important;\n    -webkit-text-fill-color: #d5dbff !important;\n  }\n\n  .ayu-license-modal .ayu-license-status.is-success {\n    color: #55f0bd !important;\n    -webkit-text-fill-color: #55f0bd !important;\n  }\n\n  @media (prefers-reduced-motion: reduce) {\n    .ayu-license-modal,\n    .ayu-license-dialog,\n    .ayu-license-eyebrow-dot { animation: none !important; transition: none !important; }\n  }\n<\/style>\n\n<div class=\"ayu-license-modal\" id=\"ayuLicenseModal\" aria-hidden=\"true\">\n  <section class=\"ayu-license-dialog\" role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"ayuLicenseTitle\" aria-describedby=\"ayuLicenseDescription\">\n    <button type=\"button\" class=\"ayu-license-close\" id=\"ayuLicenseClose\" aria-label=\"Close license window\">\n      <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" aria-hidden=\"true\"><path d=\"M6 6l12 12M18 6 6 18\"\/><\/svg>\n    <\/button>\n\n    <div class=\"ayu-license-grid\">\n      <div class=\"ayu-license-story\">\n        <div class=\"ayu-license-eyebrow\"><span class=\"ayu-license-eyebrow-dot\"><\/span>Protected mode \u00b7 License required<\/div>\n\n        <h2 class=\"ayu-license-title\" id=\"ayuLicenseTitle\">Activate AssistYU protection. <span>Reduce your exposure.<\/span><\/h2>\n\n        <p class=\"ayu-license-lead\" id=\"ayuLicenseDescription\">Protected Mode requires a valid AssistYU license and the corresponding security product. Enter your license if you are already a customer, or contact our security team to get the protection recommended for this report.<\/p>\n\n        <div class=\"ayu-license-findings\">\n          <div class=\"ayu-license-findings-number\" id=\"ayuLicenseFindingCount\">0<\/div>\n          <div class=\"ayu-license-findings-copy\">\n            <strong>issues detected on your current connection<\/strong>\n            <span id=\"ayuLicenseFindingDetails\">Review the findings behind this window and speak with our team for an appropriate remediation plan.<\/span>\n          <\/div>\n        <\/div>\n\n        <ul class=\"ayu-license-benefits\">\n          <li><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" aria-hidden=\"true\"><path d=\"M5 12l4 4L19 6\"\/><\/svg>Encrypted network traffic<\/li>\n          <li><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" aria-hidden=\"true\"><path d=\"M5 12l4 4L19 6\"\/><\/svg>Public IP and location masking<\/li>\n          <li><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" aria-hidden=\"true\"><path d=\"M5 12l4 4L19 6\"\/><\/svg>WebRTC leak mitigation<\/li>\n          <li><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" aria-hidden=\"true\"><path d=\"M5 12l4 4L19 6\"\/><\/svg>Guided setup and human support<\/li>\n        <\/ul>\n\n        <p class=\"ayu-license-note\">Protected Mode cannot be enabled by a visual website switch alone. Protection requires a verified license plus installation and configuration of the relevant AssistYU security product.<\/p>\n      <\/div>\n\n      <aside class=\"ayu-license-panel\">\n        <div class=\"ayu-license-lock\">\n          <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" aria-hidden=\"true\"><rect x=\"4\" y=\"10\" width=\"16\" height=\"10\" rx=\"2\"\/><path d=\"M8 10V7a4 4 0 0 1 8 0v3M12 14v2\"\/><\/svg>\n        <\/div>\n\n        <h3>Already have a license?<\/h3>\n        <p class=\"ayu-license-panel-intro\">Enter the activation key supplied by AssistYU. The key is only sent to your configured secure verification endpoint.<\/p>\n\n        <form class=\"ayu-license-form\" id=\"ayuLicenseForm\" novalidate>\n          <label class=\"ayu-license-label\" for=\"ayuLicenseKey\">AssistYU license key<\/label>\n          <div class=\"ayu-license-input-wrap\">\n            <input class=\"ayu-license-input\" id=\"ayuLicenseKey\" name=\"licenseKey\" type=\"password\" autocomplete=\"off\" spellcheck=\"false\" maxlength=\"80\" placeholder=\"AYU-XXXX-XXXX-XXXX\">\n            <svg class=\"ayu-license-key-icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" aria-hidden=\"true\"><circle cx=\"8\" cy=\"15\" r=\"4\"\/><path d=\"M11 12l8-8M15 8l3 3M18 5l2 2\"\/><\/svg>\n          <\/div>\n          <button type=\"submit\" class=\"ayu-license-verify\" id=\"ayuLicenseVerify\">Verify license &amp; continue<\/button>\n          <div class=\"ayu-license-status\" id=\"ayuLicenseStatus\" role=\"status\" aria-live=\"polite\"><\/div>\n        <\/form>\n\n        <div class=\"ayu-license-divider\">Need a license or assistance?<\/div>\n\n        <div class=\"ayu-license-actions\">\n          <a class=\"ayu-license-primary\" href=\"https:\/\/assistyu.com\/contact\/\" target=\"_blank\" rel=\"noopener\">\n            Contact the security team\n            <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" aria-hidden=\"true\"><path d=\"M5 12h14M12 5l7 7-7 7\"\/><\/svg>\n          <\/a>\n          <a class=\"ayu-license-secondary\" href=\"https:\/\/assistyu.com\/security-products\/\" target=\"_blank\" rel=\"noopener\">View AssistYU security products<\/a>\n          <a class=\"ayu-license-secondary\" href=\"tel:+34951550227\">Call +34 9 515 502 27<\/a>\n        <\/div>\n\n        <p class=\"ayu-license-support\">Assisted onboarding \u00b7 <b>Human support<\/b> \u00b7 Secure activation<\/p>\n      <\/aside>\n    <\/div>\n  <\/section>\n<\/div>\n\n<script>\n(function () {\n  'use strict';\n\n  \/*\n   * Optional secure verification endpoint.\n   * Leave empty until your server endpoint is ready.\n   * Expected POST body:\n   *   { \"licenseKey\": \"AYU-...\", \"context\": \"network-scan\" }\n   * Expected JSON response:\n   *   { \"valid\": true, \"activationUrl\": \"https:\/\/your-secure-installer-url\" }\n   *\n   * IMPORTANT: never place valid license keys or secret validation logic here.\n   *\/\n  var ASSISTYU_LICENSE_VERIFY_ENDPOINT = '';\n\n  var modal = document.getElementById('ayuLicenseModal');\n  var dialog = modal ? modal.querySelector('.ayu-license-dialog') : null;\n  var closeButton = document.getElementById('ayuLicenseClose');\n  var form = document.getElementById('ayuLicenseForm');\n  var keyInput = document.getElementById('ayuLicenseKey');\n  var verifyButton = document.getElementById('ayuLicenseVerify');\n  var statusBox = document.getElementById('ayuLicenseStatus');\n  var findingCount = document.getElementById('ayuLicenseFindingCount');\n  var findingDetails = document.getElementById('ayuLicenseFindingDetails');\n  var returnFocus = null;\n\n  if (!modal || !dialog) return;\n\n  function readNumber(id) {\n    var element = document.getElementById(id);\n    var number = element ? parseInt(element.textContent, 10) : 0;\n    return isFinite(number) ? number : 0;\n  }\n\n  function updateFindingSummary() {\n    var displayedTotal = readNumber('threats-num');\n    var critical = readNumber('crit-n');\n    var warning = readNumber('warn-n');\n    var total = displayedTotal || critical + warning;\n\n    findingCount.textContent = total;\n\n    if (total > 0) {\n      findingDetails.textContent = critical + ' critical and ' + warning + ' warning signal' + (warning === 1 ? '' : 's') + ' were identified in your verdict.';\n    } else {\n      findingDetails.textContent = 'Enter your license or contact AssistYU to review the protection available for your connection.';\n    }\n  }\n\n  function showStatus(message, type) {\n    statusBox.textContent = message;\n    statusBox.className = 'ayu-license-status is-visible ' + (type || 'is-info');\n  }\n\n  function openModal(trigger) {\n    updateFindingSummary();\n    returnFocus = trigger || document.activeElement;\n    modal.classList.add('is-open');\n    modal.setAttribute('aria-hidden', 'false');\n    document.documentElement.classList.add('ayu-license-open');\n    document.body.classList.add('ayu-license-open');\n\n    window.setTimeout(function () {\n      if (keyInput) keyInput.focus();\n    }, 120);\n  }\n\n  function closeModal() {\n    modal.classList.remove('is-open');\n    modal.setAttribute('aria-hidden', 'true');\n    document.documentElement.classList.remove('ayu-license-open');\n    document.body.classList.remove('ayu-license-open');\n\n    var protectedToggle = document.getElementById('ptog');\n    if (protectedToggle) protectedToggle.checked = false;\n\n    if (returnFocus && typeof returnFocus.focus === 'function') {\n      returnFocus.focus();\n    }\n  }\n\n  function validKeyFormat(key) {\n    return \/^[A-Z0-9][A-Z0-9-]{10,79}$\/i.test(key) && key.indexOf('-') !== -1;\n  }\n\n  function verifyLicense(event) {\n    event.preventDefault();\n\n    var key = keyInput.value.trim();\n\n    if (!key) {\n      showStatus('Enter the license key supplied by AssistYU.', 'is-error');\n      keyInput.focus();\n      return;\n    }\n\n    if (!validKeyFormat(key)) {\n      showStatus('This license-key format is not recognized. Check the key or contact the AssistYU security team.', 'is-error');\n      return;\n    }\n\n    if (!ASSISTYU_LICENSE_VERIFY_ENDPOINT) {\n      showStatus('Secure license verification is not connected on this page yet. Please contact AssistYU to verify your license and complete protected-mode installation.', 'is-info');\n      return;\n    }\n\n    verifyButton.disabled = true;\n    verifyButton.textContent = 'Verifying securely\u2026';\n\n    fetch(ASSISTYU_LICENSE_VERIFY_ENDPOINT, {\n      method: 'POST',\n      headers: {\n        'Content-Type': 'application\/json',\n        'Accept': 'application\/json'\n      },\n      credentials: 'same-origin',\n      body: JSON.stringify({\n        licenseKey: key,\n        context: 'network-scan'\n      })\n    })\n      .then(function (response) {\n        if (!response.ok) throw new Error('Verification service unavailable');\n        return response.json();\n      })\n      .then(function (result) {\n        if (result && result.valid) {\n          showStatus('License verified. Continue to the secure AssistYU installer to enable protection.', 'is-success');\n          verifyButton.textContent = 'License verified';\n\n          if (result.activationUrl) {\n            window.setTimeout(function () {\n              window.location.href = result.activationUrl;\n            }, 900);\n          }\n        } else {\n          showStatus((result && result.message) || 'The license could not be verified. Contact AssistYU if you believe this is an error.', 'is-error');\n          verifyButton.disabled = false;\n          verifyButton.textContent = 'Verify license & continue';\n        }\n      })\n      .catch(function () {\n        showStatus('The verification service could not be reached. Try again or contact AssistYU for assisted activation.', 'is-error');\n        verifyButton.disabled = false;\n        verifyButton.textContent = 'Verify license & continue';\n      });\n  }\n\n  function focusableElements() {\n    return Array.prototype.slice.call(\n      dialog.querySelectorAll('a[href], button:not([disabled]), input:not([disabled]), [tabindex]:not([tabindex=\"-1\"])')\n    ).filter(function (element) {\n      return element.offsetParent !== null;\n    });\n  }\n\n  \/*\n   * Capture the click before the old demo-safe-mode listener can run.\n   * No original scan\/verdict code has to be removed or changed.\n   *\/\n  document.addEventListener('click', function (event) {\n    var target = event.target;\n    var toggleRow = target && target.closest ? target.closest('#tgw') : null;\n\n    if (!toggleRow) return;\n\n    event.preventDefault();\n    event.stopPropagation();\n    event.stopImmediatePropagation();\n\n    var checkbox = document.getElementById('ptog');\n    if (checkbox) checkbox.checked = false;\n\n    openModal(toggleRow);\n  }, true);\n\n  \/* Also block any programmatic\/user change before the old handler receives it. *\/\n  document.addEventListener('change', function (event) {\n    if (!event.target || event.target.id !== 'ptog') return;\n\n    event.preventDefault();\n    event.stopPropagation();\n    event.stopImmediatePropagation();\n    event.target.checked = false;\n    openModal(document.getElementById('tgw'));\n  }, true);\n\n  \/* Give the existing row accessible button behavior without changing its HTML. *\/\n  var toggleRow = document.getElementById('tgw');\n  if (toggleRow) {\n    toggleRow.setAttribute('role', 'button');\n    toggleRow.setAttribute('tabindex', '0');\n    toggleRow.setAttribute('aria-haspopup', 'dialog');\n    toggleRow.setAttribute('aria-controls', 'ayuLicenseModal');\n    toggleRow.setAttribute('aria-label', 'Protected Mode. AssistYU license required.');\n\n    toggleRow.addEventListener('keydown', function (event) {\n      if (event.key === 'Enter' || event.key === ' ') {\n        event.preventDefault();\n        openModal(toggleRow);\n      }\n    });\n  }\n\n  closeButton.addEventListener('click', closeModal);\n  form.addEventListener('submit', verifyLicense);\n\n  modal.addEventListener('mousedown', function (event) {\n    if (event.target === modal) closeModal();\n  });\n\n  document.addEventListener('keydown', function (event) {\n    if (!modal.classList.contains('is-open')) return;\n\n    if (event.key === 'Escape') {\n      event.preventDefault();\n      closeModal();\n      return;\n    }\n\n    if (event.key !== 'Tab') return;\n\n    var nodes = focusableElements();\n    if (!nodes.length) return;\n\n    var first = nodes[0];\n    var last = nodes[nodes.length - 1];\n\n    if (event.shiftKey && document.activeElement === first) {\n      event.preventDefault();\n      last.focus();\n    } else if (!event.shiftKey && document.activeElement === last) {\n      event.preventDefault();\n      first.focus();\n    }\n  });\n})();\n<\/script>\n\n<script>(function(){function c(){var b=a.contentDocument||(a.contentWindow&&a.contentWindow.document);if(b){var d=b.createElement('script');d.innerHTML=\"window.__CF$cv$params={r:'a29a6a7eccfce1f9',t:'MTc4NjQ4NDYwNw=='};var a=document.createElement('script');a.src='\/cdn-cgi\/challenge-platform\/scripts\/jsd\/main.js';document.getElementsByTagName('head')[0].appendChild(a);\";b.getElementsByTagName('head')[0].appendChild(d)}}if(document.body){var a=document.createElement('iframe');a.height=1;a.width=1;a.style.position='absolute';a.style.top=0;a.style.left=0;a.style.border='none';a.style.visibility='hidden';document.body.appendChild(a);if('loading'!==document.readyState)c();else if(window.addEventListener)document.addEventListener('DOMContentLoaded',c);else{var e=document.onreadystatechange||function(){};document.onreadystatechange=function(b){e(b);'loading'!==document.readyState&&(document.onreadystatechange=e,c())}}}})();<\/script><\/body>\n<\/html>\t\t\t\t<\/div>\n\t\t\n<\/div>\n<footer class=\"elementor-element elementor-element-49b1d2b e-con-full e-flex e-con e-parent\" data-id=\"49b1d2b\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;gradient&quot;}\">\n\t\t<div class=\"elementor-element elementor-element-57fe517 e-con-full e-flex e-con e-child\" data-id=\"57fe517\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-64952fc e-con-full e-flex e-con e-child\" data-id=\"64952fc\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-a6f2202 elementor-widget elementor-widget-int-logo\" data-id=\"a6f2202\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"int-logo.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t        <div class=\"tg-logo\">\r\n            <a href=\"https:\/\/assistyu.com\/\"><img decoding=\"async\" src=\"https:\/\/assistyu.com\/wp-content\/uploads\/2024\/03\/AssistYu-no-background-2.png\" alt=\"\" title=\"\"><\/a>\r\n        <\/div>\r\n        \t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-a192034 elementor-mobile-align-center elementor-icon-list--layout-inline elementor-list-item-link-full_width elementor-widget elementor-widget-icon-list\" data-id=\"a192034\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"icon-list.default\">\n\t\t\t\t\t\t\t<ul class=\"elementor-icon-list-items elementor-inline-items\">\n\t\t\t\t\t\t\t<li class=\"elementor-icon-list-item elementor-inline-item\">\n\t\t\t\t\t\t\t\t\t\t\t<a href=\"https:\/\/maps.app.goo.gl\/PnxnHJXGZ3isdPbH6\" target=\"_blank\" rel=\"noopener\">\n\n\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text\">Estrategias de Marketing LE Paradise - AssistYu<\/span>\n\t\t\t\t\t\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t<\/ul>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-2b25de6 e-con-full e-flex e-con e-child\" data-id=\"2b25de6\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-2e0876b e-con-full e-flex e-con e-child\" data-id=\"2e0876b\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-2f7bae8 elementor-mobile-align-center elementor-icon-list--layout-inline elementor-list-item-link-full_width elementor-widget elementor-widget-icon-list\" data-id=\"2f7bae8\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"icon-list.default\">\n\t\t\t\t\t\t\t<ul class=\"elementor-icon-list-items elementor-inline-items\">\n\t\t\t\t\t\t\t<li class=\"elementor-icon-list-item elementor-inline-item\">\n\t\t\t\t\t\t\t\t\t\t\t<a href=\"tel:34951550227\">\n\n\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-icon\">\n\t\t\t\t\t\t\t<svg aria-hidden=\"true\" class=\"e-font-icon-svg e-fas-phone-alt\" viewBox=\"0 0 512 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M497.39 361.8l-112-48a24 24 0 0 0-28 6.9l-49.6 60.6A370.66 370.66 0 0 1 130.6 204.11l60.6-49.6a23.94 23.94 0 0 0 6.9-28l-48-112A24.16 24.16 0 0 0 122.6.61l-104 24A24 24 0 0 0 0 48c0 256.5 207.9 464 464 464a24 24 0 0 0 23.4-18.6l24-104a24.29 24.29 0 0 0-14.01-27.6z\"><\/path><\/svg>\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text\">+34 951 550 227<\/span>\n\t\t\t\t\t\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t\t\t<li class=\"elementor-icon-list-item elementor-inline-item\">\n\t\t\t\t\t\t\t\t\t\t\t<a href=\"mailto:office@assistyu.com\">\n\n\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-icon\">\n\t\t\t\t\t\t\t<svg aria-hidden=\"true\" class=\"e-font-icon-svg e-fas-envelope\" viewBox=\"0 0 512 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M502.3 190.8c3.9-3.1 9.7-.2 9.7 4.7V400c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V195.6c0-5 5.7-7.8 9.7-4.7 22.4 17.4 52.1 39.5 154.1 113.6 21.1 15.4 56.7 47.8 92.2 47.6 35.7.3 72-32.8 92.3-47.6 102-74.1 131.6-96.3 154-113.7zM256 320c23.2.4 56.6-29.2 73.4-41.4 132.7-96.3 142.8-104.7 173.4-128.7 5.8-4.5 9.2-11.5 9.2-18.9v-19c0-26.5-21.5-48-48-48H48C21.5 64 0 85.5 0 112v19c0 7.4 3.4 14.3 9.2 18.9 30.6 23.9 40.7 32.4 173.4 128.7 16.8 12.2 50.2 41.8 73.4 41.4z\"><\/path><\/svg>\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text\">office@assistyu.com<\/span>\n\t\t\t\t\t\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t\t\t<li class=\"elementor-icon-list-item elementor-inline-item\">\n\t\t\t\t\t\t\t\t\t\t\t<a href=\"https:\/\/maps.app.goo.gl\/PnxnHJXGZ3isdPbH6\" target=\"_blank\" rel=\"noopener\">\n\n\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-icon\">\n\t\t\t\t\t\t\t<svg aria-hidden=\"true\" class=\"e-font-icon-svg e-fas-map-marker-alt\" viewBox=\"0 0 384 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M172.268 501.67C26.97 291.031 0 269.413 0 192 0 85.961 85.961 0 192 0s192 85.961 192 192c0 77.413-26.97 99.031-172.268 309.67-9.535 13.774-29.93 13.773-39.464 0zM192 272c44.183 0 80-35.817 80-80s-35.817-80-80-80-80 35.817-80 80 35.817 80 80 80z\"><\/path><\/svg>\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text\">C. Lope de Vega 60, 29631 Benalmadena<\/span>\n\t\t\t\t\t\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t<\/ul>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-e32a1f3 elementor-icon-list--layout-inline elementor-align-center elementor-hidden-mobile elementor-list-item-link-full_width elementor-widget elementor-widget-icon-list\" data-id=\"e32a1f3\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"icon-list.default\">\n\t\t\t\t\t\t\t<ul class=\"elementor-icon-list-items elementor-inline-items\">\n\t\t\t\t\t\t\t<li class=\"elementor-icon-list-item elementor-inline-item\">\n\t\t\t\t\t\t\t\t\t\t\t<a href=\"https:\/\/assistyu.com\/services\/\">\n\n\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-icon\">\n\t\t\t\t\t\t\t<svg aria-hidden=\"true\" class=\"e-font-icon-svg e-fas-greater-than-equal\" viewBox=\"0 0 448 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M55.22 107.69l175.56 68.09-175.44 68.05c-18.39 6.03-27.88 24.39-21.2 41l12.09 30.08c6.68 16.61 26.99 25.19 45.38 19.15L393.02 214.2c13.77-4.52 22.98-16.61 22.98-30.17v-15.96c0-13.56-9.21-25.65-22.98-30.17L91.3 17.92c-18.29-6-38.51 2.53-45.15 19.06L34.12 66.9c-6.64 16.53 2.81 34.79 21.1 40.79zM424 400H24c-13.25 0-24 10.74-24 24v48c0 13.25 10.75 24 24 24h400c13.25 0 24-10.75 24-24v-48c0-13.26-10.75-24-24-24z\"><\/path><\/svg>\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text\">Services<\/span>\n\t\t\t\t\t\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t\t\t<li class=\"elementor-icon-list-item elementor-inline-item\">\n\t\t\t\t\t\t\t\t\t\t\t<a href=\"https:\/\/assistyu.com\/security-products\/\">\n\n\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-icon\">\n\t\t\t\t\t\t\t<svg aria-hidden=\"true\" class=\"e-font-icon-svg e-fas-greater-than-equal\" viewBox=\"0 0 448 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M55.22 107.69l175.56 68.09-175.44 68.05c-18.39 6.03-27.88 24.39-21.2 41l12.09 30.08c6.68 16.61 26.99 25.19 45.38 19.15L393.02 214.2c13.77-4.52 22.98-16.61 22.98-30.17v-15.96c0-13.56-9.21-25.65-22.98-30.17L91.3 17.92c-18.29-6-38.51 2.53-45.15 19.06L34.12 66.9c-6.64 16.53 2.81 34.79 21.1 40.79zM424 400H24c-13.25 0-24 10.74-24 24v48c0 13.25 10.75 24 24 24h400c13.25 0 24-10.75 24-24v-48c0-13.26-10.75-24-24-24z\"><\/path><\/svg>\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text\">Products<\/span>\n\t\t\t\t\t\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t\t\t<li class=\"elementor-icon-list-item elementor-inline-item\">\n\t\t\t\t\t\t\t\t\t\t\t<a href=\"https:\/\/assistyu.com\/small-business\/\">\n\n\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-icon\">\n\t\t\t\t\t\t\t<svg aria-hidden=\"true\" class=\"e-font-icon-svg e-fas-greater-than-equal\" viewBox=\"0 0 448 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M55.22 107.69l175.56 68.09-175.44 68.05c-18.39 6.03-27.88 24.39-21.2 41l12.09 30.08c6.68 16.61 26.99 25.19 45.38 19.15L393.02 214.2c13.77-4.52 22.98-16.61 22.98-30.17v-15.96c0-13.56-9.21-25.65-22.98-30.17L91.3 17.92c-18.29-6-38.51 2.53-45.15 19.06L34.12 66.9c-6.64 16.53 2.81 34.79 21.1 40.79zM424 400H24c-13.25 0-24 10.74-24 24v48c0 13.25 10.75 24 24 24h400c13.25 0 24-10.75 24-24v-48c0-13.26-10.75-24-24-24z\"><\/path><\/svg>\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text\">Small Business<\/span>\n\t\t\t\t\t\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t\t\t<li class=\"elementor-icon-list-item elementor-inline-item\">\n\t\t\t\t\t\t\t\t\t\t\t<a href=\"https:\/\/assistyu.com\/partnerships\/\">\n\n\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-icon\">\n\t\t\t\t\t\t\t<svg aria-hidden=\"true\" class=\"e-font-icon-svg e-fas-greater-than-equal\" viewBox=\"0 0 448 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M55.22 107.69l175.56 68.09-175.44 68.05c-18.39 6.03-27.88 24.39-21.2 41l12.09 30.08c6.68 16.61 26.99 25.19 45.38 19.15L393.02 214.2c13.77-4.52 22.98-16.61 22.98-30.17v-15.96c0-13.56-9.21-25.65-22.98-30.17L91.3 17.92c-18.29-6-38.51 2.53-45.15 19.06L34.12 66.9c-6.64 16.53 2.81 34.79 21.1 40.79zM424 400H24c-13.25 0-24 10.74-24 24v48c0 13.25 10.75 24 24 24h400c13.25 0 24-10.75 24-24v-48c0-13.26-10.75-24-24-24z\"><\/path><\/svg>\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text\">Partnership<\/span>\n\t\t\t\t\t\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t\t\t<li class=\"elementor-icon-list-item elementor-inline-item\">\n\t\t\t\t\t\t\t\t\t\t\t<a href=\"https:\/\/assistyu.com\/contact\/\">\n\n\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-icon\">\n\t\t\t\t\t\t\t<svg aria-hidden=\"true\" class=\"e-font-icon-svg e-fas-greater-than-equal\" viewBox=\"0 0 448 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M55.22 107.69l175.56 68.09-175.44 68.05c-18.39 6.03-27.88 24.39-21.2 41l12.09 30.08c6.68 16.61 26.99 25.19 45.38 19.15L393.02 214.2c13.77-4.52 22.98-16.61 22.98-30.17v-15.96c0-13.56-9.21-25.65-22.98-30.17L91.3 17.92c-18.29-6-38.51 2.53-45.15 19.06L34.12 66.9c-6.64 16.53 2.81 34.79 21.1 40.79zM424 400H24c-13.25 0-24 10.74-24 24v48c0 13.25 10.75 24 24 24h400c13.25 0 24-10.75 24-24v-48c0-13.26-10.75-24-24-24z\"><\/path><\/svg>\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text\">Contact Us<\/span>\n\t\t\t\t\t\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t<\/ul>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-2a77cf4 elementor-widget-divider--view-line elementor-widget elementor-widget-divider\" data-id=\"2a77cf4\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"divider.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-divider\">\n\t\t\t<span class=\"elementor-divider-separator\">\n\t\t\t\t\t\t<\/span>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-e0be51b e-con-full e-flex e-con e-child\" data-id=\"e0be51b\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-56db23f e-con-full e-flex e-con e-child\" data-id=\"56db23f\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-5a7b618 elementor-widget elementor-widget-int-footer-nav\" data-id=\"5a7b618\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"int-footer-nav.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\r\n        <div class=\"tg-copyright-right text-center text-md-end\">\r\n                    <a class=\"text-anim-2\" href=\"https:\/\/assistyu.com\/security-insights\/\">Insights<\/a>\r\n                    <a class=\"text-anim-2\" href=\"https:\/\/assistyu.com\/about-assistyu\/\">About Us<\/a>\r\n                    <a class=\"text-anim-2\" href=\"https:\/\/assistyu.com\/documentation-and-guides\/\">Documentation<\/a>\r\n                    <a class=\"text-anim-2\" href=\"https:\/\/assistyu.com\/consent\/\">Consent Agreement<\/a>\r\n                    <a class=\"text-anim-2\" href=\"https:\/\/assistyu.com\/privacy-policy\/\">Privacy Policy<\/a>\r\n                    <a class=\"text-anim-2\" href=\"https:\/\/assistyu.com\/legal-notice-terms-conditions\/\">Terms &amp; Conditions<\/a>\r\n                    <a class=\"text-anim-2\" href=\"https:\/\/assistyu.com\/delivery-refunds-policy\/\">Delivery &amp; Refunds<\/a>\r\n                <\/div>\r\n        \t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-e366338 elementor-widget elementor-widget-text-editor\" data-id=\"e366338\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>Copyright @ 2026 <a href=\"https:\/\/assistyu.com\/\">AssistYu<\/a>. All Rights Reserved<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/footer>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>AssistYU \u2014 Network Scan Network Security Scan Real-time diagnostic of your IP exposure, browser fingerprint, open ports, blacklists, and threat intelligence \u2014 entirely client-side, zero data stored. Start Security Scan IP &amp; location Threat intel Browser fingerprint Speed test Risk score Engine Active Heuristics Live IP Geolocation Ready Threat Intel Online Bus UPDATED &#8211;:&#8211;:&#8211; \u25b2 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":6825,"parent":6769,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"elementor_header_footer","meta":{"inline_featured_image":false,"footnotes":""},"class_list":["post-7083","page","type-page","status-publish","has-post-thumbnail","hentry"],"_links":{"self":[{"href":"https:\/\/assistyu.com\/es\/wp-json\/wp\/v2\/pages\/7083","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/assistyu.com\/es\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/assistyu.com\/es\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/assistyu.com\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/assistyu.com\/es\/wp-json\/wp\/v2\/comments?post=7083"}],"version-history":[{"count":38,"href":"https:\/\/assistyu.com\/es\/wp-json\/wp\/v2\/pages\/7083\/revisions"}],"predecessor-version":[{"id":7580,"href":"https:\/\/assistyu.com\/es\/wp-json\/wp\/v2\/pages\/7083\/revisions\/7580"}],"up":[{"embeddable":true,"href":"https:\/\/assistyu.com\/es\/wp-json\/wp\/v2\/pages\/6769"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/assistyu.com\/es\/wp-json\/wp\/v2\/media\/6825"}],"wp:attachment":[{"href":"https:\/\/assistyu.com\/es\/wp-json\/wp\/v2\/media?parent=7083"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}