1<!DOCTYPE html><html lang="en" class="overflow-hidden"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no"/><link rel="stylesheet" href="/_next/static/css/e2401df8ba878a79.css" data-precedence="next"/><link rel="stylesheet" href="/_next/static/css/d157ebc6a96f517c.css" data-precedence="next"/><link rel="stylesheet" href="/_next/static/css/cce98443f6ddd1b7.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-8aedbe7cc8adb0fa.js"/>
1<script src="/_next/static/chunks/fd9d1056-12c14ae0b295ce59.js" async=""></script>
1<script src="/_next/static/chunks/2117-adc6dad89d422885.js" async=""></script>
1<script src="/_next/static/chunks/main-app-c37d29a9518d243c.js" async=""></script>
1<script src="/_next/static/chunks/b468fba8-b715dafecb1a2e91.js" async=""></script>
1<script src="/_next/static/chunks/7c86ec74-729bd8644e93ea96.js" async=""></script>
1<script src="/_next/static/chunks/7027-bfc167901d5005a2.js" async=""></script>
1<script src="/_next/static/chunks/3664-fa874e4ebd18b076.js" async=""></script>
1<script src="/_next/static/chunks/6137-5d86f5908d7baf2e.js" async=""></script>
1<script src="/_next/static/chunks/5454-65e694a3990ad67c.js" async=""></script>
1<script src="/_next/static/chunks/8001-318a7f1d36852c60.js" async=""></script>
1<script src="/_next/static/chunks/3216-1a7b64fce2b3f645.js" async=""></script>
1<script src="/_next/static/chunks/2944-5c98c971c0e9ede3.js" async=""></script>
1<script src="/_next/static/chunks/3742-c9c3d45a03630dfa.js" async=""></script>
1<script src="/_next/static/chunks/4156-943ed681e17dcb17.js" async=""></script>
1<script src="/_next/static/chunks/6999-24663f724f9c4665.js" async=""></script>
1<script src="/_next/static/chunks/3378-e65cb9eef7e718b0.js" async=""></script>
1<script src="/_next/static/chunks/6294-593edf825b9b3eaa.js" async=""></script>
1<script src="/_next/static/chunks/1350-94f2269e85bb1c8a.js" async=""></script>
1<script src="/_next/static/chunks/app/plans/page-b875ca00713ef13a.js" async=""></script>
1<script src="/_next/static/chunks/9081a741-bbd6ecc5e42e1b09.js" async=""></script>
1<script src="/_next/static/chunks/41ade5dc-1d3c905065779e82.js" async=""></script>
1<script src="/_next/static/chunks/12038df7-00b53010b3c2f4ce.js" async=""></script>
1<script src="/_next/static/chunks/c16f53c3-5d3ba4cc55e681ea.js" async=""></script>
1<script src="/_next/static/chunks/2972-2cdc4cc651faee4c.js" async=""></script>
1<script src="/_next/static/chunks/8226-75def72dbb54d0b8.js" async=""></script>
1<script src="/_next/static/chunks/8840-75530307d770d75f.js" async=""></script>
1<script src="/_next/static/chunks/1218-31291943b6d8b724.js" async=""></script>
1<script src="/_next/static/chunks/1312-0d8118164927a2dc.js" async=""></script>
1<script src="/_next/static/chunks/3096-b91ee7bf1db39231.js" async=""></script>
1<script src="/_next/static/chunks/4417-f066be1134420b74.js" async=""></script>
1<script src="/_next/static/chunks/7584-524a70b83e8da07e.js" async=""></script>
1<script src="/_next/static/chunks/6025-050aa285af79cfe0.js" async=""></script>
1<script src="/_next/static/chunks/8913-2bebb5b7136246e5.js" async=""></script>
1<script src="/_next/static/chunks/9159-dc19aa9a315d4073.js" async=""></script>
1<script src="/_next/static/chunks/5335-db187099cb201763.js" async=""></script>
1<script src="/_next/static/chunks/1769-81c6969a73d535cd.js" async=""></script>
1<script src="/_next/static/chunks/1027-5bee49fa67d8f0f5.js" async=""></script>
1<script src="/_next/static/chunks/2494-a707a87451552825.js" async=""></script>
1<script src="/_next/static/chunks/6928-316c402be0dde25c.js" async=""></script>
1<script src="/_next/static/chunks/app/layout-4abfa470e0b2d4f1.js" async=""></script>
1<script src="/_next/static/chunks/5258-e839e1aea0c89ec0.js" async=""></script>
1<script src="/_next/static/chunks/app/error-737cfeab25dd0318.js" async=""></script>
1<script src="/_next/static/chunks/app/not-found-43f4052d83c35dd3.js" async=""></script>
1<script src="/_next/static/chunks/app/global-error-22b700288e8fcdb4.js" async=""></script>
1<link rel="preconnect" href="https://securetoken.googleapis.com" crossorigin="anonymous"/><link rel="preconnect" href="https://identitytoolkit.googleapis.com" crossorigin="anonymous"/><link rel="preconnect" href="https://alphractal-api-v2-adfjc9cee0ejhdc9.eastus-01.azurewebsites.net" crossorigin="anonymous"/><link rel="dns-prefetch" href="https://securetoken.googleapis.com"/><link rel="dns-prefetch" href="https://identitytoolkit.googleapis.com"/><link rel="dns-prefetch" href="https://alphractal-api-v2-adfjc9cee0ejhdc9.eastus-01.azurewebsites.net"/><meta name="theme-color" content="#000000"/><title>Alphractal | Crypto Analytics Platform for On-Chain, Derivatives & Macro Data</title><meta name="description" content="Alphractal is a crypto analytics platform combining over 1,500 metrics across on-chain, derivatives, sentiment, and macroeconomics."/><link rel="manifest" href="/manifest.json" crossorigin="use-credentials"/><meta name="apple-mobile-web-app-capable" content="yes"/><meta name="apple-mobile-web-app-status-bar-style" content="black-translucent"/><meta property="og:title" content="Alphractal | Crypto Analytics Platform for On-Chain, Derivatives & Macro Data"/><meta property="og:description" content="Alphractal is a crypto analytics platform combining over 1,500 metrics across on-chain, derivatives, sentiment, and macroeconomics."/><meta property="og:url" content="https://app.alphractal.com/"/><meta property="og:image" content="https://app.alphractal.com/BannerAlphractal.png"/><meta property="og:image:width" content="1200"/><meta property="og:image:height" content="630"/><meta property="og:image:alt" content="Alphractal - Cryptocurrency Analysis Platform"/><meta property="og:type" content="website"/><meta name="twitter:card" content="summary_large_image"/><meta name="twitter:title" content="Alphractal | Crypto Analytics Platform for On-Chain, Derivatives & Macro Data"/><meta name="twitter:description" content="Alphractal is a crypto analytics platform combining over 1,500 metrics across on-chain, derivatives, sentiment, and macroeconomics."/><meta name="twitter:image" content="https://app.alphractal.com/BannerAlphractal.png"/><link rel="shortcut icon" href="/FavIconAlphractal.png"/><link rel="icon" href="/FavIconAlphractal.png"/><link rel="apple-touch-icon" href="/FavIconAlphractal.png"/>
1<script src="/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script>
1</head><body class="__className_f367f3 min-h-screen bg-background text-foreground antialiased">
1<script>(function () { 2 try { 3 var RELOAD_KEY = "alpx_chunk_reload_at"; 4 var RELOAD_COUNT_KEY = "alpx_chunk_reload_count"; 5 var RECOVERED_KEY = "alpx_chunk_recovered"; 6 var COOLDOWN = 60000; 7 // A reload only fixes a stale build. If two of them did not, the page is broken 8 // for another reason and reloading again would just trap the user. The counter 9 // is cleared on a successful boot (src/app/providers.tsx). 10 var MAX_RELOADS = 2; 11 var CLEANUP_TIMEOUT = 1500; 12 var CHUNK_PATH = "/_next/static/chunks/"; 13 var WEBPACK_RUNTIME = "/_next/static/chunks/webpack-"; 14 15 // Reading window.caches (or calling keys()) throws SecurityError outright in 16 // some private/sandboxed contexts. This block runs at top level, so an 17 // unguarded throw here unwinds past the listener registration at the bottom 18 // and silently disables the whole mechanism for that user. 19 try { 20 if ("serviceWorker" in navigator) { 21 navigator.serviceWorker.getRegistrations().then(function (regs) { 22 regs.forEach(function (r) { r.unregister(); }); 23 }).catch(function () {}); 24 } 25 // Independent of the service worker, exactly as purgeCaches() below treats 26 // them: a webview can expose the Cache API without navigator.serviceWorker, 27 // and nesting this meant the startup purge â the one that runs BEFORE 28 // anything loads â skipped a poisoned cache entry entirely, leaving it to 29 // be cleaned only after a crash had already reached recover(). 30 if (window.caches && window.caches.keys) { 31 window.caches.keys().then(function (keys) { 32 keys.forEach(function (k) { window.caches.delete(k); }); 33 }).catch(function () {}); 34 } 35 } catch (e) {} 36 37 function isStaleChunkError(msg) { 38 var s = String(msg); 39 // JSON.parse of an HTML error body (e.g. an API 404/502 page) also says 40 // "Unexpected token '<'" but is not a stale chunk â reloading would 41 // discard user state and pollute the recovery metric. 42 if (/is not valid JSON/.test(s)) return false; 43 // \S+ for the chunk id: an app-router chunk is named by path 44 // ("app/alpha-ai/page"), which [\w-]+ would not match. 45 return /Unexpected token '<'|Loading (?:CSS )?chunk \S+ failed|ChunkLoadError/.test(s); 46 } 47 48 // A deploy replaces every hashed chunk, so a tab still running the previous build 49 // 404s on the files it asks for. webpack keeps going and calls modules[id].call() 50 // for a module that never registered, which throws from inside its bootstrap. 51 function isModuleRegistryMiss(msg, origin) { 52 var s = String(msg); 53 var miss = /Cannot read properties of undefined \(reading 'call'\)/.test(s) || 54 /undefined is not an object \(evaluating '\w+\[\w+\]\.call'\)/.test(s) || 55 /\w+\[\w+\] is undefined/.test(s); 56 // These are ordinary TypeErrors. They only mean "this build's module registry is 57 // inconsistent" when webpack's bootstrap is the frame that THREW â a plain bug in 58 // a lazily loaded module also has the runtime somewhere in its stack, and 59 // reloading on that would just replay the bug and cost the user their state. 60 return miss && String(origin).indexOf(WEBPACK_RUNTIME) !== -1; 61 } 62 63 /** The file the error was thrown from: onerror hands it over, a rejection only has a stack. */ 64 function originOf(filename, stack) { 65 if (filename) return String(filename); 66 var lines = String(stack || "").split("\n"); 67 for (var i = 0; i < lines.length; i++) { 68 if (lines[i].indexOf("/_next/static/") !== -1) return lines[i]; 69 } 70 return ""; 71 } 72 73 function classify(msg, filename, stack) { 74 if (!msg) return null; 75 if (isStaleChunkError(msg)) return "chunk_load_error"; 76 if (isModuleRegistryMiss(msg, originOf(filename, stack))) return "module_registry_miss"; 77 return null; 78 } 79 80 /** 81 * Takes one reload out of this tab's budget. 82 * 83 * Returns the epoch at which a reload could next be permitted: 0 when this 84 * claim SUCCEEDED, a future timestamp while merely cooling down, and 85 * Infinity when the budget is spent or storage is unreadable (with no 86 * storage there is no way to count reloads, and a reload we cannot count is 87 * a reload loop). The caller needs the three cases apart â a refusal that 88 * expires must not suppress the page for as long as one that never will. 89 */ 90 function claimReload() { 91 var now = Date.now(); 92 var last, count;
93 try { 94 last = parseInt(sessionStorage.getItem(RELOAD_KEY) || "0", 10); 95 count = parseInt(sessionStorage.getItem(RELOAD_COUNT_KEY) || "0", 10); 96 if (now - last < COOLDOWN) return last + COOLDOWN; 97 if (count >= MAX_RELOADS) return Infinity; 98 sessionStorage.setItem(RELOAD_KEY, String(now)); 99 sessionStorage.setItem(RELOAD_COUNT_KEY, String(count + 1)); 100 } catch (e) { 101 return Infinity; 102 } 103 return 0; 104 } 105 106 // Marker for the app to report to PostHog after the reload (this script runs 107 // before analytics load). `recovered: false` means the page was left broken. 108 function mark(reason, msg, recovered) { 109 // The marker written before a reload survives into the next document and 110 // waits there until the reporter has posthog loaded. A give-up landing in 111 // that window overwrites it â and it SHOULD: a chunk failing again in the 112 // document the reload produced is the proof that the reload did not fix 113 // the page. Refusing the overwrite (what this guard used to do) filed 114 // exactly those tabs as clean recoveries, and swallowed the wake-up below 115 // with them, so the cohort that stayed broken was the one that vanished. 116 // 117 // What the overwrite must not lose is that a reload happened at all, so 118 // carry its timestamp over as `reloadedAt`. The drain reads it to separate 119 // two give-ups that used to be indistinguishable: out of budget having 120 // never reloaded, versus reloaded, landed, and broken all the same. 121 // 122 // Bursts within ONE document never reach here â `latchedUntil` returns 123 // before the second failure â so this only ever decides across documents. 124 var reloadedAt; 125 if (!recovered) { 126 try { 127 var pending = sessionStorage.getItem(RECOVERED_KEY); 128 if (pending) { 129 var prev = JSON.parse(pending); 130 reloadedAt = prev.recovered === true ? prev.at : prev.reloadedAt; 131 } 132 } catch (e) {} 133 } 134 try { 135 sessionStorage.setItem(RECOVERED_KEY, JSON.stringify({ 136 message: String(msg).slice(0, 300), 137 reason: reason, 138 recovered: recovered, 139 // Dropped from the JSON when undefined, i.e. when no reload preceded this. 140 reloadedAt: reloadedAt, 141 path: window.location.pathname, 142 at: Date.now() 143 })); 144 } catch (e) {} 145 // A give-up writes the marker and does NOT reload, so nothing would surface 146 // it until the user happened to navigate â sometimes hours later, by which 147 // point its timing is meaningless. Wake the reporter, which is alive in this 148 // same document, so the event is filed while it still describes something. 149 if (!recovered) { 150 try { window.dispatchEvent(new Event("alpx:chunk-marker")); } catch (e) {} 151 } 152 } 153 154 function purgeCaches() { 155 var tasks = []; 156 if ("serviceWorker" in navigator) { 157 tasks.push(navigator.serviceWorker.getRegistrations().then(function (regs) { 158 return Promise.all(regs.map(function (r) { return r.unregister(); })); 159 })); 160 } 161 if (window.caches && window.caches.keys) { 162 tasks.push(window.caches.keys().then(function (keys) { 163 return Promise.all(keys.map(function (k) { return window.caches.delete(k); })); 164 })); 165 } 166 return Promise.all(tasks); 167 } 168 169 // A wedged service worker is one of the things we may be cleaning up, so never let 170 // its promise decide whether the page reloads. 171 function settleWithin(promise, ms) { 172 return new Promise(function (resolve) { 173 var timer = setTimeout(resolve, ms); 174 var done = function () { clearTimeout(timer); resolve(); }; 175 promise.then(done, done); 176 }); 177 } 178 179 // A stale build rarely fails once: every
179<script> the page still asks for 404s, 180 // and webpack trips over each missing module in turn. They are all one event, so 181 // the first one decides for the page â the reload it schedules fixes every later 182 // failure too, and its message is the one that diagnoses the build. 183 // 184 // Without this latch the second failure reaches claimReload(), is turned away by 185 // the cooldown the first one just armed, and overwrites the pending 186 // `recovered: true` marker with `false` â reporting a recovery that did happen as 187 // a page left broken. The same overwrite spoils the give-up path, where the 188 // marker ends up describing the last chunk to fail rather than the first. 189 // Time-boxed, NOT permanent: this tab may live for hours across several 190 // deploys. A latch that never lifts would let the first burst disable 191 // recovery for the rest of the session â no reload and no marker, so a page 192 // broken by a later deploy is both unfixed and invisible in the metric. 193 // 194 // The latch expires exactly when a reload could next be permitted, which is 195 // NOT the same as one cooldown from now. Arming it with `now` on a refusal 196 // created a dead window: a failure at T+30s (refused, 30s into the previous 197 // reload's cooldown) latched until T+90s, so the genuinely new failure at 198 // T+65s â which the budget WOULD have granted â got neither a reload nor a 199 // marker. The page stayed broken and invisible for the gap. 200 var latchedUntil = 0; 201 202 function recover(reason, msg) { 203 var now = Date.now(); 204 if (now < latchedUntil) return; 205 var nextAllowedAt = claimReload(); 206 if (nextAllowedAt !== 0) { 207 // Refused. Hold only until the refusal itself expires, so the next real 208 // opportunity is not swallowed by our own latch â and never longer than 209 // one cooldown, because claimReload returns Infinity for a spent budget 210 // or unreadable storage, and assigning that straight in made the latch 211 // permanent. That is the very thing the paragraph above forbids: a tab 212 // that lives across several deploys would go silent for the rest of the 213 // session, unfixed AND invisible in the metric. 214 latchedUntil = Math.min(nextAllowedAt, now + COOLDOWN); 215 // Out of budget: the page stays broken, so leave a trail instead of vanishing 216 // from the metric â a drop in recoveries would otherwise read as "fixed". 217 mark(reason, msg, false); 218 return; 219 } 220 // Granted: this page is reloading, and the whole burst is one event. 221 latchedUntil = now + COOLDOWN; 222 mark(reason, msg, true); 223 // The latch means this is the page's only chance to reload, so the reload must 224 // not depend on the cleanup succeeding: a synchronous throw out of purgeCaches 225 // (blocked storage, a SecurityError from caches.keys) would otherwise leave the 226 // tab broken with the marker claiming it recovered. 227 try { 228 settleWithin(purgeCaches(), CLEANUP_TIMEOUT).then(function () { 229 window.location.reload(); 230 }); 231 } catch (e) { 232 window.location.reload(); 233 } 234 } 235 236 // Capture phase: a chunk that 404s fires an error event on the
236<script> element 237 // itself and never bubbles. This is the most direct evidence that this build's 238 // files are gone from the CDN â it arrives before webpack trips over the missing 239 // module. Scripts only: a failed <link> preload (CSS, fonts) does not break the 240 // page, and reloading on one would throw away whatever the user was doing. 241 window.addEventListener("error", function (e) { 242 var el = e && e.target; 243 if (el && el !== window) { 244 if (el.tagName === "SCRIPT" && String(el.src || "").indexOf(CHUNK_PATH) !== -1) { 245 recover("chunk_asset_failed", el.src); 246 } 247 return; 248 } 249 var err = e && e.error; 250 var msg = e && (e.message || (err && err.message)); 251 var reason = classify(msg, e && e.filename, err && err.stack); 252 if (reason) recover(reason, msg); 253 }, true); 254 255 window.addEventListener("unhandledrejection", function (e) { 256 var r = e && e.reason; 257 var msg = r && (r.message || r); 258 var reason = classify(msg, null, r && r.stack); 259 if (reason) recover(reason, msg); 260 }); 261 262 // Refund the reload budget on the only evidence that actually settles the 263 // question: a chunk this document requested AFTER boot loading successfully. 264 // 265 // MAX_RELOADS exists so a page a reload cannot fix does not trap the user in 266 // a loop, and sessionStorage keeps the count for the life of the tab â so 267 // something has to give it back, or two recoveries disarm recovery for good. 268 // Every time-based attempt at that was wrong in both directions: shorter than 269 // COOLDOWN the cap could never accumulate (a blocked client looped forever at 270 // one reload per minute, each writing a false recovery), and longer it 271 // stranded users who leave before the timer. 272 // 273 // A lazily loaded chunk arriving is the proof itself: it is exactly the 274 // operation that was failing. Scripts injected during boot are excluded via 275 // the load event, so only genuine on-demand loads count. 276 // On DOCUMENT, not window. A `load` event on an element never reaches a 277 // window listener even in the capture phase: the HTML spec's "get the 278 // parent" returns null for `load`, so propagation stops at the Document. 279 // (The sibling `error` listener above works precisely because only `load` 280 // is special-cased this way.) Registered on window, this was dead code in 281 // every browser â and with the old app-side refund deleted, the counter 282 // became write-only and two recoveries disarmed the tab for good. 283 // 284 // Boot is read from document.readyState rather than from catching the 285 // window's own load event, so nothing depends on which node that event 286 // targets. 287 document.addEventListener("load", function (e) { 288 if (document.readyState !== "complete") return; 289 var el = e && e.target; 290 if (!el || el.tagName !== "SCRIPT") return; 291 if (String(el.src || "").indexOf(CHUNK_PATH) === -1) return; 292 try { 293 // Only once the previous reload is out of its cooldown. A chunk loading 294 // proves on-demand loading works NOW, but not that the chunk which 295 // failed exists: after a deploy, a still-cached chunk can succeed 296 // seconds before a missing one 404s. Refunding on that alone put the 297 // budget back just in time to grant another reload, once per cooldown, 298 // forever â the loop MAX_RELOADS exists to stop. 299 var last = parseInt(sessionStorage.getItem(RELOAD_KEY) || "0", 10); 300 if (last && Date.now() - last < COOLDOWN) return; 301 var count = parseInt(sessionStorage.getItem(RELOAD_COUNT_KEY) || "0", 10); 302 // Decrement rather than clear: one healthy load buys back one reload, 303 // so an ordinary session restores the full budget while a page that is 304 // only intermittently healthy cannot mint reloads faster than it earns them. 305 if (count > 0) sessionStorage.setItem(RELOAD_COUNT_KEY, String(count - 1)); 306 } catch (e2) {} 307 }, true); 308 } catch (e) {} 309})(); 310</script>
310<script>((e,t,r,n,i,o,s,a)=>{let l=document.documentElement,u=["light","dark"];function c(t){(Array.isArray(e)?e:[e]).forEach(e=>{let r="class"===e,n=r&&o?i.map(e=>o[e]||e):i;r?(l.classList.remove(...n),l.classList.add(o&&o[t]?o[t]:t)):l.setAttribute(e,t)}),a&&u.includes(t)&&(l.style.colorScheme=t)}if(n)c(n);else try{let e=localStorage.getItem(t)||r,n=s&&"system"===e?window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light":e;c(n)}catch(e){}})("class","theme","light",null,["light","dark"],null,true,true)</script>
310<!--$!--><template data-dgst="BAILOUT_TO_CLIENT_SIDE_RENDERING"></template><!--$!--><template data-dgst="BAILOUT_TO_CLIENT_SIDE_RENDERING"></template><div class="min-h-screen bg-background"></div><!--/$--><!--/$--><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed top-0 z-[100] flex max-h-screen w-full flex-col-reverse p-4 sm:bottom-0 sm:right-0 sm:top-auto sm:flex-col md:max-w-[420px]"></ol></div><div id="modal-root"></div>
310<script src="/_next/static/chunks/webpack-8aedbe7cc8adb0fa.js" async=""></script>
310<script>(self.__next_f=self.__next_f||[]).push([0]);self.__next_f.push([2,null])</script>
310<script>self.__next_f.push([1,"1:HL[\"/_next/static/css/e2401df8ba878a79.css\",\"style\"]\n2:HL[\"/_next/static/css/d157ebc6a96f517c.css\",\"style\"]\n3:HL[\"/_next/static/css/cce98443f6ddd1b7.css\",\"style\"]\n"])</script>
310<script>self.__next_f.push([1,"4:I[12846,[],\"\"]\n6:I[19107,[],\"ClientPageRoot\"]\n7:I[38714,[\"9866\",\"static/chunks/b468fba8-b715dafecb1a2e91.js\",\"9990\",\"static/chunks/7c86ec74-729bd8644e93ea96.js\",\"7027\",\"static/chunks/7027-bfc167901d5005a2.js\",\"3664\",\"static/chunks/3664-fa874e4ebd18b076.js\",\"6137\",\"static/chunks/6137-5d86f5908d7baf2e.js\",\"5454\",\"static/chunks/5454-65e694a3990ad67c.js\",\"8001\",\"static/chunks/8001-318a7f1d36852c60.js\",\"3216\",\"static/chunks/3216-1a7b64fce2b3f645.js\",\"2944\",\"static/chunks/2944-5c98c971c0e9ede3.js\",\"3742\",\"static/chunks/3742-c9c3d45a03630dfa.js\",\"4156\",\"static/chunks/4156-943ed681e17dcb17.js\",\"6999\",\"static/chunks/6999-24663f724f9c4665.js\",\"3378\",\"static/chunks/3378-e65cb9eef7e718b0.js\",\"6294\",\"static/chunks/6294-593edf825b9b3eaa.js\",\"1350\",\"static/chunks/1350-94f2269e85bb1c8a.js\",\"7996\",\"static/chunks/app/plans/page-b875ca00713ef13a.js\"],\"default\",1]\n8:I[4707,[],\"\"]\n9:I[36423,[],\"\"]\nb:I[79512,[\"9866\",\"static/chunks/b468fba8-b715dafecb1a2e91.js\",\"9990\",\"static/chunks/7c86ec74-729bd8644e93ea96.js\",\"2420\",\"static/chunks/9081a741-bbd6ecc5e42e1b09.js\",\"9461\",\"static/chunks/41ade5dc-1d3c905065779e82.js\",\"2400\",\"static/chunks/12038df7-00b53010b3c2f4ce.js\",\"5501\",\"static/chunks/c16f53c3-5d3ba4cc55e681ea.js\",\"7027\",\"static/chunks/7027-bfc167901d5005a2.js\",\"3664\",\"static/chunks/3664-fa874e4ebd18b076.js\",\"6137\",\"static/chunks/6137-5d86f5908d7baf2e.js\",\"2972\",\"static/chunks/2972-2cdc4cc651faee4c.js\",\"5454\",\"static/chunks/5454-65e694a3990ad67c.js\",\"8001\",\"static/chunks/8001-318a7f1d36852c60.js\",\"3216\",\"static/chunks/3216-1a7b64fce2b3f645.js\",\"8226\",\"static/chunks/8226-75def72dbb54d0b8.js\",\"8840\",\"static/chunks/8840-75530307d770d75f.js\",\"2944\",\"static/chunks/2944-5c98c971c0e9ede3.js\",\"1218\",\"static/chunks/1218-31291943b6d8b724.js\",\"1312\",\"static/chunks/1312-0d8118164927a2dc.js\",\"3096\",\"static/chunks/3096-b91ee7bf1db39231.js\",\"4417\",\"static/chunks/4417-f066be1134420b74.js\",\"7584\",\"static/chunks/7584-524a70b83e8da07e.js\",\"6025\",\"static/chunks/6025-050aa285af79cfe0.js\",\"8913\",\"static/chunks/8913-2bebb5b7136246e5.js\",\"9159\",\"static/ch"])</script>
310<script>self.__next_f.push([1,"unks/9159-dc19aa9a315d4073.js\",\"5335\",\"static/chunks/5335-db187099cb201763.js\",\"1769\",\"static/chunks/1769-81c6969a73d535cd.js\",\"1027\",\"static/chunks/1027-5bee49fa67d8f0f5.js\",\"6999\",\"static/chunks/6999-24663f724f9c4665.js\",\"3378\",\"static/chunks/3378-e65cb9eef7e718b0.js\",\"2494\",\"static/chunks/2494-a707a87451552825.js\",\"6928\",\"static/chunks/6928-316c402be0dde25c.js\",\"3185\",\"static/chunks/app/layout-4abfa470e0b2d4f1.js\"],\"default\"]\nc:I[22731,[\"9866\",\"static/chunks/b468fba8-b715dafecb1a2e91.js\",\"9990\",\"static/chunks/7c86ec74-729bd8644e93ea96.js\",\"2420\",\"static/chunks/9081a741-bbd6ecc5e42e1b09.js\",\"9461\",\"static/chunks/41ade5dc-1d3c905065779e82.js\",\"2400\",\"static/chunks/12038df7-00b53010b3c2f4ce.js\",\"5501\",\"static/chunks/c16f53c3-5d3ba4cc55e681ea.js\",\"7027\",\"static/chunks/7027-bfc167901d5005a2.js\",\"3664\",\"static/chunks/3664-fa874e4ebd18b076.js\",\"6137\",\"static/chunks/6137-5d86f5908d7baf2e.js\",\"2972\",\"static/chunks/2972-2cdc4cc651faee4c.js\",\"5454\",\"static/chunks/5454-65e694a3990ad67c.js\",\"8001\",\"static/chunks/8001-318a7f1d36852c60.js\",\"3216\",\"static/chunks/3216-1a7b64fce2b3f645.js\",\"8226\",\"static/chunks/8226-75def72dbb54d0b8.js\",\"8840\",\"static/chunks/8840-75530307d770d75f.js\",\"2944\",\"static/chunks/2944-5c98c971c0e9ede3.js\",\"1218\",\"static/chunks/1218-31291943b6d8b724.js\",\"1312\",\"static/chunks/1312-0d8118164927a2dc.js\",\"3096\",\"static/chunks/3096-b91ee7bf1db39231.js\",\"4417\",\"static/chunks/4417-f066be1134420b74.js\",\"7584\",\"static/chunks/7584-524a70b83e8da07e.js\",\"6025\",\"static/chunks/6025-050aa285af79cfe0.js\",\"8913\",\"static/chunks/8913-2bebb5b7136246e5.js\",\"9159\",\"static/chunks/9159-dc19aa9a315d4073.js\",\"5335\",\"static/chunks/5335-db187099cb201763.js\",\"1769\",\"static/chunks/1769-81c6969a73d535cd.js\",\"1027\",\"static/chunks/1027-5bee49fa67d8f0f5.js\",\"6999\",\"static/chunks/6999-24663f724f9c4665.js\",\"3378\",\"static/chunks/3378-e65cb9eef7e718b0.js\",\"2494\",\"static/chunks/2494-a707a87451552825.js\",\"6928\",\"static/chunks/6928-316c402be0dde25c.js\",\"3185\",\"static/chunks/app/layout-4abfa470e0b2d4f1.js\"],\"Providers\"]\nd:\"$Sreact.suspense\"\ne:I"])</script>
310<script>self.__next_f.push([1,"[58214,[\"9866\",\"static/chunks/b468fba8-b715dafecb1a2e91.js\",\"9990\",\"static/chunks/7c86ec74-729bd8644e93ea96.js\",\"2420\",\"static/chunks/9081a741-bbd6ecc5e42e1b09.js\",\"9461\",\"static/chunks/41ade5dc-1d3c905065779e82.js\",\"2400\",\"static/chunks/12038df7-00b53010b3c2f4ce.js\",\"5501\",\"static/chunks/c16f53c3-5d3ba4cc55e681ea.js\",\"7027\",\"static/chunks/7027-bfc167901d5005a2.js\",\"3664\",\"static/chunks/3664-fa874e4ebd18b076.js\",\"6137\",\"static/chunks/6137-5d86f5908d7baf2e.js\",\"2972\",\"static/chunks/2972-2cdc4cc651faee4c.js\",\"5454\",\"static/chunks/5454-65e694a3990ad67c.js\",\"8001\",\"static/chunks/8001-318a7f1d36852c60.js\",\"3216\",\"static/chunks/3216-1a7b64fce2b3f645.js\",\"8226\",\"static/chunks/8226-75def72dbb54d0b8.js\",\"8840\",\"static/chunks/8840-75530307d770d75f.js\",\"2944\",\"static/chunks/2944-5c98c971c0e9ede3.js\",\"1218\",\"static/chunks/1218-31291943b6d8b724.js\",\"1312\",\"static/chunks/1312-0d8118164927a2dc.js\",\"3096\",\"static/chunks/3096-b91ee7bf1db39231.js\",\"4417\",\"static/chunks/4417-f066be1134420b74.js\",\"7584\",\"static/chunks/7584-524a70b83e8da07e.js\",\"6025\",\"static/chunks/6025-050aa285af79cfe0.js\",\"8913\",\"static/chunks/8913-2bebb5b7136246e5.js\",\"9159\",\"static/chunks/9159-dc19aa9a315d4073.js\",\"5335\",\"static/chunks/5335-db187099cb201763.js\",\"1769\",\"static/chunks/1769-81c6969a73d535cd.js\",\"1027\",\"static/chunks/1027-5bee49fa67d8f0f5.js\",\"6999\",\"static/chunks/6999-24663f724f9c4665.js\",\"3378\",\"static/chunks/3378-e65cb9eef7e718b0.js\",\"2494\",\"static/chunks/2494-a707a87451552825.js\",\"6928\",\"static/chunks/6928-316c402be0dde25c.js\",\"3185\",\"static/chunks/app/layout-4abfa470e0b2d4f1.js\"],\"default\"]\nf:I[10376,[\"9866\",\"static/chunks/b468fba8-b715dafecb1a2e91.js\",\"3664\",\"static/chunks/3664-fa874e4ebd18b076.js\",\"2972\",\"static/chunks/2972-2cdc4cc651faee4c.js\",\"5258\",\"static/chunks/5258-e839e1aea0c89ec0.js\",\"7601\",\"static/chunks/app/error-737cfeab25dd0318.js\"],\"default\"]\n10:I[75292,[\"9866\",\"static/chunks/b468fba8-b715dafecb1a2e91.js\",\"2972\",\"static/chunks/2972-2cdc4cc651faee4c.js\",\"2944\",\"static/chunks/2944-5c98c971c0e9ede3.js\",\"9160\",\"static/chunks/app/not-"])</script>
310<script>self.__next_f.push([1,"found-43f4052d83c35dd3.js\"],\"default\"]\n11:I[17574,[\"9866\",\"static/chunks/b468fba8-b715dafecb1a2e91.js\",\"9990\",\"static/chunks/7c86ec74-729bd8644e93ea96.js\",\"2420\",\"static/chunks/9081a741-bbd6ecc5e42e1b09.js\",\"9461\",\"static/chunks/41ade5dc-1d3c905065779e82.js\",\"2400\",\"static/chunks/12038df7-00b53010b3c2f4ce.js\",\"5501\",\"static/chunks/c16f53c3-5d3ba4cc55e681ea.js\",\"7027\",\"static/chunks/7027-bfc167901d5005a2.js\",\"3664\",\"static/chunks/3664-fa874e4ebd18b076.js\",\"6137\",\"static/chunks/6137-5d86f5908d7baf2e.js\",\"2972\",\"static/chunks/2972-2cdc4cc651faee4c.js\",\"5454\",\"static/chunks/5454-65e694a3990ad67c.js\",\"8001\",\"static/chunks/8001-318a7f1d36852c60.js\",\"3216\",\"static/chunks/3216-1a7b64fce2b3f645.js\",\"8226\",\"static/chunks/8226-75def72dbb54d0b8.js\",\"8840\",\"static/chunks/8840-75530307d770d75f.js\",\"2944\",\"static/chunks/2944-5c98c971c0e9ede3.js\",\"1218\",\"static/chunks/1218-31291943b6d8b724.js\",\"1312\",\"static/chunks/1312-0d8118164927a2dc.js\",\"3096\",\"static/chunks/3096-b91ee7bf1db39231.js\",\"4417\",\"static/chunks/4417-f066be1134420b74.js\",\"7584\",\"static/chunks/7584-524a70b83e8da07e.js\",\"6025\",\"static/chunks/6025-050aa285af79cfe0.js\",\"8913\",\"static/chunks/8913-2bebb5b7136246e5.js\",\"9159\",\"static/chunks/9159-dc19aa9a315d4073.js\",\"5335\",\"static/chunks/5335-db187099cb201763.js\",\"1769\",\"static/chunks/1769-81c6969a73d535cd.js\",\"1027\",\"static/chunks/1027-5bee49fa67d8f0f5.js\",\"6999\",\"static/chunks/6999-24663f724f9c4665.js\",\"3378\",\"static/chunks/3378-e65cb9eef7e718b0.js\",\"2494\",\"static/chunks/2494-a707a87451552825.js\",\"6928\",\"static/chunks/6928-316c402be0dde25c.js\",\"3185\",\"static/chunks/app/layout-4abfa470e0b2d4f1.js\"],\"default\"]\n12:I[88003,[\"9866\",\"static/chunks/b468fba8-b715dafecb1a2e91.js\",\"9990\",\"static/chunks/7c86ec74-729bd8644e93ea96.js\",\"2420\",\"static/chunks/9081a741-bbd6ecc5e42e1b09.js\",\"9461\",\"static/chunks/41ade5dc-1d3c905065779e82.js\",\"2400\",\"static/chunks/12038df7-00b53010b3c2f4ce.js\",\"5501\",\"static/chunks/c16f53c3-5d3ba4cc55e681ea.js\",\"7027\",\"static/chunks/7027-bfc167901d5005a2.js\",\"3664\",\"static/chunks/3664-fa874e4ebd18b076.js\""])</script>
310<script>self.__next_f.push([1,",\"6137\",\"static/chunks/6137-5d86f5908d7baf2e.js\",\"2972\",\"static/chunks/2972-2cdc4cc651faee4c.js\",\"5454\",\"static/chunks/5454-65e694a3990ad67c.js\",\"8001\",\"static/chunks/8001-318a7f1d36852c60.js\",\"3216\",\"static/chunks/3216-1a7b64fce2b3f645.js\",\"8226\",\"static/chunks/8226-75def72dbb54d0b8.js\",\"8840\",\"static/chunks/8840-75530307d770d75f.js\",\"2944\",\"static/chunks/2944-5c98c971c0e9ede3.js\",\"1218\",\"static/chunks/1218-31291943b6d8b724.js\",\"1312\",\"static/chunks/1312-0d8118164927a2dc.js\",\"3096\",\"static/chunks/3096-b91ee7bf1db39231.js\",\"4417\",\"static/chunks/4417-f066be1134420b74.js\",\"7584\",\"static/chunks/7584-524a70b83e8da07e.js\",\"6025\",\"static/chunks/6025-050aa285af79cfe0.js\",\"8913\",\"static/chunks/8913-2bebb5b7136246e5.js\",\"9159\",\"static/chunks/9159-dc19aa9a315d4073.js\",\"5335\",\"static/chunks/5335-db187099cb201763.js\",\"1769\",\"static/chunks/1769-81c6969a73d535cd.js\",\"1027\",\"static/chunks/1027-5bee49fa67d8f0f5.js\",\"6999\",\"static/chunks/6999-24663f724f9c4665.js\",\"3378\",\"static/chunks/3378-e65cb9eef7e718b0.js\",\"2494\",\"static/chunks/2494-a707a87451552825.js\",\"6928\",\"static/chunks/6928-316c402be0dde25c.js\",\"3185\",\"static/chunks/app/layout-4abfa470e0b2d4f1.js\"],\"\"]\n15:I[21667,[\"9866\",\"static/chunks/b468fba8-b715dafecb1a2e91.js\",\"5258\",\"static/chunks/5258-e839e1aea0c89ec0.js\",\"6470\",\"static/chunks/app/global-error-22b700288e8fcdb4.js\"],\"default\"]\na:T3eb8,"])</script>
310<script>self.__next_f.push([1,"(function () {\r\n try {\r\n var RELOAD_KEY = \"alpx_chunk_reload_at\";\r\n var RELOAD_COUNT_KEY = \"alpx_chunk_reload_count\";\r\n var RECOVERED_KEY = \"alpx_chunk_recovered\";\r\n var COOLDOWN = 60000;\r\n // A reload only fixes a stale build. If two of them did not, the page is broken\r\n // for another reason and reloading again would just trap the user. The counter\r\n // is cleared on a successful boot (src/app/providers.tsx).\r\n var MAX_RELOADS = 2;\r\n var CLEANUP_TIMEOUT = 1500;\r\n var CHUNK_PATH = \"/_next/static/chunks/\";\r\n var WEBPACK_RUNTIME = \"/_next/static/chunks/webpack-\";\r\n\r\n // Reading window.caches (or calling keys()) throws SecurityError outright in\r\n // some private/sandboxed contexts. This block runs at top level, so an\r\n // unguarded throw here unwinds past the listener registration at the bottom\r\n // and silently disables the whole mechanism for that user.\r\n try {\r\n if (\"serviceWorker\" in navigator) {\r\n navigator.serviceWorker.getRegistrations().then(function (regs) {\r\n regs.forEach(function (r) { r.unregister(); });\r\n }).catch(function () {});\r\n }\r\n // Independent of the service worker, exactly as purgeCaches() below treats\r\n // them: a webview can expose the Cache API without navigator.serviceWorker,\r\n // and nesting this meant the startup purge â the one that runs BEFORE\r\n // anything loads â skipped a poisoned cache entry entirely, leaving it to\r\n // be cleaned only after a crash had already reached recover().\r\n if (window.caches \u0026\u0026 window.caches.keys) {\r\n window.caches.keys().then(function (keys) {\r\n keys.forEach(function (k) { window.caches.delete(k); });\r\n }).catch(function () {});\r\n }\r\n } catch (e) {}\r\n\r\n function isStaleChunkError(msg) {\r\n var s = String(msg);\r\n // JSON.parse of an HTML error body (e.g. an API 404/502 page) also says\r\n // \"Unexpected token '\u003c'\" but is not a stale chunk â reloading would\r\n // discard user state and pollute the recovery metric.\r\n if (/is not valid JSON/.test(s)) return false;\r\n // \\S+ for the chunk id: an app-router chunk is named by path\r\n // (\"app/alpha-ai/page\"), which [\\w-]+ would not match.\r\n return /Unexpected token '\u003c'|Loading (?:CSS )?chunk \\S+ failed|ChunkLoadError/.test(s);\r\n }\r\n\r\n // A deploy replaces every hashed chunk, so a tab still running the previous build\r\n // 404s on the files it asks for. webpack keeps going and calls modules[id].call()\r\n // for a module that never registered, which throws from inside its bootstrap.\r\n function isModuleRegistryMiss(msg, origin) {\r\n var s = String(msg);\r\n var miss = /Cannot read properties of undefined \\(reading 'call'\\)/.test(s) ||\r\n /undefined is not an object \\(evaluating '\\w+\\[\\w+\\]\\.call'\\)/.test(s) ||\r\n /\\w+\\[\\w+\\] is undefined/.test(s);\r\n // These are ordinary TypeErrors. They only mean \"this build's module registry is\r\n // inconsistent\" when webpack's bootstrap is the frame that THREW â a plain bug in\r\n // a lazily loaded module also has the runtime somewhere in its stack, and\r\n // reloading on that would just replay the bug and cost the user their state.\r\n return miss \u0026\u0026 String(origin).indexOf(WEBPACK_RUNTIME) !== -1;\r\n }\r\n\r\n /** The file the error was thrown from: onerror hands it over, a rejection only has a stack. */\r\n function originOf(filename, stack) {\r\n if (filename) return String(filename);\r\n var lines = String(stack || \"\").split(\"\\n\");\r\n for (var i = 0; i \u003c lines.length; i++) {\r\n if (lines[i].indexOf(\"/_next/static/\") !== -1) return lines[i];\r\n }\r\n return \"\";\r\n }\r\n\r\n function classify(msg, filename, stack) {\r\n if (!msg) return null;\r\n if (isStaleChunkError(msg)) return \"chunk_load_error\";\r\n if (isModuleRegistryMiss(msg, originOf(filename, stack))) return \"module_registry_miss\";\r\n return null;\r\n }\r\n\r\n /**\r\n * Takes one reload out of this tab's budget.\r\n *\r\n * Returns the epoch at which a reload could next be permitted: 0 when this\r\n * claim SUCCEEDED, a future timestamp while merely cooling down, and\r\n * Infinity when the budget is spent or storage is unreadable (with no\r\n * storage there is no way to count reloads, and a reload we cannot count is\r\n * a reload loop). The caller needs the three cases apart â a refusal that\r\n * expires must not suppress the page for as long as one that never will.\r\n */\r\n function claimReload() {\r\n var now = Date.now();\r\n var last, count;
310\r\n try {\r\n last = parseInt(sessionStorage.getItem(RELOAD_KEY) || \"0\", 10);\r\n count = parseInt(sessionStorage.getItem(RELOAD_COUNT_KEY) || \"0\", 10);\r\n if (now - last \u003c COOLDOWN) return last + COOLDOWN;\r\n if (count \u003e= MAX_RELOADS) return Infinity;\r\n sessionStorage.setItem(RELOAD_KEY, String(now));\r\n sessionStorage.setItem(RELOAD_COUNT_KEY, String(count + 1));\r\n } catch (e) {\r\n return Infinity;\r\n }\r\n return 0;\r\n }\r\n\r\n // Marker for the app to report to PostHog after the reload (this script runs\r\n // before analytics load). `recovered: false` means the page was left broken.\r\n function mark(reason, msg, recovered) {\r\n // The marker written before a reload survives into the next document and\r\n // waits there until the reporter has posthog loaded. A give-up landing in\r\n // that window overwrites it â and it SHOULD: a chunk failing again in the\r\n // document the reload produced is the proof that the reload did not fix\r\n // the page. Refusing the overwrite (what this guard used to do) filed\r\n // exactly those tabs as clean recoveries, and swallowed the wake-up below\r\n // with them, so the cohort that stayed broken was the one that vanished.\r\n //\r\n // What the overwrite must not lose is that a reload happened at all, so\r\n // carry its timestamp over as `reloadedAt`. The drain reads it to separate\r\n // two give-ups that used to be indistinguishable: out of budget having\r\n // never reloaded, versus reloaded, landed, and broken all the same.\r\n //\r\n // Bursts within ONE document never reach here â `latchedUntil` returns\r\n // before the second failure â so this only ever decides across documents.\r\n var reloadedAt;\r\n if (!recovered) {\r\n try {\r\n var pending = sessionStorage.getItem(RECOVERED_KEY);\r\n if (pending) {\r\n var prev = JSON.parse(pending);\r\n reloadedAt = prev.recovered === true ? prev.at : prev.reloadedAt;\r\n }\r\n } catch (e) {}\r\n }\r\n try {\r\n sessionStorage.setItem(RECOVERED_KEY, JSON.stringify({\r\n message: String(msg).slice(0, 300),\r\n reason: reason,\r\n recovered: recovered,\r\n // Dropped from the JSON when undefined, i.e. when no reload preceded this.\r\n reloadedAt: reloadedAt,\r\n path: window.location.pathname,\r\n at: Date.now()\r\n }));\r\n } catch (e) {}\r\n // A give-up writes the marker and does NOT reload, so nothing would surface\r\n // it until the user happened to navigate â sometimes hours later, by which\r\n // point its timing is meaningless. Wake the reporter, which is alive in this\r\n // same document, so the event is filed while it still describes something.\r\n if (!recovered) {\r\n try { window.dispatchEvent(new Event(\"alpx:chunk-marker\")); } catch (e) {}\r\n }\r\n }\r\n\r\n function purgeCaches() {\r\n var tasks = [];\r\n if (\"serviceWorker\" in navigator) {\r\n tasks.push(navigator.serviceWorker.getRegistrations().then(function (regs) {\r\n return Promise.all(regs.map(function (r) { return r.unregister(); }));\r\n }));\r\n }\r\n if (window.caches \u0026\u0026 window.caches.keys) {\r\n tasks.push(window.caches.keys().then(function (keys) {\r\n return Promise.all(keys.map(function (k) { return window.caches.delete(k); }));\r\n }));\r\n }\r\n return Promise.all(tasks);\r\n }\r\n\r\n // A wedged service worker is one of the things we may be cleaning up, so never let\r\n // its promise decide whether the page reloads.\r\n function settleWithin(promise, ms) {\r\n return new Promise(function (resolve) {\r\n var timer = setTimeout(resolve, ms);\r\n var done = function () { clearTimeout(timer); resolve(); };\r\n promise.then(done, done);\r\n });\r\n }\r\n\r\n // A stale build rarely fails once: every \u003cscript\u003e the page still asks for 404s,\r\n // and webpack trips over each missing module in turn. They are all one event, so\r\n // the first one decides for the page â the reload it schedules fixes every later\r\n // failure too, and its message is the one that diagnoses the build.\r\n //\r\n // Without this latch the second failure reaches claimReload(), is turned away by\r\n // the cooldown the first one just armed, and overwrites the pending\r\n // `recovered: true` marker with `false` â reporting a recovery that did happen as\r\n // a page left broken. The same overwrite spoils the give-up path, where the\r\n // marker ends up describing the last chunk to fail rather than the first.\r\n // Time-boxed, NOT permanent: this tab may live for hours across several\r\n // deploys. A latch that never lifts would let the first burst disable\r\n // recovery for the rest of the session â no reload and no marker, so a page\r\n // broken by a later deploy is both unfixed and invisible in the metric.\r\n //\r\n // The latch expires exactly when a reload could next be permitted, which is\r\n // NOT the same as one cooldown from now. Arming it with `now` on a refusal\r\n // created a dead window: a failure at T+30s (refused, 30s into the previous\r\n // reload's cooldown) latched until T+90s, so the genuinely new failure at\r\n // T+65s â which the budget WOULD have granted â got neither a reload nor a\r\n // marker. The page stayed broken and invisible for the gap.\r\n var latchedUntil = 0;\r\n\r\n function recover(reason, msg) {\r\n var now = Date.now();\r\n if (now \u003c latchedUntil) return;\r\n var nextAllowedAt = claimReload();\r\n if (nextAllowedAt !== 0) {\r\n // Refused. Hold only until the refusal itself expires, so the next real\r\n // opportunity is not swallowed by our own latch â and never longer than\r\n // one cooldown, because claimReload returns Infinity for a spent budget\r\n // or unreadable storage, and assigning that straight in made the latch\r\n // permanent. That is the very thing the paragraph above forbids: a tab\r\n // that lives across several deploys would go silent for the rest of the\r\n // session, unfixed AND invisible in the metric.\r\n latchedUntil = Math.min(nextAllowedAt, now + COOLDOWN);\r\n // Out of budget: the page stays broken, so leave a trail instead of vanishing\r\n // from the metric â a drop in recoveries w
310ould otherwise read as \"fixed\".\r\n mark(reason, msg, false);\r\n return;\r\n }\r\n // Granted: this page is reloading, and the whole burst is one event.\r\n latchedUntil = now + COOLDOWN;\r\n mark(reason, msg, true);\r\n // The latch means this is the page's only chance to reload, so the reload must\r\n // not depend on the cleanup succeeding: a synchronous throw out of purgeCaches\r\n // (blocked storage, a SecurityError from caches.keys) would otherwise leave the\r\n // tab broken with the marker claiming it recovered.\r\n try {\r\n settleWithin(purgeCaches(), CLEANUP_TIMEOUT).then(function () {\r\n window.location.reload();\r\n });\r\n } catch (e) {\r\n window.location.reload();\r\n }\r\n }\r\n\r\n // Capture phase: a chunk that 404s fires an error event on the \u003cscript\u003e element\r\n // itself and never bubbles. This is the most direct evidence that this build's\r\n // files are gone from the CDN â it arrives before webpack trips over the missing\r\n // module. Scripts only: a failed \u003clink\u003e preload (CSS, fonts) does not break the\r\n // page, and reloading on one would throw away whatever the user was doing.\r\n window.addEventListener(\"error\", function (e) {\r\n var el = e \u0026\u0026 e.target;\r\n if (el \u0026\u0026 el !== window) {\r\n if (el.tagName === \"SCRIPT\" \u0026\u0026 String(el.src || \"\").indexOf(CHUNK_PATH) !== -1) {\r\n recover(\"chunk_asset_failed\", el.src);\r\n }\r\n return;\r\n }\r\n var err = e \u0026\u0026 e.error;\r\n var msg = e \u0026\u0026 (e.message || (err \u0026\u0026 err.message));\r\n var reason = classify(msg, e \u0026\u0026 e.filename, err \u0026\u0026 err.stack);\r\n if (reason) recover(reason, msg);\r\n }, true);\r\n\r\n window.addEventListener(\"unhandledrejection\", function (e) {\r\n var r = e \u0026\u0026 e.reason;\r\n var msg = r \u0026\u0026 (r.message || r);\r\n var reason = classify(msg, null, r \u0026\u0026 r.stack);\r\n if (reason) recover(reason, msg);\r\n });\r\n\r\n // Refund the reload budget on the only evidence that actually settles the\r\n // question: a chunk this document requested AFTER boot loading successfully.\r\n //\r\n // MAX_RELOADS exists so a page a reload cannot fix does not trap the user in\r\n // a loop, and sessionStorage keeps the count for the life of the tab â so\r\n // something has to give it back, or two recoveries disarm recovery for good.\r\n // Every time-based attempt at that was wrong in both directions: shorter than\r\n // COOLDOWN the cap could never accumulate (a blocked client looped forever at\r\n // one reload per minute, each writing a false recovery), and longer it\r\n // stranded users who leave before the timer.\r\n //\r\n // A lazily loaded chunk arriving is the proof itself: it is exactly the\r\n // operation that was failing. Scripts injected during boot are excluded via\r\n // the load event, so only genuine on-demand loads count.\r\n // On DOCUMENT, not window. A `load` event on an element never reaches a\r\n // window listener even in the capture phase: the HTML spec's \"get the\r\n // parent\" returns null for `load`, so propagation stops at the Document.\r\n // (The sibling `error` listener above works precisely because only `load`\r\n // is special-cased this way.) Registered on window, this was dead code in\r\n // every browser â and with the old app-side refund deleted, the counter\r\n // became write-only and two recoveries disarmed the tab for good.\r\n //\r\n // Boot is read from document.readyState rather than from catching the\r\n // window's own load event, so nothing depends on which node that event\r\n // targets.\r\n document.addEventListener(\"load\", function (e) {\r\n if (document.readyState !== \"complete\") return;\r\n var el = e \u0026\u0026 e.target;\r\n if (!el || el.tagName !== \"SCRIPT\") return;\r\n if (String(el.src || \"\").indexOf(CHUNK_PATH) === -1) return;
310\r\n try {\r\n // Only once the previous reload is out of its cooldown. A chunk loading\r\n // proves on-demand loading works NOW, but not that the chunk which\r\n // failed exists: after a deploy, a still-cached chunk can succeed\r\n // seconds before a missing one 404s. Refunding on that alone put the\r\n // budget back just in time to grant another reload, once per cooldown,\r\n // forever â the loop MAX_RELOADS exists to stop.\r\n var last = parseInt(sessionStorage.getItem(RELOAD_KEY) || \"0\", 10);\r\n if (last \u0026\u0026 Date.now() - last \u003c COOLDOWN) return;\r\n var count = parseInt(sessionStorage.getItem(RELOAD_COUNT_KEY) || \"0\", 10);\r\n // Decrement rather than clear: one healthy load buys back one reload,\r\n // so an ordinary session restores the full budget while a page that is\r\n // only intermittently healthy cannot mint reloads faster than it earns them.\r\n if (count \u003e 0) sessionStorage.setItem(RELOAD_COUNT_KEY, String(count - 1));\r\n } catch (e2) {}\r\n }, true);\r\n } catch (e) {}\r\n})();\r\n"])</script>
310<script>self.__next_f.push([1,"13:T48b,\n function initApollo(){\n try {\n var n=Math.random().toString(36).substring(7),\n o=document.createElement(\"script\");\n o.src=\"https://assets.apollo.io/micro/website-tracker/tracker.iife.js?nocache=\"+n;\n o.async=true;\n o.defer=true;\n o.onload=function(){\n try {\n if(window.trackingFunctions \u0026\u0026 typeof window.trackingFunctions.onLoad === 'function'){\n window.trackingFunctions.onLoad({appId:\"68f18c16228de600152d705d\"});\n }\n } catch(e) {\n // Silently fail - tracking errors should not break the app\n }\n };\n o.onerror=function(){\n // Silently fail if script fails to load\n };\n document.head.appendChild(o);\n } catch(e) {\n // Silently fail - tracking initialization errors should not break the app\n }\n }\n initApollo();\n 16:[]\n"])</script>
310<script>self.__next_f.push([1,"0:[\"$\",\"$L4\",null,{\"buildId\":\"1jNxUOwfxs7uY78ME0p2b\",\"assetPrefix\":\"\",\"urlParts\":[\"\",\"plans\"],\"initialTree\":[\"\",{\"children\":[\"plans\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",true],\"initialSeedData\":[\"\",{\"children\":[\"plans\",{\"children\":[\"__PAGE__\",{},[[\"$L5\",[\"$\",\"$L6\",null,{\"props\":{\"params\":{},\"searchParams\":{}},\"Component\":\"$7\"}],null],null],null]},[null,[\"$\",\"$L8\",null,{\"parallelRouterKey\":\"children\",\"segmentPath\":[\"children\",\"plans\",\"children\"],\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L9\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"notFoundStyles\":\"$undefined\"}]],null]},[[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/e2401df8ba878a79.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\"}],[\"$\",\"link\",\"1\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/d157ebc6a96f517c.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\"}],[\"$\",\"link\",\"2\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/cce98443f6ddd1b7.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"suppressHydrationWarning\":true,\"className\":\"overflow-hidden\",\"children\":[\"$\",\"body\",null,{\"className\":\"__className_f367f3 min-h-screen bg-background text-foreground antialiased\",\"suppressHydrationWarning\":true,\"children\":[[\"$\",\"link\",null,{\"rel\":\"preconnect\",\"href\":\"https://securetoken.googleapis.com\",\"crossOrigin\":\"anonymous\"}],[\"$\",\"link\",null,{\"rel\":\"preconnect\",\"href\":\"https://identitytoolkit.googleapis.com\",\"crossOrigin\":\"anonymous\"}],[\"$\",\"link\",null,{\"rel\":\"preconnect\",\"href\":\"https://alphractal-api-v2-adfjc9cee0ejhdc9.eastus-01.azurewebsites.net\",\"crossOrigin\":\"anonymous\"}],[\"$\",\"link\",null,{\"rel\":\"dns-prefetch\",\"href\":\"https://securetoken.googleapis.com\"}],[\"$\",\"link\",null,{\"rel\":\"dns-prefetch\",\"href\":\"https://identitytoolkit.googleapis.com\"}],[\"$\",\"link\",null,{\"rel\":\"dns-prefetch\",\"href\":\"https://alphractal-api-v2-adfjc9cee0ejhdc9.eastus-01.azurewebsites.net\"}],[\"$\",\"script\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"$a\"}}],[\"$\",\"$Lb\",null,{}],[\"$\",\"$Lc\",null,{\"children\":[[\"$\",\"$d\",null,{\"fallback\":[\"$\",\"div\",null,{\"className\":\"min-h-screen bg-background\"}],\"children\":[\"$\",\"$Le\",null,{\"children\":[\"$\",\"$L8\",null,{\"parallelRouterKey\":\"children\",\"segmentPath\":[\"children\"],\"error\":\"$f\",\"errorStyles\":[],\"errorScripts\":[],\"template\":[\"$\",\"$L9\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[\"$\",\"$L10\",null,{}],\"notFoundStyles\":[]}]}]}],[\"$\",\"$L11\",null,{}]]}],[\"$\",\"div\",null,{\"id\":\"modal-root\"}],[\"$\",\"$L12\",null,{\"id\":\"apollo-tracker\",\"strategy\":\"afterInteractive\",\"dangerouslySetInnerHTML\":{\"__html\":\"$13\"}}]]}]}]],null],null],\"couldBeIntercepted\":false,\"initialHead\":[null,\"$L14\"],\"globalErrorComponent\":\"$15\",\"missingSlots\":\"$W16\"}]\n"])</script>
310<script>self.__next_f.push([1,"14:[[\"$\",\"meta\",\"0\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no\"}],[\"$\",\"meta\",\"1\",{\"name\":\"theme-color\",\"content\":\"#000000\"}],[\"$\",\"meta\",\"2\",{\"charSet\":\"utf-8\"}],[\"$\",\"title\",\"3\",{\"children\":\"Alphractal | Crypto Analytics Platform for On-Chain, Derivatives \u0026 Macro Data\"}],[\"$\",\"meta\",\"4\",{\"name\":\"description\",\"content\":\"Alphractal is a crypto analytics platform combining over 1,500 metrics across on-chain, derivatives, sentiment, and macroeconomics.\"}],[\"$\",\"link\",\"5\",{\"rel\":\"manifest\",\"href\":\"/manifest.json\",\"crossOrigin\":\"use-credentials\"}],[\"$\",\"meta\",\"6\",{\"name\":\"apple-mobile-web-app-capable\",\"content\":\"yes\"}],[\"$\",\"meta\",\"7\",{\"name\":\"apple-mobile-web-app-status-bar-style\",\"content\":\"black-translucent\"}],[\"$\",\"meta\",\"8\",{\"property\":\"og:title\",\"content\":\"Alphractal | Crypto Analytics Platform for On-Chain, Derivatives \u0026 Macro Data\"}],[\"$\",\"meta\",\"9\",{\"property\":\"og:description\",\"content\":\"Alphractal is a crypto analytics platform combining over 1,500 metrics across on-chain, derivatives, sentiment, and macroeconomics.\"}],[\"$\",\"meta\",\"10\",{\"property\":\"og:url\",\"content\":\"https://app.alphractal.com/\"}],[\"$\",\"meta\",\"11\",{\"property\":\"og:image\",\"content\":\"https://app.alphractal.com/BannerAlphractal.png\"}],[\"$\",\"meta\",\"12\",{\"property\":\"og:image:width\",\"content\":\"1200\"}],[\"$\",\"meta\",\"13\",{\"property\":\"og:image:height\",\"content\":\"630\"}],[\"$\",\"meta\",\"14\",{\"property\":\"og:image:alt\",\"content\":\"Alphractal - Cryptocurrency Analysis Platform\"}],[\"$\",\"meta\",\"15\",{\"property\":\"og:type\",\"content\":\"website\"}],[\"$\",\"meta\",\"16\",{\"name\":\"twitter:card\",\"content\":\"summary_large_image\"}],[\"$\",\"meta\",\"17\",{\"name\":\"twitter:title\",\"content\":\"Alphractal | Crypto Analytics Platform for On-Chain, Derivatives \u0026 Macro Data\"}],[\"$\",\"meta\",\"18\",{\"name\":\"twitter:description\",\"content\":\"Alphractal is a crypto analytics platform combining over 1,500 metrics across on-chain, derivatives, sentiment, and macroeconomics.\"}],[\"$\",\"meta\",\"19\",{\"name\":\"twitter:image\",\"content\":\"https://app.alphractal.com/BannerAlphractal.png\"}],[\"$\",\"link\",\"20\",{\"rel\":\"shortcut icon\",\"href\":\"/FavIconAlphractal.png\"}],[\"$\",\"link\",\"21\",{\"rel\":\"icon\",\"href\":\"/FavIconAlphractal.png\"}],[\"$\",\"link\",\"22\",{\"rel\":\"apple-touch-icon\",\"href\":\"/FavIconAlphractal.png\"}]]\n"])</script>
310<script>self.__next_f.push([1,"5:null\n"])</script>
310</body></html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.