fpscanner 0.9.5-beta.0 โ†’ 0.9.5-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,4 +1,4 @@
1
- "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});function ne(){return navigator.webdriver}function ie(){return navigator.userAgent}function ae(){return navigator.platform}const u="ERROR",r="INIT",s="NA",f="SKIPPED",g="high",b="low",oe="medium";function h(t){let e=0;for(let n=0,a=t.length;n<a;n++){let i=t.charCodeAt(n);e=(e<<5)-e+i,e|=0}return e.toString(16).padStart(8,"0")}function m(t,e){for(const n in t)t[n]=e}function se(){return navigator.buildID==="20181001000000"}function ce(){try{let t=!1;const e=Error.prepareStackTrace;Error.prepareStackTrace=function(){return t=!0,e};const n=new Error("");return console.log(n),t}catch{return u}}function le(){const t={vendor:r,renderer:r};if(se())return m(t,s),t;try{var e=document.createElement("canvas"),n=e.getContext("webgl")||e.getContext("experimental-webgl");n.getSupportedExtensions().indexOf("WEBGL_debug_renderer_info")>=0?(t.vendor=n.getParameter(n.getExtension("WEBGL_debug_renderer_info").UNMASKED_VENDOR_WEBGL),t.renderer=n.getParameter(n.getExtension("WEBGL_debug_renderer_info").UNMASKED_RENDERER_WEBGL)):m(t,s)}catch{m(t,u)}return t}function ue(){return"__pwInitScripts"in window||"__playwright__binding__"in window}function de(){return navigator.hardwareConcurrency||s}function ge(){const t=[],e=.123456789;return["E","LN10","LN2","LOG10E","LOG2E","PI","SQRT1_2","SQRT2"].forEach(function(i){try{t.push(Math[i])}catch{t.push(-1)}}),["tan","sin","exp","atan","acosh","asinh","atanh","expm1","log1p","sinh"].forEach(function(i){try{t.push(Math[i](e))}catch{t.push(-1)}}),h(t.map(String).join(","))}function he(){return navigator.deviceMemory||s}function me(){return eval.toString().length}function pe(){const t={timezone:r,localeLanguage:r};try{if(typeof Intl<"u"&&typeof Intl.DateTimeFormat<"u"){const e=Intl.DateTimeFormat().resolvedOptions();t.timezone=e.timeZone,t.localeLanguage=e.locale}else t.timezone=s,t.localeLanguage=s}catch{t.timezone=u,t.localeLanguage=u}return t}function fe(){return{width:window.screen.width,height:window.screen.height,pixelDepth:window.screen.pixelDepth,colorDepth:window.screen.colorDepth,availableWidth:window.screen.availWidth,availableHeight:window.screen.availHeight,innerWidth:window.innerWidth,innerHeight:window.innerHeight,hasMultipleDisplays:typeof screen.isExtended<"u"?screen.isExtended:s}}function ve(){return{languages:navigator.languages,language:navigator.language}}async function we(){const t={vendor:r,architecture:r,device:r,description:r};if("gpu"in navigator)try{const e=await navigator.gpu.requestAdapter();e&&(t.vendor=e.info.vendor,t.architecture=e.info.architecture,t.device=e.info.device,t.description=e.info.description)}catch{m(t,u)}else m(t,s);return t}function ye(){const t=["__driver_evaluate","__webdriver_evaluate","__selenium_evaluate","__fxdriver_evaluate","__driver_unwrapped","__webdriver_unwrapped","__selenium_unwrapped","__fxdriver_unwrapped","_Selenium_IDE_Recorder","_selenium","calledSelenium","$cdc_asdjflasutopfhvcZLmcfl_","$chrome_asyncScriptInfo","__$webdriverAsyncExecutor","webdriver","__webdriverFunc","domAutomation","domAutomationController","__lastWatirAlert","__lastWatirConfirm","__lastWatirPrompt","__webdriver_script_fn","_WEBDRIVER_ELEM_CACHE"];let e=!1;for(let n=0;n<t.length;n++)if(t[n]in window){e=!0;break}return e=e||!!document.__webdriver_script_fn||!!window.domAutomation||!!window.domAutomationController,e}function be(){try{const t="webdriver",e=window.navigator;if(!e[t]&&!e.hasOwnProperty(t)){e[t]=1;const n=e[t]===1;return delete e[t],n}return!0}catch{return!1}}async function Se(){const t=window.navigator,e={architecture:r,bitness:r,brands:r,mobile:r,model:r,platform:r,platformVersion:r,uaFullVersion:r};if("userAgentData"in t)try{const n=await t.userAgentData.getHighEntropyValues(["architecture","bitness","brands","mobile","model","platform","platformVersion","uaFullVersion"]);e.architecture=n.architecture,e.bitness=n.bitness,e.brands=n.brands,e.mobile=n.mobile,e.model=n.model,e.platform=n.platform,e.platformVersion=n.platformVersion,e.uaFullVersion=n.uaFullVersion}catch{m(e,u)}else m(e,s);return e}function Ce(){if(!navigator.plugins)return!1;const t=typeof navigator.plugins.toString=="function"?navigator.plugins.toString():navigator.plugins.constructor&&typeof navigator.plugins.constructor.toString=="function"?navigator.plugins.constructor.toString():typeof navigator.plugins;return t==="[object PluginArray]"||t==="[object MSPluginsCollection]"||t==="[object HTMLPluginsCollection]"}function Ae(){if(!navigator.plugins)return s;const t=[];for(let e=0;e<navigator.plugins.length;e++)t.push(navigator.plugins[e].name);return h(t.join(","))}function Pe(){return navigator.plugins?navigator.plugins.length:s}function Me(){if(!navigator.plugins)return s;try{return navigator.plugins[0]===navigator.plugins[0][0].enabledPlugin}catch{return u}}function Ee(){if(!navigator.plugins)return s;try{return navigator.plugins.item(4294967296)!==navigator.plugins[0]}catch{return u}}function We(){const t={isValidPluginArray:r,pluginCount:r,pluginNamesHash:r,pluginConsistency1:r,pluginOverflow:r};try{t.isValidPluginArray=Ce(),t.pluginCount=Pe(),t.pluginNamesHash=Ae(),t.pluginConsistency1=Me(),t.pluginOverflow=Ee()}catch{m(t,u)}return t}async function xe(){return new Promise(async function(t){var e={audiooutput:0,audioinput:0,videoinput:0};if(navigator.mediaDevices&&navigator.mediaDevices.enumerateDevices){const i=await navigator.mediaDevices.enumerateDevices();if(typeof i<"u"){for(var n=0;n<i.length;n++){var a=i[n].kind;e[a]=e[a]+1}return t({speakers:e.audiooutput,microphones:e.audioinput,webcams:e.videoinput})}else return m(e,s),t(e)}else return m(e,s),t(e)})}function ke(){const t={webdriver:r,userAgent:r,platform:r,memory:r,cpuCount:r,language:r},e=document.createElement("iframe");try{e.style.display="none",e.src="about:blank",document.body.appendChild(e);const n=e.contentWindow?.navigator;t.webdriver=n.webdriver??!1,t.userAgent=n.userAgent??s,t.platform=n.platform??s,t.memory=n.deviceMemory??s,t.cpuCount=n.hardwareConcurrency??s,t.language=n.language??s}catch{m(t,u)}finally{document.body.removeChild(e)}return t}async function De(){return new Promise(t=>{const e={vendor:r,renderer:r,userAgent:r,language:r,platform:r,memory:r,cpuCount:r};try{const n=`try {
1
+ "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});function ne(){return navigator.webdriver}function ie(){return navigator.userAgent}function ae(){return navigator.platform}const l="ERROR",r="INIT",s="NA",f="SKIPPED",d="high",b="low",oe="medium";function p(t){let e=0;for(let n=0,i=t.length;n<i;n++){let a=t.charCodeAt(n);e=(e<<5)-e+a,e|=0}return e.toString(16).padStart(8,"0")}function h(t,e){for(const n in t)t[n]=e}function se(){return navigator.buildID==="20181001000000"}function ce(){try{let t=!1;const e=Error.prepareStackTrace;Error.prepareStackTrace=function(){return t=!0,e};const n=new Error("");return console.log(n),t}catch{return l}}function le(){const t={vendor:r,renderer:r};if(se())return h(t,s),t;try{var e=document.createElement("canvas"),n=e.getContext("webgl")||e.getContext("experimental-webgl");n.getSupportedExtensions().indexOf("WEBGL_debug_renderer_info")>=0?(t.vendor=n.getParameter(n.getExtension("WEBGL_debug_renderer_info").UNMASKED_VENDOR_WEBGL),t.renderer=n.getParameter(n.getExtension("WEBGL_debug_renderer_info").UNMASKED_RENDERER_WEBGL)):h(t,s)}catch{h(t,l)}return t}function ue(){return"__pwInitScripts"in window||"__playwright__binding__"in window}function de(){return navigator.hardwareConcurrency||s}function he(){const t=[],e=.123456789;return["E","LN10","LN2","LOG10E","LOG2E","PI","SQRT1_2","SQRT2"].forEach(function(a){try{t.push(Math[a])}catch{t.push(-1)}}),["tan","sin","exp","atan","acosh","asinh","atanh","expm1","log1p","sinh"].forEach(function(a){try{t.push(Math[a](e))}catch{t.push(-1)}}),p(t.map(String).join(","))}function ge(){return navigator.deviceMemory||s}function me(){return eval.toString().length}function pe(){const t={timezone:r,localeLanguage:r};try{if(typeof Intl<"u"&&typeof Intl.DateTimeFormat<"u"){const e=Intl.DateTimeFormat().resolvedOptions();t.timezone=e.timeZone,t.localeLanguage=e.locale}else t.timezone=s,t.localeLanguage=s}catch{t.timezone=l,t.localeLanguage=l}return t}function fe(){return{width:window.screen.width,height:window.screen.height,pixelDepth:window.screen.pixelDepth,colorDepth:window.screen.colorDepth,availableWidth:window.screen.availWidth,availableHeight:window.screen.availHeight,innerWidth:window.innerWidth,innerHeight:window.innerHeight,hasMultipleDisplays:typeof screen.isExtended<"u"?screen.isExtended:s}}function ve(){return{languages:navigator.languages,language:navigator.language}}async function we(){const t={vendor:r,architecture:r,device:r,description:r};if("gpu"in navigator)try{const e=await navigator.gpu.requestAdapter();e&&(t.vendor=e.info.vendor,t.architecture=e.info.architecture,t.device=e.info.device,t.description=e.info.description)}catch{h(t,l)}else h(t,s);return t}function ye(){const t=["__driver_evaluate","__webdriver_evaluate","__selenium_evaluate","__fxdriver_evaluate","__driver_unwrapped","__webdriver_unwrapped","__selenium_unwrapped","__fxdriver_unwrapped","_Selenium_IDE_Recorder","_selenium","calledSelenium","$cdc_asdjflasutopfhvcZLmcfl_","$chrome_asyncScriptInfo","__$webdriverAsyncExecutor","webdriver","__webdriverFunc","domAutomation","domAutomationController","__lastWatirAlert","__lastWatirConfirm","__lastWatirPrompt","__webdriver_script_fn","_WEBDRIVER_ELEM_CACHE"];let e=!1;for(let n=0;n<t.length;n++)if(t[n]in window){e=!0;break}return e=e||!!document.__webdriver_script_fn||!!window.domAutomation||!!window.domAutomationController,e}function be(){try{const t="webdriver",e=window.navigator;if(!e[t]&&!e.hasOwnProperty(t)){e[t]=1;const n=e[t]===1;return delete e[t],n}return!0}catch{return!1}}async function Se(){const t=window.navigator,e={architecture:r,bitness:r,brands:r,mobile:r,model:r,platform:r,platformVersion:r,uaFullVersion:r};if("userAgentData"in t)try{const n=await t.userAgentData.getHighEntropyValues(["architecture","bitness","brands","mobile","model","platform","platformVersion","uaFullVersion"]);e.architecture=n.architecture,e.bitness=n.bitness,e.brands=n.brands,e.mobile=n.mobile,e.model=n.model,e.platform=n.platform,e.platformVersion=n.platformVersion,e.uaFullVersion=n.uaFullVersion}catch{h(e,l)}else h(e,s);return e}function Ce(){if(!navigator.plugins)return!1;const t=typeof navigator.plugins.toString=="function"?navigator.plugins.toString():navigator.plugins.constructor&&typeof navigator.plugins.constructor.toString=="function"?navigator.plugins.constructor.toString():typeof navigator.plugins;return t==="[object PluginArray]"||t==="[object MSPluginsCollection]"||t==="[object HTMLPluginsCollection]"}function Ae(){if(!navigator.plugins)return s;const t=[];for(let e=0;e<navigator.plugins.length;e++)t.push(navigator.plugins[e].name);return p(t.join(","))}function Pe(){return navigator.plugins?navigator.plugins.length:s}function Me(){if(!navigator.plugins)return s;try{return navigator.plugins[0]===navigator.plugins[0][0].enabledPlugin}catch{return l}}function Ee(){if(!navigator.plugins)return s;try{return navigator.plugins.item(4294967296)!==navigator.plugins[0]}catch{return l}}function We(){const t={isValidPluginArray:r,pluginCount:r,pluginNamesHash:r,pluginConsistency1:r,pluginOverflow:r};try{t.isValidPluginArray=Ce(),t.pluginCount=Pe(),t.pluginNamesHash=Ae(),t.pluginConsistency1=Me(),t.pluginOverflow=Ee()}catch{h(t,l)}return t}async function xe(){return new Promise(async function(t){var e={audiooutput:0,audioinput:0,videoinput:0};if(navigator.mediaDevices&&navigator.mediaDevices.enumerateDevices){const a=await navigator.mediaDevices.enumerateDevices();if(typeof a<"u"){for(var n=0;n<a.length;n++){var i=a[n].kind;e[i]=e[i]+1}return t({speakers:e.audiooutput,microphones:e.audioinput,webcams:e.videoinput})}else return h(e,s),t(e)}else return h(e,s),t(e)})}function ke(){const t={webdriver:r,userAgent:r,platform:r,memory:r,cpuCount:r,language:r},e=document.createElement("iframe");let n=!1;try{e.style.display="none",e.src="about:blank",document.body.appendChild(e),n=!0;const i=e.contentWindow?.navigator;t.webdriver=i.webdriver??!1,t.userAgent=i.userAgent??s,t.platform=i.platform??s,t.memory=i.deviceMemory??s,t.cpuCount=i.hardwareConcurrency??s,t.language=i.language??s}catch{h(t,l)}finally{if(n)try{document.body.removeChild(e)}catch{}}return t}async function De(){return new Promise(t=>{const e={vendor:r,renderer:r,userAgent:r,language:r,platform:r,memory:r,cpuCount:r};let n=null,i=null,a=null;const g=()=>{a&&clearTimeout(a),n&&n.terminate(),i&&URL.revokeObjectURL(i)};try{const m=`try {
2
2
  var fingerprintWorker = {};
3
3
 
4
4
  fingerprintWorker.userAgent = navigator.userAgent;
@@ -28,4 +28,4 @@
28
28
  self.postMessage(fingerprintWorker);
