PageSourceSearch

https://vdknn.ru/articles/

html vdknn.ru collected 2026-10-08 05:33:05 UTC 69,056 bytes, 1,977 lines download raw bytes

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.