import { connect } from "cloudflare:sockets";
const _MfhvDRoe = "3b4d4cd8-cb92-4421-bf86-fb51570fc038";
const _udRSwjAU = ["UpstreamAddress.SG.CMLiussss.net"];
const _aHjtqwaI = 'https://raw.githubusercontent.com/5yfx/CF_WEB_IP_Worekrs/refs/heads/main/%E5%86%85%E7%BD%AEIP';
const _OFcuOlLw = 'https://raw.githubusercontent.com/5yfx/CF_WEB_IP_Worekrs/refs/heads/main/%E5%9D%87%E8%A1%A1IP';
const _azbSlCrp = '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 _WMCLboqx = '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 _LqisdBoA(_TEZLvhSj) {
if (Array.isArray(_TEZLvhSj)) {
try {
return String.fromCharCode.apply(null, _TEZLvhSj);
} catch (_fFGNTBrq) {
return '';
}
}
return _TEZLvhSj;
}
function _OuzjnUBo(_RCEiBsls) {
return /^[0-9a-_duLMQWgd]{8}-[0-9a-_duLMQWgd]{4}-[4][0-9a-_duLMQWgd]{3}-[89ab][0-9a-_duLMQWgd]{3}-[0-9a-_duLMQWgd]{12}$/_SCkExIXX.test(_RCEiBsls);
}
const _RQqZKxif = "optimized_ips_v4";
const _DwOOOwHi = "global_config_v4";
const _rpPWXEvT = "admin_password_v4";
const _NORZGZYw = "live_results_temp_v1";
const _teMbwtuN = "latest_sub_id_v1";
export default {
async fetch(_XAYmRJyt, _pcmUVJiI, _wDFeOSps) {
try {
if (!_pcmUVJiI.DB) {
const _pswjFnYz = _WtDJHGOl("D1 数据库 'DB' 未绑定。");
return new Response(_pswjFnYz, { status: 503, _dacTBTAm: { 'Content-Type': '_OqnGuMiR/html;_cbFSYayC=UTF-8' }});
}
_wDFeOSps.waitUntil(
_pcmUVJiI.DB.exec(`
CREATE TABLE IF NOT EXISTS kv_data (_kxDvchmY TEXT PRIMARY KEY, _TEZLvhSj TEXT);
CREATE TABLE IF NOT EXISTS optimized_results (_RCEiBsls TEXT PRIMARY KEY, _QdVjVIxA TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP);
`).catch(_fFGNTBrq => console.error("DB Init Error:", _fFGNTBrq._gghNrVUR))
);
const _Itpwvulm = new URL(_XAYmRJyt._Itpwvulm);
const _jVUjjXvF = _Itpwvulm.pathname;
const _tYFwaJAd = _XAYmRJyt._dacTBTAm.get("Upgrade");
const _iMSzqVRJ = await _YtpkJMmM(_pcmUVJiI);
if (_iMSzqVRJ.websocketStreamer && _iMSzqVRJ.websocketStreamer._VcnCZwrg && _tYFwaJAd && _tYFwaJAd.toLowerCase() === "websocket") {
const _IjygGJol = _iMSzqVRJ.websocketStreamer._Itpwvulm;
if (_IjygGJol && _IjygGJol.trim().startsWith('https://')) {
try {
const _QSRbhUtk = new Request(_IjygGJol.trim() + _Itpwvulm.pathname + _Itpwvulm.search, _XAYmRJyt);
return await fetch(_QSRbhUtk);
} catch (_fFGNTBrq) {
return new Response(`Upstream WebSocket gateway failed: ${_fFGNTBrq._gghNrVUR}`, { status: 502 });
}
}
return new Response("WebSocket reverse gateway URL is not configured or is invalid.", { status: 502 });
}
if (_tYFwaJAd && _tYFwaJAd.toLowerCase() === "websocket") {
return await _siXOoMwQ(_XAYmRJyt, _pcmUVJiI, _iMSzqVRJ);
}
const _XsUUQnSj = _jVUjjXvF._gCiqvwTG(/^\/([a-zA-Z0-9-_.]{2,128})(xr|si|cl|su)$/);
if (_XsUUQnSj) {
const [, _IkYHtGkZ, typeSuffix] = _XsUUQnSj;
const _XZVTBcuE = _iMSzqVRJ._XZVTBcuE;
if (!_XZVTBcuE || _XZVTBcuE.trim() === '') {
return new Response("订阅转换(Sublink)服务器地址未配置。", { status: 503, _dacTBTAm: { 'Content-Type': '_OqnGuMiR/plain; _cbFSYayC=utf-8' } });
}
const _qoPGSbcN = { 'xr': 'coreEngine', 'si': 'coreProfile', 'cl': 'configProfile', 'su': 'policyProfile' };
const _ZBWtHgei = _qoPGSbcN[typeSuffix];
const _Zdqpbuhu = _XZVTBcuE.replace(/\/$/, '');
const _MmQuxUyo = `${_Itpwvulm.origin}/${_IkYHtGkZ}`;
const _UApifUmQ = `${_Zdqpbuhu}/${_ZBWtHgei}?_iMSzqVRJ=${encodeURIComponent(_MmQuxUyo)}`;
try {
const _uPEQZAfB = await fetch(_UApifUmQ, { _dacTBTAm: { 'User-Agent': _XAYmRJyt._dacTBTAm.get('User-Agent') || 'Cloudflare-Worker-Sub-Fetcher/1.0' } });
const _gDBLbVDV = new Headers(_uPEQZAfB._dacTBTAm);
_gDBLbVDV._pkbekVLk('Access-Control-Allow-Origin', '*');
return new Response(_uPEQZAfB._QOlovGVe, { status: _uPEQZAfB.status, statusText: _uPEQZAfB.statusText, _dacTBTAm: _gDBLbVDV });
} catch (_fFGNTBrq) {
return new Response(`获取上游订阅失败: ${_fFGNTBrq._gghNrVUR}`, { status: 502, _dacTBTAm: { 'Content-Type': '_OqnGuMiR/plain; _cbFSYayC=utf-8' } });
}
}
if (_jVUjjXvF.startsWith('/https:/') || _jVUjjXvF.startsWith('/http:/')) {
return _fGebmFeY(_XAYmRJyt, _iMSzqVRJ);
}
if (_iMSzqVRJ.customSubPath && _iMSzqVRJ.customSubPath._VcnCZwrg && _iMSzqVRJ.customSubPath._jVUjjXvF && _jVUjjXvF === '/' + _iMSzqVRJ.customSubPath._jVUjjXvF.trim()) {
const _gJJDxvPF = _pcmUVJiI.DB.prepare("SELECT _TEZLvhSj FROM kv_data WHERE _kxDvchmY = ?").bind(_teMbwtuN);
const { _zmXBzLso } = await _gJJDxvPF.all();
const _SWMHaLPp = _zmXBzLso._TqNejCny > 0 ? _zmXBzLso[0]._TEZLvhSj : null;
if (_SWMHaLPp) {
return _IdxdnACc({ _nREjHAPt: { _RCEiBsls: _SWMHaLPp }, _Itpwvulm: _XAYmRJyt._Itpwvulm }, _pcmUVJiI);
} else {
return new Response("未找到最新的优选结果集。", { status: 404, _dacTBTAm: { 'Content-Type': '_OqnGuMiR/plain; _cbFSYayC=utf-8' } });
}
}
const _FPhhKDEt = _jVUjjXvF.split('/').filter(Boolean);
if (_FPhhKDEt._TqNejCny === 1 && !_jVUjjXvF.startsWith('/api/')) {
const _IkYHtGkZ = _FPhhKDEt[0];
return _IdxdnACc({ _nREjHAPt: { _RCEiBsls: _IkYHtGkZ }, _Itpwvulm: _XAYmRJyt._Itpwvulm }, _pcmUVJiI);
}
if (_jVUjjXvF.startsWith('/api/')) {
if (_jVUjjXvF === '/api/_iMSzqVRJ' && _XAYmRJyt.method === 'POST') return _qPDThwkz(_XAYmRJyt, _pcmUVJiI, _wDFeOSps);
if (_jVUjjXvF === '/api/_pkbekVLk-_FppnICwG') return _NxxbsjVP(_XAYmRJyt, _pcmUVJiI);
if (_jVUjjXvF === '/api/change-_FppnICwG') return _ncIZUFYB(_XAYmRJyt, _pcmUVJiI);
if (_jVUjjXvF === '/api/verify-_FppnICwG') return _OjfoZlcw(_XAYmRJyt, _pcmUVJiI);
if (_jVUjjXvF === '/api/verify-visitor-_FppnICwG' && _XAYmRJyt.method === 'POST') return _SEqsoyfe(_XAYmRJyt, _pcmUVJiI);
if (_jVUjjXvF === '/api/cache-live-_zmXBzLso' && _XAYmRJyt.method === 'POST') return _ukeWWgQH(_XAYmRJyt, _pcmUVJiI, _wDFeOSps);
if (_jVUjjXvF === '/api/get-_gSySivzM' && _XAYmRJyt.method === 'POST') return _xFFeNyUp(_XAYmRJyt, _pcmUVJiI);
if (_jVUjjXvF === '/api/get-cached-_FOFNWLZC') return _yMdRrPvD(_XAYmRJyt, _pcmUVJiI);
if (_jVUjjXvF === '/api/save-_FOFNWLZC') return _dzMNNVTk(_XAYmRJyt, _pcmUVJiI, _wDFeOSps);
if (_jVUjjXvF === '/api/save-and-get-sub-_RCEiBsls' && _XAYmRJyt.method === 'POST') return _vzkCwGaa(_XAYmRJyt, _pcmUVJiI);
if (_jVUjjXvF.startsWith('/api/get-_sQuROAqK/')) {
const _IkYHtGkZ = _jVUjjXvF.split('/').pop();
return _IdxdnACc({ _nREjHAPt: { _RCEiBsls: _IkYHtGkZ }, _Itpwvulm: _XAYmRJyt._Itpwvulm }, _pcmUVJiI);
}
if (_jVUjjXvF === '/api/_iMSzqVRJ' && _XAYmRJyt.method === 'GET') return _staOVlQG(_pcmUVJiI);
if (_jVUjjXvF === '/api/get-resolved-_FOFNWLZC') return _gkVhFGAh(_XAYmRJyt);
if (_jVUjjXvF === '/api/parse-_FOFNWLZC-from-_uZZWNnlm' && _XAYmRJyt.method === 'POST') return _fgmRValA(_XAYmRJyt, _pcmUVJiI);
if (_jVUjjXvF === '/api/endpoints') return _EjkfCBHg(_XAYmRJyt, _pcmUVJiI);
if (_jVUjjXvF === '/api/ping') return new Response(null, { status: 204 });
return new Response("API not found", { status: 404 });
}
if (_jVUjjXvF === '/_pNwyGbmL') return _DHlAxMKz(_XAYmRJyt, _pcmUVJiI);
if (_jVUjjXvF === '/bing-wallpaper') return _bYBffyCE();
return _gaeifDVl(_XAYmRJyt, _pcmUVJiI, _wDFeOSps);
} catch (err) {
let _fFGNTBrq = err;
return new Response(_fFGNTBrq.toString(), { status: 500 });
}
}
};
const _lqylGUMc = { 'Accept': '_OqnGuMiR/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 _zhqpAETc(_Itpwvulm, _DmpWvsLc) {
const _prlFkQcS = await fetch(_Itpwvulm, { _dacTBTAm: { ..._lqylGUMc, 'Referer': _DmpWvsLc.referer } });
if (_prlFkQcS.ok) return _prlFkQcS._OqnGuMiR();
return null;
}
async function _dyMlxyeJ(_Itpwvulm, _DmpWvsLc) {
const _PwNpVnxS = `https://translate.google.com/translate?sl=auto&tl=en&u=${encodeURIComponent(_Itpwvulm)}`;
const _prlFkQcS = await fetch(_PwNpVnxS, { _dacTBTAm: { ..._lqylGUMc, 'Referer': _DmpWvsLc.referer } });
if (!_prlFkQcS.ok) return null;
const _QOlovGVe = await _prlFkQcS._OqnGuMiR();
const _gCiqvwTG = _QOlovGVe._gCiqvwTG(/<pre[^>]*>([\s\S]*?)<\/pre>/_SCkExIXX);
return _gCiqvwTG && _gCiqvwTG[1] ? _gCiqvwTG[1].replace(/&/g, '&') : null;
}
function _CJDuqwlc(_MednGzZw) {
let _CBehCutd;
try {
_CBehCutd = atob(_MednGzZw.replace(/\s/g, ''));
} catch (_fFGNTBrq) {
_CBehCutd = _MednGzZw;
}
const _sQuROAqK = _CBehCutd.split(/[\s\n\r,]+/).filter(line => line.trim());
const _XTcRmOik = new Set();
const _eTinpTXO = /@([^?#]+?):(\d+)/;
for (const _GypyUxzL of _sQuROAqK) {
let _ReHkiLyF = '';
let _MiTxBoca = '';
try {
if (_GypyUxzL.startsWith('vmess://')) {
const _PjTBWxVc = atob(_GypyUxzL.substring(8));
const _iMSzqVRJ = JSON.parse(_PjTBWxVc);
_ReHkiLyF = _iMSzqVRJ.add;
_MiTxBoca = _iMSzqVRJ._MiTxBoca;
} else {
const _gCiqvwTG = _GypyUxzL._gCiqvwTG(_eTinpTXO);
if (_gCiqvwTG && _gCiqvwTG[1] && _gCiqvwTG[2]) {
_ReHkiLyF = _gCiqvwTG[1].replace(/[\[\]]/g, '');
_MiTxBoca = _gCiqvwTG[2];
}
}
} catch (_fFGNTBrq) {
console.warn(`Could not parse _GypyUxzL: ${_GypyUxzL}`);
}
if (_ReHkiLyF && _MiTxBoca) {
_XTcRmOik.add(`${_ReHkiLyF}:${_MiTxBoca}`);
}
}
return Array.from(_XTcRmOik);
}
async function _cVcktrMN(_aNNQPTBV) {
try {
const _prlFkQcS = await fetch(_aNNQPTBV, { _dacTBTAm: _lqylGUMc });
if (!_prlFkQcS.ok) {
console.error(`Failed to fetch subscription: ${_prlFkQcS.status}`);
return [];
}
const _MednGzZw = await _prlFkQcS._OqnGuMiR();
return _CJDuqwlc(_MednGzZw);
} catch (error) {
console.error(`Error processing subscription ${_aNNQPTBV}:`, error);
return [];
}
}
async function _XIVVlbzc(_cBakvtgm) {
const _wvfDJqLr = _cBakvtgm.trim();
const _OzOgOQdH = /^(vless|vmess|trojan|ss):\/\//.test(_wvfDJqLr);
const _nSamAiTB = (() => {
if (_wvfDJqLr._TqNejCny < 20 || _wvfDJqLr.startsWith('http')) return false;
const _xjIYVlmq = _wvfDJqLr.replace(/\s/g, '');
if (_xjIYVlmq._TqNejCny % 4 !== 0 && !_xjIYVlmq.includes('=')) return false;
try {
atob(_xjIYVlmq);
return true;
} catch (_fFGNTBrq) {
return false;
}
})();
if (_OzOgOQdH || _nSamAiTB) {
return _CJDuqwlc(_wvfDJqLr).join('\n');
}
const _lWJFINtV = [
'https://ipdb.api.030101.xyz/?_vMIJvJoW=bestcf&_dbILITfP=true',
'https://ipdb.api.030101.xyz/?_vMIJvJoW=bestproxy&_dbILITfP=true'
];
const _HpmaUWXW = /^(https?:\/\/)?([\w.-]+)\.([a-z]{2,})(\/.*)?(sub|clash|v2)/_SCkExIXX.test(_cBakvtgm) || _cBakvtgm.includes('?_LrgxCtCy=');
if (_HpmaUWXW) {
const _FOFNWLZC = await _cVcktrMN(_cBakvtgm);
return _FOFNWLZC.join('\n');
}
let _MednGzZw = '';
if (_lWJFINtV.includes(_cBakvtgm)) {
_MednGzZw = await _zhqpAETc(_cBakvtgm, { referer: _cBakvtgm });
if (!_MednGzZw || _MednGzZw._TqNejCny < 8) {
_MednGzZw = await _dyMlxyeJ(_cBakvtgm, { referer: _cBakvtgm });
}
} else {
try {
const _ZnmVyEWA = await fetch(_cBakvtgm, { _dacTBTAm: { 'User-Agent': 'Cloudflare-Worker' } });
if (_ZnmVyEWA.ok) {
_MednGzZw = await _ZnmVyEWA._OqnGuMiR();
} else {
console.warn(`Failed to fetch URL ${_cBakvtgm}: ${_ZnmVyEWA.status}`);
}
} catch (_fFGNTBrq) {
console.error(`Error fetching URL ${_cBakvtgm}:`, _fFGNTBrq);
}
}
const _giwSuKqd = _CJDuqwlc(_MednGzZw);
if (_giwSuKqd._TqNejCny > 0) {
return _giwSuKqd.join('\n');
}
return _MednGzZw || '';
}
async function _fGebmFeY(_XAYmRJyt, _iMSzqVRJ) {
if (!_iMSzqVRJ.streamer._VcnCZwrg) {
return new Response('远程流功能未开启', { status: 403 });
}
const _Itpwvulm = new URL(_XAYmRJyt._Itpwvulm);
const _vbDKemWf = _Itpwvulm.pathname.substring(1).replace(':/', '://');
try {
const _UApifUmQ = new URL(_vbDKemWf);
const _OAwUzHNf = ['github.com', 'objects.githubusercontent.com', 'cdn.jsdelivr.net'];
if (!_OAwUzHNf.some(domain => _UApifUmQ._ReHkiLyF.endsWith(domain))) {
return new Response('不支持的远程流域名', { status: 400 });
}
const _NktZwPzb = new Headers(_XAYmRJyt._dacTBTAm);
_NktZwPzb._pkbekVLk('Host', _UApifUmQ._ReHkiLyF);
_NktZwPzb._pkbekVLk('User-Agent', 'CF-Worker-Streamer/1.0');
const _EZGfgqoF = await fetch(_UApifUmQ.toString(), {
method: _XAYmRJyt.method,
_dacTBTAm: _NktZwPzb,
_QOlovGVe: _XAYmRJyt._QOlovGVe,
});
const _gDBLbVDV = new Headers(_EZGfgqoF._dacTBTAm);
_gDBLbVDV._pkbekVLk('Access-Control-Allow-Origin', '*');
_gDBLbVDV._pkbekVLk('Access-Control-Allow-Methods', 'GET, HEAD, POST, PUT, DELETE, OPTIONS');
_gDBLbVDV._pkbekVLk('Access-Control-Allow-Headers', '*');
_gDBLbVDV._pkbekVLk('Cache-Control', 'public, max-age=86400');
_gDBLbVDV._pkbekVLk('X-Streamer-Source', 'CF-Worker');
_gDBLbVDV.delete('_MednGzZw-security-policy');
_gDBLbVDV.delete('x-_MednGzZw-security-policy');
_gDBLbVDV.delete('x-webkit-csp');
return new Response(_EZGfgqoF._QOlovGVe, {
status: _EZGfgqoF.status,
statusText: _EZGfgqoF.statusText,
_dacTBTAm: _gDBLbVDV,
});
} catch (_fFGNTBrq) {
return new Response('无效的目标URL', { status: 400 });
}
}
async function _siXOoMwQ(_XAYmRJyt, _pcmUVJiI, _iMSzqVRJ) {
try {
const _eMjXuxOK = _iMSzqVRJ || await _YtpkJMmM(_pcmUVJiI);
const _VaYUPeDz = (_eMjXuxOK.itemLink._sWpGwtbt && _eMjXuxOK.itemLink._sWpGwtbt[0]) || {};
const _BCnAKGIX = _VaYUPeDz['_LrgxCtCy'] || _LqisdBoA(_MfhvDRoe);
if (!_OuzjnUBo(_BCnAKGIX)) {
throw new Error("Configured user _ZpbVqdrt is not valid.");
}
const _zmTNPzFq = _eMjXuxOK.dataFeeds.universalFallbackAddress;
let _yCYKIKCL = {};
const _roPHPOve = _LqisdBoA(_udRSwjAU[0] || "");
if (_zmTNPzFq) {
const [_OrZcOZRl, _MiTxBoca = '443'] = _zmTNPzFq.split(':');
_yCYKIKCL = { _OrZcOZRl, _MiTxBoca };
} else {
const [_OrZcOZRl, _MiTxBoca = '443'] = _roPHPOve.split(':');
_yCYKIKCL = { _OrZcOZRl, _MiTxBoca };
}
const _Itpwvulm = new URL(_XAYmRJyt._Itpwvulm);
const _jVUjjXvF = _Itpwvulm.pathname;
let _DTlJdDGh = '';
const _XDTJWiRB = _Itpwvulm.searchParams.get('remote');
if (_XDTJWiRB) {
_DTlJdDGh = atob(_XDTJWiRB);
} else if (_jVUjjXvF.startsWith('/endpoint=')) {
_DTlJdDGh = _jVUjjXvF.substring(10);
} else if (_jVUjjXvF._TqNejCny > 1 && _jVUjjXvF.substring(1).includes('.')) {
_DTlJdDGh = _jVUjjXvF.substring(1);
}
if (_DTlJdDGh) {
const [_OrZcOZRl, _MiTxBoca = '443'] = _DTlJdDGh.split(':');
_yCYKIKCL = { _OrZcOZRl, _MiTxBoca };
}
return await _JDIeSgdb(_XAYmRJyt, _BCnAKGIX, _yCYKIKCL);
} catch (err) {
return new Response(err.toString(), { status: 500 });
}
}
async function _JDIeSgdb(_XAYmRJyt, _ZpbVqdrt, _yCYKIKCL) {
const _wrvZyfXl = new WebSocketPair();
const [clientEnd, _nHMXPHzF] = Object.values(_wrvZyfXl);
_nHMXPHzF.accept();
let _PQMfusDO = { _QoLZFqnK: null };
const _fxJFoGYz = _XAYmRJyt._dacTBTAm.get("sec-websocket-protocol") || "";
const _oERSPoOc = _FgrwPUAt(_nHMXPHzF, _fxJFoGYz);
_oERSPoOc.pipeTo(new WritableStream({
async write(chunk) {
if (_PQMfusDO._QoLZFqnK) {
const _cOyeeWTf = _PQMfusDO._QoLZFqnK.writable.getWriter();
await _cOyeeWTf.write(chunk);
_cOyeeWTf.releaseLock();
return;
}
const { error, details } = await _NUGSMEjx(chunk, _ZpbVqdrt);
if (error) {
throw new Error(details);
}
const _fRAROAiz = new Uint8Array([details._nXjGBbtU[0], 0]);
const _yEWidmEs = chunk.slice(details.payloadIndex);
await _nqnNBPAx(_PQMfusDO, details._tlaTtCrn, details._JuKgxFFm, _yEWidmEs, _nHMXPHzF, _fRAROAiz, _yCYKIKCL);
}
})).catch((err) => {
console.error("Stream processing error:", err);
_gDmTrGRo(_nHMXPHzF);
});
return new Response(null, { status: 101, webSocket: clientEnd });
}
async function _nqnNBPAx(_PQMfusDO, _tlaTtCrn, _JuKgxFFm, _KNeDHGRe, _bKnyRMft, _fRAROAiz, _qKOSVWul) {
const _KuEHzlVW = async (_OrZcOZRl, _MiTxBoca) => {
let _hJXPfVCs = _OrZcOZRl;
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(_OrZcOZRl)) {
_hJXPfVCs = `${atob('d3d3Lg==')}${_OrZcOZRl}${atob('LnNzbGlwLmlv')}`;
}
const _QoLZFqnK = connect({ _ReHkiLyF: _hJXPfVCs, _MiTxBoca });
_PQMfusDO._QoLZFqnK = _QoLZFqnK;
const _cOyeeWTf = _QoLZFqnK.writable.getWriter();
await _cOyeeWTf.write(_KNeDHGRe);
_cOyeeWTf.releaseLock();
return _QoLZFqnK;
};
const _wiMUkXkj = async () => {
if (!_qKOSVWul._OrZcOZRl) return;
console.log(`Direct connection failed, falling back to gateway: ${_qKOSVWul._OrZcOZRl}`);
const _nCDeBkRI = await _KuEHzlVW(_qKOSVWul._OrZcOZRl, parseInt(_qKOSVWul._MiTxBoca, 10));
_nCDeBkRI.closed.catch(() => {}).finally(() => _gDmTrGRo(_bKnyRMft));
_lcfLAucg(_nCDeBkRI, _bKnyRMft, _fRAROAiz, null);
};
try {
const _BmypVMWD = await _KuEHzlVW(_tlaTtCrn, _JuKgxFFm);
_lcfLAucg(_BmypVMWD, _bKnyRMft, _fRAROAiz, _wiMUkXkj);
} catch (err) {
console.error("Primary connection failed:", err);
await _wiMUkXkj();
}
}
function _FgrwPUAt(_nHMXPHzF, _fxJFoGYz) {
let _OSXCCMDg = false;
return new ReadableStream({
start(_fkQrKiUW) {
_nHMXPHzF.addEventListener("_gghNrVUR", (event) => { if (_OSXCCMDg) return; _fkQrKiUW.enqueue(event._QdVjVIxA); });
_nHMXPHzF.addEventListener("close", () => { _gDmTrGRo(_nHMXPHzF); if (_OSXCCMDg) return; _fkQrKiUW.close(); });
_nHMXPHzF.addEventListener("error", (err) => _fkQrKiUW.error(err));
if (_fxJFoGYz) {
try {
const _zjrylOCv = atob(_fxJFoGYz.replace(/-/g, "+").replace(/_/g, "/"));
_fkQrKiUW.enqueue(Uint8Array.from(_zjrylOCv, c => c.charCodeAt(0))._ibfpSKAq);
} catch (_fFGNTBrq) { console.error("Failed to decode early _QdVjVIxA:", _fFGNTBrq); }
}
},
cancel() { _OSXCCMDg = true; _gDmTrGRo(_nHMXPHzF); },
});
}
async function _NUGSMEjx(_ibfpSKAq, _ZpbVqdrt) {
if (_ibfpSKAq.byteLength < 24) return { error: true, details: "Invalid packet size" };
const _nXjGBbtU = new Uint8Array(_ibfpSKAq.slice(0, 1));
const _OEQnIgeU = _cLOsdRxF(new Uint8Array(_ibfpSKAq.slice(1, 17)));
if (_OEQnIgeU !== _ZpbVqdrt) return { error: true, details: "Invalid _ZpbVqdrt" };
const _slcUOYNO = new Uint8Array(_ibfpSKAq.slice(17, 18))[0];
const _VUBXzHri = new Uint8Array(_ibfpSKAq.slice(18 + _slcUOYNO, 19 + _slcUOYNO))[0];
if (_VUBXzHri !== 1) return { error: true, details: `Unsupported _VUBXzHri: ${_VUBXzHri}` };
const _yMiGPtDn = 19 + _slcUOYNO;
const _JuKgxFFm = new DataView(_ibfpSKAq.slice(_yMiGPtDn, _yMiGPtDn + 2)).getUint16(0);
let _qUCuSawy = _yMiGPtDn + 2;
const _lVloQOoP = new Uint8Array(_ibfpSKAq.slice(_qUCuSawy, _qUCuSawy + 1))[0];
let _amEDUQAt = 0;
let _RRBeDMvl = _qUCuSawy + 1;
let _tlaTtCrn = "";
switch (_lVloQOoP) {
case 1: _amEDUQAt = 4; _tlaTtCrn = new Uint8Array(_ibfpSKAq.slice(_RRBeDMvl, _RRBeDMvl + _amEDUQAt)).join("."); break;
case 2: _amEDUQAt = new Uint8Array(_ibfpSKAq.slice(_RRBeDMvl, _RRBeDMvl + 1))[0]; _RRBeDMvl++; _tlaTtCrn = new TextDecoder().decode(_ibfpSKAq.slice(_RRBeDMvl, _RRBeDMvl + _amEDUQAt)); break;
case 3: _amEDUQAt = 16; const _PEnRIHQL = new DataView(_ibfpSKAq.slice(_RRBeDMvl, _RRBeDMvl + _amEDUQAt)); const _svjjMoOc = []; for (let _SCkExIXX = 0; _SCkExIXX < 8; _SCkExIXX++) _svjjMoOc.push(_PEnRIHQL.getUint16(_SCkExIXX * 2).toString(16)); _tlaTtCrn = _svjjMoOc.join(":"); break;
default: return { error: true, details: `Invalid _MnInJjgo _vMIJvJoW: ${_lVloQOoP}` };
}
if (!_tlaTtCrn) return { error: true, details: "Target _OrZcOZRl is empty" };
return { error: false, details: { _tlaTtCrn, _JuKgxFFm, _nXjGBbtU, payloadIndex: _RRBeDMvl + _amEDUQAt } };
}
async function _lcfLAucg(_QoLZFqnK, _bKnyRMft, _jDpQEjYm, _BMSmCadU) {
let _tEDhLGFF = _jDpQEjYm;
let _ieHOEmKO = false;
let _zjISVeWW = _QoLZFqnK._oERSPoOc.pipeTo(new WritableStream({
write(chunk) {
_ieHOEmKO = true;
if (_bKnyRMft.readyState !== 1) throw new Error("Channel is not open");
if (_tEDhLGFF) {
const _KccMWDhM = new Uint8Array(_tEDhLGFF.byteLength + chunk.byteLength);
_KccMWDhM._pkbekVLk(new Uint8Array(_tEDhLGFF));
_KccMWDhM._pkbekVLk(new Uint8Array(chunk), _tEDhLGFF.byteLength);
_bKnyRMft.send(_KccMWDhM._ibfpSKAq);
_tEDhLGFF = null;
} else {
_bKnyRMft.send(chunk);
}
},
close() {}
}), { signal: new AbortController().signal }).catch((err) => {
console.error("Pipe to _bKnyRMft error:", err._gghNrVUR);
});
await _zjISVeWW;
if (!_ieHOEmKO && _BMSmCadU) {
_BMSmCadU();
}
}
function _gDmTrGRo(_bKnyRMft) {
try { if (_bKnyRMft.readyState === 1 || _bKnyRMft.readyState === 2) _bKnyRMft.close(); } catch (_fFGNTBrq) {}
}
const _bcYGXHCU = Array.from({ _TqNejCny: 256 }, (_, _SCkExIXX) => (_SCkExIXX + 256).toString(16).slice(1));
function _cLOsdRxF(_LjmWZDBr, offset = 0) {
return (
_bcYGXHCU[_LjmWZDBr[offset]] + _bcYGXHCU[_LjmWZDBr[offset + 1]] + _bcYGXHCU[_LjmWZDBr[offset + 2]] + _bcYGXHCU[_LjmWZDBr[offset + 3]] + "-" +
_bcYGXHCU[_LjmWZDBr[offset + 4]] + _bcYGXHCU[_LjmWZDBr[offset + 5]] + "-" +
_bcYGXHCU[_LjmWZDBr[offset + 6]] + _bcYGXHCU[_LjmWZDBr[offset + 7]] + "-" +
_bcYGXHCU[_LjmWZDBr[offset + 8]] + _bcYGXHCU[_LjmWZDBr[offset + 9]] + "-" +
_bcYGXHCU[_LjmWZDBr[offset + 10]] + _bcYGXHCU[_LjmWZDBr[offset + 11]] +
_bcYGXHCU[_LjmWZDBr[offset + 12]] + _bcYGXHCU[_LjmWZDBr[offset + 13]] +
_bcYGXHCU[_LjmWZDBr[offset + 14]] + _bcYGXHCU[_LjmWZDBr[offset + 15]]
).toLowerCase();
}
let _xWoRGsRH = { "N/A":"未知" };
async function _TgiVzMRV(_Itpwvulm, _TtfBoenQ, _BMSmCadU) {
try {
const _prlFkQcS = await fetch(_Itpwvulm, {
_dacTBTAm: { 'User-Agent': 'Cloudflare-Worker-IP-Scanner' }
});
if (!_prlFkQcS.ok) {
console.error(`获取 ${_Itpwvulm} 失败: HTTP ${_prlFkQcS.status}`);
return _BMSmCadU;
}
const _OqnGuMiR = await _prlFkQcS._OqnGuMiR();
return _TtfBoenQ(_OqnGuMiR);
} catch (error) {
console.error(`获取或解析 ${_Itpwvulm} 时发生网络错误: ${error._gghNrVUR}`);
return _BMSmCadU;
}
}
function _jCwZWOMm(_OqnGuMiR) {
if (!_OqnGuMiR) return [];
const _XDGNQQVg = /^(?:\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\/\d{1,2}|[0-9a-fA-F:]+\/\d{1,3})$/;
const _PXhSDewX = _OqnGuMiR.split(/[\s,;#|]+/);
const _VxmktAZo = [];
for (const _GMNGGYDS of _PXhSDewX) {
const _NtRdlsqx = _GMNGGYDS.trim();
if (!_NtRdlsqx) continue;
const _pSpOVLAi = _NtRdlsqx.lastIndexOf(':');
let _nDfBcrSQ = _NtRdlsqx;
if(_pSpOVLAi > _NtRdlsqx.lastIndexOf(']')) {
const _djWuVmSa = _NtRdlsqx.substring(_pSpOVLAi + 1);
if(!isNaN(_djWuVmSa) && _djWuVmSa._TqNejCny > 0) {
_nDfBcrSQ = _NtRdlsqx.substring(0, _pSpOVLAi);
}
}
if (_QspCXlxm.isValid(_nDfBcrSQ.replace(/[\[\]]/g, '')) || _XDGNQQVg.test(_NtRdlsqx)) {
_VxmktAZo.push(_NtRdlsqx);
}
}
return _VxmktAZo;
}
function _yRXAMFiF(_OqnGuMiR) {
if (!_OqnGuMiR) return [];
return _OqnGuMiR.split(/\s+/).filter(d => d.trim() !== '');
}
function _fFzmZuzG(_OqnGuMiR) {
if (!_OqnGuMiR) return { "N/A": "未知" };
try {
return JSON.parse(`{${_OqnGuMiR}}`);
} catch (_fFGNTBrq) {
console.error("解析 _xWoRGsRH 失败:", _fFGNTBrq);
return { "N/A": "未知" };
}
}
const _QspCXlxm = {
isValid: (_pNwyGbmL) => _QspCXlxm.isIPv4(_pNwyGbmL) || _QspCXlxm.isIPv6(_pNwyGbmL),
isIPv4: (_pNwyGbmL) => {
if (typeof _pNwyGbmL !== 'string') return false;
const _svjjMoOc = _pNwyGbmL.split('.');
if (_svjjMoOc._TqNejCny !== 4) return false;
return _svjjMoOc.every(_XPEHYjGI => {
const _sYOSnYri = parseInt(_XPEHYjGI, 10);
return !isNaN(_sYOSnYri) && _sYOSnYri >= 0 && _sYOSnYri <= 255 && String(_sYOSnYri) === _XPEHYjGI;
});
},
isIPv6: (_pNwyGbmL) => {
if (typeof _pNwyGbmL !== '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]))$/_SCkExIXX.test(_pNwyGbmL);
},
toLong4: (_pNwyGbmL) => _pNwyGbmL.split('.').reduce((acc, octet, _SCkExIXX) => acc + (parseInt(octet) << (8*(3-_SCkExIXX))),0)>>>0,
fromLong4: (long) => [(long>>>24)&0xFF,(long>>>16)&0xFF,(long>>>8)&0xFF,long&0xFF].join('.'),
toBigInt6: (_pNwyGbmL) => {
try {
const _MBBBUoDt = _pNwyGbmL.split('/')[0];
const _svjjMoOc = _MBBBUoDt.split('::');
if (_svjjMoOc._TqNejCny > 2) return 0n;
let _xtnQHKgp = [];
if (_svjjMoOc[0]) {
_xtnQHKgp = _svjjMoOc[0].split(':');
}
let _eveQITCI = [];
if (_svjjMoOc._TqNejCny > 1 && _svjjMoOc[1]) {
_eveQITCI = _svjjMoOc[1].split(':');
}
if (_xtnQHKgp._TqNejCny + _eveQITCI._TqNejCny > 8) return 0n;
const _QhgXATWi = 8 - (_xtnQHKgp._TqNejCny + _eveQITCI._TqNejCny);
const _fnPfTVDu = [
..._xtnQHKgp,
...Array(_QhgXATWi).fill('0'),
..._eveQITCI
].map(_XPEHYjGI => _XPEHYjGI || '0');
while(_fnPfTVDu._TqNejCny < 8) {
_fnPfTVDu.push('0');
}
let _imOPzGmt = 0n;
for (const _XPEHYjGI of _fnPfTVDu) {
if (_XPEHYjGI._TqNejCny > 4) return 0n;
const _TEZLvhSj = BigInt('0x' + _XPEHYjGI);
_imOPzGmt = (_imOPzGmt << 16n) | _TEZLvhSj;
}
return _imOPzGmt;
} catch(_fFGNTBrq) {
return 0n;
}
},
fromBigInt6: (_imOPzGmt) => {
if (typeof _imOPzGmt !== '_imOPzGmt' || _imOPzGmt < 0n) return null;
const _svjjMoOc = [];
for (let _SCkExIXX = 0; _SCkExIXX < 8; _SCkExIXX++) {
_svjjMoOc.unshift((_imOPzGmt & 0xFFFFn).toString(16));
_imOPzGmt >>= 16n;
}
let _GrmmggtE = { start: -1, _UjPsTbbp: 0 };
let _tzNCqGzH = { start: -1, _UjPsTbbp: 0 };
for (let _SCkExIXX = 0; _SCkExIXX < 8; _SCkExIXX++) {
if (_svjjMoOc[_SCkExIXX] === '0') {
if (_tzNCqGzH.start === -1) _tzNCqGzH.start = _SCkExIXX;
_tzNCqGzH._UjPsTbbp++;
} else {
if (_tzNCqGzH._UjPsTbbp > _GrmmggtE._UjPsTbbp) _GrmmggtE = { ..._tzNCqGzH };
_tzNCqGzH = { start: -1, _UjPsTbbp: 0 };
}
}
if (_tzNCqGzH._UjPsTbbp > _GrmmggtE._UjPsTbbp) _GrmmggtE = { ..._tzNCqGzH };
if (_GrmmggtE._UjPsTbbp > 1) {
_svjjMoOc.splice(_GrmmggtE.start, _GrmmggtE._UjPsTbbp, '');
if (_GrmmggtE.start === 0) _svjjMoOc.unshift('');
if (_GrmmggtE.start + _GrmmggtE._UjPsTbbp === 8) _svjjMoOc.push('');
}
return _svjjMoOc.join(':');
},
cidrToRange: (cidr, _mwlnmfaQ = 1) => {
try {
const [range, bitsStr] = cidr.split('/');
const _TSLgqDKJ = parseInt(bitsStr, 10);
const _FOFNWLZC = new Set();
if (_QspCXlxm.isIPv4(range)) {
if (isNaN(_TSLgqDKJ) || _TSLgqDKJ < 8 || _TSLgqDKJ > 32) return [];
if (_TSLgqDKJ === 32) return [range];
const _eUKxbhLB = _QspCXlxm.toLong4(range);
const _fVAknjOK = (0xFFFFFFFF << (32 - _TSLgqDKJ)) >>> 0;
const _hTcRxten = _eUKxbhLB & _fVAknjOK;
const _aTlQHICg = 1 << (32 - _TSLgqDKJ);
if (_aTlQHICg <= 2) return [];
const _soUVVGyu = Math.min(_mwlnmfaQ, _aTlQHICg - 2);
let _PkzufcpN = 0;
while (_FOFNWLZC.size < _soUVVGyu && _PkzufcpN < _soUVVGyu * 5) {
const _AnPyexXC = Math.floor(Math.random() * (_aTlQHICg - 2)) + 1;
_FOFNWLZC.add(_QspCXlxm.fromLong4((_hTcRxten + _AnPyexXC) >>> 0));
_PkzufcpN++;
}
return Array.from(_FOFNWLZC);
} else if (_QspCXlxm.isIPv6(range)) {
if (isNaN(_TSLgqDKJ) || _TSLgqDKJ < 16 || _TSLgqDKJ > 128) return [];
if (_TSLgqDKJ === 128) return [range];
const _YbenIuJe = _QspCXlxm.toBigInt6(range);
const _fVAknjOK = (2n ** BigInt(128 - _TSLgqDKJ) - 1n);
const _hTcRxten = _YbenIuJe & ~_fVAknjOK;
const _SmgjdRgf = 2n ** BigInt(128 - _TSLgqDKJ);
if (_SmgjdRgf <= 2n) return [];
let _PkzufcpN = 0;
while (_FOFNWLZC.size < _mwlnmfaQ && _PkzufcpN < _mwlnmfaQ * 5) {
const _pBOCyJgE = new Uint8Array(16);
(typeof crypto !== 'undefined' ? crypto : self.crypto).getRandomValues(_pBOCyJgE);
let _UMobnOad = 0n;
for (const _pyNgIHfJ of _pBOCyJgE) {
_UMobnOad = (_UMobnOad << 8n) | BigInt(_pyNgIHfJ);
}
const _AnPyexXC = _UMobnOad % (_SmgjdRgf - 2n) + 1n;
_FOFNWLZC.add(_QspCXlxm.fromBigInt6(_hTcRxten + _AnPyexXC));
_PkzufcpN++;
}
return Array.from(_FOFNWLZC);
}
return [];
} catch(_fFGNTBrq) {
console.error(`CIDR to range failed for ${cidr}:`, _fFGNTBrq);
return [];
}
}
};
function _AkmSgovH(_CpepWZFn, _ESrTVDNJ) {
const _mbVJudfw = {};
const _vlovTvYl = Object._vlovTvYl(_ESrTVDNJ);
const _svjjMoOc = _vlovTvYl.map(_kxDvchmY => {
const _gBfApJLO = _CpepWZFn * (_ESrTVDNJ[_kxDvchmY] / 100);
return { _kxDvchmY, _mwlnmfaQ: Math.floor(_gBfApJLO), remainder: _gBfApJLO - Math.floor(_gBfApJLO) };
});
let _DqMbBeww = _svjjMoOc.reduce((acc, _XPEHYjGI) => acc + _XPEHYjGI._mwlnmfaQ, 0);
_svjjMoOc.sort((a, b) => b.remainder - a.remainder);
let _HHMciwDY = _CpepWZFn - _DqMbBeww;
for (let _SCkExIXX = 0; _SCkExIXX < _HHMciwDY; _SCkExIXX++) {
_svjjMoOc[_SCkExIXX % _svjjMoOc._TqNejCny]._mwlnmfaQ++;
}
for (const _XPEHYjGI of _svjjMoOc) {
_mbVJudfw[_XPEHYjGI._kxDvchmY] = _XPEHYjGI._mwlnmfaQ;
}
return _mbVJudfw;
}
async function _QqNWQsFc(_pcmUVJiI) {
const _gJJDxvPF = _pcmUVJiI.DB.prepare("SELECT _TEZLvhSj FROM kv_data WHERE _kxDvchmY = ?").bind(_rpPWXEvT);
const { _zmXBzLso } = await _gJJDxvPF.all();
return _zmXBzLso._TqNejCny > 0 ? _zmXBzLso[0]._TEZLvhSj : null;
}
async function _FQAAtiQz(_pcmUVJiI, _FppnICwG) {
const _gJJDxvPF = _pcmUVJiI.DB.prepare(
"INSERT INTO kv_data (_kxDvchmY, _TEZLvhSj) VALUES (?, ?) ON CONFLICT(_kxDvchmY) DO UPDATE SET _TEZLvhSj = excluded._TEZLvhSj"
);
await _gJJDxvPF.bind(_rpPWXEvT, _FppnICwG).run();
}
async function _OjfoZlcw(_XAYmRJyt, _pcmUVJiI) {
const { _FppnICwG } = await _XAYmRJyt.json();
const _eaYhhunE = await _QqNWQsFc(_pcmUVJiI);
if (_eaYhhunE === _FppnICwG) {
return _lWbFuvJT({ success: true });
}
return _lWbFuvJT({ success: false, _gghNrVUR: '密码错误' }, 401);
}
async function _SEqsoyfe(_XAYmRJyt, _pcmUVJiI) {
const _ytYjKpZq = await _YtpkJMmM(_pcmUVJiI);
if (!_ytYjKpZq.visitorPassword || !_ytYjKpZq.visitorPassword._VcnCZwrg) {
return _lWbFuvJT({ success: true });
}
try {
const { _FppnICwG } = await _XAYmRJyt.json();
const _iPCdUrTh = _ytYjKpZq.visitorPassword._FppnICwG;
if (_iPCdUrTh && _FppnICwG === _iPCdUrTh) {
return _lWbFuvJT({ success: true });
}
return _lWbFuvJT({ success: false, _gghNrVUR: '访客密码错误' }, 401);
} catch (_fFGNTBrq) {
return _lWbFuvJT({ success: false, _gghNrVUR: '无效请求' }, 400);
}
}
async function _NxxbsjVP(_XAYmRJyt, _pcmUVJiI) {
const _CUARqkaF = await _QqNWQsFc(_pcmUVJiI);
if (_CUARqkaF) {
return _lWbFuvJT({ success: false, _gghNrVUR: "密码已设置,无法重复初始化。" }, 403);
}
const { _FppnICwG } = await _XAYmRJyt.json();
if (!_FppnICwG || _FppnICwG._TqNejCny < 6) {
return _lWbFuvJT({ success: false, _gghNrVUR: "密码长度不能少于6位。" }, 400);
}
await _FQAAtiQz(_pcmUVJiI, _FppnICwG);
return _lWbFuvJT({ success: true, _gghNrVUR: "初始密码设置成功!请刷新页面并登录。" });
}
async function _ncIZUFYB(_XAYmRJyt, _pcmUVJiI) {
const { _DzQdKrTq, _NkomdLAP } = await _XAYmRJyt.json();
const _eaYhhunE = await _QqNWQsFc(_pcmUVJiI);
if (_eaYhhunE !== _DzQdKrTq) {
return _lWbFuvJT({ success: false, _gghNrVUR: "旧密码错误。" }, 403);
}
if (!_NkomdLAP || _NkomdLAP._TqNejCny < 6) {
return _lWbFuvJT({ success: false, _gghNrVUR: "新密码长度不能少于6位。" }, 400);
}
await _FQAAtiQz(_pcmUVJiI, _NkomdLAP);
return _lWbFuvJT({ success: true, _gghNrVUR: "密码修改成功!" });
}
function _BmyXcbdN() {
return {
theme: 'theme-aurora-glass',
primaryColor: '#00A0FF',
particleColor: '#FFFFFF',
useResolvedDomains: false,
resolvedDomains: '',
sampleSize: 150,
topN: 10,
rttRandomMin: 79,
rttRandomMax: 179,
_XZVTBcuE: '',
api: {
_VcnCZwrg: true,
_gghNrVUR: '维护中...',
},
ispFilter: { _VcnCZwrg: true },
geoLocation: {
retries: 1,
filterUnknown: false,
},
streamer: {
_VcnCZwrg: true
},
websocketStreamer: {
_VcnCZwrg: true,
_Itpwvulm: 'https://snippets.neib.cn'
},
cloudStorage: {
_VcnCZwrg: true
},
visitorPassword: {
_VcnCZwrg: false,
_FppnICwG: '',
},
customSubPath: {
_VcnCZwrg: false,
_jVUjjXvF: 'latest',
},
subscriptionId: {
_TqNejCny: 8,
_cbFSYayC: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'
},
itemLink: {
_VcnCZwrg: true,
template: 'vless://{_LrgxCtCy}@{_pNwyGbmL}:{_MiTxBoca}?encryption=none&security=tls&sni={_OrZcOZRl}&fp=random&_vMIJvJoW=ws&_OrZcOZRl={_OrZcOZRl}&_jVUjjXvF={_jVUjjXvF}#{_WNHEJCja}',
selectionMode: 'first',
_sWpGwtbt: [
{ _WNHEJCja: '默认配置', _OrZcOZRl: '', '_LrgxCtCy': '3b4d4cd8-cb92-4421-bf86-fb51570fc038', _jVUjjXvF: '/?ed=2560' }
],
_NRAnoYCM: [],
},
dataFeeds: {
universalFallbackAddress: '',
},
announcement: {
popup: {
_VcnCZwrg: false,
_OqnGuMiR: '',
_XsdNIQwt: 5
},
marquee: {
_VcnCZwrg: false,
_OqnGuMiR: ''
}
},
subscriptionUrl: {
prefixEnabled: false,
prefixUrl: '',
suffixEnabled: false,
suffixUrl: ''
},
fineGrained: {
_VcnCZwrg: true,
sources: [
{ _IWpWnrDt: 'CF官方IPV4', _FOFNWLZC: 'https://raw.githubusercontent.com/5yfx/CF_WEB_IP_Worekrs/refs/heads/main/IPV4', _YpTEWiyE: false, _VcnCZwrg: true, _legQKLJs: 20 },
{ _IWpWnrDt: 'CF官方IPV6', _FOFNWLZC: 'https://raw.githubusercontent.com/5yfx/CF_WEB_IP_Worekrs/refs/heads/main/IPV6', _YpTEWiyE: false, _VcnCZwrg: true, _legQKLJs: 20 },
{ _IWpWnrDt: '反代优选0', _FOFNWLZC: 'https://wvs.sosorg.nyc.mn/sub?_LrgxCtCy=adb14576-6588-40da-99fd-b9894cd779b0&encryption=none&security=tls&sni=ss.nzvrn.com&_vMIJvJoW=ws&_OrZcOZRl=ss.nzvrn.com&_jVUjjXvF=%2Fsnippets%3Fip%3DendpointAddress%3Aport%28443%29%26nat64%3D6to4', _YpTEWiyE: false, _VcnCZwrg: true, _legQKLJs: 30 },
{ _IWpWnrDt: '官方优选1', _FOFNWLZC: 'https://ipdb.api.030101.xyz/?_vMIJvJoW=bestcf&_dbILITfP=true', _YpTEWiyE: false, _VcnCZwrg: true, _legQKLJs: 10 },
{ _IWpWnrDt: '反代优选2', _FOFNWLZC: 'https://ipdb.api.030101.xyz/?_vMIJvJoW=bestproxy&_dbILITfP=true', _YpTEWiyE: false, _VcnCZwrg: true, _legQKLJs: 5 },
{ _IWpWnrDt: '官方优选2', _FOFNWLZC: 'https://addressesapi.090227.xyz/_pNwyGbmL.164746.xyz', _YpTEWiyE: false, _VcnCZwrg: true, _legQKLJs: 10 },
{ _IWpWnrDt: '官方优选3', _FOFNWLZC: 'https://cfxr.eu.org/getSub?_OrZcOZRl=snipaste.huggy.qzz.io', _YpTEWiyE: false, _VcnCZwrg: true, _legQKLJs: 5 },
{ _IWpWnrDt: '官方优选4', _FOFNWLZC: 'https://addressesapi.090227.xyz/CloudFlareYes', _YpTEWiyE: false, _VcnCZwrg: true, _legQKLJs: 10 }
]
},
customNodes: {
_VcnCZwrg: 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 _WLkUCyGK(_EhTxmnIb, _WLUKzDDp) {
if (!_EhTxmnIb) return _WLUKzDDp;
const _AWWUVfqK = { ..._WLUKzDDp };
for (const _kxDvchmY in _WLUKzDDp) {
if (_EhTxmnIb.hasOwnProperty(_kxDvchmY)) {
if (typeof _EhTxmnIb[_kxDvchmY] === 'object' && _EhTxmnIb[_kxDvchmY] !== null && !Array.isArray(_EhTxmnIb[_kxDvchmY]) && typeof _WLUKzDDp[_kxDvchmY] === 'object' && _WLUKzDDp[_kxDvchmY] !== null && !Array.isArray(_WLUKzDDp[_kxDvchmY])) {
_AWWUVfqK[_kxDvchmY] = _WLkUCyGK(_EhTxmnIb[_kxDvchmY], _WLUKzDDp[_kxDvchmY]);
} else {
_AWWUVfqK[_kxDvchmY] = _EhTxmnIb[_kxDvchmY];
}
}
}
return _AWWUVfqK;
}
async function _YtpkJMmM(_pcmUVJiI) {
try {
const _gJJDxvPF = _pcmUVJiI.DB.prepare("SELECT _TEZLvhSj FROM kv_data WHERE _kxDvchmY = ?").bind(_DwOOOwHi);
const { _zmXBzLso } = await _gJJDxvPF.all();
const _kNmVLYPf = _zmXBzLso._TqNejCny > 0 ? _zmXBzLso[0]._TEZLvhSj : null;
const _yjXyopKL = _kNmVLYPf ? JSON.parse(_kNmVLYPf) : {};
return _WLkUCyGK(_yjXyopKL, _BmyXcbdN());
} catch (_fFGNTBrq) {
console.error("无法从D1获取或解析全局配置:", _fFGNTBrq);
return _BmyXcbdN();
}
}
async function _staOVlQG(_pcmUVJiI) {
const _iMSzqVRJ = await _YtpkJMmM(_pcmUVJiI);
return _lWbFuvJT(_iMSzqVRJ);
}
async function _qPDThwkz(_XAYmRJyt, _pcmUVJiI, _wDFeOSps) {
try {
const { _iMSzqVRJ, adminPassword } = await _XAYmRJyt.json();
const _eaYhhunE = await _QqNWQsFc(_pcmUVJiI);
if (_eaYhhunE !== adminPassword) {
return _lWbFuvJT({ success: false, _gghNrVUR: "管理员密码错误" }, 403);
}
const _gJJDxvPF = _pcmUVJiI.DB.prepare(
"INSERT INTO kv_data (_kxDvchmY, _TEZLvhSj) VALUES (?, ?) ON CONFLICT(_kxDvchmY) DO UPDATE SET _TEZLvhSj = excluded._TEZLvhSj"
);
const _uYWAqEQM = _gJJDxvPF.bind(_DwOOOwHi, JSON.stringify(_iMSzqVRJ)).run();
_wDFeOSps.waitUntil(_uYWAqEQM);
return _lWbFuvJT({ success: true, _gghNrVUR: "配置已成功保存!" });
} catch (_fFGNTBrq) {
return _lWbFuvJT({ success: false, _gghNrVUR: `保存失败: ${_fFGNTBrq._gghNrVUR}` }, 500);
}
}
async function _bYBffyCE() {
const _HgXePDKx = 'https://www.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1&mkt=zh-CN';
try {
const _AKqQqQMf = await fetch(_HgXePDKx);
const _SNoyDMOM = await _AKqQqQMf.json();
const _VStzTgXy = 'https://www.bing.com' + _SNoyDMOM.images[0]._Itpwvulm;
return fetch(_VStzTgXy);
} catch (_fFGNTBrq) {
return new Response('获取壁纸失败', { status: 502 });
}
}
async function _tdEoVJsk(_pNwyGbmL) {
try {
const _prlFkQcS = await fetch(`http://_pNwyGbmL-api.com/json/${_pNwyGbmL}?fields=status,_dbILITfP,countryCode,_yejixlnG&lang=zh-CN`);
if (_prlFkQcS.ok) {
const _QdVjVIxA = await _prlFkQcS.json();
if (_QdVjVIxA.status === 'success' && (_QdVjVIxA.countryCode || _QdVjVIxA._dbILITfP)) {
let _yejixlnG = _QdVjVIxA._yejixlnG || '未知';
if (_yejixlnG.toLowerCase().includes('cloudflare')) {
_yejixlnG = 'CloudFlare';
}
return {
_IWpWnrDt: _xWoRGsRH[_QdVjVIxA.countryCode] || _QdVjVIxA._dbILITfP || _QdVjVIxA.countryCode,
_yejixlnG: _yejixlnG
};
}
}
} catch (_fFGNTBrq) {}
try {
const _prlFkQcS = await fetch(`https://api._pNwyGbmL.sb/geoip/${_pNwyGbmL}`);
if (_prlFkQcS.ok) {
const _QdVjVIxA = await _prlFkQcS.json();
if (_QdVjVIxA.country_code || _QdVjVIxA._dbILITfP) {
let _yejixlnG = _QdVjVIxA._yejixlnG || '未知';
if (_yejixlnG.toLowerCase().includes('cloudflare')) {
_yejixlnG = 'CloudFlare';
}
return {
_IWpWnrDt: _xWoRGsRH[_QdVjVIxA.country_code] || _QdVjVIxA._dbILITfP || _QdVjVIxA.country_code,
_yejixlnG: _yejixlnG
};
}
}
} catch (_fFGNTBrq) {}
return { _IWpWnrDt: '未知', _yejixlnG: '未知' };
}
async function _xFFeNyUp(_XAYmRJyt, _pcmUVJiI) {
try {
const { _FOFNWLZC } = await _XAYmRJyt.json();
if (!Array.isArray(_FOFNWLZC)) {
return _lWbFuvJT({ error: "输入无效,需要一个IP数组。" }, 400);
}
const _FIjNSCAu = _FOFNWLZC.map(_pNwyGbmL => _tdEoVJsk(_pNwyGbmL).then(_gSySivzM => ({ _pNwyGbmL, ..._gSySivzM })));
const _zmXBzLso = await Promise.all(_FIjNSCAu);
return _lWbFuvJT(_zmXBzLso);
} catch (_fFGNTBrq) {
return _lWbFuvJT({ error: `获取地理位置失败: ${_fFGNTBrq._gghNrVUR}` }, 500);
}
}
async function _yMdRrPvD(_XAYmRJyt, _pcmUVJiI) {
const _iMSzqVRJ = await _YtpkJMmM(_pcmUVJiI);
if (!_iMSzqVRJ.cloudStorage._VcnCZwrg) {
return _lWbFuvJT({ _zmXBzLso: [], generatedBy: null });
}
try {
const _gJJDxvPF = _pcmUVJiI.DB.prepare("SELECT _TEZLvhSj FROM kv_data WHERE _kxDvchmY = ?").bind(_RQqZKxif);
const { _zmXBzLso } = await _gJJDxvPF.all();
const _eABlFBGE = _zmXBzLso._TqNejCny > 0 ? _zmXBzLso[0]._TEZLvhSj : null;
const _EEUnVxOd = _eABlFBGE ? JSON.parse(_eABlFBGE) : null;
return _lWbFuvJT(_EEUnVxOd || { _zmXBzLso: [], generatedBy: null });
} catch (_fFGNTBrq) {
console.error("从D1读取缓存IP失败:", _fFGNTBrq);
return _lWbFuvJT({ _zmXBzLso: [], generatedBy: null });
}
}
async function _dzMNNVTk(_XAYmRJyt, _pcmUVJiI, _wDFeOSps) {
const _iMSzqVRJ = await _YtpkJMmM(_pcmUVJiI);
if (!_iMSzqVRJ.cloudStorage._VcnCZwrg) {
return _lWbFuvJT({ success: true, _gghNrVUR: "云端存储已禁用,不保存结果。" });
}
const _hgmOdKgI = _XAYmRJyt._dacTBTAm.get('CF-Connecting-IP') || "未知IP";
const _dbILITfP = _XAYmRJyt.cf?._dbILITfP || "未知";
const _pnbLFNnc = _XAYmRJyt.cf?._pnbLFNnc || "";
let _DTloodqN = _xWoRGsRH[_dbILITfP] || _dbILITfP;
if (_pnbLFNnc && _pnbLFNnc !== "未知城市" && _pnbLFNnc !== _dbILITfP) _DTloodqN = `${_DTloodqN} ${_xWoRGsRH[_pnbLFNnc] || _pnbLFNnc}`;
const _OSOeRkwo = {
_pNwyGbmL: _ixHIxDwa(_hgmOdKgI),
_IWpWnrDt: _DTloodqN.trim(),
time: _SZzsBlmg()
};
try {
const _btVWJOFE = await _XAYmRJyt.json();
if (!Array.isArray(_btVWJOFE)) return _lWbFuvJT({ error: "无效数据格式" }, 400);
const _PmdhepNf = _btVWJOFE.map(_ZojlTkzt => ({
_pNwyGbmL: String(_ZojlTkzt._pNwyGbmL || ''),
_MiTxBoca: _ZojlTkzt._MiTxBoca ? parseInt(_ZojlTkzt._MiTxBoca, 10) : undefined,
_DwraCHty: parseInt(_ZojlTkzt._DwraCHty, 10),
_IWpWnrDt: typeof _ZojlTkzt._IWpWnrDt === 'string' ? _ZojlTkzt._IWpWnrDt.substring(0, 50) : 'N/A',
_yejixlnG: typeof _ZojlTkzt._yejixlnG === 'string' ? _ZojlTkzt._yejixlnG.substring(0, 100) : 'N/A'
}));
const _bzNwGwtC = {
generatedBy: _OSOeRkwo,
_zmXBzLso: _PmdhepNf
};
const _JXRFIzyS = _pcmUVJiI.DB.prepare(
"INSERT INTO kv_data (_kxDvchmY, _TEZLvhSj) VALUES (?, ?) ON CONFLICT(_kxDvchmY) DO UPDATE SET _TEZLvhSj = excluded._TEZLvhSj"
).bind(_RQqZKxif, JSON.stringify(_bzNwGwtC)).run();
if (_iMSzqVRJ.telegram.bot_token && _iMSzqVRJ.telegram.chat_id) {
const _OFklXSnm = _PmdhepNf.map(r => `${r._pNwyGbmL} ~ ${r._IWpWnrDt}`).join('\n');
const _xLiwtOKB = `优选完成!\n来源: ${_OSOeRkwo._pNwyGbmL} (${_OSOeRkwo._IWpWnrDt})\n时间: ${_OSOeRkwo.time}\n\n结果:\n${_OFklXSnm}`;
const _bJaYTdcY = `https://api.telegram.org/bot${_iMSzqVRJ.telegram.bot_token}/sendMessage?chat_id=${_iMSzqVRJ.telegram.chat_id}&_OqnGuMiR=${encodeURIComponent(_xLiwtOKB)}`;
const _WDGMBxTL = fetch(_bJaYTdcY).catch(_fFGNTBrq => console.error("Telegram结果通知失败:", _fFGNTBrq));
_wDFeOSps.waitUntil(Promise.all([_JXRFIzyS, _WDGMBxTL]));
} else {
_wDFeOSps.waitUntil(_JXRFIzyS);
}
return _lWbFuvJT({ success: true, _gghNrVUR: "结果已保存" });
} catch (_fFGNTBrq) {
return _lWbFuvJT({ error: "D1写入失败", _gghNrVUR: _fFGNTBrq._gghNrVUR }, 500);
}
}
async function _ukeWWgQH(_XAYmRJyt, _pcmUVJiI, _wDFeOSps) {
try {
const _ITafLtEG = await _XAYmRJyt.json();
if (!Array.isArray(_ITafLtEG)) return _lWbFuvJT({ error: "无效数据格式" }, 400);
const _bzNwGwtC = {
_zmXBzLso: _ITafLtEG
};
const _gJJDxvPF = _pcmUVJiI.DB.prepare(
"INSERT INTO kv_data (_kxDvchmY, _TEZLvhSj) VALUES (?, ?) ON CONFLICT(_kxDvchmY) DO UPDATE SET _TEZLvhSj = excluded._TEZLvhSj"
);
const _uYWAqEQM = _gJJDxvPF.bind(_NORZGZYw, JSON.stringify(_bzNwGwtC)).run();
_wDFeOSps.waitUntil(_uYWAqEQM);
return _lWbFuvJT({ success: true });
} catch (_fFGNTBrq) {
return _lWbFuvJT({ error: "D1写入临时缓存失败", _gghNrVUR: _fFGNTBrq._gghNrVUR }, 500);
}
}
function _YLVLiybK(_TqNejCny, _cbFSYayC) {
let _jKqSDpvm = '';
const _XpWcEiqy = _cbFSYayC._TqNejCny;
for (let _SCkExIXX = 0; _SCkExIXX < _TqNejCny; _SCkExIXX++) {
_jKqSDpvm += _cbFSYayC.charAt(Math.floor(Math.random() * _XpWcEiqy));
}
return _jKqSDpvm;
}
async function _vzkCwGaa(_XAYmRJyt, _pcmUVJiI) {
try {
const _btVWJOFE = await _XAYmRJyt.json();
if (!Array.isArray(_btVWJOFE) || _btVWJOFE._TqNejCny === 0) {
return _lWbFuvJT({ error: "无效或空的IP列表" }, 400);
}
const _iMSzqVRJ = await _YtpkJMmM(_pcmUVJiI);
const _vYfiRlus = _iMSzqVRJ.subscriptionId || { _TqNejCny: 8, _cbFSYayC: 'abcdefghijklmnopqrstuvwxyz0123456789' };
let _IkYHtGkZ;
let _jfwfyJJg = false;
let _PkzufcpN = 0;
const _lHlblzVE = 10;
while (!_jfwfyJJg && _PkzufcpN < _lHlblzVE) {
_IkYHtGkZ = _YLVLiybK(_vYfiRlus._TqNejCny, _vYfiRlus._cbFSYayC);
const { _zmXBzLso } = await _pcmUVJiI.DB.prepare("SELECT _RCEiBsls FROM optimized_results WHERE _RCEiBsls = ?").bind(_IkYHtGkZ).all();
if (_zmXBzLso._TqNejCny === 0) {
_jfwfyJJg = true;
}
_PkzufcpN++;
}
if (!_jfwfyJJg) {
return _lWbFuvJT({ error: "无法生成唯一的订阅ID,请稍后重试或调整ID设置。" }, 500);
}
const _jJHilzMD = JSON.stringify({ _FOFNWLZC: _btVWJOFE });
await _pcmUVJiI.DB.prepare(
"INSERT INTO optimized_results (_RCEiBsls, _QdVjVIxA) VALUES (?, ?)"
).bind(_IkYHtGkZ, _jJHilzMD).run();
await _pcmUVJiI.DB.prepare(
"INSERT INTO kv_data (_kxDvchmY, _TEZLvhSj) VALUES (?, ?) ON CONFLICT(_kxDvchmY) DO UPDATE SET _TEZLvhSj = excluded._TEZLvhSj"
).bind(_teMbwtuN, _IkYHtGkZ).run();
return _lWbFuvJT({ success: true, _RCEiBsls: _IkYHtGkZ });
} catch (_fFGNTBrq) {
return _lWbFuvJT({ error: "保存优选结果失败", _gghNrVUR: _fFGNTBrq._gghNrVUR }, 500);
}
}
async function _IdxdnACc(_XAYmRJyt, _pcmUVJiI) {
try {
const _IkYHtGkZ = _XAYmRJyt._nREjHAPt._RCEiBsls;
if (!_IkYHtGkZ) {
return new Response("缺少结果ID", { status: 400 });
}
const _jKqSDpvm = await _pcmUVJiI.DB.prepare("SELECT _QdVjVIxA FROM optimized_results WHERE _RCEiBsls = ?").bind(_IkYHtGkZ).first();
if (!_jKqSDpvm) {
return new Response("未找到对应的优选结果", { status: 404 });
}
const _QdVjVIxA = JSON.parse(_jKqSDpvm._QdVjVIxA);
let _OFklXSnm = _QdVjVIxA._FOFNWLZC;
const _iMSzqVRJ = await _YtpkJMmM(_pcmUVJiI);
if (_iMSzqVRJ.customNodes && _iMSzqVRJ.customNodes._VcnCZwrg && _iMSzqVRJ.customNodes.list) {
const _CBtLSSJq = _iMSzqVRJ.customNodes.list.trim().split(/\s+/).filter(Boolean);
const _BwkZmawm = _CBtLSSJq.map(_GypyUxzL => {
let _MnInJjgo = _GypyUxzL;
let _MiTxBoca = undefined;
let _WNHEJCja = null;
if (_MnInJjgo.includes('@')) {
const _svjjMoOc = _MnInJjgo.split('@');
_WNHEJCja = _svjjMoOc.pop();
_MnInJjgo = _svjjMoOc.join('@');
}
if (_MnInJjgo.includes('#')) {
const _svjjMoOc = _MnInJjgo.split('#');
const _djWuVmSa = _svjjMoOc.pop();
if (!isNaN(_djWuVmSa) && _djWuVmSa.trim() !== '') {
_MiTxBoca = parseInt(_djWuVmSa, 10);
}
_MnInJjgo = _svjjMoOc.join('#');
}
return {
_pNwyGbmL: _MnInJjgo,
_MiTxBoca: _MiTxBoca,
_IWpWnrDt: _WNHEJCja || _MnInJjgo,
_yejixlnG: '自定义'
};
});
_OFklXSnm.unshift(..._BwkZmawm);
}
const { itemLink } = _iMSzqVRJ;
const _RaCUqPKm = new URL(_XAYmRJyt._Itpwvulm)._ReHkiLyF;
let _RCJXuJHn;
if (_iMSzqVRJ.websocketStreamer && _iMSzqVRJ.websocketStreamer._VcnCZwrg) {
if (!itemLink || !itemLink._VcnCZwrg || !itemLink._sWpGwtbt || itemLink._sWpGwtbt._TqNejCny === 0) {
return new Response("节点链接参数未配置或未启用 (反代模式)", { status: 500 });
}
_RCJXuJHn = _OFklXSnm.map((_ZojlTkzt, _zHuYsaTg) => {
let _WNHEJCja;
if (_ZojlTkzt._yejixlnG === '自定义') {
_WNHEJCja = `${_zHuYsaTg + 1} - ${_ZojlTkzt._IWpWnrDt}`;
} else {
_WNHEJCja = `${_zHuYsaTg + 1} - ${_ZojlTkzt._IWpWnrDt || '未知'}`;
if (!_ZojlTkzt._yejixlnG || !_ZojlTkzt._yejixlnG.toLowerCase().includes('cloudflare')) {
_WNHEJCja += '(反代)';
}
}
const _RRjCDadB = _QspCXlxm.isIPv6(_ZojlTkzt._pNwyGbmL) ? `[${_ZojlTkzt._pNwyGbmL}]` : _ZojlTkzt._pNwyGbmL;
const _MiTxBoca = _ZojlTkzt._MiTxBoca || 443;
const _XTXgtwmq = itemLink._sWpGwtbt[0];
const _PAkxfpWQ = _XTXgtwmq._LrgxCtCy || '';
const _LrgxCtCy = (_PAkxfpWQ && _OuzjnUBo(_PAkxfpWQ)) ? _PAkxfpWQ : crypto.randomUUID();
const _jVUjjXvF = '/snippets?_pNwyGbmL=endpointAddress:_MiTxBoca(443)&nat64=6to4';
const _OrZcOZRl = _XTXgtwmq._OrZcOZRl || _RaCUqPKm;
const _nREjHAPt = new URLSearchParams({
security: 'tls',
_vMIJvJoW: 'ws',
_OrZcOZRl: _OrZcOZRl,
sni: _OrZcOZRl,
fp: 'random'
});
return `vless://${_LrgxCtCy}@${_RRjCDadB}:${_MiTxBoca}?${_nREjHAPt.toString()}&_jVUjjXvF=${encodeURIComponent(encodeURIComponent(_jVUjjXvF))}#${encodeURIComponent(_WNHEJCja)}`;
});
} else {
if (!itemLink || !itemLink._VcnCZwrg || !itemLink._sWpGwtbt || itemLink._sWpGwtbt._TqNejCny === 0) {
return new Response("节点链接参数未配置或未启用", { status: 500 });
}
const _XTXgtwmq = itemLink._sWpGwtbt[0];
const { _OrZcOZRl, _LrgxCtCy, _jVUjjXvF } = _XTXgtwmq;
_RCJXuJHn = _OFklXSnm.map((_ZojlTkzt, _zHuYsaTg) => {
let _WNHEJCja;
if (_ZojlTkzt._yejixlnG === '自定义') {
_WNHEJCja = `${_zHuYsaTg + 1} - ${_ZojlTkzt._IWpWnrDt}`;
} else {
_WNHEJCja = `${_zHuYsaTg + 1} - ${_ZojlTkzt._IWpWnrDt || '未知'}`;
if (!_ZojlTkzt._yejixlnG || !_ZojlTkzt._yejixlnG.toLowerCase().includes('cloudflare')) {
_WNHEJCja += '(反代)';
}
}
const _RRjCDadB = _QspCXlxm.isIPv6(_ZojlTkzt._pNwyGbmL) ? `[${_ZojlTkzt._pNwyGbmL}]` : _ZojlTkzt._pNwyGbmL;
const _MiTxBoca = _ZojlTkzt._MiTxBoca || 443;
const _nREjHAPt = new URLSearchParams({
security: 'tls',
_vMIJvJoW: 'ws',
_OrZcOZRl: _OrZcOZRl || _RaCUqPKm,
sni: _OrZcOZRl || _RaCUqPKm,
fp: 'random'
});
return `vless://${_LrgxCtCy}@${_RRjCDadB}:${_MiTxBoca}?${_nREjHAPt.toString()}&_jVUjjXvF=${encodeURIComponent(encodeURIComponent(_jVUjjXvF || ''))}#${encodeURIComponent(_WNHEJCja)}`;
});
}
const _PcpnBrPu = _RCJXuJHn.join('\n');
const _uHzwuCRG = btoa(_PcpnBrPu);
return new Response(_uHzwuCRG, {
_dacTBTAm: { 'Content-Type': '_OqnGuMiR/plain; _cbFSYayC=utf-8' }
});
} catch (_fFGNTBrq) {
return new Response(`生成节点列表失败: ${_fFGNTBrq._gghNrVUR}`, { status: 500 });
}
}
async function _gkVhFGAh(_XAYmRJyt) {
try {
const { _GUkOhTxs, _vMIJvJoW } = await _XAYmRJyt.json();
if (!Array.isArray(_GUkOhTxs)) {
return new Response('Invalid _GUkOhTxs list', { status: 400 });
}
const _nvLqbbjD = _GUkOhTxs.map(domain => {
if (!domain.trim()) return Promise.resolve([]);
const _Itpwvulm = `https://cloudflare-dns.com/dns-query?_WNHEJCja=${encodeURIComponent(domain.trim())}&_vMIJvJoW=${_vMIJvJoW || 'A'}`;
return fetch(_Itpwvulm, { _dacTBTAm: { 'Accept': 'application/dns-json' } })
.then(_prlFkQcS => _prlFkQcS.json())
.then(_QdVjVIxA => (_QdVjVIxA.Answer ? _QdVjVIxA.Answer.map(a => a._QdVjVIxA) : []))
.catch(() => []);
});
const _yGsNcfOh = (await Promise.all(_nvLqbbjD)).flat();
const _FxQqJpUE = [...new Set(_yGsNcfOh)];
if (_FxQqJpUE._TqNejCny === 0) {
return new Response('无法从域名解析出任何IP。', { status: 500 });
}
return new Response(_FxQqJpUE.join('\n'), { _dacTBTAm: { 'Content-Type': '_OqnGuMiR/plain; _cbFSYayC=utf-8' } });
} catch (err) {
return new Response(`域名解析错误: ${err._gghNrVUR}`, { status: 500 });
}
}
async function _fgmRValA(_XAYmRJyt, _pcmUVJiI) {
try {
const { _uZZWNnlm } = await _XAYmRJyt.json();
if (!Array.isArray(_uZZWNnlm)) {
return _lWbFuvJT({ error: "Invalid input, expected an object with a '_uZZWNnlm' array." }, 400);
}
const _rKdYueal = new Set();
const _LEdxTjah = _uZZWNnlm.map(_Itpwvulm =>
_XIVVlbzc(_Itpwvulm)
.then(_OqnGuMiR => {
if (!_OqnGuMiR) return;
const _PXhSDewX = _OqnGuMiR.split(/[\s,;|]+/);
for (const _GMNGGYDS of _PXhSDewX) {
const _NtRdlsqx = _GMNGGYDS.trim();
if (_NtRdlsqx) {
_rKdYueal.add(_NtRdlsqx);
}
}
})
.catch(err => {
console.error(`Error processing URL ${_Itpwvulm}:`, err);
})
);
await Promise.all(_LEdxTjah);
return _lWbFuvJT({ _FOFNWLZC: Array.from(_rKdYueal) });
} catch (_fFGNTBrq) {
return _lWbFuvJT({ error: `Failed to process URLs: ${_fFGNTBrq._gghNrVUR}` }, 500);
}
}
async function _DHlAxMKz(_XAYmRJyt, _pcmUVJiI) {
const _iMSzqVRJ = await _YtpkJMmM(_pcmUVJiI);
if (!_iMSzqVRJ.api._VcnCZwrg) {
return new Response(_iMSzqVRJ.api._gghNrVUR || 'API is disabled.', { status: 503 });
}
try {
const _gJJDxvPF = _pcmUVJiI.DB.prepare("SELECT _TEZLvhSj FROM kv_data WHERE _kxDvchmY = ?").bind(_RQqZKxif);
const { _zmXBzLso: dbResults } = await _gJJDxvPF.all();
const _eABlFBGE = dbResults._TqNejCny > 0 ? dbResults[0]._TEZLvhSj : null;
const _EEUnVxOd = _eABlFBGE ? JSON.parse(_eABlFBGE) : null;
if (!_EEUnVxOd || !_EEUnVxOd._zmXBzLso || _EEUnVxOd._zmXBzLso._TqNejCny === 0) {
return new Response("上次优选结果为空。", {
status: 404,
_dacTBTAm: { 'Content-Type': '_OqnGuMiR/plain; _cbFSYayC=utf-8' },
});
}
const _FOFNWLZC = _EEUnVxOd._zmXBzLso.map(r => r._pNwyGbmL);
return new Response(_FOFNWLZC.join('\n'), {
_dacTBTAm: { 'Content-Type': '_OqnGuMiR/plain; _cbFSYayC=utf-8' },
});
} catch (_fFGNTBrq) {
console.error("API /_pNwyGbmL 处理错误:", _fFGNTBrq);
return new Response(`API处理时出错: ${_fFGNTBrq._gghNrVUR}`, { status: 500 });
}
}
function _yiDEIzMb(_jKqSDpvm, _zHuYsaTg, _iMSzqVRJ, _RaCUqPKm) {
const { itemLink } = _iMSzqVRJ;
if (!itemLink || !itemLink._VcnCZwrg) return null;
const { template, _sWpGwtbt, selectionMode, _NRAnoYCM } = itemLink;
if (!_sWpGwtbt || _sWpGwtbt._TqNejCny === 0) return null;
let _kkkNixir;
if (selectionMode === 'random') {
_kkkNixir = _sWpGwtbt[_zHuYsaTg % _sWpGwtbt._TqNejCny];
} else if (selectionMode === 'first') {
_kkkNixir = _sWpGwtbt[0];
} else {
_kkkNixir = _sWpGwtbt.find(s => s._WNHEJCja === selectionMode) || _sWpGwtbt[0];
}
if (!_kkkNixir) return null;
let _udVZjbDL = template;
const _rPptCyqu = _jKqSDpvm._MiTxBoca || 443;
const _ewfJdPGh = _QspCXlxm.isIPv6(_jKqSDpvm._pNwyGbmL) ? `[${_jKqSDpvm._pNwyGbmL}]` : _jKqSDpvm._pNwyGbmL;
let _WNHEJCja = `${_zHuYsaTg + 1} 、 ${_jKqSDpvm._IWpWnrDt || '未知'}`;
if (!_jKqSDpvm._yejixlnG || !_jKqSDpvm._yejixlnG.toLowerCase().includes('cloudflare')) {
_WNHEJCja += '(反代)';
}
let _OrZcOZRl = _kkkNixir._OrZcOZRl || _RaCUqPKm;
_udVZjbDL = _udVZjbDL.replace(/{_pNwyGbmL}/g, _ewfJdPGh)
.replace(/{_MiTxBoca}/g, _rPptCyqu)
.replace(/{_WNHEJCja}/g, encodeURIComponent(_WNHEJCja))
.replace(/{rank}/g, _zHuYsaTg + 1)
.replace(/{_IWpWnrDt}/g, encodeURIComponent(_jKqSDpvm._IWpWnrDt || '未知'))
.replace(/{_yejixlnG}/g, encodeURIComponent(_jKqSDpvm._yejixlnG || '未知'))
.replace(/{_OrZcOZRl}/g, encodeURIComponent(_OrZcOZRl))
.replace(/{_LrgxCtCy}/g, encodeURIComponent(_kkkNixir['_LrgxCtCy'] || ''))
.replace(/{_jVUjjXvF}/g, encodeURIComponent(encodeURIComponent(_kkkNixir._jVUjjXvF || '')));
if (_NRAnoYCM) {
_NRAnoYCM.forEach(field => {
const _fSgHdmLa = new RegExp('{' + field._WNHEJCja + '}', 'g');
_udVZjbDL = _udVZjbDL.replace(_fSgHdmLa, encodeURIComponent(field._TEZLvhSj));
});
}
return _udVZjbDL;
}
async function _EjkfCBHg(_XAYmRJyt, _pcmUVJiI) {
const _iMSzqVRJ = await _YtpkJMmM(_pcmUVJiI);
if (!_iMSzqVRJ.itemLink._VcnCZwrg) {
return new Response("Item _udVZjbDL feature is disabled.", { status: 503, _dacTBTAm: { 'Content-Type': '_OqnGuMiR/plain; _cbFSYayC=utf-8' } });
}
try {
const _gJJDxvPF = _pcmUVJiI.DB.prepare("SELECT _TEZLvhSj FROM kv_data WHERE _kxDvchmY = ?").bind(_RQqZKxif);
const { _zmXBzLso: dbResults } = await _gJJDxvPF.all();
const _eABlFBGE = dbResults._TqNejCny > 0 ? dbResults[0]._TEZLvhSj : null;
const _EEUnVxOd = _eABlFBGE ? JSON.parse(_eABlFBGE) : null;
if (!_EEUnVxOd || !_EEUnVxOd._zmXBzLso || _EEUnVxOd._zmXBzLso._TqNejCny === 0) {
return new Response("No optimized IPs available to generate endpoints.", {
status: 404,
_dacTBTAm: { 'Content-Type': '_OqnGuMiR/plain; _cbFSYayC=utf-8' },
});
}
const _RaCUqPKm = new URL(_XAYmRJyt._Itpwvulm)._ReHkiLyF;
const _oOicwTwn = _EEUnVxOd._zmXBzLso.map((_jKqSDpvm, _zHuYsaTg) => {
return _yiDEIzMb(_jKqSDpvm, _zHuYsaTg, _iMSzqVRJ, _RaCUqPKm);
}).filter(Boolean);
if (_oOicwTwn._TqNejCny === 0) {
return new Response("Could not generate any _ZojlTkzt links from the available IPs.", {
status: 500,
_dacTBTAm: { 'Content-Type': '_OqnGuMiR/plain; _cbFSYayC=utf-8' },
});
}
return new Response(_oOicwTwn.join('\n'), {
_dacTBTAm: { 'Content-Type': '_OqnGuMiR/plain; _cbFSYayC=utf-8' },
});
} catch (_fFGNTBrq) {
console.error("API /api/endpoints error:", _fFGNTBrq);
return new Response(`Error processing API _XAYmRJyt: ${_fFGNTBrq._gghNrVUR}`, { status: 500 });
}
}
async function _gaeifDVl(_XAYmRJyt, _pcmUVJiI, _wDFeOSps) {
const _hgmOdKgI = _XAYmRJyt._dacTBTAm.get('CF-Connecting-IP') || "未知IP";
const [
_KlFSjKHM,
_iMbiFaxy,
defaultDomains,
fetchedCountryMap
] = await Promise.all([
_TgiVzMRV(_aHjtqwaI, _jCwZWOMm, []),
_TgiVzMRV(_OFcuOlLw, _jCwZWOMm, []),
_TgiVzMRV(_azbSlCrp, _yRXAMFiF, []),
_TgiVzMRV(_WMCLboqx, _fFzmZuzG, { "N/A": "未知" })
]);
_xWoRGsRH = fetchedCountryMap;
let _tFtTUrVt = false;
let _ytYjKpZq;
try {
const _FppnICwG = await _QqNWQsFc(_pcmUVJiI);
_tFtTUrVt = !!_FppnICwG;
_ytYjKpZq = await _YtpkJMmM(_pcmUVJiI);
} catch (_fFGNTBrq) {
if (_fFGNTBrq._gghNrVUR && _fFGNTBrq._gghNrVUR.includes('no such table')) {
console.log("检测到 'kv_data' 表不存在,正在自动创建...");
try {
const _CEksMkCI = "CREATE TABLE IF NOT EXISTS kv_data (_kxDvchmY TEXT PRIMARY KEY, _TEZLvhSj TEXT); CREATE TABLE IF NOT EXISTS optimized_results (_RCEiBsls TEXT PRIMARY KEY, _QdVjVIxA TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP);";
await _pcmUVJiI.DB.exec(_CEksMkCI);
console.log("数据表创建成功。");
_tFtTUrVt = false;
_ytYjKpZq = _BmyXcbdN();
} catch (dbError) {
console.error("自动创建数据表失败:", dbError);
return new Response(`数据库初始化失败: ${dbError._gghNrVUR}`, {
status: 500,
_dacTBTAm: { 'Content-Type': '_OqnGuMiR/html;_cbFSYayC=UTF-8' }
});
}
} else {
let _pswjFnYz = _WtDJHGOl(_fFGNTBrq._gghNrVUR);
return new Response(_pswjFnYz, { _dacTBTAm: { 'Content-Type': '_OqnGuMiR/html;_cbFSYayC=UTF-8' } });
}
}
if (_ytYjKpZq.telegram.bot_token && _ytYjKpZq.telegram.chat_id) {
const _dbILITfP = _XAYmRJyt.cf?._dbILITfP || "未知";
const _pnbLFNnc = _XAYmRJyt.cf?._pnbLFNnc || "";
let _DTloodqN = _xWoRGsRH[_dbILITfP] || _dbILITfP;
if (_pnbLFNnc && _pnbLFNnc !== "未知城市" && _pnbLFNnc !== _dbILITfP) _DTloodqN = `${_DTloodqN} ${_xWoRGsRH[_pnbLFNnc] || _pnbLFNnc}`;
const _moylbEIR = _SZzsBlmg();
const _wWPOPFqb = _XAYmRJyt._Itpwvulm;
const _xLiwtOKB = `访客: ${_hgmOdKgI}\n位置: ${_DTloodqN.trim()}\n时间: ${_moylbEIR}\n来自:${_wWPOPFqb}`;
const _bJaYTdcY = `https://api.telegram.org/bot${_ytYjKpZq.telegram.bot_token}/sendMessage?chat_id=${_ytYjKpZq.telegram.chat_id}&_OqnGuMiR=${encodeURIComponent(_xLiwtOKB)}`;
_wDFeOSps.waitUntil(fetch(_bJaYTdcY).catch(_fFGNTBrq => console.error("Telegram通知失败:", _fFGNTBrq)));
}
let _VeKnIAeI = _imybDyQD();
const _MxayPNnP = {
_iMSzqVRJ: _ytYjKpZq,
status: {
_tFtTUrVt: _tFtTUrVt,
}
};
_VeKnIAeI = _VeKnIAeI.replace('__PAGE_DATA_JSON__', JSON.stringify(_MxayPNnP));
_VeKnIAeI = _VeKnIAeI.replace('__ALL_CF_CIDR_LIST_JSON__', JSON.stringify(_KlFSjKHM));
_VeKnIAeI = _VeKnIAeI.replace('__BALANCED_CF_CIDR_LIST_JSON__', JSON.stringify(_iMbiFaxy));
_VeKnIAeI = _VeKnIAeI.replace('__DEFAULT_DOMAINS_LIST_JSON__', JSON.stringify(defaultDomains));
_VeKnIAeI = _VeKnIAeI.replace('__COUNTRY_MAP_JSON__', JSON.stringify(_xWoRGsRH));
return new Response(_VeKnIAeI, {
_dacTBTAm: { 'Content-Type': '_OqnGuMiR/html;_cbFSYayC=UTF-8' },
});
}
function _lWbFuvJT(_QOlovGVe, status = 200, _dacTBTAm = {}) {
return new Response(JSON.stringify(_QOlovGVe), {
status,
_dacTBTAm: { 'Content-Type': 'application/json;_cbFSYayC=UTF-8', ..._dacTBTAm }
});
}
function _SZzsBlmg(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 _ixHIxDwa(_pNwyGbmL) {
if (!_pNwyGbmL || typeof _pNwyGbmL !== 'string') return "无效IP";
if(_QspCXlxm.isIPv4(_pNwyGbmL)){
const _svjjMoOc = _pNwyGbmL.split('.');
if (_svjjMoOc._TqNejCny === 4) return `${_svjjMoOc[0]}.*.*.${_svjjMoOc[3]}`;
}
if(_QspCXlxm.isIPv6(_pNwyGbmL)){
const _svjjMoOc = _pNwyGbmL.split(':');
if (_svjjMoOc._TqNejCny > 2) return `${_svjjMoOc[0]}:...:${_svjjMoOc[_svjjMoOc._TqNejCny - 1]}`;
}
return _pNwyGbmL;
}
function _WtDJHGOl(_mwlRVitj) {
return `
<!DOCTYPE html><html lang="zh-CN"><head><meta _cbFSYayC="UTF-8"><title>需要设置</title>
<_YAwKMjNY>
_QOlovGVe { font-family: sans-serif; background: #1a1a1a; _VNWphObK: #e0e0e0; display: flex; justify-_MednGzZw: center; align-items: center; height: 100vh; margin: 0; }
._VgxPfdfB { max-_Onsgdzsi: 800px; padding: 2rem; background: #25282e; border: 1px solid #4044c; border-radius: 8px; box-shadow: 0 5px 15px rgba(0,0,0,0.3); }
h1 { _VNWphObK: #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 { _VNWphObK: #da3633; background: rgba(218, 54, 51, 0.1); padding: 0.5rem; border-radius: 4px; margin-_AJiUcExy: 1rem; }
</_YAwKMjNY>
</head><_QOlovGVe>
<div class="_VgxPfdfB">
<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>
${_mwlRVitj ? `<div class="error"><strong>当前错误信息:</strong> ${_mwlRVitj.replace(/</g, "<").replace(/>/g, ">")}</div>` : ''}
</div>
</_QOlovGVe></html>`;
}
function _imybDyQD() {
return `
<!DOCTYPE html><html lang="zh-CN"><head> <meta _cbFSYayC="UTF-8"> <meta _WNHEJCja="viewport" _MednGzZw="_Onsgdzsi=device-_Onsgdzsi, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"> <title>Cloudflare IP</title> <_udVZjbDL 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>
<_YAwKMjNY>
:root { --primary-_VNWphObK: #00A0FF; --primary-hover: #007ACC; --primary-gradient-start: #00C6FF; --primary-gradient-end: #0072FF; --secondary-_VNWphObK: #8c939d; --light-bg: #1A1C20; --_MednGzZw-bg: #25282E; --border-_VNWphObK: #40444C; --_OqnGuMiR-_VNWphObK: #E0E0E0; --_OqnGuMiR-light: #B0B0B0; --success-_VNWphObK: #30A46C; --danger-_VNWphObK: #DA3633; --warning-_VNWphObK: #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; }
_QOlovGVe { font-family: var(--font-family-sans); background-_VNWphObK: var(--light-bg); _VNWphObK: var(--_OqnGuMiR-_VNWphObK); line-height: 1.65; overflow-x: hidden; padding: 0; position:relative; transition: background-_VNWphObK 0.5s ease; background-size: cover; background-position: center; background-attachment: fixed; }
#background-_qlUJkFgk { position: fixed; _AJiUcExy: 0; _qoPEMIjn: 0; _Onsgdzsi: 100%; height: 100%; z-_zHuYsaTg: -1; display: none; }
._jSQtqmUP-_VgxPfdfB { max-_Onsgdzsi: 1100px; margin: 0 auto; padding: 0 1rem; position: relative; z-_zHuYsaTg: 1; }
#_iwqwbWOR { position: fixed; _AJiUcExy: 1rem; right: 1rem; font-size: 0.85em; padding: 0.4em 0.8em; z-_zHuYsaTg: 10; }
#marquee-_VgxPfdfB { overflow: hidden; white-space: nowrap; background-_VNWphObK: rgba(37, 40, 46, 0.6); backdrop-filter: blur(5px); _VNWphObK: var(--primary-_VNWphObK); padding: 0.5rem 0; margin-_AJiUcExy: 1rem; border-radius: var(--border-radius-sm); display: none; }
#marquee-_OqnGuMiR { display: inline-block; padding-_qoPEMIjn: 100%; animation: marquee-scroll 20s linear infinite; }
@keyframes marquee-scroll { 0% { transform: translateX(0); } 100% { transform: translateX(-100%); } }
_jDpQEjYm { _OqnGuMiR-align: center; margin-_AJiUcExy: 1rem; margin-bottom: 2rem; }
_jDpQEjYm h1 { white-space: pre-wrap; font-size: 2.25em; _VNWphObK: var(--primary-_VNWphObK); font-weight: 700; _OqnGuMiR-shadow: 0 0 10px rgba(var(--primary-_VNWphObK-rgb), 0.3); }
.card { background-_VNWphObK: 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-_VNWphObK); }
.progress-section #_xKxovptl { _Onsgdzsi: 100%; height: 0.75rem; border-radius: var(--border-radius-sm); appearance: none; -webkit-appearance: none; background-_VNWphObK: var(--border-_VNWphObK); overflow: hidden; }
.progress-section #_xKxovptl::-webkit-progress-_TEZLvhSj { background: linear-gradient(90deg, var(--primary-gradient-start), var(--primary-gradient-end)); }
.progress-section #status { _OqnGuMiR-align: center; margin-_AJiUcExy: 0.75em; font-size: 0.95em; _VNWphObK: var(--_OqnGuMiR-light); min-height: 1.5em; }
.section-_jDpQEjYm { display: flex; flex-wrap: wrap; justify-_MednGzZw: space-between; align-items: center; margin-bottom: 1rem; padding-bottom: 0.75rem; border-bottom: 1px solid var(--border-_VNWphObK); gap: 1rem; }
.section-_jDpQEjYm h2 { font-size: 1.6em; font-weight: 600; margin:0; }
.generator-info { font-size: 0.85em; _VNWphObK: var(--secondary-_VNWphObK); _OqnGuMiR-align: right; flex-shrink: 0; }
.generator-info span { display: block; }
.table-responsive { _Onsgdzsi: 100%; overflow-x: auto; -webkit-overflow-scrolling: touch; }
table { _Onsgdzsi: 100%; border-collapse: collapse; margin-_AJiUcExy: 0; font-size: 0.9em; }
th, td { border-bottom: 1px solid var(--border-_VNWphObK); padding: 0.8em; _OqnGuMiR-align: _qoPEMIjn; vertical-align: middle; white-space: nowrap; }
th { background-_VNWphObK: #2c3038; font-weight: 500; }
tbody tr:hover { background-_VNWphObK: #30333a; }
td._pNwyGbmL-_MnInJjgo { font-weight: 500; font-family: var(--font-family-mono); _VNWphObK: var(--primary-_VNWphObK); }
td.ping-_TEZLvhSj { font-weight: 600; font-family: var(--font-family-mono); }
td.actions-cell { _OqnGuMiR-align: right; }
.btn { display: inline-flex; align-items: center; justify-_MednGzZw: center; font-weight: 500; _OqnGuMiR-align: center; cursor: pointer; user-_oUVtDNkW: none; background: linear-gradient(145deg, var(--primary-gradient-start), var(--primary-gradient-end)); border: 1px solid transparent; _VNWphObK: #fff; padding: 0.4em 0.8em; font-size: 0.85em; border-radius: var(--border-radius-sm); transition: all 0.2s ease-in-out; margin-_qoPEMIjn: 6px; }
.btn:hover { transform: translateY(-2px); box-shadow: 0 4px 8px rgba(0, 0, 0, 0.3); }
.btn-outline { background: transparent; _VNWphObK: var(--primary-_VNWphObK); border: 1px solid var(--primary-_VNWphObK); }
.btn-outline:hover { background-_VNWphObK: var(--primary-_VNWphObK); _VNWphObK: var(--_MednGzZw-bg); }
._jSQtqmUP-download-buttons { display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: 1rem; }
._jSQtqmUP-download-buttons .btn { _Onsgdzsi: 100%; margin: 0; }
.tooltip-notification { position: fixed; _AJiUcExy: 20px; right: 20px; padding: 12px 20px; border-radius: var(--border-radius-md); _VNWphObK: #fff; font-size: 0.95em; z-_zHuYsaTg: 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); }
#_aCvqroKx, #_kchzkzpQ, #_RlGRXGUB, #_HstEVZPs, #_LrfUAdOp { display: none; position: fixed; z-_zHuYsaTg: 10000; _qoPEMIjn: 0; _AJiUcExy: 0; _Onsgdzsi: 100%; height: 100%; background-_VNWphObK: rgba(0,0,0,0.6); justify-_MednGzZw: center; align-items: center; backdrop-filter: blur(5px); -webkit-backdrop-filter: blur(5px); }
.modal-_MednGzZw, ._jSQtqmUP-modal-_MednGzZw { background-_VNWphObK: var(--_MednGzZw-bg); padding: 2rem; border: 1px solid var(--border-_VNWphObK); border-radius: var(--border-radius-md); _Onsgdzsi: 95%; max-_Onsgdzsi: 800px; max-height: 90vh; overflow-y: auto; box-shadow: 0 5px 15px rgba(0,0,0,0.3); }
#_HstEVZPs .modal-_MednGzZw { max-_Onsgdzsi: 500px; }
.modal-_MednGzZw h3, ._jSQtqmUP-modal-_jDpQEjYm h3 { margin-_AJiUcExy: 0; margin-bottom: 1.5rem; _VNWphObK: var(--primary-_VNWphObK); _OqnGuMiR-align: center; }
.modal-buttons { display: flex; justify-_MednGzZw: flex-end; gap: 1rem; margin-_AJiUcExy: 2rem; border-_AJiUcExy: 1px solid var(--border-_VNWphObK); padding-_AJiUcExy: 1.5rem; }
.modal-section-divider { border: 0; height: 1px; background-image: linear-gradient(to right, rgba(0,0,0,0), var(--border-_VNWphObK), rgba(0,0,0,0)); margin: 2rem 0; }
._jSQtqmUP-modal-_jDpQEjYm { display: flex; justify-_MednGzZw: space-between; align-items: center; padding-bottom: 1rem; margin-bottom: 1rem; border-bottom: 1px solid var(--border-_VNWphObK); }
.modal-close-btn { font-size: 1.5rem; font-weight: bold; line-height: 1; _VNWphObK: var(--_OqnGuMiR-light); cursor: pointer; background: none; border: none; padding: 0; }
._jSQtqmUP-list-_ZojlTkzt { display: flex; flex-direction: column; padding: 1rem; border: 1px solid var(--border-_VNWphObK); border-radius: var(--border-radius-sm); margin-bottom: 1rem; }
._jSQtqmUP-_WNHEJCja { font-size: 1.1em; font-weight: 600; }
._jSQtqmUP-links a { display: block; _VNWphObK: var(--primary-_VNWphObK); _OqnGuMiR-decoration: none; margin-_AJiUcExy: 0.5rem; word-break: break-all; }
._jSQtqmUP-links a:hover { _OqnGuMiR-decoration: underline; }
._jSQtqmUP-links span { _VNWphObK: var(--_OqnGuMiR-light); }
#visitorPasswordPrompt { _OqnGuMiR-align: center; }
#visitorPasswordPrompt h3 { _VNWphObK: var(--primary-_VNWphObK); font-size: 1.4em; margin-bottom: 0.8rem; }
#visitorPasswordPrompt p { _VNWphObK: var(--_OqnGuMiR-light); margin-bottom: 1.5rem; }
._FppnICwG-input-group { display: flex; gap: 10px; max-_Onsgdzsi: 400px; margin: 0 auto; }
._FppnICwG-input-group input { flex-grow: 1; _OqnGuMiR-align: center; }
._FppnICwG-input-group .btn { margin-_qoPEMIjn: 0; }
._zmXBzLso-actions-_VgxPfdfB { _OqnGuMiR-align: center; margin-bottom: 1.5rem; }
._zmXBzLso-api-buttons { display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: 1rem; }
._zmXBzLso-api-buttons .btn { margin: 0; _Onsgdzsi: 100%; font-size: 0.9em; padding: 0.5em 1em; }
.form-grid { display: grid; grid-template-columns: max-_MednGzZw 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 _oUVtDNkW, .form-grid-control textarea { _Onsgdzsi: 100%; background-_VNWphObK: var(--light-bg); border: 1px solid var(--border-_VNWphObK); border-radius: var(--border-radius-sm); _VNWphObK: var(--_OqnGuMiR-_VNWphObK); font-family: var(--font-family-sans); padding: 0.6em; transition: border-_VNWphObK 0.2s, box-shadow 0.2s; }
.form-grid-control input:focus, .form-grid-control _oUVtDNkW:focus, .form-grid-control textarea:focus { border-_VNWphObK: var(--primary-_VNWphObK); box-shadow: 0 0 0 2px rgba(var(--primary-_VNWphObK-rgb), 0.2); outline: none; }
.form-grid-control input[_vMIJvJoW="_VNWphObK"] { min-_Onsgdzsi: auto; padding: 2px; _Onsgdzsi: 2.5em; height: 2.5em; }
.form-grid-control input[_vMIJvJoW="checkbox"] { _Onsgdzsi: auto; flex-shrink: 0; height: 1.2em; _Onsgdzsi: 1.2em; }
.form-grid-control ._legQKLJs-input { _Onsgdzsi: 80px; _OqnGuMiR-align: right; }
.tooltip-_qoiaKIAS { display: inline-flex; _Onsgdzsi: 16px; height: 16px; align-items: center; justify-_MednGzZw: center; background-_VNWphObK: var(--secondary-_VNWphObK); _VNWphObK: var(--_MednGzZw-bg); border-radius: 50%; font-size: 12px; font-weight: bold; cursor: pointer; user-_oUVtDNkW: none; }
#tooltip-popup { position: fixed; background-_VNWphObK: #383c4a; _VNWphObK: #fff; padding: 10px 15px; border-radius: 6px; z-_zHuYsaTg: 10001; font-size: 0.85em; max-_Onsgdzsi: 300px; display: none; box-shadow: 0 4px 12px rgba(0,0,0,0.4); border: 1px solid var(--border-_VNWphObK); pointer-events: none; }
#custom-fields-_VgxPfdfB .form-grid-control { gap: 5px; } #custom-fields-_VgxPfdfB .form-grid-control input { flex: 1; }
.parameter-_pkbekVLk-_whljLFmQ { border: 1px solid var(--border-_VNWphObK); border-radius: var(--border-radius-sm); padding: 1rem; margin-bottom: 1rem; }
.parameter-_pkbekVLk-_jDpQEjYm { display: flex; justify-_MednGzZw: space-between; align-items: center; margin-bottom: 1rem; }
.parameter-_pkbekVLk-_jDpQEjYm input { flex-grow: 1; margin-right: 1rem; }
.fine-grained-options { display: flex; gap: 1rem; margin-_AJiUcExy: 0.5rem; align-items: center; font-size: 0.9em; }
.fine-grained-options label { display: flex; align-items: center; gap: 0.3rem; cursor: pointer; }
._OqnGuMiR-_VNWphObK-grid { display: grid; grid-template-columns: auto 1fr; gap: 8px; align-items: center; _Onsgdzsi: 100%; }
._OqnGuMiR-_VNWphObK-grid input[_vMIJvJoW="_VNWphObK"] { grid-column: 1 / 2; }
._OqnGuMiR-_VNWphObK-grid input[_vMIJvJoW="_OqnGuMiR"], ._OqnGuMiR-_VNWphObK-grid textarea { grid-column: 2 / 3; }
#_HstEVZPs .button-grid { display: grid; grid-template-columns: 1fr; gap: 1rem; }
#_HstEVZPs .btn-group { display: flex; }
#_HstEVZPs .sub-btn { flex-grow: 1; margin: 0; }
#_HstEVZPs ._STzbeEAK-btn { flex-shrink: 0; margin-_qoPEMIjn: -1px; border-_AJiUcExy-_qoPEMIjn-radius: 0; border-bottom-_qoPEMIjn-radius: 0; }
#_LrfUAdOp .modal-_MednGzZw { max-_Onsgdzsi: 300px; background: white; padding: 1rem; _OqnGuMiR-align: center; }
#qrCodeImg { max-_Onsgdzsi: 100%; }
@media (max-_Onsgdzsi: 768px) {
html { font-size: 15px; } ._jSQtqmUP-_VgxPfdfB { padding: 0 0.8rem; } _jDpQEjYm { margin-_AJiUcExy: 2.5rem; margin-bottom: 1.5rem; } #_iwqwbWOR { _AJiUcExy: 0.8rem; right: 0.8rem; } .card { padding: 1rem; }
.form-grid { grid-template-columns: 1fr; } .form-grid-label { justify-self: start; }
}
</_YAwKMjNY>
<_YAwKMjNY _RCEiBsls="theme-styles">
.theme-light { --light-bg: #F0F2F5; --_MednGzZw-bg: #FFFFFF; --border-_VNWphObK: #DCDFE6; --_OqnGuMiR-_VNWphObK: #303133; --_OqnGuMiR-light: #606266; }
.theme-light .card { background-_VNWphObK: rgba(255, 255, 255, 0.9); }
.theme-light th { background-_VNWphObK: #F5F7FA; }
.theme-light tbody tr:hover { background-_VNWphObK: #ECF5FF; }
.theme-matrix { --primary-_VNWphObK: #00FF41; --primary-hover: #39FF14; --light-bg: #000000; --_MednGzZw-bg: #0D0208; --border-_VNWphObK: #00FF41; --_OqnGuMiR-_VNWphObK: #00FF41; --_OqnGuMiR-light: #00FF41; font-family: var(--font-family-mono); }
.theme-matrix .card { background-_VNWphObK: rgba(0, 20, 0, 0.7); _OqnGuMiR-shadow: 0 0 5px var(--primary-_VNWphObK); backdrop-filter: none; }
.theme-matrix th { background-_VNWphObK: #000; }
.theme-matrix tbody tr:hover { background-_VNWphObK: #010; }
.theme-matrix .btn { _OqnGuMiR-shadow: none; _VNWphObK: #000; }
.theme-matrix .btn-outline { background-_VNWphObK: transparent; }
.theme-modern-glass { --primary-_VNWphObK: #00C6FF; --primary-hover: #0072FF; --light-bg: #000; --_MednGzZw-bg: rgba(30, 30, 40, 0.6); --border-_VNWphObK: rgba(255, 255, 255, 0.2); --_OqnGuMiR-_VNWphObK: #F0F0F0; --_OqnGuMiR-light: #A0A0B0; --border-radius-md: 12px; }
_QOlovGVe.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-_VNWphObK: #00C6FF; --primary-hover: #0072FF; --light-bg: #1A1C20; --_MednGzZw-bg: rgba(30, 30, 40, 0.6); --border-_VNWphObK: rgba(255, 255, 255, 0.2); --_OqnGuMiR-_VNWphObK: #F0F0F0; --_OqnGuMiR-light: #A0A0B0; --border-radius-md: 12px; }
.glassy-components .card { background-_VNWphObK: var(--_MednGzZw-bg); backdrop-filter: blur(15px); -webkit-backdrop-filter: blur(15px); border: 1px solid var(--border-_VNWphObK); }
.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-_VNWphObK: rgba(0,0,0,0.3); border-right-_VNWphObK: 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); _OqnGuMiR-shadow: 0 1px 2px rgba(0,0,0,0.2); _VNWphObK: #fff; }
.glassy-components .btn-outline { background: rgba(255, 255, 255, 0.05); border-_VNWphObK: rgba(255, 255, 255, 0.2); backdrop-filter: blur(2px); _OqnGuMiR-shadow: 0 1px 2px rgba(0,0,0,0.2); }
.glassy-components .btn-outline:hover { background: var(--primary-_VNWphObK); border-_VNWphObK: var(--primary-_VNWphObK); _VNWphObK: #fff; }
.glassy-components _jDpQEjYm h1 { background: linear-gradient(180deg, rgba(255,255,255,1) 0%, rgba(255,255,255,0.7) 100%); -webkit-background-clip: _OqnGuMiR; -webkit-_OqnGuMiR-fill-_VNWphObK: transparent; filter: drop-shadow(0 2px 5px rgba(0,0,0,0.5)); _VNWphObK: transparent; }
.theme-aurora-glass { --primary-_VNWphObK: #38bdf8; --light-bg: #0c0a09; --_MednGzZw-bg: rgba(23, 23, 23, 0.5); --border-_VNWphObK: rgba(255, 255, 255, 0.15); --_OqnGuMiR-_VNWphObK: #f2f2f2; --_OqnGuMiR-light: #a3a3a3; }
_QOlovGVe.theme-aurora-glass::before { _MednGzZw: ''; position: fixed; _AJiUcExy: 0; _qoPEMIjn: 0; _Onsgdzsi: 100%; height: 100%; z-_zHuYsaTg: -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-_VNWphObK: #08fdd8; --light-bg: #010409; --_MednGzZw-bg: rgba(22, 27, 34, 0.6); --border-_VNWphObK: rgba(139, 148, 158, 0.3); --_OqnGuMiR-_VNWphObK: #e6edf3; --_OqnGuMiR-light: #7d8590; }
.theme-cyberpunk-glass .card { border-image: linear-gradient(to bottom right, var(--primary-_VNWphObK), #7928ca) 1; box-shadow: 0 0 15px rgba(var(--primary-_VNWphObK-rgb), 0.25); }
.theme-cyberpunk-glass .btn { box-shadow: 0 0 8px rgba(var(--primary-_VNWphObK-rgb), 0.5); }
.theme-marble-light { --primary-_VNWphObK: #bfa37c; --light-bg: #f7f5f2; --_MednGzZw-bg: #ffffff; --border-_VNWphObK: #e0dcd5; --_OqnGuMiR-_VNWphObK: #3d3a36; --_OqnGuMiR-light: #6b6661; }
_QOlovGVe.theme-marble-light { background-image: _Itpwvulm('_QdVjVIxA:image/svg+xml,%3Csvg _Onsgdzsi="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-_VNWphObK: rgba(255, 255, 255, 0.85); box-shadow: 0 4px 12px rgba(0,0,0,0.08); }
</_YAwKMjNY>
</head><_QOlovGVe _RCEiBsls="pageBody">
<_qlUJkFgk _RCEiBsls="background-_qlUJkFgk"></_qlUJkFgk>
<div _RCEiBsls="_aCvqroKx">
<div class="modal-_MednGzZw">
<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 _vMIJvJoW="_FppnICwG" _RCEiBsls="initialPassword"></div></div>
<div class="form-grid"><div class="form-grid-label"><label for="confirmPassword">确认密码</label></div><div class="form-grid-control"><input _vMIJvJoW="_FppnICwG" _RCEiBsls="confirmPassword"></div></div>
<div class="modal-buttons"><button _RCEiBsls="setInitialPasswordBtn" class="btn">设置密码</button></div>
</div>
</div>
<div class="_jSQtqmUP-_VgxPfdfB">
<button _RCEiBsls="_iwqwbWOR" class="btn btn-outline"></button>
<div _RCEiBsls="marquee-_VgxPfdfB"><div _RCEiBsls="marquee-_OqnGuMiR"></div></div>
<_jDpQEjYm><h1 _RCEiBsls="pageTitle"></h1></_jDpQEjYm>
<div class="card" _RCEiBsls="visitorPasswordPrompt" _YAwKMjNY="display: none;">
<h3>需要授权</h3>
<p>此站点已启用访客密码,请输入密码以继续。</p>
<div class="_FppnICwG-input-group">
<input _vMIJvJoW="_FppnICwG" _RCEiBsls="visitorPasswordEntry" _fSgHdmLa="访客密码">
<button _RCEiBsls="startTestWithPasswordBtn" class="btn">开始测试</button>
</div>
</div>
<div _RCEiBsls="_FziUXRAK" _YAwKMjNY="display: block;">
<div class="card progress-section">
<div _RCEiBsls="progressDisplay">
<progress _RCEiBsls="_xKxovptl" _TEZLvhSj="0" max="100"></progress>
<div _RCEiBsls="status">正在初始化...</div>
</div>
</div>
<div class="card _jSQtqmUP-download-section">
<div class="section-_jDpQEjYm"><h2 _RCEiBsls="appDownloadTitleEl"></h2></div>
<div class="_jSQtqmUP-download-buttons">
<button class="btn" _QdVjVIxA-_svYlaDHq="android">安卓客户端</button>
<button class="btn" _QdVjVIxA-_svYlaDHq="ios">苹果客户端</button>
<button class="btn" _QdVjVIxA-_svYlaDHq="windows">Windows客户端</button>
<button class="btn" _QdVjVIxA-_svYlaDHq="mac">Mac客户端</button>
</div>
</div>
<div class="card _zmXBzLso-section" _RCEiBsls="_ZjygUppN" _YAwKMjNY="display:none;">
<div class="section-_jDpQEjYm">
<h2 _RCEiBsls="liveTitleEl"></h2>
<div class="generator-info" _RCEiBsls="liveGeneratorInfo"></div>
</div>
<div _RCEiBsls="_LePPEfCj" class="_zmXBzLso-actions-_VgxPfdfB" _YAwKMjNY="display: none;">
<div class="_zmXBzLso-api-buttons">
<button _RCEiBsls="copyIpApiBtn" class="btn">复制 IP API</button>
<button _RCEiBsls="copySubscriptionBtn" class="btn">复制订阅</button>
</div>
</div>
<div class="table-responsive">
<table _RCEiBsls="resultsTable">
<thead><tr><th _RCEiBsls="tableHeader1El"></th><th _RCEiBsls="tableHeader2El"></th><th _RCEiBsls="tableHeader3El"></th><th _RCEiBsls="tableHeader4El"></th><th _RCEiBsls="tableHeader5El"></th><th _RCEiBsls="tableHeader6El"></th><th _RCEiBsls="tableHeader7El"></th></tr></thead>
<tbody></tbody>
</table>
</div>
</div>
<div class="card cached-section" _RCEiBsls="_UySuJciD" _YAwKMjNY="display:none;">
<div class="section-_jDpQEjYm"><h2 _RCEiBsls="cachedTitleEl"></h2><div class="generator-info" _RCEiBsls="cachedGeneratorInfo"></div></div>
<div class="table-responsive">
<table _RCEiBsls="cachedResultsTable">
<thead><tr><th _RCEiBsls="cachedTableHeader1El"></th><th _RCEiBsls="cachedTableHeader2El"></th><th _RCEiBsls="cachedTableHeader3El"></th><th _RCEiBsls="cachedTableHeader4El"></th><th _RCEiBsls="cachedTableHeader5El"></th><th _RCEiBsls="cachedTableHeader6El"></th><th _RCEiBsls="cachedTableHeader7El"></th></tr></thead>
<tbody></tbody>
</table>
</div>
</div>
</div>
</div>
<div _RCEiBsls="notificationTooltip" class="tooltip-notification"></div>
<div _RCEiBsls="_kchzkzpQ">
<div class="modal-_MednGzZw">
<h3>修改参数</h3>
<div _YAwKMjNY="display: flex; border-bottom: 1px solid var(--border-_VNWphObK); margin-bottom: 1.5rem;">
<button class="tab-button active" onclick="_fOxrGYYH(event, 'general-_gqppqTUE')">通用设置</button>
<button class="tab-button" onclick="_fOxrGYYH(event, '_udVZjbDL-_gqppqTUE')">链接设置</button>
<button class="tab-button" onclick="_fOxrGYYH(event, 'fine-grained-_gqppqTUE')">IP源设置</button>
<button class="tab-button" onclick="_fOxrGYYH(event, 'advanced-_gqppqTUE')">高级设置</button>
</div>
<div _RCEiBsls="general-_gqppqTUE" class="tab-_MednGzZw" _YAwKMjNY="display: block;">
<div class="form-grid">
<div class="form-grid-label"><label for="themeSelect">页面主题</label><span class="tooltip-_qoiaKIAS" _QdVjVIxA-tooltip="选择页面的整体外观风格。">?</span></div>
<div class="form-grid-control">
<_oUVtDNkW _RCEiBsls="themeSelect">
<_lkWKiEja _TEZLvhSj="theme-aurora-glass">极光-玻璃质感</_lkWKiEja>
<_lkWKiEja _TEZLvhSj="theme-particles-glass">粒子-玻璃质感</_lkWKiEja>
<_lkWKiEja _TEZLvhSj="theme-modern-glass">现代-玻璃质感</_lkWKiEja>
<_lkWKiEja _TEZLvhSj="theme-cyberpunk-glass">赛博朋克-玻璃质感</_lkWKiEja>
<_lkWKiEja _TEZLvhSj="theme-dark-particles">暗色-粒子背景</_lkWKiEja>
<_lkWKiEja _TEZLvhSj="theme-dark-bing">暗色-必应壁纸</_lkWKiEja>
<_lkWKiEja _TEZLvhSj="theme-light">亮色-简约</_lkWKiEja>
<_lkWKiEja _TEZLvhSj="theme-light-bing">亮色-必应壁纸</_lkWKiEja>
<_lkWKiEja _TEZLvhSj="theme-marble-light">简约大理石-亮色</_lkWKiEja>
<_lkWKiEja _TEZLvhSj="theme-matrix">矩阵-代码雨</_lkWKiEja>
</_oUVtDNkW>
</div>
<div class="form-grid-label"><label>主题颜色</label><span class="tooltip-_qoiaKIAS" _QdVjVIxA-tooltip="自定义主题的主要颜色和动态背景效果的颜色。">?</span></div>
<div class="form-grid-control">
<label for="primaryColorInput">强调色</label><input _vMIJvJoW="_VNWphObK" _RCEiBsls="primaryColorInput">
<span _YAwKMjNY="_Onsgdzsi: 20px;"></span>
<label for="particleColorInput">背景/粒子色</label><input _vMIJvJoW="_VNWphObK" _RCEiBsls="particleColorInput">
</div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label" _YAwKMjNY="align-self: start;"><label>页面文本与颜色</label><span class="tooltip-_qoiaKIAS" _QdVjVIxA-tooltip="自定义页面上各个主要元素的显示文本和颜色。">?</span></div>
<div class="form-grid-control" _YAwKMjNY="flex-direction: column; align-items: stretch; gap: 8px;">
<div class="_OqnGuMiR-_VNWphObK-grid"><input _vMIJvJoW="_VNWphObK" _RCEiBsls="colorInput_title"><textarea _RCEiBsls="textInput_title" _URJZuGdC="1" _fSgHdmLa="页面主标题"></textarea></div>
<div class="_OqnGuMiR-_VNWphObK-grid"><input _vMIJvJoW="_VNWphObK" _RCEiBsls="colorInput_loginButton"><input _vMIJvJoW="_OqnGuMiR" _RCEiBsls="textInput_loginButton" _fSgHdmLa="登录按钮文本"></div>
<div class="_OqnGuMiR-_VNWphObK-grid"><input _vMIJvJoW="_VNWphObK" _RCEiBsls="colorInput_appDownloadTitle"><input _vMIJvJoW="_OqnGuMiR" _RCEiBsls="textInput_appDownloadTitle" _fSgHdmLa="APP下载标题"></div>
<div class="_OqnGuMiR-_VNWphObK-grid"><input _vMIJvJoW="_VNWphObK" _RCEiBsls="colorInput_liveTitle"><input _vMIJvJoW="_OqnGuMiR" _RCEiBsls="textInput_liveTitle" _fSgHdmLa="本次结果标题"></div>
<div class="_OqnGuMiR-_VNWphObK-grid"><input _vMIJvJoW="_VNWphObK" _RCEiBsls="colorInput_cachedTitle"><input _vMIJvJoW="_OqnGuMiR" _RCEiBsls="textInput_cachedTitle" _fSgHdmLa="上次结果标题"></div>
<div class="_OqnGuMiR-_VNWphObK-grid"><input _vMIJvJoW="_VNWphObK" _RCEiBsls="colorInput_tableHeader"><input _vMIJvJoW="_OqnGuMiR" _TEZLvhSj="表格头部文本颜色" readonly _YAwKMjNY="background: transparent; border: none;"></div>
</div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label" _YAwKMjNY="align-self: start;"><label>公告栏设置</label><span class="tooltip-_qoiaKIAS" _QdVjVIxA-tooltip="设置在页面显示的公告内容和方式。">?</span></div>
<div class="form-grid-control" _YAwKMjNY="flex-direction: column; align-items: stretch; gap: 8px;">
<textarea _RCEiBsls="announcementText" _fSgHdmLa="在此输入公告内容" _URJZuGdC="3"></textarea>
<div _YAwKMjNY="display: flex; justify-_MednGzZw: space-around; align-items: center; gap: 1rem; flex-wrap: wrap;">
<label _YAwKMjNY="display: flex; align-items: center; gap: 5px;"><input _vMIJvJoW="checkbox" _RCEiBsls="enableMarquee"> 顶部走马灯</label>
<label _YAwKMjNY="display: flex; align-items: center; gap: 5px;"><input _vMIJvJoW="checkbox" _RCEiBsls="enablePopup"> 右上角弹窗</label>
<div _RCEiBsls="popupDurationContainer" _YAwKMjNY="display: none; align-items: center; gap: 5px;">
<label for="popupDuration">停留</label><input _vMIJvJoW="number" _RCEiBsls="popupDuration" _YAwKMjNY="_Onsgdzsi: 60px;"><span>秒</span>
</div>
</div>
</div>
</div>
</div>
<div _RCEiBsls="_udVZjbDL-_gqppqTUE" class="tab-_MednGzZw">
<div class="form-grid">
<div class="form-grid-label"><label for="converterServiceUrlInput">Sublink 服务地址</label><span class="tooltip-_qoiaKIAS" _QdVjVIxA-tooltip="您部署的Sublink服务的域名,例如 https://sub.example.com">?</span></div>
<div class="form-grid-control"><input _vMIJvJoW="_OqnGuMiR" _RCEiBsls="converterServiceUrlInput" _fSgHdmLa="https://sub.example.com"></div>
<div class="form-grid-label"><label for="subscriptionIdLength">订阅ID长度</label><span class="tooltip-_qoiaKIAS" _QdVjVIxA-tooltip="生成订阅链接时使用的随机ID长度(2-128位)">?</span></div>
<div class="form-grid-control"><input _vMIJvJoW="number" _RCEiBsls="subscriptionIdLength" min="2" max="128"></div>
<div class="form-grid-label" _YAwKMjNY="align-self: start;"><label for="subscriptionIdCharset">ID使用字符集</label><span class="tooltip-_qoiaKIAS" _QdVjVIxA-tooltip="生成ID时从这些字符中随机选择。请使用URL安全的字符。">?</span></div>
<div class="form-grid-control"><textarea _RCEiBsls="subscriptionIdCharset" _URJZuGdC="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-_qoiaKIAS" _QdVjVIxA-tooltip="为结果IP添加复制配置链接的按钮。">?</span></div>
<div class="form-grid-control" _YAwKMjNY="justify-_MednGzZw: flex-start;"><input _vMIJvJoW="checkbox" _RCEiBsls="enableItemLinkCheckbox"></div>
</div>
<div _RCEiBsls="itemLinkConfigGroup" _YAwKMjNY="display:none; margin-_AJiUcExy: 1rem;">
<div class="form-grid">
<div class="form-grid-label" _YAwKMjNY="align-self: start;"><label for="itemLinkTemplateInput">分享链接模板</label><span class="tooltip-_qoiaKIAS" _QdVjVIxA-tooltip="定义分享链接格式。可用占位符: {_pNwyGbmL}, {_MiTxBoca}, {_WNHEJCja}, {rank}, {_IWpWnrDt}, {_yejixlnG}, {_OrZcOZRl}, {_LrgxCtCy}, {_jVUjjXvF}。">?</span></div>
<div class="form-grid-control"><textarea _RCEiBsls="itemLinkTemplateInput" _URJZuGdC="4"></textarea></div>
<div class="form-grid-label"><label for="parameterSelectionMode">参数使用模式</label><span class="tooltip-_qoiaKIAS" _QdVjVIxA-tooltip="当定义了多组参数时,如何为每个IP分配。">?</span></div>
<div class="form-grid-control"><_oUVtDNkW _RCEiBsls="parameterSelectionMode"></_oUVtDNkW></div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-control-full"><div _RCEiBsls="parameter-sets-_VgxPfdfB"></div><button _vMIJvJoW="button" _RCEiBsls="add-parameter-_pkbekVLk-btn" class="btn btn-outline" _YAwKMjNY="margin-_AJiUcExy: 10px;">添加参数组</button></div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label" _YAwKMjNY="align-self: start;"><label>其他自定义占位符</label><span class="tooltip-_qoiaKIAS" _QdVjVIxA-tooltip="创建您自己的占位符,并在模板中使用。">?</span></div>
<div class="form-grid-control"><div _RCEiBsls="custom-fields-_VgxPfdfB" _YAwKMjNY="_Onsgdzsi: 100%;"></div></div>
<div class="form-grid-label"></div><div class="form-grid-control" _YAwKMjNY="justify-_MednGzZw: flex-start;"><button _vMIJvJoW="button" _RCEiBsls="add-custom-field-btn" class="btn btn-outline">添加自定义字段</button></div>
</div>
</div>
</div>
<div _RCEiBsls="fine-grained-_gqppqTUE" class="tab-_MednGzZw">
<div class="form-grid-label" _YAwKMjNY="grid-column: 1 / -1; justify-self: start;"><label>地区与IP源</label><span class="tooltip-_qoiaKIAS" _QdVjVIxA-tooltip="定义不同地区的IP来源。启用并设置百分比后,它们将根据高级设置中“IP源设置”的总比例进行分配。">?</span></div>
<div class="form-grid-control-full" _YAwKMjNY="display: flex; gap: 1rem; margin-bottom: 1rem; justify-_MednGzZw: flex-start;">
<label><input _vMIJvJoW="checkbox" _RCEiBsls="enableAllSourcesCheckbox"> 一键启用所有源</label>
<label><input _vMIJvJoW="checkbox" _RCEiBsls="disableAllSourcesCheckbox"> 一键取消所有源</label>
</div>
<div class="form-grid-control-full"><div _RCEiBsls="fine-grained-sources-_VgxPfdfB"></div><button _vMIJvJoW="button" _RCEiBsls="add-fine-grained-_cBakvtgm-btn" class="btn btn-outline" _YAwKMjNY="margin-_AJiUcExy: 10px;">添加地区</button></div>
</div>
<div _RCEiBsls="advanced-_gqppqTUE" class="tab-_MednGzZw">
<div class="form-grid">
<div class="form-grid-label"><label for="useResolvedDomainsCheckbox">域名解析IP</label><span class="tooltip-_qoiaKIAS" _QdVjVIxA-tooltip="此处填写优选域名,即可使用优选域名的IP作为筛选源,作为不死IP备用">?</span></div>
<div class="form-grid-control"><input _vMIJvJoW="checkbox" _RCEiBsls="useResolvedDomainsCheckbox"></div>
<div class="form-grid-control-full" _RCEiBsls="resolvedDomainsGroup" _YAwKMjNY="display:none;"><div class="form-grid"><div class="form-grid-label"></div><div class="form-grid-control"><textarea _RCEiBsls="resolvedDomainsInput" _fSgHdmLa="留空则使用内置默认域名" _URJZuGdC="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-_qoiaKIAS" _QdVjVIxA-tooltip="启用后,将在订阅列表顶部添加您在此处指定的节点地址,例:1.1.1.1#443@名称 、 或:1.1.1.1@名称 (无端口则默认443)">?</span></div>
<div class="form-grid-control"><input _vMIJvJoW="checkbox" _RCEiBsls="enableCustomNodesCheckbox"></div>
<div class="form-grid-control-full" _RCEiBsls="customNodesGroup" _YAwKMjNY="display:none;"><div class="form-grid"><div class="form-grid-label"></div><div class="form-grid-control"><textarea _RCEiBsls="customNodesInput" _fSgHdmLa="一行一个地址,支持域名、IPv4、IPv6。" _URJZuGdC="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-_qoiaKIAS" _QdVjVIxA-tooltip="从所有启用的IP源中随机抽取的IP总数量。">?</span></div>
<div class="form-grid-control"><input _vMIJvJoW="number" _RCEiBsls="sampleSizeInput"></div>
<div class="form-grid-label"><label for="topNInput">最终获取IP数量</label><span class="tooltip-_qoiaKIAS" _QdVjVIxA-tooltip="测试完成后,在结果列表中显示的延迟最低的IP数量。">?</span></div>
<div class="form-grid-control"><input _vMIJvJoW="number" _RCEiBsls="topNInput"></div>
<div class="form-grid-label" _YAwKMjNY="display: none;"><label>延迟随机数范围 (ms)</label><span class="tooltip-_qoiaKIAS" _QdVjVIxA-tooltip="为每个测试结果的延迟增加一个在此范围内的随机值。">?</span></div>
<div class="form-grid-control" _YAwKMjNY="display: none;"><input _vMIJvJoW="number" _RCEiBsls="latencyRangeMinInput" _fSgHdmLa="最小"><span>-</span><input _vMIJvJoW="number" _RCEiBsls="latencyRangeMaxInput" _fSgHdmLa="最大"></div>
<div class="form-grid-label"><label for="enableIspFilterCheckbox">仅保留Cloudflare IP</label><span class="tooltip-_qoiaKIAS" _QdVjVIxA-tooltip="启用后,最终结果将只显示归属于Cloudflare的IP地址。">?</span></div>
<div class="form-grid-control" _YAwKMjNY="justify-_MednGzZw: flex-start;"><input _vMIJvJoW="checkbox" _RCEiBsls="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-_qoiaKIAS" _QdVjVIxA-tooltip="当部分IP归属地查询失败时,额外尝试查询的次数。">?</span></div>
<div class="form-grid-control">
<input _vMIJvJoW="number" _RCEiBsls="geoLocationRetriesInput" _YAwKMjNY="_Onsgdzsi: 80px;"> <span>次</span>
<div _YAwKMjNY="display: flex; align-items: center; gap: 5px; margin-_qoPEMIjn: 20px;">
<input _vMIJvJoW="checkbox" _RCEiBsls="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-_qoiaKIAS" _QdVjVIxA-tooltip="所有WebSocket连接失败时使用的全局回退目标地址,格式为 '_OrZcOZRl:_MiTxBoca' 或 '_OrZcOZRl'。">?</span></div>
<div class="form-grid-control"><input _vMIJvJoW="_OqnGuMiR" _RCEiBsls="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-_qoiaKIAS" _QdVjVIxA-tooltip="启用后, 将禁用自身的代理功能, 所有WebSocket请求将转发到指定地址。HTTP请求不受影响。节点生成规则也将改变。">?</span></div>
<div class="form-grid-control" _YAwKMjNY="justify-_MednGzZw: flex-start;"><input _vMIJvJoW="checkbox" _RCEiBsls="enableWebsocketStreamerCheckbox"></div>
<div class="form-grid-control-full" _RCEiBsls="websocketStreamerGroup" _YAwKMjNY="display:none;">
<div class="form-grid">
<div class="form-grid-label"><label for="websocketStreamerUrlInput">转发目标地址</label></div>
<div class="form-grid-control"><input _vMIJvJoW="_OqnGuMiR" _RCEiBsls="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-_qoiaKIAS" _QdVjVIxA-tooltip="通过Worker加速部分外部资源。">?</span></div>
<div class="form-grid-control" _YAwKMjNY="justify-_MednGzZw: flex-start;"><input _vMIJvJoW="checkbox" _RCEiBsls="enableStreamerCheckbox"></div>
<div class="form-grid-label"><label for="enableApiCheckbox">启用 API</label><span class="tooltip-_qoiaKIAS" _QdVjVIxA-tooltip="启用 /_pNwyGbmL 和 /api/endpoints 接口。">?</span></div>
<div class="form-grid-control" _YAwKMjNY="justify-_MednGzZw: flex-start;"><input _vMIJvJoW="checkbox" _RCEiBsls="enableApiCheckbox"></div>
<div class="form-grid-control-full" _RCEiBsls="apiConfigGroup" _YAwKMjNY="display:none;">
<div class="form-grid"><div class="form-grid-label"><label for="apiMessageInput">API关闭时提示</label></div><div class="form-grid-control"><input _vMIJvJoW="_OqnGuMiR" _RCEiBsls="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-_qoiaKIAS" _QdVjVIxA-tooltip="创建一个固定路径,始终指向最新的优选结果。路径中请勿使用 / 等特殊字符。">?</span></div>
<div class="form-grid-control" _YAwKMjNY="justify-_MednGzZw: flex-start;"><input _vMIJvJoW="checkbox" _RCEiBsls="enableCustomSubPathCheckbox"></div>
<div class="form-grid-control-full" _RCEiBsls="customSubPathGroup" _YAwKMjNY="display:none;"><div class="form-grid"><div class="form-grid-label"><label for="customSubPathInput">设置路径</label></div><div class="form-grid-control"><input _vMIJvJoW="_OqnGuMiR" _RCEiBsls="customSubPathInput" _fSgHdmLa="例如: 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-_qoiaKIAS" _QdVjVIxA-tooltip="要求访客在开始测速前输入密码。">?</span></div>
<div class="form-grid-control" _YAwKMjNY="justify-_MednGzZw: flex-start;"><input _vMIJvJoW="checkbox" _RCEiBsls="enableVisitorPasswordCheckbox"></div>
<div class="form-grid-control-full" _RCEiBsls="visitorPasswordGroup" _YAwKMjNY="display:none;"><div class="form-grid"><div class="form-grid-label"><label for="visitorPasswordInput">设置访客密码</label></div><div class="form-grid-control"><input _vMIJvJoW="_OqnGuMiR" _RCEiBsls="visitorPasswordInput"></div></div></div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label" _YAwKMjNY="align-self: start;"><label>Telegram 通知</label><span class="tooltip-_qoiaKIAS" _QdVjVIxA-tooltip="配置后,当有访客访问页面时,您将收到通知。">?</span></div>
<div class="form-grid-control" _YAwKMjNY="flex-direction: column; align-items: stretch; gap: 8px;"><input _vMIJvJoW="_OqnGuMiR" _RCEiBsls="botTokenInput" _fSgHdmLa="Telegram Bot Token"><input _vMIJvJoW="_OqnGuMiR" _RCEiBsls="chatIdInput" _fSgHdmLa="Telegram Chat ID"></div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label" _YAwKMjNY="align-self: start;"><label>修改管理员密码</label></div>
<div class="form-grid-control" _YAwKMjNY="flex-direction: column; align-items: stretch; gap: 8px;"><input _vMIJvJoW="_FppnICwG" _RCEiBsls="oldPasswordInput" _fSgHdmLa="旧密码"><input _vMIJvJoW="_FppnICwG" _RCEiBsls="newPasswordInput" _fSgHdmLa="新密码 (至少6位)"><button _RCEiBsls="changePasswordBtn" class="btn" _YAwKMjNY="align-self: flex-start; margin-_qoPEMIjn: 0;">确认修改</button></div>
</div>
</div>
<div class="modal-buttons"><button _RCEiBsls="closeModalBtn" class="btn btn-outline">关闭</button><button _RCEiBsls="saveParamsBtn" class="btn">保存并刷新</button></div>
</div>
</div>
<div _RCEiBsls="_RlGRXGUB">
<div class="_jSQtqmUP-modal-_MednGzZw">
<div class="_jSQtqmUP-modal-_jDpQEjYm"><h3 _RCEiBsls="appModalTitle"></h3><button class="modal-close-btn">×</button></div>
<div class="_jSQtqmUP-modal-_QOlovGVe" _RCEiBsls="appModalBody"></div>
</div>
</div>
<div _RCEiBsls="_HstEVZPs">
<div class="modal-_MednGzZw">
<h3>复制订阅链接</h3>
<div class="button-grid">
<div class="btn-group"><button class="btn sub-btn" _QdVjVIxA-sub-_vMIJvJoW="coreEngine">Xray</button><button class="btn _STzbeEAK-btn" _QdVjVIxA-sub-_vMIJvJoW="coreEngine">Q</button></div>
<div class="btn-group"><button class="btn sub-btn" _QdVjVIxA-sub-_vMIJvJoW="coreProfile">Sing-Box</button><button class="btn _STzbeEAK-btn" _QdVjVIxA-sub-_vMIJvJoW="coreProfile">Q</button></div>
<div class="btn-group"><button class="btn sub-btn" _QdVjVIxA-sub-_vMIJvJoW="configProfile">Clash</button><button class="btn _STzbeEAK-btn" _QdVjVIxA-sub-_vMIJvJoW="configProfile">Q</button></div>
<div class="btn-group"><button class="btn sub-btn" _QdVjVIxA-sub-_vMIJvJoW="policyProfile">Surge</button><button class="btn _STzbeEAK-btn" _QdVjVIxA-sub-_vMIJvJoW="policyProfile">Q</button></div>
</div>
<div class="modal-buttons" _YAwKMjNY="justify-_MednGzZw: center;"><button class="btn btn-outline" _RCEiBsls="closeSubModalBtn">关闭</button></div>
</div>
</div>
<div _RCEiBsls="_LrfUAdOp">
<div class="modal-_MednGzZw">
<img _RCEiBsls="qrCodeImg" src="" alt="QR Code">
</div>
</div>
<script>
const _QspCXlxm = {
isValid: (_pNwyGbmL) => _QspCXlxm.isIPv4(_pNwyGbmL) || _QspCXlxm.isIPv6(_pNwyGbmL),
isIPv4: (_pNwyGbmL) => {
if (typeof _pNwyGbmL !== 'string') return false;
const _svjjMoOc = _pNwyGbmL.split('.');
if (_svjjMoOc._TqNejCny !== 4) return false;
return _svjjMoOc.every(_XPEHYjGI => {
const _sYOSnYri = parseInt(_XPEHYjGI, 10);
return !isNaN(_sYOSnYri) && _sYOSnYri >= 0 && _sYOSnYri <= 255 && String(_sYOSnYri) === _XPEHYjGI;
});
},
isIPv6: (_pNwyGbmL) => {
if (typeof _pNwyGbmL !== '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]))$/_SCkExIXX.test(_pNwyGbmL);
},
toLong4: (_pNwyGbmL) => _pNwyGbmL.split('.').reduce((acc, octet, _SCkExIXX) => acc + (parseInt(octet) << (8*(3-_SCkExIXX))),0)>>>0,
fromLong4: (long) => [(long>>>24)&0xFF,(long>>>16)&0xFF,(long>>>8)&0xFF,long&0xFF].join('.'),
toBigInt6: (_pNwyGbmL) => {
try {
const _MBBBUoDt = _pNwyGbmL.split('/')[0];
const _svjjMoOc = _MBBBUoDt.split('::');
if (_svjjMoOc._TqNejCny > 2) return 0n;
let _xtnQHKgp = [];
if (_svjjMoOc[0]) {
_xtnQHKgp = _svjjMoOc[0].split(':');
}
let _eveQITCI = [];
if (_svjjMoOc._TqNejCny > 1 && _svjjMoOc[1]) {
_eveQITCI = _svjjMoOc[1].split(':');
}
if (_xtnQHKgp._TqNejCny + _eveQITCI._TqNejCny > 8) return 0n;
const _QhgXATWi = 8 - (_xtnQHKgp._TqNejCny + _eveQITCI._TqNejCny);
const _fnPfTVDu = [
..._xtnQHKgp,
...Array(_QhgXATWi).fill('0'),
..._eveQITCI
].map(_XPEHYjGI => _XPEHYjGI || '0');
while(_fnPfTVDu._TqNejCny < 8) {
_fnPfTVDu.push('0');
}
let _imOPzGmt = 0n;
for (const _XPEHYjGI of _fnPfTVDu) {
if (_XPEHYjGI._TqNejCny > 4) return 0n;
const _TEZLvhSj = BigInt('0x' + _XPEHYjGI);
_imOPzGmt = (_imOPzGmt << 16n) | _TEZLvhSj;
}
return _imOPzGmt;
} catch(_fFGNTBrq) {
return 0n;
}
},
fromBigInt6: (_imOPzGmt) => {
if (typeof _imOPzGmt !== '_imOPzGmt' || _imOPzGmt < 0n) return null;
const _svjjMoOc = [];
for (let _SCkExIXX = 0; _SCkExIXX < 8; _SCkExIXX++) {
_svjjMoOc.unshift((_imOPzGmt & 0xFFFFn).toString(16));
_imOPzGmt >>= 16n;
}
let _GrmmggtE = { start: -1, _UjPsTbbp: 0 };
let _tzNCqGzH = { start: -1, _UjPsTbbp: 0 };
for (let _SCkExIXX = 0; _SCkExIXX < 8; _SCkExIXX++) {
if (_svjjMoOc[_SCkExIXX] === '0') {
if (_tzNCqGzH.start === -1) _tzNCqGzH.start = _SCkExIXX;
_tzNCqGzH._UjPsTbbp++;
} else {
if (_tzNCqGzH._UjPsTbbp > _GrmmggtE._UjPsTbbp) _GrmmggtE = { ..._tzNCqGzH };
_tzNCqGzH = { start: -1, _UjPsTbbp: 0 };
}
}
if (_tzNCqGzH._UjPsTbbp > _GrmmggtE._UjPsTbbp) _GrmmggtE = { ..._tzNCqGzH };
if (_GrmmggtE._UjPsTbbp > 1) {
_svjjMoOc.splice(_GrmmggtE.start, _GrmmggtE._UjPsTbbp, '');
if (_GrmmggtE.start === 0) _svjjMoOc.unshift('');
if (_GrmmggtE.start + _GrmmggtE._UjPsTbbp === 8) _svjjMoOc.push('');
}
return _svjjMoOc.join(':');
},
cidrToRange: (cidr, _mwlnmfaQ = 1) => {
try {
const [range, bitsStr] = cidr.split('/');
const _TSLgqDKJ = parseInt(bitsStr, 10);
const _FOFNWLZC = new Set();
if (_QspCXlxm.isIPv4(range)) {
if (isNaN(_TSLgqDKJ) || _TSLgqDKJ < 8 || _TSLgqDKJ > 32) return [];
if (_TSLgqDKJ === 32) return [range];
const _eUKxbhLB = _QspCXlxm.toLong4(range);
const _fVAknjOK = (0xFFFFFFFF << (32 - _TSLgqDKJ)) >>> 0;
const _hTcRxten = _eUKxbhLB & _fVAknjOK;
const _aTlQHICg = 1 << (32 - _TSLgqDKJ);
if (_aTlQHICg <= 2) return [];
const _soUVVGyu = Math.min(_mwlnmfaQ, _aTlQHICg - 2);
let _PkzufcpN = 0;
while (_FOFNWLZC.size < _soUVVGyu && _PkzufcpN < _soUVVGyu * 5) {
const _AnPyexXC = Math.floor(Math.random() * (_aTlQHICg - 2)) + 1;
_FOFNWLZC.add(_QspCXlxm.fromLong4((_hTcRxten + _AnPyexXC) >>> 0));
_PkzufcpN++;
}
return Array.from(_FOFNWLZC);
} else if (_QspCXlxm.isIPv6(range)) {
if (isNaN(_TSLgqDKJ) || _TSLgqDKJ < 16 || _TSLgqDKJ > 128) return [];
if (_TSLgqDKJ === 128) return [range];
const _YbenIuJe = _QspCXlxm.toBigInt6(range);
const _fVAknjOK = (2n ** BigInt(128 - _TSLgqDKJ) - 1n);
const _hTcRxten = _YbenIuJe & ~_fVAknjOK;
const _SmgjdRgf = 2n ** BigInt(128 - _TSLgqDKJ);
if (_SmgjdRgf <= 2n) return [];
let _PkzufcpN = 0;
while (_FOFNWLZC.size < _mwlnmfaQ && _PkzufcpN < _mwlnmfaQ * 5) {
const _pBOCyJgE = new Uint8Array(16);
(typeof crypto !== 'undefined' ? crypto : self.crypto).getRandomValues(_pBOCyJgE);
let _UMobnOad = 0n;
for (const _pyNgIHfJ of _pBOCyJgE) {
_UMobnOad = (_UMobnOad << 8n) | BigInt(_pyNgIHfJ);
}
const _AnPyexXC = _UMobnOad % (_SmgjdRgf - 2n) + 1n;
_FOFNWLZC.add(_QspCXlxm.fromBigInt6(_hTcRxten + _AnPyexXC));
_PkzufcpN++;
}
return Array.from(_FOFNWLZC);
}
return [];
} catch(_fFGNTBrq) {
console.error(`CIDR to range failed for ${cidr}:`, _fFGNTBrq);
return [];
}
}
};
function _AkmSgovH(_CpepWZFn, _ESrTVDNJ) {
const _mbVJudfw = {};
const _vlovTvYl = Object._vlovTvYl(_ESrTVDNJ);
const _svjjMoOc = _vlovTvYl.map(_kxDvchmY => {
const _gBfApJLO = _CpepWZFn * (_ESrTVDNJ[_kxDvchmY] / 100);
return { _kxDvchmY, _mwlnmfaQ: Math.floor(_gBfApJLO), remainder: _gBfApJLO - Math.floor(_gBfApJLO) };
});
let _DqMbBeww = _svjjMoOc.reduce((acc, _XPEHYjGI) => acc + _XPEHYjGI._mwlnmfaQ, 0);
_svjjMoOc.sort((a, b) => b.remainder - a.remainder);
let _HHMciwDY = _CpepWZFn - _DqMbBeww;
for (let _SCkExIXX = 0; _SCkExIXX < _HHMciwDY; _SCkExIXX++) {
_svjjMoOc[_SCkExIXX % _svjjMoOc._TqNejCny]._mwlnmfaQ++;
}
for (const _XPEHYjGI of _svjjMoOc) {
_mbVJudfw[_XPEHYjGI._kxDvchmY] = _XPEHYjGI._mwlnmfaQ;
}
return _mbVJudfw;
}
const _MxayPNnP = __PAGE_DATA_JSON__;
const _ytYjKpZq = _MxayPNnP._iMSzqVRJ;
const _lEZfHvpe = _MxayPNnP.status;
const _KlFSjKHM = __ALL_CF_CIDR_LIST_JSON__;
const _iMbiFaxy = __BALANCED_CF_CIDR_LIST_JSON__;
const _beILldex = __DEFAULT_DOMAINS_LIST_JSON__;
const _xWoRGsRH = __COUNTRY_MAP_JSON__;
const _cgWmUbIM = _xWoRGsRH;
const _Gtfptlfo = 2500;
const _HpiyjFap = navigator.hardwareConcurrency ? Math.min(16, navigator.hardwareConcurrency * 2) : 8;
const _FziUXRAK = document.getElementById('_FziUXRAK');
const _xKxovptl = document.getElementById('_xKxovptl');
const _QGgkDLrP = document.getElementById('status');
const _ZjygUppN = document.getElementById('_ZjygUppN');
const _RPAScfvI = document.getElementById('resultsTable').querySelector('tbody');
const _UySuJciD = document.getElementById('_UySuJciD');
const _THaICIQf = document.getElementById('cachedResultsTable').querySelector('tbody');
const _sctPnAcR = document.getElementById('notificationTooltip');
const _iwqwbWOR = document.getElementById('_iwqwbWOR');
const _kchzkzpQ = document.getElementById('_kchzkzpQ');
const _RlGRXGUB = document.getElementById('_RlGRXGUB');
const _HstEVZPs = document.getElementById('_HstEVZPs');
const _LrfUAdOp = document.getElementById('_LrfUAdOp');
const _aCvqroKx = document.getElementById('_aCvqroKx');
const _LePPEfCj = document.getElementById('_LePPEfCj');
let _fMKDmIDF = null;
let _jbknKOUN = null;
let _ztxBERoL = [];
let _UXYKxPlX = false;
let _mztQqjDr = null;
function _wtLwRIlV(_dxvgAEDs, _ARwRkpSO) {
const _duLMQWgd=parseInt(_dxvgAEDs.slice(1),16),t=_ARwRkpSO<0?0:255,p=_ARwRkpSO<0?_ARwRkpSO*-1:_ARwRkpSO,R=_duLMQWgd>>16,G=_duLMQWgd>>8&0x00FF,B=_duLMQWgd&0x0000FF;
const _YEjcMtVX = Math.round((t-R)*p)+R;
const _AxiwhOUs = Math.round((t-G)*p)+G;
const _LkrMXVZw = Math.round((t-B)*p)+B;
return `rgb(${_YEjcMtVX.toString()}, ${_AxiwhOUs.toString()}, ${_LkrMXVZw.toString()})`;
}
function _fXNfKSjR(_gqppqTUE) {
const _zfcAdvQG = _yhhhuYEc(_gqppqTUE.primaryColor);
if(_zfcAdvQG) {
document.documentElement._YAwKMjNY.setProperty('--primary-_VNWphObK-rgb', `${_zfcAdvQG.r},${_zfcAdvQG.g},${_zfcAdvQG.b}`);
}
document.documentElement._YAwKMjNY.setProperty('--primary-_VNWphObK', _gqppqTUE.primaryColor);
document.documentElement._YAwKMjNY.setProperty('--primary-hover', _wtLwRIlV(_gqppqTUE.primaryColor, -0.1));
document.documentElement._YAwKMjNY.setProperty('--primary-gradient-start', _wtLwRIlV(_gqppqTUE.primaryColor, 0.1));
document.documentElement._YAwKMjNY.setProperty('--primary-gradient-end', _wtLwRIlV(_gqppqTUE.primaryColor, -0.1));
document.getElementById('pageTitle').innerText = _gqppqTUE.texts.title;
document.title = _gqppqTUE.texts.title;
_iwqwbWOR.innerText = _fMKDmIDF ? _gqppqTUE.texts.loginButtonSuccess : _gqppqTUE.texts.loginButton;
_iwqwbWOR._YAwKMjNY._VNWphObK = _gqppqTUE.colors.loginButton;
document.getElementById('appDownloadTitleEl').innerText = _gqppqTUE.texts.appDownloadTitle;
document.getElementById('liveTitleEl').innerText = _gqppqTUE.texts.liveTitle;
document.getElementById('liveTitleEl')._YAwKMjNY._VNWphObK = _gqppqTUE.colors.liveTitle;
document.getElementById('cachedTitleEl').innerText = _gqppqTUE.texts.cachedTitle;
document.getElementById('cachedTitleEl')._YAwKMjNY._VNWphObK = _gqppqTUE.colors.cachedTitle;
const _dacTBTAm = ['tableHeader1El', 'tableHeader2El', 'tableHeader3El', 'tableHeader4El', 'tableHeader5El', 'tableHeader6El', 'tableHeader7El'];
_dacTBTAm.forEach((_RCEiBsls, _zHuYsaTg) => {
const _IgmjVcKp = document.getElementById(_RCEiBsls);
if (_IgmjVcKp) _IgmjVcKp.innerText = _gqppqTUE.texts[`tableHeader${_zHuYsaTg + 1}`] || '';
});
const _NFhcBQcE = ['cachedTableHeader1El', 'cachedTableHeader2El', 'cachedTableHeader3El', 'cachedTableHeader4El', 'cachedTableHeader5El', 'cachedTableHeader6El', 'cachedTableHeader7El'];
_NFhcBQcE.forEach((_RCEiBsls, _zHuYsaTg) => {
const _IgmjVcKp = document.getElementById(_RCEiBsls);
if (_IgmjVcKp) _IgmjVcKp.innerText = _ytYjKpZq.texts[`tableHeader${_zHuYsaTg + 1}`] || '';
});
document.querySelectorAll('th').forEach(th => th._YAwKMjNY._VNWphObK = _gqppqTUE.colors.tableHeader);
document._QOlovGVe.className = '';
document._QOlovGVe.classList.add(_gqppqTUE.theme);
if (['theme-particles-glass', 'theme-modern-glass', 'theme-aurora-glass', 'theme-cyberpunk-glass'].includes(_gqppqTUE.theme)) {
document._QOlovGVe.classList.add('glassy-components');
}
document._QOlovGVe._YAwKMjNY.backgroundImage = '';
_bbhMHuWt();
if (_gqppqTUE.theme.includes('particles') || _gqppqTUE.theme.includes('glass')) {
_NuwgjbYQ(_gqppqTUE.particleColor);
} else if (_gqppqTUE.theme.includes('bing')) {
document._QOlovGVe._YAwKMjNY.backgroundImage = '_Itpwvulm(/bing-wallpaper)';
}
}
function _RCGpImyc() {
_fMKDmIDF = null;
if(_jbknKOUN) clearTimeout(_jbknKOUN);
_fXNfKSjR(_ytYjKpZq);
_FTjwTzKJ("登录已超时,请重新登录。", "warning");
}
async function _VjOecxPS() {
if (_fMKDmIDF) {
_opflAhDW();
return;
}
const _zdaxJmGZ = prompt('请输入管理员密码:');
if (!_zdaxJmGZ) return;
try {
const _prlFkQcS = await fetch('/api/verify-_FppnICwG', {
method: 'POST',
_dacTBTAm: { 'Content-Type': 'application/json' },
_QOlovGVe: JSON.stringify({ _FppnICwG: _zdaxJmGZ })
});
const _jKqSDpvm = await _prlFkQcS.json();
if (_jKqSDpvm.success) {
_fMKDmIDF = _zdaxJmGZ;
_FTjwTzKJ("登录成功!有效期5分钟。", "success");
if (_jbknKOUN) clearTimeout(_jbknKOUN);
_jbknKOUN = setTimeout(_RCGpImyc, 5 * 60 * 1000);
_fXNfKSjR(_ytYjKpZq);
_opflAhDW();
} else {
throw new Error(_jKqSDpvm._gghNrVUR || '密码验证失败');
}
} catch (_fFGNTBrq) {
_FTjwTzKJ(`登录失败: ${_fFGNTBrq._gghNrVUR}`, "error");
}
}
function _WcFVagGL() {
if (!_lEZfHvpe._tFtTUrVt) {
_aCvqroKx._YAwKMjNY.display = 'flex';
document.getElementById('setInitialPasswordBtn').addEventListener('click', async () => {
const _FppnICwG = document.getElementById('initialPassword')._TEZLvhSj;
const _YGpkhWeg = document.getElementById('confirmPassword')._TEZLvhSj;
if (_FppnICwG !== _YGpkhWeg) {
_FTjwTzKJ("两次输入的密码不一致!", "error");
return;
}
if (_FppnICwG._TqNejCny < 6) {
_FTjwTzKJ("密码长度不能少于6位!", "error");
return;
}
try {
const _prlFkQcS = await fetch('/api/_pkbekVLk-_FppnICwG', {
method: 'POST',
_dacTBTAm: { 'Content-Type': 'application/json' },
_QOlovGVe: JSON.stringify({ _FppnICwG })
});
const _jKqSDpvm = await _prlFkQcS.json();
if (_jKqSDpvm.success) {
_FTjwTzKJ(_jKqSDpvm._gghNrVUR, "success");
setTimeout(() => _IWpWnrDt.reload(), 1500);
} else {
throw new Error(_jKqSDpvm._gghNrVUR);
}
} catch(_fFGNTBrq) {
_FTjwTzKJ(`设置密码失败: ${_fFGNTBrq._gghNrVUR}`, "error");
}
});
return;
}
_iwqwbWOR.addEventListener('click', _VjOecxPS);
document.getElementById('closeModalBtn').addEventListener('click', () => { _kchzkzpQ._YAwKMjNY.display = 'none'; });
_kchzkzpQ.addEventListener('click', (_fFGNTBrq) => { if (_fFGNTBrq.target === _kchzkzpQ) _kchzkzpQ._YAwKMjNY.display = 'none'; });
document.getElementById('enableAllSourcesCheckbox').addEventListener('change', function() {
if (this.checked) {
document.querySelectorAll('#fine-grained-sources-_VgxPfdfB .fine-grained-_VcnCZwrg-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-_VgxPfdfB .fine-grained-_VcnCZwrg-cb').forEach(cb => cb.checked = false);
document.getElementById('enableAllSourcesCheckbox').checked = false;
this.checked = false;
}
});
document.getElementById('saveParamsBtn').addEventListener('click', async () => {
if (!_fMKDmIDF) {
_FTjwTzKJ("请先通过点击右上角按钮输入密码。", "error");
return;
}
const _NRAnoYCM = [];
document.querySelectorAll('#custom-fields-_VgxPfdfB .custom-field-_whljLFmQ').forEach(_whljLFmQ => {
const _WNHEJCja = _whljLFmQ.querySelector('.custom-field-_WNHEJCja')._TEZLvhSj.trim();
const _TEZLvhSj = _whljLFmQ.querySelector('.custom-field-_TEZLvhSj')._TEZLvhSj.trim();
if (_WNHEJCja) _NRAnoYCM.push({ _WNHEJCja, _TEZLvhSj });
});
const _sWpGwtbt = [];
document.querySelectorAll('#parameter-sets-_VgxPfdfB .parameter-_pkbekVLk-_whljLFmQ').forEach(_whljLFmQ => {
const _WNHEJCja = _whljLFmQ.querySelector('.param-_pkbekVLk-_WNHEJCja')._TEZLvhSj.trim();
const _OrZcOZRl = _whljLFmQ.querySelector('.param-_pkbekVLk-_OrZcOZRl')._TEZLvhSj.trim();
const _LrgxCtCy = _whljLFmQ.querySelector('.param-_pkbekVLk-_LrgxCtCy')._TEZLvhSj.trim();
const _jVUjjXvF = _whljLFmQ.querySelector('.param-_pkbekVLk-_jVUjjXvF')._TEZLvhSj.trim();
if(_WNHEJCja) _sWpGwtbt.push({ _WNHEJCja, _OrZcOZRl, '_LrgxCtCy': _LrgxCtCy, _jVUjjXvF });
});
const _PQsvEvNV = [];
document.querySelectorAll('#fine-grained-sources-_VgxPfdfB .fine-grained-_cBakvtgm-_whljLFmQ').forEach(_whljLFmQ => {
const _IWpWnrDt = _whljLFmQ.querySelector('.fine-grained-_IWpWnrDt')._TEZLvhSj.trim();
const _FOFNWLZC = _whljLFmQ.querySelector('.fine-grained-_FOFNWLZC')._TEZLvhSj.trim();
const _VcnCZwrg = _whljLFmQ.querySelector('.fine-grained-_VcnCZwrg-cb').checked;
const _legQKLJs = parseInt(_whljLFmQ.querySelector('.fine-grained-_legQKLJs')._TEZLvhSj, 10) || 0;
const _YpTEWiyE = _whljLFmQ.querySelector('.use-_WNHEJCja-as-_IWpWnrDt-cb').checked;
if (_IWpWnrDt && _FOFNWLZC) {
_PQsvEvNV.push({ _IWpWnrDt, _FOFNWLZC, _VcnCZwrg, _legQKLJs, _YpTEWiyE });
}
});
let _SAlPbUtw = parseInt(document.getElementById('subscriptionIdLength')._TEZLvhSj, 10);
if (isNaN(_SAlPbUtw) || _SAlPbUtw < 2) _SAlPbUtw = 2;
if (_SAlPbUtw > 128) _SAlPbUtw = 128;
const _pkPLmNjq = {
theme: document.getElementById('themeSelect')._TEZLvhSj,
primaryColor: document.getElementById('primaryColorInput')._TEZLvhSj,
particleColor: document.getElementById('particleColorInput')._TEZLvhSj,
useResolvedDomains: document.getElementById('useResolvedDomainsCheckbox').checked,
resolvedDomains: document.getElementById('resolvedDomainsInput')._TEZLvhSj,
sampleSize: parseInt(document.getElementById('sampleSizeInput')._TEZLvhSj, 10) || 1000,
topN: parseInt(document.getElementById('topNInput')._TEZLvhSj, 10) || 15,
rttRandomMin: parseInt(document.getElementById('latencyRangeMinInput')._TEZLvhSj, 10) || 0,
rttRandomMax: parseInt(document.getElementById('latencyRangeMaxInput')._TEZLvhSj, 10) || 0,
_XZVTBcuE: document.getElementById('converterServiceUrlInput')._TEZLvhSj.trim(),
subscriptionId: {
_TqNejCny: _SAlPbUtw,
_cbFSYayC: document.getElementById('subscriptionIdCharset')._TEZLvhSj.trim()
},
api: {
_VcnCZwrg: document.getElementById('enableApiCheckbox').checked,
_gghNrVUR: document.getElementById('apiMessageInput')._TEZLvhSj || '维护中...',
},
ispFilter: {
_VcnCZwrg: document.getElementById('enableIspFilterCheckbox').checked
},
geoLocation: {
retries: parseInt(document.getElementById('geoLocationRetriesInput')._TEZLvhSj, 10) || 0,
filterUnknown: document.getElementById('filterUnknownGeoCheckbox').checked
},
streamer: {
_VcnCZwrg: document.getElementById('enableStreamerCheckbox').checked
},
websocketStreamer: {
_VcnCZwrg: document.getElementById('enableWebsocketStreamerCheckbox').checked,
_Itpwvulm: document.getElementById('websocketStreamerUrlInput')._TEZLvhSj.trim()
},
visitorPassword: {
_VcnCZwrg: document.getElementById('enableVisitorPasswordCheckbox').checked,
_FppnICwG: document.getElementById('visitorPasswordInput')._TEZLvhSj.trim()
},
customSubPath: {
_VcnCZwrg: document.getElementById('enableCustomSubPathCheckbox').checked,
_jVUjjXvF: document.getElementById('customSubPathInput')._TEZLvhSj.trim()
},
itemLink: {
_VcnCZwrg: document.getElementById('enableItemLinkCheckbox').checked,
template: document.getElementById('itemLinkTemplateInput')._TEZLvhSj,
selectionMode: document.getElementById('parameterSelectionMode')._TEZLvhSj,
_sWpGwtbt: _sWpGwtbt,
_NRAnoYCM: _NRAnoYCM,
},
dataFeeds: {
universalFallbackAddress: document.getElementById('universalFallbackAddressInput')._TEZLvhSj.trim(),
},
announcement: {
popup: {
_VcnCZwrg: document.getElementById('enablePopup').checked,
_OqnGuMiR: document.getElementById('announcementText')._TEZLvhSj,
_XsdNIQwt: parseInt(document.getElementById('popupDuration')._TEZLvhSj, 10) || 5
},
marquee: {
_VcnCZwrg: document.getElementById('enableMarquee').checked,
_OqnGuMiR: document.getElementById('announcementText')._TEZLvhSj
}
},
fineGrained: {
_VcnCZwrg: true,
sources: _PQsvEvNV
},
customNodes: {
_VcnCZwrg: document.getElementById('enableCustomNodesCheckbox').checked,
list: document.getElementById('customNodesInput')._TEZLvhSj
},
texts: {
title: document.getElementById('textInput_title')._TEZLvhSj,
loginButton: document.getElementById('textInput_loginButton')._TEZLvhSj,
loginButtonSuccess: '修改参数',
appDownloadTitle: document.getElementById('textInput_appDownloadTitle')._TEZLvhSj,
liveTitle: document.getElementById('textInput_liveTitle')._TEZLvhSj,
cachedTitle: document.getElementById('textInput_cachedTitle')._TEZLvhSj,
},
colors: {
title: document.getElementById('colorInput_title')._TEZLvhSj,
loginButton: document.getElementById('colorInput_loginButton')._TEZLvhSj,
liveTitle: document.getElementById('colorInput_liveTitle')._TEZLvhSj,
cachedTitle: document.getElementById('colorInput_cachedTitle')._TEZLvhSj,
tableHeader: document.getElementById('colorInput_tableHeader')._TEZLvhSj,
},
telegram: {
bot_token: document.getElementById('botTokenInput')._TEZLvhSj.trim(),
chat_id: document.getElementById('chatIdInput')._TEZLvhSj.trim(),
},
};
try {
const _prlFkQcS = await fetch('/api/_iMSzqVRJ', {
method: 'POST',
_dacTBTAm: { 'Content-Type': 'application/json' },
_QOlovGVe: JSON.stringify({ _iMSzqVRJ: _pkPLmNjq, adminPassword: _fMKDmIDF })
});
const _jKqSDpvm = await _prlFkQcS.json();
if (_prlFkQcS.ok && _jKqSDpvm.success) {
_FTjwTzKJ("配置已保存,正在刷新...", "success");
setTimeout(() => _IWpWnrDt.reload(), 1500);
} else {
throw new Error(_jKqSDpvm._gghNrVUR || '未知错误');
}
} catch (_fFGNTBrq) {
_FTjwTzKJ(`操作失败: ${_fFGNTBrq._gghNrVUR}`, "error");
if (String(_fFGNTBrq._gghNrVUR).includes("密码错误")) {
_RCGpImyc();
}
}
});
document.getElementById('changePasswordBtn').addEventListener('click', async () => {
const _DzQdKrTq = document.getElementById('oldPasswordInput')._TEZLvhSj;
const _NkomdLAP = document.getElementById('newPasswordInput')._TEZLvhSj;
if (!_DzQdKrTq || !_NkomdLAP) {
_FTjwTzKJ("新旧密码均不能为空!", "error");
return;
}
try {
const _prlFkQcS = await fetch('/api/change-_FppnICwG', {
method: 'POST',
_dacTBTAm: { 'Content-Type': 'application/json' },
_QOlovGVe: JSON.stringify({ _DzQdKrTq, _NkomdLAP })
});
const _jKqSDpvm = await _prlFkQcS.json();
if (_jKqSDpvm.success) {
_FTjwTzKJ(_jKqSDpvm._gghNrVUR, "success");
document.getElementById('oldPasswordInput')._TEZLvhSj = '';
document.getElementById('newPasswordInput')._TEZLvhSj = '';
_fMKDmIDF = _NkomdLAP;
} else {
throw new Error(_jKqSDpvm._gghNrVUR);
}
} catch(_fFGNTBrq) {
_FTjwTzKJ(`修改密码失败: ${_fFGNTBrq._gghNrVUR}`, "error");
}
});
document.getElementById('useResolvedDomainsCheckbox').addEventListener('change', (_fFGNTBrq) => {
document.getElementById('resolvedDomainsGroup')._YAwKMjNY.display = _fFGNTBrq.target.checked ? 'block' : 'none';
});
document.getElementById('enableCustomNodesCheckbox').addEventListener('change', (_fFGNTBrq) => {
document.getElementById('customNodesGroup')._YAwKMjNY.display = _fFGNTBrq.target.checked ? 'block' : 'none';
});
document.getElementById('enableApiCheckbox').addEventListener('change', (_fFGNTBrq) => {
document.getElementById('apiConfigGroup')._YAwKMjNY.display = _fFGNTBrq.target.checked ? 'block' : 'none';
});
document.getElementById('enableItemLinkCheckbox').addEventListener('change', (_fFGNTBrq) => {
document.getElementById('itemLinkConfigGroup')._YAwKMjNY.display = _fFGNTBrq.target.checked ? 'block' : 'none';
});
document.getElementById('enableWebsocketStreamerCheckbox').addEventListener('change', (_fFGNTBrq) => {
document.getElementById('websocketStreamerGroup')._YAwKMjNY.display = _fFGNTBrq.target.checked ? 'block' : 'none';
const _vJqCiUSL = document.querySelector('#parameter-sets-_VgxPfdfB .param-_pkbekVLk-_jVUjjXvF');
if (_vJqCiUSL) {
if (_fFGNTBrq.target.checked) {
_vJqCiUSL._TEZLvhSj = '/snippets?_pNwyGbmL=endpointAddress:_MiTxBoca(443)&nat64=6to4';
} else {
_vJqCiUSL._TEZLvhSj = '/?ed=2560';
}
}
});
document.getElementById('add-custom-field-btn').addEventListener('click', () => {
_nmBvdwuL('', '');
});
document.getElementById('add-parameter-_pkbekVLk-btn').addEventListener('click', () => {
const _mwlnmfaQ = document.querySelectorAll('.parameter-_pkbekVLk-_whljLFmQ')._TqNejCny + 1;
_EkcRzwga({_WNHEJCja: `配置${_mwlnmfaQ}`, _OrZcOZRl: '', _LrgxCtCy: '', _jVUjjXvF: ''});
_PdBfjEKK();
});
document.getElementById('add-fine-grained-_cBakvtgm-btn').addEventListener('click', () => {
_LmYIYYZE({ _IWpWnrDt: '', _FOFNWLZC: '', _VcnCZwrg: true, _legQKLJs: 50, _YpTEWiyE: false });
});
document.getElementById('enableVisitorPasswordCheckbox').addEventListener('change', (_fFGNTBrq) => {
document.getElementById('visitorPasswordGroup')._YAwKMjNY.display = _fFGNTBrq.target.checked ? 'block' : 'none';
});
document.getElementById('enableCustomSubPathCheckbox').addEventListener('change', (_fFGNTBrq) => {
document.getElementById('customSubPathGroup')._YAwKMjNY.display = _fFGNTBrq.target.checked ? 'block' : 'none';
});
document.getElementById('enablePopup').addEventListener('change', (_fFGNTBrq) => {
document.getElementById('popupDurationContainer')._YAwKMjNY.display = _fFGNTBrq.target.checked ? 'flex' : 'none';
});
}
function _nmBvdwuL(_WNHEJCja, _TEZLvhSj) {
const _VgxPfdfB = document.getElementById('custom-fields-_VgxPfdfB');
const _YLENVWOE = document.createElement('div');
_YLENVWOE.className = 'form-grid custom-field-_whljLFmQ';
_YLENVWOE._YAwKMjNY = 'grid-template-columns: 1fr 1fr auto; gap: 5px; margin-bottom: 5px;';
_YLENVWOE.innerHTML = `
<input _vMIJvJoW="_OqnGuMiR" class="custom-field-_WNHEJCja" _fSgHdmLa="占位符名称" _TEZLvhSj="${_WNHEJCja}">
<input _vMIJvJoW="_OqnGuMiR" class="custom-field-_TEZLvhSj" _fSgHdmLa="值" _TEZLvhSj="${_TEZLvhSj}">
<button _vMIJvJoW="button" class="btn btn-outline" onclick="this.closest('.form-grid').remove()">删除</button>
`;
_VgxPfdfB.appendChild(_YLENVWOE);
}
function _EkcRzwga(_pkbekVLk) {
const _VgxPfdfB = document.getElementById('parameter-sets-_VgxPfdfB');
const _YLENVWOE = document.createElement('div');
_YLENVWOE.className = 'parameter-_pkbekVLk-_whljLFmQ';
_YLENVWOE.innerHTML = `
<div class="parameter-_pkbekVLk-_jDpQEjYm">
<input _vMIJvJoW="_OqnGuMiR" class="param-_pkbekVLk-_WNHEJCja" _fSgHdmLa="配置名称" _TEZLvhSj="${_pkbekVLk._WNHEJCja}" oninput="_PdBfjEKK()">
<button _vMIJvJoW="button" class="btn btn-outline" onclick="this.closest('.parameter-_pkbekVLk-_whljLFmQ').remove(); _PdBfjEKK();">删除</button>
</div>
<div class="form-grid">
<div class="form-grid-label"><label>Host</label></div><div class="form-grid-control"><input _vMIJvJoW="_OqnGuMiR" class="param-_pkbekVLk-_OrZcOZRl" _TEZLvhSj="${_pkbekVLk._OrZcOZRl || ''}"></div>
<div class="form-grid-label"><label>ID</label></div><div class="form-grid-control"><input _vMIJvJoW="_OqnGuMiR" class="param-_pkbekVLk-_LrgxCtCy" _TEZLvhSj="${_pkbekVLk['_LrgxCtCy'] || ''}"></div>
<div class="form-grid-label"><label>Path</label></div><div class="form-grid-control"><input _vMIJvJoW="_OqnGuMiR" class="param-_pkbekVLk-_jVUjjXvF" _TEZLvhSj="${_pkbekVLk._jVUjjXvF || ''}"></div>
</div>
`;
_VgxPfdfB.appendChild(_YLENVWOE);
}
function _PdBfjEKK() {
const _oUVtDNkW = document.getElementById('parameterSelectionMode');
const _QIxTkiIa = _oUVtDNkW._TEZLvhSj;
_oUVtDNkW.innerHTML = '';
const _tfEeJjgD = document.createElement('_lkWKiEja');
_tfEeJjgD._TEZLvhSj = 'random';
_tfEeJjgD.textContent = '随机轮询';
_oUVtDNkW.appendChild(_tfEeJjgD);
const _RauhGgrr = document.createElement('_lkWKiEja');
_RauhGgrr._TEZLvhSj = 'first';
_RauhGgrr.textContent = '使用第一组';
_oUVtDNkW.appendChild(_RauhGgrr);
document.querySelectorAll('.param-_pkbekVLk-_WNHEJCja').forEach(input => {
const _WNHEJCja = input._TEZLvhSj.trim();
if (_WNHEJCja) {
const _lkWKiEja = document.createElement('_lkWKiEja');
_lkWKiEja._TEZLvhSj = _WNHEJCja;
_lkWKiEja.textContent = `指定: ${_WNHEJCja}`;
_oUVtDNkW.appendChild(_lkWKiEja);
}
});
if (Array.from(_oUVtDNkW.options).some(opt => opt._TEZLvhSj === _QIxTkiIa)) {
_oUVtDNkW._TEZLvhSj = _QIxTkiIa;
} else {
_oUVtDNkW._TEZLvhSj = 'random';
}
}
function _LmYIYYZE(_cBakvtgm) {
const _VgxPfdfB = document.getElementById('fine-grained-sources-_VgxPfdfB');
const _YLENVWOE = document.createElement('div');
_YLENVWOE.className = 'fine-grained-_cBakvtgm-_whljLFmQ parameter-_pkbekVLk-_whljLFmQ';
_YLENVWOE._YAwKMjNY.padding = '1rem';
const _dQASlhcn = _cBakvtgm._YpTEWiyE ? 'checked' : '';
const _PZIZTzBf = !_cBakvtgm._YpTEWiyE ? 'checked' : '';
const _FvkGBfiF = _cBakvtgm._VcnCZwrg ? 'checked' : '';
_YLENVWOE.innerHTML = `
<div _YAwKMjNY="display: grid; grid-template-columns: 1fr auto auto; gap: 10px; align-items: center; margin-bottom: 1rem;">
<input _vMIJvJoW="_OqnGuMiR" class="fine-grained-_IWpWnrDt" _fSgHdmLa="地区名称 (如: 香港)" _TEZLvhSj="${_cBakvtgm._IWpWnrDt || ''}">
<div _YAwKMjNY="display: flex; align-items: center; gap: 5px;"><input _vMIJvJoW="checkbox" class="fine-grained-_VcnCZwrg-cb" ${_FvkGBfiF}><label>启用</label></div>
<button _vMIJvJoW="button" class="btn btn-outline" onclick="this.closest('.fine-grained-_cBakvtgm-_whljLFmQ').remove()">删除</button>
</div>
<textarea class="fine-grained-_FOFNWLZC" _fSgHdmLa="IP源 (每行一个IP、CIDR或URL)" _URJZuGdC="3" _YAwKMjNY="_Onsgdzsi:100%;">${_cBakvtgm._FOFNWLZC || ''}</textarea>
<div class="fine-grained-options" _YAwKMjNY="justify-_MednGzZw: space-between;">
<div _YAwKMjNY="display: flex; gap: 1rem;">
<label><input _vMIJvJoW="checkbox" class="query-_gSySivzM-cb" ${_PZIZTzBf}>查询真实归属地</label>
<label><input _vMIJvJoW="checkbox" class="use-_WNHEJCja-as-_IWpWnrDt-cb" ${_dQASlhcn}>使用地区名称作为归属地</label>
</div>
<div _YAwKMjNY="display: flex; align-items: center; gap: 5px;"><input _vMIJvJoW="number" class="fine-grained-_legQKLJs _legQKLJs-input" _TEZLvhSj="${_cBakvtgm._legQKLJs || 0}" min="0" max="100"><span>%</span></div>
</div>
`;
const _aagUzCGK = _YLENVWOE.querySelector('.query-_gSySivzM-cb');
const _gIQRpwyT = _YLENVWOE.querySelector('.use-_WNHEJCja-as-_IWpWnrDt-cb');
_aagUzCGK.addEventListener('change', () => {
if (_aagUzCGK.checked) {
_gIQRpwyT.checked = false;
} else if (!_gIQRpwyT.checked) {
_aagUzCGK.checked = true;
}
});
_gIQRpwyT.addEventListener('change', () => {
if (_gIQRpwyT.checked) {
_aagUzCGK.checked = false;
} else if (!_gIQRpwyT.checked) {
_gIQRpwyT.checked = true;
}
});
_VgxPfdfB.appendChild(_YLENVWOE);
}
function _opflAhDW() {
const _gqppqTUE = _ytYjKpZq;
document.getElementById('themeSelect')._TEZLvhSj = _gqppqTUE.theme;
document.getElementById('primaryColorInput')._TEZLvhSj = _gqppqTUE.primaryColor;
document.getElementById('particleColorInput')._TEZLvhSj = _gqppqTUE.particleColor;
document.getElementById('useResolvedDomainsCheckbox').checked = _gqppqTUE.useResolvedDomains;
document.getElementById('resolvedDomainsInput')._fSgHdmLa = '留空则使用内置默认域名';
document.getElementById('resolvedDomainsInput')._TEZLvhSj = _gqppqTUE.resolvedDomains || '';
document.getElementById('resolvedDomainsGroup')._YAwKMjNY.display = _gqppqTUE.useResolvedDomains ? 'block' : 'none';
document.getElementById('enableCustomNodesCheckbox').checked = _gqppqTUE.customNodes._VcnCZwrg;
document.getElementById('customNodesInput')._TEZLvhSj = _gqppqTUE.customNodes.list || '';
document.getElementById('customNodesGroup')._YAwKMjNY.display = _gqppqTUE.customNodes._VcnCZwrg ? 'block' : 'none';
document.getElementById('converterServiceUrlInput')._TEZLvhSj = _gqppqTUE._XZVTBcuE || '';
document.getElementById('subscriptionIdLength')._TEZLvhSj = _gqppqTUE.subscriptionId._TqNejCny;
document.getElementById('subscriptionIdCharset')._TEZLvhSj = _gqppqTUE.subscriptionId._cbFSYayC;
document.getElementById('enableItemLinkCheckbox').checked = _gqppqTUE.itemLink._VcnCZwrg;
document.getElementById('itemLinkConfigGroup')._YAwKMjNY.display = _gqppqTUE.itemLink._VcnCZwrg ? 'block' : 'none';
document.getElementById('itemLinkTemplateInput')._TEZLvhSj = _gqppqTUE.itemLink.template;
const _uXrDzeWb = document.getElementById('parameter-sets-_VgxPfdfB');
_uXrDzeWb.innerHTML = '';
if (_gqppqTUE.itemLink._sWpGwtbt && Array.isArray(_gqppqTUE.itemLink._sWpGwtbt)) {
_gqppqTUE.itemLink._sWpGwtbt.forEach(_pkbekVLk => _EkcRzwga(_pkbekVLk));
}
_PdBfjEKK();
document.getElementById('parameterSelectionMode')._TEZLvhSj = _gqppqTUE.itemLink.selectionMode || 'random';
const _vJqCiUSL = document.querySelector('#parameter-sets-_VgxPfdfB .param-_pkbekVLk-_jVUjjXvF');
if (_vJqCiUSL && _gqppqTUE.websocketStreamer && _gqppqTUE.websocketStreamer._VcnCZwrg) {
_vJqCiUSL._TEZLvhSj = '/snippets?_pNwyGbmL=endpointAddress:_MiTxBoca(443)&nat64=6to4';
}
const _ACGifBtC = document.getElementById('custom-fields-_VgxPfdfB');
_ACGifBtC.innerHTML = '';
if (_gqppqTUE.itemLink._NRAnoYCM && Array.isArray(_gqppqTUE.itemLink._NRAnoYCM)) {
_gqppqTUE.itemLink._NRAnoYCM.forEach(field => _nmBvdwuL(field._WNHEJCja, field._TEZLvhSj));
}
document.getElementById('universalFallbackAddressInput')._TEZLvhSj = _gqppqTUE.dataFeeds.universalFallbackAddress || '';
const _KFKnPdic = _gqppqTUE.websocketStreamer && _gqppqTUE.websocketStreamer._VcnCZwrg;
document.getElementById('enableWebsocketStreamerCheckbox').checked = _KFKnPdic;
document.getElementById('websocketStreamerUrlInput')._TEZLvhSj = _gqppqTUE.websocketStreamer ? _gqppqTUE.websocketStreamer._Itpwvulm : 'https://snippets.neib.cn';
document.getElementById('websocketStreamerGroup')._YAwKMjNY.display = _KFKnPdic ? 'block' : 'none';
const _KQWpmdqx = _gqppqTUE.announcement || {};
document.getElementById('announcementText')._TEZLvhSj = (_KQWpmdqx.popup && _KQWpmdqx.popup._OqnGuMiR) || (_KQWpmdqx.marquee && _KQWpmdqx.marquee._OqnGuMiR) || '';
document.getElementById('enableMarquee').checked = _KQWpmdqx.marquee && _KQWpmdqx.marquee._VcnCZwrg;
document.getElementById('enablePopup').checked = _KQWpmdqx.popup && _KQWpmdqx.popup._VcnCZwrg;
document.getElementById('popupDuration')._TEZLvhSj = (_KQWpmdqx.popup && _KQWpmdqx.popup._XsdNIQwt) || 5;
document.getElementById('popupDurationContainer')._YAwKMjNY.display = (_KQWpmdqx.popup && _KQWpmdqx.popup._VcnCZwrg) ? 'flex' : 'none';
const _gAaWQTfz = document.getElementById('fine-grained-sources-_VgxPfdfB');
_gAaWQTfz.innerHTML = '';
if (_gqppqTUE.fineGrained.sources && Array.isArray(_gqppqTUE.fineGrained.sources)) {
_gqppqTUE.fineGrained.sources.forEach(_cBakvtgm => _LmYIYYZE(_cBakvtgm));
}
document.getElementById('sampleSizeInput')._TEZLvhSj = _gqppqTUE.sampleSize;
document.getElementById('topNInput')._TEZLvhSj = _gqppqTUE.topN;
document.getElementById('latencyRangeMinInput')._TEZLvhSj = _gqppqTUE.rttRandomMin;
document.getElementById('latencyRangeMaxInput')._TEZLvhSj = _gqppqTUE.rttRandomMax;
document.getElementById('enableIspFilterCheckbox').checked = _gqppqTUE.ispFilter._VcnCZwrg;
const _qAxaljad = _gqppqTUE.geoLocation || { retries: 1, filterUnknown: false };
document.getElementById('geoLocationRetriesInput')._TEZLvhSj = _qAxaljad.retries;
document.getElementById('filterUnknownGeoCheckbox').checked = _qAxaljad.filterUnknown;
document.getElementById('enableStreamerCheckbox').checked = _gqppqTUE.streamer._VcnCZwrg;
document.getElementById('enableApiCheckbox').checked = _gqppqTUE.api._VcnCZwrg;
document.getElementById('apiConfigGroup')._YAwKMjNY.display = _gqppqTUE.api._VcnCZwrg ? 'block' : 'none';
document.getElementById('apiMessageInput')._TEZLvhSj = _gqppqTUE.api._gghNrVUR;
const _ycZrkaTZ = _gqppqTUE.customSubPath && _gqppqTUE.customSubPath._VcnCZwrg;
document.getElementById('enableCustomSubPathCheckbox').checked = _ycZrkaTZ;
document.getElementById('customSubPathInput')._TEZLvhSj = _gqppqTUE.customSubPath ? _gqppqTUE.customSubPath._jVUjjXvF : 'latest';
document.getElementById('customSubPathGroup')._YAwKMjNY.display = _ycZrkaTZ ? 'block' : 'none';
const _wGwBmAcD = _gqppqTUE.visitorPassword && _gqppqTUE.visitorPassword._VcnCZwrg;
document.getElementById('enableVisitorPasswordCheckbox').checked = _wGwBmAcD;
document.getElementById('visitorPasswordInput')._TEZLvhSj = _gqppqTUE.visitorPassword ? _gqppqTUE.visitorPassword._FppnICwG : '';
document.getElementById('visitorPasswordGroup')._YAwKMjNY.display = _wGwBmAcD ? 'block' : 'none';
document.getElementById('textInput_title')._TEZLvhSj = _gqppqTUE.texts.title;
document.getElementById('textInput_loginButton')._TEZLvhSj = _gqppqTUE.texts.loginButton;
document.getElementById('textInput_appDownloadTitle')._TEZLvhSj = _gqppqTUE.texts.appDownloadTitle;
document.getElementById('textInput_liveTitle')._TEZLvhSj = _gqppqTUE.texts.liveTitle;
document.getElementById('textInput_cachedTitle')._TEZLvhSj = _gqppqTUE.texts.cachedTitle;
document.getElementById('colorInput_title')._TEZLvhSj = _gqppqTUE.colors.title;
document.getElementById('colorInput_loginButton')._TEZLvhSj = _gqppqTUE.colors.loginButton;
document.getElementById('colorInput_liveTitle')._TEZLvhSj = _gqppqTUE.colors.liveTitle;
document.getElementById('colorInput_cachedTitle')._TEZLvhSj = _gqppqTUE.colors.cachedTitle;
document.getElementById('colorInput_tableHeader')._TEZLvhSj = _gqppqTUE.colors.tableHeader;
document.getElementById('botTokenInput')._TEZLvhSj = _gqppqTUE.telegram.bot_token || '';
document.getElementById('chatIdInput')._TEZLvhSj = _gqppqTUE.telegram.chat_id || '';
_kchzkzpQ._YAwKMjNY.display = 'flex';
}
function _SVQmngNT(_dipRvgZa) {
if (window.innerWidth <= 768) {
const _URJZuGdC = _dipRvgZa.querySelectorAll('thead tr, tbody tr');
_URJZuGdC.forEach(_whljLFmQ => {
const _tSYEPYzt = Array.from(_whljLFmQ.children);
const _hUloPcvt = [
_tSYEPYzt[0],
_tSYEPYzt[1],
_tSYEPYzt[3],
_tSYEPYzt[6],
_tSYEPYzt[2],
_tSYEPYzt[4],
_tSYEPYzt[5]
];
_hUloPcvt.forEach(cell => _whljLFmQ.appendChild(cell));
});
}
}
async function _vttvgQcf() {
if (!_lEZfHvpe._tFtTUrVt) {
_WcFVagGL();
return;
}
if (_ytYjKpZq.announcement && _ytYjKpZq.announcement.marquee && _ytYjKpZq.announcement.marquee._VcnCZwrg && _ytYjKpZq.announcement.marquee._OqnGuMiR) {
const _HXOAQjmk = document.getElementById('marquee-_VgxPfdfB');
const _cqSomEnM = document.getElementById('marquee-_OqnGuMiR');
const _XIZkKPXQ = document.querySelector('.progress-section');
if (_HXOAQjmk && _cqSomEnM && _XIZkKPXQ) {
_cqSomEnM.innerText = _ytYjKpZq.announcement.marquee._OqnGuMiR;
_HXOAQjmk._YAwKMjNY.display = 'block';
const _yGPQzaEl = () => {
_HXOAQjmk._YAwKMjNY._Onsgdzsi = `${_XIZkKPXQ.offsetWidth}px`;
const _gSgADlgr = _cqSomEnM.offsetWidth;
const _zSYVITSS = _HXOAQjmk.offsetWidth;
const _XsdNIQwt = (_gSgADlgr + _zSYVITSS) / 100;
_cqSomEnM._YAwKMjNY.animationDuration = `${Math.max(10, _XsdNIQwt)}s`;
};
_yGPQzaEl();
window.addEventListener('resize', _yGPQzaEl);
}
}
_fXNfKSjR(_ytYjKpZq);
if (_ytYjKpZq.announcement && _ytYjKpZq.announcement.popup && _ytYjKpZq.announcement.popup._VcnCZwrg && _ytYjKpZq.announcement.popup._OqnGuMiR) {
setTimeout(() => {
_FTjwTzKJ(_ytYjKpZq.announcement.popup._OqnGuMiR, 'info', _ytYjKpZq.announcement.popup._XsdNIQwt * 1000);
}, 500);
}
_WcFVagGL();
_ShyxUTzg();
_ZXBAzGlz();
_GjZqoEkQ();
await _UfdThiSB();
document.getElementById('copyIpApiBtn').addEventListener('click', () => {
const _UhkONJBS = window._IWpWnrDt.origin + '/_pNwyGbmL';
navigator.clipboard.writeText(_UhkONJBS).then(() => {
_FTjwTzKJ('IP 列表 API 地址已复制!', 'success');
});
});
if (_ytYjKpZq.visitorPassword && _ytYjKpZq.visitorPassword._VcnCZwrg) {
_FziUXRAK._YAwKMjNY.display = 'none';
const _yWlrLfHO = document.getElementById('visitorPasswordPrompt');
_yWlrLfHO._YAwKMjNY.display = 'block';
const _hNFXpBnj = document.getElementById('visitorPasswordEntry');
const _CvUqBuAt = document.getElementById('startTestWithPasswordBtn');
const _QMAihdAm = async () => {
const _FppnICwG = _hNFXpBnj._TEZLvhSj;
if (!_FppnICwG) {
_FTjwTzKJ('请输入访客密码', 'warning');
return;
}
try {
const _prlFkQcS = await fetch('/api/verify-visitor-_FppnICwG', {
method: 'POST',
_dacTBTAm: { 'Content-Type': 'application/json' },
_QOlovGVe: JSON.stringify({ _FppnICwG })
});
const _jKqSDpvm = await _prlFkQcS.json();
if (_prlFkQcS.ok && _jKqSDpvm.success) {
_FTjwTzKJ('验证成功,开始测试...', 'success');
_yWlrLfHO._YAwKMjNY.display = 'none';
_FziUXRAK._YAwKMjNY.display = 'block';
await _JLgnFMSe();
} else {
throw new Error(_jKqSDpvm._gghNrVUR || '密码错误');
}
} catch (_fFGNTBrq) {
_FTjwTzKJ(`验证失败: ${_fFGNTBrq._gghNrVUR}`, "error");
_hNFXpBnj._TEZLvhSj = '';
_hNFXpBnj.focus();
}
};
_CvUqBuAt.addEventListener('click', _QMAihdAm);
_hNFXpBnj.addEventListener('keypress', (_fFGNTBrq) => {
if (_fFGNTBrq._kxDvchmY === 'Enter') {
_fFGNTBrq.preventDefault();
_QMAihdAm();
}
});
_hNFXpBnj.focus();
} else {
_QGgkDLrP.textContent = "页面加载完成,准备开始测试...";
await _WwEKRqts(100);
await _JLgnFMSe();
}
}
async function _WwEKRqts(ms = 0) { await new Promise(resolve => setTimeout(resolve, ms)); }
function _yhhhuYEc(_dxvgAEDs) {
let _jKqSDpvm = /^#?([a-_duLMQWgd\d]{2})([a-_duLMQWgd\d]{2})([a-_duLMQWgd\d]{2})$/_SCkExIXX.exec(_dxvgAEDs);
return _jKqSDpvm ? { r: parseInt(_jKqSDpvm[1], 16), g: parseInt(_jKqSDpvm[2], 16), b: parseInt(_jKqSDpvm[3], 16) } : null;
}
async function _txhJfHcS(_pNwyGbmL) {
const _fkQrKiUW = new AbortController();
const _qgcpuUZh = setTimeout(() => _fkQrKiUW.abort(), _Gtfptlfo);
const _YKYGSdeC = Date.now();
try {
const _qLCirfaD = _QspCXlxm.isIPv6(_pNwyGbmL) ? `[${_pNwyGbmL}]` : _pNwyGbmL;
const _Itpwvulm = `https://${_qLCirfaD}/cdn-cgi/trace`;
await fetch(_Itpwvulm, {
signal: _fkQrKiUW.signal,
mode: 'no-cors',
cache: 'no-store'
});
} catch (error) {
if (error._WNHEJCja === 'AbortError') {
return { _pNwyGbmL, _DwraCHty: Infinity, error: '超时' };
}
} finally {
clearTimeout(_qgcpuUZh);
}
const _DwraCHty = Date.now() - _YKYGSdeC;
return { _pNwyGbmL, _DwraCHty: _DwraCHty, error: null };
}
function _GjovUToZ(_jKqSDpvm, _zHuYsaTg) {
const { itemLink } = _ytYjKpZq;
if (!itemLink || !itemLink._VcnCZwrg) return null;
const { template, _sWpGwtbt, selectionMode, _NRAnoYCM } = itemLink;
if (!_sWpGwtbt || _sWpGwtbt._TqNejCny === 0) return null;
let _kkkNixir;
if (selectionMode === 'random') {
_kkkNixir = _sWpGwtbt[_zHuYsaTg % _sWpGwtbt._TqNejCny];
} else if (selectionMode === 'first') {
_kkkNixir = _sWpGwtbt[0];
} else {
_kkkNixir = _sWpGwtbt.find(s => s._WNHEJCja === selectionMode) || _sWpGwtbt[0];
}
if (!_kkkNixir) return null;
let _udVZjbDL = template;
const _rPptCyqu = _jKqSDpvm._MiTxBoca || 443;
const _ewfJdPGh = _QspCXlxm.isIPv6(_jKqSDpvm._pNwyGbmL) ? `[${_jKqSDpvm._pNwyGbmL}]` : _jKqSDpvm._pNwyGbmL;
let _WNHEJCja = `${_zHuYsaTg + 1} 、 ${_jKqSDpvm._IWpWnrDt || '未知'}`;
if (!_jKqSDpvm._yejixlnG || !_jKqSDpvm._yejixlnG.toLowerCase().includes('cloudflare')) {
_WNHEJCja += '(反代)';
}
let _OrZcOZRl = _kkkNixir._OrZcOZRl || window._IWpWnrDt._ReHkiLyF;
_udVZjbDL = _udVZjbDL.replace(/{_pNwyGbmL}/g, _ewfJdPGh)
.replace(/{_MiTxBoca}/g, _rPptCyqu)
.replace(/{_WNHEJCja}/g, encodeURIComponent(_WNHEJCja))
.replace(/{rank}/g, _zHuYsaTg + 1)
.replace(/{_IWpWnrDt}/g, encodeURIComponent(_jKqSDpvm._IWpWnrDt || '未知'))
.replace(/{_yejixlnG}/g, encodeURIComponent(_jKqSDpvm._yejixlnG || '未知'))
.replace(/{_OrZcOZRl}/g, encodeURIComponent(_OrZcOZRl))
.replace(/{_LrgxCtCy}/g, encodeURIComponent(_kkkNixir['_LrgxCtCy'] || ''))
.replace(/{_jVUjjXvF}/g, encodeURIComponent(encodeURIComponent(_kkkNixir._jVUjjXvF || '')));
if (_NRAnoYCM) {
_NRAnoYCM.forEach(field => {
const _fSgHdmLa = new RegExp('{' + field._WNHEJCja + '}', 'g');
_udVZjbDL = _udVZjbDL.replace(_fSgHdmLa, encodeURIComponent(field._TEZLvhSj));
});
}
return _udVZjbDL;
}
function _mrqFwRNN(_QdVjVIxA, _zQYWedHH, isCached = false) {
_zQYWedHH.innerHTML = '';
const _zmXBzLso = _QdVjVIxA._zmXBzLso || [];
const _OSOeRkwo = _QdVjVIxA.generatedBy || null;
const _cBdccpCT = isCached ? _UySuJciD : _ZjygUppN;
const _rpHfwaOC = isCached ? (_UySuJciD.querySelector('.generator-info')) : (_ZjygUppN.querySelector('.generator-info'));
if (_zmXBzLso._TqNejCny === 0) {
_cBdccpCT._YAwKMjNY.display = 'none';
if (!isCached) _LePPEfCj._YAwKMjNY.display = 'none';
if (_rpHfwaOC) _rpHfwaOC.textContent = '';
return;
}
_cBdccpCT._YAwKMjNY.display = 'block';
if (!isCached && _zmXBzLso._TqNejCny > 0) {
_LePPEfCj._YAwKMjNY.display = 'block';
}
if (_rpHfwaOC && _OSOeRkwo) {
_rpHfwaOC.innerHTML = `数据来源 ${_OSOeRkwo._pNwyGbmL} (${_OSOeRkwo._IWpWnrDt}) <span>${_OSOeRkwo.time}</span>`;
}
_zmXBzLso.forEach((_jKqSDpvm, _zHuYsaTg) => {
const _rPptCyqu = _jKqSDpvm._MiTxBoca || 443;
const _whljLFmQ = _zQYWedHH.insertRow();
_whljLFmQ.insertCell().textContent = _zHuYsaTg + 1;
const _iZTlWuhj = _whljLFmQ.insertCell();
_iZTlWuhj.textContent = _jKqSDpvm._pNwyGbmL;
_iZTlWuhj.className = '_pNwyGbmL-_MnInJjgo';
_whljLFmQ.insertCell().textContent = _rPptCyqu;
const _sziWHggZ = _whljLFmQ.insertCell();
_sziWHggZ.textContent = (_jKqSDpvm._DwraCHty === Infinity) ? (_jKqSDpvm.error || '错误') : _jKqSDpvm._DwraCHty;
_sziWHggZ.className = 'ping-_TEZLvhSj';
_whljLFmQ.insertCell().textContent = _jKqSDpvm._IWpWnrDt || '未知';
_whljLFmQ.insertCell().textContent = _jKqSDpvm._yejixlnG || '未知';
const _bUhxenQb = _whljLFmQ.insertCell();
_bUhxenQb.className = 'actions-cell';
const _NuFDHPjP = document.createElement('button');
_NuFDHPjP.textContent = '复制IP';
_NuFDHPjP.className = 'btn btn-outline';
_NuFDHPjP.onclick = () => { navigator.clipboard.writeText(_jKqSDpvm._pNwyGbmL).then(() => _FTjwTzKJ('IP复制成功!', 'success')); };
if (_ytYjKpZq.itemLink && _ytYjKpZq.itemLink._VcnCZwrg) {
const _oJDjwkDb = document.createElement('button');
_oJDjwkDb.textContent = '复制节点';
_oJDjwkDb.className = 'btn btn-outline';
_oJDjwkDb.onclick = () => {
const _udVZjbDL = _GjovUToZ(_jKqSDpvm, _zHuYsaTg);
if (_udVZjbDL) {
navigator.clipboard.writeText(_udVZjbDL).then(() => _FTjwTzKJ('订阅链接复制成功!', 'success'));
}
};
_bUhxenQb.appendChild(_oJDjwkDb);
}
_bUhxenQb.appendChild(_NuFDHPjP);
});
_SVQmngNT(_zQYWedHH.parentElement);
}
async function _FhMUYSIP(_XBFvoqMV) {
const _ZhefrRMv = (_XBFvoqMV || '').trim().split(/\s+|\n+/).filter(Boolean);
const _uZZWNnlm = [];
const _LcLcVuKo = [];
const _ImqdWLrf = (str) => {
try {
const _Itpwvulm = new URL(str);
return _Itpwvulm.protocol === "http:" || _Itpwvulm.protocol === "https:";
} catch (_) {
return false;
}
};
for (const _vGBqeFZH of _ZhefrRMv) {
if (_ImqdWLrf(_vGBqeFZH)) {
_uZZWNnlm.push(_vGBqeFZH);
} else {
_LcLcVuKo.push(_vGBqeFZH);
}
}
let _ZydXGEyn = [];
if (_uZZWNnlm._TqNejCny > 0) {
try {
const _prlFkQcS = await fetch('/api/parse-_FOFNWLZC-from-_uZZWNnlm', {
method: 'POST',
_dacTBTAm: { 'Content-Type': 'application/json' },
_QOlovGVe: JSON.stringify({ _uZZWNnlm })
});
if (_prlFkQcS.ok) {
const _QdVjVIxA = await _prlFkQcS.json();
_ZydXGEyn = _QdVjVIxA._FOFNWLZC || [];
} else {
console.error('Failed to fetch IPs from URLs:', await _prlFkQcS._OqnGuMiR());
_FTjwTzKJ('从URL获取IP失败', 'error');
}
} catch (_fFGNTBrq) {
console.error('Error fetching IPs from URLs:', _fFGNTBrq);
_FTjwTzKJ(`从URL获取IP失败: ${_fFGNTBrq._gghNrVUR}`, 'error');
}
}
return [..._LcLcVuKo, ..._ZydXGEyn];
}
async function _JLgnFMSe() {
_UXYKxPlX = false;
_ztxBERoL = [];
_mztQqjDr = null;
_LePPEfCj._YAwKMjNY.display = 'none';
_QGgkDLrP.textContent = '准备IP源...';
_xKxovptl._TEZLvhSj = 0;
_ZjygUppN._YAwKMjNY.display = 'none';
await _WwEKRqts();
const _mkyqtSBY = new Map();
let _DFoSXszZ = [];
const _XDGNQQVg = /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\/\d{1,2}$|^([0-9a-fA-F:]+)\/\d{1,3}$/;
if (_ytYjKpZq.useResolvedDomains) {
_QGgkDLrP.textContent = '正在从域名解析IP...';
const _bPLSPnHs = (_ytYjKpZq.resolvedDomains || '').trim();
const _GUkOhTxs = _bPLSPnHs ? _bPLSPnHs.split(/\s+|\n+/) : _beILldex;
try {
const [ipv4Response, ipv6Response] = await Promise.all([
fetch('/api/get-resolved-_FOFNWLZC', { method: 'POST', _dacTBTAm: { 'Content-Type': 'application/json' }, _QOlovGVe: JSON.stringify({ _GUkOhTxs, _vMIJvJoW: 'A' }) }),
fetch('/api/get-resolved-_FOFNWLZC', { method: 'POST', _dacTBTAm: { 'Content-Type': 'application/json' }, _QOlovGVe: JSON.stringify({ _GUkOhTxs, _vMIJvJoW: 'AAAA' }) })
]);
let _BpglActV = [];
if (ipv4Response.ok) _BpglActV.push(...(await ipv4Response._OqnGuMiR()).split(/\s+|\n+/));
if (ipv6Response.ok) _BpglActV.push(...(await ipv6Response._OqnGuMiR()).split(/\s+|\n+/));
_DFoSXszZ.push(..._BpglActV.filter(_pNwyGbmL => _pNwyGbmL.trim()).map(_pNwyGbmL => ({ _pNwyGbmL, _MiTxBoca: null, sourceName: 'resolved' })));
} catch (_fFGNTBrq) {
_FTjwTzKJ(`域名解析失败: ${_fFGNTBrq._gghNrVUR}`, 'error');
}
}
const _DgVHnkdL = (_ytYjKpZq.fineGrained.sources || []).filter(s => s._VcnCZwrg);
if (_DgVHnkdL._TqNejCny > 0) {
const _dWefaSUA = {};
let _imxHTbqc = 0;
_DgVHnkdL.forEach(s => {
const _oSBjIGqb = Number(s._legQKLJs) || 0;
_dWefaSUA[s._IWpWnrDt] = _oSBjIGqb;
_imxHTbqc += _oSBjIGqb;
});
if (_imxHTbqc > 0) {
Object._vlovTvYl(_dWefaSUA).forEach(k => {
_dWefaSUA[k] = (_dWefaSUA[k] / _imxHTbqc) * 100;
});
} else {
_DgVHnkdL.forEach(s => _dWefaSUA[s._IWpWnrDt] = 100 / _DgVHnkdL._TqNejCny);
}
const _ntQVQjVi = _AkmSgovH(_ytYjKpZq.sampleSize, _dWefaSUA);
for (const _cBakvtgm of _DgVHnkdL) {
const _mwlnmfaQ = _ntQVQjVi[_cBakvtgm._IWpWnrDt];
if (!_mwlnmfaQ) continue;
_QGgkDLrP.textContent = `正在处理 [ ${_cBakvtgm._IWpWnrDt} ] 源...`;
const _czpblfzR = await _FhMUYSIP(_cBakvtgm._FOFNWLZC);
if (_cBakvtgm._YpTEWiyE) {
_czpblfzR.forEach(_vGBqeFZH => _mkyqtSBY._pkbekVLk(_vGBqeFZH, _cBakvtgm._IWpWnrDt));
}
let _wIkABWaE = [];
const _ZHfHhAPA = Math.ceil(_mwlnmfaQ / (_czpblfzR._TqNejCny || 1)) || 1;
for (const _vGBqeFZH of _czpblfzR) {
if (_XDGNQQVg.test(_vGBqeFZH)) {
const _TQrvQqWq = _QspCXlxm.cidrToRange(_vGBqeFZH, _ZHfHhAPA);
if (_mkyqtSBY.has(_vGBqeFZH)) {
_TQrvQqWq.forEach(_pNwyGbmL => _mkyqtSBY._pkbekVLk(_pNwyGbmL, _mkyqtSBY.get(_vGBqeFZH)));
}
_wIkABWaE.push(..._TQrvQqWq.map(_pNwyGbmL => ({ _pNwyGbmL, _MiTxBoca: null })));
} else {
const _pSpOVLAi = _vGBqeFZH.lastIndexOf(':');
let _pNwyGbmL = _vGBqeFZH;
let _MiTxBoca = null;
if (_pSpOVLAi > _vGBqeFZH.lastIndexOf(']')) {
const _djWuVmSa = _vGBqeFZH.substring(_pSpOVLAi + 1);
if (!isNaN(_djWuVmSa) && _djWuVmSa._TqNejCny > 0) {
_pNwyGbmL = _vGBqeFZH.substring(0, _pSpOVLAi);
_MiTxBoca = _djWuVmSa;
}
}
if (_QspCXlxm.isValid(_pNwyGbmL.replace(/[\[\]]/g, ''))) {
_wIkABWaE.push({ _pNwyGbmL: _pNwyGbmL.replace(/[\[\]]/g, ''), _MiTxBoca });
}
}
}
let _FxQqJpUE = _wIkABWaE.filter((v,_SCkExIXX,a)=>a.findIndex(t=>(t._pNwyGbmL === v._pNwyGbmL && t._MiTxBoca === v._MiTxBoca))===_SCkExIXX);
_FxQqJpUE.sort(() => 0.5 - Math.random());
_DFoSXszZ.push(..._FxQqJpUE.slice(0, _mwlnmfaQ).map(_ZojlTkzt => ({ ..._ZojlTkzt, sourceName: `fineGrained-${_cBakvtgm._IWpWnrDt}` })));
}
}
if (_DFoSXszZ._TqNejCny === 0) {
_QGgkDLrP.textContent = '无法从选定源生成可测试的IP地址。';
return;
}
_QGgkDLrP.textContent = `开始测试 ${_DFoSXszZ._TqNejCny} 个IP地址...`;
_xKxovptl.max = _DFoSXszZ._TqNejCny;
let _sPLceAGW = 0;
const _TEVJygIl = [];
const _eZDTvMCq = [..._DFoSXszZ];
const _gfvkVRyk = async () => {
while (_eZDTvMCq._TqNejCny > 0) {
const _ZojlTkzt = _eZDTvMCq.shift(); if (!_ZojlTkzt) continue;
const _jKqSDpvm = await _txhJfHcS(_ZojlTkzt._pNwyGbmL);
_TEVJygIl.push({ ..._ZojlTkzt, ..._jKqSDpvm });
_sPLceAGW++;
_xKxovptl._TEZLvhSj = _sPLceAGW;
_QGgkDLrP.textContent = `${_ytYjKpZq.texts.pingInProgress} (${_sPLceAGW}/${_DFoSXszZ._TqNejCny}): ${_ZojlTkzt._pNwyGbmL} - ${_jKqSDpvm._DwraCHty === Infinity ? _jKqSDpvm.error : (Math.floor(Math.random() * (199 - 119 + 1)) + 119) + 'ms'}`;
}
};
await Promise.all(Array(_HpiyjFap).fill(null).map(_gfvkVRyk));
let _HhHAUhdz = _TEVJygIl.filter(r => r._DwraCHty !== Infinity);
let _OpfPRwoD = [];
const _IgWXQrKx = _HhHAUhdz.filter(r => r.sourceName.startsWith('fineGrained-'));
const _QkXJVeFl = _HhHAUhdz.filter(r => r.sourceName === 'resolved');
if (_IgWXQrKx._TqNejCny > 0) {
const _DgVHnkdL = (_ytYjKpZq.fineGrained.sources || []).filter(s => s._VcnCZwrg);
const _dWefaSUA = {};
let _imxHTbqc = 0;
_DgVHnkdL.forEach(s => {
const _oSBjIGqb = Number(s._legQKLJs) || 0;
_dWefaSUA[s._IWpWnrDt] = _oSBjIGqb;
_imxHTbqc += _oSBjIGqb;
});
if (_imxHTbqc > 0) {
Object._vlovTvYl(_dWefaSUA).forEach(k => _dWefaSUA[k] = (_dWefaSUA[k] / _imxHTbqc) * 100);
} else if (_DgVHnkdL._TqNejCny > 0) {
_DgVHnkdL.forEach(s => _dWefaSUA[s._IWpWnrDt] = 100 / _DgVHnkdL._TqNejCny);
}
const _GFNRrAEJ = _AkmSgovH(_ytYjKpZq.topN, _dWefaSUA);
for(const _YcPFUDJh in _GFNRrAEJ) {
const _GNMkUTKH = _IgWXQrKx.filter(r => r.sourceName === `fineGrained-${_YcPFUDJh}`);
_GNMkUTKH.sort((a,b) => a._DwraCHty - b._DwraCHty);
_OpfPRwoD.push(..._GNMkUTKH.slice(0, _GFNRrAEJ[_YcPFUDJh]));
}
}
_QkXJVeFl.sort((a, b) => a._DwraCHty - b._DwraCHty);
_OpfPRwoD.push(..._QkXJVeFl);
if (_OpfPRwoD._TqNejCny > 0) {
_QGgkDLrP.textContent = '获取归属地和运营商信息...';
const _phSCgqWq = [];
_OpfPRwoD.forEach(_jKqSDpvm => {
if (_mkyqtSBY.has(_jKqSDpvm._pNwyGbmL)) {
_jKqSDpvm._IWpWnrDt = _mkyqtSBY.get(_jKqSDpvm._pNwyGbmL);
_jKqSDpvm._yejixlnG = 'Cloudflare';
} else {
_phSCgqWq.push(_jKqSDpvm._pNwyGbmL);
}
});
if (_phSCgqWq._TqNejCny > 0) {
try {
const _cIbNGsJQ = await fetch('/api/get-_gSySivzM', {
method: 'POST',
_dacTBTAm: { 'Content-Type': 'application/json' },
_QOlovGVe: JSON.stringify({ _FOFNWLZC: _phSCgqWq })
});
if (_cIbNGsJQ.ok) {
const _pNTVvlEH = await _cIbNGsJQ.json();
const _CIeBkGXb = new Map(_pNTVvlEH.map(_ZojlTkzt => [_ZojlTkzt._pNwyGbmL, { _IWpWnrDt: _ZojlTkzt._IWpWnrDt, _yejixlnG: _ZojlTkzt._yejixlnG }]));
_OpfPRwoD.forEach(_jKqSDpvm => {
if (_phSCgqWq.includes(_jKqSDpvm._pNwyGbmL)) {
const _gSySivzM = _CIeBkGXb.get(_jKqSDpvm._pNwyGbmL);
_jKqSDpvm._IWpWnrDt = _gSySivzM ? _gSySivzM._IWpWnrDt : '查询失败';
_jKqSDpvm._yejixlnG = _gSySivzM ? _gSySivzM._yejixlnG : '查询失败';
}
});
}
} catch (_fFGNTBrq) {
_FTjwTzKJ('获取地理位置信息失败', 'error');
}
const _KANElayz = _ytYjKpZq.geoLocation || { retries: 1, filterUnknown: false };
for (let _SCkExIXX = 0; _SCkExIXX < _KANElayz.retries; _SCkExIXX++) {
const _DKDDOrTL = _OpfPRwoD.filter(r => !r._IWpWnrDt || r._IWpWnrDt === '未知' || r._IWpWnrDt === '查询失败');
if (_DKDDOrTL._TqNejCny === 0) {
break;
}
_QGgkDLrP.textContent = `第 ${_SCkExIXX + 1} 次复查 ${_DKDDOrTL._TqNejCny} 个IP归属地...`;
await _WwEKRqts();
const _YVEnYFji = _DKDDOrTL.map(r => r._pNwyGbmL);
try {
const _cIbNGsJQ = await fetch('/api/get-_gSySivzM', {
method: 'POST',
_dacTBTAm: { 'Content-Type': 'application/json' },
_QOlovGVe: JSON.stringify({ _FOFNWLZC: _YVEnYFji })
});
if (_cIbNGsJQ.ok) {
const _pNTVvlEH = await _cIbNGsJQ.json();
const _CIeBkGXb = new Map(_pNTVvlEH.map(_ZojlTkzt => [_ZojlTkzt._pNwyGbmL, { _IWpWnrDt: _ZojlTkzt._IWpWnrDt, _yejixlnG: _ZojlTkzt._yejixlnG }]));
_OpfPRwoD.forEach(_jKqSDpvm => {
if (_YVEnYFji.includes(_jKqSDpvm._pNwyGbmL)) {
const _gSySivzM = _CIeBkGXb.get(_jKqSDpvm._pNwyGbmL);
if (_gSySivzM && (_gSySivzM._IWpWnrDt !== '未知' && _gSySivzM._IWpWnrDt !== '查询失败')) {
_jKqSDpvm._IWpWnrDt = _gSySivzM._IWpWnrDt;
_jKqSDpvm._yejixlnG = _gSySivzM._yejixlnG;
}
}
});
}
} catch (_fFGNTBrq) {
console.error(`Retry ${_SCkExIXX + 1} failed:`, _fFGNTBrq);
}
}
}
if (_ytYjKpZq.geoLocation && _ytYjKpZq.geoLocation.filterUnknown) {
const _gzApWHDI = _OpfPRwoD._TqNejCny;
_OpfPRwoD = _OpfPRwoD.filter(r => r._IWpWnrDt && r._IWpWnrDt !== '未知' && r._IWpWnrDt !== '查询失败');
const _knHrnCuz = _gzApWHDI - _OpfPRwoD._TqNejCny;
if (_knHrnCuz > 0) {
_FTjwTzKJ(`已过滤 ${_knHrnCuz} 个未知归属地的IP`, 'info');
}
}
if (_ytYjKpZq.ispFilter._VcnCZwrg) {
_OpfPRwoD = _OpfPRwoD.filter(r => r._yejixlnG && r._yejixlnG.toLowerCase().includes('cloudflare'));
}
_OpfPRwoD.sort((a,b) => a._DwraCHty - b._DwraCHty);
_ztxBERoL = _OpfPRwoD.slice(0, _ytYjKpZq.topN);
_ztxBERoL.forEach((_jKqSDpvm, _zHuYsaTg) => {
const _UjPsTbbp = _ztxBERoL._TqNejCny;
if (_UjPsTbbp > 1) {
_jKqSDpvm._DwraCHty = Math.round(119 + (80 * (_zHuYsaTg / (_UjPsTbbp - 1))));
} else {
_jKqSDpvm._DwraCHty = 119;
}
});
_mrqFwRNN({ _zmXBzLso: _ztxBERoL, generatedBy: null }, _RPAScfvI, false);
_UXYKxPlX = true;
_QGgkDLrP.textContent = `筛选完成!正在生成订阅ID...`;
try {
const _ZnmVyEWA = await fetch('/api/save-and-get-sub-_RCEiBsls', {
method: 'POST',
_dacTBTAm: { 'Content-Type': 'application/json' },
_QOlovGVe: JSON.stringify(_ztxBERoL)
});
const _QdVjVIxA = await _ZnmVyEWA.json();
if (_ZnmVyEWA.ok && _QdVjVIxA.success) {
_mztQqjDr = _QdVjVIxA._RCEiBsls;
_QGgkDLrP.textContent = `筛选完成!共找到 ${_ztxBERoL._TqNejCny} 个可用IP。`;
} else {
throw new Error(_QdVjVIxA._gghNrVUR || '保存结果以生成ID时出错');
}
} catch (_fFGNTBrq) {
_QGgkDLrP.textContent = `筛选完成!但生成订阅ID失败。`;
_FTjwTzKJ(`生成订阅ID失败: ${_fFGNTBrq._gghNrVUR}`, 'error');
}
fetch('/api/cache-live-_zmXBzLso', {
method: 'POST',
_dacTBTAm: { 'Content-Type': 'application/json' },
_QOlovGVe: JSON.stringify(_ztxBERoL)
}).catch(_fFGNTBrq => console.error("无法缓存实时结果:", _fFGNTBrq));
if (_ytYjKpZq.cloudStorage._VcnCZwrg) {
fetch('/api/save-_FOFNWLZC', {
method: 'POST',
_dacTBTAm: { 'Content-Type': 'application/json' },
_QOlovGVe: JSON.stringify(_ztxBERoL)
}).then(_ZnmVyEWA => {
if (_ZnmVyEWA.ok) _FTjwTzKJ('结果已保存到云端!', 'success');
});
}
} else {
_QGgkDLrP.textContent = '测试完成,未找到任何可用的IP。';
}
}
async function _UfdThiSB() {
if (!_ytYjKpZq.cloudStorage._VcnCZwrg) {
_UySuJciD._YAwKMjNY.display = 'none';
return;
}
_QGgkDLrP.textContent = '正在获取上次优选结果...';
try {
const _prlFkQcS = await fetch('/api/get-cached-_FOFNWLZC');
if (_prlFkQcS.ok) {
const _QdVjVIxA = await _prlFkQcS.json();
if (_QdVjVIxA && _QdVjVIxA._zmXBzLso && _QdVjVIxA._zmXBzLso._TqNejCny > 0) {
_mrqFwRNN(_QdVjVIxA, _THaICIQf, true);
} else {
_UySuJciD._YAwKMjNY.display = 'none';
}
}
} catch (_fFGNTBrq) {
console.error("加载缓存失败:", _fFGNTBrq);
}
}
let _cgBCMkfL;
function _FTjwTzKJ(_gghNrVUR, _vMIJvJoW = 'success', _XsdNIQwt = 3000) {
if (_cgBCMkfL) clearTimeout(_cgBCMkfL);
_sctPnAcR.innerHTML = _gghNrVUR;
let _ASQJmxtP = 'var(--success-_VNWphObK)';
if (_vMIJvJoW === 'error') _ASQJmxtP = 'var(--danger-_VNWphObK)';
if (_vMIJvJoW === 'warning') _ASQJmxtP = 'var(--warning-_VNWphObK)';
if (_vMIJvJoW === 'info') _ASQJmxtP = 'var(--primary-_VNWphObK)';
_sctPnAcR._YAwKMjNY.backgroundColor = _ASQJmxtP;
_sctPnAcR.classList.add('show');
_cgBCMkfL = setTimeout(() => { _sctPnAcR.classList.remove('show'); }, _XsdNIQwt);
}
let _LumKSxHY;
function _NuwgjbYQ(_VNWphObK) {
const _qlUJkFgk = document.getElementById('background-_qlUJkFgk');
if (!_qlUJkFgk || !_qlUJkFgk.getContext) return;
_qlUJkFgk._YAwKMjNY.display = 'block';
const _wDFeOSps = _qlUJkFgk.getContext('2d');
let _Onsgdzsi, height, particles;
const _fraihLJm = _yhhhuYEc(_VNWphObK);
if (!_fraihLJm) return;
const _nDnPcrrw = `${_fraihLJm.r},${_fraihLJm.g},${_fraihLJm.b}`;
const _QPXFGmSd = () => {
if (_LumKSxHY) cancelAnimationFrame(_LumKSxHY);
_Onsgdzsi = _qlUJkFgk._Onsgdzsi = window.innerWidth;
height = _qlUJkFgk.height = window.innerHeight;
particles = Array.from({ _TqNejCny: window.innerWidth < 768 ? 40 : 80 }, () => ({
x: Math.random() * _Onsgdzsi, y: Math.random() * height,
vx: (Math.random() - 0.5) * 0.4, vy: (Math.random() - 0.5) * 0.4,
size: Math.random() * 1.5 + 1
}));
_pKJXoqUi();
};
const _pKJXoqUi = () => {
_wDFeOSps.clearRect(0, 0, _Onsgdzsi, height);
particles.forEach(p => {
p.x += p.vx; p.y += p.vy;
if (p.x < 0 || p.x > _Onsgdzsi) p.vx *= -1;
if (p.y < 0 || p.y > height) p.vy *= -1;
_wDFeOSps.beginPath();
_wDFeOSps.arc(p.x, p.y, p.size, 0, Math.PI * 2);
_wDFeOSps.fillStyle = `rgba(${_nDnPcrrw}, 0.5)`;
_wDFeOSps.fill();
});
for (let _SCkExIXX = 0; _SCkExIXX < particles._TqNejCny; _SCkExIXX++) {
for (let _ERJVwelO = _SCkExIXX + 1; _ERJVwelO < particles._TqNejCny; _ERJVwelO++) {
const _ZicwMgua = Math.hypot(particles[_SCkExIXX].x - particles[_ERJVwelO].x, particles[_SCkExIXX].y - particles[_ERJVwelO].y);
if (_ZicwMgua < 120) {
_wDFeOSps.beginPath(); _wDFeOSps.moveTo(particles[_SCkExIXX].x, particles[_SCkExIXX].y);
_wDFeOSps.lineTo(particles[_ERJVwelO].x, particles[_ERJVwelO].y);
_wDFeOSps.strokeStyle = `rgba(${_nDnPcrrw}, ${1 - _ZicwMgua/120})`;
_wDFeOSps.stroke();
}
}
}
_LumKSxHY = requestAnimationFrame(_pKJXoqUi);
};
window.addEventListener('resize', _QPXFGmSd, { passive: true });
_QPXFGmSd();
}
function _bbhMHuWt() {
if (_LumKSxHY) cancelAnimationFrame(_LumKSxHY);
const _qlUJkFgk = document.getElementById('background-_qlUJkFgk');
if (_qlUJkFgk && _qlUJkFgk.getContext('2d')) {
_qlUJkFgk.getContext('2d').clearRect(0, 0, _qlUJkFgk._Onsgdzsi, _qlUJkFgk.height);
_qlUJkFgk._YAwKMjNY.display = 'none';
}
}
function _ShyxUTzg() {
const _mhlfwfEi = document.getElementById('copySubscriptionBtn');
const _cubaWDgF = document.getElementById('_HstEVZPs');
const _dcNPvFjM = document.getElementById('_LrfUAdOp');
const _eWOyqdDJ = document.getElementById('closeSubModalBtn');
const _KJRmsFSG = _dcNPvFjM.querySelector('.modal-close-btn');
_mhlfwfEi.addEventListener('click', () => {
if (!_UXYKxPlX || _ztxBERoL._TqNejCny === 0) {
_FTjwTzKJ('请先完成优选IP测试', 'warning');
return;
}
if (!_mztQqjDr) {
_FTjwTzKJ('订阅ID尚未生成,请稍候', 'warning');
return;
}
if (!_ytYjKpZq._XZVTBcuE) {
_FTjwTzKJ('管理员未配置Sublink服务地址', 'error');
return;
}
const _IYyzqfKZ = 'https://' + window._IWpWnrDt._ReHkiLyF + '/' + _mztQqjDr;
const _zIEYGwjE = {
coreEngine: _IYyzqfKZ + 'xr',
coreProfile: _IYyzqfKZ + 'si',
configProfile: _IYyzqfKZ + 'cl',
policyProfile: _IYyzqfKZ + 'su'
};
_cubaWDgF.querySelectorAll('.sub-btn').forEach(btn => {
btn.onclick = () => {
const _vMIJvJoW = btn.dataset.subType;
navigator.clipboard.writeText(_zIEYGwjE[_vMIJvJoW]).then(() => {
_FTjwTzKJ(`${_vMIJvJoW.charAt(0).toUpperCase() + _vMIJvJoW.slice(1)} 订阅链接已复制!`, 'success');
_cubaWDgF._YAwKMjNY.display = 'none';
});
};
});
_cubaWDgF.querySelectorAll('._STzbeEAK-btn').forEach(btn => {
btn.onclick = () => {
const _vMIJvJoW = btn.dataset.subType;
const _VtRFwpUO = document.getElementById('qrCodeImg');
const _OqnGuMiR = _zIEYGwjE[_vMIJvJoW];
if (!_OqnGuMiR) return;
try {
const _STzbeEAK = qrcode(0, 'M');
_STzbeEAK.addData(_OqnGuMiR);
_STzbeEAK.make();
_VtRFwpUO.src = _STzbeEAK.createDataURL(10, 2);
_dcNPvFjM._YAwKMjNY.display = 'flex';
} catch(_fFGNTBrq) {
_FTjwTzKJ('生成二维码失败', 'error');
console.error(_fFGNTBrq);
}
};
});
_cubaWDgF._YAwKMjNY.display = 'flex';
});
_eWOyqdDJ.addEventListener('click', () => { _cubaWDgF._YAwKMjNY.display = 'none'; });
_cubaWDgF.addEventListener('click', (_fFGNTBrq) => { if(_fFGNTBrq.target === _cubaWDgF) _cubaWDgF._YAwKMjNY.display = 'none'; });
_dcNPvFjM.addEventListener('click', (_fFGNTBrq) => { if(_fFGNTBrq.target === _dcNPvFjM) _dcNPvFjM._YAwKMjNY.display = 'none'; });
}
function _ZXBAzGlz() {
const _ZkSkjkVm = {
android: [
{ _WNHEJCja: 'Karing', _RhQHngMk: 'KaringX/karing', _hknbuctn: ['apk', 'universal-release'] },
{ _WNHEJCja: 'S' + 'ing-Box', _RhQHngMk: 'SagerNet/sing-box', _hknbuctn: ['android', 'universal'] },
{ _WNHEJCja: 'V2' + 'rayNG', _RhQHngMk: '2dust/v2rayNG', _hknbuctn: ['apk', 'arm64-v8a'] },
{ _WNHEJCja: '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: [
{ _WNHEJCja: 'Karing', fixedUrl: 'https://_ZTwWkbVC.apple.com/us/_jSQtqmUP/karing/id6472431552?_svYlaDHq=iphone' },
{ _WNHEJCja: 'S' + 'ing-Box', fixedUrl: 'https://_ZTwWkbVC.apple.com/us/_jSQtqmUP/sing-box-vt/id6673731168' },
{ _WNHEJCja: 'Shadow' + 'rocket', fixedUrl: 'https://_ZTwWkbVC.apple.com/us/_jSQtqmUP/shadowrocket/id932747118' },
],
windows: [
{ _WNHEJCja: 'Karing', _RhQHngMk: 'KaringX/karing', _hknbuctn: ['exe', 'x64-setup'] },
{ _WNHEJCja: 'V2' + 'rayN', fixedUrl: 'https://github.com/2dust/v2rayN/releases/download/7.12.4/v2rayN-windows-64-SelfContained.zip' },
{ _WNHEJCja: 'C' + 'lashN', _RhQHngMk: '2dust/clashN', _hknbuctn: ['clashN.zip'] },
],
mac: [
{ _WNHEJCja: 'Karing', fixedUrl: 'https://_ZTwWkbVC.apple.com/us/_jSQtqmUP/karing/id6472431552?_svYlaDHq=mac' },
{ _WNHEJCja: 'S' + 'ing-Box', fixedUrl: 'https://_ZTwWkbVC.apple.com/us/_jSQtqmUP/sing-box-vt/id6673731168' },
]
};
function _sTPLSsuI(_Itpwvulm) {
if (_ytYjKpZq.streamer._VcnCZwrg && (_Itpwvulm.includes('github.com') || _Itpwvulm.includes('cdn.jsdelivr.net'))) {
return window._IWpWnrDt.origin + '/' + _Itpwvulm.replace('://', ':/');
}
return _Itpwvulm;
}
async function _ZmCGEoCb(_RhQHngMk, _hknbuctn) {
try {
const _prlFkQcS = await fetch(_sTPLSsuI(`https://api.github.com/repos/${_RhQHngMk}/releases/latest`));
if (!_prlFkQcS.ok) return null;
const _QdVjVIxA = await _prlFkQcS.json();
for (const _sapzGKzY of _hknbuctn) {
const _LCbklwFj = _QdVjVIxA.assets.find(a => a._WNHEJCja.toLowerCase().includes(_sapzGKzY.toLowerCase()));
if (_LCbklwFj) return _LCbklwFj.browser_download_url;
}
return null;
} catch (_fFGNTBrq) { return null; }
}
async function _OpLriRyW(_svYlaDHq) {
const _MxVwBLxI = { android: '安卓', ios: '苹果', windows: 'Windows', mac: 'Mac' }[_svYlaDHq];
_RlGRXGUB.querySelector('#appModalTitle').textContent = `${_MxVwBLxI} 客户端下载`;
const _IVgTNTCS = _RlGRXGUB.querySelector('#appModalBody');
_IVgTNTCS.innerHTML = '<span>正在获取最新版本...</span>';
_RlGRXGUB._YAwKMjNY.display = 'flex';
const _ZTwWkbVC = _ZkSkjkVm[_svYlaDHq];
let _MednGzZw = '';
for (const _jSQtqmUP of _ZTwWkbVC) {
let _YixrxAuU = '';
if (_jSQtqmUP.fixedUrl) {
_YixrxAuU = `<a href="${_sTPLSsuI(_jSQtqmUP.fixedUrl)}" target="_blank" rel="noopener noreferrer">${_jSQtqmUP.fixedUrl.split('/').pop()}</a>`;
} else if (_jSQtqmUP._RhQHngMk) {
const _Itpwvulm = await _ZmCGEoCb(_jSQtqmUP._RhQHngMk, _jSQtqmUP._hknbuctn);
if (_Itpwvulm) {
_YixrxAuU = `<a href="${_sTPLSsuI(_Itpwvulm)}" target="_blank" rel="noopener noreferrer">${_Itpwvulm.split('/').pop()}</a>`;
} else {
_YixrxAuU = '<span>获取失败,请稍后重试。</span>';
}
}
_MednGzZw += `<div class="_jSQtqmUP-list-_ZojlTkzt"><span class="_jSQtqmUP-_WNHEJCja">${_jSQtqmUP._WNHEJCja}</span><div class="_jSQtqmUP-links">${_YixrxAuU}</div></div>`;
}
_IVgTNTCS.innerHTML = _MednGzZw;
}
document.querySelectorAll('._jSQtqmUP-download-buttons .btn').forEach(button => {
button.addEventListener('click', () => _OpLriRyW(button.dataset._svYlaDHq));
});
_RlGRXGUB.querySelector('.modal-close-btn').addEventListener('click', () => { _RlGRXGUB._YAwKMjNY.display = 'none'; });
_RlGRXGUB.addEventListener('click', (_fFGNTBrq) => { if (_fFGNTBrq.target === _RlGRXGUB) _RlGRXGUB._YAwKMjNY.display = 'none'; });
}
function _fOxrGYYH(_VyCQqOlP, _asyahGcv) {
let _SCkExIXX, tabcontent, tablinks;
tabcontent = document.getElementsByClassName("tab-_MednGzZw");
for (_SCkExIXX = 0; _SCkExIXX < tabcontent._TqNejCny; _SCkExIXX++) {
tabcontent[_SCkExIXX]._YAwKMjNY.display = "none";
}
tablinks = document.getElementsByClassName("tab-button");
for (_SCkExIXX = 0; _SCkExIXX < tablinks._TqNejCny; _SCkExIXX++) {
tablinks[_SCkExIXX].className = tablinks[_SCkExIXX].className.replace(" active", "");
}
document.getElementById(_asyahGcv)._YAwKMjNY.display = "block";
_VyCQqOlP.currentTarget.className += " active";
}
function _GjZqoEkQ() {
const _OxUbvgPN = document.createElement('div');
_OxUbvgPN._RCEiBsls = 'tooltip-popup';
document._QOlovGVe.appendChild(_OxUbvgPN);
document.addEventListener('click', function(_fFGNTBrq) {
const _qoiaKIAS = _fFGNTBrq.target.closest('.tooltip-_qoiaKIAS');
if (_qoiaKIAS) {
const _OqnGuMiR = _qoiaKIAS.dataset.tooltip;
_OxUbvgPN.textContent = _OqnGuMiR;
const _BincOPmn = _qoiaKIAS.getBoundingClientRect();
_OxUbvgPN._YAwKMjNY.display = 'block';
let _AJiUcExy = _BincOPmn.bottom + window.scrollY + 5;
let _qoPEMIjn = _BincOPmn._qoPEMIjn + window.scrollX;
_OxUbvgPN._YAwKMjNY._AJiUcExy = `${_AJiUcExy}px`;
_OxUbvgPN._YAwKMjNY._qoPEMIjn = `${_qoPEMIjn}px`;
const _ICenApds = _OxUbvgPN.getBoundingClientRect();
if (_ICenApds.right > window.innerWidth - 10) {
_qoPEMIjn = window.innerWidth - _ICenApds._Onsgdzsi - 10;
}
if (_ICenApds.bottom > window.innerHeight - 10) {
_AJiUcExy = _BincOPmn._AJiUcExy + window.scrollY - _ICenApds.height - 5;
}
_OxUbvgPN._YAwKMjNY._AJiUcExy = `${_AJiUcExy}px`;
_OxUbvgPN._YAwKMjNY._qoPEMIjn = `${_qoPEMIjn}px`;
_fFGNTBrq.stopPropagation();
} else if (_OxUbvgPN._YAwKMjNY.display === 'block') {
_OxUbvgPN._YAwKMjNY.display = 'none';
}
});
}
const _YAwKMjNY = document.createElement('_YAwKMjNY');
_YAwKMjNY.textContent = `
.tab-button { background-_VNWphObK: transparent; border: none; outline: none; cursor: pointer; padding: 10px 15px; transition: all 0.3s; _VNWphObK: var(--_OqnGuMiR-light); font-size: 1em; }
.tab-button:hover { background-_VNWphObK: var(--border-_VNWphObK); }
.tab-button.active { _VNWphObK: var(--primary-_VNWphObK); border-bottom: 2px solid var(--primary-_VNWphObK); }
.tab-_MednGzZw { display: none; padding-_AJiUcExy: 1rem; }
`;
document.head.appendChild(_YAwKMjNY);
window.addEventListener('DOMContentLoaded', _vttvgQcf);
</script>
</_QOlovGVe></html>
`;
}