29
29
  } catch (e) {
30
30
  self.postMessage(fingerprintWorker);
31
- }`,a=new Blob([n],{type:"application/javascript"}),i=URL.createObjectURL(a),p=new Worker(i);p.onmessage=function(d){try{return e.vendor=d.data.vendor,e.renderer=d.data.renderer,e.userAgent=d.data.userAgent,e.language=d.data.language,e.platform=d.data.platform,e.memory=d.data.memory,e.cpuCount=d.data.cpuCount,t(e)}catch{return m(e,u),t(e)}}}catch{return m(e,u),t(e)}})}function _e(){const t={toSourceError:r,hasToSource:!1};try{null.usdfsh}catch(e){t.toSourceError=e.toString()}try{throw"xyz"}catch(e){try{e.toSource(),t.hasToSource=!0}catch{t.hasToSource=!1}}return t}const S=['audio/mp4; codecs="mp4a.40.2"',"audio/mpeg;",'audio/webm; codecs="vorbis"','audio/ogg; codecs="vorbis"','audio/wav; codecs="1"','audio/ogg; codecs="speex"','audio/ogg; codecs="flac"','audio/3gpp; codecs="samr"'],C=['video/mp4; codecs="avc1.42E01E, mp4a.40.2"','video/mp4; codecs="avc1.42E01E"','video/mp4; codecs="avc1.58A01E"','video/mp4; codecs="avc1.4D401E"','video/mp4; codecs="avc1.64001E"','video/mp4; codecs="mp4v.20.8"','video/mp4; codecs="mp4v.20.240"','video/webm; codecs="vp8"','video/ogg; codecs="theora"','video/ogg; codecs="dirac"','video/3gpp; codecs="mp4v.20.8"','video/x-matroska; codecs="theora"'];function A(t,e){const n={};try{const a=document.createElement(e);for(const i of t)try{n[i]=a.canPlayType(i)||null}catch{n[i]=null}}catch{for(const a of t)n[a]=null}return n}function P(t){const e={},n=window.MediaSource;if(!n||typeof n.isTypeSupported!="function"){for(const a of t)e[a]=null;return e}for(const a of t)try{e[a]=n.isTypeSupported(a)}catch{e[a]=null}return e}function M(t){try{const e=window.RTCRtpReceiver;if(e&&typeof e.getCapabilities=="function"){const n=e.getCapabilities(t);return h(JSON.stringify(n))}return s}catch{return u}}function Re(){const t={audioCanPlayTypeHash:s,videoCanPlayTypeHash:s,audioMediaSourceHash:s,videoMediaSourceHash:s,rtcAudioCapabilitiesHash:s,rtcVideoCapabilitiesHash:s,hasMediaSource:!1};try{t.hasMediaSource=!!window.MediaSource;const e=A(S,"audio"),n=A(C,"video");t.audioCanPlayTypeHash=h(JSON.stringify(e)),t.videoCanPlayTypeHash=h(JSON.stringify(n));const a=P(S),i=P(C);t.audioMediaSourceHash=h(JSON.stringify(a)),t.videoMediaSourceHash=h(JSON.stringify(i)),t.rtcAudioCapabilitiesHash=M("audio"),t.rtcVideoCapabilitiesHash=M("video")}catch{m(t,u)}return t}async function Ie(){return new Promise(t=>{try{const e=new Image,n=document.createElement("canvas").getContext("2d");e.onload=()=>{n.drawImage(e,0,0),t(n.getImageData(0,0,1,1).data.filter(a=>a===0).length!=4)},e.onerror=()=>{t(u)},e.src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAC0lEQVQYV2NgAAIAAAUAAarVyFEAAAAASUVORK5CYII="}catch{t(u)}})}function Te(){var t=document.createElement("canvas");t.width=400,t.height=200,t.style.display="inline";var e=t.getContext("2d");try{return e.rect(0,0,10,10),e.rect(2,2,6,6),e.textBaseline="alphabetic",e.fillStyle="#f60",e.fillRect(125,1,62,20),e.fillStyle="#069",e.font="11pt no-real-font-123",e.fillText("Cwm fjordbank glyphs vext quiz, ๐Ÿ˜ƒ",2,15),e.fillStyle="rgba(102, 204, 0, 0.2)",e.font="18pt Arial",e.fillText("Cwm fjordbank glyphs vext quiz, ๐Ÿ˜ƒ",4,45),e.globalCompositeOperation="multiply",e.fillStyle="rgb(255,0,255)",e.beginPath(),e.arc(50,50,50,0,2*Math.PI,!0),e.closePath(),e.fill(),e.fillStyle="rgb(0,255,255)",e.beginPath(),e.arc(100,50,50,0,2*Math.PI,!0),e.closePath(),e.fill(),e.fillStyle="rgb(255,255,0)",e.beginPath(),e.arc(75,100,50,0,2*Math.PI,!0),e.closePath(),e.fill(),e.fillStyle="rgb(255,0,255)",e.arc(75,75,75,0,2*Math.PI,!0),e.arc(75,75,25,0,2*Math.PI,!0),e.fill("evenodd"),h(t.toDataURL())}catch{return u}}async function Le(){const t={hasModifiedCanvas:r,canvasFingerprint:r};return t.hasModifiedCanvas=await Ie(),t.canvasFingerprint=Te(),t}function Oe(){const t=["deviceMemory","hardwareConcurrency","language","languages","platform"],e=[];for(const n of t){const a=Object.getOwnPropertyDescriptor(Object.getPrototypeOf(navigator),n);a&&a.value?e.push("1"):e.push("0")}return e.join("")}function He(){return Math.random().toString(36).substring(2,15)}function Ue(){return new Date().getTime()}function Ve(){return window.location.href}function E(t,e){const n=t.signals;return e==="iframe"?n.contexts.iframe.webdriver!==n.automation.webdriver||n.contexts.iframe.userAgent!==n.browser.userAgent||n.contexts.iframe.platform!==n.device.platform||n.contexts.iframe.memory!==n.device.memory||n.contexts.iframe.cpuCount!==n.device.cpuCount:n.contexts.webWorker.webdriver!==n.automation.webdriver||n.contexts.webWorker.userAgent!==n.browser.userAgent||n.contexts.webWorker.platform!==n.device.platform||n.contexts.webWorker.memory!==n.device.memory||n.contexts.webWorker.cpuCount!==n.device.cpuCount}function Fe(){const t={bitmask:r,extensions:[]},e=document.body.hasAttribute("data-gr-ext-installed"),n=typeof window.ethereum<"u",a=document.getElementById("coupon-birds-drop-div")!==null,i=document.querySelector("deepl-input-controller")!==null,p=document.getElementById("monica-content-root")!==null,d=document.querySelector("chatgpt-sidebar")!==null,w=typeof window.__REQUESTLY__<"u",o=Array.from(document.querySelectorAll("*")).filter(v=>v.tagName.toLowerCase().startsWith("veepn-")).length>0;return t.bitmask=[e?"1":"0",n?"1":"0",a?"1":"0",i?"1":"0",p?"1":"0",d?"1":"0",w?"1":"0",o?"1":"0"].join(""),e&&t.extensions.push("grammarly"),n&&t.extensions.push("metamask"),a&&t.extensions.push("coupon-birds"),i&&t.extensions.push("deepl"),p&&t.extensions.push("monica-ai"),d&&t.extensions.push("sider-ai"),w&&t.extensions.push("requestly"),o&&t.extensions.push("veepn"),t}function c(t){try{return t()}catch{return!1}}function Ge(){const t={bitmask:r,chrome:c(()=>"chrome"in window),brave:c(()=>"brave"in navigator),applePaySupport:c(()=>"ApplePaySetup"in window),opera:c(()=>typeof window.opr<"u"||typeof window.onoperadetachedviewchange=="object"),serial:c(()=>window.navigator.serial!==void 0),attachShadow:c(()=>!!Element.prototype.attachShadow),caches:c(()=>!!window.caches),webAssembly:c(()=>!!window.WebAssembly&&!!window.WebAssembly.instantiate),buffer:c(()=>"Buffer"in window),showModalDialog:c(()=>"showModalDialog"in window),safari:c(()=>"safari"in window),webkitPrefixedFunction:c(()=>"webkitCancelAnimationFrame"in window),mozPrefixedFunction:c(()=>"mozGetUserMedia"in navigator),usb:c(()=>typeof window.USB=="function"),browserCapture:c(()=>typeof window.BrowserCaptureMediaStreamTrack=="function"),paymentRequestUpdateEvent:c(()=>typeof window.PaymentRequestUpdateEvent=="function"),pressureObserver:c(()=>typeof window.PressureObserver=="function"),audioSession:c(()=>"audioSession"in navigator),selectAudioOutput:c(()=>typeof navigator<"u"&&typeof navigator.mediaDevices<"u"&&typeof navigator.mediaDevices.selectAudioOutput=="function"),barcodeDetector:c(()=>"BarcodeDetector"in window),battery:c(()=>"getBattery"in navigator),devicePosture:c(()=>"DevicePosture"in window),documentPictureInPicture:c(()=>"documentPictureInPicture"in window),eyeDropper:c(()=>"EyeDropper"in window),editContext:c(()=>"EditContext"in window),fencedFrame:c(()=>"FencedFrameConfig"in window),sanitizer:c(()=>"Sanitizer"in window),otpCredential:c(()=>"OTPCredential"in window)},e=Object.keys(t).filter(n=>n!=="bitmask").map(n=>t[n]?"1":"0").join("");return t.bitmask=e,t}function Be(){const t={prefersColorScheme:r,prefersReducedMotion:r,prefersReducedTransparency:r,colorGamut:r,pointer:r,anyPointer:r,hover:r,anyHover:r,colorDepth:r};try{window.matchMedia("(prefers-color-scheme: dark)").matches?t.prefersColorScheme="dark":window.matchMedia("(prefers-color-scheme: light)").matches?t.prefersColorScheme="light":t.prefersColorScheme=null,t.prefersReducedMotion=window.matchMedia("(prefers-reduced-motion: reduce)").matches,t.prefersReducedTransparency=window.matchMedia("(prefers-reduced-transparency: reduce)").matches,window.matchMedia("(color-gamut: rec2020)").matches?t.colorGamut="rec2020":window.matchMedia("(color-gamut: p3)").matches?t.colorGamut="p3":window.matchMedia("(color-gamut: srgb)").matches?t.colorGamut="srgb":t.colorGamut=null,window.matchMedia("(pointer: fine)").matches?t.pointer="fine":window.matchMedia("(pointer: coarse)").matches?t.pointer="coarse":window.matchMedia("(pointer: none)").matches?t.pointer="none":t.pointer=null,window.matchMedia("(any-pointer: fine)").matches?t.anyPointer="fine":window.matchMedia("(any-pointer: coarse)").matches?t.anyPointer="coarse":window.matchMedia("(any-pointer: none)").matches?t.anyPointer="none":t.anyPointer=null,t.hover=window.matchMedia("(hover: hover)").matches,t.anyHover=window.matchMedia("(any-hover: hover)").matches;let e=0;for(let n=0;n<=16;n++)window.matchMedia(`(color: ${n})`).matches&&(e=n);t.colorDepth=e}catch{m(t,u)}return t}function je(t){const e=t.signals.device.screenResolution;return e.width===600&&e.height===800||e.availableWidth===600&&e.availableHeight===800||e.innerWidth===600&&e.innerHeight===800}function Ne(t){return t.signals.automation.webdriver===!0}function ze(t){return!!t.signals.automation.selenium}function $e(t){return t.signals.automation.cdp===!0}function Qe(t){return t.signals.automation.playwright===!0}function qe(t){return typeof t.signals.device.memory!="number"?!1:t.signals.device.memory>32||t.signals.device.memory<.25}function Ke(t){return typeof t.signals.device.cpuCount!="number"?!1:t.signals.device.cpuCount>70}function Je(t){const e=t.signals.browser.userAgent;return t.signals.browser.features.chrome===!1&&typeof e=="string"&&e.includes("Chrome")}function Ye(t){return t.signals.contexts.iframe.webdriver===!0}function Ze(t){return t.signals.contexts.webWorker.webdriver===!0}function Xe(t){const e=t.signals.contexts.webWorker,n=t.signals.graphics.webGL;return e.vendor===u||e.renderer===u||n.vendor===s||n.renderer===s||e.vendor===f?!1:e.vendor!==n.vendor||e.renderer!==n.renderer}function et(t){return t.signals.contexts.webWorker.platform===s||t.signals.contexts.webWorker.platform===u||t.signals.contexts.webWorker.platform===f?!1:t.signals.device.platform!==t.signals.contexts.webWorker.platform}function tt(t){return t.signals.contexts.iframe.platform===s||t.signals.contexts.iframe.platform===u?!1:t.signals.device.platform!==t.signals.contexts.iframe.platform}function rt(t){return t.signals.automation.webdriverWritable===!0}function nt(t){return t.signals.graphics.webGL.renderer.includes("SwiftShader")}function it(t){return t.signals.locale.internationalization.timezone==="UTC"}function at(t){const e=t.signals.locale.languages.languages,n=t.signals.locale.languages.language;return n&&e&&Array.isArray(e)&&e.length>0?e[0]!==n:!1}function ot(t){return!!(t.signals.browser.features.chrome&&t.signals.browser.etsl!==33||t.signals.browser.features.safari&&t.signals.browser.etsl!==37||t.signals.browser.userAgent.includes("Firefox")&&t.signals.browser.etsl!==37)}function st(t){return[t.signals.browser.userAgent,t.signals.contexts.iframe.userAgent,t.signals.contexts.webWorker.userAgent].some(n=>/bot|headless/i.test(n.toLowerCase()))}function ct(t){const e=t.signals.graphics.webgpu,n=t.signals.graphics.webGL,a=t.signals.browser.userAgent;return!!((n.vendor.includes("Apple")||n.renderer.includes("Apple"))&&!a.includes("Mac")||e.vendor.includes("apple")&&!a.includes("Mac")||e.vendor.includes("apple")&&!n.renderer.includes("Apple"))}function lt(t){const e=t.signals.device.platform,n=t.signals.browser.userAgent,a=t.signals.browser.highEntropyValues.platform;return!!(n.includes("Mac")&&!e.includes("Mac")||n.includes("Windows")&&!e.includes("Win")||n.includes("Linux")&&!e.includes("Linux")||a!==u&&a!==s&&(a.includes("Mac")&&!e.includes("Mac")||a.includes("Windows")&&!e.includes("Win")||a.includes("Linux")&&!e.includes("Linux")||a.includes("Android")&&!e.includes("Android")||a.includes("iOS")&&!e.includes("iOS")))}async function ut(t,e){const n=new TextEncoder().encode(e),a=new TextEncoder().encode(t),i=new Uint8Array(a.length);for(let d=0;d<a.length;d++)i[d]=a[d]^n[d%n.length];const p=String.fromCharCode(...i);return btoa(p)}class dt{constructor(){this.fingerprint={signals:{automation:{webdriver:r,webdriverWritable:r,selenium:r,cdp:r,playwright:r,navigatorPropertyDescriptors:r},device:{cpuCount:r,memory:r,platform:r,screenResolution:{width:r,height:r,pixelDepth:r,colorDepth:r,availableWidth:r,availableHeight:r,innerWidth:r,innerHeight:r,hasMultipleDisplays:r},multimediaDevices:{speakers:r,microphones:r,webcams:r},mediaQueries:{prefersColorScheme:r,prefersReducedMotion:r,prefersReducedTransparency:r,colorGamut:r,pointer:r,anyPointer:r,hover:r,anyHover:r,colorDepth:r}},browser:{userAgent:r,features:{bitmask:r,chrome:r,brave:r,applePaySupport:r,opera:r,serial:r,attachShadow:r,caches:r,webAssembly:r,buffer:r,showModalDialog:r,safari:r,webkitPrefixedFunction:r,mozPrefixedFunction:r,usb:r,browserCapture:r,paymentRequestUpdateEvent:r,pressureObserver:r,audioSession:r,selectAudioOutput:r,barcodeDetector:r,battery:r,devicePosture:r,documentPictureInPicture:r,eyeDropper:r,editContext:r,fencedFrame:r,sanitizer:r,otpCredential:r},plugins:{isValidPluginArray:r,pluginCount:r,pluginNamesHash:r,pluginConsistency1:r,pluginOverflow:r},extensions:{bitmask:r,extensions:r},highEntropyValues:{architecture:r,bitness:r,brands:r,mobile:r,model:r,platform:r,platformVersion:r,uaFullVersion:r},etsl:r,maths:r,toSourceError:{toSourceError:r,hasToSource:r}},graphics:{webGL:{vendor:r,renderer:r},webgpu:{vendor:r,architecture:r,device:r,description:r},canvas:{hasModifiedCanvas:r,canvasFingerprint:r}},codecs:{audioCanPlayTypeHash:r,videoCanPlayTypeHash:r,audioMediaSourceHash:r,videoMediaSourceHash:r,rtcAudioCapabilitiesHash:r,rtcVideoCapabilitiesHash:r,hasMediaSource:r},locale:{internationalization:{timezone:r,localeLanguage:r},languages:{languages:r,language:r}},contexts:{iframe:{webdriver:r,userAgent:r,platform:r,memory:r,cpuCount:r,language:r},webWorker:{webdriver:r,userAgent:r,platform:r,memory:r,cpuCount:r,language:r,vendor:r,renderer:r}}},fsid:r,nonce:r,time:r,url:r,fastBotDetection:!1,fastBotDetectionDetails:{headlessChromeScreenResolution:{detected:!1,severity:"high"},hasWebdriver:{detected:!1,severity:"high"},hasWebdriverWritable:{detected:!1,severity:"high"},hasSeleniumProperty:{detected:!1,severity:"high"},hasCDP:{detected:!1,severity:"high"},hasPlaywright:{detected:!1,severity:"high"},hasImpossibleDeviceMemory:{detected:!1,severity:"high"},hasHighCPUCount:{detected:!1,severity:"high"},hasMissingChromeObject:{detected:!1,severity:"high"},hasWebdriverIframe:{detected:!1,severity:"high"},hasWebdriverWorker:{detected:!1,severity:"high"},hasMismatchWebGLInWorker:{detected:!1,severity:"high"},hasMismatchPlatformIframe:{detected:!1,severity:"high"},hasMismatchPlatformWorker:{detected:!1,severity:"high"},hasSwiftshaderRenderer:{detected:!1,severity:"low"},hasUTCTimezone:{detected:!1,severity:"medium"},hasMismatchLanguages:{detected:!1,severity:"low"},hasInconsistentEtsl:{detected:!1,severity:"high"},hasBotUserAgent:{detected:!1,severity:"high"},hasGPUMismatch:{detected:!1,severity:"high"},hasPlatformMismatch:{detected:!1,severity:"high"}}}}async collectSignal(e){try{return await e()}catch{return u}}generateFingerprintScannerId(){try{const e=this.fingerprint.signals,n=this.fingerprint.fastBotDetectionDetails,a="FS1",p=[n.headlessChromeScreenResolution.detected,n.hasWebdriver.detected,n.hasWebdriverWritable.detected,n.hasSeleniumProperty.detected,n.hasCDP.detected,n.hasPlaywright.detected,n.hasImpossibleDeviceMemory.detected,n.hasHighCPUCount.detected,n.hasMissingChromeObject.detected,n.hasWebdriverIframe.detected,n.hasWebdriverWorker.detected,n.hasMismatchWebGLInWorker.detected,n.hasMismatchPlatformIframe.detected,n.hasMismatchPlatformWorker.detected,n.hasSwiftshaderRenderer.detected,n.hasUTCTimezone.detected,n.hasMismatchLanguages.detected,n.hasInconsistentEtsl.detected,n.hasBotUserAgent.detected,n.hasGPUMismatch.detected,n.hasPlatformMismatch.detected].map(l=>l?"1":"0").join(""),d=[e.automation.webdriver===!0,e.automation.webdriverWritable===!0,e.automation.selenium===!0,e.automation.cdp===!0,e.automation.playwright===!0].map(l=>l?"1":"0").join(""),w=h(String(e.automation.navigatorPropertyDescriptors)).slice(0,4),o=`${d}h${w}`,v=typeof e.device.screenResolution.width=="number"?e.device.screenResolution.width:0,y=typeof e.device.screenResolution.height=="number"?e.device.screenResolution.height:0,W=typeof e.device.cpuCount=="number"?String(e.device.cpuCount).padStart(2,"0"):"00",x=typeof e.device.memory=="number"?String(Math.round(e.device.memory)).padStart(2,"0"):"00",k=[e.device.screenResolution.hasMultipleDisplays===!0,e.device.mediaQueries.prefersReducedMotion===!0,e.device.mediaQueries.prefersReducedTransparency===!0,e.device.mediaQueries.hover===!0,e.device.mediaQueries.anyHover===!0].map(l=>l?"1":"0").join(""),D=[e.device.platform,e.device.screenResolution.pixelDepth,e.device.screenResolution.colorDepth,e.device.multimediaDevices.speakers,e.device.multimediaDevices.microphones,e.device.multimediaDevices.webcams,e.device.mediaQueries.prefersColorScheme,e.device.mediaQueries.colorGamut,e.device.mediaQueries.pointer,e.device.mediaQueries.anyPointer,e.device.mediaQueries.colorDepth].map(l=>String(l)).join("|"),_=h(D).slice(0,6),R=`${v}x${y}c${W}m${x}b${k}h${_}`,I=typeof e.browser.features.bitmask=="string"?e.browser.features.bitmask:"0000000000",T=typeof e.browser.extensions.bitmask=="string"?e.browser.extensions.bitmask:"00000000",L=[e.browser.plugins.isValidPluginArray===!0,e.browser.plugins.pluginConsistency1===!0,e.browser.plugins.pluginOverflow===!0,e.browser.toSourceError.hasToSource===!0].map(l=>l?"1":"0").join(""),O=[e.browser.userAgent,e.browser.etsl,e.browser.maths,e.browser.plugins.pluginCount,e.browser.plugins.pluginNamesHash,e.browser.toSourceError.toSourceError,e.browser.highEntropyValues.architecture,e.browser.highEntropyValues.bitness,e.browser.highEntropyValues.platform,e.browser.highEntropyValues.platformVersion,e.browser.highEntropyValues.uaFullVersion,e.browser.highEntropyValues.mobile].map(l=>String(l)).join("|"),H=h(O).slice(0,6),U=`f${I}e${T}p${L}h${H}`,V=[e.graphics.canvas.hasModifiedCanvas===!0].map(l=>l?"1":"0").join(""),F=[e.graphics.webGL.vendor,e.graphics.webGL.renderer,e.graphics.webgpu.vendor,e.graphics.webgpu.architecture,e.graphics.webgpu.device,e.graphics.webgpu.description,e.graphics.canvas.canvasFingerprint].map(l=>String(l)).join("|"),G=h(F).slice(0,6),B=`${V}h${G}`,j=[e.codecs.hasMediaSource===!0].map(l=>l?"1":"0").join(""),N=[e.codecs.audioCanPlayTypeHash,e.codecs.videoCanPlayTypeHash,e.codecs.audioMediaSourceHash,e.codecs.videoMediaSourceHash,e.codecs.rtcAudioCapabilitiesHash,e.codecs.rtcVideoCapabilitiesHash].map(l=>String(l)).join("|"),z=h(N).slice(0,6),$=`${j}h${z}`,Q=typeof e.locale.languages.language=="string"?e.locale.languages.language.slice(0,2).toLowerCase():"xx",q=Array.isArray(e.locale.languages.languages)?e.locale.languages.languages.length:0,K=(typeof e.locale.internationalization.timezone=="string"?e.locale.internationalization.timezone:"unknown").replace(/[\/\s]/g,"-"),J=[e.locale.internationalization.timezone,e.locale.internationalization.localeLanguage,Array.isArray(e.locale.languages.languages)?e.locale.languages.languages.join(","):e.locale.languages.languages,e.locale.languages.language].map(l=>String(l)).join("|"),Y=h(J).slice(0,4),Z=`${Q}${q}t${K}_h${Y}`,X=[E(this.fingerprint,"iframe"),E(this.fingerprint,"worker"),e.contexts.iframe.webdriver===!0,e.contexts.webWorker.webdriver===!0].map(l=>l?"1":"0").join(""),ee=[e.contexts.iframe.userAgent,e.contexts.iframe.platform,e.contexts.iframe.memory,e.contexts.iframe.cpuCount,e.contexts.iframe.language,e.contexts.webWorker.userAgent,e.contexts.webWorker.platform,e.contexts.webWorker.memory,e.contexts.webWorker.cpuCount,e.contexts.webWorker.language,e.contexts.webWorker.vendor,e.contexts.webWorker.renderer].map(l=>String(l)).join("|"),te=h(ee).slice(0,6),re=`${X}h${te}`;return[a,p,o,R,U,B,$,Z,re].join("_")}catch(e){return console.error("Error generating fingerprint scanner id",e),u}}async encryptFingerprint(e){const n="__DEFAULT_FPSCANNER_KEY__";return n.length>20&&n.indexOf("DEFAULT")>0&&n.indexOf("FPSCANNER")>0&&console.warn('[fpscanner] WARNING: Using default encryption key! Run "npx fpscanner build --key=your-secret-key" to inject your own key. See: https://github.com/antoinevastel/fpscanner#advanced-custom-builds'),await ut(JSON.stringify(e),n)}getDetectionRules(){return[{name:"headlessChromeScreenResolution",severity:g,test:je},{name:"hasWebdriver",severity:g,test:Ne},{name:"hasWebdriverWritable",severity:g,test:rt},{name:"hasSeleniumProperty",severity:g,test:ze},{name:"hasCDP",severity:g,test:$e},{name:"hasPlaywright",severity:g,test:Qe},{name:"hasImpossibleDeviceMemory",severity:g,test:qe},{name:"hasHighCPUCount",severity:g,test:Ke},{name:"hasMissingChromeObject",severity:g,test:Je},{name:"hasWebdriverIframe",severity:g,test:Ye},{name:"hasWebdriverWorker",severity:g,test:Ze},{name:"hasMismatchWebGLInWorker",severity:g,test:Xe},{name:"hasMismatchPlatformIframe",severity:g,test:tt},{name:"hasMismatchPlatformWorker",severity:g,test:et},{name:"hasSwiftshaderRenderer",severity:b,test:nt},{name:"hasUTCTimezone",severity:oe,test:it},{name:"hasMismatchLanguages",severity:b,test:at},{name:"hasInconsistentEtsl",severity:g,test:ot},{name:"hasBotUserAgent",severity:g,test:st},{name:"hasGPUMismatch",severity:g,test:ct},{name:"hasPlatformMismatch",severity:g,test:lt}]}runDetectionRules(){const e=this.getDetectionRules(),n={headlessChromeScreenResolution:{detected:!1,severity:"high"},hasWebdriver:{detected:!1,severity:"high"},hasWebdriverWritable:{detected:!1,severity:"high"},hasSeleniumProperty:{detected:!1,severity:"high"},hasCDP:{detected:!1,severity:"high"},hasPlaywright:{detected:!1,severity:"high"},hasImpossibleDeviceMemory:{detected:!1,severity:"high"},hasHighCPUCount:{detected:!1,severity:"high"},hasMissingChromeObject:{detected:!1,severity:"high"},hasWebdriverIframe:{detected:!1,severity:"high"},hasWebdriverWorker:{detected:!1,severity:"high"},hasMismatchWebGLInWorker:{detected:!1,severity:"high"},hasMismatchPlatformIframe:{detected:!1,severity:"high"},hasMismatchPlatformWorker:{detected:!1,severity:"high"},hasSwiftshaderRenderer:{detected:!1,severity:"low"},hasUTCTimezone:{detected:!1,severity:"medium"},hasMismatchLanguages:{detected:!1,severity:"low"},hasInconsistentEtsl:{detected:!1,severity:"high"},hasBotUserAgent:{detected:!1,severity:"high"},hasGPUMismatch:{detected:!1,severity:"high"},hasPlatformMismatch:{detected:!1,severity:"high"}};for(const a of e)try{const i=a.test(this.fingerprint);n[a.name]={detected:i,severity:a.severity}}catch{n[a.name]={detected:!1,severity:a.severity}}return n}async collectFingerprint(e={encrypt:!0}){const{encrypt:n=!0,skipWorker:a=!1}=e,i=this.fingerprint.signals,p={webdriver:this.collectSignal(ne),webdriverWritable:this.collectSignal(be),selenium:this.collectSignal(ye),cdp:this.collectSignal(ce),playwright:this.collectSignal(ue),navigatorPropertyDescriptors:this.collectSignal(Oe),cpuCount:this.collectSignal(de),memory:this.collectSignal(he),platform:this.collectSignal(ae),screenResolution:this.collectSignal(fe),multimediaDevices:this.collectSignal(xe),mediaQueries:this.collectSignal(Be),userAgent:this.collectSignal(ie),browserFeatures:this.collectSignal(Ge),plugins:this.collectSignal(We),browserExtensions:this.collectSignal(Fe),highEntropyValues:this.collectSignal(Se),etsl:this.collectSignal(me),maths:this.collectSignal(ge),toSourceError:this.collectSignal(_e),webGL:this.collectSignal(le),webgpu:this.collectSignal(we),canvas:this.collectSignal(Le),mediaCodecs:this.collectSignal(Re),internationalization:this.collectSignal(pe),languages:this.collectSignal(ve),iframe:this.collectSignal(ke),webWorker:a?Promise.resolve({webdriver:f,userAgent:f,platform:f,memory:f,cpuCount:f,language:f,vendor:f,renderer:f}):this.collectSignal(De),nonce:this.collectSignal(He),time:this.collectSignal(Ue),url:this.collectSignal(Ve)},d=Object.keys(p),w=await Promise.all(Object.values(p)),o=Object.fromEntries(d.map((v,y)=>[v,w[y]]));return i.automation.webdriver=o.webdriver,i.automation.webdriverWritable=o.webdriverWritable,i.automation.selenium=o.selenium,i.automation.cdp=o.cdp,i.automation.playwright=o.playwright,i.automation.navigatorPropertyDescriptors=o.navigatorPropertyDescriptors,i.device.cpuCount=o.cpuCount,i.device.memory=o.memory,i.device.platform=o.platform,i.device.screenResolution=o.screenResolution,i.device.multimediaDevices=o.multimediaDevices,i.device.mediaQueries=o.mediaQueries,i.browser.userAgent=o.userAgent,i.browser.features=o.browserFeatures,i.browser.plugins=o.plugins,i.browser.extensions=o.browserExtensions,i.browser.highEntropyValues=o.highEntropyValues,i.browser.etsl=o.etsl,i.browser.maths=o.maths,i.browser.toSourceError=o.toSourceError,i.graphics.webGL=o.webGL,i.graphics.webgpu=o.webgpu,i.graphics.canvas=o.canvas,i.codecs=o.mediaCodecs,i.locale.internationalization=o.internationalization,i.locale.languages=o.languages,i.contexts.iframe=o.iframe,i.contexts.webWorker=o.webWorker,this.fingerprint.nonce=o.nonce,this.fingerprint.time=o.time,this.fingerprint.url=o.url,this.fingerprint.fastBotDetectionDetails=this.runDetectionRules(),this.fingerprint.fastBotDetection=Object.values(this.fingerprint.fastBotDetectionDetails).some(v=>v.detected),this.fingerprint.fsid=this.generateFingerprintScannerId(),n?await this.encryptFingerprint(JSON.stringify(this.fingerprint)):this.fingerprint}}exports.default=dt;
31
+ }`,w=new Blob([m],{type:"application/javascript"});i=URL.createObjectURL(w),n=new Worker(i),a=window.setTimeout(()=>{g(),h(e,l),t(e)},2e3),n.onmessage=function(o){try{e.vendor=o.data.vendor,e.renderer=o.data.renderer,e.userAgent=o.data.userAgent,e.language=o.data.language,e.platform=o.data.platform,e.memory=o.data.memory,e.cpuCount=o.data.cpuCount}catch{h(e,l)}finally{g(),t(e)}},n.onerror=function(){g(),h(e,l),t(e)}}catch{g(),h(e,l),t(e)}})}function _e(){const t={toSourceError:r,hasToSource:!1};try{null.usdfsh}catch(e){t.toSourceError=e.toString()}try{throw"xyz"}catch(e){try{e.toSource(),t.hasToSource=!0}catch{t.hasToSource=!1}}return t}const S=['audio/mp4; codecs="mp4a.40.2"',"audio/mpeg;",'audio/webm; codecs="vorbis"','audio/ogg; codecs="vorbis"','audio/wav; codecs="1"','audio/ogg; codecs="speex"','audio/ogg; codecs="flac"','audio/3gpp; codecs="samr"'],C=['video/mp4; codecs="avc1.42E01E, mp4a.40.2"','video/mp4; codecs="avc1.42E01E"','video/mp4; codecs="avc1.58A01E"','video/mp4; codecs="avc1.4D401E"','video/mp4; codecs="avc1.64001E"','video/mp4; codecs="mp4v.20.8"','video/mp4; codecs="mp4v.20.240"','video/webm; codecs="vp8"','video/ogg; codecs="theora"','video/ogg; codecs="dirac"','video/3gpp; codecs="mp4v.20.8"','video/x-matroska; codecs="theora"'];function A(t,e){const n={};try{const i=document.createElement(e);for(const a of t)try{n[a]=i.canPlayType(a)||null}catch{n[a]=null}}catch{for(const i of t)n[i]=null}return n}function P(t){const e={},n=window.MediaSource;if(!n||typeof n.isTypeSupported!="function"){for(const i of t)e[i]=null;return e}for(const i of t)try{e[i]=n.isTypeSupported(i)}catch{e[i]=null}return e}function M(t){try{const e=window.RTCRtpReceiver;if(e&&typeof e.getCapabilities=="function"){const n=e.getCapabilities(t);return p(JSON.stringify(n))}return s}catch{return l}}function Re(){const t={audioCanPlayTypeHash:s,videoCanPlayTypeHash:s,audioMediaSourceHash:s,videoMediaSourceHash:s,rtcAudioCapabilitiesHash:s,rtcVideoCapabilitiesHash:s,hasMediaSource:!1};try{t.hasMediaSource=!!window.MediaSource;const e=A(S,"audio"),n=A(C,"video");t.audioCanPlayTypeHash=p(JSON.stringify(e)),t.videoCanPlayTypeHash=p(JSON.stringify(n));const i=P(S),a=P(C);t.audioMediaSourceHash=p(JSON.stringify(i)),t.videoMediaSourceHash=p(JSON.stringify(a)),t.rtcAudioCapabilitiesHash=M("audio"),t.rtcVideoCapabilitiesHash=M("video")}catch{h(t,l)}return t}async function Ie(){return new Promise(t=>{try{const e=new Image,n=document.createElement("canvas").getContext("2d");e.onload=()=>{n.drawImage(e,0,0),t(n.getImageData(0,0,1,1).data.filter(i=>i===0).length!=4)},e.onerror=()=>{t(l)},e.src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAC0lEQVQYV2NgAAIAAAUAAarVyFEAAAAASUVORK5CYII="}catch{t(l)}})}function Te(){var t=document.createElement("canvas");t.width=400,t.height=200,t.style.display="inline";var e=t.getContext("2d");try{return e.rect(0,0,10,10),e.rect(2,2,6,6),e.textBaseline="alphabetic",e.fillStyle="#f60",e.fillRect(125,1,62,20),e.fillStyle="#069",e.font="11pt no-real-font-123",e.fillText("Cwm fjordbank glyphs vext quiz, ๐Ÿ˜ƒ",2,15),e.fillStyle="rgba(102, 204, 0, 0.2)",e.font="18pt Arial",e.fillText("Cwm fjordbank glyphs vext quiz, ๐Ÿ˜ƒ",4,45),e.globalCompositeOperation="multiply",e.fillStyle="rgb(255,0,255)",e.beginPath(),e.arc(50,50,50,0,2*Math.PI,!0),e.closePath(),e.fill(),e.fillStyle="rgb(0,255,255)",e.beginPath(),e.arc(100,50,50,0,2*Math.PI,!0),e.closePath(),e.fill(),e.fillStyle="rgb(255,255,0)",e.beginPath(),e.arc(75,100,50,0,2*Math.PI,!0),e.closePath(),e.fill(),e.fillStyle="rgb(255,0,255)",e.arc(75,75,75,0,2*Math.PI,!0),e.arc(75,75,25,0,2*Math.PI,!0),e.fill("evenodd"),p(t.toDataURL())}catch{return l}}async function Le(){const t={hasModifiedCanvas:r,canvasFingerprint:r};return t.hasModifiedCanvas=await Ie(),t.canvasFingerprint=Te(),t}function Oe(){const t=["deviceMemory","hardwareConcurrency","language","languages","platform"],e=[];for(const n of t){const i=Object.getOwnPropertyDescriptor(Object.getPrototypeOf(navigator),n);i&&i.value?e.push("1"):e.push("0")}return e.join("")}function He(){return Math.random().toString(36).substring(2,15)}function Ue(){return new Date().getTime()}function Ve(){return window.location.href}function E(t,e){const n=t.signals;return e==="iframe"?n.contexts.iframe.webdriver!==n.automation.webdriver||n.contexts.iframe.userAgent!==n.browser.userAgent||n.contexts.iframe.platform!==n.device.platform||n.contexts.iframe.memory!==n.device.memory||n.contexts.iframe.cpuCount!==n.device.cpuCount:n.contexts.webWorker.webdriver!==n.automation.webdriver||n.contexts.webWorker.userAgent!==n.browser.userAgent||n.contexts.webWorker.platform!==n.device.platform||n.contexts.webWorker.memory!==n.device.memory||n.contexts.webWorker.cpuCount!==n.device.cpuCount}function Fe(){const t={bitmask:r,extensions:[]},e=document.body.hasAttribute("data-gr-ext-installed"),n=typeof window.ethereum<"u",i=document.getElementById("coupon-birds-drop-div")!==null,a=document.querySelector("deepl-input-controller")!==null,g=document.getElementById("monica-content-root")!==null,m=document.querySelector("chatgpt-sidebar")!==null,w=typeof window.__REQUESTLY__<"u",o=Array.from(document.querySelectorAll("*")).filter(v=>v.tagName.toLowerCase().startsWith("veepn-")).length>0;return t.bitmask=[e?"1":"0",n?"1":"0",i?"1":"0",a?"1":"0",g?"1":"0",m?"1":"0",w?"1":"0",o?"1":"0"].join(""),e&&t.extensions.push("grammarly"),n&&t.extensions.push("metamask"),i&&t.extensions.push("coupon-birds"),a&&t.extensions.push("deepl"),g&&t.extensions.push("monica-ai"),m&&t.extensions.push("sider-ai"),w&&t.extensions.push("requestly"),o&&t.extensions.push("veepn"),t}function c(t){try{return t()}catch{return!1}}function Ge(){const t={bitmask:r,chrome:c(()=>"chrome"in window),brave:c(()=>"brave"in navigator),applePaySupport:c(()=>"ApplePaySetup"in window),opera:c(()=>typeof window.opr<"u"||typeof window.onoperadetachedviewchange=="object"),serial:c(()=>window.navigator.serial!==void 0),attachShadow:c(()=>!!Element.prototype.attachShadow),caches:c(()=>!!window.caches),webAssembly:c(()=>!!window.WebAssembly&&!!window.WebAssembly.instantiate),buffer:c(()=>"Buffer"in window),showModalDialog:c(()=>"showModalDialog"in window),safari:c(()=>"safari"in window),webkitPrefixedFunction:c(()=>"webkitCancelAnimationFrame"in window),mozPrefixedFunction:c(()=>"mozGetUserMedia"in navigator),usb:c(()=>typeof window.USB=="function"),browserCapture:c(()=>typeof window.BrowserCaptureMediaStreamTrack=="function"),paymentRequestUpdateEvent:c(()=>typeof window.PaymentRequestUpdateEvent=="function"),pressureObserver:c(()=>typeof window.PressureObserver=="function"),audioSession:c(()=>"audioSession"in navigator),selectAudioOutput:c(()=>typeof navigator<"u"&&typeof navigator.mediaDevices<"u"&&typeof navigator.mediaDevices.selectAudioOutput=="function"),barcodeDetector:c(()=>"BarcodeDetector"in window),battery:c(()=>"getBattery"in navigator),devicePosture:c(()=>"DevicePosture"in window),documentPictureInPicture:c(()=>"documentPictureInPicture"in window),eyeDropper:c(()=>"EyeDropper"in window),editContext:c(()=>"EditContext"in window),fencedFrame:c(()=>"FencedFrameConfig"in window),sanitizer:c(()=>"Sanitizer"in window),otpCredential:c(()=>"OTPCredential"in window)},e=Object.keys(t).filter(n=>n!=="bitmask").map(n=>t[n]?"1":"0").join("");return t.bitmask=e,t}function je(){const t={prefersColorScheme:r,prefersReducedMotion:r,prefersReducedTransparency:r,colorGamut:r,pointer:r,anyPointer:r,hover:r,anyHover:r,colorDepth:r};try{window.matchMedia("(prefers-color-scheme: dark)").matches?t.prefersColorScheme="dark":window.matchMedia("(prefers-color-scheme: light)").matches?t.prefersColorScheme="light":t.prefersColorScheme=null,t.prefersReducedMotion=window.matchMedia("(prefers-reduced-motion: reduce)").matches,t.prefersReducedTransparency=window.matchMedia("(prefers-reduced-transparency: reduce)").matches,window.matchMedia("(color-gamut: rec2020)").matches?t.colorGamut="rec2020":window.matchMedia("(color-gamut: p3)").matches?t.colorGamut="p3":window.matchMedia("(color-gamut: srgb)").matches?t.colorGamut="srgb":t.colorGamut=null,window.matchMedia("(pointer: fine)").matches?t.pointer="fine":window.matchMedia("(pointer: coarse)").matches?t.pointer="coarse":window.matchMedia("(pointer: none)").matches?t.pointer="none":t.pointer=null,window.matchMedia("(any-pointer: fine)").matches?t.anyPointer="fine":window.matchMedia("(any-pointer: coarse)").matches?t.anyPointer="coarse":window.matchMedia("(any-pointer: none)").matches?t.anyPointer="none":t.anyPointer=null,t.hover=window.matchMedia("(hover: hover)").matches,t.anyHover=window.matchMedia("(any-hover: hover)").matches;let e=0;for(let n=0;n<=16;n++)window.matchMedia(`(color: ${n})`).matches&&(e=n);t.colorDepth=e}catch{h(t,l)}return t}function Be(t){const e=t.signals.device.screenResolution;return e.width===600&&e.height===800||e.availableWidth===600&&e.availableHeight===800||e.innerWidth===600&&e.innerHeight===800}function Ne(t){return t.signals.automation.webdriver===!0}function ze(t){return!!t.signals.automation.selenium}function $e(t){return t.signals.automation.cdp===!0}function Qe(t){return t.signals.automation.playwright===!0}function qe(t){return typeof t.signals.device.memory!="number"?!1:t.signals.device.memory>32||t.signals.device.memory<.25}function Ke(t){return typeof t.signals.device.cpuCount!="number"?!1:t.signals.device.cpuCount>70}function Je(t){const e=t.signals.browser.userAgent;return t.signals.browser.features.chrome===!1&&typeof e=="string"&&e.includes("Chrome")}function Ye(t){return t.signals.contexts.iframe.webdriver===!0}function Ze(t){return t.signals.contexts.webWorker.webdriver===!0}function Xe(t){const e=t.signals.contexts.webWorker,n=t.signals.graphics.webGL;return e.vendor===l||e.renderer===l||n.vendor===s||n.renderer===s||e.vendor===f?!1:e.vendor!==n.vendor||e.renderer!==n.renderer}function et(t){return t.signals.contexts.webWorker.platform===s||t.signals.contexts.webWorker.platform===l||t.signals.contexts.webWorker.platform===f?!1:t.signals.device.platform!==t.signals.contexts.webWorker.platform}function tt(t){return t.signals.contexts.iframe.platform===s||t.signals.contexts.iframe.platform===l?!1:t.signals.device.platform!==t.signals.contexts.iframe.platform}function rt(t){return t.signals.automation.webdriverWritable===!0}function nt(t){return t.signals.graphics.webGL.renderer.includes("SwiftShader")}function it(t){return t.signals.locale.internationalization.timezone==="UTC"}function at(t){const e=t.signals.locale.languages.languages,n=t.signals.locale.languages.language;return n&&e&&Array.isArray(e)&&e.length>0?e[0]!==n:!1}function ot(t){return!!(t.signals.browser.features.chrome&&t.signals.browser.etsl!==33||t.signals.browser.features.safari&&t.signals.browser.etsl!==37||t.signals.browser.userAgent.includes("Firefox")&&t.signals.browser.etsl!==37)}function st(t){return[t.signals.browser.userAgent,t.signals.contexts.iframe.userAgent,t.signals.contexts.webWorker.userAgent].some(n=>/bot|headless/i.test(n.toLowerCase()))}function ct(t){const e=t.signals.graphics.webgpu,n=t.signals.graphics.webGL,i=t.signals.browser.userAgent;return!!((n.vendor.includes("Apple")||n.renderer.includes("Apple"))&&!i.includes("Mac")||e.vendor.includes("apple")&&!i.includes("Mac")||e.vendor.includes("apple")&&!n.renderer.includes("Apple"))}function lt(t){const e=t.signals.device.platform,n=t.signals.browser.userAgent,i=t.signals.browser.highEntropyValues.platform;return!!(n.includes("Mac")&&!e.includes("Mac")||n.includes("Windows")&&!e.includes("Win")||n.includes("Linux")&&!e.includes("Linux")||i!==l&&i!==s&&(i.includes("Mac")&&!e.includes("Mac")||i.includes("Windows")&&!e.includes("Win")||i.includes("Linux")&&!e.includes("Linux")||i.includes("Android")&&!e.includes("Android")||i.includes("iOS")&&!e.includes("iOS")))}async function ut(t,e){const n=new TextEncoder().encode(e),i=new TextEncoder().encode(t),a=new Uint8Array(i.length);for(let m=0;m<i.length;m++)a[m]=i[m]^n[m%n.length];const g=String.fromCharCode(...a);return btoa(g)}class dt{constructor(){this.fingerprint={signals:{automation:{webdriver:r,webdriverWritable:r,selenium:r,cdp:r,playwright:r,navigatorPropertyDescriptors:r},device:{cpuCount:r,memory:r,platform:r,screenResolution:{width:r,height:r,pixelDepth:r,colorDepth:r,availableWidth:r,availableHeight:r,innerWidth:r,innerHeight:r,hasMultipleDisplays:r},multimediaDevices:{speakers:r,microphones:r,webcams:r},mediaQueries:{prefersColorScheme:r,prefersReducedMotion:r,prefersReducedTransparency:r,colorGamut:r,pointer:r,anyPointer:r,hover:r,anyHover:r,colorDepth:r}},browser:{userAgent:r,features:{bitmask:r,chrome:r,brave:r,applePaySupport:r,opera:r,serial:r,attachShadow:r,caches:r,webAssembly:r,buffer:r,showModalDialog:r,safari:r,webkitPrefixedFunction:r,mozPrefixedFunction:r,usb:r,browserCapture:r,paymentRequestUpdateEvent:r,pressureObserver:r,audioSession:r,selectAudioOutput:r,barcodeDetector:r,battery:r,devicePosture:r,documentPictureInPicture:r,eyeDropper:r,editContext:r,fencedFrame:r,sanitizer:r,otpCredential:r},plugins:{isValidPluginArray:r,pluginCount:r,pluginNamesHash:r,pluginConsistency1:r,pluginOverflow:r},extensions:{bitmask:r,extensions:r},highEntropyValues:{architecture:r,bitness:r,brands:r,mobile:r,model:r,platform:r,platformVersion:r,uaFullVersion:r},etsl:r,maths:r,toSourceError:{toSourceError:r,hasToSource:r}},graphics:{webGL:{vendor:r,renderer:r},webgpu:{vendor:r,architecture:r,device:r,description:r},canvas:{hasModifiedCanvas:r,canvasFingerprint:r}},codecs:{audioCanPlayTypeHash:r,videoCanPlayTypeHash:r,audioMediaSourceHash:r,videoMediaSourceHash:r,rtcAudioCapabilitiesHash:r,rtcVideoCapabilitiesHash:r,hasMediaSource:r},locale:{internationalization:{timezone:r,localeLanguage:r},languages:{languages:r,language:r}},contexts:{iframe:{webdriver:r,userAgent:r,platform:r,memory:r,cpuCount:r,language:r},webWorker:{webdriver:r,userAgent:r,platform:r,memory:r,cpuCount:r,language:r,vendor:r,renderer:r}}},fsid:r,nonce:r,time:r,url:r,fastBotDetection:!1,fastBotDetectionDetails:{headlessChromeScreenResolution:{detected:!1,severity:"high"},hasWebdriver:{detected:!1,severity:"high"},hasWebdriverWritable:{detected:!1,severity:"high"},hasSeleniumProperty:{detected:!1,severity:"high"},hasCDP:{detected:!1,severity:"high"},hasPlaywright:{detected:!1,severity:"high"},hasImpossibleDeviceMemory:{detected:!1,severity:"high"},hasHighCPUCount:{detected:!1,severity:"high"},hasMissingChromeObject:{detected:!1,severity:"high"},hasWebdriverIframe:{detected:!1,severity:"high"},hasWebdriverWorker:{detected:!1,severity:"high"},hasMismatchWebGLInWorker:{detected:!1,severity:"high"},hasMismatchPlatformIframe:{detected:!1,severity:"high"},hasMismatchPlatformWorker:{detected:!1,severity:"high"},hasSwiftshaderRenderer:{detected:!1,severity:"low"},hasUTCTimezone:{detected:!1,severity:"medium"},hasMismatchLanguages:{detected:!1,severity:"low"},hasInconsistentEtsl:{detected:!1,severity:"high"},hasBotUserAgent:{detected:!1,severity:"high"},hasGPUMismatch:{detected:!1,severity:"high"},hasPlatformMismatch:{detected:!1,severity:"high"}}}}async collectSignal(e){try{return await e()}catch{return l}}generateFingerprintScannerId(){try{const e=this.fingerprint.signals,n=this.fingerprint.fastBotDetectionDetails,i="FS1",g=[n.headlessChromeScreenResolution.detected,n.hasWebdriver.detected,n.hasWebdriverWritable.detected,n.hasSeleniumProperty.detected,n.hasCDP.detected,n.hasPlaywright.detected,n.hasImpossibleDeviceMemory.detected,n.hasHighCPUCount.detected,n.hasMissingChromeObject.detected,n.hasWebdriverIframe.detected,n.hasWebdriverWorker.detected,n.hasMismatchWebGLInWorker.detected,n.hasMismatchPlatformIframe.detected,n.hasMismatchPlatformWorker.detected,n.hasSwiftshaderRenderer.detected,n.hasUTCTimezone.detected,n.hasMismatchLanguages.detected,n.hasInconsistentEtsl.detected,n.hasBotUserAgent.detected,n.hasGPUMismatch.detected,n.hasPlatformMismatch.detected].map(u=>u?"1":"0").join(""),m=[e.automation.webdriver===!0,e.automation.webdriverWritable===!0,e.automation.selenium===!0,e.automation.cdp===!0,e.automation.playwright===!0].map(u=>u?"1":"0").join(""),w=p(String(e.automation.navigatorPropertyDescriptors)).slice(0,4),o=`${m}h${w}`,v=typeof e.device.screenResolution.width=="number"?e.device.screenResolution.width:0,y=typeof e.device.screenResolution.height=="number"?e.device.screenResolution.height:0,W=typeof e.device.cpuCount=="number"?String(e.device.cpuCount).padStart(2,"0"):"00",x=typeof e.device.memory=="number"?String(Math.round(e.device.memory)).padStart(2,"0"):"00",k=[e.device.screenResolution.hasMultipleDisplays===!0,e.device.mediaQueries.prefersReducedMotion===!0,e.device.mediaQueries.prefersReducedTransparency===!0,e.device.mediaQueries.hover===!0,e.device.mediaQueries.anyHover===!0].map(u=>u?"1":"0").join(""),D=[e.device.platform,e.device.screenResolution.pixelDepth,e.device.screenResolution.colorDepth,e.device.multimediaDevices.speakers,e.device.multimediaDevices.microphones,e.device.multimediaDevices.webcams,e.device.mediaQueries.prefersColorScheme,e.device.mediaQueries.colorGamut,e.device.mediaQueries.pointer,e.device.mediaQueries.anyPointer,e.device.mediaQueries.colorDepth].map(u=>String(u)).join("|"),_=p(D).slice(0,6),R=`${v}x${y}c${W}m${x}b${k}h${_}`,I=typeof e.browser.features.bitmask=="string"?e.browser.features.bitmask:"0000000000",T=typeof e.browser.extensions.bitmask=="string"?e.browser.extensions.bitmask:"00000000",L=[e.browser.plugins.isValidPluginArray===!0,e.browser.plugins.pluginConsistency1===!0,e.browser.plugins.pluginOverflow===!0,e.browser.toSourceError.hasToSource===!0].map(u=>u?"1":"0").join(""),O=[e.browser.userAgent,e.browser.etsl,e.browser.maths,e.browser.plugins.pluginCount,e.browser.plugins.pluginNamesHash,e.browser.toSourceError.toSourceError,e.browser.highEntropyValues.architecture,e.browser.highEntropyValues.bitness,e.browser.highEntropyValues.platform,e.browser.highEntropyValues.platformVersion,e.browser.highEntropyValues.uaFullVersion,e.browser.highEntropyValues.mobile].map(u=>String(u)).join("|"),H=p(O).slice(0,6),U=`f${I}e${T}p${L}h${H}`,V=[e.graphics.canvas.hasModifiedCanvas===!0].map(u=>u?"1":"0").join(""),F=[e.graphics.webGL.vendor,e.graphics.webGL.renderer,e.graphics.webgpu.vendor,e.graphics.webgpu.architecture,e.graphics.webgpu.device,e.graphics.webgpu.description,e.graphics.canvas.canvasFingerprint].map(u=>String(u)).join("|"),G=p(F).slice(0,6),j=`${V}h${G}`,B=[e.codecs.hasMediaSource===!0].map(u=>u?"1":"0").join(""),N=[e.codecs.audioCanPlayTypeHash,e.codecs.videoCanPlayTypeHash,e.codecs.audioMediaSourceHash,e.codecs.videoMediaSourceHash,e.codecs.rtcAudioCapabilitiesHash,e.codecs.rtcVideoCapabilitiesHash].map(u=>String(u)).join("|"),z=p(N).slice(0,6),$=`${B}h${z}`,Q=typeof e.locale.languages.language=="string"?e.locale.languages.language.slice(0,2).toLowerCase():"xx",q=Array.isArray(e.locale.languages.languages)?e.locale.languages.languages.length:0,K=(typeof e.locale.internationalization.timezone=="string"?e.locale.internationalization.timezone:"unknown").replace(/[\/\s]/g,"-"),J=[e.locale.internationalization.timezone,e.locale.internationalization.localeLanguage,Array.isArray(e.locale.languages.languages)?e.locale.languages.languages.join(","):e.locale.languages.languages,e.locale.languages.language].map(u=>String(u)).join("|"),Y=p(J).slice(0,4),Z=`${Q}${q}t${K}_h${Y}`,X=[E(this.fingerprint,"iframe"),E(this.fingerprint,"worker"),e.contexts.iframe.webdriver===!0,e.contexts.webWorker.webdriver===!0].map(u=>u?"1":"0").join(""),ee=[e.contexts.iframe.userAgent,e.contexts.iframe.platform,e.contexts.iframe.memory,e.contexts.iframe.cpuCount,e.contexts.iframe.language,e.contexts.webWorker.userAgent,e.contexts.webWorker.platform,e.contexts.webWorker.memory,e.contexts.webWorker.cpuCount,e.contexts.webWorker.language,e.contexts.webWorker.vendor,e.contexts.webWorker.renderer].map(u=>String(u)).join("|"),te=p(ee).slice(0,6),re=`${X}h${te}`;return[i,g,o,R,U,j,$,Z,re].join("_")}catch(e){return console.error("Error generating fingerprint scanner id",e),l}}async encryptFingerprint(e){const n="__DEFAULT_FPSCANNER_KEY__";return n.length>20&&n.indexOf("DEFAULT")>0&&n.indexOf("FPSCANNER")>0&&console.warn('[fpscanner] WARNING: Using default encryption key! Run "npx fpscanner build --key=your-secret-key" to inject your own key. See: https://github.com/antoinevastel/fpscanner#advanced-custom-builds'),await ut(JSON.stringify(e),n)}getDetectionRules(){return[{name:"headlessChromeScreenResolution",severity:d,test:Be},{name:"hasWebdriver",severity:d,test:Ne},{name:"hasWebdriverWritable",severity:d,test:rt},{name:"hasSeleniumProperty",severity:d,test:ze},{name:"hasCDP",severity:d,test:$e},{name:"hasPlaywright",severity:d,test:Qe},{name:"hasImpossibleDeviceMemory",severity:d,test:qe},{name:"hasHighCPUCount",severity:d,test:Ke},{name:"hasMissingChromeObject",severity:d,test:Je},{name:"hasWebdriverIframe",severity:d,test:Ye},{name:"hasWebdriverWorker",severity:d,test:Ze},{name:"hasMismatchWebGLInWorker",severity:d,test:Xe},{name:"hasMismatchPlatformIframe",severity:d,test:tt},{name:"hasMismatchPlatformWorker",severity:d,test:et},{name:"hasSwiftshaderRenderer",severity:b,test:nt},{name:"hasUTCTimezone",severity:oe,test:it},{name:"hasMismatchLanguages",severity:b,test:at},{name:"hasInconsistentEtsl",severity:d,test:ot},{name:"hasBotUserAgent",severity:d,test:st},{name:"hasGPUMismatch",severity:d,test:ct},{name:"hasPlatformMismatch",severity:d,test:lt}]}runDetectionRules(){const e=this.getDetectionRules(),n={headlessChromeScreenResolution:{detected:!1,severity:"high"},hasWebdriver:{detected:!1,severity:"high"},hasWebdriverWritable:{detected:!1,severity:"high"},hasSeleniumProperty:{detected:!1,severity:"high"},hasCDP:{detected:!1,severity:"high"},hasPlaywright:{detected:!1,severity:"high"},hasImpossibleDeviceMemory:{detected:!1,severity:"high"},hasHighCPUCount:{detected:!1,severity:"high"},hasMissingChromeObject:{detected:!1,severity:"high"},hasWebdriverIframe:{detected:!1,severity:"high"},hasWebdriverWorker:{detected:!1,severity:"high"},hasMismatchWebGLInWorker:{detected:!1,severity:"high"},hasMismatchPlatformIframe:{detected:!1,severity:"high"},hasMismatchPlatformWorker:{detected:!1,severity:"high"},hasSwiftshaderRenderer:{detected:!1,severity:"low"},hasUTCTimezone:{detected:!1,severity:"medium"},hasMismatchLanguages:{detected:!1,severity:"low"},hasInconsistentEtsl:{detected:!1,severity:"high"},hasBotUserAgent:{detected:!1,severity:"high"},hasGPUMismatch:{detected:!1,severity:"high"},hasPlatformMismatch:{detected:!1,severity:"high"}};for(const i of e)try{const a=i.test(this.fingerprint);n[i.name]={detected:a,severity:i.severity}}catch{n[i.name]={detected:!1,severity:i.severity}}return n}async collectFingerprint(e={encrypt:!0}){const{encrypt:n=!0,skipWorker:i=!1}=e,a=this.fingerprint.signals,g={webdriver:this.collectSignal(ne),webdriverWritable:this.collectSignal(be),selenium:this.collectSignal(ye),cdp:this.collectSignal(ce),playwright:this.collectSignal(ue),navigatorPropertyDescriptors:this.collectSignal(Oe),cpuCount:this.collectSignal(de),memory:this.collectSignal(ge),platform:this.collectSignal(ae),screenResolution:this.collectSignal(fe),multimediaDevices:this.collectSignal(xe),mediaQueries:this.collectSignal(je),userAgent:this.collectSignal(ie),browserFeatures:this.collectSignal(Ge),plugins:this.collectSignal(We),browserExtensions:this.collectSignal(Fe),highEntropyValues:this.collectSignal(Se),etsl:this.collectSignal(me),maths:this.collectSignal(he),toSourceError:this.collectSignal(_e),webGL:this.collectSignal(le),webgpu:this.collectSignal(we),canvas:this.collectSignal(Le),mediaCodecs:this.collectSignal(Re),internationalization:this.collectSignal(pe),languages:this.collectSignal(ve),iframe:this.collectSignal(ke),webWorker:i?Promise.resolve({webdriver:f,userAgent:f,platform:f,memory:f,cpuCount:f,language:f,vendor:f,renderer:f}):this.collectSignal(De),nonce:this.collectSignal(He),time:this.collectSignal(Ue),url:this.collectSignal(Ve)},m=Object.keys(g),w=await Promise.all(Object.values(g)),o=Object.fromEntries(m.map((v,y)=>[v,w[y]]));return a.automation.webdriver=o.webdriver,a.automation.webdriverWritable=o.webdriverWritable,a.automation.selenium=o.selenium,a.automation.cdp=o.cdp,a.automation.playwright=o.playwright,a.automation.navigatorPropertyDescriptors=o.navigatorPropertyDescriptors,a.device.cpuCount=o.cpuCount,a.device.memory=o.memory,a.device.platform=o.platform,a.device.screenResolution=o.screenResolution,a.device.multimediaDevices=o.multimediaDevices,a.device.mediaQueries=o.mediaQueries,a.browser.userAgent=o.userAgent,a.browser.features=o.browserFeatures,a.browser.plugins=o.plugins,a.browser.extensions=o.browserExtensions,a.browser.highEntropyValues=o.highEntropyValues,a.browser.etsl=o.etsl,a.browser.maths=o.maths,a.browser.toSourceError=o.toSourceError,a.graphics.webGL=o.webGL,a.graphics.webgpu=o.webgpu,a.graphics.canvas=o.canvas,a.codecs=o.mediaCodecs,a.locale.internationalization=o.internationalization,a.locale.languages=o.languages,a.contexts.iframe=o.iframe,a.contexts.webWorker=o.webWorker,this.fingerprint.nonce=o.nonce,this.fingerprint.time=o.time,this.fingerprint.url=o.url,this.fingerprint.fastBotDetectionDetails=this.runDetectionRules(),this.fingerprint.fastBotDetection=Object.values(this.fingerprint.fastBotDetectionDetails).some(v=>v.detected),this.fingerprint.fsid=this.generateFingerprintScannerId(),n?await this.encryptFingerprint(JSON.stringify(this.fingerprint)):this.fingerprint}}exports.default=dt;
@@ -7,16 +7,16 @@ function ie() {
7
7
  function ae() {
8
8
  return navigator.platform;
9
9
  }
10
- const u = "ERROR", r = "INIT", s = "NA", f = "SKIPPED", h = "high", b = "low", oe = "medium";
11
- function g(t) {
10
+ const l = "ERROR", r = "INIT", s = "NA", f = "SKIPPED", d = "high", b = "low", oe = "medium";
11
+ function p(t) {
12
12
  let e = 0;
13
- for (let n = 0, a = t.length; n < a; n++) {
14
- let i = t.charCodeAt(n);
15
- e = (e << 5) - e + i, e |= 0;
13
+ for (let n = 0, i = t.length; n < i; n++) {
14
+ let a = t.charCodeAt(n);
15
+ e = (e << 5) - e + a, e |= 0;
16
16
  }
17
17
  return e.toString(16).padStart(8, "0");
18
18
  }
19
- function m(t, e) {
19
+ function h(t, e) {
20
20
  for (const n in t)
21
21
  t[n] = e;
22
22
  }
@@ -33,7 +33,7 @@ function ce() {
33
33
  const n = new Error("");
34
34
  return console.log(n), t;
35
35
  } catch {
36
- return u;
36
+ return l;
37
37
  }
38
38
  }
39
39
  function le() {
@@ -42,12 +42,12 @@ function le() {
42
42
  renderer: r
43
43
  };
44
44
  if (se())
45
- return m(t, s), t;
45
+ return h(t, s), t;
46
46
  try {
47
47
  var e = document.createElement("canvas"), n = e.getContext("webgl") || e.getContext("experimental-webgl");
48
- n.getSupportedExtensions().indexOf("WEBGL_debug_renderer_info") >= 0 ? (t.vendor = n.getParameter(n.getExtension("WEBGL_debug_renderer_info").UNMASKED_VENDOR_WEBGL), t.renderer = n.getParameter(n.getExtension("WEBGL_debug_renderer_info").UNMASKED_RENDERER_WEBGL)) : m(t, s);
48
+ n.getSupportedExtensions().indexOf("WEBGL_debug_renderer_info") >= 0 ? (t.vendor = n.getParameter(n.getExtension("WEBGL_debug_renderer_info").UNMASKED_VENDOR_WEBGL), t.renderer = n.getParameter(n.getExtension("WEBGL_debug_renderer_info").UNMASKED_RENDERER_WEBGL)) : h(t, s);
49
49
  } catch {
50
- m(t, u);
50
+ h(t, l);
51
51
  }
52
52
  return t;
53
53
  }
@@ -59,19 +59,19 @@ function de() {
59
59
  }
60
60
  function he() {
61
61
  const t = [], e = 0.123456789;
62
- return ["E", "LN10", "LN2", "LOG10E", "LOG2E", "PI", "SQRT1_2", "SQRT2"].forEach(function(i) {
62
+ return ["E", "LN10", "LN2", "LOG10E", "LOG2E", "PI", "SQRT1_2", "SQRT2"].forEach(function(a) {
63
63
  try {
64
- t.push(Math[i]);
64
+ t.push(Math[a]);
65
65
  } catch {
66
66
  t.push(-1);
67
67
  }
68
- }), ["tan", "sin", "exp", "atan", "acosh", "asinh", "atanh", "expm1", "log1p", "sinh"].forEach(function(i) {
68
+ }), ["tan", "sin", "exp", "atan", "acosh", "asinh", "atanh", "expm1", "log1p", "sinh"].forEach(function(a) {
69
69
  try {
70
- t.push(Math[i](e));
70
+ t.push(Math[a](e));
71
71
  } catch {
72
72
  t.push(-1);
73
73
  }
74
- }), g(t.map(String).join(","));
74
+ }), p(t.map(String).join(","));
75
75
  }
76
76
  function ge() {
77
77
  return navigator.deviceMemory || s;
@@ -91,7 +91,7 @@ function pe() {
91
91
  } else
92
92
  t.timezone = s, t.localeLanguage = s;
93
93
  } catch {
94
- t.timezone = u, t.localeLanguage = u;
94
+ t.timezone = l, t.localeLanguage = l;
95
95
  }
96
96
  return t;
97
97
  }
@@ -126,10 +126,10 @@ async function we() {
126
126
  const e = await navigator.gpu.requestAdapter();
127
127
  e && (t.vendor = e.info.vendor, t.architecture = e.info.architecture, t.device = e.info.device, t.description = e.info.description);
128
128
  } catch {
129
- m(t, u);
129
+ h(t, l);
130
130
  }
131
131
  else
132
- m(t, s);
132
+ h(t, s);
133
133
  return t;
134
134
  }
135
135
  function ye() {
@@ -204,10 +204,10 @@ async function Se() {
204
204
  ]);
205
205
  e.architecture = n.architecture, e.bitness = n.bitness, e.brands = n.brands, e.mobile = n.mobile, e.model = n.model, e.platform = n.platform, e.platformVersion = n.platformVersion, e.uaFullVersion = n.uaFullVersion;
206
206
  } catch {
207
- m(e, u);
207
+ h(e, l);
208
208
  }
209
209
  else
210
- m(e, s);
210
+ h(e, s);
211
211
  return e;
212
212
  }
213
213
  function Ce() {
@@ -220,7 +220,7 @@ function Ae() {
220
220
  const t = [];
221
221
  for (let e = 0; e < navigator.plugins.length; e++)
222
222
  t.push(navigator.plugins[e].name);
223
- return g(t.join(","));
223
+ return p(t.join(","));
224
224
  }
225
225
  function Pe() {
226
226
  return navigator.plugins ? navigator.plugins.length : s;
@@ -230,7 +230,7 @@ function Ee() {
230
230
  try {
231
231
  return navigator.plugins[0] === navigator.plugins[0][0].enabledPlugin;
232
232
  } catch {
233
- return u;
233
+ return l;
234
234
  }
235
235
  }
236
236
  function We() {
@@ -238,7 +238,7 @@ function We() {
238
238
  try {
239
239
  return navigator.plugins.item(4294967296) !== navigator.plugins[0];
240
240
  } catch {
241
- return u;
241
+ return l;
242
242
  }
243
243
  }
244
244
  function Me() {
@@ -252,7 +252,7 @@ function Me() {
252
252
  try {
253
253
  t.isValidPluginArray = Ce(), t.pluginCount = Pe(), t.pluginNamesHash = Ae(), t.pluginConsistency1 = Ee(), t.pluginOverflow = We();
254
254
  } catch {
255
- m(t, u);
255
+ h(t, l);
256
256
  }
257
257
  return t;
258
258
  }
@@ -264,11 +264,11 @@ async function xe() {
264
264
  videoinput: 0
265
265
  };
266
266
  if (navigator.mediaDevices && navigator.mediaDevices.enumerateDevices) {
267
- const i = await navigator.mediaDevices.enumerateDevices();
268
- if (typeof i < "u") {
269
- for (var n = 0; n < i.length; n++) {
270
- var a = i[n].kind;
271
- e[a] = e[a] + 1;
267
+ const a = await navigator.mediaDevices.enumerateDevices();
268
+ if (typeof a < "u") {
269
+ for (var n = 0; n < a.length; n++) {
270
+ var i = a[n].kind;
271
+ e[i] = e[i] + 1;
272
272
  }
273
273
  return t({
274
274
  speakers: e.audiooutput,
@@ -276,9 +276,9 @@ async function xe() {
276
276
  webcams: e.videoinput
277
277
  });
278
278
  } else
279
- return m(e, s), t(e);
279
+ return h(e, s), t(e);
280
280
  } else
281
- return m(e, s), t(e);
281
+ return h(e, s), t(e);
282
282
  });
283
283
  }
284
284
  function ke() {
@@ -290,14 +290,19 @@ function ke() {
290
290
  cpuCount: r,
291
291
  language: r
292
292
  }, e = document.createElement("iframe");
293
+ let n = !1;
293
294
  try {
294
- e.style.display = "none", e.src = "about:blank", document.body.appendChild(e);
295
- const n = e.contentWindow?.navigator;
296
- t.webdriver = n.webdriver ?? !1, t.userAgent = n.userAgent ?? s, t.platform = n.platform ?? s, t.memory = n.deviceMemory ?? s, t.cpuCount = n.hardwareConcurrency ?? s, t.language = n.language ?? s;
295
+ e.style.display = "none", e.src = "about:blank", document.body.appendChild(e), n = !0;
296
+ const i = e.contentWindow?.navigator;
297
+ t.webdriver = i.webdriver ?? !1, t.userAgent = i.userAgent ?? s, t.platform = i.platform ?? s, t.memory = i.deviceMemory ?? s, t.cpuCount = i.hardwareConcurrency ?? s, t.language = i.language ?? s;
297
298
  } catch {
298
- m(t, u);
299
+ h(t, l);
299
300
  } finally {
300
- document.body.removeChild(e);
301
+ if (n)
302
+ try {
303
+ document.body.removeChild(e);
304
+ } catch {
305
+ }
301
306
  }
302
307
  return t;
303
308
  }
@@ -312,8 +317,12 @@ async function De() {
312
317
  memory: r,
313
318
  cpuCount: r
314
319
  };
320
+ let n = null, i = null, a = null;
321
+ const g = () => {
322
+ a && clearTimeout(a), n && n.terminate(), i && URL.revokeObjectURL(i);
323
+ };
315
324
  try {
316
- const n = `try {
325
+ const m = `try {
317
326
  var fingerprintWorker = {};
318
327
 
319
328
  fingerprintWorker.userAgent = navigator.userAgent;
@@ -343,16 +352,22 @@ async function De() {
343
352
  self.postMessage(fingerprintWorker);
344
353
  } catch (e) {
345
354
  self.postMessage(fingerprintWorker);
346
- }`, a = new Blob([n], { type: "application/javascript" }), i = URL.createObjectURL(a), p = new Worker(i);
347
- p.onmessage = function(d) {
355
+ }`, w = new Blob([m], { type: "application/javascript" });
356
+ i = URL.createObjectURL(w), n = new Worker(i), a = window.setTimeout(() => {
357
+ g(), h(e, l), t(e);
358
+ }, 2e3), n.onmessage = function(o) {
348
359
  try {
349
- return e.vendor = d.data.vendor, e.renderer = d.data.renderer, e.userAgent = d.data.userAgent, e.language = d.data.language, e.platform = d.data.platform, e.memory = d.data.memory, e.cpuCount = d.data.cpuCount, t(e);
360
+ e.vendor = o.data.vendor, e.renderer = o.data.renderer, e.userAgent = o.data.userAgent, e.language = o.data.language, e.platform = o.data.platform, e.memory = o.data.memory, e.cpuCount = o.data.cpuCount;
350
361
  } catch {
351
- return m(e, u), t(e);
362
+ h(e, l);
363
+ } finally {
364
+ g(), t(e);
352
365
  }
366
+ }, n.onerror = function() {
367
+ g(), h(e, l), t(e);
353
368
  };
354
369
  } catch {
355
- return m(e, u), t(e);
370
+ g(), h(e, l), t(e);
356
371
  }
357
372
  });
358
373
  }
@@ -403,31 +418,31 @@ const S = [
403
418
  function A(t, e) {
404
419
  const n = {};
405
420
  try {
406
- const a = document.createElement(e);
407
- for (const i of t)
421
+ const i = document.createElement(e);
422
+ for (const a of t)
408
423
  try {
409
- n[i] = a.canPlayType(i) || null;
424
+ n[a] = i.canPlayType(a) || null;
410
425
  } catch {
411
- n[i] = null;
426
+ n[a] = null;
412
427
  }
413
428
  } catch {
414
- for (const a of t)
415
- n[a] = null;
429
+ for (const i of t)
430
+ n[i] = null;
416
431
  }
417
432
  return n;
418
433
  }
419
434
  function P(t) {
420
435
  const e = {}, n = window.MediaSource;
421
436
  if (!n || typeof n.isTypeSupported != "function") {
422
- for (const a of t)
423
- e[a] = null;
437
+ for (const i of t)
438
+ e[i] = null;
424
439
  return e;
425
440
  }
426
- for (const a of t)
441
+ for (const i of t)
427
442
  try {
428
- e[a] = n.isTypeSupported(a);
443
+ e[i] = n.isTypeSupported(i);
429
444
  } catch {
430
- e[a] = null;
445
+ e[i] = null;
431
446
  }
432
447
  return e;
433
448
  }
@@ -436,11 +451,11 @@ function E(t) {
436
451
  const e = window.RTCRtpReceiver;
437
452
  if (e && typeof e.getCapabilities == "function") {
438
453
  const n = e.getCapabilities(t);
439
- return g(JSON.stringify(n));
454
+ return p(JSON.stringify(n));
440
455
  }
441
456
  return s;
442
457
  } catch {
443
- return u;
458
+ return l;
444
459
  }
445
460
  }
446
461
  function Re() {
@@ -456,11 +471,11 @@ function Re() {
456
471
  try {
457
472
  t.hasMediaSource = !!window.MediaSource;
458
473
  const e = A(S, "audio"), n = A(C, "video");
459
- t.audioCanPlayTypeHash = g(JSON.stringify(e)), t.videoCanPlayTypeHash = g(JSON.stringify(n));
460
- const a = P(S), i = P(C);
461
- t.audioMediaSourceHash = g(JSON.stringify(a)), t.videoMediaSourceHash = g(JSON.stringify(i)), t.rtcAudioCapabilitiesHash = E("audio"), t.rtcVideoCapabilitiesHash = E("video");
474
+ t.audioCanPlayTypeHash = p(JSON.stringify(e)), t.videoCanPlayTypeHash = p(JSON.stringify(n));
475
+ const i = P(S), a = P(C);
476
+ t.audioMediaSourceHash = p(JSON.stringify(i)), t.videoMediaSourceHash = p(JSON.stringify(a)), t.rtcAudioCapabilitiesHash = E("audio"), t.rtcVideoCapabilitiesHash = E("video");
462
477
  } catch {
463
- m(t, u);
478
+ h(t, l);
464
479
  }
465
480
  return t;
466
481
  }
@@ -469,12 +484,12 @@ async function Ie() {
469
484
  try {
470
485
  const e = new Image(), n = document.createElement("canvas").getContext("2d");
471
486
  e.onload = () => {
472
- n.drawImage(e, 0, 0), t(n.getImageData(0, 0, 1, 1).data.filter((a) => a === 0).length != 4);
487
+ n.drawImage(e, 0, 0), t(n.getImageData(0, 0, 1, 1).data.filter((i) => i === 0).length != 4);
473
488
  }, e.onerror = () => {
474
- t(u);
489
+ t(l);
475
490
  }, e.src = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAC0lEQVQYV2NgAAIAAAUAAarVyFEAAAAASUVORK5CYII=";
476
491
  } catch {
477
- t(u);
492
+ t(l);
478
493
  }
479
494
  });
480
495
  }
@@ -483,9 +498,9 @@ function Te() {
483
498
  t.width = 400, t.height = 200, t.style.display = "inline";
484
499
  var e = t.getContext("2d");
485
500
  try {
486
- return e.rect(0, 0, 10, 10), e.rect(2, 2, 6, 6), e.textBaseline = "alphabetic", e.fillStyle = "#f60", e.fillRect(125, 1, 62, 20), e.fillStyle = "#069", e.font = "11pt no-real-font-123", e.fillText("Cwm fjordbank glyphs vext quiz, ๐Ÿ˜ƒ", 2, 15), e.fillStyle = "rgba(102, 204, 0, 0.2)", e.font = "18pt Arial", e.fillText("Cwm fjordbank glyphs vext quiz, ๐Ÿ˜ƒ", 4, 45), e.globalCompositeOperation = "multiply", e.fillStyle = "rgb(255,0,255)", e.beginPath(), e.arc(50, 50, 50, 0, 2 * Math.PI, !0), e.closePath(), e.fill(), e.fillStyle = "rgb(0,255,255)", e.beginPath(), e.arc(100, 50, 50, 0, 2 * Math.PI, !0), e.closePath(), e.fill(), e.fillStyle = "rgb(255,255,0)", e.beginPath(), e.arc(75, 100, 50, 0, 2 * Math.PI, !0), e.closePath(), e.fill(), e.fillStyle = "rgb(255,0,255)", e.arc(75, 75, 75, 0, 2 * Math.PI, !0), e.arc(75, 75, 25, 0, 2 * Math.PI, !0), e.fill("evenodd"), g(t.toDataURL());
501
+ return e.rect(0, 0, 10, 10), e.rect(2, 2, 6, 6), e.textBaseline = "alphabetic", e.fillStyle = "#f60", e.fillRect(125, 1, 62, 20), e.fillStyle = "#069", e.font = "11pt no-real-font-123", e.fillText("Cwm fjordbank glyphs vext quiz, ๐Ÿ˜ƒ", 2, 15), e.fillStyle = "rgba(102, 204, 0, 0.2)", e.font = "18pt Arial", e.fillText("Cwm fjordbank glyphs vext quiz, ๐Ÿ˜ƒ", 4, 45), e.globalCompositeOperation = "multiply", e.fillStyle = "rgb(255,0,255)", e.beginPath(), e.arc(50, 50, 50, 0, 2 * Math.PI, !0), e.closePath(), e.fill(), e.fillStyle = "rgb(0,255,255)", e.beginPath(), e.arc(100, 50, 50, 0, 2 * Math.PI, !0), e.closePath(), e.fill(), e.fillStyle = "rgb(255,255,0)", e.beginPath(), e.arc(75, 100, 50, 0, 2 * Math.PI, !0), e.closePath(), e.fill(), e.fillStyle = "rgb(255,0,255)", e.arc(75, 75, 75, 0, 2 * Math.PI, !0), e.arc(75, 75, 25, 0, 2 * Math.PI, !0), e.fill("evenodd"), p(t.toDataURL());
487
502
  } catch {
488
- return u;
503
+ return l;
489
504
  }
490
505
  }
491
506
  async function Le() {
@@ -498,8 +513,8 @@ async function Le() {
498
513
  function Oe() {
499
514
  const t = ["deviceMemory", "hardwareConcurrency", "language", "languages", "platform"], e = [];
500
515
  for (const n of t) {
501
- const a = Object.getOwnPropertyDescriptor(Object.getPrototypeOf(navigator), n);
502
- a && a.value ? e.push("1") : e.push("0");
516
+ const i = Object.getOwnPropertyDescriptor(Object.getPrototypeOf(navigator), n);
517
+ i && i.value ? e.push("1") : e.push("0");
503
518
  }
504
519
  return e.join("");
505
520
  }
@@ -520,17 +535,17 @@ function Fe() {
520
535
  const t = {
521
536
  bitmask: r,
522
537
  extensions: []
523
- }, e = document.body.hasAttribute("data-gr-ext-installed"), n = typeof window.ethereum < "u", a = document.getElementById("coupon-birds-drop-div") !== null, i = document.querySelector("deepl-input-controller") !== null, p = document.getElementById("monica-content-root") !== null, d = document.querySelector("chatgpt-sidebar") !== null, w = typeof window.__REQUESTLY__ < "u", o = Array.from(document.querySelectorAll("*")).filter((v) => v.tagName.toLowerCase().startsWith("veepn-")).length > 0;
538
+ }, e = document.body.hasAttribute("data-gr-ext-installed"), n = typeof window.ethereum < "u", i = document.getElementById("coupon-birds-drop-div") !== null, a = document.querySelector("deepl-input-controller") !== null, g = document.getElementById("monica-content-root") !== null, m = document.querySelector("chatgpt-sidebar") !== null, w = typeof window.__REQUESTLY__ < "u", o = Array.from(document.querySelectorAll("*")).filter((v) => v.tagName.toLowerCase().startsWith("veepn-")).length > 0;
524
539
  return t.bitmask = [
525
540
  e ? "1" : "0",
526
541
  n ? "1" : "0",
527
- a ? "1" : "0",
528
542
  i ? "1" : "0",
529
- p ? "1" : "0",
530
- d ? "1" : "0",
543
+ a ? "1" : "0",
544
+ g ? "1" : "0",
545
+ m ? "1" : "0",
531
546
  w ? "1" : "0",
532
547
  o ? "1" : "0"
533
- ].join(""), e && t.extensions.push("grammarly"), n && t.extensions.push("metamask"), a && t.extensions.push("coupon-birds"), i && t.extensions.push("deepl"), p && t.extensions.push("monica-ai"), d && t.extensions.push("sider-ai"), w && t.extensions.push("requestly"), o && t.extensions.push("veepn"), t;
548
+ ].join(""), e && t.extensions.push("grammarly"), n && t.extensions.push("metamask"), i && t.extensions.push("coupon-birds"), a && t.extensions.push("deepl"), g && t.extensions.push("monica-ai"), m && t.extensions.push("sider-ai"), w && t.extensions.push("requestly"), o && t.extensions.push("veepn"), t;
534
549
  }
535
550
  function c(t) {
536
551
  try {
@@ -592,7 +607,7 @@ function Be() {
592
607
  window.matchMedia(`(color: ${n})`).matches && (e = n);
593
608
  t.colorDepth = e;
594
609
  } catch {
595
- m(t, u);
610
+ h(t, l);
596
611
  }
597
612
  return t;
598
613
  }
@@ -630,13 +645,13 @@ function Ze(t) {
630
645
  }
631
646
  function Xe(t) {
632
647
  const e = t.signals.contexts.webWorker, n = t.signals.graphics.webGL;
633
- return e.vendor === u || e.renderer === u || n.vendor === s || n.renderer === s || e.vendor === f ? !1 : e.vendor !== n.vendor || e.renderer !== n.renderer;
648
+ return e.vendor === l || e.renderer === l || n.vendor === s || n.renderer === s || e.vendor === f ? !1 : e.vendor !== n.vendor || e.renderer !== n.renderer;
634
649
  }
635
650
  function et(t) {
636
- return t.signals.contexts.webWorker.platform === s || t.signals.contexts.webWorker.platform === u || t.signals.contexts.webWorker.platform === f ? !1 : t.signals.device.platform !== t.signals.contexts.webWorker.platform;
651
+ return t.signals.contexts.webWorker.platform === s || t.signals.contexts.webWorker.platform === l || t.signals.contexts.webWorker.platform === f ? !1 : t.signals.device.platform !== t.signals.contexts.webWorker.platform;
637
652
  }
638
653
  function tt(t) {
639
- return t.signals.contexts.iframe.platform === s || t.signals.contexts.iframe.platform === u ? !1 : t.signals.device.platform !== t.signals.contexts.iframe.platform;
654
+ return t.signals.contexts.iframe.platform === s || t.signals.contexts.iframe.platform === l ? !1 : t.signals.device.platform !== t.signals.contexts.iframe.platform;
640
655
  }
641
656
  function rt(t) {
642
657
  return t.signals.automation.webdriverWritable === !0;
@@ -662,19 +677,19 @@ function st(t) {
662
677
  ].some((n) => /bot|headless/i.test(n.toLowerCase()));
663
678
  }
664
679
  function ct(t) {
665
- const e = t.signals.graphics.webgpu, n = t.signals.graphics.webGL, a = t.signals.browser.userAgent;
666
- return !!((n.vendor.includes("Apple") || n.renderer.includes("Apple")) && !a.includes("Mac") || e.vendor.includes("apple") && !a.includes("Mac") || e.vendor.includes("apple") && !n.renderer.includes("Apple"));
680
+ const e = t.signals.graphics.webgpu, n = t.signals.graphics.webGL, i = t.signals.browser.userAgent;
681
+ return !!((n.vendor.includes("Apple") || n.renderer.includes("Apple")) && !i.includes("Mac") || e.vendor.includes("apple") && !i.includes("Mac") || e.vendor.includes("apple") && !n.renderer.includes("Apple"));
667
682
  }
668
683
  function lt(t) {
669
- const e = t.signals.device.platform, n = t.signals.browser.userAgent, a = t.signals.browser.highEntropyValues.platform;
670
- return !!(n.includes("Mac") && !e.includes("Mac") || n.includes("Windows") && !e.includes("Win") || n.includes("Linux") && !e.includes("Linux") || a !== u && a !== s && (a.includes("Mac") && !e.includes("Mac") || a.includes("Windows") && !e.includes("Win") || a.includes("Linux") && !e.includes("Linux") || a.includes("Android") && !e.includes("Android") || a.includes("iOS") && !e.includes("iOS")));
684
+ const e = t.signals.device.platform, n = t.signals.browser.userAgent, i = t.signals.browser.highEntropyValues.platform;
685
+ return !!(n.includes("Mac") && !e.includes("Mac") || n.includes("Windows") && !e.includes("Win") || n.includes("Linux") && !e.includes("Linux") || i !== l && i !== s && (i.includes("Mac") && !e.includes("Mac") || i.includes("Windows") && !e.includes("Win") || i.includes("Linux") && !e.includes("Linux") || i.includes("Android") && !e.includes("Android") || i.includes("iOS") && !e.includes("iOS")));
671
686
  }
672
687
  async function ut(t, e) {
673
- const n = new TextEncoder().encode(e), a = new TextEncoder().encode(t), i = new Uint8Array(a.length);
674
- for (let d = 0; d < a.length; d++)
675
- i[d] = a[d] ^ n[d % n.length];
676
- const p = String.fromCharCode(...i);
677
- return btoa(p);
688
+ const n = new TextEncoder().encode(e), i = new TextEncoder().encode(t), a = new Uint8Array(i.length);
689
+ for (let m = 0; m < i.length; m++)
690
+ a[m] = i[m] ^ n[m % n.length];
691
+ const g = String.fromCharCode(...a);
692
+ return btoa(g);
678
693
  }
679
694
  class ht {
680
695
  constructor() {
@@ -878,7 +893,7 @@ class ht {
878
893
  try {
879
894
  return await e();
880
895
  } catch {
881
- return u;
896
+ return l;
882
897
  }
883
898
  }
884
899
  /**
@@ -905,7 +920,7 @@ class ht {
905
920
  */
906
921
  generateFingerprintScannerId() {
907
922
  try {
908
- const e = this.fingerprint.signals, n = this.fingerprint.fastBotDetectionDetails, a = "FS1", p = [
923
+ const e = this.fingerprint.signals, n = this.fingerprint.fastBotDetectionDetails, i = "FS1", g = [
909
924
  n.headlessChromeScreenResolution.detected,
910
925
  n.hasWebdriver.detected,
911
926
  n.hasWebdriverWritable.detected,
@@ -928,19 +943,19 @@ class ht {
928
943
  n.hasGPUMismatch.detected,
929
944
  n.hasPlatformMismatch.detected
930
945
  // Add other detection rules output here
931
- ].map((l) => l ? "1" : "0").join(""), d = [
946
+ ].map((u) => u ? "1" : "0").join(""), m = [
932
947
  e.automation.webdriver === !0,
933
948
  e.automation.webdriverWritable === !0,
934
949
  e.automation.selenium === !0,
935
950
  e.automation.cdp === !0,
936
951
  e.automation.playwright === !0
937
- ].map((l) => l ? "1" : "0").join(""), w = g(String(e.automation.navigatorPropertyDescriptors)).slice(0, 4), o = `${d}h${w}`, v = typeof e.device.screenResolution.width == "number" ? e.device.screenResolution.width : 0, y = typeof e.device.screenResolution.height == "number" ? e.device.screenResolution.height : 0, M = typeof e.device.cpuCount == "number" ? String(e.device.cpuCount).padStart(2, "0") : "00", x = typeof e.device.memory == "number" ? String(Math.round(e.device.memory)).padStart(2, "0") : "00", k = [
952
+ ].map((u) => u ? "1" : "0").join(""), w = p(String(e.automation.navigatorPropertyDescriptors)).slice(0, 4), o = `${m}h${w}`, v = typeof e.device.screenResolution.width == "number" ? e.device.screenResolution.width : 0, y = typeof e.device.screenResolution.height == "number" ? e.device.screenResolution.height : 0, M = typeof e.device.cpuCount == "number" ? String(e.device.cpuCount).padStart(2, "0") : "00", x = typeof e.device.memory == "number" ? String(Math.round(e.device.memory)).padStart(2, "0") : "00", k = [
938
953
  e.device.screenResolution.hasMultipleDisplays === !0,
939
954
  e.device.mediaQueries.prefersReducedMotion === !0,
940
955
  e.device.mediaQueries.prefersReducedTransparency === !0,
941
956
  e.device.mediaQueries.hover === !0,
942
957
  e.device.mediaQueries.anyHover === !0
943
- ].map((l) => l ? "1" : "0").join(""), D = [
958
+ ].map((u) => u ? "1" : "0").join(""), D = [
944
959
  e.device.platform,
945
960
  e.device.screenResolution.pixelDepth,
946
961
  e.device.screenResolution.colorDepth,
@@ -952,12 +967,12 @@ class ht {
952
967
  e.device.mediaQueries.pointer,
953
968
  e.device.mediaQueries.anyPointer,
954
969
  e.device.mediaQueries.colorDepth
955
- ].map((l) => String(l)).join("|"), _ = g(D).slice(0, 6), R = `${v}x${y}c${M}m${x}b${k}h${_}`, I = typeof e.browser.features.bitmask == "string" ? e.browser.features.bitmask : "0000000000", T = typeof e.browser.extensions.bitmask == "string" ? e.browser.extensions.bitmask : "00000000", L = [
970
+ ].map((u) => String(u)).join("|"), _ = p(D).slice(0, 6), R = `${v}x${y}c${M}m${x}b${k}h${_}`, I = typeof e.browser.features.bitmask == "string" ? e.browser.features.bitmask : "0000000000", T = typeof e.browser.extensions.bitmask == "string" ? e.browser.extensions.bitmask : "00000000", L = [
956
971
  e.browser.plugins.isValidPluginArray === !0,
957
972
  e.browser.plugins.pluginConsistency1 === !0,
958
973
  e.browser.plugins.pluginOverflow === !0,
959
974
  e.browser.toSourceError.hasToSource === !0
960
- ].map((l) => l ? "1" : "0").join(""), O = [
975
+ ].map((u) => u ? "1" : "0").join(""), O = [
961
976
  e.browser.userAgent,
962
977
  e.browser.etsl,
963
978
  e.browser.maths,
@@ -970,9 +985,9 @@ class ht {
970
985
  e.browser.highEntropyValues.platformVersion,
971
986
  e.browser.highEntropyValues.uaFullVersion,
972
987
  e.browser.highEntropyValues.mobile
973
- ].map((l) => String(l)).join("|"), H = g(O).slice(0, 6), U = `f${I}e${T}p${L}h${H}`, V = [
988
+ ].map((u) => String(u)).join("|"), H = p(O).slice(0, 6), U = `f${I}e${T}p${L}h${H}`, V = [
974
989
  e.graphics.canvas.hasModifiedCanvas === !0
975
- ].map((l) => l ? "1" : "0").join(""), F = [
990
+ ].map((u) => u ? "1" : "0").join(""), F = [
976
991
  e.graphics.webGL.vendor,
977
992
  e.graphics.webGL.renderer,
978
993
  e.graphics.webgpu.vendor,
@@ -980,26 +995,26 @@ class ht {
980
995
  e.graphics.webgpu.device,
981
996
  e.graphics.webgpu.description,
982
997
  e.graphics.canvas.canvasFingerprint
983
- ].map((l) => String(l)).join("|"), G = g(F).slice(0, 6), B = `${V}h${G}`, j = [
998
+ ].map((u) => String(u)).join("|"), G = p(F).slice(0, 6), B = `${V}h${G}`, j = [
984
999
  e.codecs.hasMediaSource === !0
985
- ].map((l) => l ? "1" : "0").join(""), N = [
1000
+ ].map((u) => u ? "1" : "0").join(""), N = [
986
1001
  e.codecs.audioCanPlayTypeHash,
987
1002
  e.codecs.videoCanPlayTypeHash,
988
1003
  e.codecs.audioMediaSourceHash,
989
1004
  e.codecs.videoMediaSourceHash,
990
1005
  e.codecs.rtcAudioCapabilitiesHash,
991
1006
  e.codecs.rtcVideoCapabilitiesHash
992
- ].map((l) => String(l)).join("|"), z = g(N).slice(0, 6), $ = `${j}h${z}`, Q = typeof e.locale.languages.language == "string" ? e.locale.languages.language.slice(0, 2).toLowerCase() : "xx", q = Array.isArray(e.locale.languages.languages) ? e.locale.languages.languages.length : 0, K = (typeof e.locale.internationalization.timezone == "string" ? e.locale.internationalization.timezone : "unknown").replace(/[\/\s]/g, "-"), J = [
1007
+ ].map((u) => String(u)).join("|"), z = p(N).slice(0, 6), $ = `${j}h${z}`, Q = typeof e.locale.languages.language == "string" ? e.locale.languages.language.slice(0, 2).toLowerCase() : "xx", q = Array.isArray(e.locale.languages.languages) ? e.locale.languages.languages.length : 0, K = (typeof e.locale.internationalization.timezone == "string" ? e.locale.internationalization.timezone : "unknown").replace(/[\/\s]/g, "-"), J = [
993
1008
  e.locale.internationalization.timezone,
994
1009
  e.locale.internationalization.localeLanguage,
995
1010
  Array.isArray(e.locale.languages.languages) ? e.locale.languages.languages.join(",") : e.locale.languages.languages,
996
1011
  e.locale.languages.language
997
- ].map((l) => String(l)).join("|"), Y = g(J).slice(0, 4), Z = `${Q}${q}t${K}_h${Y}`, X = [
1012
+ ].map((u) => String(u)).join("|"), Y = p(J).slice(0, 4), Z = `${Q}${q}t${K}_h${Y}`, X = [
998
1013
  W(this.fingerprint, "iframe"),
999
1014
  W(this.fingerprint, "worker"),
1000
1015
  e.contexts.iframe.webdriver === !0,
1001
1016
  e.contexts.webWorker.webdriver === !0
1002
- ].map((l) => l ? "1" : "0").join(""), ee = [
1017
+ ].map((u) => u ? "1" : "0").join(""), ee = [
1003
1018
  e.contexts.iframe.userAgent,
1004
1019
  e.contexts.iframe.platform,
1005
1020
  e.contexts.iframe.memory,
@@ -1012,10 +1027,10 @@ class ht {
1012
1027
  e.contexts.webWorker.language,
1013
1028
  e.contexts.webWorker.vendor,
1014
1029
  e.contexts.webWorker.renderer
1015
- ].map((l) => String(l)).join("|"), te = g(ee).slice(0, 6), re = `${X}h${te}`;
1030
+ ].map((u) => String(u)).join("|"), te = p(ee).slice(0, 6), re = `${X}h${te}`;
1016
1031
  return [
1017
- a,
1018
- p,
1032
+ i,
1033
+ g,
1019
1034
  o,
1020
1035
  R,
1021
1036
  U,
@@ -1025,7 +1040,7 @@ class ht {
1025
1040
  re
1026
1041
  ].join("_");
1027
1042
  } catch (e) {
1028
- return console.error("Error generating fingerprint scanner id", e), u;
1043
+ return console.error("Error generating fingerprint scanner id", e), l;
1029
1044
  }
1030
1045
  }
1031
1046
  async encryptFingerprint(e) {
@@ -1039,27 +1054,27 @@ class ht {
1039
1054
  */
1040
1055
  getDetectionRules() {
1041
1056
  return [
1042
- { name: "headlessChromeScreenResolution", severity: h, test: je },
1043
- { name: "hasWebdriver", severity: h, test: Ne },
1044
- { name: "hasWebdriverWritable", severity: h, test: rt },
1045
- { name: "hasSeleniumProperty", severity: h, test: ze },
1046
- { name: "hasCDP", severity: h, test: $e },
1047
- { name: "hasPlaywright", severity: h, test: Qe },
1048
- { name: "hasImpossibleDeviceMemory", severity: h, test: qe },
1049
- { name: "hasHighCPUCount", severity: h, test: Ke },
1050
- { name: "hasMissingChromeObject", severity: h, test: Je },
1051
- { name: "hasWebdriverIframe", severity: h, test: Ye },
1052
- { name: "hasWebdriverWorker", severity: h, test: Ze },
1053
- { name: "hasMismatchWebGLInWorker", severity: h, test: Xe },
1054
- { name: "hasMismatchPlatformIframe", severity: h, test: tt },
1055
- { name: "hasMismatchPlatformWorker", severity: h, test: et },
1057
+ { name: "headlessChromeScreenResolution", severity: d, test: je },
1058
+ { name: "hasWebdriver", severity: d, test: Ne },
1059
+ { name: "hasWebdriverWritable", severity: d, test: rt },
1060
+ { name: "hasSeleniumProperty", severity: d, test: ze },
1061
+ { name: "hasCDP", severity: d, test: $e },
1062
+ { name: "hasPlaywright", severity: d, test: Qe },
1063
+ { name: "hasImpossibleDeviceMemory", severity: d, test: qe },
1064
+ { name: "hasHighCPUCount", severity: d, test: Ke },
1065
+ { name: "hasMissingChromeObject", severity: d, test: Je },
1066
+ { name: "hasWebdriverIframe", severity: d, test: Ye },
1067
+ { name: "hasWebdriverWorker", severity: d, test: Ze },
1068
+ { name: "hasMismatchWebGLInWorker", severity: d, test: Xe },
1069
+ { name: "hasMismatchPlatformIframe", severity: d, test: tt },
1070
+ { name: "hasMismatchPlatformWorker", severity: d, test: et },
1056
1071
  { name: "hasSwiftshaderRenderer", severity: b, test: nt },
1057
1072
  { name: "hasUTCTimezone", severity: oe, test: it },
1058
1073
  { name: "hasMismatchLanguages", severity: b, test: at },
1059
- { name: "hasInconsistentEtsl", severity: h, test: ot },
1060
- { name: "hasBotUserAgent", severity: h, test: st },
1061
- { name: "hasGPUMismatch", severity: h, test: ct },
1062
- { name: "hasPlatformMismatch", severity: h, test: lt }
1074
+ { name: "hasInconsistentEtsl", severity: d, test: ot },
1075
+ { name: "hasBotUserAgent", severity: d, test: st },
1076
+ { name: "hasGPUMismatch", severity: d, test: ct },
1077
+ { name: "hasPlatformMismatch", severity: d, test: lt }
1063
1078
  ];
1064
1079
  }
1065
1080
  runDetectionRules() {
@@ -1086,17 +1101,17 @@ class ht {
1086
1101
  hasGPUMismatch: { detected: !1, severity: "high" },
1087
1102
  hasPlatformMismatch: { detected: !1, severity: "high" }
1088
1103
  };
1089
- for (const a of e)
1104
+ for (const i of e)
1090
1105
  try {
1091
- const i = a.test(this.fingerprint);
1092
- n[a.name] = { detected: i, severity: a.severity };
1106
+ const a = i.test(this.fingerprint);
1107
+ n[i.name] = { detected: a, severity: i.severity };
1093
1108
  } catch {
1094
- n[a.name] = { detected: !1, severity: a.severity };
1109
+ n[i.name] = { detected: !1, severity: i.severity };
1095
1110
  }
1096
1111
  return n;
1097
1112
  }
1098
1113
  async collectFingerprint(e = { encrypt: !0 }) {
1099
- const { encrypt: n = !0, skipWorker: a = !1 } = e, i = this.fingerprint.signals, p = {
1114
+ const { encrypt: n = !0, skipWorker: i = !1 } = e, a = this.fingerprint.signals, g = {
1100
1115
  // Automation signals
1101
1116
  webdriver: this.collectSignal(ne),
1102
1117
  webdriverWritable: this.collectSignal(be),
@@ -1131,7 +1146,7 @@ class ht {
1131
1146
  languages: this.collectSignal(ve),
1132
1147
  // Context signals
1133
1148
  iframe: this.collectSignal(ke),
1134
- webWorker: a ? Promise.resolve({
1149
+ webWorker: i ? Promise.resolve({
1135
1150
  webdriver: f,
1136
1151
  userAgent: f,
1137
1152
  platform: f,
@@ -1145,8 +1160,8 @@ class ht {
1145
1160
  nonce: this.collectSignal(He),
1146
1161
  time: this.collectSignal(Ue),
1147
1162
  url: this.collectSignal(Ve)
1148
- }, d = Object.keys(p), w = await Promise.all(Object.values(p)), o = Object.fromEntries(d.map((v, y) => [v, w[y]]));
1149
- return i.automation.webdriver = o.webdriver, i.automation.webdriverWritable = o.webdriverWritable, i.automation.selenium = o.selenium, i.automation.cdp = o.cdp, i.automation.playwright = o.playwright, i.automation.navigatorPropertyDescriptors = o.navigatorPropertyDescriptors, i.device.cpuCount = o.cpuCount, i.device.memory = o.memory, i.device.platform = o.platform, i.device.screenResolution = o.screenResolution, i.device.multimediaDevices = o.multimediaDevices, i.device.mediaQueries = o.mediaQueries, i.browser.userAgent = o.userAgent, i.browser.features = o.browserFeatures, i.browser.plugins = o.plugins, i.browser.extensions = o.browserExtensions, i.browser.highEntropyValues = o.highEntropyValues, i.browser.etsl = o.etsl, i.browser.maths = o.maths, i.browser.toSourceError = o.toSourceError, i.graphics.webGL = o.webGL, i.graphics.webgpu = o.webgpu, i.graphics.canvas = o.canvas, i.codecs = o.mediaCodecs, i.locale.internationalization = o.internationalization, i.locale.languages = o.languages, i.contexts.iframe = o.iframe, i.contexts.webWorker = o.webWorker, this.fingerprint.nonce = o.nonce, this.fingerprint.time = o.time, this.fingerprint.url = o.url, this.fingerprint.fastBotDetectionDetails = this.runDetectionRules(), this.fingerprint.fastBotDetection = Object.values(this.fingerprint.fastBotDetectionDetails).some((v) => v.detected), this.fingerprint.fsid = this.generateFingerprintScannerId(), n ? await this.encryptFingerprint(JSON.stringify(this.fingerprint)) : this.fingerprint;
1163
+ }, m = Object.keys(g), w = await Promise.all(Object.values(g)), o = Object.fromEntries(m.map((v, y) => [v, w[y]]));
1164
+ return a.automation.webdriver = o.webdriver, a.automation.webdriverWritable = o.webdriverWritable, a.automation.selenium = o.selenium, a.automation.cdp = o.cdp, a.automation.playwright = o.playwright, a.automation.navigatorPropertyDescriptors = o.navigatorPropertyDescriptors, a.device.cpuCount = o.cpuCount, a.device.memory = o.memory, a.device.platform = o.platform, a.device.screenResolution = o.screenResolution, a.device.multimediaDevices = o.multimediaDevices, a.device.mediaQueries = o.mediaQueries, a.browser.userAgent = o.userAgent, a.browser.features = o.browserFeatures, a.browser.plugins = o.plugins, a.browser.extensions = o.browserExtensions, a.browser.highEntropyValues = o.highEntropyValues, a.browser.etsl = o.etsl, a.browser.maths = o.maths, a.browser.toSourceError = o.toSourceError, a.graphics.webGL = o.webGL, a.graphics.webgpu = o.webgpu, a.graphics.canvas = o.canvas, a.codecs = o.mediaCodecs, a.locale.internationalization = o.internationalization, a.locale.languages = o.languages, a.contexts.iframe = o.iframe, a.contexts.webWorker = o.webWorker, this.fingerprint.nonce = o.nonce, this.fingerprint.time = o.time, this.fingerprint.url = o.url, this.fingerprint.fastBotDetectionDetails = this.runDetectionRules(), this.fingerprint.fastBotDetection = Object.values(this.fingerprint.fastBotDetectionDetails).some((v) => v.detected), this.fingerprint.fsid = this.generateFingerprintScannerId(), n ? await this.encryptFingerprint(JSON.stringify(this.fingerprint)) : this.fingerprint;
1150
1165
  }
1151
1166
  }
1152
1167
  export {
@@ -1 +1 @@
1
- {"version":3,"file":"iframe.d.ts","sourceRoot":"","sources":["../../src/signals/iframe.ts"],"names":[],"mappings":"AAEA,wBAAgB,MAAM;;;;;;;EA+BrB"}
1
+ {"version":3,"file":"iframe.d.ts","sourceRoot":"","sources":["../../src/signals/iframe.ts"],"names":[],"mappings":"AAEA,wBAAgB,MAAM;;;;;;;EAuCrB"}
@@ -1 +1 @@
1
- {"version":3,"file":"worker.d.ts","sourceRoot":"","sources":["../../src/signals/worker.ts"],"names":[],"mappings":"AAEA,wBAAsB,MAAM,qBA0E3B"}
1
+ {"version":3,"file":"worker.d.ts","sourceRoot":"","sources":["../../src/signals/worker.ts"],"names":[],"mappings":"AAEA,wBAAsB,MAAM,qBAiG3B"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fpscanner",
3
- "version": "0.9.5-beta.0",
3
+ "version": "0.9.5-beta.1",
4
4
  "description": "A lightweight browser fingerprinting and bot detection library with encryption, obfuscation, and cross-context validation",
5
5
  "main": "dist/fpScanner.cjs.js",
6
6
  "module": "dist/fpScanner.es.js",
@@ -29,7 +29,9 @@
29
29
  "test:vitest": "vitest",
30
30
  "test:playwright": "npm run build:obfuscate && npx playwright test",
31
31
  "test:playwright:headed": "npm run build:obfuscate && npx playwright test --headed",
32
- "prepublishOnly": "node scripts/verify-publish.js"
32
+ "prepublishOnly": "node scripts/verify-publish.js",
33
+ "publish:beta": "node scripts/safe-publish.js beta",
34
+ "publish:stable": "node scripts/safe-publish.js stable"
33
35
  },
34
36
  "repository": {
35
37
  "type": "git",
@@ -0,0 +1,111 @@
1
+ #!/usr/bin/env node
2
+
3
+ const { execSync } = require('child_process');
4
+ const fs = require('fs');
5
+ const path = require('path');
6
+
7
+ const publishType = process.argv[2]; // 'beta' or 'stable'
8
+
9
+ if (!publishType || !['beta', 'stable'].includes(publishType)) {
10
+ console.error('โŒ Usage: npm run publish:beta or npm run publish:stable');
11
+ process.exit(1);
12
+ }
13
+
14
+ const ROOT_DIR = path.resolve(__dirname, '..');
15
+ const DIST_DIR = path.join(ROOT_DIR, 'dist');
16
+
17
+ function run(command, description) {
18
+ console.log(`\n๐Ÿ”„ ${description}...`);
19
+ try {
20
+ execSync(command, { cwd: ROOT_DIR, stdio: 'inherit' });
21
+ console.log(`โœ… ${description} - Done`);
22
+ } catch (error) {
23
+ console.error(`โŒ ${description} - Failed`);
24
+ process.exit(1);
25
+ }
26
+ }
27
+
28
+ function checkGitStatus() {
29
+ console.log('\n๐Ÿ” Checking git status...');
30
+ try {
31
+ const status = execSync('git status --porcelain', { cwd: ROOT_DIR, encoding: 'utf8' });
32
+ if (status.trim()) {
33
+ console.error('โŒ Git working directory is not clean. Please commit or stash changes first.');
34
+ console.error('\nUncommitted changes:');
35
+ console.error(status);
36
+ process.exit(1);
37
+ }
38
+ console.log('โœ… Git working directory is clean');
39
+ } catch (error) {
40
+ console.error('โŒ Failed to check git status');
41
+ process.exit(1);
42
+ }
43
+ }
44
+
45
+ function getPackageVersion() {
46
+ const packageJson = require(path.join(ROOT_DIR, 'package.json'));
47
+ return packageJson.version;
48
+ }
49
+
50
+ console.log('โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•');
51
+ console.log(`๐Ÿš€ Safe Publish Script - ${publishType.toUpperCase()}`);
52
+ console.log('โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•');
53
+
54
+ // Step 0: Check git status
55
+ checkGitStatus();
56
+
57
+ // Step 1: Clean dist directory
58
+ console.log('\n๐Ÿงน Cleaning dist directory...');
59
+ if (fs.existsSync(DIST_DIR)) {
60
+ fs.rmSync(DIST_DIR, { recursive: true, force: true });
61
+ console.log('โœ… Dist directory cleaned');
62
+ } else {
63
+ console.log('โœ… Dist directory already clean');
64
+ }
65
+
66
+ // Step 2: Build package with sentinel key (no key injection)
67
+ run('npm run build', 'Building package with sentinel key');
68
+
69
+ // Step 3: Verify build
70
+ run('node scripts/verify-publish.js', 'Verifying build integrity');
71
+
72
+ // Step 4: Get version and confirm
73
+ const version = getPackageVersion();
74
+ console.log(`\n๐Ÿ“ฆ Package version: ${version}`);
75
+
76
+ if (publishType === 'beta' && !version.includes('beta')) {
77
+ console.error(`โŒ Version ${version} is not a beta version. Use publish:stable instead.`);
78
+ process.exit(1);
79
+ }
80
+
81
+ if (publishType === 'stable' && version.includes('beta')) {
82
+ console.error(`โŒ Version ${version} is a beta version. Use publish:beta instead.`);
83
+ process.exit(1);
84
+ }
85
+
86
+ // Step 5: Publish
87
+ const publishTag = publishType === 'beta' ? '--tag beta' : '';
88
+ run(`npm publish ${publishTag}`, `Publishing to npm with ${publishType} tag`);
89
+
90
+ // Step 6: Create git tag
91
+ const gitTag = `v${version}`;
92
+ console.log(`\n๐Ÿท๏ธ Creating git tag: ${gitTag}...`);
93
+ try {
94
+ execSync(`git tag ${gitTag}`, { cwd: ROOT_DIR, stdio: 'inherit' });
95
+ console.log(`โœ… Git tag created: ${gitTag}`);
96
+
97
+ console.log('\n๐Ÿ’ก Don\'t forget to push the tag:');
98
+ console.log(` git push origin ${gitTag}`);
99
+ } catch (error) {
100
+ console.log(`โš ๏ธ Git tag might already exist: ${gitTag}`);
101
+ }
102
+
103
+ console.log('\nโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•');
104
+ console.log('โœ… PUBLISH SUCCESSFUL!');
105
+ console.log('โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•');
106
+ console.log(`\n๐Ÿ“ฆ Published: fpscanner@${version}`);
107
+ console.log(`๐Ÿท๏ธ Tag: ${publishType}`);
108
+ console.log('\n๐Ÿ“ Next steps:');
109
+ console.log(` 1. Push git tag: git push origin ${gitTag}`);
110
+ console.log(` 2. Test installation: npm install fpscanner@${publishType}`);
111
+ console.log('โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•\n');
@@ -10,11 +10,13 @@ export function iframe() {
10
10
  language: INIT,
11
11
  };
12
12
  const iframe = document.createElement('iframe');
13
+ let iframeAdded = false;
13
14
 
14
15
  try {
15
16
  iframe.style.display = 'none';
16
17
  iframe.src = 'about:blank';
17
18
  document.body.appendChild(iframe);
19
+ iframeAdded = true;
18
20
 
19
21
  const iframeWindowNavigator = (iframe.contentWindow?.navigator as any);
20
22
 
@@ -27,7 +29,13 @@ export function iframe() {
27
29
  } catch (e) {
28
30
  setObjectValues(iframeData, ERROR);
29
31
  } finally {
30
- document.body.removeChild(iframe);
32
+ if (iframeAdded) {
33
+ try {
34
+ document.body.removeChild(iframe);
35
+ } catch (_) {
36
+ // Ignore removal errors
37
+ }
38
+ }
31
39
  }
32
40
 
33
41
  return iframeData;
@@ -12,6 +12,16 @@ export async function worker() {
12
12
  cpuCount: INIT,
13
13
  };
14
14
 
15
+ let worker: Worker | null = null;
16
+ let workerUrl: string | null = null;
17
+ let timeoutId: number | null = null;
18
+
19
+ const cleanup = () => {
20
+ if (timeoutId) clearTimeout(timeoutId);
21
+ if (worker) worker.terminate();
22
+ if (workerUrl) URL.revokeObjectURL(workerUrl);
23
+ };
24
+
15
25
  try {
16
26
  const workerCode = `try {
17
27
  var fingerprintWorker = {};
@@ -47,8 +57,15 @@ export async function worker() {
47
57
 
48
58
 
49
59
  const blob = new Blob([workerCode], { type: 'application/javascript' });
50
- const workerUrl = URL.createObjectURL(blob);
51
- const worker = new Worker(workerUrl);
60
+ workerUrl = URL.createObjectURL(blob);
61
+ worker = new Worker(workerUrl);
62
+
63
+ // Set timeout to prevent infinite hang
64
+ timeoutId = window.setTimeout(() => {
65
+ cleanup();
66
+ setObjectValues(workerData, ERROR);
67
+ resolve(workerData);
68
+ }, 2000);
52
69
 
53
70
  worker.onmessage = function (e) {
54
71
  try {
@@ -59,17 +76,23 @@ export async function worker() {
59
76
  workerData.platform = e.data.platform;
60
77
  workerData.memory = e.data.memory;
61
78
  workerData.cpuCount = e.data.cpuCount;
62
-
63
- return resolve(workerData);
64
79
  } catch (_) {
65
80
  setObjectValues(workerData, ERROR);
66
- return resolve(workerData);
81
+ } finally {
82
+ cleanup();
83
+ resolve(workerData);
67
84
  }
68
- }
85
+ };
86
+
87
+ worker.onerror = function () {
88
+ cleanup();
89
+ setObjectValues(workerData, ERROR);
90
+ resolve(workerData);
91
+ };
69
92
  } catch (e) {
93
+ cleanup();
70
94
  setObjectValues(workerData, ERROR);
71
-
72
- return resolve(workerData);
95
+ resolve(workerData);
73
96
  }
74
97
 
75
98
  });