fingerprint-oss
Version:
A comprehensive JavaScript library for device fingerprinting and system information collection. Provides robust, deterministic fingerprinting for web applications with privacy-conscious design.
62 lines • 56.5 kB
JavaScript
"use strict";
/*!
* hash-wasm (https://www.npmjs.com/package/hash-wasm)
* (c) Dani Biro
* @license MIT
*/function e(e,n,i,t){return new(i||(i=Promise))((function(n,o){function a(e){try{r(t.next(e))}catch(e){o(e)}}function A(e){try{r(t.throw(e))}catch(e){o(e)}}function r(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(a,A)}r((t=t.apply(e,[])).next())}))}"function"==typeof SuppressedError&&SuppressedError;class n{constructor(){this.mutex=Promise.resolve()}lock(){let e=()=>{};return this.mutex=this.mutex.then((()=>new Promise(e))),new Promise((n=>{e=n}))}dispatch(n){return e(this,0,void 0,(function*(){const e=yield this.lock();try{return yield Promise.resolve(n())}finally{e()}}))}}var i;const t="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:"undefined"!=typeof window?window:global,o=null!==(i=t.Buffer)&&void 0!==i?i:null,a=t.TextEncoder?new t.TextEncoder:null;function A(e,n){return(15&e)+(e>>6|e>>3&8)<<4|(15&n)+(n>>6|n>>3&8)}const r="a".charCodeAt(0)-10,c="0".charCodeAt(0);function s(e,n,i){let t=0;for(let o=0;o<i;o++){let i=n[o]>>>4;e[t++]=i>9?i+r:i+c,i=15&n[o],e[t++]=i>9?i+r:i+c}return String.fromCharCode.apply(null,e)}const d=null!==o?e=>{if("string"==typeof e){const n=o.from(e,"utf8");return new Uint8Array(n.buffer,n.byteOffset,n.length)}if(o.isBuffer(e))return new Uint8Array(e.buffer,e.byteOffset,e.length);if(ArrayBuffer.isView(e))return new Uint8Array(e.buffer,e.byteOffset,e.byteLength);throw new Error("Invalid data type!")}:e=>{if("string"==typeof e)return a.encode(e);if(ArrayBuffer.isView(e))return new Uint8Array(e.buffer,e.byteOffset,e.byteLength);throw new Error("Invalid data type!")},g="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",I=new Uint8Array(256);for(let e=0;e<64;e++)I[g.charCodeAt(e)]=e;function u(e){const n=function(e){let n=Math.floor(.75*e.length);const i=e.length;return"="===e[i-1]&&(n-=1,"="===e[i-2]&&(n-=1)),n}(e),i=e.length,t=new Uint8Array(n);let o=0;for(let n=0;n<i;n+=4){const i=I[e.charCodeAt(n)],a=I[e.charCodeAt(n+1)],A=I[e.charCodeAt(n+2)],r=I[e.charCodeAt(n+3)];t[o]=i<<2|a>>4,o+=1,t[o]=(15&a)<<4|A>>2,o+=1,t[o]=(3&A)<<6|63&r,o+=1}return t}const l=16384,B=new n,E=new Map;function y(n,i){return e(this,0,void 0,(function*(){let t=null,o=null,a=!1;if("undefined"==typeof WebAssembly)throw new Error("WebAssembly is not supported in this environment!");const r=()=>new DataView(t.exports.memory.buffer).getUint32(t.exports.STATE_SIZE,!0),c=B.dispatch((()=>e(this,0,void 0,(function*(){if(!E.has(n.name)){const e=u(n.data),i=WebAssembly.compile(e);E.set(n.name,i)}const e=yield E.get(n.name);t=yield WebAssembly.instantiate(e,{})})))),g=(e=null)=>{a=!0,t.exports.Hash_Init(e)},I=e=>{if(!a)throw new Error("update() called before init()");(e=>{let n=0;for(;n<e.length;){const i=e.subarray(n,n+l);n+=i.length,o.set(i),t.exports.Hash_Update(i.length)}})(d(e))},y=new Uint8Array(2*i),Q=(e,n=null)=>{if(!a)throw new Error("digest() called before init()");return a=!1,t.exports.Hash_Final(n),"binary"===e?o.slice(0,i):s(y,o,i)},m=e=>"string"==typeof e?e.length<4096:e.byteLength<l;let f=m;switch(n.name){case"argon2":case"scrypt":f=()=>!0;break;case"blake2b":case"blake2s":f=(e,n)=>n<=512&&m(e);break;case"blake3":f=(e,n)=>0===n&&m(e);break;case"xxhash64":case"xxhash3":case"xxhash128":case"crc64":f=()=>!1}return yield(()=>e(this,0,void 0,(function*(){t||(yield c);const e=t.exports.Hash_GetBuffer(),n=t.exports.memory.buffer;o=new Uint8Array(n,e,l)})))(),{getMemory:()=>o,writeMemory:(e,n=0)=>{o.set(e,n)},getExports:()=>t.exports,setMemorySize:e=>{t.exports.Hash_SetMemorySize(e);const n=t.exports.Hash_GetBuffer(),i=t.exports.memory.buffer;o=new Uint8Array(i,n,e)},init:g,update:I,digest:Q,save:()=>{if(!a)throw new Error("save() can only be called after init() and before digest()");const e=t.exports.Hash_GetState(),i=r(),o=t.exports.memory.buffer,c=new Uint8Array(o,e,i),s=new Uint8Array(4+i);return function(e,n){const i=n.length>>1;for(let t=0;t<i;t++){const i=t<<1;e[t]=A(n.charCodeAt(i),n.charCodeAt(i+1))}}(s,n.hash),s.set(c,4),s},load:e=>{if(!(e instanceof Uint8Array))throw new Error("load() expects an Uint8Array generated by save()");const i=t.exports.Hash_GetState(),o=r(),c=4+o,s=t.exports.memory.buffer;if(e.length!==c)throw new Error(`Bad state length (expected ${c} bytes, got ${e.length})`);if(!function(e,n){if(e.length!==2*n.length)return!1;for(let i=0;i<n.length;i++){const t=i<<1;if(n[i]!==A(e.charCodeAt(t),e.charCodeAt(t+1)))return!1}return!0}(n.hash,e.subarray(0,4)))throw new Error("This state was written by an incompatible hash implementation");const d=e.subarray(4);new Uint8Array(s,i,o).set(d),a=!0},calculate:(e,n=null,a=null)=>{if(!f(e,n))return g(n),I(e),Q("hex",a);const A=d(e);return o.set(A),t.exports.Hash_Calculate(A.length,n,a),s(y,o,i)},hashLength:i}}))}new n,new n,new n,new n,new n,new n,new n,new n,new n,new n,new n;var Q={name:"sha256",data:"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c2pBx6KerX1qIhkgASADcyACcSABIANxcyABQR53IAFBE3dzIAFBCndzaiAaaiICaiIJIBMgEnNxIBJzaiAJQRp3IAlBFXdzIAlBB3dzakHRxqk2aiIaIAIgAXMgA3EgAiABcXMgAkEedyACQRN3cyACQQp3c2ogGGoiA2oiESAJIBNzcSATc2ogEUEadyARQRV3cyARQQd3c2pB59KkoQFqIhggAyACcyABcSADIAJxcyADQR53IANBE3dzIANBCndzaiAUaiIBaiISIBEgCXNxIAlzaiASQRp3IBJBFXdzIBJBB3dzakGFldy9AmoiFCABIANzIAJxIAEgA3FzIAFBHncgAUETd3MgAUEKd3NqIBdqIgJqIhMgI2ogJiASaiAiIBFqICUgCWogEyASIBFzcSARc2ogE0EadyATQRV3cyATQQd3c2pBuMLs8AJqIhcgAiABcyADcSACIAFxcyACQR53IAJBE3dzIAJBCndzaiAZaiIDaiIJIBMgEnNxIBJzaiAJQRp3IAlBFXdzIAlBB3dzakH827HpBGoiGSADIAJzIAFxIAMgAnFzIANBHncgA0ETd3MgA0EKd3NqIBpqIgFqIhEgCSATc3EgE3NqIBFBGncgEUEVd3MgEUEHd3NqQZOa4JkFaiIaIAEgA3MgAnEgASADcXMgAUEedyABQRN3cyABQQp3c2ogGGoiAmoiEiARIAlzcSAJc2ogEkEadyASQRV3cyASQQd3c2pB1OapqAZqIhggAiABcyADcSACIAFxcyACQR53IAJBE3dzIAJBCndzaiAUaiIDaiITaiAoIBJqICQgEWogJyAJaiATIBIgEXNxIBFzaiATQRp3IBNBFXdzIBNBB3dzakG7laizB2oiFCADIAJzIAFxIAMgAnFzIANBHncgA0ETd3MgA0EKd3NqIBdqIgFqIgkgEyASc3EgEnNqIAlBGncgCUEVd3MgCUEHd3NqQa6Si454aiIXIAEgA3MgAnEgASADcXMgAUEedyABQRN3cyABQQp3c2ogGWoiAmoiESAJIBNzcSATc2ogEUEadyARQRV3cyARQQd3c2pBhdnIk3lqIhkgAiABcyADcSACIAFxcyACQR53IAJBE3dzIAJBCndzaiAaaiIDaiISIBEgCXNxIAlzaiASQRp3IBJBFXdzIBJBB3dzakGh0f+VemoiGiADIAJz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",hash:"8c18dd94"};new n;const m=new n;let f=null;function h(n){if(null===f)return function(n,i,t){return e(this,0,void 0,(function*(){const e=yield n.lock(),o=yield y(i,t);return e(),o}))}(m,Q,32).then((e=>(f=e,f.calculate(n,256))));try{const e=f.calculate(n,256);return Promise.resolve(e)}catch(e){return Promise.reject(e)}}
/*!
* Copyright (c) 2025 Akshat Kotpalliwar (alias IntegerAlex on GitHub)
* This software is licensed under the GNU Lesser General Public License (LGPL) v3 or later.
*
* You are free to use, modify, and redistribute this software, but modifications must also be licensed under the LGPL.
* This project is distributed without any warranty; see the LGPL for more details.
*
* For a full copy of the LGPL and ethical contribution guidelines, please refer to the `COPYRIGHT.md` and `NOTICE.md` files.
*/
function p(e,n){const i=Math.pow(10,n);return(Math.round(e*i)/i).toFixed(n)}async function C(e){const n=w({userAgent:e.userAgent??"ua_unavailable",platform:e.platform??"platform_unavailable",screenResolution:e.screenResolution??[0,0],colorDepth:e.colorDepth??0,colorGamut:e.colorGamut??"gamut_unavailable",os:e.os??{os:"os_unavailable",version:"version_unavailable"},webGLImageHash:e.webGL?.imageHash??"webgl_hash_unavailable",detectedFontsString:e.fontPreferences?.detectedFonts&&e.fontPreferences.detectedFonts.length>0?e.fontPreferences.detectedFonts.slice().sort().join(","):"no_fonts_detected",canvasFingerprint:e.canvas?.geometry??"canvas_geo_unavailable",audioFingerprint:null!==e.audio&&void 0!==e.audio?e.audio:"audio_fp_unavailable",mathConstants:e.mathConstants?Object.fromEntries(Object.entries(e.mathConstants).map((([e,n])=>[e,p(Number(n),3)]))):{},plugins:e.plugins?e.plugins.filter((e=>e&&e.name&&!e.name.includes("Brave"))).map((e=>({name:e.name?.replace(/\s+/g," ").trim()||"",types:e.mimeTypes?.map((e=>e.type))||[]}))):[]}),i=JSON.stringify(n,N);return await h(i)}function N(e,n){return n instanceof ArrayBuffer?"":"number"==typeof n?p(n,3):"string"==typeof n?n.replace(/\s+/g," ").trim():n}function w(e){return Array.isArray(e)?e.map(w).sort(((e,n)=>{const i=JSON.stringify(e),t=JSON.stringify(n);return i.localeCompare(t)})):e&&"object"==typeof e&&null!==e?Object.keys(e).sort().reduce(((n,i)=>(n[i]=w(e[i]),n)),{}):e}
/*!
* Copyright (c) 2025 Akshat Kotpalliwar (alias IntegerAlex on GitHub)
* This software is licensed under the GNU Lesser General Public License (LGPL) v3 or later.
*
* You are free to use, modify, and redistribute this software, but modifications must also be licensed under the LGPL.
* This project is distributed without any warranty; see the LGPL for more details.
*
* For a full copy of the LGPL and ethical contribution guidelines, please refer to the `COPYRIGHT.md` and `NOTICE.md` files.
*/new n,new n,new n,new n,new n,new n,new n,new n,new n;const S={"Asia/Calcutta":"Asia/Kolkata","Asia/Culcutta":"Asia/Kolkata","Asia/Saigon":"Asia/Ho_Chi_Minh","Asia/Rangoon":"Asia/Yangon","Asia/Istanbul":"Europe/Istanbul","Asia/Chongqing":"Asia/Shanghai","Asia/Harbin":"Asia/Shanghai","Asia/Urumqi":"Asia/Shanghai","Asia/Kashgar":"Asia/Shanghai","Asia/Thimbu":"Asia/Thimphu","Asia/Ashkhabad":"Asia/Ashgabat","Asia/Kathmandu":"Asia/Kathmandu","Asia/Dacca":"Asia/Dhaka","Asia/Dili":"Asia/Dili","Asia/Dubai":"Asia/Dubai","Asia/Kuala_Lumpur":"Asia/Kuala_Lumpur","Asia/Jakarta":"Asia/Jakarta","Asia/Kolkata":"Asia/Kolkata","Asia/Dhaka":"Asia/Dhaka","Asia/Tbilisi":"Asia/Tbilisi","Asia/Tehran":"Asia/Tehran","Asia/Kabul":"Asia/Kabul","Europe/Kiev":"Europe/Kyiv","W-SU":"Europe/Moscow",GB:"Europe/London","GB-Eire":"Europe/London",Eire:"Europe/Dublin","Europe/Minsk":"Europe/Minsk","Europe/Bucharest":"Europe/Bucharest","Europe/Budapest":"Europe/Budapest","Europe/Prague":"Europe/Prague","Europe/Vienna":"Europe/Vienna","Europe/Berlin":"Europe/Berlin","Europe/Zurich":"Europe/Zurich","Europe/Paris":"Europe/Paris","Europe/Lisbon":"Europe/Lisbon","Europe/Madrid":"Europe/Madrid","Europe/Rome":"Europe/Rome","Europe/Athens":"Europe/Athens","Europe/Istanbul":"Europe/Istanbul","US/Pacific":"America/Los_Angeles","US/Eastern":"America/New_York","US/Mountain":"America/Denver","US/Central":"America/Chicago","US/Hawaii":"Pacific/Honolulu","US/Alaska":"America/Anchorage","Canada/Eastern":"America/Toronto","Canada/Central":"America/Winnipeg","Canada/Mountain":"America/Edmonton","Canada/Pacific":"America/Vancouver","America/Porto_Acre":"America/Rio_Branco","America/Argentina/Buenos_Aires":"America/Argentina/Buenos_Aires","America/Sao_Paulo":"America/Sao_Paulo","America/Mexico_City":"America/Mexico_City","America/Bogota":"America/Bogota","America/Lima":"America/Lima","America/Santiago":"America/Santiago","America/Caracas":"America/Caracas","America/Havana":"America/Havana","America/Toronto":"America/Toronto","Australia/NSW":"Australia/Sydney","Australia/Victoria":"Australia/Melbourne","Australia/Queensland":"Australia/Brisbane","Australia/Tasmania":"Australia/Hobart","Australia/ACT":"Australia/Canberra","Australia/North":"Australia/Darwin","Australia/West":"Australia/Perth","Australia/South":"Australia/Adelaide","Africa/Asmera":"Africa/Asmara","Africa/Timbuktu":"Africa/Bamako","Africa/Cairo":"Africa/Cairo","Africa/Casablanca":"Africa/Casablanca","Africa/Johannesburg":"Africa/Johannesburg","Africa/Nairobi":"Africa/Nairobi","Africa/Lagos":"Africa/Lagos","Africa/Abidjan":"Africa/Abidjan","Africa/Algiers":"Africa/Algiers","Africa/Tunis":"Africa/Tunis","Africa/Maputo":"Africa/Maputo","Pacific/Ponape":"Pacific/Pohnpei","Pacific/Truk":"Pacific/Chuuk","Pacific/Yap":"Pacific/Chuuk","Pacific/Auckland":"Pacific/Auckland","Pacific/Fiji":"Pacific/Fiji","Pacific/Tahiti":"Pacific/Tahiti","Pacific/Guam":"Pacific/Guam","Pacific/Honolulu":"Pacific/Honolulu","Pacific/Marquesas":"Pacific/Marquesas","Asia/Tel_Aviv":"Asia/Jerusalem","Asia/Beirut":"Asia/Beirut","Asia/Damascus":"Asia/Damascus","Asia/Jerusalem":"Asia/Jerusalem","America/Coral_Harbour":"America/Atikokan","US/Arizona":"America/Phoenix","US/Samoa":"Pacific/Samoa","US/Indiana-Starke":"America/Chicago","US/Indiana-Vevay":"America/New_York","US/Indiana-Tell City":"America/Indiana/Tell_City","US/Indiana-Knox":"America/Indiana/Knox",CET:"Europe/Berlin",CEST:"Europe/Berlin",MET:"Europe/Paris",MEST:"Europe/Paris",JST:"Asia/Tokyo",KST:"Asia/Seoul",IST:"Asia/Kolkata",AEST:"Australia/Brisbane",AWST:"Australia/Perth",CAT:"Africa/Nairobi",SAST:"Africa/Johannesburg",NZDT:"Pacific/Auckland",NZST:"Pacific/Auckland",PST:"America/Los_Angeles",PDT:"America/Los_Angeles",GMT:"Etc/GMT",UTC:"Etc/UTC","GMT+1":"Europe/Berlin","GMT+2":"Europe/Athens","GMT+3":"Europe/Moscow"};
/*!
* Copyright (c) 2025 Akshat Kotpalliwar (alias IntegerAlex on GitHub)
* This software is licensed under the GNU Lesser General Public License (LGPL) v3 or later.
*
* You are free to use, modify, and redistribute this software, but modifications must also be licensed under the LGPL.
* This project is distributed without any warranty; see the LGPL for more details.
*
* For a full copy of the LGPL and ethical contribution guidelines, please refer to the `COPYRIGHT.md` and `NOTICE.md` files.
*/function D(e){if(!e)return e;const n=e.trim();return S[n]||n}async function M(e){if(!e||!e.geoip||!e.localtime)return{vpn:{status:!1,probability:.5}};if("unknown"===e.geoip||"unknown"===e.localtime)return{vpn:{status:!1,probability:.5}};const n=D(e.geoip);return D(e.localtime)!==n?{vpn:{status:!0,probability:.75}}:{vpn:{status:!1,probability:.2}}}function x(e){return e>=.8?{rating:"High Confidence",description:"The data appears to be from a genuine user with consistent information across all signals.",reliability:"Data is highly reliable for most purposes including fraud detection and analytics.",level:"high"}:e>=.65?{rating:"Medium-High Confidence",description:"The data appears mostly consistent with some minor discrepancies.",reliability:"Data is generally reliable but may have some inconsistencies worth investigating.",level:"medium-high"}:e>=.5?{rating:"Medium Confidence",description:"The data shows a moderate level of consistency, but with some concerning signals.",reliability:"Data should be treated with caution and verified through additional means.",level:"medium"}:e>=.35?{rating:"Medium-Low Confidence",description:"The data shows significant inconsistencies that suggest possible fraud or spoofing.",reliability:"Data reliability is questionable and should not be trusted without verification.",level:"medium-low"}:{rating:"Low Confidence",description:"The data exhibits strong signals of automation, spoofing, or intentional manipulation.",reliability:"Data is highly unreliable and shows strong indications of non-human origin.",level:"low"}}async function k(e,n,i){const t=x(n.confidenceScore),o=i?x(i):{rating:"",description:"",reliability:"",level:"medium"},a=e?.traits?.isAnonymousProxy||!1,A=e?.traits?.isAnonymousVpn||!1,r=e?.traits?.isHostingProvider||!1,c=e?.traits?.isTorExitNode||!1,s=e?await M({geoip:e.location?.timeZone||"UTC",localtime:n?.timezone||"UTC"}):void 0;return{confidenceAssessment:{system:{score:n.confidenceScore,...t,factors:n?.bot?.isBot?`Bot signals detected: ${n.bot.signals?.join(", ")||"unknown signals"}`:"No bot signals detected"},...i?{combined:{score:i,...o,factors:[a?"Proxy detected":null,c?"Tor exit node detected":null,r?"Hosting provider detected":null,A?"VPN detected":null].filter(Boolean).join(", ")||"No suspicious network factors detected"}}:{}},geolocation:e?{vpnStatus:s,ip:e.ipAddress||"unknown",city:e.city?.name||"unknown",region:e.subdivisions?.[0]||{isoCode:"",name:""},country:e.country||{isoCode:"",name:""},continent:e.continent||{code:"",name:""},location:e.location||{accuracyRadius:0,latitude:0,longitude:0,timeZone:"UTC"},traits:{isAnonymous:e.traits?.isAnonymous||!1,isAnonymousProxy:e.traits?.isAnonymousProxy||!1,isAnonymousVpn:e.traits?.isAnonymousVpn||!1,network:e.traits?.network||"unknown"}}:null,systemInfo:n,hash:await C(n)}}
/*!
* Copyright (c) 2025 Akshat Kotpalliwar (alias IntegerAlex on GitHub)
* This software is licensed under the GNU Lesser General Public License (LGPL) v3 or later.
*
* You are free to use, modify, and redistribute this software, but modifications must also be licensed under the LGPL.
* This project is distributed without any warranty; see the LGPL for more details.
*
* For a full copy of the LGPL and ethical contribution guidelines, please refer to the `COPYRIGHT.md` and `NOTICE.md` files.
*/async function b(){try{const e=await fetch("https://fingerprint-proxy.gossorg.in/",{method:"GET"});if(!e.ok)return console.warn(`Geolocation API request failed: ${e.statusText}, using mock data`),{ipAddress:"192.168.1.1",country:{isoCode:"US",name:"United States"},registeredCountry:{isoCode:"US",name:"United States",isInEuropeanUnion:!1},city:{name:"New York",geonameId:123456},continent:{code:"NA",name:"North America"},subdivisions:[{isoCode:"NY",name:"New York"}],location:{accuracyRadius:100,latitude:40.7128,longitude:-74.006,timeZone:"America/New_York"},postal:{code:"10001"},traits:{isAnonymous:!1,isAnonymousProxy:!1,isAnonymousVpn:!1,isAnycast:!1,isHostingProvider:!1,isLegitimateProxy:!1,isPublicProxy:!1,isResidentialProxy:!1,isSatelliteProvider:!1,isTorExitNode:!1,ipAddress:"192.168.1.1",network:"192.168.1.0/24"}};const n=await e.json();if(!n||"object"!=typeof n)return console.warn("Invalid API response, using mock data"),{ipAddress:"192.168.1.1",country:{isoCode:"US",name:"United States"},registeredCountry:{isoCode:"US",name:"United States",isInEuropeanUnion:!1},city:{name:"New York",geonameId:123456},continent:{code:"NA",name:"North America"},subdivisions:[{isoCode:"NY",name:"New York"}],location:{accuracyRadius:100,latitude:40.7128,longitude:-74.006,timeZone:"America/New_York"},postal:{code:"10001"},traits:{isAnonymous:!1,isAnonymousProxy:!1,isAnonymousVpn:!1,isAnycast:!1,isHostingProvider:!1,isLegitimateProxy:!1,isPublicProxy:!1,isResidentialProxy:!1,isSatelliteProvider:!1,isTorExitNode:!1,ipAddress:"192.168.1.1",network:"192.168.1.0/24"}};const i=n.traits?.ipAddress||n.ipAddress||"192.168.1.1";return{ipAddress:i,country:n.country||{isoCode:"US",name:"United States"},registeredCountry:n.registeredCountry||{isoCode:"US",name:"United States",isInEuropeanUnion:!1},city:n.city||{name:"New York",geonameId:123456},continent:n.continent||{code:"NA",name:"North America"},subdivisions:n.subdivisions||[{isoCode:"NY",name:"New York"}],location:n.location||{accuracyRadius:100,latitude:40.7128,longitude:-74.006,timeZone:"America/New_York"},postal:n.postal||{code:"10001"},traits:n.traits||{isAnonymous:!1,isAnonymousProxy:!1,isAnonymousVpn:!1,isAnycast:!1,isHostingProvider:!1,isLegitimateProxy:!1,isPublicProxy:!1,isResidentialProxy:!1,isSatelliteProvider:!1,isTorExitNode:!1,ipAddress:i,network:"192.168.1.0/24"}}}catch(e){return console.warn("Error fetching geolocation information:",e,"- using mock data"),{ipAddress:"192.168.1.1",country:{isoCode:"US",name:"United States"},registeredCountry:{isoCode:"US",name:"United States",isInEuropeanUnion:!1},city:{name:"New York",geonameId:123456},continent:{code:"NA",name:"North America"},subdivisions:[{isoCode:"NY",name:"New York"}],location:{accuracyRadius:100,latitude:40.7128,longitude:-74.006,timeZone:"America/New_York"},postal:{code:"10001"},traits:{isAnonymous:!1,isAnonymousProxy:!1,isAnonymousVpn:!1,isAnycast:!1,isHostingProvider:!1,isLegitimateProxy:!1,isPublicProxy:!1,isResidentialProxy:!1,isSatelliteProvider:!1,isTorExitNode:!1,ipAddress:"192.168.1.1",network:"192.168.1.0/24"}}}}async function F(){return new Promise(((e,n)=>{let i="Unknown";function t(n){e({isPrivate:n,browserName:i})}function o(){let e=0,n=parseInt("-1");try{n.toFixed(n)}catch(n){e=n.message.length}return e}function a(){return"undefined"!=typeof navigator&&(void 0!==navigator.msSaveBlob&&function(e){try{return e===eval.toString().length}catch(e){return!1}}(39))}async function A(){"undefined"!=typeof navigator?void 0!==navigator.storage?.getDirectory?await async function(){if("undefined"!=typeof navigator&&navigator.storage?.getDirectory)try{await navigator.storage.getDirectory(),t(!1)}catch(e){let n=e;if(e instanceof Error&&(n=e.message??e),"string"!=typeof n)return void t(!1);t(!!n.includes("unknown transient reason"))}else t(!1)}():void 0!==navigator.maxTouchPoints?function(){if("undefined"==typeof indexedDB)return void t(!1);const e=String(Math.random());try{const n=indexedDB.open(e,1);n.onupgradeneeded=n=>{const i=n.target.result,o=e=>{t(e)};try{i.createObjectStore("t",{autoIncrement:!0}).put(new Blob),o(!1)}catch(e){(e.message||"").includes("are not yet supported")?o(!0):o(!1)}finally{i.close(),indexedDB.deleteDatabase(e)}},n.onerror=()=>t(!1)}catch{t(!1)}}():function(){if("undefined"==typeof window)return void t(!1);const e=window.openDatabase,n=window.localStorage;try{e(null,null,null,null)}catch(e){return void t(!0)}try{n.setItem("test","1"),n.removeItem("test")}catch(e){return void t(!0)}t(!1)}():t(!1)}function r(){"undefined"!=typeof navigator&&navigator.webkitTemporaryStorage&&"function"==typeof navigator.webkitTemporaryStorage.queryUsageAndQuota?navigator.webkitTemporaryStorage.queryUsageAndQuota((function(e,n){t(Math.round(n/1048576)<2*Math.round(function(){if("undefined"==typeof window||"undefined"==typeof performance)return 1073741824;const e=window;return void 0!==e.performance&&void 0!==e.performance.memory&&void 0!==e.performance.memory.jsHeapSizeLimit?performance.memory.jsHeapSizeLimit:1073741824}()/1048576))}),(function(e){console.warn("detectIncognito failed to query storage quota:",e.message,"- defaulting to not private"),t(!1)})):t(!1)}function c(){"undefined"!=typeof self&&"undefined"!=typeof Promise?void 0!==self.Promise&&void 0!==self.Promise.allSettled?r():function(){if("undefined"==typeof window||!window.webkitRequestFileSystem)return void t(!1);(0,window.webkitRequestFileSystem)(0,1,(function(){t(!1)}),(function(){t(!0)}))}():t(!1)}"undefined"!=typeof window&&"undefined"!=typeof navigator?async function(){"undefined"!=typeof window&&"undefined"!=typeof navigator?44===o()?(i="Safari",await A()):51===o()?(i=function(){if("undefined"==typeof navigator)return"Unknown";const e=navigator.userAgent;return e.match(/Chrome/)?void 0!==navigator.brave?"Brave":e.match(/Edg/)?"Edge":e.match(/OPR/)?"Opera":"Chrome":"Chromium"}(),c()):25===o()?(i="Firefox","undefined"!=typeof navigator?t(void 0===navigator.serviceWorker):t(!1)):a()?(i="Internet Explorer","undefined"!=typeof window?t(void 0===window.indexedDB):t(!1)):(console.warn("detectIncognito cannot determine the browser, defaulting to not private"),t(!1)):t(!1)}().catch(n):e({isPrivate:!1,browserName:"Unknown"})}))}
/*!
* Copyright (c) 2025 Akshat Kotpalliwar (alias IntegerAlex on GitHub)
* This software is licensed under the GNU Lesser General Public License (LGPL) v3 or later.
*
* You are free to use, modify, and redistribute this software, but modifications must also be licensed under the LGPL.
* This project is distributed without any warranty; see the LGPL for more details.
*
* For a full copy of the LGPL and ethical contribution guidelines, please refer to the `COPYRIGHT.md` and `NOTICE.md` files.
*/
function v(){return"undefined"!=typeof window&&window.matchMedia?window.matchMedia("(color-gamut: rec2020)").matches?"rec2020":window.matchMedia("(color-gamut: p3)").matches?"p3":window.matchMedia("(color-gamut: srgb)").matches?"srgb":"unknown":"unknown"}async function R(){try{if("undefined"==typeof window||!window.AudioContext&&!window.webkitAudioContext)return null;const e=new(window.AudioContext||window.webkitAudioContext),n=e.createOscillator(),i=e.createAnalyser(),t=e.createGain(),o=e.createScriptProcessor(4096,1,1);t.gain.value=0,n.type="triangle",n.connect(i),i.connect(o),o.connect(t),t.connect(e.destination),n.start(0);const a=new Float32Array(i.frequencyBinCount);return i.getFloatFrequencyData(a),n.stop(),await e.close(),a.reduce(((e,n)=>e+n),0)}catch(e){return console.warn("Error getting audio fingerprint:",e),null}}function q(){const e=[];return navigator.userAgent.includes("Chrome")&&e.push("chrome"),navigator.userAgent.includes("Firefox")&&e.push("firefox"),navigator.userAgent.includes("Safari")&&!navigator.userAgent.includes("Chrome")&&e.push("safari"),e}function z(){try{return!("undefined"==typeof window||!window.localStorage)&&(localStorage.setItem("test","test"),localStorage.removeItem("test"),!0)}catch{return!1}}function U(){try{return!("undefined"==typeof window||!window.sessionStorage)&&(sessionStorage.setItem("test","test"),sessionStorage.removeItem("test"),!0)}catch{return!1}}function G(){return"undefined"!=typeof window&&!!window.indexedDB}async function T(){let e="unknown",n="unknown",i=null;try{if("undefined"==typeof document||!document.createElement)return{vendor:e,renderer:n,imageHash:"dom_unavailable"};const t=document.createElement("canvas");t.width=64,t.height=64;const o=t.getContext("webgl")||t.getContext("experimental-webgl");if(!o)return{vendor:e,renderer:n,imageHash:"webgl_context_unavailable"};try{const i=o.getExtension("WEBGL_debug_renderer_info");i?(e=o.getParameter(i.UNMASKED_VENDOR_WEBGL)||e,n=o.getParameter(i.UNMASKED_RENDERER_WEBGL)||n):(e=o.getParameter(o.VENDOR)||e,n=o.getParameter(o.RENDERER)||n)}catch(e){console.warn("Error getting WebGL vendor/renderer strings:",e)}try{const a="\n attribute vec2 a_position;\n attribute vec3 a_color;\n varying vec3 v_color;\n void main() {\n gl_Position = vec4(a_position, 0.0, 1.0);\n v_color = a_color;\n }\n ",A="\n precision mediump float;\n varying vec3 v_color;\n void main() {\n gl_FragColor = vec4(v_color, 1.0);\n }\n ",r=o.createShader(o.VERTEX_SHADER);if(!r)return console.warn("Failed to create vertex shader"),i="shader_creation_error",{vendor:e,renderer:n,imageHash:i};o.shaderSource(r,a),o.compileShader(r);const c=o.createShader(o.FRAGMENT_SHADER);if(!c)return console.warn("Failed to create fragment shader"),i="shader_creation_error",{vendor:e,renderer:n,imageHash:i};o.shaderSource(c,A),o.compileShader(c);const s=o.createProgram();if(!s)return console.warn("Failed to create program"),i="program_creation_error",{vendor:e,renderer:n,imageHash:i};o.attachShader(s,r),o.attachShader(s,c),o.linkProgram(s),o.useProgram(s);const d=new Float32Array([-.9,-.9,1,0,0,.9,-.9,0,1,0,-.9,.9,0,0,1,.9,-.9,0,1,0,.9,.9,1,1,0,-.9,.9,0,0,1]),g=o.createBuffer();o.bindBuffer(o.ARRAY_BUFFER,g),o.bufferData(o.ARRAY_BUFFER,d,o.STATIC_DRAW);const I=o.getAttribLocation(s,"a_position");o.enableVertexAttribArray(I),o.vertexAttribPointer(I,2,o.FLOAT,!1,5*Float32Array.BYTES_PER_ELEMENT,0);const u=o.getAttribLocation(s,"a_color");o.enableVertexAttribArray(u),o.vertexAttribPointer(u,3,o.FLOAT,!1,5*Float32Array.BYTES_PER_ELEMENT,2*Float32Array.BYTES_PER_ELEMENT),o.clearColor(.5,.5,.5,1),o.clear(o.COLOR_BUFFER_BIT),o.drawArrays(o.TRIANGLES,0,6);const l=new Uint8Array(t.width*t.height*4);o.readPixels(0,0,t.width,t.height,o.RGBA,o.UNSIGNED_BYTE,l);const B=Array.from(l).join(",");i=await h(B)}catch(e){console.warn("Error rendering WebGL scene for hash:",e),i="webgl_render_error"}return{vendor:e,renderer:n,imageHash:i}}catch(e){return console.error("Error retrieving WebGL information:",e),{vendor:"unknown",renderer:"unknown",imageHash:"webgl_overall_error"}}}function J(){try{if("undefined"==typeof document||!document.createElement)return{winding:!1,geometry:"",text:""};const e=document.createElement("canvas");e.width=200,e.height=50;const n=e.getContext("2d");return n?(n.textBaseline="top",n.font="14px Arial",n.textBaseline="alphabetic",n.fillStyle="#f60",n.fillRect(125,1,62,20),n.fillStyle="#069",n.fillText("Fingerprint",2,15),n.fillStyle="rgba(102, 204, 0, 0.7)",n.fillText("Test",4,17),{winding:n.isPointInPath(0,0,"evenodd")!==n.isPointInPath(0,0,"nonzero"),geometry:e.toDataURL(),text:n.font}):{winding:!1,geometry:"",text:""}}catch{return{winding:!1,geometry:"",text:""}}}function H(){if("undefined"==typeof navigator||!navigator.plugins)return console.warn("Navigator plugins not available"),[];try{return Array.from(navigator.plugins).map((e=>{if(!e)return null;const n=[];try{for(const i in e){const t=e[i];t&&"object"==typeof t&&t.type&&t.suffixes&&n.push({type:t.type||"",suffixes:t.suffixes||""})}}catch(n){console.warn("Error enumerating mime types for plugin:",e.name,n)}return{name:e.name||"",description:e.description||"",mimeTypes:n}})).filter(Boolean)}catch(e){return console.error("Error getting plugins:",e),[]}}function P(){return{acos:Math.acos(.123456789),acosh:Math.acosh(1.123456789),asinh:Math.asinh(.123456789),atanh:Math.atanh(.123456789),expm1:Math.expm1(.123456789),sinh:Math.sinh(.123456789),cosh:Math.cosh(.123456789),tanh:Math.tanh(.123456789)}}function X(){const e=["Arial","Arial Black","Calibri","Cambria","Candara","Comic Sans MS","Consolas","Constantia","Corbel","Courier New","Ebrima","Franklin Gothic Medium","Gabriola","Gadugi","Georgia","Impact","Javanese Text","Leelawadee UI","Lucida Console","Lucida Sans Unicode","Malgun Gothic","Marlett","Microsoft Himalaya","Microsoft JhengHei","Microsoft New Tai Lue","Microsoft PhagsPa","Microsoft Sans Serif","Microsoft Tai Le","Microsoft YaHei","Microsoft Yi Baiti","MingLiU-ExtB","Mongolian Baiti","MS Gothic","MV Boli","Myanmar Text","Nirmala UI","Palatino Linotype","Segoe Print","Segoe Script","Segoe UI","Segoe UI Historic","Segoe UI Emoji","Segoe UI Symbol","SimSun","Sitka","Sylfaen","Symbol","Tahoma","Times New Roman","Trebuchet MS","Verdana","Webdings","Wingdings","Yu Gothic","American Typewriter","Andale Mono","Apple Chancery","AppleGothic","AppleMyungjo","Baskerville","Big Caslon","Bodoni 72","Bradley Hand","Brush Script MT","Chalkboard","Chalkduster","Charter","Cochin","Copperplate","Courier","Didot","Futura","Geneva","Gill Sans","Helvetica","Helvetica Neue","Herculanum","Hoefler Text","Lucida Grande","Marker Felt","Menlo","Monaco","Noteworthy","Optima","Palatino","Papyrus","Rockwell","Savoye LET","Skia","Snell Roundhand","Thonburi","Trattatello","Zapfino","DejaVu Sans","DejaVu Serif","DejaVu Sans Mono","Liberation Sans","Liberation Serif","Liberation Mono","Noto Sans","Noto Serif","Noto Mono","Roboto","Open Sans","Ubuntu","Cantarell","Droid Sans","Source Sans Pro","Century Gothic","Garamond"],n="abcdefghijklmnopqrstuvwxyz0123456789",i="72px",t=[];try{if("undefined"==typeof document||!document.createElement)return{detectedFonts:[]};const o=document.createElement("canvas").getContext("2d");if(!o)return{detectedFonts:[]};o.font=`${i} sans-serif`;const a=o.measureText(n).width,A=o.measureText(n).actualBoundingBoxAscent+o.measureText(n).actualBoundingBoxDescent;o.font=`${i} serif`;const r=o.measureText(n).width,c=o.measureText(n).actualBoundingBoxAscent+o.measureText(n).actualBoundingBoxDescent;o.font=`${i} monospace`;const s=o.measureText(n).width,d=o.measureText(n).actualBoundingBoxAscent+o.measureText(n).actualBoundingBoxDescent;for(const g of e){o.font=`${i} "${g}", sans-serif`;const e=o.measureText(n).width,I=o.measureText(n).actualBoundingBoxAscent+o.measureText(n).actualBoundingBoxDescent;if(e!==a||I!==A){t.push(g);continue}o.font=`${i} "${g}", serif`;const u=o.measureText(n).width,l=o.measureText(n).actualBoundingBoxAscent+o.measureText(n).actualBoundingBoxDescent;if(u!==r||l!==c){t.push(g);continue}o.font=`${i} "${g}", monospace`;const B=o.measureText(n).width,E=o.measureText(n).actualBoundingBoxAscent+o.measureText(n).actualBoundingBoxDescent;B===s&&E===d||t.push(g)}return{detectedFonts:Array.from(new Set(t)).sort()}}catch(e){return console.warn("Error detecting font preferences:",e),{detectedFonts:[]}}}function L(){return{maxTouchPoints:navigator.maxTouchPoints||0,touchEvent:"ontouchstart"in window,touchStart:"ontouchstart"in window}}function K(){if("undefined"==typeof navigator)return{platform:"unknown",os:"unknown",version:"unknown"};const e=navigator.platform||"unknown",n=navigator.userAgent||"unknown";let i="unknown",t="unknown";try{if(/Windows NT/.test(n)){i="Windows";const e=n.match(/Windows NT ([\d.]+)/);if(e&&e[1]){const i={"10.0":"10/11",6.3:"8.1",6.2:"8",6.1:"7","6.0":"Vista",5.2:"Server 2003",5.1:"XP","5.0":"2000"};t="10.0"===e[1]&&/(Windows 11|WOW64|Win64|x64)/.test(n)?"11":"10.0"===e[1]?"10":i[e[1]]||e[1]}}else if(/Mac OS X/.test(n)){i="macOS";const e=n.match(/Mac OS X ([\d_]+)/);e&&e[1]&&(t=e[1].replace(/_/g,"."))}else if(/Android/.test(n)){i="Android";const e=n.match(/Android ([\d.]+)/);e&&e[1]&&(t=e[1])}else if(/iPhone|iPad|iPod|CPU(?: iPhone)? OS|MacOS/.test(n)){i="iOS";const e=n.match(/OS ([\d_]+)/);e&&e[1]&&(t=e[1].replace(/_/g,"."))}else/Linux/.test(e)||/Linux/.test(n)?(i="Linux",t=/Ubuntu/.test(n)?"Ubuntu":/Fedora/.test(n)?"Fedora":/Debian/.test(n)?"Debian":/Arch/.test(n)?"Arch":/Manjaro/.test(n)?"Manjaro":/openSUSE/.test(n)?"openSUSE":/Mint/.test(n)?"Linux Mint":"generic"):/BSD/.test(n)||/SunOS/.test(n)?(i="Unix-like",t="generic"):i=e}catch(e){console.error("Error parsing OS info:",e)}return{os:i,version:t}}async function Y(){const e=navigator.hardwareConcurrency||4;if("undefined"==typeof Worker)return Math.min(e,12);const n=new Blob(["\n self.onmessage = (e) => {\n const start = performance.now();\n let result = 0;\n for (let i = 0; i < 30000000; i++) {\n result += Math.sin(i) * Math.log(i + 1) / (i % 23 + 1);\n if (i % 1e5 === 0) self.postMessage({ progress: i });\n }\n const duration = performance.now() - start;\n self.postMessage({\n duration: duration,\n noise: performance.timeOrigin % 1 + Math.random()\n });\n };\n "],{type:"application/javascript"}),i=URL.createObjectURL(n),t=[];try{const n=(async()=>{const n=Math.min(2*e,16),o=Array.from({length:n},(async()=>{const e=new Worker(i);return t.push(e),new Promise((n=>{e.onmessage=e=>{e.data?.duration&&n(e.data.duration)},e.postMessage("start")}))})),a=await Promise.all(o);a.sort(((e,n)=>e-n));const A=a[Math.floor(a.length/2)],r=A*n/(A*(n/e))*100;let c=Math.round(100*n/Math.max(r,10));return c=Math.min(Math.max(c,e-2),e+2),Math.min(Math.max(c,1),12)})().catch((n=>(console.warn("Core estimation failed:",n),e))),o=await Promise.race([n,new Promise((n=>setTimeout((()=>n(e)),1200)))]);return navigator.userAgent.includes("Firefox")||performance.timing?.navigationStart?Math.min(o,8):Math.min(o,12)}catch(n){return console.warn("Overall error in estimateCores:",n),e}finally{t.forEach((e=>e.terminate())),URL.revokeObjectURL(i)}}
/*!
* Copyright (c) 2025 Akshat Kotpalliwar (alias IntegerAlex on GitHub)
* This software is licensed under the GNU Lesser General Public License (LGPL) v3 or later.
*
* You are free to use, modify, and redistribute this software, but modifications must also be licensed under the LGPL.
* This project is distributed without any warranty; see the LGPL for more details.
*
* For a full copy of the LGPL and ethical contribution guidelines, please refer to the `COPYRIGHT.md` and `NOTICE.md` files.
*/function Z(){return{userAgent:"Mozilla/5.0 (Test Browser)",platform:"Test Platform",languages:["en-US"],cookiesEnabled:!0,doNotTrack:null,screenResolution:[1920,1080],colorDepth:24,colorGamut:"srgb",hardwareConcurrency:8,deviceMemory:8,os:{os:"test",version:"T"},audio:null,localStorage:!0,sessionStorage:!0,indexedDB:!0,webGL:{vendor:"Test Vendor",renderer:"Test Renderer",imageHash:null},canvas:{winding:!1,geometry:"",text:""},plugins:[],timezone:"America/New_York",touchSupport:{maxTouchPoints:0,touchEvent:!1,touchStart:!1},vendor:"Test Vendor",vendorFlavors:["test"],mathConstants:P(),fontPreferences:{detectedFonts:[]},incognito:{isPrivate:!1,browserName:"Test Browser"},bot:{isBot:!1,signals:[],confidence:.82},confidenceScore:.85,hash:"5d41402abc4b2a76b9719d911017c592"}}async function V(){if(navigator.brave&&"function"==typeof navigator.brave.isBrave)try{return await navigator.brave.isBrave()}catch{}return navigator.userAgent.toLowerCase().includes("brave")}async function _(){return!(!navigator.userAgentData||!navigator.userAgentData.brands)&&navigator.userAgentData.brands.some((e=>e.brand.toLowerCase().includes("brave")))}async function O(){let e=!1;try{e=await async function(){try{const e=await fetch("https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js",{method:"GET",mode:"no-cors"});if(!e)return!0;const n=await e.text();return!(!n.includes("uBlock Origin")&&!n.includes("window.adsbygoogle = { loaded: true, push: function() {} };"))}catch(e){return!0}}()}catch(e){console.error("Error detecting ad blocker:",e)}return e}async function W(){const e=[V(),_()],[n,i]=await Promise.all(e);return{isBrave:n||i,adBlocker:await O()}}function j(){if("undefined"==typeof window||"undefined"==typeof navigator)return{isBot:!0,signals:["non-browser-environment"],confidence:.8};const e=[],n=.3,i=.15,t=.05,o=["bot","crawler","selenium","webdriver","headless","puppeteer","playwright"];for(const n of o)navigator.userAgent.toLowerCase().includes(n)&&e.push(`strong:ua-${n}`);navigator.webdriver&&e.push("strong:webdriver-flag"),window.localStorage&&window.sessionStorage||e.push("medium:missing-storage"),(!navigator.plugins||navigator.plugins.length<2)&&e.push("medium:few-plugins"),(window.screen?.width<=300||window.screen?.height<=300)&&e.push("weak:small-screen"),(navigator.hardwareConcurrency<2||navigator.hardwareConcurrency>32)&&e.push("weak:unusual-concurrency");let a=.5;return a+=e.filter((e=>e.startsWith("strong:"))).length*n,a+=e.filter((e=>e.startsWith("medium:"))).length*i,a+=e.filter((e=>e.startsWith("weak:"))).length*t,{isBot:a>.7,signals:e,confidence:Math.min(.9,a)}}async function $(){if("undefined"==typeof window)return console.log("Not in browser environment, returning mock data"),Z();const e=j(),n=await F(),i=function(e,n){let i=.7;if(e&&(i-=.1),n.isBot?i-=.3*n.confidence:i+=.1*(1-n.confidence),"undefined"!=typeof navigator){const e=window;navigator.userAgent.includes("Chrome")&&!e.chrome&&(i-=.1),navigator.userAgent.includes("Firefox")&&!e.InstallTrigger&&(i-=.1)}return Math.max(.1,Math.min(.9,i))}(n.isPrivate,e)