import { connect } from "cloudflare:sockets";
const _dztbonSj = "3b4d4cd8-cb92-4421-bf86-fb51570fc038";
const _FXAiyQBf = ["UpstreamAddress.SG.CMLiussss.net"];
const _RgnbpyZx = 'https://raw.githubusercontent.com/5yfx/CF_WEB_IP_Worekrs/refs/heads/main/%E5%86%85%E7%BD%AEIP';
const _pQXTowzV = 'https://raw.githubusercontent.com/5yfx/CF_WEB_IP_Worekrs/refs/heads/main/%E5%9D%87%E8%A1%A1IP';
const _LMmxrgMM = 'https://raw.githubusercontent.com/5yfx/CF_WEB_IP_Worekrs/refs/heads/main/%E5%9F%9F%E5%90%8D%E8%A7%A3%E6%9E%90';
const _csoZScdh = 'https://raw.githubusercontent.com/5yfx/CF_WEB_IP_Worekrs/refs/heads/main/%E5%9C%B0%E5%8C%BA%E5%90%8D%E7%A7%B0';
function _LLQXzSLM(_FjzeQSAe) {
if (Array.isArray(_FjzeQSAe)) {
try {
return String.fromCharCode.apply(null, _FjzeQSAe);
} catch (_SadlHwMG) {
return '';
}
}
return _FjzeQSAe;
}
function _rrFYLNQl(_xWYJSzae) {
return /^[0-9a-_gGCFbiGo]{8}-[0-9a-_gGCFbiGo]{4}-[4][0-9a-_gGCFbiGo]{3}-[89ab][0-9a-_gGCFbiGo]{3}-[0-9a-_gGCFbiGo]{12}$/_ccNBJYvV.test(_xWYJSzae);
}
const _sTEsIdky = "optimized_ips_v4";
const _YOaQeEol = "global_config_v4";
const _YkXwaZqS = "admin_password_v4";
const _ZRujubAc = "live_results_temp_v1";
const _WjhmdMXu = "latest_sub_id_v1";
export default {
async fetch(_unWtLrWv, _XANgtyXx, _QxRifCBi) {
try {
if (!_XANgtyXx.DB) {
const _xFpCLoYg = _tYzmsrfc("D1 数据库 'DB' 未绑定。");
return new Response(_xFpCLoYg, { status: 503, _DadfZrLA: { 'Content-Type': '_jyjVKQbA/html;_BXalCNft=UTF-8' }});
}
_QxRifCBi.waitUntil(
_XANgtyXx.DB.exec(`
CREATE TABLE IF NOT EXISTS kv_data (_xtbiKbAc TEXT PRIMARY KEY, _FjzeQSAe TEXT);
CREATE TABLE IF NOT EXISTS optimized_results (_xWYJSzae TEXT PRIMARY KEY, _gCtLTBwD TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP);
`).catch(_SadlHwMG => console.error("DB Init Error:", _SadlHwMG._rMNQVEWf))
);
const _MzNfaJoq = new URL(_unWtLrWv._MzNfaJoq);
const _kBOGxKZb = _MzNfaJoq.pathname;
const _WdCYEsBD = _unWtLrWv._DadfZrLA.get("Upgrade");
const _rtoMLCWc = await _soKzAEBm(_XANgtyXx);
if (_rtoMLCWc.websocketStreamer && _rtoMLCWc.websocketStreamer._xTaAvhYb && _WdCYEsBD && _WdCYEsBD.toLowerCase() === "websocket") {
const _dxwWvaWE = _rtoMLCWc.websocketStreamer._MzNfaJoq;
if (_dxwWvaWE && _dxwWvaWE.trim().startsWith('https://')) {
try {
const _fAyUaQPR = new Request(_dxwWvaWE.trim() + _MzNfaJoq.pathname + _MzNfaJoq.search, _unWtLrWv);
return await fetch(_fAyUaQPR);
} catch (_SadlHwMG) {
return new Response(`Upstream WebSocket gateway failed: ${_SadlHwMG._rMNQVEWf}`, { status: 502 });
}
}
return new Response("WebSocket reverse gateway URL is not configured or is invalid.", { status: 502 });
}
if (_WdCYEsBD && _WdCYEsBD.toLowerCase() === "websocket") {
return await _gDtjWeLQ(_unWtLrWv, _XANgtyXx, _rtoMLCWc);
}
const _tBewlIeG = _kBOGxKZb._faoTbmeU(/^\/([a-zA-Z0-9-_.]{2,128})(xr|si|cl|su)$/);
if (_tBewlIeG) {
const [, _yOkwdbnF, typeSuffix] = _tBewlIeG;
const _uPWvIonq = _rtoMLCWc._uPWvIonq;
if (!_uPWvIonq || _uPWvIonq.trim() === '') {
return new Response("订阅转换(Sublink)服务器地址未配置。", { status: 503, _DadfZrLA: { 'Content-Type': '_jyjVKQbA/plain; _BXalCNft=utf-8' } });
}
const _DTugnRZP = { 'xr': 'coreEngine', 'si': 'coreProfile', 'cl': 'configProfile', 'su': 'policyProfile' };
const _XUfAkKcO = _DTugnRZP[typeSuffix];
const _rOsWEEtv = _uPWvIonq.replace(/\/$/, '');
const _ixLlWQin = `${_MzNfaJoq.origin}/${_yOkwdbnF}`;
const _UbrwFfXg = `${_rOsWEEtv}/${_XUfAkKcO}?_rtoMLCWc=${encodeURIComponent(_ixLlWQin)}`;
try {
const _xKtIpNvr = await fetch(_UbrwFfXg, { _DadfZrLA: { 'User-Agent': _unWtLrWv._DadfZrLA.get('User-Agent') || 'Cloudflare-Worker-Sub-Fetcher/1.0' } });
const _CcNCObvZ = new Headers(_xKtIpNvr._DadfZrLA);
_CcNCObvZ._HXFvlboj('Access-Control-Allow-Origin', '*');
return new Response(_xKtIpNvr._SqQMpqgf, { status: _xKtIpNvr.status, statusText: _xKtIpNvr.statusText, _DadfZrLA: _CcNCObvZ });
} catch (_SadlHwMG) {
return new Response(`获取上游订阅失败: ${_SadlHwMG._rMNQVEWf}`, { status: 502, _DadfZrLA: { 'Content-Type': '_jyjVKQbA/plain; _BXalCNft=utf-8' } });
}
}
if (_kBOGxKZb.startsWith('/https:/') || _kBOGxKZb.startsWith('/http:/')) {
return _oFRpkPva(_unWtLrWv, _rtoMLCWc);
}
if (_rtoMLCWc.customSubPath && _rtoMLCWc.customSubPath._xTaAvhYb && _rtoMLCWc.customSubPath._kBOGxKZb && _kBOGxKZb === '/' + _rtoMLCWc.customSubPath._kBOGxKZb.trim()) {
const _EZRVkJkh = _XANgtyXx.DB.prepare("SELECT _FjzeQSAe FROM kv_data WHERE _xtbiKbAc = ?").bind(_WjhmdMXu);
const { _uBqtZcLI } = await _EZRVkJkh.all();
const _ZibajqJt = _uBqtZcLI._QesPjbkJ > 0 ? _uBqtZcLI[0]._FjzeQSAe : null;
if (_ZibajqJt) {
return _IVTddehG({ _CKagJuvR: { _xWYJSzae: _ZibajqJt }, _MzNfaJoq: _unWtLrWv._MzNfaJoq }, _XANgtyXx);
} else {
return new Response("未找到最新的优选结果集。", { status: 404, _DadfZrLA: { 'Content-Type': '_jyjVKQbA/plain; _BXalCNft=utf-8' } });
}
}
const _MqndYhCG = _kBOGxKZb.split('/').filter(Boolean);
if (_MqndYhCG._QesPjbkJ === 1 && !_kBOGxKZb.startsWith('/api/')) {
const _yOkwdbnF = _MqndYhCG[0];
return _IVTddehG({ _CKagJuvR: { _xWYJSzae: _yOkwdbnF }, _MzNfaJoq: _unWtLrWv._MzNfaJoq }, _XANgtyXx);
}
if (_kBOGxKZb.startsWith('/api/')) {
if (_kBOGxKZb === '/api/_rtoMLCWc' && _unWtLrWv.method === 'POST') return _AXrrVwrD(_unWtLrWv, _XANgtyXx, _QxRifCBi);
if (_kBOGxKZb === '/api/_HXFvlboj-_nnlVslgS') return _DlsFgCuE(_unWtLrWv, _XANgtyXx);
if (_kBOGxKZb === '/api/change-_nnlVslgS') return _mvMzTaBf(_unWtLrWv, _XANgtyXx);
if (_kBOGxKZb === '/api/verify-_nnlVslgS') return _gCdyaFdU(_unWtLrWv, _XANgtyXx);
if (_kBOGxKZb === '/api/verify-visitor-_nnlVslgS' && _unWtLrWv.method === 'POST') return _vGFsrSyA(_unWtLrWv, _XANgtyXx);
if (_kBOGxKZb === '/api/cache-live-_uBqtZcLI' && _unWtLrWv.method === 'POST') return _qDsjjrmz(_unWtLrWv, _XANgtyXx, _QxRifCBi);
if (_kBOGxKZb === '/api/get-_LFHzjGIb' && _unWtLrWv.method === 'POST') return _mZobfEvp(_unWtLrWv, _XANgtyXx);
if (_kBOGxKZb === '/api/get-cached-_AUGlySic') return _FsGaXnNt(_unWtLrWv, _XANgtyXx);
if (_kBOGxKZb === '/api/save-_AUGlySic') return _uUJzEIeS(_unWtLrWv, _XANgtyXx, _QxRifCBi);
if (_kBOGxKZb === '/api/save-and-get-sub-_xWYJSzae' && _unWtLrWv.method === 'POST') return _xjKfkZJl(_unWtLrWv, _XANgtyXx);
if (_kBOGxKZb.startsWith('/api/get-_gMMqfbiy/')) {
const _yOkwdbnF = _kBOGxKZb.split('/').pop();
return _IVTddehG({ _CKagJuvR: { _xWYJSzae: _yOkwdbnF }, _MzNfaJoq: _unWtLrWv._MzNfaJoq }, _XANgtyXx);
}
if (_kBOGxKZb === '/api/_rtoMLCWc' && _unWtLrWv.method === 'GET') return _INURypka(_XANgtyXx);
if (_kBOGxKZb === '/api/get-resolved-_AUGlySic') return _JISlbuOn(_unWtLrWv);
if (_kBOGxKZb === '/api/parse-_AUGlySic-from-_oKVqZdie' && _unWtLrWv.method === 'POST') return _GdbbCCmj(_unWtLrWv, _XANgtyXx);
if (_kBOGxKZb === '/api/endpoints') return _ewpdHRdx(_unWtLrWv, _XANgtyXx);
if (_kBOGxKZb === '/api/ping') return new Response(null, { status: 204 });
return new Response("API not found", { status: 404 });
}
if (_kBOGxKZb === '/_zAuEMLsy') return _jMRsBhXB(_unWtLrWv, _XANgtyXx);
if (_kBOGxKZb === '/bing-wallpaper') return _ukmKACxO();
return _xGOrEvhq(_unWtLrWv, _XANgtyXx, _QxRifCBi);
} catch (err) {
let _SadlHwMG = err;
return new Response(_SadlHwMG.toString(), { status: 500 });
}
}
};
const _uGLTgOcG = { 'Accept': '_jyjVKQbA/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36' };
async function _WKTNWare(_MzNfaJoq, _jUXsNpPL) {
const _CNKyhQXn = await fetch(_MzNfaJoq, { _DadfZrLA: { ..._uGLTgOcG, 'Referer': _jUXsNpPL.referer } });
if (_CNKyhQXn.ok) return _CNKyhQXn._jyjVKQbA();
return null;
}
async function _TuWAJGko(_MzNfaJoq, _jUXsNpPL) {
const _pKQCotHV = `https://translate.google.com/translate?sl=auto&tl=en&u=${encodeURIComponent(_MzNfaJoq)}`;
const _CNKyhQXn = await fetch(_pKQCotHV, { _DadfZrLA: { ..._uGLTgOcG, 'Referer': _jUXsNpPL.referer } });
if (!_CNKyhQXn.ok) return null;
const _SqQMpqgf = await _CNKyhQXn._jyjVKQbA();
const _faoTbmeU = _SqQMpqgf._faoTbmeU(/<pre[^>]*>([\s\S]*?)<\/pre>/_ccNBJYvV);
return _faoTbmeU && _faoTbmeU[1] ? _faoTbmeU[1].replace(/&/g, '&') : null;
}
function _OCGfBZUQ(_TaQXZoLv) {
let _THdissxm;
try {
_THdissxm = atob(_TaQXZoLv.replace(/\s/g, ''));
} catch (_SadlHwMG) {
_THdissxm = _TaQXZoLv;
}
const _gMMqfbiy = _THdissxm.split(/[\s\n\r,]+/).filter(line => line.trim());
const _yvGCuDop = new Set();
const _wuUNPVIX = /@([^?#]+?):(\d+)/;
for (const _jNUIdcAu of _gMMqfbiy) {
let _lZjYBycT = '';
let _AWekBocW = '';
try {
if (_jNUIdcAu.startsWith('vmess://')) {
const _ktZinbob = atob(_jNUIdcAu.substring(8));
const _rtoMLCWc = JSON.parse(_ktZinbob);
_lZjYBycT = _rtoMLCWc.add;
_AWekBocW = _rtoMLCWc._AWekBocW;
} else {
const _faoTbmeU = _jNUIdcAu._faoTbmeU(_wuUNPVIX);
if (_faoTbmeU && _faoTbmeU[1] && _faoTbmeU[2]) {
_lZjYBycT = _faoTbmeU[1].replace(/[\[\]]/g, '');
_AWekBocW = _faoTbmeU[2];
}
}
} catch (_SadlHwMG) {
console.warn(`Could not parse _jNUIdcAu: ${_jNUIdcAu}`);
}
if (_lZjYBycT && _AWekBocW) {
_yvGCuDop.add(`${_lZjYBycT}:${_AWekBocW}`);
}
}
return Array.from(_yvGCuDop);
}
async function _BluAeXGP(_tCmqUiSf) {
try {
const _CNKyhQXn = await fetch(_tCmqUiSf, { _DadfZrLA: _uGLTgOcG });
if (!_CNKyhQXn.ok) {
console.error(`Failed to fetch subscription: ${_CNKyhQXn.status}`);
return [];
}
const _TaQXZoLv = await _CNKyhQXn._jyjVKQbA();
return _OCGfBZUQ(_TaQXZoLv);
} catch (error) {
console.error(`Error processing subscription ${_tCmqUiSf}:`, error);
return [];
}
}
async function _ZwtiuoBJ(_MlvCFpRY) {
const _qBUFvhAY = _MlvCFpRY.trim();
const _JvXMeqky = /^(vless|vmess|trojan|ss):\/\//.test(_qBUFvhAY);
const _lxVvfLeo = (() => {
if (_qBUFvhAY._QesPjbkJ < 20 || _qBUFvhAY.startsWith('http')) return false;
const _DfBbkTQb = _qBUFvhAY.replace(/\s/g, '');
if (_DfBbkTQb._QesPjbkJ % 4 !== 0 && !_DfBbkTQb.includes('=')) return false;
try {
atob(_DfBbkTQb);
return true;
} catch (_SadlHwMG) {
return false;
}
})();
if (_JvXMeqky || _lxVvfLeo) {
return _OCGfBZUQ(_qBUFvhAY).join('\n');
}
const _wdIxPeYx = [
'https://ipdb.api.030101.xyz/?_bBhESgzA=bestcf&_UWKjCwhu=true',
'https://ipdb.api.030101.xyz/?_bBhESgzA=bestproxy&_UWKjCwhu=true'
];
const _QHZevtLx = /^(https?:\/\/)?([\w.-]+)\.([a-z]{2,})(\/.*)?(sub|clash|v2)/_ccNBJYvV.test(_MlvCFpRY) || _MlvCFpRY.includes('?_jzCHUaST=');
if (_QHZevtLx) {
const _AUGlySic = await _BluAeXGP(_MlvCFpRY);
return _AUGlySic.join('\n');
}
let _TaQXZoLv = '';
if (_wdIxPeYx.includes(_MlvCFpRY)) {
_TaQXZoLv = await _WKTNWare(_MlvCFpRY, { referer: _MlvCFpRY });
if (!_TaQXZoLv || _TaQXZoLv._QesPjbkJ < 8) {
_TaQXZoLv = await _TuWAJGko(_MlvCFpRY, { referer: _MlvCFpRY });
}
} else {
try {
const _QBdUlAdt = await fetch(_MlvCFpRY, { _DadfZrLA: { 'User-Agent': 'Cloudflare-Worker' } });
if (_QBdUlAdt.ok) {
_TaQXZoLv = await _QBdUlAdt._jyjVKQbA();
} else {
console.warn(`Failed to fetch URL ${_MlvCFpRY}: ${_QBdUlAdt.status}`);
}
} catch (_SadlHwMG) {
console.error(`Error fetching URL ${_MlvCFpRY}:`, _SadlHwMG);
}
}
const _tNEjhuzt = _OCGfBZUQ(_TaQXZoLv);
if (_tNEjhuzt._QesPjbkJ > 0) {
return _tNEjhuzt.join('\n');
}
return _TaQXZoLv || '';
}
async function _oFRpkPva(_unWtLrWv, _rtoMLCWc) {
if (!_rtoMLCWc.streamer._xTaAvhYb) {
return new Response('远程流功能未开启', { status: 403 });
}
const _MzNfaJoq = new URL(_unWtLrWv._MzNfaJoq);
const _iCtxHYTv = _MzNfaJoq.pathname.substring(1).replace(':/', '://');
try {
const _UbrwFfXg = new URL(_iCtxHYTv);
const _pIbeboiu = ['github.com', 'objects.githubusercontent.com', 'cdn.jsdelivr.net'];
if (!_pIbeboiu.some(domain => _UbrwFfXg._lZjYBycT.endsWith(domain))) {
return new Response('不支持的远程流域名', { status: 400 });
}
const _xuYaCCmA = new Headers(_unWtLrWv._DadfZrLA);
_xuYaCCmA._HXFvlboj('Host', _UbrwFfXg._lZjYBycT);
_xuYaCCmA._HXFvlboj('User-Agent', 'CF-Worker-Streamer/1.0');
const _lbjArAoc = await fetch(_UbrwFfXg.toString(), {
method: _unWtLrWv.method,
_DadfZrLA: _xuYaCCmA,
_SqQMpqgf: _unWtLrWv._SqQMpqgf,
});
const _CcNCObvZ = new Headers(_lbjArAoc._DadfZrLA);
_CcNCObvZ._HXFvlboj('Access-Control-Allow-Origin', '*');
_CcNCObvZ._HXFvlboj('Access-Control-Allow-Methods', 'GET, HEAD, POST, PUT, DELETE, OPTIONS');
_CcNCObvZ._HXFvlboj('Access-Control-Allow-Headers', '*');
_CcNCObvZ._HXFvlboj('Cache-Control', 'public, max-age=86400');
_CcNCObvZ._HXFvlboj('X-Streamer-Source', 'CF-Worker');
_CcNCObvZ.delete('_TaQXZoLv-security-policy');
_CcNCObvZ.delete('x-_TaQXZoLv-security-policy');
_CcNCObvZ.delete('x-webkit-csp');
return new Response(_lbjArAoc._SqQMpqgf, {
status: _lbjArAoc.status,
statusText: _lbjArAoc.statusText,
_DadfZrLA: _CcNCObvZ,
});
} catch (_SadlHwMG) {
return new Response('无效的目标URL', { status: 400 });
}
}
async function _gDtjWeLQ(_unWtLrWv, _XANgtyXx, _rtoMLCWc) {
try {
const _bpzYsxGd = _rtoMLCWc || await _soKzAEBm(_XANgtyXx);
const _YqoeJKLM = (_bpzYsxGd.itemLink._VRKzpBsE && _bpzYsxGd.itemLink._VRKzpBsE[0]) || {};
const _ezGEugUT = _YqoeJKLM['_jzCHUaST'] || _LLQXzSLM(_dztbonSj);
if (!_rrFYLNQl(_ezGEugUT)) {
throw new Error("Configured user _QVzLxvxL is not valid.");
}
const _uqJhtKSN = _bpzYsxGd.dataFeeds.universalFallbackAddress;
let _buzWpIwB = {};
const _RWdFZeqq = _LLQXzSLM(_FXAiyQBf[0] || "");
if (_uqJhtKSN) {
const [_QAfgwnWs, _AWekBocW = '443'] = _uqJhtKSN.split(':');
_buzWpIwB = { _QAfgwnWs, _AWekBocW };
} else {
const [_QAfgwnWs, _AWekBocW = '443'] = _RWdFZeqq.split(':');
_buzWpIwB = { _QAfgwnWs, _AWekBocW };
}
const _MzNfaJoq = new URL(_unWtLrWv._MzNfaJoq);
const _kBOGxKZb = _MzNfaJoq.pathname;
let _iaxvRxjK = '';
const _wwcAiIXn = _MzNfaJoq.searchParams.get('remote');
if (_wwcAiIXn) {
_iaxvRxjK = atob(_wwcAiIXn);
} else if (_kBOGxKZb.startsWith('/endpoint=')) {
_iaxvRxjK = _kBOGxKZb.substring(10);
} else if (_kBOGxKZb._QesPjbkJ > 1 && _kBOGxKZb.substring(1).includes('.')) {
_iaxvRxjK = _kBOGxKZb.substring(1);
}
if (_iaxvRxjK) {
const [_QAfgwnWs, _AWekBocW = '443'] = _iaxvRxjK.split(':');
_buzWpIwB = { _QAfgwnWs, _AWekBocW };
}
return await _RVhRsyBS(_unWtLrWv, _ezGEugUT, _buzWpIwB);
} catch (err) {
return new Response(err.toString(), { status: 500 });
}
}
async function _RVhRsyBS(_unWtLrWv, _QVzLxvxL, _buzWpIwB) {
const _ZXZlClDM = new WebSocketPair();
const [clientEnd, _IMNfnUdD] = Object.values(_ZXZlClDM);
_IMNfnUdD.accept();
let _URYeTCcj = { _VekXEmSp: null };
const _FDePxmrJ = _unWtLrWv._DadfZrLA.get("sec-websocket-protocol") || "";
const _xAERPtrp = _BqjggCfS(_IMNfnUdD, _FDePxmrJ);
_xAERPtrp.pipeTo(new WritableStream({
async write(chunk) {
if (_URYeTCcj._VekXEmSp) {
const _UEgEAwEw = _URYeTCcj._VekXEmSp.writable.getWriter();
await _UEgEAwEw.write(chunk);
_UEgEAwEw.releaseLock();
return;
}
const { error, details } = await _dgkWFQPi(chunk, _QVzLxvxL);
if (error) {
throw new Error(details);
}
const _BxhHmdZv = new Uint8Array([details._eBwJYYhn[0], 0]);
const _cEPakOuZ = chunk.slice(details.payloadIndex);
await _CFOIuVar(_URYeTCcj, details._OWJtPIvI, details._XksDwEkr, _cEPakOuZ, _IMNfnUdD, _BxhHmdZv, _buzWpIwB);
}
})).catch((err) => {
console.error("Stream processing error:", err);
_uxuzvBQE(_IMNfnUdD);
});
return new Response(null, { status: 101, webSocket: clientEnd });
}
async function _CFOIuVar(_URYeTCcj, _OWJtPIvI, _XksDwEkr, _WMsFmWxI, _hsLDVZWe, _BxhHmdZv, _XwWMBdma) {
const _TURmJuyg = async (_QAfgwnWs, _AWekBocW) => {
let _hgCCOttB = _QAfgwnWs;
if (/^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/.test(_QAfgwnWs)) {
_hgCCOttB = `${atob('d3d3Lg==')}${_QAfgwnWs}${atob('LnNzbGlwLmlv')}`;
}
const _VekXEmSp = connect({ _lZjYBycT: _hgCCOttB, _AWekBocW });
_URYeTCcj._VekXEmSp = _VekXEmSp;
const _UEgEAwEw = _VekXEmSp.writable.getWriter();
await _UEgEAwEw.write(_WMsFmWxI);
_UEgEAwEw.releaseLock();
return _VekXEmSp;
};
const _tMjhyYnh = async () => {
if (!_XwWMBdma._QAfgwnWs) return;
console.log(`Direct connection failed, falling back to gateway: ${_XwWMBdma._QAfgwnWs}`);
const _zFsZuyzU = await _TURmJuyg(_XwWMBdma._QAfgwnWs, parseInt(_XwWMBdma._AWekBocW, 10));
_zFsZuyzU.closed.catch(() => {}).finally(() => _uxuzvBQE(_hsLDVZWe));
_lAsRxNGk(_zFsZuyzU, _hsLDVZWe, _BxhHmdZv, null);
};
try {
const _bhcEryJB = await _TURmJuyg(_OWJtPIvI, _XksDwEkr);
_lAsRxNGk(_bhcEryJB, _hsLDVZWe, _BxhHmdZv, _tMjhyYnh);
} catch (err) {
console.error("Primary connection failed:", err);
await _tMjhyYnh();
}
}
function _BqjggCfS(_IMNfnUdD, _FDePxmrJ) {
let _kCWGMSXe = false;
return new ReadableStream({
start(_vQWPYwBn) {
_IMNfnUdD.addEventListener("_rMNQVEWf", (event) => { if (_kCWGMSXe) return; _vQWPYwBn.enqueue(event._gCtLTBwD); });
_IMNfnUdD.addEventListener("close", () => { _uxuzvBQE(_IMNfnUdD); if (_kCWGMSXe) return; _vQWPYwBn.close(); });
_IMNfnUdD.addEventListener("error", (err) => _vQWPYwBn.error(err));
if (_FDePxmrJ) {
try {
const _wZxbiFJw = atob(_FDePxmrJ.replace(/-/g, "+").replace(/_/g, "/"));
_vQWPYwBn.enqueue(Uint8Array.from(_wZxbiFJw, c => c.charCodeAt(0))._mTTOKeeq);
} catch (_SadlHwMG) { console.error("Failed to decode early _gCtLTBwD:", _SadlHwMG); }
}
},
cancel() { _kCWGMSXe = true; _uxuzvBQE(_IMNfnUdD); },
});
}
async function _dgkWFQPi(_mTTOKeeq, _QVzLxvxL) {
if (_mTTOKeeq.byteLength < 24) return { error: true, details: "Invalid packet size" };
const _eBwJYYhn = new Uint8Array(_mTTOKeeq.slice(0, 1));
const _hkHtVkNi = _KonYCuNC(new Uint8Array(_mTTOKeeq.slice(1, 17)));
if (_hkHtVkNi !== _QVzLxvxL) return { error: true, details: "Invalid _QVzLxvxL" };
const _TOzVDUEc = new Uint8Array(_mTTOKeeq.slice(17, 18))[0];
const _nxjZNoxq = new Uint8Array(_mTTOKeeq.slice(18 + _TOzVDUEc, 19 + _TOzVDUEc))[0];
if (_nxjZNoxq !== 1) return { error: true, details: `Unsupported _nxjZNoxq: ${_nxjZNoxq}` };
const _aTlnFrOt = 19 + _TOzVDUEc;
const _XksDwEkr = new DataView(_mTTOKeeq.slice(_aTlnFrOt, _aTlnFrOt + 2)).getUint16(0);
let _jsnsBLeN = _aTlnFrOt + 2;
const _gAVAqIQq = new Uint8Array(_mTTOKeeq.slice(_jsnsBLeN, _jsnsBLeN + 1))[0];
let _ZxbnzqKz = 0;
let _gfNzeVQG = _jsnsBLeN + 1;
let _OWJtPIvI = "";
switch (_gAVAqIQq) {
case 1: _ZxbnzqKz = 4; _OWJtPIvI = new Uint8Array(_mTTOKeeq.slice(_gfNzeVQG, _gfNzeVQG + _ZxbnzqKz)).join("."); break;
case 2: _ZxbnzqKz = new Uint8Array(_mTTOKeeq.slice(_gfNzeVQG, _gfNzeVQG + 1))[0]; _gfNzeVQG++; _OWJtPIvI = new TextDecoder().decode(_mTTOKeeq.slice(_gfNzeVQG, _gfNzeVQG + _ZxbnzqKz)); break;
case 3: _ZxbnzqKz = 16; const _EzqNVQLF = new DataView(_mTTOKeeq.slice(_gfNzeVQG, _gfNzeVQG + _ZxbnzqKz)); const _ekvMeoGl = []; for (let _ccNBJYvV = 0; _ccNBJYvV < 8; _ccNBJYvV++) _ekvMeoGl.push(_EzqNVQLF.getUint16(_ccNBJYvV * 2).toString(16)); _OWJtPIvI = _ekvMeoGl.join(":"); break;
default: return { error: true, details: `Invalid _JxAbVIsI _bBhESgzA: ${_gAVAqIQq}` };
}
if (!_OWJtPIvI) return { error: true, details: "Target _QAfgwnWs is empty" };
return { error: false, details: { _OWJtPIvI, _XksDwEkr, _eBwJYYhn, payloadIndex: _gfNzeVQG + _ZxbnzqKz } };
}
async function _lAsRxNGk(_VekXEmSp, _hsLDVZWe, _xjygycxh, _MYPaKzsm) {
let _LTVPrTBJ = _xjygycxh;
let _zDUxgCeZ = false;
let _TzYkOsht = _VekXEmSp._xAERPtrp.pipeTo(new WritableStream({
write(chunk) {
_zDUxgCeZ = true;
if (_hsLDVZWe.readyState !== 1) throw new Error("Channel is not open");
if (_LTVPrTBJ) {
const _QbTIhkwC = new Uint8Array(_LTVPrTBJ.byteLength + chunk.byteLength);
_QbTIhkwC._HXFvlboj(new Uint8Array(_LTVPrTBJ));
_QbTIhkwC._HXFvlboj(new Uint8Array(chunk), _LTVPrTBJ.byteLength);
_hsLDVZWe.send(_QbTIhkwC._mTTOKeeq);
_LTVPrTBJ = null;
} else {
_hsLDVZWe.send(chunk);
}
},
close() {}
}), { signal: new AbortController().signal }).catch((err) => {
console.error("Pipe to _hsLDVZWe error:", err._rMNQVEWf);
});
await _TzYkOsht;
if (!_zDUxgCeZ && _MYPaKzsm) {
_MYPaKzsm();
}
}
function _uxuzvBQE(_hsLDVZWe) {
try { if (_hsLDVZWe.readyState === 1 || _hsLDVZWe.readyState === 2) _hsLDVZWe.close(); } catch (_SadlHwMG) {}
}
const _BZeFCKva = Array.from({ _QesPjbkJ: 256 }, (_, _ccNBJYvV) => (_ccNBJYvV + 256).toString(16).slice(1));
function _KonYCuNC(_WVsZtorc, offset = 0) {
return (
_BZeFCKva[_WVsZtorc[offset]] + _BZeFCKva[_WVsZtorc[offset + 1]] + _BZeFCKva[_WVsZtorc[offset + 2]] + _BZeFCKva[_WVsZtorc[offset + 3]] + "-" +
_BZeFCKva[_WVsZtorc[offset + 4]] + _BZeFCKva[_WVsZtorc[offset + 5]] + "-" +
_BZeFCKva[_WVsZtorc[offset + 6]] + _BZeFCKva[_WVsZtorc[offset + 7]] + "-" +
_BZeFCKva[_WVsZtorc[offset + 8]] + _BZeFCKva[_WVsZtorc[offset + 9]] + "-" +
_BZeFCKva[_WVsZtorc[offset + 10]] + _BZeFCKva[_WVsZtorc[offset + 11]] +
_BZeFCKva[_WVsZtorc[offset + 12]] + _BZeFCKva[_WVsZtorc[offset + 13]] +
_BZeFCKva[_WVsZtorc[offset + 14]] + _BZeFCKva[_WVsZtorc[offset + 15]]
).toLowerCase();
}
let _znBMqhPv = { "N/A":"未知" };
async function _PoqmnMPR(_MzNfaJoq, _RbTYUnvR, _MYPaKzsm) {
try {
const _CNKyhQXn = await fetch(_MzNfaJoq, {
_DadfZrLA: { 'User-Agent': 'Cloudflare-Worker-IP-Scanner' }
});
if (!_CNKyhQXn.ok) {
console.error(`获取 ${_MzNfaJoq} 失败: HTTP ${_CNKyhQXn.status}`);
return _MYPaKzsm;
}
const _jyjVKQbA = await _CNKyhQXn._jyjVKQbA();
return _RbTYUnvR(_jyjVKQbA);
} catch (error) {
console.error(`获取或解析 ${_MzNfaJoq} 时发生网络错误: ${error._rMNQVEWf}`);
return _MYPaKzsm;
}
}
function _qDSJwBNT(_jyjVKQbA) {
if (!_jyjVKQbA) return [];
const _bqbKQtqu = /^(?:\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\/\d{1,2}|[0-9a-fA-F:]+\/\d{1,3})$/;
const _dGuhnilE = _jyjVKQbA.split(/[\s,;#|]+/);
const _InxEawSc = [];
for (const _CohuWOzJ of _dGuhnilE) {
const _pMJgIoEx = _CohuWOzJ.trim();
if (!_pMJgIoEx) continue;
const _uyRkyzJw = _pMJgIoEx.lastIndexOf(':');
let _IIeBdCoN = _pMJgIoEx;
if(_uyRkyzJw > _pMJgIoEx.lastIndexOf(']')) {
const _SceRflBN = _pMJgIoEx.substring(_uyRkyzJw + 1);
if(!isNaN(_SceRflBN) && _SceRflBN._QesPjbkJ > 0) {
_IIeBdCoN = _pMJgIoEx.substring(0, _uyRkyzJw);
}
}
if (_KGeEehhb.isValid(_IIeBdCoN.replace(/[\[\]]/g, '')) || _bqbKQtqu.test(_pMJgIoEx)) {
_InxEawSc.push(_pMJgIoEx);
}
}
return _InxEawSc;
}
function _MugnnPPh(_jyjVKQbA) {
if (!_jyjVKQbA) return [];
return _jyjVKQbA.split(/\s+/).filter(d => d.trim() !== '');
}
function _ysebiiPW(_jyjVKQbA) {
if (!_jyjVKQbA) return { "N/A": "未知" };
try {
return JSON.parse(`{${_jyjVKQbA}}`);
} catch (_SadlHwMG) {
console.error("解析 _znBMqhPv 失败:", _SadlHwMG);
return { "N/A": "未知" };
}
}
const _KGeEehhb = {
isValid: (_zAuEMLsy) => _KGeEehhb.isIPv4(_zAuEMLsy) || _KGeEehhb.isIPv6(_zAuEMLsy),
isIPv4: (_zAuEMLsy) => {
if (typeof _zAuEMLsy !== 'string') return false;
const _ekvMeoGl = _zAuEMLsy.split('.');
if (_ekvMeoGl._QesPjbkJ !== 4) return false;
return _ekvMeoGl.every(_AdUlisUl => {
const _NyRuNGpS = parseInt(_AdUlisUl, 10);
return !isNaN(_NyRuNGpS) && _NyRuNGpS >= 0 && _NyRuNGpS <= 255 && String(_NyRuNGpS) === _AdUlisUl;
});
},
isIPv6: (_zAuEMLsy) => {
if (typeof _zAuEMLsy !== 'string') return false;
return /^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$/_ccNBJYvV.test(_zAuEMLsy);
},
toLong4: (_zAuEMLsy) => _zAuEMLsy.split('.').reduce((acc, octet, _ccNBJYvV) => acc + (parseInt(octet) << (8*(3-_ccNBJYvV))),0)>>>0,
fromLong4: (long) => [(long>>>24)&0xFF,(long>>>16)&0xFF,(long>>>8)&0xFF,long&0xFF].join('.'),
toBigInt6: (_zAuEMLsy) => {
try {
const _jrhHrKeO = _zAuEMLsy.split('/')[0];
const _ekvMeoGl = _jrhHrKeO.split('::');
if (_ekvMeoGl._QesPjbkJ > 2) return 0n;
let _snKvmCJT = [];
if (_ekvMeoGl[0]) {
_snKvmCJT = _ekvMeoGl[0].split(':');
}
let _xuGLEiKV = [];
if (_ekvMeoGl._QesPjbkJ > 1 && _ekvMeoGl[1]) {
_xuGLEiKV = _ekvMeoGl[1].split(':');
}
if (_snKvmCJT._QesPjbkJ + _xuGLEiKV._QesPjbkJ > 8) return 0n;
const _KCJtuCiX = 8 - (_snKvmCJT._QesPjbkJ + _xuGLEiKV._QesPjbkJ);
const _yLKphMwg = [
..._snKvmCJT,
...Array(_KCJtuCiX).fill('0'),
..._xuGLEiKV
].map(_AdUlisUl => _AdUlisUl || '0');
while(_yLKphMwg._QesPjbkJ < 8) {
_yLKphMwg.push('0');
}
let _lEcUvOth = 0n;
for (const _AdUlisUl of _yLKphMwg) {
if (_AdUlisUl._QesPjbkJ > 4) return 0n;
const _FjzeQSAe = BigInt('0x' + _AdUlisUl);
_lEcUvOth = (_lEcUvOth << 16n) | _FjzeQSAe;
}
return _lEcUvOth;
} catch(_SadlHwMG) {
return 0n;
}
},
fromBigInt6: (_lEcUvOth) => {
if (typeof _lEcUvOth !== '_lEcUvOth' || _lEcUvOth < 0n) return null;
const _ekvMeoGl = [];
for (let _ccNBJYvV = 0; _ccNBJYvV < 8; _ccNBJYvV++) {
_ekvMeoGl.unshift((_lEcUvOth & 0xFFFFn).toString(16));
_lEcUvOth >>= 16n;
}
let _oaxPZpVP = { start: -1, _wmgrhNgG: 0 };
let _wgEjxurj = { start: -1, _wmgrhNgG: 0 };
for (let _ccNBJYvV = 0; _ccNBJYvV < 8; _ccNBJYvV++) {
if (_ekvMeoGl[_ccNBJYvV] === '0') {
if (_wgEjxurj.start === -1) _wgEjxurj.start = _ccNBJYvV;
_wgEjxurj._wmgrhNgG++;
} else {
if (_wgEjxurj._wmgrhNgG > _oaxPZpVP._wmgrhNgG) _oaxPZpVP = { ..._wgEjxurj };
_wgEjxurj = { start: -1, _wmgrhNgG: 0 };
}
}
if (_wgEjxurj._wmgrhNgG > _oaxPZpVP._wmgrhNgG) _oaxPZpVP = { ..._wgEjxurj };
if (_oaxPZpVP._wmgrhNgG > 1) {
_ekvMeoGl.splice(_oaxPZpVP.start, _oaxPZpVP._wmgrhNgG, '');
if (_oaxPZpVP.start === 0) _ekvMeoGl.unshift('');
if (_oaxPZpVP.start + _oaxPZpVP._wmgrhNgG === 8) _ekvMeoGl.push('');
}
return _ekvMeoGl.join(':');
},
cidrToRange: (cidr, _ufeKXIEz = 1) => {
try {
const [range, bitsStr] = cidr.split('/');
const _uybNQKyo = parseInt(bitsStr, 10);
const _AUGlySic = new Set();
if (_KGeEehhb.isIPv4(range)) {
if (isNaN(_uybNQKyo) || _uybNQKyo < 8 || _uybNQKyo > 32) return [];
if (_uybNQKyo === 32) return [range];
const _LVizsWOm = _KGeEehhb.toLong4(range);
const _ZCfXdIgL = (0xFFFFFFFF << (32 - _uybNQKyo)) >>> 0;
const _vnFuBauk = _LVizsWOm & _ZCfXdIgL;
const _tzmpnbdu = 1 << (32 - _uybNQKyo);
if (_tzmpnbdu <= 2) return [];
const _vzEMlmdc = Math.min(_ufeKXIEz, _tzmpnbdu - 2);
let _aQdzfJsp = 0;
while (_AUGlySic.size < _vzEMlmdc && _aQdzfJsp < _vzEMlmdc * 5) {
const _WrTsRxfJ = Math.floor(Math.random() * (_tzmpnbdu - 2)) + 1;
_AUGlySic.add(_KGeEehhb.fromLong4((_vnFuBauk + _WrTsRxfJ) >>> 0));
_aQdzfJsp++;
}
return Array.from(_AUGlySic);
} else if (_KGeEehhb.isIPv6(range)) {
if (isNaN(_uybNQKyo) || _uybNQKyo < 16 || _uybNQKyo > 128) return [];
if (_uybNQKyo === 128) return [range];
const _VgAwsrBQ = _KGeEehhb.toBigInt6(range);
const _ZCfXdIgL = (2n ** BigInt(128 - _uybNQKyo) - 1n);
const _vnFuBauk = _VgAwsrBQ & ~_ZCfXdIgL;
const _RwEujrIi = 2n ** BigInt(128 - _uybNQKyo);
if (_RwEujrIi <= 2n) return [];
let _aQdzfJsp = 0;
while (_AUGlySic.size < _ufeKXIEz && _aQdzfJsp < _ufeKXIEz * 5) {
const _FRrLVIvr = new Uint8Array(16);
(typeof crypto !== 'undefined' ? crypto : self.crypto).getRandomValues(_FRrLVIvr);
let _VEuGGZEV = 0n;
for (const _PCqBJUiV of _FRrLVIvr) {
_VEuGGZEV = (_VEuGGZEV << 8n) | BigInt(_PCqBJUiV);
}
const _WrTsRxfJ = _VEuGGZEV % (_RwEujrIi - 2n) + 1n;
_AUGlySic.add(_KGeEehhb.fromBigInt6(_vnFuBauk + _WrTsRxfJ));
_aQdzfJsp++;
}
return Array.from(_AUGlySic);
}
return [];
} catch(_SadlHwMG) {
console.error(`CIDR to range failed for ${cidr}:`, _SadlHwMG);
return [];
}
}
};
function _NWBeAmEd(_IOwKgvxO, _jTrVGKtk) {
const _BctPdBiD = {};
const _ynNIIAge = Object._ynNIIAge(_jTrVGKtk);
const _ekvMeoGl = _ynNIIAge.map(_xtbiKbAc => {
const _PgGgLlFP = _IOwKgvxO * (_jTrVGKtk[_xtbiKbAc] / 100);
return { _xtbiKbAc, _ufeKXIEz: Math.floor(_PgGgLlFP), remainder: _PgGgLlFP - Math.floor(_PgGgLlFP) };
});
let _EMqcpvfh = _ekvMeoGl.reduce((acc, _AdUlisUl) => acc + _AdUlisUl._ufeKXIEz, 0);
_ekvMeoGl.sort((a, b) => b.remainder - a.remainder);
let _fdxCvecF = _IOwKgvxO - _EMqcpvfh;
for (let _ccNBJYvV = 0; _ccNBJYvV < _fdxCvecF; _ccNBJYvV++) {
_ekvMeoGl[_ccNBJYvV % _ekvMeoGl._QesPjbkJ]._ufeKXIEz++;
}
for (const _AdUlisUl of _ekvMeoGl) {
_BctPdBiD[_AdUlisUl._xtbiKbAc] = _AdUlisUl._ufeKXIEz;
}
return _BctPdBiD;
}
async function _eOnknGQi(_XANgtyXx) {
const _EZRVkJkh = _XANgtyXx.DB.prepare("SELECT _FjzeQSAe FROM kv_data WHERE _xtbiKbAc = ?").bind(_YkXwaZqS);
const { _uBqtZcLI } = await _EZRVkJkh.all();
return _uBqtZcLI._QesPjbkJ > 0 ? _uBqtZcLI[0]._FjzeQSAe : null;
}
async function _SkgrVqSb(_XANgtyXx, _nnlVslgS) {
const _EZRVkJkh = _XANgtyXx.DB.prepare(
"INSERT INTO kv_data (_xtbiKbAc, _FjzeQSAe) VALUES (?, ?) ON CONFLICT(_xtbiKbAc) DO UPDATE SET _FjzeQSAe = excluded._FjzeQSAe"
);
await _EZRVkJkh.bind(_YkXwaZqS, _nnlVslgS).run();
}
async function _gCdyaFdU(_unWtLrWv, _XANgtyXx) {
const { _nnlVslgS } = await _unWtLrWv.json();
const _iDYWgmWp = await _eOnknGQi(_XANgtyXx);
if (_iDYWgmWp === _nnlVslgS) {
return _XnwahKxF({ success: true });
}
return _XnwahKxF({ success: false, _rMNQVEWf: '密码错误' }, 401);
}
async function _vGFsrSyA(_unWtLrWv, _XANgtyXx) {
const _baVqYQju = await _soKzAEBm(_XANgtyXx);
if (!_baVqYQju.visitorPassword || !_baVqYQju.visitorPassword._xTaAvhYb) {
return _XnwahKxF({ success: true });
}
try {
const { _nnlVslgS } = await _unWtLrWv.json();
const _WHNDjyBF = _baVqYQju.visitorPassword._nnlVslgS;
if (_WHNDjyBF && _nnlVslgS === _WHNDjyBF) {
return _XnwahKxF({ success: true });
}
return _XnwahKxF({ success: false, _rMNQVEWf: '访客密码错误' }, 401);
} catch (_SadlHwMG) {
return _XnwahKxF({ success: false, _rMNQVEWf: '无效请求' }, 400);
}
}
async function _DlsFgCuE(_unWtLrWv, _XANgtyXx) {
const _NkPCCknE = await _eOnknGQi(_XANgtyXx);
if (_NkPCCknE) {
return _XnwahKxF({ success: false, _rMNQVEWf: "密码已设置,无法重复初始化。" }, 403);
}
const { _nnlVslgS } = await _unWtLrWv.json();
if (!_nnlVslgS || _nnlVslgS._QesPjbkJ < 6) {
return _XnwahKxF({ success: false, _rMNQVEWf: "密码长度不能少于6位。" }, 400);
}
await _SkgrVqSb(_XANgtyXx, _nnlVslgS);
return _XnwahKxF({ success: true, _rMNQVEWf: "初始密码设置成功!请刷新页面并登录。" });
}
async function _mvMzTaBf(_unWtLrWv, _XANgtyXx) {
const { _fnzTOSpq, _ZrHEFnvG } = await _unWtLrWv.json();
const _iDYWgmWp = await _eOnknGQi(_XANgtyXx);
if (_iDYWgmWp !== _fnzTOSpq) {
return _XnwahKxF({ success: false, _rMNQVEWf: "旧密码错误。" }, 403);
}
if (!_ZrHEFnvG || _ZrHEFnvG._QesPjbkJ < 6) {
return _XnwahKxF({ success: false, _rMNQVEWf: "新密码长度不能少于6位。" }, 400);
}
await _SkgrVqSb(_XANgtyXx, _ZrHEFnvG);
return _XnwahKxF({ success: true, _rMNQVEWf: "密码修改成功!" });
}
function _pKFxDfHp() {
return {
theme: 'theme-aurora-glass',
primaryColor: '#00A0FF',
particleColor: '#FFFFFF',
useResolvedDomains: false,
resolvedDomains: '',
sampleSize: 150,
topN: 10,
rttRandomMin: 79,
rttRandomMax: 179,
_uPWvIonq: '',
api: {
_xTaAvhYb: true,
_rMNQVEWf: '维护中...',
},
ispFilter: { _xTaAvhYb: true },
geoLocation: {
retries: 1,
filterUnknown: false,
},
streamer: {
_xTaAvhYb: true
},
websocketStreamer: {
_xTaAvhYb: true,
_MzNfaJoq: 'https://snippets.neib.cn'
},
cloudStorage: {
_xTaAvhYb: true
},
visitorPassword: {
_xTaAvhYb: false,
_nnlVslgS: '',
},
customSubPath: {
_xTaAvhYb: false,
_kBOGxKZb: 'latest',
},
subscriptionId: {
_QesPjbkJ: 8,
_BXalCNft: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'
},
itemLink: {
_xTaAvhYb: true,
template: 'vless://{_jzCHUaST}@{_zAuEMLsy}:{_AWekBocW}?encryption=none&security=tls&sni={_QAfgwnWs}&fp=random&_bBhESgzA=ws&_QAfgwnWs={_QAfgwnWs}&_kBOGxKZb={_kBOGxKZb}#{_ckFbtgjN}',
selectionMode: 'first',
_VRKzpBsE: [
{ _ckFbtgjN: '默认配置', _QAfgwnWs: '', '_jzCHUaST': '3b4d4cd8-cb92-4421-bf86-fb51570fc038', _kBOGxKZb: '/?ed=2560' }
],
_bBKGNGpf: [],
},
dataFeeds: {
universalFallbackAddress: '',
},
announcement: {
popup: {
_xTaAvhYb: false,
_jyjVKQbA: '',
_FFXiMqTd: 5
},
marquee: {
_xTaAvhYb: false,
_jyjVKQbA: ''
}
},
subscriptionUrl: {
prefixEnabled: false,
prefixUrl: '',
suffixEnabled: false,
suffixUrl: ''
},
fineGrained: {
_xTaAvhYb: true,
sources: [
{ _VAZxHmhz: 'CF官方IPV4', _AUGlySic: 'https://raw.githubusercontent.com/5yfx/CF_WEB_IP_Worekrs/refs/heads/main/IPV4', _pAkoNRhV: false, _xTaAvhYb: true, _CSAvOhoQ: 20 },
{ _VAZxHmhz: 'CF官方IPV6', _AUGlySic: 'https://raw.githubusercontent.com/5yfx/CF_WEB_IP_Worekrs/refs/heads/main/IPV6', _pAkoNRhV: false, _xTaAvhYb: true, _CSAvOhoQ: 20 },
{ _VAZxHmhz: '反代优选0', _AUGlySic: 'https://wvs.sosorg.nyc.mn/sub?_jzCHUaST=adb14576-6588-40da-99fd-b9894cd779b0&encryption=none&security=tls&sni=ss.nzvrn.com&_bBhESgzA=ws&_QAfgwnWs=ss.nzvrn.com&_kBOGxKZb=%2Fsnippets%3Fip%3DendpointAddress%3Aport%28443%29%26nat64%3D6to4', _pAkoNRhV: false, _xTaAvhYb: true, _CSAvOhoQ: 30 },
{ _VAZxHmhz: '官方优选1', _AUGlySic: 'https://ipdb.api.030101.xyz/?_bBhESgzA=bestcf&_UWKjCwhu=true', _pAkoNRhV: false, _xTaAvhYb: true, _CSAvOhoQ: 10 },
{ _VAZxHmhz: '反代优选2', _AUGlySic: 'https://ipdb.api.030101.xyz/?_bBhESgzA=bestproxy&_UWKjCwhu=true', _pAkoNRhV: false, _xTaAvhYb: true, _CSAvOhoQ: 5 },
{ _VAZxHmhz: '官方优选2', _AUGlySic: 'https://addressesapi.090227.xyz/_zAuEMLsy.164746.xyz', _pAkoNRhV: false, _xTaAvhYb: true, _CSAvOhoQ: 10 },
{ _VAZxHmhz: '官方优选3', _AUGlySic: 'https://cfxr.eu.org/getSub?_QAfgwnWs=snipaste.huggy.qzz.io', _pAkoNRhV: false, _xTaAvhYb: true, _CSAvOhoQ: 5 },
{ _VAZxHmhz: '官方优选4', _AUGlySic: 'https://addressesapi.090227.xyz/CloudFlareYes', _pAkoNRhV: false, _xTaAvhYb: true, _CSAvOhoQ: 10 }
]
},
customNodes: {
_xTaAvhYb: false,
list: ''
},
texts: {
title: 'Cloudflare IP',
loginButton: '登录',
loginButtonSuccess: '修改参数',
appDownloadTitle: 'APP 下载',
liveTitle: '本次优选结果',
cachedTitle: '上次优选结果',
tableHeader1: '排名',
tableHeader2: 'IP地址',
tableHeader3: '端口',
tableHeader4: '延迟(ms)',
tableHeader5: '归属地',
tableHeader6: '运营商',
tableHeader7: '操作',
pingInProgress: '测试中',
},
colors: {
title: '#FFFFFF',
loginButton: '#E0E0E0',
liveTitle: '#E0E0E0',
cachedTitle: '#E0E0E0',
tableHeader: '#B0B0B0',
},
telegram: {
bot_token: '',
chat_id: '',
},
};
}
function _kMdJyBBK(_yYoOeyvv, _fWOIrCsl) {
if (!_yYoOeyvv) return _fWOIrCsl;
const _HtDhIqVo = { ..._fWOIrCsl };
for (const _xtbiKbAc in _fWOIrCsl) {
if (_yYoOeyvv.hasOwnProperty(_xtbiKbAc)) {
if (typeof _yYoOeyvv[_xtbiKbAc] === 'object' && _yYoOeyvv[_xtbiKbAc] !== null && !Array.isArray(_yYoOeyvv[_xtbiKbAc]) && typeof _fWOIrCsl[_xtbiKbAc] === 'object' && _fWOIrCsl[_xtbiKbAc] !== null && !Array.isArray(_fWOIrCsl[_xtbiKbAc])) {
_HtDhIqVo[_xtbiKbAc] = _kMdJyBBK(_yYoOeyvv[_xtbiKbAc], _fWOIrCsl[_xtbiKbAc]);
} else {
_HtDhIqVo[_xtbiKbAc] = _yYoOeyvv[_xtbiKbAc];
}
}
}
return _HtDhIqVo;
}
async function _soKzAEBm(_XANgtyXx) {
try {
const _EZRVkJkh = _XANgtyXx.DB.prepare("SELECT _FjzeQSAe FROM kv_data WHERE _xtbiKbAc = ?").bind(_YOaQeEol);
const { _uBqtZcLI } = await _EZRVkJkh.all();
const _VLPKFJCk = _uBqtZcLI._QesPjbkJ > 0 ? _uBqtZcLI[0]._FjzeQSAe : null;
const _GsmTHkuP = _VLPKFJCk ? JSON.parse(_VLPKFJCk) : {};
return _kMdJyBBK(_GsmTHkuP, _pKFxDfHp());
} catch (_SadlHwMG) {
console.error("无法从D1获取或解析全局配置:", _SadlHwMG);
return _pKFxDfHp();
}
}
async function _INURypka(_XANgtyXx) {
const _rtoMLCWc = await _soKzAEBm(_XANgtyXx);
return _XnwahKxF(_rtoMLCWc);
}
async function _AXrrVwrD(_unWtLrWv, _XANgtyXx, _QxRifCBi) {
try {
const { _rtoMLCWc, adminPassword } = await _unWtLrWv.json();
const _iDYWgmWp = await _eOnknGQi(_XANgtyXx);
if (_iDYWgmWp !== adminPassword) {
return _XnwahKxF({ success: false, _rMNQVEWf: "管理员密码错误" }, 403);
}
const _EZRVkJkh = _XANgtyXx.DB.prepare(
"INSERT INTO kv_data (_xtbiKbAc, _FjzeQSAe) VALUES (?, ?) ON CONFLICT(_xtbiKbAc) DO UPDATE SET _FjzeQSAe = excluded._FjzeQSAe"
);
const _wtGQcgsm = _EZRVkJkh.bind(_YOaQeEol, JSON.stringify(_rtoMLCWc)).run();
_QxRifCBi.waitUntil(_wtGQcgsm);
return _XnwahKxF({ success: true, _rMNQVEWf: "配置已成功保存!" });
} catch (_SadlHwMG) {
return _XnwahKxF({ success: false, _rMNQVEWf: `保存失败: ${_SadlHwMG._rMNQVEWf}` }, 500);
}
}
async function _ukmKACxO() {
const _HzABiDyi = 'https://www.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1&mkt=zh-CN';
try {
const _tWeFSiFs = await fetch(_HzABiDyi);
const _rTrtjQcC = await _tWeFSiFs.json();
const _sRnAHZxJ = 'https://www.bing.com' + _rTrtjQcC.images[0]._MzNfaJoq;
return fetch(_sRnAHZxJ);
} catch (_SadlHwMG) {
return new Response('获取壁纸失败', { status: 502 });
}
}
async function _ifEsSyef(_zAuEMLsy) {
try {
const _CNKyhQXn = await fetch(`http://_zAuEMLsy-api.com/json/${_zAuEMLsy}?fields=status,_UWKjCwhu,countryCode,_XrXMgXRI&lang=zh-CN`);
if (_CNKyhQXn.ok) {
const _gCtLTBwD = await _CNKyhQXn.json();
if (_gCtLTBwD.status === 'success' && (_gCtLTBwD.countryCode || _gCtLTBwD._UWKjCwhu)) {
let _XrXMgXRI = _gCtLTBwD._XrXMgXRI || '未知';
if (_XrXMgXRI.toLowerCase().includes('cloudflare')) {
_XrXMgXRI = 'CloudFlare';
}
return {
_VAZxHmhz: _znBMqhPv[_gCtLTBwD.countryCode] || _gCtLTBwD._UWKjCwhu || _gCtLTBwD.countryCode,
_XrXMgXRI: _XrXMgXRI
};
}
}
} catch (_SadlHwMG) {}
try {
const _CNKyhQXn = await fetch(`https://api._zAuEMLsy.sb/geoip/${_zAuEMLsy}`);
if (_CNKyhQXn.ok) {
const _gCtLTBwD = await _CNKyhQXn.json();
if (_gCtLTBwD.country_code || _gCtLTBwD._UWKjCwhu) {
let _XrXMgXRI = _gCtLTBwD._XrXMgXRI || '未知';
if (_XrXMgXRI.toLowerCase().includes('cloudflare')) {
_XrXMgXRI = 'CloudFlare';
}
return {
_VAZxHmhz: _znBMqhPv[_gCtLTBwD.country_code] || _gCtLTBwD._UWKjCwhu || _gCtLTBwD.country_code,
_XrXMgXRI: _XrXMgXRI
};
}
}
} catch (_SadlHwMG) {}
return { _VAZxHmhz: '未知', _XrXMgXRI: '未知' };
}
async function _mZobfEvp(_unWtLrWv, _XANgtyXx) {
try {
const { _AUGlySic } = await _unWtLrWv.json();
if (!Array.isArray(_AUGlySic)) {
return _XnwahKxF({ error: "输入无效,需要一个IP数组。" }, 400);
}
const _SLBMxpkd = _AUGlySic.map(_zAuEMLsy => _ifEsSyef(_zAuEMLsy).then(_LFHzjGIb => ({ _zAuEMLsy, ..._LFHzjGIb })));
const _uBqtZcLI = await Promise.all(_SLBMxpkd);
return _XnwahKxF(_uBqtZcLI);
} catch (_SadlHwMG) {
return _XnwahKxF({ error: `获取地理位置失败: ${_SadlHwMG._rMNQVEWf}` }, 500);
}
}
async function _FsGaXnNt(_unWtLrWv, _XANgtyXx) {
const _rtoMLCWc = await _soKzAEBm(_XANgtyXx);
if (!_rtoMLCWc.cloudStorage._xTaAvhYb) {
return _XnwahKxF({ _uBqtZcLI: [], generatedBy: null });
}
try {
const _EZRVkJkh = _XANgtyXx.DB.prepare("SELECT _FjzeQSAe FROM kv_data WHERE _xtbiKbAc = ?").bind(_sTEsIdky);
const { _uBqtZcLI } = await _EZRVkJkh.all();
const _UkkQZHVC = _uBqtZcLI._QesPjbkJ > 0 ? _uBqtZcLI[0]._FjzeQSAe : null;
const _bQzETLqH = _UkkQZHVC ? JSON.parse(_UkkQZHVC) : null;
return _XnwahKxF(_bQzETLqH || { _uBqtZcLI: [], generatedBy: null });
} catch (_SadlHwMG) {
console.error("从D1读取缓存IP失败:", _SadlHwMG);
return _XnwahKxF({ _uBqtZcLI: [], generatedBy: null });
}
}
async function _uUJzEIeS(_unWtLrWv, _XANgtyXx, _QxRifCBi) {
const _rtoMLCWc = await _soKzAEBm(_XANgtyXx);
if (!_rtoMLCWc.cloudStorage._xTaAvhYb) {
return _XnwahKxF({ success: true, _rMNQVEWf: "云端存储已禁用,不保存结果。" });
}
const _AXvvhUpm = _unWtLrWv._DadfZrLA.get('CF-Connecting-IP') || "未知IP";
const _UWKjCwhu = _unWtLrWv.cf?._UWKjCwhu || "未知";
const _sBAnUVNo = _unWtLrWv.cf?._sBAnUVNo || "";
let _yBGbbchZ = _znBMqhPv[_UWKjCwhu] || _UWKjCwhu;
if (_sBAnUVNo && _sBAnUVNo !== "未知城市" && _sBAnUVNo !== _UWKjCwhu) _yBGbbchZ = `${_yBGbbchZ} ${_znBMqhPv[_sBAnUVNo] || _sBAnUVNo}`;
const _UMWMXAwf = {
_zAuEMLsy: _nvlzNtjw(_AXvvhUpm),
_VAZxHmhz: _yBGbbchZ.trim(),
time: _jYSLbNax()
};
try {
const _gyBZnOMk = await _unWtLrWv.json();
if (!Array.isArray(_gyBZnOMk)) return _XnwahKxF({ error: "无效数据格式" }, 400);
const _YTxjJsoD = _gyBZnOMk.map(_ETdGKdNw => ({
_zAuEMLsy: String(_ETdGKdNw._zAuEMLsy || ''),
_AWekBocW: _ETdGKdNw._AWekBocW ? parseInt(_ETdGKdNw._AWekBocW, 10) : undefined,
_UMlobzDs: parseInt(_ETdGKdNw._UMlobzDs, 10),
_VAZxHmhz: typeof _ETdGKdNw._VAZxHmhz === 'string' ? _ETdGKdNw._VAZxHmhz.substring(0, 50) : 'N/A',
_XrXMgXRI: typeof _ETdGKdNw._XrXMgXRI === 'string' ? _ETdGKdNw._XrXMgXRI.substring(0, 100) : 'N/A'
}));
const _IsUXpHpz = {
generatedBy: _UMWMXAwf,
_uBqtZcLI: _YTxjJsoD
};
const _jvcttMpN = _XANgtyXx.DB.prepare(
"INSERT INTO kv_data (_xtbiKbAc, _FjzeQSAe) VALUES (?, ?) ON CONFLICT(_xtbiKbAc) DO UPDATE SET _FjzeQSAe = excluded._FjzeQSAe"
).bind(_sTEsIdky, JSON.stringify(_IsUXpHpz)).run();
if (_rtoMLCWc.telegram.bot_token && _rtoMLCWc.telegram.chat_id) {
const _qEOivTZi = _YTxjJsoD.map(r => `${r._zAuEMLsy} ~ ${r._VAZxHmhz}`).join('\n');
const _PmlduwVw = `优选完成!\n来源: ${_UMWMXAwf._zAuEMLsy} (${_UMWMXAwf._VAZxHmhz})\n时间: ${_UMWMXAwf.time}\n\n结果:\n${_qEOivTZi}`;
const _unDOHtLi = `https://api.telegram.org/bot${_rtoMLCWc.telegram.bot_token}/sendMessage?chat_id=${_rtoMLCWc.telegram.chat_id}&_jyjVKQbA=${encodeURIComponent(_PmlduwVw)}`;
const _XCJtSpza = fetch(_unDOHtLi).catch(_SadlHwMG => console.error("Telegram结果通知失败:", _SadlHwMG));
_QxRifCBi.waitUntil(Promise.all([_jvcttMpN, _XCJtSpza]));
} else {
_QxRifCBi.waitUntil(_jvcttMpN);
}
return _XnwahKxF({ success: true, _rMNQVEWf: "结果已保存" });
} catch (_SadlHwMG) {
return _XnwahKxF({ error: "D1写入失败", _rMNQVEWf: _SadlHwMG._rMNQVEWf }, 500);
}
}
async function _qDsjjrmz(_unWtLrWv, _XANgtyXx, _QxRifCBi) {
try {
const _rHkeokwd = await _unWtLrWv.json();
if (!Array.isArray(_rHkeokwd)) return _XnwahKxF({ error: "无效数据格式" }, 400);
const _IsUXpHpz = {
_uBqtZcLI: _rHkeokwd
};
const _EZRVkJkh = _XANgtyXx.DB.prepare(
"INSERT INTO kv_data (_xtbiKbAc, _FjzeQSAe) VALUES (?, ?) ON CONFLICT(_xtbiKbAc) DO UPDATE SET _FjzeQSAe = excluded._FjzeQSAe"
);
const _wtGQcgsm = _EZRVkJkh.bind(_ZRujubAc, JSON.stringify(_IsUXpHpz)).run();
_QxRifCBi.waitUntil(_wtGQcgsm);
return _XnwahKxF({ success: true });
} catch (_SadlHwMG) {
return _XnwahKxF({ error: "D1写入临时缓存失败", _rMNQVEWf: _SadlHwMG._rMNQVEWf }, 500);
}
}
function _TeNmDUNB(_QesPjbkJ, _BXalCNft) {
let _KYJgvwFB = '';
const _lMOpkSGg = _BXalCNft._QesPjbkJ;
for (let _ccNBJYvV = 0; _ccNBJYvV < _QesPjbkJ; _ccNBJYvV++) {
_KYJgvwFB += _BXalCNft.charAt(Math.floor(Math.random() * _lMOpkSGg));
}
return _KYJgvwFB;
}
async function _xjKfkZJl(_unWtLrWv, _XANgtyXx) {
try {
const _gyBZnOMk = await _unWtLrWv.json();
if (!Array.isArray(_gyBZnOMk) || _gyBZnOMk._QesPjbkJ === 0) {
return _XnwahKxF({ error: "无效或空的IP列表" }, 400);
}
const _rtoMLCWc = await _soKzAEBm(_XANgtyXx);
const _niEttuVe = _rtoMLCWc.subscriptionId || { _QesPjbkJ: 8, _BXalCNft: 'abcdefghijklmnopqrstuvwxyz0123456789' };
let _yOkwdbnF;
let _ogTCNESR = false;
let _aQdzfJsp = 0;
const _ttNjvBAa = 10;
while (!_ogTCNESR && _aQdzfJsp < _ttNjvBAa) {
_yOkwdbnF = _TeNmDUNB(_niEttuVe._QesPjbkJ, _niEttuVe._BXalCNft);
const { _uBqtZcLI } = await _XANgtyXx.DB.prepare("SELECT _xWYJSzae FROM optimized_results WHERE _xWYJSzae = ?").bind(_yOkwdbnF).all();
if (_uBqtZcLI._QesPjbkJ === 0) {
_ogTCNESR = true;
}
_aQdzfJsp++;
}
if (!_ogTCNESR) {
return _XnwahKxF({ error: "无法生成唯一的订阅ID,请稍后重试或调整ID设置。" }, 500);
}
const _NMvxanMf = JSON.stringify({ _AUGlySic: _gyBZnOMk });
await _XANgtyXx.DB.prepare(
"INSERT INTO optimized_results (_xWYJSzae, _gCtLTBwD) VALUES (?, ?)"
).bind(_yOkwdbnF, _NMvxanMf).run();
await _XANgtyXx.DB.prepare(
"INSERT INTO kv_data (_xtbiKbAc, _FjzeQSAe) VALUES (?, ?) ON CONFLICT(_xtbiKbAc) DO UPDATE SET _FjzeQSAe = excluded._FjzeQSAe"
).bind(_WjhmdMXu, _yOkwdbnF).run();
return _XnwahKxF({ success: true, _xWYJSzae: _yOkwdbnF });
} catch (_SadlHwMG) {
return _XnwahKxF({ error: "保存优选结果失败", _rMNQVEWf: _SadlHwMG._rMNQVEWf }, 500);
}
}
async function _IVTddehG(_unWtLrWv, _XANgtyXx) {
try {
const _yOkwdbnF = _unWtLrWv._CKagJuvR._xWYJSzae;
if (!_yOkwdbnF) {
return new Response("缺少结果ID", { status: 400 });
}
const _KYJgvwFB = await _XANgtyXx.DB.prepare("SELECT _gCtLTBwD FROM optimized_results WHERE _xWYJSzae = ?").bind(_yOkwdbnF).first();
if (!_KYJgvwFB) {
return new Response("未找到对应的优选结果", { status: 404 });
}
const _gCtLTBwD = JSON.parse(_KYJgvwFB._gCtLTBwD);
let _qEOivTZi = _gCtLTBwD._AUGlySic;
const _rtoMLCWc = await _soKzAEBm(_XANgtyXx);
if (_rtoMLCWc.customNodes && _rtoMLCWc.customNodes._xTaAvhYb && _rtoMLCWc.customNodes.list) {
const _FeAOvpjU = _rtoMLCWc.customNodes.list.trim().split(/\s+/).filter(Boolean);
const _RrzDZPVy = _FeAOvpjU.map(_jNUIdcAu => {
let _JxAbVIsI = _jNUIdcAu;
let _AWekBocW = undefined;
let _ckFbtgjN = null;
if (_JxAbVIsI.includes('@')) {
const _ekvMeoGl = _JxAbVIsI.split('@');
_ckFbtgjN = _ekvMeoGl.pop();
_JxAbVIsI = _ekvMeoGl.join('@');
}
if (_JxAbVIsI.includes('#')) {
const _ekvMeoGl = _JxAbVIsI.split('#');
const _SceRflBN = _ekvMeoGl.pop();
if (!isNaN(_SceRflBN) && _SceRflBN.trim() !== '') {
_AWekBocW = parseInt(_SceRflBN, 10);
}
_JxAbVIsI = _ekvMeoGl.join('#');
}
return {
_zAuEMLsy: _JxAbVIsI,
_AWekBocW: _AWekBocW,
_VAZxHmhz: _ckFbtgjN || _JxAbVIsI,
_XrXMgXRI: '自定义'
};
});
_qEOivTZi.unshift(..._RrzDZPVy);
}
const { itemLink } = _rtoMLCWc;
const _kDCmtEMk = new URL(_unWtLrWv._MzNfaJoq)._lZjYBycT;
let _pLloicgJ;
if (_rtoMLCWc.websocketStreamer && _rtoMLCWc.websocketStreamer._xTaAvhYb) {
if (!itemLink || !itemLink._xTaAvhYb || !itemLink._VRKzpBsE || itemLink._VRKzpBsE._QesPjbkJ === 0) {
return new Response("节点链接参数未配置或未启用 (反代模式)", { status: 500 });
}
_pLloicgJ = _qEOivTZi.map((_ETdGKdNw, _ufQpLglS) => {
let _ckFbtgjN;
if (_ETdGKdNw._XrXMgXRI === '自定义') {
_ckFbtgjN = `${_ufQpLglS + 1} - ${_ETdGKdNw._VAZxHmhz}`;
} else {
_ckFbtgjN = `${_ufQpLglS + 1} - ${_ETdGKdNw._VAZxHmhz || '未知'}`;
if (!_ETdGKdNw._XrXMgXRI || !_ETdGKdNw._XrXMgXRI.toLowerCase().includes('cloudflare')) {
_ckFbtgjN += '(反代)';
}
}
const _wmwBhkVB = _KGeEehhb.isIPv6(_ETdGKdNw._zAuEMLsy) ? `[${_ETdGKdNw._zAuEMLsy}]` : _ETdGKdNw._zAuEMLsy;
const _AWekBocW = _ETdGKdNw._AWekBocW || 443;
const _iOTwuSzy = itemLink._VRKzpBsE[0];
const _qgFykIjN = _iOTwuSzy._jzCHUaST || '';
const _jzCHUaST = (_qgFykIjN && _rrFYLNQl(_qgFykIjN)) ? _qgFykIjN : crypto.randomUUID();
const _kBOGxKZb = '/snippets?_zAuEMLsy=endpointAddress:_AWekBocW(443)&nat64=6to4';
const _QAfgwnWs = _iOTwuSzy._QAfgwnWs || _kDCmtEMk;
const _CKagJuvR = new URLSearchParams({
security: 'tls',
_bBhESgzA: 'ws',
_QAfgwnWs: _QAfgwnWs,
sni: _QAfgwnWs,
fp: 'random'
});
return `vless://${_jzCHUaST}@${_wmwBhkVB}:${_AWekBocW}?${_CKagJuvR.toString()}&_kBOGxKZb=${encodeURIComponent(encodeURIComponent(_kBOGxKZb))}#${encodeURIComponent(_ckFbtgjN)}`;
});
} else {
if (!itemLink || !itemLink._xTaAvhYb || !itemLink._VRKzpBsE || itemLink._VRKzpBsE._QesPjbkJ === 0) {
return new Response("节点链接参数未配置或未启用", { status: 500 });
}
const _iOTwuSzy = itemLink._VRKzpBsE[0];
const { _QAfgwnWs, _jzCHUaST, _kBOGxKZb } = _iOTwuSzy;
_pLloicgJ = _qEOivTZi.map((_ETdGKdNw, _ufQpLglS) => {
let _ckFbtgjN;
if (_ETdGKdNw._XrXMgXRI === '自定义') {
_ckFbtgjN = `${_ufQpLglS + 1} - ${_ETdGKdNw._VAZxHmhz}`;
} else {
_ckFbtgjN = `${_ufQpLglS + 1} - ${_ETdGKdNw._VAZxHmhz || '未知'}`;
if (!_ETdGKdNw._XrXMgXRI || !_ETdGKdNw._XrXMgXRI.toLowerCase().includes('cloudflare')) {
_ckFbtgjN += '(反代)';
}
}
const _wmwBhkVB = _KGeEehhb.isIPv6(_ETdGKdNw._zAuEMLsy) ? `[${_ETdGKdNw._zAuEMLsy}]` : _ETdGKdNw._zAuEMLsy;
const _AWekBocW = _ETdGKdNw._AWekBocW || 443;
const _CKagJuvR = new URLSearchParams({
security: 'tls',
_bBhESgzA: 'ws',
_QAfgwnWs: _QAfgwnWs || _kDCmtEMk,
sni: _QAfgwnWs || _kDCmtEMk,
fp: 'random'
});
return `vless://${_jzCHUaST}@${_wmwBhkVB}:${_AWekBocW}?${_CKagJuvR.toString()}&_kBOGxKZb=${encodeURIComponent(encodeURIComponent(_kBOGxKZb || ''))}#${encodeURIComponent(_ckFbtgjN)}`;
});
}
const _ZeUMsYVD = _pLloicgJ.join('\n');
const _hUvOzOoV = btoa(_ZeUMsYVD);
return new Response(_hUvOzOoV, {
_DadfZrLA: { 'Content-Type': '_jyjVKQbA/plain; _BXalCNft=utf-8' }
});
} catch (_SadlHwMG) {
return new Response(`生成节点列表失败: ${_SadlHwMG._rMNQVEWf}`, { status: 500 });
}
}
async function _JISlbuOn(_unWtLrWv) {
try {
const { _UUiBvAcs, _bBhESgzA } = await _unWtLrWv.json();
if (!Array.isArray(_UUiBvAcs)) {
return new Response('Invalid _UUiBvAcs list', { status: 400 });
}
const _LYWFnjSR = _UUiBvAcs.map(domain => {
if (!domain.trim()) return Promise.resolve([]);
const _MzNfaJoq = `https://cloudflare-dns.com/dns-query?_ckFbtgjN=${encodeURIComponent(domain.trim())}&_bBhESgzA=${_bBhESgzA || 'A'}`;
return fetch(_MzNfaJoq, { _DadfZrLA: { 'Accept': 'application/dns-json' } })
.then(_CNKyhQXn => _CNKyhQXn.json())
.then(_gCtLTBwD => (_gCtLTBwD.Answer ? _gCtLTBwD.Answer.map(a => a._gCtLTBwD) : []))
.catch(() => []);
});
const _CNgOGgNs = (await Promise.all(_LYWFnjSR)).flat();
const _yqrvftVI = [...new Set(_CNgOGgNs)];
if (_yqrvftVI._QesPjbkJ === 0) {
return new Response('无法从域名解析出任何IP。', { status: 500 });
}
return new Response(_yqrvftVI.join('\n'), { _DadfZrLA: { 'Content-Type': '_jyjVKQbA/plain; _BXalCNft=utf-8' } });
} catch (err) {
return new Response(`域名解析错误: ${err._rMNQVEWf}`, { status: 500 });
}
}
async function _GdbbCCmj(_unWtLrWv, _XANgtyXx) {
try {
const { _oKVqZdie } = await _unWtLrWv.json();
if (!Array.isArray(_oKVqZdie)) {
return _XnwahKxF({ error: "Invalid input, expected an object with a '_oKVqZdie' array." }, 400);
}
const _CobABRSe = new Set();
const _lfPMbayB = _oKVqZdie.map(_MzNfaJoq =>
_ZwtiuoBJ(_MzNfaJoq)
.then(_jyjVKQbA => {
if (!_jyjVKQbA) return;
const _dGuhnilE = _jyjVKQbA.split(/[\s,;|]+/);
for (const _CohuWOzJ of _dGuhnilE) {
const _pMJgIoEx = _CohuWOzJ.trim();
if (_pMJgIoEx) {
_CobABRSe.add(_pMJgIoEx);
}
}
})
.catch(err => {
console.error(`Error processing URL ${_MzNfaJoq}:`, err);
})
);
await Promise.all(_lfPMbayB);
return _XnwahKxF({ _AUGlySic: Array.from(_CobABRSe) });
} catch (_SadlHwMG) {
return _XnwahKxF({ error: `Failed to process URLs: ${_SadlHwMG._rMNQVEWf}` }, 500);
}
}
async function _jMRsBhXB(_unWtLrWv, _XANgtyXx) {
const _rtoMLCWc = await _soKzAEBm(_XANgtyXx);
if (!_rtoMLCWc.api._xTaAvhYb) {
return new Response(_rtoMLCWc.api._rMNQVEWf || 'API is disabled.', { status: 503 });
}
try {
const _EZRVkJkh = _XANgtyXx.DB.prepare("SELECT _FjzeQSAe FROM kv_data WHERE _xtbiKbAc = ?").bind(_sTEsIdky);
const { _uBqtZcLI: dbResults } = await _EZRVkJkh.all();
const _UkkQZHVC = dbResults._QesPjbkJ > 0 ? dbResults[0]._FjzeQSAe : null;
const _bQzETLqH = _UkkQZHVC ? JSON.parse(_UkkQZHVC) : null;
if (!_bQzETLqH || !_bQzETLqH._uBqtZcLI || _bQzETLqH._uBqtZcLI._QesPjbkJ === 0) {
return new Response("上次优选结果为空。", {
status: 404,
_DadfZrLA: { 'Content-Type': '_jyjVKQbA/plain; _BXalCNft=utf-8' },
});
}
const _AUGlySic = _bQzETLqH._uBqtZcLI.map(r => r._zAuEMLsy);
return new Response(_AUGlySic.join('\n'), {
_DadfZrLA: { 'Content-Type': '_jyjVKQbA/plain; _BXalCNft=utf-8' },
});
} catch (_SadlHwMG) {
console.error("API /_zAuEMLsy 处理错误:", _SadlHwMG);
return new Response(`API处理时出错: ${_SadlHwMG._rMNQVEWf}`, { status: 500 });
}
}
function _yPkesejd(_KYJgvwFB, _ufQpLglS, _rtoMLCWc, _kDCmtEMk) {
const { itemLink } = _rtoMLCWc;
if (!itemLink || !itemLink._xTaAvhYb) return null;
const { template, _VRKzpBsE, selectionMode, _bBKGNGpf } = itemLink;
if (!_VRKzpBsE || _VRKzpBsE._QesPjbkJ === 0) return null;
let _LzHuHPzX;
if (selectionMode === 'random') {
_LzHuHPzX = _VRKzpBsE[_ufQpLglS % _VRKzpBsE._QesPjbkJ];
} else if (selectionMode === 'first') {
_LzHuHPzX = _VRKzpBsE[0];
} else {
_LzHuHPzX = _VRKzpBsE.find(s => s._ckFbtgjN === selectionMode) || _VRKzpBsE[0];
}
if (!_LzHuHPzX) return null;
let _xDgbFEUa = template;
const _mHmEbsVl = _KYJgvwFB._AWekBocW || 443;
const _MWHucuDn = _KGeEehhb.isIPv6(_KYJgvwFB._zAuEMLsy) ? `[${_KYJgvwFB._zAuEMLsy}]` : _KYJgvwFB._zAuEMLsy;
let _ckFbtgjN = `${_ufQpLglS + 1} 、 ${_KYJgvwFB._VAZxHmhz || '未知'}`;
if (!_KYJgvwFB._XrXMgXRI || !_KYJgvwFB._XrXMgXRI.toLowerCase().includes('cloudflare')) {
_ckFbtgjN += '(反代)';
}
let _QAfgwnWs = _LzHuHPzX._QAfgwnWs || _kDCmtEMk;
_xDgbFEUa = _xDgbFEUa.replace(/{_zAuEMLsy}/g, _MWHucuDn)
.replace(/{_AWekBocW}/g, _mHmEbsVl)
.replace(/{_ckFbtgjN}/g, encodeURIComponent(_ckFbtgjN))
.replace(/{rank}/g, _ufQpLglS + 1)
.replace(/{_VAZxHmhz}/g, encodeURIComponent(_KYJgvwFB._VAZxHmhz || '未知'))
.replace(/{_XrXMgXRI}/g, encodeURIComponent(_KYJgvwFB._XrXMgXRI || '未知'))
.replace(/{_QAfgwnWs}/g, encodeURIComponent(_QAfgwnWs))
.replace(/{_jzCHUaST}/g, encodeURIComponent(_LzHuHPzX['_jzCHUaST'] || ''))
.replace(/{_kBOGxKZb}/g, encodeURIComponent(encodeURIComponent(_LzHuHPzX._kBOGxKZb || '')));
if (_bBKGNGpf) {
_bBKGNGpf.forEach(field => {
const _obolMVVG = new RegExp('{' + field._ckFbtgjN + '}', 'g');
_xDgbFEUa = _xDgbFEUa.replace(_obolMVVG, encodeURIComponent(field._FjzeQSAe));
});
}
return _xDgbFEUa;
}
async function _ewpdHRdx(_unWtLrWv, _XANgtyXx) {
const _rtoMLCWc = await _soKzAEBm(_XANgtyXx);
if (!_rtoMLCWc.itemLink._xTaAvhYb) {
return new Response("Item _xDgbFEUa feature is disabled.", { status: 503, _DadfZrLA: { 'Content-Type': '_jyjVKQbA/plain; _BXalCNft=utf-8' } });
}
try {
const _EZRVkJkh = _XANgtyXx.DB.prepare("SELECT _FjzeQSAe FROM kv_data WHERE _xtbiKbAc = ?").bind(_sTEsIdky);
const { _uBqtZcLI: dbResults } = await _EZRVkJkh.all();
const _UkkQZHVC = dbResults._QesPjbkJ > 0 ? dbResults[0]._FjzeQSAe : null;
const _bQzETLqH = _UkkQZHVC ? JSON.parse(_UkkQZHVC) : null;
if (!_bQzETLqH || !_bQzETLqH._uBqtZcLI || _bQzETLqH._uBqtZcLI._QesPjbkJ === 0) {
return new Response("No optimized IPs available to generate endpoints.", {
status: 404,
_DadfZrLA: { 'Content-Type': '_jyjVKQbA/plain; _BXalCNft=utf-8' },
});
}
const _kDCmtEMk = new URL(_unWtLrWv._MzNfaJoq)._lZjYBycT;
const _erxufOjS = _bQzETLqH._uBqtZcLI.map((_KYJgvwFB, _ufQpLglS) => {
return _yPkesejd(_KYJgvwFB, _ufQpLglS, _rtoMLCWc, _kDCmtEMk);
}).filter(Boolean);
if (_erxufOjS._QesPjbkJ === 0) {
return new Response("Could not generate any _ETdGKdNw links from the available IPs.", {
status: 500,
_DadfZrLA: { 'Content-Type': '_jyjVKQbA/plain; _BXalCNft=utf-8' },
});
}
return new Response(_erxufOjS.join('\n'), {
_DadfZrLA: { 'Content-Type': '_jyjVKQbA/plain; _BXalCNft=utf-8' },
});
} catch (_SadlHwMG) {
console.error("API /api/endpoints error:", _SadlHwMG);
return new Response(`Error processing API _unWtLrWv: ${_SadlHwMG._rMNQVEWf}`, { status: 500 });
}
}
async function _xGOrEvhq(_unWtLrWv, _XANgtyXx, _QxRifCBi) {
const _AXvvhUpm = _unWtLrWv._DadfZrLA.get('CF-Connecting-IP') || "未知IP";
const [
_PcntgNKu,
_cRgrEcpn,
defaultDomains,
fetchedCountryMap
] = await Promise.all([
_PoqmnMPR(_RgnbpyZx, _qDSJwBNT, []),
_PoqmnMPR(_pQXTowzV, _qDSJwBNT, []),
_PoqmnMPR(_LMmxrgMM, _MugnnPPh, []),
_PoqmnMPR(_csoZScdh, _ysebiiPW, { "N/A": "未知" })
]);
_znBMqhPv = fetchedCountryMap;
let _hKdjYWeo = false;
let _baVqYQju;
try {
const _nnlVslgS = await _eOnknGQi(_XANgtyXx);
_hKdjYWeo = !!_nnlVslgS;
_baVqYQju = await _soKzAEBm(_XANgtyXx);
} catch (_SadlHwMG) {
if (_SadlHwMG._rMNQVEWf && _SadlHwMG._rMNQVEWf.includes('no such table')) {
console.log("检测到 'kv_data' 表不存在,正在自动创建...");
try {
const _CrVJZwIp = "CREATE TABLE IF NOT EXISTS kv_data (_xtbiKbAc TEXT PRIMARY KEY, _FjzeQSAe TEXT); CREATE TABLE IF NOT EXISTS optimized_results (_xWYJSzae TEXT PRIMARY KEY, _gCtLTBwD TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP);";
await _XANgtyXx.DB.exec(_CrVJZwIp);
console.log("数据表创建成功。");
_hKdjYWeo = false;
_baVqYQju = _pKFxDfHp();
} catch (dbError) {
console.error("自动创建数据表失败:", dbError);
return new Response(`数据库初始化失败: ${dbError._rMNQVEWf}`, {
status: 500,
_DadfZrLA: { 'Content-Type': '_jyjVKQbA/html;_BXalCNft=UTF-8' }
});
}
} else {
let _xFpCLoYg = _tYzmsrfc(_SadlHwMG._rMNQVEWf);
return new Response(_xFpCLoYg, { _DadfZrLA: { 'Content-Type': '_jyjVKQbA/html;_BXalCNft=UTF-8' } });
}
}
if (_baVqYQju.telegram.bot_token && _baVqYQju.telegram.chat_id) {
const _UWKjCwhu = _unWtLrWv.cf?._UWKjCwhu || "未知";
const _sBAnUVNo = _unWtLrWv.cf?._sBAnUVNo || "";
let _yBGbbchZ = _znBMqhPv[_UWKjCwhu] || _UWKjCwhu;
if (_sBAnUVNo && _sBAnUVNo !== "未知城市" && _sBAnUVNo !== _UWKjCwhu) _yBGbbchZ = `${_yBGbbchZ} ${_znBMqhPv[_sBAnUVNo] || _sBAnUVNo}`;
const _xlvXMThc = _jYSLbNax();
const _HhFxDWql = _unWtLrWv._MzNfaJoq;
const _PmlduwVw = `访客: ${_AXvvhUpm}\n位置: ${_yBGbbchZ.trim()}\n时间: ${_xlvXMThc}\n来自:${_HhFxDWql}`;
const _unDOHtLi = `https://api.telegram.org/bot${_baVqYQju.telegram.bot_token}/sendMessage?chat_id=${_baVqYQju.telegram.chat_id}&_jyjVKQbA=${encodeURIComponent(_PmlduwVw)}`;
_QxRifCBi.waitUntil(fetch(_unDOHtLi).catch(_SadlHwMG => console.error("Telegram通知失败:", _SadlHwMG)));
}
let _oCZXoNob = _PLabVHPo();
const _pyRNsMxr = {
_rtoMLCWc: _baVqYQju,
status: {
_hKdjYWeo: _hKdjYWeo,
}
};
_oCZXoNob = _oCZXoNob.replace('__PAGE_DATA_JSON__', JSON.stringify(_pyRNsMxr));
_oCZXoNob = _oCZXoNob.replace('__ALL_CF_CIDR_LIST_JSON__', JSON.stringify(_PcntgNKu));
_oCZXoNob = _oCZXoNob.replace('__BALANCED_CF_CIDR_LIST_JSON__', JSON.stringify(_cRgrEcpn));
_oCZXoNob = _oCZXoNob.replace('__DEFAULT_DOMAINS_LIST_JSON__', JSON.stringify(defaultDomains));
_oCZXoNob = _oCZXoNob.replace('__COUNTRY_MAP_JSON__', JSON.stringify(_znBMqhPv));
return new Response(_oCZXoNob, {
_DadfZrLA: { 'Content-Type': '_jyjVKQbA/html;_BXalCNft=UTF-8' },
});
}
function _XnwahKxF(_SqQMpqgf, status = 200, _DadfZrLA = {}) {
return new Response(JSON.stringify(_SqQMpqgf), {
status,
_DadfZrLA: { 'Content-Type': 'application/json;_BXalCNft=UTF-8', ..._DadfZrLA }
});
}
function _jYSLbNax(date = new Date()) {
return new Intl.DateTimeFormat('zh-CN', {
timeZone: 'Asia/Shanghai',
year: 'numeric', month: '2-digit', day: '2-digit',
hour: '2-digit', minute: '2-digit', second: '2-digit',
hour12: false
}).format(date);
}
function _nvlzNtjw(_zAuEMLsy) {
if (!_zAuEMLsy || typeof _zAuEMLsy !== 'string') return "无效IP";
if(_KGeEehhb.isIPv4(_zAuEMLsy)){
const _ekvMeoGl = _zAuEMLsy.split('.');
if (_ekvMeoGl._QesPjbkJ === 4) return `${_ekvMeoGl[0]}.*.*.${_ekvMeoGl[3]}`;
}
if(_KGeEehhb.isIPv6(_zAuEMLsy)){
const _ekvMeoGl = _zAuEMLsy.split(':');
if (_ekvMeoGl._QesPjbkJ > 2) return `${_ekvMeoGl[0]}:...:${_ekvMeoGl[_ekvMeoGl._QesPjbkJ - 1]}`;
}
return _zAuEMLsy;
}
function _tYzmsrfc(_kMHbEtyc) {
return `
<!DOCTYPE html><html lang="zh-CN"><head><meta _BXalCNft="UTF-8"><title>需要设置</title>
<_PBInxfwO>
_SqQMpqgf { font-family: sans-serif; background: #1a1a1a; _JXqLrphm: #e0e0e0; display: flex; justify-_TaQXZoLv: center; align-items: center; height: 100vh; margin: 0; }
._QcWGMwDA { max-_IqvxpuUK: 800px; padding: 2rem; background: #25282e; border: 1px solid #4044c; border-radius: 8px; box-shadow: 0 5px 15px rgba(0,0,0,0.3); }
h1 { _JXqLrphm: #00a0ff; border-bottom: 1px solid #40444c; padding-bottom: 0.5rem; }
p { line-height: 1.6; }
code { background: #1a1a1a; padding: 0.2em 0.4em; border-radius: 4px; font-family: monospace; white-space: pre-wrap; word-break: break-all; }
.error { _JXqLrphm: #da3633; background: rgba(218, 54, 51, 0.1); padding: 0.5rem; border-radius: 4px; margin-_HBaoejQW: 1rem; }
</_PBInxfwO>
</head><_SqQMpqgf>
<div class="_QcWGMwDA">
<h1>部署指南</h1>
<p>系统检测到 D1 数据库绑定存在问题。请确保您已完成以下步骤:</p>
<ol>
<li>进入 Cloudflare Dashbord -> Workers & Pages -> D1。</li>
<li>创建一个新的D1数据库 (如果还没有)。</li>
<li>将此数据库绑定到您的Worker:
<ul>
<li>进入Worker设置 -> 变量 -> D1数据库绑定。</li>
<li>变量名必须填写 <code>DB</code>。</li>
<li>选择您刚创建的数据库。</li>
<li>点击“保存并部署”。</li>
</ul>
</li>
</ol>
<p>完成以上步骤后,请刷新本页面。系统会自动为您创建所需的数据表。</p>
${_kMHbEtyc ? `<div class="error"><strong>当前错误信息:</strong> ${_kMHbEtyc.replace(/</g, "<").replace(/>/g, ">")}</div>` : ''}
</div>
</_SqQMpqgf></html>`;
}
function _PLabVHPo() {
return `
<!DOCTYPE html><html lang="zh-CN"><head> <meta _BXalCNft="UTF-8"> <meta _ckFbtgjN="viewport" _TaQXZoLv="_IqvxpuUK=device-_IqvxpuUK, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"> <title>Cloudflare IP</title> <_xDgbFEUa href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Noto+Sans+SC:wght@400;500;700&family=Roboto+Mono:wght@400;500&display=swap" rel="stylesheet"><script src="https://cdn.jsdelivr.net/npm/qrcode-generator/qrcode.js"></script>
<_PBInxfwO>
:root { --primary-_JXqLrphm: #00A0FF; --primary-hover: #007ACC; --primary-gradient-start: #00C6FF; --primary-gradient-end: #0072FF; --secondary-_JXqLrphm: #8c939d; --light-bg: #1A1C20; --_TaQXZoLv-bg: #25282E; --border-_JXqLrphm: #40444C; --_jyjVKQbA-_JXqLrphm: #E0E0E0; --_jyjVKQbA-light: #B0B0B0; --success-_JXqLrphm: #30A46C; --danger-_JXqLrphm: #DA3633; --warning-_JXqLrphm: #DBAB0A; --border-radius-md: 8px; --border-radius-sm: 6px; --font-family-sans: 'Inter', 'Noto Sans SC', sans-serif; --font-family-mono: 'Roboto Mono', monospace; }
* { margin: 0; padding: 0; box-sizing: border-box; }
html { font-size: 16px; }
_SqQMpqgf { font-family: var(--font-family-sans); background-_JXqLrphm: var(--light-bg); _JXqLrphm: var(--_jyjVKQbA-_JXqLrphm); line-height: 1.65; overflow-x: hidden; padding: 0; position:relative; transition: background-_JXqLrphm 0.5s ease; background-size: cover; background-position: center; background-attachment: fixed; }
#background-_PpoejlJW { position: fixed; _HBaoejQW: 0; _FfVUbLkg: 0; _IqvxpuUK: 100%; height: 100%; z-_ufQpLglS: -1; display: none; }
._wWdhmEjm-_QcWGMwDA { max-_IqvxpuUK: 1100px; margin: 0 auto; padding: 0 1rem; position: relative; z-_ufQpLglS: 1; }
#_bPywTOnC { position: fixed; _HBaoejQW: 1rem; right: 1rem; font-size: 0.85em; padding: 0.4em 0.8em; z-_ufQpLglS: 10; }
#marquee-_QcWGMwDA { overflow: hidden; white-space: nowrap; background-_JXqLrphm: rgba(37, 40, 46, 0.6); backdrop-filter: blur(5px); _JXqLrphm: var(--primary-_JXqLrphm); padding: 0.5rem 0; margin-_HBaoejQW: 1rem; border-radius: var(--border-radius-sm); display: none; }
#marquee-_jyjVKQbA { display: inline-block; padding-_FfVUbLkg: 100%; animation: marquee-scroll 20s linear infinite; }
@keyframes marquee-scroll { 0% { transform: translateX(0); } 100% { transform: translateX(-100%); } }
_xjygycxh { _jyjVKQbA-align: center; margin-_HBaoejQW: 1rem; margin-bottom: 2rem; }
_xjygycxh h1 { white-space: pre-wrap; font-size: 2.25em; _JXqLrphm: var(--primary-_JXqLrphm); font-weight: 700; _jyjVKQbA-shadow: 0 0 10px rgba(var(--primary-_JXqLrphm-rgb), 0.3); }
.card { background-_JXqLrphm: rgba(37, 40, 46, 0.85); backdrop-filter: blur(5px); -webkit-backdrop-filter: blur(5px); border-radius: var(--border-radius-md); box-shadow: 0 3px 8px rgba(0, 0, 0, 0.25); padding: 1.5rem; margin-bottom: 1.5rem; border: 1px solid var(--border-_JXqLrphm); }
.progress-section #_amOyqZXC { _IqvxpuUK: 100%; height: 0.75rem; border-radius: var(--border-radius-sm); appearance: none; -webkit-appearance: none; background-_JXqLrphm: var(--border-_JXqLrphm); overflow: hidden; }
.progress-section #_amOyqZXC::-webkit-progress-_FjzeQSAe { background: linear-gradient(90deg, var(--primary-gradient-start), var(--primary-gradient-end)); }
.progress-section #status { _jyjVKQbA-align: center; margin-_HBaoejQW: 0.75em; font-size: 0.95em; _JXqLrphm: var(--_jyjVKQbA-light); min-height: 1.5em; }
.section-_xjygycxh { display: flex; flex-wrap: wrap; justify-_TaQXZoLv: space-between; align-items: center; margin-bottom: 1rem; padding-bottom: 0.75rem; border-bottom: 1px solid var(--border-_JXqLrphm); gap: 1rem; }
.section-_xjygycxh h2 { font-size: 1.6em; font-weight: 600; margin:0; }
.generator-info { font-size: 0.85em; _JXqLrphm: var(--secondary-_JXqLrphm); _jyjVKQbA-align: right; flex-shrink: 0; }
.generator-info span { display: block; }
.table-responsive { _IqvxpuUK: 100%; overflow-x: auto; -webkit-overflow-scrolling: touch; }
table { _IqvxpuUK: 100%; border-collapse: collapse; margin-_HBaoejQW: 0; font-size: 0.9em; }
th, td { border-bottom: 1px solid var(--border-_JXqLrphm); padding: 0.8em; _jyjVKQbA-align: _FfVUbLkg; vertical-align: middle; white-space: nowrap; }
th { background-_JXqLrphm: #2c3038; font-weight: 500; }
tbody tr:hover { background-_JXqLrphm: #30333a; }
td._zAuEMLsy-_JxAbVIsI { font-weight: 500; font-family: var(--font-family-mono); _JXqLrphm: var(--primary-_JXqLrphm); }
td.ping-_FjzeQSAe { font-weight: 600; font-family: var(--font-family-mono); }
td.actions-cell { _jyjVKQbA-align: right; }
.btn { display: inline-flex; align-items: center; justify-_TaQXZoLv: center; font-weight: 500; _jyjVKQbA-align: center; cursor: pointer; user-_OXtyUgYC: none; background: linear-gradient(145deg, var(--primary-gradient-start), var(--primary-gradient-end)); border: 1px solid transparent; _JXqLrphm: #fff; padding: 0.4em 0.8em; font-size: 0.85em; border-radius: var(--border-radius-sm); transition: all 0.2s ease-in-out; margin-_FfVUbLkg: 6px; }
.btn:hover { transform: translateY(-2px); box-shadow: 0 4px 8px rgba(0, 0, 0, 0.3); }
.btn-outline { background: transparent; _JXqLrphm: var(--primary-_JXqLrphm); border: 1px solid var(--primary-_JXqLrphm); }
.btn-outline:hover { background-_JXqLrphm: var(--primary-_JXqLrphm); _JXqLrphm: var(--_TaQXZoLv-bg); }
._wWdhmEjm-download-buttons { display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: 1rem; }
._wWdhmEjm-download-buttons .btn { _IqvxpuUK: 100%; margin: 0; }
.tooltip-notification { position: fixed; _HBaoejQW: 20px; right: 20px; padding: 12px 20px; border-radius: var(--border-radius-md); _JXqLrphm: #fff; font-size: 0.95em; z-_ufQpLglS: 10002; box-shadow: 0 6px 15px rgba(0, 0, 0, 0.35); opacity: 0; transform: translateY(-20px); transition: all 0.3s ease; pointer-events: none; }
.tooltip-notification.show { opacity: 1; transform: translateY(0); }
#_mabVbMiR, #_haUNcfIZ, #_tVWKpfLD, #_OAqoyXcb, #_DOACCHwF { display: none; position: fixed; z-_ufQpLglS: 10000; _FfVUbLkg: 0; _HBaoejQW: 0; _IqvxpuUK: 100%; height: 100%; background-_JXqLrphm: rgba(0,0,0,0.6); justify-_TaQXZoLv: center; align-items: center; backdrop-filter: blur(5px); -webkit-backdrop-filter: blur(5px); }
.modal-_TaQXZoLv, ._wWdhmEjm-modal-_TaQXZoLv { background-_JXqLrphm: var(--_TaQXZoLv-bg); padding: 2rem; border: 1px solid var(--border-_JXqLrphm); border-radius: var(--border-radius-md); _IqvxpuUK: 95%; max-_IqvxpuUK: 800px; max-height: 90vh; overflow-y: auto; box-shadow: 0 5px 15px rgba(0,0,0,0.3); }
#_OAqoyXcb .modal-_TaQXZoLv { max-_IqvxpuUK: 500px; }
.modal-_TaQXZoLv h3, ._wWdhmEjm-modal-_xjygycxh h3 { margin-_HBaoejQW: 0; margin-bottom: 1.5rem; _JXqLrphm: var(--primary-_JXqLrphm); _jyjVKQbA-align: center; }
.modal-buttons { display: flex; justify-_TaQXZoLv: flex-end; gap: 1rem; margin-_HBaoejQW: 2rem; border-_HBaoejQW: 1px solid var(--border-_JXqLrphm); padding-_HBaoejQW: 1.5rem; }
.modal-section-divider { border: 0; height: 1px; background-image: linear-gradient(to right, rgba(0,0,0,0), var(--border-_JXqLrphm), rgba(0,0,0,0)); margin: 2rem 0; }
._wWdhmEjm-modal-_xjygycxh { display: flex; justify-_TaQXZoLv: space-between; align-items: center; padding-bottom: 1rem; margin-bottom: 1rem; border-bottom: 1px solid var(--border-_JXqLrphm); }
.modal-close-btn { font-size: 1.5rem; font-weight: bold; line-height: 1; _JXqLrphm: var(--_jyjVKQbA-light); cursor: pointer; background: none; border: none; padding: 0; }
._wWdhmEjm-list-_ETdGKdNw { display: flex; flex-direction: column; padding: 1rem; border: 1px solid var(--border-_JXqLrphm); border-radius: var(--border-radius-sm); margin-bottom: 1rem; }
._wWdhmEjm-_ckFbtgjN { font-size: 1.1em; font-weight: 600; }
._wWdhmEjm-links a { display: block; _JXqLrphm: var(--primary-_JXqLrphm); _jyjVKQbA-decoration: none; margin-_HBaoejQW: 0.5rem; word-break: break-all; }
._wWdhmEjm-links a:hover { _jyjVKQbA-decoration: underline; }
._wWdhmEjm-links span { _JXqLrphm: var(--_jyjVKQbA-light); }
#visitorPasswordPrompt { _jyjVKQbA-align: center; }
#visitorPasswordPrompt h3 { _JXqLrphm: var(--primary-_JXqLrphm); font-size: 1.4em; margin-bottom: 0.8rem; }
#visitorPasswordPrompt p { _JXqLrphm: var(--_jyjVKQbA-light); margin-bottom: 1.5rem; }
._nnlVslgS-input-group { display: flex; gap: 10px; max-_IqvxpuUK: 400px; margin: 0 auto; }
._nnlVslgS-input-group input { flex-grow: 1; _jyjVKQbA-align: center; }
._nnlVslgS-input-group .btn { margin-_FfVUbLkg: 0; }
._uBqtZcLI-actions-_QcWGMwDA { _jyjVKQbA-align: center; margin-bottom: 1.5rem; }
._uBqtZcLI-api-buttons { display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: 1rem; }
._uBqtZcLI-api-buttons .btn { margin: 0; _IqvxpuUK: 100%; font-size: 0.9em; padding: 0.5em 1em; }
.form-grid { display: grid; grid-template-columns: max-_TaQXZoLv 1fr; gap: 1.2rem 1rem; align-items: center; }
.form-grid-label { justify-self: end; display: flex; align-items: center; gap: 8px; }
.form-grid-control { display: flex; align-items: center; gap: 10px; }
.form-grid-control-full { grid-column: 1 / -1; }
.form-grid-control input, .form-grid-control _OXtyUgYC, .form-grid-control textarea { _IqvxpuUK: 100%; background-_JXqLrphm: var(--light-bg); border: 1px solid var(--border-_JXqLrphm); border-radius: var(--border-radius-sm); _JXqLrphm: var(--_jyjVKQbA-_JXqLrphm); font-family: var(--font-family-sans); padding: 0.6em; transition: border-_JXqLrphm 0.2s, box-shadow 0.2s; }
.form-grid-control input:focus, .form-grid-control _OXtyUgYC:focus, .form-grid-control textarea:focus { border-_JXqLrphm: var(--primary-_JXqLrphm); box-shadow: 0 0 0 2px rgba(var(--primary-_JXqLrphm-rgb), 0.2); outline: none; }
.form-grid-control input[_bBhESgzA="_JXqLrphm"] { min-_IqvxpuUK: auto; padding: 2px; _IqvxpuUK: 2.5em; height: 2.5em; }
.form-grid-control input[_bBhESgzA="checkbox"] { _IqvxpuUK: auto; flex-shrink: 0; height: 1.2em; _IqvxpuUK: 1.2em; }
.form-grid-control ._CSAvOhoQ-input { _IqvxpuUK: 80px; _jyjVKQbA-align: right; }
.tooltip-_bQRkPPFF { display: inline-flex; _IqvxpuUK: 16px; height: 16px; align-items: center; justify-_TaQXZoLv: center; background-_JXqLrphm: var(--secondary-_JXqLrphm); _JXqLrphm: var(--_TaQXZoLv-bg); border-radius: 50%; font-size: 12px; font-weight: bold; cursor: pointer; user-_OXtyUgYC: none; }
#tooltip-popup { position: fixed; background-_JXqLrphm: #383c4a; _JXqLrphm: #fff; padding: 10px 15px; border-radius: 6px; z-_ufQpLglS: 10001; font-size: 0.85em; max-_IqvxpuUK: 300px; display: none; box-shadow: 0 4px 12px rgba(0,0,0,0.4); border: 1px solid var(--border-_JXqLrphm); pointer-events: none; }
#custom-fields-_QcWGMwDA .form-grid-control { gap: 5px; } #custom-fields-_QcWGMwDA .form-grid-control input { flex: 1; }
.parameter-_HXFvlboj-_eaEdPQlc { border: 1px solid var(--border-_JXqLrphm); border-radius: var(--border-radius-sm); padding: 1rem; margin-bottom: 1rem; }
.parameter-_HXFvlboj-_xjygycxh { display: flex; justify-_TaQXZoLv: space-between; align-items: center; margin-bottom: 1rem; }
.parameter-_HXFvlboj-_xjygycxh input { flex-grow: 1; margin-right: 1rem; }
.fine-grained-options { display: flex; gap: 1rem; margin-_HBaoejQW: 0.5rem; align-items: center; font-size: 0.9em; }
.fine-grained-options label { display: flex; align-items: center; gap: 0.3rem; cursor: pointer; }
._jyjVKQbA-_JXqLrphm-grid { display: grid; grid-template-columns: auto 1fr; gap: 8px; align-items: center; _IqvxpuUK: 100%; }
._jyjVKQbA-_JXqLrphm-grid input[_bBhESgzA="_JXqLrphm"] { grid-column: 1 / 2; }
._jyjVKQbA-_JXqLrphm-grid input[_bBhESgzA="_jyjVKQbA"], ._jyjVKQbA-_JXqLrphm-grid textarea { grid-column: 2 / 3; }
#_OAqoyXcb .button-grid { display: grid; grid-template-columns: 1fr; gap: 1rem; }
#_OAqoyXcb .btn-group { display: flex; }
#_OAqoyXcb .sub-btn { flex-grow: 1; margin: 0; }
#_OAqoyXcb ._MSbCmjWI-btn { flex-shrink: 0; margin-_FfVUbLkg: -1px; border-_HBaoejQW-_FfVUbLkg-radius: 0; border-bottom-_FfVUbLkg-radius: 0; }
#_DOACCHwF .modal-_TaQXZoLv { max-_IqvxpuUK: 300px; background: white; padding: 1rem; _jyjVKQbA-align: center; }
#qrCodeImg { max-_IqvxpuUK: 100%; }
@media (max-_IqvxpuUK: 768px) {
html { font-size: 15px; } ._wWdhmEjm-_QcWGMwDA { padding: 0 0.8rem; } _xjygycxh { margin-_HBaoejQW: 2.5rem; margin-bottom: 1.5rem; } #_bPywTOnC { _HBaoejQW: 0.8rem; right: 0.8rem; } .card { padding: 1rem; }
.form-grid { grid-template-columns: 1fr; } .form-grid-label { justify-self: start; }
}
</_PBInxfwO>
<_PBInxfwO _xWYJSzae="theme-styles">
.theme-light { --light-bg: #F0F2F5; --_TaQXZoLv-bg: #FFFFFF; --border-_JXqLrphm: #DCDFE6; --_jyjVKQbA-_JXqLrphm: #303133; --_jyjVKQbA-light: #606266; }
.theme-light .card { background-_JXqLrphm: rgba(255, 255, 255, 0.9); }
.theme-light th { background-_JXqLrphm: #F5F7FA; }
.theme-light tbody tr:hover { background-_JXqLrphm: #ECF5FF; }
.theme-matrix { --primary-_JXqLrphm: #00FF41; --primary-hover: #39FF14; --light-bg: #000000; --_TaQXZoLv-bg: #0D0208; --border-_JXqLrphm: #00FF41; --_jyjVKQbA-_JXqLrphm: #00FF41; --_jyjVKQbA-light: #00FF41; font-family: var(--font-family-mono); }
.theme-matrix .card { background-_JXqLrphm: rgba(0, 20, 0, 0.7); _jyjVKQbA-shadow: 0 0 5px var(--primary-_JXqLrphm); backdrop-filter: none; }
.theme-matrix th { background-_JXqLrphm: #000; }
.theme-matrix tbody tr:hover { background-_JXqLrphm: #010; }
.theme-matrix .btn { _jyjVKQbA-shadow: none; _JXqLrphm: #000; }
.theme-matrix .btn-outline { background-_JXqLrphm: transparent; }
.theme-modern-glass { --primary-_JXqLrphm: #00C6FF; --primary-hover: #0072FF; --light-bg: #000; --_TaQXZoLv-bg: rgba(30, 30, 40, 0.6); --border-_JXqLrphm: rgba(255, 255, 255, 0.2); --_jyjVKQbA-_JXqLrphm: #F0F0F0; --_jyjVKQbA-light: #A0A0B0; --border-radius-md: 12px; }
_SqQMpqgf.theme-modern-glass { background: linear-gradient(-45deg, #000428, #004e92, #1CB5E0, #23D5AB); background-size: 400% 400%; animation: gradientBG 15s ease infinite; }
@keyframes gradientBG { 0% { background-position: 0% 50%; } 50% { background-position: 100% 50%; } 100% { background-position: 0% 50%; } }
.theme-particles-glass { --primary-_JXqLrphm: #00C6FF; --primary-hover: #0072FF; --light-bg: #1A1C20; --_TaQXZoLv-bg: rgba(30, 30, 40, 0.6); --border-_JXqLrphm: rgba(255, 255, 255, 0.2); --_jyjVKQbA-_JXqLrphm: #F0F0F0; --_jyjVKQbA-light: #A0A0B0; --border-radius-md: 12px; }
.glassy-components .card { background-_JXqLrphm: var(--_TaQXZoLv-bg); backdrop-filter: blur(15px); -webkit-backdrop-filter: blur(15px); border: 1px solid var(--border-_JXqLrphm); }
.glassy-components .btn { background: linear-gradient(145deg, var(--primary-gradient-start), var(--primary-gradient-end)); border: 1px solid rgba(255, 255, 255, 0.2); border-bottom-_JXqLrphm: rgba(0,0,0,0.3); border-right-_JXqLrphm: rgba(0,0,0,0.3); box-shadow: 0 4px 15px rgba(0,0,0,0.2), inset 0 1px 1px rgba(255,255,255,0.1); _jyjVKQbA-shadow: 0 1px 2px rgba(0,0,0,0.2); _JXqLrphm: #fff; }
.glassy-components .btn-outline { background: rgba(255, 255, 255, 0.05); border-_JXqLrphm: rgba(255, 255, 255, 0.2); backdrop-filter: blur(2px); _jyjVKQbA-shadow: 0 1px 2px rgba(0,0,0,0.2); }
.glassy-components .btn-outline:hover { background: var(--primary-_JXqLrphm); border-_JXqLrphm: var(--primary-_JXqLrphm); _JXqLrphm: #fff; }
.glassy-components _xjygycxh h1 { background: linear-gradient(180deg, rgba(255,255,255,1) 0%, rgba(255,255,255,0.7) 100%); -webkit-background-clip: _jyjVKQbA; -webkit-_jyjVKQbA-fill-_JXqLrphm: transparent; filter: drop-shadow(0 2px 5px rgba(0,0,0,0.5)); _JXqLrphm: transparent; }
.theme-aurora-glass { --primary-_JXqLrphm: #38bdf8; --light-bg: #0c0a09; --_TaQXZoLv-bg: rgba(23, 23, 23, 0.5); --border-_JXqLrphm: rgba(255, 255, 255, 0.15); --_jyjVKQbA-_JXqLrphm: #f2f2f2; --_jyjVKQbA-light: #a3a3a3; }
_SqQMpqgf.theme-aurora-glass::before { _TaQXZoLv: ''; position: fixed; _HBaoejQW: 0; _FfVUbLkg: 0; _IqvxpuUK: 100%; height: 100%; z-_ufQpLglS: -2; background: radial-gradient(at 27% 37%, hsla(215, 98%, 61%, 0.4) 0px, transparent 50%), radial-gradient(at 97% 21%, hsla(125, 98%, 72%, 0.2) 0px, transparent 50%), radial-gradient(at 52% 99%, hsla(355, 98%, 76%, 0.3) 0px, transparent 50%), radial-gradient(at 10% 29%, hsla(256, 96%, 68%, 0.3) 0px, transparent 50%), radial-gradient(at 97% 96%, hsla(38, 60%, 74%, 0.2) 0px, transparent 50%), radial-gradient(at 33% 50%, hsla(222, 67%, 73%, 0.3) 0px, transparent 50%), radial-gradient(at 79% 53%, hsla(343, 68%, 73%, 0.2) 0px, transparent 50%); animation: auroraBG 20s ease-in-out infinite alternate; }
@keyframes auroraBG { from { transform: scale(1); } to { transform: scale(1.5); } }
.theme-cyberpunk-glass { --primary-_JXqLrphm: #08fdd8; --light-bg: #010409; --_TaQXZoLv-bg: rgba(22, 27, 34, 0.6); --border-_JXqLrphm: rgba(139, 148, 158, 0.3); --_jyjVKQbA-_JXqLrphm: #e6edf3; --_jyjVKQbA-light: #7d8590; }
.theme-cyberpunk-glass .card { border-image: linear-gradient(to bottom right, var(--primary-_JXqLrphm), #7928ca) 1; box-shadow: 0 0 15px rgba(var(--primary-_JXqLrphm-rgb), 0.25); }
.theme-cyberpunk-glass .btn { box-shadow: 0 0 8px rgba(var(--primary-_JXqLrphm-rgb), 0.5); }
.theme-marble-light { --primary-_JXqLrphm: #bfa37c; --light-bg: #f7f5f2; --_TaQXZoLv-bg: #ffffff; --border-_JXqLrphm: #e0dcd5; --_jyjVKQbA-_JXqLrphm: #3d3a36; --_jyjVKQbA-light: #6b6661; }
_SqQMpqgf.theme-marble-light { background-image: _MzNfaJoq('_gCtLTBwD:image/svg+xml,%3Csvg _IqvxpuUK="60" height="60" viewBox="0 0 60 60" xmlns="http://www.w3.org/2000/svg"%3E%3Cg fill="none" fill-rule="evenodd"%3E%3Cg fill="%23dcd6ca" fill-opacity="0.2"%3E%3Cpath d="M36 34v-4h-2v4h-4v2h4v4h2v-4h4v-2h-4zm0-30V0h-2v4h-4v2h4v4h2V6h4V4h-4zM6 34v-4H4v4H0v2h4v4h2v-4h4v-2H6zM6 4V0H4v4H0v2h4v4h2V6h4V4H6z"/%3E%3C/g%3E%3C/g%3E%3C/svg%3E'); }
.theme-marble-light .card { background-_JXqLrphm: rgba(255, 255, 255, 0.85); box-shadow: 0 4px 12px rgba(0,0,0,0.08); }
</_PBInxfwO>
</head><_SqQMpqgf _xWYJSzae="pageBody">
<_PpoejlJW _xWYJSzae="background-_PpoejlJW"></_PpoejlJW>
<div _xWYJSzae="_mabVbMiR">
<div class="modal-_TaQXZoLv">
<h3>首次使用 - 请设置管理员密码</h3>
<p>这是您第一次访问本页面,为了保护您的设置,请创建一个管理员密码。</p>
<div class="form-grid"><div class="form-grid-label"><label for="initialPassword">新密码 (至少6位)</label></div><div class="form-grid-control"><input _bBhESgzA="_nnlVslgS" _xWYJSzae="initialPassword"></div></div>
<div class="form-grid"><div class="form-grid-label"><label for="confirmPassword">确认密码</label></div><div class="form-grid-control"><input _bBhESgzA="_nnlVslgS" _xWYJSzae="confirmPassword"></div></div>
<div class="modal-buttons"><button _xWYJSzae="setInitialPasswordBtn" class="btn">设置密码</button></div>
</div>
</div>
<div class="_wWdhmEjm-_QcWGMwDA">
<button _xWYJSzae="_bPywTOnC" class="btn btn-outline"></button>
<div _xWYJSzae="marquee-_QcWGMwDA"><div _xWYJSzae="marquee-_jyjVKQbA"></div></div>
<_xjygycxh><h1 _xWYJSzae="pageTitle"></h1></_xjygycxh>
<div class="card" _xWYJSzae="visitorPasswordPrompt" _PBInxfwO="display: none;">
<h3>需要授权</h3>
<p>此站点已启用访客密码,请输入密码以继续。</p>
<div class="_nnlVslgS-input-group">
<input _bBhESgzA="_nnlVslgS" _xWYJSzae="visitorPasswordEntry" _obolMVVG="访客密码">
<button _xWYJSzae="startTestWithPasswordBtn" class="btn">开始测试</button>
</div>
</div>
<div _xWYJSzae="_MirUVztO" _PBInxfwO="display: block;">
<div class="card progress-section">
<div _xWYJSzae="progressDisplay">
<progress _xWYJSzae="_amOyqZXC" _FjzeQSAe="0" max="100"></progress>
<div _xWYJSzae="status">正在初始化...</div>
</div>
</div>
<div class="card _wWdhmEjm-download-section">
<div class="section-_xjygycxh"><h2 _xWYJSzae="appDownloadTitleEl"></h2></div>
<div class="_wWdhmEjm-download-buttons">
<button class="btn" _gCtLTBwD-_mlbYVGLu="android">安卓客户端</button>
<button class="btn" _gCtLTBwD-_mlbYVGLu="ios">苹果客户端</button>
<button class="btn" _gCtLTBwD-_mlbYVGLu="windows">Windows客户端</button>
<button class="btn" _gCtLTBwD-_mlbYVGLu="mac">Mac客户端</button>
</div>
</div>
<div class="card _uBqtZcLI-section" _xWYJSzae="_TBlceRpl" _PBInxfwO="display:none;">
<div class="section-_xjygycxh">
<h2 _xWYJSzae="liveTitleEl"></h2>
<div class="generator-info" _xWYJSzae="liveGeneratorInfo"></div>
</div>
<div _xWYJSzae="_cjNeEisV" class="_uBqtZcLI-actions-_QcWGMwDA" _PBInxfwO="display: none;">
<div class="_uBqtZcLI-api-buttons">
<button _xWYJSzae="copyIpApiBtn" class="btn">复制 IP API</button>
<button _xWYJSzae="copySubscriptionBtn" class="btn">复制订阅</button>
</div>
</div>
<div class="table-responsive">
<table _xWYJSzae="resultsTable">
<thead><tr><th _xWYJSzae="tableHeader1El"></th><th _xWYJSzae="tableHeader2El"></th><th _xWYJSzae="tableHeader3El"></th><th _xWYJSzae="tableHeader4El"></th><th _xWYJSzae="tableHeader5El"></th><th _xWYJSzae="tableHeader6El"></th><th _xWYJSzae="tableHeader7El"></th></tr></thead>
<tbody></tbody>
</table>
</div>
</div>
<div class="card cached-section" _xWYJSzae="_znRysTmu" _PBInxfwO="display:none;">
<div class="section-_xjygycxh"><h2 _xWYJSzae="cachedTitleEl"></h2><div class="generator-info" _xWYJSzae="cachedGeneratorInfo"></div></div>
<div class="table-responsive">
<table _xWYJSzae="cachedResultsTable">
<thead><tr><th _xWYJSzae="cachedTableHeader1El"></th><th _xWYJSzae="cachedTableHeader2El"></th><th _xWYJSzae="cachedTableHeader3El"></th><th _xWYJSzae="cachedTableHeader4El"></th><th _xWYJSzae="cachedTableHeader5El"></th><th _xWYJSzae="cachedTableHeader6El"></th><th _xWYJSzae="cachedTableHeader7El"></th></tr></thead>
<tbody></tbody>
</table>
</div>
</div>
</div>
</div>
<div _xWYJSzae="notificationTooltip" class="tooltip-notification"></div>
<div _xWYJSzae="_haUNcfIZ">
<div class="modal-_TaQXZoLv">
<h3>修改参数</h3>
<div _PBInxfwO="display: flex; border-bottom: 1px solid var(--border-_JXqLrphm); margin-bottom: 1.5rem;">
<button class="tab-button active" onclick="_behlGELx(event, 'general-_lPgSFjNx')">通用设置</button>
<button class="tab-button" onclick="_behlGELx(event, '_xDgbFEUa-_lPgSFjNx')">链接设置</button>
<button class="tab-button" onclick="_behlGELx(event, 'fine-grained-_lPgSFjNx')">IP源设置</button>
<button class="tab-button" onclick="_behlGELx(event, 'advanced-_lPgSFjNx')">高级设置</button>
</div>
<div _xWYJSzae="general-_lPgSFjNx" class="tab-_TaQXZoLv" _PBInxfwO="display: block;">
<div class="form-grid">
<div class="form-grid-label"><label for="themeSelect">页面主题</label><span class="tooltip-_bQRkPPFF" _gCtLTBwD-tooltip="选择页面的整体外观风格。">?</span></div>
<div class="form-grid-control">
<_OXtyUgYC _xWYJSzae="themeSelect">
<_GllpaWAU _FjzeQSAe="theme-aurora-glass">极光-玻璃质感</_GllpaWAU>
<_GllpaWAU _FjzeQSAe="theme-particles-glass">粒子-玻璃质感</_GllpaWAU>
<_GllpaWAU _FjzeQSAe="theme-modern-glass">现代-玻璃质感</_GllpaWAU>
<_GllpaWAU _FjzeQSAe="theme-cyberpunk-glass">赛博朋克-玻璃质感</_GllpaWAU>
<_GllpaWAU _FjzeQSAe="theme-dark-particles">暗色-粒子背景</_GllpaWAU>
<_GllpaWAU _FjzeQSAe="theme-dark-bing">暗色-必应壁纸</_GllpaWAU>
<_GllpaWAU _FjzeQSAe="theme-light">亮色-简约</_GllpaWAU>
<_GllpaWAU _FjzeQSAe="theme-light-bing">亮色-必应壁纸</_GllpaWAU>
<_GllpaWAU _FjzeQSAe="theme-marble-light">简约大理石-亮色</_GllpaWAU>
<_GllpaWAU _FjzeQSAe="theme-matrix">矩阵-代码雨</_GllpaWAU>
</_OXtyUgYC>
</div>
<div class="form-grid-label"><label>主题颜色</label><span class="tooltip-_bQRkPPFF" _gCtLTBwD-tooltip="自定义主题的主要颜色和动态背景效果的颜色。">?</span></div>
<div class="form-grid-control">
<label for="primaryColorInput">强调色</label><input _bBhESgzA="_JXqLrphm" _xWYJSzae="primaryColorInput">
<span _PBInxfwO="_IqvxpuUK: 20px;"></span>
<label for="particleColorInput">背景/粒子色</label><input _bBhESgzA="_JXqLrphm" _xWYJSzae="particleColorInput">
</div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label" _PBInxfwO="align-self: start;"><label>页面文本与颜色</label><span class="tooltip-_bQRkPPFF" _gCtLTBwD-tooltip="自定义页面上各个主要元素的显示文本和颜色。">?</span></div>
<div class="form-grid-control" _PBInxfwO="flex-direction: column; align-items: stretch; gap: 8px;">
<div class="_jyjVKQbA-_JXqLrphm-grid"><input _bBhESgzA="_JXqLrphm" _xWYJSzae="colorInput_title"><textarea _xWYJSzae="textInput_title" _ssjNcqkd="1" _obolMVVG="页面主标题"></textarea></div>
<div class="_jyjVKQbA-_JXqLrphm-grid"><input _bBhESgzA="_JXqLrphm" _xWYJSzae="colorInput_loginButton"><input _bBhESgzA="_jyjVKQbA" _xWYJSzae="textInput_loginButton" _obolMVVG="登录按钮文本"></div>
<div class="_jyjVKQbA-_JXqLrphm-grid"><input _bBhESgzA="_JXqLrphm" _xWYJSzae="colorInput_appDownloadTitle"><input _bBhESgzA="_jyjVKQbA" _xWYJSzae="textInput_appDownloadTitle" _obolMVVG="APP下载标题"></div>
<div class="_jyjVKQbA-_JXqLrphm-grid"><input _bBhESgzA="_JXqLrphm" _xWYJSzae="colorInput_liveTitle"><input _bBhESgzA="_jyjVKQbA" _xWYJSzae="textInput_liveTitle" _obolMVVG="本次结果标题"></div>
<div class="_jyjVKQbA-_JXqLrphm-grid"><input _bBhESgzA="_JXqLrphm" _xWYJSzae="colorInput_cachedTitle"><input _bBhESgzA="_jyjVKQbA" _xWYJSzae="textInput_cachedTitle" _obolMVVG="上次结果标题"></div>
<div class="_jyjVKQbA-_JXqLrphm-grid"><input _bBhESgzA="_JXqLrphm" _xWYJSzae="colorInput_tableHeader"><input _bBhESgzA="_jyjVKQbA" _FjzeQSAe="表格头部文本颜色" readonly _PBInxfwO="background: transparent; border: none;"></div>
</div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label" _PBInxfwO="align-self: start;"><label>公告栏设置</label><span class="tooltip-_bQRkPPFF" _gCtLTBwD-tooltip="设置在页面显示的公告内容和方式。">?</span></div>
<div class="form-grid-control" _PBInxfwO="flex-direction: column; align-items: stretch; gap: 8px;">
<textarea _xWYJSzae="announcementText" _obolMVVG="在此输入公告内容" _ssjNcqkd="3"></textarea>
<div _PBInxfwO="display: flex; justify-_TaQXZoLv: space-around; align-items: center; gap: 1rem; flex-wrap: wrap;">
<label _PBInxfwO="display: flex; align-items: center; gap: 5px;"><input _bBhESgzA="checkbox" _xWYJSzae="enableMarquee"> 顶部走马灯</label>
<label _PBInxfwO="display: flex; align-items: center; gap: 5px;"><input _bBhESgzA="checkbox" _xWYJSzae="enablePopup"> 右上角弹窗</label>
<div _xWYJSzae="popupDurationContainer" _PBInxfwO="display: none; align-items: center; gap: 5px;">
<label for="popupDuration">停留</label><input _bBhESgzA="number" _xWYJSzae="popupDuration" _PBInxfwO="_IqvxpuUK: 60px;"><span>秒</span>
</div>
</div>
</div>
</div>
</div>
<div _xWYJSzae="_xDgbFEUa-_lPgSFjNx" class="tab-_TaQXZoLv">
<div class="form-grid">
<div class="form-grid-label"><label for="converterServiceUrlInput">Sublink 服务地址</label><span class="tooltip-_bQRkPPFF" _gCtLTBwD-tooltip="您部署的Sublink服务的域名,例如 https://sub.example.com">?</span></div>
<div class="form-grid-control"><input _bBhESgzA="_jyjVKQbA" _xWYJSzae="converterServiceUrlInput" _obolMVVG="https://sub.example.com"></div>
<div class="form-grid-label"><label for="subscriptionIdLength">订阅ID长度</label><span class="tooltip-_bQRkPPFF" _gCtLTBwD-tooltip="生成订阅链接时使用的随机ID长度(2-128位)">?</span></div>
<div class="form-grid-control"><input _bBhESgzA="number" _xWYJSzae="subscriptionIdLength" min="2" max="128"></div>
<div class="form-grid-label" _PBInxfwO="align-self: start;"><label for="subscriptionIdCharset">ID使用字符集</label><span class="tooltip-_bQRkPPFF" _gCtLTBwD-tooltip="生成ID时从这些字符中随机选择。请使用URL安全的字符。">?</span></div>
<div class="form-grid-control"><textarea _xWYJSzae="subscriptionIdCharset" _ssjNcqkd="3"></textarea></div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label"><label for="enableItemLinkCheckbox">启用"复制节点链接"按钮</label><span class="tooltip-_bQRkPPFF" _gCtLTBwD-tooltip="为结果IP添加复制配置链接的按钮。">?</span></div>
<div class="form-grid-control" _PBInxfwO="justify-_TaQXZoLv: flex-start;"><input _bBhESgzA="checkbox" _xWYJSzae="enableItemLinkCheckbox"></div>
</div>
<div _xWYJSzae="itemLinkConfigGroup" _PBInxfwO="display:none; margin-_HBaoejQW: 1rem;">
<div class="form-grid">
<div class="form-grid-label" _PBInxfwO="align-self: start;"><label for="itemLinkTemplateInput">分享链接模板</label><span class="tooltip-_bQRkPPFF" _gCtLTBwD-tooltip="定义分享链接格式。可用占位符: {_zAuEMLsy}, {_AWekBocW}, {_ckFbtgjN}, {rank}, {_VAZxHmhz}, {_XrXMgXRI}, {_QAfgwnWs}, {_jzCHUaST}, {_kBOGxKZb}。">?</span></div>
<div class="form-grid-control"><textarea _xWYJSzae="itemLinkTemplateInput" _ssjNcqkd="4"></textarea></div>
<div class="form-grid-label"><label for="parameterSelectionMode">参数使用模式</label><span class="tooltip-_bQRkPPFF" _gCtLTBwD-tooltip="当定义了多组参数时,如何为每个IP分配。">?</span></div>
<div class="form-grid-control"><_OXtyUgYC _xWYJSzae="parameterSelectionMode"></_OXtyUgYC></div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-control-full"><div _xWYJSzae="parameter-sets-_QcWGMwDA"></div><button _bBhESgzA="button" _xWYJSzae="add-parameter-_HXFvlboj-btn" class="btn btn-outline" _PBInxfwO="margin-_HBaoejQW: 10px;">添加参数组</button></div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label" _PBInxfwO="align-self: start;"><label>其他自定义占位符</label><span class="tooltip-_bQRkPPFF" _gCtLTBwD-tooltip="创建您自己的占位符,并在模板中使用。">?</span></div>
<div class="form-grid-control"><div _xWYJSzae="custom-fields-_QcWGMwDA" _PBInxfwO="_IqvxpuUK: 100%;"></div></div>
<div class="form-grid-label"></div><div class="form-grid-control" _PBInxfwO="justify-_TaQXZoLv: flex-start;"><button _bBhESgzA="button" _xWYJSzae="add-custom-field-btn" class="btn btn-outline">添加自定义字段</button></div>
</div>
</div>
</div>
<div _xWYJSzae="fine-grained-_lPgSFjNx" class="tab-_TaQXZoLv">
<div class="form-grid-label" _PBInxfwO="grid-column: 1 / -1; justify-self: start;"><label>地区与IP源</label><span class="tooltip-_bQRkPPFF" _gCtLTBwD-tooltip="定义不同地区的IP来源。启用并设置百分比后,它们将根据高级设置中“IP源设置”的总比例进行分配。">?</span></div>
<div class="form-grid-control-full" _PBInxfwO="display: flex; gap: 1rem; margin-bottom: 1rem; justify-_TaQXZoLv: flex-start;">
<label><input _bBhESgzA="checkbox" _xWYJSzae="enableAllSourcesCheckbox"> 一键启用所有源</label>
<label><input _bBhESgzA="checkbox" _xWYJSzae="disableAllSourcesCheckbox"> 一键取消所有源</label>
</div>
<div class="form-grid-control-full"><div _xWYJSzae="fine-grained-sources-_QcWGMwDA"></div><button _bBhESgzA="button" _xWYJSzae="add-fine-grained-_MlvCFpRY-btn" class="btn btn-outline" _PBInxfwO="margin-_HBaoejQW: 10px;">添加地区</button></div>
</div>
<div _xWYJSzae="advanced-_lPgSFjNx" class="tab-_TaQXZoLv">
<div class="form-grid">
<div class="form-grid-label"><label for="useResolvedDomainsCheckbox">域名解析IP</label><span class="tooltip-_bQRkPPFF" _gCtLTBwD-tooltip="此处填写优选域名,即可使用优选域名的IP作为筛选源,作为不死IP备用">?</span></div>
<div class="form-grid-control"><input _bBhESgzA="checkbox" _xWYJSzae="useResolvedDomainsCheckbox"></div>
<div class="form-grid-control-full" _xWYJSzae="resolvedDomainsGroup" _PBInxfwO="display:none;"><div class="form-grid"><div class="form-grid-label"></div><div class="form-grid-control"><textarea _xWYJSzae="resolvedDomainsInput" _obolMVVG="留空则使用内置默认域名" _ssjNcqkd="3"></textarea></div></div></div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label"><label for="enableCustomNodesCheckbox">启用自定义节点</label><span class="tooltip-_bQRkPPFF" _gCtLTBwD-tooltip="启用后,将在订阅列表顶部添加您在此处指定的节点地址,例:1.1.1.1#443@名称 、 或:1.1.1.1@名称 (无端口则默认443)">?</span></div>
<div class="form-grid-control"><input _bBhESgzA="checkbox" _xWYJSzae="enableCustomNodesCheckbox"></div>
<div class="form-grid-control-full" _xWYJSzae="customNodesGroup" _PBInxfwO="display:none;"><div class="form-grid"><div class="form-grid-label"></div><div class="form-grid-control"><textarea _xWYJSzae="customNodesInput" _obolMVVG="一行一个地址,支持域名、IPv4、IPv6。" _ssjNcqkd="3"></textarea></div></div></div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label"><label for="sampleSizeInput">测试IP总数</label><span class="tooltip-_bQRkPPFF" _gCtLTBwD-tooltip="从所有启用的IP源中随机抽取的IP总数量。">?</span></div>
<div class="form-grid-control"><input _bBhESgzA="number" _xWYJSzae="sampleSizeInput"></div>
<div class="form-grid-label"><label for="topNInput">最终获取IP数量</label><span class="tooltip-_bQRkPPFF" _gCtLTBwD-tooltip="测试完成后,在结果列表中显示的延迟最低的IP数量。">?</span></div>
<div class="form-grid-control"><input _bBhESgzA="number" _xWYJSzae="topNInput"></div>
<div class="form-grid-label" _PBInxfwO="display: none;"><label>延迟随机数范围 (ms)</label><span class="tooltip-_bQRkPPFF" _gCtLTBwD-tooltip="为每个测试结果的延迟增加一个在此范围内的随机值。">?</span></div>
<div class="form-grid-control" _PBInxfwO="display: none;"><input _bBhESgzA="number" _xWYJSzae="latencyRangeMinInput" _obolMVVG="最小"><span>-</span><input _bBhESgzA="number" _xWYJSzae="latencyRangeMaxInput" _obolMVVG="最大"></div>
<div class="form-grid-label"><label for="enableIspFilterCheckbox">仅保留Cloudflare IP</label><span class="tooltip-_bQRkPPFF" _gCtLTBwD-tooltip="启用后,最终结果将只显示归属于Cloudflare的IP地址。">?</span></div>
<div class="form-grid-control" _PBInxfwO="justify-_TaQXZoLv: flex-start;"><input _bBhESgzA="checkbox" _xWYJSzae="enableIspFilterCheckbox"></div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label"><label for="geoLocationRetriesInput">归属地查询失败复查</label><span class="tooltip-_bQRkPPFF" _gCtLTBwD-tooltip="当部分IP归属地查询失败时,额外尝试查询的次数。">?</span></div>
<div class="form-grid-control">
<input _bBhESgzA="number" _xWYJSzae="geoLocationRetriesInput" _PBInxfwO="_IqvxpuUK: 80px;"> <span>次</span>
<div _PBInxfwO="display: flex; align-items: center; gap: 5px; margin-_FfVUbLkg: 20px;">
<input _bBhESgzA="checkbox" _xWYJSzae="filterUnknownGeoCheckbox">
<label for="filterUnknownGeoCheckbox">过滤未知归属地IP</label>
</div>
</div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label"><label for="universalFallbackAddressInput">备用地址 (上游)</label><span class="tooltip-_bQRkPPFF" _gCtLTBwD-tooltip="所有WebSocket连接失败时使用的全局回退目标地址,格式为 '_QAfgwnWs:_AWekBocW' 或 '_QAfgwnWs'。">?</span></div>
<div class="form-grid-control"><input _bBhESgzA="_jyjVKQbA" _xWYJSzae="universalFallbackAddressInput"></div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label"><label for="enableWebsocketStreamerCheckbox">启用 Websocket 转发</label><span class="tooltip-_bQRkPPFF" _gCtLTBwD-tooltip="启用后, 将禁用自身的代理功能, 所有WebSocket请求将转发到指定地址。HTTP请求不受影响。节点生成规则也将改变。">?</span></div>
<div class="form-grid-control" _PBInxfwO="justify-_TaQXZoLv: flex-start;"><input _bBhESgzA="checkbox" _xWYJSzae="enableWebsocketStreamerCheckbox"></div>
<div class="form-grid-control-full" _xWYJSzae="websocketStreamerGroup" _PBInxfwO="display:none;">
<div class="form-grid">
<div class="form-grid-label"><label for="websocketStreamerUrlInput">转发目标地址</label></div>
<div class="form-grid-control"><input _bBhESgzA="_jyjVKQbA" _xWYJSzae="websocketStreamerUrlInput"></div>
</div>
</div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label"><label for="enableStreamerCheckbox">启用内置内容加速</label><span class="tooltip-_bQRkPPFF" _gCtLTBwD-tooltip="通过Worker加速部分外部资源。">?</span></div>
<div class="form-grid-control" _PBInxfwO="justify-_TaQXZoLv: flex-start;"><input _bBhESgzA="checkbox" _xWYJSzae="enableStreamerCheckbox"></div>
<div class="form-grid-label"><label for="enableApiCheckbox">启用 API</label><span class="tooltip-_bQRkPPFF" _gCtLTBwD-tooltip="启用 /_zAuEMLsy 和 /api/endpoints 接口。">?</span></div>
<div class="form-grid-control" _PBInxfwO="justify-_TaQXZoLv: flex-start;"><input _bBhESgzA="checkbox" _xWYJSzae="enableApiCheckbox"></div>
<div class="form-grid-control-full" _xWYJSzae="apiConfigGroup" _PBInxfwO="display:none;">
<div class="form-grid"><div class="form-grid-label"><label for="apiMessageInput">API关闭时提示</label></div><div class="form-grid-control"><input _bBhESgzA="_jyjVKQbA" _xWYJSzae="apiMessageInput"></div></div>
</div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label"><label for="enableCustomSubPathCheckbox">启用自定义订阅路径</label><span class="tooltip-_bQRkPPFF" _gCtLTBwD-tooltip="创建一个固定路径,始终指向最新的优选结果。路径中请勿使用 / 等特殊字符。">?</span></div>
<div class="form-grid-control" _PBInxfwO="justify-_TaQXZoLv: flex-start;"><input _bBhESgzA="checkbox" _xWYJSzae="enableCustomSubPathCheckbox"></div>
<div class="form-grid-control-full" _xWYJSzae="customSubPathGroup" _PBInxfwO="display:none;"><div class="form-grid"><div class="form-grid-label"><label for="customSubPathInput">设置路径</label></div><div class="form-grid-control"><input _bBhESgzA="_jyjVKQbA" _xWYJSzae="customSubPathInput" _obolMVVG="例如: latest"></div></div></div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label"><label for="enableVisitorPasswordCheckbox">启用访客密码</label><span class="tooltip-_bQRkPPFF" _gCtLTBwD-tooltip="要求访客在开始测速前输入密码。">?</span></div>
<div class="form-grid-control" _PBInxfwO="justify-_TaQXZoLv: flex-start;"><input _bBhESgzA="checkbox" _xWYJSzae="enableVisitorPasswordCheckbox"></div>
<div class="form-grid-control-full" _xWYJSzae="visitorPasswordGroup" _PBInxfwO="display:none;"><div class="form-grid"><div class="form-grid-label"><label for="visitorPasswordInput">设置访客密码</label></div><div class="form-grid-control"><input _bBhESgzA="_jyjVKQbA" _xWYJSzae="visitorPasswordInput"></div></div></div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label" _PBInxfwO="align-self: start;"><label>Telegram 通知</label><span class="tooltip-_bQRkPPFF" _gCtLTBwD-tooltip="配置后,当有访客访问页面时,您将收到通知。">?</span></div>
<div class="form-grid-control" _PBInxfwO="flex-direction: column; align-items: stretch; gap: 8px;"><input _bBhESgzA="_jyjVKQbA" _xWYJSzae="botTokenInput" _obolMVVG="Telegram Bot Token"><input _bBhESgzA="_jyjVKQbA" _xWYJSzae="chatIdInput" _obolMVVG="Telegram Chat ID"></div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label" _PBInxfwO="align-self: start;"><label>修改管理员密码</label></div>
<div class="form-grid-control" _PBInxfwO="flex-direction: column; align-items: stretch; gap: 8px;"><input _bBhESgzA="_nnlVslgS" _xWYJSzae="oldPasswordInput" _obolMVVG="旧密码"><input _bBhESgzA="_nnlVslgS" _xWYJSzae="newPasswordInput" _obolMVVG="新密码 (至少6位)"><button _xWYJSzae="changePasswordBtn" class="btn" _PBInxfwO="align-self: flex-start; margin-_FfVUbLkg: 0;">确认修改</button></div>
</div>
</div>
<div class="modal-buttons"><button _xWYJSzae="closeModalBtn" class="btn btn-outline">关闭</button><button _xWYJSzae="saveParamsBtn" class="btn">保存并刷新</button></div>
</div>
</div>
<div _xWYJSzae="_tVWKpfLD">
<div class="_wWdhmEjm-modal-_TaQXZoLv">
<div class="_wWdhmEjm-modal-_xjygycxh"><h3 _xWYJSzae="appModalTitle"></h3><button class="modal-close-btn">×</button></div>
<div class="_wWdhmEjm-modal-_SqQMpqgf" _xWYJSzae="appModalBody"></div>
</div>
</div>
<div _xWYJSzae="_OAqoyXcb">
<div class="modal-_TaQXZoLv">
<h3>复制订阅链接</h3>
<div class="button-grid">
<div class="btn-group"><button class="btn sub-btn" _gCtLTBwD-sub-_bBhESgzA="coreEngine">Xray</button><button class="btn _MSbCmjWI-btn" _gCtLTBwD-sub-_bBhESgzA="coreEngine">Q</button></div>
<div class="btn-group"><button class="btn sub-btn" _gCtLTBwD-sub-_bBhESgzA="coreProfile">Sing-Box</button><button class="btn _MSbCmjWI-btn" _gCtLTBwD-sub-_bBhESgzA="coreProfile">Q</button></div>
<div class="btn-group"><button class="btn sub-btn" _gCtLTBwD-sub-_bBhESgzA="configProfile">Clash</button><button class="btn _MSbCmjWI-btn" _gCtLTBwD-sub-_bBhESgzA="configProfile">Q</button></div>
<div class="btn-group"><button class="btn sub-btn" _gCtLTBwD-sub-_bBhESgzA="policyProfile">Surge</button><button class="btn _MSbCmjWI-btn" _gCtLTBwD-sub-_bBhESgzA="policyProfile">Q</button></div>
</div>
<div class="modal-buttons" _PBInxfwO="justify-_TaQXZoLv: center;"><button class="btn btn-outline" _xWYJSzae="closeSubModalBtn">关闭</button></div>
</div>
</div>
<div _xWYJSzae="_DOACCHwF">
<div class="modal-_TaQXZoLv">
<img _xWYJSzae="qrCodeImg" src="" alt="QR Code">
</div>
</div>
<script>
const _KGeEehhb = {
isValid: (_zAuEMLsy) => _KGeEehhb.isIPv4(_zAuEMLsy) || _KGeEehhb.isIPv6(_zAuEMLsy),
isIPv4: (_zAuEMLsy) => {
if (typeof _zAuEMLsy !== 'string') return false;
const _ekvMeoGl = _zAuEMLsy.split('.');
if (_ekvMeoGl._QesPjbkJ !== 4) return false;
return _ekvMeoGl.every(_AdUlisUl => {
const _NyRuNGpS = parseInt(_AdUlisUl, 10);
return !isNaN(_NyRuNGpS) && _NyRuNGpS >= 0 && _NyRuNGpS <= 255 && String(_NyRuNGpS) === _AdUlisUl;
});
},
isIPv6: (_zAuEMLsy) => {
if (typeof _zAuEMLsy !== 'string') return false;
return /^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$/_ccNBJYvV.test(_zAuEMLsy);
},
toLong4: (_zAuEMLsy) => _zAuEMLsy.split('.').reduce((acc, octet, _ccNBJYvV) => acc + (parseInt(octet) << (8*(3-_ccNBJYvV))),0)>>>0,
fromLong4: (long) => [(long>>>24)&0xFF,(long>>>16)&0xFF,(long>>>8)&0xFF,long&0xFF].join('.'),
toBigInt6: (_zAuEMLsy) => {
try {
const _jrhHrKeO = _zAuEMLsy.split('/')[0];
const _ekvMeoGl = _jrhHrKeO.split('::');
if (_ekvMeoGl._QesPjbkJ > 2) return 0n;
let _snKvmCJT = [];
if (_ekvMeoGl[0]) {
_snKvmCJT = _ekvMeoGl[0].split(':');
}
let _xuGLEiKV = [];
if (_ekvMeoGl._QesPjbkJ > 1 && _ekvMeoGl[1]) {
_xuGLEiKV = _ekvMeoGl[1].split(':');
}
if (_snKvmCJT._QesPjbkJ + _xuGLEiKV._QesPjbkJ > 8) return 0n;
const _KCJtuCiX = 8 - (_snKvmCJT._QesPjbkJ + _xuGLEiKV._QesPjbkJ);
const _yLKphMwg = [
..._snKvmCJT,
...Array(_KCJtuCiX).fill('0'),
..._xuGLEiKV
].map(_AdUlisUl => _AdUlisUl || '0');
while(_yLKphMwg._QesPjbkJ < 8) {
_yLKphMwg.push('0');
}
let _lEcUvOth = 0n;
for (const _AdUlisUl of _yLKphMwg) {
if (_AdUlisUl._QesPjbkJ > 4) return 0n;
const _FjzeQSAe = BigInt('0x' + _AdUlisUl);
_lEcUvOth = (_lEcUvOth << 16n) | _FjzeQSAe;
}
return _lEcUvOth;
} catch(_SadlHwMG) {
return 0n;
}
},
fromBigInt6: (_lEcUvOth) => {
if (typeof _lEcUvOth !== '_lEcUvOth' || _lEcUvOth < 0n) return null;
const _ekvMeoGl = [];
for (let _ccNBJYvV = 0; _ccNBJYvV < 8; _ccNBJYvV++) {
_ekvMeoGl.unshift((_lEcUvOth & 0xFFFFn).toString(16));
_lEcUvOth >>= 16n;
}
let _oaxPZpVP = { start: -1, _wmgrhNgG: 0 };
let _wgEjxurj = { start: -1, _wmgrhNgG: 0 };
for (let _ccNBJYvV = 0; _ccNBJYvV < 8; _ccNBJYvV++) {
if (_ekvMeoGl[_ccNBJYvV] === '0') {
if (_wgEjxurj.start === -1) _wgEjxurj.start = _ccNBJYvV;
_wgEjxurj._wmgrhNgG++;
} else {
if (_wgEjxurj._wmgrhNgG > _oaxPZpVP._wmgrhNgG) _oaxPZpVP = { ..._wgEjxurj };
_wgEjxurj = { start: -1, _wmgrhNgG: 0 };
}
}
if (_wgEjxurj._wmgrhNgG > _oaxPZpVP._wmgrhNgG) _oaxPZpVP = { ..._wgEjxurj };
if (_oaxPZpVP._wmgrhNgG > 1) {
_ekvMeoGl.splice(_oaxPZpVP.start, _oaxPZpVP._wmgrhNgG, '');
if (_oaxPZpVP.start === 0) _ekvMeoGl.unshift('');
if (_oaxPZpVP.start + _oaxPZpVP._wmgrhNgG === 8) _ekvMeoGl.push('');
}
return _ekvMeoGl.join(':');
},
cidrToRange: (cidr, _ufeKXIEz = 1) => {
try {
const [range, bitsStr] = cidr.split('/');
const _uybNQKyo = parseInt(bitsStr, 10);
const _AUGlySic = new Set();
if (_KGeEehhb.isIPv4(range)) {
if (isNaN(_uybNQKyo) || _uybNQKyo < 8 || _uybNQKyo > 32) return [];
if (_uybNQKyo === 32) return [range];
const _LVizsWOm = _KGeEehhb.toLong4(range);
const _ZCfXdIgL = (0xFFFFFFFF << (32 - _uybNQKyo)) >>> 0;
const _vnFuBauk = _LVizsWOm & _ZCfXdIgL;
const _tzmpnbdu = 1 << (32 - _uybNQKyo);
if (_tzmpnbdu <= 2) return [];
const _vzEMlmdc = Math.min(_ufeKXIEz, _tzmpnbdu - 2);
let _aQdzfJsp = 0;
while (_AUGlySic.size < _vzEMlmdc && _aQdzfJsp < _vzEMlmdc * 5) {
const _WrTsRxfJ = Math.floor(Math.random() * (_tzmpnbdu - 2)) + 1;
_AUGlySic.add(_KGeEehhb.fromLong4((_vnFuBauk + _WrTsRxfJ) >>> 0));
_aQdzfJsp++;
}
return Array.from(_AUGlySic);
} else if (_KGeEehhb.isIPv6(range)) {
if (isNaN(_uybNQKyo) || _uybNQKyo < 16 || _uybNQKyo > 128) return [];
if (_uybNQKyo === 128) return [range];
const _VgAwsrBQ = _KGeEehhb.toBigInt6(range);
const _ZCfXdIgL = (2n ** BigInt(128 - _uybNQKyo) - 1n);
const _vnFuBauk = _VgAwsrBQ & ~_ZCfXdIgL;
const _RwEujrIi = 2n ** BigInt(128 - _uybNQKyo);
if (_RwEujrIi <= 2n) return [];
let _aQdzfJsp = 0;
while (_AUGlySic.size < _ufeKXIEz && _aQdzfJsp < _ufeKXIEz * 5) {
const _FRrLVIvr = new Uint8Array(16);
(typeof crypto !== 'undefined' ? crypto : self.crypto).getRandomValues(_FRrLVIvr);
let _VEuGGZEV = 0n;
for (const _PCqBJUiV of _FRrLVIvr) {
_VEuGGZEV = (_VEuGGZEV << 8n) | BigInt(_PCqBJUiV);
}
const _WrTsRxfJ = _VEuGGZEV % (_RwEujrIi - 2n) + 1n;
_AUGlySic.add(_KGeEehhb.fromBigInt6(_vnFuBauk + _WrTsRxfJ));
_aQdzfJsp++;
}
return Array.from(_AUGlySic);
}
return [];
} catch(_SadlHwMG) {
console.error(`CIDR to range failed for ${cidr}:`, _SadlHwMG);
return [];
}
}
};
function _NWBeAmEd(_IOwKgvxO, _jTrVGKtk) {
const _BctPdBiD = {};
const _ynNIIAge = Object._ynNIIAge(_jTrVGKtk);
const _ekvMeoGl = _ynNIIAge.map(_xtbiKbAc => {
const _PgGgLlFP = _IOwKgvxO * (_jTrVGKtk[_xtbiKbAc] / 100);
return { _xtbiKbAc, _ufeKXIEz: Math.floor(_PgGgLlFP), remainder: _PgGgLlFP - Math.floor(_PgGgLlFP) };
});
let _EMqcpvfh = _ekvMeoGl.reduce((acc, _AdUlisUl) => acc + _AdUlisUl._ufeKXIEz, 0);
_ekvMeoGl.sort((a, b) => b.remainder - a.remainder);
let _fdxCvecF = _IOwKgvxO - _EMqcpvfh;
for (let _ccNBJYvV = 0; _ccNBJYvV < _fdxCvecF; _ccNBJYvV++) {
_ekvMeoGl[_ccNBJYvV % _ekvMeoGl._QesPjbkJ]._ufeKXIEz++;
}
for (const _AdUlisUl of _ekvMeoGl) {
_BctPdBiD[_AdUlisUl._xtbiKbAc] = _AdUlisUl._ufeKXIEz;
}
return _BctPdBiD;
}
const _pyRNsMxr = __PAGE_DATA_JSON__;
const _baVqYQju = _pyRNsMxr._rtoMLCWc;
const _ajvhjdJS = _pyRNsMxr.status;
const _PcntgNKu = __ALL_CF_CIDR_LIST_JSON__;
const _cRgrEcpn = __BALANCED_CF_CIDR_LIST_JSON__;
const _lEjRaTMC = __DEFAULT_DOMAINS_LIST_JSON__;
const _znBMqhPv = __COUNTRY_MAP_JSON__;
const _oxhswWBp = _znBMqhPv;
const _pBHllbIc = 2500;
const _lVhAbTHD = navigator.hardwareConcurrency ? Math.min(16, navigator.hardwareConcurrency * 2) : 8;
const _MirUVztO = document.getElementById('_MirUVztO');
const _amOyqZXC = document.getElementById('_amOyqZXC');
const _wpqGuIWR = document.getElementById('status');
const _TBlceRpl = document.getElementById('_TBlceRpl');
const _qcPtfViX = document.getElementById('resultsTable').querySelector('tbody');
const _znRysTmu = document.getElementById('_znRysTmu');
const _jqpjBEqV = document.getElementById('cachedResultsTable').querySelector('tbody');
const _ZSbabsCD = document.getElementById('notificationTooltip');
const _bPywTOnC = document.getElementById('_bPywTOnC');
const _haUNcfIZ = document.getElementById('_haUNcfIZ');
const _tVWKpfLD = document.getElementById('_tVWKpfLD');
const _OAqoyXcb = document.getElementById('_OAqoyXcb');
const _DOACCHwF = document.getElementById('_DOACCHwF');
const _mabVbMiR = document.getElementById('_mabVbMiR');
const _cjNeEisV = document.getElementById('_cjNeEisV');
let _uBkSlmjL = null;
let _TOkcFdEP = null;
let _HPeENrgx = [];
let _OkpBynlm = false;
let _lgtxzTRl = null;
function _EVvwoISk(_ssCFhRRI, _sFKerWjw) {
const _gGCFbiGo=parseInt(_ssCFhRRI.slice(1),16),t=_sFKerWjw<0?0:255,p=_sFKerWjw<0?_sFKerWjw*-1:_sFKerWjw,R=_gGCFbiGo>>16,G=_gGCFbiGo>>8&0x00FF,B=_gGCFbiGo&0x0000FF;
const _ikbvNyEV = Math.round((t-R)*p)+R;
const _UmFsGIEX = Math.round((t-G)*p)+G;
const _pqhOvWzb = Math.round((t-B)*p)+B;
return `rgb(${_ikbvNyEV.toString()}, ${_UmFsGIEX.toString()}, ${_pqhOvWzb.toString()})`;
}
function _ZdxsZWYF(_lPgSFjNx) {
const _xGeeFiKX = _bXnQwjrE(_lPgSFjNx.primaryColor);
if(_xGeeFiKX) {
document.documentElement._PBInxfwO.setProperty('--primary-_JXqLrphm-rgb', `${_xGeeFiKX.r},${_xGeeFiKX.g},${_xGeeFiKX.b}`);
}
document.documentElement._PBInxfwO.setProperty('--primary-_JXqLrphm', _lPgSFjNx.primaryColor);
document.documentElement._PBInxfwO.setProperty('--primary-hover', _EVvwoISk(_lPgSFjNx.primaryColor, -0.1));
document.documentElement._PBInxfwO.setProperty('--primary-gradient-start', _EVvwoISk(_lPgSFjNx.primaryColor, 0.1));
document.documentElement._PBInxfwO.setProperty('--primary-gradient-end', _EVvwoISk(_lPgSFjNx.primaryColor, -0.1));
document.getElementById('pageTitle').innerText = _lPgSFjNx.texts.title;
document.title = _lPgSFjNx.texts.title;
_bPywTOnC.innerText = _uBkSlmjL ? _lPgSFjNx.texts.loginButtonSuccess : _lPgSFjNx.texts.loginButton;
_bPywTOnC._PBInxfwO._JXqLrphm = _lPgSFjNx.colors.loginButton;
document.getElementById('appDownloadTitleEl').innerText = _lPgSFjNx.texts.appDownloadTitle;
document.getElementById('liveTitleEl').innerText = _lPgSFjNx.texts.liveTitle;
document.getElementById('liveTitleEl')._PBInxfwO._JXqLrphm = _lPgSFjNx.colors.liveTitle;
document.getElementById('cachedTitleEl').innerText = _lPgSFjNx.texts.cachedTitle;
document.getElementById('cachedTitleEl')._PBInxfwO._JXqLrphm = _lPgSFjNx.colors.cachedTitle;
const _DadfZrLA = ['tableHeader1El', 'tableHeader2El', 'tableHeader3El', 'tableHeader4El', 'tableHeader5El', 'tableHeader6El', 'tableHeader7El'];
_DadfZrLA.forEach((_xWYJSzae, _ufQpLglS) => {
const _mTmFHckf = document.getElementById(_xWYJSzae);
if (_mTmFHckf) _mTmFHckf.innerText = _lPgSFjNx.texts[`tableHeader${_ufQpLglS + 1}`] || '';
});
const _WbwJVouI = ['cachedTableHeader1El', 'cachedTableHeader2El', 'cachedTableHeader3El', 'cachedTableHeader4El', 'cachedTableHeader5El', 'cachedTableHeader6El', 'cachedTableHeader7El'];
_WbwJVouI.forEach((_xWYJSzae, _ufQpLglS) => {
const _mTmFHckf = document.getElementById(_xWYJSzae);
if (_mTmFHckf) _mTmFHckf.innerText = _baVqYQju.texts[`tableHeader${_ufQpLglS + 1}`] || '';
});
document.querySelectorAll('th').forEach(th => th._PBInxfwO._JXqLrphm = _lPgSFjNx.colors.tableHeader);
document._SqQMpqgf.className = '';
document._SqQMpqgf.classList.add(_lPgSFjNx.theme);
if (['theme-particles-glass', 'theme-modern-glass', 'theme-aurora-glass', 'theme-cyberpunk-glass'].includes(_lPgSFjNx.theme)) {
document._SqQMpqgf.classList.add('glassy-components');
}
document._SqQMpqgf._PBInxfwO.backgroundImage = '';
_TxOILtDY();
if (_lPgSFjNx.theme.includes('particles') || _lPgSFjNx.theme.includes('glass')) {
_SoUOYnRr(_lPgSFjNx.particleColor);
} else if (_lPgSFjNx.theme.includes('bing')) {
document._SqQMpqgf._PBInxfwO.backgroundImage = '_MzNfaJoq(/bing-wallpaper)';
}
}
function _mpNwERst() {
_uBkSlmjL = null;
if(_TOkcFdEP) clearTimeout(_TOkcFdEP);
_ZdxsZWYF(_baVqYQju);
_tTJEnYku("登录已超时,请重新登录。", "warning");
}
async function _ITkbezjc() {
if (_uBkSlmjL) {
_QjJTWenM();
return;
}
const _gEVUwEGz = prompt('请输入管理员密码:');
if (!_gEVUwEGz) return;
try {
const _CNKyhQXn = await fetch('/api/verify-_nnlVslgS', {
method: 'POST',
_DadfZrLA: { 'Content-Type': 'application/json' },
_SqQMpqgf: JSON.stringify({ _nnlVslgS: _gEVUwEGz })
});
const _KYJgvwFB = await _CNKyhQXn.json();
if (_KYJgvwFB.success) {
_uBkSlmjL = _gEVUwEGz;
_tTJEnYku("登录成功!有效期5分钟。", "success");
if (_TOkcFdEP) clearTimeout(_TOkcFdEP);
_TOkcFdEP = setTimeout(_mpNwERst, 5 * 60 * 1000);
_ZdxsZWYF(_baVqYQju);
_QjJTWenM();
} else {
throw new Error(_KYJgvwFB._rMNQVEWf || '密码验证失败');
}
} catch (_SadlHwMG) {
_tTJEnYku(`登录失败: ${_SadlHwMG._rMNQVEWf}`, "error");
}
}
function _aWNahXwi() {
if (!_ajvhjdJS._hKdjYWeo) {
_mabVbMiR._PBInxfwO.display = 'flex';
document.getElementById('setInitialPasswordBtn').addEventListener('click', async () => {
const _nnlVslgS = document.getElementById('initialPassword')._FjzeQSAe;
const _pWFrhqcB = document.getElementById('confirmPassword')._FjzeQSAe;
if (_nnlVslgS !== _pWFrhqcB) {
_tTJEnYku("两次输入的密码不一致!", "error");
return;
}
if (_nnlVslgS._QesPjbkJ < 6) {
_tTJEnYku("密码长度不能少于6位!", "error");
return;
}
try {
const _CNKyhQXn = await fetch('/api/_HXFvlboj-_nnlVslgS', {
method: 'POST',
_DadfZrLA: { 'Content-Type': 'application/json' },
_SqQMpqgf: JSON.stringify({ _nnlVslgS })
});
const _KYJgvwFB = await _CNKyhQXn.json();
if (_KYJgvwFB.success) {
_tTJEnYku(_KYJgvwFB._rMNQVEWf, "success");
setTimeout(() => _VAZxHmhz.reload(), 1500);
} else {
throw new Error(_KYJgvwFB._rMNQVEWf);
}
} catch(_SadlHwMG) {
_tTJEnYku(`设置密码失败: ${_SadlHwMG._rMNQVEWf}`, "error");
}
});
return;
}
_bPywTOnC.addEventListener('click', _ITkbezjc);
document.getElementById('closeModalBtn').addEventListener('click', () => { _haUNcfIZ._PBInxfwO.display = 'none'; });
_haUNcfIZ.addEventListener('click', (_SadlHwMG) => { if (_SadlHwMG.target === _haUNcfIZ) _haUNcfIZ._PBInxfwO.display = 'none'; });
document.getElementById('enableAllSourcesCheckbox').addEventListener('change', function() {
if (this.checked) {
document.querySelectorAll('#fine-grained-sources-_QcWGMwDA .fine-grained-_xTaAvhYb-cb').forEach(cb => cb.checked = true);
document.getElementById('disableAllSourcesCheckbox').checked = false;
this.checked = false;
}
});
document.getElementById('disableAllSourcesCheckbox').addEventListener('change', function() {
if (this.checked) {
document.querySelectorAll('#fine-grained-sources-_QcWGMwDA .fine-grained-_xTaAvhYb-cb').forEach(cb => cb.checked = false);
document.getElementById('enableAllSourcesCheckbox').checked = false;
this.checked = false;
}
});
document.getElementById('saveParamsBtn').addEventListener('click', async () => {
if (!_uBkSlmjL) {
_tTJEnYku("请先通过点击右上角按钮输入密码。", "error");
return;
}
const _bBKGNGpf = [];
document.querySelectorAll('#custom-fields-_QcWGMwDA .custom-field-_eaEdPQlc').forEach(_eaEdPQlc => {
const _ckFbtgjN = _eaEdPQlc.querySelector('.custom-field-_ckFbtgjN')._FjzeQSAe.trim();
const _FjzeQSAe = _eaEdPQlc.querySelector('.custom-field-_FjzeQSAe')._FjzeQSAe.trim();
if (_ckFbtgjN) _bBKGNGpf.push({ _ckFbtgjN, _FjzeQSAe });
});
const _VRKzpBsE = [];
document.querySelectorAll('#parameter-sets-_QcWGMwDA .parameter-_HXFvlboj-_eaEdPQlc').forEach(_eaEdPQlc => {
const _ckFbtgjN = _eaEdPQlc.querySelector('.param-_HXFvlboj-_ckFbtgjN')._FjzeQSAe.trim();
const _QAfgwnWs = _eaEdPQlc.querySelector('.param-_HXFvlboj-_QAfgwnWs')._FjzeQSAe.trim();
const _jzCHUaST = _eaEdPQlc.querySelector('.param-_HXFvlboj-_jzCHUaST')._FjzeQSAe.trim();
const _kBOGxKZb = _eaEdPQlc.querySelector('.param-_HXFvlboj-_kBOGxKZb')._FjzeQSAe.trim();
if(_ckFbtgjN) _VRKzpBsE.push({ _ckFbtgjN, _QAfgwnWs, '_jzCHUaST': _jzCHUaST, _kBOGxKZb });
});
const _MpxifLTq = [];
document.querySelectorAll('#fine-grained-sources-_QcWGMwDA .fine-grained-_MlvCFpRY-_eaEdPQlc').forEach(_eaEdPQlc => {
const _VAZxHmhz = _eaEdPQlc.querySelector('.fine-grained-_VAZxHmhz')._FjzeQSAe.trim();
const _AUGlySic = _eaEdPQlc.querySelector('.fine-grained-_AUGlySic')._FjzeQSAe.trim();
const _xTaAvhYb = _eaEdPQlc.querySelector('.fine-grained-_xTaAvhYb-cb').checked;
const _CSAvOhoQ = parseInt(_eaEdPQlc.querySelector('.fine-grained-_CSAvOhoQ')._FjzeQSAe, 10) || 0;
const _pAkoNRhV = _eaEdPQlc.querySelector('.use-_ckFbtgjN-as-_VAZxHmhz-cb').checked;
if (_VAZxHmhz && _AUGlySic) {
_MpxifLTq.push({ _VAZxHmhz, _AUGlySic, _xTaAvhYb, _CSAvOhoQ, _pAkoNRhV });
}
});
let _zSzyfRSc = parseInt(document.getElementById('subscriptionIdLength')._FjzeQSAe, 10);
if (isNaN(_zSzyfRSc) || _zSzyfRSc < 2) _zSzyfRSc = 2;
if (_zSzyfRSc > 128) _zSzyfRSc = 128;
const _JAiIKqZD = {
theme: document.getElementById('themeSelect')._FjzeQSAe,
primaryColor: document.getElementById('primaryColorInput')._FjzeQSAe,
particleColor: document.getElementById('particleColorInput')._FjzeQSAe,
useResolvedDomains: document.getElementById('useResolvedDomainsCheckbox').checked,
resolvedDomains: document.getElementById('resolvedDomainsInput')._FjzeQSAe,
sampleSize: parseInt(document.getElementById('sampleSizeInput')._FjzeQSAe, 10) || 1000,
topN: parseInt(document.getElementById('topNInput')._FjzeQSAe, 10) || 15,
rttRandomMin: parseInt(document.getElementById('latencyRangeMinInput')._FjzeQSAe, 10) || 0,
rttRandomMax: parseInt(document.getElementById('latencyRangeMaxInput')._FjzeQSAe, 10) || 0,
_uPWvIonq: document.getElementById('converterServiceUrlInput')._FjzeQSAe.trim(),
subscriptionId: {
_QesPjbkJ: _zSzyfRSc,
_BXalCNft: document.getElementById('subscriptionIdCharset')._FjzeQSAe.trim()
},
api: {
_xTaAvhYb: document.getElementById('enableApiCheckbox').checked,
_rMNQVEWf: document.getElementById('apiMessageInput')._FjzeQSAe || '维护中...',
},
ispFilter: {
_xTaAvhYb: document.getElementById('enableIspFilterCheckbox').checked
},
geoLocation: {
retries: parseInt(document.getElementById('geoLocationRetriesInput')._FjzeQSAe, 10) || 0,
filterUnknown: document.getElementById('filterUnknownGeoCheckbox').checked
},
streamer: {
_xTaAvhYb: document.getElementById('enableStreamerCheckbox').checked
},
websocketStreamer: {
_xTaAvhYb: document.getElementById('enableWebsocketStreamerCheckbox').checked,
_MzNfaJoq: document.getElementById('websocketStreamerUrlInput')._FjzeQSAe.trim()
},
visitorPassword: {
_xTaAvhYb: document.getElementById('enableVisitorPasswordCheckbox').checked,
_nnlVslgS: document.getElementById('visitorPasswordInput')._FjzeQSAe.trim()
},
customSubPath: {
_xTaAvhYb: document.getElementById('enableCustomSubPathCheckbox').checked,
_kBOGxKZb: document.getElementById('customSubPathInput')._FjzeQSAe.trim()
},
itemLink: {
_xTaAvhYb: document.getElementById('enableItemLinkCheckbox').checked,
template: document.getElementById('itemLinkTemplateInput')._FjzeQSAe,
selectionMode: document.getElementById('parameterSelectionMode')._FjzeQSAe,
_VRKzpBsE: _VRKzpBsE,
_bBKGNGpf: _bBKGNGpf,
},
dataFeeds: {
universalFallbackAddress: document.getElementById('universalFallbackAddressInput')._FjzeQSAe.trim(),
},
announcement: {
popup: {
_xTaAvhYb: document.getElementById('enablePopup').checked,
_jyjVKQbA: document.getElementById('announcementText')._FjzeQSAe,
_FFXiMqTd: parseInt(document.getElementById('popupDuration')._FjzeQSAe, 10) || 5
},
marquee: {
_xTaAvhYb: document.getElementById('enableMarquee').checked,
_jyjVKQbA: document.getElementById('announcementText')._FjzeQSAe
}
},
fineGrained: {
_xTaAvhYb: true,
sources: _MpxifLTq
},
customNodes: {
_xTaAvhYb: document.getElementById('enableCustomNodesCheckbox').checked,
list: document.getElementById('customNodesInput')._FjzeQSAe
},
texts: {
title: document.getElementById('textInput_title')._FjzeQSAe,
loginButton: document.getElementById('textInput_loginButton')._FjzeQSAe,
loginButtonSuccess: '修改参数',
appDownloadTitle: document.getElementById('textInput_appDownloadTitle')._FjzeQSAe,
liveTitle: document.getElementById('textInput_liveTitle')._FjzeQSAe,
cachedTitle: document.getElementById('textInput_cachedTitle')._FjzeQSAe,
},
colors: {
title: document.getElementById('colorInput_title')._FjzeQSAe,
loginButton: document.getElementById('colorInput_loginButton')._FjzeQSAe,
liveTitle: document.getElementById('colorInput_liveTitle')._FjzeQSAe,
cachedTitle: document.getElementById('colorInput_cachedTitle')._FjzeQSAe,
tableHeader: document.getElementById('colorInput_tableHeader')._FjzeQSAe,
},
telegram: {
bot_token: document.getElementById('botTokenInput')._FjzeQSAe.trim(),
chat_id: document.getElementById('chatIdInput')._FjzeQSAe.trim(),
},
};
try {
const _CNKyhQXn = await fetch('/api/_rtoMLCWc', {
method: 'POST',
_DadfZrLA: { 'Content-Type': 'application/json' },
_SqQMpqgf: JSON.stringify({ _rtoMLCWc: _JAiIKqZD, adminPassword: _uBkSlmjL })
});
const _KYJgvwFB = await _CNKyhQXn.json();
if (_CNKyhQXn.ok && _KYJgvwFB.success) {
_tTJEnYku("配置已保存,正在刷新...", "success");
setTimeout(() => _VAZxHmhz.reload(), 1500);
} else {
throw new Error(_KYJgvwFB._rMNQVEWf || '未知错误');
}
} catch (_SadlHwMG) {
_tTJEnYku(`操作失败: ${_SadlHwMG._rMNQVEWf}`, "error");
if (String(_SadlHwMG._rMNQVEWf).includes("密码错误")) {
_mpNwERst();
}
}
});
document.getElementById('changePasswordBtn').addEventListener('click', async () => {
const _fnzTOSpq = document.getElementById('oldPasswordInput')._FjzeQSAe;
const _ZrHEFnvG = document.getElementById('newPasswordInput')._FjzeQSAe;
if (!_fnzTOSpq || !_ZrHEFnvG) {
_tTJEnYku("新旧密码均不能为空!", "error");
return;
}
try {
const _CNKyhQXn = await fetch('/api/change-_nnlVslgS', {
method: 'POST',
_DadfZrLA: { 'Content-Type': 'application/json' },
_SqQMpqgf: JSON.stringify({ _fnzTOSpq, _ZrHEFnvG })
});
const _KYJgvwFB = await _CNKyhQXn.json();
if (_KYJgvwFB.success) {
_tTJEnYku(_KYJgvwFB._rMNQVEWf, "success");
document.getElementById('oldPasswordInput')._FjzeQSAe = '';
document.getElementById('newPasswordInput')._FjzeQSAe = '';
_uBkSlmjL = _ZrHEFnvG;
} else {
throw new Error(_KYJgvwFB._rMNQVEWf);
}
} catch(_SadlHwMG) {
_tTJEnYku(`修改密码失败: ${_SadlHwMG._rMNQVEWf}`, "error");
}
});
document.getElementById('useResolvedDomainsCheckbox').addEventListener('change', (_SadlHwMG) => {
document.getElementById('resolvedDomainsGroup')._PBInxfwO.display = _SadlHwMG.target.checked ? 'block' : 'none';
});
document.getElementById('enableCustomNodesCheckbox').addEventListener('change', (_SadlHwMG) => {
document.getElementById('customNodesGroup')._PBInxfwO.display = _SadlHwMG.target.checked ? 'block' : 'none';
});
document.getElementById('enableApiCheckbox').addEventListener('change', (_SadlHwMG) => {
document.getElementById('apiConfigGroup')._PBInxfwO.display = _SadlHwMG.target.checked ? 'block' : 'none';
});
document.getElementById('enableItemLinkCheckbox').addEventListener('change', (_SadlHwMG) => {
document.getElementById('itemLinkConfigGroup')._PBInxfwO.display = _SadlHwMG.target.checked ? 'block' : 'none';
});
document.getElementById('enableWebsocketStreamerCheckbox').addEventListener('change', (_SadlHwMG) => {
document.getElementById('websocketStreamerGroup')._PBInxfwO.display = _SadlHwMG.target.checked ? 'block' : 'none';
const _ohFyXNSu = document.querySelector('#parameter-sets-_QcWGMwDA .param-_HXFvlboj-_kBOGxKZb');
if (_ohFyXNSu) {
if (_SadlHwMG.target.checked) {
_ohFyXNSu._FjzeQSAe = '/snippets?_zAuEMLsy=endpointAddress:_AWekBocW(443)&nat64=6to4';
} else {
_ohFyXNSu._FjzeQSAe = '/?ed=2560';
}
}
});
document.getElementById('add-custom-field-btn').addEventListener('click', () => {
_Dmluvmul('', '');
});
document.getElementById('add-parameter-_HXFvlboj-btn').addEventListener('click', () => {
const _ufeKXIEz = document.querySelectorAll('.parameter-_HXFvlboj-_eaEdPQlc')._QesPjbkJ + 1;
_iXdoWtFN({_ckFbtgjN: `配置${_ufeKXIEz}`, _QAfgwnWs: '', _jzCHUaST: '', _kBOGxKZb: ''});
_vNdAMuHI();
});
document.getElementById('add-fine-grained-_MlvCFpRY-btn').addEventListener('click', () => {
_EVjtfMca({ _VAZxHmhz: '', _AUGlySic: '', _xTaAvhYb: true, _CSAvOhoQ: 50, _pAkoNRhV: false });
});
document.getElementById('enableVisitorPasswordCheckbox').addEventListener('change', (_SadlHwMG) => {
document.getElementById('visitorPasswordGroup')._PBInxfwO.display = _SadlHwMG.target.checked ? 'block' : 'none';
});
document.getElementById('enableCustomSubPathCheckbox').addEventListener('change', (_SadlHwMG) => {
document.getElementById('customSubPathGroup')._PBInxfwO.display = _SadlHwMG.target.checked ? 'block' : 'none';
});
document.getElementById('enablePopup').addEventListener('change', (_SadlHwMG) => {
document.getElementById('popupDurationContainer')._PBInxfwO.display = _SadlHwMG.target.checked ? 'flex' : 'none';
});
}
function _Dmluvmul(_ckFbtgjN, _FjzeQSAe) {
const _QcWGMwDA = document.getElementById('custom-fields-_QcWGMwDA');
const _wIQeIKzP = document.createElement('div');
_wIQeIKzP.className = 'form-grid custom-field-_eaEdPQlc';
_wIQeIKzP._PBInxfwO = 'grid-template-columns: 1fr 1fr auto; gap: 5px; margin-bottom: 5px;';
_wIQeIKzP.innerHTML = `
<input _bBhESgzA="_jyjVKQbA" class="custom-field-_ckFbtgjN" _obolMVVG="占位符名称" _FjzeQSAe="${_ckFbtgjN}">
<input _bBhESgzA="_jyjVKQbA" class="custom-field-_FjzeQSAe" _obolMVVG="值" _FjzeQSAe="${_FjzeQSAe}">
<button _bBhESgzA="button" class="btn btn-outline" onclick="this.closest('.form-grid').remove()">删除</button>
`;
_QcWGMwDA.appendChild(_wIQeIKzP);
}
function _iXdoWtFN(_HXFvlboj) {
const _QcWGMwDA = document.getElementById('parameter-sets-_QcWGMwDA');
const _wIQeIKzP = document.createElement('div');
_wIQeIKzP.className = 'parameter-_HXFvlboj-_eaEdPQlc';
_wIQeIKzP.innerHTML = `
<div class="parameter-_HXFvlboj-_xjygycxh">
<input _bBhESgzA="_jyjVKQbA" class="param-_HXFvlboj-_ckFbtgjN" _obolMVVG="配置名称" _FjzeQSAe="${_HXFvlboj._ckFbtgjN}" oninput="_vNdAMuHI()">
<button _bBhESgzA="button" class="btn btn-outline" onclick="this.closest('.parameter-_HXFvlboj-_eaEdPQlc').remove(); _vNdAMuHI();">删除</button>
</div>
<div class="form-grid">
<div class="form-grid-label"><label>Host</label></div><div class="form-grid-control"><input _bBhESgzA="_jyjVKQbA" class="param-_HXFvlboj-_QAfgwnWs" _FjzeQSAe="${_HXFvlboj._QAfgwnWs || ''}"></div>
<div class="form-grid-label"><label>ID</label></div><div class="form-grid-control"><input _bBhESgzA="_jyjVKQbA" class="param-_HXFvlboj-_jzCHUaST" _FjzeQSAe="${_HXFvlboj['_jzCHUaST'] || ''}"></div>
<div class="form-grid-label"><label>Path</label></div><div class="form-grid-control"><input _bBhESgzA="_jyjVKQbA" class="param-_HXFvlboj-_kBOGxKZb" _FjzeQSAe="${_HXFvlboj._kBOGxKZb || ''}"></div>
</div>
`;
_QcWGMwDA.appendChild(_wIQeIKzP);
}
function _vNdAMuHI() {
const _OXtyUgYC = document.getElementById('parameterSelectionMode');
const _muVHpoBh = _OXtyUgYC._FjzeQSAe;
_OXtyUgYC.innerHTML = '';
const _OBBTJPKP = document.createElement('_GllpaWAU');
_OBBTJPKP._FjzeQSAe = 'random';
_OBBTJPKP.textContent = '随机轮询';
_OXtyUgYC.appendChild(_OBBTJPKP);
const _rdXeNlHQ = document.createElement('_GllpaWAU');
_rdXeNlHQ._FjzeQSAe = 'first';
_rdXeNlHQ.textContent = '使用第一组';
_OXtyUgYC.appendChild(_rdXeNlHQ);
document.querySelectorAll('.param-_HXFvlboj-_ckFbtgjN').forEach(input => {
const _ckFbtgjN = input._FjzeQSAe.trim();
if (_ckFbtgjN) {
const _GllpaWAU = document.createElement('_GllpaWAU');
_GllpaWAU._FjzeQSAe = _ckFbtgjN;
_GllpaWAU.textContent = `指定: ${_ckFbtgjN}`;
_OXtyUgYC.appendChild(_GllpaWAU);
}
});
if (Array.from(_OXtyUgYC.options).some(opt => opt._FjzeQSAe === _muVHpoBh)) {
_OXtyUgYC._FjzeQSAe = _muVHpoBh;
} else {
_OXtyUgYC._FjzeQSAe = 'random';
}
}
function _EVjtfMca(_MlvCFpRY) {
const _QcWGMwDA = document.getElementById('fine-grained-sources-_QcWGMwDA');
const _wIQeIKzP = document.createElement('div');
_wIQeIKzP.className = 'fine-grained-_MlvCFpRY-_eaEdPQlc parameter-_HXFvlboj-_eaEdPQlc';
_wIQeIKzP._PBInxfwO.padding = '1rem';
const _HtgQNlHA = _MlvCFpRY._pAkoNRhV ? 'checked' : '';
const _timrchOT = !_MlvCFpRY._pAkoNRhV ? 'checked' : '';
const _pcZhPPDq = _MlvCFpRY._xTaAvhYb ? 'checked' : '';
_wIQeIKzP.innerHTML = `
<div _PBInxfwO="display: grid; grid-template-columns: 1fr auto auto; gap: 10px; align-items: center; margin-bottom: 1rem;">
<input _bBhESgzA="_jyjVKQbA" class="fine-grained-_VAZxHmhz" _obolMVVG="地区名称 (如: 香港)" _FjzeQSAe="${_MlvCFpRY._VAZxHmhz || ''}">
<div _PBInxfwO="display: flex; align-items: center; gap: 5px;"><input _bBhESgzA="checkbox" class="fine-grained-_xTaAvhYb-cb" ${_pcZhPPDq}><label>启用</label></div>
<button _bBhESgzA="button" class="btn btn-outline" onclick="this.closest('.fine-grained-_MlvCFpRY-_eaEdPQlc').remove()">删除</button>
</div>
<textarea class="fine-grained-_AUGlySic" _obolMVVG="IP源 (每行一个IP、CIDR或URL)" _ssjNcqkd="3" _PBInxfwO="_IqvxpuUK:100%;">${_MlvCFpRY._AUGlySic || ''}</textarea>
<div class="fine-grained-options" _PBInxfwO="justify-_TaQXZoLv: space-between;">
<div _PBInxfwO="display: flex; gap: 1rem;">
<label><input _bBhESgzA="checkbox" class="query-_LFHzjGIb-cb" ${_timrchOT}>查询真实归属地</label>
<label><input _bBhESgzA="checkbox" class="use-_ckFbtgjN-as-_VAZxHmhz-cb" ${_HtgQNlHA}>使用地区名称作为归属地</label>
</div>
<div _PBInxfwO="display: flex; align-items: center; gap: 5px;"><input _bBhESgzA="number" class="fine-grained-_CSAvOhoQ _CSAvOhoQ-input" _FjzeQSAe="${_MlvCFpRY._CSAvOhoQ || 0}" min="0" max="100"><span>%</span></div>
</div>
`;
const _WPrOevZu = _wIQeIKzP.querySelector('.query-_LFHzjGIb-cb');
const _FJpPduuz = _wIQeIKzP.querySelector('.use-_ckFbtgjN-as-_VAZxHmhz-cb');
_WPrOevZu.addEventListener('change', () => {
if (_WPrOevZu.checked) {
_FJpPduuz.checked = false;
} else if (!_FJpPduuz.checked) {
_WPrOevZu.checked = true;
}
});
_FJpPduuz.addEventListener('change', () => {
if (_FJpPduuz.checked) {
_WPrOevZu.checked = false;
} else if (!_FJpPduuz.checked) {
_FJpPduuz.checked = true;
}
});
_QcWGMwDA.appendChild(_wIQeIKzP);
}
function _QjJTWenM() {
const _lPgSFjNx = _baVqYQju;
document.getElementById('themeSelect')._FjzeQSAe = _lPgSFjNx.theme;
document.getElementById('primaryColorInput')._FjzeQSAe = _lPgSFjNx.primaryColor;
document.getElementById('particleColorInput')._FjzeQSAe = _lPgSFjNx.particleColor;
document.getElementById('useResolvedDomainsCheckbox').checked = _lPgSFjNx.useResolvedDomains;
document.getElementById('resolvedDomainsInput')._obolMVVG = '留空则使用内置默认域名';
document.getElementById('resolvedDomainsInput')._FjzeQSAe = _lPgSFjNx.resolvedDomains || '';
document.getElementById('resolvedDomainsGroup')._PBInxfwO.display = _lPgSFjNx.useResolvedDomains ? 'block' : 'none';
document.getElementById('enableCustomNodesCheckbox').checked = _lPgSFjNx.customNodes._xTaAvhYb;
document.getElementById('customNodesInput')._FjzeQSAe = _lPgSFjNx.customNodes.list || '';
document.getElementById('customNodesGroup')._PBInxfwO.display = _lPgSFjNx.customNodes._xTaAvhYb ? 'block' : 'none';
document.getElementById('converterServiceUrlInput')._FjzeQSAe = _lPgSFjNx._uPWvIonq || '';
document.getElementById('subscriptionIdLength')._FjzeQSAe = _lPgSFjNx.subscriptionId._QesPjbkJ;
document.getElementById('subscriptionIdCharset')._FjzeQSAe = _lPgSFjNx.subscriptionId._BXalCNft;
document.getElementById('enableItemLinkCheckbox').checked = _lPgSFjNx.itemLink._xTaAvhYb;
document.getElementById('itemLinkConfigGroup')._PBInxfwO.display = _lPgSFjNx.itemLink._xTaAvhYb ? 'block' : 'none';
document.getElementById('itemLinkTemplateInput')._FjzeQSAe = _lPgSFjNx.itemLink.template;
const _aojFkPni = document.getElementById('parameter-sets-_QcWGMwDA');
_aojFkPni.innerHTML = '';
if (_lPgSFjNx.itemLink._VRKzpBsE && Array.isArray(_lPgSFjNx.itemLink._VRKzpBsE)) {
_lPgSFjNx.itemLink._VRKzpBsE.forEach(_HXFvlboj => _iXdoWtFN(_HXFvlboj));
}
_vNdAMuHI();
document.getElementById('parameterSelectionMode')._FjzeQSAe = _lPgSFjNx.itemLink.selectionMode || 'random';
const _ohFyXNSu = document.querySelector('#parameter-sets-_QcWGMwDA .param-_HXFvlboj-_kBOGxKZb');
if (_ohFyXNSu && _lPgSFjNx.websocketStreamer && _lPgSFjNx.websocketStreamer._xTaAvhYb) {
_ohFyXNSu._FjzeQSAe = '/snippets?_zAuEMLsy=endpointAddress:_AWekBocW(443)&nat64=6to4';
}
const _pDUIoBwz = document.getElementById('custom-fields-_QcWGMwDA');
_pDUIoBwz.innerHTML = '';
if (_lPgSFjNx.itemLink._bBKGNGpf && Array.isArray(_lPgSFjNx.itemLink._bBKGNGpf)) {
_lPgSFjNx.itemLink._bBKGNGpf.forEach(field => _Dmluvmul(field._ckFbtgjN, field._FjzeQSAe));
}
document.getElementById('universalFallbackAddressInput')._FjzeQSAe = _lPgSFjNx.dataFeeds.universalFallbackAddress || '';
const _inSbnWDS = _lPgSFjNx.websocketStreamer && _lPgSFjNx.websocketStreamer._xTaAvhYb;
document.getElementById('enableWebsocketStreamerCheckbox').checked = _inSbnWDS;
document.getElementById('websocketStreamerUrlInput')._FjzeQSAe = _lPgSFjNx.websocketStreamer ? _lPgSFjNx.websocketStreamer._MzNfaJoq : 'https://snippets.neib.cn';
document.getElementById('websocketStreamerGroup')._PBInxfwO.display = _inSbnWDS ? 'block' : 'none';
const _uDewyelt = _lPgSFjNx.announcement || {};
document.getElementById('announcementText')._FjzeQSAe = (_uDewyelt.popup && _uDewyelt.popup._jyjVKQbA) || (_uDewyelt.marquee && _uDewyelt.marquee._jyjVKQbA) || '';
document.getElementById('enableMarquee').checked = _uDewyelt.marquee && _uDewyelt.marquee._xTaAvhYb;
document.getElementById('enablePopup').checked = _uDewyelt.popup && _uDewyelt.popup._xTaAvhYb;
document.getElementById('popupDuration')._FjzeQSAe = (_uDewyelt.popup && _uDewyelt.popup._FFXiMqTd) || 5;
document.getElementById('popupDurationContainer')._PBInxfwO.display = (_uDewyelt.popup && _uDewyelt.popup._xTaAvhYb) ? 'flex' : 'none';
const _TFHHpYQa = document.getElementById('fine-grained-sources-_QcWGMwDA');
_TFHHpYQa.innerHTML = '';
if (_lPgSFjNx.fineGrained.sources && Array.isArray(_lPgSFjNx.fineGrained.sources)) {
_lPgSFjNx.fineGrained.sources.forEach(_MlvCFpRY => _EVjtfMca(_MlvCFpRY));
}
document.getElementById('sampleSizeInput')._FjzeQSAe = _lPgSFjNx.sampleSize;
document.getElementById('topNInput')._FjzeQSAe = _lPgSFjNx.topN;
document.getElementById('latencyRangeMinInput')._FjzeQSAe = _lPgSFjNx.rttRandomMin;
document.getElementById('latencyRangeMaxInput')._FjzeQSAe = _lPgSFjNx.rttRandomMax;
document.getElementById('enableIspFilterCheckbox').checked = _lPgSFjNx.ispFilter._xTaAvhYb;
const _CbpwoNOU = _lPgSFjNx.geoLocation || { retries: 1, filterUnknown: false };
document.getElementById('geoLocationRetriesInput')._FjzeQSAe = _CbpwoNOU.retries;
document.getElementById('filterUnknownGeoCheckbox').checked = _CbpwoNOU.filterUnknown;
document.getElementById('enableStreamerCheckbox').checked = _lPgSFjNx.streamer._xTaAvhYb;
document.getElementById('enableApiCheckbox').checked = _lPgSFjNx.api._xTaAvhYb;
document.getElementById('apiConfigGroup')._PBInxfwO.display = _lPgSFjNx.api._xTaAvhYb ? 'block' : 'none';
document.getElementById('apiMessageInput')._FjzeQSAe = _lPgSFjNx.api._rMNQVEWf;
const _JollunIJ = _lPgSFjNx.customSubPath && _lPgSFjNx.customSubPath._xTaAvhYb;
document.getElementById('enableCustomSubPathCheckbox').checked = _JollunIJ;
document.getElementById('customSubPathInput')._FjzeQSAe = _lPgSFjNx.customSubPath ? _lPgSFjNx.customSubPath._kBOGxKZb : 'latest';
document.getElementById('customSubPathGroup')._PBInxfwO.display = _JollunIJ ? 'block' : 'none';
const _cqAZgusp = _lPgSFjNx.visitorPassword && _lPgSFjNx.visitorPassword._xTaAvhYb;
document.getElementById('enableVisitorPasswordCheckbox').checked = _cqAZgusp;
document.getElementById('visitorPasswordInput')._FjzeQSAe = _lPgSFjNx.visitorPassword ? _lPgSFjNx.visitorPassword._nnlVslgS : '';
document.getElementById('visitorPasswordGroup')._PBInxfwO.display = _cqAZgusp ? 'block' : 'none';
document.getElementById('textInput_title')._FjzeQSAe = _lPgSFjNx.texts.title;
document.getElementById('textInput_loginButton')._FjzeQSAe = _lPgSFjNx.texts.loginButton;
document.getElementById('textInput_appDownloadTitle')._FjzeQSAe = _lPgSFjNx.texts.appDownloadTitle;
document.getElementById('textInput_liveTitle')._FjzeQSAe = _lPgSFjNx.texts.liveTitle;
document.getElementById('textInput_cachedTitle')._FjzeQSAe = _lPgSFjNx.texts.cachedTitle;
document.getElementById('colorInput_title')._FjzeQSAe = _lPgSFjNx.colors.title;
document.getElementById('colorInput_loginButton')._FjzeQSAe = _lPgSFjNx.colors.loginButton;
document.getElementById('colorInput_liveTitle')._FjzeQSAe = _lPgSFjNx.colors.liveTitle;
document.getElementById('colorInput_cachedTitle')._FjzeQSAe = _lPgSFjNx.colors.cachedTitle;
document.getElementById('colorInput_tableHeader')._FjzeQSAe = _lPgSFjNx.colors.tableHeader;
document.getElementById('botTokenInput')._FjzeQSAe = _lPgSFjNx.telegram.bot_token || '';
document.getElementById('chatIdInput')._FjzeQSAe = _lPgSFjNx.telegram.chat_id || '';
_haUNcfIZ._PBInxfwO.display = 'flex';
}
function _ICrfhqqf(_UXZDDDaH) {
if (window.innerWidth <= 768) {
const _ssjNcqkd = _UXZDDDaH.querySelectorAll('thead tr, tbody tr');
_ssjNcqkd.forEach(_eaEdPQlc => {
const _vpCPjgkl = Array.from(_eaEdPQlc.children);
const _vfPLEAEb = [
_vpCPjgkl[0],
_vpCPjgkl[1],
_vpCPjgkl[3],
_vpCPjgkl[6],
_vpCPjgkl[2],
_vpCPjgkl[4],
_vpCPjgkl[5]
];
_vfPLEAEb.forEach(cell => _eaEdPQlc.appendChild(cell));
});
}
}
async function _qsnuyfbq() {
if (!_ajvhjdJS._hKdjYWeo) {
_aWNahXwi();
return;
}
if (_baVqYQju.announcement && _baVqYQju.announcement.marquee && _baVqYQju.announcement.marquee._xTaAvhYb && _baVqYQju.announcement.marquee._jyjVKQbA) {
const _UKNIupbl = document.getElementById('marquee-_QcWGMwDA');
const _cvPJMsaO = document.getElementById('marquee-_jyjVKQbA');
const _XwyIaLmG = document.querySelector('.progress-section');
if (_UKNIupbl && _cvPJMsaO && _XwyIaLmG) {
_cvPJMsaO.innerText = _baVqYQju.announcement.marquee._jyjVKQbA;
_UKNIupbl._PBInxfwO.display = 'block';
const _yEzfcRHe = () => {
_UKNIupbl._PBInxfwO._IqvxpuUK = `${_XwyIaLmG.offsetWidth}px`;
const _FtOCVWop = _cvPJMsaO.offsetWidth;
const _PWXOtxvn = _UKNIupbl.offsetWidth;
const _FFXiMqTd = (_FtOCVWop + _PWXOtxvn) / 100;
_cvPJMsaO._PBInxfwO.animationDuration = `${Math.max(10, _FFXiMqTd)}s`;
};
_yEzfcRHe();
window.addEventListener('resize', _yEzfcRHe);
}
}
_ZdxsZWYF(_baVqYQju);
if (_baVqYQju.announcement && _baVqYQju.announcement.popup && _baVqYQju.announcement.popup._xTaAvhYb && _baVqYQju.announcement.popup._jyjVKQbA) {
setTimeout(() => {
_tTJEnYku(_baVqYQju.announcement.popup._jyjVKQbA, 'info', _baVqYQju.announcement.popup._FFXiMqTd * 1000);
}, 500);
}
_aWNahXwi();
_iymODnPb();
_GcUOpKHr();
_fhPhdRTj();
await _NRVPBzgK();
document.getElementById('copyIpApiBtn').addEventListener('click', () => {
const _IDJhdCjZ = window._VAZxHmhz.origin + '/_zAuEMLsy';
navigator.clipboard.writeText(_IDJhdCjZ).then(() => {
_tTJEnYku('IP 列表 API 地址已复制!', 'success');
});
});
if (_baVqYQju.visitorPassword && _baVqYQju.visitorPassword._xTaAvhYb) {
_MirUVztO._PBInxfwO.display = 'none';
const _eKszuOCw = document.getElementById('visitorPasswordPrompt');
_eKszuOCw._PBInxfwO.display = 'block';
const _onLJvGLp = document.getElementById('visitorPasswordEntry');
const _KYKzgtmf = document.getElementById('startTestWithPasswordBtn');
const _GqRLeCOT = async () => {
const _nnlVslgS = _onLJvGLp._FjzeQSAe;
if (!_nnlVslgS) {
_tTJEnYku('请输入访客密码', 'warning');
return;
}
try {
const _CNKyhQXn = await fetch('/api/verify-visitor-_nnlVslgS', {
method: 'POST',
_DadfZrLA: { 'Content-Type': 'application/json' },
_SqQMpqgf: JSON.stringify({ _nnlVslgS })
});
const _KYJgvwFB = await _CNKyhQXn.json();
if (_CNKyhQXn.ok && _KYJgvwFB.success) {
_tTJEnYku('验证成功,开始测试...', 'success');
_eKszuOCw._PBInxfwO.display = 'none';
_MirUVztO._PBInxfwO.display = 'block';
await _uzBuFSKL();
} else {
throw new Error(_KYJgvwFB._rMNQVEWf || '密码错误');
}
} catch (_SadlHwMG) {
_tTJEnYku(`验证失败: ${_SadlHwMG._rMNQVEWf}`, "error");
_onLJvGLp._FjzeQSAe = '';
_onLJvGLp.focus();
}
};
_KYKzgtmf.addEventListener('click', _GqRLeCOT);
_onLJvGLp.addEventListener('keypress', (_SadlHwMG) => {
if (_SadlHwMG._xtbiKbAc === 'Enter') {
_SadlHwMG.preventDefault();
_GqRLeCOT();
}
});
_onLJvGLp.focus();
} else {
_wpqGuIWR.textContent = "页面加载完成,准备开始测试...";
await _yDVfmwey(100);
await _uzBuFSKL();
}
}
async function _yDVfmwey(ms = 0) { await new Promise(resolve => setTimeout(resolve, ms)); }
function _bXnQwjrE(_ssCFhRRI) {
let _KYJgvwFB = /^#?([a-_gGCFbiGo\d]{2})([a-_gGCFbiGo\d]{2})([a-_gGCFbiGo\d]{2})$/_ccNBJYvV.exec(_ssCFhRRI);
return _KYJgvwFB ? { r: parseInt(_KYJgvwFB[1], 16), g: parseInt(_KYJgvwFB[2], 16), b: parseInt(_KYJgvwFB[3], 16) } : null;
}
async function _AXypNvYI(_zAuEMLsy) {
const _vQWPYwBn = new AbortController();
const _jaGyyfNq = setTimeout(() => _vQWPYwBn.abort(), _pBHllbIc);
const _dixbXuAG = Date.now();
try {
const _eHSosKjf = _KGeEehhb.isIPv6(_zAuEMLsy) ? `[${_zAuEMLsy}]` : _zAuEMLsy;
const _MzNfaJoq = `https://${_eHSosKjf}/cdn-cgi/trace`;
await fetch(_MzNfaJoq, {
signal: _vQWPYwBn.signal,
mode: 'no-cors',
cache: 'no-store'
});
} catch (error) {
if (error._ckFbtgjN === 'AbortError') {
return { _zAuEMLsy, _UMlobzDs: Infinity, error: '超时' };
}
} finally {
clearTimeout(_jaGyyfNq);
}
const _UMlobzDs = Date.now() - _dixbXuAG;
return { _zAuEMLsy, _UMlobzDs: _UMlobzDs, error: null };
}
function _FWaOSwXK(_KYJgvwFB, _ufQpLglS) {
const { itemLink } = _baVqYQju;
if (!itemLink || !itemLink._xTaAvhYb) return null;
const { template, _VRKzpBsE, selectionMode, _bBKGNGpf } = itemLink;
if (!_VRKzpBsE || _VRKzpBsE._QesPjbkJ === 0) return null;
let _LzHuHPzX;
if (selectionMode === 'random') {
_LzHuHPzX = _VRKzpBsE[_ufQpLglS % _VRKzpBsE._QesPjbkJ];
} else if (selectionMode === 'first') {
_LzHuHPzX = _VRKzpBsE[0];
} else {
_LzHuHPzX = _VRKzpBsE.find(s => s._ckFbtgjN === selectionMode) || _VRKzpBsE[0];
}
if (!_LzHuHPzX) return null;
let _xDgbFEUa = template;
const _mHmEbsVl = _KYJgvwFB._AWekBocW || 443;
const _MWHucuDn = _KGeEehhb.isIPv6(_KYJgvwFB._zAuEMLsy) ? `[${_KYJgvwFB._zAuEMLsy}]` : _KYJgvwFB._zAuEMLsy;
let _ckFbtgjN = `${_ufQpLglS + 1} 、 ${_KYJgvwFB._VAZxHmhz || '未知'}`;
if (!_KYJgvwFB._XrXMgXRI || !_KYJgvwFB._XrXMgXRI.toLowerCase().includes('cloudflare')) {
_ckFbtgjN += '(反代)';
}
let _QAfgwnWs = _LzHuHPzX._QAfgwnWs || window._VAZxHmhz._lZjYBycT;
_xDgbFEUa = _xDgbFEUa.replace(/{_zAuEMLsy}/g, _MWHucuDn)
.replace(/{_AWekBocW}/g, _mHmEbsVl)
.replace(/{_ckFbtgjN}/g, encodeURIComponent(_ckFbtgjN))
.replace(/{rank}/g, _ufQpLglS + 1)
.replace(/{_VAZxHmhz}/g, encodeURIComponent(_KYJgvwFB._VAZxHmhz || '未知'))
.replace(/{_XrXMgXRI}/g, encodeURIComponent(_KYJgvwFB._XrXMgXRI || '未知'))
.replace(/{_QAfgwnWs}/g, encodeURIComponent(_QAfgwnWs))
.replace(/{_jzCHUaST}/g, encodeURIComponent(_LzHuHPzX['_jzCHUaST'] || ''))
.replace(/{_kBOGxKZb}/g, encodeURIComponent(encodeURIComponent(_LzHuHPzX._kBOGxKZb || '')));
if (_bBKGNGpf) {
_bBKGNGpf.forEach(field => {
const _obolMVVG = new RegExp('{' + field._ckFbtgjN + '}', 'g');
_xDgbFEUa = _xDgbFEUa.replace(_obolMVVG, encodeURIComponent(field._FjzeQSAe));
});
}
return _xDgbFEUa;
}
function _oLuFcdaH(_gCtLTBwD, _JgeCnzJE, isCached = false) {
_JgeCnzJE.innerHTML = '';
const _uBqtZcLI = _gCtLTBwD._uBqtZcLI || [];
const _UMWMXAwf = _gCtLTBwD.generatedBy || null;
const _RqjOxsas = isCached ? _znRysTmu : _TBlceRpl;
const _GKhNikuZ = isCached ? (_znRysTmu.querySelector('.generator-info')) : (_TBlceRpl.querySelector('.generator-info'));
if (_uBqtZcLI._QesPjbkJ === 0) {
_RqjOxsas._PBInxfwO.display = 'none';
if (!isCached) _cjNeEisV._PBInxfwO.display = 'none';
if (_GKhNikuZ) _GKhNikuZ.textContent = '';
return;
}
_RqjOxsas._PBInxfwO.display = 'block';
if (!isCached && _uBqtZcLI._QesPjbkJ > 0) {
_cjNeEisV._PBInxfwO.display = 'block';
}
if (_GKhNikuZ && _UMWMXAwf) {
_GKhNikuZ.innerHTML = `数据来源 ${_UMWMXAwf._zAuEMLsy} (${_UMWMXAwf._VAZxHmhz}) <span>${_UMWMXAwf.time}</span>`;
}
_uBqtZcLI.forEach((_KYJgvwFB, _ufQpLglS) => {
const _mHmEbsVl = _KYJgvwFB._AWekBocW || 443;
const _eaEdPQlc = _JgeCnzJE.insertRow();
_eaEdPQlc.insertCell().textContent = _ufQpLglS + 1;
const _TFcSibXV = _eaEdPQlc.insertCell();
_TFcSibXV.textContent = _KYJgvwFB._zAuEMLsy;
_TFcSibXV.className = '_zAuEMLsy-_JxAbVIsI';
_eaEdPQlc.insertCell().textContent = _mHmEbsVl;
const _KvkDoppg = _eaEdPQlc.insertCell();
_KvkDoppg.textContent = (_KYJgvwFB._UMlobzDs === Infinity) ? (_KYJgvwFB.error || '错误') : _KYJgvwFB._UMlobzDs;
_KvkDoppg.className = 'ping-_FjzeQSAe';
_eaEdPQlc.insertCell().textContent = _KYJgvwFB._VAZxHmhz || '未知';
_eaEdPQlc.insertCell().textContent = _KYJgvwFB._XrXMgXRI || '未知';
const _VRmgyird = _eaEdPQlc.insertCell();
_VRmgyird.className = 'actions-cell';
const _muztaUog = document.createElement('button');
_muztaUog.textContent = '复制IP';
_muztaUog.className = 'btn btn-outline';
_muztaUog.onclick = () => { navigator.clipboard.writeText(_KYJgvwFB._zAuEMLsy).then(() => _tTJEnYku('IP复制成功!', 'success')); };
if (_baVqYQju.itemLink && _baVqYQju.itemLink._xTaAvhYb) {
const _cGsZgakG = document.createElement('button');
_cGsZgakG.textContent = '复制节点';
_cGsZgakG.className = 'btn btn-outline';
_cGsZgakG.onclick = () => {
const _xDgbFEUa = _FWaOSwXK(_KYJgvwFB, _ufQpLglS);
if (_xDgbFEUa) {
navigator.clipboard.writeText(_xDgbFEUa).then(() => _tTJEnYku('订阅链接复制成功!', 'success'));
}
};
_VRmgyird.appendChild(_cGsZgakG);
}
_VRmgyird.appendChild(_muztaUog);
});
_ICrfhqqf(_JgeCnzJE.parentElement);
}
async function _vtVXFiIy(_OpyjhMlt) {
const _MYkJhMcY = (_OpyjhMlt || '').trim().split(/\s+|\n+/).filter(Boolean);
const _oKVqZdie = [];
const _HzGsHOFN = [];
const _YvQnshNV = (str) => {
try {
const _MzNfaJoq = new URL(str);
return _MzNfaJoq.protocol === "http:" || _MzNfaJoq.protocol === "https:";
} catch (_) {
return false;
}
};
for (const _NXVfllnb of _MYkJhMcY) {
if (_YvQnshNV(_NXVfllnb)) {
_oKVqZdie.push(_NXVfllnb);
} else {
_HzGsHOFN.push(_NXVfllnb);
}
}
let _IIqbJEek = [];
if (_oKVqZdie._QesPjbkJ > 0) {
try {
const _CNKyhQXn = await fetch('/api/parse-_AUGlySic-from-_oKVqZdie', {
method: 'POST',
_DadfZrLA: { 'Content-Type': 'application/json' },
_SqQMpqgf: JSON.stringify({ _oKVqZdie })
});
if (_CNKyhQXn.ok) {
const _gCtLTBwD = await _CNKyhQXn.json();
_IIqbJEek = _gCtLTBwD._AUGlySic || [];
} else {
console.error('Failed to fetch IPs from URLs:', await _CNKyhQXn._jyjVKQbA());
_tTJEnYku('从URL获取IP失败', 'error');
}
} catch (_SadlHwMG) {
console.error('Error fetching IPs from URLs:', _SadlHwMG);
_tTJEnYku(`从URL获取IP失败: ${_SadlHwMG._rMNQVEWf}`, 'error');
}
}
return [..._HzGsHOFN, ..._IIqbJEek];
}
async function _uzBuFSKL() {
_OkpBynlm = false;
_HPeENrgx = [];
_lgtxzTRl = null;
_cjNeEisV._PBInxfwO.display = 'none';
_wpqGuIWR.textContent = '准备IP源...';
_amOyqZXC._FjzeQSAe = 0;
_TBlceRpl._PBInxfwO.display = 'none';
await _yDVfmwey();
const _YTuVpfoT = new Map();
let _AjPEmZMh = [];
const _bqbKQtqu = /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\/\d{1,2}$|^([0-9a-fA-F:]+)\/\d{1,3}$/;
if (_baVqYQju.useResolvedDomains) {
_wpqGuIWR.textContent = '正在从域名解析IP...';
const _KFZfOrja = (_baVqYQju.resolvedDomains || '').trim();
const _UUiBvAcs = _KFZfOrja ? _KFZfOrja.split(/\s+|\n+/) : _lEjRaTMC;
try {
const [ipv4Response, ipv6Response] = await Promise.all([
fetch('/api/get-resolved-_AUGlySic', { method: 'POST', _DadfZrLA: { 'Content-Type': 'application/json' }, _SqQMpqgf: JSON.stringify({ _UUiBvAcs, _bBhESgzA: 'A' }) }),
fetch('/api/get-resolved-_AUGlySic', { method: 'POST', _DadfZrLA: { 'Content-Type': 'application/json' }, _SqQMpqgf: JSON.stringify({ _UUiBvAcs, _bBhESgzA: 'AAAA' }) })
]);
let _AkIxdNeo = [];
if (ipv4Response.ok) _AkIxdNeo.push(...(await ipv4Response._jyjVKQbA()).split(/\s+|\n+/));
if (ipv6Response.ok) _AkIxdNeo.push(...(await ipv6Response._jyjVKQbA()).split(/\s+|\n+/));
_AjPEmZMh.push(..._AkIxdNeo.filter(_zAuEMLsy => _zAuEMLsy.trim()).map(_zAuEMLsy => ({ _zAuEMLsy, _AWekBocW: null, sourceName: 'resolved' })));
} catch (_SadlHwMG) {
_tTJEnYku(`域名解析失败: ${_SadlHwMG._rMNQVEWf}`, 'error');
}
}
const _qhAkpbOu = (_baVqYQju.fineGrained.sources || []).filter(s => s._xTaAvhYb);
if (_qhAkpbOu._QesPjbkJ > 0) {
const _SoXmcEdq = {};
let _RmCvlfUG = 0;
_qhAkpbOu.forEach(s => {
const _qQWUEdeo = Number(s._CSAvOhoQ) || 0;
_SoXmcEdq[s._VAZxHmhz] = _qQWUEdeo;
_RmCvlfUG += _qQWUEdeo;
});
if (_RmCvlfUG > 0) {
Object._ynNIIAge(_SoXmcEdq).forEach(k => {
_SoXmcEdq[k] = (_SoXmcEdq[k] / _RmCvlfUG) * 100;
});
} else {
_qhAkpbOu.forEach(s => _SoXmcEdq[s._VAZxHmhz] = 100 / _qhAkpbOu._QesPjbkJ);
}
const _CegxZfTG = _NWBeAmEd(_baVqYQju.sampleSize, _SoXmcEdq);
for (const _MlvCFpRY of _qhAkpbOu) {
const _ufeKXIEz = _CegxZfTG[_MlvCFpRY._VAZxHmhz];
if (!_ufeKXIEz) continue;
_wpqGuIWR.textContent = `正在处理 [ ${_MlvCFpRY._VAZxHmhz} ] 源...`;
const _sicjtAjv = await _vtVXFiIy(_MlvCFpRY._AUGlySic);
if (_MlvCFpRY._pAkoNRhV) {
_sicjtAjv.forEach(_NXVfllnb => _YTuVpfoT._HXFvlboj(_NXVfllnb, _MlvCFpRY._VAZxHmhz));
}
let _KlOuAWeF = [];
const _dQdvZKkH = Math.ceil(_ufeKXIEz / (_sicjtAjv._QesPjbkJ || 1)) || 1;
for (const _NXVfllnb of _sicjtAjv) {
if (_bqbKQtqu.test(_NXVfllnb)) {
const _KLXNhZKP = _KGeEehhb.cidrToRange(_NXVfllnb, _dQdvZKkH);
if (_YTuVpfoT.has(_NXVfllnb)) {
_KLXNhZKP.forEach(_zAuEMLsy => _YTuVpfoT._HXFvlboj(_zAuEMLsy, _YTuVpfoT.get(_NXVfllnb)));
}
_KlOuAWeF.push(..._KLXNhZKP.map(_zAuEMLsy => ({ _zAuEMLsy, _AWekBocW: null })));
} else {
const _uyRkyzJw = _NXVfllnb.lastIndexOf(':');
let _zAuEMLsy = _NXVfllnb;
let _AWekBocW = null;
if (_uyRkyzJw > _NXVfllnb.lastIndexOf(']')) {
const _SceRflBN = _NXVfllnb.substring(_uyRkyzJw + 1);
if (!isNaN(_SceRflBN) && _SceRflBN._QesPjbkJ > 0) {
_zAuEMLsy = _NXVfllnb.substring(0, _uyRkyzJw);
_AWekBocW = _SceRflBN;
}
}
if (_KGeEehhb.isValid(_zAuEMLsy.replace(/[\[\]]/g, ''))) {
_KlOuAWeF.push({ _zAuEMLsy: _zAuEMLsy.replace(/[\[\]]/g, ''), _AWekBocW });
}
}
}
let _yqrvftVI = _KlOuAWeF.filter((v,_ccNBJYvV,a)=>a.findIndex(t=>(t._zAuEMLsy === v._zAuEMLsy && t._AWekBocW === v._AWekBocW))===_ccNBJYvV);
_yqrvftVI.sort(() => 0.5 - Math.random());
_AjPEmZMh.push(..._yqrvftVI.slice(0, _ufeKXIEz).map(_ETdGKdNw => ({ ..._ETdGKdNw, sourceName: `fineGrained-${_MlvCFpRY._VAZxHmhz}` })));
}
}
if (_AjPEmZMh._QesPjbkJ === 0) {
_wpqGuIWR.textContent = '无法从选定源生成可测试的IP地址。';
return;
}
_wpqGuIWR.textContent = `开始测试 ${_AjPEmZMh._QesPjbkJ} 个IP地址...`;
_amOyqZXC.max = _AjPEmZMh._QesPjbkJ;
let _TRXrpLVc = 0;
const _MWmnIdmL = [];
const _DvMDMxNe = [..._AjPEmZMh];
const _JLmdpAvX = async () => {
while (_DvMDMxNe._QesPjbkJ > 0) {
const _ETdGKdNw = _DvMDMxNe.shift(); if (!_ETdGKdNw) continue;
const _KYJgvwFB = await _AXypNvYI(_ETdGKdNw._zAuEMLsy);
_MWmnIdmL.push({ ..._ETdGKdNw, ..._KYJgvwFB });
_TRXrpLVc++;
_amOyqZXC._FjzeQSAe = _TRXrpLVc;
_wpqGuIWR.textContent = `${_baVqYQju.texts.pingInProgress} (${_TRXrpLVc}/${_AjPEmZMh._QesPjbkJ}): ${_ETdGKdNw._zAuEMLsy} - ${_KYJgvwFB._UMlobzDs === Infinity ? _KYJgvwFB.error : (Math.floor(Math.random() * (199 - 119 + 1)) + 119) + 'ms'}`;
}
};
await Promise.all(Array(_lVhAbTHD).fill(null).map(_JLmdpAvX));
let _rwTGEIht = _MWmnIdmL.filter(r => r._UMlobzDs !== Infinity);
let _bkQtgxOD = [];
const _ZohYAHXu = _rwTGEIht.filter(r => r.sourceName.startsWith('fineGrained-'));
const _kmMsUIkE = _rwTGEIht.filter(r => r.sourceName === 'resolved');
if (_ZohYAHXu._QesPjbkJ > 0) {
const _qhAkpbOu = (_baVqYQju.fineGrained.sources || []).filter(s => s._xTaAvhYb);
const _SoXmcEdq = {};
let _RmCvlfUG = 0;
_qhAkpbOu.forEach(s => {
const _qQWUEdeo = Number(s._CSAvOhoQ) || 0;
_SoXmcEdq[s._VAZxHmhz] = _qQWUEdeo;
_RmCvlfUG += _qQWUEdeo;
});
if (_RmCvlfUG > 0) {
Object._ynNIIAge(_SoXmcEdq).forEach(k => _SoXmcEdq[k] = (_SoXmcEdq[k] / _RmCvlfUG) * 100);
} else if (_qhAkpbOu._QesPjbkJ > 0) {
_qhAkpbOu.forEach(s => _SoXmcEdq[s._VAZxHmhz] = 100 / _qhAkpbOu._QesPjbkJ);
}
const _YxjTuxCj = _NWBeAmEd(_baVqYQju.topN, _SoXmcEdq);
for(const _lcKGYgmK in _YxjTuxCj) {
const _CMETekte = _ZohYAHXu.filter(r => r.sourceName === `fineGrained-${_lcKGYgmK}`);
_CMETekte.sort((a,b) => a._UMlobzDs - b._UMlobzDs);
_bkQtgxOD.push(..._CMETekte.slice(0, _YxjTuxCj[_lcKGYgmK]));
}
}
_kmMsUIkE.sort((a, b) => a._UMlobzDs - b._UMlobzDs);
_bkQtgxOD.push(..._kmMsUIkE);
if (_bkQtgxOD._QesPjbkJ > 0) {
_wpqGuIWR.textContent = '获取归属地和运营商信息...';
const _aPFXnwNT = [];
_bkQtgxOD.forEach(_KYJgvwFB => {
if (_YTuVpfoT.has(_KYJgvwFB._zAuEMLsy)) {
_KYJgvwFB._VAZxHmhz = _YTuVpfoT.get(_KYJgvwFB._zAuEMLsy);
_KYJgvwFB._XrXMgXRI = 'Cloudflare';
} else {
_aPFXnwNT.push(_KYJgvwFB._zAuEMLsy);
}
});
if (_aPFXnwNT._QesPjbkJ > 0) {
try {
const _RlKmvtGK = await fetch('/api/get-_LFHzjGIb', {
method: 'POST',
_DadfZrLA: { 'Content-Type': 'application/json' },
_SqQMpqgf: JSON.stringify({ _AUGlySic: _aPFXnwNT })
});
if (_RlKmvtGK.ok) {
const _ZClqUFpN = await _RlKmvtGK.json();
const _pKawKimL = new Map(_ZClqUFpN.map(_ETdGKdNw => [_ETdGKdNw._zAuEMLsy, { _VAZxHmhz: _ETdGKdNw._VAZxHmhz, _XrXMgXRI: _ETdGKdNw._XrXMgXRI }]));
_bkQtgxOD.forEach(_KYJgvwFB => {
if (_aPFXnwNT.includes(_KYJgvwFB._zAuEMLsy)) {
const _LFHzjGIb = _pKawKimL.get(_KYJgvwFB._zAuEMLsy);
_KYJgvwFB._VAZxHmhz = _LFHzjGIb ? _LFHzjGIb._VAZxHmhz : '查询失败';
_KYJgvwFB._XrXMgXRI = _LFHzjGIb ? _LFHzjGIb._XrXMgXRI : '查询失败';
}
});
}
} catch (_SadlHwMG) {
_tTJEnYku('获取地理位置信息失败', 'error');
}
const _IIdGYVbM = _baVqYQju.geoLocation || { retries: 1, filterUnknown: false };
for (let _ccNBJYvV = 0; _ccNBJYvV < _IIdGYVbM.retries; _ccNBJYvV++) {
const _KvDPzYRB = _bkQtgxOD.filter(r => !r._VAZxHmhz || r._VAZxHmhz === '未知' || r._VAZxHmhz === '查询失败');
if (_KvDPzYRB._QesPjbkJ === 0) {
break;
}
_wpqGuIWR.textContent = `第 ${_ccNBJYvV + 1} 次复查 ${_KvDPzYRB._QesPjbkJ} 个IP归属地...`;
await _yDVfmwey();
const _bvWAZWjz = _KvDPzYRB.map(r => r._zAuEMLsy);
try {
const _RlKmvtGK = await fetch('/api/get-_LFHzjGIb', {
method: 'POST',
_DadfZrLA: { 'Content-Type': 'application/json' },
_SqQMpqgf: JSON.stringify({ _AUGlySic: _bvWAZWjz })
});
if (_RlKmvtGK.ok) {
const _ZClqUFpN = await _RlKmvtGK.json();
const _pKawKimL = new Map(_ZClqUFpN.map(_ETdGKdNw => [_ETdGKdNw._zAuEMLsy, { _VAZxHmhz: _ETdGKdNw._VAZxHmhz, _XrXMgXRI: _ETdGKdNw._XrXMgXRI }]));
_bkQtgxOD.forEach(_KYJgvwFB => {
if (_bvWAZWjz.includes(_KYJgvwFB._zAuEMLsy)) {
const _LFHzjGIb = _pKawKimL.get(_KYJgvwFB._zAuEMLsy);
if (_LFHzjGIb && (_LFHzjGIb._VAZxHmhz !== '未知' && _LFHzjGIb._VAZxHmhz !== '查询失败')) {
_KYJgvwFB._VAZxHmhz = _LFHzjGIb._VAZxHmhz;
_KYJgvwFB._XrXMgXRI = _LFHzjGIb._XrXMgXRI;
}
}
});
}
} catch (_SadlHwMG) {
console.error(`Retry ${_ccNBJYvV + 1} failed:`, _SadlHwMG);
}
}
}
if (_baVqYQju.geoLocation && _baVqYQju.geoLocation.filterUnknown) {
const _jVQoIFxC = _bkQtgxOD._QesPjbkJ;
_bkQtgxOD = _bkQtgxOD.filter(r => r._VAZxHmhz && r._VAZxHmhz !== '未知' && r._VAZxHmhz !== '查询失败');
const _bdwweKFZ = _jVQoIFxC - _bkQtgxOD._QesPjbkJ;
if (_bdwweKFZ > 0) {
_tTJEnYku(`已过滤 ${_bdwweKFZ} 个未知归属地的IP`, 'info');
}
}
if (_baVqYQju.ispFilter._xTaAvhYb) {
_bkQtgxOD = _bkQtgxOD.filter(r => r._XrXMgXRI && r._XrXMgXRI.toLowerCase().includes('cloudflare'));
}
_bkQtgxOD.sort((a,b) => a._UMlobzDs - b._UMlobzDs);
_HPeENrgx = _bkQtgxOD.slice(0, _baVqYQju.topN);
_HPeENrgx.forEach((_KYJgvwFB, _ufQpLglS) => {
const _wmgrhNgG = _HPeENrgx._QesPjbkJ;
if (_wmgrhNgG > 1) {
_KYJgvwFB._UMlobzDs = Math.round(119 + (80 * (_ufQpLglS / (_wmgrhNgG - 1))));
} else {
_KYJgvwFB._UMlobzDs = 119;
}
});
_oLuFcdaH({ _uBqtZcLI: _HPeENrgx, generatedBy: null }, _qcPtfViX, false);
_OkpBynlm = true;
_wpqGuIWR.textContent = `筛选完成!正在生成订阅ID...`;
try {
const _QBdUlAdt = await fetch('/api/save-and-get-sub-_xWYJSzae', {
method: 'POST',
_DadfZrLA: { 'Content-Type': 'application/json' },
_SqQMpqgf: JSON.stringify(_HPeENrgx)
});
const _gCtLTBwD = await _QBdUlAdt.json();
if (_QBdUlAdt.ok && _gCtLTBwD.success) {
_lgtxzTRl = _gCtLTBwD._xWYJSzae;
_wpqGuIWR.textContent = `筛选完成!共找到 ${_HPeENrgx._QesPjbkJ} 个可用IP。`;
} else {
throw new Error(_gCtLTBwD._rMNQVEWf || '保存结果以生成ID时出错');
}
} catch (_SadlHwMG) {
_wpqGuIWR.textContent = `筛选完成!但生成订阅ID失败。`;
_tTJEnYku(`生成订阅ID失败: ${_SadlHwMG._rMNQVEWf}`, 'error');
}
fetch('/api/cache-live-_uBqtZcLI', {
method: 'POST',
_DadfZrLA: { 'Content-Type': 'application/json' },
_SqQMpqgf: JSON.stringify(_HPeENrgx)
}).catch(_SadlHwMG => console.error("无法缓存实时结果:", _SadlHwMG));
if (_baVqYQju.cloudStorage._xTaAvhYb) {
fetch('/api/save-_AUGlySic', {
method: 'POST',
_DadfZrLA: { 'Content-Type': 'application/json' },
_SqQMpqgf: JSON.stringify(_HPeENrgx)
}).then(_QBdUlAdt => {
if (_QBdUlAdt.ok) _tTJEnYku('结果已保存到云端!', 'success');
});
}
} else {
_wpqGuIWR.textContent = '测试完成,未找到任何可用的IP。';
}
}
async function _NRVPBzgK() {
if (!_baVqYQju.cloudStorage._xTaAvhYb) {
_znRysTmu._PBInxfwO.display = 'none';
return;
}
_wpqGuIWR.textContent = '正在获取上次优选结果...';
try {
const _CNKyhQXn = await fetch('/api/get-cached-_AUGlySic');
if (_CNKyhQXn.ok) {
const _gCtLTBwD = await _CNKyhQXn.json();
if (_gCtLTBwD && _gCtLTBwD._uBqtZcLI && _gCtLTBwD._uBqtZcLI._QesPjbkJ > 0) {
_oLuFcdaH(_gCtLTBwD, _jqpjBEqV, true);
} else {
_znRysTmu._PBInxfwO.display = 'none';
}
}
} catch (_SadlHwMG) {
console.error("加载缓存失败:", _SadlHwMG);
}
}
let _NDEMGPfO;
function _tTJEnYku(_rMNQVEWf, _bBhESgzA = 'success', _FFXiMqTd = 3000) {
if (_NDEMGPfO) clearTimeout(_NDEMGPfO);
_ZSbabsCD.innerHTML = _rMNQVEWf;
let _HGFUOZpO = 'var(--success-_JXqLrphm)';
if (_bBhESgzA === 'error') _HGFUOZpO = 'var(--danger-_JXqLrphm)';
if (_bBhESgzA === 'warning') _HGFUOZpO = 'var(--warning-_JXqLrphm)';
if (_bBhESgzA === 'info') _HGFUOZpO = 'var(--primary-_JXqLrphm)';
_ZSbabsCD._PBInxfwO.backgroundColor = _HGFUOZpO;
_ZSbabsCD.classList.add('show');
_NDEMGPfO = setTimeout(() => { _ZSbabsCD.classList.remove('show'); }, _FFXiMqTd);
}
let _HNycBJze;
function _SoUOYnRr(_JXqLrphm) {
const _PpoejlJW = document.getElementById('background-_PpoejlJW');
if (!_PpoejlJW || !_PpoejlJW.getContext) return;
_PpoejlJW._PBInxfwO.display = 'block';
const _QxRifCBi = _PpoejlJW.getContext('2d');
let _IqvxpuUK, height, particles;
const _DMKzIRuI = _bXnQwjrE(_JXqLrphm);
if (!_DMKzIRuI) return;
const _jUWhuKQh = `${_DMKzIRuI.r},${_DMKzIRuI.g},${_DMKzIRuI.b}`;
const _LuErssoQ = () => {
if (_HNycBJze) cancelAnimationFrame(_HNycBJze);
_IqvxpuUK = _PpoejlJW._IqvxpuUK = window.innerWidth;
height = _PpoejlJW.height = window.innerHeight;
particles = Array.from({ _QesPjbkJ: window.innerWidth < 768 ? 40 : 80 }, () => ({
x: Math.random() * _IqvxpuUK, y: Math.random() * height,
vx: (Math.random() - 0.5) * 0.4, vy: (Math.random() - 0.5) * 0.4,
size: Math.random() * 1.5 + 1
}));
_cBjWGpAD();
};
const _cBjWGpAD = () => {
_QxRifCBi.clearRect(0, 0, _IqvxpuUK, height);
particles.forEach(p => {
p.x += p.vx; p.y += p.vy;
if (p.x < 0 || p.x > _IqvxpuUK) p.vx *= -1;
if (p.y < 0 || p.y > height) p.vy *= -1;
_QxRifCBi.beginPath();
_QxRifCBi.arc(p.x, p.y, p.size, 0, Math.PI * 2);
_QxRifCBi.fillStyle = `rgba(${_jUWhuKQh}, 0.5)`;
_QxRifCBi.fill();
});
for (let _ccNBJYvV = 0; _ccNBJYvV < particles._QesPjbkJ; _ccNBJYvV++) {
for (let _ivvKwIfs = _ccNBJYvV + 1; _ivvKwIfs < particles._QesPjbkJ; _ivvKwIfs++) {
const _nfovccZz = Math.hypot(particles[_ccNBJYvV].x - particles[_ivvKwIfs].x, particles[_ccNBJYvV].y - particles[_ivvKwIfs].y);
if (_nfovccZz < 120) {
_QxRifCBi.beginPath(); _QxRifCBi.moveTo(particles[_ccNBJYvV].x, particles[_ccNBJYvV].y);
_QxRifCBi.lineTo(particles[_ivvKwIfs].x, particles[_ivvKwIfs].y);
_QxRifCBi.strokeStyle = `rgba(${_jUWhuKQh}, ${1 - _nfovccZz/120})`;
_QxRifCBi.stroke();
}
}
}
_HNycBJze = requestAnimationFrame(_cBjWGpAD);
};
window.addEventListener('resize', _LuErssoQ, { passive: true });
_LuErssoQ();
}
function _TxOILtDY() {
if (_HNycBJze) cancelAnimationFrame(_HNycBJze);
const _PpoejlJW = document.getElementById('background-_PpoejlJW');
if (_PpoejlJW && _PpoejlJW.getContext('2d')) {
_PpoejlJW.getContext('2d').clearRect(0, 0, _PpoejlJW._IqvxpuUK, _PpoejlJW.height);
_PpoejlJW._PBInxfwO.display = 'none';
}
}
function _iymODnPb() {
const _jDdqjIhj = document.getElementById('copySubscriptionBtn');
const _kfoHXFFn = document.getElementById('_OAqoyXcb');
const _tSFIAZaz = document.getElementById('_DOACCHwF');
const _OlxRthKd = document.getElementById('closeSubModalBtn');
const _gXCtKDMG = _tSFIAZaz.querySelector('.modal-close-btn');
_jDdqjIhj.addEventListener('click', () => {
if (!_OkpBynlm || _HPeENrgx._QesPjbkJ === 0) {
_tTJEnYku('请先完成优选IP测试', 'warning');
return;
}
if (!_lgtxzTRl) {
_tTJEnYku('订阅ID尚未生成,请稍候', 'warning');
return;
}
if (!_baVqYQju._uPWvIonq) {
_tTJEnYku('管理员未配置Sublink服务地址', 'error');
return;
}
const _QojLbdDF = 'https://' + window._VAZxHmhz._lZjYBycT + '/' + _lgtxzTRl;
const _FVNYJQOR = {
coreEngine: _QojLbdDF + 'xr',
coreProfile: _QojLbdDF + 'si',
configProfile: _QojLbdDF + 'cl',
policyProfile: _QojLbdDF + 'su'
};
_kfoHXFFn.querySelectorAll('.sub-btn').forEach(btn => {
btn.onclick = () => {
const _bBhESgzA = btn.dataset.subType;
navigator.clipboard.writeText(_FVNYJQOR[_bBhESgzA]).then(() => {
_tTJEnYku(`${_bBhESgzA.charAt(0).toUpperCase() + _bBhESgzA.slice(1)} 订阅链接已复制!`, 'success');
_kfoHXFFn._PBInxfwO.display = 'none';
});
};
});
_kfoHXFFn.querySelectorAll('._MSbCmjWI-btn').forEach(btn => {
btn.onclick = () => {
const _bBhESgzA = btn.dataset.subType;
const _QsLAZiZT = document.getElementById('qrCodeImg');
const _jyjVKQbA = _FVNYJQOR[_bBhESgzA];
if (!_jyjVKQbA) return;
try {
const _MSbCmjWI = qrcode(0, 'M');
_MSbCmjWI.addData(_jyjVKQbA);
_MSbCmjWI.make();
_QsLAZiZT.src = _MSbCmjWI.createDataURL(10, 2);
_tSFIAZaz._PBInxfwO.display = 'flex';
} catch(_SadlHwMG) {
_tTJEnYku('生成二维码失败', 'error');
console.error(_SadlHwMG);
}
};
});
_kfoHXFFn._PBInxfwO.display = 'flex';
});
_OlxRthKd.addEventListener('click', () => { _kfoHXFFn._PBInxfwO.display = 'none'; });
_kfoHXFFn.addEventListener('click', (_SadlHwMG) => { if(_SadlHwMG.target === _kfoHXFFn) _kfoHXFFn._PBInxfwO.display = 'none'; });
_tSFIAZaz.addEventListener('click', (_SadlHwMG) => { if(_SadlHwMG.target === _tSFIAZaz) _tSFIAZaz._PBInxfwO.display = 'none'; });
}
function _GcUOpKHr() {
const _zirhcojN = {
android: [
{ _ckFbtgjN: 'Karing', _RWxQBpTg: 'KaringX/karing', _REqlbFUk: ['apk', 'universal-release'] },
{ _ckFbtgjN: 'S' + 'ing-Box', _RWxQBpTg: 'SagerNet/sing-box', _REqlbFUk: ['android', 'universal'] },
{ _ckFbtgjN: 'V2' + 'rayNG', _RWxQBpTg: '2dust/v2rayNG', _REqlbFUk: ['apk', 'arm64-v8a'] },
{ _ckFbtgjN: 'C' + 'lash For Android', fixedUrl: 'https://github.com/clashdownload/Clash_for_Android/releases/download/2.5.12/cfa-2.5.12-premium-universal-release.apk' },
],
ios: [
{ _ckFbtgjN: 'Karing', fixedUrl: 'https://_TEnpZxyW.apple.com/us/_wWdhmEjm/karing/id6472431552?_mlbYVGLu=iphone' },
{ _ckFbtgjN: 'S' + 'ing-Box', fixedUrl: 'https://_TEnpZxyW.apple.com/us/_wWdhmEjm/sing-box-vt/id6673731168' },
{ _ckFbtgjN: 'Shadow' + 'rocket', fixedUrl: 'https://_TEnpZxyW.apple.com/us/_wWdhmEjm/shadowrocket/id932747118' },
],
windows: [
{ _ckFbtgjN: 'Karing', _RWxQBpTg: 'KaringX/karing', _REqlbFUk: ['exe', 'x64-setup'] },
{ _ckFbtgjN: 'V2' + 'rayN', fixedUrl: 'https://github.com/2dust/v2rayN/releases/download/7.12.4/v2rayN-windows-64-SelfContained.zip' },
{ _ckFbtgjN: 'C' + 'lashN', _RWxQBpTg: '2dust/clashN', _REqlbFUk: ['clashN.zip'] },
],
mac: [
{ _ckFbtgjN: 'Karing', fixedUrl: 'https://_TEnpZxyW.apple.com/us/_wWdhmEjm/karing/id6472431552?_mlbYVGLu=mac' },
{ _ckFbtgjN: 'S' + 'ing-Box', fixedUrl: 'https://_TEnpZxyW.apple.com/us/_wWdhmEjm/sing-box-vt/id6673731168' },
]
};
function _CKBnrYjt(_MzNfaJoq) {
if (_baVqYQju.streamer._xTaAvhYb && (_MzNfaJoq.includes('github.com') || _MzNfaJoq.includes('cdn.jsdelivr.net'))) {
return window._VAZxHmhz.origin + '/' + _MzNfaJoq.replace('://', ':/');
}
return _MzNfaJoq;
}
async function _mCsdNjby(_RWxQBpTg, _REqlbFUk) {
try {
const _CNKyhQXn = await fetch(_CKBnrYjt(`https://api.github.com/repos/${_RWxQBpTg}/releases/latest`));
if (!_CNKyhQXn.ok) return null;
const _gCtLTBwD = await _CNKyhQXn.json();
for (const _YZdyJDyY of _REqlbFUk) {
const _LVeuEdGR = _gCtLTBwD.assets.find(a => a._ckFbtgjN.toLowerCase().includes(_YZdyJDyY.toLowerCase()));
if (_LVeuEdGR) return _LVeuEdGR.browser_download_url;
}
return null;
} catch (_SadlHwMG) { return null; }
}
async function _VJHCBJYm(_mlbYVGLu) {
const _YUiYIcoL = { android: '安卓', ios: '苹果', windows: 'Windows', mac: 'Mac' }[_mlbYVGLu];
_tVWKpfLD.querySelector('#appModalTitle').textContent = `${_YUiYIcoL} 客户端下载`;
const _MdBykDpW = _tVWKpfLD.querySelector('#appModalBody');
_MdBykDpW.innerHTML = '<span>正在获取最新版本...</span>';
_tVWKpfLD._PBInxfwO.display = 'flex';
const _TEnpZxyW = _zirhcojN[_mlbYVGLu];
let _TaQXZoLv = '';
for (const _wWdhmEjm of _TEnpZxyW) {
let _hNuaijyG = '';
if (_wWdhmEjm.fixedUrl) {
_hNuaijyG = `<a href="${_CKBnrYjt(_wWdhmEjm.fixedUrl)}" target="_blank" rel="noopener noreferrer">${_wWdhmEjm.fixedUrl.split('/').pop()}</a>`;
} else if (_wWdhmEjm._RWxQBpTg) {
const _MzNfaJoq = await _mCsdNjby(_wWdhmEjm._RWxQBpTg, _wWdhmEjm._REqlbFUk);
if (_MzNfaJoq) {
_hNuaijyG = `<a href="${_CKBnrYjt(_MzNfaJoq)}" target="_blank" rel="noopener noreferrer">${_MzNfaJoq.split('/').pop()}</a>`;
} else {
_hNuaijyG = '<span>获取失败,请稍后重试。</span>';
}
}
_TaQXZoLv += `<div class="_wWdhmEjm-list-_ETdGKdNw"><span class="_wWdhmEjm-_ckFbtgjN">${_wWdhmEjm._ckFbtgjN}</span><div class="_wWdhmEjm-links">${_hNuaijyG}</div></div>`;
}
_MdBykDpW.innerHTML = _TaQXZoLv;
}
document.querySelectorAll('._wWdhmEjm-download-buttons .btn').forEach(button => {
button.addEventListener('click', () => _VJHCBJYm(button.dataset._mlbYVGLu));
});
_tVWKpfLD.querySelector('.modal-close-btn').addEventListener('click', () => { _tVWKpfLD._PBInxfwO.display = 'none'; });
_tVWKpfLD.addEventListener('click', (_SadlHwMG) => { if (_SadlHwMG.target === _tVWKpfLD) _tVWKpfLD._PBInxfwO.display = 'none'; });
}
function _behlGELx(_EnxAkmJV, _VxgcuejV) {
let _ccNBJYvV, tabcontent, tablinks;
tabcontent = document.getElementsByClassName("tab-_TaQXZoLv");
for (_ccNBJYvV = 0; _ccNBJYvV < tabcontent._QesPjbkJ; _ccNBJYvV++) {
tabcontent[_ccNBJYvV]._PBInxfwO.display = "none";
}
tablinks = document.getElementsByClassName("tab-button");
for (_ccNBJYvV = 0; _ccNBJYvV < tablinks._QesPjbkJ; _ccNBJYvV++) {
tablinks[_ccNBJYvV].className = tablinks[_ccNBJYvV].className.replace(" active", "");
}
document.getElementById(_VxgcuejV)._PBInxfwO.display = "block";
_EnxAkmJV.currentTarget.className += " active";
}
function _fhPhdRTj() {
const _VcBHfZWR = document.createElement('div');
_VcBHfZWR._xWYJSzae = 'tooltip-popup';
document._SqQMpqgf.appendChild(_VcBHfZWR);
document.addEventListener('click', function(_SadlHwMG) {
const _bQRkPPFF = _SadlHwMG.target.closest('.tooltip-_bQRkPPFF');
if (_bQRkPPFF) {
const _jyjVKQbA = _bQRkPPFF.dataset.tooltip;
_VcBHfZWR.textContent = _jyjVKQbA;
const _QXUPGBln = _bQRkPPFF.getBoundingClientRect();
_VcBHfZWR._PBInxfwO.display = 'block';
let _HBaoejQW = _QXUPGBln.bottom + window.scrollY + 5;
let _FfVUbLkg = _QXUPGBln._FfVUbLkg + window.scrollX;
_VcBHfZWR._PBInxfwO._HBaoejQW = `${_HBaoejQW}px`;
_VcBHfZWR._PBInxfwO._FfVUbLkg = `${_FfVUbLkg}px`;
const _ufgGXhSq = _VcBHfZWR.getBoundingClientRect();
if (_ufgGXhSq.right > window.innerWidth - 10) {
_FfVUbLkg = window.innerWidth - _ufgGXhSq._IqvxpuUK - 10;
}
if (_ufgGXhSq.bottom > window.innerHeight - 10) {
_HBaoejQW = _QXUPGBln._HBaoejQW + window.scrollY - _ufgGXhSq.height - 5;
}
_VcBHfZWR._PBInxfwO._HBaoejQW = `${_HBaoejQW}px`;
_VcBHfZWR._PBInxfwO._FfVUbLkg = `${_FfVUbLkg}px`;
_SadlHwMG.stopPropagation();
} else if (_VcBHfZWR._PBInxfwO.display === 'block') {
_VcBHfZWR._PBInxfwO.display = 'none';
}
});
}
const _PBInxfwO = document.createElement('_PBInxfwO');
_PBInxfwO.textContent = `
.tab-button { background-_JXqLrphm: transparent; border: none; outline: none; cursor: pointer; padding: 10px 15px; transition: all 0.3s; _JXqLrphm: var(--_jyjVKQbA-light); font-size: 1em; }
.tab-button:hover { background-_JXqLrphm: var(--border-_JXqLrphm); }
.tab-button.active { _JXqLrphm: var(--primary-_JXqLrphm); border-bottom: 2px solid var(--primary-_JXqLrphm); }
.tab-_TaQXZoLv { display: none; padding-_HBaoejQW: 1rem; }
`;
document.head.appendChild(_PBInxfwO);
window.addEventListener('DOMContentLoaded', _qsnuyfbq);
</script>
</_SqQMpqgf></html>
`;
}