Repository navigation
Expand file tree
/
Copy pathworker.js
More file actions
212 lines (205 loc) · 52.6 KB
/
Copy pathworker.js
File metadata and controls
212 lines (205 loc) · 52.6 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
// GENERATED — do not edit. Published byte-identical to the script the WebDecoy
// app deploys via its one-click installer. Source lives in the WebDecoy app repo.
// GENERATED by edge/clearance-worker/scripts/bundle.mjs — DO NOT EDIT.
// Source: edge/clearance-worker/src. Rebuild with `npm run build:bundle`.
var ce=[["reflectionbot","Reflectionbot","reflectionbot","crawler"],["gptbot","GPTBot","gptbot","crawler"],["claudebot","ClaudeBot","claudebot","crawler"],["anthropic-ai","Anthropic","anthropic","crawler"],["claude-web","Claude-Web","claude-web","crawler"],["ccbot","CCBot","ccbot","crawler"],["google-extended","Google-Extended","google-extended","crawler"],["bytespider","ByteSpider","bytespider","crawler"],["amazonbot","Amazonbot","amazonbot","crawler"],["facebookbot","FacebookBot","facebookbot","crawler"],["meta-externalagent","Meta-ExternalAgent","meta-externalagent","crawler"],["cohere-ai","Cohere","cohere-ai","crawler"],["cohere","Cohere","cohere-ai","crawler"],["applebot-extended","Applebot-Extended","applebot-extended","crawler"],["youbot","YouBot","youbot","crawler"],["mistralbot","MistralBot","mistral","crawler"],["gemini","Gemini","gemini","crawler"],["ai2bot","AI2Bot","ai2bot","crawler"],["deepseek","DeepSeek","deepseek","crawler"],["qwen","Qwen","qwen","crawler"],["webzio","Webz.io","webzio","crawler"],["sentibot","Sentibot","sentibot","crawler"],["omgili","Omgili","omgili","crawler"],["img2dataset","img2dataset","img2dataset","crawler"],["timpibot","Timpibot","timpibot","crawler"],["velenpublicwebcrawler","VelenPublicWebCrawler","velenpublicwebcrawler","crawler"],["isscyberriskcrawler","ISSCyberRiskCrawler","isscyberriskcrawler","crawler"],["friendlycrawler","FriendlyCrawler","friendlycrawler","crawler"],["duckassistbot","DuckAssistBot","duckassistbot","crawler"],["sofyabot","SofyaBot","sofyabot","crawler"],["xai-searchbot","xAI-SearchBot","xai-searchbot","crawler"],["linkupbot","LinkupBot","linkupbot","crawler"],["perplexitybot","PerplexityBot","perplexitybot","crawler"],["claude-searchbot","Claude-SearchBot","claude-searchbot","crawler"],["oai-searchbot","OAI-SearchBot","oai-searchbot","crawler"],["searchgpt","SearchGPT","searchgpt","crawler"],["phind","Phind","phind","crawler"],["kagi","Kagi","kagi","crawler"],["exa.ai","Exa","exa","crawler"],["exabot","Exa","exa","crawler"],["metaphor","Metaphor","metaphor","crawler"],["tavily","Tavily","tavily","crawler"],["bravesearch","BraveSearch","brave-search","crawler"],["neevabot","NeevaBot","neeva","crawler"],["operator","Operator","operator","crawler"],["claude-user","Claude-User","claude-user","crawler"],["gemini-user","Gemini-User","gemini-user","crawler"],["googleagent-mariner","GoogleAgent-Mariner","googleagent-mariner","crawler"],["mariner","GoogleAgent-Mariner","googleagent-mariner","crawler"],["amazonbuyforme","AmazonBuyForMe","amazon-buyforme","crawler"],["buyforme","AmazonBuyForMe","amazon-buyforme","crawler"],["browser-use","Browser-Use","browser-use","crawler"],["stagehand","Stagehand","stagehand","crawler"],["multion","MultiOn","multion","crawler"],["iboubot","IbouBot","iboubot","crawler"],["googlebot","Googlebot","googlebot","crawler"],["google-inspectiontool","Google-InspectionTool","google-inspectiontool","crawler"],["bingbot","Bingbot","bingbot","crawler"],["msnbot","MSNBot","msnbot","crawler"],["yandexbot","YandexBot","yandexbot","crawler"],["baiduspider","Baiduspider","baiduspider","crawler"],["duckduckbot","DuckDuckBot","duckduckbot","crawler"],["applebot","Applebot","applebot","crawler"],["sogou","Sogou Spider","sogou","crawler"],["qwantify","Qwantify","qwantify","crawler"],["naver","Naver","naver","crawler"],["yeti","Naver","naver","crawler"],["seznambot","SeznamBot","seznam","crawler"],["ecosia","Ecosia","ecosia","crawler"],["mojeekbot","MojeekBot","mojeek","crawler"],["slurp","Yahoo! Slurp","yahoo-slurp","crawler"],["ahrefsbot","AhrefsBot","ahrefsbot","crawler"],["ahrefs","AhrefsBot","ahrefsbot","crawler"],["semrushbot","SemrushBot","semrushbot","crawler"],["semrush","SemrushBot","semrushbot","crawler"],["mj12bot","MJ12bot","mj12bot","crawler"],["dotbot","DotBot","dotbot","crawler"],["rogerbot","Rogerbot","rogerbot","crawler"],["screaming frog","Screaming Frog","screaming-frog","crawler"],["sitebulb","Sitebulb","sitebulb","crawler"],["deepcrawl","DeepCrawl","deepcrawl","crawler"],["oncrawl","OnCrawl","oncrawl","crawler"],["botify","Botify","botify","crawler"],["contentking","ContentKing","contentking","crawler"],["sistrix","SISTRIX","sistrix","crawler"],["serpstat","Serpstat","serpstat","crawler"],["spyfu","SpyFu","spyfu","crawler"],["nessus","Nessus","nessus","crawler"],["qualys","Qualys","qualys","crawler"],["shodan","Shodan","shodan","crawler"],["censys","Censys","censys","crawler"],["nmap","Nmap","nmap","crawler"],["zap/","OWASP ZAP","zap","crawler"],["burp","Burp Suite","burp","crawler"],["nikto","Nikto","nikto","crawler"],["nuclei","Nuclei","nuclei","crawler"],["acunetix","Acunetix","acunetix","crawler"],["netsparker","Netsparker","netsparker","crawler"],["detectify","Detectify","detectify","crawler"],["intruder","Intruder","intruder","crawler"],["python-requests","Python-Requests","python-requests","tool"],["python-urllib","Python-urllib","python-urllib","tool"],["python/","Python","python","tool"],["scrapy","Scrapy","scrapy","tool"],["httpx","HTTPX","httpx","tool"],["aiohttp","aiohttp","aiohttp","tool"],["beautifulsoup","BeautifulSoup","beautifulsoup","tool"],["node-fetch","node-fetch","node-fetch","tool"],["axios/","Axios","axios","tool"],["got/","Got","got","tool"],["undici","Undici","undici","tool"],["go-http-client","Go-HTTP-Client","go-http-client","tool"],["colly","Colly","colly","tool"],["java/","Java","java","tool"],["okhttp","OkHttp","okhttp","tool"],["apache-httpclient","Apache-HttpClient","apache-httpclient","tool"],["jsoup","Jsoup","jsoup","tool"],["guzzlehttp","GuzzleHttp","guzzlehttp","tool"],["php/","PHP","php","tool"],["ruby","Ruby","ruby","tool"],["faraday","Faraday","faraday","tool"],["mechanize","Mechanize","mechanize","tool"],["headlesschrome","HeadlessChrome","headlesschrome","tool"],["puppeteer","Puppeteer","puppeteer","tool"],["playwright","Playwright","playwright","tool"],["selenium","Selenium","selenium","tool"],["phantomjs","PhantomJS","phantomjs","tool"],["splash","Splash","splash","tool"],["browserless","Browserless","browserless","tool"],["browserbase","Browserbase","browserbase","tool"],["ia_archiver","Internet Archive","ia-archiver","crawler"],["archive.org_bot","Archive.org","archive-org-bot","crawler"],["wayback","Wayback Machine","wayback","crawler"],["heritrix","Heritrix","heritrix","crawler"],["brozzler","Brozzler","brozzler","crawler"],["facebookexternalhit","Facebook","facebookexternalhit","crawler"],["facebot","Facebot","facebot","crawler"],["twitterbot","Twitterbot","twitterbot","crawler"],["linkedinbot","LinkedInBot","linkedinbot","crawler"],["slackbot","Slackbot","slackbot","crawler"],["telegrambot","TelegramBot","telegrambot","crawler"],["whatsapp","WhatsApp","whatsapp","crawler"],["discordbot","Discordbot","discordbot","crawler"],["pinterest","Pinterest","pinterestbot","crawler"],["tumblr","Tumblr","tumblr","crawler"],["reddit","Reddit","reddit","crawler"],["embedly","Embedly","embedly","crawler"],["iframely","Iframely","iframely","crawler"],["curl/","cURL","curl","tool"],["wget/","Wget","wget","tool"],["libwww-perl","libwww-perl","libwww-perl","tool"],["lwp-","LWP","lwp","tool"],["httrack","HTTrack","httrack","tool"],["webdecoybot","WebDecoyBot","webdecoybot","crawler"],["uptimerobot","UptimeRobot","uptimerobot","crawler"],["pingdom","Pingdom","pingdom","crawler"],["statuscake","StatusCake","statuscake","crawler"],["betteruptime","Better Uptime","better-uptime","crawler"],["datadog","Datadog Synthetics","datadog-synthetics","crawler"],["newrelic","New Relic","newrelic","crawler"],["site24x7","Site24x7","site24x7","crawler"],["freshping","Freshping","freshping","crawler"],["hetrixtools","HetrixTools","hetrixtools","crawler"],["nodeping","NodePing","nodeping","crawler"],["gtmetrix","GTmetrix","gtmetrix","crawler"],["chrome-lighthouse","Lighthouse","chrome-lighthouse","crawler"],["google page speed","Lighthouse","chrome-lighthouse","crawler"],["feedly","Feedly","feedly","crawler"],["feedfetcher","Feedfetcher-Google","feedfetcher-google","crawler"],["newsblur","NewsBlur","newsblur","crawler"],["inoreader","Inoreader","inoreader","crawler"],["theoldreader","The Old Reader","theoldreader","crawler"],["feedbin","Feedbin","feedbin","crawler"],["miniflux","Miniflux","miniflux","crawler"],["freshrss","FreshRSS","freshrss","crawler"],["commafeed","CommaFeed","commafeed","crawler"],["diffbot","Diffbot","diffbot","crawler"],["import.io","Import.io","import-io","crawler"],["brightdata","Bright Data","bright-data","crawler"],["luminati","Bright Data","bright-data","crawler"],["oxylabs","Oxylabs","oxylabs","crawler"],["scrapingbee","ScrapingBee","scrapingbee","crawler"],["scrapingant","ScrapingAnt","scrapingant","crawler"],["zyte","Zyte","zyte","crawler"],["scrapinghub","Zyte","zyte","crawler"],["apify","Apify","apify","crawler"],["crawlbase","Crawlbase","crawlbase","crawler"],["webscrapingapi","WebScrapingAPI","webscrapingapi","crawler"],["chatgpt-user","ChatGPT-User","chatgpt-user","crawler"],["perplexity-user","Perplexity-User","perplexity-user","crawler"],["mistralai-user","MistralAI-User","mistralai-user","crawler"],["meta-externalfetcher","Meta-ExternalFetcher","meta-externalfetcher","crawler"],["gemini-deep-research","Gemini-Deep-Research","gemini-deep-research","crawler"],["copilot","Microsoft Copilot","copilot","crawler"],["cortana","Cortana","cortana","crawler"],["siri","Siri","siri","crawler"]];var ot=["/_astro/","/_next/","/_nuxt/","/_app/","/assets/","/static/","/build/","/dist/","/wp-content/","/wp-includes/","/cdn-cgi/"],at=new Set(["js","mjs","cjs","css","map","png","jpg","jpeg","gif","svg","webp","avif","ico","bmp","woff","woff2","ttf","otf","eot","mp4","webm","mp3","ogg","wav","avi","mov","zip","gz","br","wasm"]);function le(e){for(let n of ot)if(e.startsWith(n))return!0;let t=e.lastIndexOf("/"),r=e.lastIndexOf(".");return r<=t+1?!1:at.has(e.slice(r+1).toLowerCase())}var ue={window_seconds:60,max_per_path:3,max_per_ip:300,max_per_ip_unidentified:60},H=5e3,B=class{constructor(t={}){this.cfg=t}cfg;paths=new Map;ips=new Map;get windowMs(){let t=this.cfg.window_seconds;return(typeof t=="number"&&t>0?t:ue.window_seconds)*1e3}limit(t){let r=this.cfg[t];return typeof r=="number"&&r>=0?r:ue[t]}check(t,r,n,i=!0){if(!t)return{report:!0};let o=i?this.limit("max_per_ip"):Math.min(this.limit("max_per_ip"),this.limit("max_per_ip_unidentified")),a=this.bump(this.ips,t,n,o);if(!a.report)return a;let s=this.bump(this.paths,t+"\0"+r,n,this.limit("max_per_path")),c=a.suppressedCount??s.suppressedCount,g={report:s.report};return c!==void 0&&(g.suppressedCount=c),(a.suppressionStarted||s.suppressionStarted)&&(g.suppressionStarted=!0,g.report=!0),g}bump(t,r,n,i){let o=t.get(r);if(!o||n-o.windowStart>=this.windowMs){let a=o?.suppressed??0;return t.set(r,{windowStart:n,allowed:1,suppressed:0}),this.evictIfNeeded(t,n),a>0?{report:!0,suppressedCount:a}:{report:!0}}return o.allowed<i?(o.allowed++,{report:!0}):(o.suppressed++,o.suppressed===1?{report:!0,suppressionStarted:!0}:{report:!1})}evictIfNeeded(t,r){if(t.size<=H)return;let n=this.windowMs;for(let[i,o]of t)if(r-o.windowStart>=n&&t.delete(i),t.size<=H)return;for(let i of t.keys())if(t.delete(i),t.size<=H)return}};var st="web-bot-auth";async function I(e,t){let r=e.headers.get("signature-input"),n=e.headers.get("signature");if(!r&&!n)return{status:"none"};if(!r||!n)return{status:"invalid"};if(!t||t.length===0)return{status:"unknown_key"};let i,o;try{i=dt(r),o=pt(n)}catch{return{status:"invalid"}}let a=!1,s=!1;for(let c of i){if(c.params.get("tag")!==st)continue;a=!0;let g=o.get(c.label);if(!g)continue;let l=c.params.get("keyid");if(typeof l!="string")continue;let d;try{d=ct(e,c)}catch{s||=t.some(p=>p.keyid===l);continue}let h=t.find(p=>{if(p.keyid!==l)return!1;try{return ge(p.directory)===d}catch{return!1}});if(!h)continue;s=!0;let m=Date.now()/1e3,b=c.params.get("created"),f=c.params.get("expires");if(typeof b!="number"||typeof f!="number"||m>=f+10||m+10<b||f<=b||f-b>1440*60||!c.components.some(p=>p.name==="@authority"||p.name==="@target-uri"))continue;let S;try{S=lt(e,c)}catch{continue}let u=!1;try{let p=await crypto.subtle.importKey("raw",me(h.public_key),{name:"Ed25519"},!1,["verify"]);u=await crypto.subtle.verify({name:"Ed25519"},p,g,new TextEncoder().encode(S))}catch{u=!1}if(u)return{status:"verified",name:h.name,category:h.category,keyid:l}}return s?{status:"invalid"}:a?{status:"unknown_key"}:{status:"none"}}function ct(e,t){let r=e.headers.get("signature-agent");if(r===null)throw new Error("missing signature-agent");let n=t.components.find(a=>a.name.toLowerCase()==="signature-agent");if(!n)throw new Error("signature-agent is not covered");let i=r.trim(),o;if(i.startsWith('"')){if(n.keyParam!==void 0)throw new Error("legacy string cannot select a member");let a=new O(i);if(o=he(a),a.skipSP(),!a.eof())throw new Error("trailing signature-agent data")}else{if(n.keyParam===void 0)throw new Error("dictionary member is not covered");let a=D(i).find(c=>c.key===n.keyParam),s=a?.items[0]?.value;if(!a||a.isList||a.items.length!==1||typeof s!="string")throw new Error("signature-agent member is not a string");o=s}return ge(o)}function ge(e){let t=new URL(e);if(t.protocol!=="https:"||!t.hostname||t.username||t.password)throw new Error("signature-agent must be an https URL");return`https://${F(t)}`}function lt(e,t){let r=new URL(e.url),n=[];for(let i of t.components)n.push(`${ut(i)}: ${gt(e,r,i)}`);return n.push(`"@signature-params": ${t.raw.trim()}`),n.join(`
`)}function ut(e){let t=`"${e.name.toLowerCase()}"`;return e.keyParam!==void 0?`${t};key="${e.keyParam}"`:t}function gt(e,t,r){let n=r.name.toLowerCase();if(n==="@authority")return F(t);if(n==="@target-uri")return`${t.protocol}//${F(t)}${t.pathname}${t.search}`;if(n==="signature-agent"){let i=e.headers.get("signature-agent");if(i===null)throw new Error("signature-agent covered but absent");return r.keyParam!==void 0?ft(i,r.keyParam):i.trim().replace(/\s+/g," ")}throw new Error(`unsupported covered component ${n}`)}function F(e){let t=e.hostname.toLowerCase(),r=e.port;return!r||e.protocol==="https:"&&r==="443"||e.protocol==="http:"&&r==="80"?t:`${t}:${r}`}function ft(e,t){let n=D(e).find(i=>i.key===t);if(!n)throw new Error(`signature-agent has no member ${t}`);return n.raw}function dt(e){return D(e).map(r=>{if(!r.isList)throw new Error(`Signature-Input member ${r.key} is not an inner list`);let n=r.items.map(i=>{if(typeof i.value!="string")throw new Error("component identifier is not a string");let o=i.params.get("key");return{name:i.value,keyParam:typeof o=="string"?o:void 0}});return{label:r.key,components:n,params:r.params,raw:r.raw}})}function pt(e){let t=D(e),r=new Map;for(let n of t){if(n.isList||n.items.length!==1)throw new Error(`Signature member ${n.key} is not a byte sequence`);let i=n.items[0].bytes;if(!i)throw new Error(`Signature member ${n.key} is not a byte sequence`);r.set(n.key,i)}return r}var O=class{constructor(t,r=0){this.s=t;this.i=r}s;i;eof(){return this.i>=this.s.length}peek(){return this.s[this.i]}skipSP(){for(;!this.eof()&&(this.peek()===" "||this.peek()===" ");)this.i++}};function D(e){let t=new O(e),r=[];for(t.skipSP();!t.eof();){let i={key:de(t),raw:"",isList:!1,items:[],params:new Map};if(!t.eof()&&t.peek()==="="){t.i++;let o=t.i;if(!t.eof()&&t.peek()==="(")i.isList=!0,ht(t,i);else{let{value:a,params:s,bytes:c}=fe(t);i.items.push({value:a,params:s,...c?{bytes:c}:{}})}i.raw=e.slice(o,t.i)}else i.params=j(t),i.items.push({value:!0,params:new Map});if(r.push(i),t.skipSP(),t.eof())break;if(t.peek()!==",")throw new Error(`expected ',' at ${t.i}`);if(t.i++,t.skipSP(),t.eof())throw new Error("trailing comma")}return r}function ht(e,t){for(e.i++;;){if(e.skipSP(),e.eof())throw new Error("unterminated inner list");if(e.peek()===")"){e.i++;break}let{value:r,params:n}=fe(e);if(t.items.push({value:r,params:n}),e.eof())throw new Error("unterminated inner list");let i=e.peek();if(i!==" "&&i!==")")throw new Error(`bad inner list at ${e.i}`)}t.params=j(e)}function fe(e){let{value:t,bytes:r}=pe(e),n=j(e);return{value:t,params:n,bytes:r}}function j(e){let t=new Map;for(;!e.eof()&&e.peek()===";";){e.i++,e.skipSP();let r=de(e),n=!0;if(!e.eof()&&e.peek()==="="){e.i++;let i=pe(e);n=(typeof i.value=="boolean",i.value)}typeof n!="boolean"&&t.set(r,n)}return t}function de(e){let t=e.peek();if(!t||!/[a-z*]/.test(t))throw new Error(`invalid key at ${e.i}`);let r=e.i;for(;!e.eof()&&/[a-z0-9_\-.*]/.test(e.peek());)e.i++;return e.s.slice(r,e.i)}function pe(e){let t=e.peek();if(t==='"')return{value:he(e)};if(t===":")return{value:"",bytes:mt(e)};if(t==="?"){e.i++;let r=e.peek();if(e.i++,r==="1")return{value:!0};if(r==="0")return{value:!1};throw new Error("bad boolean")}if(t==="-"||/[0-9]/.test(t))return{value:wt(e)};if(/[a-zA-Z*]/.test(t))return{value:bt(e)};throw new Error(`invalid bare item at ${e.i}`)}function he(e){e.i++;let t="";for(;!e.eof();){let r=e.s[e.i++];if(r==='"')return t;if(r==="\\"){let n=e.s[e.i++];if(n!=='"'&&n!=="\\")throw new Error("bad escape");t+=n}else{let n=r.charCodeAt(0);if(n<32||n>126)throw new Error("bad char in string");t+=r}}throw new Error("unterminated string")}function mt(e){e.i++;let t=e.i;for(;!e.eof()&&e.peek()!==":";)e.i++;if(e.eof())throw new Error("unterminated byte sequence");let r=e.s.slice(t,e.i);return e.i++,me(r)}function wt(e){let t=e.i;for(e.peek()==="-"&&e.i++;!e.eof()&&/[0-9]/.test(e.peek());)e.i++;if(!e.eof()&&e.peek()===".")for(e.i++;!e.eof()&&/[0-9]/.test(e.peek());)e.i++;return Number(e.s.slice(t,e.i))}function bt(e){let t=e.i;for(e.i++;!e.eof()&&/[a-zA-Z0-9!#$%&'*+\-.^_`|~:/]/.test(e.peek());)e.i++;return e.s.slice(t,e.i)}function me(e){let t=atob(e),r=new Uint8Array(new ArrayBuffer(t.length));for(let n=0;n<t.length;n++)r[n]=t.charCodeAt(n);return r}function we(e,t){return e==="ai_crawlers"?t.ai_crawlers:e==="search_engines"?t.search_engines:e==="monitoring"?t.monitoring:!1}var Y=null,be="";function yt(e){let t=JSON.stringify(e??{});return(!Y||t!==be)&&(Y=new B(e),be=t),Y}var _t=new Set(["wba_signature","known_crawler_ua","http_client_ua","crawler_path","cf_verified_bot","missing_client_hints","test_trigger"]),vt={wba_signature:!0,known_crawler_ua:!0,http_client_ua:!0,crawler_path:!0,cf_verified_bot:!0,missing_client_hints:!0,no_user_agent:!0,no_language:!1,no_fetch_metadata:!1,test_trigger:!0},ye=new Set;function _e(e,t){if(!e)return null;try{return new RegExp(e,"i")}catch{return ye.has(t)||(ye.add(t),console.warn(`[sensor] ignoring invalid ${t}; using built-in`)),null}}function xt(e,t,r,n){let i=Array.isArray(t?.exclude_paths)?t.exclude_paths:[];for(let l of i)if(typeof l=="string"&&l&&r.startsWith(l))return{send:!1,flags:[],ai:""};let o=t?.flags&&typeof t.flags=="object"&&!Array.isArray(t.flags)?t.flags:{},a={...vt,...o},s=e.flags.filter(l=>a[l]!==!1);if(s.length===0)return{send:!1,flags:[],ai:""};if(!s.some(l=>_t.has(l))){let l=t?.sample_rate,d=typeof l=="number"&&l>=0&&l<=1?l:1;if(n>=d)return{send:!1,flags:[],ai:""}}let g=s.includes("known_crawler_ua")||s.includes("http_client_ua")?e.ai:"";return{send:!0,flags:s,ai:g}}function St(e){return e.includes("cf_verified_bot")?"verified":e.includes("known_crawler_ua")?"crawler":e.includes("http_client_ua")||e.includes("missing_client_hints")||e.includes("no_user_agent")||e.includes("test_trigger")?"script":"browser"}function At(e){for(let[t,r,n,i]of ce)if(e.includes(t))return{name:r,id:n,kind:i};return null}var Rt=/(?:bot|crawler|spider)(?:[/\s);,]|$)/i,kt=/^\/(?:robots\.txt|sitemap[\w.-]*\.xml|sitemaps?\/)/i,Ct=/(?:chrome|chromium|edg)\//i,Et=/(?:crios|edgios|fxios)\//i;function Pt(e,t,r){let n=[],i=e.headers,o=i.get("user-agent")??"",a=o.toLowerCase(),s=_e(r?.crawler_ua_pattern,"crawler_ua_pattern"),c=_e(r?.tool_ua_pattern,"tool_ua_pattern");a.trimStart().startsWith("webdecoy-test/")&&n.push("test_trigger"),(i.get("signature-agent")||i.get("signature-input"))&&n.push("wba_signature");let g=At(a),l=g?.name??"";return(g?.kind==="crawler"||(s??Rt).test(o))&&n.push("known_crawler_ua"),(g?.kind==="tool"||c?.test(o))&&n.push("http_client_ua"),kt.test(t.pathname)&&n.push("crawler_path"),(e.cf?.verifiedBotCategory??"")&&n.push("cf_verified_bot"),t.protocol==="https:"&&Ct.test(a)&&!Et.test(a)&&!i.get("sec-ch-ua")&&n.push("missing_client_hints"),o||n.push("no_user_agent"),i.get("accept-language")||n.push("no_language"),i.get("sec-fetch-mode")||n.push("no_fetch_metadata"),{send:n.length>0,flags:n,ai:l}}var Tt="edge_worker",Bt=["known_crawler_ua","cf_verified_bot","wba_signature"];function Ot(e){return e.some(t=>Bt.includes(t))}var It=2e3,Dt=/^(?:cf-|x-forwarded-|x-real-ip$|true-client-ip$|cdn-loop$)/;function Mt(e){let t=e.headers,r=[];for(let[o]of t){let a=o.toLowerCase();Dt.test(a)||r.push(a)}r.sort();let n=e.cf??{},i=n.botManagement??{};return{hn:r,al:t.get("accept-language")??"",ae:t.get("accept-encoding")??"",ja3:C(i.ja3Hash),ja4:C(i.ja4),tls:Lt(n),tc:C(n.tlsClientCiphersSha1)}}function C(e){return typeof e=="string"?e:""}function Lt(e){let t=[C(e.tlsVersion),C(e.tlsClientCiphersSha1)];return t.some(r=>r!=="")?t.join("|"):""}var Nt="wd_clearance",Ut=/^[0-9a-f]{64}$/;function Wt(e){let t=e.headers.get("cookie");if(!t)return;let r;for(let i of t.split(";")){let o=i.indexOf("=");if(!(o<0)&&i.slice(0,o).trim()===Nt){r=i.slice(o+1).trim();break}}if(!r)return;let n=r.indexOf(".");if(!(n<=0))try{let i=r.slice(0,n).replace(/-/g,"+").replace(/_/g,"/"),o=JSON.parse(atob(i+"===".slice((i.length+3)%4))),a=typeof o.fp=="string"?o.fp.trim().toLowerCase():"";return Ut.test(a)?a:void 0}catch{return}}function Kt(e,t,r,n,i){let o=e.headers,a=e.cf;return{aid:r,sid:n,v:2,s:0,f:i.flags,ai:i.ai,source:Tt,ua:o.get("user-agent")??"",ip:o.get("cf-connecting-ip")??"",url:t.toString(),ref:o.get("referer")??"",ts:Date.now(),cfp:Wt(e),cs:Mt(e),metadata:{edge:"cloudflare",method:e.method,asn:a?.asn??null,country:a?.country??null,verified_bot_category:a?.verifiedBotCategory??""}}}function ve(e,t,r,n,i,o,a,s){try{if(le(t.pathname))return"";let c=Pt(e,t,i),g=St(c.flags);if(!i?.enabled||!i.scanner_id||!c.send)return g;let l=xt(c,i,t.pathname,Math.random());if(!l.send)return g;let d=l.flags.includes("test_trigger")?{report:!0}:yt(i.burst).check(e.headers.get("cf-connecting-ip")??"",t.pathname,Date.now(),Ot(l.flags));if(!d.report)return g;let h=Kt(e,t,r,i.scanner_id,l);if(d.suppressedCount||d.suppressionStarted){let m=h.metadata;d.suppressedCount&&(m.suppressed_count=d.suppressedCount),d.suppressionStarted&&(m.suppression_started=!0),l.flags.push("burst_suppressed")}return o.waitUntil($t(n,h,l,e,a,s).then(()=>{},()=>{})),g}catch{return""}}async function $t(e,t,r,n,i,o){if(r.flags.includes("wba_signature"))try{let s=await I(n,i);t.agent={status:s.status,name:"name"in s?s.name:"",category:"category"in s?s.category:"",key_id:"keyid"in s?s.keyid:"",signature_input:n.headers.get("signature-input")??"",signature_agent:n.headers.get("signature-agent")??""}}catch{}let a={"content-type":"application/json"};return o&&(a["x-wd-sensor-key"]=o),fetch(`${e}/api/v1/detect/public`,{method:"POST",headers:a,body:JSON.stringify(t),signal:AbortSignal.timeout(It)})}function M(e){if(typeof e!="string")return"";let t=e.trim().toLowerCase().replace(/:\d+$/,"").replace(/\.$/,"");return t.length>0&&t.length<=253?t:""}var L=["route_min_trust","route_attribution","monitor_routes","route_exceptions","bot_behaviors","credential_reach","route_refusals","crawler_behavior","ai_referrals"];var J=60,zt=500,Vt=6e3,xe=40,Gt=60,Ht=16,A=new TextEncoder,Ft=60,jt=24,Yt=3e3,Jt=2e4,qt=1e4,Xt=16,x=new Map;function Zt(e,t,r){return`${e}|${t}|${r}`}function Se(e,t,r,n,i=Date.now()){try{let o=e?.label??"",a=e?.mode??"",s=e?.pattern??"",c=e?.previews??[],g=e?.behavior??"",l=e?.crawlerBehavior??"",d=e?.outsideReach??"";if(!o||!r||!r.siteKey||!r.apiBase)return;let h=M(t);if(!h)return;let m=Math.floor(i/1e3/J)*J,b=Zt(m,a,h);for(let[w,y]of x)y.bucketStart!==m&&(N(y,r,n),x.delete(w));let f=x.get(b);if(!f){if(x.size>=Xt)for(let[w,y]of x)N(y,r,n),x.delete(w);f={bucketStart:m,mode:a,host:h,counts:new Map,routes:new Map,previews:new Map,credentials:new Map,referrals:new Map,refusals:[],routeBytes:0,total:0},x.set(b,f),Qt(b,f,r,n,i)}f.counts.set(o,(f.counts.get(o)??0)+1);let S=typeof s=="string"?s:"",u=typeof g=="string"?g:"",p=typeof l=="string"?l:"",_=`${S}
${o}
${u}
${p}`,R=f.routes.get(_);R?R.count++:(f.routes.set(_,{pattern:S,verdict:o,behavior:u,crawlerBehavior:p,count:1}),f.routeBytes+=A.encode(S).length+A.encode(o).length+A.encode(u).length+A.encode(p).length+xe);for(let w of Array.isArray(c)?c:[]){if(!w||typeof w.pattern!="string"||!w.pattern)continue;let y=f.previews.get(w.pattern);y||(y={evaluated:0,refused:new Map},f.previews.set(w.pattern,y),f.routeBytes+=A.encode(w.pattern).length+Gt),y.evaluated++,typeof w.refused=="string"&&w.refused&&(y.refused.has(w.refused)||(f.routeBytes+=A.encode(w.refused).length+Ht),y.refused.set(w.refused,(y.refused.get(w.refused)??0)+1))}typeof d=="string"&&d&&f.credentials.set(d,(f.credentials.get(d)??0)+1);let v=e?.referral;if(v&&typeof v.platform=="string"&&v.platform&&typeof v.path=="string"){let w=`${v.platform}
${v.path}`,y=f.referrals.get(w);y?y.count++:(f.referrals.set(w,{platform:v.platform,path:v.path,count:1}),f.routeBytes+=A.encode(v.platform).length+A.encode(v.path).length+xe)}let k=e?.refusal;k&&typeof k.ip=="string"&&k.ip&&typeof k.path=="string"&&k.path.startsWith("/")&&(f.refusals.push({ip:k.ip,path:k.path,at:Math.floor(i/1e3),verdict:o}),f.routeBytes+=Ft),f.total++,(f.total>=zt||f.routeBytes>=Vt)&&(N(f,r,n),x.delete(b))}catch{}}function Qt(e,t,r,n,i){try{let o=(t.bucketStart+J)*1e3,a=Math.floor(Math.random()*qt),s=Math.max(0,Math.min(o-i+a,Jt));n.waitUntil(new Promise(c=>{setTimeout(()=>{try{x.get(e)===t&&(N(t,r,n),x.delete(e))}catch{}c()},s)}))}catch{}}function N(e,t,r){try{if(e.total<=0||e.counts.size===0)return;let n={};for(let[l,d]of e.counts)n[l]=d;let i=[];for(let l of e.routes.values()){let d={pattern:l.pattern,verdict:l.verdict,count:l.count};l.behavior&&(d.behavior=l.behavior),l.crawlerBehavior&&(d.crawler_behavior=l.crawlerBehavior),i.push(d)}let o={organization_id:t.siteKey,bucket_start:e.bucketStart,mode:e.mode,counts:n,route_counts:i,report_id:crypto.randomUUID()};if(e.previews.size>0){let l=[];for(let[d,h]of e.previews){let m={};for(let[b,f]of h.refused)m[b]=f;l.push({pattern:d,evaluated:h.evaluated,additional_refusals:m})}o.previews=l}if(e.credentials.size>0){let l=[];for(let[d,h]of e.credentials)l.push({credential_id:d,outside_reach:h});o.credential_presentations=l}e.referrals.size>0&&(o.ai_referrals=[...e.referrals.values()].map(l=>({platform:l.platform,path:l.path,count:l.count}))),t.propertyId&&(o.property_id=t.propertyId),o.host=e.host,t.bundleVersion&&(o.reporter_version=t.bundleVersion);let a=!!(t.scannerId&&t.sensorKey);a&&(o.scanner_id=t.scannerId),o.capabilities=t.capabilities??L;let s=a?e.refusals:[],c=()=>rr(t.apiBase,JSON.stringify(o),a?t.sensorKey:void 0),g=s.length===0?c():tr(t.siteKey,s).then(l=>{o.refusals=l}).catch(()=>{}).then(c);r.waitUntil(g.then(()=>{},()=>{}))}catch{}}async function er(e,t,r){let n=await crypto.subtle.digest("SHA-256",A.encode(`${e.toLowerCase()}|${t}|${r}`)),i="";for(let o of new Uint8Array(n))i+=o.toString(16).padStart(2,"0");return i.slice(0,jt)}async function tr(e,t){let r=[];for(let n of t)r.push({k:await er(e,n.ip,n.path),t:n.at,v:n.verdict});return r}async function rr(e,t,r){let n=new AbortController,i=setTimeout(()=>n.abort(),Yt),o={"content-type":"application/json"};r&&(o["x-wd-sensor-key"]=r);try{await fetch(e.replace(/\/+$/,"")+"/api/v1/clearance/telemetry",{method:"POST",headers:o,body:t,signal:n.signal})}finally{clearTimeout(i)}}var E={"chat.deepseek.com":"DeepSeek","chat.openai.com":"ChatGPT","chatgpt.com":"ChatGPT","claude.ai":"Claude","copilot.microsoft.com":"Copilot","deepseek.com":"DeepSeek","gemini.google.com":"Gemini","grok.com":"Grok","kagi.com":"Kagi","meta.ai":"Meta AI","perplexity.ai":"Perplexity","phind.com":"Phind","www.deepseek.com":"DeepSeek","www.grok.com":"Grok","www.kagi.com":"Kagi","www.meta.ai":"Meta AI","www.perplexity.ai":"Perplexity","www.phind.com":"Phind","www.you.com":"You.com","you.com":"You.com"};var nr=["utm_source","ref","utm_medium"],Ae=500;function ir(e,t){let r=(e??"").trim();if(r)try{return E[new URL(r).hostname.toLowerCase()]??""}catch{return""}let n;try{n=new URL(t)}catch{return""}for(let i of nr)for(let o of n.searchParams.getAll(i)){let a=or(o);if(a)return a}return""}var Re=e=>e.replace(/[ \-_.]/g,"");function or(e){let t=e.trim().toLowerCase();if(!t)return"";try{let n=new URL(t).hostname;n&&(t=n.toLowerCase())}catch{}if(t=t.replace(/\.$/,""),E[t])return E[t];let r=Re(t);for(let[n,i]of Object.entries(E))if(r===Re(i.toLowerCase())||r===n.replace(/^www\./,"").replace(/\./g,""))return i;return""}function ke(e,t){if(e.method!=="GET")return null;let r=e.headers;if(r.get("sec-fetch-mode")!=="navigate")return null;let n=r.get("sec-fetch-dest");if(n&&n!=="document")return null;let i=ir(r.get("referer")??"",t.toString());if(!i)return null;let o=t.pathname||"/";return o.length>Ae&&(o=o.slice(0,Ae)),{platform:i,path:o}}var X={"attested-human":2,"human-likely":1,clean:0};function ar(e){return X[e??""]??0}function q(e){return e>0?Object.keys(X).find(t=>X[t]===e)??"":""}function Ce(e){return e=sr(e),e=lr(e),e.toLowerCase()}function sr(e){for(let t=0;t<4;t++){let r=cr(e);if(r===e)break;e=r}return e}function cr(e){if(!e.includes("%"))return e;let t="";for(let r=0;r<e.length;r++){if(e[r]==="%"&&r+2<e.length){let n=Ee(e.charCodeAt(r+1)),i=Ee(e.charCodeAt(r+2));if(n>=0&&i>=0){let o=n<<4|i;if(o<128){t+=String.fromCharCode(o),r+=2;continue}}}t+=e[r]}return t}function Ee(e){return e>=48&&e<=57?e-48:e>=97&&e<=102?e-97+10:e>=65&&e<=70?e-65+10:-1}function lr(e){if(e==="")return e;let t=e.length>1&&e[e.length-1]==="/",r=[];for(let i of e.split("/"))if(!(i===""||i===".")){if(i===".."){r.length>0&&r.pop();continue}r.push(i)}let n="/"+r.join("/");return t&&n!=="/"&&(n+="/"),n}function W(e,t){let r=Ce(e),n=Ce(t);if(n.endsWith("/*")){let i=n.slice(0,-2);return i===""?!0:r===i||r.startsWith(i+"/")}return r===n}function U(e){return e.endsWith("/*")?e.length-2:1<<20}function K(e,t,r){let n=new Map,i=new Set,o=[],a=[],s=new Map,c=(u,p)=>{let _=new Set(u);for(let R of p)for(let v of s.get(R)??[])_.add(v);return _.size===0?void 0:[..._].sort()},g=(u,p,_)=>_?{pattern:u,required_trust:p,refused_behaviors:_}:{pattern:u,required_trust:p};for(let u of t){if(!W(e,u.pattern))continue;if((u.exceptions??[]).some(R=>W(e,R))){a.push(u.pattern);continue}let p=n.get(u.pattern);p===void 0&&o.push(u.pattern);let _=ar(u.min_trust);(p===void 0||_>p)&&n.set(u.pattern,_),u.mode!=="monitor"&&i.add(u.pattern);for(let R of u.refuse_behaviors??[])s.has(u.pattern)||s.set(u.pattern,new Set),s.get(u.pattern)?.add(R)}let l=[];if(o.length===0){let u="";for(let p of a)(u===""||U(p)>U(u))&&(u=p);return{covering:o,deciding_mode:"",attributed:"",required_trust:"",requirement_source:"",previews:l,excepted_by:u,refused_behaviors:[]}}o.sort((u,p)=>U(p)-U(u));let d=r==="monitor",h=o.filter(u=>i.has(u)),m=d?"monitor":"enforce";if(h.length===0){if(!d)for(let u of o)l.push(g(u,q(n.get(u)??0),c([],[u])));h=o,m="monitor"}let b=0,f="";for(let u of h){let p=n.get(u)??0;p>b&&(b=p,f=u)}let S=c([],h)??[];if(m==="enforce")for(let u of o)i.has(u)||l.push(g(u,q(Math.max(b,n.get(u)??0)),c(S,[u])));return{covering:o,deciding_mode:m,attributed:h[0],required_trust:q(b),requirement_source:f,previews:l,excepted_by:"",refused_behaviors:S}}var ur="other",gr={"search engine crawler":"search","ai search":"search","ai assistant":"agent","ai crawler":"training","page preview":"link_preview","feed fetcher":"feeds","monitoring & analytics":"monitoring","search engine optimization":"seo",security:"security_testing"};function $(e){let t=e.trim().toLowerCase();return t?gr[t]??ur:""}function Z(e,t){let r=$(e);return r!==""&&t.includes(r)}var fr={search_engines:["search engine crawler"],ai_crawlers:["ai assistant","ai crawler","ai search"],monitoring:["monitoring & analytics"]};function Pe(e,t){let r=fr[e];return r?r.every(n=>Z(n,t)):!1}var dr=W;function Te(e,t,r){return e?t?t.some(n=>dr(r,n)):!0:!1}var pr="x-wd-service-token",hr="wd_clearance";function Be(e,t,r=[]){if(e.graded&&t&&!Le(e.graded.trust,t))return{pass:!1,label:"insufficient-trust"};if(e.crawler&&r.length>0){if(e.crawler.behavior&&r.includes(e.crawler.behavior))return{pass:!1,label:"crawler-refused"};if(!e.crawler.behavior&&e.crawler.exempted)return{pass:!1,label:"missing"}}return{pass:e.pass,label:e.label}}async function De(e,t,r){let n=new URL(e.url).pathname,i=K(n,Me(t),t.mode),o=i.deciding_mode||t.mode,a=await mr(e,t,r,i.covering.length>0,i.excepted_by!==""),s=a.behavior??"",c=Be(a,i.required_trust,i.refused_behaviors),g=c.label==="excepted"?i.excepted_by:c.label==="unscoped"?"":i.attributed,l=!c.pass&&o==="enforce",d=i.previews.map(h=>{let m=Be(a,h.required_trust,h.refused_behaviors??[]);return{pattern:h.pattern,refused:!m.pass&&!l?m.label:""}});return{pass:c.pass,label:c.label,pattern:g,mode:o,previews:d,behavior:c.pass?s:"",crawlerBehavior:a.crawler?.behavior??"",referral:ke(e,new URL(e.url)),outsideReach:a.outsideReach??""}}async function mr(e,t,r,n,i){let o=await wr(e,t,r);if(o.grants)return{pass:!0,label:"machine"};let a=await br(e,t,r,n,i);return o.outsideReach?{...a,outsideReach:o.outsideReach}:a}async function wr(e,t,r){let n=e.headers.get(pr);if(!n)return{grants:!1,outsideReach:""};let i=await We(n,t.keys,r.siteKey);if(!i||i.typ!=="machine"||!i.sub)return{grants:!1,outsideReach:""};if(t.active_credentials.includes(i.sub))return{grants:!0,outsideReach:""};let o=(t.restricted_credentials??[]).find(s=>s&&s.id===i.sub);if(!o)return{grants:!1,outsideReach:""};let a=new URL(e.url).pathname;return Te(o.here,o.paths,a)?{grants:!0,outsideReach:""}:{grants:!1,outsideReach:i.sub}}async function br(e,t,r,n,i){let o=await r.verifiedBotCategory(e,n)||"",a=o?{behavior:$(o),exempted:!1}:void 0;if(o&&vr(o,t)){let l=$(o);return{pass:!0,label:"verified-bot",behavior:l,crawler:{behavior:l,exempted:!0}}}let s=await I(e,t.signed_agents);if(s.status==="verified"&&xr(s.category,t))return{pass:!0,label:"signed-agent",behavior:Oe(s.category),crawler:{behavior:Oe(s.category),exempted:!0}};if(s.status==="invalid"&&n)return{pass:!1,label:"agent-impersonation",crawler:a};if(!n)return i?{pass:!0,label:"excepted",crawler:a}:{pass:!0,label:"unscoped",crawler:a};let c=te(e.headers.get("cookie")??"",hr);if(!c)return{pass:!1,label:"missing",crawler:a};let g=await We(c,t.keys,r.siteKey);return!g||(g.typ??"")!==""?{pass:!1,label:"invalid",crawler:a}:t.denied_fps&&t.denied_fps.includes(g.fp)?{pass:!1,label:"revoked",crawler:a}:{pass:!0,label:"valid",graded:{trust:g.trust},crawler:a}}function Me(e){let t=new Set(e.routes),r=new Map;for(let i of e.route_exceptions??[])t.has(i.pattern)&&Array.isArray(i.except)&&r.set(i.pattern,i.except);let n=e.routes.map(i=>({pattern:i,exceptions:r.get(i)}));for(let i of e.route_min_trust??[])t.has(i.pattern)&&n.push({pattern:i.pattern,min_trust:i.min_trust,exceptions:r.get(i.pattern)});for(let i of e.monitor_routes??[])n.push({pattern:i.pattern,min_trust:i.min_trust,mode:"monitor",exceptions:i.except});for(let i of e.route_refusals??[])!Array.isArray(i.refuse_behaviors)||i.refuse_behaviors.length===0||(i.mode==="monitor"?n.push({pattern:i.pattern,mode:"monitor",refuse_behaviors:i.refuse_behaviors}):t.has(i.pattern)&&n.push({pattern:i.pattern,exceptions:r.get(i.pattern),refuse_behaviors:i.refuse_behaviors}));return n}var yr={"attested-human":2,"human-likely":1,clean:0};function Q(e){return yr[e??""]??0}function Le(e,t){return Q(e)>=Q(t)}function _r(e,t){return t?K(e,t,"enforce").required_trust:""}function vr(e,t){let r=t.allow_behaviors;return r?Z(e,r):Ne(e,t.allow)}function xr(e,t){let r=t.allow_behaviors;return r?Pe(e,r):we(e,t.allow)}function Oe(e){return e==="search_engines"?"search":e==="monitoring"?"monitoring":""}function Ne(e,t){let r=e.trim().toLowerCase();return!!(t.search_engines&&r.includes("search engine crawler")||t.ai_crawlers&&r.startsWith("ai ")||t.monitoring&&r.includes("monitoring"))}function Sr(e,t){return K(e,t.map(r=>({pattern:r})),"enforce").covering.length>0}function ee(e){return!e.pass&&e.mode==="enforce"&&(e.label==="missing"||e.label==="invalid")}function Ue(e){return ee(e)?{...e,pass:!0,label:"outage-pass"}:e}function te(e,t){for(let r of e.split(";")){let n=r.indexOf("=");if(!(n<0)&&r.slice(0,n).trim()===t)return r.slice(n+1).trim()||null}return null}async function We(e,t,r){try{let n=e.indexOf(".");if(n<0)return null;let i=Ie(e.slice(0,n)),o=Ie(e.slice(n+1)),a=JSON.parse(new TextDecoder().decode(i)),s=t.find(l=>l.kid===a.kid);if(!s)return null;let c=await crypto.subtle.importKey("raw",Ar(s.public_key),{name:"Ed25519"},!1,["verify"]);return!await crypto.subtle.verify({name:"Ed25519"},c,o,i)||a.tenant!==r||Date.now()/1e3>=a.exp?null:a}catch{return null}}function Ie(e){let t=e.replace(/-/g,"+").replace(/_/g,"/")+"=".repeat((4-e.length%4)%4);return Ke(atob(t))}function Ar(e){return Ke(atob(e))}function Ke(e){let t=new Uint8Array(new ArrayBuffer(e.length));for(let r=0;r<e.length;r++)t[r]=e.charCodeAt(r);return t}var V="/.well-known/wd-clearance/outage",re="wd_outage";var Rr="wd-outage-v1",z=null,P=null;async function kr(e,t,r,n=fetch){if(z&&r-z.at<3e4)return z.available;if(P)return P;P=(async()=>{let i=!1;try{let o=new AbortController,a=setTimeout(()=>o.abort(),3e3);try{let s=await n(e.replace(/\/+$/,"")+"/api/v1/clearance",{method:"POST",headers:{"content-type":"application/json","user-agent":"WebDecoy-OutageProbe/1"},body:JSON.stringify({aid:t,fp:"wd-outage-probe",scope:"",ua:"WebDecoy-OutageProbe/1"}),signal:o.signal});s.status<300&&(i=typeof(await s.json())?.granted=="boolean")}finally{clearTimeout(a)}}catch{i=!1}return z={at:r,available:i},i})();try{return await P}finally{P=null}}function $e(e){let t="";for(let r of new Uint8Array(e))t+=String.fromCharCode(r);return btoa(t).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")}async function ze(e,t){let r=await crypto.subtle.importKey("raw",new TextEncoder().encode(e),{name:"HMAC",hash:"SHA-256"},!1,["sign"]);return $e(await crypto.subtle.sign("HMAC",r,new TextEncoder().encode(t)))}async function Ve(e){return $e(await crypto.subtle.digest("SHA-256",new TextEncoder().encode(e))).slice(0,16)}function Ge(e,t,r){return`${Rr}|${e}|${t}|${r}`}async function Cr(e,t,r,n){let i=Math.floor(n/1e3)+300;return`${i}.${await ze(e,Ge(t,i,await Ve(r)))}`}async function He(e,t,r,n,i){if(!t||!e)return!1;let o=e.indexOf(".");if(o<=0)return!1;let a=Number(e.slice(0,o));if(!Number.isInteger(a)||a<=Math.floor(i/1e3)||a>Math.floor(i/1e3)+300)return!1;let s=await ze(t,Ge(r,a,await Ve(n))),c=e.slice(o+1);if(c.length!==s.length)return!1;let g=0;for(let l=0;l<s.length;l++)g|=s.charCodeAt(l)^c.charCodeAt(l);return g===0}async function Fe(e,t,r=Date.now(),n=fetch){let i=(a,s,c={})=>new Response(JSON.stringify(s),{status:a,headers:{"content-type":"application/json","cache-control":"no-store",...c}});if(e.method!=="POST")return i(405,{pass:!1});if(!t.sensorKey)return i(503,{pass:!1,reason:"unsupported"});if(await kr(t.apiBase,t.siteKey,r,n))return i(409,{pass:!1,reason:"mint_available"});let o=await Cr(t.sensorKey,t.host,e.headers.get("user-agent")??"",r);return i(200,{pass:!0,expires_in:300},{"set-cookie":`${re}=${o}; Path=/; Secure; SameSite=Lax; HttpOnly; Max-Age=300`})}var Er="wdfp1",je=`
async function wdDeviceFP() {
// Canvas: 32-bit rolling hash of the dataURL, matching
// EnvironmentalCollector._getCanvasHash in @webdecoy/client. The drawing
// parameters below are part of the fingerprint \u2014 changing any of them
// changes every fingerprint.
var canvas32 = 'na';
try {
var c = document.createElement('canvas');
c.width = 200; c.height = 50;
var x = c.getContext('2d');
x.textBaseline = 'top'; x.font = '14px Arial';
x.fillStyle = '#f60'; x.fillRect(125, 1, 62, 20);
x.fillStyle = '#069'; x.fillText('FCaptcha', 2, 15);
x.fillStyle = 'rgba(102, 204, 0, 0.7)'; x.fillText('FCaptcha', 4, 17);
var dataUrl = c.toDataURL();
var h = 0;
for (var i = 0; i < dataUrl.length; i++) { h = ((h << 5) - h) + dataUrl.charCodeAt(i); h = h & h; }
canvas32 = h.toString(16);
} catch (e) { canvas32 = 'na'; }
var webgl = 'na';
try {
var gc = document.createElement('canvas');
var gl = gc.getContext('webgl') || gc.getContext('experimental-webgl');
if (gl) {
var dbg = gl.getExtension('WEBGL_debug_renderer_info');
var vendor = dbg ? gl.getParameter(dbg.UNMASKED_VENDOR_WEBGL) : 'unknown';
var renderer = dbg ? gl.getParameter(dbg.UNMASKED_RENDERER_WEBGL) : 'unknown';
webgl = String(renderer) + '~' + String(vendor);
}
} catch (e) { webgl = 'na'; }
var tz = 'na';
try { tz = Intl.DateTimeFormat().resolvedOptions().timeZone || 'na'; } catch (e) {}
var raw = ['${Er}', canvas32, webgl,
screen.width + 'x' + screen.height + 'x' + screen.colorDepth,
tz, navigator.platform || 'na', navigator.language || 'na'
].join('|');
var buf = await crypto.subtle.digest('SHA-256', new TextEncoder().encode(raw));
var fp = Array.from(new Uint8Array(buf)).map(function (b) {
return b.toString(16).padStart(2, '0');
}).join('');
return { fp: fp, canvas32: canvas32, webgl: webgl };
}
`;function ne(e){let r=["missing","invalid","insufficient-trust","revoked","crawler-refused","agent-impersonation"].includes(e)?e:"denied";return{version:1,reason:r,recoverable:r==="missing"||r==="invalid"||r==="insufficient-trust"}}function Ye(e){let t=ne(e);return{"cache-control":"no-store","x-wd-clearance":"challenged","x-wd-challenge":String(t.version),"x-wd-challenge-reason":t.reason,"x-wd-challenge-recoverable":String(t.recoverable)}}var Pr=6e4,G="x-wd-clearance",oe="x-wd-class",Je="__wd_clearance_check",se="/.well-known/wd-clearance/pat",T=new Map,Tr=16,Br=3e4,Or=3e5,ae=new Map,ie=new Map,Ir=86400;function qe(e,t){return`https://wd-config.invalid/${encodeURIComponent(e)}/${encodeURIComponent(t)}`}function Xe(){try{return globalThis.caches?.default??null}catch{return null}}async function Ze(e,t){let r=Xe();if(!r)return null;try{let n=await r.match(qe(e,t));return n?await n.json():null}catch{return null}}async function Dr(e,t,r){let n=Xe();if(n)try{await n.put(qe(e,t),new Response(JSON.stringify(r),{headers:{"content-type":"application/json","cache-control":`max-age=${Ir}`}}))}catch{}}function Mr(e){let t=e?.headers.get("retry-after"),r=t?Number(t):NaN;return Number.isFinite(r)&&r>0?Math.min(Math.max(r*1e3,5e3),Or):Br}async function Qe(e,t){let r=Date.now(),n=t,i=T.get(n);if(i&&r-i.at<Pr)return i.config;let o=ae.get(n);if(o!==void 0&&r<o)return i?.config??await Ze(e.siteKey,t);let a=ie.get(n);if(a)return i?.config??a;let s=Lr(e,t,n,r,i?.config??null);ie.set(n,s);try{return await s}finally{ie.delete(n)}}async function Lr(e,t,r,n,i){let o=null;try{let a=`${e.apiBase}/api/v1/clearance/config?aid=${encodeURIComponent(e.siteKey)}`;if(e.propertyId&&(a+=`&pid=${encodeURIComponent(e.propertyId)}`),t&&(a+=`&host=${encodeURIComponent(t)}`),o=await fetch(a,{signal:AbortSignal.timeout(3e3)}),o.ok){let s=await o.json();if(ae.delete(r),T.set(r,{config:s,at:n}),T.size>Tr){let c=T.keys().next();c.done||T.delete(c.value)}return await Dr(e.siteKey,t,s),s}}catch{}return ae.set(r,n+Mr(o)),i??await Ze(e.siteKey,t)}function et(e,t,r,n){return new Response(JSON.stringify({wd_clearance:!0,nonce:e,mode:t,site_key:r,capabilities:n}),{status:200,headers:{"content-type":"application/json","cache-control":"no-store","access-control-allow-origin":"*"}})}var Nr=3e3;async function tt(e,t){let r=new URL(e.url).searchParams.get("fp")??"",n=`${t}/api/v1/clearance/pat?fp=${encodeURIComponent(r)}`,i=new Headers,o=e.headers.get("authorization");o&&i.set("authorization",o);let a;try{a=await fetch(n,{method:"GET",headers:i,redirect:"manual",signal:AbortSignal.timeout(Nr)})}catch{return new Response(JSON.stringify({attested:!1,reason:"unreachable"}),{status:200,headers:{"content-type":"application/json","cache-control":"no-store"}})}let s=new Headers({"content-type":"application/json","cache-control":"no-store"}),c=a.headers.get("www-authenticate");return c&&s.set("www-authenticate",c),new Response(a.body,{status:a.status,headers:s})}function rt(e){if(!e.headers.has(oe)&&!e.headers.has(G))return e;let t=new Headers(e.headers);return t.delete(oe),t.delete(G),new Request(e,{headers:t})}function nt(e,t,r=""){let n=new Headers(e.headers);return n.set(G,t),r&&n.set(oe,r),fetch(new Request(e,{headers:n}))}function it(e,t,r,n="denied"){let i=e.headers.get("accept")??"";if(e.method!=="GET"||!i.includes("text/html"))return new Response(JSON.stringify({error:"clearance required",challenge:ne(n)}),{status:403,headers:{"content-type":"application/json",...Ye(n)}});let o=Wr(t,r);return new Response(o,{status:403,headers:{"content-type":"text/html; charset=utf-8","cache-control":"no-store",[G]:"challenged"}})}var Ur="https://cdn.webdecoy.com/wordpress/assets/icon-128x128.png";function Wr(e,t){return`<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Checking your browser\u2026</title>
<style>
body { font-family: system-ui, sans-serif; display: flex; align-items: center;
justify-content: center; min-height: 100vh; margin: 0; background: #0b0e14; color: #e6e6e6; }
.box { text-align: center; max-width: 24rem; padding: 2rem; }
.brand { display: flex; align-items: center; justify-content: center; gap: 0.6rem; margin-bottom: 1.5rem;
font-weight: 600; font-size: 1rem; letter-spacing: 0.01em; }
.brand img { width: 2.25rem; height: 2.25rem; border-radius: 0.5rem; }
.spin { width: 2rem; height: 2rem; margin: 0 auto 1rem; border: 3px solid #2a2f3a;
border-top-color: #f90289; border-radius: 50%; animation: r 0.8s linear infinite; }
@keyframes r { to { transform: rotate(360deg); } }
p { color: #9aa4b2; font-size: 0.9rem; line-height: 1.5; }
.foot { margin-top: 2rem; font-size: 0.75rem; color: #6b7280; }
.foot a { color: #9aa4b2; text-decoration: none; }
</style>
</head>
<body>
<div class="box">
<div class="brand"><img src="${Ur}" alt="" width="36" height="36">WebDecoy</div>
<div class="spin" id="spin"></div>
<h1 style="font-size:1.1rem">Checking your browser</h1>
<p id="msg">This takes a moment and happens only once.</p>
<p class="foot">This site is protected by <a href="https://webdecoy.com" rel="noopener">WebDecoy</a>.</p>
</div>
<script>
${je}
(async function () {
var msg = document.getElementById('msg');
try {
// CANONICAL device fp, from the single shared source in device-fp.ts.
// Returns the fingerprint plus the raw canvas/WebGL signals the integrity
// check below also needs, so neither context is built twice.
var dfp = await wdDeviceFP();
var fp = dfp.fp;
var canvas32 = dfp.canvas32;
var webgl = dfp.webgl;
// Browser-integrity signals (#327). Collected in-browser and reported raw \u2014
// the server decides. A real browser is internally consistent; a standard
// headless/automation environment betrays incoherence it does not spoof by
// default (permission vs Notification state, absent navigator.languages,
// a Chrome UA with no window.chrome). Coherent signals earn the token a
// 'human-likely' grade; anything off falls back to 'clean' (never blocked).
var integrity = {
webdriver: navigator.webdriver === true,
headless_ua: /headless/i.test(navigator.userAgent),
no_plugins: !(navigator.plugins && navigator.plugins.length > 0),
no_languages: !(navigator.languages && navigator.languages.length > 0),
hardware: navigator.hardwareConcurrency || 0,
canvas_ok: canvas32 !== 'na',
webgl_ok: webgl !== 'na',
chrome_ua: /chrome|chromium|crios/i.test(navigator.userAgent),
chrome_obj: (typeof window.chrome === 'object' && window.chrome !== null),
perm_coherent: true
};
try {
if (navigator.permissions && navigator.permissions.query && typeof Notification !== 'undefined') {
var perm = await navigator.permissions.query({ name: 'notifications' });
// Classic headless-Chrome tell: Notification.permission is the default
// 'default', yet the Permissions API reports 'denied'. A real browser
// agrees with itself.
if (Notification.permission === 'default' && perm.state === 'denied') integrity.perm_coherent = false;
}
} catch (e) { /* permissions unsupported \u2014 leave coherent, fail open */ }
// Device attestation (#329). On a supporting client \u2014 Apple platforms
// today \u2014 this endpoint answers 401 with a PrivateToken challenge, the OS
// silently obtains a token and retries, and we get back a receipt worth an
// 'attested-human' grade. No puzzle, no interaction, nothing to see.
//
// Everywhere else it fails or 401s and we move on: the absence of
// attestation must never cost a visitor anything, because attester
// coverage is thin and not their fault.
var patReceipt = '';
try {
// SAME-ORIGIN by way of the validator's proxy. Fetching WebDecoy directly
// meant Safari ignored the 401 challenge entirely \u2014 cross-origin
// WWW-Authenticate does not trigger its challenge/response handling, so a
// token was never requested. credentials stay same-origin so the browser
// is permitted to do the auth exchange.
var patRes = await fetch(
${JSON.stringify(se)} + '?fp=' + encodeURIComponent(fp),
{ credentials: 'same-origin' }
);
if (patRes.ok) {
var patOut = await patRes.json();
if (patOut && patOut.attested && patOut.receipt) patReceipt = patOut.receipt;
}
} catch (e) { /* unsupported or unreachable \u2014 proceed unattested */ }
var mintBody = JSON.stringify({
aid: ${JSON.stringify(t)},
fp: fp,
scope: '',
ua: navigator.userAgent,
webdriver: integrity.webdriver,
headless: integrity.headless_ua,
integrity: integrity,
pat_receipt: patReceipt
});
// Mint, retrying only when WebDecoy could not be reached (#1245): a network
// error, a timeout, 429 or 5xx. An ANSWER of "not granted" is a refusal and
// is never retried or bypassed.
var waits = [0, 1500, 4000];
for (var attempt = 0; attempt < waits.length; attempt++) {
if (waits[attempt]) await new Promise(function (r) { setTimeout(r, waits[attempt]); });
var out = null;
try {
var ctl = new AbortController();
var timer = setTimeout(function () { ctl.abort(); }, 4000);
var res = await fetch(${JSON.stringify(e)} + '/api/v1/clearance', {
method: 'POST',
headers: { 'content-type': 'application/json' },
body: mintBody,
signal: ctl.signal
});
clearTimeout(timer);
if (res.ok) out = await res.json();
} catch (e) { out = null; }
if (out && out.granted && out.token) {
document.cookie = 'wd_clearance=' + out.token +
'; path=/; secure; samesite=lax; max-age=' + (out.expires_in || 1800);
location.reload();
return;
}
if (out && out.granted === false) {
document.getElementById('spin').style.display = 'none';
msg.textContent = 'Verification did not pass. If you believe this is an error, contact the site owner.';
return;
}
}
// WebDecoy could not mint at all. The site owner chose to let visitors
// through in that case; the validator confirms the outage itself before it
// signs a short pass, so this cannot be used while minting works.
try {
var pass = await fetch(${JSON.stringify(V)}, { method: 'POST', credentials: 'same-origin' });
if (pass.ok) {
var passOut = await pass.json();
if (passOut && passOut.pass) { location.reload(); return; }
}
} catch (e) { /* fall through to the retry message */ }
document.getElementById('spin').style.display = 'none';
msg.textContent = 'Verification could not complete. Please retry shortly.';
} catch (e) {
document.getElementById('spin').style.display = 'none';
msg.textContent = 'Verification could not complete. Please retry shortly.';
}
})();
</script>
</body>
</html>`}var Pn={async fetch(e,t,r){try{return await Kr(e,t,r)}catch{return fetch(e)}}};async function Kr(e,t,r){let n=new URL(e.url),i=n.searchParams.get(Je);e=rt(e);let o=M(n.hostname),a=await Qe({apiBase:t.WD_API_BASE,siteKey:t.WD_SITE_KEY,propertyId:t.WD_PROPERTY_ID},o);if(i!==null)return et(i,a?a.mode:"unknown",t.WD_SITE_KEY,L);if(n.pathname===se)return tt(e,t.WD_API_BASE);if(n.pathname===V)return Fe(e,{apiBase:t.WD_API_BASE,siteKey:t.WD_SITE_KEY,sensorKey:t.WD_SENSOR_KEY,host:o});if(!a)return fetch(e);let s=ve(e,n,t.WD_SITE_KEY,t.WD_API_BASE,a.sensor,r,a.signed_agents,t.WD_SENSOR_KEY),c=await De(e,a,{siteKey:t.WD_SITE_KEY,verifiedBotCategory:g=>g.cf?.verifiedBotCategory??""});if(ee(c)){let g=te(e.headers.get("cookie")??"",re);g&&await He(g,t.WD_SENSOR_KEY,o,e.headers.get("user-agent")??"",Date.now())&&(c=Ue(c))}return Se(c,n.hostname,{siteKey:t.WD_SITE_KEY,apiBase:t.WD_API_BASE,propertyId:t.WD_PROPERTY_ID,scannerId:t.WD_SCANNER_ID,sensorKey:t.WD_SENSOR_KEY,bundleVersion:t.WD_BUNDLE_VERSION},r,Date.now()),c.pass||c.mode!=="enforce"?nt(e,c.label,s):it(e,t.WD_API_BASE,t.WD_SITE_KEY,c.label)}export{Pn as default,Ne as isAllowedBotCategory,Sr as matchesScope,Le as meetsTrust,_r as requiredTrust,Me as routeRules,Q as trustRank};