1(()=>{(function(){"use strict";const t={PENDING:"pending",READY:"ready",FAILED:"failed"};let e=t.PENDING,r=null,s=!1,i=null,a=new Map;const o={RECAPTCHA_API_URL:"https://www.google.com/recaptcha/api.js",TOKEN_CACHE_DURATION:12e4,SCRIPT_LOAD_TIMEOUT:1e4,RETRY_DELAY:1e3,MAX_RETRY_ATTEMPTS:1};function n(){return typeof performance!="undefined"&&performance.now?performance.now():Date.now()}function h(o){const a=n();return!o||typeof o=="string"&&o.trim()===""?(console.error("[reCAPTCHA] Site key is required"),e=t.FAILED,s=!0,window.ReCAPTCHAAnalytics&&(window.ReCAPTCHAAnalytics.trackInitialization(!1,n()-a),window.ReCAPTCHAAnalytics.trackError("initialization","Site key is required",{state:t.FAILED,fatal:!0})),Promise.reject(new Error("Site key is required"))):(r=o,i||(i=u().then(()=>{e=t.READY;const s=n()-a;console.log("[reCAPTCHA] Initialized successfully"),window.ReCAPTCHAAnalytics&&(window.ReCAPTCHAAnalytics.trackInitialization(!0,s),window.ReCAPTCHAAnalytics.trackPerformance("initialization",s))}).catch(o=>{console.error("[reCAPTCHA] Initialization failed:",o),e=t.FAILED,s=!0;const i=n()-a;throw window.ReCAPTCHAAnalytics&&(window.ReCAPTCHAAnalytics.trackInitialization(!1,i),window.ReCAPTCHAAnalytics.trackError("initialization",o,{state:t.FAILED,fatal:!0}),window.ReCAPTCHAAnalytics.trackGracefulDegradation("Initialization failed",{state:t.FAILED,error:o.message})),o}),i))}function u(){return new Promise((e,t)=>{if(document.querySelector('script[src*="google.com/recaptcha"]')){c().then(e).catch(t);return}const n=document.createElement("script");n.src=`${o.RECAPTCHA_API_URL}?render=${r}`,n.async=!0,n.defer=!0;const i=setTimeout(()=>{s(),t(new Error("reCAPTCHA script load timeout"))},o.SCRIPT_LOAD_TIMEOUT);n.onload=()=>{clearTimeout(i),c().then(()=>{s(),e()}).catch(e=>{s(),t(e)})},n.onerror=()=>{clearTimeout(i),s(),t(new Error("Failed to load reCAPTCHA script"))};function s(){n.onload=null,n.onerror=null}document.head.appendChild(n)})}function c(){return new Promise((e,t)=>{const o=50;let n=0;const s=setInterval(()=>{n++,window.grecaptcha&&window.grecaptcha.ready?(clearInterval(s),window.grecaptcha.ready(()=>{e()})):n>=o&&(clearInterval(s),t(new Error("grecaptcha object not available")))},100)})}function m(o){const a=n();if(!o||typeof o!="string"){const t={success:!1,token:null,action:o,timestamp:Date.now(),error:"Valid action name is required",gracefulDegradation:!0};return window.ReCAPTCHAAnalytics&&window.ReCAPTCHAAnalytics.trackError("validation","Invalid action name",{action:o,state:e}),Promise.resolve(t)}const i=o.replace(/[^a-zA-Z0-9_]/g,"_");if(!i||i.replace(/_/g,"").length===0){const t={success:!1,token:null,action:o,timestamp:Date.now(),error:"Action name must contain at least one alphanumeric character",gracefulDegradation:!0};return window.ReCAPTCHAAnalytics&&window.ReCAPTCHAAnalytics.trackError("validation","Invalid sanitized action name",{action:o,sanitizedAction:i,state:e}),Promise.resolve(t)}if(s){console.warn("[reCAPTCHA] Graceful degradation mode - no token generated");const e={success:!1,token:null,action:i,timestamp:Date.now(),error:"Graceful degradation mode enabled",gracefulDegradation:!0};return window.ReCAPTCHAAnalytics&&window.ReCAPTCHAAnalytics.trackExecution("degradation",{action:i,reason:"Graceful degradation already enabled"}),Promise.resolve(e)}if(e!==t.READY){console.warn("[reCAPTCHA] Not ready, enabling graceful degradation"),s=!0;const t={success:!1,token:null,action:i,timestamp:Date.now(),error:"reCAPTCHA not ready",gracefulDegradation:!0};return window.ReCAPTCHAAnalytics&&(window.ReCAPTCHAAnalytics.trackGracefulDegradation("reCAPTCHA not ready",{action:i,state:e}),window.ReCAPTCHAAnalytics.trackExecution("degradation",{action:i,reason:"reCAPTCHA not ready"})),Promise.resolve(t)}const r=j(i);if(r){console.log("[reCAPTCHA] Using cached token for action:",i);const e=n()-a,t={success:!0,token:r,action:i,timestamp:Date.now(),cached:!0,gracefulDegradation:!1,executionTime:e};return window.ReCAPTCHAAnalytics&&(window.ReCAPTCHAAnalytics.trackExecution("success",{action:i,cached:!0,executionTime:e}),window.ReCAPTCHAAnalytics.trackPerformance("cached_token_retrieval",e,{action:i,cached:!0})),Promise.resolve(t)}return l(i,0,a)}function l(t,i,a){const c=n();return window.grecaptcha.execute(r,{action:t}).then(e=>{b(t,e);const s=n()-a,o=n()-c;console.log("[reCAPTCHA] Token generated for action:",t,i>0?`(attempt ${i+1})`:"");const r={success:!0,token:e,action:t,timestamp:Date.now(),attempts:i+1,gracefulDegradation:!1,executionTime:s};return window.ReCAPTCHAAnalytics&&(window.ReCAPTCHAAnalytics.trackExecution("success",{action:t,cached:!1,attempts:i+1,executionTime:s}),window.ReCAPTCHAAnalytics.trackTokenGeneration(!0,{action:t,cached:!1,attempts:i+1,executionTime:s}),window.ReCAPTCHAAnalytics.trackPerformance("token_generation",s,{action:t,cached:!1}),window.ReCAPTCHAAnalytics.trackAPICall("execute",!0,o,{action:t})),r}).catch(r=>{const u=n()-c;if(console.error("[reCAPTCHA] Token generation failed (attempt",i+1,"):",r),window.ReCAPTCHAAnalytics&&window.ReCAPTCHAAnalytics.trackAPICall("execute",!1,u,{action:t,error:r.message}),i<o.MAX_RETRY_ATTEMPTS){const e=o.RETRY_DELAY*Math.pow(2,i);return console.log("[reCAPTCHA] Retrying in",e,"ms..."),new Promise(n=>{setTimeout(()=>{n(l(t,i+1,a))},e)})}console.error("[reCAPTCHA] All retry attempts exhausted, enabling graceful degradation"),s=!0;const d=n()-a,h={success:!1,token:null,action:t,timestamp:Date.now(),attempts:i+1,error:r.message||"Token generation failed after retries",gracefulDegradation:!0,executionTime:d};return window.ReCAPTCHAAnalytics&&(window.ReCAPTCHAAnalytics.trackExecution("failure",{action:t,attempts:i+1,error:r.message,executionTime:d}),window.ReCAPTCHAAnalytics.trackTokenGeneration(!1,{action:t,attempts:i+1,executionTime:d}),window.ReCAPTCHAAnalytics.trackGracefulDegradation("Token generation failed after retries",{action:t,attempts:i+1,error:r.message}),window.ReCAPTCHAAnalytics.trackError("token_generation",r,{action:t,attempts:i+1,state:e,fatal:!1})),h})}function f(){return e===t.READY&&!s}function p(){return e}function g(){return s}function v(){s=!0,console.log("[reCAPTCHA] Graceful degradation enabled manually"),window.ReCAPTCHAAnalytics&&window.ReCAPTCHAAnalytics.trackGracefulDegradation("Manually enabled",{state:e})}function b(e,t){const n=Date.now()+o.TOKEN_CACHE_DURATION;a.set(e,{token:t,expiry:n}),setTimeout(()=>{a.delete(e)},o.TOKEN_CACHE_DURATION)}function j(e){const t=a.get(e);return t?Date.now()>t.expiry?(a.delete(e),null):t.token:null}
1function d(){a.clear(),console.log("[reCAPTCHA] Token cache cleared")}function y(){e=t.PENDING,r=null,s=!1,i=null,d()}window.ReCAPTCHAManager={init:h,executeForAction:m,isReady:f,getState:p,isGracefulDegradationEnabled:g,enableGracefulDegradation:v,clearTokenCache:d,reset:y,STATE:t}})()})()
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.