-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path_worker.js
More file actions
3 lines (2 loc) · 83.8 KB
/
_worker.js
File metadata and controls
3 lines (2 loc) · 83.8 KB
1
2
3
// <!--GAMFC-->version base on commit: a4fa106a2957d49e49a83321258e3d38ed15b068 - last update: 2025-11-23 23:57:51 UTC <!--GAMFC-END-->.
import{connect}from'cloudflare:sockets';const Config={'userID':'d342d11e-d424-4583-b36e-524ab1f0afa4','proxyIPs':['nima.nscl.ir:443'],'scamalytics':{'username':'victoriacrossn','apiKey':'ed89b4fef21aba43c15cdd15cff2138dd8d3bbde5aaaa4690ad8e94990448516','baseUrl':'https://api12.scamalytics.com/v3/'},'socks5':{'enabled':![],'relayMode':![],'address':''},'fromEnv'(a){const b=a['PROXYIP']||this['proxyIPs'][Math['floor'](Math['random']()*this['proxyIPs']['length'])],[c,d='443']=b['split'](':');return{'userID':a['UUID']||this['userID'],'proxyIP':c,'proxyPort':d,'proxyAddress':b,'scamalytics':{'username':a['SCAMALYTICS_USERNAME']||this['scamalytics']['username'],'apiKey':a['SCAMALYTICS_API_KEY']||this['scamalytics']['apiKey'],'baseUrl':a['SCAMALYTICS_BASEURL']||this['scamalytics']['baseUrl']},'socks5':{'enabled':!!a['SOCKS5'],'relayMode':a['SOCKS5_RELAY']==='true'||this['socks5']['relayMode'],'address':a['SOCKS5']||this['socks5']['address']}};}},CONST={'ED_PARAMS':{'ed':0xa00,'eh':'Sec-WebSocket-Protocol'},'AT_SYMBOL':'@','VLESS_PROTOCOL':'vless','WS_READY_STATE_OPEN':0x1,'WS_READY_STATE_CLOSING':0x2};function generateRandomPath(a=0xc,b=''){const c='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';let d='';for(let e=0x0;e<a;e++){d+=c['charAt'](Math['floor'](Math['random']()*c['length']));}return'/'+d+(b?'?'+b:'');}const CORE_PRESETS={'xray':{'tls':{'path':()=>generateRandomPath(0xc,'ed=2560'),'security':'tls','fp':'chrome','alpn':'http/1.1','extra':{}},'tcp':{'path':()=>generateRandomPath(0xc,'ed=2560'),'security':'none','fp':'chrome','extra':{}}},'sb':{'tls':{'path':()=>generateRandomPath(0x12),'security':'tls','fp':'chrome','alpn':'http/1.1','extra':CONST['ED_PARAMS']},'tcp':{'path':()=>generateRandomPath(0x12),'security':'none','fp':'chrome','extra':CONST['ED_PARAMS']}}};function makeName(a,b){return a+'-'+b['toUpperCase']();}function createVlessLink({userID:a,address:b,port:c,host:d,path:e,security:f,sni:g,fp:h,alpn:i,extra:extra={},name:j}){const l=new URLSearchParams({'type':'ws','host':d,'path':e});f&&(l['set']('security',f),f==='tls'&&l['set']('allowInsecure','1'));if(g)l['set']('sni',g);if(h)l['set']('fp',h);if(i)l['set']('alpn',i);for(const [m,n]of Object['entries'](extra))l['set'](m,n);return'vless://'+a+'@'+b+':'+c+'?'+l['toString']()+'#'+encodeURIComponent(j);}function buildLink({core:a,proto:b,userID:c,hostName:d,address:e,port:f,tag:g}){const h=CORE_PRESETS[a][b];return createVlessLink({'userID':c,'address':e,'port':f,'host':d,'path':h['path'](),'security':h['security'],'sni':h['security']==='tls'?randomizeCase(d):undefined,'fp':h['fp'],'alpn':h['alpn'],'extra':h['extra'],'name':makeName(g,b)});}const pick=a=>a[Math['floor'](Math['random']()*a['length'])];async function handleIpSubscription(a,b,c,d){const f=new URL(a['url']),g=f['searchParams']['get']('name'),h={'total_TB':0x17c,'base_GB':0xa410,'daily_growth_GB':0xfa,'expire_date':'2028-4-20'},i=[d,'creativecommons.org','www.speedtest.net','sky.rethinkdns.com','cfip.1323123.xyz','cfip.xxxxxxxx.tk','go.inmobi.com','singapore.com','www.visa.com','www.wto.org','cf.090227.xyz','cdnjs.com','zula.ir','csgo.com','fbi.gov'],j=[0x1bb,0x20fb,0x805,0x823,0x827,0x830],k=[0x50,0x1f90,0x22b0,0x804,0x822,0x826,0x82f];let l=[];const m=d['endsWith']('.pages.dev');i['forEach']((A,B)=>{l['push'](buildLink({'core':b,'proto':'tls','userID':c,'hostName':d,'address':A,'port':pick(j),'tag':'D'+(B+0x1)})),!m&&l['push'](buildLink({'core':b,'proto':'tcp','userID':c,'hostName':d,'address':A,'port':pick(k),'tag':'D'+(B+0x1)}));});try{const A=await fetch('https://raw.githubusercontent.com/NiREvil/vless/refs/heads/main/Cloudflare-IPs.json');if(A['ok']){const B=await A['json'](),C=[...B['ipv4']||[],...B['ipv6']||[]]['slice'](0x0,0x14)['map'](D=>D['ip']);C['forEach']((D,E)=>{const F=D['includes'](':')?'['+D+']':D;l['push'](buildLink({'core':b,'proto':'tls','userID':c,'hostName':d,'address':F,'port':pick(j),'tag':'IP'+(E+0x1)})),!m&&l['push'](buildLink({'core':b,'proto':'tcp','userID':c,'hostName':d,'address':F,'port':pick(k),'tag':'IP'+(E+0x1)}));});}}catch(D){console['error']('Fetch\x20IP\x20list\x20failed',D);}const n=0x400*0x400*0x400,o=0x400*n,p=h['total_TB']*o,q=h['base_GB']*n,s=new Date(),t=s['getHours']()+s['getMinutes']()/0x3c,u=t/0x18*(h['daily_growth_GB']*n),v=q+u/0x2,w=q+u/0x2,x=Math['floor'](new Date(h['expire_date'])['getTime']()/0x3e8),y='upload='+Math['round'](w)+';\x20download='+Math['round'](v)+';\x20total='+p+';\x20expire='+x,z={'Content-Type':'text/plain;charset=utf-8','Profile-Update-Interval':'6','Subscription-Userinfo':y};return g&&(z['Profile-Title']=g),new Response(btoa(l['join']('\x0a')),{'headers':z});}export default{async 'fetch'(a,b,c){const d=Config['fromEnv'](b),e=new URL(a['url']),f=a['headers']['get']('Upgrade');if(f&&f['toLowerCase']()==='websocket'){const g={'userID':d['userID'],'proxyIP':d['proxyIP'],'proxyPort':d['proxyPort'],'socks5Address':d['socks5']['address'],'socks5Relay':d['socks5']['relayMode'],'enableSocks':d['socks5']['enabled'],'parsedSocks5Address':d['socks5']['enabled']?socks5AddressParser(d['socks5']['address']):{}};return ProtocolOverWSHandler(a,g);}if(e['pathname']==='/scamalytics-lookup')return handleScamalyticsLookup(a,d);if(e['pathname']['startsWith']('/xray/'+d['userID']))return handleIpSubscription(a,'xray',d['userID'],e['hostname']);if(e['pathname']['startsWith']('/sb/'+d['userID']))return handleIpSubscription(a,'sb',d['userID'],e['hostname']);if(e['pathname']['startsWith']('/'+d['userID']))return handleConfigPage(d['userID'],e['hostname'],d['proxyAddress']);return new Response('UUID\x20not\x20found.\x20Please\x20set\x20the\x20UUID\x20environment\x20variable\x20in\x20the\x20Cloudflare\x20dashboard.',{'status':0x194});}};async function handleScamalyticsLookup(a,b){const c=new URL(a['url']),d=c['searchParams']['get']('ip');if(!d)return new Response(JSON['stringify']({'error':'Missing\x20IP\x20parameter'}),{'status':0x190,'headers':{'Content-Type':'application/json'}});const {username:e,apiKey:f,baseUrl:g}=b['scamalytics'];if(!e||!f)return new Response(JSON['stringify']({'error':'Scamalytics\x20API\x20credentials\x20not\x20configured.'}),{'status':0x1f4,'headers':{'Content-Type':'application/json'}});const h=''+g+e+'/?key='+f+'&ip='+d,i=new Headers({'Content-Type':'application/json','Access-Control-Allow-Origin':'*'});try{const j=await fetch(h),k=await j['json']();return new Response(JSON['stringify'](k),{'headers':i});}catch(l){return new Response(JSON['stringify']({'error':l['toString']()}),{'status':0x1f4,'headers':i});}}function handleConfigPage(a,b,c){const d=generateBeautifulConfigPage(a,b,c);return new Response(d,{'headers':{'Content-Type':'text/html;\x20charset=utf-8'}});}function generateBeautifulConfigPage(a,b,c){const d=buildLink({'core':'xray','proto':'tls','userID':a,'hostName':b,'address':b,'port':0x1bb,'tag':b+'-Xray'}),e=buildLink({'core':'sb','proto':'tls','userID':a,'hostName':b,'address':b,'port':0x1bb,'tag':b+'-Singbox'}),f='INDEX',g={'dream':d,'freedom':e},h=encodeURIComponent(f),i='https://'+b+'/xray/'+a+'?name='+h,j='https://'+b+'/sb/'+a+'?name='+h,k={'clashMeta':'clash://install-config?url='+encodeURIComponent('https://revil-sub.pages.dev/sub/clash-meta?url='+j+'&remote_config=&udp=false&ss_uot=false&show_host=false&forced_ws0rtt=true')+'&name='+h,'hiddify':'hiddify://install-config?url='+encodeURIComponent(i),'v2rayng':'v2rayng://install-config?url='+encodeURIComponent(i)+'#'+h,'exclave':'sn://subscription?url='+encodeURIComponent(j)+'&name='+h};let l='\x0a\x20\x20<!doctype\x20html>\x0a\x20\x20<html\x20lang=\x22en\x22>\x0a\x20\x20<head>\x0a\x20\x20\x20\x20<meta\x20charset=\x22UTF-8\x22\x20/>\x0a\x20\x20\x20\x20<meta\x20name=\x22viewport\x22\x20content=\x22width=device-width,\x20initial-scale=1.0\x22\x20/>\x0a\x20\x20\x20\x20<title>VLESS\x20Proxy\x20Configuration</title>\x0a\x20\x20\x20\x20<link\x20rel=\x22icon\x22\x20href=\x22https://raw.githubusercontent.com/NiREvil/zizifn/refs/heads/Legacy/assets/raven-1.png\x22\x20type=\x22image/png\x22>\x0a\x20\x20\x20\x20<link\x20rel=\x22preconnect\x22\x20href=\x22https://fonts.googleapis.com\x22>\x0a\x20\x20\x20\x20<link\x20rel=\x22preconnect\x22\x20href=\x22https://fonts.gstatic.com\x22\x20crossorigin>\x0a\x20\x20\x20\x20<link\x20href=\x22https://fonts.googleapis.com/css2?family=Fira+Code:wght@300..700&display=swap\x22\x20rel=\x22stylesheet\x22>\x0a\x20\x20\x20\x20<style>'+getPageCSS()+'</style>\x20\x0a\x20\x20</head>\x0a\x20\x20<body\x20data-proxy-ip=\x22'+c+'\x22>\x0a\x20\x20\x20\x20'+getPageHTML(g,k)+'\x0a\x20\x20\x20\x20<script>'+getPageScript()+'</script>\x0a\x20\x20</body>\x0a\x20\x20</html>';return l;}async function ProtocolOverWSHandler(a,b){const c=new WebSocketPair(),[d,e]=Object['values'](c);e['accept']();let f='',g='',h=null;const i=(n,o)=>{console['log']('['+f+':'+g+']\x20'+n,o||'');},j=a['headers']['get']('Sec-WebSocket-Protocol')||'',k=MakeReadableWebSocketStream(e,j,i);let l={'value':null},m=![];return k['pipeTo'](new WritableStream({async 'write'(n,o){if(h)return h['write'](n);if(l['value']){const w=l['value']['writable']['getWriter']();await w['write'](n),w['releaseLock']();return;}const {hasError:p,message:q,addressType:r,portRemote:portRemote=0x1bb,addressRemote:addressRemote='',rawDataIndex:s,ProtocolVersion:ProtocolVersion=new Uint8Array([0x0,0x0]),isUDP:t}=ProcessProtocolHeader(n,b['userID']);f=addressRemote,g=portRemote+'--'+Math['random']()+'\x20'+(t?'udp':'tcp')+'\x20';if(p)throw new Error(q);const u=new Uint8Array([ProtocolVersion[0x0],0x0]),v=n['slice'](s);if(t){if(portRemote===0x35){const x=await createDnsPipeline(e,u,i);h=x['write'],h(v);}else throw new Error('UDP\x20proxy\x20is\x20only\x20enabled\x20for\x20DNS\x20(port\x2053)');return;}HandleTCPOutBound(l,r,addressRemote,portRemote,v,e,u,i,b);},'close'(){i('readableWebSocketStream\x20closed');},'abort'(n){i('readableWebSocketStream\x20aborted',n);}}))['catch'](n=>{console['error']('Pipeline\x20failed:',n['stack']||n);}),new Response(null,{'status':0x65,'webSocket':d});}function isValidUUID(a){const b=/^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;return b['test'](a);}function randomizeCase(a){let b='';for(let c=0x0;c<a['length'];c++){b+=Math['random']()<0.5?a[c]['toUpperCase']():a[c]['toLowerCase']();}return b;}async function HandleTCPOutBound(a,b,c,d,e,f,g,h,i){!i&&(i={'userID':'d342d11e-d424-4583-b36e-524ab1f0afa4','socks5Address':'','socks5Relay':![],'proxyIP':'nima.nscl.ir','proxyPort':'443','enableSocks':![],'parsedSocks5Address':{}});async function j(m,n,o=![]){let p;i['socks5Relay']?p=await socks5Connect(b,m,n,h,i['parsedSocks5Address']):p=o?await socks5Connect(b,m,n,h,i['parsedSocks5Address']):connect({'hostname':m,'port':n});a['value']=p,h('connected\x20to\x20'+m+':'+n);const q=p['writable']['getWriter']();return await q['write'](e),q['releaseLock'](),p;}async function k(){const m=i['enableSocks']?await j(c,d,!![]):await j(i['proxyIP']||c,i['proxyPort']||d,![]);m['closed']['catch'](n=>{console['log']('retry\x20tcpSocket\x20closed\x20error',n);})['finally'](()=>{safeCloseWebSocket(f);}),RemoteSocketToWS(m,f,g,null,h);}const l=await j(c,d);RemoteSocketToWS(l,f,g,k,h);}function MakeReadableWebSocketStream(a,b,c){return new ReadableStream({'start'(d){a['addEventListener']('message',g=>d['enqueue'](g['data'])),a['addEventListener']('close',()=>{safeCloseWebSocket(a),d['close']();}),a['addEventListener']('error',g=>{c('webSocketServer\x20has\x20error'),d['error'](g);});const {earlyData:e,error:f}=base64ToArrayBuffer(b);if(f)d['error'](f);else{if(e)d['enqueue'](e);}},'pull'(d){},'cancel'(d){c('ReadableStream\x20was\x20canceled,\x20due\x20to\x20'+d),safeCloseWebSocket(a);}});}function ProcessProtocolHeader(a,b){if(a['byteLength']<0x18)return{'hasError':!![],'message':'invalid\x20data'};const c=new DataView(a),d=c['getUint8'](0x0),e=stringify(new Uint8Array(a['slice'](0x1,0x11))),f=b['split'](',')['map'](p=>p['trim']()),g=f['some'](p=>e===p);if(!g)return{'hasError':!![],'message':'invalid\x20user'};const h=c['getUint8'](0x11),i=c['getUint8'](0x12+h);if(i!==0x1&&i!==0x2)return{'hasError':!![],'message':'command\x20'+i+'\x20is\x20not\x20supported'};const j=0x12+h+0x1,k=c['getUint16'](j),l=c['getUint8'](j+0x2);let m,n,o;switch(l){case 0x1:n=0x4,o=j+0x3,m=new Uint8Array(a['slice'](o,o+n))['join']('.');break;case 0x2:n=c['getUint8'](j+0x3),o=j+0x4,m=new TextDecoder()['decode'](a['slice'](o,o+n));break;case 0x3:n=0x10,o=j+0x3,m=Array['from']({'length':0x8},(p,q)=>c['getUint16'](o+q*0x2)['toString'](0x10))['join'](':');break;default:return{'hasError':!![],'message':'invalid\x20addressType:\x20'+l};}if(!m)return{'hasError':!![],'message':'addressValue\x20is\x20empty,\x20addressType\x20is\x20'+l};return{'hasError':![],'addressRemote':m,'addressType':l,'portRemote':k,'rawDataIndex':o+n,'ProtocolVersion':new Uint8Array([d]),'isUDP':i===0x2};}async function RemoteSocketToWS(a,b,c,d,e){let f=![];try{await a['readable']['pipeTo'](new WritableStream({async 'write'(g){if(b['readyState']!==CONST['WS_READY_STATE_OPEN'])throw new Error('WebSocket\x20is\x20not\x20open');f=!![];const h=c?await new Blob([c,g])['arrayBuffer']():g;b['send'](h),c=null;},'close'(){e('Remote\x20connection\x20readable\x20closed.\x20Had\x20incoming\x20data:\x20'+f);},'abort'(g){console['error']('Remote\x20connection\x20readable\x20aborted:',g);}}));}catch(g){console['error']('RemoteSocketToWS\x20error:',g['stack']||g),safeCloseWebSocket(b);}!f&&d&&(e('No\x20incoming\x20data,\x20retrying'),await d());}function base64ToArrayBuffer(a){if(!a)return{'earlyData':null,'error':null};try{const b=atob(a['replace'](/-/g,'+')['replace'](/_/g,'/')),c=new ArrayBuffer(b['length']),d=new Uint8Array(c);for(let e=0x0;e<b['length'];e++){d[e]=b['charCodeAt'](e);}return{'earlyData':c,'error':null};}catch(f){return{'earlyData':null,'error':f};}}function safeCloseWebSocket(a){try{(a['readyState']===CONST['WS_READY_STATE_OPEN']||a['readyState']===CONST['WS_READY_STATE_CLOSING'])&&a['close']();}catch(b){console['error']('safeCloseWebSocket\x20error:',b);}}const byteToHex=Array['from']({'length':0x100},(a,b)=>(b+0x100)['toString'](0x10)['slice'](0x1));function unsafeStringify(a,b=0x0){return(byteToHex[a[b]]+byteToHex[a[b+0x1]]+byteToHex[a[b+0x2]]+byteToHex[a[b+0x3]]+'-'+byteToHex[a[b+0x4]]+byteToHex[a[b+0x5]]+'-'+byteToHex[a[b+0x6]]+byteToHex[a[b+0x7]]+'-'+byteToHex[a[b+0x8]]+byteToHex[a[b+0x9]]+'-'+byteToHex[a[b+0xa]]+byteToHex[a[b+0xb]]+byteToHex[a[b+0xc]]+byteToHex[a[b+0xd]]+byteToHex[a[b+0xe]]+byteToHex[a[b+0xf]])['toLowerCase']();}function stringify(a,b=0x0){const c=unsafeStringify(a,b);if(!isValidUUID(c))throw new TypeError('Stringified\x20UUID\x20is\x20invalid');return c;}async function createDnsPipeline(a,b,c){let d=![];const e=new TransformStream({'transform'(g,h){for(let i=0x0;i<g['byteLength'];){const j=g['slice'](i,i+0x2),k=new DataView(j)['getUint16'](0x0),l=new Uint8Array(g['slice'](i+0x2,i+0x2+k));i=i+0x2+k,h['enqueue'](l);}}});e['readable']['pipeTo'](new WritableStream({async 'write'(g){try{const h=await fetch('https://1.1.1.1/dns-query',{'method':'POST','headers':{'content-type':'application/dns-message'},'body':g}),i=await h['arrayBuffer'](),j=i['byteLength'],k=new Uint8Array([j>>0x8&0xff,j&0xff]);a['readyState']===CONST['WS_READY_STATE_OPEN']&&(c('DNS\x20query\x20successful,\x20length:\x20'+j),d?a['send'](await new Blob([k,i])['arrayBuffer']()):(a['send'](await new Blob([b,k,i])['arrayBuffer']()),d=!![]));}catch(l){c('DNS\x20query\x20error:\x20'+l);}}}))['catch'](g=>{c('DNS\x20stream\x20error:\x20'+g);});const f=e['writable']['getWriter']();return{'write':g=>f['write'](g)};}async function socks5Connect(a,b,c,d,e){const {username:f,password:g,hostname:h,port:i}=e,j=connect({'hostname':h,'port':i}),k=j['writable']['getWriter'](),l=j['readable']['getReader'](),m=new TextEncoder();await k['write'](new Uint8Array([0x5,0x2,0x0,0x2]));let n=(await l['read']())['value'];if(n[0x0]!==0x5||n[0x1]===0xff)throw new Error('SOCKS5\x20server\x20connection\x20failed.');if(n[0x1]===0x2){if(!f||!g)throw new Error('SOCKS5\x20auth\x20credentials\x20not\x20provided.');const q=new Uint8Array([0x1,f['length'],...m['encode'](f),g['length'],...m['encode'](g)]);await k['write'](q),n=(await l['read']())['value'];if(n[0x0]!==0x1||n[0x1]!==0x0)throw new Error('SOCKS5\x20authentication\x20failed.');}let o;switch(a){case 0x1:o=new Uint8Array([0x1,...b['split']('.')['map'](Number)]);break;case 0x2:o=new Uint8Array([0x3,b['length'],...m['encode'](b)]);break;case 0x3:o=new Uint8Array([0x4,...b['split'](':')['flatMap'](r=>[parseInt(r['slice'](0x0,0x2),0x10),parseInt(r['slice'](0x2),0x10)])]);break;default:throw new Error('Invalid\x20addressType\x20for\x20SOCKS5:\x20'+a);}const p=new Uint8Array([0x5,0x1,0x0,...o,c>>0x8,c&0xff]);await k['write'](p),n=(await l['read']())['value'];if(n[0x1]!==0x0)throw new Error('Failed\x20to\x20open\x20SOCKS5\x20connection.');return k['releaseLock'](),l['releaseLock'](),j;}function socks5AddressParser(a){try{const [b,c]=a['includes']('@')?a['split']('@'):[null,a],[d,e]=c['split'](':'),f=parseInt(e,0xa);if(!d||isNaN(f))throw new Error();let g,h;if(b){[g,h]=b['split'](':');if(!g)throw new Error();}return{'username':g,'password':h,'hostname':d,'port':f};}catch{throw new Error('Invalid\x20SOCKS5\x20address\x20format.\x20Expected\x20[user:pass@]host:port');}}function getPageCSS(){return'\x0a\x20\x20*\x20{\x0a\x20\x20\x20\x20margin:\x200;\x0a\x20\x20\x20\x20padding:\x200;\x0a\x20\x20\x20\x20box-sizing:\x20border-box;\x0a\x20\x20}\x0a\x20\x20@font-face\x20{\x0a\x20\x20\x20\x20font-family:\x20\x22Aldine\x20401\x20BT\x20Web\x22;\x0a\x20\x20\x20\x20src:\x20url(\x22https://pub-7a3b428c76aa411181a0f4dd7fa9064b.r2.dev/Aldine401_Mersedeh.woff2\x22)\x20format(\x22woff2\x22);\x0a\x20\x20\x20\x20font-weight:\x20400;\x20font-style:\x20normal;\x20font-display:\x20swap;\x0a\x20\x20}\x0a\x20\x20@font-face\x20{\x0a\x20\x20\x20\x20font-family:\x20\x22Styrene\x20B\x20LC\x22;\x0a\x20\x20\x20\x20src:\x20url(\x22https://pub-7a3b428c76aa411181a0f4dd7fa9064b.r2.dev/StyreneBLC-Regular.woff2\x22)\x20format(\x22woff2\x22);\x0a\x20\x20\x20\x20font-weight:\x20400;\x20font-style:\x20normal;\x20font-display:\x20swap;\x0a\x20\x20}\x0a\x20\x20@font-face\x20{\x0a\x20\x20\x20\x20font-family:\x20\x22Styrene\x20B\x20LC\x22;\x0a\x20\x20\x20\x20src:\x20url(\x22https://pub-7a3b428c76aa411181a0f4dd7fa9064b.r2.dev/StyreneBLC-Medium.woff2\x22)\x20format(\x22woff2\x22);\x0a\x20\x20\x20\x20font-weight:\x20500;\x20font-style:\x20normal;\x20font-display:\x20swap;\x0a\x20\x20}\x0a\x0a\x20\x20:root\x20{\x0a\x20\x20\x20\x20--background-primary:\x20#2a2421;\x20--background-secondary:\x20#35302c;\x20--background-tertiary:\x20#413b35;\x0a\x20\x20\x20\x20--border-color:\x20#5a4f45;\x20--border-color-hover:\x20#766a5f;\x20--text-primary:\x20#e5dfd6;\x20--text-secondary:\x20#b3a89d;\x0a\x20\x20\x20\x20--text-accent:\x20#ffffff;\x20--accent-primary:\x20#be9b7b;\x20--accent-secondary:\x20#d4b595;\x20--accent-tertiary:\x20#8d6e5c;\x0a\x20\x20\x20\x20--accent-primary-darker:\x20#8a6f56;\x20--button-text-primary:\x20#2a2421;\x20--button-text-secondary:\x20var(--text-primary);\x0a\x20\x20\x20\x20--shadow-color:\x20rgba(0,\x200,\x200,\x200.35);\x20--shadow-color-accent:\x20rgba(190,\x20155,\x20123,\x200.4);\x0a\x20\x20\x20\x20--border-radius:\x208px;\x20--transition-speed:\x200.2s;\x20--transition-speed-fast:\x200.1s;\x20--transition-speed-medium:\x200.3s;\x20--transition-speed-long:\x200.6s;\x0a\x20\x20\x20\x20--status-success:\x20#70b570;\x20--status-error:\x20#e05d44;\x20--status-warning:\x20#e0bc44;\x20--status-info:\x20#4f90c4;\x0a\x20\x20\x20\x20--serif:\x20\x22Aldine\x20401\x20BT\x20Web\x22,\x20\x22Times\x20New\x20Roman\x22,\x20Times,\x20Georgia,\x20ui-serif,\x20serif;\x0a\x20\x20\x20\x20--sans-serif:\x20\x22Styrene\x20B\x20LC\x22,\x20-apple-system,\x20BlinkMacSystemFont,\x20\x22Segoe\x20UI\x22,\x20Helvetica,\x20Arial,\x20\x22Noto\x20Color\x20Emoji\x22,\x20sans-serif;\x0a\x20\x20\x20\x20--mono-serif:\x20\x22Fira\x20Code\x22,\x20Cantarell,\x20\x22Courier\x20Prime\x22,\x20monospace;\x0a\x20\x20}\x0a\x0a\x20\x20body\x20{\x0a\x20\x20\x20\x20font-family:\x20var(--sans-serif);\x20font-size:\x2016px;\x20font-weight:\x20400;\x20font-style:\x20normal;\x0a\x20\x20\x20\x20background-color:\x20var(--background-primary);\x20color:\x20var(--text-primary);\x0a\x20\x20\x20\x20padding:\x203rem;\x20line-height:\x201.5;\x20-webkit-font-smoothing:\x20antialiased;\x20-moz-osx-font-smoothing:\x20grayscale;\x0a\x20\x20}\x0a\x0a\x20\x20.container\x20{\x0a\x20\x20\x20\x20max-width:\x20800px;\x20margin:\x2020px\x20auto;\x20padding:\x200\x2012px;\x20border-radius:\x20var(--border-radius);\x0a\x20\x20\x20\x20box-shadow:\x200\x206px\x2015px\x20rgba(0,\x200,\x200,\x200.2),\x200\x200\x2025px\x208px\x20var(--shadow-color-accent);\x0a\x20\x20\x20\x20transition:\x20box-shadow\x20var(--transition-speed-medium)\x20ease;\x0a\x20\x20}\x0a\x0a\x20\x20.container:hover\x20{\x20box-shadow:\x200\x208px\x2020px\x20rgba(0,\x200,\x200,\x200.25),\x200\x200\x2035px\x2010px\x20var(--shadow-color-accent);\x20}\x0a\x20\x20.header\x20{\x20text-align:\x20center;\x20margin-bottom:\x2040px;\x20padding-top:\x2030px;\x20}\x0a\x20\x20.header\x20h1\x20{\x20font-family:\x20var(--serif);\x20font-weight:\x20400;\x20font-size:\x202rem;\x20color:\x20var(--text-accent);\x20margin-top:\x200px;\x20margin-bottom:\x202px;\x20}\x0a\x20\x20.header\x20p\x20{\x20color:\x20var(--text-secondary);\x20font-size:\x200.8rem;\x20font-weight:\x20400;\x20}\x0a\x20\x20.config-card\x20{\x0a\x20\x20\x20\x20background:\x20var(--background-secondary);\x20border-radius:\x20var(--border-radius);\x20padding:\x2020px;\x20margin-bottom:\x2024px;\x0a\x20\x20\x20\x20border:\x201px\x20solid\x20var(--border-color);\x0a\x20\x20\x20\x20transition:\x20border-color\x20var(--transition-speed)\x20ease,\x20box-shadow\x20var(--transition-speed)\x20ease;\x0a\x20\x20}\x0a\x0a\x20\x20.config-card:hover\x20{\x20border-color:\x20var(--border-color-hover);\x20box-shadow:\x200\x204px\x208px\x20var(--shadow-color);\x20}\x0a\x20\x20.config-title\x20{\x0a\x20\x20\x20\x20font-family:\x20var(--serif);\x20font-size:\x201.4rem;\x20font-weight:\x20400;\x20color:\x20var(--accent-secondary);\x0a\x20\x20\x20\x20margin-bottom:\x2016px;\x20padding-bottom:\x2013px;\x20border-bottom:\x201px\x20solid\x20var(--border-color);\x0a\x20\x20\x20\x20display:\x20flex;\x20align-items:\x20center;\x20justify-content:\x20space-between;\x0a\x20\x20}\x0a\x0a\x20\x20.config-title\x20.refresh-btn\x20{\x0a\x20\x20\x20\x20position:\x20relative;\x20overflow:\x20hidden;\x20display:\x20flex;\x20align-items:\x20center;\x20gap:\x204px;\x0a\x20\x20\x20\x20font-family:\x20var(--serif);\x20font-size:\x2012px;\x20padding:\x206px\x2012px;\x20border-radius:\x206px;\x0a\x20\x20\x20\x20color:\x20var(--accent-secondary);\x20background-color:\x20var(--background-tertiary);\x20border:\x201px\x20solid\x20var(--border-color);\x0a\x20\x20\x20\x20cursor:\x20pointer;\x0a\x20\x20\x20\x20transition:\x20background-color\x20var(--transition-speed)\x20ease,\x20border-color\x20var(--transition-speed)\x20ease,\x20color\x20var(--transition-speed)\x20ease,\x20transform\x20var(--transition-speed)\x20ease,\x20box-shadow\x20var(--transition-speed)\x20ease;\x0a\x20\x20}\x0a\x0a\x20\x20.config-title\x20.refresh-btn::before\x20{\x0a\x20\x20\x20\x20content:\x20\x27\x27;\x20position:\x20absolute;\x20top:\x200;\x20left:\x200;\x20width:\x20100%;\x20height:\x20100%;\x0a\x20\x20\x20\x20background:\x20linear-gradient(120deg,\x20transparent,\x20rgba(255,\x20255,\x20255,\x200.2),\x20transparent);\x0a\x20\x20\x20\x20transform:\x20translateX(-100%);\x20transition:\x20transform\x20var(--transition-speed-long)\x20ease;\x20z-index:\x201;\x0a\x20\x20}\x0a\x0a\x20\x20.config-title\x20.refresh-btn:hover\x20{\x0a\x20\x20\x20\x20letter-spacing:\x200.5px;\x20font-weight:\x20600;\x20background-color:\x20#4d453e;\x20color:\x20var(--accent-primary);\x0a\x20\x20\x20\x20border-color:\x20var(--border-color-hover);\x20transform:\x20translateY(-2px);\x20box-shadow:\x200\x204px\x208px\x20var(--shadow-color);\x0a\x20\x20}\x0a\x0a\x20\x20.config-title\x20.refresh-btn:hover::before\x20{\x20transform:\x20translateX(100%);\x20}\x0a\x20\x20.config-title\x20.refresh-btn:active\x20{\x20transform:\x20translateY(0px)\x20scale(0.98);\x20box-shadow:\x20none;\x20}\x0a\x20\x20.refresh-icon\x20{\x20width:\x2012px;\x20height:\x2012px;\x20stroke:\x20currentColor;\x20}\x0a\x20\x20.config-content\x20{\x0a\x20\x20\x20\x20position:\x20relative;\x20background:\x20var(--background-tertiary);\x20border-radius:\x20var(--border-radius);\x0a\x20\x20\x20\x20padding:\x2016px;\x20margin-bottom:\x2020px;\x20border:\x201px\x20solid\x20var(--border-color);\x0a\x20\x20}\x0a\x0a\x20\x20.config-content\x20pre\x20{\x0a\x20\x20\x20\x20overflow-x:\x20auto;\x20font-family:\x20var(--mono-serif);\x20font-size:\x2012px;\x20color:\x20var(--text-primary);\x0a\x20\x20\x20\x20margin:\x200;\x20white-space:\x20pre-wrap;\x20word-break:\x20break-all;\x0a\x20\x20}\x0a\x0a\x20\x20.button\x20{\x0a\x20\x20\x20\x20display:\x20inline-flex;\x20align-items:\x20center;\x20justify-content:\x20center;\x20gap:\x208px;\x0a\x20\x20\x20\x20padding:\x208px\x2016px;\x20border-radius:\x20var(--border-radius);\x20font-size:\x2015px;\x20font-weight:\x20500;\x0a\x20\x20\x20\x20cursor:\x20pointer;\x20border:\x201px\x20solid\x20var(--border-color);\x20background-color:\x20var(--background-tertiary);\x0a\x20\x20\x20\x20color:\x20var(--button-text-secondary);\x0a\x20\x20\x20\x20transition:\x20background-color\x20var(--transition-speed)\x20ease,\x20border-color\x20var(--transition-speed)\x20ease,\x20color\x20var(--transition-speed)\x20ease,\x20transform\x20var(--transition-speed)\x20ease,\x20box-shadow\x20var(--transition-speed)\x20ease;\x0a\x20\x20\x20\x20-webkit-tap-highlight-color:\x20transparent;\x20touch-action:\x20manipulation;\x20text-decoration:\x20none;\x20overflow:\x20hidden;\x20z-index:\x201;\x0a\x20\x20}\x0a\x0a\x20\x20.button:focus-visible\x20{\x20outline:\x202px\x20solid\x20var(--accent-primary);\x20outline-offset:\x202px;\x20}\x0a\x20\x20.button:disabled\x20{\x20opacity:\x200.6;\x20cursor:\x20not-allowed;\x20transform:\x20none;\x20box-shadow:\x20none;\x20transition:\x20opacity\x20var(--transition-speed)\x20ease;\x20}\x0a\x20\x20.copy-buttons\x20{\x0a\x20\x20\x20\x20position:\x20relative;\x20display:\x20flex;\x20gap:\x204px;\x20overflow:\x20hidden;\x20align-self:\x20center;\x0a\x20\x20\x20\x20font-family:\x20var(--serif);\x20font-size:\x2013px;\x20padding:\x206px\x2012px;\x20border-radius:\x206px;\x0a\x20\x20\x20\x20color:\x20var(--accent-secondary);\x20border:\x201px\x20solid\x20var(--border-color);\x0a\x20\x20\x20\x20transition:\x20background-color\x20var(--transition-speed)\x20ease,\x20border-color\x20var(--transition-speed)\x20ease,\x20color\x20var(--transition-speed)\x20ease,\x20transform\x20var(--transition-speed)\x20ease,\x20box-shadow\x20var(--transition-speed)\x20ease;\x0a\x20\x20}\x0a\x0a\x20\x20.copy-buttons::before,\x20.client-btn::before\x20{\x0a\x20\x20\x20\x20content:\x20\x27\x27;\x20position:\x20absolute;\x20top:\x200;\x20left:\x200;\x20width:\x20100%;\x20height:\x20100%;\x0a\x20\x20\x20\x20background:\x20linear-gradient(120deg,\x20transparent,\x20rgba(255,\x20255,\x20255,\x200.2),\x20transparent);\x0a\x20\x20\x20\x20transform:\x20translateX(-100%);\x20transition:\x20transform\x20var(--transition-speed-long)\x20ease;\x20z-index:\x20-1;\x0a\x20\x20}\x0a\x0a\x20\x20.copy-buttons:hover::before,\x20.client-btn:hover::before\x20{\x20transform:\x20translateX(100%);\x20}\x0a\x20\x20.copy-buttons:hover\x20{\x0a\x20\x20\x20\x20background-color:\x20#4d453e;\x20letter-spacing:\x200.5px;\x20font-weight:\x20600;\x0a\x20\x20\x20\x20border-color:\x20var(--border-color-hover);\x20transform:\x20translateY(-2px);\x20box-shadow:\x200\x204px\x208px\x20var(--shadow-color);\x0a\x20\x20}\x0a\x0a\x20\x20.copy-buttons:active\x20{\x20transform:\x20translateY(0px)\x20scale(0.98);\x20box-shadow:\x20none;\x20}\x0a\x20\x20.copy-icon\x20{\x20width:\x2012px;\x20height:\x2012px;\x20stroke:\x20currentColor;\x20}\x0a\x20\x20.client-buttons\x20{\x20display:\x20grid;\x20grid-template-columns:\x20repeat(auto-fill,\x20minmax(300px,\x201fr));\x20gap:\x2012px;\x20margin-top:\x2016px;\x20}\x0a\x20\x20.client-btn\x20{\x0a\x20\x20\x20\x20width:\x20100%;\x20background-color:\x20var(--accent-primary);\x20color:\x20var(--background-tertiary);\x0a\x20\x20\x20\x20border-radius:\x206px;\x20border-color:\x20var(--accent-primary-darker);\x20position:\x20relative;\x20overflow:\x20hidden;\x0a\x20\x20\x20\x20transition:\x20all\x200.3s\x20cubic-bezier(0.2,\x200.8,\x200.2,\x201);\x20box-shadow:\x200\x202px\x205px\x20rgba(0,\x200,\x200,\x200.15);\x0a\x20\x20}\x0a\x0a\x20\x20.client-btn::after\x20{\x0a\x20\x20\x20\x20content:\x20\x27\x27;\x20position:\x20absolute;\x20bottom:\x20-5px;\x20left:\x200;\x20width:\x20100%;\x20height:\x205px;\x0a\x20\x20\x20\x20background:\x20linear-gradient(90deg,\x20var(--accent-tertiary),\x20var(--accent-secondary));\x0a\x20\x20\x20\x20opacity:\x200;\x20transition:\x20all\x200.3s\x20ease;\x20z-index:\x200;\x0a\x20\x20}\x0a\x0a\x20\x20.client-btn:hover\x20{\x0a\x20\x20\x20\x20text-transform:\x20uppercase;\x20letter-spacing:\x200.3px;\x20transform:\x20translateY(-3px);\x0a\x20\x20\x20\x20background-color:\x20var(--accent-secondary);\x20color:\x20var(--button-text-primary);\x0a\x20\x20\x20\x20box-shadow:\x200\x205px\x2015px\x20rgba(190,\x20155,\x20123,\x200.5);\x20border-color:\x20var(--accent-secondary);\x0a\x20\x20}\x0a\x0a\x20\x20.client-btn:hover::after\x20{\x20opacity:\x201;\x20bottom:\x200;\x20}\x0a\x20\x20.client-btn:active\x20{\x20transform:\x20translateY(0)\x20scale(0.98);\x20box-shadow:\x200\x202px\x203px\x20rgba(0,\x200,\x200,\x200.2);\x20background-color:\x20var(--accent-primary-darker);\x20}\x0a\x20\x20.client-btn\x20.client-icon\x20{\x20position:\x20relative;\x20z-index:\x202;\x20transition:\x20transform\x200.3s\x20ease;\x20}\x0a\x20\x20.client-btn:hover\x20.client-icon\x20{\x20transform:\x20rotate(15deg)\x20scale(1.1);\x20}\x0a\x20\x20.client-btn\x20.button-text\x20{\x20position:\x20relative;\x20z-index:\x202;\x20transition:\x20letter-spacing\x200.3s\x20ease;\x20}\x0a\x20\x20.client-btn:hover\x20.button-text\x20{\x20letter-spacing:\x200.5px;\x20}\x0a\x20\x20.client-icon\x20{\x20width:\x2018px;\x20height:\x2018px;\x20border-radius:\x206px;\x20background-color:\x20var(--background-secondary);\x20display:\x20flex;\x20align-items:\x20center;\x20justify-content:\x20center;\x20flex-shrink:\x200;\x20}\x0a\x20\x20.client-icon\x20svg\x20{\x20width:\x2014px;\x20height:\x2014px;\x20fill:\x20var(--accent-secondary);\x20}\x0a\x20\x20.button.copied\x20{\x20background-color:\x20var(--accent-secondary)\x20!important;\x20color:\x20var(--background-tertiary)\x20!important;\x20}\x0a\x20\x20.button.error\x20{\x20background-color:\x20#c74a3b\x20!important;\x20color:\x20var(--text-accent)\x20!important;\x20}\x0a\x0a\x20\x20.footer\x20{\x20text-align:\x20center;\x20margin-top:\x2020px;\x20padding-bottom:\x2040px;\x20color:\x20var(--text-secondary);\x20font-size:\x2012px;\x20}\x0a\x20\x20.footer\x20p\x20{\x20margin-bottom:\x200px;\x20}\x0a\x0a\x20\x20::-webkit-scrollbar\x20{\x20width:\x208px;\x20height:\x208px;\x20}\x0a\x20\x20::-webkit-scrollbar-track\x20{\x20background:\x20var(--background-primary);\x20border-radius:\x204px;\x20}\x0a\x20\x20::-webkit-scrollbar-thumb\x20{\x20background:\x20var(--border-color);\x20border-radius:\x204px;\x20border:\x202px\x20solid\x20var(--background-primary);\x20}\x0a\x20\x20::-webkit-scrollbar-thumb:hover\x20{\x20background:\x20var(--border-color-hover);\x20}\x0a\x20\x20*\x20{\x20scrollbar-width:\x20thin;\x20scrollbar-color:\x20var(--border-color)\x20var(--background-primary);\x20}\x0a\x0a\x20\x20.ip-info-grid\x20{\x20display:\x20grid;\x20grid-template-columns:\x20repeat(auto-fit,\x20minmax(230px,\x201fr));\x20gap:\x2024px;\x20}\x0a\x20\x20.ip-info-section\x20{\x20background-color:\x20var(--background-tertiary);\x20border-radius:\x20var(--border-radius);\x20padding:\x2016px;\x20border:\x201px\x20solid\x20var(--border-color);\x20display:\x20flex;\x20flex-direction:\x20column;\x20gap:\x2020px;\x20}\x0a\x20\x20.ip-info-header\x20{\x20display:\x20flex;\x20align-items:\x20center;\x20gap:\x2010px;\x20border-bottom:\x201px\x20solid\x20var(--border-color);\x20padding-bottom:\x2010px;\x20}\x0a\x20\x20.ip-info-header\x20svg\x20{\x20width:\x2020px;\x20height:\x2020px;\x20stroke:\x20var(--accent-secondary);\x20}\x0a\x20\x20.ip-info-header\x20h3\x20{\x20font-family:\x20var(--serif);\x20font-size:\x2018px;\x20font-weight:\x20400;\x20color:\x20var(--accent-secondary);\x20margin:\x200;\x20}\x0a\x20\x20.ip-info-content\x20{\x20display:\x20flex;\x20flex-direction:\x20column;\x20gap:\x2010px;\x20}\x0a\x20\x20.ip-info-item\x20{\x20display:\x20flex;\x20flex-direction:\x20column;\x20gap:\x202px;\x20}\x0a\x20\x20.ip-info-item\x20.label\x20{\x20font-size:\x2011px;\x20color:\x20var(--text-secondary);\x20text-transform:\x20uppercase;\x20letter-spacing:\x200.5px;\x20}\x0a\x20\x20.ip-info-item\x20.value\x20{\x20font-size:\x2014px;\x20color:\x20var(--text-primary);\x20word-break:\x20break-all;\x20line-height:\x201.4;\x20}\x0a\x0a\x20\x20.badge\x20{\x20display:\x20inline-flex;\x20align-items:\x20center;\x20justify-content:\x20center;\x20padding:\x203px\x208px;\x20border-radius:\x2012px;\x20font-size:\x2011px;\x20font-weight:\x20500;\x20text-transform:\x20uppercase;\x20letter-spacing:\x200.5px;\x20}\x0a\x20\x20.badge-yes\x20{\x20background-color:\x20rgba(112,\x20181,\x20112,\x200.15);\x20color:\x20var(--status-success);\x20border:\x201px\x20solid\x20rgba(112,\x20181,\x20112,\x200.3);\x20}\x0a\x20\x20.badge-no\x20{\x20background-color:\x20rgba(224,\x2093,\x2068,\x200.15);\x20color:\x20var(--status-error);\x20border:\x201px\x20solid\x20rgba(224,\x2093,\x2068,\x200.3);\x20}\x0a\x20\x20.badge-neutral\x20{\x20background-color:\x20rgba(79,\x20144,\x20196,\x200.15);\x20color:\x20var(--status-info);\x20border:\x201px\x20solid\x20rgba(79,\x20144,\x20196,\x200.3);\x20}\x0a\x20\x20.badge-warning\x20{\x20background-color:\x20rgba(224,\x20188,\x2068,\x200.15);\x20color:\x20var(--status-warning);\x20border:\x201px\x20solid\x20rgba(224,\x20188,\x2068,\x200.3);\x20}\x0a\x20\x20.skeleton\x20{\x20display:\x20block;\x20background:\x20linear-gradient(90deg,\x20var(--background-tertiary)\x2025%,\x20var(--background-secondary)\x2050%,\x20var(--background-tertiary)\x2075%);\x20background-size:\x20200%\x20100%;\x20animation:\x20loading\x201.5s\x20infinite;\x20border-radius:\x204px;\x20height:\x2016px;\x20}\x0a\x20\x20@keyframes\x20loading\x20{\x200%\x20{\x20background-position:\x20200%\x200;\x20}\x20100%\x20{\x20background-position:\x20-200%\x200;\x20}\x20}\x0a\x20\x20.country-flag\x20{\x20display:\x20inline-block;\x20width:\x2018px;\x20height:\x20auto;\x20max-height:\x2014px;\x20margin-right:\x206px;\x20vertical-align:\x20middle;\x20border-radius:\x202px;\x20}\x0a\x0a\x20\x20.modal-overlay\x20{\x20position:\x20fixed;\x20top:\x200;\x20left:\x200;\x20width:\x20100%;\x20height:\x20100%;\x20background-color:\x20rgba(0,\x200,\x200,\x200.7);\x20display:\x20flex;\x20align-items:\x20center;\x20justify-content:\x20center;\x20z-index:\x201000;\x20opacity:\x200;\x20visibility:\x20hidden;\x20transition:\x20opacity\x200.3s\x20ease,\x20visibility\x200.3s\x20ease;\x20}\x0a\x20\x20.modal-overlay.visible\x20{\x20opacity:\x201;\x20visibility:\x20visible;\x20}\x0a\x20\x20.modal-overlay.visible\x20{\x20opacity:\x201;\x20visibility:\x20visible;\x20}\x0a\x20\x20.modal-content\x20{\x20background:\x20var(--background-secondary);\x20padding:\x2024px;\x20border-radius:\x20var(--border-radius);\x20border:\x201px\x20solid\x20var(--border-color);\x20width:\x2090%;\x20max-width:\x20450px;\x20text-align:\x20center;\x20box-shadow:\x200\x208px\x2030px\x20var(--shadow-color-accent);\x20transform:\x20scale(0.95);\x20transition:\x20transform\x200.3s\x20ease;\x20}\x0a\x20\x20.modal-overlay.visible\x20.modal-content\x20{\x20transform:\x20scale(1);\x20}\x0a\x20\x20.modal-title\x20{\x20font-family:\x20var(--serif);\x20font-size:\x201.5rem;\x20color:\x20var(--accent-secondary);\x20margin-bottom:\x2016px;\x20}\x0a\x20\x20.modal-text\x20{\x20color:\x20var(--text-primary);\x20font-size:\x2014px;\x20line-height:\x201.6;\x20margin-bottom:\x2020px;\x20}\x0a\x20\x20.modal-instruction\x20{\x20background:\x20var(--background-tertiary);\x20padding:\x2012px;\x20border-radius:\x206px;\x20margin-bottom:\x2024px;\x20font-size:\x2013px;\x20line-height:\x201.8;\x20border:\x201px\x20solid\x20var(--border-color);\x20}\x0a\x20\x20.modal-instruction\x20code\x20{\x20background:\x20var(--background-primary);\x20color:\x20var(--accent-primary);\x20padding:\x203px\x206px;\x20border-radius:\x204px;\x20font-family:\x20var(--mono-serif);\x20}\x0a\x20\x20#hiddify-modal-continue\x20{\x20width:\x20100%;}\x0a\x0a\x20\x20@media\x20(max-width:\x20768px)\x20{\x0a\x20\x20\x20\x20body\x20{\x20padding:\x2020px;\x20}\x20.container\x20{\x20padding:\x200\x2014px;\x20width:\x20min(100%,\x20768px);\x20}\x0a\x20\x20\x20\x20.ip-info-grid\x20{\x20grid-template-columns:\x20repeat(auto-fit,\x20minmax(170px,\x201fr));\x20gap:\x2018px;\x20}\x0a\x20\x20\x20\x20.header\x20h1\x20{\x20font-size:\x201.8rem;\x20}\x20.header\x20p\x20{\x20font-size:\x200.7rem\x20}\x0a\x20\x20\x20\x20.ip-info-section\x20{\x20padding:\x2014px;\x20gap:\x2018px;\x20}\x20.ip-info-header\x20h3\x20{\x20font-size:\x2016px;\x20}\x0a\x20\x20\x20\x20.ip-info-header\x20{\x20gap:\x208px;\x20}\x20.ip-info-content\x20{\x20gap:\x208px;\x20}\x0a\x20\x20\x20\x20.ip-info-item\x20.label\x20{\x20font-size:\x2011px;\x20}\x20.ip-info-item\x20.value\x20{\x20font-size:\x2013px;\x20}\x0a\x20\x20\x20\x20.config-card\x20{\x20padding:\x2016px;\x20}\x20.config-title\x20{\x20font-size:\x2018px;\x20}\x0a\x20\x20\x20\x20.config-title\x20.refresh-btn\x20{\x20font-size:\x2011px;\x20}\x20.config-content\x20pre\x20{\x20font-size:\x2012px;\x20}\x0a\x20\x20\x20\x20.client-buttons\x20{\x20grid-template-columns:\x20repeat(auto-fill,\x20minmax(260px,\x201fr));\x20}\x0a\x20\x20\x20\x20.button\x20{\x20font-size:\x2012px;\x20}\x20.copy-buttons\x20{\x20font-size:\x2011px;\x20}\x0a\x20\x20}\x0a\x0a\x20\x20@media\x20(max-width:\x20480px)\x20{\x0a\x20\x20\x20\x20body\x20{\x20padding:\x2016px;\x20}\x20.container\x20{\x20padding:\x200\x2012px;\x20width:\x20min(100%,\x20390px);\x20}\x0a\x20\x20\x20\x20.header\x20h1\x20{\x20font-size:\x2020px;\x20}\x20.header\x20p\x20{\x20font-size:\x208px;\x20}\x0a\x20\x20\x20\x20.ip-info-section\x20{\x20padding:\x2014px;\x20gap:\x2016px;\x20}\x0a\x20\x20\x20\x20.ip-info-grid\x20{\x20grid-template-columns:\x20repeat(auto-fit,\x20minmax(200px,\x201fr));\x20gap:\x2016px;\x20}\x0a\x20\x20\x20\x20.ip-info-header\x20h3\x20{\x20font-size:\x2014px;\x20}\x20.ip-info-header\x20{\x20gap:\x206px;\x20}\x0a\x20\x20\x20\x20.ip-info-content\x20{\x20gap:\x206px;\x20}\x20.ip-info-header\x20svg\x20{\x20width:\x2018px;\x20height:\x2018px;\x20}\x0a\x20\x20\x20\x20.ip-info-item\x20.label\x20{\x20font-size:\x209px;\x20}\x20.ip-info-item\x20.value\x20{\x20font-size:\x2011px;\x20}\x0a\x20\x20\x20\x20.badge\x20{\x20padding:\x202px\x206px;\x20font-size:\x2010px;\x20border-radius:\x2010px;\x20}\x0a\x20\x20\x20\x20.config-card\x20{\x20padding:\x2010px;\x20}\x20.config-title\x20{\x20font-size:\x2016px;\x20}\x0a\x20\x20\x20\x20.config-title\x20.refresh-btn\x20{\x20font-size:\x2010px;\x20}\x20.config-content\x20{\x20padding:\x2012px;\x20}\x0a\x20\x20\x20\x20.config-content\x20pre\x20{\x20font-size:\x2010px;\x20}\x0a\x20\x20\x20\x20.client-buttons\x20{\x20grid-template-columns:\x20repeat(auto-fill,\x20minmax(200px,\x201fr));\x20}\x0a\x20\x20\x20\x20.button\x20{\x20padding:\x204px\x208px;\x20font-size:\x2011px;\x20}\x20.copy-buttons\x20{\x20font-size:\x2010px;\x20}\x0a\x20\x20\x20\x20.footer\x20{\x20font-size:\x2010px;\x20}\x0a\x20\x20}\x0a\x0a\x20\x20@media\x20(max-width:\x20359px)\x20{\x0a\x20\x20\x20\x20body\x20{\x20padding:\x2012px;\x20font-size:\x2014px;\x20}\x20.container\x20{\x20max-width:\x20100%;\x20padding:\x208px;\x20}\x0a\x20\x20\x20\x20.header\x20h1\x20{\x20font-size:\x2016px;\x20}\x20.header\x20p\x20{\x20font-size:\x206px;\x20}\x0a\x20\x20\x20\x20.ip-info-section\x20{\x20padding:\x2012px;\x20gap:\x2012px;\x20}\x0a\x20\x20\x20\x20.ip-info-grid\x20{\x20display:\x20grid;\x20grid-template-columns:\x20repeat(auto-fit,\x20minmax(150px,\x201fr));\x20gap:\x2010px;\x20}\x0a\x20\x20\x20\x20.ip-info-header\x20h3\x20{\x20font-size:\x2013px;\x20}\x20.ip-info-header\x20{\x20gap:\x204px;\x20}\x20.ip-info-content\x20{\x20gap:\x204px;\x20}\x0a\x20\x20\x20\x20.ip-info-header\x20svg\x20{\x20width:\x2016px;\x20height:\x2016px;\x20}\x20.ip-info-item\x20.label\x20{\x20font-size:\x208px;\x20}\x0a\x20\x20\x20\x20.ip-info-item\x20.value\x20{\x20font-size:\x2010px;\x20}\x20.badge\x20{\x20padding:\x201px\x204px;\x20font-size:\x209px;\x20border-radius:\x208px;\x20}\x0a\x20\x20\x20\x20.config-card\x20{\x20padding:\x208px;\x20}\x20.config-title\x20{\x20font-size:\x2013px;\x20}\x20.config-title\x20.refresh-btn\x20{\x20font-size:\x209px;\x20}\x0a\x20\x20\x20\x20.config-content\x20{\x20padding:\x208px;\x20}\x20.config-content\x20pre\x20{\x20font-size:\x208px;\x20}\x0a\x20\x20\x20\x20.client-buttons\x20{\x20grid-template-columns:\x20repeat(auto-fill,\x20minmax(150px,\x201fr));\x20}\x0a\x20\x20\x20\x20.button\x20{\x20padding:\x203px\x206px;\x20font-size:\x2010px;\x20}\x20.copy-buttons\x20{\x20font-size:\x209px;\x20}\x20.footer\x20{\x20font-size:\x208px;\x20}\x0a\x20\x20}\x0a\x20\x20\x20\x20@media\x20(min-width:\x20360px)\x20{\x20.container\x20{\x20max-width:\x2095%;\x20}\x20}\x0a\x20\x20\x20\x20@media\x20(min-width:\x20480px)\x20{\x20.container\x20{\x20max-width:\x2090%;\x20}\x20}\x0a\x20\x20\x20\x20@media\x20(min-width:\x20640px)\x20{\x20.container\x20{\x20max-width:\x20600px;\x20}\x20}\x0a\x20\x20\x20\x20@media\x20(min-width:\x20768px)\x20{\x20.container\x20{\x20max-width:\x20720px;\x20}\x20}\x0a\x20\x20\x20\x20@media\x20(min-width:\x201024px)\x20{\x20.container\x20{\x20max-width:\x20800px;\x20}\x20}\x0a\x20\x20';}function getPageHTML(a,b){return'\x0a\x20\x20\x20\x20<div\x20class=\x22container\x22>\x0a\x20\x20\x20\x20<div\x20class=\x22header\x22>\x0a\x20\x20\x20\x20\x20\x20<h1>VLESS\x20Proxy\x20Configuration</h1>\x0a\x20\x20\x20\x20\x20\x20<p>Copy\x20the\x20configuration\x20or\x20import\x20directly\x20into\x20your\x20client</p>\x0a\x20\x20\x20\x20</div>\x0a\x0a\x20\x20\x20\x20<div\x20class=\x22config-card\x22>\x0a\x20\x20\x20\x20\x20\x20<div\x20class=\x22config-title\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<span>Network\x20Information</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<button\x20id=\x22refresh-ip-info\x22\x20class=\x22refresh-btn\x22\x20aria-label=\x22Refresh\x20IP\x20information\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<svg\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20class=\x22refresh-icon\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20xmlns=\x22http://www.w3.org/2000/svg\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20viewBox=\x220\x200\x2024\x2024\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20fill=\x22none\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20stroke=\x22currentColor\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20stroke-width=\x222\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20stroke-linecap=\x22round\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20stroke-linejoin=\x22round\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<path\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20d=\x22M21.5\x202v6h-6M2.5\x2022v-6h6M2\x2011.5a10\x2010\x200\x200\x201\x2018.8-4.3M22\x2012.5a10\x2010\x200\x200\x201-18.8\x204.2\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20/>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</svg>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20Refresh\x0a\x20\x20\x20\x20\x20\x20\x20\x20</button>\x0a\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20<div\x20class=\x22ip-info-grid\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22ip-info-section\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22ip-info-header\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<svg\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20xmlns=\x22http://www.w3.org/2000/svg\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20viewBox=\x220\x200\x2024\x2024\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20fill=\x22none\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20stroke=\x22currentColor\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20stroke-width=\x222\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20stroke-linecap=\x22round\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20stroke-linejoin=\x22round\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<path\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20d=\x22M15.5\x202H8.6c-.4\x200-.8.2-1.1.5-.3.3-.5.7-.5\x201.1v16.8c0\x20.4.2.8.5\x201.1.3.3.7.5\x201.1.5h6.9c.4\x200\x20.8-.2\x201.1-.5.3-.3.5-.7.5-1.1V3.6c0-.4-.2-.8-.5-1.1-.3-.3-.7-.5-1.1-.5z\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20/>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<circle\x20cx=\x2212\x22\x20cy=\x2218\x22\x20r=\x221\x22\x20/>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</svg>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<h3>Proxy\x20Server</h3>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22ip-info-content\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22ip-info-item\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22label\x22>Proxy\x20Host</span\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20><span\x20class=\x22value\x22\x20id=\x22proxy-host\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20><span\x20class=\x22skeleton\x22\x20style=\x22width:\x20150px\x22></span\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20></span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22ip-info-item\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22label\x22>IP\x20Address</span\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20><span\x20class=\x22value\x22\x20id=\x22proxy-ip\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20><span\x20class=\x22skeleton\x22\x20style=\x22width:\x20120px\x22></span\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20></span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22ip-info-item\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22label\x22>Location</span\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20><span\x20class=\x22value\x22\x20id=\x22proxy-location\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20><span\x20class=\x22skeleton\x22\x20style=\x22width:\x20100px\x22></span\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20></span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22ip-info-item\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22label\x22>ISP\x20Provider</span\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20><span\x20class=\x22value\x22\x20id=\x22proxy-isp\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20><span\x20class=\x22skeleton\x22\x20style=\x22width:\x20140px\x22></span\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20></span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22ip-info-section\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22ip-info-header\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<svg\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20xmlns=\x22http://www.w3.org/2000/svg\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20viewBox=\x220\x200\x2024\x2024\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20fill=\x22none\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20stroke=\x22currentColor\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20stroke-width=\x222\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20stroke-linecap=\x22round\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20stroke-linejoin=\x22round\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<path\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20d=\x22M20\x2016V7a2\x202\x200\x200\x200-2-2H6a2\x202\x200\x200\x200-2\x202v9m16\x200H4m16\x200\x201.28\x202.55a1\x201\x200\x200\x201-.9\x201.45H3.62a1\x201\x200\x200\x201-.9-1.45L4\x2016\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20/>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</svg>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<h3>Your\x20Connection</h3>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22ip-info-content\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22ip-info-item\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22label\x22>Your\x20IP</span\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20><span\x20class=\x22value\x22\x20id=\x22client-ip\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20><span\x20class=\x22skeleton\x22\x20style=\x22width:\x20110px\x22></span\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20></span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22ip-info-item\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22label\x22>Location</span\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20><span\x20class=\x22value\x22\x20id=\x22client-location\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20><span\x20class=\x22skeleton\x22\x20style=\x22width:\x2090px\x22></span\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20></span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22ip-info-item\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22label\x22>ISP\x20Provider</span\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20><span\x20class=\x22value\x22\x20id=\x22client-isp\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20><span\x20class=\x22skeleton\x22\x20style=\x22width:\x20130px\x22></span\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20></span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22ip-info-item\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22label\x22>Risk\x20Score</span\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20><span\x20class=\x22value\x22\x20id=\x22client-proxy\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20><span\x20class=\x22skeleton\x22\x20style=\x22width:\x20100px\x22></span\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20></span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20</div>\x0a\x0a\x20\x20\x20\x20<div\x20class=\x22config-card\x22>\x0a\x20\x20\x20\x20\x20\x20<div\x20class=\x22config-title\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<span>Xray\x20Core\x20Clients</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<button\x20class=\x22button\x20copy-buttons\x22\x20onclick=\x22copyToClipboard(this,\x20\x27'+a['dream']+'\x27)\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<svg\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20class=\x22copy-icon\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20xmlns=\x22http://www.w3.org/2000/svg\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20width=\x2212\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20height=\x2212\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20viewBox=\x220\x200\x2024\x2024\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20fill=\x22none\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20stroke=\x22currentColor\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20stroke-width=\x222\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20stroke-linecap=\x22round\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20stroke-linejoin=\x22round\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<rect\x20x=\x229\x22\x20y=\x229\x22\x20width=\x2213\x22\x20height=\x2213\x22\x20rx=\x222\x22\x20ry=\x222\x22></rect>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<path\x20d=\x22M5\x2015H4a2\x202\x200\x200\x201-2-2V4a2\x202\x200\x200\x201\x202-2h9a2\x202\x200\x200\x201\x202\x202v1\x22></path>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</svg>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20Copy\x0a\x20\x20\x20\x20\x20\x20\x20\x20</button>\x0a\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20<div\x20class=\x22config-content\x22><pre\x20id=\x22xray-config\x22>'+a['dream']+'</pre></div>\x0a\x20\x20\x20\x20\x20\x20<div\x20class=\x22client-buttons\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<a\x20href=\x22'+b['hiddify']+'\x22\x20id=\x22hiddify-import-btn\x22\x20class=\x22button\x20client-btn\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22client-icon\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20><svg\x20viewBox=\x220\x200\x2024\x2024\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<path\x20d=\x22M12\x202L2\x207l10\x205\x2010-5-10-5zM2\x2017l10\x205\x2010-5M2\x2012l10\x205\x2010-5\x22\x20/></svg\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20></span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22button-text\x22>Import\x20to\x20Hiddify</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</a>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<a\x20href=\x22'+b['v2rayng']+'\x22\x20class=\x22button\x20client-btn\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22client-icon\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20><svg\x20viewBox=\x220\x200\x2024\x2024\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<path\x20d=\x22M12\x202L4\x205v6c0\x205.5\x203.5\x2010.7\x208\x2012.3\x204.5-1.6\x208-6.8\x208-12.3V5l-8-3z\x22\x20/></svg\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20></span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22button-text\x22>Import\x20to\x20V2rayNG</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</a>\x0a\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20</div>\x0a\x0a\x20\x20\x20\x20<div\x20class=\x22config-card\x22>\x0a\x20\x20\x20\x20\x20\x20<div\x20class=\x22config-title\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<span>Sing-Box\x20Core\x20Clients</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<button\x20class=\x22button\x20copy-buttons\x22\x20onclick=\x22copyToClipboard(this,\x20\x27'+a['freedom']+'\x27)\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<svg\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20class=\x22copy-icon\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20xmlns=\x22http://www.w3.org/2000/svg\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20width=\x2212\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20height=\x2212\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20viewBox=\x220\x200\x2024\x2024\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20fill=\x22none\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20stroke=\x22currentColor\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20stroke-width=\x222\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20stroke-linecap=\x22round\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20stroke-linejoin=\x22round\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<rect\x20x=\x229\x22\x20y=\x229\x22\x20width=\x2213\x22\x20height=\x2213\x22\x20rx=\x222\x22\x20ry=\x222\x22></rect>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<path\x20d=\x22M5\x2015H4a2\x202\x200\x200\x201-2-2V4a2\x202\x200\x200\x201\x202-2h9a2\x202\x200\x200\x201\x202\x202v1\x22></path>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</svg>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20Copy\x0a\x20\x20\x20\x20\x20\x20\x20\x20</button>\x0a\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20<div\x20class=\x22config-content\x22><pre\x20id=\x22singbox-config\x22>'+a['freedom']+'</pre></div>\x0a\x20\x20\x20\x20\x20\x20<div\x20class=\x22client-buttons\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<a\x20href=\x22'+b['clashMeta']+'\x22\x20class=\x22button\x20client-btn\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22client-icon\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20><svg\x20viewBox=\x220\x200\x2024\x2024\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<path\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20d=\x22M12\x202C6.48\x202\x202\x206.48\x202\x2012s4.48\x2010\x2010\x2010\x2010-4.48\x2010-10S17.52\x202\x2012\x202zm-1\x2017.93c-3.95-.49-7-3.85-7-7.93\x200-.62.08-1.21.21-1.79L9\x2015v1c0\x201.1.9\x202\x202\x202v1.93zm6.9-2.54c-.26-.81-1-1.39-1.9-1.39h-1v-3c0-.55-.45-1-1-1H8v-2h2c.55\x200\x201-.45\x201-1V7h2c1.1\x200\x202-.9\x202-2v-.41c2.93\x201.19\x205\x204.06\x205\x207.41\x200\x202.08-.8\x203.97-2.1\x205.39z\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20/></svg\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20></span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22button-text\x22>Import\x20to\x20Clash\x20Meta</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</a>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<a\x20href=\x22'+b['exclave']+'\x22\x20class=\x22button\x20client-btn\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22client-icon\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20><svg\x20viewBox=\x220\x200\x2024\x2024\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<path\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20d=\x22M20,8h-3V6c0-1.1-0.9-2-2-2H9C7.9,4,7,4.9,7,6v2H4C2.9,8,2,8.9,2,10v9c0,1.1,0.9,2,2,2h16c1.1,0,2-0.9,2-2v-9\x20C22,8.9,21.1,8,20,8z\x20M9,6h6v2H9V6z\x20M20,19H4v-2h16V19z\x20M20,15H4v-5h3v1c0,0.55,0.45,1,1,1h1.5c0.28,0,0.5-0.22,0.5-0.5v-0.5h4v0.5\x20c0,0.28,0.22,0.5,0.5,0.5H16c0.55,0,1-0.45,1-1v-1h3V15z\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20/>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<circle\x20cx=\x228.5\x22\x20cy=\x2213.5\x22\x20r=\x221\x22\x20/>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<circle\x20cx=\x2215.5\x22\x20cy=\x2213.5\x22\x20r=\x221\x22\x20/>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<path\x20d=\x22M12,15.5c-0.55,0-1-0.45-1-1h2C13,15.05,12.55,15.5,12,15.5z\x22\x20/></svg\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20></span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22button-text\x22>Import\x20to\x20Exclave</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</a>\x0a\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20</div>\x0a\x0a\x20\x20\x20\x20<div\x20class=\x22footer\x22>\x0a\x20\x20\x20\x20\x20\x20<p>\x0a\x20\x20\x20\x20\x20\x20\x20\x20©\x20<span\x20id=\x22current-year\x22>'+new Date()['getFullYear']()+'</span>\x20REvil\x20-\x20All\x20Rights\x20Reserved\x0a\x20\x20\x20\x20\x20\x20</p>\x0a\x20\x20\x20\x20\x20\x20<p>Secure.\x20Private.\x20Fast.</p>\x0a\x20\x20\x20\x20</div>\x0a\x20\x20</div>\x0a\x0a\x20\x20<div\x20id=\x22hiddify-dns-modal\x22\x20class=\x22modal-overlay\x22\x20style=\x22display:\x20none\x22>\x0a\x20\x20\x20\x20<div\x20class=\x22modal-content\x22>\x0a\x20\x20\x20\x20\x20\x20<h3\x20class=\x22modal-title\x22>Important\x20Note\x20for\x20Hiddify\x20Users</h3>\x0a\x20\x20\x20\x20\x20\x20<p\x20class=\x22modal-text\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20For\x20the\x20configuration\x20to\x20work\x20correctly,\x20you\x20need\x20to\x20change\x20the\x0a\x20\x20\x20\x20\x20\x20\x20\x20<strong>Remote\x20DNS</strong>\x20setting\x20in\x20the\x20Hiddify\x20app.\x0a\x20\x20\x20\x20\x20\x20</p>\x0a\x20\x20\x20\x20\x20\x20<div\x20class=\x22modal-instruction\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20Change\x20from:\x20<code>udp://1.1.1.1</code><br\x20/>\x0a\x20\x20\x20\x20\x20\x20\x20\x20To:\x20<code>https://8.8.8.8/dns-query</code>\x0a\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20<button\x20id=\x22hiddify-modal-continue\x22\x20class=\x22button\x20client-btn\x22>Continue\x20to\x20Hiddify</button>\x0a\x20\x20\x20\x20</div>\x0a\x20\x20</div>\x0a\x20\x20';}function getPageScript(){return'\x0a\x20\x20\x20\x20\x20\x20function\x20copyToClipboard(button,\x20text)\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20const\x20originalHTML\x20=\x20button.innerHTML;\x0a\x20\x20\x20\x20\x20\x20\x20\x20navigator.clipboard.writeText(text).then(()\x20=>\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20button.innerHTML\x20=\x20`<svg\x20class=\x22copy-icon\x22\x20xmlns=\x22http://www.w3.org/2000/svg\x22\x20width=\x2212\x22\x20height=\x2212\x22\x20viewBox=\x220\x200\x2024\x2024\x22\x20fill=\x22none\x22\x20stroke=\x22currentColor\x22\x20stroke-width=\x222\x22\x20stroke-linecap=\x22round\x22\x20stroke-linejoin=\x22round\x22><rect\x20x=\x229\x22\x20y=\x229\x22\x20width=\x2213\x22\x20height=\x2213\x22\x20rx=\x222\x22\x20ry=\x222\x22></rect><path\x20d=\x22M5\x2015H4a2\x202\x200\x200\x201-2-2V4a2\x202\x200\x200\x201\x202-2h9a2\x202\x200\x200\x201\x202\x202v1\x22></path></svg>\x20Copied!`;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20button.classList.add(\x22copied\x22);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20button.disabled\x20=\x20true;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20setTimeout(()\x20=>\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20button.innerHTML\x20=\x20originalHTML;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20button.classList.remove(\x22copied\x22);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20button.disabled\x20=\x20false;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20},\x201200);\x0a\x20\x20\x20\x20\x20\x20\x20\x20}).catch(err\x20=>\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20console.error(\x22Failed\x20to\x20copy\x20text:\x20\x22,\x20err);\x0a\x20\x20\x20\x20\x20\x20\x20\x20});\x0a\x20\x20\x20\x20\x20\x20}\x0a\x0a\x20\x20\x20\x20\x20\x20async\x20function\x20fetchClientPublicIP()\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20try\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20const\x20response\x20=\x20await\x20fetch(\x27https://api.ipify.org?format=json\x27);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20if\x20(!response.ok)\x20throw\x20new\x20Error(`HTTP\x20error!\x20status:\x20${response.status}`);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20return\x20(await\x20response.json()).ip;\x0a\x20\x20\x20\x20\x20\x20\x20\x20}\x20catch\x20(error)\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20console.error(\x27Error\x20fetching\x20client\x20IP:\x27,\x20error);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20return\x20null;\x0a\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20}\x0a\x0a\x20\x20\x20\x20\x20\x20async\x20function\x20fetchScamalyticsClientInfo(clientIp)\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20if\x20(!clientIp)\x20return\x20null;\x0a\x20\x20\x20\x20\x20\x20\x20\x20try\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20const\x20response\x20=\x20await\x20fetch(`/scamalytics-lookup?ip=${encodeURIComponent(clientIp)}`);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20if\x20(!response.ok)\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20const\x20errorText\x20=\x20await\x20response.text();\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20throw\x20new\x20Error(`Worker\x20request\x20failed!\x20status:\x20${response.status},\x20details:\x20${errorText}`);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20const\x20data\x20=\x20await\x20response.json();\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20if\x20(data.scamalytics\x20&&\x20data.scamalytics.status\x20===\x20\x27error\x27)\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20throw\x20new\x20Error(data.scamalytics.error\x20||\x20\x27Scamalytics\x20API\x20error\x20via\x20Worker\x27);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20return\x20data;\x0a\x20\x20\x20\x20\x20\x20\x20\x20}\x20catch\x20(error)\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20console.error(\x27Error\x20fetching\x20from\x20Scamalytics\x20via\x20Worker:\x27,\x20error);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20return\x20null;\x0a\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20}\x0a\x0a\x20\x20\x20\x20\x20\x20//\x20Extract\x20information\x20from\x20IP\x20databases\x0a\x20\x20\x20\x20\x20\x20function\x20updateScamalyticsClientDisplay(data)\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20const\x20prefix\x20=\x20\x27client\x27;\x0a\x20\x20\x20\x20\x20\x20\x20\x20if\x20(!data\x20||\x20!data.scamalytics\x20||\x20data.scamalytics.status\x20!==\x20\x27ok\x27)\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20showError(prefix,\x20(data\x20&&\x20data.scamalytics\x20&&\x20data.scamalytics.error)\x20||\x20\x27Could\x20not\x20load\x20client\x20data\x20from\x20Scamalytics\x27);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20return;\x0a\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20const\x20sa\x20=\x20data.scamalytics;\x0a\x20\x20\x20\x20\x20\x20\x20\x20const\x20ext\x20=\x20data.external_datasources\x20||\x20{};\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20//\x20Alternative\x20sources\x20for\x20extracting\x20information\x0a\x20\x20\x20\x20\x20\x20\x20\x20const\x20ipinfo\x20=\x20ext.ipinfo\x20||\x20{};\x0a\x20\x20\x20\x20\x20\x20\x20\x20const\x20maxmind\x20=\x20ext.maxmind_geolite2\x20||\x20{};\x0a\x20\x20\x20\x20\x20\x20\x20\x20const\x20dbip\x20=\x20ext.dbip\x20||\x20{};\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20const\x20elements\x20=\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20ip:\x20document.getElementById(`${prefix}-ip`),\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20location:\x20document.getElementById(`${prefix}-location`),\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20isp:\x20document.getElementById(`${prefix}-isp`),\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20proxy:\x20document.getElementById(`${prefix}-proxy`)\x0a\x20\x20\x20\x20\x20\x20\x20\x20};\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20//\x20Helper\x20function\x20for\x20data\x20validation\x0a\x20\x20\x20\x20\x20\x20\x20\x20const\x20isValid\x20=\x20(val)\x20=>\x20val\x20&&\x20val\x20!==\x20\x22PREMIUM\x20FIELD\x20-\x20upgrade\x20to\x20view\x22\x20&&\x20val.trim()\x20!==\x20\x22\x22;\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20//\x20IP\x20display\x20(Your\x20connection)\x0a\x20\x20\x20\x20\x20\x20\x20\x20if\x20(elements.ip)\x20elements.ip.textContent\x20=\x20sa.ip\x20||\x20\x22N/A\x22;\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20//\x20Show\x20ISP\x20-\x20priority\x20is\x20given\x20to\x20ipinfo\x0a\x20\x20\x20\x20\x20\x20\x20\x20let\x20ispName\x20=\x20\x22N/A\x22;\x0a\x20\x20\x20\x20\x20\x20\x20\x20if\x20(isValid(ipinfo.as_name))\x20ispName\x20=\x20ipinfo.as_name;\x0a\x20\x20\x20\x20\x20\x20\x20\x20else\x20if\x20(isValid(maxmind.as_name))\x20ispName\x20=\x20maxmind.as_name;\x0a\x20\x20\x20\x20\x20\x20\x20\x20else\x20if\x20(isValid(sa.scamalytics_isp))\x20ispName\x20=\x20sa.scamalytics_isp;\x0a\x20\x20\x20\x20\x20\x20\x20\x20else\x20if\x20(isValid(dbip.isp_name))\x20ispName\x20=\x20dbip.isp_name;\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20if\x20(elements.isp)\x20elements.isp.textContent\x20=\x20ispName;\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20//\x20Show\x20location\x20(city\x20and\x20country)\x0a\x20\x20\x20\x20\x20\x20\x20\x20if\x20(elements.location)\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20let\x20city\x20=\x20\x22\x22;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20let\x20countryName\x20=\x20\x22\x22;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20let\x20countryCode\x20=\x20\x22\x22;\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20//\x20Trying\x20to\x20find\x20a\x20city\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20if\x20(isValid(maxmind.ip_city))\x20city\x20=\x20maxmind.ip_city;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20else\x20if\x20(isValid(dbip.ip_city))\x20city\x20=\x20dbip.ip_city;\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20//\x20Trying\x20to\x20find\x20a\x20country\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20if\x20(isValid(ipinfo.ip_country_name))\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20countryName\x20=\x20ipinfo.ip_country_name;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20countryCode\x20=\x20ipinfo.ip_country_code;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20}\x20else\x20if\x20(isValid(maxmind.ip_country_name))\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20countryName\x20=\x20maxmind.ip_country_name;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20countryCode\x20=\x20maxmind.ip_country_code;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20}\x20else\x20if\x20(isValid(dbip.ip_country_name))\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20countryName\x20=\x20dbip.ip_country_name;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20countryCode\x20=\x20dbip.ip_country_code;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20countryCode\x20=\x20countryCode\x20?\x20countryCode.toLowerCase()\x20:\x20\x27\x27;\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20let\x20flagElementHtml\x20=\x20countryCode\x20?\x20`<img\x20src=\x22https://flagcdn.com/w20/${countryCode}.png\x22\x20srcset=\x22https://flagcdn.com/w40/${countryCode}.png\x202x\x22\x20alt=\x22${countryCode}\x22\x20class=\x22country-flag\x22>\x20`\x20:\x20\x27\x27;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20let\x20textPart\x20=\x20[city,\x20countryName].filter(Boolean).join(\x27,\x20\x27);\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20elements.location.innerHTML\x20=\x20(flagElementHtml\x20||\x20textPart)\x20?\x20`${flagElementHtml}${textPart}`.trim()\x20:\x20\x22N/A\x22;\x0a\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20//\x20Show\x20risk\x20score\x0a\x20\x20\x20\x20\x20\x20\x20\x20if\x20(elements.proxy)\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20const\x20score\x20=\x20sa.scamalytics_score;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20const\x20risk\x20=\x20sa.scamalytics_risk;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20let\x20riskText\x20=\x20\x22Unknown\x22;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20let\x20badgeClass\x20=\x20\x22badge-neutral\x22;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20if\x20(risk\x20&&\x20score\x20!==\x20undefined)\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20riskText\x20=\x20`${score}\x20-\x20${risk.charAt(0).toUpperCase()\x20+\x20risk.slice(1)}`;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20switch\x20(risk.toLowerCase())\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20case\x20\x22low\x22:\x20badgeClass\x20=\x20\x22badge-yes\x22;\x20break;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20case\x20\x22medium\x22:\x20badgeClass\x20=\x20\x22badge-warning\x22;\x20break;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20case\x20\x22high\x22:\x20case\x20\x22very\x20high\x22:\x20badgeClass\x20=\x20\x22badge-no\x22;\x20break;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20elements.proxy.innerHTML\x20=\x20`<span\x20class=\x22badge\x20${badgeClass}\x22>${riskText}</span>`;\x0a\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20}\x0a\x0a\x20\x20\x20\x20\x20\x20function\x20updateIpApiIoDisplay(geo,\x20prefix,\x20originalHost)\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20const\x20hostElement\x20=\x20document.getElementById(`${prefix}-host`);\x0a\x20\x20\x20\x20\x20\x20\x20\x20if\x20(hostElement)\x20hostElement.textContent\x20=\x20originalHost\x20||\x20\x22N/A\x22;\x0a\x20\x20\x20\x20\x20\x20\x20\x20const\x20elements\x20=\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20ip:\x20document.getElementById(`${prefix}-ip`),\x20location:\x20document.getElementById(`${prefix}-location`),\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20isp:\x20document.getElementById(`${prefix}-isp`)\x0a\x20\x20\x20\x20\x20\x20\x20\x20};\x0a\x20\x20\x20\x20\x20\x20\x20\x20if\x20(!geo\x20||\x20geo.error)\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20const\x20errorMessage\x20=\x20geo\x20?\x20geo.reason\x20:\x20\x27N/A\x27;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20Object.values(elements).forEach(el\x20=>\x20{\x20if(el)\x20el.innerHTML\x20=\x20errorMessage;\x20});\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20if\x20(elements.ip)\x20elements.ip.innerHTML\x20=\x20\x22N/A\x22;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20return;\x0a\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20if\x20(elements.ip)\x20elements.ip.textContent\x20=\x20geo.ip\x20||\x20\x22N/A\x22;\x0a\x20\x20\x20\x20\x20\x20\x20\x20if\x20(elements.location)\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20const\x20city\x20=\x20geo.city\x20||\x20\x27\x27;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20const\x20countryName\x20=\x20geo.country_name\x20||\x20\x27\x27;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20const\x20countryCode\x20=\x20geo.country_code\x20?\x20geo.country_code.toLowerCase()\x20:\x20\x27\x27;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20let\x20flagElementHtml\x20=\x20countryCode\x20?\x20`<img\x20src=\x22https://flagcdn.com/w20/${countryCode}.png\x22\x20srcset=\x22https://flagcdn.com/w40/${countryCode}.png\x202x\x22\x20alt=\x22${geo.country_code}\x22\x20class=\x22country-flag\x22>\x20`\x20:\x20\x27\x27;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20let\x20textPart\x20=\x20[city,\x20countryName].filter(Boolean).join(\x27,\x20\x27);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20elements.location.innerHTML\x20=\x20(flagElementHtml\x20||\x20textPart)\x20?\x20`${flagElementHtml}${textPart}`.trim()\x20:\x20\x22N/A\x22;\x0a\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20if\x20(elements.isp)\x20elements.isp.textContent\x20=\x20geo.isp\x20||\x20geo.organization\x20||\x20geo.org\x20||\x20\x27N/A\x27;\x0a\x20\x20\x20\x20\x20\x20}\x0a\x0a\x0a\x20\x20\x20\x20\x20\x20async\x20function\x20fetchIpApiIoInfo(ip)\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20try\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20const\x20response\x20=\x20await\x20fetch(`https://ipapi.co/${ip}/json/`);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20if\x20(!response.ok)\x20throw\x20new\x20Error(`HTTP\x20error!\x20status:\x20${response.status}`);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20return\x20await\x20response.json();\x0a\x20\x20\x20\x20\x20\x20\x20\x20}\x20catch\x20(error)\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20console.error(\x27IP\x20API\x20Error\x20(ipapi.co):\x27,\x20error);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20return\x20null;\x0a\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20}\x0a\x0a\x20\x20\x20\x20\x20\x20function\x20showError(prefix,\x20message\x20=\x20\x22Could\x20not\x20load\x20data\x22,\x20originalHostForProxy\x20=\x20null)\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20const\x20errorMessage\x20=\x20\x22N/A\x22;\x0a\x20\x20\x20\x20\x20\x20\x20\x20const\x20elements\x20=\x20(prefix\x20===\x20\x27proxy\x27)\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20?\x20[\x27host\x27,\x20\x27ip\x27,\x20\x27location\x27,\x20\x27isp\x27]\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:\x20[\x27ip\x27,\x20\x27location\x27,\x20\x27isp\x27,\x20\x27proxy\x27];\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20elements.forEach(key\x20=>\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20const\x20el\x20=\x20document.getElementById(`${prefix}-${key}`);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20if\x20(!el)\x20return;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20if\x20(key\x20===\x20\x27host\x27\x20&&\x20prefix\x20===\x20\x27proxy\x27)\x20el.textContent\x20=\x20originalHostForProxy\x20||\x20errorMessage;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20else\x20if\x20(key\x20===\x20\x27proxy\x27\x20&&\x20prefix\x20===\x20\x27client\x27)\x20el.innerHTML\x20=\x20`<span\x20class=\x22badge\x20badge-neutral\x22>N/A</span>`;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20else\x20el.innerHTML\x20=\x20errorMessage;\x0a\x20\x20\x20\x20\x20\x20\x20\x20});\x0a\x20\x20\x20\x20\x20\x20\x20\x20console.warn(`${prefix}\x20data\x20loading\x20failed:\x20${message}`);\x0a\x20\x20\x20\x20\x20\x20}\x0a\x0a\x20\x20\x20\x20\x20\x20async\x20function\x20loadNetworkInfo()\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20try\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20const\x20proxyIpWithPort\x20=\x20document.body.getAttribute(\x27data-proxy-ip\x27)\x20||\x20\x22N/A\x22;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20const\x20proxyDomainOrIp\x20=\x20proxyIpWithPort.split(\x27:\x27)[0];\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20const\x20proxyHostEl\x20=\x20document.getElementById(\x27proxy-host\x27);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20if(proxyHostEl)\x20proxyHostEl.textContent\x20=\x20proxyIpWithPort;\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20if\x20(proxyDomainOrIp\x20&&\x20proxyDomainOrIp\x20!==\x20\x22N/A\x22)\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20let\x20resolvedProxyIp\x20=\x20proxyDomainOrIp;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20if\x20(!/^\x5cd{1,3}\x5c.\x5cd{1,3}\x5c.\x5cd{1,3}\x5c.\x5cd{1,3}$/.test(proxyDomainOrIp))\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20try\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20const\x20dnsRes\x20=\x20await\x20fetch(`https://dns.google/resolve?name=${encodeURIComponent(proxyDomainOrIp)}&type=A`);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20if\x20(dnsRes.ok)\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20const\x20dnsData\x20=\x20await\x20dnsRes.json();\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20const\x20ipAnswer\x20=\x20dnsData.Answer?.find(a\x20=>\x20a.type\x20===\x201);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20if\x20(ipAnswer)\x20resolvedProxyIp\x20=\x20ipAnswer.data;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20}\x20catch\x20(e)\x20{\x20console.error(\x27DNS\x20resolution\x20for\x20proxy\x20failed:\x27,\x20e);\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20const\x20proxyGeoData\x20=\x20await\x20fetchIpApiIoInfo(resolvedProxyIp);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20updateIpApiIoDisplay(proxyGeoData,\x20\x27proxy\x27,\x20proxyIpWithPort);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20}\x20else\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20showError(\x27proxy\x27,\x20\x27Proxy\x20Host\x20not\x20available\x27,\x20proxyIpWithPort);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20const\x20clientIp\x20=\x20await\x20fetchClientPublicIP();\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20if\x20(clientIp)\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20const\x20clientIpElement\x20=\x20document.getElementById(\x27client-ip\x27);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20if(clientIpElement)\x20clientIpElement.textContent\x20=\x20clientIp;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20const\x20scamalyticsData\x20=\x20await\x20fetchScamalyticsClientInfo(clientIp);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20updateScamalyticsClientDisplay(scamalyticsData);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20}\x20else\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20showError(\x27client\x27,\x20\x27Could\x20not\x20determine\x20your\x20IP\x20address.\x27);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20}\x20catch\x20(error)\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20console.error(\x27Overall\x20network\x20info\x20loading\x20failed:\x27,\x20error);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20showError(\x27proxy\x27,\x20`Error:\x20${error.message}`,\x20document.body.getAttribute(\x27data-proxy-ip\x27)\x20||\x20\x22N/A\x22);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20showError(\x27client\x27,\x20`Error:\x20${error.message}`);\x0a\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20}\x0a\x0a\x20\x20\x20\x20\x20\x20document.getElementById(\x27refresh-ip-info\x27)?.addEventListener(\x27click\x27,\x20function()\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20const\x20button\x20=\x20this;\x0a\x20\x20\x20\x20\x20\x20\x20\x20const\x20icon\x20=\x20button.querySelector(\x27.refresh-icon\x27);\x0a\x20\x20\x20\x20\x20\x20\x20\x20button.disabled\x20=\x20true;\x0a\x20\x20\x20\x20\x20\x20\x20\x20if\x20(icon)\x20icon.style.animation\x20=\x20\x27spin\x201s\x20linear\x20infinite\x27;\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20const\x20resetToSkeleton\x20=\x20(prefix)\x20=>\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20const\x20elementsToReset\x20=\x20[\x27ip\x27,\x20\x27location\x27,\x20\x27isp\x27];\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20if\x20(prefix\x20===\x20\x27proxy\x27)\x20elementsToReset.push(\x27host\x27);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20if\x20(prefix\x20===\x20\x27client\x27)\x20elementsToReset.push(\x27proxy\x27);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20elementsToReset.forEach(key\x20=>\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20const\x20element\x20=\x20document.getElementById(`${prefix}-${key}`);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20if\x20(element)\x20element.innerHTML\x20=\x20`<span\x20class=\x22skeleton\x22\x20style=\x22width:\x20120px;\x22></span>`;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20});\x0a\x20\x20\x20\x20\x20\x20\x20\x20};\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20resetToSkeleton(\x27proxy\x27);\x0a\x20\x20\x20\x20\x20\x20\x20\x20resetToSkeleton(\x27client\x27);\x0a\x20\x20\x20\x20\x20\x20\x20\x20loadNetworkInfo().finally(()\x20=>\x20setTimeout(()\x20=>\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20button.disabled\x20=\x20false;\x20if\x20(icon)\x20icon.style.animation\x20=\x20\x27\x27;\x0a\x20\x20\x20\x20\x20\x20\x20\x20},\x201000));\x0a\x20\x20\x20\x20\x20\x20});\x0a\x0a\x20\x20\x20\x20\x20\x20const\x20style\x20=\x20document.createElement(\x27style\x27);\x0a\x20\x20\x20\x20\x20\x20style.textContent\x20=\x20`@keyframes\x20spin\x20{\x20from\x20{\x20transform:\x20rotate(0deg);\x20}\x20to\x20{\x20transform:\x20rotate(360deg);\x20}\x20}`;\x0a\x20\x20\x20\x20\x20\x20document.head.appendChild(style);\x0a\x0a\x20\x20\x20\x20\x20\x20document.addEventListener(\x27DOMContentLoaded\x27,\x20()\x20=>\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20loadNetworkInfo();\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20const\x20hiddifyBtn\x20=\x20document.getElementById(\x27hiddify-import-btn\x27);\x0a\x20\x20\x20\x20\x20\x20\x20\x20const\x20modal\x20=\x20document.getElementById(\x27hiddify-dns-modal\x27);\x0a\x20\x20\x20\x20\x20\x20\x20\x20const\x20continueBtn\x20=\x20document.getElementById(\x27hiddify-modal-continue\x27);\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20if\x20(hiddifyBtn\x20&&\x20modal\x20&&\x20continueBtn)\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20hiddifyBtn.addEventListener(\x27click\x27,\x20function(event)\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20event.preventDefault();\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20modal.style.display\x20=\x20\x27flex\x27;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20setTimeout(()\x20=>\x20modal.classList.add(\x27visible\x27),\x2010);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20});\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20continueBtn.addEventListener(\x27click\x27,\x20function()\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20modal.classList.remove(\x27visible\x27);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20setTimeout(()\x20=>\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20modal.style.display\x20=\x20\x27none\x27;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20window.location.href\x20=\x20hiddifyBtn.href;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20},\x20300);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20});\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20modal.addEventListener(\x27click\x27,\x20function(event)\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20if\x20(event.target\x20===\x20modal)\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20modal.classList.remove(\x27visible\x27);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20setTimeout(()\x20=>\x20modal.style.display\x20=\x20\x27none\x27,\x20300);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20});;\x0a\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20});\x0a\x20\x20';}