├── .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("
")},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;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("
")};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 | /** */
97 |
98 | /** */
99 |
100 | /** */
101 |
102 | /** */
103 |
104 | /** */
105 |
106 | /** */
107 |
108 | /** */
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 |
4 |
--------------------------------------------------------------------------------
/extension/src/assets/image/arrow-right.svg:
--------------------------------------------------------------------------------
1 |
5 |
--------------------------------------------------------------------------------
/extension/src/assets/image/copy.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/extension/src/assets/image/dashboard-not-selected.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/extension/src/assets/image/dashboard-selected.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/extension/src/assets/image/gps-not-selected.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/extension/src/assets/image/gps-selected.svg:
--------------------------------------------------------------------------------
1 |
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 |
15 |
--------------------------------------------------------------------------------
/extension/src/assets/image/info-circle.svg:
--------------------------------------------------------------------------------
1 |
6 |
--------------------------------------------------------------------------------
/extension/src/assets/image/line.svg:
--------------------------------------------------------------------------------
1 |
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 |
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 |
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 |
--------------------------------------------------------------------------------