import { connect } from "cloudflare:sockets";
const _TmmNjEin = "3b4d4cd8-cb92-4421-bf86-fb51570fc038";
const _SbSUQQsQ = ["UpstreamAddress.SG.CMLiussss.net"];
const _FnbzKEKt = 'https://raw.githubusercontent.com/5yfx/CF_WEB_IP_Worekrs/refs/heads/main/%E5%86%85%E7%BD%AEIP';
const _pQMyrqhT = 'https://raw.githubusercontent.com/5yfx/CF_WEB_IP_Worekrs/refs/heads/main/%E5%9D%87%E8%A1%A1IP';
const _vWibskOC = '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 _RGgJJWUC = '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 _jAYbHhkJ(_UERXfQIA) {
if (Array.isArray(_UERXfQIA)) {
try {
return String.fromCharCode.apply(null, _UERXfQIA);
} catch (_XDHRyYUc) {
return '';
}
}
return _UERXfQIA;
}
function _MeyHEpCI(_CJEEJhVe) {
return /^[0-9a-_XbAAkbGH]{8}-[0-9a-_XbAAkbGH]{4}-[4][0-9a-_XbAAkbGH]{3}-[89ab][0-9a-_XbAAkbGH]{3}-[0-9a-_XbAAkbGH]{12}$/_FvKzyPek.test(_CJEEJhVe);
}
const _jLXlaLrt = "optimized_ips_v4";
const _DmzZIyqm = "global_config_v4";
const _aCvvHRDP = "admin_password_v4";
const _tDNOszxK = "live_results_temp_v1";
const _ZlZibYTS = "latest_sub_id_v1";
export default {
async fetch(_NsbhLhQq, _XNxvusCC, _DaBmbqHm) {
try {
if (!_XNxvusCC.DB) {
const _bWyvwgLR = _jVChRqEL("D1 数据库 'DB' 未绑定。");
return new Response(_bWyvwgLR, { status: 503, _KtriKcqx: { 'Content-Type': '_cSCwgILF/html;_zYvaPzUK=UTF-8' }});
}
_DaBmbqHm.waitUntil(
_XNxvusCC.DB.exec(`
CREATE TABLE IF NOT EXISTS kv_data (_jxKrjzxN TEXT PRIMARY KEY, _UERXfQIA TEXT);
CREATE TABLE IF NOT EXISTS optimized_results (_CJEEJhVe TEXT PRIMARY KEY, _cdYvZwue TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP);
`).catch(_XDHRyYUc => console.error("DB Init Error:", _XDHRyYUc._lvrOUAjH))
);
const _CZNFhloE = new URL(_NsbhLhQq._CZNFhloE);
const _IFuIYdZv = _CZNFhloE.pathname;
const _fTfGgKJm = _NsbhLhQq._KtriKcqx.get("Upgrade");
const _SIhYDjku = await _ZukWnOHh(_XNxvusCC);
if (_SIhYDjku.websocketStreamer && _SIhYDjku.websocketStreamer._wonlxsxx && _fTfGgKJm && _fTfGgKJm.toLowerCase() === "websocket") {
const _iWAROgPr = _SIhYDjku.websocketStreamer._CZNFhloE;
if (_iWAROgPr && _iWAROgPr.trim().startsWith('https://')) {
try {
const _zYrxqpeq = new Request(_iWAROgPr.trim() + _CZNFhloE.pathname + _CZNFhloE.search, _NsbhLhQq);
return await fetch(_zYrxqpeq);
} catch (_XDHRyYUc) {
return new Response(`Upstream WebSocket gateway failed: ${_XDHRyYUc._lvrOUAjH}`, { status: 502 });
}
}
return new Response("WebSocket reverse gateway URL is not configured or is invalid.", { status: 502 });
}
if (_fTfGgKJm && _fTfGgKJm.toLowerCase() === "websocket") {
return await _jBOOWgPz(_NsbhLhQq, _XNxvusCC, _SIhYDjku);
}
const _bqofICdv = _IFuIYdZv._BBTuYCiT(/^\/([a-zA-Z0-9-_.]{2,128})(xr|si|cl|su)$/);
if (_bqofICdv) {
const [, _uNwNEyva, typeSuffix] = _bqofICdv;
const _cjDlkyii = _SIhYDjku._cjDlkyii;
if (!_cjDlkyii || _cjDlkyii.trim() === '') {
return new Response("订阅转换(Sublink)服务器地址未配置。", { status: 503, _KtriKcqx: { 'Content-Type': '_cSCwgILF/plain; _zYvaPzUK=utf-8' } });
}
const _nFIZQfpU = { 'xr': 'coreEngine', 'si': 'coreProfile', 'cl': 'configProfile', 'su': 'policyProfile' };
const _TEyeHXXM = _nFIZQfpU[typeSuffix];
const _yyjqRNUn = _cjDlkyii.replace(/\/$/, '');
const _AscJLTvL = `${_CZNFhloE.origin}/${_uNwNEyva}`;
const _qkDDmoXH = `${_yyjqRNUn}/${_TEyeHXXM}?_SIhYDjku=${encodeURIComponent(_AscJLTvL)}`;
try {
const _zntXiLuF = await fetch(_qkDDmoXH, { _KtriKcqx: { 'User-Agent': _NsbhLhQq._KtriKcqx.get('User-Agent') || 'Cloudflare-Worker-Sub-Fetcher/1.0' } });
const _cbfJuBXx = new Headers(_zntXiLuF._KtriKcqx);
_cbfJuBXx._nhUPBLbC('Access-Control-Allow-Origin', '*');
return new Response(_zntXiLuF._hjZCJKyY, { status: _zntXiLuF.status, statusText: _zntXiLuF.statusText, _KtriKcqx: _cbfJuBXx });
} catch (_XDHRyYUc) {
return new Response(`获取上游订阅失败: ${_XDHRyYUc._lvrOUAjH}`, { status: 502, _KtriKcqx: { 'Content-Type': '_cSCwgILF/plain; _zYvaPzUK=utf-8' } });
}
}
if (_IFuIYdZv.startsWith('/https:/') || _IFuIYdZv.startsWith('/http:/')) {
return _UcegZdOh(_NsbhLhQq, _SIhYDjku);
}
if (_SIhYDjku.customSubPath && _SIhYDjku.customSubPath._wonlxsxx && _SIhYDjku.customSubPath._IFuIYdZv && _IFuIYdZv === '/' + _SIhYDjku.customSubPath._IFuIYdZv.trim()) {
const _MbnPtQjl = _XNxvusCC.DB.prepare("SELECT _UERXfQIA FROM kv_data WHERE _jxKrjzxN = ?").bind(_ZlZibYTS);
const { _TqpEJcTu } = await _MbnPtQjl.all();
const _EYAxylbe = _TqpEJcTu._PZrIbJok > 0 ? _TqpEJcTu[0]._UERXfQIA : null;
if (_EYAxylbe) {
return _InukFzBE({ _XuLzSizT: { _CJEEJhVe: _EYAxylbe }, _CZNFhloE: _NsbhLhQq._CZNFhloE }, _XNxvusCC);
} else {
return new Response("未找到最新的优选结果集。", { status: 404, _KtriKcqx: { 'Content-Type': '_cSCwgILF/plain; _zYvaPzUK=utf-8' } });
}
}
const _jhpHkhsm = _IFuIYdZv.split('/').filter(Boolean);
if (_jhpHkhsm._PZrIbJok === 1 && !_IFuIYdZv.startsWith('/api/')) {
const _uNwNEyva = _jhpHkhsm[0];
return _InukFzBE({ _XuLzSizT: { _CJEEJhVe: _uNwNEyva }, _CZNFhloE: _NsbhLhQq._CZNFhloE }, _XNxvusCC);
}
if (_IFuIYdZv.startsWith('/api/')) {
if (_IFuIYdZv === '/api/_SIhYDjku' && _NsbhLhQq.method === 'POST') return _HUhZsceA(_NsbhLhQq, _XNxvusCC, _DaBmbqHm);
if (_IFuIYdZv === '/api/_nhUPBLbC-_OFRTrClC') return _jmCMhnlI(_NsbhLhQq, _XNxvusCC);
if (_IFuIYdZv === '/api/change-_OFRTrClC') return _VGHkNXHo(_NsbhLhQq, _XNxvusCC);
if (_IFuIYdZv === '/api/verify-_OFRTrClC') return _FjEeAQbK(_NsbhLhQq, _XNxvusCC);
if (_IFuIYdZv === '/api/verify-visitor-_OFRTrClC' && _NsbhLhQq.method === 'POST') return _hVmTzcHF(_NsbhLhQq, _XNxvusCC);
if (_IFuIYdZv === '/api/cache-live-_TqpEJcTu' && _NsbhLhQq.method === 'POST') return _lpGJbzXS(_NsbhLhQq, _XNxvusCC, _DaBmbqHm);
if (_IFuIYdZv === '/api/get-_wVwmCxEU' && _NsbhLhQq.method === 'POST') return _SXNnxObV(_NsbhLhQq, _XNxvusCC);
if (_IFuIYdZv === '/api/get-cached-_XIOkpPjt') return _fxqgOrrT(_NsbhLhQq, _XNxvusCC);
if (_IFuIYdZv === '/api/save-_XIOkpPjt') return _HZcsvwKW(_NsbhLhQq, _XNxvusCC, _DaBmbqHm);
if (_IFuIYdZv === '/api/save-and-get-sub-_CJEEJhVe' && _NsbhLhQq.method === 'POST') return _beLoHeJg(_NsbhLhQq, _XNxvusCC);
if (_IFuIYdZv.startsWith('/api/get-_GmbvsSwM/')) {
const _uNwNEyva = _IFuIYdZv.split('/').pop();
return _InukFzBE({ _XuLzSizT: { _CJEEJhVe: _uNwNEyva }, _CZNFhloE: _NsbhLhQq._CZNFhloE }, _XNxvusCC);
}
if (_IFuIYdZv === '/api/_SIhYDjku' && _NsbhLhQq.method === 'GET') return _BTZPSZAF(_XNxvusCC);
if (_IFuIYdZv === '/api/get-resolved-_XIOkpPjt') return _ZuGUvyOd(_NsbhLhQq);
if (_IFuIYdZv === '/api/parse-_XIOkpPjt-from-_JbeyyeVp' && _NsbhLhQq.method === 'POST') return _pmmnjYqd(_NsbhLhQq, _XNxvusCC);
if (_IFuIYdZv === '/api/endpoints') return _iXCJaeGo(_NsbhLhQq, _XNxvusCC);
if (_IFuIYdZv === '/api/ping') return new Response(null, { status: 204 });
return new Response("API not found", { status: 404 });
}
if (_IFuIYdZv === '/_SBZQozuN') return _rVHuezJj(_NsbhLhQq, _XNxvusCC);
if (_IFuIYdZv === '/bing-wallpaper') return _GODbUGIr();
return _oIrnYgaB(_NsbhLhQq, _XNxvusCC, _DaBmbqHm);
} catch (err) {
let _XDHRyYUc = err;
return new Response(_XDHRyYUc.toString(), { status: 500 });
}
}
};
const _OphoUwyA = { 'Accept': '_cSCwgILF/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 _GUgqbcfc(_CZNFhloE, _UAWSsPwN) {
const _AWDKjORI = await fetch(_CZNFhloE, { _KtriKcqx: { ..._OphoUwyA, 'Referer': _UAWSsPwN.referer } });
if (_AWDKjORI.ok) return _AWDKjORI._cSCwgILF();
return null;
}
async function _RRMcxcZi(_CZNFhloE, _UAWSsPwN) {
const _pDAdpCeL = `https://translate.google.com/translate?sl=auto&tl=en&u=${encodeURIComponent(_CZNFhloE)}`;
const _AWDKjORI = await fetch(_pDAdpCeL, { _KtriKcqx: { ..._OphoUwyA, 'Referer': _UAWSsPwN.referer } });
if (!_AWDKjORI.ok) return null;
const _hjZCJKyY = await _AWDKjORI._cSCwgILF();
const _BBTuYCiT = _hjZCJKyY._BBTuYCiT(/<pre[^>]*>([\s\S]*?)<\/pre>/_FvKzyPek);
return _BBTuYCiT && _BBTuYCiT[1] ? _BBTuYCiT[1].replace(/&/g, '&') : null;
}
function _yhaYrSKb(_WWlNljky) {
let _qmqGtJex;
try {
_qmqGtJex = atob(_WWlNljky.replace(/\s/g, ''));
} catch (_XDHRyYUc) {
_qmqGtJex = _WWlNljky;
}
const _GmbvsSwM = _qmqGtJex.split(/[\s\n\r,]+/).filter(line => line.trim());
const _RBglrrMQ = new Set();
const _AkeETIcv = /@([^?#]+?):(\d+)/;
for (const _grEnblCz of _GmbvsSwM) {
let _WNxLpWwg = '';
let _xmwLFUDv = '';
try {
if (_grEnblCz.startsWith('vmess://')) {
const _xScjlroY = atob(_grEnblCz.substring(8));
const _SIhYDjku = JSON.parse(_xScjlroY);
_WNxLpWwg = _SIhYDjku.add;
_xmwLFUDv = _SIhYDjku._xmwLFUDv;
} else {
const _BBTuYCiT = _grEnblCz._BBTuYCiT(_AkeETIcv);
if (_BBTuYCiT && _BBTuYCiT[1] && _BBTuYCiT[2]) {
_WNxLpWwg = _BBTuYCiT[1].replace(/[\[\]]/g, '');
_xmwLFUDv = _BBTuYCiT[2];
}
}
} catch (_XDHRyYUc) {
console.warn(`Could not parse _grEnblCz: ${_grEnblCz}`);
}
if (_WNxLpWwg && _xmwLFUDv) {
_RBglrrMQ.add(`${_WNxLpWwg}:${_xmwLFUDv}`);
}
}
return Array.from(_RBglrrMQ);
}
async function _YDEaZiif(_NZsdbvHe) {
try {
const _AWDKjORI = await fetch(_NZsdbvHe, { _KtriKcqx: _OphoUwyA });
if (!_AWDKjORI.ok) {
console.error(`Failed to fetch subscription: ${_AWDKjORI.status}`);
return [];
}
const _WWlNljky = await _AWDKjORI._cSCwgILF();
return _yhaYrSKb(_WWlNljky);
} catch (error) {
console.error(`Error processing subscription ${_NZsdbvHe}:`, error);
return [];
}
}
async function _mRwtNEDw(_GzSPOqDJ) {
const _zipGiFJC = _GzSPOqDJ.trim();
const _HzRBRQNE = /^(vless|vmess|trojan|ss):\/\//.test(_zipGiFJC);
const _sebDSGlw = (() => {
if (_zipGiFJC._PZrIbJok < 20 || _zipGiFJC.startsWith('http')) return false;
const _olsZDQDK = _zipGiFJC.replace(/\s/g, '');
if (_olsZDQDK._PZrIbJok % 4 !== 0 && !_olsZDQDK.includes('=')) return false;
try {
atob(_olsZDQDK);
return true;
} catch (_XDHRyYUc) {
return false;
}
})();
if (_HzRBRQNE || _sebDSGlw) {
return _yhaYrSKb(_zipGiFJC).join('\n');
}
const _XaRdpIiS = [
'https://ipdb.api.030101.xyz/?_oasJaeFo=bestcf&_hjROjVXu=true',
'https://ipdb.api.030101.xyz/?_oasJaeFo=bestproxy&_hjROjVXu=true'
];
const _qWArOcIM = /^(https?:\/\/)?([\w.-]+)\.([a-z]{2,})(\/.*)?(sub|clash|v2)/_FvKzyPek.test(_GzSPOqDJ) || _GzSPOqDJ.includes('?_yfeWinCP=');
if (_qWArOcIM) {
const _XIOkpPjt = await _YDEaZiif(_GzSPOqDJ);
return _XIOkpPjt.join('\n');
}
let _WWlNljky = '';
if (_XaRdpIiS.includes(_GzSPOqDJ)) {
_WWlNljky = await _GUgqbcfc(_GzSPOqDJ, { referer: _GzSPOqDJ });
if (!_WWlNljky || _WWlNljky._PZrIbJok < 8) {
_WWlNljky = await _RRMcxcZi(_GzSPOqDJ, { referer: _GzSPOqDJ });
}
} else {
try {
const _hKRjkzWX = await fetch(_GzSPOqDJ, { _KtriKcqx: { 'User-Agent': 'Cloudflare-Worker' } });
if (_hKRjkzWX.ok) {
_WWlNljky = await _hKRjkzWX._cSCwgILF();
} else {
console.warn(`Failed to fetch URL ${_GzSPOqDJ}: ${_hKRjkzWX.status}`);
}
} catch (_XDHRyYUc) {
console.error(`Error fetching URL ${_GzSPOqDJ}:`, _XDHRyYUc);
}
}
const _HHiapmpS = _yhaYrSKb(_WWlNljky);
if (_HHiapmpS._PZrIbJok > 0) {
return _HHiapmpS.join('\n');
}
return _WWlNljky || '';
}
async function _UcegZdOh(_NsbhLhQq, _SIhYDjku) {
if (!_SIhYDjku.streamer._wonlxsxx) {
return new Response('远程流功能未开启', { status: 403 });
}
const _CZNFhloE = new URL(_NsbhLhQq._CZNFhloE);
const _WQbpAiSZ = _CZNFhloE.pathname.substring(1).replace(':/', '://');
try {
const _qkDDmoXH = new URL(_WQbpAiSZ);
const _wJAdUgiJ = ['github.com', 'objects.githubusercontent.com', 'cdn.jsdelivr.net'];
if (!_wJAdUgiJ.some(domain => _qkDDmoXH._WNxLpWwg.endsWith(domain))) {
return new Response('不支持的远程流域名', { status: 400 });
}
const _NJrqEjjq = new Headers(_NsbhLhQq._KtriKcqx);
_NJrqEjjq._nhUPBLbC('Host', _qkDDmoXH._WNxLpWwg);
_NJrqEjjq._nhUPBLbC('User-Agent', 'CF-Worker-Streamer/1.0');
const _xlshcuuO = await fetch(_qkDDmoXH.toString(), {
method: _NsbhLhQq.method,
_KtriKcqx: _NJrqEjjq,
_hjZCJKyY: _NsbhLhQq._hjZCJKyY,
});
const _cbfJuBXx = new Headers(_xlshcuuO._KtriKcqx);
_cbfJuBXx._nhUPBLbC('Access-Control-Allow-Origin', '*');
_cbfJuBXx._nhUPBLbC('Access-Control-Allow-Methods', 'GET, HEAD, POST, PUT, DELETE, OPTIONS');
_cbfJuBXx._nhUPBLbC('Access-Control-Allow-Headers', '*');
_cbfJuBXx._nhUPBLbC('Cache-Control', 'public, max-age=86400');
_cbfJuBXx._nhUPBLbC('X-Streamer-Source', 'CF-Worker');
_cbfJuBXx.delete('_WWlNljky-security-policy');
_cbfJuBXx.delete('x-_WWlNljky-security-policy');
_cbfJuBXx.delete('x-webkit-csp');
return new Response(_xlshcuuO._hjZCJKyY, {
status: _xlshcuuO.status,
statusText: _xlshcuuO.statusText,
_KtriKcqx: _cbfJuBXx,
});
} catch (_XDHRyYUc) {
return new Response('无效的目标URL', { status: 400 });
}
}
async function _jBOOWgPz(_NsbhLhQq, _XNxvusCC, _SIhYDjku) {
try {
const _UdhkFxHf = _SIhYDjku || await _ZukWnOHh(_XNxvusCC);
const _fniDBDCK = (_UdhkFxHf.itemLink._llgiCtvs && _UdhkFxHf.itemLink._llgiCtvs[0]) || {};
const _wUkdcEIq = _fniDBDCK['_yfeWinCP'] || _jAYbHhkJ(_TmmNjEin);
if (!_MeyHEpCI(_wUkdcEIq)) {
throw new Error("Configured user _xCDJpLDv is not valid.");
}
const _aKakGPuY = _UdhkFxHf.dataFeeds.universalFallbackAddress;
let _DlZHsoHE = {};
const _ZoJANtKL = _jAYbHhkJ(_SbSUQQsQ[0] || "");
if (_aKakGPuY) {
const [_NsYqtUkv, _xmwLFUDv = '443'] = _aKakGPuY.split(':');
_DlZHsoHE = { _NsYqtUkv, _xmwLFUDv };
} else {
const [_NsYqtUkv, _xmwLFUDv = '443'] = _ZoJANtKL.split(':');
_DlZHsoHE = { _NsYqtUkv, _xmwLFUDv };
}
const _CZNFhloE = new URL(_NsbhLhQq._CZNFhloE);
const _IFuIYdZv = _CZNFhloE.pathname;
let _nLTorEAB = '';
const _yFtySAMg = _CZNFhloE.searchParams.get('remote');
if (_yFtySAMg) {
_nLTorEAB = atob(_yFtySAMg);
} else if (_IFuIYdZv.startsWith('/endpoint=')) {
_nLTorEAB = _IFuIYdZv.substring(10);
} else if (_IFuIYdZv._PZrIbJok > 1 && _IFuIYdZv.substring(1).includes('.')) {
_nLTorEAB = _IFuIYdZv.substring(1);
}
if (_nLTorEAB) {
const [_NsYqtUkv, _xmwLFUDv = '443'] = _nLTorEAB.split(':');
_DlZHsoHE = { _NsYqtUkv, _xmwLFUDv };
}
return await _kdfrivIb(_NsbhLhQq, _wUkdcEIq, _DlZHsoHE);
} catch (err) {
return new Response(err.toString(), { status: 500 });
}
}
async function _kdfrivIb(_NsbhLhQq, _xCDJpLDv, _DlZHsoHE) {
const _zwqBzDLD = new WebSocketPair();
const [clientEnd, _XbQiGBIu] = Object.values(_zwqBzDLD);
_XbQiGBIu.accept();
let _tFrWAMhW = { _ICMmACvi: null };
const _jEHWbRus = _NsbhLhQq._KtriKcqx.get("sec-websocket-protocol") || "";
const _yrfkVRhp = _JZDbddIf(_XbQiGBIu, _jEHWbRus);
_yrfkVRhp.pipeTo(new WritableStream({
async write(chunk) {
if (_tFrWAMhW._ICMmACvi) {
const _fuiQVDTn = _tFrWAMhW._ICMmACvi.writable.getWriter();
await _fuiQVDTn.write(chunk);
_fuiQVDTn.releaseLock();
return;
}
const { error, details } = await _cETQknKr(chunk, _xCDJpLDv);
if (error) {
throw new Error(details);
}
const _PseFqrKE = new Uint8Array([details._yxzJJfEo[0], 0]);
const _bdojBRxe = chunk.slice(details.payloadIndex);
await _hJdszeNu(_tFrWAMhW, details._UyPOPyOZ, details._jsQETVUC, _bdojBRxe, _XbQiGBIu, _PseFqrKE, _DlZHsoHE);
}
})).catch((err) => {
console.error("Stream processing error:", err);
_ZCqKpJmf(_XbQiGBIu);
});
return new Response(null, { status: 101, webSocket: clientEnd });
}
async function _hJdszeNu(_tFrWAMhW, _UyPOPyOZ, _jsQETVUC, _gQZkoxeR, _rYpPHVqy, _PseFqrKE, _MlnCCVDq) {
const _RNpUKFZg = async (_NsYqtUkv, _xmwLFUDv) => {
let _DmHzuqnu = _NsYqtUkv;
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(_NsYqtUkv)) {
_DmHzuqnu = `${atob('d3d3Lg==')}${_NsYqtUkv}${atob('LnNzbGlwLmlv')}`;
}
const _ICMmACvi = connect({ _WNxLpWwg: _DmHzuqnu, _xmwLFUDv });
_tFrWAMhW._ICMmACvi = _ICMmACvi;
const _fuiQVDTn = _ICMmACvi.writable.getWriter();
await _fuiQVDTn.write(_gQZkoxeR);
_fuiQVDTn.releaseLock();
return _ICMmACvi;
};
const _vqCgQZKh = async () => {
if (!_MlnCCVDq._NsYqtUkv) return;
console.log(`Direct connection failed, falling back to gateway: ${_MlnCCVDq._NsYqtUkv}`);
const _ftMwsiWY = await _RNpUKFZg(_MlnCCVDq._NsYqtUkv, parseInt(_MlnCCVDq._xmwLFUDv, 10));
_ftMwsiWY.closed.catch(() => {}).finally(() => _ZCqKpJmf(_rYpPHVqy));
_ClNtWSuQ(_ftMwsiWY, _rYpPHVqy, _PseFqrKE, null);
};
try {
const _vmcNvBOp = await _RNpUKFZg(_UyPOPyOZ, _jsQETVUC);
_ClNtWSuQ(_vmcNvBOp, _rYpPHVqy, _PseFqrKE, _vqCgQZKh);
} catch (err) {
console.error("Primary connection failed:", err);
await _vqCgQZKh();
}
}
function _JZDbddIf(_XbQiGBIu, _jEHWbRus) {
let _mVHStlUw = false;
return new ReadableStream({
start(_DSDNMzpw) {
_XbQiGBIu.addEventListener("_lvrOUAjH", (event) => { if (_mVHStlUw) return; _DSDNMzpw.enqueue(event._cdYvZwue); });
_XbQiGBIu.addEventListener("close", () => { _ZCqKpJmf(_XbQiGBIu); if (_mVHStlUw) return; _DSDNMzpw.close(); });
_XbQiGBIu.addEventListener("error", (err) => _DSDNMzpw.error(err));
if (_jEHWbRus) {
try {
const _AbvTtcdb = atob(_jEHWbRus.replace(/-/g, "+").replace(/_/g, "/"));
_DSDNMzpw.enqueue(Uint8Array.from(_AbvTtcdb, c => c.charCodeAt(0))._KjUpwlpT);
} catch (_XDHRyYUc) { console.error("Failed to decode early _cdYvZwue:", _XDHRyYUc); }
}
},
cancel() { _mVHStlUw = true; _ZCqKpJmf(_XbQiGBIu); },
});
}
async function _cETQknKr(_KjUpwlpT, _xCDJpLDv) {
if (_KjUpwlpT.byteLength < 24) return { error: true, details: "Invalid packet size" };
const _yxzJJfEo = new Uint8Array(_KjUpwlpT.slice(0, 1));
const _PxuDkVJC = _RsardIah(new Uint8Array(_KjUpwlpT.slice(1, 17)));
if (_PxuDkVJC !== _xCDJpLDv) return { error: true, details: "Invalid _xCDJpLDv" };
const _gNnQPrJK = new Uint8Array(_KjUpwlpT.slice(17, 18))[0];
const _jCowPnse = new Uint8Array(_KjUpwlpT.slice(18 + _gNnQPrJK, 19 + _gNnQPrJK))[0];
if (_jCowPnse !== 1) return { error: true, details: `Unsupported _jCowPnse: ${_jCowPnse}` };
const _YiPmkrSa = 19 + _gNnQPrJK;
const _jsQETVUC = new DataView(_KjUpwlpT.slice(_YiPmkrSa, _YiPmkrSa + 2)).getUint16(0);
let _QmvZghaC = _YiPmkrSa + 2;
const _uhkvfVfc = new Uint8Array(_KjUpwlpT.slice(_QmvZghaC, _QmvZghaC + 1))[0];
let _dhNwZwKF = 0;
let _LuxKCOcS = _QmvZghaC + 1;
let _UyPOPyOZ = "";
switch (_uhkvfVfc) {
case 1: _dhNwZwKF = 4; _UyPOPyOZ = new Uint8Array(_KjUpwlpT.slice(_LuxKCOcS, _LuxKCOcS + _dhNwZwKF)).join("."); break;
case 2: _dhNwZwKF = new Uint8Array(_KjUpwlpT.slice(_LuxKCOcS, _LuxKCOcS + 1))[0]; _LuxKCOcS++; _UyPOPyOZ = new TextDecoder().decode(_KjUpwlpT.slice(_LuxKCOcS, _LuxKCOcS + _dhNwZwKF)); break;
case 3: _dhNwZwKF = 16; const _NvcFxPAg = new DataView(_KjUpwlpT.slice(_LuxKCOcS, _LuxKCOcS + _dhNwZwKF)); const _pXjsscua = []; for (let _FvKzyPek = 0; _FvKzyPek < 8; _FvKzyPek++) _pXjsscua.push(_NvcFxPAg.getUint16(_FvKzyPek * 2).toString(16)); _UyPOPyOZ = _pXjsscua.join(":"); break;
default: return { error: true, details: `Invalid _WUBFWmuf _oasJaeFo: ${_uhkvfVfc}` };
}
if (!_UyPOPyOZ) return { error: true, details: "Target _NsYqtUkv is empty" };
return { error: false, details: { _UyPOPyOZ, _jsQETVUC, _yxzJJfEo, payloadIndex: _LuxKCOcS + _dhNwZwKF } };
}
async function _ClNtWSuQ(_ICMmACvi, _rYpPHVqy, _yLFnakbK, _MwzWHhdT) {
let _abCPklAy = _yLFnakbK;
let _KxOiGWFO = false;
let _cWZHeEtr = _ICMmACvi._yrfkVRhp.pipeTo(new WritableStream({
write(chunk) {
_KxOiGWFO = true;
if (_rYpPHVqy.readyState !== 1) throw new Error("Channel is not open");
if (_abCPklAy) {
const _yZJZEGJq = new Uint8Array(_abCPklAy.byteLength + chunk.byteLength);
_yZJZEGJq._nhUPBLbC(new Uint8Array(_abCPklAy));
_yZJZEGJq._nhUPBLbC(new Uint8Array(chunk), _abCPklAy.byteLength);
_rYpPHVqy.send(_yZJZEGJq._KjUpwlpT);
_abCPklAy = null;
} else {
_rYpPHVqy.send(chunk);
}
},
close() {}
}), { signal: new AbortController().signal }).catch((err) => {
console.error("Pipe to _rYpPHVqy error:", err._lvrOUAjH);
});
await _cWZHeEtr;
if (!_KxOiGWFO && _MwzWHhdT) {
_MwzWHhdT();
}
}
function _ZCqKpJmf(_rYpPHVqy) {
try { if (_rYpPHVqy.readyState === 1 || _rYpPHVqy.readyState === 2) _rYpPHVqy.close(); } catch (_XDHRyYUc) {}
}
const _pBpjwcuN = Array.from({ _PZrIbJok: 256 }, (_, _FvKzyPek) => (_FvKzyPek + 256).toString(16).slice(1));
function _RsardIah(_JMKsUmlx, offset = 0) {
return (
_pBpjwcuN[_JMKsUmlx[offset]] + _pBpjwcuN[_JMKsUmlx[offset + 1]] + _pBpjwcuN[_JMKsUmlx[offset + 2]] + _pBpjwcuN[_JMKsUmlx[offset + 3]] + "-" +
_pBpjwcuN[_JMKsUmlx[offset + 4]] + _pBpjwcuN[_JMKsUmlx[offset + 5]] + "-" +
_pBpjwcuN[_JMKsUmlx[offset + 6]] + _pBpjwcuN[_JMKsUmlx[offset + 7]] + "-" +
_pBpjwcuN[_JMKsUmlx[offset + 8]] + _pBpjwcuN[_JMKsUmlx[offset + 9]] + "-" +
_pBpjwcuN[_JMKsUmlx[offset + 10]] + _pBpjwcuN[_JMKsUmlx[offset + 11]] +
_pBpjwcuN[_JMKsUmlx[offset + 12]] + _pBpjwcuN[_JMKsUmlx[offset + 13]] +
_pBpjwcuN[_JMKsUmlx[offset + 14]] + _pBpjwcuN[_JMKsUmlx[offset + 15]]
).toLowerCase();
}
let _MnlveRKS = { "N/A":"未知" };
async function _MImuRoRI(_CZNFhloE, _jjfrbtdY, _MwzWHhdT) {
try {
const _AWDKjORI = await fetch(_CZNFhloE, {
_KtriKcqx: { 'User-Agent': 'Cloudflare-Worker-IP-Scanner' }
});
if (!_AWDKjORI.ok) {
console.error(`获取 ${_CZNFhloE} 失败: HTTP ${_AWDKjORI.status}`);
return _MwzWHhdT;
}
const _cSCwgILF = await _AWDKjORI._cSCwgILF();
return _jjfrbtdY(_cSCwgILF);
} catch (error) {
console.error(`获取或解析 ${_CZNFhloE} 时发生网络错误: ${error._lvrOUAjH}`);
return _MwzWHhdT;
}
}
function _tmWesDib(_cSCwgILF) {
if (!_cSCwgILF) return [];
const _eYvOOjZR = /^(?:\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\/\d{1,2}|[0-9a-fA-F:]+\/\d{1,3})$/;
const _owyhIxwJ = _cSCwgILF.split(/[\s,;#|]+/);
const _WgeNbkYA = [];
for (const _svESWOqb of _owyhIxwJ) {
const _HlLydRBK = _svESWOqb.trim();
if (!_HlLydRBK) continue;
const _ZWDxwxzc = _HlLydRBK.lastIndexOf(':');
let _nKTtMPnp = _HlLydRBK;
if(_ZWDxwxzc > _HlLydRBK.lastIndexOf(']')) {
const _xMqtjLLk = _HlLydRBK.substring(_ZWDxwxzc + 1);
if(!isNaN(_xMqtjLLk) && _xMqtjLLk._PZrIbJok > 0) {
_nKTtMPnp = _HlLydRBK.substring(0, _ZWDxwxzc);
}
}
if (_LSVbzExQ.isValid(_nKTtMPnp.replace(/[\[\]]/g, '')) || _eYvOOjZR.test(_HlLydRBK)) {
_WgeNbkYA.push(_HlLydRBK);
}
}
return _WgeNbkYA;
}
function _NOsMQsWO(_cSCwgILF) {
if (!_cSCwgILF) return [];
return _cSCwgILF.split(/\s+/).filter(d => d.trim() !== '');
}
function _ubbtMpyT(_cSCwgILF) {
if (!_cSCwgILF) return { "N/A": "未知" };
try {
return JSON.parse(`{${_cSCwgILF}}`);
} catch (_XDHRyYUc) {
console.error("解析 _MnlveRKS 失败:", _XDHRyYUc);
return { "N/A": "未知" };
}
}
const _LSVbzExQ = {
isValid: (_SBZQozuN) => _LSVbzExQ.isIPv4(_SBZQozuN) || _LSVbzExQ.isIPv6(_SBZQozuN),
isIPv4: (_SBZQozuN) => {
if (typeof _SBZQozuN !== 'string') return false;
const _pXjsscua = _SBZQozuN.split('.');
if (_pXjsscua._PZrIbJok !== 4) return false;
return _pXjsscua.every(_mmDvcrDh => {
const _XhqKbeuD = parseInt(_mmDvcrDh, 10);
return !isNaN(_XhqKbeuD) && _XhqKbeuD >= 0 && _XhqKbeuD <= 255 && String(_XhqKbeuD) === _mmDvcrDh;
});
},
isIPv6: (_SBZQozuN) => {
if (typeof _SBZQozuN !== '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]))$/_FvKzyPek.test(_SBZQozuN);
},
toLong4: (_SBZQozuN) => _SBZQozuN.split('.').reduce((acc, octet, _FvKzyPek) => acc + (parseInt(octet) << (8*(3-_FvKzyPek))),0)>>>0,
fromLong4: (long) => [(long>>>24)&0xFF,(long>>>16)&0xFF,(long>>>8)&0xFF,long&0xFF].join('.'),
toBigInt6: (_SBZQozuN) => {
try {
const _WFjNNeTw = _SBZQozuN.split('/')[0];
const _pXjsscua = _WFjNNeTw.split('::');
if (_pXjsscua._PZrIbJok > 2) return 0n;
let _fwJKuyNO = [];
if (_pXjsscua[0]) {
_fwJKuyNO = _pXjsscua[0].split(':');
}
let _yiKiscuO = [];
if (_pXjsscua._PZrIbJok > 1 && _pXjsscua[1]) {
_yiKiscuO = _pXjsscua[1].split(':');
}
if (_fwJKuyNO._PZrIbJok + _yiKiscuO._PZrIbJok > 8) return 0n;
const _NKoDtsfn = 8 - (_fwJKuyNO._PZrIbJok + _yiKiscuO._PZrIbJok);
const _hvbsTRxu = [
..._fwJKuyNO,
...Array(_NKoDtsfn).fill('0'),
..._yiKiscuO
].map(_mmDvcrDh => _mmDvcrDh || '0');
while(_hvbsTRxu._PZrIbJok < 8) {
_hvbsTRxu.push('0');
}
let _NPIIYfLN = 0n;
for (const _mmDvcrDh of _hvbsTRxu) {
if (_mmDvcrDh._PZrIbJok > 4) return 0n;
const _UERXfQIA = BigInt('0x' + _mmDvcrDh);
_NPIIYfLN = (_NPIIYfLN << 16n) | _UERXfQIA;
}
return _NPIIYfLN;
} catch(_XDHRyYUc) {
return 0n;
}
},
fromBigInt6: (_NPIIYfLN) => {
if (typeof _NPIIYfLN !== '_NPIIYfLN' || _NPIIYfLN < 0n) return null;
const _pXjsscua = [];
for (let _FvKzyPek = 0; _FvKzyPek < 8; _FvKzyPek++) {
_pXjsscua.unshift((_NPIIYfLN & 0xFFFFn).toString(16));
_NPIIYfLN >>= 16n;
}
let _uchtYjLY = { start: -1, _lIxdcdnJ: 0 };
let _FPWIfnBc = { start: -1, _lIxdcdnJ: 0 };
for (let _FvKzyPek = 0; _FvKzyPek < 8; _FvKzyPek++) {
if (_pXjsscua[_FvKzyPek] === '0') {
if (_FPWIfnBc.start === -1) _FPWIfnBc.start = _FvKzyPek;
_FPWIfnBc._lIxdcdnJ++;
} else {
if (_FPWIfnBc._lIxdcdnJ > _uchtYjLY._lIxdcdnJ) _uchtYjLY = { ..._FPWIfnBc };
_FPWIfnBc = { start: -1, _lIxdcdnJ: 0 };
}
}
if (_FPWIfnBc._lIxdcdnJ > _uchtYjLY._lIxdcdnJ) _uchtYjLY = { ..._FPWIfnBc };
if (_uchtYjLY._lIxdcdnJ > 1) {
_pXjsscua.splice(_uchtYjLY.start, _uchtYjLY._lIxdcdnJ, '');
if (_uchtYjLY.start === 0) _pXjsscua.unshift('');
if (_uchtYjLY.start + _uchtYjLY._lIxdcdnJ === 8) _pXjsscua.push('');
}
return _pXjsscua.join(':');
},
cidrToRange: (cidr, _VrddzdDQ = 1) => {
try {
const [range, bitsStr] = cidr.split('/');
const _GDXvqVAK = parseInt(bitsStr, 10);
const _XIOkpPjt = new Set();
if (_LSVbzExQ.isIPv4(range)) {
if (isNaN(_GDXvqVAK) || _GDXvqVAK < 8 || _GDXvqVAK > 32) return [];
if (_GDXvqVAK === 32) return [range];
const _xJdDyotE = _LSVbzExQ.toLong4(range);
const _tlXvMSSk = (0xFFFFFFFF << (32 - _GDXvqVAK)) >>> 0;
const _ZqWQyMai = _xJdDyotE & _tlXvMSSk;
const _fQdjshAy = 1 << (32 - _GDXvqVAK);
if (_fQdjshAy <= 2) return [];
const _GQnNEREU = Math.min(_VrddzdDQ, _fQdjshAy - 2);
let _awYaeKpu = 0;
while (_XIOkpPjt.size < _GQnNEREU && _awYaeKpu < _GQnNEREU * 5) {
const _prZPjIxu = Math.floor(Math.random() * (_fQdjshAy - 2)) + 1;
_XIOkpPjt.add(_LSVbzExQ.fromLong4((_ZqWQyMai + _prZPjIxu) >>> 0));
_awYaeKpu++;
}
return Array.from(_XIOkpPjt);
} else if (_LSVbzExQ.isIPv6(range)) {
if (isNaN(_GDXvqVAK) || _GDXvqVAK < 16 || _GDXvqVAK > 128) return [];
if (_GDXvqVAK === 128) return [range];
const _sIpRjNKj = _LSVbzExQ.toBigInt6(range);
const _tlXvMSSk = (2n ** BigInt(128 - _GDXvqVAK) - 1n);
const _ZqWQyMai = _sIpRjNKj & ~_tlXvMSSk;
const _ehgMvVoh = 2n ** BigInt(128 - _GDXvqVAK);
if (_ehgMvVoh <= 2n) return [];
let _awYaeKpu = 0;
while (_XIOkpPjt.size < _VrddzdDQ && _awYaeKpu < _VrddzdDQ * 5) {
const _UYWUgxqF = new Uint8Array(16);
(typeof crypto !== 'undefined' ? crypto : self.crypto).getRandomValues(_UYWUgxqF);
let _XFkXgfOD = 0n;
for (const _oqQOAQao of _UYWUgxqF) {
_XFkXgfOD = (_XFkXgfOD << 8n) | BigInt(_oqQOAQao);
}
const _prZPjIxu = _XFkXgfOD % (_ehgMvVoh - 2n) + 1n;
_XIOkpPjt.add(_LSVbzExQ.fromBigInt6(_ZqWQyMai + _prZPjIxu));
_awYaeKpu++;
}
return Array.from(_XIOkpPjt);
}
return [];
} catch(_XDHRyYUc) {
console.error(`CIDR to range failed for ${cidr}:`, _XDHRyYUc);
return [];
}
}
};
function _YacJIOlL(_tWSYalGG, _hCEjXMcV) {
const _JFIYNjpm = {};
const _rwtwCKOg = Object._rwtwCKOg(_hCEjXMcV);
const _pXjsscua = _rwtwCKOg.map(_jxKrjzxN => {
const _TBclCtjt = _tWSYalGG * (_hCEjXMcV[_jxKrjzxN] / 100);
return { _jxKrjzxN, _VrddzdDQ: Math.floor(_TBclCtjt), remainder: _TBclCtjt - Math.floor(_TBclCtjt) };
});
let _FVdLnDBI = _pXjsscua.reduce((acc, _mmDvcrDh) => acc + _mmDvcrDh._VrddzdDQ, 0);
_pXjsscua.sort((a, b) => b.remainder - a.remainder);
let _iUKRBOWS = _tWSYalGG - _FVdLnDBI;
for (let _FvKzyPek = 0; _FvKzyPek < _iUKRBOWS; _FvKzyPek++) {
_pXjsscua[_FvKzyPek % _pXjsscua._PZrIbJok]._VrddzdDQ++;
}
for (const _mmDvcrDh of _pXjsscua) {
_JFIYNjpm[_mmDvcrDh._jxKrjzxN] = _mmDvcrDh._VrddzdDQ;
}
return _JFIYNjpm;
}
async function _VQtOIxHU(_XNxvusCC) {
const _MbnPtQjl = _XNxvusCC.DB.prepare("SELECT _UERXfQIA FROM kv_data WHERE _jxKrjzxN = ?").bind(_aCvvHRDP);
const { _TqpEJcTu } = await _MbnPtQjl.all();
return _TqpEJcTu._PZrIbJok > 0 ? _TqpEJcTu[0]._UERXfQIA : null;
}
async function _TGtcWLyS(_XNxvusCC, _OFRTrClC) {
const _MbnPtQjl = _XNxvusCC.DB.prepare(
"INSERT INTO kv_data (_jxKrjzxN, _UERXfQIA) VALUES (?, ?) ON CONFLICT(_jxKrjzxN) DO UPDATE SET _UERXfQIA = excluded._UERXfQIA"
);
await _MbnPtQjl.bind(_aCvvHRDP, _OFRTrClC).run();
}
async function _FjEeAQbK(_NsbhLhQq, _XNxvusCC) {
const { _OFRTrClC } = await _NsbhLhQq.json();
const _JfnSIpPL = await _VQtOIxHU(_XNxvusCC);
if (_JfnSIpPL === _OFRTrClC) {
return _RkaQVBQQ({ success: true });
}
return _RkaQVBQQ({ success: false, _lvrOUAjH: '密码错误' }, 401);
}
async function _hVmTzcHF(_NsbhLhQq, _XNxvusCC) {
const _rMwNolcw = await _ZukWnOHh(_XNxvusCC);
if (!_rMwNolcw.visitorPassword || !_rMwNolcw.visitorPassword._wonlxsxx) {
return _RkaQVBQQ({ success: true });
}
try {
const { _OFRTrClC } = await _NsbhLhQq.json();
const _pbLiFbYr = _rMwNolcw.visitorPassword._OFRTrClC;
if (_pbLiFbYr && _OFRTrClC === _pbLiFbYr) {
return _RkaQVBQQ({ success: true });
}
return _RkaQVBQQ({ success: false, _lvrOUAjH: '访客密码错误' }, 401);
} catch (_XDHRyYUc) {
return _RkaQVBQQ({ success: false, _lvrOUAjH: '无效请求' }, 400);
}
}
async function _jmCMhnlI(_NsbhLhQq, _XNxvusCC) {
const _SNjXqQIY = await _VQtOIxHU(_XNxvusCC);
if (_SNjXqQIY) {
return _RkaQVBQQ({ success: false, _lvrOUAjH: "密码已设置,无法重复初始化。" }, 403);
}
const { _OFRTrClC } = await _NsbhLhQq.json();
if (!_OFRTrClC || _OFRTrClC._PZrIbJok < 6) {
return _RkaQVBQQ({ success: false, _lvrOUAjH: "密码长度不能少于6位。" }, 400);
}
await _TGtcWLyS(_XNxvusCC, _OFRTrClC);
return _RkaQVBQQ({ success: true, _lvrOUAjH: "初始密码设置成功!请刷新页面并登录。" });
}
async function _VGHkNXHo(_NsbhLhQq, _XNxvusCC) {
const { _BEEpFAEQ, _DtKKARUY } = await _NsbhLhQq.json();
const _JfnSIpPL = await _VQtOIxHU(_XNxvusCC);
if (_JfnSIpPL !== _BEEpFAEQ) {
return _RkaQVBQQ({ success: false, _lvrOUAjH: "旧密码错误。" }, 403);
}
if (!_DtKKARUY || _DtKKARUY._PZrIbJok < 6) {
return _RkaQVBQQ({ success: false, _lvrOUAjH: "新密码长度不能少于6位。" }, 400);
}
await _TGtcWLyS(_XNxvusCC, _DtKKARUY);
return _RkaQVBQQ({ success: true, _lvrOUAjH: "密码修改成功!" });
}
function _mGCAtdnI() {
return {
theme: 'theme-aurora-glass',
primaryColor: '#00A0FF',
particleColor: '#FFFFFF',
useResolvedDomains: false,
resolvedDomains: '',
sampleSize: 150,
topN: 10,
rttRandomMin: 79,
rttRandomMax: 179,
_cjDlkyii: '',
api: {
_wonlxsxx: true,
_lvrOUAjH: '维护中...',
},
ispFilter: { _wonlxsxx: true },
geoLocation: {
retries: 1,
filterUnknown: false,
},
streamer: {
_wonlxsxx: true
},
websocketStreamer: {
_wonlxsxx: true,
_CZNFhloE: 'https://snippets.neib.cn'
},
cloudStorage: {
_wonlxsxx: true
},
visitorPassword: {
_wonlxsxx: false,
_OFRTrClC: '',
},
customSubPath: {
_wonlxsxx: false,
_IFuIYdZv: 'latest',
},
subscriptionId: {
_PZrIbJok: 8,
_zYvaPzUK: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'
},
itemLink: {
_wonlxsxx: true,
template: 'vless://{_yfeWinCP}@{_SBZQozuN}:{_xmwLFUDv}?encryption=none&security=tls&sni={_NsYqtUkv}&fp=random&_oasJaeFo=ws&_NsYqtUkv={_NsYqtUkv}&_IFuIYdZv={_IFuIYdZv}#{_POYWeYWk}',
selectionMode: 'first',
_llgiCtvs: [
{ _POYWeYWk: '默认配置', _NsYqtUkv: '', '_yfeWinCP': '3b4d4cd8-cb92-4421-bf86-fb51570fc038', _IFuIYdZv: '/?ed=2560' }
],
_IHWGcyvd: [],
},
dataFeeds: {
universalFallbackAddress: '',
},
announcement: {
popup: {
_wonlxsxx: false,
_cSCwgILF: '',
_hdwCeStK: 5
},
marquee: {
_wonlxsxx: false,
_cSCwgILF: ''
}
},
subscriptionUrl: {
prefixEnabled: false,
prefixUrl: '',
suffixEnabled: false,
suffixUrl: ''
},
fineGrained: {
_wonlxsxx: true,
sources: [
{ _WbAofRnc: 'CF官方IPV4', _XIOkpPjt: 'https://raw.githubusercontent.com/5yfx/CF_WEB_IP_Worekrs/refs/heads/main/IPV4', _zydfLqDP: false, _wonlxsxx: true, _ITXKZsmp: 20 },
{ _WbAofRnc: 'CF官方IPV6', _XIOkpPjt: 'https://raw.githubusercontent.com/5yfx/CF_WEB_IP_Worekrs/refs/heads/main/IPV6', _zydfLqDP: false, _wonlxsxx: true, _ITXKZsmp: 20 },
{ _WbAofRnc: '反代优选0', _XIOkpPjt: 'https://wvs.sosorg.nyc.mn/sub?_yfeWinCP=adb14576-6588-40da-99fd-b9894cd779b0&encryption=none&security=tls&sni=ss.nzvrn.com&_oasJaeFo=ws&_NsYqtUkv=ss.nzvrn.com&_IFuIYdZv=%2Fsnippets%3Fip%3DendpointAddress%3Aport%28443%29%26nat64%3D6to4', _zydfLqDP: false, _wonlxsxx: true, _ITXKZsmp: 30 },
{ _WbAofRnc: '官方优选1', _XIOkpPjt: 'https://ipdb.api.030101.xyz/?_oasJaeFo=bestcf&_hjROjVXu=true', _zydfLqDP: false, _wonlxsxx: true, _ITXKZsmp: 10 },
{ _WbAofRnc: '反代优选2', _XIOkpPjt: 'https://ipdb.api.030101.xyz/?_oasJaeFo=bestproxy&_hjROjVXu=true', _zydfLqDP: false, _wonlxsxx: true, _ITXKZsmp: 5 },
{ _WbAofRnc: '官方优选2', _XIOkpPjt: 'https://addressesapi.090227.xyz/_SBZQozuN.164746.xyz', _zydfLqDP: false, _wonlxsxx: true, _ITXKZsmp: 10 },
{ _WbAofRnc: '官方优选3', _XIOkpPjt: 'https://cfxr.eu.org/getSub?_NsYqtUkv=snipaste.huggy.qzz.io', _zydfLqDP: false, _wonlxsxx: true, _ITXKZsmp: 5 },
{ _WbAofRnc: '官方优选4', _XIOkpPjt: 'https://addressesapi.090227.xyz/CloudFlareYes', _zydfLqDP: false, _wonlxsxx: true, _ITXKZsmp: 10 }
]
},
customNodes: {
_wonlxsxx: 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 _eYKatNJP(_PmfvtCNg, _xqryOHIR) {
if (!_PmfvtCNg) return _xqryOHIR;
const _MzDQjqqn = { ..._xqryOHIR };
for (const _jxKrjzxN in _xqryOHIR) {
if (_PmfvtCNg.hasOwnProperty(_jxKrjzxN)) {
if (typeof _PmfvtCNg[_jxKrjzxN] === 'object' && _PmfvtCNg[_jxKrjzxN] !== null && !Array.isArray(_PmfvtCNg[_jxKrjzxN]) && typeof _xqryOHIR[_jxKrjzxN] === 'object' && _xqryOHIR[_jxKrjzxN] !== null && !Array.isArray(_xqryOHIR[_jxKrjzxN])) {
_MzDQjqqn[_jxKrjzxN] = _eYKatNJP(_PmfvtCNg[_jxKrjzxN], _xqryOHIR[_jxKrjzxN]);
} else {
_MzDQjqqn[_jxKrjzxN] = _PmfvtCNg[_jxKrjzxN];
}
}
}
return _MzDQjqqn;
}
async function _ZukWnOHh(_XNxvusCC) {
try {
const _MbnPtQjl = _XNxvusCC.DB.prepare("SELECT _UERXfQIA FROM kv_data WHERE _jxKrjzxN = ?").bind(_DmzZIyqm);
const { _TqpEJcTu } = await _MbnPtQjl.all();
const _xgZkYtWH = _TqpEJcTu._PZrIbJok > 0 ? _TqpEJcTu[0]._UERXfQIA : null;
const _ImKuoWpK = _xgZkYtWH ? JSON.parse(_xgZkYtWH) : {};
return _eYKatNJP(_ImKuoWpK, _mGCAtdnI());
} catch (_XDHRyYUc) {
console.error("无法从D1获取或解析全局配置:", _XDHRyYUc);
return _mGCAtdnI();
}
}
async function _BTZPSZAF(_XNxvusCC) {
const _SIhYDjku = await _ZukWnOHh(_XNxvusCC);
return _RkaQVBQQ(_SIhYDjku);
}
async function _HUhZsceA(_NsbhLhQq, _XNxvusCC, _DaBmbqHm) {
try {
const { _SIhYDjku, adminPassword } = await _NsbhLhQq.json();
const _JfnSIpPL = await _VQtOIxHU(_XNxvusCC);
if (_JfnSIpPL !== adminPassword) {
return _RkaQVBQQ({ success: false, _lvrOUAjH: "管理员密码错误" }, 403);
}
const _MbnPtQjl = _XNxvusCC.DB.prepare(
"INSERT INTO kv_data (_jxKrjzxN, _UERXfQIA) VALUES (?, ?) ON CONFLICT(_jxKrjzxN) DO UPDATE SET _UERXfQIA = excluded._UERXfQIA"
);
const _ipjBaRvv = _MbnPtQjl.bind(_DmzZIyqm, JSON.stringify(_SIhYDjku)).run();
_DaBmbqHm.waitUntil(_ipjBaRvv);
return _RkaQVBQQ({ success: true, _lvrOUAjH: "配置已成功保存!" });
} catch (_XDHRyYUc) {
return _RkaQVBQQ({ success: false, _lvrOUAjH: `保存失败: ${_XDHRyYUc._lvrOUAjH}` }, 500);
}
}
async function _GODbUGIr() {
const _rzZDqKhj = 'https://www.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1&mkt=zh-CN';
try {
const _iVZKSLTW = await fetch(_rzZDqKhj);
const _qJTAlQLh = await _iVZKSLTW.json();
const _zkhCtSsb = 'https://www.bing.com' + _qJTAlQLh.images[0]._CZNFhloE;
return fetch(_zkhCtSsb);
} catch (_XDHRyYUc) {
return new Response('获取壁纸失败', { status: 502 });
}
}
async function _wjNChsjq(_SBZQozuN) {
try {
const _AWDKjORI = await fetch(`http://_SBZQozuN-api.com/json/${_SBZQozuN}?fields=status,_hjROjVXu,countryCode,_QRIzmWOJ&lang=zh-CN`);
if (_AWDKjORI.ok) {
const _cdYvZwue = await _AWDKjORI.json();
if (_cdYvZwue.status === 'success' && (_cdYvZwue.countryCode || _cdYvZwue._hjROjVXu)) {
let _QRIzmWOJ = _cdYvZwue._QRIzmWOJ || '未知';
if (_QRIzmWOJ.toLowerCase().includes('cloudflare')) {
_QRIzmWOJ = 'CloudFlare';
}
return {
_WbAofRnc: _MnlveRKS[_cdYvZwue.countryCode] || _cdYvZwue._hjROjVXu || _cdYvZwue.countryCode,
_QRIzmWOJ: _QRIzmWOJ
};
}
}
} catch (_XDHRyYUc) {}
try {
const _AWDKjORI = await fetch(`https://api._SBZQozuN.sb/geoip/${_SBZQozuN}`);
if (_AWDKjORI.ok) {
const _cdYvZwue = await _AWDKjORI.json();
if (_cdYvZwue.country_code || _cdYvZwue._hjROjVXu) {
let _QRIzmWOJ = _cdYvZwue._QRIzmWOJ || '未知';
if (_QRIzmWOJ.toLowerCase().includes('cloudflare')) {
_QRIzmWOJ = 'CloudFlare';
}
return {
_WbAofRnc: _MnlveRKS[_cdYvZwue.country_code] || _cdYvZwue._hjROjVXu || _cdYvZwue.country_code,
_QRIzmWOJ: _QRIzmWOJ
};
}
}
} catch (_XDHRyYUc) {}
return { _WbAofRnc: '未知', _QRIzmWOJ: '未知' };
}
async function _SXNnxObV(_NsbhLhQq, _XNxvusCC) {
try {
const { _XIOkpPjt } = await _NsbhLhQq.json();
if (!Array.isArray(_XIOkpPjt)) {
return _RkaQVBQQ({ error: "输入无效,需要一个IP数组。" }, 400);
}
const _CCLSnqku = _XIOkpPjt.map(_SBZQozuN => _wjNChsjq(_SBZQozuN).then(_wVwmCxEU => ({ _SBZQozuN, ..._wVwmCxEU })));
const _TqpEJcTu = await Promise.all(_CCLSnqku);
return _RkaQVBQQ(_TqpEJcTu);
} catch (_XDHRyYUc) {
return _RkaQVBQQ({ error: `获取地理位置失败: ${_XDHRyYUc._lvrOUAjH}` }, 500);
}
}
async function _fxqgOrrT(_NsbhLhQq, _XNxvusCC) {
const _SIhYDjku = await _ZukWnOHh(_XNxvusCC);
if (!_SIhYDjku.cloudStorage._wonlxsxx) {
return _RkaQVBQQ({ _TqpEJcTu: [], generatedBy: null });
}
try {
const _MbnPtQjl = _XNxvusCC.DB.prepare("SELECT _UERXfQIA FROM kv_data WHERE _jxKrjzxN = ?").bind(_jLXlaLrt);
const { _TqpEJcTu } = await _MbnPtQjl.all();
const _GqYtsrdg = _TqpEJcTu._PZrIbJok > 0 ? _TqpEJcTu[0]._UERXfQIA : null;
const _zYvcxPju = _GqYtsrdg ? JSON.parse(_GqYtsrdg) : null;
return _RkaQVBQQ(_zYvcxPju || { _TqpEJcTu: [], generatedBy: null });
} catch (_XDHRyYUc) {
console.error("从D1读取缓存IP失败:", _XDHRyYUc);
return _RkaQVBQQ({ _TqpEJcTu: [], generatedBy: null });
}
}
async function _HZcsvwKW(_NsbhLhQq, _XNxvusCC, _DaBmbqHm) {
const _SIhYDjku = await _ZukWnOHh(_XNxvusCC);
if (!_SIhYDjku.cloudStorage._wonlxsxx) {
return _RkaQVBQQ({ success: true, _lvrOUAjH: "云端存储已禁用,不保存结果。" });
}
const _zTvbmdYv = _NsbhLhQq._KtriKcqx.get('CF-Connecting-IP') || "未知IP";
const _hjROjVXu = _NsbhLhQq.cf?._hjROjVXu || "未知";
const _TeDupfqr = _NsbhLhQq.cf?._TeDupfqr || "";
let _ZtXnVclm = _MnlveRKS[_hjROjVXu] || _hjROjVXu;
if (_TeDupfqr && _TeDupfqr !== "未知城市" && _TeDupfqr !== _hjROjVXu) _ZtXnVclm = `${_ZtXnVclm} ${_MnlveRKS[_TeDupfqr] || _TeDupfqr}`;
const _KsrlsVjt = {
_SBZQozuN: _wyfLwPxo(_zTvbmdYv),
_WbAofRnc: _ZtXnVclm.trim(),
time: _wKDCybkf()
};
try {
const _tJinDhWm = await _NsbhLhQq.json();
if (!Array.isArray(_tJinDhWm)) return _RkaQVBQQ({ error: "无效数据格式" }, 400);
const _wbhrJeLB = _tJinDhWm.map(_yXEJunSJ => ({
_SBZQozuN: String(_yXEJunSJ._SBZQozuN || ''),
_xmwLFUDv: _yXEJunSJ._xmwLFUDv ? parseInt(_yXEJunSJ._xmwLFUDv, 10) : undefined,
_hPNWAmuZ: parseInt(_yXEJunSJ._hPNWAmuZ, 10),
_WbAofRnc: typeof _yXEJunSJ._WbAofRnc === 'string' ? _yXEJunSJ._WbAofRnc.substring(0, 50) : 'N/A',
_QRIzmWOJ: typeof _yXEJunSJ._QRIzmWOJ === 'string' ? _yXEJunSJ._QRIzmWOJ.substring(0, 100) : 'N/A'
}));
const _BhkhIVtx = {
generatedBy: _KsrlsVjt,
_TqpEJcTu: _wbhrJeLB
};
const _PwMCnrrj = _XNxvusCC.DB.prepare(
"INSERT INTO kv_data (_jxKrjzxN, _UERXfQIA) VALUES (?, ?) ON CONFLICT(_jxKrjzxN) DO UPDATE SET _UERXfQIA = excluded._UERXfQIA"
).bind(_jLXlaLrt, JSON.stringify(_BhkhIVtx)).run();
if (_SIhYDjku.telegram.bot_token && _SIhYDjku.telegram.chat_id) {
const _BFLmHujx = _wbhrJeLB.map(r => `${r._SBZQozuN} ~ ${r._WbAofRnc}`).join('\n');
const _DsRrUZnP = `优选完成!\n来源: ${_KsrlsVjt._SBZQozuN} (${_KsrlsVjt._WbAofRnc})\n时间: ${_KsrlsVjt.time}\n\n结果:\n${_BFLmHujx}`;
const _lHbPSuXK = `https://api.telegram.org/bot${_SIhYDjku.telegram.bot_token}/sendMessage?chat_id=${_SIhYDjku.telegram.chat_id}&_cSCwgILF=${encodeURIComponent(_DsRrUZnP)}`;
const _IiBmNUde = fetch(_lHbPSuXK).catch(_XDHRyYUc => console.error("Telegram结果通知失败:", _XDHRyYUc));
_DaBmbqHm.waitUntil(Promise.all([_PwMCnrrj, _IiBmNUde]));
} else {
_DaBmbqHm.waitUntil(_PwMCnrrj);
}
return _RkaQVBQQ({ success: true, _lvrOUAjH: "结果已保存" });
} catch (_XDHRyYUc) {
return _RkaQVBQQ({ error: "D1写入失败", _lvrOUAjH: _XDHRyYUc._lvrOUAjH }, 500);
}
}
async function _lpGJbzXS(_NsbhLhQq, _XNxvusCC, _DaBmbqHm) {
try {
const _ooiAoGzF = await _NsbhLhQq.json();
if (!Array.isArray(_ooiAoGzF)) return _RkaQVBQQ({ error: "无效数据格式" }, 400);
const _BhkhIVtx = {
_TqpEJcTu: _ooiAoGzF
};
const _MbnPtQjl = _XNxvusCC.DB.prepare(
"INSERT INTO kv_data (_jxKrjzxN, _UERXfQIA) VALUES (?, ?) ON CONFLICT(_jxKrjzxN) DO UPDATE SET _UERXfQIA = excluded._UERXfQIA"
);
const _ipjBaRvv = _MbnPtQjl.bind(_tDNOszxK, JSON.stringify(_BhkhIVtx)).run();
_DaBmbqHm.waitUntil(_ipjBaRvv);
return _RkaQVBQQ({ success: true });
} catch (_XDHRyYUc) {
return _RkaQVBQQ({ error: "D1写入临时缓存失败", _lvrOUAjH: _XDHRyYUc._lvrOUAjH }, 500);
}
}
function _FNXmrJaZ(_PZrIbJok, _zYvaPzUK) {
let _YMMuIrxp = '';
const _UXjzyucH = _zYvaPzUK._PZrIbJok;
for (let _FvKzyPek = 0; _FvKzyPek < _PZrIbJok; _FvKzyPek++) {
_YMMuIrxp += _zYvaPzUK.charAt(Math.floor(Math.random() * _UXjzyucH));
}
return _YMMuIrxp;
}
async function _beLoHeJg(_NsbhLhQq, _XNxvusCC) {
try {
const _tJinDhWm = await _NsbhLhQq.json();
if (!Array.isArray(_tJinDhWm) || _tJinDhWm._PZrIbJok === 0) {
return _RkaQVBQQ({ error: "无效或空的IP列表" }, 400);
}
const _SIhYDjku = await _ZukWnOHh(_XNxvusCC);
const _fxpLShLY = _SIhYDjku.subscriptionId || { _PZrIbJok: 8, _zYvaPzUK: 'abcdefghijklmnopqrstuvwxyz0123456789' };
let _uNwNEyva;
let _JWCFszqh = false;
let _awYaeKpu = 0;
const _BNLaOjiJ = 10;
while (!_JWCFszqh && _awYaeKpu < _BNLaOjiJ) {
_uNwNEyva = _FNXmrJaZ(_fxpLShLY._PZrIbJok, _fxpLShLY._zYvaPzUK);
const { _TqpEJcTu } = await _XNxvusCC.DB.prepare("SELECT _CJEEJhVe FROM optimized_results WHERE _CJEEJhVe = ?").bind(_uNwNEyva).all();
if (_TqpEJcTu._PZrIbJok === 0) {
_JWCFszqh = true;
}
_awYaeKpu++;
}
if (!_JWCFszqh) {
return _RkaQVBQQ({ error: "无法生成唯一的订阅ID,请稍后重试或调整ID设置。" }, 500);
}
const _KXjRTfWB = JSON.stringify({ _XIOkpPjt: _tJinDhWm });
await _XNxvusCC.DB.prepare(
"INSERT INTO optimized_results (_CJEEJhVe, _cdYvZwue) VALUES (?, ?)"
).bind(_uNwNEyva, _KXjRTfWB).run();
await _XNxvusCC.DB.prepare(
"INSERT INTO kv_data (_jxKrjzxN, _UERXfQIA) VALUES (?, ?) ON CONFLICT(_jxKrjzxN) DO UPDATE SET _UERXfQIA = excluded._UERXfQIA"
).bind(_ZlZibYTS, _uNwNEyva).run();
return _RkaQVBQQ({ success: true, _CJEEJhVe: _uNwNEyva });
} catch (_XDHRyYUc) {
return _RkaQVBQQ({ error: "保存优选结果失败", _lvrOUAjH: _XDHRyYUc._lvrOUAjH }, 500);
}
}
async function _InukFzBE(_NsbhLhQq, _XNxvusCC) {
try {
const _uNwNEyva = _NsbhLhQq._XuLzSizT._CJEEJhVe;
if (!_uNwNEyva) {
return new Response("缺少结果ID", { status: 400 });
}
const _YMMuIrxp = await _XNxvusCC.DB.prepare("SELECT _cdYvZwue FROM optimized_results WHERE _CJEEJhVe = ?").bind(_uNwNEyva).first();
if (!_YMMuIrxp) {
return new Response("未找到对应的优选结果", { status: 404 });
}
const _cdYvZwue = JSON.parse(_YMMuIrxp._cdYvZwue);
let _BFLmHujx = _cdYvZwue._XIOkpPjt;
const _SIhYDjku = await _ZukWnOHh(_XNxvusCC);
if (_SIhYDjku.customNodes && _SIhYDjku.customNodes._wonlxsxx && _SIhYDjku.customNodes.list) {
const _SEZiSmsr = _SIhYDjku.customNodes.list.trim().split(/\s+/).filter(Boolean);
const _eygfNorI = _SEZiSmsr.map(_grEnblCz => {
let _WUBFWmuf = _grEnblCz;
let _xmwLFUDv = undefined;
let _POYWeYWk = null;
if (_WUBFWmuf.includes('@')) {
const _pXjsscua = _WUBFWmuf.split('@');
_POYWeYWk = _pXjsscua.pop();
_WUBFWmuf = _pXjsscua.join('@');
}
if (_WUBFWmuf.includes('#')) {
const _pXjsscua = _WUBFWmuf.split('#');
const _xMqtjLLk = _pXjsscua.pop();
if (!isNaN(_xMqtjLLk) && _xMqtjLLk.trim() !== '') {
_xmwLFUDv = parseInt(_xMqtjLLk, 10);
}
_WUBFWmuf = _pXjsscua.join('#');
}
return {
_SBZQozuN: _WUBFWmuf,
_xmwLFUDv: _xmwLFUDv,
_WbAofRnc: _POYWeYWk || _WUBFWmuf,
_QRIzmWOJ: '自定义'
};
});
_BFLmHujx.unshift(..._eygfNorI);
}
const { itemLink } = _SIhYDjku;
const _plPxybMc = new URL(_NsbhLhQq._CZNFhloE)._WNxLpWwg;
let _gonvJTZg;
if (_SIhYDjku.websocketStreamer && _SIhYDjku.websocketStreamer._wonlxsxx) {
if (!itemLink || !itemLink._wonlxsxx || !itemLink._llgiCtvs || itemLink._llgiCtvs._PZrIbJok === 0) {
return new Response("节点链接参数未配置或未启用 (反代模式)", { status: 500 });
}
_gonvJTZg = _BFLmHujx.map((_yXEJunSJ, _zhxfSRNE) => {
let _POYWeYWk;
if (_yXEJunSJ._QRIzmWOJ === '自定义') {
_POYWeYWk = `${_zhxfSRNE + 1} - ${_yXEJunSJ._WbAofRnc}`;
} else {
_POYWeYWk = `${_zhxfSRNE + 1} - ${_yXEJunSJ._WbAofRnc || '未知'}`;
if (!_yXEJunSJ._QRIzmWOJ || !_yXEJunSJ._QRIzmWOJ.toLowerCase().includes('cloudflare')) {
_POYWeYWk += '(反代)';
}
}
const _HbnPpVBP = _LSVbzExQ.isIPv6(_yXEJunSJ._SBZQozuN) ? `[${_yXEJunSJ._SBZQozuN}]` : _yXEJunSJ._SBZQozuN;
const _xmwLFUDv = _yXEJunSJ._xmwLFUDv || 443;
const _kyaBYHsi = itemLink._llgiCtvs[0];
const _DkKyJKvf = _kyaBYHsi._yfeWinCP || '';
const _yfeWinCP = (_DkKyJKvf && _MeyHEpCI(_DkKyJKvf)) ? _DkKyJKvf : crypto.randomUUID();
const _IFuIYdZv = '/snippets?_SBZQozuN=endpointAddress:_xmwLFUDv(443)&nat64=6to4';
const _NsYqtUkv = _kyaBYHsi._NsYqtUkv || _plPxybMc;
const _XuLzSizT = new URLSearchParams({
security: 'tls',
_oasJaeFo: 'ws',
_NsYqtUkv: _NsYqtUkv,
sni: _NsYqtUkv,
fp: 'random'
});
return `vless://${_yfeWinCP}@${_HbnPpVBP}:${_xmwLFUDv}?${_XuLzSizT.toString()}&_IFuIYdZv=${encodeURIComponent(encodeURIComponent(_IFuIYdZv))}#${encodeURIComponent(_POYWeYWk)}`;
});
} else {
if (!itemLink || !itemLink._wonlxsxx || !itemLink._llgiCtvs || itemLink._llgiCtvs._PZrIbJok === 0) {
return new Response("节点链接参数未配置或未启用", { status: 500 });
}
const _kyaBYHsi = itemLink._llgiCtvs[0];
const { _NsYqtUkv, _yfeWinCP, _IFuIYdZv } = _kyaBYHsi;
_gonvJTZg = _BFLmHujx.map((_yXEJunSJ, _zhxfSRNE) => {
let _POYWeYWk;
if (_yXEJunSJ._QRIzmWOJ === '自定义') {
_POYWeYWk = `${_zhxfSRNE + 1} - ${_yXEJunSJ._WbAofRnc}`;
} else {
_POYWeYWk = `${_zhxfSRNE + 1} - ${_yXEJunSJ._WbAofRnc || '未知'}`;
if (!_yXEJunSJ._QRIzmWOJ || !_yXEJunSJ._QRIzmWOJ.toLowerCase().includes('cloudflare')) {
_POYWeYWk += '(反代)';
}
}
const _HbnPpVBP = _LSVbzExQ.isIPv6(_yXEJunSJ._SBZQozuN) ? `[${_yXEJunSJ._SBZQozuN}]` : _yXEJunSJ._SBZQozuN;
const _xmwLFUDv = _yXEJunSJ._xmwLFUDv || 443;
const _XuLzSizT = new URLSearchParams({
security: 'tls',
_oasJaeFo: 'ws',
_NsYqtUkv: _NsYqtUkv || _plPxybMc,
sni: _NsYqtUkv || _plPxybMc,
fp: 'random'
});
return `vless://${_yfeWinCP}@${_HbnPpVBP}:${_xmwLFUDv}?${_XuLzSizT.toString()}&_IFuIYdZv=${encodeURIComponent(encodeURIComponent(_IFuIYdZv || ''))}#${encodeURIComponent(_POYWeYWk)}`;
});
}
const _wFKSBMtA = _gonvJTZg.join('\n');
const _LEpmpMxZ = btoa(_wFKSBMtA);
return new Response(_LEpmpMxZ, {
_KtriKcqx: { 'Content-Type': '_cSCwgILF/plain; _zYvaPzUK=utf-8' }
});
} catch (_XDHRyYUc) {
return new Response(`生成节点列表失败: ${_XDHRyYUc._lvrOUAjH}`, { status: 500 });
}
}
async function _ZuGUvyOd(_NsbhLhQq) {
try {
const { _liebYLMH, _oasJaeFo } = await _NsbhLhQq.json();
if (!Array.isArray(_liebYLMH)) {
return new Response('Invalid _liebYLMH list', { status: 400 });
}
const _jWBcmJXg = _liebYLMH.map(domain => {
if (!domain.trim()) return Promise.resolve([]);
const _CZNFhloE = `https://cloudflare-dns.com/dns-query?_POYWeYWk=${encodeURIComponent(domain.trim())}&_oasJaeFo=${_oasJaeFo || 'A'}`;
return fetch(_CZNFhloE, { _KtriKcqx: { 'Accept': 'application/dns-json' } })
.then(_AWDKjORI => _AWDKjORI.json())
.then(_cdYvZwue => (_cdYvZwue.Answer ? _cdYvZwue.Answer.map(a => a._cdYvZwue) : []))
.catch(() => []);
});
const _AtZNRCOd = (await Promise.all(_jWBcmJXg)).flat();
const _ifxMbkhX = [...new Set(_AtZNRCOd)];
if (_ifxMbkhX._PZrIbJok === 0) {
return new Response('无法从域名解析出任何IP。', { status: 500 });
}
return new Response(_ifxMbkhX.join('\n'), { _KtriKcqx: { 'Content-Type': '_cSCwgILF/plain; _zYvaPzUK=utf-8' } });
} catch (err) {
return new Response(`域名解析错误: ${err._lvrOUAjH}`, { status: 500 });
}
}
async function _pmmnjYqd(_NsbhLhQq, _XNxvusCC) {
try {
const { _JbeyyeVp } = await _NsbhLhQq.json();
if (!Array.isArray(_JbeyyeVp)) {
return _RkaQVBQQ({ error: "Invalid input, expected an object with a '_JbeyyeVp' array." }, 400);
}
const _iqofYCKu = new Set();
const _bCOwvwBF = _JbeyyeVp.map(_CZNFhloE =>
_mRwtNEDw(_CZNFhloE)
.then(_cSCwgILF => {
if (!_cSCwgILF) return;
const _owyhIxwJ = _cSCwgILF.split(/[\s,;|]+/);
for (const _svESWOqb of _owyhIxwJ) {
const _HlLydRBK = _svESWOqb.trim();
if (_HlLydRBK) {
_iqofYCKu.add(_HlLydRBK);
}
}
})
.catch(err => {
console.error(`Error processing URL ${_CZNFhloE}:`, err);
})
);
await Promise.all(_bCOwvwBF);
return _RkaQVBQQ({ _XIOkpPjt: Array.from(_iqofYCKu) });
} catch (_XDHRyYUc) {
return _RkaQVBQQ({ error: `Failed to process URLs: ${_XDHRyYUc._lvrOUAjH}` }, 500);
}
}
async function _rVHuezJj(_NsbhLhQq, _XNxvusCC) {
const _SIhYDjku = await _ZukWnOHh(_XNxvusCC);
if (!_SIhYDjku.api._wonlxsxx) {
return new Response(_SIhYDjku.api._lvrOUAjH || 'API is disabled.', { status: 503 });
}
try {
const _MbnPtQjl = _XNxvusCC.DB.prepare("SELECT _UERXfQIA FROM kv_data WHERE _jxKrjzxN = ?").bind(_jLXlaLrt);
const { _TqpEJcTu: dbResults } = await _MbnPtQjl.all();
const _GqYtsrdg = dbResults._PZrIbJok > 0 ? dbResults[0]._UERXfQIA : null;
const _zYvcxPju = _GqYtsrdg ? JSON.parse(_GqYtsrdg) : null;
if (!_zYvcxPju || !_zYvcxPju._TqpEJcTu || _zYvcxPju._TqpEJcTu._PZrIbJok === 0) {
return new Response("上次优选结果为空。", {
status: 404,
_KtriKcqx: { 'Content-Type': '_cSCwgILF/plain; _zYvaPzUK=utf-8' },
});
}
const _XIOkpPjt = _zYvcxPju._TqpEJcTu.map(r => r._SBZQozuN);
return new Response(_XIOkpPjt.join('\n'), {
_KtriKcqx: { 'Content-Type': '_cSCwgILF/plain; _zYvaPzUK=utf-8' },
});
} catch (_XDHRyYUc) {
console.error("API /_SBZQozuN 处理错误:", _XDHRyYUc);
return new Response(`API处理时出错: ${_XDHRyYUc._lvrOUAjH}`, { status: 500 });
}
}
function _NrTHABKl(_YMMuIrxp, _zhxfSRNE, _SIhYDjku, _plPxybMc) {
const { itemLink } = _SIhYDjku;
if (!itemLink || !itemLink._wonlxsxx) return null;
const { template, _llgiCtvs, selectionMode, _IHWGcyvd } = itemLink;
if (!_llgiCtvs || _llgiCtvs._PZrIbJok === 0) return null;
let _HtpBTesu;
if (selectionMode === 'random') {
_HtpBTesu = _llgiCtvs[_zhxfSRNE % _llgiCtvs._PZrIbJok];
} else if (selectionMode === 'first') {
_HtpBTesu = _llgiCtvs[0];
} else {
_HtpBTesu = _llgiCtvs.find(s => s._POYWeYWk === selectionMode) || _llgiCtvs[0];
}
if (!_HtpBTesu) return null;
let _fGYYMufm = template;
const _HcjqBiZW = _YMMuIrxp._xmwLFUDv || 443;
const _DXVwAkXJ = _LSVbzExQ.isIPv6(_YMMuIrxp._SBZQozuN) ? `[${_YMMuIrxp._SBZQozuN}]` : _YMMuIrxp._SBZQozuN;
let _POYWeYWk = `${_zhxfSRNE + 1} 、 ${_YMMuIrxp._WbAofRnc || '未知'}`;
if (!_YMMuIrxp._QRIzmWOJ || !_YMMuIrxp._QRIzmWOJ.toLowerCase().includes('cloudflare')) {
_POYWeYWk += '(反代)';
}
let _NsYqtUkv = _HtpBTesu._NsYqtUkv || _plPxybMc;
_fGYYMufm = _fGYYMufm.replace(/{_SBZQozuN}/g, _DXVwAkXJ)
.replace(/{_xmwLFUDv}/g, _HcjqBiZW)
.replace(/{_POYWeYWk}/g, encodeURIComponent(_POYWeYWk))
.replace(/{rank}/g, _zhxfSRNE + 1)
.replace(/{_WbAofRnc}/g, encodeURIComponent(_YMMuIrxp._WbAofRnc || '未知'))
.replace(/{_QRIzmWOJ}/g, encodeURIComponent(_YMMuIrxp._QRIzmWOJ || '未知'))
.replace(/{_NsYqtUkv}/g, encodeURIComponent(_NsYqtUkv))
.replace(/{_yfeWinCP}/g, encodeURIComponent(_HtpBTesu['_yfeWinCP'] || ''))
.replace(/{_IFuIYdZv}/g, encodeURIComponent(encodeURIComponent(_HtpBTesu._IFuIYdZv || '')));
if (_IHWGcyvd) {
_IHWGcyvd.forEach(field => {
const _OavIpmLs = new RegExp('{' + field._POYWeYWk + '}', 'g');
_fGYYMufm = _fGYYMufm.replace(_OavIpmLs, encodeURIComponent(field._UERXfQIA));
});
}
return _fGYYMufm;
}
async function _iXCJaeGo(_NsbhLhQq, _XNxvusCC) {
const _SIhYDjku = await _ZukWnOHh(_XNxvusCC);
if (!_SIhYDjku.itemLink._wonlxsxx) {
return new Response("Item _fGYYMufm feature is disabled.", { status: 503, _KtriKcqx: { 'Content-Type': '_cSCwgILF/plain; _zYvaPzUK=utf-8' } });
}
try {
const _MbnPtQjl = _XNxvusCC.DB.prepare("SELECT _UERXfQIA FROM kv_data WHERE _jxKrjzxN = ?").bind(_jLXlaLrt);
const { _TqpEJcTu: dbResults } = await _MbnPtQjl.all();
const _GqYtsrdg = dbResults._PZrIbJok > 0 ? dbResults[0]._UERXfQIA : null;
const _zYvcxPju = _GqYtsrdg ? JSON.parse(_GqYtsrdg) : null;
if (!_zYvcxPju || !_zYvcxPju._TqpEJcTu || _zYvcxPju._TqpEJcTu._PZrIbJok === 0) {
return new Response("No optimized IPs available to generate endpoints.", {
status: 404,
_KtriKcqx: { 'Content-Type': '_cSCwgILF/plain; _zYvaPzUK=utf-8' },
});
}
const _plPxybMc = new URL(_NsbhLhQq._CZNFhloE)._WNxLpWwg;
const _JBCpThte = _zYvcxPju._TqpEJcTu.map((_YMMuIrxp, _zhxfSRNE) => {
return _NrTHABKl(_YMMuIrxp, _zhxfSRNE, _SIhYDjku, _plPxybMc);
}).filter(Boolean);
if (_JBCpThte._PZrIbJok === 0) {
return new Response("Could not generate any _yXEJunSJ links from the available IPs.", {
status: 500,
_KtriKcqx: { 'Content-Type': '_cSCwgILF/plain; _zYvaPzUK=utf-8' },
});
}
return new Response(_JBCpThte.join('\n'), {
_KtriKcqx: { 'Content-Type': '_cSCwgILF/plain; _zYvaPzUK=utf-8' },
});
} catch (_XDHRyYUc) {
console.error("API /api/endpoints error:", _XDHRyYUc);
return new Response(`Error processing API _NsbhLhQq: ${_XDHRyYUc._lvrOUAjH}`, { status: 500 });
}
}
async function _oIrnYgaB(_NsbhLhQq, _XNxvusCC, _DaBmbqHm) {
const _zTvbmdYv = _NsbhLhQq._KtriKcqx.get('CF-Connecting-IP') || "未知IP";
const [
_IdjSbFwJ,
_BPeNVEbX,
defaultDomains,
fetchedCountryMap
] = await Promise.all([
_MImuRoRI(_FnbzKEKt, _tmWesDib, []),
_MImuRoRI(_pQMyrqhT, _tmWesDib, []),
_MImuRoRI(_vWibskOC, _NOsMQsWO, []),
_MImuRoRI(_RGgJJWUC, _ubbtMpyT, { "N/A": "未知" })
]);
_MnlveRKS = fetchedCountryMap;
let _fcsZCsQg = false;
let _rMwNolcw;
try {
const _OFRTrClC = await _VQtOIxHU(_XNxvusCC);
_fcsZCsQg = !!_OFRTrClC;
_rMwNolcw = await _ZukWnOHh(_XNxvusCC);
} catch (_XDHRyYUc) {
if (_XDHRyYUc._lvrOUAjH && _XDHRyYUc._lvrOUAjH.includes('no such table')) {
console.log("检测到 'kv_data' 表不存在,正在自动创建...");
try {
const _QKyICLUe = "CREATE TABLE IF NOT EXISTS kv_data (_jxKrjzxN TEXT PRIMARY KEY, _UERXfQIA TEXT); CREATE TABLE IF NOT EXISTS optimized_results (_CJEEJhVe TEXT PRIMARY KEY, _cdYvZwue TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP);";
await _XNxvusCC.DB.exec(_QKyICLUe);
console.log("数据表创建成功。");
_fcsZCsQg = false;
_rMwNolcw = _mGCAtdnI();
} catch (dbError) {
console.error("自动创建数据表失败:", dbError);
return new Response(`数据库初始化失败: ${dbError._lvrOUAjH}`, {
status: 500,
_KtriKcqx: { 'Content-Type': '_cSCwgILF/html;_zYvaPzUK=UTF-8' }
});
}
} else {
let _bWyvwgLR = _jVChRqEL(_XDHRyYUc._lvrOUAjH);
return new Response(_bWyvwgLR, { _KtriKcqx: { 'Content-Type': '_cSCwgILF/html;_zYvaPzUK=UTF-8' } });
}
}
if (_rMwNolcw.telegram.bot_token && _rMwNolcw.telegram.chat_id) {
const _hjROjVXu = _NsbhLhQq.cf?._hjROjVXu || "未知";
const _TeDupfqr = _NsbhLhQq.cf?._TeDupfqr || "";
let _ZtXnVclm = _MnlveRKS[_hjROjVXu] || _hjROjVXu;
if (_TeDupfqr && _TeDupfqr !== "未知城市" && _TeDupfqr !== _hjROjVXu) _ZtXnVclm = `${_ZtXnVclm} ${_MnlveRKS[_TeDupfqr] || _TeDupfqr}`;
const _nUljvSya = _wKDCybkf();
const _yYHrSRAu = _NsbhLhQq._CZNFhloE;
const _DsRrUZnP = `访客: ${_zTvbmdYv}\n位置: ${_ZtXnVclm.trim()}\n时间: ${_nUljvSya}\n来自:${_yYHrSRAu}`;
const _lHbPSuXK = `https://api.telegram.org/bot${_rMwNolcw.telegram.bot_token}/sendMessage?chat_id=${_rMwNolcw.telegram.chat_id}&_cSCwgILF=${encodeURIComponent(_DsRrUZnP)}`;
_DaBmbqHm.waitUntil(fetch(_lHbPSuXK).catch(_XDHRyYUc => console.error("Telegram通知失败:", _XDHRyYUc)));
}
let _luvcAOUM = _eMsHOwLp();
const _yppSspxn = {
_SIhYDjku: _rMwNolcw,
status: {
_fcsZCsQg: _fcsZCsQg,
}
};
_luvcAOUM = _luvcAOUM.replace('__PAGE_DATA_JSON__', JSON.stringify(_yppSspxn));
_luvcAOUM = _luvcAOUM.replace('__ALL_CF_CIDR_LIST_JSON__', JSON.stringify(_IdjSbFwJ));
_luvcAOUM = _luvcAOUM.replace('__BALANCED_CF_CIDR_LIST_JSON__', JSON.stringify(_BPeNVEbX));
_luvcAOUM = _luvcAOUM.replace('__DEFAULT_DOMAINS_LIST_JSON__', JSON.stringify(defaultDomains));
_luvcAOUM = _luvcAOUM.replace('__COUNTRY_MAP_JSON__', JSON.stringify(_MnlveRKS));
return new Response(_luvcAOUM, {
_KtriKcqx: { 'Content-Type': '_cSCwgILF/html;_zYvaPzUK=UTF-8' },
});
}
function _RkaQVBQQ(_hjZCJKyY, status = 200, _KtriKcqx = {}) {
return new Response(JSON.stringify(_hjZCJKyY), {
status,
_KtriKcqx: { 'Content-Type': 'application/json;_zYvaPzUK=UTF-8', ..._KtriKcqx }
});
}
function _wKDCybkf(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 _wyfLwPxo(_SBZQozuN) {
if (!_SBZQozuN || typeof _SBZQozuN !== 'string') return "无效IP";
if(_LSVbzExQ.isIPv4(_SBZQozuN)){
const _pXjsscua = _SBZQozuN.split('.');
if (_pXjsscua._PZrIbJok === 4) return `${_pXjsscua[0]}.*.*.${_pXjsscua[3]}`;
}
if(_LSVbzExQ.isIPv6(_SBZQozuN)){
const _pXjsscua = _SBZQozuN.split(':');
if (_pXjsscua._PZrIbJok > 2) return `${_pXjsscua[0]}:...:${_pXjsscua[_pXjsscua._PZrIbJok - 1]}`;
}
return _SBZQozuN;
}
function _jVChRqEL(_ASgnEAIQ) {
return `
<!DOCTYPE html><html lang="zh-CN"><head><meta _zYvaPzUK="UTF-8"><title>需要设置</title>
<_NdXcHBqO>
_hjZCJKyY { font-family: sans-serif; background: #1a1a1a; _xwJDCZIY: #e0e0e0; display: flex; justify-_WWlNljky: center; align-items: center; height: 100vh; margin: 0; }
._CIjYUUFU { max-_vwrrKRSb: 800px; padding: 2rem; background: #25282e; border: 1px solid #4044c; border-radius: 8px; box-shadow: 0 5px 15px rgba(0,0,0,0.3); }
h1 { _xwJDCZIY: #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 { _xwJDCZIY: #da3633; background: rgba(218, 54, 51, 0.1); padding: 0.5rem; border-radius: 4px; margin-_xfnPbCTB: 1rem; }
</_NdXcHBqO>
</head><_hjZCJKyY>
<div class="_CIjYUUFU">
<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>
${_ASgnEAIQ ? `<div class="error"><strong>当前错误信息:</strong> ${_ASgnEAIQ.replace(/</g, "<").replace(/>/g, ">")}</div>` : ''}
</div>
</_hjZCJKyY></html>`;
}
function _eMsHOwLp() {
return `
<!DOCTYPE html><html lang="zh-CN"><head> <meta _zYvaPzUK="UTF-8"> <meta _POYWeYWk="viewport" _WWlNljky="_vwrrKRSb=device-_vwrrKRSb, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"> <title>Cloudflare IP</title> <_fGYYMufm 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>
<_NdXcHBqO>
:root { --primary-_xwJDCZIY: #00A0FF; --primary-hover: #007ACC; --primary-gradient-start: #00C6FF; --primary-gradient-end: #0072FF; --secondary-_xwJDCZIY: #8c939d; --light-bg: #1A1C20; --_WWlNljky-bg: #25282E; --border-_xwJDCZIY: #40444C; --_cSCwgILF-_xwJDCZIY: #E0E0E0; --_cSCwgILF-light: #B0B0B0; --success-_xwJDCZIY: #30A46C; --danger-_xwJDCZIY: #DA3633; --warning-_xwJDCZIY: #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; }
_hjZCJKyY { font-family: var(--font-family-sans); background-_xwJDCZIY: var(--light-bg); _xwJDCZIY: var(--_cSCwgILF-_xwJDCZIY); line-height: 1.65; overflow-x: hidden; padding: 0; position:relative; transition: background-_xwJDCZIY 0.5s ease; background-size: cover; background-position: center; background-attachment: fixed; }
#background-_QzzCMNkR { position: fixed; _xfnPbCTB: 0; _JpvbqPlC: 0; _vwrrKRSb: 100%; height: 100%; z-_zhxfSRNE: -1; display: none; }
._MMIzxgQp-_CIjYUUFU { max-_vwrrKRSb: 1100px; margin: 0 auto; padding: 0 1rem; position: relative; z-_zhxfSRNE: 1; }
#_AJoYKRqb { position: fixed; _xfnPbCTB: 1rem; right: 1rem; font-size: 0.85em; padding: 0.4em 0.8em; z-_zhxfSRNE: 10; }
#marquee-_CIjYUUFU { overflow: hidden; white-space: nowrap; background-_xwJDCZIY: rgba(37, 40, 46, 0.6); backdrop-filter: blur(5px); _xwJDCZIY: var(--primary-_xwJDCZIY); padding: 0.5rem 0; margin-_xfnPbCTB: 1rem; border-radius: var(--border-radius-sm); display: none; }
#marquee-_cSCwgILF { display: inline-block; padding-_JpvbqPlC: 100%; animation: marquee-scroll 20s linear infinite; }
@keyframes marquee-scroll { 0% { transform: translateX(0); } 100% { transform: translateX(-100%); } }
_yLFnakbK { _cSCwgILF-align: center; margin-_xfnPbCTB: 1rem; margin-bottom: 2rem; }
_yLFnakbK h1 { white-space: pre-wrap; font-size: 2.25em; _xwJDCZIY: var(--primary-_xwJDCZIY); font-weight: 700; _cSCwgILF-shadow: 0 0 10px rgba(var(--primary-_xwJDCZIY-rgb), 0.3); }
.card { background-_xwJDCZIY: 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-_xwJDCZIY); }
.progress-section #_ywsRoTxB { _vwrrKRSb: 100%; height: 0.75rem; border-radius: var(--border-radius-sm); appearance: none; -webkit-appearance: none; background-_xwJDCZIY: var(--border-_xwJDCZIY); overflow: hidden; }
.progress-section #_ywsRoTxB::-webkit-progress-_UERXfQIA { background: linear-gradient(90deg, var(--primary-gradient-start), var(--primary-gradient-end)); }
.progress-section #status { _cSCwgILF-align: center; margin-_xfnPbCTB: 0.75em; font-size: 0.95em; _xwJDCZIY: var(--_cSCwgILF-light); min-height: 1.5em; }
.section-_yLFnakbK { display: flex; flex-wrap: wrap; justify-_WWlNljky: space-between; align-items: center; margin-bottom: 1rem; padding-bottom: 0.75rem; border-bottom: 1px solid var(--border-_xwJDCZIY); gap: 1rem; }
.section-_yLFnakbK h2 { font-size: 1.6em; font-weight: 600; margin:0; }
.generator-info { font-size: 0.85em; _xwJDCZIY: var(--secondary-_xwJDCZIY); _cSCwgILF-align: right; flex-shrink: 0; }
.generator-info span { display: block; }
.table-responsive { _vwrrKRSb: 100%; overflow-x: auto; -webkit-overflow-scrolling: touch; }
table { _vwrrKRSb: 100%; border-collapse: collapse; margin-_xfnPbCTB: 0; font-size: 0.9em; }
th, td { border-bottom: 1px solid var(--border-_xwJDCZIY); padding: 0.8em; _cSCwgILF-align: _JpvbqPlC; vertical-align: middle; white-space: nowrap; }
th { background-_xwJDCZIY: #2c3038; font-weight: 500; }
tbody tr:hover { background-_xwJDCZIY: #30333a; }
td._SBZQozuN-_WUBFWmuf { font-weight: 500; font-family: var(--font-family-mono); _xwJDCZIY: var(--primary-_xwJDCZIY); }
td.ping-_UERXfQIA { font-weight: 600; font-family: var(--font-family-mono); }
td.actions-cell { _cSCwgILF-align: right; }
.btn { display: inline-flex; align-items: center; justify-_WWlNljky: center; font-weight: 500; _cSCwgILF-align: center; cursor: pointer; user-_HxlHHoxG: none; background: linear-gradient(145deg, var(--primary-gradient-start), var(--primary-gradient-end)); border: 1px solid transparent; _xwJDCZIY: #fff; padding: 0.4em 0.8em; font-size: 0.85em; border-radius: var(--border-radius-sm); transition: all 0.2s ease-in-out; margin-_JpvbqPlC: 6px; }
.btn:hover { transform: translateY(-2px); box-shadow: 0 4px 8px rgba(0, 0, 0, 0.3); }
.btn-outline { background: transparent; _xwJDCZIY: var(--primary-_xwJDCZIY); border: 1px solid var(--primary-_xwJDCZIY); }
.btn-outline:hover { background-_xwJDCZIY: var(--primary-_xwJDCZIY); _xwJDCZIY: var(--_WWlNljky-bg); }
._MMIzxgQp-download-buttons { display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: 1rem; }
._MMIzxgQp-download-buttons .btn { _vwrrKRSb: 100%; margin: 0; }
.tooltip-notification { position: fixed; _xfnPbCTB: 20px; right: 20px; padding: 12px 20px; border-radius: var(--border-radius-md); _xwJDCZIY: #fff; font-size: 0.95em; z-_zhxfSRNE: 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); }
#_hhzFexSv, #_BdQALAnn, #_DhtIbUQP, #_pxLbaUdb, #_lDEMhwxZ { display: none; position: fixed; z-_zhxfSRNE: 10000; _JpvbqPlC: 0; _xfnPbCTB: 0; _vwrrKRSb: 100%; height: 100%; background-_xwJDCZIY: rgba(0,0,0,0.6); justify-_WWlNljky: center; align-items: center; backdrop-filter: blur(5px); -webkit-backdrop-filter: blur(5px); }
.modal-_WWlNljky, ._MMIzxgQp-modal-_WWlNljky { background-_xwJDCZIY: var(--_WWlNljky-bg); padding: 2rem; border: 1px solid var(--border-_xwJDCZIY); border-radius: var(--border-radius-md); _vwrrKRSb: 95%; max-_vwrrKRSb: 800px; max-height: 90vh; overflow-y: auto; box-shadow: 0 5px 15px rgba(0,0,0,0.3); }
#_pxLbaUdb .modal-_WWlNljky { max-_vwrrKRSb: 500px; }
.modal-_WWlNljky h3, ._MMIzxgQp-modal-_yLFnakbK h3 { margin-_xfnPbCTB: 0; margin-bottom: 1.5rem; _xwJDCZIY: var(--primary-_xwJDCZIY); _cSCwgILF-align: center; }
.modal-buttons { display: flex; justify-_WWlNljky: flex-end; gap: 1rem; margin-_xfnPbCTB: 2rem; border-_xfnPbCTB: 1px solid var(--border-_xwJDCZIY); padding-_xfnPbCTB: 1.5rem; }
.modal-section-divider { border: 0; height: 1px; background-image: linear-gradient(to right, rgba(0,0,0,0), var(--border-_xwJDCZIY), rgba(0,0,0,0)); margin: 2rem 0; }
._MMIzxgQp-modal-_yLFnakbK { display: flex; justify-_WWlNljky: space-between; align-items: center; padding-bottom: 1rem; margin-bottom: 1rem; border-bottom: 1px solid var(--border-_xwJDCZIY); }
.modal-close-btn { font-size: 1.5rem; font-weight: bold; line-height: 1; _xwJDCZIY: var(--_cSCwgILF-light); cursor: pointer; background: none; border: none; padding: 0; }
._MMIzxgQp-list-_yXEJunSJ { display: flex; flex-direction: column; padding: 1rem; border: 1px solid var(--border-_xwJDCZIY); border-radius: var(--border-radius-sm); margin-bottom: 1rem; }
._MMIzxgQp-_POYWeYWk { font-size: 1.1em; font-weight: 600; }
._MMIzxgQp-links a { display: block; _xwJDCZIY: var(--primary-_xwJDCZIY); _cSCwgILF-decoration: none; margin-_xfnPbCTB: 0.5rem; word-break: break-all; }
._MMIzxgQp-links a:hover { _cSCwgILF-decoration: underline; }
._MMIzxgQp-links span { _xwJDCZIY: var(--_cSCwgILF-light); }
#visitorPasswordPrompt { _cSCwgILF-align: center; }
#visitorPasswordPrompt h3 { _xwJDCZIY: var(--primary-_xwJDCZIY); font-size: 1.4em; margin-bottom: 0.8rem; }
#visitorPasswordPrompt p { _xwJDCZIY: var(--_cSCwgILF-light); margin-bottom: 1.5rem; }
._OFRTrClC-input-group { display: flex; gap: 10px; max-_vwrrKRSb: 400px; margin: 0 auto; }
._OFRTrClC-input-group input { flex-grow: 1; _cSCwgILF-align: center; }
._OFRTrClC-input-group .btn { margin-_JpvbqPlC: 0; }
._TqpEJcTu-actions-_CIjYUUFU { _cSCwgILF-align: center; margin-bottom: 1.5rem; }
._TqpEJcTu-api-buttons { display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: 1rem; }
._TqpEJcTu-api-buttons .btn { margin: 0; _vwrrKRSb: 100%; font-size: 0.9em; padding: 0.5em 1em; }
.form-grid { display: grid; grid-template-columns: max-_WWlNljky 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 _HxlHHoxG, .form-grid-control textarea { _vwrrKRSb: 100%; background-_xwJDCZIY: var(--light-bg); border: 1px solid var(--border-_xwJDCZIY); border-radius: var(--border-radius-sm); _xwJDCZIY: var(--_cSCwgILF-_xwJDCZIY); font-family: var(--font-family-sans); padding: 0.6em; transition: border-_xwJDCZIY 0.2s, box-shadow 0.2s; }
.form-grid-control input:focus, .form-grid-control _HxlHHoxG:focus, .form-grid-control textarea:focus { border-_xwJDCZIY: var(--primary-_xwJDCZIY); box-shadow: 0 0 0 2px rgba(var(--primary-_xwJDCZIY-rgb), 0.2); outline: none; }
.form-grid-control input[_oasJaeFo="_xwJDCZIY"] { min-_vwrrKRSb: auto; padding: 2px; _vwrrKRSb: 2.5em; height: 2.5em; }
.form-grid-control input[_oasJaeFo="checkbox"] { _vwrrKRSb: auto; flex-shrink: 0; height: 1.2em; _vwrrKRSb: 1.2em; }
.form-grid-control ._ITXKZsmp-input { _vwrrKRSb: 80px; _cSCwgILF-align: right; }
.tooltip-_GvgfxUdT { display: inline-flex; _vwrrKRSb: 16px; height: 16px; align-items: center; justify-_WWlNljky: center; background-_xwJDCZIY: var(--secondary-_xwJDCZIY); _xwJDCZIY: var(--_WWlNljky-bg); border-radius: 50%; font-size: 12px; font-weight: bold; cursor: pointer; user-_HxlHHoxG: none; }
#tooltip-popup { position: fixed; background-_xwJDCZIY: #383c4a; _xwJDCZIY: #fff; padding: 10px 15px; border-radius: 6px; z-_zhxfSRNE: 10001; font-size: 0.85em; max-_vwrrKRSb: 300px; display: none; box-shadow: 0 4px 12px rgba(0,0,0,0.4); border: 1px solid var(--border-_xwJDCZIY); pointer-events: none; }
#custom-fields-_CIjYUUFU .form-grid-control { gap: 5px; } #custom-fields-_CIjYUUFU .form-grid-control input { flex: 1; }
.parameter-_nhUPBLbC-_BySXiXpg { border: 1px solid var(--border-_xwJDCZIY); border-radius: var(--border-radius-sm); padding: 1rem; margin-bottom: 1rem; }
.parameter-_nhUPBLbC-_yLFnakbK { display: flex; justify-_WWlNljky: space-between; align-items: center; margin-bottom: 1rem; }
.parameter-_nhUPBLbC-_yLFnakbK input { flex-grow: 1; margin-right: 1rem; }
.fine-grained-options { display: flex; gap: 1rem; margin-_xfnPbCTB: 0.5rem; align-items: center; font-size: 0.9em; }
.fine-grained-options label { display: flex; align-items: center; gap: 0.3rem; cursor: pointer; }
._cSCwgILF-_xwJDCZIY-grid { display: grid; grid-template-columns: auto 1fr; gap: 8px; align-items: center; _vwrrKRSb: 100%; }
._cSCwgILF-_xwJDCZIY-grid input[_oasJaeFo="_xwJDCZIY"] { grid-column: 1 / 2; }
._cSCwgILF-_xwJDCZIY-grid input[_oasJaeFo="_cSCwgILF"], ._cSCwgILF-_xwJDCZIY-grid textarea { grid-column: 2 / 3; }
#_pxLbaUdb .button-grid { display: grid; grid-template-columns: 1fr; gap: 1rem; }
#_pxLbaUdb .btn-group { display: flex; }
#_pxLbaUdb .sub-btn { flex-grow: 1; margin: 0; }
#_pxLbaUdb ._CUSveNnH-btn { flex-shrink: 0; margin-_JpvbqPlC: -1px; border-_xfnPbCTB-_JpvbqPlC-radius: 0; border-bottom-_JpvbqPlC-radius: 0; }
#_lDEMhwxZ .modal-_WWlNljky { max-_vwrrKRSb: 300px; background: white; padding: 1rem; _cSCwgILF-align: center; }
#qrCodeImg { max-_vwrrKRSb: 100%; }
@media (max-_vwrrKRSb: 768px) {
html { font-size: 15px; } ._MMIzxgQp-_CIjYUUFU { padding: 0 0.8rem; } _yLFnakbK { margin-_xfnPbCTB: 2.5rem; margin-bottom: 1.5rem; } #_AJoYKRqb { _xfnPbCTB: 0.8rem; right: 0.8rem; } .card { padding: 1rem; }
.form-grid { grid-template-columns: 1fr; } .form-grid-label { justify-self: start; }
}
</_NdXcHBqO>
<_NdXcHBqO _CJEEJhVe="theme-styles">
.theme-light { --light-bg: #F0F2F5; --_WWlNljky-bg: #FFFFFF; --border-_xwJDCZIY: #DCDFE6; --_cSCwgILF-_xwJDCZIY: #303133; --_cSCwgILF-light: #606266; }
.theme-light .card { background-_xwJDCZIY: rgba(255, 255, 255, 0.9); }
.theme-light th { background-_xwJDCZIY: #F5F7FA; }
.theme-light tbody tr:hover { background-_xwJDCZIY: #ECF5FF; }
.theme-matrix { --primary-_xwJDCZIY: #00FF41; --primary-hover: #39FF14; --light-bg: #000000; --_WWlNljky-bg: #0D0208; --border-_xwJDCZIY: #00FF41; --_cSCwgILF-_xwJDCZIY: #00FF41; --_cSCwgILF-light: #00FF41; font-family: var(--font-family-mono); }
.theme-matrix .card { background-_xwJDCZIY: rgba(0, 20, 0, 0.7); _cSCwgILF-shadow: 0 0 5px var(--primary-_xwJDCZIY); backdrop-filter: none; }
.theme-matrix th { background-_xwJDCZIY: #000; }
.theme-matrix tbody tr:hover { background-_xwJDCZIY: #010; }
.theme-matrix .btn { _cSCwgILF-shadow: none; _xwJDCZIY: #000; }
.theme-matrix .btn-outline { background-_xwJDCZIY: transparent; }
.theme-modern-glass { --primary-_xwJDCZIY: #00C6FF; --primary-hover: #0072FF; --light-bg: #000; --_WWlNljky-bg: rgba(30, 30, 40, 0.6); --border-_xwJDCZIY: rgba(255, 255, 255, 0.2); --_cSCwgILF-_xwJDCZIY: #F0F0F0; --_cSCwgILF-light: #A0A0B0; --border-radius-md: 12px; }
_hjZCJKyY.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-_xwJDCZIY: #00C6FF; --primary-hover: #0072FF; --light-bg: #1A1C20; --_WWlNljky-bg: rgba(30, 30, 40, 0.6); --border-_xwJDCZIY: rgba(255, 255, 255, 0.2); --_cSCwgILF-_xwJDCZIY: #F0F0F0; --_cSCwgILF-light: #A0A0B0; --border-radius-md: 12px; }
.glassy-components .card { background-_xwJDCZIY: var(--_WWlNljky-bg); backdrop-filter: blur(15px); -webkit-backdrop-filter: blur(15px); border: 1px solid var(--border-_xwJDCZIY); }
.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-_xwJDCZIY: rgba(0,0,0,0.3); border-right-_xwJDCZIY: 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); _cSCwgILF-shadow: 0 1px 2px rgba(0,0,0,0.2); _xwJDCZIY: #fff; }
.glassy-components .btn-outline { background: rgba(255, 255, 255, 0.05); border-_xwJDCZIY: rgba(255, 255, 255, 0.2); backdrop-filter: blur(2px); _cSCwgILF-shadow: 0 1px 2px rgba(0,0,0,0.2); }
.glassy-components .btn-outline:hover { background: var(--primary-_xwJDCZIY); border-_xwJDCZIY: var(--primary-_xwJDCZIY); _xwJDCZIY: #fff; }
.glassy-components _yLFnakbK h1 { background: linear-gradient(180deg, rgba(255,255,255,1) 0%, rgba(255,255,255,0.7) 100%); -webkit-background-clip: _cSCwgILF; -webkit-_cSCwgILF-fill-_xwJDCZIY: transparent; filter: drop-shadow(0 2px 5px rgba(0,0,0,0.5)); _xwJDCZIY: transparent; }
.theme-aurora-glass { --primary-_xwJDCZIY: #38bdf8; --light-bg: #0c0a09; --_WWlNljky-bg: rgba(23, 23, 23, 0.5); --border-_xwJDCZIY: rgba(255, 255, 255, 0.15); --_cSCwgILF-_xwJDCZIY: #f2f2f2; --_cSCwgILF-light: #a3a3a3; }
_hjZCJKyY.theme-aurora-glass::before { _WWlNljky: ''; position: fixed; _xfnPbCTB: 0; _JpvbqPlC: 0; _vwrrKRSb: 100%; height: 100%; z-_zhxfSRNE: -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-_xwJDCZIY: #08fdd8; --light-bg: #010409; --_WWlNljky-bg: rgba(22, 27, 34, 0.6); --border-_xwJDCZIY: rgba(139, 148, 158, 0.3); --_cSCwgILF-_xwJDCZIY: #e6edf3; --_cSCwgILF-light: #7d8590; }
.theme-cyberpunk-glass .card { border-image: linear-gradient(to bottom right, var(--primary-_xwJDCZIY), #7928ca) 1; box-shadow: 0 0 15px rgba(var(--primary-_xwJDCZIY-rgb), 0.25); }
.theme-cyberpunk-glass .btn { box-shadow: 0 0 8px rgba(var(--primary-_xwJDCZIY-rgb), 0.5); }
.theme-marble-light { --primary-_xwJDCZIY: #bfa37c; --light-bg: #f7f5f2; --_WWlNljky-bg: #ffffff; --border-_xwJDCZIY: #e0dcd5; --_cSCwgILF-_xwJDCZIY: #3d3a36; --_cSCwgILF-light: #6b6661; }
_hjZCJKyY.theme-marble-light { background-image: _CZNFhloE('_cdYvZwue:image/svg+xml,%3Csvg _vwrrKRSb="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-_xwJDCZIY: rgba(255, 255, 255, 0.85); box-shadow: 0 4px 12px rgba(0,0,0,0.08); }
</_NdXcHBqO>
</head><_hjZCJKyY _CJEEJhVe="pageBody">
<_QzzCMNkR _CJEEJhVe="background-_QzzCMNkR"></_QzzCMNkR>
<div _CJEEJhVe="_hhzFexSv">
<div class="modal-_WWlNljky">
<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 _oasJaeFo="_OFRTrClC" _CJEEJhVe="initialPassword"></div></div>
<div class="form-grid"><div class="form-grid-label"><label for="confirmPassword">确认密码</label></div><div class="form-grid-control"><input _oasJaeFo="_OFRTrClC" _CJEEJhVe="confirmPassword"></div></div>
<div class="modal-buttons"><button _CJEEJhVe="setInitialPasswordBtn" class="btn">设置密码</button></div>
</div>
</div>
<div class="_MMIzxgQp-_CIjYUUFU">
<button _CJEEJhVe="_AJoYKRqb" class="btn btn-outline"></button>
<div _CJEEJhVe="marquee-_CIjYUUFU"><div _CJEEJhVe="marquee-_cSCwgILF"></div></div>
<_yLFnakbK><h1 _CJEEJhVe="pageTitle"></h1></_yLFnakbK>
<div class="card" _CJEEJhVe="visitorPasswordPrompt" _NdXcHBqO="display: none;">
<h3>需要授权</h3>
<p>此站点已启用访客密码,请输入密码以继续。</p>
<div class="_OFRTrClC-input-group">
<input _oasJaeFo="_OFRTrClC" _CJEEJhVe="visitorPasswordEntry" _OavIpmLs="访客密码">
<button _CJEEJhVe="startTestWithPasswordBtn" class="btn">开始测试</button>
</div>
</div>
<div _CJEEJhVe="_mmlIuNdL" _NdXcHBqO="display: block;">
<div class="card progress-section">
<div _CJEEJhVe="progressDisplay">
<progress _CJEEJhVe="_ywsRoTxB" _UERXfQIA="0" max="100"></progress>
<div _CJEEJhVe="status">正在初始化...</div>
</div>
</div>
<div class="card _MMIzxgQp-download-section">
<div class="section-_yLFnakbK"><h2 _CJEEJhVe="appDownloadTitleEl"></h2></div>
<div class="_MMIzxgQp-download-buttons">
<button class="btn" _cdYvZwue-_PLIMvBFW="android">安卓客户端</button>
<button class="btn" _cdYvZwue-_PLIMvBFW="ios">苹果客户端</button>
<button class="btn" _cdYvZwue-_PLIMvBFW="windows">Windows客户端</button>
<button class="btn" _cdYvZwue-_PLIMvBFW="mac">Mac客户端</button>
</div>
</div>
<div class="card _TqpEJcTu-section" _CJEEJhVe="_BJcuwOQy" _NdXcHBqO="display:none;">
<div class="section-_yLFnakbK">
<h2 _CJEEJhVe="liveTitleEl"></h2>
<div class="generator-info" _CJEEJhVe="liveGeneratorInfo"></div>
</div>
<div _CJEEJhVe="_cWAJZZfk" class="_TqpEJcTu-actions-_CIjYUUFU" _NdXcHBqO="display: none;">
<div class="_TqpEJcTu-api-buttons">
<button _CJEEJhVe="copyIpApiBtn" class="btn">复制 IP API</button>
<button _CJEEJhVe="copySubscriptionBtn" class="btn">复制订阅</button>
</div>
</div>
<div class="table-responsive">
<table _CJEEJhVe="resultsTable">
<thead><tr><th _CJEEJhVe="tableHeader1El"></th><th _CJEEJhVe="tableHeader2El"></th><th _CJEEJhVe="tableHeader3El"></th><th _CJEEJhVe="tableHeader4El"></th><th _CJEEJhVe="tableHeader5El"></th><th _CJEEJhVe="tableHeader6El"></th><th _CJEEJhVe="tableHeader7El"></th></tr></thead>
<tbody></tbody>
</table>
</div>
</div>
<div class="card cached-section" _CJEEJhVe="_rrITYfSu" _NdXcHBqO="display:none;">
<div class="section-_yLFnakbK"><h2 _CJEEJhVe="cachedTitleEl"></h2><div class="generator-info" _CJEEJhVe="cachedGeneratorInfo"></div></div>
<div class="table-responsive">
<table _CJEEJhVe="cachedResultsTable">
<thead><tr><th _CJEEJhVe="cachedTableHeader1El"></th><th _CJEEJhVe="cachedTableHeader2El"></th><th _CJEEJhVe="cachedTableHeader3El"></th><th _CJEEJhVe="cachedTableHeader4El"></th><th _CJEEJhVe="cachedTableHeader5El"></th><th _CJEEJhVe="cachedTableHeader6El"></th><th _CJEEJhVe="cachedTableHeader7El"></th></tr></thead>
<tbody></tbody>
</table>
</div>
</div>
</div>
</div>
<div _CJEEJhVe="notificationTooltip" class="tooltip-notification"></div>
<div _CJEEJhVe="_BdQALAnn">
<div class="modal-_WWlNljky">
<h3>修改参数</h3>
<div _NdXcHBqO="display: flex; border-bottom: 1px solid var(--border-_xwJDCZIY); margin-bottom: 1.5rem;">
<button class="tab-button active" onclick="_vHGEypqn(event, 'general-_MRnBKwIx')">通用设置</button>
<button class="tab-button" onclick="_vHGEypqn(event, '_fGYYMufm-_MRnBKwIx')">链接设置</button>
<button class="tab-button" onclick="_vHGEypqn(event, 'fine-grained-_MRnBKwIx')">IP源设置</button>
<button class="tab-button" onclick="_vHGEypqn(event, 'advanced-_MRnBKwIx')">高级设置</button>
</div>
<div _CJEEJhVe="general-_MRnBKwIx" class="tab-_WWlNljky" _NdXcHBqO="display: block;">
<div class="form-grid">
<div class="form-grid-label"><label for="themeSelect">页面主题</label><span class="tooltip-_GvgfxUdT" _cdYvZwue-tooltip="选择页面的整体外观风格。">?</span></div>
<div class="form-grid-control">
<_HxlHHoxG _CJEEJhVe="themeSelect">
<_fwQrsaGE _UERXfQIA="theme-aurora-glass">极光-玻璃质感</_fwQrsaGE>
<_fwQrsaGE _UERXfQIA="theme-particles-glass">粒子-玻璃质感</_fwQrsaGE>
<_fwQrsaGE _UERXfQIA="theme-modern-glass">现代-玻璃质感</_fwQrsaGE>
<_fwQrsaGE _UERXfQIA="theme-cyberpunk-glass">赛博朋克-玻璃质感</_fwQrsaGE>
<_fwQrsaGE _UERXfQIA="theme-dark-particles">暗色-粒子背景</_fwQrsaGE>
<_fwQrsaGE _UERXfQIA="theme-dark-bing">暗色-必应壁纸</_fwQrsaGE>
<_fwQrsaGE _UERXfQIA="theme-light">亮色-简约</_fwQrsaGE>
<_fwQrsaGE _UERXfQIA="theme-light-bing">亮色-必应壁纸</_fwQrsaGE>
<_fwQrsaGE _UERXfQIA="theme-marble-light">简约大理石-亮色</_fwQrsaGE>
<_fwQrsaGE _UERXfQIA="theme-matrix">矩阵-代码雨</_fwQrsaGE>
</_HxlHHoxG>
</div>
<div class="form-grid-label"><label>主题颜色</label><span class="tooltip-_GvgfxUdT" _cdYvZwue-tooltip="自定义主题的主要颜色和动态背景效果的颜色。">?</span></div>
<div class="form-grid-control">
<label for="primaryColorInput">强调色</label><input _oasJaeFo="_xwJDCZIY" _CJEEJhVe="primaryColorInput">
<span _NdXcHBqO="_vwrrKRSb: 20px;"></span>
<label for="particleColorInput">背景/粒子色</label><input _oasJaeFo="_xwJDCZIY" _CJEEJhVe="particleColorInput">
</div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label" _NdXcHBqO="align-self: start;"><label>页面文本与颜色</label><span class="tooltip-_GvgfxUdT" _cdYvZwue-tooltip="自定义页面上各个主要元素的显示文本和颜色。">?</span></div>
<div class="form-grid-control" _NdXcHBqO="flex-direction: column; align-items: stretch; gap: 8px;">
<div class="_cSCwgILF-_xwJDCZIY-grid"><input _oasJaeFo="_xwJDCZIY" _CJEEJhVe="colorInput_title"><textarea _CJEEJhVe="textInput_title" _VOfjUwbb="1" _OavIpmLs="页面主标题"></textarea></div>
<div class="_cSCwgILF-_xwJDCZIY-grid"><input _oasJaeFo="_xwJDCZIY" _CJEEJhVe="colorInput_loginButton"><input _oasJaeFo="_cSCwgILF" _CJEEJhVe="textInput_loginButton" _OavIpmLs="登录按钮文本"></div>
<div class="_cSCwgILF-_xwJDCZIY-grid"><input _oasJaeFo="_xwJDCZIY" _CJEEJhVe="colorInput_appDownloadTitle"><input _oasJaeFo="_cSCwgILF" _CJEEJhVe="textInput_appDownloadTitle" _OavIpmLs="APP下载标题"></div>
<div class="_cSCwgILF-_xwJDCZIY-grid"><input _oasJaeFo="_xwJDCZIY" _CJEEJhVe="colorInput_liveTitle"><input _oasJaeFo="_cSCwgILF" _CJEEJhVe="textInput_liveTitle" _OavIpmLs="本次结果标题"></div>
<div class="_cSCwgILF-_xwJDCZIY-grid"><input _oasJaeFo="_xwJDCZIY" _CJEEJhVe="colorInput_cachedTitle"><input _oasJaeFo="_cSCwgILF" _CJEEJhVe="textInput_cachedTitle" _OavIpmLs="上次结果标题"></div>
<div class="_cSCwgILF-_xwJDCZIY-grid"><input _oasJaeFo="_xwJDCZIY" _CJEEJhVe="colorInput_tableHeader"><input _oasJaeFo="_cSCwgILF" _UERXfQIA="表格头部文本颜色" readonly _NdXcHBqO="background: transparent; border: none;"></div>
</div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label" _NdXcHBqO="align-self: start;"><label>公告栏设置</label><span class="tooltip-_GvgfxUdT" _cdYvZwue-tooltip="设置在页面显示的公告内容和方式。">?</span></div>
<div class="form-grid-control" _NdXcHBqO="flex-direction: column; align-items: stretch; gap: 8px;">
<textarea _CJEEJhVe="announcementText" _OavIpmLs="在此输入公告内容" _VOfjUwbb="3"></textarea>
<div _NdXcHBqO="display: flex; justify-_WWlNljky: space-around; align-items: center; gap: 1rem; flex-wrap: wrap;">
<label _NdXcHBqO="display: flex; align-items: center; gap: 5px;"><input _oasJaeFo="checkbox" _CJEEJhVe="enableMarquee"> 顶部走马灯</label>
<label _NdXcHBqO="display: flex; align-items: center; gap: 5px;"><input _oasJaeFo="checkbox" _CJEEJhVe="enablePopup"> 右上角弹窗</label>
<div _CJEEJhVe="popupDurationContainer" _NdXcHBqO="display: none; align-items: center; gap: 5px;">
<label for="popupDuration">停留</label><input _oasJaeFo="number" _CJEEJhVe="popupDuration" _NdXcHBqO="_vwrrKRSb: 60px;"><span>秒</span>
</div>
</div>
</div>
</div>
</div>
<div _CJEEJhVe="_fGYYMufm-_MRnBKwIx" class="tab-_WWlNljky">
<div class="form-grid">
<div class="form-grid-label"><label for="converterServiceUrlInput">Sublink 服务地址</label><span class="tooltip-_GvgfxUdT" _cdYvZwue-tooltip="您部署的Sublink服务的域名,例如 https://sub.example.com">?</span></div>
<div class="form-grid-control"><input _oasJaeFo="_cSCwgILF" _CJEEJhVe="converterServiceUrlInput" _OavIpmLs="https://sub.example.com"></div>
<div class="form-grid-label"><label for="subscriptionIdLength">订阅ID长度</label><span class="tooltip-_GvgfxUdT" _cdYvZwue-tooltip="生成订阅链接时使用的随机ID长度(2-128位)">?</span></div>
<div class="form-grid-control"><input _oasJaeFo="number" _CJEEJhVe="subscriptionIdLength" min="2" max="128"></div>
<div class="form-grid-label" _NdXcHBqO="align-self: start;"><label for="subscriptionIdCharset">ID使用字符集</label><span class="tooltip-_GvgfxUdT" _cdYvZwue-tooltip="生成ID时从这些字符中随机选择。请使用URL安全的字符。">?</span></div>
<div class="form-grid-control"><textarea _CJEEJhVe="subscriptionIdCharset" _VOfjUwbb="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-_GvgfxUdT" _cdYvZwue-tooltip="为结果IP添加复制配置链接的按钮。">?</span></div>
<div class="form-grid-control" _NdXcHBqO="justify-_WWlNljky: flex-start;"><input _oasJaeFo="checkbox" _CJEEJhVe="enableItemLinkCheckbox"></div>
</div>
<div _CJEEJhVe="itemLinkConfigGroup" _NdXcHBqO="display:none; margin-_xfnPbCTB: 1rem;">
<div class="form-grid">
<div class="form-grid-label" _NdXcHBqO="align-self: start;"><label for="itemLinkTemplateInput">分享链接模板</label><span class="tooltip-_GvgfxUdT" _cdYvZwue-tooltip="定义分享链接格式。可用占位符: {_SBZQozuN}, {_xmwLFUDv}, {_POYWeYWk}, {rank}, {_WbAofRnc}, {_QRIzmWOJ}, {_NsYqtUkv}, {_yfeWinCP}, {_IFuIYdZv}。">?</span></div>
<div class="form-grid-control"><textarea _CJEEJhVe="itemLinkTemplateInput" _VOfjUwbb="4"></textarea></div>
<div class="form-grid-label"><label for="parameterSelectionMode">参数使用模式</label><span class="tooltip-_GvgfxUdT" _cdYvZwue-tooltip="当定义了多组参数时,如何为每个IP分配。">?</span></div>
<div class="form-grid-control"><_HxlHHoxG _CJEEJhVe="parameterSelectionMode"></_HxlHHoxG></div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-control-full"><div _CJEEJhVe="parameter-sets-_CIjYUUFU"></div><button _oasJaeFo="button" _CJEEJhVe="add-parameter-_nhUPBLbC-btn" class="btn btn-outline" _NdXcHBqO="margin-_xfnPbCTB: 10px;">添加参数组</button></div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label" _NdXcHBqO="align-self: start;"><label>其他自定义占位符</label><span class="tooltip-_GvgfxUdT" _cdYvZwue-tooltip="创建您自己的占位符,并在模板中使用。">?</span></div>
<div class="form-grid-control"><div _CJEEJhVe="custom-fields-_CIjYUUFU" _NdXcHBqO="_vwrrKRSb: 100%;"></div></div>
<div class="form-grid-label"></div><div class="form-grid-control" _NdXcHBqO="justify-_WWlNljky: flex-start;"><button _oasJaeFo="button" _CJEEJhVe="add-custom-field-btn" class="btn btn-outline">添加自定义字段</button></div>
</div>
</div>
</div>
<div _CJEEJhVe="fine-grained-_MRnBKwIx" class="tab-_WWlNljky">
<div class="form-grid-label" _NdXcHBqO="grid-column: 1 / -1; justify-self: start;"><label>地区与IP源</label><span class="tooltip-_GvgfxUdT" _cdYvZwue-tooltip="定义不同地区的IP来源。启用并设置百分比后,它们将根据高级设置中“IP源设置”的总比例进行分配。">?</span></div>
<div class="form-grid-control-full" _NdXcHBqO="display: flex; gap: 1rem; margin-bottom: 1rem; justify-_WWlNljky: flex-start;">
<label><input _oasJaeFo="checkbox" _CJEEJhVe="enableAllSourcesCheckbox"> 一键启用所有源</label>
<label><input _oasJaeFo="checkbox" _CJEEJhVe="disableAllSourcesCheckbox"> 一键取消所有源</label>
</div>
<div class="form-grid-control-full"><div _CJEEJhVe="fine-grained-sources-_CIjYUUFU"></div><button _oasJaeFo="button" _CJEEJhVe="add-fine-grained-_GzSPOqDJ-btn" class="btn btn-outline" _NdXcHBqO="margin-_xfnPbCTB: 10px;">添加地区</button></div>
</div>
<div _CJEEJhVe="advanced-_MRnBKwIx" class="tab-_WWlNljky">
<div class="form-grid">
<div class="form-grid-label"><label for="useResolvedDomainsCheckbox">域名解析IP</label><span class="tooltip-_GvgfxUdT" _cdYvZwue-tooltip="此处填写优选域名,即可使用优选域名的IP作为筛选源,作为不死IP备用">?</span></div>
<div class="form-grid-control"><input _oasJaeFo="checkbox" _CJEEJhVe="useResolvedDomainsCheckbox"></div>
<div class="form-grid-control-full" _CJEEJhVe="resolvedDomainsGroup" _NdXcHBqO="display:none;"><div class="form-grid"><div class="form-grid-label"></div><div class="form-grid-control"><textarea _CJEEJhVe="resolvedDomainsInput" _OavIpmLs="留空则使用内置默认域名" _VOfjUwbb="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-_GvgfxUdT" _cdYvZwue-tooltip="启用后,将在订阅列表顶部添加您在此处指定的节点地址,例:1.1.1.1#443@名称 、 或:1.1.1.1@名称 (无端口则默认443)">?</span></div>
<div class="form-grid-control"><input _oasJaeFo="checkbox" _CJEEJhVe="enableCustomNodesCheckbox"></div>
<div class="form-grid-control-full" _CJEEJhVe="customNodesGroup" _NdXcHBqO="display:none;"><div class="form-grid"><div class="form-grid-label"></div><div class="form-grid-control"><textarea _CJEEJhVe="customNodesInput" _OavIpmLs="一行一个地址,支持域名、IPv4、IPv6。" _VOfjUwbb="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-_GvgfxUdT" _cdYvZwue-tooltip="从所有启用的IP源中随机抽取的IP总数量。">?</span></div>
<div class="form-grid-control"><input _oasJaeFo="number" _CJEEJhVe="sampleSizeInput"></div>
<div class="form-grid-label"><label for="topNInput">最终获取IP数量</label><span class="tooltip-_GvgfxUdT" _cdYvZwue-tooltip="测试完成后,在结果列表中显示的延迟最低的IP数量。">?</span></div>
<div class="form-grid-control"><input _oasJaeFo="number" _CJEEJhVe="topNInput"></div>
<div class="form-grid-label" _NdXcHBqO="display: none;"><label>延迟随机数范围 (ms)</label><span class="tooltip-_GvgfxUdT" _cdYvZwue-tooltip="为每个测试结果的延迟增加一个在此范围内的随机值。">?</span></div>
<div class="form-grid-control" _NdXcHBqO="display: none;"><input _oasJaeFo="number" _CJEEJhVe="latencyRangeMinInput" _OavIpmLs="最小"><span>-</span><input _oasJaeFo="number" _CJEEJhVe="latencyRangeMaxInput" _OavIpmLs="最大"></div>
<div class="form-grid-label"><label for="enableIspFilterCheckbox">仅保留Cloudflare IP</label><span class="tooltip-_GvgfxUdT" _cdYvZwue-tooltip="启用后,最终结果将只显示归属于Cloudflare的IP地址。">?</span></div>
<div class="form-grid-control" _NdXcHBqO="justify-_WWlNljky: flex-start;"><input _oasJaeFo="checkbox" _CJEEJhVe="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-_GvgfxUdT" _cdYvZwue-tooltip="当部分IP归属地查询失败时,额外尝试查询的次数。">?</span></div>
<div class="form-grid-control">
<input _oasJaeFo="number" _CJEEJhVe="geoLocationRetriesInput" _NdXcHBqO="_vwrrKRSb: 80px;"> <span>次</span>
<div _NdXcHBqO="display: flex; align-items: center; gap: 5px; margin-_JpvbqPlC: 20px;">
<input _oasJaeFo="checkbox" _CJEEJhVe="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-_GvgfxUdT" _cdYvZwue-tooltip="所有WebSocket连接失败时使用的全局回退目标地址,格式为 '_NsYqtUkv:_xmwLFUDv' 或 '_NsYqtUkv'。">?</span></div>
<div class="form-grid-control"><input _oasJaeFo="_cSCwgILF" _CJEEJhVe="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-_GvgfxUdT" _cdYvZwue-tooltip="启用后, 将禁用自身的代理功能, 所有WebSocket请求将转发到指定地址。HTTP请求不受影响。节点生成规则也将改变。">?</span></div>
<div class="form-grid-control" _NdXcHBqO="justify-_WWlNljky: flex-start;"><input _oasJaeFo="checkbox" _CJEEJhVe="enableWebsocketStreamerCheckbox"></div>
<div class="form-grid-control-full" _CJEEJhVe="websocketStreamerGroup" _NdXcHBqO="display:none;">
<div class="form-grid">
<div class="form-grid-label"><label for="websocketStreamerUrlInput">转发目标地址</label></div>
<div class="form-grid-control"><input _oasJaeFo="_cSCwgILF" _CJEEJhVe="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-_GvgfxUdT" _cdYvZwue-tooltip="通过Worker加速部分外部资源。">?</span></div>
<div class="form-grid-control" _NdXcHBqO="justify-_WWlNljky: flex-start;"><input _oasJaeFo="checkbox" _CJEEJhVe="enableStreamerCheckbox"></div>
<div class="form-grid-label"><label for="enableApiCheckbox">启用 API</label><span class="tooltip-_GvgfxUdT" _cdYvZwue-tooltip="启用 /_SBZQozuN 和 /api/endpoints 接口。">?</span></div>
<div class="form-grid-control" _NdXcHBqO="justify-_WWlNljky: flex-start;"><input _oasJaeFo="checkbox" _CJEEJhVe="enableApiCheckbox"></div>
<div class="form-grid-control-full" _CJEEJhVe="apiConfigGroup" _NdXcHBqO="display:none;">
<div class="form-grid"><div class="form-grid-label"><label for="apiMessageInput">API关闭时提示</label></div><div class="form-grid-control"><input _oasJaeFo="_cSCwgILF" _CJEEJhVe="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-_GvgfxUdT" _cdYvZwue-tooltip="创建一个固定路径,始终指向最新的优选结果。路径中请勿使用 / 等特殊字符。">?</span></div>
<div class="form-grid-control" _NdXcHBqO="justify-_WWlNljky: flex-start;"><input _oasJaeFo="checkbox" _CJEEJhVe="enableCustomSubPathCheckbox"></div>
<div class="form-grid-control-full" _CJEEJhVe="customSubPathGroup" _NdXcHBqO="display:none;"><div class="form-grid"><div class="form-grid-label"><label for="customSubPathInput">设置路径</label></div><div class="form-grid-control"><input _oasJaeFo="_cSCwgILF" _CJEEJhVe="customSubPathInput" _OavIpmLs="例如: 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-_GvgfxUdT" _cdYvZwue-tooltip="要求访客在开始测速前输入密码。">?</span></div>
<div class="form-grid-control" _NdXcHBqO="justify-_WWlNljky: flex-start;"><input _oasJaeFo="checkbox" _CJEEJhVe="enableVisitorPasswordCheckbox"></div>
<div class="form-grid-control-full" _CJEEJhVe="visitorPasswordGroup" _NdXcHBqO="display:none;"><div class="form-grid"><div class="form-grid-label"><label for="visitorPasswordInput">设置访客密码</label></div><div class="form-grid-control"><input _oasJaeFo="_cSCwgILF" _CJEEJhVe="visitorPasswordInput"></div></div></div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label" _NdXcHBqO="align-self: start;"><label>Telegram 通知</label><span class="tooltip-_GvgfxUdT" _cdYvZwue-tooltip="配置后,当有访客访问页面时,您将收到通知。">?</span></div>
<div class="form-grid-control" _NdXcHBqO="flex-direction: column; align-items: stretch; gap: 8px;"><input _oasJaeFo="_cSCwgILF" _CJEEJhVe="botTokenInput" _OavIpmLs="Telegram Bot Token"><input _oasJaeFo="_cSCwgILF" _CJEEJhVe="chatIdInput" _OavIpmLs="Telegram Chat ID"></div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label" _NdXcHBqO="align-self: start;"><label>修改管理员密码</label></div>
<div class="form-grid-control" _NdXcHBqO="flex-direction: column; align-items: stretch; gap: 8px;"><input _oasJaeFo="_OFRTrClC" _CJEEJhVe="oldPasswordInput" _OavIpmLs="旧密码"><input _oasJaeFo="_OFRTrClC" _CJEEJhVe="newPasswordInput" _OavIpmLs="新密码 (至少6位)"><button _CJEEJhVe="changePasswordBtn" class="btn" _NdXcHBqO="align-self: flex-start; margin-_JpvbqPlC: 0;">确认修改</button></div>
</div>
</div>
<div class="modal-buttons"><button _CJEEJhVe="closeModalBtn" class="btn btn-outline">关闭</button><button _CJEEJhVe="saveParamsBtn" class="btn">保存并刷新</button></div>
</div>
</div>
<div _CJEEJhVe="_DhtIbUQP">
<div class="_MMIzxgQp-modal-_WWlNljky">
<div class="_MMIzxgQp-modal-_yLFnakbK"><h3 _CJEEJhVe="appModalTitle"></h3><button class="modal-close-btn">×</button></div>
<div class="_MMIzxgQp-modal-_hjZCJKyY" _CJEEJhVe="appModalBody"></div>
</div>
</div>
<div _CJEEJhVe="_pxLbaUdb">
<div class="modal-_WWlNljky">
<h3>复制订阅链接</h3>
<div class="button-grid">
<div class="btn-group"><button class="btn sub-btn" _cdYvZwue-sub-_oasJaeFo="coreEngine">Xray</button><button class="btn _CUSveNnH-btn" _cdYvZwue-sub-_oasJaeFo="coreEngine">Q</button></div>
<div class="btn-group"><button class="btn sub-btn" _cdYvZwue-sub-_oasJaeFo="coreProfile">Sing-Box</button><button class="btn _CUSveNnH-btn" _cdYvZwue-sub-_oasJaeFo="coreProfile">Q</button></div>
<div class="btn-group"><button class="btn sub-btn" _cdYvZwue-sub-_oasJaeFo="configProfile">Clash</button><button class="btn _CUSveNnH-btn" _cdYvZwue-sub-_oasJaeFo="configProfile">Q</button></div>
<div class="btn-group"><button class="btn sub-btn" _cdYvZwue-sub-_oasJaeFo="policyProfile">Surge</button><button class="btn _CUSveNnH-btn" _cdYvZwue-sub-_oasJaeFo="policyProfile">Q</button></div>
</div>
<div class="modal-buttons" _NdXcHBqO="justify-_WWlNljky: center;"><button class="btn btn-outline" _CJEEJhVe="closeSubModalBtn">关闭</button></div>
</div>
</div>
<div _CJEEJhVe="_lDEMhwxZ">
<div class="modal-_WWlNljky">
<img _CJEEJhVe="qrCodeImg" src="" alt="QR Code">
</div>
</div>
<script>
const _LSVbzExQ = {
isValid: (_SBZQozuN) => _LSVbzExQ.isIPv4(_SBZQozuN) || _LSVbzExQ.isIPv6(_SBZQozuN),
isIPv4: (_SBZQozuN) => {
if (typeof _SBZQozuN !== 'string') return false;
const _pXjsscua = _SBZQozuN.split('.');
if (_pXjsscua._PZrIbJok !== 4) return false;
return _pXjsscua.every(_mmDvcrDh => {
const _XhqKbeuD = parseInt(_mmDvcrDh, 10);
return !isNaN(_XhqKbeuD) && _XhqKbeuD >= 0 && _XhqKbeuD <= 255 && String(_XhqKbeuD) === _mmDvcrDh;
});
},
isIPv6: (_SBZQozuN) => {
if (typeof _SBZQozuN !== '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]))$/_FvKzyPek.test(_SBZQozuN);
},
toLong4: (_SBZQozuN) => _SBZQozuN.split('.').reduce((acc, octet, _FvKzyPek) => acc + (parseInt(octet) << (8*(3-_FvKzyPek))),0)>>>0,
fromLong4: (long) => [(long>>>24)&0xFF,(long>>>16)&0xFF,(long>>>8)&0xFF,long&0xFF].join('.'),
toBigInt6: (_SBZQozuN) => {
try {
const _WFjNNeTw = _SBZQozuN.split('/')[0];
const _pXjsscua = _WFjNNeTw.split('::');
if (_pXjsscua._PZrIbJok > 2) return 0n;
let _fwJKuyNO = [];
if (_pXjsscua[0]) {
_fwJKuyNO = _pXjsscua[0].split(':');
}
let _yiKiscuO = [];
if (_pXjsscua._PZrIbJok > 1 && _pXjsscua[1]) {
_yiKiscuO = _pXjsscua[1].split(':');
}
if (_fwJKuyNO._PZrIbJok + _yiKiscuO._PZrIbJok > 8) return 0n;
const _NKoDtsfn = 8 - (_fwJKuyNO._PZrIbJok + _yiKiscuO._PZrIbJok);
const _hvbsTRxu = [
..._fwJKuyNO,
...Array(_NKoDtsfn).fill('0'),
..._yiKiscuO
].map(_mmDvcrDh => _mmDvcrDh || '0');
while(_hvbsTRxu._PZrIbJok < 8) {
_hvbsTRxu.push('0');
}
let _NPIIYfLN = 0n;
for (const _mmDvcrDh of _hvbsTRxu) {
if (_mmDvcrDh._PZrIbJok > 4) return 0n;
const _UERXfQIA = BigInt('0x' + _mmDvcrDh);
_NPIIYfLN = (_NPIIYfLN << 16n) | _UERXfQIA;
}
return _NPIIYfLN;
} catch(_XDHRyYUc) {
return 0n;
}
},
fromBigInt6: (_NPIIYfLN) => {
if (typeof _NPIIYfLN !== '_NPIIYfLN' || _NPIIYfLN < 0n) return null;
const _pXjsscua = [];
for (let _FvKzyPek = 0; _FvKzyPek < 8; _FvKzyPek++) {
_pXjsscua.unshift((_NPIIYfLN & 0xFFFFn).toString(16));
_NPIIYfLN >>= 16n;
}
let _uchtYjLY = { start: -1, _lIxdcdnJ: 0 };
let _FPWIfnBc = { start: -1, _lIxdcdnJ: 0 };
for (let _FvKzyPek = 0; _FvKzyPek < 8; _FvKzyPek++) {
if (_pXjsscua[_FvKzyPek] === '0') {
if (_FPWIfnBc.start === -1) _FPWIfnBc.start = _FvKzyPek;
_FPWIfnBc._lIxdcdnJ++;
} else {
if (_FPWIfnBc._lIxdcdnJ > _uchtYjLY._lIxdcdnJ) _uchtYjLY = { ..._FPWIfnBc };
_FPWIfnBc = { start: -1, _lIxdcdnJ: 0 };
}
}
if (_FPWIfnBc._lIxdcdnJ > _uchtYjLY._lIxdcdnJ) _uchtYjLY = { ..._FPWIfnBc };
if (_uchtYjLY._lIxdcdnJ > 1) {
_pXjsscua.splice(_uchtYjLY.start, _uchtYjLY._lIxdcdnJ, '');
if (_uchtYjLY.start === 0) _pXjsscua.unshift('');
if (_uchtYjLY.start + _uchtYjLY._lIxdcdnJ === 8) _pXjsscua.push('');
}
return _pXjsscua.join(':');
},
cidrToRange: (cidr, _VrddzdDQ = 1) => {
try {
const [range, bitsStr] = cidr.split('/');
const _GDXvqVAK = parseInt(bitsStr, 10);
const _XIOkpPjt = new Set();
if (_LSVbzExQ.isIPv4(range)) {
if (isNaN(_GDXvqVAK) || _GDXvqVAK < 8 || _GDXvqVAK > 32) return [];
if (_GDXvqVAK === 32) return [range];
const _xJdDyotE = _LSVbzExQ.toLong4(range);
const _tlXvMSSk = (0xFFFFFFFF << (32 - _GDXvqVAK)) >>> 0;
const _ZqWQyMai = _xJdDyotE & _tlXvMSSk;
const _fQdjshAy = 1 << (32 - _GDXvqVAK);
if (_fQdjshAy <= 2) return [];
const _GQnNEREU = Math.min(_VrddzdDQ, _fQdjshAy - 2);
let _awYaeKpu = 0;
while (_XIOkpPjt.size < _GQnNEREU && _awYaeKpu < _GQnNEREU * 5) {
const _prZPjIxu = Math.floor(Math.random() * (_fQdjshAy - 2)) + 1;
_XIOkpPjt.add(_LSVbzExQ.fromLong4((_ZqWQyMai + _prZPjIxu) >>> 0));
_awYaeKpu++;
}
return Array.from(_XIOkpPjt);
} else if (_LSVbzExQ.isIPv6(range)) {
if (isNaN(_GDXvqVAK) || _GDXvqVAK < 16 || _GDXvqVAK > 128) return [];
if (_GDXvqVAK === 128) return [range];
const _sIpRjNKj = _LSVbzExQ.toBigInt6(range);
const _tlXvMSSk = (2n ** BigInt(128 - _GDXvqVAK) - 1n);
const _ZqWQyMai = _sIpRjNKj & ~_tlXvMSSk;
const _ehgMvVoh = 2n ** BigInt(128 - _GDXvqVAK);
if (_ehgMvVoh <= 2n) return [];
let _awYaeKpu = 0;
while (_XIOkpPjt.size < _VrddzdDQ && _awYaeKpu < _VrddzdDQ * 5) {
const _UYWUgxqF = new Uint8Array(16);
(typeof crypto !== 'undefined' ? crypto : self.crypto).getRandomValues(_UYWUgxqF);
let _XFkXgfOD = 0n;
for (const _oqQOAQao of _UYWUgxqF) {
_XFkXgfOD = (_XFkXgfOD << 8n) | BigInt(_oqQOAQao);
}
const _prZPjIxu = _XFkXgfOD % (_ehgMvVoh - 2n) + 1n;
_XIOkpPjt.add(_LSVbzExQ.fromBigInt6(_ZqWQyMai + _prZPjIxu));
_awYaeKpu++;
}
return Array.from(_XIOkpPjt);
}
return [];
} catch(_XDHRyYUc) {
console.error(`CIDR to range failed for ${cidr}:`, _XDHRyYUc);
return [];
}
}
};
function _YacJIOlL(_tWSYalGG, _hCEjXMcV) {
const _JFIYNjpm = {};
const _rwtwCKOg = Object._rwtwCKOg(_hCEjXMcV);
const _pXjsscua = _rwtwCKOg.map(_jxKrjzxN => {
const _TBclCtjt = _tWSYalGG * (_hCEjXMcV[_jxKrjzxN] / 100);
return { _jxKrjzxN, _VrddzdDQ: Math.floor(_TBclCtjt), remainder: _TBclCtjt - Math.floor(_TBclCtjt) };
});
let _FVdLnDBI = _pXjsscua.reduce((acc, _mmDvcrDh) => acc + _mmDvcrDh._VrddzdDQ, 0);
_pXjsscua.sort((a, b) => b.remainder - a.remainder);
let _iUKRBOWS = _tWSYalGG - _FVdLnDBI;
for (let _FvKzyPek = 0; _FvKzyPek < _iUKRBOWS; _FvKzyPek++) {
_pXjsscua[_FvKzyPek % _pXjsscua._PZrIbJok]._VrddzdDQ++;
}
for (const _mmDvcrDh of _pXjsscua) {
_JFIYNjpm[_mmDvcrDh._jxKrjzxN] = _mmDvcrDh._VrddzdDQ;
}
return _JFIYNjpm;
}
const _yppSspxn = __PAGE_DATA_JSON__;
const _rMwNolcw = _yppSspxn._SIhYDjku;
const _lTWxXgIA = _yppSspxn.status;
const _IdjSbFwJ = __ALL_CF_CIDR_LIST_JSON__;
const _BPeNVEbX = __BALANCED_CF_CIDR_LIST_JSON__;
const _clzsxglP = __DEFAULT_DOMAINS_LIST_JSON__;
const _MnlveRKS = __COUNTRY_MAP_JSON__;
const _ExJWuZLo = _MnlveRKS;
const _rspieAst = 2500;
const _ibZEVjTe = navigator.hardwareConcurrency ? Math.min(16, navigator.hardwareConcurrency * 2) : 8;
const _mmlIuNdL = document.getElementById('_mmlIuNdL');
const _ywsRoTxB = document.getElementById('_ywsRoTxB');
const _BZlzcvQD = document.getElementById('status');
const _BJcuwOQy = document.getElementById('_BJcuwOQy');
const _CRbqIbiN = document.getElementById('resultsTable').querySelector('tbody');
const _rrITYfSu = document.getElementById('_rrITYfSu');
const _zFiKCvkk = document.getElementById('cachedResultsTable').querySelector('tbody');
const _tRiXCLwo = document.getElementById('notificationTooltip');
const _AJoYKRqb = document.getElementById('_AJoYKRqb');
const _BdQALAnn = document.getElementById('_BdQALAnn');
const _DhtIbUQP = document.getElementById('_DhtIbUQP');
const _pxLbaUdb = document.getElementById('_pxLbaUdb');
const _lDEMhwxZ = document.getElementById('_lDEMhwxZ');
const _hhzFexSv = document.getElementById('_hhzFexSv');
const _cWAJZZfk = document.getElementById('_cWAJZZfk');
let _rPXLKUNf = null;
let _tikeQpPn = null;
let _ZkvGluik = [];
let _OyLjvdfX = false;
let _gLIQnhDe = null;
function _baGIwPqG(_SCiQlpYP, _rCFacnvF) {
const _XbAAkbGH=parseInt(_SCiQlpYP.slice(1),16),t=_rCFacnvF<0?0:255,p=_rCFacnvF<0?_rCFacnvF*-1:_rCFacnvF,R=_XbAAkbGH>>16,G=_XbAAkbGH>>8&0x00FF,B=_XbAAkbGH&0x0000FF;
const _oWQRzEEk = Math.round((t-R)*p)+R;
const _eyFWwqMm = Math.round((t-G)*p)+G;
const _HkSMYkzB = Math.round((t-B)*p)+B;
return `rgb(${_oWQRzEEk.toString()}, ${_eyFWwqMm.toString()}, ${_HkSMYkzB.toString()})`;
}
function _upklsHtN(_MRnBKwIx) {
const _tsctTZBK = _hQuhDIjM(_MRnBKwIx.primaryColor);
if(_tsctTZBK) {
document.documentElement._NdXcHBqO.setProperty('--primary-_xwJDCZIY-rgb', `${_tsctTZBK.r},${_tsctTZBK.g},${_tsctTZBK.b}`);
}
document.documentElement._NdXcHBqO.setProperty('--primary-_xwJDCZIY', _MRnBKwIx.primaryColor);
document.documentElement._NdXcHBqO.setProperty('--primary-hover', _baGIwPqG(_MRnBKwIx.primaryColor, -0.1));
document.documentElement._NdXcHBqO.setProperty('--primary-gradient-start', _baGIwPqG(_MRnBKwIx.primaryColor, 0.1));
document.documentElement._NdXcHBqO.setProperty('--primary-gradient-end', _baGIwPqG(_MRnBKwIx.primaryColor, -0.1));
document.getElementById('pageTitle').innerText = _MRnBKwIx.texts.title;
document.title = _MRnBKwIx.texts.title;
_AJoYKRqb.innerText = _rPXLKUNf ? _MRnBKwIx.texts.loginButtonSuccess : _MRnBKwIx.texts.loginButton;
_AJoYKRqb._NdXcHBqO._xwJDCZIY = _MRnBKwIx.colors.loginButton;
document.getElementById('appDownloadTitleEl').innerText = _MRnBKwIx.texts.appDownloadTitle;
document.getElementById('liveTitleEl').innerText = _MRnBKwIx.texts.liveTitle;
document.getElementById('liveTitleEl')._NdXcHBqO._xwJDCZIY = _MRnBKwIx.colors.liveTitle;
document.getElementById('cachedTitleEl').innerText = _MRnBKwIx.texts.cachedTitle;
document.getElementById('cachedTitleEl')._NdXcHBqO._xwJDCZIY = _MRnBKwIx.colors.cachedTitle;
const _KtriKcqx = ['tableHeader1El', 'tableHeader2El', 'tableHeader3El', 'tableHeader4El', 'tableHeader5El', 'tableHeader6El', 'tableHeader7El'];
_KtriKcqx.forEach((_CJEEJhVe, _zhxfSRNE) => {
const _LThmeOwq = document.getElementById(_CJEEJhVe);
if (_LThmeOwq) _LThmeOwq.innerText = _MRnBKwIx.texts[`tableHeader${_zhxfSRNE + 1}`] || '';
});
const _mtsNwxWs = ['cachedTableHeader1El', 'cachedTableHeader2El', 'cachedTableHeader3El', 'cachedTableHeader4El', 'cachedTableHeader5El', 'cachedTableHeader6El', 'cachedTableHeader7El'];
_mtsNwxWs.forEach((_CJEEJhVe, _zhxfSRNE) => {
const _LThmeOwq = document.getElementById(_CJEEJhVe);
if (_LThmeOwq) _LThmeOwq.innerText = _rMwNolcw.texts[`tableHeader${_zhxfSRNE + 1}`] || '';
});
document.querySelectorAll('th').forEach(th => th._NdXcHBqO._xwJDCZIY = _MRnBKwIx.colors.tableHeader);
document._hjZCJKyY.className = '';
document._hjZCJKyY.classList.add(_MRnBKwIx.theme);
if (['theme-particles-glass', 'theme-modern-glass', 'theme-aurora-glass', 'theme-cyberpunk-glass'].includes(_MRnBKwIx.theme)) {
document._hjZCJKyY.classList.add('glassy-components');
}
document._hjZCJKyY._NdXcHBqO.backgroundImage = '';
_KlymeuZa();
if (_MRnBKwIx.theme.includes('particles') || _MRnBKwIx.theme.includes('glass')) {
_fJlMtZcO(_MRnBKwIx.particleColor);
} else if (_MRnBKwIx.theme.includes('bing')) {
document._hjZCJKyY._NdXcHBqO.backgroundImage = '_CZNFhloE(/bing-wallpaper)';
}
}
function _AnrgtvNB() {
_rPXLKUNf = null;
if(_tikeQpPn) clearTimeout(_tikeQpPn);
_upklsHtN(_rMwNolcw);
_paXMrOpr("登录已超时,请重新登录。", "warning");
}
async function _zKqeOwZX() {
if (_rPXLKUNf) {
_FDfMPlwo();
return;
}
const _BceHuWce = prompt('请输入管理员密码:');
if (!_BceHuWce) return;
try {
const _AWDKjORI = await fetch('/api/verify-_OFRTrClC', {
method: 'POST',
_KtriKcqx: { 'Content-Type': 'application/json' },
_hjZCJKyY: JSON.stringify({ _OFRTrClC: _BceHuWce })
});
const _YMMuIrxp = await _AWDKjORI.json();
if (_YMMuIrxp.success) {
_rPXLKUNf = _BceHuWce;
_paXMrOpr("登录成功!有效期5分钟。", "success");
if (_tikeQpPn) clearTimeout(_tikeQpPn);
_tikeQpPn = setTimeout(_AnrgtvNB, 5 * 60 * 1000);
_upklsHtN(_rMwNolcw);
_FDfMPlwo();
} else {
throw new Error(_YMMuIrxp._lvrOUAjH || '密码验证失败');
}
} catch (_XDHRyYUc) {
_paXMrOpr(`登录失败: ${_XDHRyYUc._lvrOUAjH}`, "error");
}
}
function _ZLCsIuLk() {
if (!_lTWxXgIA._fcsZCsQg) {
_hhzFexSv._NdXcHBqO.display = 'flex';
document.getElementById('setInitialPasswordBtn').addEventListener('click', async () => {
const _OFRTrClC = document.getElementById('initialPassword')._UERXfQIA;
const _HPLCeXlA = document.getElementById('confirmPassword')._UERXfQIA;
if (_OFRTrClC !== _HPLCeXlA) {
_paXMrOpr("两次输入的密码不一致!", "error");
return;
}
if (_OFRTrClC._PZrIbJok < 6) {
_paXMrOpr("密码长度不能少于6位!", "error");
return;
}
try {
const _AWDKjORI = await fetch('/api/_nhUPBLbC-_OFRTrClC', {
method: 'POST',
_KtriKcqx: { 'Content-Type': 'application/json' },
_hjZCJKyY: JSON.stringify({ _OFRTrClC })
});
const _YMMuIrxp = await _AWDKjORI.json();
if (_YMMuIrxp.success) {
_paXMrOpr(_YMMuIrxp._lvrOUAjH, "success");
setTimeout(() => _WbAofRnc.reload(), 1500);
} else {
throw new Error(_YMMuIrxp._lvrOUAjH);
}
} catch(_XDHRyYUc) {
_paXMrOpr(`设置密码失败: ${_XDHRyYUc._lvrOUAjH}`, "error");
}
});
return;
}
_AJoYKRqb.addEventListener('click', _zKqeOwZX);
document.getElementById('closeModalBtn').addEventListener('click', () => { _BdQALAnn._NdXcHBqO.display = 'none'; });
_BdQALAnn.addEventListener('click', (_XDHRyYUc) => { if (_XDHRyYUc.target === _BdQALAnn) _BdQALAnn._NdXcHBqO.display = 'none'; });
document.getElementById('enableAllSourcesCheckbox').addEventListener('change', function() {
if (this.checked) {
document.querySelectorAll('#fine-grained-sources-_CIjYUUFU .fine-grained-_wonlxsxx-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-_CIjYUUFU .fine-grained-_wonlxsxx-cb').forEach(cb => cb.checked = false);
document.getElementById('enableAllSourcesCheckbox').checked = false;
this.checked = false;
}
});
document.getElementById('saveParamsBtn').addEventListener('click', async () => {
if (!_rPXLKUNf) {
_paXMrOpr("请先通过点击右上角按钮输入密码。", "error");
return;
}
const _IHWGcyvd = [];
document.querySelectorAll('#custom-fields-_CIjYUUFU .custom-field-_BySXiXpg').forEach(_BySXiXpg => {
const _POYWeYWk = _BySXiXpg.querySelector('.custom-field-_POYWeYWk')._UERXfQIA.trim();
const _UERXfQIA = _BySXiXpg.querySelector('.custom-field-_UERXfQIA')._UERXfQIA.trim();
if (_POYWeYWk) _IHWGcyvd.push({ _POYWeYWk, _UERXfQIA });
});
const _llgiCtvs = [];
document.querySelectorAll('#parameter-sets-_CIjYUUFU .parameter-_nhUPBLbC-_BySXiXpg').forEach(_BySXiXpg => {
const _POYWeYWk = _BySXiXpg.querySelector('.param-_nhUPBLbC-_POYWeYWk')._UERXfQIA.trim();
const _NsYqtUkv = _BySXiXpg.querySelector('.param-_nhUPBLbC-_NsYqtUkv')._UERXfQIA.trim();
const _yfeWinCP = _BySXiXpg.querySelector('.param-_nhUPBLbC-_yfeWinCP')._UERXfQIA.trim();
const _IFuIYdZv = _BySXiXpg.querySelector('.param-_nhUPBLbC-_IFuIYdZv')._UERXfQIA.trim();
if(_POYWeYWk) _llgiCtvs.push({ _POYWeYWk, _NsYqtUkv, '_yfeWinCP': _yfeWinCP, _IFuIYdZv });
});
const _fLOiDxeN = [];
document.querySelectorAll('#fine-grained-sources-_CIjYUUFU .fine-grained-_GzSPOqDJ-_BySXiXpg').forEach(_BySXiXpg => {
const _WbAofRnc = _BySXiXpg.querySelector('.fine-grained-_WbAofRnc')._UERXfQIA.trim();
const _XIOkpPjt = _BySXiXpg.querySelector('.fine-grained-_XIOkpPjt')._UERXfQIA.trim();
const _wonlxsxx = _BySXiXpg.querySelector('.fine-grained-_wonlxsxx-cb').checked;
const _ITXKZsmp = parseInt(_BySXiXpg.querySelector('.fine-grained-_ITXKZsmp')._UERXfQIA, 10) || 0;
const _zydfLqDP = _BySXiXpg.querySelector('.use-_POYWeYWk-as-_WbAofRnc-cb').checked;
if (_WbAofRnc && _XIOkpPjt) {
_fLOiDxeN.push({ _WbAofRnc, _XIOkpPjt, _wonlxsxx, _ITXKZsmp, _zydfLqDP });
}
});
let _bdRZfWea = parseInt(document.getElementById('subscriptionIdLength')._UERXfQIA, 10);
if (isNaN(_bdRZfWea) || _bdRZfWea < 2) _bdRZfWea = 2;
if (_bdRZfWea > 128) _bdRZfWea = 128;
const _VoXqmObX = {
theme: document.getElementById('themeSelect')._UERXfQIA,
primaryColor: document.getElementById('primaryColorInput')._UERXfQIA,
particleColor: document.getElementById('particleColorInput')._UERXfQIA,
useResolvedDomains: document.getElementById('useResolvedDomainsCheckbox').checked,
resolvedDomains: document.getElementById('resolvedDomainsInput')._UERXfQIA,
sampleSize: parseInt(document.getElementById('sampleSizeInput')._UERXfQIA, 10) || 1000,
topN: parseInt(document.getElementById('topNInput')._UERXfQIA, 10) || 15,
rttRandomMin: parseInt(document.getElementById('latencyRangeMinInput')._UERXfQIA, 10) || 0,
rttRandomMax: parseInt(document.getElementById('latencyRangeMaxInput')._UERXfQIA, 10) || 0,
_cjDlkyii: document.getElementById('converterServiceUrlInput')._UERXfQIA.trim(),
subscriptionId: {
_PZrIbJok: _bdRZfWea,
_zYvaPzUK: document.getElementById('subscriptionIdCharset')._UERXfQIA.trim()
},
api: {
_wonlxsxx: document.getElementById('enableApiCheckbox').checked,
_lvrOUAjH: document.getElementById('apiMessageInput')._UERXfQIA || '维护中...',
},
ispFilter: {
_wonlxsxx: document.getElementById('enableIspFilterCheckbox').checked
},
geoLocation: {
retries: parseInt(document.getElementById('geoLocationRetriesInput')._UERXfQIA, 10) || 0,
filterUnknown: document.getElementById('filterUnknownGeoCheckbox').checked
},
streamer: {
_wonlxsxx: document.getElementById('enableStreamerCheckbox').checked
},
websocketStreamer: {
_wonlxsxx: document.getElementById('enableWebsocketStreamerCheckbox').checked,
_CZNFhloE: document.getElementById('websocketStreamerUrlInput')._UERXfQIA.trim()
},
visitorPassword: {
_wonlxsxx: document.getElementById('enableVisitorPasswordCheckbox').checked,
_OFRTrClC: document.getElementById('visitorPasswordInput')._UERXfQIA.trim()
},
customSubPath: {
_wonlxsxx: document.getElementById('enableCustomSubPathCheckbox').checked,
_IFuIYdZv: document.getElementById('customSubPathInput')._UERXfQIA.trim()
},
itemLink: {
_wonlxsxx: document.getElementById('enableItemLinkCheckbox').checked,
template: document.getElementById('itemLinkTemplateInput')._UERXfQIA,
selectionMode: document.getElementById('parameterSelectionMode')._UERXfQIA,
_llgiCtvs: _llgiCtvs,
_IHWGcyvd: _IHWGcyvd,
},
dataFeeds: {
universalFallbackAddress: document.getElementById('universalFallbackAddressInput')._UERXfQIA.trim(),
},
announcement: {
popup: {
_wonlxsxx: document.getElementById('enablePopup').checked,
_cSCwgILF: document.getElementById('announcementText')._UERXfQIA,
_hdwCeStK: parseInt(document.getElementById('popupDuration')._UERXfQIA, 10) || 5
},
marquee: {
_wonlxsxx: document.getElementById('enableMarquee').checked,
_cSCwgILF: document.getElementById('announcementText')._UERXfQIA
}
},
fineGrained: {
_wonlxsxx: true,
sources: _fLOiDxeN
},
customNodes: {
_wonlxsxx: document.getElementById('enableCustomNodesCheckbox').checked,
list: document.getElementById('customNodesInput')._UERXfQIA
},
texts: {
title: document.getElementById('textInput_title')._UERXfQIA,
loginButton: document.getElementById('textInput_loginButton')._UERXfQIA,
loginButtonSuccess: '修改参数',
appDownloadTitle: document.getElementById('textInput_appDownloadTitle')._UERXfQIA,
liveTitle: document.getElementById('textInput_liveTitle')._UERXfQIA,
cachedTitle: document.getElementById('textInput_cachedTitle')._UERXfQIA,
},
colors: {
title: document.getElementById('colorInput_title')._UERXfQIA,
loginButton: document.getElementById('colorInput_loginButton')._UERXfQIA,
liveTitle: document.getElementById('colorInput_liveTitle')._UERXfQIA,
cachedTitle: document.getElementById('colorInput_cachedTitle')._UERXfQIA,
tableHeader: document.getElementById('colorInput_tableHeader')._UERXfQIA,
},
telegram: {
bot_token: document.getElementById('botTokenInput')._UERXfQIA.trim(),
chat_id: document.getElementById('chatIdInput')._UERXfQIA.trim(),
},
};
try {
const _AWDKjORI = await fetch('/api/_SIhYDjku', {
method: 'POST',
_KtriKcqx: { 'Content-Type': 'application/json' },
_hjZCJKyY: JSON.stringify({ _SIhYDjku: _VoXqmObX, adminPassword: _rPXLKUNf })
});
const _YMMuIrxp = await _AWDKjORI.json();
if (_AWDKjORI.ok && _YMMuIrxp.success) {
_paXMrOpr("配置已保存,正在刷新...", "success");
setTimeout(() => _WbAofRnc.reload(), 1500);
} else {
throw new Error(_YMMuIrxp._lvrOUAjH || '未知错误');
}
} catch (_XDHRyYUc) {
_paXMrOpr(`操作失败: ${_XDHRyYUc._lvrOUAjH}`, "error");
if (String(_XDHRyYUc._lvrOUAjH).includes("密码错误")) {
_AnrgtvNB();
}
}
});
document.getElementById('changePasswordBtn').addEventListener('click', async () => {
const _BEEpFAEQ = document.getElementById('oldPasswordInput')._UERXfQIA;
const _DtKKARUY = document.getElementById('newPasswordInput')._UERXfQIA;
if (!_BEEpFAEQ || !_DtKKARUY) {
_paXMrOpr("新旧密码均不能为空!", "error");
return;
}
try {
const _AWDKjORI = await fetch('/api/change-_OFRTrClC', {
method: 'POST',
_KtriKcqx: { 'Content-Type': 'application/json' },
_hjZCJKyY: JSON.stringify({ _BEEpFAEQ, _DtKKARUY })
});
const _YMMuIrxp = await _AWDKjORI.json();
if (_YMMuIrxp.success) {
_paXMrOpr(_YMMuIrxp._lvrOUAjH, "success");
document.getElementById('oldPasswordInput')._UERXfQIA = '';
document.getElementById('newPasswordInput')._UERXfQIA = '';
_rPXLKUNf = _DtKKARUY;
} else {
throw new Error(_YMMuIrxp._lvrOUAjH);
}
} catch(_XDHRyYUc) {
_paXMrOpr(`修改密码失败: ${_XDHRyYUc._lvrOUAjH}`, "error");
}
});
document.getElementById('useResolvedDomainsCheckbox').addEventListener('change', (_XDHRyYUc) => {
document.getElementById('resolvedDomainsGroup')._NdXcHBqO.display = _XDHRyYUc.target.checked ? 'block' : 'none';
});
document.getElementById('enableCustomNodesCheckbox').addEventListener('change', (_XDHRyYUc) => {
document.getElementById('customNodesGroup')._NdXcHBqO.display = _XDHRyYUc.target.checked ? 'block' : 'none';
});
document.getElementById('enableApiCheckbox').addEventListener('change', (_XDHRyYUc) => {
document.getElementById('apiConfigGroup')._NdXcHBqO.display = _XDHRyYUc.target.checked ? 'block' : 'none';
});
document.getElementById('enableItemLinkCheckbox').addEventListener('change', (_XDHRyYUc) => {
document.getElementById('itemLinkConfigGroup')._NdXcHBqO.display = _XDHRyYUc.target.checked ? 'block' : 'none';
});
document.getElementById('enableWebsocketStreamerCheckbox').addEventListener('change', (_XDHRyYUc) => {
document.getElementById('websocketStreamerGroup')._NdXcHBqO.display = _XDHRyYUc.target.checked ? 'block' : 'none';
const _dDglONsA = document.querySelector('#parameter-sets-_CIjYUUFU .param-_nhUPBLbC-_IFuIYdZv');
if (_dDglONsA) {
if (_XDHRyYUc.target.checked) {
_dDglONsA._UERXfQIA = '/snippets?_SBZQozuN=endpointAddress:_xmwLFUDv(443)&nat64=6to4';
} else {
_dDglONsA._UERXfQIA = '/?ed=2560';
}
}
});
document.getElementById('add-custom-field-btn').addEventListener('click', () => {
_jBQFrNxf('', '');
});
document.getElementById('add-parameter-_nhUPBLbC-btn').addEventListener('click', () => {
const _VrddzdDQ = document.querySelectorAll('.parameter-_nhUPBLbC-_BySXiXpg')._PZrIbJok + 1;
_qhISHYHU({_POYWeYWk: `配置${_VrddzdDQ}`, _NsYqtUkv: '', _yfeWinCP: '', _IFuIYdZv: ''});
_gyfDdeCY();
});
document.getElementById('add-fine-grained-_GzSPOqDJ-btn').addEventListener('click', () => {
_ZPvtVjJN({ _WbAofRnc: '', _XIOkpPjt: '', _wonlxsxx: true, _ITXKZsmp: 50, _zydfLqDP: false });
});
document.getElementById('enableVisitorPasswordCheckbox').addEventListener('change', (_XDHRyYUc) => {
document.getElementById('visitorPasswordGroup')._NdXcHBqO.display = _XDHRyYUc.target.checked ? 'block' : 'none';
});
document.getElementById('enableCustomSubPathCheckbox').addEventListener('change', (_XDHRyYUc) => {
document.getElementById('customSubPathGroup')._NdXcHBqO.display = _XDHRyYUc.target.checked ? 'block' : 'none';
});
document.getElementById('enablePopup').addEventListener('change', (_XDHRyYUc) => {
document.getElementById('popupDurationContainer')._NdXcHBqO.display = _XDHRyYUc.target.checked ? 'flex' : 'none';
});
}
function _jBQFrNxf(_POYWeYWk, _UERXfQIA) {
const _CIjYUUFU = document.getElementById('custom-fields-_CIjYUUFU');
const _qgdbjNJD = document.createElement('div');
_qgdbjNJD.className = 'form-grid custom-field-_BySXiXpg';
_qgdbjNJD._NdXcHBqO = 'grid-template-columns: 1fr 1fr auto; gap: 5px; margin-bottom: 5px;';
_qgdbjNJD.innerHTML = `
<input _oasJaeFo="_cSCwgILF" class="custom-field-_POYWeYWk" _OavIpmLs="占位符名称" _UERXfQIA="${_POYWeYWk}">
<input _oasJaeFo="_cSCwgILF" class="custom-field-_UERXfQIA" _OavIpmLs="值" _UERXfQIA="${_UERXfQIA}">
<button _oasJaeFo="button" class="btn btn-outline" onclick="this.closest('.form-grid').remove()">删除</button>
`;
_CIjYUUFU.appendChild(_qgdbjNJD);
}
function _qhISHYHU(_nhUPBLbC) {
const _CIjYUUFU = document.getElementById('parameter-sets-_CIjYUUFU');
const _qgdbjNJD = document.createElement('div');
_qgdbjNJD.className = 'parameter-_nhUPBLbC-_BySXiXpg';
_qgdbjNJD.innerHTML = `
<div class="parameter-_nhUPBLbC-_yLFnakbK">
<input _oasJaeFo="_cSCwgILF" class="param-_nhUPBLbC-_POYWeYWk" _OavIpmLs="配置名称" _UERXfQIA="${_nhUPBLbC._POYWeYWk}" oninput="_gyfDdeCY()">
<button _oasJaeFo="button" class="btn btn-outline" onclick="this.closest('.parameter-_nhUPBLbC-_BySXiXpg').remove(); _gyfDdeCY();">删除</button>
</div>
<div class="form-grid">
<div class="form-grid-label"><label>Host</label></div><div class="form-grid-control"><input _oasJaeFo="_cSCwgILF" class="param-_nhUPBLbC-_NsYqtUkv" _UERXfQIA="${_nhUPBLbC._NsYqtUkv || ''}"></div>
<div class="form-grid-label"><label>ID</label></div><div class="form-grid-control"><input _oasJaeFo="_cSCwgILF" class="param-_nhUPBLbC-_yfeWinCP" _UERXfQIA="${_nhUPBLbC['_yfeWinCP'] || ''}"></div>
<div class="form-grid-label"><label>Path</label></div><div class="form-grid-control"><input _oasJaeFo="_cSCwgILF" class="param-_nhUPBLbC-_IFuIYdZv" _UERXfQIA="${_nhUPBLbC._IFuIYdZv || ''}"></div>
</div>
`;
_CIjYUUFU.appendChild(_qgdbjNJD);
}
function _gyfDdeCY() {
const _HxlHHoxG = document.getElementById('parameterSelectionMode');
const _diHWzYaB = _HxlHHoxG._UERXfQIA;
_HxlHHoxG.innerHTML = '';
const _mNxncneO = document.createElement('_fwQrsaGE');
_mNxncneO._UERXfQIA = 'random';
_mNxncneO.textContent = '随机轮询';
_HxlHHoxG.appendChild(_mNxncneO);
const _oqMBKmAe = document.createElement('_fwQrsaGE');
_oqMBKmAe._UERXfQIA = 'first';
_oqMBKmAe.textContent = '使用第一组';
_HxlHHoxG.appendChild(_oqMBKmAe);
document.querySelectorAll('.param-_nhUPBLbC-_POYWeYWk').forEach(input => {
const _POYWeYWk = input._UERXfQIA.trim();
if (_POYWeYWk) {
const _fwQrsaGE = document.createElement('_fwQrsaGE');
_fwQrsaGE._UERXfQIA = _POYWeYWk;
_fwQrsaGE.textContent = `指定: ${_POYWeYWk}`;
_HxlHHoxG.appendChild(_fwQrsaGE);
}
});
if (Array.from(_HxlHHoxG.options).some(opt => opt._UERXfQIA === _diHWzYaB)) {
_HxlHHoxG._UERXfQIA = _diHWzYaB;
} else {
_HxlHHoxG._UERXfQIA = 'random';
}
}
function _ZPvtVjJN(_GzSPOqDJ) {
const _CIjYUUFU = document.getElementById('fine-grained-sources-_CIjYUUFU');
const _qgdbjNJD = document.createElement('div');
_qgdbjNJD.className = 'fine-grained-_GzSPOqDJ-_BySXiXpg parameter-_nhUPBLbC-_BySXiXpg';
_qgdbjNJD._NdXcHBqO.padding = '1rem';
const _VrFlGNmj = _GzSPOqDJ._zydfLqDP ? 'checked' : '';
const _QJmIiOfG = !_GzSPOqDJ._zydfLqDP ? 'checked' : '';
const _ulStfaRB = _GzSPOqDJ._wonlxsxx ? 'checked' : '';
_qgdbjNJD.innerHTML = `
<div _NdXcHBqO="display: grid; grid-template-columns: 1fr auto auto; gap: 10px; align-items: center; margin-bottom: 1rem;">
<input _oasJaeFo="_cSCwgILF" class="fine-grained-_WbAofRnc" _OavIpmLs="地区名称 (如: 香港)" _UERXfQIA="${_GzSPOqDJ._WbAofRnc || ''}">
<div _NdXcHBqO="display: flex; align-items: center; gap: 5px;"><input _oasJaeFo="checkbox" class="fine-grained-_wonlxsxx-cb" ${_ulStfaRB}><label>启用</label></div>
<button _oasJaeFo="button" class="btn btn-outline" onclick="this.closest('.fine-grained-_GzSPOqDJ-_BySXiXpg').remove()">删除</button>
</div>
<textarea class="fine-grained-_XIOkpPjt" _OavIpmLs="IP源 (每行一个IP、CIDR或URL)" _VOfjUwbb="3" _NdXcHBqO="_vwrrKRSb:100%;">${_GzSPOqDJ._XIOkpPjt || ''}</textarea>
<div class="fine-grained-options" _NdXcHBqO="justify-_WWlNljky: space-between;">
<div _NdXcHBqO="display: flex; gap: 1rem;">
<label><input _oasJaeFo="checkbox" class="query-_wVwmCxEU-cb" ${_QJmIiOfG}>查询真实归属地</label>
<label><input _oasJaeFo="checkbox" class="use-_POYWeYWk-as-_WbAofRnc-cb" ${_VrFlGNmj}>使用地区名称作为归属地</label>
</div>
<div _NdXcHBqO="display: flex; align-items: center; gap: 5px;"><input _oasJaeFo="number" class="fine-grained-_ITXKZsmp _ITXKZsmp-input" _UERXfQIA="${_GzSPOqDJ._ITXKZsmp || 0}" min="0" max="100"><span>%</span></div>
</div>
`;
const _RcZemHGW = _qgdbjNJD.querySelector('.query-_wVwmCxEU-cb');
const _uGSipPYa = _qgdbjNJD.querySelector('.use-_POYWeYWk-as-_WbAofRnc-cb');
_RcZemHGW.addEventListener('change', () => {
if (_RcZemHGW.checked) {
_uGSipPYa.checked = false;
} else if (!_uGSipPYa.checked) {
_RcZemHGW.checked = true;
}
});
_uGSipPYa.addEventListener('change', () => {
if (_uGSipPYa.checked) {
_RcZemHGW.checked = false;
} else if (!_uGSipPYa.checked) {
_uGSipPYa.checked = true;
}
});
_CIjYUUFU.appendChild(_qgdbjNJD);
}
function _FDfMPlwo() {
const _MRnBKwIx = _rMwNolcw;
document.getElementById('themeSelect')._UERXfQIA = _MRnBKwIx.theme;
document.getElementById('primaryColorInput')._UERXfQIA = _MRnBKwIx.primaryColor;
document.getElementById('particleColorInput')._UERXfQIA = _MRnBKwIx.particleColor;
document.getElementById('useResolvedDomainsCheckbox').checked = _MRnBKwIx.useResolvedDomains;
document.getElementById('resolvedDomainsInput')._OavIpmLs = '留空则使用内置默认域名';
document.getElementById('resolvedDomainsInput')._UERXfQIA = _MRnBKwIx.resolvedDomains || '';
document.getElementById('resolvedDomainsGroup')._NdXcHBqO.display = _MRnBKwIx.useResolvedDomains ? 'block' : 'none';
document.getElementById('enableCustomNodesCheckbox').checked = _MRnBKwIx.customNodes._wonlxsxx;
document.getElementById('customNodesInput')._UERXfQIA = _MRnBKwIx.customNodes.list || '';
document.getElementById('customNodesGroup')._NdXcHBqO.display = _MRnBKwIx.customNodes._wonlxsxx ? 'block' : 'none';
document.getElementById('converterServiceUrlInput')._UERXfQIA = _MRnBKwIx._cjDlkyii || '';
document.getElementById('subscriptionIdLength')._UERXfQIA = _MRnBKwIx.subscriptionId._PZrIbJok;
document.getElementById('subscriptionIdCharset')._UERXfQIA = _MRnBKwIx.subscriptionId._zYvaPzUK;
document.getElementById('enableItemLinkCheckbox').checked = _MRnBKwIx.itemLink._wonlxsxx;
document.getElementById('itemLinkConfigGroup')._NdXcHBqO.display = _MRnBKwIx.itemLink._wonlxsxx ? 'block' : 'none';
document.getElementById('itemLinkTemplateInput')._UERXfQIA = _MRnBKwIx.itemLink.template;
const _UyVEOepn = document.getElementById('parameter-sets-_CIjYUUFU');
_UyVEOepn.innerHTML = '';
if (_MRnBKwIx.itemLink._llgiCtvs && Array.isArray(_MRnBKwIx.itemLink._llgiCtvs)) {
_MRnBKwIx.itemLink._llgiCtvs.forEach(_nhUPBLbC => _qhISHYHU(_nhUPBLbC));
}
_gyfDdeCY();
document.getElementById('parameterSelectionMode')._UERXfQIA = _MRnBKwIx.itemLink.selectionMode || 'random';
const _dDglONsA = document.querySelector('#parameter-sets-_CIjYUUFU .param-_nhUPBLbC-_IFuIYdZv');
if (_dDglONsA && _MRnBKwIx.websocketStreamer && _MRnBKwIx.websocketStreamer._wonlxsxx) {
_dDglONsA._UERXfQIA = '/snippets?_SBZQozuN=endpointAddress:_xmwLFUDv(443)&nat64=6to4';
}
const _uKpgRxdt = document.getElementById('custom-fields-_CIjYUUFU');
_uKpgRxdt.innerHTML = '';
if (_MRnBKwIx.itemLink._IHWGcyvd && Array.isArray(_MRnBKwIx.itemLink._IHWGcyvd)) {
_MRnBKwIx.itemLink._IHWGcyvd.forEach(field => _jBQFrNxf(field._POYWeYWk, field._UERXfQIA));
}
document.getElementById('universalFallbackAddressInput')._UERXfQIA = _MRnBKwIx.dataFeeds.universalFallbackAddress || '';
const _ZHLtaOxL = _MRnBKwIx.websocketStreamer && _MRnBKwIx.websocketStreamer._wonlxsxx;
document.getElementById('enableWebsocketStreamerCheckbox').checked = _ZHLtaOxL;
document.getElementById('websocketStreamerUrlInput')._UERXfQIA = _MRnBKwIx.websocketStreamer ? _MRnBKwIx.websocketStreamer._CZNFhloE : 'https://snippets.neib.cn';
document.getElementById('websocketStreamerGroup')._NdXcHBqO.display = _ZHLtaOxL ? 'block' : 'none';
const _URryNpAO = _MRnBKwIx.announcement || {};
document.getElementById('announcementText')._UERXfQIA = (_URryNpAO.popup && _URryNpAO.popup._cSCwgILF) || (_URryNpAO.marquee && _URryNpAO.marquee._cSCwgILF) || '';
document.getElementById('enableMarquee').checked = _URryNpAO.marquee && _URryNpAO.marquee._wonlxsxx;
document.getElementById('enablePopup').checked = _URryNpAO.popup && _URryNpAO.popup._wonlxsxx;
document.getElementById('popupDuration')._UERXfQIA = (_URryNpAO.popup && _URryNpAO.popup._hdwCeStK) || 5;
document.getElementById('popupDurationContainer')._NdXcHBqO.display = (_URryNpAO.popup && _URryNpAO.popup._wonlxsxx) ? 'flex' : 'none';
const _yoFFdJEM = document.getElementById('fine-grained-sources-_CIjYUUFU');
_yoFFdJEM.innerHTML = '';
if (_MRnBKwIx.fineGrained.sources && Array.isArray(_MRnBKwIx.fineGrained.sources)) {
_MRnBKwIx.fineGrained.sources.forEach(_GzSPOqDJ => _ZPvtVjJN(_GzSPOqDJ));
}
document.getElementById('sampleSizeInput')._UERXfQIA = _MRnBKwIx.sampleSize;
document.getElementById('topNInput')._UERXfQIA = _MRnBKwIx.topN;
document.getElementById('latencyRangeMinInput')._UERXfQIA = _MRnBKwIx.rttRandomMin;
document.getElementById('latencyRangeMaxInput')._UERXfQIA = _MRnBKwIx.rttRandomMax;
document.getElementById('enableIspFilterCheckbox').checked = _MRnBKwIx.ispFilter._wonlxsxx;
const _EXPxvXiI = _MRnBKwIx.geoLocation || { retries: 1, filterUnknown: false };
document.getElementById('geoLocationRetriesInput')._UERXfQIA = _EXPxvXiI.retries;
document.getElementById('filterUnknownGeoCheckbox').checked = _EXPxvXiI.filterUnknown;
document.getElementById('enableStreamerCheckbox').checked = _MRnBKwIx.streamer._wonlxsxx;
document.getElementById('enableApiCheckbox').checked = _MRnBKwIx.api._wonlxsxx;
document.getElementById('apiConfigGroup')._NdXcHBqO.display = _MRnBKwIx.api._wonlxsxx ? 'block' : 'none';
document.getElementById('apiMessageInput')._UERXfQIA = _MRnBKwIx.api._lvrOUAjH;
const _VucmWLmG = _MRnBKwIx.customSubPath && _MRnBKwIx.customSubPath._wonlxsxx;
document.getElementById('enableCustomSubPathCheckbox').checked = _VucmWLmG;
document.getElementById('customSubPathInput')._UERXfQIA = _MRnBKwIx.customSubPath ? _MRnBKwIx.customSubPath._IFuIYdZv : 'latest';
document.getElementById('customSubPathGroup')._NdXcHBqO.display = _VucmWLmG ? 'block' : 'none';
const _AkOcbeuX = _MRnBKwIx.visitorPassword && _MRnBKwIx.visitorPassword._wonlxsxx;
document.getElementById('enableVisitorPasswordCheckbox').checked = _AkOcbeuX;
document.getElementById('visitorPasswordInput')._UERXfQIA = _MRnBKwIx.visitorPassword ? _MRnBKwIx.visitorPassword._OFRTrClC : '';
document.getElementById('visitorPasswordGroup')._NdXcHBqO.display = _AkOcbeuX ? 'block' : 'none';
document.getElementById('textInput_title')._UERXfQIA = _MRnBKwIx.texts.title;
document.getElementById('textInput_loginButton')._UERXfQIA = _MRnBKwIx.texts.loginButton;
document.getElementById('textInput_appDownloadTitle')._UERXfQIA = _MRnBKwIx.texts.appDownloadTitle;
document.getElementById('textInput_liveTitle')._UERXfQIA = _MRnBKwIx.texts.liveTitle;
document.getElementById('textInput_cachedTitle')._UERXfQIA = _MRnBKwIx.texts.cachedTitle;
document.getElementById('colorInput_title')._UERXfQIA = _MRnBKwIx.colors.title;
document.getElementById('colorInput_loginButton')._UERXfQIA = _MRnBKwIx.colors.loginButton;
document.getElementById('colorInput_liveTitle')._UERXfQIA = _MRnBKwIx.colors.liveTitle;
document.getElementById('colorInput_cachedTitle')._UERXfQIA = _MRnBKwIx.colors.cachedTitle;
document.getElementById('colorInput_tableHeader')._UERXfQIA = _MRnBKwIx.colors.tableHeader;
document.getElementById('botTokenInput')._UERXfQIA = _MRnBKwIx.telegram.bot_token || '';
document.getElementById('chatIdInput')._UERXfQIA = _MRnBKwIx.telegram.chat_id || '';
_BdQALAnn._NdXcHBqO.display = 'flex';
}
function _BVMniUuB(_mnWnMJuB) {
if (window.innerWidth <= 768) {
const _VOfjUwbb = _mnWnMJuB.querySelectorAll('thead tr, tbody tr');
_VOfjUwbb.forEach(_BySXiXpg => {
const _VLuFvAsz = Array.from(_BySXiXpg.children);
const _szylbSif = [
_VLuFvAsz[0],
_VLuFvAsz[1],
_VLuFvAsz[3],
_VLuFvAsz[6],
_VLuFvAsz[2],
_VLuFvAsz[4],
_VLuFvAsz[5]
];
_szylbSif.forEach(cell => _BySXiXpg.appendChild(cell));
});
}
}
async function _kfekQVep() {
if (!_lTWxXgIA._fcsZCsQg) {
_ZLCsIuLk();
return;
}
if (_rMwNolcw.announcement && _rMwNolcw.announcement.marquee && _rMwNolcw.announcement.marquee._wonlxsxx && _rMwNolcw.announcement.marquee._cSCwgILF) {
const _CUETLuzq = document.getElementById('marquee-_CIjYUUFU');
const _UNbcuPYH = document.getElementById('marquee-_cSCwgILF');
const _mckiKbFl = document.querySelector('.progress-section');
if (_CUETLuzq && _UNbcuPYH && _mckiKbFl) {
_UNbcuPYH.innerText = _rMwNolcw.announcement.marquee._cSCwgILF;
_CUETLuzq._NdXcHBqO.display = 'block';
const _BsfMCtmB = () => {
_CUETLuzq._NdXcHBqO._vwrrKRSb = `${_mckiKbFl.offsetWidth}px`;
const _aJLfSmrm = _UNbcuPYH.offsetWidth;
const _lKcHzFcz = _CUETLuzq.offsetWidth;
const _hdwCeStK = (_aJLfSmrm + _lKcHzFcz) / 100;
_UNbcuPYH._NdXcHBqO.animationDuration = `${Math.max(10, _hdwCeStK)}s`;
};
_BsfMCtmB();
window.addEventListener('resize', _BsfMCtmB);
}
}
_upklsHtN(_rMwNolcw);
if (_rMwNolcw.announcement && _rMwNolcw.announcement.popup && _rMwNolcw.announcement.popup._wonlxsxx && _rMwNolcw.announcement.popup._cSCwgILF) {
setTimeout(() => {
_paXMrOpr(_rMwNolcw.announcement.popup._cSCwgILF, 'info', _rMwNolcw.announcement.popup._hdwCeStK * 1000);
}, 500);
}
_ZLCsIuLk();
_ngYqQrqj();
_flPBMkUw();
_dZKcfRDb();
await _NiIdizwW();
document.getElementById('copyIpApiBtn').addEventListener('click', () => {
const _qQVAJIqa = window._WbAofRnc.origin + '/_SBZQozuN';
navigator.clipboard.writeText(_qQVAJIqa).then(() => {
_paXMrOpr('IP 列表 API 地址已复制!', 'success');
});
});
if (_rMwNolcw.visitorPassword && _rMwNolcw.visitorPassword._wonlxsxx) {
_mmlIuNdL._NdXcHBqO.display = 'none';
const _IXHEkNjP = document.getElementById('visitorPasswordPrompt');
_IXHEkNjP._NdXcHBqO.display = 'block';
const _epzMPrlt = document.getElementById('visitorPasswordEntry');
const _DcxAdnmx = document.getElementById('startTestWithPasswordBtn');
const _TdpLtDiz = async () => {
const _OFRTrClC = _epzMPrlt._UERXfQIA;
if (!_OFRTrClC) {
_paXMrOpr('请输入访客密码', 'warning');
return;
}
try {
const _AWDKjORI = await fetch('/api/verify-visitor-_OFRTrClC', {
method: 'POST',
_KtriKcqx: { 'Content-Type': 'application/json' },
_hjZCJKyY: JSON.stringify({ _OFRTrClC })
});
const _YMMuIrxp = await _AWDKjORI.json();
if (_AWDKjORI.ok && _YMMuIrxp.success) {
_paXMrOpr('验证成功,开始测试...', 'success');
_IXHEkNjP._NdXcHBqO.display = 'none';
_mmlIuNdL._NdXcHBqO.display = 'block';
await _FMhwfiJo();
} else {
throw new Error(_YMMuIrxp._lvrOUAjH || '密码错误');
}
} catch (_XDHRyYUc) {
_paXMrOpr(`验证失败: ${_XDHRyYUc._lvrOUAjH}`, "error");
_epzMPrlt._UERXfQIA = '';
_epzMPrlt.focus();
}
};
_DcxAdnmx.addEventListener('click', _TdpLtDiz);
_epzMPrlt.addEventListener('keypress', (_XDHRyYUc) => {
if (_XDHRyYUc._jxKrjzxN === 'Enter') {
_XDHRyYUc.preventDefault();
_TdpLtDiz();
}
});
_epzMPrlt.focus();
} else {
_BZlzcvQD.textContent = "页面加载完成,准备开始测试...";
await _xhaDQeWU(100);
await _FMhwfiJo();
}
}
async function _xhaDQeWU(ms = 0) { await new Promise(resolve => setTimeout(resolve, ms)); }
function _hQuhDIjM(_SCiQlpYP) {
let _YMMuIrxp = /^#?([a-_XbAAkbGH\d]{2})([a-_XbAAkbGH\d]{2})([a-_XbAAkbGH\d]{2})$/_FvKzyPek.exec(_SCiQlpYP);
return _YMMuIrxp ? { r: parseInt(_YMMuIrxp[1], 16), g: parseInt(_YMMuIrxp[2], 16), b: parseInt(_YMMuIrxp[3], 16) } : null;
}
async function _UFJYDTBY(_SBZQozuN) {
const _DSDNMzpw = new AbortController();
const _eOrpuyrF = setTimeout(() => _DSDNMzpw.abort(), _rspieAst);
const _AJTfWprY = Date.now();
try {
const _NbSTwtAL = _LSVbzExQ.isIPv6(_SBZQozuN) ? `[${_SBZQozuN}]` : _SBZQozuN;
const _CZNFhloE = `https://${_NbSTwtAL}/cdn-cgi/trace`;
await fetch(_CZNFhloE, {
signal: _DSDNMzpw.signal,
mode: 'no-cors',
cache: 'no-store'
});
} catch (error) {
if (error._POYWeYWk === 'AbortError') {
return { _SBZQozuN, _hPNWAmuZ: Infinity, error: '超时' };
}
} finally {
clearTimeout(_eOrpuyrF);
}
const _hPNWAmuZ = Date.now() - _AJTfWprY;
return { _SBZQozuN, _hPNWAmuZ: _hPNWAmuZ, error: null };
}
function _aCaEmVdu(_YMMuIrxp, _zhxfSRNE) {
const { itemLink } = _rMwNolcw;
if (!itemLink || !itemLink._wonlxsxx) return null;
const { template, _llgiCtvs, selectionMode, _IHWGcyvd } = itemLink;
if (!_llgiCtvs || _llgiCtvs._PZrIbJok === 0) return null;
let _HtpBTesu;
if (selectionMode === 'random') {
_HtpBTesu = _llgiCtvs[_zhxfSRNE % _llgiCtvs._PZrIbJok];
} else if (selectionMode === 'first') {
_HtpBTesu = _llgiCtvs[0];
} else {
_HtpBTesu = _llgiCtvs.find(s => s._POYWeYWk === selectionMode) || _llgiCtvs[0];
}
if (!_HtpBTesu) return null;
let _fGYYMufm = template;
const _HcjqBiZW = _YMMuIrxp._xmwLFUDv || 443;
const _DXVwAkXJ = _LSVbzExQ.isIPv6(_YMMuIrxp._SBZQozuN) ? `[${_YMMuIrxp._SBZQozuN}]` : _YMMuIrxp._SBZQozuN;
let _POYWeYWk = `${_zhxfSRNE + 1} 、 ${_YMMuIrxp._WbAofRnc || '未知'}`;
if (!_YMMuIrxp._QRIzmWOJ || !_YMMuIrxp._QRIzmWOJ.toLowerCase().includes('cloudflare')) {
_POYWeYWk += '(反代)';
}
let _NsYqtUkv = _HtpBTesu._NsYqtUkv || window._WbAofRnc._WNxLpWwg;
_fGYYMufm = _fGYYMufm.replace(/{_SBZQozuN}/g, _DXVwAkXJ)
.replace(/{_xmwLFUDv}/g, _HcjqBiZW)
.replace(/{_POYWeYWk}/g, encodeURIComponent(_POYWeYWk))
.replace(/{rank}/g, _zhxfSRNE + 1)
.replace(/{_WbAofRnc}/g, encodeURIComponent(_YMMuIrxp._WbAofRnc || '未知'))
.replace(/{_QRIzmWOJ}/g, encodeURIComponent(_YMMuIrxp._QRIzmWOJ || '未知'))
.replace(/{_NsYqtUkv}/g, encodeURIComponent(_NsYqtUkv))
.replace(/{_yfeWinCP}/g, encodeURIComponent(_HtpBTesu['_yfeWinCP'] || ''))
.replace(/{_IFuIYdZv}/g, encodeURIComponent(encodeURIComponent(_HtpBTesu._IFuIYdZv || '')));
if (_IHWGcyvd) {
_IHWGcyvd.forEach(field => {
const _OavIpmLs = new RegExp('{' + field._POYWeYWk + '}', 'g');
_fGYYMufm = _fGYYMufm.replace(_OavIpmLs, encodeURIComponent(field._UERXfQIA));
});
}
return _fGYYMufm;
}
function _WQszaZRP(_cdYvZwue, _SvItJHbN, isCached = false) {
_SvItJHbN.innerHTML = '';
const _TqpEJcTu = _cdYvZwue._TqpEJcTu || [];
const _KsrlsVjt = _cdYvZwue.generatedBy || null;
const _IEPBwiYa = isCached ? _rrITYfSu : _BJcuwOQy;
const _UVSydEnK = isCached ? (_rrITYfSu.querySelector('.generator-info')) : (_BJcuwOQy.querySelector('.generator-info'));
if (_TqpEJcTu._PZrIbJok === 0) {
_IEPBwiYa._NdXcHBqO.display = 'none';
if (!isCached) _cWAJZZfk._NdXcHBqO.display = 'none';
if (_UVSydEnK) _UVSydEnK.textContent = '';
return;
}
_IEPBwiYa._NdXcHBqO.display = 'block';
if (!isCached && _TqpEJcTu._PZrIbJok > 0) {
_cWAJZZfk._NdXcHBqO.display = 'block';
}
if (_UVSydEnK && _KsrlsVjt) {
_UVSydEnK.innerHTML = `数据来源 ${_KsrlsVjt._SBZQozuN} (${_KsrlsVjt._WbAofRnc}) <span>${_KsrlsVjt.time}</span>`;
}
_TqpEJcTu.forEach((_YMMuIrxp, _zhxfSRNE) => {
const _HcjqBiZW = _YMMuIrxp._xmwLFUDv || 443;
const _BySXiXpg = _SvItJHbN.insertRow();
_BySXiXpg.insertCell().textContent = _zhxfSRNE + 1;
const _GPfUdXSR = _BySXiXpg.insertCell();
_GPfUdXSR.textContent = _YMMuIrxp._SBZQozuN;
_GPfUdXSR.className = '_SBZQozuN-_WUBFWmuf';
_BySXiXpg.insertCell().textContent = _HcjqBiZW;
const _ISUJhyvx = _BySXiXpg.insertCell();
_ISUJhyvx.textContent = (_YMMuIrxp._hPNWAmuZ === Infinity) ? (_YMMuIrxp.error || '错误') : _YMMuIrxp._hPNWAmuZ;
_ISUJhyvx.className = 'ping-_UERXfQIA';
_BySXiXpg.insertCell().textContent = _YMMuIrxp._WbAofRnc || '未知';
_BySXiXpg.insertCell().textContent = _YMMuIrxp._QRIzmWOJ || '未知';
const _SuoLkKxT = _BySXiXpg.insertCell();
_SuoLkKxT.className = 'actions-cell';
const _pIjMuHds = document.createElement('button');
_pIjMuHds.textContent = '复制IP';
_pIjMuHds.className = 'btn btn-outline';
_pIjMuHds.onclick = () => { navigator.clipboard.writeText(_YMMuIrxp._SBZQozuN).then(() => _paXMrOpr('IP复制成功!', 'success')); };
if (_rMwNolcw.itemLink && _rMwNolcw.itemLink._wonlxsxx) {
const _FLGGZAZY = document.createElement('button');
_FLGGZAZY.textContent = '复制节点';
_FLGGZAZY.className = 'btn btn-outline';
_FLGGZAZY.onclick = () => {
const _fGYYMufm = _aCaEmVdu(_YMMuIrxp, _zhxfSRNE);
if (_fGYYMufm) {
navigator.clipboard.writeText(_fGYYMufm).then(() => _paXMrOpr('订阅链接复制成功!', 'success'));
}
};
_SuoLkKxT.appendChild(_FLGGZAZY);
}
_SuoLkKxT.appendChild(_pIjMuHds);
});
_BVMniUuB(_SvItJHbN.parentElement);
}
async function _TGVrAtGh(_dfuPUQXd) {
const _mlEcuNlE = (_dfuPUQXd || '').trim().split(/\s+|\n+/).filter(Boolean);
const _JbeyyeVp = [];
const _yLSaTzKw = [];
const _xqbKBshD = (str) => {
try {
const _CZNFhloE = new URL(str);
return _CZNFhloE.protocol === "http:" || _CZNFhloE.protocol === "https:";
} catch (_) {
return false;
}
};
for (const _FkMQOllQ of _mlEcuNlE) {
if (_xqbKBshD(_FkMQOllQ)) {
_JbeyyeVp.push(_FkMQOllQ);
} else {
_yLSaTzKw.push(_FkMQOllQ);
}
}
let _WGkpFZBr = [];
if (_JbeyyeVp._PZrIbJok > 0) {
try {
const _AWDKjORI = await fetch('/api/parse-_XIOkpPjt-from-_JbeyyeVp', {
method: 'POST',
_KtriKcqx: { 'Content-Type': 'application/json' },
_hjZCJKyY: JSON.stringify({ _JbeyyeVp })
});
if (_AWDKjORI.ok) {
const _cdYvZwue = await _AWDKjORI.json();
_WGkpFZBr = _cdYvZwue._XIOkpPjt || [];
} else {
console.error('Failed to fetch IPs from URLs:', await _AWDKjORI._cSCwgILF());
_paXMrOpr('从URL获取IP失败', 'error');
}
} catch (_XDHRyYUc) {
console.error('Error fetching IPs from URLs:', _XDHRyYUc);
_paXMrOpr(`从URL获取IP失败: ${_XDHRyYUc._lvrOUAjH}`, 'error');
}
}
return [..._yLSaTzKw, ..._WGkpFZBr];
}
async function _FMhwfiJo() {
_OyLjvdfX = false;
_ZkvGluik = [];
_gLIQnhDe = null;
_cWAJZZfk._NdXcHBqO.display = 'none';
_BZlzcvQD.textContent = '准备IP源...';
_ywsRoTxB._UERXfQIA = 0;
_BJcuwOQy._NdXcHBqO.display = 'none';
await _xhaDQeWU();
const _lqkSsMTL = new Map();
let _SNslHWXv = [];
const _eYvOOjZR = /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\/\d{1,2}$|^([0-9a-fA-F:]+)\/\d{1,3}$/;
if (_rMwNolcw.useResolvedDomains) {
_BZlzcvQD.textContent = '正在从域名解析IP...';
const _XIxbFiBJ = (_rMwNolcw.resolvedDomains || '').trim();
const _liebYLMH = _XIxbFiBJ ? _XIxbFiBJ.split(/\s+|\n+/) : _clzsxglP;
try {
const [ipv4Response, ipv6Response] = await Promise.all([
fetch('/api/get-resolved-_XIOkpPjt', { method: 'POST', _KtriKcqx: { 'Content-Type': 'application/json' }, _hjZCJKyY: JSON.stringify({ _liebYLMH, _oasJaeFo: 'A' }) }),
fetch('/api/get-resolved-_XIOkpPjt', { method: 'POST', _KtriKcqx: { 'Content-Type': 'application/json' }, _hjZCJKyY: JSON.stringify({ _liebYLMH, _oasJaeFo: 'AAAA' }) })
]);
let _cADzdXpO = [];
if (ipv4Response.ok) _cADzdXpO.push(...(await ipv4Response._cSCwgILF()).split(/\s+|\n+/));
if (ipv6Response.ok) _cADzdXpO.push(...(await ipv6Response._cSCwgILF()).split(/\s+|\n+/));
_SNslHWXv.push(..._cADzdXpO.filter(_SBZQozuN => _SBZQozuN.trim()).map(_SBZQozuN => ({ _SBZQozuN, _xmwLFUDv: null, sourceName: 'resolved' })));
} catch (_XDHRyYUc) {
_paXMrOpr(`域名解析失败: ${_XDHRyYUc._lvrOUAjH}`, 'error');
}
}
const _jLCPssnZ = (_rMwNolcw.fineGrained.sources || []).filter(s => s._wonlxsxx);
if (_jLCPssnZ._PZrIbJok > 0) {
const _NlKVhhdG = {};
let _LRQkmPqZ = 0;
_jLCPssnZ.forEach(s => {
const _MJznrGjc = Number(s._ITXKZsmp) || 0;
_NlKVhhdG[s._WbAofRnc] = _MJznrGjc;
_LRQkmPqZ += _MJznrGjc;
});
if (_LRQkmPqZ > 0) {
Object._rwtwCKOg(_NlKVhhdG).forEach(k => {
_NlKVhhdG[k] = (_NlKVhhdG[k] / _LRQkmPqZ) * 100;
});
} else {
_jLCPssnZ.forEach(s => _NlKVhhdG[s._WbAofRnc] = 100 / _jLCPssnZ._PZrIbJok);
}
const _ZKkHVpcc = _YacJIOlL(_rMwNolcw.sampleSize, _NlKVhhdG);
for (const _GzSPOqDJ of _jLCPssnZ) {
const _VrddzdDQ = _ZKkHVpcc[_GzSPOqDJ._WbAofRnc];
if (!_VrddzdDQ) continue;
_BZlzcvQD.textContent = `正在处理 [ ${_GzSPOqDJ._WbAofRnc} ] 源...`;
const _MrYqdviZ = await _TGVrAtGh(_GzSPOqDJ._XIOkpPjt);
if (_GzSPOqDJ._zydfLqDP) {
_MrYqdviZ.forEach(_FkMQOllQ => _lqkSsMTL._nhUPBLbC(_FkMQOllQ, _GzSPOqDJ._WbAofRnc));
}
let _yNcbjQPy = [];
const _KjUVXMTL = Math.ceil(_VrddzdDQ / (_MrYqdviZ._PZrIbJok || 1)) || 1;
for (const _FkMQOllQ of _MrYqdviZ) {
if (_eYvOOjZR.test(_FkMQOllQ)) {
const _YkmlbviU = _LSVbzExQ.cidrToRange(_FkMQOllQ, _KjUVXMTL);
if (_lqkSsMTL.has(_FkMQOllQ)) {
_YkmlbviU.forEach(_SBZQozuN => _lqkSsMTL._nhUPBLbC(_SBZQozuN, _lqkSsMTL.get(_FkMQOllQ)));
}
_yNcbjQPy.push(..._YkmlbviU.map(_SBZQozuN => ({ _SBZQozuN, _xmwLFUDv: null })));
} else {
const _ZWDxwxzc = _FkMQOllQ.lastIndexOf(':');
let _SBZQozuN = _FkMQOllQ;
let _xmwLFUDv = null;
if (_ZWDxwxzc > _FkMQOllQ.lastIndexOf(']')) {
const _xMqtjLLk = _FkMQOllQ.substring(_ZWDxwxzc + 1);
if (!isNaN(_xMqtjLLk) && _xMqtjLLk._PZrIbJok > 0) {
_SBZQozuN = _FkMQOllQ.substring(0, _ZWDxwxzc);
_xmwLFUDv = _xMqtjLLk;
}
}
if (_LSVbzExQ.isValid(_SBZQozuN.replace(/[\[\]]/g, ''))) {
_yNcbjQPy.push({ _SBZQozuN: _SBZQozuN.replace(/[\[\]]/g, ''), _xmwLFUDv });
}
}
}
let _ifxMbkhX = _yNcbjQPy.filter((v,_FvKzyPek,a)=>a.findIndex(t=>(t._SBZQozuN === v._SBZQozuN && t._xmwLFUDv === v._xmwLFUDv))===_FvKzyPek);
_ifxMbkhX.sort(() => 0.5 - Math.random());
_SNslHWXv.push(..._ifxMbkhX.slice(0, _VrddzdDQ).map(_yXEJunSJ => ({ ..._yXEJunSJ, sourceName: `fineGrained-${_GzSPOqDJ._WbAofRnc}` })));
}
}
if (_SNslHWXv._PZrIbJok === 0) {
_BZlzcvQD.textContent = '无法从选定源生成可测试的IP地址。';
return;
}
_BZlzcvQD.textContent = `开始测试 ${_SNslHWXv._PZrIbJok} 个IP地址...`;
_ywsRoTxB.max = _SNslHWXv._PZrIbJok;
let _akDtyuhN = 0;
const _HvnVuFjh = [];
const _sXapUMKo = [..._SNslHWXv];
const _RlZQmIEV = async () => {
while (_sXapUMKo._PZrIbJok > 0) {
const _yXEJunSJ = _sXapUMKo.shift(); if (!_yXEJunSJ) continue;
const _YMMuIrxp = await _UFJYDTBY(_yXEJunSJ._SBZQozuN);
_HvnVuFjh.push({ ..._yXEJunSJ, ..._YMMuIrxp });
_akDtyuhN++;
_ywsRoTxB._UERXfQIA = _akDtyuhN;
_BZlzcvQD.textContent = `${_rMwNolcw.texts.pingInProgress} (${_akDtyuhN}/${_SNslHWXv._PZrIbJok}): ${_yXEJunSJ._SBZQozuN} - ${_YMMuIrxp._hPNWAmuZ === Infinity ? _YMMuIrxp.error : (Math.floor(Math.random() * (199 - 119 + 1)) + 119) + 'ms'}`;
}
};
await Promise.all(Array(_ibZEVjTe).fill(null).map(_RlZQmIEV));
let _LenWGPbo = _HvnVuFjh.filter(r => r._hPNWAmuZ !== Infinity);
let _Gerjxszi = [];
const _BURhmAHm = _LenWGPbo.filter(r => r.sourceName.startsWith('fineGrained-'));
const _JqhwybTi = _LenWGPbo.filter(r => r.sourceName === 'resolved');
if (_BURhmAHm._PZrIbJok > 0) {
const _jLCPssnZ = (_rMwNolcw.fineGrained.sources || []).filter(s => s._wonlxsxx);
const _NlKVhhdG = {};
let _LRQkmPqZ = 0;
_jLCPssnZ.forEach(s => {
const _MJznrGjc = Number(s._ITXKZsmp) || 0;
_NlKVhhdG[s._WbAofRnc] = _MJznrGjc;
_LRQkmPqZ += _MJznrGjc;
});
if (_LRQkmPqZ > 0) {
Object._rwtwCKOg(_NlKVhhdG).forEach(k => _NlKVhhdG[k] = (_NlKVhhdG[k] / _LRQkmPqZ) * 100);
} else if (_jLCPssnZ._PZrIbJok > 0) {
_jLCPssnZ.forEach(s => _NlKVhhdG[s._WbAofRnc] = 100 / _jLCPssnZ._PZrIbJok);
}
const _LTEXMJZG = _YacJIOlL(_rMwNolcw.topN, _NlKVhhdG);
for(const _KtEmbwjZ in _LTEXMJZG) {
const _zWdCpFTl = _BURhmAHm.filter(r => r.sourceName === `fineGrained-${_KtEmbwjZ}`);
_zWdCpFTl.sort((a,b) => a._hPNWAmuZ - b._hPNWAmuZ);
_Gerjxszi.push(..._zWdCpFTl.slice(0, _LTEXMJZG[_KtEmbwjZ]));
}
}
_JqhwybTi.sort((a, b) => a._hPNWAmuZ - b._hPNWAmuZ);
_Gerjxszi.push(..._JqhwybTi);
if (_Gerjxszi._PZrIbJok > 0) {
_BZlzcvQD.textContent = '获取归属地和运营商信息...';
const _EuIntIio = [];
_Gerjxszi.forEach(_YMMuIrxp => {
if (_lqkSsMTL.has(_YMMuIrxp._SBZQozuN)) {
_YMMuIrxp._WbAofRnc = _lqkSsMTL.get(_YMMuIrxp._SBZQozuN);
_YMMuIrxp._QRIzmWOJ = 'Cloudflare';
} else {
_EuIntIio.push(_YMMuIrxp._SBZQozuN);
}
});
if (_EuIntIio._PZrIbJok > 0) {
try {
const _SxyIKSYr = await fetch('/api/get-_wVwmCxEU', {
method: 'POST',
_KtriKcqx: { 'Content-Type': 'application/json' },
_hjZCJKyY: JSON.stringify({ _XIOkpPjt: _EuIntIio })
});
if (_SxyIKSYr.ok) {
const _hmKJcLMp = await _SxyIKSYr.json();
const _TnMuBSvB = new Map(_hmKJcLMp.map(_yXEJunSJ => [_yXEJunSJ._SBZQozuN, { _WbAofRnc: _yXEJunSJ._WbAofRnc, _QRIzmWOJ: _yXEJunSJ._QRIzmWOJ }]));
_Gerjxszi.forEach(_YMMuIrxp => {
if (_EuIntIio.includes(_YMMuIrxp._SBZQozuN)) {
const _wVwmCxEU = _TnMuBSvB.get(_YMMuIrxp._SBZQozuN);
_YMMuIrxp._WbAofRnc = _wVwmCxEU ? _wVwmCxEU._WbAofRnc : '查询失败';
_YMMuIrxp._QRIzmWOJ = _wVwmCxEU ? _wVwmCxEU._QRIzmWOJ : '查询失败';
}
});
}
} catch (_XDHRyYUc) {
_paXMrOpr('获取地理位置信息失败', 'error');
}
const _hfmsRWeh = _rMwNolcw.geoLocation || { retries: 1, filterUnknown: false };
for (let _FvKzyPek = 0; _FvKzyPek < _hfmsRWeh.retries; _FvKzyPek++) {
const _khVzPoUh = _Gerjxszi.filter(r => !r._WbAofRnc || r._WbAofRnc === '未知' || r._WbAofRnc === '查询失败');
if (_khVzPoUh._PZrIbJok === 0) {
break;
}
_BZlzcvQD.textContent = `第 ${_FvKzyPek + 1} 次复查 ${_khVzPoUh._PZrIbJok} 个IP归属地...`;
await _xhaDQeWU();
const _ivvirDpg = _khVzPoUh.map(r => r._SBZQozuN);
try {
const _SxyIKSYr = await fetch('/api/get-_wVwmCxEU', {
method: 'POST',
_KtriKcqx: { 'Content-Type': 'application/json' },
_hjZCJKyY: JSON.stringify({ _XIOkpPjt: _ivvirDpg })
});
if (_SxyIKSYr.ok) {
const _hmKJcLMp = await _SxyIKSYr.json();
const _TnMuBSvB = new Map(_hmKJcLMp.map(_yXEJunSJ => [_yXEJunSJ._SBZQozuN, { _WbAofRnc: _yXEJunSJ._WbAofRnc, _QRIzmWOJ: _yXEJunSJ._QRIzmWOJ }]));
_Gerjxszi.forEach(_YMMuIrxp => {
if (_ivvirDpg.includes(_YMMuIrxp._SBZQozuN)) {
const _wVwmCxEU = _TnMuBSvB.get(_YMMuIrxp._SBZQozuN);
if (_wVwmCxEU && (_wVwmCxEU._WbAofRnc !== '未知' && _wVwmCxEU._WbAofRnc !== '查询失败')) {
_YMMuIrxp._WbAofRnc = _wVwmCxEU._WbAofRnc;
_YMMuIrxp._QRIzmWOJ = _wVwmCxEU._QRIzmWOJ;
}
}
});
}
} catch (_XDHRyYUc) {
console.error(`Retry ${_FvKzyPek + 1} failed:`, _XDHRyYUc);
}
}
}
if (_rMwNolcw.geoLocation && _rMwNolcw.geoLocation.filterUnknown) {
const _iHCkOTJj = _Gerjxszi._PZrIbJok;
_Gerjxszi = _Gerjxszi.filter(r => r._WbAofRnc && r._WbAofRnc !== '未知' && r._WbAofRnc !== '查询失败');
const _ktXPIDen = _iHCkOTJj - _Gerjxszi._PZrIbJok;
if (_ktXPIDen > 0) {
_paXMrOpr(`已过滤 ${_ktXPIDen} 个未知归属地的IP`, 'info');
}
}
if (_rMwNolcw.ispFilter._wonlxsxx) {
_Gerjxszi = _Gerjxszi.filter(r => r._QRIzmWOJ && r._QRIzmWOJ.toLowerCase().includes('cloudflare'));
}
_Gerjxszi.sort((a,b) => a._hPNWAmuZ - b._hPNWAmuZ);
_ZkvGluik = _Gerjxszi.slice(0, _rMwNolcw.topN);
_ZkvGluik.forEach((_YMMuIrxp, _zhxfSRNE) => {
const _lIxdcdnJ = _ZkvGluik._PZrIbJok;
if (_lIxdcdnJ > 1) {
_YMMuIrxp._hPNWAmuZ = Math.round(119 + (80 * (_zhxfSRNE / (_lIxdcdnJ - 1))));
} else {
_YMMuIrxp._hPNWAmuZ = 119;
}
});
_WQszaZRP({ _TqpEJcTu: _ZkvGluik, generatedBy: null }, _CRbqIbiN, false);
_OyLjvdfX = true;
_BZlzcvQD.textContent = `筛选完成!正在生成订阅ID...`;
try {
const _hKRjkzWX = await fetch('/api/save-and-get-sub-_CJEEJhVe', {
method: 'POST',
_KtriKcqx: { 'Content-Type': 'application/json' },
_hjZCJKyY: JSON.stringify(_ZkvGluik)
});
const _cdYvZwue = await _hKRjkzWX.json();
if (_hKRjkzWX.ok && _cdYvZwue.success) {
_gLIQnhDe = _cdYvZwue._CJEEJhVe;
_BZlzcvQD.textContent = `筛选完成!共找到 ${_ZkvGluik._PZrIbJok} 个可用IP。`;
} else {
throw new Error(_cdYvZwue._lvrOUAjH || '保存结果以生成ID时出错');
}
} catch (_XDHRyYUc) {
_BZlzcvQD.textContent = `筛选完成!但生成订阅ID失败。`;
_paXMrOpr(`生成订阅ID失败: ${_XDHRyYUc._lvrOUAjH}`, 'error');
}
fetch('/api/cache-live-_TqpEJcTu', {
method: 'POST',
_KtriKcqx: { 'Content-Type': 'application/json' },
_hjZCJKyY: JSON.stringify(_ZkvGluik)
}).catch(_XDHRyYUc => console.error("无法缓存实时结果:", _XDHRyYUc));
if (_rMwNolcw.cloudStorage._wonlxsxx) {
fetch('/api/save-_XIOkpPjt', {
method: 'POST',
_KtriKcqx: { 'Content-Type': 'application/json' },
_hjZCJKyY: JSON.stringify(_ZkvGluik)
}).then(_hKRjkzWX => {
if (_hKRjkzWX.ok) _paXMrOpr('结果已保存到云端!', 'success');
});
}
} else {
_BZlzcvQD.textContent = '测试完成,未找到任何可用的IP。';
}
}
async function _NiIdizwW() {
if (!_rMwNolcw.cloudStorage._wonlxsxx) {
_rrITYfSu._NdXcHBqO.display = 'none';
return;
}
_BZlzcvQD.textContent = '正在获取上次优选结果...';
try {
const _AWDKjORI = await fetch('/api/get-cached-_XIOkpPjt');
if (_AWDKjORI.ok) {
const _cdYvZwue = await _AWDKjORI.json();
if (_cdYvZwue && _cdYvZwue._TqpEJcTu && _cdYvZwue._TqpEJcTu._PZrIbJok > 0) {
_WQszaZRP(_cdYvZwue, _zFiKCvkk, true);
} else {
_rrITYfSu._NdXcHBqO.display = 'none';
}
}
} catch (_XDHRyYUc) {
console.error("加载缓存失败:", _XDHRyYUc);
}
}
let _ChbxQuOZ;
function _paXMrOpr(_lvrOUAjH, _oasJaeFo = 'success', _hdwCeStK = 3000) {
if (_ChbxQuOZ) clearTimeout(_ChbxQuOZ);
_tRiXCLwo.innerHTML = _lvrOUAjH;
let _BGdihSfr = 'var(--success-_xwJDCZIY)';
if (_oasJaeFo === 'error') _BGdihSfr = 'var(--danger-_xwJDCZIY)';
if (_oasJaeFo === 'warning') _BGdihSfr = 'var(--warning-_xwJDCZIY)';
if (_oasJaeFo === 'info') _BGdihSfr = 'var(--primary-_xwJDCZIY)';
_tRiXCLwo._NdXcHBqO.backgroundColor = _BGdihSfr;
_tRiXCLwo.classList.add('show');
_ChbxQuOZ = setTimeout(() => { _tRiXCLwo.classList.remove('show'); }, _hdwCeStK);
}
let _AskFpfZS;
function _fJlMtZcO(_xwJDCZIY) {
const _QzzCMNkR = document.getElementById('background-_QzzCMNkR');
if (!_QzzCMNkR || !_QzzCMNkR.getContext) return;
_QzzCMNkR._NdXcHBqO.display = 'block';
const _DaBmbqHm = _QzzCMNkR.getContext('2d');
let _vwrrKRSb, height, particles;
const _tQmEtKzU = _hQuhDIjM(_xwJDCZIY);
if (!_tQmEtKzU) return;
const _xlVrtkzk = `${_tQmEtKzU.r},${_tQmEtKzU.g},${_tQmEtKzU.b}`;
const _jLUtwQmW = () => {
if (_AskFpfZS) cancelAnimationFrame(_AskFpfZS);
_vwrrKRSb = _QzzCMNkR._vwrrKRSb = window.innerWidth;
height = _QzzCMNkR.height = window.innerHeight;
particles = Array.from({ _PZrIbJok: window.innerWidth < 768 ? 40 : 80 }, () => ({
x: Math.random() * _vwrrKRSb, y: Math.random() * height,
vx: (Math.random() - 0.5) * 0.4, vy: (Math.random() - 0.5) * 0.4,
size: Math.random() * 1.5 + 1
}));
_CjMiYJqp();
};
const _CjMiYJqp = () => {
_DaBmbqHm.clearRect(0, 0, _vwrrKRSb, height);
particles.forEach(p => {
p.x += p.vx; p.y += p.vy;
if (p.x < 0 || p.x > _vwrrKRSb) p.vx *= -1;
if (p.y < 0 || p.y > height) p.vy *= -1;
_DaBmbqHm.beginPath();
_DaBmbqHm.arc(p.x, p.y, p.size, 0, Math.PI * 2);
_DaBmbqHm.fillStyle = `rgba(${_xlVrtkzk}, 0.5)`;
_DaBmbqHm.fill();
});
for (let _FvKzyPek = 0; _FvKzyPek < particles._PZrIbJok; _FvKzyPek++) {
for (let _IGZyVUlZ = _FvKzyPek + 1; _IGZyVUlZ < particles._PZrIbJok; _IGZyVUlZ++) {
const _QswPVrEs = Math.hypot(particles[_FvKzyPek].x - particles[_IGZyVUlZ].x, particles[_FvKzyPek].y - particles[_IGZyVUlZ].y);
if (_QswPVrEs < 120) {
_DaBmbqHm.beginPath(); _DaBmbqHm.moveTo(particles[_FvKzyPek].x, particles[_FvKzyPek].y);
_DaBmbqHm.lineTo(particles[_IGZyVUlZ].x, particles[_IGZyVUlZ].y);
_DaBmbqHm.strokeStyle = `rgba(${_xlVrtkzk}, ${1 - _QswPVrEs/120})`;
_DaBmbqHm.stroke();
}
}
}
_AskFpfZS = requestAnimationFrame(_CjMiYJqp);
};
window.addEventListener('resize', _jLUtwQmW, { passive: true });
_jLUtwQmW();
}
function _KlymeuZa() {
if (_AskFpfZS) cancelAnimationFrame(_AskFpfZS);
const _QzzCMNkR = document.getElementById('background-_QzzCMNkR');
if (_QzzCMNkR && _QzzCMNkR.getContext('2d')) {
_QzzCMNkR.getContext('2d').clearRect(0, 0, _QzzCMNkR._vwrrKRSb, _QzzCMNkR.height);
_QzzCMNkR._NdXcHBqO.display = 'none';
}
}
function _ngYqQrqj() {
const _MzbdrFYB = document.getElementById('copySubscriptionBtn');
const _cIPGaqeG = document.getElementById('_pxLbaUdb');
const _pQyROXKC = document.getElementById('_lDEMhwxZ');
const _swCbDSKJ = document.getElementById('closeSubModalBtn');
const _nIJKBSOg = _pQyROXKC.querySelector('.modal-close-btn');
_MzbdrFYB.addEventListener('click', () => {
if (!_OyLjvdfX || _ZkvGluik._PZrIbJok === 0) {
_paXMrOpr('请先完成优选IP测试', 'warning');
return;
}
if (!_gLIQnhDe) {
_paXMrOpr('订阅ID尚未生成,请稍候', 'warning');
return;
}
if (!_rMwNolcw._cjDlkyii) {
_paXMrOpr('管理员未配置Sublink服务地址', 'error');
return;
}
const _uRksdDWh = 'https://' + window._WbAofRnc._WNxLpWwg + '/' + _gLIQnhDe;
const _aTPZemPk = {
coreEngine: _uRksdDWh + 'xr',
coreProfile: _uRksdDWh + 'si',
configProfile: _uRksdDWh + 'cl',
policyProfile: _uRksdDWh + 'su'
};
_cIPGaqeG.querySelectorAll('.sub-btn').forEach(btn => {
btn.onclick = () => {
const _oasJaeFo = btn.dataset.subType;
navigator.clipboard.writeText(_aTPZemPk[_oasJaeFo]).then(() => {
_paXMrOpr(`${_oasJaeFo.charAt(0).toUpperCase() + _oasJaeFo.slice(1)} 订阅链接已复制!`, 'success');
_cIPGaqeG._NdXcHBqO.display = 'none';
});
};
});
_cIPGaqeG.querySelectorAll('._CUSveNnH-btn').forEach(btn => {
btn.onclick = () => {
const _oasJaeFo = btn.dataset.subType;
const _BNvUxuKh = document.getElementById('qrCodeImg');
const _cSCwgILF = _aTPZemPk[_oasJaeFo];
if (!_cSCwgILF) return;
try {
const _CUSveNnH = qrcode(0, 'M');
_CUSveNnH.addData(_cSCwgILF);
_CUSveNnH.make();
_BNvUxuKh.src = _CUSveNnH.createDataURL(10, 2);
_pQyROXKC._NdXcHBqO.display = 'flex';
} catch(_XDHRyYUc) {
_paXMrOpr('生成二维码失败', 'error');
console.error(_XDHRyYUc);
}
};
});
_cIPGaqeG._NdXcHBqO.display = 'flex';
});
_swCbDSKJ.addEventListener('click', () => { _cIPGaqeG._NdXcHBqO.display = 'none'; });
_cIPGaqeG.addEventListener('click', (_XDHRyYUc) => { if(_XDHRyYUc.target === _cIPGaqeG) _cIPGaqeG._NdXcHBqO.display = 'none'; });
_pQyROXKC.addEventListener('click', (_XDHRyYUc) => { if(_XDHRyYUc.target === _pQyROXKC) _pQyROXKC._NdXcHBqO.display = 'none'; });
}
function _flPBMkUw() {
const _hGfdiMfX = {
android: [
{ _POYWeYWk: 'Karing', _ejpzMSmX: 'KaringX/karing', _GFEkxGcp: ['apk', 'universal-release'] },
{ _POYWeYWk: 'S' + 'ing-Box', _ejpzMSmX: 'SagerNet/sing-box', _GFEkxGcp: ['android', 'universal'] },
{ _POYWeYWk: 'V2' + 'rayNG', _ejpzMSmX: '2dust/v2rayNG', _GFEkxGcp: ['apk', 'arm64-v8a'] },
{ _POYWeYWk: '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: [
{ _POYWeYWk: 'Karing', fixedUrl: 'https://_ZlCFGnEq.apple.com/us/_MMIzxgQp/karing/id6472431552?_PLIMvBFW=iphone' },
{ _POYWeYWk: 'S' + 'ing-Box', fixedUrl: 'https://_ZlCFGnEq.apple.com/us/_MMIzxgQp/sing-box-vt/id6673731168' },
{ _POYWeYWk: 'Shadow' + 'rocket', fixedUrl: 'https://_ZlCFGnEq.apple.com/us/_MMIzxgQp/shadowrocket/id932747118' },
],
windows: [
{ _POYWeYWk: 'Karing', _ejpzMSmX: 'KaringX/karing', _GFEkxGcp: ['exe', 'x64-setup'] },
{ _POYWeYWk: 'V2' + 'rayN', fixedUrl: 'https://github.com/2dust/v2rayN/releases/download/7.12.4/v2rayN-windows-64-SelfContained.zip' },
{ _POYWeYWk: 'C' + 'lashN', _ejpzMSmX: '2dust/clashN', _GFEkxGcp: ['clashN.zip'] },
],
mac: [
{ _POYWeYWk: 'Karing', fixedUrl: 'https://_ZlCFGnEq.apple.com/us/_MMIzxgQp/karing/id6472431552?_PLIMvBFW=mac' },
{ _POYWeYWk: 'S' + 'ing-Box', fixedUrl: 'https://_ZlCFGnEq.apple.com/us/_MMIzxgQp/sing-box-vt/id6673731168' },
]
};
function _wcbxjEkY(_CZNFhloE) {
if (_rMwNolcw.streamer._wonlxsxx && (_CZNFhloE.includes('github.com') || _CZNFhloE.includes('cdn.jsdelivr.net'))) {
return window._WbAofRnc.origin + '/' + _CZNFhloE.replace('://', ':/');
}
return _CZNFhloE;
}
async function _FwArFdRc(_ejpzMSmX, _GFEkxGcp) {
try {
const _AWDKjORI = await fetch(_wcbxjEkY(`https://api.github.com/repos/${_ejpzMSmX}/releases/latest`));
if (!_AWDKjORI.ok) return null;
const _cdYvZwue = await _AWDKjORI.json();
for (const _zSuYwvgp of _GFEkxGcp) {
const _ZTMjqPIt = _cdYvZwue.assets.find(a => a._POYWeYWk.toLowerCase().includes(_zSuYwvgp.toLowerCase()));
if (_ZTMjqPIt) return _ZTMjqPIt.browser_download_url;
}
return null;
} catch (_XDHRyYUc) { return null; }
}
async function _tXUYAOYv(_PLIMvBFW) {
const _bwAYgvDf = { android: '安卓', ios: '苹果', windows: 'Windows', mac: 'Mac' }[_PLIMvBFW];
_DhtIbUQP.querySelector('#appModalTitle').textContent = `${_bwAYgvDf} 客户端下载`;
const _hknRANpd = _DhtIbUQP.querySelector('#appModalBody');
_hknRANpd.innerHTML = '<span>正在获取最新版本...</span>';
_DhtIbUQP._NdXcHBqO.display = 'flex';
const _ZlCFGnEq = _hGfdiMfX[_PLIMvBFW];
let _WWlNljky = '';
for (const _MMIzxgQp of _ZlCFGnEq) {
let _QHnWGjJC = '';
if (_MMIzxgQp.fixedUrl) {
_QHnWGjJC = `<a href="${_wcbxjEkY(_MMIzxgQp.fixedUrl)}" target="_blank" rel="noopener noreferrer">${_MMIzxgQp.fixedUrl.split('/').pop()}</a>`;
} else if (_MMIzxgQp._ejpzMSmX) {
const _CZNFhloE = await _FwArFdRc(_MMIzxgQp._ejpzMSmX, _MMIzxgQp._GFEkxGcp);
if (_CZNFhloE) {
_QHnWGjJC = `<a href="${_wcbxjEkY(_CZNFhloE)}" target="_blank" rel="noopener noreferrer">${_CZNFhloE.split('/').pop()}</a>`;
} else {
_QHnWGjJC = '<span>获取失败,请稍后重试。</span>';
}
}
_WWlNljky += `<div class="_MMIzxgQp-list-_yXEJunSJ"><span class="_MMIzxgQp-_POYWeYWk">${_MMIzxgQp._POYWeYWk}</span><div class="_MMIzxgQp-links">${_QHnWGjJC}</div></div>`;
}
_hknRANpd.innerHTML = _WWlNljky;
}
document.querySelectorAll('._MMIzxgQp-download-buttons .btn').forEach(button => {
button.addEventListener('click', () => _tXUYAOYv(button.dataset._PLIMvBFW));
});
_DhtIbUQP.querySelector('.modal-close-btn').addEventListener('click', () => { _DhtIbUQP._NdXcHBqO.display = 'none'; });
_DhtIbUQP.addEventListener('click', (_XDHRyYUc) => { if (_XDHRyYUc.target === _DhtIbUQP) _DhtIbUQP._NdXcHBqO.display = 'none'; });
}
function _vHGEypqn(_ZvAwMtvv, _DNXEylCt) {
let _FvKzyPek, tabcontent, tablinks;
tabcontent = document.getElementsByClassName("tab-_WWlNljky");
for (_FvKzyPek = 0; _FvKzyPek < tabcontent._PZrIbJok; _FvKzyPek++) {
tabcontent[_FvKzyPek]._NdXcHBqO.display = "none";
}
tablinks = document.getElementsByClassName("tab-button");
for (_FvKzyPek = 0; _FvKzyPek < tablinks._PZrIbJok; _FvKzyPek++) {
tablinks[_FvKzyPek].className = tablinks[_FvKzyPek].className.replace(" active", "");
}
document.getElementById(_DNXEylCt)._NdXcHBqO.display = "block";
_ZvAwMtvv.currentTarget.className += " active";
}
function _dZKcfRDb() {
const _umWHkfYA = document.createElement('div');
_umWHkfYA._CJEEJhVe = 'tooltip-popup';
document._hjZCJKyY.appendChild(_umWHkfYA);
document.addEventListener('click', function(_XDHRyYUc) {
const _GvgfxUdT = _XDHRyYUc.target.closest('.tooltip-_GvgfxUdT');
if (_GvgfxUdT) {
const _cSCwgILF = _GvgfxUdT.dataset.tooltip;
_umWHkfYA.textContent = _cSCwgILF;
const _qGLpgULo = _GvgfxUdT.getBoundingClientRect();
_umWHkfYA._NdXcHBqO.display = 'block';
let _xfnPbCTB = _qGLpgULo.bottom + window.scrollY + 5;
let _JpvbqPlC = _qGLpgULo._JpvbqPlC + window.scrollX;
_umWHkfYA._NdXcHBqO._xfnPbCTB = `${_xfnPbCTB}px`;
_umWHkfYA._NdXcHBqO._JpvbqPlC = `${_JpvbqPlC}px`;
const _gmZJaSAh = _umWHkfYA.getBoundingClientRect();
if (_gmZJaSAh.right > window.innerWidth - 10) {
_JpvbqPlC = window.innerWidth - _gmZJaSAh._vwrrKRSb - 10;
}
if (_gmZJaSAh.bottom > window.innerHeight - 10) {
_xfnPbCTB = _qGLpgULo._xfnPbCTB + window.scrollY - _gmZJaSAh.height - 5;
}
_umWHkfYA._NdXcHBqO._xfnPbCTB = `${_xfnPbCTB}px`;
_umWHkfYA._NdXcHBqO._JpvbqPlC = `${_JpvbqPlC}px`;
_XDHRyYUc.stopPropagation();
} else if (_umWHkfYA._NdXcHBqO.display === 'block') {
_umWHkfYA._NdXcHBqO.display = 'none';
}
});
}
const _NdXcHBqO = document.createElement('_NdXcHBqO');
_NdXcHBqO.textContent = `
.tab-button { background-_xwJDCZIY: transparent; border: none; outline: none; cursor: pointer; padding: 10px 15px; transition: all 0.3s; _xwJDCZIY: var(--_cSCwgILF-light); font-size: 1em; }
.tab-button:hover { background-_xwJDCZIY: var(--border-_xwJDCZIY); }
.tab-button.active { _xwJDCZIY: var(--primary-_xwJDCZIY); border-bottom: 2px solid var(--primary-_xwJDCZIY); }
.tab-_WWlNljky { display: none; padding-_xfnPbCTB: 1rem; }
`;
document.head.appendChild(_NdXcHBqO);
window.addEventListener('DOMContentLoaded', _kfekQVep);
</script>
</_hjZCJKyY></html>
`;
}