1<!doctype html> 2<html lang="en"> 3 <head> 4 <meta charset="UTF-8" /> 5 <link rel="icon" href="/_genesis/assets/favicon" /> 6 <meta name="viewport" content="width=device-width, initial-scale=1.0" /> 7 <title>Termux Package Portal - Built with Taskade</title> 8 9
9<script> 10 (function() { 11 var esc = function(s) { return String(s).replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>'); }; 12 var errorHtml = function(msg, id) { 13 return '<div style="position:fixed;inset:0;background:#000;padding:2rem;font-family:system-ui,sans-serif;color:#fff;overflow:auto">' + 14 '<div style="max-width:600px;margin:0 auto">' + 15 '<h2 style="margin:0 0 0.5rem;font-size:1.25rem">Something went wrong</h2>' + 16 '<p style="color:#999;margin:0 0 1rem;font-size:0.95rem">The app failed to load. Try refreshing the page.</p>' + 17 '<pre style="background:#1a1a1a;padding:1rem;border-radius:8px;overflow:auto;font-size:0.8rem;color:#f87171;margin:0;white-space:pre-wrap;word-break:break-word">' + 18 esc(msg) + '<\/pre>' + 19 '<p style="color:#666;margin:1rem 0 0;font-size:0.75rem">Error ID: <code>' + esc(id) + '<\/code><\/p>' + 20 '<\/div><\/div>'; 21 }; 22 var reported = false; 23 var errorId = null; 24 function getErrorId() { 25 if (errorId != null) return errorId; 26 try { 27 if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') { errorId = crypto.randomUUID().replace(/-/g, ''); return errorId; } 28 } catch (e) { /* Fall through to the time+random id below */ } 29 errorId = Date.now().toString(36) + Math.random().toString(36).slice(2, 12); 30 return errorId; 31 } 32 function reportError(code, msg, stack) { 33 if (reported) return; 34 reported = true; 35 try { 36 var logger = window.__TASKADE_APP_LIFECYCLE_LOGGER__; 37 if (typeof logger?.log === 'function') { 38 logger.log({ level: 'error', message: 'Runtime Error', data: { code: code, message: msg, stack: stack || '' } }); 39 return; 40 } 41 // Published: no logger, so beacon to the Taskade gateway instead of 42 // dropping the crash on the floor (#27626). Relative path â the 43 // Director proxy injects the gateway token server-side. Once per page 44 // session (the latch above) so a crash loop cannot flood the sink. 45 fetch('/api/taskade/telemetry/errors', { 46 method: 'POST', 47 headers: { 'Content-Type': 'application/json' }, 48 body: JSON.stringify({ 49 errorId: getErrorId(), 50 code: code, 51 message: String(msg || 'Unknown error').slice(0, 4000), 52 stack: String(stack || '').slice(0, 20000), 53 path: location.pathname.slice(0, 1000),
54 userAgent: navigator.userAgent.slice(0, 512) 55 }), 56 keepalive: true 57 // Default same-origin credentials: a password-protected app gates 58 // /api/taskade/* on its signed access cookie, so omitting them 59 // would redirect the beacon to the password page. 60 }).catch(function() {}); 61 } catch (e) { /* Swallow â never block the fallback error UI */ } 62 } 63 function showError(code, msg, stack) { 64 var root = document.getElementById('root'); 65 if (!root) return; 66 var spinner = root.querySelector('.genesis__spinner-container'); 67 if (spinner) { 68 // Scenario 1: React never mounted â replace spinner 69 reportError('error.fatal', msg, stack); 70 spinner.outerHTML = errorHtml(msg, getErrorId()); 71 } else if (!root.childElementCount) { 72 // Scenario 2: React crashed and unmounted â #root is empty 73 reportError('error.fatal', msg, stack); 74 root.innerHTML = errorHtml(msg, getErrorId()); 75 } else { 76 // React is running fine â don't interfere with the DOM, 77 // but still report with the original code for diagnostics 78 reportError(code, msg, stack); 79 } 80 } 81 window.addEventListener('error', function(e) { 82 var msg = e.message || String(e.error) || 'Unknown error'; 83 var stack = e.error && e.error.stack ? e.error.stack : (e.filename ? e.filename + ':' + e.lineno + ':' + e.colno : ''); 84 showError('error.runtime_error', msg, stack); 85 }); 86 window.addEventListener('unhandledrejection', function(e) { 87 var msg = e.reason ? String(e.reason) : 'Unhandled promise rejection'; 88 var stack = e.reason && e.reason.stack ? e.reason.stack : ''; 89 showError('error.unhandled_promise', msg, stack); 90 }); 91 // A dead <img> degrades to a neutral placeholder instead of painting its 92 // raw alt string across the page (#27730) â the symptom half of the 93 // fabricated-hot-link fix, and the only half that helps an ALREADY 94 // published app, whose images can rot long after generation. 95 // 96 // Resource load errors do not bubble, so they reach window only in the 97 // CAPTURE phase. That is why neither handler above has ever seen one, and 98 // why this cannot disturb them: a broken image must never render the fatal 99 // error overlay or spend the once-per-session crash beacon. 100 // 101 // Swapping in a 1x1 transparent GIF is what actually stops the alt text â 102 // the element becomes a SUCCESSFUL load, so the browser has no broken image 103 // to caption, while the alt attribute stays for assistive tech. Layout is 104 // untouched: the app's own width/height/aspect classes still apply. The grey 105 // is translucent so it reads correctly on a light or a dark surface without 106 // this script having to know the app's theme. 107 var deadImagePixel = 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7'; 108 window.addEventListener('error', function(e) { 109 var el = e.target; 110 if (!el || el.tagName !== 'IMG') return; 111 // The swap fires a fresh load on the same element, so the latch is what 112 // keeps a failing data URI from looping. 113 if (el.getAttribute('data-genesis-image-fallback') !== null) return; 114 el.setAttribute('data-genesis-image-fallback', ''); 115 el.removeAttribute('srcset'); 116 el.src = deadImagePixel; 117 el.style.background = 'linear-gradient(135deg, rgba(127,127,127,0.16), rgba(127,127,127,0.28))'; 118 }, true); 119 })(); 120 </script>
120 121 <style> 122 /* Genesis spinner styles */ 123 .genesis__spinner-container { 124 position: fixed; 125 inset: 0; 126 background: #000000; 127 display: flex; 128 align-items: center; 129 justify-content: center; 130 z-index: 9999; 131 } 132 133 .genesis__spinner-ring { 134 width: 20px; 135 height: 20px; 136 border: 1.5px solid transparent; 137 border-top: 1.5px solid rgba(255, 255, 255, 0.6); 138 border-radius: 50%; 139 animation: genesis__spin 1s linear infinite; 140 } 141 142 @keyframes genesis__spin { 143 0% { transform: rotate(0deg); } 144 100% { transform: rotate(360deg); } 145 } 146 147 /* Respect reduced motion preferences */ 148 @media (prefers-reduced-motion: reduce) { 149 .genesis__spinner-ring { 150 animation: none; 151 border-top-color: rgba(255, 255, 255, 0.9); 152 } 153 } 154 </style> 155 156 157
158<script type="module" src="/assets/main-XHAIF7MT.js"></script>
vendor: 1 bytes, line 158
158
159<script type="module" src="/chunks/highlighted-body-OFNGDK62-42TLYF6L.js"></script>
vendor: 1 bytes, line 159
159
160<script type="module" src="/chunks/mermaid-GHXKKRXX-A4AAMARR.js"></script>
vendor: 1 bytes, line 160
160
161<script type="module" src="/chunks/ExplorerPage-FWUTXF6T.js"></script>
vendor: 1 bytes, line 161
161
162<script type="module" src="/chunks/chunk-WGBE7G63.js"></script>
vendor: 1 bytes, line 162
162
163<script type="module" src="/chunks/chunk-6VKH6YVR.js"></script>
163 164 165 166<link rel="stylesheet" href="/assets/main-CECVHQKT.css" /> 167 <meta charset="utf-8" /><meta name="language" content="en-US" /><meta name="robots" content="index" /><meta name="author" content="Taskade" /><link rel="icon" sizes="32x32" href="/_genesis/assets/favicon" /><link rel="apple-touch-icon" sizes="180x180" href="/_genesis/assets/favicon" /><meta name="title" content="Termux Package Portal - Built with Taskade" /><meta property="og:title" content="Termux Package Portal - Built with Taskade" /><meta name="twitter:title" content="Termux Package Portal - Built with Taskade" /><meta name="description" content="A living app built with Taskade Genesis. One prompt, one app. Projects remember, agents learn, and workflows move." /><meta property="og:description" content="A living app built with Taskade Genesis. One prompt, one app. Projects remember, agents learn, and workflows move." /><meta name="twitter:description" content="A living app built with Taskade Genesis. One prompt, one app. Projects remember, agents learn, and workflows move." /><meta property="og:type" content="website" /><meta property="og:url" content="https://termux-package-portal-8066.taskade.app" /><meta property="og:site_name" content="Taskade" /><meta property="og:image" content="https://termux-package-portal-8066.taskade.app/_internal/screenshot" /><meta property="og:image:alt" content="Termux Package Portal - Built with Taskade - A living app built with Taskade Genesis. One prompt, one app. Projects remember, agents learn, and w..." /><meta property="og:locale" content="en_US" /><meta name="twitter:card" content="summary_large_image" /><meta name="twitter:site" content="@taskade" /><meta name="twitter:creator" content="@taskade" /><meta name="twitter:image" content="https://termux-package-portal-8066.taskade.app/_internal/screenshot" /><meta name="twitter:image:alt" content="Termux Package Portal - Built with Taskade - A living app built with Taskade Genesis. One prompt, one app. Projects remember, agents learn, and w..." /><meta name="format-detection" content="telephone=no" /><meta name="mobile-web-app-capable" content="yes" /><meta name="apple-mobile-web-app-capable" content="yes" /><meta name="apple-mobile-web-app-status-bar-style" content="default" /><meta name="apple-mobile-web-app-title" content="Termux Package Portal - Built with Taskade" /><meta name="application-name" content="Taskade" /><link rel="canonical" href="https://termux-package-portal-8066.taskade.app" />
167<script type="application/ld+json"> 168 { 169 "@context": "https://schema.org", 170 "@type": "WebSite", 171 "name": "Taskade", 172 "alternateName": "Termux Package Portal - Built with Taskade", 173 "description": "A living app built with Taskade Genesis. One prompt, one app. Projects remember, agents learn, and workflows move.", 174 "image": "https://termux-package-portal-8066.taskade.app/_internal/screenshot", 175 "url": "https://termux-package-portal-8066.taskade.app", 176 "author": { 177 "@type": "Organization", 178 "name": "Taskade" 179 }, 180 "publisher": { 181 "@type": "Organization", 182 "name": "Taskade", 183 "url": "https://termux-package-portal-8066.taskade.app", 184 "logo": { 185 "@type": "ImageObject", 186 "url": "https://termux-package-portal-8066.taskade.app/_internal/screenshot" 187 } 188 } 189 } 190</script>
190<script defer src="/_genesis/vendor/flock.min.js" data-proxy-url="/_genesis/api/events" data-tenant-id="htc9wm7fekns4v96:default" data-domain="termux-package-portal-8066.taskade.app"></script>
190<script defer src="/_genesis/vendor/scroll-guard.js"></script>
190</head> 191 <body> 192 <div id="root"> 193 <div class="genesis__spinner-container"> 194 <div class="genesis__spinner-ring"></div> 195 </div> 196 </div> 197
197<script> 198 (function() { 199 if (typeof window === 'undefined' || typeof document === 'undefined') { 200 return; 201 } 202 if (typeof window.gtag === 'function') { 203 return; 204 } 205 window.dataLayer = window.dataLayer || []; 206 function gtag(){window.dataLayer.push(arguments);} 207 window.gtag = gtag; 208 gtag('js', new Date()); 209 gtag('config', 'G-WWJTNN1SFE'); 210 const script = document.createElement('script'); 211 script.async = true; 212 script.src = 'https://www.googletagmanager.com/gtag/js?id=G-WWJTNN1SFE'; 213 document.head.appendChild(script); 214 })(); 215</script>
215 216 217<style> 218 @import url('https://fonts.googleapis.com/css2?family=Geist:wght@300;400;500;600&display=swap'); 219 220 :root { 221 /* Onboarding Black Glass - optimized for dark mode */ 222 --badge-black: rgba(0, 0, 0, 0.75); 223 --badge-black-hover: rgba(0, 0, 0, 0.85); 224 --badge-text: rgba(255, 255, 255, 0.9); 225 --badge-text-hover: rgba(255, 255, 255, 1); 226 --badge-border: rgba(255, 255, 255, 0.15); 227 --badge-border-hover: rgba(255, 255, 255, 0.25); 228 --badge-shadow: rgba(0, 0, 0, 0.4); 229 230 /* Rainbow gradient colors from Taskade Upgrade button */ 231 --rainbow-color-1: #5cb2f9; /* Blue */ 232 --rainbow-color-2: #8787f7; /* Purple-Blue */ 233 --rainbow-color-3: #a774f7; /* Purple */ 234 --rainbow-color-4: #e376a8; /* Pink */ 235 --rainbow-color-5: #eb7551; /* Orange */ 236 --rainbow-color-6: #19bd59; /* Green */ 237 --rainbow-color-7: #dee325; /* Yellow-Green */ 238 --rainbow-color-8: #e32545; /* Red */ 239 240 /* Cinematic easing */ 241 --ease-cinematic: cubic-bezier(0.22, 1, 0.36, 1); 242 --ease-cinematic-slow: cubic-bezier(0.16, 1, 0.3, 1); 243 } 244 245 [data-theme="light"] { 246 --badge-black: rgba(0, 0, 0, 0.8); 247 --badge-black-hover: rgba(0, 0, 0, 0.9); 248 --badge-text: rgba(255, 255, 255, 0.95); 249 --badge-text-hover: rgba(255, 255, 255, 1); 250 --badge-border: rgba(255, 255, 255, 0.2); 251 --badge-border-hover: rgba(255, 255, 255, 0.3); 252 --badge-shadow: rgba(0, 0, 0, 0.5); 253 } 254 255 @media (prefers-color-scheme: light) { 256 :root { 257 --badge-black: rgba(0, 0, 0, 0.8); 258 --badge-black-hover: rgba(0, 0, 0, 0.9); 259 --badge-text: rgba(255, 255, 255, 0.95); 260 --badge-text-hover: rgba(255, 255, 255, 1); 261 --badge-border: rgba(255, 255, 255, 0.2); 262 --badge-border-hover: rgba(255, 255, 255, 0.3); 263 --badge-shadow: rgba(0, 0, 0, 0.5); 264 } 265 } 266 267 /* Onboarding Black Glass Badge - Bottom Center Position */ 268 #taskade-badge { 269 position: fixed; 270 bottom: 24px; 271 left: 50%; 272 transform: translateX(-50%) scale(0.9); 273 z-index: 10001; 274 font-family: 'Geist', -apple-system, BlinkMacSystemFont, sans-serif; 275 animation: badgeGeistFadeIn 1.2s var(--ease-cinematic) forwards; 276 opacity: 0; 277 display: inline-flex; 278 align-items: center; 279 gap: 7px; 280 padding: 7px 12px; 281 font-size: 0.8125rem; 282 font-weight: 500; 283 letter-spacing: -0.01em; 284 line-height: 1; 285 color: var(--badge-text); 286 text-decoration: none; 287 background: var(--badge-black); 288 border: 1px solid var(--badge-border); 289 border-radius: 9999px; 290 backdrop-filter: blur(20px) saturate(1.4); 291 -webkit-backdrop-filter: blur(20px) saturate(1.4); 292 cursor: pointer; 293 transition: all 0.3s var(--ease-cinematic); 294 overflow: hidden; 295 will-change: transform, box-shadow; 296 white-space: nowrap; 297 } 298 299 #taskade-badge a { 300 display: flex; 301 align-items: center; 302 gap: 7px; 303 color: inherit; 304 text-decoration: none; 305 } 306 307 /* Default state with subtle rainbow glow */ 308 #taskade-badge { 309 box-shadow: 310 0 4px 16px var(--badge-shadow), 311 0 0 8px rgba(227, 118, 168, 0.2), 312 0 0 16px rgba(163, 116, 247, 0.15); 313 } 314 315 /* Black glass hover with enhanced rainbow glow */ 316 #taskade-badge:hover { 317 background: var(--badge-black-hover); 318 border-color: var(--badge-border-hover); 319 color: var(--badge-text-hover); 320 box-shadow: 321 0 8px 24px var(--badge-shadow), 322 0 0 16px rgba(227, 118, 168, 0.4), 323 0 0 32px rgba(163, 116, 247, 0.3), 324 inset 0 1px 0 rgba(255, 255, 255, 0.12); 325 transform: translateY(-3px) scale(1.03); 326 } 327 328 /* Taskade sheep mascot - optimized for dark mode */ 329 #taskade-badge #taskade-logo { 330 width: 16px; 331 height: 16px; 332 flex-shrink: 0; 333 opacity: 0.95; 334 transition: all 0.3s var(--ease-cinematic); 335 filter: invert(1) brightness(1.1) contrast(1.05); 336 } 337 338 #taskade-badge:hover #taskade-logo { 339 opacity: 1; 340 transform: scale(1.08) rotate(-2deg); 341 filter: invert(1) brightness(1.2) contrast(1.1); 342 } 343 344 /* Light mode adjustments */ 345 [data-theme="light"] #taskade-badge #taskade-logo { 346 filter: invert(0) brightness(1.1); 347 } 348 349 [data-theme="light"] #taskade-badge:hover #taskade-logo { 350 filter: invert(0) brightness(1.2); 351 } 352 353 @media (prefers-color-scheme: light) { 354 :root #taskade-badge #taskade-logo { 355 filter: invert(0) brightness(1.1); 356 } 357 358 :root #taskade-badge:hover #taskade-logo { 359 filter: invert(0) brightness(1.2); 360 } 361 } 362 363 /* Geist typography */ 364 #taskade-badge .badge-text { 365 font-weight: 500; 366 letter-spacing: 0.005em; 367 transition: all 0.3s var(--ease-cinematic); 368 -webkit-font-smoothing: antialiased; 369 -moz-osx-font-smoothing: grayscale; 370 } 371 372 #taskade-badge.hidden { 373 display: none; 374 } 375 376 /* Geist fade-in animation */ 377 @keyframes badgeGeistFadeIn { 378 0% { 379 opacity: 0; 380 transform: translateX(-50%) translateY(8px) scale(0.85); 381 filter: blur(6px); 382 } 383 60% { 384 opacity: 0.7; 385 filter: blur(2px); 386 } 387 100% { 388 opacity: 1; 389 transform: translateX(-50%) translateY(0) scale(0.9); 390 filter: blur(0); 391 } 392 } 393 394 /* Responsive */ 395 @media (max-width: 768px) { 396 #taskade-badge { 397 bottom: 80px; /* Above mobile nav/TAA chat */ 398 left: 50%; 399 transform: translateX(-50%) scale(0.85); 400 padding: 6px 10px; 401 font-size: 0.75rem; 402 gap: 5px; 403 } 404 405 #taskade-badge #taskade-logo { 406 width: 14px; 407 height: 14px; 408 } 409 } 410 411 /* Reduced motion */ 412 @media (prefers-reduced-motion: reduce) { 413 #taskade-badge { 414 animation: none; 415 opacity: 1; 416 } 417 418 #taskade-badge a, 419 #taskade-badge #taskade-logo, 420 #taskade-badge .badge-text { 421 transition: none; 422 animation: none; 423 } 424 } 425 426 /* High contrast */ 427 @media (prefers-contrast: high) { 428 #taskade-badge a { 429 border-width: 2px; 430 border-color: currentColor; 431 } 432 } 433 434 /* Hide when printing */ 435 @media print { 436 #taskade-badge { 437 display: none !important; 438 } 439 } 440</style> 441 442<div id="taskade-badge" data-badge-mode="edit"> 443 <a href="https://www.taskade.com/app/0mnwg714kn2uct2y?utm_source=genesis_badge&utm_medium=app_badge&utm_campaign=p
443owered_by&utm_content=0mnwg714kn2uct2y" target="_blank" rel="noopener noreferrer"> 444 <img id="taskade-logo" src="./_assets/logo.png" alt="Taskade" /> 445 <span class="badge-text" data-community-text="Edit in Taskade" data-default-text="Powered by Taskade">Edit in Taskade</span> 446 </a> 447</div> 448
449<script> 450 (function() { 451 // Geist theme detection - matching wait.html 452 function applyTheme() { 453 const urlParams = new URLSearchParams(window.location.search); 454 let theme = urlParams.get('theme'); 455 456 if (!theme) { 457 try { 458 if (window.parent !== window) { 459 const parentTheme = window.parent.document.documentElement.getAttribute('data-theme'); 460 if (parentTheme) theme = parentTheme; 461 } 462 } catch (e) {} 463 464 if (!theme) { 465 theme = window.matchMedia('(prefers-color-scheme: light)').matches ? 'light' : 'dark'; 466 } 467 } 468 469 document.documentElement.setAttribute('data-theme', theme === 'light' ? 'light' : 'dark'); 470 } 471 472 // Apply theme immediately 473 applyTheme(); 474 475 // Theme change listener 476 window.matchMedia('(prefers-color-scheme: light)').addEventListener('change', (e) => { 477 const urlParams = new URLSearchParams(window.location.search); 478 if (!urlParams.get('theme')) { 479 document.documentElement.setAttribute('data-theme', e.matches ? 'light' : 'dark'); 480 } 481 }); 482 483 // Analytics tracking and postMessage communication 484 const badgeLink = document.querySelector('#taskade-badge a'); 485 if (badgeLink) { 486 let parentOrigin = '*'; 487 let parentHostname = ''; 488 if (document.referrer) { 489 try { 490 const referrerUrl = new URL(document.referrer); 491 parentOrigin = referrerUrl.origin; 492 parentHostname = referrerUrl.hostname; 493 } catch (err) { 494 parentOrigin = '*'; 495 parentHostname = ''; 496 } 497 } 498 // Taskade itself is framing us (the share page at /app/{id}, which 499 // iframes the app). parentOrigin stays '*' when there is no usable 500 // referrer, and then the framer is unknowable. 501 const framedByTaskade = 502 parentOrigin !== '*' && 503 (parentHostname === 'taskade.com' || parentHostname.endsWith('.taskade.com')); 504 505 const badge = document.getElementById('taskade-badge'); 506 const badgeText = document.querySelector('#taskade-badge .badge-text'); 507 const communityText = badgeText ? badgeText.getAttribute('data-community-text') : null; 508 const badgeHref = badgeLink.getAttribute('href') || ''; 509 const badgeMode = badge ? badge.getAttribute('data-badge-mode') : null; 510 const isCommunityShare = 511 badgeMode === 'edit' || 512 (badgeText && 513 communityText && 514 badgeText.textContent && 515 badgeText.textContent.trim() === communityText) || 516 badgeHref.indexOf('/app/') !== -1; 517 518 if (window.parent !== window) { 519 // Hide only when embedded: on the standalone domain this badge IS the 520 // viral return path into Taskade, so it must stay visible there. 521 // Scope note, two independent reasons to hide inside a frame: 522 // 1. The Taskade share page frames the app and already renders its own 523 // Clone CTA, so ANY badge mode is a duplicate there. A buyer of a 524 // non-template listing stays on /app/{id} and sees exactly that. 525 // 2. An edit-mode badge hides in any frame, because its /app/{id} link 526 // just points back at the framing page. 527 // A powered_by badge in an unrelated third-party embed still renders - 528 // there it is the only way back to Taskade. With no referrer the 529 // framer is unknowable, so only the mode-based reason applies. 530 if ((isCommunityShare || framedByTaskade) && badge) { 531 badge.classList.add('hidden'); 532 } 533 534 const notifyParent = () => { 535 window.parent.postMessage( 536 { 537 type: 'TASKADE_BADGE_MODE', 538 source: 'taskade_badge', 539 mode: isCommunityShare ? 'edit' : 'powered_by', 540 }, 541 parentOrigin 542 ); 543 }; 544 545 try { 546 notifyParent(); 547 setTimeout(notifyParent, 500); 548 } catch (err) { 549 // Ignore postMessage failures. 550 } 551 } 552 553 badgeLink.addEventListener('click', function() { 554 // Track badge engagement 555 if (typeof window.gtag === 'function') { 556 window.gtag('event', 'genesis_badge_clicked', { 557 event_category: 'engagement', 558 event_label: 'edit_in_taskade' 559 }); 560 } 561 562 }); 563 } 564 565 })(); 566</script>
vendor: 1 bytes, line 566
566
567<script type="module" src="https://static.cloudflareinsights.com/beacon.min.js/v31edd6df95cf4e85bb4c19e7a9bdbcba1788362987495" integrity="sha512-iIg7k2xntmwu6/uSb5tpc/hySgZc4eoL31yB29W6tJFo2akwjPWcEqnCEdJvGexCL0KEQwVYv5BlowfhVz26hg==" data-cf-beacon='{"version":"2024.11.0","token":"8d4254f20c524f6fbf6ecde0b2c89fb4","spa":2}' crossorigin="anonymous"></script>
567 568</body> 569</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.