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