import { connect } from "cloudflare:sockets";
const _qZLtGOhY = "3b4d4cd8-cb92-4421-bf86-fb51570fc038";
const _HrlwrRdR = ["UpstreamAddress.SG.CMLiussss.net"];
const _yCrBdEeb = 'https://raw.githubusercontent.com/5yfx/CF_WEB_IP_Worekrs/refs/heads/main/%E5%86%85%E7%BD%AEIP';
const _ATuYeVnw = 'https://raw.githubusercontent.com/5yfx/CF_WEB_IP_Worekrs/refs/heads/main/%E5%9D%87%E8%A1%A1IP';
const _eGDhfaZb = '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 _RMUOlkay = '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 _TOaKeTBt(_PCGWajUU) {
if (Array.isArray(_PCGWajUU)) {
try {
return String.fromCharCode.apply(null, _PCGWajUU);
} catch (_TscaIMJa) {
return '';
}
}
return _PCGWajUU;
}
function _TVllTWfi(_XrqwuwXJ) {
return /^[0-9a-_GIfJcivR]{8}-[0-9a-_GIfJcivR]{4}-[4][0-9a-_GIfJcivR]{3}-[89ab][0-9a-_GIfJcivR]{3}-[0-9a-_GIfJcivR]{12}$/_cZPBrLPg.test(_XrqwuwXJ);
}
const _OxupAZxp = "optimized_ips_v4";
const _yKCCKoQU = "global_config_v4";
const _GeXZBCNg = "admin_password_v4";
const _TpYpkwiS = "live_results_temp_v1";
const _otEcYfIn = "latest_sub_id_v1";
export default {
async fetch(_DtUdMsva, _rQGxLgCx, _fPlnmlTf) {
try {
if (!_rQGxLgCx.DB) {
const _NxnXpzLr = _ZkzkrsuR("D1 数据库 'DB' 未绑定。");
return new Response(_NxnXpzLr, { status: 503, _neCLOKdy: { 'Content-Type': '_rIddpXbz/html;_yVbSoUyS=UTF-8' }});
}
_fPlnmlTf.waitUntil(
_rQGxLgCx.DB.exec(`
CREATE TABLE IF NOT EXISTS kv_data (_MqXeEqfN TEXT PRIMARY KEY, _PCGWajUU TEXT);
CREATE TABLE IF NOT EXISTS optimized_results (_XrqwuwXJ TEXT PRIMARY KEY, _bkGfRqAc TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP);
`).catch(_TscaIMJa => console.error("DB Init Error:", _TscaIMJa._tQsENZEP))
);
const _WtFfkLOq = new URL(_DtUdMsva._WtFfkLOq);
const _LTzuohby = _WtFfkLOq.pathname;
const _pRzFTqQV = _DtUdMsva._neCLOKdy.get("Upgrade");
const _EZYiPFxb = await _uFXYXKqg(_rQGxLgCx);
if (_EZYiPFxb.websocketStreamer && _EZYiPFxb.websocketStreamer._owqiIfIi && _pRzFTqQV && _pRzFTqQV.toLowerCase() === "websocket") {
const _XLUFvkZo = _EZYiPFxb.websocketStreamer._WtFfkLOq;
if (_XLUFvkZo && _XLUFvkZo.trim().startsWith('https://')) {
try {
const _plTfOxVI = new Request(_XLUFvkZo.trim() + _WtFfkLOq.pathname + _WtFfkLOq.search, _DtUdMsva);
return await fetch(_plTfOxVI);
} catch (_TscaIMJa) {
return new Response(`Upstream WebSocket gateway failed: ${_TscaIMJa._tQsENZEP}`, { status: 502 });
}
}
return new Response("WebSocket reverse gateway URL is not configured or is invalid.", { status: 502 });
}
if (_pRzFTqQV && _pRzFTqQV.toLowerCase() === "websocket") {
return await _ZmGrYZGA(_DtUdMsva, _rQGxLgCx, _EZYiPFxb);
}
const _RhbwqjCS = _LTzuohby._vKJXNBuj(/^\/([a-zA-Z0-9-_.]{2,128})(xr|si|cl|su)$/);
if (_RhbwqjCS) {
const [, _uYNxQvmH, typeSuffix] = _RhbwqjCS;
const _UMKWguhA = _EZYiPFxb._UMKWguhA;
if (!_UMKWguhA || _UMKWguhA.trim() === '') {
return new Response("订阅转换(Sublink)服务器地址未配置。", { status: 503, _neCLOKdy: { 'Content-Type': '_rIddpXbz/plain; _yVbSoUyS=utf-8' } });
}
const _LKANusmB = { 'xr': 'coreEngine', 'si': 'coreProfile', 'cl': 'configProfile', 'su': 'policyProfile' };
const _hTIDzNJm = _LKANusmB[typeSuffix];
const _WYFoKIdX = _UMKWguhA.replace(/\/$/, '');
const _EOzCVVKR = `${_WtFfkLOq.origin}/${_uYNxQvmH}`;
const _FKgNCJUH = `${_WYFoKIdX}/${_hTIDzNJm}?_EZYiPFxb=${encodeURIComponent(_EOzCVVKR)}`;
try {
const _NEbMLvPh = await fetch(_FKgNCJUH, { _neCLOKdy: { 'User-Agent': _DtUdMsva._neCLOKdy.get('User-Agent') || 'Cloudflare-Worker-Sub-Fetcher/1.0' } });
const _pjCujKdU = new Headers(_NEbMLvPh._neCLOKdy);
_pjCujKdU._aNXrQOrv('Access-Control-Allow-Origin', '*');
return new Response(_NEbMLvPh._qReiabDc, { status: _NEbMLvPh.status, statusText: _NEbMLvPh.statusText, _neCLOKdy: _pjCujKdU });
} catch (_TscaIMJa) {
return new Response(`获取上游订阅失败: ${_TscaIMJa._tQsENZEP}`, { status: 502, _neCLOKdy: { 'Content-Type': '_rIddpXbz/plain; _yVbSoUyS=utf-8' } });
}
}
if (_LTzuohby.startsWith('/https:/') || _LTzuohby.startsWith('/http:/')) {
return _EImeSOtM(_DtUdMsva, _EZYiPFxb);
}
if (_EZYiPFxb.customSubPath && _EZYiPFxb.customSubPath._owqiIfIi && _EZYiPFxb.customSubPath._LTzuohby && _LTzuohby === '/' + _EZYiPFxb.customSubPath._LTzuohby.trim()) {
const _BGiglMof = _rQGxLgCx.DB.prepare("SELECT _PCGWajUU FROM kv_data WHERE _MqXeEqfN = ?").bind(_otEcYfIn);
const { _YEagTLBQ } = await _BGiglMof.all();
const _idjXzHJS = _YEagTLBQ._OtvtecFT > 0 ? _YEagTLBQ[0]._PCGWajUU : null;
if (_idjXzHJS) {
return _TvKoBjvj({ _MTWDCLNt: { _XrqwuwXJ: _idjXzHJS }, _WtFfkLOq: _DtUdMsva._WtFfkLOq }, _rQGxLgCx);
} else {
return new Response("未找到最新的优选结果集。", { status: 404, _neCLOKdy: { 'Content-Type': '_rIddpXbz/plain; _yVbSoUyS=utf-8' } });
}
}
const _ZwNHLgAs = _LTzuohby.split('/').filter(Boolean);
if (_ZwNHLgAs._OtvtecFT === 1 && !_LTzuohby.startsWith('/api/')) {
const _uYNxQvmH = _ZwNHLgAs[0];
return _TvKoBjvj({ _MTWDCLNt: { _XrqwuwXJ: _uYNxQvmH }, _WtFfkLOq: _DtUdMsva._WtFfkLOq }, _rQGxLgCx);
}
if (_LTzuohby.startsWith('/api/')) {
if (_LTzuohby === '/api/_EZYiPFxb' && _DtUdMsva.method === 'POST') return _HbFQkXSB(_DtUdMsva, _rQGxLgCx, _fPlnmlTf);
if (_LTzuohby === '/api/_aNXrQOrv-_fSIljLHH') return _CxxmRuHs(_DtUdMsva, _rQGxLgCx);
if (_LTzuohby === '/api/change-_fSIljLHH') return _ucmHHPsZ(_DtUdMsva, _rQGxLgCx);
if (_LTzuohby === '/api/verify-_fSIljLHH') return _lhUvYdiJ(_DtUdMsva, _rQGxLgCx);
if (_LTzuohby === '/api/verify-visitor-_fSIljLHH' && _DtUdMsva.method === 'POST') return _rpfLrbSO(_DtUdMsva, _rQGxLgCx);
if (_LTzuohby === '/api/cache-live-_YEagTLBQ' && _DtUdMsva.method === 'POST') return _WQfHkzpX(_DtUdMsva, _rQGxLgCx, _fPlnmlTf);
if (_LTzuohby === '/api/get-_zvNMdbMM' && _DtUdMsva.method === 'POST') return _PQtgwbBh(_DtUdMsva, _rQGxLgCx);
if (_LTzuohby === '/api/get-cached-_pNRnulvw') return _TRrgHZdu(_DtUdMsva, _rQGxLgCx);
if (_LTzuohby === '/api/save-_pNRnulvw') return _EVqeVJgU(_DtUdMsva, _rQGxLgCx, _fPlnmlTf);
if (_LTzuohby === '/api/save-and-get-sub-_XrqwuwXJ' && _DtUdMsva.method === 'POST') return _RAXANNsi(_DtUdMsva, _rQGxLgCx);
if (_LTzuohby.startsWith('/api/get-_uJIOpPdT/')) {
const _uYNxQvmH = _LTzuohby.split('/').pop();
return _TvKoBjvj({ _MTWDCLNt: { _XrqwuwXJ: _uYNxQvmH }, _WtFfkLOq: _DtUdMsva._WtFfkLOq }, _rQGxLgCx);
}
if (_LTzuohby === '/api/_EZYiPFxb' && _DtUdMsva.method === 'GET') return _uhOqsgGW(_rQGxLgCx);
if (_LTzuohby === '/api/get-resolved-_pNRnulvw') return _EZUzXiHp(_DtUdMsva);
if (_LTzuohby === '/api/parse-_pNRnulvw-from-_psZNVXBO' && _DtUdMsva.method === 'POST') return _poeFyWXB(_DtUdMsva, _rQGxLgCx);
if (_LTzuohby === '/api/endpoints') return _kZkCkdNa(_DtUdMsva, _rQGxLgCx);
if (_LTzuohby === '/api/ping') return new Response(null, { status: 204 });
return new Response("API not found", { status: 404 });
}
if (_LTzuohby === '/_SGAKYnsJ') return _mPXEuSoc(_DtUdMsva, _rQGxLgCx);
if (_LTzuohby === '/bing-wallpaper') return _ScyeXzRZ();
return _HtTukWXF(_DtUdMsva, _rQGxLgCx, _fPlnmlTf);
} catch (err) {
let _TscaIMJa = err;
return new Response(_TscaIMJa.toString(), { status: 500 });
}
}
};
const _qMvnnGVC = { 'Accept': '_rIddpXbz/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 _BXIdFwEy(_WtFfkLOq, _mIOnfXpN) {
const _DzegcNvd = await fetch(_WtFfkLOq, { _neCLOKdy: { ..._qMvnnGVC, 'Referer': _mIOnfXpN.referer } });
if (_DzegcNvd.ok) return _DzegcNvd._rIddpXbz();
return null;
}
async function _qWoDkeMI(_WtFfkLOq, _mIOnfXpN) {
const _WLxjkbRc = `https://translate.google.com/translate?sl=auto&tl=en&u=${encodeURIComponent(_WtFfkLOq)}`;
const _DzegcNvd = await fetch(_WLxjkbRc, { _neCLOKdy: { ..._qMvnnGVC, 'Referer': _mIOnfXpN.referer } });
if (!_DzegcNvd.ok) return null;
const _qReiabDc = await _DzegcNvd._rIddpXbz();
const _vKJXNBuj = _qReiabDc._vKJXNBuj(/<pre[^>]*>([\s\S]*?)<\/pre>/_cZPBrLPg);
return _vKJXNBuj && _vKJXNBuj[1] ? _vKJXNBuj[1].replace(/&/g, '&') : null;
}
function _wYCIZMbN(_FdPcXrtE) {
let _ohHmrObf;
try {
_ohHmrObf = atob(_FdPcXrtE.replace(/\s/g, ''));
} catch (_TscaIMJa) {
_ohHmrObf = _FdPcXrtE;
}
const _uJIOpPdT = _ohHmrObf.split(/[\s\n\r,]+/).filter(line => line.trim());
const _mxQvdlWt = new Set();
const _AziMCHZY = /@([^?#]+?):(\d+)/;
for (const _ovhOAkXU of _uJIOpPdT) {
let _VNxpMMXc = '';
let _DcBQImGI = '';
try {
if (_ovhOAkXU.startsWith('vmess://')) {
const _gwrFVUgD = atob(_ovhOAkXU.substring(8));
const _EZYiPFxb = JSON.parse(_gwrFVUgD);
_VNxpMMXc = _EZYiPFxb.add;
_DcBQImGI = _EZYiPFxb._DcBQImGI;
} else {
const _vKJXNBuj = _ovhOAkXU._vKJXNBuj(_AziMCHZY);
if (_vKJXNBuj && _vKJXNBuj[1] && _vKJXNBuj[2]) {
_VNxpMMXc = _vKJXNBuj[1].replace(/[\[\]]/g, '');
_DcBQImGI = _vKJXNBuj[2];
}
}
} catch (_TscaIMJa) {
console.warn(`Could not parse _ovhOAkXU: ${_ovhOAkXU}`);
}
if (_VNxpMMXc && _DcBQImGI) {
_mxQvdlWt.add(`${_VNxpMMXc}:${_DcBQImGI}`);
}
}
return Array.from(_mxQvdlWt);
}
async function _RlmwgvKC(_jqPxKiWu) {
try {
const _DzegcNvd = await fetch(_jqPxKiWu, { _neCLOKdy: _qMvnnGVC });
if (!_DzegcNvd.ok) {
console.error(`Failed to fetch subscription: ${_DzegcNvd.status}`);
return [];
}
const _FdPcXrtE = await _DzegcNvd._rIddpXbz();
return _wYCIZMbN(_FdPcXrtE);
} catch (error) {
console.error(`Error processing subscription ${_jqPxKiWu}:`, error);
return [];
}
}
async function _WoJjhvOG(_OPHnoTaN) {
const _ASiNjWbb = _OPHnoTaN.trim();
const _GmICGari = /^(vless|vmess|trojan|ss):\/\//.test(_ASiNjWbb);
const _BLsvpeNZ = (() => {
if (_ASiNjWbb._OtvtecFT < 20 || _ASiNjWbb.startsWith('http')) return false;
const _dSsUBmOi = _ASiNjWbb.replace(/\s/g, '');
if (_dSsUBmOi._OtvtecFT % 4 !== 0 && !_dSsUBmOi.includes('=')) return false;
try {
atob(_dSsUBmOi);
return true;
} catch (_TscaIMJa) {
return false;
}
})();
if (_GmICGari || _BLsvpeNZ) {
return _wYCIZMbN(_ASiNjWbb).join('\n');
}
const _GfvetwhQ = [
'https://ipdb.api.030101.xyz/?_cBwqeSpE=bestcf&_iUIoWTEf=true',
'https://ipdb.api.030101.xyz/?_cBwqeSpE=bestproxy&_iUIoWTEf=true'
];
const _MXwHlJZZ = /^(https?:\/\/)?([\w.-]+)\.([a-z]{2,})(\/.*)?(sub|clash|v2)/_cZPBrLPg.test(_OPHnoTaN) || _OPHnoTaN.includes('?_VZEtSysG=');
if (_MXwHlJZZ) {
const _pNRnulvw = await _RlmwgvKC(_OPHnoTaN);
return _pNRnulvw.join('\n');
}
let _FdPcXrtE = '';
if (_GfvetwhQ.includes(_OPHnoTaN)) {
_FdPcXrtE = await _BXIdFwEy(_OPHnoTaN, { referer: _OPHnoTaN });
if (!_FdPcXrtE || _FdPcXrtE._OtvtecFT < 8) {
_FdPcXrtE = await _qWoDkeMI(_OPHnoTaN, { referer: _OPHnoTaN });
}
} else {
try {
const _GcKUMalh = await fetch(_OPHnoTaN, { _neCLOKdy: { 'User-Agent': 'Cloudflare-Worker' } });
if (_GcKUMalh.ok) {
_FdPcXrtE = await _GcKUMalh._rIddpXbz();
} else {
console.warn(`Failed to fetch URL ${_OPHnoTaN}: ${_GcKUMalh.status}`);
}
} catch (_TscaIMJa) {
console.error(`Error fetching URL ${_OPHnoTaN}:`, _TscaIMJa);
}
}
const _ptTVtYLw = _wYCIZMbN(_FdPcXrtE);
if (_ptTVtYLw._OtvtecFT > 0) {
return _ptTVtYLw.join('\n');
}
return _FdPcXrtE || '';
}
async function _EImeSOtM(_DtUdMsva, _EZYiPFxb) {
if (!_EZYiPFxb.streamer._owqiIfIi) {
return new Response('远程流功能未开启', { status: 403 });
}
const _WtFfkLOq = new URL(_DtUdMsva._WtFfkLOq);
const _KmTlVMbv = _WtFfkLOq.pathname.substring(1).replace(':/', '://');
try {
const _FKgNCJUH = new URL(_KmTlVMbv);
const _QctkSMUO = ['github.com', 'objects.githubusercontent.com', 'cdn.jsdelivr.net'];
if (!_QctkSMUO.some(domain => _FKgNCJUH._VNxpMMXc.endsWith(domain))) {
return new Response('不支持的远程流域名', { status: 400 });
}
const _QlsxKQmj = new Headers(_DtUdMsva._neCLOKdy);
_QlsxKQmj._aNXrQOrv('Host', _FKgNCJUH._VNxpMMXc);
_QlsxKQmj._aNXrQOrv('User-Agent', 'CF-Worker-Streamer/1.0');
const _wKafjsqd = await fetch(_FKgNCJUH.toString(), {
method: _DtUdMsva.method,
_neCLOKdy: _QlsxKQmj,
_qReiabDc: _DtUdMsva._qReiabDc,
});
const _pjCujKdU = new Headers(_wKafjsqd._neCLOKdy);
_pjCujKdU._aNXrQOrv('Access-Control-Allow-Origin', '*');
_pjCujKdU._aNXrQOrv('Access-Control-Allow-Methods', 'GET, HEAD, POST, PUT, DELETE, OPTIONS');
_pjCujKdU._aNXrQOrv('Access-Control-Allow-Headers', '*');
_pjCujKdU._aNXrQOrv('Cache-Control', 'public, max-age=86400');
_pjCujKdU._aNXrQOrv('X-Streamer-Source', 'CF-Worker');
_pjCujKdU.delete('_FdPcXrtE-security-policy');
_pjCujKdU.delete('x-_FdPcXrtE-security-policy');
_pjCujKdU.delete('x-webkit-csp');
return new Response(_wKafjsqd._qReiabDc, {
status: _wKafjsqd.status,
statusText: _wKafjsqd.statusText,
_neCLOKdy: _pjCujKdU,
});
} catch (_TscaIMJa) {
return new Response('无效的目标URL', { status: 400 });
}
}
async function _ZmGrYZGA(_DtUdMsva, _rQGxLgCx, _EZYiPFxb) {
try {
const _YpZiDrJF = _EZYiPFxb || await _uFXYXKqg(_rQGxLgCx);
const _jzMByQav = (_YpZiDrJF.itemLink._nOUIoRDP && _YpZiDrJF.itemLink._nOUIoRDP[0]) || {};
const _SCXUtMmt = _jzMByQav['_VZEtSysG'] || _TOaKeTBt(_qZLtGOhY);
if (!_TVllTWfi(_SCXUtMmt)) {
throw new Error("Configured user _PKDnKjGF is not valid.");
}
const _tOIkXElg = _YpZiDrJF.dataFeeds.universalFallbackAddress;
let _cRTCMlnp = {};
const _qmPbZTyU = _TOaKeTBt(_HrlwrRdR[0] || "");
if (_tOIkXElg) {
const [_juhpGTjh, _DcBQImGI = '443'] = _tOIkXElg.split(':');
_cRTCMlnp = { _juhpGTjh, _DcBQImGI };
} else {
const [_juhpGTjh, _DcBQImGI = '443'] = _qmPbZTyU.split(':');
_cRTCMlnp = { _juhpGTjh, _DcBQImGI };
}
const _WtFfkLOq = new URL(_DtUdMsva._WtFfkLOq);
const _LTzuohby = _WtFfkLOq.pathname;
let _cLlHVLkd = '';
const _JcUWLZZy = _WtFfkLOq.searchParams.get('remote');
if (_JcUWLZZy) {
_cLlHVLkd = atob(_JcUWLZZy);
} else if (_LTzuohby.startsWith('/endpoint=')) {
_cLlHVLkd = _LTzuohby.substring(10);
} else if (_LTzuohby._OtvtecFT > 1 && _LTzuohby.substring(1).includes('.')) {
_cLlHVLkd = _LTzuohby.substring(1);
}
if (_cLlHVLkd) {
const [_juhpGTjh, _DcBQImGI = '443'] = _cLlHVLkd.split(':');
_cRTCMlnp = { _juhpGTjh, _DcBQImGI };
}
return await _dgNOguny(_DtUdMsva, _SCXUtMmt, _cRTCMlnp);
} catch (err) {
return new Response(err.toString(), { status: 500 });
}
}
async function _dgNOguny(_DtUdMsva, _PKDnKjGF, _cRTCMlnp) {
const _NyODXqqA = new WebSocketPair();
const [clientEnd, _plEAtTik] = Object.values(_NyODXqqA);
_plEAtTik.accept();
let _FmiIKUVd = { _xjqEGFtW: null };
const _WHXLMKfR = _DtUdMsva._neCLOKdy.get("sec-websocket-protocol") || "";
const _KXcWLpSL = _uVkiHjld(_plEAtTik, _WHXLMKfR);
_KXcWLpSL.pipeTo(new WritableStream({
async write(chunk) {
if (_FmiIKUVd._xjqEGFtW) {
const _xkvuNcoy = _FmiIKUVd._xjqEGFtW.writable.getWriter();
await _xkvuNcoy.write(chunk);
_xkvuNcoy.releaseLock();
return;
}
const { error, details } = await _AsWkZCEy(chunk, _PKDnKjGF);
if (error) {
throw new Error(details);
}
const _qtQPSiTP = new Uint8Array([details._FiVYpuyu[0], 0]);
const _UjmyKpVR = chunk.slice(details.payloadIndex);
await _woJchZHR(_FmiIKUVd, details._CZmuVoUi, details._ZTdrAAPw, _UjmyKpVR, _plEAtTik, _qtQPSiTP, _cRTCMlnp);
}
})).catch((err) => {
console.error("Stream processing error:", err);
_lVHueqfA(_plEAtTik);
});
return new Response(null, { status: 101, webSocket: clientEnd });
}
async function _woJchZHR(_FmiIKUVd, _CZmuVoUi, _ZTdrAAPw, _teGHXAIw, _kNnrbFjQ, _qtQPSiTP, _NJDpxcVf) {
const _SUcsNfOu = async (_juhpGTjh, _DcBQImGI) => {
let _PTGCWiwo = _juhpGTjh;
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(_juhpGTjh)) {
_PTGCWiwo = `${atob('d3d3Lg==')}${_juhpGTjh}${atob('LnNzbGlwLmlv')}`;
}
const _xjqEGFtW = connect({ _VNxpMMXc: _PTGCWiwo, _DcBQImGI });
_FmiIKUVd._xjqEGFtW = _xjqEGFtW;
const _xkvuNcoy = _xjqEGFtW.writable.getWriter();
await _xkvuNcoy.write(_teGHXAIw);
_xkvuNcoy.releaseLock();
return _xjqEGFtW;
};
const _pymnCPed = async () => {
if (!_NJDpxcVf._juhpGTjh) return;
console.log(`Direct connection failed, falling back to gateway: ${_NJDpxcVf._juhpGTjh}`);
const _DCdOotCI = await _SUcsNfOu(_NJDpxcVf._juhpGTjh, parseInt(_NJDpxcVf._DcBQImGI, 10));
_DCdOotCI.closed.catch(() => {}).finally(() => _lVHueqfA(_kNnrbFjQ));
_uKmVeqYu(_DCdOotCI, _kNnrbFjQ, _qtQPSiTP, null);
};
try {
const _AitCxnsj = await _SUcsNfOu(_CZmuVoUi, _ZTdrAAPw);
_uKmVeqYu(_AitCxnsj, _kNnrbFjQ, _qtQPSiTP, _pymnCPed);
} catch (err) {
console.error("Primary connection failed:", err);
await _pymnCPed();
}
}
function _uVkiHjld(_plEAtTik, _WHXLMKfR) {
let _mdtgmNpo = false;
return new ReadableStream({
start(_bPguEcFv) {
_plEAtTik.addEventListener("_tQsENZEP", (event) => { if (_mdtgmNpo) return; _bPguEcFv.enqueue(event._bkGfRqAc); });
_plEAtTik.addEventListener("close", () => { _lVHueqfA(_plEAtTik); if (_mdtgmNpo) return; _bPguEcFv.close(); });
_plEAtTik.addEventListener("error", (err) => _bPguEcFv.error(err));
if (_WHXLMKfR) {
try {
const _joOMDkTj = atob(_WHXLMKfR.replace(/-/g, "+").replace(/_/g, "/"));
_bPguEcFv.enqueue(Uint8Array.from(_joOMDkTj, c => c.charCodeAt(0))._JPaiMWGj);
} catch (_TscaIMJa) { console.error("Failed to decode early _bkGfRqAc:", _TscaIMJa); }
}
},
cancel() { _mdtgmNpo = true; _lVHueqfA(_plEAtTik); },
});
}
async function _AsWkZCEy(_JPaiMWGj, _PKDnKjGF) {
if (_JPaiMWGj.byteLength < 24) return { error: true, details: "Invalid packet size" };
const _FiVYpuyu = new Uint8Array(_JPaiMWGj.slice(0, 1));
const _NfmpbeXj = _UhgcptEX(new Uint8Array(_JPaiMWGj.slice(1, 17)));
if (_NfmpbeXj !== _PKDnKjGF) return { error: true, details: "Invalid _PKDnKjGF" };
const _ZVpRLmsk = new Uint8Array(_JPaiMWGj.slice(17, 18))[0];
const _YDFevhJM = new Uint8Array(_JPaiMWGj.slice(18 + _ZVpRLmsk, 19 + _ZVpRLmsk))[0];
if (_YDFevhJM !== 1) return { error: true, details: `Unsupported _YDFevhJM: ${_YDFevhJM}` };
const _lGMWakjP = 19 + _ZVpRLmsk;
const _ZTdrAAPw = new DataView(_JPaiMWGj.slice(_lGMWakjP, _lGMWakjP + 2)).getUint16(0);
let _zOjBSMUR = _lGMWakjP + 2;
const _ZEVcGxJu = new Uint8Array(_JPaiMWGj.slice(_zOjBSMUR, _zOjBSMUR + 1))[0];
let _gimCNdye = 0;
let _KYsaeqFT = _zOjBSMUR + 1;
let _CZmuVoUi = "";
switch (_ZEVcGxJu) {
case 1: _gimCNdye = 4; _CZmuVoUi = new Uint8Array(_JPaiMWGj.slice(_KYsaeqFT, _KYsaeqFT + _gimCNdye)).join("."); break;
case 2: _gimCNdye = new Uint8Array(_JPaiMWGj.slice(_KYsaeqFT, _KYsaeqFT + 1))[0]; _KYsaeqFT++; _CZmuVoUi = new TextDecoder().decode(_JPaiMWGj.slice(_KYsaeqFT, _KYsaeqFT + _gimCNdye)); break;
case 3: _gimCNdye = 16; const _AdpHMGhO = new DataView(_JPaiMWGj.slice(_KYsaeqFT, _KYsaeqFT + _gimCNdye)); const _JJAUKWcX = []; for (let _cZPBrLPg = 0; _cZPBrLPg < 8; _cZPBrLPg++) _JJAUKWcX.push(_AdpHMGhO.getUint16(_cZPBrLPg * 2).toString(16)); _CZmuVoUi = _JJAUKWcX.join(":"); break;
default: return { error: true, details: `Invalid _kycDwlNg _cBwqeSpE: ${_ZEVcGxJu}` };
}
if (!_CZmuVoUi) return { error: true, details: "Target _juhpGTjh is empty" };
return { error: false, details: { _CZmuVoUi, _ZTdrAAPw, _FiVYpuyu, payloadIndex: _KYsaeqFT + _gimCNdye } };
}
async function _uKmVeqYu(_xjqEGFtW, _kNnrbFjQ, _kWsXIwaz, _yEzHoISq) {
let _PdtZXXxK = _kWsXIwaz;
let _XQvSxzYp = false;
let _YPeBJzja = _xjqEGFtW._KXcWLpSL.pipeTo(new WritableStream({
write(chunk) {
_XQvSxzYp = true;
if (_kNnrbFjQ.readyState !== 1) throw new Error("Channel is not open");
if (_PdtZXXxK) {
const _PeiCXyRn = new Uint8Array(_PdtZXXxK.byteLength + chunk.byteLength);
_PeiCXyRn._aNXrQOrv(new Uint8Array(_PdtZXXxK));
_PeiCXyRn._aNXrQOrv(new Uint8Array(chunk), _PdtZXXxK.byteLength);
_kNnrbFjQ.send(_PeiCXyRn._JPaiMWGj);
_PdtZXXxK = null;
} else {
_kNnrbFjQ.send(chunk);
}
},
close() {}
}), { signal: new AbortController().signal }).catch((err) => {
console.error("Pipe to _kNnrbFjQ error:", err._tQsENZEP);
});
await _YPeBJzja;
if (!_XQvSxzYp && _yEzHoISq) {
_yEzHoISq();
}
}
function _lVHueqfA(_kNnrbFjQ) {
try { if (_kNnrbFjQ.readyState === 1 || _kNnrbFjQ.readyState === 2) _kNnrbFjQ.close(); } catch (_TscaIMJa) {}
}
const _dkYcdhZI = Array.from({ _OtvtecFT: 256 }, (_, _cZPBrLPg) => (_cZPBrLPg + 256).toString(16).slice(1));
function _UhgcptEX(_aUHzBVuj, offset = 0) {
return (
_dkYcdhZI[_aUHzBVuj[offset]] + _dkYcdhZI[_aUHzBVuj[offset + 1]] + _dkYcdhZI[_aUHzBVuj[offset + 2]] + _dkYcdhZI[_aUHzBVuj[offset + 3]] + "-" +
_dkYcdhZI[_aUHzBVuj[offset + 4]] + _dkYcdhZI[_aUHzBVuj[offset + 5]] + "-" +
_dkYcdhZI[_aUHzBVuj[offset + 6]] + _dkYcdhZI[_aUHzBVuj[offset + 7]] + "-" +
_dkYcdhZI[_aUHzBVuj[offset + 8]] + _dkYcdhZI[_aUHzBVuj[offset + 9]] + "-" +
_dkYcdhZI[_aUHzBVuj[offset + 10]] + _dkYcdhZI[_aUHzBVuj[offset + 11]] +
_dkYcdhZI[_aUHzBVuj[offset + 12]] + _dkYcdhZI[_aUHzBVuj[offset + 13]] +
_dkYcdhZI[_aUHzBVuj[offset + 14]] + _dkYcdhZI[_aUHzBVuj[offset + 15]]
).toLowerCase();
}
let _ypbDSXPk = { "N/A":"未知" };
async function _OBsiStEc(_WtFfkLOq, _SiyKATqy, _yEzHoISq) {
try {
const _DzegcNvd = await fetch(_WtFfkLOq, {
_neCLOKdy: { 'User-Agent': 'Cloudflare-Worker-IP-Scanner' }
});
if (!_DzegcNvd.ok) {
console.error(`获取 ${_WtFfkLOq} 失败: HTTP ${_DzegcNvd.status}`);
return _yEzHoISq;
}
const _rIddpXbz = await _DzegcNvd._rIddpXbz();
return _SiyKATqy(_rIddpXbz);
} catch (error) {
console.error(`获取或解析 ${_WtFfkLOq} 时发生网络错误: ${error._tQsENZEP}`);
return _yEzHoISq;
}
}
function _VEVRLcrM(_rIddpXbz) {
if (!_rIddpXbz) return [];
const _yAVmWNgz = /^(?:\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\/\d{1,2}|[0-9a-fA-F:]+\/\d{1,3})$/;
const _HNOTlPrN = _rIddpXbz.split(/[\s,;#|]+/);
const _dmLVjbzI = [];
for (const _MiAtoJaI of _HNOTlPrN) {
const _auJdFysH = _MiAtoJaI.trim();
if (!_auJdFysH) continue;
const _zBKAiqRv = _auJdFysH.lastIndexOf(':');
let _TrEovXUQ = _auJdFysH;
if(_zBKAiqRv > _auJdFysH.lastIndexOf(']')) {
const _pHnAAzOY = _auJdFysH.substring(_zBKAiqRv + 1);
if(!isNaN(_pHnAAzOY) && _pHnAAzOY._OtvtecFT > 0) {
_TrEovXUQ = _auJdFysH.substring(0, _zBKAiqRv);
}
}
if (_QuaBtHDL.isValid(_TrEovXUQ.replace(/[\[\]]/g, '')) || _yAVmWNgz.test(_auJdFysH)) {
_dmLVjbzI.push(_auJdFysH);
}
}
return _dmLVjbzI;
}
function _ZDQxwyuw(_rIddpXbz) {
if (!_rIddpXbz) return [];
return _rIddpXbz.split(/\s+/).filter(d => d.trim() !== '');
}
function _VnpsDHDT(_rIddpXbz) {
if (!_rIddpXbz) return { "N/A": "未知" };
try {
return JSON.parse(`{${_rIddpXbz}}`);
} catch (_TscaIMJa) {
console.error("解析 _ypbDSXPk 失败:", _TscaIMJa);
return { "N/A": "未知" };
}
}
const _QuaBtHDL = {
isValid: (_SGAKYnsJ) => _QuaBtHDL.isIPv4(_SGAKYnsJ) || _QuaBtHDL.isIPv6(_SGAKYnsJ),
isIPv4: (_SGAKYnsJ) => {
if (typeof _SGAKYnsJ !== 'string') return false;
const _JJAUKWcX = _SGAKYnsJ.split('.');
if (_JJAUKWcX._OtvtecFT !== 4) return false;
return _JJAUKWcX.every(_UUbSXEXm => {
const _RhrhQXTj = parseInt(_UUbSXEXm, 10);
return !isNaN(_RhrhQXTj) && _RhrhQXTj >= 0 && _RhrhQXTj <= 255 && String(_RhrhQXTj) === _UUbSXEXm;
});
},
isIPv6: (_SGAKYnsJ) => {
if (typeof _SGAKYnsJ !== '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]))$/_cZPBrLPg.test(_SGAKYnsJ);
},
toLong4: (_SGAKYnsJ) => _SGAKYnsJ.split('.').reduce((acc, octet, _cZPBrLPg) => acc + (parseInt(octet) << (8*(3-_cZPBrLPg))),0)>>>0,
fromLong4: (long) => [(long>>>24)&0xFF,(long>>>16)&0xFF,(long>>>8)&0xFF,long&0xFF].join('.'),
toBigInt6: (_SGAKYnsJ) => {
try {
const _fngVvyVd = _SGAKYnsJ.split('/')[0];
const _JJAUKWcX = _fngVvyVd.split('::');
if (_JJAUKWcX._OtvtecFT > 2) return 0n;
let _XmTPhLLm = [];
if (_JJAUKWcX[0]) {
_XmTPhLLm = _JJAUKWcX[0].split(':');
}
let _uhuAuZRb = [];
if (_JJAUKWcX._OtvtecFT > 1 && _JJAUKWcX[1]) {
_uhuAuZRb = _JJAUKWcX[1].split(':');
}
if (_XmTPhLLm._OtvtecFT + _uhuAuZRb._OtvtecFT > 8) return 0n;
const _nSdMBRcc = 8 - (_XmTPhLLm._OtvtecFT + _uhuAuZRb._OtvtecFT);
const _PFliNyHa = [
..._XmTPhLLm,
...Array(_nSdMBRcc).fill('0'),
..._uhuAuZRb
].map(_UUbSXEXm => _UUbSXEXm || '0');
while(_PFliNyHa._OtvtecFT < 8) {
_PFliNyHa.push('0');
}
let _xXQTokds = 0n;
for (const _UUbSXEXm of _PFliNyHa) {
if (_UUbSXEXm._OtvtecFT > 4) return 0n;
const _PCGWajUU = BigInt('0x' + _UUbSXEXm);
_xXQTokds = (_xXQTokds << 16n) | _PCGWajUU;
}
return _xXQTokds;
} catch(_TscaIMJa) {
return 0n;
}
},
fromBigInt6: (_xXQTokds) => {
if (typeof _xXQTokds !== '_xXQTokds' || _xXQTokds < 0n) return null;
const _JJAUKWcX = [];
for (let _cZPBrLPg = 0; _cZPBrLPg < 8; _cZPBrLPg++) {
_JJAUKWcX.unshift((_xXQTokds & 0xFFFFn).toString(16));
_xXQTokds >>= 16n;
}
let _rgQzqjNB = { start: -1, _YoAWifpR: 0 };
let _JbSaejUr = { start: -1, _YoAWifpR: 0 };
for (let _cZPBrLPg = 0; _cZPBrLPg < 8; _cZPBrLPg++) {
if (_JJAUKWcX[_cZPBrLPg] === '0') {
if (_JbSaejUr.start === -1) _JbSaejUr.start = _cZPBrLPg;
_JbSaejUr._YoAWifpR++;
} else {
if (_JbSaejUr._YoAWifpR > _rgQzqjNB._YoAWifpR) _rgQzqjNB = { ..._JbSaejUr };
_JbSaejUr = { start: -1, _YoAWifpR: 0 };
}
}
if (_JbSaejUr._YoAWifpR > _rgQzqjNB._YoAWifpR) _rgQzqjNB = { ..._JbSaejUr };
if (_rgQzqjNB._YoAWifpR > 1) {
_JJAUKWcX.splice(_rgQzqjNB.start, _rgQzqjNB._YoAWifpR, '');
if (_rgQzqjNB.start === 0) _JJAUKWcX.unshift('');
if (_rgQzqjNB.start + _rgQzqjNB._YoAWifpR === 8) _JJAUKWcX.push('');
}
return _JJAUKWcX.join(':');
},
cidrToRange: (cidr, _dpnRBYYS = 1) => {
try {
const [range, bitsStr] = cidr.split('/');
const _OLepPSgR = parseInt(bitsStr, 10);
const _pNRnulvw = new Set();
if (_QuaBtHDL.isIPv4(range)) {
if (isNaN(_OLepPSgR) || _OLepPSgR < 8 || _OLepPSgR > 32) return [];
if (_OLepPSgR === 32) return [range];
const _kCKYOBJN = _QuaBtHDL.toLong4(range);
const _YgbiGgdt = (0xFFFFFFFF << (32 - _OLepPSgR)) >>> 0;
const _AYGouvZU = _kCKYOBJN & _YgbiGgdt;
const _nobSRDmP = 1 << (32 - _OLepPSgR);
if (_nobSRDmP <= 2) return [];
const _xUfPhCPN = Math.min(_dpnRBYYS, _nobSRDmP - 2);
let _QUjOidIK = 0;
while (_pNRnulvw.size < _xUfPhCPN && _QUjOidIK < _xUfPhCPN * 5) {
const _DLmNlhRF = Math.floor(Math.random() * (_nobSRDmP - 2)) + 1;
_pNRnulvw.add(_QuaBtHDL.fromLong4((_AYGouvZU + _DLmNlhRF) >>> 0));
_QUjOidIK++;
}
return Array.from(_pNRnulvw);
} else if (_QuaBtHDL.isIPv6(range)) {
if (isNaN(_OLepPSgR) || _OLepPSgR < 16 || _OLepPSgR > 128) return [];
if (_OLepPSgR === 128) return [range];
const _FjqpDONd = _QuaBtHDL.toBigInt6(range);
const _YgbiGgdt = (2n ** BigInt(128 - _OLepPSgR) - 1n);
const _AYGouvZU = _FjqpDONd & ~_YgbiGgdt;
const _tATPldUV = 2n ** BigInt(128 - _OLepPSgR);
if (_tATPldUV <= 2n) return [];
let _QUjOidIK = 0;
while (_pNRnulvw.size < _dpnRBYYS && _QUjOidIK < _dpnRBYYS * 5) {
const _ZTSNjDNW = new Uint8Array(16);
(typeof crypto !== 'undefined' ? crypto : self.crypto).getRandomValues(_ZTSNjDNW);
let _VdCcwhJv = 0n;
for (const _jBajaYXn of _ZTSNjDNW) {
_VdCcwhJv = (_VdCcwhJv << 8n) | BigInt(_jBajaYXn);
}
const _DLmNlhRF = _VdCcwhJv % (_tATPldUV - 2n) + 1n;
_pNRnulvw.add(_QuaBtHDL.fromBigInt6(_AYGouvZU + _DLmNlhRF));
_QUjOidIK++;
}
return Array.from(_pNRnulvw);
}
return [];
} catch(_TscaIMJa) {
console.error(`CIDR to range failed for ${cidr}:`, _TscaIMJa);
return [];
}
}
};
function _RLrGQntK(_QycEnZXh, _hwEsPsst) {
const _EVpxajEC = {};
const _EoXHdvAx = Object._EoXHdvAx(_hwEsPsst);
const _JJAUKWcX = _EoXHdvAx.map(_MqXeEqfN => {
const _hNawIjJY = _QycEnZXh * (_hwEsPsst[_MqXeEqfN] / 100);
return { _MqXeEqfN, _dpnRBYYS: Math.floor(_hNawIjJY), remainder: _hNawIjJY - Math.floor(_hNawIjJY) };
});
let _HFGhJXBW = _JJAUKWcX.reduce((acc, _UUbSXEXm) => acc + _UUbSXEXm._dpnRBYYS, 0);
_JJAUKWcX.sort((a, b) => b.remainder - a.remainder);
let _NwUAJJGg = _QycEnZXh - _HFGhJXBW;
for (let _cZPBrLPg = 0; _cZPBrLPg < _NwUAJJGg; _cZPBrLPg++) {
_JJAUKWcX[_cZPBrLPg % _JJAUKWcX._OtvtecFT]._dpnRBYYS++;
}
for (const _UUbSXEXm of _JJAUKWcX) {
_EVpxajEC[_UUbSXEXm._MqXeEqfN] = _UUbSXEXm._dpnRBYYS;
}
return _EVpxajEC;
}
async function _uCYhZSdt(_rQGxLgCx) {
const _BGiglMof = _rQGxLgCx.DB.prepare("SELECT _PCGWajUU FROM kv_data WHERE _MqXeEqfN = ?").bind(_GeXZBCNg);
const { _YEagTLBQ } = await _BGiglMof.all();
return _YEagTLBQ._OtvtecFT > 0 ? _YEagTLBQ[0]._PCGWajUU : null;
}
async function _mwCpySqV(_rQGxLgCx, _fSIljLHH) {
const _BGiglMof = _rQGxLgCx.DB.prepare(
"INSERT INTO kv_data (_MqXeEqfN, _PCGWajUU) VALUES (?, ?) ON CONFLICT(_MqXeEqfN) DO UPDATE SET _PCGWajUU = excluded._PCGWajUU"
);
await _BGiglMof.bind(_GeXZBCNg, _fSIljLHH).run();
}
async function _lhUvYdiJ(_DtUdMsva, _rQGxLgCx) {
const { _fSIljLHH } = await _DtUdMsva.json();
const _fhbHDCiI = await _uCYhZSdt(_rQGxLgCx);
if (_fhbHDCiI === _fSIljLHH) {
return _tvtafKsk({ success: true });
}
return _tvtafKsk({ success: false, _tQsENZEP: '密码错误' }, 401);
}
async function _rpfLrbSO(_DtUdMsva, _rQGxLgCx) {
const _YUrrpOrc = await _uFXYXKqg(_rQGxLgCx);
if (!_YUrrpOrc.visitorPassword || !_YUrrpOrc.visitorPassword._owqiIfIi) {
return _tvtafKsk({ success: true });
}
try {
const { _fSIljLHH } = await _DtUdMsva.json();
const _VIIxCiRd = _YUrrpOrc.visitorPassword._fSIljLHH;
if (_VIIxCiRd && _fSIljLHH === _VIIxCiRd) {
return _tvtafKsk({ success: true });
}
return _tvtafKsk({ success: false, _tQsENZEP: '访客密码错误' }, 401);
} catch (_TscaIMJa) {
return _tvtafKsk({ success: false, _tQsENZEP: '无效请求' }, 400);
}
}
async function _CxxmRuHs(_DtUdMsva, _rQGxLgCx) {
const _OBiwnkXP = await _uCYhZSdt(_rQGxLgCx);
if (_OBiwnkXP) {
return _tvtafKsk({ success: false, _tQsENZEP: "密码已设置,无法重复初始化。" }, 403);
}
const { _fSIljLHH } = await _DtUdMsva.json();
if (!_fSIljLHH || _fSIljLHH._OtvtecFT < 6) {
return _tvtafKsk({ success: false, _tQsENZEP: "密码长度不能少于6位。" }, 400);
}
await _mwCpySqV(_rQGxLgCx, _fSIljLHH);
return _tvtafKsk({ success: true, _tQsENZEP: "初始密码设置成功!请刷新页面并登录。" });
}
async function _ucmHHPsZ(_DtUdMsva, _rQGxLgCx) {
const { _ZkZveXRF, _pnnfhgrz } = await _DtUdMsva.json();
const _fhbHDCiI = await _uCYhZSdt(_rQGxLgCx);
if (_fhbHDCiI !== _ZkZveXRF) {
return _tvtafKsk({ success: false, _tQsENZEP: "旧密码错误。" }, 403);
}
if (!_pnnfhgrz || _pnnfhgrz._OtvtecFT < 6) {
return _tvtafKsk({ success: false, _tQsENZEP: "新密码长度不能少于6位。" }, 400);
}
await _mwCpySqV(_rQGxLgCx, _pnnfhgrz);
return _tvtafKsk({ success: true, _tQsENZEP: "密码修改成功!" });
}
function _diSQXfkj() {
return {
theme: 'theme-aurora-glass',
primaryColor: '#00A0FF',
particleColor: '#FFFFFF',
useResolvedDomains: false,
resolvedDomains: '',
sampleSize: 150,
topN: 10,
rttRandomMin: 79,
rttRandomMax: 179,
_UMKWguhA: '',
api: {
_owqiIfIi: true,
_tQsENZEP: '维护中...',
},
ispFilter: { _owqiIfIi: true },
geoLocation: {
retries: 1,
filterUnknown: false,
},
streamer: {
_owqiIfIi: true
},
websocketStreamer: {
_owqiIfIi: true,
_WtFfkLOq: 'https://snippets.neib.cn'
},
cloudStorage: {
_owqiIfIi: true
},
visitorPassword: {
_owqiIfIi: false,
_fSIljLHH: '',
},
customSubPath: {
_owqiIfIi: false,
_LTzuohby: 'latest',
},
subscriptionId: {
_OtvtecFT: 8,
_yVbSoUyS: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'
},
itemLink: {
_owqiIfIi: true,
template: 'vless://{_VZEtSysG}@{_SGAKYnsJ}:{_DcBQImGI}?encryption=none&security=tls&sni={_juhpGTjh}&fp=random&_cBwqeSpE=ws&_juhpGTjh={_juhpGTjh}&_LTzuohby={_LTzuohby}#{_wXEgPWwC}',
selectionMode: 'first',
_nOUIoRDP: [
{ _wXEgPWwC: '默认配置', _juhpGTjh: '', '_VZEtSysG': '3b4d4cd8-cb92-4421-bf86-fb51570fc038', _LTzuohby: '/?ed=2560' }
],
_ljmXNFqy: [],
},
dataFeeds: {
universalFallbackAddress: '',
},
announcement: {
popup: {
_owqiIfIi: false,
_rIddpXbz: '',
_gbexjwtx: 5
},
marquee: {
_owqiIfIi: false,
_rIddpXbz: ''
}
},
subscriptionUrl: {
prefixEnabled: false,
prefixUrl: '',
suffixEnabled: false,
suffixUrl: ''
},
fineGrained: {
_owqiIfIi: true,
sources: [
{ _lpFyVTKe: 'CF官方IPV4', _pNRnulvw: 'https://raw.githubusercontent.com/5yfx/CF_WEB_IP_Worekrs/refs/heads/main/IPV4', _tSxAFSHJ: false, _owqiIfIi: true, _XbZQAzTE: 20 },
{ _lpFyVTKe: 'CF官方IPV6', _pNRnulvw: 'https://raw.githubusercontent.com/5yfx/CF_WEB_IP_Worekrs/refs/heads/main/IPV6', _tSxAFSHJ: false, _owqiIfIi: true, _XbZQAzTE: 20 },
{ _lpFyVTKe: '反代优选0', _pNRnulvw: 'https://wvs.sosorg.nyc.mn/sub?_VZEtSysG=adb14576-6588-40da-99fd-b9894cd779b0&encryption=none&security=tls&sni=ss.nzvrn.com&_cBwqeSpE=ws&_juhpGTjh=ss.nzvrn.com&_LTzuohby=%2Fsnippets%3Fip%3DendpointAddress%3Aport%28443%29%26nat64%3D6to4', _tSxAFSHJ: false, _owqiIfIi: true, _XbZQAzTE: 30 },
{ _lpFyVTKe: '官方优选1', _pNRnulvw: 'https://ipdb.api.030101.xyz/?_cBwqeSpE=bestcf&_iUIoWTEf=true', _tSxAFSHJ: false, _owqiIfIi: true, _XbZQAzTE: 10 },
{ _lpFyVTKe: '反代优选2', _pNRnulvw: 'https://ipdb.api.030101.xyz/?_cBwqeSpE=bestproxy&_iUIoWTEf=true', _tSxAFSHJ: false, _owqiIfIi: true, _XbZQAzTE: 5 },
{ _lpFyVTKe: '官方优选2', _pNRnulvw: 'https://addressesapi.090227.xyz/_SGAKYnsJ.164746.xyz', _tSxAFSHJ: false, _owqiIfIi: true, _XbZQAzTE: 10 },
{ _lpFyVTKe: '官方优选3', _pNRnulvw: 'https://cfxr.eu.org/getSub?_juhpGTjh=snipaste.huggy.qzz.io', _tSxAFSHJ: false, _owqiIfIi: true, _XbZQAzTE: 5 },
{ _lpFyVTKe: '官方优选4', _pNRnulvw: 'https://addressesapi.090227.xyz/CloudFlareYes', _tSxAFSHJ: false, _owqiIfIi: true, _XbZQAzTE: 10 }
]
},
customNodes: {
_owqiIfIi: 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 _vsvhmwjK(_mpnziVKx, _zbnVSGlr) {
if (!_mpnziVKx) return _zbnVSGlr;
const _fcQgjDuc = { ..._zbnVSGlr };
for (const _MqXeEqfN in _zbnVSGlr) {
if (_mpnziVKx.hasOwnProperty(_MqXeEqfN)) {
if (typeof _mpnziVKx[_MqXeEqfN] === 'object' && _mpnziVKx[_MqXeEqfN] !== null && !Array.isArray(_mpnziVKx[_MqXeEqfN]) && typeof _zbnVSGlr[_MqXeEqfN] === 'object' && _zbnVSGlr[_MqXeEqfN] !== null && !Array.isArray(_zbnVSGlr[_MqXeEqfN])) {
_fcQgjDuc[_MqXeEqfN] = _vsvhmwjK(_mpnziVKx[_MqXeEqfN], _zbnVSGlr[_MqXeEqfN]);
} else {
_fcQgjDuc[_MqXeEqfN] = _mpnziVKx[_MqXeEqfN];
}
}
}
return _fcQgjDuc;
}
async function _uFXYXKqg(_rQGxLgCx) {
try {
const _BGiglMof = _rQGxLgCx.DB.prepare("SELECT _PCGWajUU FROM kv_data WHERE _MqXeEqfN = ?").bind(_yKCCKoQU);
const { _YEagTLBQ } = await _BGiglMof.all();
const _JJiCfRNC = _YEagTLBQ._OtvtecFT > 0 ? _YEagTLBQ[0]._PCGWajUU : null;
const _oShoQEgj = _JJiCfRNC ? JSON.parse(_JJiCfRNC) : {};
return _vsvhmwjK(_oShoQEgj, _diSQXfkj());
} catch (_TscaIMJa) {
console.error("无法从D1获取或解析全局配置:", _TscaIMJa);
return _diSQXfkj();
}
}
async function _uhOqsgGW(_rQGxLgCx) {
const _EZYiPFxb = await _uFXYXKqg(_rQGxLgCx);
return _tvtafKsk(_EZYiPFxb);
}
async function _HbFQkXSB(_DtUdMsva, _rQGxLgCx, _fPlnmlTf) {
try {
const { _EZYiPFxb, adminPassword } = await _DtUdMsva.json();
const _fhbHDCiI = await _uCYhZSdt(_rQGxLgCx);
if (_fhbHDCiI !== adminPassword) {
return _tvtafKsk({ success: false, _tQsENZEP: "管理员密码错误" }, 403);
}
const _BGiglMof = _rQGxLgCx.DB.prepare(
"INSERT INTO kv_data (_MqXeEqfN, _PCGWajUU) VALUES (?, ?) ON CONFLICT(_MqXeEqfN) DO UPDATE SET _PCGWajUU = excluded._PCGWajUU"
);
const _UgeesQNG = _BGiglMof.bind(_yKCCKoQU, JSON.stringify(_EZYiPFxb)).run();
_fPlnmlTf.waitUntil(_UgeesQNG);
return _tvtafKsk({ success: true, _tQsENZEP: "配置已成功保存!" });
} catch (_TscaIMJa) {
return _tvtafKsk({ success: false, _tQsENZEP: `保存失败: ${_TscaIMJa._tQsENZEP}` }, 500);
}
}
async function _ScyeXzRZ() {
const _uHFpLyNz = 'https://www.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1&mkt=zh-CN';
try {
const _McldVfdh = await fetch(_uHFpLyNz);
const _AlQvidrc = await _McldVfdh.json();
const _WABQmOJp = 'https://www.bing.com' + _AlQvidrc.images[0]._WtFfkLOq;
return fetch(_WABQmOJp);
} catch (_TscaIMJa) {
return new Response('获取壁纸失败', { status: 502 });
}
}
async function _wkAnEREN(_SGAKYnsJ) {
try {
const _DzegcNvd = await fetch(`http://_SGAKYnsJ-api.com/json/${_SGAKYnsJ}?fields=status,_iUIoWTEf,countryCode,_OngLvRep&lang=zh-CN`);
if (_DzegcNvd.ok) {
const _bkGfRqAc = await _DzegcNvd.json();
if (_bkGfRqAc.status === 'success' && (_bkGfRqAc.countryCode || _bkGfRqAc._iUIoWTEf)) {
let _OngLvRep = _bkGfRqAc._OngLvRep || '未知';
if (_OngLvRep.toLowerCase().includes('cloudflare')) {
_OngLvRep = 'CloudFlare';
}
return {
_lpFyVTKe: _ypbDSXPk[_bkGfRqAc.countryCode] || _bkGfRqAc._iUIoWTEf || _bkGfRqAc.countryCode,
_OngLvRep: _OngLvRep
};
}
}
} catch (_TscaIMJa) {}
try {
const _DzegcNvd = await fetch(`https://api._SGAKYnsJ.sb/geoip/${_SGAKYnsJ}`);
if (_DzegcNvd.ok) {
const _bkGfRqAc = await _DzegcNvd.json();
if (_bkGfRqAc.country_code || _bkGfRqAc._iUIoWTEf) {
let _OngLvRep = _bkGfRqAc._OngLvRep || '未知';
if (_OngLvRep.toLowerCase().includes('cloudflare')) {
_OngLvRep = 'CloudFlare';
}
return {
_lpFyVTKe: _ypbDSXPk[_bkGfRqAc.country_code] || _bkGfRqAc._iUIoWTEf || _bkGfRqAc.country_code,
_OngLvRep: _OngLvRep
};
}
}
} catch (_TscaIMJa) {}
return { _lpFyVTKe: '未知', _OngLvRep: '未知' };
}
async function _PQtgwbBh(_DtUdMsva, _rQGxLgCx) {
try {
const { _pNRnulvw } = await _DtUdMsva.json();
if (!Array.isArray(_pNRnulvw)) {
return _tvtafKsk({ error: "输入无效,需要一个IP数组。" }, 400);
}
const _ghjsHNHu = _pNRnulvw.map(_SGAKYnsJ => _wkAnEREN(_SGAKYnsJ).then(_zvNMdbMM => ({ _SGAKYnsJ, ..._zvNMdbMM })));
const _YEagTLBQ = await Promise.all(_ghjsHNHu);
return _tvtafKsk(_YEagTLBQ);
} catch (_TscaIMJa) {
return _tvtafKsk({ error: `获取地理位置失败: ${_TscaIMJa._tQsENZEP}` }, 500);
}
}
async function _TRrgHZdu(_DtUdMsva, _rQGxLgCx) {
const _EZYiPFxb = await _uFXYXKqg(_rQGxLgCx);
if (!_EZYiPFxb.cloudStorage._owqiIfIi) {
return _tvtafKsk({ _YEagTLBQ: [], generatedBy: null });
}
try {
const _BGiglMof = _rQGxLgCx.DB.prepare("SELECT _PCGWajUU FROM kv_data WHERE _MqXeEqfN = ?").bind(_OxupAZxp);
const { _YEagTLBQ } = await _BGiglMof.all();
const _hPXVpTiC = _YEagTLBQ._OtvtecFT > 0 ? _YEagTLBQ[0]._PCGWajUU : null;
const _elmUhVLW = _hPXVpTiC ? JSON.parse(_hPXVpTiC) : null;
return _tvtafKsk(_elmUhVLW || { _YEagTLBQ: [], generatedBy: null });
} catch (_TscaIMJa) {
console.error("从D1读取缓存IP失败:", _TscaIMJa);
return _tvtafKsk({ _YEagTLBQ: [], generatedBy: null });
}
}
async function _EVqeVJgU(_DtUdMsva, _rQGxLgCx, _fPlnmlTf) {
const _EZYiPFxb = await _uFXYXKqg(_rQGxLgCx);
if (!_EZYiPFxb.cloudStorage._owqiIfIi) {
return _tvtafKsk({ success: true, _tQsENZEP: "云端存储已禁用,不保存结果。" });
}
const _aqwspiUz = _DtUdMsva._neCLOKdy.get('CF-Connecting-IP') || "未知IP";
const _iUIoWTEf = _DtUdMsva.cf?._iUIoWTEf || "未知";
const _suBqGJwG = _DtUdMsva.cf?._suBqGJwG || "";
let _yCDyYIJc = _ypbDSXPk[_iUIoWTEf] || _iUIoWTEf;
if (_suBqGJwG && _suBqGJwG !== "未知城市" && _suBqGJwG !== _iUIoWTEf) _yCDyYIJc = `${_yCDyYIJc} ${_ypbDSXPk[_suBqGJwG] || _suBqGJwG}`;
const _DgAYKSIr = {
_SGAKYnsJ: _aEqAAPhC(_aqwspiUz),
_lpFyVTKe: _yCDyYIJc.trim(),
time: _dkksGVeK()
};
try {
const _AJqFkoKi = await _DtUdMsva.json();
if (!Array.isArray(_AJqFkoKi)) return _tvtafKsk({ error: "无效数据格式" }, 400);
const _gJugVena = _AJqFkoKi.map(_pONSZcnI => ({
_SGAKYnsJ: String(_pONSZcnI._SGAKYnsJ || ''),
_DcBQImGI: _pONSZcnI._DcBQImGI ? parseInt(_pONSZcnI._DcBQImGI, 10) : undefined,
_sYAFmTVv: parseInt(_pONSZcnI._sYAFmTVv, 10),
_lpFyVTKe: typeof _pONSZcnI._lpFyVTKe === 'string' ? _pONSZcnI._lpFyVTKe.substring(0, 50) : 'N/A',
_OngLvRep: typeof _pONSZcnI._OngLvRep === 'string' ? _pONSZcnI._OngLvRep.substring(0, 100) : 'N/A'
}));
const _RKDZwjIc = {
generatedBy: _DgAYKSIr,
_YEagTLBQ: _gJugVena
};
const _BHLstNXh = _rQGxLgCx.DB.prepare(
"INSERT INTO kv_data (_MqXeEqfN, _PCGWajUU) VALUES (?, ?) ON CONFLICT(_MqXeEqfN) DO UPDATE SET _PCGWajUU = excluded._PCGWajUU"
).bind(_OxupAZxp, JSON.stringify(_RKDZwjIc)).run();
if (_EZYiPFxb.telegram.bot_token && _EZYiPFxb.telegram.chat_id) {
const _KAKytxxA = _gJugVena.map(r => `${r._SGAKYnsJ} ~ ${r._lpFyVTKe}`).join('\n');
const _gGJJvQzO = `优选完成!\n来源: ${_DgAYKSIr._SGAKYnsJ} (${_DgAYKSIr._lpFyVTKe})\n时间: ${_DgAYKSIr.time}\n\n结果:\n${_KAKytxxA}`;
const _ulguDvxv = `https://api.telegram.org/bot${_EZYiPFxb.telegram.bot_token}/sendMessage?chat_id=${_EZYiPFxb.telegram.chat_id}&_rIddpXbz=${encodeURIComponent(_gGJJvQzO)}`;
const _jAIcmCvi = fetch(_ulguDvxv).catch(_TscaIMJa => console.error("Telegram结果通知失败:", _TscaIMJa));
_fPlnmlTf.waitUntil(Promise.all([_BHLstNXh, _jAIcmCvi]));
} else {
_fPlnmlTf.waitUntil(_BHLstNXh);
}
return _tvtafKsk({ success: true, _tQsENZEP: "结果已保存" });
} catch (_TscaIMJa) {
return _tvtafKsk({ error: "D1写入失败", _tQsENZEP: _TscaIMJa._tQsENZEP }, 500);
}
}
async function _WQfHkzpX(_DtUdMsva, _rQGxLgCx, _fPlnmlTf) {
try {
const _gBzKXEgF = await _DtUdMsva.json();
if (!Array.isArray(_gBzKXEgF)) return _tvtafKsk({ error: "无效数据格式" }, 400);
const _RKDZwjIc = {
_YEagTLBQ: _gBzKXEgF
};
const _BGiglMof = _rQGxLgCx.DB.prepare(
"INSERT INTO kv_data (_MqXeEqfN, _PCGWajUU) VALUES (?, ?) ON CONFLICT(_MqXeEqfN) DO UPDATE SET _PCGWajUU = excluded._PCGWajUU"
);
const _UgeesQNG = _BGiglMof.bind(_TpYpkwiS, JSON.stringify(_RKDZwjIc)).run();
_fPlnmlTf.waitUntil(_UgeesQNG);
return _tvtafKsk({ success: true });
} catch (_TscaIMJa) {
return _tvtafKsk({ error: "D1写入临时缓存失败", _tQsENZEP: _TscaIMJa._tQsENZEP }, 500);
}
}
function _gCNPnGmU(_OtvtecFT, _yVbSoUyS) {
let _qAoqfqtu = '';
const _rHPVVolx = _yVbSoUyS._OtvtecFT;
for (let _cZPBrLPg = 0; _cZPBrLPg < _OtvtecFT; _cZPBrLPg++) {
_qAoqfqtu += _yVbSoUyS.charAt(Math.floor(Math.random() * _rHPVVolx));
}
return _qAoqfqtu;
}
async function _RAXANNsi(_DtUdMsva, _rQGxLgCx) {
try {
const _AJqFkoKi = await _DtUdMsva.json();
if (!Array.isArray(_AJqFkoKi) || _AJqFkoKi._OtvtecFT === 0) {
return _tvtafKsk({ error: "无效或空的IP列表" }, 400);
}
const _EZYiPFxb = await _uFXYXKqg(_rQGxLgCx);
const _WDXxEPnW = _EZYiPFxb.subscriptionId || { _OtvtecFT: 8, _yVbSoUyS: 'abcdefghijklmnopqrstuvwxyz0123456789' };
let _uYNxQvmH;
let _rvVVIXut = false;
let _QUjOidIK = 0;
const _BmjaGJHv = 10;
while (!_rvVVIXut && _QUjOidIK < _BmjaGJHv) {
_uYNxQvmH = _gCNPnGmU(_WDXxEPnW._OtvtecFT, _WDXxEPnW._yVbSoUyS);
const { _YEagTLBQ } = await _rQGxLgCx.DB.prepare("SELECT _XrqwuwXJ FROM optimized_results WHERE _XrqwuwXJ = ?").bind(_uYNxQvmH).all();
if (_YEagTLBQ._OtvtecFT === 0) {
_rvVVIXut = true;
}
_QUjOidIK++;
}
if (!_rvVVIXut) {
return _tvtafKsk({ error: "无法生成唯一的订阅ID,请稍后重试或调整ID设置。" }, 500);
}
const _GkMTTbKD = JSON.stringify({ _pNRnulvw: _AJqFkoKi });
await _rQGxLgCx.DB.prepare(
"INSERT INTO optimized_results (_XrqwuwXJ, _bkGfRqAc) VALUES (?, ?)"
).bind(_uYNxQvmH, _GkMTTbKD).run();
await _rQGxLgCx.DB.prepare(
"INSERT INTO kv_data (_MqXeEqfN, _PCGWajUU) VALUES (?, ?) ON CONFLICT(_MqXeEqfN) DO UPDATE SET _PCGWajUU = excluded._PCGWajUU"
).bind(_otEcYfIn, _uYNxQvmH).run();
return _tvtafKsk({ success: true, _XrqwuwXJ: _uYNxQvmH });
} catch (_TscaIMJa) {
return _tvtafKsk({ error: "保存优选结果失败", _tQsENZEP: _TscaIMJa._tQsENZEP }, 500);
}
}
async function _TvKoBjvj(_DtUdMsva, _rQGxLgCx) {
try {
const _uYNxQvmH = _DtUdMsva._MTWDCLNt._XrqwuwXJ;
if (!_uYNxQvmH) {
return new Response("缺少结果ID", { status: 400 });
}
const _qAoqfqtu = await _rQGxLgCx.DB.prepare("SELECT _bkGfRqAc FROM optimized_results WHERE _XrqwuwXJ = ?").bind(_uYNxQvmH).first();
if (!_qAoqfqtu) {
return new Response("未找到对应的优选结果", { status: 404 });
}
const _bkGfRqAc = JSON.parse(_qAoqfqtu._bkGfRqAc);
let _KAKytxxA = _bkGfRqAc._pNRnulvw;
const _EZYiPFxb = await _uFXYXKqg(_rQGxLgCx);
if (_EZYiPFxb.customNodes && _EZYiPFxb.customNodes._owqiIfIi && _EZYiPFxb.customNodes.list) {
const _JVgfGebF = _EZYiPFxb.customNodes.list.trim().split(/\s+/).filter(Boolean);
const _ijanvNrP = _JVgfGebF.map(_ovhOAkXU => {
let _kycDwlNg = _ovhOAkXU;
let _DcBQImGI = undefined;
let _wXEgPWwC = null;
if (_kycDwlNg.includes('@')) {
const _JJAUKWcX = _kycDwlNg.split('@');
_wXEgPWwC = _JJAUKWcX.pop();
_kycDwlNg = _JJAUKWcX.join('@');
}
if (_kycDwlNg.includes('#')) {
const _JJAUKWcX = _kycDwlNg.split('#');
const _pHnAAzOY = _JJAUKWcX.pop();
if (!isNaN(_pHnAAzOY) && _pHnAAzOY.trim() !== '') {
_DcBQImGI = parseInt(_pHnAAzOY, 10);
}
_kycDwlNg = _JJAUKWcX.join('#');
}
return {
_SGAKYnsJ: _kycDwlNg,
_DcBQImGI: _DcBQImGI,
_lpFyVTKe: _wXEgPWwC || _kycDwlNg,
_OngLvRep: '自定义'
};
});
_KAKytxxA.unshift(..._ijanvNrP);
}
const { itemLink } = _EZYiPFxb;
const _HQIlIPOQ = new URL(_DtUdMsva._WtFfkLOq)._VNxpMMXc;
let _hrMWuoBk;
if (_EZYiPFxb.websocketStreamer && _EZYiPFxb.websocketStreamer._owqiIfIi) {
if (!itemLink || !itemLink._owqiIfIi || !itemLink._nOUIoRDP || itemLink._nOUIoRDP._OtvtecFT === 0) {
return new Response("节点链接参数未配置或未启用 (反代模式)", { status: 500 });
}
_hrMWuoBk = _KAKytxxA.map((_pONSZcnI, _QyfJQZqc) => {
let _wXEgPWwC;
if (_pONSZcnI._OngLvRep === '自定义') {
_wXEgPWwC = `${_QyfJQZqc + 1} - ${_pONSZcnI._lpFyVTKe}`;
} else {
_wXEgPWwC = `${_QyfJQZqc + 1} - ${_pONSZcnI._lpFyVTKe || '未知'}`;
if (!_pONSZcnI._OngLvRep || !_pONSZcnI._OngLvRep.toLowerCase().includes('cloudflare')) {
_wXEgPWwC += '(反代)';
}
}
const _IcUIGXmf = _QuaBtHDL.isIPv6(_pONSZcnI._SGAKYnsJ) ? `[${_pONSZcnI._SGAKYnsJ}]` : _pONSZcnI._SGAKYnsJ;
const _DcBQImGI = _pONSZcnI._DcBQImGI || 443;
const _NggrUSto = itemLink._nOUIoRDP[0];
const _TWvlSVCz = _NggrUSto._VZEtSysG || '';
const _VZEtSysG = (_TWvlSVCz && _TVllTWfi(_TWvlSVCz)) ? _TWvlSVCz : crypto.randomUUID();
const _LTzuohby = '/snippets?_SGAKYnsJ=endpointAddress:_DcBQImGI(443)&nat64=6to4';
const _juhpGTjh = _NggrUSto._juhpGTjh || _HQIlIPOQ;
const _MTWDCLNt = new URLSearchParams({
security: 'tls',
_cBwqeSpE: 'ws',
_juhpGTjh: _juhpGTjh,
sni: _juhpGTjh,
fp: 'random'
});
return `vless://${_VZEtSysG}@${_IcUIGXmf}:${_DcBQImGI}?${_MTWDCLNt.toString()}&_LTzuohby=${encodeURIComponent(encodeURIComponent(_LTzuohby))}#${encodeURIComponent(_wXEgPWwC)}`;
});
} else {
if (!itemLink || !itemLink._owqiIfIi || !itemLink._nOUIoRDP || itemLink._nOUIoRDP._OtvtecFT === 0) {
return new Response("节点链接参数未配置或未启用", { status: 500 });
}
const _NggrUSto = itemLink._nOUIoRDP[0];
const { _juhpGTjh, _VZEtSysG, _LTzuohby } = _NggrUSto;
_hrMWuoBk = _KAKytxxA.map((_pONSZcnI, _QyfJQZqc) => {
let _wXEgPWwC;
if (_pONSZcnI._OngLvRep === '自定义') {
_wXEgPWwC = `${_QyfJQZqc + 1} - ${_pONSZcnI._lpFyVTKe}`;
} else {
_wXEgPWwC = `${_QyfJQZqc + 1} - ${_pONSZcnI._lpFyVTKe || '未知'}`;
if (!_pONSZcnI._OngLvRep || !_pONSZcnI._OngLvRep.toLowerCase().includes('cloudflare')) {
_wXEgPWwC += '(反代)';
}
}
const _IcUIGXmf = _QuaBtHDL.isIPv6(_pONSZcnI._SGAKYnsJ) ? `[${_pONSZcnI._SGAKYnsJ}]` : _pONSZcnI._SGAKYnsJ;
const _DcBQImGI = _pONSZcnI._DcBQImGI || 443;
const _MTWDCLNt = new URLSearchParams({
security: 'tls',
_cBwqeSpE: 'ws',
_juhpGTjh: _juhpGTjh || _HQIlIPOQ,
sni: _juhpGTjh || _HQIlIPOQ,
fp: 'random'
});
return `vless://${_VZEtSysG}@${_IcUIGXmf}:${_DcBQImGI}?${_MTWDCLNt.toString()}&_LTzuohby=${encodeURIComponent(encodeURIComponent(_LTzuohby || ''))}#${encodeURIComponent(_wXEgPWwC)}`;
});
}
const _ALWZcGCH = _hrMWuoBk.join('\n');
const _PVkqbxPA = btoa(_ALWZcGCH);
return new Response(_PVkqbxPA, {
_neCLOKdy: { 'Content-Type': '_rIddpXbz/plain; _yVbSoUyS=utf-8' }
});
} catch (_TscaIMJa) {
return new Response(`生成节点列表失败: ${_TscaIMJa._tQsENZEP}`, { status: 500 });
}
}
async function _EZUzXiHp(_DtUdMsva) {
try {
const { _TWgmkfqb, _cBwqeSpE } = await _DtUdMsva.json();
if (!Array.isArray(_TWgmkfqb)) {
return new Response('Invalid _TWgmkfqb list', { status: 400 });
}
const _qMvBJIOi = _TWgmkfqb.map(domain => {
if (!domain.trim()) return Promise.resolve([]);
const _WtFfkLOq = `https://cloudflare-dns.com/dns-query?_wXEgPWwC=${encodeURIComponent(domain.trim())}&_cBwqeSpE=${_cBwqeSpE || 'A'}`;
return fetch(_WtFfkLOq, { _neCLOKdy: { 'Accept': 'application/dns-json' } })
.then(_DzegcNvd => _DzegcNvd.json())
.then(_bkGfRqAc => (_bkGfRqAc.Answer ? _bkGfRqAc.Answer.map(a => a._bkGfRqAc) : []))
.catch(() => []);
});
const _bgxMIyJt = (await Promise.all(_qMvBJIOi)).flat();
const _xsvwkpMR = [...new Set(_bgxMIyJt)];
if (_xsvwkpMR._OtvtecFT === 0) {
return new Response('无法从域名解析出任何IP。', { status: 500 });
}
return new Response(_xsvwkpMR.join('\n'), { _neCLOKdy: { 'Content-Type': '_rIddpXbz/plain; _yVbSoUyS=utf-8' } });
} catch (err) {
return new Response(`域名解析错误: ${err._tQsENZEP}`, { status: 500 });
}
}
async function _poeFyWXB(_DtUdMsva, _rQGxLgCx) {
try {
const { _psZNVXBO } = await _DtUdMsva.json();
if (!Array.isArray(_psZNVXBO)) {
return _tvtafKsk({ error: "Invalid input, expected an object with a '_psZNVXBO' array." }, 400);
}
const _UVVHtviF = new Set();
const _UCrIgbkB = _psZNVXBO.map(_WtFfkLOq =>
_WoJjhvOG(_WtFfkLOq)
.then(_rIddpXbz => {
if (!_rIddpXbz) return;
const _HNOTlPrN = _rIddpXbz.split(/[\s,;|]+/);
for (const _MiAtoJaI of _HNOTlPrN) {
const _auJdFysH = _MiAtoJaI.trim();
if (_auJdFysH) {
_UVVHtviF.add(_auJdFysH);
}
}
})
.catch(err => {
console.error(`Error processing URL ${_WtFfkLOq}:`, err);
})
);
await Promise.all(_UCrIgbkB);
return _tvtafKsk({ _pNRnulvw: Array.from(_UVVHtviF) });
} catch (_TscaIMJa) {
return _tvtafKsk({ error: `Failed to process URLs: ${_TscaIMJa._tQsENZEP}` }, 500);
}
}
async function _mPXEuSoc(_DtUdMsva, _rQGxLgCx) {
const _EZYiPFxb = await _uFXYXKqg(_rQGxLgCx);
if (!_EZYiPFxb.api._owqiIfIi) {
return new Response(_EZYiPFxb.api._tQsENZEP || 'API is disabled.', { status: 503 });
}
try {
const _BGiglMof = _rQGxLgCx.DB.prepare("SELECT _PCGWajUU FROM kv_data WHERE _MqXeEqfN = ?").bind(_OxupAZxp);
const { _YEagTLBQ: dbResults } = await _BGiglMof.all();
const _hPXVpTiC = dbResults._OtvtecFT > 0 ? dbResults[0]._PCGWajUU : null;
const _elmUhVLW = _hPXVpTiC ? JSON.parse(_hPXVpTiC) : null;
if (!_elmUhVLW || !_elmUhVLW._YEagTLBQ || _elmUhVLW._YEagTLBQ._OtvtecFT === 0) {
return new Response("上次优选结果为空。", {
status: 404,
_neCLOKdy: { 'Content-Type': '_rIddpXbz/plain; _yVbSoUyS=utf-8' },
});
}
const _pNRnulvw = _elmUhVLW._YEagTLBQ.map(r => r._SGAKYnsJ);
return new Response(_pNRnulvw.join('\n'), {
_neCLOKdy: { 'Content-Type': '_rIddpXbz/plain; _yVbSoUyS=utf-8' },
});
} catch (_TscaIMJa) {
console.error("API /_SGAKYnsJ 处理错误:", _TscaIMJa);
return new Response(`API处理时出错: ${_TscaIMJa._tQsENZEP}`, { status: 500 });
}
}
function _IcChPAGV(_qAoqfqtu, _QyfJQZqc, _EZYiPFxb, _HQIlIPOQ) {
const { itemLink } = _EZYiPFxb;
if (!itemLink || !itemLink._owqiIfIi) return null;
const { template, _nOUIoRDP, selectionMode, _ljmXNFqy } = itemLink;
if (!_nOUIoRDP || _nOUIoRDP._OtvtecFT === 0) return null;
let _uNTCIwui;
if (selectionMode === 'random') {
_uNTCIwui = _nOUIoRDP[_QyfJQZqc % _nOUIoRDP._OtvtecFT];
} else if (selectionMode === 'first') {
_uNTCIwui = _nOUIoRDP[0];
} else {
_uNTCIwui = _nOUIoRDP.find(s => s._wXEgPWwC === selectionMode) || _nOUIoRDP[0];
}
if (!_uNTCIwui) return null;
let _ulMbkrQM = template;
const _bCslRgqk = _qAoqfqtu._DcBQImGI || 443;
const _qWIhzAKE = _QuaBtHDL.isIPv6(_qAoqfqtu._SGAKYnsJ) ? `[${_qAoqfqtu._SGAKYnsJ}]` : _qAoqfqtu._SGAKYnsJ;
let _wXEgPWwC = `${_QyfJQZqc + 1} 、 ${_qAoqfqtu._lpFyVTKe || '未知'}`;
if (!_qAoqfqtu._OngLvRep || !_qAoqfqtu._OngLvRep.toLowerCase().includes('cloudflare')) {
_wXEgPWwC += '(反代)';
}
let _juhpGTjh = _uNTCIwui._juhpGTjh || _HQIlIPOQ;
_ulMbkrQM = _ulMbkrQM.replace(/{_SGAKYnsJ}/g, _qWIhzAKE)
.replace(/{_DcBQImGI}/g, _bCslRgqk)
.replace(/{_wXEgPWwC}/g, encodeURIComponent(_wXEgPWwC))
.replace(/{rank}/g, _QyfJQZqc + 1)
.replace(/{_lpFyVTKe}/g, encodeURIComponent(_qAoqfqtu._lpFyVTKe || '未知'))
.replace(/{_OngLvRep}/g, encodeURIComponent(_qAoqfqtu._OngLvRep || '未知'))
.replace(/{_juhpGTjh}/g, encodeURIComponent(_juhpGTjh))
.replace(/{_VZEtSysG}/g, encodeURIComponent(_uNTCIwui['_VZEtSysG'] || ''))
.replace(/{_LTzuohby}/g, encodeURIComponent(encodeURIComponent(_uNTCIwui._LTzuohby || '')));
if (_ljmXNFqy) {
_ljmXNFqy.forEach(field => {
const _KznSQBCu = new RegExp('{' + field._wXEgPWwC + '}', 'g');
_ulMbkrQM = _ulMbkrQM.replace(_KznSQBCu, encodeURIComponent(field._PCGWajUU));
});
}
return _ulMbkrQM;
}
async function _kZkCkdNa(_DtUdMsva, _rQGxLgCx) {
const _EZYiPFxb = await _uFXYXKqg(_rQGxLgCx);
if (!_EZYiPFxb.itemLink._owqiIfIi) {
return new Response("Item _ulMbkrQM feature is disabled.", { status: 503, _neCLOKdy: { 'Content-Type': '_rIddpXbz/plain; _yVbSoUyS=utf-8' } });
}
try {
const _BGiglMof = _rQGxLgCx.DB.prepare("SELECT _PCGWajUU FROM kv_data WHERE _MqXeEqfN = ?").bind(_OxupAZxp);
const { _YEagTLBQ: dbResults } = await _BGiglMof.all();
const _hPXVpTiC = dbResults._OtvtecFT > 0 ? dbResults[0]._PCGWajUU : null;
const _elmUhVLW = _hPXVpTiC ? JSON.parse(_hPXVpTiC) : null;
if (!_elmUhVLW || !_elmUhVLW._YEagTLBQ || _elmUhVLW._YEagTLBQ._OtvtecFT === 0) {
return new Response("No optimized IPs available to generate endpoints.", {
status: 404,
_neCLOKdy: { 'Content-Type': '_rIddpXbz/plain; _yVbSoUyS=utf-8' },
});
}
const _HQIlIPOQ = new URL(_DtUdMsva._WtFfkLOq)._VNxpMMXc;
const _nnslPiBu = _elmUhVLW._YEagTLBQ.map((_qAoqfqtu, _QyfJQZqc) => {
return _IcChPAGV(_qAoqfqtu, _QyfJQZqc, _EZYiPFxb, _HQIlIPOQ);
}).filter(Boolean);
if (_nnslPiBu._OtvtecFT === 0) {
return new Response("Could not generate any _pONSZcnI links from the available IPs.", {
status: 500,
_neCLOKdy: { 'Content-Type': '_rIddpXbz/plain; _yVbSoUyS=utf-8' },
});
}
return new Response(_nnslPiBu.join('\n'), {
_neCLOKdy: { 'Content-Type': '_rIddpXbz/plain; _yVbSoUyS=utf-8' },
});
} catch (_TscaIMJa) {
console.error("API /api/endpoints error:", _TscaIMJa);
return new Response(`Error processing API _DtUdMsva: ${_TscaIMJa._tQsENZEP}`, { status: 500 });
}
}
async function _HtTukWXF(_DtUdMsva, _rQGxLgCx, _fPlnmlTf) {
const _aqwspiUz = _DtUdMsva._neCLOKdy.get('CF-Connecting-IP') || "未知IP";
const [
_TcQNQYBn,
_BdRsFCMW,
defaultDomains,
fetchedCountryMap
] = await Promise.all([
_OBsiStEc(_yCrBdEeb, _VEVRLcrM, []),
_OBsiStEc(_ATuYeVnw, _VEVRLcrM, []),
_OBsiStEc(_eGDhfaZb, _ZDQxwyuw, []),
_OBsiStEc(_RMUOlkay, _VnpsDHDT, { "N/A": "未知" })
]);
_ypbDSXPk = fetchedCountryMap;
let _dieVvGQX = false;
let _YUrrpOrc;
try {
const _fSIljLHH = await _uCYhZSdt(_rQGxLgCx);
_dieVvGQX = !!_fSIljLHH;
_YUrrpOrc = await _uFXYXKqg(_rQGxLgCx);
} catch (_TscaIMJa) {
if (_TscaIMJa._tQsENZEP && _TscaIMJa._tQsENZEP.includes('no such table')) {
console.log("检测到 'kv_data' 表不存在,正在自动创建...");
try {
const _hVGegMfK = "CREATE TABLE IF NOT EXISTS kv_data (_MqXeEqfN TEXT PRIMARY KEY, _PCGWajUU TEXT); CREATE TABLE IF NOT EXISTS optimized_results (_XrqwuwXJ TEXT PRIMARY KEY, _bkGfRqAc TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP);";
await _rQGxLgCx.DB.exec(_hVGegMfK);
console.log("数据表创建成功。");
_dieVvGQX = false;
_YUrrpOrc = _diSQXfkj();
} catch (dbError) {
console.error("自动创建数据表失败:", dbError);
return new Response(`数据库初始化失败: ${dbError._tQsENZEP}`, {
status: 500,
_neCLOKdy: { 'Content-Type': '_rIddpXbz/html;_yVbSoUyS=UTF-8' }
});
}
} else {
let _NxnXpzLr = _ZkzkrsuR(_TscaIMJa._tQsENZEP);
return new Response(_NxnXpzLr, { _neCLOKdy: { 'Content-Type': '_rIddpXbz/html;_yVbSoUyS=UTF-8' } });
}
}
if (_YUrrpOrc.telegram.bot_token && _YUrrpOrc.telegram.chat_id) {
const _iUIoWTEf = _DtUdMsva.cf?._iUIoWTEf || "未知";
const _suBqGJwG = _DtUdMsva.cf?._suBqGJwG || "";
let _yCDyYIJc = _ypbDSXPk[_iUIoWTEf] || _iUIoWTEf;
if (_suBqGJwG && _suBqGJwG !== "未知城市" && _suBqGJwG !== _iUIoWTEf) _yCDyYIJc = `${_yCDyYIJc} ${_ypbDSXPk[_suBqGJwG] || _suBqGJwG}`;
const _kRmvlZSY = _dkksGVeK();
const _LhxAMoDR = _DtUdMsva._WtFfkLOq;
const _gGJJvQzO = `访客: ${_aqwspiUz}\n位置: ${_yCDyYIJc.trim()}\n时间: ${_kRmvlZSY}\n来自:${_LhxAMoDR}`;
const _ulguDvxv = `https://api.telegram.org/bot${_YUrrpOrc.telegram.bot_token}/sendMessage?chat_id=${_YUrrpOrc.telegram.chat_id}&_rIddpXbz=${encodeURIComponent(_gGJJvQzO)}`;
_fPlnmlTf.waitUntil(fetch(_ulguDvxv).catch(_TscaIMJa => console.error("Telegram通知失败:", _TscaIMJa)));
}
let _MktohdZg = _ArvRBHBz();
const _IqiGmThG = {
_EZYiPFxb: _YUrrpOrc,
status: {
_dieVvGQX: _dieVvGQX,
}
};
_MktohdZg = _MktohdZg.replace('__PAGE_DATA_JSON__', JSON.stringify(_IqiGmThG));
_MktohdZg = _MktohdZg.replace('__ALL_CF_CIDR_LIST_JSON__', JSON.stringify(_TcQNQYBn));
_MktohdZg = _MktohdZg.replace('__BALANCED_CF_CIDR_LIST_JSON__', JSON.stringify(_BdRsFCMW));
_MktohdZg = _MktohdZg.replace('__DEFAULT_DOMAINS_LIST_JSON__', JSON.stringify(defaultDomains));
_MktohdZg = _MktohdZg.replace('__COUNTRY_MAP_JSON__', JSON.stringify(_ypbDSXPk));
return new Response(_MktohdZg, {
_neCLOKdy: { 'Content-Type': '_rIddpXbz/html;_yVbSoUyS=UTF-8' },
});
}
function _tvtafKsk(_qReiabDc, status = 200, _neCLOKdy = {}) {
return new Response(JSON.stringify(_qReiabDc), {
status,
_neCLOKdy: { 'Content-Type': 'application/json;_yVbSoUyS=UTF-8', ..._neCLOKdy }
});
}
function _dkksGVeK(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 _aEqAAPhC(_SGAKYnsJ) {
if (!_SGAKYnsJ || typeof _SGAKYnsJ !== 'string') return "无效IP";
if(_QuaBtHDL.isIPv4(_SGAKYnsJ)){
const _JJAUKWcX = _SGAKYnsJ.split('.');
if (_JJAUKWcX._OtvtecFT === 4) return `${_JJAUKWcX[0]}.*.*.${_JJAUKWcX[3]}`;
}
if(_QuaBtHDL.isIPv6(_SGAKYnsJ)){
const _JJAUKWcX = _SGAKYnsJ.split(':');
if (_JJAUKWcX._OtvtecFT > 2) return `${_JJAUKWcX[0]}:...:${_JJAUKWcX[_JJAUKWcX._OtvtecFT - 1]}`;
}
return _SGAKYnsJ;
}
function _ZkzkrsuR(_ihGqgjpZ) {
return `
<!DOCTYPE html><html lang="zh-CN"><head><meta _yVbSoUyS="UTF-8"><title>需要设置</title>
<_AexwCJYV>
_qReiabDc { font-family: sans-serif; background: #1a1a1a; _LisCSNVt: #e0e0e0; display: flex; justify-_FdPcXrtE: center; align-items: center; height: 100vh; margin: 0; }
._QjStwAPV { max-_WjyEpjZd: 800px; padding: 2rem; background: #25282e; border: 1px solid #4044c; border-radius: 8px; box-shadow: 0 5px 15px rgba(0,0,0,0.3); }
h1 { _LisCSNVt: #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 { _LisCSNVt: #da3633; background: rgba(218, 54, 51, 0.1); padding: 0.5rem; border-radius: 4px; margin-_uFWIIVxZ: 1rem; }
</_AexwCJYV>
</head><_qReiabDc>
<div class="_QjStwAPV">
<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>
${_ihGqgjpZ ? `<div class="error"><strong>当前错误信息:</strong> ${_ihGqgjpZ.replace(/</g, "<").replace(/>/g, ">")}</div>` : ''}
</div>
</_qReiabDc></html>`;
}
function _ArvRBHBz() {
return `
<!DOCTYPE html><html lang="zh-CN"><head> <meta _yVbSoUyS="UTF-8"> <meta _wXEgPWwC="viewport" _FdPcXrtE="_WjyEpjZd=device-_WjyEpjZd, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"> <title>Cloudflare IP</title> <_ulMbkrQM 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>
<_AexwCJYV>
:root { --primary-_LisCSNVt: #00A0FF; --primary-hover: #007ACC; --primary-gradient-start: #00C6FF; --primary-gradient-end: #0072FF; --secondary-_LisCSNVt: #8c939d; --light-bg: #1A1C20; --_FdPcXrtE-bg: #25282E; --border-_LisCSNVt: #40444C; --_rIddpXbz-_LisCSNVt: #E0E0E0; --_rIddpXbz-light: #B0B0B0; --success-_LisCSNVt: #30A46C; --danger-_LisCSNVt: #DA3633; --warning-_LisCSNVt: #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; }
_qReiabDc { font-family: var(--font-family-sans); background-_LisCSNVt: var(--light-bg); _LisCSNVt: var(--_rIddpXbz-_LisCSNVt); line-height: 1.65; overflow-x: hidden; padding: 0; position:relative; transition: background-_LisCSNVt 0.5s ease; background-size: cover; background-position: center; background-attachment: fixed; }
#background-_OikeydVu { position: fixed; _uFWIIVxZ: 0; _pAWiKvmx: 0; _WjyEpjZd: 100%; height: 100%; z-_QyfJQZqc: -1; display: none; }
._asyQvdjk-_QjStwAPV { max-_WjyEpjZd: 1100px; margin: 0 auto; padding: 0 1rem; position: relative; z-_QyfJQZqc: 1; }
#_hkKOhQJD { position: fixed; _uFWIIVxZ: 1rem; right: 1rem; font-size: 0.85em; padding: 0.4em 0.8em; z-_QyfJQZqc: 10; }
#marquee-_QjStwAPV { overflow: hidden; white-space: nowrap; background-_LisCSNVt: rgba(37, 40, 46, 0.6); backdrop-filter: blur(5px); _LisCSNVt: var(--primary-_LisCSNVt); padding: 0.5rem 0; margin-_uFWIIVxZ: 1rem; border-radius: var(--border-radius-sm); display: none; }
#marquee-_rIddpXbz { display: inline-block; padding-_pAWiKvmx: 100%; animation: marquee-scroll 20s linear infinite; }
@keyframes marquee-scroll { 0% { transform: translateX(0); } 100% { transform: translateX(-100%); } }
_kWsXIwaz { _rIddpXbz-align: center; margin-_uFWIIVxZ: 1rem; margin-bottom: 2rem; }
_kWsXIwaz h1 { white-space: pre-wrap; font-size: 2.25em; _LisCSNVt: var(--primary-_LisCSNVt); font-weight: 700; _rIddpXbz-shadow: 0 0 10px rgba(var(--primary-_LisCSNVt-rgb), 0.3); }
.card { background-_LisCSNVt: 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-_LisCSNVt); }
.progress-section #_yoNvruaU { _WjyEpjZd: 100%; height: 0.75rem; border-radius: var(--border-radius-sm); appearance: none; -webkit-appearance: none; background-_LisCSNVt: var(--border-_LisCSNVt); overflow: hidden; }
.progress-section #_yoNvruaU::-webkit-progress-_PCGWajUU { background: linear-gradient(90deg, var(--primary-gradient-start), var(--primary-gradient-end)); }
.progress-section #status { _rIddpXbz-align: center; margin-_uFWIIVxZ: 0.75em; font-size: 0.95em; _LisCSNVt: var(--_rIddpXbz-light); min-height: 1.5em; }
.section-_kWsXIwaz { display: flex; flex-wrap: wrap; justify-_FdPcXrtE: space-between; align-items: center; margin-bottom: 1rem; padding-bottom: 0.75rem; border-bottom: 1px solid var(--border-_LisCSNVt); gap: 1rem; }
.section-_kWsXIwaz h2 { font-size: 1.6em; font-weight: 600; margin:0; }
.generator-info { font-size: 0.85em; _LisCSNVt: var(--secondary-_LisCSNVt); _rIddpXbz-align: right; flex-shrink: 0; }
.generator-info span { display: block; }
.table-responsive { _WjyEpjZd: 100%; overflow-x: auto; -webkit-overflow-scrolling: touch; }
table { _WjyEpjZd: 100%; border-collapse: collapse; margin-_uFWIIVxZ: 0; font-size: 0.9em; }
th, td { border-bottom: 1px solid var(--border-_LisCSNVt); padding: 0.8em; _rIddpXbz-align: _pAWiKvmx; vertical-align: middle; white-space: nowrap; }
th { background-_LisCSNVt: #2c3038; font-weight: 500; }
tbody tr:hover { background-_LisCSNVt: #30333a; }
td._SGAKYnsJ-_kycDwlNg { font-weight: 500; font-family: var(--font-family-mono); _LisCSNVt: var(--primary-_LisCSNVt); }
td.ping-_PCGWajUU { font-weight: 600; font-family: var(--font-family-mono); }
td.actions-cell { _rIddpXbz-align: right; }
.btn { display: inline-flex; align-items: center; justify-_FdPcXrtE: center; font-weight: 500; _rIddpXbz-align: center; cursor: pointer; user-_WzqJfXBy: none; background: linear-gradient(145deg, var(--primary-gradient-start), var(--primary-gradient-end)); border: 1px solid transparent; _LisCSNVt: #fff; padding: 0.4em 0.8em; font-size: 0.85em; border-radius: var(--border-radius-sm); transition: all 0.2s ease-in-out; margin-_pAWiKvmx: 6px; }
.btn:hover { transform: translateY(-2px); box-shadow: 0 4px 8px rgba(0, 0, 0, 0.3); }
.btn-outline { background: transparent; _LisCSNVt: var(--primary-_LisCSNVt); border: 1px solid var(--primary-_LisCSNVt); }
.btn-outline:hover { background-_LisCSNVt: var(--primary-_LisCSNVt); _LisCSNVt: var(--_FdPcXrtE-bg); }
._asyQvdjk-download-buttons { display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: 1rem; }
._asyQvdjk-download-buttons .btn { _WjyEpjZd: 100%; margin: 0; }
.tooltip-notification { position: fixed; _uFWIIVxZ: 20px; right: 20px; padding: 12px 20px; border-radius: var(--border-radius-md); _LisCSNVt: #fff; font-size: 0.95em; z-_QyfJQZqc: 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); }
#_BSICXixb, #_CaobEgVV, #_jGKHBxbd, #_HOsbGfAb, #_PrYFlBJy { display: none; position: fixed; z-_QyfJQZqc: 10000; _pAWiKvmx: 0; _uFWIIVxZ: 0; _WjyEpjZd: 100%; height: 100%; background-_LisCSNVt: rgba(0,0,0,0.6); justify-_FdPcXrtE: center; align-items: center; backdrop-filter: blur(5px); -webkit-backdrop-filter: blur(5px); }
.modal-_FdPcXrtE, ._asyQvdjk-modal-_FdPcXrtE { background-_LisCSNVt: var(--_FdPcXrtE-bg); padding: 2rem; border: 1px solid var(--border-_LisCSNVt); border-radius: var(--border-radius-md); _WjyEpjZd: 95%; max-_WjyEpjZd: 800px; max-height: 90vh; overflow-y: auto; box-shadow: 0 5px 15px rgba(0,0,0,0.3); }
#_HOsbGfAb .modal-_FdPcXrtE { max-_WjyEpjZd: 500px; }
.modal-_FdPcXrtE h3, ._asyQvdjk-modal-_kWsXIwaz h3 { margin-_uFWIIVxZ: 0; margin-bottom: 1.5rem; _LisCSNVt: var(--primary-_LisCSNVt); _rIddpXbz-align: center; }
.modal-buttons { display: flex; justify-_FdPcXrtE: flex-end; gap: 1rem; margin-_uFWIIVxZ: 2rem; border-_uFWIIVxZ: 1px solid var(--border-_LisCSNVt); padding-_uFWIIVxZ: 1.5rem; }
.modal-section-divider { border: 0; height: 1px; background-image: linear-gradient(to right, rgba(0,0,0,0), var(--border-_LisCSNVt), rgba(0,0,0,0)); margin: 2rem 0; }
._asyQvdjk-modal-_kWsXIwaz { display: flex; justify-_FdPcXrtE: space-between; align-items: center; padding-bottom: 1rem; margin-bottom: 1rem; border-bottom: 1px solid var(--border-_LisCSNVt); }
.modal-close-btn { font-size: 1.5rem; font-weight: bold; line-height: 1; _LisCSNVt: var(--_rIddpXbz-light); cursor: pointer; background: none; border: none; padding: 0; }
._asyQvdjk-list-_pONSZcnI { display: flex; flex-direction: column; padding: 1rem; border: 1px solid var(--border-_LisCSNVt); border-radius: var(--border-radius-sm); margin-bottom: 1rem; }
._asyQvdjk-_wXEgPWwC { font-size: 1.1em; font-weight: 600; }
._asyQvdjk-links a { display: block; _LisCSNVt: var(--primary-_LisCSNVt); _rIddpXbz-decoration: none; margin-_uFWIIVxZ: 0.5rem; word-break: break-all; }
._asyQvdjk-links a:hover { _rIddpXbz-decoration: underline; }
._asyQvdjk-links span { _LisCSNVt: var(--_rIddpXbz-light); }
#visitorPasswordPrompt { _rIddpXbz-align: center; }
#visitorPasswordPrompt h3 { _LisCSNVt: var(--primary-_LisCSNVt); font-size: 1.4em; margin-bottom: 0.8rem; }
#visitorPasswordPrompt p { _LisCSNVt: var(--_rIddpXbz-light); margin-bottom: 1.5rem; }
._fSIljLHH-input-group { display: flex; gap: 10px; max-_WjyEpjZd: 400px; margin: 0 auto; }
._fSIljLHH-input-group input { flex-grow: 1; _rIddpXbz-align: center; }
._fSIljLHH-input-group .btn { margin-_pAWiKvmx: 0; }
._YEagTLBQ-actions-_QjStwAPV { _rIddpXbz-align: center; margin-bottom: 1.5rem; }
._YEagTLBQ-api-buttons { display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: 1rem; }
._YEagTLBQ-api-buttons .btn { margin: 0; _WjyEpjZd: 100%; font-size: 0.9em; padding: 0.5em 1em; }
.form-grid { display: grid; grid-template-columns: max-_FdPcXrtE 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 _WzqJfXBy, .form-grid-control textarea { _WjyEpjZd: 100%; background-_LisCSNVt: var(--light-bg); border: 1px solid var(--border-_LisCSNVt); border-radius: var(--border-radius-sm); _LisCSNVt: var(--_rIddpXbz-_LisCSNVt); font-family: var(--font-family-sans); padding: 0.6em; transition: border-_LisCSNVt 0.2s, box-shadow 0.2s; }
.form-grid-control input:focus, .form-grid-control _WzqJfXBy:focus, .form-grid-control textarea:focus { border-_LisCSNVt: var(--primary-_LisCSNVt); box-shadow: 0 0 0 2px rgba(var(--primary-_LisCSNVt-rgb), 0.2); outline: none; }
.form-grid-control input[_cBwqeSpE="_LisCSNVt"] { min-_WjyEpjZd: auto; padding: 2px; _WjyEpjZd: 2.5em; height: 2.5em; }
.form-grid-control input[_cBwqeSpE="checkbox"] { _WjyEpjZd: auto; flex-shrink: 0; height: 1.2em; _WjyEpjZd: 1.2em; }
.form-grid-control ._XbZQAzTE-input { _WjyEpjZd: 80px; _rIddpXbz-align: right; }
.tooltip-_ZJXmgvCF { display: inline-flex; _WjyEpjZd: 16px; height: 16px; align-items: center; justify-_FdPcXrtE: center; background-_LisCSNVt: var(--secondary-_LisCSNVt); _LisCSNVt: var(--_FdPcXrtE-bg); border-radius: 50%; font-size: 12px; font-weight: bold; cursor: pointer; user-_WzqJfXBy: none; }
#tooltip-popup { position: fixed; background-_LisCSNVt: #383c4a; _LisCSNVt: #fff; padding: 10px 15px; border-radius: 6px; z-_QyfJQZqc: 10001; font-size: 0.85em; max-_WjyEpjZd: 300px; display: none; box-shadow: 0 4px 12px rgba(0,0,0,0.4); border: 1px solid var(--border-_LisCSNVt); pointer-events: none; }
#custom-fields-_QjStwAPV .form-grid-control { gap: 5px; } #custom-fields-_QjStwAPV .form-grid-control input { flex: 1; }
.parameter-_aNXrQOrv-_TJeWQbHa { border: 1px solid var(--border-_LisCSNVt); border-radius: var(--border-radius-sm); padding: 1rem; margin-bottom: 1rem; }
.parameter-_aNXrQOrv-_kWsXIwaz { display: flex; justify-_FdPcXrtE: space-between; align-items: center; margin-bottom: 1rem; }
.parameter-_aNXrQOrv-_kWsXIwaz input { flex-grow: 1; margin-right: 1rem; }
.fine-grained-options { display: flex; gap: 1rem; margin-_uFWIIVxZ: 0.5rem; align-items: center; font-size: 0.9em; }
.fine-grained-options label { display: flex; align-items: center; gap: 0.3rem; cursor: pointer; }
._rIddpXbz-_LisCSNVt-grid { display: grid; grid-template-columns: auto 1fr; gap: 8px; align-items: center; _WjyEpjZd: 100%; }
._rIddpXbz-_LisCSNVt-grid input[_cBwqeSpE="_LisCSNVt"] { grid-column: 1 / 2; }
._rIddpXbz-_LisCSNVt-grid input[_cBwqeSpE="_rIddpXbz"], ._rIddpXbz-_LisCSNVt-grid textarea { grid-column: 2 / 3; }
#_HOsbGfAb .button-grid { display: grid; grid-template-columns: 1fr; gap: 1rem; }
#_HOsbGfAb .btn-group { display: flex; }
#_HOsbGfAb .sub-btn { flex-grow: 1; margin: 0; }
#_HOsbGfAb ._spmuiMlo-btn { flex-shrink: 0; margin-_pAWiKvmx: -1px; border-_uFWIIVxZ-_pAWiKvmx-radius: 0; border-bottom-_pAWiKvmx-radius: 0; }
#_PrYFlBJy .modal-_FdPcXrtE { max-_WjyEpjZd: 300px; background: white; padding: 1rem; _rIddpXbz-align: center; }
#qrCodeImg { max-_WjyEpjZd: 100%; }
@media (max-_WjyEpjZd: 768px) {
html { font-size: 15px; } ._asyQvdjk-_QjStwAPV { padding: 0 0.8rem; } _kWsXIwaz { margin-_uFWIIVxZ: 2.5rem; margin-bottom: 1.5rem; } #_hkKOhQJD { _uFWIIVxZ: 0.8rem; right: 0.8rem; } .card { padding: 1rem; }
.form-grid { grid-template-columns: 1fr; } .form-grid-label { justify-self: start; }
}
</_AexwCJYV>
<_AexwCJYV _XrqwuwXJ="theme-styles">
.theme-light { --light-bg: #F0F2F5; --_FdPcXrtE-bg: #FFFFFF; --border-_LisCSNVt: #DCDFE6; --_rIddpXbz-_LisCSNVt: #303133; --_rIddpXbz-light: #606266; }
.theme-light .card { background-_LisCSNVt: rgba(255, 255, 255, 0.9); }
.theme-light th { background-_LisCSNVt: #F5F7FA; }
.theme-light tbody tr:hover { background-_LisCSNVt: #ECF5FF; }
.theme-matrix { --primary-_LisCSNVt: #00FF41; --primary-hover: #39FF14; --light-bg: #000000; --_FdPcXrtE-bg: #0D0208; --border-_LisCSNVt: #00FF41; --_rIddpXbz-_LisCSNVt: #00FF41; --_rIddpXbz-light: #00FF41; font-family: var(--font-family-mono); }
.theme-matrix .card { background-_LisCSNVt: rgba(0, 20, 0, 0.7); _rIddpXbz-shadow: 0 0 5px var(--primary-_LisCSNVt); backdrop-filter: none; }
.theme-matrix th { background-_LisCSNVt: #000; }
.theme-matrix tbody tr:hover { background-_LisCSNVt: #010; }
.theme-matrix .btn { _rIddpXbz-shadow: none; _LisCSNVt: #000; }
.theme-matrix .btn-outline { background-_LisCSNVt: transparent; }
.theme-modern-glass { --primary-_LisCSNVt: #00C6FF; --primary-hover: #0072FF; --light-bg: #000; --_FdPcXrtE-bg: rgba(30, 30, 40, 0.6); --border-_LisCSNVt: rgba(255, 255, 255, 0.2); --_rIddpXbz-_LisCSNVt: #F0F0F0; --_rIddpXbz-light: #A0A0B0; --border-radius-md: 12px; }
_qReiabDc.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-_LisCSNVt: #00C6FF; --primary-hover: #0072FF; --light-bg: #1A1C20; --_FdPcXrtE-bg: rgba(30, 30, 40, 0.6); --border-_LisCSNVt: rgba(255, 255, 255, 0.2); --_rIddpXbz-_LisCSNVt: #F0F0F0; --_rIddpXbz-light: #A0A0B0; --border-radius-md: 12px; }
.glassy-components .card { background-_LisCSNVt: var(--_FdPcXrtE-bg); backdrop-filter: blur(15px); -webkit-backdrop-filter: blur(15px); border: 1px solid var(--border-_LisCSNVt); }
.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-_LisCSNVt: rgba(0,0,0,0.3); border-right-_LisCSNVt: 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); _rIddpXbz-shadow: 0 1px 2px rgba(0,0,0,0.2); _LisCSNVt: #fff; }
.glassy-components .btn-outline { background: rgba(255, 255, 255, 0.05); border-_LisCSNVt: rgba(255, 255, 255, 0.2); backdrop-filter: blur(2px); _rIddpXbz-shadow: 0 1px 2px rgba(0,0,0,0.2); }
.glassy-components .btn-outline:hover { background: var(--primary-_LisCSNVt); border-_LisCSNVt: var(--primary-_LisCSNVt); _LisCSNVt: #fff; }
.glassy-components _kWsXIwaz h1 { background: linear-gradient(180deg, rgba(255,255,255,1) 0%, rgba(255,255,255,0.7) 100%); -webkit-background-clip: _rIddpXbz; -webkit-_rIddpXbz-fill-_LisCSNVt: transparent; filter: drop-shadow(0 2px 5px rgba(0,0,0,0.5)); _LisCSNVt: transparent; }
.theme-aurora-glass { --primary-_LisCSNVt: #38bdf8; --light-bg: #0c0a09; --_FdPcXrtE-bg: rgba(23, 23, 23, 0.5); --border-_LisCSNVt: rgba(255, 255, 255, 0.15); --_rIddpXbz-_LisCSNVt: #f2f2f2; --_rIddpXbz-light: #a3a3a3; }
_qReiabDc.theme-aurora-glass::before { _FdPcXrtE: ''; position: fixed; _uFWIIVxZ: 0; _pAWiKvmx: 0; _WjyEpjZd: 100%; height: 100%; z-_QyfJQZqc: -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-_LisCSNVt: #08fdd8; --light-bg: #010409; --_FdPcXrtE-bg: rgba(22, 27, 34, 0.6); --border-_LisCSNVt: rgba(139, 148, 158, 0.3); --_rIddpXbz-_LisCSNVt: #e6edf3; --_rIddpXbz-light: #7d8590; }
.theme-cyberpunk-glass .card { border-image: linear-gradient(to bottom right, var(--primary-_LisCSNVt), #7928ca) 1; box-shadow: 0 0 15px rgba(var(--primary-_LisCSNVt-rgb), 0.25); }
.theme-cyberpunk-glass .btn { box-shadow: 0 0 8px rgba(var(--primary-_LisCSNVt-rgb), 0.5); }
.theme-marble-light { --primary-_LisCSNVt: #bfa37c; --light-bg: #f7f5f2; --_FdPcXrtE-bg: #ffffff; --border-_LisCSNVt: #e0dcd5; --_rIddpXbz-_LisCSNVt: #3d3a36; --_rIddpXbz-light: #6b6661; }
_qReiabDc.theme-marble-light { background-image: _WtFfkLOq('_bkGfRqAc:image/svg+xml,%3Csvg _WjyEpjZd="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-_LisCSNVt: rgba(255, 255, 255, 0.85); box-shadow: 0 4px 12px rgba(0,0,0,0.08); }
</_AexwCJYV>
</head><_qReiabDc _XrqwuwXJ="pageBody">
<_OikeydVu _XrqwuwXJ="background-_OikeydVu"></_OikeydVu>
<div _XrqwuwXJ="_BSICXixb">
<div class="modal-_FdPcXrtE">
<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 _cBwqeSpE="_fSIljLHH" _XrqwuwXJ="initialPassword"></div></div>
<div class="form-grid"><div class="form-grid-label"><label for="confirmPassword">确认密码</label></div><div class="form-grid-control"><input _cBwqeSpE="_fSIljLHH" _XrqwuwXJ="confirmPassword"></div></div>
<div class="modal-buttons"><button _XrqwuwXJ="setInitialPasswordBtn" class="btn">设置密码</button></div>
</div>
</div>
<div class="_asyQvdjk-_QjStwAPV">
<button _XrqwuwXJ="_hkKOhQJD" class="btn btn-outline"></button>
<div _XrqwuwXJ="marquee-_QjStwAPV"><div _XrqwuwXJ="marquee-_rIddpXbz"></div></div>
<_kWsXIwaz><h1 _XrqwuwXJ="pageTitle"></h1></_kWsXIwaz>
<div class="card" _XrqwuwXJ="visitorPasswordPrompt" _AexwCJYV="display: none;">
<h3>需要授权</h3>
<p>此站点已启用访客密码,请输入密码以继续。</p>
<div class="_fSIljLHH-input-group">
<input _cBwqeSpE="_fSIljLHH" _XrqwuwXJ="visitorPasswordEntry" _KznSQBCu="访客密码">
<button _XrqwuwXJ="startTestWithPasswordBtn" class="btn">开始测试</button>
</div>
</div>
<div _XrqwuwXJ="_MUdwmiCk" _AexwCJYV="display: block;">
<div class="card progress-section">
<div _XrqwuwXJ="progressDisplay">
<progress _XrqwuwXJ="_yoNvruaU" _PCGWajUU="0" max="100"></progress>
<div _XrqwuwXJ="status">正在初始化...</div>
</div>
</div>
<div class="card _asyQvdjk-download-section">
<div class="section-_kWsXIwaz"><h2 _XrqwuwXJ="appDownloadTitleEl"></h2></div>
<div class="_asyQvdjk-download-buttons">
<button class="btn" _bkGfRqAc-_CweLKzsq="android">安卓客户端</button>
<button class="btn" _bkGfRqAc-_CweLKzsq="ios">苹果客户端</button>
<button class="btn" _bkGfRqAc-_CweLKzsq="windows">Windows客户端</button>
<button class="btn" _bkGfRqAc-_CweLKzsq="mac">Mac客户端</button>
</div>
</div>
<div class="card _YEagTLBQ-section" _XrqwuwXJ="_ervrGuOr" _AexwCJYV="display:none;">
<div class="section-_kWsXIwaz">
<h2 _XrqwuwXJ="liveTitleEl"></h2>
<div class="generator-info" _XrqwuwXJ="liveGeneratorInfo"></div>
</div>
<div _XrqwuwXJ="_GTLcvGLT" class="_YEagTLBQ-actions-_QjStwAPV" _AexwCJYV="display: none;">
<div class="_YEagTLBQ-api-buttons">
<button _XrqwuwXJ="copyIpApiBtn" class="btn">复制 IP API</button>
<button _XrqwuwXJ="copySubscriptionBtn" class="btn">复制订阅</button>
</div>
</div>
<div class="table-responsive">
<table _XrqwuwXJ="resultsTable">
<thead><tr><th _XrqwuwXJ="tableHeader1El"></th><th _XrqwuwXJ="tableHeader2El"></th><th _XrqwuwXJ="tableHeader3El"></th><th _XrqwuwXJ="tableHeader4El"></th><th _XrqwuwXJ="tableHeader5El"></th><th _XrqwuwXJ="tableHeader6El"></th><th _XrqwuwXJ="tableHeader7El"></th></tr></thead>
<tbody></tbody>
</table>
</div>
</div>
<div class="card cached-section" _XrqwuwXJ="_TudvoPPI" _AexwCJYV="display:none;">
<div class="section-_kWsXIwaz"><h2 _XrqwuwXJ="cachedTitleEl"></h2><div class="generator-info" _XrqwuwXJ="cachedGeneratorInfo"></div></div>
<div class="table-responsive">
<table _XrqwuwXJ="cachedResultsTable">
<thead><tr><th _XrqwuwXJ="cachedTableHeader1El"></th><th _XrqwuwXJ="cachedTableHeader2El"></th><th _XrqwuwXJ="cachedTableHeader3El"></th><th _XrqwuwXJ="cachedTableHeader4El"></th><th _XrqwuwXJ="cachedTableHeader5El"></th><th _XrqwuwXJ="cachedTableHeader6El"></th><th _XrqwuwXJ="cachedTableHeader7El"></th></tr></thead>
<tbody></tbody>
</table>
</div>
</div>
</div>
</div>
<div _XrqwuwXJ="notificationTooltip" class="tooltip-notification"></div>
<div _XrqwuwXJ="_CaobEgVV">
<div class="modal-_FdPcXrtE">
<h3>修改参数</h3>
<div _AexwCJYV="display: flex; border-bottom: 1px solid var(--border-_LisCSNVt); margin-bottom: 1.5rem;">
<button class="tab-button active" onclick="_gYLmpTlS(event, 'general-_PmGDeuEZ')">通用设置</button>
<button class="tab-button" onclick="_gYLmpTlS(event, '_ulMbkrQM-_PmGDeuEZ')">链接设置</button>
<button class="tab-button" onclick="_gYLmpTlS(event, 'fine-grained-_PmGDeuEZ')">IP源设置</button>
<button class="tab-button" onclick="_gYLmpTlS(event, 'advanced-_PmGDeuEZ')">高级设置</button>
</div>
<div _XrqwuwXJ="general-_PmGDeuEZ" class="tab-_FdPcXrtE" _AexwCJYV="display: block;">
<div class="form-grid">
<div class="form-grid-label"><label for="themeSelect">页面主题</label><span class="tooltip-_ZJXmgvCF" _bkGfRqAc-tooltip="选择页面的整体外观风格。">?</span></div>
<div class="form-grid-control">
<_WzqJfXBy _XrqwuwXJ="themeSelect">
<_zKIXbfiF _PCGWajUU="theme-aurora-glass">极光-玻璃质感</_zKIXbfiF>
<_zKIXbfiF _PCGWajUU="theme-particles-glass">粒子-玻璃质感</_zKIXbfiF>
<_zKIXbfiF _PCGWajUU="theme-modern-glass">现代-玻璃质感</_zKIXbfiF>
<_zKIXbfiF _PCGWajUU="theme-cyberpunk-glass">赛博朋克-玻璃质感</_zKIXbfiF>
<_zKIXbfiF _PCGWajUU="theme-dark-particles">暗色-粒子背景</_zKIXbfiF>
<_zKIXbfiF _PCGWajUU="theme-dark-bing">暗色-必应壁纸</_zKIXbfiF>
<_zKIXbfiF _PCGWajUU="theme-light">亮色-简约</_zKIXbfiF>
<_zKIXbfiF _PCGWajUU="theme-light-bing">亮色-必应壁纸</_zKIXbfiF>
<_zKIXbfiF _PCGWajUU="theme-marble-light">简约大理石-亮色</_zKIXbfiF>
<_zKIXbfiF _PCGWajUU="theme-matrix">矩阵-代码雨</_zKIXbfiF>
</_WzqJfXBy>
</div>
<div class="form-grid-label"><label>主题颜色</label><span class="tooltip-_ZJXmgvCF" _bkGfRqAc-tooltip="自定义主题的主要颜色和动态背景效果的颜色。">?</span></div>
<div class="form-grid-control">
<label for="primaryColorInput">强调色</label><input _cBwqeSpE="_LisCSNVt" _XrqwuwXJ="primaryColorInput">
<span _AexwCJYV="_WjyEpjZd: 20px;"></span>
<label for="particleColorInput">背景/粒子色</label><input _cBwqeSpE="_LisCSNVt" _XrqwuwXJ="particleColorInput">
</div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label" _AexwCJYV="align-self: start;"><label>页面文本与颜色</label><span class="tooltip-_ZJXmgvCF" _bkGfRqAc-tooltip="自定义页面上各个主要元素的显示文本和颜色。">?</span></div>
<div class="form-grid-control" _AexwCJYV="flex-direction: column; align-items: stretch; gap: 8px;">
<div class="_rIddpXbz-_LisCSNVt-grid"><input _cBwqeSpE="_LisCSNVt" _XrqwuwXJ="colorInput_title"><textarea _XrqwuwXJ="textInput_title" _fedTTYkr="1" _KznSQBCu="页面主标题"></textarea></div>
<div class="_rIddpXbz-_LisCSNVt-grid"><input _cBwqeSpE="_LisCSNVt" _XrqwuwXJ="colorInput_loginButton"><input _cBwqeSpE="_rIddpXbz" _XrqwuwXJ="textInput_loginButton" _KznSQBCu="登录按钮文本"></div>
<div class="_rIddpXbz-_LisCSNVt-grid"><input _cBwqeSpE="_LisCSNVt" _XrqwuwXJ="colorInput_appDownloadTitle"><input _cBwqeSpE="_rIddpXbz" _XrqwuwXJ="textInput_appDownloadTitle" _KznSQBCu="APP下载标题"></div>
<div class="_rIddpXbz-_LisCSNVt-grid"><input _cBwqeSpE="_LisCSNVt" _XrqwuwXJ="colorInput_liveTitle"><input _cBwqeSpE="_rIddpXbz" _XrqwuwXJ="textInput_liveTitle" _KznSQBCu="本次结果标题"></div>
<div class="_rIddpXbz-_LisCSNVt-grid"><input _cBwqeSpE="_LisCSNVt" _XrqwuwXJ="colorInput_cachedTitle"><input _cBwqeSpE="_rIddpXbz" _XrqwuwXJ="textInput_cachedTitle" _KznSQBCu="上次结果标题"></div>
<div class="_rIddpXbz-_LisCSNVt-grid"><input _cBwqeSpE="_LisCSNVt" _XrqwuwXJ="colorInput_tableHeader"><input _cBwqeSpE="_rIddpXbz" _PCGWajUU="表格头部文本颜色" readonly _AexwCJYV="background: transparent; border: none;"></div>
</div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label" _AexwCJYV="align-self: start;"><label>公告栏设置</label><span class="tooltip-_ZJXmgvCF" _bkGfRqAc-tooltip="设置在页面显示的公告内容和方式。">?</span></div>
<div class="form-grid-control" _AexwCJYV="flex-direction: column; align-items: stretch; gap: 8px;">
<textarea _XrqwuwXJ="announcementText" _KznSQBCu="在此输入公告内容" _fedTTYkr="3"></textarea>
<div _AexwCJYV="display: flex; justify-_FdPcXrtE: space-around; align-items: center; gap: 1rem; flex-wrap: wrap;">
<label _AexwCJYV="display: flex; align-items: center; gap: 5px;"><input _cBwqeSpE="checkbox" _XrqwuwXJ="enableMarquee"> 顶部走马灯</label>
<label _AexwCJYV="display: flex; align-items: center; gap: 5px;"><input _cBwqeSpE="checkbox" _XrqwuwXJ="enablePopup"> 右上角弹窗</label>
<div _XrqwuwXJ="popupDurationContainer" _AexwCJYV="display: none; align-items: center; gap: 5px;">
<label for="popupDuration">停留</label><input _cBwqeSpE="number" _XrqwuwXJ="popupDuration" _AexwCJYV="_WjyEpjZd: 60px;"><span>秒</span>
</div>
</div>
</div>
</div>
</div>
<div _XrqwuwXJ="_ulMbkrQM-_PmGDeuEZ" class="tab-_FdPcXrtE">
<div class="form-grid">
<div class="form-grid-label"><label for="converterServiceUrlInput">Sublink 服务地址</label><span class="tooltip-_ZJXmgvCF" _bkGfRqAc-tooltip="您部署的Sublink服务的域名,例如 https://sub.example.com">?</span></div>
<div class="form-grid-control"><input _cBwqeSpE="_rIddpXbz" _XrqwuwXJ="converterServiceUrlInput" _KznSQBCu="https://sub.example.com"></div>
<div class="form-grid-label"><label for="subscriptionIdLength">订阅ID长度</label><span class="tooltip-_ZJXmgvCF" _bkGfRqAc-tooltip="生成订阅链接时使用的随机ID长度(2-128位)">?</span></div>
<div class="form-grid-control"><input _cBwqeSpE="number" _XrqwuwXJ="subscriptionIdLength" min="2" max="128"></div>
<div class="form-grid-label" _AexwCJYV="align-self: start;"><label for="subscriptionIdCharset">ID使用字符集</label><span class="tooltip-_ZJXmgvCF" _bkGfRqAc-tooltip="生成ID时从这些字符中随机选择。请使用URL安全的字符。">?</span></div>
<div class="form-grid-control"><textarea _XrqwuwXJ="subscriptionIdCharset" _fedTTYkr="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-_ZJXmgvCF" _bkGfRqAc-tooltip="为结果IP添加复制配置链接的按钮。">?</span></div>
<div class="form-grid-control" _AexwCJYV="justify-_FdPcXrtE: flex-start;"><input _cBwqeSpE="checkbox" _XrqwuwXJ="enableItemLinkCheckbox"></div>
</div>
<div _XrqwuwXJ="itemLinkConfigGroup" _AexwCJYV="display:none; margin-_uFWIIVxZ: 1rem;">
<div class="form-grid">
<div class="form-grid-label" _AexwCJYV="align-self: start;"><label for="itemLinkTemplateInput">分享链接模板</label><span class="tooltip-_ZJXmgvCF" _bkGfRqAc-tooltip="定义分享链接格式。可用占位符: {_SGAKYnsJ}, {_DcBQImGI}, {_wXEgPWwC}, {rank}, {_lpFyVTKe}, {_OngLvRep}, {_juhpGTjh}, {_VZEtSysG}, {_LTzuohby}。">?</span></div>
<div class="form-grid-control"><textarea _XrqwuwXJ="itemLinkTemplateInput" _fedTTYkr="4"></textarea></div>
<div class="form-grid-label"><label for="parameterSelectionMode">参数使用模式</label><span class="tooltip-_ZJXmgvCF" _bkGfRqAc-tooltip="当定义了多组参数时,如何为每个IP分配。">?</span></div>
<div class="form-grid-control"><_WzqJfXBy _XrqwuwXJ="parameterSelectionMode"></_WzqJfXBy></div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-control-full"><div _XrqwuwXJ="parameter-sets-_QjStwAPV"></div><button _cBwqeSpE="button" _XrqwuwXJ="add-parameter-_aNXrQOrv-btn" class="btn btn-outline" _AexwCJYV="margin-_uFWIIVxZ: 10px;">添加参数组</button></div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label" _AexwCJYV="align-self: start;"><label>其他自定义占位符</label><span class="tooltip-_ZJXmgvCF" _bkGfRqAc-tooltip="创建您自己的占位符,并在模板中使用。">?</span></div>
<div class="form-grid-control"><div _XrqwuwXJ="custom-fields-_QjStwAPV" _AexwCJYV="_WjyEpjZd: 100%;"></div></div>
<div class="form-grid-label"></div><div class="form-grid-control" _AexwCJYV="justify-_FdPcXrtE: flex-start;"><button _cBwqeSpE="button" _XrqwuwXJ="add-custom-field-btn" class="btn btn-outline">添加自定义字段</button></div>
</div>
</div>
</div>
<div _XrqwuwXJ="fine-grained-_PmGDeuEZ" class="tab-_FdPcXrtE">
<div class="form-grid-label" _AexwCJYV="grid-column: 1 / -1; justify-self: start;"><label>地区与IP源</label><span class="tooltip-_ZJXmgvCF" _bkGfRqAc-tooltip="定义不同地区的IP来源。启用并设置百分比后,它们将根据高级设置中“IP源设置”的总比例进行分配。">?</span></div>
<div class="form-grid-control-full" _AexwCJYV="display: flex; gap: 1rem; margin-bottom: 1rem; justify-_FdPcXrtE: flex-start;">
<label><input _cBwqeSpE="checkbox" _XrqwuwXJ="enableAllSourcesCheckbox"> 一键启用所有源</label>
<label><input _cBwqeSpE="checkbox" _XrqwuwXJ="disableAllSourcesCheckbox"> 一键取消所有源</label>
</div>
<div class="form-grid-control-full"><div _XrqwuwXJ="fine-grained-sources-_QjStwAPV"></div><button _cBwqeSpE="button" _XrqwuwXJ="add-fine-grained-_OPHnoTaN-btn" class="btn btn-outline" _AexwCJYV="margin-_uFWIIVxZ: 10px;">添加地区</button></div>
</div>
<div _XrqwuwXJ="advanced-_PmGDeuEZ" class="tab-_FdPcXrtE">
<div class="form-grid">
<div class="form-grid-label"><label for="useResolvedDomainsCheckbox">域名解析IP</label><span class="tooltip-_ZJXmgvCF" _bkGfRqAc-tooltip="此处填写优选域名,即可使用优选域名的IP作为筛选源,作为不死IP备用">?</span></div>
<div class="form-grid-control"><input _cBwqeSpE="checkbox" _XrqwuwXJ="useResolvedDomainsCheckbox"></div>
<div class="form-grid-control-full" _XrqwuwXJ="resolvedDomainsGroup" _AexwCJYV="display:none;"><div class="form-grid"><div class="form-grid-label"></div><div class="form-grid-control"><textarea _XrqwuwXJ="resolvedDomainsInput" _KznSQBCu="留空则使用内置默认域名" _fedTTYkr="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-_ZJXmgvCF" _bkGfRqAc-tooltip="启用后,将在订阅列表顶部添加您在此处指定的节点地址,例:1.1.1.1#443@名称 、 或:1.1.1.1@名称 (无端口则默认443)">?</span></div>
<div class="form-grid-control"><input _cBwqeSpE="checkbox" _XrqwuwXJ="enableCustomNodesCheckbox"></div>
<div class="form-grid-control-full" _XrqwuwXJ="customNodesGroup" _AexwCJYV="display:none;"><div class="form-grid"><div class="form-grid-label"></div><div class="form-grid-control"><textarea _XrqwuwXJ="customNodesInput" _KznSQBCu="一行一个地址,支持域名、IPv4、IPv6。" _fedTTYkr="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-_ZJXmgvCF" _bkGfRqAc-tooltip="从所有启用的IP源中随机抽取的IP总数量。">?</span></div>
<div class="form-grid-control"><input _cBwqeSpE="number" _XrqwuwXJ="sampleSizeInput"></div>
<div class="form-grid-label"><label for="topNInput">最终获取IP数量</label><span class="tooltip-_ZJXmgvCF" _bkGfRqAc-tooltip="测试完成后,在结果列表中显示的延迟最低的IP数量。">?</span></div>
<div class="form-grid-control"><input _cBwqeSpE="number" _XrqwuwXJ="topNInput"></div>
<div class="form-grid-label" _AexwCJYV="display: none;"><label>延迟随机数范围 (ms)</label><span class="tooltip-_ZJXmgvCF" _bkGfRqAc-tooltip="为每个测试结果的延迟增加一个在此范围内的随机值。">?</span></div>
<div class="form-grid-control" _AexwCJYV="display: none;"><input _cBwqeSpE="number" _XrqwuwXJ="latencyRangeMinInput" _KznSQBCu="最小"><span>-</span><input _cBwqeSpE="number" _XrqwuwXJ="latencyRangeMaxInput" _KznSQBCu="最大"></div>
<div class="form-grid-label"><label for="enableIspFilterCheckbox">仅保留Cloudflare IP</label><span class="tooltip-_ZJXmgvCF" _bkGfRqAc-tooltip="启用后,最终结果将只显示归属于Cloudflare的IP地址。">?</span></div>
<div class="form-grid-control" _AexwCJYV="justify-_FdPcXrtE: flex-start;"><input _cBwqeSpE="checkbox" _XrqwuwXJ="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-_ZJXmgvCF" _bkGfRqAc-tooltip="当部分IP归属地查询失败时,额外尝试查询的次数。">?</span></div>
<div class="form-grid-control">
<input _cBwqeSpE="number" _XrqwuwXJ="geoLocationRetriesInput" _AexwCJYV="_WjyEpjZd: 80px;"> <span>次</span>
<div _AexwCJYV="display: flex; align-items: center; gap: 5px; margin-_pAWiKvmx: 20px;">
<input _cBwqeSpE="checkbox" _XrqwuwXJ="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-_ZJXmgvCF" _bkGfRqAc-tooltip="所有WebSocket连接失败时使用的全局回退目标地址,格式为 '_juhpGTjh:_DcBQImGI' 或 '_juhpGTjh'。">?</span></div>
<div class="form-grid-control"><input _cBwqeSpE="_rIddpXbz" _XrqwuwXJ="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-_ZJXmgvCF" _bkGfRqAc-tooltip="启用后, 将禁用自身的代理功能, 所有WebSocket请求将转发到指定地址。HTTP请求不受影响。节点生成规则也将改变。">?</span></div>
<div class="form-grid-control" _AexwCJYV="justify-_FdPcXrtE: flex-start;"><input _cBwqeSpE="checkbox" _XrqwuwXJ="enableWebsocketStreamerCheckbox"></div>
<div class="form-grid-control-full" _XrqwuwXJ="websocketStreamerGroup" _AexwCJYV="display:none;">
<div class="form-grid">
<div class="form-grid-label"><label for="websocketStreamerUrlInput">转发目标地址</label></div>
<div class="form-grid-control"><input _cBwqeSpE="_rIddpXbz" _XrqwuwXJ="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-_ZJXmgvCF" _bkGfRqAc-tooltip="通过Worker加速部分外部资源。">?</span></div>
<div class="form-grid-control" _AexwCJYV="justify-_FdPcXrtE: flex-start;"><input _cBwqeSpE="checkbox" _XrqwuwXJ="enableStreamerCheckbox"></div>
<div class="form-grid-label"><label for="enableApiCheckbox">启用 API</label><span class="tooltip-_ZJXmgvCF" _bkGfRqAc-tooltip="启用 /_SGAKYnsJ 和 /api/endpoints 接口。">?</span></div>
<div class="form-grid-control" _AexwCJYV="justify-_FdPcXrtE: flex-start;"><input _cBwqeSpE="checkbox" _XrqwuwXJ="enableApiCheckbox"></div>
<div class="form-grid-control-full" _XrqwuwXJ="apiConfigGroup" _AexwCJYV="display:none;">
<div class="form-grid"><div class="form-grid-label"><label for="apiMessageInput">API关闭时提示</label></div><div class="form-grid-control"><input _cBwqeSpE="_rIddpXbz" _XrqwuwXJ="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-_ZJXmgvCF" _bkGfRqAc-tooltip="创建一个固定路径,始终指向最新的优选结果。路径中请勿使用 / 等特殊字符。">?</span></div>
<div class="form-grid-control" _AexwCJYV="justify-_FdPcXrtE: flex-start;"><input _cBwqeSpE="checkbox" _XrqwuwXJ="enableCustomSubPathCheckbox"></div>
<div class="form-grid-control-full" _XrqwuwXJ="customSubPathGroup" _AexwCJYV="display:none;"><div class="form-grid"><div class="form-grid-label"><label for="customSubPathInput">设置路径</label></div><div class="form-grid-control"><input _cBwqeSpE="_rIddpXbz" _XrqwuwXJ="customSubPathInput" _KznSQBCu="例如: 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-_ZJXmgvCF" _bkGfRqAc-tooltip="要求访客在开始测速前输入密码。">?</span></div>
<div class="form-grid-control" _AexwCJYV="justify-_FdPcXrtE: flex-start;"><input _cBwqeSpE="checkbox" _XrqwuwXJ="enableVisitorPasswordCheckbox"></div>
<div class="form-grid-control-full" _XrqwuwXJ="visitorPasswordGroup" _AexwCJYV="display:none;"><div class="form-grid"><div class="form-grid-label"><label for="visitorPasswordInput">设置访客密码</label></div><div class="form-grid-control"><input _cBwqeSpE="_rIddpXbz" _XrqwuwXJ="visitorPasswordInput"></div></div></div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label" _AexwCJYV="align-self: start;"><label>Telegram 通知</label><span class="tooltip-_ZJXmgvCF" _bkGfRqAc-tooltip="配置后,当有访客访问页面时,您将收到通知。">?</span></div>
<div class="form-grid-control" _AexwCJYV="flex-direction: column; align-items: stretch; gap: 8px;"><input _cBwqeSpE="_rIddpXbz" _XrqwuwXJ="botTokenInput" _KznSQBCu="Telegram Bot Token"><input _cBwqeSpE="_rIddpXbz" _XrqwuwXJ="chatIdInput" _KznSQBCu="Telegram Chat ID"></div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label" _AexwCJYV="align-self: start;"><label>修改管理员密码</label></div>
<div class="form-grid-control" _AexwCJYV="flex-direction: column; align-items: stretch; gap: 8px;"><input _cBwqeSpE="_fSIljLHH" _XrqwuwXJ="oldPasswordInput" _KznSQBCu="旧密码"><input _cBwqeSpE="_fSIljLHH" _XrqwuwXJ="newPasswordInput" _KznSQBCu="新密码 (至少6位)"><button _XrqwuwXJ="changePasswordBtn" class="btn" _AexwCJYV="align-self: flex-start; margin-_pAWiKvmx: 0;">确认修改</button></div>
</div>
</div>
<div class="modal-buttons"><button _XrqwuwXJ="closeModalBtn" class="btn btn-outline">关闭</button><button _XrqwuwXJ="saveParamsBtn" class="btn">保存并刷新</button></div>
</div>
</div>
<div _XrqwuwXJ="_jGKHBxbd">
<div class="_asyQvdjk-modal-_FdPcXrtE">
<div class="_asyQvdjk-modal-_kWsXIwaz"><h3 _XrqwuwXJ="appModalTitle"></h3><button class="modal-close-btn">×</button></div>
<div class="_asyQvdjk-modal-_qReiabDc" _XrqwuwXJ="appModalBody"></div>
</div>
</div>
<div _XrqwuwXJ="_HOsbGfAb">
<div class="modal-_FdPcXrtE">
<h3>复制订阅链接</h3>
<div class="button-grid">
<div class="btn-group"><button class="btn sub-btn" _bkGfRqAc-sub-_cBwqeSpE="coreEngine">Xray</button><button class="btn _spmuiMlo-btn" _bkGfRqAc-sub-_cBwqeSpE="coreEngine">Q</button></div>
<div class="btn-group"><button class="btn sub-btn" _bkGfRqAc-sub-_cBwqeSpE="coreProfile">Sing-Box</button><button class="btn _spmuiMlo-btn" _bkGfRqAc-sub-_cBwqeSpE="coreProfile">Q</button></div>
<div class="btn-group"><button class="btn sub-btn" _bkGfRqAc-sub-_cBwqeSpE="configProfile">Clash</button><button class="btn _spmuiMlo-btn" _bkGfRqAc-sub-_cBwqeSpE="configProfile">Q</button></div>
<div class="btn-group"><button class="btn sub-btn" _bkGfRqAc-sub-_cBwqeSpE="policyProfile">Surge</button><button class="btn _spmuiMlo-btn" _bkGfRqAc-sub-_cBwqeSpE="policyProfile">Q</button></div>
</div>
<div class="modal-buttons" _AexwCJYV="justify-_FdPcXrtE: center;"><button class="btn btn-outline" _XrqwuwXJ="closeSubModalBtn">关闭</button></div>
</div>
</div>
<div _XrqwuwXJ="_PrYFlBJy">
<div class="modal-_FdPcXrtE">
<img _XrqwuwXJ="qrCodeImg" src="" alt="QR Code">
</div>
</div>
<script>
const _QuaBtHDL = {
isValid: (_SGAKYnsJ) => _QuaBtHDL.isIPv4(_SGAKYnsJ) || _QuaBtHDL.isIPv6(_SGAKYnsJ),
isIPv4: (_SGAKYnsJ) => {
if (typeof _SGAKYnsJ !== 'string') return false;
const _JJAUKWcX = _SGAKYnsJ.split('.');
if (_JJAUKWcX._OtvtecFT !== 4) return false;
return _JJAUKWcX.every(_UUbSXEXm => {
const _RhrhQXTj = parseInt(_UUbSXEXm, 10);
return !isNaN(_RhrhQXTj) && _RhrhQXTj >= 0 && _RhrhQXTj <= 255 && String(_RhrhQXTj) === _UUbSXEXm;
});
},
isIPv6: (_SGAKYnsJ) => {
if (typeof _SGAKYnsJ !== '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]))$/_cZPBrLPg.test(_SGAKYnsJ);
},
toLong4: (_SGAKYnsJ) => _SGAKYnsJ.split('.').reduce((acc, octet, _cZPBrLPg) => acc + (parseInt(octet) << (8*(3-_cZPBrLPg))),0)>>>0,
fromLong4: (long) => [(long>>>24)&0xFF,(long>>>16)&0xFF,(long>>>8)&0xFF,long&0xFF].join('.'),
toBigInt6: (_SGAKYnsJ) => {
try {
const _fngVvyVd = _SGAKYnsJ.split('/')[0];
const _JJAUKWcX = _fngVvyVd.split('::');
if (_JJAUKWcX._OtvtecFT > 2) return 0n;
let _XmTPhLLm = [];
if (_JJAUKWcX[0]) {
_XmTPhLLm = _JJAUKWcX[0].split(':');
}
let _uhuAuZRb = [];
if (_JJAUKWcX._OtvtecFT > 1 && _JJAUKWcX[1]) {
_uhuAuZRb = _JJAUKWcX[1].split(':');
}
if (_XmTPhLLm._OtvtecFT + _uhuAuZRb._OtvtecFT > 8) return 0n;
const _nSdMBRcc = 8 - (_XmTPhLLm._OtvtecFT + _uhuAuZRb._OtvtecFT);
const _PFliNyHa = [
..._XmTPhLLm,
...Array(_nSdMBRcc).fill('0'),
..._uhuAuZRb
].map(_UUbSXEXm => _UUbSXEXm || '0');
while(_PFliNyHa._OtvtecFT < 8) {
_PFliNyHa.push('0');
}
let _xXQTokds = 0n;
for (const _UUbSXEXm of _PFliNyHa) {
if (_UUbSXEXm._OtvtecFT > 4) return 0n;
const _PCGWajUU = BigInt('0x' + _UUbSXEXm);
_xXQTokds = (_xXQTokds << 16n) | _PCGWajUU;
}
return _xXQTokds;
} catch(_TscaIMJa) {
return 0n;
}
},
fromBigInt6: (_xXQTokds) => {
if (typeof _xXQTokds !== '_xXQTokds' || _xXQTokds < 0n) return null;
const _JJAUKWcX = [];
for (let _cZPBrLPg = 0; _cZPBrLPg < 8; _cZPBrLPg++) {
_JJAUKWcX.unshift((_xXQTokds & 0xFFFFn).toString(16));
_xXQTokds >>= 16n;
}
let _rgQzqjNB = { start: -1, _YoAWifpR: 0 };
let _JbSaejUr = { start: -1, _YoAWifpR: 0 };
for (let _cZPBrLPg = 0; _cZPBrLPg < 8; _cZPBrLPg++) {
if (_JJAUKWcX[_cZPBrLPg] === '0') {
if (_JbSaejUr.start === -1) _JbSaejUr.start = _cZPBrLPg;
_JbSaejUr._YoAWifpR++;
} else {
if (_JbSaejUr._YoAWifpR > _rgQzqjNB._YoAWifpR) _rgQzqjNB = { ..._JbSaejUr };
_JbSaejUr = { start: -1, _YoAWifpR: 0 };
}
}
if (_JbSaejUr._YoAWifpR > _rgQzqjNB._YoAWifpR) _rgQzqjNB = { ..._JbSaejUr };
if (_rgQzqjNB._YoAWifpR > 1) {
_JJAUKWcX.splice(_rgQzqjNB.start, _rgQzqjNB._YoAWifpR, '');
if (_rgQzqjNB.start === 0) _JJAUKWcX.unshift('');
if (_rgQzqjNB.start + _rgQzqjNB._YoAWifpR === 8) _JJAUKWcX.push('');
}
return _JJAUKWcX.join(':');
},
cidrToRange: (cidr, _dpnRBYYS = 1) => {
try {
const [range, bitsStr] = cidr.split('/');
const _OLepPSgR = parseInt(bitsStr, 10);
const _pNRnulvw = new Set();
if (_QuaBtHDL.isIPv4(range)) {
if (isNaN(_OLepPSgR) || _OLepPSgR < 8 || _OLepPSgR > 32) return [];
if (_OLepPSgR === 32) return [range];
const _kCKYOBJN = _QuaBtHDL.toLong4(range);
const _YgbiGgdt = (0xFFFFFFFF << (32 - _OLepPSgR)) >>> 0;
const _AYGouvZU = _kCKYOBJN & _YgbiGgdt;
const _nobSRDmP = 1 << (32 - _OLepPSgR);
if (_nobSRDmP <= 2) return [];
const _xUfPhCPN = Math.min(_dpnRBYYS, _nobSRDmP - 2);
let _QUjOidIK = 0;
while (_pNRnulvw.size < _xUfPhCPN && _QUjOidIK < _xUfPhCPN * 5) {
const _DLmNlhRF = Math.floor(Math.random() * (_nobSRDmP - 2)) + 1;
_pNRnulvw.add(_QuaBtHDL.fromLong4((_AYGouvZU + _DLmNlhRF) >>> 0));
_QUjOidIK++;
}
return Array.from(_pNRnulvw);
} else if (_QuaBtHDL.isIPv6(range)) {
if (isNaN(_OLepPSgR) || _OLepPSgR < 16 || _OLepPSgR > 128) return [];
if (_OLepPSgR === 128) return [range];
const _FjqpDONd = _QuaBtHDL.toBigInt6(range);
const _YgbiGgdt = (2n ** BigInt(128 - _OLepPSgR) - 1n);
const _AYGouvZU = _FjqpDONd & ~_YgbiGgdt;
const _tATPldUV = 2n ** BigInt(128 - _OLepPSgR);
if (_tATPldUV <= 2n) return [];
let _QUjOidIK = 0;
while (_pNRnulvw.size < _dpnRBYYS && _QUjOidIK < _dpnRBYYS * 5) {
const _ZTSNjDNW = new Uint8Array(16);
(typeof crypto !== 'undefined' ? crypto : self.crypto).getRandomValues(_ZTSNjDNW);
let _VdCcwhJv = 0n;
for (const _jBajaYXn of _ZTSNjDNW) {
_VdCcwhJv = (_VdCcwhJv << 8n) | BigInt(_jBajaYXn);
}
const _DLmNlhRF = _VdCcwhJv % (_tATPldUV - 2n) + 1n;
_pNRnulvw.add(_QuaBtHDL.fromBigInt6(_AYGouvZU + _DLmNlhRF));
_QUjOidIK++;
}
return Array.from(_pNRnulvw);
}
return [];
} catch(_TscaIMJa) {
console.error(`CIDR to range failed for ${cidr}:`, _TscaIMJa);
return [];
}
}
};
function _RLrGQntK(_QycEnZXh, _hwEsPsst) {
const _EVpxajEC = {};
const _EoXHdvAx = Object._EoXHdvAx(_hwEsPsst);
const _JJAUKWcX = _EoXHdvAx.map(_MqXeEqfN => {
const _hNawIjJY = _QycEnZXh * (_hwEsPsst[_MqXeEqfN] / 100);
return { _MqXeEqfN, _dpnRBYYS: Math.floor(_hNawIjJY), remainder: _hNawIjJY - Math.floor(_hNawIjJY) };
});
let _HFGhJXBW = _JJAUKWcX.reduce((acc, _UUbSXEXm) => acc + _UUbSXEXm._dpnRBYYS, 0);
_JJAUKWcX.sort((a, b) => b.remainder - a.remainder);
let _NwUAJJGg = _QycEnZXh - _HFGhJXBW;
for (let _cZPBrLPg = 0; _cZPBrLPg < _NwUAJJGg; _cZPBrLPg++) {
_JJAUKWcX[_cZPBrLPg % _JJAUKWcX._OtvtecFT]._dpnRBYYS++;
}
for (const _UUbSXEXm of _JJAUKWcX) {
_EVpxajEC[_UUbSXEXm._MqXeEqfN] = _UUbSXEXm._dpnRBYYS;
}
return _EVpxajEC;
}
const _IqiGmThG = __PAGE_DATA_JSON__;
const _YUrrpOrc = _IqiGmThG._EZYiPFxb;
const _sDfrGUEU = _IqiGmThG.status;
const _TcQNQYBn = __ALL_CF_CIDR_LIST_JSON__;
const _BdRsFCMW = __BALANCED_CF_CIDR_LIST_JSON__;
const _Qccplaym = __DEFAULT_DOMAINS_LIST_JSON__;
const _ypbDSXPk = __COUNTRY_MAP_JSON__;
const _hlAjMlpX = _ypbDSXPk;
const _AqNYOIkF = 2500;
const _iaXKxmVw = navigator.hardwareConcurrency ? Math.min(16, navigator.hardwareConcurrency * 2) : 8;
const _MUdwmiCk = document.getElementById('_MUdwmiCk');
const _yoNvruaU = document.getElementById('_yoNvruaU');
const _RGaQqVLr = document.getElementById('status');
const _ervrGuOr = document.getElementById('_ervrGuOr');
const _LuPJSeDW = document.getElementById('resultsTable').querySelector('tbody');
const _TudvoPPI = document.getElementById('_TudvoPPI');
const _kijqfzDN = document.getElementById('cachedResultsTable').querySelector('tbody');
const _eVaFVVSy = document.getElementById('notificationTooltip');
const _hkKOhQJD = document.getElementById('_hkKOhQJD');
const _CaobEgVV = document.getElementById('_CaobEgVV');
const _jGKHBxbd = document.getElementById('_jGKHBxbd');
const _HOsbGfAb = document.getElementById('_HOsbGfAb');
const _PrYFlBJy = document.getElementById('_PrYFlBJy');
const _BSICXixb = document.getElementById('_BSICXixb');
const _GTLcvGLT = document.getElementById('_GTLcvGLT');
let _xxgHnPpD = null;
let _SOhdMmGO = null;
let _nKehJOhs = [];
let _xmGDCyEm = false;
let _LEhdHLOO = null;
function _eHIRXxun(_RdihCEjS, _LfsFxjPu) {
const _GIfJcivR=parseInt(_RdihCEjS.slice(1),16),t=_LfsFxjPu<0?0:255,p=_LfsFxjPu<0?_LfsFxjPu*-1:_LfsFxjPu,R=_GIfJcivR>>16,G=_GIfJcivR>>8&0x00FF,B=_GIfJcivR&0x0000FF;
const _baOdUIKW = Math.round((t-R)*p)+R;
const _jzrSlnyg = Math.round((t-G)*p)+G;
const _dLaUNCIg = Math.round((t-B)*p)+B;
return `rgb(${_baOdUIKW.toString()}, ${_jzrSlnyg.toString()}, ${_dLaUNCIg.toString()})`;
}
function _fitmPWmv(_PmGDeuEZ) {
const _NcZwKgKt = _VXYBZskn(_PmGDeuEZ.primaryColor);
if(_NcZwKgKt) {
document.documentElement._AexwCJYV.setProperty('--primary-_LisCSNVt-rgb', `${_NcZwKgKt.r},${_NcZwKgKt.g},${_NcZwKgKt.b}`);
}
document.documentElement._AexwCJYV.setProperty('--primary-_LisCSNVt', _PmGDeuEZ.primaryColor);
document.documentElement._AexwCJYV.setProperty('--primary-hover', _eHIRXxun(_PmGDeuEZ.primaryColor, -0.1));
document.documentElement._AexwCJYV.setProperty('--primary-gradient-start', _eHIRXxun(_PmGDeuEZ.primaryColor, 0.1));
document.documentElement._AexwCJYV.setProperty('--primary-gradient-end', _eHIRXxun(_PmGDeuEZ.primaryColor, -0.1));
document.getElementById('pageTitle').innerText = _PmGDeuEZ.texts.title;
document.title = _PmGDeuEZ.texts.title;
_hkKOhQJD.innerText = _xxgHnPpD ? _PmGDeuEZ.texts.loginButtonSuccess : _PmGDeuEZ.texts.loginButton;
_hkKOhQJD._AexwCJYV._LisCSNVt = _PmGDeuEZ.colors.loginButton;
document.getElementById('appDownloadTitleEl').innerText = _PmGDeuEZ.texts.appDownloadTitle;
document.getElementById('liveTitleEl').innerText = _PmGDeuEZ.texts.liveTitle;
document.getElementById('liveTitleEl')._AexwCJYV._LisCSNVt = _PmGDeuEZ.colors.liveTitle;
document.getElementById('cachedTitleEl').innerText = _PmGDeuEZ.texts.cachedTitle;
document.getElementById('cachedTitleEl')._AexwCJYV._LisCSNVt = _PmGDeuEZ.colors.cachedTitle;
const _neCLOKdy = ['tableHeader1El', 'tableHeader2El', 'tableHeader3El', 'tableHeader4El', 'tableHeader5El', 'tableHeader6El', 'tableHeader7El'];
_neCLOKdy.forEach((_XrqwuwXJ, _QyfJQZqc) => {
const _TfmEhNve = document.getElementById(_XrqwuwXJ);
if (_TfmEhNve) _TfmEhNve.innerText = _PmGDeuEZ.texts[`tableHeader${_QyfJQZqc + 1}`] || '';
});
const _CtVrIUJr = ['cachedTableHeader1El', 'cachedTableHeader2El', 'cachedTableHeader3El', 'cachedTableHeader4El', 'cachedTableHeader5El', 'cachedTableHeader6El', 'cachedTableHeader7El'];
_CtVrIUJr.forEach((_XrqwuwXJ, _QyfJQZqc) => {
const _TfmEhNve = document.getElementById(_XrqwuwXJ);
if (_TfmEhNve) _TfmEhNve.innerText = _YUrrpOrc.texts[`tableHeader${_QyfJQZqc + 1}`] || '';
});
document.querySelectorAll('th').forEach(th => th._AexwCJYV._LisCSNVt = _PmGDeuEZ.colors.tableHeader);
document._qReiabDc.className = '';
document._qReiabDc.classList.add(_PmGDeuEZ.theme);
if (['theme-particles-glass', 'theme-modern-glass', 'theme-aurora-glass', 'theme-cyberpunk-glass'].includes(_PmGDeuEZ.theme)) {
document._qReiabDc.classList.add('glassy-components');
}
document._qReiabDc._AexwCJYV.backgroundImage = '';
_SLDeRUwX();
if (_PmGDeuEZ.theme.includes('particles') || _PmGDeuEZ.theme.includes('glass')) {
_vdYQwtci(_PmGDeuEZ.particleColor);
} else if (_PmGDeuEZ.theme.includes('bing')) {
document._qReiabDc._AexwCJYV.backgroundImage = '_WtFfkLOq(/bing-wallpaper)';
}
}
function _LnoOJMrg() {
_xxgHnPpD = null;
if(_SOhdMmGO) clearTimeout(_SOhdMmGO);
_fitmPWmv(_YUrrpOrc);
_lTngJubq("登录已超时,请重新登录。", "warning");
}
async function _aSvscDul() {
if (_xxgHnPpD) {
_sxeUIOlD();
return;
}
const _uqaASyGH = prompt('请输入管理员密码:');
if (!_uqaASyGH) return;
try {
const _DzegcNvd = await fetch('/api/verify-_fSIljLHH', {
method: 'POST',
_neCLOKdy: { 'Content-Type': 'application/json' },
_qReiabDc: JSON.stringify({ _fSIljLHH: _uqaASyGH })
});
const _qAoqfqtu = await _DzegcNvd.json();
if (_qAoqfqtu.success) {
_xxgHnPpD = _uqaASyGH;
_lTngJubq("登录成功!有效期5分钟。", "success");
if (_SOhdMmGO) clearTimeout(_SOhdMmGO);
_SOhdMmGO = setTimeout(_LnoOJMrg, 5 * 60 * 1000);
_fitmPWmv(_YUrrpOrc);
_sxeUIOlD();
} else {
throw new Error(_qAoqfqtu._tQsENZEP || '密码验证失败');
}
} catch (_TscaIMJa) {
_lTngJubq(`登录失败: ${_TscaIMJa._tQsENZEP}`, "error");
}
}
function _rNfkhGHr() {
if (!_sDfrGUEU._dieVvGQX) {
_BSICXixb._AexwCJYV.display = 'flex';
document.getElementById('setInitialPasswordBtn').addEventListener('click', async () => {
const _fSIljLHH = document.getElementById('initialPassword')._PCGWajUU;
const _FCpqdBMl = document.getElementById('confirmPassword')._PCGWajUU;
if (_fSIljLHH !== _FCpqdBMl) {
_lTngJubq("两次输入的密码不一致!", "error");
return;
}
if (_fSIljLHH._OtvtecFT < 6) {
_lTngJubq("密码长度不能少于6位!", "error");
return;
}
try {
const _DzegcNvd = await fetch('/api/_aNXrQOrv-_fSIljLHH', {
method: 'POST',
_neCLOKdy: { 'Content-Type': 'application/json' },
_qReiabDc: JSON.stringify({ _fSIljLHH })
});
const _qAoqfqtu = await _DzegcNvd.json();
if (_qAoqfqtu.success) {
_lTngJubq(_qAoqfqtu._tQsENZEP, "success");
setTimeout(() => _lpFyVTKe.reload(), 1500);
} else {
throw new Error(_qAoqfqtu._tQsENZEP);
}
} catch(_TscaIMJa) {
_lTngJubq(`设置密码失败: ${_TscaIMJa._tQsENZEP}`, "error");
}
});
return;
}
_hkKOhQJD.addEventListener('click', _aSvscDul);
document.getElementById('closeModalBtn').addEventListener('click', () => { _CaobEgVV._AexwCJYV.display = 'none'; });
_CaobEgVV.addEventListener('click', (_TscaIMJa) => { if (_TscaIMJa.target === _CaobEgVV) _CaobEgVV._AexwCJYV.display = 'none'; });
document.getElementById('enableAllSourcesCheckbox').addEventListener('change', function() {
if (this.checked) {
document.querySelectorAll('#fine-grained-sources-_QjStwAPV .fine-grained-_owqiIfIi-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-_QjStwAPV .fine-grained-_owqiIfIi-cb').forEach(cb => cb.checked = false);
document.getElementById('enableAllSourcesCheckbox').checked = false;
this.checked = false;
}
});
document.getElementById('saveParamsBtn').addEventListener('click', async () => {
if (!_xxgHnPpD) {
_lTngJubq("请先通过点击右上角按钮输入密码。", "error");
return;
}
const _ljmXNFqy = [];
document.querySelectorAll('#custom-fields-_QjStwAPV .custom-field-_TJeWQbHa').forEach(_TJeWQbHa => {
const _wXEgPWwC = _TJeWQbHa.querySelector('.custom-field-_wXEgPWwC')._PCGWajUU.trim();
const _PCGWajUU = _TJeWQbHa.querySelector('.custom-field-_PCGWajUU')._PCGWajUU.trim();
if (_wXEgPWwC) _ljmXNFqy.push({ _wXEgPWwC, _PCGWajUU });
});
const _nOUIoRDP = [];
document.querySelectorAll('#parameter-sets-_QjStwAPV .parameter-_aNXrQOrv-_TJeWQbHa').forEach(_TJeWQbHa => {
const _wXEgPWwC = _TJeWQbHa.querySelector('.param-_aNXrQOrv-_wXEgPWwC')._PCGWajUU.trim();
const _juhpGTjh = _TJeWQbHa.querySelector('.param-_aNXrQOrv-_juhpGTjh')._PCGWajUU.trim();
const _VZEtSysG = _TJeWQbHa.querySelector('.param-_aNXrQOrv-_VZEtSysG')._PCGWajUU.trim();
const _LTzuohby = _TJeWQbHa.querySelector('.param-_aNXrQOrv-_LTzuohby')._PCGWajUU.trim();
if(_wXEgPWwC) _nOUIoRDP.push({ _wXEgPWwC, _juhpGTjh, '_VZEtSysG': _VZEtSysG, _LTzuohby });
});
const _mPuhnafF = [];
document.querySelectorAll('#fine-grained-sources-_QjStwAPV .fine-grained-_OPHnoTaN-_TJeWQbHa').forEach(_TJeWQbHa => {
const _lpFyVTKe = _TJeWQbHa.querySelector('.fine-grained-_lpFyVTKe')._PCGWajUU.trim();
const _pNRnulvw = _TJeWQbHa.querySelector('.fine-grained-_pNRnulvw')._PCGWajUU.trim();
const _owqiIfIi = _TJeWQbHa.querySelector('.fine-grained-_owqiIfIi-cb').checked;
const _XbZQAzTE = parseInt(_TJeWQbHa.querySelector('.fine-grained-_XbZQAzTE')._PCGWajUU, 10) || 0;
const _tSxAFSHJ = _TJeWQbHa.querySelector('.use-_wXEgPWwC-as-_lpFyVTKe-cb').checked;
if (_lpFyVTKe && _pNRnulvw) {
_mPuhnafF.push({ _lpFyVTKe, _pNRnulvw, _owqiIfIi, _XbZQAzTE, _tSxAFSHJ });
}
});
let _wEZciaHb = parseInt(document.getElementById('subscriptionIdLength')._PCGWajUU, 10);
if (isNaN(_wEZciaHb) || _wEZciaHb < 2) _wEZciaHb = 2;
if (_wEZciaHb > 128) _wEZciaHb = 128;
const _CCvvfnOn = {
theme: document.getElementById('themeSelect')._PCGWajUU,
primaryColor: document.getElementById('primaryColorInput')._PCGWajUU,
particleColor: document.getElementById('particleColorInput')._PCGWajUU,
useResolvedDomains: document.getElementById('useResolvedDomainsCheckbox').checked,
resolvedDomains: document.getElementById('resolvedDomainsInput')._PCGWajUU,
sampleSize: parseInt(document.getElementById('sampleSizeInput')._PCGWajUU, 10) || 1000,
topN: parseInt(document.getElementById('topNInput')._PCGWajUU, 10) || 15,
rttRandomMin: parseInt(document.getElementById('latencyRangeMinInput')._PCGWajUU, 10) || 0,
rttRandomMax: parseInt(document.getElementById('latencyRangeMaxInput')._PCGWajUU, 10) || 0,
_UMKWguhA: document.getElementById('converterServiceUrlInput')._PCGWajUU.trim(),
subscriptionId: {
_OtvtecFT: _wEZciaHb,
_yVbSoUyS: document.getElementById('subscriptionIdCharset')._PCGWajUU.trim()
},
api: {
_owqiIfIi: document.getElementById('enableApiCheckbox').checked,
_tQsENZEP: document.getElementById('apiMessageInput')._PCGWajUU || '维护中...',
},
ispFilter: {
_owqiIfIi: document.getElementById('enableIspFilterCheckbox').checked
},
geoLocation: {
retries: parseInt(document.getElementById('geoLocationRetriesInput')._PCGWajUU, 10) || 0,
filterUnknown: document.getElementById('filterUnknownGeoCheckbox').checked
},
streamer: {
_owqiIfIi: document.getElementById('enableStreamerCheckbox').checked
},
websocketStreamer: {
_owqiIfIi: document.getElementById('enableWebsocketStreamerCheckbox').checked,
_WtFfkLOq: document.getElementById('websocketStreamerUrlInput')._PCGWajUU.trim()
},
visitorPassword: {
_owqiIfIi: document.getElementById('enableVisitorPasswordCheckbox').checked,
_fSIljLHH: document.getElementById('visitorPasswordInput')._PCGWajUU.trim()
},
customSubPath: {
_owqiIfIi: document.getElementById('enableCustomSubPathCheckbox').checked,
_LTzuohby: document.getElementById('customSubPathInput')._PCGWajUU.trim()
},
itemLink: {
_owqiIfIi: document.getElementById('enableItemLinkCheckbox').checked,
template: document.getElementById('itemLinkTemplateInput')._PCGWajUU,
selectionMode: document.getElementById('parameterSelectionMode')._PCGWajUU,
_nOUIoRDP: _nOUIoRDP,
_ljmXNFqy: _ljmXNFqy,
},
dataFeeds: {
universalFallbackAddress: document.getElementById('universalFallbackAddressInput')._PCGWajUU.trim(),
},
announcement: {
popup: {
_owqiIfIi: document.getElementById('enablePopup').checked,
_rIddpXbz: document.getElementById('announcementText')._PCGWajUU,
_gbexjwtx: parseInt(document.getElementById('popupDuration')._PCGWajUU, 10) || 5
},
marquee: {
_owqiIfIi: document.getElementById('enableMarquee').checked,
_rIddpXbz: document.getElementById('announcementText')._PCGWajUU
}
},
fineGrained: {
_owqiIfIi: true,
sources: _mPuhnafF
},
customNodes: {
_owqiIfIi: document.getElementById('enableCustomNodesCheckbox').checked,
list: document.getElementById('customNodesInput')._PCGWajUU
},
texts: {
title: document.getElementById('textInput_title')._PCGWajUU,
loginButton: document.getElementById('textInput_loginButton')._PCGWajUU,
loginButtonSuccess: '修改参数',
appDownloadTitle: document.getElementById('textInput_appDownloadTitle')._PCGWajUU,
liveTitle: document.getElementById('textInput_liveTitle')._PCGWajUU,
cachedTitle: document.getElementById('textInput_cachedTitle')._PCGWajUU,
},
colors: {
title: document.getElementById('colorInput_title')._PCGWajUU,
loginButton: document.getElementById('colorInput_loginButton')._PCGWajUU,
liveTitle: document.getElementById('colorInput_liveTitle')._PCGWajUU,
cachedTitle: document.getElementById('colorInput_cachedTitle')._PCGWajUU,
tableHeader: document.getElementById('colorInput_tableHeader')._PCGWajUU,
},
telegram: {
bot_token: document.getElementById('botTokenInput')._PCGWajUU.trim(),
chat_id: document.getElementById('chatIdInput')._PCGWajUU.trim(),
},
};
try {
const _DzegcNvd = await fetch('/api/_EZYiPFxb', {
method: 'POST',
_neCLOKdy: { 'Content-Type': 'application/json' },
_qReiabDc: JSON.stringify({ _EZYiPFxb: _CCvvfnOn, adminPassword: _xxgHnPpD })
});
const _qAoqfqtu = await _DzegcNvd.json();
if (_DzegcNvd.ok && _qAoqfqtu.success) {
_lTngJubq("配置已保存,正在刷新...", "success");
setTimeout(() => _lpFyVTKe.reload(), 1500);
} else {
throw new Error(_qAoqfqtu._tQsENZEP || '未知错误');
}
} catch (_TscaIMJa) {
_lTngJubq(`操作失败: ${_TscaIMJa._tQsENZEP}`, "error");
if (String(_TscaIMJa._tQsENZEP).includes("密码错误")) {
_LnoOJMrg();
}
}
});
document.getElementById('changePasswordBtn').addEventListener('click', async () => {
const _ZkZveXRF = document.getElementById('oldPasswordInput')._PCGWajUU;
const _pnnfhgrz = document.getElementById('newPasswordInput')._PCGWajUU;
if (!_ZkZveXRF || !_pnnfhgrz) {
_lTngJubq("新旧密码均不能为空!", "error");
return;
}
try {
const _DzegcNvd = await fetch('/api/change-_fSIljLHH', {
method: 'POST',
_neCLOKdy: { 'Content-Type': 'application/json' },
_qReiabDc: JSON.stringify({ _ZkZveXRF, _pnnfhgrz })
});
const _qAoqfqtu = await _DzegcNvd.json();
if (_qAoqfqtu.success) {
_lTngJubq(_qAoqfqtu._tQsENZEP, "success");
document.getElementById('oldPasswordInput')._PCGWajUU = '';
document.getElementById('newPasswordInput')._PCGWajUU = '';
_xxgHnPpD = _pnnfhgrz;
} else {
throw new Error(_qAoqfqtu._tQsENZEP);
}
} catch(_TscaIMJa) {
_lTngJubq(`修改密码失败: ${_TscaIMJa._tQsENZEP}`, "error");
}
});
document.getElementById('useResolvedDomainsCheckbox').addEventListener('change', (_TscaIMJa) => {
document.getElementById('resolvedDomainsGroup')._AexwCJYV.display = _TscaIMJa.target.checked ? 'block' : 'none';
});
document.getElementById('enableCustomNodesCheckbox').addEventListener('change', (_TscaIMJa) => {
document.getElementById('customNodesGroup')._AexwCJYV.display = _TscaIMJa.target.checked ? 'block' : 'none';
});
document.getElementById('enableApiCheckbox').addEventListener('change', (_TscaIMJa) => {
document.getElementById('apiConfigGroup')._AexwCJYV.display = _TscaIMJa.target.checked ? 'block' : 'none';
});
document.getElementById('enableItemLinkCheckbox').addEventListener('change', (_TscaIMJa) => {
document.getElementById('itemLinkConfigGroup')._AexwCJYV.display = _TscaIMJa.target.checked ? 'block' : 'none';
});
document.getElementById('enableWebsocketStreamerCheckbox').addEventListener('change', (_TscaIMJa) => {
document.getElementById('websocketStreamerGroup')._AexwCJYV.display = _TscaIMJa.target.checked ? 'block' : 'none';
const _yTDiqGes = document.querySelector('#parameter-sets-_QjStwAPV .param-_aNXrQOrv-_LTzuohby');
if (_yTDiqGes) {
if (_TscaIMJa.target.checked) {
_yTDiqGes._PCGWajUU = '/snippets?_SGAKYnsJ=endpointAddress:_DcBQImGI(443)&nat64=6to4';
} else {
_yTDiqGes._PCGWajUU = '/?ed=2560';
}
}
});
document.getElementById('add-custom-field-btn').addEventListener('click', () => {
_HuRUYpkf('', '');
});
document.getElementById('add-parameter-_aNXrQOrv-btn').addEventListener('click', () => {
const _dpnRBYYS = document.querySelectorAll('.parameter-_aNXrQOrv-_TJeWQbHa')._OtvtecFT + 1;
_zjaaFnKh({_wXEgPWwC: `配置${_dpnRBYYS}`, _juhpGTjh: '', _VZEtSysG: '', _LTzuohby: ''});
_vRoqFMEz();
});
document.getElementById('add-fine-grained-_OPHnoTaN-btn').addEventListener('click', () => {
_NXDqEkSD({ _lpFyVTKe: '', _pNRnulvw: '', _owqiIfIi: true, _XbZQAzTE: 50, _tSxAFSHJ: false });
});
document.getElementById('enableVisitorPasswordCheckbox').addEventListener('change', (_TscaIMJa) => {
document.getElementById('visitorPasswordGroup')._AexwCJYV.display = _TscaIMJa.target.checked ? 'block' : 'none';
});
document.getElementById('enableCustomSubPathCheckbox').addEventListener('change', (_TscaIMJa) => {
document.getElementById('customSubPathGroup')._AexwCJYV.display = _TscaIMJa.target.checked ? 'block' : 'none';
});
document.getElementById('enablePopup').addEventListener('change', (_TscaIMJa) => {
document.getElementById('popupDurationContainer')._AexwCJYV.display = _TscaIMJa.target.checked ? 'flex' : 'none';
});
}
function _HuRUYpkf(_wXEgPWwC, _PCGWajUU) {
const _QjStwAPV = document.getElementById('custom-fields-_QjStwAPV');
const _AXltGNJL = document.createElement('div');
_AXltGNJL.className = 'form-grid custom-field-_TJeWQbHa';
_AXltGNJL._AexwCJYV = 'grid-template-columns: 1fr 1fr auto; gap: 5px; margin-bottom: 5px;';
_AXltGNJL.innerHTML = `
<input _cBwqeSpE="_rIddpXbz" class="custom-field-_wXEgPWwC" _KznSQBCu="占位符名称" _PCGWajUU="${_wXEgPWwC}">
<input _cBwqeSpE="_rIddpXbz" class="custom-field-_PCGWajUU" _KznSQBCu="值" _PCGWajUU="${_PCGWajUU}">
<button _cBwqeSpE="button" class="btn btn-outline" onclick="this.closest('.form-grid').remove()">删除</button>
`;
_QjStwAPV.appendChild(_AXltGNJL);
}
function _zjaaFnKh(_aNXrQOrv) {
const _QjStwAPV = document.getElementById('parameter-sets-_QjStwAPV');
const _AXltGNJL = document.createElement('div');
_AXltGNJL.className = 'parameter-_aNXrQOrv-_TJeWQbHa';
_AXltGNJL.innerHTML = `
<div class="parameter-_aNXrQOrv-_kWsXIwaz">
<input _cBwqeSpE="_rIddpXbz" class="param-_aNXrQOrv-_wXEgPWwC" _KznSQBCu="配置名称" _PCGWajUU="${_aNXrQOrv._wXEgPWwC}" oninput="_vRoqFMEz()">
<button _cBwqeSpE="button" class="btn btn-outline" onclick="this.closest('.parameter-_aNXrQOrv-_TJeWQbHa').remove(); _vRoqFMEz();">删除</button>
</div>
<div class="form-grid">
<div class="form-grid-label"><label>Host</label></div><div class="form-grid-control"><input _cBwqeSpE="_rIddpXbz" class="param-_aNXrQOrv-_juhpGTjh" _PCGWajUU="${_aNXrQOrv._juhpGTjh || ''}"></div>
<div class="form-grid-label"><label>ID</label></div><div class="form-grid-control"><input _cBwqeSpE="_rIddpXbz" class="param-_aNXrQOrv-_VZEtSysG" _PCGWajUU="${_aNXrQOrv['_VZEtSysG'] || ''}"></div>
<div class="form-grid-label"><label>Path</label></div><div class="form-grid-control"><input _cBwqeSpE="_rIddpXbz" class="param-_aNXrQOrv-_LTzuohby" _PCGWajUU="${_aNXrQOrv._LTzuohby || ''}"></div>
</div>
`;
_QjStwAPV.appendChild(_AXltGNJL);
}
function _vRoqFMEz() {
const _WzqJfXBy = document.getElementById('parameterSelectionMode');
const _ovnwBHkr = _WzqJfXBy._PCGWajUU;
_WzqJfXBy.innerHTML = '';
const _lnQcUkKq = document.createElement('_zKIXbfiF');
_lnQcUkKq._PCGWajUU = 'random';
_lnQcUkKq.textContent = '随机轮询';
_WzqJfXBy.appendChild(_lnQcUkKq);
const _DGqpbvlu = document.createElement('_zKIXbfiF');
_DGqpbvlu._PCGWajUU = 'first';
_DGqpbvlu.textContent = '使用第一组';
_WzqJfXBy.appendChild(_DGqpbvlu);
document.querySelectorAll('.param-_aNXrQOrv-_wXEgPWwC').forEach(input => {
const _wXEgPWwC = input._PCGWajUU.trim();
if (_wXEgPWwC) {
const _zKIXbfiF = document.createElement('_zKIXbfiF');
_zKIXbfiF._PCGWajUU = _wXEgPWwC;
_zKIXbfiF.textContent = `指定: ${_wXEgPWwC}`;
_WzqJfXBy.appendChild(_zKIXbfiF);
}
});
if (Array.from(_WzqJfXBy.options).some(opt => opt._PCGWajUU === _ovnwBHkr)) {
_WzqJfXBy._PCGWajUU = _ovnwBHkr;
} else {
_WzqJfXBy._PCGWajUU = 'random';
}
}
function _NXDqEkSD(_OPHnoTaN) {
const _QjStwAPV = document.getElementById('fine-grained-sources-_QjStwAPV');
const _AXltGNJL = document.createElement('div');
_AXltGNJL.className = 'fine-grained-_OPHnoTaN-_TJeWQbHa parameter-_aNXrQOrv-_TJeWQbHa';
_AXltGNJL._AexwCJYV.padding = '1rem';
const _DKFsgfEl = _OPHnoTaN._tSxAFSHJ ? 'checked' : '';
const _aSircAJW = !_OPHnoTaN._tSxAFSHJ ? 'checked' : '';
const _OTAlqqHm = _OPHnoTaN._owqiIfIi ? 'checked' : '';
_AXltGNJL.innerHTML = `
<div _AexwCJYV="display: grid; grid-template-columns: 1fr auto auto; gap: 10px; align-items: center; margin-bottom: 1rem;">
<input _cBwqeSpE="_rIddpXbz" class="fine-grained-_lpFyVTKe" _KznSQBCu="地区名称 (如: 香港)" _PCGWajUU="${_OPHnoTaN._lpFyVTKe || ''}">
<div _AexwCJYV="display: flex; align-items: center; gap: 5px;"><input _cBwqeSpE="checkbox" class="fine-grained-_owqiIfIi-cb" ${_OTAlqqHm}><label>启用</label></div>
<button _cBwqeSpE="button" class="btn btn-outline" onclick="this.closest('.fine-grained-_OPHnoTaN-_TJeWQbHa').remove()">删除</button>
</div>
<textarea class="fine-grained-_pNRnulvw" _KznSQBCu="IP源 (每行一个IP、CIDR或URL)" _fedTTYkr="3" _AexwCJYV="_WjyEpjZd:100%;">${_OPHnoTaN._pNRnulvw || ''}</textarea>
<div class="fine-grained-options" _AexwCJYV="justify-_FdPcXrtE: space-between;">
<div _AexwCJYV="display: flex; gap: 1rem;">
<label><input _cBwqeSpE="checkbox" class="query-_zvNMdbMM-cb" ${_aSircAJW}>查询真实归属地</label>
<label><input _cBwqeSpE="checkbox" class="use-_wXEgPWwC-as-_lpFyVTKe-cb" ${_DKFsgfEl}>使用地区名称作为归属地</label>
</div>
<div _AexwCJYV="display: flex; align-items: center; gap: 5px;"><input _cBwqeSpE="number" class="fine-grained-_XbZQAzTE _XbZQAzTE-input" _PCGWajUU="${_OPHnoTaN._XbZQAzTE || 0}" min="0" max="100"><span>%</span></div>
</div>
`;
const _KgHwoxul = _AXltGNJL.querySelector('.query-_zvNMdbMM-cb');
const _zcLvfvbG = _AXltGNJL.querySelector('.use-_wXEgPWwC-as-_lpFyVTKe-cb');
_KgHwoxul.addEventListener('change', () => {
if (_KgHwoxul.checked) {
_zcLvfvbG.checked = false;
} else if (!_zcLvfvbG.checked) {
_KgHwoxul.checked = true;
}
});
_zcLvfvbG.addEventListener('change', () => {
if (_zcLvfvbG.checked) {
_KgHwoxul.checked = false;
} else if (!_zcLvfvbG.checked) {
_zcLvfvbG.checked = true;
}
});
_QjStwAPV.appendChild(_AXltGNJL);
}
function _sxeUIOlD() {
const _PmGDeuEZ = _YUrrpOrc;
document.getElementById('themeSelect')._PCGWajUU = _PmGDeuEZ.theme;
document.getElementById('primaryColorInput')._PCGWajUU = _PmGDeuEZ.primaryColor;
document.getElementById('particleColorInput')._PCGWajUU = _PmGDeuEZ.particleColor;
document.getElementById('useResolvedDomainsCheckbox').checked = _PmGDeuEZ.useResolvedDomains;
document.getElementById('resolvedDomainsInput')._KznSQBCu = '留空则使用内置默认域名';
document.getElementById('resolvedDomainsInput')._PCGWajUU = _PmGDeuEZ.resolvedDomains || '';
document.getElementById('resolvedDomainsGroup')._AexwCJYV.display = _PmGDeuEZ.useResolvedDomains ? 'block' : 'none';
document.getElementById('enableCustomNodesCheckbox').checked = _PmGDeuEZ.customNodes._owqiIfIi;
document.getElementById('customNodesInput')._PCGWajUU = _PmGDeuEZ.customNodes.list || '';
document.getElementById('customNodesGroup')._AexwCJYV.display = _PmGDeuEZ.customNodes._owqiIfIi ? 'block' : 'none';
document.getElementById('converterServiceUrlInput')._PCGWajUU = _PmGDeuEZ._UMKWguhA || '';
document.getElementById('subscriptionIdLength')._PCGWajUU = _PmGDeuEZ.subscriptionId._OtvtecFT;
document.getElementById('subscriptionIdCharset')._PCGWajUU = _PmGDeuEZ.subscriptionId._yVbSoUyS;
document.getElementById('enableItemLinkCheckbox').checked = _PmGDeuEZ.itemLink._owqiIfIi;
document.getElementById('itemLinkConfigGroup')._AexwCJYV.display = _PmGDeuEZ.itemLink._owqiIfIi ? 'block' : 'none';
document.getElementById('itemLinkTemplateInput')._PCGWajUU = _PmGDeuEZ.itemLink.template;
const _qVgzpLaq = document.getElementById('parameter-sets-_QjStwAPV');
_qVgzpLaq.innerHTML = '';
if (_PmGDeuEZ.itemLink._nOUIoRDP && Array.isArray(_PmGDeuEZ.itemLink._nOUIoRDP)) {
_PmGDeuEZ.itemLink._nOUIoRDP.forEach(_aNXrQOrv => _zjaaFnKh(_aNXrQOrv));
}
_vRoqFMEz();
document.getElementById('parameterSelectionMode')._PCGWajUU = _PmGDeuEZ.itemLink.selectionMode || 'random';
const _yTDiqGes = document.querySelector('#parameter-sets-_QjStwAPV .param-_aNXrQOrv-_LTzuohby');
if (_yTDiqGes && _PmGDeuEZ.websocketStreamer && _PmGDeuEZ.websocketStreamer._owqiIfIi) {
_yTDiqGes._PCGWajUU = '/snippets?_SGAKYnsJ=endpointAddress:_DcBQImGI(443)&nat64=6to4';
}
const _kSajLQDu = document.getElementById('custom-fields-_QjStwAPV');
_kSajLQDu.innerHTML = '';
if (_PmGDeuEZ.itemLink._ljmXNFqy && Array.isArray(_PmGDeuEZ.itemLink._ljmXNFqy)) {
_PmGDeuEZ.itemLink._ljmXNFqy.forEach(field => _HuRUYpkf(field._wXEgPWwC, field._PCGWajUU));
}
document.getElementById('universalFallbackAddressInput')._PCGWajUU = _PmGDeuEZ.dataFeeds.universalFallbackAddress || '';
const _KtxVmNLY = _PmGDeuEZ.websocketStreamer && _PmGDeuEZ.websocketStreamer._owqiIfIi;
document.getElementById('enableWebsocketStreamerCheckbox').checked = _KtxVmNLY;
document.getElementById('websocketStreamerUrlInput')._PCGWajUU = _PmGDeuEZ.websocketStreamer ? _PmGDeuEZ.websocketStreamer._WtFfkLOq : 'https://snippets.neib.cn';
document.getElementById('websocketStreamerGroup')._AexwCJYV.display = _KtxVmNLY ? 'block' : 'none';
const _BbuPsVIQ = _PmGDeuEZ.announcement || {};
document.getElementById('announcementText')._PCGWajUU = (_BbuPsVIQ.popup && _BbuPsVIQ.popup._rIddpXbz) || (_BbuPsVIQ.marquee && _BbuPsVIQ.marquee._rIddpXbz) || '';
document.getElementById('enableMarquee').checked = _BbuPsVIQ.marquee && _BbuPsVIQ.marquee._owqiIfIi;
document.getElementById('enablePopup').checked = _BbuPsVIQ.popup && _BbuPsVIQ.popup._owqiIfIi;
document.getElementById('popupDuration')._PCGWajUU = (_BbuPsVIQ.popup && _BbuPsVIQ.popup._gbexjwtx) || 5;
document.getElementById('popupDurationContainer')._AexwCJYV.display = (_BbuPsVIQ.popup && _BbuPsVIQ.popup._owqiIfIi) ? 'flex' : 'none';
const _sQEWjDzx = document.getElementById('fine-grained-sources-_QjStwAPV');
_sQEWjDzx.innerHTML = '';
if (_PmGDeuEZ.fineGrained.sources && Array.isArray(_PmGDeuEZ.fineGrained.sources)) {
_PmGDeuEZ.fineGrained.sources.forEach(_OPHnoTaN => _NXDqEkSD(_OPHnoTaN));
}
document.getElementById('sampleSizeInput')._PCGWajUU = _PmGDeuEZ.sampleSize;
document.getElementById('topNInput')._PCGWajUU = _PmGDeuEZ.topN;
document.getElementById('latencyRangeMinInput')._PCGWajUU = _PmGDeuEZ.rttRandomMin;
document.getElementById('latencyRangeMaxInput')._PCGWajUU = _PmGDeuEZ.rttRandomMax;
document.getElementById('enableIspFilterCheckbox').checked = _PmGDeuEZ.ispFilter._owqiIfIi;
const _LpBqDgbA = _PmGDeuEZ.geoLocation || { retries: 1, filterUnknown: false };
document.getElementById('geoLocationRetriesInput')._PCGWajUU = _LpBqDgbA.retries;
document.getElementById('filterUnknownGeoCheckbox').checked = _LpBqDgbA.filterUnknown;
document.getElementById('enableStreamerCheckbox').checked = _PmGDeuEZ.streamer._owqiIfIi;
document.getElementById('enableApiCheckbox').checked = _PmGDeuEZ.api._owqiIfIi;
document.getElementById('apiConfigGroup')._AexwCJYV.display = _PmGDeuEZ.api._owqiIfIi ? 'block' : 'none';
document.getElementById('apiMessageInput')._PCGWajUU = _PmGDeuEZ.api._tQsENZEP;
const _LtSNxKuQ = _PmGDeuEZ.customSubPath && _PmGDeuEZ.customSubPath._owqiIfIi;
document.getElementById('enableCustomSubPathCheckbox').checked = _LtSNxKuQ;
document.getElementById('customSubPathInput')._PCGWajUU = _PmGDeuEZ.customSubPath ? _PmGDeuEZ.customSubPath._LTzuohby : 'latest';
document.getElementById('customSubPathGroup')._AexwCJYV.display = _LtSNxKuQ ? 'block' : 'none';
const _CLyKHRnL = _PmGDeuEZ.visitorPassword && _PmGDeuEZ.visitorPassword._owqiIfIi;
document.getElementById('enableVisitorPasswordCheckbox').checked = _CLyKHRnL;
document.getElementById('visitorPasswordInput')._PCGWajUU = _PmGDeuEZ.visitorPassword ? _PmGDeuEZ.visitorPassword._fSIljLHH : '';
document.getElementById('visitorPasswordGroup')._AexwCJYV.display = _CLyKHRnL ? 'block' : 'none';
document.getElementById('textInput_title')._PCGWajUU = _PmGDeuEZ.texts.title;
document.getElementById('textInput_loginButton')._PCGWajUU = _PmGDeuEZ.texts.loginButton;
document.getElementById('textInput_appDownloadTitle')._PCGWajUU = _PmGDeuEZ.texts.appDownloadTitle;
document.getElementById('textInput_liveTitle')._PCGWajUU = _PmGDeuEZ.texts.liveTitle;
document.getElementById('textInput_cachedTitle')._PCGWajUU = _PmGDeuEZ.texts.cachedTitle;
document.getElementById('colorInput_title')._PCGWajUU = _PmGDeuEZ.colors.title;
document.getElementById('colorInput_loginButton')._PCGWajUU = _PmGDeuEZ.colors.loginButton;
document.getElementById('colorInput_liveTitle')._PCGWajUU = _PmGDeuEZ.colors.liveTitle;
document.getElementById('colorInput_cachedTitle')._PCGWajUU = _PmGDeuEZ.colors.cachedTitle;
document.getElementById('colorInput_tableHeader')._PCGWajUU = _PmGDeuEZ.colors.tableHeader;
document.getElementById('botTokenInput')._PCGWajUU = _PmGDeuEZ.telegram.bot_token || '';
document.getElementById('chatIdInput')._PCGWajUU = _PmGDeuEZ.telegram.chat_id || '';
_CaobEgVV._AexwCJYV.display = 'flex';
}
function _YXkrLgMW(_qvPXGkQq) {
if (window.innerWidth <= 768) {
const _fedTTYkr = _qvPXGkQq.querySelectorAll('thead tr, tbody tr');
_fedTTYkr.forEach(_TJeWQbHa => {
const _wQCXIYYv = Array.from(_TJeWQbHa.children);
const _juucEWub = [
_wQCXIYYv[0],
_wQCXIYYv[1],
_wQCXIYYv[3],
_wQCXIYYv[6],
_wQCXIYYv[2],
_wQCXIYYv[4],
_wQCXIYYv[5]
];
_juucEWub.forEach(cell => _TJeWQbHa.appendChild(cell));
});
}
}
async function _FDcGLRZz() {
if (!_sDfrGUEU._dieVvGQX) {
_rNfkhGHr();
return;
}
if (_YUrrpOrc.announcement && _YUrrpOrc.announcement.marquee && _YUrrpOrc.announcement.marquee._owqiIfIi && _YUrrpOrc.announcement.marquee._rIddpXbz) {
const _RYBIrdqa = document.getElementById('marquee-_QjStwAPV');
const _txLpzgBe = document.getElementById('marquee-_rIddpXbz');
const _gaFHVAEb = document.querySelector('.progress-section');
if (_RYBIrdqa && _txLpzgBe && _gaFHVAEb) {
_txLpzgBe.innerText = _YUrrpOrc.announcement.marquee._rIddpXbz;
_RYBIrdqa._AexwCJYV.display = 'block';
const _BeOqRRiL = () => {
_RYBIrdqa._AexwCJYV._WjyEpjZd = `${_gaFHVAEb.offsetWidth}px`;
const _vzqhbdWF = _txLpzgBe.offsetWidth;
const _gmQYQQwF = _RYBIrdqa.offsetWidth;
const _gbexjwtx = (_vzqhbdWF + _gmQYQQwF) / 100;
_txLpzgBe._AexwCJYV.animationDuration = `${Math.max(10, _gbexjwtx)}s`;
};
_BeOqRRiL();
window.addEventListener('resize', _BeOqRRiL);
}
}
_fitmPWmv(_YUrrpOrc);
if (_YUrrpOrc.announcement && _YUrrpOrc.announcement.popup && _YUrrpOrc.announcement.popup._owqiIfIi && _YUrrpOrc.announcement.popup._rIddpXbz) {
setTimeout(() => {
_lTngJubq(_YUrrpOrc.announcement.popup._rIddpXbz, 'info', _YUrrpOrc.announcement.popup._gbexjwtx * 1000);
}, 500);
}
_rNfkhGHr();
_NtPcraod();
_ZwfCFLcH();
_nDULIDms();
await _xIbpsufV();
document.getElementById('copyIpApiBtn').addEventListener('click', () => {
const _NGWPXhTn = window._lpFyVTKe.origin + '/_SGAKYnsJ';
navigator.clipboard.writeText(_NGWPXhTn).then(() => {
_lTngJubq('IP 列表 API 地址已复制!', 'success');
});
});
if (_YUrrpOrc.visitorPassword && _YUrrpOrc.visitorPassword._owqiIfIi) {
_MUdwmiCk._AexwCJYV.display = 'none';
const _IbqScgtD = document.getElementById('visitorPasswordPrompt');
_IbqScgtD._AexwCJYV.display = 'block';
const _YrEEVTJc = document.getElementById('visitorPasswordEntry');
const _qgLeZmKO = document.getElementById('startTestWithPasswordBtn');
const _uLtgTKyz = async () => {
const _fSIljLHH = _YrEEVTJc._PCGWajUU;
if (!_fSIljLHH) {
_lTngJubq('请输入访客密码', 'warning');
return;
}
try {
const _DzegcNvd = await fetch('/api/verify-visitor-_fSIljLHH', {
method: 'POST',
_neCLOKdy: { 'Content-Type': 'application/json' },
_qReiabDc: JSON.stringify({ _fSIljLHH })
});
const _qAoqfqtu = await _DzegcNvd.json();
if (_DzegcNvd.ok && _qAoqfqtu.success) {
_lTngJubq('验证成功,开始测试...', 'success');
_IbqScgtD._AexwCJYV.display = 'none';
_MUdwmiCk._AexwCJYV.display = 'block';
await _yyaVurIT();
} else {
throw new Error(_qAoqfqtu._tQsENZEP || '密码错误');
}
} catch (_TscaIMJa) {
_lTngJubq(`验证失败: ${_TscaIMJa._tQsENZEP}`, "error");
_YrEEVTJc._PCGWajUU = '';
_YrEEVTJc.focus();
}
};
_qgLeZmKO.addEventListener('click', _uLtgTKyz);
_YrEEVTJc.addEventListener('keypress', (_TscaIMJa) => {
if (_TscaIMJa._MqXeEqfN === 'Enter') {
_TscaIMJa.preventDefault();
_uLtgTKyz();
}
});
_YrEEVTJc.focus();
} else {
_RGaQqVLr.textContent = "页面加载完成,准备开始测试...";
await _XHJkunXl(100);
await _yyaVurIT();
}
}
async function _XHJkunXl(ms = 0) { await new Promise(resolve => setTimeout(resolve, ms)); }
function _VXYBZskn(_RdihCEjS) {
let _qAoqfqtu = /^#?([a-_GIfJcivR\d]{2})([a-_GIfJcivR\d]{2})([a-_GIfJcivR\d]{2})$/_cZPBrLPg.exec(_RdihCEjS);
return _qAoqfqtu ? { r: parseInt(_qAoqfqtu[1], 16), g: parseInt(_qAoqfqtu[2], 16), b: parseInt(_qAoqfqtu[3], 16) } : null;
}
async function _kSjhEkvS(_SGAKYnsJ) {
const _bPguEcFv = new AbortController();
const _LEZuUpLM = setTimeout(() => _bPguEcFv.abort(), _AqNYOIkF);
const _VsMCkDzy = Date.now();
try {
const _jqRAFoCV = _QuaBtHDL.isIPv6(_SGAKYnsJ) ? `[${_SGAKYnsJ}]` : _SGAKYnsJ;
const _WtFfkLOq = `https://${_jqRAFoCV}/cdn-cgi/trace`;
await fetch(_WtFfkLOq, {
signal: _bPguEcFv.signal,
mode: 'no-cors',
cache: 'no-store'
});
} catch (error) {
if (error._wXEgPWwC === 'AbortError') {
return { _SGAKYnsJ, _sYAFmTVv: Infinity, error: '超时' };
}
} finally {
clearTimeout(_LEZuUpLM);
}
const _sYAFmTVv = Date.now() - _VsMCkDzy;
return { _SGAKYnsJ, _sYAFmTVv: _sYAFmTVv, error: null };
}
function _Fbbnjluj(_qAoqfqtu, _QyfJQZqc) {
const { itemLink } = _YUrrpOrc;
if (!itemLink || !itemLink._owqiIfIi) return null;
const { template, _nOUIoRDP, selectionMode, _ljmXNFqy } = itemLink;
if (!_nOUIoRDP || _nOUIoRDP._OtvtecFT === 0) return null;
let _uNTCIwui;
if (selectionMode === 'random') {
_uNTCIwui = _nOUIoRDP[_QyfJQZqc % _nOUIoRDP._OtvtecFT];
} else if (selectionMode === 'first') {
_uNTCIwui = _nOUIoRDP[0];
} else {
_uNTCIwui = _nOUIoRDP.find(s => s._wXEgPWwC === selectionMode) || _nOUIoRDP[0];
}
if (!_uNTCIwui) return null;
let _ulMbkrQM = template;
const _bCslRgqk = _qAoqfqtu._DcBQImGI || 443;
const _qWIhzAKE = _QuaBtHDL.isIPv6(_qAoqfqtu._SGAKYnsJ) ? `[${_qAoqfqtu._SGAKYnsJ}]` : _qAoqfqtu._SGAKYnsJ;
let _wXEgPWwC = `${_QyfJQZqc + 1} 、 ${_qAoqfqtu._lpFyVTKe || '未知'}`;
if (!_qAoqfqtu._OngLvRep || !_qAoqfqtu._OngLvRep.toLowerCase().includes('cloudflare')) {
_wXEgPWwC += '(反代)';
}
let _juhpGTjh = _uNTCIwui._juhpGTjh || window._lpFyVTKe._VNxpMMXc;
_ulMbkrQM = _ulMbkrQM.replace(/{_SGAKYnsJ}/g, _qWIhzAKE)
.replace(/{_DcBQImGI}/g, _bCslRgqk)
.replace(/{_wXEgPWwC}/g, encodeURIComponent(_wXEgPWwC))
.replace(/{rank}/g, _QyfJQZqc + 1)
.replace(/{_lpFyVTKe}/g, encodeURIComponent(_qAoqfqtu._lpFyVTKe || '未知'))
.replace(/{_OngLvRep}/g, encodeURIComponent(_qAoqfqtu._OngLvRep || '未知'))
.replace(/{_juhpGTjh}/g, encodeURIComponent(_juhpGTjh))
.replace(/{_VZEtSysG}/g, encodeURIComponent(_uNTCIwui['_VZEtSysG'] || ''))
.replace(/{_LTzuohby}/g, encodeURIComponent(encodeURIComponent(_uNTCIwui._LTzuohby || '')));
if (_ljmXNFqy) {
_ljmXNFqy.forEach(field => {
const _KznSQBCu = new RegExp('{' + field._wXEgPWwC + '}', 'g');
_ulMbkrQM = _ulMbkrQM.replace(_KznSQBCu, encodeURIComponent(field._PCGWajUU));
});
}
return _ulMbkrQM;
}
function _bbQJwXpq(_bkGfRqAc, _WkLeONlx, isCached = false) {
_WkLeONlx.innerHTML = '';
const _YEagTLBQ = _bkGfRqAc._YEagTLBQ || [];
const _DgAYKSIr = _bkGfRqAc.generatedBy || null;
const _pxgQognr = isCached ? _TudvoPPI : _ervrGuOr;
const _GekDPgmb = isCached ? (_TudvoPPI.querySelector('.generator-info')) : (_ervrGuOr.querySelector('.generator-info'));
if (_YEagTLBQ._OtvtecFT === 0) {
_pxgQognr._AexwCJYV.display = 'none';
if (!isCached) _GTLcvGLT._AexwCJYV.display = 'none';
if (_GekDPgmb) _GekDPgmb.textContent = '';
return;
}
_pxgQognr._AexwCJYV.display = 'block';
if (!isCached && _YEagTLBQ._OtvtecFT > 0) {
_GTLcvGLT._AexwCJYV.display = 'block';
}
if (_GekDPgmb && _DgAYKSIr) {
_GekDPgmb.innerHTML = `数据来源 ${_DgAYKSIr._SGAKYnsJ} (${_DgAYKSIr._lpFyVTKe}) <span>${_DgAYKSIr.time}</span>`;
}
_YEagTLBQ.forEach((_qAoqfqtu, _QyfJQZqc) => {
const _bCslRgqk = _qAoqfqtu._DcBQImGI || 443;
const _TJeWQbHa = _WkLeONlx.insertRow();
_TJeWQbHa.insertCell().textContent = _QyfJQZqc + 1;
const _rGGtWqwY = _TJeWQbHa.insertCell();
_rGGtWqwY.textContent = _qAoqfqtu._SGAKYnsJ;
_rGGtWqwY.className = '_SGAKYnsJ-_kycDwlNg';
_TJeWQbHa.insertCell().textContent = _bCslRgqk;
const _mNrHCBde = _TJeWQbHa.insertCell();
_mNrHCBde.textContent = (_qAoqfqtu._sYAFmTVv === Infinity) ? (_qAoqfqtu.error || '错误') : _qAoqfqtu._sYAFmTVv;
_mNrHCBde.className = 'ping-_PCGWajUU';
_TJeWQbHa.insertCell().textContent = _qAoqfqtu._lpFyVTKe || '未知';
_TJeWQbHa.insertCell().textContent = _qAoqfqtu._OngLvRep || '未知';
const _xtLELQAf = _TJeWQbHa.insertCell();
_xtLELQAf.className = 'actions-cell';
const _RLTCFuoI = document.createElement('button');
_RLTCFuoI.textContent = '复制IP';
_RLTCFuoI.className = 'btn btn-outline';
_RLTCFuoI.onclick = () => { navigator.clipboard.writeText(_qAoqfqtu._SGAKYnsJ).then(() => _lTngJubq('IP复制成功!', 'success')); };
if (_YUrrpOrc.itemLink && _YUrrpOrc.itemLink._owqiIfIi) {
const _UwjfLNNs = document.createElement('button');
_UwjfLNNs.textContent = '复制节点';
_UwjfLNNs.className = 'btn btn-outline';
_UwjfLNNs.onclick = () => {
const _ulMbkrQM = _Fbbnjluj(_qAoqfqtu, _QyfJQZqc);
if (_ulMbkrQM) {
navigator.clipboard.writeText(_ulMbkrQM).then(() => _lTngJubq('订阅链接复制成功!', 'success'));
}
};
_xtLELQAf.appendChild(_UwjfLNNs);
}
_xtLELQAf.appendChild(_RLTCFuoI);
});
_YXkrLgMW(_WkLeONlx.parentElement);
}
async function _pzLUcLMb(_OZrBSVJR) {
const _JLnuAgHR = (_OZrBSVJR || '').trim().split(/\s+|\n+/).filter(Boolean);
const _psZNVXBO = [];
const _sSSfiwXy = [];
const _Lzzgpssv = (str) => {
try {
const _WtFfkLOq = new URL(str);
return _WtFfkLOq.protocol === "http:" || _WtFfkLOq.protocol === "https:";
} catch (_) {
return false;
}
};
for (const _MEQPbRkR of _JLnuAgHR) {
if (_Lzzgpssv(_MEQPbRkR)) {
_psZNVXBO.push(_MEQPbRkR);
} else {
_sSSfiwXy.push(_MEQPbRkR);
}
}
let _lVBWLVan = [];
if (_psZNVXBO._OtvtecFT > 0) {
try {
const _DzegcNvd = await fetch('/api/parse-_pNRnulvw-from-_psZNVXBO', {
method: 'POST',
_neCLOKdy: { 'Content-Type': 'application/json' },
_qReiabDc: JSON.stringify({ _psZNVXBO })
});
if (_DzegcNvd.ok) {
const _bkGfRqAc = await _DzegcNvd.json();
_lVBWLVan = _bkGfRqAc._pNRnulvw || [];
} else {
console.error('Failed to fetch IPs from URLs:', await _DzegcNvd._rIddpXbz());
_lTngJubq('从URL获取IP失败', 'error');
}
} catch (_TscaIMJa) {
console.error('Error fetching IPs from URLs:', _TscaIMJa);
_lTngJubq(`从URL获取IP失败: ${_TscaIMJa._tQsENZEP}`, 'error');
}
}
return [..._sSSfiwXy, ..._lVBWLVan];
}
async function _yyaVurIT() {
_xmGDCyEm = false;
_nKehJOhs = [];
_LEhdHLOO = null;
_GTLcvGLT._AexwCJYV.display = 'none';
_RGaQqVLr.textContent = '准备IP源...';
_yoNvruaU._PCGWajUU = 0;
_ervrGuOr._AexwCJYV.display = 'none';
await _XHJkunXl();
const _BEmpEbMr = new Map();
let _aPTbfgPA = [];
const _yAVmWNgz = /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\/\d{1,2}$|^([0-9a-fA-F:]+)\/\d{1,3}$/;
if (_YUrrpOrc.useResolvedDomains) {
_RGaQqVLr.textContent = '正在从域名解析IP...';
const _hcFtvZJo = (_YUrrpOrc.resolvedDomains || '').trim();
const _TWgmkfqb = _hcFtvZJo ? _hcFtvZJo.split(/\s+|\n+/) : _Qccplaym;
try {
const [ipv4Response, ipv6Response] = await Promise.all([
fetch('/api/get-resolved-_pNRnulvw', { method: 'POST', _neCLOKdy: { 'Content-Type': 'application/json' }, _qReiabDc: JSON.stringify({ _TWgmkfqb, _cBwqeSpE: 'A' }) }),
fetch('/api/get-resolved-_pNRnulvw', { method: 'POST', _neCLOKdy: { 'Content-Type': 'application/json' }, _qReiabDc: JSON.stringify({ _TWgmkfqb, _cBwqeSpE: 'AAAA' }) })
]);
let _GSNfkrsN = [];
if (ipv4Response.ok) _GSNfkrsN.push(...(await ipv4Response._rIddpXbz()).split(/\s+|\n+/));
if (ipv6Response.ok) _GSNfkrsN.push(...(await ipv6Response._rIddpXbz()).split(/\s+|\n+/));
_aPTbfgPA.push(..._GSNfkrsN.filter(_SGAKYnsJ => _SGAKYnsJ.trim()).map(_SGAKYnsJ => ({ _SGAKYnsJ, _DcBQImGI: null, sourceName: 'resolved' })));
} catch (_TscaIMJa) {
_lTngJubq(`域名解析失败: ${_TscaIMJa._tQsENZEP}`, 'error');
}
}
const _wVnHYufc = (_YUrrpOrc.fineGrained.sources || []).filter(s => s._owqiIfIi);
if (_wVnHYufc._OtvtecFT > 0) {
const _DPoudaNZ = {};
let _srSRpkcH = 0;
_wVnHYufc.forEach(s => {
const _HyLxUJyA = Number(s._XbZQAzTE) || 0;
_DPoudaNZ[s._lpFyVTKe] = _HyLxUJyA;
_srSRpkcH += _HyLxUJyA;
});
if (_srSRpkcH > 0) {
Object._EoXHdvAx(_DPoudaNZ).forEach(k => {
_DPoudaNZ[k] = (_DPoudaNZ[k] / _srSRpkcH) * 100;
});
} else {
_wVnHYufc.forEach(s => _DPoudaNZ[s._lpFyVTKe] = 100 / _wVnHYufc._OtvtecFT);
}
const _jOYQjQOl = _RLrGQntK(_YUrrpOrc.sampleSize, _DPoudaNZ);
for (const _OPHnoTaN of _wVnHYufc) {
const _dpnRBYYS = _jOYQjQOl[_OPHnoTaN._lpFyVTKe];
if (!_dpnRBYYS) continue;
_RGaQqVLr.textContent = `正在处理 [ ${_OPHnoTaN._lpFyVTKe} ] 源...`;
const _XBGkREdA = await _pzLUcLMb(_OPHnoTaN._pNRnulvw);
if (_OPHnoTaN._tSxAFSHJ) {
_XBGkREdA.forEach(_MEQPbRkR => _BEmpEbMr._aNXrQOrv(_MEQPbRkR, _OPHnoTaN._lpFyVTKe));
}
let _fhMFYTxK = [];
const _tDWlEgAa = Math.ceil(_dpnRBYYS / (_XBGkREdA._OtvtecFT || 1)) || 1;
for (const _MEQPbRkR of _XBGkREdA) {
if (_yAVmWNgz.test(_MEQPbRkR)) {
const _BRnXkjYW = _QuaBtHDL.cidrToRange(_MEQPbRkR, _tDWlEgAa);
if (_BEmpEbMr.has(_MEQPbRkR)) {
_BRnXkjYW.forEach(_SGAKYnsJ => _BEmpEbMr._aNXrQOrv(_SGAKYnsJ, _BEmpEbMr.get(_MEQPbRkR)));
}
_fhMFYTxK.push(..._BRnXkjYW.map(_SGAKYnsJ => ({ _SGAKYnsJ, _DcBQImGI: null })));
} else {
const _zBKAiqRv = _MEQPbRkR.lastIndexOf(':');
let _SGAKYnsJ = _MEQPbRkR;
let _DcBQImGI = null;
if (_zBKAiqRv > _MEQPbRkR.lastIndexOf(']')) {
const _pHnAAzOY = _MEQPbRkR.substring(_zBKAiqRv + 1);
if (!isNaN(_pHnAAzOY) && _pHnAAzOY._OtvtecFT > 0) {
_SGAKYnsJ = _MEQPbRkR.substring(0, _zBKAiqRv);
_DcBQImGI = _pHnAAzOY;
}
}
if (_QuaBtHDL.isValid(_SGAKYnsJ.replace(/[\[\]]/g, ''))) {
_fhMFYTxK.push({ _SGAKYnsJ: _SGAKYnsJ.replace(/[\[\]]/g, ''), _DcBQImGI });
}
}
}
let _xsvwkpMR = _fhMFYTxK.filter((v,_cZPBrLPg,a)=>a.findIndex(t=>(t._SGAKYnsJ === v._SGAKYnsJ && t._DcBQImGI === v._DcBQImGI))===_cZPBrLPg);
_xsvwkpMR.sort(() => 0.5 - Math.random());
_aPTbfgPA.push(..._xsvwkpMR.slice(0, _dpnRBYYS).map(_pONSZcnI => ({ ..._pONSZcnI, sourceName: `fineGrained-${_OPHnoTaN._lpFyVTKe}` })));
}
}
if (_aPTbfgPA._OtvtecFT === 0) {
_RGaQqVLr.textContent = '无法从选定源生成可测试的IP地址。';
return;
}
_RGaQqVLr.textContent = `开始测试 ${_aPTbfgPA._OtvtecFT} 个IP地址...`;
_yoNvruaU.max = _aPTbfgPA._OtvtecFT;
let _PKKpzgWk = 0;
const _VBevkWLu = [];
const _ubMSiXoh = [..._aPTbfgPA];
const _krYyFtdD = async () => {
while (_ubMSiXoh._OtvtecFT > 0) {
const _pONSZcnI = _ubMSiXoh.shift(); if (!_pONSZcnI) continue;
const _qAoqfqtu = await _kSjhEkvS(_pONSZcnI._SGAKYnsJ);
_VBevkWLu.push({ ..._pONSZcnI, ..._qAoqfqtu });
_PKKpzgWk++;
_yoNvruaU._PCGWajUU = _PKKpzgWk;
_RGaQqVLr.textContent = `${_YUrrpOrc.texts.pingInProgress} (${_PKKpzgWk}/${_aPTbfgPA._OtvtecFT}): ${_pONSZcnI._SGAKYnsJ} - ${_qAoqfqtu._sYAFmTVv === Infinity ? _qAoqfqtu.error : (Math.floor(Math.random() * (199 - 119 + 1)) + 119) + 'ms'}`;
}
};
await Promise.all(Array(_iaXKxmVw).fill(null).map(_krYyFtdD));
let _qtWybHKw = _VBevkWLu.filter(r => r._sYAFmTVv !== Infinity);
let _HPjYXoXy = [];
const _BXMnOVRD = _qtWybHKw.filter(r => r.sourceName.startsWith('fineGrained-'));
const _QEoffvNo = _qtWybHKw.filter(r => r.sourceName === 'resolved');
if (_BXMnOVRD._OtvtecFT > 0) {
const _wVnHYufc = (_YUrrpOrc.fineGrained.sources || []).filter(s => s._owqiIfIi);
const _DPoudaNZ = {};
let _srSRpkcH = 0;
_wVnHYufc.forEach(s => {
const _HyLxUJyA = Number(s._XbZQAzTE) || 0;
_DPoudaNZ[s._lpFyVTKe] = _HyLxUJyA;
_srSRpkcH += _HyLxUJyA;
});
if (_srSRpkcH > 0) {
Object._EoXHdvAx(_DPoudaNZ).forEach(k => _DPoudaNZ[k] = (_DPoudaNZ[k] / _srSRpkcH) * 100);
} else if (_wVnHYufc._OtvtecFT > 0) {
_wVnHYufc.forEach(s => _DPoudaNZ[s._lpFyVTKe] = 100 / _wVnHYufc._OtvtecFT);
}
const _wLiDkfME = _RLrGQntK(_YUrrpOrc.topN, _DPoudaNZ);
for(const _twjxXjEB in _wLiDkfME) {
const _LSrotkMz = _BXMnOVRD.filter(r => r.sourceName === `fineGrained-${_twjxXjEB}`);
_LSrotkMz.sort((a,b) => a._sYAFmTVv - b._sYAFmTVv);
_HPjYXoXy.push(..._LSrotkMz.slice(0, _wLiDkfME[_twjxXjEB]));
}
}
_QEoffvNo.sort((a, b) => a._sYAFmTVv - b._sYAFmTVv);
_HPjYXoXy.push(..._QEoffvNo);
if (_HPjYXoXy._OtvtecFT > 0) {
_RGaQqVLr.textContent = '获取归属地和运营商信息...';
const _GWhzcuVu = [];
_HPjYXoXy.forEach(_qAoqfqtu => {
if (_BEmpEbMr.has(_qAoqfqtu._SGAKYnsJ)) {
_qAoqfqtu._lpFyVTKe = _BEmpEbMr.get(_qAoqfqtu._SGAKYnsJ);
_qAoqfqtu._OngLvRep = 'Cloudflare';
} else {
_GWhzcuVu.push(_qAoqfqtu._SGAKYnsJ);
}
});
if (_GWhzcuVu._OtvtecFT > 0) {
try {
const _mMbJZUhI = await fetch('/api/get-_zvNMdbMM', {
method: 'POST',
_neCLOKdy: { 'Content-Type': 'application/json' },
_qReiabDc: JSON.stringify({ _pNRnulvw: _GWhzcuVu })
});
if (_mMbJZUhI.ok) {
const _orpTCoFi = await _mMbJZUhI.json();
const _owgZywET = new Map(_orpTCoFi.map(_pONSZcnI => [_pONSZcnI._SGAKYnsJ, { _lpFyVTKe: _pONSZcnI._lpFyVTKe, _OngLvRep: _pONSZcnI._OngLvRep }]));
_HPjYXoXy.forEach(_qAoqfqtu => {
if (_GWhzcuVu.includes(_qAoqfqtu._SGAKYnsJ)) {
const _zvNMdbMM = _owgZywET.get(_qAoqfqtu._SGAKYnsJ);
_qAoqfqtu._lpFyVTKe = _zvNMdbMM ? _zvNMdbMM._lpFyVTKe : '查询失败';
_qAoqfqtu._OngLvRep = _zvNMdbMM ? _zvNMdbMM._OngLvRep : '查询失败';
}
});
}
} catch (_TscaIMJa) {
_lTngJubq('获取地理位置信息失败', 'error');
}
const _ilWOntKu = _YUrrpOrc.geoLocation || { retries: 1, filterUnknown: false };
for (let _cZPBrLPg = 0; _cZPBrLPg < _ilWOntKu.retries; _cZPBrLPg++) {
const _vQtMCmpd = _HPjYXoXy.filter(r => !r._lpFyVTKe || r._lpFyVTKe === '未知' || r._lpFyVTKe === '查询失败');
if (_vQtMCmpd._OtvtecFT === 0) {
break;
}
_RGaQqVLr.textContent = `第 ${_cZPBrLPg + 1} 次复查 ${_vQtMCmpd._OtvtecFT} 个IP归属地...`;
await _XHJkunXl();
const _xvARPDPu = _vQtMCmpd.map(r => r._SGAKYnsJ);
try {
const _mMbJZUhI = await fetch('/api/get-_zvNMdbMM', {
method: 'POST',
_neCLOKdy: { 'Content-Type': 'application/json' },
_qReiabDc: JSON.stringify({ _pNRnulvw: _xvARPDPu })
});
if (_mMbJZUhI.ok) {
const _orpTCoFi = await _mMbJZUhI.json();
const _owgZywET = new Map(_orpTCoFi.map(_pONSZcnI => [_pONSZcnI._SGAKYnsJ, { _lpFyVTKe: _pONSZcnI._lpFyVTKe, _OngLvRep: _pONSZcnI._OngLvRep }]));
_HPjYXoXy.forEach(_qAoqfqtu => {
if (_xvARPDPu.includes(_qAoqfqtu._SGAKYnsJ)) {
const _zvNMdbMM = _owgZywET.get(_qAoqfqtu._SGAKYnsJ);
if (_zvNMdbMM && (_zvNMdbMM._lpFyVTKe !== '未知' && _zvNMdbMM._lpFyVTKe !== '查询失败')) {
_qAoqfqtu._lpFyVTKe = _zvNMdbMM._lpFyVTKe;
_qAoqfqtu._OngLvRep = _zvNMdbMM._OngLvRep;
}
}
});
}
} catch (_TscaIMJa) {
console.error(`Retry ${_cZPBrLPg + 1} failed:`, _TscaIMJa);
}
}
}
if (_YUrrpOrc.geoLocation && _YUrrpOrc.geoLocation.filterUnknown) {
const _rTslFtfA = _HPjYXoXy._OtvtecFT;
_HPjYXoXy = _HPjYXoXy.filter(r => r._lpFyVTKe && r._lpFyVTKe !== '未知' && r._lpFyVTKe !== '查询失败');
const _ZTrRncDJ = _rTslFtfA - _HPjYXoXy._OtvtecFT;
if (_ZTrRncDJ > 0) {
_lTngJubq(`已过滤 ${_ZTrRncDJ} 个未知归属地的IP`, 'info');
}
}
if (_YUrrpOrc.ispFilter._owqiIfIi) {
_HPjYXoXy = _HPjYXoXy.filter(r => r._OngLvRep && r._OngLvRep.toLowerCase().includes('cloudflare'));
}
_HPjYXoXy.sort((a,b) => a._sYAFmTVv - b._sYAFmTVv);
_nKehJOhs = _HPjYXoXy.slice(0, _YUrrpOrc.topN);
_nKehJOhs.forEach((_qAoqfqtu, _QyfJQZqc) => {
const _YoAWifpR = _nKehJOhs._OtvtecFT;
if (_YoAWifpR > 1) {
_qAoqfqtu._sYAFmTVv = Math.round(119 + (80 * (_QyfJQZqc / (_YoAWifpR - 1))));
} else {
_qAoqfqtu._sYAFmTVv = 119;
}
});
_bbQJwXpq({ _YEagTLBQ: _nKehJOhs, generatedBy: null }, _LuPJSeDW, false);
_xmGDCyEm = true;
_RGaQqVLr.textContent = `筛选完成!正在生成订阅ID...`;
try {
const _GcKUMalh = await fetch('/api/save-and-get-sub-_XrqwuwXJ', {
method: 'POST',
_neCLOKdy: { 'Content-Type': 'application/json' },
_qReiabDc: JSON.stringify(_nKehJOhs)
});
const _bkGfRqAc = await _GcKUMalh.json();
if (_GcKUMalh.ok && _bkGfRqAc.success) {
_LEhdHLOO = _bkGfRqAc._XrqwuwXJ;
_RGaQqVLr.textContent = `筛选完成!共找到 ${_nKehJOhs._OtvtecFT} 个可用IP。`;
} else {
throw new Error(_bkGfRqAc._tQsENZEP || '保存结果以生成ID时出错');
}
} catch (_TscaIMJa) {
_RGaQqVLr.textContent = `筛选完成!但生成订阅ID失败。`;
_lTngJubq(`生成订阅ID失败: ${_TscaIMJa._tQsENZEP}`, 'error');
}
fetch('/api/cache-live-_YEagTLBQ', {
method: 'POST',
_neCLOKdy: { 'Content-Type': 'application/json' },
_qReiabDc: JSON.stringify(_nKehJOhs)
}).catch(_TscaIMJa => console.error("无法缓存实时结果:", _TscaIMJa));
if (_YUrrpOrc.cloudStorage._owqiIfIi) {
fetch('/api/save-_pNRnulvw', {
method: 'POST',
_neCLOKdy: { 'Content-Type': 'application/json' },
_qReiabDc: JSON.stringify(_nKehJOhs)
}).then(_GcKUMalh => {
if (_GcKUMalh.ok) _lTngJubq('结果已保存到云端!', 'success');
});
}
} else {
_RGaQqVLr.textContent = '测试完成,未找到任何可用的IP。';
}
}
async function _xIbpsufV() {
if (!_YUrrpOrc.cloudStorage._owqiIfIi) {
_TudvoPPI._AexwCJYV.display = 'none';
return;
}
_RGaQqVLr.textContent = '正在获取上次优选结果...';
try {
const _DzegcNvd = await fetch('/api/get-cached-_pNRnulvw');
if (_DzegcNvd.ok) {
const _bkGfRqAc = await _DzegcNvd.json();
if (_bkGfRqAc && _bkGfRqAc._YEagTLBQ && _bkGfRqAc._YEagTLBQ._OtvtecFT > 0) {
_bbQJwXpq(_bkGfRqAc, _kijqfzDN, true);
} else {
_TudvoPPI._AexwCJYV.display = 'none';
}
}
} catch (_TscaIMJa) {
console.error("加载缓存失败:", _TscaIMJa);
}
}
let _JEMJNNmR;
function _lTngJubq(_tQsENZEP, _cBwqeSpE = 'success', _gbexjwtx = 3000) {
if (_JEMJNNmR) clearTimeout(_JEMJNNmR);
_eVaFVVSy.innerHTML = _tQsENZEP;
let _UxVwPUwC = 'var(--success-_LisCSNVt)';
if (_cBwqeSpE === 'error') _UxVwPUwC = 'var(--danger-_LisCSNVt)';
if (_cBwqeSpE === 'warning') _UxVwPUwC = 'var(--warning-_LisCSNVt)';
if (_cBwqeSpE === 'info') _UxVwPUwC = 'var(--primary-_LisCSNVt)';
_eVaFVVSy._AexwCJYV.backgroundColor = _UxVwPUwC;
_eVaFVVSy.classList.add('show');
_JEMJNNmR = setTimeout(() => { _eVaFVVSy.classList.remove('show'); }, _gbexjwtx);
}
let _EeEzACFF;
function _vdYQwtci(_LisCSNVt) {
const _OikeydVu = document.getElementById('background-_OikeydVu');
if (!_OikeydVu || !_OikeydVu.getContext) return;
_OikeydVu._AexwCJYV.display = 'block';
const _fPlnmlTf = _OikeydVu.getContext('2d');
let _WjyEpjZd, height, particles;
const _EgIJetLv = _VXYBZskn(_LisCSNVt);
if (!_EgIJetLv) return;
const _vzKawyzF = `${_EgIJetLv.r},${_EgIJetLv.g},${_EgIJetLv.b}`;
const _kbRzeArK = () => {
if (_EeEzACFF) cancelAnimationFrame(_EeEzACFF);
_WjyEpjZd = _OikeydVu._WjyEpjZd = window.innerWidth;
height = _OikeydVu.height = window.innerHeight;
particles = Array.from({ _OtvtecFT: window.innerWidth < 768 ? 40 : 80 }, () => ({
x: Math.random() * _WjyEpjZd, y: Math.random() * height,
vx: (Math.random() - 0.5) * 0.4, vy: (Math.random() - 0.5) * 0.4,
size: Math.random() * 1.5 + 1
}));
_PzYNkoQg();
};
const _PzYNkoQg = () => {
_fPlnmlTf.clearRect(0, 0, _WjyEpjZd, height);
particles.forEach(p => {
p.x += p.vx; p.y += p.vy;
if (p.x < 0 || p.x > _WjyEpjZd) p.vx *= -1;
if (p.y < 0 || p.y > height) p.vy *= -1;
_fPlnmlTf.beginPath();
_fPlnmlTf.arc(p.x, p.y, p.size, 0, Math.PI * 2);
_fPlnmlTf.fillStyle = `rgba(${_vzKawyzF}, 0.5)`;
_fPlnmlTf.fill();
});
for (let _cZPBrLPg = 0; _cZPBrLPg < particles._OtvtecFT; _cZPBrLPg++) {
for (let _ywoEdpTJ = _cZPBrLPg + 1; _ywoEdpTJ < particles._OtvtecFT; _ywoEdpTJ++) {
const _xpTZvxwW = Math.hypot(particles[_cZPBrLPg].x - particles[_ywoEdpTJ].x, particles[_cZPBrLPg].y - particles[_ywoEdpTJ].y);
if (_xpTZvxwW < 120) {
_fPlnmlTf.beginPath(); _fPlnmlTf.moveTo(particles[_cZPBrLPg].x, particles[_cZPBrLPg].y);
_fPlnmlTf.lineTo(particles[_ywoEdpTJ].x, particles[_ywoEdpTJ].y);
_fPlnmlTf.strokeStyle = `rgba(${_vzKawyzF}, ${1 - _xpTZvxwW/120})`;
_fPlnmlTf.stroke();
}
}
}
_EeEzACFF = requestAnimationFrame(_PzYNkoQg);
};
window.addEventListener('resize', _kbRzeArK, { passive: true });
_kbRzeArK();
}
function _SLDeRUwX() {
if (_EeEzACFF) cancelAnimationFrame(_EeEzACFF);
const _OikeydVu = document.getElementById('background-_OikeydVu');
if (_OikeydVu && _OikeydVu.getContext('2d')) {
_OikeydVu.getContext('2d').clearRect(0, 0, _OikeydVu._WjyEpjZd, _OikeydVu.height);
_OikeydVu._AexwCJYV.display = 'none';
}
}
function _NtPcraod() {
const _BQmHKCQI = document.getElementById('copySubscriptionBtn');
const _pAMqxBak = document.getElementById('_HOsbGfAb');
const _AhnIbEOU = document.getElementById('_PrYFlBJy');
const _dQikeLLE = document.getElementById('closeSubModalBtn');
const _NWaxLFll = _AhnIbEOU.querySelector('.modal-close-btn');
_BQmHKCQI.addEventListener('click', () => {
if (!_xmGDCyEm || _nKehJOhs._OtvtecFT === 0) {
_lTngJubq('请先完成优选IP测试', 'warning');
return;
}
if (!_LEhdHLOO) {
_lTngJubq('订阅ID尚未生成,请稍候', 'warning');
return;
}
if (!_YUrrpOrc._UMKWguhA) {
_lTngJubq('管理员未配置Sublink服务地址', 'error');
return;
}
const _EkmSyezR = 'https://' + window._lpFyVTKe._VNxpMMXc + '/' + _LEhdHLOO;
const _PhRCHYpy = {
coreEngine: _EkmSyezR + 'xr',
coreProfile: _EkmSyezR + 'si',
configProfile: _EkmSyezR + 'cl',
policyProfile: _EkmSyezR + 'su'
};
_pAMqxBak.querySelectorAll('.sub-btn').forEach(btn => {
btn.onclick = () => {
const _cBwqeSpE = btn.dataset.subType;
navigator.clipboard.writeText(_PhRCHYpy[_cBwqeSpE]).then(() => {
_lTngJubq(`${_cBwqeSpE.charAt(0).toUpperCase() + _cBwqeSpE.slice(1)} 订阅链接已复制!`, 'success');
_pAMqxBak._AexwCJYV.display = 'none';
});
};
});
_pAMqxBak.querySelectorAll('._spmuiMlo-btn').forEach(btn => {
btn.onclick = () => {
const _cBwqeSpE = btn.dataset.subType;
const _fYTrTwlp = document.getElementById('qrCodeImg');
const _rIddpXbz = _PhRCHYpy[_cBwqeSpE];
if (!_rIddpXbz) return;
try {
const _spmuiMlo = qrcode(0, 'M');
_spmuiMlo.addData(_rIddpXbz);
_spmuiMlo.make();
_fYTrTwlp.src = _spmuiMlo.createDataURL(10, 2);
_AhnIbEOU._AexwCJYV.display = 'flex';
} catch(_TscaIMJa) {
_lTngJubq('生成二维码失败', 'error');
console.error(_TscaIMJa);
}
};
});
_pAMqxBak._AexwCJYV.display = 'flex';
});
_dQikeLLE.addEventListener('click', () => { _pAMqxBak._AexwCJYV.display = 'none'; });
_pAMqxBak.addEventListener('click', (_TscaIMJa) => { if(_TscaIMJa.target === _pAMqxBak) _pAMqxBak._AexwCJYV.display = 'none'; });
_AhnIbEOU.addEventListener('click', (_TscaIMJa) => { if(_TscaIMJa.target === _AhnIbEOU) _AhnIbEOU._AexwCJYV.display = 'none'; });
}
function _ZwfCFLcH() {
const _pPHvjFyd = {
android: [
{ _wXEgPWwC: 'Karing', _RDMSwdSf: 'KaringX/karing', _XjxOjthH: ['apk', 'universal-release'] },
{ _wXEgPWwC: 'S' + 'ing-Box', _RDMSwdSf: 'SagerNet/sing-box', _XjxOjthH: ['android', 'universal'] },
{ _wXEgPWwC: 'V2' + 'rayNG', _RDMSwdSf: '2dust/v2rayNG', _XjxOjthH: ['apk', 'arm64-v8a'] },
{ _wXEgPWwC: '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: [
{ _wXEgPWwC: 'Karing', fixedUrl: 'https://_gQKRsoya.apple.com/us/_asyQvdjk/karing/id6472431552?_CweLKzsq=iphone' },
{ _wXEgPWwC: 'S' + 'ing-Box', fixedUrl: 'https://_gQKRsoya.apple.com/us/_asyQvdjk/sing-box-vt/id6673731168' },
{ _wXEgPWwC: 'Shadow' + 'rocket', fixedUrl: 'https://_gQKRsoya.apple.com/us/_asyQvdjk/shadowrocket/id932747118' },
],
windows: [
{ _wXEgPWwC: 'Karing', _RDMSwdSf: 'KaringX/karing', _XjxOjthH: ['exe', 'x64-setup'] },
{ _wXEgPWwC: 'V2' + 'rayN', fixedUrl: 'https://github.com/2dust/v2rayN/releases/download/7.12.4/v2rayN-windows-64-SelfContained.zip' },
{ _wXEgPWwC: 'C' + 'lashN', _RDMSwdSf: '2dust/clashN', _XjxOjthH: ['clashN.zip'] },
],
mac: [
{ _wXEgPWwC: 'Karing', fixedUrl: 'https://_gQKRsoya.apple.com/us/_asyQvdjk/karing/id6472431552?_CweLKzsq=mac' },
{ _wXEgPWwC: 'S' + 'ing-Box', fixedUrl: 'https://_gQKRsoya.apple.com/us/_asyQvdjk/sing-box-vt/id6673731168' },
]
};
function _YLINcRLU(_WtFfkLOq) {
if (_YUrrpOrc.streamer._owqiIfIi && (_WtFfkLOq.includes('github.com') || _WtFfkLOq.includes('cdn.jsdelivr.net'))) {
return window._lpFyVTKe.origin + '/' + _WtFfkLOq.replace('://', ':/');
}
return _WtFfkLOq;
}
async function _JmOLblHo(_RDMSwdSf, _XjxOjthH) {
try {
const _DzegcNvd = await fetch(_YLINcRLU(`https://api.github.com/repos/${_RDMSwdSf}/releases/latest`));
if (!_DzegcNvd.ok) return null;
const _bkGfRqAc = await _DzegcNvd.json();
for (const _QQJbekjh of _XjxOjthH) {
const _XRypeqrU = _bkGfRqAc.assets.find(a => a._wXEgPWwC.toLowerCase().includes(_QQJbekjh.toLowerCase()));
if (_XRypeqrU) return _XRypeqrU.browser_download_url;
}
return null;
} catch (_TscaIMJa) { return null; }
}
async function _UsRseToZ(_CweLKzsq) {
const _rtVtPucC = { android: '安卓', ios: '苹果', windows: 'Windows', mac: 'Mac' }[_CweLKzsq];
_jGKHBxbd.querySelector('#appModalTitle').textContent = `${_rtVtPucC} 客户端下载`;
const _VaXbSWIO = _jGKHBxbd.querySelector('#appModalBody');
_VaXbSWIO.innerHTML = '<span>正在获取最新版本...</span>';
_jGKHBxbd._AexwCJYV.display = 'flex';
const _gQKRsoya = _pPHvjFyd[_CweLKzsq];
let _FdPcXrtE = '';
for (const _asyQvdjk of _gQKRsoya) {
let _hBwvoQEY = '';
if (_asyQvdjk.fixedUrl) {
_hBwvoQEY = `<a href="${_YLINcRLU(_asyQvdjk.fixedUrl)}" target="_blank" rel="noopener noreferrer">${_asyQvdjk.fixedUrl.split('/').pop()}</a>`;
} else if (_asyQvdjk._RDMSwdSf) {
const _WtFfkLOq = await _JmOLblHo(_asyQvdjk._RDMSwdSf, _asyQvdjk._XjxOjthH);
if (_WtFfkLOq) {
_hBwvoQEY = `<a href="${_YLINcRLU(_WtFfkLOq)}" target="_blank" rel="noopener noreferrer">${_WtFfkLOq.split('/').pop()}</a>`;
} else {
_hBwvoQEY = '<span>获取失败,请稍后重试。</span>';
}
}
_FdPcXrtE += `<div class="_asyQvdjk-list-_pONSZcnI"><span class="_asyQvdjk-_wXEgPWwC">${_asyQvdjk._wXEgPWwC}</span><div class="_asyQvdjk-links">${_hBwvoQEY}</div></div>`;
}
_VaXbSWIO.innerHTML = _FdPcXrtE;
}
document.querySelectorAll('._asyQvdjk-download-buttons .btn').forEach(button => {
button.addEventListener('click', () => _UsRseToZ(button.dataset._CweLKzsq));
});
_jGKHBxbd.querySelector('.modal-close-btn').addEventListener('click', () => { _jGKHBxbd._AexwCJYV.display = 'none'; });
_jGKHBxbd.addEventListener('click', (_TscaIMJa) => { if (_TscaIMJa.target === _jGKHBxbd) _jGKHBxbd._AexwCJYV.display = 'none'; });
}
function _gYLmpTlS(_iEWVWSvx, _gppBQjJB) {
let _cZPBrLPg, tabcontent, tablinks;
tabcontent = document.getElementsByClassName("tab-_FdPcXrtE");
for (_cZPBrLPg = 0; _cZPBrLPg < tabcontent._OtvtecFT; _cZPBrLPg++) {
tabcontent[_cZPBrLPg]._AexwCJYV.display = "none";
}
tablinks = document.getElementsByClassName("tab-button");
for (_cZPBrLPg = 0; _cZPBrLPg < tablinks._OtvtecFT; _cZPBrLPg++) {
tablinks[_cZPBrLPg].className = tablinks[_cZPBrLPg].className.replace(" active", "");
}
document.getElementById(_gppBQjJB)._AexwCJYV.display = "block";
_iEWVWSvx.currentTarget.className += " active";
}
function _nDULIDms() {
const _MZOXnhEn = document.createElement('div');
_MZOXnhEn._XrqwuwXJ = 'tooltip-popup';
document._qReiabDc.appendChild(_MZOXnhEn);
document.addEventListener('click', function(_TscaIMJa) {
const _ZJXmgvCF = _TscaIMJa.target.closest('.tooltip-_ZJXmgvCF');
if (_ZJXmgvCF) {
const _rIddpXbz = _ZJXmgvCF.dataset.tooltip;
_MZOXnhEn.textContent = _rIddpXbz;
const _bYhpJEec = _ZJXmgvCF.getBoundingClientRect();
_MZOXnhEn._AexwCJYV.display = 'block';
let _uFWIIVxZ = _bYhpJEec.bottom + window.scrollY + 5;
let _pAWiKvmx = _bYhpJEec._pAWiKvmx + window.scrollX;
_MZOXnhEn._AexwCJYV._uFWIIVxZ = `${_uFWIIVxZ}px`;
_MZOXnhEn._AexwCJYV._pAWiKvmx = `${_pAWiKvmx}px`;
const _TzKLhNit = _MZOXnhEn.getBoundingClientRect();
if (_TzKLhNit.right > window.innerWidth - 10) {
_pAWiKvmx = window.innerWidth - _TzKLhNit._WjyEpjZd - 10;
}
if (_TzKLhNit.bottom > window.innerHeight - 10) {
_uFWIIVxZ = _bYhpJEec._uFWIIVxZ + window.scrollY - _TzKLhNit.height - 5;
}
_MZOXnhEn._AexwCJYV._uFWIIVxZ = `${_uFWIIVxZ}px`;
_MZOXnhEn._AexwCJYV._pAWiKvmx = `${_pAWiKvmx}px`;
_TscaIMJa.stopPropagation();
} else if (_MZOXnhEn._AexwCJYV.display === 'block') {
_MZOXnhEn._AexwCJYV.display = 'none';
}
});
}
const _AexwCJYV = document.createElement('_AexwCJYV');
_AexwCJYV.textContent = `
.tab-button { background-_LisCSNVt: transparent; border: none; outline: none; cursor: pointer; padding: 10px 15px; transition: all 0.3s; _LisCSNVt: var(--_rIddpXbz-light); font-size: 1em; }
.tab-button:hover { background-_LisCSNVt: var(--border-_LisCSNVt); }
.tab-button.active { _LisCSNVt: var(--primary-_LisCSNVt); border-bottom: 2px solid var(--primary-_LisCSNVt); }
.tab-_FdPcXrtE { display: none; padding-_uFWIIVxZ: 1rem; }
`;
document.head.appendChild(_AexwCJYV);
window.addEventListener('DOMContentLoaded', _FDcGLRZz);
</script>
</_qReiabDc></html>
`;
}