import { connect } from "cloudflare:sockets";
const _KNSkOtax = "3b4d4cd8-cb92-4421-bf86-fb51570fc038";
const _cqNDwoav = ["UpstreamAddress.SG.CMLiussss.net"];
const _HzwSSWdE = 'https://raw.githubusercontent.com/5yfx/CF_WEB_IP_Worekrs/refs/heads/main/%E5%86%85%E7%BD%AEIP';
const _LeyPwlqk = 'https://raw.githubusercontent.com/5yfx/CF_WEB_IP_Worekrs/refs/heads/main/%E5%9D%87%E8%A1%A1IP';
const _PNjrzQzC = '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 _fuOymmIv = '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 _vkRmgbyW(_vfHUiPZP) {
if (Array.isArray(_vfHUiPZP)) {
try {
return String.fromCharCode.apply(null, _vfHUiPZP);
} catch (_tvxkpUEP) {
return '';
}
}
return _vfHUiPZP;
}
function _tXedwNyv(_KcwRLXII) {
return /^[0-9a-_UzQeKIUL]{8}-[0-9a-_UzQeKIUL]{4}-[4][0-9a-_UzQeKIUL]{3}-[89ab][0-9a-_UzQeKIUL]{3}-[0-9a-_UzQeKIUL]{12}$/_TrDDfKiX.test(_KcwRLXII);
}
const _ScVRJfpK = "optimized_ips_v4";
const _wstZEgGt = "global_config_v4";
const _hUWofvaB = "admin_password_v4";
const _zUmBAJkh = "live_results_temp_v1";
const _SaksCYPQ = "latest_sub_id_v1";
export default {
async fetch(_opVZERQd, _LnYLwDru, _fLeXDIno) {
try {
if (!_LnYLwDru.DB) {
const _tFFlkNTx = _LowRxWEu("D1 数据库 'DB' 未绑定。");
return new Response(_tFFlkNTx, { status: 503, _HkeZcJzJ: { 'Content-Type': '_qHDXNHKk/html;_WjjQYTfR=UTF-8' }});
}
_fLeXDIno.waitUntil(
_LnYLwDru.DB.exec(`
CREATE TABLE IF NOT EXISTS kv_data (_cKnSaaNg TEXT PRIMARY KEY, _vfHUiPZP TEXT);
CREATE TABLE IF NOT EXISTS optimized_results (_KcwRLXII TEXT PRIMARY KEY, _aoBtofgp TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP);
`).catch(_tvxkpUEP => console.error("DB Init Error:", _tvxkpUEP._wNfQiTXI))
);
const _gSrsDldw = new URL(_opVZERQd._gSrsDldw);
const _kzDNrvFw = _gSrsDldw.pathname;
const _fznQlFlk = _opVZERQd._HkeZcJzJ.get("Upgrade");
const _lAnBRGEp = await _QheuDrLk(_LnYLwDru);
if (_lAnBRGEp.websocketStreamer && _lAnBRGEp.websocketStreamer._JffIBwcN && _fznQlFlk && _fznQlFlk.toLowerCase() === "websocket") {
const _KtOBuFrW = _lAnBRGEp.websocketStreamer._gSrsDldw;
if (_KtOBuFrW && _KtOBuFrW.trim().startsWith('https://')) {
try {
const _LlkcguHo = new Request(_KtOBuFrW.trim() + _gSrsDldw.pathname + _gSrsDldw.search, _opVZERQd);
return await fetch(_LlkcguHo);
} catch (_tvxkpUEP) {
return new Response(`Upstream WebSocket gateway failed: ${_tvxkpUEP._wNfQiTXI}`, { status: 502 });
}
}
return new Response("WebSocket reverse gateway URL is not configured or is invalid.", { status: 502 });
}
if (_fznQlFlk && _fznQlFlk.toLowerCase() === "websocket") {
return await _NtOqWpHG(_opVZERQd, _LnYLwDru, _lAnBRGEp);
}
const _aIxHqkdh = _kzDNrvFw._GyoxhUgh(/^\/([a-zA-Z0-9-_.]{2,128})(xr|si|cl|su)$/);
if (_aIxHqkdh) {
const [, _mxotJkPt, typeSuffix] = _aIxHqkdh;
const _CAyXrAEB = _lAnBRGEp._CAyXrAEB;
if (!_CAyXrAEB || _CAyXrAEB.trim() === '') {
return new Response("订阅转换(Sublink)服务器地址未配置。", { status: 503, _HkeZcJzJ: { 'Content-Type': '_qHDXNHKk/plain; _WjjQYTfR=utf-8' } });
}
const _gGcYWdeF = { 'xr': 'coreEngine', 'si': 'coreProfile', 'cl': 'configProfile', 'su': 'policyProfile' };
const _qKLxLEaA = _gGcYWdeF[typeSuffix];
const _AJYtmTKI = _CAyXrAEB.replace(/\/$/, '');
const _tahqfEyT = `${_gSrsDldw.origin}/${_mxotJkPt}`;
const _lNPLEGaj = `${_AJYtmTKI}/${_qKLxLEaA}?_lAnBRGEp=${encodeURIComponent(_tahqfEyT)}`;
try {
const _ckiVUwGO = await fetch(_lNPLEGaj, { _HkeZcJzJ: { 'User-Agent': _opVZERQd._HkeZcJzJ.get('User-Agent') || 'Cloudflare-Worker-Sub-Fetcher/1.0' } });
const _wUNBxwOH = new Headers(_ckiVUwGO._HkeZcJzJ);
_wUNBxwOH._WQzLJkbN('Access-Control-Allow-Origin', '*');
return new Response(_ckiVUwGO._bFnmbIPb, { status: _ckiVUwGO.status, statusText: _ckiVUwGO.statusText, _HkeZcJzJ: _wUNBxwOH });
} catch (_tvxkpUEP) {
return new Response(`获取上游订阅失败: ${_tvxkpUEP._wNfQiTXI}`, { status: 502, _HkeZcJzJ: { 'Content-Type': '_qHDXNHKk/plain; _WjjQYTfR=utf-8' } });
}
}
if (_kzDNrvFw.startsWith('/https:/') || _kzDNrvFw.startsWith('/http:/')) {
return _uHDaKAGQ(_opVZERQd, _lAnBRGEp);
}
if (_lAnBRGEp.customSubPath && _lAnBRGEp.customSubPath._JffIBwcN && _lAnBRGEp.customSubPath._kzDNrvFw && _kzDNrvFw === '/' + _lAnBRGEp.customSubPath._kzDNrvFw.trim()) {
const _tGLnKbaz = _LnYLwDru.DB.prepare("SELECT _vfHUiPZP FROM kv_data WHERE _cKnSaaNg = ?").bind(_SaksCYPQ);
const { _YyMJpvZO } = await _tGLnKbaz.all();
const _UIJzBxub = _YyMJpvZO._vSLCgYNM > 0 ? _YyMJpvZO[0]._vfHUiPZP : null;
if (_UIJzBxub) {
return _ZjQbqAjq({ _CqoAmXhq: { _KcwRLXII: _UIJzBxub }, _gSrsDldw: _opVZERQd._gSrsDldw }, _LnYLwDru);
} else {
return new Response("未找到最新的优选结果集。", { status: 404, _HkeZcJzJ: { 'Content-Type': '_qHDXNHKk/plain; _WjjQYTfR=utf-8' } });
}
}
const _banTfdeN = _kzDNrvFw.split('/').filter(Boolean);
if (_banTfdeN._vSLCgYNM === 1 && !_kzDNrvFw.startsWith('/api/')) {
const _mxotJkPt = _banTfdeN[0];
return _ZjQbqAjq({ _CqoAmXhq: { _KcwRLXII: _mxotJkPt }, _gSrsDldw: _opVZERQd._gSrsDldw }, _LnYLwDru);
}
if (_kzDNrvFw.startsWith('/api/')) {
if (_kzDNrvFw === '/api/_lAnBRGEp' && _opVZERQd.method === 'POST') return _fHNDRfkx(_opVZERQd, _LnYLwDru, _fLeXDIno);
if (_kzDNrvFw === '/api/_WQzLJkbN-_PqupMHCI') return _bvbrTZAG(_opVZERQd, _LnYLwDru);
if (_kzDNrvFw === '/api/change-_PqupMHCI') return _sQypzYaX(_opVZERQd, _LnYLwDru);
if (_kzDNrvFw === '/api/verify-_PqupMHCI') return _hPGmpIfp(_opVZERQd, _LnYLwDru);
if (_kzDNrvFw === '/api/verify-visitor-_PqupMHCI' && _opVZERQd.method === 'POST') return _jpHuQMpd(_opVZERQd, _LnYLwDru);
if (_kzDNrvFw === '/api/cache-live-_YyMJpvZO' && _opVZERQd.method === 'POST') return _LWgoliob(_opVZERQd, _LnYLwDru, _fLeXDIno);
if (_kzDNrvFw === '/api/get-_vZwwfXhN' && _opVZERQd.method === 'POST') return _FIflOVUm(_opVZERQd, _LnYLwDru);
if (_kzDNrvFw === '/api/get-cached-_cGuuNugw') return _NnhdDGLm(_opVZERQd, _LnYLwDru);
if (_kzDNrvFw === '/api/save-_cGuuNugw') return _rhTsvtpI(_opVZERQd, _LnYLwDru, _fLeXDIno);
if (_kzDNrvFw === '/api/save-and-get-sub-_KcwRLXII' && _opVZERQd.method === 'POST') return _eleVFHXY(_opVZERQd, _LnYLwDru);
if (_kzDNrvFw.startsWith('/api/get-_xmTglvvv/')) {
const _mxotJkPt = _kzDNrvFw.split('/').pop();
return _ZjQbqAjq({ _CqoAmXhq: { _KcwRLXII: _mxotJkPt }, _gSrsDldw: _opVZERQd._gSrsDldw }, _LnYLwDru);
}
if (_kzDNrvFw === '/api/_lAnBRGEp' && _opVZERQd.method === 'GET') return _ENmAsiwg(_LnYLwDru);
if (_kzDNrvFw === '/api/get-resolved-_cGuuNugw') return _LvlEyzMj(_opVZERQd);
if (_kzDNrvFw === '/api/parse-_cGuuNugw-from-_UNzJnkEp' && _opVZERQd.method === 'POST') return _eeAUPJio(_opVZERQd, _LnYLwDru);
if (_kzDNrvFw === '/api/endpoints') return _WLeYQZqM(_opVZERQd, _LnYLwDru);
if (_kzDNrvFw === '/api/ping') return new Response(null, { status: 204 });
return new Response("API not found", { status: 404 });
}
if (_kzDNrvFw === '/_EOsXPwux') return _vafLkNoN(_opVZERQd, _LnYLwDru);
if (_kzDNrvFw === '/bing-wallpaper') return _BVvqaKdK();
return _JwvvalgG(_opVZERQd, _LnYLwDru, _fLeXDIno);
} catch (err) {
let _tvxkpUEP = err;
return new Response(_tvxkpUEP.toString(), { status: 500 });
}
}
};
const _eUpGjcgG = { 'Accept': '_qHDXNHKk/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 _fFkGBFpm(_gSrsDldw, _aDlJFiNJ) {
const _HYbHWpGu = await fetch(_gSrsDldw, { _HkeZcJzJ: { ..._eUpGjcgG, 'Referer': _aDlJFiNJ.referer } });
if (_HYbHWpGu.ok) return _HYbHWpGu._qHDXNHKk();
return null;
}
async function _XCXLTpZE(_gSrsDldw, _aDlJFiNJ) {
const _kyPJWSDK = `https://translate.google.com/translate?sl=auto&tl=en&u=${encodeURIComponent(_gSrsDldw)}`;
const _HYbHWpGu = await fetch(_kyPJWSDK, { _HkeZcJzJ: { ..._eUpGjcgG, 'Referer': _aDlJFiNJ.referer } });
if (!_HYbHWpGu.ok) return null;
const _bFnmbIPb = await _HYbHWpGu._qHDXNHKk();
const _GyoxhUgh = _bFnmbIPb._GyoxhUgh(/<pre[^>]*>([\s\S]*?)<\/pre>/_TrDDfKiX);
return _GyoxhUgh && _GyoxhUgh[1] ? _GyoxhUgh[1].replace(/&/g, '&') : null;
}
function _wMuviSKZ(_jNIRkUUw) {
let _dbSJKXGU;
try {
_dbSJKXGU = atob(_jNIRkUUw.replace(/\s/g, ''));
} catch (_tvxkpUEP) {
_dbSJKXGU = _jNIRkUUw;
}
const _xmTglvvv = _dbSJKXGU.split(/[\s\n\r,]+/).filter(line => line.trim());
const _iUTXDjQt = new Set();
const _sqaDqHsB = /@([^?#]+?):(\d+)/;
for (const _qzaCynCA of _xmTglvvv) {
let _dRmvkNRB = '';
let _RdgdiFuv = '';
try {
if (_qzaCynCA.startsWith('vmess://')) {
const _MKfFvnAi = atob(_qzaCynCA.substring(8));
const _lAnBRGEp = JSON.parse(_MKfFvnAi);
_dRmvkNRB = _lAnBRGEp.add;
_RdgdiFuv = _lAnBRGEp._RdgdiFuv;
} else {
const _GyoxhUgh = _qzaCynCA._GyoxhUgh(_sqaDqHsB);
if (_GyoxhUgh && _GyoxhUgh[1] && _GyoxhUgh[2]) {
_dRmvkNRB = _GyoxhUgh[1].replace(/[\[\]]/g, '');
_RdgdiFuv = _GyoxhUgh[2];
}
}
} catch (_tvxkpUEP) {
console.warn(`Could not parse _qzaCynCA: ${_qzaCynCA}`);
}
if (_dRmvkNRB && _RdgdiFuv) {
_iUTXDjQt.add(`${_dRmvkNRB}:${_RdgdiFuv}`);
}
}
return Array.from(_iUTXDjQt);
}
async function _vEtASaLj(_cIQsqkBx) {
try {
const _HYbHWpGu = await fetch(_cIQsqkBx, { _HkeZcJzJ: _eUpGjcgG });
if (!_HYbHWpGu.ok) {
console.error(`Failed to fetch subscription: ${_HYbHWpGu.status}`);
return [];
}
const _jNIRkUUw = await _HYbHWpGu._qHDXNHKk();
return _wMuviSKZ(_jNIRkUUw);
} catch (error) {
console.error(`Error processing subscription ${_cIQsqkBx}:`, error);
return [];
}
}
async function _lorBbZaO(_ftkDfMcd) {
const _sxYzuMfI = _ftkDfMcd.trim();
const _VNhbvSdT = /^(vless|vmess|trojan|ss):\/\//.test(_sxYzuMfI);
const _yNPQOMJA = (() => {
if (_sxYzuMfI._vSLCgYNM < 20 || _sxYzuMfI.startsWith('http')) return false;
const _ZJzmpHRx = _sxYzuMfI.replace(/\s/g, '');
if (_ZJzmpHRx._vSLCgYNM % 4 !== 0 && !_ZJzmpHRx.includes('=')) return false;
try {
atob(_ZJzmpHRx);
return true;
} catch (_tvxkpUEP) {
return false;
}
})();
if (_VNhbvSdT || _yNPQOMJA) {
return _wMuviSKZ(_sxYzuMfI).join('\n');
}
const _llGfDYJG = [
'https://ipdb.api.030101.xyz/?_Izqkumoo=bestcf&_GZCVTzCv=true',
'https://ipdb.api.030101.xyz/?_Izqkumoo=bestproxy&_GZCVTzCv=true'
];
const _RsURmjhg = /^(https?:\/\/)?([\w.-]+)\.([a-z]{2,})(\/.*)?(sub|clash|v2)/_TrDDfKiX.test(_ftkDfMcd) || _ftkDfMcd.includes('?_YOOTxeES=');
if (_RsURmjhg) {
const _cGuuNugw = await _vEtASaLj(_ftkDfMcd);
return _cGuuNugw.join('\n');
}
let _jNIRkUUw = '';
if (_llGfDYJG.includes(_ftkDfMcd)) {
_jNIRkUUw = await _fFkGBFpm(_ftkDfMcd, { referer: _ftkDfMcd });
if (!_jNIRkUUw || _jNIRkUUw._vSLCgYNM < 8) {
_jNIRkUUw = await _XCXLTpZE(_ftkDfMcd, { referer: _ftkDfMcd });
}
} else {
try {
const _qhfaanDL = await fetch(_ftkDfMcd, { _HkeZcJzJ: { 'User-Agent': 'Cloudflare-Worker' } });
if (_qhfaanDL.ok) {
_jNIRkUUw = await _qhfaanDL._qHDXNHKk();
} else {
console.warn(`Failed to fetch URL ${_ftkDfMcd}: ${_qhfaanDL.status}`);
}
} catch (_tvxkpUEP) {
console.error(`Error fetching URL ${_ftkDfMcd}:`, _tvxkpUEP);
}
}
const _lVWxBTiv = _wMuviSKZ(_jNIRkUUw);
if (_lVWxBTiv._vSLCgYNM > 0) {
return _lVWxBTiv.join('\n');
}
return _jNIRkUUw || '';
}
async function _uHDaKAGQ(_opVZERQd, _lAnBRGEp) {
if (!_lAnBRGEp.streamer._JffIBwcN) {
return new Response('远程流功能未开启', { status: 403 });
}
const _gSrsDldw = new URL(_opVZERQd._gSrsDldw);
const _WWPdaBHn = _gSrsDldw.pathname.substring(1).replace(':/', '://');
try {
const _lNPLEGaj = new URL(_WWPdaBHn);
const _zIwDriWH = ['github.com', 'objects.githubusercontent.com', 'cdn.jsdelivr.net'];
if (!_zIwDriWH.some(domain => _lNPLEGaj._dRmvkNRB.endsWith(domain))) {
return new Response('不支持的远程流域名', { status: 400 });
}
const _lAkuuZHG = new Headers(_opVZERQd._HkeZcJzJ);
_lAkuuZHG._WQzLJkbN('Host', _lNPLEGaj._dRmvkNRB);
_lAkuuZHG._WQzLJkbN('User-Agent', 'CF-Worker-Streamer/1.0');
const _iumlWgdC = await fetch(_lNPLEGaj.toString(), {
method: _opVZERQd.method,
_HkeZcJzJ: _lAkuuZHG,
_bFnmbIPb: _opVZERQd._bFnmbIPb,
});
const _wUNBxwOH = new Headers(_iumlWgdC._HkeZcJzJ);
_wUNBxwOH._WQzLJkbN('Access-Control-Allow-Origin', '*');
_wUNBxwOH._WQzLJkbN('Access-Control-Allow-Methods', 'GET, HEAD, POST, PUT, DELETE, OPTIONS');
_wUNBxwOH._WQzLJkbN('Access-Control-Allow-Headers', '*');
_wUNBxwOH._WQzLJkbN('Cache-Control', 'public, max-age=86400');
_wUNBxwOH._WQzLJkbN('X-Streamer-Source', 'CF-Worker');
_wUNBxwOH.delete('_jNIRkUUw-security-policy');
_wUNBxwOH.delete('x-_jNIRkUUw-security-policy');
_wUNBxwOH.delete('x-webkit-csp');
return new Response(_iumlWgdC._bFnmbIPb, {
status: _iumlWgdC.status,
statusText: _iumlWgdC.statusText,
_HkeZcJzJ: _wUNBxwOH,
});
} catch (_tvxkpUEP) {
return new Response('无效的目标URL', { status: 400 });
}
}
async function _NtOqWpHG(_opVZERQd, _LnYLwDru, _lAnBRGEp) {
try {
const _CJweEpGX = _lAnBRGEp || await _QheuDrLk(_LnYLwDru);
const _jvPagnfT = (_CJweEpGX.itemLink._WckUyFrt && _CJweEpGX.itemLink._WckUyFrt[0]) || {};
const _chfbqCjx = _jvPagnfT['_YOOTxeES'] || _vkRmgbyW(_KNSkOtax);
if (!_tXedwNyv(_chfbqCjx)) {
throw new Error("Configured user _zGIEDuSt is not valid.");
}
const _PDymAhrH = _CJweEpGX.dataFeeds.universalFallbackAddress;
let _DsempbiC = {};
const _wuCSryxm = _vkRmgbyW(_cqNDwoav[0] || "");
if (_PDymAhrH) {
const [_soWIZFcl, _RdgdiFuv = '443'] = _PDymAhrH.split(':');
_DsempbiC = { _soWIZFcl, _RdgdiFuv };
} else {
const [_soWIZFcl, _RdgdiFuv = '443'] = _wuCSryxm.split(':');
_DsempbiC = { _soWIZFcl, _RdgdiFuv };
}
const _gSrsDldw = new URL(_opVZERQd._gSrsDldw);
const _kzDNrvFw = _gSrsDldw.pathname;
let _bfNgGGFv = '';
const _wjNPoRDP = _gSrsDldw.searchParams.get('remote');
if (_wjNPoRDP) {
_bfNgGGFv = atob(_wjNPoRDP);
} else if (_kzDNrvFw.startsWith('/endpoint=')) {
_bfNgGGFv = _kzDNrvFw.substring(10);
} else if (_kzDNrvFw._vSLCgYNM > 1 && _kzDNrvFw.substring(1).includes('.')) {
_bfNgGGFv = _kzDNrvFw.substring(1);
}
if (_bfNgGGFv) {
const [_soWIZFcl, _RdgdiFuv = '443'] = _bfNgGGFv.split(':');
_DsempbiC = { _soWIZFcl, _RdgdiFuv };
}
return await _cFNGnJGe(_opVZERQd, _chfbqCjx, _DsempbiC);
} catch (err) {
return new Response(err.toString(), { status: 500 });
}
}
async function _cFNGnJGe(_opVZERQd, _zGIEDuSt, _DsempbiC) {
const _zNeVTtCR = new WebSocketPair();
const [clientEnd, _IaJTRjJV] = Object.values(_zNeVTtCR);
_IaJTRjJV.accept();
let _aFMtoKip = { _ASdBMarP: null };
const _RRZaZfqr = _opVZERQd._HkeZcJzJ.get("sec-websocket-protocol") || "";
const _WcftFtDu = _tBSGHfPn(_IaJTRjJV, _RRZaZfqr);
_WcftFtDu.pipeTo(new WritableStream({
async write(chunk) {
if (_aFMtoKip._ASdBMarP) {
const _qYCZgBor = _aFMtoKip._ASdBMarP.writable.getWriter();
await _qYCZgBor.write(chunk);
_qYCZgBor.releaseLock();
return;
}
const { error, details } = await _IFyapWNM(chunk, _zGIEDuSt);
if (error) {
throw new Error(details);
}
const _ZrCsmHpi = new Uint8Array([details._xrtQQlxH[0], 0]);
const _LiCNOePw = chunk.slice(details.payloadIndex);
await _IALNirGj(_aFMtoKip, details._jjCTjCXm, details._lMcMxuFr, _LiCNOePw, _IaJTRjJV, _ZrCsmHpi, _DsempbiC);
}
})).catch((err) => {
console.error("Stream processing error:", err);
_RXxFCDmS(_IaJTRjJV);
});
return new Response(null, { status: 101, webSocket: clientEnd });
}
async function _IALNirGj(_aFMtoKip, _jjCTjCXm, _lMcMxuFr, _WLrQHemp, _fPCPGfnf, _ZrCsmHpi, _OUQvNjsX) {
const _CMmIDNJW = async (_soWIZFcl, _RdgdiFuv) => {
let _BPWXtRAC = _soWIZFcl;
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(_soWIZFcl)) {
_BPWXtRAC = `${atob('d3d3Lg==')}${_soWIZFcl}${atob('LnNzbGlwLmlv')}`;
}
const _ASdBMarP = connect({ _dRmvkNRB: _BPWXtRAC, _RdgdiFuv });
_aFMtoKip._ASdBMarP = _ASdBMarP;
const _qYCZgBor = _ASdBMarP.writable.getWriter();
await _qYCZgBor.write(_WLrQHemp);
_qYCZgBor.releaseLock();
return _ASdBMarP;
};
const _niEOYrNx = async () => {
if (!_OUQvNjsX._soWIZFcl) return;
console.log(`Direct connection failed, falling back to gateway: ${_OUQvNjsX._soWIZFcl}`);
const _YkiWleAY = await _CMmIDNJW(_OUQvNjsX._soWIZFcl, parseInt(_OUQvNjsX._RdgdiFuv, 10));
_YkiWleAY.closed.catch(() => {}).finally(() => _RXxFCDmS(_fPCPGfnf));
_PjjEBUbm(_YkiWleAY, _fPCPGfnf, _ZrCsmHpi, null);
};
try {
const _rEulEMLc = await _CMmIDNJW(_jjCTjCXm, _lMcMxuFr);
_PjjEBUbm(_rEulEMLc, _fPCPGfnf, _ZrCsmHpi, _niEOYrNx);
} catch (err) {
console.error("Primary connection failed:", err);
await _niEOYrNx();
}
}
function _tBSGHfPn(_IaJTRjJV, _RRZaZfqr) {
let _SWdQneUJ = false;
return new ReadableStream({
start(_wDzGcrGK) {
_IaJTRjJV.addEventListener("_wNfQiTXI", (event) => { if (_SWdQneUJ) return; _wDzGcrGK.enqueue(event._aoBtofgp); });
_IaJTRjJV.addEventListener("close", () => { _RXxFCDmS(_IaJTRjJV); if (_SWdQneUJ) return; _wDzGcrGK.close(); });
_IaJTRjJV.addEventListener("error", (err) => _wDzGcrGK.error(err));
if (_RRZaZfqr) {
try {
const _JIGMMMCt = atob(_RRZaZfqr.replace(/-/g, "+").replace(/_/g, "/"));
_wDzGcrGK.enqueue(Uint8Array.from(_JIGMMMCt, c => c.charCodeAt(0))._hQZqZLRG);
} catch (_tvxkpUEP) { console.error("Failed to decode early _aoBtofgp:", _tvxkpUEP); }
}
},
cancel() { _SWdQneUJ = true; _RXxFCDmS(_IaJTRjJV); },
});
}
async function _IFyapWNM(_hQZqZLRG, _zGIEDuSt) {
if (_hQZqZLRG.byteLength < 24) return { error: true, details: "Invalid packet size" };
const _xrtQQlxH = new Uint8Array(_hQZqZLRG.slice(0, 1));
const _nnQHyzuv = _whXSVHvp(new Uint8Array(_hQZqZLRG.slice(1, 17)));
if (_nnQHyzuv !== _zGIEDuSt) return { error: true, details: "Invalid _zGIEDuSt" };
const _XRzvEOXp = new Uint8Array(_hQZqZLRG.slice(17, 18))[0];
const _MurqWeAN = new Uint8Array(_hQZqZLRG.slice(18 + _XRzvEOXp, 19 + _XRzvEOXp))[0];
if (_MurqWeAN !== 1) return { error: true, details: `Unsupported _MurqWeAN: ${_MurqWeAN}` };
const _BHPTnXNm = 19 + _XRzvEOXp;
const _lMcMxuFr = new DataView(_hQZqZLRG.slice(_BHPTnXNm, _BHPTnXNm + 2)).getUint16(0);
let _GvcEtNtD = _BHPTnXNm + 2;
const _vPsIaKyO = new Uint8Array(_hQZqZLRG.slice(_GvcEtNtD, _GvcEtNtD + 1))[0];
let _lflLjHLK = 0;
let _tgbaGLKJ = _GvcEtNtD + 1;
let _jjCTjCXm = "";
switch (_vPsIaKyO) {
case 1: _lflLjHLK = 4; _jjCTjCXm = new Uint8Array(_hQZqZLRG.slice(_tgbaGLKJ, _tgbaGLKJ + _lflLjHLK)).join("."); break;
case 2: _lflLjHLK = new Uint8Array(_hQZqZLRG.slice(_tgbaGLKJ, _tgbaGLKJ + 1))[0]; _tgbaGLKJ++; _jjCTjCXm = new TextDecoder().decode(_hQZqZLRG.slice(_tgbaGLKJ, _tgbaGLKJ + _lflLjHLK)); break;
case 3: _lflLjHLK = 16; const _UGBjbTUV = new DataView(_hQZqZLRG.slice(_tgbaGLKJ, _tgbaGLKJ + _lflLjHLK)); const _iYBPaeVE = []; for (let _TrDDfKiX = 0; _TrDDfKiX < 8; _TrDDfKiX++) _iYBPaeVE.push(_UGBjbTUV.getUint16(_TrDDfKiX * 2).toString(16)); _jjCTjCXm = _iYBPaeVE.join(":"); break;
default: return { error: true, details: `Invalid _ajLeFkRC _Izqkumoo: ${_vPsIaKyO}` };
}
if (!_jjCTjCXm) return { error: true, details: "Target _soWIZFcl is empty" };
return { error: false, details: { _jjCTjCXm, _lMcMxuFr, _xrtQQlxH, payloadIndex: _tgbaGLKJ + _lflLjHLK } };
}
async function _PjjEBUbm(_ASdBMarP, _fPCPGfnf, _AyHBrdnU, _qYmvLPLf) {
let _fxdmzzee = _AyHBrdnU;
let _Xnxndcqq = false;
let _NLqQWgAl = _ASdBMarP._WcftFtDu.pipeTo(new WritableStream({
write(chunk) {
_Xnxndcqq = true;
if (_fPCPGfnf.readyState !== 1) throw new Error("Channel is not open");
if (_fxdmzzee) {
const _Gmkhwyde = new Uint8Array(_fxdmzzee.byteLength + chunk.byteLength);
_Gmkhwyde._WQzLJkbN(new Uint8Array(_fxdmzzee));
_Gmkhwyde._WQzLJkbN(new Uint8Array(chunk), _fxdmzzee.byteLength);
_fPCPGfnf.send(_Gmkhwyde._hQZqZLRG);
_fxdmzzee = null;
} else {
_fPCPGfnf.send(chunk);
}
},
close() {}
}), { signal: new AbortController().signal }).catch((err) => {
console.error("Pipe to _fPCPGfnf error:", err._wNfQiTXI);
});
await _NLqQWgAl;
if (!_Xnxndcqq && _qYmvLPLf) {
_qYmvLPLf();
}
}
function _RXxFCDmS(_fPCPGfnf) {
try { if (_fPCPGfnf.readyState === 1 || _fPCPGfnf.readyState === 2) _fPCPGfnf.close(); } catch (_tvxkpUEP) {}
}
const _EurUCOet = Array.from({ _vSLCgYNM: 256 }, (_, _TrDDfKiX) => (_TrDDfKiX + 256).toString(16).slice(1));
function _whXSVHvp(_LSXFtemt, offset = 0) {
return (
_EurUCOet[_LSXFtemt[offset]] + _EurUCOet[_LSXFtemt[offset + 1]] + _EurUCOet[_LSXFtemt[offset + 2]] + _EurUCOet[_LSXFtemt[offset + 3]] + "-" +
_EurUCOet[_LSXFtemt[offset + 4]] + _EurUCOet[_LSXFtemt[offset + 5]] + "-" +
_EurUCOet[_LSXFtemt[offset + 6]] + _EurUCOet[_LSXFtemt[offset + 7]] + "-" +
_EurUCOet[_LSXFtemt[offset + 8]] + _EurUCOet[_LSXFtemt[offset + 9]] + "-" +
_EurUCOet[_LSXFtemt[offset + 10]] + _EurUCOet[_LSXFtemt[offset + 11]] +
_EurUCOet[_LSXFtemt[offset + 12]] + _EurUCOet[_LSXFtemt[offset + 13]] +
_EurUCOet[_LSXFtemt[offset + 14]] + _EurUCOet[_LSXFtemt[offset + 15]]
).toLowerCase();
}
let _pjpIbaHz = { "N/A":"未知" };
async function _pyAdLrKJ(_gSrsDldw, _KeuJbkHi, _qYmvLPLf) {
try {
const _HYbHWpGu = await fetch(_gSrsDldw, {
_HkeZcJzJ: { 'User-Agent': 'Cloudflare-Worker-IP-Scanner' }
});
if (!_HYbHWpGu.ok) {
console.error(`获取 ${_gSrsDldw} 失败: HTTP ${_HYbHWpGu.status}`);
return _qYmvLPLf;
}
const _qHDXNHKk = await _HYbHWpGu._qHDXNHKk();
return _KeuJbkHi(_qHDXNHKk);
} catch (error) {
console.error(`获取或解析 ${_gSrsDldw} 时发生网络错误: ${error._wNfQiTXI}`);
return _qYmvLPLf;
}
}
function _osrZcCdk(_qHDXNHKk) {
if (!_qHDXNHKk) return [];
const _IEEgMOHt = /^(?:\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\/\d{1,2}|[0-9a-fA-F:]+\/\d{1,3})$/;
const _uzmBMOnf = _qHDXNHKk.split(/[\s,;#|]+/);
const _LmUjhnkv = [];
for (const _SgykSoAL of _uzmBMOnf) {
const _cinycolO = _SgykSoAL.trim();
if (!_cinycolO) continue;
const _iYxTOzub = _cinycolO.lastIndexOf(':');
let _eAjOhMZi = _cinycolO;
if(_iYxTOzub > _cinycolO.lastIndexOf(']')) {
const _lqmJuixe = _cinycolO.substring(_iYxTOzub + 1);
if(!isNaN(_lqmJuixe) && _lqmJuixe._vSLCgYNM > 0) {
_eAjOhMZi = _cinycolO.substring(0, _iYxTOzub);
}
}
if (_DJQPqYAv.isValid(_eAjOhMZi.replace(/[\[\]]/g, '')) || _IEEgMOHt.test(_cinycolO)) {
_LmUjhnkv.push(_cinycolO);
}
}
return _LmUjhnkv;
}
function _PDOFvHDn(_qHDXNHKk) {
if (!_qHDXNHKk) return [];
return _qHDXNHKk.split(/\s+/).filter(d => d.trim() !== '');
}
function _DDJopqSA(_qHDXNHKk) {
if (!_qHDXNHKk) return { "N/A": "未知" };
try {
return JSON.parse(`{${_qHDXNHKk}}`);
} catch (_tvxkpUEP) {
console.error("解析 _pjpIbaHz 失败:", _tvxkpUEP);
return { "N/A": "未知" };
}
}
const _DJQPqYAv = {
isValid: (_EOsXPwux) => _DJQPqYAv.isIPv4(_EOsXPwux) || _DJQPqYAv.isIPv6(_EOsXPwux),
isIPv4: (_EOsXPwux) => {
if (typeof _EOsXPwux !== 'string') return false;
const _iYBPaeVE = _EOsXPwux.split('.');
if (_iYBPaeVE._vSLCgYNM !== 4) return false;
return _iYBPaeVE.every(_mCMjVJGN => {
const _KKvnfCPt = parseInt(_mCMjVJGN, 10);
return !isNaN(_KKvnfCPt) && _KKvnfCPt >= 0 && _KKvnfCPt <= 255 && String(_KKvnfCPt) === _mCMjVJGN;
});
},
isIPv6: (_EOsXPwux) => {
if (typeof _EOsXPwux !== '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]))$/_TrDDfKiX.test(_EOsXPwux);
},
toLong4: (_EOsXPwux) => _EOsXPwux.split('.').reduce((acc, octet, _TrDDfKiX) => acc + (parseInt(octet) << (8*(3-_TrDDfKiX))),0)>>>0,
fromLong4: (long) => [(long>>>24)&0xFF,(long>>>16)&0xFF,(long>>>8)&0xFF,long&0xFF].join('.'),
toBigInt6: (_EOsXPwux) => {
try {
const _YPVhcUXr = _EOsXPwux.split('/')[0];
const _iYBPaeVE = _YPVhcUXr.split('::');
if (_iYBPaeVE._vSLCgYNM > 2) return 0n;
let _JCcHZHmK = [];
if (_iYBPaeVE[0]) {
_JCcHZHmK = _iYBPaeVE[0].split(':');
}
let _ItxIRkJi = [];
if (_iYBPaeVE._vSLCgYNM > 1 && _iYBPaeVE[1]) {
_ItxIRkJi = _iYBPaeVE[1].split(':');
}
if (_JCcHZHmK._vSLCgYNM + _ItxIRkJi._vSLCgYNM > 8) return 0n;
const _pmxIXtIM = 8 - (_JCcHZHmK._vSLCgYNM + _ItxIRkJi._vSLCgYNM);
const _dRgotqxa = [
..._JCcHZHmK,
...Array(_pmxIXtIM).fill('0'),
..._ItxIRkJi
].map(_mCMjVJGN => _mCMjVJGN || '0');
while(_dRgotqxa._vSLCgYNM < 8) {
_dRgotqxa.push('0');
}
let _gydctXAO = 0n;
for (const _mCMjVJGN of _dRgotqxa) {
if (_mCMjVJGN._vSLCgYNM > 4) return 0n;
const _vfHUiPZP = BigInt('0x' + _mCMjVJGN);
_gydctXAO = (_gydctXAO << 16n) | _vfHUiPZP;
}
return _gydctXAO;
} catch(_tvxkpUEP) {
return 0n;
}
},
fromBigInt6: (_gydctXAO) => {
if (typeof _gydctXAO !== '_gydctXAO' || _gydctXAO < 0n) return null;
const _iYBPaeVE = [];
for (let _TrDDfKiX = 0; _TrDDfKiX < 8; _TrDDfKiX++) {
_iYBPaeVE.unshift((_gydctXAO & 0xFFFFn).toString(16));
_gydctXAO >>= 16n;
}
let _AlGZiPFh = { start: -1, _SQPfNbTH: 0 };
let _UOXRTFlj = { start: -1, _SQPfNbTH: 0 };
for (let _TrDDfKiX = 0; _TrDDfKiX < 8; _TrDDfKiX++) {
if (_iYBPaeVE[_TrDDfKiX] === '0') {
if (_UOXRTFlj.start === -1) _UOXRTFlj.start = _TrDDfKiX;
_UOXRTFlj._SQPfNbTH++;
} else {
if (_UOXRTFlj._SQPfNbTH > _AlGZiPFh._SQPfNbTH) _AlGZiPFh = { ..._UOXRTFlj };
_UOXRTFlj = { start: -1, _SQPfNbTH: 0 };
}
}
if (_UOXRTFlj._SQPfNbTH > _AlGZiPFh._SQPfNbTH) _AlGZiPFh = { ..._UOXRTFlj };
if (_AlGZiPFh._SQPfNbTH > 1) {
_iYBPaeVE.splice(_AlGZiPFh.start, _AlGZiPFh._SQPfNbTH, '');
if (_AlGZiPFh.start === 0) _iYBPaeVE.unshift('');
if (_AlGZiPFh.start + _AlGZiPFh._SQPfNbTH === 8) _iYBPaeVE.push('');
}
return _iYBPaeVE.join(':');
},
cidrToRange: (cidr, _HlOzAPTr = 1) => {
try {
const [range, bitsStr] = cidr.split('/');
const _wQPpmvlU = parseInt(bitsStr, 10);
const _cGuuNugw = new Set();
if (_DJQPqYAv.isIPv4(range)) {
if (isNaN(_wQPpmvlU) || _wQPpmvlU < 8 || _wQPpmvlU > 32) return [];
if (_wQPpmvlU === 32) return [range];
const _CzEDPIaw = _DJQPqYAv.toLong4(range);
const _bmloPzat = (0xFFFFFFFF << (32 - _wQPpmvlU)) >>> 0;
const _xzElaCDj = _CzEDPIaw & _bmloPzat;
const _lwPyXgTv = 1 << (32 - _wQPpmvlU);
if (_lwPyXgTv <= 2) return [];
const _PwPMFJTb = Math.min(_HlOzAPTr, _lwPyXgTv - 2);
let _CKFzdqIy = 0;
while (_cGuuNugw.size < _PwPMFJTb && _CKFzdqIy < _PwPMFJTb * 5) {
const _OBqZjFkV = Math.floor(Math.random() * (_lwPyXgTv - 2)) + 1;
_cGuuNugw.add(_DJQPqYAv.fromLong4((_xzElaCDj + _OBqZjFkV) >>> 0));
_CKFzdqIy++;
}
return Array.from(_cGuuNugw);
} else if (_DJQPqYAv.isIPv6(range)) {
if (isNaN(_wQPpmvlU) || _wQPpmvlU < 16 || _wQPpmvlU > 128) return [];
if (_wQPpmvlU === 128) return [range];
const _hcochVSG = _DJQPqYAv.toBigInt6(range);
const _bmloPzat = (2n ** BigInt(128 - _wQPpmvlU) - 1n);
const _xzElaCDj = _hcochVSG & ~_bmloPzat;
const _jgMmBbMS = 2n ** BigInt(128 - _wQPpmvlU);
if (_jgMmBbMS <= 2n) return [];
let _CKFzdqIy = 0;
while (_cGuuNugw.size < _HlOzAPTr && _CKFzdqIy < _HlOzAPTr * 5) {
const _LWaYSrMg = new Uint8Array(16);
(typeof crypto !== 'undefined' ? crypto : self.crypto).getRandomValues(_LWaYSrMg);
let _nDdbSETd = 0n;
for (const _xQloXpxy of _LWaYSrMg) {
_nDdbSETd = (_nDdbSETd << 8n) | BigInt(_xQloXpxy);
}
const _OBqZjFkV = _nDdbSETd % (_jgMmBbMS - 2n) + 1n;
_cGuuNugw.add(_DJQPqYAv.fromBigInt6(_xzElaCDj + _OBqZjFkV));
_CKFzdqIy++;
}
return Array.from(_cGuuNugw);
}
return [];
} catch(_tvxkpUEP) {
console.error(`CIDR to range failed for ${cidr}:`, _tvxkpUEP);
return [];
}
}
};
function _rtLicTrT(_SXaxEmEQ, _XeEFvDzB) {
const _HgYSBEzZ = {};
const _KIiFKmHv = Object._KIiFKmHv(_XeEFvDzB);
const _iYBPaeVE = _KIiFKmHv.map(_cKnSaaNg => {
const _ZZyLxUAt = _SXaxEmEQ * (_XeEFvDzB[_cKnSaaNg] / 100);
return { _cKnSaaNg, _HlOzAPTr: Math.floor(_ZZyLxUAt), remainder: _ZZyLxUAt - Math.floor(_ZZyLxUAt) };
});
let _oQMIiJbv = _iYBPaeVE.reduce((acc, _mCMjVJGN) => acc + _mCMjVJGN._HlOzAPTr, 0);
_iYBPaeVE.sort((a, b) => b.remainder - a.remainder);
let _MsTaJPSX = _SXaxEmEQ - _oQMIiJbv;
for (let _TrDDfKiX = 0; _TrDDfKiX < _MsTaJPSX; _TrDDfKiX++) {
_iYBPaeVE[_TrDDfKiX % _iYBPaeVE._vSLCgYNM]._HlOzAPTr++;
}
for (const _mCMjVJGN of _iYBPaeVE) {
_HgYSBEzZ[_mCMjVJGN._cKnSaaNg] = _mCMjVJGN._HlOzAPTr;
}
return _HgYSBEzZ;
}
async function _qYQTVUcQ(_LnYLwDru) {
const _tGLnKbaz = _LnYLwDru.DB.prepare("SELECT _vfHUiPZP FROM kv_data WHERE _cKnSaaNg = ?").bind(_hUWofvaB);
const { _YyMJpvZO } = await _tGLnKbaz.all();
return _YyMJpvZO._vSLCgYNM > 0 ? _YyMJpvZO[0]._vfHUiPZP : null;
}
async function _aBHhpIJw(_LnYLwDru, _PqupMHCI) {
const _tGLnKbaz = _LnYLwDru.DB.prepare(
"INSERT INTO kv_data (_cKnSaaNg, _vfHUiPZP) VALUES (?, ?) ON CONFLICT(_cKnSaaNg) DO UPDATE SET _vfHUiPZP = excluded._vfHUiPZP"
);
await _tGLnKbaz.bind(_hUWofvaB, _PqupMHCI).run();
}
async function _hPGmpIfp(_opVZERQd, _LnYLwDru) {
const { _PqupMHCI } = await _opVZERQd.json();
const _piYNgeJh = await _qYQTVUcQ(_LnYLwDru);
if (_piYNgeJh === _PqupMHCI) {
return _kVNxNKwK({ success: true });
}
return _kVNxNKwK({ success: false, _wNfQiTXI: '密码错误' }, 401);
}
async function _jpHuQMpd(_opVZERQd, _LnYLwDru) {
const _jhiXiTmU = await _QheuDrLk(_LnYLwDru);
if (!_jhiXiTmU.visitorPassword || !_jhiXiTmU.visitorPassword._JffIBwcN) {
return _kVNxNKwK({ success: true });
}
try {
const { _PqupMHCI } = await _opVZERQd.json();
const _yoYCpkGK = _jhiXiTmU.visitorPassword._PqupMHCI;
if (_yoYCpkGK && _PqupMHCI === _yoYCpkGK) {
return _kVNxNKwK({ success: true });
}
return _kVNxNKwK({ success: false, _wNfQiTXI: '访客密码错误' }, 401);
} catch (_tvxkpUEP) {
return _kVNxNKwK({ success: false, _wNfQiTXI: '无效请求' }, 400);
}
}
async function _bvbrTZAG(_opVZERQd, _LnYLwDru) {
const _bQVQwxSl = await _qYQTVUcQ(_LnYLwDru);
if (_bQVQwxSl) {
return _kVNxNKwK({ success: false, _wNfQiTXI: "密码已设置,无法重复初始化。" }, 403);
}
const { _PqupMHCI } = await _opVZERQd.json();
if (!_PqupMHCI || _PqupMHCI._vSLCgYNM < 6) {
return _kVNxNKwK({ success: false, _wNfQiTXI: "密码长度不能少于6位。" }, 400);
}
await _aBHhpIJw(_LnYLwDru, _PqupMHCI);
return _kVNxNKwK({ success: true, _wNfQiTXI: "初始密码设置成功!请刷新页面并登录。" });
}
async function _sQypzYaX(_opVZERQd, _LnYLwDru) {
const { _ruIwrOZj, _dwIOCuKg } = await _opVZERQd.json();
const _piYNgeJh = await _qYQTVUcQ(_LnYLwDru);
if (_piYNgeJh !== _ruIwrOZj) {
return _kVNxNKwK({ success: false, _wNfQiTXI: "旧密码错误。" }, 403);
}
if (!_dwIOCuKg || _dwIOCuKg._vSLCgYNM < 6) {
return _kVNxNKwK({ success: false, _wNfQiTXI: "新密码长度不能少于6位。" }, 400);
}
await _aBHhpIJw(_LnYLwDru, _dwIOCuKg);
return _kVNxNKwK({ success: true, _wNfQiTXI: "密码修改成功!" });
}
function _LEntBHag() {
return {
theme: 'theme-aurora-glass',
primaryColor: '#00A0FF',
particleColor: '#FFFFFF',
useResolvedDomains: false,
resolvedDomains: '',
sampleSize: 150,
topN: 10,
rttRandomMin: 79,
rttRandomMax: 179,
_CAyXrAEB: '',
api: {
_JffIBwcN: true,
_wNfQiTXI: '维护中...',
},
ispFilter: { _JffIBwcN: true },
geoLocation: {
retries: 1,
filterUnknown: false,
},
streamer: {
_JffIBwcN: true
},
websocketStreamer: {
_JffIBwcN: true,
_gSrsDldw: 'https://snippets.neib.cn'
},
cloudStorage: {
_JffIBwcN: true
},
visitorPassword: {
_JffIBwcN: false,
_PqupMHCI: '',
},
customSubPath: {
_JffIBwcN: false,
_kzDNrvFw: 'latest',
},
subscriptionId: {
_vSLCgYNM: 8,
_WjjQYTfR: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'
},
itemLink: {
_JffIBwcN: true,
template: 'vless://{_YOOTxeES}@{_EOsXPwux}:{_RdgdiFuv}?encryption=none&security=tls&sni={_soWIZFcl}&fp=random&_Izqkumoo=ws&_soWIZFcl={_soWIZFcl}&_kzDNrvFw={_kzDNrvFw}#{_rYUhAXbq}',
selectionMode: 'first',
_WckUyFrt: [
{ _rYUhAXbq: '默认配置', _soWIZFcl: '', '_YOOTxeES': '3b4d4cd8-cb92-4421-bf86-fb51570fc038', _kzDNrvFw: '/?ed=2560' }
],
_ZRUAgYUp: [],
},
dataFeeds: {
universalFallbackAddress: '',
},
announcement: {
popup: {
_JffIBwcN: false,
_qHDXNHKk: '',
_TFEowNel: 5
},
marquee: {
_JffIBwcN: false,
_qHDXNHKk: ''
}
},
subscriptionUrl: {
prefixEnabled: false,
prefixUrl: '',
suffixEnabled: false,
suffixUrl: ''
},
fineGrained: {
_JffIBwcN: true,
sources: [
{ _xwSkDwlX: 'CF官方IPV4', _cGuuNugw: 'https://raw.githubusercontent.com/5yfx/CF_WEB_IP_Worekrs/refs/heads/main/IPV4', _vLUhtugh: false, _JffIBwcN: true, _dlSYyADM: 20 },
{ _xwSkDwlX: 'CF官方IPV6', _cGuuNugw: 'https://raw.githubusercontent.com/5yfx/CF_WEB_IP_Worekrs/refs/heads/main/IPV6', _vLUhtugh: false, _JffIBwcN: true, _dlSYyADM: 20 },
{ _xwSkDwlX: '反代优选0', _cGuuNugw: 'https://wvs.sosorg.nyc.mn/sub?_YOOTxeES=adb14576-6588-40da-99fd-b9894cd779b0&encryption=none&security=tls&sni=ss.nzvrn.com&_Izqkumoo=ws&_soWIZFcl=ss.nzvrn.com&_kzDNrvFw=%2Fsnippets%3Fip%3DendpointAddress%3Aport%28443%29%26nat64%3D6to4', _vLUhtugh: false, _JffIBwcN: true, _dlSYyADM: 30 },
{ _xwSkDwlX: '官方优选1', _cGuuNugw: 'https://ipdb.api.030101.xyz/?_Izqkumoo=bestcf&_GZCVTzCv=true', _vLUhtugh: false, _JffIBwcN: true, _dlSYyADM: 10 },
{ _xwSkDwlX: '反代优选2', _cGuuNugw: 'https://ipdb.api.030101.xyz/?_Izqkumoo=bestproxy&_GZCVTzCv=true', _vLUhtugh: false, _JffIBwcN: true, _dlSYyADM: 5 },
{ _xwSkDwlX: '官方优选2', _cGuuNugw: 'https://addressesapi.090227.xyz/_EOsXPwux.164746.xyz', _vLUhtugh: false, _JffIBwcN: true, _dlSYyADM: 10 },
{ _xwSkDwlX: '官方优选3', _cGuuNugw: 'https://cfxr.eu.org/getSub?_soWIZFcl=snipaste.huggy.qzz.io', _vLUhtugh: false, _JffIBwcN: true, _dlSYyADM: 5 },
{ _xwSkDwlX: '官方优选4', _cGuuNugw: 'https://addressesapi.090227.xyz/CloudFlareYes', _vLUhtugh: false, _JffIBwcN: true, _dlSYyADM: 10 }
]
},
customNodes: {
_JffIBwcN: 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 _CMLkOKmh(_XAWIkkio, _xGnaEYyU) {
if (!_XAWIkkio) return _xGnaEYyU;
const _uGPSHaaV = { ..._xGnaEYyU };
for (const _cKnSaaNg in _xGnaEYyU) {
if (_XAWIkkio.hasOwnProperty(_cKnSaaNg)) {
if (typeof _XAWIkkio[_cKnSaaNg] === 'object' && _XAWIkkio[_cKnSaaNg] !== null && !Array.isArray(_XAWIkkio[_cKnSaaNg]) && typeof _xGnaEYyU[_cKnSaaNg] === 'object' && _xGnaEYyU[_cKnSaaNg] !== null && !Array.isArray(_xGnaEYyU[_cKnSaaNg])) {
_uGPSHaaV[_cKnSaaNg] = _CMLkOKmh(_XAWIkkio[_cKnSaaNg], _xGnaEYyU[_cKnSaaNg]);
} else {
_uGPSHaaV[_cKnSaaNg] = _XAWIkkio[_cKnSaaNg];
}
}
}
return _uGPSHaaV;
}
async function _QheuDrLk(_LnYLwDru) {
try {
const _tGLnKbaz = _LnYLwDru.DB.prepare("SELECT _vfHUiPZP FROM kv_data WHERE _cKnSaaNg = ?").bind(_wstZEgGt);
const { _YyMJpvZO } = await _tGLnKbaz.all();
const _hcrgBdXs = _YyMJpvZO._vSLCgYNM > 0 ? _YyMJpvZO[0]._vfHUiPZP : null;
const _bFrvpwxA = _hcrgBdXs ? JSON.parse(_hcrgBdXs) : {};
return _CMLkOKmh(_bFrvpwxA, _LEntBHag());
} catch (_tvxkpUEP) {
console.error("无法从D1获取或解析全局配置:", _tvxkpUEP);
return _LEntBHag();
}
}
async function _ENmAsiwg(_LnYLwDru) {
const _lAnBRGEp = await _QheuDrLk(_LnYLwDru);
return _kVNxNKwK(_lAnBRGEp);
}
async function _fHNDRfkx(_opVZERQd, _LnYLwDru, _fLeXDIno) {
try {
const { _lAnBRGEp, adminPassword } = await _opVZERQd.json();
const _piYNgeJh = await _qYQTVUcQ(_LnYLwDru);
if (_piYNgeJh !== adminPassword) {
return _kVNxNKwK({ success: false, _wNfQiTXI: "管理员密码错误" }, 403);
}
const _tGLnKbaz = _LnYLwDru.DB.prepare(
"INSERT INTO kv_data (_cKnSaaNg, _vfHUiPZP) VALUES (?, ?) ON CONFLICT(_cKnSaaNg) DO UPDATE SET _vfHUiPZP = excluded._vfHUiPZP"
);
const _ZjLZdNVS = _tGLnKbaz.bind(_wstZEgGt, JSON.stringify(_lAnBRGEp)).run();
_fLeXDIno.waitUntil(_ZjLZdNVS);
return _kVNxNKwK({ success: true, _wNfQiTXI: "配置已成功保存!" });
} catch (_tvxkpUEP) {
return _kVNxNKwK({ success: false, _wNfQiTXI: `保存失败: ${_tvxkpUEP._wNfQiTXI}` }, 500);
}
}
async function _BVvqaKdK() {
const _DVBgKWuD = 'https://www.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1&mkt=zh-CN';
try {
const _xjGqtBRs = await fetch(_DVBgKWuD);
const _pLskANiY = await _xjGqtBRs.json();
const _VzdCadNk = 'https://www.bing.com' + _pLskANiY.images[0]._gSrsDldw;
return fetch(_VzdCadNk);
} catch (_tvxkpUEP) {
return new Response('获取壁纸失败', { status: 502 });
}
}
async function _JYOnASOS(_EOsXPwux) {
try {
const _HYbHWpGu = await fetch(`http://_EOsXPwux-api.com/json/${_EOsXPwux}?fields=status,_GZCVTzCv,countryCode,_ZuBLKFCL&lang=zh-CN`);
if (_HYbHWpGu.ok) {
const _aoBtofgp = await _HYbHWpGu.json();
if (_aoBtofgp.status === 'success' && (_aoBtofgp.countryCode || _aoBtofgp._GZCVTzCv)) {
let _ZuBLKFCL = _aoBtofgp._ZuBLKFCL || '未知';
if (_ZuBLKFCL.toLowerCase().includes('cloudflare')) {
_ZuBLKFCL = 'CloudFlare';
}
return {
_xwSkDwlX: _pjpIbaHz[_aoBtofgp.countryCode] || _aoBtofgp._GZCVTzCv || _aoBtofgp.countryCode,
_ZuBLKFCL: _ZuBLKFCL
};
}
}
} catch (_tvxkpUEP) {}
try {
const _HYbHWpGu = await fetch(`https://api._EOsXPwux.sb/geoip/${_EOsXPwux}`);
if (_HYbHWpGu.ok) {
const _aoBtofgp = await _HYbHWpGu.json();
if (_aoBtofgp.country_code || _aoBtofgp._GZCVTzCv) {
let _ZuBLKFCL = _aoBtofgp._ZuBLKFCL || '未知';
if (_ZuBLKFCL.toLowerCase().includes('cloudflare')) {
_ZuBLKFCL = 'CloudFlare';
}
return {
_xwSkDwlX: _pjpIbaHz[_aoBtofgp.country_code] || _aoBtofgp._GZCVTzCv || _aoBtofgp.country_code,
_ZuBLKFCL: _ZuBLKFCL
};
}
}
} catch (_tvxkpUEP) {}
return { _xwSkDwlX: '未知', _ZuBLKFCL: '未知' };
}
async function _FIflOVUm(_opVZERQd, _LnYLwDru) {
try {
const { _cGuuNugw } = await _opVZERQd.json();
if (!Array.isArray(_cGuuNugw)) {
return _kVNxNKwK({ error: "输入无效,需要一个IP数组。" }, 400);
}
const _VwfAESrn = _cGuuNugw.map(_EOsXPwux => _JYOnASOS(_EOsXPwux).then(_vZwwfXhN => ({ _EOsXPwux, ..._vZwwfXhN })));
const _YyMJpvZO = await Promise.all(_VwfAESrn);
return _kVNxNKwK(_YyMJpvZO);
} catch (_tvxkpUEP) {
return _kVNxNKwK({ error: `获取地理位置失败: ${_tvxkpUEP._wNfQiTXI}` }, 500);
}
}
async function _NnhdDGLm(_opVZERQd, _LnYLwDru) {
const _lAnBRGEp = await _QheuDrLk(_LnYLwDru);
if (!_lAnBRGEp.cloudStorage._JffIBwcN) {
return _kVNxNKwK({ _YyMJpvZO: [], generatedBy: null });
}
try {
const _tGLnKbaz = _LnYLwDru.DB.prepare("SELECT _vfHUiPZP FROM kv_data WHERE _cKnSaaNg = ?").bind(_ScVRJfpK);
const { _YyMJpvZO } = await _tGLnKbaz.all();
const _wpFQKcjB = _YyMJpvZO._vSLCgYNM > 0 ? _YyMJpvZO[0]._vfHUiPZP : null;
const _DSVYQqQC = _wpFQKcjB ? JSON.parse(_wpFQKcjB) : null;
return _kVNxNKwK(_DSVYQqQC || { _YyMJpvZO: [], generatedBy: null });
} catch (_tvxkpUEP) {
console.error("从D1读取缓存IP失败:", _tvxkpUEP);
return _kVNxNKwK({ _YyMJpvZO: [], generatedBy: null });
}
}
async function _rhTsvtpI(_opVZERQd, _LnYLwDru, _fLeXDIno) {
const _lAnBRGEp = await _QheuDrLk(_LnYLwDru);
if (!_lAnBRGEp.cloudStorage._JffIBwcN) {
return _kVNxNKwK({ success: true, _wNfQiTXI: "云端存储已禁用,不保存结果。" });
}
const _ifRltugt = _opVZERQd._HkeZcJzJ.get('CF-Connecting-IP') || "未知IP";
const _GZCVTzCv = _opVZERQd.cf?._GZCVTzCv || "未知";
const _XelYRcBU = _opVZERQd.cf?._XelYRcBU || "";
let _SYfjCoqC = _pjpIbaHz[_GZCVTzCv] || _GZCVTzCv;
if (_XelYRcBU && _XelYRcBU !== "未知城市" && _XelYRcBU !== _GZCVTzCv) _SYfjCoqC = `${_SYfjCoqC} ${_pjpIbaHz[_XelYRcBU] || _XelYRcBU}`;
const _jEGvOkWd = {
_EOsXPwux: _aJDpybEl(_ifRltugt),
_xwSkDwlX: _SYfjCoqC.trim(),
time: _HFwiNYgA()
};
try {
const _WRnGAjWx = await _opVZERQd.json();
if (!Array.isArray(_WRnGAjWx)) return _kVNxNKwK({ error: "无效数据格式" }, 400);
const _kpfmDAQO = _WRnGAjWx.map(_LtHywNdV => ({
_EOsXPwux: String(_LtHywNdV._EOsXPwux || ''),
_RdgdiFuv: _LtHywNdV._RdgdiFuv ? parseInt(_LtHywNdV._RdgdiFuv, 10) : undefined,
_KLlMtPUR: parseInt(_LtHywNdV._KLlMtPUR, 10),
_xwSkDwlX: typeof _LtHywNdV._xwSkDwlX === 'string' ? _LtHywNdV._xwSkDwlX.substring(0, 50) : 'N/A',
_ZuBLKFCL: typeof _LtHywNdV._ZuBLKFCL === 'string' ? _LtHywNdV._ZuBLKFCL.substring(0, 100) : 'N/A'
}));
const _PCnvAXcV = {
generatedBy: _jEGvOkWd,
_YyMJpvZO: _kpfmDAQO
};
const _iPRxmLQs = _LnYLwDru.DB.prepare(
"INSERT INTO kv_data (_cKnSaaNg, _vfHUiPZP) VALUES (?, ?) ON CONFLICT(_cKnSaaNg) DO UPDATE SET _vfHUiPZP = excluded._vfHUiPZP"
).bind(_ScVRJfpK, JSON.stringify(_PCnvAXcV)).run();
if (_lAnBRGEp.telegram.bot_token && _lAnBRGEp.telegram.chat_id) {
const _tZxJtInc = _kpfmDAQO.map(r => `${r._EOsXPwux} ~ ${r._xwSkDwlX}`).join('\n');
const _EwYzRnSk = `优选完成!\n来源: ${_jEGvOkWd._EOsXPwux} (${_jEGvOkWd._xwSkDwlX})\n时间: ${_jEGvOkWd.time}\n\n结果:\n${_tZxJtInc}`;
const _oVQcEcXG = `https://api.telegram.org/bot${_lAnBRGEp.telegram.bot_token}/sendMessage?chat_id=${_lAnBRGEp.telegram.chat_id}&_qHDXNHKk=${encodeURIComponent(_EwYzRnSk)}`;
const _NnMZPsVv = fetch(_oVQcEcXG).catch(_tvxkpUEP => console.error("Telegram结果通知失败:", _tvxkpUEP));
_fLeXDIno.waitUntil(Promise.all([_iPRxmLQs, _NnMZPsVv]));
} else {
_fLeXDIno.waitUntil(_iPRxmLQs);
}
return _kVNxNKwK({ success: true, _wNfQiTXI: "结果已保存" });
} catch (_tvxkpUEP) {
return _kVNxNKwK({ error: "D1写入失败", _wNfQiTXI: _tvxkpUEP._wNfQiTXI }, 500);
}
}
async function _LWgoliob(_opVZERQd, _LnYLwDru, _fLeXDIno) {
try {
const _GLrgnuVz = await _opVZERQd.json();
if (!Array.isArray(_GLrgnuVz)) return _kVNxNKwK({ error: "无效数据格式" }, 400);
const _PCnvAXcV = {
_YyMJpvZO: _GLrgnuVz
};
const _tGLnKbaz = _LnYLwDru.DB.prepare(
"INSERT INTO kv_data (_cKnSaaNg, _vfHUiPZP) VALUES (?, ?) ON CONFLICT(_cKnSaaNg) DO UPDATE SET _vfHUiPZP = excluded._vfHUiPZP"
);
const _ZjLZdNVS = _tGLnKbaz.bind(_zUmBAJkh, JSON.stringify(_PCnvAXcV)).run();
_fLeXDIno.waitUntil(_ZjLZdNVS);
return _kVNxNKwK({ success: true });
} catch (_tvxkpUEP) {
return _kVNxNKwK({ error: "D1写入临时缓存失败", _wNfQiTXI: _tvxkpUEP._wNfQiTXI }, 500);
}
}
function _YlLgOgHK(_vSLCgYNM, _WjjQYTfR) {
let _OJpHCPHa = '';
const _uqIwUVWs = _WjjQYTfR._vSLCgYNM;
for (let _TrDDfKiX = 0; _TrDDfKiX < _vSLCgYNM; _TrDDfKiX++) {
_OJpHCPHa += _WjjQYTfR.charAt(Math.floor(Math.random() * _uqIwUVWs));
}
return _OJpHCPHa;
}
async function _eleVFHXY(_opVZERQd, _LnYLwDru) {
try {
const _WRnGAjWx = await _opVZERQd.json();
if (!Array.isArray(_WRnGAjWx) || _WRnGAjWx._vSLCgYNM === 0) {
return _kVNxNKwK({ error: "无效或空的IP列表" }, 400);
}
const _lAnBRGEp = await _QheuDrLk(_LnYLwDru);
const _JqMdDNlc = _lAnBRGEp.subscriptionId || { _vSLCgYNM: 8, _WjjQYTfR: 'abcdefghijklmnopqrstuvwxyz0123456789' };
let _mxotJkPt;
let _duYNfNgE = false;
let _CKFzdqIy = 0;
const _JenKWQiD = 10;
while (!_duYNfNgE && _CKFzdqIy < _JenKWQiD) {
_mxotJkPt = _YlLgOgHK(_JqMdDNlc._vSLCgYNM, _JqMdDNlc._WjjQYTfR);
const { _YyMJpvZO } = await _LnYLwDru.DB.prepare("SELECT _KcwRLXII FROM optimized_results WHERE _KcwRLXII = ?").bind(_mxotJkPt).all();
if (_YyMJpvZO._vSLCgYNM === 0) {
_duYNfNgE = true;
}
_CKFzdqIy++;
}
if (!_duYNfNgE) {
return _kVNxNKwK({ error: "无法生成唯一的订阅ID,请稍后重试或调整ID设置。" }, 500);
}
const _bJcAVeSM = JSON.stringify({ _cGuuNugw: _WRnGAjWx });
await _LnYLwDru.DB.prepare(
"INSERT INTO optimized_results (_KcwRLXII, _aoBtofgp) VALUES (?, ?)"
).bind(_mxotJkPt, _bJcAVeSM).run();
await _LnYLwDru.DB.prepare(
"INSERT INTO kv_data (_cKnSaaNg, _vfHUiPZP) VALUES (?, ?) ON CONFLICT(_cKnSaaNg) DO UPDATE SET _vfHUiPZP = excluded._vfHUiPZP"
).bind(_SaksCYPQ, _mxotJkPt).run();
return _kVNxNKwK({ success: true, _KcwRLXII: _mxotJkPt });
} catch (_tvxkpUEP) {
return _kVNxNKwK({ error: "保存优选结果失败", _wNfQiTXI: _tvxkpUEP._wNfQiTXI }, 500);
}
}
async function _ZjQbqAjq(_opVZERQd, _LnYLwDru) {
try {
const _mxotJkPt = _opVZERQd._CqoAmXhq._KcwRLXII;
if (!_mxotJkPt) {
return new Response("缺少结果ID", { status: 400 });
}
const _OJpHCPHa = await _LnYLwDru.DB.prepare("SELECT _aoBtofgp FROM optimized_results WHERE _KcwRLXII = ?").bind(_mxotJkPt).first();
if (!_OJpHCPHa) {
return new Response("未找到对应的优选结果", { status: 404 });
}
const _aoBtofgp = JSON.parse(_OJpHCPHa._aoBtofgp);
let _tZxJtInc = _aoBtofgp._cGuuNugw;
const _lAnBRGEp = await _QheuDrLk(_LnYLwDru);
if (_lAnBRGEp.customNodes && _lAnBRGEp.customNodes._JffIBwcN && _lAnBRGEp.customNodes.list) {
const _GevKDhqJ = _lAnBRGEp.customNodes.list.trim().split(/\s+/).filter(Boolean);
const _SlERvdJC = _GevKDhqJ.map(_qzaCynCA => {
let _ajLeFkRC = _qzaCynCA;
let _RdgdiFuv = undefined;
let _rYUhAXbq = null;
if (_ajLeFkRC.includes('@')) {
const _iYBPaeVE = _ajLeFkRC.split('@');
_rYUhAXbq = _iYBPaeVE.pop();
_ajLeFkRC = _iYBPaeVE.join('@');
}
if (_ajLeFkRC.includes('#')) {
const _iYBPaeVE = _ajLeFkRC.split('#');
const _lqmJuixe = _iYBPaeVE.pop();
if (!isNaN(_lqmJuixe) && _lqmJuixe.trim() !== '') {
_RdgdiFuv = parseInt(_lqmJuixe, 10);
}
_ajLeFkRC = _iYBPaeVE.join('#');
}
return {
_EOsXPwux: _ajLeFkRC,
_RdgdiFuv: _RdgdiFuv,
_xwSkDwlX: _rYUhAXbq || _ajLeFkRC,
_ZuBLKFCL: '自定义'
};
});
_tZxJtInc.unshift(..._SlERvdJC);
}
const { itemLink } = _lAnBRGEp;
const _GNRRRgII = new URL(_opVZERQd._gSrsDldw)._dRmvkNRB;
let _KebwlRYU;
if (_lAnBRGEp.websocketStreamer && _lAnBRGEp.websocketStreamer._JffIBwcN) {
if (!itemLink || !itemLink._JffIBwcN || !itemLink._WckUyFrt || itemLink._WckUyFrt._vSLCgYNM === 0) {
return new Response("节点链接参数未配置或未启用 (反代模式)", { status: 500 });
}
_KebwlRYU = _tZxJtInc.map((_LtHywNdV, _BgxQXFxu) => {
let _rYUhAXbq;
if (_LtHywNdV._ZuBLKFCL === '自定义') {
_rYUhAXbq = `${_BgxQXFxu + 1} - ${_LtHywNdV._xwSkDwlX}`;
} else {
_rYUhAXbq = `${_BgxQXFxu + 1} - ${_LtHywNdV._xwSkDwlX || '未知'}`;
if (!_LtHywNdV._ZuBLKFCL || !_LtHywNdV._ZuBLKFCL.toLowerCase().includes('cloudflare')) {
_rYUhAXbq += '(反代)';
}
}
const _mhEgkNnH = _DJQPqYAv.isIPv6(_LtHywNdV._EOsXPwux) ? `[${_LtHywNdV._EOsXPwux}]` : _LtHywNdV._EOsXPwux;
const _RdgdiFuv = _LtHywNdV._RdgdiFuv || 443;
const _jrJkuape = itemLink._WckUyFrt[0];
const _KpQrNTQF = _jrJkuape._YOOTxeES || '';
const _YOOTxeES = (_KpQrNTQF && _tXedwNyv(_KpQrNTQF)) ? _KpQrNTQF : crypto.randomUUID();
const _kzDNrvFw = '/snippets?_EOsXPwux=endpointAddress:_RdgdiFuv(443)&nat64=6to4';
const _soWIZFcl = _jrJkuape._soWIZFcl || _GNRRRgII;
const _CqoAmXhq = new URLSearchParams({
security: 'tls',
_Izqkumoo: 'ws',
_soWIZFcl: _soWIZFcl,
sni: _soWIZFcl,
fp: 'random'
});
return `vless://${_YOOTxeES}@${_mhEgkNnH}:${_RdgdiFuv}?${_CqoAmXhq.toString()}&_kzDNrvFw=${encodeURIComponent(encodeURIComponent(_kzDNrvFw))}#${encodeURIComponent(_rYUhAXbq)}`;
});
} else {
if (!itemLink || !itemLink._JffIBwcN || !itemLink._WckUyFrt || itemLink._WckUyFrt._vSLCgYNM === 0) {
return new Response("节点链接参数未配置或未启用", { status: 500 });
}
const _jrJkuape = itemLink._WckUyFrt[0];
const { _soWIZFcl, _YOOTxeES, _kzDNrvFw } = _jrJkuape;
_KebwlRYU = _tZxJtInc.map((_LtHywNdV, _BgxQXFxu) => {
let _rYUhAXbq;
if (_LtHywNdV._ZuBLKFCL === '自定义') {
_rYUhAXbq = `${_BgxQXFxu + 1} - ${_LtHywNdV._xwSkDwlX}`;
} else {
_rYUhAXbq = `${_BgxQXFxu + 1} - ${_LtHywNdV._xwSkDwlX || '未知'}`;
if (!_LtHywNdV._ZuBLKFCL || !_LtHywNdV._ZuBLKFCL.toLowerCase().includes('cloudflare')) {
_rYUhAXbq += '(反代)';
}
}
const _mhEgkNnH = _DJQPqYAv.isIPv6(_LtHywNdV._EOsXPwux) ? `[${_LtHywNdV._EOsXPwux}]` : _LtHywNdV._EOsXPwux;
const _RdgdiFuv = _LtHywNdV._RdgdiFuv || 443;
const _CqoAmXhq = new URLSearchParams({
security: 'tls',
_Izqkumoo: 'ws',
_soWIZFcl: _soWIZFcl || _GNRRRgII,
sni: _soWIZFcl || _GNRRRgII,
fp: 'random'
});
return `vless://${_YOOTxeES}@${_mhEgkNnH}:${_RdgdiFuv}?${_CqoAmXhq.toString()}&_kzDNrvFw=${encodeURIComponent(encodeURIComponent(_kzDNrvFw || ''))}#${encodeURIComponent(_rYUhAXbq)}`;
});
}
const _MeZlmUdT = _KebwlRYU.join('\n');
const _zKZLDVaH = btoa(_MeZlmUdT);
return new Response(_zKZLDVaH, {
_HkeZcJzJ: { 'Content-Type': '_qHDXNHKk/plain; _WjjQYTfR=utf-8' }
});
} catch (_tvxkpUEP) {
return new Response(`生成节点列表失败: ${_tvxkpUEP._wNfQiTXI}`, { status: 500 });
}
}
async function _LvlEyzMj(_opVZERQd) {
try {
const { _DZuOzzOp, _Izqkumoo } = await _opVZERQd.json();
if (!Array.isArray(_DZuOzzOp)) {
return new Response('Invalid _DZuOzzOp list', { status: 400 });
}
const _TvmiwMqM = _DZuOzzOp.map(domain => {
if (!domain.trim()) return Promise.resolve([]);
const _gSrsDldw = `https://cloudflare-dns.com/dns-query?_rYUhAXbq=${encodeURIComponent(domain.trim())}&_Izqkumoo=${_Izqkumoo || 'A'}`;
return fetch(_gSrsDldw, { _HkeZcJzJ: { 'Accept': 'application/dns-json' } })
.then(_HYbHWpGu => _HYbHWpGu.json())
.then(_aoBtofgp => (_aoBtofgp.Answer ? _aoBtofgp.Answer.map(a => a._aoBtofgp) : []))
.catch(() => []);
});
const _kfvEKPPq = (await Promise.all(_TvmiwMqM)).flat();
const _ABNTwLvG = [...new Set(_kfvEKPPq)];
if (_ABNTwLvG._vSLCgYNM === 0) {
return new Response('无法从域名解析出任何IP。', { status: 500 });
}
return new Response(_ABNTwLvG.join('\n'), { _HkeZcJzJ: { 'Content-Type': '_qHDXNHKk/plain; _WjjQYTfR=utf-8' } });
} catch (err) {
return new Response(`域名解析错误: ${err._wNfQiTXI}`, { status: 500 });
}
}
async function _eeAUPJio(_opVZERQd, _LnYLwDru) {
try {
const { _UNzJnkEp } = await _opVZERQd.json();
if (!Array.isArray(_UNzJnkEp)) {
return _kVNxNKwK({ error: "Invalid input, expected an object with a '_UNzJnkEp' array." }, 400);
}
const _afMkIJle = new Set();
const _HDBPaLAv = _UNzJnkEp.map(_gSrsDldw =>
_lorBbZaO(_gSrsDldw)
.then(_qHDXNHKk => {
if (!_qHDXNHKk) return;
const _uzmBMOnf = _qHDXNHKk.split(/[\s,;|]+/);
for (const _SgykSoAL of _uzmBMOnf) {
const _cinycolO = _SgykSoAL.trim();
if (_cinycolO) {
_afMkIJle.add(_cinycolO);
}
}
})
.catch(err => {
console.error(`Error processing URL ${_gSrsDldw}:`, err);
})
);
await Promise.all(_HDBPaLAv);
return _kVNxNKwK({ _cGuuNugw: Array.from(_afMkIJle) });
} catch (_tvxkpUEP) {
return _kVNxNKwK({ error: `Failed to process URLs: ${_tvxkpUEP._wNfQiTXI}` }, 500);
}
}
async function _vafLkNoN(_opVZERQd, _LnYLwDru) {
const _lAnBRGEp = await _QheuDrLk(_LnYLwDru);
if (!_lAnBRGEp.api._JffIBwcN) {
return new Response(_lAnBRGEp.api._wNfQiTXI || 'API is disabled.', { status: 503 });
}
try {
const _tGLnKbaz = _LnYLwDru.DB.prepare("SELECT _vfHUiPZP FROM kv_data WHERE _cKnSaaNg = ?").bind(_ScVRJfpK);
const { _YyMJpvZO: dbResults } = await _tGLnKbaz.all();
const _wpFQKcjB = dbResults._vSLCgYNM > 0 ? dbResults[0]._vfHUiPZP : null;
const _DSVYQqQC = _wpFQKcjB ? JSON.parse(_wpFQKcjB) : null;
if (!_DSVYQqQC || !_DSVYQqQC._YyMJpvZO || _DSVYQqQC._YyMJpvZO._vSLCgYNM === 0) {
return new Response("上次优选结果为空。", {
status: 404,
_HkeZcJzJ: { 'Content-Type': '_qHDXNHKk/plain; _WjjQYTfR=utf-8' },
});
}
const _cGuuNugw = _DSVYQqQC._YyMJpvZO.map(r => r._EOsXPwux);
return new Response(_cGuuNugw.join('\n'), {
_HkeZcJzJ: { 'Content-Type': '_qHDXNHKk/plain; _WjjQYTfR=utf-8' },
});
} catch (_tvxkpUEP) {
console.error("API /_EOsXPwux 处理错误:", _tvxkpUEP);
return new Response(`API处理时出错: ${_tvxkpUEP._wNfQiTXI}`, { status: 500 });
}
}
function _ryhvRuHB(_OJpHCPHa, _BgxQXFxu, _lAnBRGEp, _GNRRRgII) {
const { itemLink } = _lAnBRGEp;
if (!itemLink || !itemLink._JffIBwcN) return null;
const { template, _WckUyFrt, selectionMode, _ZRUAgYUp } = itemLink;
if (!_WckUyFrt || _WckUyFrt._vSLCgYNM === 0) return null;
let _VvZIVCkI;
if (selectionMode === 'random') {
_VvZIVCkI = _WckUyFrt[_BgxQXFxu % _WckUyFrt._vSLCgYNM];
} else if (selectionMode === 'first') {
_VvZIVCkI = _WckUyFrt[0];
} else {
_VvZIVCkI = _WckUyFrt.find(s => s._rYUhAXbq === selectionMode) || _WckUyFrt[0];
}
if (!_VvZIVCkI) return null;
let _KgiQvKIf = template;
const _BPhznjwy = _OJpHCPHa._RdgdiFuv || 443;
const _PXNHNEwn = _DJQPqYAv.isIPv6(_OJpHCPHa._EOsXPwux) ? `[${_OJpHCPHa._EOsXPwux}]` : _OJpHCPHa._EOsXPwux;
let _rYUhAXbq = `${_BgxQXFxu + 1} 、 ${_OJpHCPHa._xwSkDwlX || '未知'}`;
if (!_OJpHCPHa._ZuBLKFCL || !_OJpHCPHa._ZuBLKFCL.toLowerCase().includes('cloudflare')) {
_rYUhAXbq += '(反代)';
}
let _soWIZFcl = _VvZIVCkI._soWIZFcl || _GNRRRgII;
_KgiQvKIf = _KgiQvKIf.replace(/{_EOsXPwux}/g, _PXNHNEwn)
.replace(/{_RdgdiFuv}/g, _BPhznjwy)
.replace(/{_rYUhAXbq}/g, encodeURIComponent(_rYUhAXbq))
.replace(/{rank}/g, _BgxQXFxu + 1)
.replace(/{_xwSkDwlX}/g, encodeURIComponent(_OJpHCPHa._xwSkDwlX || '未知'))
.replace(/{_ZuBLKFCL}/g, encodeURIComponent(_OJpHCPHa._ZuBLKFCL || '未知'))
.replace(/{_soWIZFcl}/g, encodeURIComponent(_soWIZFcl))
.replace(/{_YOOTxeES}/g, encodeURIComponent(_VvZIVCkI['_YOOTxeES'] || ''))
.replace(/{_kzDNrvFw}/g, encodeURIComponent(encodeURIComponent(_VvZIVCkI._kzDNrvFw || '')));
if (_ZRUAgYUp) {
_ZRUAgYUp.forEach(field => {
const _umNOfeVt = new RegExp('{' + field._rYUhAXbq + '}', 'g');
_KgiQvKIf = _KgiQvKIf.replace(_umNOfeVt, encodeURIComponent(field._vfHUiPZP));
});
}
return _KgiQvKIf;
}
async function _WLeYQZqM(_opVZERQd, _LnYLwDru) {
const _lAnBRGEp = await _QheuDrLk(_LnYLwDru);
if (!_lAnBRGEp.itemLink._JffIBwcN) {
return new Response("Item _KgiQvKIf feature is disabled.", { status: 503, _HkeZcJzJ: { 'Content-Type': '_qHDXNHKk/plain; _WjjQYTfR=utf-8' } });
}
try {
const _tGLnKbaz = _LnYLwDru.DB.prepare("SELECT _vfHUiPZP FROM kv_data WHERE _cKnSaaNg = ?").bind(_ScVRJfpK);
const { _YyMJpvZO: dbResults } = await _tGLnKbaz.all();
const _wpFQKcjB = dbResults._vSLCgYNM > 0 ? dbResults[0]._vfHUiPZP : null;
const _DSVYQqQC = _wpFQKcjB ? JSON.parse(_wpFQKcjB) : null;
if (!_DSVYQqQC || !_DSVYQqQC._YyMJpvZO || _DSVYQqQC._YyMJpvZO._vSLCgYNM === 0) {
return new Response("No optimized IPs available to generate endpoints.", {
status: 404,
_HkeZcJzJ: { 'Content-Type': '_qHDXNHKk/plain; _WjjQYTfR=utf-8' },
});
}
const _GNRRRgII = new URL(_opVZERQd._gSrsDldw)._dRmvkNRB;
const _eDjZjVmf = _DSVYQqQC._YyMJpvZO.map((_OJpHCPHa, _BgxQXFxu) => {
return _ryhvRuHB(_OJpHCPHa, _BgxQXFxu, _lAnBRGEp, _GNRRRgII);
}).filter(Boolean);
if (_eDjZjVmf._vSLCgYNM === 0) {
return new Response("Could not generate any _LtHywNdV links from the available IPs.", {
status: 500,
_HkeZcJzJ: { 'Content-Type': '_qHDXNHKk/plain; _WjjQYTfR=utf-8' },
});
}
return new Response(_eDjZjVmf.join('\n'), {
_HkeZcJzJ: { 'Content-Type': '_qHDXNHKk/plain; _WjjQYTfR=utf-8' },
});
} catch (_tvxkpUEP) {
console.error("API /api/endpoints error:", _tvxkpUEP);
return new Response(`Error processing API _opVZERQd: ${_tvxkpUEP._wNfQiTXI}`, { status: 500 });
}
}
async function _JwvvalgG(_opVZERQd, _LnYLwDru, _fLeXDIno) {
const _ifRltugt = _opVZERQd._HkeZcJzJ.get('CF-Connecting-IP') || "未知IP";
const [
_jDgfKjqS,
_bSzCKWtV,
defaultDomains,
fetchedCountryMap
] = await Promise.all([
_pyAdLrKJ(_HzwSSWdE, _osrZcCdk, []),
_pyAdLrKJ(_LeyPwlqk, _osrZcCdk, []),
_pyAdLrKJ(_PNjrzQzC, _PDOFvHDn, []),
_pyAdLrKJ(_fuOymmIv, _DDJopqSA, { "N/A": "未知" })
]);
_pjpIbaHz = fetchedCountryMap;
let _jEuvuKlZ = false;
let _jhiXiTmU;
try {
const _PqupMHCI = await _qYQTVUcQ(_LnYLwDru);
_jEuvuKlZ = !!_PqupMHCI;
_jhiXiTmU = await _QheuDrLk(_LnYLwDru);
} catch (_tvxkpUEP) {
if (_tvxkpUEP._wNfQiTXI && _tvxkpUEP._wNfQiTXI.includes('no such table')) {
console.log("检测到 'kv_data' 表不存在,正在自动创建...");
try {
const _AEWTVMne = "CREATE TABLE IF NOT EXISTS kv_data (_cKnSaaNg TEXT PRIMARY KEY, _vfHUiPZP TEXT); CREATE TABLE IF NOT EXISTS optimized_results (_KcwRLXII TEXT PRIMARY KEY, _aoBtofgp TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP);";
await _LnYLwDru.DB.exec(_AEWTVMne);
console.log("数据表创建成功。");
_jEuvuKlZ = false;
_jhiXiTmU = _LEntBHag();
} catch (dbError) {
console.error("自动创建数据表失败:", dbError);
return new Response(`数据库初始化失败: ${dbError._wNfQiTXI}`, {
status: 500,
_HkeZcJzJ: { 'Content-Type': '_qHDXNHKk/html;_WjjQYTfR=UTF-8' }
});
}
} else {
let _tFFlkNTx = _LowRxWEu(_tvxkpUEP._wNfQiTXI);
return new Response(_tFFlkNTx, { _HkeZcJzJ: { 'Content-Type': '_qHDXNHKk/html;_WjjQYTfR=UTF-8' } });
}
}
if (_jhiXiTmU.telegram.bot_token && _jhiXiTmU.telegram.chat_id) {
const _GZCVTzCv = _opVZERQd.cf?._GZCVTzCv || "未知";
const _XelYRcBU = _opVZERQd.cf?._XelYRcBU || "";
let _SYfjCoqC = _pjpIbaHz[_GZCVTzCv] || _GZCVTzCv;
if (_XelYRcBU && _XelYRcBU !== "未知城市" && _XelYRcBU !== _GZCVTzCv) _SYfjCoqC = `${_SYfjCoqC} ${_pjpIbaHz[_XelYRcBU] || _XelYRcBU}`;
const _clHMkxeL = _HFwiNYgA();
const _KEIxdsGQ = _opVZERQd._gSrsDldw;
const _EwYzRnSk = `访客: ${_ifRltugt}\n位置: ${_SYfjCoqC.trim()}\n时间: ${_clHMkxeL}\n来自:${_KEIxdsGQ}`;
const _oVQcEcXG = `https://api.telegram.org/bot${_jhiXiTmU.telegram.bot_token}/sendMessage?chat_id=${_jhiXiTmU.telegram.chat_id}&_qHDXNHKk=${encodeURIComponent(_EwYzRnSk)}`;
_fLeXDIno.waitUntil(fetch(_oVQcEcXG).catch(_tvxkpUEP => console.error("Telegram通知失败:", _tvxkpUEP)));
}
let _dfZldfbx = _qgpUfyKa();
const _yVhtlmSW = {
_lAnBRGEp: _jhiXiTmU,
status: {
_jEuvuKlZ: _jEuvuKlZ,
}
};
_dfZldfbx = _dfZldfbx.replace('__PAGE_DATA_JSON__', JSON.stringify(_yVhtlmSW));
_dfZldfbx = _dfZldfbx.replace('__ALL_CF_CIDR_LIST_JSON__', JSON.stringify(_jDgfKjqS));
_dfZldfbx = _dfZldfbx.replace('__BALANCED_CF_CIDR_LIST_JSON__', JSON.stringify(_bSzCKWtV));
_dfZldfbx = _dfZldfbx.replace('__DEFAULT_DOMAINS_LIST_JSON__', JSON.stringify(defaultDomains));
_dfZldfbx = _dfZldfbx.replace('__COUNTRY_MAP_JSON__', JSON.stringify(_pjpIbaHz));
return new Response(_dfZldfbx, {
_HkeZcJzJ: { 'Content-Type': '_qHDXNHKk/html;_WjjQYTfR=UTF-8' },
});
}
function _kVNxNKwK(_bFnmbIPb, status = 200, _HkeZcJzJ = {}) {
return new Response(JSON.stringify(_bFnmbIPb), {
status,
_HkeZcJzJ: { 'Content-Type': 'application/json;_WjjQYTfR=UTF-8', ..._HkeZcJzJ }
});
}
function _HFwiNYgA(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 _aJDpybEl(_EOsXPwux) {
if (!_EOsXPwux || typeof _EOsXPwux !== 'string') return "无效IP";
if(_DJQPqYAv.isIPv4(_EOsXPwux)){
const _iYBPaeVE = _EOsXPwux.split('.');
if (_iYBPaeVE._vSLCgYNM === 4) return `${_iYBPaeVE[0]}.*.*.${_iYBPaeVE[3]}`;
}
if(_DJQPqYAv.isIPv6(_EOsXPwux)){
const _iYBPaeVE = _EOsXPwux.split(':');
if (_iYBPaeVE._vSLCgYNM > 2) return `${_iYBPaeVE[0]}:...:${_iYBPaeVE[_iYBPaeVE._vSLCgYNM - 1]}`;
}
return _EOsXPwux;
}
function _LowRxWEu(_CancfVCo) {
return `
<!DOCTYPE html><html lang="zh-CN"><head><meta _WjjQYTfR="UTF-8"><title>需要设置</title>
<_jyuJTUML>
_bFnmbIPb { font-family: sans-serif; background: #1a1a1a; _UPmYnPHk: #e0e0e0; display: flex; justify-_jNIRkUUw: center; align-items: center; height: 100vh; margin: 0; }
._WpmrSMiw { max-_oSATxBOi: 800px; padding: 2rem; background: #25282e; border: 1px solid #4044c; border-radius: 8px; box-shadow: 0 5px 15px rgba(0,0,0,0.3); }
h1 { _UPmYnPHk: #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 { _UPmYnPHk: #da3633; background: rgba(218, 54, 51, 0.1); padding: 0.5rem; border-radius: 4px; margin-_eQRdnpPJ: 1rem; }
</_jyuJTUML>
</head><_bFnmbIPb>
<div class="_WpmrSMiw">
<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>
${_CancfVCo ? `<div class="error"><strong>当前错误信息:</strong> ${_CancfVCo.replace(/</g, "<").replace(/>/g, ">")}</div>` : ''}
</div>
</_bFnmbIPb></html>`;
}
function _qgpUfyKa() {
return `
<!DOCTYPE html><html lang="zh-CN"><head> <meta _WjjQYTfR="UTF-8"> <meta _rYUhAXbq="viewport" _jNIRkUUw="_oSATxBOi=device-_oSATxBOi, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"> <title>Cloudflare IP</title> <_KgiQvKIf 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>
<_jyuJTUML>
:root { --primary-_UPmYnPHk: #00A0FF; --primary-hover: #007ACC; --primary-gradient-start: #00C6FF; --primary-gradient-end: #0072FF; --secondary-_UPmYnPHk: #8c939d; --light-bg: #1A1C20; --_jNIRkUUw-bg: #25282E; --border-_UPmYnPHk: #40444C; --_qHDXNHKk-_UPmYnPHk: #E0E0E0; --_qHDXNHKk-light: #B0B0B0; --success-_UPmYnPHk: #30A46C; --danger-_UPmYnPHk: #DA3633; --warning-_UPmYnPHk: #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; }
_bFnmbIPb { font-family: var(--font-family-sans); background-_UPmYnPHk: var(--light-bg); _UPmYnPHk: var(--_qHDXNHKk-_UPmYnPHk); line-height: 1.65; overflow-x: hidden; padding: 0; position:relative; transition: background-_UPmYnPHk 0.5s ease; background-size: cover; background-position: center; background-attachment: fixed; }
#background-_eUWYQqbb { position: fixed; _eQRdnpPJ: 0; _ZsqXWuYO: 0; _oSATxBOi: 100%; height: 100%; z-_BgxQXFxu: -1; display: none; }
._TGlygotp-_WpmrSMiw { max-_oSATxBOi: 1100px; margin: 0 auto; padding: 0 1rem; position: relative; z-_BgxQXFxu: 1; }
#_zZniDKPa { position: fixed; _eQRdnpPJ: 1rem; right: 1rem; font-size: 0.85em; padding: 0.4em 0.8em; z-_BgxQXFxu: 10; }
#marquee-_WpmrSMiw { overflow: hidden; white-space: nowrap; background-_UPmYnPHk: rgba(37, 40, 46, 0.6); backdrop-filter: blur(5px); _UPmYnPHk: var(--primary-_UPmYnPHk); padding: 0.5rem 0; margin-_eQRdnpPJ: 1rem; border-radius: var(--border-radius-sm); display: none; }
#marquee-_qHDXNHKk { display: inline-block; padding-_ZsqXWuYO: 100%; animation: marquee-scroll 20s linear infinite; }
@keyframes marquee-scroll { 0% { transform: translateX(0); } 100% { transform: translateX(-100%); } }
_AyHBrdnU { _qHDXNHKk-align: center; margin-_eQRdnpPJ: 1rem; margin-bottom: 2rem; }
_AyHBrdnU h1 { white-space: pre-wrap; font-size: 2.25em; _UPmYnPHk: var(--primary-_UPmYnPHk); font-weight: 700; _qHDXNHKk-shadow: 0 0 10px rgba(var(--primary-_UPmYnPHk-rgb), 0.3); }
.card { background-_UPmYnPHk: 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-_UPmYnPHk); }
.progress-section #_LvCvyfXe { _oSATxBOi: 100%; height: 0.75rem; border-radius: var(--border-radius-sm); appearance: none; -webkit-appearance: none; background-_UPmYnPHk: var(--border-_UPmYnPHk); overflow: hidden; }
.progress-section #_LvCvyfXe::-webkit-progress-_vfHUiPZP { background: linear-gradient(90deg, var(--primary-gradient-start), var(--primary-gradient-end)); }
.progress-section #status { _qHDXNHKk-align: center; margin-_eQRdnpPJ: 0.75em; font-size: 0.95em; _UPmYnPHk: var(--_qHDXNHKk-light); min-height: 1.5em; }
.section-_AyHBrdnU { display: flex; flex-wrap: wrap; justify-_jNIRkUUw: space-between; align-items: center; margin-bottom: 1rem; padding-bottom: 0.75rem; border-bottom: 1px solid var(--border-_UPmYnPHk); gap: 1rem; }
.section-_AyHBrdnU h2 { font-size: 1.6em; font-weight: 600; margin:0; }
.generator-info { font-size: 0.85em; _UPmYnPHk: var(--secondary-_UPmYnPHk); _qHDXNHKk-align: right; flex-shrink: 0; }
.generator-info span { display: block; }
.table-responsive { _oSATxBOi: 100%; overflow-x: auto; -webkit-overflow-scrolling: touch; }
table { _oSATxBOi: 100%; border-collapse: collapse; margin-_eQRdnpPJ: 0; font-size: 0.9em; }
th, td { border-bottom: 1px solid var(--border-_UPmYnPHk); padding: 0.8em; _qHDXNHKk-align: _ZsqXWuYO; vertical-align: middle; white-space: nowrap; }
th { background-_UPmYnPHk: #2c3038; font-weight: 500; }
tbody tr:hover { background-_UPmYnPHk: #30333a; }
td._EOsXPwux-_ajLeFkRC { font-weight: 500; font-family: var(--font-family-mono); _UPmYnPHk: var(--primary-_UPmYnPHk); }
td.ping-_vfHUiPZP { font-weight: 600; font-family: var(--font-family-mono); }
td.actions-cell { _qHDXNHKk-align: right; }
.btn { display: inline-flex; align-items: center; justify-_jNIRkUUw: center; font-weight: 500; _qHDXNHKk-align: center; cursor: pointer; user-_XSglUwgt: none; background: linear-gradient(145deg, var(--primary-gradient-start), var(--primary-gradient-end)); border: 1px solid transparent; _UPmYnPHk: #fff; padding: 0.4em 0.8em; font-size: 0.85em; border-radius: var(--border-radius-sm); transition: all 0.2s ease-in-out; margin-_ZsqXWuYO: 6px; }
.btn:hover { transform: translateY(-2px); box-shadow: 0 4px 8px rgba(0, 0, 0, 0.3); }
.btn-outline { background: transparent; _UPmYnPHk: var(--primary-_UPmYnPHk); border: 1px solid var(--primary-_UPmYnPHk); }
.btn-outline:hover { background-_UPmYnPHk: var(--primary-_UPmYnPHk); _UPmYnPHk: var(--_jNIRkUUw-bg); }
._TGlygotp-download-buttons { display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: 1rem; }
._TGlygotp-download-buttons .btn { _oSATxBOi: 100%; margin: 0; }
.tooltip-notification { position: fixed; _eQRdnpPJ: 20px; right: 20px; padding: 12px 20px; border-radius: var(--border-radius-md); _UPmYnPHk: #fff; font-size: 0.95em; z-_BgxQXFxu: 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); }
#_DSHmiRzQ, #_BZAnTSqc, #_LaSaskBu, #_zQngErzE, #_slSKWVwQ { display: none; position: fixed; z-_BgxQXFxu: 10000; _ZsqXWuYO: 0; _eQRdnpPJ: 0; _oSATxBOi: 100%; height: 100%; background-_UPmYnPHk: rgba(0,0,0,0.6); justify-_jNIRkUUw: center; align-items: center; backdrop-filter: blur(5px); -webkit-backdrop-filter: blur(5px); }
.modal-_jNIRkUUw, ._TGlygotp-modal-_jNIRkUUw { background-_UPmYnPHk: var(--_jNIRkUUw-bg); padding: 2rem; border: 1px solid var(--border-_UPmYnPHk); border-radius: var(--border-radius-md); _oSATxBOi: 95%; max-_oSATxBOi: 800px; max-height: 90vh; overflow-y: auto; box-shadow: 0 5px 15px rgba(0,0,0,0.3); }
#_zQngErzE .modal-_jNIRkUUw { max-_oSATxBOi: 500px; }
.modal-_jNIRkUUw h3, ._TGlygotp-modal-_AyHBrdnU h3 { margin-_eQRdnpPJ: 0; margin-bottom: 1.5rem; _UPmYnPHk: var(--primary-_UPmYnPHk); _qHDXNHKk-align: center; }
.modal-buttons { display: flex; justify-_jNIRkUUw: flex-end; gap: 1rem; margin-_eQRdnpPJ: 2rem; border-_eQRdnpPJ: 1px solid var(--border-_UPmYnPHk); padding-_eQRdnpPJ: 1.5rem; }
.modal-section-divider { border: 0; height: 1px; background-image: linear-gradient(to right, rgba(0,0,0,0), var(--border-_UPmYnPHk), rgba(0,0,0,0)); margin: 2rem 0; }
._TGlygotp-modal-_AyHBrdnU { display: flex; justify-_jNIRkUUw: space-between; align-items: center; padding-bottom: 1rem; margin-bottom: 1rem; border-bottom: 1px solid var(--border-_UPmYnPHk); }
.modal-close-btn { font-size: 1.5rem; font-weight: bold; line-height: 1; _UPmYnPHk: var(--_qHDXNHKk-light); cursor: pointer; background: none; border: none; padding: 0; }
._TGlygotp-list-_LtHywNdV { display: flex; flex-direction: column; padding: 1rem; border: 1px solid var(--border-_UPmYnPHk); border-radius: var(--border-radius-sm); margin-bottom: 1rem; }
._TGlygotp-_rYUhAXbq { font-size: 1.1em; font-weight: 600; }
._TGlygotp-links a { display: block; _UPmYnPHk: var(--primary-_UPmYnPHk); _qHDXNHKk-decoration: none; margin-_eQRdnpPJ: 0.5rem; word-break: break-all; }
._TGlygotp-links a:hover { _qHDXNHKk-decoration: underline; }
._TGlygotp-links span { _UPmYnPHk: var(--_qHDXNHKk-light); }
#visitorPasswordPrompt { _qHDXNHKk-align: center; }
#visitorPasswordPrompt h3 { _UPmYnPHk: var(--primary-_UPmYnPHk); font-size: 1.4em; margin-bottom: 0.8rem; }
#visitorPasswordPrompt p { _UPmYnPHk: var(--_qHDXNHKk-light); margin-bottom: 1.5rem; }
._PqupMHCI-input-group { display: flex; gap: 10px; max-_oSATxBOi: 400px; margin: 0 auto; }
._PqupMHCI-input-group input { flex-grow: 1; _qHDXNHKk-align: center; }
._PqupMHCI-input-group .btn { margin-_ZsqXWuYO: 0; }
._YyMJpvZO-actions-_WpmrSMiw { _qHDXNHKk-align: center; margin-bottom: 1.5rem; }
._YyMJpvZO-api-buttons { display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: 1rem; }
._YyMJpvZO-api-buttons .btn { margin: 0; _oSATxBOi: 100%; font-size: 0.9em; padding: 0.5em 1em; }
.form-grid { display: grid; grid-template-columns: max-_jNIRkUUw 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 _XSglUwgt, .form-grid-control textarea { _oSATxBOi: 100%; background-_UPmYnPHk: var(--light-bg); border: 1px solid var(--border-_UPmYnPHk); border-radius: var(--border-radius-sm); _UPmYnPHk: var(--_qHDXNHKk-_UPmYnPHk); font-family: var(--font-family-sans); padding: 0.6em; transition: border-_UPmYnPHk 0.2s, box-shadow 0.2s; }
.form-grid-control input:focus, .form-grid-control _XSglUwgt:focus, .form-grid-control textarea:focus { border-_UPmYnPHk: var(--primary-_UPmYnPHk); box-shadow: 0 0 0 2px rgba(var(--primary-_UPmYnPHk-rgb), 0.2); outline: none; }
.form-grid-control input[_Izqkumoo="_UPmYnPHk"] { min-_oSATxBOi: auto; padding: 2px; _oSATxBOi: 2.5em; height: 2.5em; }
.form-grid-control input[_Izqkumoo="checkbox"] { _oSATxBOi: auto; flex-shrink: 0; height: 1.2em; _oSATxBOi: 1.2em; }
.form-grid-control ._dlSYyADM-input { _oSATxBOi: 80px; _qHDXNHKk-align: right; }
.tooltip-_WScjeTEm { display: inline-flex; _oSATxBOi: 16px; height: 16px; align-items: center; justify-_jNIRkUUw: center; background-_UPmYnPHk: var(--secondary-_UPmYnPHk); _UPmYnPHk: var(--_jNIRkUUw-bg); border-radius: 50%; font-size: 12px; font-weight: bold; cursor: pointer; user-_XSglUwgt: none; }
#tooltip-popup { position: fixed; background-_UPmYnPHk: #383c4a; _UPmYnPHk: #fff; padding: 10px 15px; border-radius: 6px; z-_BgxQXFxu: 10001; font-size: 0.85em; max-_oSATxBOi: 300px; display: none; box-shadow: 0 4px 12px rgba(0,0,0,0.4); border: 1px solid var(--border-_UPmYnPHk); pointer-events: none; }
#custom-fields-_WpmrSMiw .form-grid-control { gap: 5px; } #custom-fields-_WpmrSMiw .form-grid-control input { flex: 1; }
.parameter-_WQzLJkbN-_rGfAiOYn { border: 1px solid var(--border-_UPmYnPHk); border-radius: var(--border-radius-sm); padding: 1rem; margin-bottom: 1rem; }
.parameter-_WQzLJkbN-_AyHBrdnU { display: flex; justify-_jNIRkUUw: space-between; align-items: center; margin-bottom: 1rem; }
.parameter-_WQzLJkbN-_AyHBrdnU input { flex-grow: 1; margin-right: 1rem; }
.fine-grained-options { display: flex; gap: 1rem; margin-_eQRdnpPJ: 0.5rem; align-items: center; font-size: 0.9em; }
.fine-grained-options label { display: flex; align-items: center; gap: 0.3rem; cursor: pointer; }
._qHDXNHKk-_UPmYnPHk-grid { display: grid; grid-template-columns: auto 1fr; gap: 8px; align-items: center; _oSATxBOi: 100%; }
._qHDXNHKk-_UPmYnPHk-grid input[_Izqkumoo="_UPmYnPHk"] { grid-column: 1 / 2; }
._qHDXNHKk-_UPmYnPHk-grid input[_Izqkumoo="_qHDXNHKk"], ._qHDXNHKk-_UPmYnPHk-grid textarea { grid-column: 2 / 3; }
#_zQngErzE .button-grid { display: grid; grid-template-columns: 1fr; gap: 1rem; }
#_zQngErzE .btn-group { display: flex; }
#_zQngErzE .sub-btn { flex-grow: 1; margin: 0; }
#_zQngErzE ._LYsMyxgg-btn { flex-shrink: 0; margin-_ZsqXWuYO: -1px; border-_eQRdnpPJ-_ZsqXWuYO-radius: 0; border-bottom-_ZsqXWuYO-radius: 0; }
#_slSKWVwQ .modal-_jNIRkUUw { max-_oSATxBOi: 300px; background: white; padding: 1rem; _qHDXNHKk-align: center; }
#qrCodeImg { max-_oSATxBOi: 100%; }
@media (max-_oSATxBOi: 768px) {
html { font-size: 15px; } ._TGlygotp-_WpmrSMiw { padding: 0 0.8rem; } _AyHBrdnU { margin-_eQRdnpPJ: 2.5rem; margin-bottom: 1.5rem; } #_zZniDKPa { _eQRdnpPJ: 0.8rem; right: 0.8rem; } .card { padding: 1rem; }
.form-grid { grid-template-columns: 1fr; } .form-grid-label { justify-self: start; }
}
</_jyuJTUML>
<_jyuJTUML _KcwRLXII="theme-styles">
.theme-light { --light-bg: #F0F2F5; --_jNIRkUUw-bg: #FFFFFF; --border-_UPmYnPHk: #DCDFE6; --_qHDXNHKk-_UPmYnPHk: #303133; --_qHDXNHKk-light: #606266; }
.theme-light .card { background-_UPmYnPHk: rgba(255, 255, 255, 0.9); }
.theme-light th { background-_UPmYnPHk: #F5F7FA; }
.theme-light tbody tr:hover { background-_UPmYnPHk: #ECF5FF; }
.theme-matrix { --primary-_UPmYnPHk: #00FF41; --primary-hover: #39FF14; --light-bg: #000000; --_jNIRkUUw-bg: #0D0208; --border-_UPmYnPHk: #00FF41; --_qHDXNHKk-_UPmYnPHk: #00FF41; --_qHDXNHKk-light: #00FF41; font-family: var(--font-family-mono); }
.theme-matrix .card { background-_UPmYnPHk: rgba(0, 20, 0, 0.7); _qHDXNHKk-shadow: 0 0 5px var(--primary-_UPmYnPHk); backdrop-filter: none; }
.theme-matrix th { background-_UPmYnPHk: #000; }
.theme-matrix tbody tr:hover { background-_UPmYnPHk: #010; }
.theme-matrix .btn { _qHDXNHKk-shadow: none; _UPmYnPHk: #000; }
.theme-matrix .btn-outline { background-_UPmYnPHk: transparent; }
.theme-modern-glass { --primary-_UPmYnPHk: #00C6FF; --primary-hover: #0072FF; --light-bg: #000; --_jNIRkUUw-bg: rgba(30, 30, 40, 0.6); --border-_UPmYnPHk: rgba(255, 255, 255, 0.2); --_qHDXNHKk-_UPmYnPHk: #F0F0F0; --_qHDXNHKk-light: #A0A0B0; --border-radius-md: 12px; }
_bFnmbIPb.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-_UPmYnPHk: #00C6FF; --primary-hover: #0072FF; --light-bg: #1A1C20; --_jNIRkUUw-bg: rgba(30, 30, 40, 0.6); --border-_UPmYnPHk: rgba(255, 255, 255, 0.2); --_qHDXNHKk-_UPmYnPHk: #F0F0F0; --_qHDXNHKk-light: #A0A0B0; --border-radius-md: 12px; }
.glassy-components .card { background-_UPmYnPHk: var(--_jNIRkUUw-bg); backdrop-filter: blur(15px); -webkit-backdrop-filter: blur(15px); border: 1px solid var(--border-_UPmYnPHk); }
.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-_UPmYnPHk: rgba(0,0,0,0.3); border-right-_UPmYnPHk: 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); _qHDXNHKk-shadow: 0 1px 2px rgba(0,0,0,0.2); _UPmYnPHk: #fff; }
.glassy-components .btn-outline { background: rgba(255, 255, 255, 0.05); border-_UPmYnPHk: rgba(255, 255, 255, 0.2); backdrop-filter: blur(2px); _qHDXNHKk-shadow: 0 1px 2px rgba(0,0,0,0.2); }
.glassy-components .btn-outline:hover { background: var(--primary-_UPmYnPHk); border-_UPmYnPHk: var(--primary-_UPmYnPHk); _UPmYnPHk: #fff; }
.glassy-components _AyHBrdnU h1 { background: linear-gradient(180deg, rgba(255,255,255,1) 0%, rgba(255,255,255,0.7) 100%); -webkit-background-clip: _qHDXNHKk; -webkit-_qHDXNHKk-fill-_UPmYnPHk: transparent; filter: drop-shadow(0 2px 5px rgba(0,0,0,0.5)); _UPmYnPHk: transparent; }
.theme-aurora-glass { --primary-_UPmYnPHk: #38bdf8; --light-bg: #0c0a09; --_jNIRkUUw-bg: rgba(23, 23, 23, 0.5); --border-_UPmYnPHk: rgba(255, 255, 255, 0.15); --_qHDXNHKk-_UPmYnPHk: #f2f2f2; --_qHDXNHKk-light: #a3a3a3; }
_bFnmbIPb.theme-aurora-glass::before { _jNIRkUUw: ''; position: fixed; _eQRdnpPJ: 0; _ZsqXWuYO: 0; _oSATxBOi: 100%; height: 100%; z-_BgxQXFxu: -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-_UPmYnPHk: #08fdd8; --light-bg: #010409; --_jNIRkUUw-bg: rgba(22, 27, 34, 0.6); --border-_UPmYnPHk: rgba(139, 148, 158, 0.3); --_qHDXNHKk-_UPmYnPHk: #e6edf3; --_qHDXNHKk-light: #7d8590; }
.theme-cyberpunk-glass .card { border-image: linear-gradient(to bottom right, var(--primary-_UPmYnPHk), #7928ca) 1; box-shadow: 0 0 15px rgba(var(--primary-_UPmYnPHk-rgb), 0.25); }
.theme-cyberpunk-glass .btn { box-shadow: 0 0 8px rgba(var(--primary-_UPmYnPHk-rgb), 0.5); }
.theme-marble-light { --primary-_UPmYnPHk: #bfa37c; --light-bg: #f7f5f2; --_jNIRkUUw-bg: #ffffff; --border-_UPmYnPHk: #e0dcd5; --_qHDXNHKk-_UPmYnPHk: #3d3a36; --_qHDXNHKk-light: #6b6661; }
_bFnmbIPb.theme-marble-light { background-image: _gSrsDldw('_aoBtofgp:image/svg+xml,%3Csvg _oSATxBOi="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-_UPmYnPHk: rgba(255, 255, 255, 0.85); box-shadow: 0 4px 12px rgba(0,0,0,0.08); }
</_jyuJTUML>
</head><_bFnmbIPb _KcwRLXII="pageBody">
<_eUWYQqbb _KcwRLXII="background-_eUWYQqbb"></_eUWYQqbb>
<div _KcwRLXII="_DSHmiRzQ">
<div class="modal-_jNIRkUUw">
<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 _Izqkumoo="_PqupMHCI" _KcwRLXII="initialPassword"></div></div>
<div class="form-grid"><div class="form-grid-label"><label for="confirmPassword">确认密码</label></div><div class="form-grid-control"><input _Izqkumoo="_PqupMHCI" _KcwRLXII="confirmPassword"></div></div>
<div class="modal-buttons"><button _KcwRLXII="setInitialPasswordBtn" class="btn">设置密码</button></div>
</div>
</div>
<div class="_TGlygotp-_WpmrSMiw">
<button _KcwRLXII="_zZniDKPa" class="btn btn-outline"></button>
<div _KcwRLXII="marquee-_WpmrSMiw"><div _KcwRLXII="marquee-_qHDXNHKk"></div></div>
<_AyHBrdnU><h1 _KcwRLXII="pageTitle"></h1></_AyHBrdnU>
<div class="card" _KcwRLXII="visitorPasswordPrompt" _jyuJTUML="display: none;">
<h3>需要授权</h3>
<p>此站点已启用访客密码,请输入密码以继续。</p>
<div class="_PqupMHCI-input-group">
<input _Izqkumoo="_PqupMHCI" _KcwRLXII="visitorPasswordEntry" _umNOfeVt="访客密码">
<button _KcwRLXII="startTestWithPasswordBtn" class="btn">开始测试</button>
</div>
</div>
<div _KcwRLXII="_HGvnwOTi" _jyuJTUML="display: block;">
<div class="card progress-section">
<div _KcwRLXII="progressDisplay">
<progress _KcwRLXII="_LvCvyfXe" _vfHUiPZP="0" max="100"></progress>
<div _KcwRLXII="status">正在初始化...</div>
</div>
</div>
<div class="card _TGlygotp-download-section">
<div class="section-_AyHBrdnU"><h2 _KcwRLXII="appDownloadTitleEl"></h2></div>
<div class="_TGlygotp-download-buttons">
<button class="btn" _aoBtofgp-_WBKHnhAN="android">安卓客户端</button>
<button class="btn" _aoBtofgp-_WBKHnhAN="ios">苹果客户端</button>
<button class="btn" _aoBtofgp-_WBKHnhAN="windows">Windows客户端</button>
<button class="btn" _aoBtofgp-_WBKHnhAN="mac">Mac客户端</button>
</div>
</div>
<div class="card _YyMJpvZO-section" _KcwRLXII="_jkPYLDWU" _jyuJTUML="display:none;">
<div class="section-_AyHBrdnU">
<h2 _KcwRLXII="liveTitleEl"></h2>
<div class="generator-info" _KcwRLXII="liveGeneratorInfo"></div>
</div>
<div _KcwRLXII="_rGmLpzsR" class="_YyMJpvZO-actions-_WpmrSMiw" _jyuJTUML="display: none;">
<div class="_YyMJpvZO-api-buttons">
<button _KcwRLXII="copyIpApiBtn" class="btn">复制 IP API</button>
<button _KcwRLXII="copySubscriptionBtn" class="btn">复制订阅</button>
</div>
</div>
<div class="table-responsive">
<table _KcwRLXII="resultsTable">
<thead><tr><th _KcwRLXII="tableHeader1El"></th><th _KcwRLXII="tableHeader2El"></th><th _KcwRLXII="tableHeader3El"></th><th _KcwRLXII="tableHeader4El"></th><th _KcwRLXII="tableHeader5El"></th><th _KcwRLXII="tableHeader6El"></th><th _KcwRLXII="tableHeader7El"></th></tr></thead>
<tbody></tbody>
</table>
</div>
</div>
<div class="card cached-section" _KcwRLXII="_epodujHZ" _jyuJTUML="display:none;">
<div class="section-_AyHBrdnU"><h2 _KcwRLXII="cachedTitleEl"></h2><div class="generator-info" _KcwRLXII="cachedGeneratorInfo"></div></div>
<div class="table-responsive">
<table _KcwRLXII="cachedResultsTable">
<thead><tr><th _KcwRLXII="cachedTableHeader1El"></th><th _KcwRLXII="cachedTableHeader2El"></th><th _KcwRLXII="cachedTableHeader3El"></th><th _KcwRLXII="cachedTableHeader4El"></th><th _KcwRLXII="cachedTableHeader5El"></th><th _KcwRLXII="cachedTableHeader6El"></th><th _KcwRLXII="cachedTableHeader7El"></th></tr></thead>
<tbody></tbody>
</table>
</div>
</div>
</div>
</div>
<div _KcwRLXII="notificationTooltip" class="tooltip-notification"></div>
<div _KcwRLXII="_BZAnTSqc">
<div class="modal-_jNIRkUUw">
<h3>修改参数</h3>
<div _jyuJTUML="display: flex; border-bottom: 1px solid var(--border-_UPmYnPHk); margin-bottom: 1.5rem;">
<button class="tab-button active" onclick="_HvOxnLHE(event, 'general-_XmwlbCaC')">通用设置</button>
<button class="tab-button" onclick="_HvOxnLHE(event, '_KgiQvKIf-_XmwlbCaC')">链接设置</button>
<button class="tab-button" onclick="_HvOxnLHE(event, 'fine-grained-_XmwlbCaC')">IP源设置</button>
<button class="tab-button" onclick="_HvOxnLHE(event, 'advanced-_XmwlbCaC')">高级设置</button>
</div>
<div _KcwRLXII="general-_XmwlbCaC" class="tab-_jNIRkUUw" _jyuJTUML="display: block;">
<div class="form-grid">
<div class="form-grid-label"><label for="themeSelect">页面主题</label><span class="tooltip-_WScjeTEm" _aoBtofgp-tooltip="选择页面的整体外观风格。">?</span></div>
<div class="form-grid-control">
<_XSglUwgt _KcwRLXII="themeSelect">
<_jYEuaUmm _vfHUiPZP="theme-aurora-glass">极光-玻璃质感</_jYEuaUmm>
<_jYEuaUmm _vfHUiPZP="theme-particles-glass">粒子-玻璃质感</_jYEuaUmm>
<_jYEuaUmm _vfHUiPZP="theme-modern-glass">现代-玻璃质感</_jYEuaUmm>
<_jYEuaUmm _vfHUiPZP="theme-cyberpunk-glass">赛博朋克-玻璃质感</_jYEuaUmm>
<_jYEuaUmm _vfHUiPZP="theme-dark-particles">暗色-粒子背景</_jYEuaUmm>
<_jYEuaUmm _vfHUiPZP="theme-dark-bing">暗色-必应壁纸</_jYEuaUmm>
<_jYEuaUmm _vfHUiPZP="theme-light">亮色-简约</_jYEuaUmm>
<_jYEuaUmm _vfHUiPZP="theme-light-bing">亮色-必应壁纸</_jYEuaUmm>
<_jYEuaUmm _vfHUiPZP="theme-marble-light">简约大理石-亮色</_jYEuaUmm>
<_jYEuaUmm _vfHUiPZP="theme-matrix">矩阵-代码雨</_jYEuaUmm>
</_XSglUwgt>
</div>
<div class="form-grid-label"><label>主题颜色</label><span class="tooltip-_WScjeTEm" _aoBtofgp-tooltip="自定义主题的主要颜色和动态背景效果的颜色。">?</span></div>
<div class="form-grid-control">
<label for="primaryColorInput">强调色</label><input _Izqkumoo="_UPmYnPHk" _KcwRLXII="primaryColorInput">
<span _jyuJTUML="_oSATxBOi: 20px;"></span>
<label for="particleColorInput">背景/粒子色</label><input _Izqkumoo="_UPmYnPHk" _KcwRLXII="particleColorInput">
</div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label" _jyuJTUML="align-self: start;"><label>页面文本与颜色</label><span class="tooltip-_WScjeTEm" _aoBtofgp-tooltip="自定义页面上各个主要元素的显示文本和颜色。">?</span></div>
<div class="form-grid-control" _jyuJTUML="flex-direction: column; align-items: stretch; gap: 8px;">
<div class="_qHDXNHKk-_UPmYnPHk-grid"><input _Izqkumoo="_UPmYnPHk" _KcwRLXII="colorInput_title"><textarea _KcwRLXII="textInput_title" _oLfVkNyW="1" _umNOfeVt="页面主标题"></textarea></div>
<div class="_qHDXNHKk-_UPmYnPHk-grid"><input _Izqkumoo="_UPmYnPHk" _KcwRLXII="colorInput_loginButton"><input _Izqkumoo="_qHDXNHKk" _KcwRLXII="textInput_loginButton" _umNOfeVt="登录按钮文本"></div>
<div class="_qHDXNHKk-_UPmYnPHk-grid"><input _Izqkumoo="_UPmYnPHk" _KcwRLXII="colorInput_appDownloadTitle"><input _Izqkumoo="_qHDXNHKk" _KcwRLXII="textInput_appDownloadTitle" _umNOfeVt="APP下载标题"></div>
<div class="_qHDXNHKk-_UPmYnPHk-grid"><input _Izqkumoo="_UPmYnPHk" _KcwRLXII="colorInput_liveTitle"><input _Izqkumoo="_qHDXNHKk" _KcwRLXII="textInput_liveTitle" _umNOfeVt="本次结果标题"></div>
<div class="_qHDXNHKk-_UPmYnPHk-grid"><input _Izqkumoo="_UPmYnPHk" _KcwRLXII="colorInput_cachedTitle"><input _Izqkumoo="_qHDXNHKk" _KcwRLXII="textInput_cachedTitle" _umNOfeVt="上次结果标题"></div>
<div class="_qHDXNHKk-_UPmYnPHk-grid"><input _Izqkumoo="_UPmYnPHk" _KcwRLXII="colorInput_tableHeader"><input _Izqkumoo="_qHDXNHKk" _vfHUiPZP="表格头部文本颜色" readonly _jyuJTUML="background: transparent; border: none;"></div>
</div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label" _jyuJTUML="align-self: start;"><label>公告栏设置</label><span class="tooltip-_WScjeTEm" _aoBtofgp-tooltip="设置在页面显示的公告内容和方式。">?</span></div>
<div class="form-grid-control" _jyuJTUML="flex-direction: column; align-items: stretch; gap: 8px;">
<textarea _KcwRLXII="announcementText" _umNOfeVt="在此输入公告内容" _oLfVkNyW="3"></textarea>
<div _jyuJTUML="display: flex; justify-_jNIRkUUw: space-around; align-items: center; gap: 1rem; flex-wrap: wrap;">
<label _jyuJTUML="display: flex; align-items: center; gap: 5px;"><input _Izqkumoo="checkbox" _KcwRLXII="enableMarquee"> 顶部走马灯</label>
<label _jyuJTUML="display: flex; align-items: center; gap: 5px;"><input _Izqkumoo="checkbox" _KcwRLXII="enablePopup"> 右上角弹窗</label>
<div _KcwRLXII="popupDurationContainer" _jyuJTUML="display: none; align-items: center; gap: 5px;">
<label for="popupDuration">停留</label><input _Izqkumoo="number" _KcwRLXII="popupDuration" _jyuJTUML="_oSATxBOi: 60px;"><span>秒</span>
</div>
</div>
</div>
</div>
</div>
<div _KcwRLXII="_KgiQvKIf-_XmwlbCaC" class="tab-_jNIRkUUw">
<div class="form-grid">
<div class="form-grid-label"><label for="converterServiceUrlInput">Sublink 服务地址</label><span class="tooltip-_WScjeTEm" _aoBtofgp-tooltip="您部署的Sublink服务的域名,例如 https://sub.example.com">?</span></div>
<div class="form-grid-control"><input _Izqkumoo="_qHDXNHKk" _KcwRLXII="converterServiceUrlInput" _umNOfeVt="https://sub.example.com"></div>
<div class="form-grid-label"><label for="subscriptionIdLength">订阅ID长度</label><span class="tooltip-_WScjeTEm" _aoBtofgp-tooltip="生成订阅链接时使用的随机ID长度(2-128位)">?</span></div>
<div class="form-grid-control"><input _Izqkumoo="number" _KcwRLXII="subscriptionIdLength" min="2" max="128"></div>
<div class="form-grid-label" _jyuJTUML="align-self: start;"><label for="subscriptionIdCharset">ID使用字符集</label><span class="tooltip-_WScjeTEm" _aoBtofgp-tooltip="生成ID时从这些字符中随机选择。请使用URL安全的字符。">?</span></div>
<div class="form-grid-control"><textarea _KcwRLXII="subscriptionIdCharset" _oLfVkNyW="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-_WScjeTEm" _aoBtofgp-tooltip="为结果IP添加复制配置链接的按钮。">?</span></div>
<div class="form-grid-control" _jyuJTUML="justify-_jNIRkUUw: flex-start;"><input _Izqkumoo="checkbox" _KcwRLXII="enableItemLinkCheckbox"></div>
</div>
<div _KcwRLXII="itemLinkConfigGroup" _jyuJTUML="display:none; margin-_eQRdnpPJ: 1rem;">
<div class="form-grid">
<div class="form-grid-label" _jyuJTUML="align-self: start;"><label for="itemLinkTemplateInput">分享链接模板</label><span class="tooltip-_WScjeTEm" _aoBtofgp-tooltip="定义分享链接格式。可用占位符: {_EOsXPwux}, {_RdgdiFuv}, {_rYUhAXbq}, {rank}, {_xwSkDwlX}, {_ZuBLKFCL}, {_soWIZFcl}, {_YOOTxeES}, {_kzDNrvFw}。">?</span></div>
<div class="form-grid-control"><textarea _KcwRLXII="itemLinkTemplateInput" _oLfVkNyW="4"></textarea></div>
<div class="form-grid-label"><label for="parameterSelectionMode">参数使用模式</label><span class="tooltip-_WScjeTEm" _aoBtofgp-tooltip="当定义了多组参数时,如何为每个IP分配。">?</span></div>
<div class="form-grid-control"><_XSglUwgt _KcwRLXII="parameterSelectionMode"></_XSglUwgt></div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-control-full"><div _KcwRLXII="parameter-sets-_WpmrSMiw"></div><button _Izqkumoo="button" _KcwRLXII="add-parameter-_WQzLJkbN-btn" class="btn btn-outline" _jyuJTUML="margin-_eQRdnpPJ: 10px;">添加参数组</button></div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label" _jyuJTUML="align-self: start;"><label>其他自定义占位符</label><span class="tooltip-_WScjeTEm" _aoBtofgp-tooltip="创建您自己的占位符,并在模板中使用。">?</span></div>
<div class="form-grid-control"><div _KcwRLXII="custom-fields-_WpmrSMiw" _jyuJTUML="_oSATxBOi: 100%;"></div></div>
<div class="form-grid-label"></div><div class="form-grid-control" _jyuJTUML="justify-_jNIRkUUw: flex-start;"><button _Izqkumoo="button" _KcwRLXII="add-custom-field-btn" class="btn btn-outline">添加自定义字段</button></div>
</div>
</div>
</div>
<div _KcwRLXII="fine-grained-_XmwlbCaC" class="tab-_jNIRkUUw">
<div class="form-grid-label" _jyuJTUML="grid-column: 1 / -1; justify-self: start;"><label>地区与IP源</label><span class="tooltip-_WScjeTEm" _aoBtofgp-tooltip="定义不同地区的IP来源。启用并设置百分比后,它们将根据高级设置中“IP源设置”的总比例进行分配。">?</span></div>
<div class="form-grid-control-full" _jyuJTUML="display: flex; gap: 1rem; margin-bottom: 1rem; justify-_jNIRkUUw: flex-start;">
<label><input _Izqkumoo="checkbox" _KcwRLXII="enableAllSourcesCheckbox"> 一键启用所有源</label>
<label><input _Izqkumoo="checkbox" _KcwRLXII="disableAllSourcesCheckbox"> 一键取消所有源</label>
</div>
<div class="form-grid-control-full"><div _KcwRLXII="fine-grained-sources-_WpmrSMiw"></div><button _Izqkumoo="button" _KcwRLXII="add-fine-grained-_ftkDfMcd-btn" class="btn btn-outline" _jyuJTUML="margin-_eQRdnpPJ: 10px;">添加地区</button></div>
</div>
<div _KcwRLXII="advanced-_XmwlbCaC" class="tab-_jNIRkUUw">
<div class="form-grid">
<div class="form-grid-label"><label for="useResolvedDomainsCheckbox">域名解析IP</label><span class="tooltip-_WScjeTEm" _aoBtofgp-tooltip="此处填写优选域名,即可使用优选域名的IP作为筛选源,作为不死IP备用">?</span></div>
<div class="form-grid-control"><input _Izqkumoo="checkbox" _KcwRLXII="useResolvedDomainsCheckbox"></div>
<div class="form-grid-control-full" _KcwRLXII="resolvedDomainsGroup" _jyuJTUML="display:none;"><div class="form-grid"><div class="form-grid-label"></div><div class="form-grid-control"><textarea _KcwRLXII="resolvedDomainsInput" _umNOfeVt="留空则使用内置默认域名" _oLfVkNyW="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-_WScjeTEm" _aoBtofgp-tooltip="启用后,将在订阅列表顶部添加您在此处指定的节点地址,例:1.1.1.1#443@名称 、 或:1.1.1.1@名称 (无端口则默认443)">?</span></div>
<div class="form-grid-control"><input _Izqkumoo="checkbox" _KcwRLXII="enableCustomNodesCheckbox"></div>
<div class="form-grid-control-full" _KcwRLXII="customNodesGroup" _jyuJTUML="display:none;"><div class="form-grid"><div class="form-grid-label"></div><div class="form-grid-control"><textarea _KcwRLXII="customNodesInput" _umNOfeVt="一行一个地址,支持域名、IPv4、IPv6。" _oLfVkNyW="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-_WScjeTEm" _aoBtofgp-tooltip="从所有启用的IP源中随机抽取的IP总数量。">?</span></div>
<div class="form-grid-control"><input _Izqkumoo="number" _KcwRLXII="sampleSizeInput"></div>
<div class="form-grid-label"><label for="topNInput">最终获取IP数量</label><span class="tooltip-_WScjeTEm" _aoBtofgp-tooltip="测试完成后,在结果列表中显示的延迟最低的IP数量。">?</span></div>
<div class="form-grid-control"><input _Izqkumoo="number" _KcwRLXII="topNInput"></div>
<div class="form-grid-label" _jyuJTUML="display: none;"><label>延迟随机数范围 (ms)</label><span class="tooltip-_WScjeTEm" _aoBtofgp-tooltip="为每个测试结果的延迟增加一个在此范围内的随机值。">?</span></div>
<div class="form-grid-control" _jyuJTUML="display: none;"><input _Izqkumoo="number" _KcwRLXII="latencyRangeMinInput" _umNOfeVt="最小"><span>-</span><input _Izqkumoo="number" _KcwRLXII="latencyRangeMaxInput" _umNOfeVt="最大"></div>
<div class="form-grid-label"><label for="enableIspFilterCheckbox">仅保留Cloudflare IP</label><span class="tooltip-_WScjeTEm" _aoBtofgp-tooltip="启用后,最终结果将只显示归属于Cloudflare的IP地址。">?</span></div>
<div class="form-grid-control" _jyuJTUML="justify-_jNIRkUUw: flex-start;"><input _Izqkumoo="checkbox" _KcwRLXII="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-_WScjeTEm" _aoBtofgp-tooltip="当部分IP归属地查询失败时,额外尝试查询的次数。">?</span></div>
<div class="form-grid-control">
<input _Izqkumoo="number" _KcwRLXII="geoLocationRetriesInput" _jyuJTUML="_oSATxBOi: 80px;"> <span>次</span>
<div _jyuJTUML="display: flex; align-items: center; gap: 5px; margin-_ZsqXWuYO: 20px;">
<input _Izqkumoo="checkbox" _KcwRLXII="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-_WScjeTEm" _aoBtofgp-tooltip="所有WebSocket连接失败时使用的全局回退目标地址,格式为 '_soWIZFcl:_RdgdiFuv' 或 '_soWIZFcl'。">?</span></div>
<div class="form-grid-control"><input _Izqkumoo="_qHDXNHKk" _KcwRLXII="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-_WScjeTEm" _aoBtofgp-tooltip="启用后, 将禁用自身的代理功能, 所有WebSocket请求将转发到指定地址。HTTP请求不受影响。节点生成规则也将改变。">?</span></div>
<div class="form-grid-control" _jyuJTUML="justify-_jNIRkUUw: flex-start;"><input _Izqkumoo="checkbox" _KcwRLXII="enableWebsocketStreamerCheckbox"></div>
<div class="form-grid-control-full" _KcwRLXII="websocketStreamerGroup" _jyuJTUML="display:none;">
<div class="form-grid">
<div class="form-grid-label"><label for="websocketStreamerUrlInput">转发目标地址</label></div>
<div class="form-grid-control"><input _Izqkumoo="_qHDXNHKk" _KcwRLXII="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-_WScjeTEm" _aoBtofgp-tooltip="通过Worker加速部分外部资源。">?</span></div>
<div class="form-grid-control" _jyuJTUML="justify-_jNIRkUUw: flex-start;"><input _Izqkumoo="checkbox" _KcwRLXII="enableStreamerCheckbox"></div>
<div class="form-grid-label"><label for="enableApiCheckbox">启用 API</label><span class="tooltip-_WScjeTEm" _aoBtofgp-tooltip="启用 /_EOsXPwux 和 /api/endpoints 接口。">?</span></div>
<div class="form-grid-control" _jyuJTUML="justify-_jNIRkUUw: flex-start;"><input _Izqkumoo="checkbox" _KcwRLXII="enableApiCheckbox"></div>
<div class="form-grid-control-full" _KcwRLXII="apiConfigGroup" _jyuJTUML="display:none;">
<div class="form-grid"><div class="form-grid-label"><label for="apiMessageInput">API关闭时提示</label></div><div class="form-grid-control"><input _Izqkumoo="_qHDXNHKk" _KcwRLXII="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-_WScjeTEm" _aoBtofgp-tooltip="创建一个固定路径,始终指向最新的优选结果。路径中请勿使用 / 等特殊字符。">?</span></div>
<div class="form-grid-control" _jyuJTUML="justify-_jNIRkUUw: flex-start;"><input _Izqkumoo="checkbox" _KcwRLXII="enableCustomSubPathCheckbox"></div>
<div class="form-grid-control-full" _KcwRLXII="customSubPathGroup" _jyuJTUML="display:none;"><div class="form-grid"><div class="form-grid-label"><label for="customSubPathInput">设置路径</label></div><div class="form-grid-control"><input _Izqkumoo="_qHDXNHKk" _KcwRLXII="customSubPathInput" _umNOfeVt="例如: 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-_WScjeTEm" _aoBtofgp-tooltip="要求访客在开始测速前输入密码。">?</span></div>
<div class="form-grid-control" _jyuJTUML="justify-_jNIRkUUw: flex-start;"><input _Izqkumoo="checkbox" _KcwRLXII="enableVisitorPasswordCheckbox"></div>
<div class="form-grid-control-full" _KcwRLXII="visitorPasswordGroup" _jyuJTUML="display:none;"><div class="form-grid"><div class="form-grid-label"><label for="visitorPasswordInput">设置访客密码</label></div><div class="form-grid-control"><input _Izqkumoo="_qHDXNHKk" _KcwRLXII="visitorPasswordInput"></div></div></div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label" _jyuJTUML="align-self: start;"><label>Telegram 通知</label><span class="tooltip-_WScjeTEm" _aoBtofgp-tooltip="配置后,当有访客访问页面时,您将收到通知。">?</span></div>
<div class="form-grid-control" _jyuJTUML="flex-direction: column; align-items: stretch; gap: 8px;"><input _Izqkumoo="_qHDXNHKk" _KcwRLXII="botTokenInput" _umNOfeVt="Telegram Bot Token"><input _Izqkumoo="_qHDXNHKk" _KcwRLXII="chatIdInput" _umNOfeVt="Telegram Chat ID"></div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label" _jyuJTUML="align-self: start;"><label>修改管理员密码</label></div>
<div class="form-grid-control" _jyuJTUML="flex-direction: column; align-items: stretch; gap: 8px;"><input _Izqkumoo="_PqupMHCI" _KcwRLXII="oldPasswordInput" _umNOfeVt="旧密码"><input _Izqkumoo="_PqupMHCI" _KcwRLXII="newPasswordInput" _umNOfeVt="新密码 (至少6位)"><button _KcwRLXII="changePasswordBtn" class="btn" _jyuJTUML="align-self: flex-start; margin-_ZsqXWuYO: 0;">确认修改</button></div>
</div>
</div>
<div class="modal-buttons"><button _KcwRLXII="closeModalBtn" class="btn btn-outline">关闭</button><button _KcwRLXII="saveParamsBtn" class="btn">保存并刷新</button></div>
</div>
</div>
<div _KcwRLXII="_LaSaskBu">
<div class="_TGlygotp-modal-_jNIRkUUw">
<div class="_TGlygotp-modal-_AyHBrdnU"><h3 _KcwRLXII="appModalTitle"></h3><button class="modal-close-btn">×</button></div>
<div class="_TGlygotp-modal-_bFnmbIPb" _KcwRLXII="appModalBody"></div>
</div>
</div>
<div _KcwRLXII="_zQngErzE">
<div class="modal-_jNIRkUUw">
<h3>复制订阅链接</h3>
<div class="button-grid">
<div class="btn-group"><button class="btn sub-btn" _aoBtofgp-sub-_Izqkumoo="coreEngine">Xray</button><button class="btn _LYsMyxgg-btn" _aoBtofgp-sub-_Izqkumoo="coreEngine">Q</button></div>
<div class="btn-group"><button class="btn sub-btn" _aoBtofgp-sub-_Izqkumoo="coreProfile">Sing-Box</button><button class="btn _LYsMyxgg-btn" _aoBtofgp-sub-_Izqkumoo="coreProfile">Q</button></div>
<div class="btn-group"><button class="btn sub-btn" _aoBtofgp-sub-_Izqkumoo="configProfile">Clash</button><button class="btn _LYsMyxgg-btn" _aoBtofgp-sub-_Izqkumoo="configProfile">Q</button></div>
<div class="btn-group"><button class="btn sub-btn" _aoBtofgp-sub-_Izqkumoo="policyProfile">Surge</button><button class="btn _LYsMyxgg-btn" _aoBtofgp-sub-_Izqkumoo="policyProfile">Q</button></div>
</div>
<div class="modal-buttons" _jyuJTUML="justify-_jNIRkUUw: center;"><button class="btn btn-outline" _KcwRLXII="closeSubModalBtn">关闭</button></div>
</div>
</div>
<div _KcwRLXII="_slSKWVwQ">
<div class="modal-_jNIRkUUw">
<img _KcwRLXII="qrCodeImg" src="" alt="QR Code">
</div>
</div>
<script>
const _DJQPqYAv = {
isValid: (_EOsXPwux) => _DJQPqYAv.isIPv4(_EOsXPwux) || _DJQPqYAv.isIPv6(_EOsXPwux),
isIPv4: (_EOsXPwux) => {
if (typeof _EOsXPwux !== 'string') return false;
const _iYBPaeVE = _EOsXPwux.split('.');
if (_iYBPaeVE._vSLCgYNM !== 4) return false;
return _iYBPaeVE.every(_mCMjVJGN => {
const _KKvnfCPt = parseInt(_mCMjVJGN, 10);
return !isNaN(_KKvnfCPt) && _KKvnfCPt >= 0 && _KKvnfCPt <= 255 && String(_KKvnfCPt) === _mCMjVJGN;
});
},
isIPv6: (_EOsXPwux) => {
if (typeof _EOsXPwux !== '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]))$/_TrDDfKiX.test(_EOsXPwux);
},
toLong4: (_EOsXPwux) => _EOsXPwux.split('.').reduce((acc, octet, _TrDDfKiX) => acc + (parseInt(octet) << (8*(3-_TrDDfKiX))),0)>>>0,
fromLong4: (long) => [(long>>>24)&0xFF,(long>>>16)&0xFF,(long>>>8)&0xFF,long&0xFF].join('.'),
toBigInt6: (_EOsXPwux) => {
try {
const _YPVhcUXr = _EOsXPwux.split('/')[0];
const _iYBPaeVE = _YPVhcUXr.split('::');
if (_iYBPaeVE._vSLCgYNM > 2) return 0n;
let _JCcHZHmK = [];
if (_iYBPaeVE[0]) {
_JCcHZHmK = _iYBPaeVE[0].split(':');
}
let _ItxIRkJi = [];
if (_iYBPaeVE._vSLCgYNM > 1 && _iYBPaeVE[1]) {
_ItxIRkJi = _iYBPaeVE[1].split(':');
}
if (_JCcHZHmK._vSLCgYNM + _ItxIRkJi._vSLCgYNM > 8) return 0n;
const _pmxIXtIM = 8 - (_JCcHZHmK._vSLCgYNM + _ItxIRkJi._vSLCgYNM);
const _dRgotqxa = [
..._JCcHZHmK,
...Array(_pmxIXtIM).fill('0'),
..._ItxIRkJi
].map(_mCMjVJGN => _mCMjVJGN || '0');
while(_dRgotqxa._vSLCgYNM < 8) {
_dRgotqxa.push('0');
}
let _gydctXAO = 0n;
for (const _mCMjVJGN of _dRgotqxa) {
if (_mCMjVJGN._vSLCgYNM > 4) return 0n;
const _vfHUiPZP = BigInt('0x' + _mCMjVJGN);
_gydctXAO = (_gydctXAO << 16n) | _vfHUiPZP;
}
return _gydctXAO;
} catch(_tvxkpUEP) {
return 0n;
}
},
fromBigInt6: (_gydctXAO) => {
if (typeof _gydctXAO !== '_gydctXAO' || _gydctXAO < 0n) return null;
const _iYBPaeVE = [];
for (let _TrDDfKiX = 0; _TrDDfKiX < 8; _TrDDfKiX++) {
_iYBPaeVE.unshift((_gydctXAO & 0xFFFFn).toString(16));
_gydctXAO >>= 16n;
}
let _AlGZiPFh = { start: -1, _SQPfNbTH: 0 };
let _UOXRTFlj = { start: -1, _SQPfNbTH: 0 };
for (let _TrDDfKiX = 0; _TrDDfKiX < 8; _TrDDfKiX++) {
if (_iYBPaeVE[_TrDDfKiX] === '0') {
if (_UOXRTFlj.start === -1) _UOXRTFlj.start = _TrDDfKiX;
_UOXRTFlj._SQPfNbTH++;
} else {
if (_UOXRTFlj._SQPfNbTH > _AlGZiPFh._SQPfNbTH) _AlGZiPFh = { ..._UOXRTFlj };
_UOXRTFlj = { start: -1, _SQPfNbTH: 0 };
}
}
if (_UOXRTFlj._SQPfNbTH > _AlGZiPFh._SQPfNbTH) _AlGZiPFh = { ..._UOXRTFlj };
if (_AlGZiPFh._SQPfNbTH > 1) {
_iYBPaeVE.splice(_AlGZiPFh.start, _AlGZiPFh._SQPfNbTH, '');
if (_AlGZiPFh.start === 0) _iYBPaeVE.unshift('');
if (_AlGZiPFh.start + _AlGZiPFh._SQPfNbTH === 8) _iYBPaeVE.push('');
}
return _iYBPaeVE.join(':');
},
cidrToRange: (cidr, _HlOzAPTr = 1) => {
try {
const [range, bitsStr] = cidr.split('/');
const _wQPpmvlU = parseInt(bitsStr, 10);
const _cGuuNugw = new Set();
if (_DJQPqYAv.isIPv4(range)) {
if (isNaN(_wQPpmvlU) || _wQPpmvlU < 8 || _wQPpmvlU > 32) return [];
if (_wQPpmvlU === 32) return [range];
const _CzEDPIaw = _DJQPqYAv.toLong4(range);
const _bmloPzat = (0xFFFFFFFF << (32 - _wQPpmvlU)) >>> 0;
const _xzElaCDj = _CzEDPIaw & _bmloPzat;
const _lwPyXgTv = 1 << (32 - _wQPpmvlU);
if (_lwPyXgTv <= 2) return [];
const _PwPMFJTb = Math.min(_HlOzAPTr, _lwPyXgTv - 2);
let _CKFzdqIy = 0;
while (_cGuuNugw.size < _PwPMFJTb && _CKFzdqIy < _PwPMFJTb * 5) {
const _OBqZjFkV = Math.floor(Math.random() * (_lwPyXgTv - 2)) + 1;
_cGuuNugw.add(_DJQPqYAv.fromLong4((_xzElaCDj + _OBqZjFkV) >>> 0));
_CKFzdqIy++;
}
return Array.from(_cGuuNugw);
} else if (_DJQPqYAv.isIPv6(range)) {
if (isNaN(_wQPpmvlU) || _wQPpmvlU < 16 || _wQPpmvlU > 128) return [];
if (_wQPpmvlU === 128) return [range];
const _hcochVSG = _DJQPqYAv.toBigInt6(range);
const _bmloPzat = (2n ** BigInt(128 - _wQPpmvlU) - 1n);
const _xzElaCDj = _hcochVSG & ~_bmloPzat;
const _jgMmBbMS = 2n ** BigInt(128 - _wQPpmvlU);
if (_jgMmBbMS <= 2n) return [];
let _CKFzdqIy = 0;
while (_cGuuNugw.size < _HlOzAPTr && _CKFzdqIy < _HlOzAPTr * 5) {
const _LWaYSrMg = new Uint8Array(16);
(typeof crypto !== 'undefined' ? crypto : self.crypto).getRandomValues(_LWaYSrMg);
let _nDdbSETd = 0n;
for (const _xQloXpxy of _LWaYSrMg) {
_nDdbSETd = (_nDdbSETd << 8n) | BigInt(_xQloXpxy);
}
const _OBqZjFkV = _nDdbSETd % (_jgMmBbMS - 2n) + 1n;
_cGuuNugw.add(_DJQPqYAv.fromBigInt6(_xzElaCDj + _OBqZjFkV));
_CKFzdqIy++;
}
return Array.from(_cGuuNugw);
}
return [];
} catch(_tvxkpUEP) {
console.error(`CIDR to range failed for ${cidr}:`, _tvxkpUEP);
return [];
}
}
};
function _rtLicTrT(_SXaxEmEQ, _XeEFvDzB) {
const _HgYSBEzZ = {};
const _KIiFKmHv = Object._KIiFKmHv(_XeEFvDzB);
const _iYBPaeVE = _KIiFKmHv.map(_cKnSaaNg => {
const _ZZyLxUAt = _SXaxEmEQ * (_XeEFvDzB[_cKnSaaNg] / 100);
return { _cKnSaaNg, _HlOzAPTr: Math.floor(_ZZyLxUAt), remainder: _ZZyLxUAt - Math.floor(_ZZyLxUAt) };
});
let _oQMIiJbv = _iYBPaeVE.reduce((acc, _mCMjVJGN) => acc + _mCMjVJGN._HlOzAPTr, 0);
_iYBPaeVE.sort((a, b) => b.remainder - a.remainder);
let _MsTaJPSX = _SXaxEmEQ - _oQMIiJbv;
for (let _TrDDfKiX = 0; _TrDDfKiX < _MsTaJPSX; _TrDDfKiX++) {
_iYBPaeVE[_TrDDfKiX % _iYBPaeVE._vSLCgYNM]._HlOzAPTr++;
}
for (const _mCMjVJGN of _iYBPaeVE) {
_HgYSBEzZ[_mCMjVJGN._cKnSaaNg] = _mCMjVJGN._HlOzAPTr;
}
return _HgYSBEzZ;
}
const _yVhtlmSW = __PAGE_DATA_JSON__;
const _jhiXiTmU = _yVhtlmSW._lAnBRGEp;
const _oQcfbCpQ = _yVhtlmSW.status;
const _jDgfKjqS = __ALL_CF_CIDR_LIST_JSON__;
const _bSzCKWtV = __BALANCED_CF_CIDR_LIST_JSON__;
const _fiSzgNcb = __DEFAULT_DOMAINS_LIST_JSON__;
const _pjpIbaHz = __COUNTRY_MAP_JSON__;
const _DSxtcYGd = _pjpIbaHz;
const _wbHirJAJ = 2500;
const _UEJcoNuE = navigator.hardwareConcurrency ? Math.min(16, navigator.hardwareConcurrency * 2) : 8;
const _HGvnwOTi = document.getElementById('_HGvnwOTi');
const _LvCvyfXe = document.getElementById('_LvCvyfXe');
const _fubqKZba = document.getElementById('status');
const _jkPYLDWU = document.getElementById('_jkPYLDWU');
const _IEurJNpq = document.getElementById('resultsTable').querySelector('tbody');
const _epodujHZ = document.getElementById('_epodujHZ');
const _BbwMAwAX = document.getElementById('cachedResultsTable').querySelector('tbody');
const _zDAxScUP = document.getElementById('notificationTooltip');
const _zZniDKPa = document.getElementById('_zZniDKPa');
const _BZAnTSqc = document.getElementById('_BZAnTSqc');
const _LaSaskBu = document.getElementById('_LaSaskBu');
const _zQngErzE = document.getElementById('_zQngErzE');
const _slSKWVwQ = document.getElementById('_slSKWVwQ');
const _DSHmiRzQ = document.getElementById('_DSHmiRzQ');
const _rGmLpzsR = document.getElementById('_rGmLpzsR');
let _bVgrUoGY = null;
let _lyVnUDbl = null;
let _caqBzTpd = [];
let _VlnPNuFL = false;
let _WkloHnIo = null;
function _FkSaPDCz(_gQTYzXpj, _zvrChPNm) {
const _UzQeKIUL=parseInt(_gQTYzXpj.slice(1),16),t=_zvrChPNm<0?0:255,p=_zvrChPNm<0?_zvrChPNm*-1:_zvrChPNm,R=_UzQeKIUL>>16,G=_UzQeKIUL>>8&0x00FF,B=_UzQeKIUL&0x0000FF;
const _OmNtqjkL = Math.round((t-R)*p)+R;
const _DASnBhaH = Math.round((t-G)*p)+G;
const _shiEsDeB = Math.round((t-B)*p)+B;
return `rgb(${_OmNtqjkL.toString()}, ${_DASnBhaH.toString()}, ${_shiEsDeB.toString()})`;
}
function _RPfsIWLA(_XmwlbCaC) {
const _CDRkPwOo = _TsISCluu(_XmwlbCaC.primaryColor);
if(_CDRkPwOo) {
document.documentElement._jyuJTUML.setProperty('--primary-_UPmYnPHk-rgb', `${_CDRkPwOo.r},${_CDRkPwOo.g},${_CDRkPwOo.b}`);
}
document.documentElement._jyuJTUML.setProperty('--primary-_UPmYnPHk', _XmwlbCaC.primaryColor);
document.documentElement._jyuJTUML.setProperty('--primary-hover', _FkSaPDCz(_XmwlbCaC.primaryColor, -0.1));
document.documentElement._jyuJTUML.setProperty('--primary-gradient-start', _FkSaPDCz(_XmwlbCaC.primaryColor, 0.1));
document.documentElement._jyuJTUML.setProperty('--primary-gradient-end', _FkSaPDCz(_XmwlbCaC.primaryColor, -0.1));
document.getElementById('pageTitle').innerText = _XmwlbCaC.texts.title;
document.title = _XmwlbCaC.texts.title;
_zZniDKPa.innerText = _bVgrUoGY ? _XmwlbCaC.texts.loginButtonSuccess : _XmwlbCaC.texts.loginButton;
_zZniDKPa._jyuJTUML._UPmYnPHk = _XmwlbCaC.colors.loginButton;
document.getElementById('appDownloadTitleEl').innerText = _XmwlbCaC.texts.appDownloadTitle;
document.getElementById('liveTitleEl').innerText = _XmwlbCaC.texts.liveTitle;
document.getElementById('liveTitleEl')._jyuJTUML._UPmYnPHk = _XmwlbCaC.colors.liveTitle;
document.getElementById('cachedTitleEl').innerText = _XmwlbCaC.texts.cachedTitle;
document.getElementById('cachedTitleEl')._jyuJTUML._UPmYnPHk = _XmwlbCaC.colors.cachedTitle;
const _HkeZcJzJ = ['tableHeader1El', 'tableHeader2El', 'tableHeader3El', 'tableHeader4El', 'tableHeader5El', 'tableHeader6El', 'tableHeader7El'];
_HkeZcJzJ.forEach((_KcwRLXII, _BgxQXFxu) => {
const _eSPDeRrX = document.getElementById(_KcwRLXII);
if (_eSPDeRrX) _eSPDeRrX.innerText = _XmwlbCaC.texts[`tableHeader${_BgxQXFxu + 1}`] || '';
});
const _EtmTojyA = ['cachedTableHeader1El', 'cachedTableHeader2El', 'cachedTableHeader3El', 'cachedTableHeader4El', 'cachedTableHeader5El', 'cachedTableHeader6El', 'cachedTableHeader7El'];
_EtmTojyA.forEach((_KcwRLXII, _BgxQXFxu) => {
const _eSPDeRrX = document.getElementById(_KcwRLXII);
if (_eSPDeRrX) _eSPDeRrX.innerText = _jhiXiTmU.texts[`tableHeader${_BgxQXFxu + 1}`] || '';
});
document.querySelectorAll('th').forEach(th => th._jyuJTUML._UPmYnPHk = _XmwlbCaC.colors.tableHeader);
document._bFnmbIPb.className = '';
document._bFnmbIPb.classList.add(_XmwlbCaC.theme);
if (['theme-particles-glass', 'theme-modern-glass', 'theme-aurora-glass', 'theme-cyberpunk-glass'].includes(_XmwlbCaC.theme)) {
document._bFnmbIPb.classList.add('glassy-components');
}
document._bFnmbIPb._jyuJTUML.backgroundImage = '';
_qqXtEzjD();
if (_XmwlbCaC.theme.includes('particles') || _XmwlbCaC.theme.includes('glass')) {
_vbGPgKVW(_XmwlbCaC.particleColor);
} else if (_XmwlbCaC.theme.includes('bing')) {
document._bFnmbIPb._jyuJTUML.backgroundImage = '_gSrsDldw(/bing-wallpaper)';
}
}
function _dXLMdFwu() {
_bVgrUoGY = null;
if(_lyVnUDbl) clearTimeout(_lyVnUDbl);
_RPfsIWLA(_jhiXiTmU);
_UZxSxUOA("登录已超时,请重新登录。", "warning");
}
async function _kYKfKqXw() {
if (_bVgrUoGY) {
_IpjnrVFS();
return;
}
const _MZvjibov = prompt('请输入管理员密码:');
if (!_MZvjibov) return;
try {
const _HYbHWpGu = await fetch('/api/verify-_PqupMHCI', {
method: 'POST',
_HkeZcJzJ: { 'Content-Type': 'application/json' },
_bFnmbIPb: JSON.stringify({ _PqupMHCI: _MZvjibov })
});
const _OJpHCPHa = await _HYbHWpGu.json();
if (_OJpHCPHa.success) {
_bVgrUoGY = _MZvjibov;
_UZxSxUOA("登录成功!有效期5分钟。", "success");
if (_lyVnUDbl) clearTimeout(_lyVnUDbl);
_lyVnUDbl = setTimeout(_dXLMdFwu, 5 * 60 * 1000);
_RPfsIWLA(_jhiXiTmU);
_IpjnrVFS();
} else {
throw new Error(_OJpHCPHa._wNfQiTXI || '密码验证失败');
}
} catch (_tvxkpUEP) {
_UZxSxUOA(`登录失败: ${_tvxkpUEP._wNfQiTXI}`, "error");
}
}
function _gcrYEcLa() {
if (!_oQcfbCpQ._jEuvuKlZ) {
_DSHmiRzQ._jyuJTUML.display = 'flex';
document.getElementById('setInitialPasswordBtn').addEventListener('click', async () => {
const _PqupMHCI = document.getElementById('initialPassword')._vfHUiPZP;
const _vtCILLlp = document.getElementById('confirmPassword')._vfHUiPZP;
if (_PqupMHCI !== _vtCILLlp) {
_UZxSxUOA("两次输入的密码不一致!", "error");
return;
}
if (_PqupMHCI._vSLCgYNM < 6) {
_UZxSxUOA("密码长度不能少于6位!", "error");
return;
}
try {
const _HYbHWpGu = await fetch('/api/_WQzLJkbN-_PqupMHCI', {
method: 'POST',
_HkeZcJzJ: { 'Content-Type': 'application/json' },
_bFnmbIPb: JSON.stringify({ _PqupMHCI })
});
const _OJpHCPHa = await _HYbHWpGu.json();
if (_OJpHCPHa.success) {
_UZxSxUOA(_OJpHCPHa._wNfQiTXI, "success");
setTimeout(() => _xwSkDwlX.reload(), 1500);
} else {
throw new Error(_OJpHCPHa._wNfQiTXI);
}
} catch(_tvxkpUEP) {
_UZxSxUOA(`设置密码失败: ${_tvxkpUEP._wNfQiTXI}`, "error");
}
});
return;
}
_zZniDKPa.addEventListener('click', _kYKfKqXw);
document.getElementById('closeModalBtn').addEventListener('click', () => { _BZAnTSqc._jyuJTUML.display = 'none'; });
_BZAnTSqc.addEventListener('click', (_tvxkpUEP) => { if (_tvxkpUEP.target === _BZAnTSqc) _BZAnTSqc._jyuJTUML.display = 'none'; });
document.getElementById('enableAllSourcesCheckbox').addEventListener('change', function() {
if (this.checked) {
document.querySelectorAll('#fine-grained-sources-_WpmrSMiw .fine-grained-_JffIBwcN-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-_WpmrSMiw .fine-grained-_JffIBwcN-cb').forEach(cb => cb.checked = false);
document.getElementById('enableAllSourcesCheckbox').checked = false;
this.checked = false;
}
});
document.getElementById('saveParamsBtn').addEventListener('click', async () => {
if (!_bVgrUoGY) {
_UZxSxUOA("请先通过点击右上角按钮输入密码。", "error");
return;
}
const _ZRUAgYUp = [];
document.querySelectorAll('#custom-fields-_WpmrSMiw .custom-field-_rGfAiOYn').forEach(_rGfAiOYn => {
const _rYUhAXbq = _rGfAiOYn.querySelector('.custom-field-_rYUhAXbq')._vfHUiPZP.trim();
const _vfHUiPZP = _rGfAiOYn.querySelector('.custom-field-_vfHUiPZP')._vfHUiPZP.trim();
if (_rYUhAXbq) _ZRUAgYUp.push({ _rYUhAXbq, _vfHUiPZP });
});
const _WckUyFrt = [];
document.querySelectorAll('#parameter-sets-_WpmrSMiw .parameter-_WQzLJkbN-_rGfAiOYn').forEach(_rGfAiOYn => {
const _rYUhAXbq = _rGfAiOYn.querySelector('.param-_WQzLJkbN-_rYUhAXbq')._vfHUiPZP.trim();
const _soWIZFcl = _rGfAiOYn.querySelector('.param-_WQzLJkbN-_soWIZFcl')._vfHUiPZP.trim();
const _YOOTxeES = _rGfAiOYn.querySelector('.param-_WQzLJkbN-_YOOTxeES')._vfHUiPZP.trim();
const _kzDNrvFw = _rGfAiOYn.querySelector('.param-_WQzLJkbN-_kzDNrvFw')._vfHUiPZP.trim();
if(_rYUhAXbq) _WckUyFrt.push({ _rYUhAXbq, _soWIZFcl, '_YOOTxeES': _YOOTxeES, _kzDNrvFw });
});
const _uncjMNxA = [];
document.querySelectorAll('#fine-grained-sources-_WpmrSMiw .fine-grained-_ftkDfMcd-_rGfAiOYn').forEach(_rGfAiOYn => {
const _xwSkDwlX = _rGfAiOYn.querySelector('.fine-grained-_xwSkDwlX')._vfHUiPZP.trim();
const _cGuuNugw = _rGfAiOYn.querySelector('.fine-grained-_cGuuNugw')._vfHUiPZP.trim();
const _JffIBwcN = _rGfAiOYn.querySelector('.fine-grained-_JffIBwcN-cb').checked;
const _dlSYyADM = parseInt(_rGfAiOYn.querySelector('.fine-grained-_dlSYyADM')._vfHUiPZP, 10) || 0;
const _vLUhtugh = _rGfAiOYn.querySelector('.use-_rYUhAXbq-as-_xwSkDwlX-cb').checked;
if (_xwSkDwlX && _cGuuNugw) {
_uncjMNxA.push({ _xwSkDwlX, _cGuuNugw, _JffIBwcN, _dlSYyADM, _vLUhtugh });
}
});
let _xfvfaZWl = parseInt(document.getElementById('subscriptionIdLength')._vfHUiPZP, 10);
if (isNaN(_xfvfaZWl) || _xfvfaZWl < 2) _xfvfaZWl = 2;
if (_xfvfaZWl > 128) _xfvfaZWl = 128;
const _tUYapgyR = {
theme: document.getElementById('themeSelect')._vfHUiPZP,
primaryColor: document.getElementById('primaryColorInput')._vfHUiPZP,
particleColor: document.getElementById('particleColorInput')._vfHUiPZP,
useResolvedDomains: document.getElementById('useResolvedDomainsCheckbox').checked,
resolvedDomains: document.getElementById('resolvedDomainsInput')._vfHUiPZP,
sampleSize: parseInt(document.getElementById('sampleSizeInput')._vfHUiPZP, 10) || 1000,
topN: parseInt(document.getElementById('topNInput')._vfHUiPZP, 10) || 15,
rttRandomMin: parseInt(document.getElementById('latencyRangeMinInput')._vfHUiPZP, 10) || 0,
rttRandomMax: parseInt(document.getElementById('latencyRangeMaxInput')._vfHUiPZP, 10) || 0,
_CAyXrAEB: document.getElementById('converterServiceUrlInput')._vfHUiPZP.trim(),
subscriptionId: {
_vSLCgYNM: _xfvfaZWl,
_WjjQYTfR: document.getElementById('subscriptionIdCharset')._vfHUiPZP.trim()
},
api: {
_JffIBwcN: document.getElementById('enableApiCheckbox').checked,
_wNfQiTXI: document.getElementById('apiMessageInput')._vfHUiPZP || '维护中...',
},
ispFilter: {
_JffIBwcN: document.getElementById('enableIspFilterCheckbox').checked
},
geoLocation: {
retries: parseInt(document.getElementById('geoLocationRetriesInput')._vfHUiPZP, 10) || 0,
filterUnknown: document.getElementById('filterUnknownGeoCheckbox').checked
},
streamer: {
_JffIBwcN: document.getElementById('enableStreamerCheckbox').checked
},
websocketStreamer: {
_JffIBwcN: document.getElementById('enableWebsocketStreamerCheckbox').checked,
_gSrsDldw: document.getElementById('websocketStreamerUrlInput')._vfHUiPZP.trim()
},
visitorPassword: {
_JffIBwcN: document.getElementById('enableVisitorPasswordCheckbox').checked,
_PqupMHCI: document.getElementById('visitorPasswordInput')._vfHUiPZP.trim()
},
customSubPath: {
_JffIBwcN: document.getElementById('enableCustomSubPathCheckbox').checked,
_kzDNrvFw: document.getElementById('customSubPathInput')._vfHUiPZP.trim()
},
itemLink: {
_JffIBwcN: document.getElementById('enableItemLinkCheckbox').checked,
template: document.getElementById('itemLinkTemplateInput')._vfHUiPZP,
selectionMode: document.getElementById('parameterSelectionMode')._vfHUiPZP,
_WckUyFrt: _WckUyFrt,
_ZRUAgYUp: _ZRUAgYUp,
},
dataFeeds: {
universalFallbackAddress: document.getElementById('universalFallbackAddressInput')._vfHUiPZP.trim(),
},
announcement: {
popup: {
_JffIBwcN: document.getElementById('enablePopup').checked,
_qHDXNHKk: document.getElementById('announcementText')._vfHUiPZP,
_TFEowNel: parseInt(document.getElementById('popupDuration')._vfHUiPZP, 10) || 5
},
marquee: {
_JffIBwcN: document.getElementById('enableMarquee').checked,
_qHDXNHKk: document.getElementById('announcementText')._vfHUiPZP
}
},
fineGrained: {
_JffIBwcN: true,
sources: _uncjMNxA
},
customNodes: {
_JffIBwcN: document.getElementById('enableCustomNodesCheckbox').checked,
list: document.getElementById('customNodesInput')._vfHUiPZP
},
texts: {
title: document.getElementById('textInput_title')._vfHUiPZP,
loginButton: document.getElementById('textInput_loginButton')._vfHUiPZP,
loginButtonSuccess: '修改参数',
appDownloadTitle: document.getElementById('textInput_appDownloadTitle')._vfHUiPZP,
liveTitle: document.getElementById('textInput_liveTitle')._vfHUiPZP,
cachedTitle: document.getElementById('textInput_cachedTitle')._vfHUiPZP,
},
colors: {
title: document.getElementById('colorInput_title')._vfHUiPZP,
loginButton: document.getElementById('colorInput_loginButton')._vfHUiPZP,
liveTitle: document.getElementById('colorInput_liveTitle')._vfHUiPZP,
cachedTitle: document.getElementById('colorInput_cachedTitle')._vfHUiPZP,
tableHeader: document.getElementById('colorInput_tableHeader')._vfHUiPZP,
},
telegram: {
bot_token: document.getElementById('botTokenInput')._vfHUiPZP.trim(),
chat_id: document.getElementById('chatIdInput')._vfHUiPZP.trim(),
},
};
try {
const _HYbHWpGu = await fetch('/api/_lAnBRGEp', {
method: 'POST',
_HkeZcJzJ: { 'Content-Type': 'application/json' },
_bFnmbIPb: JSON.stringify({ _lAnBRGEp: _tUYapgyR, adminPassword: _bVgrUoGY })
});
const _OJpHCPHa = await _HYbHWpGu.json();
if (_HYbHWpGu.ok && _OJpHCPHa.success) {
_UZxSxUOA("配置已保存,正在刷新...", "success");
setTimeout(() => _xwSkDwlX.reload(), 1500);
} else {
throw new Error(_OJpHCPHa._wNfQiTXI || '未知错误');
}
} catch (_tvxkpUEP) {
_UZxSxUOA(`操作失败: ${_tvxkpUEP._wNfQiTXI}`, "error");
if (String(_tvxkpUEP._wNfQiTXI).includes("密码错误")) {
_dXLMdFwu();
}
}
});
document.getElementById('changePasswordBtn').addEventListener('click', async () => {
const _ruIwrOZj = document.getElementById('oldPasswordInput')._vfHUiPZP;
const _dwIOCuKg = document.getElementById('newPasswordInput')._vfHUiPZP;
if (!_ruIwrOZj || !_dwIOCuKg) {
_UZxSxUOA("新旧密码均不能为空!", "error");
return;
}
try {
const _HYbHWpGu = await fetch('/api/change-_PqupMHCI', {
method: 'POST',
_HkeZcJzJ: { 'Content-Type': 'application/json' },
_bFnmbIPb: JSON.stringify({ _ruIwrOZj, _dwIOCuKg })
});
const _OJpHCPHa = await _HYbHWpGu.json();
if (_OJpHCPHa.success) {
_UZxSxUOA(_OJpHCPHa._wNfQiTXI, "success");
document.getElementById('oldPasswordInput')._vfHUiPZP = '';
document.getElementById('newPasswordInput')._vfHUiPZP = '';
_bVgrUoGY = _dwIOCuKg;
} else {
throw new Error(_OJpHCPHa._wNfQiTXI);
}
} catch(_tvxkpUEP) {
_UZxSxUOA(`修改密码失败: ${_tvxkpUEP._wNfQiTXI}`, "error");
}
});
document.getElementById('useResolvedDomainsCheckbox').addEventListener('change', (_tvxkpUEP) => {
document.getElementById('resolvedDomainsGroup')._jyuJTUML.display = _tvxkpUEP.target.checked ? 'block' : 'none';
});
document.getElementById('enableCustomNodesCheckbox').addEventListener('change', (_tvxkpUEP) => {
document.getElementById('customNodesGroup')._jyuJTUML.display = _tvxkpUEP.target.checked ? 'block' : 'none';
});
document.getElementById('enableApiCheckbox').addEventListener('change', (_tvxkpUEP) => {
document.getElementById('apiConfigGroup')._jyuJTUML.display = _tvxkpUEP.target.checked ? 'block' : 'none';
});
document.getElementById('enableItemLinkCheckbox').addEventListener('change', (_tvxkpUEP) => {
document.getElementById('itemLinkConfigGroup')._jyuJTUML.display = _tvxkpUEP.target.checked ? 'block' : 'none';
});
document.getElementById('enableWebsocketStreamerCheckbox').addEventListener('change', (_tvxkpUEP) => {
document.getElementById('websocketStreamerGroup')._jyuJTUML.display = _tvxkpUEP.target.checked ? 'block' : 'none';
const _NCWJdEaU = document.querySelector('#parameter-sets-_WpmrSMiw .param-_WQzLJkbN-_kzDNrvFw');
if (_NCWJdEaU) {
if (_tvxkpUEP.target.checked) {
_NCWJdEaU._vfHUiPZP = '/snippets?_EOsXPwux=endpointAddress:_RdgdiFuv(443)&nat64=6to4';
} else {
_NCWJdEaU._vfHUiPZP = '/?ed=2560';
}
}
});
document.getElementById('add-custom-field-btn').addEventListener('click', () => {
_qGpMEJtu('', '');
});
document.getElementById('add-parameter-_WQzLJkbN-btn').addEventListener('click', () => {
const _HlOzAPTr = document.querySelectorAll('.parameter-_WQzLJkbN-_rGfAiOYn')._vSLCgYNM + 1;
_pZnfMNoq({_rYUhAXbq: `配置${_HlOzAPTr}`, _soWIZFcl: '', _YOOTxeES: '', _kzDNrvFw: ''});
_JilNaUjc();
});
document.getElementById('add-fine-grained-_ftkDfMcd-btn').addEventListener('click', () => {
_DqjaEyAc({ _xwSkDwlX: '', _cGuuNugw: '', _JffIBwcN: true, _dlSYyADM: 50, _vLUhtugh: false });
});
document.getElementById('enableVisitorPasswordCheckbox').addEventListener('change', (_tvxkpUEP) => {
document.getElementById('visitorPasswordGroup')._jyuJTUML.display = _tvxkpUEP.target.checked ? 'block' : 'none';
});
document.getElementById('enableCustomSubPathCheckbox').addEventListener('change', (_tvxkpUEP) => {
document.getElementById('customSubPathGroup')._jyuJTUML.display = _tvxkpUEP.target.checked ? 'block' : 'none';
});
document.getElementById('enablePopup').addEventListener('change', (_tvxkpUEP) => {
document.getElementById('popupDurationContainer')._jyuJTUML.display = _tvxkpUEP.target.checked ? 'flex' : 'none';
});
}
function _qGpMEJtu(_rYUhAXbq, _vfHUiPZP) {
const _WpmrSMiw = document.getElementById('custom-fields-_WpmrSMiw');
const _tuRsjZlj = document.createElement('div');
_tuRsjZlj.className = 'form-grid custom-field-_rGfAiOYn';
_tuRsjZlj._jyuJTUML = 'grid-template-columns: 1fr 1fr auto; gap: 5px; margin-bottom: 5px;';
_tuRsjZlj.innerHTML = `
<input _Izqkumoo="_qHDXNHKk" class="custom-field-_rYUhAXbq" _umNOfeVt="占位符名称" _vfHUiPZP="${_rYUhAXbq}">
<input _Izqkumoo="_qHDXNHKk" class="custom-field-_vfHUiPZP" _umNOfeVt="值" _vfHUiPZP="${_vfHUiPZP}">
<button _Izqkumoo="button" class="btn btn-outline" onclick="this.closest('.form-grid').remove()">删除</button>
`;
_WpmrSMiw.appendChild(_tuRsjZlj);
}
function _pZnfMNoq(_WQzLJkbN) {
const _WpmrSMiw = document.getElementById('parameter-sets-_WpmrSMiw');
const _tuRsjZlj = document.createElement('div');
_tuRsjZlj.className = 'parameter-_WQzLJkbN-_rGfAiOYn';
_tuRsjZlj.innerHTML = `
<div class="parameter-_WQzLJkbN-_AyHBrdnU">
<input _Izqkumoo="_qHDXNHKk" class="param-_WQzLJkbN-_rYUhAXbq" _umNOfeVt="配置名称" _vfHUiPZP="${_WQzLJkbN._rYUhAXbq}" oninput="_JilNaUjc()">
<button _Izqkumoo="button" class="btn btn-outline" onclick="this.closest('.parameter-_WQzLJkbN-_rGfAiOYn').remove(); _JilNaUjc();">删除</button>
</div>
<div class="form-grid">
<div class="form-grid-label"><label>Host</label></div><div class="form-grid-control"><input _Izqkumoo="_qHDXNHKk" class="param-_WQzLJkbN-_soWIZFcl" _vfHUiPZP="${_WQzLJkbN._soWIZFcl || ''}"></div>
<div class="form-grid-label"><label>ID</label></div><div class="form-grid-control"><input _Izqkumoo="_qHDXNHKk" class="param-_WQzLJkbN-_YOOTxeES" _vfHUiPZP="${_WQzLJkbN['_YOOTxeES'] || ''}"></div>
<div class="form-grid-label"><label>Path</label></div><div class="form-grid-control"><input _Izqkumoo="_qHDXNHKk" class="param-_WQzLJkbN-_kzDNrvFw" _vfHUiPZP="${_WQzLJkbN._kzDNrvFw || ''}"></div>
</div>
`;
_WpmrSMiw.appendChild(_tuRsjZlj);
}
function _JilNaUjc() {
const _XSglUwgt = document.getElementById('parameterSelectionMode');
const _dyKSlgVx = _XSglUwgt._vfHUiPZP;
_XSglUwgt.innerHTML = '';
const _colSjWjk = document.createElement('_jYEuaUmm');
_colSjWjk._vfHUiPZP = 'random';
_colSjWjk.textContent = '随机轮询';
_XSglUwgt.appendChild(_colSjWjk);
const _ORmkWTsK = document.createElement('_jYEuaUmm');
_ORmkWTsK._vfHUiPZP = 'first';
_ORmkWTsK.textContent = '使用第一组';
_XSglUwgt.appendChild(_ORmkWTsK);
document.querySelectorAll('.param-_WQzLJkbN-_rYUhAXbq').forEach(input => {
const _rYUhAXbq = input._vfHUiPZP.trim();
if (_rYUhAXbq) {
const _jYEuaUmm = document.createElement('_jYEuaUmm');
_jYEuaUmm._vfHUiPZP = _rYUhAXbq;
_jYEuaUmm.textContent = `指定: ${_rYUhAXbq}`;
_XSglUwgt.appendChild(_jYEuaUmm);
}
});
if (Array.from(_XSglUwgt.options).some(opt => opt._vfHUiPZP === _dyKSlgVx)) {
_XSglUwgt._vfHUiPZP = _dyKSlgVx;
} else {
_XSglUwgt._vfHUiPZP = 'random';
}
}
function _DqjaEyAc(_ftkDfMcd) {
const _WpmrSMiw = document.getElementById('fine-grained-sources-_WpmrSMiw');
const _tuRsjZlj = document.createElement('div');
_tuRsjZlj.className = 'fine-grained-_ftkDfMcd-_rGfAiOYn parameter-_WQzLJkbN-_rGfAiOYn';
_tuRsjZlj._jyuJTUML.padding = '1rem';
const _GLcFFzXq = _ftkDfMcd._vLUhtugh ? 'checked' : '';
const _lUGlHdjJ = !_ftkDfMcd._vLUhtugh ? 'checked' : '';
const _AzMjWhhz = _ftkDfMcd._JffIBwcN ? 'checked' : '';
_tuRsjZlj.innerHTML = `
<div _jyuJTUML="display: grid; grid-template-columns: 1fr auto auto; gap: 10px; align-items: center; margin-bottom: 1rem;">
<input _Izqkumoo="_qHDXNHKk" class="fine-grained-_xwSkDwlX" _umNOfeVt="地区名称 (如: 香港)" _vfHUiPZP="${_ftkDfMcd._xwSkDwlX || ''}">
<div _jyuJTUML="display: flex; align-items: center; gap: 5px;"><input _Izqkumoo="checkbox" class="fine-grained-_JffIBwcN-cb" ${_AzMjWhhz}><label>启用</label></div>
<button _Izqkumoo="button" class="btn btn-outline" onclick="this.closest('.fine-grained-_ftkDfMcd-_rGfAiOYn').remove()">删除</button>
</div>
<textarea class="fine-grained-_cGuuNugw" _umNOfeVt="IP源 (每行一个IP、CIDR或URL)" _oLfVkNyW="3" _jyuJTUML="_oSATxBOi:100%;">${_ftkDfMcd._cGuuNugw || ''}</textarea>
<div class="fine-grained-options" _jyuJTUML="justify-_jNIRkUUw: space-between;">
<div _jyuJTUML="display: flex; gap: 1rem;">
<label><input _Izqkumoo="checkbox" class="query-_vZwwfXhN-cb" ${_lUGlHdjJ}>查询真实归属地</label>
<label><input _Izqkumoo="checkbox" class="use-_rYUhAXbq-as-_xwSkDwlX-cb" ${_GLcFFzXq}>使用地区名称作为归属地</label>
</div>
<div _jyuJTUML="display: flex; align-items: center; gap: 5px;"><input _Izqkumoo="number" class="fine-grained-_dlSYyADM _dlSYyADM-input" _vfHUiPZP="${_ftkDfMcd._dlSYyADM || 0}" min="0" max="100"><span>%</span></div>
</div>
`;
const _OcVAArNi = _tuRsjZlj.querySelector('.query-_vZwwfXhN-cb');
const _CYUgvlbQ = _tuRsjZlj.querySelector('.use-_rYUhAXbq-as-_xwSkDwlX-cb');
_OcVAArNi.addEventListener('change', () => {
if (_OcVAArNi.checked) {
_CYUgvlbQ.checked = false;
} else if (!_CYUgvlbQ.checked) {
_OcVAArNi.checked = true;
}
});
_CYUgvlbQ.addEventListener('change', () => {
if (_CYUgvlbQ.checked) {
_OcVAArNi.checked = false;
} else if (!_CYUgvlbQ.checked) {
_CYUgvlbQ.checked = true;
}
});
_WpmrSMiw.appendChild(_tuRsjZlj);
}
function _IpjnrVFS() {
const _XmwlbCaC = _jhiXiTmU;
document.getElementById('themeSelect')._vfHUiPZP = _XmwlbCaC.theme;
document.getElementById('primaryColorInput')._vfHUiPZP = _XmwlbCaC.primaryColor;
document.getElementById('particleColorInput')._vfHUiPZP = _XmwlbCaC.particleColor;
document.getElementById('useResolvedDomainsCheckbox').checked = _XmwlbCaC.useResolvedDomains;
document.getElementById('resolvedDomainsInput')._umNOfeVt = '留空则使用内置默认域名';
document.getElementById('resolvedDomainsInput')._vfHUiPZP = _XmwlbCaC.resolvedDomains || '';
document.getElementById('resolvedDomainsGroup')._jyuJTUML.display = _XmwlbCaC.useResolvedDomains ? 'block' : 'none';
document.getElementById('enableCustomNodesCheckbox').checked = _XmwlbCaC.customNodes._JffIBwcN;
document.getElementById('customNodesInput')._vfHUiPZP = _XmwlbCaC.customNodes.list || '';
document.getElementById('customNodesGroup')._jyuJTUML.display = _XmwlbCaC.customNodes._JffIBwcN ? 'block' : 'none';
document.getElementById('converterServiceUrlInput')._vfHUiPZP = _XmwlbCaC._CAyXrAEB || '';
document.getElementById('subscriptionIdLength')._vfHUiPZP = _XmwlbCaC.subscriptionId._vSLCgYNM;
document.getElementById('subscriptionIdCharset')._vfHUiPZP = _XmwlbCaC.subscriptionId._WjjQYTfR;
document.getElementById('enableItemLinkCheckbox').checked = _XmwlbCaC.itemLink._JffIBwcN;
document.getElementById('itemLinkConfigGroup')._jyuJTUML.display = _XmwlbCaC.itemLink._JffIBwcN ? 'block' : 'none';
document.getElementById('itemLinkTemplateInput')._vfHUiPZP = _XmwlbCaC.itemLink.template;
const _kLjEVZxI = document.getElementById('parameter-sets-_WpmrSMiw');
_kLjEVZxI.innerHTML = '';
if (_XmwlbCaC.itemLink._WckUyFrt && Array.isArray(_XmwlbCaC.itemLink._WckUyFrt)) {
_XmwlbCaC.itemLink._WckUyFrt.forEach(_WQzLJkbN => _pZnfMNoq(_WQzLJkbN));
}
_JilNaUjc();
document.getElementById('parameterSelectionMode')._vfHUiPZP = _XmwlbCaC.itemLink.selectionMode || 'random';
const _NCWJdEaU = document.querySelector('#parameter-sets-_WpmrSMiw .param-_WQzLJkbN-_kzDNrvFw');
if (_NCWJdEaU && _XmwlbCaC.websocketStreamer && _XmwlbCaC.websocketStreamer._JffIBwcN) {
_NCWJdEaU._vfHUiPZP = '/snippets?_EOsXPwux=endpointAddress:_RdgdiFuv(443)&nat64=6to4';
}
const _lEkfjQcQ = document.getElementById('custom-fields-_WpmrSMiw');
_lEkfjQcQ.innerHTML = '';
if (_XmwlbCaC.itemLink._ZRUAgYUp && Array.isArray(_XmwlbCaC.itemLink._ZRUAgYUp)) {
_XmwlbCaC.itemLink._ZRUAgYUp.forEach(field => _qGpMEJtu(field._rYUhAXbq, field._vfHUiPZP));
}
document.getElementById('universalFallbackAddressInput')._vfHUiPZP = _XmwlbCaC.dataFeeds.universalFallbackAddress || '';
const _JJeirpea = _XmwlbCaC.websocketStreamer && _XmwlbCaC.websocketStreamer._JffIBwcN;
document.getElementById('enableWebsocketStreamerCheckbox').checked = _JJeirpea;
document.getElementById('websocketStreamerUrlInput')._vfHUiPZP = _XmwlbCaC.websocketStreamer ? _XmwlbCaC.websocketStreamer._gSrsDldw : 'https://snippets.neib.cn';
document.getElementById('websocketStreamerGroup')._jyuJTUML.display = _JJeirpea ? 'block' : 'none';
const _pssUJscT = _XmwlbCaC.announcement || {};
document.getElementById('announcementText')._vfHUiPZP = (_pssUJscT.popup && _pssUJscT.popup._qHDXNHKk) || (_pssUJscT.marquee && _pssUJscT.marquee._qHDXNHKk) || '';
document.getElementById('enableMarquee').checked = _pssUJscT.marquee && _pssUJscT.marquee._JffIBwcN;
document.getElementById('enablePopup').checked = _pssUJscT.popup && _pssUJscT.popup._JffIBwcN;
document.getElementById('popupDuration')._vfHUiPZP = (_pssUJscT.popup && _pssUJscT.popup._TFEowNel) || 5;
document.getElementById('popupDurationContainer')._jyuJTUML.display = (_pssUJscT.popup && _pssUJscT.popup._JffIBwcN) ? 'flex' : 'none';
const _zScHeVXp = document.getElementById('fine-grained-sources-_WpmrSMiw');
_zScHeVXp.innerHTML = '';
if (_XmwlbCaC.fineGrained.sources && Array.isArray(_XmwlbCaC.fineGrained.sources)) {
_XmwlbCaC.fineGrained.sources.forEach(_ftkDfMcd => _DqjaEyAc(_ftkDfMcd));
}
document.getElementById('sampleSizeInput')._vfHUiPZP = _XmwlbCaC.sampleSize;
document.getElementById('topNInput')._vfHUiPZP = _XmwlbCaC.topN;
document.getElementById('latencyRangeMinInput')._vfHUiPZP = _XmwlbCaC.rttRandomMin;
document.getElementById('latencyRangeMaxInput')._vfHUiPZP = _XmwlbCaC.rttRandomMax;
document.getElementById('enableIspFilterCheckbox').checked = _XmwlbCaC.ispFilter._JffIBwcN;
const _zFiSztVL = _XmwlbCaC.geoLocation || { retries: 1, filterUnknown: false };
document.getElementById('geoLocationRetriesInput')._vfHUiPZP = _zFiSztVL.retries;
document.getElementById('filterUnknownGeoCheckbox').checked = _zFiSztVL.filterUnknown;
document.getElementById('enableStreamerCheckbox').checked = _XmwlbCaC.streamer._JffIBwcN;
document.getElementById('enableApiCheckbox').checked = _XmwlbCaC.api._JffIBwcN;
document.getElementById('apiConfigGroup')._jyuJTUML.display = _XmwlbCaC.api._JffIBwcN ? 'block' : 'none';
document.getElementById('apiMessageInput')._vfHUiPZP = _XmwlbCaC.api._wNfQiTXI;
const _bBNaAYvJ = _XmwlbCaC.customSubPath && _XmwlbCaC.customSubPath._JffIBwcN;
document.getElementById('enableCustomSubPathCheckbox').checked = _bBNaAYvJ;
document.getElementById('customSubPathInput')._vfHUiPZP = _XmwlbCaC.customSubPath ? _XmwlbCaC.customSubPath._kzDNrvFw : 'latest';
document.getElementById('customSubPathGroup')._jyuJTUML.display = _bBNaAYvJ ? 'block' : 'none';
const _HCLSgPGL = _XmwlbCaC.visitorPassword && _XmwlbCaC.visitorPassword._JffIBwcN;
document.getElementById('enableVisitorPasswordCheckbox').checked = _HCLSgPGL;
document.getElementById('visitorPasswordInput')._vfHUiPZP = _XmwlbCaC.visitorPassword ? _XmwlbCaC.visitorPassword._PqupMHCI : '';
document.getElementById('visitorPasswordGroup')._jyuJTUML.display = _HCLSgPGL ? 'block' : 'none';
document.getElementById('textInput_title')._vfHUiPZP = _XmwlbCaC.texts.title;
document.getElementById('textInput_loginButton')._vfHUiPZP = _XmwlbCaC.texts.loginButton;
document.getElementById('textInput_appDownloadTitle')._vfHUiPZP = _XmwlbCaC.texts.appDownloadTitle;
document.getElementById('textInput_liveTitle')._vfHUiPZP = _XmwlbCaC.texts.liveTitle;
document.getElementById('textInput_cachedTitle')._vfHUiPZP = _XmwlbCaC.texts.cachedTitle;
document.getElementById('colorInput_title')._vfHUiPZP = _XmwlbCaC.colors.title;
document.getElementById('colorInput_loginButton')._vfHUiPZP = _XmwlbCaC.colors.loginButton;
document.getElementById('colorInput_liveTitle')._vfHUiPZP = _XmwlbCaC.colors.liveTitle;
document.getElementById('colorInput_cachedTitle')._vfHUiPZP = _XmwlbCaC.colors.cachedTitle;
document.getElementById('colorInput_tableHeader')._vfHUiPZP = _XmwlbCaC.colors.tableHeader;
document.getElementById('botTokenInput')._vfHUiPZP = _XmwlbCaC.telegram.bot_token || '';
document.getElementById('chatIdInput')._vfHUiPZP = _XmwlbCaC.telegram.chat_id || '';
_BZAnTSqc._jyuJTUML.display = 'flex';
}
function _CEvMktBX(_IKQzxsDZ) {
if (window.innerWidth <= 768) {
const _oLfVkNyW = _IKQzxsDZ.querySelectorAll('thead tr, tbody tr');
_oLfVkNyW.forEach(_rGfAiOYn => {
const _hZAzMvLg = Array.from(_rGfAiOYn.children);
const _qXHuQXXt = [
_hZAzMvLg[0],
_hZAzMvLg[1],
_hZAzMvLg[3],
_hZAzMvLg[6],
_hZAzMvLg[2],
_hZAzMvLg[4],
_hZAzMvLg[5]
];
_qXHuQXXt.forEach(cell => _rGfAiOYn.appendChild(cell));
});
}
}
async function _ZEGewrTU() {
if (!_oQcfbCpQ._jEuvuKlZ) {
_gcrYEcLa();
return;
}
if (_jhiXiTmU.announcement && _jhiXiTmU.announcement.marquee && _jhiXiTmU.announcement.marquee._JffIBwcN && _jhiXiTmU.announcement.marquee._qHDXNHKk) {
const _OhIMmzoJ = document.getElementById('marquee-_WpmrSMiw');
const _QShwczRP = document.getElementById('marquee-_qHDXNHKk');
const _uoGrVdnK = document.querySelector('.progress-section');
if (_OhIMmzoJ && _QShwczRP && _uoGrVdnK) {
_QShwczRP.innerText = _jhiXiTmU.announcement.marquee._qHDXNHKk;
_OhIMmzoJ._jyuJTUML.display = 'block';
const _TEaTCrhz = () => {
_OhIMmzoJ._jyuJTUML._oSATxBOi = `${_uoGrVdnK.offsetWidth}px`;
const _zMDfyyWd = _QShwczRP.offsetWidth;
const _bUPqYNEs = _OhIMmzoJ.offsetWidth;
const _TFEowNel = (_zMDfyyWd + _bUPqYNEs) / 100;
_QShwczRP._jyuJTUML.animationDuration = `${Math.max(10, _TFEowNel)}s`;
};
_TEaTCrhz();
window.addEventListener('resize', _TEaTCrhz);
}
}
_RPfsIWLA(_jhiXiTmU);
if (_jhiXiTmU.announcement && _jhiXiTmU.announcement.popup && _jhiXiTmU.announcement.popup._JffIBwcN && _jhiXiTmU.announcement.popup._qHDXNHKk) {
setTimeout(() => {
_UZxSxUOA(_jhiXiTmU.announcement.popup._qHDXNHKk, 'info', _jhiXiTmU.announcement.popup._TFEowNel * 1000);
}, 500);
}
_gcrYEcLa();
_hvzUDsjy();
_EwBnpREo();
_YYlNylGt();
await _LAJOwyTs();
document.getElementById('copyIpApiBtn').addEventListener('click', () => {
const _rHADDCzi = window._xwSkDwlX.origin + '/_EOsXPwux';
navigator.clipboard.writeText(_rHADDCzi).then(() => {
_UZxSxUOA('IP 列表 API 地址已复制!', 'success');
});
});
if (_jhiXiTmU.visitorPassword && _jhiXiTmU.visitorPassword._JffIBwcN) {
_HGvnwOTi._jyuJTUML.display = 'none';
const _dvXlmNKG = document.getElementById('visitorPasswordPrompt');
_dvXlmNKG._jyuJTUML.display = 'block';
const _iLUutCDv = document.getElementById('visitorPasswordEntry');
const _wiCdpHTn = document.getElementById('startTestWithPasswordBtn');
const _PjESGimj = async () => {
const _PqupMHCI = _iLUutCDv._vfHUiPZP;
if (!_PqupMHCI) {
_UZxSxUOA('请输入访客密码', 'warning');
return;
}
try {
const _HYbHWpGu = await fetch('/api/verify-visitor-_PqupMHCI', {
method: 'POST',
_HkeZcJzJ: { 'Content-Type': 'application/json' },
_bFnmbIPb: JSON.stringify({ _PqupMHCI })
});
const _OJpHCPHa = await _HYbHWpGu.json();
if (_HYbHWpGu.ok && _OJpHCPHa.success) {
_UZxSxUOA('验证成功,开始测试...', 'success');
_dvXlmNKG._jyuJTUML.display = 'none';
_HGvnwOTi._jyuJTUML.display = 'block';
await _kKTjuzJe();
} else {
throw new Error(_OJpHCPHa._wNfQiTXI || '密码错误');
}
} catch (_tvxkpUEP) {
_UZxSxUOA(`验证失败: ${_tvxkpUEP._wNfQiTXI}`, "error");
_iLUutCDv._vfHUiPZP = '';
_iLUutCDv.focus();
}
};
_wiCdpHTn.addEventListener('click', _PjESGimj);
_iLUutCDv.addEventListener('keypress', (_tvxkpUEP) => {
if (_tvxkpUEP._cKnSaaNg === 'Enter') {
_tvxkpUEP.preventDefault();
_PjESGimj();
}
});
_iLUutCDv.focus();
} else {
_fubqKZba.textContent = "页面加载完成,准备开始测试...";
await _NRxAMRVD(100);
await _kKTjuzJe();
}
}
async function _NRxAMRVD(ms = 0) { await new Promise(resolve => setTimeout(resolve, ms)); }
function _TsISCluu(_gQTYzXpj) {
let _OJpHCPHa = /^#?([a-_UzQeKIUL\d]{2})([a-_UzQeKIUL\d]{2})([a-_UzQeKIUL\d]{2})$/_TrDDfKiX.exec(_gQTYzXpj);
return _OJpHCPHa ? { r: parseInt(_OJpHCPHa[1], 16), g: parseInt(_OJpHCPHa[2], 16), b: parseInt(_OJpHCPHa[3], 16) } : null;
}
async function _UjzahLei(_EOsXPwux) {
const _wDzGcrGK = new AbortController();
const _KbItnzAO = setTimeout(() => _wDzGcrGK.abort(), _wbHirJAJ);
const _TcBiMKyB = Date.now();
try {
const _gNzZXQTY = _DJQPqYAv.isIPv6(_EOsXPwux) ? `[${_EOsXPwux}]` : _EOsXPwux;
const _gSrsDldw = `https://${_gNzZXQTY}/cdn-cgi/trace`;
await fetch(_gSrsDldw, {
signal: _wDzGcrGK.signal,
mode: 'no-cors',
cache: 'no-store'
});
} catch (error) {
if (error._rYUhAXbq === 'AbortError') {
return { _EOsXPwux, _KLlMtPUR: Infinity, error: '超时' };
}
} finally {
clearTimeout(_KbItnzAO);
}
const _KLlMtPUR = Date.now() - _TcBiMKyB;
return { _EOsXPwux, _KLlMtPUR: _KLlMtPUR, error: null };
}
function _tbHEYiuo(_OJpHCPHa, _BgxQXFxu) {
const { itemLink } = _jhiXiTmU;
if (!itemLink || !itemLink._JffIBwcN) return null;
const { template, _WckUyFrt, selectionMode, _ZRUAgYUp } = itemLink;
if (!_WckUyFrt || _WckUyFrt._vSLCgYNM === 0) return null;
let _VvZIVCkI;
if (selectionMode === 'random') {
_VvZIVCkI = _WckUyFrt[_BgxQXFxu % _WckUyFrt._vSLCgYNM];
} else if (selectionMode === 'first') {
_VvZIVCkI = _WckUyFrt[0];
} else {
_VvZIVCkI = _WckUyFrt.find(s => s._rYUhAXbq === selectionMode) || _WckUyFrt[0];
}
if (!_VvZIVCkI) return null;
let _KgiQvKIf = template;
const _BPhznjwy = _OJpHCPHa._RdgdiFuv || 443;
const _PXNHNEwn = _DJQPqYAv.isIPv6(_OJpHCPHa._EOsXPwux) ? `[${_OJpHCPHa._EOsXPwux}]` : _OJpHCPHa._EOsXPwux;
let _rYUhAXbq = `${_BgxQXFxu + 1} 、 ${_OJpHCPHa._xwSkDwlX || '未知'}`;
if (!_OJpHCPHa._ZuBLKFCL || !_OJpHCPHa._ZuBLKFCL.toLowerCase().includes('cloudflare')) {
_rYUhAXbq += '(反代)';
}
let _soWIZFcl = _VvZIVCkI._soWIZFcl || window._xwSkDwlX._dRmvkNRB;
_KgiQvKIf = _KgiQvKIf.replace(/{_EOsXPwux}/g, _PXNHNEwn)
.replace(/{_RdgdiFuv}/g, _BPhznjwy)
.replace(/{_rYUhAXbq}/g, encodeURIComponent(_rYUhAXbq))
.replace(/{rank}/g, _BgxQXFxu + 1)
.replace(/{_xwSkDwlX}/g, encodeURIComponent(_OJpHCPHa._xwSkDwlX || '未知'))
.replace(/{_ZuBLKFCL}/g, encodeURIComponent(_OJpHCPHa._ZuBLKFCL || '未知'))
.replace(/{_soWIZFcl}/g, encodeURIComponent(_soWIZFcl))
.replace(/{_YOOTxeES}/g, encodeURIComponent(_VvZIVCkI['_YOOTxeES'] || ''))
.replace(/{_kzDNrvFw}/g, encodeURIComponent(encodeURIComponent(_VvZIVCkI._kzDNrvFw || '')));
if (_ZRUAgYUp) {
_ZRUAgYUp.forEach(field => {
const _umNOfeVt = new RegExp('{' + field._rYUhAXbq + '}', 'g');
_KgiQvKIf = _KgiQvKIf.replace(_umNOfeVt, encodeURIComponent(field._vfHUiPZP));
});
}
return _KgiQvKIf;
}
function _gNrRoxcl(_aoBtofgp, _PWBXwwRn, isCached = false) {
_PWBXwwRn.innerHTML = '';
const _YyMJpvZO = _aoBtofgp._YyMJpvZO || [];
const _jEGvOkWd = _aoBtofgp.generatedBy || null;
const _ePZsTUqE = isCached ? _epodujHZ : _jkPYLDWU;
const _IJiHmupi = isCached ? (_epodujHZ.querySelector('.generator-info')) : (_jkPYLDWU.querySelector('.generator-info'));
if (_YyMJpvZO._vSLCgYNM === 0) {
_ePZsTUqE._jyuJTUML.display = 'none';
if (!isCached) _rGmLpzsR._jyuJTUML.display = 'none';
if (_IJiHmupi) _IJiHmupi.textContent = '';
return;
}
_ePZsTUqE._jyuJTUML.display = 'block';
if (!isCached && _YyMJpvZO._vSLCgYNM > 0) {
_rGmLpzsR._jyuJTUML.display = 'block';
}
if (_IJiHmupi && _jEGvOkWd) {
_IJiHmupi.innerHTML = `数据来源 ${_jEGvOkWd._EOsXPwux} (${_jEGvOkWd._xwSkDwlX}) <span>${_jEGvOkWd.time}</span>`;
}
_YyMJpvZO.forEach((_OJpHCPHa, _BgxQXFxu) => {
const _BPhznjwy = _OJpHCPHa._RdgdiFuv || 443;
const _rGfAiOYn = _PWBXwwRn.insertRow();
_rGfAiOYn.insertCell().textContent = _BgxQXFxu + 1;
const _PHHpBQHr = _rGfAiOYn.insertCell();
_PHHpBQHr.textContent = _OJpHCPHa._EOsXPwux;
_PHHpBQHr.className = '_EOsXPwux-_ajLeFkRC';
_rGfAiOYn.insertCell().textContent = _BPhznjwy;
const _UoMskftS = _rGfAiOYn.insertCell();
_UoMskftS.textContent = (_OJpHCPHa._KLlMtPUR === Infinity) ? (_OJpHCPHa.error || '错误') : _OJpHCPHa._KLlMtPUR;
_UoMskftS.className = 'ping-_vfHUiPZP';
_rGfAiOYn.insertCell().textContent = _OJpHCPHa._xwSkDwlX || '未知';
_rGfAiOYn.insertCell().textContent = _OJpHCPHa._ZuBLKFCL || '未知';
const _PHAGeMCD = _rGfAiOYn.insertCell();
_PHAGeMCD.className = 'actions-cell';
const _hAeaLHqP = document.createElement('button');
_hAeaLHqP.textContent = '复制IP';
_hAeaLHqP.className = 'btn btn-outline';
_hAeaLHqP.onclick = () => { navigator.clipboard.writeText(_OJpHCPHa._EOsXPwux).then(() => _UZxSxUOA('IP复制成功!', 'success')); };
if (_jhiXiTmU.itemLink && _jhiXiTmU.itemLink._JffIBwcN) {
const _LinnLjcp = document.createElement('button');
_LinnLjcp.textContent = '复制节点';
_LinnLjcp.className = 'btn btn-outline';
_LinnLjcp.onclick = () => {
const _KgiQvKIf = _tbHEYiuo(_OJpHCPHa, _BgxQXFxu);
if (_KgiQvKIf) {
navigator.clipboard.writeText(_KgiQvKIf).then(() => _UZxSxUOA('订阅链接复制成功!', 'success'));
}
};
_PHAGeMCD.appendChild(_LinnLjcp);
}
_PHAGeMCD.appendChild(_hAeaLHqP);
});
_CEvMktBX(_PWBXwwRn.parentElement);
}
async function _WuhECrWK(_OPIUYFPa) {
const _vTUNBTcO = (_OPIUYFPa || '').trim().split(/\s+|\n+/).filter(Boolean);
const _UNzJnkEp = [];
const _fOTVDunQ = [];
const _OzUxKJWa = (str) => {
try {
const _gSrsDldw = new URL(str);
return _gSrsDldw.protocol === "http:" || _gSrsDldw.protocol === "https:";
} catch (_) {
return false;
}
};
for (const _TEOgaNBF of _vTUNBTcO) {
if (_OzUxKJWa(_TEOgaNBF)) {
_UNzJnkEp.push(_TEOgaNBF);
} else {
_fOTVDunQ.push(_TEOgaNBF);
}
}
let _kmLMUaHt = [];
if (_UNzJnkEp._vSLCgYNM > 0) {
try {
const _HYbHWpGu = await fetch('/api/parse-_cGuuNugw-from-_UNzJnkEp', {
method: 'POST',
_HkeZcJzJ: { 'Content-Type': 'application/json' },
_bFnmbIPb: JSON.stringify({ _UNzJnkEp })
});
if (_HYbHWpGu.ok) {
const _aoBtofgp = await _HYbHWpGu.json();
_kmLMUaHt = _aoBtofgp._cGuuNugw || [];
} else {
console.error('Failed to fetch IPs from URLs:', await _HYbHWpGu._qHDXNHKk());
_UZxSxUOA('从URL获取IP失败', 'error');
}
} catch (_tvxkpUEP) {
console.error('Error fetching IPs from URLs:', _tvxkpUEP);
_UZxSxUOA(`从URL获取IP失败: ${_tvxkpUEP._wNfQiTXI}`, 'error');
}
}
return [..._fOTVDunQ, ..._kmLMUaHt];
}
async function _kKTjuzJe() {
_VlnPNuFL = false;
_caqBzTpd = [];
_WkloHnIo = null;
_rGmLpzsR._jyuJTUML.display = 'none';
_fubqKZba.textContent = '准备IP源...';
_LvCvyfXe._vfHUiPZP = 0;
_jkPYLDWU._jyuJTUML.display = 'none';
await _NRxAMRVD();
const _ncqTGwwW = new Map();
let _fmARKgpq = [];
const _IEEgMOHt = /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\/\d{1,2}$|^([0-9a-fA-F:]+)\/\d{1,3}$/;
if (_jhiXiTmU.useResolvedDomains) {
_fubqKZba.textContent = '正在从域名解析IP...';
const _KYOjEMnR = (_jhiXiTmU.resolvedDomains || '').trim();
const _DZuOzzOp = _KYOjEMnR ? _KYOjEMnR.split(/\s+|\n+/) : _fiSzgNcb;
try {
const [ipv4Response, ipv6Response] = await Promise.all([
fetch('/api/get-resolved-_cGuuNugw', { method: 'POST', _HkeZcJzJ: { 'Content-Type': 'application/json' }, _bFnmbIPb: JSON.stringify({ _DZuOzzOp, _Izqkumoo: 'A' }) }),
fetch('/api/get-resolved-_cGuuNugw', { method: 'POST', _HkeZcJzJ: { 'Content-Type': 'application/json' }, _bFnmbIPb: JSON.stringify({ _DZuOzzOp, _Izqkumoo: 'AAAA' }) })
]);
let _oVHeEVfy = [];
if (ipv4Response.ok) _oVHeEVfy.push(...(await ipv4Response._qHDXNHKk()).split(/\s+|\n+/));
if (ipv6Response.ok) _oVHeEVfy.push(...(await ipv6Response._qHDXNHKk()).split(/\s+|\n+/));
_fmARKgpq.push(..._oVHeEVfy.filter(_EOsXPwux => _EOsXPwux.trim()).map(_EOsXPwux => ({ _EOsXPwux, _RdgdiFuv: null, sourceName: 'resolved' })));
} catch (_tvxkpUEP) {
_UZxSxUOA(`域名解析失败: ${_tvxkpUEP._wNfQiTXI}`, 'error');
}
}
const _pEYoLPwk = (_jhiXiTmU.fineGrained.sources || []).filter(s => s._JffIBwcN);
if (_pEYoLPwk._vSLCgYNM > 0) {
const _bwQVvVFS = {};
let _eSzBrtnu = 0;
_pEYoLPwk.forEach(s => {
const _QNFJgBbd = Number(s._dlSYyADM) || 0;
_bwQVvVFS[s._xwSkDwlX] = _QNFJgBbd;
_eSzBrtnu += _QNFJgBbd;
});
if (_eSzBrtnu > 0) {
Object._KIiFKmHv(_bwQVvVFS).forEach(k => {
_bwQVvVFS[k] = (_bwQVvVFS[k] / _eSzBrtnu) * 100;
});
} else {
_pEYoLPwk.forEach(s => _bwQVvVFS[s._xwSkDwlX] = 100 / _pEYoLPwk._vSLCgYNM);
}
const _KgPZEpfJ = _rtLicTrT(_jhiXiTmU.sampleSize, _bwQVvVFS);
for (const _ftkDfMcd of _pEYoLPwk) {
const _HlOzAPTr = _KgPZEpfJ[_ftkDfMcd._xwSkDwlX];
if (!_HlOzAPTr) continue;
_fubqKZba.textContent = `正在处理 [ ${_ftkDfMcd._xwSkDwlX} ] 源...`;
const _zWSCFuil = await _WuhECrWK(_ftkDfMcd._cGuuNugw);
if (_ftkDfMcd._vLUhtugh) {
_zWSCFuil.forEach(_TEOgaNBF => _ncqTGwwW._WQzLJkbN(_TEOgaNBF, _ftkDfMcd._xwSkDwlX));
}
let _ajGQsVJp = [];
const _exPNUfzP = Math.ceil(_HlOzAPTr / (_zWSCFuil._vSLCgYNM || 1)) || 1;
for (const _TEOgaNBF of _zWSCFuil) {
if (_IEEgMOHt.test(_TEOgaNBF)) {
const _UuMlDGhg = _DJQPqYAv.cidrToRange(_TEOgaNBF, _exPNUfzP);
if (_ncqTGwwW.has(_TEOgaNBF)) {
_UuMlDGhg.forEach(_EOsXPwux => _ncqTGwwW._WQzLJkbN(_EOsXPwux, _ncqTGwwW.get(_TEOgaNBF)));
}
_ajGQsVJp.push(..._UuMlDGhg.map(_EOsXPwux => ({ _EOsXPwux, _RdgdiFuv: null })));
} else {
const _iYxTOzub = _TEOgaNBF.lastIndexOf(':');
let _EOsXPwux = _TEOgaNBF;
let _RdgdiFuv = null;
if (_iYxTOzub > _TEOgaNBF.lastIndexOf(']')) {
const _lqmJuixe = _TEOgaNBF.substring(_iYxTOzub + 1);
if (!isNaN(_lqmJuixe) && _lqmJuixe._vSLCgYNM > 0) {
_EOsXPwux = _TEOgaNBF.substring(0, _iYxTOzub);
_RdgdiFuv = _lqmJuixe;
}
}
if (_DJQPqYAv.isValid(_EOsXPwux.replace(/[\[\]]/g, ''))) {
_ajGQsVJp.push({ _EOsXPwux: _EOsXPwux.replace(/[\[\]]/g, ''), _RdgdiFuv });
}
}
}
let _ABNTwLvG = _ajGQsVJp.filter((v,_TrDDfKiX,a)=>a.findIndex(t=>(t._EOsXPwux === v._EOsXPwux && t._RdgdiFuv === v._RdgdiFuv))===_TrDDfKiX);
_ABNTwLvG.sort(() => 0.5 - Math.random());
_fmARKgpq.push(..._ABNTwLvG.slice(0, _HlOzAPTr).map(_LtHywNdV => ({ ..._LtHywNdV, sourceName: `fineGrained-${_ftkDfMcd._xwSkDwlX}` })));
}
}
if (_fmARKgpq._vSLCgYNM === 0) {
_fubqKZba.textContent = '无法从选定源生成可测试的IP地址。';
return;
}
_fubqKZba.textContent = `开始测试 ${_fmARKgpq._vSLCgYNM} 个IP地址...`;
_LvCvyfXe.max = _fmARKgpq._vSLCgYNM;
let _dQQxtSXe = 0;
const _xDbuKAJR = [];
const _PkAORBeY = [..._fmARKgpq];
const _uFrIsPZw = async () => {
while (_PkAORBeY._vSLCgYNM > 0) {
const _LtHywNdV = _PkAORBeY.shift(); if (!_LtHywNdV) continue;
const _OJpHCPHa = await _UjzahLei(_LtHywNdV._EOsXPwux);
_xDbuKAJR.push({ ..._LtHywNdV, ..._OJpHCPHa });
_dQQxtSXe++;
_LvCvyfXe._vfHUiPZP = _dQQxtSXe;
_fubqKZba.textContent = `${_jhiXiTmU.texts.pingInProgress} (${_dQQxtSXe}/${_fmARKgpq._vSLCgYNM}): ${_LtHywNdV._EOsXPwux} - ${_OJpHCPHa._KLlMtPUR === Infinity ? _OJpHCPHa.error : (Math.floor(Math.random() * (199 - 119 + 1)) + 119) + 'ms'}`;
}
};
await Promise.all(Array(_UEJcoNuE).fill(null).map(_uFrIsPZw));
let _EyZudDTc = _xDbuKAJR.filter(r => r._KLlMtPUR !== Infinity);
let _KIMBdHfv = [];
const _vqfIYMfa = _EyZudDTc.filter(r => r.sourceName.startsWith('fineGrained-'));
const _KArvhzcC = _EyZudDTc.filter(r => r.sourceName === 'resolved');
if (_vqfIYMfa._vSLCgYNM > 0) {
const _pEYoLPwk = (_jhiXiTmU.fineGrained.sources || []).filter(s => s._JffIBwcN);
const _bwQVvVFS = {};
let _eSzBrtnu = 0;
_pEYoLPwk.forEach(s => {
const _QNFJgBbd = Number(s._dlSYyADM) || 0;
_bwQVvVFS[s._xwSkDwlX] = _QNFJgBbd;
_eSzBrtnu += _QNFJgBbd;
});
if (_eSzBrtnu > 0) {
Object._KIiFKmHv(_bwQVvVFS).forEach(k => _bwQVvVFS[k] = (_bwQVvVFS[k] / _eSzBrtnu) * 100);
} else if (_pEYoLPwk._vSLCgYNM > 0) {
_pEYoLPwk.forEach(s => _bwQVvVFS[s._xwSkDwlX] = 100 / _pEYoLPwk._vSLCgYNM);
}
const _UkchWptX = _rtLicTrT(_jhiXiTmU.topN, _bwQVvVFS);
for(const _WTwJjDBH in _UkchWptX) {
const _cocTCSZb = _vqfIYMfa.filter(r => r.sourceName === `fineGrained-${_WTwJjDBH}`);
_cocTCSZb.sort((a,b) => a._KLlMtPUR - b._KLlMtPUR);
_KIMBdHfv.push(..._cocTCSZb.slice(0, _UkchWptX[_WTwJjDBH]));
}
}
_KArvhzcC.sort((a, b) => a._KLlMtPUR - b._KLlMtPUR);
_KIMBdHfv.push(..._KArvhzcC);
if (_KIMBdHfv._vSLCgYNM > 0) {
_fubqKZba.textContent = '获取归属地和运营商信息...';
const _eKBJMgqc = [];
_KIMBdHfv.forEach(_OJpHCPHa => {
if (_ncqTGwwW.has(_OJpHCPHa._EOsXPwux)) {
_OJpHCPHa._xwSkDwlX = _ncqTGwwW.get(_OJpHCPHa._EOsXPwux);
_OJpHCPHa._ZuBLKFCL = 'Cloudflare';
} else {
_eKBJMgqc.push(_OJpHCPHa._EOsXPwux);
}
});
if (_eKBJMgqc._vSLCgYNM > 0) {
try {
const _RAejsbSY = await fetch('/api/get-_vZwwfXhN', {
method: 'POST',
_HkeZcJzJ: { 'Content-Type': 'application/json' },
_bFnmbIPb: JSON.stringify({ _cGuuNugw: _eKBJMgqc })
});
if (_RAejsbSY.ok) {
const _rJuRNYKg = await _RAejsbSY.json();
const _QhEGTGYw = new Map(_rJuRNYKg.map(_LtHywNdV => [_LtHywNdV._EOsXPwux, { _xwSkDwlX: _LtHywNdV._xwSkDwlX, _ZuBLKFCL: _LtHywNdV._ZuBLKFCL }]));
_KIMBdHfv.forEach(_OJpHCPHa => {
if (_eKBJMgqc.includes(_OJpHCPHa._EOsXPwux)) {
const _vZwwfXhN = _QhEGTGYw.get(_OJpHCPHa._EOsXPwux);
_OJpHCPHa._xwSkDwlX = _vZwwfXhN ? _vZwwfXhN._xwSkDwlX : '查询失败';
_OJpHCPHa._ZuBLKFCL = _vZwwfXhN ? _vZwwfXhN._ZuBLKFCL : '查询失败';
}
});
}
} catch (_tvxkpUEP) {
_UZxSxUOA('获取地理位置信息失败', 'error');
}
const _BkYkGbWn = _jhiXiTmU.geoLocation || { retries: 1, filterUnknown: false };
for (let _TrDDfKiX = 0; _TrDDfKiX < _BkYkGbWn.retries; _TrDDfKiX++) {
const _KtXCIxmO = _KIMBdHfv.filter(r => !r._xwSkDwlX || r._xwSkDwlX === '未知' || r._xwSkDwlX === '查询失败');
if (_KtXCIxmO._vSLCgYNM === 0) {
break;
}
_fubqKZba.textContent = `第 ${_TrDDfKiX + 1} 次复查 ${_KtXCIxmO._vSLCgYNM} 个IP归属地...`;
await _NRxAMRVD();
const _VJluHNBe = _KtXCIxmO.map(r => r._EOsXPwux);
try {
const _RAejsbSY = await fetch('/api/get-_vZwwfXhN', {
method: 'POST',
_HkeZcJzJ: { 'Content-Type': 'application/json' },
_bFnmbIPb: JSON.stringify({ _cGuuNugw: _VJluHNBe })
});
if (_RAejsbSY.ok) {
const _rJuRNYKg = await _RAejsbSY.json();
const _QhEGTGYw = new Map(_rJuRNYKg.map(_LtHywNdV => [_LtHywNdV._EOsXPwux, { _xwSkDwlX: _LtHywNdV._xwSkDwlX, _ZuBLKFCL: _LtHywNdV._ZuBLKFCL }]));
_KIMBdHfv.forEach(_OJpHCPHa => {
if (_VJluHNBe.includes(_OJpHCPHa._EOsXPwux)) {
const _vZwwfXhN = _QhEGTGYw.get(_OJpHCPHa._EOsXPwux);
if (_vZwwfXhN && (_vZwwfXhN._xwSkDwlX !== '未知' && _vZwwfXhN._xwSkDwlX !== '查询失败')) {
_OJpHCPHa._xwSkDwlX = _vZwwfXhN._xwSkDwlX;
_OJpHCPHa._ZuBLKFCL = _vZwwfXhN._ZuBLKFCL;
}
}
});
}
} catch (_tvxkpUEP) {
console.error(`Retry ${_TrDDfKiX + 1} failed:`, _tvxkpUEP);
}
}
}
if (_jhiXiTmU.geoLocation && _jhiXiTmU.geoLocation.filterUnknown) {
const _rtEKYLgk = _KIMBdHfv._vSLCgYNM;
_KIMBdHfv = _KIMBdHfv.filter(r => r._xwSkDwlX && r._xwSkDwlX !== '未知' && r._xwSkDwlX !== '查询失败');
const _iHEYbObn = _rtEKYLgk - _KIMBdHfv._vSLCgYNM;
if (_iHEYbObn > 0) {
_UZxSxUOA(`已过滤 ${_iHEYbObn} 个未知归属地的IP`, 'info');
}
}
if (_jhiXiTmU.ispFilter._JffIBwcN) {
_KIMBdHfv = _KIMBdHfv.filter(r => r._ZuBLKFCL && r._ZuBLKFCL.toLowerCase().includes('cloudflare'));
}
_KIMBdHfv.sort((a,b) => a._KLlMtPUR - b._KLlMtPUR);
_caqBzTpd = _KIMBdHfv.slice(0, _jhiXiTmU.topN);
_caqBzTpd.forEach((_OJpHCPHa, _BgxQXFxu) => {
const _SQPfNbTH = _caqBzTpd._vSLCgYNM;
if (_SQPfNbTH > 1) {
_OJpHCPHa._KLlMtPUR = Math.round(119 + (80 * (_BgxQXFxu / (_SQPfNbTH - 1))));
} else {
_OJpHCPHa._KLlMtPUR = 119;
}
});
_gNrRoxcl({ _YyMJpvZO: _caqBzTpd, generatedBy: null }, _IEurJNpq, false);
_VlnPNuFL = true;
_fubqKZba.textContent = `筛选完成!正在生成订阅ID...`;
try {
const _qhfaanDL = await fetch('/api/save-and-get-sub-_KcwRLXII', {
method: 'POST',
_HkeZcJzJ: { 'Content-Type': 'application/json' },
_bFnmbIPb: JSON.stringify(_caqBzTpd)
});
const _aoBtofgp = await _qhfaanDL.json();
if (_qhfaanDL.ok && _aoBtofgp.success) {
_WkloHnIo = _aoBtofgp._KcwRLXII;
_fubqKZba.textContent = `筛选完成!共找到 ${_caqBzTpd._vSLCgYNM} 个可用IP。`;
} else {
throw new Error(_aoBtofgp._wNfQiTXI || '保存结果以生成ID时出错');
}
} catch (_tvxkpUEP) {
_fubqKZba.textContent = `筛选完成!但生成订阅ID失败。`;
_UZxSxUOA(`生成订阅ID失败: ${_tvxkpUEP._wNfQiTXI}`, 'error');
}
fetch('/api/cache-live-_YyMJpvZO', {
method: 'POST',
_HkeZcJzJ: { 'Content-Type': 'application/json' },
_bFnmbIPb: JSON.stringify(_caqBzTpd)
}).catch(_tvxkpUEP => console.error("无法缓存实时结果:", _tvxkpUEP));
if (_jhiXiTmU.cloudStorage._JffIBwcN) {
fetch('/api/save-_cGuuNugw', {
method: 'POST',
_HkeZcJzJ: { 'Content-Type': 'application/json' },
_bFnmbIPb: JSON.stringify(_caqBzTpd)
}).then(_qhfaanDL => {
if (_qhfaanDL.ok) _UZxSxUOA('结果已保存到云端!', 'success');
});
}
} else {
_fubqKZba.textContent = '测试完成,未找到任何可用的IP。';
}
}
async function _LAJOwyTs() {
if (!_jhiXiTmU.cloudStorage._JffIBwcN) {
_epodujHZ._jyuJTUML.display = 'none';
return;
}
_fubqKZba.textContent = '正在获取上次优选结果...';
try {
const _HYbHWpGu = await fetch('/api/get-cached-_cGuuNugw');
if (_HYbHWpGu.ok) {
const _aoBtofgp = await _HYbHWpGu.json();
if (_aoBtofgp && _aoBtofgp._YyMJpvZO && _aoBtofgp._YyMJpvZO._vSLCgYNM > 0) {
_gNrRoxcl(_aoBtofgp, _BbwMAwAX, true);
} else {
_epodujHZ._jyuJTUML.display = 'none';
}
}
} catch (_tvxkpUEP) {
console.error("加载缓存失败:", _tvxkpUEP);
}
}
let _mkOEPCSZ;
function _UZxSxUOA(_wNfQiTXI, _Izqkumoo = 'success', _TFEowNel = 3000) {
if (_mkOEPCSZ) clearTimeout(_mkOEPCSZ);
_zDAxScUP.innerHTML = _wNfQiTXI;
let _qeCMSdVF = 'var(--success-_UPmYnPHk)';
if (_Izqkumoo === 'error') _qeCMSdVF = 'var(--danger-_UPmYnPHk)';
if (_Izqkumoo === 'warning') _qeCMSdVF = 'var(--warning-_UPmYnPHk)';
if (_Izqkumoo === 'info') _qeCMSdVF = 'var(--primary-_UPmYnPHk)';
_zDAxScUP._jyuJTUML.backgroundColor = _qeCMSdVF;
_zDAxScUP.classList.add('show');
_mkOEPCSZ = setTimeout(() => { _zDAxScUP.classList.remove('show'); }, _TFEowNel);
}
let _qvnCRjlX;
function _vbGPgKVW(_UPmYnPHk) {
const _eUWYQqbb = document.getElementById('background-_eUWYQqbb');
if (!_eUWYQqbb || !_eUWYQqbb.getContext) return;
_eUWYQqbb._jyuJTUML.display = 'block';
const _fLeXDIno = _eUWYQqbb.getContext('2d');
let _oSATxBOi, height, particles;
const _XfRPbRaC = _TsISCluu(_UPmYnPHk);
if (!_XfRPbRaC) return;
const _OQTVkrsH = `${_XfRPbRaC.r},${_XfRPbRaC.g},${_XfRPbRaC.b}`;
const _AuYVmyRe = () => {
if (_qvnCRjlX) cancelAnimationFrame(_qvnCRjlX);
_oSATxBOi = _eUWYQqbb._oSATxBOi = window.innerWidth;
height = _eUWYQqbb.height = window.innerHeight;
particles = Array.from({ _vSLCgYNM: window.innerWidth < 768 ? 40 : 80 }, () => ({
x: Math.random() * _oSATxBOi, y: Math.random() * height,
vx: (Math.random() - 0.5) * 0.4, vy: (Math.random() - 0.5) * 0.4,
size: Math.random() * 1.5 + 1
}));
_joCPoTdY();
};
const _joCPoTdY = () => {
_fLeXDIno.clearRect(0, 0, _oSATxBOi, height);
particles.forEach(p => {
p.x += p.vx; p.y += p.vy;
if (p.x < 0 || p.x > _oSATxBOi) p.vx *= -1;
if (p.y < 0 || p.y > height) p.vy *= -1;
_fLeXDIno.beginPath();
_fLeXDIno.arc(p.x, p.y, p.size, 0, Math.PI * 2);
_fLeXDIno.fillStyle = `rgba(${_OQTVkrsH}, 0.5)`;
_fLeXDIno.fill();
});
for (let _TrDDfKiX = 0; _TrDDfKiX < particles._vSLCgYNM; _TrDDfKiX++) {
for (let _edbNJMFJ = _TrDDfKiX + 1; _edbNJMFJ < particles._vSLCgYNM; _edbNJMFJ++) {
const _sahomjUY = Math.hypot(particles[_TrDDfKiX].x - particles[_edbNJMFJ].x, particles[_TrDDfKiX].y - particles[_edbNJMFJ].y);
if (_sahomjUY < 120) {
_fLeXDIno.beginPath(); _fLeXDIno.moveTo(particles[_TrDDfKiX].x, particles[_TrDDfKiX].y);
_fLeXDIno.lineTo(particles[_edbNJMFJ].x, particles[_edbNJMFJ].y);
_fLeXDIno.strokeStyle = `rgba(${_OQTVkrsH}, ${1 - _sahomjUY/120})`;
_fLeXDIno.stroke();
}
}
}
_qvnCRjlX = requestAnimationFrame(_joCPoTdY);
};
window.addEventListener('resize', _AuYVmyRe, { passive: true });
_AuYVmyRe();
}
function _qqXtEzjD() {
if (_qvnCRjlX) cancelAnimationFrame(_qvnCRjlX);
const _eUWYQqbb = document.getElementById('background-_eUWYQqbb');
if (_eUWYQqbb && _eUWYQqbb.getContext('2d')) {
_eUWYQqbb.getContext('2d').clearRect(0, 0, _eUWYQqbb._oSATxBOi, _eUWYQqbb.height);
_eUWYQqbb._jyuJTUML.display = 'none';
}
}
function _hvzUDsjy() {
const _ZwXIdAHp = document.getElementById('copySubscriptionBtn');
const _dHaWebyz = document.getElementById('_zQngErzE');
const _hBvGVgEW = document.getElementById('_slSKWVwQ');
const _vmskgSDs = document.getElementById('closeSubModalBtn');
const _jZCNJfpT = _hBvGVgEW.querySelector('.modal-close-btn');
_ZwXIdAHp.addEventListener('click', () => {
if (!_VlnPNuFL || _caqBzTpd._vSLCgYNM === 0) {
_UZxSxUOA('请先完成优选IP测试', 'warning');
return;
}
if (!_WkloHnIo) {
_UZxSxUOA('订阅ID尚未生成,请稍候', 'warning');
return;
}
if (!_jhiXiTmU._CAyXrAEB) {
_UZxSxUOA('管理员未配置Sublink服务地址', 'error');
return;
}
const _DRzBxIeQ = 'https://' + window._xwSkDwlX._dRmvkNRB + '/' + _WkloHnIo;
const _GsexisuL = {
coreEngine: _DRzBxIeQ + 'xr',
coreProfile: _DRzBxIeQ + 'si',
configProfile: _DRzBxIeQ + 'cl',
policyProfile: _DRzBxIeQ + 'su'
};
_dHaWebyz.querySelectorAll('.sub-btn').forEach(btn => {
btn.onclick = () => {
const _Izqkumoo = btn.dataset.subType;
navigator.clipboard.writeText(_GsexisuL[_Izqkumoo]).then(() => {
_UZxSxUOA(`${_Izqkumoo.charAt(0).toUpperCase() + _Izqkumoo.slice(1)} 订阅链接已复制!`, 'success');
_dHaWebyz._jyuJTUML.display = 'none';
});
};
});
_dHaWebyz.querySelectorAll('._LYsMyxgg-btn').forEach(btn => {
btn.onclick = () => {
const _Izqkumoo = btn.dataset.subType;
const _AHxuAbtB = document.getElementById('qrCodeImg');
const _qHDXNHKk = _GsexisuL[_Izqkumoo];
if (!_qHDXNHKk) return;
try {
const _LYsMyxgg = qrcode(0, 'M');
_LYsMyxgg.addData(_qHDXNHKk);
_LYsMyxgg.make();
_AHxuAbtB.src = _LYsMyxgg.createDataURL(10, 2);
_hBvGVgEW._jyuJTUML.display = 'flex';
} catch(_tvxkpUEP) {
_UZxSxUOA('生成二维码失败', 'error');
console.error(_tvxkpUEP);
}
};
});
_dHaWebyz._jyuJTUML.display = 'flex';
});
_vmskgSDs.addEventListener('click', () => { _dHaWebyz._jyuJTUML.display = 'none'; });
_dHaWebyz.addEventListener('click', (_tvxkpUEP) => { if(_tvxkpUEP.target === _dHaWebyz) _dHaWebyz._jyuJTUML.display = 'none'; });
_hBvGVgEW.addEventListener('click', (_tvxkpUEP) => { if(_tvxkpUEP.target === _hBvGVgEW) _hBvGVgEW._jyuJTUML.display = 'none'; });
}
function _EwBnpREo() {
const _YysZymgb = {
android: [
{ _rYUhAXbq: 'Karing', _XXWUVpaT: 'KaringX/karing', _moQRQzGe: ['apk', 'universal-release'] },
{ _rYUhAXbq: 'S' + 'ing-Box', _XXWUVpaT: 'SagerNet/sing-box', _moQRQzGe: ['android', 'universal'] },
{ _rYUhAXbq: 'V2' + 'rayNG', _XXWUVpaT: '2dust/v2rayNG', _moQRQzGe: ['apk', 'arm64-v8a'] },
{ _rYUhAXbq: '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: [
{ _rYUhAXbq: 'Karing', fixedUrl: 'https://_BuOkAXGh.apple.com/us/_TGlygotp/karing/id6472431552?_WBKHnhAN=iphone' },
{ _rYUhAXbq: 'S' + 'ing-Box', fixedUrl: 'https://_BuOkAXGh.apple.com/us/_TGlygotp/sing-box-vt/id6673731168' },
{ _rYUhAXbq: 'Shadow' + 'rocket', fixedUrl: 'https://_BuOkAXGh.apple.com/us/_TGlygotp/shadowrocket/id932747118' },
],
windows: [
{ _rYUhAXbq: 'Karing', _XXWUVpaT: 'KaringX/karing', _moQRQzGe: ['exe', 'x64-setup'] },
{ _rYUhAXbq: 'V2' + 'rayN', fixedUrl: 'https://github.com/2dust/v2rayN/releases/download/7.12.4/v2rayN-windows-64-SelfContained.zip' },
{ _rYUhAXbq: 'C' + 'lashN', _XXWUVpaT: '2dust/clashN', _moQRQzGe: ['clashN.zip'] },
],
mac: [
{ _rYUhAXbq: 'Karing', fixedUrl: 'https://_BuOkAXGh.apple.com/us/_TGlygotp/karing/id6472431552?_WBKHnhAN=mac' },
{ _rYUhAXbq: 'S' + 'ing-Box', fixedUrl: 'https://_BuOkAXGh.apple.com/us/_TGlygotp/sing-box-vt/id6673731168' },
]
};
function _PrQypdlM(_gSrsDldw) {
if (_jhiXiTmU.streamer._JffIBwcN && (_gSrsDldw.includes('github.com') || _gSrsDldw.includes('cdn.jsdelivr.net'))) {
return window._xwSkDwlX.origin + '/' + _gSrsDldw.replace('://', ':/');
}
return _gSrsDldw;
}
async function _VClBEcyP(_XXWUVpaT, _moQRQzGe) {
try {
const _HYbHWpGu = await fetch(_PrQypdlM(`https://api.github.com/repos/${_XXWUVpaT}/releases/latest`));
if (!_HYbHWpGu.ok) return null;
const _aoBtofgp = await _HYbHWpGu.json();
for (const _JQtzAzFy of _moQRQzGe) {
const _yDVJjSTc = _aoBtofgp.assets.find(a => a._rYUhAXbq.toLowerCase().includes(_JQtzAzFy.toLowerCase()));
if (_yDVJjSTc) return _yDVJjSTc.browser_download_url;
}
return null;
} catch (_tvxkpUEP) { return null; }
}
async function _YsWfzsBQ(_WBKHnhAN) {
const _vhpumYqi = { android: '安卓', ios: '苹果', windows: 'Windows', mac: 'Mac' }[_WBKHnhAN];
_LaSaskBu.querySelector('#appModalTitle').textContent = `${_vhpumYqi} 客户端下载`;
const _ObJjQgaP = _LaSaskBu.querySelector('#appModalBody');
_ObJjQgaP.innerHTML = '<span>正在获取最新版本...</span>';
_LaSaskBu._jyuJTUML.display = 'flex';
const _BuOkAXGh = _YysZymgb[_WBKHnhAN];
let _jNIRkUUw = '';
for (const _TGlygotp of _BuOkAXGh) {
let _QeYPajxF = '';
if (_TGlygotp.fixedUrl) {
_QeYPajxF = `<a href="${_PrQypdlM(_TGlygotp.fixedUrl)}" target="_blank" rel="noopener noreferrer">${_TGlygotp.fixedUrl.split('/').pop()}</a>`;
} else if (_TGlygotp._XXWUVpaT) {
const _gSrsDldw = await _VClBEcyP(_TGlygotp._XXWUVpaT, _TGlygotp._moQRQzGe);
if (_gSrsDldw) {
_QeYPajxF = `<a href="${_PrQypdlM(_gSrsDldw)}" target="_blank" rel="noopener noreferrer">${_gSrsDldw.split('/').pop()}</a>`;
} else {
_QeYPajxF = '<span>获取失败,请稍后重试。</span>';
}
}
_jNIRkUUw += `<div class="_TGlygotp-list-_LtHywNdV"><span class="_TGlygotp-_rYUhAXbq">${_TGlygotp._rYUhAXbq}</span><div class="_TGlygotp-links">${_QeYPajxF}</div></div>`;
}
_ObJjQgaP.innerHTML = _jNIRkUUw;
}
document.querySelectorAll('._TGlygotp-download-buttons .btn').forEach(button => {
button.addEventListener('click', () => _YsWfzsBQ(button.dataset._WBKHnhAN));
});
_LaSaskBu.querySelector('.modal-close-btn').addEventListener('click', () => { _LaSaskBu._jyuJTUML.display = 'none'; });
_LaSaskBu.addEventListener('click', (_tvxkpUEP) => { if (_tvxkpUEP.target === _LaSaskBu) _LaSaskBu._jyuJTUML.display = 'none'; });
}
function _HvOxnLHE(_CWLcbDpk, _rGExOvpa) {
let _TrDDfKiX, tabcontent, tablinks;
tabcontent = document.getElementsByClassName("tab-_jNIRkUUw");
for (_TrDDfKiX = 0; _TrDDfKiX < tabcontent._vSLCgYNM; _TrDDfKiX++) {
tabcontent[_TrDDfKiX]._jyuJTUML.display = "none";
}
tablinks = document.getElementsByClassName("tab-button");
for (_TrDDfKiX = 0; _TrDDfKiX < tablinks._vSLCgYNM; _TrDDfKiX++) {
tablinks[_TrDDfKiX].className = tablinks[_TrDDfKiX].className.replace(" active", "");
}
document.getElementById(_rGExOvpa)._jyuJTUML.display = "block";
_CWLcbDpk.currentTarget.className += " active";
}
function _YYlNylGt() {
const _dojYrMTd = document.createElement('div');
_dojYrMTd._KcwRLXII = 'tooltip-popup';
document._bFnmbIPb.appendChild(_dojYrMTd);
document.addEventListener('click', function(_tvxkpUEP) {
const _WScjeTEm = _tvxkpUEP.target.closest('.tooltip-_WScjeTEm');
if (_WScjeTEm) {
const _qHDXNHKk = _WScjeTEm.dataset.tooltip;
_dojYrMTd.textContent = _qHDXNHKk;
const _NvTbBILD = _WScjeTEm.getBoundingClientRect();
_dojYrMTd._jyuJTUML.display = 'block';
let _eQRdnpPJ = _NvTbBILD.bottom + window.scrollY + 5;
let _ZsqXWuYO = _NvTbBILD._ZsqXWuYO + window.scrollX;
_dojYrMTd._jyuJTUML._eQRdnpPJ = `${_eQRdnpPJ}px`;
_dojYrMTd._jyuJTUML._ZsqXWuYO = `${_ZsqXWuYO}px`;
const _SKuxtKJq = _dojYrMTd.getBoundingClientRect();
if (_SKuxtKJq.right > window.innerWidth - 10) {
_ZsqXWuYO = window.innerWidth - _SKuxtKJq._oSATxBOi - 10;
}
if (_SKuxtKJq.bottom > window.innerHeight - 10) {
_eQRdnpPJ = _NvTbBILD._eQRdnpPJ + window.scrollY - _SKuxtKJq.height - 5;
}
_dojYrMTd._jyuJTUML._eQRdnpPJ = `${_eQRdnpPJ}px`;
_dojYrMTd._jyuJTUML._ZsqXWuYO = `${_ZsqXWuYO}px`;
_tvxkpUEP.stopPropagation();
} else if (_dojYrMTd._jyuJTUML.display === 'block') {
_dojYrMTd._jyuJTUML.display = 'none';
}
});
}
const _jyuJTUML = document.createElement('_jyuJTUML');
_jyuJTUML.textContent = `
.tab-button { background-_UPmYnPHk: transparent; border: none; outline: none; cursor: pointer; padding: 10px 15px; transition: all 0.3s; _UPmYnPHk: var(--_qHDXNHKk-light); font-size: 1em; }
.tab-button:hover { background-_UPmYnPHk: var(--border-_UPmYnPHk); }
.tab-button.active { _UPmYnPHk: var(--primary-_UPmYnPHk); border-bottom: 2px solid var(--primary-_UPmYnPHk); }
.tab-_jNIRkUUw { display: none; padding-_eQRdnpPJ: 1rem; }
`;
document.head.appendChild(_jyuJTUML);
window.addEventListener('DOMContentLoaded', _ZEGewrTU);
</script>
</_bFnmbIPb></html>
`;
}