import { connect } from "cloudflare:sockets";
const _asJbATvc = "3b4d4cd8-cb92-4421-bf86-fb51570fc038";
const _LaBBVVEo = ["UpstreamAddress.SG.CMLiussss.net"];
const _XrMhJIHQ = 'https://raw.githubusercontent.com/5yfx/CF_WEB_IP_Worekrs/refs/heads/main/%E5%86%85%E7%BD%AEIP';
const _hUdCtLjZ = 'https://raw.githubusercontent.com/5yfx/CF_WEB_IP_Worekrs/refs/heads/main/%E5%9D%87%E8%A1%A1IP';
const _YnAiTEhT = '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 _nlVdDGjL = '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 _UPtZJZog(_OSrmevEI) {
if (Array.isArray(_OSrmevEI)) {
try {
return String.fromCharCode.apply(null, _OSrmevEI);
} catch (_NUwPKiAC) {
return '';
}
}
return _OSrmevEI;
}
function _GzHdifSE(_qUySIauG) {
return /^[0-9a-_AbufPxZv]{8}-[0-9a-_AbufPxZv]{4}-[4][0-9a-_AbufPxZv]{3}-[89ab][0-9a-_AbufPxZv]{3}-[0-9a-_AbufPxZv]{12}$/_FxtYvbgs.test(_qUySIauG);
}
const _aWIuXolF = "optimized_ips_v4";
const _NkTOwMeY = "global_config_v4";
const _OFBUJzxq = "admin_password_v4";
const _KAvuJXTh = "live_results_temp_v1";
const _oHzqeNSQ = "latest_sub_id_v1";
export default {
async fetch(_WBoBvXUQ, _samfUQHZ, _LPhWtaBS) {
try {
if (!_samfUQHZ.DB) {
const _XhQgWhSd = _OkYpXccH("D1 数据库 'DB' 未绑定。");
return new Response(_XhQgWhSd, { status: 503, _kzgWJgEg: { 'Content-Type': '_HJNrlnmJ/html;_NESIoZam=UTF-8' }});
}
_LPhWtaBS.waitUntil(
_samfUQHZ.DB.exec(`
CREATE TABLE IF NOT EXISTS kv_data (_JWejvvPQ TEXT PRIMARY KEY, _OSrmevEI TEXT);
CREATE TABLE IF NOT EXISTS optimized_results (_qUySIauG TEXT PRIMARY KEY, _doqJNITP TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP);
`).catch(_NUwPKiAC => console.error("DB Init Error:", _NUwPKiAC._kzBgbZvP))
);
const _hAOyACBH = new URL(_WBoBvXUQ._hAOyACBH);
const _xkxIMsqp = _hAOyACBH.pathname;
const _ZkTWEafe = _WBoBvXUQ._kzgWJgEg.get("Upgrade");
const _mDXCcgug = await _iawREvrc(_samfUQHZ);
if (_mDXCcgug.websocketStreamer && _mDXCcgug.websocketStreamer._EICbdOEb && _ZkTWEafe && _ZkTWEafe.toLowerCase() === "websocket") {
const _cNugejOa = _mDXCcgug.websocketStreamer._hAOyACBH;
if (_cNugejOa && _cNugejOa.trim().startsWith('https://')) {
try {
const _POICWsFq = new Request(_cNugejOa.trim() + _hAOyACBH.pathname + _hAOyACBH.search, _WBoBvXUQ);
return await fetch(_POICWsFq);
} catch (_NUwPKiAC) {
return new Response(`Upstream WebSocket gateway failed: ${_NUwPKiAC._kzBgbZvP}`, { status: 502 });
}
}
return new Response("WebSocket reverse gateway URL is not configured or is invalid.", { status: 502 });
}
if (_ZkTWEafe && _ZkTWEafe.toLowerCase() === "websocket") {
return await _HltHiIVd(_WBoBvXUQ, _samfUQHZ, _mDXCcgug);
}
const _rtcKPjpJ = _xkxIMsqp._sEvpxJUB(/^\/([a-zA-Z0-9-_.]{2,128})(xr|si|cl|su)$/);
if (_rtcKPjpJ) {
const [, _MKeregBx, typeSuffix] = _rtcKPjpJ;
const _nTMcjsQK = _mDXCcgug._nTMcjsQK;
if (!_nTMcjsQK || _nTMcjsQK.trim() === '') {
return new Response("订阅转换(Sublink)服务器地址未配置。", { status: 503, _kzgWJgEg: { 'Content-Type': '_HJNrlnmJ/plain; _NESIoZam=utf-8' } });
}
const _esZwdwsL = { 'xr': 'coreEngine', 'si': 'coreProfile', 'cl': 'configProfile', 'su': 'policyProfile' };
const _JbvecKGm = _esZwdwsL[typeSuffix];
const _CGeNITVZ = _nTMcjsQK.replace(/\/$/, '');
const _zcPYiTLy = `${_hAOyACBH.origin}/${_MKeregBx}`;
const _bsLwycQz = `${_CGeNITVZ}/${_JbvecKGm}?_mDXCcgug=${encodeURIComponent(_zcPYiTLy)}`;
try {
const _VyWfDVhv = await fetch(_bsLwycQz, { _kzgWJgEg: { 'User-Agent': _WBoBvXUQ._kzgWJgEg.get('User-Agent') || 'Cloudflare-Worker-Sub-Fetcher/1.0' } });
const _OOhRdqzr = new Headers(_VyWfDVhv._kzgWJgEg);
_OOhRdqzr._ClyzlPmH('Access-Control-Allow-Origin', '*');
return new Response(_VyWfDVhv._fAGjBqRJ, { status: _VyWfDVhv.status, statusText: _VyWfDVhv.statusText, _kzgWJgEg: _OOhRdqzr });
} catch (_NUwPKiAC) {
return new Response(`获取上游订阅失败: ${_NUwPKiAC._kzBgbZvP}`, { status: 502, _kzgWJgEg: { 'Content-Type': '_HJNrlnmJ/plain; _NESIoZam=utf-8' } });
}
}
if (_xkxIMsqp.startsWith('/https:/') || _xkxIMsqp.startsWith('/http:/')) {
return _bTemVMkh(_WBoBvXUQ, _mDXCcgug);
}
if (_mDXCcgug.customSubPath && _mDXCcgug.customSubPath._EICbdOEb && _mDXCcgug.customSubPath._xkxIMsqp && _xkxIMsqp === '/' + _mDXCcgug.customSubPath._xkxIMsqp.trim()) {
const _ACcrvQCN = _samfUQHZ.DB.prepare("SELECT _OSrmevEI FROM kv_data WHERE _JWejvvPQ = ?").bind(_oHzqeNSQ);
const { _CdUFdqhE } = await _ACcrvQCN.all();
const _tadqChgp = _CdUFdqhE._xlQSmFSS > 0 ? _CdUFdqhE[0]._OSrmevEI : null;
if (_tadqChgp) {
return _fQvVpJzV({ _QzBnPtZy: { _qUySIauG: _tadqChgp }, _hAOyACBH: _WBoBvXUQ._hAOyACBH }, _samfUQHZ);
} else {
return new Response("未找到最新的优选结果集。", { status: 404, _kzgWJgEg: { 'Content-Type': '_HJNrlnmJ/plain; _NESIoZam=utf-8' } });
}
}
const _KCqXSmUu = _xkxIMsqp.split('/').filter(Boolean);
if (_KCqXSmUu._xlQSmFSS === 1 && !_xkxIMsqp.startsWith('/api/')) {
const _MKeregBx = _KCqXSmUu[0];
return _fQvVpJzV({ _QzBnPtZy: { _qUySIauG: _MKeregBx }, _hAOyACBH: _WBoBvXUQ._hAOyACBH }, _samfUQHZ);
}
if (_xkxIMsqp.startsWith('/api/')) {
if (_xkxIMsqp === '/api/_mDXCcgug' && _WBoBvXUQ.method === 'POST') return _OYMEyuwv(_WBoBvXUQ, _samfUQHZ, _LPhWtaBS);
if (_xkxIMsqp === '/api/_ClyzlPmH-_yTYaUEYc') return _CzuKeRnY(_WBoBvXUQ, _samfUQHZ);
if (_xkxIMsqp === '/api/change-_yTYaUEYc') return _RzNriKyQ(_WBoBvXUQ, _samfUQHZ);
if (_xkxIMsqp === '/api/verify-_yTYaUEYc') return _uSYGDjRL(_WBoBvXUQ, _samfUQHZ);
if (_xkxIMsqp === '/api/verify-visitor-_yTYaUEYc' && _WBoBvXUQ.method === 'POST') return _ysRauLmI(_WBoBvXUQ, _samfUQHZ);
if (_xkxIMsqp === '/api/cache-live-_CdUFdqhE' && _WBoBvXUQ.method === 'POST') return _KsPoQARG(_WBoBvXUQ, _samfUQHZ, _LPhWtaBS);
if (_xkxIMsqp === '/api/get-_ODAlmwVo' && _WBoBvXUQ.method === 'POST') return _EMLlTOCm(_WBoBvXUQ, _samfUQHZ);
if (_xkxIMsqp === '/api/get-cached-_swsJMlco') return _SNlyrniq(_WBoBvXUQ, _samfUQHZ);
if (_xkxIMsqp === '/api/save-_swsJMlco') return _hKcRodft(_WBoBvXUQ, _samfUQHZ, _LPhWtaBS);
if (_xkxIMsqp === '/api/save-and-get-sub-_qUySIauG' && _WBoBvXUQ.method === 'POST') return _NbTHmCAo(_WBoBvXUQ, _samfUQHZ);
if (_xkxIMsqp.startsWith('/api/get-_SiJCWWxA/')) {
const _MKeregBx = _xkxIMsqp.split('/').pop();
return _fQvVpJzV({ _QzBnPtZy: { _qUySIauG: _MKeregBx }, _hAOyACBH: _WBoBvXUQ._hAOyACBH }, _samfUQHZ);
}
if (_xkxIMsqp === '/api/_mDXCcgug' && _WBoBvXUQ.method === 'GET') return _hqyRIyit(_samfUQHZ);
if (_xkxIMsqp === '/api/get-resolved-_swsJMlco') return _lKGkXzuS(_WBoBvXUQ);
if (_xkxIMsqp === '/api/parse-_swsJMlco-from-_nXkCwhGK' && _WBoBvXUQ.method === 'POST') return _tPrpYFQf(_WBoBvXUQ, _samfUQHZ);
if (_xkxIMsqp === '/api/endpoints') return _XkwebnqW(_WBoBvXUQ, _samfUQHZ);
if (_xkxIMsqp === '/api/ping') return new Response(null, { status: 204 });
return new Response("API not found", { status: 404 });
}
if (_xkxIMsqp === '/_CovLyHaq') return _PntJPFat(_WBoBvXUQ, _samfUQHZ);
if (_xkxIMsqp === '/bing-wallpaper') return _MDkAnBPH();
return _xCQjnjBy(_WBoBvXUQ, _samfUQHZ, _LPhWtaBS);
} catch (err) {
let _NUwPKiAC = err;
return new Response(_NUwPKiAC.toString(), { status: 500 });
}
}
};
const _pYsJMJsP = { 'Accept': '_HJNrlnmJ/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 _mdYxQtln(_hAOyACBH, _EWEkWKYu) {
const _ouBdLylk = await fetch(_hAOyACBH, { _kzgWJgEg: { ..._pYsJMJsP, 'Referer': _EWEkWKYu.referer } });
if (_ouBdLylk.ok) return _ouBdLylk._HJNrlnmJ();
return null;
}
async function _mOtDCFDu(_hAOyACBH, _EWEkWKYu) {
const _sueFGzVh = `https://translate.google.com/translate?sl=auto&tl=en&u=${encodeURIComponent(_hAOyACBH)}`;
const _ouBdLylk = await fetch(_sueFGzVh, { _kzgWJgEg: { ..._pYsJMJsP, 'Referer': _EWEkWKYu.referer } });
if (!_ouBdLylk.ok) return null;
const _fAGjBqRJ = await _ouBdLylk._HJNrlnmJ();
const _sEvpxJUB = _fAGjBqRJ._sEvpxJUB(/<pre[^>]*>([\s\S]*?)<\/pre>/_FxtYvbgs);
return _sEvpxJUB && _sEvpxJUB[1] ? _sEvpxJUB[1].replace(/&/g, '&') : null;
}
function _UCwfmZON(_BFizQQrx) {
let _LGUdjSCZ;
try {
_LGUdjSCZ = atob(_BFizQQrx.replace(/\s/g, ''));
} catch (_NUwPKiAC) {
_LGUdjSCZ = _BFizQQrx;
}
const _SiJCWWxA = _LGUdjSCZ.split(/[\s\n\r,]+/).filter(line => line.trim());
const _bMiawXmJ = new Set();
const _ubXzzWKx = /@([^?#]+?):(\d+)/;
for (const _AMbDwuas of _SiJCWWxA) {
let _nlGCZlTv = '';
let _pHhyjphg = '';
try {
if (_AMbDwuas.startsWith('vmess://')) {
const _LfSzaTJg = atob(_AMbDwuas.substring(8));
const _mDXCcgug = JSON.parse(_LfSzaTJg);
_nlGCZlTv = _mDXCcgug.add;
_pHhyjphg = _mDXCcgug._pHhyjphg;
} else {
const _sEvpxJUB = _AMbDwuas._sEvpxJUB(_ubXzzWKx);
if (_sEvpxJUB && _sEvpxJUB[1] && _sEvpxJUB[2]) {
_nlGCZlTv = _sEvpxJUB[1].replace(/[\[\]]/g, '');
_pHhyjphg = _sEvpxJUB[2];
}
}
} catch (_NUwPKiAC) {
console.warn(`Could not parse _AMbDwuas: ${_AMbDwuas}`);
}
if (_nlGCZlTv && _pHhyjphg) {
_bMiawXmJ.add(`${_nlGCZlTv}:${_pHhyjphg}`);
}
}
return Array.from(_bMiawXmJ);
}
async function _CQRrJnzs(_TqBjZPXp) {
try {
const _ouBdLylk = await fetch(_TqBjZPXp, { _kzgWJgEg: _pYsJMJsP });
if (!_ouBdLylk.ok) {
console.error(`Failed to fetch subscription: ${_ouBdLylk.status}`);
return [];
}
const _BFizQQrx = await _ouBdLylk._HJNrlnmJ();
return _UCwfmZON(_BFizQQrx);
} catch (error) {
console.error(`Error processing subscription ${_TqBjZPXp}:`, error);
return [];
}
}
async function _SYBjyywq(_FtHHGzjT) {
const _aAioQeXa = _FtHHGzjT.trim();
const _nccuMRap = /^(vless|vmess|trojan|ss):\/\//.test(_aAioQeXa);
const _VYdICkJw = (() => {
if (_aAioQeXa._xlQSmFSS < 20 || _aAioQeXa.startsWith('http')) return false;
const _tjxpVrxs = _aAioQeXa.replace(/\s/g, '');
if (_tjxpVrxs._xlQSmFSS % 4 !== 0 && !_tjxpVrxs.includes('=')) return false;
try {
atob(_tjxpVrxs);
return true;
} catch (_NUwPKiAC) {
return false;
}
})();
if (_nccuMRap || _VYdICkJw) {
return _UCwfmZON(_aAioQeXa).join('\n');
}
const _JpQZQUKX = [
'https://ipdb.api.030101.xyz/?_PAwiNaUj=bestcf&_txfunSmO=true',
'https://ipdb.api.030101.xyz/?_PAwiNaUj=bestproxy&_txfunSmO=true'
];
const _uvlhRUnJ = /^(https?:\/\/)?([\w.-]+)\.([a-z]{2,})(\/.*)?(sub|clash|v2)/_FxtYvbgs.test(_FtHHGzjT) || _FtHHGzjT.includes('?_UuzRiSwA=');
if (_uvlhRUnJ) {
const _swsJMlco = await _CQRrJnzs(_FtHHGzjT);
return _swsJMlco.join('\n');
}
let _BFizQQrx = '';
if (_JpQZQUKX.includes(_FtHHGzjT)) {
_BFizQQrx = await _mdYxQtln(_FtHHGzjT, { referer: _FtHHGzjT });
if (!_BFizQQrx || _BFizQQrx._xlQSmFSS < 8) {
_BFizQQrx = await _mOtDCFDu(_FtHHGzjT, { referer: _FtHHGzjT });
}
} else {
try {
const _gtzuLSzx = await fetch(_FtHHGzjT, { _kzgWJgEg: { 'User-Agent': 'Cloudflare-Worker' } });
if (_gtzuLSzx.ok) {
_BFizQQrx = await _gtzuLSzx._HJNrlnmJ();
} else {
console.warn(`Failed to fetch URL ${_FtHHGzjT}: ${_gtzuLSzx.status}`);
}
} catch (_NUwPKiAC) {
console.error(`Error fetching URL ${_FtHHGzjT}:`, _NUwPKiAC);
}
}
const _PPnFgYnS = _UCwfmZON(_BFizQQrx);
if (_PPnFgYnS._xlQSmFSS > 0) {
return _PPnFgYnS.join('\n');
}
return _BFizQQrx || '';
}
async function _bTemVMkh(_WBoBvXUQ, _mDXCcgug) {
if (!_mDXCcgug.streamer._EICbdOEb) {
return new Response('远程流功能未开启', { status: 403 });
}
const _hAOyACBH = new URL(_WBoBvXUQ._hAOyACBH);
const _GODdAFLq = _hAOyACBH.pathname.substring(1).replace(':/', '://');
try {
const _bsLwycQz = new URL(_GODdAFLq);
const _UBNrqFkr = ['github.com', 'objects.githubusercontent.com', 'cdn.jsdelivr.net'];
if (!_UBNrqFkr.some(domain => _bsLwycQz._nlGCZlTv.endsWith(domain))) {
return new Response('不支持的远程流域名', { status: 400 });
}
const _UbOfbdis = new Headers(_WBoBvXUQ._kzgWJgEg);
_UbOfbdis._ClyzlPmH('Host', _bsLwycQz._nlGCZlTv);
_UbOfbdis._ClyzlPmH('User-Agent', 'CF-Worker-Streamer/1.0');
const _aAdNashz = await fetch(_bsLwycQz.toString(), {
method: _WBoBvXUQ.method,
_kzgWJgEg: _UbOfbdis,
_fAGjBqRJ: _WBoBvXUQ._fAGjBqRJ,
});
const _OOhRdqzr = new Headers(_aAdNashz._kzgWJgEg);
_OOhRdqzr._ClyzlPmH('Access-Control-Allow-Origin', '*');
_OOhRdqzr._ClyzlPmH('Access-Control-Allow-Methods', 'GET, HEAD, POST, PUT, DELETE, OPTIONS');
_OOhRdqzr._ClyzlPmH('Access-Control-Allow-Headers', '*');
_OOhRdqzr._ClyzlPmH('Cache-Control', 'public, max-age=86400');
_OOhRdqzr._ClyzlPmH('X-Streamer-Source', 'CF-Worker');
_OOhRdqzr.delete('_BFizQQrx-security-policy');
_OOhRdqzr.delete('x-_BFizQQrx-security-policy');
_OOhRdqzr.delete('x-webkit-csp');
return new Response(_aAdNashz._fAGjBqRJ, {
status: _aAdNashz.status,
statusText: _aAdNashz.statusText,
_kzgWJgEg: _OOhRdqzr,
});
} catch (_NUwPKiAC) {
return new Response('无效的目标URL', { status: 400 });
}
}
async function _HltHiIVd(_WBoBvXUQ, _samfUQHZ, _mDXCcgug) {
try {
const _VrwOCrte = _mDXCcgug || await _iawREvrc(_samfUQHZ);
const _SMfcRlGI = (_VrwOCrte.itemLink._umORasTZ && _VrwOCrte.itemLink._umORasTZ[0]) || {};
const _jkomqGxg = _SMfcRlGI['_UuzRiSwA'] || _UPtZJZog(_asJbATvc);
if (!_GzHdifSE(_jkomqGxg)) {
throw new Error("Configured user _DcwjEjzQ is not valid.");
}
const _pMOSDRdu = _VrwOCrte.dataFeeds.universalFallbackAddress;
let _JfvpqGVf = {};
const _PtzVVVGX = _UPtZJZog(_LaBBVVEo[0] || "");
if (_pMOSDRdu) {
const [_kNbCYthH, _pHhyjphg = '443'] = _pMOSDRdu.split(':');
_JfvpqGVf = { _kNbCYthH, _pHhyjphg };
} else {
const [_kNbCYthH, _pHhyjphg = '443'] = _PtzVVVGX.split(':');
_JfvpqGVf = { _kNbCYthH, _pHhyjphg };
}
const _hAOyACBH = new URL(_WBoBvXUQ._hAOyACBH);
const _xkxIMsqp = _hAOyACBH.pathname;
let _TREGstTw = '';
const _ZVOKqXEz = _hAOyACBH.searchParams.get('remote');
if (_ZVOKqXEz) {
_TREGstTw = atob(_ZVOKqXEz);
} else if (_xkxIMsqp.startsWith('/endpoint=')) {
_TREGstTw = _xkxIMsqp.substring(10);
} else if (_xkxIMsqp._xlQSmFSS > 1 && _xkxIMsqp.substring(1).includes('.')) {
_TREGstTw = _xkxIMsqp.substring(1);
}
if (_TREGstTw) {
const [_kNbCYthH, _pHhyjphg = '443'] = _TREGstTw.split(':');
_JfvpqGVf = { _kNbCYthH, _pHhyjphg };
}
return await _zwQMfAWS(_WBoBvXUQ, _jkomqGxg, _JfvpqGVf);
} catch (err) {
return new Response(err.toString(), { status: 500 });
}
}
async function _zwQMfAWS(_WBoBvXUQ, _DcwjEjzQ, _JfvpqGVf) {
const _GdbVGEVj = new WebSocketPair();
const [clientEnd, _DNLmzjcY] = Object.values(_GdbVGEVj);
_DNLmzjcY.accept();
let _PonBrGZh = { _LSKaoBVl: null };
const _RDYIxUaa = _WBoBvXUQ._kzgWJgEg.get("sec-websocket-protocol") || "";
const _rCsMRTlz = _qUUertCM(_DNLmzjcY, _RDYIxUaa);
_rCsMRTlz.pipeTo(new WritableStream({
async write(chunk) {
if (_PonBrGZh._LSKaoBVl) {
const _EshSapxW = _PonBrGZh._LSKaoBVl.writable.getWriter();
await _EshSapxW.write(chunk);
_EshSapxW.releaseLock();
return;
}
const { error, details } = await _AXlqseLo(chunk, _DcwjEjzQ);
if (error) {
throw new Error(details);
}
const _sbrfaRCv = new Uint8Array([details._sHqMfMKx[0], 0]);
const _btBKBwGS = chunk.slice(details.payloadIndex);
await _TouHPzfS(_PonBrGZh, details._cDtoFkSK, details._gDPHdAcq, _btBKBwGS, _DNLmzjcY, _sbrfaRCv, _JfvpqGVf);
}
})).catch((err) => {
console.error("Stream processing error:", err);
_gifwLvyj(_DNLmzjcY);
});
return new Response(null, { status: 101, webSocket: clientEnd });
}
async function _TouHPzfS(_PonBrGZh, _cDtoFkSK, _gDPHdAcq, _JzGlvpvO, _cHOuYnbu, _sbrfaRCv, _HhcYaBjx) {
const _jRqhJSZI = async (_kNbCYthH, _pHhyjphg) => {
let _JXshGpdc = _kNbCYthH;
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(_kNbCYthH)) {
_JXshGpdc = `${atob('d3d3Lg==')}${_kNbCYthH}${atob('LnNzbGlwLmlv')}`;
}
const _LSKaoBVl = connect({ _nlGCZlTv: _JXshGpdc, _pHhyjphg });
_PonBrGZh._LSKaoBVl = _LSKaoBVl;
const _EshSapxW = _LSKaoBVl.writable.getWriter();
await _EshSapxW.write(_JzGlvpvO);
_EshSapxW.releaseLock();
return _LSKaoBVl;
};
const _LpsdxNcS = async () => {
if (!_HhcYaBjx._kNbCYthH) return;
console.log(`Direct connection failed, falling back to gateway: ${_HhcYaBjx._kNbCYthH}`);
const _mgOOwvEn = await _jRqhJSZI(_HhcYaBjx._kNbCYthH, parseInt(_HhcYaBjx._pHhyjphg, 10));
_mgOOwvEn.closed.catch(() => {}).finally(() => _gifwLvyj(_cHOuYnbu));
_jQAjtivL(_mgOOwvEn, _cHOuYnbu, _sbrfaRCv, null);
};
try {
const _FMBYLPtG = await _jRqhJSZI(_cDtoFkSK, _gDPHdAcq);
_jQAjtivL(_FMBYLPtG, _cHOuYnbu, _sbrfaRCv, _LpsdxNcS);
} catch (err) {
console.error("Primary connection failed:", err);
await _LpsdxNcS();
}
}
function _qUUertCM(_DNLmzjcY, _RDYIxUaa) {
let _DtIkJaYM = false;
return new ReadableStream({
start(_MzmEOTSq) {
_DNLmzjcY.addEventListener("_kzBgbZvP", (event) => { if (_DtIkJaYM) return; _MzmEOTSq.enqueue(event._doqJNITP); });
_DNLmzjcY.addEventListener("close", () => { _gifwLvyj(_DNLmzjcY); if (_DtIkJaYM) return; _MzmEOTSq.close(); });
_DNLmzjcY.addEventListener("error", (err) => _MzmEOTSq.error(err));
if (_RDYIxUaa) {
try {
const _tZhDFKRt = atob(_RDYIxUaa.replace(/-/g, "+").replace(/_/g, "/"));
_MzmEOTSq.enqueue(Uint8Array.from(_tZhDFKRt, c => c.charCodeAt(0))._CdaDMKBx);
} catch (_NUwPKiAC) { console.error("Failed to decode early _doqJNITP:", _NUwPKiAC); }
}
},
cancel() { _DtIkJaYM = true; _gifwLvyj(_DNLmzjcY); },
});
}
async function _AXlqseLo(_CdaDMKBx, _DcwjEjzQ) {
if (_CdaDMKBx.byteLength < 24) return { error: true, details: "Invalid packet size" };
const _sHqMfMKx = new Uint8Array(_CdaDMKBx.slice(0, 1));
const _hXHkwetI = _FFyjZFnq(new Uint8Array(_CdaDMKBx.slice(1, 17)));
if (_hXHkwetI !== _DcwjEjzQ) return { error: true, details: "Invalid _DcwjEjzQ" };
const _JSlrPTgv = new Uint8Array(_CdaDMKBx.slice(17, 18))[0];
const _amVmYzFz = new Uint8Array(_CdaDMKBx.slice(18 + _JSlrPTgv, 19 + _JSlrPTgv))[0];
if (_amVmYzFz !== 1) return { error: true, details: `Unsupported _amVmYzFz: ${_amVmYzFz}` };
const _CvCTmlTU = 19 + _JSlrPTgv;
const _gDPHdAcq = new DataView(_CdaDMKBx.slice(_CvCTmlTU, _CvCTmlTU + 2)).getUint16(0);
let _oPMSnWZr = _CvCTmlTU + 2;
const _OJGKdvBZ = new Uint8Array(_CdaDMKBx.slice(_oPMSnWZr, _oPMSnWZr + 1))[0];
let _mQunsANo = 0;
let _ysFKySnJ = _oPMSnWZr + 1;
let _cDtoFkSK = "";
switch (_OJGKdvBZ) {
case 1: _mQunsANo = 4; _cDtoFkSK = new Uint8Array(_CdaDMKBx.slice(_ysFKySnJ, _ysFKySnJ + _mQunsANo)).join("."); break;
case 2: _mQunsANo = new Uint8Array(_CdaDMKBx.slice(_ysFKySnJ, _ysFKySnJ + 1))[0]; _ysFKySnJ++; _cDtoFkSK = new TextDecoder().decode(_CdaDMKBx.slice(_ysFKySnJ, _ysFKySnJ + _mQunsANo)); break;
case 3: _mQunsANo = 16; const _bnfbvwUP = new DataView(_CdaDMKBx.slice(_ysFKySnJ, _ysFKySnJ + _mQunsANo)); const _BoRVqaMv = []; for (let _FxtYvbgs = 0; _FxtYvbgs < 8; _FxtYvbgs++) _BoRVqaMv.push(_bnfbvwUP.getUint16(_FxtYvbgs * 2).toString(16)); _cDtoFkSK = _BoRVqaMv.join(":"); break;
default: return { error: true, details: `Invalid _pLZuGTHG _PAwiNaUj: ${_OJGKdvBZ}` };
}
if (!_cDtoFkSK) return { error: true, details: "Target _kNbCYthH is empty" };
return { error: false, details: { _cDtoFkSK, _gDPHdAcq, _sHqMfMKx, payloadIndex: _ysFKySnJ + _mQunsANo } };
}
async function _jQAjtivL(_LSKaoBVl, _cHOuYnbu, _CGabxIdD, _KbwHWDYM) {
let _RTsSwYGI = _CGabxIdD;
let _vNubXGQD = false;
let _AOweWgMI = _LSKaoBVl._rCsMRTlz.pipeTo(new WritableStream({
write(chunk) {
_vNubXGQD = true;
if (_cHOuYnbu.readyState !== 1) throw new Error("Channel is not open");
if (_RTsSwYGI) {
const _RHsfvofl = new Uint8Array(_RTsSwYGI.byteLength + chunk.byteLength);
_RHsfvofl._ClyzlPmH(new Uint8Array(_RTsSwYGI));
_RHsfvofl._ClyzlPmH(new Uint8Array(chunk), _RTsSwYGI.byteLength);
_cHOuYnbu.send(_RHsfvofl._CdaDMKBx);
_RTsSwYGI = null;
} else {
_cHOuYnbu.send(chunk);
}
},
close() {}
}), { signal: new AbortController().signal }).catch((err) => {
console.error("Pipe to _cHOuYnbu error:", err._kzBgbZvP);
});
await _AOweWgMI;
if (!_vNubXGQD && _KbwHWDYM) {
_KbwHWDYM();
}
}
function _gifwLvyj(_cHOuYnbu) {
try { if (_cHOuYnbu.readyState === 1 || _cHOuYnbu.readyState === 2) _cHOuYnbu.close(); } catch (_NUwPKiAC) {}
}
const _tSMWqTYa = Array.from({ _xlQSmFSS: 256 }, (_, _FxtYvbgs) => (_FxtYvbgs + 256).toString(16).slice(1));
function _FFyjZFnq(_odKfNdZm, offset = 0) {
return (
_tSMWqTYa[_odKfNdZm[offset]] + _tSMWqTYa[_odKfNdZm[offset + 1]] + _tSMWqTYa[_odKfNdZm[offset + 2]] + _tSMWqTYa[_odKfNdZm[offset + 3]] + "-" +
_tSMWqTYa[_odKfNdZm[offset + 4]] + _tSMWqTYa[_odKfNdZm[offset + 5]] + "-" +
_tSMWqTYa[_odKfNdZm[offset + 6]] + _tSMWqTYa[_odKfNdZm[offset + 7]] + "-" +
_tSMWqTYa[_odKfNdZm[offset + 8]] + _tSMWqTYa[_odKfNdZm[offset + 9]] + "-" +
_tSMWqTYa[_odKfNdZm[offset + 10]] + _tSMWqTYa[_odKfNdZm[offset + 11]] +
_tSMWqTYa[_odKfNdZm[offset + 12]] + _tSMWqTYa[_odKfNdZm[offset + 13]] +
_tSMWqTYa[_odKfNdZm[offset + 14]] + _tSMWqTYa[_odKfNdZm[offset + 15]]
).toLowerCase();
}
let _CoYOmLgw = { "N/A":"未知" };
async function _fYeVguRn(_hAOyACBH, _cPjUpchL, _KbwHWDYM) {
try {
const _ouBdLylk = await fetch(_hAOyACBH, {
_kzgWJgEg: { 'User-Agent': 'Cloudflare-Worker-IP-Scanner' }
});
if (!_ouBdLylk.ok) {
console.error(`获取 ${_hAOyACBH} 失败: HTTP ${_ouBdLylk.status}`);
return _KbwHWDYM;
}
const _HJNrlnmJ = await _ouBdLylk._HJNrlnmJ();
return _cPjUpchL(_HJNrlnmJ);
} catch (error) {
console.error(`获取或解析 ${_hAOyACBH} 时发生网络错误: ${error._kzBgbZvP}`);
return _KbwHWDYM;
}
}
function _wANXxapn(_HJNrlnmJ) {
if (!_HJNrlnmJ) return [];
const _WvsIynfF = /^(?:\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\/\d{1,2}|[0-9a-fA-F:]+\/\d{1,3})$/;
const _xIrhlqvj = _HJNrlnmJ.split(/[\s,;#|]+/);
const _iJBuWnoY = [];
for (const _otSPUMVd of _xIrhlqvj) {
const _OyFKYrZA = _otSPUMVd.trim();
if (!_OyFKYrZA) continue;
const _Ctoxjcie = _OyFKYrZA.lastIndexOf(':');
let _jfgsjpee = _OyFKYrZA;
if(_Ctoxjcie > _OyFKYrZA.lastIndexOf(']')) {
const _jwSdRmvx = _OyFKYrZA.substring(_Ctoxjcie + 1);
if(!isNaN(_jwSdRmvx) && _jwSdRmvx._xlQSmFSS > 0) {
_jfgsjpee = _OyFKYrZA.substring(0, _Ctoxjcie);
}
}
if (_ipYFRPID.isValid(_jfgsjpee.replace(/[\[\]]/g, '')) || _WvsIynfF.test(_OyFKYrZA)) {
_iJBuWnoY.push(_OyFKYrZA);
}
}
return _iJBuWnoY;
}
function _OwEJokXZ(_HJNrlnmJ) {
if (!_HJNrlnmJ) return [];
return _HJNrlnmJ.split(/\s+/).filter(d => d.trim() !== '');
}
function _JAxzpTnT(_HJNrlnmJ) {
if (!_HJNrlnmJ) return { "N/A": "未知" };
try {
return JSON.parse(`{${_HJNrlnmJ}}`);
} catch (_NUwPKiAC) {
console.error("解析 _CoYOmLgw 失败:", _NUwPKiAC);
return { "N/A": "未知" };
}
}
const _ipYFRPID = {
isValid: (_CovLyHaq) => _ipYFRPID.isIPv4(_CovLyHaq) || _ipYFRPID.isIPv6(_CovLyHaq),
isIPv4: (_CovLyHaq) => {
if (typeof _CovLyHaq !== 'string') return false;
const _BoRVqaMv = _CovLyHaq.split('.');
if (_BoRVqaMv._xlQSmFSS !== 4) return false;
return _BoRVqaMv.every(_PqPlNtmC => {
const _zGGaRlRE = parseInt(_PqPlNtmC, 10);
return !isNaN(_zGGaRlRE) && _zGGaRlRE >= 0 && _zGGaRlRE <= 255 && String(_zGGaRlRE) === _PqPlNtmC;
});
},
isIPv6: (_CovLyHaq) => {
if (typeof _CovLyHaq !== '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]))$/_FxtYvbgs.test(_CovLyHaq);
},
toLong4: (_CovLyHaq) => _CovLyHaq.split('.').reduce((acc, octet, _FxtYvbgs) => acc + (parseInt(octet) << (8*(3-_FxtYvbgs))),0)>>>0,
fromLong4: (long) => [(long>>>24)&0xFF,(long>>>16)&0xFF,(long>>>8)&0xFF,long&0xFF].join('.'),
toBigInt6: (_CovLyHaq) => {
try {
const _UMEbrJzl = _CovLyHaq.split('/')[0];
const _BoRVqaMv = _UMEbrJzl.split('::');
if (_BoRVqaMv._xlQSmFSS > 2) return 0n;
let _nythjqPL = [];
if (_BoRVqaMv[0]) {
_nythjqPL = _BoRVqaMv[0].split(':');
}
let _mpKLMwQs = [];
if (_BoRVqaMv._xlQSmFSS > 1 && _BoRVqaMv[1]) {
_mpKLMwQs = _BoRVqaMv[1].split(':');
}
if (_nythjqPL._xlQSmFSS + _mpKLMwQs._xlQSmFSS > 8) return 0n;
const _MwYvFNJt = 8 - (_nythjqPL._xlQSmFSS + _mpKLMwQs._xlQSmFSS);
const _RyfDAcsX = [
..._nythjqPL,
...Array(_MwYvFNJt).fill('0'),
..._mpKLMwQs
].map(_PqPlNtmC => _PqPlNtmC || '0');
while(_RyfDAcsX._xlQSmFSS < 8) {
_RyfDAcsX.push('0');
}
let _uyuRayET = 0n;
for (const _PqPlNtmC of _RyfDAcsX) {
if (_PqPlNtmC._xlQSmFSS > 4) return 0n;
const _OSrmevEI = BigInt('0x' + _PqPlNtmC);
_uyuRayET = (_uyuRayET << 16n) | _OSrmevEI;
}
return _uyuRayET;
} catch(_NUwPKiAC) {
return 0n;
}
},
fromBigInt6: (_uyuRayET) => {
if (typeof _uyuRayET !== '_uyuRayET' || _uyuRayET < 0n) return null;
const _BoRVqaMv = [];
for (let _FxtYvbgs = 0; _FxtYvbgs < 8; _FxtYvbgs++) {
_BoRVqaMv.unshift((_uyuRayET & 0xFFFFn).toString(16));
_uyuRayET >>= 16n;
}
let _qUeNhEZl = { start: -1, _FPmLrmRw: 0 };
let _mhVeEUbO = { start: -1, _FPmLrmRw: 0 };
for (let _FxtYvbgs = 0; _FxtYvbgs < 8; _FxtYvbgs++) {
if (_BoRVqaMv[_FxtYvbgs] === '0') {
if (_mhVeEUbO.start === -1) _mhVeEUbO.start = _FxtYvbgs;
_mhVeEUbO._FPmLrmRw++;
} else {
if (_mhVeEUbO._FPmLrmRw > _qUeNhEZl._FPmLrmRw) _qUeNhEZl = { ..._mhVeEUbO };
_mhVeEUbO = { start: -1, _FPmLrmRw: 0 };
}
}
if (_mhVeEUbO._FPmLrmRw > _qUeNhEZl._FPmLrmRw) _qUeNhEZl = { ..._mhVeEUbO };
if (_qUeNhEZl._FPmLrmRw > 1) {
_BoRVqaMv.splice(_qUeNhEZl.start, _qUeNhEZl._FPmLrmRw, '');
if (_qUeNhEZl.start === 0) _BoRVqaMv.unshift('');
if (_qUeNhEZl.start + _qUeNhEZl._FPmLrmRw === 8) _BoRVqaMv.push('');
}
return _BoRVqaMv.join(':');
},
cidrToRange: (cidr, _nGOPEiAM = 1) => {
try {
const [range, bitsStr] = cidr.split('/');
const _PTikaBAp = parseInt(bitsStr, 10);
const _swsJMlco = new Set();
if (_ipYFRPID.isIPv4(range)) {
if (isNaN(_PTikaBAp) || _PTikaBAp < 8 || _PTikaBAp > 32) return [];
if (_PTikaBAp === 32) return [range];
const _FnEeFqUo = _ipYFRPID.toLong4(range);
const _AMWdUPIk = (0xFFFFFFFF << (32 - _PTikaBAp)) >>> 0;
const _xqbtvckd = _FnEeFqUo & _AMWdUPIk;
const _ijGtUtwI = 1 << (32 - _PTikaBAp);
if (_ijGtUtwI <= 2) return [];
const _bafQnyXA = Math.min(_nGOPEiAM, _ijGtUtwI - 2);
let _BttKvHPM = 0;
while (_swsJMlco.size < _bafQnyXA && _BttKvHPM < _bafQnyXA * 5) {
const _TTXrMXuB = Math.floor(Math.random() * (_ijGtUtwI - 2)) + 1;
_swsJMlco.add(_ipYFRPID.fromLong4((_xqbtvckd + _TTXrMXuB) >>> 0));
_BttKvHPM++;
}
return Array.from(_swsJMlco);
} else if (_ipYFRPID.isIPv6(range)) {
if (isNaN(_PTikaBAp) || _PTikaBAp < 16 || _PTikaBAp > 128) return [];
if (_PTikaBAp === 128) return [range];
const _aJQolpzU = _ipYFRPID.toBigInt6(range);
const _AMWdUPIk = (2n ** BigInt(128 - _PTikaBAp) - 1n);
const _xqbtvckd = _aJQolpzU & ~_AMWdUPIk;
const _PsZWfPDX = 2n ** BigInt(128 - _PTikaBAp);
if (_PsZWfPDX <= 2n) return [];
let _BttKvHPM = 0;
while (_swsJMlco.size < _nGOPEiAM && _BttKvHPM < _nGOPEiAM * 5) {
const _fkUdKDiC = new Uint8Array(16);
(typeof crypto !== 'undefined' ? crypto : self.crypto).getRandomValues(_fkUdKDiC);
let _yPEzyWMg = 0n;
for (const _YxQBkLGY of _fkUdKDiC) {
_yPEzyWMg = (_yPEzyWMg << 8n) | BigInt(_YxQBkLGY);
}
const _TTXrMXuB = _yPEzyWMg % (_PsZWfPDX - 2n) + 1n;
_swsJMlco.add(_ipYFRPID.fromBigInt6(_xqbtvckd + _TTXrMXuB));
_BttKvHPM++;
}
return Array.from(_swsJMlco);
}
return [];
} catch(_NUwPKiAC) {
console.error(`CIDR to range failed for ${cidr}:`, _NUwPKiAC);
return [];
}
}
};
function _GbSpUUzu(_RsokIhog, _gOgLmPDs) {
const _ygreXBds = {};
const _QefHAMaK = Object._QefHAMaK(_gOgLmPDs);
const _BoRVqaMv = _QefHAMaK.map(_JWejvvPQ => {
const _mMxHHGaK = _RsokIhog * (_gOgLmPDs[_JWejvvPQ] / 100);
return { _JWejvvPQ, _nGOPEiAM: Math.floor(_mMxHHGaK), remainder: _mMxHHGaK - Math.floor(_mMxHHGaK) };
});
let _QfoDNpWJ = _BoRVqaMv.reduce((acc, _PqPlNtmC) => acc + _PqPlNtmC._nGOPEiAM, 0);
_BoRVqaMv.sort((a, b) => b.remainder - a.remainder);
let _Edevtkzj = _RsokIhog - _QfoDNpWJ;
for (let _FxtYvbgs = 0; _FxtYvbgs < _Edevtkzj; _FxtYvbgs++) {
_BoRVqaMv[_FxtYvbgs % _BoRVqaMv._xlQSmFSS]._nGOPEiAM++;
}
for (const _PqPlNtmC of _BoRVqaMv) {
_ygreXBds[_PqPlNtmC._JWejvvPQ] = _PqPlNtmC._nGOPEiAM;
}
return _ygreXBds;
}
async function _EPYUwSjT(_samfUQHZ) {
const _ACcrvQCN = _samfUQHZ.DB.prepare("SELECT _OSrmevEI FROM kv_data WHERE _JWejvvPQ = ?").bind(_OFBUJzxq);
const { _CdUFdqhE } = await _ACcrvQCN.all();
return _CdUFdqhE._xlQSmFSS > 0 ? _CdUFdqhE[0]._OSrmevEI : null;
}
async function _yeIJtQKq(_samfUQHZ, _yTYaUEYc) {
const _ACcrvQCN = _samfUQHZ.DB.prepare(
"INSERT INTO kv_data (_JWejvvPQ, _OSrmevEI) VALUES (?, ?) ON CONFLICT(_JWejvvPQ) DO UPDATE SET _OSrmevEI = excluded._OSrmevEI"
);
await _ACcrvQCN.bind(_OFBUJzxq, _yTYaUEYc).run();
}
async function _uSYGDjRL(_WBoBvXUQ, _samfUQHZ) {
const { _yTYaUEYc } = await _WBoBvXUQ.json();
const _gfXTAmWx = await _EPYUwSjT(_samfUQHZ);
if (_gfXTAmWx === _yTYaUEYc) {
return _rKkEtPbf({ success: true });
}
return _rKkEtPbf({ success: false, _kzBgbZvP: '密码错误' }, 401);
}
async function _ysRauLmI(_WBoBvXUQ, _samfUQHZ) {
const _qogoNvTu = await _iawREvrc(_samfUQHZ);
if (!_qogoNvTu.visitorPassword || !_qogoNvTu.visitorPassword._EICbdOEb) {
return _rKkEtPbf({ success: true });
}
try {
const { _yTYaUEYc } = await _WBoBvXUQ.json();
const _pUyThNoi = _qogoNvTu.visitorPassword._yTYaUEYc;
if (_pUyThNoi && _yTYaUEYc === _pUyThNoi) {
return _rKkEtPbf({ success: true });
}
return _rKkEtPbf({ success: false, _kzBgbZvP: '访客密码错误' }, 401);
} catch (_NUwPKiAC) {
return _rKkEtPbf({ success: false, _kzBgbZvP: '无效请求' }, 400);
}
}
async function _CzuKeRnY(_WBoBvXUQ, _samfUQHZ) {
const _yVXtRJEK = await _EPYUwSjT(_samfUQHZ);
if (_yVXtRJEK) {
return _rKkEtPbf({ success: false, _kzBgbZvP: "密码已设置,无法重复初始化。" }, 403);
}
const { _yTYaUEYc } = await _WBoBvXUQ.json();
if (!_yTYaUEYc || _yTYaUEYc._xlQSmFSS < 6) {
return _rKkEtPbf({ success: false, _kzBgbZvP: "密码长度不能少于6位。" }, 400);
}
await _yeIJtQKq(_samfUQHZ, _yTYaUEYc);
return _rKkEtPbf({ success: true, _kzBgbZvP: "初始密码设置成功!请刷新页面并登录。" });
}
async function _RzNriKyQ(_WBoBvXUQ, _samfUQHZ) {
const { _CNwdJWPB, _rIAgyWzN } = await _WBoBvXUQ.json();
const _gfXTAmWx = await _EPYUwSjT(_samfUQHZ);
if (_gfXTAmWx !== _CNwdJWPB) {
return _rKkEtPbf({ success: false, _kzBgbZvP: "旧密码错误。" }, 403);
}
if (!_rIAgyWzN || _rIAgyWzN._xlQSmFSS < 6) {
return _rKkEtPbf({ success: false, _kzBgbZvP: "新密码长度不能少于6位。" }, 400);
}
await _yeIJtQKq(_samfUQHZ, _rIAgyWzN);
return _rKkEtPbf({ success: true, _kzBgbZvP: "密码修改成功!" });
}
function _UIXQTXyG() {
return {
theme: 'theme-aurora-glass',
primaryColor: '#00A0FF',
particleColor: '#FFFFFF',
useResolvedDomains: false,
resolvedDomains: '',
sampleSize: 150,
topN: 10,
rttRandomMin: 79,
rttRandomMax: 179,
_nTMcjsQK: '',
api: {
_EICbdOEb: true,
_kzBgbZvP: '维护中...',
},
ispFilter: { _EICbdOEb: true },
geoLocation: {
retries: 1,
filterUnknown: false,
},
streamer: {
_EICbdOEb: true
},
websocketStreamer: {
_EICbdOEb: true,
_hAOyACBH: 'https://snippets.neib.cn'
},
cloudStorage: {
_EICbdOEb: true
},
visitorPassword: {
_EICbdOEb: false,
_yTYaUEYc: '',
},
customSubPath: {
_EICbdOEb: false,
_xkxIMsqp: 'latest',
},
subscriptionId: {
_xlQSmFSS: 8,
_NESIoZam: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'
},
itemLink: {
_EICbdOEb: true,
template: 'vless://{_UuzRiSwA}@{_CovLyHaq}:{_pHhyjphg}?encryption=none&security=tls&sni={_kNbCYthH}&fp=random&_PAwiNaUj=ws&_kNbCYthH={_kNbCYthH}&_xkxIMsqp={_xkxIMsqp}#{_lgMfSDmU}',
selectionMode: 'first',
_umORasTZ: [
{ _lgMfSDmU: '默认配置', _kNbCYthH: '', '_UuzRiSwA': '3b4d4cd8-cb92-4421-bf86-fb51570fc038', _xkxIMsqp: '/?ed=2560' }
],
_MBIpTBty: [],
},
dataFeeds: {
universalFallbackAddress: '',
},
announcement: {
popup: {
_EICbdOEb: false,
_HJNrlnmJ: '',
_SXZWueYv: 5
},
marquee: {
_EICbdOEb: false,
_HJNrlnmJ: ''
}
},
subscriptionUrl: {
prefixEnabled: false,
prefixUrl: '',
suffixEnabled: false,
suffixUrl: ''
},
fineGrained: {
_EICbdOEb: true,
sources: [
{ _EGbPlnPp: 'CF官方IPV4', _swsJMlco: 'https://raw.githubusercontent.com/5yfx/CF_WEB_IP_Worekrs/refs/heads/main/IPV4', _WvWLmLBQ: false, _EICbdOEb: true, _naLArDCM: 20 },
{ _EGbPlnPp: 'CF官方IPV6', _swsJMlco: 'https://raw.githubusercontent.com/5yfx/CF_WEB_IP_Worekrs/refs/heads/main/IPV6', _WvWLmLBQ: false, _EICbdOEb: true, _naLArDCM: 20 },
{ _EGbPlnPp: '反代优选0', _swsJMlco: 'https://wvs.sosorg.nyc.mn/sub?_UuzRiSwA=adb14576-6588-40da-99fd-b9894cd779b0&encryption=none&security=tls&sni=ss.nzvrn.com&_PAwiNaUj=ws&_kNbCYthH=ss.nzvrn.com&_xkxIMsqp=%2Fsnippets%3Fip%3DendpointAddress%3Aport%28443%29%26nat64%3D6to4', _WvWLmLBQ: false, _EICbdOEb: true, _naLArDCM: 30 },
{ _EGbPlnPp: '官方优选1', _swsJMlco: 'https://ipdb.api.030101.xyz/?_PAwiNaUj=bestcf&_txfunSmO=true', _WvWLmLBQ: false, _EICbdOEb: true, _naLArDCM: 10 },
{ _EGbPlnPp: '反代优选2', _swsJMlco: 'https://ipdb.api.030101.xyz/?_PAwiNaUj=bestproxy&_txfunSmO=true', _WvWLmLBQ: false, _EICbdOEb: true, _naLArDCM: 5 },
{ _EGbPlnPp: '官方优选2', _swsJMlco: 'https://addressesapi.090227.xyz/_CovLyHaq.164746.xyz', _WvWLmLBQ: false, _EICbdOEb: true, _naLArDCM: 10 },
{ _EGbPlnPp: '官方优选3', _swsJMlco: 'https://cfxr.eu.org/getSub?_kNbCYthH=snipaste.huggy.qzz.io', _WvWLmLBQ: false, _EICbdOEb: true, _naLArDCM: 5 },
{ _EGbPlnPp: '官方优选4', _swsJMlco: 'https://addressesapi.090227.xyz/CloudFlareYes', _WvWLmLBQ: false, _EICbdOEb: true, _naLArDCM: 10 }
]
},
customNodes: {
_EICbdOEb: 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 _vjFWlxIN(_CNyyWymq, _iGzttOHN) {
if (!_CNyyWymq) return _iGzttOHN;
const _rHTKduSL = { ..._iGzttOHN };
for (const _JWejvvPQ in _iGzttOHN) {
if (_CNyyWymq.hasOwnProperty(_JWejvvPQ)) {
if (typeof _CNyyWymq[_JWejvvPQ] === 'object' && _CNyyWymq[_JWejvvPQ] !== null && !Array.isArray(_CNyyWymq[_JWejvvPQ]) && typeof _iGzttOHN[_JWejvvPQ] === 'object' && _iGzttOHN[_JWejvvPQ] !== null && !Array.isArray(_iGzttOHN[_JWejvvPQ])) {
_rHTKduSL[_JWejvvPQ] = _vjFWlxIN(_CNyyWymq[_JWejvvPQ], _iGzttOHN[_JWejvvPQ]);
} else {
_rHTKduSL[_JWejvvPQ] = _CNyyWymq[_JWejvvPQ];
}
}
}
return _rHTKduSL;
}
async function _iawREvrc(_samfUQHZ) {
try {
const _ACcrvQCN = _samfUQHZ.DB.prepare("SELECT _OSrmevEI FROM kv_data WHERE _JWejvvPQ = ?").bind(_NkTOwMeY);
const { _CdUFdqhE } = await _ACcrvQCN.all();
const _YAnPQCas = _CdUFdqhE._xlQSmFSS > 0 ? _CdUFdqhE[0]._OSrmevEI : null;
const _rEqWFNZD = _YAnPQCas ? JSON.parse(_YAnPQCas) : {};
return _vjFWlxIN(_rEqWFNZD, _UIXQTXyG());
} catch (_NUwPKiAC) {
console.error("无法从D1获取或解析全局配置:", _NUwPKiAC);
return _UIXQTXyG();
}
}
async function _hqyRIyit(_samfUQHZ) {
const _mDXCcgug = await _iawREvrc(_samfUQHZ);
return _rKkEtPbf(_mDXCcgug);
}
async function _OYMEyuwv(_WBoBvXUQ, _samfUQHZ, _LPhWtaBS) {
try {
const { _mDXCcgug, adminPassword } = await _WBoBvXUQ.json();
const _gfXTAmWx = await _EPYUwSjT(_samfUQHZ);
if (_gfXTAmWx !== adminPassword) {
return _rKkEtPbf({ success: false, _kzBgbZvP: "管理员密码错误" }, 403);
}
const _ACcrvQCN = _samfUQHZ.DB.prepare(
"INSERT INTO kv_data (_JWejvvPQ, _OSrmevEI) VALUES (?, ?) ON CONFLICT(_JWejvvPQ) DO UPDATE SET _OSrmevEI = excluded._OSrmevEI"
);
const _ZoaIuATV = _ACcrvQCN.bind(_NkTOwMeY, JSON.stringify(_mDXCcgug)).run();
_LPhWtaBS.waitUntil(_ZoaIuATV);
return _rKkEtPbf({ success: true, _kzBgbZvP: "配置已成功保存!" });
} catch (_NUwPKiAC) {
return _rKkEtPbf({ success: false, _kzBgbZvP: `保存失败: ${_NUwPKiAC._kzBgbZvP}` }, 500);
}
}
async function _MDkAnBPH() {
const _pVgPaPFW = 'https://www.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1&mkt=zh-CN';
try {
const _jGseoVYJ = await fetch(_pVgPaPFW);
const _rnWvTkkQ = await _jGseoVYJ.json();
const _NNDdrLIV = 'https://www.bing.com' + _rnWvTkkQ.images[0]._hAOyACBH;
return fetch(_NNDdrLIV);
} catch (_NUwPKiAC) {
return new Response('获取壁纸失败', { status: 502 });
}
}
async function _HrhYkQdp(_CovLyHaq) {
try {
const _ouBdLylk = await fetch(`http://_CovLyHaq-api.com/json/${_CovLyHaq}?fields=status,_txfunSmO,countryCode,_cZJveYok&lang=zh-CN`);
if (_ouBdLylk.ok) {
const _doqJNITP = await _ouBdLylk.json();
if (_doqJNITP.status === 'success' && (_doqJNITP.countryCode || _doqJNITP._txfunSmO)) {
let _cZJveYok = _doqJNITP._cZJveYok || '未知';
if (_cZJveYok.toLowerCase().includes('cloudflare')) {
_cZJveYok = 'CloudFlare';
}
return {
_EGbPlnPp: _CoYOmLgw[_doqJNITP.countryCode] || _doqJNITP._txfunSmO || _doqJNITP.countryCode,
_cZJveYok: _cZJveYok
};
}
}
} catch (_NUwPKiAC) {}
try {
const _ouBdLylk = await fetch(`https://api._CovLyHaq.sb/geoip/${_CovLyHaq}`);
if (_ouBdLylk.ok) {
const _doqJNITP = await _ouBdLylk.json();
if (_doqJNITP.country_code || _doqJNITP._txfunSmO) {
let _cZJveYok = _doqJNITP._cZJveYok || '未知';
if (_cZJveYok.toLowerCase().includes('cloudflare')) {
_cZJveYok = 'CloudFlare';
}
return {
_EGbPlnPp: _CoYOmLgw[_doqJNITP.country_code] || _doqJNITP._txfunSmO || _doqJNITP.country_code,
_cZJveYok: _cZJveYok
};
}
}
} catch (_NUwPKiAC) {}
return { _EGbPlnPp: '未知', _cZJveYok: '未知' };
}
async function _EMLlTOCm(_WBoBvXUQ, _samfUQHZ) {
try {
const { _swsJMlco } = await _WBoBvXUQ.json();
if (!Array.isArray(_swsJMlco)) {
return _rKkEtPbf({ error: "输入无效,需要一个IP数组。" }, 400);
}
const _QjdmZRmb = _swsJMlco.map(_CovLyHaq => _HrhYkQdp(_CovLyHaq).then(_ODAlmwVo => ({ _CovLyHaq, ..._ODAlmwVo })));
const _CdUFdqhE = await Promise.all(_QjdmZRmb);
return _rKkEtPbf(_CdUFdqhE);
} catch (_NUwPKiAC) {
return _rKkEtPbf({ error: `获取地理位置失败: ${_NUwPKiAC._kzBgbZvP}` }, 500);
}
}
async function _SNlyrniq(_WBoBvXUQ, _samfUQHZ) {
const _mDXCcgug = await _iawREvrc(_samfUQHZ);
if (!_mDXCcgug.cloudStorage._EICbdOEb) {
return _rKkEtPbf({ _CdUFdqhE: [], generatedBy: null });
}
try {
const _ACcrvQCN = _samfUQHZ.DB.prepare("SELECT _OSrmevEI FROM kv_data WHERE _JWejvvPQ = ?").bind(_aWIuXolF);
const { _CdUFdqhE } = await _ACcrvQCN.all();
const _zuPYXhvb = _CdUFdqhE._xlQSmFSS > 0 ? _CdUFdqhE[0]._OSrmevEI : null;
const _CwOmWuKd = _zuPYXhvb ? JSON.parse(_zuPYXhvb) : null;
return _rKkEtPbf(_CwOmWuKd || { _CdUFdqhE: [], generatedBy: null });
} catch (_NUwPKiAC) {
console.error("从D1读取缓存IP失败:", _NUwPKiAC);
return _rKkEtPbf({ _CdUFdqhE: [], generatedBy: null });
}
}
async function _hKcRodft(_WBoBvXUQ, _samfUQHZ, _LPhWtaBS) {
const _mDXCcgug = await _iawREvrc(_samfUQHZ);
if (!_mDXCcgug.cloudStorage._EICbdOEb) {
return _rKkEtPbf({ success: true, _kzBgbZvP: "云端存储已禁用,不保存结果。" });
}
const _GrhWtmlP = _WBoBvXUQ._kzgWJgEg.get('CF-Connecting-IP') || "未知IP";
const _txfunSmO = _WBoBvXUQ.cf?._txfunSmO || "未知";
const _rhJAQpyo = _WBoBvXUQ.cf?._rhJAQpyo || "";
let _ACRqfkjb = _CoYOmLgw[_txfunSmO] || _txfunSmO;
if (_rhJAQpyo && _rhJAQpyo !== "未知城市" && _rhJAQpyo !== _txfunSmO) _ACRqfkjb = `${_ACRqfkjb} ${_CoYOmLgw[_rhJAQpyo] || _rhJAQpyo}`;
const _vhdcxxzo = {
_CovLyHaq: _HbUYpvDe(_GrhWtmlP),
_EGbPlnPp: _ACRqfkjb.trim(),
time: _zhyMuIfp()
};
try {
const _KdvSYOzz = await _WBoBvXUQ.json();
if (!Array.isArray(_KdvSYOzz)) return _rKkEtPbf({ error: "无效数据格式" }, 400);
const _lmtXFIbK = _KdvSYOzz.map(_FNHtVGZm => ({
_CovLyHaq: String(_FNHtVGZm._CovLyHaq || ''),
_pHhyjphg: _FNHtVGZm._pHhyjphg ? parseInt(_FNHtVGZm._pHhyjphg, 10) : undefined,
_YslWLwYh: parseInt(_FNHtVGZm._YslWLwYh, 10),
_EGbPlnPp: typeof _FNHtVGZm._EGbPlnPp === 'string' ? _FNHtVGZm._EGbPlnPp.substring(0, 50) : 'N/A',
_cZJveYok: typeof _FNHtVGZm._cZJveYok === 'string' ? _FNHtVGZm._cZJveYok.substring(0, 100) : 'N/A'
}));
const _wpzHCkSO = {
generatedBy: _vhdcxxzo,
_CdUFdqhE: _lmtXFIbK
};
const _ersLsukQ = _samfUQHZ.DB.prepare(
"INSERT INTO kv_data (_JWejvvPQ, _OSrmevEI) VALUES (?, ?) ON CONFLICT(_JWejvvPQ) DO UPDATE SET _OSrmevEI = excluded._OSrmevEI"
).bind(_aWIuXolF, JSON.stringify(_wpzHCkSO)).run();
if (_mDXCcgug.telegram.bot_token && _mDXCcgug.telegram.chat_id) {
const _jVLrUYmL = _lmtXFIbK.map(r => `${r._CovLyHaq} ~ ${r._EGbPlnPp}`).join('\n');
const _vvzvcafZ = `优选完成!\n来源: ${_vhdcxxzo._CovLyHaq} (${_vhdcxxzo._EGbPlnPp})\n时间: ${_vhdcxxzo.time}\n\n结果:\n${_jVLrUYmL}`;
const _pimLfODZ = `https://api.telegram.org/bot${_mDXCcgug.telegram.bot_token}/sendMessage?chat_id=${_mDXCcgug.telegram.chat_id}&_HJNrlnmJ=${encodeURIComponent(_vvzvcafZ)}`;
const _cqGalzxs = fetch(_pimLfODZ).catch(_NUwPKiAC => console.error("Telegram结果通知失败:", _NUwPKiAC));
_LPhWtaBS.waitUntil(Promise.all([_ersLsukQ, _cqGalzxs]));
} else {
_LPhWtaBS.waitUntil(_ersLsukQ);
}
return _rKkEtPbf({ success: true, _kzBgbZvP: "结果已保存" });
} catch (_NUwPKiAC) {
return _rKkEtPbf({ error: "D1写入失败", _kzBgbZvP: _NUwPKiAC._kzBgbZvP }, 500);
}
}
async function _KsPoQARG(_WBoBvXUQ, _samfUQHZ, _LPhWtaBS) {
try {
const _amhSGmyo = await _WBoBvXUQ.json();
if (!Array.isArray(_amhSGmyo)) return _rKkEtPbf({ error: "无效数据格式" }, 400);
const _wpzHCkSO = {
_CdUFdqhE: _amhSGmyo
};
const _ACcrvQCN = _samfUQHZ.DB.prepare(
"INSERT INTO kv_data (_JWejvvPQ, _OSrmevEI) VALUES (?, ?) ON CONFLICT(_JWejvvPQ) DO UPDATE SET _OSrmevEI = excluded._OSrmevEI"
);
const _ZoaIuATV = _ACcrvQCN.bind(_KAvuJXTh, JSON.stringify(_wpzHCkSO)).run();
_LPhWtaBS.waitUntil(_ZoaIuATV);
return _rKkEtPbf({ success: true });
} catch (_NUwPKiAC) {
return _rKkEtPbf({ error: "D1写入临时缓存失败", _kzBgbZvP: _NUwPKiAC._kzBgbZvP }, 500);
}
}
function _XhqNvSQQ(_xlQSmFSS, _NESIoZam) {
let _mgWwbeuN = '';
const _RStEbhtm = _NESIoZam._xlQSmFSS;
for (let _FxtYvbgs = 0; _FxtYvbgs < _xlQSmFSS; _FxtYvbgs++) {
_mgWwbeuN += _NESIoZam.charAt(Math.floor(Math.random() * _RStEbhtm));
}
return _mgWwbeuN;
}
async function _NbTHmCAo(_WBoBvXUQ, _samfUQHZ) {
try {
const _KdvSYOzz = await _WBoBvXUQ.json();
if (!Array.isArray(_KdvSYOzz) || _KdvSYOzz._xlQSmFSS === 0) {
return _rKkEtPbf({ error: "无效或空的IP列表" }, 400);
}
const _mDXCcgug = await _iawREvrc(_samfUQHZ);
const _tUJnReLE = _mDXCcgug.subscriptionId || { _xlQSmFSS: 8, _NESIoZam: 'abcdefghijklmnopqrstuvwxyz0123456789' };
let _MKeregBx;
let _tYGrxVFq = false;
let _BttKvHPM = 0;
const _YlBWhGxM = 10;
while (!_tYGrxVFq && _BttKvHPM < _YlBWhGxM) {
_MKeregBx = _XhqNvSQQ(_tUJnReLE._xlQSmFSS, _tUJnReLE._NESIoZam);
const { _CdUFdqhE } = await _samfUQHZ.DB.prepare("SELECT _qUySIauG FROM optimized_results WHERE _qUySIauG = ?").bind(_MKeregBx).all();
if (_CdUFdqhE._xlQSmFSS === 0) {
_tYGrxVFq = true;
}
_BttKvHPM++;
}
if (!_tYGrxVFq) {
return _rKkEtPbf({ error: "无法生成唯一的订阅ID,请稍后重试或调整ID设置。" }, 500);
}
const _YhxisIQz = JSON.stringify({ _swsJMlco: _KdvSYOzz });
await _samfUQHZ.DB.prepare(
"INSERT INTO optimized_results (_qUySIauG, _doqJNITP) VALUES (?, ?)"
).bind(_MKeregBx, _YhxisIQz).run();
await _samfUQHZ.DB.prepare(
"INSERT INTO kv_data (_JWejvvPQ, _OSrmevEI) VALUES (?, ?) ON CONFLICT(_JWejvvPQ) DO UPDATE SET _OSrmevEI = excluded._OSrmevEI"
).bind(_oHzqeNSQ, _MKeregBx).run();
return _rKkEtPbf({ success: true, _qUySIauG: _MKeregBx });
} catch (_NUwPKiAC) {
return _rKkEtPbf({ error: "保存优选结果失败", _kzBgbZvP: _NUwPKiAC._kzBgbZvP }, 500);
}
}
async function _fQvVpJzV(_WBoBvXUQ, _samfUQHZ) {
try {
const _MKeregBx = _WBoBvXUQ._QzBnPtZy._qUySIauG;
if (!_MKeregBx) {
return new Response("缺少结果ID", { status: 400 });
}
const _mgWwbeuN = await _samfUQHZ.DB.prepare("SELECT _doqJNITP FROM optimized_results WHERE _qUySIauG = ?").bind(_MKeregBx).first();
if (!_mgWwbeuN) {
return new Response("未找到对应的优选结果", { status: 404 });
}
const _doqJNITP = JSON.parse(_mgWwbeuN._doqJNITP);
let _jVLrUYmL = _doqJNITP._swsJMlco;
const _mDXCcgug = await _iawREvrc(_samfUQHZ);
if (_mDXCcgug.customNodes && _mDXCcgug.customNodes._EICbdOEb && _mDXCcgug.customNodes.list) {
const _HgWgMrCx = _mDXCcgug.customNodes.list.trim().split(/\s+/).filter(Boolean);
const _AKpfkzLR = _HgWgMrCx.map(_AMbDwuas => {
let _pLZuGTHG = _AMbDwuas;
let _pHhyjphg = undefined;
let _lgMfSDmU = null;
if (_pLZuGTHG.includes('@')) {
const _BoRVqaMv = _pLZuGTHG.split('@');
_lgMfSDmU = _BoRVqaMv.pop();
_pLZuGTHG = _BoRVqaMv.join('@');
}
if (_pLZuGTHG.includes('#')) {
const _BoRVqaMv = _pLZuGTHG.split('#');
const _jwSdRmvx = _BoRVqaMv.pop();
if (!isNaN(_jwSdRmvx) && _jwSdRmvx.trim() !== '') {
_pHhyjphg = parseInt(_jwSdRmvx, 10);
}
_pLZuGTHG = _BoRVqaMv.join('#');
}
return {
_CovLyHaq: _pLZuGTHG,
_pHhyjphg: _pHhyjphg,
_EGbPlnPp: _lgMfSDmU || _pLZuGTHG,
_cZJveYok: '自定义'
};
});
_jVLrUYmL.unshift(..._AKpfkzLR);
}
const { itemLink } = _mDXCcgug;
const _tkCMwLeZ = new URL(_WBoBvXUQ._hAOyACBH)._nlGCZlTv;
let _Kdllscwu;
if (_mDXCcgug.websocketStreamer && _mDXCcgug.websocketStreamer._EICbdOEb) {
if (!itemLink || !itemLink._EICbdOEb || !itemLink._umORasTZ || itemLink._umORasTZ._xlQSmFSS === 0) {
return new Response("节点链接参数未配置或未启用 (反代模式)", { status: 500 });
}
_Kdllscwu = _jVLrUYmL.map((_FNHtVGZm, _lJjuwRfg) => {
let _lgMfSDmU;
if (_FNHtVGZm._cZJveYok === '自定义') {
_lgMfSDmU = `${_lJjuwRfg + 1} - ${_FNHtVGZm._EGbPlnPp}`;
} else {
_lgMfSDmU = `${_lJjuwRfg + 1} - ${_FNHtVGZm._EGbPlnPp || '未知'}`;
if (!_FNHtVGZm._cZJveYok || !_FNHtVGZm._cZJveYok.toLowerCase().includes('cloudflare')) {
_lgMfSDmU += '(反代)';
}
}
const _YBagzNAE = _ipYFRPID.isIPv6(_FNHtVGZm._CovLyHaq) ? `[${_FNHtVGZm._CovLyHaq}]` : _FNHtVGZm._CovLyHaq;
const _pHhyjphg = _FNHtVGZm._pHhyjphg || 443;
const _DLpRAFcg = itemLink._umORasTZ[0];
const _zLhoRJEH = _DLpRAFcg._UuzRiSwA || '';
const _UuzRiSwA = (_zLhoRJEH && _GzHdifSE(_zLhoRJEH)) ? _zLhoRJEH : crypto.randomUUID();
const _xkxIMsqp = '/snippets?_CovLyHaq=endpointAddress:_pHhyjphg(443)&nat64=6to4';
const _kNbCYthH = _DLpRAFcg._kNbCYthH || _tkCMwLeZ;
const _QzBnPtZy = new URLSearchParams({
security: 'tls',
_PAwiNaUj: 'ws',
_kNbCYthH: _kNbCYthH,
sni: _kNbCYthH,
fp: 'random'
});
return `vless://${_UuzRiSwA}@${_YBagzNAE}:${_pHhyjphg}?${_QzBnPtZy.toString()}&_xkxIMsqp=${encodeURIComponent(encodeURIComponent(_xkxIMsqp))}#${encodeURIComponent(_lgMfSDmU)}`;
});
} else {
if (!itemLink || !itemLink._EICbdOEb || !itemLink._umORasTZ || itemLink._umORasTZ._xlQSmFSS === 0) {
return new Response("节点链接参数未配置或未启用", { status: 500 });
}
const _DLpRAFcg = itemLink._umORasTZ[0];
const { _kNbCYthH, _UuzRiSwA, _xkxIMsqp } = _DLpRAFcg;
_Kdllscwu = _jVLrUYmL.map((_FNHtVGZm, _lJjuwRfg) => {
let _lgMfSDmU;
if (_FNHtVGZm._cZJveYok === '自定义') {
_lgMfSDmU = `${_lJjuwRfg + 1} - ${_FNHtVGZm._EGbPlnPp}`;
} else {
_lgMfSDmU = `${_lJjuwRfg + 1} - ${_FNHtVGZm._EGbPlnPp || '未知'}`;
if (!_FNHtVGZm._cZJveYok || !_FNHtVGZm._cZJveYok.toLowerCase().includes('cloudflare')) {
_lgMfSDmU += '(反代)';
}
}
const _YBagzNAE = _ipYFRPID.isIPv6(_FNHtVGZm._CovLyHaq) ? `[${_FNHtVGZm._CovLyHaq}]` : _FNHtVGZm._CovLyHaq;
const _pHhyjphg = _FNHtVGZm._pHhyjphg || 443;
const _QzBnPtZy = new URLSearchParams({
security: 'tls',
_PAwiNaUj: 'ws',
_kNbCYthH: _kNbCYthH || _tkCMwLeZ,
sni: _kNbCYthH || _tkCMwLeZ,
fp: 'random'
});
return `vless://${_UuzRiSwA}@${_YBagzNAE}:${_pHhyjphg}?${_QzBnPtZy.toString()}&_xkxIMsqp=${encodeURIComponent(encodeURIComponent(_xkxIMsqp || ''))}#${encodeURIComponent(_lgMfSDmU)}`;
});
}
const _NRykPgDu = _Kdllscwu.join('\n');
const _HsflPrId = btoa(_NRykPgDu);
return new Response(_HsflPrId, {
_kzgWJgEg: { 'Content-Type': '_HJNrlnmJ/plain; _NESIoZam=utf-8' }
});
} catch (_NUwPKiAC) {
return new Response(`生成节点列表失败: ${_NUwPKiAC._kzBgbZvP}`, { status: 500 });
}
}
async function _lKGkXzuS(_WBoBvXUQ) {
try {
const { _QZheLkfQ, _PAwiNaUj } = await _WBoBvXUQ.json();
if (!Array.isArray(_QZheLkfQ)) {
return new Response('Invalid _QZheLkfQ list', { status: 400 });
}
const _ARCvFsVR = _QZheLkfQ.map(domain => {
if (!domain.trim()) return Promise.resolve([]);
const _hAOyACBH = `https://cloudflare-dns.com/dns-query?_lgMfSDmU=${encodeURIComponent(domain.trim())}&_PAwiNaUj=${_PAwiNaUj || 'A'}`;
return fetch(_hAOyACBH, { _kzgWJgEg: { 'Accept': 'application/dns-json' } })
.then(_ouBdLylk => _ouBdLylk.json())
.then(_doqJNITP => (_doqJNITP.Answer ? _doqJNITP.Answer.map(a => a._doqJNITP) : []))
.catch(() => []);
});
const _joGZsrAu = (await Promise.all(_ARCvFsVR)).flat();
const _HyBizlzD = [...new Set(_joGZsrAu)];
if (_HyBizlzD._xlQSmFSS === 0) {
return new Response('无法从域名解析出任何IP。', { status: 500 });
}
return new Response(_HyBizlzD.join('\n'), { _kzgWJgEg: { 'Content-Type': '_HJNrlnmJ/plain; _NESIoZam=utf-8' } });
} catch (err) {
return new Response(`域名解析错误: ${err._kzBgbZvP}`, { status: 500 });
}
}
async function _tPrpYFQf(_WBoBvXUQ, _samfUQHZ) {
try {
const { _nXkCwhGK } = await _WBoBvXUQ.json();
if (!Array.isArray(_nXkCwhGK)) {
return _rKkEtPbf({ error: "Invalid input, expected an object with a '_nXkCwhGK' array." }, 400);
}
const _cFnXsaoO = new Set();
const _vVBzWXMB = _nXkCwhGK.map(_hAOyACBH =>
_SYBjyywq(_hAOyACBH)
.then(_HJNrlnmJ => {
if (!_HJNrlnmJ) return;
const _xIrhlqvj = _HJNrlnmJ.split(/[\s,;|]+/);
for (const _otSPUMVd of _xIrhlqvj) {
const _OyFKYrZA = _otSPUMVd.trim();
if (_OyFKYrZA) {
_cFnXsaoO.add(_OyFKYrZA);
}
}
})
.catch(err => {
console.error(`Error processing URL ${_hAOyACBH}:`, err);
})
);
await Promise.all(_vVBzWXMB);
return _rKkEtPbf({ _swsJMlco: Array.from(_cFnXsaoO) });
} catch (_NUwPKiAC) {
return _rKkEtPbf({ error: `Failed to process URLs: ${_NUwPKiAC._kzBgbZvP}` }, 500);
}
}
async function _PntJPFat(_WBoBvXUQ, _samfUQHZ) {
const _mDXCcgug = await _iawREvrc(_samfUQHZ);
if (!_mDXCcgug.api._EICbdOEb) {
return new Response(_mDXCcgug.api._kzBgbZvP || 'API is disabled.', { status: 503 });
}
try {
const _ACcrvQCN = _samfUQHZ.DB.prepare("SELECT _OSrmevEI FROM kv_data WHERE _JWejvvPQ = ?").bind(_aWIuXolF);
const { _CdUFdqhE: dbResults } = await _ACcrvQCN.all();
const _zuPYXhvb = dbResults._xlQSmFSS > 0 ? dbResults[0]._OSrmevEI : null;
const _CwOmWuKd = _zuPYXhvb ? JSON.parse(_zuPYXhvb) : null;
if (!_CwOmWuKd || !_CwOmWuKd._CdUFdqhE || _CwOmWuKd._CdUFdqhE._xlQSmFSS === 0) {
return new Response("上次优选结果为空。", {
status: 404,
_kzgWJgEg: { 'Content-Type': '_HJNrlnmJ/plain; _NESIoZam=utf-8' },
});
}
const _swsJMlco = _CwOmWuKd._CdUFdqhE.map(r => r._CovLyHaq);
return new Response(_swsJMlco.join('\n'), {
_kzgWJgEg: { 'Content-Type': '_HJNrlnmJ/plain; _NESIoZam=utf-8' },
});
} catch (_NUwPKiAC) {
console.error("API /_CovLyHaq 处理错误:", _NUwPKiAC);
return new Response(`API处理时出错: ${_NUwPKiAC._kzBgbZvP}`, { status: 500 });
}
}
function _nTYdHIdj(_mgWwbeuN, _lJjuwRfg, _mDXCcgug, _tkCMwLeZ) {
const { itemLink } = _mDXCcgug;
if (!itemLink || !itemLink._EICbdOEb) return null;
const { template, _umORasTZ, selectionMode, _MBIpTBty } = itemLink;
if (!_umORasTZ || _umORasTZ._xlQSmFSS === 0) return null;
let _zZusybuP;
if (selectionMode === 'random') {
_zZusybuP = _umORasTZ[_lJjuwRfg % _umORasTZ._xlQSmFSS];
} else if (selectionMode === 'first') {
_zZusybuP = _umORasTZ[0];
} else {
_zZusybuP = _umORasTZ.find(s => s._lgMfSDmU === selectionMode) || _umORasTZ[0];
}
if (!_zZusybuP) return null;
let _sUTZwxUd = template;
const _amYxgKLr = _mgWwbeuN._pHhyjphg || 443;
const _PKLQsHCi = _ipYFRPID.isIPv6(_mgWwbeuN._CovLyHaq) ? `[${_mgWwbeuN._CovLyHaq}]` : _mgWwbeuN._CovLyHaq;
let _lgMfSDmU = `${_lJjuwRfg + 1} 、 ${_mgWwbeuN._EGbPlnPp || '未知'}`;
if (!_mgWwbeuN._cZJveYok || !_mgWwbeuN._cZJveYok.toLowerCase().includes('cloudflare')) {
_lgMfSDmU += '(反代)';
}
let _kNbCYthH = _zZusybuP._kNbCYthH || _tkCMwLeZ;
_sUTZwxUd = _sUTZwxUd.replace(/{_CovLyHaq}/g, _PKLQsHCi)
.replace(/{_pHhyjphg}/g, _amYxgKLr)
.replace(/{_lgMfSDmU}/g, encodeURIComponent(_lgMfSDmU))
.replace(/{rank}/g, _lJjuwRfg + 1)
.replace(/{_EGbPlnPp}/g, encodeURIComponent(_mgWwbeuN._EGbPlnPp || '未知'))
.replace(/{_cZJveYok}/g, encodeURIComponent(_mgWwbeuN._cZJveYok || '未知'))
.replace(/{_kNbCYthH}/g, encodeURIComponent(_kNbCYthH))
.replace(/{_UuzRiSwA}/g, encodeURIComponent(_zZusybuP['_UuzRiSwA'] || ''))
.replace(/{_xkxIMsqp}/g, encodeURIComponent(encodeURIComponent(_zZusybuP._xkxIMsqp || '')));
if (_MBIpTBty) {
_MBIpTBty.forEach(field => {
const _CFHOHOAU = new RegExp('{' + field._lgMfSDmU + '}', 'g');
_sUTZwxUd = _sUTZwxUd.replace(_CFHOHOAU, encodeURIComponent(field._OSrmevEI));
});
}
return _sUTZwxUd;
}
async function _XkwebnqW(_WBoBvXUQ, _samfUQHZ) {
const _mDXCcgug = await _iawREvrc(_samfUQHZ);
if (!_mDXCcgug.itemLink._EICbdOEb) {
return new Response("Item _sUTZwxUd feature is disabled.", { status: 503, _kzgWJgEg: { 'Content-Type': '_HJNrlnmJ/plain; _NESIoZam=utf-8' } });
}
try {
const _ACcrvQCN = _samfUQHZ.DB.prepare("SELECT _OSrmevEI FROM kv_data WHERE _JWejvvPQ = ?").bind(_aWIuXolF);
const { _CdUFdqhE: dbResults } = await _ACcrvQCN.all();
const _zuPYXhvb = dbResults._xlQSmFSS > 0 ? dbResults[0]._OSrmevEI : null;
const _CwOmWuKd = _zuPYXhvb ? JSON.parse(_zuPYXhvb) : null;
if (!_CwOmWuKd || !_CwOmWuKd._CdUFdqhE || _CwOmWuKd._CdUFdqhE._xlQSmFSS === 0) {
return new Response("No optimized IPs available to generate endpoints.", {
status: 404,
_kzgWJgEg: { 'Content-Type': '_HJNrlnmJ/plain; _NESIoZam=utf-8' },
});
}
const _tkCMwLeZ = new URL(_WBoBvXUQ._hAOyACBH)._nlGCZlTv;
const _nIDBUUSq = _CwOmWuKd._CdUFdqhE.map((_mgWwbeuN, _lJjuwRfg) => {
return _nTYdHIdj(_mgWwbeuN, _lJjuwRfg, _mDXCcgug, _tkCMwLeZ);
}).filter(Boolean);
if (_nIDBUUSq._xlQSmFSS === 0) {
return new Response("Could not generate any _FNHtVGZm links from the available IPs.", {
status: 500,
_kzgWJgEg: { 'Content-Type': '_HJNrlnmJ/plain; _NESIoZam=utf-8' },
});
}
return new Response(_nIDBUUSq.join('\n'), {
_kzgWJgEg: { 'Content-Type': '_HJNrlnmJ/plain; _NESIoZam=utf-8' },
});
} catch (_NUwPKiAC) {
console.error("API /api/endpoints error:", _NUwPKiAC);
return new Response(`Error processing API _WBoBvXUQ: ${_NUwPKiAC._kzBgbZvP}`, { status: 500 });
}
}
async function _xCQjnjBy(_WBoBvXUQ, _samfUQHZ, _LPhWtaBS) {
const _GrhWtmlP = _WBoBvXUQ._kzgWJgEg.get('CF-Connecting-IP') || "未知IP";
const [
_ZzbzIlCI,
_xoEVYCcI,
defaultDomains,
fetchedCountryMap
] = await Promise.all([
_fYeVguRn(_XrMhJIHQ, _wANXxapn, []),
_fYeVguRn(_hUdCtLjZ, _wANXxapn, []),
_fYeVguRn(_YnAiTEhT, _OwEJokXZ, []),
_fYeVguRn(_nlVdDGjL, _JAxzpTnT, { "N/A": "未知" })
]);
_CoYOmLgw = fetchedCountryMap;
let _AFokUlvx = false;
let _qogoNvTu;
try {
const _yTYaUEYc = await _EPYUwSjT(_samfUQHZ);
_AFokUlvx = !!_yTYaUEYc;
_qogoNvTu = await _iawREvrc(_samfUQHZ);
} catch (_NUwPKiAC) {
if (_NUwPKiAC._kzBgbZvP && _NUwPKiAC._kzBgbZvP.includes('no such table')) {
console.log("检测到 'kv_data' 表不存在,正在自动创建...");
try {
const _PSYdijrh = "CREATE TABLE IF NOT EXISTS kv_data (_JWejvvPQ TEXT PRIMARY KEY, _OSrmevEI TEXT); CREATE TABLE IF NOT EXISTS optimized_results (_qUySIauG TEXT PRIMARY KEY, _doqJNITP TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP);";
await _samfUQHZ.DB.exec(_PSYdijrh);
console.log("数据表创建成功。");
_AFokUlvx = false;
_qogoNvTu = _UIXQTXyG();
} catch (dbError) {
console.error("自动创建数据表失败:", dbError);
return new Response(`数据库初始化失败: ${dbError._kzBgbZvP}`, {
status: 500,
_kzgWJgEg: { 'Content-Type': '_HJNrlnmJ/html;_NESIoZam=UTF-8' }
});
}
} else {
let _XhQgWhSd = _OkYpXccH(_NUwPKiAC._kzBgbZvP);
return new Response(_XhQgWhSd, { _kzgWJgEg: { 'Content-Type': '_HJNrlnmJ/html;_NESIoZam=UTF-8' } });
}
}
if (_qogoNvTu.telegram.bot_token && _qogoNvTu.telegram.chat_id) {
const _txfunSmO = _WBoBvXUQ.cf?._txfunSmO || "未知";
const _rhJAQpyo = _WBoBvXUQ.cf?._rhJAQpyo || "";
let _ACRqfkjb = _CoYOmLgw[_txfunSmO] || _txfunSmO;
if (_rhJAQpyo && _rhJAQpyo !== "未知城市" && _rhJAQpyo !== _txfunSmO) _ACRqfkjb = `${_ACRqfkjb} ${_CoYOmLgw[_rhJAQpyo] || _rhJAQpyo}`;
const _vEXWsGAl = _zhyMuIfp();
const _HEjbcYMj = _WBoBvXUQ._hAOyACBH;
const _vvzvcafZ = `访客: ${_GrhWtmlP}\n位置: ${_ACRqfkjb.trim()}\n时间: ${_vEXWsGAl}\n来自:${_HEjbcYMj}`;
const _pimLfODZ = `https://api.telegram.org/bot${_qogoNvTu.telegram.bot_token}/sendMessage?chat_id=${_qogoNvTu.telegram.chat_id}&_HJNrlnmJ=${encodeURIComponent(_vvzvcafZ)}`;
_LPhWtaBS.waitUntil(fetch(_pimLfODZ).catch(_NUwPKiAC => console.error("Telegram通知失败:", _NUwPKiAC)));
}
let _CRZfunDb = _ACaocWgp();
const _jZFYaokZ = {
_mDXCcgug: _qogoNvTu,
status: {
_AFokUlvx: _AFokUlvx,
}
};
_CRZfunDb = _CRZfunDb.replace('__PAGE_DATA_JSON__', JSON.stringify(_jZFYaokZ));
_CRZfunDb = _CRZfunDb.replace('__ALL_CF_CIDR_LIST_JSON__', JSON.stringify(_ZzbzIlCI));
_CRZfunDb = _CRZfunDb.replace('__BALANCED_CF_CIDR_LIST_JSON__', JSON.stringify(_xoEVYCcI));
_CRZfunDb = _CRZfunDb.replace('__DEFAULT_DOMAINS_LIST_JSON__', JSON.stringify(defaultDomains));
_CRZfunDb = _CRZfunDb.replace('__COUNTRY_MAP_JSON__', JSON.stringify(_CoYOmLgw));
return new Response(_CRZfunDb, {
_kzgWJgEg: { 'Content-Type': '_HJNrlnmJ/html;_NESIoZam=UTF-8' },
});
}
function _rKkEtPbf(_fAGjBqRJ, status = 200, _kzgWJgEg = {}) {
return new Response(JSON.stringify(_fAGjBqRJ), {
status,
_kzgWJgEg: { 'Content-Type': 'application/json;_NESIoZam=UTF-8', ..._kzgWJgEg }
});
}
function _zhyMuIfp(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 _HbUYpvDe(_CovLyHaq) {
if (!_CovLyHaq || typeof _CovLyHaq !== 'string') return "无效IP";
if(_ipYFRPID.isIPv4(_CovLyHaq)){
const _BoRVqaMv = _CovLyHaq.split('.');
if (_BoRVqaMv._xlQSmFSS === 4) return `${_BoRVqaMv[0]}.*.*.${_BoRVqaMv[3]}`;
}
if(_ipYFRPID.isIPv6(_CovLyHaq)){
const _BoRVqaMv = _CovLyHaq.split(':');
if (_BoRVqaMv._xlQSmFSS > 2) return `${_BoRVqaMv[0]}:...:${_BoRVqaMv[_BoRVqaMv._xlQSmFSS - 1]}`;
}
return _CovLyHaq;
}
function _OkYpXccH(_oLNVgwJo) {
return `
<!DOCTYPE html><html lang="zh-CN"><head><meta _NESIoZam="UTF-8"><title>需要设置</title>
<_mrzbKyEh>
_fAGjBqRJ { font-family: sans-serif; background: #1a1a1a; _adDtSJTJ: #e0e0e0; display: flex; justify-_BFizQQrx: center; align-items: center; height: 100vh; margin: 0; }
._FvmJQUrq { max-_BMIuuYeD: 800px; padding: 2rem; background: #25282e; border: 1px solid #4044c; border-radius: 8px; box-shadow: 0 5px 15px rgba(0,0,0,0.3); }
h1 { _adDtSJTJ: #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 { _adDtSJTJ: #da3633; background: rgba(218, 54, 51, 0.1); padding: 0.5rem; border-radius: 4px; margin-_UfJLSRIK: 1rem; }
</_mrzbKyEh>
</head><_fAGjBqRJ>
<div class="_FvmJQUrq">
<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>
${_oLNVgwJo ? `<div class="error"><strong>当前错误信息:</strong> ${_oLNVgwJo.replace(/</g, "<").replace(/>/g, ">")}</div>` : ''}
</div>
</_fAGjBqRJ></html>`;
}
function _ACaocWgp() {
return `
<!DOCTYPE html><html lang="zh-CN"><head> <meta _NESIoZam="UTF-8"> <meta _lgMfSDmU="viewport" _BFizQQrx="_BMIuuYeD=device-_BMIuuYeD, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"> <title>Cloudflare IP</title> <_sUTZwxUd 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>
<_mrzbKyEh>
:root { --primary-_adDtSJTJ: #00A0FF; --primary-hover: #007ACC; --primary-gradient-start: #00C6FF; --primary-gradient-end: #0072FF; --secondary-_adDtSJTJ: #8c939d; --light-bg: #1A1C20; --_BFizQQrx-bg: #25282E; --border-_adDtSJTJ: #40444C; --_HJNrlnmJ-_adDtSJTJ: #E0E0E0; --_HJNrlnmJ-light: #B0B0B0; --success-_adDtSJTJ: #30A46C; --danger-_adDtSJTJ: #DA3633; --warning-_adDtSJTJ: #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; }
_fAGjBqRJ { font-family: var(--font-family-sans); background-_adDtSJTJ: var(--light-bg); _adDtSJTJ: var(--_HJNrlnmJ-_adDtSJTJ); line-height: 1.65; overflow-x: hidden; padding: 0; position:relative; transition: background-_adDtSJTJ 0.5s ease; background-size: cover; background-position: center; background-attachment: fixed; }
#background-_NvmRKmUf { position: fixed; _UfJLSRIK: 0; _KhHOxqCY: 0; _BMIuuYeD: 100%; height: 100%; z-_lJjuwRfg: -1; display: none; }
._CIghEbXt-_FvmJQUrq { max-_BMIuuYeD: 1100px; margin: 0 auto; padding: 0 1rem; position: relative; z-_lJjuwRfg: 1; }
#_OOqTXkej { position: fixed; _UfJLSRIK: 1rem; right: 1rem; font-size: 0.85em; padding: 0.4em 0.8em; z-_lJjuwRfg: 10; }
#marquee-_FvmJQUrq { overflow: hidden; white-space: nowrap; background-_adDtSJTJ: rgba(37, 40, 46, 0.6); backdrop-filter: blur(5px); _adDtSJTJ: var(--primary-_adDtSJTJ); padding: 0.5rem 0; margin-_UfJLSRIK: 1rem; border-radius: var(--border-radius-sm); display: none; }
#marquee-_HJNrlnmJ { display: inline-block; padding-_KhHOxqCY: 100%; animation: marquee-scroll 20s linear infinite; }
@keyframes marquee-scroll { 0% { transform: translateX(0); } 100% { transform: translateX(-100%); } }
_CGabxIdD { _HJNrlnmJ-align: center; margin-_UfJLSRIK: 1rem; margin-bottom: 2rem; }
_CGabxIdD h1 { white-space: pre-wrap; font-size: 2.25em; _adDtSJTJ: var(--primary-_adDtSJTJ); font-weight: 700; _HJNrlnmJ-shadow: 0 0 10px rgba(var(--primary-_adDtSJTJ-rgb), 0.3); }
.card { background-_adDtSJTJ: 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-_adDtSJTJ); }
.progress-section #_shRHgKXz { _BMIuuYeD: 100%; height: 0.75rem; border-radius: var(--border-radius-sm); appearance: none; -webkit-appearance: none; background-_adDtSJTJ: var(--border-_adDtSJTJ); overflow: hidden; }
.progress-section #_shRHgKXz::-webkit-progress-_OSrmevEI { background: linear-gradient(90deg, var(--primary-gradient-start), var(--primary-gradient-end)); }
.progress-section #status { _HJNrlnmJ-align: center; margin-_UfJLSRIK: 0.75em; font-size: 0.95em; _adDtSJTJ: var(--_HJNrlnmJ-light); min-height: 1.5em; }
.section-_CGabxIdD { display: flex; flex-wrap: wrap; justify-_BFizQQrx: space-between; align-items: center; margin-bottom: 1rem; padding-bottom: 0.75rem; border-bottom: 1px solid var(--border-_adDtSJTJ); gap: 1rem; }
.section-_CGabxIdD h2 { font-size: 1.6em; font-weight: 600; margin:0; }
.generator-info { font-size: 0.85em; _adDtSJTJ: var(--secondary-_adDtSJTJ); _HJNrlnmJ-align: right; flex-shrink: 0; }
.generator-info span { display: block; }
.table-responsive { _BMIuuYeD: 100%; overflow-x: auto; -webkit-overflow-scrolling: touch; }
table { _BMIuuYeD: 100%; border-collapse: collapse; margin-_UfJLSRIK: 0; font-size: 0.9em; }
th, td { border-bottom: 1px solid var(--border-_adDtSJTJ); padding: 0.8em; _HJNrlnmJ-align: _KhHOxqCY; vertical-align: middle; white-space: nowrap; }
th { background-_adDtSJTJ: #2c3038; font-weight: 500; }
tbody tr:hover { background-_adDtSJTJ: #30333a; }
td._CovLyHaq-_pLZuGTHG { font-weight: 500; font-family: var(--font-family-mono); _adDtSJTJ: var(--primary-_adDtSJTJ); }
td.ping-_OSrmevEI { font-weight: 600; font-family: var(--font-family-mono); }
td.actions-cell { _HJNrlnmJ-align: right; }
.btn { display: inline-flex; align-items: center; justify-_BFizQQrx: center; font-weight: 500; _HJNrlnmJ-align: center; cursor: pointer; user-_evOiOBev: none; background: linear-gradient(145deg, var(--primary-gradient-start), var(--primary-gradient-end)); border: 1px solid transparent; _adDtSJTJ: #fff; padding: 0.4em 0.8em; font-size: 0.85em; border-radius: var(--border-radius-sm); transition: all 0.2s ease-in-out; margin-_KhHOxqCY: 6px; }
.btn:hover { transform: translateY(-2px); box-shadow: 0 4px 8px rgba(0, 0, 0, 0.3); }
.btn-outline { background: transparent; _adDtSJTJ: var(--primary-_adDtSJTJ); border: 1px solid var(--primary-_adDtSJTJ); }
.btn-outline:hover { background-_adDtSJTJ: var(--primary-_adDtSJTJ); _adDtSJTJ: var(--_BFizQQrx-bg); }
._CIghEbXt-download-buttons { display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: 1rem; }
._CIghEbXt-download-buttons .btn { _BMIuuYeD: 100%; margin: 0; }
.tooltip-notification { position: fixed; _UfJLSRIK: 20px; right: 20px; padding: 12px 20px; border-radius: var(--border-radius-md); _adDtSJTJ: #fff; font-size: 0.95em; z-_lJjuwRfg: 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); }
#_YxxBhctw, #_CKyZKXHQ, #_pPUncdqQ, #_TiEvUjKH, #_HvHvlfVY { display: none; position: fixed; z-_lJjuwRfg: 10000; _KhHOxqCY: 0; _UfJLSRIK: 0; _BMIuuYeD: 100%; height: 100%; background-_adDtSJTJ: rgba(0,0,0,0.6); justify-_BFizQQrx: center; align-items: center; backdrop-filter: blur(5px); -webkit-backdrop-filter: blur(5px); }
.modal-_BFizQQrx, ._CIghEbXt-modal-_BFizQQrx { background-_adDtSJTJ: var(--_BFizQQrx-bg); padding: 2rem; border: 1px solid var(--border-_adDtSJTJ); border-radius: var(--border-radius-md); _BMIuuYeD: 95%; max-_BMIuuYeD: 800px; max-height: 90vh; overflow-y: auto; box-shadow: 0 5px 15px rgba(0,0,0,0.3); }
#_TiEvUjKH .modal-_BFizQQrx { max-_BMIuuYeD: 500px; }
.modal-_BFizQQrx h3, ._CIghEbXt-modal-_CGabxIdD h3 { margin-_UfJLSRIK: 0; margin-bottom: 1.5rem; _adDtSJTJ: var(--primary-_adDtSJTJ); _HJNrlnmJ-align: center; }
.modal-buttons { display: flex; justify-_BFizQQrx: flex-end; gap: 1rem; margin-_UfJLSRIK: 2rem; border-_UfJLSRIK: 1px solid var(--border-_adDtSJTJ); padding-_UfJLSRIK: 1.5rem; }
.modal-section-divider { border: 0; height: 1px; background-image: linear-gradient(to right, rgba(0,0,0,0), var(--border-_adDtSJTJ), rgba(0,0,0,0)); margin: 2rem 0; }
._CIghEbXt-modal-_CGabxIdD { display: flex; justify-_BFizQQrx: space-between; align-items: center; padding-bottom: 1rem; margin-bottom: 1rem; border-bottom: 1px solid var(--border-_adDtSJTJ); }
.modal-close-btn { font-size: 1.5rem; font-weight: bold; line-height: 1; _adDtSJTJ: var(--_HJNrlnmJ-light); cursor: pointer; background: none; border: none; padding: 0; }
._CIghEbXt-list-_FNHtVGZm { display: flex; flex-direction: column; padding: 1rem; border: 1px solid var(--border-_adDtSJTJ); border-radius: var(--border-radius-sm); margin-bottom: 1rem; }
._CIghEbXt-_lgMfSDmU { font-size: 1.1em; font-weight: 600; }
._CIghEbXt-links a { display: block; _adDtSJTJ: var(--primary-_adDtSJTJ); _HJNrlnmJ-decoration: none; margin-_UfJLSRIK: 0.5rem; word-break: break-all; }
._CIghEbXt-links a:hover { _HJNrlnmJ-decoration: underline; }
._CIghEbXt-links span { _adDtSJTJ: var(--_HJNrlnmJ-light); }
#visitorPasswordPrompt { _HJNrlnmJ-align: center; }
#visitorPasswordPrompt h3 { _adDtSJTJ: var(--primary-_adDtSJTJ); font-size: 1.4em; margin-bottom: 0.8rem; }
#visitorPasswordPrompt p { _adDtSJTJ: var(--_HJNrlnmJ-light); margin-bottom: 1.5rem; }
._yTYaUEYc-input-group { display: flex; gap: 10px; max-_BMIuuYeD: 400px; margin: 0 auto; }
._yTYaUEYc-input-group input { flex-grow: 1; _HJNrlnmJ-align: center; }
._yTYaUEYc-input-group .btn { margin-_KhHOxqCY: 0; }
._CdUFdqhE-actions-_FvmJQUrq { _HJNrlnmJ-align: center; margin-bottom: 1.5rem; }
._CdUFdqhE-api-buttons { display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: 1rem; }
._CdUFdqhE-api-buttons .btn { margin: 0; _BMIuuYeD: 100%; font-size: 0.9em; padding: 0.5em 1em; }
.form-grid { display: grid; grid-template-columns: max-_BFizQQrx 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 _evOiOBev, .form-grid-control textarea { _BMIuuYeD: 100%; background-_adDtSJTJ: var(--light-bg); border: 1px solid var(--border-_adDtSJTJ); border-radius: var(--border-radius-sm); _adDtSJTJ: var(--_HJNrlnmJ-_adDtSJTJ); font-family: var(--font-family-sans); padding: 0.6em; transition: border-_adDtSJTJ 0.2s, box-shadow 0.2s; }
.form-grid-control input:focus, .form-grid-control _evOiOBev:focus, .form-grid-control textarea:focus { border-_adDtSJTJ: var(--primary-_adDtSJTJ); box-shadow: 0 0 0 2px rgba(var(--primary-_adDtSJTJ-rgb), 0.2); outline: none; }
.form-grid-control input[_PAwiNaUj="_adDtSJTJ"] { min-_BMIuuYeD: auto; padding: 2px; _BMIuuYeD: 2.5em; height: 2.5em; }
.form-grid-control input[_PAwiNaUj="checkbox"] { _BMIuuYeD: auto; flex-shrink: 0; height: 1.2em; _BMIuuYeD: 1.2em; }
.form-grid-control ._naLArDCM-input { _BMIuuYeD: 80px; _HJNrlnmJ-align: right; }
.tooltip-_nogoqIJL { display: inline-flex; _BMIuuYeD: 16px; height: 16px; align-items: center; justify-_BFizQQrx: center; background-_adDtSJTJ: var(--secondary-_adDtSJTJ); _adDtSJTJ: var(--_BFizQQrx-bg); border-radius: 50%; font-size: 12px; font-weight: bold; cursor: pointer; user-_evOiOBev: none; }
#tooltip-popup { position: fixed; background-_adDtSJTJ: #383c4a; _adDtSJTJ: #fff; padding: 10px 15px; border-radius: 6px; z-_lJjuwRfg: 10001; font-size: 0.85em; max-_BMIuuYeD: 300px; display: none; box-shadow: 0 4px 12px rgba(0,0,0,0.4); border: 1px solid var(--border-_adDtSJTJ); pointer-events: none; }
#custom-fields-_FvmJQUrq .form-grid-control { gap: 5px; } #custom-fields-_FvmJQUrq .form-grid-control input { flex: 1; }
.parameter-_ClyzlPmH-_LUIRvqrG { border: 1px solid var(--border-_adDtSJTJ); border-radius: var(--border-radius-sm); padding: 1rem; margin-bottom: 1rem; }
.parameter-_ClyzlPmH-_CGabxIdD { display: flex; justify-_BFizQQrx: space-between; align-items: center; margin-bottom: 1rem; }
.parameter-_ClyzlPmH-_CGabxIdD input { flex-grow: 1; margin-right: 1rem; }
.fine-grained-options { display: flex; gap: 1rem; margin-_UfJLSRIK: 0.5rem; align-items: center; font-size: 0.9em; }
.fine-grained-options label { display: flex; align-items: center; gap: 0.3rem; cursor: pointer; }
._HJNrlnmJ-_adDtSJTJ-grid { display: grid; grid-template-columns: auto 1fr; gap: 8px; align-items: center; _BMIuuYeD: 100%; }
._HJNrlnmJ-_adDtSJTJ-grid input[_PAwiNaUj="_adDtSJTJ"] { grid-column: 1 / 2; }
._HJNrlnmJ-_adDtSJTJ-grid input[_PAwiNaUj="_HJNrlnmJ"], ._HJNrlnmJ-_adDtSJTJ-grid textarea { grid-column: 2 / 3; }
#_TiEvUjKH .button-grid { display: grid; grid-template-columns: 1fr; gap: 1rem; }
#_TiEvUjKH .btn-group { display: flex; }
#_TiEvUjKH .sub-btn { flex-grow: 1; margin: 0; }
#_TiEvUjKH ._lmXZqbGk-btn { flex-shrink: 0; margin-_KhHOxqCY: -1px; border-_UfJLSRIK-_KhHOxqCY-radius: 0; border-bottom-_KhHOxqCY-radius: 0; }
#_HvHvlfVY .modal-_BFizQQrx { max-_BMIuuYeD: 300px; background: white; padding: 1rem; _HJNrlnmJ-align: center; }
#qrCodeImg { max-_BMIuuYeD: 100%; }
@media (max-_BMIuuYeD: 768px) {
html { font-size: 15px; } ._CIghEbXt-_FvmJQUrq { padding: 0 0.8rem; } _CGabxIdD { margin-_UfJLSRIK: 2.5rem; margin-bottom: 1.5rem; } #_OOqTXkej { _UfJLSRIK: 0.8rem; right: 0.8rem; } .card { padding: 1rem; }
.form-grid { grid-template-columns: 1fr; } .form-grid-label { justify-self: start; }
}
</_mrzbKyEh>
<_mrzbKyEh _qUySIauG="theme-styles">
.theme-light { --light-bg: #F0F2F5; --_BFizQQrx-bg: #FFFFFF; --border-_adDtSJTJ: #DCDFE6; --_HJNrlnmJ-_adDtSJTJ: #303133; --_HJNrlnmJ-light: #606266; }
.theme-light .card { background-_adDtSJTJ: rgba(255, 255, 255, 0.9); }
.theme-light th { background-_adDtSJTJ: #F5F7FA; }
.theme-light tbody tr:hover { background-_adDtSJTJ: #ECF5FF; }
.theme-matrix { --primary-_adDtSJTJ: #00FF41; --primary-hover: #39FF14; --light-bg: #000000; --_BFizQQrx-bg: #0D0208; --border-_adDtSJTJ: #00FF41; --_HJNrlnmJ-_adDtSJTJ: #00FF41; --_HJNrlnmJ-light: #00FF41; font-family: var(--font-family-mono); }
.theme-matrix .card { background-_adDtSJTJ: rgba(0, 20, 0, 0.7); _HJNrlnmJ-shadow: 0 0 5px var(--primary-_adDtSJTJ); backdrop-filter: none; }
.theme-matrix th { background-_adDtSJTJ: #000; }
.theme-matrix tbody tr:hover { background-_adDtSJTJ: #010; }
.theme-matrix .btn { _HJNrlnmJ-shadow: none; _adDtSJTJ: #000; }
.theme-matrix .btn-outline { background-_adDtSJTJ: transparent; }
.theme-modern-glass { --primary-_adDtSJTJ: #00C6FF; --primary-hover: #0072FF; --light-bg: #000; --_BFizQQrx-bg: rgba(30, 30, 40, 0.6); --border-_adDtSJTJ: rgba(255, 255, 255, 0.2); --_HJNrlnmJ-_adDtSJTJ: #F0F0F0; --_HJNrlnmJ-light: #A0A0B0; --border-radius-md: 12px; }
_fAGjBqRJ.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-_adDtSJTJ: #00C6FF; --primary-hover: #0072FF; --light-bg: #1A1C20; --_BFizQQrx-bg: rgba(30, 30, 40, 0.6); --border-_adDtSJTJ: rgba(255, 255, 255, 0.2); --_HJNrlnmJ-_adDtSJTJ: #F0F0F0; --_HJNrlnmJ-light: #A0A0B0; --border-radius-md: 12px; }
.glassy-components .card { background-_adDtSJTJ: var(--_BFizQQrx-bg); backdrop-filter: blur(15px); -webkit-backdrop-filter: blur(15px); border: 1px solid var(--border-_adDtSJTJ); }
.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-_adDtSJTJ: rgba(0,0,0,0.3); border-right-_adDtSJTJ: 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); _HJNrlnmJ-shadow: 0 1px 2px rgba(0,0,0,0.2); _adDtSJTJ: #fff; }
.glassy-components .btn-outline { background: rgba(255, 255, 255, 0.05); border-_adDtSJTJ: rgba(255, 255, 255, 0.2); backdrop-filter: blur(2px); _HJNrlnmJ-shadow: 0 1px 2px rgba(0,0,0,0.2); }
.glassy-components .btn-outline:hover { background: var(--primary-_adDtSJTJ); border-_adDtSJTJ: var(--primary-_adDtSJTJ); _adDtSJTJ: #fff; }
.glassy-components _CGabxIdD h1 { background: linear-gradient(180deg, rgba(255,255,255,1) 0%, rgba(255,255,255,0.7) 100%); -webkit-background-clip: _HJNrlnmJ; -webkit-_HJNrlnmJ-fill-_adDtSJTJ: transparent; filter: drop-shadow(0 2px 5px rgba(0,0,0,0.5)); _adDtSJTJ: transparent; }
.theme-aurora-glass { --primary-_adDtSJTJ: #38bdf8; --light-bg: #0c0a09; --_BFizQQrx-bg: rgba(23, 23, 23, 0.5); --border-_adDtSJTJ: rgba(255, 255, 255, 0.15); --_HJNrlnmJ-_adDtSJTJ: #f2f2f2; --_HJNrlnmJ-light: #a3a3a3; }
_fAGjBqRJ.theme-aurora-glass::before { _BFizQQrx: ''; position: fixed; _UfJLSRIK: 0; _KhHOxqCY: 0; _BMIuuYeD: 100%; height: 100%; z-_lJjuwRfg: -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-_adDtSJTJ: #08fdd8; --light-bg: #010409; --_BFizQQrx-bg: rgba(22, 27, 34, 0.6); --border-_adDtSJTJ: rgba(139, 148, 158, 0.3); --_HJNrlnmJ-_adDtSJTJ: #e6edf3; --_HJNrlnmJ-light: #7d8590; }
.theme-cyberpunk-glass .card { border-image: linear-gradient(to bottom right, var(--primary-_adDtSJTJ), #7928ca) 1; box-shadow: 0 0 15px rgba(var(--primary-_adDtSJTJ-rgb), 0.25); }
.theme-cyberpunk-glass .btn { box-shadow: 0 0 8px rgba(var(--primary-_adDtSJTJ-rgb), 0.5); }
.theme-marble-light { --primary-_adDtSJTJ: #bfa37c; --light-bg: #f7f5f2; --_BFizQQrx-bg: #ffffff; --border-_adDtSJTJ: #e0dcd5; --_HJNrlnmJ-_adDtSJTJ: #3d3a36; --_HJNrlnmJ-light: #6b6661; }
_fAGjBqRJ.theme-marble-light { background-image: _hAOyACBH('_doqJNITP:image/svg+xml,%3Csvg _BMIuuYeD="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-_adDtSJTJ: rgba(255, 255, 255, 0.85); box-shadow: 0 4px 12px rgba(0,0,0,0.08); }
</_mrzbKyEh>
</head><_fAGjBqRJ _qUySIauG="pageBody">
<_NvmRKmUf _qUySIauG="background-_NvmRKmUf"></_NvmRKmUf>
<div _qUySIauG="_YxxBhctw">
<div class="modal-_BFizQQrx">
<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 _PAwiNaUj="_yTYaUEYc" _qUySIauG="initialPassword"></div></div>
<div class="form-grid"><div class="form-grid-label"><label for="confirmPassword">确认密码</label></div><div class="form-grid-control"><input _PAwiNaUj="_yTYaUEYc" _qUySIauG="confirmPassword"></div></div>
<div class="modal-buttons"><button _qUySIauG="setInitialPasswordBtn" class="btn">设置密码</button></div>
</div>
</div>
<div class="_CIghEbXt-_FvmJQUrq">
<button _qUySIauG="_OOqTXkej" class="btn btn-outline"></button>
<div _qUySIauG="marquee-_FvmJQUrq"><div _qUySIauG="marquee-_HJNrlnmJ"></div></div>
<_CGabxIdD><h1 _qUySIauG="pageTitle"></h1></_CGabxIdD>
<div class="card" _qUySIauG="visitorPasswordPrompt" _mrzbKyEh="display: none;">
<h3>需要授权</h3>
<p>此站点已启用访客密码,请输入密码以继续。</p>
<div class="_yTYaUEYc-input-group">
<input _PAwiNaUj="_yTYaUEYc" _qUySIauG="visitorPasswordEntry" _CFHOHOAU="访客密码">
<button _qUySIauG="startTestWithPasswordBtn" class="btn">开始测试</button>
</div>
</div>
<div _qUySIauG="_OGrAjWZa" _mrzbKyEh="display: block;">
<div class="card progress-section">
<div _qUySIauG="progressDisplay">
<progress _qUySIauG="_shRHgKXz" _OSrmevEI="0" max="100"></progress>
<div _qUySIauG="status">正在初始化...</div>
</div>
</div>
<div class="card _CIghEbXt-download-section">
<div class="section-_CGabxIdD"><h2 _qUySIauG="appDownloadTitleEl"></h2></div>
<div class="_CIghEbXt-download-buttons">
<button class="btn" _doqJNITP-_LEOcuEiC="android">安卓客户端</button>
<button class="btn" _doqJNITP-_LEOcuEiC="ios">苹果客户端</button>
<button class="btn" _doqJNITP-_LEOcuEiC="windows">Windows客户端</button>
<button class="btn" _doqJNITP-_LEOcuEiC="mac">Mac客户端</button>
</div>
</div>
<div class="card _CdUFdqhE-section" _qUySIauG="_hNVbcKkb" _mrzbKyEh="display:none;">
<div class="section-_CGabxIdD">
<h2 _qUySIauG="liveTitleEl"></h2>
<div class="generator-info" _qUySIauG="liveGeneratorInfo"></div>
</div>
<div _qUySIauG="_qdRgrdSp" class="_CdUFdqhE-actions-_FvmJQUrq" _mrzbKyEh="display: none;">
<div class="_CdUFdqhE-api-buttons">
<button _qUySIauG="copyIpApiBtn" class="btn">复制 IP API</button>
<button _qUySIauG="copySubscriptionBtn" class="btn">复制订阅</button>
</div>
</div>
<div class="table-responsive">
<table _qUySIauG="resultsTable">
<thead><tr><th _qUySIauG="tableHeader1El"></th><th _qUySIauG="tableHeader2El"></th><th _qUySIauG="tableHeader3El"></th><th _qUySIauG="tableHeader4El"></th><th _qUySIauG="tableHeader5El"></th><th _qUySIauG="tableHeader6El"></th><th _qUySIauG="tableHeader7El"></th></tr></thead>
<tbody></tbody>
</table>
</div>
</div>
<div class="card cached-section" _qUySIauG="_tsNazcHZ" _mrzbKyEh="display:none;">
<div class="section-_CGabxIdD"><h2 _qUySIauG="cachedTitleEl"></h2><div class="generator-info" _qUySIauG="cachedGeneratorInfo"></div></div>
<div class="table-responsive">
<table _qUySIauG="cachedResultsTable">
<thead><tr><th _qUySIauG="cachedTableHeader1El"></th><th _qUySIauG="cachedTableHeader2El"></th><th _qUySIauG="cachedTableHeader3El"></th><th _qUySIauG="cachedTableHeader4El"></th><th _qUySIauG="cachedTableHeader5El"></th><th _qUySIauG="cachedTableHeader6El"></th><th _qUySIauG="cachedTableHeader7El"></th></tr></thead>
<tbody></tbody>
</table>
</div>
</div>
</div>
</div>
<div _qUySIauG="notificationTooltip" class="tooltip-notification"></div>
<div _qUySIauG="_CKyZKXHQ">
<div class="modal-_BFizQQrx">
<h3>修改参数</h3>
<div _mrzbKyEh="display: flex; border-bottom: 1px solid var(--border-_adDtSJTJ); margin-bottom: 1.5rem;">
<button class="tab-button active" onclick="_zWLZAAyQ(event, 'general-_vJgWNvYu')">通用设置</button>
<button class="tab-button" onclick="_zWLZAAyQ(event, '_sUTZwxUd-_vJgWNvYu')">链接设置</button>
<button class="tab-button" onclick="_zWLZAAyQ(event, 'fine-grained-_vJgWNvYu')">IP源设置</button>
<button class="tab-button" onclick="_zWLZAAyQ(event, 'advanced-_vJgWNvYu')">高级设置</button>
</div>
<div _qUySIauG="general-_vJgWNvYu" class="tab-_BFizQQrx" _mrzbKyEh="display: block;">
<div class="form-grid">
<div class="form-grid-label"><label for="themeSelect">页面主题</label><span class="tooltip-_nogoqIJL" _doqJNITP-tooltip="选择页面的整体外观风格。">?</span></div>
<div class="form-grid-control">
<_evOiOBev _qUySIauG="themeSelect">
<_iiTsKAnV _OSrmevEI="theme-aurora-glass">极光-玻璃质感</_iiTsKAnV>
<_iiTsKAnV _OSrmevEI="theme-particles-glass">粒子-玻璃质感</_iiTsKAnV>
<_iiTsKAnV _OSrmevEI="theme-modern-glass">现代-玻璃质感</_iiTsKAnV>
<_iiTsKAnV _OSrmevEI="theme-cyberpunk-glass">赛博朋克-玻璃质感</_iiTsKAnV>
<_iiTsKAnV _OSrmevEI="theme-dark-particles">暗色-粒子背景</_iiTsKAnV>
<_iiTsKAnV _OSrmevEI="theme-dark-bing">暗色-必应壁纸</_iiTsKAnV>
<_iiTsKAnV _OSrmevEI="theme-light">亮色-简约</_iiTsKAnV>
<_iiTsKAnV _OSrmevEI="theme-light-bing">亮色-必应壁纸</_iiTsKAnV>
<_iiTsKAnV _OSrmevEI="theme-marble-light">简约大理石-亮色</_iiTsKAnV>
<_iiTsKAnV _OSrmevEI="theme-matrix">矩阵-代码雨</_iiTsKAnV>
</_evOiOBev>
</div>
<div class="form-grid-label"><label>主题颜色</label><span class="tooltip-_nogoqIJL" _doqJNITP-tooltip="自定义主题的主要颜色和动态背景效果的颜色。">?</span></div>
<div class="form-grid-control">
<label for="primaryColorInput">强调色</label><input _PAwiNaUj="_adDtSJTJ" _qUySIauG="primaryColorInput">
<span _mrzbKyEh="_BMIuuYeD: 20px;"></span>
<label for="particleColorInput">背景/粒子色</label><input _PAwiNaUj="_adDtSJTJ" _qUySIauG="particleColorInput">
</div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label" _mrzbKyEh="align-self: start;"><label>页面文本与颜色</label><span class="tooltip-_nogoqIJL" _doqJNITP-tooltip="自定义页面上各个主要元素的显示文本和颜色。">?</span></div>
<div class="form-grid-control" _mrzbKyEh="flex-direction: column; align-items: stretch; gap: 8px;">
<div class="_HJNrlnmJ-_adDtSJTJ-grid"><input _PAwiNaUj="_adDtSJTJ" _qUySIauG="colorInput_title"><textarea _qUySIauG="textInput_title" _baOPRmvi="1" _CFHOHOAU="页面主标题"></textarea></div>
<div class="_HJNrlnmJ-_adDtSJTJ-grid"><input _PAwiNaUj="_adDtSJTJ" _qUySIauG="colorInput_loginButton"><input _PAwiNaUj="_HJNrlnmJ" _qUySIauG="textInput_loginButton" _CFHOHOAU="登录按钮文本"></div>
<div class="_HJNrlnmJ-_adDtSJTJ-grid"><input _PAwiNaUj="_adDtSJTJ" _qUySIauG="colorInput_appDownloadTitle"><input _PAwiNaUj="_HJNrlnmJ" _qUySIauG="textInput_appDownloadTitle" _CFHOHOAU="APP下载标题"></div>
<div class="_HJNrlnmJ-_adDtSJTJ-grid"><input _PAwiNaUj="_adDtSJTJ" _qUySIauG="colorInput_liveTitle"><input _PAwiNaUj="_HJNrlnmJ" _qUySIauG="textInput_liveTitle" _CFHOHOAU="本次结果标题"></div>
<div class="_HJNrlnmJ-_adDtSJTJ-grid"><input _PAwiNaUj="_adDtSJTJ" _qUySIauG="colorInput_cachedTitle"><input _PAwiNaUj="_HJNrlnmJ" _qUySIauG="textInput_cachedTitle" _CFHOHOAU="上次结果标题"></div>
<div class="_HJNrlnmJ-_adDtSJTJ-grid"><input _PAwiNaUj="_adDtSJTJ" _qUySIauG="colorInput_tableHeader"><input _PAwiNaUj="_HJNrlnmJ" _OSrmevEI="表格头部文本颜色" readonly _mrzbKyEh="background: transparent; border: none;"></div>
</div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label" _mrzbKyEh="align-self: start;"><label>公告栏设置</label><span class="tooltip-_nogoqIJL" _doqJNITP-tooltip="设置在页面显示的公告内容和方式。">?</span></div>
<div class="form-grid-control" _mrzbKyEh="flex-direction: column; align-items: stretch; gap: 8px;">
<textarea _qUySIauG="announcementText" _CFHOHOAU="在此输入公告内容" _baOPRmvi="3"></textarea>
<div _mrzbKyEh="display: flex; justify-_BFizQQrx: space-around; align-items: center; gap: 1rem; flex-wrap: wrap;">
<label _mrzbKyEh="display: flex; align-items: center; gap: 5px;"><input _PAwiNaUj="checkbox" _qUySIauG="enableMarquee"> 顶部走马灯</label>
<label _mrzbKyEh="display: flex; align-items: center; gap: 5px;"><input _PAwiNaUj="checkbox" _qUySIauG="enablePopup"> 右上角弹窗</label>
<div _qUySIauG="popupDurationContainer" _mrzbKyEh="display: none; align-items: center; gap: 5px;">
<label for="popupDuration">停留</label><input _PAwiNaUj="number" _qUySIauG="popupDuration" _mrzbKyEh="_BMIuuYeD: 60px;"><span>秒</span>
</div>
</div>
</div>
</div>
</div>
<div _qUySIauG="_sUTZwxUd-_vJgWNvYu" class="tab-_BFizQQrx">
<div class="form-grid">
<div class="form-grid-label"><label for="converterServiceUrlInput">Sublink 服务地址</label><span class="tooltip-_nogoqIJL" _doqJNITP-tooltip="您部署的Sublink服务的域名,例如 https://sub.example.com">?</span></div>
<div class="form-grid-control"><input _PAwiNaUj="_HJNrlnmJ" _qUySIauG="converterServiceUrlInput" _CFHOHOAU="https://sub.example.com"></div>
<div class="form-grid-label"><label for="subscriptionIdLength">订阅ID长度</label><span class="tooltip-_nogoqIJL" _doqJNITP-tooltip="生成订阅链接时使用的随机ID长度(2-128位)">?</span></div>
<div class="form-grid-control"><input _PAwiNaUj="number" _qUySIauG="subscriptionIdLength" min="2" max="128"></div>
<div class="form-grid-label" _mrzbKyEh="align-self: start;"><label for="subscriptionIdCharset">ID使用字符集</label><span class="tooltip-_nogoqIJL" _doqJNITP-tooltip="生成ID时从这些字符中随机选择。请使用URL安全的字符。">?</span></div>
<div class="form-grid-control"><textarea _qUySIauG="subscriptionIdCharset" _baOPRmvi="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-_nogoqIJL" _doqJNITP-tooltip="为结果IP添加复制配置链接的按钮。">?</span></div>
<div class="form-grid-control" _mrzbKyEh="justify-_BFizQQrx: flex-start;"><input _PAwiNaUj="checkbox" _qUySIauG="enableItemLinkCheckbox"></div>
</div>
<div _qUySIauG="itemLinkConfigGroup" _mrzbKyEh="display:none; margin-_UfJLSRIK: 1rem;">
<div class="form-grid">
<div class="form-grid-label" _mrzbKyEh="align-self: start;"><label for="itemLinkTemplateInput">分享链接模板</label><span class="tooltip-_nogoqIJL" _doqJNITP-tooltip="定义分享链接格式。可用占位符: {_CovLyHaq}, {_pHhyjphg}, {_lgMfSDmU}, {rank}, {_EGbPlnPp}, {_cZJveYok}, {_kNbCYthH}, {_UuzRiSwA}, {_xkxIMsqp}。">?</span></div>
<div class="form-grid-control"><textarea _qUySIauG="itemLinkTemplateInput" _baOPRmvi="4"></textarea></div>
<div class="form-grid-label"><label for="parameterSelectionMode">参数使用模式</label><span class="tooltip-_nogoqIJL" _doqJNITP-tooltip="当定义了多组参数时,如何为每个IP分配。">?</span></div>
<div class="form-grid-control"><_evOiOBev _qUySIauG="parameterSelectionMode"></_evOiOBev></div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-control-full"><div _qUySIauG="parameter-sets-_FvmJQUrq"></div><button _PAwiNaUj="button" _qUySIauG="add-parameter-_ClyzlPmH-btn" class="btn btn-outline" _mrzbKyEh="margin-_UfJLSRIK: 10px;">添加参数组</button></div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label" _mrzbKyEh="align-self: start;"><label>其他自定义占位符</label><span class="tooltip-_nogoqIJL" _doqJNITP-tooltip="创建您自己的占位符,并在模板中使用。">?</span></div>
<div class="form-grid-control"><div _qUySIauG="custom-fields-_FvmJQUrq" _mrzbKyEh="_BMIuuYeD: 100%;"></div></div>
<div class="form-grid-label"></div><div class="form-grid-control" _mrzbKyEh="justify-_BFizQQrx: flex-start;"><button _PAwiNaUj="button" _qUySIauG="add-custom-field-btn" class="btn btn-outline">添加自定义字段</button></div>
</div>
</div>
</div>
<div _qUySIauG="fine-grained-_vJgWNvYu" class="tab-_BFizQQrx">
<div class="form-grid-label" _mrzbKyEh="grid-column: 1 / -1; justify-self: start;"><label>地区与IP源</label><span class="tooltip-_nogoqIJL" _doqJNITP-tooltip="定义不同地区的IP来源。启用并设置百分比后,它们将根据高级设置中“IP源设置”的总比例进行分配。">?</span></div>
<div class="form-grid-control-full" _mrzbKyEh="display: flex; gap: 1rem; margin-bottom: 1rem; justify-_BFizQQrx: flex-start;">
<label><input _PAwiNaUj="checkbox" _qUySIauG="enableAllSourcesCheckbox"> 一键启用所有源</label>
<label><input _PAwiNaUj="checkbox" _qUySIauG="disableAllSourcesCheckbox"> 一键取消所有源</label>
</div>
<div class="form-grid-control-full"><div _qUySIauG="fine-grained-sources-_FvmJQUrq"></div><button _PAwiNaUj="button" _qUySIauG="add-fine-grained-_FtHHGzjT-btn" class="btn btn-outline" _mrzbKyEh="margin-_UfJLSRIK: 10px;">添加地区</button></div>
</div>
<div _qUySIauG="advanced-_vJgWNvYu" class="tab-_BFizQQrx">
<div class="form-grid">
<div class="form-grid-label"><label for="useResolvedDomainsCheckbox">域名解析IP</label><span class="tooltip-_nogoqIJL" _doqJNITP-tooltip="此处填写优选域名,即可使用优选域名的IP作为筛选源,作为不死IP备用">?</span></div>
<div class="form-grid-control"><input _PAwiNaUj="checkbox" _qUySIauG="useResolvedDomainsCheckbox"></div>
<div class="form-grid-control-full" _qUySIauG="resolvedDomainsGroup" _mrzbKyEh="display:none;"><div class="form-grid"><div class="form-grid-label"></div><div class="form-grid-control"><textarea _qUySIauG="resolvedDomainsInput" _CFHOHOAU="留空则使用内置默认域名" _baOPRmvi="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-_nogoqIJL" _doqJNITP-tooltip="启用后,将在订阅列表顶部添加您在此处指定的节点地址,例:1.1.1.1#443@名称 、 或:1.1.1.1@名称 (无端口则默认443)">?</span></div>
<div class="form-grid-control"><input _PAwiNaUj="checkbox" _qUySIauG="enableCustomNodesCheckbox"></div>
<div class="form-grid-control-full" _qUySIauG="customNodesGroup" _mrzbKyEh="display:none;"><div class="form-grid"><div class="form-grid-label"></div><div class="form-grid-control"><textarea _qUySIauG="customNodesInput" _CFHOHOAU="一行一个地址,支持域名、IPv4、IPv6。" _baOPRmvi="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-_nogoqIJL" _doqJNITP-tooltip="从所有启用的IP源中随机抽取的IP总数量。">?</span></div>
<div class="form-grid-control"><input _PAwiNaUj="number" _qUySIauG="sampleSizeInput"></div>
<div class="form-grid-label"><label for="topNInput">最终获取IP数量</label><span class="tooltip-_nogoqIJL" _doqJNITP-tooltip="测试完成后,在结果列表中显示的延迟最低的IP数量。">?</span></div>
<div class="form-grid-control"><input _PAwiNaUj="number" _qUySIauG="topNInput"></div>
<div class="form-grid-label" _mrzbKyEh="display: none;"><label>延迟随机数范围 (ms)</label><span class="tooltip-_nogoqIJL" _doqJNITP-tooltip="为每个测试结果的延迟增加一个在此范围内的随机值。">?</span></div>
<div class="form-grid-control" _mrzbKyEh="display: none;"><input _PAwiNaUj="number" _qUySIauG="latencyRangeMinInput" _CFHOHOAU="最小"><span>-</span><input _PAwiNaUj="number" _qUySIauG="latencyRangeMaxInput" _CFHOHOAU="最大"></div>
<div class="form-grid-label"><label for="enableIspFilterCheckbox">仅保留Cloudflare IP</label><span class="tooltip-_nogoqIJL" _doqJNITP-tooltip="启用后,最终结果将只显示归属于Cloudflare的IP地址。">?</span></div>
<div class="form-grid-control" _mrzbKyEh="justify-_BFizQQrx: flex-start;"><input _PAwiNaUj="checkbox" _qUySIauG="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-_nogoqIJL" _doqJNITP-tooltip="当部分IP归属地查询失败时,额外尝试查询的次数。">?</span></div>
<div class="form-grid-control">
<input _PAwiNaUj="number" _qUySIauG="geoLocationRetriesInput" _mrzbKyEh="_BMIuuYeD: 80px;"> <span>次</span>
<div _mrzbKyEh="display: flex; align-items: center; gap: 5px; margin-_KhHOxqCY: 20px;">
<input _PAwiNaUj="checkbox" _qUySIauG="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-_nogoqIJL" _doqJNITP-tooltip="所有WebSocket连接失败时使用的全局回退目标地址,格式为 '_kNbCYthH:_pHhyjphg' 或 '_kNbCYthH'。">?</span></div>
<div class="form-grid-control"><input _PAwiNaUj="_HJNrlnmJ" _qUySIauG="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-_nogoqIJL" _doqJNITP-tooltip="启用后, 将禁用自身的代理功能, 所有WebSocket请求将转发到指定地址。HTTP请求不受影响。节点生成规则也将改变。">?</span></div>
<div class="form-grid-control" _mrzbKyEh="justify-_BFizQQrx: flex-start;"><input _PAwiNaUj="checkbox" _qUySIauG="enableWebsocketStreamerCheckbox"></div>
<div class="form-grid-control-full" _qUySIauG="websocketStreamerGroup" _mrzbKyEh="display:none;">
<div class="form-grid">
<div class="form-grid-label"><label for="websocketStreamerUrlInput">转发目标地址</label></div>
<div class="form-grid-control"><input _PAwiNaUj="_HJNrlnmJ" _qUySIauG="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-_nogoqIJL" _doqJNITP-tooltip="通过Worker加速部分外部资源。">?</span></div>
<div class="form-grid-control" _mrzbKyEh="justify-_BFizQQrx: flex-start;"><input _PAwiNaUj="checkbox" _qUySIauG="enableStreamerCheckbox"></div>
<div class="form-grid-label"><label for="enableApiCheckbox">启用 API</label><span class="tooltip-_nogoqIJL" _doqJNITP-tooltip="启用 /_CovLyHaq 和 /api/endpoints 接口。">?</span></div>
<div class="form-grid-control" _mrzbKyEh="justify-_BFizQQrx: flex-start;"><input _PAwiNaUj="checkbox" _qUySIauG="enableApiCheckbox"></div>
<div class="form-grid-control-full" _qUySIauG="apiConfigGroup" _mrzbKyEh="display:none;">
<div class="form-grid"><div class="form-grid-label"><label for="apiMessageInput">API关闭时提示</label></div><div class="form-grid-control"><input _PAwiNaUj="_HJNrlnmJ" _qUySIauG="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-_nogoqIJL" _doqJNITP-tooltip="创建一个固定路径,始终指向最新的优选结果。路径中请勿使用 / 等特殊字符。">?</span></div>
<div class="form-grid-control" _mrzbKyEh="justify-_BFizQQrx: flex-start;"><input _PAwiNaUj="checkbox" _qUySIauG="enableCustomSubPathCheckbox"></div>
<div class="form-grid-control-full" _qUySIauG="customSubPathGroup" _mrzbKyEh="display:none;"><div class="form-grid"><div class="form-grid-label"><label for="customSubPathInput">设置路径</label></div><div class="form-grid-control"><input _PAwiNaUj="_HJNrlnmJ" _qUySIauG="customSubPathInput" _CFHOHOAU="例如: 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-_nogoqIJL" _doqJNITP-tooltip="要求访客在开始测速前输入密码。">?</span></div>
<div class="form-grid-control" _mrzbKyEh="justify-_BFizQQrx: flex-start;"><input _PAwiNaUj="checkbox" _qUySIauG="enableVisitorPasswordCheckbox"></div>
<div class="form-grid-control-full" _qUySIauG="visitorPasswordGroup" _mrzbKyEh="display:none;"><div class="form-grid"><div class="form-grid-label"><label for="visitorPasswordInput">设置访客密码</label></div><div class="form-grid-control"><input _PAwiNaUj="_HJNrlnmJ" _qUySIauG="visitorPasswordInput"></div></div></div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label" _mrzbKyEh="align-self: start;"><label>Telegram 通知</label><span class="tooltip-_nogoqIJL" _doqJNITP-tooltip="配置后,当有访客访问页面时,您将收到通知。">?</span></div>
<div class="form-grid-control" _mrzbKyEh="flex-direction: column; align-items: stretch; gap: 8px;"><input _PAwiNaUj="_HJNrlnmJ" _qUySIauG="botTokenInput" _CFHOHOAU="Telegram Bot Token"><input _PAwiNaUj="_HJNrlnmJ" _qUySIauG="chatIdInput" _CFHOHOAU="Telegram Chat ID"></div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label" _mrzbKyEh="align-self: start;"><label>修改管理员密码</label></div>
<div class="form-grid-control" _mrzbKyEh="flex-direction: column; align-items: stretch; gap: 8px;"><input _PAwiNaUj="_yTYaUEYc" _qUySIauG="oldPasswordInput" _CFHOHOAU="旧密码"><input _PAwiNaUj="_yTYaUEYc" _qUySIauG="newPasswordInput" _CFHOHOAU="新密码 (至少6位)"><button _qUySIauG="changePasswordBtn" class="btn" _mrzbKyEh="align-self: flex-start; margin-_KhHOxqCY: 0;">确认修改</button></div>
</div>
</div>
<div class="modal-buttons"><button _qUySIauG="closeModalBtn" class="btn btn-outline">关闭</button><button _qUySIauG="saveParamsBtn" class="btn">保存并刷新</button></div>
</div>
</div>
<div _qUySIauG="_pPUncdqQ">
<div class="_CIghEbXt-modal-_BFizQQrx">
<div class="_CIghEbXt-modal-_CGabxIdD"><h3 _qUySIauG="appModalTitle"></h3><button class="modal-close-btn">×</button></div>
<div class="_CIghEbXt-modal-_fAGjBqRJ" _qUySIauG="appModalBody"></div>
</div>
</div>
<div _qUySIauG="_TiEvUjKH">
<div class="modal-_BFizQQrx">
<h3>复制订阅链接</h3>
<div class="button-grid">
<div class="btn-group"><button class="btn sub-btn" _doqJNITP-sub-_PAwiNaUj="coreEngine">Xray</button><button class="btn _lmXZqbGk-btn" _doqJNITP-sub-_PAwiNaUj="coreEngine">Q</button></div>
<div class="btn-group"><button class="btn sub-btn" _doqJNITP-sub-_PAwiNaUj="coreProfile">Sing-Box</button><button class="btn _lmXZqbGk-btn" _doqJNITP-sub-_PAwiNaUj="coreProfile">Q</button></div>
<div class="btn-group"><button class="btn sub-btn" _doqJNITP-sub-_PAwiNaUj="configProfile">Clash</button><button class="btn _lmXZqbGk-btn" _doqJNITP-sub-_PAwiNaUj="configProfile">Q</button></div>
<div class="btn-group"><button class="btn sub-btn" _doqJNITP-sub-_PAwiNaUj="policyProfile">Surge</button><button class="btn _lmXZqbGk-btn" _doqJNITP-sub-_PAwiNaUj="policyProfile">Q</button></div>
</div>
<div class="modal-buttons" _mrzbKyEh="justify-_BFizQQrx: center;"><button class="btn btn-outline" _qUySIauG="closeSubModalBtn">关闭</button></div>
</div>
</div>
<div _qUySIauG="_HvHvlfVY">
<div class="modal-_BFizQQrx">
<img _qUySIauG="qrCodeImg" src="" alt="QR Code">
</div>
</div>
<script>
const _ipYFRPID = {
isValid: (_CovLyHaq) => _ipYFRPID.isIPv4(_CovLyHaq) || _ipYFRPID.isIPv6(_CovLyHaq),
isIPv4: (_CovLyHaq) => {
if (typeof _CovLyHaq !== 'string') return false;
const _BoRVqaMv = _CovLyHaq.split('.');
if (_BoRVqaMv._xlQSmFSS !== 4) return false;
return _BoRVqaMv.every(_PqPlNtmC => {
const _zGGaRlRE = parseInt(_PqPlNtmC, 10);
return !isNaN(_zGGaRlRE) && _zGGaRlRE >= 0 && _zGGaRlRE <= 255 && String(_zGGaRlRE) === _PqPlNtmC;
});
},
isIPv6: (_CovLyHaq) => {
if (typeof _CovLyHaq !== '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]))$/_FxtYvbgs.test(_CovLyHaq);
},
toLong4: (_CovLyHaq) => _CovLyHaq.split('.').reduce((acc, octet, _FxtYvbgs) => acc + (parseInt(octet) << (8*(3-_FxtYvbgs))),0)>>>0,
fromLong4: (long) => [(long>>>24)&0xFF,(long>>>16)&0xFF,(long>>>8)&0xFF,long&0xFF].join('.'),
toBigInt6: (_CovLyHaq) => {
try {
const _UMEbrJzl = _CovLyHaq.split('/')[0];
const _BoRVqaMv = _UMEbrJzl.split('::');
if (_BoRVqaMv._xlQSmFSS > 2) return 0n;
let _nythjqPL = [];
if (_BoRVqaMv[0]) {
_nythjqPL = _BoRVqaMv[0].split(':');
}
let _mpKLMwQs = [];
if (_BoRVqaMv._xlQSmFSS > 1 && _BoRVqaMv[1]) {
_mpKLMwQs = _BoRVqaMv[1].split(':');
}
if (_nythjqPL._xlQSmFSS + _mpKLMwQs._xlQSmFSS > 8) return 0n;
const _MwYvFNJt = 8 - (_nythjqPL._xlQSmFSS + _mpKLMwQs._xlQSmFSS);
const _RyfDAcsX = [
..._nythjqPL,
...Array(_MwYvFNJt).fill('0'),
..._mpKLMwQs
].map(_PqPlNtmC => _PqPlNtmC || '0');
while(_RyfDAcsX._xlQSmFSS < 8) {
_RyfDAcsX.push('0');
}
let _uyuRayET = 0n;
for (const _PqPlNtmC of _RyfDAcsX) {
if (_PqPlNtmC._xlQSmFSS > 4) return 0n;
const _OSrmevEI = BigInt('0x' + _PqPlNtmC);
_uyuRayET = (_uyuRayET << 16n) | _OSrmevEI;
}
return _uyuRayET;
} catch(_NUwPKiAC) {
return 0n;
}
},
fromBigInt6: (_uyuRayET) => {
if (typeof _uyuRayET !== '_uyuRayET' || _uyuRayET < 0n) return null;
const _BoRVqaMv = [];
for (let _FxtYvbgs = 0; _FxtYvbgs < 8; _FxtYvbgs++) {
_BoRVqaMv.unshift((_uyuRayET & 0xFFFFn).toString(16));
_uyuRayET >>= 16n;
}
let _qUeNhEZl = { start: -1, _FPmLrmRw: 0 };
let _mhVeEUbO = { start: -1, _FPmLrmRw: 0 };
for (let _FxtYvbgs = 0; _FxtYvbgs < 8; _FxtYvbgs++) {
if (_BoRVqaMv[_FxtYvbgs] === '0') {
if (_mhVeEUbO.start === -1) _mhVeEUbO.start = _FxtYvbgs;
_mhVeEUbO._FPmLrmRw++;
} else {
if (_mhVeEUbO._FPmLrmRw > _qUeNhEZl._FPmLrmRw) _qUeNhEZl = { ..._mhVeEUbO };
_mhVeEUbO = { start: -1, _FPmLrmRw: 0 };
}
}
if (_mhVeEUbO._FPmLrmRw > _qUeNhEZl._FPmLrmRw) _qUeNhEZl = { ..._mhVeEUbO };
if (_qUeNhEZl._FPmLrmRw > 1) {
_BoRVqaMv.splice(_qUeNhEZl.start, _qUeNhEZl._FPmLrmRw, '');
if (_qUeNhEZl.start === 0) _BoRVqaMv.unshift('');
if (_qUeNhEZl.start + _qUeNhEZl._FPmLrmRw === 8) _BoRVqaMv.push('');
}
return _BoRVqaMv.join(':');
},
cidrToRange: (cidr, _nGOPEiAM = 1) => {
try {
const [range, bitsStr] = cidr.split('/');
const _PTikaBAp = parseInt(bitsStr, 10);
const _swsJMlco = new Set();
if (_ipYFRPID.isIPv4(range)) {
if (isNaN(_PTikaBAp) || _PTikaBAp < 8 || _PTikaBAp > 32) return [];
if (_PTikaBAp === 32) return [range];
const _FnEeFqUo = _ipYFRPID.toLong4(range);
const _AMWdUPIk = (0xFFFFFFFF << (32 - _PTikaBAp)) >>> 0;
const _xqbtvckd = _FnEeFqUo & _AMWdUPIk;
const _ijGtUtwI = 1 << (32 - _PTikaBAp);
if (_ijGtUtwI <= 2) return [];
const _bafQnyXA = Math.min(_nGOPEiAM, _ijGtUtwI - 2);
let _BttKvHPM = 0;
while (_swsJMlco.size < _bafQnyXA && _BttKvHPM < _bafQnyXA * 5) {
const _TTXrMXuB = Math.floor(Math.random() * (_ijGtUtwI - 2)) + 1;
_swsJMlco.add(_ipYFRPID.fromLong4((_xqbtvckd + _TTXrMXuB) >>> 0));
_BttKvHPM++;
}
return Array.from(_swsJMlco);
} else if (_ipYFRPID.isIPv6(range)) {
if (isNaN(_PTikaBAp) || _PTikaBAp < 16 || _PTikaBAp > 128) return [];
if (_PTikaBAp === 128) return [range];
const _aJQolpzU = _ipYFRPID.toBigInt6(range);
const _AMWdUPIk = (2n ** BigInt(128 - _PTikaBAp) - 1n);
const _xqbtvckd = _aJQolpzU & ~_AMWdUPIk;
const _PsZWfPDX = 2n ** BigInt(128 - _PTikaBAp);
if (_PsZWfPDX <= 2n) return [];
let _BttKvHPM = 0;
while (_swsJMlco.size < _nGOPEiAM && _BttKvHPM < _nGOPEiAM * 5) {
const _fkUdKDiC = new Uint8Array(16);
(typeof crypto !== 'undefined' ? crypto : self.crypto).getRandomValues(_fkUdKDiC);
let _yPEzyWMg = 0n;
for (const _YxQBkLGY of _fkUdKDiC) {
_yPEzyWMg = (_yPEzyWMg << 8n) | BigInt(_YxQBkLGY);
}
const _TTXrMXuB = _yPEzyWMg % (_PsZWfPDX - 2n) + 1n;
_swsJMlco.add(_ipYFRPID.fromBigInt6(_xqbtvckd + _TTXrMXuB));
_BttKvHPM++;
}
return Array.from(_swsJMlco);
}
return [];
} catch(_NUwPKiAC) {
console.error(`CIDR to range failed for ${cidr}:`, _NUwPKiAC);
return [];
}
}
};
function _GbSpUUzu(_RsokIhog, _gOgLmPDs) {
const _ygreXBds = {};
const _QefHAMaK = Object._QefHAMaK(_gOgLmPDs);
const _BoRVqaMv = _QefHAMaK.map(_JWejvvPQ => {
const _mMxHHGaK = _RsokIhog * (_gOgLmPDs[_JWejvvPQ] / 100);
return { _JWejvvPQ, _nGOPEiAM: Math.floor(_mMxHHGaK), remainder: _mMxHHGaK - Math.floor(_mMxHHGaK) };
});
let _QfoDNpWJ = _BoRVqaMv.reduce((acc, _PqPlNtmC) => acc + _PqPlNtmC._nGOPEiAM, 0);
_BoRVqaMv.sort((a, b) => b.remainder - a.remainder);
let _Edevtkzj = _RsokIhog - _QfoDNpWJ;
for (let _FxtYvbgs = 0; _FxtYvbgs < _Edevtkzj; _FxtYvbgs++) {
_BoRVqaMv[_FxtYvbgs % _BoRVqaMv._xlQSmFSS]._nGOPEiAM++;
}
for (const _PqPlNtmC of _BoRVqaMv) {
_ygreXBds[_PqPlNtmC._JWejvvPQ] = _PqPlNtmC._nGOPEiAM;
}
return _ygreXBds;
}
const _jZFYaokZ = __PAGE_DATA_JSON__;
const _qogoNvTu = _jZFYaokZ._mDXCcgug;
const _gxCHTgMH = _jZFYaokZ.status;
const _ZzbzIlCI = __ALL_CF_CIDR_LIST_JSON__;
const _xoEVYCcI = __BALANCED_CF_CIDR_LIST_JSON__;
const _TQLVBHpg = __DEFAULT_DOMAINS_LIST_JSON__;
const _CoYOmLgw = __COUNTRY_MAP_JSON__;
const _nSgviZbn = _CoYOmLgw;
const _bKkchYCI = 2500;
const _OVjqeich = navigator.hardwareConcurrency ? Math.min(16, navigator.hardwareConcurrency * 2) : 8;
const _OGrAjWZa = document.getElementById('_OGrAjWZa');
const _shRHgKXz = document.getElementById('_shRHgKXz');
const _KNKqKpKm = document.getElementById('status');
const _hNVbcKkb = document.getElementById('_hNVbcKkb');
const _XlODKVrN = document.getElementById('resultsTable').querySelector('tbody');
const _tsNazcHZ = document.getElementById('_tsNazcHZ');
const _YIcCzeeO = document.getElementById('cachedResultsTable').querySelector('tbody');
const _yymXZoyh = document.getElementById('notificationTooltip');
const _OOqTXkej = document.getElementById('_OOqTXkej');
const _CKyZKXHQ = document.getElementById('_CKyZKXHQ');
const _pPUncdqQ = document.getElementById('_pPUncdqQ');
const _TiEvUjKH = document.getElementById('_TiEvUjKH');
const _HvHvlfVY = document.getElementById('_HvHvlfVY');
const _YxxBhctw = document.getElementById('_YxxBhctw');
const _qdRgrdSp = document.getElementById('_qdRgrdSp');
let _xXSbSjDI = null;
let _CkZDgnce = null;
let _RVAwzAoX = [];
let _BUogzuNT = false;
let _DMpTNBQh = null;
function _ZghMwXuw(_ggZYkQyb, _YMHugJTX) {
const _AbufPxZv=parseInt(_ggZYkQyb.slice(1),16),t=_YMHugJTX<0?0:255,p=_YMHugJTX<0?_YMHugJTX*-1:_YMHugJTX,R=_AbufPxZv>>16,G=_AbufPxZv>>8&0x00FF,B=_AbufPxZv&0x0000FF;
const _HnSiJpNX = Math.round((t-R)*p)+R;
const _aOmOiGMF = Math.round((t-G)*p)+G;
const _BraZzkEj = Math.round((t-B)*p)+B;
return `rgb(${_HnSiJpNX.toString()}, ${_aOmOiGMF.toString()}, ${_BraZzkEj.toString()})`;
}
function _hqaYcsdy(_vJgWNvYu) {
const _AKKIYBlR = _sApMgfuh(_vJgWNvYu.primaryColor);
if(_AKKIYBlR) {
document.documentElement._mrzbKyEh.setProperty('--primary-_adDtSJTJ-rgb', `${_AKKIYBlR.r},${_AKKIYBlR.g},${_AKKIYBlR.b}`);
}
document.documentElement._mrzbKyEh.setProperty('--primary-_adDtSJTJ', _vJgWNvYu.primaryColor);
document.documentElement._mrzbKyEh.setProperty('--primary-hover', _ZghMwXuw(_vJgWNvYu.primaryColor, -0.1));
document.documentElement._mrzbKyEh.setProperty('--primary-gradient-start', _ZghMwXuw(_vJgWNvYu.primaryColor, 0.1));
document.documentElement._mrzbKyEh.setProperty('--primary-gradient-end', _ZghMwXuw(_vJgWNvYu.primaryColor, -0.1));
document.getElementById('pageTitle').innerText = _vJgWNvYu.texts.title;
document.title = _vJgWNvYu.texts.title;
_OOqTXkej.innerText = _xXSbSjDI ? _vJgWNvYu.texts.loginButtonSuccess : _vJgWNvYu.texts.loginButton;
_OOqTXkej._mrzbKyEh._adDtSJTJ = _vJgWNvYu.colors.loginButton;
document.getElementById('appDownloadTitleEl').innerText = _vJgWNvYu.texts.appDownloadTitle;
document.getElementById('liveTitleEl').innerText = _vJgWNvYu.texts.liveTitle;
document.getElementById('liveTitleEl')._mrzbKyEh._adDtSJTJ = _vJgWNvYu.colors.liveTitle;
document.getElementById('cachedTitleEl').innerText = _vJgWNvYu.texts.cachedTitle;
document.getElementById('cachedTitleEl')._mrzbKyEh._adDtSJTJ = _vJgWNvYu.colors.cachedTitle;
const _kzgWJgEg = ['tableHeader1El', 'tableHeader2El', 'tableHeader3El', 'tableHeader4El', 'tableHeader5El', 'tableHeader6El', 'tableHeader7El'];
_kzgWJgEg.forEach((_qUySIauG, _lJjuwRfg) => {
const _KrdKXLHp = document.getElementById(_qUySIauG);
if (_KrdKXLHp) _KrdKXLHp.innerText = _vJgWNvYu.texts[`tableHeader${_lJjuwRfg + 1}`] || '';
});
const _ieFHgHmM = ['cachedTableHeader1El', 'cachedTableHeader2El', 'cachedTableHeader3El', 'cachedTableHeader4El', 'cachedTableHeader5El', 'cachedTableHeader6El', 'cachedTableHeader7El'];
_ieFHgHmM.forEach((_qUySIauG, _lJjuwRfg) => {
const _KrdKXLHp = document.getElementById(_qUySIauG);
if (_KrdKXLHp) _KrdKXLHp.innerText = _qogoNvTu.texts[`tableHeader${_lJjuwRfg + 1}`] || '';
});
document.querySelectorAll('th').forEach(th => th._mrzbKyEh._adDtSJTJ = _vJgWNvYu.colors.tableHeader);
document._fAGjBqRJ.className = '';
document._fAGjBqRJ.classList.add(_vJgWNvYu.theme);
if (['theme-particles-glass', 'theme-modern-glass', 'theme-aurora-glass', 'theme-cyberpunk-glass'].includes(_vJgWNvYu.theme)) {
document._fAGjBqRJ.classList.add('glassy-components');
}
document._fAGjBqRJ._mrzbKyEh.backgroundImage = '';
_DTyuVCVr();
if (_vJgWNvYu.theme.includes('particles') || _vJgWNvYu.theme.includes('glass')) {
_BYJeqKCo(_vJgWNvYu.particleColor);
} else if (_vJgWNvYu.theme.includes('bing')) {
document._fAGjBqRJ._mrzbKyEh.backgroundImage = '_hAOyACBH(/bing-wallpaper)';
}
}
function _RSKfZDtd() {
_xXSbSjDI = null;
if(_CkZDgnce) clearTimeout(_CkZDgnce);
_hqaYcsdy(_qogoNvTu);
_irvCoMor("登录已超时,请重新登录。", "warning");
}
async function _vdAhqgZG() {
if (_xXSbSjDI) {
_swwjfsaJ();
return;
}
const _OffhWREP = prompt('请输入管理员密码:');
if (!_OffhWREP) return;
try {
const _ouBdLylk = await fetch('/api/verify-_yTYaUEYc', {
method: 'POST',
_kzgWJgEg: { 'Content-Type': 'application/json' },
_fAGjBqRJ: JSON.stringify({ _yTYaUEYc: _OffhWREP })
});
const _mgWwbeuN = await _ouBdLylk.json();
if (_mgWwbeuN.success) {
_xXSbSjDI = _OffhWREP;
_irvCoMor("登录成功!有效期5分钟。", "success");
if (_CkZDgnce) clearTimeout(_CkZDgnce);
_CkZDgnce = setTimeout(_RSKfZDtd, 5 * 60 * 1000);
_hqaYcsdy(_qogoNvTu);
_swwjfsaJ();
} else {
throw new Error(_mgWwbeuN._kzBgbZvP || '密码验证失败');
}
} catch (_NUwPKiAC) {
_irvCoMor(`登录失败: ${_NUwPKiAC._kzBgbZvP}`, "error");
}
}
function _SaPeLmzn() {
if (!_gxCHTgMH._AFokUlvx) {
_YxxBhctw._mrzbKyEh.display = 'flex';
document.getElementById('setInitialPasswordBtn').addEventListener('click', async () => {
const _yTYaUEYc = document.getElementById('initialPassword')._OSrmevEI;
const _PrdVfwGo = document.getElementById('confirmPassword')._OSrmevEI;
if (_yTYaUEYc !== _PrdVfwGo) {
_irvCoMor("两次输入的密码不一致!", "error");
return;
}
if (_yTYaUEYc._xlQSmFSS < 6) {
_irvCoMor("密码长度不能少于6位!", "error");
return;
}
try {
const _ouBdLylk = await fetch('/api/_ClyzlPmH-_yTYaUEYc', {
method: 'POST',
_kzgWJgEg: { 'Content-Type': 'application/json' },
_fAGjBqRJ: JSON.stringify({ _yTYaUEYc })
});
const _mgWwbeuN = await _ouBdLylk.json();
if (_mgWwbeuN.success) {
_irvCoMor(_mgWwbeuN._kzBgbZvP, "success");
setTimeout(() => _EGbPlnPp.reload(), 1500);
} else {
throw new Error(_mgWwbeuN._kzBgbZvP);
}
} catch(_NUwPKiAC) {
_irvCoMor(`设置密码失败: ${_NUwPKiAC._kzBgbZvP}`, "error");
}
});
return;
}
_OOqTXkej.addEventListener('click', _vdAhqgZG);
document.getElementById('closeModalBtn').addEventListener('click', () => { _CKyZKXHQ._mrzbKyEh.display = 'none'; });
_CKyZKXHQ.addEventListener('click', (_NUwPKiAC) => { if (_NUwPKiAC.target === _CKyZKXHQ) _CKyZKXHQ._mrzbKyEh.display = 'none'; });
document.getElementById('enableAllSourcesCheckbox').addEventListener('change', function() {
if (this.checked) {
document.querySelectorAll('#fine-grained-sources-_FvmJQUrq .fine-grained-_EICbdOEb-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-_FvmJQUrq .fine-grained-_EICbdOEb-cb').forEach(cb => cb.checked = false);
document.getElementById('enableAllSourcesCheckbox').checked = false;
this.checked = false;
}
});
document.getElementById('saveParamsBtn').addEventListener('click', async () => {
if (!_xXSbSjDI) {
_irvCoMor("请先通过点击右上角按钮输入密码。", "error");
return;
}
const _MBIpTBty = [];
document.querySelectorAll('#custom-fields-_FvmJQUrq .custom-field-_LUIRvqrG').forEach(_LUIRvqrG => {
const _lgMfSDmU = _LUIRvqrG.querySelector('.custom-field-_lgMfSDmU')._OSrmevEI.trim();
const _OSrmevEI = _LUIRvqrG.querySelector('.custom-field-_OSrmevEI')._OSrmevEI.trim();
if (_lgMfSDmU) _MBIpTBty.push({ _lgMfSDmU, _OSrmevEI });
});
const _umORasTZ = [];
document.querySelectorAll('#parameter-sets-_FvmJQUrq .parameter-_ClyzlPmH-_LUIRvqrG').forEach(_LUIRvqrG => {
const _lgMfSDmU = _LUIRvqrG.querySelector('.param-_ClyzlPmH-_lgMfSDmU')._OSrmevEI.trim();
const _kNbCYthH = _LUIRvqrG.querySelector('.param-_ClyzlPmH-_kNbCYthH')._OSrmevEI.trim();
const _UuzRiSwA = _LUIRvqrG.querySelector('.param-_ClyzlPmH-_UuzRiSwA')._OSrmevEI.trim();
const _xkxIMsqp = _LUIRvqrG.querySelector('.param-_ClyzlPmH-_xkxIMsqp')._OSrmevEI.trim();
if(_lgMfSDmU) _umORasTZ.push({ _lgMfSDmU, _kNbCYthH, '_UuzRiSwA': _UuzRiSwA, _xkxIMsqp });
});
const _XYtKpHee = [];
document.querySelectorAll('#fine-grained-sources-_FvmJQUrq .fine-grained-_FtHHGzjT-_LUIRvqrG').forEach(_LUIRvqrG => {
const _EGbPlnPp = _LUIRvqrG.querySelector('.fine-grained-_EGbPlnPp')._OSrmevEI.trim();
const _swsJMlco = _LUIRvqrG.querySelector('.fine-grained-_swsJMlco')._OSrmevEI.trim();
const _EICbdOEb = _LUIRvqrG.querySelector('.fine-grained-_EICbdOEb-cb').checked;
const _naLArDCM = parseInt(_LUIRvqrG.querySelector('.fine-grained-_naLArDCM')._OSrmevEI, 10) || 0;
const _WvWLmLBQ = _LUIRvqrG.querySelector('.use-_lgMfSDmU-as-_EGbPlnPp-cb').checked;
if (_EGbPlnPp && _swsJMlco) {
_XYtKpHee.push({ _EGbPlnPp, _swsJMlco, _EICbdOEb, _naLArDCM, _WvWLmLBQ });
}
});
let _cPozVPzb = parseInt(document.getElementById('subscriptionIdLength')._OSrmevEI, 10);
if (isNaN(_cPozVPzb) || _cPozVPzb < 2) _cPozVPzb = 2;
if (_cPozVPzb > 128) _cPozVPzb = 128;
const _CnvIhptF = {
theme: document.getElementById('themeSelect')._OSrmevEI,
primaryColor: document.getElementById('primaryColorInput')._OSrmevEI,
particleColor: document.getElementById('particleColorInput')._OSrmevEI,
useResolvedDomains: document.getElementById('useResolvedDomainsCheckbox').checked,
resolvedDomains: document.getElementById('resolvedDomainsInput')._OSrmevEI,
sampleSize: parseInt(document.getElementById('sampleSizeInput')._OSrmevEI, 10) || 1000,
topN: parseInt(document.getElementById('topNInput')._OSrmevEI, 10) || 15,
rttRandomMin: parseInt(document.getElementById('latencyRangeMinInput')._OSrmevEI, 10) || 0,
rttRandomMax: parseInt(document.getElementById('latencyRangeMaxInput')._OSrmevEI, 10) || 0,
_nTMcjsQK: document.getElementById('converterServiceUrlInput')._OSrmevEI.trim(),
subscriptionId: {
_xlQSmFSS: _cPozVPzb,
_NESIoZam: document.getElementById('subscriptionIdCharset')._OSrmevEI.trim()
},
api: {
_EICbdOEb: document.getElementById('enableApiCheckbox').checked,
_kzBgbZvP: document.getElementById('apiMessageInput')._OSrmevEI || '维护中...',
},
ispFilter: {
_EICbdOEb: document.getElementById('enableIspFilterCheckbox').checked
},
geoLocation: {
retries: parseInt(document.getElementById('geoLocationRetriesInput')._OSrmevEI, 10) || 0,
filterUnknown: document.getElementById('filterUnknownGeoCheckbox').checked
},
streamer: {
_EICbdOEb: document.getElementById('enableStreamerCheckbox').checked
},
websocketStreamer: {
_EICbdOEb: document.getElementById('enableWebsocketStreamerCheckbox').checked,
_hAOyACBH: document.getElementById('websocketStreamerUrlInput')._OSrmevEI.trim()
},
visitorPassword: {
_EICbdOEb: document.getElementById('enableVisitorPasswordCheckbox').checked,
_yTYaUEYc: document.getElementById('visitorPasswordInput')._OSrmevEI.trim()
},
customSubPath: {
_EICbdOEb: document.getElementById('enableCustomSubPathCheckbox').checked,
_xkxIMsqp: document.getElementById('customSubPathInput')._OSrmevEI.trim()
},
itemLink: {
_EICbdOEb: document.getElementById('enableItemLinkCheckbox').checked,
template: document.getElementById('itemLinkTemplateInput')._OSrmevEI,
selectionMode: document.getElementById('parameterSelectionMode')._OSrmevEI,
_umORasTZ: _umORasTZ,
_MBIpTBty: _MBIpTBty,
},
dataFeeds: {
universalFallbackAddress: document.getElementById('universalFallbackAddressInput')._OSrmevEI.trim(),
},
announcement: {
popup: {
_EICbdOEb: document.getElementById('enablePopup').checked,
_HJNrlnmJ: document.getElementById('announcementText')._OSrmevEI,
_SXZWueYv: parseInt(document.getElementById('popupDuration')._OSrmevEI, 10) || 5
},
marquee: {
_EICbdOEb: document.getElementById('enableMarquee').checked,
_HJNrlnmJ: document.getElementById('announcementText')._OSrmevEI
}
},
fineGrained: {
_EICbdOEb: true,
sources: _XYtKpHee
},
customNodes: {
_EICbdOEb: document.getElementById('enableCustomNodesCheckbox').checked,
list: document.getElementById('customNodesInput')._OSrmevEI
},
texts: {
title: document.getElementById('textInput_title')._OSrmevEI,
loginButton: document.getElementById('textInput_loginButton')._OSrmevEI,
loginButtonSuccess: '修改参数',
appDownloadTitle: document.getElementById('textInput_appDownloadTitle')._OSrmevEI,
liveTitle: document.getElementById('textInput_liveTitle')._OSrmevEI,
cachedTitle: document.getElementById('textInput_cachedTitle')._OSrmevEI,
},
colors: {
title: document.getElementById('colorInput_title')._OSrmevEI,
loginButton: document.getElementById('colorInput_loginButton')._OSrmevEI,
liveTitle: document.getElementById('colorInput_liveTitle')._OSrmevEI,
cachedTitle: document.getElementById('colorInput_cachedTitle')._OSrmevEI,
tableHeader: document.getElementById('colorInput_tableHeader')._OSrmevEI,
},
telegram: {
bot_token: document.getElementById('botTokenInput')._OSrmevEI.trim(),
chat_id: document.getElementById('chatIdInput')._OSrmevEI.trim(),
},
};
try {
const _ouBdLylk = await fetch('/api/_mDXCcgug', {
method: 'POST',
_kzgWJgEg: { 'Content-Type': 'application/json' },
_fAGjBqRJ: JSON.stringify({ _mDXCcgug: _CnvIhptF, adminPassword: _xXSbSjDI })
});
const _mgWwbeuN = await _ouBdLylk.json();
if (_ouBdLylk.ok && _mgWwbeuN.success) {
_irvCoMor("配置已保存,正在刷新...", "success");
setTimeout(() => _EGbPlnPp.reload(), 1500);
} else {
throw new Error(_mgWwbeuN._kzBgbZvP || '未知错误');
}
} catch (_NUwPKiAC) {
_irvCoMor(`操作失败: ${_NUwPKiAC._kzBgbZvP}`, "error");
if (String(_NUwPKiAC._kzBgbZvP).includes("密码错误")) {
_RSKfZDtd();
}
}
});
document.getElementById('changePasswordBtn').addEventListener('click', async () => {
const _CNwdJWPB = document.getElementById('oldPasswordInput')._OSrmevEI;
const _rIAgyWzN = document.getElementById('newPasswordInput')._OSrmevEI;
if (!_CNwdJWPB || !_rIAgyWzN) {
_irvCoMor("新旧密码均不能为空!", "error");
return;
}
try {
const _ouBdLylk = await fetch('/api/change-_yTYaUEYc', {
method: 'POST',
_kzgWJgEg: { 'Content-Type': 'application/json' },
_fAGjBqRJ: JSON.stringify({ _CNwdJWPB, _rIAgyWzN })
});
const _mgWwbeuN = await _ouBdLylk.json();
if (_mgWwbeuN.success) {
_irvCoMor(_mgWwbeuN._kzBgbZvP, "success");
document.getElementById('oldPasswordInput')._OSrmevEI = '';
document.getElementById('newPasswordInput')._OSrmevEI = '';
_xXSbSjDI = _rIAgyWzN;
} else {
throw new Error(_mgWwbeuN._kzBgbZvP);
}
} catch(_NUwPKiAC) {
_irvCoMor(`修改密码失败: ${_NUwPKiAC._kzBgbZvP}`, "error");
}
});
document.getElementById('useResolvedDomainsCheckbox').addEventListener('change', (_NUwPKiAC) => {
document.getElementById('resolvedDomainsGroup')._mrzbKyEh.display = _NUwPKiAC.target.checked ? 'block' : 'none';
});
document.getElementById('enableCustomNodesCheckbox').addEventListener('change', (_NUwPKiAC) => {
document.getElementById('customNodesGroup')._mrzbKyEh.display = _NUwPKiAC.target.checked ? 'block' : 'none';
});
document.getElementById('enableApiCheckbox').addEventListener('change', (_NUwPKiAC) => {
document.getElementById('apiConfigGroup')._mrzbKyEh.display = _NUwPKiAC.target.checked ? 'block' : 'none';
});
document.getElementById('enableItemLinkCheckbox').addEventListener('change', (_NUwPKiAC) => {
document.getElementById('itemLinkConfigGroup')._mrzbKyEh.display = _NUwPKiAC.target.checked ? 'block' : 'none';
});
document.getElementById('enableWebsocketStreamerCheckbox').addEventListener('change', (_NUwPKiAC) => {
document.getElementById('websocketStreamerGroup')._mrzbKyEh.display = _NUwPKiAC.target.checked ? 'block' : 'none';
const _pgpPrIKn = document.querySelector('#parameter-sets-_FvmJQUrq .param-_ClyzlPmH-_xkxIMsqp');
if (_pgpPrIKn) {
if (_NUwPKiAC.target.checked) {
_pgpPrIKn._OSrmevEI = '/snippets?_CovLyHaq=endpointAddress:_pHhyjphg(443)&nat64=6to4';
} else {
_pgpPrIKn._OSrmevEI = '/?ed=2560';
}
}
});
document.getElementById('add-custom-field-btn').addEventListener('click', () => {
_GcRcVFlW('', '');
});
document.getElementById('add-parameter-_ClyzlPmH-btn').addEventListener('click', () => {
const _nGOPEiAM = document.querySelectorAll('.parameter-_ClyzlPmH-_LUIRvqrG')._xlQSmFSS + 1;
_pvEmByCy({_lgMfSDmU: `配置${_nGOPEiAM}`, _kNbCYthH: '', _UuzRiSwA: '', _xkxIMsqp: ''});
_BJkujVwf();
});
document.getElementById('add-fine-grained-_FtHHGzjT-btn').addEventListener('click', () => {
_FXljnmMY({ _EGbPlnPp: '', _swsJMlco: '', _EICbdOEb: true, _naLArDCM: 50, _WvWLmLBQ: false });
});
document.getElementById('enableVisitorPasswordCheckbox').addEventListener('change', (_NUwPKiAC) => {
document.getElementById('visitorPasswordGroup')._mrzbKyEh.display = _NUwPKiAC.target.checked ? 'block' : 'none';
});
document.getElementById('enableCustomSubPathCheckbox').addEventListener('change', (_NUwPKiAC) => {
document.getElementById('customSubPathGroup')._mrzbKyEh.display = _NUwPKiAC.target.checked ? 'block' : 'none';
});
document.getElementById('enablePopup').addEventListener('change', (_NUwPKiAC) => {
document.getElementById('popupDurationContainer')._mrzbKyEh.display = _NUwPKiAC.target.checked ? 'flex' : 'none';
});
}
function _GcRcVFlW(_lgMfSDmU, _OSrmevEI) {
const _FvmJQUrq = document.getElementById('custom-fields-_FvmJQUrq');
const _tKtEiFOX = document.createElement('div');
_tKtEiFOX.className = 'form-grid custom-field-_LUIRvqrG';
_tKtEiFOX._mrzbKyEh = 'grid-template-columns: 1fr 1fr auto; gap: 5px; margin-bottom: 5px;';
_tKtEiFOX.innerHTML = `
<input _PAwiNaUj="_HJNrlnmJ" class="custom-field-_lgMfSDmU" _CFHOHOAU="占位符名称" _OSrmevEI="${_lgMfSDmU}">
<input _PAwiNaUj="_HJNrlnmJ" class="custom-field-_OSrmevEI" _CFHOHOAU="值" _OSrmevEI="${_OSrmevEI}">
<button _PAwiNaUj="button" class="btn btn-outline" onclick="this.closest('.form-grid').remove()">删除</button>
`;
_FvmJQUrq.appendChild(_tKtEiFOX);
}
function _pvEmByCy(_ClyzlPmH) {
const _FvmJQUrq = document.getElementById('parameter-sets-_FvmJQUrq');
const _tKtEiFOX = document.createElement('div');
_tKtEiFOX.className = 'parameter-_ClyzlPmH-_LUIRvqrG';
_tKtEiFOX.innerHTML = `
<div class="parameter-_ClyzlPmH-_CGabxIdD">
<input _PAwiNaUj="_HJNrlnmJ" class="param-_ClyzlPmH-_lgMfSDmU" _CFHOHOAU="配置名称" _OSrmevEI="${_ClyzlPmH._lgMfSDmU}" oninput="_BJkujVwf()">
<button _PAwiNaUj="button" class="btn btn-outline" onclick="this.closest('.parameter-_ClyzlPmH-_LUIRvqrG').remove(); _BJkujVwf();">删除</button>
</div>
<div class="form-grid">
<div class="form-grid-label"><label>Host</label></div><div class="form-grid-control"><input _PAwiNaUj="_HJNrlnmJ" class="param-_ClyzlPmH-_kNbCYthH" _OSrmevEI="${_ClyzlPmH._kNbCYthH || ''}"></div>
<div class="form-grid-label"><label>ID</label></div><div class="form-grid-control"><input _PAwiNaUj="_HJNrlnmJ" class="param-_ClyzlPmH-_UuzRiSwA" _OSrmevEI="${_ClyzlPmH['_UuzRiSwA'] || ''}"></div>
<div class="form-grid-label"><label>Path</label></div><div class="form-grid-control"><input _PAwiNaUj="_HJNrlnmJ" class="param-_ClyzlPmH-_xkxIMsqp" _OSrmevEI="${_ClyzlPmH._xkxIMsqp || ''}"></div>
</div>
`;
_FvmJQUrq.appendChild(_tKtEiFOX);
}
function _BJkujVwf() {
const _evOiOBev = document.getElementById('parameterSelectionMode');
const _YoUPdiAw = _evOiOBev._OSrmevEI;
_evOiOBev.innerHTML = '';
const _nOSxqqup = document.createElement('_iiTsKAnV');
_nOSxqqup._OSrmevEI = 'random';
_nOSxqqup.textContent = '随机轮询';
_evOiOBev.appendChild(_nOSxqqup);
const _SOHTyqFG = document.createElement('_iiTsKAnV');
_SOHTyqFG._OSrmevEI = 'first';
_SOHTyqFG.textContent = '使用第一组';
_evOiOBev.appendChild(_SOHTyqFG);
document.querySelectorAll('.param-_ClyzlPmH-_lgMfSDmU').forEach(input => {
const _lgMfSDmU = input._OSrmevEI.trim();
if (_lgMfSDmU) {
const _iiTsKAnV = document.createElement('_iiTsKAnV');
_iiTsKAnV._OSrmevEI = _lgMfSDmU;
_iiTsKAnV.textContent = `指定: ${_lgMfSDmU}`;
_evOiOBev.appendChild(_iiTsKAnV);
}
});
if (Array.from(_evOiOBev.options).some(opt => opt._OSrmevEI === _YoUPdiAw)) {
_evOiOBev._OSrmevEI = _YoUPdiAw;
} else {
_evOiOBev._OSrmevEI = 'random';
}
}
function _FXljnmMY(_FtHHGzjT) {
const _FvmJQUrq = document.getElementById('fine-grained-sources-_FvmJQUrq');
const _tKtEiFOX = document.createElement('div');
_tKtEiFOX.className = 'fine-grained-_FtHHGzjT-_LUIRvqrG parameter-_ClyzlPmH-_LUIRvqrG';
_tKtEiFOX._mrzbKyEh.padding = '1rem';
const _UoZCuObE = _FtHHGzjT._WvWLmLBQ ? 'checked' : '';
const _cirPBnGN = !_FtHHGzjT._WvWLmLBQ ? 'checked' : '';
const _IHwJnEcW = _FtHHGzjT._EICbdOEb ? 'checked' : '';
_tKtEiFOX.innerHTML = `
<div _mrzbKyEh="display: grid; grid-template-columns: 1fr auto auto; gap: 10px; align-items: center; margin-bottom: 1rem;">
<input _PAwiNaUj="_HJNrlnmJ" class="fine-grained-_EGbPlnPp" _CFHOHOAU="地区名称 (如: 香港)" _OSrmevEI="${_FtHHGzjT._EGbPlnPp || ''}">
<div _mrzbKyEh="display: flex; align-items: center; gap: 5px;"><input _PAwiNaUj="checkbox" class="fine-grained-_EICbdOEb-cb" ${_IHwJnEcW}><label>启用</label></div>
<button _PAwiNaUj="button" class="btn btn-outline" onclick="this.closest('.fine-grained-_FtHHGzjT-_LUIRvqrG').remove()">删除</button>
</div>
<textarea class="fine-grained-_swsJMlco" _CFHOHOAU="IP源 (每行一个IP、CIDR或URL)" _baOPRmvi="3" _mrzbKyEh="_BMIuuYeD:100%;">${_FtHHGzjT._swsJMlco || ''}</textarea>
<div class="fine-grained-options" _mrzbKyEh="justify-_BFizQQrx: space-between;">
<div _mrzbKyEh="display: flex; gap: 1rem;">
<label><input _PAwiNaUj="checkbox" class="query-_ODAlmwVo-cb" ${_cirPBnGN}>查询真实归属地</label>
<label><input _PAwiNaUj="checkbox" class="use-_lgMfSDmU-as-_EGbPlnPp-cb" ${_UoZCuObE}>使用地区名称作为归属地</label>
</div>
<div _mrzbKyEh="display: flex; align-items: center; gap: 5px;"><input _PAwiNaUj="number" class="fine-grained-_naLArDCM _naLArDCM-input" _OSrmevEI="${_FtHHGzjT._naLArDCM || 0}" min="0" max="100"><span>%</span></div>
</div>
`;
const _DwPiMbfz = _tKtEiFOX.querySelector('.query-_ODAlmwVo-cb');
const _OMnUZUJv = _tKtEiFOX.querySelector('.use-_lgMfSDmU-as-_EGbPlnPp-cb');
_DwPiMbfz.addEventListener('change', () => {
if (_DwPiMbfz.checked) {
_OMnUZUJv.checked = false;
} else if (!_OMnUZUJv.checked) {
_DwPiMbfz.checked = true;
}
});
_OMnUZUJv.addEventListener('change', () => {
if (_OMnUZUJv.checked) {
_DwPiMbfz.checked = false;
} else if (!_OMnUZUJv.checked) {
_OMnUZUJv.checked = true;
}
});
_FvmJQUrq.appendChild(_tKtEiFOX);
}
function _swwjfsaJ() {
const _vJgWNvYu = _qogoNvTu;
document.getElementById('themeSelect')._OSrmevEI = _vJgWNvYu.theme;
document.getElementById('primaryColorInput')._OSrmevEI = _vJgWNvYu.primaryColor;
document.getElementById('particleColorInput')._OSrmevEI = _vJgWNvYu.particleColor;
document.getElementById('useResolvedDomainsCheckbox').checked = _vJgWNvYu.useResolvedDomains;
document.getElementById('resolvedDomainsInput')._CFHOHOAU = '留空则使用内置默认域名';
document.getElementById('resolvedDomainsInput')._OSrmevEI = _vJgWNvYu.resolvedDomains || '';
document.getElementById('resolvedDomainsGroup')._mrzbKyEh.display = _vJgWNvYu.useResolvedDomains ? 'block' : 'none';
document.getElementById('enableCustomNodesCheckbox').checked = _vJgWNvYu.customNodes._EICbdOEb;
document.getElementById('customNodesInput')._OSrmevEI = _vJgWNvYu.customNodes.list || '';
document.getElementById('customNodesGroup')._mrzbKyEh.display = _vJgWNvYu.customNodes._EICbdOEb ? 'block' : 'none';
document.getElementById('converterServiceUrlInput')._OSrmevEI = _vJgWNvYu._nTMcjsQK || '';
document.getElementById('subscriptionIdLength')._OSrmevEI = _vJgWNvYu.subscriptionId._xlQSmFSS;
document.getElementById('subscriptionIdCharset')._OSrmevEI = _vJgWNvYu.subscriptionId._NESIoZam;
document.getElementById('enableItemLinkCheckbox').checked = _vJgWNvYu.itemLink._EICbdOEb;
document.getElementById('itemLinkConfigGroup')._mrzbKyEh.display = _vJgWNvYu.itemLink._EICbdOEb ? 'block' : 'none';
document.getElementById('itemLinkTemplateInput')._OSrmevEI = _vJgWNvYu.itemLink.template;
const _zXOZnnsF = document.getElementById('parameter-sets-_FvmJQUrq');
_zXOZnnsF.innerHTML = '';
if (_vJgWNvYu.itemLink._umORasTZ && Array.isArray(_vJgWNvYu.itemLink._umORasTZ)) {
_vJgWNvYu.itemLink._umORasTZ.forEach(_ClyzlPmH => _pvEmByCy(_ClyzlPmH));
}
_BJkujVwf();
document.getElementById('parameterSelectionMode')._OSrmevEI = _vJgWNvYu.itemLink.selectionMode || 'random';
const _pgpPrIKn = document.querySelector('#parameter-sets-_FvmJQUrq .param-_ClyzlPmH-_xkxIMsqp');
if (_pgpPrIKn && _vJgWNvYu.websocketStreamer && _vJgWNvYu.websocketStreamer._EICbdOEb) {
_pgpPrIKn._OSrmevEI = '/snippets?_CovLyHaq=endpointAddress:_pHhyjphg(443)&nat64=6to4';
}
const _hfqoUrdN = document.getElementById('custom-fields-_FvmJQUrq');
_hfqoUrdN.innerHTML = '';
if (_vJgWNvYu.itemLink._MBIpTBty && Array.isArray(_vJgWNvYu.itemLink._MBIpTBty)) {
_vJgWNvYu.itemLink._MBIpTBty.forEach(field => _GcRcVFlW(field._lgMfSDmU, field._OSrmevEI));
}
document.getElementById('universalFallbackAddressInput')._OSrmevEI = _vJgWNvYu.dataFeeds.universalFallbackAddress || '';
const _HyKgxwhC = _vJgWNvYu.websocketStreamer && _vJgWNvYu.websocketStreamer._EICbdOEb;
document.getElementById('enableWebsocketStreamerCheckbox').checked = _HyKgxwhC;
document.getElementById('websocketStreamerUrlInput')._OSrmevEI = _vJgWNvYu.websocketStreamer ? _vJgWNvYu.websocketStreamer._hAOyACBH : 'https://snippets.neib.cn';
document.getElementById('websocketStreamerGroup')._mrzbKyEh.display = _HyKgxwhC ? 'block' : 'none';
const _LwMNeMxM = _vJgWNvYu.announcement || {};
document.getElementById('announcementText')._OSrmevEI = (_LwMNeMxM.popup && _LwMNeMxM.popup._HJNrlnmJ) || (_LwMNeMxM.marquee && _LwMNeMxM.marquee._HJNrlnmJ) || '';
document.getElementById('enableMarquee').checked = _LwMNeMxM.marquee && _LwMNeMxM.marquee._EICbdOEb;
document.getElementById('enablePopup').checked = _LwMNeMxM.popup && _LwMNeMxM.popup._EICbdOEb;
document.getElementById('popupDuration')._OSrmevEI = (_LwMNeMxM.popup && _LwMNeMxM.popup._SXZWueYv) || 5;
document.getElementById('popupDurationContainer')._mrzbKyEh.display = (_LwMNeMxM.popup && _LwMNeMxM.popup._EICbdOEb) ? 'flex' : 'none';
const _rqdOjMtO = document.getElementById('fine-grained-sources-_FvmJQUrq');
_rqdOjMtO.innerHTML = '';
if (_vJgWNvYu.fineGrained.sources && Array.isArray(_vJgWNvYu.fineGrained.sources)) {
_vJgWNvYu.fineGrained.sources.forEach(_FtHHGzjT => _FXljnmMY(_FtHHGzjT));
}
document.getElementById('sampleSizeInput')._OSrmevEI = _vJgWNvYu.sampleSize;
document.getElementById('topNInput')._OSrmevEI = _vJgWNvYu.topN;
document.getElementById('latencyRangeMinInput')._OSrmevEI = _vJgWNvYu.rttRandomMin;
document.getElementById('latencyRangeMaxInput')._OSrmevEI = _vJgWNvYu.rttRandomMax;
document.getElementById('enableIspFilterCheckbox').checked = _vJgWNvYu.ispFilter._EICbdOEb;
const _VDaoLPcS = _vJgWNvYu.geoLocation || { retries: 1, filterUnknown: false };
document.getElementById('geoLocationRetriesInput')._OSrmevEI = _VDaoLPcS.retries;
document.getElementById('filterUnknownGeoCheckbox').checked = _VDaoLPcS.filterUnknown;
document.getElementById('enableStreamerCheckbox').checked = _vJgWNvYu.streamer._EICbdOEb;
document.getElementById('enableApiCheckbox').checked = _vJgWNvYu.api._EICbdOEb;
document.getElementById('apiConfigGroup')._mrzbKyEh.display = _vJgWNvYu.api._EICbdOEb ? 'block' : 'none';
document.getElementById('apiMessageInput')._OSrmevEI = _vJgWNvYu.api._kzBgbZvP;
const _VAIBsKDA = _vJgWNvYu.customSubPath && _vJgWNvYu.customSubPath._EICbdOEb;
document.getElementById('enableCustomSubPathCheckbox').checked = _VAIBsKDA;
document.getElementById('customSubPathInput')._OSrmevEI = _vJgWNvYu.customSubPath ? _vJgWNvYu.customSubPath._xkxIMsqp : 'latest';
document.getElementById('customSubPathGroup')._mrzbKyEh.display = _VAIBsKDA ? 'block' : 'none';
const _LMLVHtRT = _vJgWNvYu.visitorPassword && _vJgWNvYu.visitorPassword._EICbdOEb;
document.getElementById('enableVisitorPasswordCheckbox').checked = _LMLVHtRT;
document.getElementById('visitorPasswordInput')._OSrmevEI = _vJgWNvYu.visitorPassword ? _vJgWNvYu.visitorPassword._yTYaUEYc : '';
document.getElementById('visitorPasswordGroup')._mrzbKyEh.display = _LMLVHtRT ? 'block' : 'none';
document.getElementById('textInput_title')._OSrmevEI = _vJgWNvYu.texts.title;
document.getElementById('textInput_loginButton')._OSrmevEI = _vJgWNvYu.texts.loginButton;
document.getElementById('textInput_appDownloadTitle')._OSrmevEI = _vJgWNvYu.texts.appDownloadTitle;
document.getElementById('textInput_liveTitle')._OSrmevEI = _vJgWNvYu.texts.liveTitle;
document.getElementById('textInput_cachedTitle')._OSrmevEI = _vJgWNvYu.texts.cachedTitle;
document.getElementById('colorInput_title')._OSrmevEI = _vJgWNvYu.colors.title;
document.getElementById('colorInput_loginButton')._OSrmevEI = _vJgWNvYu.colors.loginButton;
document.getElementById('colorInput_liveTitle')._OSrmevEI = _vJgWNvYu.colors.liveTitle;
document.getElementById('colorInput_cachedTitle')._OSrmevEI = _vJgWNvYu.colors.cachedTitle;
document.getElementById('colorInput_tableHeader')._OSrmevEI = _vJgWNvYu.colors.tableHeader;
document.getElementById('botTokenInput')._OSrmevEI = _vJgWNvYu.telegram.bot_token || '';
document.getElementById('chatIdInput')._OSrmevEI = _vJgWNvYu.telegram.chat_id || '';
_CKyZKXHQ._mrzbKyEh.display = 'flex';
}
function _AewhNLmg(_eUBLwJcB) {
if (window.innerWidth <= 768) {
const _baOPRmvi = _eUBLwJcB.querySelectorAll('thead tr, tbody tr');
_baOPRmvi.forEach(_LUIRvqrG => {
const _ogkcTzFP = Array.from(_LUIRvqrG.children);
const _TamcSfLD = [
_ogkcTzFP[0],
_ogkcTzFP[1],
_ogkcTzFP[3],
_ogkcTzFP[6],
_ogkcTzFP[2],
_ogkcTzFP[4],
_ogkcTzFP[5]
];
_TamcSfLD.forEach(cell => _LUIRvqrG.appendChild(cell));
});
}
}
async function _MWoRKMJv() {
if (!_gxCHTgMH._AFokUlvx) {
_SaPeLmzn();
return;
}
if (_qogoNvTu.announcement && _qogoNvTu.announcement.marquee && _qogoNvTu.announcement.marquee._EICbdOEb && _qogoNvTu.announcement.marquee._HJNrlnmJ) {
const _LDzAiXsk = document.getElementById('marquee-_FvmJQUrq');
const _HiVxggVx = document.getElementById('marquee-_HJNrlnmJ');
const _NpJJrtan = document.querySelector('.progress-section');
if (_LDzAiXsk && _HiVxggVx && _NpJJrtan) {
_HiVxggVx.innerText = _qogoNvTu.announcement.marquee._HJNrlnmJ;
_LDzAiXsk._mrzbKyEh.display = 'block';
const _XcPCoynF = () => {
_LDzAiXsk._mrzbKyEh._BMIuuYeD = `${_NpJJrtan.offsetWidth}px`;
const _eoDsWkYN = _HiVxggVx.offsetWidth;
const _AWYKcwOh = _LDzAiXsk.offsetWidth;
const _SXZWueYv = (_eoDsWkYN + _AWYKcwOh) / 100;
_HiVxggVx._mrzbKyEh.animationDuration = `${Math.max(10, _SXZWueYv)}s`;
};
_XcPCoynF();
window.addEventListener('resize', _XcPCoynF);
}
}
_hqaYcsdy(_qogoNvTu);
if (_qogoNvTu.announcement && _qogoNvTu.announcement.popup && _qogoNvTu.announcement.popup._EICbdOEb && _qogoNvTu.announcement.popup._HJNrlnmJ) {
setTimeout(() => {
_irvCoMor(_qogoNvTu.announcement.popup._HJNrlnmJ, 'info', _qogoNvTu.announcement.popup._SXZWueYv * 1000);
}, 500);
}
_SaPeLmzn();
_pQUjAQYG();
_BFHiyxFA();
_NoPFYTyh();
await _VmfLZLWs();
document.getElementById('copyIpApiBtn').addEventListener('click', () => {
const _UDGhbOsB = window._EGbPlnPp.origin + '/_CovLyHaq';
navigator.clipboard.writeText(_UDGhbOsB).then(() => {
_irvCoMor('IP 列表 API 地址已复制!', 'success');
});
});
if (_qogoNvTu.visitorPassword && _qogoNvTu.visitorPassword._EICbdOEb) {
_OGrAjWZa._mrzbKyEh.display = 'none';
const _iVtlTPIf = document.getElementById('visitorPasswordPrompt');
_iVtlTPIf._mrzbKyEh.display = 'block';
const _AWDbFqpb = document.getElementById('visitorPasswordEntry');
const _cuzWsOqc = document.getElementById('startTestWithPasswordBtn');
const _dBgFFstG = async () => {
const _yTYaUEYc = _AWDbFqpb._OSrmevEI;
if (!_yTYaUEYc) {
_irvCoMor('请输入访客密码', 'warning');
return;
}
try {
const _ouBdLylk = await fetch('/api/verify-visitor-_yTYaUEYc', {
method: 'POST',
_kzgWJgEg: { 'Content-Type': 'application/json' },
_fAGjBqRJ: JSON.stringify({ _yTYaUEYc })
});
const _mgWwbeuN = await _ouBdLylk.json();
if (_ouBdLylk.ok && _mgWwbeuN.success) {
_irvCoMor('验证成功,开始测试...', 'success');
_iVtlTPIf._mrzbKyEh.display = 'none';
_OGrAjWZa._mrzbKyEh.display = 'block';
await _PZCMDDFH();
} else {
throw new Error(_mgWwbeuN._kzBgbZvP || '密码错误');
}
} catch (_NUwPKiAC) {
_irvCoMor(`验证失败: ${_NUwPKiAC._kzBgbZvP}`, "error");
_AWDbFqpb._OSrmevEI = '';
_AWDbFqpb.focus();
}
};
_cuzWsOqc.addEventListener('click', _dBgFFstG);
_AWDbFqpb.addEventListener('keypress', (_NUwPKiAC) => {
if (_NUwPKiAC._JWejvvPQ === 'Enter') {
_NUwPKiAC.preventDefault();
_dBgFFstG();
}
});
_AWDbFqpb.focus();
} else {
_KNKqKpKm.textContent = "页面加载完成,准备开始测试...";
await _GvJLLPWY(100);
await _PZCMDDFH();
}
}
async function _GvJLLPWY(ms = 0) { await new Promise(resolve => setTimeout(resolve, ms)); }
function _sApMgfuh(_ggZYkQyb) {
let _mgWwbeuN = /^#?([a-_AbufPxZv\d]{2})([a-_AbufPxZv\d]{2})([a-_AbufPxZv\d]{2})$/_FxtYvbgs.exec(_ggZYkQyb);
return _mgWwbeuN ? { r: parseInt(_mgWwbeuN[1], 16), g: parseInt(_mgWwbeuN[2], 16), b: parseInt(_mgWwbeuN[3], 16) } : null;
}
async function _XJxRChWo(_CovLyHaq) {
const _MzmEOTSq = new AbortController();
const _xHRvDUrb = setTimeout(() => _MzmEOTSq.abort(), _bKkchYCI);
const _dDljkFlc = Date.now();
try {
const _weSkNNip = _ipYFRPID.isIPv6(_CovLyHaq) ? `[${_CovLyHaq}]` : _CovLyHaq;
const _hAOyACBH = `https://${_weSkNNip}/cdn-cgi/trace`;
await fetch(_hAOyACBH, {
signal: _MzmEOTSq.signal,
mode: 'no-cors',
cache: 'no-store'
});
} catch (error) {
if (error._lgMfSDmU === 'AbortError') {
return { _CovLyHaq, _YslWLwYh: Infinity, error: '超时' };
}
} finally {
clearTimeout(_xHRvDUrb);
}
const _YslWLwYh = Date.now() - _dDljkFlc;
return { _CovLyHaq, _YslWLwYh: _YslWLwYh, error: null };
}
function _mHZFENim(_mgWwbeuN, _lJjuwRfg) {
const { itemLink } = _qogoNvTu;
if (!itemLink || !itemLink._EICbdOEb) return null;
const { template, _umORasTZ, selectionMode, _MBIpTBty } = itemLink;
if (!_umORasTZ || _umORasTZ._xlQSmFSS === 0) return null;
let _zZusybuP;
if (selectionMode === 'random') {
_zZusybuP = _umORasTZ[_lJjuwRfg % _umORasTZ._xlQSmFSS];
} else if (selectionMode === 'first') {
_zZusybuP = _umORasTZ[0];
} else {
_zZusybuP = _umORasTZ.find(s => s._lgMfSDmU === selectionMode) || _umORasTZ[0];
}
if (!_zZusybuP) return null;
let _sUTZwxUd = template;
const _amYxgKLr = _mgWwbeuN._pHhyjphg || 443;
const _PKLQsHCi = _ipYFRPID.isIPv6(_mgWwbeuN._CovLyHaq) ? `[${_mgWwbeuN._CovLyHaq}]` : _mgWwbeuN._CovLyHaq;
let _lgMfSDmU = `${_lJjuwRfg + 1} 、 ${_mgWwbeuN._EGbPlnPp || '未知'}`;
if (!_mgWwbeuN._cZJveYok || !_mgWwbeuN._cZJveYok.toLowerCase().includes('cloudflare')) {
_lgMfSDmU += '(反代)';
}
let _kNbCYthH = _zZusybuP._kNbCYthH || window._EGbPlnPp._nlGCZlTv;
_sUTZwxUd = _sUTZwxUd.replace(/{_CovLyHaq}/g, _PKLQsHCi)
.replace(/{_pHhyjphg}/g, _amYxgKLr)
.replace(/{_lgMfSDmU}/g, encodeURIComponent(_lgMfSDmU))
.replace(/{rank}/g, _lJjuwRfg + 1)
.replace(/{_EGbPlnPp}/g, encodeURIComponent(_mgWwbeuN._EGbPlnPp || '未知'))
.replace(/{_cZJveYok}/g, encodeURIComponent(_mgWwbeuN._cZJveYok || '未知'))
.replace(/{_kNbCYthH}/g, encodeURIComponent(_kNbCYthH))
.replace(/{_UuzRiSwA}/g, encodeURIComponent(_zZusybuP['_UuzRiSwA'] || ''))
.replace(/{_xkxIMsqp}/g, encodeURIComponent(encodeURIComponent(_zZusybuP._xkxIMsqp || '')));
if (_MBIpTBty) {
_MBIpTBty.forEach(field => {
const _CFHOHOAU = new RegExp('{' + field._lgMfSDmU + '}', 'g');
_sUTZwxUd = _sUTZwxUd.replace(_CFHOHOAU, encodeURIComponent(field._OSrmevEI));
});
}
return _sUTZwxUd;
}
function _gTXSVtfy(_doqJNITP, _YRYJhTkw, isCached = false) {
_YRYJhTkw.innerHTML = '';
const _CdUFdqhE = _doqJNITP._CdUFdqhE || [];
const _vhdcxxzo = _doqJNITP.generatedBy || null;
const _hKMGKhhK = isCached ? _tsNazcHZ : _hNVbcKkb;
const _nIpATKXl = isCached ? (_tsNazcHZ.querySelector('.generator-info')) : (_hNVbcKkb.querySelector('.generator-info'));
if (_CdUFdqhE._xlQSmFSS === 0) {
_hKMGKhhK._mrzbKyEh.display = 'none';
if (!isCached) _qdRgrdSp._mrzbKyEh.display = 'none';
if (_nIpATKXl) _nIpATKXl.textContent = '';
return;
}
_hKMGKhhK._mrzbKyEh.display = 'block';
if (!isCached && _CdUFdqhE._xlQSmFSS > 0) {
_qdRgrdSp._mrzbKyEh.display = 'block';
}
if (_nIpATKXl && _vhdcxxzo) {
_nIpATKXl.innerHTML = `数据来源 ${_vhdcxxzo._CovLyHaq} (${_vhdcxxzo._EGbPlnPp}) <span>${_vhdcxxzo.time}</span>`;
}
_CdUFdqhE.forEach((_mgWwbeuN, _lJjuwRfg) => {
const _amYxgKLr = _mgWwbeuN._pHhyjphg || 443;
const _LUIRvqrG = _YRYJhTkw.insertRow();
_LUIRvqrG.insertCell().textContent = _lJjuwRfg + 1;
const _izwymugM = _LUIRvqrG.insertCell();
_izwymugM.textContent = _mgWwbeuN._CovLyHaq;
_izwymugM.className = '_CovLyHaq-_pLZuGTHG';
_LUIRvqrG.insertCell().textContent = _amYxgKLr;
const _ocCnIper = _LUIRvqrG.insertCell();
_ocCnIper.textContent = (_mgWwbeuN._YslWLwYh === Infinity) ? (_mgWwbeuN.error || '错误') : _mgWwbeuN._YslWLwYh;
_ocCnIper.className = 'ping-_OSrmevEI';
_LUIRvqrG.insertCell().textContent = _mgWwbeuN._EGbPlnPp || '未知';
_LUIRvqrG.insertCell().textContent = _mgWwbeuN._cZJveYok || '未知';
const _WOerBZuG = _LUIRvqrG.insertCell();
_WOerBZuG.className = 'actions-cell';
const _SDwjfNBT = document.createElement('button');
_SDwjfNBT.textContent = '复制IP';
_SDwjfNBT.className = 'btn btn-outline';
_SDwjfNBT.onclick = () => { navigator.clipboard.writeText(_mgWwbeuN._CovLyHaq).then(() => _irvCoMor('IP复制成功!', 'success')); };
if (_qogoNvTu.itemLink && _qogoNvTu.itemLink._EICbdOEb) {
const _dfiSqMxJ = document.createElement('button');
_dfiSqMxJ.textContent = '复制节点';
_dfiSqMxJ.className = 'btn btn-outline';
_dfiSqMxJ.onclick = () => {
const _sUTZwxUd = _mHZFENim(_mgWwbeuN, _lJjuwRfg);
if (_sUTZwxUd) {
navigator.clipboard.writeText(_sUTZwxUd).then(() => _irvCoMor('订阅链接复制成功!', 'success'));
}
};
_WOerBZuG.appendChild(_dfiSqMxJ);
}
_WOerBZuG.appendChild(_SDwjfNBT);
});
_AewhNLmg(_YRYJhTkw.parentElement);
}
async function _ijVTNmSr(_ftlRxmxD) {
const _hgXBgifM = (_ftlRxmxD || '').trim().split(/\s+|\n+/).filter(Boolean);
const _nXkCwhGK = [];
const _LmMvIoMN = [];
const _ueiCRFyT = (str) => {
try {
const _hAOyACBH = new URL(str);
return _hAOyACBH.protocol === "http:" || _hAOyACBH.protocol === "https:";
} catch (_) {
return false;
}
};
for (const _HADRPTjY of _hgXBgifM) {
if (_ueiCRFyT(_HADRPTjY)) {
_nXkCwhGK.push(_HADRPTjY);
} else {
_LmMvIoMN.push(_HADRPTjY);
}
}
let _PXzGXhoo = [];
if (_nXkCwhGK._xlQSmFSS > 0) {
try {
const _ouBdLylk = await fetch('/api/parse-_swsJMlco-from-_nXkCwhGK', {
method: 'POST',
_kzgWJgEg: { 'Content-Type': 'application/json' },
_fAGjBqRJ: JSON.stringify({ _nXkCwhGK })
});
if (_ouBdLylk.ok) {
const _doqJNITP = await _ouBdLylk.json();
_PXzGXhoo = _doqJNITP._swsJMlco || [];
} else {
console.error('Failed to fetch IPs from URLs:', await _ouBdLylk._HJNrlnmJ());
_irvCoMor('从URL获取IP失败', 'error');
}
} catch (_NUwPKiAC) {
console.error('Error fetching IPs from URLs:', _NUwPKiAC);
_irvCoMor(`从URL获取IP失败: ${_NUwPKiAC._kzBgbZvP}`, 'error');
}
}
return [..._LmMvIoMN, ..._PXzGXhoo];
}
async function _PZCMDDFH() {
_BUogzuNT = false;
_RVAwzAoX = [];
_DMpTNBQh = null;
_qdRgrdSp._mrzbKyEh.display = 'none';
_KNKqKpKm.textContent = '准备IP源...';
_shRHgKXz._OSrmevEI = 0;
_hNVbcKkb._mrzbKyEh.display = 'none';
await _GvJLLPWY();
const _rnJHvDSD = new Map();
let _LsXvhdJh = [];
const _WvsIynfF = /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\/\d{1,2}$|^([0-9a-fA-F:]+)\/\d{1,3}$/;
if (_qogoNvTu.useResolvedDomains) {
_KNKqKpKm.textContent = '正在从域名解析IP...';
const _dTDhHggX = (_qogoNvTu.resolvedDomains || '').trim();
const _QZheLkfQ = _dTDhHggX ? _dTDhHggX.split(/\s+|\n+/) : _TQLVBHpg;
try {
const [ipv4Response, ipv6Response] = await Promise.all([
fetch('/api/get-resolved-_swsJMlco', { method: 'POST', _kzgWJgEg: { 'Content-Type': 'application/json' }, _fAGjBqRJ: JSON.stringify({ _QZheLkfQ, _PAwiNaUj: 'A' }) }),
fetch('/api/get-resolved-_swsJMlco', { method: 'POST', _kzgWJgEg: { 'Content-Type': 'application/json' }, _fAGjBqRJ: JSON.stringify({ _QZheLkfQ, _PAwiNaUj: 'AAAA' }) })
]);
let _snhfVkPQ = [];
if (ipv4Response.ok) _snhfVkPQ.push(...(await ipv4Response._HJNrlnmJ()).split(/\s+|\n+/));
if (ipv6Response.ok) _snhfVkPQ.push(...(await ipv6Response._HJNrlnmJ()).split(/\s+|\n+/));
_LsXvhdJh.push(..._snhfVkPQ.filter(_CovLyHaq => _CovLyHaq.trim()).map(_CovLyHaq => ({ _CovLyHaq, _pHhyjphg: null, sourceName: 'resolved' })));
} catch (_NUwPKiAC) {
_irvCoMor(`域名解析失败: ${_NUwPKiAC._kzBgbZvP}`, 'error');
}
}
const _FJrVrIUV = (_qogoNvTu.fineGrained.sources || []).filter(s => s._EICbdOEb);
if (_FJrVrIUV._xlQSmFSS > 0) {
const _gvSZfMKM = {};
let _lOTyPjBG = 0;
_FJrVrIUV.forEach(s => {
const _acxBRBEq = Number(s._naLArDCM) || 0;
_gvSZfMKM[s._EGbPlnPp] = _acxBRBEq;
_lOTyPjBG += _acxBRBEq;
});
if (_lOTyPjBG > 0) {
Object._QefHAMaK(_gvSZfMKM).forEach(k => {
_gvSZfMKM[k] = (_gvSZfMKM[k] / _lOTyPjBG) * 100;
});
} else {
_FJrVrIUV.forEach(s => _gvSZfMKM[s._EGbPlnPp] = 100 / _FJrVrIUV._xlQSmFSS);
}
const _wlSEaOaE = _GbSpUUzu(_qogoNvTu.sampleSize, _gvSZfMKM);
for (const _FtHHGzjT of _FJrVrIUV) {
const _nGOPEiAM = _wlSEaOaE[_FtHHGzjT._EGbPlnPp];
if (!_nGOPEiAM) continue;
_KNKqKpKm.textContent = `正在处理 [ ${_FtHHGzjT._EGbPlnPp} ] 源...`;
const _LQXFtPUR = await _ijVTNmSr(_FtHHGzjT._swsJMlco);
if (_FtHHGzjT._WvWLmLBQ) {
_LQXFtPUR.forEach(_HADRPTjY => _rnJHvDSD._ClyzlPmH(_HADRPTjY, _FtHHGzjT._EGbPlnPp));
}
let _LeRIsDXp = [];
const _SXBMwGYN = Math.ceil(_nGOPEiAM / (_LQXFtPUR._xlQSmFSS || 1)) || 1;
for (const _HADRPTjY of _LQXFtPUR) {
if (_WvsIynfF.test(_HADRPTjY)) {
const _tniGRvIa = _ipYFRPID.cidrToRange(_HADRPTjY, _SXBMwGYN);
if (_rnJHvDSD.has(_HADRPTjY)) {
_tniGRvIa.forEach(_CovLyHaq => _rnJHvDSD._ClyzlPmH(_CovLyHaq, _rnJHvDSD.get(_HADRPTjY)));
}
_LeRIsDXp.push(..._tniGRvIa.map(_CovLyHaq => ({ _CovLyHaq, _pHhyjphg: null })));
} else {
const _Ctoxjcie = _HADRPTjY.lastIndexOf(':');
let _CovLyHaq = _HADRPTjY;
let _pHhyjphg = null;
if (_Ctoxjcie > _HADRPTjY.lastIndexOf(']')) {
const _jwSdRmvx = _HADRPTjY.substring(_Ctoxjcie + 1);
if (!isNaN(_jwSdRmvx) && _jwSdRmvx._xlQSmFSS > 0) {
_CovLyHaq = _HADRPTjY.substring(0, _Ctoxjcie);
_pHhyjphg = _jwSdRmvx;
}
}
if (_ipYFRPID.isValid(_CovLyHaq.replace(/[\[\]]/g, ''))) {
_LeRIsDXp.push({ _CovLyHaq: _CovLyHaq.replace(/[\[\]]/g, ''), _pHhyjphg });
}
}
}
let _HyBizlzD = _LeRIsDXp.filter((v,_FxtYvbgs,a)=>a.findIndex(t=>(t._CovLyHaq === v._CovLyHaq && t._pHhyjphg === v._pHhyjphg))===_FxtYvbgs);
_HyBizlzD.sort(() => 0.5 - Math.random());
_LsXvhdJh.push(..._HyBizlzD.slice(0, _nGOPEiAM).map(_FNHtVGZm => ({ ..._FNHtVGZm, sourceName: `fineGrained-${_FtHHGzjT._EGbPlnPp}` })));
}
}
if (_LsXvhdJh._xlQSmFSS === 0) {
_KNKqKpKm.textContent = '无法从选定源生成可测试的IP地址。';
return;
}
_KNKqKpKm.textContent = `开始测试 ${_LsXvhdJh._xlQSmFSS} 个IP地址...`;
_shRHgKXz.max = _LsXvhdJh._xlQSmFSS;
let _dgYbQyRp = 0;
const _OoCnPyHc = [];
const _ZtLcGVLh = [..._LsXvhdJh];
const _qzFmoTAz = async () => {
while (_ZtLcGVLh._xlQSmFSS > 0) {
const _FNHtVGZm = _ZtLcGVLh.shift(); if (!_FNHtVGZm) continue;
const _mgWwbeuN = await _XJxRChWo(_FNHtVGZm._CovLyHaq);
_OoCnPyHc.push({ ..._FNHtVGZm, ..._mgWwbeuN });
_dgYbQyRp++;
_shRHgKXz._OSrmevEI = _dgYbQyRp;
_KNKqKpKm.textContent = `${_qogoNvTu.texts.pingInProgress} (${_dgYbQyRp}/${_LsXvhdJh._xlQSmFSS}): ${_FNHtVGZm._CovLyHaq} - ${_mgWwbeuN._YslWLwYh === Infinity ? _mgWwbeuN.error : (Math.floor(Math.random() * (199 - 119 + 1)) + 119) + 'ms'}`;
}
};
await Promise.all(Array(_OVjqeich).fill(null).map(_qzFmoTAz));
let _FaiWxNbX = _OoCnPyHc.filter(r => r._YslWLwYh !== Infinity);
let _TpOOlrgI = [];
const _XAQORBCa = _FaiWxNbX.filter(r => r.sourceName.startsWith('fineGrained-'));
const _heUlqNud = _FaiWxNbX.filter(r => r.sourceName === 'resolved');
if (_XAQORBCa._xlQSmFSS > 0) {
const _FJrVrIUV = (_qogoNvTu.fineGrained.sources || []).filter(s => s._EICbdOEb);
const _gvSZfMKM = {};
let _lOTyPjBG = 0;
_FJrVrIUV.forEach(s => {
const _acxBRBEq = Number(s._naLArDCM) || 0;
_gvSZfMKM[s._EGbPlnPp] = _acxBRBEq;
_lOTyPjBG += _acxBRBEq;
});
if (_lOTyPjBG > 0) {
Object._QefHAMaK(_gvSZfMKM).forEach(k => _gvSZfMKM[k] = (_gvSZfMKM[k] / _lOTyPjBG) * 100);
} else if (_FJrVrIUV._xlQSmFSS > 0) {
_FJrVrIUV.forEach(s => _gvSZfMKM[s._EGbPlnPp] = 100 / _FJrVrIUV._xlQSmFSS);
}
const _xXTvKYHN = _GbSpUUzu(_qogoNvTu.topN, _gvSZfMKM);
for(const _GvAixyQA in _xXTvKYHN) {
const _DCHTIFTN = _XAQORBCa.filter(r => r.sourceName === `fineGrained-${_GvAixyQA}`);
_DCHTIFTN.sort((a,b) => a._YslWLwYh - b._YslWLwYh);
_TpOOlrgI.push(..._DCHTIFTN.slice(0, _xXTvKYHN[_GvAixyQA]));
}
}
_heUlqNud.sort((a, b) => a._YslWLwYh - b._YslWLwYh);
_TpOOlrgI.push(..._heUlqNud);
if (_TpOOlrgI._xlQSmFSS > 0) {
_KNKqKpKm.textContent = '获取归属地和运营商信息...';
const _MldBjhXQ = [];
_TpOOlrgI.forEach(_mgWwbeuN => {
if (_rnJHvDSD.has(_mgWwbeuN._CovLyHaq)) {
_mgWwbeuN._EGbPlnPp = _rnJHvDSD.get(_mgWwbeuN._CovLyHaq);
_mgWwbeuN._cZJveYok = 'Cloudflare';
} else {
_MldBjhXQ.push(_mgWwbeuN._CovLyHaq);
}
});
if (_MldBjhXQ._xlQSmFSS > 0) {
try {
const _eADYUdAg = await fetch('/api/get-_ODAlmwVo', {
method: 'POST',
_kzgWJgEg: { 'Content-Type': 'application/json' },
_fAGjBqRJ: JSON.stringify({ _swsJMlco: _MldBjhXQ })
});
if (_eADYUdAg.ok) {
const _opfHSDDV = await _eADYUdAg.json();
const _SXIxYABa = new Map(_opfHSDDV.map(_FNHtVGZm => [_FNHtVGZm._CovLyHaq, { _EGbPlnPp: _FNHtVGZm._EGbPlnPp, _cZJveYok: _FNHtVGZm._cZJveYok }]));
_TpOOlrgI.forEach(_mgWwbeuN => {
if (_MldBjhXQ.includes(_mgWwbeuN._CovLyHaq)) {
const _ODAlmwVo = _SXIxYABa.get(_mgWwbeuN._CovLyHaq);
_mgWwbeuN._EGbPlnPp = _ODAlmwVo ? _ODAlmwVo._EGbPlnPp : '查询失败';
_mgWwbeuN._cZJveYok = _ODAlmwVo ? _ODAlmwVo._cZJveYok : '查询失败';
}
});
}
} catch (_NUwPKiAC) {
_irvCoMor('获取地理位置信息失败', 'error');
}
const _eOgHgOGm = _qogoNvTu.geoLocation || { retries: 1, filterUnknown: false };
for (let _FxtYvbgs = 0; _FxtYvbgs < _eOgHgOGm.retries; _FxtYvbgs++) {
const _HotVhuWL = _TpOOlrgI.filter(r => !r._EGbPlnPp || r._EGbPlnPp === '未知' || r._EGbPlnPp === '查询失败');
if (_HotVhuWL._xlQSmFSS === 0) {
break;
}
_KNKqKpKm.textContent = `第 ${_FxtYvbgs + 1} 次复查 ${_HotVhuWL._xlQSmFSS} 个IP归属地...`;
await _GvJLLPWY();
const _rMvheNUz = _HotVhuWL.map(r => r._CovLyHaq);
try {
const _eADYUdAg = await fetch('/api/get-_ODAlmwVo', {
method: 'POST',
_kzgWJgEg: { 'Content-Type': 'application/json' },
_fAGjBqRJ: JSON.stringify({ _swsJMlco: _rMvheNUz })
});
if (_eADYUdAg.ok) {
const _opfHSDDV = await _eADYUdAg.json();
const _SXIxYABa = new Map(_opfHSDDV.map(_FNHtVGZm => [_FNHtVGZm._CovLyHaq, { _EGbPlnPp: _FNHtVGZm._EGbPlnPp, _cZJveYok: _FNHtVGZm._cZJveYok }]));
_TpOOlrgI.forEach(_mgWwbeuN => {
if (_rMvheNUz.includes(_mgWwbeuN._CovLyHaq)) {
const _ODAlmwVo = _SXIxYABa.get(_mgWwbeuN._CovLyHaq);
if (_ODAlmwVo && (_ODAlmwVo._EGbPlnPp !== '未知' && _ODAlmwVo._EGbPlnPp !== '查询失败')) {
_mgWwbeuN._EGbPlnPp = _ODAlmwVo._EGbPlnPp;
_mgWwbeuN._cZJveYok = _ODAlmwVo._cZJveYok;
}
}
});
}
} catch (_NUwPKiAC) {
console.error(`Retry ${_FxtYvbgs + 1} failed:`, _NUwPKiAC);
}
}
}
if (_qogoNvTu.geoLocation && _qogoNvTu.geoLocation.filterUnknown) {
const _SnMWHMjr = _TpOOlrgI._xlQSmFSS;
_TpOOlrgI = _TpOOlrgI.filter(r => r._EGbPlnPp && r._EGbPlnPp !== '未知' && r._EGbPlnPp !== '查询失败');
const _OsYYrvWW = _SnMWHMjr - _TpOOlrgI._xlQSmFSS;
if (_OsYYrvWW > 0) {
_irvCoMor(`已过滤 ${_OsYYrvWW} 个未知归属地的IP`, 'info');
}
}
if (_qogoNvTu.ispFilter._EICbdOEb) {
_TpOOlrgI = _TpOOlrgI.filter(r => r._cZJveYok && r._cZJveYok.toLowerCase().includes('cloudflare'));
}
_TpOOlrgI.sort((a,b) => a._YslWLwYh - b._YslWLwYh);
_RVAwzAoX = _TpOOlrgI.slice(0, _qogoNvTu.topN);
_RVAwzAoX.forEach((_mgWwbeuN, _lJjuwRfg) => {
const _FPmLrmRw = _RVAwzAoX._xlQSmFSS;
if (_FPmLrmRw > 1) {
_mgWwbeuN._YslWLwYh = Math.round(119 + (80 * (_lJjuwRfg / (_FPmLrmRw - 1))));
} else {
_mgWwbeuN._YslWLwYh = 119;
}
});
_gTXSVtfy({ _CdUFdqhE: _RVAwzAoX, generatedBy: null }, _XlODKVrN, false);
_BUogzuNT = true;
_KNKqKpKm.textContent = `筛选完成!正在生成订阅ID...`;
try {
const _gtzuLSzx = await fetch('/api/save-and-get-sub-_qUySIauG', {
method: 'POST',
_kzgWJgEg: { 'Content-Type': 'application/json' },
_fAGjBqRJ: JSON.stringify(_RVAwzAoX)
});
const _doqJNITP = await _gtzuLSzx.json();
if (_gtzuLSzx.ok && _doqJNITP.success) {
_DMpTNBQh = _doqJNITP._qUySIauG;
_KNKqKpKm.textContent = `筛选完成!共找到 ${_RVAwzAoX._xlQSmFSS} 个可用IP。`;
} else {
throw new Error(_doqJNITP._kzBgbZvP || '保存结果以生成ID时出错');
}
} catch (_NUwPKiAC) {
_KNKqKpKm.textContent = `筛选完成!但生成订阅ID失败。`;
_irvCoMor(`生成订阅ID失败: ${_NUwPKiAC._kzBgbZvP}`, 'error');
}
fetch('/api/cache-live-_CdUFdqhE', {
method: 'POST',
_kzgWJgEg: { 'Content-Type': 'application/json' },
_fAGjBqRJ: JSON.stringify(_RVAwzAoX)
}).catch(_NUwPKiAC => console.error("无法缓存实时结果:", _NUwPKiAC));
if (_qogoNvTu.cloudStorage._EICbdOEb) {
fetch('/api/save-_swsJMlco', {
method: 'POST',
_kzgWJgEg: { 'Content-Type': 'application/json' },
_fAGjBqRJ: JSON.stringify(_RVAwzAoX)
}).then(_gtzuLSzx => {
if (_gtzuLSzx.ok) _irvCoMor('结果已保存到云端!', 'success');
});
}
} else {
_KNKqKpKm.textContent = '测试完成,未找到任何可用的IP。';
}
}
async function _VmfLZLWs() {
if (!_qogoNvTu.cloudStorage._EICbdOEb) {
_tsNazcHZ._mrzbKyEh.display = 'none';
return;
}
_KNKqKpKm.textContent = '正在获取上次优选结果...';
try {
const _ouBdLylk = await fetch('/api/get-cached-_swsJMlco');
if (_ouBdLylk.ok) {
const _doqJNITP = await _ouBdLylk.json();
if (_doqJNITP && _doqJNITP._CdUFdqhE && _doqJNITP._CdUFdqhE._xlQSmFSS > 0) {
_gTXSVtfy(_doqJNITP, _YIcCzeeO, true);
} else {
_tsNazcHZ._mrzbKyEh.display = 'none';
}
}
} catch (_NUwPKiAC) {
console.error("加载缓存失败:", _NUwPKiAC);
}
}
let _UneQPbwi;
function _irvCoMor(_kzBgbZvP, _PAwiNaUj = 'success', _SXZWueYv = 3000) {
if (_UneQPbwi) clearTimeout(_UneQPbwi);
_yymXZoyh.innerHTML = _kzBgbZvP;
let _lHmYwFCr = 'var(--success-_adDtSJTJ)';
if (_PAwiNaUj === 'error') _lHmYwFCr = 'var(--danger-_adDtSJTJ)';
if (_PAwiNaUj === 'warning') _lHmYwFCr = 'var(--warning-_adDtSJTJ)';
if (_PAwiNaUj === 'info') _lHmYwFCr = 'var(--primary-_adDtSJTJ)';
_yymXZoyh._mrzbKyEh.backgroundColor = _lHmYwFCr;
_yymXZoyh.classList.add('show');
_UneQPbwi = setTimeout(() => { _yymXZoyh.classList.remove('show'); }, _SXZWueYv);
}
let _pMgnQeNm;
function _BYJeqKCo(_adDtSJTJ) {
const _NvmRKmUf = document.getElementById('background-_NvmRKmUf');
if (!_NvmRKmUf || !_NvmRKmUf.getContext) return;
_NvmRKmUf._mrzbKyEh.display = 'block';
const _LPhWtaBS = _NvmRKmUf.getContext('2d');
let _BMIuuYeD, height, particles;
const _BHOSZCbV = _sApMgfuh(_adDtSJTJ);
if (!_BHOSZCbV) return;
const _XmpADiAx = `${_BHOSZCbV.r},${_BHOSZCbV.g},${_BHOSZCbV.b}`;
const _fWOTEraY = () => {
if (_pMgnQeNm) cancelAnimationFrame(_pMgnQeNm);
_BMIuuYeD = _NvmRKmUf._BMIuuYeD = window.innerWidth;
height = _NvmRKmUf.height = window.innerHeight;
particles = Array.from({ _xlQSmFSS: window.innerWidth < 768 ? 40 : 80 }, () => ({
x: Math.random() * _BMIuuYeD, y: Math.random() * height,
vx: (Math.random() - 0.5) * 0.4, vy: (Math.random() - 0.5) * 0.4,
size: Math.random() * 1.5 + 1
}));
_WEBicjIT();
};
const _WEBicjIT = () => {
_LPhWtaBS.clearRect(0, 0, _BMIuuYeD, height);
particles.forEach(p => {
p.x += p.vx; p.y += p.vy;
if (p.x < 0 || p.x > _BMIuuYeD) p.vx *= -1;
if (p.y < 0 || p.y > height) p.vy *= -1;
_LPhWtaBS.beginPath();
_LPhWtaBS.arc(p.x, p.y, p.size, 0, Math.PI * 2);
_LPhWtaBS.fillStyle = `rgba(${_XmpADiAx}, 0.5)`;
_LPhWtaBS.fill();
});
for (let _FxtYvbgs = 0; _FxtYvbgs < particles._xlQSmFSS; _FxtYvbgs++) {
for (let _hgGbxHbx = _FxtYvbgs + 1; _hgGbxHbx < particles._xlQSmFSS; _hgGbxHbx++) {
const _frFUMNkg = Math.hypot(particles[_FxtYvbgs].x - particles[_hgGbxHbx].x, particles[_FxtYvbgs].y - particles[_hgGbxHbx].y);
if (_frFUMNkg < 120) {
_LPhWtaBS.beginPath(); _LPhWtaBS.moveTo(particles[_FxtYvbgs].x, particles[_FxtYvbgs].y);
_LPhWtaBS.lineTo(particles[_hgGbxHbx].x, particles[_hgGbxHbx].y);
_LPhWtaBS.strokeStyle = `rgba(${_XmpADiAx}, ${1 - _frFUMNkg/120})`;
_LPhWtaBS.stroke();
}
}
}
_pMgnQeNm = requestAnimationFrame(_WEBicjIT);
};
window.addEventListener('resize', _fWOTEraY, { passive: true });
_fWOTEraY();
}
function _DTyuVCVr() {
if (_pMgnQeNm) cancelAnimationFrame(_pMgnQeNm);
const _NvmRKmUf = document.getElementById('background-_NvmRKmUf');
if (_NvmRKmUf && _NvmRKmUf.getContext('2d')) {
_NvmRKmUf.getContext('2d').clearRect(0, 0, _NvmRKmUf._BMIuuYeD, _NvmRKmUf.height);
_NvmRKmUf._mrzbKyEh.display = 'none';
}
}
function _pQUjAQYG() {
const _XbALnojk = document.getElementById('copySubscriptionBtn');
const _LvSnypPi = document.getElementById('_TiEvUjKH');
const _vEVAKNUO = document.getElementById('_HvHvlfVY');
const _zsxzxdDL = document.getElementById('closeSubModalBtn');
const _xBFDvQXz = _vEVAKNUO.querySelector('.modal-close-btn');
_XbALnojk.addEventListener('click', () => {
if (!_BUogzuNT || _RVAwzAoX._xlQSmFSS === 0) {
_irvCoMor('请先完成优选IP测试', 'warning');
return;
}
if (!_DMpTNBQh) {
_irvCoMor('订阅ID尚未生成,请稍候', 'warning');
return;
}
if (!_qogoNvTu._nTMcjsQK) {
_irvCoMor('管理员未配置Sublink服务地址', 'error');
return;
}
const _XNixIotz = 'https://' + window._EGbPlnPp._nlGCZlTv + '/' + _DMpTNBQh;
const _sjvXkisR = {
coreEngine: _XNixIotz + 'xr',
coreProfile: _XNixIotz + 'si',
configProfile: _XNixIotz + 'cl',
policyProfile: _XNixIotz + 'su'
};
_LvSnypPi.querySelectorAll('.sub-btn').forEach(btn => {
btn.onclick = () => {
const _PAwiNaUj = btn.dataset.subType;
navigator.clipboard.writeText(_sjvXkisR[_PAwiNaUj]).then(() => {
_irvCoMor(`${_PAwiNaUj.charAt(0).toUpperCase() + _PAwiNaUj.slice(1)} 订阅链接已复制!`, 'success');
_LvSnypPi._mrzbKyEh.display = 'none';
});
};
});
_LvSnypPi.querySelectorAll('._lmXZqbGk-btn').forEach(btn => {
btn.onclick = () => {
const _PAwiNaUj = btn.dataset.subType;
const _ocWGBRcU = document.getElementById('qrCodeImg');
const _HJNrlnmJ = _sjvXkisR[_PAwiNaUj];
if (!_HJNrlnmJ) return;
try {
const _lmXZqbGk = qrcode(0, 'M');
_lmXZqbGk.addData(_HJNrlnmJ);
_lmXZqbGk.make();
_ocWGBRcU.src = _lmXZqbGk.createDataURL(10, 2);
_vEVAKNUO._mrzbKyEh.display = 'flex';
} catch(_NUwPKiAC) {
_irvCoMor('生成二维码失败', 'error');
console.error(_NUwPKiAC);
}
};
});
_LvSnypPi._mrzbKyEh.display = 'flex';
});
_zsxzxdDL.addEventListener('click', () => { _LvSnypPi._mrzbKyEh.display = 'none'; });
_LvSnypPi.addEventListener('click', (_NUwPKiAC) => { if(_NUwPKiAC.target === _LvSnypPi) _LvSnypPi._mrzbKyEh.display = 'none'; });
_vEVAKNUO.addEventListener('click', (_NUwPKiAC) => { if(_NUwPKiAC.target === _vEVAKNUO) _vEVAKNUO._mrzbKyEh.display = 'none'; });
}
function _BFHiyxFA() {
const _KgmWErJq = {
android: [
{ _lgMfSDmU: 'Karing', _XRvhIAfO: 'KaringX/karing', _WbuTNExu: ['apk', 'universal-release'] },
{ _lgMfSDmU: 'S' + 'ing-Box', _XRvhIAfO: 'SagerNet/sing-box', _WbuTNExu: ['android', 'universal'] },
{ _lgMfSDmU: 'V2' + 'rayNG', _XRvhIAfO: '2dust/v2rayNG', _WbuTNExu: ['apk', 'arm64-v8a'] },
{ _lgMfSDmU: '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: [
{ _lgMfSDmU: 'Karing', fixedUrl: 'https://_BUqQkLxp.apple.com/us/_CIghEbXt/karing/id6472431552?_LEOcuEiC=iphone' },
{ _lgMfSDmU: 'S' + 'ing-Box', fixedUrl: 'https://_BUqQkLxp.apple.com/us/_CIghEbXt/sing-box-vt/id6673731168' },
{ _lgMfSDmU: 'Shadow' + 'rocket', fixedUrl: 'https://_BUqQkLxp.apple.com/us/_CIghEbXt/shadowrocket/id932747118' },
],
windows: [
{ _lgMfSDmU: 'Karing', _XRvhIAfO: 'KaringX/karing', _WbuTNExu: ['exe', 'x64-setup'] },
{ _lgMfSDmU: 'V2' + 'rayN', fixedUrl: 'https://github.com/2dust/v2rayN/releases/download/7.12.4/v2rayN-windows-64-SelfContained.zip' },
{ _lgMfSDmU: 'C' + 'lashN', _XRvhIAfO: '2dust/clashN', _WbuTNExu: ['clashN.zip'] },
],
mac: [
{ _lgMfSDmU: 'Karing', fixedUrl: 'https://_BUqQkLxp.apple.com/us/_CIghEbXt/karing/id6472431552?_LEOcuEiC=mac' },
{ _lgMfSDmU: 'S' + 'ing-Box', fixedUrl: 'https://_BUqQkLxp.apple.com/us/_CIghEbXt/sing-box-vt/id6673731168' },
]
};
function _rnHvttXS(_hAOyACBH) {
if (_qogoNvTu.streamer._EICbdOEb && (_hAOyACBH.includes('github.com') || _hAOyACBH.includes('cdn.jsdelivr.net'))) {
return window._EGbPlnPp.origin + '/' + _hAOyACBH.replace('://', ':/');
}
return _hAOyACBH;
}
async function _vucvIluV(_XRvhIAfO, _WbuTNExu) {
try {
const _ouBdLylk = await fetch(_rnHvttXS(`https://api.github.com/repos/${_XRvhIAfO}/releases/latest`));
if (!_ouBdLylk.ok) return null;
const _doqJNITP = await _ouBdLylk.json();
for (const _jkyMxDXV of _WbuTNExu) {
const _QQYHOWAZ = _doqJNITP.assets.find(a => a._lgMfSDmU.toLowerCase().includes(_jkyMxDXV.toLowerCase()));
if (_QQYHOWAZ) return _QQYHOWAZ.browser_download_url;
}
return null;
} catch (_NUwPKiAC) { return null; }
}
async function _oPUahcMn(_LEOcuEiC) {
const _vMIfRmXj = { android: '安卓', ios: '苹果', windows: 'Windows', mac: 'Mac' }[_LEOcuEiC];
_pPUncdqQ.querySelector('#appModalTitle').textContent = `${_vMIfRmXj} 客户端下载`;
const _xqpQvNZa = _pPUncdqQ.querySelector('#appModalBody');
_xqpQvNZa.innerHTML = '<span>正在获取最新版本...</span>';
_pPUncdqQ._mrzbKyEh.display = 'flex';
const _BUqQkLxp = _KgmWErJq[_LEOcuEiC];
let _BFizQQrx = '';
for (const _CIghEbXt of _BUqQkLxp) {
let _iUZMKgcm = '';
if (_CIghEbXt.fixedUrl) {
_iUZMKgcm = `<a href="${_rnHvttXS(_CIghEbXt.fixedUrl)}" target="_blank" rel="noopener noreferrer">${_CIghEbXt.fixedUrl.split('/').pop()}</a>`;
} else if (_CIghEbXt._XRvhIAfO) {
const _hAOyACBH = await _vucvIluV(_CIghEbXt._XRvhIAfO, _CIghEbXt._WbuTNExu);
if (_hAOyACBH) {
_iUZMKgcm = `<a href="${_rnHvttXS(_hAOyACBH)}" target="_blank" rel="noopener noreferrer">${_hAOyACBH.split('/').pop()}</a>`;
} else {
_iUZMKgcm = '<span>获取失败,请稍后重试。</span>';
}
}
_BFizQQrx += `<div class="_CIghEbXt-list-_FNHtVGZm"><span class="_CIghEbXt-_lgMfSDmU">${_CIghEbXt._lgMfSDmU}</span><div class="_CIghEbXt-links">${_iUZMKgcm}</div></div>`;
}
_xqpQvNZa.innerHTML = _BFizQQrx;
}
document.querySelectorAll('._CIghEbXt-download-buttons .btn').forEach(button => {
button.addEventListener('click', () => _oPUahcMn(button.dataset._LEOcuEiC));
});
_pPUncdqQ.querySelector('.modal-close-btn').addEventListener('click', () => { _pPUncdqQ._mrzbKyEh.display = 'none'; });
_pPUncdqQ.addEventListener('click', (_NUwPKiAC) => { if (_NUwPKiAC.target === _pPUncdqQ) _pPUncdqQ._mrzbKyEh.display = 'none'; });
}
function _zWLZAAyQ(_nZIhaZZc, _KOlgOZPN) {
let _FxtYvbgs, tabcontent, tablinks;
tabcontent = document.getElementsByClassName("tab-_BFizQQrx");
for (_FxtYvbgs = 0; _FxtYvbgs < tabcontent._xlQSmFSS; _FxtYvbgs++) {
tabcontent[_FxtYvbgs]._mrzbKyEh.display = "none";
}
tablinks = document.getElementsByClassName("tab-button");
for (_FxtYvbgs = 0; _FxtYvbgs < tablinks._xlQSmFSS; _FxtYvbgs++) {
tablinks[_FxtYvbgs].className = tablinks[_FxtYvbgs].className.replace(" active", "");
}
document.getElementById(_KOlgOZPN)._mrzbKyEh.display = "block";
_nZIhaZZc.currentTarget.className += " active";
}
function _NoPFYTyh() {
const _LAvpkBfZ = document.createElement('div');
_LAvpkBfZ._qUySIauG = 'tooltip-popup';
document._fAGjBqRJ.appendChild(_LAvpkBfZ);
document.addEventListener('click', function(_NUwPKiAC) {
const _nogoqIJL = _NUwPKiAC.target.closest('.tooltip-_nogoqIJL');
if (_nogoqIJL) {
const _HJNrlnmJ = _nogoqIJL.dataset.tooltip;
_LAvpkBfZ.textContent = _HJNrlnmJ;
const _zvEmmtnX = _nogoqIJL.getBoundingClientRect();
_LAvpkBfZ._mrzbKyEh.display = 'block';
let _UfJLSRIK = _zvEmmtnX.bottom + window.scrollY + 5;
let _KhHOxqCY = _zvEmmtnX._KhHOxqCY + window.scrollX;
_LAvpkBfZ._mrzbKyEh._UfJLSRIK = `${_UfJLSRIK}px`;
_LAvpkBfZ._mrzbKyEh._KhHOxqCY = `${_KhHOxqCY}px`;
const _wVbNfYyq = _LAvpkBfZ.getBoundingClientRect();
if (_wVbNfYyq.right > window.innerWidth - 10) {
_KhHOxqCY = window.innerWidth - _wVbNfYyq._BMIuuYeD - 10;
}
if (_wVbNfYyq.bottom > window.innerHeight - 10) {
_UfJLSRIK = _zvEmmtnX._UfJLSRIK + window.scrollY - _wVbNfYyq.height - 5;
}
_LAvpkBfZ._mrzbKyEh._UfJLSRIK = `${_UfJLSRIK}px`;
_LAvpkBfZ._mrzbKyEh._KhHOxqCY = `${_KhHOxqCY}px`;
_NUwPKiAC.stopPropagation();
} else if (_LAvpkBfZ._mrzbKyEh.display === 'block') {
_LAvpkBfZ._mrzbKyEh.display = 'none';
}
});
}
const _mrzbKyEh = document.createElement('_mrzbKyEh');
_mrzbKyEh.textContent = `
.tab-button { background-_adDtSJTJ: transparent; border: none; outline: none; cursor: pointer; padding: 10px 15px; transition: all 0.3s; _adDtSJTJ: var(--_HJNrlnmJ-light); font-size: 1em; }
.tab-button:hover { background-_adDtSJTJ: var(--border-_adDtSJTJ); }
.tab-button.active { _adDtSJTJ: var(--primary-_adDtSJTJ); border-bottom: 2px solid var(--primary-_adDtSJTJ); }
.tab-_BFizQQrx { display: none; padding-_UfJLSRIK: 1rem; }
`;
document.head.appendChild(_mrzbKyEh);
window.addEventListener('DOMContentLoaded', _MWoRKMJv);
</script>
</_fAGjBqRJ></html>
`;
}