├── .env.bak ├── .gitignore ├── 1.0.16_0.crx ├── 1.0.5_0.crx ├── README.md ├── canvas ├── _locales │ └── en │ │ └── messages.json ├── assets │ ├── chunk-16ff15da.js │ ├── chunk-1a1456ec.js │ ├── chunk-3a7b59dd.js │ ├── chunk-7ce85519.js │ ├── chunk-aaea1190.js │ ├── chunk-b4410958.js │ ├── chunk-dfed3562.js │ ├── debounce-09920c81.css │ ├── options-fe2fb5aa.css │ └── popup-1886d2ef.css ├── img │ ├── icon-128.png │ ├── icon-16.png │ ├── icon-24.png │ ├── icon-32-disabled.png │ ├── icon-32.png │ └── icon-48.png ├── manifest.json ├── options.html └── popup.html ├── check.py ├── checkStatus.js ├── credentials.txt.bak ├── ecosystem.config.js ├── extension ├── 1baa6c20d3e22be14c0a.otf ├── 29f06aeb3e17d185102f.otf ├── background.bundle.js ├── background.bundle.js.LICENSE.txt ├── icons │ ├── icon-128.png │ ├── icon-16.png │ └── icon-48.png ├── manifest.fingerprint ├── manifest.json ├── offscreen.bundle.js ├── offscreen.bundle.js.LICENSE.txt ├── offscreen.html ├── popup.bundle.js ├── popup.bundle.js.LICENSE.txt ├── popup.html └── src │ └── assets │ └── image │ ├── about-popup-bg.png │ ├── about.svg │ ├── arrow-right.svg │ ├── copy.svg │ ├── dashboard-not-selected.svg │ ├── dashboard-selected.svg │ ├── gps-not-selected.svg │ ├── gps-selected.svg │ ├── gradient-anime.gif │ ├── gradient.svg │ ├── info-circle.svg │ ├── line.svg │ ├── loginbasic.png │ ├── loginbg.png │ ├── logout.svg │ ├── noglobebg.png │ ├── purepurplemap.png │ ├── referral-icon.svg │ └── uv102.png ├── gradient.bak.js ├── main.js ├── package.json ├── proxies.txt.bak ├── start-multiple.js └── worker.js /.env.bak: -------------------------------------------------------------------------------- 1 | CHROME_PATH= -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | USERDATA 3 | package-lock.json 4 | credentials.txt 5 | iplist 6 | proxies.txt 7 | chrome 8 | .env -------------------------------------------------------------------------------- /1.0.16_0.crx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fabius8/gradient_headless/00af16c34a75c11462d7ca880f6059c06df81dd3/1.0.16_0.crx -------------------------------------------------------------------------------- /1.0.5_0.crx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fabius8/gradient_headless/00af16c34a75c11462d7ca880f6059c06df81dd3/1.0.5_0.crx -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 无头已被检测,勿用 2 | -------------------------------------------------------------------------------- /canvas/_locales/en/messages.json: -------------------------------------------------------------------------------- 1 | { 2 | "Action": { 3 | "message": "Action" 4 | }, 5 | "Add": { 6 | "message": "Add" 7 | }, 8 | "AddToWhiteList": { 9 | "message": "Add to whitelist" 10 | }, 11 | "Added": { 12 | "message": "Added" 13 | }, 14 | "Audio": { 15 | "message": "Audio" 16 | }, 17 | "Canvas": { 18 | "message": "Canvas" 19 | }, 20 | "CanvasFingerprint": { 21 | "message": "Canvas Fingerprint" 22 | }, 23 | "Count": { 24 | "message": "Count" 25 | }, 26 | "Delete": { 27 | "message": "Delete" 28 | }, 29 | "DetectedAndObfuscated": { 30 | "message": "Detected fingerprinting type" 31 | }, 32 | "Donate": { 33 | "message": "Donate" 34 | }, 35 | "ExtensionDescription": { 36 | "message": "All in one fingerprint protection - protect against Canvas, WebGL, Font, AudioContext fingerprinting in your browser." 37 | }, 38 | "ExtensionName": { 39 | "message": "All Fingerprint Defender" 40 | }, 41 | "Font": { 42 | "message": "Font" 43 | }, 44 | "History": { 45 | "message": "History" 46 | }, 47 | "Host": { 48 | "message": "Host" 49 | }, 50 | "InWhiteList": { 51 | "message": "In whitelist" 52 | }, 53 | "Last30Days": { 54 | "message": "last 30 days" 55 | }, 56 | "MakeBy": { 57 | "message": "Make by afixer.app" 58 | }, 59 | "MoreOptions": { 60 | "message": "More Options" 61 | }, 62 | "NumberOfFingerprints": { 63 | "message": "Number of prevented fingerprints" 64 | }, 65 | "NumberOfHosts": { 66 | "message": "Number of fingerprinting hosts" 67 | }, 68 | "PreventFingerprintingOn": { 69 | "message": "Prevent fingerprinting on" 70 | }, 71 | "RateUs": { 72 | "message": "Rate us" 73 | }, 74 | "Refresh": { 75 | "message": "Refresh" 76 | }, 77 | "RefreshThisPage": { 78 | "message": "Refresh this page to apply new options" 79 | }, 80 | "ReloadExtension": { 81 | "message": "Reload extension" 82 | }, 83 | "Total": { 84 | "message": "Total" 85 | }, 86 | "UpdatedAt": { 87 | "message": "Updated at" 88 | }, 89 | "WebGL": { 90 | "message": "WebGL" 91 | }, 92 | "WhiteList": { 93 | "message": "White list" 94 | } 95 | } 96 | -------------------------------------------------------------------------------- /canvas/assets/chunk-16ff15da.js: -------------------------------------------------------------------------------- 1 | if(!(ignoredSites=["https://www.google.com/maps","https://accounts.google.com","www.figma.com","www.canva.com","designer.microsoft.com","create.vista.com","console.aws.amazon.com","www.coze.com"].some(e=>window.location.href.startsWith(e)||window.location.host.endsWith(e)))){document.documentElement.setAttribute("data-afd-extension-id",chrome.runtime.id);const e="disabled:"+window.location.host;chrome.storage.sync.get([e],function(t){t[e]&&(document.documentElement.setAttribute("data-afd-disabled","true"),window.dispatchEvent(new Event("afd-disabled")))}),window.addEventListener("chrome.runtime.sendMessage",function(t){const o=t.detail;chrome.runtime.sendMessage(o,function(){})})} 2 | -------------------------------------------------------------------------------- /canvas/assets/chunk-1a1456ec.js: -------------------------------------------------------------------------------- 1 | import{d as I,o as n,c as a,b as i,_ as N,e as v,f as z,x as H,y as C,a as o,i as m,j as L,t as d,u as l,D as P,z as $,S as W,F as x,k as B,m as E,q as U,l as q,p as R,A as G,B as j,v as J}from"./chunk-3a7b59dd.js";const K=!0,Q={class:"toggle-button"},X={key:0,class:"on circle"},Y={key:1,class:"off circle"},Z=I({__name:"ToggleButton",props:{isOn:{type:Boolean,default:!1}},setup(u){return(c,S)=>(n(),a("div",Q,[u.isOn?(n(),a("div",X)):i("",!0),u.isOn?i("",!0):(n(),a("div",Y))]))}});const ee=N(Z,[["__scopeId","data-v-ee74a099"]]),D=u=>(G("data-v-053380fd"),u=u(),j(),u),te={class:"header"},se={class:"title"},oe={class:"line space-between"},ne={class:"description"},ae={class:"line space-between"},ce={class:"description2"},ie=["href"],le={class:"content"},de={class:"line space-between"},re=D(()=>o("span",{class:"option-icon"},"⚙",-1)),ue=D(()=>o("span",null,"⟳",-1)),_e=[ue],ve={key:0,class:"sub-content"},he={class:"line line-title"},ge={class:"host-line"},pe={class:"site-domain"},fe={key:0,class:"site-icon detected"},me=["src"],be=D(()=>o("span",{style:{"line-height":"10px","padding-bottom":"6px","font-size":"2.3rem","margin-right":"4px"}},"⟳",-1)),ye={key:2,class:"sub-content"},ke={class:"line line-title"},we={class:"detected-list"},Ce={key:0,class:"tag d-audio"},De={key:1,class:"tag d-canvas"},Se={key:2,class:"tag d-font"},Me={key:3,class:"tag d-webgl"},Ae={class:"sub-content"},xe={class:"line line-title"},Be={class:"total-detected"},Ie={key:3,class:"sub-content"},Ne={key:0,class:"line line-title"},Oe={key:1,class:"canvas-list"},Ve={class:"canvas-item"},Fe={class:"canvas-desc"},Te=["src"],ze=I({__name:"Popup",setup(u){const c=window.chrome,S=async()=>{await c.storage.local.set({reload:!0}),c.runtime.reload()},b=v(""),_=v({}),M=v(!1),g=v([]),p=v([]),y=v(0),O=()=>{c.tabs.query({active:!0,currentWindow:!0},s=>{const t=s[0];t&&t.url&&t.url.startsWith("http")&&(c.tabs.reload(t.id),window.close())})};function k(s){_.value[s]===void 0&&(_.value[s]=!1,c.runtime.sendMessage({action:"getDisabled",host:s},function(t){_.value[s]=t.disabled}))}let V=E(300);c.storage.sync.onChanged.addListener(s=>{var t;(t=s.totalDetected)!=null&&t.newValue&&V(()=>{y.value=s.totalDetected.newValue})}),z(()=>{c.tabs.query({active:!0,currentWindow:!0},s=>{const t=s[0];if(t&&t.url&&t.url.startsWith("http")){const e=new URL(t.url);b.value=e.host,k(e.host),t.id&&(H(t.id,t.incognito).then(r=>{for(const w of r)(w.host===e.host||w.origins.includes(e.host))&&k(w.host);g.value=r}),c.runtime.sendMessage({action:"getHosts",tabID:t.id},r=>{r&&((!r.hosts||!r.hosts.includes(e.host))&&r.hosts.push(e.host),p.value=r.hosts,p.value.forEach(k))}))}c.storage.sync.get("totalDetected",e=>{y.value=e.totalDetected||0})})});const F=async s=>{c.runtime.sendMessage({action:"setDisabled",host:s,disabled:!_.value[s]},()=>{_.value[s]=!_.value[s],M.value=!0})},T=s=>{const t=s.target;window.open("about:blank").document.write("from canvas")},A=C(()=>{const s=[],t=new Set;for(const e of g.value)for(const r of e.detections)t.add(e.host);if(p.value.length>0)for(const e of p.value)s.push({host:e,detected:t.has(e)});return s}),h=C(()=>{const s=new Set;for(const t of g.value)for(const e of t.detections)s.add(e.type);return s}),f=C(()=>{const s=[];for(const t of g.value)for(const e of t.detections)e.type==="CANVAS"&&s.push(e);return s.reverse()});return(s,t)=>(n(),a("main",null,[o("div",te,[m(L,{width:48}),o("div",se,[o("div",oe,[o("div",ne,d(l(c).i18n.getMessage("ExtensionName")),1)]),o("div",ae,[o("div",ce,[o("a",{href:l(U),target:"_blank",rel:"noopener noreferrer"},d(l(c).i18n.getMessage("MakeBy")),9,ie)]),m(P)])])]),o("div",le,[o("div",de,[o("button",{class:"btn",onClick:t[0]||(t[0]=e=>l(c).runtime.openOptionsPage())},[re,$(" "+d(l(c).i18n.getMessage("MoreOptions")),1)]),l(K)?i("",!0):(n(),a("button",{key:0,class:"btn reload-btn",onClick:S},_e)),m(W,{"font-size":"1.4rem"})]),b.value?(n(),a("div",ve,[o("div",he,d(l(c).i18n.getMessage("PreventFingerprintingOn")),1),o("div",ge,[A.value?(n(!0),a(x,{key:0},B(A.value,e=>(n(),a("div",{key:e.host,class:"line interactive"},[o("span",pe,[e.detected?(n(),a("div",fe,"!")):i("",!0),o("img",{src:l(q)(e.host),class:"site-icon",loading:"lazy"},null,8,me),o("span",null,d(e.host),1)]),m(ee,{"is-on":!_.value[e.host],onClick:r=>F(e.host)},null,8,["is-on","onClick"])]))),128)):i("",!0)])])):i("",!0),M.value?(n(),a("button",{key:1,class:"btn refresh-btn zoom-in-effect",onClick:O},[be,o("span",null,d(l(c).i18n.getMessage("RefreshThisPage")),1)])):i("",!0),h.value.size?(n(),a("div",ye,[o("div",ke,d(l(c).i18n.getMessage("DetectedAndObfuscated")),1),o("div",we,[h.value.has("AUDIO")?(n(),a("div",Ce,"Audio")):i("",!0),h.value.has("CANVAS")?(n(),a("div",De,"Canvas")):i("",!0),h.value.has("FONT")?(n(),a("div",Se,"Font")):i("",!0),h.value.has("WEBGL")?(n(),a("div",Me,"WebGL")):i("",!0)])])):i("",!0),o("div",Ae,[o("div",xe,d(l(c).i18n.getMessage("NumberOfFingerprints")),1),o("div",Be,d(y.value.toLocaleString()),1)]),f.value&&f.value.length>0?(n(),a("div",Ie,[b.value?(n(),a("div",Ne,d(l(c).i18n.getMessage("CanvasFingerprint")),1)):i("",!0),f.value?(n(),a("div",Oe,[(n(!0),a(x,null,B(f.value,e=>(n(),a("div",Ve,[o("div",Fe,[o("span",null,d(l(R)(e.occurredAt)),1),o("span",null,d(e.canvasSize),1)]),e.type==="CANVAS"?(n(),a("img",{key:0,onClick:T,class:"canvas",src:e.canvas},null,8,Te)):i("",!0)]))),256))])):i("",!0)])):i("",!0)])]))}});const He=N(ze,[["__scopeId","data-v-053380fd"]]);J(He).mount("#app"); 2 | -------------------------------------------------------------------------------- /canvas/assets/chunk-3a7b59dd.js: -------------------------------------------------------------------------------- 1 | (function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const r of document.querySelectorAll('link[rel="modulepreload"]'))s(r);new MutationObserver(r=>{for(const o of r)if(o.type==="childList")for(const i of o.addedNodes)i.tagName==="LINK"&&i.rel==="modulepreload"&&s(i)}).observe(document,{childList:!0,subtree:!0});function n(r){const o={};return r.integrity&&(o.integrity=r.integrity),r.referrerPolicy&&(o.referrerPolicy=r.referrerPolicy),r.crossOrigin==="use-credentials"?o.credentials="include":r.crossOrigin==="anonymous"?o.credentials="omit":o.credentials="same-origin",o}function s(r){if(r.ep)return;r.ep=!0;const o=n(r);fetch(r.href,o)}})();function pe(e,t){const n=Object.create(null),s=e.split(",");for(let r=0;r!!n[r.toLowerCase()]:r=>!!n[r]}const K={},rt=[],ve=()=>{},$r=()=>!1,qr=/^on[^a-z]/,qt=e=>qr.test(e),Fn=e=>e.startsWith("onUpdate:"),$=Object.assign,Sn=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},Wr=Object.prototype.hasOwnProperty,R=(e,t)=>Wr.call(e,t),M=Array.isArray,ot=e=>Wt(e)==="[object Map]",Ds=e=>Wt(e)==="[object Set]",F=e=>typeof e=="function",Z=e=>typeof e=="string",Nn=e=>typeof e=="symbol",Y=e=>e!==null&&typeof e=="object",Bs=e=>Y(e)&&F(e.then)&&F(e.catch),Hs=Object.prototype.toString,Wt=e=>Hs.call(e),Jr=e=>Wt(e).slice(8,-1),js=e=>Wt(e)==="[object Object]",kn=e=>Z(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,Dt=pe(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted");pe("bind,cloak,else-if,else,for,html,if,model,on,once,pre,show,slot,text,memo");const Jt=e=>{const t=Object.create(null);return n=>t[n]||(t[n]=e(n))},Qr=/-(\w)/g,ct=Jt(e=>e.replace(Qr,(t,n)=>n?n.toUpperCase():"")),Vr=/\B([A-Z])/g,ut=Jt(e=>e.replace(Vr,"-$1").toLowerCase()),Us=Jt(e=>e.charAt(0).toUpperCase()+e.slice(1)),ln=Jt(e=>e?`on${Us(e)}`:""),wt=(e,t)=>!Object.is(e,t),cn=(e,t)=>{for(let n=0;n{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,value:n})},Xr=e=>{const t=parseFloat(e);return isNaN(t)?e:t},Gr=e=>{const t=Z(e)?Number(e):NaN;return isNaN(t)?e:t};let ss;const mn=()=>ss||(ss=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{}),Zr="Infinity,undefined,NaN,isFinite,isNaN,parseFloat,parseInt,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,Math,Number,Date,Array,Object,Boolean,String,RegExp,Map,Set,JSON,Intl,BigInt,console",eo=pe(Zr);function Qt(e){if(M(e)){const t={};for(let n=0;n{if(n){const s=n.split(no);s.length>1&&(t[s[0].trim()]=s[1].trim())}}),t}function Rn(e){let t="";if(Z(e))t=e;else if(M(e))for(let n=0;nZ(e)?e:e==null?"":M(e)||Y(e)&&(e.toString===Hs||!F(e.toString))?JSON.stringify(e,zs,2):String(e),zs=(e,t)=>t&&t.__v_isRef?zs(e,t.value):ot(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((n,[s,r])=>(n[`${s} =>`]=r,n),{})}:Ds(t)?{[`Set(${t.size})`]:[...t.values()]}:Y(t)&&!M(t)&&!js(t)?String(t):t;let be;class ao{constructor(t=!1){this.detached=t,this._active=!0,this.effects=[],this.cleanups=[],this.parent=be,!t&&be&&(this.index=(be.scopes||(be.scopes=[])).push(this)-1)}get active(){return this._active}run(t){if(this._active){const n=be;try{return be=this,t()}finally{be=n}}}on(){be=this}off(){be=this.parent}stop(t){if(this._active){let n,s;for(n=0,s=this.effects.length;n{const t=new Set(e);return t.w=0,t.n=0,t},$s=e=>(e.w&Ke)>0,qs=e=>(e.n&Ke)>0,ho=({deps:e})=>{if(e.length)for(let t=0;t{const{deps:t}=e;if(t.length){let n=0;for(let s=0;s{(p==="length"||p>=f)&&c.push(u)})}else switch(n!==void 0&&c.push(i.get(n)),t){case"add":M(e)?kn(n)&&c.push(i.get("length")):(c.push(i.get(Ve)),ot(e)&&c.push(i.get(yn)));break;case"delete":M(e)||(c.push(i.get(Ve)),ot(e)&&c.push(i.get(yn)));break;case"set":ot(e)&&c.push(i.get(Ve));break}if(c.length===1)c[0]&&vn(c[0]);else{const f=[];for(const u of c)u&&f.push(...u);vn(Ln(f))}}function vn(e,t){const n=M(e)?e:[...e];for(const s of n)s.computed&&os(s);for(const s of n)s.computed||os(s)}function os(e,t){(e!==_e||e.allowRecurse)&&(e.scheduler?e.scheduler():e.run())}const mo=pe("__proto__,__v_isRef,__isVue"),Qs=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(Nn)),bo=Vt(),_o=Vt(!1,!0),yo=Vt(!0),vo=Vt(!0,!0),is=xo();function xo(){const e={};return["includes","indexOf","lastIndexOf"].forEach(t=>{e[t]=function(...n){const s=L(this);for(let o=0,i=this.length;o{e[t]=function(...n){dt();const s=L(this)[t].apply(this,n);return pt(),s}}),e}function wo(e){const t=L(this);return fe(t,"has",e),t.hasOwnProperty(e)}function Vt(e=!1,t=!1){return function(s,r,o){if(r==="__v_isReactive")return!e;if(r==="__v_isReadonly")return e;if(r==="__v_isShallow")return t;if(r==="__v_raw"&&o===(e?t?Do:tr:t?er:Zs).get(s))return s;const i=M(s);if(!e){if(i&&R(is,r))return Reflect.get(is,r,o);if(r==="hasOwnProperty")return wo}const c=Reflect.get(s,r,o);return(Nn(r)?Qs.has(r):mo(r))||(e||fe(s,"get",r),t)?c:oe(c)?i&&kn(r)?c:c.value:Y(c)?e?nr(c):jn(c):c}}const Co=Vs(),Ao=Vs(!0);function Vs(e=!1){return function(n,s,r,o){let i=n[s];if(ft(i)&&oe(i)&&!oe(r))return!1;if(!e&&(!Kt(r)&&!ft(r)&&(i=L(i),r=L(r)),!M(n)&&oe(i)&&!oe(r)))return i.value=r,!0;const c=M(n)&&kn(s)?Number(s)e,Xt=e=>Reflect.getPrototypeOf(e);function Ft(e,t,n=!1,s=!1){e=e.__v_raw;const r=L(e),o=L(t);n||(t!==o&&fe(r,"get",t),fe(r,"get",o));const{has:i}=Xt(r),c=s?Bn:n?Kn:Ct;if(i.call(r,t))return c(e.get(t));if(i.call(r,o))return c(e.get(o));e!==r&&e.get(t)}function St(e,t=!1){const n=this.__v_raw,s=L(n),r=L(e);return t||(e!==r&&fe(s,"has",e),fe(s,"has",r)),e===r?n.has(e):n.has(e)||n.has(r)}function Nt(e,t=!1){return e=e.__v_raw,!t&&fe(L(e),"iterate",Ve),Reflect.get(e,"size",e)}function ls(e){e=L(e);const t=L(this);return Xt(t).has.call(t,e)||(t.add(e),Se(t,"add",e,e)),this}function cs(e,t){t=L(t);const n=L(this),{has:s,get:r}=Xt(n);let o=s.call(n,e);o||(e=L(e),o=s.call(n,e));const i=r.call(n,e);return n.set(e,t),o?wt(t,i)&&Se(n,"set",e,t):Se(n,"add",e,t),this}function fs(e){const t=L(this),{has:n,get:s}=Xt(t);let r=n.call(t,e);r||(e=L(e),r=n.call(t,e)),s&&s.call(t,e);const o=t.delete(e);return r&&Se(t,"delete",e,void 0),o}function as(){const e=L(this),t=e.size!==0,n=e.clear();return t&&Se(e,"clear",void 0,void 0),n}function kt(e,t){return function(s,r){const o=this,i=o.__v_raw,c=L(i),f=t?Bn:e?Kn:Ct;return!e&&fe(c,"iterate",Ve),i.forEach((u,p)=>s.call(r,f(u),f(p),o))}}function Rt(e,t,n){return function(...s){const r=this.__v_raw,o=L(r),i=ot(o),c=e==="entries"||e===Symbol.iterator&&i,f=e==="keys"&&i,u=r[e](...s),p=n?Bn:t?Kn:Ct;return!t&&fe(o,"iterate",f?yn:Ve),{next(){const{value:b,done:x}=u.next();return x?{value:b,done:x}:{value:c?[p(b[0]),p(b[1])]:p(b),done:x}},[Symbol.iterator](){return this}}}}function Re(e){return function(...t){return e==="delete"?!1:this}}function Oo(){const e={get(o){return Ft(this,o)},get size(){return Nt(this)},has:St,add:ls,set:cs,delete:fs,clear:as,forEach:kt(!1,!1)},t={get(o){return Ft(this,o,!1,!0)},get size(){return Nt(this)},has:St,add:ls,set:cs,delete:fs,clear:as,forEach:kt(!1,!0)},n={get(o){return Ft(this,o,!0)},get size(){return Nt(this,!0)},has(o){return St.call(this,o,!0)},add:Re("add"),set:Re("set"),delete:Re("delete"),clear:Re("clear"),forEach:kt(!0,!1)},s={get(o){return Ft(this,o,!0,!0)},get size(){return Nt(this,!0)},has(o){return St.call(this,o,!0)},add:Re("add"),set:Re("set"),delete:Re("delete"),clear:Re("clear"),forEach:kt(!0,!0)};return["keys","values","entries",Symbol.iterator].forEach(o=>{e[o]=Rt(o,!1,!1),n[o]=Rt(o,!0,!1),t[o]=Rt(o,!1,!0),s[o]=Rt(o,!0,!0)}),[e,n,t,s]}const[Po,Fo,So,No]=Oo();function Hn(e,t){const n=t?e?No:So:e?Fo:Po;return(s,r,o)=>r==="__v_isReactive"?!e:r==="__v_isReadonly"?e:r==="__v_raw"?s:Reflect.get(R(n,r)&&r in s?n:s,r,o)}const ko={get:Hn(!1,!1)},Ro={get:Hn(!1,!0)},Lo={get:Hn(!0,!1)},Zs=new WeakMap,er=new WeakMap,tr=new WeakMap,Do=new WeakMap;function Bo(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function Ho(e){return e.__v_skip||!Object.isExtensible(e)?0:Bo(Jr(e))}function jn(e){return ft(e)?e:Un(e,!1,Xs,ko,Zs)}function jo(e){return Un(e,!1,Mo,Ro,er)}function nr(e){return Un(e,!0,Gs,Lo,tr)}function Un(e,t,n,s,r){if(!Y(e)||e.__v_raw&&!(t&&e.__v_isReactive))return e;const o=r.get(e);if(o)return o;const i=Ho(e);if(i===0)return e;const c=new Proxy(e,i===2?s:n);return r.set(e,c),c}function it(e){return ft(e)?it(e.__v_raw):!!(e&&e.__v_isReactive)}function ft(e){return!!(e&&e.__v_isReadonly)}function Kt(e){return!!(e&&e.__v_isShallow)}function sr(e){return it(e)||ft(e)}function L(e){const t=e&&e.__v_raw;return t?L(t):e}function rr(e){return Ut(e,"__v_skip",!0),e}const Ct=e=>Y(e)?jn(e):e,Kn=e=>Y(e)?nr(e):e;function or(e){je&&_e&&(e=L(e),Js(e.dep||(e.dep=Ln())))}function ir(e,t){e=L(e);const n=e.dep;n&&vn(n)}function oe(e){return!!(e&&e.__v_isRef===!0)}function Hl(e){return Uo(e,!1)}function Uo(e,t){return oe(e)?e:new Ko(e,t)}class Ko{constructor(t,n){this.__v_isShallow=n,this.dep=void 0,this.__v_isRef=!0,this._rawValue=n?t:L(t),this._value=n?t:Ct(t)}get value(){return or(this),this._value}set value(t){const n=this.__v_isShallow||Kt(t)||ft(t);t=n?t:L(t),wt(t,this._rawValue)&&(this._rawValue=t,this._value=n?t:Ct(t),ir(this))}}function Bt(e){return oe(e)?e.value:e}const Yo={get:(e,t,n)=>Bt(Reflect.get(e,t,n)),set:(e,t,n,s)=>{const r=e[t];return oe(r)&&!oe(n)?(r.value=n,!0):Reflect.set(e,t,n,s)}};function lr(e){return it(e)?e:new Proxy(e,Yo)}class zo{constructor(t,n,s,r){this._setter=n,this.dep=void 0,this.__v_isRef=!0,this.__v_isReadonly=!1,this._dirty=!0,this.effect=new Dn(t,()=>{this._dirty||(this._dirty=!0,ir(this))}),this.effect.computed=this,this.effect.active=this._cacheable=!r,this.__v_isReadonly=s}get value(){const t=L(this);return or(t),(t._dirty||!t._cacheable)&&(t._dirty=!1,t._value=t.effect.run()),t._value}set value(t){this._setter(t)}}function $o(e,t,n=!1){let s,r;const o=F(e);return o?(s=e,r=ve):(s=e.get,r=e.set),new zo(s,r,o||!r,n)}Promise.resolve();function Ue(e,t,n,s){let r;try{r=s?e(...s):e()}catch(o){Gt(o,t,n)}return r}function ge(e,t,n,s){if(F(e)){const o=Ue(e,t,n,s);return o&&Bs(o)&&o.catch(i=>{Gt(i,t,n)}),o}const r=[];for(let o=0;o>>1;Et(re[s])Me&&re.splice(t,1)}function Qo(e){M(e)?lt.push(...e):(!Fe||!Fe.includes(e,e.allowRecurse?Je+1:Je))&<.push(e),fr()}function us(e,t=At?Me+1:0){for(;tEt(n)-Et(s)),Je=0;Jee.id==null?1/0:e.id,Vo=(e,t)=>{const n=Et(e)-Et(t);if(n===0){if(e.pre&&!t.pre)return-1;if(t.pre&&!e.pre)return 1}return n};function ur(e){xn=!1,At=!0,re.sort(Vo);const t=ve;try{for(Me=0;MeZ(I)?I.trim():I)),b&&(r=n.map(Xr))}let c,f=s[c=ln(t)]||s[c=ln(ct(t))];!f&&o&&(f=s[c=ln(ut(t))]),f&&ge(f,e,6,r);const u=s[c+"Once"];if(u){if(!e.emitted)e.emitted={};else if(e.emitted[c])return;e.emitted[c]=!0,ge(u,e,6,r)}}function dr(e,t,n=!1){const s=t.emitsCache,r=s.get(e);if(r!==void 0)return r;const o=e.emits;let i={},c=!1;if(!F(e)){const f=u=>{const p=dr(u,t,!0);p&&(c=!0,$(i,p))};!n&&t.mixins.length&&t.mixins.forEach(f),e.extends&&f(e.extends),e.mixins&&e.mixins.forEach(f)}return!o&&!c?(Y(e)&&s.set(e,null),null):(M(o)?o.forEach(f=>i[f]=null):$(i,o),Y(e)&&s.set(e,i),i)}function Zt(e,t){return!e||!qt(t)?!1:(t=t.slice(2).replace(/Once$/,""),R(e,t[0].toLowerCase()+t.slice(1))||R(e,ut(t))||R(e,t))}let le=null,en=null;function Yt(e){const t=le;return le=e,en=e&&e.type.__scopeId||null,t}function jl(e){en=e}function Ul(){en=null}function Go(e,t=le,n){if(!t||e._n)return e;const s=(...r)=>{s._d&&xs(-1);const o=Yt(t);let i;try{i=e(...r)}finally{Yt(o),s._d&&xs(1)}return i};return s._n=!0,s._c=!0,s._d=!0,s}function fn(e){const{type:t,vnode:n,proxy:s,withProxy:r,props:o,propsOptions:[i],slots:c,attrs:f,emit:u,render:p,renderCache:b,data:x,setupState:I,ctx:D,inheritAttrs:N}=e;let q,Q;const V=Yt(e);try{if(n.shapeFlag&4){const O=r||s;q=Ie(p.call(O,O,b,o,I,x,D)),Q=f}else{const O=t;q=Ie(O.length>1?O(o,{attrs:f,slots:c,emit:u}):O(o,null)),Q=t.props?f:Zo(f)}}catch(O){xt.length=0,Gt(O,e,1),q=xe(Ne)}let X=q;if(Q&&N!==!1){const O=Object.keys(Q),{shapeFlag:ee}=X;O.length&&ee&7&&(i&&O.some(Fn)&&(Q=ei(Q,i)),X=Ge(X,Q))}return n.dirs&&(X=Ge(X),X.dirs=X.dirs?X.dirs.concat(n.dirs):n.dirs),n.transition&&(X.transition=n.transition),q=X,Yt(V),q}const Zo=e=>{let t;for(const n in e)(n==="class"||n==="style"||qt(n))&&((t||(t={}))[n]=e[n]);return t},ei=(e,t)=>{const n={};for(const s in e)(!Fn(s)||!(s.slice(9)in t))&&(n[s]=e[s]);return n};function ti(e,t,n){const{props:s,children:r,component:o}=e,{props:i,children:c,patchFlag:f}=t,u=o.emitsOptions;if(t.dirs||t.transition)return!0;if(n&&f>=0){if(f&1024)return!0;if(f&16)return s?ds(s,i,u):!!i;if(f&8){const p=t.dynamicProps;for(let b=0;be.__isSuspense;function ri(e,t){t&&t.pendingBranch?M(e)?t.effects.push(...e):t.effects.push(e):Qo(e)}const Lt={};function an(e,t,n){return pr(e,t,n)}function pr(e,t,{immediate:n,deep:s,flush:r,onTrack:o,onTrigger:i}=K){var c;const f=po()===((c=ne)==null?void 0:c.scope)?ne:null;let u,p=!1,b=!1;if(oe(e)?(u=()=>e.value,p=Kt(e)):it(e)?(u=()=>e,s=!0):M(e)?(b=!0,p=e.some(O=>it(O)||Kt(O)),u=()=>e.map(O=>{if(oe(O))return O.value;if(it(O))return st(O);if(F(O))return Ue(O,f,2)})):F(e)?t?u=()=>Ue(e,f,2):u=()=>{if(!(f&&f.isUnmounted))return x&&x(),ge(e,f,3,[I])}:u=ve,t&&s){const O=u;u=()=>st(O())}let x,I=O=>{x=V.onStop=()=>{Ue(O,f,4)}},D;if(It)if(I=ve,t?n&&ge(t,f,3,[u(),b?[]:void 0,I]):u(),r==="sync"){const O=Zi();D=O.__watcherHandles||(O.__watcherHandles=[])}else return ve;let N=b?new Array(e.length).fill(Lt):Lt;const q=()=>{if(V.active)if(t){const O=V.run();(s||p||(b?O.some((ee,we)=>wt(ee,N[we])):wt(O,N)))&&(x&&x(),ge(t,f,3,[O,N===Lt?void 0:b&&N[0]===Lt?[]:N,I]),N=O)}else V.run()};q.allowRecurse=!!t;let Q;r==="sync"?Q=q:r==="post"?Q=()=>ce(q,f&&f.suspense):(q.pre=!0,f&&(q.id=f.uid),Q=()=>zn(q));const V=new Dn(u,Q);t?n?q():N=V.run():r==="post"?ce(V.run.bind(V),f&&f.suspense):V.run();const X=()=>{V.stop(),f&&f.scope&&Sn(f.scope.effects,V)};return D&&D.push(X),X}function oi(e,t,n){const s=this.proxy,r=Z(e)?e.includes(".")?hr(s,e):()=>s[e]:e.bind(s,s);let o;F(t)?o=t:(o=t.handler,n=t);const i=ne;at(this);const c=pr(r,o.bind(s),n);return i?at(i):Xe(),c}function hr(e,t){const n=t.split(".");return()=>{let s=e;for(let r=0;r{st(n,t)});else if(js(e))for(const n in e)st(e[n],t);return e}function $e(e,t,n,s){const r=e.dirs,o=t&&t.dirs;for(let i=0;i{e.isMounted=!0}),vr(()=>{e.isUnmounting=!0}),e}const he=[Function,Array],li={mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:he,onEnter:he,onAfterEnter:he,onEnterCancelled:he,onBeforeLeave:he,onLeave:he,onAfterLeave:he,onLeaveCancelled:he,onBeforeAppear:he,onAppear:he,onAfterAppear:he,onAppearCancelled:he};function ci(e,t){const{leavingVNodes:n}=e;let s=n.get(t.type);return s||(s=Object.create(null),n.set(t.type,s)),s}function wn(e,t,n,s){const{appear:r,mode:o,persisted:i=!1,onBeforeEnter:c,onEnter:f,onAfterEnter:u,onEnterCancelled:p,onBeforeLeave:b,onLeave:x,onAfterLeave:I,onLeaveCancelled:D,onBeforeAppear:N,onAppear:q,onAfterAppear:Q,onAppearCancelled:V}=t,X=String(e.key),O=ci(n,e),ee=(S,W)=>{S&&ge(S,s,9,W)},we=(S,W)=>{const U=W[1];ee(S,W),M(S)?S.every(se=>se.length<=1)&&U():S.length<=1&&U()},Ce={mode:o,persisted:i,beforeEnter(S){let W=c;if(!n.isMounted)if(r)W=N||c;else return;S._leaveCb&&S._leaveCb(!0);const U=O[X];U&&nt(e,U)&&U.el._leaveCb&&U.el._leaveCb(),ee(W,[S])},enter(S){let W=f,U=u,se=p;if(!n.isMounted)if(r)W=q||f,U=Q||u,se=V||p;else return;let A=!1;const z=S._enterCb=ae=>{A||(A=!0,ae?ee(se,[S]):ee(U,[S]),Ce.delayedLeave&&Ce.delayedLeave(),S._enterCb=void 0)};W?we(W,[S,z]):z()},leave(S,W){const U=String(e.key);if(S._enterCb&&S._enterCb(!0),n.isUnmounting)return W();ee(b,[S]);let se=!1;const A=S._leaveCb=z=>{se||(se=!0,W(),z?ee(D,[S]):ee(I,[S]),S._leaveCb=void 0,O[U]===e&&delete O[U])};O[U]=e,x?we(x,[S,A]):A()},clone(S){return wn(S,t,n,s)}};return Ce}function Cn(e,t){e.shapeFlag&6&&e.component?Cn(e.component.subTree,t):e.shapeFlag&128?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function gr(e,t=!1,n){let s=[],r=0;for(let o=0;o1)for(let o=0;o$({name:e.name},t,{setup:e}))():e}const yt=e=>!!e.type.__asyncLoader,mr=e=>e.type.__isKeepAlive;function fi(e,t){br(e,"a",t)}function ai(e,t){br(e,"da",t)}function br(e,t,n=ne){const s=e.__wdc||(e.__wdc=()=>{let r=n;for(;r;){if(r.isDeactivated)return;r=r.parent}return e()});if(tn(t,s,n),n){let r=n.parent;for(;r&&r.parent;)mr(r.parent.vnode)&&ui(s,t,n,r),r=r.parent}}function ui(e,t,n,s){const r=tn(t,e,s,!0);xr(()=>{Sn(s[t],r)},n)}function tn(e,t,n=ne,s=!1){if(n){const r=n[e]||(n[e]=[]),o=t.__weh||(t.__weh=(...i)=>{if(n.isUnmounted)return;dt(),at(n);const c=ge(t,n,e,i);return Xe(),pt(),c});return s?r.unshift(o):r.push(o),o}}const ke=e=>(t,n=ne)=>(!It||e==="sp")&&tn(e,(...s)=>t(...s),n),di=ke("bm"),_r=ke("m"),pi=ke("bu"),yr=ke("u"),vr=ke("bum"),xr=ke("um"),hi=ke("sp"),gi=ke("rtg"),mi=ke("rtc");function bi(e,t=ne){tn("ec",e,t)}const _i=Symbol.for("v-ndc");function Kl(e,t,n,s){let r;const o=n&&n[s];if(M(e)||Z(e)){r=new Array(e.length);for(let i=0,c=e.length;it(i,c,void 0,o&&o[c]));else{const i=Object.keys(e);r=new Array(i.length);for(let c=0,f=i.length;cNr(t)?!(t.type===Ne||t.type===de&&!wr(t.children)):!0)?e:null}const An=e=>e?Rr(e)?Xn(e)||e.proxy:An(e.parent):null,vt=$(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>An(e.parent),$root:e=>An(e.root),$emit:e=>e.emit,$options:e=>qn(e),$forceUpdate:e=>e.f||(e.f=()=>zn(e.update)),$nextTick:e=>e.n||(e.n=qo.bind(e.proxy)),$watch:e=>oi.bind(e)}),un=(e,t)=>e!==K&&!e.__isScriptSetup&&R(e,t),En={get({_:e},t){const{ctx:n,setupState:s,data:r,props:o,accessCache:i,type:c,appContext:f}=e;let u;if(t[0]!=="$"){const I=i[t];if(I!==void 0)switch(I){case 1:return s[t];case 2:return r[t];case 4:return n[t];case 3:return o[t]}else{if(un(s,t))return i[t]=1,s[t];if(r!==K&&R(r,t))return i[t]=2,r[t];if((u=e.propsOptions[0])&&R(u,t))return i[t]=3,o[t];if(n!==K&&R(n,t))return i[t]=4,n[t];Tn&&(i[t]=0)}}const p=vt[t];let b,x;if(p)return t==="$attrs"&&fe(e,"get",t),p(e);if((b=c.__cssModules)&&(b=b[t]))return b;if(n!==K&&R(n,t))return i[t]=4,n[t];if(x=f.config.globalProperties,R(x,t))return x[t]},set({_:e},t,n){const{data:s,setupState:r,ctx:o}=e;return un(r,t)?(r[t]=n,!0):s!==K&&R(s,t)?(s[t]=n,!0):R(e.props,t)||t[0]==="$"&&t.slice(1)in e?!1:(o[t]=n,!0)},has({_:{data:e,setupState:t,accessCache:n,ctx:s,appContext:r,propsOptions:o}},i){let c;return!!n[i]||e!==K&&R(e,i)||un(t,i)||(c=o[0])&&R(c,i)||R(s,i)||R(vt,i)||R(r.config.globalProperties,i)},defineProperty(e,t,n){return n.get!=null?e._.accessCache[t]=0:R(n,"value")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}};$({},En,{get(e,t){if(t!==Symbol.unscopables)return En.get(e,t,e)},has(e,t){return t[0]!=="_"&&!eo(t)}});function ps(e){return M(e)?e.reduce((t,n)=>(t[n]=null,t),{}):e}let Tn=!0;function yi(e){const t=qn(e),n=e.proxy,s=e.ctx;Tn=!1,t.beforeCreate&&hs(t.beforeCreate,e,"bc");const{data:r,computed:o,methods:i,watch:c,provide:f,inject:u,created:p,beforeMount:b,mounted:x,beforeUpdate:I,updated:D,activated:N,deactivated:q,beforeDestroy:Q,beforeUnmount:V,destroyed:X,unmounted:O,render:ee,renderTracked:we,renderTriggered:Ce,errorCaptured:S,serverPrefetch:W,expose:U,inheritAttrs:se,components:A,directives:z,filters:ae}=t;if(u&&vi(u,s,null),i)for(const J in i){const H=i[J];F(H)&&(s[J]=H.bind(n))}if(r){const J=r.call(n,n);Y(J)&&(e.data=jn(J))}if(Tn=!0,o)for(const J in o){const H=o[J],Ye=F(H)?H.bind(n,n):F(H.get)?H.get.bind(n,n):ve,Ot=!F(H)&&F(H.set)?H.set.bind(n):ve,ze=Xi({get:Ye,set:Ot});Object.defineProperty(s,J,{enumerable:!0,configurable:!0,get:()=>ze.value,set:Ae=>ze.value=Ae})}if(c)for(const J in c)Cr(c[J],s,n,J);if(f){const J=F(f)?f.call(n):f;Reflect.ownKeys(J).forEach(H=>{Ti(H,J[H])})}p&&hs(p,e,"c");function te(J,H){M(H)?H.forEach(Ye=>J(Ye.bind(n))):H&&J(H.bind(n))}if(te(di,b),te(_r,x),te(pi,I),te(yr,D),te(fi,N),te(ai,q),te(bi,S),te(mi,we),te(gi,Ce),te(vr,V),te(xr,O),te(hi,W),M(U))if(U.length){const J=e.exposed||(e.exposed={});U.forEach(H=>{Object.defineProperty(J,H,{get:()=>n[H],set:Ye=>n[H]=Ye})})}else e.exposed||(e.exposed={});ee&&e.render===ve&&(e.render=ee),se!=null&&(e.inheritAttrs=se),A&&(e.components=A),z&&(e.directives=z)}function vi(e,t,n=ve){M(e)&&(e=In(e));for(const s in e){const r=e[s];let o;Y(r)?"default"in r?o=Ht(r.from||s,r.default,!0):o=Ht(r.from||s):o=Ht(r),oe(o)?Object.defineProperty(t,s,{enumerable:!0,configurable:!0,get:()=>o.value,set:i=>o.value=i}):t[s]=o}}function hs(e,t,n){ge(M(e)?e.map(s=>s.bind(t.proxy)):e.bind(t.proxy),t,n)}function Cr(e,t,n,s){const r=s.includes(".")?hr(n,s):()=>n[s];if(Z(e)){const o=t[e];F(o)&&an(r,o)}else if(F(e))an(r,e.bind(n));else if(Y(e))if(M(e))e.forEach(o=>Cr(o,t,n,s));else{const o=F(e.handler)?e.handler.bind(n):t[e.handler];F(o)&&an(r,o,e)}}function qn(e){const t=e.type,{mixins:n,extends:s}=t,{mixins:r,optionsCache:o,config:{optionMergeStrategies:i}}=e.appContext,c=o.get(t);let f;return c?f=c:!r.length&&!n&&!s?f=t:(f={},r.length&&r.forEach(u=>zt(f,u,i,!0)),zt(f,t,i)),Y(t)&&o.set(t,f),f}function zt(e,t,n,s=!1){const{mixins:r,extends:o}=t;o&&zt(e,o,n,!0),r&&r.forEach(i=>zt(e,i,n,!0));for(const i in t)if(!(s&&i==="expose")){const c=xi[i]||n&&n[i];e[i]=c?c(e[i],t[i]):t[i]}return e}const xi={data:gs,props:ms,emits:ms,methods:_t,computed:_t,beforeCreate:ie,created:ie,beforeMount:ie,mounted:ie,beforeUpdate:ie,updated:ie,beforeDestroy:ie,beforeUnmount:ie,destroyed:ie,unmounted:ie,activated:ie,deactivated:ie,errorCaptured:ie,serverPrefetch:ie,components:_t,directives:_t,watch:Ci,provide:gs,inject:wi};function gs(e,t){return t?e?function(){return $(F(e)?e.call(this,this):e,F(t)?t.call(this,this):t)}:t:e}function wi(e,t){return _t(In(e),In(t))}function In(e){if(M(e)){const t={};for(let n=0;n1)return n&&F(t)?t.call(s&&s.proxy):t}}function Ii(e,t,n,s=!1){const r={},o={};Ut(o,sn,1),e.propsDefaults=Object.create(null),Er(e,t,r,o);for(const i in e.propsOptions[0])i in r||(r[i]=void 0);n?e.props=s?r:jo(r):e.type.props?e.props=r:e.props=o,e.attrs=o}function Mi(e,t,n,s){const{props:r,attrs:o,vnode:{patchFlag:i}}=e,c=L(r),[f]=e.propsOptions;let u=!1;if((s||i>0)&&!(i&16)){if(i&8){const p=e.vnode.dynamicProps;for(let b=0;b{f=!0;const[x,I]=Tr(b,t,!0);$(i,x),I&&c.push(...I)};!n&&t.mixins.length&&t.mixins.forEach(p),e.extends&&p(e.extends),e.mixins&&e.mixins.forEach(p)}if(!o&&!f)return Y(e)&&s.set(e,rt),rt;if(M(o))for(let p=0;p-1,I[1]=N<0||D-1||R(I,"default"))&&c.push(b)}}}const u=[i,c];return Y(e)&&s.set(e,u),u}function bs(e){return e[0]!=="$"}function _s(e){const t=e&&e.toString().match(/^\s*(function|class) (\w+)/);return t?t[2]:e===null?"null":""}function ys(e,t){return _s(e)===_s(t)}function vs(e,t){return M(t)?t.findIndex(n=>ys(n,e)):F(t)&&ys(t,e)?0:-1}pe("String,Number,Boolean,Function,Symbol,BigInt");const Ir=e=>e[0]==="_"||e==="$stable",Wn=e=>M(e)?e.map(Ie):[Ie(e)],Oi=(e,t,n)=>{if(t._n)return t;const s=Go((...r)=>Wn(t(...r)),n);return s._c=!1,s},Mr=(e,t,n)=>{const s=e._ctx;for(const r in e){if(Ir(r))continue;const o=e[r];if(F(o))t[r]=Oi(r,o,s);else if(o!=null){const i=Wn(o);t[r]=()=>i}}},Or=(e,t)=>{const n=Wn(t);e.slots.default=()=>n},Pi=(e,t)=>{if(e.vnode.shapeFlag&32){const n=t._;n?(e.slots=L(t),Ut(t,"_",n)):Mr(t,e.slots={})}else e.slots={},t&&Or(e,t);Ut(e.slots,sn,1)},Fi=(e,t,n)=>{const{vnode:s,slots:r}=e;let o=!0,i=K;if(s.shapeFlag&32){const c=t._;c?n&&c===1?o=!1:($(r,t),!n&&c===1&&delete r._):(o=!t.$stable,Mr(t,r)),i=t}else t&&(Or(e,t),i={default:1});if(o)for(const c in r)!Ir(c)&&!(c in i)&&delete r[c]};function On(e,t,n,s,r=!1){if(M(e)){e.forEach((x,I)=>On(x,t&&(M(t)?t[I]:t),n,s,r));return}if(yt(s)&&!r)return;const o=s.shapeFlag&4?Xn(s.component)||s.component.proxy:s.el,i=r?null:o,{i:c,r:f}=e,u=t&&t.r,p=c.refs===K?c.refs={}:c.refs,b=c.setupState;if(u!=null&&u!==f&&(Z(u)?(p[u]=null,R(b,u)&&(b[u]=null)):oe(u)&&(u.value=null)),F(f))Ue(f,c,12,[i,p]);else{const x=Z(f),I=oe(f);if(x||I){const D=()=>{if(e.f){const N=x?R(b,f)?b[f]:p[f]:f.value;r?M(N)&&Sn(N,o):M(N)?N.includes(o)||N.push(o):x?(p[f]=[o],R(b,f)&&(b[f]=p[f])):(f.value=[o],e.k&&(p[e.k]=f.value))}else x?(p[f]=i,R(b,f)&&(b[f]=i)):I&&(f.value=i,e.k&&(p[e.k]=i))};i?(D.id=-1,ce(D,n)):D()}}}const ce=ri;function Si(e){return Ni(e)}function Ni(e,t){const n=mn();n.__VUE__=!0;const{insert:s,remove:r,patchProp:o,createElement:i,createText:c,createComment:f,setText:u,setElementText:p,parentNode:b,nextSibling:x,setScopeId:I=ve,insertStaticContent:D}=e,N=(l,a,d,g=null,h=null,y=null,w=!1,_=null,v=!!a.dynamicChildren)=>{if(l===a)return;l&&!nt(l,a)&&(g=Pt(l),Ae(l,h,y,!0),l=null),a.patchFlag===-2&&(v=!1,a.dynamicChildren=null);const{type:m,ref:E,shapeFlag:C}=a;switch(m){case nn:q(l,a,d,g);break;case Ne:Q(l,a,d,g);break;case dn:l==null&&V(a,d,g,w);break;case de:A(l,a,d,g,h,y,w,_,v);break;default:C&1?ee(l,a,d,g,h,y,w,_,v):C&6?z(l,a,d,g,h,y,w,_,v):(C&64||C&128)&&m.process(l,a,d,g,h,y,w,_,v,Ze)}E!=null&&h&&On(E,l&&l.ref,y,a||l,!a)},q=(l,a,d,g)=>{if(l==null)s(a.el=c(a.children),d,g);else{const h=a.el=l.el;a.children!==l.children&&u(h,a.children)}},Q=(l,a,d,g)=>{l==null?s(a.el=f(a.children||""),d,g):a.el=l.el},V=(l,a,d,g)=>{[l.el,l.anchor]=D(l.children,a,d,g,l.el,l.anchor)},X=({el:l,anchor:a},d,g)=>{let h;for(;l&&l!==a;)h=x(l),s(l,d,g),l=h;s(a,d,g)},O=({el:l,anchor:a})=>{let d;for(;l&&l!==a;)d=x(l),r(l),l=d;r(a)},ee=(l,a,d,g,h,y,w,_,v)=>{w=w||a.type==="svg",l==null?we(a,d,g,h,y,w,_,v):W(l,a,h,y,w,_,v)},we=(l,a,d,g,h,y,w,_)=>{let v,m;const{type:E,props:C,shapeFlag:T,transition:P,dirs:k}=l;if(v=l.el=i(l.type,y,C&&C.is,C),T&8?p(v,l.children):T&16&&S(l.children,v,null,g,h,y&&E!=="foreignObject",w,_),k&&$e(l,null,g,"created"),Ce(v,l,l.scopeId,w,g),C){for(const B in C)B!=="value"&&!Dt(B)&&o(v,B,null,C[B],y,l.children,g,h,Oe);"value"in C&&o(v,"value",null,C.value),(m=C.onVnodeBeforeMount)&&Te(m,g,l)}k&&$e(l,null,g,"beforeMount");const j=(!h||h&&!h.pendingBranch)&&P&&!P.persisted;j&&P.beforeEnter(v),s(v,a,d),((m=C&&C.onVnodeMounted)||j||k)&&ce(()=>{m&&Te(m,g,l),j&&P.enter(v),k&&$e(l,null,g,"mounted")},h)},Ce=(l,a,d,g,h)=>{if(d&&I(l,d),g)for(let y=0;y{for(let m=v;m{const _=a.el=l.el;let{patchFlag:v,dynamicChildren:m,dirs:E}=a;v|=l.patchFlag&16;const C=l.props||K,T=a.props||K;let P;d&&qe(d,!1),(P=T.onVnodeBeforeUpdate)&&Te(P,d,a,l),E&&$e(a,l,d,"beforeUpdate"),d&&qe(d,!0);const k=h&&a.type!=="foreignObject";if(m?U(l.dynamicChildren,m,_,d,g,k,y):w||H(l,a,_,null,d,g,k,y,!1),v>0){if(v&16)se(_,a,C,T,d,g,h);else if(v&2&&C.class!==T.class&&o(_,"class",null,T.class,h),v&4&&o(_,"style",C.style,T.style,h),v&8){const j=a.dynamicProps;for(let B=0;B{P&&Te(P,d,a,l),E&&$e(a,l,d,"updated")},g)},U=(l,a,d,g,h,y,w)=>{for(let _=0;_{if(d!==g){if(d!==K)for(const _ in d)!Dt(_)&&!(_ in g)&&o(l,_,d[_],null,w,a.children,h,y,Oe);for(const _ in g){if(Dt(_))continue;const v=g[_],m=d[_];v!==m&&_!=="value"&&o(l,_,m,v,w,a.children,h,y,Oe)}"value"in g&&o(l,"value",d.value,g.value)}},A=(l,a,d,g,h,y,w,_,v)=>{const m=a.el=l?l.el:c(""),E=a.anchor=l?l.anchor:c("");let{patchFlag:C,dynamicChildren:T,slotScopeIds:P}=a;P&&(_=_?_.concat(P):P),l==null?(s(m,d,g),s(E,d,g),S(a.children,d,E,h,y,w,_,v)):C>0&&C&64&&T&&l.dynamicChildren?(U(l.dynamicChildren,T,d,h,y,w,_),(a.key!=null||h&&a===h.subTree)&&Pr(l,a,!0)):H(l,a,d,E,h,y,w,_,v)},z=(l,a,d,g,h,y,w,_,v)=>{a.slotScopeIds=_,l==null?a.shapeFlag&512?h.ctx.activate(a,d,g,w,v):ae(a,d,g,h,y,w,v):ht(l,a,v)},ae=(l,a,d,g,h,y,w)=>{const _=l.component=zi(l,g,h);if(mr(l)&&(_.ctx.renderer=Ze),qi(_),_.asyncDep){if(h&&h.registerDep(_,te),!l.el){const v=_.subTree=xe(Ne);Q(null,v,a,d)}return}te(_,l,a,d,h,y,w)},ht=(l,a,d)=>{const g=a.component=l.component;if(ti(l,a,d))if(g.asyncDep&&!g.asyncResolved){J(g,a,d);return}else g.next=a,Jo(g.update),g.update();else a.el=l.el,g.vnode=a},te=(l,a,d,g,h,y,w)=>{const _=()=>{if(l.isMounted){let{next:E,bu:C,u:T,parent:P,vnode:k}=l,j=E,B;qe(l,!1),E?(E.el=k.el,J(l,E,w)):E=k,C&&cn(C),(B=E.props&&E.props.onVnodeBeforeUpdate)&&Te(B,P,E,k),qe(l,!0);const G=fn(l),me=l.subTree;l.subTree=G,N(me,G,b(me.el),Pt(me),l,h,y),E.el=G.el,j===null&&ni(l,G.el),T&&ce(T,h),(B=E.props&&E.props.onVnodeUpdated)&&ce(()=>Te(B,P,E,k),h)}else{let E;const{el:C,props:T}=a,{bm:P,m:k,parent:j}=l,B=yt(a);if(qe(l,!1),P&&cn(P),!B&&(E=T&&T.onVnodeBeforeMount)&&Te(E,j,a),qe(l,!0),C&&on){const G=()=>{l.subTree=fn(l),on(C,l.subTree,l,h,null)};B?a.type.__asyncLoader().then(()=>!l.isUnmounted&&G()):G()}else{const G=l.subTree=fn(l);N(null,G,d,g,l,h,y),a.el=G.el}if(k&&ce(k,h),!B&&(E=T&&T.onVnodeMounted)){const G=a;ce(()=>Te(E,j,G),h)}(a.shapeFlag&256||j&&yt(j.vnode)&&j.vnode.shapeFlag&256)&&l.a&&ce(l.a,h),l.isMounted=!0,a=d=g=null}},v=l.effect=new Dn(_,()=>zn(m),l.scope),m=l.update=()=>v.run();m.id=l.uid,qe(l,!0),m()},J=(l,a,d)=>{a.component=l;const g=l.vnode.props;l.vnode=a,l.next=null,Mi(l,a.props,g,d),Fi(l,a.children,d),dt(),us(),pt()},H=(l,a,d,g,h,y,w,_,v=!1)=>{const m=l&&l.children,E=l?l.shapeFlag:0,C=a.children,{patchFlag:T,shapeFlag:P}=a;if(T>0){if(T&128){Ot(m,C,d,g,h,y,w,_,v);return}else if(T&256){Ye(m,C,d,g,h,y,w,_,v);return}}P&8?(E&16&&Oe(m,h,y),C!==m&&p(d,C)):E&16?P&16?Ot(m,C,d,g,h,y,w,_,v):Oe(m,h,y,!0):(E&8&&p(d,""),P&16&&S(C,d,g,h,y,w,_,v))},Ye=(l,a,d,g,h,y,w,_,v)=>{l=l||rt,a=a||rt;const m=l.length,E=a.length,C=Math.min(m,E);let T;for(T=0;TE?Oe(l,h,y,!0,!1,C):S(a,d,g,h,y,w,_,v,C)},Ot=(l,a,d,g,h,y,w,_,v)=>{let m=0;const E=a.length;let C=l.length-1,T=E-1;for(;m<=C&&m<=T;){const P=l[m],k=a[m]=v?Be(a[m]):Ie(a[m]);if(nt(P,k))N(P,k,d,null,h,y,w,_,v);else break;m++}for(;m<=C&&m<=T;){const P=l[C],k=a[T]=v?Be(a[T]):Ie(a[T]);if(nt(P,k))N(P,k,d,null,h,y,w,_,v);else break;C--,T--}if(m>C){if(m<=T){const P=T+1,k=PT)for(;m<=C;)Ae(l[m],h,y,!0),m++;else{const P=m,k=m,j=new Map;for(m=k;m<=T;m++){const ue=a[m]=v?Be(a[m]):Ie(a[m]);ue.key!=null&&j.set(ue.key,m)}let B,G=0;const me=T-k+1;let et=!1,es=0;const gt=new Array(me);for(m=0;m=me){Ae(ue,h,y,!0);continue}let Ee;if(ue.key!=null)Ee=j.get(ue.key);else for(B=k;B<=T;B++)if(gt[B-k]===0&&nt(ue,a[B])){Ee=B;break}Ee===void 0?Ae(ue,h,y,!0):(gt[Ee-k]=m+1,Ee>=es?es=Ee:et=!0,N(ue,a[Ee],d,null,h,y,w,_,v),G++)}const ts=et?ki(gt):rt;for(B=ts.length-1,m=me-1;m>=0;m--){const ue=k+m,Ee=a[ue],ns=ue+1{const{el:y,type:w,transition:_,children:v,shapeFlag:m}=l;if(m&6){ze(l.component.subTree,a,d,g);return}if(m&128){l.suspense.move(a,d,g);return}if(m&64){w.move(l,a,d,Ze);return}if(w===de){s(y,a,d);for(let C=0;C_.enter(y),h);else{const{leave:C,delayLeave:T,afterLeave:P}=_,k=()=>s(y,a,d),j=()=>{C(y,()=>{k(),P&&P()})};T?T(y,k,j):j()}else s(y,a,d)},Ae=(l,a,d,g=!1,h=!1)=>{const{type:y,props:w,ref:_,children:v,dynamicChildren:m,shapeFlag:E,patchFlag:C,dirs:T}=l;if(_!=null&&On(_,null,d,l,!0),E&256){a.ctx.deactivate(l);return}const P=E&1&&T,k=!yt(l);let j;if(k&&(j=w&&w.onVnodeBeforeUnmount)&&Te(j,a,l),E&6)zr(l.component,d,g);else{if(E&128){l.suspense.unmount(d,g);return}P&&$e(l,null,a,"beforeUnmount"),E&64?l.type.remove(l,a,d,h,Ze,g):m&&(y!==de||C>0&&C&64)?Oe(m,a,d,!1,!0):(y===de&&C&384||!h&&E&16)&&Oe(v,a,d),g&&Gn(l)}(k&&(j=w&&w.onVnodeUnmounted)||P)&&ce(()=>{j&&Te(j,a,l),P&&$e(l,null,a,"unmounted")},d)},Gn=l=>{const{type:a,el:d,anchor:g,transition:h}=l;if(a===de){Yr(d,g);return}if(a===dn){O(l);return}const y=()=>{r(d),h&&!h.persisted&&h.afterLeave&&h.afterLeave()};if(l.shapeFlag&1&&h&&!h.persisted){const{leave:w,delayLeave:_}=h,v=()=>w(d,y);_?_(l.el,y,v):v()}else y()},Yr=(l,a)=>{let d;for(;l!==a;)d=x(l),r(l),l=d;r(a)},zr=(l,a,d)=>{const{bum:g,scope:h,update:y,subTree:w,um:_}=l;g&&cn(g),h.stop(),y&&(y.active=!1,Ae(w,l,a,d)),_&&ce(_,a),ce(()=>{l.isUnmounted=!0},a),a&&a.pendingBranch&&!a.isUnmounted&&l.asyncDep&&!l.asyncResolved&&l.suspenseId===a.pendingId&&(a.deps--,a.deps===0&&a.resolve())},Oe=(l,a,d,g=!1,h=!1,y=0)=>{for(let w=y;wl.shapeFlag&6?Pt(l.component.subTree):l.shapeFlag&128?l.suspense.next():x(l.anchor||l.el),Zn=(l,a,d)=>{l==null?a._vnode&&Ae(a._vnode,null,null,!0):N(a._vnode||null,l,a,null,null,null,d),us(),ar(),a._vnode=l},Ze={p:N,um:Ae,m:ze,r:Gn,mt:ae,mc:S,pc:H,pbc:U,n:Pt,o:e};let rn,on;return t&&([rn,on]=t(Ze)),{render:Zn,hydrate:rn,createApp:Ei(Zn,rn)}}function qe({effect:e,update:t},n){e.allowRecurse=t.allowRecurse=n}function Pr(e,t,n=!1){const s=e.children,r=t.children;if(M(s)&&M(r))for(let o=0;o>1,e[n[c]]0&&(t[s]=n[o-1]),n[o]=s)}}for(o=n.length,i=n[o-1];o-- >0;)n[o]=i,i=t[i];return n}const Ri=e=>e.__isTeleport,de=Symbol.for("v-fgt"),nn=Symbol.for("v-txt"),Ne=Symbol.for("v-cmt"),dn=Symbol.for("v-stc"),xt=[];let ye=null;function Mt(e=!1){xt.push(ye=e?null:[])}function Li(){xt.pop(),ye=xt[xt.length-1]||null}let Tt=1;function xs(e){Tt+=e}function Fr(e){return e.dynamicChildren=Tt>0?ye||rt:null,Li(),Tt>0&&ye&&ye.push(e),e}function Jn(e,t,n,s,r,o){return Fr(He(e,t,n,s,r,o,!0))}function Sr(e,t,n,s,r){return Fr(xe(e,t,n,s,r,!0))}function Nr(e){return e?e.__v_isVNode===!0:!1}function nt(e,t){return e.type===t.type&&e.key===t.key}const sn="__vInternal",kr=({key:e})=>e??null,jt=({ref:e,ref_key:t,ref_for:n})=>(typeof e=="number"&&(e=""+e),e!=null?Z(e)||oe(e)||F(e)?{i:le,r:e,k:t,f:!!n}:e:null);function He(e,t=null,n=null,s=0,r=null,o=e===de?0:1,i=!1,c=!1){const f={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&kr(t),ref:t&&jt(t),scopeId:en,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetAnchor:null,staticCount:0,shapeFlag:o,patchFlag:s,dynamicProps:r,dynamicChildren:null,appContext:null,ctx:le};return c?(Qn(f,n),o&128&&e.normalize(f)):n&&(f.shapeFlag|=Z(n)?8:16),Tt>0&&!i&&ye&&(f.patchFlag>0||o&6)&&f.patchFlag!==32&&ye.push(f),f}const xe=Di;function Di(e,t=null,n=null,s=0,r=null,o=!1){if((!e||e===_i)&&(e=Ne),Nr(e)){const c=Ge(e,t,!0);return n&&Qn(c,n),Tt>0&&!o&&ye&&(c.shapeFlag&6?ye[ye.indexOf(e)]=c:ye.push(c)),c.patchFlag|=-2,c}if(Vi(e)&&(e=e.__vccOpts),t){t=Bi(t);let{class:c,style:f}=t;c&&!Z(c)&&(t.class=Rn(c)),Y(f)&&(sr(f)&&!M(f)&&(f=$({},f)),t.style=Qt(f))}const i=Z(e)?1:si(e)?128:Ri(e)?64:Y(e)?4:F(e)?2:0;return He(e,t,n,s,r,i,o,!0)}function Bi(e){return e?sr(e)||sn in e?$({},e):e:null}function Ge(e,t,n=!1){const{props:s,ref:r,patchFlag:o,children:i}=e,c=t?Ui(s||{},t):s;return{__v_isVNode:!0,__v_skip:!0,type:e.type,props:c,key:c&&kr(c),ref:t&&t.ref?n&&r?M(r)?r.concat(jt(t)):[r,jt(t)]:jt(t):r,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:i,target:e.target,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==de?o===-1?16:o|16:o,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:e.transition,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&Ge(e.ssContent),ssFallback:e.ssFallback&&Ge(e.ssFallback),el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce}}function Hi(e=" ",t=0){return xe(nn,null,e,t)}function ji(e="",t=!1){return t?(Mt(),Sr(Ne,null,e)):xe(Ne,null,e)}function Ie(e){return e==null||typeof e=="boolean"?xe(Ne):M(e)?xe(de,null,e.slice()):typeof e=="object"?Be(e):xe(nn,null,String(e))}function Be(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:Ge(e)}function Qn(e,t){let n=0;const{shapeFlag:s}=e;if(t==null)t=null;else if(M(t))n=16;else if(typeof t=="object")if(s&65){const r=t.default;r&&(r._c&&(r._d=!1),Qn(e,r()),r._c&&(r._d=!0));return}else{n=32;const r=t._;!r&&!(sn in t)?t._ctx=le:r===3&&le&&(le.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else F(t)?(t={default:t,_ctx:le},n=32):(t=String(t),s&64?(n=16,t=[Hi(t)]):n=8);e.children=t,e.shapeFlag|=n}function Ui(...e){const t={};for(let n=0;nne||le;let Vn,tt,ws="__VUE_INSTANCE_SETTERS__";(tt=mn()[ws])||(tt=mn()[ws]=[]),tt.push(e=>ne=e),Vn=e=>{tt.length>1?tt.forEach(t=>t(e)):tt[0](e)};const at=e=>{Vn(e),e.scope.on()},Xe=()=>{ne&&ne.scope.off(),Vn(null)};pe("slot,component");function Rr(e){return e.vnode.shapeFlag&4}let It=!1;function qi(e,t=!1){It=t;const{props:n,children:s}=e.vnode,r=Rr(e);Ii(e,n,r,t),Pi(e,s);const o=r?Wi(e,t):void 0;return It=!1,o}function Wi(e,t){const n=e.type;e.accessCache=Object.create(null),e.proxy=rr(new Proxy(e.ctx,En));const{setup:s}=n;if(s){const r=e.setupContext=s.length>1?Qi(e):null;at(e),dt();const o=Ue(s,e,0,[e.props,r]);if(pt(),Xe(),Bs(o)){if(o.then(Xe,Xe),t)return o.then(i=>{Cs(e,i,t)}).catch(i=>{Gt(i,e,0)});e.asyncDep=o}else Cs(e,o,t)}else Lr(e,t)}function Cs(e,t,n){F(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:Y(t)&&(e.setupState=lr(t)),Lr(e,n)}let As;function Lr(e,t,n){const s=e.type;if(!e.render){if(!t&&As&&!s.render){const r=s.template||qn(e).template;if(r){const{isCustomElement:o,compilerOptions:i}=e.appContext.config,{delimiters:c,compilerOptions:f}=s,u=$($({isCustomElement:o,delimiters:c},i),f);s.render=As(r,u)}}e.render=s.render||ve}at(e),dt(),yi(e),pt(),Xe()}function Ji(e){return e.attrsProxy||(e.attrsProxy=new Proxy(e.attrs,{get(t,n){return fe(e,"get","$attrs"),t[n]}}))}function Qi(e){const t=n=>{e.exposed=n||{}};return{get attrs(){return Ji(e)},slots:e.slots,emit:e.emit,expose:t}}function Xn(e){if(e.exposed)return e.exposeProxy||(e.exposeProxy=new Proxy(lr(rr(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in vt)return vt[n](e)},has(t,n){return n in t||n in vt}}))}function Vi(e){return F(e)&&"__vccOpts"in e}const Xi=(e,t)=>$o(e,t,It),Gi=Symbol.for("v-scx"),Zi=()=>Ht(Gi),el="3.3.4",tl="http://www.w3.org/2000/svg",Qe=typeof document<"u"?document:null,Es=Qe&&Qe.createElement("template"),nl={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,s)=>{const r=t?Qe.createElementNS(tl,e):Qe.createElement(e,n?{is:n}:void 0);return e==="select"&&s&&s.multiple!=null&&r.setAttribute("multiple",s.multiple),r},createText:e=>Qe.createTextNode(e),createComment:e=>Qe.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>Qe.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,s,r,o){const i=n?n.previousSibling:t.lastChild;if(r&&(r===o||r.nextSibling))for(;t.insertBefore(r.cloneNode(!0),n),!(r===o||!(r=r.nextSibling)););else{Es.innerHTML=s?`${e}`:e;const c=Es.content;if(s){const f=c.firstChild;for(;f.firstChild;)c.appendChild(f.firstChild);c.removeChild(f)}t.insertBefore(c,n)}return[i?i.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}};function sl(e,t,n){const s=e._vtc;s&&(t=(t?[t,...s]:[...s]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}function rl(e,t,n){const s=e.style,r=Z(n);if(n&&!r){if(t&&!Z(t))for(const o in t)n[o]==null&&Pn(s,o,"");for(const o in n)Pn(s,o,n[o])}else{const o=s.display;r?t!==n&&(s.cssText=n):t&&e.removeAttribute("style"),"_vod"in e&&(s.display=o)}}const Ts=/\s*!important$/;function Pn(e,t,n){if(M(n))n.forEach(s=>Pn(e,t,s));else if(n==null&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const s=ol(e,t);Ts.test(n)?e.setProperty(ut(s),n.replace(Ts,""),"important"):e[s]=n}}const Is=["Webkit","Moz","ms"],pn={};function ol(e,t){const n=pn[t];if(n)return n;let s=ct(t);if(s!=="filter"&&s in e)return pn[t]=s;s=Us(s);for(let r=0;rhn||(dl.then(()=>hn=0),hn=Date.now());function hl(e,t){const n=s=>{if(!s._vts)s._vts=Date.now();else if(s._vts<=n.attached)return;ge(gl(s,n.value),t,5,[s])};return n.value=e,n.attached=pl(),n}function gl(e,t){if(M(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map(s=>r=>!r._stopped&&s&&s(r))}else return t}const Ps=/^on[a-z]/,ml=(e,t,n,s,r=!1,o,i,c,f)=>{t==="class"?sl(e,s,r):t==="style"?rl(e,n,s):qt(t)?Fn(t)||al(e,t,n,s,i):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):bl(e,t,s,r))?ll(e,t,s,o,i,c,f):(t==="true-value"?e._trueValue=s:t==="false-value"&&(e._falseValue=s),il(e,t,s,r))};function bl(e,t,n,s){return s?!!(t==="innerHTML"||t==="textContent"||t in e&&Ps.test(t)&&F(n)):t==="spellcheck"||t==="draggable"||t==="translate"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA"||Ps.test(t)&&Z(n)?!1:t in e}const Le="transition",mt="animation",Dr={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String},_l=$({},li,Dr),We=(e,t=[])=>{M(e)?e.forEach(n=>n(...t)):e&&e(...t)},Fs=e=>e?M(e)?e.some(t=>t.length>1):e.length>1:!1;function yl(e){const t={};for(const A in e)A in Dr||(t[A]=e[A]);if(e.css===!1)return t;const{name:n="v",type:s,duration:r,enterFromClass:o=`${n}-enter-from`,enterActiveClass:i=`${n}-enter-active`,enterToClass:c=`${n}-enter-to`,appearFromClass:f=o,appearActiveClass:u=i,appearToClass:p=c,leaveFromClass:b=`${n}-leave-from`,leaveActiveClass:x=`${n}-leave-active`,leaveToClass:I=`${n}-leave-to`}=e,D=vl(r),N=D&&D[0],q=D&&D[1],{onBeforeEnter:Q,onEnter:V,onEnterCancelled:X,onLeave:O,onLeaveCancelled:ee,onBeforeAppear:we=Q,onAppear:Ce=V,onAppearCancelled:S=X}=t,W=(A,z,ae)=>{De(A,z?p:c),De(A,z?u:i),ae&&ae()},U=(A,z)=>{A._isLeaving=!1,De(A,b),De(A,I),De(A,x),z&&z()},se=A=>(z,ae)=>{const ht=A?Ce:V,te=()=>W(z,A,ae);We(ht,[z,te]),Ss(()=>{De(z,A?f:o),Pe(z,A?p:c),Fs(ht)||Ns(z,s,N,te)})};return $(t,{onBeforeEnter(A){We(Q,[A]),Pe(A,o),Pe(A,i)},onBeforeAppear(A){We(we,[A]),Pe(A,f),Pe(A,u)},onEnter:se(!1),onAppear:se(!0),onLeave(A,z){A._isLeaving=!0;const ae=()=>U(A,z);Pe(A,b),Hr(),Pe(A,x),Ss(()=>{A._isLeaving&&(De(A,b),Pe(A,I),Fs(O)||Ns(A,s,q,ae))}),We(O,[A,ae])},onEnterCancelled(A){W(A,!1),We(X,[A])},onAppearCancelled(A){W(A,!0),We(S,[A])},onLeaveCancelled(A){U(A),We(ee,[A])}})}function vl(e){if(e==null)return null;if(Y(e))return[gn(e.enter),gn(e.leave)];{const t=gn(e);return[t,t]}}function gn(e){return Gr(e)}function Pe(e,t){t.split(/\s+/).forEach(n=>n&&e.classList.add(n)),(e._vtc||(e._vtc=new Set)).add(t)}function De(e,t){t.split(/\s+/).forEach(s=>s&&e.classList.remove(s));const{_vtc:n}=e;n&&(n.delete(t),n.size||(e._vtc=void 0))}function Ss(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let xl=0;function Ns(e,t,n,s){const r=e._endId=++xl,o=()=>{r===e._endId&&s()};if(n)return setTimeout(o,n);const{type:i,timeout:c,propCount:f}=Br(e,t);if(!i)return s();const u=i+"end";let p=0;const b=()=>{e.removeEventListener(u,x),o()},x=I=>{I.target===e&&++p>=f&&b()};setTimeout(()=>{p(n[D]||"").split(", "),r=s(`${Le}Delay`),o=s(`${Le}Duration`),i=ks(r,o),c=s(`${mt}Delay`),f=s(`${mt}Duration`),u=ks(c,f);let p=null,b=0,x=0;t===Le?i>0&&(p=Le,b=i,x=o.length):t===mt?u>0&&(p=mt,b=u,x=f.length):(b=Math.max(i,u),p=b>0?i>u?Le:mt:null,x=p?p===Le?o.length:f.length:0);const I=p===Le&&/\b(transform|all)(,|$)/.test(s(`${Le}Property`).toString());return{type:p,timeout:b,propCount:x,hasTransform:I}}function ks(e,t){for(;e.lengthRs(n)+Rs(e[s])))}function Rs(e){return Number(e.slice(0,-1).replace(",","."))*1e3}function Hr(){return document.body.offsetHeight}const jr=new WeakMap,Ur=new WeakMap,wl={name:"TransitionGroup",props:$({},_l,{tag:String,moveClass:String}),setup(e,{slots:t}){const n=$i(),s=ii();let r,o;return yr(()=>{if(!r.length)return;const i=e.moveClass||`${e.name||"v"}-move`;if(!Il(r[0].el,n.vnode.el,i))return;r.forEach(Al),r.forEach(El);const c=r.filter(Tl);Hr(),c.forEach(f=>{const u=f.el,p=u.style;Pe(u,i),p.transform=p.webkitTransform=p.transitionDuration="";const b=u._moveCb=x=>{x&&x.target!==u||(!x||/transform$/.test(x.propertyName))&&(u.removeEventListener("transitionend",b),u._moveCb=null,De(u,i))};u.addEventListener("transitionend",b)})}),()=>{const i=L(e),c=yl(i);let f=i.tag||de;r=o,o=t.default?gr(t.default()):[];for(let u=0;udelete e.mode;Cl(wl.props);function Al(e){const t=e.el;t._moveCb&&t._moveCb(),t._enterCb&&t._enterCb()}function El(e){Ur.set(e,e.el.getBoundingClientRect())}function Tl(e){const t=jr.get(e),n=Ur.get(e),s=t.left-n.left,r=t.top-n.top;if(s||r){const o=e.el.style;return o.transform=o.webkitTransform=`translate(${s}px,${r}px)`,o.transitionDuration="0s",e}}function Il(e,t,n){const s=e.cloneNode();e._vtc&&e._vtc.forEach(i=>{i.split(/\s+/).forEach(c=>c&&s.classList.remove(c))}),n.split(/\s+/).forEach(i=>i&&s.classList.add(i)),s.style.display="none";const r=t.nodeType===1?t:t.parentNode;r.appendChild(s);const{hasTransform:o}=Br(s);return r.removeChild(s),o}const Ml=$({patchProp:ml},nl);let Ls;function Ol(){return Ls||(Ls=Si(Ml))}const zl=(...e)=>{const t=Ol().createApp(...e),{mount:n}=t;return t.mount=s=>{const r=Pl(s);if(!r)return;const o=t._component;!F(o)&&!o.render&&!o.template&&(o.template=r.innerHTML),r.innerHTML="";const i=n(r,!1,r instanceof SVGElement);return r instanceof Element&&(r.removeAttribute("v-cloak"),r.setAttribute("data-v-app","")),i},t};function Pl(e){return Z(e)?document.querySelector(e):e}const Fl="https://s.afixer.app/fd-review",Sl="https://s.afixer.app/fd-issue",Nl="https://s.afixer.app/payme",$l="https://s.afixer.app/about",kl="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAeLSURBVHgB1Vk9iF1FFD7FFluk2GKLLSxekSKFxRYpLCxekWILiy0sUgi7RZAUwq5gIVi8B6ZIIewigoLIW9FCttmVBIKIPIiCRYQHBklgiTcSRSXFi/iLFuP57pyZOWfu3Pez7iZ4YNj33r0zc36+850zs0QnII6oy2OHx4iHkzHgsTRhTofHJubSkxAox6PHY6yUdm511blOJ3zfaZnbM3OIKjGmQ6ctovhO3HxpybntbeeGQ+fGYxcFv9evN+Z363kwst93bnMzN6R3aobwwlvR41BgZ8cqraXbDQYsZGv06/kwOEhVOTcY6MjVEaGTEsHrMHq81ysrDaV2d6PyY6JP87X+IHqlXgdRywWGYG0bkQ79FxHlq3pBKIZN8k0BBYFMGA85oT8hejpf702ip9iIHw2MSmtaaK3TcYQnrkbI5F7PNvmH6NcHRNe+InqVlXyGpy+2rYvnFdENk8hYKzfk4CA8H9G8Ip73ygPrWgAT8Ti8eZfoystEZ9mAs/zbNo8DiZpmqLHQLJ5tsqHn9tlBQ84JE5G9PbuX5MVxlK8ayiNhxevwOBQnz0rdmCOanbA5YIcBerXU6WROl9dYuUP0Tvwd8+B9wIu//0705Tz6kwsFScMG4RUl2GN33iM631AcisLgHApaRiP/jjUIUelgzZ/9ZwNNgeTMyvciJrXnJZTYgF8743QxguKaFmcVzBHGkjEAtPrsmHtEb/HnN17k7/Mo34kh1F5cX9fKLzrfJvj3SorDYPB6KFSgTHwGLEp146RqQFQMCwaxOEzKAwI5VDDPerQ88A6MycXWgIO5aoDxfhAoKEwDTo+wgfLak8C1wjRqAMLP4xLPu4jxBdFlTvq3fyE6MoaUakBywuzRKHpfoMP0+JLTPYzeFJQqCqEOIOGYHlfk/b6sO5DPXd7qzPtEz/1A9PnEGoBET8VxYmdb9j6wbaFT1e/ojQReYIqPiV5gjy+7Uofa7Dx7WPOIa8bEGoC9Um4MJxmwWb8EbwYRvmevrsXnmpnEQCgArztftSunO1TgHEoAYviM+c1kXTY1oBSNBKlOmwFD413BPjaR503viyLXiS443XJsbbV3qGFt2+fUyQonPAz1J4+GQJmfn28zYFwnYRDkAf/8E9FrEfva+8An//Yd0QdOV22dP5pKA4XmhohiMnqAFZLfREPeQaQpa82D8qsNBZXFMbk137OHgHtR3j/XVVv1SmaUcN6sAXU0Ym4omLZ5f72Bf44GFITFDmGFMkEE+0yHHxWTXyX2baJ3QaVIcNMi5ExmYQUobiMazGZrGDSFgZonJP7+N9NcxD8MCLiWjdi6553vPBN0VN3Y98nfE4Vq5sFvlW6jkejaEKyTIrdDswi/uGsMSAl8iOffh/MvvCbFir37gDy1Dk1yQyH+fuQNG0RGSkpVDMvLiIqhz/x4mUFqmgF7RgmBCBTAcxSl+0QfCubdI6Jb6ONlrmeNIEJ3aMhcqNgQRC87KqLzNPQJ6AXB++KMqUY0DABnKwNEcLpa5rFCigki+2QGRGIAGWjJKPRPotevEj1roqEhlYweTDcAilsIDWiK/BbwHPJDvMZRugCYFXEesK5ggloSkxy/B10gPh9vtyrBXrhSTww8DWVUDihDw8mrG377i3t2kz8JfiNAZGqbkKJRcc252ICUPAfjtRrAvc6leoLewCddpZRPlVbhUtoMD50gqTiNwN2No2KpaVOQ+obbi7wGlG43ojzyrYC9p0lYXhIDqviO8ho/WkBSmyioc3OA4k2mXFMHdMKGaKjrSJDEZ9wBo37gGoYmiXSQ1oupRQYddhoJmRTE7cJ60bsZzkGfpvvMD0TWiAM3qXgVonDLJGNioiEMrClUV2Ns5mEGWHXuhVwoQcTSJ868660Ji/3TwWg0sxFswNVGHqgWNhYz3W4k7I7282uRvCXOTlmNhNXrQjY25jPChY5Tw0g6UmASOIxR0K2y2giXWo0Kmytmo9FDwoYC2ciLtPaAZpEIIx3ShMnO3UC32ki7UeX8AWUJLXFrcbJYH5jOM6/GCU7T+6JvOeNj+IOku8khv7IYjcy9ZT2LsHfAJK3Moy7JBIJrrUYkY7en2bAQq6durhJ2e+hxihsFpTL6xPuGecBkAYL4q2oGe6hbXDsRBkZ3ogWREjVMrBc2TIWFAlPaBGyKOfE6JYdUgmDfwEkTSqrw1dQo4BaiwQzIi+SFbcDDKJS3CU1Y9QDB+9zVNoxIrQtgStd9H+UJQ+fjtIO9isK5yAwaStaIWqGpbQLmqOJk6DYYLg2g7neOwkEprKkSn0rn4lxu+tOWV7idQYZOzq9cJ65NrAEqYVEYY+GTAYeFM0ZAQv4OBlP1Ls0qkTYnn19jcjdqgA6/xTqgsoBzAJT8motoyw30Ir/Yx1ULhvwvYpHmkAXTIuQKlW+Ul1pPWRD//pjmkzPzKl42oqRQ86g4wBwTjTBH6BD/HKHHLaZHb7tRTjjvYo6hRHVHdDRDQToVAZdPTNbDw8jnYQ4OIqjGoNzj4vikpXyjrK4JccIrzENH+UQVz8W2z4kO6/si+r8IYIULXm4EbyDZ9/21y2OVfwFLnBT24EiP5gAAAABJRU5ErkJggg==",Rl=["width","height"],ql=$n({__name:"Logo",props:{width:{type:Number,default:32}},setup(e){return(t,n)=>(Mt(),Jn("img",{width:e.width,height:e.width,class:"logo",src:kl,alt:"logo"},null,8,Rl))}}),Ll=$n({__name:"StarRating",props:{fontSize:{type:String,default:"1.4rem"}},setup(e){const t=()=>{window.open(Sl,"_blank")},n=()=>{window.open(Fl,"_blank")},s=o=>{var c;let i=!1;(c=o.target.parentElement)==null||c.childNodes.forEach(f=>{i?f.style.opacity="0.3":f.style.opacity="1",i||(i=f===o.target)})},r=o=>{var i;(i=o.target.parentElement)==null||i.childNodes.forEach(c=>{c.style.opacity="1"})};return(o,i)=>(Mt(),Jn("div",{class:"stars",style:Qt({"font-size":o.$props.fontSize})},[He("div",{onMouseenter:s,onMouseleave:r,onClick:t},"★",32),He("div",{onMouseenter:s,onMouseleave:r,onClick:t},"★",32),He("div",{onMouseenter:s,onMouseleave:r,onClick:n},"★",32),He("div",{onMouseenter:s,onMouseleave:r,onClick:n},"★",32),He("div",{onMouseenter:s,onMouseleave:r,onClick:n},"★",32)],4))}});const Kr=(e,t)=>{const n=e.__vccOpts||e;for(const[s,r]of t)n[s]=r;return n},Wl=Kr(Ll,[["__scopeId","data-v-8900eb09"]]),Dl=["href"],Bl=$n({__name:"DonateButton",setup(e){const t=window.chrome,n=window.navigator.userAgent,s=n.indexOf("Safari")!==-1&&n.indexOf("Chrome")===-1&&n.indexOf("Edg/")===-1&&n.indexOf("OPR/")===-1&&n.indexOf("Firefox/")===-1;return(r,o)=>Bt(s)?ji("",!0):(Mt(),Jn("a",{key:0,class:"donate-btn",href:Bt(Nl),target:"_blank",rel:"noopener noreferrer"},[He("span",null,fo(Bt(t).i18n.getMessage("Donate")),1)],8,Dl))}});const Jl=Kr(Bl,[["__scopeId","data-v-8e466c1c"]]);async function Ql(e,t=!1){return new Promise(n=>{chrome.runtime.sendMessage({action:"getTabDetection",tabId:e,isIncognito:t},s=>{n(s)})})}async function Vl(e,t=Date.now()){return new Promise(n=>{chrome.runtime.sendMessage({action:"getHostDetection",host:e,upBound:t},s=>{n(s)})})}async function Xl(e){return new Promise(t=>{chrome.runtime.sendMessage({action:"removeHostStats",host:e},n=>{t(n)})})}async function Gl(){return new Promise(e=>{chrome.runtime.sendMessage({action:"getHostStats"},t=>{e(t)})})}function Zl(e,t=32){return`https://www.google.com/s2/favicons?domain=${e}&sz=${t}`}function ec(e){if(!e)return"";const t=new Date(e),n=t.getFullYear(),s=(t.getMonth()+1).toString().padStart(2,"0"),r=t.getDate().toString().padStart(2,"0"),o=t.getHours().toString().padStart(2,"0"),i=t.getMinutes().toString().padStart(2,"0"),c=t.getSeconds().toString().padStart(2,"0"),f=t.getMilliseconds().toString().padStart(3,"0");return`${n}-${s}-${r} ${o}:${i}:${c}.${f}`}function tc(e){let t=null;return n=>{t&&clearTimeout(t),t=setTimeout(n,e)}}export{jl as A,Ul as B,Jl as D,de as F,Wl as S,Kr as _,He as a,ji as b,Jn as c,$n as d,Hl as e,_r as f,Gl as g,Vl as h,xe as i,ql as j,Kl as k,Zl as l,tc as m,Rn as n,Mt as o,ec as p,$l as q,Yl as r,Xl as s,fo as t,Bt as u,zl as v,Go as w,Ql as x,Xi as y,Hi as z}; 2 | -------------------------------------------------------------------------------- /canvas/assets/chunk-7ce85519.js: -------------------------------------------------------------------------------- 1 | document.documentElement.setAttribute("randFingerprintInjected","true");if(!(ignoredSites=["https://www.google.com/maps","https://accounts.google.com","www.figma.com","www.canva.com","designer.microsoft.com","create.vista.com","console.aws.amazon.com","www.coze.com"].some(h=>window.location.href.startsWith(h)||window.location.host.endsWith(h)))){let h=function(n){window.dispatchEvent(new CustomEvent("chrome.runtime.sendMessage",{detail:n}))},y=function(n){var t;const e=[];for(let o=0;o1&&e.parentElement.offsetWidth>1&&e.offsetHeight>0&&e.offsetWidth>0&&e.style.display!=="none"&&e.style.visibility!=="hidden"&&e.style.opacity!=="0")return n.apply(e,t);if(t.length==0||t[0]==="image/png"){const i=e.width,f=e.height,d=e.getContext("2d",{willReadFrequently:!0});if(d!==null){const c=d.getImageData(0,0,i,f),u=Math.max(1,Math.floor(f/7)),w=Math.max(1,Math.floor(i/7));for(let v=0;v.9?t[1]=t[1]-g:t[1]=t[1]+g;const r=n.apply(e,t);return y({type:"CANVAS",occurredAt:Date.now(),canvas:r,canvasSize:e.width+"x"+e.height}),r},s=!!document.documentElement.getAttribute("data-afd-disabled");s&&document.documentElement.removeAttribute("data-afd-disabled"),window.addEventListener("afd-disabled",function(){document.documentElement.removeAttribute("data-afd-disabled"),s=!0},{once:!0}),h({action:"resetDetection",host:window.location.host});const A=(()=>{const n="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";return function(e){let t="";const o=n.length;for(let a=0;a1&&o.parentElement.offsetWidth>1&&o.offsetHeight>0&&o.offsetWidth>0&&o.style.display!=="none"&&o.style.visibility!=="hidden"&&o.style.opacity!=="0")return n.apply(e,t);let r=-1;if(t.length>0&&(t[0].length?r=0:t.length>1&&t[1].length&&(r=1)),r>=0){let i=0;for(let f=0;f<4;f++){for(;it[r].length)break;const d=t[r].constructor;let c=0;if(d==Float32Array)c=(Math.random()*.05+.1)*(Math.random()>.5?1:-1);else if(d==Int16Array||d==Int32Array||d==Uint16Array||d==Uint32Array){const u=Math.min(...t[r]),w=Math.max(...t[r]);c=Math.floor(Math.random()*(w-u+1))+u}t[r][i]+=c,i++}}return y({type:"WEBGL",occurredAt:Date.now()}),n.apply(e,t)};l("bufferData",WebGLRenderingContext.prototype,x),l("bufferData",WebGL2RenderingContext.prototype,x);{let n=function(a){return t?!0:(o.add(a),o.size>300?(t=!0,o.clear(),y({type:"FONT",occurredAt:Date.now()}),!0):!1)},e=function(a,r,i){try{return r===HTMLElement.prototype?void 0:s?Reflect.apply(a,r,i):r.tagName!=="IMG"&&r.childElementCount===0&&n(r.style.fontFamily)?Reflect.apply(a,r,i)+Math.random()*.1-.05:Reflect.apply(a,r,i)}catch{}},t=!1,o=new Set;Object.defineProperty(HTMLElement.prototype,"offsetHeight",{get:new Proxy(Object.getOwnPropertyDescriptor(HTMLElement.prototype,"offsetHeight").get,{apply(a,r,i){return e(a,r,i)}})}),Object.defineProperty(HTMLElement.prototype,"offsetWidth",{get:new Proxy(Object.getOwnPropertyDescriptor(HTMLElement.prototype,"offsetWidth").get,{apply(a,r,i){return e(a,r,i)}})})}l("getChannelData",AudioBuffer.prototype,function(n,e,t){const o=n.apply(e,t);if(s)return o;y({type:"AUDIO",occurredAt:Date.now()});for(let a=0;a=o.length&&(a=o.length-1),o[a]+=Math.random()*1e-7-5e-8;return o})} 2 | -------------------------------------------------------------------------------- /canvas/assets/chunk-aaea1190.js: -------------------------------------------------------------------------------- 1 | var t;if(ignoredSites=["https://www.google.com/maps","https://accounts.google.com","www.figma.com","www.canva.com","designer.microsoft.com","create.vista.com","console.aws.amazon.com","www.coze.com"].some(e=>window.location.href.startsWith(e)||window.location.host.endsWith(e)))chrome.runtime.sendMessage({action:"resetDetection"},function(){});else if(document.documentElement.getAttribute("randFingerprintInjected")===null){chrome.runtime.sendMessage({action:"resetDetection"},function(){});try{(t=window.top)==null||t.postMessage("injectFrameFingerprint","*")}catch{}}else document.documentElement.removeAttribute("randFingerprintInjected");window.location.host&&chrome.runtime.sendMessage({action:"scriptLoaded",host:window.location.host},function(){}); 2 | -------------------------------------------------------------------------------- /canvas/assets/chunk-b4410958.js: -------------------------------------------------------------------------------- 1 | const D={enable:chrome.runtime.getURL("img/icon-32.png"),disable:chrome.runtime.getURL("img/icon-32-disabled.png")};async function m(){var e;const t=await chrome.tabs.query({active:!0,currentWindow:!0}),o=t==null?void 0:t[0];if(!o)return;if(!o.url||!o.url.match(/^https?:\/\//)){chrome.action.setIcon({path:D.disable,tabId:o.id});return}const n=(e=o.url.match(/^https?:\/\/([^\/]+)/))==null?void 0:e[1];if(!n){chrome.action.setIcon({path:D.disable,tabId:o.id});return}const i="disabled:"+n;if((await chrome.storage.sync.get([i]))[i]){chrome.action.setIcon({path:D.disable,tabId:o.id});return}chrome.action.setIcon({path:D.enable,tabId:o.id})}let u=null,f=null,I=!1;function g(t){if(I)return;I=!0;const o=new Promise((i,r)=>{const e=indexedDB.open("db",4);e.onupgradeneeded=function(){if(!e.result.objectStoreNames.contains("detections")){let c=e.result.createObjectStore("detections",{keyPath:"key"});c.createIndex("tabId",["tab.id","updatedAt"],{unique:!1}),c.createIndex("host",["host","updatedAt"],{unique:!1}),c.createIndex("updatedAt","updatedAt",{unique:!1})}},e.onsuccess=function(){u=e.result,i(null)}}),n=new Promise((i,r)=>{const e=indexedDB.open("stats",2);e.onupgradeneeded=function(){e.result.objectStoreNames.contains("stats")||e.result.createObjectStore("stats",{keyPath:"host"}).createIndex("updatedAt","updatedAt",{unique:!1})},e.onsuccess=function(){f=e.result,i(null)}});Promise.all([o,n]).then(()=>{I=!1,A(),setInterval(A,1e3*60*60*1),t&&t()})}function A(){if(!u)return;const t=u.transaction("detections","readwrite"),o=t.objectStore("detections").index("updatedAt").openCursor(null,"next");o.onsuccess=function(n){const i=o.result;i&&i.value.updatedAt{S(t,o,n,i,r)})}async function x(t,o=!1){return o?new Promise(n=>{chrome.storage.session.get(["detections:"+t],function(i){if(i){const r=i["detections:"+t]||[];n(r)}else n([])})}):new Promise(n=>{chrome.storage.session.get(["tab-started:"+t],function(i){const r=i["tab-started:"+t];if(!r){n([]);return}const e=function(){if(!u)return;const c=u.transaction("detections","readonly"),s=c.objectStore("detections").index("tabId").openCursor(IDBKeyRange.bound([t,r],[t,Date.now()]),"prev"),a=[];s.onsuccess=function(h){const l=s.result;l?(a.push(l.value),l.continue()):(c.abort(),n(a))},s.onerror=function(h){c.abort(),n([])}};u?e():g(()=>{e()})})})}async function j(t,o=Date.now()){return new Promise(n=>{const i=function(){if(!u)return;const r=u.transaction("detections","readonly"),e=r.objectStore("detections").index("host").openCursor(IDBKeyRange.bound([t,0],[t,o]),"prev"),c=[];e.onsuccess=function(s){const a=e.result;if(a){if(c.push(a.value),c.length>=5){r.abort(),n(c);return}a.continue()}else r.abort(),n(c)},e.onerror=function(s){r.abort(),n([])}};u?i():g(()=>{i()})})}async function k(t){if(!f||!u)return;const o=f.transaction("stats","readwrite"),i=o.objectStore("stats").delete(t);i.onsuccess=function(s){o.commit()},i.onerror=function(s){o.abort()};const r=u.transaction("detections","readwrite"),c=r.objectStore("detections").index("host").openCursor(t);c.onsuccess=function(s){const a=c.result;a?(a.delete(),a.continue()):r.commit()},c.onerror=function(s){r.abort()}}async function L(){return new Promise(t=>{f?o():g(()=>{o()});function o(){if(!f)return;const n=f.transaction("stats","readonly"),i=n.objectStore("stats").index("updatedAt").openCursor(null,"prev"),r=[];i.onsuccess=function(e){const c=i.result;c?(r.push(c.value),c.continue()):(n.abort(),t(r))},i.onerror=function(e){n.abort(),t([])}}})}chrome.runtime.onStartup.addListener(function(){g(),m(),chrome.storage.local.get(["reload"],function(t){t.reload&&chrome.storage.local.remove(["reload"]).then(()=>{chrome.tabs.query({active:!0,currentWindow:!0}).then(o=>{o.forEach(n=>{chrome.tabs.reload(n.id)})})})})});chrome.tabs.onActivated.addListener(function(){m()});const P=function(t,o,n){var i,r;if(!t||!t.action)return n({result:"no action"}),!0;if(t.action==="setDisabled"){const e="disabled:"+t.host;return t.disabled?(chrome.storage.sync.set({[e]:t.disabled},()=>{m().then(()=>{n({result:"ok"})}).catch(c=>{n({result:"error"})})}),!0):(chrome.storage.sync.remove(e,()=>{m().then(()=>{n({result:"ok"})}).catch(c=>{n({result:"error"})})}),!0)}if(t.action==="getDisabled"){const e="disabled:"+t.host;return chrome.storage.sync.get([e],function(c){n({disabled:c[e]})}),!0}if(t.action==="getWhiteList")return chrome.storage.sync.get(null,function(e){const c=[];Object.keys(e).sort().forEach(s=>{s.startsWith("disabled:")&&c.push(s.replace("disabled:",""))}),n({whiteList:c})}),!0;if(t.action==="scriptLoaded"){const e=(i=o.tab)==null?void 0:i.id;return e&&chrome.storage.session.get(["hosts:"+e],function(c){const s=c["hosts:"+e]||[];s.includes(t.host)||(s.push(t.host),chrome.storage.session.set({["hosts:"+e]:s}).then(()=>{}))}),!0}if(t.action==="getHosts"){const e=t.tabID;return e&&chrome.storage.session.get(["hosts:"+e],function(c){const s=c["hosts:"+e]||[];n({hosts:s})}),!0}return t.action==="resetDetection"?o.frameId?(n({result:"ok"}),!0):(o.tab&&o.tab.id&&(chrome.storage.session.remove(["hosts:"+o.tab.id]).then(()=>{}),chrome.storage.session.set({["tab-started:"+o.tab.id]:Date.now()}),o.tab.incognito&&chrome.storage.session.remove("detections:"+o.tab.id)),m().then(()=>{var e;chrome.action.setBadgeText({text:"",tabId:(e=o.tab)==null?void 0:e.id}),n({result:"ok"})}).catch(e=>{n({result:"error"})}),!0):t.action==="setDetected"?o.tab?(o.tab,chrome.action.setBadgeText({text:"!",tabId:o.tab.id}),chrome.action.setBadgeBackgroundColor({color:"#FF0000",tabId:(r=o.tab)==null?void 0:r.id}),v(o.documentId,t.src,t.origins,t.detection,o.tab),chrome.storage.sync.get("totalDetected",function(e){const c=e.totalDetected||0;chrome.storage.sync.set({totalDetected:c+1})}),n({result:"ok"}),!0):!1:t.action==="getTabDetection"?(x(t.tabId,t.isIncognito).then(e=>{n(e)}).catch(e=>{n([])}),!0):t.action==="getHostDetection"?(j(t.host,t.upBound).then(e=>{n(e)}).catch(e=>{n([])}),!0):t.action==="removeHostStats"?(k(t.host).finally(()=>{n()}),!0):t.action==="getHostStats"?(L().then(e=>{n(e)}).catch(e=>{n([])}),!0):!1};chrome.runtime.onMessage.hasListeners()||chrome.runtime.onMessage.addListener(P); 2 | -------------------------------------------------------------------------------- /canvas/assets/chunk-dfed3562.js: -------------------------------------------------------------------------------- 1 | import{d as N,o as c,c as d,a as e,r as j,b as _,_ as W,e as v,g as O,f as R,h as $,i as w,w as q,j as P,t,u as n,S as J,D as K,n as M,F as C,k as L,m as Q,l as S,p as H,q as X,s as Y,v as Z}from"./chunk-3a7b59dd.js";const ee=N({__name:"Modal",props:{show:{type:Boolean,default:!1}},emits:["close"],setup(T){return(a,h)=>T.show?(c(),d("div",{key:0,class:"modal",onClick:h[1]||(h[1]=b=>a.$emit("close"))},[e("div",{class:"modal-content",onClick:h[0]||(h[0]=b=>b.stopPropagation())},[j(a.$slots,"default",{},void 0,!0)])])):_("",!0)}});const te=W(ee,[["__scopeId","data-v-e3ce65c1"]]),se={key:0,class:"modal-body"},oe={class:"modal-title"},ae={class:"title"},ne=["src"],ie=["href"],le={class:"section-title"},ce={class:"prevented-fingerprints"},de={key:0,class:"stat-number"},ue={class:"label"},re={class:"number"},_e={key:1,class:"stat-number"},ve={class:"label"},he={class:"number"},ge={key:2,class:"stat-number"},pe={class:"label"},me={class:"number"},be={key:3,class:"stat-number"},ye={class:"label"},fe={class:"number"},ke={key:4,class:"stat-number"},we={class:"label"},Me={class:"number"},Ce={key:0,class:"section-title"},Le={class:"info"},Se={key:0},Te=["src"],Be={class:"layout"},De={class:"header"},Ae={class:"description"},Oe=["href"],$e={class:"shadow-text"},He={class:"top-content"},Ne={class:"top-content-col"},We={class:"card-title"},Fe={class:"total-number"},xe={class:"top-content-col"},ze={class:"card-title"},Ve={class:"total-number"},Ie={class:"tabs"},Ue={class:"table-header row"},Ee={class:"header-host"},Ge={class:"header-count"},je={class:"updated-at-col"},Re={class:"hidden-small white-list-col"},qe={class:"delete-col"},Pe={class:"table-body"},Je=["onClick"],Ke=["src"],Qe={class:"updated-at-col"},Xe={class:"hidden-small white-list-col"},Ye=["onClick","title"],Ze={key:1},et={class:"delete-col"},tt=["onClick"],st={class:"table-header row"},ot={class:"header-host"},at={class:"delete-col"},nt={class:"table-body"},it={class:"row-host"},lt=["src"],ct={class:"delete-col"},dt=["onClick"],ut=N({__name:"Options",setup(T){const a=window.chrome,h=a.i18n.getMessage("ExtensionName");document.title=h;const b=v(0),y=v([]),g=v([]);function F(s){a.runtime.sendMessage({action:"setDisabled",host:s,disabled:!1},()=>{})}let x=Q(300);a.storage.sync.onChanged.addListener(s=>{for(const i in s)if(i.startsWith("disabled:")){const o=i.slice(9);if(s[i].newValue){const u=g.value.concat(o);g.value=u.sort()}else g.value=g.value.filter(u=>u!==o)}else i==="totalDetected"&&x(()=>{b.value=s.totalDetected.newValue||0,O().then(o=>{var r;y.value=o||[],k.value&&o.length&&o[0].host===((r=l.value)==null?void 0:r.host)&&D(o[0])})})}),R(async()=>{a.storage.sync.get("totalDetected",s=>{b.value=s.totalDetected||0}),a.runtime.sendMessage({action:"getWhiteList"},s=>{s&&(g.value=s.whiteList)}),a.storage.session.get("activeTab",s=>{s.activeTab&&(p.value=s.activeTab)}),O().then(s=>{y.value=s})});const p=v("stats"),B=s=>{s!==p.value&&(a.storage.session.set({activeTab:s}),p.value=s)};function z(s){Y(s),y.value=y.value.filter(i=>i.host!==s)}function V(s){a.runtime.sendMessage({action:"setDisabled",host:s,disabled:!0},()=>{})}const k=v(!1),l=v(null),m=v([]),f=v(0);function D(s){l.value=s,$(s.host).then(i=>{const o=[];for(const r of i)o.push(...r.detections);i.length?f.value=i[i.length-1].updatedAt-1:f.value=0,m.value=o}),k.value=!0}function I(){k.value=!1,l.value=null,m.value=[],f.value=0}function U(s){const i=s.target;i.scrollTop+i.clientHeight>=i.scrollHeight&&E()}function E(){!l.value||!l.value.host||!f.value||$(l.value.host,f.value-1).then(s=>{const i=[];for(const o of s)i.push(...o.detections),f.value=o.updatedAt;m.value=m.value.concat(i)})}const G=s=>{const i=s.target;window.open("about:blank").document.write("from canvas")};return(s,i)=>(c(),d(C,null,[w(te,{show:k.value,onClose:I},{default:q(()=>{var o,r;return[l.value?(c(),d("div",se,[e("div",oe,[e("div",ae,[e("img",{class:"host-img",loading:"lazy",src:n(S)(l.value.host,32),width:"32",height:"32"},null,8,ne),e("a",{href:"https://"+l.value.host,target:"_blank",rel:"noopener noreferrer"},t(l.value.host)+" ⧉ ",9,ie)]),e("button",{class:"btn close",onClick:i[0]||(i[0]=u=>k.value=!1)},"x")]),e("div",le,t(n(a).i18n.getMessage("NumberOfFingerprints")),1),e("div",ce,[Object.keys(l.value.countByType).filter(u=>{var A;return(A=l.value)==null?void 0:A.countByType[u]}).length>1?(c(),d("div",de,[e("div",ue,t(n(a).i18n.getMessage("Total")),1),e("div",re,t(l.value.count.toLocaleString()),1)])):_("",!0),l.value.countByType.AUDIO?(c(),d("div",_e,[e("div",ve,t(n(a).i18n.getMessage("Audio")),1),e("div",he,t(l.value.countByType.AUDIO.toLocaleString()),1)])):_("",!0),l.value.countByType.CANVAS?(c(),d("div",ge,[e("div",pe,t(n(a).i18n.getMessage("Canvas")),1),e("div",me,t(l.value.countByType.CANVAS.toLocaleString()),1)])):_("",!0),l.value.countByType.FONT?(c(),d("div",be,[e("div",ye,t(n(a).i18n.getMessage("Font")),1),e("div",fe,t(l.value.countByType.FONT.toLocaleString()),1)])):_("",!0),l.value.countByType.WEBGL?(c(),d("div",ke,[e("div",we,t(n(a).i18n.getMessage("WebGL")),1),e("div",Me,t(l.value.countByType.WEBGL.toLocaleString()),1)])):_("",!0)]),(o=m.value)!=null&&o.length?(c(),d("div",Ce,t(n(a).i18n.getMessage("History"))+" ("+t(n(a).i18n.getMessage("Last30Days"))+") ",1)):_("",!0),(r=m.value)!=null&&r.length?(c(),d("div",{key:1,onScroll:U,class:"history"},[(c(!0),d(C,null,L(m.value,u=>(c(),d("div",{class:"history-row",key:u.occurredAt},[e("div",Le,[e("span",null,t(n(H)(u.occurredAt)),1),u.canvasSize?(c(),d("span",Se,"("+t(u.canvasSize)+")",1)):_("",!0),e("span",null,t(u.type),1)]),u.canvas?(c(),d("img",{key:0,class:"canvas",onClick:G,src:u.canvas},null,8,Te)):_("",!0)]))),128))],32)):_("",!0)])):_("",!0)]}),_:1},8,["show"]),e("main",Be,[e("div",De,[e("div",null,[w(P,{width:48}),e("div",Ae,[e("span",null,t(n(h)),1),e("a",{target:"_blank",href:n(X)},t(n(a).i18n.getMessage("MakeBy")),9,Oe)])]),e("div",null,[e("span",$e,t(n(a).i18n.getMessage("RateUs")),1),w(J,{"font-size":"1.4rem"}),w(K)])]),e("div",He,[e("div",Ne,[e("div",We,t(n(a).i18n.getMessage("NumberOfFingerprints")),1),e("div",Fe,t(b.value.toLocaleString()),1)]),e("div",xe,[e("div",ze,t(n(a).i18n.getMessage("NumberOfHosts")),1),e("div",Ve,t(y.value.length.toLocaleString()),1)])]),e("div",Ie,[e("div",{class:M(["tab-item",p.value=="stats"?"active":"inactive"]),onClick:i[1]||(i[1]=o=>B("stats"))}," Statistics ",2),e("div",{class:M(["tab-item",p.value=="white-list"?"active":"inactive"]),onClick:i[2]||(i[2]=o=>B("white-list"))}," White list ",2)]),e("div",{class:M(["body",p.value=="stats"?"show":"hide"])},[e("div",Ue,[e("div",Ee,t(n(a).i18n.getMessage("Host")),1),e("div",Ge,t(n(a).i18n.getMessage("Count")),1),e("div",je,t(n(a).i18n.getMessage("UpdatedAt")),1),e("div",Re,t(n(a).i18n.getMessage("WhiteList")),1),e("div",qe,t(n(a).i18n.getMessage("Delete")),1)]),e("div",Pe,[(c(!0),d(C,null,L(y.value,o=>(c(),d("div",{key:o.host,class:"row data-row"},[e("div",{class:"row-host clickable",onClick:r=>D(o)},[e("img",{class:"host-img",loading:"lazy",src:n(S)(o.host,24),width:"24",height:"24"},null,8,Ke),e("span",null,t(o.host),1)],8,Je),e("div",null,t(o.count.toLocaleString()),1),e("div",Qe,t(n(H)(o.updatedAt).slice(0,19)),1),e("div",Xe,[g.value.includes(o.host)?(c(),d("span",Ze,t(n(a).i18n.getMessage("Added")),1)):(c(),d("button",{key:0,class:"btn add-btn",onClick:r=>V(o.host),title:n(a).i18n.getMessage("AddToWhiteList")},t(n(a).i18n.getMessage("Add")),9,Ye))]),e("div",et,[e("button",{class:"btn delete-btn",onClick:r=>z(o.host)},"✖",8,tt)])]))),128))])],2),e("div",{class:M(["body",p.value=="white-list"?"show":"hide"])},[e("div",st,[e("div",ot,t(n(a).i18n.getMessage("Host")),1),e("div",at,t(n(a).i18n.getMessage("Delete")),1)]),e("div",nt,[(c(!0),d(C,null,L(g.value,o=>(c(),d("div",{key:o,class:"row data-row"},[e("div",it,[e("img",{class:"host-img",loading:"lazy",src:n(S)(o,24),width:"24",height:"24"},null,8,lt),e("span",null,t(o),1)]),e("div",ct,[e("button",{class:"btn delete-btn",onClick:r=>F(o)},"✖",8,dt)])]))),128))])],2)])],64))}});const rt=W(ut,[["__scopeId","data-v-40977f35"]]);Z(rt).mount("#app"); 2 | -------------------------------------------------------------------------------- /canvas/assets/debounce-09920c81.css: -------------------------------------------------------------------------------- 1 | :root{--main-font: "Roboto", system-ui, sans-serif;--main-font-size: 13px;--main-font-weight: 400;--main-bold-font-weight: 600;--button-font-weight: 500}@media (prefers-color-scheme: dark){:root{--primary-color: rgb(232, 234, 237);--inactive-primary-color: rgb(175, 176, 178);--primary-background-color: rgb(32, 33, 36);--body-background-color: rgb(32, 33, 36);--none-interactive-background-color: rgba(51, 52, 56, .5);--active-background-color: rgb(72, 72, 76);--inactive-background-color: rgb(48, 48, 48);--link-color: rgb(138, 180, 248);--border-color: rgb(95, 99, 104);--light-border-color: rgb(95, 99, 104, .5);--button-color: rgb(138, 180, 248);--hover-background-color: rgba(138, 180, 248, .08);--hover-border-color: rgb(95, 99, 104);--card-background-color: rgb(51, 52, 56);--card-shadow: rgba(0, 0, 0, .3) 0px 1px 2px 0px, rgba(0, 0, 0, .15) 0px 2px 6px 2px;--color-red: #ff3d3d}}@media (prefers-color-scheme: light){:root{--primary-color: rgb(32, 33, 36);--inactive-primary-color: rgb(90, 93, 101);--primary-background-color: rgb(255, 255, 255);--body-background-color: rgb(233, 233, 233);--none-interactive-background-color: rgba(224, 224, 224, .5);--active-background-color: rgb(227 240 255);--inactive-background-color: rgba(224, 224, 224, .7);--link-color: rgb(25, 103, 210);--border-color: rgb(218, 220, 224);--light-border-color: rgb(218, 220, 224, .5);--button-color: rgb(26, 115, 232);--hover-background-color: rgba(66, 133, 244, .04);--hover-border-color: rgb(210, 227, 252);--card-background-color: rgb(255, 255, 255);--card-shadow: rgba(60, 64, 67, .3) 0px 1px 2px 0px, rgba(60, 64, 67, .15) 0px 2px 6px 2px;--color-red: #db3434}}:root,body{font-family:var(--main-font);font-size:var(--main-font-size);font-weight:var(--main-font-weight);color:var(--primary-color);background-color:var(--body-background-color);white-space:nowrap}a{color:var(--link-color);font-family:var(--main-font)}a:hover{filter:brightness(120%)}@media (prefers-color-scheme: dark){:root{--scroll-bar-color: rgb(70, 70, 70)}}@media (prefers-color-scheme: light){:root{--scroll-bar-color: rgb(200, 200, 200)}}*{scrollbar-width:thin;scrollbar-color:transparent transparent}::-webkit-scrollbar{width:6px}::-webkit-scrollbar-track{background:transparent}::-webkit-scrollbar-thumb{background-color:var(--scroll-bar-color);border-radius:20px}.stars[data-v-8900eb09]{display:flex;flex-direction:row;align-items:center;justify-content:center;gap:2px;text-shadow:0 0 2px #f3e2a2;user-select:none;-webkit-user-select:none}.stars>*[data-v-8900eb09]{cursor:pointer;color:#f1c40f;opacity:1;padding:2px;margin:-2px}.stars>*[data-v-8900eb09] :hover{color:#f1c40f}.donate-btn[data-v-8e466c1c]{background-image:linear-gradient(115deg,#4fcf70,#fad648,#a767e5,#12bcfe,#44ce7b);border-radius:5px;color:#fff;overflow:hidden;text-decoration:none;box-shadow:0 3px 3px var(--primary-color)}.donate-btn span[data-v-8e466c1c]{background:#000;border-radius:3px;display:block;font-family:Arial,sans-serif;font-weight:700;line-height:20px;margin:3px;padding:0 5px}.donate-btn[data-v-8e466c1c]:hover{animation:play-8e466c1c .5s ease-in infinite}@keyframes play-8e466c1c{0%{background-position:0px}20%{background-position:-12.4px}40%{background-position:-24.8px}60%{background-position:-37.2px}80%{background-position:-49.6px}to{background-position:-62px}} 2 | -------------------------------------------------------------------------------- /canvas/assets/options-fe2fb5aa.css: -------------------------------------------------------------------------------- 1 | body{width:100vw;height:100vh;display:block;overflow:hidden;padding:0;margin:0}@media (prefers-color-scheme: dark){:root{--scroll-bar-color: rgb(70, 70, 70)}}@media (prefers-color-scheme: light){:root{--scroll-bar-color: rgb(200, 200, 200)}}*{scrollbar-width:thin;scrollbar-color:transparent transparent}::-webkit-scrollbar{width:6px}::-webkit-scrollbar-track{background:transparent}::-webkit-scrollbar-thumb{background-color:var(--scroll-bar-color);border-radius:20px}.modal[data-v-e3ce65c1]{position:fixed;top:0;left:0;z-index:999;width:100%;height:100%;background-color:#00000080}.modal-content[data-v-e3ce65c1]{position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);background-color:var(--card-background-color);box-shadow:var(--card-shadow);padding:1rem;border-radius:.5rem}.modal-body[data-v-40977f35]{max-height:75vh;width:436px;display:flex;flex-direction:column}.modal-body .section-title[data-v-40977f35]{font-size:1.3rem;margin:20px 0 10px}.modal-body .prevented-fingerprints[data-v-40977f35]{display:flex;flex-direction:row;align-items:center;justify-content:center;gap:10px;flex-wrap:wrap}.modal-body .stat-number[data-v-40977f35]{min-width:56px;padding:4px;border:1px solid var(--border-color);border-radius:10px;box-shadow:var(--card-shadow);background-color:var(--card-background-color);display:flex;flex-direction:column;align-items:center;justify-content:center;gap:4px}.modal-body .stat-number .number[data-v-40977f35]{font-size:1.4rem;font-weight:700;color:var(--color-red)}.modal-body .history[data-v-40977f35]{flex:1;overflow:auto;border:1px solid var(--border-color);display:block}.modal-body .history-row[data-v-40977f35]{display:flex;flex-direction:column;align-items:center;padding:10px 0;font-weight:600;box-shadow:var(--card-shadow)}.modal-body .history-row .info[data-v-40977f35]{width:100%;padding:4px 10px;display:flex;box-sizing:border-box;justify-content:space-between}.modal-body .canvas[data-v-40977f35]{margin-top:8px;cursor:pointer;max-width:400px;max-height:300px;border:1px solid var(--border-color);background-color:#fff;image-rendering:pixelated}.modal-title[data-v-40977f35]{display:flex;flex-direction:row;align-items:center}.modal-title .title[data-v-40977f35]{flex-grow:1;display:flex;flex-direction:row;align-items:center;gap:8px;font-size:1.2rem;justify-content:flex-start}.modal-title .title a[data-v-40977f35]{max-width:320px;text-overflow:ellipsis;overflow:hidden}.modal-title .close[data-v-40977f35]{line-height:21px;width:24px}.white-list-col[data-v-40977f35]{width:65px;text-align:center;display:flex;align-items:center;justify-content:center}.delete-col[data-v-40977f35]{width:50px;text-align:center;display:flex;align-items:center;justify-content:center}.show[data-v-40977f35]{display:flex}.hide[data-v-40977f35]{display:none}.tabs[data-v-40977f35]{display:flex;flex-direction:row;align-items:center;justify-content:center;width:100%;box-shadow:var(--card-shadow);border-top-left-radius:10px;border-top-right-radius:10px}.tabs .tab-item[data-v-40977f35]:nth-child(1){border-top-left-radius:10px}.tabs .tab-item[data-v-40977f35]:nth-last-child(1){border-top-right-radius:10px}.tab-item[data-v-40977f35]{flex:1;cursor:pointer;user-select:none;-webkit-user-select:none;padding:0;font-size:1.2em;font-weight:700;display:flex;align-content:center;justify-content:center;line-height:40px;box-sizing:border-box;border-bottom:2px solid transparent}.tab-item[data-v-40977f35]:hover{background-color:var(--hover-background-color)}.tab-item.active[data-v-40977f35]{border-bottom:2px solid var(--button-color);background-color:var(--active-background-color);color:var(--primary-color)}.tab-item.inactive[data-v-40977f35]{border-bottom:2px solid transparent;background-color:var(--inactive-background-color);color:var(--inactive-primary-color)}.layout[data-v-40977f35]{box-sizing:border-box;padding:20px;margin:auto;max-width:800px;height:100vh;display:flex;flex-direction:column;white-space:nowrap;font-family:var(--main-font);font-size:var(--main-font-size)}.header[data-v-40977f35]{display:flex;flex-direction:row;padding:0;margin:0 0 20px;width:100%;justify-content:space-between;align-items:center;white-space:nowrap;gap:10px}@media screen and (max-width: 660px){.header[data-v-40977f35]{flex-direction:column;margin-bottom:10px}}.header>div[data-v-40977f35]:first-child{display:flex;align-items:center;justify-content:center;flex-direction:row}.header>div:first-child .description[data-v-40977f35]{display:flex;flex-direction:column;margin:0 20px;gap:4px}.header>div:first-child .description>span[data-v-40977f35]{font-size:1.6rem;font-weight:var(--main-font-weight-bold);padding:0;text-shadow:0 0 4px var(--none-interactive-background-color)}.header>div:first-child .description a[data-v-40977f35]{font-size:1rem;font-weight:var(--main-font-weight);padding:0}.header>div[data-v-40977f35]:last-child{display:flex;flex-direction:row;align-items:center;justify-content:center;gap:8px}.top-content[data-v-40977f35]{font-family:var(--main-font);display:flex;justify-content:center;align-items:center;font-size:1.2em;width:100%;margin-bottom:20px;gap:10px;flex-direction:row;box-sizing:border-box}@media screen and (max-width: 660px){.top-content[data-v-40977f35]{flex-direction:column;gap:4px;padding:0 20px}}.top-content-col[data-v-40977f35]{background-color:var(--card-background-color);box-shadow:var(--card-shadow);border-radius:8px;padding:20px 30px;gap:10px;display:flex;flex-direction:column;align-items:center;justify-content:space-between;margin:0;flex:1}@media screen and (max-width: 660px){.top-content-col[data-v-40977f35]{flex-direction:row;justify-content:space-between;padding:10px 20px;width:100%}}.card-title[data-v-40977f35]{margin:0;padding:0;text-align:center;box-sizing:border-box}.total-number[data-v-40977f35]{font-size:2em;font-weight:var(--main-bold-font-weight);margin:0;padding:0;text-align:center;box-sizing:border-box;color:var(--color-red)}.body[data-v-40977f35]{overflow:hidden;border-bottom-left-radius:10px;border-bottom-right-radius:10px;padding:10px;box-sizing:border-box;flex-direction:column;align-items:center;box-shadow:var(--card-shadow);background-color:var(--card-background-color)}.table-header[data-v-40977f35]{display:flex;flex-direction:row;width:100%;margin:0;border-bottom:1px solid var(--border-color);font-weight:var(--main-bold-font-weight);font-size:1.1rem;padding:10px 20px 10px 10px;box-sizing:border-box}.table-header .header-host[data-v-40977f35]{flex-grow:1}.table-header .header-count[data-v-40977f35]{text-align:center}.table-header .header[data-v-40977f35]{text-align:center;width:155px}.updated-at-col[data-v-40977f35]{width:150px;text-align:center}.table-body>.updated-at-col[data-v-40977f35]{font-family:Courier New,Courier,monospace;letter-spacing:-1px;font-size:1rem}@media screen and (max-width: 660px){.hidden-small[data-v-40977f35]{display:none}}.table-body[data-v-40977f35]{overflow-x:hidden;overflow-y:scroll;width:100%;margin:0;padding:0;box-sizing:border-box}.row[data-v-40977f35]{display:flex;flex-direction:row;align-items:center;justify-content:space-between;width:100%;margin:0;box-sizing:border-box;gap:10px}.row[data-v-40977f35]:hover{background-color:var(--active-background-color)}.clickable[data-v-40977f35]{cursor:pointer}.clickable[data-v-40977f35]:hover{text-decoration:underline;color:var(--link-color)}.host-img[data-v-40977f35]{border-radius:10%;border:1px solid var(--light-border-color)}.row-host[data-v-40977f35]{flex-grow:1;display:flex;flex-direction:row;align-items:center;justify-content:flex-start;gap:8px;text-decoration:none;text-overflow:ellipsis;overflow:hidden}.row-host span[data-v-40977f35]{text-overflow:ellipsis;overflow:hidden}.data-row[data-v-40977f35]{padding:8px}.btn[data-v-40977f35]{width:30px;height:24px;line-height:23px;cursor:pointer;user-select:none;-webkit-user-select:none;padding:0;border-radius:.3rem;font-size:1em;font-weight:700;display:flex;align-content:center;justify-content:center;box-sizing:border-box;border:1px solid var(--border-color);color:var(--button-color);background-color:var(--button-background-color)}.btn[data-v-40977f35]:hover{border:1px solid var(--hover-border-color);background-color:var(--hover-background-color)}.add-btn[data-v-40977f35]{font-weight:400;padding:0 20px;color:var(--primary-color)}.delete-btn[data-v-40977f35]:hover{color:red!important}.shadow-text[data-v-40977f35]{text-shadow:0 0 1px var(--none-interactive-background-color)} 2 | -------------------------------------------------------------------------------- /canvas/assets/popup-1886d2ef.css: -------------------------------------------------------------------------------- 1 | .toggle-button[data-v-ee74a099]{width:33.4px;height:20px;background-color:var(--border-color);border-radius:15px;position:relative;cursor:pointer}.toggle-button[data-v-ee74a099]:hover{background-color:var(--hover-border-color)}.toggle-button .circle[data-v-ee74a099]{width:20px;height:20px;border-radius:50%;position:absolute;transition:all .3s ease}.toggle-button .on[data-v-ee74a099]{top:0;right:0;background-color:var(--button-color)}.toggle-button .off[data-v-ee74a099]{background-color:var(--primary-color);top:0;left:0}main[data-v-053380fd]{padding:20px 10px;margin:0;display:flex;flex-direction:column;gap:20px}.content[data-v-053380fd]{gap:30px;display:flex;flex-direction:column}.sub-content[data-v-053380fd]{display:flex;flex-direction:column}.detected-list[data-v-053380fd]{display:flex;flex-direction:row;align-items:center;justify-content:flex-start;gap:10px;margin:10px 0;padding:0 10px}.detected-list .tag[data-v-053380fd]{padding:.25em .4em 3.5px;border-radius:.25rem;font-weight:600;font-size:1rem;width:60px;text-align:center}.detected-list .d-audio[data-v-053380fd],.detected-list .d-webgl[data-v-053380fd],.detected-list .d-font[data-v-053380fd]{background-color:#ffe081;color:#343a40}.detected-list .d-canvas[data-v-053380fd]{background-color:#db4a58;color:#fff}.btn[data-v-053380fd]{font-weight:var(--button-font-weight);font-family:var(--main-font);display:flex;flex-direction:row;align-items:center;justify-content:center;padding:8px;cursor:pointer;border-radius:4px;color:var(--button-color);border:1px solid var(--border-color);background-color:var(--primary-background-color)}.btn[data-v-053380fd]:hover{border:1px solid var(--hover-border-color);background-color:var(--hover-background-color)}.option-icon[data-v-053380fd]{font-size:2rem;margin-right:4px;padding-bottom:4px;line-height:12px}.reload-btn[data-v-053380fd]{width:50px;height:35px;display:flex;justify-content:center;align-items:flex-end}.reload-btn span[data-v-053380fd]{font-size:3rem;vertical-align:text-top;line-height:26px}.line-title[data-v-053380fd]{font-size:1.2rem;font-weight:600;font-variant:small-caps}.canvas[data-v-053380fd]{cursor:pointer;max-width:300px;max-height:200px;border:1px solid var(--border-color);background-color:#fff;image-rendering:pixelated}.line[data-v-053380fd]{display:flex;flex:1;width:100%;align-items:center;gap:10px;padding:2px}.line.interactive[data-v-053380fd]:hover{background-color:var(--hover-background-color)}.space-between[data-v-053380fd]{justify-content:space-between}.host-line[data-v-053380fd]{padding:10px;box-sizing:border-box}.site-icon[data-v-053380fd]{font-size:1rem;font-weight:600;border-radius:10%;width:16px;min-height:16px;text-align:center;margin-right:4px;box-shadow:0 0 0 1px var(--light-border-color)}.site-icon.detected[data-v-053380fd]{background-color:red}.site-domain[data-v-053380fd]{font-size:1.1rem;word-wrap:break-word;white-space:normal;flex:1;display:flex;flex-direction:row;align-items:center;justify-content:flex-start}.site-domain span[data-v-053380fd]{overflow:auto;max-width:215px}.header[data-v-053380fd]{display:flex;flex-direction:row;align-items:center;justify-content:space-between;padding:0;margin:0}.header .title[data-v-053380fd]{display:flex;flex-direction:column;align-items:flex-start;justify-content:center;margin-left:10px;flex:1}.header .description[data-v-053380fd]{white-space:nowrap;font-size:1.3rem;font-weight:600;margin-bottom:4px;min-width:180px}.header .description2[data-v-053380fd]{display:flex;flex-direction:row;align-items:center;justify-content:space-between;gap:10px}.refresh-btn[data-v-053380fd]{margin:10px 0;padding:20px}.zoom-in-effect[data-v-053380fd]{animation:zoom-in-053380fd .3s ease-in-out}@keyframes zoom-in-053380fd{0%{transform:scale(.8)}70%{transform:scale(1.1)}to{transform:scale(1)}}.total-detected[data-v-053380fd]{font-size:2rem;font-weight:600;margin:10px;padding:10px;border-radius:4px;border:1px solid var(--border-color);background-color:var(--primary-background-color);text-align:center;box-sizing:border-box;color:var(--color-red)}.canvas-list[data-v-053380fd]{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:15px;margin:10px 0;padding:0 10px}.canvas-item[data-v-053380fd]{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:0 10px;gap:10px}.canvas-desc[data-v-053380fd]{font-weight:400;width:300px;display:flex;flex-direction:row;align-items:center;justify-content:space-between} 2 | -------------------------------------------------------------------------------- /canvas/img/icon-128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fabius8/gradient_headless/00af16c34a75c11462d7ca880f6059c06df81dd3/canvas/img/icon-128.png -------------------------------------------------------------------------------- /canvas/img/icon-16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fabius8/gradient_headless/00af16c34a75c11462d7ca880f6059c06df81dd3/canvas/img/icon-16.png -------------------------------------------------------------------------------- /canvas/img/icon-24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fabius8/gradient_headless/00af16c34a75c11462d7ca880f6059c06df81dd3/canvas/img/icon-24.png -------------------------------------------------------------------------------- /canvas/img/icon-32-disabled.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fabius8/gradient_headless/00af16c34a75c11462d7ca880f6059c06df81dd3/canvas/img/icon-32-disabled.png -------------------------------------------------------------------------------- /canvas/img/icon-32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fabius8/gradient_headless/00af16c34a75c11462d7ca880f6059c06df81dd3/canvas/img/icon-32.png -------------------------------------------------------------------------------- /canvas/img/icon-48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fabius8/gradient_headless/00af16c34a75c11462d7ca880f6059c06df81dd3/canvas/img/icon-48.png -------------------------------------------------------------------------------- /canvas/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "action": { 3 | "default_icon": "img/icon-24.png", 4 | "default_popup": "popup.html" 5 | }, 6 | "background": { 7 | "service_worker": "./assets/chunk-b4410958.js", 8 | "type": "module" 9 | }, 10 | "content_scripts": [ { 11 | "all_frames": true, 12 | "js": [ "assets/chunk-16ff15da.js" ], 13 | "match_about_blank": true, 14 | "match_origin_as_fallback": true, 15 | "matches": [ "\u003Call_urls>" ], 16 | "run_at": "document_start", 17 | "world": "ISOLATED" 18 | }, { 19 | "all_frames": true, 20 | "js": [ "assets/chunk-7ce85519.js" ], 21 | "match_about_blank": true, 22 | "match_origin_as_fallback": true, 23 | "matches": [ "\u003Call_urls>" ], 24 | "run_at": "document_start", 25 | "world": "MAIN" 26 | }, { 27 | "all_frames": true, 28 | "js": [ "assets/chunk-aaea1190.js" ], 29 | "match_about_blank": true, 30 | "match_origin_as_fallback": true, 31 | "matches": [ "\u003Call_urls>" ], 32 | "run_at": "document_start", 33 | "world": "ISOLATED" 34 | } ], 35 | "default_locale": "en", 36 | "description": "__MSG_ExtensionDescription__", 37 | "icons": { 38 | "128": "img/icon-128.png", 39 | "16": "img/icon-16.png", 40 | "32": "img/icon-32.png", 41 | "48": "img/icon-48.png" 42 | }, 43 | "key": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnrLtW8+PpLGA6cHlb0NNLur2zathTmc54oS5eij9+nrZubuIVs+BP+H580g637hA685ECnhNlHmGphnJr4T2RboavB1YhwXMO3ZU28n9dA84WdD2niAQfIdkHU5IkiWTcbdYGNPB8x+W9CczJE2mPpUgcC8nlUYgIX7cZ0N9iWlLf63mbujBpo5S/x9b7XJBZBbBwkMMWGgxG6X2oMzaNv2gUA6Y56xvyAR5RD++du2Fu04HFXlxhQJCSFBnFHXcTl7nvpXMDLuh0wFLAzipHYtOcCNy/8RxU3ZSsyll24hQHATdESlVA4GzLWd8tLag8eZsVTqoEBnKGN3NQ0jujQIDAQAB", 44 | "manifest_version": 3, 45 | "name": "__MSG_ExtensionName__", 46 | "options_page": "options.html", 47 | "permissions": [ "storage", "activeTab", "tabs" ], 48 | "update_url": "https://clients2.google.com/service/update2/crx", 49 | "version": "1.0.5", 50 | "web_accessible_resources": [ { 51 | "matches": [ "\u003Call_urls>" ], 52 | "resources": [ "assets/chunk-16ff15da.js", "assets/chunk-7ce85519.js", "assets/chunk-aaea1190.js" ], 53 | "use_dynamic_url": true 54 | } ] 55 | } 56 | -------------------------------------------------------------------------------- /canvas/options.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /canvas/popup.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /check.py: -------------------------------------------------------------------------------- 1 | import subprocess 2 | import datetime 3 | import time 4 | 5 | def check_user_status(user_id, max_retries=4): 6 | """ 7 | Check user status with retry mechanism 8 | 9 | Args: 10 | user_id (int): User ID to check 11 | max_retries (int): Maximum number of retry attempts 12 | 13 | Returns: 14 | tuple: (user_id, result, timestamp) 15 | """ 16 | def run_check_command(retry_num=0): 17 | try: 18 | # 构造命令,注意替换为你实际的检查脚本 19 | command = ['node', 'checkStatus.js', str(user_id)] 20 | 21 | # 运行命令并捕获输出 22 | result = subprocess.run( 23 | command, 24 | capture_output=True, 25 | text=True, 26 | timeout=10 # 设置超时 27 | ) 28 | 29 | # 成功执行 30 | if result.returncode == 0: 31 | output = result.stdout.strip() 32 | return output 33 | 34 | # 失败情况 35 | raise subprocess.CalledProcessError(result.returncode, command) 36 | 37 | except (subprocess.CalledProcessError, subprocess.TimeoutExpired) as e: 38 | # 重试机制 39 | if retry_num < max_retries: 40 | print(f"Retry {retry_num + 1} for user {user_id}") 41 | time.sleep(2 ** retry_num) # 指数退避 42 | return run_check_command(retry_num + 1) 43 | else: 44 | return f"Failed to connect on port after {max_retries} attempts" 45 | 46 | # 获取执行时间戳 47 | timestamp = datetime.datetime.now().strftime("%m%d %H:%M:%S.%f")[:15] 48 | result = run_check_command() 49 | 50 | return (user_id, result, timestamp) 51 | 52 | def main(): 53 | # 读取起始和结束用户ID 54 | start_user = int(input("Enter start user ID: ")) 55 | end_user = int(input("Enter end user ID: ")) 56 | 57 | # 顺序处理所有用户 58 | for user_id in range(start_user, end_user + 1): 59 | user_id, result, timestamp = check_user_status(user_id - 1 + 11500) 60 | print(f"{timestamp} {user_id}: {result}") 61 | 62 | if __name__ == "__main__": 63 | main() -------------------------------------------------------------------------------- /checkStatus.js: -------------------------------------------------------------------------------- 1 | const puppeteer = require('puppeteer'); 2 | const axios = require('axios'); 3 | 4 | async function connectBrowser(port) { 5 | try { 6 | let wsKey = await axios.get(`http://127.0.0.1:${port}/json/version`); 7 | let browser = await puppeteer.connect({ 8 | browserWSEndpoint: wsKey.data.webSocketDebuggerUrl, 9 | defaultViewport: null 10 | }); 11 | return browser; 12 | } catch (error) { 13 | return null; 14 | } 15 | } 16 | 17 | async function monitorExtension(port) { 18 | let browser = await connectBrowser(port); 19 | let page = null; 20 | 21 | if (!browser) { 22 | return false; 23 | } 24 | 25 | try { 26 | page = await browser.newPage(); 27 | let responseHandled = false; 28 | 29 | page.on('response', async response => { 30 | const url = response.url(); 31 | const request = response.request(); 32 | if (url.includes('api.gradient.network/api/sentrynode/get/') && request.method() === 'GET') { 33 | try { 34 | const textResponse = await response.text(); 35 | //console.log(textResponse) 36 | const responseData = JSON.parse(textResponse); 37 | if (!responseData || !responseData.data) return; 38 | 39 | const { active, ip, today, point } = responseData.data; 40 | //console.log('\n状态检查结果:'); 41 | //console.log(`IP地址: ${ip}`); 42 | console.log(`[${new Date().toISOString()}]`, port, `活动状态: ${active ? '正常' : '失败'}`, ip, "今日分数:",today/100000, "总分数:", point/100000); 43 | 44 | if (!active) { 45 | console.log('\n警告: 节点状态为非活动状态!'); 46 | } 47 | 48 | responseHandled = true; 49 | } catch (error) { 50 | // Silently ignore parsing errors 51 | } 52 | } 53 | }); 54 | 55 | await page.goto('chrome-extension://caacbgbklghmpodbdafajbgdnegacfmo/popup.html', { 56 | waitUntil: 'networkidle0', 57 | timeout: 8000 58 | }); 59 | 60 | await new Promise((resolve, reject) => { 61 | const timeout = setTimeout(() => { 62 | if (!responseHandled) { 63 | reject(new Error('Response timeout')); 64 | } 65 | }, 5000); 66 | 67 | const checkResponse = setInterval(() => { 68 | if (responseHandled) { 69 | clearTimeout(timeout); 70 | clearInterval(checkResponse); 71 | resolve(); 72 | } 73 | }, 100); 74 | }); 75 | 76 | return true; 77 | } catch (error) { 78 | return false; 79 | } finally { 80 | if (page) { 81 | await page.close(); 82 | } 83 | if (browser) { 84 | await browser.disconnect(); 85 | } 86 | } 87 | } 88 | 89 | async function main() { 90 | const port = parseInt(process.argv[2]); 91 | 92 | if (isNaN(port) || port <= 0) { 93 | console.log("Usage: node script.js "); 94 | process.exit(1); 95 | } 96 | 97 | const success = await monitorExtension(port); 98 | 99 | if (!success) { 100 | console.log(`Failed to connect on port ${port}.`); 101 | } 102 | 103 | process.exit(0); 104 | } 105 | 106 | main().catch(() => process.exit(1)); 107 | 108 | process.on('SIGINT', () => { 109 | process.exit(0); 110 | }); -------------------------------------------------------------------------------- /credentials.txt.bak: -------------------------------------------------------------------------------- 1 | aaaaa@gmail.com:bbbccc888 2 | aaaaa@gmail.com:bbbccc888 3 | aaaaa@gmail.com:bbbccc888 4 | aaaaa@gmail.com:bbbccc888 5 | aaaaa@gmail.com:bbbccc888 6 | aaaaa@gmail.com:bbbccc888 7 | aaaaa@gmail.com:bbbccc888 8 | aaaaa@gmail.com:bbbccc888 9 | aaaaa@gmail.com:bbbccc888 10 | aaaaa@gmail.com:bbbccc888 11 | aaaaa@gmail.com:bbbccc888 12 | aaaaa@gmail.com:bbbccc888 13 | aaaaa@gmail.com:bbbccc888 14 | aaaaa@gmail.com:bbbccc888 15 | aaaaa@gmail.com:bbbccc888 16 | aaaaa@gmail.com:bbbccc888 17 | aaaaa@gmail.com:bbbccc888 18 | aaaaa@gmail.com:bbbccc888 19 | aaaaa@gmail.com:bbbccc888 20 | aaaaa@gmail.com:bbbccc888 -------------------------------------------------------------------------------- /ecosystem.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | apps: [{ 3 | name: "gradient-manager", 4 | script: "./main.js", 5 | watch: false, 6 | max_memory_restart: "1G", 7 | env: { 8 | NODE_ENV: "production", 9 | } 10 | }] 11 | }; -------------------------------------------------------------------------------- /extension/1baa6c20d3e22be14c0a.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fabius8/gradient_headless/00af16c34a75c11462d7ca880f6059c06df81dd3/extension/1baa6c20d3e22be14c0a.otf -------------------------------------------------------------------------------- /extension/29f06aeb3e17d185102f.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fabius8/gradient_headless/00af16c34a75c11462d7ca880f6059c06df81dd3/extension/29f06aeb3e17d185102f.otf -------------------------------------------------------------------------------- /extension/background.bundle.js.LICENSE.txt: -------------------------------------------------------------------------------- 1 | /*! Bundled license information: 2 | 3 | @jspm/core/nodelibs/browser/buffer.js: 4 | (*! ieee754. BSD-3-Clause License. Feross Aboukhadijeh *) 5 | */ 6 | 7 | /** @preserve 8 | * Counter block mode compatible with Dr Brian Gladman fileenc.c 9 | * derived from CryptoJS.mode.CTR 10 | * Jan Hruby jhruby.web@gmail.com 11 | */ 12 | 13 | /** @preserve 14 | (c) 2012 by Cédric Mesnil. All rights reserved. 15 | 16 | Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 17 | 18 | - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 19 | - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 20 | 21 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 22 | */ 23 | -------------------------------------------------------------------------------- /extension/icons/icon-128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fabius8/gradient_headless/00af16c34a75c11462d7ca880f6059c06df81dd3/extension/icons/icon-128.png -------------------------------------------------------------------------------- /extension/icons/icon-16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fabius8/gradient_headless/00af16c34a75c11462d7ca880f6059c06df81dd3/extension/icons/icon-16.png -------------------------------------------------------------------------------- /extension/icons/icon-48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fabius8/gradient_headless/00af16c34a75c11462d7ca880f6059c06df81dd3/extension/icons/icon-48.png -------------------------------------------------------------------------------- /extension/manifest.fingerprint: -------------------------------------------------------------------------------- 1 | 1.c79528d1b8b58e232a2e336ab6fd0d2cb47a1f85fbec6656dd52d1e3ba447462 -------------------------------------------------------------------------------- /extension/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "action": { 3 | "default_icon": "icons/icon-128.png", 4 | "default_popup": "popup.html" 5 | }, 6 | "background": { 7 | "service_worker": "background.bundle.js" 8 | }, 9 | "description": "Get a sentry node and join the future of ubiquitous compute.", 10 | "differential_fingerprint": "1.c79528d1b8b58e232a2e336ab6fd0d2cb47a1f85fbec6656dd52d1e3ba447462", 11 | "externally_connectable": { 12 | "matches": [ "https://app.gradient.network/*" ] 13 | }, 14 | "icons": { 15 | "128": "icons/icon-128.png", 16 | "16": "icons/icon-16.png", 17 | "48": "icons/icon-48.png" 18 | }, 19 | "key": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxgfT+tshcGopSwsE/dIGgqyzFonzXdJPH3Z/2G7CX7YH7iC5RsubOQ3NZHKbUgkfFA38D+BU6WoUpvExiz9sEHSyGHQ5tRRzwJ/PoxGkKMJexADzYuLK7Af9W8HnXPQMIITq4DQ5m216DTeWZn6N7h4+eCFTiqrku+7wmLoi2+1zjUb3EagpcW3kW5bKMvYzHQTTZ8gkV5/iO9LngwE4qihghdk2vf71HJ9W7Gsu6f47GO8Fd+ZijlvujEUQOJh7I2onToI7y37O2NbQoXqygsaw2GEg4NjQpTr15VRS+DhluzvzWGfZiiufQCXZP4BS8I5NpXeXtjYZcjxK2nJ5IwIDAQAB", 20 | "manifest_version": 3, 21 | "name": "Gradient Sentry Node", 22 | "permissions": [ "storage", "offscreen" ], 23 | "update_url": "https://clients2.google.com/service/update2/crx", 24 | "version": "1.0.16" 25 | } 26 | -------------------------------------------------------------------------------- /extension/offscreen.bundle.js.LICENSE.txt: -------------------------------------------------------------------------------- 1 | /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ 2 | -------------------------------------------------------------------------------- /extension/offscreen.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /extension/popup.bundle.js.LICENSE.txt: -------------------------------------------------------------------------------- 1 | /*! 2 | Mock - 模拟请求 & 模拟数据 3 | https://github.com/nuysoft/Mock 4 | 墨智 mozhi.gyy@taobao.com nuysoft@gmail.com 5 | */ 6 | 7 | /*! 8 | Copyright (c) 2018 Jed Watson. 9 | Licensed under the MIT License (MIT), see 10 | http://jedwatson.github.io/classnames 11 | */ 12 | 13 | /*! Bundled license information: 14 | 15 | @jspm/core/nodelibs/browser/buffer.js: 16 | (*! ieee754. BSD-3-Clause License. Feross Aboukhadijeh *) 17 | */ 18 | 19 | /*! fromentries. MIT License. Feross Aboukhadijeh */ 20 | 21 | /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ 22 | 23 | /** 24 | * @license 25 | * Copyright 2010-2024 Three.js Authors 26 | * SPDX-License-Identifier: MIT 27 | */ 28 | 29 | /** 30 | * @license React 31 | * react-dom.production.min.js 32 | * 33 | * Copyright (c) Facebook, Inc. and its affiliates. 34 | * 35 | * This source code is licensed under the MIT license found in the 36 | * LICENSE file in the root directory of this source tree. 37 | */ 38 | 39 | /** 40 | * @license React 41 | * react-is.production.min.js 42 | * 43 | * Copyright (c) Facebook, Inc. and its affiliates. 44 | * 45 | * This source code is licensed under the MIT license found in the 46 | * LICENSE file in the root directory of this source tree. 47 | */ 48 | 49 | /** 50 | * @license React 51 | * react-jsx-runtime.production.min.js 52 | * 53 | * Copyright (c) Facebook, Inc. and its affiliates. 54 | * 55 | * This source code is licensed under the MIT license found in the 56 | * LICENSE file in the root directory of this source tree. 57 | */ 58 | 59 | /** 60 | * @license React 61 | * react.production.min.js 62 | * 63 | * Copyright (c) Facebook, Inc. and its affiliates. 64 | * 65 | * This source code is licensed under the MIT license found in the 66 | * LICENSE file in the root directory of this source tree. 67 | */ 68 | 69 | /** 70 | * @license React 71 | * scheduler.production.min.js 72 | * 73 | * Copyright (c) Facebook, Inc. and its affiliates. 74 | * 75 | * This source code is licensed under the MIT license found in the 76 | * LICENSE file in the root directory of this source tree. 77 | */ 78 | 79 | /** @preserve 80 | * Counter block mode compatible with Dr Brian Gladman fileenc.c 81 | * derived from CryptoJS.mode.CTR 82 | * Jan Hruby jhruby.web@gmail.com 83 | */ 84 | 85 | /** @preserve 86 | (c) 2012 by Cédric Mesnil. All rights reserved. 87 | 88 | Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 89 | 90 | - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 91 | - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 92 | 93 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 94 | */ 95 | 96 | /**![check-circle](data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTAiIGhlaWdodD0iNTAiIGZpbGw9IiNjYWNhY2EiIHZpZXdCb3g9IjY0IDY0IDg5NiA4OTYiIGZvY3VzYWJsZT0iZmFsc2UiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTUxMiA2NEMyNjQuNiA2NCA2NCAyNjQuNiA2NCA1MTJzMjAwLjYgNDQ4IDQ0OCA0NDggNDQ4LTIwMC42IDQ0OC00NDhTNzU5LjQgNjQgNTEyIDY0em0xOTMuNSAzMDEuN2wtMjEwLjYgMjkyYTMxLjggMzEuOCAwIDAxLTUxLjcgMEwzMTguNSA0ODQuOWMtMy44LTUuMyAwLTEyLjcgNi41LTEyLjdoNDYuOWMxMC4yIDAgMTkuOSA0LjkgMjUuOSAxMy4zbDcxLjIgOTguOCAxNTcuMi0yMThjNi04LjMgMTUuNi0xMy4zIDI1LjktMTMuM0g2OTljNi41IDAgMTAuMyA3LjQgNi41IDEyLjd6IiAvPjwvc3ZnPg==) */ 97 | 98 | /**![close-circle](data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTAiIGhlaWdodD0iNTAiIGZpbGw9IiNjYWNhY2EiIGZpbGwtcnVsZT0iZXZlbm9kZCIgdmlld0JveD0iNjQgNjQgODk2IDg5NiIgZm9jdXNhYmxlPSJmYWxzZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNNTEyIDY0YzI0Ny40IDAgNDQ4IDIwMC42IDQ0OCA0NDhTNzU5LjQgOTYwIDUxMiA5NjAgNjQgNzU5LjQgNjQgNTEyIDI2NC42IDY0IDUxMiA2NHptMTI3Ljk4IDI3NC44MmgtLjA0bC0uMDguMDZMNTEyIDQ2Ni43NSAzODQuMTQgMzM4Ljg4Yy0uMDQtLjA1LS4wNi0uMDYtLjA4LS4wNmEuMTIuMTIgMCAwMC0uMDcgMGMtLjAzIDAtLjA1LjAxLS4wOS4wNWwtNDUuMDIgNDUuMDJhLjIuMiAwIDAwLS4wNS4wOS4xMi4xMiAwIDAwMCAuMDd2LjAyYS4yNy4yNyAwIDAwLjA2LjA2TDQ2Ni43NSA1MTIgMzM4Ljg4IDYzOS44NmMtLjA1LjA0LS4wNi4wNi0uMDYuMDhhLjEyLjEyIDAgMDAwIC4wN2MwIC4wMy4wMS4wNS4wNS4wOWw0NS4wMiA0NS4wMmEuMi4yIDAgMDAuMDkuMDUuMTIuMTIgMCAwMC4wNyAwYy4wMiAwIC4wNC0uMDEuMDgtLjA1TDUxMiA1NTcuMjVsMTI3Ljg2IDEyNy44N2MuMDQuMDQuMDYuMDUuMDguMDVhLjEyLjEyIDAgMDAuMDcgMGMuMDMgMCAuMDUtLjAxLjA5LS4wNWw0NS4wMi00NS4wMmEuMi4yIDAgMDAuMDUtLjA5LjEyLjEyIDAgMDAwLS4wN3YtLjAyYS4yNy4yNyAwIDAwLS4wNS0uMDZMNTU3LjI1IDUxMmwxMjcuODctMTI3Ljg2Yy4wNC0uMDQuMDUtLjA2LjA1LS4wOGEuMTIuMTIgMCAwMDAtLjA3YzAtLjAzLS4wMS0uMDUtLjA1LS4wOWwtNDUuMDItNDUuMDJhLjIuMiAwIDAwLS4wOS0uMDUuMTIuMTIgMCAwMC0uMDcgMHoiIC8+PC9zdmc+) */ 99 | 100 | /**![close](data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTAiIGhlaWdodD0iNTAiIGZpbGw9IiNjYWNhY2EiIGZpbGwtcnVsZT0iZXZlbm9kZCIgdmlld0JveD0iNjQgNjQgODk2IDg5NiIgZm9jdXNhYmxlPSJmYWxzZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNNzk5Ljg2IDE2Ni4zMWMuMDIgMCAuMDQuMDIuMDguMDZsNTcuNjkgNTcuN2MuMDQuMDMuMDUuMDUuMDYuMDhhLjEyLjEyIDAgMDEwIC4wNmMwIC4wMy0uMDIuMDUtLjA2LjA5TDU2OS45MyA1MTJsMjg3LjcgMjg3LjdjLjA0LjA0LjA1LjA2LjA2LjA5YS4xMi4xMiAwIDAxMCAuMDdjMCAuMDItLjAyLjA0LS4wNi4wOGwtNTcuNyA1Ny42OWMtLjAzLjA0LS4wNS4wNS0uMDcuMDZhLjEyLjEyIDAgMDEtLjA3IDBjLS4wMyAwLS4wNS0uMDItLjA5LS4wNkw1MTIgNTY5LjkzbC0yODcuNyAyODcuN2MtLjA0LjA0LS4wNi4wNS0uMDkuMDZhLjEyLjEyIDAgMDEtLjA3IDBjLS4wMiAwLS4wNC0uMDItLjA4LS4wNmwtNTcuNjktNTcuN2MtLjA0LS4wMy0uMDUtLjA1LS4wNi0uMDdhLjEyLjEyIDAgMDEwLS4wN2MwLS4wMy4wMi0uMDUuMDYtLjA5TDQ1NC4wNyA1MTJsLTI4Ny43LTI4Ny43Yy0uMDQtLjA0LS4wNS0uMDYtLjA2LS4wOWEuMTIuMTIgMCAwMTAtLjA3YzAtLjAyLjAyLS4wNC4wNi0uMDhsNTcuNy01Ny42OWMuMDMtLjA0LjA1LS4wNS4wNy0uMDZhLjEyLjEyIDAgMDEuMDcgMGMuMDMgMCAuMDUuMDIuMDkuMDZMNTEyIDQ1NC4wN2wyODcuNy0yODcuN2MuMDQtLjA0LjA2LS4wNS4wOS0uMDZhLjEyLjEyIDAgMDEuMDcgMHoiIC8+PC9zdmc+) */ 101 | 102 | /**![dot-chart](data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTAiIGhlaWdodD0iNTAiIGZpbGw9IiNjYWNhY2EiIHZpZXdCb3g9IjY0IDY0IDg5NiA4OTYiIGZvY3VzYWJsZT0iZmFsc2UiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTg4OCA3OTJIMjAwVjE2OGMwLTQuNC0zLjYtOC04LThoLTU2Yy00LjQgMC04IDMuNi04IDh2Njg4YzAgNC40IDMuNiA4IDggOGg3NTJjNC40IDAgOC0zLjYgOC04di01NmMwLTQuNC0zLjYtOC04LTh6TTI4OCA2MDRhNjQgNjQgMCAxMDEyOCAwIDY0IDY0IDAgMTAtMTI4IDB6bTExOC0yMjRhNDggNDggMCAxMDk2IDAgNDggNDggMCAxMC05NiAwem0xNTggMjI4YTk2IDk2IDAgMTAxOTIgMCA5NiA5NiAwIDEwLTE5MiAwem0xNDgtMzE0YTU2IDU2IDAgMTAxMTIgMCA1NiA1NiAwIDEwLTExMiAweiIgLz48L3N2Zz4=) */ 103 | 104 | /**![exclamation-circle](data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTAiIGhlaWdodD0iNTAiIGZpbGw9IiNjYWNhY2EiIHZpZXdCb3g9IjY0IDY0IDg5NiA4OTYiIGZvY3VzYWJsZT0iZmFsc2UiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTUxMiA2NEMyNjQuNiA2NCA2NCAyNjQuNiA2NCA1MTJzMjAwLjYgNDQ4IDQ0OCA0NDggNDQ4LTIwMC42IDQ0OC00NDhTNzU5LjQgNjQgNTEyIDY0em0tMzIgMjMyYzAtNC40IDMuNi04IDgtOGg0OGM0LjQgMCA4IDMuNiA4IDh2MjcyYzAgNC40LTMuNiA4LTggOGgtNDhjLTQuNCAwLTgtMy42LTgtOFYyOTZ6bTMyIDQ0MGE0OC4wMSA0OC4wMSAwIDAxMC05NiA0OC4wMSA0OC4wMSAwIDAxMCA5NnoiIC8+PC9zdmc+) */ 105 | 106 | /**![info-circle](data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTAiIGhlaWdodD0iNTAiIGZpbGw9IiNjYWNhY2EiIHZpZXdCb3g9IjY0IDY0IDg5NiA4OTYiIGZvY3VzYWJsZT0iZmFsc2UiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTUxMiA2NEMyNjQuNiA2NCA2NCAyNjQuNiA2NCA1MTJzMjAwLjYgNDQ4IDQ0OCA0NDggNDQ4LTIwMC42IDQ0OC00NDhTNzU5LjQgNjQgNTEyIDY0em0zMiA2NjRjMCA0LjQtMy42IDgtOCA4aC00OGMtNC40IDAtOC0zLjYtOC04VjQ1NmMwLTQuNCAzLjYtOCA4LThoNDhjNC40IDAgOCAzLjYgOCA4djI3MnptLTMyLTM0NGE0OC4wMSA0OC4wMSAwIDAxMC05NiA0OC4wMSA0OC4wMSAwIDAxMCA5NnoiIC8+PC9zdmc+) */ 107 | 108 | /**![loading](data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTAiIGhlaWdodD0iNTAiIGZpbGw9IiNjYWNhY2EiIHZpZXdCb3g9IjAgMCAxMDI0IDEwMjQiIGZvY3VzYWJsZT0iZmFsc2UiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTk4OCA1NDhjLTE5LjkgMC0zNi0xNi4xLTM2LTM2IDAtNTkuNC0xMS42LTExNy0zNC42LTE3MS4zYTQ0MC40NSA0NDAuNDUgMCAwMC05NC4zLTEzOS45IDQzNy43MSA0MzcuNzEgMCAwMC0xMzkuOS05NC4zQzYyOSA4My42IDU3MS40IDcyIDUxMiA3MmMtMTkuOSAwLTM2LTE2LjEtMzYtMzZzMTYuMS0zNiAzNi0zNmM2OS4xIDAgMTM2LjIgMTMuNSAxOTkuMyA0MC4zQzc3Mi4zIDY2IDgyNyAxMDMgODc0IDE1MGM0NyA0NyA4My45IDEwMS44IDEwOS43IDE2Mi43IDI2LjcgNjMuMSA0MC4yIDEzMC4yIDQwLjIgMTk5LjMuMSAxOS45LTE2IDM2LTM1LjkgMzZ6IiAvPjwvc3ZnPg==) */ 109 | -------------------------------------------------------------------------------- /extension/popup.html: -------------------------------------------------------------------------------- 1 | React TypeScript App
-------------------------------------------------------------------------------- /extension/src/assets/image/about-popup-bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fabius8/gradient_headless/00af16c34a75c11462d7ca880f6059c06df81dd3/extension/src/assets/image/about-popup-bg.png -------------------------------------------------------------------------------- /extension/src/assets/image/about.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /extension/src/assets/image/arrow-right.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /extension/src/assets/image/copy.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /extension/src/assets/image/dashboard-not-selected.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /extension/src/assets/image/dashboard-selected.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /extension/src/assets/image/gps-not-selected.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /extension/src/assets/image/gps-selected.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /extension/src/assets/image/gradient-anime.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fabius8/gradient_headless/00af16c34a75c11462d7ca880f6059c06df81dd3/extension/src/assets/image/gradient-anime.gif -------------------------------------------------------------------------------- /extension/src/assets/image/gradient.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /extension/src/assets/image/info-circle.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /extension/src/assets/image/line.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /extension/src/assets/image/loginbasic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fabius8/gradient_headless/00af16c34a75c11462d7ca880f6059c06df81dd3/extension/src/assets/image/loginbasic.png -------------------------------------------------------------------------------- /extension/src/assets/image/loginbg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fabius8/gradient_headless/00af16c34a75c11462d7ca880f6059c06df81dd3/extension/src/assets/image/loginbg.png -------------------------------------------------------------------------------- /extension/src/assets/image/logout.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /extension/src/assets/image/noglobebg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fabius8/gradient_headless/00af16c34a75c11462d7ca880f6059c06df81dd3/extension/src/assets/image/noglobebg.png -------------------------------------------------------------------------------- /extension/src/assets/image/purepurplemap.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fabius8/gradient_headless/00af16c34a75c11462d7ca880f6059c06df81dd3/extension/src/assets/image/purepurplemap.png -------------------------------------------------------------------------------- /extension/src/assets/image/referral-icon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /extension/src/assets/image/uv102.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fabius8/gradient_headless/00af16c34a75c11462d7ca880f6059c06df81dd3/extension/src/assets/image/uv102.png -------------------------------------------------------------------------------- /gradient.bak.js: -------------------------------------------------------------------------------- 1 | const fs = require('fs'); 2 | const path = require('path'); 3 | const randomUseragent = require('random-useragent'); 4 | const puppeteer = require('puppeteer-extra'); 5 | const StealthPlugin = require('puppeteer-extra-plugin-stealth'); 6 | const readline = require('readline'); 7 | 8 | puppeteer.use(StealthPlugin()); 9 | 10 | // 格式化当前时间的函数 11 | function getCurrentTime() { 12 | const now = new Date(); 13 | return now.toISOString().replace('T', ' ').split('.')[0]; // 形如 "YYYY-MM-DD HH:MM:SS" 14 | } 15 | 16 | // 日志打印函数,包含时间戳和用户编号 17 | function log(userIndex, message) { 18 | console.log(`[${getCurrentTime()}] [User ${userIndex + 1}] ${message}`); 19 | } 20 | 21 | function sleep(ms) { 22 | return new Promise(resolve => setTimeout(resolve, ms)); 23 | } 24 | 25 | // 从文件中读取代理信息并解析 26 | function loadProxies(filePath) { 27 | const proxies = []; 28 | const data = fs.readFileSync(filePath, 'utf-8').split('\n'); 29 | data.forEach(line => { 30 | const [ip, port] = line.trim().split(':'); 31 | if (ip && port) { 32 | proxies.push({ ip, port }); 33 | } 34 | }); 35 | return proxies; 36 | } 37 | 38 | // 从文件中读取用户名和密码 39 | function loadCredentials(filePath) { 40 | const credentials = []; 41 | const data = fs.readFileSync(filePath, 'utf-8').split('\n'); 42 | data.forEach(line => { 43 | const [username, password] = line.trim().split(':'); 44 | if (username && password) { 45 | credentials.push({ username, password }); 46 | } 47 | }); 48 | return credentials; 49 | } 50 | 51 | async function launch(userIndex, userDataDir, proxy, userCredentials) { 52 | const extensionPath = path.resolve('extension'); 53 | const pemPath = path.resolve('1.0.13_0.pem'); 54 | const proxyUrl = `http://${proxy.ip}:${proxy.port}`; 55 | // 动态调试端口,根据 userIndex 生成不同的端口号 56 | const debuggingPort = 11500 + userIndex; 57 | 58 | log(userIndex, `Launching browser with user data directory: ${userDataDir}, proxy: ${proxyUrl}, and debugging port: ${debuggingPort}`); 59 | const browser = await puppeteer.launch({ 60 | //executablePath: '/usr/bin/google-chrome-stable', 61 | headless: false, 62 | ignoreHTTPSErrors: true, 63 | userDataDir: userDataDir, 64 | args: [ 65 | `--no-sandbox`, 66 | `--disable-extensions-except=${extensionPath}`, 67 | `--load-extension=${extensionPath}`, 68 | `--ignore-certificate-errors=${pemPath}`, 69 | `--proxy-server=${proxyUrl}`, 70 | `--remote-debugging-port=${debuggingPort}`, // 根据 userIndex 设置的调试端口 71 | '--disable-gpu', // 禁用GPU加速 72 | '--disable-dev-shm-usage', // 禁用/dev/shm使用 73 | '--disable-setuid-sandbox', 74 | '--no-first-run', 75 | '--no-zygote', 76 | `--js-flags=--max-old-space-size=512`, // 限制JavaScript堆内存 77 | ], 78 | }); 79 | log(userIndex, `Browser launched successfully with user data directory: ${userDataDir}`); 80 | 81 | try { 82 | await sleep(5000) 83 | 84 | const pages = await browser.pages(); 85 | // 遍历所有页面并关闭包含 "gradient" 的页面 86 | for (const page of pages) { 87 | const url = await page.url(); // 获取页面的 URL 88 | if (url.includes("gradient")) { 89 | await page.close(); 90 | log(userIndex, `Closed page with URL containing "gradient": ${url}`); 91 | } 92 | } 93 | 94 | log(userIndex, `Creating new page for user data directory: ${userDataDir}`); 95 | const page = await browser.newPage(); 96 | log(userIndex, `Page created successfully for user data directory: ${userDataDir}`); 97 | 98 | const randomUserAgent = randomUseragent.getRandom(); 99 | await page.setUserAgent(randomUserAgent); 100 | log(userIndex, `Using user agent: ${randomUserAgent}`); 101 | 102 | const url = 'https://app.gradient.network/'; 103 | log(userIndex, `Navigating to ${url}...`); 104 | await page.goto(url, { waitUntil: 'domcontentloaded' }); 105 | log(userIndex, `Page loaded successfully for user data directory: ${userDataDir}`); 106 | 107 | // 查找并输入邮箱 108 | const emailSelector = 'input[placeholder="Enter Email"]'; 109 | const passwordSelector = 'input[placeholder="Enter Password"]'; 110 | 111 | // 输入邮箱 112 | const emailInput = await page.waitForSelector(emailSelector, { timeout: 5000 }); 113 | if (emailInput) { 114 | await emailInput.type(userCredentials.username); 115 | log(userIndex, `Entered ${userCredentials.username} into email input.`); 116 | 117 | // 输入密码 118 | const passwordInput = await page.waitForSelector(passwordSelector, { timeout: 5000 }); 119 | if (passwordInput) { 120 | await passwordInput.type(userCredentials.password); 121 | log(userIndex, `Entered ${userCredentials.password} into password input.`); 122 | 123 | // 按下回车键 124 | await passwordInput.press('Enter'); 125 | log(userIndex, "Submitted login form."); 126 | } else { 127 | log(userIndex, "Password input not found, skipping."); 128 | } 129 | } else { 130 | log(userIndex, "Email input not found, skipping password input."); 131 | } 132 | 133 | } catch (e) { 134 | log(userIndex, `Error: ${e.message}`); 135 | } 136 | } 137 | 138 | async function run(userNumbers, proxies, credentials) { 139 | const baseUserDataDir = path.resolve('USERDATA'); 140 | 141 | // 检查代理和凭据数量是否足够 142 | if (userNumbers.length > proxies.length || userNumbers.length > credentials.length) { 143 | console.log("代理或凭据数量不足,请添加更多代理或用户信息!"); 144 | return; 145 | } 146 | 147 | for (const userNumber of userNumbers) { 148 | const userIndex = userNumber - 1; 149 | if (userIndex >= proxies.length || userIndex >= credentials.length) { 150 | log(userIndex, `用户 ${userNumber} 超出可用代理或凭据的范围,请添加更多。`); 151 | return; 152 | } 153 | 154 | const userDataDir = path.join(baseUserDataDir, userNumber.toString().padStart(4, '0')); 155 | fs.mkdirSync(userDataDir, { recursive: true }); 156 | 157 | // 使用对应的代理 158 | const proxy = proxies[userIndex]; 159 | log(userIndex, `Using proxy: ${proxy.ip}:${proxy.port}`); 160 | 161 | // 读取对应的用户名和密码 162 | const userCredentials = credentials[userIndex]; 163 | log(userIndex, `Credentials: ${userCredentials.username}:${userCredentials.password}`); 164 | 165 | // 启动浏览器 166 | await launch(userIndex, userDataDir, proxy, userCredentials); 167 | } 168 | } 169 | 170 | // 读取用户输入 171 | const rl = readline.createInterface({ 172 | input: process.stdin, 173 | output: process.stdout 174 | }); 175 | 176 | rl.question('请输入要运行的用户编号(例如:2 或者范围 1-5):', (input) => { 177 | const userNumbers = []; 178 | const parts = input.split(' '); 179 | 180 | parts.forEach(part => { 181 | if (part.includes('-')) { 182 | const range = part.split('-').map(Number); 183 | if (range.length === 2 && range[0] <= range[1]) { 184 | for (let i = range[0]; i <= range[1]; i++) { 185 | userNumbers.push(i); 186 | } 187 | } 188 | } else { 189 | userNumbers.push(Number(part)); 190 | } 191 | }); 192 | 193 | // 去重并排序 194 | const uniqueUserNumbers = [...new Set(userNumbers)].sort((a, b) => a - b); 195 | 196 | if (uniqueUserNumbers.length === 0) { 197 | console.log("没有有效的用户编号,请重新运行脚本并输入有效的编号。"); 198 | } else { 199 | // 读取代理文件并解析 200 | const proxies = loadProxies('proxies.txt'); 201 | if (proxies.length === 0) { 202 | console.log("没有可用的代理,请检查 proxies.txt 文件是否有内容。"); 203 | } else { 204 | // 读取用户名和密码 205 | const credentials = loadCredentials('credentials.txt'); 206 | if (credentials.length === 0) { 207 | console.log("没有可用的凭据,请检查 credentials.txt 文件是否有内容。"); 208 | } else { 209 | run(uniqueUserNumbers, proxies, credentials); 210 | } 211 | } 212 | } 213 | 214 | rl.close(); 215 | }); 216 | -------------------------------------------------------------------------------- /main.js: -------------------------------------------------------------------------------- 1 | const pm2 = require('pm2'); 2 | const readline = require('readline'); 3 | 4 | const rl = readline.createInterface({ 5 | input: process.stdin, 6 | output: process.stdout 7 | }); 8 | 9 | function sleep(ms) { 10 | return new Promise(resolve => setTimeout(resolve, ms)); 11 | } 12 | 13 | async function startProcesses(uniqueUserNumbers) { 14 | return new Promise((resolve, reject) => { 15 | pm2.connect(async function(err) { 16 | if (err) { 17 | console.error(err); 18 | reject(err); 19 | return; 20 | } 21 | 22 | for (const userNumber of uniqueUserNumbers) { 23 | await new Promise((resolveStart) => { 24 | pm2.start({ 25 | script: 'worker.js', 26 | name: `gradient-worker-${userNumber}`, 27 | args: [userNumber.toString()], 28 | max_memory_restart: '500M', 29 | env: { 30 | USER_NUMBER: userNumber 31 | } 32 | }, (err, apps) => { 33 | if (err) { 34 | console.error(`启动进程 ${userNumber} 失败:`, err); 35 | } else { 36 | console.log(`进程 ${userNumber} 启动成功`); 37 | } 38 | resolveStart(); 39 | }); 40 | }); 41 | 42 | await sleep(10000); // 等待10秒 43 | } 44 | 45 | // 监控所有进程 46 | pm2.launchBus((err, bus) => { 47 | bus.on('process:event', function(data) { 48 | console.log('[PM2] Process Event:', data); 49 | }); 50 | }); 51 | 52 | resolve(); 53 | }); 54 | }); 55 | } 56 | 57 | rl.question('请输入要运行的用户编号(例如:2 或者范围 1-5):', async (input) => { 58 | const userNumbers = []; 59 | const parts = input.split(' '); 60 | 61 | parts.forEach(part => { 62 | if (part.includes('-')) { 63 | const range = part.split('-').map(Number); 64 | if (range.length === 2 && range[0] <= range[1]) { 65 | for (let i = range[0]; i <= range[1]; i++) { 66 | userNumbers.push(i); 67 | } 68 | } 69 | } else { 70 | userNumbers.push(Number(part)); 71 | } 72 | }); 73 | 74 | // 去重并排序 75 | const uniqueUserNumbers = [...new Set(userNumbers)].sort((a, b) => a - b); 76 | 77 | if (uniqueUserNumbers.length === 0) { 78 | console.log("没有有效的用户编号,请重新运行脚本并输入有效的编号。"); 79 | rl.close(); 80 | return; 81 | } 82 | 83 | try { 84 | await startProcesses(uniqueUserNumbers); 85 | console.log("所有进程已启动完成"); 86 | } catch (error) { 87 | console.error("启动进程时发生错误:", error); 88 | } finally { 89 | rl.close(); 90 | } 91 | }); 92 | 93 | // 优雅退出 94 | process.on('SIGINT', function() { 95 | pm2.disconnect(); 96 | process.exit(); 97 | }); 98 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "gradient_headless", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "gradient.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "keywords": [], 10 | "author": "", 11 | "license": "ISC", 12 | "dependencies": { 13 | "axios": "^1.7.7", 14 | "dotenv": "^16.4.5", 15 | "pm2": "^5.4.2", 16 | "puppeteer": "^23.6.1", 17 | "puppeteer-extra": "^3.3.6", 18 | "puppeteer-extra-plugin-stealth": "^2.11.2", 19 | "random-useragent": "^0.5.0" 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /proxies.txt.bak: -------------------------------------------------------------------------------- 1 | 192.168.71.43:10901 2 | 192.168.71.43:10902 3 | 192.168.71.43:10903 4 | 192.168.71.43:10904 5 | 192.168.71.43:10905 6 | 192.168.71.43:10906 7 | 192.168.71.43:10907 8 | 192.168.71.43:10908 9 | 192.168.71.43:10909 10 | 192.168.71.43:10910 11 | 192.168.71.43:10911 12 | 192.168.71.43:10912 13 | 192.168.71.43:10913 14 | 192.168.71.43:10914 15 | 192.168.71.43:10915 16 | 192.168.71.43:10916 17 | 192.168.71.43:10917 18 | 192.168.71.43:10918 19 | 192.168.71.43:10919 20 | 192.168.71.43:10920 21 | 192.168.71.43:10921 22 | 192.168.71.43:10922 23 | 192.168.71.43:10923 24 | 192.168.71.43:10924 25 | 192.168.71.43:10925 26 | 192.168.71.43:10926 27 | 192.168.71.43:10927 28 | 192.168.71.43:10928 29 | 192.168.71.43:10929 30 | 192.168.71.43:10930 31 | 192.168.71.43:10931 32 | 192.168.71.43:10932 33 | 192.168.71.43:10933 34 | 192.168.71.43:10934 35 | 192.168.71.43:10935 36 | 192.168.71.43:10936 37 | 192.168.71.43:10937 38 | 192.168.71.43:10938 39 | 192.168.71.43:10939 40 | 192.168.71.43:10940 41 | 192.168.71.43:10941 42 | 192.168.71.43:10942 43 | 192.168.71.43:10943 44 | 192.168.71.43:10944 45 | 192.168.71.43:10945 46 | 192.168.71.43:10946 47 | 192.168.71.43:10947 48 | 192.168.71.43:10948 49 | 192.168.71.43:10949 50 | 192.168.71.43:10950 51 | 192.168.71.43:10951 52 | 192.168.71.43:10952 53 | 192.168.71.43:10953 54 | 192.168.71.43:10954 55 | 192.168.71.43:10955 56 | 192.168.71.43:10956 57 | 192.168.71.43:10957 58 | 192.168.71.43:10958 59 | 192.168.71.43:10959 60 | 192.168.71.43:10960 61 | 192.168.71.43:10961 62 | 192.168.71.43:10962 63 | 192.168.71.43:10963 64 | 192.168.71.43:10964 65 | 192.168.71.43:10965 66 | 192.168.71.43:10966 67 | 192.168.71.43:10967 68 | 192.168.71.43:10968 69 | 192.168.71.43:10969 70 | 192.168.71.43:10970 -------------------------------------------------------------------------------- /start-multiple.js: -------------------------------------------------------------------------------- 1 | const pm2 = require('pm2'); 2 | 3 | async function sleep(ms) { 4 | return new Promise(resolve => setTimeout(resolve, ms)); 5 | } 6 | 7 | // 从命令行获取参数 8 | const START_USER = parseInt(process.argv[2] || 1); 9 | const END_USER = parseInt(process.argv[3] || 2); 10 | 11 | console.log(`准备启动用户 ${START_USER} 到 ${END_USER}`); 12 | 13 | pm2.connect(async function(err) { 14 | if (err) { 15 | console.error(err); 16 | process.exit(2); 17 | } 18 | 19 | for(let userNumber = START_USER; userNumber <= END_USER; userNumber++) { 20 | pm2.start({ 21 | script: './worker.js', 22 | name: `gradient-user-${userNumber}`, 23 | args: [userNumber.toString()], 24 | max_memory_restart: '500M', 25 | env: { 26 | USER_NUMBER: userNumber 27 | } 28 | }, (err, apps) => { 29 | if (err) { 30 | console.error(`User ${userNumber} 启动失败:`, err); 31 | } else { 32 | console.log(`User ${userNumber} 启动成功`); 33 | } 34 | }); 35 | await sleep(10000); // 等待5秒 36 | } 37 | }); -------------------------------------------------------------------------------- /worker.js: -------------------------------------------------------------------------------- 1 | const fs = require('fs'); 2 | const path = require('path'); 3 | const randomUseragent = require('random-useragent'); 4 | const puppeteer = require('puppeteer-extra'); 5 | const StealthPlugin = require('puppeteer-extra-plugin-stealth'); 6 | require('dotenv').config(); 7 | 8 | puppeteer.use(StealthPlugin()); 9 | 10 | // 获取传入的用户编号 11 | const userNumber = parseInt(process.argv[2] || process.env.USER_NUMBER); 12 | 13 | // 其他函数保持不变 14 | function getCurrentTime() { 15 | const now = new Date(); 16 | return now.toISOString().replace('T', ' ').split('.')[0]; 17 | } 18 | 19 | function log(userIndex, message) { 20 | console.log(`[${getCurrentTime()}] [User ${userIndex + 1}] ${message}`); 21 | } 22 | 23 | function sleep(ms) { 24 | return new Promise(resolve => setTimeout(resolve, ms)); 25 | } 26 | 27 | // 从文件中读取代理信息并解析 28 | function loadProxies(filePath) { 29 | const proxies = []; 30 | const data = fs.readFileSync(filePath, 'utf-8').split('\n'); 31 | data.forEach(line => { 32 | const [ip, port] = line.trim().split(':'); 33 | if (ip && port) { 34 | proxies.push({ ip, port }); 35 | } 36 | }); 37 | return proxies; 38 | } 39 | 40 | // 从文件中读取用户名和密码 41 | function loadCredentials(filePath) { 42 | const credentials = []; 43 | const data = fs.readFileSync(filePath, 'utf-8').split('\n'); 44 | data.forEach(line => { 45 | const [username, password] = line.trim().split(':'); 46 | if (username && password) { 47 | credentials.push({ username, password }); 48 | } 49 | }); 50 | return credentials; 51 | } 52 | 53 | function getRandomFingerprint() { 54 | const languages = [ 55 | // 英语变体 56 | 'en-US', 'en-GB', 'en-CA', 'en-AU', 'en-NZ', 'en-IE', 'en-ZA', 'en-IN', 57 | // 欧洲语言 58 | 'fr-FR', 'fr-CA', 'fr-BE', 'fr-CH', 59 | 'de-DE', 'de-AT', 'de-CH', 60 | 'es-ES', 'es-MX', 'es-AR', 'es-CO', 'es-CL', 61 | 'it-IT', 'it-CH', 62 | 'pt-PT', 'pt-BR', 63 | 'nl-NL', 'nl-BE', 64 | 'pl-PL', 'ru-RU', 'uk-UA', 65 | 'sv-SE', 'no-NO', 'da-DK', 'fi-FI', 66 | // 亚洲语言 67 | 'zh-CN', 'zh-TW', 'zh-HK', 68 | 'ja-JP', 'ko-KR', 69 | 'hi-IN', 'bn-IN', 'ta-IN', 70 | 'th-TH', 'vi-VN', 'id-ID', 'ms-MY', 71 | // 其他地区 72 | 'ar-SA', 'ar-AE', 'ar-EG', 73 | 'tr-TR', 'he-IL', 'fa-IR' 74 | ]; 75 | const colorProfiles = ['srgb', 'display-p3', 'color-gamut-p3']; 76 | const gpuVendors = ['intel', 'amd', 'nvidia']; 77 | 78 | // 生成随机缩放因子 79 | const randomScale = (Math.floor(Math.random() * 41) * 0.05 + 0.5).toFixed(2); 80 | 81 | // 生成随机分辨率 82 | const randomWidth = Math.floor(Math.random() * 40) * 40 + 800; // 800-2360 83 | const randomHeight = Math.floor(Math.random() * 30) * 30 + 600; // 600-1470 84 | 85 | return [ 86 | `--accept-lang=${languages[Math.floor(Math.random() * languages.length)]}`, 87 | `--force-color-profile=${colorProfiles[Math.floor(Math.random() * colorProfiles.length)]}`, 88 | `--force-device-scale-factor=${randomScale}`, 89 | `--window-size=${randomWidth},${randomHeight}`, 90 | `--gpu-vendor=${gpuVendors[Math.floor(Math.random() * gpuVendors.length)]}`, 91 | ]; 92 | } 93 | 94 | async function launch(userIndex, userDataDir, proxy, userCredentials) { 95 | const extensionPath1 = path.resolve('extension'); 96 | const extensionPath2 = path.resolve('canvas'); 97 | 98 | const extensionPaths = [extensionPath1, extensionPath2].join(','); 99 | 100 | //const pemPath = path.resolve('1.0.14_0.pem'); 101 | const proxyUrl = `http://${proxy.ip}:${proxy.port}`; 102 | // 动态调试端口,根据 userIndex 生成不同的端口号 103 | const debuggingPort = 11500 + userIndex; 104 | 105 | log(userIndex, `Launching browser with user data directory: ${userDataDir}, proxy: ${proxyUrl}, and debugging port: ${debuggingPort}`); 106 | 107 | let executablePath; 108 | if (process.env.CHROME_PATH) { 109 | executablePath = process.env.CHROME_PATH; 110 | } 111 | console.log('Using Chrome path:', executablePath || 'Default Chromium from puppeteer'); 112 | 113 | // 获取随机指纹参数 114 | const randomFingerprint = getRandomFingerprint(); 115 | const browser = await puppeteer.launch({ 116 | ...executablePath && { executablePath }, 117 | headless: true, 118 | ignoreHTTPSErrors: true, 119 | userDataDir: userDataDir, 120 | args: [ 121 | `--no-sandbox`, 122 | `--disable-extensions-except=${extensionPaths}`, 123 | `--load-extension=${extensionPaths}`, 124 | //`--ignore-certificate-errors=${pemPath}`, 125 | `--proxy-server=${proxyUrl}`, 126 | `--remote-debugging-port=${debuggingPort}`, // 根据 userIndex 设置的调试端口 127 | //'--disable-gpu', // 禁用GPU加速 128 | //'--disable-dev-shm-usage', // 禁用/dev/shm使用 129 | //'--disable-setuid-sandbox', 130 | '--no-first-run', 131 | '--no-zygote', 132 | `--js-flags=--max-old-space-size=512`, // 限制JavaScript堆内存 133 | 134 | // 随机指纹参数 135 | ...randomFingerprint, 136 | // 固定的反指纹参数 137 | //'--disable-gpu-driver-bug-workarounds', 138 | //'--disable-webgl2', 139 | //'--disable-reading-from-canvas', 140 | //'--disable-audio-output', 141 | 142 | // 随机化 WebGL 参数 143 | //Math.random() > 0.5 ? '--disable-webgl' : '--use-gl=desktop', 144 | Math.random() > 0.5 ? '--use-angle=d3d11' : '--use-angle=d3d9', 145 | 146 | // 随机化其他功能 147 | Math.random() > 0.5 ? '--disable-accelerated-2d-canvas' : '', 148 | Math.random() > 0.5 ? '--disable-canvas-aa' : '', 149 | Math.random() > 0.5 ? '--disable-2d-canvas-clip-aa' : '', 150 | ].filter(Boolean), // 过滤掉空字符串 151 | }); 152 | log(userIndex, `Browser launched successfully with user data directory: ${userDataDir}`); 153 | 154 | // 遍历所有页面并关闭包含 "gradient" 的页面 155 | try { 156 | await sleep(5000) 157 | 158 | const pages = await browser.pages(); 159 | for (const page of pages) { 160 | const url = await page.url(); // 获取页面的 URL 161 | if (url.includes("gradient")) { 162 | await page.close(); 163 | log(userIndex, `Closed page with URL containing "gradient": ${url}`); 164 | } 165 | } 166 | 167 | log(userIndex, `Creating new page for user data directory: ${userDataDir}`); 168 | const page = await browser.newPage(); 169 | log(userIndex, `Page created successfully for user data directory: ${userDataDir}`); 170 | 171 | const randomUserAgent = randomUseragent.getRandom(); 172 | await page.setUserAgent(randomUserAgent); 173 | log(userIndex, `Using user agent: ${randomUserAgent}`); 174 | 175 | const url = 'https://app.gradient.network/'; 176 | log(userIndex, `Navigating to ${url}...`); 177 | await page.goto(url, { waitUntil: 'domcontentloaded' }); 178 | log(userIndex, `Page loaded successfully for user data directory: ${userDataDir}`); 179 | 180 | // 查找并输入邮箱 181 | const emailSelector = 'input[placeholder="Enter Email"]'; 182 | const passwordSelector = 'input[placeholder="Enter Password"]'; 183 | 184 | // 输入邮箱 185 | const emailInput = await page.waitForSelector(emailSelector, { timeout: 5000 }); 186 | if (emailInput) { 187 | await emailInput.type(userCredentials.username); 188 | log(userIndex, `Entered ${userCredentials.username} into email input.`); 189 | 190 | // 输入密码 191 | const passwordInput = await page.waitForSelector(passwordSelector, { timeout: 5000 }); 192 | if (passwordInput) { 193 | await passwordInput.type(userCredentials.password); 194 | log(userIndex, `Entered ${userCredentials.password} into password input.`); 195 | 196 | // 按下回车键 197 | await passwordInput.press('Enter'); 198 | log(userIndex, "Submitted login form."); 199 | } else { 200 | log(userIndex, "Password input not found, skipping."); 201 | } 202 | } else { 203 | log(userIndex, "Email input not found, skipping password input."); 204 | } 205 | } catch (e) { 206 | log(userIndex, `Error: ${e.message}`); 207 | } 208 | 209 | await sleep(10000) 210 | const pages = await browser.pages(); 211 | // 遍历所有页面并关闭包含 "gradient" 的页面 212 | for (const page of pages) { 213 | const url = await page.url(); // 获取页面的 URL 214 | if (url.includes("gradient")) { 215 | await page.close(); 216 | log(userIndex, `Closed page with URL containing "gradient": ${url}`); 217 | } 218 | } 219 | } 220 | 221 | // 主运行函数 222 | async function run() { 223 | try { 224 | const userIndex = userNumber - 1; 225 | const baseUserDataDir = path.resolve('USERDATA'); 226 | const userDataDir = path.join(baseUserDataDir, userNumber.toString().padStart(4, '0')); 227 | 228 | // 确保用户数据目录存在 229 | fs.mkdirSync(userDataDir, { recursive: true }); 230 | 231 | // 读取代理和凭据 232 | const proxies = loadProxies('proxies.txt'); 233 | const credentials = loadCredentials('credentials.txt'); 234 | 235 | if (!proxies[userIndex] || !credentials[userIndex]) { 236 | throw new Error('代理或凭据不足'); 237 | } 238 | 239 | await launch(userIndex, userDataDir, proxies[userIndex], credentials[userIndex]); 240 | } catch (error) { 241 | console.error(`Worker ${userNumber} error:`, error); 242 | process.exit(1); 243 | } 244 | } 245 | 246 | // 启动工作进程 247 | run(); 248 | 249 | // 错误处理 250 | process.on('uncaughtException', (err) => { 251 | console.error(`Worker ${userNumber} uncaught exception:`, err); 252 | process.exit(1); 253 | }); 254 | 255 | process.on('unhandledRejection', (reason, promise) => { 256 | console.error(`Worker ${userNumber} unhandled rejection:`, reason); 257 | process.exit(1); 258 | }); 259 | --------------------------------------------------------------------------------