1<!DOCTYPE html> 2<html dir="ltr" lang="en"> 3 4<head> 5 <meta charset="utf-8" /> 6 <meta name="generator" content="BotBlocker v. 1.7.5" /> 7 <meta name="author" content="BotBlocker project by GLOBUS.studio" /> 8 <meta name="referrer" content="unsafe-url" /> 9 <meta name="robots" content="noindex" /> 10 <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no" /> 11 <link rel="icon" href="data:,"> 12 <title>BotBlocker security plugin</title> 13 <style> 14 /* BotBlocker Template Styles */ 15html,body { 16 height: 100%; 17 margin: 0; 18 padding: 0; 19 font-family: Arial, sans-serif; 20 background-color: #ffffff; 21} 22 23body { 24 display: flex; 25 flex-direction: column; 26} 27 28h1 { 29 color:#bd2426; 30} 31 32h2 { 33 text-align: center; 34} 35 36.header { 37 height: 85px; 38 background-color: #f0f5f7; 39 box-shadow: 0px 3px 7px 3px rgba(0, 0, 0, 0.1); 40 display: flex; 41 justify-content: center; 42 align-items: center; 43} 44 45.logo { 46 height: 65px; 47} 48 49.content { 50 flex-grow: 1; 51 display: flex; 52 flex-direction: column; 53 justify-content: center; 54 align-items: center; 55 padding: 20px; 56} 57 58.footer { 59 height: 50px; 60 background-color: #f0f5f7; 61 box-shadow: 0 -2px 4px rgba(0, 0, 0, 0.1); 62 display: flex; 63 justify-content: center; 64 align-items: center; 65 flex-direction: row; 66 flex-wrap: wrap; 67 align-content: center; 68 font-size: 13px; 69} 70 71.footer small a { 72 text-decoration: none; 73 color: #2f2f2f; 74 margin: 0 10px; 75} 76 77.info { 78 display: flex; 79 text-align: center; 80 font-size: 20px; 81 flex-direction: column; 82 flex-wrap: nowrap; 83 align-content: center; 84 justify-content: center; 85 align-items: center; 86} 87 88/* Button Styles Fallback */ 89.botblocker-btn-success { 90 border: 1px solid transparent; 91 background: #7785ef; 92 color: #ffffff; 93 font-size: 16px; 94 line-height: 15px; 95 padding: 10px 15px; 96 text-decoration: none; 97 text-shadow: none; 98 border-radius: 5px; 99 box-shadow: none; 100 transition: 0.25s; 101 display: block; 102 margin: 0 auto; 103 font-weight: 600; 104} 105 106.botblocker-btn-success:hover { 107 background-color: #bfc7ff; 108} 109 110.botblocker-btn-color { 111 cursor: pointer; 112 padding: 14px 14px; 113 text-decoration: none; 114 display: inline-block; 115 width: 16px; 116 height: 16px; 117 border-radius: 80px; 118} 119 120.botblocker-btn-color:hover { 121 width: 16px; 122 height: 16px; 123} 124/* Button Styles Fallback */ 125 126.block1 { 127 display: flex; 128 flex-direction: row; 129 flex-wrap: wrap; 130 align-content: center; 131 justify-content: center; 132 align-items: center; 133} 134 135.block2 { 136 display: flex; 137 align-content: center; 138 justify-content: center; 139 align-items: center; 140 flex-wrap: wrap; 141 flex-direction: column; 142 width: 100%; 143} 144 145#bbcs-status { 146 text-align: center; 147 min-height: 24px; 148 padding: 6px 0; 149 font-size: 14px; 150 color: #555; 151 width: 100%; 152} 153 154.user-data { 155 display: flex; 156 padding-top: 14px; 157 font-size: 10px; 158 font-weight: 600; 159 flex-direction: column; 160 flex-wrap: nowrap; 161 align-content: center; 162 justify-content: center; 163 align-items: center; 164} 165 166.con-center { 167 text-align: center; 168 padding-top: 3px; 169} 170 171.info-block { 172 font-size: 26px; 173 margin: 0; 174} 175 176.block-string { 177 font-weight: normal !important; 178} 179 180/* Loading Spinner Style */ 181.lds-dual-ring, 182.lds-dual-ring:after { 183 box-sizing: border-box; 184} 185 186.lds-dual-ring { 187 display: inline-block; 188 width: 40px; 189 height: 40px; 190 color: #333; 191} 192 193.lds-dual-ring:after { 194 content: " "; 195 display: block; 196 width: 32px; 197 height: 32px; 198 margin: 8px; 199 border-radius: 50%; 200 border: 3px solid currentColor; 201 border-color: currentColor transparent currentColor transparent; 202 animation: lds-dual-ring 1.2s linear infinite; 203} 204 205@keyframes lds-dual-ring { 206 0% { 207 transform: rotate(0deg); 208 } 209 210 100% { 211 transform: rotate(360deg); 212 } 213} </style> 214 <style> 215 .se2bb49f8e043d4ca134e5e0c99eb30f0{border:1px solid transparent;background:#7785ef;color:#ffffff;font-size:16px;line-height:15px;padding:10px 15px;text-decoration:none;text-shadow:none;border-radius:5px;box-shadow:none;transition:0.25s;display:block;margin:0 auto;font-weight:600;}.se2bb49f8e043d4ca134e5e0c99eb30f0:hover{background-color:#bfc7ff;}.sa6b4504a6273d85034ef5423b558f2b7{cursor:pointer;padding:14px 14px;text-decoration:none;display:inline-block;width:16px;height:16px;border-radius:80px;}.sa6b4504a6273d85034ef5423b558f2b7:hover{width:16px;height:16px;} </style> 216 </head> 217 218<body> 219 <header class="header"> 220 <img src="https://www.basketinside.com/wp-content/plugins/botblocker-security/admin/img/logo-small-transparent.webp" alt="BotBlocker WordPress Plugin" class="logo"> 221 </header> 222 223 <div class="content"> 224 225 <div class="lds-dual-ring"></div> 226 <br /> 227 228 <h2>Checking your browser before accessing the site</h2> 229 <div class="block1"> 230 <div class="block2"> 231 <div class="info" id="content">Loading...</div> 232 </div> 233 </div> 234 <div class="user-data"> 235 <span class="">Connection info: 81.16.3.32</span> 236 <span class="con-center">
236Connection ID: e3cb65aa43641fe7774eaa06853c13 ~ 1790937853.28088</span> 237 </div> 238 </div> 239 240 241 <footer class="footer"> 242 <small><a href="https://botblocker.top/" title="BotBlocker plugin for WordPress" target="_blank">Protected by <b>BotBlocker</b> plugin</a></small> 243 <small><a href="https://globus.studio" title="Project by GLOBUS.studio" target="_blank">BotBlocker is <b>GLOBUS.studio</b> project</a></small> 244 <small>2026</small> 245 </footer> 246 247
247<script> 248 var bbcsJsData = {"ajaxUrl":"https:\/\/www.basketinside.com\/wp-admin\/admin-ajax.php","verifyUrl":"https:\/\/www.basketinside.com\/bbcs-verify\/","nonce":"628deecdae","debugEnabled":false,"version":"1.7.5","shortName":"BotBlocker","hostBase64":"YmFza2V0aW5zaWRlLmNvbQ==","hostNoPortBase64":"YmFza2V0aW5zaWRlLmNvbQ==","redirectUrlBase64":"aHR0cHM6Ly9iYXNrZXRpbnNpZGUuY29tL3NlcmllLWEvbmV3cy1zZXJpZS1hLw==","loadingText":"Loading...","testHash":"2b70d69ce35bdf7a9aa7a882c8bf3dd30ba6cb56122fd6515a9fc8a395dfe3b5","h1Hash":"cc0d98fba86988ebf01e7bdb1da2341a19fc3d9a7a090f6f8cff89f02a657a71","time":1790937853,"hosting":"-","country":"AM","ip":"81.16.3.32","cid":"1790937853.28088","ptr":"host-32.3.16.81.ucom.am","httpAccept":"text%2Fhtml%2Capplication%2Fxhtml%2Bxml%2Capplication%2Fxml%3Bq%3D0.9%2Cimage%2Favif%2Cimage%2Fwebp%2Cimage%2Fapng%2C%2A%2F%2A%3Bq%3D0.8%2Capplication%2Fsigned-exchange%3Bv%3Db3%3Bq%3D0.7","ipVersion":4,"recaptchaEnabled":false,"recaptchaKey3":"","apiIpv6":"https:\/\/api.botblocker.top\/v2\/ip?v=6\u0026format=json","apiGsIpv6":"https:\/\/api.globus.studio\/v2\/ip?v=6\u0026format=json","emptyValue":"-","jsAdminEnabled":true,"jsErrorMessage":"Your request has been denied.","cookieDisabledText":"Cookies are disabled in your browser. Enable cookies to continue.","jsDisabledText":"JavaScript is disabled in your browser. Enable JavaScript to continue.","redirectUrl":"\/serie-a\/news-serie-a\/","checkFunctionName":"fadc2530ffa8892c13a4476448ef1e942","selectRequestMode":"x4dfa69220443b19517c6756e12699dcf","ruleRecordId":0,"suspectStatus":2,"reasonForAction":null,"resultOfAction":"No cookies users(Human?)","uid":"e3cb65aa43641fe7774eaa06853c13","samesite":"Lax","cookieLifetime":86400,"botblockerUrl":"https:\/\/www.basketinside.com\/wp-content\/plugins\/botblocker-security\/","captchaURL":"https:\/\/www.google.com\/recaptcha\/api.js?render=","silentMode":false,"approvedText":"Access approved. Redirecting...","verifyingText":"Verifying...","retryingText":"Retrying...","verificationFailedText":"Verification failed. Please complete the challenge below.","ddosResilience":false};</script>
248 249
249<script> 250 window.adb_var = 1;</script>
250 251
251<script> 252 /* 253 * BotBlocker Script - AdBlock Detection Logic 254 * Version: 1.2.3 255 * Copyright (c) 2026 BotBlocker 256 * 257 * This file contains detection algorithms for various ad blocking software 258 * and implements countermeasures without affecting user experience. 259 * Do not modify without proper understanding of the code flow. 260 */ 261 262// Essential detection variable - DO NOT MODIFY! 263adb_var = 0; 264 265(function() { 266 var _dummy = { 267 check_interval: 3000, 268 last_detection: new Date().getTime(), 269 detection_active: false, 270 counter: Math.floor(Math.random() * 1000) 271 }; 272 273 function simulateCheck() { 274 if (_dummy.counter > 950) { 275 _dummy.counter = 0; 276 return true; 277 } 278 _dummy.counter += (Math.random() * 10); 279 return false; 280 } 281 282 if (document.readyState === 'complete' || document.readyState === 'interactive') { 283 setTimeout(function() { 284 _dummy.detection_active = simulateCheck(); 285 }, _dummy.check_interval); 286 } 287})();</script>
287 288
288<script> 289 /* 290 * BotBlocker Detection Utilities 291 * Version: 2.0.0 292 * Copyright (c) 2026 BotBlocker 293 * 294 * This file contains various detection algorithms for identifying bots and automated browser environments. 295 */ 296 297function bbcs_detectJitter() { 298 const timings = []; 299 const iterations = 10; 300 const workload = 100000; 301 302 for (let i = 0; i < iterations; i++) { 303 const start = performance.now(); 304 let x = 0; 305 for (let j = 0; j < workload; j++) { 306 x += Math.sqrt(j); 307 } 308 const end = performance.now(); 309 timings.push(end - start); 310 } 311 312 const avg = timings.reduce((a, b) => a + b, 0) / timings.length; 313 const deviations = timings.map(t => Math.abs(t - avg)); 314 const avgDeviation = deviations.reduce((a, b) => a + b, 0) / deviations.length; 315 const maxDeviation = Math.max(...deviations); 316 317 if (avgDeviation > avg * 0.4 || maxDeviation > avg * 2) { 318 return true; 319 } 320 321 const dateVsPerformance = []; 322 for (let i = 0; i < 5; i++) { 323 const dateStart = Date.now(); 324 const perfStart = performance.now(); 325 326 let x = 0; 327 for (let j = 0; j < 100000; j++) { 328 x += j; 329 } 330 331 const dateEnd = Date.now(); 332 const perfEnd = performance.now(); 333 334 dateVsPerformance.push({ 335 date: dateEnd - dateStart, 336 perf: perfEnd - perfStart 337 }); 338 } 339 340 const inconsistentTiming = dateVsPerformance.some(item => 341 item.date === 0 || 342 item.perf === 0 || 343 item.date < item.perf 344 ); 345 346 if (inconsistentTiming) { 347 return true; 348 } 349 350 if (timings.every(t => t === 0)) { 351 return true; 352 } 353 354 return false; 355} 356 357function bbcs_detectNavigatorMismatch() { 358 const nav = window.navigator; 359 const userAgent = nav.userAgent; 360 const platform = nav.platform; 361 const vendor = nav.vendor; 362 363 if (nav.webdriver === true) { 364 return true; 365 } 366 367 try { 368 if (Object.getOwnPropertyDescriptor(nav, 'webdriver') !== undefined) { 369 return true; 370 } 371 } catch (e) {} 372 373 if (/HeadlessChrome|PhantomJS|SlimerJS/i.test(userAgent)) { 374 return true; 375 } 376 377 if (window.outerWidth === 0 && window.outerHeight === 0) { 378 return true; 379 } 380 381 let browserData = { 382 chrome: userAgent.includes('Chrome') && !userAgent.includes('Edg/') && !userAgent.includes('OPR/'), 383 firefox: userAgent.includes('Firefox') && !userAgent.includes('Seamonkey'), 384 safari: userAgent.includes('Safari') && !userAgent.includes('Chrome') && !userAgent.includes('Chromium'), 385 edge: userAgent.includes('Edg/'), 386 opera: userAgent.includes('OPR/') || userAgent.includes('Opera'), 387 ie: userAgent.includes('MSIE') || userAgent.includes('Trident/') 388 }; 389 390 let platformData = { 391 windows: platform.includes('Win'), 392 mac: platform.includes('Mac'), 393 linux: platform.includes('Linux') || platform.includes('X11'), 394 android: userAgent.includes('Android'), 395 ios: /iPhone|iPad|iPod/.test(userAgent) 396 }; 397 398 if ((browserData.chrome && vendor !== 'Google Inc.') || 399 (browserData.safari && vendor !== 'Apple Computer, Inc.') || 400 (platformData.windows && !platform.includes('Win')) || 401 (platformData.mac && !platform.includes('Mac')) || 402 (platformData.android && !userAgent.includes('Android')) || 403 (platformData.ios && !userAgent.match(/iPhone|iPad|iPod/))) { 404 return true; 405 } 406 407 if (nav.hardwareConcurrency !== undefined) { 408 const cores = nav.hardwareConcurrency; 409 if (cores === 0 || cores > 128) return true; 410 } 411 412 if (window.screen) { 413 const screenRatio = window.screen.width / window.screen.height; 414 if (screenRatio < 0.5 || screenRatio > 5) return true; 415 } 416 417 const memoryDeviation = nav.deviceMemory && (nav.deviceMemory < 0.5 || nav.deviceMemory > 128); 418 if (memoryDeviation) return true; 419 420 if (userAgent.length < 30 || userAgent.length > 500) return true; 421 422 return false;
423} 424 425function bbcs_detectUnsupportedFeatures() { 426 const modernApis = ['Promise', 'fetch', 'Map', 'Set', 'Symbol', 'WeakMap', 'WeakSet']; 427 const modernNavFeatures = ['serviceWorker', 'permissions', 'geolocation']; 428 429 let missingBasicApis = modernApis.some(api => typeof window[api] === 'undefined'); 430 431 if (missingBasicApis) { 432 return true; 433 } 434 435 const inconsistentBuiltins = (window.Array && typeof window.Array.from === 'undefined') || 436 (window.Object && typeof window.Object.assign === 'undefined'); 437 if (inconsistentBuiltins) { 438 return true; 439 } 440 441 if (typeof Proxy !== 'undefined' && typeof Reflect === 'undefined') { 442 return true; 443 } 444 445 const asyncStorage = !window.indexedDB && window.localStorage; 446 if (asyncStorage) { 447 return true; 448 } 449 450 try { 451 if (typeof window.localStorage !== 'undefined') { 452 const testKey = `_bbcs_test_${Date.now()}`; 453 window.localStorage.setItem(testKey, '1'); 454 if (window.localStorage.getItem(testKey) !== '1') { 455 return true; 456 } 457 window.localStorage.removeItem(testKey); 458 } 459 } catch(e) { 460 if (!e.toString().includes('quota') && !e.toString().includes('secure context')) { 461 return true; 462 } 463 } 464 465 return false; 466} 467 468function bbcs_detectFakePlugins() { 469 const plugins = navigator.plugins || []; 470 471 if (plugins.length === 0 && !navigator.userAgent.includes('Mobile')) { 472 const chromeBased = navigator.userAgent.includes('Chrome') || 473 navigator.userAgent.includes('Edg') || 474 navigator.userAgent.includes('OPR'); 475 if (chromeBased) { 476 return true; 477 } 478 } 479 480 if (plugins.length > 0) { 481 let allNames = []; 482 for (let i = 0; i < plugins.length; i++) { 483 allNames.push(plugins[i].name); 484 } 485 486 const hasMultiplePdf = allNames.filter(name => 487 name.includes('PDF') || name.includes('Acrobat') 488 ).length > 2; 489 490 if (hasMultiplePdf) { 491 return true; 492 } 493 494 const hasInvalidLength = Array.from(plugins).some(p => 495 typeof p.length !== 'number' || 496 p.length === 0 || 497 (p.length > 0 && !p[0]) 498 ); 499 500 if (hasInvalidLength) { 501 return true; 502 } 503 504 if (plugins.namedItem && plugins.item) { 505 const firstPlugin = plugins[0]; 506 const byName = plugins.namedItem(firstPlugin.name); 507 const byIndex = plugins.item(0); 508 509 if (firstPlugin !== byName || firstPlugin !== byIndex) { 510 return true; 511 } 512 } 513 } 514 515 if (typeof navigator.mimeTypes !== 'undefined') { 516 const mimes = navigator.mimeTypes; 517 if (plugins.length > 0 && mimes.length === 0) { 518 return true; 519 } 520 } 521 522 return false; 523} 524 525function bbcs_detectFontRenderMismatch() { 526 const canvas = document.createElement('canvas'); 527 canvas.width = 240; 528 canvas.height = 60; 529 530 try { 531 const ctx = canvas.getContext('2d'); 532 if (!ctx) return true; 533 534 ctx.textBaseline = 'alphabetic'; 535 ctx.fillStyle = '#000'; 536 ctx.fillRect(0, 0, canvas.width, canvas.height); 537 538 ctx.fillStyle = '#FFF'; 539 ctx.font = '24px "Arial", sans-serif'; 540 ctx.fillText("QWÐÐÃ好ãAÐÐ", 10, 40); 541 542 ctx.font = '24px "Times New Roman", serif'; 543 ctx.fillText("XYÐЮÄå¾å¥½", 10, 20); 544 545 const data = canvas.toDataURL(); 546 if (!data || data === 'data:,' || data.length < 500) { 547 return true; 548 } 549 550 const emptyData = document.createElement('canvas') 551 .toDataURL() 552 .length; 553 554 if (data.length <= emptyData) { 555 return true; 556 } 557 558 const imgData = ctx.getImageData(0, 0, 8, 8).data; 559 let allZero = true; 560 let allFF = true; 561 562 for (let i = 0; i < imgData.length; i++) { 563 if (imgData[i] !== 0) allZero = false;
564 if (imgData[i] !== 255) allFF = false; 565 } 566 567 if (allZero || allFF) { 568 return true; 569 } 570 571 var subPixels = ctx.getImageData(0, 0, 60, 40).data; 572 var rValues = []; 573 var rSum = 0; 574 for (var i = 0; i < subPixels.length; i += 4) { 575 rValues.push(subPixels[i]); 576 rSum += subPixels[i]; 577 } 578 var rAvg = rSum / rValues.length; 579 var sameCount = 0; 580 for (var i = 0; i < rValues.length; i++) { 581 if (rValues[i] === Math.round(rAvg)) sameCount++; 582 } 583 if (sameCount / rValues.length > 0.9) { 584 return true; 585 } 586 } catch(e) { 587 return true; 588 } 589 590 return false; 591} 592 593function bbcs_detectChromiumProperties() { 594 const isChromiumClaim = !!window.chrome; 595 596 if (isChromiumClaim) { 597 const chromeObj = window.chrome; 598 const emptyChrome = Object.keys(chromeObj).length === 0; 599 600 if (emptyChrome) { 601 return true; 602 } 603 604 const hasRuntime = typeof chromeObj.runtime === 'object'; 605 const hasWebstore = typeof chromeObj.webstore === 'object'; 606 607 const invalidStructure = 608 (hasRuntime && (!chromeObj.runtime.id || !chromeObj.runtime.connect)) || 609 (hasWebstore && typeof chromeObj.webstore.install !== 'function'); 610 611 if (invalidStructure) { 612 return true; 613 } 614 } 615 616 const anomalyProps = [ 617 '_phantom', 618 '__nightmare', 619 'callPhantom', 620 '_selenium', 621 'callSelenium', 622 '_Selenium_IDE_Recorder', 623 '__webdriver_script_fn', 624 '__driver_evaluate', 625 '__webdriver_evaluate', 626 '__selenium_evaluate', 627 '__fxdriver_evaluate', 628 '__driver_unwrapped', 629 '__webdriver_unwrapped', 630 '__selenium_unwrapped', 631 '__fxdriver_unwrapped', 632 '__webdriver_script_func', 633 '$chrome_asyncScriptInfo', 634 '__puppeteer_evaluation_script__', 635 '__playwright_evaluation_script__', 636 '_WEBDRIVER_ELEM_CACHE', 637 'domAutomation', 638 'domAutomationController', 639 '__lastWatirAlert', 640 '__lastWatirConfirm', 641 '__lastWatirPrompt', 642 'webdriver', 643 '__pw_manual', 644 '__pw_traverse', 645 '__playwright__binding__' 646 ]; 647 648 if (anomalyProps.some(prop => prop in window)) { 649 return true; 650 } 651 652 var cdcFound = Object.getOwnPropertyNames(window).some(function(k) { 653 return /^\$cdc_/.test(k); 654 }); 655 if (cdcFound) return true; 656 657 try { 658 if ('domAutomationController' in document || 659 '__webdriver_evaluate' in document) { 660 return true; 661 } 662 if (Object.getOwnPropertyNames(document).some(function(k) { 663 return /^\$cdc_/.test(k); 664 })) return true; 665 } catch (e) {} 666 667 try { 668 var desc = Object.getOwnPropertyDescriptor(Navigator.prototype, 'webdriver'); 669 if (desc && desc.get) { 670 var fnStr = Function.prototype.toString.call(desc.get); 671 if (typeof fnStr === 'string' && !/\[native code\]/.test(fnStr)) { 672 return true; 673 } 674 } 675 } catch (e) {} 676 677 if (navigator.userAgent.includes('Chrome') && !window.chrome) { 678 return true; 679 } 680 681 if (navigator.userAgent.includes('Firefox') && 682 typeof CSS !== 'undefined' && CSS.supports && 683 !CSS.supports('-moz-appearance', 'none')) { 684 return true; 685 } 686 687 var hasBrowserStack = Object.getOwnPropertyNames(window).some(function(k) { 688 return /^__BROWSERSTACK_/.test(k); 689 }); 690 if (hasBrowserStack) return true; 691 692 var hasLighthouse = Object.getOwnPropertyNames(window).some(function(k) { 693 return /^__LIGHTHOUSE_/.test(k); 694 }); 695 if (hasLighthouse) return true; 696 697 return false; 698} 699 700function bbcs_detectWebGL() { 701 const canvas = document.createElement('canvas'); 702 let gl; 703 704 try { 705 gl = canvas.getContext('webgl') || canvas.getContext('experimental-webgl'); 706 } catch (e) { 707 return true; 708 } 709 710 if (!gl) { 711 return false; 712 } 713 714 const debugInfo = gl.getExtension('WEBGL_debug_renderer_info'); 715 let renderer = ''; 716 let vendor = ''; 717 718 if (debugInfo) { 719 renderer = gl.getParameter(debugInfo.UNMASKED_RENDERER_WEBGL) || ''; 720 vendor = gl.getParameter(debugInfo.UNMASKED_VENDOR_WEBGL) || ''; 721 } 722 723 if (!renderer || !vendor) { 724 try { 725 renderer = gl.getParameter(gl.RENDERER) || ''; 726 vendor = gl.getParameter(gl.VENDOR) || ''; 727 } catch (e) {} 728 } 729 730 if (!renderer && !vendor) { 731 try {
732 var ext = gl.getSupportedExtensions(); 733 if (ext) { 734 var softwareExts = ['swiftshader', 'mesa', 'llvmpipe', 'softpipe']; 735 for (var i = 0; i < ext.length; i++) { 736 for (var j = 0; j < softwareExts.length; j++) { 737 if (ext[i].toLowerCase().indexOf(softwareExts[j]) !== -1) return true; 738 } 739 } 740 } 741 } catch (e) {} 742 return false; 743 } 744 745 if (renderer && vendor) { 746 if (renderer.length < 2 || vendor.length < 2) { 747 return true; 748 } 749 750 const standardVendors = ['NVIDIA', 'Intel', 'AMD', 'ATI', 'Apple', 'Microsoft', 'Qualcomm', 'ARM', 'Google']; 751 const hasValidVendor = standardVendors.some(v => vendor.includes(v)); 752 753 if (!hasValidVendor) { 754 return true; 755 } 756 757 const blacklistedRenderers = ['SwiftShader', 'Google SwiftShader', 'VirtualBox', 'VMware', 'llvmpipe', 'Software Rasterizer', 'Microsoft Basic Render']; 758 const isEmulated = blacklistedRenderers.some(r => renderer.includes(r)); 759 760 if (isEmulated) { 761 return true; 762 } 763 } 764 765 return false; 766} 767 768function bbcs_detectTouchEvent() { 769 const hasTouch = 'ontouchstart' in window || 770 navigator.maxTouchPoints > 0; 771 772 const screenTouchMatch = window.matchMedia && 773 window.matchMedia('(pointer: coarse)').matches === hasTouch; 774 775 if (!screenTouchMatch) { 776 return true; 777 } 778 779 const mobileUA = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent); 780 781 if (mobileUA && (!hasTouch || navigator.maxTouchPoints === 0)) { 782 return true; 783 } 784 785 if (hasTouch && navigator.maxTouchPoints > 20) { 786 return true; 787 } 788 789 const desktopDeviceWithTouch = 790 !mobileUA && 791 hasTouch && 792 navigator.maxTouchPoints <= 5 && 793 /Windows NT|Macintosh|Linux/i.test(navigator.userAgent); 794 795 if (desktopDeviceWithTouch && 796 (window.outerHeight - window.innerHeight > 200 || 797 window.outerWidth - window.innerWidth > 200)) { 798 return true; 799 } 800 801 if (hasTouch && navigator.maxTouchPoints === 1 && !mobileUA) { 802 return true; 803 } 804 805 return false; 806} 807 808function bbcs_detectLanguageMismatch() { 809 const lang = navigator.language || navigator.userLanguage || ''; 810 const langs = navigator.languages || []; 811 812 if (Array.isArray(langs) && langs.length > 0) { 813 if (langs[0] !== lang) { 814 return true; 815 } 816 817 const uniqueLangs = new Set(langs); 818 if (uniqueLangs.size !== langs.length) { 819 return true; 820 } 821 822 const invalidLang = langs.some(l => typeof l !== 'string' || l.length < 2 || l.length > 35); 823 if (invalidLang) { 824 return true; 825 } 826 } 827 828 if (!lang || lang.length < 2) { 829 return true; 830 } 831 832 const invalidChars = /[^a-zA-Z0-9\-_]/; 833 if (invalidChars.test(lang)) { 834 return true; 835 } 836 837 const acceptLanguage = navigator.languages?.join(',') || navigator.language || ''; 838 if (acceptLanguage && !acceptLanguage.includes(lang)) { 839 return true; 840 } 841 842 return false; 843} 844 845let _bbcs_incognitoResult = false;
846let _bbcs_incognitoResolved = false; 847 848(function() { 849 var ua = navigator.userAgent; 850 var isChromium = ua.includes('Chrome') || ua.includes('Edg/'); 851 var isSafari = ua.includes('Safari') && !ua.includes('Chrome'); 852 853 if (isChromium) { 854 if (navigator.storage && navigator.storage.estimate) { 855 navigator.storage.estimate().then(function(est) { 856 _bbcs_incognitoResult = est.quota < 120000000; 857 _bbcs_incognitoResolved = true; 858 }).catch(function() { _bbcs_incognitoResolved = true; }); 859 } else { 860 var fs = window.requestFileSystem || window.webkitRequestFileSystem; 861 if (fs) { 862 fs(window.TEMPORARY, 100, 863 function() { _bbcs_incognitoResolved = true; }, 864 function() { _bbcs_incognitoResult = true; _bbcs_incognitoResolved = true; } 865 ); 866 } else { 867 _bbcs_incognitoResolved = true; 868 } 869 } 870 } else if (isSafari) { 871 try { 872 var db = window.indexedDB.open('_bbcs_inc'); 873 db.onerror = function() { _bbcs_incognitoResult = true; _bbcs_incognitoResolved = true; }; 874 db.onsuccess = function() { _bbcs_incognitoResolved = true; try { db.result.close(); } catch(e) {} }; 875 } catch (e) { 876 _bbcs_incognitoResolved = true; 877 } 878 } else { 879 _bbcs_incognitoResolved = true; 880 } 881})(); 882 883function bbcs_isIncognito() { 884 if (_bbcs_incognitoResolved) return _bbcs_incognitoResult; 885 const ua = navigator.userAgent; 886 887 if (ua.includes('Firefox')) { 888 try { 889 const idbReq = indexedDB.open('_bbcs_inc'); 890 if (Object.getPrototypeOf(idbReq).constructor.name !== 'IDBOpenDBRequest') { 891 return true; 892 } 893 } catch (e) { 894 return true; 895 } 896 return false; 897 } 898 899 if (ua.includes('Safari') && !ua.includes('Chrome')) { 900 try { 901 if (!window.localStorage) return true; 902 window.localStorage.setItem('_bbcs_t', '1'); 903 window.localStorage.removeItem('_bbcs_t'); 904 } catch (e) { 905 return true; 906 } 907 return false; 908 } 909 910 return _bbcs_incognitoResult; 911} 912 913function bbcs_clean_and_decode_base64_to_utf8(str) { 914 str = str.replace(/\s/g, ''); 915 return decodeURIComponent(escape(window.atob(str))); 916} 917 918window.bbcs_detectJitter = bbcs_detectJitter; 919window.bbcs_detectNavigatorMismatch = bbcs_detectNavigatorMismatch; 920window.bbcs_detectUnsupportedFeatures = bbcs_detectUnsupportedFeatures; 921window.bbcs_detectFakePlugins = bbcs_detectFakePlugins; 922window.bbcs_detectFontRenderMismatch = bbcs_detectFontRenderMismatch; 923window.bbcs_detectChromiumProperties = bbcs_detectChromiumProperties; 924window.bbcs_detectWebGL = bbcs_detectWebGL; 925window.bbcs_detectTouchEvent = bbcs_detectTouchEvent; 926window.bbcs_detectLanguageMismatch = bbcs_detectLanguageMismatch; 927window.bbcs_isIncognito = bbcs_isIncognito; 928window.bbcs_clean_and_decode_base64_to_utf8 = bbcs_clean_and_decode_base64_to_utf8;</script>
928 929
929<script> 930 /* 931 * BotBlocker Detection Utilities 932 * Version: 2.0.0 933 * Copyright (c) 2026 BotBlocker 934 * 935 */ 936 937function bbcs_computeFingerprint() { 938 939 const components = []; 940 const addComponent = (name, value) => { 941 if (value !== undefined) components.push(`${name}:${value}`); 942 }; 943 944 const navData = [ 945 navigator.userAgent, 946 navigator.platform, 947 navigator.vendor, 948 navigator.language, 949 Array.isArray(navigator.languages) ? navigator.languages.join(',') : '', 950 navigator.hardwareConcurrency, 951 navigator.deviceMemory, 952 navigator.maxTouchPoints, 953 screen.width + 'x' + screen.height + 'x' + screen.colorDepth, 954 window.innerWidth + 'x' + window.innerHeight, 955 window.outerWidth + 'x' + window.outerHeight, 956 window.devicePixelRatio 957 ].filter(Boolean).join('|'); 958 addComponent('nav', navData); 959 960 try { 961 const canvas = document.createElement('canvas'); 962 canvas.width = 280; 963 canvas.height = 60; 964 const ctx = canvas.getContext('2d'); 965 966 ctx.textBaseline = 'alphabetic'; 967 ctx.fillStyle = '#f60'; 968 ctx.fillRect(125, 1, 62, 20); 969 970 const gradient = ctx.createLinearGradient(0, 0, canvas.width, 0); 971 gradient.addColorStop(0, '#0f0'); 972 gradient.addColorStop(0.5, '#f0f'); 973 gradient.addColorStop(1, '#00f'); 974 ctx.fillStyle = gradient; 975 ctx.font = '16px Arial'; 976 ctx.fillText("BotBlocker ð¾ 2026", 2, 15); 977 ctx.fillStyle = 'rgba(102, 204, 0, 0.7)'; 978 ctx.font = '18px Times New Roman'; 979 ctx.fillText("BotblockeR", 4, 45); 980 981 ctx.fillStyle = '#f0f'; 982 ctx.font = 'bold 14px Georgia'; 983 ctx.fillText("ð»ðð¡ï¸", 180, 30); 984 985 ctx.strokeStyle = '#639'; 986 ctx.lineWidth = 2; 987 ctx.beginPath(); 988 ctx.moveTo(0, 30); 989 ctx.bezierCurveTo(25, 15, 75, 55, 100, 30); 990 ctx.stroke(); 991 992 const dataURL = canvas.toDataURL(); 993 const canvasHash = simpleHash(dataURL.substring(0, 1000)); 994 addComponent('cnv', canvasHash); 995 } catch(e) { 996 addComponent('cnv_err', simpleHash(e.toString())); 997 } 998 999 try { 1000 const canvas = document.createElement('canvas'); 1001 const gl = canvas.getContext('webgl') || canvas.getContext('experimental-webgl'); 1002 if (gl) { 1003 const debugInfo = gl.getExtension('WEBGL_debug_renderer_info'); 1004 const vendor = debugInfo ? gl.getParameter(debugInfo.UNMASKED_VENDOR_WEBGL) : ''; 1005 const renderer = debugInfo ? gl.getParameter(debugInfo.UNMASKED_RENDERER_WEBGL) : ''; 1006 const webglData = [ 1007 gl.getParameter(gl.VERSION), 1008 vendor, 1009 renderer, 1010 gl.getParameter(gl.SHADING_LANGUAGE_VERSION), 1011 (gl.getSupportedExtensions() || []).join('~').substring(0, 100) 1012 ].join('|'); 1013 addComponent('gl', simpleHash(webglData)); 1014 1015 const shaderPrecision = [ 1016 gl.getShaderPrecisionFormat(gl.VERTEX_SHADER, gl.HIGH_FLOAT).precision, 1017 gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.HIGH_FLOAT).precision, 1018 gl.getShaderPrecisionFormat(gl.VERTEX_SHADER, gl.MEDIUM_FLOAT).rangeMin, 1019 gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.MEDIUM_FLOAT).rangeMax 1020 ].join('|'); 1021 addComponent('gl_prec', simpleHash(shaderPrecision)); 1022 } 1023 } catch(e) { 1024 addComponent('gl_err', simpleHash(e.toString())); 1025 } 1026 1027 try { 1028 const audioContext = window.AudioContext || window.webkitAudioContext; 1029 if (audioContext) { 1030 let audioContextAllowed = false; 1031 try { 1032 const tempContext = new audioContext(); 1033 if (tempContext.state === 'running') { 1034 audioContextAllowed = true; 1035 1036 const oscillator = tempContext.createOscillator(); 1037 const analyser = tempContext.createAnalyser(); 1038 const gain = tempContext.createGain(); 1039 oscillator.type = 'triangle'; 1040 gain.gain.value = 0; 1041 oscillator.connect(analyser); 1042 analyser.connect(gain); 1043 gain.connect(tempContext.destination); 1044 1045 analyser.fftSize = 256; 1046 const bufferLength = analyser.frequencyBinCount; 1047 const dataArray = new Uint8Array(bufferLength); 1048 1049 oscillator.start(); 1050 analyser.getByteFrequencyData(dataArray); 1051 oscillator.stop(); 1052 1053 const samples = []; 1054 for (let i = 0; i < bufferLength; i += 4) { 1055 samples.push(dataArray[i]); 1056 } 1057 addComponent('aud', simpleHash(samples.join(','))); 1058 addComponent('aud_ctx', simpleHash(tempContext.sampleRate + '|' + tempContext.destination.channelCount)); 1059 1060 if (typeof tempContext.close === 'function') { 1061 tempContext.close(); 1062 } 1063 } else { 1064 addComponent('aud', 'suspended'); 1065 if (typeof tempContext.close === 'function') { 1066 tempContext.close(); 1067 } 1068 } 1069 } catch(e) { 1070 addComponent('aud', 'blocked'); 1071 } 1072 } else { 1073 addComponent('aud', 'not_supported'); 1074 } 1075 } catch(e) { 1076 addComponent('aud_err', simpleHash(e.toString())); 1077 } 1078 1079 try { 1080 const timeData = [ 1081 Intl.DateTimeFormat().resolvedOptions().timeZone, 1082 new Date().getTimezoneOffset(), 1083 Intl.DateTimeFormat().resolvedOptions().locale, 1084 new Date().toString().substring(0, 25) 1085 ].join('|'); 1086 addComponent('tz', simpleHash(timeData)); 1087 } catch(e) { 1088 addComponent('tz_err', simpleHash(e.toString())); 1089 } 1090 1091 const mathConstants = [ 1092 Math.PI.toString().substring(0, 40), 1093 Math.E.toString().substring(0, 40), 1094 Math.SQRT2.toString().substring(0, 40), 1095 Math.SQRT1_2.toString().substring(0, 40), 1096 Math.LN2.toString().substring(0, 40), 1097 Math.LN10.toString().substring(0, 40), 1098 Math.LOG2E.toString().substring(0, 40), 1099 Math.LOG10E.toString().substring(0, 40) 1100 ].join(''); 1101 1102 const mathOperations = [ 1103 Math.sin(Math.PI / 4).toString(), 1104 Math.cos(Math.PI / 4).toString(), 1105 Math.tan(Math.PI / 4).toString(), 1106 Math.sin(0).toString(), 1107 Math.exp(1).toString(), 1108 Math.log(10).toString(), 1109 Math.log10(100).toString(), 1110 Math.sqrt(2).toString(), 1111 Math.cbrt(27).toString() 1112 ].join(''); 1113 1114 addComponent('math', simpleHash(mathConstants + mathOperations)); 1115 1116 const apiFeatures = [ 1117 'Promise' in window, 1118 'Symbol' in window, 1119 'fetch' in window, 1120 'Proxy' in window, 1121 'Reflect' in window, 1122 'Map' in window, 1123 'Set' in window, 1124 'WeakMap' in window, 1125 'WeakSet' in window, 1126 'BigInt' in window, 1127 'Atomics' in window, 1128 'SharedArrayBuffer' in window, 1129 'Intl' in window, 1130 'WebAssembly' in window, 1131 'ArrayBuffer' in window, 1132 'WebSocket' in window, 1133 'Worker' in window, 1134 'IntersectionObserver' in window, 1135 'ResizeObserver' in window, 1136 'MutationObserver' in window, 1137 'localStorage' in window, 1138 'sessionStorage' in window,
1139 'indexedDB' in window, 1140 'crypto' in window, 1141 'Bluetooth' in navigator, 1142 'clipboard' in navigator, 1143 'credentials' in navigator, 1144 'geolocation' in navigator, 1145 'mediaDevices' in navigator, 1146 'serviceWorker' in navigator, 1147 'requestIdleCallback' in window, 1148 'speechSynthesis' in window, 1149 'performance' in window, 1150 'Notification' in window 1151 ].map((val, idx) => val ? idx.toString(36) : '').join(''); 1152 addComponent('api', simpleHash(apiFeatures)); 1153 1154 try { 1155 if (navigator.plugins) { 1156 const plugins = Array.from(navigator.plugins || []) 1157 .map(p => [p.name, p.description, p.filename].filter(Boolean).join('~')) 1158 .join('|'); 1159 if (plugins) addComponent('plg', simpleHash(plugins)); 1160 1161 const mimeTypes = Array.from(navigator.mimeTypes || []) 1162 .map(m => [m.type, m.description, m.suffixes].filter(Boolean).join('~')) 1163 .join('|'); 1164 if (mimeTypes) addComponent('mime', simpleHash(mimeTypes)); 1165 } 1166 } catch(e) { 1167 addComponent('plg_err', simpleHash(e.toString())); 1168 } 1169 1170 try { 1171 if (performance) { 1172 const performanceData = [ 1173 performance.timeOrigin, 1174 performance.now(), 1175 performance.memory ? performance.memory.jsHeapSizeLimit : null, 1176 performance.memory ? performance.memory.totalJSHeapSize : null, 1177 performance.memory ? performance.memory.usedJSHeapSize : null 1178 ].filter(Boolean).join('|'); 1179 addComponent('perf', simpleHash(performanceData)); 1180 } 1181 } catch(e) { 1182 addComponent('perf_err', simpleHash(e.toString())); 1183 } 1184 1185 let timeWarpDetection = ''; 1186 try { 1187 const startNow = Date.now(); 1188 const startPerf = performance.now(); 1189 let sum = 0; 1190 for (let i = 0; i < 10000; i++) sum += Math.sqrt(i); 1191 const endNow = Date.now(); 1192 const endPerf = performance.now(); 1193 const dateTimeDiff = endNow - startNow; 1194 const perfTimeDiff = endPerf - startPerf; 1195 const timingRatio = dateTimeDiff > 0 ? (perfTimeDiff / dateTimeDiff).toFixed(2) : 'error'; 1196 timeWarpDetection = timingRatio; 1197 } catch(e) { 1198 timeWarpDetection = 'error'; 1199 } 1200 addComponent('time_warp', timeWarpDetection); 1201 1202 try { 1203 const conn = navigator.connection || navigator.mozConnection || navigator.webkitConnection; 1204 if (conn) { 1205 const connData = [conn.effectiveType, conn.type, conn.downlink, conn.rtt, conn.saveData] 1206 .filter(v => v !== undefined).join('|'); 1207 addComponent('conn', simpleHash(connData)); 1208 } 1209 } catch(e) {} 1210 1211 try { 1212 if (typeof CSS !== 'undefined' && CSS.supports) { 1213 const cssFeatures = [ 1214 CSS.supports('-webkit-appearance', 'none'), 1215 CSS.supports('-moz-appearance', 'none'), 1216 CSS.supports('accent-color', 'auto'), 1217 CSS.supports('container-type', 'inline-size'), 1218 CSS.supports('color', 'oklch(0.5 0.2 240)'), 1219 CSS.supports('view-transition-name', 'root'), 1220 CSS.supports('anchor-name', '--a') 1221 ].map((v, i) => v ? i.toString(36) : '').join(''); 1222 addComponent('css', simpleHash(cssFeatures)); 1223 } 1224 } catch(e) {} 1225 1226 function simpleHash(str) { 1227 if (!str) return 'empty'; 1228 1229 let h1 = 0xdeadbeef, h2 = 0x41c6ce57; 1230 for (let i = 0, ch; i < str.length; i++) { 1231 ch = str.charCodeAt(i); 1232 h1 = Math.imul(h1 ^ ch, 2654435761); 1233 h2 = Math.imul(h2 ^ ch, 1597334677); 1234 } 1235 h1 = Math.imul(h1 ^ (h1 >>> 16), 2246822507); 1236 h1 ^= Math.imul(h2 ^ (h2 >>> 13), 3266489909); 1237 h2 = Math.imul(h2 ^ (h2 >>> 16), 2246822507); 1238 h2 ^= Math.imul(h1 ^ (h1 >>> 13), 3266489909); 1239 1240 const h = 4294967296 * (2097151 & h2) + (h1 >>> 0); 1241 return h.toString(36); 1242 } 1243 1244 const allComponents = components.join(';'); 1245 const fingerprint = simpleHash(allComponents); 1246 1247 return { 1248 fingerprint: fingerprint, 1249 //fingerprintDetails: allComponents // Uncomment to see the details and debug 1250 }; 1251} 1252 1253window.bbcs_computeFingerprint = bbcs_computeFingerprint;</script>
1253 1254
1254<script> 1255 var bbcsCaptchaData = {"mode":5,"params":{"instruction":"Find the shape: Triangle, with color: Red","shapesData":[{"type":"triangle","color":"blue","hash":"564f2c1c70b6e055ece5130820c86a9e6e6c0f088f4cf140b2fd8a9268f0e82b"},{"type":"square","color":"purple","hash":"6433b609cf1cea8bc10fd58020b903736b93844515849297d4971d85afe497ad"},{"type":"square","color":"green","hash":"a08661437881e18a019cf80763becbec3b27675c4d0d114fee5c82254951fa6a"},{"type":"triangle","color":"red","hash":"9d2e9642e984959e94e9c1215cda0db3793b25717abb3299911b79af571606c8"},{"type":"circle","color":"blue","hash":"5810c194f93a9e5e78197d6bb58007325676503b67dcf85ec668df5de8dfc26a"}]},"ajaxUrl":"https:\/\/www.basketinside.com\/wp-admin\/admin-ajax.php","nonce":"628deecdae","time":1790937853,"selectRequestMode":"x4dfa69220443b19517c6756e12699dcf","checkFunction":"fadc2530ffa8892c13a4476448ef1e942","data":"window.data","autoRender":false,"challengeToken":"1eEkrhJVlyAouweOojLN3BpYM6LKy3CLx0UaD+Cf51IoypPZID90Wzntq8xF5Av0aXtF\/i7emebNEnd5gHppdeRRcp9a7PFBNb82mqKUxQUzdYa5YsT1tnLw5qi8zNpM1imyfe8FvoOMmRXl11hkQH0UBzKEaGkmYUfRlxalvHk="};</script>
1255 1256
1256<script> 1257 /* Main CAPTCHA JS Controller */ 1258 1259function renderCaptcha() { 1260 if (typeof bbcsCaptchaData === "undefined") { 1261 console.error('[BBCS DEBUG] CAPTCHA initial data not loaded'); 1262 if (typeof bbcsJsData !== 'undefined' && bbcsJsData.debugEnabled) { 1263 console.log('[BBCS DEBUG] renderCaptcha: bbcsCaptchaData is undefined'); 1264 } 1265 return; 1266 } 1267 1268 const mode = parseInt(bbcsCaptchaData.mode, 10); 1269 const params = bbcsCaptchaData.params; 1270 1271 if (typeof bbcsJsData !== 'undefined' && bbcsJsData.debugEnabled) { 1272 console.log('[BBCS DEBUG] renderCaptcha: mode=' + mode + ' params keys=' + (params ? Object.keys(params).join(',') : 'null') + ' token=' + (bbcsCaptchaData.challengeToken ? bbcsCaptchaData.challengeToken.substring(0,10)+'...' : 'empty')); 1273 } 1274 1275 switch (mode) { 1276 case 0: 1277 if (typeof renderMode0Captcha === "function") { 1278 renderMode0Captcha(params); 1279 } 1280 break; 1281 case 1: 1282 if (typeof renderMode1Captcha === "function") { 1283 renderMode1Captcha(params); 1284 } 1285 break; 1286 case 2: 1287 if (typeof renderMode2Captcha === "function") { 1288 renderMode2Captcha(params); 1289 } 1290 break; 1291 case 3: 1292 if (typeof renderMode3Captcha === "function") { 1293 renderMode3Captcha(params); 1294 } 1295 break; 1296 case 4: 1297 if (typeof renderMode4Captcha === "function") { 1298 renderMode4Captcha(params); 1299 } 1300 break; 1301 case 5: 1302 if (typeof renderMode5Captcha === "function") { 1303 renderMode5Captcha(params); 1304 } 1305 break; 1306 case 6: 1307 if (typeof renderMode6Captcha === "function") { 1308 renderMode6Captcha(params); 1309 } 1310 break; 1311 case 7: 1312 if (typeof renderMode7Captcha === "function") { 1313 renderMode7Captcha(params); 1314 } 1315 break; 1316 case 8: 1317 if (typeof renderMode8Captcha === "function") { 1318 renderMode8Captcha(params); 1319 } 1320 break; 1321 default: 1322 const renderer = window['renderMode' + mode + 'Captcha']; 1323 if (typeof renderer === "function") { 1324 renderer(params); 1325 } else if (typeof renderMode0Captcha === "function") { 1326 renderMode0Captcha(params); 1327 } else { 1328 console.error('[BBCS DEBUG] Unknown CAPTCHA mode:', mode); 1329 } 1330 break; 1331 } 1332} 1333 1334window.renderCaptcha = renderCaptcha;</script>
1334 1335
1335<script> 1336 /* CAPTCHA Mode 5 JS (moving shapes) */ 1337 1338function renderMode5Captcha(params) { 1339 const { instruction, shapesData } = params; 1340 1341 document.getElementById("content").innerHTML = ` 1342 <div style="text-align:center;"> 1343 <p>${instruction}</p> 1344 <canvas id="captchaCanvas" width="300" height="200" style="border:1px solid #ddd;"></canvas> 1345 </div> 1346 `; 1347 1348 (function() { 1349 const canvas = document.getElementById("captchaCanvas"); 1350 const ctx = canvas.getContext("2d"); 1351 1352 const shapes = shapesData.map(shape => ({ 1353 ...shape, 1354 x: Math.random() * 250 + 25, 1355 y: Math.random() * 150 + 25, 1356 size: 25, 1357 speedX: Math.random() * 2 - 1, 1358 speedY: Math.random() * 2 - 1 1359 })); 1360 1361 function drawShapes() { 1362 ctx.clearRect(0, 0, canvas.width, canvas.height); 1363 1364 shapes.forEach(shape => { 1365 ctx.fillStyle = shape.color; 1366 ctx.strokeStyle = "#000"; 1367 ctx.lineWidth = 1; 1368 1369 shape.x += shape.speedX; 1370 shape.y += shape.speedY; 1371 1372 if (shape.x < shape.size || shape.x > canvas.width - shape.size) { 1373 shape.speedX = -shape.speedX; 1374 } 1375 if (shape.y < shape.size || shape.y > canvas.height - shape.size) { 1376 shape.speedY = -shape.speedY; 1377 } 1378 1379 switch(shape.type) { 1380 case "circle": 1381 ctx.beginPath(); 1382 ctx.arc(shape.x, shape.y, shape.size, 0, Math.PI * 2); 1383 ctx.fill(); 1384 ctx.stroke(); 1385 break; 1386 case "square": 1387 ctx.fillRect(shape.x - shape.size, shape.y - shape.size, shape.size * 2, shape.size * 2); 1388 ctx.strokeRect(shape.x - shape.size, shape.y - shape.size, shape.size * 2, shape.size * 2); 1389 break; 1390 case "triangle": 1391 ctx.beginPath(); 1392 ctx.moveTo(shape.x, shape.y - shape.size); 1393 ctx.lineTo(shape.x + shape.size, shape.y + shape.size); 1394 ctx.lineTo(shape.x - shape.size, shape.y + shape.size); 1395 ctx.closePath(); 1396 ctx.fill(); 1397 ctx.stroke(); 1398 break; 1399 case "star": 1400 drawStar(ctx, shape.x, shape.y, 5, shape.size, shape.size/2); 1401 break; 1402 case "hexagon": 1403 drawHexagon(ctx, shape.x, shape.y, shape.size); 1404 break; 1405 } 1406 }); 1407 1408 requestAnimationFrame(drawShapes); 1409 } 1410 1411 function drawStar(ctx, cx, cy, spikes, outerRadius, innerRadius) { 1412 let rot = Math.PI / 2 * 3; 1413 let x = cx; 1414 let y = cy; 1415 let step = Math.PI / spikes; 1416 1417 ctx.beginPath(); 1418 ctx.moveTo(cx, cy - outerRadius); 1419 1420 for (let i = 0; i < spikes; i++) { 1421 x = cx + Math.cos(rot) * outerRadius; 1422 y = cy + Math.sin(rot) * outerRadius; 1423 ctx.lineTo(x, y); 1424 rot += step; 1425 1426 x = cx + Math.cos(rot) * innerRadius; 1427 y = cy + Math.sin(rot) * innerRadius; 1428 ctx.lineTo(x, y); 1429 rot += step; 1430 } 1431 1432 ctx.lineTo(cx, cy - outerRadius); 1433 ctx.closePath(); 1434 ctx.fill(); 1435 ctx.stroke(); 1436 } 1437 1438 function drawHexagon(ctx, x, y, size) { 1439 ctx.beginPath(); 1440 for (let i = 0; i < 6; i++) { 1441 const angle = 2 * Math.PI / 6 * i; 1442 const hx = x + size * Math.cos(angle); 1443 const hy = y + size * Math.sin(angle); 1444 if (i === 0) ctx.moveTo(hx, hy); 1445 else ctx.lineTo(hx, hy); 1446 } 1447 ctx.closePath(); 1448 ctx.fill(); 1449 ctx.stroke(); 1450 } 1451 1452 canvas.addEventListener("click", function(e) { 1453 const rect = canvas.getBoundingClientRect(); 1454 const x = e.clientX - rect.left; 1455 const y = e.clientY - rect.top; 1456
1457 shapes.forEach(shape => { 1458 if (isPointInShape(x, y, shape)) { 1459 window[bbcsJsData.checkFunctionName]('post', window.data, shape.hash); 1460 } 1461 }); 1462 }); 1463 1464 function isPointInShape(x, y, shape) { 1465 switch(shape.type) { 1466 case "circle": 1467 return Math.sqrt((x - shape.x) * (x - shape.x) + (y - shape.y) * (y - shape.y)) <= shape.size; 1468 case "square": 1469 return x >= shape.x - shape.size && x <= shape.x + shape.size && 1470 y >= shape.y - shape.size && y <= shape.y + shape.size; 1471 case "triangle": { 1472 const p1 = {x: shape.x, y: shape.y - shape.size}; 1473 const p2 = {x: shape.x + shape.size, y: shape.y + shape.size}; 1474 const p3 = {x: shape.x - shape.size, y: shape.y + shape.size}; 1475 return isPointInTriangle(x, y, p1, p2, p3); 1476 } 1477 case "star": 1478 case "hexagon": 1479 return Math.sqrt((x - shape.x) * (x - shape.x) + (y - shape.y) * (y - shape.y)) <= shape.size * 1.2; 1480 } 1481 return false; 1482 } 1483 1484 function isPointInTriangle(px, py, p1, p2, p3) { 1485 const area = 0.5 * Math.abs( 1486 (p1.x * (p2.y - p3.y) + p2.x * (p3.y - p1.y) + p3.x * (p1.y - p2.y)) 1487 ); 1488 1489 const a = 0.5 * Math.abs( 1490 (p1.x * (p2.y - py) + p2.x * (py - p1.y) + px * (p1.y - p2.y)) 1491 ); 1492 const b = 0.5 * Math.abs( 1493 (px * (p2.y - p3.y) + p2.x * (p3.y - py) + p3.x * (py - p2.y)) 1494 ); 1495 const c = 0.5 * Math.abs( 1496 (p1.x * (py - p3.y) + px * (p3.y - p1.y) + p3.x * (p1.y - py)) 1497 ); 1498 1499 return Math.abs(area - (a + b + c)) < 0.01; 1500 } 1501 1502 requestAnimationFrame(drawShapes); 1503 })(); 1504} 1505 1506window.renderMode5Captcha = renderMode5Captcha;</script>
1506 1507
1507<script> 1508 // BotBlocker Check Core - Shared JS for FULL and FRONTEND modes 1509// Requires: window.bbcsJsData to be set BEFORE this script runs. 1510 1511window.__bbcs_hp_t = Date.now(); 1512 1513window.bbcs_cleanAndDecodeBase64ToUtf8 = function(str) { 1514 str = str.replace(/\s/g, ''); 1515 return decodeURIComponent(escape(window.atob(str))); 1516}; 1517 1518window.ipv4 = ''; 1519window.ipdbc = ''; 1520window.rct = ''; 1521 1522window.bbcsDebugEnabled = !!bbcsJsData.debugEnabled; 1523 1524window.bbcsDebugLog = function(...args) { 1525 if (window.bbcsDebugEnabled) { 1526 console.log('[BBCS DEBUG]', ...args); 1527 } 1528}; 1529 1530window.bbcsDebugWarn = function(...args) { 1531 if (window.bbcsDebugEnabled) { 1532 console.warn('[BBCS DEBUG]', ...args); 1533 } 1534}; 1535 1536window.bbcsDebugError = function(...args) { 1537 if (window.bbcsDebugEnabled) { 1538 console.error('[BBCS DEBUG]', ...args); 1539 } 1540}; 1541 1542bbcsDebugLog(bbcsJsData.shortName + ' v.' + bbcsJsData.version); 1543 1544var bbcsDdosRetryCount = 0; 1545var bbcsDdosMaxRetries = 3; 1546 1547window.bbcsCheckUI = { 1548 timerInterval: null, 1549 secondsLeft: 6, 1550 attempt: 0, 1551 maxAttempts: 3, 1552 _lastMsg: '', 1553 1554 showVerifying: function () { 1555 this._stopTimer(); 1556 this.secondsLeft = 6; 1557 this.attempt = 0; 1558 this._render(bbcsJsData.verifyingText || 'Verifying...'); 1559 }, 1560 1561 showRetry: function (attemptNum) { 1562 this._stopTimer(); 1563 this.attempt = attemptNum; 1564 this._render((bbcsJsData.retryingText || 'Retrying...') + ' (' + attemptNum + '/' + this.maxAttempts + ')', true); 1565 this._startTimer(); 1566 }, 1567 1568 showCAPTCHA: function () { 1569 this._stopTimer(); 1570 this._render(bbcsJsData.verificationFailedText || 'Verification failed. Please complete the challenge below.'); 1571 }, 1572 1573 showSuccess: function () { 1574 this._stopTimer(); 1575 this._render(bbcsJsData.approvedText || 'Access approved. Redirecting...'); 1576 }, 1577 1578 hide: function () { 1579 this._stopTimer(); 1580 var el = document.getElementById('bbcs-status'); 1581 if (el) { el.innerHTML = ''; el.style.display = 'none'; } 1582 }, 1583 1584 _render: function (msg, showSeconds) { 1585 this._lastMsg = msg; 1586 var el = document.getElementById('bbcs-status'); 1587 if (!el) return; 1588 el.style.display = ''; 1589 var html = '<div style="margin-bottom:2px;">' + msg + '</div>'; 1590 if (showSeconds) { 1591 html += '<div style="font-size:12px;color:#999;">' + this.secondsLeft + 's</div>'; 1592 } 1593 el.innerHTML = html; 1594 }, 1595 1596 _startTimer: function () { 1597 var self = this; 1598 this.timerInterval = setInterval(function () { 1599 if (self.secondsLeft > 0) { 1600 self.secondsLeft--; 1601 self._render(self._lastMsg, true); 1602 } 1603 if (self.secondsLeft <= 0) { 1604 self._stopTimer(); 1605 } 1606 }, 1000); 1607 }, 1608 1609 _stopTimer: function () { 1610 if (this.timerInterval) { 1611 clearInterval(this.timerInterval); 1612 this.timerInterval = null; 1613 } 1614 } 1615}; 1616 1617function bbcs_isDdosResponse(responseText, status) { 1618 if (!responseText) return false; 1619 if (typeof status !== 'undefined' && status !== 200) return false; 1620 try { 1621 JSON.parse(responseText.trim()); 1622 return false; 1623 } catch(e) {} 1624 return responseText.indexOf('<') !== -1 || responseText.indexOf('document.cookie') !== -1; 1625} 1626 1627function bbcs_extractDdosCookie(responseText) { 1628 if (!responseText) return false; 1629 var cookiePatterns = [ 1630 /document\.cookie\s*=\s*"([^"]+)"/, 1631 /document\.cookie\s*=\s*'([^']+)'/ 1632 ]; 1633 for (var i = 0; i < cookiePatterns.length; i++) { 1634 var cookieMatch = responseText.match(cookiePatterns[i]); 1635 if (cookieMatch && cookieMatch[1]) { 1636 bbcsDebugLog('DDoS protection cookie detected, setting: ' + cookieMatch[1].substring(0, 20) + '...'); 1637 document.cookie = cookieMatch[1]; 1638 return true; 1639 } 1640 } 1641 return false; 1642} 1643 1644function bbcs_handleDdosResponse(responseText, s, d, x, checkFn) { 1645 bbcs_extractDdosCookie(responseText); 1646 if (bbcsDdosRetryCount < bbcsDdosMaxRetries) { 1647 bbcsDdosRetryCount++; 1648 if (bbcsJsData.ddosResilience) { 1649 bbcsCheckUI.showRetry(bbcsDdosRetryCount); 1650 }
1651 var delay = bbcsDdosRetryCount * 1000; 1652 bbcsDebugLog('DDoS retry ' + bbcsDdosRetryCount + '/' + bbcsDdosMaxRetries + ' in ' + delay + 'ms'); 1653 setTimeout(function() { 1654 checkFn(s, d, x); 1655 }, delay); 1656 return true; 1657 } 1658 if (bbcsJsData.ddosResilience) { 1659 bbcsCheckUI.showCAPTCHA(); 1660 } 1661 var rc = 0; 1662 try { rc = parseInt(sessionStorage.getItem('bbcsRedirectCount') || '0', 10); } catch(e) {} 1663 if (rc >= 2) { 1664 bbcsDebugLog('DDoS redirect loop detected, stopping'); 1665 botblocker_captcha_render(); 1666 return true; 1667 } 1668 try { sessionStorage.setItem('bbcsRedirectCount', String(rc + 1)); } catch(e) {} 1669 bbcsDebugLog('DDoS retries exhausted, redirecting to page'); 1670 window.location.href = bbcsJsData.redirectUrl; 1671 return true; 1672} 1673 1674function bbcs_detectAll() { 1675 const results = { 1676 navigatorMismatch: bbcs_detectNavigatorMismatch(), 1677 unsupportedFeatures: bbcs_detectUnsupportedFeatures(), 1678 fakePlugins: bbcs_detectFakePlugins(), 1679 fontRenderMismatch: bbcs_detectFontRenderMismatch(), 1680 chromiumProperties: bbcs_detectChromiumProperties(), 1681 jitter: bbcs_detectJitter(), 1682 webGLMismatch: bbcs_detectWebGL(), 1683 touchEventMismatch: bbcs_detectTouchEvent(), 1684 languageMismatch: bbcs_detectLanguageMismatch(), 1685 crossbrowserIncognito: bbcs_isIncognito(), 1686 browserFingerprint: bbcs_computeFingerprint() 1687 }; 1688 return results; 1689} 1690 1691function bbcs_getDetectionParams() { 1692 const startTime = Date.now(); 1693 const timeoutLimit = 1000; 1694 try { 1695 const detectionResult = bbcs_detectAll(); 1696 if (Date.now() - startTime > timeoutLimit) { 1697 bbcsDebugWarn('Detection methods took too long, returning partial results'); 1698 } 1699 detectionResult.browserFingerprint = detectionResult.browserFingerprint.fingerprint; 1700 let detectionParams = ''; 1701 for (const [key, value] of Object.entries(detectionResult)) { 1702 detectionParams += '&' + key + '=' + encodeURIComponent(value); 1703 } 1704 return detectionParams; 1705 } catch (e) { 1706 bbcsDebugError('Error during detection:', e); 1707 return '&error=detection_failed'; 1708 } 1709} 1710 1711function bbcs_areCookiesEnabled() { 1712 var cookieEnabled = navigator.cookieEnabled; 1713 if (cookieEnabled === undefined) { 1714 document.cookie = "testcookie"; 1715 cookieEnabled = document.cookie.indexOf("testcookie") != -1; 1716 } 1717 return cookieEnabled; 1718} 1719 1720if (!bbcs_areCookiesEnabled()) { 1721 var cookieoff = 1; 1722} else { 1723 var cookieoff = 0; 1724} 1725 1726var _host = window.location.hostname; 1727if (_host.indexOf('www.') === 0) { _host = _host.substring(4); } 1728if (_host !== window.atob(bbcsJsData.hostBase64) && 1729 _host !== window.atob(bbcsJsData.hostNoPortBase64)) { 1730 window.location = window.atob(bbcsJsData.redirectUrlBase64); 1731 throw "stop"; 1732} 1733 1734document.getElementById("content").innerHTML = bbcsJsData.loadingText; 1735 1736function handleWorkerSignal() { 1737 return new Promise(function(resolve) { 1738 if (bbcsJsData.recaptchaEnabled) { 1739 try { 1740 grecaptcha.ready(function() { 1741 grecaptcha.execute(bbcsJsData.recaptchaKey3, { 1742 action: bbcsJsData.country 1743 }).then(function(token) { 1744 window.rct = token; 1745 resolve('HWS'); 1746 }).catch(function(e) { 1747 bbcsDebugError('reCAPTCHA execute failed:', e); 1748 window.rct = ''; 1749 resolve('HWS'); 1750 }); 1751 }); 1752 } catch (e) { 1753 bbcsDebugError('reCAPTCHA unavailable:', e); 1754 window.rct = ''; 1755 resolve('HWS'); 1756 } 1757 } else { 1758 window.rct = ''; 1759 resolve('HWS'); 1760 } 1761 }); 1762} 1763 1764function makeIpv6Request(url) { 1765 return new Promise(function(resolve) { 1766 var xhr = new XMLHttpRequest(); 1767 xhr.open('GET', url, true); 1768 xhr.setRequestHeader("Content-Type", "application/json"); 1769 xhr.timeout = 5000; 1770 xhr.onload = function() { 1771 if (xhr.readyState === 4 && xhr.status === 200) { 1772 var json = JSON.parse(xhr.responseText); 1773 window.ipv4 = json.ip; 1774 window.ipdbc = bbcsJsData.emptyValue; 1775 resolve(true); 1776 } else { 1777 bbcsDebugError('Error status:', xhr.status); 1778 resolve(false); 1779 } 1780 }; 1781 xhr.ontimeout = function() { 1782 bbcsDebugError('Timeout'); 1783 resolve(false); 1784 }; 1785 xhr.onerror = function() { 1786 bbcsDebugError('Error'); 1787 resolve(false); 1788 }; 1789 xhr.send(); 1790 }); 1791} 1792 1793async function dispatchServiceEvent() { 1794 if (bbcsJsData.ipVersion == 6) { 1795 var ok = await makeIpv6Request(bbcsJsData.apiIpv6); 1796 if (!ok) { 1797 ok = await makeIpv6Request(bbcsJsData.apiGsIpv6); 1798 } 1799 return ok ? 'DSE' : 'Error DSE'; 1800 } 1801 window.ipv4 = ''; 1802 window.ipdbc = ''; 1803 return 'Result DSE'; 1804} 1805 1806function initProcessHandler(result1, result2) { 1807 var bbcs_detectionParams = bbcs_getDetectionParams(); 1808 window.data = 'test=' + bbcsJsData.testHash + 1809 '&h1=' + bbcsJsData.h1Hash + 1810 '&date=' + bbcsJsData.time + 1811 '&hdc=' + bbcsJsData.hosting + 1812 '&a=' + window.adb_var + 1813 '&country=' + bbcsJsData.country + 1814 '&ip=' + bbcsJsData.ip + 1815 '&version=' + bbcsJsData.version + 1816 '&cid=' + bbcsJsData.cid + 1817 '&ptr=' + bbcsJsData.ptr + 1818 '&w=' + screen.width + 1819 '&h=' + screen.height + 1820 '&cw=' + document.documentElement.clientWidth + 1821 '&ch=' + document.documentElement.clientHeight + 1822 '&co=' + screen.colorDepth + 1823 '&pi=' + screen.pixelDepth + 1824 '&ref=' + encodeURIComponent(document.referrer) + 1825 '&accept=' + bbcsJsData.httpAccept + 1826 '&tz=' + Intl.DateTimeFormat().resolvedOptions().timeZone +
1827 '&ipdbc=' + window.ipdbc + 1828 '&ipv4=' + window.ipv4 + 1829 '&rct=' + window.rct + 1830 '&cookieoff=' + cookieoff + 1831 bbcs_detectionParams; 1832 1833 var bbcsHpInput = document.querySelector('[data-bbcs-honeypot]'); 1834 window.__bbcs_hp_present = !!(bbcsHpInput && bbcsHpInput.name); 1835 if (window.__bbcs_hp_present) { 1836 window.data += '&bbcs_hp_name=' + encodeURIComponent(bbcsHpInput.name); 1837 window.data += '&' + bbcsHpInput.name + '=' + encodeURIComponent(bbcsHpInput.value || ''); 1838 } 1839 window[bbcsJsData.checkFunctionName]('botblocker-security', window.data, ''); 1840 bbcsDebugLog('initProcessHandler -> ', result1, result2); 1841} 1842 1843async function performAsyncStep() { 1844 try { 1845 const result1 = await handleWorkerSignal(); 1846 const result2 = await dispatchServiceEvent(); 1847 initProcessHandler(result1, result2); 1848 } catch (error) { 1849 bbcsDebugError(error); 1850 } 1851} 1852 1853performAsyncStep(); 1854 1855function botblocker_captcha_render() { 1856 if (bbcsJsData.ddosResilience && typeof bbcsCircuitBreaker !== 'undefined' && bbcsCircuitBreaker.isOpen()) { 1857 bbcsCircuitBreaker.showFallback(); 1858 return; 1859 } 1860 if (typeof renderCaptcha === 'function') { 1861 window.__bbcs_hp_t = Date.now(); 1862 renderCaptcha(); 1863 } 1864} 1865 1866window[bbcsJsData.checkFunctionName] = function(s, d, x, ajaxEndpoint) { 1867 if (bbcsJsData.ddosResilience) { 1868 if (typeof bbcsCircuitBreaker !== 'undefined' && bbcsCircuitBreaker.isOpen()) { 1869 bbcsCircuitBreaker.showFallback(); 1870 return; 1871 } 1872 } 1873 if (!ajaxEndpoint) ajaxEndpoint = bbcsJsData.ajaxUrl; 1874 if (bbcsJsData.ddosResilience) { 1875 if (bbcsDdosRetryCount === 0) { 1876 bbcsCheckUI.showVerifying(); 1877 } 1878 } else { 1879 document.getElementById("content").innerHTML = bbcsJsData.loadingText; 1880 } 1881 1882 var formData = new FormData(); 1883 formData.append('action', 'bbcs_botblocker_check'); 1884 formData.append('nonce', bbcsJsData.nonce); 1885 formData.append(bbcsJsData.selectRequestMode, s); 1886 formData.append('xxx', x); 1887 formData.append('rowid', bbcsJsData.ruleRecordId); 1888 formData.append('from_suspect', bbcsJsData.suspectStatus); 1889 formData.append('suspect_reason', bbcsJsData.reasonForAction); 1890 formData.append('check_result', bbcsJsData.resultOfAction); 1891 1892 if (typeof bbcsCaptchaData !== 'undefined' && bbcsCaptchaData.challengeToken) { 1893 formData.append('challenge_token', bbcsCaptchaData.challengeToken); 1894 } 1895 1896 var additionalParams = new URLSearchParams(d); 1897 for (var pair of additionalParams.entries()) { 1898 formData.append(pair[0], pair[1]); 1899 } 1900 1901 if (window.__bbcs_hp_present) { 1902 formData.append('bbcs_hp_time', String(Date.now() - window.__bbcs_hp_t)); 1903 } 1904 1905 var xhr = new XMLHttpRequest(); 1906 xhr.open('POST', ajaxEndpoint, true); 1907 xhr.timeout = bbcsDdosRetryCount > 0 ? 10000 : 5000; 1908 1909 xhr.onload = function() { 1910 if (xhr.status == 200) { 1911 bbcsDebugLog('Plugin status: ' + xhr.status); 1912 try { 1913 var responseText = xhr.responseText.trim(); 1914 bbcsDebugLog('Response text:', responseText); 1915 1916 if (responseText) { 1917 var obj = JSON.parse(responseText); 1918 1919 var bbcsSigValid = true; 1920 if (bbcsJsData.ddosResilience) { 1921 if (typeof obj.bbcs_sig !== 'string') { 1922 bbcsSigValid = false; 1923 } else { 1924 delete obj.bbcs_sig; 1925 } 1926 } 1927 1928 if (bbcsJsData.ddosResilience && bbcsSigValid && typeof obj.cookie !== 'string') { 1929 var backupCookie = xhr.getResponseHeader('X-BBCS-' + bbcsJsData.uid); 1930 if (backupCookie) { 1931 obj.cookie = backupCookie; 1932 } 1933 } 1934 1935 // ddos mode: a cookie is only trusted from a signed response 1936 if (typeof(obj.cookie) == "string" && (!bbcsJsData.ddosResilience || bbcsSigValid)) { 1937 bbcsDebugLog('Cookie received, value=' + obj.cookie.substring(0,20) + '... uid=' + bbcsJsData.uid + ' redirectUrl=' + bbcsJsData.redirectUrl); 1938 if (bbcsJsData.ddosResilience) { 1939 bbcsCheckUI.showSuccess(); 1940 if (typeof bbcsCircuitBreaker !== 'undefined') { 1941 bbcsCircuitBreaker.recordSuccess(); 1942 } 1943 } 1944 var expiryDate = new Date(); 1945 expiryDate.setTime(expiryDate.getTime() + ((bbcsJsData.cookieLifetime || 604800) * 1000)); 1946 var expires = "expires=" + expiryDate.toUTCString(); 1947 var bbcsSS = bbcsJsData.samesite; 1948 if (bbcsSS === 'None' && window.location.protocol !== 'https:') { bbcsSS = 'Lax'; } 1949 var cookieStr = bbcsJsData.uid + "=" + obj.cookie + "-" + bbcsJsData.time + "; SameSite=" + bbcsSS + ";" + 1950 (bbcsSS === 'None' ? ' Secure' : '') + "; " + expires + "; path=/;"; 1951 bbcsDebugLog('Setting cookie: name=' + bbcsJsData.uid + ' value_len=' + (obj.cookie + "-" + bbcsJsData.time).length); 1952 document.cookie = cookieStr; 1953 var verifyCookie = document.cookie; 1954 bbcsDebugLog('document.cookie after set (first 80 chars): ' + (verifyCookie ? verifyCookie.substring(0,80) : 'EMPTY') + ' hasUidCookie=' + (verifyCookie && verifyCookie.indexOf(bbcsJsData.uid) !== -1)); 1955 try { sessionStorage.removeItem('bbcsRedirectCount'); } catch(e) {} 1956 if (bbcsJsData.silentMode) { 1957 try { sessionStorage.removeItem('bbcsMode8Retries'); } catch(e) {} 1958 document.getElementById("content").innerHTML = bbcsJsData.approvedText; 1959 setTimeout(function() { window.location.href = bbcsJsData.redirectUrl; }, 0); 1960 } else { 1961 document.getElementById("content").innerHTML = bbcsJsData.loadingText; 1962 bbcsDebugLog('redirecting to ' + bbcsJsData.redirectUrl); 1963 window.location.href = bbcsJsData.redirectUrl; 1964 } 1965 } else if (!bbcsSigValid) { 1966 bbcsDebugLog('No cookie AND invalid sig. cookie=' + (typeof obj.cookie) + ' sigValid='
1966+ bbcsSigValid + ' ddos=' + bbcsJsData.ddosResilience); 1967 if (typeof bbcsCircuitBreaker !== 'undefined') { 1968 bbcsCircuitBreaker.recordFailure(); 1969 } 1970 if (bbcsJsData.ddosResilience) { 1971 bbcsCheckUI.showCAPTCHA(); 1972 } 1973 botblocker_captcha_render(); 1974 bbcsDebugLog('Response signature missing or invalid; rejecting tampered response'); 1975 } else { 1976 bbcsDebugLog('No cookie, sig valid. cookie=' + (typeof obj.cookie) + ' keys=' + Object.keys(obj).join(',')); 1977 if (bbcsJsData.ddosResilience) { 1978 bbcsCheckUI.showCAPTCHA(); 1979 } 1980 botblocker_captcha_render(); 1981 bbcsDebugLog('Bad bot detected'); 1982 } 1983 1984 if (typeof(obj.error) == "string") { 1985 if (bbcsJsData.jsAdminEnabled) { 1986 if (obj.error == "BotBlocker Account Not Found" 1987 || obj.error == "This domain doesn't have a valid license" 1988 || obj.error == "Subscription Expired" 1989 || obj.error == "This domain is not registered or is not active" 1990 || obj.error == bbcsJsData.jsErrorMessage) { 1991 const ErrorMsg = document.createElement('div'); 1992 const errH1 = document.createElement('h1'); 1993 errH1.style.textAlign = 'center'; 1994 errH1.style.color = 'red'; 1995 errH1.textContent = obj.error; 1996 ErrorMsg.appendChild(errH1); 1997 document.body.insertAdjacentElement('afterbegin', ErrorMsg); 1998 document.getElementById("content").style.visibility = "hidden"; 1999 document.getElementById("content").innerHTML = ''; 2000 } else if (obj.error == "Cookies disabled") { 2001 document.getElementById("content").innerHTML = 2002 "<h2 style=\"text-align:center; color:red;\">" + bbcsJsData.cookieDisabledText + "</h2>"; 2003 } 2004 } 2005 if (obj.error == "timeout" || obj.error == "Wrong Click") { 2006 if (bbcsJsData.silentMode) { 2007 var r = 0; 2008 try { r = parseInt(sessionStorage.getItem('bbcsMode8Retries') || '0', 10); } catch(e) {} 2009 if (r < 2) { 2010 try { sessionStorage.setItem('bbcsMode8Retries', String(r + 1)); } catch(e) {} 2011 window.location.reload(); 2012 return; 2013 } 2014 } 2015 document.getElementById("content").innerHTML = bbcsJsData.loadingText; 2016 window.location.href = bbcsJsData.redirectUrl; 2017 } 2018 } 2019 } else { 2020 bbcsDebugWarn('Empty or invalid response from server.'); 2021 if (ajaxEndpoint !== bbcsJsData.verifyUrl && bbcsJsData.verifyUrl) { 2022 bbcsDebugLog('admin-ajax.php returned empty response, trying verify endpoint'); 2023 window[bbcsJsData.checkFunctionName](s, d, x, bbcsJsData.verifyUrl); 2024 return; 2025 } 2026 if (bbcsJsData.ddosResilience) { 2027 if (typeof bbcsCircuitBreaker !== 'undefined') { 2028 bbcsCircuitBreaker.recordFailure(); 2029 } 2030 bbcsCheckUI.showCAPTCHA(); 2031 } 2032 botblocker_captcha_render(); 2033 } 2034 } catch (e) { 2035 bbcsDebugError('Error parsing JSON:', e); 2036 bbcsDebugLog('Response text received:', xhr.responseText); 2037 if (bbcs_isDdosResponse(xhr.responseText, xhr.status)) { 2038 var checkFn = window[bbcsJsData.checkFunctionName]; 2039 if (bbcs_handleDdosResponse(xhr.responseText, s, d, x, checkFn)) return; 2040 } 2041 if (bbcsJsData.ddosResilience) { 2042 if (typeof bbcsCircuitBreaker !== 'undefined') { 2043 bbcsCircuitBreaker.recordFailure(); 2044 } 2045 bbcsCheckUI.showCAPTCHA(); 2046 } 2047 botblocker_captcha_render(); 2048 } 2049 2050 } else { 2051 bbcsDebugLog('Error: ' + xhr.status); 2052 if (ajaxEndpoint !== bbcsJsData.verifyUrl && bbcsJsData.verifyUrl) { 2053 bbcsDebugLog('admin-ajax.php returned ' + xhr.status + ', trying verify endpoint'); 2054 window[bbcsJsData.checkFunctionName](s, d, x, bbcsJsData.verifyUrl); 2055 return; 2056 } 2057 if (bbcs_isDdosResponse(xhr.responseText, xhr.status)) { 2058 var checkFn = window[bbcsJsData.checkFunctionName]; 2059 if (bbcs_handleDdosResponse(xhr.responseText, s, d, x, checkFn)) return; 2060 } 2061 if (bbcsJsData.ddosResilience) { 2062 if (typeof bbcsCircuitBreaker !== 'undefined') { 2063 bbcsCircuitBreaker.recordFailure(); 2064 } 2065 bbcsCheckUI.showCAPTCHA(); 2066 } 2067 botblocker_captcha_render(); 2068 } 2069 }; 2070 2071 xhr.ontimeout = function() { 2072 bbcsDebugLog('timeout'); 2073 if (ajaxEndpoint !== bbcsJsData.verifyUrl && bbcsJsData.verifyUrl) { 2074 bbcsDebugLog('admin-ajax.php timeout, trying verify endpoint'); 2075 window[bbcsJsData.checkFunctionName](s, d, x, bbcsJsData.verifyUrl); 2076 return; 2077 } 2078 if (bbcsDdosRetryCount > 0) { 2079 bbcsDebugLog('Timeout during DDoS retry, redirecting'); 2080 window.location.href = bbcsJsData.redirectUrl; 2081 return; 2082 } 2083 if (bbcsJsData.ddosResilience) { 2084 if (typeof bbcsCircuitBreaker !== 'undefined') { 2085 bbcsCircuitBreaker.recordFailure(); 2086 } 2087 bbcsCheckUI.showCAPTCHA(); 2088 } 2089 botblocker_captcha_render(); 2090 }; 2091 2092 xhr.onerror = function() { 2093 bbcsDebugLog('error'); 2094 if (ajaxEndpoint !== bbcsJsData.verifyUrl && bbcsJsData.verifyUrl) { 2095 bbcsDebugLog('admin-ajax.php error, trying verify endpoint'); 2096 window[bbcsJsData.checkFunctionName](s, d, x, bbcsJsData.verifyUrl); 2097 return; 2098 } 2099 if (bbcsDdosRetryCount > 0) { 2100 bbcsDebugLog('Error during DDoS retry, redirecting'); 2101 window.location.href = bbcsJsData.redirectUrl; 2102 return; 2103 } 2104 if (bbcsJsData.ddosResilience) { 2105 if (typeof bbcsCircuitBreaker !== 'undefined') { 2106 bbcsCircuitBreaker.recordFailure(); 2107 } 2108 bbcsCheckUI.showCAPTCHA(); 2109 } 2110 botblocker_captcha_render(); 2111 }; 2112 2113 xhr.send(formData); 2114}; 2115</script>
2115 2116 </body> 2117</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.