From 6840e76cc4563f8352823a2923d78043bcae6e01 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 15 Sep 2026 17:04:17 +0800 Subject: [PATCH] =?UTF-8?q?=E2=9B=84=20Sync=202026-09-15=2017:04:17?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- luci-app-homeproxy/.gitignore | 2 + luci-app-homeproxy/Makefile | 32 +- luci-app-homeproxy/README.md | 154 +- .../htdocs/luci-static/resources/homeproxy.js | 605 +- .../resources/view/homeproxy/client.js | 1259 +-- .../resources/view/homeproxy/node.js | 1093 +-- .../resources/view/homeproxy/server.js | 257 +- .../resources/view/homeproxy/status.js | 112 +- luci-app-homeproxy/po/templates/homeproxy.pot | 2897 +++---- luci-app-homeproxy/po/zh_Hans/homeproxy.po | 3177 ++++---- luci-app-homeproxy/root/etc/config/homeproxy | 56 +- .../etc/homeproxy/resources/china_ip4.txt | 7015 ++++++----------- .../etc/homeproxy/resources/china_ip4.ver | 2 +- .../etc/homeproxy/resources/china_ip6.txt | 4065 ++-------- .../etc/homeproxy/resources/china_ip6.ver | 2 +- .../etc/homeproxy/resources/china_list.txt | 5050 +++++++----- .../etc/homeproxy/resources/china_list.ver | 2 +- .../root/etc/homeproxy/resources/gfw_list.txt | 71 +- .../root/etc/homeproxy/resources/gfw_list.ver | 2 +- .../root/etc/homeproxy/scripts/clean_log.sh | 2 +- .../etc/homeproxy/scripts/firewall_post.ut | 116 +- .../etc/homeproxy/scripts/firewall_pre.uc | 12 +- .../root/etc/homeproxy/scripts/fw4_names.sh | 48 + .../etc/homeproxy/scripts/generate_client.uc | 1012 ++- .../etc/homeproxy/scripts/generate_server.uc | 107 +- .../root/etc/homeproxy/scripts/homeproxy.uc | 319 +- .../etc/homeproxy/scripts/migrate_config.uc | 202 +- .../root/etc/homeproxy/scripts/parse_uri.uc | 500 ++ .../etc/homeproxy/scripts/update_provider.sh | 46 - .../etc/homeproxy/scripts/update_resources.sh | 90 +- .../etc/homeproxy/scripts/update_rulesets.sh | 10 - .../homeproxy/scripts/update_subscriptions.uc | 1510 +--- luci-app-homeproxy/root/etc/init.d/homeproxy | 326 +- .../root/etc/uci-defaults/luci-homeproxy | 30 - .../etc/uci-defaults/luci-homeproxy-migration | 0 .../share/rpcd/acl.d/luci-app-homeproxy.json | 7 +- .../root/usr/share/rpcd/ucode/luci.homeproxy | 1260 +-- luci-app-homeproxy/tests/README.md | 60 + .../tests/fixtures/generators/client.uci | 170 + .../tests/fixtures/generators/custom.uci | 56 + .../tests/fixtures/generators/server.uci | 112 + luci-app-homeproxy/tests/i18n-coverage.py | 152 + luci-app-homeproxy/tests/i18n-ignore.txt | 13 + .../tests/luci-form-snapshot.js | 214 + luci-app-homeproxy/tests/run.sh | 61 + luci-app-homeproxy/tests/snapshots/node.json | 293 + .../tests/snapshots/server.json | 2150 +++++ .../tests/ucode/mocks/homeproxy.uc | 140 + luci-app-homeproxy/tests/ucode/run.sh | 87 + .../tests/ucode/test_firewall_template.sh | 47 + .../tests/ucode/test_fw4_names.sh | 67 + .../tests/ucode/test_generators.sh | 89 + .../tests/ucode/test_homeproxy_utils.uc | 80 + .../ucode/test_homeproxy_utils_inject.uc | 53 + .../tests/ucode/test_parse_uri.uc | 170 + luci-app-passwall/Makefile | 2 +- .../luasrc/passwall/util_sing-box.lua | 32 +- .../luasrc/passwall/util_xray.lua | 33 +- .../root/usr/share/passwall/app.sh | 20 +- mise/Makefile | 4 +- sing-box/Makefile | 2 +- .../002-support-clash-proxy-providers.patch | 403 - 62 files changed, 16332 insertions(+), 19628 deletions(-) create mode 100644 luci-app-homeproxy/.gitignore create mode 100644 luci-app-homeproxy/root/etc/homeproxy/scripts/fw4_names.sh mode change 100755 => 100644 luci-app-homeproxy/root/etc/homeproxy/scripts/homeproxy.uc create mode 100644 luci-app-homeproxy/root/etc/homeproxy/scripts/parse_uri.uc delete mode 100644 luci-app-homeproxy/root/etc/homeproxy/scripts/update_provider.sh delete mode 100644 luci-app-homeproxy/root/etc/homeproxy/scripts/update_rulesets.sh mode change 100755 => 100644 luci-app-homeproxy/root/etc/uci-defaults/luci-homeproxy mode change 100755 => 100644 luci-app-homeproxy/root/etc/uci-defaults/luci-homeproxy-migration create mode 100644 luci-app-homeproxy/tests/README.md create mode 100644 luci-app-homeproxy/tests/fixtures/generators/client.uci create mode 100644 luci-app-homeproxy/tests/fixtures/generators/custom.uci create mode 100644 luci-app-homeproxy/tests/fixtures/generators/server.uci create mode 100755 luci-app-homeproxy/tests/i18n-coverage.py create mode 100644 luci-app-homeproxy/tests/i18n-ignore.txt create mode 100644 luci-app-homeproxy/tests/luci-form-snapshot.js create mode 100755 luci-app-homeproxy/tests/run.sh create mode 100644 luci-app-homeproxy/tests/snapshots/node.json create mode 100644 luci-app-homeproxy/tests/snapshots/server.json create mode 100644 luci-app-homeproxy/tests/ucode/mocks/homeproxy.uc create mode 100755 luci-app-homeproxy/tests/ucode/run.sh create mode 100644 luci-app-homeproxy/tests/ucode/test_firewall_template.sh create mode 100644 luci-app-homeproxy/tests/ucode/test_fw4_names.sh create mode 100755 luci-app-homeproxy/tests/ucode/test_generators.sh create mode 100644 luci-app-homeproxy/tests/ucode/test_homeproxy_utils.uc create mode 100644 luci-app-homeproxy/tests/ucode/test_homeproxy_utils_inject.uc create mode 100644 luci-app-homeproxy/tests/ucode/test_parse_uri.uc delete mode 100644 sing-box/patches/002-support-clash-proxy-providers.patch diff --git a/luci-app-homeproxy/.gitignore b/luci-app-homeproxy/.gitignore new file mode 100644 index 000000000..135b33915 --- /dev/null +++ b/luci-app-homeproxy/.gitignore @@ -0,0 +1,2 @@ +.DS_Store +/homeproxy diff --git a/luci-app-homeproxy/Makefile b/luci-app-homeproxy/Makefile index 4549d164d..0917cd5d5 100644 --- a/luci-app-homeproxy/Makefile +++ b/luci-app-homeproxy/Makefile @@ -1,31 +1,29 @@ # SPDX-License-Identifier: GPL-2.0-only # # Copyright (C) 2022-2023 ImmortalWrt.org +# include $(TOPDIR)/rules.mk -PKG_NAME:=luci-app-homeproxy -PKG_VERSION:=2.0.0 -PKG_RELEASE:=13 - -LUCI_TITLE:=Sing-box proxy management platform for OpenWrt +LUCI_TITLE:=The modern ImmortalWrt proxy platform for ARM64/AMD64 (sing-box 1.14) +# Pure ucode/JS payload with no compiled code, so the package itself is arch +# independent. The real arch constraint comes from the +sing-box dependency, +# which the feed builds for every architecture Go supports (aarch64, arm, +# mipsel, riscv64, x86_64, ...); where no sing-box package exists, dependency +# resolution refuses the install. Checked against the ImmortalWrt 25.12.1 +# package index (sing-box 1.14.0-r1 published for all of the above). LUCI_PKGARCH:=all LUCI_DEPENDS:= \ +sing-box \ +firewall4 \ - +dnsmasq-full \ - +ip-full \ - +kmod-tun \ +kmod-nft-tproxy \ - +ca-bundle \ - +curl \ - +jsonfilter \ - +unzip \ - +ucode-mod-digest \ - +ucode-mod-fs \ - +ucode-mod-math \ - +ucode-mod-ubus \ - +ucode-mod-uci + +ip-full \ + +kmod-tun \ + +ucode-mod-digest + +PKG_NAME:=luci-app-homeproxy +PKG_VERSION:=27.911.1.14 +PKG_RELEASE:=14 define Package/luci-app-homeproxy/conffiles /etc/config/homeproxy diff --git a/luci-app-homeproxy/README.md b/luci-app-homeproxy/README.md index e1b1f3adf..0a9613559 100644 --- a/luci-app-homeproxy/README.md +++ b/luci-app-homeproxy/README.md @@ -1,68 +1,102 @@ -适用于 OpenWrt 24.10 的 HomeProxy LuCI 管理界面,按 `官方内核sing-box 1.13.13` 进行二次定制适配,在官方内核基础上增加功能: -1、远程规则集本地持久化 -2、Clash API 代理供应商 -3、Clash API 中文名称 +
-## 一、安装 -上传 zip 到 OpenWrt /tmp目录后解压并执行(文件名homeproxy-2.0.1-x86_64.zip自行替换): -```sh -cd /tmp -unzip homeproxy-2.0.1-x86_64.zip -cd homeproxy-2.0.1-x86_64 -sh install.sh -``` +# luci-app-homeproxy -## 二、卸载 -```sh -/etc/init.d/homeproxy stop 2>/dev/null || true -/etc/init.d/homeproxy disable 2>/dev/null || true -opkg remove luci-i18n-homeproxy-zh-cn 2>/dev/null || true -opkg remove luci-app-homeproxy 2>/dev/null || true -rm -rf /etc/config/homeproxy -rm -rf /etc/homeproxy -rm -rf /usr/share/homeproxy -rm -rf /www/luci-static/resources/view/homeproxy -rm -f /www/luci-static/resources/homeproxy.js -rm -f /usr/share/luci/menu.d/luci-app-homeproxy.json -rm -f /usr/share/rpcd/acl.d/luci-app-homeproxy.json -rm -f /usr/share/rpcd/ucode/luci.homeproxy -rm -f /tmp/luci-indexcache -rm -rf /tmp/luci-modulecache/* -/etc/init.d/rpcd restart -/etc/init.d/uhttpd restart -``` +**The modern ImmortalWrt proxy platform for ARM64 / AMD64** -## 三、维护工作流 -- `Rescan-Translation.yml`:代码变更后自动重新扫描并更新翻译文件,也支持手动运行。 -- `Update-Geodata.yml`:每周自动更新内置 geodata 资源,也支持手动运行。 +基于 sing-box 1.14 内核的现代代理平台 — 简洁、高效、开箱即用。 -## 四、常见问题 -1、面版下载失败解决办法 -第一种:面版设置-UI下载地址,下拉选择需要的UI,点击更新面版手动触发面版下载。 -第二种:下载面版ZIP包,手动上传面版ZIP,下载地址如下。 -镜像 -```sh -https://gh-proxy.com/https://github.com/Zephyruso/zashboard/releases/latest/download/dist.zip -``` -或者直连 -```sh -https://github.com/Zephyruso/zashboard/releases/latest/download/dist.zip -``` -2、远程规则集是否下载成功判断 -连接SSH查看/etc/homeproxy/ruleset/目录下是否有规则集文件,有则表示下载成功,反之则没下载成功,检查规则集远程连接。 +--- -3、安装新包后如果页面仍显示旧文字,建议清浏览器缓存,或执行: -```sh -rm -f /tmp/luci-indexcache -rm -rf /tmp/luci-modulecache/* -/etc/init.d/rpcd restart -/etc/init.d/uhttpd restart -``` +
-## 五、感谢作者 -immortalwrt -https://github.com/immortalwrt/homeproxy +## 项目定位 -VIKINGYFY -https://github.com/VIKINGYFY/homeproxy +本项目是 [luci-app-homeproxy](https://github.com/szwjp/homeproxy) 的**分拆版本线**:以 sing-box **1.14** 内核为唯一目标,充分结合 1.14 引入的新特性进行升级,不再兼容 1.13 及更早内核。 +| 版本线 | 内核要求 | 演进方式 | +| --- | --- | --- | +| **homeproxy1.14**(本项目) | sing-box ≥ 1.14 | 1.14 特性驱动,配置生成直接使用 1.14 新格式 | + +## 已融入的 sing-box 1.14 特性 + +| 领域 | 特性 | +| --- | --- | +| DNS | `evaluate` / `match_response` / `race` 响应匹配,乐观缓存与 `store_dns`,统一 `dns.timeout` | +| 规则集 | `initial_path`、多 tag、`http_clients` 下载客户端 | +| 连接 | TUN `dns_mode` / `dns_address`,UDP NAT 参数(`udp_mapping` / `udp_filtering` / `udp_nat_max`) | +| 证书 | `tls.acme` → `certificate_provider`(`key_type` / `profile` / `account_key`) | +| 工程化 | 生成配置内置 `$schema`;运行要求 sing-box ≥ 1.14 | + +## 已修复:国内域名走代理问题(r4 / r6 / r7) + +**背景** + +`bypass_mainland_china` 的数据路由原本只用 `geoip-cn`(按 IP 匹配国内目标)。sing-box 不会把「域名连接」的域名解析成 IP 再去匹配 IP 规则集,因此按域名访问的国内站(如字节、百度等)落到 `main-out` 走了代理,只有「裸 IP 访问国内 IP」才直连。 + +**修复方式** + +数据路由改用 `action: resolve (prefer_ipv4)` + `geoip-cn → direct-out`——先解析域名再做 IP 匹配,由真实 IP 决定国内 / 国外(国内 IP → 直连,其余 → 代理);数据判定不再依赖 `geosite-cn` / `geosite-noncn` 域名规则(`geosite-cn` 仍用于 DNS 路由)。 + +对字节、百度等国内域名,以及苹果等全球跨国企业站点更稳更友好;默认使用公共 DNS(223.5.5.5)作为国内 DNS 以降低污染概率。 + +**可选增强 `cn_ip_fallback`** + +启用后使用 1.14 原生 `evaluate` / `match_response`:对非 `geosite-cn` 域名,若 `main-dns` 返回国内 IP,再回退到 `china-dns` 解析。 + +> 这版块确实很难两全,改来改去也都存在缺憾,就这样不改了,照顾大多数为准。 + +## 新增:规则集自动更新(r5) + +为 `bypass_mainland_china` 的三个远程规则集(`geoip-cn` / `geosite-cn` / `geosite-noncn`)增加 `update_interval: '24h'`,sing-box 每 24 小时自动重新拉取 `.srs`: + +- 热替换,不中断既有连接; +- 下载失败时保留旧规则集,不影响分流。 + +## 新增:Snell 协议与 Hysteria2 增强(r9) + +面向 sing-box 1.14 的一轮收敛:补齐新协议、暴露传输层新参数,并修复 1.14 DNS 迁移的一个行为缺陷。 + +| 领域 | 变更 | +| --- | --- | +| **Snell(1.14 新协议)** | 客户端出站 + 自建服务端 inbound 全支持(v4 / v6、psk、多用户 `userkey`、HTTP 混淆、v6 流量整形);订阅导入 `snell://` | +| **Hysteria2** | 新增 `disable_chrome_parrot`(Ed25519 证书服务器兼容开关)、`bbr_profile`、`hop_interval_max`(跳变间隔随机化)、`gecko` 混淆与 min/max 包长;服务端同步支持 gecko | +| **Hysteria v1** | 移除上游已废弃的 QUIC 流控调参(上游 1.16 将删除),回归 sing-box 默认 | +| **DNS** | 修正 1.14 自动迁移:legacy `ip_cidr` / `ip_is_private` 包装 `evaluate` 时继承原规则查询条件,不再对全部查询预解析 | +| **连接与交互** | TLS `handshake_timeout`;TUN `dns_mode` 缺省(hijack)与平台 DNS 劫持叠加的界面指引;规则集 merged / OR 匹配语义与 `query_type` 兼容性提示 | + +> 设计取舍:Chrome QUIC 指纹(1.14 默认开启)仅在服务器证书为 Ed25519 等握手失败时才需关闭;Snell 采用 sing-box 官方实现(v5 无线协议视同 v4,不支持 v5 QUIC 代理模式)。 + +## 新增:规则分流与 TLS 能力补全(r10) + +补齐 sing-box 1.14 在路由规则与规则集加载侧的剩余能力,并加固一处规则集配置的校验提示。 + +| 领域 | 变更 | +| --- | --- | +| **route `resolve`** | 新增 `disable_optimistic_cache`、`timeout`两个控件,乐观缓存增至四个选项 | +| **route / route-options** | 新增 `tls_spoof` / `tls_spoof_method`(注入伪造 ClientHello 干扰按 SNI 过滤的中间盒,需特权),LuCI 提供 SNI 与方式选择(默认 wrong-sequence) | +| **规则集加载** | 多 tag 时若 `path`/`url`/`initial_path` 缺少 `{tag}` 占位,生成器给出 `warn` 提示,配合 LuCI 表单校验与 sing-box 的硬拒绝(`missing {tag} placeholder`),三层防护避免误配 | +| **i18n** | 补齐新增文案的 zh_Hans 译文 | + +## 工程化加固(r11) + +一轮以可维护性与可验证性为目标的加固:重构不改变行为,测试锁住结果,经实机验证。 + +| 轮次 | 做了什么 | 结果 | +| --- | --- | --- | +| 重构和修复错误 | 重构:前端 TLS/传输表单收敛、generator 共享 TLS/transport 构建、`parse_uri` 拆为 13 个协议函数
测试:协议单测 153 条、generator 回归、LuCI 表单快照
修复:`executeCommand` 清理、dnsmasq 路径告警、fw4 清单单源、启动日志、PEM 校验、`wGET` 失败原因
工程:提高中文翻译率 CI、架构核实 |
parse_uri 对比零差异、generator JSON 逐字节一致、表单快照逐字段一致
顺带修复 3 个既有缺陷:证书上传、fw4 清理回滚、dnsmasq 路径 | + +## 运行要求 + +- ImmortalWrt / OpenWrt ≥ 24.10+(apk 或 opkg 均可安装) +- sing-box ≥ 1.14.0(ImmortalWrt 25.12 源对应 sing-box 1.14.0-r1) +- 低于 1.14 时服务会拒绝启动并记录明确日志 + + + + +
+ +[![License](https://img.shields.io/badge/License-GPL--2.0--only-blue.svg)](LICENSE) 版权归 ImmortalWrt.org 与各贡献者 + +
diff --git a/luci-app-homeproxy/htdocs/luci-static/resources/homeproxy.js b/luci-app-homeproxy/htdocs/luci-static/resources/homeproxy.js index 798b729c6..195f7439e 100644 --- a/luci-app-homeproxy/htdocs/luci-static/resources/homeproxy.js +++ b/luci-app-homeproxy/htdocs/luci-static/resources/homeproxy.js @@ -12,157 +12,21 @@ 'require uci'; 'require ui'; -function pad2(value) { - value = (value == null) ? '' : String(value).trim(); - return value.length === 1 ? '0' + value : value; -} +/* Shared wording for the TLS / transport form blocks. Keeping the strings here + makes node.js and server.js consume a single definition instead of two + copies that have to be edited in lockstep. */ +const TRANSPORT_NONE_HINT = _('No TCP transport, plain HTTP is merged into the HTTP transport.'); +const TRANSPORT_HTTP_HINT = _('TLS is not enforced. If TLS is not configured, plain HTTP 1.1 is used.'); +const TRANSPORT_QUIC_HINT = _('No additional encryption support: It\'s basically duplicate encryption.'); -function normalizeTimePart(value, min, max) { - value = parseInt(String(value || '').trim(), 10); - if (isNaN(value)) - value = min; - value = Math.max(min, Math.min(max, value)); - return pad2(value); -} +const HTTP_IDLE_HEALTH_CHECK_HINT = _('Specifies the period of time (in seconds) after which a health check will be performed using a ping frame if no frames have been received on the connection.
' + + 'Please note that a ping response is considered a received frame, so if there is no other traffic on the connection, the health check will be executed every interval.'); +const HTTP_IDLE_GOAWAY_HINT = _('Specifies the time (in seconds) until idle clients should be closed with a GOAWAY frame. PING frames are not considered as activity.'); +const HTTP_IDLE_KEEPALIVE_HINT = _('If the transport doesn\'t see any activity after a duration of this time (in seconds), it pings the client to check if the connection is still active.'); -function parseCron(value) { - const matched = String(value || '').trim().match(/^(\d{1,2})\s+(\d{1,2})\s+\*\s+\*\s+([0-7*])$/); - if (!matched) - return null; - - const minute = +matched[1], - hour = +matched[2]; - if (minute < 0 || minute > 59 || hour < 0 || hour > 23) - return null; - - return { - minute: normalizeTimePart(matched[1], 0, 59), - hour: normalizeTimePart(matched[2], 0, 23), - day: matched[3] === '*' ? '*' : (matched[3] === '7' ? '0' : matched[3]) - }; -} - -function buildCron(day, hour, minute) { - return [ - normalizeTimePart(minute, 0, 59), - normalizeTimePart(hour, 0, 23), - '*', - '*', - String(day || '*') - ].join(' '); -} - -function alignCronEditorRow(wrap) { - let field = wrap?.parentNode; - - while (field && !field.classList?.contains('cbi-value-field')) - field = field.parentNode; - - let row = field?.parentNode; - while (row && !row.classList?.contains('cbi-value')) - row = row.parentNode; - - if (!row || !field) - return false; - - if (wrap._dailyRow) { - wrap._dailyRow.style.display = row.style.display; - return true; - } - - let dailyRow = E('div', { 'class': 'cbi-value homeproxy-cron-daily-row' }, [ - E('div', { 'class': 'cbi-value-title' }, _('Update time (daily)')), - E('div', { 'class': 'cbi-value-field' }, [ wrap._dailyField ]) - ]); - - wrap._dailyRow = dailyRow; - row.parentNode.insertBefore(dailyRow, row.nextSibling); - - return true; -} - -function watchCronEditorRow(wrap) { - const align = () => alignCronEditorRow(wrap); - [ 0, 50, 200, 500, 1000, 2000 ].forEach(delay => window.setTimeout(align, delay)); - - if (typeof MutationObserver !== 'undefined' && document?.body) { - const observer = new MutationObserver(() => { - if (align()) - observer.disconnect(); - }); - - observer.observe(document.body, { childList: true, subtree: true }); - window.setTimeout(() => observer.disconnect(), 3000); - } -} - -function renderCronEditor(input) { - if (!input) - return null; - - const parsed = parseCron(input.value); - input.type = 'text'; - input.readOnly = true; - input.tabIndex = -1; - input.style.position = 'absolute'; - input.style.opacity = '0'; - input.style.pointerEvents = 'none'; - input.style.width = '1px'; - input.style.height = '1px'; - input.style.minWidth = '1px'; - input.style.maxWidth = '1px'; - input.style.padding = '0'; - input.style.border = '0'; - - let day = E('select', { 'class': 'cbi-input-select', 'style': 'width: 12em !important; min-width: 12em !important; max-width: 12em !important; box-sizing: border-box;' }), - hour = E('select', { 'class': 'cbi-input-select', 'style': 'width: 4.25em !important; min-width: 4.25em !important; max-width: 4.25em !important; box-sizing: border-box;' }), - minute = E('select', { 'class': 'cbi-input-select', 'style': 'width: 4.25em !important; min-width: 4.25em !important; max-width: 4.25em !important; box-sizing: border-box;' }), - dailyField = E('div', { 'style': 'display: flex; align-items: center; gap: .25em; width: 9.5em;' }, [ - hour, - E('span', ':'), - minute - ]), - wrap = E('div', { 'class': 'homeproxy-cron-editor' }, [ day ]); - - wrap._dailyField = dailyField; - - for (let i = 0; i < 24; i++) - hour.appendChild(E('option', { value: pad2(i) }, pad2(i))); - - for (let i = 0; i < 60; i++) - minute.appendChild(E('option', { value: pad2(i) }, pad2(i))); - - [ - ['*', _('Every day')], - ['1', _('Every Monday')], - ['2', _('Every Tuesday')], - ['3', _('Every Wednesday')], - ['4', _('Every Thursday')], - ['5', _('Every Friday')], - ['6', _('Every Saturday')], - ['0', _('Every Sunday')] - ].forEach(([value, label]) => day.appendChild(E('option', { value }, label))); - - day.value = parsed ? parsed.day : '*'; - hour.value = parsed ? parsed.hour : '00'; - minute.value = parsed ? parsed.minute : '00'; - input.value = buildCron(day.value, hour.value, minute.value); - input.setAttribute('value', input.value); - - const sync = () => { - input.value = buildCron(day.value, hour.value, minute.value); - input.setAttribute('value', input.value); - input.dispatchEvent(new Event('input', { bubbles: true })); - input.dispatchEvent(new Event('change', { bubbles: true })); - }; - - day.addEventListener('change', sync); - hour.addEventListener('change', sync); - minute.addEventListener('change', sync); - wrap.appendChild(input); - window.setTimeout(() => watchCronEditorRow(wrap), 0); - return wrap; -} +const HTTP_PING_HEALTH_CHECK_HINT = _('Specifies the timeout duration (in seconds) after sending a PING frame, within which a response must be received.
' + + 'If a response to the PING frame is not received within the specified timeout duration, the connection will be closed.'); +const HTTP_PING_KEEPALIVE_HINT = _('The timeout (in seconds) that after performing a keepalive check, the client will wait for activity. If no activity is detected, the connection will be closed.'); return baseclass.extend({ dns_strategy: { @@ -238,28 +102,225 @@ return baseclass.extend({ } }), - CBIMultiValue: form.MultiValue.extend({ - __name__: 'CBI.HomeProxyMultiValue', + /* Build the transport option group shared by the node (client) and server + forms. `options.side` selects the client/server wording and the handful of + fields that only exist on one side; option names, defaults and dependency + sets are otherwise identical. */ + renderTransportOptions(section, options) { + const features = options.features || {}, + side = options.side || 'client'; + let o; - renderWidget(section_id, _option_index, cfgvalue) { - let value = (cfgvalue != null) ? cfgvalue : this.default, - choices = this.transformChoices() || {}, - widget = new ui.Dropdown(L.toArray(value), choices, { - id: this.cbid(section_id), - sort: this.keylist, - multiple: true, - optional: this.optional || this.rmempty, - select_placeholder: this.placeholder, - create: this.create, - display_items: this.display_size ?? this.size ?? 3, - dropdown_items: this.dropdown_size ?? this.size ?? -1, - validate: this.getValidator(section_id), - disabled: (this.readonly != null) ? this.readonly : this.map.readonly - }); + o = section.option(form.ListValue, 'transport', _('Transport'), TRANSPORT_NONE_HINT); + o.value('', _('None')); + o.value('grpc', _('gRPC')); + o.value('http', _('HTTP')); + o.value('httpupgrade', _('HTTPUpgrade')); + o.value('quic', _('QUIC')); + o.value('ws', _('WebSocket')); + o.depends('type', 'trojan'); + o.depends('type', 'vless'); + o.depends('type', 'vmess'); + o.onchange = function(ev, section_id, value) { + let desc = this.map.findElement('id', 'cbid.homeproxy.%s.transport'.format(section_id)).nextElementSibling; + if (value === 'http') + desc.innerHTML = TRANSPORT_HTTP_HINT; + else if (value === 'quic') + desc.innerHTML = TRANSPORT_QUIC_HINT; + else + desc.innerHTML = TRANSPORT_NONE_HINT; - return widget.render(); + let tls = this.map.findElement('id', 'cbid.homeproxy.%s.tls'.format(section_id)).firstElementChild; + if ((value === 'http' && tls.checked) || (value === 'grpc' && !features.with_grpc)) { + this.map.findElement('id', 'cbid.homeproxy.%s.http_idle_timeout'.format(section_id)).nextElementSibling.innerHTML = + (side === 'server') ? HTTP_IDLE_GOAWAY_HINT : HTTP_IDLE_HEALTH_CHECK_HINT; + + if (side !== 'server') + this.map.findElement('id', 'cbid.homeproxy.%s.http_ping_timeout'.format(section_id)).nextElementSibling.innerHTML = + HTTP_PING_HEALTH_CHECK_HINT; + } else if (value === 'grpc' && features.with_grpc) { + this.map.findElement('id', 'cbid.homeproxy.%s.http_idle_timeout'.format(section_id)).nextElementSibling.innerHTML = + HTTP_IDLE_KEEPALIVE_HINT; + + if (side !== 'server') + this.map.findElement('id', 'cbid.homeproxy.%s.http_ping_timeout'.format(section_id)).nextElementSibling.innerHTML = + HTTP_PING_KEEPALIVE_HINT; + } } - }), + o.modalonly = true; + + o = section.option(form.Value, 'grpc_servicename', _('gRPC service name')); + o.depends('transport', 'grpc'); + o.modalonly = true; + + if (side !== 'server' && features.with_grpc) { + o = section.option(form.Flag, 'grpc_permit_without_stream', _('gRPC permit without stream'), + _('If enabled, the client transport sends keepalive pings even with no active connections.')); + o.depends('transport', 'grpc'); + o.modalonly = true; + } + + o = section.option(form.DynamicList, 'http_host', _('Host')); + o.datatype = 'hostname'; + o.depends('transport', 'http'); + o.modalonly = true; + + o = section.option(form.Value, 'httpupgrade_host', _('Host')); + o.datatype = 'hostname'; + o.depends('transport', 'httpupgrade'); + o.modalonly = true; + + o = section.option(form.Value, 'http_path', _('Path')); + o.depends('transport', 'http'); + o.depends('transport', 'httpupgrade'); + o.modalonly = true; + + o = section.option(form.Value, 'http_method', _('Method')); + if (side !== 'server') { + o.value('GET', _('GET')); + o.value('PUT', _('PUT')); + } + o.depends('transport', 'http'); + o.modalonly = true; + + o = section.option(form.Value, 'http_idle_timeout', _('Idle timeout'), + (side === 'server') ? HTTP_IDLE_GOAWAY_HINT : HTTP_IDLE_HEALTH_CHECK_HINT); + o.datatype = 'uinteger'; + o.depends('transport', 'grpc'); + o.depends({'transport': 'http', 'tls': '1'}); + o.modalonly = true; + + if (side !== 'server' || features.with_grpc) { + o = section.option(form.Value, 'http_ping_timeout', _('Ping timeout'), + (side === 'server') ? HTTP_PING_KEEPALIVE_HINT : HTTP_PING_HEALTH_CHECK_HINT); + o.datatype = 'uinteger'; + o.depends('transport', 'grpc'); + if (side !== 'server') + o.depends({'transport': 'http', 'tls': '1'}); + o.modalonly = true; + } + + o = section.option(form.Value, 'ws_host', _('Host')); + o.depends('transport', 'ws'); + o.modalonly = true; + + o = section.option(form.Value, 'ws_path', _('Path')); + o.depends('transport', 'ws'); + o.modalonly = true; + + o = section.option(form.Value, 'websocket_early_data', _('Early data'), + _('Allowed payload size is in the request.')); + o.datatype = 'uinteger'; + o.value('2048'); + o.depends('transport', 'ws'); + o.modalonly = true; + + o = section.option(form.Value, 'websocket_early_data_header', _('Early data header name'), + (side === 'server') ? (_('Early data is sent in path instead of header by default.') + + '
' + + _('To be compatible with Xray-core, set this to Sec-WebSocket-Protocol.')) : undefined); + o.value('Sec-WebSocket-Protocol'); + o.depends('transport', 'ws'); + o.modalonly = true; + + if (side !== 'server') { + o = section.option(form.ListValue, 'packet_encoding', _('Packet encoding')); + o.value('', _('none')); + o.value('packetaddr', _('packet addr (v2ray-core v5+)')); + o.value('xudp', _('Xudp (Xray-core)')); + o.depends('type', 'vless'); + o.depends('type', 'vmess'); + o.modalonly = true; + } + + return o; + }, + + /* Build the TLS option group shared by the node (client) and server forms. + `options.type_depends` lists the node types the TLS flag applies to, + `options.tls_forced_types` the types that force TLS on, and + `options.oninsecurechange` the client-side confirm handler. */ + renderTlsOptions(section, options) { + const side = options.side || 'client'; + let o; + + o = section.option(form.Flag, 'tls', _('TLS')); + for (let t of (options.type_depends || [])) + o.depends('type', t); + if (side === 'server') + o.rmempty = false; + o.validate = function(section_id, _value) { + if (section_id) { + let type = this.map.lookupOption('type', section_id)[0].formvalue(section_id); + let tls = this.map.findElement('id', 'cbid.homeproxy.%s.tls'.format(section_id)).firstElementChild; + + if ((options.tls_forced_types || []).includes(type)) { + tls.checked = true; + tls.disabled = true; + } else { + tls.disabled = null; + } + } + + return true; + } + o.modalonly = true; + + o = section.option(form.Value, 'tls_sni', _('TLS SNI'), + _('Used to verify the hostname on the returned certificates unless insecure is given.')); + o.depends('tls', '1'); + o.modalonly = true; + + o = section.option(form.DynamicList, 'tls_alpn', _('TLS ALPN'), + _('List of supported application level protocols, in order of preference.')); + o.depends('tls', '1'); + o.modalonly = true; + + if (side !== 'server') { + o = section.option(form.Flag, 'tls_insecure', _('Allow insecure'), + _('Allow insecure connection at TLS client.') + + '
' + + _('This is DANGEROUS, your traffic is almost like PLAIN TEXT! Use at your own risk!')); + o.depends('tls', '1'); + o.onchange = options.oninsecurechange; + o.modalonly = true; + } + + o = section.option(form.ListValue, 'tls_min_version', _('Minimum TLS version'), + _('The minimum TLS version that is acceptable.')); + o.value('', _('default')); + for (let i of this.tls_versions) + o.value(i); + o.depends('tls', '1'); + o.modalonly = true; + + o = section.option(form.ListValue, 'tls_max_version', _('Maximum TLS version'), + _('The maximum TLS version that is acceptable.')); + o.value('', _('default')); + for (let i of this.tls_versions) + o.value(i); + o.depends('tls', '1'); + o.modalonly = true; + + o = section.option(this.CBIStaticList, 'tls_cipher_suites', _('Cipher suites'), + _('The elliptic curves that will be used in an ECDHE handshake, in preference order. If empty, the default will be used.')); + for (let i of this.tls_cipher_suites) + o.value(i); + o.depends('tls', '1'); + o.optional = true; + o.modalonly = true; + + if (side !== 'server') { + o = section.option(form.Value, 'tls_handshake_timeout', _('Handshake timeout (1.14)'), + _('TLS handshake timeout in seconds. 15s is used by default.')); + o.datatype = 'uinteger'; + o.placeholder = '15'; + o.depends('tls', '1'); + o.modalonly = true; + } + + return o; + }, calcStringMD5(e) { /* Thanks to https://stackoverflow.com/a/41602636 */ @@ -360,49 +421,6 @@ return baseclass.extend({ return L.resolveDefault(callGetSingBoxFeatures(), {}); }, - renderCronSelector(/* ... */) { - if (!this._homeproxyCronOriginalFormvalue) { - this._homeproxyCronOriginalFormvalue = this.formvalue; - this.formvalue = function(section_id) { - let cbid = this.cbid(section_id), - ids = [ cbid, 'widget.' + cbid ], - roots = [ document.getElementById('modal_overlay'), document ], - input = null; - - for (let root of roots) { - if (!root) - continue; - - for (let el of root.querySelectorAll('input')) { - if (ids.includes(el.id) || ids.includes(el.name)) { - input = el; - break; - } - } - - if (input) - break; - } - - let value = input?.value || - this._homeproxyCronOriginalFormvalue?.call(this, section_id) || - this.default || - '0 0 * * *'; - - return parseCron(value) ? value : (this.default || '0 0 * * *'); - }; - } - - let node = form.Value.prototype.renderWidget.apply(this, arguments), - editor = renderCronEditor(node.querySelector('input')); - - return editor || node; - }, - - renderCronSelectorRow(/* ... */) { - return form.Value.prototype.render.apply(this, arguments); - }, - generateRand(type, length) { let byteArr; if (['base64', 'hex'].includes(type)) @@ -426,9 +444,6 @@ return baseclass.extend({ }, loadDefaultLabel(uciconfig, ucisection) { - if (!ucisection) - return ''; - let label = uci.get(uciconfig, ucisection, 'label'); if (label) { return label; @@ -439,127 +454,32 @@ return baseclass.extend({ }, loadModalTitle(title, addtitle, uciconfig, ucisection) { - if (!ucisection) - return addtitle; - let label = uci.get(uciconfig, ucisection, 'label'); return label ? title + ' » ' + label : addtitle; }, - normalizeSectionId(label, prefix) { - let section_id = (label || '').trim().replace(/[^A-Za-z0-9_]/g, '_').replace(/^_+|_+$/g, ''); - return (prefix || 'cfg') + '_' + (section_id || 'section'); - }, - renderSectionAdd(section, extra_class) { let el = form.GridSection.prototype.renderSectionAdd.apply(section, [ extra_class ]), - nameEl = el.querySelector('.cbi-section-create-name'), - button = el.querySelector('.cbi-section-create > .cbi-button-add'), - uciconfig = section.uciconfig || section.map.config, - sectiontype = section.sectiontype, - labelEl = E('input', { - 'type': 'text', - 'class': nameEl.className - }), - hintEl = E('div', { 'class': 'cbi-value-description' }); + nameEl = el.querySelector('.cbi-section-create-name'); + ui.addValidator(nameEl, 'uciname', true, (v) => { + let button = el.querySelector('.cbi-section-create > .cbi-button-add'); + let uciconfig = section.uciconfig || section.map.config; - nameEl.style.display = 'none'; - nameEl.parentNode.insertBefore(labelEl, nameEl); - nameEl.parentNode.appendChild(hintEl); - button.disabled = true; - - const syncSectionName = () => { - let label = (labelEl.value || '').trim(); - hintEl.textContent = ''; - - if (!label) { - nameEl.value = ''; + if (!v) { button.disabled = true; - return; - } - - let duplicate = false; - uci.sections(uciconfig, sectiontype, (res) => { - if ((res.label || res['.name']) === label) - duplicate = true; - }); - - if (duplicate) { - nameEl.value = ''; + return true; + } else if (uci.get(uciconfig, v)) { button.disabled = true; - hintEl.textContent = _('Expecting: %s').format(_('unique value')); - return; + return _('Expecting: %s').format(_('unique UCI identifier')); + } else { + button.disabled = null; + return true; } - - let normalized = (label || '').trim().replace(/[^A-Za-z0-9_]/g, '_').replace(/^_+|_+$/g, '') || 'section', - section_id = (sectiontype || 'cfg') + '_' + normalized, - suffix = 1; - while (uci.get(uciconfig, section_id)) - section_id = (sectiontype || 'cfg') + '_' + normalized + '_' + suffix++; - - nameEl.value = section_id; - nameEl.dataset.sectionId = section_id; - nameEl.dataset.sectionLabel = label; - button.disabled = null; - }; - - labelEl.addEventListener('input', syncSectionName); - labelEl.addEventListener('blur', syncSectionName); - - button.addEventListener('click', () => { - syncSectionName(); - - let label = nameEl.dataset.sectionLabel, - section_id = nameEl.dataset.sectionId; - - window.setTimeout(() => { - if (label && section_id && uci.get(uciconfig, section_id)) - uci.set(uciconfig, section_id, 'label', label); - }, 0); - }); + }, 'blur', 'keyup'); return el; }, - installCloseButtonText() { - if (window.__homeproxyCloseButtonText) - return; - - window.__homeproxyCloseButtonText = true; - - let fix = (root) => { - for (let el of (root || document).querySelectorAll('button, .btn, input[type="button"], input[type="submit"]')) { - let text = (el.textContent || el.value || '').trim(); - if (text !== 'Dismiss' && text !== '\u5ffd\u7565') - continue; - - if ('value' in el && !el.textContent.trim()) - el.value = _('Close'); - else - el.textContent = _('Close'); - } - }; - - let observe = () => { - if (!document.body) - return; - - fix(document); - new MutationObserver((mutations) => { - for (let mutation of mutations) - for (let node of mutation.addedNodes) - if (node.nodeType === 1) - fix(node); - fix(document); - }).observe(document.body, { childList: true, subtree: true }); - }; - - if (document.body) - observe(); - else - document.addEventListener('DOMContentLoaded', observe, { once: true }); - }, - uploadCertificate(_option, type, filename, ev) { const callWriteCertificate = rpc.declare({ object: 'luci.homeproxy', @@ -580,44 +500,6 @@ return baseclass.extend({ .catch((e) => { ui.addNotification(null, E('p', e.message)) }); }, - uploadPanel(_option, ev) { - const callInstallPanel = rpc.declare({ - object: 'luci.homeproxy', - method: 'clash_api_install_panel', - expect: { '': {} } - }); - - const normalizeMessage = (message) => { - switch (message) { - case 'panel_backup_failed': - return _('Backup panel failed.'); - case 'panel_restore_failed': - return _('Restore panel failed.'); - case 'empty_panel_zip': - return _('Panel ZIP file is empty.'); - case 'unzip_unavailable': - return _('The unzip command is unavailable.'); - case 'invalid_panel_zip': - return _('Invalid panel ZIP file.'); - case 'panel_install_failed': - return _('Install panel failed.'); - default: - return message || _('unknown error'); - } - }; - - return ui.uploadFile('/tmp/homeproxy_panel.tmp', ev.target) - .then(L.bind((_btn, res) => { - return L.resolveDefault(callInstallPanel(), {}).then((ret) => { - if (ret.result === true) - ui.addNotification(null, E('p', _('Your %s was successfully uploaded. Size: %sB.').format(_('panel ZIP package'), res.size)), 'info'); - else - ui.addNotification(null, E('p', _('Failed to upload %s, error: %s.').format(_('panel ZIP package'), normalizeMessage(ret.error))), 'danger'); - }); - }, this, ev.target)) - .catch((e) => { ui.addNotification(null, E('p', e.message || e), 'danger') }); - }, - validateBase64Key(length, section_id, value) { /* Thanks to luci-proto-wireguard */ if (section_id && value) @@ -644,7 +526,8 @@ return baseclass.extend({ else if (!value[2]) value[2] = 65535; - if (value[1] < value[2] && value[2] <= 65535) + /* numeric comparison: string '<' does lexicographic ordering */ + if (parseInt(value[1], 10) < parseInt(value[2], 10) && value[2] <= 65535) return true; } @@ -658,7 +541,7 @@ return baseclass.extend({ if (section_id) { if (!value) return _('Expecting: %s').format(_('non-empty value')); - if (ucioption === 'node' && (value === 'urltest' || value === 'selector')) + if (ucioption === 'node' && value === 'urltest') return true; let duplicate = false; diff --git a/luci-app-homeproxy/htdocs/luci-static/resources/view/homeproxy/client.js b/luci-app-homeproxy/htdocs/luci-static/resources/view/homeproxy/client.js index 8d9226b0c..a0bd909e3 100644 --- a/luci-app-homeproxy/htdocs/luci-static/resources/view/homeproxy/client.js +++ b/luci-app-homeproxy/htdocs/luci-static/resources/view/homeproxy/client.js @@ -10,7 +10,6 @@ 'require poll'; 'require rpc'; 'require uci'; -'require ui'; 'require validation'; 'require view'; @@ -25,13 +24,6 @@ const callServiceList = rpc.declare({ expect: { '': {} } }); -const callRCInit = rpc.declare({ - object: 'rc', - method: 'init', - params: ['name', 'action'], - expect: { '': {} } -}); - const callReadDomainList = rpc.declare({ object: 'luci.homeproxy', method: 'acllist_read', @@ -46,89 +38,6 @@ const callWriteDomainList = rpc.declare({ expect: { '': {} } }); -const callCurrentNode = rpc.declare({ - object: 'luci.homeproxy', - method: 'current_node_get', - expect: { '': {} } -}); - -const callPackageVersion = rpc.declare({ - object: 'luci.homeproxy', - method: 'package_get_version', - expect: { '': {} } -}); - -const callUpdatePanel = rpc.declare({ - object: 'luci.homeproxy', - method: 'clash_api_update_panel', - expect: { '': {} } -}); - -const statusCss = ` -#homeproxy_status_panel { - margin-bottom: 1rem; -} -#homeproxy_status_panel .homeproxy-status-grid { - display: grid; - grid-template-columns: repeat(3, minmax(0, 1fr)) auto; - gap: 10px; - align-items: center; -} -#homeproxy_status_panel .homeproxy-status-field { - min-width: 0; -} -#homeproxy_status_panel .homeproxy-status-label { - font-weight: 600; - text-align: center; - margin-bottom: 6px; -} -#homeproxy_status_panel input { - width: 100%; - min-width: 0; -} -#homeproxy_status_panel .homeproxy-version-field input { - width: 100%; -} -#homeproxy_status_panel .homeproxy-core-version-field input { - width: 100%; -} -#homeproxy_status_panel .homeproxy-core-status-field input { - width: 100%; - text-align: center; -} -#homeproxy_status_panel .homeproxy-core-status { - border: unset; - font-style: italic; - font-weight: 700; -} -#homeproxy_status_panel .homeproxy-status-actions { - display: flex; - flex-wrap: nowrap; - gap: 6px; - align-items: center; - justify-content: flex-end; - min-width: 0; -} -#homeproxy_status_panel .homeproxy-status-actions .btn { - width: auto; - min-width: 0; - padding-left: 6px; - padding-right: 6px; - white-space: nowrap; -} -@media (max-width: 700px) { - #homeproxy_status_panel .homeproxy-status-grid { - grid-template-columns: 1fr; - } - #homeproxy_status_panel .homeproxy-status-actions { - flex-wrap: wrap; - justify-content: flex-start; - } - #homeproxy_status_panel .homeproxy-status-actions .btn { - flex: 1 1 auto; - } -}`; - function getServiceStatus() { return L.resolveDefault(callServiceList('homeproxy'), {}).then((res) => { let isRunning = false; @@ -139,253 +48,15 @@ function getServiceStatus() { }); } -function updateCoreStatus(isRunning, currentNode) { - let status = document.getElementById('homeproxy_core_status'); - if (!status) - return; +function renderStatus(isRunning, version) { + let spanTemp = '%s (sing-box v%s) %s'; + let renderHTML; + if (isRunning) + renderHTML = spanTemp.format('green', _('HomeProxy'), version, _('RUNNING')); + else + renderHTML = spanTemp.format('red', _('HomeProxy'), version, _('NOT RUNNING')); - status.style.color = isRunning ? 'green' : 'red'; - status.value = currentNode ? _('Running: %s').format(currentNode) : (isRunning ? _('Running') : _('Not Running')); -} - -function parseControllerPort(externalController) { - let value = externalController || '127.0.0.1:9090'; - let idx = value.lastIndexOf(':'); - return (idx >= 0) ? value.substring(idx + 1) : '9090'; -} - -function getClashApiInfo() { - let port = parseControllerPort(uci.get('homeproxy', 'clash_api', 'external_controller')), - secret = uci.get('homeproxy', 'clash_api', 'secret') || ''; - - return { - port, - secret, - baseUrl: 'http://' + window.location.hostname + ':' + port - }; -} - -function updateDashboard() { - return callUpdatePanel().then((res) => { - if (!res?.result) { - let message = res?.error; - if (message === 'update_panel_failed') - message = _('Update panel failed.'); - else if (message === 'clash_api_unavailable') - message = _('Clash API unavailable.'); - else if (message === 'panel_backup_failed') - message = _('Backup panel failed.'); - else if (message === 'panel_restore_failed') - message = _('Restore panel failed.'); - - throw new Error(message || _('Update failed.')); - } - ui.addNotification(null, E('p', _('Successfully updated.')), 'info'); - }).catch((err) => { - ui.addNotification(null, E('p', err.message || err), 'danger'); - }); -} - -function openDashboard() { - let api = getClashApiInfo(); - let query = new URLSearchParams({ - host: window.location.hostname, - hostname: window.location.hostname, - port: api.port, - secret: api.secret - }).toString(); - - window.open(api.baseUrl + '/ui/?' + query, '_blank'); - return Promise.resolve(); -} - -function normalizeRuleSetSectionId(tag) { - return 'ruleset_' + tag.replace(/[^A-Za-z0-9_]/g, '_').replace(/^_+|_+$/g, ''); -} - -function getDnsServerDefaultPort(type) { - switch (type) { - case 'udp': - case 'tcp': - return '53'; - case 'tls': - case 'quic': - return '853'; - case 'https': - case 'h3': - return '443'; - default: - return 'auto'; - } -} - -function getDnsServerAddressPlaceholder(type) { - switch (type) { - case 'https': - case 'h3': - return ''; - case 'tls': - case 'quic': - return 'dns.alidns.com'; - default: - return ''; - } -} - -function validateDnsServerAddress(type, value) { - if (!value) - return false; - - if (value.includes('://')) { - if (!['https', 'h3'].includes(type)) - return false; - - try { - let url = new URL(value); - if (url.protocol !== 'https:') - return false; - - value = url.hostname; - } catch (e) { - return false; - } - } - - return stubValidator.apply('hostname', value) || - stubValidator.apply('ip4addr', value) || - stubValidator.apply('ip6addr', value.match(/^\[(.+)\]$/)?.[1] || value); -} - -function validateDuration(value) { - return !value || /^[1-9]\d*(ms|s|m|h|d)$/.test(value); -} - -function validateUpdateCron(value) { - if (!value) - return true; - - const matched = String(value).trim().match(/^(\d{1,2})\s+(\d{1,2})\s+\*\s+\*\s+([0-7*])$/); - if (!matched) - return false; - - return +matched[1] <= 59 && +matched[2] <= 23; -} - -function translateKnownError(error) { - let name = error?.name || '', - message = error?.message || error || ''; - - if (name === 'TypeError' && String(message).match(/can't convert null to object|Cannot convert undefined or null to object/i)) - return _('Type error') + '\n' + _('Cannot convert null to object.'); - - return null; -} - -function installKnownErrorTranslator() { - if (window.__homeproxyKnownErrorTranslator) - return; - - window.__homeproxyKnownErrorTranslator = true; - - window.addEventListener('error', (ev) => { - let message = translateKnownError(ev.error || ev.message); - if (message) { - ev.preventDefault(); - ui.addNotification(null, E('p', message), 'danger'); - } - }, true); - - window.addEventListener('unhandledrejection', (ev) => { - let message = translateKnownError(ev.reason); - if (message) { - ev.preventDefault(); - ui.addNotification(null, E('p', message), 'danger'); - } - }, true); -} - -function renderRuleSetAdd(section, extra_class) { - let el = form.GridSection.prototype.renderSectionAdd.apply(section, [ extra_class ]), - nameEl = el.querySelector('.cbi-section-create-name'), - button = el.querySelector('.cbi-section-create > .cbi-button-add'), - uciconfig = section.uciconfig || section.map.config; - - let tagEl = E('input', { - 'type': 'text', - 'class': nameEl.className - }); - let hintEl = E('div', { 'class': 'cbi-value-description' }); - - nameEl.style.display = 'none'; - nameEl.parentNode.insertBefore(tagEl, nameEl); - nameEl.parentNode.appendChild(hintEl); - button.disabled = true; - - let syncSectionName = () => { - let tag = (tagEl.value || '').trim(); - hintEl.textContent = ''; - - if (!tag) { - nameEl.value = ''; - button.disabled = true; - return; - } - - if (!tag.match(/^[A-Za-z0-9_.-]+$/)) { - nameEl.value = ''; - button.disabled = true; - hintEl.textContent = _('Expecting: %s').format(_('valid tag')); - return; - } - - let duplicate = false; - uci.sections(uciconfig, 'ruleset', (res) => { - if ((res.tag || ('cfg-' + res['.name'] + '-rule')) === tag) - duplicate = true; - }); - - if (duplicate) { - nameEl.value = ''; - button.disabled = true; - hintEl.textContent = _('Expecting: %s').format(_('unique value')); - return; - } - - let section_id = normalizeRuleSetSectionId(tag), - suffix = 1; - while (uci.get(uciconfig, section_id)) - section_id = normalizeRuleSetSectionId(tag) + '_' + suffix++; - - nameEl.value = section_id; - nameEl.dataset.sectionId = section_id; - nameEl.dataset.ruleSetTag = tag; - button.disabled = null; - }; - - tagEl.addEventListener('input', syncSectionName); - tagEl.addEventListener('blur', syncSectionName); - - button.addEventListener('click', () => { - syncSectionName(); - - let tag = nameEl.dataset.ruleSetTag, - section_id = nameEl.dataset.sectionId; - - window.setTimeout(() => { - if (tag && section_id && uci.get(uciconfig, section_id)) { - uci.set(uciconfig, section_id, 'tag', tag); - uci.set(uciconfig, section_id, 'label', tag); - uci.set(uciconfig, section_id, 'enabled', '1'); - uci.set(uciconfig, section_id, 'type', 'remote'); - uci.set(uciconfig, section_id, 'format', 'binary'); - uci.set(uciconfig, section_id, 'remote_path', '/etc/homeproxy/ruleset/'); - uci.set(uciconfig, section_id, 'auto_update', '1'); - uci.set(uciconfig, section_id, 'update_interval', '0 0 * * *'); - } - }, 0); - }); - - return el; + return renderHTML; } let stubValidator = { @@ -406,29 +77,18 @@ return view.extend({ return Promise.all([ uci.load('homeproxy'), hp.getBuiltinFeatures(), - network.getHostHints(), - L.resolveDefault(callPackageVersion(), {}) + network.getHostHints() ]); }, render(data) { let m, s, o, ss, so; - installKnownErrorTranslator(); - hp.installCloseButtonText(); - let features = data[1], - hosts = data[2]?.hosts, - packageVersion = data[3]?.version || '-', - routingMode = uci.get(data[0], 'config', 'routing_mode'); + hosts = data[2]?.hosts; /* Cache all configured proxy nodes, they will be called multiple times */ let proxy_nodes = {}; - let subscription_groups = {}; - let routing_groups = {}; - let normalizeFormList = function(value) { - return Array.isArray(value) ? value : (value ? [value] : []); - }; uci.sections(data[0], 'node', (res) => { let nodeaddr = ((res.type === 'direct') ? res.override_address : res.address) || '', nodeport = ((res.type === 'direct') ? res.override_port : res.port) || ''; @@ -437,118 +97,21 @@ return view.extend({ String.format('[%s] %s', res.type, res.label || ((stubValidator.apply('ip6addr', nodeaddr) ? String.format('[%s]', nodeaddr) : nodeaddr) + ':' + nodeport)); }); - let subscriptionUrls = normalizeFormList(uci.get(data[0], 'subscription', 'subscription_url')), - subscriptionNames = normalizeFormList(uci.get(data[0], 'subscription', 'subscription_name')); - for (let i = 0; i < subscriptionUrls.length; i++) { - let url = subscriptionUrls[i], - title = String(subscriptionNames[i] || '').trim(); - - if (title) - subscription_groups[hp.calcStringMD5(url.replace(/#.*$/, ''))] = title; - } - uci.sections(data[0], 'routing_node', (res) => { - routing_groups[res['.name']] = res.label || res['.name']; - }); - let collectSelectedRoutingNodes = function(groups, subscription_nodes, selected_nodes, policy_nodes, section_id) { - let nodes = []; - groups = normalizeFormList(groups); - subscription_nodes = normalizeFormList(subscription_nodes); - selected_nodes = normalizeFormList(selected_nodes); - policy_nodes = normalizeFormList(policy_nodes); - - uci.sections(data[0], 'node', (res) => { - if (res.grouphash && groups.includes(res.grouphash) && !nodes.includes(res['.name'])) - nodes.push(res['.name']); - }); - for (let node of subscription_nodes) - if (proxy_nodes[node] && !nodes.includes(node)) - nodes.push(node); - for (let node of selected_nodes) - if (proxy_nodes[node] && !nodes.includes(node)) - nodes.push(node); - for (let node of policy_nodes) - if (node !== section_id && routing_groups[node] && !nodes.includes(node)) - nodes.push(node); - - return nodes; - }; m = new form.Map('homeproxy', _('HomeProxy'), - _('OpenWrt-designed Sing-box proxy management platform. It is recommended to disable Dnsmasq DNS redirection.')); + _('The modern ImmortalWrt proxy platform for ARM64/AMD64.')); s = m.section(form.TypedSection); s.render = function () { poll.add(function () { - return Promise.all([ - L.resolveDefault(getServiceStatus(), false), - L.resolveDefault(callCurrentNode(), null) - ]).then((res) => { - let isRunning = res[0], - current = res[1], - current_label = null; - - if (current?.mode === 'urltest') { - let active = current.active || {}; - let nodeName = (active?.id && active.id !== 'urltest') ? (proxy_nodes[active.id] || active.label || active.id) : _('Invalid node'); - - current_label = _('URLTest: %s').format(nodeName); - } - - updateCoreStatus(isRunning, current_label); - }); + return L.resolveDefault(getServiceStatus()).then((res) => { + let view = document.getElementById('service_status'); + view.innerHTML = renderStatus(res, features.version); }); + }); - let actions = [ - E('button', { - 'class': 'btn cbi-button cbi-button-action', - 'click': ui.createHandlerFn(this, () => callRCInit('homeproxy', 'reload')) - }, [ _('Reload Service') ]), - E('button', { - 'class': 'btn cbi-button cbi-button-negative', - 'click': ui.createHandlerFn(this, () => callRCInit('homeproxy', 'restart')) - }, [ _('Restart Service') ]) - ]; - - if (routingMode === 'custom') { - actions.push( - E('button', { - 'class': 'btn cbi-button cbi-button-positive', - 'click': ui.createHandlerFn(this, updateDashboard) - }, [ _('Update Panel') ]), - E('button', { - 'class': 'btn cbi-button cbi-button-action', - 'click': ui.createHandlerFn(this, (ev) => hp.uploadPanel(null, ev)) - }, [ _('Upload Panel ZIP') ]), - E('button', { - 'class': 'btn cbi-button cbi-button-action', - 'click': ui.createHandlerFn(this, openDashboard) - }, [ _('Open Panel') ]) - ); - } - - return E('div', { class: 'cbi-section', id: 'homeproxy_status_panel' }, [ - E('style', [ statusCss ]), - E('h3', _('Status')), - E('div', { class: 'homeproxy-status-grid' }, [ - E('div', { class: 'homeproxy-status-field homeproxy-version-field' }, [ - E('div', { class: 'homeproxy-status-label' }, _('Plugin Version')), - E('input', { class: 'cbi-input-text', readonly: '', value: packageVersion }) - ]), - E('div', { class: 'homeproxy-status-field homeproxy-core-version-field' }, [ - E('div', { class: 'homeproxy-status-label' }, _('Core Version')), - E('input', { class: 'cbi-input-text', readonly: '', value: features.version || '-' }) - ]), - E('div', { class: 'homeproxy-status-field homeproxy-core-status-field' }, [ - E('div', { class: 'homeproxy-status-label' }, _('Core Status')), - E('input', { - id: 'homeproxy_core_status', - class: 'cbi-input-text homeproxy-core-status', - readonly: '', - value: _('Collecting data...') - }) - ]), - E('div', { class: 'homeproxy-status-actions' }, actions) - ]) + return E('div', { class: 'cbi-section', id: 'status_bar' }, [ + E('p', { id: 'service_status' }, _('Collecting data...')) ]); } @@ -590,7 +153,7 @@ return view.extend({ o.value('urltest', _('URLTest')); for (let i in proxy_nodes) o.value(i, proxy_nodes[i]); - o.default = 'same'; + o.default = 'nil'; o.depends({'routing_mode': /^((?!custom).)+$/, 'proxy_mode': /^((?!redirect$).)+$/}); o.rmempty = false; @@ -616,13 +179,14 @@ return view.extend({ o = s.taboption('routing', form.Value, 'dns_server', _('DNS server'), _('Support UDP, TCP, DoH, DoQ, DoT. TCP protocol will be used if not specified.')); o.value('wan', _('WAN DNS (read from interface)')); - o.value('https://dns.cloudflare.com/dns-query', _('CloudFlare Public DNS (DoH)')); - o.value('https://dns.google/dns-query', _('Google Public DNS (DoH)')); - o.value('https://dns.quad9.net/dns-query', _('Quad9 Public DNS (DoH)')); - o.value('https://dns.adguard-dns.com/dns-query', _('AdGuard Public DNS (DoH)')); - o.value('https://dns.sb/dns-query', _('DNS.SB Public DNS (DoH)')); - o.value('https://dns.opendns.com/dns-query', _('Cisco Public DNS (DoH)')); - o.default = 'https://dns.quad9.net/dns-query'; + o.value('1.1.1.1', _('CloudFlare Public DNS (1.1.1.1)')); + o.value('208.67.222.222', _('Cisco Public DNS (208.67.222.222)')); + o.value('8.8.8.8', _('Google Public DNS (8.8.8.8)')); + o.value('', '---'); + o.value('223.5.5.5', _('Aliyun Public DNS (223.5.5.5)')); + o.value('119.29.29.29', _('Tencent Public DNS (119.29.29.29)')); + o.value('117.50.10.10', _('ThreatBook Public DNS (117.50.10.10)')); + o.default = '8.8.8.8'; o.rmempty = false; o.depends({'routing_mode': 'custom', '!reverse': true}); o.validate = function(section_id, value) { @@ -653,11 +217,12 @@ return view.extend({ o = s.taboption('routing', form.Value, 'china_dns_server', _('China DNS server'), _('The dns server for resolving China domains. Support UDP, TCP, DoH, DoQ, DoT.')); o.value('wan', _('WAN DNS (read from interface)')); - o.value('https://doh-pure.onedns.net/dns-query', _('ThreatBook Public DNS (DoH)')); - o.value('https://doh.pub/dns-query', _('Tencent Public DNS (DoH)')); - o.value('https://dns.alidns.com/dns-query', _('AliYun Public DNS (DoH)')); + o.value('223.5.5.5', _('Aliyun Public DNS (223.5.5.5)')); + o.value('210.2.4.8', _('CNNIC Public DNS (210.2.4.8)')); + o.value('119.29.29.29', _('Tencent Public DNS (119.29.29.29)')); + o.value('117.50.10.10', _('ThreatBook Public DNS (117.50.10.10)')); o.depends('routing_mode', 'bypass_mainland_china'); - o.default = 'https://dns.alidns.com/dns-query'; + o.default = '223.5.5.5'; o.rmempty = false; o.validate = function(section_id, value) { if (section_id && !['wan'].includes(value)) { @@ -733,6 +298,55 @@ return view.extend({ o.default = o.enabled; o.rmempty = false; + o = s.taboption('routing', form.Flag, 'cn_ip_fallback', _('CN-IP DNS fallback (sing-box 1.14)'), + _('When the main DNS returns a mainland China IP, re-resolve via China DNS using evaluate/match_response.')); + o.depends('routing_mode', 'bypass_mainland_china'); + o.rmempty = false; + + o = s.taboption('routing', form.ListValue, 'tun_dns_mode', _('TUN DNS mode (1.14)'), + _('Since sing-box 1.14 the default (Unset) behaves as hijack: sing-box sets the platform interface DNS and hijacks port 53. On OpenWrt this overlaps with the own dnsmasq/nftables DNS hijack of this plugin, so keep Disabled on a gateway unless you need sing-box to own TUN DNS.')); + o.value('default', _('Unset (default)')); + o.value('disabled', _('Disabled')); + o.value('native', _('Native')); + o.value('hijack', _('Hijack')); + o.depends('proxy_mode', 'redirect_tun'); + o.depends('proxy_mode', 'tun'); + o.default = 'default'; + o.rmempty = true; + + o = s.taboption('routing', form.DynamicList, 'tun_dns_address', _('TUN DNS addresses (1.14)')); + o.datatype = 'ipaddr'; + o.depends({'proxy_mode': /^((?!custom).)+$/, 'tun_dns_mode': /^(disabled|native|hijack)$/}); + o.modalonly = true; + + o = s.taboption('routing', form.ListValue, 'udp_mapping', _('UDP NAT mapping (1.14)')); + o.value('endpoint_independent', _('Endpoint independent')); + o.value('address_dependent', _('Address dependent')); + o.value('address_and_port_dependent', _('Address and port dependent')); + o.description = _('sing-box default; recommended for home use (small NAT table, QUIC/game friendly). Choose stricter only for specific UDP issues.'); + o.depends('proxy_mode', 'redirect_tproxy'); + o.depends('proxy_mode', 'redirect_tun'); + o.depends('proxy_mode', 'tun'); + o.default = 'endpoint_independent'; + o.rmempty = false; + + o = s.taboption('routing', form.ListValue, 'udp_filtering', _('UDP NAT filtering (1.14)')); + o.value('endpoint_independent', _('Endpoint independent')); + o.value('address_dependent', _('Address dependent')); + o.value('address_and_port_dependent', _('Address and port dependent')); + o.description = _('sing-box default; recommended for home use (accepts replies from any remote after mapping). Choose stricter only for specific UDP issues.'); + o.depends('proxy_mode', 'redirect_tproxy'); + o.depends('proxy_mode', 'redirect_tun'); + o.depends('proxy_mode', 'tun'); + o.default = 'endpoint_independent'; + o.rmempty = false; + + o = s.taboption('routing', form.Value, 'udp_nat_max', _('UDP NAT sessions max (1.14)')); + o.datatype = 'uinteger'; + o.depends('proxy_mode', 'redirect_tproxy'); + o.depends('proxy_mode', 'redirect_tun'); + o.depends('proxy_mode', 'tun'); + /* Custom routing settings start */ /* Routing settings start */ o = s.taboption('routing', form.SectionValue, '_routing', form.NamedSection, 'routing', 'homeproxy'); @@ -760,6 +374,13 @@ return view.extend({ desc.innerHTML = _('Less compatibility and sometimes better performance.'); } + so = ss.option(form.Flag, 'endpoint_independent_nat', _('Enable endpoint-independent NAT'), + _('Performance may degrade slightly, so it is not recommended to enable on when it is not needed.')); + so.default = so.enabled; + so.depends('tcpip_stack', 'mixed'); + so.depends('tcpip_stack', 'gvisor'); + so.rmempty = false; + so = ss.option(form.Value, 'udp_timeout', _('UDP NAT expiration time'), _('In seconds.')); so.datatype = 'uinteger'; @@ -772,17 +393,16 @@ return view.extend({ _('Bypass mainland China traffic via firewall rules by default.')); so.rmempty = false; + so = ss.option(form.Flag, 'find_neighbor', _('Find neighbor hosts'), + _('Enable neighbor resolution so rules can match LAN devices by hostname (1.14).')); + so.rmempty = false; + so = ss.option(form.ListValue, 'domain_strategy', _('Domain strategy'), _('If set, the requested domain name will be resolved to IP before routing.')); for (let i in hp.dns_strategy) so.value(i, hp.dns_strategy[i]); - so = ss.option(form.Flag, 'sniff_override', _('Override destination'), - _('Override the connection destination address with the sniffed domain.')); - so.default = so.enabled; - so.rmempty = false; - - so = ss.option(form.ListValue, 'default_outbound', _('Default outbound (fallback)'), + so = ss.option(form.ListValue, 'default_outbound', _('Default outbound'), _('Default outbound for connections not matched by any routing rules.')); so.load = function(section_id) { delete this.keylist; @@ -846,50 +466,11 @@ return view.extend({ so = ss.option(form.ListValue, 'node', _('Node'), _('Outbound node')); - so.value('urltest', _('Auto select')); - so.value('selector', _('Manual select')); + so.value('urltest', _('URLTest')); for (let i in proxy_nodes) so.value(i, proxy_nodes[i]); - so.default = 'selector'; - so.rmempty = false; - so.formvalue = function(section_id) { - let widget = this.getUIElement(section_id), - cbid = this.cbid(section_id), - overlay = document.getElementById('modal_overlay'), - input = null; - - if (overlay) - for (let el of overlay.querySelectorAll('input, select')) - if (el.id === cbid || el.name === cbid) { - input = el; - break; - } - - return widget?.getValue() || - input?.value || - uci.get(data[0], section_id, 'node') || - this.default || - 'selector'; - } - so.validate = function(section_id, value) { - value = value || this.formvalue(section_id); - - let result = hp.validateUniqueValue(data[0], 'routing_node', 'node', section_id, value); - if (result !== true) - return result; - - if (section_id && (value === 'urltest' || value === 'selector')) { - let groups = normalizeFormList(this.section.formvalue(section_id, 'subscription_groups')), - subscription_nodes = normalizeFormList(this.section.formvalue(section_id, 'subscription_nodes')), - selected = normalizeFormList(this.section.formvalue(section_id, 'selected_nodes')), - policy_nodes = normalizeFormList(this.section.formvalue(section_id, 'policy_nodes')); - - if (!groups.length && !subscription_nodes.length && !selected.length && !policy_nodes.length) - return _('Expecting: %s').format(_('non-empty value')); - } - - return true; - } + so.validate = L.bind(hp.validateUniqueValue, this, data[0], 'routing_node', 'node'); + so.editable = true; so = ss.option(form.ListValue, 'domain_resolver', _('Domain resolver'), _('For resolving domain name in the server address.')); @@ -907,21 +488,21 @@ return view.extend({ return this.super('load', section_id); } - so.depends('node', /^((?!(urltest|selector)$).)+$/); + so.depends({'node': 'urltest', '!reverse': true}); so.modalonly = true; so = ss.option(form.ListValue, 'domain_strategy', _('Domain strategy'), _('The domain strategy for resolving the domain name in the address.')); for (let i in hp.dns_strategy) so.value(i, hp.dns_strategy[i]); - so.depends('node', /^((?!(urltest|selector)$).)+$/); + so.depends({'node': 'urltest', '!reverse': true}); so.modalonly = true; so = ss.option(widgets.DeviceSelect, 'bind_interface', _('Bind interface'), _('The network interface to bind to.')); so.multiple = false; so.noaliases = true; - so.depends({'outbound': '', 'node': /^((?!(urltest|selector)$).)+$/}); + so.depends({'outbound': '', 'node': /^((?!urltest$).)+$/}); so.modalonly = true; so = ss.option(form.ListValue, 'outbound', _('Outbound'), @@ -947,15 +528,7 @@ return view.extend({ if (res['.name'] !== section_id) { if (res.outbound === section_id && res['.name'] == value) conflict = true; - else if (res.node === 'urltest' && normalizeFormList(res.urltest_nodes).includes(node) && res['.name'] == value) - conflict = true; - else if (res.node === 'urltest' && normalizeFormList(res.subscription_nodes).includes(node) && res['.name'] == value) - conflict = true; - else if (res.node === 'urltest' && normalizeFormList(res.selected_nodes).includes(node) && res['.name'] == value) - conflict = true; - else if (res.node === 'selector' && normalizeFormList(res.selected_nodes).includes(node) && res['.name'] == value) - conflict = true; - else if (res.node === 'selector' && normalizeFormList(res.subscription_nodes).includes(node) && res['.name'] == value) + else if (res.node === 'urltest' && res.urltest_nodes?.includes(node) && res['.name'] == value) conflict = true; } }); @@ -965,97 +538,21 @@ return view.extend({ return true; } - so.depends('node', /^((?!(urltest|selector)$).)+$/); + so.depends({'node': 'urltest', '!reverse': true}); so.editable = true; - so = ss.option(hp.CBIMultiValue, 'subscription_groups', _('Subscriptions')); - for (let hash in subscription_groups) - so.value(hash, subscription_groups[hash]); + so = ss.option(hp.CBIStaticList, 'urltest_nodes', _('URLTest nodes'), + _('List of nodes to test.')); + for (let i in proxy_nodes) + so.value(i, proxy_nodes[i]); so.depends('node', 'urltest'); - so.depends('node', 'selector'); - so.rmempty = true; - so.modalonly = true; - - so = ss.option(hp.CBIMultiValue, 'subscription_nodes', _('Subscription nodes'), - _('List of nodes from subscriptions.')); - uci.sections(data[0], 'node', (res) => { - if (res.grouphash) - so.value(res['.name'], proxy_nodes[res['.name']]); - }); - so.depends('node', 'urltest'); - so.depends('node', 'selector'); - so.rmempty = true; - so.modalonly = true; - - so = ss.option(hp.CBIMultiValue, 'selected_nodes', _('Custom nodes')); - uci.sections(data[0], 'node', (res) => { - if (!res.grouphash) - so.value(res['.name'], proxy_nodes[res['.name']]); - }); - so.depends('node', 'urltest'); - so.depends('node', 'selector'); - so.rmempty = true; - so.modalonly = true; - - so = ss.option(hp.CBIMultiValue, 'policy_nodes', _('Policy nodes'), - _('List of policy groups.')); - so.load = function(section_id) { - delete this.keylist; - delete this.vallist; - - uci.sections(data[0], 'routing_node', (res) => { - if (res['.name'] !== section_id && res.enabled === '1' && ['urltest', 'selector'].includes(res.node)) - this.value(res['.name'], res.label || res['.name']); - }); - - return this.super('load', section_id); - } - so.validate = function(section_id, value) { - if (normalizeFormList(value).includes(section_id)) - return _('Recursive outbound detected!'); + so.validate = function(section_id) { + let value = this.section.formvalue(section_id, 'urltest_nodes'); + if (section_id && !value.length) + return _('Expecting: %s').format(_('non-empty value')); return true; } - so.depends('node', 'selector'); - so.rmempty = true; - so.modalonly = true; - - so = ss.option(form.ListValue, 'selector_default', _('Default node')); - so.load = function(section_id) { - delete this.keylist; - delete this.vallist; - - let groups = normalizeFormList(this.section.formvalue(section_id, 'subscription_groups')), - subscription_nodes = normalizeFormList(this.section.formvalue(section_id, 'subscription_nodes')), - selected = normalizeFormList(this.section.formvalue(section_id, 'selected_nodes')), - policy_nodes = normalizeFormList(this.section.formvalue(section_id, 'policy_nodes')); - - this.value('', _('Default')); - for (let node of collectSelectedRoutingNodes(groups, subscription_nodes, selected, policy_nodes, section_id)) - this.value(node, proxy_nodes[node] || routing_groups[node]); - - return this.super('load', section_id); - } - so.validate = function(section_id, value) { - if (!value) - return true; - - let groups = normalizeFormList(this.section.formvalue(section_id, 'subscription_groups')), - subscription_nodes = normalizeFormList(this.section.formvalue(section_id, 'subscription_nodes')), - selected = normalizeFormList(this.section.formvalue(section_id, 'selected_nodes')), - policy_nodes = normalizeFormList(this.section.formvalue(section_id, 'policy_nodes')); - - if (!collectSelectedRoutingNodes(groups, subscription_nodes, selected, policy_nodes, section_id).includes(value)) - return _('Invalid node'); - - return true; - } - so.depends('node', 'selector'); - so.modalonly = true; - - so = ss.option(form.Flag, 'selector_interrupt_exist_connections', _('Interrupt existing connections'), - _('Interrupt existing connections when the selected outbound has changed.')); - so.depends('node', 'selector'); so.modalonly = true; so = ss.option(form.Value, 'urltest_url', _('Test URL'), @@ -1084,7 +581,7 @@ return view.extend({ so.placeholder = '180'; so.validate = function(section_id, value) { if (section_id && value) { - let idle_timeout = this.section.formvalue(section_id, 'idle_timeout') || '1800'; + let idle_timeout = this.section.formvalue(section_id, 'urltest_idle_timeout') || '1800'; if (parseInt(value) > parseInt(idle_timeout)) return _('Test interval must be less or equal than idle timeout.'); } @@ -1144,7 +641,13 @@ return view.extend({ so.editable = true; so = ss.taboption('field_other', form.ListValue, 'mode', _('Mode'), - _('In default mode, rule fields are matched by category. Any condition in the same category can match, while different categories must match at the same time. Rule sets are merged into the rule for matching and are not treated as separate sub-rules.')); + _('The default rule uses the following matching logic:
' + + '(domain || domain_suffix || domain_keyword || domain_regex || ip_cidr || ip_is_private) &&
' + + '(port || port_range) &&
' + + '(source_ip_cidr || source_ip_is_private) &&
' + + '(source_port || source_port_range) &&
' + + 'other fields.
' + + 'Additionally, included rule sets can be considered merged rather than as a single rule sub-item.')); so.value('default', _('Default')); so.default = 'default'; so.rmempty = false; @@ -1189,14 +692,14 @@ return view.extend({ so.modalonly = true; so = ss.taboption('field_other', hp.CBIStaticList, 'rule_set', _('Rule set'), - _('Match rule set.')); + _('Match rule set. Since 1.14: a rule-set holding a single default rule is merged into this rule; any other rule-set matches as an OR collection.')); so.load = function(section_id) { delete this.keylist; delete this.vallist; uci.sections(data[0], 'ruleset', (res) => { if (res.enabled === '1') - this.value(res['.name'], res.tag || res.label); + this.value(res['.name'], res.label); }); return this.super('load', section_id); @@ -1291,6 +794,25 @@ return view.extend({ so.depends('tls_fragment', '1'); so.modalonly = true; + so = ss.taboption('field_other', form.Value, 'tls_spoof', _('TLS spoof SNI (1.14)'), + _('Inject a forged TLS ClientHello carrying this SNI before the real one to fool SNI-filtering middleboxes. Requires elevated privileges.')); + so.datatype = 'hostname'; + so.depends('action', 'route'); + so.depends('action', 'route-options'); + so.modalonly = true; + + so = ss.taboption('field_other', form.ListValue, 'tls_spoof_method', _('TLS spoof method (1.14)'), + _('How the forged segment is rejected by the real server.')); + so.value('', _('wrong-sequence (default)')); + so.value('wrong-checksum', _('wrong-checksum')); + so.value('wrong-ack', _('wrong-ack')); + so.value('wrong-md5', _('wrong-md5')); + so.value('wrong-timestamp', _('wrong-timestamp')); + so.depends('action', 'route'); + so.depends('action', 'route-options'); + so.depends('tls_spoof', /[\s\S]/); + so.modalonly = true; + so = ss.taboption('field_other', form.ListValue, 'resolve_server', _('DNS server'), _('Specifies DNS server tag to use instead of selecting through DNS routing.')); so.load = function(section_id) { @@ -1329,8 +851,8 @@ return view.extend({ so.depends('action', 'resolve'); so.modalonly = true; - so = ss.taboption('field_other', form.Flag, 'resolve_disable_cache', _('Disable DNS memory cache'), - _('Disable DNS memory cache in this query.')); + so = ss.taboption('field_other', form.Flag, 'resolve_disable_cache', _('Disable DNS cache'), + _('Disable DNS cache in this query.')); so.depends('action', 'resolve'); so.modalonly = true; @@ -1347,6 +869,17 @@ return view.extend({ so.depends('action', 'resolve'); so.modalonly = true; + so = ss.taboption('field_other', form.Flag, 'resolve_disable_optimistic_cache', _('Disable optimistic cache'), + _('Disable optimistic DNS caching in this lookup (1.14).')); + so.depends('action', 'resolve'); + so.modalonly = true; + + so = ss.taboption('field_other', form.Value, 'resolve_timeout', _('Query timeout'), + _('Override dns.timeout for this lookup, in seconds (1.14).')); + so.datatype = 'uinteger'; + so.depends('action', 'resolve'); + so.modalonly = true; + so = ss.taboption('field_host', form.DynamicList, 'domain', _('Domain name'), _('Match full domain.')); so.datatype = 'hostname'; @@ -1380,6 +913,15 @@ return view.extend({ so = ss.taboption('field_host', form.Flag, 'ip_is_private', _('Match private IP')); so.modalonly = true; + so = ss.taboption('field_host', form.DynamicList, 'source_mac_address', _('Source MAC address'), + _('Match LAN device by MAC address.')); + so.datatype = 'macaddr'; + so.modalonly = true; + + so = ss.taboption('field_host', form.DynamicList, 'source_hostname', _('Source hostname'), + _('Match LAN device hostname via neighbor resolution; enable find_neighbor.')); + so.modalonly = true; + so = ss.taboption('field_port', form.DynamicList, 'source_port', _('Source port'), _('Match source port.')); so.datatype = 'port'; @@ -1424,8 +966,7 @@ return view.extend({ for (let i in hp.dns_strategy) so.value(i, hp.dns_strategy[i]); - so = ss.option(form.ListValue, 'default_server', _('Default DNS server'), - _('Daily domain name resolution for clients. Choose an overseas DNS if DNS leak protection is required.')); + so = ss.option(form.ListValue, 'default_server', _('Default DNS server')); so.load = function(section_id) { delete this.keylist; delete this.vallist; @@ -1442,13 +983,9 @@ return view.extend({ so.default = 'default-dns'; so.rmempty = false; - so = ss.option(form.Flag, 'disable_cache', _('Disable DNS memory cache')); + so = ss.option(form.Flag, 'disable_cache', _('Disable DNS cache')); - so = ss.option(form.Flag, 'disable_cache_expire', _('Disable DNS memory cache expiration')); - so.depends('disable_cache', '0'); - - so = ss.option(form.Flag, 'independent_cache', _('Independent DNS memory cache per server'), - _('Make each DNS server\'s memory cache independent for special purposes. If enabled, will slightly degrade performance.')); + so = ss.option(form.Flag, 'disable_cache_expire', _('Disable cache expire')); so.depends('disable_cache', '0'); so = ss.option(form.Value, 'client_subnet', _('EDNS Client subnet'), @@ -1456,6 +993,23 @@ return view.extend({ 'If value is an IP address instead of prefix, /32 or /128 will be appended automatically.')); so.datatype = 'or(cidr, ipaddr)'; + so = ss.option(form.Flag, 'optimistic_cache', _('Optimistic DNS cache'), + _('Return expired cache immediately and refresh in background (sing-box 1.14).')); + so.depends('disable_cache', '0'); + so.depends('disable_cache_expire', '0'); + so.rmempty = false; + + so = ss.option(form.Value, 'optimistic_timeout', _('Optimistic cache timeout'), + _('Max time an expired entry may be served. Examples: 3d, 1h.')); + + so = ss.option(form.Value, 'dns_timeout', _('DNS query timeout'), + _('Default timeout per DNS query in seconds (sing-box default: 10).')); + so.datatype = 'uinteger'; + + so = ss.option(form.Flag, 'cache_file_store_dns', _('Store DNS cache'), + _('Persist DNS cache across restarts (sing-box 1.14, replaces Store RDRC).')); + so.depends('disable_cache', '0'); + so.rmempty = false; /* DNS settings end */ /* DNS servers start */ @@ -1493,72 +1047,21 @@ return view.extend({ so.rmempty = false; so = ss.option(form.Value, 'server', _('Address'), - _('Full URL, e.g. https://dns.alidns.com/dns-query')); - so.placeholder = ''; - so.validate = function(section_id, value) { - let type = this.section.formvalue(section_id, 'type') || - uci.get(data[0], section_id, 'type') || - 'udp'; - - if (!validateDnsServerAddress(type, value)) - return _('Expecting: %s').format(_('valid DNS server address')); - - return true; - } - so.renderWidget = function(section_id, option_index, cfgvalue) { - let node = form.Value.prototype.renderWidget.apply(this, arguments), - input = node.querySelector('input'), - update = () => { - let type = this.section.formvalue(section_id, 'type') || - uci.get(data[0], section_id, 'type') || - 'udp'; - if (input) - input.placeholder = getDnsServerAddressPlaceholder(type); - }; - - update(); - requestAnimationFrame(() => { - let type_input = document.getElementById(this.cbid(section_id).replace(/\.server$/, '.type')); - if (type_input) { - type_input.addEventListener('change', update); - update(); - } - }); - - return node; - } + _('The address of the dns server.')); + so.datatype = 'or(hostname, ipaddr)'; so.rmempty = false; so = ss.option(form.Value, 'server_port', _('Port'), - _('Leave empty to use the default port.')); - so.placeholder = '53'; + _('The port of the DNS server.')); + so.placeholder = 'auto'; so.datatype = 'port'; - so.renderWidget = function(section_id, option_index, cfgvalue) { - let node = form.Value.prototype.renderWidget.apply(this, arguments), - input = node.querySelector('input'), - update = () => { - let type = this.section.formvalue(section_id, 'type') || - uci.get(data[0], section_id, 'type') || - 'udp'; - if (input) - input.placeholder = getDnsServerDefaultPort(type); - }; - update(); - requestAnimationFrame(() => { - let type_input = document.getElementById(this.cbid(section_id).replace(/\.server_port$/, '.type')); - if (type_input) { - type_input.addEventListener('change', update); - update(); - } - }); - - return node; - } - so.depends('type', 'udp'); - so.depends('type', 'tcp'); - so.depends('type', 'tls'); - so.depends('type', 'quic'); + so = ss.option(form.Value, 'path', _('Path'), + _('The path of the DNS server.')); + so.placeholder = '/dns-query'; + so.depends('type', 'https'); + so.depends('type', 'h3'); + so.modalonly = true; so = ss.option(form.DynamicList, 'headers', _('Headers'), _('Additional headers to be sent to the DNS server.')); @@ -1575,7 +1078,7 @@ return view.extend({ so.modalonly = true; so = ss.option(form.ListValue, 'address_resolver', _('Address resolver'), - _('Used to resolve DNS server addresses in domain form. IP addresses do not require it.')); + _('Tag of a another server to resolve the domain name in the address. Required if address contains domain.')); so.load = function(section_id) { delete this.keylist; delete this.vallist; @@ -1662,7 +1165,13 @@ return view.extend({ so.editable = true; so = ss.taboption('field_other', form.ListValue, 'mode', _('Mode'), - _('In default mode, rule fields are matched by category. Any condition in the same category can match, while different categories must match at the same time. Rule sets are merged into the rule for matching and are not treated as separate sub-rules.')); + _('The default rule uses the following matching logic:
' + + '(domain || domain_suffix || domain_keyword || domain_regex) &&
' + + '(port || port_range) &&
' + + '(source_ip_cidr || source_ip_is_private) &&
' + + '(source_port || source_port_range) &&
' + + 'other fields.
' + + 'Additionally, included rule sets can be considered merged rather than as a single rule sub-item.')); so.value('default', _('Default')); so.default = 'default'; so.rmempty = false; @@ -1700,14 +1209,14 @@ return view.extend({ so.modalonly = true; so = ss.taboption('field_other', hp.CBIStaticList, 'rule_set', _('Rule set'), - _('Match rule set.')); + _('Match rule set. DNS: rules referencing rule-sets that contain query_type are incompatible with legacy address filters (ip_cidr / ip_is_private) — use match_response instead (1.14).')); so.load = function(section_id) { delete this.keylist; delete this.vallist; uci.sections(data[0], 'ruleset', (res) => { if (res.enabled === '1') - this.value(res['.name'], res.tag || res.label); + this.value(res['.name'], res.label); }); return this.super('load', section_id); @@ -1718,10 +1227,6 @@ return view.extend({ _('Make IP CIDR in rule sets match the source IP.')); so.modalonly = true; - so = ss.taboption('field_other', form.Flag, 'rule_set_ip_cidr_accept_empty', _('Accept empty query response'), - _('Make IP CIDR in rule-sets accept empty query response.')); - so.modalonly = true; - so = ss.taboption('field_other', form.Flag, 'invert', _('Invert'), _('Invert match result.')); so.modalonly = true; @@ -1731,6 +1236,7 @@ return view.extend({ so.value('route-options', _('Route options')); so.value('reject', _('Reject')); so.value('predefined', _('Predefined')); + so.value('evaluate', _('Evaluate (1.14)')); so.default = 'route'; so.rmempty = false; so.editable = true; @@ -1753,16 +1259,10 @@ return view.extend({ so.rmempty = false; so.editable = true; so.depends('action', 'route'); + so.depends('action', 'evaluate'); - so = ss.taboption('field_other', form.ListValue, 'domain_strategy', _('Domain strategy'), - _('Set domain strategy for this query.')); - for (let i in hp.dns_strategy) - so.value(i, hp.dns_strategy[i]); - so.depends('action', 'route'); - so.modalonly = true; - - so = ss.taboption('field_other', form.Flag, 'dns_disable_cache', _('Disable DNS memory cache'), - _('Disable DNS memory cache and persistent cache in this query.')); + so = ss.taboption('field_other', form.Flag, 'dns_disable_cache', _('Disable dns cache'), + _('Disable cache and save cache in this query.')); so.depends('action', 'route'); so.depends('action', 'route-options'); so.modalonly = true; @@ -1782,6 +1282,66 @@ return view.extend({ so.depends('action', 'route-options'); so.modalonly = true; + so = ss.taboption('field_other', form.Value, 'match_response', _('Match response'), + _('1 matches the latest untagged evaluate result; other values match an evaluate tag (1.14).')); + so.depends('action', 'route'); + so.modalonly = true; + + so = ss.taboption('field_other', form.Value, 'evaluate_tag', _('Evaluate tag'), + _('Optional tag for this evaluate result.')); + so.depends('action', 'evaluate'); + so.modalonly = true; + + so = ss.taboption('field_other', form.Flag, 'race', _('Race'), + _('Judge this response-dependent rule in parallel; first match wins (1.14).')); + so.depends({'action': 'route', 'match_response': /[\s\S]/}); + so.modalonly = true; + + so = ss.taboption('field_other', form.Flag, 'speculative', _('Speculative'), + _('Send the query before pending race rules are judged (1.14).')); + so.depends('action', 'route'); + so.depends('action', 'evaluate'); + so.modalonly = true; + + so = ss.taboption('field_other', form.Flag, 'disable_optimistic_cache', _('Disable optimistic cache'), + _('Disable optimistic DNS caching for this query.')); + so.depends('action', 'route'); + so.depends('action', 'evaluate'); + so.modalonly = true; + + so = ss.taboption('field_other', form.Value, 'dns_timeout', _('Query timeout'), + _('Override dns.timeout for this query, in seconds.')); + so.datatype = 'uinteger'; + so.depends('action', 'route'); + so.depends('action', 'evaluate'); + so.modalonly = true; + + so = ss.taboption('field_other', form.Flag, 'remove_client_subnet', _('Remove EDNS client subnet'), + _('Remove the edns0-subnet record from the query (1.14).')); + so.depends('action', 'route'); + so.depends('action', 'evaluate'); + so.modalonly = true; + + so = ss.taboption('field_other', form.ListValue, 'response_rcode', _('Response RCode'), + _('Match the evaluated response code (requires match_response).')); + for (let rc of [ 'NOERROR', 'FORMERR', 'SERVFAIL', 'NXDOMAIN', 'NOTIMP', 'REFUSED' ]) + so.value(rc); + so.depends({'action': 'route', 'match_response': /[\s\S]/}); + so.modalonly = true; + + so = ss.taboption('field_other', form.DynamicList, 'response_answer', _('Response answer'), + _('Text DNS records to match in the evaluated answer.')); + so.depends({'action': 'route', 'match_response': /[\s\S]/}); + so.modalonly = true; + + so = ss.taboption('field_other', form.DynamicList, 'response_ns', _('Response NS')); + so.depends({'action': 'route', 'match_response': /[\s\S]/}); + so.modalonly = true; + + so = ss.taboption('field_other', form.DynamicList, 'response_extra', _('Response extra')); + so.depends({'action': 'route', 'match_response': /[\s\S]/}); + so.modalonly = true; + so = ss.taboption('field_other', form.ListValue, 'reject_method', _('Method')); so.value('default', _('Reply with REFUSED')); so.value('drop', _('Drop requests')); @@ -1848,12 +1408,30 @@ return view.extend({ so.modalonly = true; so = ss.taboption('field_host', form.DynamicList, 'ip_cidr', _('IP CIDR'), - _('Match IP CIDR with query response. Current rule will be skipped if not match.')); + _('Match IP CIDR with the evaluated response (needs match_response; old rules are auto-wrapped in 1.14).')); so.datatype = 'or(cidr, ipaddr)'; so.modalonly = true; so = ss.taboption('field_host', form.Flag, 'ip_is_private', _('Match private IP'), - _('Match private IP with query response.')); + _('Match private IP with the evaluated response (needs match_response).')); + so.modalonly = true; + + so = ss.taboption('field_host', form.DynamicList, 'source_mac_address', _('Source MAC address'), + _('Match LAN device by MAC address.')); + so.datatype = 'macaddr'; + so.modalonly = true; + + so = ss.taboption('field_host', form.DynamicList, 'source_hostname', _('Source hostname'), + _('Match LAN device hostname via neighbor resolution; enable find_neighbor.')); + so.modalonly = true; + + so = ss.taboption('field_host', form.Value, 'query_client_subnet', _('Query EDNS client subnet'), + _('Match the EDNS Client Subnet in the query (1.14).')); + so.datatype = 'or(cidr, ipaddr)'; + so.modalonly = true; + + so = ss.taboption('field_host', form.Flag, 'query_dnssec', _('Match DNSSEC OK'), + _('Match queries with the DNSSEC OK bit set (1.14).')); so.modalonly = true; so = ss.taboption('field_port', form.DynamicList, 'source_port', _('Source port'), @@ -1902,37 +1480,13 @@ return view.extend({ ss.nodescriptions = true; ss.modaltitle = L.bind(hp.loadModalTitle, this, _('Rule set'), _('Add a rule set'), data[0]); ss.sectiontitle = L.bind(hp.loadDefaultLabel, this, data[0]); - ss.renderSectionAdd = L.bind(renderRuleSetAdd, this, ss); + ss.renderSectionAdd = L.bind(hp.renderSectionAdd, this, ss); so = ss.option(form.Value, 'label', _('Label')); so.load = L.bind(hp.loadDefaultLabel, this, data[0]); so.validate = L.bind(hp.validateUniqueValue, this, data[0], 'ruleset', 'label'); so.modalonly = true; - so = ss.option(form.Value, 'tag', _('Tag'), - _('Used by sing-box rule sets. Please fill it in yourself.')); - so.rmempty = false; - so.validate = function(section_id, value) { - if (section_id) { - if (!value) - return _('Expecting: %s').format(_('non-empty value')); - if (!value.match(/^[A-Za-z0-9_.-]+$/)) - return _('Expecting: %s').format(_('valid tag')); - - let duplicate = false; - uci.sections(data[0], 'ruleset', (res) => { - if (res['.name'] !== section_id) - if ((res.tag || ('cfg-' + res['.name'] + '-rule')) === value) - duplicate = true; - }); - if (duplicate) - return _('Expecting: %s').format(_('unique value')); - } - - return true; - } - so.modalonly = true; - so = ss.option(form.Flag, 'enabled', _('Enable')); so.default = so.enabled; so.rmempty = false; @@ -1950,9 +1504,9 @@ return view.extend({ so.default = 'binary'; so.rmempty = false; - so = ss.option(form.Value, 'path', _('Path'), - _('The default rule set directory is /etc/homeproxy/ruleset/.')); + so = ss.option(form.Value, 'path', _('Path')); so.datatype = 'file'; + so.placeholder = '/etc/homeproxy/ruleset/example.json'; so.rmempty = false; so.depends('type', 'local'); so.modalonly = true; @@ -1962,6 +1516,9 @@ return view.extend({ if (section_id) { if (!value) return _('Expecting: %s').format(_('non-empty value')); + let extra = this.section.formvalue(section_id, 'extra_tags') || []; + if (extra.length && !value.includes('{tag}')) + return _('Expecting: %s').format(_('{tag} in URL when extra tags are used')); try { let url = new URL(value); @@ -1980,7 +1537,7 @@ return view.extend({ so.modalonly = true; so = ss.option(form.ListValue, 'outbound', _('Outbound'), - _('Tag of the outbound to download rule set.')); + _('Outbound used to download this rule-set (via sing-box 1.14 http_clients).')); so.load = function(section_id) { delete this.keylist; delete this.vallist; @@ -1996,129 +1553,37 @@ return view.extend({ } so.depends('type', 'remote'); - so = ss.option(form.Value, 'remote_path', _('Path')); - so.default = '/etc/homeproxy/ruleset/'; - so.placeholder = '/etc/homeproxy/ruleset/'; - so.validate = function(section_id, value) { - if (!value) - return _('Expecting: %s').format(_('non-empty value')); - if (!value.match(/^\//)) - return _('Expecting: %s').format(_('absolute path')); + so = ss.option(form.Value, 'initial_path', _('Initial path'), + _('Local file with initial rule-set content; avoids blocking startup on first download (1.14).')); + so.datatype = 'file'; + so.depends('type', 'remote'); + so.modalonly = true; + so = ss.option(form.DynamicList, 'extra_tags', _('Extra tags'), + _('Extra rule-set tags sharing these options. Requires {tag} in path/url (1.14).')); + so.depends('type', 'remote'); + so.validate = function(section_id, value) { + if (section_id && value && value.length) { + let rule_url = this.section.formvalue(section_id, 'url') || ''; + if (!rule_url.includes('{tag}')) + return _('Expecting: %s').format(_('{tag} in URL when extra tags are used')); + let rule_initial = this.section.formvalue(section_id, 'initial_path') || ''; + if (rule_initial && !rule_initial.includes('{tag}')) + return _('Expecting: %s').format(_('{tag} in initial path when extra tags are used')); + } return true; } - so.rmempty = false; - so.depends('type', 'remote'); so.modalonly = true; - so = ss.option(form.Flag, 'auto_update', _('Auto update')); - so.default = '1'; - so.rmempty = false; - so.depends('type', 'remote'); - so.modalonly = true; - - so = ss.option(form.Value, 'update_interval', _('Update time (weekly)')); - so.renderWidget = function() { - return hp.renderCronSelector.apply(this, arguments); - }; - so.default = '0 0 * * *'; - so.rmempty = false; - so.validate = function(section_id, value) { - value = value || this.formvalue(section_id); - if (!validateUpdateCron(value)) - return _('Expecting: %s').format(_('valid cron expression')); - - return true; - }; + so = ss.option(form.Value, 'update_interval', _('Update interval'), + _('Update interval of rule set.')); + so.placeholder = '1d'; so.depends('type', 'remote'); /* Rule set settings end */ + /* ACL settings start */ s.tab('control', _('Access Control')); - /* NTP settings start */ - s.tab('ntp', _('NTP Settings')); - o = s.taboption('ntp', form.SectionValue, '_ntp', form.NamedSection, 'ntp', 'homeproxy'); - o.depends('routing_mode', 'custom'); - ss = o.subsection; - - so = ss.option(form.Flag, 'enabled', _('Enable NTP')); - so.default = so.enabled; - so.rmempty = false; - - so = ss.option(form.Value, 'server', _('NTP server address')); - so.default = 'ntp.aliyun.com'; - so.placeholder = 'ntp.aliyun.com'; - so.rmempty = false; - so.validate = function(_section_id, value) { - if (!value) - return _('Expecting: %s').format(_('non-empty value')); - - return stubValidator.apply('hostname', value) || - stubValidator.apply('ip4addr', value) || - stubValidator.apply('ip6addr', value); - }; - so.depends('enabled', '1'); - - so = ss.option(form.Value, 'server_port', _('NTP server port')); - so.default = '123'; - so.placeholder = '123'; - so.datatype = 'port'; - so.rmempty = false; - so.validate = function(_section_id, value) { - if (!value) - return _('Expecting: %s').format(_('non-empty value')); - - return stubValidator.apply('port', value); - }; - so.depends('enabled', '1'); - - so = ss.option(form.Value, 'interval', _('NTP time synchronization interval'), - _('NTP service always uses direct connection and mainly provides accurate time for sing-box features that depend on it, such as TLS certificate verification, VMess, Reality/uTLS and other time-sensitive connection scenarios.') + '
' + - _('Time format examples: 1m = 1 minute, 1h = 1 hour, 1d = 1 day.')); - so.default = '30m'; - so.placeholder = '30m'; - so.rmempty = false; - so.validate = function(_section_id, value) { - if (!value) - return _('Expecting: %s').format(_('non-empty value')); - if (!validateDuration(value)) - return _('Expecting: %s').format(_('valid duration')); - - return true; - }; - so.depends('enabled', '1'); - /* NTP settings end */ - - /* Cache settings start */ - s.tab('cache', _('Persistent Cache Settings')); - o = s.taboption('cache', form.SectionValue, '_cache', form.NamedSection, 'cache', 'homeproxy'); - o.depends('routing_mode', 'custom'); - ss = o.subsection; - - so = ss.option(form.ListValue, 'enabled', _('Enable cache file')); - so.value('1', _('Enable')); - so.value('0', _('Disable')); - so.default = '1'; - so.rmempty = false; - - so = ss.option(form.Value, 'path', _('Persistent cache file path')); - so.placeholder = '/etc/homeproxy/cache.db'; - so.depends('enabled', '1'); - - so = ss.option(form.ListValue, 'store_rdrc', _('Persist RDRC cache')); - so.value('1', _('Enable')); - so.value('0', _('Disable')); - so.default = '1'; - so.rmempty = false; - so.depends('enabled', '1'); - - so = ss.option(form.Value, 'rdrc_timeout', _('RDRC timeout'), - _('Timeout of rejected DNS response cache in seconds. 604800 (7d) is used by default.')); - so.datatype = 'uinteger'; - so.depends({'enabled': '1', 'store_rdrc': '1'}); - /* Cache settings end */ - - /* ACL settings start */ o = s.taboption('control', form.SectionValue, '_control', form.NamedSection, 'control', 'homeproxy'); ss = o.subsection; @@ -2264,100 +1729,26 @@ return view.extend({ /* Direct domain list end */ /* ACL settings end */ - /* Panel settings start */ - s.tab('panel', _('Panel Settings')); - o = s.taboption('panel', form.SectionValue, '_clash_api', form.NamedSection, 'clash_api', 'homeproxy'); - o.depends('routing_mode', 'custom'); + /* DNS cache / timeout for preset routing modes (rightmost tab, stored in the dns section) */ + s.tab('dns_cache', _('DNS Cache (1.14)')); + o = s.taboption('dns_cache', form.SectionValue, '_dns_cache', form.NamedSection, 'dns', 'homeproxy'); + o.depends({'routing_mode': 'custom', '!reverse': true}); ss = o.subsection; - so = ss.option(form.Value, 'external_ui', _('UI path')); - so.placeholder = '/etc/homeproxy/run/ui'; - so.default = '/etc/homeproxy/run/ui'; - - const panelPresetUrls = { - 'https://gh-proxy.com/https://github.com/Zephyruso/zashboard/releases/latest/download/dist-cdn-fonts.zip': 'Zashboard CDN Fonts (gh-proxy)', - 'https://github.com/Zephyruso/zashboard/releases/latest/download/dist-cdn-fonts.zip': 'Zashboard CDN Fonts', - 'https://gh-proxy.com/https://github.com/Zephyruso/zashboard/releases/latest/download/dist.zip': 'Zashboard 完整版 (gh-proxy)', - 'https://github.com/Zephyruso/zashboard/releases/latest/download/dist.zip': 'Zashboard 完整版', - 'https://gh-proxy.com/https://github.com/MetaCubeX/metacubexd/archive/refs/heads/gh-pages.zip': 'MetaCubeXD (gh-proxy)', - 'https://github.com/MetaCubeX/metacubexd/archive/refs/heads/gh-pages.zip': 'MetaCubeXD', - 'https://gh-proxy.com/https://github.com/MetaCubeX/Yacd-meta/archive/refs/heads/gh-pages.zip': 'YACD (gh-proxy)', - 'https://github.com/MetaCubeX/Yacd-meta/archive/refs/heads/gh-pages.zip': 'YACD', - 'https://gh-proxy.com/https://github.com/MetaCubeX/Razord-meta/archive/refs/heads/gh-pages.zip': 'Razord (gh-proxy)', - 'https://github.com/MetaCubeX/Razord-meta/archive/refs/heads/gh-pages.zip': 'Razord' - }; - - so = ss.option(form.ListValue, 'external_ui_download_url', _('UI download URL')); - so.value('https://gh-proxy.com/https://github.com/Zephyruso/zashboard/releases/latest/download/dist-cdn-fonts.zip', 'Zashboard CDN Fonts (gh-proxy)'); - so.value('https://github.com/Zephyruso/zashboard/releases/latest/download/dist-cdn-fonts.zip', 'Zashboard CDN Fonts'); - so.value('https://gh-proxy.com/https://github.com/Zephyruso/zashboard/releases/latest/download/dist.zip', 'Zashboard 完整版 (gh-proxy)'); - so.value('https://github.com/Zephyruso/zashboard/releases/latest/download/dist.zip', 'Zashboard 完整版'); - so.value('https://gh-proxy.com/https://github.com/MetaCubeX/metacubexd/archive/refs/heads/gh-pages.zip', 'MetaCubeXD (gh-proxy)'); - so.value('https://github.com/MetaCubeX/metacubexd/archive/refs/heads/gh-pages.zip', 'MetaCubeXD'); - so.value('https://gh-proxy.com/https://github.com/MetaCubeX/Yacd-meta/archive/refs/heads/gh-pages.zip', 'YACD (gh-proxy)'); - so.value('https://github.com/MetaCubeX/Yacd-meta/archive/refs/heads/gh-pages.zip', 'YACD'); - so.value('https://gh-proxy.com/https://github.com/MetaCubeX/Razord-meta/archive/refs/heads/gh-pages.zip', 'Razord (gh-proxy)'); - so.value('https://github.com/MetaCubeX/Razord-meta/archive/refs/heads/gh-pages.zip', 'Razord'); - so.value('https://github.com/MetaCubeX/metacubexd/archive/refs/heads/gh-pages.zip', 'MetaCubeXD'); - so.value('https://gh-proxy.com/https://github.com/MetaCubeX/Yacd-meta/archive/refs/heads/gh-pages.zip', 'YACD (gh-proxy)'); - so.value('https://github.com/MetaCubeX/Yacd-meta/archive/refs/heads/gh-pages.zip', 'YACD'); - so.value('https://gh-proxy.com/https://github.com/MetaCubeX/Razord-meta/archive/refs/heads/gh-pages.zip', 'Razord (gh-proxy)'); - so.value('https://github.com/MetaCubeX/Razord-meta/archive/refs/heads/gh-pages.zip', 'Razord'); - so.value('__custom__', _('Custom')); - so.default = 'https://gh-proxy.com/https://github.com/Zephyruso/zashboard/releases/latest/download/dist-cdn-fonts.zip'; - so.load = function(section_id) { - const value = uci.get(data[0], section_id, 'external_ui_download_url') ?? this.default; - return (value in panelPresetUrls) ? value : '__custom__'; - }; - so.write = function(section_id, value) { - if (value === '__custom__') { - const customValue = (this.section?.formvalue(section_id, 'external_ui_download_url_custom') || '').trim(); - uci.set(data[0], section_id, 'external_ui_download_url', customValue); - } else { - uci.set(data[0], section_id, 'external_ui_download_url', value); - } - }; - - so = ss.option(form.Value, 'external_ui_download_url_custom', _('Custom URL')); - so.placeholder = 'https://example.com/dist.zip'; - so.depends('external_ui_download_url', '__custom__'); - so.load = function(section_id) { - const value = (uci.get(data[0], section_id, 'external_ui_download_url') || '').trim(); - return (value in panelPresetUrls) ? '' : value; - }; - so.write = function(section_id, value) { - uci.set(data[0], section_id, 'external_ui_download_url_custom', (value || '').trim()); - }; - so.remove = function(section_id) { - uci.unset(data[0], section_id, 'external_ui_download_url_custom'); - }; - - so = ss.option(form.ListValue, 'external_ui_download_detour', _('UI download detour')); - so.value('', _('Default')); - so.value('direct-out', _('Direct')); - uci.sections(data[0], 'routing_node', (res) => { - if (res.enabled === '1') - so.value(res['.name'], res.label); - }); - so.default = 'direct-out'; - - so = ss.option(form.Value, 'external_controller', _('API listen'), - _('Use 0.0.0.0:port to open the panel from your browser.')); - so.placeholder = '0.0.0.0:9095'; - so.default = '0.0.0.0:9095'; - so.datatype = 'ipaddrport(1)'; + so = ss.option(form.Flag, 'optimistic_cache', _('Optimistic DNS cache'), + _('Return expired cache immediately and refresh in background (sing-box 1.14).')); so.rmempty = false; - so = ss.option(form.Value, 'secret', _('API password')); - so.password = true; + so = ss.option(form.Value, 'optimistic_timeout', _('Optimistic cache timeout'), + _('Max time an expired entry may be served. Examples: 3d, 1h.')); - so = ss.option(form.ListValue, 'default_mode', _('Default mode')); - so.value('rule', _('Rule')); - so.value('global', _('Global')); - so.value('direct', _('Direct')); - so.default = 'rule'; + so = ss.option(form.Value, 'dns_timeout', _('DNS query timeout'), + _('Default timeout per DNS query in seconds (sing-box default: 10).')); + so.datatype = 'uinteger'; + + so = ss.option(form.Flag, 'cache_file_store_dns', _('Store DNS cache'), + _('Persist DNS cache across restarts (replaces Store RDRC).')); so.rmempty = false; - /* Panel settings end */ return m.render(); } diff --git a/luci-app-homeproxy/htdocs/luci-static/resources/view/homeproxy/node.js b/luci-app-homeproxy/htdocs/luci-static/resources/view/homeproxy/node.js index 5b5b19238..2443767f7 100644 --- a/luci-app-homeproxy/htdocs/luci-static/resources/view/homeproxy/node.js +++ b/luci-app-homeproxy/htdocs/luci-static/resources/view/homeproxy/node.js @@ -7,7 +7,6 @@ 'use strict'; 'require form'; 'require fs'; -'require rpc'; 'require uci'; 'require ui'; 'require view'; @@ -15,207 +14,11 @@ 'require homeproxy as hp'; 'require tools.widgets as widgets'; -const callNodeLatencyTest = rpc.declare({ - object: 'luci.homeproxy', - method: 'node_latency_test', - params: ['node', 'mode'], - expect: { '': {} } -}); - -const callRCInit = rpc.declare({ - object: 'rc', - method: 'init', - params: ['name', 'action'], - expect: { '': {} } -}); - -function normalizeList(value) { - return Array.isArray(value) ? value : (value ? [value] : []); -} - -function getSubscriptionInfo(config) { - const urls = normalizeList(uci.get(config, 'subscription', 'subscription_url')), - names = normalizeList(uci.get(config, 'subscription', 'subscription_name')), - info = []; - - for (let i = 0; i < urls.length; i++) { - const url = urls[i], - cleanUrl = String(url || '').replace(/#.*$/, ''), - title = String(names[i] || '').trim(); - - if (!url) - continue; - - info.push({ - hash: hp.calcStringMD5(cleanUrl), - title, - url - }); - } - - return info; -} - -const SubscriptionList = form.Value.extend({ - __name__: 'CBI.HomeProxySubscriptionList', - - cfgvalue(section_id) { - return { - urls: normalizeList(uci.get('homeproxy', section_id, 'subscription_url')), - names: normalizeList(uci.get('homeproxy', section_id, 'subscription_name')) - }; - }, - - renderWidget(section_id, _option_index, cfgvalue) { - const value = cfgvalue || { urls: [], names: [] }, - rows = E('div', { - id: this.cbid(section_id), - 'class': 'homeproxy-subscription-list', - 'style': 'display: flex; flex-direction: column; gap: .45em; width: min(100%, 42em);' - }); - - rows.appendChild(E('div', { - 'class': 'homeproxy-subscription-header', - 'style': 'display: grid; grid-template-columns: minmax(8em, 13em) minmax(16em, 1fr) auto; gap: .35em; color: var(--text-muted, #6b7280); font-size: 90%;' - }, [ - E('span', {}, [ _('\u8ba2\u9605\u540d\u79f0') ]), - E('span', {}, [ _('\u8ba2\u9605\u5730\u5740') ]), - E('span') - ])); - - const addRow = (name, url) => { - const row = E('div', { - 'class': 'homeproxy-subscription-row', - 'style': 'display: grid; grid-template-columns: minmax(8em, 13em) minmax(16em, 1fr) auto; gap: .35em; align-items: stretch;' - }, [ - E('input', { - 'type': 'text', - 'class': 'cbi-input-text subscription-name', - 'placeholder': _('\u8ba2\u9605\u540d\u79f0'), - 'value': name || '', - 'style': 'width: 100%; box-sizing: border-box;' - }), - E('input', { - 'type': 'text', - 'class': 'cbi-input-text subscription-url', - 'placeholder': _('\u8ba2\u9605\u5730\u5740'), - 'value': url || '', - 'style': 'width: 100%; box-sizing: border-box;' - }), - E('button', { - 'type': 'button', - 'class': 'cbi-button cbi-button-remove', - 'click': () => { - row.remove(); - if (!rows.querySelector('.homeproxy-subscription-row')) - addRow('', ''); - } - }, [ '-' ]) - ]); - - if (rows._addButton) - rows.insertBefore(row, rows._addButton); - else - rows.appendChild(row); - }; - - for (let i = 0; i < Math.max(value.urls.length, 1); i++) - addRow(value.names[i], value.urls[i]); - - rows._addButton = E('button', { - 'type': 'button', - 'class': 'cbi-button cbi-button-add', - 'style': 'width: 3em;', - 'click': () => addRow('', '') - }, [ '+' ]); - rows.appendChild(rows._addButton); - - return rows; - }, - - formvalue(section_id) { - const node = document.getElementById(this.cbid(section_id)), - names = [], - urls = []; - - node?.querySelectorAll('.homeproxy-subscription-row').forEach((row) => { - const name = row.querySelector('.subscription-name')?.value.trim() || '', - url = row.querySelector('.subscription-url')?.value.trim() || ''; - - if (!name && !url) - return; - - names.push(name); - urls.push(url); - }); - - return { names, urls }; - }, - - validate(_section_id, value) { - const names = value?.names || [], - urls = value?.urls || [], - usedNames = {}, - usedUrls = {}; - - if (!names.length || !urls.length) - return _('\u8ba2\u9605\u540d\u79f0\u548c\u8ba2\u9605\u5730\u5740\u4e3a\u5fc5\u586b\u9879'); - - for (let i = 0; i < Math.max(names.length, urls.length); i++) { - const name = String(names[i] || '').trim(), - url = String(urls[i] || '').trim(), - normalizedUrl = url.replace(/#.*$/, ''); - - if (!name || !url) - return _('\u8ba2\u9605\u540d\u79f0\u548c\u8ba2\u9605\u5730\u5740\u5fc5\u987b\u6210\u5bf9\u586b\u5199'); - - if (usedNames[name]) - return _('\u8ba2\u9605\u540d\u79f0\u4e0d\u80fd\u91cd\u590d'); - usedNames[name] = true; - - if (usedUrls[normalizedUrl]) - return _('\u8ba2\u9605\u5730\u5740\u4e0d\u80fd\u91cd\u590d'); - usedUrls[normalizedUrl] = true; - - try { - let parsed = new URL(url); - if (!parsed.hostname) - return _('Expecting: %s').format(_('valid URL')); - } catch(e) { - return _('Expecting: %s').format(_('valid URL')); - } - } - - return true; - }, - - write(section_id, value) { - if (value?.urls?.length) { - uci.set('homeproxy', section_id, 'subscription_url', value.urls); - uci.set('homeproxy', section_id, 'subscription_name', value.names); - } else { - uci.unset('homeproxy', section_id, 'subscription_url'); - uci.unset('homeproxy', section_id, 'subscription_name'); - } - } -}); - function allowInsecureConfirm(ev, _section_id, value) { if (value === '1' && !confirm(_('Are you sure to allow insecure?'))) ev.target.firstElementChild.checked = null; } -function normalizeHysteriaHoppingPort(mport) { - if (!mport) - return null; - - const ports = mport.split(',') - .map((p) => p.trim()) - .filter((p) => p.length) - .map((p) => (/^\d+$/.test(p) ? `${p}:${p}` : p.replace('-', ':'))); - return ports.length ? ports : null; -} - function parseShareLink(uri, features) { let config, url, params; @@ -226,11 +29,6 @@ function parseShareLink(uri, features) { /* https://github.com/anytls/anytls-go/blob/v0.0.8/docs/uri_scheme.md */ url = new URL('http://' + uri[1]); params = url.searchParams; - let anytls_fp = params.get('fp'); - if (['none', 'disable', 'disabled'].includes(anytls_fp)) - anytls_fp = null; - else if (!anytls_fp) - anytls_fp = 'chrome'; /* Check if password exists */ if (!url.username) @@ -244,8 +42,7 @@ function parseShareLink(uri, features) { password: url.username ? decodeURIComponent(url.username) : null, tls: '1', tls_sni: params.get('sni'), - tls_insecure: (params.get('insecure') === '1' || params.get('allowInsecure') === '1') ? '1' : '0', - tls_utls: features.with_utls ? anytls_fp : null + tls_insecure: (params.get('insecure') === '1') ? '1' : '0' }; break; @@ -278,7 +75,6 @@ function parseShareLink(uri, features) { type: 'hysteria', address: url.hostname, port: url.port || '80', - hysteria_hopping_port: normalizeHysteriaHoppingPort(params.get('mport')), hysteria_protocol: params.get('protocol') || 'udp', hysteria_auth_type: params.get('auth') ? 'string' : null, hysteria_auth_payload: params.get('auth'), @@ -286,9 +82,9 @@ function parseShareLink(uri, features) { hysteria_down_mbps: params.get('downmbps'), hysteria_up_mbps: params.get('upmbps'), tls: '1', - tls_insecure: (params.get('insecure') === '1' || params.get('allowInsecure') === '1') ? '1' : '0', tls_sni: params.get('peer'), - tls_alpn: params.get('alpn') + tls_alpn: params.get('alpn'), + tls_insecure: (params.get('insecure') === '1') ? '1' : '0' }; break; @@ -309,19 +105,38 @@ function parseShareLink(uri, features) { password: url.username ? ( decodeURIComponent(url.username + (url.password ? (':' + url.password) : '')) ) : null, - hysteria_hopping_port: normalizeHysteriaHoppingPort(params.get('mport')), hysteria_obfs_type: params.get('obfs'), hysteria_obfs_password: params.get('obfs-password'), tls: '1', - tls_insecure: (params.get('insecure') === '1' || params.get('allowInsecure') === '1') ? '1' : '0', - tls_sni: params.get('sni') + tls_sni: params.get('sni'), + tls_insecure: params.get('insecure') ? '1' : '0' + }; + + break; + case 'snell': + /* Surge Snell share link: snell://host:port?psk=..&obfs=http&obfs-host=..#name */ + url = new URL('http://' + uri[1]); + params = url.searchParams; + + config = { + label: url.hash ? decodeURIComponent(url.hash.slice(1)) : null, + type: 'snell', + address: url.hostname, + port: url.port || '80', + password: url.username ? decodeURIComponent(url.username) + : (params.get('psk') ? decodeURIComponent(params.get('psk')) : null), + snell_version: params.get('version') || '4', + snell_userkey: params.get('userkey'), + snell_obfs_mode: (params.get('obfs') === 'http') ? 'http' : null, + snell_obfs_host: params.get('obfs-host'), + snell_reuse: (params.get('reuse') === '1') ? '1' : '0' }; break; case 'socks': case 'socks4': case 'socks4a': - case 'socsk5': + case 'socks5': case 'socks5h': url = new URL('http://' + uri[1]); @@ -417,7 +232,6 @@ function parseShareLink(uri, features) { password: decodeURIComponent(url.username), transport: params.get('type') !== 'tcp' ? params.get('type') : null, tls: '1', - tls_insecure: (params.get('insecure') === '1' || params.get('allowInsecure') === '1') ? '1' : '0', tls_sni: params.get('sni') }; switch (params.get('type')) { @@ -455,7 +269,6 @@ function parseShareLink(uri, features) { tuic_congestion_control: params.get('congestion_control'), tuic_udp_relay_mode: params.get('udp_relay_mode'), tls: '1', - tls_insecure: (params.get('insecure') === '1' || params.get('allowInsecure') === '1') ? '1' : '0', tls_sni: params.get('sni'), tls_alpn: params.get('alpn') ? decodeURIComponent(params.get('alpn')).split(',') : null }; @@ -483,7 +296,6 @@ function parseShareLink(uri, features) { uuid: url.username, transport: params.get('type') !== 'tcp' ? params.get('type') : null, tls: ['tls', 'xtls', 'reality'].includes(params.get('security')) ? '1' : '0', - tls_insecure: (params.get('insecure') === '1' || params.get('allowInsecure') === '1') ? '1' : '0', tls_sni: params.get('sni'), tls_alpn: params.get('alpn') ? decodeURIComponent(params.get('alpn')).split(',') : null, tls_reality: (params.get('security') === 'reality') ? '1' : '0', @@ -596,378 +408,13 @@ function parseShareLink(uri, features) { return config; } -const NODE_LATENCY_ROW_STATES = Object.freeze({ - UNTESTED: 'untested', - TESTING: 'testing', - SUCCESS: 'success', - TIMEOUT: 'timeout', - ERROR: 'error' -}); - -const NODE_LATENCY_ROW_STATE_VALUES = Object.freeze(Object.values(NODE_LATENCY_ROW_STATES)); -const NODE_LATENCY_TEST_MODES = Object.freeze([ 'icmp', 'rp' ]); - -function remapLegacyNodeLatencyTestMode(mode) { - return mode === 'tcp' ? 'icmp' : mode; -} - -function normalizeNodeLatencyTestMode(mode) { - mode = remapLegacyNodeLatencyTestMode(mode); - return NODE_LATENCY_TEST_MODES.includes(mode) ? mode : 'icmp'; -} - -function resolveNodeLatencyResultByMode(result, mode) { - let active_mode = normalizeNodeLatencyTestMode(mode || result?.mode); - let active_latency_ms = (result && result.latency_ms != null) ? result.latency_ms : null; - let active_error = (result && result.error) ? result.error : null; - let active_state = result?.state; - - if (active_mode === 'icmp') { - if (result && result.icmp_latency_ms != null) - active_latency_ms = result.icmp_latency_ms; - if (result && result.icmp_error) - active_error = result.icmp_error; - } - - if (active_error?.code?.endsWith('_timeout')) - active_state = NODE_LATENCY_ROW_STATES.TIMEOUT; - else if (active_error) - active_state = NODE_LATENCY_ROW_STATES.ERROR; - else if (active_latency_ms != null) - active_state = NODE_LATENCY_ROW_STATES.SUCCESS; - - return { - mode: active_mode, - state: active_state, - latency_ms: active_latency_ms, - error: active_error - }; -} - -function getNodeLatencyErrorText(error_code) { - switch (error_code) { - case 'backend_execution failed': - return _('Backend execution failed'); - case 'icmp_failed': - return _('ICMP Failed'); - case 'icmp_probe_unavailable': - return _('ICMP Probe unavailable'); - case 'icmp_timeout': - return _('ICMP Timeout'); - case 'invalid_node': - return _('Invalid node'); - case 'invalid_response': - return _('Invalid response'); - case 'probe_failed': - return _('Probe failed'); - case 'rpc_failed': - return _('RPC failed'); - default: - return _('Error'); - } -} - -function getNodeLatencyStatusText(row_state) { - if (!row_state) - return _('Not Tested'); - - switch (row_state.state) { - case NODE_LATENCY_ROW_STATES.TESTING: - return _('Testing'); - case NODE_LATENCY_ROW_STATES.SUCCESS: - return (row_state.latency_ms != null) ? _('%s ms').format(row_state.latency_ms) : _('Success'); - case NODE_LATENCY_ROW_STATES.TIMEOUT: - return _('Timeout'); - case NODE_LATENCY_ROW_STATES.ERROR: - return getNodeLatencyErrorText(row_state.error?.code); - case NODE_LATENCY_ROW_STATES.UNTESTED: - default: - return _('Not Tested'); - } -} - -function getNodeLatencyStatusStyle(row_state) { - if (!row_state) - return 'color:gray'; - - switch (row_state.state) { - case NODE_LATENCY_ROW_STATES.TESTING: - return 'color:#0a84ff'; - case NODE_LATENCY_ROW_STATES.SUCCESS: - return 'color:green'; - case NODE_LATENCY_ROW_STATES.TIMEOUT: - return 'color:#ff8c00'; - case NODE_LATENCY_ROW_STATES.ERROR: - return 'color:red'; - case NODE_LATENCY_ROW_STATES.UNTESTED: - default: - return 'color:gray'; - } -} - -function renderNodeLatencyStatus(row_state) { - return '%s'.format(getNodeLatencyStatusStyle(row_state), getNodeLatencyStatusText(row_state)); -} - -function renderNodeLatencyStatusNode(row_state, attrs) { - return E('strong', Object.assign({ - 'style': getNodeLatencyStatusStyle(row_state) - }, attrs || {}), [ getNodeLatencyStatusText(row_state) ]); -} - -function getNodeLatencyActionTitle(row_state) { - return (row_state?.state === NODE_LATENCY_ROW_STATES.TESTING) ? _('Testing') : _('Test'); -} - -function parseNodeLatencySectionId(widget_id) { - let matched = String(widget_id || '').match(/^cbi-homeproxy-(.*)-_test_latency$/); - return matched ? matched[1] : null; -} - -function parseActiveSubscriptionTabId(value) { - let matched = String(value || '').match(/(?:^|[^\w])(sub_[0-9a-f]+)(?:$|[^\w])/i); - return matched ? matched[1] : null; -} - -function parseActiveNodeListTabId(value) { - let matched = String(value || '').match(/(?:^|[^\w])(node|subscription|sub_[0-9a-f]+)(?:$|[^\w])/i); - return matched ? matched[1].toLowerCase() : null; -} - -function getActiveNodeListTabId(root_el) { - let active_tab = null; - let active_tab_nodes = root_el.querySelectorAll('.cbi-tabmenu li.cbi-tab-active, .cbi-tabmenu li.active, .cbi-tabmenu [aria-selected="true"]'); - - for (let node of active_tab_nodes) { - let tab_id = parseActiveNodeListTabId(node?.getAttribute('data-tab')) - || parseActiveNodeListTabId(node?.dataset?.tab) - || parseActiveNodeListTabId(node?.getAttribute('id')); - if (!tab_id && node?.querySelector) - tab_id = parseActiveNodeListTabId(node.querySelector('a')?.getAttribute('href')) - || parseActiveNodeListTabId(node.querySelector('a')?.getAttribute('data-tab')); - - if (tab_id) { - active_tab = tab_id; - break; - } - } - - if (!active_tab) { - let fallback_tab_nodes = root_el.querySelectorAll('.cbi-tabmenu li.cbi-tab[data-tab], .cbi-tabmenu li[data-tab]:not(.cbi-tab-disabled)'); - - for (let node of fallback_tab_nodes) { - let tab_id = parseActiveNodeListTabId(node?.getAttribute('data-tab')) || parseActiveNodeListTabId(node?.dataset?.tab); - if (tab_id) { - active_tab = tab_id; - break; - } - } - } - - return active_tab; -} - -function shouldShowBulkLatencyButton(root_el) { - let active_tab = getActiveNodeListTabId(root_el); - - if (!active_tab) - return false; - - return !!parseActiveSubscriptionTabId(active_tab); -} - -function getActiveSubscriptionTabId(root_el) { - let active_tab = getActiveNodeListTabId(root_el); - return parseActiveSubscriptionTabId(active_tab); -} - -function getActiveSubscriptionTabContainer(root_el, active_tab) { - if (!active_tab) - return null; - - let candidates = []; - for (let selector of [ - '.cbi-tabcontainer[data-tab="%s"]'.format(active_tab), - '[data-tab="%s"]'.format(active_tab), - '[id="tab.%s"]'.format(active_tab), - '[id="tab-%s"]'.format(active_tab), - '[id="%s"]'.format(active_tab) - ]) { - candidates = candidates.concat(Array.from(root_el.querySelectorAll(selector))); - } - - return candidates.find((node) => !node.closest('.cbi-tabmenu') && node.querySelector('div[id$="-_test_latency"]')) || null; -} - -function getActiveSubscriptionLatencySectionIds(root_el) { - let active_tab = getActiveSubscriptionTabId(root_el); - let active_container = getActiveSubscriptionTabContainer(root_el, active_tab); - if (!active_container) - return []; - - let widgets = Array.from(active_container.querySelectorAll('div[id$="-_test_latency"]')); - return widgets.map((node) => parseNodeLatencySectionId(node.id)).filter((sid) => !!sid); -} - -function createNodeLatencyRowStateModel() { - let rows = Object.create(null); - - const buildRowState = (state, result, mode) => { - let resolved_result = resolveNodeLatencyResultByMode(result, mode); - - return { - state: state, - mode: resolved_result.mode, - latency_ms: resolved_result.latency_ms, - icmp_latency_ms: (result && result.icmp_latency_ms != null) ? result.icmp_latency_ms : null, - measured_at: (result && result.measured_at) ? result.measured_at : null, - error: resolved_result.error, - icmp_error: (result && result.icmp_error) ? result.icmp_error : null - }; - }; - - const normalizeState = (state) => { - if (NODE_LATENCY_ROW_STATE_VALUES.includes(state)) - return state; - - return NODE_LATENCY_ROW_STATES.ERROR; - }; - - const ensure = (section_id) => { - if (!section_id) - return buildRowState(NODE_LATENCY_ROW_STATES.UNTESTED, null, 'icmp'); - - if (!rows[section_id]) - rows[section_id] = buildRowState(NODE_LATENCY_ROW_STATES.UNTESTED, null, 'icmp'); - - return rows[section_id]; - }; - - return { - states: NODE_LATENCY_ROW_STATES, - - get: (section_id) => ensure(section_id), - - set: (section_id, state, result, mode) => { - if (!section_id) - return null; - - rows[section_id] = buildRowState(normalizeState(state), result, mode); - return rows[section_id]; - }, - - setFromProbeResult: (section_id, result, mode) => { - if (!section_id) - return null; - - let resolved_result = resolveNodeLatencyResultByMode(result, mode); - let state = resolved_result.state ? normalizeState(resolved_result.state) : NODE_LATENCY_ROW_STATES.ERROR; - rows[section_id] = buildRowState(state, result, mode); - return rows[section_id]; - }, - - clear: (section_id) => { - if (!section_id) - return; - - delete rows[section_id]; - }, - - reset: () => { - rows = Object.create(null); - }, - - snapshot: () => rows - }; -} - -function renderNodeSettings(section, data, features, main_node, routing_mode, node_latency_row_state) { +function renderNodeSettings(section, data, features, main_node, routing_mode) { let s = section, o; - if (typeof globalThis !== 'undefined') { - globalThis.__hpNodeLatencySections = globalThis.__hpNodeLatencySections || {}; - globalThis.__hpNodeLatencyTrigger = function(section_id) { - let target = globalThis.__hpNodeLatencySections?.[section_id]; - return target ? target.handleNodeLatencyTest(section_id) : false; - }; - } s.rowcolors = true; s.sortable = true; s.nodescriptions = true; - s.max_cols = 7; s.modaltitle = L.bind(hp.loadModalTitle, this, _('Node'), _('Add a node'), data[0]); s.sectiontitle = L.bind(hp.loadDefaultLabel, this, data[0]); - s.node_latency_row_state = node_latency_row_state; - s.getNodeLatencyRowState = function(section_id) { - return node_latency_row_state.get(section_id); - } - s.getNodeLatencyTestMode = function() { - let mode_option = this.map.lookupOption('latency_test_mode', 'subscription')?.[0]; - let mode_value = mode_option ? mode_option.formvalue('subscription') : uci.get(data[0], 'subscription', 'latency_test_mode'); - - return normalizeNodeLatencyTestMode(mode_value); - } - s.syncNodeLatencyTestMode = function(mode) { - let normalized_mode = normalizeNodeLatencyTestMode(mode); - let saved_mode_value = uci.get(data[0], 'subscription', 'latency_test_mode'); - let saved_mode = normalizeNodeLatencyTestMode(saved_mode_value); - - if (saved_mode === normalized_mode && saved_mode_value !== 'tcp') - return Promise.resolve(normalized_mode); - - uci.set(data[0], 'subscription', 'latency_test_mode', normalized_mode); - return uci.save().then(() => normalized_mode); - } - s.setNodeLatencyRowState = function(section_id, state, result, mode) { - return node_latency_row_state.set(section_id, state, result, mode); - } - s.setNodeLatencyRowStateFromProbeResult = function(section_id, result, mode) { - return node_latency_row_state.setFromProbeResult(section_id, result, mode); - } - s.refreshNodeLatencyRow = function(section_id) { - let row_state = this.getNodeLatencyRowState(section_id); - let latency_id = 'cbi-%s-%s-_latency'.format(data[0], section_id); - let test_id = 'cbi-%s-%s-_test_latency'.format(data[0], section_id); - - let status_widget = this.map.findElement('id', latency_id); - if (status_widget) - status_widget.innerHTML = renderNodeLatencyStatus(row_state); - - let test_widget = this.map.findElement('id', test_id); - let test_button = test_widget ? test_widget.querySelector('button') : null; - if (test_button) { - test_button.textContent = getNodeLatencyActionTitle(row_state); - test_button.disabled = (row_state.state === NODE_LATENCY_ROW_STATES.TESTING) ? true : null; - } - } - - s.handleNodeLatencyTest = function(section_id) { - let mode = this.getNodeLatencyTestMode(); - this.setNodeLatencyRowState(section_id, NODE_LATENCY_ROW_STATES.TESTING, null, mode); - this.refreshNodeLatencyRow(section_id); - - return this.syncNodeLatencyTestMode(mode).then((mode) => L.resolveDefault(callNodeLatencyTest(section_id, mode), null).then((result) => { - if (result?.node === section_id) - this.setNodeLatencyRowStateFromProbeResult(section_id, result, mode); - else - this.setNodeLatencyRowState(section_id, NODE_LATENCY_ROW_STATES.ERROR, { - mode: mode, - error: { - code: 'invalid_response', - message: 'unexpected node latency response' - } - }, mode); - })).catch((err) => { - this.setNodeLatencyRowState(section_id, NODE_LATENCY_ROW_STATES.ERROR, { - mode: mode, - error: { - code: 'rpc_failed', - message: String(err) - } - }, mode); - }).then(() => { - this.refreshNodeLatencyRow(section_id); - }); - } if (routing_mode !== 'custom') { o = s.option(form.Button, '_apply', _('Apply')); @@ -992,41 +439,6 @@ function renderNodeSettings(section, data, features, main_node, routing_mode, no } } - o = s.option(form.DummyValue, '_latency', _('Latency')); - o.rawhtml = true; - o.modalonly = false; - o.textvalue = function(section_id) { - return E('span', { 'id': 'cbi-%s-%s-_latency'.format(data[0], section_id) }, [ - renderNodeLatencyStatusNode(this.section.getNodeLatencyRowState(section_id)) - ]); - } - - o = s.option(form.Button, '_test_latency', _('Test')); - o.editable = true; - o.modalonly = false; - o.inputstyle = 'action'; - o.inputtitle = function(section_id) { - return getNodeLatencyActionTitle(this.section.getNodeLatencyRowState(section_id)); - } - o.renderWidget = function(section_id, _option_index, cfgvalue) { - let hiddenEl = new ui.Hiddenfield((cfgvalue != null) ? cfgvalue : '', { - id: this.cbid(section_id) - }); - let outputEl = E('output', { 'for': this.cbid(section_id) }); - let row_state = s.getNodeLatencyRowState(section_id); - - if (typeof globalThis !== 'undefined' && globalThis.__hpNodeLatencySections) - globalThis.__hpNodeLatencySections[section_id] = s; - - outputEl.appendChild(E('button', { - 'class': 'cbi-button cbi-button-action', - 'onclick': 'return globalThis.__hpNodeLatencyTrigger(%s);'.format(JSON.stringify(section_id)), - 'disabled': (row_state.state === NODE_LATENCY_ROW_STATES.TESTING) ? true : null - }, [ getNodeLatencyActionTitle(row_state) ])); - - return E([ outputEl, hiddenEl.render() ]); - } - o = s.option(form.Value, 'label', _('Label')); o.load = L.bind(hp.loadDefaultLabel, this, data[0]); o.validate = L.bind(hp.validateUniqueValue, this, data[0], 'node', 'label'); @@ -1051,7 +463,6 @@ function renderNodeSettings(section, data, features, main_node, routing_mode, no o.value('wireguard', _('WireGuard')); o.value('vless', _('VLESS')); o.value('vmess', _('VMess')); - o.default = 'direct'; o.rmempty = false; o = s.option(form.Value, 'address', _('Address')); @@ -1076,6 +487,7 @@ function renderNodeSettings(section, data, features, main_node, routing_mode, no o.depends('type', 'http'); o.depends('type', 'hysteria2'); o.depends('type', 'shadowsocks'); + o.depends('type', 'snell'); o.depends('type', 'ssh'); o.depends('type', 'trojan'); o.depends('type', 'tuic'); @@ -1085,7 +497,7 @@ function renderNodeSettings(section, data, features, main_node, routing_mode, no o.validate = function(section_id, value) { if (section_id) { let type = this.section.formvalue(section_id, 'type'); - let required_type = [ 'anytls', 'shadowsocks', 'shadowtls', 'trojan' ]; + let required_type = [ 'anytls', 'shadowsocks', 'shadowtls', 'snell', 'trojan' ]; if (required_type.includes(type)) { if (type === 'shadowsocks') { @@ -1102,6 +514,15 @@ function renderNodeSettings(section, data, features, main_node, routing_mode, no } o.modalonly = true; + /* Direct config */ + o = s.option(form.ListValue, 'proxy_protocol', _('Proxy protocol'), + _('Write proxy protocol in the connection header.')); + o.value('', _('Disable')); + o.value('1', _('v1')); + o.value('2', _('v2')); + o.depends('type', 'direct'); + o.modalonly = true; + /* AnyTLS config start */ o = s.option(form.Value, 'anytls_idle_session_check_interval', _('Idle session check interval'), _('Interval checking for idle sessions, in seconds.')); @@ -1140,6 +561,13 @@ function renderNodeSettings(section, data, features, main_node, routing_mode, no o.depends({'type': 'hysteria2', 'hysteria_hopping_port': /[\s\S]/}); o.modalonly = true; + o = s.option(form.Value, 'hysteria_hop_interval_max', _('Max hop interval (1.14)'), + _('Maximum port hopping interval in seconds; the actual interval is randomized between the two values. Hysteria2 only.')); + o.datatype = 'uinteger'; + o.placeholder = '300'; + o.depends({'type': 'hysteria2', 'hysteria_hopping_port': /[\s\S]/}); + o.modalonly = true; + o = s.option(form.ListValue, 'hysteria_protocol', _('Protocol')); o.value('udp'); /* WeChat-Video / FakeTCP are unsupported by sing-box currently @@ -1167,6 +595,7 @@ function renderNodeSettings(section, data, features, main_node, routing_mode, no o = s.option(form.ListValue, 'hysteria_obfs_type', _('Obfuscate type')); o.value('', _('Disable')); o.value('salamander', _('Salamander')); + o.value('gecko', _('Gecko (1.14)')); o.depends('type', 'hysteria2'); o.modalonly = true; @@ -1176,6 +605,20 @@ function renderNodeSettings(section, data, features, main_node, routing_mode, no o.depends({'type': 'hysteria2', 'hysteria_obfs_type': /[\s\S]/}); o.modalonly = true; + o = s.option(form.Value, 'hysteria_obfs_min_packet_size', _('Min obfs packet size (1.14)'), + _('Minimum on-wire packet size in bytes. Gecko only.')); + o.datatype = 'uinteger'; + o.placeholder = '512'; + o.depends({'type': 'hysteria2', 'hysteria_obfs_type': 'gecko'}); + o.modalonly = true; + + o = s.option(form.Value, 'hysteria_obfs_max_packet_size', _('Max obfs packet size (1.14)'), + _('Maximum on-wire packet size in bytes. Gecko only.')); + o.datatype = 'uinteger'; + o.placeholder = '1200'; + o.depends({'type': 'hysteria2', 'hysteria_obfs_type': 'gecko'}); + o.modalonly = true; + o = s.option(form.Value, 'hysteria_down_mbps', _('Max download speed'), _('Max download speed in Mbps.')); o.datatype = 'uinteger'; @@ -1190,21 +633,17 @@ function renderNodeSettings(section, data, features, main_node, routing_mode, no o.depends('type', 'hysteria2'); o.modalonly = true; - o = s.option(form.Value, 'hysteria_recv_window_conn', _('QUIC stream receive window'), - _('The QUIC stream-level flow control window for receiving data.')); - o.datatype = 'uinteger'; - o.depends('type', 'hysteria'); + o = s.option(form.ListValue, 'hysteria_bbr_profile', _('BBR profile (1.14)'), + _('BBR congestion control algorithm profile. Hysteria2 only.')); + o.value('', _('Standard (default)')); + o.value('conservative', _('Conservative')); + o.value('aggressive', _('Aggressive')); + o.depends('type', 'hysteria2'); o.modalonly = true; - o = s.option(form.Value, 'hysteria_revc_window', _('QUIC connection receive window'), - _('The QUIC connection-level flow control window for receiving data.')); - o.datatype = 'uinteger'; - o.depends('type', 'hysteria'); - o.modalonly = true; - - o = s.option(form.Flag, 'hysteria_disable_mtu_discovery', _('Disable Path MTU discovery'), - _('Disables Path MTU Discovery (RFC 8899). Packets will then be at most 1252 (IPv4) / 1232 (IPv6) bytes in size.')); - o.depends('type', 'hysteria'); + o = s.option(form.Flag, 'hysteria_disable_chrome_parrot', _('Disable Chrome QUIC fingerprint (1.14)'), + _('Disable Chrome QUIC handshake parroting, which is enabled by default since sing-box 1.14. Turn this on only when the server uses an Ed25519 certificate or the handshake otherwise fails.')); + o.depends('type', 'hysteria2'); o.modalonly = true; /* Hysteria (2) config end */ @@ -1346,7 +785,7 @@ function renderNodeSettings(section, data, features, main_node, routing_mode, no o.modalonly = true; o = s.option(form.ListValue, 'vmess_encrypt', _('Encrypt method')); - o.value('auto', _('Default')); + o.value('auto'); o.value('none'); o.value('zero'); o.value('aes-128-gcm'); @@ -1370,126 +809,7 @@ function renderNodeSettings(section, data, features, main_node, routing_mode, no /* VMess config end */ /* Transport config start */ - o = s.option(form.ListValue, 'transport', _('Transport'), - _('No TCP transport, plain HTTP is merged into the HTTP transport.')); - o.value('', _('None')); - o.value('grpc', _('gRPC')); - o.value('http', _('HTTP')); - o.value('httpupgrade', _('HTTPUpgrade')); - o.value('quic', _('QUIC')); - o.value('ws', _('WebSocket')); - o.depends('type', 'trojan'); - o.depends('type', 'vless'); - o.depends('type', 'vmess'); - o.onchange = function(ev, section_id, value) { - let desc = this.map.findElement('id', 'cbid.homeproxy.%s.transport'.format(section_id)).nextElementSibling; - if (value === 'http') - desc.innerHTML = _('TLS is not enforced. If TLS is not configured, plain HTTP 1.1 is used.'); - else if (value === 'quic') - desc.innerHTML = _('No additional encryption support: It\'s basically duplicate encryption.'); - else - desc.innerHTML = _('No TCP transport, plain HTTP is merged into the HTTP transport.'); - - let tls = this.map.findElement('id', 'cbid.homeproxy.%s.tls'.format(section_id)).firstElementChild; - if ((value === 'http' && tls.checked) || (value === 'grpc' && !features.with_grpc)) { - this.map.findElement('id', 'cbid.homeproxy.%s.http_idle_timeout'.format(section_id)).nextElementSibling.innerHTML = - _('Specifies the period of time (in seconds) after which a health check will be performed using a ping frame if no frames have been received on the connection.
' + - 'Please note that a ping response is considered a received frame, so if there is no other traffic on the connection, the health check will be executed every interval.'); - - this.map.findElement('id', 'cbid.homeproxy.%s.http_ping_timeout'.format(section_id)).nextElementSibling.innerHTML = - _('Specifies the timeout duration (in seconds) after sending a PING frame, within which a response must be received.
' + - 'If a response to the PING frame is not received within the specified timeout duration, the connection will be closed.'); - } else if (value === 'grpc' && features.with_grpc) { - this.map.findElement('id', 'cbid.homeproxy.%s.http_idle_timeout'.format(section_id)).nextElementSibling.innerHTML = - _('If the transport doesn\'t see any activity after a duration of this time (in seconds), it pings the client to check if the connection is still active.'); - - this.map.findElement('id', 'cbid.homeproxy.%s.http_ping_timeout'.format(section_id)).nextElementSibling.innerHTML = - _('The timeout (in seconds) that after performing a keepalive check, the client will wait for activity. If no activity is detected, the connection will be closed.'); - } - } - o.modalonly = true; - - /* gRPC config start */ - o = s.option(form.Value, 'grpc_servicename', _('gRPC service name')); - o.depends('transport', 'grpc'); - o.modalonly = true; - - if (features.with_grpc) { - o = s.option(form.Flag, 'grpc_permit_without_stream', _('gRPC permit without stream'), - _('If enabled, the client transport sends keepalive pings even with no active connections.')); - o.depends('transport', 'grpc'); - o.modalonly = true; - } - /* gRPC config end */ - - /* HTTP(Upgrade) config start */ - o = s.option(form.DynamicList, 'http_host', _('Host')); - o.datatype = 'hostname'; - o.depends('transport', 'http'); - o.modalonly = true; - - o = s.option(form.Value, 'httpupgrade_host', _('Host')); - o.datatype = 'hostname'; - o.depends('transport', 'httpupgrade'); - o.modalonly = true; - - o = s.option(form.Value, 'http_path', _('Path')); - o.depends('transport', 'http'); - o.depends('transport', 'httpupgrade'); - o.modalonly = true; - - o = s.option(form.Value, 'http_method', _('Method')); - o.value('GET', _('GET')); - o.value('PUT', _('PUT')); - o.depends('transport', 'http'); - o.modalonly = true; - - o = s.option(form.Value, 'http_idle_timeout', _('Idle timeout'), - _('Specifies the period of time (in seconds) after which a health check will be performed using a ping frame if no frames have been received on the connection.
' + - 'Please note that a ping response is considered a received frame, so if there is no other traffic on the connection, the health check will be executed every interval.')); - o.datatype = 'uinteger'; - o.depends('transport', 'grpc'); - o.depends({'transport': 'http', 'tls': '1'}); - o.modalonly = true; - - o = s.option(form.Value, 'http_ping_timeout', _('Ping timeout'), - _('Specifies the timeout duration (in seconds) after sending a PING frame, within which a response must be received.
' + - 'If a response to the PING frame is not received within the specified timeout duration, the connection will be closed.')); - o.datatype = 'uinteger'; - o.depends('transport', 'grpc'); - o.depends({'transport': 'http', 'tls': '1'}); - o.modalonly = true; - /* HTTP config end */ - - /* WebSocket config start */ - o = s.option(form.Value, 'ws_host', _('Host')); - o.depends('transport', 'ws'); - o.modalonly = true; - - o = s.option(form.Value, 'ws_path', _('Path')); - o.depends('transport', 'ws'); - o.modalonly = true; - - o = s.option(form.Value, 'websocket_early_data', _('Early data'), - _('Allowed payload size is in the request.')); - o.datatype = 'uinteger'; - o.value('2048'); - o.depends('transport', 'ws'); - o.modalonly = true; - - o = s.option(form.Value, 'websocket_early_data_header', _('Early data header name')); - o.value('Sec-WebSocket-Protocol'); - o.depends('transport', 'ws'); - o.modalonly = true; - /* WebSocket config end */ - - o = s.option(form.ListValue, 'packet_encoding', _('Packet encoding')); - o.value('', _('none')); - o.value('packetaddr', _('packet addr (v2ray-core v5+)')); - o.value('xudp', _('Xudp (Xray-core)')); - o.depends('type', 'vless'); - o.depends('type', 'vmess'); - o.modalonly = true; + hp.renderTransportOptions(s, { features: features, side: 'client' }); /* Transport config end */ /* Wireguard config start */ @@ -1599,75 +919,53 @@ function renderNodeSettings(section, data, features, main_node, routing_mode, no o.modalonly = true; /* Mux config end */ + /* Snell config start */ + o = s.option(form.ListValue, 'snell_version', _('Snell version'), + _('sing-box implements Snell v4/v5 wire as v4 and v6. The pre-shared key (Password above) must be 12-255 bytes for v6.')); + o.value('4', _('v4')); + o.value('6', _('v6')); + o.default = '4'; + o.depends('type', 'snell'); + o.modalonly = true; + + o = s.option(form.Value, 'snell_userkey', _('User key'), + _('Optional; only required when connecting to a multi-user Snell server.')); + o.depends('type', 'snell'); + o.modalonly = true; + + o = s.option(form.Flag, 'snell_reuse', _('Connection reuse'), + _('Enable connection reuse (the Snell v2 CONNECT command).')); + o.depends('type', 'snell'); + o.modalonly = true; + + o = s.option(form.ListValue, 'snell_obfs_mode', _('Obfuscation mode'), + _('HTTP obfuscation. v4 only.')); + o.value('', _('none')); + o.value('http', _('http')); + o.depends({'type': 'snell', 'snell_version': '4'}); + o.modalonly = true; + + o = s.option(form.Value, 'snell_obfs_host', _('Obfuscation host'), + _('HTTP Host header sent when obfuscation mode is http. bing.com is used by default.')); + o.depends({'type': 'snell', 'snell_version': '4', 'snell_obfs_mode': 'http'}); + o.modalonly = true; + + o = s.option(form.ListValue, 'snell_mode', _('Traffic shaping mode'), + _('v6 only.')); + o.value('', _('default')); + o.value('unshaped', _('unshaped')); + o.value('unsafe-raw', _('unsafe-raw')); + o.depends({'type': 'snell', 'snell_version': '6'}); + o.modalonly = true; + /* Snell config end */ + /* TLS config start */ - o = s.option(form.Flag, 'tls', _('TLS')); - o.depends('type', 'anytls'); - o.depends('type', 'http'); - o.depends('type', 'hysteria'); - o.depends('type', 'hysteria2'); - o.depends('type', 'shadowtls'); - o.depends('type', 'trojan'); - o.depends('type', 'tuic'); - o.depends('type', 'vless'); - o.depends('type', 'vmess'); - o.validate = function(section_id, _value) { - if (section_id) { - let type = this.map.lookupOption('type', section_id)[0].formvalue(section_id); - let tls = this.map.findElement('id', 'cbid.homeproxy.%s.tls'.format(section_id)).firstElementChild; - - if (['anytls', 'hysteria', 'hysteria2', 'shadowtls', 'tuic'].includes(type)) { - tls.checked = true; - tls.disabled = true; - } else { - tls.disabled = null; - } - } - - return true; - } - o.modalonly = true; - - o = s.option(form.Value, 'tls_sni', _('TLS SNI'), - _('Used to verify the hostname on the returned certificates unless insecure is given.')); - o.depends('tls', '1'); - o.modalonly = true; - - o = s.option(form.DynamicList, 'tls_alpn', _('TLS ALPN'), - _('List of supported application level protocols, in order of preference.')); - o.depends('tls', '1'); - o.modalonly = true; - - o = s.option(form.Flag, 'tls_insecure', _('Allow insecure'), - _('Allow insecure connection at TLS client.') + - '
' + - _('This is DANGEROUS, your traffic is almost like PLAIN TEXT! Use at your own risk!')); - o.depends('tls', '1'); - o.onchange = allowInsecureConfirm; - o.modalonly = true; - - o = s.option(form.ListValue, 'tls_min_version', _('Minimum TLS version'), - _('The minimum TLS version that is acceptable.')); - o.value('', _('default')); - for (let i of hp.tls_versions) - o.value(i); - o.depends('tls', '1'); - o.modalonly = true; - - o = s.option(form.ListValue, 'tls_max_version', _('Maximum TLS version'), - _('The maximum TLS version that is acceptable.')); - o.value('', _('default')); - for (let i of hp.tls_versions) - o.value(i); - o.depends('tls', '1'); - o.modalonly = true; - - o = s.option(hp.CBIStaticList, 'tls_cipher_suites', _('Cipher suites'), - _('The elliptic curves that will be used in an ECDHE handshake, in preference order. If empty, the default will be used.')); - for (let i of hp.tls_cipher_suites) - o.value(i); - o.depends('tls', '1'); - o.optional = true; - o.modalonly = true; + hp.renderTlsOptions(s, { + side: 'client', + type_depends: [ 'anytls', 'http', 'hysteria', 'hysteria2', 'shadowtls', 'trojan', 'tuic', 'vless', 'vmess' ], + tls_forced_types: [ 'anytls', 'hysteria', 'hysteria2', 'shadowtls', 'tuic' ], + oninsecurechange: allowInsecureConfirm + }); o = s.option(form.Flag, 'tls_self_sign', _('Append self-signed certificate'), _('If you have the root certificate, use this option instead of allowing insecure.')); @@ -1794,18 +1092,19 @@ return view.extend({ }, render(data) { - let m, s, o, ss, so, subscription_list_option; + let m, s, o, ss, so; let main_node = uci.get(data[0], 'config', 'main_node'); let routing_mode = uci.get(data[0], 'config', 'routing_mode'); let features = data[1]; - let node_latency_row_state = createNodeLatencyRowStateModel(); - - hp.installCloseButtonText(); - - this.node_latency_row_state = node_latency_row_state; /* Cache subscription information, it will be called multiple times */ - let subinfo = getSubscriptionInfo(data[0]); + let subinfo = []; + for (let suburl of (uci.get(data[0], 'subscription', 'subscription_url') || [])) { + const url = new URL(suburl); + const urlhash = hp.calcStringMD5(suburl.replace(/#.*$/, '')); + const title = url.hash ? decodeURIComponent(url.hash.slice(1)) : url.hostname; + subinfo.push({ 'hash': urlhash, 'title': title }); + } m = new form.Map('homeproxy', _('Edit nodes')); @@ -1815,7 +1114,7 @@ return view.extend({ /* User nodes start */ s.tab('node', _('Nodes')); o = s.taboption('node', form.SectionValue, '_node', form.GridSection, 'node'); - ss = renderNodeSettings(o.subsection, data, features, main_node, routing_mode, node_latency_row_state); + ss = renderNodeSettings(o.subsection, data, features, main_node, routing_mode); ss.addremove = true; ss.filter = function(section_id) { for (let info of subinfo) @@ -1886,7 +1185,24 @@ return view.extend({ ]) } ss.renderSectionAdd = function(/* ... */) { - let el = hp.renderSectionAdd(this, arguments[0]); + let el = form.GridSection.prototype.renderSectionAdd.apply(this, arguments), + nameEl = el.querySelector('.cbi-section-create-name'); + + ui.addValidator(nameEl, 'uciname', true, (v) => { + let button = el.querySelector('.cbi-section-create > .cbi-button-add'); + let uciconfig = this.uciconfig || this.map.config; + + if (!v) { + button.disabled = true; + return true; + } else if (uci.get(uciconfig, v)) { + button.disabled = true; + return _('Expecting: %s').format(_('unique UCI identifier')); + } else { + button.disabled = null; + return true; + } + }, 'blur', 'keyup'); el.appendChild(E('button', { 'class': 'cbi-button cbi-button-add', @@ -1901,9 +1217,9 @@ return view.extend({ /* Subscription nodes start */ for (const info of subinfo) { - s.tab('sub_' + info.hash, info.title ? _('Sub (%s)').format(info.title) : _('Sub')); + s.tab('sub_' + info.hash, _('Sub (%s)').format(info.title)); o = s.taboption('sub_' + info.hash, form.SectionValue, '_sub_' + info.hash, form.GridSection, 'node'); - ss = renderNodeSettings(o.subsection, data, features, main_node, routing_mode, node_latency_row_state); + ss = renderNodeSettings(o.subsection, data, features, main_node, routing_mode); ss.filter = function(section_id) { return (uci.get(data[0], section_id, 'grouphash') === info.hash); } @@ -1918,35 +1234,32 @@ return view.extend({ _('Auto update subscriptions and geodata.')); o.rmempty = false; - o = s.taboption('subscription', form.Value, 'auto_update_time', _('Update time (weekly)')); - o.renderWidget = function() { - return hp.renderCronSelector.apply(this, arguments); - }; - o.default = '0 0 * * *'; - o.rmempty = false; - o.validate = function(section_id, value) { - value = value || this.formvalue(section_id); - const matched = String(value || '').trim().match(/^(\d{1,2})\s+(\d{1,2})\s+\*\s+\*\s+([0-7*])$/); - if (!matched || +matched[1] > 59 || +matched[2] > 23) - return _('Expecting: %s').format(_('valid cron expression')); - - return true; - }; + o = s.taboption('subscription', form.ListValue, 'auto_update_time', _('Update time')); + for (let i = 0; i < 24; i++) + o.value(i, i + ':00'); + o.default = '2'; + o.depends('auto_update', '1'); o = s.taboption('subscription', form.Flag, 'update_via_proxy', _('Update via proxy'), _('Update subscriptions via proxy.')); o.rmempty = false; - o = s.taboption('subscription', form.ListValue, 'latency_test_mode', _('Latency test mode'), - _('Choose which method node latency tests use.')); - o.value('icmp', _('ICMP')); - o.value('rp', _('RP')); - o.default = 'icmp'; - o.rmempty = false; - - o = s.taboption('subscription', SubscriptionList, 'subscription_url', _('Subscriptions'), + o = s.taboption('subscription', form.DynamicList, 'subscription_url', _('Subscription URL-s'), _('Support Hysteria, Shadowsocks, Trojan, v2rayN (VMess), and XTLS (VLESS) online configuration delivery standard.')); - subscription_list_option = o; + o.validate = function(section_id, value) { + if (section_id && value) { + try { + let url = new URL(value); + if (!url.hostname) + return _('Expecting: %s').format(_('valid URL')); + } + catch(e) { + return _('Expecting: %s').format(_('valid URL')); + } + } + + return true; + } o = s.taboption('subscription', form.ListValue, 'filter_nodes', _('Filter nodes'), _('Drop/keep specific nodes from subscriptions.')); @@ -1981,16 +1294,8 @@ return view.extend({ o.inputstyle = 'apply'; o.inputtitle = _('Save current settings'); o.onclick = function() { - const validation = subscription_list_option.validate('subscription', subscription_list_option.formvalue('subscription')); - if (validation !== true) { - ui.addNotification(null, E('p', validation)); - return Promise.resolve(); - } - return this.map.save(null, true).then(() => { - return ui.changes.apply(true); - }).then(() => { - return callRCInit('homeproxy', 'reload'); + ui.changes.apply(true); }); } @@ -2053,68 +1358,6 @@ return view.extend({ } /* Subscriptions settings end */ - return m.render().then((el) => { - let bulk_testing = false; - let tabmenu_observer = null; - let bulk_button = E('button', { - 'class': 'cbi-button cbi-button-action hp-bulk-latency-test', - 'click': ui.createHandlerFn(this, async () => { - if (bulk_testing || typeof globalThis === 'undefined' || !globalThis.__hpNodeLatencyTrigger) - return false; - - let section_ids = getActiveSubscriptionLatencySectionIds(el); - if (!section_ids.length) - return false; - - bulk_testing = true; - bulk_button.textContent = _('Testing Current List...'); - bulk_button.disabled = true; - - for (let sid of section_ids) - await globalThis.__hpNodeLatencyTrigger(sid); - - bulk_testing = false; - bulk_button.textContent = _('Test Current List'); - bulk_button.disabled = false; - return true; - }) - }, [ _('Test Current List') ]); - - let updateBulkButtonVisibility = () => { - bulk_button.style.display = shouldShowBulkLatencyButton(el) ? '' : 'none'; - }; - - let attachBulkButton = () => { - let actions = (el.parentElement ? el.parentElement.querySelector('.cbi-page-actions') : null) || document.querySelector('.cbi-page-actions'); - if (!actions) - return false; - - if (!actions.querySelector('.hp-bulk-latency-test')) - actions.insertBefore(bulk_button, actions.firstChild); - - updateBulkButtonVisibility(); - - if (!tabmenu_observer) { - let tabmenu = el.querySelector('.cbi-tabmenu'); - if (tabmenu) { - tabmenu_observer = new MutationObserver(() => updateBulkButtonVisibility()); - tabmenu_observer.observe(tabmenu, { - subtree: true, - attributes: true, - attributeFilter: [ 'class', 'aria-selected' ] - }); - } - } - - return true; - }; - - if (!attachBulkButton()) { - window.setTimeout(attachBulkButton, 0); - window.setTimeout(attachBulkButton, 300); - } - - return el; - }); + return m.render(); } }); diff --git a/luci-app-homeproxy/htdocs/luci-static/resources/view/homeproxy/server.js b/luci-app-homeproxy/htdocs/luci-static/resources/view/homeproxy/server.js index e807ee579..da6e43ffe 100644 --- a/luci-app-homeproxy/htdocs/luci-static/resources/view/homeproxy/server.js +++ b/luci-app-homeproxy/htdocs/luci-static/resources/view/homeproxy/server.js @@ -126,8 +126,6 @@ return view.extend({ let m, s, o; let features = data[1]; - hp.installCloseButtonText(); - m = new form.Map('homeproxy', _('HomeProxy Server'), _('The modern ImmortalWrt proxy platform for ARM64/AMD64.')); @@ -184,13 +182,13 @@ return view.extend({ } o.value('mixed', _('Mixed')); o.value('shadowsocks', _('Shadowsocks')); + o.value('snell', _('Snell (1.14)')); o.value('socks', _('Socks')); o.value('trojan', _('Trojan')); if (features.with_quic) o.value('tuic', _('Tuic')); o.value('vless', _('VLESS')); o.value('vmess', _('VMess')); - o.default = 'mixed'; o.rmempty = false; o = s.option(form.Value, 'address', _('Listen address')); @@ -216,12 +214,13 @@ return view.extend({ o.depends({'type': /^(http|mixed|naive|socks)$/, 'username': /[\s\S]/}); o.depends('type', 'hysteria2'); o.depends('type', 'shadowsocks'); + o.depends('type', 'snell'); o.depends('type', 'trojan'); o.depends('type', 'tuic'); o.validate = function(section_id, value) { if (section_id) { let type = this.section.formvalue(section_id, 'type'); - let required_type = [ 'anytls', 'http', 'mixed', 'naive', 'socks', 'shadowsocks', 'trojan' ]; + let required_type = [ 'anytls', 'http', 'mixed', 'naive', 'shadowsocks', 'snell', 'socks', 'trojan' ]; if (required_type.includes(type)) { if (type === 'shadowsocks') { @@ -291,6 +290,7 @@ return view.extend({ o = s.option(form.ListValue, 'hysteria_obfs_type', _('Obfuscate type')); o.value('', _('Disable')); o.value('salamander', _('Salamander')); + o.value('gecko', _('Gecko (1.14)')); o.depends('type', 'hysteria2'); o.modalonly = true; @@ -300,30 +300,18 @@ return view.extend({ o.depends({'type': 'hysteria2', 'hysteria_obfs_type': /[\s\S]/}); o.modalonly = true; - o = s.option(form.Value, 'hysteria_recv_window_conn', _('QUIC stream receive window'), - _('The QUIC stream-level flow control window for receiving data.')); + o = s.option(form.Value, 'hysteria_obfs_min_packet_size', _('Min obfs packet size (1.14)'), + _('Minimum on-wire packet size in bytes. Gecko only.')); o.datatype = 'uinteger'; - o.default = '67108864'; - o.depends('type', 'hysteria'); + o.placeholder = '512'; + o.depends({'type': 'hysteria2', 'hysteria_obfs_type': 'gecko'}); o.modalonly = true; - o = s.option(form.Value, 'hysteria_recv_window_client', _('QUIC connection receive window'), - _('The QUIC connection-level flow control window for receiving data.')); + o = s.option(form.Value, 'hysteria_obfs_max_packet_size', _('Max obfs packet size (1.14)'), + _('Maximum on-wire packet size in bytes. Gecko only.')); o.datatype = 'uinteger'; - o.default = '15728640'; - o.depends('type', 'hysteria'); - o.modalonly = true; - - o = s.option(form.Value, 'hysteria_max_conn_client', _('QUIC maximum concurrent bidirectional streams'), - _('The maximum number of QUIC concurrent bidirectional streams that a peer is allowed to open.')); - o.datatype = 'uinteger'; - o.default = '1024'; - o.depends('type', 'hysteria'); - o.modalonly = true; - - o = s.option(form.Flag, 'hysteria_disable_mtu_discovery', _('Disable Path MTU discovery'), - _('Disables Path MTU Discovery (RFC 8899). Packets will then be at most 1252 (IPv4) / 1232 (IPv6) bytes in size.')); - o.depends('type', 'hysteria'); + o.placeholder = '1200'; + o.depends({'type': 'hysteria2', 'hysteria_obfs_type': 'gecko'}); o.modalonly = true; o = s.option(form.Flag, 'hysteria_ignore_client_bandwidth', _('Ignore client bandwidth'), @@ -337,6 +325,31 @@ return view.extend({ o.modalonly = true; /* Hysteria (2) config end */ + /* Snell config start */ + o = s.option(form.ListValue, 'snell_version', _('Snell version'), + _('The pre-shared key (password) above must be 12-255 bytes for v6.')); + o.value('5', _('v5')); + o.value('6', _('v6')); + o.default = '5'; + o.depends('type', 'snell'); + o.modalonly = true; + + o = s.option(form.ListValue, 'snell_obfs_mode', _('Obfuscation mode'), + _('HTTP obfuscation. v5 only.')); + o.value('', _('none')); + o.value('http', _('http')); + o.depends({'type': 'snell', 'snell_version': '5'}); + o.modalonly = true; + + o = s.option(form.ListValue, 'snell_mode', _('Traffic shaping mode'), + _('v6 only.')); + o.value('', _('default')); + o.value('unshaped', _('unshaped')); + o.value('unsafe-raw', _('unsafe-raw')); + o.depends({'type': 'snell', 'snell_version': '6'}); + o.modalonly = true; + /* Snell config end */ + /* Shadowsocks config */ o = s.option(form.ListValue, 'shadowsocks_encrypt_method', _('Encrypt method')); for (let i of hp.shadowsocks_encrypt_methods) @@ -399,104 +412,7 @@ return view.extend({ /* VMess config end */ /* Transport config start */ - o = s.option(form.ListValue, 'transport', _('Transport'), - _('No TCP transport, plain HTTP is merged into the HTTP transport.')); - o.value('', _('None')); - o.value('grpc', _('gRPC')); - o.value('http', _('HTTP')); - o.value('httpupgrade', _('HTTPUpgrade')); - o.value('quic', _('QUIC')); - o.value('ws', _('WebSocket')); - o.depends('type', 'trojan'); - o.depends('type', 'vless'); - o.depends('type', 'vmess'); - o.onchange = function(ev, section_id, value) { - let desc = this.map.findElement('id', 'cbid.homeproxy.%s.transport'.format(section_id)).nextElementSibling; - if (value === 'http') - desc.innerHTML = _('TLS is not enforced. If TLS is not configured, plain HTTP 1.1 is used.'); - else if (value === 'quic') - desc.innerHTML = _('No additional encryption support: It\'s basically duplicate encryption.'); - else - desc.innerHTML = _('No TCP transport, plain HTTP is merged into the HTTP transport.'); - - let tls_element = this.map.findElement('id', 'cbid.homeproxy.%s.tls'.format(section_id)).firstElementChild; - if ((value === 'http' && tls_element.checked) || (value === 'grpc' && !features.with_grpc)) - this.map.findElement('id', 'cbid.homeproxy.%s.http_idle_timeout'.format(section_id)).nextElementSibling.innerHTML = - _('Specifies the time (in seconds) until idle clients should be closed with a GOAWAY frame. PING frames are not considered as activity.'); - else if (value === 'grpc' && features.with_grpc) - this.map.findElement('id', 'cbid.homeproxy.%s.http_idle_timeout'.format(section_id)).nextElementSibling.innerHTML = - _('If the transport doesn\'t see any activity after a duration of this time (in seconds), it pings the client to check if the connection is still active.'); - } - o.modalonly = true; - - /* gRPC config start */ - o = s.option(form.Value, 'grpc_servicename', _('gRPC service name')); - o.depends('transport', 'grpc'); - o.modalonly = true; - - /* gRPC config end */ - - /* HTTP(Upgrade) config start */ - o = s.option(form.DynamicList, 'http_host', _('Host')); - o.datatype = 'hostname'; - o.depends('transport', 'http'); - o.modalonly = true; - - o = s.option(form.Value, 'httpupgrade_host', _('Host')); - o.datatype = 'hostname'; - o.depends('transport', 'httpupgrade'); - o.modalonly = true; - - o = s.option(form.Value, 'http_path', _('Path')); - o.depends('transport', 'http'); - o.depends('transport', 'httpupgrade'); - o.modalonly = true; - - o = s.option(form.Value, 'http_method', _('Method')); - o.depends('transport', 'http'); - o.modalonly = true; - - o = s.option(form.Value, 'http_idle_timeout', _('Idle timeout'), - _('Specifies the time (in seconds) until idle clients should be closed with a GOAWAY frame. PING frames are not considered as activity.')); - o.datatype = 'uinteger'; - o.depends('transport', 'grpc'); - o.depends({'transport': 'http', 'tls': '1'}); - o.modalonly = true; - - if (features.with_grpc) { - o = s.option(form.Value, 'http_ping_timeout', _('Ping timeout'), - _('The timeout (in seconds) that after performing a keepalive check, the client will wait for activity. If no activity is detected, the connection will be closed.')); - o.datatype = 'uinteger'; - o.depends('transport', 'grpc'); - o.modalonly = true; - } - /* HTTP config end */ - - /* WebSocket config start */ - o = s.option(form.Value, 'ws_host', _('Host')); - o.depends('transport', 'ws'); - o.modalonly = true; - - o = s.option(form.Value, 'ws_path', _('Path')); - o.depends('transport', 'ws'); - o.modalonly = true; - - o = s.option(form.Value, 'websocket_early_data', _('Early data'), - _('Allowed payload size is in the request.')); - o.datatype = 'uinteger'; - o.value('2048'); - o.depends('transport', 'ws'); - o.modalonly = true; - - o = s.option(form.Value, 'websocket_early_data_header', _('Early data header name'), - _('Early data is sent in path instead of header by default.') + - '
' + - _('To be compatible with Xray-core, set this to Sec-WebSocket-Protocol.')); - o.value('Sec-WebSocket-Protocol'); - o.depends('transport', 'ws'); - o.modalonly = true; - /* WebSocket config end */ - + hp.renderTransportOptions(s, { features: features, side: 'server' }); /* Transport config end */ /* Mux config start */ @@ -532,67 +448,11 @@ return view.extend({ /* Mux config end */ /* TLS config start */ - o = s.option(form.Flag, 'tls', _('TLS')); - o.depends('type', 'anytls'); - o.depends('type', 'http'); - o.depends('type', 'hysteria'); - o.depends('type', 'hysteria2'); - o.depends('type', 'naive'); - o.depends('type', 'trojan'); - o.depends('type', 'tuic'); - o.depends('type', 'vless'); - o.depends('type', 'vmess'); - o.rmempty = false; - o.validate = function(section_id, value) { - if (section_id) { - let type = this.map.lookupOption('type', section_id)[0].formvalue(section_id); - let tls = this.map.findElement('id', 'cbid.homeproxy.%s.tls'.format(section_id)).firstElementChild; - - if (['hysteria', 'hysteria2', 'tuic'].includes(type)) { - tls.checked = true; - tls.disabled = true; - } else { - tls.disabled = null; - } - } - - return true; - } - o.modalonly = true; - - o = s.option(form.Value, 'tls_sni', _('TLS SNI'), - _('Used to verify the hostname on the returned certificates unless insecure is given.')); - o.depends('tls', '1'); - o.modalonly = true; - - o = s.option(form.DynamicList, 'tls_alpn', _('TLS ALPN'), - _('List of supported application level protocols, in order of preference.')); - o.depends('tls', '1'); - o.modalonly = true; - - o = s.option(form.ListValue, 'tls_min_version', _('Minimum TLS version'), - _('The minimum TLS version that is acceptable.')); - o.value('', _('default')); - for (let i of hp.tls_versions) - o.value(i); - o.depends('tls', '1'); - o.modalonly = true; - - o = s.option(form.ListValue, 'tls_max_version', _('Maximum TLS version'), - _('The maximum TLS version that is acceptable.')); - o.value('', _('default')); - for (let i of hp.tls_versions) - o.value(i); - o.depends('tls', '1'); - o.modalonly = true; - - o = s.option(hp.CBIStaticList, 'tls_cipher_suites', _('Cipher suites'), - _('The elliptic curves that will be used in an ECDHE handshake, in preference order. If empty, the default will be used.')); - for (let i of hp.tls_cipher_suites) - o.value(i); - o.depends('tls', '1'); - o.optional = true; - o.modalonly = true; + hp.renderTlsOptions(s, { + side: 'server', + type_depends: [ 'anytls', 'http', 'hysteria', 'hysteria2', 'naive', 'trojan', 'tuic', 'vless', 'vmess' ], + tls_forced_types: [ 'hysteria', 'hysteria2', 'tuic' ] + }); if (features.with_acme) { o = s.option(form.Flag, 'tls_acme', _('Enable ACME'), @@ -627,6 +487,29 @@ return view.extend({ } o.modalonly = true; + o = s.option(form.Value, 'tls_acme_key_type', _('ACME key type'), + _('Private key type for new certificates (1.14). Empty uses the default.')); + o.value('ed25519'); + o.value('p256'); + o.value('p384'); + o.value('rsa2048'); + o.value('rsa4096'); + o.depends('tls_acme', '1'); + o.modalonly = true; + + o = s.option(form.Value, 'tls_acme_profile', _('ACME profile'), + _('ACME profile for certificate issuance (1.14). Example: shortlived.')); + o.placeholder = 'shortlived'; + o.depends('tls_acme', '1'); + o.modalonly = true; + + o = s.option(form.TextValue, 'tls_acme_account_key', _('ACME account key'), + _('PEM-encoded private key of an existing ACME account (1.14).')); + o.monospace = true; + o.rows = 3; + o.depends('tls_acme', '1'); + o.modalonly = true; + o = s.option(form.Value, 'tls_acme_provider', _('CA provider'), _('The ACME CA provider to use.')); o.value('letsencrypt', _('Let\'s Encrypt')); @@ -640,10 +523,10 @@ return view.extend({ o.modalonly = true; o = s.option(form.ListValue, 'tls_dns01_provider', _('DNS provider')); - o.value('alidns', _('AliYun')); - o.value('cfdns', _('CloudFlare')); + o.value('alidns', _('Alibaba Cloud DNS')); + o.value('cloudflare', _('Cloudflare')); o.depends('tls_dns01_challenge', '1'); - o.default = 'cfdns'; + o.default = 'cloudflare'; o.rmempty = false; o.modalonly = true; @@ -666,7 +549,7 @@ return view.extend({ o = s.option(form.Value, 'tls_dns01_cf_api_token', _('API token')); o.password = true; - o.depends('tls_dns01_provider', 'cfdns'); + o.depends('tls_dns01_provider', 'cloudflare'); o.rmempty = false; o.modalonly = true; diff --git a/luci-app-homeproxy/htdocs/luci-static/resources/view/homeproxy/status.js b/luci-app-homeproxy/htdocs/luci-static/resources/view/homeproxy/status.js index 3f2e801ca..f8a617000 100644 --- a/luci-app-homeproxy/htdocs/luci-static/resources/view/homeproxy/status.js +++ b/luci-app-homeproxy/htdocs/luci-static/resources/view/homeproxy/status.js @@ -14,8 +14,6 @@ 'require ui'; 'require view'; -'require homeproxy as hp'; - /* Thanks to luci-app-aria2 */ const css = ' \ #log_textarea { \ @@ -29,53 +27,6 @@ const css = ' \ } \ .description { \ background-color: #33ccff; \ -} \ -.homeproxy-connect-grid { \ - display: grid; \ - grid-template-columns: repeat(auto-fit, minmax(210px, 1fr));\ - gap: 12px; \ -} \ -.homeproxy-connect-card { \ - display: grid; \ - grid-template-columns: 44px 1fr; \ - gap: 10px; \ - align-items: center; \ - min-height: 64px; \ - padding: 8px 10px; \ - border-radius: 6px; \ - background: #fff; \ - box-shadow: 0 1px 4px rgba(0, 0, 0, .08);\ -} \ -.homeproxy-connect-icon { \ - display: flex; \ - align-items: center; \ - justify-content: center; \ - width: 38px; \ - height: 38px; \ - border-radius: 50%; \ - color: #fff; \ - font-weight: 700; \ - font-size: 15px; \ -} \ -.homeproxy-connect-info { \ - min-height: 42px; \ - padding: 7px 12px; \ - border-radius: 8px; \ - background: #e9edf2; \ -} \ -.homeproxy-connect-title { \ - color: #7d8aa0; \ - font-weight: 700; \ - font-size: 13px; \ - line-height: 1.2; \ -} \ -.homeproxy-connect-result { \ - margin-top: 2px; \ - color: #ff4d35; \ - font-weight: 700; \ - font-size: 13px; \ - cursor: pointer; \ - line-height: 1.2; \ }'; const hp_dir = '/var/run/homeproxy'; @@ -93,13 +44,13 @@ function getConnStat(o, site) { 'class': 'btn cbi-button cbi-button-action', 'click': ui.createHandlerFn(this, () => { return L.resolveDefault(callConnStat(site), {}).then((ret) => { - let ele = o.default.firstElementChild.nextElementSibling; + let ele = o.default.firstElementChild.nextElementSibling; if (ret.result) { ele.style.setProperty('color', 'green'); - ele.innerHTML = _('passed'); + ele.innerHTML = _('passed'); } else { ele.style.setProperty('color', 'red'); - ele.innerHTML = _('failed'); + ele.innerHTML = _('failed'); } }); }) @@ -109,53 +60,6 @@ function getConnStat(o, site) { ]); } -function renderConnCards() { - const callConnStat = rpc.declare({ - object: 'luci.homeproxy', - method: 'connection_check', - params: ['site'], - expect: { '': {} } - }); - - const items = [ - { site: 'baidu', title: _('Baidu Connection'), icon: 'B', color: '#ff7a00' }, - { site: 'google', title: _('Google Connection'), icon: 'G', color: '#4285f4' }, - { site: 'github', title: _('GitHub Connection'), icon: 'GH', color: '#7b3bb3' }, - { site: 'youtube', title: _('YouTube Connection'), icon: 'YT', color: '#ff0033' } - ]; - - return E('div', { 'class': 'homeproxy-connect-grid' }, items.map((item) => { - let result = E('div', { - 'class': 'homeproxy-connect-result', - 'click': ui.createHandlerFn(this, () => { - result.textContent = _('Checking...'); - result.style.setProperty('color', '#f0ad4e'); - - return L.resolveDefault(callConnStat(item.site), {}).then((ret) => { - if (ret.result && ret.latency != null) { - result.style.setProperty('color', 'green'); - result.textContent = _('%s ms').format(ret.latency); - } else { - result.style.setProperty('color', '#ff4d35'); - result.textContent = _('failed'); - } - }); - }) - }, [ _('Click to check') ]); - - return E('div', { 'class': 'homeproxy-connect-card' }, [ - E('div', { - 'class': 'homeproxy-connect-icon', - 'style': 'background:%s'.format(item.color) - }, [ item.icon ]), - E('div', { 'class': 'homeproxy-connect-info' }, [ - E('div', { 'class': 'homeproxy-connect-title' }, [ item.title ]), - result - ]) - ]); - })); -} - function getResVersion(o, type) { const callResVersion = rpc.declare({ object: 'luci.homeproxy', @@ -323,16 +227,16 @@ return view.extend({ render() { let m, s, o; - hp.installCloseButtonText(); - m = new form.Map('homeproxy'); s = m.section(form.NamedSection, 'config', 'homeproxy', _('Connection check')); s.anonymous = true; - o = s.option(form.DummyValue, '_connection_check'); - o.rawhtml = true; - o.render = renderConnCards; + o = s.option(form.DummyValue, '_check_baidu', _('BaiDu')); + o.cfgvalue = L.bind(getConnStat, this, o, 'baidu'); + + o = s.option(form.DummyValue, '_check_google', _('Google')); + o.cfgvalue = L.bind(getConnStat, this, o, 'google'); s = m.section(form.NamedSection, 'config', 'homeproxy', _('Resources management')); s.anonymous = true; diff --git a/luci-app-homeproxy/po/templates/homeproxy.pot b/luci-app-homeproxy/po/templates/homeproxy.pot index daea34056..984d0b4fd 100644 --- a/luci-app-homeproxy/po/templates/homeproxy.pot +++ b/luci-app-homeproxy/po/templates/homeproxy.pot @@ -1,19 +1,11 @@ msgid "" msgstr "Content-Type: text/plain; charset=UTF-8" -#: htdocs/luci-static/resources/homeproxy.js:321 -msgid "Close" -msgstr "" - #: htdocs/luci-static/resources/view/homeproxy/status.js:206 msgid "%s log" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:500 -msgid "%s ms" -msgstr "" - -#: htdocs/luci-static/resources/view/homeproxy/node.js:1896 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1542 msgid "%s nodes removed" msgstr "" @@ -21,78 +13,92 @@ msgstr "" msgid "/etc/homeproxy/certs/..., /etc/acme/..., /etc/ssl/..." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:632 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1287 +msgid "" +"1 matches the latest untagged evaluate result; other values match an " +"evaluate tag (1.14)." +msgstr "" + +#: htdocs/luci-static/resources/view/homeproxy/client.js:657 msgid "4 or 6. Not limited if empty." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:798 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1233 +#: htdocs/luci-static/resources/view/homeproxy/client.js:842 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1354 msgid "" "%s will be temporarily overwritten to %s after 50 " "triggers in 30s if not enabled." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1516 -#: htdocs/luci-static/resources/view/homeproxy/node.js:1535 -#: htdocs/luci-static/resources/view/homeproxy/server.js:768 -#: htdocs/luci-static/resources/view/homeproxy/server.js:787 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1172 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1191 +#: htdocs/luci-static/resources/view/homeproxy/server.js:807 +#: htdocs/luci-static/resources/view/homeproxy/server.js:826 msgid "Save your configuration before uploading files!" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/server.js:664 -msgid "API token" +#: htdocs/luci-static/resources/view/homeproxy/server.js:659 +msgid "ACME account key" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1100 -msgid "Accept any if empty." -msgstr "" - -#: htdocs/luci-static/resources/view/homeproxy/client.js:1161 -msgid "Accept empty query response" -msgstr "" - -#: htdocs/luci-static/resources/view/homeproxy/client.js:1422 -msgid "Access Control" -msgstr "" - -#: htdocs/luci-static/resources/view/homeproxy/server.js:647 -msgid "Access key ID" +#: htdocs/luci-static/resources/view/homeproxy/server.js:643 +msgid "ACME key type" msgstr "" #: htdocs/luci-static/resources/view/homeproxy/server.js:653 +msgid "ACME profile" +msgstr "" + +#: htdocs/luci-static/resources/view/homeproxy/server.js:654 +msgid "ACME profile for certificate issuance (1.14). Example: shortlived." +msgstr "" + +#: htdocs/luci-static/resources/view/homeproxy/server.js:703 +msgid "API token" +msgstr "" + +#: htdocs/luci-static/resources/view/homeproxy/node.js:709 +msgid "Accept any if empty." +msgstr "" + +#: htdocs/luci-static/resources/view/homeproxy/client.js:1586 +msgid "Access Control" +msgstr "" + +#: htdocs/luci-static/resources/view/homeproxy/server.js:686 +msgid "Access key ID" +msgstr "" + +#: htdocs/luci-static/resources/view/homeproxy/server.js:692 msgid "Access key secret" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:692 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1169 +#: htdocs/luci-static/resources/view/homeproxy/client.js:717 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1235 msgid "Action" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:210 -msgid "AdGuard Public DNS (DoH)" -msgstr "" - -#: htdocs/luci-static/resources/view/homeproxy/client.js:1079 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1149 msgid "Add a DNS rule" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:956 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1026 msgid "Add a DNS server" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:719 +#: htdocs/luci-static/resources/view/homeproxy/node.js:416 msgid "Add a node" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:428 +#: htdocs/luci-static/resources/view/homeproxy/client.js:453 msgid "Add a routing node" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:599 +#: htdocs/luci-static/resources/view/homeproxy/client.js:624 msgid "Add a routing rule" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1343 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1482 msgid "Add a rule set" msgstr "" @@ -100,32 +106,47 @@ msgstr "" msgid "Add a server" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:998 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1068 msgid "Additional headers to be sent to the DNS server." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:980 -#: htdocs/luci-static/resources/view/homeproxy/node.js:878 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1050 +#: htdocs/luci-static/resources/view/homeproxy/node.js:468 msgid "Address" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1011 +#: htdocs/luci-static/resources/view/homeproxy/client.js:325 +#: htdocs/luci-static/resources/view/homeproxy/client.js:336 +msgid "Address and port dependent" +msgstr "" + +#: htdocs/luci-static/resources/view/homeproxy/client.js:324 +#: htdocs/luci-static/resources/view/homeproxy/client.js:335 +msgid "Address dependent" +msgstr "" + +#: htdocs/luci-static/resources/view/homeproxy/client.js:1081 msgid "Address resolver" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1043 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1113 msgid "Address strategy" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/server.js:640 -msgid "AliYun" +#: htdocs/luci-static/resources/view/homeproxy/node.js:640 +msgid "Aggressive" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:246 -msgid "AliYun Public DNS (DoH)" +#: htdocs/luci-static/resources/view/homeproxy/server.js:679 +msgid "Alibaba Cloud DNS" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:289 +#: htdocs/luci-static/resources/view/homeproxy/client.js:186 +#: htdocs/luci-static/resources/view/homeproxy/client.js:220 +msgid "Aliyun Public DNS (223.5.5.5)" +msgstr "" + +#: htdocs/luci-static/resources/view/homeproxy/client.js:266 msgid "All ports" msgstr "" @@ -133,21 +154,21 @@ msgstr "" msgid "Allow access from the Internet." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1470 -#: htdocs/luci-static/resources/view/homeproxy/node.js:1822 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1119 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1468 msgid "Allow insecure" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1471 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1120 msgid "Allow insecure connection at TLS client." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1823 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1469 msgid "Allow insecure connection by default when add nodes from subscriptions." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1304 -#: htdocs/luci-static/resources/view/homeproxy/server.js:482 +#: htdocs/luci-static/resources/view/homeproxy/node.js:913 +#: htdocs/luci-static/resources/view/homeproxy/server.js:498 msgid "Allowed payload size is in the request." msgstr "" @@ -159,175 +180,183 @@ msgstr "" msgid "Already in updating." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1172 -#: htdocs/luci-static/resources/view/homeproxy/server.js:391 +#: htdocs/luci-static/resources/view/homeproxy/node.js:781 +#: htdocs/luci-static/resources/view/homeproxy/server.js:407 msgid "Alter ID" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/server.js:678 +#: htdocs/luci-static/resources/view/homeproxy/server.js:717 msgid "Alternative HTTP port" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/server.js:684 +#: htdocs/luci-static/resources/view/homeproxy/server.js:723 msgid "Alternative TLS port" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1859 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1505 msgid "An error occurred during updating subscriptions: %s" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1250 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1371 msgid "Answer" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:859 +#: htdocs/luci-static/resources/view/homeproxy/node.js:449 #: htdocs/luci-static/resources/view/homeproxy/server.js:176 msgid "AnyTLS" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/server.js:245 +#: htdocs/luci-static/resources/view/homeproxy/server.js:247 msgid "AnyTLS padding scheme in array." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:822 -#: htdocs/luci-static/resources/view/homeproxy/client.js:932 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1218 +#: htdocs/luci-static/resources/view/homeproxy/client.js:866 +#: htdocs/luci-static/resources/view/homeproxy/client.js:992 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1279 msgid "" "Append a edns0-subnet OPT extra record with the specified IP " "prefix to every query by default.
If value is an IP address instead of " "prefix, /32 or /128 will be appended automatically." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1502 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1158 msgid "Append self-signed certificate" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:802 +#: htdocs/luci-static/resources/view/homeproxy/node.js:427 msgid "Applied" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:795 -#: htdocs/luci-static/resources/view/homeproxy/node.js:805 +#: htdocs/luci-static/resources/view/homeproxy/node.js:420 +#: htdocs/luci-static/resources/view/homeproxy/node.js:430 msgid "Apply" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:26 +#: htdocs/luci-static/resources/view/homeproxy/node.js:18 msgid "Are you sure to allow insecure?" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/server.js:363 +#: htdocs/luci-static/resources/view/homeproxy/server.js:379 msgid "Auth timeout" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1196 +#: htdocs/luci-static/resources/view/homeproxy/node.js:805 msgid "Authenticated length" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:991 -#: htdocs/luci-static/resources/view/homeproxy/server.js:282 +#: htdocs/luci-static/resources/view/homeproxy/node.js:589 +#: htdocs/luci-static/resources/view/homeproxy/server.js:284 msgid "Authentication payload" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:984 -#: htdocs/luci-static/resources/view/homeproxy/server.js:275 +#: htdocs/luci-static/resources/view/homeproxy/node.js:582 +#: htdocs/luci-static/resources/view/homeproxy/server.js:277 msgid "Authentication type" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:703 -msgid "Auto select" -msgstr "" - -#: htdocs/luci-static/resources/view/homeproxy/node.js:1768 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1421 msgid "Auto update" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1769 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1422 msgid "Auto update subscriptions and geodata." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1132 +#: htdocs/luci-static/resources/view/homeproxy/node.js:741 msgid "BBR" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:472 -msgid "Backend execution failed" +#: htdocs/luci-static/resources/view/homeproxy/node.js:637 +msgid "BBR congestion control algorithm profile. Hysteria2 only." +msgstr "" + +#: htdocs/luci-static/resources/view/homeproxy/node.js:636 +msgid "BBR profile (1.14)" msgstr "" #: htdocs/luci-static/resources/view/homeproxy/status.js:235 msgid "BaiDu" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:986 -#: htdocs/luci-static/resources/view/homeproxy/server.js:277 +#: htdocs/luci-static/resources/view/homeproxy/node.js:584 +#: htdocs/luci-static/resources/view/homeproxy/server.js:279 msgid "Base64" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:346 +#: htdocs/luci-static/resources/view/homeproxy/client.js:372 msgid "Based on google/gvisor." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1364 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1503 msgid "Binary file" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:476 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1435 -#: htdocs/luci-static/resources/view/homeproxy/server.js:874 +#: htdocs/luci-static/resources/view/homeproxy/client.js:501 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1599 +#: htdocs/luci-static/resources/view/homeproxy/server.js:913 msgid "Bind interface" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1436 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1600 msgid "" "Bind outbound traffic to specific interface. Leave empty to auto detect." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:640 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1129 +#: htdocs/luci-static/resources/view/homeproxy/client.js:665 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1199 msgid "BitTorrent" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1809 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1455 msgid "Blacklist mode" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:388 +#: htdocs/luci-static/resources/view/homeproxy/client.js:413 msgid "Block" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:635 -#: htdocs/luci-static/resources/view/homeproxy/client.js:663 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1115 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1125 -#: htdocs/luci-static/resources/view/homeproxy/server.js:869 +#: htdocs/luci-static/resources/view/homeproxy/client.js:660 +#: htdocs/luci-static/resources/view/homeproxy/client.js:688 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1185 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1195 +#: htdocs/luci-static/resources/view/homeproxy/server.js:908 msgid "Both" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:366 +#: htdocs/luci-static/resources/view/homeproxy/client.js:392 msgid "Bypass CN traffic" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:276 +#: htdocs/luci-static/resources/view/homeproxy/client.js:253 msgid "Bypass mainland China" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:367 +#: htdocs/luci-static/resources/view/homeproxy/client.js:393 msgid "Bypass mainland China traffic via firewall rules by default." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/server.js:627 +#: htdocs/luci-static/resources/view/homeproxy/server.js:666 msgid "CA provider" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1130 +#: htdocs/luci-static/resources/view/homeproxy/client.js:301 +msgid "CN-IP DNS fallback (sing-box 1.14)" +msgstr "" + +#: htdocs/luci-static/resources/view/homeproxy/client.js:221 +msgid "CNNIC Public DNS (210.2.4.8)" +msgstr "" + +#: htdocs/luci-static/resources/view/homeproxy/node.js:739 msgid "CUBIC" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1672 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1325 msgid "Cancel" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1507 -#: htdocs/luci-static/resources/view/homeproxy/server.js:756 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1163 +#: htdocs/luci-static/resources/view/homeproxy/server.js:795 msgid "Certificate path" msgstr "" @@ -339,7 +368,7 @@ msgstr "" msgid "Check update" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:241 +#: htdocs/luci-static/resources/view/homeproxy/client.js:217 msgid "China DNS server" msgstr "" @@ -355,28 +384,24 @@ msgstr "" msgid "China list version" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1783 -msgid "Choose which method node latency tests use." -msgstr "" - -#: htdocs/luci-static/resources/view/homeproxy/client.js:652 +#: htdocs/luci-static/resources/view/homeproxy/client.js:677 msgid "Chromium / Cronet" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1494 -#: htdocs/luci-static/resources/view/homeproxy/server.js:586 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1143 +#: htdocs/luci-static/resources/view/homeproxy/server.js:602 msgid "Cipher suites" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:212 -msgid "Cisco Public DNS (DoH)" +#: htdocs/luci-static/resources/view/homeproxy/client.js:183 +msgid "Cisco Public DNS (208.67.222.222)" msgstr "" #: htdocs/luci-static/resources/view/homeproxy/status.js:214 msgid "Clean log" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:650 +#: htdocs/luci-static/resources/view/homeproxy/client.js:675 msgid "Client" msgstr "" @@ -384,30 +409,30 @@ msgstr "" msgid "Client Settings" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1094 +#: htdocs/luci-static/resources/view/homeproxy/node.js:703 msgid "Client version" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/server.js:641 -msgid "CloudFlare" +#: htdocs/luci-static/resources/view/homeproxy/client.js:182 +msgid "CloudFlare Public DNS (1.1.1.1)" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:207 -msgid "CloudFlare Public DNS (DoH)" +#: htdocs/luci-static/resources/view/homeproxy/server.js:680 +msgid "Cloudflare" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:139 +#: htdocs/luci-static/resources/view/homeproxy/client.js:114 #: htdocs/luci-static/resources/view/homeproxy/server.js:142 #: htdocs/luci-static/resources/view/homeproxy/status.js:176 msgid "Collecting data..." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:290 +#: htdocs/luci-static/resources/view/homeproxy/client.js:267 msgid "Common ports only (bypass P2P traffic)" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1128 -#: htdocs/luci-static/resources/view/homeproxy/server.js:354 +#: htdocs/luci-static/resources/view/homeproxy/node.js:737 +#: htdocs/luci-static/resources/view/homeproxy/server.js:370 msgid "Congestion control algorithm" msgstr "" @@ -415,54 +440,63 @@ msgstr "" msgid "Connection check" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1772 -msgid "Cron expression" +#: htdocs/luci-static/resources/view/homeproxy/node.js:1055 +msgid "Connection reuse" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:278 +#: htdocs/luci-static/resources/view/homeproxy/node.js:639 +msgid "Conservative" +msgstr "" + +#: htdocs/luci-static/resources/view/homeproxy/client.js:255 msgid "Custom routing" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:641 +#: htdocs/luci-static/resources/view/homeproxy/client.js:666 msgid "DNS" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1070 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1734 +msgid "DNS Cache (1.14)" +msgstr "" + +#: htdocs/luci-static/resources/view/homeproxy/client.js:1140 msgid "DNS Rules" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:947 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1017 msgid "DNS Servers" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:895 +#: htdocs/luci-static/resources/view/homeproxy/client.js:959 msgid "DNS Settings" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/server.js:639 +#: htdocs/luci-static/resources/view/homeproxy/server.js:678 msgid "DNS provider" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1079 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1006 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1747 +msgid "DNS query timeout" +msgstr "" + +#: htdocs/luci-static/resources/view/homeproxy/client.js:1149 msgid "DNS rule" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:204 -#: htdocs/luci-static/resources/view/homeproxy/client.js:772 -#: htdocs/luci-static/resources/view/homeproxy/client.js:956 +#: htdocs/luci-static/resources/view/homeproxy/client.js:179 +#: htdocs/luci-static/resources/view/homeproxy/client.js:816 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1026 msgid "DNS server" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:211 -msgid "DNS.SB Public DNS (DoH)" -msgstr "" - -#: htdocs/luci-static/resources/view/homeproxy/server.js:635 +#: htdocs/luci-static/resources/view/homeproxy/server.js:674 msgid "DNS01 challenge" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:642 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1130 +#: htdocs/luci-static/resources/view/homeproxy/client.js:667 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1200 msgid "DTLS" msgstr "" @@ -471,248 +505,243 @@ msgid "Debug" msgstr "" #: htdocs/luci-static/resources/homeproxy.js:17 -#: htdocs/luci-static/resources/view/homeproxy/client.js:456 -#: htdocs/luci-static/resources/view/homeproxy/client.js:626 -#: htdocs/luci-static/resources/view/homeproxy/client.js:778 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1106 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1404 -#: htdocs/luci-static/resources/view/homeproxy/node.js:1140 +#: htdocs/luci-static/resources/view/homeproxy/client.js:481 +#: htdocs/luci-static/resources/view/homeproxy/client.js:651 +#: htdocs/luci-static/resources/view/homeproxy/client.js:822 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1176 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1546 +#: htdocs/luci-static/resources/view/homeproxy/node.js:749 msgid "Default" msgstr "" -msgid "Default node" -msgstr "" - -#: htdocs/luci-static/resources/view/homeproxy/client.js:405 -#: htdocs/luci-static/resources/view/homeproxy/client.js:457 -#: htdocs/luci-static/resources/view/homeproxy/client.js:779 -#: htdocs/luci-static/resources/view/homeproxy/client.js:910 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1018 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1184 +#: htdocs/luci-static/resources/view/homeproxy/client.js:430 +#: htdocs/luci-static/resources/view/homeproxy/client.js:482 +#: htdocs/luci-static/resources/view/homeproxy/client.js:823 +#: htdocs/luci-static/resources/view/homeproxy/client.js:974 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1088 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1251 msgid "Default DNS (issued by WAN)" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:905 +#: htdocs/luci-static/resources/view/homeproxy/client.js:969 msgid "Default DNS server" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1332 -msgid "Daily domain name resolution for clients. Choose an overseas DNS if DNS leak protection is required." -msgstr "" - -#: htdocs/luci-static/resources/view/homeproxy/client.js:400 +#: htdocs/luci-static/resources/view/homeproxy/client.js:425 msgid "Default DNS server for resolving domain name in the server address." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:900 +#: htdocs/luci-static/resources/view/homeproxy/client.js:964 msgid "Default DNS strategy" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:380 -msgid "Default outbound (fallback)" +#: htdocs/luci-static/resources/view/homeproxy/client.js:405 +msgid "Default outbound" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:399 +#: htdocs/luci-static/resources/view/homeproxy/client.js:424 msgid "Default outbound DNS" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:381 +#: htdocs/luci-static/resources/view/homeproxy/client.js:406 msgid "Default outbound for connections not matched by any routing rules." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1829 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1475 msgid "Default packet encoding" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/server.js:606 +#: htdocs/luci-static/resources/view/homeproxy/server.js:622 msgid "Default server name" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:387 -#: htdocs/luci-static/resources/view/homeproxy/client.js:489 -#: htdocs/luci-static/resources/view/homeproxy/client.js:707 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1056 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1405 -#: htdocs/luci-static/resources/view/homeproxy/node.js:858 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1007 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1748 +msgid "Default timeout per DNS query in seconds (sing-box default: 10)." +msgstr "" + +#: htdocs/luci-static/resources/view/homeproxy/client.js:412 +#: htdocs/luci-static/resources/view/homeproxy/client.js:514 +#: htdocs/luci-static/resources/view/homeproxy/client.js:732 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1126 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1547 +#: htdocs/luci-static/resources/view/homeproxy/node.js:448 msgid "Direct" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1537 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1701 msgid "Direct Domain List" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1451 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1496 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1615 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1660 msgid "Direct IPv4 IP-s" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1454 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1499 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1618 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1663 msgid "Direct IPv6 IP-s" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1457 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1621 msgid "Direct MAC-s" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:148 -#: htdocs/luci-static/resources/view/homeproxy/client.js:176 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1445 -#: htdocs/luci-static/resources/view/homeproxy/node.js:929 -#: htdocs/luci-static/resources/view/homeproxy/node.js:985 -#: htdocs/luci-static/resources/view/homeproxy/node.js:998 -#: htdocs/luci-static/resources/view/homeproxy/node.js:1545 -#: htdocs/luci-static/resources/view/homeproxy/node.js:1808 -#: htdocs/luci-static/resources/view/homeproxy/server.js:276 -#: htdocs/luci-static/resources/view/homeproxy/server.js:289 +#: htdocs/luci-static/resources/view/homeproxy/client.js:123 +#: htdocs/luci-static/resources/view/homeproxy/client.js:151 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1609 +#: htdocs/luci-static/resources/view/homeproxy/node.js:520 +#: htdocs/luci-static/resources/view/homeproxy/node.js:583 +#: htdocs/luci-static/resources/view/homeproxy/node.js:596 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1201 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1454 +#: htdocs/luci-static/resources/view/homeproxy/server.js:278 +#: htdocs/luci-static/resources/view/homeproxy/server.js:291 msgid "Disable" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:386 +#: htdocs/luci-static/resources/view/homeproxy/client.js:411 msgid "Disable (the service)" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:810 -#: htdocs/luci-static/resources/view/homeproxy/client.js:922 +#: htdocs/luci-static/resources/view/homeproxy/node.js:644 +msgid "Disable Chrome QUIC fingerprint (1.14)" +msgstr "" + +#: htdocs/luci-static/resources/view/homeproxy/node.js:645 +msgid "" +"Disable Chrome QUIC handshake parroting, which is enabled by default since " +"sing-box 1.14. Turn this on only when the server uses an Ed25519 certificate " +"or the handshake otherwise fails." +msgstr "" + +#: htdocs/luci-static/resources/view/homeproxy/client.js:854 +#: htdocs/luci-static/resources/view/homeproxy/client.js:986 msgid "Disable DNS cache" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:811 +#: htdocs/luci-static/resources/view/homeproxy/client.js:855 msgid "Disable DNS cache in this query." msgstr "" -msgid "Disable DNS memory cache" -msgstr "" - -msgid "Disable DNS memory cache in this query." -msgstr "" - -msgid "Disable DNS memory cache expiration" -msgstr "" - -msgid "Independent DNS memory cache per server" -msgstr "" - -msgid "Make each DNS server's memory cache independent for special purposes. If enabled, will slightly degrade performance." -msgstr "" - -#: htdocs/luci-static/resources/view/homeproxy/server.js:670 +#: htdocs/luci-static/resources/view/homeproxy/server.js:709 msgid "Disable HTTP challenge" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1035 -#: htdocs/luci-static/resources/view/homeproxy/server.js:321 -msgid "Disable Path MTU discovery" -msgstr "" - -#: htdocs/luci-static/resources/view/homeproxy/server.js:674 +#: htdocs/luci-static/resources/view/homeproxy/server.js:713 msgid "Disable TLS ALPN challenge" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:733 +#: htdocs/luci-static/resources/view/homeproxy/client.js:758 msgid "Disable UDP domain unmapping" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1205 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1266 msgid "Disable cache and save cache in this query." msgstr "" -msgid "Disable DNS memory cache and persistent cache in this query." -msgstr "" - -#: htdocs/luci-static/resources/view/homeproxy/client.js:924 +#: htdocs/luci-static/resources/view/homeproxy/client.js:988 msgid "Disable cache expire" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1204 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1265 msgid "Disable dns cache" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1036 -#: htdocs/luci-static/resources/view/homeproxy/server.js:322 -msgid "" -"Disables Path MTU Discovery (RFC 8899). Packets will then be at most 1252 " -"(IPv4) / 1232 (IPv6) bytes in size." +#: htdocs/luci-static/resources/view/homeproxy/client.js:1308 +msgid "Disable optimistic DNS caching for this query." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:837 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1274 +#: htdocs/luci-static/resources/view/homeproxy/client.js:873 +msgid "Disable optimistic DNS caching in this lookup (1.14)." +msgstr "" + +#: htdocs/luci-static/resources/view/homeproxy/client.js:872 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1307 +msgid "Disable optimistic cache" +msgstr "" + +#: htdocs/luci-static/resources/view/homeproxy/client.js:309 +msgid "Disabled" +msgstr "" + +#: htdocs/luci-static/resources/view/homeproxy/client.js:892 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1395 msgid "Domain keyword" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:828 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1265 +#: htdocs/luci-static/resources/view/homeproxy/client.js:883 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1386 msgid "Domain name" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:841 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1278 +#: htdocs/luci-static/resources/view/homeproxy/client.js:896 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1399 msgid "Domain regex" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:450 +#: htdocs/luci-static/resources/view/homeproxy/client.js:475 msgid "Domain resolver" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:370 -#: htdocs/luci-static/resources/view/homeproxy/client.js:469 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1197 +#: htdocs/luci-static/resources/view/homeproxy/client.js:400 +#: htdocs/luci-static/resources/view/homeproxy/client.js:494 msgid "Domain strategy" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:804 +#: htdocs/luci-static/resources/view/homeproxy/client.js:848 msgid "Domain strategy for resolving the domain names." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:833 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1270 +#: htdocs/luci-static/resources/view/homeproxy/client.js:888 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1391 msgid "Domain suffix" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/server.js:600 +#: htdocs/luci-static/resources/view/homeproxy/server.js:616 msgid "Domains" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:797 +#: htdocs/luci-static/resources/view/homeproxy/client.js:841 msgid "Don't drop packets" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1232 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1353 msgid "Don't drop requests" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1419 -#: htdocs/luci-static/resources/view/homeproxy/server.js:517 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1028 +#: htdocs/luci-static/resources/view/homeproxy/server.js:533 msgid "Download bandwidth" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1420 -#: htdocs/luci-static/resources/view/homeproxy/server.js:518 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1029 +#: htdocs/luci-static/resources/view/homeproxy/server.js:534 msgid "Download bandwidth in Mbps." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:793 -#: htdocs/luci-static/resources/view/homeproxy/client.js:799 +#: htdocs/luci-static/resources/view/homeproxy/client.js:837 +#: htdocs/luci-static/resources/view/homeproxy/client.js:843 msgid "Drop packets" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1227 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1234 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1348 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1355 msgid "Drop requests" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1815 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1461 msgid "" "Drop/keep nodes that contain the specific keywords. Regex is supported." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1807 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1453 msgid "Drop/keep specific nodes from subscriptions." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/server.js:691 +#: htdocs/luci-static/resources/view/homeproxy/server.js:730 msgid "" "EAB (External Account Binding) contains information necessary to bind or map " "an ACME account to some other account known by the CA.
External account " @@ -720,178 +749,211 @@ msgid "" "a non-ACME system, such as a CA customer database." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1524 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1180 msgid "" "ECH (Encrypted Client Hello) is a TLS extension that allows a client to " "encrypt the first part of its ClientHello message." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1539 -#: htdocs/luci-static/resources/view/homeproxy/server.js:835 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1195 +#: htdocs/luci-static/resources/view/homeproxy/server.js:874 msgid "ECH config" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1528 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1184 msgid "ECH config path" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/server.js:794 +#: htdocs/luci-static/resources/view/homeproxy/server.js:833 msgid "ECH key" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:821 -#: htdocs/luci-static/resources/view/homeproxy/client.js:931 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1217 +#: htdocs/luci-static/resources/view/homeproxy/client.js:865 +#: htdocs/luci-static/resources/view/homeproxy/client.js:991 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1278 msgid "EDNS Client subnet" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1303 -#: htdocs/luci-static/resources/view/homeproxy/server.js:481 +#: htdocs/luci-static/resources/view/homeproxy/node.js:912 +#: htdocs/luci-static/resources/view/homeproxy/server.js:497 msgid "Early data" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1310 -#: htdocs/luci-static/resources/view/homeproxy/server.js:488 +#: htdocs/luci-static/resources/view/homeproxy/node.js:919 +#: htdocs/luci-static/resources/view/homeproxy/server.js:504 msgid "Early data header name" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/server.js:489 +#: htdocs/luci-static/resources/view/homeproxy/server.js:505 msgid "Early data is sent in path instead of header by default." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1644 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1297 msgid "Edit nodes" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/server.js:612 +#: htdocs/luci-static/resources/view/homeproxy/server.js:628 msgid "Email" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:437 -#: htdocs/luci-static/resources/view/homeproxy/client.js:613 -#: htdocs/luci-static/resources/view/homeproxy/client.js:965 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1093 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1352 +#: htdocs/luci-static/resources/view/homeproxy/client.js:462 +#: htdocs/luci-static/resources/view/homeproxy/client.js:638 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1035 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1163 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1491 #: htdocs/luci-static/resources/view/homeproxy/server.js:148 #: htdocs/luci-static/resources/view/homeproxy/server.js:166 msgid "Enable" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1152 -#: htdocs/luci-static/resources/view/homeproxy/server.js:371 +#: htdocs/luci-static/resources/view/homeproxy/node.js:761 +#: htdocs/luci-static/resources/view/homeproxy/server.js:387 msgid "" "Enable 0-RTT QUIC connection handshake on the client side. This is not " "impacting much on the performance, as the protocol is fully multiplexed.
Disabling this is highly recommended, as it is vulnerable to replay attacks." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1151 -#: htdocs/luci-static/resources/view/homeproxy/server.js:370 +#: htdocs/luci-static/resources/view/homeproxy/node.js:760 +#: htdocs/luci-static/resources/view/homeproxy/server.js:386 msgid "Enable 0-RTT handshake" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/server.js:595 +#: htdocs/luci-static/resources/view/homeproxy/server.js:611 msgid "Enable ACME" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1523 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1179 msgid "Enable ECH" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1414 -#: htdocs/luci-static/resources/view/homeproxy/server.js:512 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1023 +#: htdocs/luci-static/resources/view/homeproxy/server.js:528 msgid "Enable TCP Brutal" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1415 -#: htdocs/luci-static/resources/view/homeproxy/server.js:513 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1024 +#: htdocs/luci-static/resources/view/homeproxy/server.js:529 msgid "Enable TCP Brutal congestion control algorithm" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1598 -#: htdocs/luci-static/resources/view/homeproxy/server.js:855 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1254 +#: htdocs/luci-static/resources/view/homeproxy/server.js:894 msgid "Enable UDP fragmentation." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:351 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1056 +msgid "Enable connection reuse (the Snell v2 CONNECT command)." +msgstr "" + +#: htdocs/luci-static/resources/view/homeproxy/client.js:377 msgid "Enable endpoint-independent NAT" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1410 -#: htdocs/luci-static/resources/view/homeproxy/server.js:507 +#: htdocs/luci-static/resources/view/homeproxy/client.js:397 +msgid "" +"Enable neighbor resolution so rules can match LAN devices by hostname (1.14)." +msgstr "" + +#: htdocs/luci-static/resources/view/homeproxy/node.js:1019 +#: htdocs/luci-static/resources/view/homeproxy/server.js:523 msgid "Enable padding" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/server.js:846 +#: htdocs/luci-static/resources/view/homeproxy/server.js:885 msgid "Enable tcp fast open for listener." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1602 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1258 msgid "" "Enable the SUoT protocol, requires server support. Conflict with multiplex." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1042 -#: htdocs/luci-static/resources/view/homeproxy/node.js:1178 -#: htdocs/luci-static/resources/view/homeproxy/server.js:338 +#: htdocs/luci-static/resources/view/homeproxy/node.js:651 +#: htdocs/luci-static/resources/view/homeproxy/node.js:787 +#: htdocs/luci-static/resources/view/homeproxy/server.js:354 msgid "Encrypt method" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:488 +#: htdocs/luci-static/resources/view/homeproxy/client.js:323 +#: htdocs/luci-static/resources/view/homeproxy/client.js:334 +msgid "Endpoint independent" +msgstr "" + #: htdocs/luci-static/resources/view/homeproxy/status.js:139 msgid "Error" msgstr "" +#: htdocs/luci-static/resources/view/homeproxy/client.js:1240 +msgid "Evaluate (1.14)" +msgstr "" + +#: htdocs/luci-static/resources/view/homeproxy/client.js:1291 +msgid "Evaluate tag" +msgstr "" + #: htdocs/luci-static/resources/homeproxy.js:237 #: htdocs/luci-static/resources/homeproxy.js:271 #: htdocs/luci-static/resources/homeproxy.js:279 -#: htdocs/luci-static/resources/homeproxy.js:297 -#: htdocs/luci-static/resources/homeproxy.js:306 -#: htdocs/luci-static/resources/homeproxy.js:317 -#: htdocs/luci-static/resources/homeproxy.js:326 -#: htdocs/luci-static/resources/homeproxy.js:328 -#: htdocs/luci-static/resources/view/homeproxy/client.js:219 -#: htdocs/luci-static/resources/view/homeproxy/client.js:231 -#: htdocs/luci-static/resources/view/homeproxy/client.js:235 -#: htdocs/luci-static/resources/view/homeproxy/client.js:253 -#: htdocs/luci-static/resources/view/homeproxy/client.js:264 -#: htdocs/luci-static/resources/view/homeproxy/client.js:268 -#: htdocs/luci-static/resources/view/homeproxy/client.js:297 -#: htdocs/luci-static/resources/view/homeproxy/client.js:527 -#: htdocs/luci-static/resources/view/homeproxy/client.js:541 -#: htdocs/luci-static/resources/view/homeproxy/client.js:544 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1380 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1385 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1388 +#: htdocs/luci-static/resources/homeproxy.js:298 +#: htdocs/luci-static/resources/homeproxy.js:307 +#: htdocs/luci-static/resources/homeproxy.js:318 +#: htdocs/luci-static/resources/homeproxy.js:327 +#: htdocs/luci-static/resources/homeproxy.js:329 +#: htdocs/luci-static/resources/view/homeproxy/client.js:195 +#: htdocs/luci-static/resources/view/homeproxy/client.js:207 +#: htdocs/luci-static/resources/view/homeproxy/client.js:211 +#: htdocs/luci-static/resources/view/homeproxy/client.js:230 +#: htdocs/luci-static/resources/view/homeproxy/client.js:241 +#: htdocs/luci-static/resources/view/homeproxy/client.js:245 +#: htdocs/luci-static/resources/view/homeproxy/client.js:274 +#: htdocs/luci-static/resources/view/homeproxy/client.js:552 +#: htdocs/luci-static/resources/view/homeproxy/client.js:566 +#: htdocs/luci-static/resources/view/homeproxy/client.js:569 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1519 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1522 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1527 #: htdocs/luci-static/resources/view/homeproxy/client.js:1530 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1562 -#: htdocs/luci-static/resources/view/homeproxy/node.js:918 -#: htdocs/luci-static/resources/view/homeproxy/node.js:1561 -#: htdocs/luci-static/resources/view/homeproxy/node.js:1735 -#: htdocs/luci-static/resources/view/homeproxy/node.js:1796 -#: htdocs/luci-static/resources/view/homeproxy/node.js:1799 -#: htdocs/luci-static/resources/view/homeproxy/server.js:235 -#: htdocs/luci-static/resources/view/homeproxy/server.js:618 -#: htdocs/luci-static/resources/view/homeproxy/server.js:620 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1570 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1573 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1694 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1726 +#: htdocs/luci-static/resources/view/homeproxy/node.js:509 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1217 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1388 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1442 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1445 +#: htdocs/luci-static/resources/view/homeproxy/server.js:237 +#: htdocs/luci-static/resources/view/homeproxy/server.js:634 +#: htdocs/luci-static/resources/view/homeproxy/server.js:636 msgid "Expecting: %s" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/server.js:690 +#: htdocs/luci-static/resources/view/homeproxy/server.js:729 msgid "External Account Binding" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/server.js:702 +#: htdocs/luci-static/resources/view/homeproxy/server.js:741 msgid "External account MAC key" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/server.js:696 +#: htdocs/luci-static/resources/view/homeproxy/server.js:735 msgid "External account key ID" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1260 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1381 msgid "Extra records" msgstr "" +#: htdocs/luci-static/resources/view/homeproxy/client.js:1564 +msgid "" +"Extra rule-set tags sharing these options. Requires {tag} in path/url (1.14)." +msgstr "" + +#: htdocs/luci-static/resources/view/homeproxy/client.js:1563 +msgid "Extra tags" +msgstr "" + #: htdocs/luci-static/resources/view/homeproxy/server.js:86 msgid "Failed to generate %s, error: %s." msgstr "" @@ -900,53 +962,23 @@ msgstr "" msgid "Failed to upload %s, error: %s." msgstr "" -#: htdocs/luci-static/resources/homeproxy.js -msgid "panel ZIP package" -msgstr "" - -#: htdocs/luci-static/resources/homeproxy.js -msgid "unknown error" -msgstr "" - -#: htdocs/luci-static/resources/homeproxy.js -#: htdocs/luci-static/resources/view/homeproxy/client.js -msgid "Backup panel failed." -msgstr "" - -#: htdocs/luci-static/resources/homeproxy.js -#: htdocs/luci-static/resources/view/homeproxy/client.js -msgid "Restore panel failed." -msgstr "" - -#: htdocs/luci-static/resources/homeproxy.js -msgid "Panel ZIP file is empty." -msgstr "" - -#: htdocs/luci-static/resources/homeproxy.js -msgid "The unzip command is unavailable." -msgstr "" - -#: htdocs/luci-static/resources/homeproxy.js -msgid "Invalid panel ZIP file." -msgstr "" - -#: htdocs/luci-static/resources/homeproxy.js -msgid "Install panel failed." -msgstr "" - #: htdocs/luci-static/resources/view/homeproxy/status.js:140 msgid "Fatal" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1814 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1460 msgid "Filter keywords" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1806 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1452 msgid "Filter nodes" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:653 +#: htdocs/luci-static/resources/view/homeproxy/client.js:396 +msgid "Find neighbor hosts" +msgstr "" + +#: htdocs/luci-static/resources/view/homeproxy/client.js:678 msgid "Firefox / uquic firefox" msgstr "" @@ -954,33 +986,33 @@ msgstr "" msgid "Firewall" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1166 -#: htdocs/luci-static/resources/view/homeproxy/server.js:385 +#: htdocs/luci-static/resources/view/homeproxy/node.js:775 +#: htdocs/luci-static/resources/view/homeproxy/server.js:401 msgid "Flow" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:451 +#: htdocs/luci-static/resources/view/homeproxy/client.js:476 msgid "For resolving domain name in the server address." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1363 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1502 msgid "Format" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:753 +#: htdocs/luci-static/resources/view/homeproxy/client.js:778 msgid "Fragment TLS handshake into multiple TLS records." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:759 +#: htdocs/luci-static/resources/view/homeproxy/client.js:784 msgid "" "Fragment TLS handshakes. Due to poor performance, try %s first." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:765 +#: htdocs/luci-static/resources/view/homeproxy/client.js:790 msgid "Fragment fallback delay" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1272 +#: htdocs/luci-static/resources/view/homeproxy/node.js:881 msgid "GET" msgstr "" @@ -988,25 +1020,30 @@ msgstr "" msgid "GFW list version" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:275 +#: htdocs/luci-static/resources/view/homeproxy/client.js:252 msgid "GFWList" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1469 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1633 msgid "Gaming mode IPv4 IP-s" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1471 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1635 msgid "Gaming mode IPv6 IP-s" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1474 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1638 msgid "Gaming mode MAC-s" msgstr "" +#: htdocs/luci-static/resources/view/homeproxy/node.js:598 +#: htdocs/luci-static/resources/view/homeproxy/server.js:293 +msgid "Gecko (1.14)" +msgstr "" + #: htdocs/luci-static/resources/view/homeproxy/server.js:36 #: htdocs/luci-static/resources/view/homeproxy/server.js:38 -#: htdocs/luci-static/resources/view/homeproxy/server.js:827 +#: htdocs/luci-static/resources/view/homeproxy/server.js:866 msgid "Generate" msgstr "" @@ -1014,23 +1051,23 @@ msgstr "" msgid "GitHub token" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:279 +#: htdocs/luci-static/resources/view/homeproxy/client.js:256 msgid "Global" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1189 +#: htdocs/luci-static/resources/view/homeproxy/node.js:798 msgid "Global padding" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1476 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1640 msgid "Global proxy IPv4 IP-s" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1479 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1643 msgid "Global proxy IPv6 IP-s" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1482 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1646 msgid "Global proxy MAC-s" msgstr "" @@ -1042,62 +1079,84 @@ msgstr "" msgid "Google" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:208 -msgid "Google Public DNS (DoH)" +#: htdocs/luci-static/resources/view/homeproxy/client.js:184 +msgid "Google Public DNS (8.8.8.8)" msgstr "" #: root/usr/share/rpcd/acl.d/luci-app-homeproxy.json:3 msgid "Grant access to homeproxy configuration" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:643 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1131 -#: htdocs/luci-static/resources/view/homeproxy/node.js:860 -#: htdocs/luci-static/resources/view/homeproxy/node.js:1207 +#: htdocs/luci-static/resources/view/homeproxy/client.js:668 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1201 +#: htdocs/luci-static/resources/view/homeproxy/node.js:450 +#: htdocs/luci-static/resources/view/homeproxy/node.js:816 #: htdocs/luci-static/resources/view/homeproxy/server.js:177 -#: htdocs/luci-static/resources/view/homeproxy/server.js:403 +#: htdocs/luci-static/resources/view/homeproxy/server.js:419 msgid "HTTP" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:975 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1068 +msgid "" +"HTTP Host header sent when obfuscation mode is http. bing.com is used by " +"default." +msgstr "" + +#: htdocs/luci-static/resources/view/homeproxy/node.js:1061 +msgid "HTTP obfuscation. v4 only." +msgstr "" + +#: htdocs/luci-static/resources/view/homeproxy/server.js:338 +msgid "HTTP obfuscation. v5 only." +msgstr "" + +#: htdocs/luci-static/resources/view/homeproxy/client.js:1045 msgid "HTTP/3" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/server.js:332 +#: htdocs/luci-static/resources/view/homeproxy/server.js:323 msgid "" "HTTP3 server behavior when authentication fails.
A 404 page will be " "returned if empty." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:974 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1044 msgid "HTTPS" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1208 -#: htdocs/luci-static/resources/view/homeproxy/server.js:404 +#: htdocs/luci-static/resources/view/homeproxy/node.js:817 +#: htdocs/luci-static/resources/view/homeproxy/server.js:420 msgid "HTTPUpgrade" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/server.js:744 +#: htdocs/luci-static/resources/view/homeproxy/server.js:783 msgid "Handshake server address" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/server.js:750 +#: htdocs/luci-static/resources/view/homeproxy/server.js:789 msgid "Handshake server port" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:997 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1151 +msgid "Handshake timeout (1.14)" +msgstr "" + +#: htdocs/luci-static/resources/view/homeproxy/client.js:1067 msgid "Headers" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1157 -#: htdocs/luci-static/resources/view/homeproxy/server.js:376 +#: htdocs/luci-static/resources/view/homeproxy/node.js:766 +#: htdocs/luci-static/resources/view/homeproxy/server.js:392 msgid "Heartbeat interval" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:63 -#: htdocs/luci-static/resources/view/homeproxy/client.js:65 -#: htdocs/luci-static/resources/view/homeproxy/client.js:112 +#: htdocs/luci-static/resources/view/homeproxy/client.js:311 +msgid "Hijack" +msgstr "" + +#: htdocs/luci-static/resources/view/homeproxy/client.js:55 +#: htdocs/luci-static/resources/view/homeproxy/client.js:57 +#: htdocs/luci-static/resources/view/homeproxy/client.js:101 #: htdocs/luci-static/resources/view/homeproxy/status.js:282 #: root/usr/share/luci/menu.d/luci-app-homeproxy.json:3 msgid "HomeProxy" @@ -1109,80 +1168,68 @@ msgstr "" msgid "HomeProxy Server" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:965 +#: htdocs/luci-static/resources/view/homeproxy/node.js:556 msgid "Hop interval" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:959 +#: htdocs/luci-static/resources/view/homeproxy/node.js:550 msgid "Hopping port" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1256 -#: htdocs/luci-static/resources/view/homeproxy/node.js:1261 -#: htdocs/luci-static/resources/view/homeproxy/node.js:1295 -#: htdocs/luci-static/resources/view/homeproxy/server.js:437 -#: htdocs/luci-static/resources/view/homeproxy/server.js:442 -#: htdocs/luci-static/resources/view/homeproxy/server.js:473 +#: htdocs/luci-static/resources/view/homeproxy/node.js:865 +#: htdocs/luci-static/resources/view/homeproxy/node.js:870 +#: htdocs/luci-static/resources/view/homeproxy/node.js:904 +#: htdocs/luci-static/resources/view/homeproxy/server.js:453 +#: htdocs/luci-static/resources/view/homeproxy/server.js:458 +#: htdocs/luci-static/resources/view/homeproxy/server.js:489 msgid "Host" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1099 +#: htdocs/luci-static/resources/view/homeproxy/node.js:708 msgid "Host key" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1104 +#: htdocs/luci-static/resources/view/homeproxy/node.js:713 msgid "Host key algorithms" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:604 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1084 +#: htdocs/luci-static/resources/view/homeproxy/client.js:629 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1154 msgid "Host/IP fields" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/server.js:364 +#: htdocs/luci-static/resources/view/homeproxy/server.js:380 msgid "" "How long the server should wait for the client to send the authentication " "command (in seconds)." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:862 +#: htdocs/luci-static/resources/view/homeproxy/client.js:805 +msgid "How the forged segment is rejected by the real server." +msgstr "" + +#: htdocs/luci-static/resources/view/homeproxy/node.js:452 #: htdocs/luci-static/resources/view/homeproxy/server.js:179 msgid "Hysteria" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:863 +#: htdocs/luci-static/resources/view/homeproxy/node.js:453 #: htdocs/luci-static/resources/view/homeproxy/server.js:180 msgid "Hysteria2" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1784 -msgid "ICMP" -msgstr "" - -#: htdocs/luci-static/resources/view/homeproxy/node.js:474 -msgid "ICMP Failed" -msgstr "" - -#: htdocs/luci-static/resources/view/homeproxy/node.js:476 -msgid "ICMP Probe unavailable" -msgstr "" - -#: htdocs/luci-static/resources/view/homeproxy/node.js:478 -msgid "ICMP Timeout" -msgstr "" - -#: htdocs/luci-static/resources/view/homeproxy/client.js:853 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1290 +#: htdocs/luci-static/resources/view/homeproxy/client.js:908 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1411 msgid "IP CIDR" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:631 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1112 +#: htdocs/luci-static/resources/view/homeproxy/client.js:656 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1182 msgid "IP version" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:633 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1113 +#: htdocs/luci-static/resources/view/homeproxy/client.js:658 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1183 msgid "IPv4" msgstr "" @@ -1190,8 +1237,8 @@ msgstr "" msgid "IPv4 only" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:634 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1114 +#: htdocs/luci-static/resources/view/homeproxy/client.js:659 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1184 msgid "IPv6" msgstr "" @@ -1199,222 +1246,216 @@ msgstr "" msgid "IPv6 only" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:320 +#: htdocs/luci-static/resources/view/homeproxy/client.js:297 msgid "IPv6 support" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:936 +#: htdocs/luci-static/resources/view/homeproxy/node.js:527 msgid "Idle session check interval" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:943 +#: htdocs/luci-static/resources/view/homeproxy/node.js:534 msgid "Idle session check timeout" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:576 -#: htdocs/luci-static/resources/view/homeproxy/node.js:1277 -#: htdocs/luci-static/resources/view/homeproxy/server.js:456 +#: htdocs/luci-static/resources/view/homeproxy/client.js:601 +#: htdocs/luci-static/resources/view/homeproxy/node.js:886 +#: htdocs/luci-static/resources/view/homeproxy/server.js:472 msgid "Idle timeout" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:740 +#: htdocs/luci-static/resources/view/homeproxy/client.js:765 msgid "" "If enabled, attempts to connect UDP connection to the destination instead of " "listen." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:734 +#: htdocs/luci-static/resources/view/homeproxy/client.js:759 msgid "" "If enabled, for UDP proxy requests addressed to a domain, the original " "packet address will be sent in the response instead of the mapped domain." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1249 +#: htdocs/luci-static/resources/view/homeproxy/node.js:858 msgid "" "If enabled, the client transport sends keepalive pings even with no active " "connections." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:371 +#: htdocs/luci-static/resources/view/homeproxy/client.js:401 msgid "" "If set, the requested domain name will be resolved to IP before routing." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1234 -#: htdocs/luci-static/resources/view/homeproxy/server.js:425 +#: htdocs/luci-static/resources/view/homeproxy/node.js:843 +#: htdocs/luci-static/resources/view/homeproxy/server.js:441 msgid "" "If the transport doesn't see any activity after a duration of this time (in " "seconds), it pings the client to check if the connection is still active." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1503 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1159 msgid "" "If you have the root certificate, use this option instead of allowing " "insecure." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/server.js:326 +#: htdocs/luci-static/resources/view/homeproxy/server.js:317 msgid "Ignore client bandwidth" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1718 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1371 msgid "Import" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1665 -#: htdocs/luci-static/resources/view/homeproxy/node.js:1744 -#: htdocs/luci-static/resources/view/homeproxy/node.js:1746 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1318 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1397 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1399 msgid "Import share links" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:359 -#: htdocs/luci-static/resources/view/homeproxy/server.js:860 +#: htdocs/luci-static/resources/view/homeproxy/client.js:385 +#: htdocs/luci-static/resources/view/homeproxy/server.js:899 msgid "In seconds." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1367 +#: htdocs/luci-static/resources/view/homeproxy/node.js:976 msgid "In seconds. Disabled by default." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:951 +#: htdocs/luci-static/resources/view/homeproxy/node.js:542 msgid "" "In the check, at least the first n idle sessions are kept open." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:944 +#: htdocs/luci-static/resources/view/homeproxy/node.js:535 msgid "" "In the check, close sessions that have been idle for longer than this, in " "seconds." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:927 -msgid "Independent cache per server" -msgstr "" - #: htdocs/luci-static/resources/view/homeproxy/status.js:137 msgid "Info" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1428 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1557 +msgid "Initial path" +msgstr "" + +#: htdocs/luci-static/resources/view/homeproxy/client.js:798 +msgid "" +"Inject a forged TLS ClientHello carrying this SNI before the real one to " +"fool SNI-filtering middleboxes. Requires elevated privileges." +msgstr "" + +#: htdocs/luci-static/resources/view/homeproxy/client.js:1592 msgid "Interface Control" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:583 +#: htdocs/luci-static/resources/view/homeproxy/client.js:608 msgid "Interrupt existing connections" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:584 +#: htdocs/luci-static/resources/view/homeproxy/client.js:609 msgid "Interrupt existing connections when the selected outbound has changed." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:937 +#: htdocs/luci-static/resources/view/homeproxy/node.js:528 msgid "Interval checking for idle sessions, in seconds." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1158 -#: htdocs/luci-static/resources/view/homeproxy/server.js:377 +#: htdocs/luci-static/resources/view/homeproxy/node.js:767 +#: htdocs/luci-static/resources/view/homeproxy/server.js:393 msgid "" "Interval for sending heartbeat packets for keeping the connection alive (in " "seconds)." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:128 -#: htdocs/luci-static/resources/view/homeproxy/node.js:480 -msgid "Invalid node" -msgstr "" - -#: htdocs/luci-static/resources/view/homeproxy/node.js:482 -msgid "Invalid response" -msgstr "" - -#: htdocs/luci-static/resources/view/homeproxy/client.js:688 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1165 +#: htdocs/luci-static/resources/view/homeproxy/client.js:713 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1231 msgid "Invert" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:689 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1166 +#: htdocs/luci-static/resources/view/homeproxy/client.js:714 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1232 msgid "Invert match result." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/server.js:775 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1297 +msgid "" +"Judge this response-dependent rule in parallel; first match wins (1.14)." +msgstr "" + +#: htdocs/luci-static/resources/view/homeproxy/server.js:814 msgid "Key path" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1442 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1606 msgid "LAN IP Policy" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:432 -#: htdocs/luci-static/resources/view/homeproxy/client.js:608 -#: htdocs/luci-static/resources/view/homeproxy/client.js:960 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1088 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1347 -#: htdocs/luci-static/resources/view/homeproxy/node.js:852 +#: htdocs/luci-static/resources/view/homeproxy/client.js:457 +#: htdocs/luci-static/resources/view/homeproxy/client.js:633 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1030 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1158 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1486 +#: htdocs/luci-static/resources/view/homeproxy/node.js:442 #: htdocs/luci-static/resources/view/homeproxy/server.js:160 msgid "Label" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:817 -msgid "Latency" -msgstr "" - -#: htdocs/luci-static/resources/view/homeproxy/node.js:1782 -msgid "Latency test mode" -msgstr "" - -#: htdocs/luci-static/resources/view/homeproxy/node.js:1173 -#: htdocs/luci-static/resources/view/homeproxy/server.js:392 +#: htdocs/luci-static/resources/view/homeproxy/node.js:782 +#: htdocs/luci-static/resources/view/homeproxy/server.js:408 msgid "" "Legacy protocol support (VMess MD5 Authentication) is provided for " "compatibility purposes only, use of alterId > 1 is not recommended." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:348 +#: htdocs/luci-static/resources/view/homeproxy/client.js:374 msgid "Less compatibility and sometimes better performance." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/server.js:629 +#: htdocs/luci-static/resources/view/homeproxy/server.js:668 msgid "Let's Encrypt" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1327 +#: htdocs/luci-static/resources/view/homeproxy/node.js:936 msgid "" "List of IP (v4 or v6) addresses prefixes to be assigned to the interface." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:157 -#: htdocs/luci-static/resources/view/homeproxy/client.js:186 -#: htdocs/luci-static/resources/view/homeproxy/client.js:520 +#: htdocs/luci-static/resources/view/homeproxy/client.js:132 +#: htdocs/luci-static/resources/view/homeproxy/client.js:161 +#: htdocs/luci-static/resources/view/homeproxy/client.js:545 msgid "List of nodes to test." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1466 -#: htdocs/luci-static/resources/view/homeproxy/server.js:566 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1115 +#: htdocs/luci-static/resources/view/homeproxy/server.js:582 msgid "List of supported application level protocols, in order of preference." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1251 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1372 msgid "List of text DNS record to respond as answers." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1261 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1382 msgid "List of text DNS record to respond as extra records." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1256 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1377 msgid "List of text DNS record to respond as name servers." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/server.js:193 +#: htdocs/luci-static/resources/view/homeproxy/server.js:194 msgid "Listen address" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1430 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1594 msgid "Listen interfaces" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/server.js:198 +#: htdocs/luci-static/resources/view/homeproxy/server.js:199 msgid "Listen port" msgstr "" @@ -1422,14 +1463,20 @@ msgstr "" msgid "Loading" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1358 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1497 msgid "Local" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1326 +#: htdocs/luci-static/resources/view/homeproxy/node.js:935 msgid "Local address" msgstr "" +#: htdocs/luci-static/resources/view/homeproxy/client.js:1558 +msgid "" +"Local file with initial rule-set content; avoids blocking startup on first " +"download (1.14)." +msgstr "" + #: htdocs/luci-static/resources/view/homeproxy/status.js:191 msgid "Log file does not exist." msgstr "" @@ -1438,255 +1485,317 @@ msgstr "" msgid "Log is empty." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1360 +#: htdocs/luci-static/resources/view/homeproxy/node.js:969 msgid "MTU" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:175 +#: htdocs/luci-static/resources/view/homeproxy/client.js:150 msgid "Main UDP node" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:147 +#: htdocs/luci-static/resources/view/homeproxy/client.js:122 msgid "Main node" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:685 +#: htdocs/luci-static/resources/view/homeproxy/client.js:710 msgid "Make IP CIDR in rule set used to match the source IP." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1158 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1228 msgid "Make IP CIDR in rule sets match the source IP." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1162 -msgid "Make IP CIDR in rule-sets accept empty query response." -msgstr "" - -#: htdocs/luci-static/resources/view/homeproxy/client.js:928 -msgid "" -"Make each DNS server's cache independent for special purposes. If enabled, " -"will slightly degrade performance." -msgstr "" - -#: htdocs/luci-static/resources/view/homeproxy/server.js:331 +#: htdocs/luci-static/resources/view/homeproxy/server.js:322 msgid "Masquerade" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1291 -msgid "" -"Match IP CIDR with query response. Current rule will be skipped if not match." +#: htdocs/luci-static/resources/view/homeproxy/client.js:1434 +msgid "Match DNSSEC OK" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:854 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1412 +msgid "" +"Match IP CIDR with the evaluated response (needs match_response; old rules " +"are auto-wrapped in 1.14)." +msgstr "" + +#: htdocs/luci-static/resources/view/homeproxy/client.js:909 msgid "Match IP CIDR." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:834 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1271 +#: htdocs/luci-static/resources/view/homeproxy/client.js:917 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1421 +msgid "Match LAN device by MAC address." +msgstr "" + +#: htdocs/luci-static/resources/view/homeproxy/client.js:922 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1426 +msgid "" +"Match LAN device hostname via neighbor resolution; enable find_neighbor." +msgstr "" + +#: htdocs/luci-static/resources/view/homeproxy/client.js:889 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1392 msgid "Match domain suffix." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:838 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1275 +#: htdocs/luci-static/resources/view/homeproxy/client.js:893 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1396 msgid "Match domain using keyword." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:842 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1279 +#: htdocs/luci-static/resources/view/homeproxy/client.js:897 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1400 msgid "Match domain using regular expression." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:829 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1266 +#: htdocs/luci-static/resources/view/homeproxy/client.js:884 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1387 msgid "Match full domain." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:877 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1315 +#: htdocs/luci-static/resources/view/homeproxy/client.js:941 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1454 msgid "Match port range. Format as START:/:END/START:END." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:872 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1310 +#: htdocs/luci-static/resources/view/homeproxy/client.js:936 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1449 msgid "Match port." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:858 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1295 +#: htdocs/luci-static/resources/view/homeproxy/client.js:913 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1416 msgid "Match private IP" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1296 -msgid "Match private IP with query response." +#: htdocs/luci-static/resources/view/homeproxy/client.js:1417 +msgid "Match private IP with the evaluated response (needs match_response)." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:850 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1287 +#: htdocs/luci-static/resources/view/homeproxy/client.js:905 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1408 msgid "Match private source IP" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:882 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1320 +#: htdocs/luci-static/resources/view/homeproxy/client.js:946 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1459 msgid "Match process name." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:890 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1328 +#: htdocs/luci-static/resources/view/homeproxy/client.js:954 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1467 msgid "Match process path using regular expression." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:886 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1324 +#: htdocs/luci-static/resources/view/homeproxy/client.js:950 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1463 msgid "Match process path." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1119 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1435 +msgid "Match queries with the DNSSEC OK bit set (1.14)." +msgstr "" + +#: htdocs/luci-static/resources/view/homeproxy/client.js:1189 msgid "Match query type." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:670 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1143 -msgid "Match rule set." +#: htdocs/luci-static/resources/view/homeproxy/client.js:1286 +msgid "Match response" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:846 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1283 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1213 +msgid "" +"Match rule set. DNS: rules referencing rule-sets that contain query_type are " +"incompatible with legacy address filters (ip_cidr / ip_is_private) — use " +"match_response instead (1.14)." +msgstr "" + +#: htdocs/luci-static/resources/view/homeproxy/client.js:695 +msgid "" +"Match rule set. Since 1.14: a rule-set holding a single default rule is " +"merged into this rule; any other rule-set matches as an OR collection." +msgstr "" + +#: htdocs/luci-static/resources/view/homeproxy/client.js:901 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1404 msgid "Match source IP CIDR." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:867 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1305 +#: htdocs/luci-static/resources/view/homeproxy/client.js:931 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1444 msgid "Match source port range. Format as START:/:END/START:END." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:862 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1300 +#: htdocs/luci-static/resources/view/homeproxy/client.js:926 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1439 msgid "Match source port." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:666 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1139 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1430 +msgid "Match the EDNS Client Subnet in the query (1.14)." +msgstr "" + +#: htdocs/luci-static/resources/view/homeproxy/client.js:1327 +msgid "Match the evaluated response code (requires match_response)." +msgstr "" + +#: htdocs/luci-static/resources/view/homeproxy/client.js:691 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1209 msgid "Match user name." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1009 -#: htdocs/luci-static/resources/view/homeproxy/server.js:261 +#: htdocs/luci-static/resources/view/homeproxy/node.js:622 +#: htdocs/luci-static/resources/view/homeproxy/server.js:263 msgid "Max download speed" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1010 -#: htdocs/luci-static/resources/view/homeproxy/server.js:262 +#: htdocs/luci-static/resources/view/homeproxy/node.js:623 +#: htdocs/luci-static/resources/view/homeproxy/server.js:264 msgid "Max download speed in Mbps." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/server.js:739 +#: htdocs/luci-static/resources/view/homeproxy/node.js:564 +msgid "Max hop interval (1.14)" +msgstr "" + +#: htdocs/luci-static/resources/view/homeproxy/node.js:615 +#: htdocs/luci-static/resources/view/homeproxy/server.js:310 +msgid "Max obfs packet size (1.14)" +msgstr "" + +#: htdocs/luci-static/resources/view/homeproxy/client.js:1003 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1744 +msgid "Max time an expired entry may be served. Examples: 3d, 1h." +msgstr "" + +#: htdocs/luci-static/resources/view/homeproxy/server.js:778 msgid "Max time difference" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1016 -#: htdocs/luci-static/resources/view/homeproxy/server.js:268 +#: htdocs/luci-static/resources/view/homeproxy/node.js:629 +#: htdocs/luci-static/resources/view/homeproxy/server.js:270 msgid "Max upload speed" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1017 -#: htdocs/luci-static/resources/view/homeproxy/server.js:269 +#: htdocs/luci-static/resources/view/homeproxy/node.js:630 +#: htdocs/luci-static/resources/view/homeproxy/server.js:271 msgid "Max upload speed in Mbps." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1486 -#: htdocs/luci-static/resources/view/homeproxy/server.js:578 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1135 +#: htdocs/luci-static/resources/view/homeproxy/server.js:594 msgid "Maximum TLS version" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1391 -#: htdocs/luci-static/resources/view/homeproxy/node.js:1405 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1000 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1014 msgid "Maximum connections" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1403 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1012 msgid "" "Maximum multiplexed streams in a connection before opening a new connection." "
Conflict with %s and %s." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1402 +#: htdocs/luci-static/resources/view/homeproxy/node.js:616 +#: htdocs/luci-static/resources/view/homeproxy/server.js:311 +msgid "Maximum on-wire packet size in bytes. Gecko only." +msgstr "" + +#: htdocs/luci-static/resources/view/homeproxy/node.js:565 +msgid "" +"Maximum port hopping interval in seconds; the actual interval is randomized " +"between the two values. Hysteria2 only." +msgstr "" + +#: htdocs/luci-static/resources/view/homeproxy/node.js:1011 msgid "Maximum streams" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:791 -#: htdocs/luci-static/resources/view/homeproxy/client.js:799 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1225 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1234 -#: htdocs/luci-static/resources/view/homeproxy/node.js:1271 -#: htdocs/luci-static/resources/view/homeproxy/server.js:452 +#: htdocs/luci-static/resources/view/homeproxy/client.js:835 +#: htdocs/luci-static/resources/view/homeproxy/client.js:843 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1346 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1355 +#: htdocs/luci-static/resources/view/homeproxy/node.js:880 +#: htdocs/luci-static/resources/view/homeproxy/server.js:468 msgid "Method" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1478 -#: htdocs/luci-static/resources/view/homeproxy/server.js:570 +#: htdocs/luci-static/resources/view/homeproxy/node.js:608 +#: htdocs/luci-static/resources/view/homeproxy/server.js:303 +msgid "Min obfs packet size (1.14)" +msgstr "" + +#: htdocs/luci-static/resources/view/homeproxy/node.js:1127 +#: htdocs/luci-static/resources/view/homeproxy/server.js:586 msgid "Minimum TLS version" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:950 +#: htdocs/luci-static/resources/view/homeproxy/node.js:541 msgid "Minimum idle sessions" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1397 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1006 msgid "" "Minimum multiplexed streams in a connection before opening a new connection." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1396 -#: htdocs/luci-static/resources/view/homeproxy/node.js:1405 +#: htdocs/luci-static/resources/view/homeproxy/node.js:609 +#: htdocs/luci-static/resources/view/homeproxy/server.js:304 +msgid "Minimum on-wire packet size in bytes. Gecko only." +msgstr "" + +#: htdocs/luci-static/resources/view/homeproxy/node.js:1005 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1014 msgid "Minimum streams" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1773 -msgid "Minutes(0-59) Hours(0-23) Dates(1-31) Months(1-12) Weeks(0-6)" -msgstr "" - -#: htdocs/luci-static/resources/view/homeproxy/client.js:333 +#: htdocs/luci-static/resources/view/homeproxy/client.js:359 #: htdocs/luci-static/resources/view/homeproxy/server.js:183 msgid "Mixed" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:344 +#: htdocs/luci-static/resources/view/homeproxy/client.js:370 msgid "Mixed system TCP stack and gVisor UDP stack." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:618 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1098 +#: htdocs/luci-static/resources/view/homeproxy/client.js:643 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1168 msgid "Mode" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1594 -#: htdocs/luci-static/resources/view/homeproxy/server.js:850 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1250 +#: htdocs/luci-static/resources/view/homeproxy/server.js:889 msgid "MultiPath TCP" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1374 -#: htdocs/luci-static/resources/view/homeproxy/server.js:500 +#: htdocs/luci-static/resources/view/homeproxy/node.js:983 +#: htdocs/luci-static/resources/view/homeproxy/server.js:516 msgid "Multiplex" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1382 +#: htdocs/luci-static/resources/view/homeproxy/node.js:991 msgid "Multiplex protocol." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:65 +#: htdocs/luci-static/resources/view/homeproxy/client.js:57 #: htdocs/luci-static/resources/view/homeproxy/server.js:60 msgid "NOT RUNNING" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1835 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1481 msgid "NOTE: Save current settings before updating subscriptions." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1255 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1376 msgid "NS" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1141 +#: htdocs/luci-static/resources/view/homeproxy/client.js:310 +#: htdocs/luci-static/resources/view/homeproxy/node.js:750 msgid "Native" msgstr "" @@ -1694,42 +1803,42 @@ msgstr "" msgid "NaïveProxy" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:660 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1122 -#: htdocs/luci-static/resources/view/homeproxy/server.js:866 +#: htdocs/luci-static/resources/view/homeproxy/client.js:685 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1192 +#: htdocs/luci-static/resources/view/homeproxy/server.js:905 msgid "Network" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1131 +#: htdocs/luci-static/resources/view/homeproxy/node.js:740 msgid "New Reno" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1204 -#: htdocs/luci-static/resources/view/homeproxy/node.js:1221 -#: htdocs/luci-static/resources/view/homeproxy/server.js:400 -#: htdocs/luci-static/resources/view/homeproxy/server.js:417 +#: htdocs/luci-static/resources/view/homeproxy/node.js:813 +#: htdocs/luci-static/resources/view/homeproxy/node.js:830 +#: htdocs/luci-static/resources/view/homeproxy/server.js:416 +#: htdocs/luci-static/resources/view/homeproxy/server.js:433 msgid "No TCP transport, plain HTTP is merged into the HTTP transport." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1219 -#: htdocs/luci-static/resources/view/homeproxy/server.js:415 +#: htdocs/luci-static/resources/view/homeproxy/node.js:828 +#: htdocs/luci-static/resources/view/homeproxy/server.js:431 msgid "No additional encryption support: It's basically duplicate encryption." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1852 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1498 msgid "No subscription available" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1877 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1523 msgid "No subscription node" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1704 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1357 msgid "No valid share link found." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:442 -#: htdocs/luci-static/resources/view/homeproxy/node.js:719 +#: htdocs/luci-static/resources/view/homeproxy/client.js:467 +#: htdocs/luci-static/resources/view/homeproxy/node.js:416 msgid "Node" msgstr "" @@ -1737,90 +1846,121 @@ msgstr "" msgid "Node Settings" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1650 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1303 msgid "Nodes" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1017 -#: htdocs/luci-static/resources/view/homeproxy/node.js:1167 -#: htdocs/luci-static/resources/view/homeproxy/node.js:1205 -#: htdocs/luci-static/resources/view/homeproxy/server.js:386 -#: htdocs/luci-static/resources/view/homeproxy/server.js:401 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1087 +#: htdocs/luci-static/resources/view/homeproxy/node.js:776 +#: htdocs/luci-static/resources/view/homeproxy/node.js:814 +#: htdocs/luci-static/resources/view/homeproxy/server.js:402 +#: htdocs/luci-static/resources/view/homeproxy/server.js:417 msgid "None" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:494 -#: htdocs/luci-static/resources/view/homeproxy/node.js:507 -msgid "Not Tested" -msgstr "" - -#: htdocs/luci-static/resources/view/homeproxy/node.js:1003 -#: htdocs/luci-static/resources/view/homeproxy/server.js:294 +#: htdocs/luci-static/resources/view/homeproxy/node.js:602 +#: htdocs/luci-static/resources/view/homeproxy/server.js:297 msgid "Obfuscate password" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:997 -#: htdocs/luci-static/resources/view/homeproxy/server.js:288 +#: htdocs/luci-static/resources/view/homeproxy/node.js:595 +#: htdocs/luci-static/resources/view/homeproxy/server.js:290 msgid "Obfuscate type" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1431 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1067 +msgid "Obfuscation host" +msgstr "" + +#: htdocs/luci-static/resources/view/homeproxy/node.js:1060 +#: htdocs/luci-static/resources/view/homeproxy/server.js:337 +msgid "Obfuscation mode" +msgstr "" + +#: htdocs/luci-static/resources/view/homeproxy/client.js:1595 msgid "Only process traffic from specific interfaces. Leave empty for all." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:277 +#: htdocs/luci-static/resources/view/homeproxy/client.js:254 msgid "Only proxy mainland China" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:603 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1083 +#: htdocs/luci-static/resources/view/homeproxy/client.js:996 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1739 +msgid "Optimistic DNS cache" +msgstr "" + +#: htdocs/luci-static/resources/view/homeproxy/client.js:1002 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1743 +msgid "Optimistic cache timeout" +msgstr "" + +#: htdocs/luci-static/resources/view/homeproxy/client.js:1292 +msgid "Optional tag for this evaluate result." +msgstr "" + +#: htdocs/luci-static/resources/view/homeproxy/node.js:1051 +msgid "Optional; only required when connecting to a multi-user Snell server." +msgstr "" + +#: htdocs/luci-static/resources/view/homeproxy/client.js:628 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1153 msgid "Other fields" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:483 -#: htdocs/luci-static/resources/view/homeproxy/client.js:701 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1050 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1398 +#: htdocs/luci-static/resources/view/homeproxy/client.js:508 +#: htdocs/luci-static/resources/view/homeproxy/client.js:726 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1120 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1540 msgid "Outbound" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:443 +#: htdocs/luci-static/resources/view/homeproxy/client.js:468 msgid "Outbound node" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:719 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1541 +msgid "" +"Outbound used to download this rule-set (via sing-box 1.14 http_clients)." +msgstr "" + +#: htdocs/luci-static/resources/view/homeproxy/client.js:744 msgid "Override address" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:375 -msgid "Override destination" +#: htdocs/luci-static/resources/view/homeproxy/client.js:878 +msgid "Override dns.timeout for this lookup, in seconds (1.14)." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:726 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1314 +msgid "Override dns.timeout for this query, in seconds." +msgstr "" + +#: htdocs/luci-static/resources/view/homeproxy/client.js:751 msgid "Override port" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:376 -msgid "Override the connection destination address with the sniffed domain." -msgstr "" - -#: htdocs/luci-static/resources/view/homeproxy/client.js:720 +#: htdocs/luci-static/resources/view/homeproxy/client.js:745 msgid "Override the connection destination address." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:727 +#: htdocs/luci-static/resources/view/homeproxy/client.js:752 msgid "Override the connection destination port." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1273 +#: htdocs/luci-static/resources/view/homeproxy/server.js:660 +msgid "PEM-encoded private key of an existing ACME account (1.14)." +msgstr "" + +#: htdocs/luci-static/resources/view/homeproxy/node.js:882 msgid "PUT" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1316 +#: htdocs/luci-static/resources/view/homeproxy/node.js:925 msgid "Packet encoding" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/server.js:244 +#: htdocs/luci-static/resources/view/homeproxy/server.js:246 msgid "Padding scheme" msgstr "" @@ -1828,77 +1968,85 @@ msgstr "" msgid "Panic" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:894 -#: htdocs/luci-static/resources/view/homeproxy/server.js:210 +#: htdocs/luci-static/resources/view/homeproxy/node.js:484 +#: htdocs/luci-static/resources/view/homeproxy/server.js:211 msgid "Password" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:990 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1369 -#: htdocs/luci-static/resources/view/homeproxy/node.js:1266 -#: htdocs/luci-static/resources/view/homeproxy/node.js:1299 -#: htdocs/luci-static/resources/view/homeproxy/server.js:447 -#: htdocs/luci-static/resources/view/homeproxy/server.js:477 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1060 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1508 +#: htdocs/luci-static/resources/view/homeproxy/node.js:875 +#: htdocs/luci-static/resources/view/homeproxy/node.js:908 +#: htdocs/luci-static/resources/view/homeproxy/server.js:463 +#: htdocs/luci-static/resources/view/homeproxy/server.js:493 msgid "Path" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1341 +#: htdocs/luci-static/resources/view/homeproxy/node.js:950 msgid "Peer pubkic key" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:352 +#: htdocs/luci-static/resources/view/homeproxy/client.js:378 msgid "" "Performance may degrade slightly, so it is not recommended to enable on when " "it is not needed." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1366 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1752 +msgid "Persist DNS cache across restarts (replaces Store RDRC)." +msgstr "" + +#: htdocs/luci-static/resources/view/homeproxy/client.js:1011 +msgid "Persist DNS cache across restarts (sing-box 1.14, replaces Store RDRC)." +msgstr "" + +#: htdocs/luci-static/resources/view/homeproxy/node.js:975 msgid "Persistent keepalive interval" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1285 -#: htdocs/luci-static/resources/view/homeproxy/server.js:464 +#: htdocs/luci-static/resources/view/homeproxy/node.js:894 +#: htdocs/luci-static/resources/view/homeproxy/server.js:480 msgid "Ping timeout" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1060 +#: htdocs/luci-static/resources/view/homeproxy/node.js:669 msgid "Plugin" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1067 +#: htdocs/luci-static/resources/view/homeproxy/node.js:676 msgid "Plugin opts" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:871 -#: htdocs/luci-static/resources/view/homeproxy/client.js:985 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1309 -#: htdocs/luci-static/resources/view/homeproxy/node.js:883 +#: htdocs/luci-static/resources/view/homeproxy/client.js:935 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1055 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1448 +#: htdocs/luci-static/resources/view/homeproxy/node.js:473 msgid "Port" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:299 +#: htdocs/luci-static/resources/view/homeproxy/client.js:276 msgid "Port %s alrealy exists!" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:605 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1085 +#: htdocs/luci-static/resources/view/homeproxy/client.js:630 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1155 msgid "Port fields" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:966 +#: htdocs/luci-static/resources/view/homeproxy/node.js:557 msgid "Port hopping interval in seconds." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:876 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1314 +#: htdocs/luci-static/resources/view/homeproxy/client.js:940 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1453 msgid "Port range" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1348 +#: htdocs/luci-static/resources/view/homeproxy/node.js:957 msgid "Pre-shared key" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1173 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1239 msgid "Predefined" msgstr "" @@ -1910,197 +2058,180 @@ msgstr "" msgid "Prefer IPv6" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1108 -#: htdocs/luci-static/resources/view/homeproxy/node.js:1333 +#: htdocs/luci-static/resources/view/homeproxy/node.js:717 +#: htdocs/luci-static/resources/view/homeproxy/node.js:942 msgid "Private key" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1113 +#: htdocs/luci-static/resources/view/homeproxy/node.js:722 msgid "Private key passphrase" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:484 -msgid "Probe failed" +#: htdocs/luci-static/resources/view/homeproxy/server.js:644 +msgid "Private key type for new certificates (1.14). Empty uses the default." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:606 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1086 +#: htdocs/luci-static/resources/view/homeproxy/client.js:631 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1156 msgid "Process fields" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:881 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1319 +#: htdocs/luci-static/resources/view/homeproxy/client.js:945 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1458 msgid "Process name" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:885 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1323 +#: htdocs/luci-static/resources/view/homeproxy/client.js:949 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1462 msgid "Process path" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:889 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1327 +#: htdocs/luci-static/resources/view/homeproxy/client.js:953 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1466 msgid "Process path (regex)" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:638 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1127 -#: htdocs/luci-static/resources/view/homeproxy/node.js:973 -#: htdocs/luci-static/resources/view/homeproxy/node.js:1381 -#: htdocs/luci-static/resources/view/homeproxy/server.js:250 +#: htdocs/luci-static/resources/view/homeproxy/client.js:663 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1197 +#: htdocs/luci-static/resources/view/homeproxy/node.js:571 +#: htdocs/luci-static/resources/view/homeproxy/node.js:990 +#: htdocs/luci-static/resources/view/homeproxy/server.js:252 msgid "Protocol" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1197 +#: htdocs/luci-static/resources/view/homeproxy/node.js:806 msgid "Protocol parameter. Enable length block encryption." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1190 +#: htdocs/luci-static/resources/view/homeproxy/node.js:799 msgid "" "Protocol parameter. Will waste traffic randomly if enabled (enabled by " "default in v2ray and cannot be disabled)." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1505 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1669 msgid "Proxy Domain List" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1460 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1489 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1624 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1653 msgid "Proxy IPv4 IP-s" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1463 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1492 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1627 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1656 msgid "Proxy IPv6 IP-s" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1466 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1630 msgid "Proxy MAC-s" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1447 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1611 msgid "Proxy all except listed" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1444 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1608 msgid "Proxy filter mode" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1446 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1610 msgid "Proxy listed only" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:307 +#: htdocs/luci-static/resources/view/homeproxy/client.js:284 msgid "Proxy mode" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:927 +#: htdocs/luci-static/resources/view/homeproxy/node.js:518 msgid "Proxy protocol" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:644 -#: htdocs/luci-static/resources/view/homeproxy/client.js:976 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1132 -#: htdocs/luci-static/resources/view/homeproxy/node.js:1142 -#: htdocs/luci-static/resources/view/homeproxy/node.js:1209 -#: htdocs/luci-static/resources/view/homeproxy/server.js:405 +#: htdocs/luci-static/resources/view/homeproxy/client.js:669 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1046 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1202 +#: htdocs/luci-static/resources/view/homeproxy/node.js:751 +#: htdocs/luci-static/resources/view/homeproxy/node.js:818 +#: htdocs/luci-static/resources/view/homeproxy/server.js:421 msgid "QUIC" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1129 -#: htdocs/luci-static/resources/view/homeproxy/server.js:355 +#: htdocs/luci-static/resources/view/homeproxy/node.js:738 +#: htdocs/luci-static/resources/view/homeproxy/server.js:371 msgid "QUIC congestion control algorithm." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1029 -#: htdocs/luci-static/resources/view/homeproxy/server.js:307 -msgid "QUIC connection receive window" +#: htdocs/luci-static/resources/view/homeproxy/client.js:1429 +msgid "Query EDNS client subnet" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/server.js:314 -msgid "QUIC maximum concurrent bidirectional streams" +#: htdocs/luci-static/resources/view/homeproxy/client.js:877 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1313 +msgid "Query timeout" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1023 -#: htdocs/luci-static/resources/view/homeproxy/server.js:300 -msgid "QUIC stream receive window" -msgstr "" - -#: htdocs/luci-static/resources/view/homeproxy/client.js:209 -msgid "Quad9 Public DNS (DoH)" -msgstr "" - -#: htdocs/luci-static/resources/view/homeproxy/client.js:1118 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1188 msgid "Query type" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1238 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1359 msgid "RCode" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:645 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1133 +#: htdocs/luci-static/resources/view/homeproxy/client.js:670 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1203 msgid "RDP" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:940 -msgid "RDRC timeout" -msgstr "" - -#: htdocs/luci-static/resources/view/homeproxy/node.js:1572 -#: htdocs/luci-static/resources/view/homeproxy/server.js:709 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1228 +#: htdocs/luci-static/resources/view/homeproxy/server.js:748 msgid "REALITY" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/server.js:714 +#: htdocs/luci-static/resources/view/homeproxy/server.js:753 msgid "REALITY private key" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1577 -#: htdocs/luci-static/resources/view/homeproxy/server.js:730 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1233 +#: htdocs/luci-static/resources/view/homeproxy/server.js:769 msgid "REALITY public key" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1583 -#: htdocs/luci-static/resources/view/homeproxy/server.js:734 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1239 +#: htdocs/luci-static/resources/view/homeproxy/server.js:773 msgid "REALITY short ID" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1785 -msgid "RP" -msgstr "" - -#: htdocs/luci-static/resources/view/homeproxy/node.js:486 -msgid "RPC failed" -msgstr "" - -#: htdocs/luci-static/resources/view/homeproxy/client.js:63 +#: htdocs/luci-static/resources/view/homeproxy/client.js:55 #: htdocs/luci-static/resources/view/homeproxy/server.js:58 msgid "RUNNING" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1095 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1296 +msgid "Race" +msgstr "" + +#: htdocs/luci-static/resources/view/homeproxy/node.js:704 msgid "Random version will be used if empty." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:511 +#: htdocs/luci-static/resources/view/homeproxy/client.js:536 msgid "Recursive outbound detected!" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1036 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1106 msgid "Recursive resolver detected!" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:308 +#: htdocs/luci-static/resources/view/homeproxy/client.js:285 msgid "Redirect TCP" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:310 +#: htdocs/luci-static/resources/view/homeproxy/client.js:287 msgid "Redirect TCP + TProxy UDP" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:312 +#: htdocs/luci-static/resources/view/homeproxy/client.js:289 msgid "Redirect TCP + Tun UDP" msgstr "" @@ -2108,44 +2239,52 @@ msgstr "" msgid "Refresh every %s seconds." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/server.js:659 +#: htdocs/luci-static/resources/view/homeproxy/server.js:698 msgid "Region ID" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:695 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1172 +#: htdocs/luci-static/resources/view/homeproxy/client.js:720 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1238 msgid "Reject" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1359 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1498 msgid "Remote" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1874 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1520 msgid "Remove %s nodes" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1864 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1320 +msgid "Remove EDNS client subnet" +msgstr "" + +#: htdocs/luci-static/resources/view/homeproxy/node.js:1510 msgid "Remove all nodes from subscriptions" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1226 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1321 +msgid "Remove the edns0-subnet record from the query (1.14)." +msgstr "" + +#: htdocs/luci-static/resources/view/homeproxy/client.js:1347 msgid "Reply with REFUSED" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:792 +#: htdocs/luci-static/resources/view/homeproxy/client.js:836 msgid "Reply with TCP RST / ICMP port unreachable" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1355 +#: htdocs/luci-static/resources/view/homeproxy/node.js:964 msgid "Reserved field bytes" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:696 +#: htdocs/luci-static/resources/view/homeproxy/client.js:721 msgid "Resolve" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:803 +#: htdocs/luci-static/resources/view/homeproxy/client.js:847 msgid "Resolve strategy" msgstr "" @@ -2153,145 +2292,128 @@ msgstr "" msgid "Resources management" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/server.js:880 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1338 +msgid "Response NS" +msgstr "" + +#: htdocs/luci-static/resources/view/homeproxy/client.js:1326 +msgid "Response RCode" +msgstr "" + +#: htdocs/luci-static/resources/view/homeproxy/client.js:1333 +msgid "Response answer" +msgstr "" + +#: htdocs/luci-static/resources/view/homeproxy/client.js:1342 +msgid "Response extra" +msgstr "" + +#: htdocs/luci-static/resources/view/homeproxy/client.js:997 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1740 +msgid "" +"Return expired cache immediately and refresh in background (sing-box 1.14)." +msgstr "" + +#: htdocs/luci-static/resources/view/homeproxy/server.js:919 msgid "Reuse address" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/server.js:881 +#: htdocs/luci-static/resources/view/homeproxy/server.js:920 msgid "Reuse listener address." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:815 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1210 +#: htdocs/luci-static/resources/view/homeproxy/client.js:859 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1271 msgid "Rewrite TTL" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:816 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1211 +#: htdocs/luci-static/resources/view/homeproxy/client.js:860 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1272 msgid "Rewrite TTL in DNS responses." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:693 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1170 +#: htdocs/luci-static/resources/view/homeproxy/client.js:718 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1236 msgid "Route" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:694 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1171 +#: htdocs/luci-static/resources/view/homeproxy/client.js:719 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1237 msgid "Route options" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:419 +#: htdocs/luci-static/resources/view/homeproxy/client.js:444 msgid "Routing Nodes" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:590 +#: htdocs/luci-static/resources/view/homeproxy/client.js:615 msgid "Routing Rules" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:145 +#: htdocs/luci-static/resources/view/homeproxy/client.js:120 msgid "Routing Settings" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:274 +#: htdocs/luci-static/resources/view/homeproxy/client.js:251 msgid "Routing mode" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:428 +#: htdocs/luci-static/resources/view/homeproxy/client.js:453 msgid "Routing node" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:287 +#: htdocs/luci-static/resources/view/homeproxy/client.js:264 msgid "Routing ports" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:599 +#: htdocs/luci-static/resources/view/homeproxy/client.js:624 msgid "Routing rule" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1334 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1473 msgid "Rule Set" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:669 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1142 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1343 +#: htdocs/luci-static/resources/view/homeproxy/client.js:694 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1212 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1482 msgid "Rule set" msgstr "" -msgid "Tag" -msgstr "" - -msgid "Used by sing-box rule sets. Please fill it in yourself." -msgstr "" - -msgid "valid tag" -msgstr "" - -msgid "valid duration" -msgstr "" - -msgid "valid cron expression" -msgstr "" - -msgid "Manual select" -msgstr "" - -msgid "Custom nodes" -msgstr "" - -msgid "Custom" -msgstr "" - -msgid "Custom URL" -msgstr "" - -msgid "Policy nodes" -msgstr "" - -msgid "List of policy groups." -msgstr "" - -msgid "Subscription nodes" -msgstr "" - -msgid "List of nodes from subscriptions." -msgstr "" - -#: htdocs/luci-static/resources/view/homeproxy/client.js:684 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1157 +#: htdocs/luci-static/resources/view/homeproxy/client.js:709 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1227 msgid "Rule set IP CIDR as source IP" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1376 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1515 msgid "Rule set URL" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:646 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1134 -#: htdocs/luci-static/resources/view/homeproxy/node.js:868 +#: htdocs/luci-static/resources/view/homeproxy/client.js:671 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1204 +#: htdocs/luci-static/resources/view/homeproxy/node.js:458 msgid "SSH" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:647 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1135 +#: htdocs/luci-static/resources/view/homeproxy/client.js:672 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1205 msgid "STUN" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1607 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1263 msgid "SUoT version" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:655 +#: htdocs/luci-static/resources/view/homeproxy/client.js:680 msgid "Safari / Apple Network API" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:999 -#: htdocs/luci-static/resources/view/homeproxy/server.js:290 +#: htdocs/luci-static/resources/view/homeproxy/node.js:597 +#: htdocs/luci-static/resources/view/homeproxy/server.js:292 msgid "Salamander" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:177 +#: htdocs/luci-static/resources/view/homeproxy/client.js:152 msgid "Same as main node" msgstr "" @@ -2300,15 +2422,19 @@ msgstr "" msgid "Save" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1837 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1483 msgid "Save current settings" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1834 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1480 msgid "Save subscriptions settings" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1178 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1302 +msgid "Send the query before pending race rules are judged (1.14)." +msgstr "" + +#: htdocs/luci-static/resources/view/homeproxy/client.js:1245 #: htdocs/luci-static/resources/view/homeproxy/server.js:156 msgid "Server" msgstr "" @@ -2317,7 +2443,7 @@ msgstr "" msgid "Server Settings" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/server.js:607 +#: htdocs/luci-static/resources/view/homeproxy/server.js:623 msgid "" "Server name to use when choosing a certificate if the ClientHello's " "ServerName field is empty." @@ -2331,81 +2457,104 @@ msgstr "" msgid "Service Status" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1198 -msgid "Set domain strategy for this query." -msgstr "" - -#: htdocs/luci-static/resources/view/homeproxy/node.js:866 +#: htdocs/luci-static/resources/view/homeproxy/node.js:456 msgid "ShadowTLS" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1074 +#: htdocs/luci-static/resources/view/homeproxy/node.js:683 msgid "ShadowTLS version" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:865 +#: htdocs/luci-static/resources/view/homeproxy/node.js:455 #: htdocs/luci-static/resources/view/homeproxy/server.js:184 msgid "Shadowsocks" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:651 +#: htdocs/luci-static/resources/view/homeproxy/client.js:307 +msgid "" +"Since sing-box 1.14 the default (Unset) behaves as hijack: sing-box sets the " +"platform interface DNS and hijacks port 53. On OpenWrt this overlaps with " +"the own dnsmasq/nftables DNS hijack of this plugin, so keep Disabled on a " +"gateway unless you need sing-box to own TUN DNS." +msgstr "" + +#: htdocs/luci-static/resources/view/homeproxy/server.js:185 +msgid "Snell (1.14)" +msgstr "" + +#: htdocs/luci-static/resources/view/homeproxy/node.js:1042 +#: htdocs/luci-static/resources/view/homeproxy/server.js:329 +msgid "Snell version" +msgstr "" + +#: htdocs/luci-static/resources/view/homeproxy/client.js:676 msgid "Sniffed client type (QUIC client type or SSH client name)." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:639 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1128 +#: htdocs/luci-static/resources/view/homeproxy/client.js:664 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1198 msgid "" -"Sniffed protocol, see Sniff for details." +"Sniffed protocol, see Sniff for details." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:867 -#: htdocs/luci-static/resources/view/homeproxy/server.js:185 +#: htdocs/luci-static/resources/view/homeproxy/node.js:457 +#: htdocs/luci-static/resources/view/homeproxy/server.js:186 msgid "Socks" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1084 +#: htdocs/luci-static/resources/view/homeproxy/node.js:693 msgid "Socks version" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1085 +#: htdocs/luci-static/resources/view/homeproxy/node.js:694 msgid "Socks4" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1086 +#: htdocs/luci-static/resources/view/homeproxy/node.js:695 msgid "Socks4A" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1087 +#: htdocs/luci-static/resources/view/homeproxy/node.js:696 msgid "Socks5" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:845 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1282 +#: htdocs/luci-static/resources/view/homeproxy/client.js:900 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1403 msgid "Source IP CIDR" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1365 +#: htdocs/luci-static/resources/view/homeproxy/client.js:916 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1420 +msgid "Source MAC address" +msgstr "" + +#: htdocs/luci-static/resources/view/homeproxy/client.js:1504 msgid "Source file" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:861 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1299 +#: htdocs/luci-static/resources/view/homeproxy/client.js:921 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1425 +msgid "Source hostname" +msgstr "" + +#: htdocs/luci-static/resources/view/homeproxy/client.js:925 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1438 msgid "Source port" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:866 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1304 +#: htdocs/luci-static/resources/view/homeproxy/client.js:930 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1443 msgid "Source port range" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:773 +#: htdocs/luci-static/resources/view/homeproxy/client.js:817 msgid "" "Specifies DNS server tag to use instead of selecting through DNS routing." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1226 -#: htdocs/luci-static/resources/view/homeproxy/node.js:1278 +#: htdocs/luci-static/resources/view/homeproxy/node.js:835 +#: htdocs/luci-static/resources/view/homeproxy/node.js:887 msgid "" "Specifies the period of time (in seconds) after which a health check will be " "performed using a ping frame if no frames have been received on the " @@ -2414,15 +2563,15 @@ msgid "" "will be executed every interval." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/server.js:422 -#: htdocs/luci-static/resources/view/homeproxy/server.js:457 +#: htdocs/luci-static/resources/view/homeproxy/server.js:438 +#: htdocs/luci-static/resources/view/homeproxy/server.js:473 msgid "" "Specifies the time (in seconds) until idle clients should be closed with a " "GOAWAY frame. PING frames are not considered as activity." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1230 -#: htdocs/luci-static/resources/view/homeproxy/node.js:1286 +#: htdocs/luci-static/resources/view/homeproxy/node.js:839 +#: htdocs/luci-static/resources/view/homeproxy/node.js:895 msgid "" "Specifies the timeout duration (in seconds) after sending a PING frame, " "within which a response must be received.
If a response to the PING " @@ -2430,34 +2579,43 @@ msgid "" "will be closed." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:288 +#: htdocs/luci-static/resources/view/homeproxy/client.js:265 msgid "" "Specify target ports to be proxied. Multiple ports must be separated by " "commas." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:987 -#: htdocs/luci-static/resources/view/homeproxy/server.js:278 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1301 +msgid "Speculative" +msgstr "" + +#: htdocs/luci-static/resources/view/homeproxy/node.js:638 +msgid "Standard (default)" +msgstr "" + +#: htdocs/luci-static/resources/view/homeproxy/client.js:1010 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1751 +msgid "Store DNS cache" +msgstr "" + +#: htdocs/luci-static/resources/view/homeproxy/node.js:585 +#: htdocs/luci-static/resources/view/homeproxy/server.js:280 msgid "String" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1755 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1408 msgid "Sub (%s)" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1789 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1435 msgid "Subscription URL-s" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1766 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1419 msgid "Subscriptions" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:500 -msgid "Success" -msgstr "" - -#: htdocs/luci-static/resources/view/homeproxy/node.js:1706 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1359 msgid "Successfully imported %s nodes of total %s." msgstr "" @@ -2465,353 +2623,357 @@ msgstr "" msgid "Successfully updated." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1666 -#: htdocs/luci-static/resources/view/homeproxy/node.js:1790 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1319 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1436 msgid "" "Support Hysteria, Shadowsocks, Trojan, v2rayN (VMess), and XTLS (VLESS) " "online configuration delivery standard." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:205 +#: htdocs/luci-static/resources/view/homeproxy/client.js:180 msgid "" "Support UDP, TCP, DoH, DoQ, DoT. TCP protocol will be used if not specified." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:336 +#: htdocs/luci-static/resources/view/homeproxy/client.js:362 msgid "System" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:406 -#: htdocs/luci-static/resources/view/homeproxy/client.js:458 -#: htdocs/luci-static/resources/view/homeproxy/client.js:780 -#: htdocs/luci-static/resources/view/homeproxy/client.js:911 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1019 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1185 +#: htdocs/luci-static/resources/view/homeproxy/client.js:431 +#: htdocs/luci-static/resources/view/homeproxy/client.js:483 +#: htdocs/luci-static/resources/view/homeproxy/client.js:824 +#: htdocs/luci-static/resources/view/homeproxy/client.js:975 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1089 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1252 msgid "System DNS" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:661 -#: htdocs/luci-static/resources/view/homeproxy/client.js:972 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1123 -#: htdocs/luci-static/resources/view/homeproxy/server.js:867 +#: htdocs/luci-static/resources/view/homeproxy/client.js:686 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1042 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1193 +#: htdocs/luci-static/resources/view/homeproxy/server.js:906 msgid "TCP" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1591 -#: htdocs/luci-static/resources/view/homeproxy/server.js:845 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1247 +#: htdocs/luci-static/resources/view/homeproxy/server.js:884 msgid "TCP fast open" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:330 +#: htdocs/luci-static/resources/view/homeproxy/client.js:356 msgid "TCP/IP stack" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:331 +#: htdocs/luci-static/resources/view/homeproxy/client.js:357 msgid "TCP/IP stack." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:648 -#: htdocs/luci-static/resources/view/homeproxy/client.js:973 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1136 -#: htdocs/luci-static/resources/view/homeproxy/node.js:1433 -#: htdocs/luci-static/resources/view/homeproxy/server.js:532 +#: htdocs/luci-static/resources/view/homeproxy/client.js:673 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1043 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1206 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1082 +#: htdocs/luci-static/resources/view/homeproxy/server.js:548 msgid "TLS" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1465 -#: htdocs/luci-static/resources/view/homeproxy/server.js:565 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1114 +#: htdocs/luci-static/resources/view/homeproxy/server.js:581 msgid "TLS ALPN" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1003 -#: htdocs/luci-static/resources/view/homeproxy/node.js:1460 -#: htdocs/luci-static/resources/view/homeproxy/server.js:560 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1073 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1109 +#: htdocs/luci-static/resources/view/homeproxy/server.js:576 msgid "TLS SNI" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:758 +#: htdocs/luci-static/resources/view/homeproxy/client.js:783 msgid "TLS fragment" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1217 -#: htdocs/luci-static/resources/view/homeproxy/server.js:413 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1152 +msgid "TLS handshake timeout in seconds. 15s is used by default." +msgstr "" + +#: htdocs/luci-static/resources/view/homeproxy/node.js:826 +#: htdocs/luci-static/resources/view/homeproxy/server.js:429 msgid "TLS is not enforced. If TLS is not configured, plain HTTP 1.1 is used." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:752 -#: htdocs/luci-static/resources/view/homeproxy/client.js:760 +#: htdocs/luci-static/resources/view/homeproxy/client.js:777 +#: htdocs/luci-static/resources/view/homeproxy/client.js:785 msgid "TLS record fragment" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1012 -msgid "Used to resolve DNS server addresses in domain form. IP addresses do not require it." +#: htdocs/luci-static/resources/view/homeproxy/client.js:797 +msgid "TLS spoof SNI (1.14)" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1051 +#: htdocs/luci-static/resources/view/homeproxy/client.js:804 +msgid "TLS spoof method (1.14)" +msgstr "" + +#: htdocs/luci-static/resources/view/homeproxy/client.js:317 +msgid "TUN DNS addresses (1.14)" +msgstr "" + +#: htdocs/luci-static/resources/view/homeproxy/client.js:306 +msgid "TUN DNS mode (1.14)" +msgstr "" + +#: htdocs/luci-static/resources/view/homeproxy/client.js:1082 +msgid "" +"Tag of a another server to resolve the domain name in the address. Required " +"if address contains domain." +msgstr "" + +#: htdocs/luci-static/resources/view/homeproxy/client.js:1121 msgid "Tag of an outbound for connecting to the dns server." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1399 -msgid "Tag of the outbound to download rule set." -msgstr "" - -#: htdocs/luci-static/resources/view/homeproxy/client.js:1179 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1246 msgid "Tag of the target dns server." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:702 +#: htdocs/luci-static/resources/view/homeproxy/client.js:727 msgid "Tag of the target outbound." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/server.js:327 +#: htdocs/luci-static/resources/view/homeproxy/server.js:318 msgid "" "Tell the client to use the BBR flow control algorithm instead of Hysteria CC." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:245 -msgid "Tencent Public DNS (DoH)" +#: htdocs/luci-static/resources/view/homeproxy/client.js:187 +#: htdocs/luci-static/resources/view/homeproxy/client.js:222 +msgid "Tencent Public DNS (119.29.29.29)" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:541 -#: htdocs/luci-static/resources/view/homeproxy/node.js:826 -msgid "Test" -msgstr "" - -#: htdocs/luci-static/resources/view/homeproxy/node.js:1924 -#: htdocs/luci-static/resources/view/homeproxy/node.js:1928 -msgid "Test Current List" -msgstr "" - -#: htdocs/luci-static/resources/view/homeproxy/client.js:533 +#: htdocs/luci-static/resources/view/homeproxy/client.js:558 msgid "Test URL" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:163 -#: htdocs/luci-static/resources/view/homeproxy/client.js:192 -#: htdocs/luci-static/resources/view/homeproxy/client.js:553 +#: htdocs/luci-static/resources/view/homeproxy/client.js:138 +#: htdocs/luci-static/resources/view/homeproxy/client.js:167 +#: htdocs/luci-static/resources/view/homeproxy/client.js:578 msgid "Test interval" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:561 +#: htdocs/luci-static/resources/view/homeproxy/client.js:586 msgid "Test interval must be less or equal than idle timeout." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:169 -#: htdocs/luci-static/resources/view/homeproxy/client.js:198 -#: htdocs/luci-static/resources/view/homeproxy/client.js:569 +#: htdocs/luci-static/resources/view/homeproxy/client.js:144 +#: htdocs/luci-static/resources/view/homeproxy/client.js:173 +#: htdocs/luci-static/resources/view/homeproxy/client.js:594 msgid "Test tolerance" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:498 -#: htdocs/luci-static/resources/view/homeproxy/node.js:541 -msgid "Testing" +#: htdocs/luci-static/resources/view/homeproxy/client.js:1334 +msgid "Text DNS records to match in the evaluated answer." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1917 -msgid "Testing Current List..." -msgstr "" - -#: htdocs/luci-static/resources/view/homeproxy/server.js:628 +#: htdocs/luci-static/resources/view/homeproxy/server.js:667 msgid "The ACME CA provider to use." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:901 +#: htdocs/luci-static/resources/view/homeproxy/client.js:965 msgid "The DNS strategy for resolving the domain name in the address." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1030 -#: htdocs/luci-static/resources/view/homeproxy/server.js:308 -msgid "The QUIC connection-level flow control window for receiving data." -msgstr "" - -#: htdocs/luci-static/resources/view/homeproxy/node.js:1024 -#: htdocs/luci-static/resources/view/homeproxy/server.js:301 -msgid "The QUIC stream-level flow control window for receiving data." -msgstr "" - -#: htdocs/luci-static/resources/view/homeproxy/client.js:534 +#: htdocs/luci-static/resources/view/homeproxy/client.js:559 msgid "The URL to test." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:981 -msgid "Full URL, e.g. https://dns.alidns.com/dns-query" +#: htdocs/luci-static/resources/view/homeproxy/client.js:1051 +msgid "The address of the dns server." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/server.js:679 +#: htdocs/luci-static/resources/view/homeproxy/server.js:718 msgid "" "The alternate port to use for the ACME HTTP challenge; if non-empty, this " "port will be used instead of 80 to spin up a listener for the HTTP challenge." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/server.js:685 +#: htdocs/luci-static/resources/view/homeproxy/server.js:724 msgid "" "The alternate port to use for the ACME TLS-ALPN challenge; the system must " "forward 443 to this port for challenge to succeed." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js -msgid "In default mode, rule fields are matched by category. Any condition in the same category can match, while different categories must match at the same time. Rule sets are merged into the rule for matching and are not treated as separate sub-rules." +#: htdocs/luci-static/resources/view/homeproxy/client.js:644 +msgid "" +"The default rule uses the following matching logic:
(domain || " +"domain_suffix || domain_keyword || domain_regex || ip_cidr || " +"ip_is_private) &&
(port || port_range) &&
(source_ip_cidr || source_ip_is_private) &&
(source_port || source_port_range) &&
other fields.
Additionally, included rule sets can be considered merged rather " +"than as a single rule sub-item." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:242 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1169 +msgid "" +"The default rule uses the following matching logic:
(domain || " +"domain_suffix || domain_keyword || domain_regex) &&
(port " +"|| port_range) &&
(source_ip_cidr || source_ip_is_private) &&
(source_port || source_port_range) &&
other fields.
Additionally, included rule sets can be " +"considered merged rather than as a single rule sub-item." +msgstr "" + +#: htdocs/luci-static/resources/view/homeproxy/client.js:218 msgid "" "The dns server for resolving China domains. Support UDP, TCP, DoH, DoQ, DoT." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:470 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1044 +#: htdocs/luci-static/resources/view/homeproxy/client.js:495 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1114 msgid "The domain strategy for resolving the domain name in the address." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1495 -#: htdocs/luci-static/resources/view/homeproxy/server.js:587 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1144 +#: htdocs/luci-static/resources/view/homeproxy/server.js:603 msgid "" "The elliptic curves that will be used in an ECDHE handshake, in preference " "order. If empty, the default will be used." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/server.js:613 +#: htdocs/luci-static/resources/view/homeproxy/server.js:629 msgid "" "The email address to use when creating or selecting an existing ACME server " "account." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:766 +#: htdocs/luci-static/resources/view/homeproxy/client.js:791 msgid "" "The fallback value in milliseconds used when TLS segmentation cannot " "automatically determine the wait time." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:577 +#: htdocs/luci-static/resources/view/homeproxy/client.js:602 msgid "The idle timeout in seconds." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1487 -#: htdocs/luci-static/resources/view/homeproxy/server.js:579 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1136 +#: htdocs/luci-static/resources/view/homeproxy/server.js:595 msgid "The maximum TLS version that is acceptable." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/server.js:315 -msgid "" -"The maximum number of QUIC concurrent bidirectional streams that a peer is " -"allowed to open." -msgstr "" - -#: htdocs/luci-static/resources/view/homeproxy/server.js:740 +#: htdocs/luci-static/resources/view/homeproxy/server.js:779 msgid "The maximum time difference between the server and the client." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1479 -#: htdocs/luci-static/resources/view/homeproxy/server.js:571 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1128 +#: htdocs/luci-static/resources/view/homeproxy/server.js:587 msgid "The minimum TLS version that is acceptable." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:113 +#: htdocs/luci-static/resources/view/homeproxy/client.js:102 #: htdocs/luci-static/resources/view/homeproxy/server.js:130 -msgid "OpenWrt-designed Sing-box proxy management platform. It is recommended to disable Dnsmasq DNS redirection." +msgid "The modern ImmortalWrt proxy platform for ARM64/AMD64." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:477 -#: htdocs/luci-static/resources/view/homeproxy/server.js:875 +#: htdocs/luci-static/resources/view/homeproxy/client.js:502 +#: htdocs/luci-static/resources/view/homeproxy/server.js:914 msgid "The network interface to bind to." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1529 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1061 +msgid "The path of the DNS server." +msgstr "" + +#: htdocs/luci-static/resources/view/homeproxy/node.js:1185 msgid "" "The path to the ECH config, in PEM format. If empty, load from DNS will be " "attempted." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1508 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1164 msgid "The path to the server certificate, in PEM format." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/server.js:199 +#: htdocs/luci-static/resources/view/homeproxy/server.js:200 msgid "The port must be unique." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:986 -msgid "Leave empty to use the default port." +#: htdocs/luci-static/resources/view/homeproxy/client.js:1056 +msgid "The port of the DNS server." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1239 +#: htdocs/luci-static/resources/view/homeproxy/server.js:330 +msgid "The pre-shared key (password) above must be 12-255 bytes for v6." +msgstr "" + +#: htdocs/luci-static/resources/view/homeproxy/client.js:1360 msgid "The response code." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/server.js:776 +#: htdocs/luci-static/resources/view/homeproxy/server.js:815 msgid "The server private key, in PEM format." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/server.js:757 +#: htdocs/luci-static/resources/view/homeproxy/server.js:796 msgid "The server public key, in PEM format." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:484 +#: htdocs/luci-static/resources/view/homeproxy/client.js:509 msgid "" "The tag of the upstream outbound.
Other dial fields will be ignored when " "enabled." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:164 -#: htdocs/luci-static/resources/view/homeproxy/client.js:193 -#: htdocs/luci-static/resources/view/homeproxy/client.js:554 +#: htdocs/luci-static/resources/view/homeproxy/client.js:139 +#: htdocs/luci-static/resources/view/homeproxy/client.js:168 +#: htdocs/luci-static/resources/view/homeproxy/client.js:579 msgid "The test interval in seconds." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:170 -#: htdocs/luci-static/resources/view/homeproxy/client.js:199 -#: htdocs/luci-static/resources/view/homeproxy/client.js:570 +#: htdocs/luci-static/resources/view/homeproxy/client.js:145 +#: htdocs/luci-static/resources/view/homeproxy/client.js:174 +#: htdocs/luci-static/resources/view/homeproxy/client.js:595 msgid "The test tolerance in milliseconds." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1237 -#: htdocs/luci-static/resources/view/homeproxy/server.js:465 +#: htdocs/luci-static/resources/view/homeproxy/node.js:846 +#: htdocs/luci-static/resources/view/homeproxy/server.js:481 msgid "" "The timeout (in seconds) that after performing a keepalive check, the client " "will wait for activity. If no activity is detected, the connection will be " "closed." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1473 -#: htdocs/luci-static/resources/view/homeproxy/node.js:1825 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1122 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1471 msgid "" "This is DANGEROUS, your traffic is almost like " "PLAIN TEXT! Use at your own risk!" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1147 +#: htdocs/luci-static/resources/view/homeproxy/node.js:756 msgid "" "This is the TUIC port of the UDP over TCP protocol, designed to provide a " "QUIC stream based UDP relay mode that TUIC does not provide." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:244 -msgid "ThreatBook Public DNS (DoH)" +#: htdocs/luci-static/resources/view/homeproxy/client.js:188 +#: htdocs/luci-static/resources/view/homeproxy/client.js:223 +msgid "ThreatBook Public DNS (117.50.10.10)" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:502 -msgid "Timeout" -msgstr "" - -#: htdocs/luci-static/resources/view/homeproxy/client.js:746 +#: htdocs/luci-static/resources/view/homeproxy/client.js:771 msgid "" "Timeout for UDP connections.
Setting a larger value than the UDP timeout " "in inbounds will have no effect." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:941 -msgid "" -"Timeout of rejected DNS response cache in seconds. 604800 (7d) " -"is used by default." -msgstr "" - -#: htdocs/luci-static/resources/view/homeproxy/server.js:491 +#: htdocs/luci-static/resources/view/homeproxy/server.js:507 msgid "" "To be compatible with Xray-core, set this to Sec-WebSocket-Protocol." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:315 +#: htdocs/luci-static/resources/view/homeproxy/client.js:292 msgid "" "To enable Tun support, you need to install ip-full and " "kmod-tun" @@ -2821,99 +2983,100 @@ msgstr "" msgid "Trace" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1203 -#: htdocs/luci-static/resources/view/homeproxy/server.js:399 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1072 +#: htdocs/luci-static/resources/view/homeproxy/server.js:344 +msgid "Traffic shaping mode" +msgstr "" + +#: htdocs/luci-static/resources/view/homeproxy/node.js:812 +#: htdocs/luci-static/resources/view/homeproxy/server.js:415 msgid "Transport" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:869 -#: htdocs/luci-static/resources/view/homeproxy/server.js:186 +#: htdocs/luci-static/resources/view/homeproxy/node.js:459 +#: htdocs/luci-static/resources/view/homeproxy/server.js:187 msgid "Trojan" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:871 -#: htdocs/luci-static/resources/view/homeproxy/server.js:188 +#: htdocs/luci-static/resources/view/homeproxy/node.js:461 +#: htdocs/luci-static/resources/view/homeproxy/server.js:189 msgid "Tuic" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:313 +#: htdocs/luci-static/resources/view/homeproxy/client.js:290 msgid "Tun TCP/UDP" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:970 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1357 -#: htdocs/luci-static/resources/view/homeproxy/node.js:857 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1040 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1496 +#: htdocs/luci-static/resources/view/homeproxy/node.js:447 #: htdocs/luci-static/resources/view/homeproxy/server.js:175 msgid "Type" msgstr "" -msgid "Type error" -msgstr "" - -msgid "TypeError" -msgstr "" - -msgid "Cannot convert null to object." -msgstr "" - -msgid "can't convert null to object" -msgstr "" - -#: htdocs/luci-static/resources/view/homeproxy/client.js:662 -#: htdocs/luci-static/resources/view/homeproxy/client.js:971 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1124 -#: htdocs/luci-static/resources/view/homeproxy/server.js:868 +#: htdocs/luci-static/resources/view/homeproxy/client.js:687 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1041 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1194 +#: htdocs/luci-static/resources/view/homeproxy/server.js:907 msgid "UDP" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1597 -#: htdocs/luci-static/resources/view/homeproxy/server.js:854 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1253 +#: htdocs/luci-static/resources/view/homeproxy/server.js:893 msgid "UDP Fragment" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:358 -#: htdocs/luci-static/resources/view/homeproxy/server.js:859 +#: htdocs/luci-static/resources/view/homeproxy/client.js:384 +#: htdocs/luci-static/resources/view/homeproxy/server.js:898 msgid "UDP NAT expiration time" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1601 +#: htdocs/luci-static/resources/view/homeproxy/client.js:333 +msgid "UDP NAT filtering (1.14)" +msgstr "" + +#: htdocs/luci-static/resources/view/homeproxy/client.js:322 +msgid "UDP NAT mapping (1.14)" +msgstr "" + +#: htdocs/luci-static/resources/view/homeproxy/client.js:344 +msgid "UDP NAT sessions max (1.14)" +msgstr "" + +#: htdocs/luci-static/resources/view/homeproxy/node.js:1257 msgid "UDP over TCP" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1146 +#: htdocs/luci-static/resources/view/homeproxy/node.js:755 msgid "UDP over stream" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1139 +#: htdocs/luci-static/resources/view/homeproxy/node.js:748 msgid "UDP packet relay mode." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1138 +#: htdocs/luci-static/resources/view/homeproxy/node.js:747 msgid "UDP relay mode" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:745 +#: htdocs/luci-static/resources/view/homeproxy/client.js:770 msgid "UDP timeout" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:149 -#: htdocs/luci-static/resources/view/homeproxy/client.js:178 -#: htdocs/luci-static/resources/view/homeproxy/client.js:444 +#: htdocs/luci-static/resources/view/homeproxy/client.js:124 +#: htdocs/luci-static/resources/view/homeproxy/client.js:153 +#: htdocs/luci-static/resources/view/homeproxy/client.js:469 msgid "URLTest" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:156 -#: htdocs/luci-static/resources/view/homeproxy/client.js:185 -#: htdocs/luci-static/resources/view/homeproxy/client.js:519 +#: htdocs/luci-static/resources/view/homeproxy/client.js:131 +#: htdocs/luci-static/resources/view/homeproxy/client.js:160 +#: htdocs/luci-static/resources/view/homeproxy/client.js:544 msgid "URLTest nodes" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:130 -msgid "URLTest: %s" -msgstr "" - -#: htdocs/luci-static/resources/view/homeproxy/node.js:1120 -#: htdocs/luci-static/resources/view/homeproxy/server.js:346 +#: htdocs/luci-static/resources/view/homeproxy/node.js:729 +#: htdocs/luci-static/resources/view/homeproxy/server.js:362 msgid "UUID" msgstr "" @@ -2925,11 +3088,15 @@ msgstr "" msgid "Unknown error: %s" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1565 +#: htdocs/luci-static/resources/view/homeproxy/client.js:308 +msgid "Unset (default)" +msgstr "" + +#: htdocs/luci-static/resources/view/homeproxy/node.js:1221 msgid "Unsupported fingerprint!" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1849 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1495 msgid "Update %s subscriptions" msgstr "" @@ -2937,137 +3104,109 @@ msgstr "" msgid "Update failed." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1415 -msgid "Update time" +#: htdocs/luci-static/resources/view/homeproxy/client.js:1579 +msgid "Update interval" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1416 -msgid "Update time (daily)" +#: htdocs/luci-static/resources/view/homeproxy/client.js:1580 +msgid "Update interval of rule set." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1417 -msgid "Update time (weekly)" -msgstr "" - -#: htdocs/luci-static/resources/view/homeproxy/client.js:1418 -msgid "Every day" -msgstr "" - -#: htdocs/luci-static/resources/view/homeproxy/client.js:1419 -msgid "Every Monday" -msgstr "" - -#: htdocs/luci-static/resources/view/homeproxy/client.js:1420 -msgid "Every Tuesday" -msgstr "" - -#: htdocs/luci-static/resources/view/homeproxy/client.js:1421 -msgid "Every Wednesday" -msgstr "" - -#: htdocs/luci-static/resources/view/homeproxy/client.js:1422 -msgid "Every Thursday" -msgstr "" - -#: htdocs/luci-static/resources/view/homeproxy/client.js:1423 -msgid "Every Friday" -msgstr "" - -#: htdocs/luci-static/resources/view/homeproxy/client.js:1424 -msgid "Every Saturday" -msgstr "" - -#: htdocs/luci-static/resources/view/homeproxy/client.js:1425 -msgid "Every Sunday" -msgstr "" - -#: htdocs/luci-static/resources/view/homeproxy/node.js:1844 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1490 msgid "Update nodes from subscriptions" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1779 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1432 msgid "Update subscriptions via proxy." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1778 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1425 +msgid "Update time" +msgstr "" + +#: htdocs/luci-static/resources/view/homeproxy/node.js:1431 msgid "Update via proxy" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1534 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1190 msgid "Upload ECH config" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1425 -#: htdocs/luci-static/resources/view/homeproxy/server.js:523 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1034 +#: htdocs/luci-static/resources/view/homeproxy/server.js:539 msgid "Upload bandwidth" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1426 -#: htdocs/luci-static/resources/view/homeproxy/server.js:524 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1035 +#: htdocs/luci-static/resources/view/homeproxy/server.js:540 msgid "Upload bandwidth in Mbps." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1515 -#: htdocs/luci-static/resources/view/homeproxy/server.js:767 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1171 +#: htdocs/luci-static/resources/view/homeproxy/server.js:806 msgid "Upload certificate" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/server.js:786 +#: htdocs/luci-static/resources/view/homeproxy/server.js:825 msgid "Upload key" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1518 -#: htdocs/luci-static/resources/view/homeproxy/node.js:1537 -#: htdocs/luci-static/resources/view/homeproxy/server.js:770 -#: htdocs/luci-static/resources/view/homeproxy/server.js:789 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1174 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1193 +#: htdocs/luci-static/resources/view/homeproxy/server.js:809 +#: htdocs/luci-static/resources/view/homeproxy/server.js:828 msgid "Upload..." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/server.js:596 +#: htdocs/luci-static/resources/view/homeproxy/server.js:612 msgid "Use ACME TLS certificate issuer." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1461 -#: htdocs/luci-static/resources/view/homeproxy/server.js:561 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1110 +#: htdocs/luci-static/resources/view/homeproxy/server.js:577 msgid "" "Used to verify the hostname on the returned certificates unless insecure is " "given." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1004 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1074 msgid "Used to verify the hostname on the returned certificates." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:665 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1138 +#: htdocs/luci-static/resources/view/homeproxy/client.js:690 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1208 msgid "User" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1819 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1050 +msgid "User key" +msgstr "" + +#: htdocs/luci-static/resources/view/homeproxy/node.js:1465 msgid "User-Agent" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:888 -#: htdocs/luci-static/resources/view/homeproxy/server.js:203 +#: htdocs/luci-static/resources/view/homeproxy/node.js:478 +#: htdocs/luci-static/resources/view/homeproxy/server.js:204 msgid "Username" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:874 -#: htdocs/luci-static/resources/view/homeproxy/server.js:189 +#: htdocs/luci-static/resources/view/homeproxy/node.js:464 +#: htdocs/luci-static/resources/view/homeproxy/server.js:190 msgid "VLESS" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:875 -#: htdocs/luci-static/resources/view/homeproxy/server.js:190 +#: htdocs/luci-static/resources/view/homeproxy/node.js:465 +#: htdocs/luci-static/resources/view/homeproxy/server.js:191 msgid "VMess" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:206 -#: htdocs/luci-static/resources/view/homeproxy/client.js:243 +#: htdocs/luci-static/resources/view/homeproxy/client.js:181 +#: htdocs/luci-static/resources/view/homeproxy/client.js:219 msgid "WAN DNS (read from interface)" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1487 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1651 msgid "WAN IP Policy" msgstr "" @@ -3075,37 +3214,43 @@ msgstr "" msgid "Warn" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1210 -#: htdocs/luci-static/resources/view/homeproxy/server.js:406 +#: htdocs/luci-static/resources/view/homeproxy/node.js:819 +#: htdocs/luci-static/resources/view/homeproxy/server.js:422 msgid "WebSocket" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1810 +#: htdocs/luci-static/resources/view/homeproxy/client.js:302 +msgid "" +"When the main DNS returns a mainland China IP, re-resolve via China DNS " +"using evaluate/match_response." +msgstr "" + +#: htdocs/luci-static/resources/view/homeproxy/node.js:1456 msgid "Whitelist mode" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:873 +#: htdocs/luci-static/resources/view/homeproxy/node.js:463 msgid "WireGuard" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1342 +#: htdocs/luci-static/resources/view/homeproxy/node.js:951 msgid "WireGuard peer public key." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1349 +#: htdocs/luci-static/resources/view/homeproxy/node.js:958 msgid "WireGuard pre-shared key." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1334 +#: htdocs/luci-static/resources/view/homeproxy/node.js:943 msgid "WireGuard requires base64-encoded private keys." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:928 +#: htdocs/luci-static/resources/view/homeproxy/node.js:519 msgid "Write proxy protocol in the connection header." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1319 -#: htdocs/luci-static/resources/view/homeproxy/node.js:1832 +#: htdocs/luci-static/resources/view/homeproxy/node.js:928 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1478 msgid "Xudp (Xray-core)" msgstr "" @@ -3113,23 +3258,25 @@ msgstr "" msgid "Your %s was successfully uploaded. Size: %sB." msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/server.js:630 +#: htdocs/luci-static/resources/view/homeproxy/server.js:669 msgid "ZeroSSL" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1520 -#: htdocs/luci-static/resources/view/homeproxy/server.js:772 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1176 +#: htdocs/luci-static/resources/view/homeproxy/server.js:811 msgid "certificate" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:739 +#: htdocs/luci-static/resources/view/homeproxy/client.js:764 msgid "connect UDP connections" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1480 -#: htdocs/luci-static/resources/view/homeproxy/node.js:1488 -#: htdocs/luci-static/resources/view/homeproxy/server.js:572 -#: htdocs/luci-static/resources/view/homeproxy/server.js:580 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1074 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1129 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1137 +#: htdocs/luci-static/resources/view/homeproxy/server.js:346 +#: htdocs/luci-static/resources/view/homeproxy/server.js:588 +#: htdocs/luci-static/resources/view/homeproxy/server.js:596 msgid "default" msgstr "" @@ -3137,52 +3284,51 @@ msgstr "" msgid "failed" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1206 -#: htdocs/luci-static/resources/view/homeproxy/server.js:402 +#: htdocs/luci-static/resources/view/homeproxy/node.js:815 +#: htdocs/luci-static/resources/view/homeproxy/server.js:418 msgid "gRPC" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1248 +#: htdocs/luci-static/resources/view/homeproxy/node.js:857 msgid "gRPC permit without stream" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1243 -#: htdocs/luci-static/resources/view/homeproxy/server.js:430 +#: htdocs/luci-static/resources/view/homeproxy/node.js:852 +#: htdocs/luci-static/resources/view/homeproxy/server.js:446 msgid "gRPC service name" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:334 +#: htdocs/luci-static/resources/view/homeproxy/client.js:360 msgid "gVisor" msgstr "" -#: htdocs/luci-static/resources/homeproxy.js:306 -#: htdocs/luci-static/resources/homeproxy.js:326 -#: htdocs/luci-static/resources/view/homeproxy/client.js:219 -#: htdocs/luci-static/resources/view/homeproxy/client.js:253 -#: htdocs/luci-static/resources/view/homeproxy/client.js:527 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1380 -#: htdocs/luci-static/resources/view/homeproxy/node.js:918 -#: htdocs/luci-static/resources/view/homeproxy/node.js:1561 -#: htdocs/luci-static/resources/view/homeproxy/server.js:235 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1063 +#: htdocs/luci-static/resources/view/homeproxy/server.js:340 +msgid "http" +msgstr "" + +#: htdocs/luci-static/resources/homeproxy.js:307 +#: htdocs/luci-static/resources/homeproxy.js:327 +#: htdocs/luci-static/resources/view/homeproxy/client.js:195 +#: htdocs/luci-static/resources/view/homeproxy/client.js:230 +#: htdocs/luci-static/resources/view/homeproxy/client.js:552 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1519 +#: htdocs/luci-static/resources/view/homeproxy/node.js:509 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1217 +#: htdocs/luci-static/resources/view/homeproxy/server.js:237 msgid "non-empty value" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1919 -msgid "The default rule set directory is /etc/homeproxy/ruleset/." -msgstr "" - -#: htdocs/luci-static/resources/view/homeproxy/client.js:1975 -msgid "absolute path" -msgstr "" - -#: htdocs/luci-static/resources/view/homeproxy/node.js:1061 -#: htdocs/luci-static/resources/view/homeproxy/node.js:1317 -#: htdocs/luci-static/resources/view/homeproxy/node.js:1830 +#: htdocs/luci-static/resources/view/homeproxy/node.js:670 +#: htdocs/luci-static/resources/view/homeproxy/node.js:926 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1062 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1476 +#: htdocs/luci-static/resources/view/homeproxy/server.js:339 msgid "none" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1318 -#: htdocs/luci-static/resources/view/homeproxy/node.js:1831 +#: htdocs/luci-static/resources/view/homeproxy/node.js:927 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1477 msgid "packet addr (v2ray-core v5+)" msgstr "" @@ -3190,11 +3336,11 @@ msgstr "" msgid "passed" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/server.js:791 +#: htdocs/luci-static/resources/view/homeproxy/server.js:830 msgid "private key" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:654 +#: htdocs/luci-static/resources/view/homeproxy/client.js:679 msgid "quic-go / uquic chrome" msgstr "" @@ -3202,15 +3348,33 @@ msgstr "" msgid "sing-box client" msgstr "" +#: htdocs/luci-static/resources/view/homeproxy/client.js:337 +msgid "" +"sing-box default; recommended for home use (accepts replies from any remote " +"after mapping). Choose stricter only for specific UDP issues." +msgstr "" + +#: htdocs/luci-static/resources/view/homeproxy/client.js:326 +msgid "" +"sing-box default; recommended for home use (small NAT table, QUIC/game " +"friendly). Choose stricter only for specific UDP issues." +msgstr "" + +#: htdocs/luci-static/resources/view/homeproxy/node.js:1043 +msgid "" +"sing-box implements Snell v4/v5 wire as v4 and v6. The pre-shared key " +"(Password above) must be 12-255 bytes for v6." +msgstr "" + #: htdocs/luci-static/resources/view/homeproxy/status.js:288 msgid "sing-box server" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1543 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1199 msgid "uTLS fingerprint" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1544 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1200 msgid "" "uTLS is a fork of \"crypto/tls\", which provides ClientHello fingerprinting " "resistance." @@ -3221,43 +3385,71 @@ msgid "unchecked" msgstr "" #: htdocs/luci-static/resources/homeproxy.js:237 -#: htdocs/luci-static/resources/view/homeproxy/node.js:1735 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1388 msgid "unique UCI identifier" msgstr "" -#: htdocs/luci-static/resources/homeproxy.js:317 +#: htdocs/luci-static/resources/homeproxy.js:318 msgid "unique value" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:930 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1076 +#: htdocs/luci-static/resources/view/homeproxy/server.js:348 +msgid "unsafe-raw" +msgstr "" + #: htdocs/luci-static/resources/view/homeproxy/node.js:1075 -#: htdocs/luci-static/resources/view/homeproxy/node.js:1608 +#: htdocs/luci-static/resources/view/homeproxy/server.js:347 +msgid "unshaped" +msgstr "" + +#: htdocs/luci-static/resources/view/homeproxy/node.js:521 +#: htdocs/luci-static/resources/view/homeproxy/node.js:684 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1264 msgid "v1" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:931 -#: htdocs/luci-static/resources/view/homeproxy/node.js:1076 -#: htdocs/luci-static/resources/view/homeproxy/node.js:1609 +#: htdocs/luci-static/resources/view/homeproxy/node.js:522 +#: htdocs/luci-static/resources/view/homeproxy/node.js:685 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1265 msgid "v2" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1077 +#: htdocs/luci-static/resources/view/homeproxy/node.js:686 msgid "v3" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:231 -#: htdocs/luci-static/resources/view/homeproxy/client.js:235 -#: htdocs/luci-static/resources/view/homeproxy/client.js:264 -#: htdocs/luci-static/resources/view/homeproxy/client.js:268 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1044 +msgid "v4" +msgstr "" + +#: htdocs/luci-static/resources/view/homeproxy/server.js:331 +msgid "v5" +msgstr "" + +#: htdocs/luci-static/resources/view/homeproxy/node.js:1045 +#: htdocs/luci-static/resources/view/homeproxy/server.js:332 +msgid "v6" +msgstr "" + +#: htdocs/luci-static/resources/view/homeproxy/node.js:1073 +#: htdocs/luci-static/resources/view/homeproxy/server.js:345 +msgid "v6 only." +msgstr "" + +#: htdocs/luci-static/resources/view/homeproxy/client.js:207 +#: htdocs/luci-static/resources/view/homeproxy/client.js:211 +#: htdocs/luci-static/resources/view/homeproxy/client.js:241 +#: htdocs/luci-static/resources/view/homeproxy/client.js:245 msgid "valid DNS server address" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:541 -#: htdocs/luci-static/resources/view/homeproxy/client.js:544 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1385 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1388 -#: htdocs/luci-static/resources/view/homeproxy/node.js:1796 -#: htdocs/luci-static/resources/view/homeproxy/node.js:1799 +#: htdocs/luci-static/resources/view/homeproxy/client.js:566 +#: htdocs/luci-static/resources/view/homeproxy/client.js:569 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1527 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1530 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1442 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1445 msgid "valid URL" msgstr "" @@ -3265,185 +3457,48 @@ msgstr "" msgid "valid base64 key with %d characters" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1530 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1562 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1694 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1726 msgid "valid hostname" msgstr "" -#: htdocs/luci-static/resources/homeproxy.js:297 +#: htdocs/luci-static/resources/homeproxy.js:298 msgid "valid port range (port1:port2)" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js:297 +#: htdocs/luci-static/resources/view/homeproxy/client.js:274 msgid "valid port value" msgstr "" -#: htdocs/luci-static/resources/homeproxy.js:328 +#: htdocs/luci-static/resources/homeproxy.js:329 msgid "valid uuid" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js -msgid "Panel Settings" +#: htdocs/luci-static/resources/view/homeproxy/client.js:808 +msgid "wrong-ack" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js -msgid "UI path" +#: htdocs/luci-static/resources/view/homeproxy/client.js:807 +msgid "wrong-checksum" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js -msgid "UI download URL" +#: htdocs/luci-static/resources/view/homeproxy/client.js:809 +msgid "wrong-md5" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js -msgid "UI download detour" +#: htdocs/luci-static/resources/view/homeproxy/client.js:806 +msgid "wrong-sequence (default)" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js -msgid "API listen" +#: htdocs/luci-static/resources/view/homeproxy/client.js:810 +msgid "wrong-timestamp" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js -msgid "Use 0.0.0.0:port to open the panel from your browser." +#: htdocs/luci-static/resources/view/homeproxy/client.js:1522 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1570 +msgid "{tag} in URL when extra tags are used" msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js -msgid "API password" -msgstr "" - -#: htdocs/luci-static/resources/view/homeproxy/client.js -msgid "Default mode" -msgstr "" - -#: htdocs/luci-static/resources/view/homeproxy/client.js -msgid "NTP Settings" -msgstr "" - -#: htdocs/luci-static/resources/view/homeproxy/client.js -msgid "Enable NTP" -msgstr "" - -#: htdocs/luci-static/resources/view/homeproxy/client.js -msgid "NTP server address" -msgstr "" - -#: htdocs/luci-static/resources/view/homeproxy/client.js -msgid "NTP server port" -msgstr "" - -#: htdocs/luci-static/resources/view/homeproxy/client.js -msgid "NTP time synchronization interval" -msgstr "" - -#: htdocs/luci-static/resources/view/homeproxy/client.js -msgid "NTP service always uses direct connection and mainly provides accurate time for sing-box features that depend on it, such as TLS certificate verification, VMess, Reality/uTLS and other time-sensitive connection scenarios." -msgstr "" - -#: htdocs/luci-static/resources/view/homeproxy/client.js -msgid "Time format examples: 1m = 1 minute, 1h = 1 hour, 1d = 1 day." -msgstr "" - -#: htdocs/luci-static/resources/view/homeproxy/client.js -msgid "Cache Settings" -msgstr "" - -#: htdocs/luci-static/resources/view/homeproxy/client.js -msgid "Persistent Cache Settings" -msgstr "" - -#: htdocs/luci-static/resources/view/homeproxy/client.js -msgid "Enable cache" -msgstr "" - -#: htdocs/luci-static/resources/view/homeproxy/client.js -msgid "Enable cache file" -msgstr "" - -#: htdocs/luci-static/resources/view/homeproxy/client.js -msgid "Cache file path" -msgstr "" - -#: htdocs/luci-static/resources/view/homeproxy/client.js -msgid "Persistent cache file path" -msgstr "" - -#: htdocs/luci-static/resources/view/homeproxy/client.js -msgid "Cache RDRC" -msgstr "" - -#: htdocs/luci-static/resources/view/homeproxy/client.js -msgid "Persist RDRC cache" -msgstr "" - -#: htdocs/luci-static/resources/view/homeproxy/client.js -msgid "Status" -msgstr "" - -#: htdocs/luci-static/resources/view/homeproxy/client.js -msgid "Plugin Version" -msgstr "" - -#: htdocs/luci-static/resources/view/homeproxy/client.js -msgid "Core Version" -msgstr "" - -#: htdocs/luci-static/resources/view/homeproxy/client.js -msgid "Core Status" -msgstr "" - -#: htdocs/luci-static/resources/view/homeproxy/client.js -msgid "Running" -msgstr "" - -#: htdocs/luci-static/resources/view/homeproxy/client.js -msgid "Running: %s" -msgstr "" - -#: htdocs/luci-static/resources/view/homeproxy/client.js -msgid "Not Running" -msgstr "" - -#: htdocs/luci-static/resources/view/homeproxy/client.js -msgid "Reload Service" -msgstr "" - -#: htdocs/luci-static/resources/view/homeproxy/client.js -msgid "Restart Service" -msgstr "" - -#: htdocs/luci-static/resources/view/homeproxy/client.js -msgid "Update Panel" -msgstr "" - -#: htdocs/luci-static/resources/view/homeproxy/client.js -msgid "Update panel failed." -msgstr "" - -#: htdocs/luci-static/resources/view/homeproxy/client.js -msgid "Clash API unavailable." -msgstr "" - -#: htdocs/luci-static/resources/view/homeproxy/client.js -msgid "Open Panel" -msgstr "" - -#: htdocs/luci-static/resources/view/homeproxy/client.js -msgid "Upload Panel ZIP" -msgstr "" - -msgid "Baidu Connection" -msgstr "" - -msgid "Google Connection" -msgstr "" - -msgid "GitHub Connection" -msgstr "" - -msgid "YouTube Connection" -msgstr "" - -msgid "Click to check" -msgstr "" - -msgid "Checking..." +#: htdocs/luci-static/resources/view/homeproxy/client.js:1573 +msgid "{tag} in initial path when extra tags are used" msgstr "" diff --git a/luci-app-homeproxy/po/zh_Hans/homeproxy.po b/luci-app-homeproxy/po/zh_Hans/homeproxy.po index 26122baaf..5a9900d98 100644 --- a/luci-app-homeproxy/po/zh_Hans/homeproxy.po +++ b/luci-app-homeproxy/po/zh_Hans/homeproxy.po @@ -8,19 +8,11 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Transfer-Encoding: 8bit\n" -#: htdocs/luci-static/resources/homeproxy.js:321 -msgid "Close" -msgstr "关闭" - #: htdocs/luci-static/resources/view/homeproxy/status.js:206 msgid "%s log" msgstr "%s 日志" -#: htdocs/luci-static/resources/view/homeproxy/node.js:500 -msgid "%s ms" -msgstr "%s 毫秒" - -#: htdocs/luci-static/resources/view/homeproxy/node.js:1896 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1542 msgid "%s nodes removed" msgstr "移除了 %s 个节点" @@ -28,80 +20,97 @@ msgstr "移除了 %s 个节点" msgid "/etc/homeproxy/certs/..., /etc/acme/..., /etc/ssl/..." msgstr "/etc/homeproxy/certs/...,/etc/acme/...,/etc/ssl/..." -#: htdocs/luci-static/resources/view/homeproxy/client.js:632 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1287 +msgid "" +"1 matches the latest untagged evaluate result; other values match an " +"evaluate tag (1.14)." +msgstr "" +"1 匹配最近一次无 tag 的 evaluate 结果;其它值匹配对应的 evaluate tag" +"(1.14)。" + +#: htdocs/luci-static/resources/view/homeproxy/client.js:657 msgid "4 or 6. Not limited if empty." msgstr "4 或 6。留空不限制。" -#: htdocs/luci-static/resources/view/homeproxy/client.js:798 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1233 +#: htdocs/luci-static/resources/view/homeproxy/client.js:842 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1354 msgid "" "%s will be temporarily overwritten to %s after 50 " "triggers in 30s if not enabled." msgstr "" +"若未启用,30 秒内触发 50 次后,%s 将临时改为 %s。" "%s 在未启用的情况下,50 次触发后会在 30 秒内临时覆盖为 " "%s。" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1516 -#: htdocs/luci-static/resources/view/homeproxy/node.js:1535 -#: htdocs/luci-static/resources/view/homeproxy/server.js:768 -#: htdocs/luci-static/resources/view/homeproxy/server.js:787 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1172 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1191 +#: htdocs/luci-static/resources/view/homeproxy/server.js:807 +#: htdocs/luci-static/resources/view/homeproxy/server.js:826 msgid "Save your configuration before uploading files!" msgstr "上传文件前请先保存配置!" -#: htdocs/luci-static/resources/view/homeproxy/server.js:664 +#: htdocs/luci-static/resources/view/homeproxy/server.js:659 +msgid "ACME account key" +msgstr "ACME 账户密钥" + +#: htdocs/luci-static/resources/view/homeproxy/server.js:643 +msgid "ACME key type" +msgstr "ACME 密钥类型" + +#: htdocs/luci-static/resources/view/homeproxy/server.js:653 +msgid "ACME profile" +msgstr "ACME 配置档" + +#: htdocs/luci-static/resources/view/homeproxy/server.js:654 +msgid "ACME profile for certificate issuance (1.14). Example: shortlived." +msgstr "证书签发使用的 ACME profile(1.14)。示例:shortlived。" + +#: htdocs/luci-static/resources/view/homeproxy/server.js:703 msgid "API token" msgstr "API 令牌" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1100 +#: htdocs/luci-static/resources/view/homeproxy/node.js:709 msgid "Accept any if empty." msgstr "留空则不校验。" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1161 -msgid "Accept empty query response" -msgstr "接受空查询响应" - -#: htdocs/luci-static/resources/view/homeproxy/client.js:1422 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1586 msgid "Access Control" msgstr "访问控制" -#: htdocs/luci-static/resources/view/homeproxy/server.js:647 +#: htdocs/luci-static/resources/view/homeproxy/server.js:686 msgid "Access key ID" msgstr "访问密钥 ID" -#: htdocs/luci-static/resources/view/homeproxy/server.js:653 +#: htdocs/luci-static/resources/view/homeproxy/server.js:692 msgid "Access key secret" msgstr "访问密钥" -#: htdocs/luci-static/resources/view/homeproxy/client.js:692 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1169 +#: htdocs/luci-static/resources/view/homeproxy/client.js:717 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1235 msgid "Action" msgstr "操作" -#: htdocs/luci-static/resources/view/homeproxy/client.js:210 -msgid "AdGuard Public DNS (DoH)" -msgstr "AdGuard 公共DNS (DoH)" - -#: htdocs/luci-static/resources/view/homeproxy/client.js:1079 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1149 msgid "Add a DNS rule" msgstr "新增 DNS 规则" -#: htdocs/luci-static/resources/view/homeproxy/client.js:956 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1026 msgid "Add a DNS server" msgstr "新增 DNS 服务器" -#: htdocs/luci-static/resources/view/homeproxy/node.js:719 +#: htdocs/luci-static/resources/view/homeproxy/node.js:416 msgid "Add a node" msgstr "新增节点" -#: htdocs/luci-static/resources/view/homeproxy/client.js:428 +#: htdocs/luci-static/resources/view/homeproxy/client.js:453 msgid "Add a routing node" -msgstr "新增策略组" +msgstr "新增路由节点" -#: htdocs/luci-static/resources/view/homeproxy/client.js:599 +#: htdocs/luci-static/resources/view/homeproxy/client.js:624 msgid "Add a routing rule" msgstr "新增路由规则" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1343 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1482 msgid "Add a rule set" msgstr "新增规则集" @@ -109,32 +118,47 @@ msgstr "新增规则集" msgid "Add a server" msgstr "新增服务器" -#: htdocs/luci-static/resources/view/homeproxy/client.js:998 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1068 msgid "Additional headers to be sent to the DNS server." msgstr "发送到 DNS 服务器的附加标头。" -#: htdocs/luci-static/resources/view/homeproxy/client.js:980 -#: htdocs/luci-static/resources/view/homeproxy/node.js:878 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1050 +#: htdocs/luci-static/resources/view/homeproxy/node.js:468 msgid "Address" msgstr "地址" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1011 +#: htdocs/luci-static/resources/view/homeproxy/client.js:325 +#: htdocs/luci-static/resources/view/homeproxy/client.js:336 +msgid "Address and port dependent" +msgstr "地址与端口相关" + +#: htdocs/luci-static/resources/view/homeproxy/client.js:324 +#: htdocs/luci-static/resources/view/homeproxy/client.js:335 +msgid "Address dependent" +msgstr "地址相关" + +#: htdocs/luci-static/resources/view/homeproxy/client.js:1081 msgid "Address resolver" msgstr "地址解析器" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1043 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1113 msgid "Address strategy" msgstr "地址解析策略" -#: htdocs/luci-static/resources/view/homeproxy/server.js:640 -msgid "AliYun" -msgstr "AliYun" +#: htdocs/luci-static/resources/view/homeproxy/node.js:640 +msgid "Aggressive" +msgstr "激进" -#: htdocs/luci-static/resources/view/homeproxy/client.js:246 -msgid "AliYun Public DNS (DoH)" -msgstr "阿里 公共DNS (DoH)" +#: htdocs/luci-static/resources/view/homeproxy/server.js:679 +msgid "Alibaba Cloud DNS" +msgstr "阿里云 DNS" -#: htdocs/luci-static/resources/view/homeproxy/client.js:289 +#: htdocs/luci-static/resources/view/homeproxy/client.js:186 +#: htdocs/luci-static/resources/view/homeproxy/client.js:220 +msgid "Aliyun Public DNS (223.5.5.5)" +msgstr "阿里云公共 DNS(223.5.5.5)" + +#: htdocs/luci-static/resources/view/homeproxy/client.js:266 msgid "All ports" msgstr "所有端口" @@ -142,21 +166,21 @@ msgstr "所有端口" msgid "Allow access from the Internet." msgstr "允许来自互联网的访问。" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1470 -#: htdocs/luci-static/resources/view/homeproxy/node.js:1822 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1119 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1468 msgid "Allow insecure" msgstr "允许不安全连接" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1471 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1120 msgid "Allow insecure connection at TLS client." msgstr "允许 TLS 客户端侧的不安全连接。" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1823 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1469 msgid "Allow insecure connection by default when add nodes from subscriptions." msgstr "从订阅获取节点时,默认允许不安全连接。" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1304 -#: htdocs/luci-static/resources/view/homeproxy/server.js:482 +#: htdocs/luci-static/resources/view/homeproxy/node.js:913 +#: htdocs/luci-static/resources/view/homeproxy/server.js:498 msgid "Allowed payload size is in the request." msgstr "请求中允许的载荷大小。" @@ -168,177 +192,188 @@ msgstr "已是最新版本。" msgid "Already in updating." msgstr "已在更新中。" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1172 -#: htdocs/luci-static/resources/view/homeproxy/server.js:391 +#: htdocs/luci-static/resources/view/homeproxy/node.js:781 +#: htdocs/luci-static/resources/view/homeproxy/server.js:407 msgid "Alter ID" msgstr "额外 ID" -#: htdocs/luci-static/resources/view/homeproxy/server.js:678 +#: htdocs/luci-static/resources/view/homeproxy/server.js:717 msgid "Alternative HTTP port" msgstr "替代 HTTP 端口" -#: htdocs/luci-static/resources/view/homeproxy/server.js:684 +#: htdocs/luci-static/resources/view/homeproxy/server.js:723 msgid "Alternative TLS port" msgstr "替代 HTTPS 端口" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1859 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1505 msgid "An error occurred during updating subscriptions: %s" msgstr "更新订阅时发生错误:%s" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1250 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1371 msgid "Answer" msgstr "回答" -#: htdocs/luci-static/resources/view/homeproxy/node.js:859 +#: htdocs/luci-static/resources/view/homeproxy/node.js:449 #: htdocs/luci-static/resources/view/homeproxy/server.js:176 msgid "AnyTLS" msgstr "AnyTLS" -#: htdocs/luci-static/resources/view/homeproxy/server.js:245 +#: htdocs/luci-static/resources/view/homeproxy/server.js:247 msgid "AnyTLS padding scheme in array." msgstr "AnyTLS 填充方案。" -#: htdocs/luci-static/resources/view/homeproxy/client.js:822 -#: htdocs/luci-static/resources/view/homeproxy/client.js:932 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1218 +#: htdocs/luci-static/resources/view/homeproxy/client.js:866 +#: htdocs/luci-static/resources/view/homeproxy/client.js:992 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1279 msgid "" "Append a edns0-subnet OPT extra record with the specified IP " "prefix to every query by default.
If value is an IP address instead of " "prefix, /32 or /128 will be appended automatically." msgstr "" -"将带有指定 IP 前缀的 edns0-subnet OPT 记录附加到每个查询。如果值" -"是 IP 地址而不是前缀,则会自动添加 /32 或 /128。" +"默认情况下,每次查询都会附加一条包含指定 IP 前缀的 edns0-subnet " +"OPT 附加记录。
如果值是 IP 地址而非前缀,将自动附加 /32 或 " +"/128。将带有指定 IP 前缀的 edns0-subnet OPT 记录附" +"加到每个查询。如果值是 IP 地址而不是前缀,则会自动添加 /32 或 " +"/128。" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1502 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1158 msgid "Append self-signed certificate" msgstr "追加自签名证书" -#: htdocs/luci-static/resources/view/homeproxy/node.js:802 +#: htdocs/luci-static/resources/view/homeproxy/node.js:427 msgid "Applied" msgstr "已应用" -#: htdocs/luci-static/resources/view/homeproxy/node.js:795 -#: htdocs/luci-static/resources/view/homeproxy/node.js:805 +#: htdocs/luci-static/resources/view/homeproxy/node.js:420 +#: htdocs/luci-static/resources/view/homeproxy/node.js:430 msgid "Apply" msgstr "应用" -#: htdocs/luci-static/resources/view/homeproxy/node.js:26 +#: htdocs/luci-static/resources/view/homeproxy/node.js:18 msgid "Are you sure to allow insecure?" msgstr "确定要允许不安全连接吗?" -#: htdocs/luci-static/resources/view/homeproxy/server.js:363 +#: htdocs/luci-static/resources/view/homeproxy/server.js:379 msgid "Auth timeout" msgstr "认证超时" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1196 +#: htdocs/luci-static/resources/view/homeproxy/node.js:805 msgid "Authenticated length" msgstr "认证长度" -#: htdocs/luci-static/resources/view/homeproxy/node.js:991 -#: htdocs/luci-static/resources/view/homeproxy/server.js:282 +#: htdocs/luci-static/resources/view/homeproxy/node.js:589 +#: htdocs/luci-static/resources/view/homeproxy/server.js:284 msgid "Authentication payload" msgstr "认证载荷" -#: htdocs/luci-static/resources/view/homeproxy/node.js:984 -#: htdocs/luci-static/resources/view/homeproxy/server.js:275 +#: htdocs/luci-static/resources/view/homeproxy/node.js:582 +#: htdocs/luci-static/resources/view/homeproxy/server.js:277 msgid "Authentication type" msgstr "认证类型" -#: htdocs/luci-static/resources/view/homeproxy/client.js:703 -msgid "Auto select" -msgstr "自动选择" - -#: htdocs/luci-static/resources/view/homeproxy/node.js:1768 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1421 msgid "Auto update" msgstr "自动更新" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1769 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1422 msgid "Auto update subscriptions and geodata." msgstr "自动更新订阅和地理数据。" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1132 +#: htdocs/luci-static/resources/view/homeproxy/node.js:741 msgid "BBR" msgstr "BBR" -#: htdocs/luci-static/resources/view/homeproxy/node.js:472 -msgid "Backend execution failed" -msgstr "后端执行失败" +#: htdocs/luci-static/resources/view/homeproxy/node.js:637 +msgid "BBR congestion control algorithm profile. Hysteria2 only." +msgstr "BBR 拥塞控制算法档位。仅 Hysteria2。" + +#: htdocs/luci-static/resources/view/homeproxy/node.js:636 +msgid "BBR profile (1.14)" +msgstr "BBR 档位(1.14)" #: htdocs/luci-static/resources/view/homeproxy/status.js:235 msgid "BaiDu" msgstr "百度" -#: htdocs/luci-static/resources/view/homeproxy/node.js:986 -#: htdocs/luci-static/resources/view/homeproxy/server.js:277 +#: htdocs/luci-static/resources/view/homeproxy/node.js:584 +#: htdocs/luci-static/resources/view/homeproxy/server.js:279 msgid "Base64" msgstr "Base64" -#: htdocs/luci-static/resources/view/homeproxy/client.js:346 +#: htdocs/luci-static/resources/view/homeproxy/client.js:372 msgid "Based on google/gvisor." msgstr "基于 google/gvisor。" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1364 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1503 msgid "Binary file" msgstr "二进制文件" -#: htdocs/luci-static/resources/view/homeproxy/client.js:476 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1435 -#: htdocs/luci-static/resources/view/homeproxy/server.js:874 +#: htdocs/luci-static/resources/view/homeproxy/client.js:501 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1599 +#: htdocs/luci-static/resources/view/homeproxy/server.js:913 msgid "Bind interface" msgstr "绑定接口" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1436 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1600 msgid "" "Bind outbound traffic to specific interface. Leave empty to auto detect." msgstr "绑定出站流量至指定端口。留空自动检测。" -#: htdocs/luci-static/resources/view/homeproxy/client.js:640 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1129 +#: htdocs/luci-static/resources/view/homeproxy/client.js:665 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1199 msgid "BitTorrent" msgstr "BitTorrent" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1809 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1455 msgid "Blacklist mode" msgstr "黑名单模式" -#: htdocs/luci-static/resources/view/homeproxy/client.js:388 +#: htdocs/luci-static/resources/view/homeproxy/client.js:413 msgid "Block" msgstr "封锁" -#: htdocs/luci-static/resources/view/homeproxy/client.js:635 -#: htdocs/luci-static/resources/view/homeproxy/client.js:663 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1115 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1125 -#: htdocs/luci-static/resources/view/homeproxy/server.js:869 +#: htdocs/luci-static/resources/view/homeproxy/client.js:660 +#: htdocs/luci-static/resources/view/homeproxy/client.js:688 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1185 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1195 +#: htdocs/luci-static/resources/view/homeproxy/server.js:908 msgid "Both" msgstr "全部" -#: htdocs/luci-static/resources/view/homeproxy/client.js:366 +#: htdocs/luci-static/resources/view/homeproxy/client.js:392 msgid "Bypass CN traffic" msgstr "绕过中国流量" -#: htdocs/luci-static/resources/view/homeproxy/client.js:276 +#: htdocs/luci-static/resources/view/homeproxy/client.js:253 msgid "Bypass mainland China" msgstr "大陆白名单" -#: htdocs/luci-static/resources/view/homeproxy/client.js:367 +#: htdocs/luci-static/resources/view/homeproxy/client.js:393 msgid "Bypass mainland China traffic via firewall rules by default." msgstr "默认使用防火墙规则绕过中国大陆流量。" -#: htdocs/luci-static/resources/view/homeproxy/server.js:627 +#: htdocs/luci-static/resources/view/homeproxy/server.js:666 msgid "CA provider" msgstr "CA 颁发机构" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1130 +#: htdocs/luci-static/resources/view/homeproxy/client.js:301 +msgid "CN-IP DNS fallback (sing-box 1.14)" +msgstr "大陆 IP DNS 兜底(sing-box 1.14)" + +#: htdocs/luci-static/resources/view/homeproxy/client.js:221 +msgid "CNNIC Public DNS (210.2.4.8)" +msgstr "CNNIC 公共 DNS(210.2.4.8)" + +#: htdocs/luci-static/resources/view/homeproxy/node.js:739 msgid "CUBIC" msgstr "CUBIC" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1672 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1325 msgid "Cancel" -msgstr "关闭" +msgstr "取消" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1507 -#: htdocs/luci-static/resources/view/homeproxy/server.js:756 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1163 +#: htdocs/luci-static/resources/view/homeproxy/server.js:795 msgid "Certificate path" msgstr "证书路径" @@ -350,7 +385,7 @@ msgstr "检查" msgid "Check update" msgstr "检查更新" -#: htdocs/luci-static/resources/view/homeproxy/client.js:241 +#: htdocs/luci-static/resources/view/homeproxy/client.js:217 msgid "China DNS server" msgstr "国内 DNS 服务器" @@ -366,28 +401,24 @@ msgstr "国内 IPv6 库版本" msgid "China list version" msgstr "国内域名列表版本" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1783 -msgid "Choose which method node latency tests use." -msgstr "选择节点延迟测试使用的方法。" - -#: htdocs/luci-static/resources/view/homeproxy/client.js:652 +#: htdocs/luci-static/resources/view/homeproxy/client.js:677 msgid "Chromium / Cronet" msgstr "Chromium / Cronet" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1494 -#: htdocs/luci-static/resources/view/homeproxy/server.js:586 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1143 +#: htdocs/luci-static/resources/view/homeproxy/server.js:602 msgid "Cipher suites" msgstr "密码套件" -#: htdocs/luci-static/resources/view/homeproxy/client.js:212 -msgid "Cisco Public DNS (DoH)" -msgstr "Cisco 公共DNS (DoH)" +#: htdocs/luci-static/resources/view/homeproxy/client.js:183 +msgid "Cisco Public DNS (208.67.222.222)" +msgstr "思科公共 DNS(208.67.222.222)" #: htdocs/luci-static/resources/view/homeproxy/status.js:214 msgid "Clean log" msgstr "清空日志" -#: htdocs/luci-static/resources/view/homeproxy/client.js:650 +#: htdocs/luci-static/resources/view/homeproxy/client.js:675 msgid "Client" msgstr "客户端" @@ -395,30 +426,30 @@ msgstr "客户端" msgid "Client Settings" msgstr "客户端设置" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1094 +#: htdocs/luci-static/resources/view/homeproxy/node.js:703 msgid "Client version" msgstr "客户端版本" -#: htdocs/luci-static/resources/view/homeproxy/server.js:641 -msgid "CloudFlare" -msgstr "CloudFlare" +#: htdocs/luci-static/resources/view/homeproxy/client.js:182 +msgid "CloudFlare Public DNS (1.1.1.1)" +msgstr "CloudFlare 公共 DNS(1.1.1.1)" -#: htdocs/luci-static/resources/view/homeproxy/client.js:207 -msgid "CloudFlare Public DNS (DoH)" -msgstr "CloudFlare 公共DNS (DoH)" +#: htdocs/luci-static/resources/view/homeproxy/server.js:680 +msgid "Cloudflare" +msgstr "Cloudflare" -#: htdocs/luci-static/resources/view/homeproxy/client.js:139 +#: htdocs/luci-static/resources/view/homeproxy/client.js:114 #: htdocs/luci-static/resources/view/homeproxy/server.js:142 #: htdocs/luci-static/resources/view/homeproxy/status.js:176 msgid "Collecting data..." msgstr "正在收集数据中..." -#: htdocs/luci-static/resources/view/homeproxy/client.js:290 +#: htdocs/luci-static/resources/view/homeproxy/client.js:267 msgid "Common ports only (bypass P2P traffic)" msgstr "仅常用端口(绕过 P2P 流量)" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1128 -#: htdocs/luci-static/resources/view/homeproxy/server.js:354 +#: htdocs/luci-static/resources/view/homeproxy/node.js:737 +#: htdocs/luci-static/resources/view/homeproxy/server.js:370 msgid "Congestion control algorithm" msgstr "拥塞控制算法" @@ -426,54 +457,63 @@ msgstr "拥塞控制算法" msgid "Connection check" msgstr "连接检查" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1772 -msgid "Cron expression" -msgstr "定时任务表达式" +#: htdocs/luci-static/resources/view/homeproxy/node.js:1055 +msgid "Connection reuse" +msgstr "连接复用" -#: htdocs/luci-static/resources/view/homeproxy/client.js:278 +#: htdocs/luci-static/resources/view/homeproxy/node.js:639 +msgid "Conservative" +msgstr "保守" + +#: htdocs/luci-static/resources/view/homeproxy/client.js:255 msgid "Custom routing" msgstr "自定义路由" -#: htdocs/luci-static/resources/view/homeproxy/client.js:641 +#: htdocs/luci-static/resources/view/homeproxy/client.js:666 msgid "DNS" msgstr "DNS" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1070 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1734 +msgid "DNS Cache (1.14)" +msgstr "DNS 缓存(1.14)" + +#: htdocs/luci-static/resources/view/homeproxy/client.js:1140 msgid "DNS Rules" msgstr "DNS 规则" -#: htdocs/luci-static/resources/view/homeproxy/client.js:947 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1017 msgid "DNS Servers" msgstr "DNS 服务器" -#: htdocs/luci-static/resources/view/homeproxy/client.js:895 +#: htdocs/luci-static/resources/view/homeproxy/client.js:959 msgid "DNS Settings" msgstr "DNS 设置" -#: htdocs/luci-static/resources/view/homeproxy/server.js:639 +#: htdocs/luci-static/resources/view/homeproxy/server.js:678 msgid "DNS provider" msgstr "DNS 提供商" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1079 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1006 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1747 +msgid "DNS query timeout" +msgstr "DNS 查询超时" + +#: htdocs/luci-static/resources/view/homeproxy/client.js:1149 msgid "DNS rule" msgstr "DNS 规则" -#: htdocs/luci-static/resources/view/homeproxy/client.js:204 -#: htdocs/luci-static/resources/view/homeproxy/client.js:772 -#: htdocs/luci-static/resources/view/homeproxy/client.js:956 +#: htdocs/luci-static/resources/view/homeproxy/client.js:179 +#: htdocs/luci-static/resources/view/homeproxy/client.js:816 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1026 msgid "DNS server" msgstr "DNS 服务器" -#: htdocs/luci-static/resources/view/homeproxy/client.js:211 -msgid "DNS.SB Public DNS (DoH)" -msgstr "DNS.SB 公共DNS (DoH)" - -#: htdocs/luci-static/resources/view/homeproxy/server.js:635 +#: htdocs/luci-static/resources/view/homeproxy/server.js:674 msgid "DNS01 challenge" msgstr "DNS01 验证" -#: htdocs/luci-static/resources/view/homeproxy/client.js:642 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1130 +#: htdocs/luci-static/resources/view/homeproxy/client.js:667 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1200 msgid "DTLS" msgstr "DTLS" @@ -482,439 +522,475 @@ msgid "Debug" msgstr "调试" #: htdocs/luci-static/resources/homeproxy.js:17 -#: htdocs/luci-static/resources/view/homeproxy/client.js:456 -#: htdocs/luci-static/resources/view/homeproxy/client.js:626 -#: htdocs/luci-static/resources/view/homeproxy/client.js:778 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1106 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1404 -#: htdocs/luci-static/resources/view/homeproxy/node.js:1140 +#: htdocs/luci-static/resources/view/homeproxy/client.js:481 +#: htdocs/luci-static/resources/view/homeproxy/client.js:651 +#: htdocs/luci-static/resources/view/homeproxy/client.js:822 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1176 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1546 +#: htdocs/luci-static/resources/view/homeproxy/node.js:749 msgid "Default" msgstr "默认" -msgid "Default node" -msgstr "默认节点" - -#: htdocs/luci-static/resources/view/homeproxy/client.js:405 -#: htdocs/luci-static/resources/view/homeproxy/client.js:457 -#: htdocs/luci-static/resources/view/homeproxy/client.js:779 -#: htdocs/luci-static/resources/view/homeproxy/client.js:910 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1018 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1184 +#: htdocs/luci-static/resources/view/homeproxy/client.js:430 +#: htdocs/luci-static/resources/view/homeproxy/client.js:482 +#: htdocs/luci-static/resources/view/homeproxy/client.js:823 +#: htdocs/luci-static/resources/view/homeproxy/client.js:974 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1088 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1251 msgid "Default DNS (issued by WAN)" msgstr "默认 DNS(由 WAN 下发)" -#: htdocs/luci-static/resources/view/homeproxy/client.js:905 +#: htdocs/luci-static/resources/view/homeproxy/client.js:969 msgid "Default DNS server" msgstr "默认 DNS 服务器" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1332 -msgid "Daily domain name resolution for clients. Choose an overseas DNS if DNS leak protection is required." -msgstr "客户端日常访问域名解析,DNS泄漏要求高选择国外DNS。" - -#: htdocs/luci-static/resources/view/homeproxy/client.js:400 +#: htdocs/luci-static/resources/view/homeproxy/client.js:425 msgid "Default DNS server for resolving domain name in the server address." -msgstr "填写国内DNS,Sing-box在连接这个代理节点前,需要先解析节点域名,这里就决定用哪个DNS去解析这个“代理服务器域名”,不要选走代理的国外 DNS,否则可能出现“代理还没连上,却要先通过代理解析代理服务器”的循环问题。" +msgstr "用于解析服务器地址中的域名的默认 DNS 服务器。" -#: htdocs/luci-static/resources/view/homeproxy/client.js:900 +#: htdocs/luci-static/resources/view/homeproxy/client.js:964 msgid "Default DNS strategy" msgstr "默认 DNS 解析策略" -#: htdocs/luci-static/resources/view/homeproxy/client.js:380 -msgid "Default outbound (fallback)" -msgstr "默认出站(漏网之鱼)" +#: htdocs/luci-static/resources/view/homeproxy/client.js:405 +msgid "Default outbound" +msgstr "默认出站" -#: htdocs/luci-static/resources/view/homeproxy/client.js:399 +#: htdocs/luci-static/resources/view/homeproxy/client.js:424 msgid "Default outbound DNS" msgstr "默认出站 DNS" -#: htdocs/luci-static/resources/view/homeproxy/client.js:381 +#: htdocs/luci-static/resources/view/homeproxy/client.js:406 msgid "Default outbound for connections not matched by any routing rules." msgstr "用于未被任何路由规则匹配的连接的默认出站。" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1829 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1475 msgid "Default packet encoding" msgstr "默认包封装格式" -#: htdocs/luci-static/resources/view/homeproxy/server.js:606 +#: htdocs/luci-static/resources/view/homeproxy/server.js:622 msgid "Default server name" msgstr "默认服务器名称" -#: htdocs/luci-static/resources/view/homeproxy/client.js:387 -#: htdocs/luci-static/resources/view/homeproxy/client.js:489 -#: htdocs/luci-static/resources/view/homeproxy/client.js:707 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1056 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1405 -#: htdocs/luci-static/resources/view/homeproxy/node.js:858 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1007 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1748 +msgid "Default timeout per DNS query in seconds (sing-box default: 10)." +msgstr "每次 DNS 查询的默认超时时间(秒,sing-box 默认为 10)。" + +#: htdocs/luci-static/resources/view/homeproxy/client.js:412 +#: htdocs/luci-static/resources/view/homeproxy/client.js:514 +#: htdocs/luci-static/resources/view/homeproxy/client.js:732 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1126 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1547 +#: htdocs/luci-static/resources/view/homeproxy/node.js:448 msgid "Direct" msgstr "直连" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1537 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1701 msgid "Direct Domain List" msgstr "直连域名列表" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1451 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1496 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1615 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1660 msgid "Direct IPv4 IP-s" msgstr "直连 IPv4 地址" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1454 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1499 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1618 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1663 msgid "Direct IPv6 IP-s" msgstr "直连 IPv6 地址" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1457 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1621 msgid "Direct MAC-s" msgstr "直连 MAC 地址" -#: htdocs/luci-static/resources/view/homeproxy/client.js:148 -#: htdocs/luci-static/resources/view/homeproxy/client.js:176 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1445 -#: htdocs/luci-static/resources/view/homeproxy/node.js:929 -#: htdocs/luci-static/resources/view/homeproxy/node.js:985 -#: htdocs/luci-static/resources/view/homeproxy/node.js:998 -#: htdocs/luci-static/resources/view/homeproxy/node.js:1545 -#: htdocs/luci-static/resources/view/homeproxy/node.js:1808 -#: htdocs/luci-static/resources/view/homeproxy/server.js:276 -#: htdocs/luci-static/resources/view/homeproxy/server.js:289 +#: htdocs/luci-static/resources/view/homeproxy/client.js:123 +#: htdocs/luci-static/resources/view/homeproxy/client.js:151 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1609 +#: htdocs/luci-static/resources/view/homeproxy/node.js:520 +#: htdocs/luci-static/resources/view/homeproxy/node.js:583 +#: htdocs/luci-static/resources/view/homeproxy/node.js:596 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1201 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1454 +#: htdocs/luci-static/resources/view/homeproxy/server.js:278 +#: htdocs/luci-static/resources/view/homeproxy/server.js:291 msgid "Disable" msgstr "禁用" -#: htdocs/luci-static/resources/view/homeproxy/client.js:386 +#: htdocs/luci-static/resources/view/homeproxy/client.js:411 msgid "Disable (the service)" msgstr "禁用(服务)" -#: htdocs/luci-static/resources/view/homeproxy/client.js:810 -#: htdocs/luci-static/resources/view/homeproxy/client.js:922 +#: htdocs/luci-static/resources/view/homeproxy/node.js:644 +msgid "Disable Chrome QUIC fingerprint (1.14)" +msgstr "禁用 Chrome QUIC 指纹(1.14)" + +#: htdocs/luci-static/resources/view/homeproxy/node.js:645 +msgid "" +"Disable Chrome QUIC handshake parroting, which is enabled by default since " +"sing-box 1.14. Turn this on only when the server uses an Ed25519 certificate " +"or the handshake otherwise fails." +msgstr "" +"禁用自 sing-box 1.14 起默认开启的 Chrome QUIC 握手伪装。仅在服务器证书为 " +"Ed25519 或握手失败时才需要开启。" + +#: htdocs/luci-static/resources/view/homeproxy/client.js:854 +#: htdocs/luci-static/resources/view/homeproxy/client.js:986 msgid "Disable DNS cache" msgstr "禁用 DNS 缓存" -#: htdocs/luci-static/resources/view/homeproxy/client.js:811 +#: htdocs/luci-static/resources/view/homeproxy/client.js:855 msgid "Disable DNS cache in this query." msgstr "在本次查询中禁用 DNS 缓存。" -msgid "Disable DNS memory cache" -msgstr "禁用 DNS 内存缓存" - -msgid "Disable DNS memory cache in this query." -msgstr "在本次查询中禁用 DNS 内存缓存。" - -msgid "Disable DNS memory cache expiration" -msgstr "禁用 DNS 内存缓存过期" - -msgid "Independent DNS memory cache per server" -msgstr "每个 DNS 服务器独立内存缓存" - -msgid "Make each DNS server's memory cache independent for special purposes. If enabled, will slightly degrade performance." -msgstr "让每个 DNS 服务器使用独立内存缓存。启用后性能会略微下降。" - -#: htdocs/luci-static/resources/view/homeproxy/server.js:670 +#: htdocs/luci-static/resources/view/homeproxy/server.js:709 msgid "Disable HTTP challenge" msgstr "禁用 HTTP 验证" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1035 -#: htdocs/luci-static/resources/view/homeproxy/server.js:321 -msgid "Disable Path MTU discovery" -msgstr "禁用路径 MTU 探测" - -#: htdocs/luci-static/resources/view/homeproxy/server.js:674 +#: htdocs/luci-static/resources/view/homeproxy/server.js:713 msgid "Disable TLS ALPN challenge" msgstr "禁用 TLS ALPN 认证" -#: htdocs/luci-static/resources/view/homeproxy/client.js:733 +#: htdocs/luci-static/resources/view/homeproxy/client.js:758 msgid "Disable UDP domain unmapping" msgstr "禁用 UDP 域名映射" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1205 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1266 msgid "Disable cache and save cache in this query." msgstr "在本次查询中禁用缓存。" -msgid "Disable DNS memory cache and persistent cache in this query." -msgstr "在本次查询中禁用 DNS 内存缓存和持久化缓存。" - -#: htdocs/luci-static/resources/view/homeproxy/client.js:924 +#: htdocs/luci-static/resources/view/homeproxy/client.js:988 msgid "Disable cache expire" msgstr "缓存永不过期" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1204 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1265 msgid "Disable dns cache" msgstr "禁用 DNS 缓存" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1036 -#: htdocs/luci-static/resources/view/homeproxy/server.js:322 -msgid "" -"Disables Path MTU Discovery (RFC 8899). Packets will then be at most 1252 " -"(IPv4) / 1232 (IPv6) bytes in size." -msgstr "" -"禁用路径 MTU 发现 (RFC 8899)。 数据包的大小最多为 1252 (IPv4) / 1232 (IPv6) " -"字节。" +#: htdocs/luci-static/resources/view/homeproxy/client.js:1308 +msgid "Disable optimistic DNS caching for this query." +msgstr "对此查询禁用乐观 DNS 缓存。" -#: htdocs/luci-static/resources/view/homeproxy/client.js:837 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1274 +#: htdocs/luci-static/resources/view/homeproxy/client.js:873 +msgid "Disable optimistic DNS caching in this lookup (1.14)." +msgstr "关闭本次查询解析的乐观 DNS 缓存(1.14)。" + +#: htdocs/luci-static/resources/view/homeproxy/client.js:872 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1307 +msgid "Disable optimistic cache" +msgstr "禁用乐观缓存" + +#: htdocs/luci-static/resources/view/homeproxy/client.js:309 +msgid "Disabled" +msgstr "禁用" + +#: htdocs/luci-static/resources/view/homeproxy/client.js:892 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1395 msgid "Domain keyword" msgstr "域名关键词" -#: htdocs/luci-static/resources/view/homeproxy/client.js:828 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1265 +#: htdocs/luci-static/resources/view/homeproxy/client.js:883 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1386 msgid "Domain name" msgstr "域名" -#: htdocs/luci-static/resources/view/homeproxy/client.js:841 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1278 +#: htdocs/luci-static/resources/view/homeproxy/client.js:896 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1399 msgid "Domain regex" msgstr "域名正则表达式" -#: htdocs/luci-static/resources/view/homeproxy/client.js:450 +#: htdocs/luci-static/resources/view/homeproxy/client.js:475 msgid "Domain resolver" msgstr "域名解析器" -#: htdocs/luci-static/resources/view/homeproxy/client.js:370 -#: htdocs/luci-static/resources/view/homeproxy/client.js:469 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1197 +#: htdocs/luci-static/resources/view/homeproxy/client.js:400 +#: htdocs/luci-static/resources/view/homeproxy/client.js:494 msgid "Domain strategy" msgstr "域名解析策略" -#: htdocs/luci-static/resources/view/homeproxy/client.js:804 +#: htdocs/luci-static/resources/view/homeproxy/client.js:848 msgid "Domain strategy for resolving the domain names." msgstr "目标域名的解析策略。" -#: htdocs/luci-static/resources/view/homeproxy/client.js:833 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1270 +#: htdocs/luci-static/resources/view/homeproxy/client.js:888 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1391 msgid "Domain suffix" msgstr "域名后缀" -#: htdocs/luci-static/resources/view/homeproxy/server.js:600 +#: htdocs/luci-static/resources/view/homeproxy/server.js:616 msgid "Domains" msgstr "域名" -#: htdocs/luci-static/resources/view/homeproxy/client.js:797 +#: htdocs/luci-static/resources/view/homeproxy/client.js:841 msgid "Don't drop packets" msgstr "不丢弃数据包" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1232 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1353 msgid "Don't drop requests" msgstr "不丢弃请求" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1419 -#: htdocs/luci-static/resources/view/homeproxy/server.js:517 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1028 +#: htdocs/luci-static/resources/view/homeproxy/server.js:533 msgid "Download bandwidth" msgstr "下载带宽" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1420 -#: htdocs/luci-static/resources/view/homeproxy/server.js:518 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1029 +#: htdocs/luci-static/resources/view/homeproxy/server.js:534 msgid "Download bandwidth in Mbps." msgstr "下载带宽(单位:Mbps)。" -#: htdocs/luci-static/resources/view/homeproxy/client.js:793 -#: htdocs/luci-static/resources/view/homeproxy/client.js:799 +#: htdocs/luci-static/resources/view/homeproxy/client.js:837 +#: htdocs/luci-static/resources/view/homeproxy/client.js:843 msgid "Drop packets" msgstr "丢弃数据包" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1227 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1234 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1348 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1355 msgid "Drop requests" msgstr "丢弃请求" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1815 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1461 msgid "" "Drop/keep nodes that contain the specific keywords. Regex is supported." msgstr "" -"丢弃/保留 包含指定关键词的节点。支持" -"正则表达式。" +"根据名称中包含的特定关键词丢弃/保留节点。支" +"持正则表达式。丢弃/保留 包含指定关键词的节点。支持正则表达式。" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1807 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1453 msgid "Drop/keep specific nodes from subscriptions." msgstr "从订阅中 丢弃/保留 指定节点" -#: htdocs/luci-static/resources/view/homeproxy/server.js:691 +#: htdocs/luci-static/resources/view/homeproxy/server.js:730 msgid "" "EAB (External Account Binding) contains information necessary to bind or map " "an ACME account to some other account known by the CA.
External account " "bindings are \"used to associate an ACME account with an existing account in " "a non-ACME system, such as a CA customer database." msgstr "" -"EAB(外部帐户绑定)包含将 ACME 帐户绑定或映射到 CA 已知的其他帐户所需的信息。" -"
外部帐户绑定“用于将 ACME 帐户与非 ACME 系统中的现有帐户相关联,例如 CA " -"客户数据库。" +"EAB(外部账户绑定)包含将 ACME 账户绑定或映射到 CA 已知的其他账户所需的信息。" +"
外部账户绑定“用于将 ACME 账户与一个非 ACME 系统中的现有账户(例如 CA 客" +"户数据库)相关联”。EAB(外部帐户绑定)包含将 ACME 帐户绑定或映射到 CA 已知的" +"其他帐户所需的信息。
外部帐户绑定“用于将 ACME 帐户与非 ACME 系统中的现有" +"帐户相关联,例如 CA 客户数据库。" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1524 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1180 msgid "" "ECH (Encrypted Client Hello) is a TLS extension that allows a client to " "encrypt the first part of its ClientHello message." msgstr "" -"ECH(Encrypted Client Hello)是一个 TLS 扩展,它允许客户端加密其 ClientHello " -"信息的第一部分。" +"ECH(加密客户端问候)是一种 TLS 扩展,允许客户端加密 ClientHello 消息的起始部" +"分。ECH(Encrypted Client Hello)是一个 TLS 扩展,它允许客户端加密其 " +"ClientHello 信息的第一部分。" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1539 -#: htdocs/luci-static/resources/view/homeproxy/server.js:835 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1195 +#: htdocs/luci-static/resources/view/homeproxy/server.js:874 msgid "ECH config" msgstr "ECH 配置" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1528 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1184 msgid "ECH config path" msgstr "ECH 配置路径" -#: htdocs/luci-static/resources/view/homeproxy/server.js:794 +#: htdocs/luci-static/resources/view/homeproxy/server.js:833 msgid "ECH key" msgstr "ECH 密钥" -#: htdocs/luci-static/resources/view/homeproxy/client.js:821 -#: htdocs/luci-static/resources/view/homeproxy/client.js:931 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1217 +#: htdocs/luci-static/resources/view/homeproxy/client.js:865 +#: htdocs/luci-static/resources/view/homeproxy/client.js:991 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1278 msgid "EDNS Client subnet" -msgstr "ENDS 客户端子网" +msgstr "EDNS 客户端子网" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1303 -#: htdocs/luci-static/resources/view/homeproxy/server.js:481 +#: htdocs/luci-static/resources/view/homeproxy/node.js:912 +#: htdocs/luci-static/resources/view/homeproxy/server.js:497 msgid "Early data" msgstr "前置数据" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1310 -#: htdocs/luci-static/resources/view/homeproxy/server.js:488 +#: htdocs/luci-static/resources/view/homeproxy/node.js:919 +#: htdocs/luci-static/resources/view/homeproxy/server.js:504 msgid "Early data header name" msgstr "前置数据标头" -#: htdocs/luci-static/resources/view/homeproxy/server.js:489 +#: htdocs/luci-static/resources/view/homeproxy/server.js:505 msgid "Early data is sent in path instead of header by default." msgstr "前置数据默认发送在路径而不是标头中。" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1644 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1297 msgid "Edit nodes" msgstr "修改节点" -#: htdocs/luci-static/resources/view/homeproxy/server.js:612 +#: htdocs/luci-static/resources/view/homeproxy/server.js:628 msgid "Email" msgstr "Email" -#: htdocs/luci-static/resources/view/homeproxy/client.js:437 -#: htdocs/luci-static/resources/view/homeproxy/client.js:613 -#: htdocs/luci-static/resources/view/homeproxy/client.js:965 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1093 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1352 +#: htdocs/luci-static/resources/view/homeproxy/client.js:462 +#: htdocs/luci-static/resources/view/homeproxy/client.js:638 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1035 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1163 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1491 #: htdocs/luci-static/resources/view/homeproxy/server.js:148 #: htdocs/luci-static/resources/view/homeproxy/server.js:166 msgid "Enable" msgstr "启用" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1152 -#: htdocs/luci-static/resources/view/homeproxy/server.js:371 +#: htdocs/luci-static/resources/view/homeproxy/node.js:761 +#: htdocs/luci-static/resources/view/homeproxy/server.js:387 msgid "" "Enable 0-RTT QUIC connection handshake on the client side. This is not " "impacting much on the performance, as the protocol is fully multiplexed.
Disabling this is highly recommended, as it is vulnerable to replay attacks." msgstr "" -"在客户端启用 0-RTT QUIC 连接握手。由于协议是完全复用的,这对性能影响不大。" -"
强烈建议禁用此功能,因为它容易受到重放攻击。" +"在客户端启用 0-RTT QUIC 连接握手。由于协议完全多路复用,这对性能影响不大。" +"
强烈建议禁用,因为它容易受到重放攻击。在客户端启用 0-RTT QUIC 连接握手。" +"由于协议是完全复用的,这对性能影响不大。
强烈建议禁用此功能,因为它容易受" +"到重放攻击。" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1151 -#: htdocs/luci-static/resources/view/homeproxy/server.js:370 +#: htdocs/luci-static/resources/view/homeproxy/node.js:760 +#: htdocs/luci-static/resources/view/homeproxy/server.js:386 msgid "Enable 0-RTT handshake" msgstr "启用 0-RTT 握手" -#: htdocs/luci-static/resources/view/homeproxy/server.js:595 +#: htdocs/luci-static/resources/view/homeproxy/server.js:611 msgid "Enable ACME" msgstr "启用 ACME" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1523 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1179 msgid "Enable ECH" msgstr "启用 ECH" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1414 -#: htdocs/luci-static/resources/view/homeproxy/server.js:512 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1023 +#: htdocs/luci-static/resources/view/homeproxy/server.js:528 msgid "Enable TCP Brutal" msgstr "启用 TCP Brutal" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1415 -#: htdocs/luci-static/resources/view/homeproxy/server.js:513 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1024 +#: htdocs/luci-static/resources/view/homeproxy/server.js:529 msgid "Enable TCP Brutal congestion control algorithm" msgstr "启用 TCP Brutal 拥塞控制算法。" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1598 -#: htdocs/luci-static/resources/view/homeproxy/server.js:855 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1254 +#: htdocs/luci-static/resources/view/homeproxy/server.js:894 msgid "Enable UDP fragmentation." msgstr "启用 UDP 分片。" -#: htdocs/luci-static/resources/view/homeproxy/client.js:351 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1056 +msgid "Enable connection reuse (the Snell v2 CONNECT command)." +msgstr "启用连接复用(Snell v2 CONNECT 指令)。" + +#: htdocs/luci-static/resources/view/homeproxy/client.js:377 msgid "Enable endpoint-independent NAT" msgstr "启用端点独立 NAT" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1410 -#: htdocs/luci-static/resources/view/homeproxy/server.js:507 +#: htdocs/luci-static/resources/view/homeproxy/client.js:397 +msgid "" +"Enable neighbor resolution so rules can match LAN devices by hostname (1.14)." +msgstr "启用邻居解析,使规则可按主机名匹配局域网设备(1.14)。" + +#: htdocs/luci-static/resources/view/homeproxy/node.js:1019 +#: htdocs/luci-static/resources/view/homeproxy/server.js:523 msgid "Enable padding" msgstr "启用填充" -#: htdocs/luci-static/resources/view/homeproxy/server.js:846 +#: htdocs/luci-static/resources/view/homeproxy/server.js:885 msgid "Enable tcp fast open for listener." msgstr "为监听器启用 TCP 快速打开。" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1602 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1258 msgid "" "Enable the SUoT protocol, requires server support. Conflict with multiplex." msgstr "启用 SUoT 协议,需要服务端支持。与多路复用冲突。" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1042 -#: htdocs/luci-static/resources/view/homeproxy/node.js:1178 -#: htdocs/luci-static/resources/view/homeproxy/server.js:338 +#: htdocs/luci-static/resources/view/homeproxy/node.js:651 +#: htdocs/luci-static/resources/view/homeproxy/node.js:787 +#: htdocs/luci-static/resources/view/homeproxy/server.js:354 msgid "Encrypt method" msgstr "加密方式" -#: htdocs/luci-static/resources/view/homeproxy/node.js:488 +#: htdocs/luci-static/resources/view/homeproxy/client.js:323 +#: htdocs/luci-static/resources/view/homeproxy/client.js:334 +msgid "Endpoint independent" +msgstr "端点无关" + #: htdocs/luci-static/resources/view/homeproxy/status.js:139 msgid "Error" msgstr "错误" +#: htdocs/luci-static/resources/view/homeproxy/client.js:1240 +msgid "Evaluate (1.14)" +msgstr "Evaluate(1.14)" + +#: htdocs/luci-static/resources/view/homeproxy/client.js:1291 +msgid "Evaluate tag" +msgstr "Evaluate 标签" + #: htdocs/luci-static/resources/homeproxy.js:237 #: htdocs/luci-static/resources/homeproxy.js:271 #: htdocs/luci-static/resources/homeproxy.js:279 -#: htdocs/luci-static/resources/homeproxy.js:297 -#: htdocs/luci-static/resources/homeproxy.js:306 -#: htdocs/luci-static/resources/homeproxy.js:317 -#: htdocs/luci-static/resources/homeproxy.js:326 -#: htdocs/luci-static/resources/homeproxy.js:328 -#: htdocs/luci-static/resources/view/homeproxy/client.js:219 -#: htdocs/luci-static/resources/view/homeproxy/client.js:231 -#: htdocs/luci-static/resources/view/homeproxy/client.js:235 -#: htdocs/luci-static/resources/view/homeproxy/client.js:253 -#: htdocs/luci-static/resources/view/homeproxy/client.js:264 -#: htdocs/luci-static/resources/view/homeproxy/client.js:268 -#: htdocs/luci-static/resources/view/homeproxy/client.js:297 -#: htdocs/luci-static/resources/view/homeproxy/client.js:527 -#: htdocs/luci-static/resources/view/homeproxy/client.js:541 -#: htdocs/luci-static/resources/view/homeproxy/client.js:544 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1380 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1385 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1388 +#: htdocs/luci-static/resources/homeproxy.js:298 +#: htdocs/luci-static/resources/homeproxy.js:307 +#: htdocs/luci-static/resources/homeproxy.js:318 +#: htdocs/luci-static/resources/homeproxy.js:327 +#: htdocs/luci-static/resources/homeproxy.js:329 +#: htdocs/luci-static/resources/view/homeproxy/client.js:195 +#: htdocs/luci-static/resources/view/homeproxy/client.js:207 +#: htdocs/luci-static/resources/view/homeproxy/client.js:211 +#: htdocs/luci-static/resources/view/homeproxy/client.js:230 +#: htdocs/luci-static/resources/view/homeproxy/client.js:241 +#: htdocs/luci-static/resources/view/homeproxy/client.js:245 +#: htdocs/luci-static/resources/view/homeproxy/client.js:274 +#: htdocs/luci-static/resources/view/homeproxy/client.js:552 +#: htdocs/luci-static/resources/view/homeproxy/client.js:566 +#: htdocs/luci-static/resources/view/homeproxy/client.js:569 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1519 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1522 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1527 #: htdocs/luci-static/resources/view/homeproxy/client.js:1530 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1562 -#: htdocs/luci-static/resources/view/homeproxy/node.js:918 -#: htdocs/luci-static/resources/view/homeproxy/node.js:1561 -#: htdocs/luci-static/resources/view/homeproxy/node.js:1735 -#: htdocs/luci-static/resources/view/homeproxy/node.js:1796 -#: htdocs/luci-static/resources/view/homeproxy/node.js:1799 -#: htdocs/luci-static/resources/view/homeproxy/server.js:235 -#: htdocs/luci-static/resources/view/homeproxy/server.js:618 -#: htdocs/luci-static/resources/view/homeproxy/server.js:620 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1570 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1573 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1694 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1726 +#: htdocs/luci-static/resources/view/homeproxy/node.js:509 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1217 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1388 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1442 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1445 +#: htdocs/luci-static/resources/view/homeproxy/server.js:237 +#: htdocs/luci-static/resources/view/homeproxy/server.js:634 +#: htdocs/luci-static/resources/view/homeproxy/server.js:636 msgid "Expecting: %s" msgstr "请输入:%s" -#: htdocs/luci-static/resources/view/homeproxy/server.js:690 +#: htdocs/luci-static/resources/view/homeproxy/server.js:729 msgid "External Account Binding" msgstr "外部账户绑定" -#: htdocs/luci-static/resources/view/homeproxy/server.js:702 +#: htdocs/luci-static/resources/view/homeproxy/server.js:741 msgid "External account MAC key" msgstr "外部账户 MAC 密钥" -#: htdocs/luci-static/resources/view/homeproxy/server.js:696 +#: htdocs/luci-static/resources/view/homeproxy/server.js:735 msgid "External account key ID" msgstr "外部账户密钥标识符" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1260 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1381 msgid "Extra records" msgstr "附加记录" +#: htdocs/luci-static/resources/view/homeproxy/client.js:1564 +msgid "" +"Extra rule-set tags sharing these options. Requires {tag} in path/url (1.14)." +msgstr "" +"共享这些选项的额外规则集标签。使用多标签时 path/url 需包含 {tag}(1.14)。" + +#: htdocs/luci-static/resources/view/homeproxy/client.js:1563 +msgid "Extra tags" +msgstr "额外标签" + #: htdocs/luci-static/resources/view/homeproxy/server.js:86 msgid "Failed to generate %s, error: %s." msgstr "生成 %s 失败,错误:%s。" @@ -923,53 +999,23 @@ msgstr "生成 %s 失败,错误:%s。" msgid "Failed to upload %s, error: %s." msgstr "上传 %s 失败,错误:%s。" -#: htdocs/luci-static/resources/homeproxy.js -msgid "panel ZIP package" -msgstr "面版ZIP压缩包" - -#: htdocs/luci-static/resources/homeproxy.js -msgid "unknown error" -msgstr "未知错误" - -#: htdocs/luci-static/resources/homeproxy.js -#: htdocs/luci-static/resources/view/homeproxy/client.js -msgid "Backup panel failed." -msgstr "备份面版失败。" - -#: htdocs/luci-static/resources/homeproxy.js -#: htdocs/luci-static/resources/view/homeproxy/client.js -msgid "Restore panel failed." -msgstr "恢复面版失败。" - -#: htdocs/luci-static/resources/homeproxy.js -msgid "Panel ZIP file is empty." -msgstr "面版 ZIP 文件为空。" - -#: htdocs/luci-static/resources/homeproxy.js -msgid "The unzip command is unavailable." -msgstr "unzip 命令不可用。" - -#: htdocs/luci-static/resources/homeproxy.js -msgid "Invalid panel ZIP file." -msgstr "面版 ZIP 文件无效。" - -#: htdocs/luci-static/resources/homeproxy.js -msgid "Install panel failed." -msgstr "安装面版失败。" - #: htdocs/luci-static/resources/view/homeproxy/status.js:140 msgid "Fatal" msgstr "致命" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1814 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1460 msgid "Filter keywords" msgstr "过滤关键词" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1806 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1452 msgid "Filter nodes" msgstr "过滤节点" -#: htdocs/luci-static/resources/view/homeproxy/client.js:653 +#: htdocs/luci-static/resources/view/homeproxy/client.js:396 +msgid "Find neighbor hosts" +msgstr "发现邻居主机" + +#: htdocs/luci-static/resources/view/homeproxy/client.js:678 msgid "Firefox / uquic firefox" msgstr "Firefox / uquic firefox" @@ -977,33 +1023,33 @@ msgstr "Firefox / uquic firefox" msgid "Firewall" msgstr "防火墙" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1166 -#: htdocs/luci-static/resources/view/homeproxy/server.js:385 +#: htdocs/luci-static/resources/view/homeproxy/node.js:775 +#: htdocs/luci-static/resources/view/homeproxy/server.js:401 msgid "Flow" msgstr "流控" -#: htdocs/luci-static/resources/view/homeproxy/client.js:451 +#: htdocs/luci-static/resources/view/homeproxy/client.js:476 msgid "For resolving domain name in the server address." msgstr "用于解析服务器地址中的域名。" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1363 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1502 msgid "Format" msgstr "格式" -#: htdocs/luci-static/resources/view/homeproxy/client.js:753 +#: htdocs/luci-static/resources/view/homeproxy/client.js:778 msgid "Fragment TLS handshake into multiple TLS records." msgstr "将 TLS 握手分片为多个 TLS 记录" -#: htdocs/luci-static/resources/view/homeproxy/client.js:759 +#: htdocs/luci-static/resources/view/homeproxy/client.js:784 msgid "" "Fragment TLS handshakes. Due to poor performance, try %s first." msgstr "分片 TLS 握手。由于性能较差,请先尝试 %s。" -#: htdocs/luci-static/resources/view/homeproxy/client.js:765 +#: htdocs/luci-static/resources/view/homeproxy/client.js:790 msgid "Fragment fallback delay" msgstr "分片回退延迟" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1272 +#: htdocs/luci-static/resources/view/homeproxy/node.js:881 msgid "GET" msgstr "GET" @@ -1011,25 +1057,30 @@ msgstr "GET" msgid "GFW list version" msgstr "GFW 域名列表版本" -#: htdocs/luci-static/resources/view/homeproxy/client.js:275 +#: htdocs/luci-static/resources/view/homeproxy/client.js:252 msgid "GFWList" msgstr "GFWList" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1469 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1633 msgid "Gaming mode IPv4 IP-s" msgstr "游戏模式 IPv4 地址" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1471 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1635 msgid "Gaming mode IPv6 IP-s" msgstr "游戏模式 IPv6 地址" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1474 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1638 msgid "Gaming mode MAC-s" msgstr "游戏模式 MAC 地址" +#: htdocs/luci-static/resources/view/homeproxy/node.js:598 +#: htdocs/luci-static/resources/view/homeproxy/server.js:293 +msgid "Gecko (1.14)" +msgstr "Gecko(1.14)" + #: htdocs/luci-static/resources/view/homeproxy/server.js:36 #: htdocs/luci-static/resources/view/homeproxy/server.js:38 -#: htdocs/luci-static/resources/view/homeproxy/server.js:827 +#: htdocs/luci-static/resources/view/homeproxy/server.js:866 msgid "Generate" msgstr "生成" @@ -1037,23 +1088,23 @@ msgstr "生成" msgid "GitHub token" msgstr "GitHub 令牌" -#: htdocs/luci-static/resources/view/homeproxy/client.js:279 +#: htdocs/luci-static/resources/view/homeproxy/client.js:256 msgid "Global" msgstr "全局" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1189 +#: htdocs/luci-static/resources/view/homeproxy/node.js:798 msgid "Global padding" msgstr "全局填充" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1476 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1640 msgid "Global proxy IPv4 IP-s" msgstr "全局代理 IPv4 地址" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1479 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1643 msgid "Global proxy IPv6 IP-s" msgstr "全局代理 IPv6 地址" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1482 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1646 msgid "Global proxy MAC-s" msgstr "全局代理 MAC 地址" @@ -1065,62 +1116,84 @@ msgstr "全局设置" msgid "Google" msgstr "谷歌" -#: htdocs/luci-static/resources/view/homeproxy/client.js:208 -msgid "Google Public DNS (DoH)" -msgstr "Google 公共DNS (DoH)" +#: htdocs/luci-static/resources/view/homeproxy/client.js:184 +msgid "Google Public DNS (8.8.8.8)" +msgstr "谷歌公共 DNS(8.8.8.8)" #: root/usr/share/rpcd/acl.d/luci-app-homeproxy.json:3 msgid "Grant access to homeproxy configuration" msgstr "授予 homeproxy 访问 UCI 配置的权限" -#: htdocs/luci-static/resources/view/homeproxy/client.js:643 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1131 -#: htdocs/luci-static/resources/view/homeproxy/node.js:860 -#: htdocs/luci-static/resources/view/homeproxy/node.js:1207 +#: htdocs/luci-static/resources/view/homeproxy/client.js:668 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1201 +#: htdocs/luci-static/resources/view/homeproxy/node.js:450 +#: htdocs/luci-static/resources/view/homeproxy/node.js:816 #: htdocs/luci-static/resources/view/homeproxy/server.js:177 -#: htdocs/luci-static/resources/view/homeproxy/server.js:403 +#: htdocs/luci-static/resources/view/homeproxy/server.js:419 msgid "HTTP" msgstr "HTTP" -#: htdocs/luci-static/resources/view/homeproxy/client.js:975 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1068 +msgid "" +"HTTP Host header sent when obfuscation mode is http. bing.com is used by " +"default." +msgstr "混淆模式为 http 时发送的 HTTP Host 头;默认 bing.com。" + +#: htdocs/luci-static/resources/view/homeproxy/node.js:1061 +msgid "HTTP obfuscation. v4 only." +msgstr "HTTP 混淆。仅 v4。" + +#: htdocs/luci-static/resources/view/homeproxy/server.js:338 +msgid "HTTP obfuscation. v5 only." +msgstr "HTTP 混淆。仅 v5。" + +#: htdocs/luci-static/resources/view/homeproxy/client.js:1045 msgid "HTTP/3" msgstr "HTTP/3" -#: htdocs/luci-static/resources/view/homeproxy/server.js:332 +#: htdocs/luci-static/resources/view/homeproxy/server.js:323 msgid "" "HTTP3 server behavior when authentication fails.
A 404 page will be " "returned if empty." msgstr "身份验证失败时的 HTTP3 服务器响应。默认返回 404 页面。" -#: htdocs/luci-static/resources/view/homeproxy/client.js:974 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1044 msgid "HTTPS" msgstr "HTTPS" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1208 -#: htdocs/luci-static/resources/view/homeproxy/server.js:404 +#: htdocs/luci-static/resources/view/homeproxy/node.js:817 +#: htdocs/luci-static/resources/view/homeproxy/server.js:420 msgid "HTTPUpgrade" msgstr "HTTPUpgrade" -#: htdocs/luci-static/resources/view/homeproxy/server.js:744 +#: htdocs/luci-static/resources/view/homeproxy/server.js:783 msgid "Handshake server address" msgstr "握手服务器地址" -#: htdocs/luci-static/resources/view/homeproxy/server.js:750 +#: htdocs/luci-static/resources/view/homeproxy/server.js:789 msgid "Handshake server port" msgstr "握手服务器端口" -#: htdocs/luci-static/resources/view/homeproxy/client.js:997 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1151 +msgid "Handshake timeout (1.14)" +msgstr "握手超时(1.14)" + +#: htdocs/luci-static/resources/view/homeproxy/client.js:1067 msgid "Headers" msgstr "标头" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1157 -#: htdocs/luci-static/resources/view/homeproxy/server.js:376 +#: htdocs/luci-static/resources/view/homeproxy/node.js:766 +#: htdocs/luci-static/resources/view/homeproxy/server.js:392 msgid "Heartbeat interval" msgstr "心跳间隔" -#: htdocs/luci-static/resources/view/homeproxy/client.js:63 -#: htdocs/luci-static/resources/view/homeproxy/client.js:65 -#: htdocs/luci-static/resources/view/homeproxy/client.js:112 +#: htdocs/luci-static/resources/view/homeproxy/client.js:311 +msgid "Hijack" +msgstr "劫持" + +#: htdocs/luci-static/resources/view/homeproxy/client.js:55 +#: htdocs/luci-static/resources/view/homeproxy/client.js:57 +#: htdocs/luci-static/resources/view/homeproxy/client.js:101 #: htdocs/luci-static/resources/view/homeproxy/status.js:282 #: root/usr/share/luci/menu.d/luci-app-homeproxy.json:3 msgid "HomeProxy" @@ -1132,80 +1205,68 @@ msgstr "HomeProxy" msgid "HomeProxy Server" msgstr "HomeProxy 服务端" -#: htdocs/luci-static/resources/view/homeproxy/node.js:965 +#: htdocs/luci-static/resources/view/homeproxy/node.js:556 msgid "Hop interval" msgstr "跳跃间隔" -#: htdocs/luci-static/resources/view/homeproxy/node.js:959 +#: htdocs/luci-static/resources/view/homeproxy/node.js:550 msgid "Hopping port" msgstr "跳跃端口" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1256 -#: htdocs/luci-static/resources/view/homeproxy/node.js:1261 -#: htdocs/luci-static/resources/view/homeproxy/node.js:1295 -#: htdocs/luci-static/resources/view/homeproxy/server.js:437 -#: htdocs/luci-static/resources/view/homeproxy/server.js:442 -#: htdocs/luci-static/resources/view/homeproxy/server.js:473 +#: htdocs/luci-static/resources/view/homeproxy/node.js:865 +#: htdocs/luci-static/resources/view/homeproxy/node.js:870 +#: htdocs/luci-static/resources/view/homeproxy/node.js:904 +#: htdocs/luci-static/resources/view/homeproxy/server.js:453 +#: htdocs/luci-static/resources/view/homeproxy/server.js:458 +#: htdocs/luci-static/resources/view/homeproxy/server.js:489 msgid "Host" msgstr "主机名" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1099 +#: htdocs/luci-static/resources/view/homeproxy/node.js:708 msgid "Host key" msgstr "主机密钥" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1104 +#: htdocs/luci-static/resources/view/homeproxy/node.js:713 msgid "Host key algorithms" msgstr "主机密钥算法" -#: htdocs/luci-static/resources/view/homeproxy/client.js:604 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1084 +#: htdocs/luci-static/resources/view/homeproxy/client.js:629 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1154 msgid "Host/IP fields" msgstr "主机/IP 字段" -#: htdocs/luci-static/resources/view/homeproxy/server.js:364 +#: htdocs/luci-static/resources/view/homeproxy/server.js:380 msgid "" "How long the server should wait for the client to send the authentication " "command (in seconds)." msgstr "服务器等待客户端发送认证命令的时间(单位:秒)。" -#: htdocs/luci-static/resources/view/homeproxy/node.js:862 +#: htdocs/luci-static/resources/view/homeproxy/client.js:805 +msgid "How the forged segment is rejected by the real server." +msgstr "伪造段被真实服务器拒绝的方式。" + +#: htdocs/luci-static/resources/view/homeproxy/node.js:452 #: htdocs/luci-static/resources/view/homeproxy/server.js:179 msgid "Hysteria" msgstr "Hysteria" -#: htdocs/luci-static/resources/view/homeproxy/node.js:863 +#: htdocs/luci-static/resources/view/homeproxy/node.js:453 #: htdocs/luci-static/resources/view/homeproxy/server.js:180 msgid "Hysteria2" msgstr "Hysteria2" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1784 -msgid "ICMP" -msgstr "ICMP" - -#: htdocs/luci-static/resources/view/homeproxy/node.js:474 -msgid "ICMP Failed" -msgstr "ICMP 失败" - -#: htdocs/luci-static/resources/view/homeproxy/node.js:476 -msgid "ICMP Probe unavailable" -msgstr "ICMP 探测不可用" - -#: htdocs/luci-static/resources/view/homeproxy/node.js:478 -msgid "ICMP Timeout" -msgstr "ICMP 超时" - -#: htdocs/luci-static/resources/view/homeproxy/client.js:853 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1290 +#: htdocs/luci-static/resources/view/homeproxy/client.js:908 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1411 msgid "IP CIDR" msgstr "IP CIDR" -#: htdocs/luci-static/resources/view/homeproxy/client.js:631 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1112 +#: htdocs/luci-static/resources/view/homeproxy/client.js:656 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1182 msgid "IP version" msgstr "IP 版本" -#: htdocs/luci-static/resources/view/homeproxy/client.js:633 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1113 +#: htdocs/luci-static/resources/view/homeproxy/client.js:658 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1183 msgid "IPv4" msgstr "IPv4" @@ -1213,8 +1274,8 @@ msgstr "IPv4" msgid "IPv4 only" msgstr "仅 IPv4" -#: htdocs/luci-static/resources/view/homeproxy/client.js:634 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1114 +#: htdocs/luci-static/resources/view/homeproxy/client.js:659 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1184 msgid "IPv6" msgstr "IPv6" @@ -1222,228 +1283,224 @@ msgstr "IPv6" msgid "IPv6 only" msgstr "仅 IPv6" -#: htdocs/luci-static/resources/view/homeproxy/client.js:320 +#: htdocs/luci-static/resources/view/homeproxy/client.js:297 msgid "IPv6 support" msgstr "IPv6 支持" -#: htdocs/luci-static/resources/view/homeproxy/node.js:936 +#: htdocs/luci-static/resources/view/homeproxy/node.js:527 msgid "Idle session check interval" msgstr "空闲会话检查间隔" -#: htdocs/luci-static/resources/view/homeproxy/node.js:943 +#: htdocs/luci-static/resources/view/homeproxy/node.js:534 msgid "Idle session check timeout" msgstr "空闲会话检查超时" -#: htdocs/luci-static/resources/view/homeproxy/client.js:576 -#: htdocs/luci-static/resources/view/homeproxy/node.js:1277 -#: htdocs/luci-static/resources/view/homeproxy/server.js:456 +#: htdocs/luci-static/resources/view/homeproxy/client.js:601 +#: htdocs/luci-static/resources/view/homeproxy/node.js:886 +#: htdocs/luci-static/resources/view/homeproxy/server.js:472 msgid "Idle timeout" msgstr "空闲超时" -#: htdocs/luci-static/resources/view/homeproxy/client.js:740 +#: htdocs/luci-static/resources/view/homeproxy/client.js:765 msgid "" "If enabled, attempts to connect UDP connection to the destination instead of " "listen." msgstr "如果启用,尝试主动连接到目标的 UDP 而不是监听。" -#: htdocs/luci-static/resources/view/homeproxy/client.js:734 +#: htdocs/luci-static/resources/view/homeproxy/client.js:759 msgid "" "If enabled, for UDP proxy requests addressed to a domain, the original " "packet address will be sent in the response instead of the mapped domain." msgstr "" -"如果启用,对于发送到域名的 UDP 代理请求,响应中将发送原始数据包地址而不是映射" -"的域名。" +"如启用,对于发往域名的 UDP 代理请求,响应中将发送原始数据包地址,而不是映射后" +"的域名。如果启用,对于发送到域名的 UDP 代理请求,响应中将发送原始数据包地址而" +"不是映射的域名。" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1249 +#: htdocs/luci-static/resources/view/homeproxy/node.js:858 msgid "" "If enabled, the client transport sends keepalive pings even with no active " "connections." msgstr "如果启用,客户端传输即使没有活动连接也会发送 keepalive ping。" -#: htdocs/luci-static/resources/view/homeproxy/client.js:371 +#: htdocs/luci-static/resources/view/homeproxy/client.js:401 msgid "" "If set, the requested domain name will be resolved to IP before routing." msgstr "如果设置,请求的域名将在路由前被解析为 IP 地址。" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1234 -#: htdocs/luci-static/resources/view/homeproxy/server.js:425 +#: htdocs/luci-static/resources/view/homeproxy/node.js:843 +#: htdocs/luci-static/resources/view/homeproxy/server.js:441 msgid "" "If the transport doesn't see any activity after a duration of this time (in " "seconds), it pings the client to check if the connection is still active." msgstr "" -"如果传输在此时间段(单位:秒)后没有看到任何活动,它会向客户端发送 ping 请求" -"以检查连接是否仍然活动。" +"如果传输在一段时间(单位:秒)内没有任何活动,则向客户端发送 ping 以检查连接" +"是否仍处于活动状态。如果传输在此时间段(单位:秒)后没有看到任何活动,它会向" +"客户端发送 ping 请求以检查连接是否仍然活动。" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1503 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1159 msgid "" "If you have the root certificate, use this option instead of allowing " "insecure." msgstr "如果你拥有根证书,使用此选项而不是允许不安全连接。" -#: htdocs/luci-static/resources/view/homeproxy/server.js:326 +#: htdocs/luci-static/resources/view/homeproxy/server.js:317 msgid "Ignore client bandwidth" msgstr "忽略客户端带宽" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1718 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1371 msgid "Import" msgstr "导入" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1665 -#: htdocs/luci-static/resources/view/homeproxy/node.js:1744 -#: htdocs/luci-static/resources/view/homeproxy/node.js:1746 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1318 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1397 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1399 msgid "Import share links" msgstr "导入分享链接" -#: htdocs/luci-static/resources/view/homeproxy/client.js:359 -#: htdocs/luci-static/resources/view/homeproxy/server.js:860 +#: htdocs/luci-static/resources/view/homeproxy/client.js:385 +#: htdocs/luci-static/resources/view/homeproxy/server.js:899 msgid "In seconds." msgstr "单位:秒。" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1367 +#: htdocs/luci-static/resources/view/homeproxy/node.js:976 msgid "In seconds. Disabled by default." msgstr "单位:秒。默认禁用。" -#: htdocs/luci-static/resources/view/homeproxy/node.js:951 +#: htdocs/luci-static/resources/view/homeproxy/node.js:542 msgid "" "In the check, at least the first n idle sessions are kept open." msgstr "在检查中,至少保持前 n 个空闲会话处于打开状态。" -#: htdocs/luci-static/resources/view/homeproxy/node.js:944 +#: htdocs/luci-static/resources/view/homeproxy/node.js:535 msgid "" "In the check, close sessions that have been idle for longer than this, in " "seconds." msgstr "在检查中,关闭空闲时间超过此值的会话(单位:秒)。" -#: htdocs/luci-static/resources/view/homeproxy/client.js:927 -msgid "Independent cache per server" -msgstr "独立缓存" - #: htdocs/luci-static/resources/view/homeproxy/status.js:137 msgid "Info" msgstr "信息" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1428 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1557 +msgid "Initial path" +msgstr "初始路径" + +#: htdocs/luci-static/resources/view/homeproxy/client.js:798 +msgid "" +"Inject a forged TLS ClientHello carrying this SNI before the real one to " +"fool SNI-filtering middleboxes. Requires elevated privileges." +msgstr "在真实握手前注入携带该 SNI 的伪造 TLS ClientHello,以欺骗按 SNI 过滤的中间盒;需要特权。" + +#: htdocs/luci-static/resources/view/homeproxy/client.js:1592 msgid "Interface Control" msgstr "接口控制" -#: htdocs/luci-static/resources/view/homeproxy/client.js:583 +#: htdocs/luci-static/resources/view/homeproxy/client.js:608 msgid "Interrupt existing connections" msgstr "中断现有连接" -#: htdocs/luci-static/resources/view/homeproxy/client.js:584 +#: htdocs/luci-static/resources/view/homeproxy/client.js:609 msgid "Interrupt existing connections when the selected outbound has changed." msgstr "当选择的出站发生变化时中断现有连接。" -#: htdocs/luci-static/resources/view/homeproxy/node.js:937 +#: htdocs/luci-static/resources/view/homeproxy/node.js:528 msgid "Interval checking for idle sessions, in seconds." msgstr "空闲会话检查间隔(单位:秒)。" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1158 -#: htdocs/luci-static/resources/view/homeproxy/server.js:377 +#: htdocs/luci-static/resources/view/homeproxy/node.js:767 +#: htdocs/luci-static/resources/view/homeproxy/server.js:393 msgid "" "Interval for sending heartbeat packets for keeping the connection alive (in " "seconds)." msgstr "发送心跳包以保持连接存活的时间间隔(单位:秒)。" -#: htdocs/luci-static/resources/view/homeproxy/client.js:128 -#: htdocs/luci-static/resources/view/homeproxy/node.js:480 -msgid "Invalid node" -msgstr "无效节点" - -#: htdocs/luci-static/resources/view/homeproxy/node.js:482 -msgid "Invalid response" -msgstr "无效响应" - -#: htdocs/luci-static/resources/view/homeproxy/client.js:688 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1165 +#: htdocs/luci-static/resources/view/homeproxy/client.js:713 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1231 msgid "Invert" msgstr "反转" -#: htdocs/luci-static/resources/view/homeproxy/client.js:689 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1166 +#: htdocs/luci-static/resources/view/homeproxy/client.js:714 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1232 msgid "Invert match result." msgstr "反转匹配结果" -#: htdocs/luci-static/resources/view/homeproxy/server.js:775 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1297 +msgid "" +"Judge this response-dependent rule in parallel; first match wins (1.14)." +msgstr "并行判定此响应依赖规则,首个命中即生效(1.14)。" + +#: htdocs/luci-static/resources/view/homeproxy/server.js:814 msgid "Key path" msgstr "证书路径" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1442 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1606 msgid "LAN IP Policy" msgstr "LAN IP 策略" -#: htdocs/luci-static/resources/view/homeproxy/client.js:432 -#: htdocs/luci-static/resources/view/homeproxy/client.js:608 -#: htdocs/luci-static/resources/view/homeproxy/client.js:960 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1088 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1347 -#: htdocs/luci-static/resources/view/homeproxy/node.js:852 +#: htdocs/luci-static/resources/view/homeproxy/client.js:457 +#: htdocs/luci-static/resources/view/homeproxy/client.js:633 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1030 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1158 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1486 +#: htdocs/luci-static/resources/view/homeproxy/node.js:442 #: htdocs/luci-static/resources/view/homeproxy/server.js:160 msgid "Label" msgstr "标签" -#: htdocs/luci-static/resources/view/homeproxy/node.js:817 -msgid "Latency" -msgstr "延迟" - -#: htdocs/luci-static/resources/view/homeproxy/node.js:1782 -msgid "Latency test mode" -msgstr "延迟测试模式" - -#: htdocs/luci-static/resources/view/homeproxy/node.js:1173 -#: htdocs/luci-static/resources/view/homeproxy/server.js:392 +#: htdocs/luci-static/resources/view/homeproxy/node.js:782 +#: htdocs/luci-static/resources/view/homeproxy/server.js:408 msgid "" "Legacy protocol support (VMess MD5 Authentication) is provided for " "compatibility purposes only, use of alterId > 1 is not recommended." msgstr "" -"提供旧协议支持(VMess MD5 身份验证)仅出于兼容性目的,不建议使用 alterId > " -"1。" +"仅为兼容目的提供旧协议(VMess MD5 认证)支持,不建议使用大于 1 的 alterId。提" +"供旧协议支持(VMess MD5 身份验证)仅出于兼容性目的,不建议使用 alterId > 1。" -#: htdocs/luci-static/resources/view/homeproxy/client.js:348 +#: htdocs/luci-static/resources/view/homeproxy/client.js:374 msgid "Less compatibility and sometimes better performance." msgstr "有时性能更好。" -#: htdocs/luci-static/resources/view/homeproxy/server.js:629 +#: htdocs/luci-static/resources/view/homeproxy/server.js:668 msgid "Let's Encrypt" msgstr "Let's Encrypt" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1327 +#: htdocs/luci-static/resources/view/homeproxy/node.js:936 msgid "" "List of IP (v4 or v6) addresses prefixes to be assigned to the interface." msgstr "分配给接口的 IP(v4 或 v6)地址前缀列表。" -#: htdocs/luci-static/resources/view/homeproxy/client.js:157 -#: htdocs/luci-static/resources/view/homeproxy/client.js:186 -#: htdocs/luci-static/resources/view/homeproxy/client.js:520 +#: htdocs/luci-static/resources/view/homeproxy/client.js:132 +#: htdocs/luci-static/resources/view/homeproxy/client.js:161 +#: htdocs/luci-static/resources/view/homeproxy/client.js:545 msgid "List of nodes to test." msgstr "要测试的节点列表。" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1466 -#: htdocs/luci-static/resources/view/homeproxy/server.js:566 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1115 +#: htdocs/luci-static/resources/view/homeproxy/server.js:582 msgid "List of supported application level protocols, in order of preference." msgstr "支持的应用层协议协商列表,按顺序排列。" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1251 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1372 msgid "List of text DNS record to respond as answers." msgstr "要响应的 DNS 记录列表。" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1261 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1382 msgid "List of text DNS record to respond as extra records." msgstr "要响应的附加 DNS 记录列表。" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1256 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1377 msgid "List of text DNS record to respond as name servers." msgstr "要响应的域名服务器(NS) DNS 记录列表。" -#: htdocs/luci-static/resources/view/homeproxy/server.js:193 +#: htdocs/luci-static/resources/view/homeproxy/server.js:194 msgid "Listen address" msgstr "监听地址" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1430 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1594 msgid "Listen interfaces" msgstr "监听接口" -#: htdocs/luci-static/resources/view/homeproxy/server.js:198 +#: htdocs/luci-static/resources/view/homeproxy/server.js:199 msgid "Listen port" msgstr "监听端口" @@ -1451,14 +1508,20 @@ msgstr "监听端口" msgid "Loading" msgstr "加载中" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1358 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1497 msgid "Local" msgstr "本地" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1326 +#: htdocs/luci-static/resources/view/homeproxy/node.js:935 msgid "Local address" msgstr "本地地址" +#: htdocs/luci-static/resources/view/homeproxy/client.js:1558 +msgid "" +"Local file with initial rule-set content; avoids blocking startup on first " +"download (1.14)." +msgstr "远程规则集的本地初始内容文件,避免首次下载阻塞启动(1.14)。" + #: htdocs/luci-static/resources/view/homeproxy/status.js:191 msgid "Log file does not exist." msgstr "日志文件不存在。" @@ -1467,257 +1530,325 @@ msgstr "日志文件不存在。" msgid "Log is empty." msgstr "日志为空。" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1360 +#: htdocs/luci-static/resources/view/homeproxy/node.js:969 msgid "MTU" msgstr "MTU" -#: htdocs/luci-static/resources/view/homeproxy/client.js:175 +#: htdocs/luci-static/resources/view/homeproxy/client.js:150 msgid "Main UDP node" msgstr "主 UDP 节点" -#: htdocs/luci-static/resources/view/homeproxy/client.js:147 +#: htdocs/luci-static/resources/view/homeproxy/client.js:122 msgid "Main node" msgstr "主节点" -#: htdocs/luci-static/resources/view/homeproxy/client.js:685 +#: htdocs/luci-static/resources/view/homeproxy/client.js:710 msgid "Make IP CIDR in rule set used to match the source IP." msgstr "使规则集中的 IP CIDR 用于匹配源 IP。" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1158 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1228 msgid "Make IP CIDR in rule sets match the source IP." msgstr "使规则集中的 IP CIDR 匹配源 IP。" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1162 -msgid "Make IP CIDR in rule-sets accept empty query response." -msgstr "使规则集中的 IP CIDR 接受空查询响应。" - -#: htdocs/luci-static/resources/view/homeproxy/client.js:928 -msgid "" -"Make each DNS server's cache independent for special purposes. If enabled, " -"will slightly degrade performance." -msgstr "独立缓存每个 DNS 服务器的结果以供特殊用途。启用后会略微降低性能。" - -#: htdocs/luci-static/resources/view/homeproxy/server.js:331 +#: htdocs/luci-static/resources/view/homeproxy/server.js:322 msgid "Masquerade" msgstr "伪装" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1291 -msgid "" -"Match IP CIDR with query response. Current rule will be skipped if not match." -msgstr "使用查询响应匹配 IP CIDR。如果不匹配,则跳过当前规则。" +#: htdocs/luci-static/resources/view/homeproxy/client.js:1434 +msgid "Match DNSSEC OK" +msgstr "匹配 DNSSEC OK" -#: htdocs/luci-static/resources/view/homeproxy/client.js:854 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1412 +msgid "" +"Match IP CIDR with the evaluated response (needs match_response; old rules " +"are auto-wrapped in 1.14)." +msgstr "" +"以已评估的响应匹配 IP CIDR(需要 match_response;旧规则在 1.14 自动包装)。" + +#: htdocs/luci-static/resources/view/homeproxy/client.js:909 msgid "Match IP CIDR." msgstr "匹配 IP CIDR。" -#: htdocs/luci-static/resources/view/homeproxy/client.js:834 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1271 +#: htdocs/luci-static/resources/view/homeproxy/client.js:917 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1421 +msgid "Match LAN device by MAC address." +msgstr "按 MAC 地址匹配局域网设备。" + +#: htdocs/luci-static/resources/view/homeproxy/client.js:922 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1426 +msgid "" +"Match LAN device hostname via neighbor resolution; enable find_neighbor." +msgstr "通过邻居解析按主机名匹配局域网设备;需启用 find_neighbor。" + +#: htdocs/luci-static/resources/view/homeproxy/client.js:889 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1392 msgid "Match domain suffix." msgstr "匹配域名后缀。" -#: htdocs/luci-static/resources/view/homeproxy/client.js:838 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1275 +#: htdocs/luci-static/resources/view/homeproxy/client.js:893 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1396 msgid "Match domain using keyword." msgstr "使用关键词匹配域名。" -#: htdocs/luci-static/resources/view/homeproxy/client.js:842 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1279 +#: htdocs/luci-static/resources/view/homeproxy/client.js:897 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1400 msgid "Match domain using regular expression." msgstr "使用正则表达式匹配域名。" -#: htdocs/luci-static/resources/view/homeproxy/client.js:829 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1266 +#: htdocs/luci-static/resources/view/homeproxy/client.js:884 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1387 msgid "Match full domain." msgstr "匹配完整域名。" -#: htdocs/luci-static/resources/view/homeproxy/client.js:877 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1315 +#: htdocs/luci-static/resources/view/homeproxy/client.js:941 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1454 msgid "Match port range. Format as START:/:END/START:END." msgstr "匹配端口范围。格式为 START:/:END/START:END。" -#: htdocs/luci-static/resources/view/homeproxy/client.js:872 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1310 +#: htdocs/luci-static/resources/view/homeproxy/client.js:936 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1449 msgid "Match port." msgstr "匹配端口。" -#: htdocs/luci-static/resources/view/homeproxy/client.js:858 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1295 +#: htdocs/luci-static/resources/view/homeproxy/client.js:913 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1416 msgid "Match private IP" msgstr "匹配私有 IP" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1296 -msgid "Match private IP with query response." -msgstr "使用查询响应匹配私有 IP。" +#: htdocs/luci-static/resources/view/homeproxy/client.js:1417 +msgid "Match private IP with the evaluated response (needs match_response)." +msgstr "以已评估的响应匹配私网 IP(需要 match_response)。" -#: htdocs/luci-static/resources/view/homeproxy/client.js:850 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1287 +#: htdocs/luci-static/resources/view/homeproxy/client.js:905 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1408 msgid "Match private source IP" msgstr "匹配私有源 IP" -#: htdocs/luci-static/resources/view/homeproxy/client.js:882 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1320 +#: htdocs/luci-static/resources/view/homeproxy/client.js:946 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1459 msgid "Match process name." msgstr "匹配进程名。" -#: htdocs/luci-static/resources/view/homeproxy/client.js:890 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1328 +#: htdocs/luci-static/resources/view/homeproxy/client.js:954 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1467 msgid "Match process path using regular expression." msgstr "使用正则表达式匹配进程路径。" -#: htdocs/luci-static/resources/view/homeproxy/client.js:886 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1324 +#: htdocs/luci-static/resources/view/homeproxy/client.js:950 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1463 msgid "Match process path." msgstr "匹配进程路径。" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1119 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1435 +msgid "Match queries with the DNSSEC OK bit set (1.14)." +msgstr "匹配设置了 DNSSEC OK 位的查询(1.14)。" + +#: htdocs/luci-static/resources/view/homeproxy/client.js:1189 msgid "Match query type." msgstr "匹配请求类型。" -#: htdocs/luci-static/resources/view/homeproxy/client.js:670 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1143 -msgid "Match rule set." -msgstr "匹配规则集。" +#: htdocs/luci-static/resources/view/homeproxy/client.js:1286 +msgid "Match response" +msgstr "匹配响应" -#: htdocs/luci-static/resources/view/homeproxy/client.js:846 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1283 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1213 +msgid "" +"Match rule set. DNS: rules referencing rule-sets that contain query_type are " +"incompatible with legacy address filters (ip_cidr / ip_is_private) — use " +"match_response instead (1.14)." +msgstr "" +"匹配规则集。DNS:引用含 query_type 规则集的规则与 legacy 地址过滤(ip_cidr / " +"ip_is_private)不兼容——请改用 match_response(1.14)。" + +#: htdocs/luci-static/resources/view/homeproxy/client.js:695 +msgid "" +"Match rule set. Since 1.14: a rule-set holding a single default rule is " +"merged into this rule; any other rule-set matches as an OR collection." +msgstr "" +"匹配规则集。自 1.14:仅含单条 default 规则的规则集字段会合并进本条规则;其余" +"规则集整体按 OR 集合匹配。" + +#: htdocs/luci-static/resources/view/homeproxy/client.js:901 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1404 msgid "Match source IP CIDR." msgstr "匹配源 IP CIDR。" -#: htdocs/luci-static/resources/view/homeproxy/client.js:867 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1305 +#: htdocs/luci-static/resources/view/homeproxy/client.js:931 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1444 msgid "Match source port range. Format as START:/:END/START:END." msgstr "匹配源端口范围。格式为 START:/:END/START:END。" -#: htdocs/luci-static/resources/view/homeproxy/client.js:862 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1300 +#: htdocs/luci-static/resources/view/homeproxy/client.js:926 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1439 msgid "Match source port." msgstr "匹配源端口。" -#: htdocs/luci-static/resources/view/homeproxy/client.js:666 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1139 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1430 +msgid "Match the EDNS Client Subnet in the query (1.14)." +msgstr "匹配查询中的 EDNS Client Subnet(1.14)。" + +#: htdocs/luci-static/resources/view/homeproxy/client.js:1327 +msgid "Match the evaluated response code (requires match_response)." +msgstr "匹配已评估响应的响应码(需 match_response)。" + +#: htdocs/luci-static/resources/view/homeproxy/client.js:691 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1209 msgid "Match user name." msgstr "匹配用户名。" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1009 -#: htdocs/luci-static/resources/view/homeproxy/server.js:261 +#: htdocs/luci-static/resources/view/homeproxy/node.js:622 +#: htdocs/luci-static/resources/view/homeproxy/server.js:263 msgid "Max download speed" msgstr "最大下载速度" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1010 -#: htdocs/luci-static/resources/view/homeproxy/server.js:262 +#: htdocs/luci-static/resources/view/homeproxy/node.js:623 +#: htdocs/luci-static/resources/view/homeproxy/server.js:264 msgid "Max download speed in Mbps." msgstr "最大下载速度(Mbps)。" -#: htdocs/luci-static/resources/view/homeproxy/server.js:739 +#: htdocs/luci-static/resources/view/homeproxy/node.js:564 +msgid "Max hop interval (1.14)" +msgstr "最大跳变间隔(1.14)" + +#: htdocs/luci-static/resources/view/homeproxy/node.js:615 +#: htdocs/luci-static/resources/view/homeproxy/server.js:310 +msgid "Max obfs packet size (1.14)" +msgstr "最大混淆包长(1.14)" + +#: htdocs/luci-static/resources/view/homeproxy/client.js:1003 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1744 +msgid "Max time an expired entry may be served. Examples: 3d, 1h." +msgstr "过期缓存项可被乐观返回的最长时间。示例:3d、1h。" + +#: htdocs/luci-static/resources/view/homeproxy/server.js:778 msgid "Max time difference" msgstr "最大时间差" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1016 -#: htdocs/luci-static/resources/view/homeproxy/server.js:268 +#: htdocs/luci-static/resources/view/homeproxy/node.js:629 +#: htdocs/luci-static/resources/view/homeproxy/server.js:270 msgid "Max upload speed" msgstr "最大上传速度" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1017 -#: htdocs/luci-static/resources/view/homeproxy/server.js:269 +#: htdocs/luci-static/resources/view/homeproxy/node.js:630 +#: htdocs/luci-static/resources/view/homeproxy/server.js:271 msgid "Max upload speed in Mbps." msgstr "最大上传速度(Mbps)。" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1486 -#: htdocs/luci-static/resources/view/homeproxy/server.js:578 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1135 +#: htdocs/luci-static/resources/view/homeproxy/server.js:594 msgid "Maximum TLS version" msgstr "最大 TLS 版本" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1391 -#: htdocs/luci-static/resources/view/homeproxy/node.js:1405 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1000 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1014 msgid "Maximum connections" msgstr "最大连接数" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1403 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1012 msgid "" "Maximum multiplexed streams in a connection before opening a new connection." "
Conflict with %s and %s." msgstr "" -"在打开新连接之前,连接中的最大多路复用流数量。与 %s 和 " -"%s 冲突。" +"在打开新连接之前,一个连接内允许的最大多路复用流数量。
与 %s 和 %s 冲突。在打开新连接之前,连接中的最大多路复用流数量。" +"与 %s 和 %s 冲突。" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1402 +#: htdocs/luci-static/resources/view/homeproxy/node.js:616 +#: htdocs/luci-static/resources/view/homeproxy/server.js:311 +msgid "Maximum on-wire packet size in bytes. Gecko only." +msgstr "线上的最大包长(字节)。仅 Gecko 生效。" + +#: htdocs/luci-static/resources/view/homeproxy/node.js:565 +msgid "" +"Maximum port hopping interval in seconds; the actual interval is randomized " +"between the two values. Hysteria2 only." +msgstr "最大端口跳变间隔(秒);实际间隔在两者之间随机。仅 Hysteria2。" + +#: htdocs/luci-static/resources/view/homeproxy/node.js:1011 msgid "Maximum streams" msgstr "最大流数量" -#: htdocs/luci-static/resources/view/homeproxy/client.js:791 -#: htdocs/luci-static/resources/view/homeproxy/client.js:799 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1225 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1234 -#: htdocs/luci-static/resources/view/homeproxy/node.js:1271 -#: htdocs/luci-static/resources/view/homeproxy/server.js:452 +#: htdocs/luci-static/resources/view/homeproxy/client.js:835 +#: htdocs/luci-static/resources/view/homeproxy/client.js:843 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1346 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1355 +#: htdocs/luci-static/resources/view/homeproxy/node.js:880 +#: htdocs/luci-static/resources/view/homeproxy/server.js:468 msgid "Method" msgstr "方式" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1478 -#: htdocs/luci-static/resources/view/homeproxy/server.js:570 +#: htdocs/luci-static/resources/view/homeproxy/node.js:608 +#: htdocs/luci-static/resources/view/homeproxy/server.js:303 +msgid "Min obfs packet size (1.14)" +msgstr "最小混淆包长(1.14)" + +#: htdocs/luci-static/resources/view/homeproxy/node.js:1127 +#: htdocs/luci-static/resources/view/homeproxy/server.js:586 msgid "Minimum TLS version" msgstr "最低 TLS 版本" -#: htdocs/luci-static/resources/view/homeproxy/node.js:950 +#: htdocs/luci-static/resources/view/homeproxy/node.js:541 msgid "Minimum idle sessions" msgstr "最小空闲会话数" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1397 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1006 msgid "" "Minimum multiplexed streams in a connection before opening a new connection." msgstr "在打开新连接之前,连接中的最小多路复用流数量。" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1396 -#: htdocs/luci-static/resources/view/homeproxy/node.js:1405 +#: htdocs/luci-static/resources/view/homeproxy/node.js:609 +#: htdocs/luci-static/resources/view/homeproxy/server.js:304 +msgid "Minimum on-wire packet size in bytes. Gecko only." +msgstr "线上的最小包长(字节)。仅 Gecko 生效。" + +#: htdocs/luci-static/resources/view/homeproxy/node.js:1005 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1014 msgid "Minimum streams" msgstr "最小流数量" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1773 -msgid "Minutes(0-59) Hours(0-23) Dates(1-31) Months(1-12) Weeks(0-6)" -msgstr "分(0-59) 时(0-23) 日(1-31) 月(1-12) 周(0-6)" - -#: htdocs/luci-static/resources/view/homeproxy/client.js:333 +#: htdocs/luci-static/resources/view/homeproxy/client.js:359 #: htdocs/luci-static/resources/view/homeproxy/server.js:183 msgid "Mixed" msgstr "混合" -#: htdocs/luci-static/resources/view/homeproxy/client.js:344 +#: htdocs/luci-static/resources/view/homeproxy/client.js:370 msgid "Mixed system TCP stack and gVisor UDP stack." msgstr "混合系统 TCP 栈和 gVisor UDP 栈。" -#: htdocs/luci-static/resources/view/homeproxy/client.js:618 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1098 +#: htdocs/luci-static/resources/view/homeproxy/client.js:643 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1168 msgid "Mode" msgstr "模式" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1594 -#: htdocs/luci-static/resources/view/homeproxy/server.js:850 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1250 +#: htdocs/luci-static/resources/view/homeproxy/server.js:889 msgid "MultiPath TCP" msgstr "多路径 TCP(MPTCP)" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1374 -#: htdocs/luci-static/resources/view/homeproxy/server.js:500 +#: htdocs/luci-static/resources/view/homeproxy/node.js:983 +#: htdocs/luci-static/resources/view/homeproxy/server.js:516 msgid "Multiplex" msgstr "多路复用" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1382 +#: htdocs/luci-static/resources/view/homeproxy/node.js:991 msgid "Multiplex protocol." msgstr "多路复用协议。" -#: htdocs/luci-static/resources/view/homeproxy/client.js:65 +#: htdocs/luci-static/resources/view/homeproxy/client.js:57 #: htdocs/luci-static/resources/view/homeproxy/server.js:60 msgid "NOT RUNNING" msgstr "未运行" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1835 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1481 msgid "NOTE: Save current settings before updating subscriptions." msgstr "注意:更新订阅前先保存当前配置。" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1255 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1376 msgid "NS" msgstr "NS" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1141 +#: htdocs/luci-static/resources/view/homeproxy/client.js:310 +#: htdocs/luci-static/resources/view/homeproxy/node.js:750 msgid "Native" msgstr "原生" @@ -1725,42 +1856,42 @@ msgstr "原生" msgid "NaïveProxy" msgstr "NaïveProxy" -#: htdocs/luci-static/resources/view/homeproxy/client.js:660 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1122 -#: htdocs/luci-static/resources/view/homeproxy/server.js:866 +#: htdocs/luci-static/resources/view/homeproxy/client.js:685 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1192 +#: htdocs/luci-static/resources/view/homeproxy/server.js:905 msgid "Network" msgstr "网络" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1131 +#: htdocs/luci-static/resources/view/homeproxy/node.js:740 msgid "New Reno" msgstr "New Reno" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1204 -#: htdocs/luci-static/resources/view/homeproxy/node.js:1221 -#: htdocs/luci-static/resources/view/homeproxy/server.js:400 -#: htdocs/luci-static/resources/view/homeproxy/server.js:417 +#: htdocs/luci-static/resources/view/homeproxy/node.js:813 +#: htdocs/luci-static/resources/view/homeproxy/node.js:830 +#: htdocs/luci-static/resources/view/homeproxy/server.js:416 +#: htdocs/luci-static/resources/view/homeproxy/server.js:433 msgid "No TCP transport, plain HTTP is merged into the HTTP transport." msgstr "无 TCP 传输层, 纯 HTTP 已合并到 HTTP 传输层。" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1219 -#: htdocs/luci-static/resources/view/homeproxy/server.js:415 +#: htdocs/luci-static/resources/view/homeproxy/node.js:828 +#: htdocs/luci-static/resources/view/homeproxy/server.js:431 msgid "No additional encryption support: It's basically duplicate encryption." msgstr "无额外加密支持:它基本上是重复加密。" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1852 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1498 msgid "No subscription available" msgstr "无可用订阅" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1877 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1523 msgid "No subscription node" msgstr "无订阅节点" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1704 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1357 msgid "No valid share link found." msgstr "找不到有效分享链接。" -#: htdocs/luci-static/resources/view/homeproxy/client.js:442 -#: htdocs/luci-static/resources/view/homeproxy/node.js:719 +#: htdocs/luci-static/resources/view/homeproxy/client.js:467 +#: htdocs/luci-static/resources/view/homeproxy/node.js:416 msgid "Node" msgstr "节点" @@ -1768,90 +1899,121 @@ msgstr "节点" msgid "Node Settings" msgstr "节点设置" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1650 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1303 msgid "Nodes" msgstr "节点" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1017 -#: htdocs/luci-static/resources/view/homeproxy/node.js:1167 -#: htdocs/luci-static/resources/view/homeproxy/node.js:1205 -#: htdocs/luci-static/resources/view/homeproxy/server.js:386 -#: htdocs/luci-static/resources/view/homeproxy/server.js:401 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1087 +#: htdocs/luci-static/resources/view/homeproxy/node.js:776 +#: htdocs/luci-static/resources/view/homeproxy/node.js:814 +#: htdocs/luci-static/resources/view/homeproxy/server.js:402 +#: htdocs/luci-static/resources/view/homeproxy/server.js:417 msgid "None" msgstr "无" -#: htdocs/luci-static/resources/view/homeproxy/node.js:494 -#: htdocs/luci-static/resources/view/homeproxy/node.js:507 -msgid "Not Tested" -msgstr "未测试" - -#: htdocs/luci-static/resources/view/homeproxy/node.js:1003 -#: htdocs/luci-static/resources/view/homeproxy/server.js:294 +#: htdocs/luci-static/resources/view/homeproxy/node.js:602 +#: htdocs/luci-static/resources/view/homeproxy/server.js:297 msgid "Obfuscate password" msgstr "混淆密码" -#: htdocs/luci-static/resources/view/homeproxy/node.js:997 -#: htdocs/luci-static/resources/view/homeproxy/server.js:288 +#: htdocs/luci-static/resources/view/homeproxy/node.js:595 +#: htdocs/luci-static/resources/view/homeproxy/server.js:290 msgid "Obfuscate type" msgstr "混淆类型" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1431 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1067 +msgid "Obfuscation host" +msgstr "混淆主机" + +#: htdocs/luci-static/resources/view/homeproxy/node.js:1060 +#: htdocs/luci-static/resources/view/homeproxy/server.js:337 +msgid "Obfuscation mode" +msgstr "混淆模式" + +#: htdocs/luci-static/resources/view/homeproxy/client.js:1595 msgid "Only process traffic from specific interfaces. Leave empty for all." msgstr "只处理来自指定接口的流量。留空表示全部。" -#: htdocs/luci-static/resources/view/homeproxy/client.js:277 +#: htdocs/luci-static/resources/view/homeproxy/client.js:254 msgid "Only proxy mainland China" msgstr "仅代理中国大陆" -#: htdocs/luci-static/resources/view/homeproxy/client.js:603 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1083 +#: htdocs/luci-static/resources/view/homeproxy/client.js:996 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1739 +msgid "Optimistic DNS cache" +msgstr "乐观 DNS 缓存" + +#: htdocs/luci-static/resources/view/homeproxy/client.js:1002 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1743 +msgid "Optimistic cache timeout" +msgstr "乐观缓存超时" + +#: htdocs/luci-static/resources/view/homeproxy/client.js:1292 +msgid "Optional tag for this evaluate result." +msgstr "此 evaluate 结果的可选标签。" + +#: htdocs/luci-static/resources/view/homeproxy/node.js:1051 +msgid "Optional; only required when connecting to a multi-user Snell server." +msgstr "可选;仅在连接多用户 Snell 服务器时需要。" + +#: htdocs/luci-static/resources/view/homeproxy/client.js:628 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1153 msgid "Other fields" msgstr "其他字段" -#: htdocs/luci-static/resources/view/homeproxy/client.js:483 -#: htdocs/luci-static/resources/view/homeproxy/client.js:701 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1050 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1398 +#: htdocs/luci-static/resources/view/homeproxy/client.js:508 +#: htdocs/luci-static/resources/view/homeproxy/client.js:726 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1120 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1540 msgid "Outbound" msgstr "出站" -#: htdocs/luci-static/resources/view/homeproxy/client.js:443 +#: htdocs/luci-static/resources/view/homeproxy/client.js:468 msgid "Outbound node" msgstr "出站节点" -#: htdocs/luci-static/resources/view/homeproxy/client.js:719 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1541 +msgid "" +"Outbound used to download this rule-set (via sing-box 1.14 http_clients)." +msgstr "下载此规则集所使用的出站(经 sing-box 1.14 http_clients 生效)。" + +#: htdocs/luci-static/resources/view/homeproxy/client.js:744 msgid "Override address" msgstr "覆盖地址" -#: htdocs/luci-static/resources/view/homeproxy/client.js:375 -msgid "Override destination" -msgstr "覆盖目标地址" +#: htdocs/luci-static/resources/view/homeproxy/client.js:878 +msgid "Override dns.timeout for this lookup, in seconds (1.14)." +msgstr "覆盖本次查询解析的 dns.timeout(秒)(1.14)。" -#: htdocs/luci-static/resources/view/homeproxy/client.js:726 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1314 +msgid "Override dns.timeout for this query, in seconds." +msgstr "覆盖本次查询的 dns.timeout,单位秒。" + +#: htdocs/luci-static/resources/view/homeproxy/client.js:751 msgid "Override port" msgstr "覆盖端口" -#: htdocs/luci-static/resources/view/homeproxy/client.js:376 -msgid "Override the connection destination address with the sniffed domain." -msgstr "使用嗅探到的域名覆盖连接目标。" - -#: htdocs/luci-static/resources/view/homeproxy/client.js:720 +#: htdocs/luci-static/resources/view/homeproxy/client.js:745 msgid "Override the connection destination address." msgstr "覆盖目标连接地址。" -#: htdocs/luci-static/resources/view/homeproxy/client.js:727 +#: htdocs/luci-static/resources/view/homeproxy/client.js:752 msgid "Override the connection destination port." msgstr "覆盖目标连接端口。" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1273 +#: htdocs/luci-static/resources/view/homeproxy/server.js:660 +msgid "PEM-encoded private key of an existing ACME account (1.14)." +msgstr "已有 ACME 账户的 PEM 编码私钥(1.14)。" + +#: htdocs/luci-static/resources/view/homeproxy/node.js:882 msgid "PUT" msgstr "PUT" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1316 +#: htdocs/luci-static/resources/view/homeproxy/node.js:925 msgid "Packet encoding" msgstr "数据包编码" -#: htdocs/luci-static/resources/view/homeproxy/server.js:244 +#: htdocs/luci-static/resources/view/homeproxy/server.js:246 msgid "Padding scheme" msgstr "填充方案" @@ -1859,77 +2021,85 @@ msgstr "填充方案" msgid "Panic" msgstr "崩溃" -#: htdocs/luci-static/resources/view/homeproxy/node.js:894 -#: htdocs/luci-static/resources/view/homeproxy/server.js:210 +#: htdocs/luci-static/resources/view/homeproxy/node.js:484 +#: htdocs/luci-static/resources/view/homeproxy/server.js:211 msgid "Password" msgstr "密码" -#: htdocs/luci-static/resources/view/homeproxy/client.js:990 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1369 -#: htdocs/luci-static/resources/view/homeproxy/node.js:1266 -#: htdocs/luci-static/resources/view/homeproxy/node.js:1299 -#: htdocs/luci-static/resources/view/homeproxy/server.js:447 -#: htdocs/luci-static/resources/view/homeproxy/server.js:477 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1060 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1508 +#: htdocs/luci-static/resources/view/homeproxy/node.js:875 +#: htdocs/luci-static/resources/view/homeproxy/node.js:908 +#: htdocs/luci-static/resources/view/homeproxy/server.js:463 +#: htdocs/luci-static/resources/view/homeproxy/server.js:493 msgid "Path" msgstr "路径" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1341 +#: htdocs/luci-static/resources/view/homeproxy/node.js:950 msgid "Peer pubkic key" msgstr "对端公钥" -#: htdocs/luci-static/resources/view/homeproxy/client.js:352 +#: htdocs/luci-static/resources/view/homeproxy/client.js:378 msgid "" "Performance may degrade slightly, so it is not recommended to enable on when " "it is not needed." msgstr "性能可能会略有下降,建议仅在需要时开启。" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1366 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1752 +msgid "Persist DNS cache across restarts (replaces Store RDRC)." +msgstr "重启后持久化 DNS 缓存(替代 Store RDRC)。" + +#: htdocs/luci-static/resources/view/homeproxy/client.js:1011 +msgid "Persist DNS cache across restarts (sing-box 1.14, replaces Store RDRC)." +msgstr "重启后持久化 DNS 缓存(sing-box 1.14,替代 Store RDRC)。" + +#: htdocs/luci-static/resources/view/homeproxy/node.js:975 msgid "Persistent keepalive interval" msgstr "持久 keepalive 间隔" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1285 -#: htdocs/luci-static/resources/view/homeproxy/server.js:464 +#: htdocs/luci-static/resources/view/homeproxy/node.js:894 +#: htdocs/luci-static/resources/view/homeproxy/server.js:480 msgid "Ping timeout" msgstr "Ping 超时" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1060 +#: htdocs/luci-static/resources/view/homeproxy/node.js:669 msgid "Plugin" msgstr "插件" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1067 +#: htdocs/luci-static/resources/view/homeproxy/node.js:676 msgid "Plugin opts" msgstr "插件参数" -#: htdocs/luci-static/resources/view/homeproxy/client.js:871 -#: htdocs/luci-static/resources/view/homeproxy/client.js:985 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1309 -#: htdocs/luci-static/resources/view/homeproxy/node.js:883 +#: htdocs/luci-static/resources/view/homeproxy/client.js:935 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1055 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1448 +#: htdocs/luci-static/resources/view/homeproxy/node.js:473 msgid "Port" msgstr "端口" -#: htdocs/luci-static/resources/view/homeproxy/client.js:299 +#: htdocs/luci-static/resources/view/homeproxy/client.js:276 msgid "Port %s alrealy exists!" msgstr "端口 %s 已存在!" -#: htdocs/luci-static/resources/view/homeproxy/client.js:605 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1085 +#: htdocs/luci-static/resources/view/homeproxy/client.js:630 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1155 msgid "Port fields" msgstr "端口字段" -#: htdocs/luci-static/resources/view/homeproxy/node.js:966 +#: htdocs/luci-static/resources/view/homeproxy/node.js:557 msgid "Port hopping interval in seconds." msgstr "端口跳跃间隔(单位:秒)。" -#: htdocs/luci-static/resources/view/homeproxy/client.js:876 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1314 +#: htdocs/luci-static/resources/view/homeproxy/client.js:940 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1453 msgid "Port range" msgstr "端口范围" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1348 +#: htdocs/luci-static/resources/view/homeproxy/node.js:957 msgid "Pre-shared key" msgstr "预共享密钥" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1173 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1239 msgid "Predefined" msgstr "预定义" @@ -1941,197 +2111,180 @@ msgstr "优先 IPv4" msgid "Prefer IPv6" msgstr "优先 IPv6" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1108 -#: htdocs/luci-static/resources/view/homeproxy/node.js:1333 +#: htdocs/luci-static/resources/view/homeproxy/node.js:717 +#: htdocs/luci-static/resources/view/homeproxy/node.js:942 msgid "Private key" msgstr "私钥" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1113 +#: htdocs/luci-static/resources/view/homeproxy/node.js:722 msgid "Private key passphrase" msgstr "私钥指纹" -#: htdocs/luci-static/resources/view/homeproxy/node.js:484 -msgid "Probe failed" -msgstr "探测失败" +#: htdocs/luci-static/resources/view/homeproxy/server.js:644 +msgid "Private key type for new certificates (1.14). Empty uses the default." +msgstr "新证书的私钥类型(1.14)。留空使用默认值。" -#: htdocs/luci-static/resources/view/homeproxy/client.js:606 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1086 +#: htdocs/luci-static/resources/view/homeproxy/client.js:631 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1156 msgid "Process fields" msgstr "进程字段" -#: htdocs/luci-static/resources/view/homeproxy/client.js:881 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1319 +#: htdocs/luci-static/resources/view/homeproxy/client.js:945 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1458 msgid "Process name" msgstr "进程名" -#: htdocs/luci-static/resources/view/homeproxy/client.js:885 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1323 +#: htdocs/luci-static/resources/view/homeproxy/client.js:949 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1462 msgid "Process path" msgstr "进程路径" -#: htdocs/luci-static/resources/view/homeproxy/client.js:889 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1327 +#: htdocs/luci-static/resources/view/homeproxy/client.js:953 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1466 msgid "Process path (regex)" msgstr "进程路径(正则表达式)" -#: htdocs/luci-static/resources/view/homeproxy/client.js:638 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1127 -#: htdocs/luci-static/resources/view/homeproxy/node.js:973 -#: htdocs/luci-static/resources/view/homeproxy/node.js:1381 -#: htdocs/luci-static/resources/view/homeproxy/server.js:250 +#: htdocs/luci-static/resources/view/homeproxy/client.js:663 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1197 +#: htdocs/luci-static/resources/view/homeproxy/node.js:571 +#: htdocs/luci-static/resources/view/homeproxy/node.js:990 +#: htdocs/luci-static/resources/view/homeproxy/server.js:252 msgid "Protocol" msgstr "协议" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1197 +#: htdocs/luci-static/resources/view/homeproxy/node.js:806 msgid "Protocol parameter. Enable length block encryption." msgstr "协议参数。启用长度块加密。" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1190 +#: htdocs/luci-static/resources/view/homeproxy/node.js:799 msgid "" "Protocol parameter. Will waste traffic randomly if enabled (enabled by " "default in v2ray and cannot be disabled)." msgstr "协议参数。 如启用会随机浪费流量(在 v2ray 中默认启用并且无法禁用)。" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1505 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1669 msgid "Proxy Domain List" msgstr "代理域名列表" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1460 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1489 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1624 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1653 msgid "Proxy IPv4 IP-s" msgstr "代理 IPv4 地址" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1463 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1492 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1627 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1656 msgid "Proxy IPv6 IP-s" msgstr "代理 IPv6 地址" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1466 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1630 msgid "Proxy MAC-s" msgstr "代理 MAC 地址" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1447 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1611 msgid "Proxy all except listed" msgstr "仅允许列表外" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1444 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1608 msgid "Proxy filter mode" msgstr "代理过滤模式" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1446 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1610 msgid "Proxy listed only" msgstr "仅允许列表内" -#: htdocs/luci-static/resources/view/homeproxy/client.js:307 +#: htdocs/luci-static/resources/view/homeproxy/client.js:284 msgid "Proxy mode" msgstr "代理模式" -#: htdocs/luci-static/resources/view/homeproxy/node.js:927 +#: htdocs/luci-static/resources/view/homeproxy/node.js:518 msgid "Proxy protocol" msgstr "代理协议" -#: htdocs/luci-static/resources/view/homeproxy/client.js:644 -#: htdocs/luci-static/resources/view/homeproxy/client.js:976 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1132 -#: htdocs/luci-static/resources/view/homeproxy/node.js:1142 -#: htdocs/luci-static/resources/view/homeproxy/node.js:1209 -#: htdocs/luci-static/resources/view/homeproxy/server.js:405 +#: htdocs/luci-static/resources/view/homeproxy/client.js:669 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1046 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1202 +#: htdocs/luci-static/resources/view/homeproxy/node.js:751 +#: htdocs/luci-static/resources/view/homeproxy/node.js:818 +#: htdocs/luci-static/resources/view/homeproxy/server.js:421 msgid "QUIC" msgstr "QUIC" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1129 -#: htdocs/luci-static/resources/view/homeproxy/server.js:355 +#: htdocs/luci-static/resources/view/homeproxy/node.js:738 +#: htdocs/luci-static/resources/view/homeproxy/server.js:371 msgid "QUIC congestion control algorithm." msgstr "QUIC 拥塞控制算法。" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1029 -#: htdocs/luci-static/resources/view/homeproxy/server.js:307 -msgid "QUIC connection receive window" -msgstr "QUIC 连接窗口" +#: htdocs/luci-static/resources/view/homeproxy/client.js:1429 +msgid "Query EDNS client subnet" +msgstr "查询 EDNS Client Subnet" -#: htdocs/luci-static/resources/view/homeproxy/server.js:314 -msgid "QUIC maximum concurrent bidirectional streams" -msgstr "QUIC 最大双向并发流" +#: htdocs/luci-static/resources/view/homeproxy/client.js:877 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1313 +msgid "Query timeout" +msgstr "查询超时" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1023 -#: htdocs/luci-static/resources/view/homeproxy/server.js:300 -msgid "QUIC stream receive window" -msgstr "QUIC 流接收窗口" - -#: htdocs/luci-static/resources/view/homeproxy/client.js:209 -msgid "Quad9 Public DNS (DoH)" -msgstr "Quad9 公共DNS (DoH)" - -#: htdocs/luci-static/resources/view/homeproxy/client.js:1118 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1188 msgid "Query type" msgstr "请求类型" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1238 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1359 msgid "RCode" msgstr "RCode" -#: htdocs/luci-static/resources/view/homeproxy/client.js:645 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1133 +#: htdocs/luci-static/resources/view/homeproxy/client.js:670 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1203 msgid "RDP" msgstr "RDP" -#: htdocs/luci-static/resources/view/homeproxy/client.js:940 -msgid "RDRC timeout" -msgstr "RDRC 超时" - -#: htdocs/luci-static/resources/view/homeproxy/node.js:1572 -#: htdocs/luci-static/resources/view/homeproxy/server.js:709 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1228 +#: htdocs/luci-static/resources/view/homeproxy/server.js:748 msgid "REALITY" msgstr "REALITY" -#: htdocs/luci-static/resources/view/homeproxy/server.js:714 +#: htdocs/luci-static/resources/view/homeproxy/server.js:753 msgid "REALITY private key" msgstr "REALITY 私钥" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1577 -#: htdocs/luci-static/resources/view/homeproxy/server.js:730 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1233 +#: htdocs/luci-static/resources/view/homeproxy/server.js:769 msgid "REALITY public key" msgstr "REALITY 公钥" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1583 -#: htdocs/luci-static/resources/view/homeproxy/server.js:734 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1239 +#: htdocs/luci-static/resources/view/homeproxy/server.js:773 msgid "REALITY short ID" msgstr "REALITY 标识符" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1785 -msgid "RP" -msgstr "RP" - -#: htdocs/luci-static/resources/view/homeproxy/node.js:486 -msgid "RPC failed" -msgstr "RPC 失败" - -#: htdocs/luci-static/resources/view/homeproxy/client.js:63 +#: htdocs/luci-static/resources/view/homeproxy/client.js:55 #: htdocs/luci-static/resources/view/homeproxy/server.js:58 msgid "RUNNING" msgstr "运行中" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1095 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1296 +msgid "Race" +msgstr "并行竞争" + +#: htdocs/luci-static/resources/view/homeproxy/node.js:704 msgid "Random version will be used if empty." msgstr "如留空,则使用随机版本。" -#: htdocs/luci-static/resources/view/homeproxy/client.js:511 +#: htdocs/luci-static/resources/view/homeproxy/client.js:536 msgid "Recursive outbound detected!" msgstr "检测到递归出站!" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1036 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1106 msgid "Recursive resolver detected!" msgstr "检测到递归解析器!" -#: htdocs/luci-static/resources/view/homeproxy/client.js:308 +#: htdocs/luci-static/resources/view/homeproxy/client.js:285 msgid "Redirect TCP" msgstr "Redirect TCP" -#: htdocs/luci-static/resources/view/homeproxy/client.js:310 +#: htdocs/luci-static/resources/view/homeproxy/client.js:287 msgid "Redirect TCP + TProxy UDP" msgstr "Redirect TCP + TProxy UDP" -#: htdocs/luci-static/resources/view/homeproxy/client.js:312 +#: htdocs/luci-static/resources/view/homeproxy/client.js:289 msgid "Redirect TCP + Tun UDP" msgstr "Redirect TCP + Tun UDP" @@ -2139,44 +2292,52 @@ msgstr "Redirect TCP + Tun UDP" msgid "Refresh every %s seconds." msgstr "每 %s 秒刷新。" -#: htdocs/luci-static/resources/view/homeproxy/server.js:659 +#: htdocs/luci-static/resources/view/homeproxy/server.js:698 msgid "Region ID" msgstr "区域 ID" -#: htdocs/luci-static/resources/view/homeproxy/client.js:695 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1172 +#: htdocs/luci-static/resources/view/homeproxy/client.js:720 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1238 msgid "Reject" msgstr "拒绝" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1359 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1498 msgid "Remote" msgstr "远程" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1874 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1520 msgid "Remove %s nodes" msgstr "移除 %s 个节点" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1864 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1320 +msgid "Remove EDNS client subnet" +msgstr "移除 EDNS Client Subnet" + +#: htdocs/luci-static/resources/view/homeproxy/node.js:1510 msgid "Remove all nodes from subscriptions" msgstr "移除所有订阅节点" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1226 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1321 +msgid "Remove the edns0-subnet record from the query (1.14)." +msgstr "从查询中移除 edns0-subnet 记录(1.14)。" + +#: htdocs/luci-static/resources/view/homeproxy/client.js:1347 msgid "Reply with REFUSED" msgstr "回复 REFUSED" -#: htdocs/luci-static/resources/view/homeproxy/client.js:792 +#: htdocs/luci-static/resources/view/homeproxy/client.js:836 msgid "Reply with TCP RST / ICMP port unreachable" msgstr "回复 TCP RST / ICMP 端口不可达" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1355 +#: htdocs/luci-static/resources/view/homeproxy/node.js:964 msgid "Reserved field bytes" msgstr "保留字段字节" -#: htdocs/luci-static/resources/view/homeproxy/client.js:696 +#: htdocs/luci-static/resources/view/homeproxy/client.js:721 msgid "Resolve" msgstr "解析" -#: htdocs/luci-static/resources/view/homeproxy/client.js:803 +#: htdocs/luci-static/resources/view/homeproxy/client.js:847 msgid "Resolve strategy" msgstr "解析策略" @@ -2184,145 +2345,128 @@ msgstr "解析策略" msgid "Resources management" msgstr "资源管理" -#: htdocs/luci-static/resources/view/homeproxy/server.js:880 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1338 +msgid "Response NS" +msgstr "响应 NS 记录" + +#: htdocs/luci-static/resources/view/homeproxy/client.js:1326 +msgid "Response RCode" +msgstr "响应 RCode" + +#: htdocs/luci-static/resources/view/homeproxy/client.js:1333 +msgid "Response answer" +msgstr "响应 Answer 记录" + +#: htdocs/luci-static/resources/view/homeproxy/client.js:1342 +msgid "Response extra" +msgstr "响应 Extra 记录" + +#: htdocs/luci-static/resources/view/homeproxy/client.js:997 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1740 +msgid "" +"Return expired cache immediately and refresh in background (sing-box 1.14)." +msgstr "立即返回已过期缓存并在后台刷新(sing-box 1.14)。" + +#: htdocs/luci-static/resources/view/homeproxy/server.js:919 msgid "Reuse address" msgstr "复用地址" -#: htdocs/luci-static/resources/view/homeproxy/server.js:881 +#: htdocs/luci-static/resources/view/homeproxy/server.js:920 msgid "Reuse listener address." msgstr "复用监听地址。" -#: htdocs/luci-static/resources/view/homeproxy/client.js:815 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1210 +#: htdocs/luci-static/resources/view/homeproxy/client.js:859 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1271 msgid "Rewrite TTL" msgstr "重写 TTL" -#: htdocs/luci-static/resources/view/homeproxy/client.js:816 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1211 +#: htdocs/luci-static/resources/view/homeproxy/client.js:860 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1272 msgid "Rewrite TTL in DNS responses." msgstr "在 DNS 响应中重写 TTL。" -#: htdocs/luci-static/resources/view/homeproxy/client.js:693 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1170 +#: htdocs/luci-static/resources/view/homeproxy/client.js:718 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1236 msgid "Route" msgstr "路由" -#: htdocs/luci-static/resources/view/homeproxy/client.js:694 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1171 +#: htdocs/luci-static/resources/view/homeproxy/client.js:719 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1237 msgid "Route options" msgstr "路由选项" -#: htdocs/luci-static/resources/view/homeproxy/client.js:419 +#: htdocs/luci-static/resources/view/homeproxy/client.js:444 msgid "Routing Nodes" -msgstr "策略组" +msgstr "路由节点" -#: htdocs/luci-static/resources/view/homeproxy/client.js:590 +#: htdocs/luci-static/resources/view/homeproxy/client.js:615 msgid "Routing Rules" msgstr "路由规则" -#: htdocs/luci-static/resources/view/homeproxy/client.js:145 +#: htdocs/luci-static/resources/view/homeproxy/client.js:120 msgid "Routing Settings" msgstr "路由设置" -#: htdocs/luci-static/resources/view/homeproxy/client.js:274 +#: htdocs/luci-static/resources/view/homeproxy/client.js:251 msgid "Routing mode" msgstr "路由模式" -#: htdocs/luci-static/resources/view/homeproxy/client.js:428 +#: htdocs/luci-static/resources/view/homeproxy/client.js:453 msgid "Routing node" -msgstr "策略组" +msgstr "路由节点" -#: htdocs/luci-static/resources/view/homeproxy/client.js:287 +#: htdocs/luci-static/resources/view/homeproxy/client.js:264 msgid "Routing ports" msgstr "路由端口" -#: htdocs/luci-static/resources/view/homeproxy/client.js:599 +#: htdocs/luci-static/resources/view/homeproxy/client.js:624 msgid "Routing rule" msgstr "路由规则" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1334 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1473 msgid "Rule Set" msgstr "规则集" -#: htdocs/luci-static/resources/view/homeproxy/client.js:669 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1142 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1343 +#: htdocs/luci-static/resources/view/homeproxy/client.js:694 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1212 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1482 msgid "Rule set" msgstr "规则集" -#: htdocs/luci-static/resources/view/homeproxy/client.js:684 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1157 +#: htdocs/luci-static/resources/view/homeproxy/client.js:709 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1227 msgid "Rule set IP CIDR as source IP" msgstr "规则集 IP CIDR 作为源 IP" -msgid "Tag" -msgstr "标签" - -msgid "Used by sing-box rule sets. Please fill it in yourself." -msgstr "用于 sing-box 规则集,请自行填写。" - -msgid "valid tag" -msgstr "有效标签" - -msgid "valid duration" -msgstr "有效时间格式" - -msgid "valid cron expression" -msgstr "有效 cron 表达式" - -msgid "Manual select" -msgstr "手动选择" - -msgid "Custom nodes" -msgstr "自选节点" - -msgid "Custom" -msgstr "自定义" - -msgid "Custom URL" -msgstr "自定义URL" - -msgid "Policy nodes" -msgstr "策略节点" - -msgid "List of policy groups." -msgstr "策略组列表。" - -msgid "Subscription nodes" -msgstr "订阅节点" - -msgid "List of nodes from subscriptions." -msgstr "订阅节点列表。" - -#: htdocs/luci-static/resources/view/homeproxy/client.js:1376 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1515 msgid "Rule set URL" msgstr "规则集 URL" -#: htdocs/luci-static/resources/view/homeproxy/client.js:646 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1134 -#: htdocs/luci-static/resources/view/homeproxy/node.js:868 +#: htdocs/luci-static/resources/view/homeproxy/client.js:671 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1204 +#: htdocs/luci-static/resources/view/homeproxy/node.js:458 msgid "SSH" msgstr "SSH" -#: htdocs/luci-static/resources/view/homeproxy/client.js:647 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1135 +#: htdocs/luci-static/resources/view/homeproxy/client.js:672 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1205 msgid "STUN" msgstr "STUN" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1607 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1263 msgid "SUoT version" msgstr "SUoT 版本" -#: htdocs/luci-static/resources/view/homeproxy/client.js:655 +#: htdocs/luci-static/resources/view/homeproxy/client.js:680 msgid "Safari / Apple Network API" msgstr "Safari / Apple Network API" -#: htdocs/luci-static/resources/view/homeproxy/node.js:999 -#: htdocs/luci-static/resources/view/homeproxy/server.js:290 +#: htdocs/luci-static/resources/view/homeproxy/node.js:597 +#: htdocs/luci-static/resources/view/homeproxy/server.js:292 msgid "Salamander" msgstr "Salamander" -#: htdocs/luci-static/resources/view/homeproxy/client.js:177 +#: htdocs/luci-static/resources/view/homeproxy/client.js:152 msgid "Same as main node" msgstr "保持与主节点一致" @@ -2331,15 +2475,19 @@ msgstr "保持与主节点一致" msgid "Save" msgstr "保存" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1837 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1483 msgid "Save current settings" msgstr "保存当前设置" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1834 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1480 msgid "Save subscriptions settings" msgstr "保存订阅设置" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1178 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1302 +msgid "Send the query before pending race rules are judged (1.14)." +msgstr "在待定 race 规则判定前即发送查询(1.14)。" + +#: htdocs/luci-static/resources/view/homeproxy/client.js:1245 #: htdocs/luci-static/resources/view/homeproxy/server.js:156 msgid "Server" msgstr "服务器" @@ -2348,7 +2496,7 @@ msgstr "服务器" msgid "Server Settings" msgstr "服务器设置" -#: htdocs/luci-static/resources/view/homeproxy/server.js:607 +#: htdocs/luci-static/resources/view/homeproxy/server.js:623 msgid "" "Server name to use when choosing a certificate if the ClientHello's " "ServerName field is empty." @@ -2362,83 +2510,111 @@ msgstr "服务器设置" msgid "Service Status" msgstr "服务状态" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1198 -msgid "Set domain strategy for this query." -msgstr "为此查询设置域名策略。" - -#: htdocs/luci-static/resources/view/homeproxy/node.js:866 +#: htdocs/luci-static/resources/view/homeproxy/node.js:456 msgid "ShadowTLS" msgstr "ShadowTLS" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1074 +#: htdocs/luci-static/resources/view/homeproxy/node.js:683 msgid "ShadowTLS version" msgstr "ShadowTLS 版本" -#: htdocs/luci-static/resources/view/homeproxy/node.js:865 +#: htdocs/luci-static/resources/view/homeproxy/node.js:455 #: htdocs/luci-static/resources/view/homeproxy/server.js:184 msgid "Shadowsocks" msgstr "Shadowsocks" -#: htdocs/luci-static/resources/view/homeproxy/client.js:651 +#: htdocs/luci-static/resources/view/homeproxy/client.js:307 +msgid "" +"Since sing-box 1.14 the default (Unset) behaves as hijack: sing-box sets the " +"platform interface DNS and hijacks port 53. On OpenWrt this overlaps with " +"the own dnsmasq/nftables DNS hijack of this plugin, so keep Disabled on a " +"gateway unless you need sing-box to own TUN DNS." +msgstr "" +"自 sing-box 1.14 起,默认(Unset)即 hijack:sing-box 会设置平台接口 DNS 并劫" +"持 53 端口。OpenWrt 下这会与本插件自身的 dnsmasq/nftables DNS 劫持叠加,网关" +"建议保持 Disabled,除非需要 sing-box 全权接管 TUN 内 DNS。" + +#: htdocs/luci-static/resources/view/homeproxy/server.js:185 +msgid "Snell (1.14)" +msgstr "Snell(1.14)" + +#: htdocs/luci-static/resources/view/homeproxy/node.js:1042 +#: htdocs/luci-static/resources/view/homeproxy/server.js:329 +msgid "Snell version" +msgstr "Snell 版本" + +#: htdocs/luci-static/resources/view/homeproxy/client.js:676 msgid "Sniffed client type (QUIC client type or SSH client name)." msgstr "嗅探到的客户端类型(QUIC 客户端类型或 SSH 客户端名称)。" -#: htdocs/luci-static/resources/view/homeproxy/client.js:639 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1128 +#: htdocs/luci-static/resources/view/homeproxy/client.js:664 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1198 msgid "" -"Sniffed protocol, see Sniff for details." +"Sniffed protocol, see Sniff for details." msgstr "" -"嗅探协议,具体参见 Sniff。" +"嗅探到的协议,详情请参阅 嗅探。嗅探协议,具体参见 Sniff。" -#: htdocs/luci-static/resources/view/homeproxy/node.js:867 -#: htdocs/luci-static/resources/view/homeproxy/server.js:185 +#: htdocs/luci-static/resources/view/homeproxy/node.js:457 +#: htdocs/luci-static/resources/view/homeproxy/server.js:186 msgid "Socks" msgstr "Socks" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1084 +#: htdocs/luci-static/resources/view/homeproxy/node.js:693 msgid "Socks version" msgstr "Socks 版本" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1085 +#: htdocs/luci-static/resources/view/homeproxy/node.js:694 msgid "Socks4" msgstr "Socks4" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1086 +#: htdocs/luci-static/resources/view/homeproxy/node.js:695 msgid "Socks4A" msgstr "Socks4A" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1087 +#: htdocs/luci-static/resources/view/homeproxy/node.js:696 msgid "Socks5" msgstr "Socks5" -#: htdocs/luci-static/resources/view/homeproxy/client.js:845 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1282 +#: htdocs/luci-static/resources/view/homeproxy/client.js:900 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1403 msgid "Source IP CIDR" msgstr "源 IP CIDR" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1365 +#: htdocs/luci-static/resources/view/homeproxy/client.js:916 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1420 +msgid "Source MAC address" +msgstr "来源 MAC 地址" + +#: htdocs/luci-static/resources/view/homeproxy/client.js:1504 msgid "Source file" msgstr "源文件" -#: htdocs/luci-static/resources/view/homeproxy/client.js:861 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1299 +#: htdocs/luci-static/resources/view/homeproxy/client.js:921 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1425 +msgid "Source hostname" +msgstr "来源主机名" + +#: htdocs/luci-static/resources/view/homeproxy/client.js:925 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1438 msgid "Source port" msgstr "源端口" -#: htdocs/luci-static/resources/view/homeproxy/client.js:866 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1304 +#: htdocs/luci-static/resources/view/homeproxy/client.js:930 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1443 msgid "Source port range" msgstr "源端口范围" -#: htdocs/luci-static/resources/view/homeproxy/client.js:773 +#: htdocs/luci-static/resources/view/homeproxy/client.js:817 msgid "" "Specifies DNS server tag to use instead of selecting through DNS routing." msgstr "指定使用的 DNS 服务器,而不是通过 DNS 规则选择。" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1226 -#: htdocs/luci-static/resources/view/homeproxy/node.js:1278 +#: htdocs/luci-static/resources/view/homeproxy/node.js:835 +#: htdocs/luci-static/resources/view/homeproxy/node.js:887 msgid "" "Specifies the period of time (in seconds) after which a health check will be " "performed using a ping frame if no frames have been received on the " @@ -2446,58 +2622,71 @@ msgid "" "frame, so if there is no other traffic on the connection, the health check " "will be executed every interval." msgstr "" -"如果连接上没有收到任何帧,指定一段时间(单位:秒)后将使用 PING 帧执行健康检" -"查。
需要注意的是,PING 响应被视为已接收的帧,因此如果连接上没有其他流" -"量,则健康检查将在每个间隔执行一次。" +"指定时间(单位:秒)内未收到任何帧后,将使用 ping 帧执行健康检查。
请注" +"意,ping 响应被视为已接收的帧,因此如果连接上没有其他流量,则每隔该时间间隔执" +"行一次健康检查。如果连接上没有收到任何帧,指定一段时间(单位:秒)后将使用 " +"PING 帧执行健康检查。
需要注意的是,PING 响应被视为已接收的帧,因此如果连" +"接上没有其他流量,则健康检查将在每个间隔执行一次。" -#: htdocs/luci-static/resources/view/homeproxy/server.js:422 -#: htdocs/luci-static/resources/view/homeproxy/server.js:457 +#: htdocs/luci-static/resources/view/homeproxy/server.js:438 +#: htdocs/luci-static/resources/view/homeproxy/server.js:473 msgid "" "Specifies the time (in seconds) until idle clients should be closed with a " "GOAWAY frame. PING frames are not considered as activity." msgstr "" -"指定闲置客户端应在多长时间(单位:秒)内使用 GOAWAY 帧关闭。PING 帧不被视为活" -"动。" +"指定空闲客户端应在多久(单位:秒)内以 GOAWAY 帧关闭。PING 帧不计为活动。指定" +"闲置客户端应在多长时间(单位:秒)内使用 GOAWAY 帧关闭。PING 帧不被视为活动。" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1230 -#: htdocs/luci-static/resources/view/homeproxy/node.js:1286 +#: htdocs/luci-static/resources/view/homeproxy/node.js:839 +#: htdocs/luci-static/resources/view/homeproxy/node.js:895 msgid "" "Specifies the timeout duration (in seconds) after sending a PING frame, " "within which a response must be received.
If a response to the PING " "frame is not received within the specified timeout duration, the connection " "will be closed." msgstr "" -"指定发送 PING 帧后,在指定的超时时间(单位:秒)内必须接收到响应。
如果在" -"指定的超时时间内没有收到 PING 帧的响应,则连接将关闭。" +"指定发送 PING 帧后必须收到响应的时间(单位:秒)。
如果在指定时间内未收到" +"对 PING 帧的响应,连接将被关闭。指定发送 PING 帧后,在指定的超时时间(单位:" +"秒)内必须接收到响应。
如果在指定的超时时间内没有收到 PING 帧的响应,则连" +"接将关闭。" -#: htdocs/luci-static/resources/view/homeproxy/client.js:288 +#: htdocs/luci-static/resources/view/homeproxy/client.js:265 msgid "" "Specify target ports to be proxied. Multiple ports must be separated by " "commas." msgstr "指定需要被代理的目标端口。多个端口必须用逗号隔开。" -#: htdocs/luci-static/resources/view/homeproxy/node.js:987 -#: htdocs/luci-static/resources/view/homeproxy/server.js:278 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1301 +msgid "Speculative" +msgstr "抢先查询" + +#: htdocs/luci-static/resources/view/homeproxy/node.js:638 +msgid "Standard (default)" +msgstr "标准(默认)" + +#: htdocs/luci-static/resources/view/homeproxy/client.js:1010 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1751 +msgid "Store DNS cache" +msgstr "存储 DNS 缓存" + +#: htdocs/luci-static/resources/view/homeproxy/node.js:585 +#: htdocs/luci-static/resources/view/homeproxy/server.js:280 msgid "String" msgstr "字符串" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1755 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1408 msgid "Sub (%s)" msgstr "订阅(%s)" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1789 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1435 msgid "Subscription URL-s" msgstr "订阅地址" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1766 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1419 msgid "Subscriptions" msgstr "订阅" -#: htdocs/luci-static/resources/view/homeproxy/node.js:500 -msgid "Success" -msgstr "成功" - -#: htdocs/luci-static/resources/view/homeproxy/node.js:1706 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1359 msgid "Successfully imported %s nodes of total %s." msgstr "成功导入 %s 个节点,共 %s 个。" @@ -2505,469 +2694,504 @@ msgstr "成功导入 %s 个节点,共 %s 个。" msgid "Successfully updated." msgstr "更新成功。" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1666 -#: htdocs/luci-static/resources/view/homeproxy/node.js:1790 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1319 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1436 msgid "" "Support Hysteria, Shadowsocks, Trojan, v2rayN (VMess), and XTLS (VLESS) " "online configuration delivery standard." msgstr "" "支持 Hysteria、Shadowsocks、Trojan、v2rayN(VMess)和 XTLS(VLESS)在线配置交" -"付标准。" +"付标准。支持 Hysteria、Shadowsocks、Trojan、v2rayN(VMess)和 XTLS(VLESS)在" +"线配置交付标准。" -#: htdocs/luci-static/resources/view/homeproxy/client.js:205 +#: htdocs/luci-static/resources/view/homeproxy/client.js:180 msgid "" "Support UDP, TCP, DoH, DoQ, DoT. TCP protocol will be used if not specified." msgstr "支持 UDP、TCP、DoH、DoQ、DoT。如未指定则使用 TCP 协议。" -#: htdocs/luci-static/resources/view/homeproxy/client.js:336 +#: htdocs/luci-static/resources/view/homeproxy/client.js:362 msgid "System" msgstr "系统" -#: htdocs/luci-static/resources/view/homeproxy/client.js:406 -#: htdocs/luci-static/resources/view/homeproxy/client.js:458 -#: htdocs/luci-static/resources/view/homeproxy/client.js:780 -#: htdocs/luci-static/resources/view/homeproxy/client.js:911 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1019 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1185 +#: htdocs/luci-static/resources/view/homeproxy/client.js:431 +#: htdocs/luci-static/resources/view/homeproxy/client.js:483 +#: htdocs/luci-static/resources/view/homeproxy/client.js:824 +#: htdocs/luci-static/resources/view/homeproxy/client.js:975 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1089 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1252 msgid "System DNS" msgstr "系统 DNS" -#: htdocs/luci-static/resources/view/homeproxy/client.js:661 -#: htdocs/luci-static/resources/view/homeproxy/client.js:972 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1123 -#: htdocs/luci-static/resources/view/homeproxy/server.js:867 +#: htdocs/luci-static/resources/view/homeproxy/client.js:686 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1042 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1193 +#: htdocs/luci-static/resources/view/homeproxy/server.js:906 msgid "TCP" msgstr "TCP" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1591 -#: htdocs/luci-static/resources/view/homeproxy/server.js:845 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1247 +#: htdocs/luci-static/resources/view/homeproxy/server.js:884 msgid "TCP fast open" msgstr "TCP 快速打开" -#: htdocs/luci-static/resources/view/homeproxy/client.js:330 +#: htdocs/luci-static/resources/view/homeproxy/client.js:356 msgid "TCP/IP stack" msgstr "TCP/IP 协议栈" -#: htdocs/luci-static/resources/view/homeproxy/client.js:331 +#: htdocs/luci-static/resources/view/homeproxy/client.js:357 msgid "TCP/IP stack." msgstr "TCP/IP 协议栈。" -#: htdocs/luci-static/resources/view/homeproxy/client.js:648 -#: htdocs/luci-static/resources/view/homeproxy/client.js:973 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1136 -#: htdocs/luci-static/resources/view/homeproxy/node.js:1433 -#: htdocs/luci-static/resources/view/homeproxy/server.js:532 +#: htdocs/luci-static/resources/view/homeproxy/client.js:673 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1043 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1206 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1082 +#: htdocs/luci-static/resources/view/homeproxy/server.js:548 msgid "TLS" msgstr "TLS" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1465 -#: htdocs/luci-static/resources/view/homeproxy/server.js:565 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1114 +#: htdocs/luci-static/resources/view/homeproxy/server.js:581 msgid "TLS ALPN" msgstr "TLS ALPN" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1003 -#: htdocs/luci-static/resources/view/homeproxy/node.js:1460 -#: htdocs/luci-static/resources/view/homeproxy/server.js:560 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1073 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1109 +#: htdocs/luci-static/resources/view/homeproxy/server.js:576 msgid "TLS SNI" msgstr "TLS SNI" -#: htdocs/luci-static/resources/view/homeproxy/client.js:758 +#: htdocs/luci-static/resources/view/homeproxy/client.js:783 msgid "TLS fragment" msgstr "TLS 分片" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1217 -#: htdocs/luci-static/resources/view/homeproxy/server.js:413 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1152 +msgid "TLS handshake timeout in seconds. 15s is used by default." +msgstr "TLS 握手超时(秒)。默认 15 秒。" + +#: htdocs/luci-static/resources/view/homeproxy/node.js:826 +#: htdocs/luci-static/resources/view/homeproxy/server.js:429 msgid "TLS is not enforced. If TLS is not configured, plain HTTP 1.1 is used." msgstr "不强制执行 TLS。如未配置 TLS,将使用纯 HTTP 1.1。" -#: htdocs/luci-static/resources/view/homeproxy/client.js:752 -#: htdocs/luci-static/resources/view/homeproxy/client.js:760 +#: htdocs/luci-static/resources/view/homeproxy/client.js:777 +#: htdocs/luci-static/resources/view/homeproxy/client.js:785 msgid "TLS record fragment" msgstr "TLS 记录分片" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1012 -msgid "Used to resolve DNS server addresses in domain form. IP addresses do not require it." -msgstr "用于解析域名形式的DNS,如:https://dns.alidns.com/dns-query,数字形式则不需要如:https://223.5.5.5/dns-query" +#: htdocs/luci-static/resources/view/homeproxy/client.js:797 +msgid "TLS spoof SNI (1.14)" +msgstr "TLS spoof SNI(1.14)" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1051 +#: htdocs/luci-static/resources/view/homeproxy/client.js:804 +msgid "TLS spoof method (1.14)" +msgstr "TLS spoof 方式(1.14)" + +#: htdocs/luci-static/resources/view/homeproxy/client.js:317 +msgid "TUN DNS addresses (1.14)" +msgstr "TUN DNS 地址(1.14)" + +#: htdocs/luci-static/resources/view/homeproxy/client.js:306 +msgid "TUN DNS mode (1.14)" +msgstr "TUN DNS 模式(1.14)" + +#: htdocs/luci-static/resources/view/homeproxy/client.js:1082 +msgid "" +"Tag of a another server to resolve the domain name in the address. Required " +"if address contains domain." +msgstr "" +"用于解析地址中域名的另一个服务器的标签。如果地址包含域名,则必填。用于解析本 " +"DNS 服务器的域名的另一个 DNS 服务器的标签。如果服务器地址包括域名则必须。" + +#: htdocs/luci-static/resources/view/homeproxy/client.js:1121 msgid "Tag of an outbound for connecting to the dns server." msgstr "用于连接到 DNS 服务器的出站标签。" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1399 -msgid "Tag of the outbound to download rule set." -msgstr "用于下载规则集的出站标签。" - -#: htdocs/luci-static/resources/view/homeproxy/client.js:1179 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1246 msgid "Tag of the target dns server." msgstr "目标 DNS 服务器标签。" -#: htdocs/luci-static/resources/view/homeproxy/client.js:702 +#: htdocs/luci-static/resources/view/homeproxy/client.js:727 msgid "Tag of the target outbound." msgstr "目标出站标签。" -#: htdocs/luci-static/resources/view/homeproxy/server.js:327 +#: htdocs/luci-static/resources/view/homeproxy/server.js:318 msgid "" "Tell the client to use the BBR flow control algorithm instead of Hysteria CC." msgstr "让客户端使用 BBR 流控算法。" -#: htdocs/luci-static/resources/view/homeproxy/client.js:245 -msgid "Tencent Public DNS (DoH)" -msgstr "腾讯 公共DNS (DoH)" +#: htdocs/luci-static/resources/view/homeproxy/client.js:187 +#: htdocs/luci-static/resources/view/homeproxy/client.js:222 +msgid "Tencent Public DNS (119.29.29.29)" +msgstr "腾讯公共 DNS(119.29.29.29)" -#: htdocs/luci-static/resources/view/homeproxy/node.js:541 -#: htdocs/luci-static/resources/view/homeproxy/node.js:826 -msgid "Test" -msgstr "测试" - -#: htdocs/luci-static/resources/view/homeproxy/node.js:1924 -#: htdocs/luci-static/resources/view/homeproxy/node.js:1928 -msgid "Test Current List" -msgstr "测试当前列表" - -#: htdocs/luci-static/resources/view/homeproxy/client.js:533 +#: htdocs/luci-static/resources/view/homeproxy/client.js:558 msgid "Test URL" msgstr "测试 URL" -#: htdocs/luci-static/resources/view/homeproxy/client.js:163 -#: htdocs/luci-static/resources/view/homeproxy/client.js:192 -#: htdocs/luci-static/resources/view/homeproxy/client.js:553 +#: htdocs/luci-static/resources/view/homeproxy/client.js:138 +#: htdocs/luci-static/resources/view/homeproxy/client.js:167 +#: htdocs/luci-static/resources/view/homeproxy/client.js:578 msgid "Test interval" msgstr "测试间隔" -#: htdocs/luci-static/resources/view/homeproxy/client.js:561 +#: htdocs/luci-static/resources/view/homeproxy/client.js:586 msgid "Test interval must be less or equal than idle timeout." msgstr "测试间隔时间必须小于或等于空闲超时时间。" -#: htdocs/luci-static/resources/view/homeproxy/client.js:169 -#: htdocs/luci-static/resources/view/homeproxy/client.js:198 -#: htdocs/luci-static/resources/view/homeproxy/client.js:569 +#: htdocs/luci-static/resources/view/homeproxy/client.js:144 +#: htdocs/luci-static/resources/view/homeproxy/client.js:173 +#: htdocs/luci-static/resources/view/homeproxy/client.js:594 msgid "Test tolerance" msgstr "测试容差" -#: htdocs/luci-static/resources/view/homeproxy/node.js:498 -#: htdocs/luci-static/resources/view/homeproxy/node.js:541 -msgid "Testing" -msgstr "测试中" +#: htdocs/luci-static/resources/view/homeproxy/client.js:1334 +msgid "Text DNS records to match in the evaluated answer." +msgstr "用于匹配已评估 Answer 的文本 DNS 记录。" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1917 -msgid "Testing Current List..." -msgstr "当前列表测试中..." - -#: htdocs/luci-static/resources/view/homeproxy/server.js:628 +#: htdocs/luci-static/resources/view/homeproxy/server.js:667 msgid "The ACME CA provider to use." msgstr "使用的 ACME CA 颁发机构。" -#: htdocs/luci-static/resources/view/homeproxy/client.js:901 +#: htdocs/luci-static/resources/view/homeproxy/client.js:965 msgid "The DNS strategy for resolving the domain name in the address." msgstr "解析域名的默认策略。" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1030 -#: htdocs/luci-static/resources/view/homeproxy/server.js:308 -msgid "The QUIC connection-level flow control window for receiving data." -msgstr "用于接收数据的 QUIC 连接级流控制窗口。" - -#: htdocs/luci-static/resources/view/homeproxy/node.js:1024 -#: htdocs/luci-static/resources/view/homeproxy/server.js:301 -msgid "The QUIC stream-level flow control window for receiving data." -msgstr "用于接收数据的 QUIC 流级流控制窗口。" - -#: htdocs/luci-static/resources/view/homeproxy/client.js:534 +#: htdocs/luci-static/resources/view/homeproxy/client.js:559 msgid "The URL to test." msgstr "用于测试的 URL。" -#: htdocs/luci-static/resources/view/homeproxy/client.js:981 -msgid "Full URL, e.g. https://dns.alidns.com/dns-query" -msgstr "完整路径 如:https://dns.alidns.com/dns-query" +#: htdocs/luci-static/resources/view/homeproxy/client.js:1051 +msgid "The address of the dns server." +msgstr "DNS 服务器的地址。" -#: htdocs/luci-static/resources/view/homeproxy/server.js:679 +#: htdocs/luci-static/resources/view/homeproxy/server.js:718 msgid "" "The alternate port to use for the ACME HTTP challenge; if non-empty, this " "port will be used instead of 80 to spin up a listener for the HTTP challenge." msgstr "" -"用于 ACME HTTP 质询的备用端口;如果非空,将使用此端口而不是 80 来启动 HTTP 质" -"询的侦听器。" +"用于 ACME HTTP 挑战的备用端口;若不为空,将使用该端口(而非 80)启动 HTTP 挑" +"战监听。用于 ACME HTTP 质询的备用端口;如果非空,将使用此端口而不是 80 来启" +"动 HTTP 质询的侦听器。" -#: htdocs/luci-static/resources/view/homeproxy/server.js:685 +#: htdocs/luci-static/resources/view/homeproxy/server.js:724 msgid "" "The alternate port to use for the ACME TLS-ALPN challenge; the system must " "forward 443 to this port for challenge to succeed." msgstr "" -"用于 ACME TLS-ALPN 质询的备用端口; 系统必须将 443 转发到此端口以使质询成功。" +"用于 ACME TLS-ALPN 挑战的备用端口;系统必须将 443 转发到此端口,挑战才能成" +"功。用于 ACME TLS-ALPN 质询的备用端口; 系统必须将 443 转发到此端口以使质询成" +"功。" -#: htdocs/luci-static/resources/view/homeproxy/client.js -msgid "In default mode, rule fields are matched by category. Any condition in the same category can match, while different categories must match at the same time. Rule sets are merged into the rule for matching and are not treated as separate sub-rules." -msgstr "默认模式下,规则会按条件类别进行匹配。同一类别内任意条件命中即可,不同类别之间需要同时满足。规则集会合并到当前规则中参与匹配,不会作为独立子规则单独生效。" +#: htdocs/luci-static/resources/view/homeproxy/client.js:644 +msgid "" +"The default rule uses the following matching logic:
(domain || " +"domain_suffix || domain_keyword || domain_regex || ip_cidr || " +"ip_is_private) &&
(port || port_range) &&
(source_ip_cidr || source_ip_is_private) &&
(source_port || source_port_range) &&
other fields.
Additionally, included rule sets can be considered merged rather " +"than as a single rule sub-item." +msgstr "" +"默认规则使用以下匹配逻辑:
(domain || domain_suffix || " +"domain_keyword || domain_regex || ip_cidr || ip_is_private) &&
(port || port_range) &&
(source_ip_cidr || " +"source_ip_is_private) &&
(source_port || " +"source_port_range) &&
其他字段。
此外,包含的规则" +"集可视为合并项,而非单一规则的子项。默认规则使用以下匹配逻辑:
(domain || domain_suffix || domain_keyword || domain_regex || ip_cidr " +"|| ip_is_private) &&
(port || port_range) &&
(source_ip_cidr || source_ip_is_private) &&
(source_port || source_port_range) &&
其他字段。此外,包含的所有规则集会被合并而不是独立生效。" -#: htdocs/luci-static/resources/view/homeproxy/client.js:242 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1169 +msgid "" +"The default rule uses the following matching logic:
(domain || " +"domain_suffix || domain_keyword || domain_regex) &&
(port " +"|| port_range) &&
(source_ip_cidr || source_ip_is_private) &&
(source_port || source_port_range) &&
other fields.
Additionally, included rule sets can be " +"considered merged rather than as a single rule sub-item." +msgstr "" +"默认规则使用以下匹配逻辑:
(domain || domain_suffix || " +"domain_keyword || domain_regex) &&
(port || port_range) &&
(source_ip_cidr || source_ip_is_private) &&
(source_port || source_port_range) &&
其他字段。
此外,包含的规则集可视为合并项,而非单一规则的子项。默认规则使用" +"以下匹配逻辑:
(domain || domain_suffix || domain_keyword || " +"domain_regex) &&
(port || port_range) &&
(source_ip_cidr || source_ip_is_private) &&
(source_port || source_port_range) &&
其他字段。此外,包含的所有规则集会被合并而不是独立生效。" + +#: htdocs/luci-static/resources/view/homeproxy/client.js:218 msgid "" "The dns server for resolving China domains. Support UDP, TCP, DoH, DoQ, DoT." msgstr "用于解析国内域名的 DNS 服务器。支持 UDP、TCP、DoH、DoQ、DoT。" -#: htdocs/luci-static/resources/view/homeproxy/client.js:470 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1044 +#: htdocs/luci-static/resources/view/homeproxy/client.js:495 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1114 msgid "The domain strategy for resolving the domain name in the address." msgstr "用于解析本 DNS 服务器的域名的策略。" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1495 -#: htdocs/luci-static/resources/view/homeproxy/server.js:587 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1144 +#: htdocs/luci-static/resources/view/homeproxy/server.js:603 msgid "" "The elliptic curves that will be used in an ECDHE handshake, in preference " "order. If empty, the default will be used." msgstr "将在 ECDHE 握手中使用的椭圆曲线,按优先顺序排列。留空使用默认值。" -#: htdocs/luci-static/resources/view/homeproxy/server.js:613 +#: htdocs/luci-static/resources/view/homeproxy/server.js:629 msgid "" "The email address to use when creating or selecting an existing ACME server " "account." msgstr "创建或选择现有 ACME 服务器帐户时使用的电子邮件地址。" -#: htdocs/luci-static/resources/view/homeproxy/client.js:766 +#: htdocs/luci-static/resources/view/homeproxy/client.js:791 msgid "" "The fallback value in milliseconds used when TLS segmentation cannot " "automatically determine the wait time." msgstr "当 TLS 分段无法自动确定等待时间时使用的回退值(单位:毫秒)。" -#: htdocs/luci-static/resources/view/homeproxy/client.js:577 +#: htdocs/luci-static/resources/view/homeproxy/client.js:602 msgid "The idle timeout in seconds." msgstr "空闲超时时间(单位:秒)。" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1487 -#: htdocs/luci-static/resources/view/homeproxy/server.js:579 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1136 +#: htdocs/luci-static/resources/view/homeproxy/server.js:595 msgid "The maximum TLS version that is acceptable." msgstr "可接受的最高 TLS 版本。" -#: htdocs/luci-static/resources/view/homeproxy/server.js:315 -msgid "" -"The maximum number of QUIC concurrent bidirectional streams that a peer is " -"allowed to open." -msgstr "允许对等点打开的 QUIC 并发双向流的最大数量。" - -#: htdocs/luci-static/resources/view/homeproxy/server.js:740 +#: htdocs/luci-static/resources/view/homeproxy/server.js:779 msgid "The maximum time difference between the server and the client." msgstr "服务器和客户端之间的最大时间差。" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1479 -#: htdocs/luci-static/resources/view/homeproxy/server.js:571 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1128 +#: htdocs/luci-static/resources/view/homeproxy/server.js:587 msgid "The minimum TLS version that is acceptable." msgstr "可接受的最低 TLS 版本。" -#: htdocs/luci-static/resources/view/homeproxy/client.js:113 +#: htdocs/luci-static/resources/view/homeproxy/client.js:102 #: htdocs/luci-static/resources/view/homeproxy/server.js:130 -msgid "OpenWrt-designed Sing-box proxy management platform. It is recommended to disable Dnsmasq DNS redirection." -msgstr "Openwrt设计的Sing-box代理管理平台,建议Dnsmasq的DNS重定向去勾。" +msgid "The modern ImmortalWrt proxy platform for ARM64/AMD64." +msgstr "为 ARM64/AMD64 设计的现代 ImmortalWrt 代理平台。" -#: htdocs/luci-static/resources/view/homeproxy/client.js:477 -#: htdocs/luci-static/resources/view/homeproxy/server.js:875 +#: htdocs/luci-static/resources/view/homeproxy/client.js:502 +#: htdocs/luci-static/resources/view/homeproxy/server.js:914 msgid "The network interface to bind to." msgstr "绑定到的网络接口。" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1529 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1061 +msgid "The path of the DNS server." +msgstr "DNS 服务器的路径。" + +#: htdocs/luci-static/resources/view/homeproxy/node.js:1185 msgid "" "The path to the ECH config, in PEM format. If empty, load from DNS will be " "attempted." msgstr "PEM 格式的 ECH 配置路径。如果为空,将尝试从 DNS 加载。" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1508 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1164 msgid "The path to the server certificate, in PEM format." msgstr "服务端证书路径,需要 PEM 格式。" -#: htdocs/luci-static/resources/view/homeproxy/server.js:199 +#: htdocs/luci-static/resources/view/homeproxy/server.js:200 msgid "The port must be unique." msgstr "必须是唯一端口。" -#: htdocs/luci-static/resources/view/homeproxy/client.js:986 -msgid "Leave empty to use the default port." -msgstr "留空则表示使用默认端口。" +#: htdocs/luci-static/resources/view/homeproxy/client.js:1056 +msgid "The port of the DNS server." +msgstr "DNS 服务器的端口。" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1239 +#: htdocs/luci-static/resources/view/homeproxy/server.js:330 +msgid "The pre-shared key (password) above must be 12-255 bytes for v6." +msgstr "v6 下,上方的预共享密钥(密码)长度须为 12-255 字节。" + +#: htdocs/luci-static/resources/view/homeproxy/client.js:1360 msgid "The response code." msgstr "响应代码。" -#: htdocs/luci-static/resources/view/homeproxy/server.js:776 +#: htdocs/luci-static/resources/view/homeproxy/server.js:815 msgid "The server private key, in PEM format." msgstr "服务端私钥,需要 PEM 格式。" -#: htdocs/luci-static/resources/view/homeproxy/server.js:757 +#: htdocs/luci-static/resources/view/homeproxy/server.js:796 msgid "The server public key, in PEM format." msgstr "服务端公钥,需要 PEM 格式。" -#: htdocs/luci-static/resources/view/homeproxy/client.js:484 +#: htdocs/luci-static/resources/view/homeproxy/client.js:509 msgid "" "The tag of the upstream outbound.
Other dial fields will be ignored when " "enabled." msgstr "上游出站的标签。
启用时,其他拨号字段将被忽略。" -#: htdocs/luci-static/resources/view/homeproxy/client.js:164 -#: htdocs/luci-static/resources/view/homeproxy/client.js:193 -#: htdocs/luci-static/resources/view/homeproxy/client.js:554 +#: htdocs/luci-static/resources/view/homeproxy/client.js:139 +#: htdocs/luci-static/resources/view/homeproxy/client.js:168 +#: htdocs/luci-static/resources/view/homeproxy/client.js:579 msgid "The test interval in seconds." msgstr "测试间隔时间(单位:秒)。" -#: htdocs/luci-static/resources/view/homeproxy/client.js:170 -#: htdocs/luci-static/resources/view/homeproxy/client.js:199 -#: htdocs/luci-static/resources/view/homeproxy/client.js:570 +#: htdocs/luci-static/resources/view/homeproxy/client.js:145 +#: htdocs/luci-static/resources/view/homeproxy/client.js:174 +#: htdocs/luci-static/resources/view/homeproxy/client.js:595 msgid "The test tolerance in milliseconds." msgstr "测试容差时间(单位:毫秒)。" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1237 -#: htdocs/luci-static/resources/view/homeproxy/server.js:465 +#: htdocs/luci-static/resources/view/homeproxy/node.js:846 +#: htdocs/luci-static/resources/view/homeproxy/server.js:481 msgid "" "The timeout (in seconds) that after performing a keepalive check, the client " "will wait for activity. If no activity is detected, the connection will be " "closed." msgstr "" -"经过一段时间(单位:秒)之后,客户端将执行 keepalive 检查并等待活动。如果没有" -"检测到任何活动,则会关闭连接。" +"执行保活检查后,客户端等待活动的时间(单位:秒)。如果未检测到活动,连接将被" +"关闭。经过一段时间(单位:秒)之后,客户端将执行 keepalive 检查并等待活动。如" +"果没有检测到任何活动,则会关闭连接。" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1473 -#: htdocs/luci-static/resources/view/homeproxy/node.js:1825 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1122 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1471 msgid "" "This is DANGEROUS, your traffic is almost like " "PLAIN TEXT! Use at your own risk!" msgstr "" -"这是危险行为,您的流量将几乎等同于明文!使用风险自负!" +"这非常危险,你的流量几乎等同于明文!风险自" +"负!这是危险行为,您的流量将几乎等同于明文!使用风险自负!" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1147 +#: htdocs/luci-static/resources/view/homeproxy/node.js:756 msgid "" "This is the TUIC port of the UDP over TCP protocol, designed to provide a " "QUIC stream based UDP relay mode that TUIC does not provide." msgstr "" -"这是 TUIC 的 UDP over TCP 协议移植, 旨在提供 TUIC 不提供的基于 QUIC 流的 " -"UDP 中继模式。" +"这是 UDP over TCP 协议的 TUIC 版本,旨在提供 TUIC 本身不具备的基于 QUIC 流的 " +"UDP 中继模式。这是 TUIC 的 UDP over TCP 协议移植, 旨在提供 TUIC 不提供的基" +"于 QUIC 流的 UDP 中继模式。" -#: htdocs/luci-static/resources/view/homeproxy/client.js:244 -msgid "ThreatBook Public DNS (DoH)" -msgstr "微步 公共DNS (DoH)" +#: htdocs/luci-static/resources/view/homeproxy/client.js:188 +#: htdocs/luci-static/resources/view/homeproxy/client.js:223 +msgid "ThreatBook Public DNS (117.50.10.10)" +msgstr "微步在线公共 DNS(117.50.10.10)" -#: htdocs/luci-static/resources/view/homeproxy/node.js:502 -msgid "Timeout" -msgstr "超时" - -#: htdocs/luci-static/resources/view/homeproxy/client.js:746 +#: htdocs/luci-static/resources/view/homeproxy/client.js:771 msgid "" "Timeout for UDP connections.
Setting a larger value than the UDP timeout " "in inbounds will have no effect." msgstr "UDP 连接的超时时间。
设置比入站的 UDP 超时更大的值将无效。" -#: htdocs/luci-static/resources/view/homeproxy/client.js:941 -msgid "" -"Timeout of rejected DNS response cache in seconds. 604800 (7d) " -"is used by default." -msgstr "" -"被拒绝的 DNS 响应缓存超时时间(单位:秒)。默认为 604800(7 天)。" - -#: htdocs/luci-static/resources/view/homeproxy/server.js:491 +#: htdocs/luci-static/resources/view/homeproxy/server.js:507 msgid "" "To be compatible with Xray-core, set this to Sec-WebSocket-Protocol." msgstr "" -"要与 Xray-core 兼容,请将其设置为 Sec-WebSocket-Protocol。" +"要与 Xray-core 兼容,请将其设置为 Sec-WebSocket-Protocol。要与 " +"Xray-core 兼容,请将其设置为 Sec-WebSocket-Protocol。" -#: htdocs/luci-static/resources/view/homeproxy/client.js:315 +#: htdocs/luci-static/resources/view/homeproxy/client.js:292 msgid "" "To enable Tun support, you need to install ip-full and " "kmod-tun" msgstr "" -"要启用 Tun 支持,您需要安装 ip-full 和 kmod-tun。" +"要启用 Tun 支持,你需要安装 ip-full 和 kmod-tun。要" +"启用 Tun 支持,您需要安装 ip-full 和 kmod-tun。" #: htdocs/luci-static/resources/view/homeproxy/status.js:135 msgid "Trace" msgstr "跟踪" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1203 -#: htdocs/luci-static/resources/view/homeproxy/server.js:399 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1072 +#: htdocs/luci-static/resources/view/homeproxy/server.js:344 +msgid "Traffic shaping mode" +msgstr "流量整形模式" + +#: htdocs/luci-static/resources/view/homeproxy/node.js:812 +#: htdocs/luci-static/resources/view/homeproxy/server.js:415 msgid "Transport" msgstr "传输层" -#: htdocs/luci-static/resources/view/homeproxy/node.js:869 -#: htdocs/luci-static/resources/view/homeproxy/server.js:186 +#: htdocs/luci-static/resources/view/homeproxy/node.js:459 +#: htdocs/luci-static/resources/view/homeproxy/server.js:187 msgid "Trojan" msgstr "Trojan" -#: htdocs/luci-static/resources/view/homeproxy/node.js:871 -#: htdocs/luci-static/resources/view/homeproxy/server.js:188 +#: htdocs/luci-static/resources/view/homeproxy/node.js:461 +#: htdocs/luci-static/resources/view/homeproxy/server.js:189 msgid "Tuic" msgstr "Tuic" -#: htdocs/luci-static/resources/view/homeproxy/client.js:313 +#: htdocs/luci-static/resources/view/homeproxy/client.js:290 msgid "Tun TCP/UDP" msgstr "Tun TCP/UDP" -#: htdocs/luci-static/resources/view/homeproxy/client.js:970 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1357 -#: htdocs/luci-static/resources/view/homeproxy/node.js:857 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1040 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1496 +#: htdocs/luci-static/resources/view/homeproxy/node.js:447 #: htdocs/luci-static/resources/view/homeproxy/server.js:175 msgid "Type" msgstr "类型" -msgid "Type error" -msgstr "类型错误" - -msgid "TypeError" -msgstr "类型错误" - -msgid "Cannot convert null to object." -msgstr "无法将 null 转换为对象。" - -msgid "can't convert null to object" -msgstr "无法将 null 转换为对象" - -#: htdocs/luci-static/resources/view/homeproxy/client.js:662 -#: htdocs/luci-static/resources/view/homeproxy/client.js:971 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1124 -#: htdocs/luci-static/resources/view/homeproxy/server.js:868 +#: htdocs/luci-static/resources/view/homeproxy/client.js:687 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1041 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1194 +#: htdocs/luci-static/resources/view/homeproxy/server.js:907 msgid "UDP" msgstr "UDP" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1597 -#: htdocs/luci-static/resources/view/homeproxy/server.js:854 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1253 +#: htdocs/luci-static/resources/view/homeproxy/server.js:893 msgid "UDP Fragment" msgstr "UDP 分片" -#: htdocs/luci-static/resources/view/homeproxy/client.js:358 -#: htdocs/luci-static/resources/view/homeproxy/server.js:859 +#: htdocs/luci-static/resources/view/homeproxy/client.js:384 +#: htdocs/luci-static/resources/view/homeproxy/server.js:898 msgid "UDP NAT expiration time" msgstr "UDP NAT 过期时间" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1601 +#: htdocs/luci-static/resources/view/homeproxy/client.js:333 +msgid "UDP NAT filtering (1.14)" +msgstr "UDP NAT 过滤(1.14)" + +#: htdocs/luci-static/resources/view/homeproxy/client.js:322 +msgid "UDP NAT mapping (1.14)" +msgstr "UDP NAT 映射(1.14)" + +#: htdocs/luci-static/resources/view/homeproxy/client.js:344 +msgid "UDP NAT sessions max (1.14)" +msgstr "UDP NAT 会话数上限(1.14)" + +#: htdocs/luci-static/resources/view/homeproxy/node.js:1257 msgid "UDP over TCP" msgstr "UDP over TCP" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1146 +#: htdocs/luci-static/resources/view/homeproxy/node.js:755 msgid "UDP over stream" msgstr "UDP over stream" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1139 +#: htdocs/luci-static/resources/view/homeproxy/node.js:748 msgid "UDP packet relay mode." msgstr "UDP 包中继模式。" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1138 +#: htdocs/luci-static/resources/view/homeproxy/node.js:747 msgid "UDP relay mode" msgstr "UDP 中继模式" -#: htdocs/luci-static/resources/view/homeproxy/client.js:745 +#: htdocs/luci-static/resources/view/homeproxy/client.js:770 msgid "UDP timeout" msgstr "UDP 超时" -#: htdocs/luci-static/resources/view/homeproxy/client.js:149 -#: htdocs/luci-static/resources/view/homeproxy/client.js:178 -#: htdocs/luci-static/resources/view/homeproxy/client.js:444 +#: htdocs/luci-static/resources/view/homeproxy/client.js:124 +#: htdocs/luci-static/resources/view/homeproxy/client.js:153 +#: htdocs/luci-static/resources/view/homeproxy/client.js:469 msgid "URLTest" msgstr "URLTest" -#: htdocs/luci-static/resources/view/homeproxy/client.js:156 -#: htdocs/luci-static/resources/view/homeproxy/client.js:185 -#: htdocs/luci-static/resources/view/homeproxy/client.js:519 +#: htdocs/luci-static/resources/view/homeproxy/client.js:131 +#: htdocs/luci-static/resources/view/homeproxy/client.js:160 +#: htdocs/luci-static/resources/view/homeproxy/client.js:544 msgid "URLTest nodes" msgstr "URLTest 节点" -#: htdocs/luci-static/resources/view/homeproxy/client.js:130 -msgid "URLTest: %s" -msgstr "URLTest: %s" - -#: htdocs/luci-static/resources/view/homeproxy/node.js:1120 -#: htdocs/luci-static/resources/view/homeproxy/server.js:346 +#: htdocs/luci-static/resources/view/homeproxy/node.js:729 +#: htdocs/luci-static/resources/view/homeproxy/server.js:362 msgid "UUID" msgstr "UUID" @@ -2979,11 +3203,15 @@ msgstr "未知错误。" msgid "Unknown error: %s" msgstr "未知错误:%s" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1565 +#: htdocs/luci-static/resources/view/homeproxy/client.js:308 +msgid "Unset (default)" +msgstr "不设置(默认)" + +#: htdocs/luci-static/resources/view/homeproxy/node.js:1221 msgid "Unsupported fingerprint!" msgstr "不支持的指纹!" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1849 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1495 msgid "Update %s subscriptions" msgstr "更新 %s 个订阅" @@ -2991,137 +3219,109 @@ msgstr "更新 %s 个订阅" msgid "Update failed." msgstr "更新失败。" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1415 -msgid "Update time" -msgstr "更新时间" +#: htdocs/luci-static/resources/view/homeproxy/client.js:1579 +msgid "Update interval" +msgstr "更新间隔" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1416 -msgid "Update time (daily)" -msgstr "更新时间(每天)" +#: htdocs/luci-static/resources/view/homeproxy/client.js:1580 +msgid "Update interval of rule set." +msgstr "规则集更新间隔。" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1417 -msgid "Update time (weekly)" -msgstr "更新时间(每周)" - -#: htdocs/luci-static/resources/view/homeproxy/client.js:1418 -msgid "Every day" -msgstr "每天" - -#: htdocs/luci-static/resources/view/homeproxy/client.js:1419 -msgid "Every Monday" -msgstr "每周一" - -#: htdocs/luci-static/resources/view/homeproxy/client.js:1420 -msgid "Every Tuesday" -msgstr "每周二" - -#: htdocs/luci-static/resources/view/homeproxy/client.js:1421 -msgid "Every Wednesday" -msgstr "每周三" - -#: htdocs/luci-static/resources/view/homeproxy/client.js:1422 -msgid "Every Thursday" -msgstr "每周四" - -#: htdocs/luci-static/resources/view/homeproxy/client.js:1423 -msgid "Every Friday" -msgstr "每周五" - -#: htdocs/luci-static/resources/view/homeproxy/client.js:1424 -msgid "Every Saturday" -msgstr "每周六" - -#: htdocs/luci-static/resources/view/homeproxy/client.js:1425 -msgid "Every Sunday" -msgstr "每周日" - -#: htdocs/luci-static/resources/view/homeproxy/node.js:1844 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1490 msgid "Update nodes from subscriptions" msgstr "从订阅更新节点" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1779 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1432 msgid "Update subscriptions via proxy." msgstr "使用代理更新订阅。" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1778 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1425 +msgid "Update time" +msgstr "更新时间" + +#: htdocs/luci-static/resources/view/homeproxy/node.js:1431 msgid "Update via proxy" msgstr "使用代理更新" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1534 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1190 msgid "Upload ECH config" msgstr "上传 ECH 配置" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1425 -#: htdocs/luci-static/resources/view/homeproxy/server.js:523 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1034 +#: htdocs/luci-static/resources/view/homeproxy/server.js:539 msgid "Upload bandwidth" msgstr "上传带宽" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1426 -#: htdocs/luci-static/resources/view/homeproxy/server.js:524 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1035 +#: htdocs/luci-static/resources/view/homeproxy/server.js:540 msgid "Upload bandwidth in Mbps." msgstr "上传带宽(单位:Mbps)。" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1515 -#: htdocs/luci-static/resources/view/homeproxy/server.js:767 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1171 +#: htdocs/luci-static/resources/view/homeproxy/server.js:806 msgid "Upload certificate" msgstr "上传证书" -#: htdocs/luci-static/resources/view/homeproxy/server.js:786 +#: htdocs/luci-static/resources/view/homeproxy/server.js:825 msgid "Upload key" msgstr "上传密钥" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1518 -#: htdocs/luci-static/resources/view/homeproxy/node.js:1537 -#: htdocs/luci-static/resources/view/homeproxy/server.js:770 -#: htdocs/luci-static/resources/view/homeproxy/server.js:789 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1174 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1193 +#: htdocs/luci-static/resources/view/homeproxy/server.js:809 +#: htdocs/luci-static/resources/view/homeproxy/server.js:828 msgid "Upload..." msgstr "上传..." -#: htdocs/luci-static/resources/view/homeproxy/server.js:596 +#: htdocs/luci-static/resources/view/homeproxy/server.js:612 msgid "Use ACME TLS certificate issuer." msgstr "使用 ACME TLS 证书颁发机构。" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1461 -#: htdocs/luci-static/resources/view/homeproxy/server.js:561 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1110 +#: htdocs/luci-static/resources/view/homeproxy/server.js:577 msgid "" "Used to verify the hostname on the returned certificates unless insecure is " "given." msgstr "用于验证返回证书上的主机名。如允许不安全连接,此配置无效。" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1004 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1074 msgid "Used to verify the hostname on the returned certificates." msgstr "用于验证返回证书上的主机名。" -#: htdocs/luci-static/resources/view/homeproxy/client.js:665 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1138 +#: htdocs/luci-static/resources/view/homeproxy/client.js:690 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1208 msgid "User" msgstr "用户" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1819 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1050 +msgid "User key" +msgstr "用户密钥" + +#: htdocs/luci-static/resources/view/homeproxy/node.js:1465 msgid "User-Agent" msgstr "用户代理" -#: htdocs/luci-static/resources/view/homeproxy/node.js:888 -#: htdocs/luci-static/resources/view/homeproxy/server.js:203 +#: htdocs/luci-static/resources/view/homeproxy/node.js:478 +#: htdocs/luci-static/resources/view/homeproxy/server.js:204 msgid "Username" msgstr "用户名" -#: htdocs/luci-static/resources/view/homeproxy/node.js:874 -#: htdocs/luci-static/resources/view/homeproxy/server.js:189 +#: htdocs/luci-static/resources/view/homeproxy/node.js:464 +#: htdocs/luci-static/resources/view/homeproxy/server.js:190 msgid "VLESS" msgstr "VLESS" -#: htdocs/luci-static/resources/view/homeproxy/node.js:875 -#: htdocs/luci-static/resources/view/homeproxy/server.js:190 +#: htdocs/luci-static/resources/view/homeproxy/node.js:465 +#: htdocs/luci-static/resources/view/homeproxy/server.js:191 msgid "VMess" msgstr "VMess" -#: htdocs/luci-static/resources/view/homeproxy/client.js:206 -#: htdocs/luci-static/resources/view/homeproxy/client.js:243 +#: htdocs/luci-static/resources/view/homeproxy/client.js:181 +#: htdocs/luci-static/resources/view/homeproxy/client.js:219 msgid "WAN DNS (read from interface)" msgstr "WAN DNS(从接口获取)" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1487 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1651 msgid "WAN IP Policy" msgstr "WAN IP 策略" @@ -3129,37 +3329,44 @@ msgstr "WAN IP 策略" msgid "Warn" msgstr "警告" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1210 -#: htdocs/luci-static/resources/view/homeproxy/server.js:406 +#: htdocs/luci-static/resources/view/homeproxy/node.js:819 +#: htdocs/luci-static/resources/view/homeproxy/server.js:422 msgid "WebSocket" msgstr "WebSocket" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1810 +#: htdocs/luci-static/resources/view/homeproxy/client.js:302 +msgid "" +"When the main DNS returns a mainland China IP, re-resolve via China DNS " +"using evaluate/match_response." +msgstr "" +"当主 DNS 返回大陆 IP 时,通过 evaluate/match_response 改用国内 DNS 复解析。" + +#: htdocs/luci-static/resources/view/homeproxy/node.js:1456 msgid "Whitelist mode" msgstr "白名单模式" -#: htdocs/luci-static/resources/view/homeproxy/node.js:873 +#: htdocs/luci-static/resources/view/homeproxy/node.js:463 msgid "WireGuard" msgstr "WireGuard" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1342 +#: htdocs/luci-static/resources/view/homeproxy/node.js:951 msgid "WireGuard peer public key." msgstr "WireGuard 对端公钥。" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1349 +#: htdocs/luci-static/resources/view/homeproxy/node.js:958 msgid "WireGuard pre-shared key." msgstr "WireGuard 预共享密钥。" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1334 +#: htdocs/luci-static/resources/view/homeproxy/node.js:943 msgid "WireGuard requires base64-encoded private keys." msgstr "WireGuard 要求 base64 编码的私钥。" -#: htdocs/luci-static/resources/view/homeproxy/node.js:928 +#: htdocs/luci-static/resources/view/homeproxy/node.js:519 msgid "Write proxy protocol in the connection header." msgstr "在连接头中写入代理协议。" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1319 -#: htdocs/luci-static/resources/view/homeproxy/node.js:1832 +#: htdocs/luci-static/resources/view/homeproxy/node.js:928 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1478 msgid "Xudp (Xray-core)" msgstr "Xudp (Xray-core)" @@ -3167,23 +3374,25 @@ msgstr "Xudp (Xray-core)" msgid "Your %s was successfully uploaded. Size: %sB." msgstr "您的 %s 已成功上传。大小:%sB。" -#: htdocs/luci-static/resources/view/homeproxy/server.js:630 +#: htdocs/luci-static/resources/view/homeproxy/server.js:669 msgid "ZeroSSL" msgstr "ZeroSSL" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1520 -#: htdocs/luci-static/resources/view/homeproxy/server.js:772 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1176 +#: htdocs/luci-static/resources/view/homeproxy/server.js:811 msgid "certificate" msgstr "证书" -#: htdocs/luci-static/resources/view/homeproxy/client.js:739 +#: htdocs/luci-static/resources/view/homeproxy/client.js:764 msgid "connect UDP connections" msgstr "主动连接 UDP" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1480 -#: htdocs/luci-static/resources/view/homeproxy/node.js:1488 -#: htdocs/luci-static/resources/view/homeproxy/server.js:572 -#: htdocs/luci-static/resources/view/homeproxy/server.js:580 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1074 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1129 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1137 +#: htdocs/luci-static/resources/view/homeproxy/server.js:346 +#: htdocs/luci-static/resources/view/homeproxy/server.js:588 +#: htdocs/luci-static/resources/view/homeproxy/server.js:596 msgid "default" msgstr "默认" @@ -3191,52 +3400,51 @@ msgstr "默认" msgid "failed" msgstr "失败" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1206 -#: htdocs/luci-static/resources/view/homeproxy/server.js:402 +#: htdocs/luci-static/resources/view/homeproxy/node.js:815 +#: htdocs/luci-static/resources/view/homeproxy/server.js:418 msgid "gRPC" msgstr "gRPC" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1248 +#: htdocs/luci-static/resources/view/homeproxy/node.js:857 msgid "gRPC permit without stream" msgstr "gRPC 允许无活动连接" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1243 -#: htdocs/luci-static/resources/view/homeproxy/server.js:430 +#: htdocs/luci-static/resources/view/homeproxy/node.js:852 +#: htdocs/luci-static/resources/view/homeproxy/server.js:446 msgid "gRPC service name" msgstr "gRPC 服务名称" -#: htdocs/luci-static/resources/view/homeproxy/client.js:334 +#: htdocs/luci-static/resources/view/homeproxy/client.js:360 msgid "gVisor" msgstr "gVisor" -#: htdocs/luci-static/resources/homeproxy.js:306 -#: htdocs/luci-static/resources/homeproxy.js:326 -#: htdocs/luci-static/resources/view/homeproxy/client.js:219 -#: htdocs/luci-static/resources/view/homeproxy/client.js:253 -#: htdocs/luci-static/resources/view/homeproxy/client.js:527 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1380 -#: htdocs/luci-static/resources/view/homeproxy/node.js:918 -#: htdocs/luci-static/resources/view/homeproxy/node.js:1561 -#: htdocs/luci-static/resources/view/homeproxy/server.js:235 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1063 +#: htdocs/luci-static/resources/view/homeproxy/server.js:340 +msgid "http" +msgstr "" + +#: htdocs/luci-static/resources/homeproxy.js:307 +#: htdocs/luci-static/resources/homeproxy.js:327 +#: htdocs/luci-static/resources/view/homeproxy/client.js:195 +#: htdocs/luci-static/resources/view/homeproxy/client.js:230 +#: htdocs/luci-static/resources/view/homeproxy/client.js:552 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1519 +#: htdocs/luci-static/resources/view/homeproxy/node.js:509 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1217 +#: htdocs/luci-static/resources/view/homeproxy/server.js:237 msgid "non-empty value" msgstr "非空值" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1919 -msgid "The default rule set directory is /etc/homeproxy/ruleset/." -msgstr "规则集默认目录为 /etc/homeproxy/ruleset/。" - -#: htdocs/luci-static/resources/view/homeproxy/client.js:1975 -msgid "absolute path" -msgstr "绝对路径" - -#: htdocs/luci-static/resources/view/homeproxy/node.js:1061 -#: htdocs/luci-static/resources/view/homeproxy/node.js:1317 -#: htdocs/luci-static/resources/view/homeproxy/node.js:1830 +#: htdocs/luci-static/resources/view/homeproxy/node.js:670 +#: htdocs/luci-static/resources/view/homeproxy/node.js:926 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1062 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1476 +#: htdocs/luci-static/resources/view/homeproxy/server.js:339 msgid "none" msgstr "无" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1318 -#: htdocs/luci-static/resources/view/homeproxy/node.js:1831 +#: htdocs/luci-static/resources/view/homeproxy/node.js:927 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1477 msgid "packet addr (v2ray-core v5+)" msgstr "packet addr (v2ray-core v5+)" @@ -3244,11 +3452,11 @@ msgstr "packet addr (v2ray-core v5+)" msgid "passed" msgstr "通过" -#: htdocs/luci-static/resources/view/homeproxy/server.js:791 +#: htdocs/luci-static/resources/view/homeproxy/server.js:830 msgid "private key" msgstr "私钥" -#: htdocs/luci-static/resources/view/homeproxy/client.js:654 +#: htdocs/luci-static/resources/view/homeproxy/client.js:679 msgid "quic-go / uquic chrome" msgstr "quic-go / uquic chrome" @@ -3256,63 +3464,116 @@ msgstr "quic-go / uquic chrome" msgid "sing-box client" msgstr "sing-box 客户端" +#: htdocs/luci-static/resources/view/homeproxy/client.js:337 +msgid "" +"sing-box default; recommended for home use (accepts replies from any remote " +"after mapping). Choose stricter only for specific UDP issues." +msgstr "" +"sing-box 默认值,家用推荐(建映射后接受任意远端回包)。仅当遇到特定 UDP 问题" +"时才用更严格选项。" + +#: htdocs/luci-static/resources/view/homeproxy/client.js:326 +msgid "" +"sing-box default; recommended for home use (small NAT table, QUIC/game " +"friendly). Choose stricter only for specific UDP issues." +msgstr "" +"sing-box 默认值,家用推荐(NAT 表占用小,对游戏/QUIC 友好)。仅当遇到特定 " +"UDP 问题时才用更严格选项。" + +#: htdocs/luci-static/resources/view/homeproxy/node.js:1043 +msgid "" +"sing-box implements Snell v4/v5 wire as v4 and v6. The pre-shared key " +"(Password above) must be 12-255 bytes for v6." +msgstr "" +"sing-box 将 Snell v4/v5 线协议统一为 v4,另提供 v6;v6 的预共享密钥(上方密" +"码)长度须为 12-255 字节。" + #: htdocs/luci-static/resources/view/homeproxy/status.js:288 msgid "sing-box server" msgstr "sing-box 服务端" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1543 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1199 msgid "uTLS fingerprint" msgstr "uTLS 指纹" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1544 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1200 msgid "" "uTLS is a fork of \"crypto/tls\", which provides ClientHello fingerprinting " "resistance." msgstr "" -"uTLS 是 \"crypto/tls\" 的一个分支,拥有抵抗 ClientHello 指纹识别的能力。" +"uTLS 是 “crypto/tls” 的一个分支,可提供 ClientHello 指纹识别抵抗能力。uTLS " +"是 \"crypto/tls\" 的一个分支,拥有抵抗 ClientHello 指纹识别的能力。" #: htdocs/luci-static/resources/view/homeproxy/status.js:59 msgid "unchecked" msgstr "未检查" #: htdocs/luci-static/resources/homeproxy.js:237 -#: htdocs/luci-static/resources/view/homeproxy/node.js:1735 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1388 msgid "unique UCI identifier" msgstr "独立 UCI 标识" -#: htdocs/luci-static/resources/homeproxy.js:317 +#: htdocs/luci-static/resources/homeproxy.js:318 msgid "unique value" msgstr "独立值" -#: htdocs/luci-static/resources/view/homeproxy/node.js:930 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1076 +#: htdocs/luci-static/resources/view/homeproxy/server.js:348 +msgid "unsafe-raw" +msgstr "" + #: htdocs/luci-static/resources/view/homeproxy/node.js:1075 -#: htdocs/luci-static/resources/view/homeproxy/node.js:1608 +#: htdocs/luci-static/resources/view/homeproxy/server.js:347 +msgid "unshaped" +msgstr "" + +#: htdocs/luci-static/resources/view/homeproxy/node.js:521 +#: htdocs/luci-static/resources/view/homeproxy/node.js:684 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1264 msgid "v1" msgstr "v1" -#: htdocs/luci-static/resources/view/homeproxy/node.js:931 -#: htdocs/luci-static/resources/view/homeproxy/node.js:1076 -#: htdocs/luci-static/resources/view/homeproxy/node.js:1609 +#: htdocs/luci-static/resources/view/homeproxy/node.js:522 +#: htdocs/luci-static/resources/view/homeproxy/node.js:685 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1265 msgid "v2" msgstr "v2" -#: htdocs/luci-static/resources/view/homeproxy/node.js:1077 +#: htdocs/luci-static/resources/view/homeproxy/node.js:686 msgid "v3" msgstr "v3" -#: htdocs/luci-static/resources/view/homeproxy/client.js:231 -#: htdocs/luci-static/resources/view/homeproxy/client.js:235 -#: htdocs/luci-static/resources/view/homeproxy/client.js:264 -#: htdocs/luci-static/resources/view/homeproxy/client.js:268 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1044 +msgid "v4" +msgstr "" + +#: htdocs/luci-static/resources/view/homeproxy/server.js:331 +msgid "v5" +msgstr "" + +#: htdocs/luci-static/resources/view/homeproxy/node.js:1045 +#: htdocs/luci-static/resources/view/homeproxy/server.js:332 +msgid "v6" +msgstr "" + +#: htdocs/luci-static/resources/view/homeproxy/node.js:1073 +#: htdocs/luci-static/resources/view/homeproxy/server.js:345 +msgid "v6 only." +msgstr "仅 v6。" + +#: htdocs/luci-static/resources/view/homeproxy/client.js:207 +#: htdocs/luci-static/resources/view/homeproxy/client.js:211 +#: htdocs/luci-static/resources/view/homeproxy/client.js:241 +#: htdocs/luci-static/resources/view/homeproxy/client.js:245 msgid "valid DNS server address" msgstr "有效 DNS 服务器地址" -#: htdocs/luci-static/resources/view/homeproxy/client.js:541 -#: htdocs/luci-static/resources/view/homeproxy/client.js:544 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1385 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1388 -#: htdocs/luci-static/resources/view/homeproxy/node.js:1796 -#: htdocs/luci-static/resources/view/homeproxy/node.js:1799 +#: htdocs/luci-static/resources/view/homeproxy/client.js:566 +#: htdocs/luci-static/resources/view/homeproxy/client.js:569 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1527 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1530 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1442 +#: htdocs/luci-static/resources/view/homeproxy/node.js:1445 msgid "valid URL" msgstr "有效网址" @@ -3320,190 +3581,148 @@ msgstr "有效网址" msgid "valid base64 key with %d characters" msgstr "包含 %d 个字符的有效 base64 密钥" -#: htdocs/luci-static/resources/view/homeproxy/client.js:1530 -#: htdocs/luci-static/resources/view/homeproxy/client.js:1562 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1694 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1726 msgid "valid hostname" msgstr "有效主机名" -#: htdocs/luci-static/resources/homeproxy.js:297 +#: htdocs/luci-static/resources/homeproxy.js:298 msgid "valid port range (port1:port2)" msgstr "有效端口范围(port1:port2)" -#: htdocs/luci-static/resources/view/homeproxy/client.js:297 +#: htdocs/luci-static/resources/view/homeproxy/client.js:274 msgid "valid port value" msgstr "有效端口值" -#: htdocs/luci-static/resources/homeproxy.js:328 +#: htdocs/luci-static/resources/homeproxy.js:329 msgid "valid uuid" msgstr "有效 uuid" -#: htdocs/luci-static/resources/view/homeproxy/client.js -msgid "Panel Settings" -msgstr "面版设置" +#: htdocs/luci-static/resources/view/homeproxy/client.js:808 +msgid "wrong-ack" +msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js -msgid "UI path" -msgstr "UI 路径" +#: htdocs/luci-static/resources/view/homeproxy/client.js:807 +msgid "wrong-checksum" +msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js -msgid "UI download URL" -msgstr "UI 下载地址" +#: htdocs/luci-static/resources/view/homeproxy/client.js:809 +msgid "wrong-md5" +msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js -msgid "UI download detour" -msgstr "UI 下载节点" +#: htdocs/luci-static/resources/view/homeproxy/client.js:806 +msgid "wrong-sequence (default)" +msgstr "wrong-sequence(默认)" -#: htdocs/luci-static/resources/view/homeproxy/client.js -msgid "API listen" -msgstr "API 监听" +#: htdocs/luci-static/resources/view/homeproxy/client.js:810 +msgid "wrong-timestamp" +msgstr "" -#: htdocs/luci-static/resources/view/homeproxy/client.js -msgid "Use 0.0.0.0:port to open the panel from your browser." -msgstr "使用 0.0.0.0:端口 才能从浏览器打开面板。" +#: htdocs/luci-static/resources/view/homeproxy/client.js:1522 +#: htdocs/luci-static/resources/view/homeproxy/client.js:1570 +msgid "{tag} in URL when extra tags are used" +msgstr "使用额外标签时 URL 需包含 {tag}" -#: htdocs/luci-static/resources/view/homeproxy/client.js -msgid "API password" -msgstr "API 密码" +#: htdocs/luci-static/resources/view/homeproxy/client.js:1573 +msgid "{tag} in initial path when extra tags are used" +msgstr "使用额外标签时初始路径需包含 {tag}" -#: htdocs/luci-static/resources/view/homeproxy/client.js -msgid "Default mode" -msgstr "默认模式" +#~ msgid "Disable Path MTU discovery" +#~ msgstr "禁用路径 MTU 探测" -#: htdocs/luci-static/resources/view/homeproxy/client.js -msgid "NTP Settings" -msgstr "NTP 设置" +#~ msgid "" +#~ "Disables Path MTU Discovery (RFC 8899). Packets will then be at most 1252 " +#~ "(IPv4) / 1232 (IPv6) bytes in size." +#~ msgstr "" +#~ "禁用路径 MTU 发现(RFC 8899)。数据包将最多为 1252(IPv4)/ 1232(IPv6)字" +#~ "节。禁用路径 MTU 发现 (RFC 8899)。 数据包的大小最多为 1252 (IPv4) / 1232 " +#~ "(IPv6) 字节。" -#: htdocs/luci-static/resources/view/homeproxy/client.js -msgid "Enable NTP" -msgstr "启用 NTP" +#~ msgid "" +#~ "Leave empty to keep current behavior. hijack/native lets sing-box manage " +#~ "platform DNS; may overlap dnsmasq DNS hijack." +#~ msgstr "" +#~ "留空保持现有行为。hijack/native 让 sing-box 接管系统 DNS,可能与 dnsmasq " +#~ "的 DNS 劫持重叠。" -#: htdocs/luci-static/resources/view/homeproxy/client.js -msgid "NTP server address" -msgstr "NTP 服务地址" +#~ msgid "Match rule set." +#~ msgstr "匹配规则集。" -#: htdocs/luci-static/resources/view/homeproxy/client.js -msgid "NTP server port" -msgstr "NTP 服务端口" +#~ msgid "QUIC connection receive window" +#~ msgstr "QUIC 连接窗口" -#: htdocs/luci-static/resources/view/homeproxy/client.js -msgid "NTP time synchronization interval" -msgstr "NTP 时间同步间隔" +#~ msgid "QUIC maximum concurrent bidirectional streams" +#~ msgstr "QUIC 最大双向并发流" -#: htdocs/luci-static/resources/view/homeproxy/client.js -msgid "NTP service always uses direct connection and mainly provides accurate time for sing-box features that depend on it, such as TLS certificate verification, VMess, Reality/uTLS and other time-sensitive connection scenarios." -msgstr "NTP服务固定走直连,主要提供给Sing-box某些依赖准确时间的功能使用,如:TLS证书校验、VMess、Reality/uTLS等对时间敏感的连接场景。" +#~ msgid "QUIC stream receive window" +#~ msgstr "QUIC 流接收窗口" -#: htdocs/luci-static/resources/view/homeproxy/client.js -msgid "Time format examples: 1m = 1 minute, 1h = 1 hour, 1d = 1 day." -msgstr "时间格式示例:1m = 1分钟,1h = 1小时,1d = 1天。" +#~ msgid "Respond (1.14)" +#~ msgstr "Respond(1.14)" -#: htdocs/luci-static/resources/view/homeproxy/client.js -msgid "Cache Settings" -msgstr "缓存设置" +#~ msgid "The QUIC connection-level flow control window for receiving data." +#~ msgstr "用于接收数据的 QUIC 连接级流控制窗口。" -#: htdocs/luci-static/resources/view/homeproxy/client.js -msgid "Persistent Cache Settings" -msgstr "持久化缓存设置" +#~ msgid "The QUIC stream-level flow control window for receiving data." +#~ msgstr "用于接收数据的 QUIC 流级流控制窗口。" -#: htdocs/luci-static/resources/view/homeproxy/client.js -msgid "Enable cache" -msgstr "启用缓存" +#~ msgid "" +#~ "The maximum number of QUIC concurrent bidirectional streams that a peer " +#~ "is allowed to open." +#~ msgstr "允许对等点打开的 QUIC 并发双向流的最大数量。" -#: htdocs/luci-static/resources/view/homeproxy/client.js -msgid "Enable cache file" -msgstr "启用缓存文件" +#~ msgid "Accept empty query response" +#~ msgstr "接受空查询响应" -#: htdocs/luci-static/resources/view/homeproxy/client.js -msgid "Cache file path" -msgstr "缓存文件路径" +#~ msgid "Independent cache per server" +#~ msgstr "独立缓存" -#: htdocs/luci-static/resources/view/homeproxy/client.js -msgid "Persistent cache file path" -msgstr "持久化缓存文件路径" +#~ msgid "Make IP CIDR in rule-sets accept empty query response." +#~ msgstr "使规则集中的 IP CIDR 接受空查询响应。" -#: htdocs/luci-static/resources/view/homeproxy/client.js -msgid "Cache RDRC" -msgstr "缓存 RDRC" +#~ msgid "" +#~ "Make each DNS server's cache independent for special purposes. If " +#~ "enabled, will slightly degrade performance." +#~ msgstr "独立缓存每个 DNS 服务器的结果以供特殊用途。启用后会略微降低性能。" -#: htdocs/luci-static/resources/view/homeproxy/client.js -msgid "Persist RDRC cache" -msgstr "持久化 RDRC 缓存" +#~ msgid "" +#~ "Match IP CIDR with query response. Current rule will be skipped if not " +#~ "match." +#~ msgstr "使用查询响应匹配 IP CIDR。如果不匹配,则跳过当前规则。" -#: htdocs/luci-static/resources/view/homeproxy/client.js -msgid "Status" -msgstr "状态" +#~ msgid "Match private IP with query response." +#~ msgstr "使用查询响应匹配私有 IP。" -#: htdocs/luci-static/resources/view/homeproxy/client.js -msgid "Plugin Version" -msgstr "插件版本" +#~ msgid "Override destination" +#~ msgstr "覆盖目标地址" -#: htdocs/luci-static/resources/view/homeproxy/client.js -msgid "Core Version" -msgstr "核心版本" +#~ msgid "Override the connection destination address with the sniffed domain." +#~ msgstr "使用嗅探到的域名覆盖连接目标。" -#: htdocs/luci-static/resources/view/homeproxy/client.js -msgid "Core Status" -msgstr "核心状态" +#~ msgid "RDRC timeout" +#~ msgstr "RDRC 超时" -#: htdocs/luci-static/resources/view/homeproxy/client.js -msgid "Running" -msgstr "运行中" +#~ msgid "Set domain strategy for this query." +#~ msgstr "为此查询设置域名策略。" -#: htdocs/luci-static/resources/view/homeproxy/client.js -msgid "Running: %s" -msgstr "运行中:%s" +#~ msgid "Store RDRC" +#~ msgstr "存储 RDRC" -#: htdocs/luci-static/resources/view/homeproxy/client.js -msgid "Not Running" -msgstr "未运行" +#~ msgid "" +#~ "Store rejected DNS response cache.
The check results of Address " +#~ "filter DNS rule items will be cached until expiration." +#~ msgstr "" +#~ "存储被拒绝的 DNS 响应缓存。
Address filter DNS rule items 的检查结果将缓存至过期。存储被拒绝的 DNS 响应缓存。
地址过" +#~ "滤 DNS 规则 的检查结果将被缓存直到过期。" -#: htdocs/luci-static/resources/view/homeproxy/client.js -msgid "Reload Service" -msgstr "重载服务" +#~ msgid "Tag of the outbound to download rule set." +#~ msgstr "用于下载规则集的出站标签。" -#: htdocs/luci-static/resources/view/homeproxy/client.js -msgid "Restart Service" -msgstr "重启服务" - -#: htdocs/luci-static/resources/view/homeproxy/client.js -msgid "Update Panel" -msgstr "更新面版" - -#: htdocs/luci-static/resources/view/homeproxy/client.js -msgid "Update panel failed." -msgstr "更新面版失败" - -#: htdocs/luci-static/resources/view/homeproxy/client.js -msgid "Clash API unavailable." -msgstr "Clash API 不可用" - -#: htdocs/luci-static/resources/view/homeproxy/client.js -msgid "Open Panel" -msgstr "打开面版" - -#: htdocs/luci-static/resources/view/homeproxy/client.js -msgid "Upload Panel ZIP" -msgstr "上传面版ZIP" - -#~ msgid "Real Proxy" -#~ msgstr "Real Proxy" - -#~ msgid "HTTP3" -#~ msgstr "HTTP3" -msgid "Baidu Connection" -msgstr "百度连接" - -msgid "Google Connection" -msgstr "谷歌连接" - -msgid "GitHub Connection" -msgstr "GitHub 连接" - -msgid "YouTube Connection" -msgstr "YouTube 连接" - -msgid "Click to check" -msgstr "点我检测" - -msgid "Checking..." -msgstr "检测中..." +#~ msgid "" +#~ "Timeout of rejected DNS response cache in seconds. 604800 (7d) is used by default." +#~ msgstr "" +#~ "被拒绝的 DNS 响应缓存的超时时间(单位:秒)。默认使用 604800 (7d)。被拒绝的 DNS 响应缓存超时时间(单位:秒)。默认为 604800(7 " +#~ "天)。" diff --git a/luci-app-homeproxy/root/etc/config/homeproxy b/luci-app-homeproxy/root/etc/config/homeproxy index d6e62dc5f..b5838762c 100644 --- a/luci-app-homeproxy/root/etc/config/homeproxy +++ b/luci-app-homeproxy/root/etc/config/homeproxy @@ -8,7 +8,6 @@ config homeproxy 'infra' option dns_port '5333' option dns_redirect '1' option ntp_server 'nil' - option sniff_override '1' option udp_timeout '' option tun_name 'singtun0' option tun_addr4 '172.19.0.1/30' @@ -25,68 +24,61 @@ config homeproxy 'migration' config homeproxy 'config' option main_node 'nil' option main_udp_node 'same' - option dns_server 'https://dns.quad9.net/dns-query' - option china_dns_server 'https://dns.alidns.com/dns-query' + option dns_server '8.8.8.8' + option china_dns_server '223.5.5.5' option routing_mode 'bypass_mainland_china' option routing_port 'common' option proxy_mode 'redirect_tproxy' option ipv6_support '1' option github_token '' option log_level 'warn' + option cn_ip_fallback '0' + option tun_dns_mode '' + option udp_mapping '' + option udp_filtering '' + option udp_nat_max '' config homeproxy 'control' option lan_proxy_mode 'disabled' list wan_proxy_ipv4_ips '91.105.192.0/23' list wan_proxy_ipv4_ips '91.108.4.0/22' - list wan_proxy_ipv4_ips '91.108.8.0/21' - list wan_proxy_ipv4_ips '91.108.16.0/21' + list wan_proxy_ipv4_ips '91.108.8.0/22' + list wan_proxy_ipv4_ips '91.108.16.0/22' + list wan_proxy_ipv4_ips '91.108.12.0/22' + list wan_proxy_ipv4_ips '91.108.20.0/22' list wan_proxy_ipv4_ips '91.108.56.0/22' - list wan_proxy_ipv4_ips '95.161.64.0/20' list wan_proxy_ipv4_ips '149.154.160.0/20' list wan_proxy_ipv4_ips '185.76.151.0/24' + list wan_proxy_ipv4_ips '203.208.50.66/32' list wan_proxy_ipv6_ips '2001:67c:4e8::/48' - list wan_proxy_ipv6_ips '2001:b28:f23c::/47' + list wan_proxy_ipv6_ips '2001:b28:f23c::/48' + list wan_proxy_ipv6_ips '2001:b28:f23d::/48' list wan_proxy_ipv6_ips '2001:b28:f23f::/48' list wan_proxy_ipv6_ips '2a0a:f280::/32' -config homeproxy 'clash_api' - option external_ui '/etc/homeproxy/run/ui' - option external_ui_download_url 'https://gh-proxy.com/https://github.com/Zephyruso/zashboard/releases/latest/download/dist-cdn-fonts.zip' - option external_ui_download_detour 'direct-out' - option external_controller '0.0.0.0:9095' - option secret 'homeproxy' - option default_mode 'rule' - -config homeproxy 'ntp' - option enabled '1' - option server 'ntp.aliyun.com' - option server_port '123' - option interval '30m' - -config homeproxy 'cache' - option enabled '1' - option path '/etc/homeproxy/cache.db' - option store_rdrc '1' - config homeproxy 'routing' - option sniff_override '1' option default_outbound 'direct-out' option default_outbound_dns 'default-dns' + option find_neighbor '0' config homeproxy 'dns' - option dns_strategy 'prefer_ipv4' - option default_server 'local-dns' + option default_strategy 'prefer_ipv4' + option default_server 'default-dns' option disable_cache '0' option disable_cache_expire '0' + option optimistic_cache '0' + option optimistic_timeout '' + option dns_timeout '' + option cache_file_store_dns '0' config homeproxy 'subscription' option auto_update '0' option allow_insecure '0' - option latency_test_mode 'icmp' option packet_encoding 'xudp' option update_via_proxy '0' - option auto_update_time '0 0 * * *' - option filter_nodes 'disabled' + option filter_nodes 'blacklist' + list filter_keywords '重置|到期|过期|剩余|套餐' + list filter_keywords 'Expiration|Remaining' config homeproxy 'server' option enabled '0' diff --git a/luci-app-homeproxy/root/etc/homeproxy/resources/china_ip4.txt b/luci-app-homeproxy/root/etc/homeproxy/resources/china_ip4.txt index f48438506..f9b5b40d7 100644 --- a/luci-app-homeproxy/root/etc/homeproxy/resources/china_ip4.txt +++ b/luci-app-homeproxy/root/etc/homeproxy/resources/china_ip4.txt @@ -1,64 +1,36 @@ -1.0.1.0/24 -1.0.2.0/23 -1.0.8.0/21 -1.0.32.0/19 -1.1.0.0/24 -1.1.2.0/23 -1.1.4.0/22 -1.1.8.0/21 -1.1.16.0/20 -1.1.32.0/19 -1.2.0.0/23 -1.2.2.0/24 -1.2.4.0/22 -1.2.8.0/21 -1.2.16.0/20 -1.2.32.0/19 -1.2.64.0/18 -1.3.0.0/16 -1.4.1.0/24 -1.4.2.0/23 -1.4.4.0/22 -1.4.8.0/21 -1.4.16.0/20 -1.4.32.0/19 -1.4.64.0/18 -1.8.0.0/16 -1.10.0.0/21 -1.10.8.0/23 -1.10.11.0/24 -1.10.12.0/22 -1.10.16.0/20 -1.10.32.0/19 -1.10.64.0/18 +1.1.8.0/24 +1.2.4.0/24 +1.8.1.0/24 +1.8.8.0/24 1.12.0.0/14 +1.18.128.0/24 1.24.0.0/13 1.45.0.0/16 1.48.0.0/14 1.56.0.0/13 1.68.0.0/14 -1.80.0.0/12 +1.80.0.0/13 +1.88.0.0/14 +1.92.0.0/16 +1.94.0.0/15 1.116.0.0/15 -1.118.0.0/23 -1.118.4.0/22 -1.118.8.0/21 -1.118.16.0/20 -1.118.37.0/24 -1.118.38.0/23 -1.118.40.0/21 -1.118.56.0/21 -1.118.96.0/19 -1.118.128.0/17 -1.119.0.0/16 +1.119.0.0/17 +1.119.128.0/18 +1.119.192.0/20 +1.119.208.0/22 1.180.0.0/14 1.184.0.0/15 1.188.0.0/14 1.192.0.0/13 1.202.0.0/15 1.204.0.0/14 +2.56.255.0/24 +2.58.242.0/24 +2.59.151.0/24 5.10.138.0/23 5.10.140.0/24 5.10.143.0/24 +5.181.219.0/24 8.128.4.0/22 8.128.32.0/19 8.128.64.0/19 @@ -75,724 +47,395 @@ 8.148.64.0/18 8.148.128.0/17 8.149.0.0/16 -8.150.0.0/19 -8.150.32.0/21 +8.150.0.0/20 +8.150.16.0/21 8.150.64.0/23 8.152.0.0/13 8.160.0.0/15 -8.162.0.0/17 +8.162.0.0/18 +8.162.64.0/19 8.163.0.0/16 8.164.0.0/14 8.168.0.0/15 8.176.0.0/17 8.176.128.0/19 -14.0.0.0/21 -14.0.12.0/22 -14.1.0.0/22 -14.1.24.0/22 -14.1.108.0/22 14.16.0.0/12 -14.102.128.0/22 -14.102.180.0/22 14.103.0.0/16 14.104.0.0/13 14.112.0.0/12 -14.130.0.0/15 14.134.0.0/15 14.144.0.0/12 -14.192.60.0/22 -14.192.76.0/22 -14.196.0.0/15 14.204.0.0/15 14.208.0.0/12 +14.241.232.0/21 +14.255.16.0/24 +14.255.238.0/24 +14.255.254.0/24 16.2.142.0/23 -27.0.128.0/21 -27.0.160.0/21 -27.0.188.0/22 +23.162.120.0/24 +23.247.128.0/24 +23.247.130.0/24 +27.0.128.0/24 +27.0.130.0/23 +27.0.132.0/22 +27.0.164.0/22 27.0.204.0/22 27.0.208.0/21 27.8.0.0/13 27.16.0.0/12 -27.34.232.0/21 27.36.0.0/14 27.40.0.0/13 -27.50.40.0/21 27.50.128.0/17 -27.54.72.0/21 -27.54.152.0/21 -27.54.192.0/18 -27.98.208.0/20 27.98.224.0/19 -27.99.128.0/17 -27.103.0.0/16 -27.106.128.0/18 27.106.204.0/22 -27.109.32.0/19 27.109.124.0/22 -27.112.0.0/18 -27.112.80.0/20 -27.112.112.0/21 -27.113.128.0/18 +27.112.0.0/21 27.115.0.0/17 -27.116.44.0/22 -27.121.72.0/21 -27.121.120.0/21 27.128.0.0/15 -27.131.220.0/22 27.144.0.0/16 27.148.0.0/14 27.152.0.0/13 27.184.0.0/13 27.192.0.0/11 27.224.0.0/14 -36.0.0.0/22 -36.0.8.0/21 -36.0.16.0/20 -36.0.32.0/19 -36.0.64.0/18 -36.0.128.0/17 +31.40.214.0/24 36.1.0.0/16 36.4.0.0/14 36.16.0.0/12 36.32.0.0/14 36.36.0.0/16 -36.37.0.0/19 -36.37.36.0/23 -36.37.39.0/24 -36.37.40.0/21 -36.37.48.0/20 36.40.0.0/13 36.48.0.0/15 -36.50.226.0/23 -36.50.254.0/23 -36.51.0.0/16 +36.50.226.0/24 +36.51.253.0/24 36.56.0.0/13 -36.96.0.0/11 -36.128.0.0/13 -36.136.0.0/14 -36.140.0.0/17 -36.140.128.0/18 -36.140.192.0/20 -36.140.208.0/21 -36.140.216.0/23 -36.140.218.0/24 -36.140.220.0/22 -36.140.224.0/19 -36.141.0.0/16 -36.142.0.0/15 -36.144.0.0/12 -36.160.0.0/11 -36.192.0.0/11 +36.96.0.0/12 +36.112.0.0/15 +36.128.0.0/10 +36.192.0.0/16 +36.206.0.0/16 +36.212.0.0/15 +36.214.0.0/16 +36.221.0.0/17 36.248.0.0/14 -36.254.0.0/16 36.255.116.0/22 36.255.128.0/22 -36.255.164.0/22 -36.255.172.0/22 -36.255.176.0/22 -39.0.0.0/24 -39.0.2.0/23 -39.0.4.0/22 -39.0.8.0/21 -39.0.16.0/20 -39.0.32.0/19 -39.0.64.0/18 -39.0.128.0/17 +36.255.164.0/24 39.64.0.0/11 -39.96.0.0/16 -39.97.0.0/17 -39.97.128.0/18 -39.97.192.0/21 -39.97.200.0/22 -39.97.208.0/20 -39.97.224.0/19 -39.98.0.0/15 -39.100.0.0/14 +39.96.0.0/13 39.104.0.0/14 39.108.0.0/16 39.128.0.0/10 +40.0.176.0/20 +40.0.248.0/21 40.72.0.0/15 40.125.128.0/17 40.126.64.0/18 40.162.0.0/16 -42.0.0.0/22 -42.0.8.0/21 -42.0.16.0/21 -42.0.24.0/22 -42.0.32.0/19 -42.0.128.0/18 -42.0.192.0/21 -42.0.201.0/24 -42.0.202.0/23 -42.0.204.0/22 -42.0.208.0/20 -42.0.224.0/19 -42.1.0.0/19 -42.1.32.0/20 -42.1.48.0/21 -42.1.56.0/22 -42.1.128.0/17 +40.198.10.0/24 +40.198.16.0/21 +40.198.24.0/23 +40.251.225.0/24 +40.251.227.0/24 +40.251.228.0/24 42.4.0.0/14 -42.48.0.0/13 +42.48.0.0/15 +42.51.0.0/16 +42.52.0.0/14 42.56.0.0/14 42.62.0.0/17 -42.62.128.0/19 -42.62.160.0/20 -42.62.180.0/22 -42.62.184.0/21 42.63.0.0/16 42.80.0.0/15 -42.83.64.0/20 -42.83.80.0/22 -42.83.88.0/21 -42.83.96.0/19 -42.83.128.0/17 +42.83.128.0/22 +42.83.132.0/23 +42.83.134.0/24 +42.83.144.0/22 +42.83.189.0/24 +42.83.190.0/24 +42.83.200.0/23 42.84.0.0/14 42.88.0.0/13 -42.96.64.0/19 -42.96.96.0/21 -42.96.108.0/22 -42.96.112.0/20 42.96.128.0/17 42.97.0.0/16 42.99.0.0/18 -42.99.64.0/19 -42.99.96.0/20 -42.99.112.0/22 -42.99.120.0/21 42.100.0.0/14 42.120.0.0/15 42.122.0.0/16 -42.123.0.0/19 -42.123.36.0/22 -42.123.40.0/21 -42.123.48.0/20 42.123.64.0/18 -42.123.128.0/17 -42.128.0.0/12 -42.156.0.0/19 -42.156.36.0/22 -42.156.40.0/21 -42.156.48.0/20 -42.156.64.0/18 42.156.128.0/17 -42.157.0.0/16 +42.157.128.0/21 +42.157.160.0/19 +42.157.192.0/21 42.158.0.0/15 -42.160.0.0/12 42.176.0.0/13 42.184.0.0/15 42.186.0.0/16 -42.187.0.0/18 -42.187.64.0/19 -42.187.96.0/20 -42.187.112.0/21 42.187.120.0/22 42.187.128.0/17 -42.192.0.0/13 -42.201.0.0/17 +42.192.0.0/15 +42.194.12.0/24 +42.194.128.0/17 +42.199.240.0/22 +42.201.32.0/19 +42.201.64.0/21 +42.201.72.0/22 +42.201.76.0/23 42.202.0.0/15 -42.204.0.0/14 -42.208.0.0/12 42.224.0.0/12 -42.240.0.0/17 -42.240.128.0/18 -42.240.192.0/19 -42.240.224.0/20 -42.240.240.0/21 -42.240.248.0/23 +42.240.0.0/21 +42.240.8.0/22 +42.240.12.0/23 +42.240.16.0/23 +42.240.20.0/22 +42.240.48.0/24 +42.240.128.0/17 42.242.0.0/15 42.244.0.0/14 -42.248.0.0/13 +42.248.0.0/15 43.136.0.0/13 43.144.0.0/15 -43.148.0.0/14 -43.176.0.0/12 -43.192.0.0/14 -43.196.0.0/15 +43.176.0.0/14 +43.180.0.0/16 +43.192.0.0/16 +43.193.0.0/18 +43.193.64.0/23 +43.194.0.0/20 +43.194.16.0/24 +43.195.0.0/20 +43.195.16.0/22 +43.195.20.0/23 +43.196.0.0/16 43.224.12.0/22 43.224.24.0/22 -43.224.44.0/22 -43.224.52.0/22 +43.224.52.0/23 43.224.56.0/22 -43.224.68.0/22 -43.224.72.0/22 43.224.80.0/22 -43.224.100.0/22 -43.224.160.0/22 -43.224.176.0/22 -43.224.184.0/22 -43.224.200.0/21 -43.224.208.0/21 -43.224.216.0/22 -43.224.240.0/22 +43.224.240.0/24 43.225.76.0/22 -43.225.84.0/22 +43.225.84.0/23 43.225.120.0/22 43.225.180.0/22 43.225.208.0/22 -43.225.216.0/21 -43.225.224.0/20 -43.225.240.0/21 -43.225.252.0/22 +43.225.255.0/24 43.226.32.0/19 -43.226.64.0/19 -43.226.96.0/20 -43.226.112.0/21 -43.226.120.0/22 -43.226.128.0/18 -43.226.192.0/20 -43.226.208.0/21 +43.226.64.0/20 +43.226.116.0/22 +43.226.128.0/19 +43.226.164.0/22 43.226.236.0/22 -43.226.240.0/20 -43.227.0.0/21 -43.227.8.0/22 -43.227.32.0/19 -43.227.64.0/19 -43.227.96.0/21 +43.227.56.0/21 +43.227.64.0/21 +43.227.80.0/20 43.227.104.0/22 -43.227.136.0/21 -43.227.144.0/22 +43.227.140.0/22 43.227.152.0/21 43.227.160.0/20 43.227.176.0/21 -43.227.188.0/22 43.227.192.0/19 -43.227.232.0/22 -43.227.248.0/21 -43.228.0.0/18 +43.227.252.0/22 +43.228.0.0/19 +43.228.36.0/22 +43.228.40.0/21 +43.228.48.0/20 43.228.64.0/21 43.228.76.0/22 -43.228.100.0/22 -43.228.116.0/22 -43.228.120.0/22 -43.228.132.0/22 -43.228.136.0/22 -43.228.148.0/22 -43.228.152.0/22 -43.228.188.0/22 43.228.204.0/22 43.228.240.0/22 -43.229.40.0/22 43.229.48.0/22 -43.229.56.0/22 -43.229.96.0/22 -43.229.136.0/21 -43.229.144.0/22 -43.229.168.0/21 -43.229.176.0/20 -43.229.192.0/21 -43.229.216.0/21 -43.229.232.0/21 -43.230.20.0/22 -43.230.32.0/22 -43.230.68.0/22 +43.229.184.0/23 +43.229.216.0/22 43.230.72.0/22 -43.230.124.0/22 -43.230.220.0/22 -43.230.224.0/19 -43.231.32.0/20 -43.231.80.0/20 +43.230.221.0/24 +43.230.222.0/23 +43.231.41.0/24 +43.231.46.0/23 43.231.96.0/20 -43.231.136.0/21 43.231.144.0/20 -43.231.160.0/20 -43.231.176.0/21 -43.236.0.0/16 -43.237.0.0/17 -43.237.128.0/18 -43.237.192.0/22 -43.237.200.0/21 -43.237.208.0/20 -43.237.224.0/19 -43.238.0.0/16 -43.239.0.0/19 -43.239.32.0/20 -43.239.48.0/22 -43.239.116.0/22 +43.231.160.0/21 +43.231.168.0/23 +43.231.170.0/24 43.239.120.0/22 -43.239.172.0/22 -43.239.176.0/23 -43.239.179.0/24 +43.239.172.0/23 43.240.0.0/22 -43.240.56.0/21 -43.240.68.0/22 -43.240.72.0/21 -43.240.84.0/22 +43.240.60.0/22 +43.240.72.0/22 43.240.124.0/22 -43.240.128.0/21 +43.240.128.0/22 +43.240.133.0/24 43.240.136.0/22 43.240.156.0/22 -43.240.192.0/19 -43.240.240.0/20 -43.241.0.0/20 -43.241.16.0/21 -43.241.48.0/22 +43.240.192.0/21 +43.240.200.0/23 +43.240.202.0/24 +43.240.204.0/22 +43.240.220.0/22 +43.241.16.0/22 +43.241.48.0/24 +43.241.50.0/23 43.241.76.0/22 -43.241.80.0/20 -43.241.112.0/22 -43.241.168.0/21 -43.241.176.0/21 -43.241.184.0/22 +43.241.180.0/22 43.241.208.0/20 43.241.224.0/20 43.241.240.0/22 -43.241.248.0/22 -43.242.8.0/21 -43.242.16.0/20 -43.242.48.0/22 -43.242.53.0/24 -43.242.54.0/24 -43.242.56.0/21 -43.242.64.0/22 -43.242.72.0/21 -43.242.80.0/20 +43.242.72.0/22 +43.242.84.0/22 43.242.96.0/22 -43.242.144.0/20 -43.242.160.0/21 -43.242.168.0/22 +43.242.152.0/21 +43.242.164.0/22 43.242.180.0/22 -43.242.188.0/22 43.242.192.0/21 -43.242.204.0/22 -43.242.216.0/21 43.242.252.0/22 43.243.4.0/22 -43.243.8.0/21 +43.243.12.0/22 43.243.16.0/22 43.243.88.0/22 43.243.128.0/22 43.243.136.0/22 -43.243.144.0/21 +43.243.148.0/22 43.243.156.0/22 -43.243.180.0/22 43.243.228.0/22 43.243.232.0/22 43.243.244.0/22 -43.246.0.0/18 -43.246.64.0/19 -43.246.96.0/22 -43.246.112.0/24 -43.246.114.0/23 -43.246.228.0/22 -43.247.4.0/22 -43.247.8.0/22 -43.247.44.0/22 -43.247.48.0/22 +43.247.4.0/24 43.247.68.0/22 -43.247.76.0/22 43.247.84.0/22 -43.247.88.0/21 -43.247.96.0/21 -43.247.108.0/22 -43.247.112.0/22 -43.247.148.0/22 -43.247.152.0/22 +43.247.88.0/22 +43.247.100.0/22 43.247.176.0/20 43.247.196.0/22 -43.247.200.0/21 -43.247.208.0/20 -43.247.224.0/22 -43.247.232.0/21 -43.247.240.0/20 -43.248.0.0/21 -43.248.20.0/22 -43.248.28.0/22 +43.247.244.0/22 +43.247.248.0/22 +43.248.0.0/22 43.248.48.0/22 43.248.76.0/22 -43.248.80.0/20 -43.248.96.0/19 +43.248.96.0/21 +43.248.108.0/22 +43.248.112.0/21 43.248.128.0/20 -43.248.144.0/21 -43.248.176.0/20 43.248.192.0/20 -43.248.208.0/22 -43.248.228.0/22 43.248.232.0/22 43.248.244.0/22 -43.249.4.0/22 -43.249.120.0/22 -43.249.132.0/22 +43.249.0.0/23 +43.249.2.0/24 43.249.136.0/22 -43.249.144.0/20 -43.249.160.0/21 -43.249.168.0/22 +43.249.144.0/22 43.249.192.0/22 43.249.236.0/22 43.250.4.0/22 -43.250.12.0/22 -43.250.16.0/21 -43.250.28.0/22 -43.250.32.0/21 -43.250.96.0/21 -43.250.108.0/22 +43.250.32.0/22 +43.250.96.0/22 43.250.112.0/22 -43.250.128.0/22 -43.250.144.0/21 -43.250.160.0/22 +43.250.144.0/22 43.250.168.0/22 -43.250.176.0/22 -43.250.180.0/23 43.250.200.0/22 -43.250.212.0/22 -43.250.216.0/21 43.250.236.0/22 43.250.244.0/22 43.251.4.0/22 43.251.36.0/22 -43.251.118.0/23 -43.251.192.0/22 43.251.232.0/22 43.251.244.0/22 -43.252.48.0/22 -43.252.56.0/22 -43.254.0.0/21 +43.252.48.0/24 +43.254.0.0/22 43.254.8.0/22 43.254.24.0/22 -43.254.36.0/22 43.254.44.0/22 43.254.52.0/22 -43.254.72.0/22 -43.254.84.0/22 -43.254.88.0/21 +43.254.88.0/22 43.254.100.0/22 -43.254.104.0/22 -43.254.112.0/21 -43.254.128.0/22 -43.254.136.0/21 +43.254.104.0/23 +43.254.106.0/24 +43.254.116.0/22 +43.254.136.0/22 +43.254.140.0/23 43.254.144.0/20 43.254.168.0/21 -43.254.180.0/22 -43.254.184.0/21 -43.254.192.0/21 +43.254.192.0/22 43.254.200.0/22 -43.254.208.0/22 43.254.220.0/22 43.254.224.0/20 43.254.240.0/22 43.254.248.0/21 -43.255.0.0/21 -43.255.8.0/22 -43.255.48.0/22 -43.255.64.0/20 +43.255.0.0/22 +43.255.68.0/22 43.255.84.0/22 43.255.96.0/22 -43.255.144.0/22 -43.255.176.0/22 43.255.184.0/22 -43.255.192.0/22 -43.255.200.0/21 -43.255.208.0/21 -43.255.224.0/21 -43.255.232.0/22 -43.255.244.0/22 -44.30.120.0/24 +43.255.200.0/22 +43.255.212.0/22 +43.255.224.0/22 +45.12.88.0/24 +45.12.90.0/24 45.40.192.0/18 -45.65.16.0/20 -45.112.132.0/22 -45.112.188.0/22 -45.112.208.0/20 -45.112.228.0/22 -45.112.232.0/21 -45.113.12.0/22 -45.113.16.0/20 +45.61.200.0/23 +45.61.226.0/24 +45.65.20.0/22 +45.67.223.0/24 +45.81.34.0/24 +45.82.239.0/24 +45.112.232.0/22 +45.113.20.0/22 +45.113.24.0/22 45.113.40.0/22 -45.113.52.0/22 -45.113.56.0/22 -45.113.72.0/22 -45.113.144.0/21 -45.113.168.0/22 -45.113.176.0/22 -45.113.184.0/22 -45.113.200.0/21 -45.113.208.0/20 -45.113.240.0/22 -45.113.252.0/22 -45.114.0.0/22 -45.114.32.0/22 -45.114.40.0/22 -45.114.52.0/22 -45.114.96.0/22 -45.114.136.0/22 -45.114.196.0/22 -45.114.200.0/22 -45.114.228.0/22 -45.114.252.0/22 -45.115.18.0/23 +45.113.200.0/22 +45.113.206.0/24 45.115.44.0/22 -45.115.100.0/22 -45.115.120.0/22 -45.115.132.0/22 45.115.144.0/22 -45.115.156.0/22 45.115.164.0/22 45.115.200.0/22 -45.115.212.0/22 -45.115.244.0/22 -45.115.248.0/22 -45.116.16.0/22 -45.116.24.0/22 -45.116.32.0/21 +45.116.32.0/22 45.116.52.0/22 -45.116.96.0/21 +45.116.100.0/22 45.116.140.0/22 45.116.152.0/22 45.116.208.0/22 45.117.8.0/22 -45.117.20.0/22 45.117.68.0/22 -45.117.124.0/22 -45.117.252.0/22 45.119.60.0/22 -45.119.64.0/21 -45.119.72.0/22 -45.119.104.0/22 +45.119.68.0/22 +45.119.104.0/23 45.119.116.0/22 -45.119.232.0/22 45.120.100.0/22 -45.120.140.0/22 45.120.164.0/22 -45.120.240.0/22 -45.121.52.0/22 -45.121.64.0/21 -45.121.72.0/22 -45.121.92.0/22 -45.121.172.0/22 -45.121.176.0/22 -45.121.215.0/24 -45.121.240.0/20 -45.122.0.0/19 -45.122.32.0/21 -45.122.40.0/22 -45.122.60.0/22 -45.122.64.0/19 -45.122.96.0/20 -45.122.112.0/21 -45.122.160.0/19 -45.122.192.0/20 -45.122.208.0/21 -45.122.216.0/22 -45.123.28.0/22 -45.123.32.0/21 -45.123.44.0/22 -45.123.48.0/20 -45.123.64.0/20 -45.123.80.0/21 -45.123.88.0/22 -45.123.120.0/22 -45.123.128.0/21 -45.123.136.0/22 -45.123.148.0/22 -45.123.152.0/21 -45.123.164.0/22 +45.120.243.0/24 +45.123.117.0/24 +45.123.128.0/22 45.123.168.0/21 45.123.176.0/21 -45.123.184.0/22 -45.123.204.0/22 -45.123.212.0/22 -45.123.224.0/19 -45.124.0.0/22 45.124.20.0/22 -45.124.28.0/22 -45.124.32.0/21 45.124.68.0/22 45.124.76.0/22 45.124.80.0/22 -45.124.100.0/22 45.124.124.0/22 -45.124.172.0/22 -45.124.176.0/22 -45.124.208.0/22 -45.124.248.0/22 -45.125.24.0/22 +45.125.25.0/24 45.125.44.0/22 -45.125.52.0/22 45.125.56.0/22 -45.125.76.0/22 -45.125.80.0/20 -45.125.96.0/21 -45.125.136.0/22 -45.126.48.0/21 -45.126.100.0/22 -45.126.108.0/22 -45.126.112.0/21 +45.126.112.0/22 45.126.120.0/22 -45.126.212.0/22 -45.126.220.0/22 -45.127.8.0/21 -45.127.128.0/22 +45.127.129.0/24 45.127.144.0/21 -45.127.156.0/22 +45.150.236.0/23 45.248.8.0/22 -45.248.80.0/21 -45.248.96.0/20 -45.248.128.0/21 -45.248.204.0/22 -45.248.208.0/20 -45.248.224.0/19 -45.249.0.0/21 -45.249.12.0/22 -45.249.16.0/20 -45.249.32.0/21 -45.249.112.0/22 -45.249.188.0/22 -45.249.192.0/20 -45.249.208.0/21 -45.250.12.0/22 -45.250.16.0/22 -45.250.28.0/22 +45.248.108.0/23 +45.248.110.0/24 +45.249.212.0/22 45.250.32.0/21 45.250.40.0/22 -45.250.76.0/22 -45.250.80.0/20 -45.250.96.0/22 -45.250.104.0/21 -45.250.112.0/20 -45.250.128.0/20 -45.250.144.0/21 -45.250.152.0/22 -45.250.164.0/22 -45.250.180.0/22 -45.250.184.0/21 -45.250.192.0/22 -45.251.0.0/22 +45.250.152.0/23 +45.250.180.0/23 +45.250.184.0/22 +45.250.188.0/24 45.251.8.0/22 -45.251.16.0/21 -45.251.52.0/22 -45.251.84.0/22 +45.251.20.0/22 45.251.88.0/21 -45.251.96.0/21 -45.251.120.0/21 -45.251.140.0/22 -45.251.144.0/20 -45.251.160.0/19 -45.251.192.0/19 -45.251.224.0/22 -45.252.0.0/21 -45.252.9.0/24 -45.252.10.0/23 -45.252.12.0/22 -45.252.16.0/20 -45.252.32.0/20 -45.252.48.0/22 -45.252.88.0/21 -45.252.96.0/22 -45.252.104.0/21 -45.252.112.0/20 -45.252.128.0/20 -45.252.148.0/22 -45.252.152.0/21 -45.252.160.0/20 -45.252.176.0/22 -45.252.192.0/19 -45.252.224.0/21 -45.252.232.0/22 -45.253.0.0/18 -45.253.64.0/20 -45.253.80.0/21 -45.253.92.0/22 +45.251.100.0/22 +45.251.120.0/22 +45.252.0.0/22 +45.252.104.0/22 +45.253.24.0/22 +45.253.32.0/24 +45.253.60.0/22 45.253.96.0/20 45.253.112.0/21 -45.253.120.0/22 45.253.132.0/22 45.253.136.0/21 45.253.144.0/20 @@ -800,86 +443,88 @@ 45.253.192.0/19 45.253.224.0/20 45.253.240.0/22 -45.254.0.0/20 -45.254.16.0/21 -45.254.28.0/22 -45.254.40.0/22 -45.254.48.0/20 -45.254.64.0/18 -45.254.128.0/18 -45.254.192.0/19 -45.254.224.0/21 -45.254.236.0/22 -45.254.240.0/22 -45.254.248.0/22 -45.255.0.0/18 -45.255.64.0/19 -45.255.96.0/20 -45.255.112.0/21 -45.255.120.0/22 -45.255.136.0/21 -45.255.144.0/20 -45.255.160.0/19 -45.255.192.0/19 -45.255.224.0/20 -45.255.240.0/21 -45.255.248.0/22 +45.254.8.0/22 +45.254.20.0/22 +45.254.48.0/23 +45.254.50.0/24 +45.254.64.0/20 +45.255.152.0/22 47.92.0.0/14 -47.96.0.0/11 -49.4.0.0/17 +47.96.0.0/12 +47.112.0.0/13 +47.120.0.0/14 +49.4.0.0/18 +49.4.64.0/19 +49.4.96.0/21 +49.4.104.0/22 +49.4.108.0/23 +49.4.110.0/24 +49.4.112.0/21 +49.4.120.0/22 +49.4.124.0/23 +49.4.126.0/24 49.4.128.0/22 -49.4.160.0/20 -49.4.178.0/23 -49.4.180.0/22 -49.4.184.0/21 -49.4.192.0/18 -49.5.0.0/16 -49.6.0.0/15 -49.51.0.0/19 -49.51.54.0/23 -49.51.56.0/21 -49.51.88.0/21 -49.51.96.0/19 -49.51.226.0/23 +49.7.0.0/16 49.52.0.0/14 49.64.0.0/11 49.112.0.0/13 49.120.0.0/14 -49.128.0.0/24 -49.128.2.0/23 -49.128.4.0/22 49.140.0.0/15 -49.152.0.0/14 49.208.0.0/14 -49.213.60.0/23 -49.220.0.0/14 +49.221.26.0/23 +49.221.64.0/19 +49.221.128.0/19 49.232.0.0/14 -49.239.0.0/18 49.239.192.0/18 -49.246.224.0/23 -49.246.228.0/22 -49.246.232.0/23 -49.246.236.0/22 -49.246.240.0/20 -52.80.0.0/14 +50.114.187.0/24 +52.80.0.0/15 +52.82.0.0/17 +52.82.128.0/23 +52.82.131.0/24 +52.82.132.0/24 +52.82.134.0/23 +52.82.136.0/24 +52.82.144.0/23 +52.82.148.0/22 +52.82.160.0/21 +52.82.170.0/23 +52.82.172.0/22 +52.82.176.0/21 +52.82.184.0/23 +52.82.187.0/24 +52.82.188.0/23 +52.82.190.0/24 +52.82.192.0/18 +52.83.0.0/16 52.130.0.0/15 -54.222.0.0/15 -57.176.0.0/15 -58.14.0.0/21 -58.14.16.0/20 -58.14.32.0/19 -58.14.64.0/18 -58.14.128.0/17 -58.15.0.0/16 +54.222.0.0/19 +54.222.32.0/21 +54.222.45.0/24 +54.222.46.0/23 +54.222.48.0/21 +54.222.57.0/24 +54.222.60.0/22 +54.222.64.0/23 +54.222.70.0/23 +54.222.72.0/21 +54.222.80.0/21 +54.222.88.0/22 +54.222.96.0/23 +54.222.100.0/22 +54.222.104.0/21 +54.222.112.0/22 +54.222.116.0/23 +54.222.128.0/17 +54.223.0.0/16 58.16.0.0/13 58.24.0.0/15 58.30.0.0/15 58.32.0.0/11 -58.65.232.0/21 -58.66.0.0/15 -58.68.224.0/19 -58.82.0.0/17 -58.83.0.0/16 +58.67.128.0/17 +58.68.236.0/24 +58.68.247.0/24 +58.82.0.0/22 +58.83.128.0/17 58.87.64.0/18 58.99.128.0/17 58.100.0.0/15 @@ -889,94 +534,123 @@ 58.154.0.0/15 58.192.0.0/11 58.240.0.0/12 -59.32.0.0/11 +59.32.0.0/13 +59.40.0.0/15 +59.42.0.0/16 +59.44.0.0/14 +59.48.0.0/12 59.64.0.0/12 -59.80.0.0/15 -59.82.0.0/16 -59.83.0.0/17 -59.83.144.0/20 -59.83.160.0/20 +59.80.0.0/17 +59.81.8.0/23 +59.81.40.0/23 +59.81.46.0/24 +59.81.64.0/23 +59.81.82.0/23 +59.81.94.0/23 +59.81.102.0/23 +59.81.104.0/22 +59.82.0.0/17 +59.82.128.0/19 59.83.192.0/19 59.83.224.0/21 59.83.232.0/22 -59.107.0.0/16 -59.108.0.0/14 +59.107.0.0/17 +59.108.0.0/16 +59.110.0.0/16 +59.111.0.0/20 +59.111.17.0/24 +59.111.18.0/23 +59.111.21.0/24 +59.111.22.0/24 +59.111.24.0/21 +59.111.32.0/24 +59.111.35.0/24 +59.111.36.0/24 +59.111.40.0/21 +59.111.64.0/19 +59.111.96.0/21 +59.111.104.0/23 +59.111.107.0/24 +59.111.109.0/24 +59.111.111.0/24 +59.111.112.0/21 +59.111.128.0/20 +59.111.144.0/24 +59.111.152.0/21 +59.111.160.0/21 +59.111.168.0/22 +59.111.173.0/24 +59.111.175.0/24 +59.111.178.0/23 +59.111.181.0/24 +59.111.182.0/23 +59.111.190.0/24 +59.111.192.0/23 +59.111.198.0/23 +59.111.203.0/24 +59.111.205.0/24 +59.111.211.0/24 +59.111.214.0/24 +59.111.224.0/21 +59.111.232.0/23 +59.111.236.0/24 +59.111.238.0/23 +59.111.240.0/22 +59.111.244.0/24 +59.111.248.0/21 59.151.0.0/17 -59.152.16.0/20 -59.152.32.0/21 -59.152.64.0/20 -59.152.112.0/21 -59.153.4.0/22 +59.152.36.0/24 +59.152.38.0/23 +59.153.4.0/23 59.153.32.0/22 -59.153.60.0/22 -59.153.64.0/21 -59.153.72.0/22 59.153.92.0/22 -59.153.136.0/22 -59.153.152.0/22 59.153.164.0/22 -59.153.168.0/22 -59.153.173.0/24 -59.153.174.0/23 -59.153.176.0/20 -59.153.192.0/22 -59.155.0.0/16 +59.153.168.0/24 59.172.0.0/14 -59.191.0.0/17 -59.192.0.0/10 +59.252.0.0/16 60.0.0.0/11 -60.55.0.0/16 60.63.0.0/16 60.160.0.0/11 60.194.0.0/15 -60.200.0.0/13 +60.200.0.0/24 +60.204.0.0/14 60.208.0.0/12 -60.232.0.0/15 +60.232.0.0/16 60.235.0.0/16 60.245.128.0/17 60.247.0.0/16 60.252.0.0/16 60.253.128.0/17 60.255.0.0/16 -61.4.80.0/20 -61.4.176.0/20 -61.8.160.0/20 -61.14.212.0/22 -61.14.216.0/21 -61.14.240.0/21 -61.28.0.0/17 +61.4.80.0/23 +61.10.96.0/20 +61.10.128.0/20 +61.10.160.0/19 +61.15.0.0/18 +61.18.0.0/18 +61.18.64.0/19 +61.28.20.0/24 +61.28.22.0/24 +61.28.49.0/24 +61.28.108.0/24 +61.28.112.0/20 61.29.128.0/18 -61.29.192.0/19 -61.29.224.0/20 -61.29.251.0/24 -61.45.128.0/18 -61.45.224.0/20 61.47.128.0/18 61.48.0.0/13 61.87.192.0/18 -61.128.0.0/11 -61.160.0.0/12 -61.176.0.0/13 -61.184.0.0/15 -61.186.0.0/23 -61.186.3.0/24 -61.186.4.0/22 -61.186.8.0/21 -61.186.16.0/20 -61.186.32.0/19 -61.186.64.0/18 -61.186.128.0/17 -61.187.0.0/16 -61.188.0.0/14 +61.114.80.0/20 +61.128.0.0/10 61.232.0.0/14 -61.236.0.0/15 +61.237.0.0/16 61.240.0.0/14 62.234.0.0/16 63.140.0.0/24 63.140.3.0/24 +64.188.38.0/23 +64.188.40.0/22 +64.188.44.0/24 66.102.240.0/21 -66.102.248.0/23 -66.102.251.0/24 +66.102.248.0/22 66.102.252.0/24 66.102.254.0/23 68.79.0.0/18 @@ -991,2127 +665,934 @@ 71.132.0.0/18 71.136.64.0/18 71.137.0.0/18 -74.122.26.0/23 +72.163.240.0/23 +72.163.248.0/22 +74.114.51.0/24 +74.214.161.0/24 +77.73.8.0/24 +81.23.208.0/20 81.68.0.0/14 81.173.18.0/23 81.173.20.0/22 81.173.28.0/24 82.156.0.0/15 +87.232.115.0/24 +87.254.207.0/24 +93.183.14.0/24 +93.183.18.0/24 94.191.0.0/17 -101.0.0.0/22 101.1.0.0/22 101.2.172.0/22 101.4.0.0/14 101.16.0.0/12 101.33.128.0/17 101.34.0.0/15 -101.36.0.0/18 101.36.64.0/20 -101.36.82.0/23 -101.36.84.0/22 -101.36.88.0/21 101.36.128.0/17 101.37.0.0/16 -101.38.0.0/15 -101.40.0.0/14 -101.48.0.0/15 +101.39.0.0/16 +101.40.0.0/16 +101.42.0.0/15 +101.49.148.0/23 +101.49.206.0/23 +101.49.208.0/24 +101.49.212.0/24 101.50.8.0/21 101.50.56.0/22 -101.52.0.0/16 +101.52.4.0/24 +101.52.6.0/24 +101.52.68.0/23 +101.52.112.0/21 +101.52.124.0/22 +101.52.128.0/20 +101.52.204.0/22 +101.52.212.0/22 +101.52.216.0/21 +101.52.232.0/23 +101.52.236.0/22 +101.52.240.0/20 101.53.100.0/22 -101.54.0.0/16 -101.55.224.0/21 101.64.0.0/13 101.72.0.0/14 101.76.0.0/15 101.78.0.0/22 -101.78.32.0/19 101.80.0.0/12 -101.96.0.0/21 -101.96.8.0/22 -101.96.16.0/20 -101.96.128.0/17 -101.99.96.0/19 -101.101.64.0/19 -101.101.100.0/24 -101.101.102.0/23 -101.101.104.0/21 -101.101.112.0/20 -101.102.64.0/19 -101.102.100.0/23 -101.102.102.0/24 -101.102.104.0/21 -101.102.112.0/20 -101.104.0.0/14 -101.110.64.0/19 -101.110.96.0/20 -101.110.116.0/22 -101.110.120.0/21 -101.120.0.0/14 -101.124.0.0/15 -101.126.0.0/16 +101.96.10.0/23 +101.96.128.0/23 +101.96.130.0/24 +101.96.132.0/23 +101.96.134.0/24 +101.96.142.0/23 +101.96.144.0/20 +101.96.192.0/18 +101.104.144.0/20 +101.104.160.0/20 +101.106.0.0/19 +101.124.0.0/20 +101.124.19.0/24 +101.124.22.0/24 +101.124.62.0/24 +101.125.0.0/22 +101.125.4.0/23 +101.125.6.0/24 +101.125.130.0/24 +101.125.250.0/23 +101.125.252.0/22 +101.126.0.0/18 +101.126.64.0/19 +101.126.96.0/20 +101.126.128.0/19 +101.126.172.0/22 +101.126.176.0/20 +101.126.192.0/19 +101.126.228.0/22 +101.126.232.0/21 +101.126.240.0/20 101.128.0.0/22 -101.128.8.0/21 -101.128.16.0/20 -101.128.32.0/19 101.129.0.0/16 -101.130.0.0/15 -101.132.0.0/14 -101.144.0.0/12 -101.192.0.0/18 -101.192.68.0/22 -101.192.84.0/22 -101.192.88.0/21 -101.192.132.0/22 -101.192.164.0/22 -101.192.168.0/21 -101.192.176.0/20 -101.192.192.0/19 -101.193.0.0/18 -101.193.100.0/22 -101.193.108.0/22 -101.193.112.0/22 -101.193.120.0/21 -101.193.132.0/22 -101.193.164.0/22 -101.193.168.0/21 -101.193.176.0/20 -101.193.192.0/19 -101.194.0.0/15 -101.196.0.0/14 +101.132.0.0/15 +101.198.0.0/22 +101.198.4.0/24 +101.198.196.0/22 +101.199.48.0/20 +101.199.112.0/24 +101.199.128.0/23 +101.199.196.0/22 +101.199.252.0/22 101.200.0.0/15 -101.203.128.0/19 -101.203.160.0/21 101.203.172.0/22 -101.203.176.0/20 101.204.0.0/14 101.224.0.0/13 -101.232.0.0/17 -101.232.128.0/18 -101.232.200.0/21 -101.232.212.0/22 -101.232.220.0/22 -101.232.224.0/22 -101.232.232.0/21 -101.232.240.0/22 -101.233.0.0/16 -101.234.64.0/21 101.234.76.0/22 -101.234.80.0/20 -101.234.96.0/19 -101.236.0.0/16 -101.237.0.0/17 -101.237.128.0/18 -101.237.192.0/19 -101.237.224.0/22 -101.237.228.0/24 -101.237.230.0/23 -101.237.243.0/24 -101.237.244.0/23 -101.237.246.0/24 -101.237.250.0/24 -101.237.253.0/24 -101.238.0.0/15 -101.240.0.0/13 +101.236.0.0/18 +101.236.64.0/20 +101.236.128.0/17 +101.237.0.0/19 +101.237.33.0/24 +101.237.34.0/23 +101.237.36.0/22 +101.237.40.0/24 +101.237.128.0/20 +101.240.0.0/14 +101.245.0.0/17 +101.245.128.0/20 +101.245.144.0/22 +101.245.152.0/21 +101.245.160.0/20 +101.246.172.0/22 +101.246.176.0/20 101.248.0.0/15 101.251.0.0/22 -101.251.8.0/21 -101.251.16.0/20 -101.251.32.0/19 -101.251.64.0/18 -101.251.128.0/17 +101.251.80.0/20 +101.251.128.0/19 +101.251.160.0/20 +101.251.176.0/22 +101.251.192.0/18 101.252.0.0/15 -101.254.0.0/16 +101.254.0.0/20 +101.254.32.0/19 +101.254.64.0/18 +101.254.128.0/17 103.1.8.0/22 103.1.20.0/22 -103.1.24.0/22 -103.1.72.0/22 -103.1.88.0/22 103.1.168.0/22 103.2.108.0/22 -103.2.156.0/22 -103.2.164.0/22 -103.2.188.0/23 -103.2.200.0/21 -103.2.208.0/21 -103.3.84.0/22 -103.3.88.0/21 -103.3.96.0/19 -103.3.128.0/20 -103.3.148.0/22 +103.2.208.0/22 +103.3.96.0/22 +103.3.112.0/20 +103.3.128.0/22 +103.3.136.0/21 103.3.152.0/21 -103.4.56.0/22 -103.4.168.0/22 -103.4.184.0/22 -103.4.224.0/22 -103.5.36.0/22 -103.5.52.0/22 -103.5.56.0/22 -103.5.152.0/22 -103.5.168.0/22 +103.5.52.0/24 103.5.192.0/23 103.5.194.0/24 -103.5.252.0/22 -103.6.76.0/22 103.6.220.0/22 103.7.140.0/22 -103.7.212.0/22 -103.7.216.0/21 -103.8.0.0/21 -103.8.8.0/22 103.8.32.0/22 103.8.52.0/22 103.8.68.0/22 -103.8.108.0/22 -103.8.156.0/22 -103.8.200.0/21 103.8.220.0/22 103.9.8.0/22 -103.9.24.0/22 -103.9.108.0/22 -103.9.152.0/22 -103.9.248.0/21 +103.9.252.0/22 103.10.0.0/22 -103.10.16.0/22 103.10.84.0/22 -103.10.140.0/22 -103.11.16.0/22 -103.11.168.0/22 -103.11.180.0/22 -103.12.32.0/22 -103.12.92.0/22 103.12.98.0/23 -103.12.136.0/22 103.12.184.0/22 103.12.232.0/22 -103.13.12.0/22 -103.13.124.0/22 -103.13.196.0/22 103.13.244.0/22 -103.14.84.0/22 103.14.132.0/22 103.14.136.0/22 -103.14.156.0/22 -103.14.240.0/22 103.15.4.0/22 -103.15.8.0/22 -103.15.16.0/22 -103.15.96.0/22 -103.15.200.0/22 -103.16.52.0/22 -103.16.80.0/21 -103.16.88.0/22 -103.16.108.0/22 103.16.124.0/22 103.17.40.0/22 -103.17.64.0/22 -103.17.120.0/22 -103.17.136.0/22 -103.17.160.0/22 -103.17.204.0/22 103.17.228.0/22 -103.18.186.0/23 -103.18.192.0/22 -103.18.208.0/21 -103.18.224.0/22 -103.19.12.0/22 -103.19.40.0/21 -103.19.64.0/21 -103.19.72.0/22 +103.19.46.0/23 +103.19.64.0/22 103.19.232.0/22 -103.20.12.0/22 -103.20.32.0/24 -103.20.34.0/23 -103.20.46.0/24 -103.20.68.0/22 +103.20.32.0/22 103.20.112.0/22 103.20.128.0/22 103.20.160.0/22 103.20.248.0/22 -103.21.98.0/23 -103.21.102.0/23 -103.21.112.0/21 +103.21.116.0/22 103.21.140.0/22 103.21.176.0/22 -103.22.0.0/18 -103.22.64.0/19 -103.22.100.0/22 -103.22.104.0/21 -103.22.112.0/20 103.22.188.0/22 -103.22.228.0/22 103.22.252.0/22 103.23.8.0/22 -103.23.56.0/22 -103.23.160.0/21 -103.23.176.0/22 -103.23.228.0/22 -103.24.24.0/22 +103.23.160.0/22 103.24.116.0/22 -103.24.128.0/22 -103.24.144.0/22 103.24.176.0/22 -103.24.184.0/22 -103.24.220.0/22 103.24.228.0/22 -103.24.252.0/22 -103.25.9.0/24 +103.24.248.0/22 103.25.20.0/22 -103.25.24.0/21 -103.25.32.0/21 -103.25.40.0/22 -103.25.48.0/22 -103.25.64.0/21 -103.25.148.0/22 -103.25.156.0/22 -103.25.216.0/22 +103.25.24.0/22 +103.25.36.0/22 +103.25.64.0/23 +103.25.156.0/24 103.26.0.0/22 103.26.64.0/22 103.26.76.0/22 -103.26.132.0/22 -103.26.156.0/22 -103.26.160.0/22 -103.26.228.0/22 -103.26.240.0/22 103.27.4.0/22 -103.27.12.0/22 103.27.24.0/22 -103.27.56.0/22 -103.27.96.0/22 -103.27.212.0/22 103.27.240.0/22 -103.28.4.0/22 -103.28.8.0/22 -103.28.184.0/22 +103.28.8.0/24 +103.28.147.0/24 103.28.204.0/22 103.28.212.0/22 103.29.16.0/22 103.29.24.0/23 -103.29.128.0/21 103.29.136.0/22 -103.29.236.0/23 -103.30.20.0/22 -103.30.96.0/22 -103.30.104.0/22 -103.30.148.0/22 -103.30.228.0/22 -103.30.236.0/22 -103.31.0.0/22 -103.31.48.0/20 -103.31.64.0/21 -103.31.148.0/22 -103.31.160.0/22 -103.31.168.0/22 +103.30.51.0/24 +103.30.148.0/24 +103.30.151.0/24 +103.31.48.0/22 103.31.200.0/22 -103.31.242.0/23 -103.32.0.0/15 -103.34.0.0/16 -103.35.0.0/19 -103.35.32.0/20 -103.35.48.0/22 103.35.104.0/22 -103.35.117.0/24 -103.35.119.0/24 -103.35.180.0/23 -103.35.220.0/22 -103.36.28.0/22 +103.35.254.0/24 103.36.36.0/22 -103.36.56.0/21 -103.36.64.0/22 -103.36.72.0/22 +103.36.63.0/24 103.36.96.0/22 103.36.132.0/22 103.36.136.0/22 -103.36.160.0/20 -103.36.192.0/19 -103.36.224.0/20 -103.36.240.0/21 +103.36.165.0/24 +103.36.168.0/24 +103.36.172.0/22 +103.36.192.0/20 +103.36.208.0/22 +103.36.220.0/22 +103.37.4.0/24 103.37.12.0/22 -103.37.16.0/22 -103.37.24.0/22 -103.37.44.0/22 -103.37.52.0/22 -103.37.56.0/22 +103.37.18.0/23 +103.37.44.0/23 +103.37.46.0/24 103.37.72.0/22 103.37.100.0/22 -103.37.104.0/22 103.37.136.0/21 103.37.144.0/20 103.37.160.0/21 103.37.172.0/22 -103.37.176.0/22 -103.37.188.0/22 -103.37.208.0/20 -103.37.252.0/22 -103.38.0.0/22 -103.38.32.0/22 -103.38.40.0/21 -103.38.56.0/22 -103.38.76.0/22 -103.38.84.0/22 -103.38.92.0/22 -103.38.96.0/22 +103.38.40.0/22 +103.38.76.0/24 +103.38.92.0/23 103.38.116.0/22 -103.38.132.0/22 -103.38.140.0/22 -103.38.224.0/21 +103.38.224.0/22 103.38.232.0/22 103.38.252.0/23 103.39.64.0/22 -103.39.88.0/22 -103.39.100.0/22 -103.39.104.0/22 -103.39.160.0/19 103.39.200.0/21 103.39.208.0/20 103.39.224.0/21 103.39.232.0/22 103.40.12.0/22 -103.40.16.0/20 -103.40.32.0/20 -103.40.88.0/22 -103.40.158.0/23 103.40.173.0/24 103.40.174.0/23 103.40.192.0/22 -103.40.212.0/22 -103.40.220.0/22 -103.40.228.0/22 -103.40.232.0/21 +103.40.232.0/22 103.40.240.0/20 103.41.0.0/22 -103.41.52.0/22 103.41.116.0/22 -103.41.140.0/22 -103.41.148.0/22 -103.41.152.0/22 -103.41.160.0/21 -103.41.220.0/22 -103.41.224.0/21 -103.41.232.0/22 -103.42.8.0/22 -103.42.24.0/22 -103.42.32.0/22 -103.42.64.0/21 +103.41.164.0/22 +103.41.232.0/23 103.42.76.0/22 -103.42.232.0/22 -103.43.96.0/21 -103.43.104.0/22 -103.43.124.0/22 -103.43.132.0/22 -103.43.184.0/22 -103.43.192.0/21 -103.43.208.0/22 -103.43.220.0/22 -103.43.224.0/22 -103.43.240.0/22 -103.44.56.0/22 +103.43.134.0/23 +103.43.184.0/21 +103.43.240.0/23 +103.44.58.0/23 103.44.80.0/22 -103.44.120.0/21 103.44.144.0/22 103.44.168.0/22 -103.44.176.0/20 -103.44.192.0/22 -103.44.196.0/23 -103.44.199.0/24 -103.44.200.0/21 -103.44.224.0/22 103.44.236.0/22 103.44.240.0/20 -103.45.0.0/18 103.45.72.0/21 -103.45.80.0/20 -103.45.96.0/19 -103.45.128.0/18 -103.45.192.0/19 -103.45.224.0/22 +103.45.128.0/19 +103.45.160.0/22 +103.45.168.0/23 +103.45.172.0/22 +103.45.176.0/20 103.45.248.0/22 -103.46.0.0/22 103.46.12.0/22 103.46.16.0/20 103.46.32.0/19 103.46.64.0/18 103.46.128.0/21 103.46.136.0/22 -103.46.152.0/21 -103.46.160.0/20 -103.46.176.0/21 -103.46.244.0/22 -103.46.248.0/22 -103.47.4.0/22 -103.47.20.0/22 -103.47.36.0/22 -103.47.40.0/22 +103.46.168.0/22 103.47.48.0/22 103.47.80.0/22 -103.47.96.0/22 -103.47.108.0/22 -103.47.116.0/22 -103.47.120.0/22 -103.47.136.0/21 -103.47.212.0/22 -103.48.52.0/22 -103.48.92.0/22 -103.48.148.0/22 -103.48.152.0/21 -103.48.202.0/23 -103.48.216.0/21 -103.48.224.0/20 -103.48.240.0/21 103.49.12.0/22 -103.49.20.0/22 -103.49.72.0/21 -103.49.96.0/22 103.49.108.0/22 -103.49.176.0/21 -103.49.197.0/24 -103.50.36.0/22 -103.50.44.0/22 -103.50.48.0/20 -103.50.64.0/21 -103.50.72.0/22 -103.50.108.0/22 -103.50.112.0/20 -103.50.132.0/22 -103.50.136.0/21 -103.50.172.0/22 -103.50.176.0/20 -103.50.192.0/21 -103.50.200.0/22 -103.50.220.0/22 -103.50.224.0/20 -103.50.240.0/21 -103.50.248.0/22 -103.52.40.0/22 -103.52.72.0/21 -103.52.80.0/21 -103.52.96.0/21 -103.52.104.0/22 -103.52.160.0/21 +103.49.176.0/24 +103.50.91.0/24 +103.52.100.0/22 103.52.172.0/22 103.52.176.0/22 -103.52.184.0/22 103.52.196.0/22 -103.53.64.0/21 -103.53.92.0/22 -103.53.100.0/22 103.53.124.0/22 -103.53.128.0/20 -103.53.144.0/22 -103.53.180.0/22 -103.53.204.0/22 -103.53.208.0/21 -103.53.236.0/22 -103.53.248.0/22 -103.54.8.0/22 -103.54.48.0/22 -103.54.160.0/21 -103.54.212.0/22 -103.54.240.0/22 -103.55.80.0/22 -103.55.120.0/22 -103.55.152.0/22 +103.53.208.0/24 +103.53.211.0/24 103.55.172.0/22 -103.55.204.0/22 -103.55.208.0/22 103.55.228.0/22 -103.55.236.0/22 -103.56.20.0/22 -103.56.32.0/22 -103.56.56.0/21 -103.56.72.0/21 -103.56.94.0/23 +103.56.60.0/22 +103.56.76.0/22 103.56.100.0/22 103.56.104.0/22 -103.56.140.0/22 103.56.152.0/22 -103.56.184.0/22 -103.56.200.0/22 103.57.12.0/22 -103.57.52.0/22 -103.57.56.0/22 -103.57.76.0/22 -103.57.136.0/22 -103.57.196.0/22 -103.58.24.0/22 -103.59.76.0/22 -103.59.112.0/21 -103.59.120.0/23 +103.57.136.0/23 +103.57.139.0/24 +103.57.203.0/24 +103.59.112.0/22 103.59.124.0/22 -103.59.128.0/22 -103.59.148.0/22 -103.59.164.0/22 +103.59.148.0/23 +103.59.151.0/24 103.59.168.0/23 -103.60.44.0/22 +103.60.32.0/22 103.60.164.0/22 -103.60.228.0/22 +103.60.228.0/23 103.60.236.0/22 103.61.60.0/22 -103.61.104.0/22 -103.61.140.0/22 -103.61.152.0/21 -103.61.160.0/22 -103.61.172.0/22 -103.61.176.0/22 +103.61.104.0/23 +103.61.153.0/24 +103.61.154.0/23 103.61.188.0/22 -103.62.24.0/22 -103.62.53.0/24 -103.62.55.0/24 -103.62.72.0/21 -103.62.80.0/21 -103.62.88.0/22 -103.62.96.0/19 -103.62.128.0/21 -103.62.156.0/22 -103.62.160.0/19 -103.62.192.0/22 -103.62.204.0/22 -103.62.208.0/20 -103.62.224.0/22 -103.63.32.0/19 -103.63.64.0/20 -103.63.80.0/21 -103.63.88.0/22 -103.63.140.0/22 -103.63.144.0/22 -103.63.152.0/22 +103.62.88.0/23 103.63.160.0/20 103.63.176.0/21 -103.63.184.0/22 -103.63.192.0/20 -103.63.208.0/22 -103.63.240.0/20 -103.64.0.0/21 +103.63.244.0/22 103.64.24.0/21 -103.64.32.0/19 -103.64.64.0/18 103.64.140.0/22 103.64.144.0/22 103.64.152.0/21 -103.64.160.0/19 -103.64.192.0/18 -103.65.0.0/20 -103.65.16.0/22 -103.65.48.0/20 -103.65.64.0/19 -103.65.100.0/22 -103.65.104.0/21 -103.65.112.0/22 -103.65.144.0/20 -103.65.160.0/20 -103.65.204.0/22 +103.64.208.0/21 +103.65.8.0/22 103.65.224.0/23 103.66.32.0/22 -103.66.40.0/22 -103.66.108.0/22 -103.66.200.0/22 -103.66.240.0/20 -103.67.0.0/21 -103.67.8.0/22 -103.67.100.0/22 -103.67.104.0/21 -103.67.112.0/20 -103.67.128.0/20 -103.67.144.0/21 -103.67.172.0/22 -103.67.192.0/22 -103.67.212.0/22 -103.67.252.0/22 -103.68.64.0/22 -103.68.88.0/22 -103.68.100.0/22 103.68.128.0/22 103.69.16.0/22 -103.69.62.0/23 103.70.8.0/22 -103.70.14.0/23 -103.70.148.0/22 -103.70.224.0/23 -103.70.227.0/24 -103.70.236.0/22 -103.70.252.0/22 -103.71.0.0/22 103.71.68.0/22 -103.71.72.0/22 -103.71.80.0/21 -103.71.88.0/22 -103.71.120.0/21 -103.71.128.0/22 -103.71.144.0/22 -103.71.196.0/22 -103.71.200.0/22 +103.71.200.0/23 +103.71.202.0/24 103.71.232.0/22 -103.72.12.0/22 -103.72.16.0/20 -103.72.32.0/20 -103.72.48.0/21 -103.72.112.0/21 -103.72.124.0/22 -103.72.128.0/21 -103.72.172.0/22 -103.72.180.0/22 -103.72.224.0/21 -103.72.233.0/24 -103.72.234.0/23 -103.72.236.0/22 -103.72.240.0/20 -103.73.0.0/19 -103.73.48.0/22 +103.72.113.0/24 +103.72.172.0/24 +103.73.48.0/24 103.73.116.0/22 -103.73.120.0/22 -103.73.128.0/20 +103.73.136.0/21 103.73.144.0/22 -103.73.168.0/22 -103.73.176.0/22 103.73.204.0/22 -103.73.208.0/22 -103.73.244.0/22 -103.73.248.0/22 103.74.24.0/21 -103.74.32.0/20 103.74.48.0/22 -103.74.56.0/21 103.74.80.0/22 -103.74.148.0/22 -103.74.152.0/21 -103.74.204.0/22 -103.74.232.0/22 -103.75.82.0/23 -103.75.88.0/21 -103.75.104.0/21 -103.75.112.0/22 -103.75.120.0/22 -103.75.128.0/22 -103.75.144.0/22 +103.75.104.0/22 103.75.152.0/22 103.76.60.0/22 -103.76.64.0/21 -103.76.72.0/22 -103.76.92.0/22 -103.76.216.0/21 +103.76.220.0/22 103.76.224.0/22 103.77.28.0/22 -103.77.52.0/22 -103.77.56.0/22 -103.77.88.0/22 103.77.132.0/22 -103.77.148.0/22 -103.77.220.0/22 -103.78.56.0/21 -103.78.64.0/21 -103.78.124.0/22 -103.78.172.0/22 -103.78.176.0/22 -103.78.196.0/22 +103.78.60.0/22 +103.78.126.0/23 103.78.228.0/22 -103.79.24.0/21 -103.79.36.0/22 -103.79.40.0/21 -103.79.56.0/21 -103.79.64.0/21 -103.79.80.0/21 -103.79.136.0/22 -103.79.188.0/22 -103.79.192.0/20 -103.79.208.0/21 +103.79.24.0/22 +103.79.200.0/22 103.79.228.0/23 -103.80.44.0/22 -103.80.72.0/22 -103.80.176.0/21 -103.80.184.0/22 -103.80.192.0/22 -103.80.200.0/22 -103.80.232.0/22 103.81.4.0/22 -103.81.8.0/22 -103.81.16.0/21 -103.81.44.0/22 103.81.48.0/22 -103.81.96.0/22 -103.81.120.0/22 -103.81.148.0/22 -103.81.164.0/22 -103.81.184.0/23 +103.81.72.0/22 +103.81.123.0/24 103.81.200.0/22 -103.81.232.0/22 -103.82.60.0/22 -103.82.68.0/22 -103.82.84.0/22 -103.82.104.0/22 103.82.224.0/22 -103.82.236.0/22 103.83.44.0/22 -103.83.52.0/22 -103.83.60.0/22 103.83.64.0/22 103.83.72.0/22 -103.83.112.0/22 -103.84.0.0/22 -103.84.12.0/22 -103.84.16.0/20 -103.84.48.0/22 -103.84.64.0/22 -103.84.72.0/22 -103.84.170.0/23 -103.85.44.0/22 -103.85.48.0/22 103.85.84.0/22 -103.85.136.0/22 -103.85.144.0/22 +103.85.147.0/24 103.85.164.0/22 103.85.168.0/21 103.85.176.0/22 -103.85.186.0/23 -103.86.28.0/22 -103.86.32.0/22 -103.86.60.0/22 -103.86.204.0/22 -103.86.208.0/20 -103.86.224.0/19 -103.87.0.0/21 -103.87.20.0/22 -103.87.32.0/22 -103.87.96.0/22 -103.87.132.0/22 103.87.180.0/22 -103.87.224.0/22 -103.88.4.0/22 -103.88.8.0/21 -103.88.16.0/21 103.88.32.0/21 -103.88.60.0/22 103.88.64.0/22 -103.88.72.0/22 103.88.96.0/22 -103.88.164.0/22 -103.88.212.0/22 -103.89.28.0/22 -103.89.96.0/20 -103.89.112.0/21 -103.89.148.0/22 -103.89.172.0/22 103.89.184.0/21 103.89.192.0/19 103.89.224.0/21 -103.90.52.0/22 103.90.56.0/23 103.90.92.0/22 -103.90.100.0/22 -103.90.104.0/21 -103.90.112.0/20 -103.90.128.0/21 103.90.152.0/22 -103.90.168.0/22 103.90.176.0/22 103.90.188.0/22 -103.90.192.0/22 -103.91.36.0/22 -103.91.40.0/22 -103.91.108.0/22 -103.91.112.0/23 -103.91.138.0/23 -103.91.152.0/22 103.91.176.0/22 -103.91.200.0/22 -103.91.208.0/21 -103.91.236.0/22 -103.91.252.0/22 -103.92.0.0/20 -103.92.48.0/20 -103.92.64.0/20 -103.92.80.0/22 -103.92.86.0/24 +103.91.208.0/22 103.92.88.0/22 -103.92.108.0/22 -103.92.124.0/22 -103.92.132.0/22 -103.92.156.0/22 -103.92.164.0/22 -103.92.168.0/21 -103.92.176.0/20 -103.92.192.0/22 -103.92.236.0/22 -103.92.240.0/20 -103.93.0.0/21 -103.93.28.0/22 -103.93.84.0/22 -103.93.142.0/23 -103.93.152.0/22 103.93.180.0/22 103.93.204.0/22 103.94.12.0/22 -103.94.20.0/22 -103.94.32.0/20 -103.94.72.0/22 -103.94.88.0/22 -103.94.116.0/22 -103.94.160.0/22 103.94.200.0/22 -103.95.52.0/22 103.95.68.0/22 -103.95.88.0/21 -103.95.128.0/22 -103.95.136.0/21 -103.95.144.0/22 -103.95.152.0/22 -103.95.216.0/21 -103.95.236.0/22 -103.95.240.0/20 +103.95.252.0/22 103.96.8.0/22 -103.96.124.0/22 -103.96.136.0/22 -103.96.152.0/21 -103.96.160.0/19 -103.96.192.0/20 -103.96.208.0/21 -103.96.216.0/22 +103.96.148.0/22 +103.96.214.0/23 103.96.224.0/23 -103.97.8.0/21 -103.97.16.0/20 -103.97.36.0/22 -103.97.40.0/22 -103.97.56.0/22 -103.97.60.0/23 -103.97.64.0/21 -103.97.72.0/22 -103.97.112.0/21 -103.97.144.0/21 -103.97.188.0/22 -103.97.192.0/22 -103.97.229.0/24 -103.98.0.0/23 -103.98.40.0/21 -103.98.48.0/22 -103.98.56.0/22 -103.98.80.0/22 -103.98.88.0/21 -103.98.96.0/21 -103.98.124.0/22 -103.98.136.0/21 -103.98.144.0/22 -103.98.164.0/22 -103.98.168.0/22 -103.98.180.0/22 -103.98.196.0/22 -103.98.216.0/21 -103.98.224.0/21 -103.98.232.0/22 -103.98.240.0/20 -103.99.53.0/24 -103.99.54.0/23 -103.99.56.0/22 +103.97.60.0/24 +103.97.112.0/23 +103.97.144.0/22 +103.98.44.0/22 +103.98.92.0/22 +103.98.96.0/22 +103.98.125.0/24 +103.98.127.0/24 +103.98.220.0/22 +103.98.248.0/23 +103.98.252.0/22 103.99.104.0/22 -103.99.116.0/22 -103.99.120.0/22 -103.99.152.0/22 -103.99.220.0/22 -103.99.232.0/21 -103.100.0.0/22 -103.100.32.0/22 -103.100.40.0/22 -103.100.48.0/21 -103.100.56.0/22 -103.100.62.0/24 +103.99.178.0/24 103.100.64.0/22 -103.100.88.0/22 -103.100.116.0/22 -103.100.144.0/22 -103.100.236.0/22 -103.100.240.0/22 -103.100.248.0/21 -103.101.8.0/21 -103.101.60.0/22 -103.101.120.0/21 -103.101.144.0/21 +103.101.124.0/23 103.101.180.0/22 -103.101.184.0/22 -103.102.76.0/22 -103.102.80.0/22 -103.102.168.0/21 -103.102.180.0/22 -103.102.184.0/21 -103.102.192.0/21 +103.102.196.0/24 103.102.200.0/22 -103.102.208.0/21 -103.103.12.0/22 -103.103.16.0/22 -103.103.36.0/22 -103.103.72.0/22 -103.103.188.0/22 -103.103.200.0/21 -103.103.220.0/22 -103.103.224.0/21 -103.103.232.0/22 -103.103.248.0/21 -103.104.0.0/21 -103.104.36.0/22 -103.104.40.0/22 -103.104.64.0/22 -103.104.104.0/22 -103.104.152.0/22 -103.104.188.0/22 +103.102.213.0/24 +103.102.214.0/24 +103.103.12.0/24 +103.103.36.0/24 103.104.252.0/22 -103.105.0.0/21 +103.105.0.0/22 103.105.12.0/22 -103.105.16.0/22 103.105.60.0/22 -103.105.116.0/22 -103.105.133.0/24 -103.105.134.0/23 103.105.180.0/22 103.105.184.0/22 -103.105.200.0/21 +103.105.200.0/23 +103.105.202.0/24 103.105.220.0/22 103.106.36.0/22 -103.106.40.0/21 -103.106.60.0/22 -103.106.68.0/22 -103.106.96.0/22 -103.106.120.0/22 -103.106.128.0/21 -103.106.160.0/22 -103.106.196.0/22 -103.106.202.0/24 -103.106.212.0/22 103.106.252.0/22 103.107.0.0/22 -103.107.28.0/22 -103.107.32.0/22 -103.107.44.0/22 -103.107.72.0/22 -103.107.108.0/22 -103.107.164.0/22 -103.107.168.0/22 -103.107.188.0/22 -103.107.192.0/22 -103.107.208.0/20 -103.108.52.0/22 -103.108.160.0/21 -103.108.196.0/22 -103.108.208.0/21 -103.108.224.0/22 -103.108.244.0/22 +103.107.216.0/21 +103.108.244.0/24 +103.108.247.0/24 103.109.20.0/22 -103.109.48.0/22 -103.109.88.0/22 -103.109.248.0/22 -103.110.92.0/22 -103.110.116.0/22 103.110.132.0/22 103.110.136.0/22 -103.110.152.0/21 -103.110.188.0/22 -103.110.204.0/22 -103.111.64.0/22 +103.111.64.0/24 103.111.172.0/22 -103.111.252.0/22 -103.112.72.0/22 -103.112.88.0/21 -103.112.108.0/22 -103.112.112.0/21 -103.112.140.0/22 103.113.4.0/22 -103.113.144.0/22 -103.113.220.0/22 -103.113.232.0/21 -103.114.4.0/22 -103.114.28.0/22 -103.114.68.0/22 103.114.100.0/22 -103.114.148.0/22 -103.114.156.0/23 -103.114.176.0/22 -103.114.212.0/22 +103.114.212.0/23 103.114.236.0/22 -103.114.240.0/22 -103.115.52.0/22 -103.115.68.0/22 103.115.92.0/22 103.115.120.0/22 -103.115.148.0/22 103.115.248.0/22 -103.116.40.0/22 -103.116.76.0/22 +103.116.76.0/23 +103.116.78.0/24 103.116.92.0/22 -103.116.120.0/22 -103.116.128.0/22 +103.116.120.0/23 +103.116.123.0/24 103.116.138.0/23 -103.116.150.0/24 -103.116.184.0/22 -103.116.220.0/22 -103.116.224.0/21 103.117.16.0/22 -103.117.73.0/24 -103.117.74.0/23 -103.117.88.0/22 -103.117.188.0/22 103.117.220.0/22 103.118.52.0/22 -103.118.56.0/21 -103.118.64.0/21 -103.118.72.0/22 -103.118.88.0/22 -103.118.210.0/23 -103.118.212.0/22 -103.118.216.0/22 -103.118.248.0/22 -103.119.28.0/22 -103.119.115.0/24 -103.119.156.0/22 -103.119.180.0/22 -103.119.200.0/22 -103.120.52.0/22 +103.118.60.0/22 +103.118.173.0/24 103.120.72.0/22 103.120.88.0/22 -103.120.96.0/21 -103.120.140.0/22 -103.120.196.0/22 -103.120.224.0/22 103.121.52.0/22 -103.121.160.0/21 +103.121.164.0/23 +103.121.166.0/24 103.121.250.0/24 -103.121.252.0/22 103.122.48.0/22 -103.122.192.0/22 -103.122.240.0/22 -103.123.4.0/22 -103.123.56.0/22 -103.123.88.0/21 -103.123.116.0/22 -103.123.176.0/22 -103.123.200.0/21 -103.123.208.0/21 -103.124.24.0/22 -103.124.48.0/22 -103.124.64.0/22 -103.124.212.0/22 -103.124.216.0/22 -103.125.20.0/22 -103.125.44.0/22 -103.125.132.0/22 -103.125.164.0/22 -103.125.196.0/22 +103.123.4.0/23 103.125.236.0/22 -103.125.249.0/24 -103.125.250.0/23 -103.126.0.0/22 -103.126.16.0/22 -103.126.44.0/22 +103.126.1.0/24 103.126.124.0/22 -103.126.128.0/21 -103.130.132.0/22 -103.130.160.0/22 -103.130.228.0/22 -103.131.20.0/22 -103.131.36.0/22 103.131.138.0/23 103.131.152.0/22 -103.131.168.0/22 -103.131.224.0/21 -103.131.240.0/22 103.132.22.0/23 -103.132.48.0/22 -103.132.60.0/22 -103.132.64.0/20 -103.132.80.0/22 -103.132.104.0/21 -103.132.112.0/21 -103.132.120.0/22 -103.132.161.0/24 -103.132.188.0/22 -103.132.208.0/21 -103.133.12.0/22 -103.133.40.0/22 -103.133.128.0/22 -103.133.232.0/22 -103.134.196.0/22 -103.134.232.0/23 -103.135.80.0/22 -103.135.124.0/22 -103.135.148.0/22 -103.135.156.0/22 -103.135.160.0/21 -103.135.176.0/22 -103.135.184.0/22 -103.135.192.0/21 -103.135.236.0/22 -103.136.128.0/22 -103.136.232.0/22 -103.137.58.0/23 +103.132.212.0/23 +103.133.128.0/23 +103.135.160.0/22 +103.135.164.0/23 +103.135.192.0/23 +103.135.195.0/24 +103.135.196.0/22 103.137.60.0/24 -103.137.76.0/22 -103.137.136.0/23 -103.137.180.0/22 -103.137.236.0/22 -103.138.2.0/23 -103.138.134.0/23 -103.138.208.0/23 -103.138.220.0/23 -103.138.248.0/23 -103.139.22.0/23 -103.139.92.0/23 -103.139.134.0/23 103.139.172.0/23 -103.139.204.0/23 103.139.212.0/23 103.140.14.0/23 -103.140.140.0/23 -103.140.144.0/23 -103.140.192.0/23 103.141.10.0/23 -103.141.58.0/23 -103.141.128.0/23 -103.141.186.0/23 -103.141.242.0/23 -103.142.28.0/23 -103.142.58.0/23 -103.142.82.0/23 103.142.96.0/23 -103.142.122.0/23 -103.142.128.0/23 -103.142.154.0/23 -103.142.156.0/23 -103.142.172.0/23 -103.142.180.0/23 -103.142.186.0/23 103.142.234.0/23 -103.142.238.0/23 -103.142.248.0/23 103.143.16.0/22 -103.143.74.0/23 -103.143.120.0/23 -103.143.124.0/23 -103.143.132.0/22 -103.143.174.0/23 -103.143.228.0/23 -103.144.41.0/24 +103.143.92.0/23 +103.143.230.0/24 103.144.66.0/23 -103.144.70.0/23 -103.144.72.0/23 -103.144.136.0/23 +103.144.70.0/24 103.144.158.0/23 103.145.42.0/23 -103.145.93.0/24 -103.145.98.0/23 -103.145.188.0/23 -103.146.72.0/23 -103.146.91.0/24 103.146.126.0/23 -103.146.138.0/23 -103.146.236.0/23 -103.147.124.0/23 -103.147.206.0/23 -103.148.174.0/23 -103.149.6.0/23 -103.149.17.0/24 -103.149.44.0/23 -103.149.210.0/23 -103.149.214.0/23 -103.149.220.0/23 -103.149.242.0/23 +103.147.124.0/24 +103.149.242.0/24 103.149.244.0/22 -103.150.10.0/23 103.150.24.0/23 -103.150.66.0/23 -103.150.72.0/23 -103.150.122.0/23 -103.150.126.0/23 -103.150.128.0/22 -103.150.146.0/23 +103.150.36.0/23 103.150.164.0/23 -103.150.172.0/23 -103.150.200.0/23 -103.150.216.0/23 -103.150.244.0/23 -103.151.142.0/23 103.151.148.0/23 -103.151.158.0/23 -103.152.28.0/22 +103.152.28.0/23 103.152.56.0/23 103.152.76.0/23 -103.152.120.0/22 -103.152.152.0/23 -103.152.168.0/23 +103.152.150.0/23 103.152.186.0/23 -103.152.192.0/23 -103.152.200.0/23 -103.152.208.0/23 -103.152.224.0/23 -103.152.250.0/23 -103.153.114.0/23 -103.153.122.0/23 -103.153.132.0/23 -103.153.146.0/23 -103.153.160.0/23 -103.154.18.0/23 +103.152.209.0/24 +103.152.224.0/24 103.154.30.0/23 -103.154.32.0/23 -103.154.40.0/23 -103.154.66.0/23 +103.154.41.0/24 103.154.162.0/23 -103.154.164.0/23 -103.154.168.0/23 -103.155.14.0/23 -103.155.34.0/23 -103.155.48.0/23 103.155.76.0/23 -103.155.101.0/24 -103.155.214.0/23 -103.156.28.0/23 103.156.68.0/23 -103.156.104.0/23 -103.156.158.0/23 103.156.174.0/23 103.156.186.0/23 -103.156.228.0/23 -103.157.30.0/23 -103.157.174.0/23 -103.157.212.0/23 -103.157.234.0/23 -103.157.254.0/23 103.158.0.0/23 -103.158.8.0/23 -103.158.16.0/23 -103.158.200.0/23 -103.158.224.0/23 103.159.124.0/23 -103.159.134.0/23 -103.159.142.0/23 -103.160.32.0/22 -103.160.112.0/22 -103.160.244.0/23 -103.160.254.0/23 -103.161.14.0/23 -103.161.102.0/23 -103.161.208.0/23 103.161.220.0/23 103.161.254.0/23 103.162.10.0/23 -103.162.32.0/23 -103.162.116.0/23 -103.163.28.0/23 -103.163.32.0/23 103.163.46.0/23 -103.163.74.0/23 -103.163.180.0/23 -103.164.4.0/23 -103.164.32.0/23 -103.164.40.0/22 -103.164.64.0/23 -103.164.76.0/23 -103.164.178.0/23 -103.165.44.0/23 -103.165.52.0/23 -103.165.82.0/23 +103.163.180.0/24 +103.164.32.0/24 103.165.110.0/23 -103.166.20.0/23 -103.166.50.0/23 -103.166.52.0/22 -103.166.84.0/23 -103.166.138.0/23 -103.167.0.0/23 -103.167.36.0/23 -103.167.100.0/23 -103.168.98.0/23 -103.168.170.0/23 103.169.50.0/23 103.169.62.0/23 -103.169.108.0/23 -103.169.162.0/23 -103.169.202.0/23 -103.169.216.0/24 103.170.4.0/23 -103.170.134.0/23 103.170.212.0/23 -103.171.32.0/23 -103.171.166.0/24 -103.171.214.0/23 -103.172.32.0/23 -103.172.160.0/23 -103.173.102.0/23 -103.173.182.0/23 -103.173.184.0/23 103.174.94.0/23 -103.175.114.0/23 -103.175.118.0/23 -103.175.197.0/24 -103.176.52.0/23 -103.176.222.0/23 -103.176.244.0/23 103.177.28.0/23 -103.177.44.0/23 -103.177.71.0/24 -103.177.162.0/23 -103.178.240.0/23 -103.179.76.0/22 -103.180.108.0/24 -103.180.226.0/23 -103.181.234.0/23 -103.183.26.0/23 +103.179.78.0/23 +103.181.234.0/24 103.183.66.0/23 103.183.122.0/23 103.183.124.0/23 103.184.46.0/23 -103.184.60.0/23 -103.185.78.0/23 -103.185.80.0/23 103.186.4.0/23 103.186.108.0/23 -103.186.162.0/24 -103.186.228.0/23 103.189.92.0/23 -103.189.152.0/22 -103.190.20.0/23 -103.190.71.0/24 -103.190.104.0/23 -103.190.116.0/22 +103.189.154.0/23 +103.190.118.0/23 103.190.122.0/23 -103.191.102.0/23 +103.191.102.0/24 103.191.242.0/23 -103.192.0.0/19 -103.192.48.0/21 -103.192.56.0/22 -103.192.84.0/22 -103.192.88.0/21 -103.192.96.0/20 -103.192.112.0/22 -103.192.128.0/20 -103.192.144.0/22 -103.192.164.0/22 +103.192.0.0/22 +103.192.8.0/21 +103.192.16.0/20 +103.192.132.0/22 103.192.188.0/22 103.192.208.0/21 -103.192.216.0/22 103.192.252.0/22 -103.193.40.0/21 -103.193.120.0/22 -103.193.140.0/22 -103.193.160.0/22 103.193.188.0/22 103.193.192.0/22 -103.193.212.0/22 -103.193.216.0/21 -103.193.224.0/20 -103.194.16.0/22 -103.195.104.0/22 -103.195.112.0/22 -103.195.152.0/22 -103.195.160.0/22 -103.196.64.0/22 -103.196.72.0/22 +103.196.64.0/24 103.196.88.0/21 -103.196.96.0/22 -103.196.168.0/22 103.197.0.0/22 -103.197.180.0/22 103.197.228.0/22 -103.198.20.0/22 103.198.60.0/22 -103.198.64.0/22 -103.198.72.0/22 103.198.124.0/22 -103.198.156.0/22 -103.198.180.0/22 -103.198.196.0/22 -103.198.216.0/21 -103.198.224.0/20 -103.198.240.0/21 -103.199.164.0/22 -103.199.196.0/22 -103.199.228.0/22 -103.199.248.0/21 -103.200.52.0/22 -103.200.64.0/21 103.200.136.0/21 -103.200.144.0/20 -103.200.160.0/19 -103.200.192.0/22 +103.200.144.0/21 103.200.220.0/22 -103.200.224.0/19 -103.201.0.0/20 -103.201.16.0/21 -103.201.28.0/22 -103.201.32.0/19 -103.201.64.0/22 -103.201.76.0/22 -103.201.80.0/20 -103.201.96.0/20 -103.201.112.0/21 -103.201.120.0/22 -103.201.152.0/21 -103.201.160.0/19 -103.201.192.0/18 +103.200.224.0/24 +103.201.192.0/24 +103.201.196.0/24 +103.201.200.0/24 103.202.0.0/19 103.202.32.0/20 -103.202.56.0/22 -103.202.60.0/24 -103.202.62.0/23 -103.202.64.0/22 -103.202.68.0/23 -103.202.72.0/21 -103.202.80.0/20 -103.202.96.0/19 +103.202.92.0/22 +103.202.96.0/20 +103.202.112.0/22 +103.202.120.0/21 103.202.128.0/20 103.202.144.0/22 -103.202.152.0/24 -103.202.154.0/23 -103.202.156.0/22 -103.202.160.0/19 -103.202.192.0/20 -103.202.212.0/22 -103.202.228.0/22 -103.202.236.0/22 -103.202.240.0/20 -103.203.0.0/19 -103.203.32.0/22 -103.203.96.0/19 -103.203.128.0/22 +103.203.96.0/22 103.203.140.0/22 -103.203.164.0/22 -103.203.168.0/22 -103.203.192.0/22 -103.203.200.0/22 -103.203.212.0/22 103.203.216.0/22 -103.204.24.0/22 103.204.72.0/22 -103.204.88.0/22 -103.204.112.0/22 -103.204.136.0/21 -103.204.144.0/21 -103.204.152.0/22 -103.204.196.0/22 -103.204.216.0/23 -103.204.232.0/21 103.205.4.0/22 -103.205.40.0/21 -103.205.52.0/22 -103.205.108.0/22 -103.205.116.0/22 -103.205.136.0/22 -103.205.162.0/24 103.205.188.0/22 -103.205.192.0/21 -103.205.200.0/22 -103.205.236.0/22 -103.205.248.0/21 -103.206.0.0/22 -103.206.44.0/22 -103.206.148.0/22 -103.207.104.0/22 -103.207.184.0/21 -103.207.192.0/20 -103.207.208.0/21 -103.207.220.0/22 +103.205.192.0/22 +103.205.252.0/22 103.207.228.0/22 -103.207.232.0/22 103.208.12.0/22 -103.208.16.0/22 -103.208.28.0/22 -103.208.40.0/21 103.208.48.0/22 103.209.112.0/22 103.209.136.0/22 -103.209.200.0/22 -103.209.208.0/22 -103.209.216.0/22 -103.210.96.0/22 -103.210.156.0/22 -103.210.160.0/19 -103.210.216.0/22 +103.210.160.0/22 +103.210.170.0/23 103.211.44.0/22 -103.211.96.0/22 -103.211.156.0/22 -103.211.164.0/22 103.211.220.0/22 -103.211.224.0/22 -103.211.248.0/22 -103.212.0.0/20 -103.212.44.0/22 -103.212.48.0/22 -103.212.84.0/22 -103.212.100.0/22 -103.212.108.0/22 -103.212.148.0/22 -103.212.164.0/22 -103.212.196.0/22 -103.212.200.0/22 -103.212.252.0/22 -103.213.40.0/21 -103.213.48.0/20 +103.212.1.0/24 +103.212.2.0/24 +103.212.4.0/22 +103.212.12.0/22 +103.212.48.0/23 +103.212.109.0/24 +103.213.49.0/24 +103.213.50.0/23 +103.213.52.0/22 +103.213.56.0/21 103.213.64.0/19 103.213.96.0/22 103.213.132.0/22 -103.213.136.0/21 -103.213.144.0/20 +103.213.144.0/23 +103.213.148.0/22 103.213.160.0/19 -103.213.196.0/22 -103.213.226.0/23 -103.213.232.0/23 103.214.48.0/22 -103.214.84.0/22 -103.214.212.0/22 -103.214.240.0/21 -103.215.28.0/22 -103.215.32.0/21 -103.215.44.0/22 -103.215.100.0/22 -103.215.108.0/22 -103.215.116.0/22 -103.215.120.0/22 +103.215.36.0/22 +103.215.44.0/24 103.215.140.0/22 -103.216.4.0/22 -103.216.8.0/21 -103.216.16.0/20 -103.216.32.0/20 -103.216.64.0/22 -103.216.108.0/22 103.216.136.0/22 103.216.152.0/22 -103.216.156.0/23 -103.216.224.0/22 -103.216.240.0/20 -103.217.0.0/18 -103.217.168.0/22 -103.217.180.0/22 +103.216.252.0/24 103.217.184.0/21 103.217.192.0/20 -103.218.8.0/21 -103.218.16.0/21 -103.218.28.0/22 -103.218.32.0/19 -103.218.64.0/19 -103.218.178.0/23 -103.218.192.0/20 -103.218.208.0/21 103.218.216.0/22 -103.219.24.0/21 +103.219.28.0/22 103.219.32.0/21 -103.219.64.0/22 -103.219.84.0/22 -103.219.88.0/21 -103.219.96.0/21 +103.219.92.0/24 +103.219.100.0/23 103.219.176.0/22 103.219.184.0/22 -103.220.48.0/20 +103.220.52.0/22 +103.220.56.0/22 103.220.64.0/22 103.220.92.0/22 -103.220.96.0/20 -103.220.116.0/22 -103.220.120.0/21 -103.220.128.0/20 -103.220.144.0/21 -103.220.152.0/22 -103.220.160.0/19 -103.220.192.0/21 -103.220.200.0/22 -103.220.240.0/21 -103.221.88.0/22 -103.221.96.0/19 -103.221.128.0/18 -103.221.192.0/20 -103.222.0.0/20 -103.222.16.0/22 -103.222.24.0/21 -103.222.32.0/19 -103.222.64.0/18 -103.222.128.0/18 -103.222.192.0/19 -103.222.224.0/21 -103.222.232.0/22 -103.222.240.0/21 -103.223.16.0/20 -103.223.32.0/19 -103.223.64.0/19 -103.223.96.0/20 -103.223.112.0/21 -103.223.124.0/22 -103.223.128.0/21 -103.223.140.0/22 +103.220.124.0/22 +103.220.128.0/19 +103.220.160.0/21 +103.220.240.0/22 +103.221.140.0/22 +103.222.33.0/24 +103.222.40.0/22 +103.222.176.0/21 +103.222.184.0/22 +103.222.216.0/22 +103.223.132.0/22 103.223.144.0/20 -103.223.160.0/20 -103.223.176.0/21 -103.223.188.0/22 -103.223.192.0/18 -103.224.0.0/22 -103.224.40.0/21 -103.224.60.0/22 -103.224.220.0/22 -103.224.224.0/21 103.224.232.0/22 -103.225.18.0/24 -103.226.16.0/22 -103.226.40.0/22 103.226.57.0/24 -103.226.58.0/23 -103.226.60.0/22 -103.226.80.0/22 -103.226.116.0/23 -103.226.132.0/22 -103.226.156.0/22 -103.226.180.0/22 -103.226.196.0/22 -103.227.48.0/22 -103.227.72.0/21 +103.227.76.0/22 103.227.80.0/22 -103.227.100.0/22 103.227.120.0/22 -103.227.132.0/22 103.227.136.0/22 -103.227.196.0/22 -103.227.204.0/22 -103.227.212.0/22 103.227.228.0/22 -103.228.12.0/22 -103.228.88.0/22 103.228.136.0/22 103.228.160.0/22 -103.228.176.0/22 -103.228.204.0/22 +103.228.204.0/23 103.228.208.0/22 103.228.228.0/22 -103.228.232.0/22 -103.229.20.0/22 -103.229.136.0/22 103.229.148.0/22 103.229.172.0/22 103.229.212.0/22 103.229.216.0/21 -103.229.228.0/22 103.229.236.0/22 -103.229.240.0/22 -103.230.0.0/22 -103.230.28.0/22 -103.230.44.0/22 -103.230.96.0/22 103.230.110.0/23 -103.230.196.0/22 -103.230.200.0/21 +103.230.200.0/22 103.230.212.0/22 103.230.236.0/22 -103.231.16.0/21 +103.231.16.0/24 103.231.64.0/21 -103.231.180.0/22 -103.231.185.0/24 -103.231.186.0/23 -103.231.244.0/22 -103.232.4.0/22 103.232.144.0/22 103.232.166.0/23 -103.232.188.0/22 103.233.4.0/22 -103.233.44.0/22 103.233.52.0/22 -103.233.104.0/22 103.233.128.0/22 -103.233.136.0/22 +103.233.138.0/24 103.233.162.0/23 -103.233.178.0/24 -103.233.228.0/22 -103.234.0.0/22 103.234.20.0/22 103.234.56.0/22 -103.234.128.0/22 -103.234.172.0/22 -103.234.180.0/22 -103.234.244.0/22 -103.235.48.0/22 -103.235.56.0/21 -103.235.80.0/22 -103.235.85.0/24 -103.235.87.0/24 -103.235.100.0/22 -103.235.132.0/22 -103.235.136.0/21 -103.235.144.0/21 -103.235.184.0/22 -103.235.192.0/22 -103.235.200.0/22 +103.234.128.0/23 +103.234.131.0/24 +103.235.102.0/23 +103.235.136.0/22 +103.235.144.0/24 103.235.220.0/22 -103.235.224.0/19 -103.236.0.0/18 +103.235.224.0/20 +103.235.244.0/22 +103.235.248.0/21 +103.236.52.0/22 +103.236.56.0/21 103.236.64.0/19 103.236.96.0/22 -103.236.116.0/23 103.236.120.0/22 -103.236.184.0/22 -103.236.220.0/22 -103.236.232.0/22 -103.236.240.0/21 -103.236.248.0/23 -103.236.250.0/24 -103.236.252.0/22 -103.237.0.0/20 -103.237.24.0/21 -103.237.68.0/22 -103.237.88.0/22 -103.237.152.0/22 +103.236.244.0/22 +103.236.248.0/21 +103.237.8.0/22 +103.237.28.0/23 103.237.176.0/20 -103.237.192.0/18 +103.237.192.0/19 +103.237.224.0/20 +103.237.240.0/21 +103.237.248.0/23 103.238.0.0/21 -103.238.18.0/23 -103.238.20.0/22 -103.238.24.0/21 -103.238.32.0/21 -103.238.40.0/22 -103.238.46.0/23 -103.238.48.0/21 -103.238.56.0/22 -103.238.88.0/21 -103.238.96.0/22 +103.238.16.0/22 +103.238.48.0/24 +103.238.52.0/22 +103.238.96.0/23 +103.238.98.0/24 103.238.132.0/22 103.238.140.0/22 103.238.144.0/22 -103.238.152.0/23 -103.238.160.0/19 -103.238.196.0/22 +103.238.160.0/22 +103.238.184.0/24 +103.238.186.0/23 +103.238.188.0/22 103.238.204.0/22 -103.238.252.0/22 -103.239.44.0/22 103.239.68.0/22 -103.239.152.0/21 -103.239.180.0/22 +103.239.152.0/22 103.239.184.0/22 -103.239.192.0/21 -103.239.204.0/22 -103.239.208.0/22 +103.239.192.0/22 103.239.224.0/22 103.239.244.0/22 103.240.16.0/22 103.240.36.0/22 -103.240.42.0/23 -103.240.72.0/22 103.240.84.0/22 103.240.124.0/22 -103.240.172.0/22 -103.240.188.0/22 -103.240.201.0/24 -103.240.202.0/23 103.240.244.0/22 -103.241.12.0/22 -103.241.92.0/22 -103.241.96.0/22 -103.241.160.0/22 -103.241.172.0/23 -103.241.184.0/21 -103.241.220.0/22 -103.242.64.0/22 -103.242.128.0/22 -103.242.160.0/22 -103.242.168.0/21 -103.242.176.0/22 -103.242.200.0/22 +103.241.95.0/24 +103.242.168.0/23 +103.242.172.0/22 103.242.212.0/22 -103.242.220.0/22 -103.242.240.0/22 103.243.136.0/22 103.243.252.0/22 -103.244.16.0/22 -103.244.26.0/23 -103.244.58.0/23 -103.244.60.0/22 -103.244.64.0/20 -103.244.80.0/21 -103.244.119.0/24 -103.244.164.0/22 +103.244.59.0/24 +103.244.64.0/22 +103.244.80.0/22 103.244.232.0/22 -103.244.252.0/22 -103.245.23.0/24 -103.245.52.0/22 -103.245.60.0/22 -103.245.80.0/22 -103.245.124.0/22 103.245.128.0/22 -103.246.8.0/21 -103.246.120.0/21 -103.246.132.0/22 103.246.152.0/22 -103.247.168.0/21 +103.247.168.0/22 103.247.176.0/22 103.247.191.0/24 -103.247.200.0/22 -103.247.212.0/22 -103.248.0.0/23 -103.248.100.0/22 -103.248.124.0/22 103.248.152.0/22 -103.248.168.0/22 -103.248.192.0/22 -103.248.212.0/22 103.248.224.0/22 -103.249.8.0/21 -103.249.52.0/22 -103.249.128.0/22 -103.249.136.0/22 -103.249.144.0/22 -103.249.164.0/22 -103.249.168.0/21 -103.249.176.0/22 -103.249.188.0/22 -103.249.192.0/22 +103.249.136.0/24 103.249.244.0/22 103.249.252.0/22 103.250.32.0/22 103.250.104.0/22 103.250.124.0/22 -103.250.180.0/22 103.250.192.0/22 103.250.216.0/22 -103.250.224.0/22 -103.250.236.0/22 103.250.248.0/21 103.251.32.0/22 103.251.84.0/22 103.251.96.0/22 103.251.124.0/22 -103.251.129.0/24 -103.251.131.0/24 103.251.160.0/22 -103.251.192.0/22 -103.251.204.0/22 +103.251.204.0/24 +103.251.207.0/24 103.251.240.0/22 -103.252.28.0/22 -103.252.36.0/22 -103.252.64.0/22 -103.252.96.0/22 -103.252.104.0/22 +103.252.36.0/24 103.252.172.0/22 -103.252.204.0/22 -103.252.208.0/22 -103.252.232.0/22 103.252.248.0/22 -103.253.4.0/22 103.253.60.0/22 103.253.204.0/22 -103.253.220.0/22 -103.253.224.0/22 -103.253.232.0/22 -103.254.8.0/22 -103.254.20.0/22 -103.254.64.0/21 +103.254.68.0/22 103.254.76.0/22 103.254.112.0/22 -103.254.176.0/22 103.254.188.0/22 103.255.68.0/22 -103.255.88.0/21 -103.255.136.0/21 -103.255.184.0/22 +103.255.92.0/22 +103.255.140.0/22 103.255.200.0/22 -103.255.212.0/22 -103.255.228.0/22 -104.192.108.0/23 -104.192.110.0/24 -106.0.0.0/24 -106.0.2.0/23 106.0.4.0/22 -106.0.8.0/21 -106.0.16.0/20 -106.0.44.0/22 -106.0.64.0/18 -106.2.0.0/17 -106.2.128.0/20 -106.2.144.0/21 -106.2.152.0/22 -106.2.156.0/23 -106.2.160.0/19 -106.2.192.0/18 -106.3.0.0/18 -106.3.64.0/20 +106.2.37.0/24 +106.2.40.0/23 +106.2.42.0/24 +106.2.45.0/24 +106.2.46.0/23 +106.2.48.0/23 +106.2.51.0/24 +106.2.52.0/22 +106.2.56.0/22 +106.2.62.0/23 +106.2.64.0/20 +106.2.81.0/24 +106.2.82.0/23 +106.2.89.0/24 +106.2.92.0/22 +106.2.96.0/24 +106.2.100.0/22 +106.2.104.0/21 +106.2.112.0/21 +106.2.124.0/22 +106.2.128.0/19 +106.3.0.0/19 +106.3.32.0/20 106.3.80.0/22 106.3.88.0/21 -106.3.96.0/19 -106.3.128.0/17 +106.3.128.0/20 +106.3.144.0/22 +106.3.148.0/23 +106.3.151.0/24 +106.3.152.0/21 +106.3.192.0/20 +106.3.208.0/21 +106.3.224.0/21 106.4.0.0/14 106.8.0.0/15 106.11.0.0/16 -106.12.0.0/14 -106.16.0.0/12 +106.12.0.0/17 +106.12.128.0/18 +106.12.192.0/19 +106.12.224.0/20 +106.12.240.0/21 +106.12.250.0/23 +106.12.252.0/23 +106.12.254.0/24 +106.13.0.0/16 +106.14.0.0/15 +106.16.0.0/14 106.32.0.0/12 -106.48.64.0/18 -106.50.0.0/16 +106.48.16.0/21 106.52.0.0/14 -106.56.0.0/13 +106.56.0.0/14 +106.60.0.0/15 +106.62.0.0/16 +106.63.0.0/17 106.74.0.0/16 106.75.0.0/17 106.75.128.0/18 -106.75.200.0/21 106.75.208.0/20 106.75.224.0/19 -106.80.0.0/12 +106.80.0.0/13 +106.88.0.0/14 +106.92.0.0/16 106.108.0.0/14 106.112.0.0/12 -106.224.0.0/12 +106.224.0.0/14 +106.228.0.0/15 +106.230.0.0/16 +107.151.212.0/24 +107.190.229.0/24 +108.186.72.0/24 109.244.0.0/16 110.6.0.0/15 110.16.0.0/14 -110.34.40.0/21 -110.40.0.0/14 -110.44.12.0/22 -110.44.144.0/20 -110.48.0.0/16 +110.40.0.0/24 +110.40.13.0/24 +110.40.14.0/23 +110.40.16.0/24 +110.40.128.0/17 +110.41.0.0/17 +110.41.128.0/18 +110.41.192.0/20 +110.41.208.0/23 +110.41.211.0/24 +110.41.212.0/22 +110.41.216.0/21 +110.41.224.0/19 +110.42.0.0/15 110.51.0.0/16 110.52.0.0/15 -110.56.0.0/13 +110.56.0.0/16 110.64.0.0/15 110.72.0.0/15 110.75.0.0/16 110.76.0.0/18 -110.76.132.0/22 110.76.156.0/22 110.76.184.0/22 110.76.192.0/18 110.77.0.0/17 +110.79.78.0/24 110.80.0.0/13 110.88.0.0/14 -110.92.68.0/22 -110.93.32.0/19 -110.94.0.0/15 -110.96.0.0/15 -110.98.0.0/16 -110.100.0.0/14 -110.104.0.0/13 -110.112.0.0/13 +110.94.0.0/17 +110.96.0.0/16 +110.100.0.0/16 +110.113.0.0/16 +110.114.0.0/16 +110.116.0.0/16 110.120.0.0/16 -110.121.0.0/22 -110.121.8.0/21 -110.121.16.0/20 -110.121.32.0/19 -110.121.64.0/18 -110.121.128.0/17 -110.122.0.0/15 -110.124.0.0/14 110.152.0.0/14 110.156.0.0/15 -110.165.32.0/19 110.166.0.0/15 -110.172.192.0/18 -110.173.0.0/19 +110.173.8.0/21 +110.173.16.0/20 110.173.32.0/20 -110.173.64.0/18 110.173.192.0/19 110.176.0.0/12 -110.192.0.0/11 +110.199.0.0/16 +110.203.0.0/23 +110.211.0.0/16 +110.218.0.0/15 110.228.0.0/14 -110.232.32.0/19 110.236.0.0/15 110.240.0.0/12 111.0.0.0/10 -111.66.0.0/21 -111.66.12.0/22 -111.66.16.0/22 -111.66.28.0/22 -111.66.32.0/21 -111.66.44.0/22 -111.66.52.0/22 -111.66.60.0/22 -111.66.64.0/18 -111.66.128.0/19 -111.66.160.0/20 -111.66.176.0/23 -111.66.178.0/24 -111.66.180.0/22 -111.66.184.0/21 -111.67.192.0/20 -111.68.64.0/19 111.72.0.0/13 111.85.0.0/16 -111.92.248.0/21 111.112.0.0/14 111.116.0.0/15 111.118.200.0/21 -111.119.64.0/18 -111.119.128.0/19 111.120.0.0/14 111.124.0.0/16 111.126.0.0/15 -111.128.0.0/11 +111.132.0.0/16 +111.148.0.0/16 +111.149.0.0/24 111.160.0.0/13 111.170.0.0/16 111.172.0.0/14 111.176.0.0/13 111.186.0.0/15 111.192.0.0/12 -111.208.0.0/13 +111.208.121.0/24 +111.208.254.0/24 +111.210.0.0/20 +111.210.16.0/24 +111.211.192.0/18 +111.212.0.0/14 111.221.28.0/24 111.221.128.0/17 111.222.0.0/16 -111.223.4.0/22 -111.223.12.0/22 -111.223.16.0/22 -111.223.240.0/22 -111.223.248.0/22 -111.224.0.0/13 -111.235.96.0/19 +111.223.8.0/21 +111.224.0.0/14 +111.228.0.0/18 +111.229.0.0/16 +111.230.0.0/15 111.235.156.0/22 -111.235.160.0/19 +111.235.160.0/22 +111.235.164.0/23 +111.235.168.0/22 +111.235.172.0/23 +111.235.174.0/24 +111.235.178.0/23 +111.235.180.0/23 +111.235.182.0/24 112.0.0.0/10 112.64.0.0/14 -112.73.66.0/24 -112.73.68.0/24 -112.73.70.0/24 -112.73.74.0/24 -112.73.76.0/24 -112.73.79.0/24 -112.73.92.0/24 -112.73.97.0/24 -112.73.98.0/23 -112.73.100.0/22 -112.73.106.0/23 -112.73.108.0/24 -112.73.110.0/24 -112.73.112.0/23 -112.73.115.0/24 -112.73.116.0/24 -112.73.120.0/24 -112.73.122.0/24 -112.73.124.0/23 -112.73.127.0/24 -112.73.128.0/23 -112.73.130.0/24 -112.73.132.0/23 -112.73.136.0/24 -112.73.139.0/24 -112.73.140.0/24 -112.73.143.0/24 -112.73.145.0/24 -112.73.146.0/23 -112.73.148.0/22 -112.73.152.0/22 -112.73.157.0/24 -112.73.158.0/23 -112.73.160.0/24 -112.73.163.0/24 -112.73.166.0/23 -112.73.168.0/24 -112.73.170.0/24 -112.73.173.0/24 -112.73.174.0/24 -112.73.178.0/24 -112.73.181.0/24 -112.73.182.0/24 -112.73.190.0/24 -112.73.192.0/23 -112.73.196.0/24 -112.73.199.0/24 -112.73.200.0/23 -112.73.205.0/24 -112.73.207.0/24 -112.73.209.0/24 -112.73.210.0/24 -112.73.213.0/24 -112.73.218.0/24 -112.73.224.0/24 -112.73.228.0/24 -112.73.231.0/24 -112.73.232.0/23 -112.73.235.0/24 -112.73.238.0/24 -112.73.242.0/23 -112.73.244.0/23 -112.73.247.0/24 -112.73.250.0/23 -112.73.254.0/24 -112.74.0.0/15 +112.74.0.0/16 112.80.0.0/12 112.96.0.0/13 112.109.128.0/17 @@ -3120,24 +1601,48 @@ 112.116.0.0/15 112.122.0.0/15 112.124.0.0/14 -112.128.0.0/14 112.132.0.0/16 -112.137.48.0/21 112.192.0.0/14 112.224.0.0/11 113.0.0.0/13 113.8.0.0/15 -113.11.192.0/19 113.12.0.0/14 113.16.0.0/15 113.18.0.0/16 113.21.232.0/21 113.24.0.0/14 -113.31.0.0/16 -113.44.0.0/14 -113.48.0.0/14 -113.52.160.0/19 -113.52.228.0/22 +113.31.96.0/19 +113.31.144.0/20 +113.31.160.0/19 +113.44.0.0/16 +113.45.0.0/18 +113.45.64.0/19 +113.45.96.0/22 +113.45.102.0/23 +113.45.104.0/21 +113.45.112.0/22 +113.45.120.0/22 +113.45.128.0/17 +113.46.0.0/16 +113.47.0.0/18 +113.47.64.0/19 +113.47.96.0/21 +113.47.104.0/22 +113.47.110.0/24 +113.47.112.0/20 +113.47.128.0/18 +113.47.200.0/21 +113.47.216.0/21 +113.47.232.0/21 +113.47.240.0/20 +113.48.48.0/20 +113.48.127.0/24 +113.48.224.0/20 +113.49.0.0/19 +113.50.0.0/20 +113.50.32.0/24 +113.50.48.0/20 +113.50.64.0/20 113.54.0.0/15 113.56.0.0/15 113.58.0.0/16 @@ -3150,203 +1655,265 @@ 113.130.112.0/21 113.132.0.0/14 113.136.0.0/13 -113.192.40.0/23 +113.164.25.0/24 113.194.0.0/15 -113.197.100.0/22 +113.197.101.0/24 +113.197.103.0/24 113.200.0.0/15 -113.202.0.0/16 113.204.0.0/14 -113.208.96.0/19 -113.208.128.0/17 -113.209.0.0/16 -113.212.0.0/18 -113.212.100.0/22 -113.212.184.0/21 -113.213.0.0/17 +113.208.112.0/21 +113.209.128.0/17 +113.213.0.0/18 +113.213.64.0/19 +113.213.96.0/20 113.214.0.0/15 113.218.0.0/15 113.220.0.0/14 113.224.0.0/12 113.240.0.0/13 113.248.0.0/14 -114.28.0.0/17 +114.28.68.0/22 +114.28.72.0/21 114.28.128.0/18 -114.28.193.0/24 -114.28.194.0/24 -114.28.197.0/24 -114.28.198.0/23 -114.28.201.0/24 -114.28.203.0/24 -114.28.205.0/24 -114.28.206.0/23 -114.28.208.0/23 -114.28.210.0/24 -114.28.216.0/23 -114.28.220.0/22 -114.28.225.0/24 -114.28.230.0/24 -114.28.232.0/24 -114.28.235.0/24 -114.28.236.0/23 -114.28.239.0/24 -114.28.240.0/20 -114.31.64.0/21 -114.54.0.0/15 +114.28.248.0/21 +114.55.0.0/16 114.60.0.0/14 -114.64.0.0/15 -114.66.0.0/17 -114.66.224.0/22 +114.64.0.0/16 +114.66.0.0/18 +114.66.72.0/21 +114.66.81.0/24 114.66.236.0/22 114.66.240.0/20 -114.67.0.0/16 -114.68.0.0/16 -114.79.64.0/18 +114.67.16.0/21 +114.67.48.0/24 +114.67.57.0/24 +114.67.58.0/24 +114.67.60.0/23 +114.67.62.0/24 +114.67.64.0/18 +114.67.131.0/24 +114.67.136.0/24 +114.67.150.0/24 +114.67.152.0/22 +114.67.156.0/24 +114.67.159.0/24 +114.67.160.0/19 +114.67.192.0/18 114.80.0.0/12 114.96.0.0/13 114.104.0.0/14 114.110.0.0/20 -114.110.64.0/18 -114.111.0.0/19 -114.111.160.0/20 -114.111.176.0/22 -114.111.190.0/23 -114.112.4.0/22 -114.112.8.0/22 -114.112.12.0/23 -114.112.16.0/23 -114.112.20.0/22 +114.110.96.0/22 +114.111.0.0/23 +114.111.16.0/20 +114.111.191.0/24 +114.112.4.0/23 114.112.24.0/21 114.112.32.0/19 -114.112.64.0/18 -114.112.128.0/18 -114.112.192.0/19 -114.112.224.0/22 -114.112.228.0/24 -114.112.230.0/23 -114.112.234.0/23 -114.112.240.0/21 -114.112.248.0/22 -114.112.252.0/23 -114.112.255.0/24 -114.113.0.0/17 -114.113.128.0/21 -114.113.140.0/22 +114.112.64.0/24 +114.112.66.0/24 +114.112.70.0/24 +114.112.72.0/21 +114.112.81.0/24 +114.112.82.0/24 +114.112.85.0/24 +114.112.86.0/24 +114.112.88.0/24 +114.112.91.0/24 +114.112.94.0/23 +114.112.96.0/21 +114.112.104.0/22 +114.112.136.0/21 +114.112.144.0/21 +114.112.200.0/21 +114.112.208.0/20 +114.113.63.0/24 +114.113.65.0/24 +114.113.66.0/24 +114.113.80.0/22 +114.113.84.0/24 +114.113.88.0/21 +114.113.96.0/19 114.113.144.0/20 -114.113.160.0/19 -114.113.192.0/19 +114.113.196.0/22 +114.113.200.0/24 +114.113.203.0/24 +114.113.208.0/21 +114.113.221.0/24 +114.113.223.0/24 114.113.224.0/20 -114.113.242.0/24 -114.113.246.0/23 -114.113.248.0/21 -114.114.0.0/15 +114.114.112.0/21 +114.115.0.0/16 114.116.0.0/15 -114.118.0.0/16 -114.119.0.0/17 -114.119.192.0/21 -114.119.204.0/22 -114.119.208.0/20 -114.119.224.0/19 +114.118.0.0/18 +114.118.64.0/19 +114.118.96.0/21 +114.119.10.0/24 +114.119.32.0/24 +114.119.117.0/24 +114.119.119.0/24 114.132.0.0/16 114.135.0.0/16 114.138.0.0/15 -114.141.64.0/21 -114.141.80.0/21 114.141.128.0/18 -114.142.136.0/21 114.196.0.0/15 -114.198.248.0/21 -114.208.0.0/12 +114.212.0.0/14 +114.216.0.0/13 114.224.0.0/11 115.24.0.0/14 115.28.0.0/15 -115.31.64.0/20 -115.32.0.0/14 -115.42.56.0/22 -115.44.0.0/14 +115.31.64.0/22 +115.32.0.0/19 +115.32.32.0/20 +115.32.52.0/22 +115.32.56.0/21 +115.32.64.0/19 +115.32.104.0/21 +115.32.120.0/21 +115.32.128.0/19 +115.33.0.0/19 +115.33.64.0/18 +115.33.128.0/20 +115.44.0.0/15 +115.46.0.0/16 115.48.0.0/12 -115.69.64.0/20 115.84.0.0/18 115.85.192.0/18 -115.100.0.0/14 -115.104.0.0/14 -115.120.0.0/14 +115.102.0.0/16 +115.120.0.0/17 +115.120.128.0/20 +115.120.144.0/23 +115.120.148.0/22 +115.120.152.0/21 +115.120.176.0/20 +115.120.192.0/18 115.124.16.0/20 115.148.0.0/14 115.152.0.0/13 -115.166.64.0/19 -115.168.0.0/13 -115.180.0.0/14 -115.187.0.0/20 -115.190.0.0/15 +115.168.0.0/14 +115.172.32.0/21 +115.172.46.0/23 +115.173.0.0/19 +115.175.0.0/18 +115.175.64.0/19 +115.175.96.0/21 +115.175.104.0/22 +115.175.108.0/23 +115.175.110.0/24 +115.175.112.0/20 +115.175.128.0/17 +115.180.0.0/17 +115.182.0.0/15 +115.190.0.0/16 +115.191.0.0/18 +115.191.64.0/20 115.192.0.0/11 115.224.0.0/12 -116.0.8.0/21 -116.0.24.0/21 116.1.0.0/16 116.2.0.0/15 116.4.0.0/14 116.8.0.0/14 116.13.0.0/16 116.16.0.0/12 -116.50.0.0/20 116.52.0.0/14 116.56.0.0/15 -116.58.128.0/20 -116.58.208.0/20 -116.60.0.0/14 -116.66.0.0/17 +116.58.208.0/24 +116.62.0.0/15 +116.66.36.0/24 +116.66.48.0/23 +116.66.50.0/24 +116.66.53.0/24 +116.66.54.0/23 +116.66.98.0/24 +116.66.123.0/24 116.68.136.0/21 116.68.176.0/21 -116.69.0.0/16 -116.70.0.0/17 -116.76.0.0/14 -116.85.0.0/16 -116.89.144.0/20 +116.70.64.0/18 +116.76.0.0/15 +116.78.0.0/16 +116.85.1.0/24 +116.85.2.0/23 +116.85.13.0/24 +116.85.14.0/24 +116.85.16.0/23 +116.85.18.0/24 +116.85.64.0/20 +116.85.240.0/20 116.90.80.0/20 -116.90.184.0/21 +116.90.192.0/20 116.95.0.0/16 116.112.0.0/14 116.116.0.0/15 -116.128.0.0/10 +116.128.128.0/18 +116.128.200.0/21 +116.128.208.0/20 +116.128.224.0/19 +116.129.0.0/16 +116.130.0.0/15 +116.132.0.0/15 +116.135.0.0/16 +116.136.0.0/13 +116.144.0.0/14 +116.148.0.0/15 +116.153.0.0/16 +116.154.0.0/15 +116.162.0.0/16 +116.163.0.0/18 +116.165.0.0/16 +116.167.0.0/16 +116.168.0.0/14 +116.172.64.0/18 +116.172.128.0/17 +116.174.0.0/15 +116.176.0.0/14 +116.181.0.0/16 +116.182.0.0/16 116.192.0.0/16 -116.193.16.0/20 -116.193.32.0/19 -116.193.176.0/21 -116.194.0.0/15 +116.193.16.0/23 +116.193.18.0/24 116.196.0.0/21 116.196.8.0/22 116.196.12.0/23 -116.196.14.0/24 -116.196.16.0/20 -116.196.32.0/19 116.196.64.0/18 -116.196.128.0/17 +116.196.129.0/24 +116.196.130.0/23 +116.196.132.0/22 +116.196.136.0/21 +116.196.144.0/21 +116.196.152.0/22 +116.196.156.0/23 +116.196.176.0/21 +116.196.192.0/21 +116.196.218.0/23 +116.196.220.0/22 116.197.160.0/21 -116.198.0.0/16 +116.198.0.0/18 +116.198.64.0/21 +116.198.72.0/22 +116.198.96.0/19 +116.198.144.0/20 +116.198.160.0/20 +116.198.176.0/21 +116.198.192.0/18 116.199.0.0/17 -116.199.128.0/20 -116.199.144.0/21 116.204.0.0/17 116.205.0.0/16 116.207.0.0/16 116.208.0.0/14 -116.212.160.0/20 -116.213.44.0/24 -116.213.46.0/23 -116.213.64.0/18 -116.213.128.0/17 116.214.32.0/19 -116.214.64.0/20 -116.214.128.0/17 -116.215.0.0/16 -116.216.0.0/14 +116.214.128.0/22 +116.214.132.0/23 +116.214.134.0/24 +116.218.0.0/18 +116.218.64.0/19 +116.218.128.0/20 +116.218.144.0/21 116.224.0.0/12 -116.242.0.0/15 -116.244.0.0/14 +116.242.0.0/16 +116.246.0.0/15 116.248.0.0/15 116.252.0.0/15 116.254.104.0/21 -116.254.128.0/17 116.255.128.0/17 117.8.0.0/13 117.21.0.0/16 @@ -3355,76 +1922,88 @@ 117.32.0.0/13 117.40.0.0/14 117.44.0.0/15 -117.48.0.0/15 +117.48.112.0/20 +117.48.128.0/19 +117.48.160.0/20 +117.48.192.0/24 +117.48.195.0/24 +117.48.196.0/22 +117.48.200.0/21 +117.48.216.0/23 +117.48.218.0/24 +117.48.220.0/22 +117.48.224.0/21 +117.48.232.0/23 +117.48.234.0/24 +117.48.236.0/22 117.50.0.0/16 -117.51.128.0/17 -117.53.48.0/20 -117.53.176.0/20 +117.51.128.0/19 +117.51.160.0/23 +117.51.168.0/21 117.57.0.0/16 -117.58.0.0/17 117.59.0.0/16 117.60.0.0/14 117.64.0.0/13 -117.72.0.0/15 -117.74.64.0/19 -117.74.128.0/17 -117.75.0.0/16 -117.76.0.0/14 +117.72.0.0/23 +117.72.8.0/21 +117.72.16.0/23 +117.72.24.0/21 +117.72.32.0/19 +117.72.64.0/18 +117.72.144.0/20 +117.72.160.0/19 +117.72.192.0/19 +117.72.240.0/21 +117.72.255.0/24 +117.73.0.0/20 +117.73.16.0/21 +117.73.252.0/22 +117.74.64.0/20 +117.74.128.0/21 +117.74.136.0/22 +117.78.0.0/18 +117.79.80.0/20 +117.79.128.0/21 +117.79.144.0/20 +117.79.224.0/20 +117.79.241.0/24 +117.79.242.0/24 117.80.0.0/12 -117.100.0.0/15 -117.103.16.0/20 -117.103.40.0/21 -117.103.72.0/21 -117.103.128.0/20 -117.104.168.0/21 117.106.0.0/15 117.112.0.0/13 -117.120.64.0/18 -117.120.148.0/22 -117.120.164.0/22 -117.120.184.0/21 -117.120.208.0/21 -117.120.216.0/22 -117.120.248.0/21 -117.121.0.0/17 -117.121.128.0/18 -117.121.192.0/21 -117.122.128.0/17 -117.124.0.0/14 -117.128.0.0/14 -117.132.0.0/15 -117.134.0.0/17 -117.134.128.0/18 -117.134.205.0/24 -117.134.207.0/24 -117.134.208.0/23 -117.134.212.0/23 -117.134.216.0/21 -117.134.232.0/21 -117.134.240.0/20 -117.135.0.0/16 -117.136.0.0/13 -117.144.0.0/12 -117.160.0.0/11 +117.121.132.0/22 +117.122.192.0/18 +117.124.98.0/24 +117.124.231.0/24 +117.124.232.0/22 +117.124.236.0/23 +117.124.240.0/22 +117.124.244.0/24 +117.124.246.0/24 +117.126.0.0/16 +117.128.0.0/10 118.24.0.0/15 -118.26.0.0/19 -118.26.32.0/22 -118.26.40.0/21 -118.26.48.0/21 -118.26.64.0/19 +118.26.48.0/22 +118.26.64.0/23 +118.26.68.0/23 +118.26.72.0/22 118.26.96.0/21 -118.26.112.0/20 +118.26.116.0/22 118.26.128.0/22 -118.26.133.0/24 -118.26.134.0/23 -118.26.136.0/21 +118.26.136.0/22 118.26.160.0/20 -118.26.188.0/22 -118.26.192.0/18 -118.28.0.0/14 -118.64.0.0/15 -118.66.0.0/16 -118.67.112.0/20 +118.26.192.0/24 +118.26.194.0/23 +118.26.208.0/20 +118.26.240.0/20 +118.31.0.0/16 +118.64.0.0/21 +118.64.248.0/21 +118.65.0.0/21 +118.66.112.0/23 +118.66.184.0/24 +118.66.224.0/20 +118.66.248.0/21 118.72.0.0/13 118.80.0.0/15 118.84.0.0/15 @@ -3432,552 +2011,618 @@ 118.88.64.0/18 118.88.128.0/17 118.89.0.0/16 -118.91.240.0/20 118.102.16.0/20 -118.102.32.0/21 118.103.164.0/22 -118.103.168.0/21 -118.103.176.0/22 118.112.0.0/13 118.120.0.0/14 118.124.0.0/15 -118.126.0.0/16 -118.127.128.0/19 +118.126.32.0/19 +118.126.64.0/18 +118.126.140.0/23 +118.126.142.0/24 118.132.0.0/14 -118.144.0.0/14 +118.144.0.0/16 +118.145.0.0/19 +118.145.32.0/20 +118.145.64.0/19 +118.145.96.0/20 +118.145.112.0/21 +118.145.128.0/19 +118.145.160.0/21 +118.145.176.0/20 +118.145.192.0/18 118.178.0.0/16 118.180.0.0/14 -118.184.0.0/16 -118.186.0.0/15 -118.188.0.0/16 -118.190.0.0/15 -118.192.0.0/16 -118.193.0.0/20 -118.193.48.0/21 +118.184.128.0/17 +118.186.0.0/19 +118.186.32.0/24 +118.186.34.0/23 +118.186.36.0/22 +118.186.56.0/21 +118.186.64.0/21 +118.186.80.0/20 +118.186.96.0/20 +118.186.112.0/21 +118.186.160.0/19 +118.186.208.0/21 +118.186.240.0/21 +118.187.0.0/18 +118.187.64.0/19 +118.188.18.0/23 +118.188.20.0/22 +118.188.24.0/23 +118.190.0.0/16 +118.191.0.0/21 +118.191.8.0/22 +118.191.12.0/24 +118.192.20.0/24 +118.192.64.0/23 +118.192.67.0/24 +118.192.68.0/23 +118.192.70.0/24 118.193.96.0/19 -118.193.128.0/17 -118.194.0.0/17 -118.194.128.0/18 -118.194.192.0/19 -118.194.227.0/24 +118.194.32.0/19 +118.194.134.0/23 118.194.240.0/21 -118.195.0.0/16 -118.196.0.0/14 +118.195.128.0/17 +118.196.0.0/16 +118.197.0.0/18 +118.197.64.0/19 118.202.0.0/15 -118.204.0.0/14 +118.204.0.0/17 118.212.0.0/15 -118.215.192.0/18 -118.224.0.0/14 +118.215.192.0/19 118.228.0.0/15 118.230.0.0/16 118.239.0.0/16 -118.242.0.0/16 -118.244.0.0/14 +118.242.0.0/22 +118.242.16.0/22 +118.242.24.0/22 +118.242.32.0/22 +118.242.40.0/24 +118.244.0.0/21 +118.244.128.0/17 +118.247.0.0/16 118.248.0.0/13 119.0.0.0/15 -119.2.0.0/19 119.2.128.0/17 119.3.0.0/16 119.4.0.0/14 -119.10.0.0/17 -119.15.136.0/21 -119.16.0.0/16 -119.18.192.0/20 +119.15.136.0/23 +119.15.140.0/23 +119.16.0.0/17 +119.16.128.0/18 119.18.208.0/21 -119.18.224.0/19 -119.19.0.0/16 -119.20.0.0/14 -119.27.64.0/18 -119.27.128.0/17 +119.18.224.0/24 +119.18.226.0/24 +119.18.237.0/24 +119.18.239.0/24 +119.23.0.0/16 +119.27.160.0/19 119.28.28.0/24 -119.28.240.0/20 119.29.0.0/16 -119.30.48.0/20 119.31.192.0/19 -119.32.0.0/13 -119.40.0.0/18 +119.32.0.0/15 +119.34.0.0/16 +119.36.0.0/16 +119.37.0.0/23 +119.37.2.0/24 +119.37.12.0/24 +119.37.192.0/21 +119.38.0.0/21 +119.38.192.0/19 +119.39.0.0/16 +119.40.41.0/24 119.40.64.0/20 119.40.128.0/17 119.41.0.0/16 119.42.0.0/19 -119.42.128.0/20 +119.42.136.0/21 119.42.224.0/19 -119.44.0.0/15 +119.44.0.0/22 +119.44.4.0/23 +119.44.7.0/24 +119.44.8.0/22 +119.44.12.0/24 +119.44.16.0/22 +119.44.20.0/23 +119.44.23.0/24 +119.44.24.0/22 +119.44.28.0/23 +119.44.45.0/24 +119.44.46.0/24 +119.44.50.0/23 +119.44.52.0/24 +119.44.56.0/21 +119.44.192.0/24 +119.44.200.0/24 +119.44.205.0/24 +119.44.208.0/22 +119.44.212.0/23 +119.44.214.0/24 +119.44.217.0/24 +119.44.218.0/23 +119.44.220.0/22 +119.44.224.0/20 +119.44.253.0/24 +119.44.254.0/23 +119.45.0.0/16 119.48.0.0/13 -119.57.0.0/16 -119.58.0.0/16 -119.59.128.0/24 -119.59.130.0/24 -119.59.132.0/22 -119.59.136.0/21 -119.59.144.0/20 -119.59.160.0/19 -119.59.192.0/18 +119.57.0.0/21 +119.57.8.0/23 +119.57.12.0/24 +119.57.16.0/21 +119.57.25.0/24 +119.57.28.0/22 +119.57.32.0/21 +119.57.44.0/22 +119.57.51.0/24 +119.57.52.0/22 +119.57.56.0/21 +119.57.64.0/19 +119.57.96.0/22 +119.57.100.0/23 +119.57.102.0/24 +119.57.112.0/20 +119.57.132.0/22 +119.57.136.0/21 +119.57.160.0/20 +119.57.190.0/23 +119.57.246.0/23 +119.57.248.0/21 119.60.0.0/15 119.62.0.0/16 -119.63.32.0/19 119.75.208.0/20 119.78.0.0/15 -119.80.0.0/16 -119.82.208.0/20 +119.80.0.0/21 +119.80.8.0/22 +119.80.160.0/23 +119.80.162.0/24 +119.80.192.0/21 +119.80.200.0/22 +119.80.240.0/22 +119.80.248.0/21 119.84.0.0/14 -119.88.0.0/14 +119.88.128.0/17 +119.91.0.0/16 119.96.0.0/13 119.108.0.0/15 119.112.0.0/12 119.128.0.0/12 119.144.0.0/14 -119.148.160.0/19 -119.151.192.0/18 -119.160.200.0/21 -119.161.120.0/21 -119.161.128.0/21 -119.161.144.0/21 -119.161.152.0/23 -119.161.160.0/19 -119.161.192.0/18 +119.148.160.0/20 +119.161.120.0/22 +119.161.124.0/24 119.162.0.0/15 119.164.0.0/14 119.176.0.0/12 -119.232.0.0/15 -119.235.128.0/18 +119.233.128.0/17 +119.235.128.0/24 +119.235.130.0/24 +119.235.136.0/24 +119.235.138.0/24 +119.235.143.0/24 +119.235.144.0/23 +119.235.151.0/24 +119.235.160.0/23 +119.235.167.0/24 +119.235.185.0/24 119.248.0.0/14 -119.252.96.0/21 -119.252.240.0/21 -119.252.248.0/23 -119.252.250.0/24 -119.252.252.0/23 -119.252.255.0/24 -119.253.0.0/16 -119.254.0.0/15 +119.253.0.0/20 +119.253.32.0/19 +119.253.64.0/19 +119.254.0.0/16 +119.255.128.0/17 120.0.0.0/12 120.24.0.0/14 -120.30.0.0/15 +120.31.66.0/23 +120.31.68.0/22 +120.31.128.0/20 120.32.0.0/12 -120.48.0.0/15 -120.52.0.0/14 -120.64.0.0/13 +120.48.0.0/16 +120.49.0.0/17 +120.49.192.0/18 +120.52.0.0/15 +120.55.0.0/16 +120.65.0.0/16 +120.68.0.0/14 120.72.32.0/19 -120.72.128.0/17 +120.72.160.0/24 +120.72.162.0/23 +120.72.164.0/22 +120.72.168.0/24 +120.72.170.0/23 +120.72.172.0/23 +120.72.174.0/24 +120.72.177.0/24 +120.72.178.0/24 +120.72.180.0/24 +120.72.182.0/23 +120.72.184.0/22 +120.72.188.0/23 +120.72.190.0/24 120.76.0.0/14 120.80.0.0/13 -120.88.8.0/21 -120.90.0.0/15 -120.92.0.0/16 +120.92.0.0/17 +120.92.128.0/18 +120.92.192.0/19 +120.92.224.0/20 120.94.0.0/15 -120.128.0.0/13 +120.130.0.0/18 +120.130.64.0/19 +120.131.0.0/19 +120.131.88.0/21 +120.131.124.0/22 +120.132.0.0/18 +120.132.64.0/19 +120.132.96.0/20 +120.132.112.0/24 +120.132.117.0/24 +120.132.118.0/23 +120.132.120.0/21 +120.132.128.0/17 +120.133.0.0/16 +120.134.0.0/15 120.136.16.0/21 -120.136.128.0/18 -120.137.0.0/17 -120.143.128.0/19 +120.136.128.0/21 +120.136.140.0/22 +120.136.144.0/20 +120.136.160.0/20 +120.136.176.0/21 +120.136.184.0/22 +120.136.188.0/23 +120.136.190.0/24 120.192.0.0/10 -121.0.8.0/21 121.0.16.0/20 121.4.0.0/15 121.8.0.0/13 121.16.0.0/12 -121.32.0.0/13 +121.32.0.0/14 +121.36.0.0/15 +121.39.255.0/24 121.40.0.0/14 -121.46.0.0/18 -121.46.76.0/22 +121.46.0.0/20 +121.46.20.0/22 121.46.128.0/21 121.46.141.0/24 -121.46.160.0/19 -121.46.192.0/18 -121.47.0.0/16 +121.46.192.0/21 +121.46.200.0/22 +121.46.224.0/20 +121.46.244.0/22 +121.46.248.0/22 +121.46.252.0/23 +121.46.254.0/24 121.48.0.0/15 -121.50.8.0/21 121.51.0.0/16 121.52.160.0/19 121.52.208.0/20 121.52.224.0/19 -121.54.176.0/21 121.55.0.0/18 121.56.0.0/15 121.58.0.0/17 -121.58.136.0/21 -121.58.144.0/20 -121.58.160.0/21 -121.59.0.0/19 -121.59.32.0/22 -121.59.36.0/23 -121.59.39.0/24 -121.59.40.0/21 -121.59.48.0/20 -121.59.64.0/19 -121.59.96.0/22 -121.59.101.0/24 -121.59.102.0/23 -121.59.104.0/23 -121.59.107.0/24 -121.59.108.0/24 -121.59.110.0/23 -121.59.112.0/21 -121.59.121.0/24 -121.59.123.0/24 -121.59.125.0/24 -121.59.126.0/23 -121.59.128.0/21 -121.59.136.0/22 -121.59.141.0/24 -121.59.142.0/23 -121.59.144.0/20 -121.59.160.0/19 -121.59.192.0/18 +121.58.156.0/22 +121.59.4.0/22 +121.59.8.0/21 121.60.0.0/14 -121.68.0.0/14 +121.69.0.0/16 +121.70.0.0/17 121.76.0.0/15 -121.79.128.0/18 +121.79.131.0/24 +121.79.132.0/24 +121.79.134.0/23 121.89.0.0/16 121.91.104.0/21 -121.100.128.0/17 -121.101.0.0/18 -121.101.208.0/20 121.192.0.0/13 -121.200.192.0/21 -121.201.0.0/16 +121.201.0.0/17 121.204.0.0/14 121.224.0.0/12 121.248.0.0/14 121.255.0.0/16 122.0.64.0/18 -122.0.128.0/17 122.4.0.0/14 -122.8.52.0/22 -122.8.57.0/24 -122.8.58.0/23 -122.8.60.0/23 -122.8.63.0/24 -122.8.68.0/22 -122.8.76.0/22 -122.8.80.0/23 -122.8.112.0/21 -122.8.124.0/22 -122.8.192.0/18 122.9.0.0/16 -122.10.129.0/24 -122.10.131.0/24 -122.10.132.0/23 +122.10.133.0/24 122.10.136.0/23 -122.10.164.0/22 -122.10.168.0/21 -122.10.176.0/20 -122.10.192.0/22 -122.10.200.0/22 -122.10.205.0/24 -122.10.206.0/23 -122.10.208.0/21 -122.10.216.0/22 -122.10.228.0/22 -122.10.232.0/21 -122.10.240.0/22 -122.11.0.0/17 -122.12.0.0/15 -122.14.0.0/17 -122.14.128.0/20 -122.14.144.0/22 -122.14.148.0/24 -122.14.150.0/23 -122.14.152.0/23 -122.14.155.0/24 -122.14.157.0/24 -122.14.158.0/23 -122.14.160.0/19 +122.11.32.0/19 +122.13.0.0/16 +122.14.44.0/22 +122.14.62.0/24 122.14.192.0/18 122.48.0.0/16 -122.49.0.0/18 +122.49.8.0/21 +122.49.16.0/20 +122.49.32.0/20 122.51.0.0/16 -122.64.0.0/11 +122.70.0.0/15 +122.72.16.0/24 +122.72.38.0/24 +122.94.0.0/16 122.96.0.0/15 -122.102.0.0/20 -122.102.64.0/19 -122.112.0.0/18 -122.112.64.0/19 -122.112.96.0/20 -122.112.112.0/21 -122.112.120.0/23 -122.112.125.0/24 -122.112.126.0/23 -122.112.128.0/17 -122.113.0.0/19 -122.113.32.0/20 -122.113.48.0/23 -122.113.51.0/24 -122.113.52.0/22 -122.113.56.0/21 -122.113.64.0/18 -122.113.128.0/17 +122.102.64.0/20 +122.112.0.0/22 +122.112.32.0/19 +122.112.132.0/22 +122.112.136.0/21 +122.112.144.0/20 +122.112.160.0/19 +122.112.192.0/18 122.114.0.0/16 -122.115.0.0/18 -122.115.64.0/22 -122.115.70.0/23 -122.115.72.0/24 -122.115.74.0/23 -122.115.76.0/22 -122.115.80.0/20 -122.115.96.0/19 -122.115.128.0/17 -122.119.0.0/16 -122.128.100.0/22 -122.128.120.0/21 +122.115.0.0/20 +122.115.32.0/19 +122.115.224.0/20 +122.119.4.0/23 +122.119.12.0/22 +122.119.20.0/22 +122.119.24.0/23 +122.119.26.0/24 +122.119.32.0/24 +122.119.50.0/24 +122.119.73.0/24 +122.119.96.0/23 +122.119.110.0/23 +122.119.112.0/23 +122.119.114.0/24 +122.119.120.0/24 +122.119.122.0/24 +122.119.124.0/23 +122.119.129.0/24 +122.119.147.0/24 +122.119.160.0/23 +122.119.172.0/24 +122.119.180.0/22 +122.119.190.0/24 +122.119.224.0/22 +122.119.232.0/23 +122.119.236.0/24 +122.119.253.0/24 122.136.0.0/13 -122.144.128.0/17 +122.144.128.0/20 +122.144.144.0/23 +122.144.147.0/24 +122.144.152.0/23 +122.144.156.0/23 +122.144.161.0/24 +122.144.164.0/22 +122.144.168.0/22 +122.144.172.0/23 +122.144.178.0/23 +122.144.180.0/22 +122.144.192.0/21 +122.144.200.0/22 +122.144.206.0/23 +122.144.208.0/23 +122.144.211.0/24 +122.144.212.0/22 +122.144.216.0/21 +122.144.232.0/22 +122.144.236.0/23 +122.144.240.0/24 +122.144.248.0/23 122.152.192.0/18 122.156.0.0/14 122.188.0.0/14 122.192.0.0/14 -122.198.0.0/16 122.200.40.0/21 -122.200.64.0/18 -122.201.48.0/20 +122.200.68.0/23 +122.200.78.0/24 +122.200.82.0/24 +122.200.84.0/23 +122.200.86.0/24 +122.200.92.0/23 +122.200.104.0/22 +122.200.120.0/22 +122.200.124.0/24 122.204.0.0/14 122.224.0.0/12 122.240.0.0/13 -122.248.24.0/21 -122.248.48.0/20 -122.255.64.0/21 -123.0.128.0/18 +122.248.48.0/21 +122.248.56.0/22 123.4.0.0/14 123.8.0.0/13 -123.49.128.0/18 123.49.192.0/23 123.49.194.0/24 -123.49.197.0/24 -123.49.198.0/23 -123.49.200.0/21 -123.49.208.0/20 -123.49.224.0/21 -123.49.232.0/22 -123.49.236.0/24 +123.49.231.0/24 123.49.240.0/24 123.49.242.0/23 -123.49.248.0/21 -123.50.160.0/19 123.52.0.0/14 123.56.0.0/15 -123.58.0.0/17 -123.58.128.0/18 +123.58.0.0/19 +123.58.32.0/23 +123.58.34.0/24 +123.58.36.0/24 +123.58.38.0/23 +123.58.40.0/21 +123.58.48.0/24 +123.58.50.0/24 +123.58.53.0/24 +123.58.54.0/23 +123.58.56.0/23 +123.58.59.0/24 +123.58.60.0/22 +123.58.64.0/24 +123.58.96.0/19 +123.58.160.0/20 +123.58.180.0/24 +123.58.182.0/23 +123.58.184.0/24 +123.58.186.0/23 +123.58.188.0/22 123.58.224.0/19 123.59.0.0/16 -123.60.0.0/15 -123.62.0.0/16 -123.64.0.0/11 +123.60.0.0/16 +123.64.0.0/15 +123.66.0.0/16 +123.77.0.0/16 +123.88.0.0/15 +123.90.0.0/16 123.96.0.0/15 -123.98.0.0/21 -123.98.12.0/22 -123.98.24.0/21 -123.98.32.0/19 -123.98.64.0/18 -123.99.128.0/19 -123.99.160.0/22 -123.99.164.0/24 -123.99.166.0/23 -123.99.168.0/21 -123.99.176.0/20 123.99.192.0/18 -123.100.0.0/19 123.101.0.0/16 -123.103.0.0/17 -123.108.88.0/23 -123.108.130.0/23 -123.108.132.0/22 -123.108.136.0/21 -123.108.208.0/20 +123.103.0.0/20 +123.103.16.0/21 +123.103.24.0/22 +123.103.28.0/23 +123.103.30.0/24 +123.103.40.0/21 +123.103.48.0/20 +123.103.64.0/18 +123.108.88.0/24 +123.108.208.0/22 +123.108.212.0/23 +123.108.220.0/22 123.112.0.0/12 123.128.0.0/13 -123.136.88.0/22 -123.137.0.0/16 123.138.0.0/15 123.144.0.0/12 123.160.0.0/12 -123.176.60.0/22 -123.176.80.0/20 123.177.0.0/16 123.178.0.0/15 123.180.0.0/14 123.184.0.0/13 -123.196.0.0/15 -123.199.128.0/17 +123.196.112.0/20 123.206.0.0/15 123.232.0.0/14 -123.242.0.0/17 123.242.192.0/21 123.244.0.0/14 -123.249.0.0/16 -123.253.52.0/23 +123.249.0.0/17 123.254.96.0/21 -124.6.64.0/18 -124.14.0.0/15 +124.14.5.0/24 +124.14.8.0/24 +124.14.12.0/24 +124.14.15.0/24 +124.14.22.0/24 +124.14.64.0/18 +124.14.224.0/19 124.16.0.0/15 -124.20.0.0/16 -124.21.32.0/19 -124.21.64.0/18 -124.21.128.0/17 124.22.0.0/15 124.28.192.0/18 124.29.0.0/17 124.31.0.0/16 -124.40.112.0/20 124.40.128.0/18 -124.40.192.0/19 -124.40.240.0/22 -124.42.0.0/16 +124.42.0.0/17 124.47.0.0/18 124.64.0.0/15 124.66.0.0/17 124.67.0.0/16 -124.68.16.0/20 -124.68.64.0/18 -124.68.176.0/20 -124.68.224.0/20 -124.68.244.0/22 -124.68.248.0/21 -124.69.0.0/16 124.70.0.0/16 124.71.0.0/17 124.71.128.0/18 124.71.192.0/19 124.71.224.0/20 -124.71.240.0/21 -124.71.250.0/23 -124.71.254.0/23 +124.71.250.0/24 124.72.0.0/13 124.88.0.0/13 -124.108.8.0/21 -124.108.40.0/21 -124.109.96.0/21 124.112.0.0/13 124.126.0.0/15 124.128.0.0/13 -124.147.128.0/17 -124.150.137.0/24 124.151.0.0/16 124.152.0.0/16 124.160.0.0/13 124.172.0.0/14 124.192.0.0/15 -124.196.0.0/16 -124.197.56.0/21 -124.200.0.0/13 +124.196.12.0/23 +124.196.25.0/24 +124.196.26.0/23 +124.196.28.0/24 +124.196.30.0/23 +124.196.32.0/23 +124.196.40.0/22 +124.196.48.0/22 +124.196.52.0/23 +124.196.55.0/24 +124.196.56.0/23 +124.196.58.0/24 +124.196.66.0/24 +124.196.72.0/24 +124.196.77.0/24 +124.196.80.0/22 +124.196.84.0/23 +124.200.0.0/16 +124.201.0.0/17 +124.202.0.0/16 +124.203.176.0/20 +124.204.0.0/14 124.220.0.0/14 124.224.0.0/12 124.240.0.0/17 124.240.128.0/18 -124.242.0.0/16 124.243.192.0/18 -124.248.0.0/17 -124.249.0.0/16 +124.248.64.0/18 124.250.0.0/15 124.254.0.0/18 -125.31.192.0/18 125.32.0.0/12 125.58.128.0/17 -125.61.128.0/17 125.62.0.0/18 -125.64.0.0/12 -125.80.0.0/13 -125.88.0.0/14 -125.92.0.0/16 -125.93.0.0/20 -125.93.16.0/21 -125.93.24.0/23 -125.93.26.0/24 -125.93.28.0/22 -125.93.32.0/19 -125.93.64.0/18 -125.93.128.0/17 -125.94.0.0/15 -125.96.0.0/15 -125.98.0.0/16 +125.64.0.0/11 +125.98.122.0/23 +125.98.128.0/17 125.104.0.0/13 125.112.0.0/12 -125.169.0.0/16 125.171.0.0/16 -125.208.0.0/18 +125.208.0.0/19 +125.208.32.0/20 +125.208.49.0/24 125.210.0.0/15 -125.213.0.0/17 +125.213.32.0/20 125.214.96.0/19 -125.215.0.0/18 +125.215.36.0/23 +125.215.40.0/24 +125.215.44.0/23 +125.215.48.0/24 +125.215.52.0/23 +125.215.54.0/24 125.216.0.0/13 -125.254.128.0/17 +125.254.128.0/19 +125.254.168.0/21 +125.254.176.0/21 +128.107.24.0/23 128.108.0.0/16 129.28.0.0/16 129.204.0.0/16 129.211.0.0/16 +130.36.146.0/23 +131.228.96.0/23 132.232.0.0/16 132.237.134.0/24 -134.49.240.0/22 +133.226.32.0/20 134.175.0.0/16 -137.59.59.0/24 -137.59.88.0/22 138.252.72.0/23 -138.252.78.0/23 -138.252.96.0/24 -138.252.118.0/23 -138.252.162.0/23 -139.5.56.0/21 -139.5.80.0/22 -139.5.92.0/22 -139.5.128.0/22 -139.5.160.0/22 -139.5.192.0/22 -139.5.204.0/22 -139.5.212.0/22 -139.5.244.0/22 -139.9.0.0/16 +139.5.60.0/22 +139.9.0.0/18 +139.9.64.0/19 +139.9.96.0/23 +139.9.98.0/24 +139.9.100.0/22 +139.9.104.0/21 +139.9.112.0/20 +139.9.128.0/18 +139.9.192.0/19 +139.9.224.0/20 +139.9.240.0/21 +139.9.248.0/22 139.129.0.0/16 139.148.0.0/16 139.155.0.0/16 139.159.0.0/19 -139.159.32.0/21 -139.159.40.0/22 -139.159.52.0/22 -139.159.56.0/21 -139.159.64.0/19 +139.159.32.0/22 139.159.96.0/20 139.159.112.0/22 -139.159.116.0/23 -139.159.120.0/21 -139.159.128.0/17 +139.159.132.0/22 +139.159.136.0/21 +139.159.144.0/20 +139.159.160.0/19 +139.159.192.0/18 139.170.0.0/16 -139.176.0.0/16 -139.183.0.0/18 -139.183.64.0/19 -139.183.96.0/22 -139.183.101.0/24 -139.183.102.0/23 -139.183.104.0/21 -139.183.112.0/20 -139.183.128.0/18 -139.183.192.0/20 -139.183.208.0/23 -139.183.211.0/24 -139.183.212.0/22 -139.183.216.0/21 -139.183.224.0/19 139.186.0.0/16 -139.189.0.0/18 -139.189.64.0/19 -139.189.96.0/20 -139.189.112.0/21 -139.189.120.0/22 -139.189.124.0/23 -139.189.126.0/24 -139.189.128.0/17 -139.196.0.0/15 -139.198.0.0/18 -139.198.66.0/23 -139.198.68.0/22 -139.198.72.0/21 -139.198.80.0/20 -139.198.96.0/19 -139.198.128.0/17 -139.199.0.0/16 +139.189.0.0/16 +139.196.0.0/16 +139.198.0.0/15 139.200.0.0/13 139.208.0.0/13 139.217.0.0/16 139.219.0.0/16 -139.220.0.0/15 +139.220.192.0/22 +139.220.240.0/22 139.224.0.0/16 139.226.0.0/15 140.75.0.0/16 @@ -3985,14 +2630,30 @@ 140.179.0.0/16 140.205.0.0/16 140.206.0.0/15 -140.210.0.0/20 -140.210.16.0/21 -140.210.24.0/22 -140.210.28.0/23 -140.210.30.0/24 -140.210.32.0/19 -140.210.64.0/18 -140.210.128.0/17 +140.210.0.0/24 +140.210.4.0/22 +140.210.8.0/21 +140.210.16.0/20 +140.210.32.0/22 +140.210.65.0/24 +140.210.67.0/24 +140.210.69.0/24 +140.210.70.0/24 +140.210.72.0/23 +140.210.75.0/24 +140.210.77.0/24 +140.210.78.0/23 +140.210.80.0/24 +140.210.83.0/24 +140.210.84.0/24 +140.210.87.0/24 +140.210.88.0/22 +140.210.92.0/24 +140.210.94.0/24 +140.210.96.0/19 +140.210.128.0/19 +140.210.192.0/19 +140.210.224.0/20 140.224.0.0/16 140.237.0.0/16 140.240.0.0/16 @@ -4001,28 +2662,18 @@ 140.249.0.0/16 140.250.0.0/16 140.255.0.0/16 -142.86.192.0/18 143.64.0.0/16 144.0.0.0/16 -144.7.0.0/16 +144.7.0.0/17 144.12.0.0/16 -144.36.147.0/24 +144.36.146.0/23 144.48.64.0/22 -144.48.88.0/22 -144.48.156.0/22 -144.48.180.0/22 -144.48.184.0/22 -144.48.204.0/22 -144.48.208.0/21 +144.48.212.0/22 144.52.0.0/16 -144.79.4.0/23 -144.79.10.0/23 -144.79.28.0/23 -144.79.42.0/23 144.79.54.0/23 -144.79.84.0/23 -144.79.148.0/23 144.123.0.0/16 +144.225.109.0/24 +144.225.151.0/24 144.255.0.0/16 145.14.71.0/24 145.14.72.0/22 @@ -4035,57 +2686,31 @@ 146.56.192.0/18 146.196.56.0/22 146.196.68.0/22 -146.196.72.0/22 -146.196.92.0/22 146.196.112.0/21 -146.196.124.0/22 146.222.79.0/24 146.222.81.0/24 146.222.94.0/24 -147.78.132.0/24 -147.78.134.0/24 +147.78.132.0/22 148.70.0.0/16 -149.41.0.0/16 -150.0.0.0/16 -150.115.0.0/16 -150.121.0.0/16 -150.122.0.0/16 150.129.136.0/22 150.129.192.0/22 150.129.252.0/22 150.138.0.0/15 150.158.0.0/16 150.223.0.0/16 -150.242.0.0/21 -150.242.8.0/22 -150.242.28.0/22 -150.242.44.0/22 -150.242.48.0/21 150.242.56.0/22 150.242.76.0/22 150.242.80.0/22 -150.242.92.0/22 150.242.96.0/22 -150.242.112.0/21 -150.242.120.0/22 -150.242.152.0/22 150.242.156.0/23 -150.242.160.0/21 150.242.168.0/22 -150.242.184.0/21 -150.242.192.0/22 -150.242.212.0/24 -150.242.215.0/24 -150.242.224.0/22 -150.242.232.0/21 -150.242.240.0/21 +150.242.184.0/22 +150.242.232.0/22 +150.242.238.0/23 +150.242.244.0/22 150.242.248.0/22 -150.248.0.0/16 150.255.0.0/16 -151.158.14.0/23 -151.158.78.0/23 -151.158.80.0/23 -151.158.122.0/23 +151.243.189.0/24 152.104.128.0/17 152.136.0.0/16 153.0.0.0/16 @@ -4095,236 +2720,134 @@ 153.99.0.0/16 153.101.0.0/16 153.118.0.0/15 +154.8.48.0/20 154.8.128.0/17 +154.72.42.0/24 154.72.44.0/24 154.72.47.0/24 +154.89.32.0/20 +154.197.128.0/17 155.126.176.0/23 156.107.160.0/23 156.107.170.0/24 156.107.179.0/24 156.107.181.0/24 +156.224.128.0/17 +156.227.239.0/24 +156.232.9.0/24 +156.232.10.0/23 +156.242.5.0/24 157.0.0.0/16 -157.10.34.0/23 -157.10.36.0/23 +157.10.35.0/24 157.10.112.0/23 -157.10.118.0/23 -157.10.130.0/23 -157.10.218.0/23 -157.10.220.0/23 -157.10.246.0/23 -157.15.74.0/23 157.15.94.0/23 -157.15.100.0/22 157.15.104.0/23 157.18.0.0/16 -157.20.136.0/23 -157.20.194.0/23 157.20.246.0/23 157.61.0.0/16 -157.66.42.0/23 -157.66.70.0/23 -157.66.88.0/21 157.66.164.0/23 -157.66.244.0/23 -157.119.8.0/21 -157.119.16.0/22 157.119.28.0/22 -157.119.132.0/22 -157.119.136.0/21 -157.119.144.0/20 -157.119.160.0/21 157.119.172.0/22 -157.119.192.0/21 -157.119.240.0/22 157.119.252.0/22 157.122.0.0/16 157.148.0.0/16 157.156.0.0/16 157.255.0.0/16 -158.60.0.0/16 -158.79.0.0/16 +158.26.192.0/24 +158.26.194.0/24 158.140.252.0/23 158.140.255.0/24 159.27.0.0/16 159.75.0.0/16 159.226.0.0/16 160.19.76.0/23 -160.19.82.0/23 -160.19.208.0/21 -160.19.216.0/22 -160.20.16.0/22 -160.20.48.0/22 -160.20.130.0/23 -160.22.58.0/23 -160.22.82.0/23 -160.22.148.0/23 -160.22.188.0/23 -160.22.224.0/23 -160.22.230.0/23 -160.22.244.0/22 -160.25.10.0/23 -160.25.12.0/23 +160.19.208.0/23 +160.19.210.0/24 +160.20.18.0/23 +160.22.188.0/24 160.25.194.0/23 -160.30.40.0/23 -160.30.194.0/23 -160.30.196.0/22 160.30.230.0/23 160.83.110.0/24 -160.187.223.0/24 -160.187.252.0/22 -160.191.0.0/23 -160.191.104.0/23 -160.191.110.0/23 -160.202.60.0/23 -160.202.62.0/24 -160.202.148.0/22 +160.187.128.0/23 +160.191.0.0/24 +160.191.195.0/24 160.202.152.0/22 160.202.212.0/22 -160.202.216.0/21 160.202.224.0/19 -160.236.78.0/23 -160.236.148.0/23 -160.236.162.0/23 -160.236.235.0/24 -160.236.250.0/23 160.250.14.0/23 -160.250.16.0/22 160.250.84.0/23 -160.250.90.0/23 -160.250.102.0/23 -160.250.104.0/23 -160.250.160.0/23 -160.250.170.0/23 -160.250.214.0/23 -160.250.252.0/23 161.163.0.0/21 161.163.28.0/23 161.189.0.0/16 161.207.0.0/16 -161.248.20.0/23 -161.248.42.0/23 -161.248.92.0/23 -161.248.110.0/23 -161.248.112.0/24 -161.248.136.0/24 -162.4.54.0/23 -162.4.168.0/23 -162.4.198.0/23 -162.4.202.0/23 -162.4.230.0/23 -162.14.0.0/19 -162.14.32.0/21 -162.14.43.0/24 -162.14.44.0/22 -162.14.52.0/22 -162.14.56.0/22 -162.14.64.0/18 -162.14.128.0/17 +162.14.0.0/16 162.105.0.0/16 163.0.0.0/16 163.47.4.0/22 -163.52.28.0/23 -163.52.76.0/23 -163.52.108.0/23 -163.53.0.0/20 -163.53.36.0/22 -163.53.40.0/21 -163.53.48.0/20 -163.53.64.0/22 +163.53.44.0/23 +163.53.60.0/22 163.53.88.0/21 -163.53.96.0/19 -163.53.128.0/21 -163.53.136.0/22 -163.53.160.0/20 -163.53.188.0/22 -163.53.240.0/22 -163.61.63.0/24 +163.53.128.0/22 +163.53.168.0/22 163.61.178.0/23 163.61.202.0/23 163.61.214.0/23 163.125.0.0/16 -163.128.30.0/23 -163.128.152.0/23 -163.128.236.0/23 -163.128.254.0/23 163.142.0.0/16 163.177.0.0/16 163.179.0.0/16 163.204.0.0/16 -163.223.28.0/23 -163.223.32.0/23 -163.223.72.0/23 -163.223.124.0/23 -163.223.217.0/24 -163.223.222.0/23 -163.227.34.0/23 163.227.40.0/23 -163.227.74.0/23 -163.227.76.0/22 -163.227.80.0/23 163.228.0.0/16 163.244.246.0/24 -164.52.5.0/24 -164.52.61.0/24 -164.52.66.0/24 -164.52.75.0/24 -164.52.78.0/24 -164.52.85.0/24 -164.52.99.0/24 -165.101.4.0/23 -165.101.66.0/23 165.101.70.0/24 -165.101.144.0/23 -165.101.170.0/23 165.101.208.0/23 -165.101.244.0/23 166.111.0.0/16 167.139.0.0/16 -167.189.0.0/16 167.220.244.0/22 -168.160.0.0/16 -170.179.0.0/16 +168.160.0.0/17 +168.160.152.0/24 +168.160.158.0/23 +168.160.160.0/21 +168.160.168.0/24 171.8.0.0/13 171.34.0.0/15 171.36.0.0/14 -171.40.0.0/13 +171.40.0.0/14 +171.44.0.0/16 171.80.0.0/12 171.104.0.0/13 171.112.0.0/12 171.208.0.0/12 172.81.192.0/18 +173.39.200.0/23 175.0.0.0/12 175.16.0.0/13 -175.24.0.0/14 +175.24.0.0/15 +175.27.0.0/16 175.30.0.0/15 175.42.0.0/15 175.44.0.0/16 175.46.0.0/15 -175.48.0.0/12 -175.64.0.0/11 -175.102.0.0/16 -175.106.128.0/17 -175.111.144.0/20 -175.111.160.0/20 -175.111.184.0/22 +175.102.0.0/19 +175.102.128.0/21 +175.102.178.0/23 +175.102.180.0/22 +175.102.184.0/24 +175.102.196.0/24 175.146.0.0/15 175.148.0.0/14 175.152.0.0/14 -175.158.96.0/22 +175.158.112.0/20 175.160.0.0/12 -175.176.156.0/22 -175.176.176.0/22 -175.176.188.0/22 175.178.0.0/16 175.184.128.0/18 175.185.0.0/16 175.186.0.0/15 -175.188.0.0/14 -177.201.160.0/19 -177.203.96.0/19 -177.203.224.0/19 -178.236.234.0/24 -179.236.0.0/19 +175.188.188.0/22 +175.190.24.0/21 +175.190.126.0/23 +178.253.252.0/24 180.76.16.0/20 180.76.32.0/19 180.76.64.0/18 @@ -4332,59 +2855,79 @@ 180.77.0.0/16 180.78.0.0/15 180.84.0.0/15 -180.86.0.0/16 -180.88.0.0/14 -180.94.56.0/21 -180.94.96.0/20 -180.94.120.0/21 +180.88.96.0/19 +180.88.128.0/18 +180.89.56.0/22 +180.89.60.0/23 +180.89.64.0/19 +180.91.192.0/20 +180.92.176.0/24 180.95.128.0/17 180.96.0.0/11 180.129.128.0/17 180.130.0.0/16 180.136.0.0/13 -180.148.16.0/21 -180.148.152.0/21 -180.148.216.0/21 -180.148.224.0/19 180.149.128.0/19 -180.150.160.0/19 +180.150.176.0/20 180.152.0.0/13 180.160.0.0/12 -180.178.112.0/21 -180.178.192.0/18 -180.184.0.0/14 -180.188.0.0/17 -180.189.148.0/22 +180.178.208.0/20 +180.178.224.0/21 +180.178.232.0/22 +180.178.248.0/21 +180.184.0.0/21 +180.184.8.0/23 +180.184.14.0/24 +180.184.16.0/24 +180.184.24.0/21 +180.184.32.0/19 +180.184.64.0/18 +180.184.128.0/20 +180.184.144.0/21 +180.184.152.0/22 +180.184.160.0/20 +180.184.176.0/21 +180.184.184.0/22 +180.184.190.0/23 +180.184.192.0/18 +180.186.38.0/23 +180.186.40.0/22 +180.186.44.0/24 +180.188.16.0/20 +180.188.32.0/20 180.200.252.0/22 180.201.0.0/16 -180.202.0.0/15 +180.203.0.0/23 +180.203.3.0/24 +180.203.4.0/24 180.208.0.0/15 180.210.212.0/22 180.212.0.0/15 -180.222.224.0/19 180.233.0.0/18 -180.233.64.0/19 -180.233.144.0/22 -180.235.64.0/19 -180.235.112.0/22 -182.16.144.0/21 -182.16.192.0/19 -182.18.0.0/17 -182.23.184.0/21 -182.23.200.0/21 +180.235.64.0/21 +180.235.72.0/23 +182.18.5.0/24 +182.18.32.0/19 +182.18.72.0/21 +182.18.80.0/20 +182.18.96.0/19 182.32.0.0/12 -182.48.96.0/19 -182.49.0.0/16 -182.50.0.0/22 -182.50.6.0/24 +182.48.96.0/20 +182.48.112.0/21 182.50.8.0/21 182.50.112.0/20 -182.51.0.0/16 +182.51.114.0/23 +182.51.116.0/23 +182.51.118.0/24 +182.51.122.0/23 +182.51.124.0/24 182.54.0.0/17 -182.54.244.0/22 -182.61.0.0/17 +182.61.0.0/18 182.61.128.0/19 -182.61.192.0/18 +182.61.192.0/22 +182.61.200.0/21 +182.61.208.0/20 +182.61.224.0/19 182.80.0.0/13 182.88.0.0/14 182.92.0.0/16 @@ -4392,34 +2935,21 @@ 182.128.0.0/12 182.144.0.0/13 182.157.0.0/16 -182.160.64.0/19 182.174.0.0/15 182.200.0.0/13 -182.236.128.0/17 -182.237.24.0/21 -182.238.0.0/16 -182.239.0.0/19 182.240.0.0/13 182.254.0.0/16 -182.255.60.0/22 183.0.0.0/10 183.64.0.0/13 -183.78.160.0/21 183.78.180.0/22 -183.81.172.0/24 183.81.180.0/22 183.84.0.0/15 -183.91.37.0/24 183.91.39.0/24 183.91.40.0/21 -183.91.48.0/23 -183.91.50.0/24 -183.91.52.0/22 +183.91.48.0/21 183.91.56.0/24 183.91.61.0/24 183.91.63.0/24 -183.91.128.0/22 -183.91.136.0/21 183.91.144.0/20 183.92.0.0/14 183.128.0.0/11 @@ -4427,42 +2957,28 @@ 183.168.0.0/15 183.170.0.0/16 183.172.0.0/14 -183.182.0.0/21 -183.182.8.0/23 -183.182.11.0/24 -183.182.12.0/22 -183.182.16.0/23 -183.182.23.0/24 -183.182.24.0/21 183.184.0.0/13 183.192.0.0/10 -185.2.48.0/24 -185.2.51.0/24 185.75.173.0/24 185.75.174.0/24 -185.192.56.0/22 +185.80.200.0/22 +185.183.84.0/24 +185.194.148.0/24 +185.201.226.0/23 188.131.128.0/17 -192.51.172.0/23 -192.55.46.0/23 -192.55.68.0/22 -192.102.204.0/22 -192.124.154.0/24 -192.140.128.0/21 -192.140.136.0/22 -192.140.156.0/22 +192.6.161.0/24 +192.6.243.0/24 192.140.160.0/19 -192.140.192.0/20 192.140.208.0/21 192.144.128.0/17 192.163.11.0/24 -192.232.34.0/23 -192.232.44.0/22 192.232.97.0/24 +193.9.44.0/24 +193.9.46.0/24 193.112.0.0/16 -193.119.0.0/19 +194.127.229.0/24 194.138.202.0/23 194.138.245.0/24 -198.175.100.0/22 198.208.17.0/24 198.208.19.0/24 198.208.30.0/24 @@ -4472,1140 +2988,179 @@ 198.208.112.0/23 199.182.239.0/24 199.244.144.0/24 -202.0.100.0/23 -202.0.122.0/23 -202.0.176.0/23 -202.0.178.0/24 -202.3.128.0/23 +202.1.86.0/23 +202.1.90.0/23 +202.1.110.0/23 +202.1.112.0/23 202.4.128.0/19 202.4.252.0/22 -202.5.208.0/21 -202.5.216.0/22 -202.6.6.0/23 -202.6.66.0/23 -202.6.72.0/23 -202.6.87.0/24 -202.6.88.0/23 -202.6.92.0/23 -202.6.103.0/24 -202.6.108.0/24 -202.6.110.0/23 -202.6.114.0/24 -202.6.176.0/20 202.6.202.0/23 -202.8.0.0/24 -202.8.2.0/23 -202.8.4.0/23 -202.8.12.0/24 -202.8.24.0/24 -202.8.77.0/24 -202.8.128.0/19 -202.8.192.0/20 -202.9.32.0/24 -202.9.34.0/23 -202.9.48.0/23 -202.9.51.0/24 -202.9.52.0/23 -202.9.54.0/24 -202.9.57.0/24 -202.9.58.0/23 -202.10.64.0/20 -202.10.112.0/20 -202.12.1.0/24 -202.12.2.0/24 -202.12.17.0/24 -202.12.18.0/24 -202.12.72.0/24 -202.12.84.0/23 -202.12.96.0/24 -202.12.98.0/23 -202.12.106.0/24 -202.12.111.0/24 -202.12.116.0/24 -202.14.64.0/23 -202.14.69.0/24 -202.14.73.0/24 -202.14.74.0/23 -202.14.76.0/24 -202.14.78.0/23 -202.14.88.0/24 -202.14.97.0/24 -202.14.104.0/23 -202.14.108.0/23 -202.14.111.0/24 -202.14.114.0/23 -202.14.118.0/23 -202.14.124.0/23 -202.14.127.0/24 -202.14.129.0/24 -202.14.135.0/24 -202.14.136.0/24 -202.14.149.0/24 -202.14.151.0/24 -202.14.157.0/24 -202.14.158.0/23 -202.14.169.0/24 -202.14.170.0/23 -202.14.172.0/22 -202.14.176.0/24 -202.14.184.0/23 -202.14.208.0/23 -202.14.213.0/24 -202.14.219.0/24 -202.14.220.0/24 -202.14.222.0/23 -202.14.225.0/24 -202.14.226.0/23 -202.14.231.0/24 202.14.235.0/24 -202.14.236.0/22 -202.14.246.0/24 -202.14.251.0/24 -202.20.66.0/24 -202.20.79.0/24 -202.20.87.0/24 -202.20.88.0/23 -202.20.90.0/24 -202.20.94.0/23 -202.20.114.0/24 -202.20.117.0/24 -202.20.120.0/24 -202.20.125.0/24 -202.20.126.0/23 -202.21.48.0/20 -202.21.131.0/24 -202.21.132.0/24 -202.21.141.0/24 -202.21.142.0/24 -202.21.147.0/24 -202.21.148.0/24 -202.21.150.0/23 -202.21.152.0/23 -202.21.154.0/24 -202.21.156.0/24 -202.22.248.0/21 -202.27.12.0/24 -202.27.14.0/24 -202.27.136.0/23 -202.36.226.0/24 -202.38.0.0/22 +202.14.236.0/23 +202.14.238.0/24 +202.30.124.0/24 202.38.8.0/21 -202.38.48.0/20 202.38.64.0/18 -202.38.128.0/21 -202.38.136.0/23 -202.38.140.0/22 -202.38.146.0/23 -202.38.149.0/24 -202.38.150.0/23 -202.38.152.0/22 -202.38.156.0/24 -202.38.158.0/23 +202.38.128.0/23 +202.38.132.0/23 +202.38.134.0/24 +202.38.140.0/23 +202.38.152.0/23 202.38.164.0/22 -202.38.168.0/23 -202.38.170.0/24 -202.38.176.0/23 202.38.184.0/21 202.38.192.0/18 -202.40.4.0/23 -202.40.7.0/24 -202.40.15.0/24 -202.40.135.0/24 -202.40.136.0/24 -202.40.140.0/24 -202.40.143.0/24 -202.40.144.0/23 -202.40.150.0/24 -202.40.155.0/24 -202.40.156.0/24 -202.40.158.0/23 -202.40.162.0/24 -202.41.8.0/23 -202.41.11.0/24 -202.41.12.0/23 -202.41.128.0/24 -202.41.130.0/23 202.41.152.0/21 -202.41.192.0/24 -202.41.196.0/22 -202.41.200.0/22 202.41.240.0/20 -202.43.76.0/22 -202.43.144.0/20 -202.44.16.0/20 -202.44.48.0/22 -202.44.67.0/24 -202.44.74.0/24 -202.44.97.0/24 -202.44.129.0/24 -202.44.132.0/23 -202.44.146.0/23 -202.45.0.0/23 -202.45.2.0/24 -202.45.15.0/24 -202.45.16.0/20 -202.46.16.0/23 -202.46.18.0/24 -202.46.20.0/23 -202.46.35.0/24 -202.46.36.0/23 -202.46.38.0/24 -202.46.40.0/24 -202.46.43.0/24 -202.46.44.0/24 -202.46.46.0/23 -202.46.128.0/24 -202.46.224.0/20 -202.47.82.0/23 -202.47.96.0/20 -202.47.126.0/24 -202.47.128.0/24 -202.47.130.0/23 -202.52.33.0/24 -202.52.34.0/24 -202.52.47.0/24 -202.52.143.0/24 -202.53.140.0/24 -202.53.143.0/24 -202.55.0.0/23 -202.55.4.0/24 -202.55.18.0/23 -202.55.20.0/22 -202.55.24.0/22 -202.55.28.0/23 -202.55.31.0/24 -202.57.192.0/20 -202.57.212.0/22 -202.57.216.0/22 -202.57.240.0/20 -202.58.0.0/24 -202.58.112.0/22 -202.58.122.0/23 -202.59.0.0/23 -202.59.212.0/22 -202.59.236.0/24 -202.59.240.0/24 -202.60.48.0/21 -202.60.96.0/21 +202.46.224.0/22 +202.46.228.0/23 +202.46.232.0/23 +202.47.104.0/21 +202.51.32.0/20 +202.55.0.0/19 +202.57.192.0/24 +202.57.196.0/22 +202.57.200.0/23 +202.57.204.0/23 +202.59.213.0/24 +202.59.214.0/23 202.60.112.0/20 202.60.132.0/22 -202.60.136.0/21 -202.60.144.0/20 -202.61.68.0/22 -202.61.76.0/22 202.61.88.0/22 -202.61.123.0/24 -202.61.127.0/24 202.62.112.0/22 -202.62.248.0/22 -202.62.252.0/24 -202.62.255.0/24 -202.63.80.0/20 -202.63.160.0/19 -202.63.248.0/22 -202.63.253.0/24 -202.65.0.0/21 -202.65.8.0/23 -202.65.96.0/20 -202.66.169.0/24 -202.66.170.0/23 -202.67.0.0/22 +202.63.160.0/20 +202.65.96.0/24 +202.67.3.0/24 202.69.4.0/23 202.69.16.0/20 -202.70.0.0/19 -202.70.96.0/20 -202.70.192.0/20 -202.71.32.0/20 -202.72.40.0/21 -202.72.80.0/20 202.72.112.0/20 202.73.128.0/22 +202.73.208.0/20 202.73.240.0/20 -202.74.8.0/21 -202.74.36.0/24 -202.74.42.0/24 -202.74.52.0/24 -202.74.80.0/20 -202.74.254.0/23 202.75.208.0/20 -202.75.252.0/22 -202.76.252.0/22 -202.77.80.0/21 -202.77.92.0/22 -202.78.8.0/21 -202.79.224.0/21 -202.79.248.0/22 -202.80.192.0/20 -202.81.0.0/22 +202.75.248.0/22 +202.80.192.0/22 202.81.176.0/20 -202.83.252.0/22 -202.84.0.0/20 -202.84.16.0/23 -202.84.22.0/24 -202.84.24.0/21 +202.84.17.0/24 202.85.208.0/20 -202.86.249.0/24 -202.86.252.0/22 -202.87.80.0/20 -202.88.32.0/22 -202.89.8.0/21 -202.89.96.0/22 -202.89.108.0/22 -202.89.119.0/24 +202.89.96.0/24 202.89.232.0/21 -202.90.16.0/20 -202.90.37.0/24 -202.90.96.0/19 -202.90.193.0/24 -202.90.196.0/24 -202.90.205.0/24 -202.90.224.0/20 -202.91.0.0/22 -202.91.96.0/20 -202.91.176.0/20 -202.91.224.0/19 -202.92.8.0/21 -202.92.48.0/20 -202.92.252.0/22 +202.90.20.0/22 +202.90.96.0/20 +202.91.176.0/21 +202.91.184.0/23 +202.91.186.0/24 +202.91.190.0/23 +202.91.224.0/20 +202.91.240.0/21 +202.91.248.0/22 202.93.252.0/22 -202.94.74.0/24 -202.94.81.0/24 -202.94.92.0/22 -202.95.0.0/24 -202.95.2.0/23 -202.95.24.0/21 -202.95.240.0/21 -202.96.0.0/12 +202.95.0.0/19 +202.96.0.0/13 +202.104.0.0/14 +202.108.0.0/15 +202.110.0.0/16 +202.111.0.0/17 +202.111.128.0/18 +202.111.192.0/19 +202.111.230.0/24 +202.111.240.0/23 +202.111.242.0/24 +202.111.244.0/22 +202.111.248.0/24 202.112.0.0/13 202.120.0.0/15 -202.122.0.0/21 202.122.32.0/21 -202.122.64.0/19 -202.122.112.0/20 -202.122.132.0/24 -202.123.96.0/20 -202.123.116.0/22 -202.123.120.0/22 -202.124.16.0/21 -202.124.24.0/22 -202.125.107.0/24 -202.125.109.0/24 -202.125.112.0/20 +202.122.112.0/21 +202.123.96.0/24 +202.123.98.0/24 +202.123.106.0/23 +202.123.108.0/24 +202.123.110.0/23 202.125.176.0/20 202.127.0.0/21 202.127.12.0/22 202.127.16.0/20 202.127.40.0/21 -202.127.48.0/20 -202.127.112.0/20 -202.127.128.0/19 -202.127.192.0/20 -202.127.212.0/22 -202.127.216.0/21 +202.127.48.0/23 +202.127.144.0/20 +202.127.192.0/24 +202.127.200.0/21 202.127.224.0/19 -202.129.208.0/24 202.130.0.0/19 -202.130.39.0/24 -202.130.224.0/19 -202.131.16.0/21 -202.131.48.0/20 -202.131.208.0/20 -202.133.32.0/20 -202.134.58.0/24 -202.134.128.0/20 -202.134.208.0/20 +202.130.224.0/20 +202.130.240.0/21 202.136.48.0/20 202.136.72.0/23 -202.136.80.0/23 -202.136.208.0/20 -202.136.224.0/20 -202.136.248.0/22 +202.136.208.0/21 +202.136.216.0/23 +202.136.218.0/24 +202.136.220.0/24 +202.136.222.0/23 202.136.255.0/24 -202.137.231.0/24 202.140.140.0/22 -202.140.144.0/20 202.141.160.0/19 202.142.16.0/20 -202.143.4.0/22 -202.143.16.0/20 -202.143.32.0/20 -202.143.56.0/21 +202.143.16.0/23 202.143.100.0/22 -202.143.104.0/22 -202.144.196.0/23 -202.144.198.0/24 -202.146.160.0/20 -202.146.184.0/23 -202.146.186.0/24 -202.146.188.0/22 -202.146.196.0/22 -202.146.200.0/21 -202.147.144.0/20 -202.148.32.0/20 -202.148.64.0/18 -202.149.32.0/19 -202.149.160.0/19 +202.148.96.0/19 202.149.224.0/20 -202.149.240.0/21 -202.149.248.0/22 -202.149.252.0/23 -202.149.255.0/24 202.150.16.0/20 -202.150.32.0/20 -202.150.56.0/22 -202.150.192.0/20 -202.150.224.0/19 -202.151.0.0/22 -202.151.33.0/24 -202.151.128.0/19 -202.152.176.0/20 -202.153.0.0/22 -202.153.7.0/24 202.153.48.0/20 -202.157.192.0/19 202.158.160.0/19 -202.158.242.0/24 -202.160.140.0/23 -202.160.143.0/24 -202.160.156.0/22 -202.162.67.0/24 -202.162.75.0/24 +202.160.140.0/22 202.164.0.0/20 -202.164.96.0/19 -202.165.176.0/20 -202.165.208.0/21 -202.165.239.0/24 -202.165.240.0/23 -202.165.243.0/24 -202.165.245.0/24 -202.165.251.0/24 -202.165.252.0/22 -202.166.224.0/19 -202.168.80.0/22 -202.168.128.0/20 202.168.160.0/19 202.170.128.0/19 202.170.216.0/21 -202.170.224.0/19 -202.171.216.0/21 -202.171.232.0/24 -202.171.235.0/24 -202.172.0.0/22 -202.172.7.0/24 -202.173.0.0/22 -202.173.6.0/24 -202.173.8.0/21 -202.173.112.0/22 +202.173.8.0/22 +202.173.14.0/23 202.173.224.0/19 -202.174.64.0/20 -202.174.124.0/22 -202.176.224.0/19 -202.179.160.0/20 -202.179.240.0/21 -202.180.128.0/19 -202.180.208.0/21 -202.181.8.0/22 -202.181.28.0/22 -202.181.112.0/20 -202.182.32.0/20 -202.182.192.0/19 -202.189.0.0/18 -202.189.80.0/20 -202.189.184.0/21 -202.191.0.0/24 -202.191.68.0/22 -202.191.72.0/21 -202.191.80.0/20 +202.179.240.0/20 +202.181.28.0/24 +202.181.120.0/21 +202.189.3.0/24 +202.189.4.0/22 +202.189.8.0/21 +202.189.16.0/21 202.192.0.0/12 -203.0.4.0/22 -203.0.10.0/23 -203.0.18.0/24 -203.0.24.0/24 -203.0.42.0/23 -203.0.45.0/24 -203.0.46.0/23 -203.0.81.0/24 -203.0.82.0/23 -203.0.90.0/23 -203.0.96.0/23 203.0.104.0/21 -203.0.114.0/23 -203.0.122.0/24 -203.0.128.0/24 -203.0.130.0/23 -203.0.132.0/22 -203.0.137.0/24 -203.0.142.0/24 -203.0.144.0/24 -203.0.146.0/24 -203.0.148.0/24 -203.0.150.0/23 -203.0.152.0/24 -203.0.177.0/24 -203.0.224.0/24 -203.1.4.0/22 -203.1.18.0/24 -203.1.26.0/23 -203.1.65.0/24 -203.1.66.0/23 -203.1.70.0/23 -203.1.76.0/23 -203.1.90.0/24 -203.1.97.0/24 -203.1.98.0/23 -203.1.100.0/22 -203.1.108.0/24 -203.1.253.0/24 -203.1.254.0/24 +203.0.250.0/23 203.2.64.0/21 -203.2.73.0/24 203.2.112.0/21 -203.2.126.0/23 -203.2.140.0/24 -203.2.150.0/24 -203.2.152.0/22 -203.2.156.0/23 203.2.160.0/21 -203.2.180.0/23 -203.2.196.0/23 -203.2.209.0/24 -203.2.214.0/23 -203.2.226.0/23 -203.2.229.0/24 -203.2.236.0/23 -203.3.68.0/24 -203.3.72.0/23 -203.3.75.0/24 203.3.80.0/21 -203.3.96.0/22 -203.3.105.0/24 203.3.112.0/21 -203.3.120.0/24 -203.3.123.0/24 -203.3.135.0/24 -203.3.139.0/24 -203.3.143.0/24 -203.4.132.0/23 -203.4.134.0/24 -203.4.151.0/24 -203.4.152.0/22 -203.4.174.0/23 -203.4.180.0/24 -203.4.186.0/24 -203.4.205.0/24 -203.4.208.0/22 -203.4.227.0/24 -203.4.230.0/23 -203.5.4.0/23 -203.5.7.0/24 -203.5.8.0/23 -203.5.11.0/24 -203.5.21.0/24 -203.5.22.0/24 -203.5.44.0/24 -203.5.46.0/23 -203.5.52.0/22 -203.5.56.0/23 -203.5.60.0/23 -203.5.114.0/23 -203.5.118.0/24 -203.5.120.0/24 -203.5.172.0/24 -203.5.180.0/23 -203.5.182.0/24 -203.5.185.0/24 -203.5.186.0/24 -203.5.188.0/23 -203.5.190.0/24 -203.5.195.0/24 -203.5.214.0/23 -203.5.218.0/23 -203.6.131.0/24 -203.6.136.0/24 -203.6.138.0/23 -203.6.142.0/24 -203.6.150.0/23 -203.6.157.0/24 -203.6.159.0/24 203.6.224.0/20 -203.6.248.0/23 -203.7.129.0/24 -203.7.138.0/23 -203.7.147.0/24 -203.7.150.0/23 -203.7.158.0/24 -203.7.192.0/23 -203.7.200.0/24 -203.8.0.0/24 -203.8.8.0/24 -203.8.23.0/24 203.8.25.0/24 -203.8.70.0/24 -203.8.82.0/24 -203.8.86.0/23 -203.8.91.0/24 -203.8.110.0/23 -203.8.115.0/24 -203.8.166.0/23 -203.8.169.0/24 -203.8.173.0/24 -203.8.184.0/24 -203.8.186.0/23 -203.8.190.0/23 -203.8.192.0/24 -203.8.197.0/24 -203.8.198.0/23 -203.8.203.0/24 -203.8.209.0/24 -203.8.210.0/23 -203.8.212.0/22 -203.8.217.0/24 -203.8.220.0/24 -203.9.32.0/24 -203.9.36.0/23 -203.9.57.0/24 -203.9.63.0/24 -203.9.65.0/24 -203.9.70.0/23 -203.9.72.0/24 -203.9.75.0/24 -203.9.76.0/23 -203.9.96.0/22 -203.9.100.0/23 -203.9.108.0/24 -203.9.158.0/24 -203.10.34.0/24 -203.10.56.0/24 -203.10.74.0/23 -203.10.84.0/22 -203.10.88.0/24 -203.10.95.0/24 -203.10.125.0/24 -203.11.70.0/24 -203.11.76.0/22 -203.11.82.0/24 -203.11.84.0/22 -203.11.100.0/22 -203.11.109.0/24 -203.11.117.0/24 -203.11.122.0/24 -203.11.126.0/24 -203.11.136.0/22 -203.11.141.0/24 -203.11.142.0/23 -203.11.180.0/22 -203.11.208.0/22 -203.12.16.0/24 -203.12.19.0/24 -203.12.24.0/24 -203.12.57.0/24 -203.12.65.0/24 -203.12.66.0/24 -203.12.70.0/23 -203.12.87.0/24 +203.8.30.0/24 203.12.91.0/24 203.12.93.0/24 -203.12.95.0/24 -203.12.100.0/23 -203.12.103.0/24 -203.12.114.0/24 -203.12.118.0/24 -203.12.130.0/24 -203.12.137.0/24 -203.12.196.0/22 -203.12.211.0/24 -203.12.219.0/24 -203.12.226.0/24 -203.12.240.0/22 -203.13.18.0/24 -203.13.24.0/24 -203.13.44.0/23 203.13.81.0/24 -203.13.88.0/23 -203.13.92.0/22 -203.13.173.0/24 -203.13.224.0/23 -203.13.227.0/24 -203.13.233.0/24 -203.14.24.0/22 -203.14.33.0/24 -203.14.56.0/24 -203.14.61.0/24 -203.14.62.0/24 -203.14.104.0/24 -203.14.114.0/23 -203.14.118.0/24 -203.14.162.0/24 -203.14.192.0/24 -203.14.194.0/23 -203.14.214.0/24 -203.14.231.0/24 -203.14.246.0/24 203.15.0.0/20 -203.15.20.0/23 -203.15.22.0/24 -203.15.87.0/24 -203.15.88.0/23 -203.15.105.0/24 -203.15.112.0/24 -203.15.114.0/23 -203.15.119.0/24 -203.15.130.0/23 -203.15.149.0/24 -203.15.151.0/24 -203.15.156.0/22 -203.15.174.0/24 -203.15.227.0/24 -203.15.232.0/21 -203.15.240.0/23 -203.15.246.0/24 -203.16.10.0/24 -203.16.12.0/23 -203.16.16.0/21 -203.16.27.0/24 -203.16.38.0/24 -203.16.49.0/24 -203.16.50.0/23 -203.16.58.0/24 -203.16.63.0/24 -203.16.133.0/24 -203.16.161.0/24 -203.16.162.0/24 -203.16.186.0/23 -203.16.228.0/24 -203.16.238.0/24 -203.16.240.0/24 -203.16.245.0/24 -203.17.2.0/24 -203.17.18.0/24 -203.17.28.0/24 -203.17.39.0/24 -203.17.56.0/24 -203.17.74.0/23 -203.17.88.0/23 -203.17.136.0/24 -203.17.164.0/24 -203.17.187.0/24 -203.17.190.0/23 -203.17.231.0/24 -203.17.233.0/24 -203.17.248.0/23 -203.17.255.0/24 -203.18.2.0/23 -203.18.4.0/24 -203.18.7.0/24 -203.18.31.0/24 -203.18.37.0/24 -203.18.48.0/23 -203.18.52.0/24 -203.18.72.0/22 -203.18.80.0/23 -203.18.87.0/24 -203.18.100.0/23 -203.18.105.0/24 -203.18.107.0/24 -203.18.110.0/24 -203.18.129.0/24 -203.18.131.0/24 -203.18.132.0/23 -203.18.144.0/24 -203.18.153.0/24 -203.18.199.0/24 -203.18.208.0/24 -203.18.211.0/24 -203.18.215.0/24 -203.19.1.0/24 -203.19.18.0/24 -203.19.24.0/24 -203.19.30.0/24 -203.19.36.0/24 -203.19.39.0/24 -203.19.41.0/24 -203.19.44.0/23 -203.19.46.0/24 -203.19.58.0/24 -203.19.60.0/23 -203.19.64.0/24 -203.19.68.0/24 -203.19.72.0/24 -203.19.101.0/24 -203.19.111.0/24 -203.19.131.0/24 -203.19.133.0/24 -203.19.144.0/24 -203.19.147.0/24 -203.19.149.0/24 -203.19.156.0/24 -203.19.176.0/24 -203.19.178.0/23 -203.19.208.0/24 -203.19.228.0/22 -203.19.233.0/24 -203.19.242.0/24 -203.19.248.0/23 -203.19.255.0/24 -203.20.17.0/24 -203.20.40.0/23 -203.20.44.0/24 -203.20.48.0/24 -203.20.61.0/24 -203.20.65.0/24 -203.20.84.0/23 -203.20.89.0/24 -203.20.106.0/23 -203.20.115.0/24 -203.20.117.0/24 -203.20.118.0/23 -203.20.122.0/24 -203.20.126.0/23 -203.20.135.0/24 -203.20.138.0/23 -203.20.150.0/24 -203.20.230.0/24 -203.20.232.0/24 -203.20.236.0/24 -203.21.0.0/23 -203.21.2.0/24 -203.21.8.0/24 -203.21.10.0/24 -203.21.18.0/24 -203.21.33.0/24 -203.21.34.0/24 -203.21.41.0/24 -203.21.44.0/24 -203.21.68.0/24 -203.21.82.0/24 -203.21.96.0/22 -203.21.124.0/24 -203.21.136.0/23 -203.21.145.0/24 -203.21.206.0/24 -203.22.24.0/24 -203.22.28.0/23 -203.22.31.0/24 -203.22.68.0/24 -203.22.76.0/24 -203.22.78.0/24 -203.22.84.0/24 -203.22.87.0/24 -203.22.92.0/22 -203.22.99.0/24 -203.22.106.0/24 -203.22.122.0/23 -203.22.131.0/24 -203.22.163.0/24 -203.22.166.0/24 -203.22.170.0/24 -203.22.176.0/21 -203.22.194.0/24 -203.22.242.0/23 -203.22.245.0/24 -203.22.246.0/24 -203.22.252.0/23 -203.23.0.0/24 -203.23.47.0/24 -203.23.61.0/24 -203.23.62.0/23 -203.23.73.0/24 -203.23.85.0/24 -203.23.92.0/22 -203.23.98.0/24 -203.23.107.0/24 -203.23.112.0/24 -203.23.130.0/24 -203.23.140.0/23 -203.23.172.0/24 -203.23.182.0/24 -203.23.186.0/23 -203.23.192.0/24 -203.23.197.0/24 -203.23.198.0/24 -203.23.204.0/22 -203.23.224.0/24 -203.23.226.0/23 -203.23.228.0/22 -203.23.249.0/24 -203.23.251.0/24 -203.24.13.0/24 -203.24.18.0/24 -203.24.27.0/24 -203.24.43.0/24 -203.24.56.0/24 -203.24.58.0/24 -203.24.67.0/24 -203.24.74.0/24 -203.24.79.0/24 -203.24.80.0/23 -203.24.84.0/23 -203.24.86.0/24 -203.24.90.0/24 -203.24.111.0/24 -203.24.112.0/24 -203.24.116.0/24 -203.24.122.0/23 -203.24.145.0/24 -203.24.152.0/23 -203.24.157.0/24 -203.24.161.0/24 -203.24.167.0/24 -203.24.186.0/23 -203.24.199.0/24 -203.24.202.0/24 -203.24.212.0/23 -203.24.217.0/24 -203.24.219.0/24 -203.24.244.0/24 -203.25.19.0/24 -203.25.20.0/23 -203.25.46.0/24 -203.25.48.0/21 -203.25.64.0/23 -203.25.91.0/24 -203.25.99.0/24 -203.25.100.0/24 -203.25.106.0/24 -203.25.131.0/24 -203.25.135.0/24 -203.25.138.0/24 -203.25.147.0/24 -203.25.153.0/24 -203.25.154.0/23 -203.25.164.0/24 -203.25.166.0/24 -203.25.174.0/23 -203.25.180.0/24 -203.25.182.0/24 -203.25.191.0/24 -203.25.199.0/24 -203.25.200.0/24 -203.25.202.0/23 +203.25.52.0/24 203.25.208.0/20 -203.25.229.0/24 -203.25.235.0/24 -203.25.236.0/24 -203.25.242.0/24 -203.26.12.0/24 -203.26.34.0/24 -203.26.49.0/24 -203.26.50.0/24 -203.26.55.0/24 -203.26.56.0/23 -203.26.60.0/24 -203.26.65.0/24 -203.26.68.0/24 -203.26.76.0/24 -203.26.80.0/24 -203.26.84.0/24 -203.26.97.0/24 -203.26.102.0/23 -203.26.115.0/24 -203.26.116.0/24 -203.26.129.0/24 -203.26.143.0/24 -203.26.144.0/24 -203.26.148.0/23 -203.26.154.0/24 -203.26.158.0/23 -203.26.170.0/24 -203.26.173.0/24 -203.26.176.0/24 -203.26.185.0/24 -203.26.202.0/23 -203.26.210.0/24 -203.26.214.0/24 -203.26.222.0/24 -203.26.224.0/24 -203.26.228.0/24 -203.26.232.0/24 -203.27.0.0/24 -203.27.10.0/24 -203.27.15.0/24 -203.27.16.0/24 -203.27.20.0/24 -203.27.22.0/23 -203.27.40.0/24 -203.27.45.0/24 -203.27.53.0/24 -203.27.65.0/24 -203.27.66.0/24 -203.27.81.0/24 -203.27.88.0/24 -203.27.102.0/24 -203.27.109.0/24 -203.27.117.0/24 -203.27.121.0/24 -203.27.122.0/23 -203.27.125.0/24 -203.27.200.0/24 -203.27.202.0/24 -203.27.233.0/24 -203.27.241.0/24 -203.27.250.0/24 -203.28.10.0/24 -203.28.12.0/24 -203.28.33.0/24 -203.28.34.0/23 -203.28.43.0/24 -203.28.44.0/24 -203.28.54.0/24 -203.28.56.0/24 -203.28.73.0/24 -203.28.74.0/24 -203.28.76.0/24 -203.28.86.0/24 -203.28.88.0/24 -203.28.112.0/24 -203.28.131.0/24 -203.28.136.0/24 -203.28.140.0/24 -203.28.145.0/24 -203.28.165.0/24 -203.28.169.0/24 -203.28.170.0/24 -203.28.178.0/23 -203.28.185.0/24 -203.28.187.0/24 -203.28.196.0/24 -203.28.226.0/23 -203.28.239.0/24 -203.29.2.0/24 -203.29.8.0/23 -203.29.13.0/24 -203.29.14.0/24 -203.29.28.0/24 -203.29.46.0/24 -203.29.57.0/24 -203.29.61.0/24 -203.29.63.0/24 -203.29.69.0/24 -203.29.73.0/24 -203.29.81.0/24 -203.29.90.0/24 -203.29.95.0/24 -203.29.100.0/24 -203.29.103.0/24 -203.29.112.0/24 -203.29.120.0/22 -203.29.182.0/23 -203.29.187.0/24 -203.29.189.0/24 -203.29.190.0/24 -203.29.205.0/24 -203.29.210.0/24 -203.29.217.0/24 -203.29.227.0/24 -203.29.231.0/24 -203.29.233.0/24 -203.29.234.0/24 -203.29.248.0/24 -203.29.254.0/23 -203.30.16.0/23 -203.30.25.0/24 -203.30.27.0/24 -203.30.29.0/24 -203.30.66.0/24 -203.30.81.0/24 -203.30.87.0/24 -203.30.111.0/24 -203.30.121.0/24 -203.30.123.0/24 -203.30.152.0/24 -203.30.156.0/24 -203.30.162.0/24 -203.30.173.0/24 -203.30.175.0/24 -203.30.187.0/24 -203.30.194.0/24 -203.30.217.0/24 -203.30.220.0/24 -203.30.222.0/24 -203.30.232.0/23 -203.30.235.0/24 -203.30.240.0/23 -203.30.246.0/24 -203.30.250.0/23 -203.31.45.0/24 -203.31.46.0/24 -203.31.49.0/24 -203.31.51.0/24 -203.31.54.0/23 -203.31.69.0/24 -203.31.72.0/24 -203.31.80.0/24 -203.31.85.0/24 -203.31.97.0/24 -203.31.105.0/24 -203.31.106.0/24 -203.31.108.0/23 -203.31.124.0/24 -203.31.162.0/24 -203.31.174.0/24 -203.31.177.0/24 -203.31.181.0/24 -203.31.187.0/24 -203.31.189.0/24 -203.31.204.0/24 -203.31.220.0/24 -203.31.222.0/23 -203.31.225.0/24 -203.31.229.0/24 -203.31.248.0/23 -203.31.253.0/24 -203.32.20.0/24 203.32.48.0/23 -203.32.56.0/24 -203.32.60.0/24 -203.32.62.0/24 203.32.68.0/23 -203.32.76.0/24 -203.32.81.0/24 203.32.84.0/23 -203.32.95.0/24 -203.32.102.0/24 -203.32.105.0/24 -203.32.130.0/24 -203.32.133.0/24 -203.32.140.0/24 -203.32.152.0/24 -203.32.186.0/23 -203.32.192.0/24 -203.32.196.0/24 203.32.203.0/24 203.32.204.0/23 203.32.212.0/24 203.33.4.0/24 203.33.7.0/24 -203.33.11.0/24 -203.33.12.0/22 203.33.21.0/24 203.33.26.0/24 203.33.32.0/24 203.33.63.0/24 203.33.64.0/24 203.33.67.0/24 -203.33.68.0/24 -203.33.73.0/24 -203.33.79.0/24 -203.33.100.0/24 -203.33.122.0/24 -203.33.129.0/24 -203.33.131.0/24 203.33.145.0/24 203.33.156.0/24 203.33.158.0/23 203.33.174.0/24 -203.33.185.0/24 -203.33.200.0/24 203.33.202.0/23 -203.33.204.0/24 203.33.206.0/23 203.33.214.0/23 203.33.224.0/23 -203.33.226.0/24 -203.33.233.0/24 -203.33.243.0/24 -203.33.250.0/24 -203.34.4.0/24 203.34.21.0/24 203.34.27.0/24 203.34.39.0/24 @@ -5623,11 +3178,6 @@ 203.34.152.0/23 203.34.161.0/24 203.34.162.0/24 -203.34.187.0/24 -203.34.192.0/23 -203.34.195.0/24 -203.34.198.0/24 -203.34.204.0/22 203.34.232.0/24 203.34.240.0/24 203.34.242.0/24 @@ -5659,10 +3209,6 @@ 203.56.38.0/24 203.56.40.0/24 203.56.46.0/24 -203.56.48.0/23 -203.56.51.0/24 -203.56.52.0/23 -203.56.54.0/24 203.56.68.0/23 203.56.82.0/23 203.56.84.0/23 @@ -5683,9 +3229,7 @@ 203.56.210.0/24 203.56.214.0/24 203.56.216.0/24 -203.56.227.0/24 203.56.228.0/24 -203.56.231.0/24 203.56.232.0/24 203.56.240.0/24 203.56.252.0/24 @@ -5712,472 +3256,687 @@ 203.57.206.0/24 203.57.222.0/24 203.57.224.0/20 -203.57.246.0/23 203.57.249.0/24 -203.57.253.0/24 203.57.254.0/23 203.62.2.0/24 203.62.131.0/24 203.62.139.0/24 -203.62.161.0/24 -203.62.197.0/24 -203.62.228.0/22 -203.62.234.0/24 -203.62.246.0/24 203.65.240.0/22 -203.76.160.0/22 -203.76.168.0/22 203.76.208.0/21 203.76.216.0/22 203.76.240.0/22 -203.77.180.0/22 203.78.48.0/20 -203.78.156.0/22 -203.79.0.0/20 -203.80.4.0/23 -203.80.32.0/20 +203.79.0.0/23 203.80.57.0/24 -203.80.129.0/24 -203.80.132.0/22 -203.80.140.0/24 -203.80.142.0/23 203.80.144.0/20 -203.81.1.0/24 -203.81.2.0/24 -203.81.5.0/24 -203.81.16.0/20 -203.81.244.0/22 203.82.0.0/23 -203.82.16.0/24 -203.82.20.0/23 -203.82.22.0/24 -203.82.112.0/20 -203.82.224.0/20 -203.83.0.0/22 -203.83.12.0/22 203.83.56.0/21 203.83.224.0/20 -203.86.0.0/18 +203.86.0.0/19 +203.86.43.0/24 +203.86.44.0/23 +203.86.48.0/23 +203.86.51.0/24 +203.86.52.0/22 +203.86.60.0/23 +203.86.62.0/24 203.86.64.0/19 -203.86.96.0/22 -203.86.100.0/23 -203.86.102.0/24 -203.86.104.0/23 -203.86.107.0/24 -203.86.108.0/24 -203.86.110.0/24 203.86.112.0/24 -203.86.114.0/24 -203.86.116.0/23 -203.86.120.0/24 -203.86.250.0/24 203.86.254.0/23 203.88.32.0/19 203.88.192.0/19 -203.89.8.0/23 -203.89.13.0/24 -203.89.14.0/23 -203.89.133.0/24 -203.89.136.0/22 -203.89.144.0/24 -203.90.8.0/21 203.90.128.0/18 203.90.192.0/19 203.91.32.0/19 -203.91.96.0/20 203.91.120.0/21 -203.92.0.0/22 -203.92.6.0/24 -203.92.160.0/19 -203.93.0.0/16 +203.93.0.0/18 +203.93.64.0/19 +203.93.96.0/20 +203.93.117.0/24 +203.93.120.0/21 +203.93.128.0/19 +203.93.160.0/20 +203.93.208.0/20 +203.93.224.0/19 203.94.0.0/19 -203.95.0.0/21 -203.95.96.0/19 -203.95.128.0/18 -203.95.200.0/21 -203.95.208.0/22 -203.95.224.0/19 -203.99.8.0/23 -203.99.12.0/24 -203.99.14.0/23 -203.99.16.0/23 -203.99.19.0/24 -203.99.20.0/22 -203.99.24.0/21 -203.99.80.0/20 -203.100.32.0/20 -203.100.48.0/22 -203.100.53.0/24 -203.100.55.0/24 -203.100.58.0/24 -203.100.60.0/24 -203.100.63.0/24 -203.100.80.0/20 -203.100.96.0/19 +203.95.0.0/23 +203.95.2.0/24 +203.95.4.0/22 +203.95.128.0/23 +203.99.21.0/24 +203.99.22.0/23 +203.99.26.0/23 +203.99.30.0/23 +203.100.92.0/22 203.100.192.0/20 203.104.32.0/20 -203.105.96.0/19 -203.105.128.0/19 -203.107.0.0/23 +203.107.1.0/24 203.107.2.0/24 -203.107.4.0/22 -203.107.8.0/21 -203.107.16.0/20 +203.107.6.0/24 +203.107.13.0/24 +203.107.20.0/22 +203.107.26.0/23 +203.107.28.0/22 203.107.32.0/19 -203.107.69.0/24 -203.107.70.0/23 203.107.72.0/21 -203.107.80.0/20 -203.107.96.0/19 +203.107.80.0/21 +203.107.96.0/23 +203.107.116.0/22 +203.107.120.0/22 +203.107.124.0/23 203.110.160.0/19 203.110.208.0/20 203.110.232.0/23 -203.110.234.0/24 -203.114.80.0/20 203.114.244.0/22 -203.118.192.0/19 -203.118.241.0/24 203.118.248.0/22 -203.119.24.0/21 -203.119.32.0/22 +203.119.25.0/24 +203.119.26.0/23 +203.119.28.0/22 +203.119.33.0/24 203.119.80.0/24 203.119.83.0/24 -203.119.85.0/24 -203.119.113.0/24 203.119.114.0/23 -203.119.116.0/22 -203.119.121.0/24 -203.119.122.0/23 -203.119.126.0/23 -203.119.128.0/17 -203.123.58.0/24 -203.128.32.0/19 -203.128.96.0/19 -203.128.225.0/24 -203.128.226.0/23 -203.128.228.0/24 -203.128.231.0/24 -203.129.8.0/24 -203.129.10.0/23 +203.119.128.0/19 +203.119.160.0/24 +203.119.168.0/21 +203.119.176.0/20 +203.119.192.0/18 203.129.12.0/22 -203.130.32.0/19 +203.130.40.0/21 203.132.32.0/19 -203.134.240.0/21 +203.133.240.0/21 203.135.96.0/19 -203.135.160.0/20 -203.142.219.0/24 -203.142.224.0/19 -203.144.96.0/22 -203.144.100.0/24 -203.144.102.0/24 -203.144.106.0/23 -203.144.108.0/22 -203.144.112.0/20 -203.145.0.0/19 203.148.0.0/18 203.148.64.0/20 -203.148.80.0/22 203.148.86.0/23 -203.149.92.0/22 203.152.64.0/19 -203.152.128.0/19 -203.153.0.0/22 203.156.192.0/18 -203.158.16.0/21 -203.160.104.0/21 203.160.129.0/24 203.160.192.0/19 -203.161.0.0/22 -203.161.183.0/24 -203.161.192.0/19 -203.166.160.0/19 -203.167.28.0/22 +203.166.160.0/22 +203.166.165.0/24 +203.166.166.0/24 +203.166.172.0/24 +203.166.177.0/24 +203.166.186.0/23 +203.166.188.0/23 +203.166.191.0/24 203.168.0.0/19 203.170.58.0/23 -203.171.0.0/22 -203.171.208.0/24 -203.171.224.0/20 203.174.4.0/24 -203.174.6.0/24 203.174.96.0/19 203.175.128.0/19 -203.175.192.0/18 -203.176.0.0/18 -203.176.64.0/19 -203.176.168.0/21 -203.184.80.0/20 -203.185.189.0/24 +203.176.92.0/22 +203.176.168.0/24 +203.176.170.0/24 203.187.160.0/19 203.189.0.0/23 203.189.6.0/23 -203.189.112.0/22 203.189.192.0/19 203.189.240.0/22 -203.190.96.0/20 -203.190.249.0/24 +203.190.100.0/23 203.191.0.0/23 -203.191.2.0/24 -203.191.5.0/24 -203.191.7.0/24 -203.191.16.0/20 -203.191.64.0/18 -203.191.133.0/24 -203.191.144.0/20 -203.192.0.0/19 +203.191.144.0/21 +203.192.1.0/24 +203.192.2.0/23 +203.192.4.0/22 +203.192.8.0/21 +203.192.16.0/24 +203.192.24.0/23 203.193.224.0/19 -203.194.120.0/21 +203.194.122.0/23 +203.194.124.0/24 203.195.64.0/19 -203.195.112.0/23 +203.195.113.0/24 203.195.114.0/24 -203.195.116.0/22 +203.195.118.0/23 203.195.128.0/17 203.196.0.0/21 -203.196.28.0/22 -203.201.181.0/24 -203.201.182.0/24 -203.202.236.0/22 -203.205.64.0/19 -203.205.130.0/23 -203.205.132.0/23 -203.205.148.0/22 -203.205.152.0/23 -203.205.154.0/24 -203.205.156.0/24 -203.205.158.0/23 -203.205.160.0/20 -203.205.176.0/21 -203.205.184.0/22 -203.205.189.0/24 -203.205.190.0/24 -203.205.200.0/21 -203.205.208.0/21 -203.205.216.0/23 -203.205.225.0/24 -203.205.226.0/23 -203.205.228.0/22 -203.205.240.0/21 -203.207.64.0/18 -203.207.128.0/17 +203.202.236.0/23 +203.205.88.0/23 +203.205.90.0/24 +203.207.64.0/19 +203.207.96.0/21 +203.207.104.0/22 +203.207.112.0/20 +203.207.128.0/18 +203.207.192.0/21 +203.207.200.0/22 +203.207.208.0/20 +203.207.224.0/19 203.208.32.0/19 203.209.224.0/19 -203.212.0.0/20 -203.212.80.0/20 -203.215.232.0/21 -203.217.164.0/22 -203.223.16.0/24 -203.223.21.0/24 -203.223.22.0/23 -206.109.70.0/23 +203.212.0.0/21 +203.212.8.0/22 +203.212.80.0/23 +203.215.232.0/23 +203.215.236.0/24 +203.223.17.0/24 +203.223.19.0/24 +203.223.20.0/23 +204.77.130.0/24 +204.235.241.0/24 +205.198.19.0/24 206.109.75.0/24 -210.2.0.0/19 +210.2.0.0/23 +210.2.4.0/24 210.5.0.0/19 -210.5.56.0/24 -210.5.58.0/23 -210.5.60.0/22 +210.5.56.0/21 210.5.128.0/19 -210.7.56.0/21 -210.12.0.0/15 -210.14.64.0/19 +210.12.0.0/16 +210.13.0.0/17 +210.13.192.0/19 +210.13.224.0/24 +210.13.227.0/24 +210.13.230.0/23 +210.13.232.0/24 +210.13.236.0/23 +210.13.238.0/24 +210.13.240.0/20 +210.14.64.0/20 +210.14.80.0/22 +210.14.84.0/24 +210.14.90.0/23 +210.14.92.0/22 210.14.112.0/20 -210.14.128.0/17 +210.14.128.0/19 +210.14.192.0/18 210.15.0.0/17 -210.15.128.0/18 -210.16.128.0/18 -210.21.0.0/16 -210.22.0.0/16 -210.23.32.0/19 +210.16.160.0/19 +210.21.0.0/17 +210.21.192.0/18 +210.22.0.0/19 +210.22.32.0/22 +210.22.48.0/20 +210.22.64.0/18 +210.22.128.0/17 210.25.0.0/16 210.26.0.0/15 210.28.0.0/14 210.32.0.0/12 +210.48.136.0/21 210.51.0.0/16 210.52.0.0/15 -210.56.192.0/19 -210.72.0.0/14 -210.76.0.0/15 -210.78.0.0/16 -210.79.64.0/18 +210.72.0.0/17 +210.72.128.0/18 +210.72.192.0/19 +210.72.224.0/20 +210.72.240.0/23 +210.72.243.0/24 +210.72.245.0/24 +210.72.246.0/24 +210.73.0.0/17 +210.73.128.0/18 +210.73.192.0/22 +210.73.204.0/24 +210.73.208.0/20 +210.73.224.0/19 +210.74.0.0/20 +210.74.35.0/24 +210.74.36.0/23 +210.74.38.0/24 +210.74.40.0/22 +210.74.44.0/23 +210.74.47.0/24 +210.74.64.0/23 +210.74.107.0/24 +210.74.108.0/23 +210.74.128.0/18 +210.74.224.0/19 +210.75.0.0/18 +210.75.96.0/19 +210.75.192.0/18 +210.76.0.0/18 +210.76.64.0/19 +210.76.160.0/19 +210.76.192.0/19 +210.77.0.0/18 +210.77.64.0/19 +210.77.128.0/19 +210.77.176.0/22 +210.77.180.0/23 +210.77.182.0/24 +210.77.184.0/24 +210.77.189.0/24 +210.77.190.0/23 +210.77.192.0/18 +210.78.128.0/24 +210.78.134.0/23 +210.78.139.0/24 210.79.224.0/19 210.82.0.0/15 -210.87.72.0/23 -210.87.114.0/23 210.87.128.0/18 210.185.192.0/18 -210.192.96.0/19 +210.192.96.0/20 +210.192.116.0/22 +210.192.120.0/21 211.64.0.0/13 -211.80.0.0/12 -211.96.0.0/15 +211.80.0.0/13 +211.88.0.0/16 +211.89.230.0/23 +211.90.0.0/17 +211.90.128.0/18 +211.90.192.0/20 +211.90.216.0/21 +211.90.224.0/19 +211.91.0.0/18 +211.91.64.0/19 +211.91.96.0/20 +211.91.120.0/21 +211.91.128.0/18 +211.91.216.0/21 +211.91.224.0/19 +211.92.0.0/17 +211.92.128.0/18 +211.92.192.0/19 +211.92.224.0/20 +211.92.244.0/22 +211.93.0.0/17 +211.93.128.0/20 +211.93.144.0/21 +211.93.160.0/19 +211.93.192.0/21 +211.93.200.0/23 +211.93.204.0/22 +211.93.211.0/24 +211.93.212.0/23 +211.93.224.0/19 +211.94.37.0/24 +211.94.64.0/18 +211.94.128.0/17 +211.95.0.0/17 +211.95.128.0/19 +211.95.192.0/18 +211.96.0.0/16 +211.97.0.0/17 +211.97.128.0/19 +211.97.160.0/21 +211.97.176.0/20 +211.97.192.0/18 211.98.0.0/16 -211.99.0.0/19 +211.99.8.0/21 +211.99.16.0/23 +211.99.25.0/24 +211.99.26.0/24 +211.99.28.0/22 +211.99.32.0/19 211.99.64.0/18 -211.99.128.0/17 -211.100.0.0/15 -211.102.0.0/17 -211.102.128.0/21 -211.102.144.0/21 -211.102.160.0/20 -211.102.192.0/18 +211.99.128.0/18 +211.99.192.0/19 +211.100.0.0/17 +211.100.192.0/20 +211.100.224.0/19 +211.101.0.0/18 +211.101.192.0/20 +211.101.232.0/21 +211.101.240.0/21 +211.102.80.0/20 +211.102.128.0/18 +211.102.192.0/23 +211.102.208.0/20 +211.102.240.0/21 +211.102.248.0/24 211.103.0.0/16 211.136.0.0/13 -211.144.0.0/14 -211.148.0.0/16 -211.149.0.0/19 -211.149.48.0/21 -211.149.64.0/21 -211.149.80.0/21 -211.149.96.0/19 +211.144.9.0/24 +211.144.10.0/24 +211.144.12.0/22 +211.144.16.0/24 +211.144.18.0/23 +211.144.20.0/24 +211.144.22.0/24 +211.144.24.0/24 +211.144.27.0/24 +211.144.28.0/23 +211.144.32.0/19 +211.144.64.0/19 +211.144.96.0/23 +211.144.100.0/22 +211.144.104.0/22 +211.144.108.0/23 +211.144.110.0/24 +211.144.112.0/24 +211.144.114.0/23 +211.144.118.0/23 +211.144.120.0/21 +211.144.128.0/19 +211.144.192.0/18 +211.145.0.0/18 +211.145.64.0/20 +211.146.0.0/19 +211.146.32.0/21 +211.147.0.0/18 +211.147.64.0/19 +211.147.128.0/19 +211.147.208.0/20 +211.147.224.0/19 +211.148.0.0/18 +211.148.128.0/17 211.149.128.0/17 -211.150.0.0/15 +211.150.0.0/18 +211.150.64.0/19 +211.150.98.0/24 +211.150.100.0/23 +211.150.114.0/23 +211.150.122.0/24 +211.150.124.0/23 +211.150.128.0/24 +211.151.0.0/16 211.152.0.0/17 -211.152.128.0/20 -211.152.144.0/22 -211.152.150.0/23 -211.152.152.0/21 -211.152.160.0/19 -211.152.192.0/18 +211.152.192.0/22 +211.152.196.0/23 +211.152.208.0/20 211.153.0.0/16 -211.154.0.0/16 -211.155.0.0/18 -211.155.66.0/23 -211.155.68.0/22 -211.155.72.0/21 +211.154.0.0/19 +211.154.64.0/19 +211.154.128.0/17 +211.155.16.0/20 +211.155.32.0/19 211.155.80.0/20 211.155.96.0/19 -211.155.128.0/18 -211.155.208.0/20 -211.155.224.0/19 -211.156.0.0/14 -211.160.0.0/14 -211.164.0.0/15 +211.155.128.0/19 +211.155.160.0/20 +211.155.176.0/22 +211.155.184.0/21 +211.155.224.0/21 +211.155.232.0/22 +211.155.236.0/24 +211.155.240.0/20 +211.156.0.0/19 +211.156.128.0/19 +211.156.176.0/20 +211.156.192.0/20 +211.156.208.0/21 +211.156.216.0/22 +211.156.220.0/23 +211.156.223.0/24 +211.157.0.0/19 +211.157.96.0/19 +211.157.128.0/18 +211.157.192.0/20 +211.157.219.0/24 +211.157.222.0/24 +211.157.224.0/19 +211.158.0.0/16 +211.159.64.0/21 +211.159.128.0/17 +211.160.0.0/22 +211.160.4.0/24 +211.160.9.0/24 +211.160.10.0/23 +211.160.14.0/23 +211.160.16.0/24 +211.160.18.0/23 +211.160.20.0/23 +211.160.22.0/24 +211.160.24.0/24 +211.160.27.0/24 +211.160.28.0/23 +211.160.36.0/23 +211.160.46.0/24 +211.160.62.0/24 +211.160.72.0/21 +211.160.80.0/20 +211.160.112.0/23 +211.160.115.0/24 +211.160.120.0/24 +211.160.160.0/19 +211.160.195.0/24 +211.160.196.0/24 +211.160.203.0/24 +211.160.205.0/24 +211.160.244.0/24 +211.160.246.0/23 +211.160.248.0/21 +211.161.0.0/20 +211.161.24.0/22 +211.161.32.0/20 +211.161.60.0/23 +211.161.62.0/24 +211.161.101.0/24 +211.161.102.0/23 +211.161.120.0/21 +211.161.192.0/22 +211.161.203.0/24 +211.161.209.0/24 +211.161.221.0/24 +211.161.224.0/20 +211.162.0.0/21 +211.162.64.0/20 +211.162.119.0/24 +211.162.120.0/21 +211.162.200.0/22 +211.165.0.0/16 211.166.0.0/16 -211.167.0.0/19 211.167.64.0/18 -211.167.128.0/17 +211.167.128.0/19 +211.167.176.0/20 +211.167.224.0/19 212.64.0.0/17 +212.103.62.0/24 212.129.128.0/17 -218.0.0.0/12 -218.16.0.0/13 -218.24.0.0/14 -218.28.0.0/15 -218.30.0.0/19 -218.30.32.0/22 -218.30.36.0/23 -218.30.38.0/24 -218.30.40.0/22 -218.30.45.0/24 -218.30.46.0/23 -218.30.48.0/21 -218.30.56.0/22 -218.30.60.0/23 -218.30.64.0/18 -218.30.128.0/17 -218.31.0.0/16 +218.0.0.0/11 218.56.0.0/13 218.64.0.0/11 -218.96.0.0/16 +218.96.0.0/24 +218.96.64.0/22 +218.96.104.0/22 +218.96.108.0/23 +218.96.126.0/23 +218.96.128.0/24 +218.96.241.0/24 +218.96.244.0/24 +218.96.255.0/24 218.97.0.0/17 218.97.160.0/19 -218.97.192.0/18 -218.98.0.0/15 +218.97.192.0/19 +218.97.240.0/20 +218.98.0.0/18 +218.98.96.0/21 +218.98.104.0/22 +218.98.108.0/23 +218.98.111.0/24 +218.98.112.0/20 +218.98.160.0/24 +218.98.176.0/24 +218.98.192.0/24 218.100.88.0/21 -218.100.96.0/19 -218.100.128.0/17 -218.104.0.0/14 +218.104.0.0/15 +218.106.0.0/16 +218.107.0.0/18 +218.107.128.0/17 218.108.0.0/15 -218.185.192.0/19 -218.185.240.0/24 -218.185.242.0/24 -218.185.244.0/24 -218.185.246.0/23 +218.185.240.0/21 218.192.0.0/12 -218.240.0.0/14 -218.244.0.0/15 -218.246.0.0/16 +218.213.85.0/24 +218.240.0.0/19 +218.240.128.0/19 +218.240.160.0/21 +218.240.168.0/24 +218.240.176.0/20 +218.241.16.0/21 +218.241.96.0/20 +218.241.112.0/22 +218.241.116.0/23 +218.241.118.0/24 +218.241.121.0/24 +218.241.122.0/23 +218.241.124.0/22 +218.241.128.0/17 +218.242.0.0/16 +218.244.0.0/19 +218.244.44.0/22 +218.244.49.0/24 +218.244.52.0/23 +218.244.55.0/24 +218.244.56.0/23 +218.244.58.0/24 +218.244.128.0/18 +218.244.192.0/20 +218.244.224.0/19 +218.245.0.0/17 +218.246.0.0/19 +218.246.32.0/22 +218.246.48.0/22 +218.246.64.0/18 +218.246.160.0/19 +218.246.192.0/19 218.247.0.0/18 -218.247.96.0/19 +218.247.64.0/19 218.247.128.0/17 218.249.0.0/16 +218.252.0.0/17 +218.253.0.0/18 219.72.0.0/16 219.82.0.0/16 -219.83.128.0/17 -219.90.68.0/22 -219.90.72.0/21 -219.128.0.0/11 +219.83.160.0/19 +219.100.148.0/22 +219.117.16.0/20 +219.128.0.0/12 +219.144.0.0/14 +219.148.0.0/15 +219.150.0.0/16 +219.151.0.0/18 +219.151.128.0/17 +219.152.0.0/14 +219.156.0.0/15 +219.158.0.0/19 +219.158.32.0/20 +219.158.58.0/23 +219.158.60.0/22 +219.158.96.0/19 +219.158.128.0/17 +219.159.0.0/16 219.216.0.0/13 219.224.0.0/13 -219.232.0.0/15 -219.234.10.0/23 -219.234.12.0/22 -219.234.32.0/19 -219.234.64.0/18 +219.232.0.0/17 +219.232.144.0/24 +219.232.160.0/19 +219.232.192.0/19 +219.233.0.0/16 +219.234.0.0/21 +219.234.16.0/20 +219.234.80.0/20 +219.234.96.0/19 219.234.128.0/17 -219.235.0.0/16 +219.235.0.0/20 +219.235.32.0/19 +219.235.64.0/18 +219.235.128.0/19 +219.235.192.0/23 +219.235.207.0/24 +219.235.224.0/22 +219.235.228.0/23 +219.235.233.0/24 +219.235.234.0/24 +219.235.237.0/24 +219.235.251.0/24 +219.235.252.0/24 +219.235.255.0/24 219.236.0.0/14 219.242.0.0/15 219.244.0.0/14 -220.101.192.0/18 -220.112.0.0/14 -220.152.128.0/17 -220.154.0.0/15 -220.158.240.0/22 -220.160.0.0/13 -220.168.0.0/14 -220.172.0.0/15 -220.174.0.0/20 -220.174.16.0/21 -220.174.24.0/23 -220.174.28.0/22 -220.174.32.0/19 -220.174.64.0/20 -220.174.80.0/21 -220.174.88.0/22 -220.174.92.0/23 -220.174.96.0/19 -220.174.128.0/17 -220.175.0.0/16 -220.176.0.0/12 -220.192.0.0/12 -220.231.0.0/18 +220.101.192.0/19 +220.112.0.0/22 +220.112.8.0/24 +220.112.40.0/21 +220.112.50.0/23 +220.112.52.0/23 +220.112.54.0/24 +220.112.194.0/24 +220.112.196.0/24 +220.112.200.0/21 +220.113.0.0/19 +220.113.32.0/20 +220.113.96.0/21 +220.113.150.0/23 +220.113.152.0/23 +220.113.154.0/24 +220.114.250.0/23 +220.154.0.0/20 +220.154.16.0/22 +220.154.64.0/20 +220.154.80.0/22 +220.154.128.0/20 +220.154.147.0/24 +220.160.0.0/12 +220.176.0.0/14 +220.180.0.0/16 +220.181.0.0/17 +220.181.128.0/20 +220.181.144.0/24 +220.181.148.0/22 +220.181.152.0/21 +220.181.160.0/19 +220.182.0.0/18 +220.184.0.0/13 +220.192.0.0/16 +220.193.0.0/17 +220.194.0.0/16 +220.195.0.0/17 +220.195.128.0/19 +220.195.192.0/18 +220.196.0.0/16 +220.197.0.0/17 +220.197.160.0/19 +220.197.192.0/18 +220.198.0.0/15 +220.200.0.0/17 +220.200.128.0/20 +220.200.148.0/22 +220.200.152.0/21 +220.200.160.0/19 +220.200.192.0/18 +220.201.0.0/16 +220.202.0.0/16 +220.203.0.0/17 +220.203.128.0/18 +220.203.216.0/23 +220.203.224.0/19 +220.205.0.0/16 +220.206.192.0/22 +220.207.0.0/22 +220.207.80.0/20 +220.207.176.0/22 +220.207.184.0/22 +220.207.254.0/23 +220.231.32.0/20 220.231.128.0/17 220.232.64.0/18 220.234.0.0/16 -220.242.0.0/22 -220.242.4.0/23 -220.242.6.0/24 -220.242.8.0/21 -220.242.16.0/20 -220.242.32.0/19 -220.242.64.0/18 -220.242.128.0/17 -220.243.0.0/16 -220.247.136.0/23 -220.247.142.0/23 -220.248.0.0/14 -220.252.0.0/16 +220.242.180.0/24 +220.243.128.0/20 +220.243.153.0/24 +220.243.154.0/23 +220.243.156.0/23 +220.243.158.0/24 +220.243.176.0/20 +220.248.0.0/16 +220.249.0.0/17 +220.249.128.0/18 +220.249.192.0/19 +220.249.240.0/20 +220.250.0.0/17 221.0.0.0/13 221.8.0.0/14 221.12.0.0/17 221.12.128.0/18 221.13.0.0/16 221.14.0.0/15 -221.122.0.0/15 -221.128.132.0/22 -221.128.136.0/21 -221.128.144.0/20 -221.128.160.0/19 -221.128.192.0/23 -221.128.194.0/24 -221.128.196.0/22 -221.128.200.0/21 -221.128.208.0/20 -221.128.224.0/21 -221.128.232.0/22 -221.128.238.0/23 +221.122.0.0/16 +221.123.0.0/24 +221.123.112.0/20 +221.123.128.0/17 221.129.0.0/16 221.130.0.0/15 -221.133.224.0/19 -221.136.0.0/15 -221.172.0.0/14 +221.133.225.0/24 +221.133.226.0/24 +221.133.228.0/22 +221.133.232.0/23 +221.133.235.0/24 +221.133.244.0/23 +221.137.0.0/16 +221.174.0.0/17 221.176.0.0/13 221.192.0.0/14 221.196.0.0/15 @@ -6190,57 +3949,117 @@ 221.208.0.0/12 221.224.0.0/12 222.16.0.0/12 -222.32.0.0/11 +222.35.0.0/16 +222.42.115.0/24 +222.44.0.0/15 +222.49.128.0/17 +222.50.0.0/16 +222.59.128.0/17 222.64.0.0/11 222.125.0.0/16 -222.126.128.0/17 +222.126.128.0/22 +222.126.132.0/23 +222.126.134.0/24 +222.126.138.0/23 +222.126.140.0/22 +222.126.144.0/24 +222.126.146.0/23 +222.126.148.0/22 +222.126.152.0/21 +222.126.160.0/20 +222.126.176.0/21 +222.126.184.0/22 +222.126.188.0/23 +222.126.192.0/22 +222.126.196.0/23 +222.126.200.0/22 +222.126.208.0/23 +222.126.212.0/22 +222.126.216.0/23 +222.126.228.0/23 +222.126.234.0/23 +222.126.236.0/22 +222.126.240.0/20 222.128.0.0/12 222.160.0.0/14 +222.166.96.0/20 +222.166.160.0/20 +222.166.240.0/20 222.168.0.0/13 222.176.0.0/12 222.192.0.0/11 222.240.0.0/13 222.248.0.0/15 -223.0.0.0/12 -223.20.0.0/15 +223.0.1.0/24 +223.0.2.0/24 +223.0.8.0/22 +223.0.12.0/23 +223.0.15.0/24 +223.0.16.0/24 +223.0.30.0/24 +223.0.41.0/24 +223.0.126.0/24 +223.2.0.0/15 +223.4.0.0/14 +223.8.0.0/13 +223.26.0.0/24 223.27.184.0/22 -223.29.208.0/22 -223.29.252.0/24 -223.29.255.0/24 -223.64.0.0/11 -223.96.0.0/12 -223.112.0.0/14 -223.116.0.0/15 -223.121.128.0/17 -223.122.4.0/22 -223.122.12.0/22 -223.122.18.0/23 -223.122.20.0/22 -223.122.26.0/23 -223.122.28.0/22 -223.123.196.0/22 -223.123.204.0/22 -223.123.208.0/20 -223.123.224.0/19 -223.124.0.0/14 +223.64.0.0/10 223.128.0.0/15 223.144.0.0/12 -223.160.0.0/14 +223.160.0.0/20 +223.160.16.0/21 +223.160.112.0/20 +223.160.128.0/22 +223.160.134.0/23 +223.160.136.0/21 +223.160.144.0/20 +223.160.160.0/19 +223.160.192.0/19 +223.160.224.0/21 +223.160.232.0/22 +223.160.236.0/23 +223.161.194.0/23 +223.161.196.0/22 +223.161.200.0/21 +223.161.208.0/20 +223.161.224.0/19 +223.165.10.0/24 +223.165.12.0/24 +223.165.80.0/20 223.166.0.0/15 223.192.0.0/15 223.198.0.0/15 -223.201.0.0/16 -223.202.0.0/15 -223.208.0.0/13 +223.202.0.0/24 +223.202.67.0/24 +223.202.131.0/24 +223.202.132.0/24 +223.202.135.0/24 +223.202.211.0/24 +223.202.212.0/24 +223.203.3.0/24 +223.203.9.0/24 +223.203.96.0/24 +223.203.100.0/24 +223.210.0.0/19 +223.210.48.0/22 +223.212.0.0/14 223.220.0.0/15 223.223.176.0/20 223.223.192.0/20 223.240.0.0/13 223.248.0.0/14 -223.252.128.0/17 -223.254.0.0/17 -223.254.160.0/19 -223.254.192.0/18 -223.255.0.0/17 +223.252.194.0/24 +223.252.196.0/24 +223.252.199.0/24 +223.252.200.0/23 +223.252.202.0/24 +223.252.205.0/24 +223.252.209.0/24 +223.252.210.0/23 +223.252.212.0/24 +223.252.214.0/23 +223.252.221.0/24 +223.252.222.0/24 223.255.236.0/22 223.255.252.0/23 diff --git a/luci-app-homeproxy/root/etc/homeproxy/resources/china_ip4.ver b/luci-app-homeproxy/root/etc/homeproxy/resources/china_ip4.ver index 5d7e941a2..0593cbd7b 100644 --- a/luci-app-homeproxy/root/etc/homeproxy/resources/china_ip4.ver +++ b/luci-app-homeproxy/root/etc/homeproxy/resources/china_ip4.ver @@ -1 +1 @@ -202609130005 +20260704060757 diff --git a/luci-app-homeproxy/root/etc/homeproxy/resources/china_ip6.txt b/luci-app-homeproxy/root/etc/homeproxy/resources/china_ip6.txt index 89e8c696c..1b668724e 100644 --- a/luci-app-homeproxy/root/etc/homeproxy/resources/china_ip6.txt +++ b/luci-app-homeproxy/root/etc/homeproxy/resources/china_ip6.txt @@ -1,7 +1,6 @@ 2001:250::/30 -2001:254::/33 -2001:255::/32 -2001:7fa:5::/48 +2001:254::/31 +2001:256:100::/48 2001:c68::/32 2001:cc0::/32 2001:da8::/32 @@ -9,252 +8,38 @@ 2001:daa:2::/47 2001:daa:4::/47 2001:daa:6::/48 -2001:daa:9::/48 -2001:dc7::/45 -2001:dc7:9::/48 -2001:dc7:a::/47 -2001:dc7:c::/46 -2001:dc7:10::/44 -2001:dc7:20::/43 -2001:dc7:40::/42 -2001:dc7:80::/41 -2001:dc7:100::/40 -2001:dc7:200::/39 -2001:dc7:400::/38 -2001:dc7:800::/37 -2001:dc7:1000::/36 -2001:dc7:2000::/35 -2001:dc7:4000::/34 -2001:dc7:8000::/33 +2001:dc7::/32 2001:dd8:1::/48 2001:dd9::/48 +2001:df6:40::/48 2001:4510:400::/40 -2001:4510:1480::/41 -2001:4511:1480::/41 -2400:1040::/32 2400:1160::/32 -2400:12c0::/32 -2400:1340::/32 -2400:1380::/32 -2400:15c0::/32 -2400:1640::/32 -2400:16c0::/32 -2400:1740::/32 -2400:17c0::/32 -2400:1840::/32 -2400:18c0::/32 -2400:1940::/32 -2400:19a0::/32 -2400:19c0::/32 -2400:1a40::/32 -2400:1ac0::/32 -2400:1b40::/32 -2400:1cc0::/32 -2400:1d40::/32 -2400:1dc0::/32 -2400:1e40::/32 -2400:1ec0::/32 -2400:1f40::/32 -2400:1fc0::/32 -2400:3040::/32 -2400:3140::/32 -2400:3160::/32 -2400:31c0::/32 2400:3200::/32 -2400:32c0::/32 -2400:3340::/32 -2400:33c0::/32 -2400:3440::/32 -2400:34c0::/32 -2400:3540::/32 -2400:35c0::/32 -2400:3600::/32 -2400:3640::/32 -2400:3660::/32 -2400:36c0::/32 -2400:38c0::/32 -2400:39c0::/32 -2400:3a00::/32 -2400:3a40::/32 -2400:3b40::/32 -2400:3c40::/32 -2400:3cc0::/32 -2400:3e00::/32 -2400:3f40::/32 -2400:3f60::/46 -2400:3f60:5::/48 -2400:3f60:6::/47 -2400:3f60:8::/45 -2400:3f60:13::/48 -2400:3f60:14::/46 -2400:3f60:18::/45 -2400:3f60:20::/43 -2400:3f60:40::/42 -2400:3f60:80::/41 -2400:3f60:100::/40 -2400:3f60:200::/39 -2400:3f60:400::/38 -2400:3f60:800::/37 -2400:3f60:1000::/36 -2400:3f60:2000::/35 -2400:3f60:4000::/34 -2400:3f60:8000::/33 -2400:3fc0::/32 -2400:4440::/32 -2400:44c0::/32 -2400:4540::/32 -2400:4600::/32 -2400:4640::/32 -2400:46c0::/32 -2400:4920::/32 -2400:4bc0::/32 -2400:4e00::/32 -2400:4e40::/32 -2400:5080::/32 -2400:5280:1400::/38 -2400:5280:1c00::/38 -2400:5280:3400::/38 -2400:5280:4c00::/38 -2400:5280:5000::/36 -2400:5280:6000::/35 -2400:5280:8000::/34 -2400:5280:c000::/35 -2400:5280:e000::/36 -2400:5280:f000::/37 -2400:5280:f800::/38 -2400:5400::/32 -2400:5580::/32 -2400:55c0::/32 -2400:55e0::/32 -2400:5600::/32 -2400:5640::/32 -2400:56c0::/32 -2400:57c0::/32 -2400:5840::/32 +2400:5280:f803::/48 2400:5a00::/32 -2400:5a40::/32 -2400:5a60::/41 -2400:5a60:80::/42 -2400:5a60:c0::/43 -2400:5a60:e0::/44 -2400:5a60:f0::/45 -2400:5a60:f8::/46 -2400:5a60:fc::/47 -2400:5a60:fe::/48 -2400:5a60:100::/40 -2400:5a60:200::/39 -2400:5a60:400::/38 -2400:5a60:800::/37 -2400:5a60:1000::/36 -2400:5a60:2000::/35 -2400:5a60:4000::/34 -2400:5a60:8001::/48 -2400:5a60:8002::/47 -2400:5a60:8004::/46 -2400:5a60:8008::/45 -2400:5a60:8010::/44 -2400:5a60:8020::/43 -2400:5a60:8040::/42 -2400:5a60:8080::/41 -2400:5a60:8100::/40 -2400:5a60:8200::/39 -2400:5a60:8400::/38 -2400:5a60:8800::/37 -2400:5a60:9000::/36 -2400:5a60:a000::/35 -2400:5a60:c000::/34 -2400:5ac0::/32 -2400:5b40::/32 -2400:5bc0::/32 -2400:5c40::/32 -2400:5c80::/32 -2400:5cc0::/32 -2400:5e20::/32 -2400:5e80::/32 -2400:5ee0::/32 -2400:5fc0::/32 2400:6000::/32 -2400:6040::/32 -2400:60c0::/32 -2400:61c0::/32 -2400:6200::/32 2400:6600::/32 -2400:6640::/32 -2400:66a0::/32 -2400:66c0::/32 -2400:66e0::/32 -2400:6740::/32 -2400:67a0::/32 -2400:67c0::/32 -2400:6840::/32 -2400:68c0::/32 -2400:6940::/32 -2400:69c0::/32 -2400:6a00::/32 -2400:6a40::/32 -2400:6ac0::/32 -2400:6b40::/32 -2400:6bc0::/32 -2400:6c40::/32 -2400:6cc0::/32 -2400:6d40::/32 -2400:6da0::/32 -2400:6dc0::/32 -2400:6e00::/32 -2400:6e40::/32 -2400:6e60::/32 -2400:6ec0::/32 -2400:6f40::/32 -2400:6f80::/32 -2400:6fc0::/32 -2400:7040::/32 -2400:70a0::/32 -2400:7100::/32 -2400:7140::/32 -2400:71c0::/32 -2400:7200::/32 -2400:7240::/32 -2400:72c0::/32 -2400:7340::/32 -2400:73c0::/32 -2400:73e0::/32 -2400:7440::/32 -2400:74c0::/32 -2400:7540::/32 -2400:75a0::/28 -2400:75c0::/32 -2400:7640::/32 -2400:7680::/32 -2400:76c0::/32 -2400:7740::/32 -2400:77c0::/32 -2400:79c0::/32 -2400:7ae0::/32 -2400:7bc0::/32 -2400:7f80::/32 -2400:7fc0::/32 -2400:8080::/32 -2400:8200::/31 -2400:82c0::/32 -2400:8580::/32 -2400:8600::/32 -2400:86a0::/32 -2400:86e0::/32 -2400:8780::/32 -2400:87c0::/32 -2400:8840::/32 -2400:8920::/32 -2400:8980::/32 -2400:89c0::/32 -2400:8be0::/32 -2400:8ce0::/32 -2400:8e00::/32 -2400:8e60::/32 -2400:8f00::/32 -2400:8f60::/32 +2400:6e60:1301::/48 +2400:75aa::/32 +2400:7fc0::/40 +2400:7fc0:220::/44 +2400:7fc0:240::/44 +2400:7fc0:2a0::/44 +2400:7fc0:2c0::/44 +2400:7fc0:4000::/40 +2400:7fc0:4100::/48 +2400:7fc0:6000::/40 +2400:7fc0:8000::/36 +2400:7fc0:a000::/36 +2400:7fc0:bb00::/40 +2400:7fc0:c000::/36 +2400:8200::/32 +2400:89c0:1010::/44 +2400:89c0:1050::/46 +2400:89c0:1150::/48 +2400:89c0:6000::/48 2400:8fc0::/32 -2400:9020::/32 -2400:9040::/32 +2400:9020:f010::/46 2400:9380:8001::/48 2400:9380:8003::/48 2400:9380:8021::/48 @@ -272,2929 +57,893 @@ 2400:9380:90b1::/48 2400:9380:90b2::/47 2400:9380:90b4::/46 -2400:9380:9109::/48 2400:9380:9121::/48 2400:9380:9220::/47 2400:9380:9250::/47 2400:9380:9260::/48 2400:9380:9271::/48 2400:9380:9280::/47 -2400:9380:9282::/48 2400:9380:92b1::/48 2400:9380:92b2::/47 2400:9380:92b4::/46 -2400:93e0::/32 -2400:9520::/32 -2400:9580::/32 -2400:95c0::/32 -2400:95e0::/32 -2400:9600::/32 +2400:95e0::/48 +2400:9600:8800::/48 2400:9620::/32 -2400:98c0::/32 -2400:9960::/32 -2400:99e0::/32 -2400:9a00::/32 -2400:9ca0::/32 -2400:9e00::/32 -2400:a320::/32 -2400:a380::/32 -2400:a420::/32 -2400:a480::/32 -2400:a5a0::/32 -2400:a6a0::/39 -2400:a6a0:300::/40 -2400:a6a0:400::/38 -2400:a6a0:800::/37 -2400:a6a0:1000::/36 -2400:a6a0:2000::/35 -2400:a6a0:4000::/34 -2400:a6a0:8000::/33 -2400:a780::/32 -2400:a860::/32 -2400:a8a0::/32 -2400:a8c0::/32 -2400:a900::/32 +2400:a860:1::/48 +2400:a860:2::/47 +2400:a860:4::/47 +2400:a860:6::/48 2400:a980::/29 -2400:a9a0::/32 -2400:abc0::/32 -2400:ae00::/32 +2400:ae00:1981::/48 2400:b200::/32 -2400:b500::/32 2400:b600::/32 -2400:b620::/32 -2400:b6c0::/32 -2400:b700::/32 -2400:b9a0::/32 -2400:b9c0::/32 -2400:ba00::/32 -2400:be00::/32 -2400:bf00::/32 -2400:c200::/32 -2400:c380::/32 -2400:c840::/32 -2400:c8c0::/32 -2400:c940::/32 -2400:c9c0::/32 -2400:ca40::/32 -2400:cac0::/32 -2400:cb40::/32 -2400:cb80::/33 -2400:cb80:8000::/40 -2400:cb80:8100::/43 -2400:cb80:8120::/44 -2400:cb80:8130::/45 -2400:cb80:8138::/47 -2400:cb80:813a::/48 -2400:cb80:813c::/47 -2400:cb80:813e::/48 -2400:cb80:8140::/42 -2400:cb80:8180::/41 -2400:cb80:8200::/39 -2400:cb80:8400::/38 -2400:cb80:8800::/37 -2400:cb80:9000::/36 -2400:cb80:a000::/35 -2400:cb80:c000::/34 -2400:cbc0::/32 -2400:cc40::/32 -2400:cc80::/32 -2400:ccc0::/32 -2400:cd40::/32 -2400:cda0::/32 -2400:cdc0::/32 -2400:ce00::/32 -2400:ce40::/32 -2400:cf40::/32 -2400:cfc0::/32 -2400:d0a0::/32 -2400:d0c0::/32 -2400:d100::/32 -2400:d160::/32 -2400:d1c0::/32 -2400:d200::/32 -2400:d300::/32 -2400:d440::/32 -2400:d600::/32 -2400:d6a0::/32 -2400:d6c0::/32 -2400:d720::/32 -2400:d780::/32 -2400:d7a0::/32 +2400:b620::/48 +2400:b700::/48 +2400:be00::/48 +2400:cb80:e2e::/47 +2400:cb80:e30::/44 +2400:cb80:e40::/44 2400:da00::/32 -2400:da60::/32 2400:dd00::/28 -2400:dd40::/32 -2400:dda0::/32 -2400:de00::/32 -2400:de80::/32 -2400:dee0::/32 -2400:e0c0::/32 -2400:e680::/32 -2400:e7e0::/32 -2400:e880::/32 -2400:ebc0::/32 -2400:ed60::/32 -2400:eda0::/32 -2400:edc0::/32 -2400:ee00::/32 -2400:eec0::/32 -2400:ef40::/32 -2400:f480::/32 -2400:f5c0::/32 +2400:ee00:ffec::/46 +2400:ee00:fff0::/44 2400:f6e0::/32 2400:f720::/32 -2400:f7c0::/32 -2400:f840::/32 -2400:f860::/32 -2400:f980::/32 -2400:fac0::/32 -2400:fb40::/32 -2400:fb60::/32 -2400:fbc0::/32 -2400:fc40::/32 -2400:fcc0::/32 2400:fe00::/32 -2401:20:100::/40 -2401:20:200::/39 -2401:20:400::/38 -2401:20:800::/37 -2401:20:1000::/39 -2401:20:1200::/40 -2401:20:1300::/43 -2401:20:1320::/44 -2401:20:1334::/46 -2401:20:1338::/45 -2401:20:1340::/42 -2401:20:1380::/41 -2401:20:1400::/38 -2401:20:1800::/37 -2401:20:2000::/40 -2401:20:2100::/46 -2401:20:2108::/45 -2401:20:2110::/44 -2401:20:2120::/43 -2401:20:2140::/42 -2401:20:2180::/41 -2401:20:2200::/39 -2401:20:2400::/38 -2401:20:2800::/37 -2401:20:3000::/36 -2401:20:4000::/34 -2401:20:8000::/33 -2401:60::/32 -2401:80::/32 -2401:140::/32 -2401:1c0::/32 -2401:540::/32 -2401:620::/32 -2401:7c0::/32 2401:800::/32 -2401:9c0::/32 -2401:a00::/32 -2401:a40::/32 -2401:ac0::/32 -2401:b40::/32 -2401:ba0::/32 -2401:bc0::/32 -2401:c40::/32 -2401:cc0::/32 -2401:d40::/32 -2401:e00::/32 -2401:1000::/32 2401:1160::/32 -2401:11c0::/32 -2401:1200::/32 -2401:12c0::/32 2401:1320::/32 -2401:15c0::/32 -2401:18c0::/32 -2401:18e0::/28 -2401:1940::/32 -2401:19c0::/32 -2401:1a40::/32 -2401:1ac0::/32 -2401:1c60::/32 -2401:1ce0::/32 2401:1d40::/32 -2401:1da0::/32 -2401:1dc0::/32 -2401:1de0::/32 -2401:1e00::/32 -2401:1ec0::/32 -2401:1f40::/32 -2401:2040::/32 -2401:2080::/32 -2401:23c0::/32 -2401:2600::/32 -2401:2780::/32 -2401:2980::/32 2401:2a00:f000::/43 -2401:2b40::/32 2401:2e00::/32 -2401:2e20::/32 -2401:3100::/32 -2401:3380::/32 -2401:33c0::/32 -2401:3440::/32 -2401:3480::/32 +2401:3480::/36 +2401:3480:2000::/48 +2401:3480:3000::/36 2401:34a0::/31 -2401:34c0::/32 -2401:3640::/32 -2401:3780::/32 2401:3800::/32 -2401:3880::/32 -2401:3980::/32 -2401:3a00::/32 -2401:3a80::/32 -2401:3b80::/32 -2401:3c20::/32 -2401:3c80::/32 -2401:3d80::/32 -2401:3e80::/32 -2401:3f80::/32 -2401:4080::/32 -2401:4180::/32 -2401:4280::/32 -2401:4380::/32 -2401:4480::/32 -2401:4580::/32 -2401:4680::/32 -2401:4780::/32 -2401:4880::/32 -2401:4a80::/32 -2401:4b00::/32 -2401:4f80::/32 -2401:5680::/32 -2401:58a0::/32 -2401:59c0::/32 -2401:5b40::/32 -2401:5c20::/32 -2401:5c60::/32 -2401:5c80::/32 -2401:5fa0::/32 -2401:70e0::/32 -2401:7180::/32 -2401:71c0::/32 -2401:7240::/32 -2401:7320::/32 -2401:7360::/32 -2401:73a0::/32 -2401:7580::/32 -2401:7660::/32 -2401:7680::/32 -2401:7700::/32 -2401:7780::/32 -2401:77e0::/32 -2401:7820::/32 -2401:7880::/32 -2401:78e0::/32 -2401:7980::/32 -2401:7a00::/32 -2401:7a80::/32 -2401:7b80::/32 -2401:7bc0::/32 -2401:7c80::/32 -2401:7cc0::/32 -2401:7ce0::/32 -2401:7d40::/32 -2401:7d80::/32 +2401:5c20:10::/48 +2401:71c0::/48 +2401:7660::/48 2401:7e00::/32 -2401:7f80::/32 -2401:8200::/32 -2401:82c0::/32 -2401:8380::/32 -2401:8540::/32 -2401:8600::/32 -2401:8680::/34 -2401:8680:4000::/46 -2401:8680:4008::/45 -2401:8680:4010::/44 -2401:8680:4020::/43 -2401:8680:4040::/42 -2401:8680:4080::/41 -2401:8680:4103::/48 -2401:8680:4104::/46 -2401:8680:4108::/45 -2401:8680:4110::/44 -2401:8680:4120::/43 -2401:8680:4140::/42 -2401:8680:4180::/41 -2401:8680:4200::/39 -2401:8680:4400::/38 -2401:8680:4800::/37 -2401:8680:5000::/36 -2401:8680:6000::/35 -2401:8680:8000::/33 -2401:8720::/32 -2401:87e0::/32 -2401:8820::/31 -2401:8840::/32 -2401:8be0::/32 -2401:8d00::/47 -2401:8d00:3::/48 -2401:8d00:4::/46 -2401:8d00:8::/45 -2401:8d00:10::/46 -2401:8d00:17::/48 -2401:8d00:18::/45 -2401:8d00:20::/43 -2401:8d00:40::/42 -2401:8d00:80::/41 -2401:8d00:100::/40 -2401:8d00:200::/39 -2401:8d00:400::/38 -2401:8d00:800::/37 -2401:8d00:1000::/36 -2401:8d00:2000::/35 -2401:8d00:4000::/34 -2401:8d00:8000::/33 -2401:8da0::/32 -2401:8f40::/32 -2401:8fc0::/32 -2401:90a0::/32 -2401:9260::/32 -2401:92a0::/32 -2401:92e0::/32 -2401:9340::/32 -2401:95e0::/32 -2401:9600::/32 -2401:96c0::/32 -2401:96e0::/32 -2401:9720::/32 -2401:9740::/32 -2401:97a0::/32 -2401:98c0::/32 -2401:9a00::/32 -2401:9ac0::/32 -2401:9b20::/31 -2401:9b40::/32 -2401:9b60::/32 -2401:9bc0::/32 -2401:9ca0::/32 -2401:9d20::/32 -2401:9dc0::/32 -2401:9e20::/32 -2401:9e40::/32 -2401:9f80::/32 -2401:9fa0::/32 -2401:a140::/32 -2401:a2e0::/32 -2401:a340::/32 -2401:a3a0::/32 -2401:a3c0::/32 -2401:a4c0::/32 -2401:a4e0::/32 -2401:a540::/32 -2401:a5c0::/32 -2401:a620::/32 -2401:a640::/32 -2401:a6e0::/32 -2401:a720::/32 -2401:a940::/32 -2401:a980::/32 -2401:a9a0::/32 -2401:aa00::/32 -2401:aa20::/32 -2401:aa40::/32 -2401:ab60::/32 -2401:aba0::/32 -2401:acc0::/32 -2401:ad40::/32 -2401:adc0::/32 -2401:afa0::/32 -2401:b040::/32 +2401:8be0::/48 +2401:9a00::/44 +2401:9a00:10::/46 +2401:a140:1::/48 2401:b180::/32 -2401:b220::/32 -2401:b340::/32 -2401:b360::/32 -2401:b400::/32 -2401:b4c0::/32 -2401:b4e0::/32 -2401:b540::/32 -2401:b580::/32 -2401:b5a0::/32 -2401:b600::/32 +2401:b400::/45 +2401:b400:8::/47 +2401:b400:11::/48 +2401:b400:14::/48 +2401:b400:16::/47 +2401:b400:20::/47 2401:b680::/32 -2401:b6c0::/32 -2401:b6e0::/32 -2401:b7c0::/32 -2401:b940::/32 -2401:ba00::/32 -2401:ba40::/32 -2401:bb20::/32 -2401:bc60::/31 -2401:bda0::/32 2401:be00::/32 -2401:bf20::/32 -2401:c020::/32 -2401:c200::/32 -2401:c540::/32 -2401:c600::/32 -2401:c640::/32 -2401:c6c0::/32 -2401:c840::/32 -2401:c8c0::/32 -2401:ca00::/32 -2401:ca20::/32 +2401:c020:6::/48 +2401:c020:8::/47 +2401:c020:14::/48 2401:cb80::/32 -2401:cbe0::/32 2401:cc00::/32 -2401:cc60::/32 2401:ce00::/32 -2401:cf40::/32 -2401:cfc0::/32 -2401:cfe0::/32 -2401:d060::/32 -2401:d0c0::/32 -2401:d0e0::/32 -2401:d140::/32 -2401:d180::/32 -2401:d2c0::/32 -2401:d340::/32 -2401:d420::/32 -2401:d780::/32 -2401:d7e0::/32 -2401:d8e0::/32 -2401:d920::/28 -2401:da00::/32 -2401:dbe0::/32 -2401:dd20::/32 -2401:dd60::/32 +2401:d0e0:3::/48 +2401:d920::/48 2401:de00::/32 -2401:dfe0::/32 -2401:e020::/32 -2401:e080::/32 -2401:e0c0::/32 -2401:e140::/32 -2401:e240::/32 -2401:e2c0::/32 -2401:e340::/32 -2401:e360::/32 -2401:e620::/32 -2401:e840::/32 -2401:e8c0::/32 -2401:e940::/32 -2401:e9c0::/32 2401:ec00::/32 -2401:ec40::/32 -2401:f0a0::/32 -2401:f0e0::/32 -2401:f220::/32 -2401:f300::/32 -2401:f320::/32 -2401:f3e0::/32 -2401:f7c0::/32 -2401:f860::/46 -2401:f860:4::/47 -2401:f860:6::/48 -2401:f860:8::/47 -2401:f860:a::/48 -2401:f860:c::/46 -2401:f860:10::/44 -2401:f860:20::/43 -2401:f860:40::/42 -2401:f860:80::/45 -2401:f860:89::/48 -2401:f860:8a::/47 -2401:f860:8c::/46 -2401:f860:91::/48 -2401:f860:95::/48 -2401:f860:96::/48 -2401:f860:98::/45 -2401:f860:a0::/43 -2401:f860:c0::/43 -2401:f860:e0::/44 -2401:f860:f0::/46 -2401:f860:f4::/47 -2401:f860:f7::/48 -2401:f860:f8::/45 -2401:f860:200::/39 -2401:f860:400::/38 -2401:f860:800::/37 -2401:f860:1000::/36 -2401:f860:2000::/35 -2401:f860:4000::/34 -2401:f860:8000::/33 -2401:fa80::/32 -2401:fb80::/32 -2401:fc60::/32 -2401:fc80::/32 -2401:ffc0::/32 -2402:440::/32 -2402:5c0::/32 -2402:840::/32 -2402:a60::/32 -2402:c20::/32 -2402:c60::/32 -2402:e00::/32 -2402:fc0::/32 -2402:1000::/32 -2402:1160::/32 +2401:fa00:40::/48 +2402:840:d000::/46 +2402:840:e000::/46 +2402:c60::/48 2402:1440::/32 -2402:14c0::/32 -2402:1520::/32 -2402:1600::/32 -2402:16e0::/32 -2402:1740::/32 -2402:18a0::/32 -2402:19c0::/32 -2402:1be0::/32 -2402:1c20::/32 -2402:1f80::/32 2402:2000::/32 -2402:20e0::/33 -2402:20e0:8000::/34 -2402:20e0:c000::/35 -2402:20e0:e000::/36 -2402:20e0:f001::/48 -2402:20e0:f002::/47 -2402:20e0:f004::/46 -2402:20e0:f008::/45 -2402:20e0:f010::/44 -2402:20e0:f020::/43 -2402:20e0:f040::/42 -2402:20e0:f080::/41 -2402:20e0:f100::/40 -2402:20e0:f200::/39 -2402:20e0:f400::/38 -2402:20e0:f800::/37 -2402:2280::/32 -2402:2440::/32 -2402:24c0::/32 -2402:2540::/32 -2402:2620::/32 -2402:2640::/32 -2402:2760::/32 -2402:2a00::/32 -2402:2b80::/32 -2402:2bc0::/32 -2402:2ca0::/32 -2402:2d00::/32 -2402:2d80::/32 -2402:2e60::/32 -2402:2e80::/32 -2402:2f40::/32 -2402:3040::/32 -2402:3140::/32 -2402:3180:4::/46 -2402:3180:8::/45 -2402:3180:10::/44 -2402:3180:20::/43 -2402:3180:40::/42 -2402:3180:80::/41 -2402:3180:100::/40 -2402:3180:200::/39 -2402:3180:400::/38 -2402:3180:800::/37 -2402:3180:1000::/36 -2402:3180:2000::/35 -2402:3180:4000::/34 -2402:31c0::/32 -2402:3240::/32 -2402:32e0::/32 -2402:3320::/32 -2402:33a0::/32 -2402:33c0::/32 -2402:34e0::/32 -2402:36e0::/32 -2402:39c0::/32 -2402:3a40::/32 -2402:3ac0::/32 -2402:3ba0::/32 -2402:3c00::/32 -2402:3d20:2000::/35 -2402:3d20:4000::/34 -2402:3d20:8000::/33 -2402:3de0::/32 -2402:3e00::/32 -2402:3ec0::/32 -2402:3f80::/32 -2402:4060::/32 -2402:4140::/32 -2402:42c0::/32 -2402:4340::/32 -2402:43c0::/32 -2402:4440::/32 -2402:4500::/32 -2402:4540::/32 -2402:4820::/32 -2402:4a00::/32 -2402:4a40::/32 -2402:4a80::/32 -2402:4ac0::/32 +2402:36e0::/44 2402:4b80::/32 -2402:4bc0::/32 -2402:4be0::/32 -2402:4c40::/32 -2402:4d60::/32 -2402:4d80::/32 2402:4e00::/32 -2402:4ec0::/32 -2402:4f80::/32 -2402:50a0::/32 -2402:5180::/32 -2402:51a0::/32 -2402:5340::/32 -2402:5820::/32 -2402:5880::/32 -2402:5920::/32 -2402:5940::/32 -2402:59c0::/32 -2402:5a40::/32 -2402:5b40::/32 -2402:5bc0::/32 -2402:5d00::/32 -2402:5e00::/32 -2402:5e40::/32 2402:5ec0::/32 -2402:5f20::/32 -2402:5f40::/32 -2402:6060::/32 -2402:6280::/32 -2402:6320::/32 -2402:64c0::/32 -2402:66c0::/32 -2402:6740::/32 -2402:67c0::/32 -2402:6960::/32 -2402:6a00::/32 -2402:6b40::/32 -2402:6bc0::/32 -2402:6e00::/32 2402:6e80::/32 -2402:6f40::/32 -2402:6fc0::/32 -2402:7040::/32 -2402:7060::/32 -2402:7080::/32 -2402:70a0::/29 -2402:70c0::/32 -2402:7140::/32 -2402:71c0::/32 -2402:7240::/32 -2402:72a0::/32 -2402:72c0::/32 -2402:73e0::/32 -2402:7540::/32 -2402:75c0::/32 -2402:7740::/32 -2402:7d00::/32 -2402:7d80::/32 -2402:8180::/32 -2402:8300::/32 -2402:8380::/32 -2402:85c0::/32 -2402:8800::/32 -2402:8840::/32 -2402:8900::/32 -2402:8940::/32 -2402:89c0::/32 -2402:8b40::/32 +2402:6f40::/48 +2402:6f40:2::/47 +2402:7d80::/48 +2402:7d80:240::/48 +2402:7d80:8888::/48 2402:8bc0::/32 -2402:8cc0::/32 -2402:8d40::/32 -2402:8f40::/32 -2402:8f80::/32 -2402:9240::/32 -2402:92c0::/32 -2402:93c0::/32 -2402:9440::/32 -2402:9480::/32 -2402:94c0::/32 -2402:9580::/32 -2402:95c0::/32 -2402:9680::/32 -2402:96c0::/32 -2402:9840::/32 -2402:98c0::/32 -2402:9940::/32 +2402:92c0::/48 +2402:93c0::/48 +2402:93c0:20::/48 +2402:93c0:100::/48 2402:9a80::/32 -2402:9b80::/32 -2402:9f80::/32 -2402:9fc0::/32 -2402:a080::/32 -2402:a180::/32 2402:a200::/32 -2402:a240::/32 -2402:a280::/32 -2402:a380::/32 -2402:a640::/32 -2402:a680::/32 -2402:a6c0::/32 -2402:a840::/32 -2402:a880::/32 -2402:aa80::/32 -2402:ab80::/32 -2402:ae00::/32 -2402:ae40::/32 -2402:aec0::/32 -2402:af80::/32 -2402:afc0::/32 -2402:b080::/32 -2402:b200::/32 -2402:b440::/32 -2402:b6c0::/32 -2402:b880::/32 -2402:b8c0::/32 -2402:b940:100::/40 -2402:b940:400::/38 -2402:b940:800::/37 -2402:b940:1000::/36 -2402:b940:2000::/35 -2402:b940:4000::/34 -2402:b940:8000::/33 -2402:b980::/32 -2402:ba80::/32 -2402:bac0::/32 -2402:bbc0::/32 -2402:bf80::/32 -2402:c280::/32 -2402:c3c0::/32 -2402:c5c0::/32 -2402:c9c0::/32 -2402:cc40::/32 -2402:cf00::/32 -2402:cf40::/32 -2402:d040::/32 -2402:d140::/32 -2402:d2c0:3::/48 -2402:d2c0:4::/46 -2402:d2c0:8::/45 -2402:d2c0:10::/44 -2402:d2c0:20::/43 -2402:d2c0:40::/42 -2402:d2c0:80::/41 -2402:d2c0:100::/40 -2402:d2c0:200::/39 -2402:d2c0:400::/38 -2402:d2c0:800::/37 -2402:d2c0:1000::/36 -2402:d2c0:2000::/35 -2402:d2c0:4000::/34 -2402:d2c0:8000::/33 -2402:d300::/32 +2402:b8c0:6::/48 +2402:b8c0:86::/48 +2402:b8c0:106::/48 +2402:b8c0:186::/48 2402:d340::/32 -2402:d380::/32 -2402:d5c0::/32 -2402:d6c0::/32 -2402:d740::/32 -2402:d780::/32 -2402:d880::/32 -2402:d980::/32 -2402:da40::/32 -2402:db40::/34 -2402:db40:4000::/36 -2402:db40:5000::/37 -2402:db40:5800::/40 -2402:db40:5901::/48 -2402:db40:5902::/47 -2402:db40:5904::/46 -2402:db40:5908::/45 -2402:db40:5910::/44 -2402:db40:5920::/43 -2402:db40:5940::/42 -2402:db40:5980::/41 -2402:db40:5a00::/39 -2402:db40:5c00::/38 -2402:db40:6000::/35 -2402:db40:8000::/33 -2402:dcc0::/32 -2402:de40::/32 -2402:dec0::/32 -2402:df40::/32 -2402:dfc0::/32 -2402:e040::/32 -2402:e0c0::/32 -2402:e140::/32 -2402:e2c0::/32 -2402:e3c0::/32 +2402:db40:5100::/48 +2402:db40:5f00::/46 +2402:dfc0::/44 +2402:dfc0:50::/44 2402:e480::/32 -2402:e540::/32 -2402:e680::/32 2402:e740::/32 -2402:e780::/32 -2402:e7c0::/37 -2402:e7c0:800::/38 -2402:e7c0:1000::/36 -2402:e7c0:2000::/35 -2402:e7c0:4000::/34 -2402:e7c0:8000::/33 -2402:e880::/32 -2402:e980::/32 -2402:eb80::/32 -2402:ec80::/32 -2402:ed80::/32 +2402:e7c0::/32 +2402:e880::/48 2402:ef40::/32 -2402:ef80::/32 2402:f000::/32 -2402:f140::/32 -2402:f480::/32 -2402:f540::/32 -2402:f580::/32 -2402:f780::/32 -2402:f8c0::/32 -2402:f980::/32 -2402:f9c0::/32 -2402:fac0::/32 -2402:fcc0::/32 -2402:ff40::/32 -2402:ffc0::/32 +2402:f140:ff00::/46 +2402:f140:ff04::/48 +2402:f140:ff10::/46 +2402:f140:ff14::/48 +2402:f8c0::/42 2403:600::/32 -2403:700::/32 -2403:7c0::/32 -2403:800::/31 -2403:980::/32 -2403:a80::/32 -2403:b80::/32 2403:c80::/32 -2403:d80::/32 -2403:e80::/32 -2403:f00::/32 -2403:f80::/32 -2403:fc0:400::/38 -2403:fc0:c00::/38 -2403:fc0:1000::/36 -2403:fc0:2000::/35 -2403:fc0:4000::/34 -2403:fc0:8000::/33 -2403:1180::/32 -2403:1340::/32 -2403:1440::/32 -2403:1580::/32 -2403:16c0::/32 -2403:17c0::/32 -2403:1980::/32 -2403:1b80::/32 -2403:1c80::/32 -2403:1d80::/32 -2403:1dc0::/32 -2403:1e80::/32 -2403:1ec0::/36 -2403:1ec0:1000::/37 -2403:1ec0:1800::/40 -2403:1ec0:1901::/48 -2403:1ec0:1902::/47 -2403:1ec0:1904::/46 -2403:1ec0:1908::/45 -2403:1ec0:1950::/44 -2403:1ec0:1960::/43 -2403:1ec0:1980::/41 -2403:1ec0:1a00::/39 -2403:1ec0:1c00::/38 -2403:1ec0:2000::/35 -2403:1ec0:4000::/34 -2403:1ec0:8000::/33 -2403:1f80::/32 -2403:2040::/32 -2403:2080::/32 -2403:2180::/32 -2403:2240::/32 -2403:2280::/32 -2403:2380::/32 -2403:2440::/32 -2403:24c0::/32 -2403:2580::/32 -2403:25c0::/32 -2403:2680::/32 -2403:2740::/32 -2403:2780::/32 -2403:28c0::/32 -2403:2940::/32 -2403:2a00::/32 -2403:2a40::/32 -2403:2ac0::/32 +2403:1b80::/48 +2403:1ec0:1200::/48 +2403:1ec0:1400::/48 +2403:1ec0:1600::/48 +2403:1ec0:1610::/48 +2403:2040::/48 2403:2b40::/32 -2403:2bc0::/32 -2403:2cc0::/32 -2403:2f40::/32 -2403:2fc0::/32 -2403:3040::/32 -2403:30c0::/32 2403:3140::/32 -2403:3280::/32 -2403:32c0::/32 -2403:3380::/32 -2403:3480::/32 -2403:3580::/32 -2403:3640::/32 -2403:3680::/32 -2403:36c0::/32 -2403:3740::/32 -2403:3780::/32 -2403:37c0::/32 -2403:3840::/32 -2403:3880::/32 -2403:38c0::/32 -2403:3940::/32 -2403:3980::/32 -2403:39c0::/32 -2403:3b80::/32 -2403:3c40::/32 -2403:3c80::/32 -2403:3cc0::/32 -2403:3d40::/32 -2403:3d80::/32 -2403:3dc0::/32 -2403:3e80::/32 -2403:3ec0::/32 -2403:3f80::/32 -2403:4080::/32 -2403:4180::/32 -2403:4280::/32 +2403:4280::/47 2403:4300::/32 -2403:4380::/32 -2403:4580::/32 -2403:4680::/32 -2403:4780::/32 -2403:4840::/32 -2403:4880::/32 -2403:4980::/32 -2403:4a40::/32 -2403:4a80::/32 -2403:4b40::/32 -2403:4b80::/32 -2403:4c80::/32 -2403:4cc0::/32 -2403:4d80::/32 -2403:4ec0::/32 -2403:5040::/32 -2403:5080::/32 -2403:5280::/32 -2403:5380::/32 -2403:54c0::/32 -2403:5540::/32 -2403:5580::/32 -2403:5640::/32 -2403:5780::/32 -2403:5980::/32 -2403:5a80::/32 -2403:5b40::/32 -2403:5b80::/32 -2403:5c80::/32 -2403:5d80::/32 -2403:5e40::/32 -2403:5e80::/32 -2403:5ec0::/32 -2403:5f80::/32 -2403:5fc0::/32 -2403:6080::/32 -2403:6180::/32 -2403:6280::/32 -2403:62c0::/32 -2403:6380::/42 -2403:6380:41::/48 -2403:6380:43::/48 -2403:6380:44::/46 -2403:6380:48::/45 -2403:6380:50::/44 -2403:6380:60::/43 -2403:6380:80::/41 -2403:6380:100::/40 -2403:6380:200::/39 -2403:6380:400::/38 -2403:6380:800::/37 -2403:6380:1000::/36 -2403:6380:2000::/35 -2403:6380:4000::/34 -2403:6380:8000::/33 -2403:6580::/32 -2403:6680::/32 -2403:6740::/32 -2403:6780::/32 -2403:6880::/32 -2403:6980::/32 +2403:4c80::/48 +2403:5c80::/48 +2403:6740::/48 2403:6a00::/32 -2403:6c80::/32 -2403:6d40::/32 -2403:6d80::/32 -2403:6e80::/32 -2403:6f40::/32 -2403:6fc0::/32 -2403:7040::/32 -2403:7080::/32 -2403:7180::/32 -2403:7280::/32 -2403:7380::/32 -2403:7480::/32 -2403:7540::/32 2403:7580::/32 -2403:76c0::/32 -2403:7700::/32 -2403:78c0::/32 -2403:7a80::/32 -2403:7b00::/32 -2403:7d80::/32 -2403:7e80::/32 -2403:7f80::/32 -2403:8080::/32 -2403:8180::/32 -2403:8280::/32 -2403:8380::/32 -2403:83c0::/32 -2403:8480::/32 -2403:8580::/32 -2403:8880::/32 -2403:8900::/32 -2403:8980::/32 -2403:8a40::/32 -2403:8a80::/32 -2403:8b00::/32 -2403:8b80::/32 +2403:8080:101::/48 2403:8c00::/32 -2403:8c80::/32 -2403:8d00::/32 -2403:8d80::/32 -2403:9080::/32 -2403:9180::/32 -2403:9280::/32 -2403:9380::/32 -2403:9480::/32 -2403:9580::/32 -2403:9680::/32 -2403:9780::/32 -2403:9880::/32 -2403:9a80::/32 -2403:9ac0::/32 -2403:9b00::/32 -2403:9b40::/32 -2403:9b80::/32 -2403:9c80::/32 -2403:9d00::/32 -2403:9d80::/32 -2403:9e40::/32 -2403:9e80::/32 -2403:9ec0::/32 -2403:9f80::/32 -2403:a100::/32 -2403:a140::/32 +2403:9b00:2400::/48 +2403:9b00:6000::/48 +2403:a100::/48 +2403:a140:10::/48 +2403:a140:100::/40 2403:a200::/32 -2403:a300::/32 -2403:a480::/32 -2403:a580::/32 -2403:a680::/32 -2403:a6c0::/32 -2403:a780::/32 -2403:a880::/32 -2403:a940::/32 -2403:a980::/32 -2403:a9c0::/32 -2403:aa40::/32 -2403:aa80::/32 -2403:ab80::/32 2403:ac00::/32 -2403:af80::/32 -2403:b080::/32 -2403:b180::/32 -2403:b280::/32 -2403:b380::/32 2403:b400::/32 -2403:b480::/32 -2403:b580::/32 -2403:b680::/32 -2403:b780::/32 -2403:b880::/32 -2403:b980::/32 -2403:ba40::/32 -2403:c040::/32 -2403:c080::/32 -2403:c100::/32 -2403:c140::/32 -2403:c180::/32 -2403:c3c0::/32 -2403:c440::/32 -2403:c480::/32 -2403:c4c0::/32 2403:c980::/32 -2403:cdc0::/32 -2403:cf80::/32 -2403:d080::/32 -2403:d180::/32 -2403:d280::/32 -2403:d2c0::/32 -2403:d380::/32 2403:d400::/32 -2403:d440::/32 -2403:d480::/32 -2403:d580::/32 -2403:d680::/32 -2403:d780::/32 -2403:d7c0::/32 -2403:d880::/32 -2403:d980::/32 -2403:d9c0::/32 -2403:da80::/32 -2403:dac0::/32 -2403:db00::/32 -2403:db80::/32 -2403:dc80::/32 -2403:dd80::/32 -2403:de80::/32 -2403:df80::/32 -2403:e080::/32 -2403:e180::/32 -2403:e280::/32 -2403:e300::/32 -2403:e480::/32 -2403:e500::/32 -2403:e580::/32 -2403:e640::/32 -2403:e680::/32 -2403:e700::/32 -2403:e780::/32 -2403:e7c0::/32 -2403:e880::/32 -2403:e980::/32 -2403:ea80::/32 -2403:eac0::/32 -2403:eb80::/32 -2403:ec80::/32 -2403:ed00::/32 -2403:ed40::/32 -2403:ed80::/32 -2403:ee80::/32 -2403:ef80::/32 -2403:f080::/32 -2403:f100::/32 -2403:f180::/32 -2403:f240::/32 -2403:f280::/32 -2403:f300::/32 -2403:f380::/32 -2403:f4c0::/32 -2403:f580::/32 -2403:f740::/32 -2403:f8c0::/32 -2403:f980::/32 -2403:fb00::/32 -2403:fb80::/32 -2403:fc40::/32 -2403:fe40::/32 -2403:fe80::/32 -2403:fec0::/32 -2403:ff80::/32 -2403:ffc0::/31 -2404:100::/32 -2404:158::/32 -2404:240::/32 -2404:280::/32 -2404:440::/32 -2404:480::/32 -2404:680::/32 -2404:a80::/32 -2404:b80::/32 -2404:bc0::/32 -2404:c40::/32 -2404:d80::/32 -2404:f00::/32 -2404:f80::/32 -2404:1080::/32 -2404:10c0::/32 -2404:1180::/32 -2404:14c0::/32 -2404:1880::/32 +2403:e7c0:3::/48 +2403:f4c0::/48 +2403:ffc0:1100::/40 +2403:ffc0:1200::/39 +2404:bc0:1::/48 +2404:bc0:4000::/43 +2404:bc0:4100::/43 +2404:bc0:4200::/43 +2404:bc0:4300::/44 +2404:bc0:4400::/43 +2404:bc0:4500::/43 +2404:bc0:4620::/44 +2404:bc0:4f00::/43 2404:1c80::/32 -2404:1cc0::/32 -2404:1d80::/39 -2404:1d80:200::/44 -2404:1d80:210::/47 -2404:1d80:212::/48 -2404:1d80:214::/46 -2404:1d80:218::/45 -2404:1d80:220::/43 -2404:1d80:240::/42 -2404:1d80:280::/41 -2404:1d80:300::/40 -2404:1d80:400::/38 -2404:1d80:800::/37 -2404:1d80:1000::/36 -2404:1d80:2000::/35 -2404:1d80:4000::/34 -2404:1d80:8000::/33 -2404:1e80::/32 -2404:1f40::/32 -2404:21c0::/32 -2404:30c0::/32 -2404:3140::/32 -2404:31c0::/32 -2404:3240::/32 -2404:32c0::/32 -2404:3300::/32 -2404:3340::/32 -2404:3480::/32 -2404:35c0::/32 -2404:3640::/32 -2404:36c0::/32 -2404:3700::/32 -2404:3740::/32 -2404:37c0::/32 -2404:3840::/32 -2404:3940::/32 -2404:3f40::/32 -2404:41c0::/32 -2404:4540::/32 -2404:4740::/32 -2404:4d00::/32 +2404:3700::/48 2404:4dc0::/32 -2404:51c0::/32 -2404:5640::/32 -2404:5a80::/32 -2404:5b00::/32 -2404:5d00::/32 -2404:6000::/32 -2404:6100::/32 -2404:6380::/32 -2404:6500::/32 -2404:65c0::/32 -2404:6a40::/32 -2404:6f80::/32 -2404:7100::/32 -2404:7180::/32 -2404:71c0::/32 -2404:7240::/32 -2404:74c0::/32 +2404:6380::/48 +2404:6380:1000::/48 +2404:6380:8001::/48 +2404:6500:dcb3::/48 +2404:7180:a000::/48 +2404:7180:a010::/48 +2404:7180:aa00::/48 +2404:7180:aa10::/48 +2404:7180:b001::/48 +2404:7180:b002::/48 +2404:7180:b010::/48 +2404:7180:c001::/48 +2404:7180:c002::/48 +2404:7180:c011::/48 +2404:7180:c012::/48 +2404:7180:f000::/48 +2404:7180:f010::/48 +2404:7240::/33 2404:7600::/32 -2404:7740::/32 2404:7940::/32 -2404:7d00::/32 -2404:8040::/32 -2404:80c0::/32 -2404:8140::/32 -2404:81c0::/32 -2404:8480::/32 -2404:8580::/32 -2404:8700::/32 -2404:8880::/32 -2404:8a80::/32 -2404:8dc0::/32 -2404:9340::/32 -2404:9b80::/32 -2404:9c80::/32 -2404:a000::/32 -2404:a080::/32 -2404:a0c0::/32 -2404:a180::/32 -2404:a240::/32 -2404:a740::/32 -2404:b100::/32 -2404:b340::/32 -2404:b3c0::/32 -2404:b440::/32 -2404:b4c0::/32 -2404:b900::/32 -2404:bbc0::/32 -2404:bc40::/32 -2404:c1c0::/32 -2404:c240::/32 -2404:c2c0::/32 +2404:c2c0::/40 +2404:c2c0:240::/44 +2404:c2c0:280::/44 +2404:c2c0:2c0::/44 +2404:c2c0:501::/48 +2404:c2c0:4000::/40 +2404:c2c0:4100::/48 +2404:c2c0:6000::/40 +2404:c2c0:8000::/36 +2404:c2c0:bb00::/40 +2404:c2c0:c000::/36 2404:c300::/32 -2404:c3c0::/32 -2404:c440::/32 -2404:c4c0::/32 -2404:c540::/32 -2404:c5c0::/32 -2404:c940::/32 -2404:c9c0::/32 -2404:cd00::/32 -2404:d040::/32 -2404:d080::/32 -2404:d140::/32 -2404:d280::/32 -2404:d3c0::/32 -2404:d640::/32 -2404:d6c0::/32 -2404:d7c0::/32 -2404:d840::/32 -2404:dd80::/32 -2404:df00::/32 -2404:e280::/32 -2404:e540::/32 -2404:e780::/32 -2404:e880::/32 +2404:c940::/48 +2404:e280::/47 2404:e8c0::/32 -2404:eb80::/32 -2404:ec40::/32 -2404:ecc0::/32 -2404:edc0::/32 -2404:f040::/32 -2404:f4c0:f000::/44 -2404:f7c0::/32 -2405:80::/32 -2405:480::/32 -2405:580::/32 -2405:680::/32 -2405:6c0:2::/47 -2405:6c0:4::/46 -2405:6c0:8::/45 -2405:6c0:10::/44 -2405:6c0:20::/43 -2405:6c0:40::/42 -2405:6c0:80::/41 -2405:6c0:100::/40 -2405:6c0:200::/39 -2405:6c0:400::/38 -2405:6c0:800::/37 -2405:6c0:1000::/36 -2405:6c0:2000::/35 -2405:6c0:4000::/34 -2405:6c0:8000::/33 -2405:780::/32 -2405:880::/32 -2405:940::/32 -2405:980::/32 -2405:9c0::/32 -2405:a80::/32 -2405:b80::/32 -2405:c80::/32 -2405:d80::/32 -2405:e80::/32 -2405:f80::/32 -2405:1080::/32 -2405:1180::/32 -2405:1280::/32 -2405:1380::/32 -2405:1480::/32 -2405:1580::/32 -2405:1680::/32 -2405:18c0::/32 -2405:1c80::/32 -2405:1d80::/32 -2405:1e80::/32 -2405:1f80::/32 -2405:1fc0::/32 -2405:2080::/32 -2405:2180::/32 -2405:2280::/32 -2405:2340::/32 -2405:2380::/32 -2405:2480::/32 -2405:24c0::/32 -2405:2580::/32 -2405:2680::/32 -2405:2780::/32 -2405:2880::/32 -2405:2980::/32 -2405:2a80::/32 -2405:2b80::/32 -2405:2bc0::/32 -2405:2c80::/32 -2405:2d80::/32 -2405:2e80::/32 -2405:2ec0::/32 -2405:2f40::/32 -2405:2f80::/32 -2405:3140::/32 -2405:31c0::/32 -2405:37c0::/32 -2405:3880::/32 -2405:3980::/32 -2405:39c0::/32 -2405:3a80::/32 -2405:3ac0::/32 -2405:3b00::/32 -2405:3b80::/32 -2405:3bc0::/32 -2405:3c40::/32 -2405:3c80::/32 -2405:3d80::/32 -2405:3e80::/32 -2405:3f40::/32 -2405:3f80::/32 -2405:4080::/32 -2405:4140::/32 -2405:4180::/32 -2405:41c0::/32 -2405:4280::/32 -2405:4380::/32 -2405:4480::/32 -2405:44c0::/32 -2405:4540::/32 -2405:4580::/32 -2405:4680::/32 -2405:4780::/32 -2405:4880::/32 -2405:4980::/32 -2405:4a80::/32 -2405:4b80::/32 -2405:4d40::/32 -2405:4e80::/32 -2405:4f80::/32 -2405:5080::/32 -2405:5180::/32 -2405:5240:400::/38 -2405:5240:c00::/38 -2405:5240:1000::/36 -2405:5240:2000::/35 -2405:5240:4000::/34 -2405:5240:8000::/33 -2405:5280::/32 -2405:52c0::/32 -2405:5380::/32 -2405:5480::/32 -2405:5580::/32 -2405:5680::/32 -2405:5780::/32 -2405:57c0::/32 -2405:5880::/32 -2405:5980::/32 -2405:5a80::/32 -2405:5b80::/32 -2405:5c80::/32 -2405:5cc0::/32 -2405:5d40::/32 -2405:5d80::/32 -2405:5dc0::/32 -2405:5e80::/32 -2405:5f80::/32 -2405:6080::/32 -2405:6180::/32 -2405:6200::/32 -2405:6880::/32 -2405:68c0::/32 -2405:6940::/32 -2405:69c0::/32 -2405:6a80::/32 -2405:6b80::/32 -2405:6c80::/32 -2405:6d80::/32 -2405:6e80::/32 -2405:6f00::/32 -2405:6f80::/32 -2405:7040::/32 -2405:7080::/32 -2405:7180::/32 -2405:7280::/32 -2405:7380::/32 -2405:7480::/32 -2405:7580::/32 -2405:7680::/32 -2405:7780::/32 -2405:7880::/32 -2405:78c0::/32 -2405:7980::/32 -2405:79c0::/32 -2405:7a80::/32 -2405:7b80::/32 -2405:7c80::/32 -2405:7d40::/32 -2405:7f40::/32 -2405:7fc0::/32 -2405:8280::/32 -2405:8480::/32 -2405:84c0::/34 -2405:84c0:4000::/35 -2405:84c0:6000::/37 -2405:84c0:6800::/38 -2405:84c0:6c00::/39 -2405:84c0:6e00::/40 -2405:84c0:7000::/36 -2405:84c0:8000::/48 -2405:84c0:8002::/48 -2405:84c0:8006::/48 -2405:84c0:8008::/45 -2405:84c0:8010::/48 -2405:84c0:8019::/48 -2405:84c0:801c::/46 -2405:84c0:8020::/47 -2405:84c0:8036::/47 -2405:84c0:8038::/46 -2405:84c0:803c::/47 -2405:84c0:803e::/48 -2405:84c0:8041::/48 -2405:84c0:8042::/47 -2405:84c0:8044::/47 -2405:84c0:8048::/46 -2405:84c0:804c::/47 -2405:84c0:804e::/48 -2405:84c0:8050::/48 -2405:84c0:8053::/48 -2405:84c0:8058::/45 -2405:84c0:8060::/43 -2405:84c0:8080::/41 -2405:84c0:8100::/40 -2405:84c0:8200::/39 -2405:84c0:8400::/38 -2405:84c0:8800::/37 -2405:84c0:9000::/36 -2405:84c0:a000::/40 -2405:84c0:a101::/48 -2405:84c0:a102::/47 -2405:84c0:a104::/46 -2405:84c0:a108::/45 -2405:84c0:a110::/44 -2405:84c0:a120::/43 -2405:84c0:a140::/42 -2405:84c0:a180::/41 -2405:84c0:a200::/39 -2405:84c0:a400::/38 -2405:84c0:a800::/37 -2405:84c0:b000::/36 -2405:84c0:c000::/34 -2405:8580::/32 -2405:8680::/32 -2405:8780::/32 -2405:8880::/32 -2405:8980::/32 +2405:80:10::/48 +2405:80:13::/48 +2405:6c0:2::/48 +2405:6c0:4::/48 +2405:1480:1000::/48 +2405:1480:2000::/48 +2405:1480:3000::/47 +2405:3140:11::/48 +2405:3140:21::/48 +2405:3140:31::/48 +2405:3140:3a::/48 +2405:68c0:21::/48 +2405:6940::/48 +2405:6f00:c101::/48 +2405:6f00:c102::/48 +2405:6f00:c170::/47 +2405:6f00:c602::/48 +2405:7040:6000::/47 +2405:78c0:6e00::/43 2405:8a40::/32 -2405:8a80::/32 -2405:8ac0::/32 -2405:8b80::/32 -2405:8c80::/32 -2405:8d80::/32 -2405:8e80::/32 -2405:8f80::/32 -2405:9080::/32 -2405:9180::/32 -2405:9280::/32 -2405:9300::/32 -2405:9340::/32 -2405:9380::/32 -2405:93c0::/32 -2405:9480::/32 -2405:94c0::/32 -2405:9580::/32 -2405:9680::/32 -2405:9700::/32 -2405:9780::/32 -2405:97c0::/32 -2405:9880::/32 -2405:9900::/32 -2405:9980::/32 -2405:99c0::/32 -2405:9a80::/32 -2405:9b00::/32 -2405:9b80::/32 -2405:9bc0::/32 -2405:9e00::/32 -2405:a240::/32 -2405:a500::/32 -2405:a680::/32 -2405:a900::/32 -2405:a980::/32 -2405:aa80::/32 -2405:ab00::/32 +2405:a900:ffee::/48 2405:ad00::/32 -2405:af00::/32 -2405:b100::/32 -2405:b300::/32 2405:b7c0::/32 -2405:b880::/32 -2405:b980::/32 -2405:bb00::/32 -2405:bd00::/32 -2405:bd80::/32 -2405:bdc0::/32 -2405:be80::/32 -2405:bf00::/32 -2405:c040::/32 -2405:c280::/32 -2405:c380::/32 -2405:c480::/32 -2405:c500::/32 -2405:c580::/32 -2405:c680::/32 -2405:c780::/32 -2405:c880::/32 -2405:c980::/32 -2405:ca80::/32 -2405:cb80::/32 -2405:cc80::/32 -2405:cd80::/32 -2405:ce80::/32 -2405:d280::/32 -2405:d4c0::/32 -2405:d700::/32 2405:d900::/32 -2405:df40::/32 2405:e000::/32 -2405:e040::/32 -2405:e1c0::/32 -2405:e600::/32 -2405:ef40::/30 -2405:f340::/32 -2405:f6c0::/32 2405:f940::/32 -2405:fdc0::/32 -2406:40::/32 -2406:80::/32 -2406:c0::/32 -2406:140:400::/38 -2406:140:c00::/38 -2406:140:1000::/36 -2406:140:2000::/35 -2406:140:4000::/34 -2406:140:8000::/33 2406:280::/32 -2406:440::/32 -2406:4c0::/32 -2406:840::/48 -2406:840:3::/48 -2406:840:4::/46 -2406:840:8::/45 -2406:840:18::/45 -2406:840:21::/48 -2406:840:22::/47 -2406:840:24::/46 -2406:840:28::/45 -2406:840:30::/44 -2406:840:40::/46 -2406:840:45::/48 -2406:840:47::/48 -2406:840:48::/45 -2406:840:50::/44 -2406:840:60::/44 -2406:840:70::/45 -2406:840:7a::/47 -2406:840:7c::/46 -2406:840:82::/47 -2406:840:84::/46 -2406:840:88::/45 -2406:840:91::/48 -2406:840:92::/47 -2406:840:94::/46 -2406:840:98::/45 -2406:840:a0::/43 -2406:840:c0::/42 -2406:840:102::/48 -2406:840:104::/46 -2406:840:108::/45 -2406:840:111::/48 -2406:840:112::/47 -2406:840:114::/46 -2406:840:118::/45 -2406:840:120::/43 -2406:840:140::/42 -2406:840:181::/48 -2406:840:182::/47 -2406:840:184::/46 -2406:840:188::/45 -2406:840:190::/44 -2406:840:1a0::/43 -2406:840:1c0::/42 -2406:840:201::/48 -2406:840:202::/47 -2406:840:204::/46 -2406:840:208::/45 -2406:840:210::/44 -2406:840:220::/43 -2406:840:240::/42 -2406:840:280::/42 -2406:840:2c0::/43 -2406:840:2e1::/48 -2406:840:2e2::/47 -2406:840:2e4::/46 -2406:840:2e8::/45 -2406:840:2f0::/44 -2406:840:300::/41 -2406:840:382::/47 -2406:840:384::/46 -2406:840:388::/45 -2406:840:390::/44 -2406:840:3a0::/43 -2406:840:3c0::/47 -2406:840:3c3::/48 -2406:840:3c4::/46 -2406:840:3c8::/45 -2406:840:3d0::/44 -2406:840:3e1::/48 -2406:840:3e2::/47 -2406:840:3e4::/46 -2406:840:3e8::/45 -2406:840:3f0::/44 -2406:840:400::/44 -2406:840:412::/47 -2406:840:414::/46 -2406:840:418::/45 -2406:840:421::/48 -2406:840:422::/47 -2406:840:424::/46 -2406:840:428::/45 -2406:840:430::/44 -2406:840:440::/42 -2406:840:481::/48 -2406:840:482::/47 -2406:840:484::/46 -2406:840:488::/45 -2406:840:490::/44 -2406:840:4a0::/43 -2406:840:4c0::/42 -2406:840:500::/42 -2406:840:541::/48 -2406:840:542::/47 -2406:840:544::/46 -2406:840:548::/45 -2406:840:550::/44 -2406:840:560::/43 -2406:840:580::/41 -2406:840:600::/41 -2406:840:681::/48 -2406:840:682::/47 -2406:840:684::/46 -2406:840:688::/45 -2406:840:690::/44 -2406:840:6a0::/43 -2406:840:6c0::/48 -2406:840:6c2::/47 -2406:840:6c4::/46 -2406:840:6c8::/45 -2406:840:6d0::/44 -2406:840:6e0::/43 -2406:840:700::/44 -2406:840:711::/48 -2406:840:712::/47 -2406:840:714::/46 -2406:840:718::/45 -2406:840:720::/43 -2406:840:740::/42 -2406:840:780::/41 -2406:840:804::/47 -2406:840:807::/48 -2406:840:808::/45 -2406:840:810::/44 -2406:840:820::/43 -2406:840:840::/48 -2406:840:843::/48 -2406:840:844::/46 -2406:840:848::/45 -2406:840:850::/44 -2406:840:861::/48 -2406:840:862::/47 -2406:840:864::/46 -2406:840:868::/45 -2406:840:870::/44 -2406:840:884::/46 -2406:840:888::/45 -2406:840:890::/44 -2406:840:8a0::/43 -2406:840:8c0::/42 -2406:840:900::/40 -2406:840:a00::/44 -2406:840:a12::/47 -2406:840:a14::/46 -2406:840:a18::/45 -2406:840:a20::/44 -2406:840:a30::/48 -2406:840:a33::/48 -2406:840:a34::/46 -2406:840:a38::/45 -2406:840:a40::/42 -2406:840:a80::/41 -2406:840:b00::/40 -2406:840:c00::/47 -2406:840:c03::/48 -2406:840:c04::/46 -2406:840:c08::/45 -2406:840:c10::/44 -2406:840:c20::/43 -2406:840:c40::/43 -2406:840:c61::/48 -2406:840:c62::/47 -2406:840:c64::/46 -2406:840:c68::/45 -2406:840:c70::/44 -2406:840:c80::/43 -2406:840:ca0::/44 -2406:840:cb0::/45 -2406:840:cb9::/48 -2406:840:cba::/47 -2406:840:cbc::/46 -2406:840:cc0::/47 -2406:840:cc3::/48 -2406:840:cc4::/46 -2406:840:cc8::/45 -2406:840:cd0::/44 -2406:840:ce0::/43 -2406:840:d00::/40 -2406:840:e00::/39 -2406:840:1000::/48 -2406:840:1002::/47 -2406:840:1004::/46 -2406:840:1008::/45 -2406:840:1010::/44 -2406:840:1020::/43 -2406:840:1040::/42 -2406:840:1080::/41 -2406:840:1100::/40 -2406:840:1200::/39 -2406:840:1400::/38 -2406:840:1801::/48 -2406:840:1802::/47 -2406:840:1804::/46 -2406:840:1808::/45 -2406:840:1810::/44 -2406:840:1820::/43 -2406:840:1840::/42 -2406:840:1880::/41 -2406:840:1900::/40 -2406:840:1a00::/39 -2406:840:1c00::/38 -2406:840:2000::/39 -2406:840:2200::/40 -2406:840:2300::/41 -2406:840:2381::/48 -2406:840:2382::/47 -2406:840:2384::/46 -2406:840:2388::/45 -2406:840:2390::/44 -2406:840:23a0::/43 -2406:840:23c0::/42 -2406:840:2400::/38 -2406:840:2801::/48 -2406:840:2802::/47 -2406:840:2804::/46 -2406:840:2808::/45 -2406:840:2810::/44 -2406:840:2820::/43 -2406:840:2840::/42 -2406:840:2880::/48 -2406:840:2882::/47 -2406:840:2884::/46 -2406:840:2888::/45 -2406:840:2890::/44 -2406:840:28a0::/43 -2406:840:28c0::/42 -2406:840:2900::/40 -2406:840:2a00::/39 -2406:840:2c00::/38 -2406:840:3000::/37 -2406:840:3801::/48 -2406:840:3802::/47 -2406:840:3804::/46 -2406:840:3808::/45 -2406:840:3810::/44 -2406:840:3820::/43 -2406:840:3840::/42 -2406:840:3880::/41 -2406:840:3900::/40 -2406:840:3a00::/39 -2406:840:3c00::/38 -2406:840:4000::/40 -2406:840:4102::/47 -2406:840:4104::/46 -2406:840:4108::/45 -2406:840:4110::/44 -2406:840:4120::/43 -2406:840:4140::/42 -2406:840:4180::/41 -2406:840:4200::/40 -2406:840:4300::/41 -2406:840:4380::/42 -2406:840:43c0::/43 -2406:840:43e2::/47 -2406:840:43e4::/46 -2406:840:43e8::/45 -2406:840:43f0::/44 -2406:840:4400::/38 -2406:840:4802::/47 -2406:840:4804::/46 -2406:840:4808::/45 -2406:840:4810::/44 -2406:840:4820::/43 -2406:840:4840::/42 -2406:840:4882::/47 -2406:840:4884::/46 -2406:840:4888::/45 -2406:840:4890::/44 -2406:840:48a0::/43 -2406:840:48c0::/42 -2406:840:4900::/40 -2406:840:4a00::/39 -2406:840:4c00::/38 -2406:840:5000::/40 -2406:840:5102::/47 -2406:840:5104::/46 -2406:840:5108::/45 -2406:840:5110::/44 -2406:840:5120::/43 -2406:840:5140::/42 -2406:840:5180::/41 -2406:840:5200::/39 -2406:840:5400::/38 -2406:840:5802::/47 -2406:840:5804::/46 -2406:840:5808::/45 -2406:840:5810::/44 -2406:840:5820::/43 -2406:840:5840::/43 -2406:840:5862::/47 -2406:840:5864::/46 -2406:840:5868::/45 -2406:840:5870::/44 -2406:840:5882::/47 -2406:840:5884::/46 -2406:840:5888::/45 -2406:840:5890::/44 -2406:840:58a0::/43 -2406:840:58c0::/42 -2406:840:5900::/40 -2406:840:5a00::/39 -2406:840:5c02::/47 -2406:840:5c04::/46 -2406:840:5c08::/45 -2406:840:5c10::/44 -2406:840:5c20::/43 -2406:840:5c40::/42 -2406:840:5c80::/41 -2406:840:5d00::/40 -2406:840:5e00::/39 -2406:840:6000::/35 -2406:840:8000::/40 -2406:840:8200::/39 -2406:840:8400::/38 -2406:840:8800::/37 -2406:840:9010::/44 -2406:840:9020::/43 -2406:840:9040::/42 -2406:840:9080::/41 -2406:840:9101::/48 -2406:840:9103::/48 -2406:840:9104::/46 -2406:840:9108::/45 -2406:840:9110::/44 -2406:840:9120::/43 -2406:840:9140::/43 -2406:840:9160::/44 -2406:840:9170::/45 -2406:840:9179::/48 -2406:840:917a::/47 -2406:840:917c::/46 -2406:840:9180::/41 -2406:840:9300::/40 -2406:840:9400::/39 -2406:840:9610::/44 -2406:840:9630::/44 -2406:840:9640::/43 -2406:840:9660::/46 -2406:840:9664::/47 -2406:840:9667::/48 -2406:840:9668::/45 -2406:840:9670::/44 -2406:840:9680::/41 -2406:840:9800::/46 -2406:840:9808::/45 -2406:840:9810::/45 -2406:840:9818::/47 -2406:840:981b::/48 -2406:840:9820::/43 -2406:840:9850::/44 -2406:840:9860::/47 -2406:840:9865::/48 -2406:840:9866::/47 -2406:840:9868::/45 -2406:840:9870::/44 -2406:840:9880::/41 -2406:840:9900::/42 -2406:840:9940::/43 -2406:840:9960::/47 -2406:840:9965::/48 -2406:840:9968::/46 -2406:840:996d::/48 -2406:840:996e::/47 -2406:840:9981::/48 -2406:840:9982::/47 -2406:840:9984::/46 -2406:840:9988::/45 -2406:840:99a0::/43 -2406:840:99c0::/42 -2406:840:9a00::/39 -2406:840:9c00::/39 -2406:840:9e00::/41 -2406:840:9e80::/42 -2406:840:9ec0::/43 -2406:840:9ee0::/44 -2406:840:9f00::/41 -2406:840:9f80::/42 -2406:840:9fc0::/43 -2406:840:9fe0::/44 -2406:840:a000::/35 -2406:840:c000::/36 -2406:840:e000::/41 -2406:840:e090::/44 -2406:840:e0a0::/43 -2406:840:e0c0::/45 -2406:840:e0c8::/46 -2406:840:e0cc::/47 -2406:840:e0ce::/48 -2406:840:e0d0::/44 -2406:840:e0e4::/46 -2406:840:e0e9::/48 -2406:840:e0ea::/47 -2406:840:e0ec::/46 -2406:840:e0f0::/44 -2406:840:e100::/45 -2406:840:e108::/46 -2406:840:e10c::/47 -2406:840:e10e::/48 -2406:840:e110::/44 -2406:840:e120::/43 -2406:840:e140::/45 -2406:840:e148::/46 -2406:840:e14c::/47 -2406:840:e14e::/48 -2406:840:e150::/44 -2406:840:e160::/43 -2406:840:e190::/44 -2406:840:e1a0::/43 -2406:840:e1c0::/42 -2406:840:e210::/44 -2406:840:e220::/43 -2406:840:e240::/43 -2406:840:e260::/44 -2406:840:e271::/48 -2406:840:e272::/47 -2406:840:e274::/46 -2406:840:e278::/46 -2406:840:e27c::/47 -2406:840:e27e::/48 -2406:840:e290::/44 -2406:840:e2a0::/43 -2406:840:e2c0::/42 -2406:840:e300::/48 -2406:840:e305::/48 -2406:840:e307::/48 -2406:840:e308::/45 -2406:840:e310::/44 -2406:840:e320::/44 -2406:840:e340::/44 -2406:840:e350::/48 -2406:840:e352::/47 -2406:840:e355::/48 -2406:840:e356::/47 -2406:840:e358::/46 -2406:840:e35c::/48 -2406:840:e35e::/47 -2406:840:e360::/43 -2406:840:e380::/41 -2406:840:e400::/40 -2406:840:e500::/42 -2406:840:e540::/43 -2406:840:e560::/44 -2406:840:e570::/45 -2406:840:e578::/46 -2406:840:e57c::/47 -2406:840:e57f::/48 -2406:840:e580::/41 -2406:840:e610::/44 -2406:840:e622::/47 -2406:840:e624::/46 -2406:840:e628::/45 -2406:840:e630::/44 -2406:840:e640::/43 -2406:840:e660::/46 -2406:840:e664::/47 -2406:840:e668::/45 -2406:840:e670::/44 -2406:840:e680::/41 -2406:840:e700::/43 -2406:840:e730::/44 -2406:840:e740::/42 -2406:840:e780::/41 -2406:840:e800::/45 -2406:840:e808::/46 -2406:840:e80c::/47 -2406:840:e80e::/48 -2406:840:e810::/44 -2406:840:e820::/43 -2406:840:e840::/45 -2406:840:e848::/46 -2406:840:e84c::/47 -2406:840:e84e::/48 -2406:840:e850::/44 -2406:840:e860::/43 -2406:840:e880::/41 -2406:840:e900::/40 -2406:840:ea00::/40 -2406:840:eb06::/48 -2406:840:eb09::/48 -2406:840:eb0a::/48 -2406:840:eb0c::/47 -2406:840:eb0e::/48 -2406:840:eb10::/44 -2406:840:eb20::/43 -2406:840:eb40::/42 -2406:840:ebc0::/42 -2406:840:ec00::/41 -2406:840:ec80::/42 -2406:840:ecc0::/43 -2406:840:ecf0::/44 -2406:840:ed00::/40 -2406:840:ee00::/42 -2406:840:ee42::/47 -2406:840:ee45::/48 -2406:840:ee46::/47 -2406:840:ee48::/47 -2406:840:ee4a::/48 -2406:840:ee4c::/48 -2406:840:ee4e::/47 -2406:840:ee50::/44 -2406:840:ee60::/43 -2406:840:ee80::/43 -2406:840:eea0::/44 -2406:840:eeb0::/48 -2406:840:eeb3::/48 -2406:840:eeb4::/46 -2406:840:eeb8::/45 -2406:840:eec0::/43 -2406:840:eee0::/46 -2406:840:eee4::/48 -2406:840:eee6::/47 -2406:840:eee8::/45 -2406:840:eef0::/44 -2406:840:ef00::/41 -2406:840:ef80::/42 -2406:840:efc0::/43 -2406:840:efe0::/44 -2406:840:f000::/41 -2406:840:f080::/43 -2406:840:f0a0::/48 -2406:840:f0a2::/47 -2406:840:f0a4::/46 -2406:840:f0a8::/47 -2406:840:f0ab::/48 -2406:840:f0ac::/46 -2406:840:f0b0::/44 -2406:840:f0c0::/42 -2406:840:f102::/47 -2406:840:f104::/46 -2406:840:f108::/45 -2406:840:f110::/44 -2406:840:f120::/43 -2406:840:f140::/42 -2406:840:f180::/41 -2406:840:f200::/40 -2406:840:f300::/43 -2406:840:f320::/44 -2406:840:f330::/46 -2406:840:f334::/47 -2406:840:f336::/48 -2406:840:f338::/45 -2406:840:f340::/42 -2406:840:f390::/44 -2406:840:f3a0::/43 -2406:840:f3c0::/42 -2406:840:f400::/48 -2406:840:f403::/48 -2406:840:f404::/46 -2406:840:f408::/45 -2406:840:f410::/44 -2406:840:f420::/43 -2406:840:f440::/45 -2406:840:f448::/46 -2406:840:f44c::/47 -2406:840:f44e::/48 -2406:840:f450::/44 -2406:840:f460::/43 -2406:840:f480::/41 -2406:840:f500::/40 -2406:840:f600::/42 -2406:840:f640::/43 -2406:840:f670::/44 -2406:840:f680::/47 -2406:840:f682::/48 -2406:840:f684::/46 -2406:840:f688::/45 -2406:840:f690::/44 -2406:840:f6a0::/43 -2406:840:f6c0::/42 -2406:840:f700::/40 -2406:840:f800::/42 -2406:840:f840::/43 -2406:840:f864::/46 -2406:840:f86a::/47 -2406:840:f86d::/48 -2406:840:f86e::/47 -2406:840:f870::/44 -2406:840:f880::/45 -2406:840:f888::/48 -2406:840:f88a::/47 -2406:840:f88c::/46 -2406:840:f890::/44 -2406:840:f8a0::/43 -2406:840:f8c0::/42 -2406:840:f900::/41 -2406:840:f980::/44 -2406:840:f9a0::/43 -2406:840:f9c0::/42 -2406:840:fa00::/48 -2406:840:fa02::/47 -2406:840:fa04::/46 -2406:840:fa08::/45 -2406:840:fa10::/44 -2406:840:fa20::/43 -2406:840:fa41::/48 -2406:840:fa42::/47 -2406:840:fa44::/46 -2406:840:fa48::/45 -2406:840:fa50::/44 -2406:840:fa70::/44 -2406:840:fa81::/48 -2406:840:fa82::/47 -2406:840:fa84::/46 -2406:840:fa88::/45 -2406:840:fa90::/44 -2406:840:faa0::/43 -2406:840:fac0::/42 -2406:840:fb00::/40 -2406:840:fc14::/46 -2406:840:fc18::/45 -2406:840:fc24::/46 -2406:840:fc28::/45 -2406:840:fc34::/46 -2406:840:fc38::/45 -2406:840:fc44::/46 -2406:840:fc48::/45 -2406:840:fc54::/46 -2406:840:fc58::/45 -2406:840:fc64::/46 -2406:840:fc68::/45 -2406:840:fc74::/46 -2406:840:fc78::/45 -2406:840:fc80::/44 -2406:840:fc94::/46 -2406:840:fc98::/45 -2406:840:fca4::/46 -2406:840:fca8::/45 -2406:840:fcb4::/46 -2406:840:fcb8::/45 -2406:840:fcc0::/44 -2406:840:fcd1::/48 -2406:840:fcd2::/47 -2406:840:fcd4::/46 -2406:840:fcd8::/45 -2406:840:fce0::/44 -2406:840:fcf6::/47 -2406:840:fcf8::/45 -2406:840:fd00::/43 -2406:840:fd20::/44 -2406:840:fd31::/48 -2406:840:fd32::/47 -2406:840:fd34::/46 -2406:840:fd38::/45 -2406:840:fd41::/48 -2406:840:fd42::/47 -2406:840:fd44::/48 -2406:840:fd47::/48 -2406:840:fd4a::/47 -2406:840:fd4c::/46 -2406:840:fd51::/48 -2406:840:fd52::/47 -2406:840:fd54::/48 -2406:840:fd57::/48 -2406:840:fd5a::/47 -2406:840:fd5c::/46 -2406:840:fd61::/48 -2406:840:fd62::/47 -2406:840:fd64::/48 -2406:840:fd67::/48 -2406:840:fd6a::/47 -2406:840:fd6c::/46 -2406:840:fd71::/48 -2406:840:fd72::/47 -2406:840:fd74::/48 -2406:840:fd77::/48 -2406:840:fd7a::/47 -2406:840:fd7c::/46 -2406:840:fd81::/48 -2406:840:fd82::/47 -2406:840:fd84::/48 -2406:840:fd87::/48 -2406:840:fd8a::/47 -2406:840:fd8c::/46 -2406:840:fd94::/46 -2406:840:fd98::/46 -2406:840:fd9c::/47 -2406:840:fd9e::/48 -2406:840:fda1::/48 -2406:840:fda2::/47 -2406:840:fda4::/46 -2406:840:fda8::/45 -2406:840:fdb1::/48 -2406:840:fdb2::/47 -2406:840:fdb4::/46 -2406:840:fdb8::/45 -2406:840:fdc1::/48 -2406:840:fdc2::/47 -2406:840:fdc4::/46 -2406:840:fdc8::/45 -2406:840:fdd0::/44 -2406:840:fde0::/43 -2406:840:fe00::/43 -2406:840:fe20::/46 -2406:840:fe24::/47 -2406:840:fe26::/48 -2406:840:fe28::/45 -2406:840:fe30::/44 -2406:840:fe40::/44 -2406:840:fe52::/47 -2406:840:fe54::/46 -2406:840:fe58::/45 -2406:840:fe60::/43 -2406:840:fe80::/44 -2406:840:fe95::/48 -2406:840:fe9c::/48 -2406:840:fe9f::/48 -2406:840:fea0::/48 -2406:840:fea9::/48 -2406:840:feb0::/47 -2406:840:feb2::/48 -2406:840:feb4::/46 -2406:840:feb8::/45 -2406:840:fec1::/48 -2406:840:fec6::/47 -2406:840:fec8::/47 -2406:840:fed0::/48 -2406:840:fed2::/48 -2406:840:fed5::/48 -2406:840:fed6::/48 -2406:840:fed9::/48 -2406:840:feda::/48 -2406:840:fede::/48 -2406:840:fee0::/45 -2406:840:fee8::/46 -2406:840:feec::/48 -2406:840:feee::/47 -2406:840:fef1::/48 -2406:840:ff00::/40 -2406:880::/32 -2406:8c0::/32 -2406:d80::/32 -2406:e80::/32 -2406:f80::/32 -2406:1080::/32 -2406:1100::/32 -2406:1180::/32 -2406:1280::/32 -2406:1380::/32 -2406:1480::/32 -2406:1580::/32 -2406:15c0::/32 -2406:1680::/32 -2406:1780::/32 -2406:1880::/32 -2406:1980::/32 -2406:1a80::/32 -2406:1b80::/32 -2406:1c80::/32 -2406:1d80::/32 -2406:1e40::/32 -2406:1e80::/32 -2406:1f80::/32 -2406:2080::/32 -2406:2640::/32 +2406:840:9680::/44 +2406:840:f889::/48 +2406:1080::/48 2406:2700::/32 -2406:2780::/32 -2406:2880::/32 -2406:2980::/32 -2406:2a80::/32 -2406:2b80::/32 -2406:2c40::/32 -2406:2c80::/32 -2406:2d80::/32 -2406:2e80::/32 -2406:2f80::/32 -2406:3080::/32 -2406:3180::/32 -2406:31c0::/32 -2406:3280::/32 -2406:3300::/32 2406:3340::/32 -2406:3380::/32 -2406:3480::/32 -2406:34c0::/32 -2406:3580::/32 -2406:3640::/32 -2406:3680::/32 -2406:3700::/32 -2406:3780::/32 -2406:3880::/32 -2406:3980::/32 -2406:39c0::/32 -2406:3ac0::/32 -2406:3e80::/32 -2406:3f80::/32 -2406:4080::/32 -2406:40c0::/32 -2406:4180::/32 -2406:4280::/32 -2406:42c0::/32 -2406:4340::/32 -2406:4380::/32 -2406:43c0::/32 -2406:4480::/32 -2406:4500::/32 -2406:4680::/32 -2406:4b80::/32 -2406:4c80::/32 -2406:4d00::/32 -2406:4d80::/32 -2406:4e80::/32 -2406:4f00::/32 -2406:4f80::/32 -2406:5080::/32 -2406:50c0::/32 -2406:5180::/32 -2406:5280::/32 +2406:4d00::/48 2406:52c0::/32 -2406:5340::/32 -2406:5380::/32 -2406:5480::/32 -2406:5580::/32 -2406:5680::/32 -2406:5780::/32 -2406:5840::/31 -2406:5940::/32 -2406:5980::/32 -2406:5a40::/32 -2406:5ac0::/32 -2406:5b40::/32 -2406:5d80::/32 -2406:5e80::/32 -2406:5f80::/32 -2406:6080::/32 +2406:5340:6666::/48 +2406:5340:8888::/48 2406:6100::/32 -2406:6180::/32 -2406:61c0::/29 -2406:6280::/32 -2406:6300::/32 -2406:6340::/32 -2406:6380::/32 -2406:6480::/32 -2406:6500::/32 -2406:6580::/32 -2406:65c0::/32 -2406:6640::/32 -2406:6680::/32 -2406:6780::/32 -2406:6880::/32 -2406:6980::/32 -2406:6a80::/32 -2406:6b80::/32 -2406:6bc0::/32 -2406:6c80::/32 -2406:6d80::/32 -2406:6e80::/32 -2406:6f80::/32 -2406:7080::/32 -2406:7280::/32 -2406:7380::/32 -2406:7480::/32 -2406:7580::/32 -2406:7680::/32 -2406:7780::/32 -2406:7880::/32 -2406:7980::/32 -2406:7a80::/32 -2406:7b80::/32 -2406:7c80::/32 -2406:7d00::/32 -2406:7d80::/32 -2406:7e80::/32 -2406:7f80::/32 -2406:7fc0::/32 -2406:8080::/32 -2406:8180::/32 -2406:8280::/32 -2406:8380::/32 -2406:8480::/32 -2406:8500::/32 -2406:8580::/32 -2406:8780::/32 -2406:8880::/32 -2406:8980::/32 -2406:8a80::/32 -2406:8b80::/32 -2406:8c80::/32 -2406:8d80::/32 -2406:8e80::/32 -2406:8f40::/32 -2406:8f80::/32 -2406:9200::/32 -2406:9380::/32 -2406:9480::/32 -2406:94c0::/32 -2406:9780::/32 -2406:9d80::/32 -2406:9e80::/32 -2406:9f80::/32 -2406:a080::/32 -2406:a180::/32 -2406:a280::/32 -2406:a380::/32 -2406:a480::/32 -2406:a580::/32 -2406:a680::/32 -2406:a780::/32 -2406:a7c0::/32 -2406:a880::/32 -2406:a8c0::/32 -2406:a980::/32 -2406:aa80::/32 -2406:aac0::/32 -2406:ab80::/32 -2406:ac80::/32 -2406:acc0::/32 -2406:ad40::/32 -2406:ad80::/32 -2406:ae80::/32 -2406:af80::/32 -2406:b080::/32 -2406:b640::/32 -2406:b880::/32 -2406:b980::/32 -2406:ba80::/32 -2406:bb80::/32 -2406:bc80::/32 -2406:bd40::/32 -2406:bd80::/32 -2406:bdc0::/32 -2406:be80::/32 -2406:bf80::/32 -2406:c080::/32 -2406:c180::/32 -2406:c280::/32 -2406:c340::/32 -2406:c480::/32 -2406:c580::/32 -2406:c680::/32 -2406:c780::/32 -2406:c880::/32 -2406:c900::/32 -2406:c980::/32 -2406:ca80::/32 -2406:cac0::/32 -2406:cb80::/32 -2406:cc80::/32 -2406:cd80::/32 -2406:ce80::/32 -2406:cf00::/30 -2406:cf80::/32 -2406:d080::/32 -2406:d140::/33 -2406:d140:c000::/34 -2406:d180::/32 -2406:d280::/32 -2406:d2c0::/32 -2406:d380::/32 -2406:d440::/32 -2406:d480::/32 -2406:d580::/32 -2406:d680::/32 -2406:d780::/32 -2406:d880::/32 -2406:d980::/32 -2406:db80::/32 -2406:dc80::/32 -2406:dd00::/32 -2406:dd80:400::/38 -2406:dd80:c00::/38 -2406:dd80:1000::/36 -2406:dd80:2000::/35 -2406:dd80:4000::/34 -2406:dd80:8000::/33 -2406:de80::/32 -2406:df80::/32 -2406:e080::/32 -2406:e180::/32 -2406:e2c0::/32 -2406:e380::/32 +2406:b640:100::/48 +2406:b640:4100::/48 +2406:cac0::/40 +2406:cac0:200::/40 +2406:cf00::/48 +2406:cf00:1000::/43 +2406:d440:100::/43 +2406:d440:200::/43 +2406:d440:300::/43 +2406:d440:ff00::/48 +2406:d440:ffff::/48 2406:e3c0::/32 -2406:e500::/32 -2406:e580::/32 -2406:e680::/32 -2406:e780::/32 -2406:e8c0::/32 -2406:ea40::/28 -2406:f280::/33 -2406:f300::/32 -2406:f4c0::/32 -2406:f7c0::/32 -2406:f980::/32 -2406:fc80::/32 -2406:fd80::/32 -2406:fe80::/32 -2406:ff00::/32 -2407:480::/32 -2407:580::/32 -2407:cc0::/32 -2407:f40::/32 -2407:17c0::/32 -2407:1900::/32 -2407:1d00::/32 -2407:2280::/32 -2407:2380::/32 -2407:23c0::/32 -2407:2780::/32 -2407:2840::/32 -2407:2ac0::/32 -2407:31c0::/32 -2407:3340::/32 -2407:3540::/32 -2407:3700::/32 -2407:3740::/32 +2406:e500::/33 +2407:23c0::/48 +2407:2840::/48 2407:37c0::/32 -2407:3900::/32 -2407:3f40::/32 -2407:43c0::/32 -2407:4440::/32 -2407:4580::/32 -2407:4680::/32 -2407:4740::/32 -2407:4880::/32 -2407:4980::/32 -2407:4a80::/32 -2407:4c80::/32 -2407:4d80::/32 -2407:4e80::/32 -2407:4f00::/32 2407:5380::/32 -2407:53c0::/32 -2407:5500::/32 -2407:5780::/32 -2407:5840::/32 -2407:6040::/32 -2407:6580::/32 -2407:6c40::/32 -2407:7680::/32 -2407:7780::/32 -2407:7880::/32 -2407:7980::/32 -2407:7c80::/32 -2407:7d00::/32 -2407:7d80::/32 -2407:7e80::/32 -2407:8880::/32 -2407:8b80::/32 -2407:8f40::/32 -2407:9080::/32 -2407:9180::/32 -2407:94c0::/32 -2407:9680::/32 -2407:9980::/32 -2407:9b40::/32 -2407:9bc0::/32 +2407:6c40:1100::/48 +2407:6c40:1210::/48 +2407:6c40:1500::/48 +2407:6c40:1600::/40 +2407:7d00:1::/48 +2407:8f40:2::/48 2407:9f00::/32 -2407:9f80::/32 -2407:a040::/32 -2407:a640::/32 -2407:a7c0::/32 -2407:a880::/32 -2407:a940::/32 2407:ad80::/32 2407:ae80::/32 -2407:af80::/32 -2407:b080::/32 -2407:b180::/32 -2407:b280::/32 -2407:b380::/32 -2407:b580::/32 -2407:b680::/32 -2407:b780::/32 -2407:b880::/32 -2407:b980::/32 -2407:ba00::/32 -2407:ba80::/32 -2407:bb80::/32 +2407:b380:8000::/48 2407:bc00::/32 -2407:bc80::/32 -2407:bd80::/32 -2407:bdc0::/32 -2407:be80::/32 -2407:bf80::/32 -2407:c080::/32 -2407:c380::/32 -2407:c400::/32 -2407:c480::/32 -2407:c580::/32 -2407:c680::/32 -2407:c780::/32 -2407:c880::/32 -2407:c900::/32 -2407:c980::/32 -2407:cb80::/32 -2407:cc80::/32 -2407:cd80::/32 -2407:ce80::/32 -2407:cf80::/32 -2407:d480::/32 -2407:d580::/32 -2407:d680::/32 -2407:d780::/32 -2407:d7c0::/32 -2407:d880::/32 -2407:d8c0::/32 -2407:d980::/32 +2407:c080::/35 +2407:c080:4000::/37 +2407:c080:5000::/37 +2407:c080:6000::/36 +2407:c080:8000::/36 2407:d9c0::/32 -2407:da80::/32 -2407:db80::/32 -2407:dc80::/32 -2407:dd80::/32 -2407:de80::/32 -2407:df80::/32 -2407:dfc0::/32 -2407:e080::/32 -2407:e180::/32 -2407:e280::/32 -2407:e380::/32 -2407:e480::/32 -2407:e580::/32 -2407:e680::/32 -2407:e780::/32 -2407:e800::/32 -2407:ea80::/32 -2407:eb80::/32 -2407:ec40::/32 -2407:ec80::/32 -2407:ecc0::/32 -2407:ed80::/32 -2407:ee80::/32 -2407:ef80::/32 -2407:f080::/32 -2407:f180::/32 -2407:f280::/32 -2407:f380::/32 -2407:f480::/32 -2407:f580::/32 -2407:f680::/32 -2407:f780::/32 -2407:f880::/32 -2407:f980::/32 -2407:fa80::/32 -2407:fb80::/32 -2407:fc80::/32 -2407:fd80::/32 -2408:4000::/40 -2408:4000:100::/47 -2408:4000:103::/48 -2408:4000:104::/46 -2408:4000:108::/45 -2408:4000:110::/44 -2408:4000:120::/43 -2408:4000:140::/42 -2408:4000:180::/41 -2408:4000:200::/39 -2408:4000:400::/38 -2408:4000:800::/37 -2408:4000:1000::/36 -2408:4000:2000::/35 -2408:4000:4000::/34 -2408:4000:8000::/33 -2408:4001::/32 -2408:4002::/31 -2408:4004::/30 -2408:4008::/29 -2408:4010::/30 -2408:4014::/31 -2408:4016:2::/47 -2408:4016:4::/46 -2408:4016:8::/45 -2408:4016:10::/44 -2408:4016:20::/43 -2408:4016:40::/42 -2408:4016:80::/41 -2408:4016:100::/40 -2408:4016:200::/39 -2408:4016:400::/38 -2408:4016:800::/37 -2408:4016:1000::/36 -2408:4016:2000::/35 -2408:4016:4000::/34 -2408:4016:8000::/33 -2408:4017::/32 -2408:4018::/29 -2408:4020::/27 -2408:4040::/26 -2408:4080::/25 -2408:4100::/24 -2408:4200::/23 -2408:6000::/24 -2408:8000::/20 -2409:1000::/20 -2409:2000::/21 -2409:6000::/20 -2409:8000::/21 -2409:8800::/22 -2409:8c00::/25 -2409:8c80::/30 -2409:8c84::/32 -2409:8c85::/34 -2409:8c85:4000::/36 -2409:8c85:5000::/38 -2409:8c85:5400::/43 -2409:8c85:5420::/44 -2409:8c85:5430::/47 -2409:8c85:5433::/48 -2409:8c85:5434::/46 -2409:8c85:5438::/45 -2409:8c85:5440::/42 -2409:8c85:5480::/41 -2409:8c85:5500::/40 -2409:8c85:5600::/39 -2409:8c85:5800::/37 -2409:8c85:6000::/35 -2409:8c85:8000::/33 -2409:8c86::/31 -2409:8c88::/29 -2409:8c90::/28 -2409:8ca0::/27 -2409:8cc0::/26 -2409:8d00::/24 -2409:8e00::/23 -240a:2000::/24 -240a:4000::/21 -240a:6000::/24 -240a:8000::/21 +2408:4000::/22 +2408:8000::/48 +2408:8000:2::/47 +2408:8000:1000::/36 +2408:8000:2000::/35 +2408:8000:4000::/34 +2408:8000:8000::/33 +2408:8001::/32 +2408:8024:8000::/33 +2408:8025::/32 +2408:8026::/32 +2408:802a:8000::/33 +2408:802c::/32 +2408:803e::/32 +2408:8056::/32 +2408:80c2::/33 +2408:80c5::/33 +2408:80e0:4000::/36 +2408:80e2::/33 +2408:80e9:4000::/34 +2408:80f0:4000::/36 +2408:80f1::/42 +2408:80f1:40::/43 +2408:80f1:70::/44 +2408:80f1:80::/41 +2408:80f1:100::/43 +2408:80f1:120::/44 +2408:80f1:160::/43 +2408:80f1:180::/43 +2408:80f1:1b0::/44 +2408:80f1:1c0::/43 +2408:80f1:1e0::/44 +2408:80f1:200::/40 +2408:80f5:4000::/34 +2408:80f9:4000::/34 +2408:8120:1::/48 +2408:8120:2::/48 +2408:8120:7000::/36 +2408:8140:2000::/48 +2408:815f:e000::/35 +2408:8181::/40 +2408:8181:6000::/40 +2408:8181:8000::/40 +2408:8181:a000::/40 +2408:8181:a220::/44 +2408:8181:e000::/40 +2408:8182:6000::/40 +2408:8182:c000::/40 +2408:8183:4000::/40 +2408:8183:8000::/40 +2408:81a2:2000::/35 +2408:81a2:4000::/35 +2408:81a3:6000::/35 +2408:81a3:c800::/48 +2408:81a3:ca66::/48 +2408:8206::/31 +2408:8208::/29 +2408:8210::/30 +2408:8214::/31 +2408:821a::/31 +2408:8220::/31 +2408:8226::/32 +2408:822a::/31 +2408:822e::/31 +2408:8230::/29 +2408:8238::/31 +2408:823c::/31 +2408:8240::/32 +2408:8244::/30 +2408:8248::/30 +2408:824c::/32 +2408:824e::/31 +2408:8250::/30 +2408:8254::/32 +2408:8256::/31 +2408:8258::/30 +2408:825c::/31 +2408:825f::/32 +2408:8260::/32 +2408:8262::/31 +2408:8264::/31 +2408:8266::/32 +2408:826a::/32 +2408:826c::/30 +2408:8270::/32 +2408:8274::/30 +2408:8278::/31 +2408:827a::/32 +2408:8306::/31 +2408:8308::/30 +2408:8310::/30 +2408:832a::/32 +2408:832e::/31 +2408:8330::/30 +2408:8338::/32 +2408:8340::/32 +2408:8344::/30 +2408:8348::/30 +2408:834e::/31 +2408:8350::/30 +2408:8354::/32 +2408:8356::/31 +2408:8358::/30 +2408:8360::/30 +2408:8364::/31 +2408:836c::/30 +2408:8374::/30 +2408:8378::/31 +2408:837a::/32 +2408:8406:100::/41 +2408:8406:180::/42 +2408:8406:d00::/41 +2408:8406:d80::/42 +2408:8406:1900::/41 +2408:8406:1980::/42 +2408:8406:2500::/41 +2408:8406:2580::/42 +2408:8406:3100::/41 +2408:8406:3180::/42 +2408:8406:3d00::/41 +2408:8406:3d80::/42 +2408:8406:4900::/41 +2408:8406:4980::/42 +2408:8406:5500::/41 +2408:8406:5580::/42 +2408:8406:6100::/41 +2408:8406:6180::/42 +2408:8406:6d00::/41 +2408:8406:6d80::/42 +2408:8406:7900::/41 +2408:8406:7980::/42 +2408:8406:8500::/41 +2408:8406:8580::/42 +2408:8406:9100::/41 +2408:8406:9180::/42 +2408:8406:9d00::/41 +2408:8406:9d80::/42 +2408:8406:a900::/41 +2408:8406:a980::/42 +2408:8406:b500::/41 +2408:8406:b580::/42 +2408:8407:500::/42 +2408:8409::/40 +2408:8409:100::/41 +2408:8409:1a0::/43 +2408:8409:1c0::/42 +2408:8409:200::/42 +2408:8409:c00::/40 +2408:8409:d00::/41 +2408:8409:da0::/43 +2408:8409:dc0::/42 +2408:8409:e00::/42 +2408:8409:1800::/40 +2408:8409:1900::/41 +2408:8409:19a0::/43 +2408:8409:19c0::/42 +2408:8409:1a00::/42 +2408:8409:2400::/40 +2408:8409:2500::/41 +2408:8409:25a0::/43 +2408:8409:25c0::/42 +2408:8409:2600::/42 +2408:8409:3000::/40 +2408:8409:3100::/41 +2408:8409:31a0::/43 +2408:8409:31c0::/42 +2408:8409:3200::/42 +2408:8409:3c00::/40 +2408:8409:3d00::/41 +2408:8409:3da0::/43 +2408:8409:3dc0::/42 +2408:8409:3e00::/42 +2408:8409:4800::/40 +2408:8409:4900::/41 +2408:8409:49a0::/43 +2408:8409:49c0::/42 +2408:8409:4a00::/42 +2408:8409:5400::/40 +2408:8409:5500::/41 +2408:8409:55a0::/43 +2408:8409:55c0::/42 +2408:8409:5600::/42 +2408:8409:6000::/40 +2408:8409:6100::/41 +2408:8409:61a0::/43 +2408:8409:61c0::/42 +2408:8409:6200::/42 +2408:8409:6c00::/40 +2408:8409:6d00::/41 +2408:8409:6da0::/43 +2408:8409:6dc0::/42 +2408:8409:6e00::/42 +2408:8409:7800::/40 +2408:8409:7900::/41 +2408:8409:79a0::/43 +2408:8409:79c0::/42 +2408:8409:7a00::/42 +2408:8409:8400::/40 +2408:8409:8500::/41 +2408:8409:85a0::/43 +2408:8409:85c0::/42 +2408:8409:8600::/42 +2408:8409:9000::/40 +2408:8409:9100::/41 +2408:8409:91a0::/43 +2408:8409:91c0::/42 +2408:8409:9200::/42 +2408:8409:9c00::/40 +2408:8409:9d00::/41 +2408:8409:9da0::/43 +2408:8409:9dc0::/42 +2408:8409:9e00::/42 +2408:8409:a800::/40 +2408:8409:a900::/41 +2408:8409:a9a0::/43 +2408:8409:a9c0::/42 +2408:8409:aa00::/42 +2408:8409:b400::/40 +2408:8409:b500::/41 +2408:8409:b5a0::/43 +2408:8409:b5c0::/42 +2408:8409:b600::/42 +2408:840c::/40 +2408:840c:200::/40 +2408:840c:d00::/40 +2408:840c:f00::/40 +2408:840c:1a00::/40 +2408:840c:1c00::/40 +2408:840c:2700::/40 +2408:840c:2900::/40 +2408:840c:3400::/40 +2408:840c:3600::/40 +2408:840c:4e00::/40 +2408:840c:5000::/40 +2408:840c:5b00::/40 +2408:840c:5d00::/40 +2408:840c:6800::/40 +2408:840c:6a00::/40 +2408:840c:7500::/40 +2408:840c:7700::/40 +2408:840c:8200::/40 +2408:840c:8400::/40 +2408:840c:8f00::/40 +2408:840c:9100::/40 +2408:840c:9c00::/40 +2408:840c:9e00::/40 +2408:840c:a900::/40 +2408:840c:ab00::/40 +2408:840c:b600::/40 +2408:840c:b800::/40 +2408:840c:c300::/40 +2408:840c:c500::/40 +2408:840c:d000::/40 +2408:840c:d200::/40 +2408:840c:dd00::/40 +2408:840c:de00::/40 +2408:840d::/42 +2408:840d:40::/43 +2408:840d:200::/42 +2408:840d:400::/42 +2408:840d:440::/43 +2408:840d:600::/42 +2408:840d:d00::/42 +2408:840d:d40::/43 +2408:840d:f00::/42 +2408:840d:1100::/42 +2408:840d:1140::/43 +2408:840d:1300::/42 +2408:840d:1a00::/42 +2408:840d:1a40::/43 +2408:840d:1c00::/42 +2408:840d:1e00::/42 +2408:840d:1e40::/43 +2408:840d:2000::/42 +2408:840d:2700::/42 +2408:840d:2740::/43 +2408:840d:2900::/42 +2408:840d:2b00::/42 +2408:840d:2b40::/43 +2408:840d:2d00::/42 +2408:840d:3400::/42 +2408:840d:3440::/43 +2408:840d:3600::/42 +2408:840d:3800::/42 +2408:840d:3840::/43 +2408:840d:3a00::/42 +2408:840d:4e00::/42 +2408:840d:4e40::/43 +2408:840d:5000::/42 +2408:840d:5200::/42 +2408:840d:5240::/43 +2408:840d:5400::/42 +2408:840d:5b00::/42 +2408:840d:5b40::/43 +2408:840d:5d00::/42 +2408:840d:5f00::/42 +2408:840d:5f40::/43 +2408:840d:6100::/42 +2408:840d:6800::/42 +2408:840d:6840::/43 +2408:840d:6a00::/42 +2408:840d:6c00::/42 +2408:840d:6c40::/43 +2408:840d:6e00::/42 +2408:840d:7500::/42 +2408:840d:7540::/43 +2408:840d:7700::/42 +2408:840d:7900::/42 +2408:840d:7940::/43 +2408:840d:7b00::/42 +2408:840d:8200::/42 +2408:840d:8240::/43 +2408:840d:8400::/42 +2408:840d:8600::/42 +2408:840d:8640::/43 +2408:840d:8800::/42 +2408:840d:8f00::/42 +2408:840d:8f40::/43 +2408:840d:9100::/42 +2408:840d:9300::/42 +2408:840d:9340::/43 +2408:840d:9500::/42 +2408:840d:9c00::/42 +2408:840d:9c40::/43 +2408:840d:9e00::/42 +2408:840d:a000::/42 +2408:840d:a040::/43 +2408:840d:a200::/42 +2408:840d:a900::/42 +2408:840d:a940::/43 +2408:840d:ab00::/42 +2408:840d:ad00::/42 +2408:840d:ad40::/43 +2408:840d:af00::/42 +2408:840d:b600::/42 +2408:840d:b640::/43 +2408:840d:b800::/42 +2408:840d:ba00::/42 +2408:840d:ba40::/43 +2408:840d:bc00::/42 +2408:840d:c300::/42 +2408:840d:c340::/43 +2408:840d:c500::/42 +2408:840d:c700::/42 +2408:840d:c740::/43 +2408:840d:c900::/42 +2408:840d:d000::/42 +2408:840d:d040::/43 +2408:840d:d200::/42 +2408:840d:d400::/42 +2408:840d:d440::/43 +2408:840d:d600::/42 +2408:840d:dd00::/42 +2408:840d:dd40::/43 +2408:840d:de00::/42 +2408:840e:dd00::/40 +2408:840e:de00::/40 +2408:840f:1e0::/46 +2408:840f:1e4::/47 +2408:8410::/30 +2408:8414::/31 +2408:8417::/32 +2408:8418::/32 +2408:841a::/31 +2408:841c::/31 +2408:841e::/32 +2408:8420::/31 +2408:8422::/32 +2408:8426::/31 +2408:842a::/31 +2408:842c::/32 +2408:842e::/32 +2408:8430::/31 +2408:8434::/30 +2408:8438::/31 +2408:843c::/30 +2408:8440::/31 +2408:8444::/30 +2408:8448::/32 +2408:844b::/32 +2408:844c::/30 +2408:8452::/31 +2408:8454::/32 +2408:8456::/31 +2408:8458::/30 +2408:845c::/31 +2408:8460::/30 +2408:8464::/31 +2408:8466::/32 +2408:8469::/32 +2408:846a::/31 +2408:846c::/30 +2408:8470::/31 +2408:8474::/30 +2408:8478::/31 +2408:847a::/32 +2408:84e1::/32 +2408:84e2::/31 +2408:84e4::/30 +2408:84e9::/32 +2408:84eb::/32 +2408:84ec::/30 +2408:84f0::/28 +2408:856c::/31 +2408:8606::/31 +2408:8608::/29 +2408:8610::/30 +2408:8614::/31 +2408:861a::/31 +2408:861c::/32 +2408:8620::/31 +2408:8624::/31 +2408:8626::/32 +2408:862a::/31 +2408:862d::/32 +2408:862e::/31 +2408:8630::/29 +2408:8638::/31 +2408:863c::/31 +2408:8640::/32 +2408:8642::/32 +2408:8644::/30 +2408:8648::/31 +2408:864c::/32 +2408:864e::/31 +2408:8650::/30 +2408:8656::/31 +2408:8658::/30 +2408:865c::/31 +2408:865f::/32 +2408:8660::/32 +2408:8662::/31 +2408:8664::/31 +2408:8666::/32 +2408:866a::/31 +2408:866c::/30 +2408:8670::/32 +2408:8674::/30 +2408:8678::/31 +2408:867a::/32 +2408:8706::/31 +2408:8708::/29 +2408:8710::/30 +2408:8719::/32 +2408:871a::/31 +2408:8720::/30 +2408:8726::/32 +2408:872b::/32 +2408:872f::/32 +2408:8730::/30 +2408:8734::/31 +2408:8736::/32 +2408:8738::/32 +2408:873c::/31 +2408:8740::/32 +2408:8742::/32 +2408:8744::/30 +2408:8748::/29 +2408:8752::/32 +2408:8756::/31 +2408:8758::/30 +2408:875c::/32 +2408:8760::/32 +2408:8762::/31 +2408:8764::/31 +2408:8766::/32 +2408:8768::/32 +2408:876a::/32 +2408:876c::/30 +2408:8770::/32 +2408:8772::/31 +2408:8774::/32 +2408:8776::/31 +2408:8778::/31 +2408:877a::/32 +2408:877c::/30 +2408:8806::/42 +2408:8806:40::/43 +2408:880c::/30 +2408:8810::/30 +2408:8814::/31 +2408:8818::/31 +2408:882c::/32 +2408:883a::/32 +2408:8844::/43 +2408:8856::/31 +2408:8858::/30 +2408:8862::/31 +2408:8864::/31 +2408:8866::/32 +2408:886e::/31 +2408:8872::/32 +2408:8878::/31 +2408:887e::/32 +2408:8906:20::/44 +2408:8906:40::/43 +2408:8907:9000::/44 +2408:890c::/31 +2408:8912::/31 +2408:8914::/30 +2408:891c::/32 +2408:8920::/32 +2408:8924::/32 +2408:892c::/32 +2408:8936::/32 +2408:893a::/32 +2408:8940::/32 +2408:8948::/32 +2408:894c::/32 +2408:894e::/32 +2408:8956::/31 +2408:8958::/30 +2408:8962::/31 +2408:8964::/31 +2408:8966::/32 +2408:896c::/32 +2408:896e::/31 +2408:8972::/32 +2408:8978::/30 +2408:897e::/32 +2408:8a00:c000::/36 +2408:8a00:d000::/37 +2408:8a00:e000::/35 +2408:8a01::/36 +2408:8a02:b110::/44 +2408:8a02:b120::/44 +2408:8a04:8000::/36 +2408:8a04:e000::/40 +2408:8a05:6000::/35 +2408:8a05:8000::/36 +2408:8a06::/47 +2408:8a06:100::/47 +2408:8a07::/40 +2408:8a21:4000::/35 +2408:8a22::/35 +2408:8a23:4000::/34 +2408:8a24:4000::/34 +2408:8a26:c000::/34 +2408:8a27:4000::/35 +2409:2000::/31 +2409:2002::/32 +2409:2003::/47 +2409:27fa::/48 +2409:27fa:f000::/48 +2409:27fb::/48 +2409:27fc::/48 +2409:27fe::/33 +2409:6100::/44 +2409:8000::/20 +240a:2000::/40 +240a:2001:100::/40 +240a:2001:1000::/36 +240a:4020:83a::/48 +240a:4020:883a::/48 +240a:4021:83a::/48 +240a:4021:883a::/48 +240a:4090:50::/48 +240a:4090:120::/48 +240a:4090:250::/48 +240a:4090:1000::/39 +240a:4090:1200::/40 +240a:4090:2010::/48 +240a:4090:2041::/48 +240a:4090:2061::/48 +240a:4090:3000::/39 +240a:4090:3200::/40 +240a:4090:5000::/39 +240a:4090:5200::/40 +240a:4090:7000::/39 +240a:4090:7200::/40 +240a:40b0:83a::/48 +240a:40b0:283a::/48 +240a:40b0:483a::/48 +240a:40b0:683a::/48 +240a:40c0:8000::/43 +240a:40c0:a000::/43 +240a:40c0:c000::/43 +240a:40c0:e000::/43 +240a:40c1::/43 +240a:40c1:2000::/43 +240a:40c1:4000::/43 +240a:40c1:6000::/43 +240a:40c1:8000::/43 +240a:40c1:a000::/43 +240a:40c1:c000::/43 +240a:40c1:e000::/43 +240a:40c2::/43 +240a:40c2:2000::/43 +240a:40c2:4000::/43 +240a:40c2:6000::/43 +240a:40c2:8000::/43 +240a:40c2:a000::/43 +240a:40c2:c000::/43 +240a:40c2:e000::/43 +240a:40c3::/43 +240a:40c3:2000::/43 +240a:40c3:4000::/43 +240a:40c3:6000::/43 +240a:40c3:8000::/43 +240a:40c3:a000::/43 +240a:40c3:c000::/43 +240a:40c3:e000::/43 +240a:40c4::/43 +240a:40c4:2000::/43 +240a:40c4:4000::/43 +240a:4280::/26 +240a:42c0::/27 +240a:42e0::/28 +240a:42f0::/29 +240a:42f8::/30 +240a:6001::/48 240a:a000::/20 240a:c000::/20 -240b:2000::/22 -240b:6000::/20 -240b:8000::/21 -240b:a000::/25 -240b:e000::/26 -240c:0:1::/48 -240c:0:2::/47 -240c:0:4::/46 -240c:0:8::/45 -240c:0:10::/44 -240c:0:20::/43 -240c:0:40::/42 -240c:0:80::/41 -240c:0:100::/40 -240c:0:200::/39 -240c:0:400::/38 -240c:0:800::/37 -240c:0:1000::/36 -240c:0:2000::/35 -240c:0:4000::/34 -240c:0:8000::/33 -240c:6:2::/48 -240c:6:4::/46 -240c:6:8::/45 -240c:6:10::/44 -240c:6:20::/43 -240c:6:40::/42 -240c:6:80::/41 -240c:6:100::/40 -240c:6:200::/39 -240c:6:400::/38 -240c:6:800::/37 -240c:6:1000::/36 -240c:6:2000::/35 -240c:6:4000::/34 -240c:6:8000::/33 -240c:f::/48 -240c:f:2::/47 -240c:f:4::/46 -240c:f:8::/45 -240c:f:10::/44 -240c:f:20::/43 -240c:f:40::/42 -240c:f:80::/41 -240c:f:100::/40 -240c:f:200::/39 -240c:f:400::/38 -240c:f:800::/37 -240c:f:1000::/36 -240c:f:2000::/35 -240c:f:4000::/34 -240c:f:8000::/33 +240b:e001::/32 +240b:e002::/31 +240b:e004::/30 +240b:e008::/29 +240b:e010::/32 240c:4000::/22 -240c:8000::/21 240c:c000::/20 240d:4000::/21 -240d:8000::/24 -240e::/21 -240e:800::/24 -240e:900::/26 -240e:940::/27 -240e:960::/28 -240e:970::/29 -240e:978::/30 -240e:97c::/32 -240e:97d::/33 -240e:97d:8001::/48 -240e:97d:8002::/47 -240e:97d:8004::/46 -240e:97d:8008::/45 -240e:97d:8010::/44 -240e:97d:8020::/43 -240e:97d:8040::/42 -240e:97d:8080::/41 -240e:97d:8100::/40 -240e:97d:8200::/39 -240e:97d:8400::/38 -240e:97d:8800::/37 -240e:97d:9000::/36 -240e:97d:a000::/35 -240e:97d:c000::/34 -240e:97e::/31 -240e:980::/25 -240e:a00::/23 -240e:c00::/22 -240e:1000::/20 -240e:2000::/19 -240f:4000::/24 -240f:8000::/24 -240f:c000::/24 -2602:f70d::/36 +240e::/20 2605:9d80:8001::/48 2605:9d80:8011::/48 2605:9d80:8021::/48 @@ -3208,8 +957,8 @@ 2605:9d80:9042::/48 2605:9d80:9071::/48 2605:9d80:9092::/48 +2804:1e48:9001::/48 2804:1e48:9002::/48 -2a03:f900::/29 2a04:3e00:1002::/48 2a04:f580:8010::/47 2a04:f580:8090::/48 @@ -3234,162 +983,26 @@ 2a04:f580:9270::/48 2a04:f580:9280::/48 2a04:f580:9290::/48 -2a05:1085::/32 -2a0a:2840::/29 -2a0a:d680::/37 -2a0a:d680:800::/39 -2a0a:d680:a00::/43 -2a0a:d680:a20::/44 -2a0a:d680:a30::/48 -2a0a:d680:a32::/47 -2a0a:d680:a34::/46 -2a0a:d680:a38::/45 -2a0a:d680:a40::/42 -2a0a:d680:a80::/41 -2a0a:d680:b00::/40 -2a0a:d680:c00::/38 -2a0a:d680:1000::/36 -2a0a:d680:2000::/35 -2a0a:d680:4000::/34 -2a0a:d680:8000::/40 -2a0a:d680:8102::/47 -2a0a:d680:8104::/46 -2a0a:d680:8108::/45 -2a0a:d680:8110::/44 -2a0a:d680:8120::/43 -2a0a:d680:8140::/42 -2a0a:d680:8180::/41 -2a0a:d680:8200::/39 -2a0a:d680:8400::/38 -2a0a:d680:8800::/37 -2a0a:d680:9000::/36 -2a0a:d680:a000::/35 -2a0a:d680:c000::/34 -2a0a:d681::/33 -2a0a:d681:8000::/34 -2a0a:d681:c000::/35 -2a0a:d681:e100::/40 -2a0a:d681:e200::/39 -2a0a:d681:e400::/38 -2a0a:d681:e800::/37 -2a0a:d681:f000::/36 -2a0a:d682::/33 -2a0a:d682:8000::/34 -2a0a:d682:c000::/36 -2a0a:d683::/32 -2a0a:d684::/32 -2a0a:d685::/40 -2a0a:d685:100::/41 -2a0a:d685:180::/42 -2a0a:d685:1c0::/43 -2a0a:d685:1e2::/47 -2a0a:d685:1e4::/46 -2a0a:d685:1e8::/45 -2a0a:d685:1f0::/45 -2a0a:d685:1f8::/47 -2a0a:d685:1fa::/48 -2a0a:d685:202::/47 -2a0a:d685:204::/46 -2a0a:d685:208::/45 -2a0a:d685:210::/44 -2a0a:d685:220::/43 -2a0a:d685:240::/42 -2a0a:d685:280::/41 -2a0a:d685:400::/38 -2a0a:d685:800::/37 -2a0a:d685:1000::/36 -2a0a:d685:2000::/35 -2a0a:d685:4000::/34 -2a0a:d685:8000::/33 -2a0a:d686::/32 -2a0a:d687::/33 -2a0a:d687:8000::/34 -2a0a:d687:c000::/35 -2a0a:d687:e000::/36 -2a0a:d687:f000::/48 -2a0a:d687:f002::/47 -2a0a:d687:f006::/48 -2a0a:d687:f009::/48 -2a0a:d687:f00a::/47 -2a0a:d687:f00c::/46 -2a0a:d687:f010::/44 -2a0a:d687:f020::/43 -2a0a:d687:f040::/42 -2a0a:d687:f080::/41 -2a0a:d687:f100::/40 -2a0a:d687:f200::/39 -2a0a:d687:f400::/38 -2a0a:d687:f800::/37 -2a0c:b641:573::/48 -2a0e:7580::/32 -2a0e:7582::/31 -2a0e:7584::/30 +2a0a:d685:1ff::/48 +2a0a:d685:300::/40 +2a0b:4340:90::/48 +2a0b:4340:97::/48 +2a0d:c7c7:400::/38 2a0e:aa06:49f::/48 2a0e:b107:740::/44 -2a13:1800:1::/48 -2a13:1800:2::/47 -2a13:1800:4::/46 -2a13:1800:8::/45 -2a13:1800:11::/48 -2a13:1800:12::/47 -2a13:1800:14::/46 -2a13:1800:18::/45 -2a13:1800:20::/43 -2a13:1800:40::/42 -2a13:1800:90::/44 -2a13:1800:a0::/43 -2a13:1800:c0::/42 -2a13:1800:100::/40 -2a13:1800:200::/40 -2a13:1800:310::/44 -2a13:1800:320::/43 -2a13:1800:340::/42 -2a13:1800:380::/41 -2a13:1800:400::/38 -2a13:1800:800::/37 -2a13:1800:1000::/36 -2a13:1800:2000::/35 -2a13:1800:4000::/34 -2a13:1800:8000::/33 -2a13:1801::/40 -2a13:1801:100::/41 -2a13:1801:1a0::/43 -2a13:1801:1c0::/42 -2a13:1801:210::/44 -2a13:1801:220::/43 -2a13:1801:240::/42 -2a13:1801:280::/41 -2a13:1801:300::/40 -2a13:1801:400::/38 -2a13:1801:800::/37 -2a13:1801:1000::/36 -2a13:1801:2000::/35 -2a13:1801:4000::/34 -2a13:1801:8000::/33 -2a13:1802:20::/43 -2a13:1802:40::/42 -2a13:1802:80::/41 -2a13:1802:100::/40 -2a13:1802:200::/39 -2a13:1802:400::/38 -2a13:1802:800::/37 -2a13:1802:1000::/36 -2a13:1802:2000::/35 -2a13:1802:4000::/34 -2a13:1802:8000::/34 -2a13:1802:c000::/44 -2a13:1802:c020::/43 -2a13:1802:c040::/42 -2a13:1802:c080::/41 -2a13:1802:c100::/40 -2a13:1802:c200::/39 -2a13:1802:c400::/38 -2a13:1802:c800::/37 -2a13:1802:d000::/36 -2a13:1802:e000::/35 -2a13:1803::/32 -2a13:1804::/30 -2a13:8b40::/29 +2a0e:b107:2440::/44 +2a0f:1cc5:1600::/44 +2a0f:1cc5:4700::/40 +2a12:cb41:1200::/44 +2a12:cb41:1300::/43 +2a12:cb41:13f0::/44 +2a13:1801:180::/43 +2a13:a5c3:f000::/40 +2a14:7580:d00::/43 +2a14:7580:d20::/46 +2a14:7580:d41::/48 +2a14:7580:d42::/47 +2a14:7580:dff::/48 2c0f:f7a8:8011::/48 2c0f:f7a8:8050::/48 2c0f:f7a8:805f::/48 diff --git a/luci-app-homeproxy/root/etc/homeproxy/resources/china_ip6.ver b/luci-app-homeproxy/root/etc/homeproxy/resources/china_ip6.ver index 5d7e941a2..0593cbd7b 100644 --- a/luci-app-homeproxy/root/etc/homeproxy/resources/china_ip6.ver +++ b/luci-app-homeproxy/root/etc/homeproxy/resources/china_ip6.ver @@ -1 +1 @@ -202609130005 +20260704060757 diff --git a/luci-app-homeproxy/root/etc/homeproxy/resources/china_list.txt b/luci-app-homeproxy/root/etc/homeproxy/resources/china_list.txt index b9af2b38a..0ab202270 100644 --- a/luci-app-homeproxy/root/etc/homeproxy/resources/china_list.txt +++ b/luci-app-homeproxy/root/etc/homeproxy/resources/china_list.txt @@ -1,561 +1,9 @@ -2mdn-cn.net -2mdn.net -a1.mzstatic.com -a2.mzstatic.com -a3.mzstatic.com -a4.mzstatic.com -a5.mzstatic.com -account-cn.alibabacloud.com -activate.activation-v2.kaspersky.com -activation-v2.geo.kaspersky.com -activation-v2.kaspersky.com -adcdownload.apple.com -adcdownload.apple.com.akadns.net -admob-cn.com -adservice.google.com -ai.zhaomi.cn -alibaba.cdn.steampipe.steamcontent.com -amp-api-edge-lb-cn.itunes-apple.com.akadns.net -amp-api-edge-lb.itunes-apple.com.akadns.net -amp-api-edge.apps.apple.com -amp-api-edge.music.apple.com -amp-api-search-edge.apps.apple.com -amp-api-updates.apps.apple.com -amp-api.apps.apple.com -amp-api.media.apple.com -amp-api.music.apple.com -amp-api.podcasts.apple.com -aod-ssl.itunes.apple.com -aod.itunes.apple.com -api-edge.apps.apple.com -api.alibabacloud.com -api.blipsandchitz.me -app-analytics-services.com -app-measurement-cn.com -app-measurement.com -app-site-association.cdn-apple.com -appldnld.apple.com -appldnld.g.aaplimg.com -appleid.cdn-apple.com -apps.mzstatic.com -apps5.oingo.com -apptrailers.itunes.apple.com -avail.googleflights.net -azuremigrate.download.prss.microsoft.com -azuremigratetest.download.prss.microsoft.com -azurestackhub.download.prss.microsoft.com -azurestackhubuat.download.prss.microsoft.com -b.c2r.ts.cdn.office.net -bag-cdn.itunes-apple.com.akadns.net -bag.itunes.apple.com -beacons.gcp.gvt2.com -beacons.gvt2.com -beacons2.gvt2.com -beacons3.gvt2.com -bj1.api.bing.com -bookkeeper.itunes.apple.com -c.admob.com -c.android.clients.google.com -c.pki.goog -cache-management-prod.google.com -cache.pack.google.com -cbdstest.download.prss.microsoft.com -cdn-cn.apple-mapkit.com -cdn-cn1.apple-mapkit.com -cdn-cn2.apple-mapkit.com -cdn-cn3.apple-mapkit.com -cdn-cn4.apple-mapkit.com -cdn.ampproject.org -cdn.apple-mapkit.com -cdn.globalsigncdn.com.cdn.cloudflare.net -cdn1.apple-mapkit.com -cdn2.apple-mapkit.com -cdn3.apple-mapkit.com -cdn4.apple-mapkit.com -cds-cdn.v.aaplimg.com -cds.apple.com -cds.apple.com.akadns.net -cdsassets.apple.com -certs-lb.apple.com.akadns.net -certs.apple.com -checkin.gstatic.com -cl1-cdn.origin-apple.com.akadns.net -cl1.apple.com -cl2-cdn.origin-apple.com.akadns.net -cl2-cn.apple.com -cl2.apple.com -cl2.apple.com.edgekey.net.globalredir.akadns.net -cl3-cdn.origin-apple.com.akadns.net -cl3.apple.com -cl4-cdn.origin-apple.com.akadns.net -cl4-cn.apple.com -cl4.apple.com -cl5-cdn.origin-apple.com.akadns.net -cl5.apple.com -clickserve.cc-dt.com -clickserve.dartsearch.net -clickserver.googleads.com -client-api.itunes.apple.com -clientflow.apple.com -clientflow.apple.com.akadns.net -clientservices.googleapis.com -cma.itunes.apple.com -cn-smp-paymentservices.apple.com -cn.alibabacloud.com -cn.download.nvidia.com -cn.widevine.com -cn.windowssearch.com -collaborate.download.prss.microsoft.com -collaborateppe.download.prss.microsoft.com -communities.apple.com -configuration.apple.com -configuration.apple.com.akadns.net -connectivitycheck.gstatic.com -crashlyticsreports-pa.googleapis.com -crl-lb.apple.com.akadns.net -crl.apple.com -crl.globalsign.net -crl.kaspersky.com -crl.pki.goog -crls.pki.goog -csi.gstatic.com -cstat.apple.com -cstat.cdn-apple.com -ctdsb.clouddiffuse.xyz -ctldl.windowsupdate.com -cueme-api.quark.cn -dartsearch-cn.net -dc1-cert.ksn.kaspersky-labs.com -dc1-file.ksn.kaspersky-labs.com -dc1-pp.ksn.kaspersky-labs.com -dc1-st.ksn.kaspersky-labs.com -dc1.ksn.kaspersky-labs.com -dd-cdn.origin-apple.com.akadns.net -dejavu.apple.com -developer.microsoft.com -devimages-cdn.apple.com -devstreaming-cdn.apple.com -dg-meta.video.google.com -discussionschinese.apple.com -dl.google.com -dl.l.google.com -dnl-00.geo.kaspersky.com -dnl-01.geo.kaspersky.com -dnl-02.geo.kaspersky.com -dnl-03.geo.kaspersky.com -dnl-04.geo.kaspersky.com -dnl-05.geo.kaspersky.com -dnl-06.geo.kaspersky.com -dnl-07.geo.kaspersky.com -dnl-08.geo.kaspersky.com -dnl-09.geo.kaspersky.com -dnl-10.geo.kaspersky.com -dnl-11.geo.kaspersky.com -dnl-12.geo.kaspersky.com -dnl-13.geo.kaspersky.com -dnl-14.geo.kaspersky.com -dnl-15.geo.kaspersky.com -dnl-16.geo.kaspersky.com -dnl-17.geo.kaspersky.com -dnl-18.geo.kaspersky.com -dnl-19.geo.kaspersky.com -doubleclick-cn.net -doubleclick.net -download.developer.apple.com -download.microsoft.com -download.mlcc.google.com -download.tensorflow.google.com -download.visualstudio.microsoft.com -downloaddispatch.itunes.apple.com -dreamspark.download.prss.microsoft.com -dreamsparkuat.download.prss.microsoft.com -edge.geo.kaspersky.com -end-api.shallow.ink -end.shallow.ink -entitlements-edge.itunes.apple.com -experiments.apple.com -f.c2r.ts.cdn.office.net -fides-pol.apple.com -firebase-settings.crashlytics.com -fontfiles.googleapis.com -fonts.googleapis.com -fonts.gstatic.com -fpinit.itunes.apple.com -g0.gstatic.com -g1.gstatic.com -g2.gstatic.com -g3.gstatic.com -geetest.datasink.sensorsdata.cn -gog.qtlglb.com -gonglchuangl.net -gongyichuangyi.net -google-analytics-cn.com -google-analytics.com -googleadservices-cn.com -googleadservices.com -googleanalytics.com -googleapis-cn.com -googleapps-cn.com -googleflights-cn.net -googleoptimize-cn.com -googleoptimize.com -googlesyndication-cn.com -googlesyndication.com -googletagmanager-cn.com -googletagmanager.com -googletagservices-cn.com -googletagservices.com -googletraveladservices-cn.com -googletraveladservices.com -googlevads-cn.com -gs-loc-cn.apple.com -gs-loc.apple.com -gsp10-ssl-cn.ls.apple.com -gsp11-cn.ls.apple.com -gsp12-cn.ls.apple.com -gsp13-cn.ls.apple.com -gsp4-cn.ls.apple.com -gsp4-cn.ls.apple.com.edgekey.net.globalredir.akadns.net -gsp5-cn.ls.apple.com -gsp85-cn-ssl.ls.apple.com -gspe11-2-cn-ssl.ls.apple.com -gspe12-cn-ssl.ls.apple.com -gspe19-2-cn-ssl.ls-apple.com.akadns.net -gspe19-2-cn-ssl.ls.apple.com -gspe19-cn-ssl.ls.apple.com -gspe19-cn.ls-apple.com.akadns.net -gspe19-cn.ls.apple.com -gspe21-ssl.ls.apple.com -gspe35-ssl.ls.apple.com -gspe79-cn-ssl.ls.apple.com -gspe85-cn-ssl.ls.apple.com -gstatic-cn.com -gstaticadssl.l.google.com -gtm.oasisfeng.com -guzzoni-apple-com.v.aaplimg.com -guzzoni.apple.com -guzzoni.smoot.apple.com -hellofontpreview.oss-cn-beijing.aliyuncs.com -hellowebfonts.oss-cn-beijing.aliyuncs.com -hospital.pku.edu.cn -i.pki.goog -images-cn-8.ssl-images-amazon.com -images-cn.ssl-images-amazon.com -images.apple.com.edgekey.net.globalredir.akadns.net -imasdk.googleapis.com -inappcheck-cn.itunes-apple.com.akadns.net -inappcheck-lb.itunes-apple.com.akadns.net -inappcheck.itunes.apple.com -init-kt.apple.com -init-p01md-lb.push-apple.com.akadns.net -init-p01md.apple.com -init-p01st-lb.push-apple.com.akadns.net -init-p01st.push.apple.com -init-s01st-lb.push-apple.com.akadns.net -init-s01st.push.apple.com -init.ess.apple.com -init.gc-lb.apple.com.akadns.net -init.gc.apple.com -init.itunes.apple.com -iosapps.itunes.apple.com -iosapps.itunes.g.aaplimg.com -ipcdn.apple.com -iphone-ld.apple.com -iphone-ld.origin-apple.com.akadns.net -is-ssl.mzstatic.com-cn-lb.itunes-apple.com.akadns.net -is1-ssl.mzstatic.com -is1.mzstatic.com -is2-ssl.mzstatic.com -is2.mzstatic.com -is3-ssl.mzstatic.com -is3.mzstatic.com -is4-ssl.mzstatic.com -is4.mzstatic.com -is5-ssl.mzstatic.com -is5.mzstatic.com -itacademy.download.prss.microsoft.com -itacademyuat.download.prss.microsoft.com -itunes-apple.com.akadns.net -itunes.apple.com -itunesconnect.apple.com -izattime.qcomgeo2.com -js-cdn.music.apple.com -km.support.apple.com -ksn-cinfo-geo.kaspersky-labs.com -ksn-cinfo.geoksn.kaspersky.com -ksn-crypto-info-geo.kaspersky-labs.com -ksn-crypto-kas-geo.kaspersky-labs.com -ksn-crypto-tcert-geo.kaspersky-labs.com -ksn-crypto-url-geo.kaspersky-labs.com -ksn-crypto-verdict-geo.kaspersky-labs.com -ksn-crypto-wifiplus-geo.kaspersky-labs.com -ksn-crypto-wifiplus.geoksn.kaspersky.com -ksn-dc1-cert.geoksn.kaspersky.com -ksn-dc1-file.geoksn.kaspersky.com -ksn-dc1.geoksn.kaspersky.com -ksn-file-geo.kaspersky-labs.com -ksn-file.geoksn.kaspersky.com -ksn-info-geo.kaspersky-labs.com -ksn-info.geoksn.kaspersky.com -ksn-kas.geoksn.kaspersky.com -ksn-mdr.geoksn.kaspersky.com -ksn-tcert-geo.kaspersky-labs.com -ksn-tcert.geoksn.kaspersky.com -ksn-url-geo.kaspersky-labs.com -ksn-url.geoksn.kaspersky.com -ksn-verdict-geo.kaspersky-labs.com -ksn-verdict.geoksn.kaspersky.com -lex.download.prss.microsoft.com -lexuat.download.prss.microsoft.com -lv.queniujq.cn -maps.apple.com -mbs.download.prss.microsoft.com -mdr.ksn.kaspersky-labs.com -mensura.cdn-apple.com -mesu-cdn.apple.com.akadns.net -mesu-china.apple.com.akadns.net -mesu.apple.com -misc-assets.itunes.apple.com -ml.cdn-apple.com -moocs.unipus.cn -mpnbenefits.download.prss.microsoft.com -mpnbenefitsrtl.download.prss.microsoft.com -mpnbenefitsrtluat.download.prss.microsoft.com -msdn.download.prss.microsoft.com -msdprod-ad.download.prss.microsoft.com -msproduct.download.prss.microsoft.com -music.apple.com -musicstatus.music.apple.com -mvod.itunes.apple.com -myapp.itunes.apple.com -myvs.download.prss.microsoft.com -np-edge.itunes.apple.com -ntp.aliyun.com -ntp.tencent.com -ntp1.aliyun.com -ntp1.tencent.com -ntp2.aliyun.com -ntp2.tencent.com -ntp3.aliyun.com -ntp3.tencent.com -ntp4.aliyun.com -ntp4.tencent.com -ntp5.aliyun.com -ntp5.tencent.com -ntp6.aliyun.com -ntp7.aliyun.com -o.pki.goog -ocsp.apple.com -ocsp.pki.goog -ocsp2.apple.com -oemsoc.download.prss.microsoft.com -oemsocuat.download.prss.microsoft.com -officecdn.microsoft.com -officemkt.download.prss.microsoft.com -officemktuat.download.prss.microsoft.com -opencourse.pku.edu.cn -oscdn.apple.com -oscdn.origin-apple.com.akadns.net -osrelease.download.prss.microsoft.com -osxapps.itunes.apple.com -osxapps.itunes.g.aaplimg.com -p00.upd.kaspersky.com -p01.upd.kaspersky.com -p02.upd.kaspersky.com -p03.upd.kaspersky.com -p04.upd.kaspersky.com -p05.upd.kaspersky.com -p06.upd.kaspersky.com -p07.upd.kaspersky.com -p08.upd.kaspersky.com -p09.upd.kaspersky.com -p1-juejin.byteimg.com -p10.upd.kaspersky.com -p11.upd.kaspersky.com -p12.upd.kaspersky.com -p13.upd.kaspersky.com -p14.upd.kaspersky.com -p15.upd.kaspersky.com -p16.upd.kaspersky.com -p17.upd.kaspersky.com -p18.upd.kaspersky.com -p19.upd.kaspersky.com -p2-juejin.byteimg.com -p3-juejin.byteimg.com -p3-novel.byteimg.com -p4-juejin.byteimg.com -p5-juejin.byteimg.com -p6-juejin.byteimg.com -p6-novel.byteimg.com -p7-juejin.byteimg.com -p8-juejin.byteimg.com -p9-juejin.byteimg.com -pagead-googlehosted.l.google.com -pancake.apple.com -pba0.apple.com -pd-nk.itunes.apple.com -pd.itunes.apple.com -performanceparameters.googleapis.com -pki-goog.l.google.com -play-edge.itunes.apple.com -play.itunes.apple.com -play.music.apple.com -podcasts.apple.com -podcasts.itunes.apple.com -probe.siri.apple.com -prod-controlbe.floonet.goog -prod-databe.floonet.goog -prod-support.apple-support.akadns.net -prod.databe.floonet.goog -publicassets.cdn-apple.com -qiao-cn.com -qpx.googleflights.net -recaptcha-cn.net -recaptcha.net -redirector.bdn.dev -redirector.c.chat.google.com -redirector.c.mail.google.com -redirector.c.pack.google.com -redirector.c.play.google.com -redirector.c.youtubeeducation.com -redirector.gcpcdn.gvt1.com -redirector.gvt1.com -redirector.offline-maps.gvt1.com -redirector.snap.gvt1.com -redirector.xn--ngstr-lra8j.com -refresh-bkg.activation-v2.kaspersky.com -rsm.download.prss.microsoft.com -s.mzstatic.com -s00.upd.kaspersky.com -s01.upd.kaspersky.com -s02.upd.kaspersky.com -s03.upd.kaspersky.com -s04.upd.kaspersky.com -s05.upd.kaspersky.com -s06.upd.kaspersky.com -s07.upd.kaspersky.com -s08.upd.kaspersky.com -s09.upd.kaspersky.com -s1.mzstatic.com -s10.upd.kaspersky.com -s11.upd.kaspersky.com -s12.upd.kaspersky.com -s13.upd.kaspersky.com -s14.upd.kaspersky.com -s15.upd.kaspersky.com -s16.upd.kaspersky.com -s17.upd.kaspersky.com -s18.upd.kaspersky.com -s19.upd.kaspersky.com -s2.mzstatic.com -s3.mzstatic.com -s4.mzstatic.com -s5.mzstatic.com -safebrowsing-cache.google.com -safebrowsing.googleapis.com -sdx.microsoft.com -se-edge.itunes.apple.com -se2.itunes.apple.com -search.itunes.apple.com -seed-sequoia.siri.apple.com -seed-swallow.siri.apple.com -seed.siri.apple.com -sequoia.apple.com -service.urchin.com -sf-api-token-service.itunes.apple.com -sh-pod2-smp-device.apple.com -shazam-insights.cdn-apple.com -shell.cdn.office.net -smp-device-content.apple.com -software.download.prss.microsoft.com -sp.itunes.apple.com -speedysub.music.apple.com -ss.bjmu.edu.cn -ssl-google-analytics.l.google.com -ssl.gstatic.com -staging-controlbe.floonet.goog -staging-databe.floonet.goog -staging.databe.floonet.goog -static.gc.apple.com -statics.teams.cdn.office.net -status.alibabacloud.com -stocks-sparkline-lb.apple.com.akadns.net -stocks-sparkline.apple.com -store.apple.com -store.apple.com.edgekey.net -store.apple.com.edgekey.net.globalredir.akadns.net -store.storeimages.apple.com.akadns.net -store.storeimages.cdn-apple.com -storecorefulfillment.download.prss.microsoft.com -storeedge.microsoft.com -storeedgefd.dsx.mp.microsoft.com -streamingaudio.itunes.apple.com -study.163.com -su.itunes.apple.com -support-china.apple-support.akadns.net -support.apple.com -surface.download.prss.microsoft.com -surface.downloads.prss.microsoft.com -swallow-apple-com.v.aaplimg.com -swallow.apple.com -swcatalog-cdn.apple.com.akadns.net -swcatalog.apple.com -swcdn.apple.com -swcdn.g.aaplimg.com -swdist.apple.com -swdist.apple.com.akadns.net -swscan-cdn.apple.com.akadns.net -swscan.apple.com -sylvan.apple.com -sync.itunes.apple.com -tac.googleapis.com -tf-feedback.itunes.apple.com -time.amazonaws.cn -time.izatcloud.net -time.xtracloud.net -tj-pod1-smp-device.apple.com -tj-pod2-smp-device.apple.com -tj-pod3-smp-device.apple.com -tools.google.com -universal-activity-service.itunes.apple.com -update.crashlytics.com -update.googleapis.com -updates-http.cdn-apple.com -updates-http.cdn-apple.com.akadns.net -updates.cdn-apple.com -upp.itunes.apple.com -valid.apple.com -valid.origin-apple.com.akadns.net -vlportal.download.prss.microsoft.com -volic.download.prss.microsoft.com -vscode.download.prss.microsoft.com -vz.download.prss.microsoft.com -wear.googleapis.com -weather-data.apple.com -weather-data.apple.com.akadns.net -weather-map.apple.com -weather-map2.apple.com -weatherkit.apple.com -windbg.download.prss.microsoft.com -www-google-analytics.l.google.com -www-googletagmanager.l.google.com -www.apple.com -www.apple.com.edgekey.net.globalredir.akadns.net -www.destinationurl.com -www.entrust.cn -www.gstatic.com -www.pxcc.com -www.recaptcha-cn.net -www.recaptcha.net -www.support.apple.com -xp.apple.com -xtratime.qcomgeo2.com -xz.pphimalayanrt.com 0.zone 00.net 000.link 000000.net 0000001.xin +00000qpqp00000.com 0000550xtz2.shop 0000552bb0.shop 0000552bb1.shop @@ -567,6 +15,7 @@ xz.pphimalayanrt.com 0001.xin 000114.com 00012023.com +0001700.xin 0002.xin 0003399xtz1.shop 0003399xtz2.shop @@ -632,10 +81,10 @@ xz.pphimalayanrt.com 0044696.com 004678.com 004837963.xyz -0049.com 0056.com 00563.com 0058.com +00615.net 0066.com 00665ba1f014ee0e.com 007.pub @@ -652,11 +101,11 @@ xz.pphimalayanrt.com 008.bet 00817.com 00847.xin +0086l.com 0086org.com 008n0l12145.xin 008sport.com 009.xin -009513.xyz 009y.com 00bx.com 00cdn.com @@ -666,14 +115,19 @@ xz.pphimalayanrt.com 00ef6bce51ccd47d.com 00fkh408382.xin 00hh.com +00i1xg5s3s.xin 00ic.com 00it.net 00lfoo16454.xin 00o5nm18258.xin +00plri7b.xin +00r9fexyub.xin 00shu.com 00shu.la 00tera.com 00tu.com +00ukkgtc5.xin +00ve1bg9.xin 00wv.com 00xu.com 01-cf.com @@ -681,6 +135,8 @@ xz.pphimalayanrt.com 010123456.com 010155.net 0101cdn.com +0101e.com +0101game.online 0101semi.com 0101ssd.com 010203.com @@ -706,6 +162,7 @@ xz.pphimalayanrt.com 011.xin 011a4460e391a7f4.com 0123.xin +0123401234.com 0123456789.com 0123f.xin 0127.xin @@ -727,7 +184,9 @@ xz.pphimalayanrt.com 018.xin 019.xin 01975cf969f20191.com +019jb0sc.xin 01a7d69861013.beer +01be6bfabbd3024a.com 01bzw.us 01bzw.xyz 01caijing.com @@ -742,6 +201,7 @@ xz.pphimalayanrt.com 01isp.net 01jinhua.com 01jzw.com +01p.com 01p6xc08451.xin 01pxzw0737.xin 01rv.com @@ -749,6 +209,7 @@ xz.pphimalayanrt.com 01studio.cc 01teacher.com 01wb.com +01x13k30.xin 01yo.com 01yuanma.com 01yun.com @@ -801,6 +262,7 @@ xz.pphimalayanrt.com 021tk.com 021van.com 021wfz.com +021ye.com 021yongzhuo.com 021zhuang.com 021zsb.com @@ -810,11 +272,13 @@ xz.pphimalayanrt.com 022china.com 022meishu.com 022s.com +022shui.com 022sunny.com 022v.com 023086.com 023bc5v99h.xin 023cj.com +023cq.cc 023dir.com 023dns.com 023fyy.com @@ -854,6 +318,7 @@ xz.pphimalayanrt.com 025tuanjian.com 025xl.com 025zp.com +0264032a252fcf53.com 026hao.com 026idc.com 0270.cc @@ -900,6 +365,7 @@ xz.pphimalayanrt.com 028office.com 028px.com 028pxw.com +028sh.com 028sjkj.com 028yyyy.com 029200.com @@ -914,6 +380,7 @@ xz.pphimalayanrt.com 029xxw.com 029zp.com 02b5c31e511032.beer +02bjmbzoat.xin 02d.com 02fb56599d46ae7d.com 02hm.com @@ -922,12 +389,14 @@ xz.pphimalayanrt.com 02lu.com 02shu.com 02tf6d18201.xin +02u21a0lka.xin 02wan.com 02wq.com 02yc.com 02z97426404.xin 030.xin 030303.com +030hag5r91.xin 030mall.com 030yo.xin 0310it.com @@ -977,6 +446,8 @@ xz.pphimalayanrt.com 037lcq08115.xin 038d0addd10241.beer 0391fc.com +03964.com +039r93jevs.xin 03b2ef6fe1960045.com 03bcyh2069.xin 03cl.xin @@ -985,7 +456,9 @@ xz.pphimalayanrt.com 03dq.com 03f99b91610271.beer 03fcw.com +03fugu.xin 03k.org +03m7pa17g.xin 03supin.com 03tc.com 03u.com @@ -1014,8 +487,10 @@ xz.pphimalayanrt.com 0434.cc 0437.com 043j8118366.xin +0444.xin 0452e.com 0453.com +0453bc39456389ff.com 0454.cc 0455tv.com 0455zd.com @@ -1026,10 +501,13 @@ xz.pphimalayanrt.com 0472.com 0476vip.com 048.xin +048o9ml5x3.xin 049.com 049.xin 04a1to24453.xin 04adca98c1022.beer +04apr5bl.xin +04be22jjkv.xin 04c01e0ad4c891d7.com 04db11e1ea504cf2.com 04ip.com @@ -1087,6 +565,7 @@ xz.pphimalayanrt.com 0535-0411.com 0535cp.com 0535you.com +05366196.com 0536job.net 0536qz.com 0536weixin.com @@ -1096,6 +575,7 @@ xz.pphimalayanrt.com 053c.com 0543bbs.com 054400.com +0545.xin 0546fdc.com 0550.com 055110.com @@ -1132,6 +612,7 @@ xz.pphimalayanrt.com 0574bbs.com 0574nbjg.com 0575.host +057555.com 0575bbs.com 0575jb.com 0575life.com @@ -1182,8 +663,11 @@ xz.pphimalayanrt.com 05idc.com 05info.com 05ja1g16464.xin +05n2azbp.xin 05p9uj1253.xin +05rjxqsp5i.xin 05sun.com +05vauwva3.xin 05vm.com 05wan.com 05wang.com @@ -1192,7 +676,9 @@ xz.pphimalayanrt.com 0605.com 0609.com 061.xin +0616a9dbe68fac9c.com 0618.com +062wfly8z.xin 063108.com 0631rc.com 0632idc.com @@ -1213,13 +699,17 @@ xz.pphimalayanrt.com 06681.com 0668gz.com 067555.com +068rolbmiz.xin 069.xin 0693f784d1023.beer 06abc.com +06b8ziwxjf.xin 06climate.com 06ee1860c1015.beer 06game.com +06ik7744n.xin 06ps.com +06z8mzlma.xin 07.cc 07.la 070725.xyz @@ -1227,6 +717,7 @@ xz.pphimalayanrt.com 07073h5.com 07073vr.com 0708.com +0712f.com 0712fang.com 0714.com 0714110.xin @@ -1242,6 +733,7 @@ xz.pphimalayanrt.com 0722fc.com 0724c.com 0725.com +0728f.com 0730188.com 0730news.com 073122.com @@ -1295,12 +787,14 @@ xz.pphimalayanrt.com 0755cts.com 0755fm.com 0755hao.com +0755haoyu.com 0755hj.com 0755hz.com 0755jz.net 0755rc.com 0755sszx.net 0755yf.net +0755zb.com 0756fang.com 0756idc.com 0756tong.com @@ -1331,6 +825,8 @@ xz.pphimalayanrt.com 0769sx.com 0769web.net 076lvo.xyz +076t0uhtl9.xin +077.xin 0771.tv 07712008.com 07715555555.com @@ -1340,6 +836,7 @@ xz.pphimalayanrt.com 0772fang.com 0772job.com 07743988888.com +07752267777.com 07754255555.com 0775fcw.com 0775jzw.com @@ -1372,12 +869,16 @@ xz.pphimalayanrt.com 07bmss01426.xin 07cn.com 07cn.net +07e12xs2io.xin 07f0798569af4d70.com 07fe8668211012.beer 07fea775dffd96d4.com 07jfrv01301.xin 07k6np0378.xin 07kacm20339.xin +07net01.com +07ozikk8w3.xin +07ren.com 07sh.com 07swz.com 07u82t16391.xin @@ -1396,6 +897,7 @@ xz.pphimalayanrt.com 0817tv.com 0818tuan.com 082.xin +0820.xin 0827ug.com 0831.app 0831home.com @@ -1408,7 +910,6 @@ xz.pphimalayanrt.com 08424b74011032.beer 0843d5944883e752.com 085.com -085432.cfd 0857job.com 0859qp.com 0859sy.com @@ -1435,6 +936,7 @@ xz.pphimalayanrt.com 08zf.com 0904.cool 090expo.com +0912158.com 0912app.com 0912fdj.com 0913ss.com @@ -1481,25 +983,38 @@ xz.pphimalayanrt.com 09e12x16370.xin 09ea354bd9542ba7.com 09game.com -09izf.com +09iatm1z.xin 09lc5d12399.xin +09mhncdop.xin +09pj75gs09.xin 09pzq024240.xin +09rrqh7s62.xin 09shijue.com +09vvme1l.xin 09xx5a24352.xin +09z7wy3k.xin +0a0fx7vz1l.xin 0a2d.com 0a2g5a04175.xin 0a32mt201.xin 0a64qa16273.xin 0a6ri001390.xin +0a8a112e8bb5045e.com +0acrdtuhed.xin 0ag8kg01470.xin 0ape4t08268.xin +0aq4hxqs.xin +0ax2rjo3od.xin 0axoa626262.xin 0b145c21210e933c.com 0b4xq91061.xin 0b6e0659811021.beer 0b8ky116130.xin +0barrfplp.xin +0bb261a6a46d766a.com 0bb875c361022.beer 0bbd0e535194e7f7.com +0bddiq9a0q.xin 0bdfe52341114.beer 0bef0493410272.beer 0bjasw18181.xin @@ -1515,10 +1030,12 @@ xz.pphimalayanrt.com 0car0.com 0cname.com 0cokid18352.xin +0cq9hzrz.xin 0cqpj504251.xin 0d.work 0d06e627dbe6654a.com 0d263788316151cb.com +0d3lnlkylu.xin 0d49f571e1017.beer 0daily.com 0ddvic16247.xin @@ -1538,37 +1055,58 @@ xz.pphimalayanrt.com 0e76427381016.beer 0e7o6216306.xin 0easy.com +0ecff3e99dce5b33.com 0ee18d4c192243b3.com 0efef58c41014.beer 0egh661666.xin 0eghje0112.xin 0ek4sg08401.xin 0emvvs04229.xin +0en6hz2u.xin +0ew4p6fb1.xin 0f0lj908444.xin 0f602h26461.xin 0f63e6089d80dffe.com +0fbcjwr4x2.xin +0fbs03i1i.xin +0fc45y3sbr.xin 0fe5d43561011.beer 0fe7e0a941011.beer +0fep69v3.xin 0fj5qx12422.xin 0fl1j80347.xin 0flnis04328.xin +0fnkjai21b.xin +0g13wzk4pj.xin 0g1s.com +0g5q5hrcbo.xin +0g9l08zbsc.xin +0ggt51agn0.xin 0ggw7u16311.xin +0gklqj5hal.xin +0gmu6zwf87.xin +0gps2ppnu9.xin +0gtsz9jw.xin 0gyyc924408.xin 0h3lfj12415.xin -0hax7.app +0hbgmcs5gb.xin 0hgame.com +0hl5ntdm0i.xin +0hq7006r07.xin 0hzxwa2471.xin 0i-i0.com 0i6js716143.xin +0i71r4qg.xin 0im9f31630.xin 0iq8q8163.xin 0iwgt324206.xin 0j1oul247.xin 0j3h9616299.xin +0j4wdc8bs8.xin 0j783008494.xin 0jb520030.xin 0jl3h724403.xin +0k2u4didtd.xin 0k6dm96.xin 0ka.com 0kee.com @@ -1581,37 +1119,60 @@ xz.pphimalayanrt.com 0l7mqk1284.xin 0leb5s268.xin 0lircg1235.xin +0lw1ib2sa.xin +0lzamwtu.xin 0m7eaq04292.xin 0mbvyf1437.xin 0me14c18373.xin +0mfbac1gsj.xin 0mfqi124198.xin 0mk9ht2449.xin 0moju716460.xin 0mrzee12192.xin +0ms65u0s8t.xin +0mu4f8xw0k.xin 0n469e12312.xin +0n5hylf79s.xin +0n663xtw.xin 0nc13z04356.xin +0nelddmoha.xin +0nk5dhsp.xin +0nnk3nxyu3.xin +0npkjexon.xin +0nqxhrpw30.xin 0nw2sq2622.xin +0nzk4t3lrn.xin 0o1djo20199.xin 0o6wqk24113.xin 0o8lgn20118.xin 0obhhr12439.xin 0okm1a12139.xin 0olgbi04133.xin +0olut8.com 0oo70c26213.xin 0or1h40327.xin -0p.ink 0p21iz0729.xin +0p2wrugphn.xin 0p4ips24224.xin +0p5i7dxr6y.xin +0p901yay.xin 0plpxp1898.xin 0poho720169.xin 0ptf4g04404.xin +0pxrom71q8.xin 0q5stv04123.xin 0q9y3z18365.xin +0qd9dnzon9.xin 0qm88r0891.xin +0qqczcn8l8.xin +0r8ag0y7di.xin +0range5.xin 0rg.xin 0rgojh0146.xin +0rgu7ha3p.xin 0rl.cc 0rljmz01274.xin +0rz.ltd 0s73o26p67.com 0s8s.com 0sm.com @@ -1626,6 +1187,7 @@ xz.pphimalayanrt.com 0xffff.one 0xffffff.org 0xiao.com +0xjqlun2.work 0xsky.com 0xue.com 0z.gs @@ -1652,6 +1214,7 @@ xz.pphimalayanrt.com 10000shequ.com 10000yao.com 10001wan.com +100024.xyz 1000360.com 10006.info 1000coco.com @@ -1704,6 +1267,7 @@ xz.pphimalayanrt.com 100credit.com 100cup.com 100d3.com +100data.com 100du.com 100e.com 100eby.com @@ -1754,9 +1318,11 @@ xz.pphimalayanrt.com 100tv.com 100txy.com 100vr.com +100wa.com 100web.store 100weidu.com 100wsanguo.com +100xgj.com 100xhs.com 100xiao.com 100xin.com @@ -1770,6 +1336,7 @@ xz.pphimalayanrt.com 100zp.com 101.com 10100.com +10100000.com 10101111.com 10101111cdn.com 1010gamer.com @@ -1778,7 +1345,6 @@ xz.pphimalayanrt.com 1010pic.com 1010sh.com 1010t.com -101212.com 101505.com 10155.com 1015600.com @@ -1788,6 +1354,7 @@ xz.pphimalayanrt.com 101jiajiao.com 101weiqi.com 101yx.com +1024.ink 1024fuli.com 1024g.com 1024ie.com @@ -1839,6 +1406,7 @@ xz.pphimalayanrt.com 10sea.com 10soo.com 10tianqi.com +10urzr3jk.icu 10yan.com 110.com 11000011.com @@ -1936,6 +1504,7 @@ xz.pphimalayanrt.com 115meta.com 115vod.com 115wg.com +115zb.com 1163.com 1166.com 1168.tv @@ -2017,7 +1586,7 @@ xz.pphimalayanrt.com 120spd.com 120sun.com 120x.net -121034.com +120ym.com 121121.net 1212.com 12120.net @@ -2058,7 +1627,6 @@ xz.pphimalayanrt.com 123278.com 123294.com 123295.com -123312.com 12333.com 12333.org 12333si.com @@ -2096,7 +1664,6 @@ xz.pphimalayanrt.com 123684.com 12369zb.com 123773.com -123795.com 123842.com 123860.com 123865.com @@ -2109,8 +1676,6 @@ xz.pphimalayanrt.com 123baofeng.com 123bo.com 123boligang.com -123clouddisk.com -123clouddrive.net 123du.cc 123ems.com 123fc.com @@ -2131,6 +1696,7 @@ xz.pphimalayanrt.com 123ox.com 123pan.com 123panpay.com +123pans.com 123qibu.com 123qy.com 123shopee.com @@ -2241,8 +1807,10 @@ xz.pphimalayanrt.com 1360.com 136136.com 13636.com +1366.com 13667703999.com 136bet.app +136fc.com 136pic.com 13707.net 137139.com @@ -2250,7 +1818,6 @@ xz.pphimalayanrt.com 13726936178.com 137365.com 1374.com -137542.club 1377.com 13793085458.com 13793277711.com @@ -2263,6 +1830,7 @@ xz.pphimalayanrt.com 1380898.com 138379.com 138job.com +138pet.com 138top.com 138vps.com 139.com @@ -2297,6 +1865,7 @@ xz.pphimalayanrt.com 13xiaoshuo.com 13yx.com 140414.com +1404c4ce1d63a0d7.com 1415926.com 1415926.mobi 141799c86c1ba267.com @@ -2309,9 +1878,8 @@ xz.pphimalayanrt.com 146368.com 14776ac8e1022.beer 148-law.com -148353.vip +1488.com 148com.com -149.com 14f99ce2609c0071.com 14hj.com 14play.net @@ -2363,6 +1931,7 @@ xz.pphimalayanrt.com 15gg.com 15gift.com 15hr.com +15hr.net 15job.com 15kuaixiu.com 15lu.com @@ -2404,16 +1973,20 @@ xz.pphimalayanrt.com 163888.net 1639f577b1022.beer 163adl.com +163cdn.com 163cms.com 163cn.link 163cn.tv 163cp.com 163cs.com 163fen.com +163guangdong.com 163guoqi.com 163gz.com +163henan.com 163hot.net 163hubei.com +163hunan.com 163img.com 163jiasu.com 163k.cc @@ -2431,7 +2004,6 @@ xz.pphimalayanrt.com 163qikanlunwen.com 163qiyukf.com 163wh.com -163you.net 163yu.com 163yun.com 164580.com @@ -2457,12 +2029,10 @@ xz.pphimalayanrt.com 166dns.com 16757.com 16768.com -168.com 16816.com 168267xz.com 168338.com 16838.com -1685188.com 1686888.com 1688.com 16885.com @@ -2477,6 +2047,7 @@ xz.pphimalayanrt.com 1688s.com 1688tsw.com 1688zhuce.com +16899168.com 168ad.cc 168auto.com 168chaogu.com @@ -2487,6 +2058,7 @@ xz.pphimalayanrt.com 168job.com 168kaifu.com 168kk.com +168kn.com 168lyq.com 168mlj.com 168moliao.com @@ -2518,9 +2090,9 @@ xz.pphimalayanrt.com 16first.com 16game.net 16hyt.com -16ik.com 16lao.com 16p.com +16pic.com 16rd.com 16sucai.com 16type.com @@ -2564,7 +2136,6 @@ xz.pphimalayanrt.com 173.com 173.hk 173.tv -173183.com 1732.com 1732.net 17345.com @@ -2651,6 +2222,7 @@ xz.pphimalayanrt.com 17bt.com 17byh.com 17c13ae4a36b8862.com +17c8d205dbcbc534.com 17cdn.com 17ce.com 17chacha.com @@ -2661,6 +2233,7 @@ xz.pphimalayanrt.com 17dawan.com 17dc.com 17ditu.com +17dm.com 17donor.com 17dp.com 17duu.com @@ -2685,6 +2258,7 @@ xz.pphimalayanrt.com 17gouwuba.com 17guagua.com 17gwx.com +17haibao.com 17hc.com 17house.com 17hpl.com @@ -2709,6 +2283,7 @@ xz.pphimalayanrt.com 17kss.com 17kuxun.com 17kxgame.com +17kzy.com 17lai.site 17lewan.net 17lht.com @@ -2822,7 +2397,6 @@ xz.pphimalayanrt.com 18023.com 18095.com 180disk.com -180k.com 180qt.com 180yy.com 1811d2af81022.beer @@ -2836,7 +2410,6 @@ xz.pphimalayanrt.com 181b5f7e71011.beer 181ps.com 181ue.com -182.net 18251.org 18263.vip 182682.xyz @@ -2868,6 +2441,7 @@ xz.pphimalayanrt.com 18856.com 188628.com 1888.com.mo +18888.com 188api.com 188bifen.com 188bio.com @@ -2882,6 +2456,7 @@ xz.pphimalayanrt.com 1892139.com 18937777777.com 18999666.xyz +189cha.com 189che.com 189cube.com 189ebuy.com @@ -2919,6 +2494,7 @@ xz.pphimalayanrt.com 18snf.com 18touch.com 18wk.com +18yl.com 18zhongyao.com 18zhuanqian.com 18zp.com @@ -2940,6 +2516,7 @@ xz.pphimalayanrt.com 191game.com 192ly.com 192sm.com +1931.com 1934xjzy.com 1937china.com 1937cn.com @@ -2951,7 +2528,6 @@ xz.pphimalayanrt.com 194nb.com 195155.com 195268032591463.icu -1958xy.com 195idc.com 196b7adb23969e39.com 196g.com @@ -2963,7 +2539,6 @@ xz.pphimalayanrt.com 19789.com 197924.com 19799.com -198274.com 198358.com 19840423.com 198434.com @@ -2983,7 +2558,6 @@ xz.pphimalayanrt.com 199508.com 199604.com 1997sty.com -1998998.net 1998mall.com 1998r.com 1999year.com @@ -3020,6 +2594,7 @@ xz.pphimalayanrt.com 1b0y8tocaz24.com 1b17.com 1b1tech.com +1b22e3a337fe5542.com 1b3e11b2e88c6129.com 1baf107ed1014.beer 1boshu1.com @@ -3039,7 +2614,6 @@ xz.pphimalayanrt.com 1chong.com 1cloudsp.com 1cno.com -1cxb.com 1d0b8b3d1800debe.com 1d1d100.com 1d21653941c21219.com @@ -3060,9 +2634,9 @@ xz.pphimalayanrt.com 1f6cd3ca611032.beer 1f71060e75b35349.com 1fangchan.com -1fly.fun 1foo.com 1fooai.com +1g31.com 1gaifang.com 1gbru.com 1gcat.com @@ -3086,13 +2660,13 @@ xz.pphimalayanrt.com 1j1x.com 1jbest.com 1jiesong.com +1jkbie336689.com 1ju.com 1juhao.com 1juzi.com 1k100.com 1k2k.com 1ka123.com -1kanshu.cc 1kapp.com 1kcx.hk 1ke.net @@ -3112,8 +2686,10 @@ xz.pphimalayanrt.com 1lou.com 1lzs.com 1m.net +1m3d.com 1m85.com 1mall.com +1maoshua.com 1mdoutian.com 1menjin.com 1mfg.com @@ -3121,6 +2697,7 @@ xz.pphimalayanrt.com 1mishu.com 1mit.com 1mjz.com +1mmbie336689.com 1mmed.com 1more.com 1mpi.com @@ -3142,6 +2719,7 @@ xz.pphimalayanrt.com 1plas.com 1pm2.com 1ppt.com +1pxs.com 1q2q.com 1qfa.com 1qia.com @@ -3169,18 +2747,19 @@ xz.pphimalayanrt.com 1stchip.com 1styan.com 1szq.com +1t.gs 1t1t.com 1tai.com 1tdw.com 1textile.com -1tim.com 1ting.com 1tong.com +1toon.com 1tu-design.com 1tu.com +1uo9djbnsr.com 1uuc.com 1wang.com -1wxyun.com 1x3x.com 1xinzulin.com 1xmb.com @@ -3189,6 +2768,7 @@ xz.pphimalayanrt.com 1y2y.com 1yabc.com 1yangai.com +1yaoda.com 1yb.co 1ycdn.com 1yd.me @@ -3204,7 +2784,6 @@ xz.pphimalayanrt.com 1zhe.com 1zhengji.com 1zhixue.com -1zidc.com 1zj.com 1zjob.com 1zu.com @@ -3226,6 +2805,7 @@ xz.pphimalayanrt.com 2006q.com 20087.com 2008php.com +2008red.com 2008zwe.com 20091222.com 200call.com @@ -3253,9 +2833,9 @@ xz.pphimalayanrt.com 202014.xyz 202030.com 2022.work +202271.xyz 2023.com 2023game.com -20240828.xyz 2024qq.com 2025.net 202m.com @@ -3269,7 +2849,12 @@ xz.pphimalayanrt.com 2080ly.com 2093hd.com 2099xs.com +20e2554096acf2c6.com 20fl.com +20images10.com +20images21.com +20images25.com +20images7.com 20ju.com 20kf.com 20on.com @@ -3279,6 +2864,7 @@ xz.pphimalayanrt.com 20xs.org 20xue.com 20xy.cc +20yy.com 20z.com 21-sun.com 210189.com @@ -3330,6 +2916,7 @@ xz.pphimalayanrt.com 21bowu.com 21bx.com 21cake.com +21cbr.com 21cccc.com 21ccnn.com 21cd.com @@ -3448,11 +3035,11 @@ xz.pphimalayanrt.com 226500.com 226531.com 226969.xyz +226yzy.com 2280.com 2281wa.ren 2288.org 2288116ab4.shop -2288job.com 228job.com 228tuchuang.com 229.com @@ -3542,6 +3129,7 @@ xz.pphimalayanrt.com 23dns.com 23do.com 23du.com +23e489f9600657c1.com 23e4cb2581013.beer 23img.com 23job.net @@ -3550,6 +3138,7 @@ xz.pphimalayanrt.com 23luke.com 23mofang.com 23qb.com +23qb.net 23qcw.com 23sk.com 23txt.com @@ -3566,7 +3155,6 @@ xz.pphimalayanrt.com 23yy.com 23zw.com 24198ef3f855c8ff.com -2424ph.com 24331.org 24335.org 246546.com @@ -3574,10 +3162,11 @@ xz.pphimalayanrt.com 246ys.com 248.com 2481e.com -248ker.com 248xyx.com 249m.com +24av.com 24bb0cd0c3b8480d.com +24dab50b3223e582.com 24geban.com 24haowan.com 24hmb.com @@ -3587,12 +3176,13 @@ xz.pphimalayanrt.com 24maker.com 24money.com 24om.com -24pay.sbs +24shi.cc 24th.com 24timemap.com 24u7tos.com 250.cc 2500.tv +25000li.com 2500city.com 2500sz.com 250340.com @@ -3610,7 +3200,6 @@ xz.pphimalayanrt.com 254game.com 2551aa29811031.beer 255616.com -25565.net 2559e5f081017.beer 25662zubo23739.com 256app.com @@ -3622,8 +3211,8 @@ xz.pphimalayanrt.com 258ch.com 258en.com 258fuwu.com -258jrs.com 258sd.com +258weishi.com 258zw.com 25992.com 25az.com @@ -3633,7 +3222,6 @@ xz.pphimalayanrt.com 25fe391eb68e3f9c.com 25game.com 25ku.com -25mao.com 25nc.com 25pp.com 25q7ekcc67.com @@ -3676,6 +3264,7 @@ xz.pphimalayanrt.com 266.la 266fbded61019.beer 266wan.com +2671111.net 2677dl.com 2678.com 26785.org @@ -3710,10 +3299,12 @@ xz.pphimalayanrt.com 277t.com 27813000.com 2789a91661019.beer +278wan.com 279love.com 279tt.com 27al.com 27cat.com +27d7c9e9b3a34696.com 27daili.com 27l.com 27tj.com @@ -3736,6 +3327,7 @@ xz.pphimalayanrt.com 28715.vip 288idc.com 289.com +2896.ro 2898.com 28ce6d14004bae01.com 28d4cc3671024.beer @@ -3743,6 +3335,7 @@ xz.pphimalayanrt.com 28e4cd79f1023.beer 28eb96ed4da91317.com 28gl.com +28gua.com 28ka.com 28khy.com 28qp.com @@ -3776,6 +3369,7 @@ xz.pphimalayanrt.com 2a965464310251.beer 2agi.net 2ai2.com +2amok.com 2apzhfa.xyz 2av7.com 2b079fbcd1009.beer @@ -3785,6 +3379,7 @@ xz.pphimalayanrt.com 2bkw.com 2broear.com 2bulu.com +2c5bf25c11b8dc3e.com 2c71b194031fc683.com 2c883aeffbeef6c7.com 2caipiao.com @@ -3808,6 +3403,7 @@ xz.pphimalayanrt.com 2db3d5c761abe51b.com 2dcode.biz 2df.me +2dffbc61dea7ca0a.com 2dfire.com 2dfire.info 2dmaker.com @@ -3826,11 +3422,11 @@ xz.pphimalayanrt.com 2emai.com 2f.com 2f24ad2dc10261.beer -2fa.vip 2facb31bb10272.beer 2fda37d4c10292.beer 2gdt.com 2gei.com +2girls1finger.org 2google.com 2haha.com 2haitao.com @@ -3868,17 +3464,16 @@ xz.pphimalayanrt.com 2mjob.com 2mould.com 2muslim.com +2o.cx 2or3m.com 2p.biz 2p.com 2pcdn.com -2ppt.com 2q10.com 2qsc.com 2qupu.com 2r3r.com 2rich.net -2scdn.com 2sey.com 2sjc.com 2sonar.com @@ -3892,20 +3487,23 @@ xz.pphimalayanrt.com 2umj.com 2urch0.info 2urg1y.info +2urk3j.shop 2uroz.info 2v8d.com 2v9t3xf9z2.com +2vfun.com 2w.com 2w.ma 2weima.com -2weradf.xyz 2xiazai.com 2y9y.com 2ychem.com 2yq.org +2yuanyy.com 2yup.com 2yx8.com 2zhan.com +2zhk.com 2zimu.com 2zzt.com 3-3.me @@ -3940,13 +3538,14 @@ xz.pphimalayanrt.com 3062d65271020.beer 306t.com 3072ccba588e48d0.com +308.app 308.tv +30888.com 3099.net 30aitool.com 30c.org 30cgy.com 30daydo.com -30ds.com 30fun.com 30gaokao.com 30ka.com @@ -3964,7 +3563,6 @@ xz.pphimalayanrt.com 310win.com 311.biz 311100.com -311faka.com 311wan.com 312000.net 31260939.com @@ -3972,7 +3570,6 @@ xz.pphimalayanrt.com 312green.com 313033.com 313515.com -31423.com 314pay.com 315008.com 3150315.com @@ -4073,6 +3670,7 @@ xz.pphimalayanrt.com 3269.org 32768k.net 327aa34f510311.beer +3280.com 32800.com 3283773e9dc5cde5.com 3286.cc @@ -4186,6 +3784,7 @@ xz.pphimalayanrt.com 33app.net 33bus.com 33erwo.com +33fang.com 33ip.com 33iq.com 33lc.com @@ -4203,6 +3802,7 @@ xz.pphimalayanrt.com 3419e2cbf10261.beer 341d88b04156e9d3.com 342200.com +342jinbo.com 34347.com 345123.xyz 3454.com @@ -4304,6 +3904,7 @@ xz.pphimalayanrt.com 360byd.com 360bzl.com 360caifu.com +360cdn.com 360changshi.com 360che.com 360chezhan.com @@ -4380,7 +3981,6 @@ xz.pphimalayanrt.com 360qyaq.com 360safe.com 360safedns.com -360scdn.com 360shouji.com 360shouzhuan.com 360shuke.com @@ -4407,6 +4007,7 @@ xz.pphimalayanrt.com 360tpcdn.com 360tres.com 360tuan.com +360u9.com 360underwear.com 360uu.com 360vcloud.com @@ -4457,9 +4058,9 @@ xz.pphimalayanrt.com 363322014.com 3636.tech 363635.com -363faka.com 363u.com 364000.com +365.com 365.hk 36500.com 36500.net @@ -4544,16 +4145,17 @@ xz.pphimalayanrt.com 365vip.com 365world.com 365xiazai.com +365xs.la 365xuet.com 365yarn.com 365yg.com -365ym.com 365you.com 365yyf.com 365zhaopin.com 365zhuanrang.com 365zmw.com 365zsw.net +3660bf60ab32baab.com 36612345.com 3663.com 366300.com @@ -4594,14 +4196,12 @@ xz.pphimalayanrt.com 36kr.net 36krcdn.com 36krcnd.com -36linkr.com 36pnes36t0qs.com 36qp.com 36rv3j3.shop 36ve.net 36yc.com 36zpp.com -37.cc 37.com 37021.com 370fd.com @@ -4631,6 +4231,7 @@ xz.pphimalayanrt.com 3761.com 3768.org 377466.com +3774cd2332503d45.com 379.com 37937.com 3794b0fa67e5f83b.com @@ -4648,6 +4249,7 @@ xz.pphimalayanrt.com 37game2.com 37gjw.com 37gogo.com +37gowan.com 37hr.com 37k.com 37kx1.com @@ -4674,6 +4276,7 @@ xz.pphimalayanrt.com 380871.com 38109222.com 3816.net +3817.com 38198.org 381pk.com 3822edf4d1022.beer @@ -4696,6 +4299,7 @@ xz.pphimalayanrt.com 38711.cc 38735.vip 388g.com +3892222.com 38999h.vip 38a9018e44a7da0f.com 38b06119b10271.beer @@ -4720,6 +4324,7 @@ xz.pphimalayanrt.com 393.com 3937.com 3939339.com +394394.com 3949006e510272.beer 394afb34a1020.beer 39507037133f.icu @@ -4736,6 +4341,7 @@ xz.pphimalayanrt.com 39amjs.com 39ask.net 39b86269e11031.beer +39b8fe8f4c6f9dee.com 39bfe802d10292.beer 39center.com 39clean.com @@ -4761,6 +4367,7 @@ xz.pphimalayanrt.com 3a2dc2bd21023.beer 3a2studio.com 3a4.net +3a4b5c.com 3afbda6f11015.beer 3ait.com 3alv.com @@ -4772,8 +4379,10 @@ xz.pphimalayanrt.com 3b1bm3f.shop 3b1bvrwc.info 3b1fcl.info +3b1xgp.shop 3b2479faf10301.beer 3b2o.com +3bag.ru 3bf.cc 3bfc4d6861010.beer 3bu.com @@ -4785,6 +4394,7 @@ xz.pphimalayanrt.com 3c5a7b25910281.beer 3c6a1a5d01015.beer 3c9035c3bd9e7599.com +3cb106206b814b15.com 3cf6c871511032.beer 3chongmen.com 3conline.com @@ -4797,6 +4407,7 @@ xz.pphimalayanrt.com 3d-stereovision.com 3d2000.com 3d2848f7811042.beer +3d503a99384e0d4c.com 3d66.com 3d7ce8a16c0f8781.com 3d9r.com @@ -4838,6 +4449,7 @@ xz.pphimalayanrt.com 3dwhere.com 3dwwwgame.com 3dxt.com +3dzyw.com 3e.net 3e089a2bd1011.beer 3e1f90ccd1016.beer @@ -4863,7 +4475,9 @@ xz.pphimalayanrt.com 3fantizi.com 3fb762d23d09f297.com 3fc5960c0be056ce.com +3fcl8.net 3fda.com +3feb063cbf96bd40.com 3fzipper.com 3g-edu.org 3g368.com @@ -4893,6 +4507,7 @@ xz.pphimalayanrt.com 3ins.net 3j3f.com 3jdh.com +3jhuyu.com 3jidi.com 3jlm.com 3jrx.com @@ -4906,6 +4521,7 @@ xz.pphimalayanrt.com 3kk.com 3kmq.com 3ko.com +3kr.com 3kyi.com 3kzhushou.com 3labtest.com @@ -4961,14 +4577,18 @@ xz.pphimalayanrt.com 3stl.com 3sunway.com 3swg.com +3t3.org 3thiku.com 3tilabs.com 3tinkers.com 3tmall.com 3treesgroup.com +3tstore.com 3u.com +3ukkht3yn3.work 3unshine.com 3uol.com +3us.com 3uww.cc 3uww.com 3v.do @@ -4983,6 +4603,7 @@ xz.pphimalayanrt.com 3wyk.com 3x7.com 3xgd.com +3xiaoniao.com 3xiazai.com 3xinhome.com 3y1.com @@ -5029,6 +4650,7 @@ xz.pphimalayanrt.com 400332.com 40035.com 400388.com +4006055885.com 4006216888.com 4006300457.com 4006339177.com @@ -5064,7 +4686,6 @@ xz.pphimalayanrt.com 4008885818.com 4009.com 4009515151.com -400980.com 4009991000.com 4009997658.com 400cx.com @@ -5079,10 +4700,8 @@ xz.pphimalayanrt.com 400vv.com 400web.com 4020.la -402faka.com 40407.com 404886.com -404k.vip 404mzk.com 404wan.com 404youxi.com @@ -5091,6 +4710,7 @@ xz.pphimalayanrt.com 4080517.com 408399.com 408399.net +4087b09ee4632bb5.com 408cf42720d8be86.com 408ec542b10281.beer 409a1957110311.beer @@ -5123,7 +4743,6 @@ xz.pphimalayanrt.com 41wan.com 41xt.com 420d586841024.beer -4213.com 42144.com 421db96b91011.beer 42224b3c51016.beer @@ -5146,6 +4765,7 @@ xz.pphimalayanrt.com 42how.com 42trip.com 42verse.shop +430d6eba715dabb4.com 4311.com 432.com 432520.com @@ -5166,6 +4786,7 @@ xz.pphimalayanrt.com 43803a8c410261.beer 4393ce88a10272.beer 4395e6c8b10291.beer +4399-xyx.com 4399.com 4399.net 43999yx.com @@ -5182,7 +4803,6 @@ xz.pphimalayanrt.com 4399inc.com 4399j.com 4399mail.com -4399om.com 4399pk.com 4399sj.com 4399swf.com @@ -5227,7 +4847,6 @@ xz.pphimalayanrt.com 44ff56d11fa53a9a.com 44h.co 44jj.com -44nc.com 44pq.cc 44vs.com 4502512122531.icu @@ -5263,11 +4882,13 @@ xz.pphimalayanrt.com 45yx.com 461000.net 462.com +46245fb7d43c13a3.com 46412.com 46644.com 46721.org 46771313.com 46809.org +46940.vip 46ab3da510d4ccaf.com 46cdn.vip 46d7940171014.beer @@ -5320,14 +4941,11 @@ xz.pphimalayanrt.com 48cdn.vip 48hao.net 48log.com -4901.com -490186.com 491.com 4916a68576d64a34.com 492288.com 492f2622e64c138e.com 4930.com -4933.com 49358.com 49363.com 4937711.com @@ -5340,7 +4958,6 @@ xz.pphimalayanrt.com 497.com 498.net 499-img.com -499333.xyz 499n.com 499youxi.com 49app.com @@ -5371,7 +4988,6 @@ xz.pphimalayanrt.com 4c28539c4f10ad16.com 4c37ebc131010.beer 4c43edd99cd8bb40.com -4c44.com 4c4866d8179d6f70.com 4c55033b91010.beer 4c645708fabd0e13.com @@ -5398,7 +5014,9 @@ xz.pphimalayanrt.com 4f0b987b410311.beer 4f411973f14e0f10.com 4f61.com +4f68340f5b6c21a9.com 4f89.com +4f9bf1e673931484.com 4fang.net 4fd4969ff1022.beer 4fe55e9f6c893405.com @@ -5422,6 +5040,7 @@ xz.pphimalayanrt.com 4kgood.com 4kgou.com 4kya.com +4l.hk 4lzr.com 4ndwc.com 4o.org @@ -5481,12 +5100,12 @@ xz.pphimalayanrt.com 5011.net 501h.com 501wan.com -502.ai 50257e08d1015.beer -502fakw.com 503118.com 50331.net 5033333.com +503b2f379abaf979.com +503error.com 505035.com 5054399.com 5054399.net @@ -5494,7 +5113,6 @@ xz.pphimalayanrt.com 5066.com 506u5nf5j5.com 507c7d240b2eae97.com -508.im 5087.com 508hdsys.com 508mallsys.com @@ -5513,11 +5131,11 @@ xz.pphimalayanrt.com 50yu.com 50zera.com 50zw.co -50zw.com 50zw.net 51-cf.com 51-jia.com 51-visa.com +51.am 51.com 51.la 51.net @@ -5612,6 +5230,7 @@ xz.pphimalayanrt.com 51802.com 5184.com 5184pass.com +5185.cc 51864.com 51870.com 5188.com @@ -5727,6 +5346,7 @@ xz.pphimalayanrt.com 51drv.com 51dugou.com 51dz.com +51dzrc.com 51dzt.com 51dzw.com 51ean.com @@ -5757,6 +5377,7 @@ xz.pphimalayanrt.com 51feitu.com 51feiyu.com 51fiber.net +51finace.com 51findwork.com 51fl.com 51fpg.com @@ -5765,6 +5386,7 @@ xz.pphimalayanrt.com 51fucai.com 51fund.com 51fxkj.com +51fxzq.com 51fytx.com 51g3.com 51g3.net @@ -5784,6 +5406,7 @@ xz.pphimalayanrt.com 51goods.vip 51google.com 51gouke.com +51gowan.com 51gpt.com 51gran.com 51grb.com @@ -5841,10 +5464,12 @@ xz.pphimalayanrt.com 51ixuejiao.com 51jb.com 51jiabo.com +51jiang.com 51jianxie.com 51jiaoxi.com 51jiemeng.com 51jingying.com +51jinkang.com 51jishu.com 51jiuhuo.com 51job.com @@ -5859,18 +5484,20 @@ xz.pphimalayanrt.com 51julebu.com 51junde.com 51junshi.com -51kandianshi.com 51kanmanhua.com 51kanong.com 51kaola.net 51kaowang.com +51kaxun.com 51kehui.com +51kf100.com 51kids.com 51kik.com 51kim.com 51kshen.com 51kt.com 51kuaizhuan.com +51kupin.com 51kywang.com 51la.ink 51la.net @@ -5887,7 +5514,6 @@ xz.pphimalayanrt.com 51lingji.com 51link.com 51liucheng.com -51livetv.com 51losangeles.com 51lxrc.com 51lzr.com @@ -5914,7 +5540,6 @@ xz.pphimalayanrt.com 51mokao.com 51mole.com 51moot.net -51mowan.com 51mpa.net 51mrp.com 51msc.com @@ -5935,12 +5560,12 @@ xz.pphimalayanrt.com 51photo.vip 51php.com 51piao.com +51piaohua.com 51pibu.com 51pigai.com 51ping.com 51pinwei.com 51pla.com -51poca.com 51pocket.com 51pocket.net 51poll.com @@ -5949,6 +5574,7 @@ xz.pphimalayanrt.com 51poweron.com 51pptmoban.com 51psj.com +51puer.com 51qc.com 51qc.net 51qianguo.com @@ -6063,7 +5689,6 @@ xz.pphimalayanrt.com 51u.co 51uc.com 51ukf.com -51usz.com 51vhost.net 51vimeo.com 51vip.biz @@ -6071,7 +5696,6 @@ xz.pphimalayanrt.com 51vv.net 51vv2.com 51w.co -51wan.com 51wangming.com 51wangpi.com 51wanquan.com @@ -6144,6 +5768,7 @@ xz.pphimalayanrt.com 51ytg.com 51yuansu.com 51yuepin.com +51yueqian.com 51yugou.com 51yund.com 51yundong.me @@ -6160,6 +5785,7 @@ xz.pphimalayanrt.com 51zhi.com 51zhishang.com 51zhizhao.com +51zhucai.com 51zjedu.com 51zjxm.com 51zmt.net @@ -6179,7 +5805,6 @@ xz.pphimalayanrt.com 52.vip 520.com 520.net -520.skin 520101.com 520520520520520.com 520730.com @@ -6190,6 +5815,7 @@ xz.pphimalayanrt.com 520chs.com 520code.net 520diandu.com +520gexing.com 520hello.com 520hhht.com 520homo.com @@ -6213,7 +5839,6 @@ xz.pphimalayanrt.com 520yidui.com 520zc.com 520zg.net -521000.com 5210601.com 52112.com 5211game.com @@ -6258,6 +5883,7 @@ xz.pphimalayanrt.com 5277.com 527fgame.com 527ice.com +527meeting.com 527ss.com 528045.com 5281.net @@ -6294,6 +5920,7 @@ xz.pphimalayanrt.com 52cik.com 52ckd.com 52click.net +52cmajor.com 52cnp.com 52cnw.net 52code.store @@ -6311,7 +5938,10 @@ xz.pphimalayanrt.com 52dsy.com 52dtv.com 52dus.com +52duzhe.com +52dy.tv 52dyy.com +52dzxy.com 52edns.com 52edy.com 52enku.com @@ -6350,12 +5980,14 @@ xz.pphimalayanrt.com 52jiaozhou.com 52jiawei.com 52jingsai.com +52jinhu.com 52jisu.com 52jj.net 52jrjy.com 52js8.com 52jscn.com 52jubensha.com +52jxrc.com 52jxt.com 52kanxiaoshuo.com 52kd.com @@ -6387,6 +6019,7 @@ xz.pphimalayanrt.com 52mvp.com 52nantong.net 52niuka.com +52njl.com 52nyg.com 52pcfree.com 52photo.com @@ -6404,6 +6037,7 @@ xz.pphimalayanrt.com 52qmct.com 52queji.com 52qumao.com +52qupu.com 52ra3.com 52ranwen.net 52rd.com @@ -6416,7 +6050,6 @@ xz.pphimalayanrt.com 52shici.com 52shipping.com 52shuw.cc -52shuwang.com 52shuxue.com 52solution.com 52songshu.com @@ -6465,9 +6098,9 @@ xz.pphimalayanrt.com 52yitian.com 52ykjob.com 52youbian.com +52youju.com 52youpiao.com 52youtu.com -52youzai.com 52yq.com 52yushi.com 52yuwan.com @@ -6484,7 +6117,6 @@ xz.pphimalayanrt.com 52zy.com 5306.com 53155.vip -53164836.com 531pool.com 532106.com 53233.org @@ -6505,6 +6137,8 @@ xz.pphimalayanrt.com 537300.com 53797.vip 5385s.com +538618.com +538a9b8b890bff34.com 53920.net 539831.vip 5399.com @@ -6515,7 +6149,6 @@ xz.pphimalayanrt.com 53dns.org 53ee.com 53info.com -53inside.com 53iq.com 53kf.com 53miji.com @@ -6543,6 +6176,7 @@ xz.pphimalayanrt.com 54268.com 5433.com 54391.com +54406c82bf7d5705.com 5442.com 544521.xyz 544e5adac11012.beer @@ -6561,6 +6195,7 @@ xz.pphimalayanrt.com 54doctor.net 54doctors.net 54dr.com +54hcz.com 54heb.com 54im.com 54jkw.com @@ -6598,7 +6233,6 @@ xz.pphimalayanrt.com 5525game.com 553356.com 55344.com -5535678.xyz 554030cc.com 554488.com 554baad62c869a7b.com @@ -6606,6 +6240,7 @@ xz.pphimalayanrt.com 55555.io 55555432.com 55555558.com +5555622ab0.shop 5559000ab0.shop 5559000ab7.shop 555edu.net @@ -6635,13 +6270,13 @@ xz.pphimalayanrt.com 5577937.com 5577943.com 5577956.com -5577game.com 558.com 5588.tv 5588294.com 5588492.com 5588bet.com 558idc.com +559.cc 55935.vip 5595.cc 5599.com @@ -6704,6 +6339,7 @@ xz.pphimalayanrt.com 56711.com 567idc.com 568.com +5684.com 5684t.net 56851.net 56885.net @@ -6753,7 +6389,6 @@ xz.pphimalayanrt.com 56tim.com 56tj.com 56tv.org -56tvc.com 56uu.com 56xiniao.com 56ye.net @@ -6781,6 +6416,7 @@ xz.pphimalayanrt.com 57875.vip 579idc.com 57auto.com +57bm.com 57class.net 57df3696bffd3eb4.com 57dp.com @@ -6819,6 +6455,7 @@ xz.pphimalayanrt.com 58416.org 5858.com 5858xs.com +58611.net 58620888.com 5866.com 5867yh.com @@ -6833,7 +6470,6 @@ xz.pphimalayanrt.com 588tao.com 588yw.com 588z.com -58976ghg.com 5898yun.com 58antenna.com 58auv.com @@ -6889,6 +6525,7 @@ xz.pphimalayanrt.com 58wuji.com 58xinghuo.com 58xinrui.com +58xs.com 58xs.la 58xueche.com 58xuexi.com @@ -6896,6 +6533,7 @@ xz.pphimalayanrt.com 58youtui.com 58youxi.com 58yuesao.com +58z.net 59.com 5909.net 590m.com @@ -6910,7 +6548,6 @@ xz.pphimalayanrt.com 591adb.com 591con.com 591hx.com -591ll.com 591master.com 591moto.com 591moto.net @@ -6928,7 +6565,6 @@ xz.pphimalayanrt.com 5945i.com 595.bet 595.cc -5950380.cc 59519.com 595818.com 5959.vip @@ -6958,6 +6594,7 @@ xz.pphimalayanrt.com 59dead1ce10301.beer 59dun.com 59f086f4910311.beer +59f35373bf3f8e7d.com 59ff599661017.beer 59hi.com 59iedu.com @@ -6965,6 +6602,7 @@ xz.pphimalayanrt.com 59jt.com 59med.com 59ni.com +59pk.net 59rj.com 59store.com 59w.net @@ -6977,6 +6615,7 @@ xz.pphimalayanrt.com 5a828d12510272.beer 5a8878b99c8f9160.com 5a8a3d1d111021.beer +5a9bf3726d2b09fa.com 5aa212657a354b3e.com 5aaa.com 5acbd.com @@ -7008,8 +6647,10 @@ xz.pphimalayanrt.com 5ce.com 5ce08adc68995a7a.com 5ceimg.com +5cgo.com 5cpod.com 5d.ink +5d116d676087d0e8.com 5d170bdbce0cbe9b.com 5d2ede2.com 5d6d.com @@ -7044,6 +6685,7 @@ xz.pphimalayanrt.com 5f36b4f39ba574b7.com 5f52903c110251.beer 5f69826526db4f44.com +5f9e6b1603f69b9b.com 5fa26ed6d1024.beer 5fen.com 5fun.com @@ -7054,7 +6696,6 @@ xz.pphimalayanrt.com 5gjoy.com 5guanjianci.com 5gwan.com -5gxcx.net 5gxsd.com 5gxt.com 5gy.com @@ -7116,6 +6757,7 @@ xz.pphimalayanrt.com 5iucn.com 5iweix.com 5iximai.com +5ixuexiwang.com 5iyoule.com 5iyq.com 5iyuyan.com @@ -7130,9 +6772,11 @@ xz.pphimalayanrt.com 5k5m.com 5kaixin.net 5kbox.com +5kcrm.com 5kcrm.net 5kda.com 5khouse.com +5kmw.com 5kwuke.com 5lanren.com 5lu.com @@ -7143,6 +6787,8 @@ xz.pphimalayanrt.com 5nnj.com 5o.com 5ooq.com +5opzl.com +5opzl.net 5pao.com 5pb.net 5pk.com @@ -7155,6 +6801,7 @@ xz.pphimalayanrt.com 5radar.com 5rc.com 5read.com +5rfh44h5.cc 5ring.com 5ritt.com 5rs.me @@ -7188,6 +6835,7 @@ xz.pphimalayanrt.com 5v13.com 5w123.com 5w5.com +5w52.com 5w5w.com 5waihui.com 5wapp.com @@ -7236,7 +6884,6 @@ xz.pphimalayanrt.com 602ab6ff810251.beer 602img.com 60301c31eca86940.com -60353595.com 603603b.com 603603d.com 603966.com @@ -7270,6 +6917,7 @@ xz.pphimalayanrt.com 610115.com 610213.net 61029.com +6103g.com 6104.tv 6112.com 61165.com @@ -7296,6 +6944,7 @@ xz.pphimalayanrt.com 618bg.com 618cj.com 618day.com +618hr.com 618ky.com 618tech.com 618waihui.com @@ -7333,6 +6982,7 @@ xz.pphimalayanrt.com 6266.cc 62669.com 626x.com +628.com 6285s.com 62923.vip 629973.com @@ -7341,6 +6991,7 @@ xz.pphimalayanrt.com 62ddccc8810301.beer 62dns.com 62game.com +62l.net 62wy.com 6300.net 630book.cc @@ -7354,6 +7005,7 @@ xz.pphimalayanrt.com 632news.com 6333.tv 6334x.com +633586c05c8f4543.com 634.ag 634d.com 634image.com @@ -7369,8 +7021,10 @@ xz.pphimalayanrt.com 639311.com 63936b71f3e4ab6a.com 6397869a4eb51a13.com +63a795836312c99d.com 63b4ff1aeff2818d.com 63cj.com +63fl.com 63pe.com 63u.net 63yx.com @@ -7382,11 +7036,12 @@ xz.pphimalayanrt.com 64365.com 644446.com 64504.com +645250.net 6453.net 64538.net -645ajm.com 646000.com 6463.com +64644444.com 64783333.com 648sy.com 64dns.com @@ -7403,7 +7058,6 @@ xz.pphimalayanrt.com 654320.com 6543210.com 654321wan.com -655hfe.com 655u.com 655yx.com 65601111.com @@ -7417,6 +7071,7 @@ xz.pphimalayanrt.com 65b01705c10261.beer 65bb2d6d81010.beer 65box.com +65dataranking.com 65ec0ea7f04562ad.com 65liuxue.com 65mhxy.com @@ -7432,10 +7087,12 @@ xz.pphimalayanrt.com 6617.com 66173yx.com 662city.com +662p.com 66301cc.com 6633102.com 6633488.com 6633696.com +663661.com 6636yy.com 66378.com 66388.net @@ -7472,6 +7129,7 @@ xz.pphimalayanrt.com 666kuaishou.net 666pic.com 666post.com +666scly.com 666shuwu.com 666wan.com 666wan.net @@ -7496,11 +7154,11 @@ xz.pphimalayanrt.com 668lw.com 668map.com 668wan.com +669167d4fc316421.com 66930909.com 669322.com 6695.com 66988.tv -66990000.xyz 6699129.com 6699301.com 6699343.com @@ -7516,6 +7174,7 @@ xz.pphimalayanrt.com 6699873.com 669cd3a3ea61d96f.com 669pic.com +669play.com 669ye.com 669zw.com 66brl.com @@ -7529,11 +7188,13 @@ xz.pphimalayanrt.com 66ika.com 66in.net 66l.cc +66laws.com 66mi.com 66mobi.com 66money.com 66n.co 66nao.com +66nh.com 66park.net 66perfect.com 66play.com @@ -7576,6 +7237,7 @@ xz.pphimalayanrt.com 677.vip 6771112.com 678119.com +6786666.com 6787.com 67876.com 6788888.net @@ -7611,6 +7273,7 @@ xz.pphimalayanrt.com 6822.com 68287zubo85737.com 682ff8a9c89d5d88.com +6832123.com 6840011.com 6844.com 685462.com @@ -7624,6 +7287,7 @@ xz.pphimalayanrt.com 6887cc57c10251.beer 6888.tv 688dns.com +688mob.com 688wz.net 68955.com 68978.net @@ -7632,6 +7296,7 @@ xz.pphimalayanrt.com 68bbq.com 68china.net 68design.net +68e5fc2c1344afb8.com 68ecshop.com 68gainian.com 68h5.com @@ -7650,6 +7315,7 @@ xz.pphimalayanrt.com 69090.com 6912s.com 6917.com +69260.com 692657.com 693.com 6934.net @@ -7675,6 +7341,7 @@ xz.pphimalayanrt.com 699pic.com 69fd4a3dbd02f66c.com 69g.com +69hr.com 69mok.com 69shu.org 69shuba.cc @@ -7696,8 +7363,11 @@ xz.pphimalayanrt.com 6apt.com 6b1813f5210261.beer 6b3b.com +6b3cfa277bae3b4b.com +6b786q3e.work 6bac9d15d10271.beer 6bdns.com +6c0f63385ed13b89.com 6c6c.com 6c7ccba3e11031.beer 6cit.com @@ -7705,6 +7375,7 @@ xz.pphimalayanrt.com 6cnzz.com 6d4d5.com 6d4g.com +6d576388add270c5.com 6d63d3.com 6d7d.com 6dan.com @@ -7714,7 +7385,6 @@ xz.pphimalayanrt.com 6dfefa7039812445.com 6diy.com 6ds.me -6dsdcms.com 6du.in 6duoyu.com 6e212121910292.beer @@ -7725,6 +7395,7 @@ xz.pphimalayanrt.com 6ef102d0210261.beer 6f25df38a10291.beer 6f7b51b741014.beer +6f8b82f9fbb439db.com 6fast.com 6fcsj.com 6fe7c9d291017.beer @@ -7733,6 +7404,7 @@ xz.pphimalayanrt.com 6g5fd1a.com 6gh4.com 6ght.com +6glz.com 6h979.com 6hd0hoc.com 6hgame.com @@ -7743,9 +7415,9 @@ xz.pphimalayanrt.com 6ie6.com 6ifang.com 6juzi.com +6jyi7mzae.com 6jz.com 6k11.com -6kai.cc 6ke.com 6kw.com 6kwan.com @@ -7790,6 +7462,7 @@ xz.pphimalayanrt.com 6uudy.com 6v.com 6v6.work +6vdyg.com 6wan.com 6wtx.com 6wwww.com @@ -7808,13 +7481,13 @@ xz.pphimalayanrt.com 6yyy7.com 6z6z.com 6ze.net -6zhentan.com 6ziz.com 6zu.com 7-11bj.com 7-che.com 7-meeting.com 7-mi.net +7-vk.com 7-wx.com 70.cc 700618.com @@ -7828,7 +7501,6 @@ xz.pphimalayanrt.com 70392.org 70524.com 706net.com -707.com 707598.xyz 707e518c610291.beer 7080edu.com @@ -7841,10 +7513,10 @@ xz.pphimalayanrt.com 70jj.com 70ka.com 70ppt.com +70soft.com 70ym.com 70yx.com 71.net -710hf.com 7114.com 7116.com 7116dns.com @@ -7866,7 +7538,6 @@ xz.pphimalayanrt.com 7176.com 717c.com 717down.com -7181.com 71908.com 7192.com 719400.com @@ -7894,9 +7565,9 @@ xz.pphimalayanrt.com 71tech.com 71txt.com 71wl.com +71wx.net 71xe.com 71xk.com -72.chat 72.com 72017.net 720582.com @@ -7937,6 +7608,7 @@ xz.pphimalayanrt.com 72crm.com 72crm.net 72crm.org +72d3bb672f4a6997.com 72dj.com 72dns.com 72dns.net @@ -7985,7 +7657,6 @@ xz.pphimalayanrt.com 7415.com 741b0fca410271.beer 7428.net -743bvw.com 743forever.com 7441a334d13a0000.com 74478fd3b9cca85f.com @@ -7994,6 +7665,7 @@ xz.pphimalayanrt.com 74615ee887a99dd7.com 7474.com 7477.com +747wan.com 749333.xyz 74955.net 74966.net @@ -8004,6 +7676,7 @@ xz.pphimalayanrt.com 74dns.com 74f11ac633122c20.com 74hao.com +75.team 75111.com 75111.net 75122d9a05f7a5a7.com @@ -8028,16 +7701,16 @@ xz.pphimalayanrt.com 75ll.com 75n474.com 75pk.com -75txt.com 75ww.com 76120.org 7618.com 7631.com +7633sqw.com 76474cf781f10d61.com 7651.com 766.com 7663.com -76642464.cfd +76676.com 766899d4f1011.beer 766er.com 766vd.com @@ -8075,7 +7748,6 @@ xz.pphimalayanrt.com 77304.com 77304y.com 77313.com -7733249.com 7733320.com 7733352.com 7733577.com @@ -8133,6 +7805,7 @@ xz.pphimalayanrt.com 77bh.com 77bike.com 77bx.com +77dd23.com 77dushu.com 77dyy.net 77ebooks.com @@ -8200,20 +7873,22 @@ xz.pphimalayanrt.com 78yx.net 79.biz 790.com +79008500.xyz 790a8f76c10301.beer 7928a82f311032.beer 793360.com 793688.com 79432.com 7951ee2a510281.beer +79521.cc 7979u.com -797rs.com 797sun.com 7988.com 798com.com 798edu.com 798zb.tv 799.net +79979.loan 7997v.com 7999.tv 79999.net @@ -8247,7 +7922,6 @@ xz.pphimalayanrt.com 7cdfad1816def43d.com 7chacha.com 7ci.com -7cj2-x5r9vqm.vip 7cname.com 7cnv.com 7cxk.com @@ -8276,6 +7950,7 @@ xz.pphimalayanrt.com 7f416cfd411012.beer 7f86a2a17fcd5a5d.com 7fa19203510241.beer +7fa973f8c7bdcddb.com 7fei.com 7fff5701c5415d77.com 7fgame.com @@ -8302,7 +7977,6 @@ xz.pphimalayanrt.com 7jk.com 7juju.com 7k35.com -7k6k.com 7k7k.com 7k8k.com 7ka.co @@ -8326,14 +8000,13 @@ xz.pphimalayanrt.com 7oh.net 7pa.com 7paiqun.com +7piq.com 7po.com 7q5.com 7qile.com 7quw.com -7r.fit 7r7z.com 7rdao.com -7risha.com 7road.com 7road.net 7ronggame.com @@ -8345,7 +8018,6 @@ xz.pphimalayanrt.com 7soyo.com 7su.com 7syc.com -7syun.com 7t9.com 7tenet.net 7tgame.com @@ -8356,7 +8028,6 @@ xz.pphimalayanrt.com 7ugl.com 7usa.net 7uv.com -7vip.com 7wan.com 7wate.com 7wee.com @@ -8392,13 +8063,13 @@ xz.pphimalayanrt.com 8.xyz 80.hk 80000.cc -8000yi.com 800423.com 800507.com 8006506.com 8006511.com 8006tu.com 800820.net +8008202191.com 8008205555.com 800app.com 800bamboo.com @@ -8549,6 +8220,7 @@ xz.pphimalayanrt.com 822ef055f1017.beer 823238fa910271.beer 82335966.com +8243d76487f3a834.com 8246.net 8254ce48211021.beer 8264.com @@ -8565,11 +8237,13 @@ xz.pphimalayanrt.com 8295099d311031.beer 8295dc6e7e797638.com 82987977.com +829e30d07853f4fd.com 82d5d0e4f10291.beer 82e0dd98d1edbbb1.com 82flex.com 82ip.com 82ky.com +82l.net 82pk.com 8303.org 83124.com @@ -8579,13 +8253,14 @@ xz.pphimalayanrt.com 8325.com 8329607.com 833006.net -83335888.com +8333dhz.com 8336.com 834834002.com 834834009.com 834834vip4.com 835444.cc 835images83.com +83661111.net 83666.com 83692.com 83753751.com @@ -8631,6 +8306,7 @@ xz.pphimalayanrt.com 85679999.com 85791df5e89bcda6.com 8579s.com +857yx.com 857zb1.tv 85814.com 85880234.com @@ -8640,6 +8316,7 @@ xz.pphimalayanrt.com 85jk.com 85kf.com 85sc.com +85wp.com 85xt.com 86-import.com 86.cc @@ -8665,12 +8342,14 @@ xz.pphimalayanrt.com 866ds.com 8671099.com 86754.org +867867jh.com 8682.cc 8686c.com 8688g.com 86933.com 869d.com 869v.com +86a92644807597fa.com 86amsdy.com 86bdada6e1019.beer 86bus.com @@ -8686,7 +8365,6 @@ xz.pphimalayanrt.com 86hh.com 86hk.vip 86hr.com -86huoche.com 86jg.com 86joy.com 86kang.com @@ -8699,7 +8377,6 @@ xz.pphimalayanrt.com 86office.com 86pla.com 86pm25.com -86ps.com 86ps.net 86sb.com 86tec.com @@ -8719,6 +8396,7 @@ xz.pphimalayanrt.com 87131.vip 87161.vip 87188718.com +872.cc 872872.com 8732365.com 8733777251212.icu @@ -8731,6 +8409,7 @@ xz.pphimalayanrt.com 8769d53.com 876dns.com 8770000.com +87739b0fc18fe40a.com 8775.com 87753.net 877771.xyz @@ -8744,6 +8423,7 @@ xz.pphimalayanrt.com 8799.com 87a37933611021.beer 87b041a2019314d7.com +87bc16a2fc6c4036.com 87e1ed649c57575b.com 87g.com 87money.com @@ -8755,6 +8435,8 @@ xz.pphimalayanrt.com 880.net 8800.org 880022.com +8801.net +880303.xyz 880331.net 88077777.com 88090.com @@ -8799,6 +8481,7 @@ xz.pphimalayanrt.com 886966.com 886abc.com 886cdead210292.beer +886vps.com 887367.com 88765.com 887777.com @@ -8815,8 +8498,6 @@ xz.pphimalayanrt.com 8889997777.com 888ban.com 888chem.com -888fk.cc -888lm01.com 888pic.com 888ppt.com 888rj.com @@ -8852,6 +8533,7 @@ xz.pphimalayanrt.com 88lan.com 88laser.com 88lot.com +88mf.com 88ming.net 88order.com 88pets.com @@ -8863,12 +8545,12 @@ xz.pphimalayanrt.com 88ttv.com 88wbet.me 88xiaoshuo.com -88xtu.com 88y5.com 88ysg.com 88zha.com 88zjzy.com 89006006.com +890bf715220716f3.com 8910.io 89178.com 8926174358102.icu @@ -8894,6 +8576,7 @@ xz.pphimalayanrt.com 8999.cc 89b12b5e3ff8085c.com 89dj.com +89doc.com 89ds.com 89f0e4a1603d3372.com 89f9ee46410292.beer @@ -8935,6 +8618,7 @@ xz.pphimalayanrt.com 8dn.com 8dol.com 8dou.com +8dp.net 8dt.com 8dudata.com 8dus.com @@ -9008,8 +8692,6 @@ xz.pphimalayanrt.com 8win.net 8wq.com 8wss.com -8x.fit -8x14khzwmi.com 8x5vviy4r2.com 8x6x.com 8xs.org @@ -9040,6 +8722,7 @@ xz.pphimalayanrt.com 900ppt.com 900yi.com 90123.com +9018.net 90231611e4973cbb.com 90370.com 904e0d2ba10241.beer @@ -9058,6 +8741,7 @@ xz.pphimalayanrt.com 90lhd.com 90qh.com 90sheji.com +90sjimg.com 90tank.com 90vm.com 90wmoyu.com @@ -9088,6 +8772,7 @@ xz.pphimalayanrt.com 9133.com 91360.com 91378.com +913aefac85f5bf8f.com 913pc.com 913vr.com 913you.com @@ -9102,6 +8787,7 @@ xz.pphimalayanrt.com 915d.tv 916360.net 9166yx.com +916m.com 917.com 9170.com 917st.com @@ -9111,7 +8797,6 @@ xz.pphimalayanrt.com 9188.com 9188.work 918canyin.com -918fkw.com 918ka.cc 918rc.com 919.com @@ -9135,7 +8820,6 @@ xz.pphimalayanrt.com 91bushou.com 91carnet.com 91cdkey.com -91cdncdn.com 91cha.com 91changxie.com 91chengguo.com @@ -9152,7 +8836,6 @@ xz.pphimalayanrt.com 91dbq.com 91ddcc.com 91ddedu.com -91ddos.com 91dict.com 91dnso.com 91doujin.com @@ -9164,8 +8847,6 @@ xz.pphimalayanrt.com 91exiu.com 91facts.com 91fangan.com -91fangyu.com -91fengwan.com 91fifa.com 91fyt.com 91game.com @@ -9250,8 +8931,10 @@ xz.pphimalayanrt.com 91sph.com 91sst.com 91student.com +91suan.com 91suke.com 91switch.com +91syun.com 91taojin.com 91taoke.com 91ting.net @@ -9270,10 +8953,12 @@ xz.pphimalayanrt.com 91wangyx.com 91way.com 91weimai.com +91wenwen.net 91wllm.com 91wujia.com 91wutong.com 91wzg.com +91x.org 91xch.com 91xcm.com 91xfw.com @@ -9291,6 +8976,7 @@ xz.pphimalayanrt.com 91yk.com 91yong.com 91you.com +91youchai.com 91youxi.com 91yoyo.net 91yu.com @@ -9306,8 +8992,6 @@ xz.pphimalayanrt.com 920uc.com 921.com 9211.com -9212c21.com -9212c7.com 9217fdb98dcc13a8.com 9217web.com 92220556.com @@ -9318,7 +9002,6 @@ xz.pphimalayanrt.com 92220760.com 92224s.com 922997xtz2.shop -923578.xyz 923f92a4e1df1753.com 924747.com 925g.com @@ -9328,9 +9011,11 @@ xz.pphimalayanrt.com 927953.com 927game.com 928.sale +928vbi.com 92913.com 929825.com 92987.com +9299.net 929g.com 929vip.shop 92anycall.com @@ -9347,6 +9032,7 @@ xz.pphimalayanrt.com 92fox.com 92gyw.com 92hidc.net +92jzh.com 92kaifa.com 92kk.com 92le.com @@ -9375,8 +9061,10 @@ xz.pphimalayanrt.com 9312.net 93126.org 93135.com +931931jh.com 933.moe 933332.xyz +934dsw.com 934hd.com 93636.com 93692zubo66936.com @@ -9385,6 +9073,7 @@ xz.pphimalayanrt.com 937791.com 9377a.com 9377d.com +9377df.com 9377j.com 9377ja.com 9377os.com @@ -9430,6 +9119,7 @@ xz.pphimalayanrt.com 946000.com 9466.com 947fd9a0011042.beer +94831.com 9486483.com 948hj.com 9495.com @@ -9472,6 +9162,7 @@ xz.pphimalayanrt.com 95105555.com 95105888.com 95105899.com +9512.net 951280.com 951368.com 95158.com @@ -9489,6 +9180,7 @@ xz.pphimalayanrt.com 9533.org 95408.com 9540f8f83e1e7a8c.com +95447.com 95504.net 95504test.com 95508.com @@ -9527,7 +9219,6 @@ xz.pphimalayanrt.com 95en.com 95epay.com 95fenapp.com -95fk.net 95ib.com 95ip.com 95jizhang.com @@ -9575,6 +9266,7 @@ xz.pphimalayanrt.com 96519.org 96528.com 96533.com +965373.com 96558.com 9655bcfbe1022.beer 96567.com @@ -9586,11 +9278,11 @@ xz.pphimalayanrt.com 9666sr.com 9669.com 966zlnfjuza4oloh2bk.app -9670.net 96804.com 96811.com 96811.net 96822.com +968550.com 96856.org 9686000.com 96877.net @@ -9600,7 +9292,6 @@ xz.pphimalayanrt.com 969368.com 96966.com 969g.com -969mak.com 96ac893dd11011.beer 96caifu.com 96cc09c581022.beer @@ -9618,7 +9309,6 @@ xz.pphimalayanrt.com 96sdk.com 96sir.com 96weixin.com -96xz.com 96yx.com 96zxue.com 97.biz @@ -9651,7 +9341,11 @@ xz.pphimalayanrt.com 97973399.com 97975508.com 97976608.com +9797cp2.com 9797ly.com +9797x4.com +9797x7.com +9799.com 9799251212480.icu 97a12bb360b26d1c.com 97add.com @@ -9680,7 +9374,6 @@ xz.pphimalayanrt.com 97zm.com 98.com 98.ma -980.ag 9800.com 980512.com 980cje.com @@ -9690,6 +9383,7 @@ xz.pphimalayanrt.com 985.so 985900.com 985dh.com +985hezi.com 985ks.com 985ks.net 985sy.com @@ -9704,8 +9398,8 @@ xz.pphimalayanrt.com 987you.com 98809.com 988848a9d1013.beer +988878.com 98892.com -988dns.com 988sl.com 9891.com 9891760ee2389285.com @@ -9729,6 +9423,7 @@ xz.pphimalayanrt.com 98du.com 98e774f505d78b1a.com 98eye.com +98lm.com 98mc.cc 98mp.com 98nice.com @@ -9750,7 +9445,6 @@ xz.pphimalayanrt.com 9911yx.com 99166.com 9917.com -9917wan.com 9918.tv 99193.com 991fd1ce91009.beer @@ -9765,12 +9459,14 @@ xz.pphimalayanrt.com 9942.org 99442.com 9944wb.com +99469.com 994wan.com 9950air.com 9951.cc 995120.net 99520.love 996.com +996007.icu 9963.org 996404.xyz 9965dns.com @@ -9831,6 +9527,7 @@ xz.pphimalayanrt.com 99cha.com 99cloud.net 99corley.com +99count.com 99danji.com 99ddd.com 99dingding.com @@ -9914,9 +9611,11 @@ xz.pphimalayanrt.com 9b37f3cc81011.beer 9bb4cf93e10261.beer 9bianli.com +9c0c0433602d188a.com 9c67282f22796ac6.com 9c941a3b41021.beer 9ca4b8eca1019.beer +9cao9.com 9ccapital.com 9ce69ea6b10272.beer 9cfa10ad910291.beer @@ -9927,6 +9626,7 @@ xz.pphimalayanrt.com 9d47e2c251009.beer 9d87bc4302122ef4.com 9damao.com +9damao.net 9db.cc 9ddm.com 9de3c7ffb10291.beer @@ -9999,6 +9699,7 @@ xz.pphimalayanrt.com 9kcs.com 9kd.com 9kff.com +9kkk.xyz 9kus.com 9laidu.net 9linux.com @@ -10048,7 +9749,6 @@ xz.pphimalayanrt.com 9wad.com 9wee.com 9wee.net -9wtd.com 9wuli.com 9wwx.com 9xdb.com @@ -10065,7 +9765,6 @@ xz.pphimalayanrt.com 9ya.net 9yao.com 9yaocn.com -9yaoyao.com 9yc.com 9ye.com 9yiban.com @@ -10099,6 +9798,7 @@ a0770.com a0bi.com a0c77.com a0d73230f9d52dfb.com +a0fca7a55be096ef.com a135.net a142b5e7511011.beer a1789.com @@ -10116,6 +9816,7 @@ a335cb802c120705.com a33a8c8c81011.beer a3p4.net a40dc409e2ea86b1.com +a42c6d113874e1f3.com a44aeaeac1016.beer a45e4f5fd10272.beer a465a95641016.beer @@ -10124,6 +9825,7 @@ a4da96ae511032.beer a4s6.com a4xvv2g18l.com a5.net +a5089302099a537e.com a5380a8e41016.beer a5399.com a549543886.asia @@ -10135,9 +9837,9 @@ a5idc.net a5j.cc a5lt.com a5xiazai.com +a5y.net a61cee76f4df41b1.com a6562752811032.beer -a6api.com a6h8.com a6ksw.net a700in.ren @@ -10147,13 +9849,13 @@ a756716251017.beer a75d755806b1095d.com a7647e3f151b4a5d.com a766.com -a777998.com a789.org a7a13fde51022.beer a7c6e291d10292.beer a7d4bd3ce10281.beer a7dcb6d9011032.beer a8.com +a83c8524b88a06ae.com a87807b4811031.beer a87f34a60cf36893.com a88b9f894719c3d8.com @@ -10188,7 +9890,7 @@ aaareplicawatch.com aaawz.cc aaayu.com aaayun.com -aabb.com +aabooo.com aabqn.com aac3442de07869c0.com aacoptics.com @@ -10198,6 +9900,9 @@ aadcloud.com aads-cng.net aafanke.cc aafxw.com +aai07251mu.com +aai07260mu.com +aai07280mu.com aakss.com aaltosemi.com aamets.com @@ -10223,9 +9928,9 @@ aayun.icu ab-sm.com ab126.com ab365.com +ab839c2562b8ae05.com abaa.cc abacaipu.com -abachem.com abackup.com abaizx.com abaoge.com @@ -10244,6 +9949,8 @@ abc151.com abc188.com abc369.net abc4game.com +abc56692388.com +abc59783718.com abc7722.com abcache.com abcbank.shop @@ -10266,14 +9973,12 @@ abcpost.com.au abcs8.com abcsbank.com abctime.com -abctougu.com abcve.com abcxyzkk.xyz abcydia.com abd007.com abddn.com abdf002.com -abdqn.com abe-sz.com abe-tech.com abeacon.com @@ -10316,6 +10021,7 @@ abslw.com absoloop.com abtd.net abtnetworks.com +abtpaper.com abtt266.com abublue.com abundancen.com @@ -10332,6 +10038,7 @@ ac268.com ac3ba49731016.beer ac57.com ac6891953e265977.com +ac78416978de6213.com acabridge.net acachina.com academygkusa.com @@ -10356,7 +10063,6 @@ accessicp.com accessoft.com accesspath.com accgame.com -accio-ai.com accio.ai accio.com acclb.com @@ -10387,6 +10093,7 @@ acetace.com acetaffy.club acetar.com acewill.net +acexpress.org acfechina.org acflow.com acftu.org @@ -10404,7 +10111,6 @@ acg18s.com acg4.com acg6.com acgdb.com -acgdraw.com acggit.com acgist.com acglivefan.com @@ -10506,7 +10212,6 @@ ad7.com ad77.com ad778.com ada-post.com -adacpp.com adamahf.com adamcdn.com adamcoder.com @@ -10519,7 +10224,6 @@ adas.com adbgz.com adbiding.com adbkwai.com -adbrkwai.com adbvllc.cfd adbxb.com adcdn.com @@ -10549,16 +10253,15 @@ adfaith.com adfortest.com adfunlink.com adfuns.com +adfyt.com adg-dental.com -adglim.com adgomob.com -adgooda.com adguardprivate.com adhei.com adhimalayandi.com -adhuanxiao.com adhubbj.xyz adhudong.com +adi-whatsepp.com adianshi.com adiexpress.com adiic.com @@ -10566,6 +10269,7 @@ adinall.com adipman.net adjdds.com adjucai.com +adjuz.com adjwl.com adjyc.com adkjpx.com @@ -10603,18 +10307,17 @@ admqr.com admsger.com admsidea.com admtvs.com +admunan.com adnineplus.com adnrhy.com adnyg.com adobe-tool.com -adobeacp.com adobeae.com adobeedu.com adoebike.com adonest.com adongyu.com adoregeek.com -adosmo.com adoutu.com adparticle.com adpchina.com @@ -10666,6 +10369,7 @@ adutou.com adutp.com advanced-microsemi.com advanced-pneumatics.com +adventsoft.org advertcn.com advich.com adview.com @@ -10710,6 +10414,7 @@ adzshd.com ae-inbr.xin ae0f9d6cf11021.beer ae1234.com +ae224e62eb93c42a.com ae256.com ae3a6d6e09359c15.com ae58c58c051aacd9.com @@ -10779,6 +10484,7 @@ afdian.com afdian.net afdiancdn.com afdvr.com +afe-whatsepp.com afea4f9221023.beer afeica.com afengblog.com @@ -10819,9 +10525,7 @@ agel-tech.com agelocer.com agenge.com agenow.com -agentscope.io agentyun.com -agentzh.org aggresmart.com aghcdn.com agi360.xyz @@ -10901,6 +10605,7 @@ ahczwater.com ahdaer.com ahdahda.com ahdbsst.com +ahdci.com ahdf56.com ahdfjt.com ahdhf.com @@ -10932,7 +10637,6 @@ ahhaoze.com ahhbxh.com ahhcbiotech.com ahhdb.com -ahhfangde.com ahhkedu.com ahhnsz.net ahhome.com @@ -10969,14 +10673,12 @@ ahkemi.com ahkende.com ahkjksw.com ahkjwx.com -ahkjxww.com ahkxsoft.com ahlca.org ahlib.com ahlife.com ahljnews.com ahlqgs.com -ahlt10010.com ahltgroup.com ahluqiao.com ahlxb.com @@ -11028,11 +10730,9 @@ ahsz.tv ahszbx.com ahteacher.com ahtelit.com -ahtkg.com ahtlbyby.com ahtongyuan.com ahtrq.com -ahtxxh.com ahtxyyjt.com ahtypg.com ahubbs.com @@ -11061,6 +10761,7 @@ ahyouchengedu.com ahyouth.com ahyqx.com ahysxh.com +ahyuning.com ahyx.cc ahyx.net ahyyxh.com @@ -11069,6 +10770,7 @@ ahzcw.cc ahzs10000.com ahzssw.com ahztsh.com +ahzyw.com ai-abc.com ai-anchor.com ai-augmented.com @@ -11078,9 +10780,7 @@ ai-classes.com ai-cool.com ai-daxue.com ai-factory.com -ai-guardrail.com ai-indestry.com -ai-kaleidoscope.com ai-qingchang.com ai-rtc.com ai-start.com @@ -11163,6 +10863,7 @@ aiclicash.com aiclk.com aicloud.com aicoauto.com +aicode.cc aicoinstorge.com aiconn.com aicsemi.com @@ -11181,6 +10882,7 @@ aidaily.com aidaiz.com aidalan.com aidanji.com +aidapeid.com aidaxing.com aidaxue.com aidcgroup.net @@ -11189,6 +10891,7 @@ aideep.com aidenleong.com aidianji.net aidiao.com +aidien.fun aidigong.com aidimedia.com aidjyun.com @@ -11205,7 +10908,6 @@ aidpaper.com aidream.website aidrive.com aidugame.com -aidunwaf.com aiduoka.com aidusk.com aidusk.org @@ -11246,7 +10948,6 @@ aifengjie.com aifengkeji.com aifenlei.com aifooler.com -aifortmix.com aifoxtech.com aifu10.com aifu360.com @@ -11264,7 +10965,6 @@ aigccdn.com aigclsp.com aigcxm.com aige010.com -aigefurniture.com aigei.com aigewc.com aigexing.com @@ -11283,6 +10983,7 @@ aihaisi.com aihala.com aihanfu.com aihanfu.net +aihangtian.com aihao.org aihecong.com aihehuo.com @@ -11298,7 +10999,6 @@ aihuajia.com aihuaju.com aihuau.com aihuazhou.com -aihubo.com aihubs.net aihuhua.com aihuishou.com @@ -11335,6 +11035,7 @@ aiketour.com aikf.com aikonchem.com aikucun.com +ail-online.moe ailaba.com ailabs.xin ailai6.com @@ -11371,7 +11072,6 @@ aimeideni.com aimeifen.vip aimeike.tv aimeilid.com -aimeizhi.net aimengang.com aimergroup.com aimeter.com @@ -11388,7 +11088,9 @@ aimoeart.com aimoneshoes.com aimoon.com aimsen.com +aimu-app.com aimx333.com +ainas.cc ainb01010zh.com ainb12251zh.com ainiankj.com @@ -11399,6 +11101,7 @@ ainiu.net ainixing.com ainm.cc ainol.com +ainuoedu.com ainyi.com aioclinic.com aioexpress.com @@ -11470,7 +11173,6 @@ airenche.com airepay.net airfex.net airguilin.com -airizu.com airj.website airjd.com airkunming.com @@ -11510,6 +11212,7 @@ aishangba.org aishangyangyu.com aisharenet.com aishengji.com +aishenhua.com aishenqi.net aishuge.cc aishuge.la @@ -11573,6 +11276,7 @@ aiuxian.com aiuxstudio.com aiv5.cc aivaylaco.com +aiveola.com aivivo.com aiviy.com aiviysoft.com @@ -11585,6 +11289,7 @@ aiwebsec.com aiwei365.net aiweibang.com aiweibk.com +aiweline.com aiwenyi.com aiwisland.com aiworkspace.com @@ -11612,7 +11317,6 @@ aixinwechat.com aixinwu.org aixiu.net aixiuyingyu.com -aixq.cc aixq.com aixs.info aixs.org @@ -11626,7 +11330,6 @@ aixuetang.com aixuexi.com aixyy.com aixzu.com -aixzzs.com aiya.live aiya8.com aiyamax.com @@ -11635,7 +11338,6 @@ aiyanqing.com aiyaopai.com aiyecdn.com aiyewjc.com -aiyfhdns.com aiyichuan.com aiyidu.com aiyinghun.com @@ -11649,7 +11351,6 @@ aiykj.com aiyo99.com aiyong.work aiyongaiwan.com -aiyoubucuo.com aiyoumi.com aiyouxi.com aiyouzj.com @@ -11705,12 +11406,10 @@ ak-medical.net ak-v.tripcdn.com ak.cc ak0.tw -ak005.com ak1ak1.com ak47ids.com aka700.com aka700.net -aka815.net akadns88.net akadns99.net akaifa.com @@ -11740,6 +11439,7 @@ aki-game2.com aki-game2.net akile.net akkogear.com +aklyw.com akng.net akniu.com akoeva.com @@ -11796,11 +11496,13 @@ alexhaohao.com alexinea.com alexpad.fun alexyan.cc +alfachemar.com alfafull.com alfingfuda.com algkfd.com algogear.com algorithmart.com +alhug.com alhywj.com ali-api-test.net ali-cdn.com @@ -11866,7 +11568,6 @@ alidayu.com aliddmall.com alidns.com alidns.net -alidnsv122.com alidnsv4.com alidnsv5.com aliedge.com @@ -11915,6 +11616,7 @@ alipay.com alipay.hk alipay.net alipayauto.com +alipaycs.com alipaydesign.com alipaydev.com alipaydns.com @@ -11996,7 +11698,6 @@ aliyunddos0024.com aliyunddos0025.com aliyunddos0026.com aliyunddos0027.com -aliyunddos0028.com aliyunddos0029.com aliyunddos0030.com aliyunddos1001.com @@ -12147,6 +11848,7 @@ allinpaygx.com allinpayhb.com allinpaysz.com allinso.com +alllget.com alllook.tv allmaga.net allmed-china.com @@ -12175,7 +11877,6 @@ alltobid.com alltosun.com alltuu.cc alltuu.com -alltuu.site allvalue.com allwellsports.com allweyes.com @@ -12193,6 +11894,7 @@ alnan.com alo7.com aloha-ukulele.com alonemonkey.com +along96.com alongsky.com alookweb.com alpha-browser.com @@ -12262,6 +11964,7 @@ ameisx.com amemv.com amemv.net ameow.xyz +americachineselife.com amethystum.com amexpressnetwork.com ameya360.com @@ -12278,6 +11981,7 @@ amijiaoyu.com amindbox.com aminglinux.com amishii.com +amishow.com amivian.com amiyabot.com amo-solar.com @@ -12304,6 +12008,7 @@ amssro.net amswater.com amtbbs.org amtf18.com +amtjt.com amtron-ic.com amuletj.com amuletor.com @@ -12330,7 +12035,6 @@ an2.net an68.com analog.com analogfoundries.com -analyscloud1.com analysysdata.com anan123.vip anan666.com @@ -12346,6 +12050,8 @@ anbaool.com anbokeji.net ancbk.com ancda.com +ancdwqob.asia +ancesours.com anchnet.com ancii.com ancun.com @@ -12382,6 +12088,7 @@ andygcj.com andyx.net ane56.com aneasystone.com +anei.tv anestcang.com anetuo.com anf-z.com @@ -12396,6 +12103,7 @@ angeeks.com angel-game.net angel-hospital.com angel-medical.net +angelakillian.com angelarabbit.com angelcrunch.com angelhome.org @@ -12449,6 +12157,7 @@ anicoga.com anictdns.click anictdns.store anijue.com +anileyehospital.org animalchina.com animate.art animationcritics.com @@ -12578,7 +12287,6 @@ anshuntech.ltd ansiding.com ansimeter.com ansky.com -ansroot.com ansteelgroup.com ansucai.com ansuner.com @@ -12641,7 +12349,6 @@ antutu.net antvr.com antwork.link antyikangih.com -anvnjmc.com anw.red anweilan.com anweishi.com @@ -12672,6 +12379,7 @@ anxiu.com anxiw.com anxjm.com anxunli.com +anxunshihui.com any8.com anyan.com anyang100.com @@ -12693,6 +12401,7 @@ anyihua.com anyimai.com anyizn.com anyka.com +anyknew.com anyline.org anymcu.com anymetre.com @@ -12704,7 +12413,9 @@ anyrtc.io anyrui.win anysafer.com anyscdn.com +anyskygame.com anysql.net +anystandards.com anytesting.com anytocopy.com anyun100.com @@ -12766,6 +12477,7 @@ aofeida.com aofenghuanjing.com aofenglu.com aofs.vip +aogocorp.com aograph.com aoguan.com aoguansteel.com @@ -12786,6 +12498,7 @@ aolai.com aolaigo.com aolijsj.com aolinjy.com +aolinpharma.com aoliongame.com aolvyou.com aolylcd.com @@ -12831,6 +12544,7 @@ aowenmarketing.com aoxiang100.com aoxingrelang.com aoxintong.com +aoy-power.com aoya-hk.com aoyanchang.com aoyangzg.com @@ -12839,6 +12553,7 @@ aoye.com aoyige.com aoyiluoad.com aoyor.com +aoyotech.com aoyou.cc aoyou.com aoyou365.com @@ -12849,8 +12564,8 @@ aoyunque.com aozare-acemak.com aozare-avernai.com aozhanls.com +aozhougoufang.com ap-china.com -ap-leasing.com ap1983.com ap88.com ap8888.com @@ -12920,6 +12635,7 @@ apitutu.com apiunion.com apiview.com apizl.com +apizza.cc apizza.net apjingsi.com apk3.com @@ -13016,6 +12732,7 @@ apple17.club apple4.us apple523.club apple886.com +appleadstech.com applebl.com applejp.cloud applemei.com @@ -13036,7 +12753,6 @@ appol.com appollochina.com appotronics.com appqv.com -appracle.com approvebook.com apps121.com appscan.io @@ -13063,6 +12779,7 @@ appwuhan.com appwuhan.net appxzz.com appyao.com +appying.com appykt.com appyouni.com appzhonghua.com @@ -13073,6 +12790,7 @@ apsfon.com apsgo.com apsoto.com apspharm.com +aptchina.com aptchip.com aptdn.net aptenon.com @@ -13108,7 +12826,6 @@ aqsiqauto.com aqtd.com aqtowngas.com aqtwpc.com -aqtwwx.net aqtwwxemail.com aqtxt.net aqua-worth.com @@ -13142,7 +12859,6 @@ aray1981.com arayzou.com arbays.com arc-uds.com -arcadesos.com arcas-da.com arcdmi.com archaeuscapital.com @@ -13156,6 +12872,7 @@ archgrid.xyz archi-motive.com archiant.com archina.com +archiname.com archio.pro archiposition.com architbang.com @@ -13180,8 +12897,10 @@ arenabreakoutcn.com arerberte.com areweloongyet.com arextecn.com +arglasses.work argylehotels.com arhoo.com +ariacraft.net aridge.com arielcosmetic.com arin-elec.com @@ -13191,11 +12910,10 @@ ark301.com arkfeng.xyz arkfwq.com arkid.cc -arknightsframeassistant.com +arkntools.app arkoo.com arkrdigital.com arkread.com -arkrog.com arks.red arksz.com arliki.com @@ -13227,7 +12945,6 @@ arrowceramic.com arrowos.net arrowwardrobe.com ars-china.com -arshow.com arswp.com art-ba-ba.com art-child.com @@ -13304,6 +13021,7 @@ asa-asia.com asasd.online asatiles.com asattitude.com +asbazainville.org asc-events.org asc-wines.com ascend-bio.com @@ -13318,10 +13036,12 @@ asczwa.com asczxcefsv.com asd.red asd868.com +asdbfjoiug.com asdeshan.com asdf-bj.net asdf010.com asdlkjf.com +asdx.io asean-china-center.org aseann.com aseanparts.com @@ -13330,11 +13050,13 @@ asemi99.net asen-pharm.com aseoc.com aseoe.com +asf4asgfrxc.com asgezhi.com ashan.org ashidc.com ashining.com ashoucang.com +ashqgpxy.com ashsilent.com ashvsash.net asi-midea.com @@ -13378,6 +13100,7 @@ asimi8.com asinking.com asit.cc asjnu.com +ask.amd.com askci.com askdd.org askdiandian.com @@ -13398,6 +13121,7 @@ asm64.com asmasm.com asmlc.com asmr.gay +asmr.red asnlab.com asnlab.org asnowsz.com @@ -13428,6 +13152,7 @@ asr-cn.com asrmicro.com assassinscreedcodenamejade.com assemblydragon.com +assets-global.viveport.com assrt.net assyrb.com astbbs.com @@ -13437,6 +13162,7 @@ astfc.com asthis.net astipaint.com astra-biotech.com +astraintel.com astral-vector.com astroai-in.com astroaio.com @@ -13446,6 +13172,7 @@ astropulsion.com astrostanleystudio.com asty664.com asujp.com +asurada.zone asussmart.com asusw.net asvm.net @@ -13467,7 +13194,6 @@ ata-edu.com ata-test.net atacchina.com atanyu.com -ataokeji.com atatech.org atats.shop atb.so @@ -13532,6 +13258,7 @@ attomotion.com attop.com attri.mobi attribuly.com +atukjhesk.com atuoyi.com atwbz.com atyomi.com @@ -13569,11 +13296,11 @@ auditcn.com audlabs.com audtools.com aufewb.com -aufit-air.com augix.me augsky.com augurit.com augustcn.com +auiou.com aukcl.win aulacn.com auldey.com @@ -13589,6 +13316,7 @@ aura-el.com auroapi.com aurogon.com auromcs.com +aurora-jy.com aurora-oa.com aurorauo.com aus.cc @@ -13623,7 +13351,6 @@ auto-mooc.com auto-purify.com auto-testing.net auto-union.net -auto-validation.com auto-wo.com auto1768.com auto18.com @@ -13671,7 +13398,6 @@ autopartsdk.com autopeitao.com autophagy.net autoqingdao.com -autosemo.com autosey.com autoshafa.com autoshanghai.org @@ -13686,17 +13412,16 @@ autowise.ai autozi.com autumndesires.com auwincmc.com -aux-global.com aux-home.com -auxair.com -auxcss.com auxgroup.com -auxshop.com -auxsmart.com -auxsol.com -auxsolcloud.com -auxtelecom.com -auxyl.com +auy07161km.com +auy07170km.com +auy07180km.com +auy07190km.com +auy07200km.com +auy07201km.com +auy07211km.com +auy07230km.com auyou.com av-ic.com av199.com @@ -13989,8 +13714,6 @@ ayrc.net ayrmt.com ayrq.com aysbxxh.com -ayseyy.com -ayshl.com ayshq.com aysjyjjh.com ayump.com @@ -13998,8 +13721,6 @@ ayunlian.com ayuren.com ayuyun.com ayw.ink -ayx.com -ayx.net ayxz.com ayzzxx.com az009.com @@ -14025,11 +13746,9 @@ azchcdnq.com azchcdnr.com azchcdns.com azf010.com -azhai.de azhimalayanvh.com azhituo.com azhubaby.com -azjjlb.com azmcode.com azonete.com azooo.com @@ -14049,6 +13768,7 @@ azuremigratetest.download.prss.microsoft.com azurestackhub.download.prss.microsoft.com azurestackhubuat.download.prss.microsoft.com azuretouch.net +azurew.com azureyun.com azxdiy.com azy288.com @@ -14065,12 +13785,14 @@ b-raymedia.com b.biz b.c2r.ts.cdn.office.net b01.net +b02f0d7f3745ba7c.com b041e427810281.beer b07cceaf011012.beer b08.com b082392de1024.beer b13bc577fd.run b18e55f8a1010.beer +b19a352d2336941a.com b1bj.com b1n.net b214bd8861009.beer @@ -14080,6 +13802,7 @@ b23.tv b230756fa1114.beer b230ed9d61010.beer b262a49751023.beer +b27ceaa1053.skin b287f400810291.beer b29f45a5b10271.beer b29gj.com @@ -14114,12 +13837,15 @@ b3log.org b3logfile.com b40e80b301022.beer b44fd0fd51014.beer +b4ca25f717d58cac.com +b5.com b510qh.shop b5232b4da6e285b2.com b53358ed31009.beer b555b.com b5669d7a0a.vip b5a3f14042830b91.com +b5b6.com b5b6308ab4859018.com b5csgo.plus b5esports.me @@ -14140,9 +13866,10 @@ b75c5da009ac3871.com b76ad11181024.beer b7e314d4810241.beer b7eeeb26810241.beer -b7f3192.com +b812824ed173a8c0.com b83d11444463a621.com b883481331023.beer +b8b4ix7bj.com b8e4d120a10271.beer b8kk.com b8yx.com @@ -14154,7 +13881,7 @@ b9a3e87f01023.beer b9ad.com b9bdc7d62dfb0e5e.com b9noqayb1s.work -ba-hospital.com +ba08e2f96f675d22.com ba1400.com ba20db47708bc51f.com ba7jcm.live @@ -14196,6 +13923,7 @@ babyqiming.com babytree.com babytreeimg.com bacaizi.com +bacaola.com bacaoo.com bacaosh.com bacic5i5j.com @@ -14203,6 +13931,7 @@ backaudio.com backdata.net backmany.com backupdesktopcloud.com +bacninhlocalguide.com bacocis.com bacts.com bacyfzjt.com @@ -14231,6 +13960,7 @@ bagsnet.com bagstory.net bagtree.com baguilingyun.com +bagxs.com bahealpharma.com bahecloud.com bahens.com @@ -14245,7 +13975,7 @@ baibo8.com baibomedia.com baibu.com baic-group.com -baicaf.com +baicai.asia baicai.com baicaijie09.com baicaio.com @@ -14337,9 +14067,11 @@ baiduyundns.com baiduyundns.net baiduyunsousou.com baiduyunwaf.com +baiduzjn.com baieryk.com baifae.com baifang.in +baifangdianqi.com baifangzh.com baifeiyue.com baifendian.com @@ -14378,7 +14110,6 @@ baijia.com baijiacloud.com baijiahulian.com baijiantest.com -baijiao.org baijiasheping.com baijiaxingwang.com baijiayun.com @@ -14412,7 +14143,6 @@ baikezh.com bailb.com bailepin.com bailiaijia.com -bailiana.com bailiangroup.com bailiann.com bailiban.com @@ -14497,7 +14227,6 @@ baisihan.com baisiterzh.com baisiweiting.com baisu.cc -baisui100.com baisuifc.shop baisuizhixiang.com baitahe.net @@ -14505,6 +14234,7 @@ baitaihuge.com baitanheichang.com baitdu.com baite666.com +baithu.com baitianinfo.com baitiao.com baitomould.com @@ -14526,6 +14256,7 @@ baiwutong.com baiwv.com baixiangfood.com baixiaosheng.net +baixiaoxs.com baixihuang.com baixing.com baixing.net @@ -14561,12 +14292,10 @@ baizengtech.com baizhan.net baizhanke.com baizhanlive.com -baizhi.cloud baizhouniao.com baizhu.cc baizlink.com bajasaechina.com -bajie.la bajie1.com bajiexinxi.net bajintech.com @@ -14608,6 +14337,7 @@ bamaying.com bamboofactorychina.com bambooolab.com bambu-lab.com +bambulab.com bamengame.com bamensq.com bamenzhushou.com @@ -14621,6 +14351,7 @@ bananaumbrella.com bananaunder.com banban.work banbang.com +banbanjia8.com banbao22.com banbijiang.com bancai.com @@ -14740,6 +14471,7 @@ bannei.com banner668.com.hk banniuyun.com banqumusic.com +bansha.com banshier.com bantangapp.com bantouyan.com @@ -14815,6 +14547,7 @@ baogaoku.com baogaoting.com baoge.net baoguangtai.com +baoguogroup.com baohanghr.com baohebao.com baohongbao.net @@ -14902,6 +14635,7 @@ baoxiaobar.com baoxiaohe.com baoxiaoke.com baoxinchewang.com +baoxingmuye.com baoxinleasing.com baoxins.com baoxiu.com @@ -14932,6 +14666,7 @@ baozhilin.com baozhuang.biz baozhuangren.com baozi.fun +baozi178.com baozijishu.com baozipu.com baozou.com @@ -14943,13 +14678,13 @@ baozy.com baping.com baqi28.com baqiu.com +barhuta.com barjiang.com barlosi.com barman.vip baron-bj.com baronyhotels.com barretlee.com -bartender-cn.com bartender.cc bartymedical.com basechem.org @@ -14959,6 +14694,7 @@ baseopendev.com basequan.com basestonedata.com bashan.com +bashenghuo.com bashuhuapai.com bashuku.com basiccat.org @@ -14983,7 +14719,6 @@ battle-fsd.com battlecare.net battleofballs.com batupian.net -baudashiner.com baufortune.com bauschlombchina.com bawagon.com @@ -15028,6 +14763,7 @@ bb-hy.com bb-pco.com bb06.com bb361a58c1015.beer +bb39977653.com bb3a14ca57af4d81.com bb52e27c75560d3f.com bb730b04b6cc8c57.com @@ -15195,7 +14931,6 @@ bcvbw.com bcwangluo.net bcxgame.com bcxgps.com -bcxuetang.net bcxww.com bcy.net bcyimg.com @@ -15212,7 +14947,6 @@ bd689.com bd7kzs.site bdactivity.com bdaenviro.com -bdagh.com bdajob.com bdall.com bdapark.com @@ -15220,9 +14954,7 @@ bdatu.com bdbae.com bdc-rays.com bdcb.cc -bdcglb.com bdcgslb.com -bdcgtm.com bdcgz.com bdchangtujs.com bdchina.com @@ -15234,12 +14966,11 @@ bddlm.com bde5fc098b5291bf.com bdebid.com bdeceimg.com -bdeglb.com bdegnine.com -bdegslb.com -bdegtm.com bdf2.com bdfczx.com +bdfyy999.com +bdfzkyy.com bdg-brain.com bdgamelive.com bdgp.cc @@ -15282,6 +15013,7 @@ bdsimg.com bdsj.net bdspacetime.com bdstar.com +bdstatic.cc bdstatic.com bdsytime.com bdszh.vip @@ -15293,7 +15025,9 @@ bduapp.com bdurl.net bdvending.com bdwater.com +bdwhyscjh.com bdwkxz.com +bdwm.net bdwork.com bdxc.com bdxdgs.com @@ -15320,6 +15054,7 @@ be-xx.com be1775.com be1dbb20578c1b79.com be20e436e111e1f7.com +be30d71aea370488.com be7076f2b2ff2953.com be79d8d36f962bd6.com be84433f5ce02a66.com @@ -15347,7 +15082,6 @@ beautifulzzzz.com beaverbio.com beb688d9cad7d208.com bebhmongb.com -bebox.net bechangedt.com becker-china.com beckwai.com @@ -15358,7 +15092,6 @@ becominggroup.com becukwai.com beduu.com bee-core.com -bee-link.com bee-net.com bee-station.com bee3d.com @@ -15367,7 +15100,6 @@ beecook.com beedancing.com beeeeego.com beeflower-cn.com -beefungames.com beegoedu.com beejoygames.com beelink.com @@ -15394,6 +15126,7 @@ bei1688.com beiamp.net beianw.com beibaobang.com +beibaozq.com beibei.com beibenkc.com beicaiyuan.com @@ -15425,6 +15158,7 @@ beifeng.com beifuni.com beigangyouxuan.com beigedi.com +beigonggroup.com beiguorc.com beihai365.com beihai97.com @@ -15455,6 +15189,7 @@ beijing-office.com beijing-time.org beijing-tokyo.com beijing101.com +beijing120.com beijing518.com beijingaierfei.com beijingbang.com @@ -15476,7 +15211,6 @@ beijingnorthstar.com beijingrc.com beijingrc.net beijingtaixie.com -beijingtianqi114.com beijingtrucks.com beijingwatch.com beijingxiantour.com @@ -15487,12 +15221,13 @@ beijingzc.com beijingzoo.com beijinxuetang.com beijiu.ink -beijqunan.com beijzc.com beikeba.com beikeiot.com beikongyun.com +beilayl.com beileike.com +beileimaoedu.com beiletoys.com beilianjd.com beilile.com @@ -15503,11 +15238,10 @@ beimai.com beimeihongfeng.com beimeizhijia.com beimeizhiying.com -beimokj.com beinglab.com beingmate.com beipenggroup.com -beiqian.fun +beipy.com beiqujy.com beirangroup.com beiren-tech.com @@ -15524,6 +15258,7 @@ beisenyl.com beismei.com beitaguoguo.com beitaichufang.com +beitao8.com beitown.com beitre.com beiwaiclass.com @@ -15552,7 +15287,6 @@ beliefbiomed.com beliefy.com belimked.com belle8.com -belleintl.com belletrip.com bellinlaser.com belllan.com @@ -15575,11 +15309,11 @@ bendi5.com bendibao.com bendijin.net bendis.cc +bendiso.com bendiw.cc bendizhidao.com benduo.net benewake.com -benfeijd.com benfuip.com bengbeng.com bengbufan.com @@ -15591,6 +15325,7 @@ bengou.com bengrong.com bengtie.com bengzhanc.com +benhs.com beniao.com benjamin.fun benkejieye.com @@ -15635,7 +15370,6 @@ bequw.com bequwx.org berchina.com berens-china.com -beretmall.com berfen.com bergerda.com berlinchan.com @@ -15648,7 +15382,6 @@ bersilion.com bertadata.com berui.com bes.ren -besavior.com besbranding.com bescar.com beschannels.com @@ -15682,7 +15415,6 @@ bestcem.com bestchoiceco.com bestcloudcdn.com bestclouddns.com -bestcmtech.com bestcood.com bestcovered.com bestcrossborder.com @@ -15783,6 +15515,7 @@ bewellbio.com bewg.net bewgnn.com beyebe.com +beyond-perfection.com beyondbit.com beyondcompare.cc beyondcomparepro.com @@ -15819,6 +15552,7 @@ bfqh.com bfqifu.com bfscoc.com bfsea.xyz +bfsmy.com bfssj.com bfsu-artery.net bfsutw.com @@ -15864,6 +15598,7 @@ bgrimm.com bgrwgglz.com bgs123.com bgsdk.net +bgsdyz.com bgsyb.com bgteach.com bgtwater.com @@ -15877,9 +15612,10 @@ bgxcl.com bgxu.com bgyfhh.com bgyfhyx.com -bgyfw.com bgyhotel.com bgyhotels.com +bgypc.com +bgypsc.com bgyshop.com bgyvfs.net bgzchina.com @@ -15888,7 +15624,6 @@ bh-lay.com bh-mangrove.com bh-med.com bh-xhhd.com -bh.sb bh1t.com bh3.com bh5.com @@ -15915,15 +15650,12 @@ bhgjjy.com bhgmarketplace.com bhgroups.com bhgsb.com -bhgslb.com -bhgtm.com bhhfsc.com bhhospital.com bhhthl.com bhidi.com bhiv.pro bhjcsc.com -bhjh168.com bhjinghao.com bhjjj360.com bhjuxian.com @@ -15946,6 +15678,7 @@ bhsanfan.com bhsbdcdjzx.com bhsgnk.com bhshtksp.com +bhshunhui.com bhshyy.com bhsr.com bhsun.com @@ -16019,7 +15752,7 @@ biaodiandichan.com biaodianfu.com biaofaw.com biaoge.com -biaogedaquan.com +biaoge.me biaohs.com biaoju01.com biaomi.com @@ -16090,10 +15823,12 @@ bifengxia.com bifiv.com big-bit.com big-shanghai.com +big5network.com bigaaa.net bigaka.com bigan.net bigbaicai.com +bigballbiz.club bigbangux.com bigbenmeng.com bigbigai.com @@ -16101,9 +15836,9 @@ bigbigsun.com bigbigwon.com bigbigwork.com bigbrosci.com +bigbrx.com bigcakegame.com bigcat.com -bigcoder.xyz bigda.com bigdata-expo.org bigdata.ren @@ -16117,7 +15852,6 @@ bigecko.com bigehudong.com bigemao.com bigemap.com -bigemap.net bigerdata.com bigerwall.com bigeshuju.com @@ -16127,6 +15861,7 @@ biggaming.online biggerlens.com biggeryun.com bigherdsman.com +bigjpg.com bigniu.com bignox.com bigo.sg @@ -16159,7 +15894,6 @@ bihu.work bihuatuku.net bihubao.com bihuoji.com -biiii.com biikan.com biioii.com biji.com @@ -16196,7 +15930,6 @@ bilibiligame.net bilibilihelper.com bilibilipay.com bilibiliq.com -bilibilitoy.com bilicdn1.com bilicdn2.com bilicdn3.com @@ -16232,7 +15965,6 @@ billu.cc billwang.net bilnn.com bim-times.com -bim.fashion bimant.com bimawen.com bimface.com @@ -16337,6 +16069,7 @@ biogeeker.com biogo.net biogot.com bioguoke.com +biohf.com biohong.com biohuaxing.com biohyalux.com @@ -16471,6 +16204,7 @@ bitdefender-cn.com biteabc.com bitech-automotive-wuhu.com bitecoin.com +biteedu.com bitell.com bitenn.com bitgo.cc @@ -16485,6 +16219,7 @@ bitky.cc bitlib.cc bitmain.vip bitmingw.com +bitmoe.com bitol.net bitongtech.com bitonloop.com @@ -16492,6 +16227,7 @@ bitosscdn.com bitqiu.com bitscn.com bitsde.com +bitse.com bitvh.com bitzsoft.com biubiu.tv @@ -16553,6 +16289,7 @@ bizhimiao.com bizhiquan.com bizhiwang.com bizhixia.com +bizhizj.com bizhizu.com bizmoto.com biznewscn.com @@ -16568,6 +16305,7 @@ bj-brother.com bj-brsf.com bj-byjz.com bj-cronda.com +bj-dahon.com bj-dsmzyy.com bj-fm.com bj-fxh.com @@ -16590,6 +16328,7 @@ bj-tygy.com bj-win.com bj-wjh.com bj-yt.com +bj-zkhb.com bj003.com bj0yx.com bj1.api.bing.com @@ -16607,6 +16346,7 @@ bj51.org bj520.com bj597.com bj5i5j.com +bj5iodzgyi.com bj7z.com bj80.com bj918.com @@ -16684,7 +16424,6 @@ bjdfxj.com bjdiaoyu.com bjdjc.com bjdllti.com -bjdmc.net bjdongxin.com bjdp2p.com bjdsppa.com @@ -16698,6 +16437,7 @@ bjdyyc.com bjeasycom.com bjebc.com bjeesa.org +bjef.com bjei.com bjent.org bjepea.com @@ -16789,6 +16529,7 @@ bjitic.com bjiwex.com bjjbbayy.com bjjbls.com +bjjchf.com bjjdwx.com bjjfsd.com bjjhhn.com @@ -16876,6 +16617,7 @@ bjmzdx.org bjmzw.com bjn2ms.net bjnai.net +bjnaxl.com bjnja.com bjnkzx.com bjnsr.com @@ -16902,6 +16644,7 @@ bjqtforthbase.com bjqtsecbase.com bjqtthirdbase.com bjqtti.com +bjqyjjlb.com bjqykc.com bjqzhd.com bjraee.com @@ -16940,7 +16683,6 @@ bjshdjy.com bjsheng.com bjshgzzxh.com bjshowinfilm.com -bjsht.com bjsiasun.com bjsinglewindow.com bjsj5.com @@ -16998,6 +16740,7 @@ bjtth.org bjttsf.com bjtvnews.com bjtysj.com +bjtyzh.org bjtzeduyun.com bjtzfy.com bjtzzg.com @@ -17016,7 +16759,6 @@ bjwfz.com bjwhds.com bjwhmedia.com bjwig.com -bjwkc.xyz bjwkhotel.com bjwkzl.com bjwpjs.com @@ -17041,6 +16783,7 @@ bjxtjmsb.com bjxtkj.com bjxueche.net bjxwcq.com +bjxwx.com bjxx.vip bjxx8.com bjxxw.com @@ -17056,6 +16799,7 @@ bjyczb.com bjydzy.com bjyestar.com bjyhjt.net +bjyhwy.com bjyingge.com bjyingyun.com bjyirui.com @@ -17124,6 +16868,7 @@ bjzzschool.com bk-cdn.com bk-cdn01.com bk3r.com +bk41.net bk5u.com bkaivl2daed.com bkapigw.com @@ -17133,7 +16878,6 @@ bkbyxa.com bkcloud.cc bkclouds.cc bkcode.net -bkd898.com bkdou.com bkeconomy.com bkill.com @@ -17156,8 +16900,6 @@ bktencent.com bktsj.com bkvps.com bkweek.com -bkwsq.com -bkzhibo.com bkzzy.com bl.com bl0757.com @@ -17206,7 +16948,6 @@ bling.link blingabc.com blinghour.com blingoffice.com -blipsandchitz.me blissmall.net blizzardcn.com blju.com @@ -17220,6 +16961,7 @@ blockchainlabs.org blockmeta.com blockob.com blocrepresents.com +blog.htc.com blog.htcvive.com blog.vive.com blogcdn-dns.net @@ -17285,6 +17027,7 @@ bluedarti.com bluedgames.com bluedhealth.com bluedimg.com +bluedon.com bluedoorindex.com bluedotcc.com bluefite.com @@ -17376,12 +17119,12 @@ bmobapp.com bmobcloud.com bmobpay.com bmoook.com +bmosecuritylogin.com bmp.ovh bmpj.net bmrtech.com bmrtjt.com bms16.com -bms28.xyz bmser.com bmshow.com bmtrip.com @@ -17389,6 +17132,7 @@ bmw8033.com bmwallpaper.com bmwchina.cloud bmwnc.com +bmxinfang.com bmzxw.com bn21.com bnacg.com @@ -17444,6 +17188,7 @@ bobo2008.com bobobird.com bobohome.store bobopic.com +boboyq.com bobswatchstore.com bobtranslate.com bocai.life @@ -17507,7 +17252,6 @@ bohaoclub.com bohe.com bohejiasuqi.com bohewangluo.com -bohrium.com bohu.co bohua.com bohuanchina.com @@ -17522,6 +17266,7 @@ boiots.com bojianger.com bojiaojituan.com bojicdmo.com +bojie.bid bojolight.com bojoy.net bojun-import.com @@ -17549,6 +17294,7 @@ bolanjr.com boldfrontierdesign.com boldseas.com bole-china.com +bole.com bole.name bole766.com bolead.com @@ -17570,8 +17316,10 @@ bolongxm.com bolq.com boltp.com boluomee.com +boluomeet.com boluomi01.com boluoyun.com +boluoyunyu.com boluozaixian.com bom.ai bom2buy.com @@ -17598,6 +17346,7 @@ bongv.com bongwell.com bonjour.bio bonkee.net +bonkgb.com bonree.com boobooke.com boodo.com @@ -17615,7 +17364,6 @@ bookedu.com bookersea.com bookfedex.com bookfeel.com -bookgew.com booking001.com bookingtee.com booknest.net @@ -17736,14 +17484,12 @@ botongr.com botorange.com botsfy.com botslab.com -botsmart.net bottlekj.com bouffalolab.com bountech.com bountyteam.com boway.com boweifeng.com -bowenkj.com bowerp.com bowok.com bowu66.com @@ -17751,6 +17497,7 @@ bowuzhi.fm box-anchor.com box3.fun boxdouyin.com +boxiaole.com boxim.online boxisign.com boxmoe.com @@ -17775,6 +17522,7 @@ boydwang.com boyi.co boyikang.com boyingsj.com +boyishu.me boylondonchina.com boyoucy.com boyouquan.com @@ -17795,12 +17543,11 @@ boyuonline.com bozhihua.com bozhong.com bozifs.com +bp1w.com bpaykwai.com bpec.com bpgjuice.net -bpgslbcn.com bpi-shop.com -bpigagtm.net bpmlt.com bpmuseum.com bpqwxsh.com @@ -17810,11 +17557,14 @@ bpuvuun0xg.com bpxxfw.com bpxxvo.com bq04.com +bqb.xyz bqbh.org bqfy.com +bqg8.cc bqg99.cc bqgwap.com bqgxsw.com +bqjeep212.com bqlcev.com bqpoint.com bqq8.com @@ -17923,7 +17673,6 @@ bs2005.com bsagit.com bsbgjj.com bsbkjt.com -bsbsb.xyz bsbydd.com bscabank.com bsccdn.com @@ -17971,7 +17720,7 @@ bskrt.com bskuav.com bsmatrix.com bsmjdjzx.com -bsncdn.ai +bsmy.cc bsnljt.com bsnniubi.com bspapp.com @@ -17982,7 +17731,6 @@ bsrmyy.com bsrse.com bssfy.com bssgnkyy.com -bsstar.net bst-lab.com bstatics.com bstbattery.com @@ -18036,6 +17784,7 @@ btdos.com btdy.com btechina.com btgame.com +btgcjs.com btghotels.com btgljt.com btgtravel.com @@ -18065,6 +17814,7 @@ btpig.com btplay.net btpxbf.com btrbdf.com +btropdi.xyz btsemi.com btshidai.com btspreads.com @@ -18075,10 +17825,10 @@ bttiantang.com btttg.com bttzy.com btv.org -btv2011.com btvcloud.com btwater.com btwmw.net +btwoa.com btwob.net btxintong.com btydjxc.com @@ -18090,6 +17840,7 @@ btzbjt.com btzgamepkg.com btzhcc.com btzthb.com +btzyc.com bubaigei.com bubalusplus.com bubbb.com @@ -18155,13 +17906,13 @@ bukesiyi8.com bukeyi.net bulaisi.com bulaoge.net +bulapingc.com bulbsquare.com bulejie.com bullcome.com bullmachinery.com bullvet.net buluanmai.com -buluken.com bumenkeji.com bumiu.com bundor.com @@ -18200,10 +17951,10 @@ butterapis.com button-nt.com buxia.net buxian8.com +buxiuga.com buy-bar.com buy-copi888.com buy0596.com -buyang.com buyanshufa.com buyaocha.com buycoor.com @@ -18225,12 +17976,9 @@ buzao.net buzhi.com buzhibushi.com bva68.com +bvcxd.com bvfcdn.com bvfcdn2.com -bvfcdn3.com -bvglb.com -bvgslb.com -bvgtm.com bvgv.com bvmc.cc bvseo.com @@ -18248,10 +17996,10 @@ bwcj.com bwcjxt.com bwda.net bwell-tec.com -bwespv.com bweyi.com bwfapiao.com bwfhmall.com +bwgqwea.com bwgrt.com bwhero.com bwhgsb.com @@ -18306,7 +18054,6 @@ bxwljt.com bxwx.cc bxwx.io bxwx.tv -bxwx7.com bxxhtsw.com bxxy.com bxyuer.com @@ -18322,6 +18069,7 @@ byai.com bybieyang.com bybily.com byboai.com +bybon.com bybutter.com byc168.com byclean.net @@ -18342,7 +18090,6 @@ byering.com byf.com byfen.com byfen.net -byfscl.xyz byfunds.com bygamesdk.com bygpu.com @@ -18449,7 +18196,6 @@ byteeffecttos.com bytefae.com bytefast.net bytefcdn.com -bytefcdnrd-tob.com bytefcdnrd.com bytegecko.com bytegeckoext.com @@ -18458,7 +18204,6 @@ bytegle.tech bytegoofy.com bytegrowth.com bytegslb.com -bytehiservice.com bytehwm.com byteics.com byteics.net @@ -18479,12 +18224,8 @@ byteoc.com byteorg.com byteorge.com byteox.com -byteplus-api-test.com -bytepluses-test.com -bytepluspcs-test.com bytepoker.fun byteq8u.net -bytertcmedia.com bytescm.com bytesfield.com bytesim.com @@ -18577,6 +18318,7 @@ bzszxyy.com bzszyy.com bzt120.com bztdxxl.com +bzvtc.com bzwater.com bzwz.com bzwzw.com @@ -18603,7 +18345,6 @@ c-fol.net c-jet.com c-lodop.com c-markaudio.com -c-nbh.com c-nin.com c-ps.net c-rst.com @@ -18640,12 +18381,14 @@ c4006.com c4008.com c400c.cc c402f6df11021.beer +c4190cb63e65819b.com c41b1d28472ea27c.com c437dfd45f96b488.com c43c3cb111011.beer c469f14b911012.beer c4752e8a51.vip c47cb27580c5de6b.com +c49.com c495f3eb10d6cf13.com c4c6c49a6453534d.com c4d.live @@ -18666,7 +18409,9 @@ c578801be1009.beer c57e6607c10292.beer c57fbfc585.skin c5a13eec21010.beer +c5a7e584ed460dcd.com c5b27c7c01019.beer +c5b3c3db298ea985.com c5b6bpoq7q.world c5bf2b35337761f4.com c5game.com @@ -18678,6 +18423,7 @@ c6a0cbdfa0be06e6.com c6bad2ad01020.beer c6c.com c6n708.ren +c7.net c7032.com c705e5bdb71ae01d.com c7197.com @@ -18689,6 +18435,7 @@ c77200.com c77c.com c7878.com c7bc68c2811032.beer +c7c1jx3ikk.bar c7c8.com c7fffvip16.com c7fffvip29.com @@ -18704,6 +18451,7 @@ c8a8b0af81014.beer c8f8537d91013.beer c9018.com c919.sbs +c944748d38bcc258.com c953b5d8b1013.beer c969.com c9b5b03e0ef62dc0.com @@ -18713,7 +18461,6 @@ c9e8e19a411012.beer c9ec9c2f0c2de043.com c9o8nlanfm.work ca-aicc.com -ca-sinfusi.com ca-sme.org ca-smefs.com ca-tencentclb.cloud @@ -18731,6 +18478,7 @@ ca315.com ca39.com ca5d4ce601013.beer ca800.com +ca91a5eb7ed4495e.com ca9ce6rv872ce1.com caa830d2710251.beer caa86.org @@ -18794,8 +18542,10 @@ cadrolift.com cadzhuan.com cadzxw.com caecc.com +caeda-cxrh.com caeef787f1694f47.com caeerr.com +caeete.net caefa.org caein.com caeri-te.com @@ -18803,13 +18553,13 @@ caes.store caexpo.com caexpo.org cafachine.com +cafagame.com cafamuseum.org caffci.org cagentle.com cagetest.com cageystone.com cagoe.com -cahwfeh.com cai-ba.com cai110.com cai58t.com @@ -18922,6 +18672,7 @@ cairuijun.com caisan.io caishen.ai caishenpo.com +caishenyy.com caishuiedu.com caisixiang.com caistc.com @@ -18929,6 +18680,7 @@ caistv.com cait.com cait1981.com caitaimg2.com +caitaw.com caitun.com caituyou.com caiwan.com @@ -18940,6 +18692,7 @@ caixin.com caixinfoundation.org caixinmedia.com caixinonline.com +caiyeml.pw caiyicloud.com caiyiduo.com caiyu.com @@ -18985,7 +18738,6 @@ camcap.us camcard.com camce-rc.com camdihg.com -camelotdogkennels.com camera360.com cameraunion.net camhen.com @@ -19025,7 +18777,9 @@ candiabiotech.com candou.com candybook.com candycake.cloud +candyhaw.com candypay.com +candystars.net canet.com canevent.com canfire.net @@ -19036,7 +18790,6 @@ cangfengzhe.com canghaiip.com canghaimachine.com cangjggame.com -cangjie-lang.net canglanghospital.com cangmang.xyz cangoonline.com @@ -19053,7 +18806,6 @@ cangya.com cangzhouhd.com canhighcenter.com canhot.net -canhui.xyz caniculab.com canidc.com canjio.com @@ -19062,6 +18814,7 @@ cankaoshouce.com cankaoxiaoxi.com cankaoxx.com canlanjy.com +cannelton.org canonpumps.com canpoint.net canpopo.com @@ -19139,12 +18892,12 @@ capitaleco-pro.com capitalip.org capitalonline.net capitaltoday.com +capjfx.club capjoy.com cappdr.org caps-china.org capsuleshanghai.com captain-cro.com -captainbi.com capturetheflag.fun capvision.com capwhale.com @@ -19184,7 +18937,6 @@ careerintlinc.com careerqihang.com careersky.org carefiber.work -careforbaby.com careked.com carelifefood.com carellicpa.com @@ -19216,6 +18968,7 @@ cars001.com carschina.com carsmp3.com cart-med.com +cartaocontinente-ptssta.cfd cartech8.com cartersda.com carthane.com @@ -19223,6 +18976,7 @@ cartimen.com cartoonwin.com cartx.cloud carutoo.com +carxinwen.com carxoo.com caryoud.com carzd.com @@ -19252,6 +19006,7 @@ casibase.com casic-addsino.com casic-t.com casic.com +casic3s.com casicloud.com casicyber.com casis.work @@ -19282,6 +19037,7 @@ catalyst-loading.com catcat321.com catchingdoll.com catchyrime.com +catering-shizuoka.com catfish-cms.com catfk.com catguo.com @@ -19301,7 +19057,6 @@ cattsp.com catugbio.com catv.net catv114.com -catv888.com catweiqi.com catyun.cc caua1988.com @@ -19323,7 +19078,6 @@ cb6037f1b10261.beer cb8a5dff61011.beer cb8e405b81014.beer cbaleague.com -cbarpay.com cbbn.net cbc32120f1014.beer cbca.net @@ -19336,6 +19090,7 @@ cbd-china.com cbd0512.com cbd263.com cbdcn.com +cbdd9912fb913294.com cbdio.com cbdstest.download.prss.microsoft.com cbdz13.com @@ -19346,6 +19101,7 @@ cbecx.com cbeeexpo.com cbes21.com cbex.com +cbf92cea38c259ee.com cbfau.com cbgcloud.com cbhb.biz @@ -19372,8 +19128,9 @@ cbndata.com cbndata.org cbnri.org cbnweek.com +cboad.com cbquan.com -cbrcw.com +cbsbearing.com cbsrc.com cbtgc.com cbtimer.com @@ -19389,9 +19146,9 @@ cc-pharming.com cc-q.com cc-uavia.com cc.co +cc06040d408f65b1.com cc0808.com cc11bh.com -cc39ute.shop cc55k.com cc707.com cc7m.com @@ -19432,7 +19189,6 @@ ccbride.com ccbxt.com ccc-ch.com ccc-chn.com -cccbn.com cccbs.net cccc-capital.com cccc-sdc.com @@ -19493,6 +19249,7 @@ ccgfie.com ccggd.com ccgim.com ccgjbus.com +ccgogogo.com ccgoyi.com ccgs120.net ccgslb.com @@ -19558,6 +19315,7 @@ ccjkncdc.com ccjoo.com ccjoy.com ccjoyland.com +ccjs120.com ccjt.com ccjxcn.com ccjytv.com @@ -19615,6 +19373,7 @@ ccopyright.com ccostm.com ccotcm.com ccoymc.com +ccp3060.com ccpaie.com ccpc.io ccpc360.com @@ -19643,6 +19402,7 @@ ccpitsd.com ccpittex.com ccpittj.org ccpitxiamen.org +ccpitxian.org ccplay.cc ccplay.com ccpnt.org @@ -19667,7 +19427,7 @@ ccsacacasfdghh.com ccschangsha.com ccscrbyy.com ccsedqrmyy.com -ccsjhbj.com +ccsfuchan.com ccskqyy.com ccsngqyy.com ccsnpower.com @@ -19691,6 +19451,7 @@ cctcce.com cctcct.com cctcdn.com cctek.com +cctg.cc cctheze.com cctime.com cction.com @@ -19735,7 +19496,6 @@ ccvui.com ccw.site ccwcw.com ccwcyw.com -ccwhz.com ccwifi.cc ccwl.net ccwonline.com @@ -19754,6 +19514,7 @@ ccyyxx.com cczel.com cczjyy.com cczk.com +cczkdmkj.com cczq.com cczq.net cczxyjhyy.com @@ -19778,7 +19539,6 @@ cd-wx.net cd-zc.com cd00c44f211031.beer cd120.com -cd120.info cd12371.com cd1958.com cd20.net @@ -19894,6 +19654,7 @@ cdjcow.com cdjfwy.com cdjiaoan.com cdjingfeng.com +cdjituan.com cdjnrc.com cdjsjlxh.com cdjsjx.com @@ -19907,6 +19668,7 @@ cdkf.com cdkjbg.com cdkjw.org cdks.run +cdkyfc.com cdlaobing.com cdlbmy.com cdlbyl.com @@ -19930,11 +19692,11 @@ cdn-cba.com cdn-cdn.net cdn-gw-dv.vip cdn-speed.com +cdn-static.farfetch-contents.com cdn-uc.cc cdn-v.com cdn.fun cdn.jetbrains.com -cdn.me cdn.samsung.com cdn.shanghai.nyu.edu cdn.show @@ -19944,7 +19706,6 @@ cdn08.com cdn1.vip cdn1008.com cdn1218.com -cdn123.cc cdn16.com cdn20.com cdn20.info @@ -19958,12 +19719,12 @@ cdn3344.com cdn35.com cdn40.com cdn56.com -cdn78.xyz cdn86.com cdn86.net cdn90.com cdn90.net cdn90.org +cdn99.com cdnb.net cdnbbb.net cdnbuild.com @@ -20004,7 +19765,6 @@ cdnhhh.net cdnhub.net cdnhwc1.com cdnhwc10.com -cdnhwc15.com cdnhwc2.com cdnhwc3.com cdnhwc4.com @@ -20102,7 +19862,7 @@ cdqph.com cdqsng.com cdqss.com cdqszz.com -cdqz.net +cdqzcz.com cdrbs.net cdrcb.com cdren.net @@ -20148,6 +19908,7 @@ cdtianda.com cdtkdw.com cdtlev.com cdtlxx.net +cdtnrq.com cdtszn.net cdtyxx999.com cdtz.net @@ -20156,7 +19917,6 @@ cduncname.com cdvcloud.com cdvisor.com cdxdyy.com -cdxnfk.com cdxrdz.com cdxsxbx.com cdxw.net @@ -20198,6 +19958,7 @@ ce-air.com ce04.com ce2293.com ce247ce247.shop +ce71jubc2.com cea45b9f61023.beer ceacq.com ceair.com @@ -20271,7 +20032,6 @@ cekeis.com cekid.com celebpalace.com celebritywallpapershq.com -celersyn.com celgenpharm.com celhr.com celiang.net @@ -20309,6 +20069,7 @@ cencs.com cendes-arch.com cengceng.chat cengcloud.net +ceniiat.com cenjiasu.com cenkersz.com cenn.com @@ -20341,6 +20102,7 @@ centurycreation.com centuryenglish.com centurystar.net centurytrip.com +cenuan.com cenvan.net cenvandns.com cenwan.com @@ -20426,6 +20188,7 @@ cf-ns.com cf-ns.net cf-ns.site cf-ns.tech +cf01e170e475757b.com cf115.com cf69.com cf6ea43741014.beer @@ -20443,9 +20206,6 @@ cfchint.com cfcpn.com cfd-china.com cfd163.com -cfdns43.com -cfdns5.com -cfdns81.com cfdp.org cfdwater.com cfecq.com @@ -20465,6 +20225,7 @@ cfhuodong.com cfido.com cfiec.net cfimg.com +cfishsoft.com cfjqr.com cfjzyxh.com cfkjgx.com @@ -20485,9 +20246,9 @@ cfoft.online cfogc.com cfogc.net cfpa.team +cfrlr.com cfsbcn.com cfscar.com -cfscrm.com cfsggjt.com cfsino.com cfss.cc @@ -20553,6 +20314,7 @@ cgjoy.net cgke.com cgkjvip.com cgksw.com +cgktudr.xyz cgl.cc cglw.com cgmama.com @@ -20582,7 +20344,6 @@ cgrzzl.com cgsec.com cgsfusion.com cgsoft.net -cgt48.com cgtblog.com cgtn.com cgtsg.com @@ -20620,6 +20381,7 @@ ch-guerrant.com ch-tools.com ch-water.com ch.com +ch028.net ch12333.com ch9888.com ch999.com @@ -20653,6 +20415,7 @@ chahui.com chahuo.com chaic.com chaichefang.com +chaiderl.com chaiding.com chaidongpower.com chaihezi.com @@ -20663,9 +20426,10 @@ chain56.com chaincar.com chaincatcher.com chaindd.com -chaindd.net chainedbox.com chainknow.com +chainlinkpcp.com +chainlinkwork.com chainnode.com chainpharm.com chainsql.net @@ -20702,6 +20466,7 @@ championunion.com champsely.com chan.ink chance-ad.com +chanced112.com chancel.ltd chandao.net chandashi.com @@ -20738,6 +20503,7 @@ changhaigfrp.com changhe-suzuki.com changhe.com changhe.tech +changheauto.com changhedayun.com changheng88.com changhong-network.com @@ -20753,6 +20519,7 @@ changjiangdata.com changjiangjin.com changjiangtimes.com changjianxy.com +changjingtong.com changjiulogistics.com changjiuqiche.com changker.com @@ -20773,16 +20540,19 @@ changshaship.com changshatong.com changshazrkj.com changshengmobi.com +changshengshangye.com changshengyiliao.com changshiban.com changshizu.com changshouchemgroup.com changshu-marathon.com +changshunhuojia.com changtounet.com changtubus.com changuanjia.com changwang.com changwankeji.com +changwei.asia changx.com changxianchem.com changxiao.co @@ -20828,7 +20598,7 @@ chaofan.com chaofanlin.com chaofanshuma.com chaofantian.com -chaofayin.com +chaoge.press chaogejiaoyu.com chaogu1688.com chaohuishou.com @@ -20839,6 +20609,7 @@ chaojibuy.com chaojicdn.com chaojifan.com chaojijianli.com +chaojiping.homes chaojituzi.net chaojiying.com chaojiyun.com @@ -20885,6 +20656,7 @@ char123.com charcaius.com charge-mobile.com chargedot.com +chargerlab.com chargerlink.com chariotpharm.com charlsdata.com @@ -20894,10 +20666,13 @@ charmkeytextile.com charmsunfund.com chartboost-china.com chase-secure55.wiki +chasedorisu.com chasedream.com chaseyanyu.net chashebao.com chashudi.com +chat12m.cfd +chat14da.cfd chat2db-ai.com chat778.com chatairc.com @@ -20952,6 +20727,7 @@ chdmc.com chdqyy.com chdtp.com che-shijie.com +che-youhui.com che.com che0.com che101.com @@ -21013,6 +20789,7 @@ cheguo.com chegva.com chehang168.com chehejia.com +chehui.com cheil.site chejianding.com chejingjie.com @@ -21037,6 +20814,7 @@ chembible.com chembk.com chemcd.com chemchina.com +chemcp.com chemcyber.com chemdodgen.com chemdrug.com @@ -21063,6 +20841,7 @@ chemwith.com chemyouth.com chemyq.com chen-design.com +chen.fun chenag.com chenall.net chenapp.com @@ -21112,10 +20891,8 @@ chenglispv.com chengliwang.com chengloongcishan.org chenglou.net -chengmei-trout.com chengmei.games chengmeiyouxuan.com -chengpan.com chengpeiquan.com chengrang.com chengrengaokaobaoming.com @@ -21137,9 +20914,9 @@ chengxiangzhineng.com chengxinyouxuan.com chengxua.com chengxuan.com -chengxuweb.com chengyangyang.com chengye-capital.com +chengyi.press chengyitex.com chengyouyun.com chengyuanwenquan.com @@ -21156,6 +20933,7 @@ chenhe.cc chenhe.me chenhr.com chenhuangxun.com +chenhui.org chenjia.me chenjiehua.me chenjinghealth.com @@ -21177,6 +20955,7 @@ chenpon.com chenpot.com chenroot.com chenruixuan.com +chenruo.net chens.life chenshipin.com chensuyang.com @@ -21252,6 +21031,7 @@ chexiang.com chexiaoliang.net chexinmeng.com chexiu.com +chextx.com chexun.com chexun.net cheyaoshi.com @@ -21334,6 +21114,7 @@ china-ah.com china-anhe.com china-applefix.com china-asahi.com +china-aseanbis.com china-audit.com china-autotech.com china-b.com @@ -21394,6 +21175,7 @@ china-drama.com china-drm.net china-dt.com china-dtv.com +china-eaea.com china-ecee.com china-eia.com china-embassy.org @@ -21439,6 +21221,7 @@ china-hushan.com china-hxzb.com china-hzd.com china-iace.com +china-ida.com china-inse.com china-invests.net china-ipif.com @@ -21509,6 +21292,7 @@ china-see.com china-seeq.com china-sfc.com china-shancun.com +china-shimo.com china-shjyx.com china-shufan.com china-shugaung.net @@ -21689,7 +21473,6 @@ chinacamel.com chinacapac.com chinacapg.com chinacarbide.com -chinacaring.com chinacars.com chinacasa.org chinacatel.com @@ -21795,6 +21578,7 @@ chinadmoz.org chinadns.com chinadns.org chinadongchu.com +chinadougong.com chinadra.com chinadrtv.com chinadrum.net @@ -21833,6 +21617,7 @@ chinaesm.com chinaet.net chinaev100.com chinaeve.com +chinaexam.org chinaexpo365.com chinaexpressair.com chinafa.org @@ -21851,6 +21636,7 @@ chinafga.org chinafiber.com chinafic.org chinafilm.com +chinafilmhy.com chinafilms.net chinafinancenet.com chinafinanceonline.com @@ -21916,6 +21702,7 @@ chinagzn.com chinahacker.com chinahaixun.com chinaham.com +chinahanang.com chinahao.com chinahaochuan.com chinaharp.com @@ -21946,8 +21733,10 @@ chinahotelgz.com chinahpa.org chinahqjjw.com chinahr.com +chinahrd.net chinahrt.com chinahsdp.com +chinahte.com chinahtz.com chinahualai.com chinahuashan.com @@ -21973,7 +21762,6 @@ chinaief.net chinaielts.org chinaiia.org chinaiiss.org -chinaims.org chinainfoseek.com chinainout.com chinainsbrokers.com @@ -21981,6 +21769,7 @@ chinaiol.com chinaiprlaw.com chinairn.com chinairport.net +chinait.vip chinaitcapital.com chinaitlab.com chinaiut.com @@ -22153,6 +21942,7 @@ chinaparking.org chinapastel.com chinapay.com chinapayhongkong.com +chinapbw.com chinapcd.com chinapearlk.com chinapeier.com @@ -22392,6 +22182,7 @@ chinawestagr.com chinawie.com chinawindnews.com chinawinjoy.com +chinawiserv.com chinawitmedia.com chinawr.net chinaws.net @@ -22401,6 +22192,7 @@ chinawudang.com chinawulong.com chinawutong.com chinawutong.net +chinawuyuan.com chinawxfoundry.com chinaxiaokang.com chinaxidian.com @@ -22694,6 +22486,8 @@ chrieschina.com christophero.xyz chrmn.com chrome64.com +chrome666.com +chromecj.com chromedownloads.net chromefor.com chromegw.com @@ -22782,6 +22576,7 @@ chuangyejia.com chuangyetv.com chuangyijisu.com chuangyiqifu.com +chuangyisai.com chuangyiwh.com chuangyouqi.com chuangyuan.ltd @@ -22797,9 +22592,9 @@ chuanmeixing.com chuannan.net chuanpuyun.com chuanqi.com +chuanqiart.com chuanshanjia.work chuanshanqundao.com -chuansinfo.com chuansong.me chuansongme.com chuantec.com @@ -22823,7 +22618,6 @@ chufaba.me chufw.com chuge8.com chugou360.com -chuguansmart.com chuguo.tech chuguohao.com chuhai.group @@ -22879,6 +22673,7 @@ chunyu.mobi chunyuqiufeng.com chunyuyisheng.com chunzuo.com +chuoemg.work chuolitech.com chuquan.me churenjixie.com @@ -22904,6 +22699,7 @@ chuxinhudong.com chuxinvip.com chuxueyun.com chuyaer.com +chuyigao.com chuyu.me chuzhaobiao.com chvacuum.com @@ -22917,8 +22713,8 @@ chxin-oil.com chxq.org chxyl.com chxyq.com -chysan.com chysoft.net +chyw.pub chyxx.com chyyyygl.com chz.cc @@ -22936,7 +22732,6 @@ ci123.com ci800.com ciaie.com ciallo.cc -ciallo.party ciaoca.com ciapst.org cibaike.com @@ -22952,6 +22747,7 @@ ciboedu.org cibonet.com cibresearch.com cibuser.com +cic-js.com cicadayun.com cicaf.com cicba.net @@ -22973,11 +22769,11 @@ cicphoto.com cict.com cidf.net cidi.ai +cidianbao.com cidiancn.com cidianso.com ciding.cc cidschina.com -cidu.net ciduw.com cie-lgr.com cieaast.com @@ -22988,7 +22784,6 @@ ciecte.com ciecworld.com ciedata.com cieet.com -ciefc.com ciepe.com cietac-hb.org cietac-sc.org @@ -23005,7 +22800,6 @@ ciftis.org cig-cq.com cigadesign.com cigarambassador.com -cige.net cigh.com cignacmb-ipmi.com cignacmb.com @@ -23064,7 +22858,6 @@ cindasoft.com cinehello.com cineplexsn.com cingta.com -ciniaoppt.com cinic.com cinsee.com cinsos.com @@ -23079,6 +22872,7 @@ ciou.com cioxom-top.com cip.cc cipgtrans.com +cipherupcloud.com ciplawyer.com cippe.net ciprun.com @@ -23131,6 +22925,7 @@ citisa.org citiz.net citizenmech.com citreport.com +cits-jl.com cits-sz.net citsbj.com citscq.com @@ -23193,6 +22988,8 @@ ciyuans.com ciyynodegroup.cyou cizip.com cj0515.com +cj5bs.com +cj5bs.net cj8.ren cjaljs.com cjasen.com @@ -23240,6 +23037,7 @@ cjjd19.com cjjd20.com cjjhb.com cjjhk.com +cjjjs.com cjjnff.com cjk3d.net cjkhd.com @@ -23261,7 +23059,6 @@ cjnas.com cjnis.com cjol.com cjs-lwh.love -cjs001.com cjsc.com cjsgegs.com cjshipin.net @@ -23294,11 +23091,13 @@ cjzzc.com ck-coinmcap.lol ck0771.com ck100.com +ck180.net ck586.com ck830.com ck921.com ckair.com ckan.tv +ckbv165.org ckd-mbd.com ckd.im ckd.so @@ -23318,12 +23117,14 @@ ckjr001.com ckjryy.com ckpharm.com ckplayer.com +ckqjyjq.xyz cksct.com cksic.com cksschool.com cksx.org cktshare.com ckuai.com +ckw205.com ckxx.net ckzcc.com ckzhaoyaojing.com @@ -23347,7 +23148,6 @@ claritywallpaper.com classa-z.com classcms.com classic023.com -classin.com classinpaas.com classmateer.com classpassincn.com @@ -23385,7 +23185,6 @@ clearsky360.com cleartone.club clevercn.net cleveroom.com -cleverschool.com clewm.net clfcgc.com clfdked.icu @@ -23414,7 +23213,6 @@ clivia.fun clj178.com cljport.com cljtscd.com -clkf.net clled.com cllk.net clloz.com @@ -23426,6 +23224,8 @@ cloopen.com cloopen.net cloopm.com closeli.work +closertb.site +clothinggg.store clothjob.com clothr.com clotliu.com @@ -23458,6 +23258,7 @@ cloud-zhaoqing.com cloud-zhongwei.com cloud21cn.com cloud301.net +cloud887325.com clouda.com cloudacc1.com cloudacc1.net @@ -23508,7 +23309,6 @@ cloudflareperf.com cloudflareprod.com cloudflarestaging.com cloudflarestoragegw.com -cloudflvare.com cloudfoshan.com cloudfront-cn.net cloudfuqing.com @@ -23596,7 +23396,6 @@ cloudstudio.run cloudstudio.work cloudsuqian.com cloudswift.cloud -cloudt.chat cloudtalkers.com cloudtangshan.com cloudtencents.com @@ -23671,11 +23470,11 @@ cm-inv.com cm-iov.com cm-worklink.com cm1.hk -cm2.hk cm233.com cm3721.com cm442.com cmacredit.org +cmaif.com cmakaoj.com cmanuf.com cmb-leasing.com @@ -23724,6 +23523,8 @@ cmdcxls.com cmdpe.com cmdschool.org cmdsir.com +cmdw.vip +cme-am.com cme-cq.com cme021.com cmea-crtc.com @@ -23800,7 +23601,6 @@ cmskcrm.com cmsta.org cmstop.com cmstp.com -cmswat.com cmswin.com cmt1993.com cmt7.com @@ -23865,7 +23665,6 @@ cn-msedge.net cn-mw.com cn-natural.com cn-only.com -cn-orient.com cn-psy.com cn-railway.net cn-rcqc.com @@ -23875,7 +23674,6 @@ cn-sdf.com cn-shine.com cn-soft.com cn-tf.com -cn-tn.com cn-tom.com cn-truck.com cn-unitech.com @@ -23893,6 +23691,7 @@ cn.mm.bing.net cn.net cn.pool.ntp.org cn.sc.com +cn.windowssearch.com cn0-6.com cn006.com cn010w.com @@ -23947,7 +23746,6 @@ cnalu.com cnambition.com cname-cdn.com cname-syd.com -cname0.com cname123.net cname88.com cnamegslb.com @@ -23961,12 +23759,10 @@ cnats.com cnautofinance.com cnautonews.com cnautotool.com -cnazd.com cnb.cool cnb.run cnb.space cnbabylon.com -cnbaiyin.com cnball.net cnbanbao.com cnbang.net @@ -23989,6 +23785,7 @@ cnblower.com cnbm-njks.com cnbmltd.com cnbmtech.com +cnbmys.com cnbnl.com cnboat.com cnbonly.com @@ -24050,6 +23847,7 @@ cncn.com cncn.net cncncn.com cncnet.net +cncnki.com cncolour.com cncompute.com cncoolm.com @@ -24185,6 +23983,7 @@ cnfrp.com cnfrp.net cnfruit.com cnfth.com +cnfuhuaqi.com cnfuyin.org cnfxc.com cnfxj.org @@ -24258,7 +24057,7 @@ cnhuafag.com cnhuafas.com cnhuanya.com cnhubei.com -cnhuilv.com +cnhvacrnet.com cnhwjt.com cnhyc.com cnhyjt.com @@ -24398,7 +24197,6 @@ cnmansi.com cnmarathon.net cnmarinefan.com cnmattson.com -cnmcdn.com cnmcl.net cnmdy.com cnmec.biz @@ -24430,10 +24228,10 @@ cnmsn.net cnmstl.net cnmtpt.com cnmuseum.com -cnmvps.com cnn100.com cnnb.com cnnbfdc.com +cnnbsa.com cnncbhy.com cnncguilin.com cnndns.com @@ -24505,9 +24303,9 @@ cnponer.com cnpot.com cnpou.com cnpoultry.com +cnpowdertech.com cnpp100.com cnppa.org -cnprac.xyz cnpressphoto.com cnprofit.com cnprs.com @@ -24519,6 +24317,7 @@ cnpxyy.com cnpython.com cnqc.com cnqcc.com +cnqd.net cnqiang.com cnqichun.com cnqifeng88.com @@ -24575,6 +24374,7 @@ cnsetsail.com cnsfk.com cnshende.com cnshexinji.com +cnshiri.com cnshjy.com cnshuizu.com cnshzm.com @@ -24694,6 +24494,7 @@ cnxad.com cnxcjt.com cnxclm.com cnxct.com +cnxds.com cnxdw.com cnxfans.com cnxhyp.com @@ -24780,7 +24581,6 @@ coach-edu.com coach-japanese.com coahr.net coalcloud.net -coalmo.com coalstudy.com coantec.com coaoo.com @@ -24810,6 +24610,7 @@ cocophp.com cocos.com cocos.org cocos2d-x.org +cocos2d.org cocos2dx.net cocosgame.net cocounion.com @@ -24817,7 +24618,7 @@ cocozq.com cocss.com codante.org code-abc.com -code-relay.com +code-by.org code222.com code369.com code666.com @@ -24844,7 +24645,6 @@ codeios.com codekissyoung.com codekk.com codelife.cc -codelink.vip codemart.com codenews.cc codeofchina.com @@ -24961,6 +24761,7 @@ colipu.com collaborate.download.prss.microsoft.com collaborateppe.download.prss.microsoft.com collect-med.com +collect-v6-51.la college-ing.com collt.org colly-pink.com @@ -24969,7 +24770,6 @@ colocess.com color-measure.com color365.com colorbird.com -colorfulclouds.com colorfulclouds.net colorfulltech.net colorimeter.com @@ -24978,6 +24778,7 @@ coloros.net colortechchina.com colorv.com coloryr.com +colosseo7143.xyz colourlife.com columbia-china.com columbia-kaiyuan.com @@ -25008,6 +24809,7 @@ comeyes.com comflowy.com comfylink.com comiai.com +comic520.com comicdd.com comicer.com comicfans.net @@ -25020,8 +24822,6 @@ comlan.com comlbs.com commchina.net comme.work -commonpcs-test.com -commonpcs.com communicatte.com comnergy.com comocloud.net @@ -25052,6 +24852,7 @@ con3c.com conan06.com conantoptical.com conbagroup.com +conceptan.com conchdate.com conchdesktop.com conco-esd.com @@ -25068,6 +24869,7 @@ conew.com confluxrpc.com conghua.com congmiqq.com +congresobolivariano.org congrongfund.com congtoo.com congtoukaishi.com @@ -25090,6 +24892,7 @@ console-integration.cdnetworks.com console.cdnetworks.com constao.com constar-gd.com +constasj.me constgroup.com content4ads.com contentchina.com @@ -25120,6 +24923,7 @@ coohua.com cooioo.com cookcai.com cookicut.com +cookie4you.com cookiezhong.com cool-admin.com cool-de.com @@ -25151,6 +24955,7 @@ coolight.cool coolkaba.com coolkit.cc coolkk.net +coolku.cc coollf.com coolmitech.com coolnull.com @@ -25256,6 +25061,7 @@ cosz.com cotek-robotics.com cotong.com cotticoffee.com +cottonchina.org cotv.tv couas.com couns.com @@ -25348,6 +25154,7 @@ cplamc.com cplotus.com cpm1000.com cpmiao.net +cpmrc.org cpo2o.com cpolar.com cpolive.com @@ -25363,6 +25170,7 @@ cppdebug.com cppfoto.com cpph.com cpplay.com +cppoly.com cpppf.org cpqrmyy.com cproton.com @@ -25390,7 +25198,6 @@ cpury.com cpuxn.com cpwlx.com cpwnews.com -cpwxw.net cpwzb.com cpzls.com cpzst.com @@ -25560,6 +25367,7 @@ cqguangrong.com cqguli.com cqguohua.com cqguorui.com +cqgwd.com cqgwy.org cqgwzx.com cqgxjscy.com @@ -25603,6 +25411,7 @@ cqhwzs.com cqhxdbj666.com cqhxeye.com cqhxf.com +cqhxfk.com cqhxgf.com cqhxyy.com cqhxzz.net @@ -25627,6 +25436,7 @@ cqipc.net cqirobot.com cqiss.com cqit.com +cqiter.com cqiti.com cqitic.com cqivc.com @@ -25679,6 +25489,7 @@ cqkejufu.com cqkepu.com cqkerui.com cqkexun.com +cqkeye.com cqkfb.com cqkhjt.cc cqkjb.com @@ -25694,6 +25505,7 @@ cqkytech.com cqkytq.com cqlaifu.com cqlandtower.com +cqlba.com cqld.com cqlfn.com cqlhyy.com @@ -25803,9 +25615,11 @@ cqrksw.com cqrm.com cqrmb.com cqrmrq.com +cqrqdx.com cqrwys.com cqryxfp.com cqs-hm.com +cqsaea.com cqsamr.com cqscmy.net cqsdei.com @@ -26075,7 +25889,6 @@ crbbg.com crbc.com crbeverage.com crbiopharm.com -crbybosh.com crc-bj.com crc.com.hk crc.hk @@ -26095,7 +25908,6 @@ crcrfsp.com crcsz.com crct.com crctrust.com -crdietitian.org cre.net cread.com creality.com @@ -26105,6 +25917,7 @@ createcdigital.com createpoint.qti.qualcomm.com createw.com createwf.com +creati5.com creation-bj.com creationventure.com creative-micro.com @@ -26163,6 +25976,7 @@ crimoon.net crimoscow.com crinductance.com crisydney.com +criwashington.com crjfw.com crl.globalsign.net crl.kaspersky.com @@ -26179,7 +25993,6 @@ crmicro.com crmip.com crmyy.com crnews.net -crntt.com crodigy.com crodigynat.com croot.com @@ -26201,7 +26014,6 @@ crpcg.com crpharm.com crracelve.com crrcgc.cc -crrcgo.cc crs811.com crsc.cc crscm.com @@ -26315,7 +26127,6 @@ csgasgroup.com csgcjxxh.com csgcyy.com csgfjc.com -csgholding.com csghy.com csgjhzzx.com csgjjt.com @@ -26323,7 +26134,6 @@ csgkjt.com csgky.net csgocn.net csgongshui.com -csgozbt.com csgpc.org csgwexpo.com csgxyl.com @@ -26403,6 +26213,7 @@ csmxh.com csmzxy.com csnbgsh.com csnhjyxx.com +csnhszjy.com csnzxl.com csoly.com csomdmyxy.com @@ -26418,7 +26229,6 @@ cspplaza.com cspro.org cspruc.com csptia.org -csqaq.com csqsg.com csrcare.com csrcbank.com @@ -26466,6 +26276,7 @@ cst6.com cstccloud.org cstcloud.net cstcq.com +cstech.ltd csteelnews.com cstexun.com csthxx.com @@ -26508,7 +26319,6 @@ csxsrcw.com csxww.com csy17.com csyamei.com -csydkj.com csyestar.com csykgs.com csylxy.com @@ -26541,6 +26351,7 @@ ct-emall.com ct-laser.com ct-parking.com ct108.com +ct52.com cta613.org ctaca.com ctags.net @@ -26643,6 +26454,7 @@ ctmcq.com ctmgid.com ctmon.com ctmwow.com +ctn1986.com ctnma.com ctntech.com ctnyypt.com @@ -26666,7 +26478,6 @@ ctripbuy.hk ctripc.com ctripcorp.com ctripgslb.com -ctripgslb.net ctripins.com ctripqa.com ctrmi.com @@ -26690,6 +26501,7 @@ cttms.com cttpptrs-pt.cfd cttptru-pt.icu cttq.com +cttsd.com cttv.co ctuaa.com ctvpost.com @@ -26698,6 +26510,7 @@ ctvwx.com ctwx.net ctxcdn.com ctxcdn.net +ctxcollect.com ctxcpa.com ctxirang.com cty9.com @@ -26770,7 +26583,6 @@ cummins-cq.com cumtenn.com cumulon.com cunan.com -cuncc.cc cuncunle.com cunfang.com cunhao.net @@ -26853,6 +26665,7 @@ cwems.com cwestc.com cweun.org cwewater.com +cwfls.com cwgarnet.com cwiaj.com cwjedu.com @@ -26927,6 +26740,7 @@ cxsk.work cxsm.com cxstar.com cxsteel.com +cxstgc.com cxsw3d.com cxta.com cxthhhhh.com @@ -26988,6 +26802,7 @@ cyberway-china.net cybstar.com cybtc.com cyc2018.xyz +cychaiqian.com cyclemixcn.com cyclewell.com cyclingchina.net @@ -27147,6 +26962,7 @@ czgongzuo.com czgtjt.com czguangfu.org czhaobiao.com +czhjs.com czhmjx.com czhtff.com czhuayuansuye.com @@ -27156,6 +26972,7 @@ czinfo.net czitc.com czjake.com czjdgz.com +czjdjt.com czjdu.com czjfa.com czjiangteng.com @@ -27203,7 +27020,6 @@ czsrc.com czsrmyy.com czsshb.com czstx.net -czsvip.com czswdx.com cztaojiu.com cztrjs.com @@ -27234,16 +27050,15 @@ czyongfeng.com czypcb.com czyuxing.com czyxba.com -czyzd.com czzqp.com czzsw.com czzy-edu.com czzyc.com -czzyv.com czzyvideo.com czzzbwg.com d-controls.com d-ctrip.com +d-d.design d-heaven.com d-innovation.com d-long.com @@ -27268,6 +27083,7 @@ d1be4a4fdf902c14.com d1c73dbb1de91850.com d1cm.com d1com.com +d1cy.com d1dengju.com d1dytt.com d1ev.com @@ -27286,6 +27102,7 @@ d1xn.com d1xny.com d1y.cc d20d0896ac7f79d3.com +d22fa4e66e2dbda2.com d23c41a0511031.beer d27c2e00d10251.beer d2940a1d3924e37f.com @@ -27315,29 +27132,33 @@ d475a937d0e92b96.com d48c3443110281.beer d4cd5439c1009.beer d4ctech.com -d5168.com d54a00143de85b64.com d56c84cfb4a786f7.com d58.net d5a18ed7b2f74e45.com +d5h.net d5power.com d5render.com d5xs.net d65d6.com +d65fee3222cbaf80.com d6861213910261.beer d6ffdb55d1009.beer d7585a05210281.beer d777.com d7e29629277.luxe +d7ftpecw.work d7vg.com d7w.net d7ytrv7yxa.com d837c367d34d7bb5.com +d8e8664c05df452c.com d8fb1ffab10251.beer d8th.com d90eeacb0ed722f9.com d920c164caf0ebba.com d959fb95dd5cc433.com +d9741b1859dfcfee.com d99net.net d9b5cc7f82ccfc18.com d9j8.com @@ -27391,6 +27212,7 @@ daccc.com daccf.com dachanet.com dachao.com +dachaoshan.org dachengbiochemical.com dachengge.com dachenglaw.com @@ -27405,7 +27227,6 @@ dad86b446ac9f8b7.com dada114.net dada360.com dadaabc.com -dadacart.com dadagame.com dadagem.xyz dadajiasu.com @@ -27426,6 +27247,7 @@ dadicinema.com dadighost.com dadikid.net dadisalt.com +dadiwang.com dadiyimao.com dadongwu.com dadou.com @@ -27446,7 +27268,6 @@ dafanshu.com dafaun.com dafenghk.com dafenghk.net -dafga9.com dafmgroup.com dafork.com dafosi.org @@ -27471,6 +27292,7 @@ dahangsky.com dahangzhou.com dahantc.com dahanyinbang.com +dahanyu.com dahao-dahao.com dahaoexpo.com daheapp.com @@ -27539,8 +27361,6 @@ dainiter.com dairao.net daishangqian.com daishanmarathon.com -daishi-edu.net -daishi-jy.com daishu.com daishucha.com daishujiankang.com @@ -27551,6 +27371,7 @@ daivc.com daiwofly.com daiwoqu.com daixiaji.net +daixiaobao.com daixiaomi.com daixiaorui.com daiyanbao.com @@ -27600,6 +27421,7 @@ dakaruanwen.com dakasi.com dakedakedu.com dakejie.com +dakekj.com dakele.com dakw.xyz dalanyouxi.com @@ -27621,6 +27443,7 @@ dalianxianting.com daliaolaser.com daliapp.net dalidaily.com +dalidm.com dalifa.com daliha.com dalipan.com @@ -27636,6 +27459,10 @@ daluwang.net daluxinxi.com dalvhe.com dalvlaw.com +dalwiaavieru.com +dalwiaebulon.com +dalwiakieyne.com +dalwiaresham.com dalyfeds.com damai.com damaicheng.com @@ -27650,10 +27477,10 @@ damiercapital.com damijing.com damingweb.com damiw.com +damixs.biz damndigital.com damo-academy.com damodel.com -damon-group.com damonroller.com damotu.com damoyang.com @@ -27671,7 +27498,6 @@ dance365.com danceinchina.org dancf.com danchuangglobal.com -danchun.me dancihu.com dancingcg.com dancizhan.com @@ -27714,6 +27540,7 @@ dangzhi.net dangzhu.net dangzhuntianqi.com danhao51.com +danhaowang.org danhuaer.com danhuangyun.com daniao.org @@ -27725,6 +27552,7 @@ daniopack.com daniuguwang.com daniuit.com daniujiaoyu.com +daniushiwan.com daniuwangxiao.com danji100.com danji6.com @@ -27765,7 +27593,6 @@ dantuvc.com danxia.com danxin.net danyang.com -danyue.site danzhaoedu.com danzhou8.com dao-fu.com @@ -27789,7 +27616,6 @@ daodoc.com daododo.com daoduoduo.com daofengdj.com -daogou.ai daoguo.com daohang198.com daohang4.com @@ -27810,6 +27636,7 @@ daokers.com daokeyuedu.com daokoudai.com daomengad.com +daomengren.com daomicfo.com daomuol.com daonong.com @@ -27840,6 +27667,7 @@ dapan.com dapei.cc dapenti.com dapingshidai.com +dapiniu.com dapustor.com daqi.com daqiao.host @@ -27881,6 +27709,7 @@ dasctf.com dasfbio.com dasfjd.com dashangu.com +dashen8.com dashengji.com dashengpan.com dashengshan.com @@ -27909,6 +27738,7 @@ dasung.com dasungtech.com dat881.com data380.com +data4h.com data5u.com data86.com data86.net @@ -27948,6 +27778,7 @@ dataojo.com dataoke.com datarelab.com datarj.com +datasheet.hk datasheet5.com datastoragesummit.com datatang.com @@ -27956,7 +27787,6 @@ datatist.com datatocn.com datatool.vip datauseful.com -datawindexmarket.com dataxcrm.com datayes.com datazt.com @@ -27967,6 +27797,7 @@ datesdata.com datia-inspect.com datianmen.com datk.anythinktech.com +datong.info datongjianshe.com datongtaxi.com datuc.com @@ -27995,11 +27826,9 @@ dawndiy.com dawnjs.com dawnlab.me dawnled.net -dawnmic.com dawntech.net dawuhanapp.com dawurencai.com -dawushiye.com dawuyu.com dawx.com dawx.net @@ -28020,11 +27849,13 @@ daxishi.com daxitouzi.com daxue52.com daxuecidian.com +daxueit.com daxuejiayou.com daxuelu.com daxuepc.com daxuesoutijiang.com daxuewang.com +day66.com dayaguqin.com dayainfo.com dayang.group @@ -28120,7 +27951,7 @@ dazhong.com dazhongbanben.com dazhonghr.com dazhongkanche.com -dazhongyi.cc +dazhoumzj.com dazhoushan.com dazhouwater.com dazhu1988.com @@ -28184,6 +28015,8 @@ dbqgg.com dbs724.com dbscar.com dbshop.net +dbss360.com +dbtclub.com dbyun.net dc-cn.com dc0792.com @@ -28234,7 +28067,6 @@ dcpc.com dcpfb.com dcqsq.com dcsapi.com -dcshfu.com dcshow.com dcsjw.com dcsme.org @@ -28251,7 +28083,6 @@ dcyjc.com dcyz.com dcyzq.com dczcsc.com -dczcy.com dczkj.com dczy168.com dd-advisor.com @@ -28266,6 +28097,7 @@ dd0d7e15310311.beer dd0ss-waf.com dd128.com dd2007.com +dd208.com dd369.com dd373.com dd4.com @@ -28296,6 +28128,7 @@ dddja.com dddki.com dddkq.com dddwan.com +dde-desktop.org ddedush.com ddfans.com ddfchina.com @@ -28347,16 +28180,19 @@ ddpai.com ddpoc.com ddqcw.com ddsaas.com +ddsiojf.xyz ddsk.la ddsm.com ddstarapp.com ddsy.com ddtk.vip +ddtsg.com ddtugame.com ddun.com ddunyun.com ddurl.to dduser.mobi +dduwork.com ddvaj.com ddweilai.com ddwgame.com @@ -28415,6 +28251,7 @@ deathearth.com deau-cable.com deb1c7bad11031.beer debao.com +debao123.com debaochina.com debbe32e10b635a7.com deben.me @@ -28432,10 +28269,12 @@ decerp.cc dechang-chem.com dechingroup.com dechlogi.com +dechong.site dechua.com deckmanager.net declous.com decohome.cc +decoration.ltd decorcn.com decwhy.com deczh.com @@ -28458,6 +28297,7 @@ deehon.com deemos.com deep56.com deepblog.net +deepc.cc deepcloudsdp.com deepcoin.red deepcool.com @@ -28467,6 +28307,7 @@ deepfast.com deepin-ai.com deepin.com deepin.org +deepinghost.com deepinmind.com deepinos.org deepinout.com @@ -28517,7 +28358,6 @@ dehuigroup.com dehuisk.com dehuiyuan.com deifgs.com -deipei.com dejiart.com dejiplaza.com dekeego.com @@ -28571,10 +28411,12 @@ deluya.com demanmedical.com demark-jgkj.com demaxmedical.com +demingzi.com demix.cc demixc.com demizhongbao.com demlution.com +demo-15.work demo1024.com demo8.com demodashi.com @@ -28610,7 +28452,6 @@ denopark.com denson168.com dentistshow.com denza.cloud -denza.com denzacloud.com deosen.com deosin.com @@ -28669,6 +28510,7 @@ desunpv.com desuntech.com deswfggabc.work detailroi.com +deteufelde.shop detion.com detonfan.com detonger.com @@ -28682,6 +28524,7 @@ devclub.cc devedu.net develenv.com developer.htcvive.com +developer.microsoft.com developer.vive.com developers.pub developwechat.com @@ -28698,6 +28541,7 @@ devio.org devops-dev.com devotiongroup.com devourad.com +devpss.com devsapp.net devsiki.com devskyr.com @@ -28760,7 +28604,6 @@ df3n43m.com df81.com df962388.com dfb232ce910241.beer -dfcdn.com dfcfs.com dfcfw.com dfcms.net @@ -28768,6 +28611,7 @@ dfcx-bj.com dfdaily.com dfdd-toubiaole.com dfdinsin.com +dfdtt.com dfebda0512.vip dfedu.com dfeeb7ee91022.beer @@ -28789,6 +28633,7 @@ dflzm.com dflzmxs.com dfmc.com dfmcastrol.com +dfmingya.com dfnzhp.com dfpost.com dfqcmy.com @@ -28819,6 +28664,7 @@ dfyapp.com dfyl-luxgen.com dfynet.com dfyoo.com +dfysgs.com dfysscy.com dfysw.net dfyuan.com @@ -28917,6 +28763,7 @@ dgsztyy.com dgt-factory.com dgtianbao.xin dgtle.com +dgtn1718.org dgtpcj.com dgtungwah.com dgtuoyue.com @@ -28925,6 +28772,7 @@ dgweierwj.com dgweitian.com dgwia.com dgwlhj.com +dgwtrl.com dgxbjg.com dgxinde.net dgxue.com @@ -28968,6 +28816,7 @@ dhbs86.com dhchain.com dhcooker.com dhdly.com +dhg858a07.shop dhgsqjcnd.com dhgsqjcnj.com dhgsqjcnm.com @@ -29003,7 +28852,6 @@ dhszyy.net dht5867.com dhtest.com dhtopology.com -dhtsm.com dhtv.tv dhuili.com dhvisiontech.com @@ -29149,6 +28997,7 @@ dianzhenkeji.com dianzhentan.com dianzhi.com dianzhong.com +dianzi6.com dianziaihaozhe.com dianzihetong.net dianzixuexi.com @@ -29218,7 +29067,6 @@ didibuluo.com didichuxing.com dididapiao.com dididi88.com -didifinance.com didiglobal.com didimobility.com didiopenapi.com @@ -29264,6 +29112,7 @@ digitalchinahealth.org digitalcloudshield.com digitalcnzz.com digitalcq.com +digitalfiles.org digitaling.com digitaljx.com digitalmanu.com @@ -29386,7 +29235,6 @@ dingsheng.com dingso.com dingtalk.co.jp dingtalk.com -dingtalk.io dingtalk.net dingtalkapps.com dingtalkcloud.com @@ -29406,9 +29254,7 @@ dingyantec.com dingyao17.com dingyue-ele.com dingyueads.com -dingyunwl.com dingzhijl.com -dingzhiyou.org dingzhoudaily.com dingzhourencai.com diningcity.asia @@ -29426,15 +29272,14 @@ dipan.com dipephoto.com dipont.com dippstar.com -diqcdbc.com diqiuw.com diqua.com dir001.com dir28.com -dircleaner.com directorfeng.com directui.com dis9.net +disccrds.com discount-polska.store discourse-studies.com discoversources.com @@ -29458,7 +29303,6 @@ dismall.com displink.com distantmeaning.com distinctclinic.com -distinctech.com ditai.fun ditan.com ditan360.com @@ -29487,7 +29331,6 @@ dixintong.com diy10.com diyahz.com diybcq.com -diybuy.net diydiymall.com diygogogo.com diygw.com @@ -29570,6 +29413,7 @@ djiits.com djiops.com djiservice.org djjgj.com +djjlseo.com djjw.com djjyzly.com djkk.com @@ -29578,7 +29422,6 @@ djksh.com djksq.com djkxl.com djlcom.net -djll.fun djlmvip.com djlsoft.net djm-bj.com @@ -29611,6 +29454,7 @@ dk-lexus.com dk8s.com dkdangle.com dkdgroup.com +dkdsfrwety.xyz dkewl.com dkfinancing.com dkgyw.com @@ -29681,6 +29525,7 @@ dllzj.com dlmeasure.com dlmianshuiche.com dlmonita.com +dlmyzf.com dlmzk.com dlnel.com dlnel.org @@ -29725,16 +29570,19 @@ dlztb.com dlzxyy.com dlzyc.com dm0775.com +dm300.com dm456.co dm5.com dm591.com dm5u.com dm67.com dm9.com +dma13.org dmacg.net dmaking.com dmall.com dmallcdn.com +dmallovo.com dmb168.com dmcdn.com dmd968.com @@ -29742,6 +29590,7 @@ dmdaili.com dmeiti.com dmeiti.net dmeng.net +dmentt.help dmgapp.com dmggb.com dmgpark.com @@ -29781,6 +29630,7 @@ dmzfa.com dmzgame.com dmzj.com dmzlcn.com +dmzx.com dmzzbjb.net dn.com dn23.com @@ -29799,6 +29649,7 @@ dningbo.com dnion.com dnjd.com dnjsb.com +dnlunwen.com dnmall.com dnmcn.com dnnunion.com @@ -29824,7 +29675,6 @@ dns123.net dns12345.com dns200.net dns2008.com -dns36.cc dns567.com dns6132.com dns666.com @@ -29905,6 +29755,7 @@ dnsrw.com dnss.vip dnssina.com dnstest.vip +dnstx88.cc dnsurl.net dnsv1.com dnsv1.net @@ -29972,6 +29823,7 @@ doc361.net doc88.com doccamera.com docer.com +docexcel.net docin.com dockerinfo.net dockerone.com @@ -29984,6 +29836,7 @@ docoi.cc docpe.com docs.cdnetworks.com docschina.org +docshare.org docsj.com docsmall.com docsou.com @@ -29996,6 +29849,7 @@ doctoryou.ai docuarea.org documents.cdnetworks.com docx88.com +doczj.com dodjoy.com dodo8.com dodobook.net @@ -30013,6 +29867,8 @@ doerjob.com doffry.com dofolong.com dog-e-clothing.com +dog089a-a66.com +dogain.com dogecast.com dogecdn.com dogecloud.com @@ -30069,6 +29925,7 @@ domilight.com domob-inc.com domobcdn.com domor.net +domp4.net dondonwenda.com done-home.com donews.com @@ -30111,6 +29968,7 @@ dongdongzu.com dongeejiao.com dongfahouse.com dongfang-heater.com +dongfang-sisal.com dongfang-wh.com dongfang.com dongfang77.com @@ -30231,6 +30089,7 @@ dongzhougroup.com dongzhuoyao.com dongzsec.com donhonet.net +doniv.net donlim.com donnor.com donoo.net @@ -30273,6 +30132,7 @@ doservice.com doshome.com dosilicon.com dosk.win +dosnap.com dospy.com dossav.com dossen.com @@ -30296,7 +30156,6 @@ dou6.cc doubaijiu.com douban.com douban.fm -doubaninfo.com doubanio.com doubao-dev.com doubao.com @@ -30355,6 +30214,7 @@ douleyun.net doulongyun.com doumenqu.com doumi.com +doumiip.com doumistatic.com doumob.com douniwan.org @@ -30440,6 +30300,7 @@ downkuai.com download.microsoft.com download.visualstudio.microsoft.com download.windowsupdate.com +downloadcenter.samsung.com downloads.ltd downok.com downos.com @@ -30472,6 +30333,7 @@ dp2u.com dpanel.cc dpangzi.com dpcafc.com +dpcq1.net dpcyjt.com dpd-hul.cfd dpdfsd.com @@ -30481,6 +30343,7 @@ dper.com dpfile.com dpgz.com dpin100.com +dpjszs.com dpkyz.com dplor.com dplord.com @@ -30492,6 +30355,7 @@ dptech.com dptechnology.net dptel.com dpurat.com +dpw.pub dpwl.net dpxkjw.com dpxq.com @@ -30509,6 +30373,8 @@ dqdg.cc dqdgame.com dqdm.com dqguo.com +dqhsrq.com +dqhui.com dqhyxh.com dqiis.com dqjob88.com @@ -30526,6 +30392,7 @@ dqsldz.com dqsq.net dqsy.net dqtzdt.com +dqyadong.net dqyfapiao.com dqyouqi.com dqyq.com @@ -30656,7 +30523,6 @@ dsdbxg.com dsdod.com dseman.com dser.com -dsers.com dsfdy.com dsfjh.vip dsfpz.com @@ -30666,7 +30532,6 @@ dsfzh.com dshigao.com dshltech.com dshrc.com -dsjpt.net dsjt.com dskb.co dskj-ops.com @@ -30674,7 +30539,6 @@ dsktjt.com dskystudio.com dslbuy.com dslr120.com -dslt.net dslt.tech dslvts.com dslyy.com @@ -30686,6 +30550,7 @@ dsnpz.com dsnzyy120.com dsook.com dsp.com +dspgo.com dspmt.com dspwhy.com dsq.com @@ -30696,12 +30561,12 @@ dss.hk dsspinfo.com dsssp.com dsstudio.tech +dssz.com dst.gov.mo dstcar.com dstfsbc.com dstguanwang.com dsti.net -dsw123.com dsw6.com dswjcms.com dswljt.com @@ -30722,7 +30587,6 @@ dt-stor.com dt123.net dt830.com dtao.com -dtcits.com dtcj.com dtcms.net dtcoalmine.com @@ -30742,7 +30606,6 @@ dtmiller.com dtminds.com dtmuban.com dtnews.net -dtpower.com dtq.com dtrcb.com dtrcw.net @@ -30790,6 +30653,7 @@ duanxianxia.com duanxin.com duanxin520.com duanxindao.com +duanzaixian.vip duanzao001.com duanzikuaizui.com duanziya.com @@ -30797,10 +30661,12 @@ duapp-preview.com duapp.com duapp.net duapps.com +duasrdwb.com duba.cc duba.com duba.net dubairen.com +dubao123.com dubbing.tech dubbingx.com dubbo.io @@ -30812,6 +30678,7 @@ ducafecat.com ducafecat.tech ducar.cc duchina.com +duckyset.com dudong.com dudongsheji.com duduaa.com @@ -30865,13 +30732,13 @@ duliangaotu.com dulife.com dulifei.com dullr.com -dulupay.com dulwich.org dumall.com dumanhua.com dumasoftware.com dumi0898.com dumpapp.com +dun.la dun222.com dun555.com dun599.com @@ -30920,6 +30787,7 @@ duodutek.com duoerpharmacy.com duofriend.com duofugroup.com +duogouhui.com duohuanbao.com duohui.co duoic.com @@ -30940,6 +30808,7 @@ duoladayin.com duolaika.com duolapiao.com duolatom.com +duolawk.asia duolayunwang.com duole.com duolebaohuang.com @@ -30970,10 +30839,14 @@ duomicheng.com duominuo.com duomiyou.com duomni.com +duomo3205.xyz duomob.com duomoyu.com duomu.hk +duomu.tv duopao.com +duopei.cc +duopei.xyz duopingka.com duoqu.com duorenwei.com @@ -31005,7 +30878,6 @@ duoyewu.com duoyi.com duoying.com duoyinsu.com -duoyiwangluo.com duoyoumi.com duozhi.com duozhuayu.com @@ -31081,17 +30953,17 @@ dvmama.com dvmission.com dvr163.com dvrdydns.com +dvsadive.com dvvvs.com dw-microbiology.com dw4.co dwbxg.com dwdds.com -dwejyx.com dwforging.com dwgbj.com dwgszc.com dwgwatch.com -dwhy.net +dwhub.net dwidc.com dwinput.com dwion.com @@ -31127,7 +30999,6 @@ dxclinics.com dxda.com dxdl1688.com dxdlw.com -dxdstar.com dxe520.com dxecs.com dxf6.com @@ -31203,6 +31074,7 @@ dy1905.net dy2018.com dy2066.com dy3j.com +dyaobo2029.com dybeta.com dycar.net dyccb.net @@ -31224,6 +31096,7 @@ dyemp.com dyets-cn.com dyfc.net dyfm200.com +dyfsp88.wiki dyg-hec.com dygf.com dygmotor.com @@ -31242,9 +31115,11 @@ dyjqlrj.com dyjs.com dyjw.info dyjxjt.com +dyjxsj.com dykszx.com dykz66.com dylc.com +dyls.app dyly.com dylyghm.com dymatic.com @@ -31268,13 +31143,11 @@ dyshortvideo.com dysj.com dysji.com dyspcdntip.com -dyswl.com dytmgm.com dytss.com dytt2028.cc dytt789.com dytt7899.com -dytt8.com dytt8.net dytt89.com dytuj6zs26.com @@ -31351,7 +31224,6 @@ dzljy.com dzllzg.com dzmachines.com dzmhospital.com -dzmsite.com dzng.com dzoptics.com dzp.tv @@ -31371,6 +31243,7 @@ dzs2004.com dzsaas.com dzsaascdn.com dzsc.com +dzsdg.com dzsg.com dzsjgroup.com dzsjtjt.com @@ -31383,6 +31256,7 @@ dztester.com dztugongbu.net dztv.tv dztz168.com +dzvv.com dzw3.com dzwad.com dzwebs.net @@ -31477,13 +31351,13 @@ e0575.com e0734.com e0838.com e12345.com +e1288.com e1299.com e12e.com e13000d6f1019.beer e151475d71020.beer e1617.com e1988.com -e1em.cc e213155.com e21cn.com e22a.com @@ -31495,6 +31369,7 @@ e2capp.com e2edesign.com e2esoft.com e2say.com +e307586127f21050.com e32047a8e21fbc0a.com e32a01b94145bb23.com e3492587711012.beer @@ -31511,9 +31386,11 @@ e4008.com e43bb71e710272.beer e44e4e8c11020.beer e452a362210291.beer +e495f363ae7187cf.com e4d0c1f1d1021.beer e4e4c4415fd53198.com e4l4.com +e4xk2cvh.work e508250086b14d75.com e5413.com e5865f69dee0.xyz @@ -31526,6 +31403,8 @@ e5d9384f510292.beer e5e333e55e5e3d.xyz e5hc.com e5n.com +e5sj.com +e5tech.com e600.com e656gps.com e65u.com @@ -31603,6 +31482,7 @@ ear0.com eardatek.com earlytrip.fun earth-science.net +earth-traveller.com earth2037.com earthdq.com earthedu.com @@ -31706,6 +31586,7 @@ easy163.net easy2world.com easy361.com easy888.com +easyapple.net easyar.com easyarvr.com easybug.org @@ -31741,6 +31622,7 @@ easyscholar.cc easysensor.net easysofthome.com easyswoole.com +easytifen.com easytimetv.com easytite.com easytocn.com @@ -31756,10 +31638,10 @@ eaton-samc.com eatonbusbar.com eatuo.com eavic.com -eaw4.com eaydu.com eayh.com eayou.com +eayuan.com eayyou.com eazypharm.com eazytec-cloud.com @@ -31777,7 +31659,6 @@ ebaixing.com ebama.net ebancom.com ebangchina.com -ebangkj.com ebank96518.com ebanma.com ebanshu.net @@ -31785,6 +31666,7 @@ ebaodai.com ebaoquan.org ebaotech.com ebasset.com +ebb6ea72919edea2.com ebbcb476210291.beer ebbf2f9101016.beer ebchina.com @@ -31824,7 +31706,6 @@ ebseek.com ebsfw.com ebt.group ebtang.com -ebtool.com ebtrust.com ebuckler.com ebumbrella.com @@ -31845,6 +31726,7 @@ ec3s.com ec45f2d84111f960.com ec4ca59341009.beer ec4e54545d0e31fa.com +ec6056a95386f752.com ec8j.com ecac1cd921021.beer ecadi.com @@ -31869,7 +31751,6 @@ ecco-market.com eccpos.com ecdag.net ecdnx.com -ecdove.com ecduo.com ece-global.com eceibs.com @@ -31879,7 +31760,6 @@ ecej.com ecer.com ecerdns.com ecerimg.com -eceshi.com ecf-gov.com ecgci.com ecgoods.com @@ -31889,7 +31769,6 @@ echangye.com echao8.com echargenet.com echarpile.com -echartnow.com echatsoft.com echead.com echemsrc.com @@ -31900,7 +31779,6 @@ echinacities.com echinagov.com echinalife.org echinatobacco.com -echippqc.com echo-isoftstone.com echo188.com echoing.tech @@ -31927,6 +31805,7 @@ ecnuas.com ecnudec.com eco-seavol.com eco-system.xyz +ecoalchina.com ecodreamers.com ecoland-plan.com ecoliving168.com @@ -31983,6 +31862,7 @@ ecydm.com ecyti.com ecyzm.com ed-textile.com +ed21.cc ed2k.vip ed2kers.com ed2kk.com @@ -32027,7 +31907,6 @@ edengjiang.com edesson.com edge-byted.com edge-cluster-hk-pre.com -edgeceler.com edgefn.net edgegslb.com edgekey88.net @@ -32068,7 +31947,6 @@ edifier.com edimob.com edingzhuan.com edisec.net -editbanana.net editorjianying.com editsprings.com ediuschina.com @@ -32139,6 +32017,7 @@ edurck.com edushi.com edusoho.com edusoho.net +edusy.net edutalkingdata.com edutao.com edutime.net @@ -32190,7 +32069,6 @@ eeeetop.com eeeff.com eeekkk.com eeeknow.com -eeenav.com eeeqi.net eees.cc eeetb.com @@ -32221,17 +32099,20 @@ eetrend.com eetrust.com eevision.com eeworld.com +eeworm.com eexiaoshuo.com eeyd.com eeyxs.com eeyy.com eeyys.com +eezml.com ef-cdn.com ef17145aecd7dd06.com ef360.com ef360.net ef369594911012.beer efang.tv +efangcdn.com efangwang.com efapiao.com efasco.com @@ -32255,6 +32136,7 @@ efl-tech.com eflagcomm.com eflybird.com eflycloud.com +eflydns.net efmac.net efnchina.com eforclub.com @@ -32368,6 +32250,7 @@ eiafans.com eiccmall.com eickaopei.com eicodesign.com +eicourse.com eicp.net eicp.vip eiczz.com @@ -32376,7 +32259,6 @@ eidcenter.com eidlink.com eidtokencloud.com eifini.com -eifleasing.com eightbridge.com eightedu.com eigpay.com @@ -32439,6 +32321,7 @@ ekaoyan.com ekaoyan365.com ekclubinternational.com ekdoc.com +ekecdn.com ekewy.com ekimmigration.com eking-tech.com @@ -32463,6 +32346,7 @@ elanw.com elascloud.com elawoffice.net elbmodel.com +eldamu.com ele.me ele.to ele001.com @@ -32560,6 +32444,7 @@ elysia.beauty em86.net emai.com email.fund +emaileds.com emailflame.com emailuo.com emailxqq.com @@ -32587,6 +32472,7 @@ embedtrain.org embedu.org embedunion.com embedway.com +embest-tech.com embryform.com embryochina.com embsky.com @@ -32608,6 +32494,7 @@ emeratech.com emergencyexit.xyz emfuture.com emilechouriet.com +emiltorres.com emin123.com eminsheng.com emiretasnbd.com @@ -32651,6 +32538,7 @@ emumax.com emupic.com emushroom.net emwan.com +emzexzfp.com en-micro.com en.tm en51.com @@ -32773,11 +32661,12 @@ enterdesk.net enthalpy.space entive.com entstudy.com +entts.com +enunix.com enuomachinery.net envi-ch.com envisionagents.com envisioncn.com -envtoday.com enwing-tech.com enxicled.com enyamusical.com @@ -32820,9 +32709,11 @@ eolinker.com eomgames.net eomoo.com eomoy.com +eonad.org eonlytech.com eonun.com eoof.net +eoofoo.com eooioo.com eoopoo.com eooqoo.com @@ -32912,12 +32803,12 @@ eqnvip.com eqoavtbu.com eqq.net equalocean.com +equipmentimes.com eqxiu.com eqxiul.com eqxiuzhan.com eqyn.com er07.com -er3w.com eraclean.com eraedu.com eral.com @@ -32937,6 +32828,7 @@ erdiamond.com erdianzhang.com erdong.site erdosedu.com +erdosrcb.com erdossysw.com erelcn.com erentalcarpro.com @@ -32976,11 +32868,11 @@ ermiao.com ernaonet.com ernest.me eroacg.com -erocraft.com erongdu.com erp198.com erp321.com erp321.net +erpingge.com erpwd.com erro.life ersantian.com @@ -33004,7 +32896,6 @@ erya100.com eryajf.net eryanet.com eryi.org -eryinote.com eryyutu.com es-soccer.com es100.com @@ -33042,6 +32933,7 @@ eshow365.com eshufa.com eshuizong.com eshukan.com +eshzp.com esilk.net esinidc.com esipark.com @@ -33087,6 +32979,7 @@ essxp.com essyy.com estandonhotel.com esteellink.com +estelchina.com estonegroup.com estory365.com estrongs.com @@ -33150,14 +33043,15 @@ ethereum.work etian365.com etiantian.com etiantian.net -etimbre.cc etimeusa.com +etitgo.com etiv.me etjy.com etmoc.com etmtoy.com etmwanju.com etocrm.com +etokzt.site etolies.com etomlink.com eton-tech.com @@ -33237,7 +33131,6 @@ euino.com eulike.com eulixos.com eumt.com -euqwl.com eur-go.com eurasia.edu euratao.com @@ -33274,7 +33167,6 @@ evdays.com evdo.vip eve.moe evebattery.com -eveclerdx.com evefashion.com evening.me eventown.com @@ -33295,6 +33187,7 @@ evergrandeauto.com evergrandeservice.com evergrandespring.com evergreen-plastics.com +evergreen2012.org everichgroup.com everisker.com everknight.net @@ -33307,6 +33200,7 @@ everspry.com everstar.xyz everstray.com eversun-chn.com +everybodysuo.com everychina.com everydo.com everyonejun.com @@ -33317,7 +33211,6 @@ evfchina.com evget.com evgezphv.com evhui.com -evhzzh.com evideostb.com evileyesaint.com evilleaker.com @@ -33339,6 +33232,7 @@ evtcn.com evtrust.com evyy.net evzhidao.com +evznl.org evzs.com ew-wirestripping.com ew80.com @@ -33365,6 +33259,7 @@ ewen.co ewenyan.com ewhnzmqncm7.com ewidewater.com +ewidewater.net ewie.net ewin007.com ewinshine.com @@ -33405,6 +33300,7 @@ exaphotons.com exbaotuan.com exbapp.com exbot.net +exc-resin.com excake.com excalibur.link excarepharm.com @@ -33412,6 +33308,7 @@ excbio.com excean.com exceedconn.com excegroup.com +excegroupur.com excel8.com excel880.com excelbbx.net @@ -33442,9 +33339,9 @@ exmay.com exmetis.com exmoo.com exmrw.com +exnpk.com exntech.com expba.com -expdiy.com expdns.net expec-tech.com expensiveg.com @@ -33470,13 +33367,13 @@ expoquan.com expotu.com expowindow.com expozh.com -exprank.com expressboo.com expresscompanynetwork.com expreview.com exprun.com expsky.com exquisite-automotive.com +exscapesmoke.com exsvc.net ext2fsd.com extech-sh.com @@ -33562,6 +33459,7 @@ eyugame.com eyunidc.com eyunzhu.com eyuyan.com +eyuyan.la eyuyao.com eyuzhu.com eywedu.com @@ -33684,6 +33582,7 @@ f6d4a4f461010.beer f6yc.com f704204fa11021.beer f71f38e6a1015.beer +f746c2da252336a6.com f7777.net f79ca805111881f6.com f79f9e5b71019.beer @@ -33692,6 +33591,7 @@ f7chinavip.com f7e84829210281.beer f7yuncdn.com f800909401015.beer +f8167007e7bf667d.com f831fb9ce11031.beer f8e772f41348c086.com f92ec0629f52f064.com @@ -33704,6 +33604,7 @@ fa-tojoin.com fa2da1f5b1024.beer fa80a608ec3e1ead.com faadcf6d01009.beer +faakee.com faanw.com faayoo.com fabao365.com @@ -33792,7 +33693,6 @@ faiusrd.com faiww.com fajiayun.com fajihao.com -faka.it fakamiao.com fakamiao.shop fakeloc.cc @@ -33805,7 +33705,9 @@ famascro.com fameile.net fameirui.com famen163.com +famenbaike.com famens.com +famens.vip famensi.com family-marathon.com familyincloud.com @@ -33846,6 +33748,7 @@ fang.com fang.xin fang24k.com fang33.com +fang668.com fang91.com fang99.cc fang99.com @@ -33863,7 +33766,6 @@ fangda-specialsteels.com fangda.com fangdacarbon.com fangdaijisuanqi.com -fangdailixi.com fangdaquan.com fangdd.com fangdichanceo.com @@ -33965,7 +33867,6 @@ fankebang.com fankhome.com fankuweb.com fanli.com -fanliang.cc fanlibei.com fanlihe.com fanlihi.com @@ -33982,6 +33883,7 @@ fanpanjidain.com fanpusoft.com fanqianbb.com fanqiang.com +fanqianxs.com fanqianzhushou.com fanqie.im fanqiecopyright.com @@ -34064,12 +33966,16 @@ fanyitec.com fanyouvip.com fanyu.com fanyu.work +fanyuip.com fanzehua.com fanzhidu.com +fanzhiyang.com fapharm.com fapiao.com fapiao365.com fapiaobang.com +faq-whtasapp.com +faq-whtasapp.net faqianjia.com faqiren.com far-china.com @@ -34089,9 +33995,11 @@ farmkd.com farmsec.com farsee2.com farsightdev.com +farsiightppc.com fas-bee.com fasensor.com fashaoyou.net +fashengba.com fashilawfirm.com fashionan.com fashionszshow.com @@ -34099,6 +34007,7 @@ fashiontrenddigest.com fashuounion.com fasionchan.com fast-eyes.com +fast-heat-cartridge-heaters.com fast.im fastadmin.net fastapi.net @@ -34177,7 +34086,6 @@ fb32dc52302e6b9b.com fb46cd5483f029aa.com fb4bc82f71019.beer fb56.com -fb71ef91e1014.beer fbaichuan.com fbank.com fbatop.com @@ -34192,7 +34100,6 @@ fblsj.com fbook.net fbpaas.com fbsjedu.com -fbxd.info fbxslw.com fbyvalve.com fc0531.com @@ -34216,6 +34123,7 @@ fccs.com fccscar.com fccxgjg.com fcczp.com +fcd2448c6211c5a6.com fcdecb0b610261.beer fcg01.com fcg0770.com @@ -34283,11 +34191,11 @@ fdctax.com fdcyun.com fdczbstatic.com fdd0cd79c10281.beer -fddhlaw.com fdeent.org fdeer.com fdevops.com fdf46bd061024.beer +fdfhtl.com fdfinvoice.com fdgearbox.com fdjskf.com @@ -34340,6 +34248,7 @@ feel-bar.com feelcars.com feelchat.net feelec.net +feelnowtrip.com feelsoar.com feemoo.com feemoo.hk @@ -34378,6 +34287,7 @@ feida-china.net feidacrusher.com feidaep.com feidagroup.com +feidaoboke.com feidavalve.com feidazuanji.com feidee.com @@ -34430,7 +34340,6 @@ feilixi888.com feilu.cc feilvway.com feimalv.com -feimanhua.com feimaoweb.com feimaoyun.com feimawaiqin.com @@ -34507,7 +34416,6 @@ feiyouyun.com feiyu.com feiyuapi.com feiyue.online -feiyue15.com feiyueconglin.com feiyuhu.com feiyun.cc @@ -34556,7 +34464,6 @@ feng1.com fengakj.com fengaomedical.com fengba888.com -fengbaikeji.com fengbangleasing.com fengbao.com fengbohan.com @@ -34564,13 +34471,14 @@ fengbolive.com fengbuy.com fengcaijiaju.com fengchaoyuan.com +fengche.us fengchengroup.com fengchizixun.com fengchuanba.com +fengchui.cc fengchusheng.com fengcms.com fengcx.com -fengda.me fengdu.com fengdu365.com fengdufrp.com @@ -34607,6 +34515,7 @@ fengkuangzaoren.com fengkui.net fenglao.org fengli.com +fengli.su fengliankeji.com fenglichem.com fenglingkj.com @@ -34628,6 +34537,7 @@ fengpintech.com fengread.com fengse.com fengshangroup.com +fengshangweekly.com fengshankeji.com fengshi8888.com fengshigroup.com @@ -34663,6 +34573,7 @@ fengyunpdf.com fengyushan.com fengyx.com fengzegroup.com +fengzhan.vip fengzhangame.net fengzhao.net fengzigame.com @@ -34680,7 +34591,6 @@ fenlekeji.com fenliu.net fenmitech.com fennessy.hk -fenno.ai fenqile.com fenqix.com fenqubiao.com @@ -34747,7 +34657,6 @@ ffe06ebc91024.beer ffe0be9f91019.beer ffeeii.com ffepower.com -fffff.games fffont.com ffhome.com ffis.me @@ -34861,6 +34770,7 @@ filfox.info fillersmart.com fillseo.com film-yuelongchina.com +filteringlist.com fily.fun fim34s.com fimmu.com @@ -34874,6 +34784,7 @@ financialdatamining.com financialstreetforum.com finchina.com finclip.com +finddanandlaura.com finderweb.net findhro.com findic.com @@ -34886,7 +34797,6 @@ findmyfun.xyz findmyrepair.com findoout.com findshu.net -findskill.com findxk.com findxz.com findyou.xin @@ -34926,7 +34836,6 @@ finovo.com finshell-cib.com fintechinchina.com fintechquan.com -fintopia.tech finupgroup.com finzfin.com finzjr.com @@ -34968,6 +34877,7 @@ fishcn.com fisherac.com fisherv.com fishfay.com +fishfd.com fishflying.net fishin2boat.com fishing-sh.com @@ -34990,6 +34900,12 @@ fitit100.com fitoneapp.com fittentech.com fittingcn.com +fiu07021kl.com +fiu07040kl.com +fiu07050kl.com +fiu07060kl.com +fiu07070kl.com +fiu07090kl.com fiui.org fivecakes.com fivedo.net @@ -35014,7 +34930,6 @@ fj3c.net fj888.com fj96336.com fj987.com -fjadd.com fjbcjt.com fjbdex.com fjber.com @@ -35057,6 +34972,7 @@ fjguanyue.com fjhaizu.com fjhcw.com fjhospital.com +fjhps.com fjhrjt.com fjhssy.com fjhuayagroup.com @@ -35088,6 +35004,7 @@ fjlh.com fjlib.net fjllsn.com fjlstz.net +fjlszbc.com fjly.com fjlygroup.com fjlyrmyy.com @@ -35100,8 +35017,6 @@ fjmlh.com fjmotor.net fjmstc.com fjmzw.com -fjmzx.com -fjndqx.com fjndwb.com fjnet.com fjnhjt.com @@ -35146,10 +35061,11 @@ fjtd-logistics.com fjtelecom.com fjtp.net fjtv.net +fjtzlt.com +fjvs.org fjwanan.com fjwjgs.com fjwr.xyz -fjwyw.com fjwzjt.com fjxfgroup.com fjxhfx.com @@ -35161,9 +35077,11 @@ fjxsxx.com fjxwx.com fjxxal.com fjybyjjysos.com +fjyc8.com fjycw.com fjydnews.com fjyfjsjt.com +fjyklc.com fjyunba.com fjyxdm.com fjyxgl.com @@ -35195,6 +35113,7 @@ fktool.com fkw.com fkw100.com fkwapi.com +fkwatchtw.com fkwvya4035.vip fkyuer.com fkyun.com @@ -35264,6 +35183,7 @@ flourish-fs.com flowchemchina.com flower188.com flowerknows.co +flowever.net flowinnglobal.com flowlbkj.com flowportal.com @@ -35317,6 +35237,7 @@ flymeos.com flymeyun.com flyml.net flymobi.biz +flymodem.net flymopaper.com flyneutron.com flysand.com @@ -35391,6 +35312,7 @@ fnyes.com fob123.com fob580.com fobaoyou.com +fobbusinessforum.com fobcentury.com fobmy.com fobshanghai.com @@ -35471,6 +35393,7 @@ fooleap.org foomx.com foooooot.com foosheng.com +football8888.store footballdown.com footbig.com footseen.com @@ -35523,6 +35446,7 @@ fornature.com forrealbio.com forrelaxing.com forrerri.com +forshine.net forsol.net forsou.com forthxu.com @@ -35537,7 +35461,6 @@ fortunevc.com forwardgroup.com forwe.store forwell-parking.com -foryao.ltd foryou56.com foryouge.com foryougroup.com @@ -35597,6 +35520,7 @@ fox008.com foxconn.com foxirj.com foxmail.com +foxphp.com foxqq.com foxtable.com foxuc.com @@ -35658,6 +35582,7 @@ fqxs.org fqxsw.cc fr-trading.com fr0528.art +fr2007.com fractal-technology.com fraeco.com fraee.com @@ -35680,6 +35605,7 @@ fredamd.com fredestiny.com free-863.com free-api.com +free-e.net free-img.com free9.net freebuf.com @@ -35718,6 +35644,7 @@ freeydch.com freeyun.com freezhw.com freezl.net +frefloya.com frensworkz.com freqchina.com fresh-ideas.cc @@ -35814,7 +35741,6 @@ frp-ski.com frp-sun.com frp-tag.com frpapp.com -frrcw.com frt.ltd frtgraphite.com fruitday.com @@ -35876,7 +35802,6 @@ fsightai.com fsilon.com fsjgchina.com fsjgw.com -fsjiaoyubang.com fsjinlan.com fsjinma.com fsjoy.com @@ -35884,7 +35809,6 @@ fsjrl.com fsjsdtc.com fsjx.org fsjy.net -fsk-download.com fsky.pro fskzpw.com fslgz.com @@ -35961,7 +35885,6 @@ fthgz.com fthimalayandb.com ftihzjg.com ftium4.com -ftj003.com ftlcloud.com ftls.xyz ftlzghz.com @@ -35985,6 +35908,7 @@ ftylw.com ftzn.net fu-guan.com fu-rui.com +fu2zu.com fu57.com fuanna.com fubabafumama.com @@ -35996,7 +35920,6 @@ fubonplastic.com fuca-china.com fucantec.com fuchaipower.com -fuchenkj.com fuchuangyu.com fucnm.com fucol.club @@ -36040,7 +35963,6 @@ fuhaoku.com fuhefu.com fuheng.org fuhouyin.com -fuhuayun.asia fuhuibao.club fui.im fuiou.com @@ -36060,6 +35982,7 @@ fuka.cc fukangjixie.com fukangqipai.com fukangyuanyanglao.com +fuke39.com fukexie.com fulantv.com fulengen.com @@ -36086,6 +36009,7 @@ fullics.com fulllinks.com fullluckcalendar.com fullsemitech.com +fulltech.work fulltruckalliance.com fulou.life fultree.com @@ -36156,7 +36080,6 @@ fupanwang.com fupin832.com furagon.com furama-beihai.com -furapi.com furderdriving.com furenchina.com furenkeji.com @@ -36202,7 +36125,6 @@ fututrustee.com fuwa.org fuwahgroup.com fuwai.com -fuwaihospital.org fuwaliuxue.com fuwei.com fuweifilms.com @@ -36229,6 +36151,7 @@ fuyang.com fuyang.net fuyangbio.com fuyangjituan.com +fuyangren.org fuyangtv.com fuyaogroup.com fuyaozb.com @@ -36238,7 +36161,6 @@ fuyingkeji.com fuyingyanke.com fuyiou.com fuyiwang.net -fuyizk.com fuyou.online fuyou888.com fuyoubank.com @@ -36278,11 +36200,14 @@ fwdq.com fwdqw.com fwfly.com fwhzxxgbyy.com +fwljmwf.com fwlxtc.com +fwqje67h.work fwqlt.com fwqtg.net fws-china.com fwvv.net +fwwevez.xyz fwxgx.com fx-plc.com fx120.net @@ -36393,11 +36318,9 @@ fygjyljt.com fygmbc.com fygroup.com fygsoft.com -fyhbxh.com fyjl.org fyjsz.net fyjzyxh.com -fykxjs.com fylcg.com fyleasing.com fyluo.com @@ -36456,7 +36379,6 @@ fyxxwb.com fyxz.com fyydnz.cc fyynlx.com -fyyxzz.com fyyy.com fyzku.com fyzls.com @@ -36488,6 +36410,7 @@ fzele.com fzengine.com fzentertainment.com fzetyy.com +fzfhg.com fzfinancing.com fzfrp.com fzfu.com @@ -36495,6 +36418,7 @@ fzfzjx.com fzg360.com fzghy.com fzgolden.com +fzhlkx.com fzhqzx.net fzhzxh.com fzithome.com @@ -36585,8 +36509,15 @@ g5h.com g5h4.com g5kj.com g63.fun +g66667777.com g768r.com +g77775555.com +g77776666.com +g7bd307de.skin g80mx.com +g82btd54.work +g88885555.com +g88886666.com g8hh.com g983.com g9china.com @@ -36620,12 +36551,14 @@ gagaga.icu gagaga.tech gagahi.com gai.net +gaiabiohx.com gaiamount.com gaiaworkforce.com gaibang365.com gaibar.com gaibieshu.net gaicas.com +gaigeshen.work gainchip.com gainda.net gaineng.net @@ -36648,6 +36581,7 @@ gaiyazhanlan.com gaizhui.com gajerseys.com gajsk.com +gal3d.info gala-v.com galaxix.com galaxy-adx.com @@ -36799,6 +36733,7 @@ gank-studio.com gank.io gankang.com gankao.com +gankaomao.com gankaosheng.com gankgames.com gankh5.com @@ -36829,6 +36764,7 @@ ganyeah.com ganyu.com ganyu8.net ganyurc.com +ganzhe.com ganzhishi.com ganzhong.net ganzitv.com @@ -36845,6 +36781,7 @@ gaocangyun.com gaoce.cc gaocegege.com gaochun.info +gaoda8.com gaodage.com gaodangbiao.com gaode.com @@ -36875,7 +36812,6 @@ gaohr.com gaohuasec.com gaojer.com gaoji.ren -gaojidata.com gaojie.com gaojihealth.com gaojima.com @@ -36898,11 +36834,9 @@ gaokowl.com gaokw.com gaokzx.com gaolian.com -gaolianggame.com gaoligroup.com gaolihanjie.com gaolouimg.com -gaomaipharma.com gaomeif.com gaomeluo.com gaominews.com @@ -36950,6 +36884,7 @@ gaoxinedu.com gaoxinedu.net gaoxinjy.com gaoxitech.com +gaoyawang.com gaoyizaixian.com gaoyoujob.com gaozhaiedu.com @@ -37014,6 +36949,7 @@ gbase8a.com gbasig.com gbdex.com gbdz.net +gbeca.org gbffchina.com gbgba.com gbgcn.com @@ -37064,7 +37000,6 @@ gckychina.com gcl-et.com gcl-perovskite.com gcl-power.com -gclawyer.net gcld.net gclhgc.com gcloudcache.com @@ -37072,6 +37007,7 @@ gcloudcs.com gcloudcstest.com gcloudcstestonly.com gclouddolphin.com +gcloudf.com gcloudgbs.com gcloudsdk.com gcloudsvcs.com @@ -37094,7 +37030,8 @@ gcwduoduo.com gcwith.com gcykj.com gcyts.com -gcyvm.com +gcyy08.com +gczyg.com gd-chenxing.com gd-chuangfu.com gd-dl.com @@ -37119,6 +37056,7 @@ gd-tianyue.com gd-wanxi.com gd-weisi.com gd-xrsd.com +gd1580.com gd165.com gd2000.org gd2h.com @@ -37167,7 +37105,6 @@ gdccus.org gdcdsh.com gdceg.com gdcgkg.com -gdcgkj.com gdchanbo.com gdchess.com gdchjt.com @@ -37213,6 +37150,7 @@ gddingxin.com gddjauto.com gddlaaa.com gddlkj.com +gddmsmc.com gddqfs.com gddqfs.net gddrcgzjt.com @@ -37236,6 +37174,7 @@ gdfcjz.com gdfeiyang.com gdfenxiao.com gdfgq.club +gdfjsh.org gdfplaza.com gdfs.com gdfshx.com @@ -37245,6 +37184,7 @@ gdfzsy.com gdgajt.com gdganhua.com gdgassoc.com +gdgcjhf.com gdgczb.com gdggkf.com gdghg.com @@ -37256,7 +37196,6 @@ gdgrsw.com gdguangdong.com gdguozhi.com gdgwyw.com -gdgxw.com gdgxxbw.com gdgzhengzhou.com gdgzrb.com @@ -37272,6 +37211,7 @@ gdhfjt.com gdhfkg.com gdhhgroup.com gdhhjs.net +gdhhotels.com gdhjtz.com gdhla.com gdhmgc.com @@ -37283,7 +37223,6 @@ gdhtcm.com gdhuana.com gdhuaxun.net gdhuaya.com -gdhuazhuang.net gdhwater.com gdhwgf.com gdhwjl.com @@ -37363,7 +37302,6 @@ gdmca.org gdmhjjt.com gdmia.com gdminda.com -gdmm.biz gdmm.com gdmoa.org gdmschina.com @@ -37484,6 +37422,7 @@ gdszxh.com gdtaihao.com gdtap.com gdtc.cc +gdtcoin.com gdtcyy.com gdtengen.com gdtengnan.com @@ -37515,6 +37454,7 @@ gdvolunteer.net gdwanlv.com gdwanshun.com gdwbyq.com +gdwca.com gdwczb.com gdweilaisw.com gdwha.org @@ -37532,6 +37472,7 @@ gdxdpg.com gdxdy.com gdxfl.com gdxindun.com +gdxinqiang168.com gdxinxiang.com gdxise.com gdxjzx.org @@ -37547,7 +37488,6 @@ gdyd.com gdydgj.com gdydzb.com gdyeb.com -gdyfxx.com gdygsk.com gdyhgn.com gdyhsp.com @@ -37655,8 +37595,8 @@ geekdive.com geekefu.com geekercloud.com geekerconsulting.com +geekerhua.com geekfans.com -geekhour.net geeklei.com geekluo.com geekmaker.com @@ -37703,6 +37643,7 @@ gegejia.com gegemm.work gegeselect.hk gegeyingshi.com +gehaowu.com gehope.com gehua.com gehua.net @@ -37719,9 +37660,7 @@ geimian.com geindex.com geiniwan.com geizan.cc -gejsg.com gelaha.com -gelaiyun.net gelicang.net geline.net gelinya.com @@ -37766,9 +37705,7 @@ genevoyager.com geneway-bio.com geneworldcn.com genfleet.com -genforce-tech.com gengchuangz.com -gengdd.com gengfuwang.com genghai.com gengleyuan.com @@ -37851,6 +37788,7 @@ geswl.com get-shell.com get.vip get233.com +getcai.com getddhospi.com getehu.com getelighting.com @@ -37863,6 +37801,7 @@ getmarkman.com getpm.com getquicker.net getrebuild.com +getsetgadget.com getsurfboard.com gettopacoustic.com getu.fun @@ -37873,6 +37812,7 @@ getvidi.co gewala.com gewara.com gewei-wh.com +gewei.com geweng.com gewu.vc gewuer.com @@ -37957,6 +37897,7 @@ gfnormal07ai.com gfnormal08ag.com gfnormal08as.com gfnormal08at.com +gfnormal09ag.com gfnormal09aq.com gfnormal09ar.com gforward.org @@ -38027,6 +37968,7 @@ gghb.cloud gghosp.net gghs.info gghualong.com +gghx120.com gghy.org gginto.com ggjcpm.com @@ -38036,6 +37978,7 @@ ggjstz.com ggjszp.com ggjt.com ggjtfw.com +ggksw.com ggkuai.com ggl.com gglenglish.com @@ -38055,6 +37998,7 @@ ggqunshanmuye.com ggqx.com ggrcw.com ggren.net +ggrsmy.com ggrsrc.com ggsafe.com ggsfcw.com @@ -38110,6 +38054,7 @@ ghddi.org ghdoor.com ghed119.com ghedu.com +ghfdc.org ghgglobal.com ghglzx.com ghgy.com @@ -38204,7 +38149,6 @@ giho.com giihg.com giikin.com giiktop.com -giiport.com giiso.com gijsq.com gildata.com @@ -38224,8 +38168,9 @@ gingyan.com ginlong.com ginshio.org ginwa.com -ginza7.win gio.ren +gio07231rp.com +gio07250rp.com gioccc.com giocdn.com giomeru.com @@ -38290,6 +38235,7 @@ gjgzpw.com gjhgroup.com gjhl.com gjj.cc +gjjcxw.com gjjnhb.com gjjsbz.com gjkdwl.com @@ -38316,6 +38262,7 @@ gjxzq.com gjydz.com gjyuxiang.com gjyys.com +gjzy.com gk-cn.com gk-net.com gk-z.com @@ -38366,12 +38313,14 @@ gkzy100.com gkzyb.com gkzzd.com gl-data.com +gl-mes.com gl-qf.com gl-uav.com gl-zj.com gl102.com gl114.net gl170.com +gl17u.com gl18.com gl258.com gl2mt.com @@ -38414,6 +38363,7 @@ gldaewoo.com gldjc.com gleasy.com glecan.com +glelec.com gleyy.com glface.com glfangzhen.com @@ -38437,6 +38387,7 @@ glgzlq.com glhcjs.com glhclv-kool.com glhdq.com +glhfmy.com glhfsy.com glhmmr.com glhospital.com @@ -38472,6 +38423,7 @@ gljtxjy.com gljygd.com gljykj.com gljyrj.com +gljzgs.com glk7.com glkgjt.com glkths.com @@ -38497,6 +38449,7 @@ global-dba.com global-download.acer.com global-harbor.com global-idc.net +global-jf.com global-ks-cdn.com global-leader.com global-otc.com @@ -38546,9 +38499,11 @@ glorysoft.com gloryview.com glorze.com glosellers.com +glosku.com glosspp.com glowapp.fun glowapp.vip +glowoman.org glpenhui.com glplyf.com glqh.com @@ -38565,6 +38520,7 @@ glsdhnt.com glseed.com glsgmr.com glshimg.com +glsmy024.com glsstm.com glsxdlkj.com glsyjd.com @@ -38585,7 +38541,9 @@ glwxw.net glwyhd.com glxcc.net glxcjt.com +glxd.com glxhzs.com +glxiaoyaohu.com glxinhu.com glxkbz.com glxsyx.vip @@ -38610,6 +38568,7 @@ glzeasun.com glzfst.com glzh-szzx.site glzhcyy.com +glzhealth.com glzip.com glzizhu.com glzj88.com @@ -38646,6 +38605,7 @@ gmdt9b.com gmdun.com gmecn.com gmed.cc +gmedata.com gmeditech.com gmedtech.com gmem.cc @@ -38778,6 +38738,7 @@ godele.com godgy.xyz godic.net godida.com +godo.pub godoor.com godotcn.com godsheepteam.com @@ -38791,6 +38752,7 @@ goertek.com goetheslz.com gofarqzyy.com goforandroid.com +goframe.org gofreeplay.com gofrp.org gogbuy.com @@ -38816,11 +38778,13 @@ goi08130kh.com goi08160kh.com going-link.com gojiaju.com +gojira.net gokaigai.com goke.com gokemicro.com gokuai.com golahsg.com +golang8.com golanger.com golangroadmap.com golangw.com @@ -38897,7 +38861,6 @@ gomecloud.com gomegj.com gomeholdings.com gomehome.com -gomeishop.com gomeplus.com gomo.com gomocdn.com @@ -38925,7 +38888,6 @@ gongjiaomi.com gongjiyun.com gongju.com gongju5.com -gongjucha.com gongjux.com gongkaohub.com gongkaoleida.com @@ -38948,8 +38910,6 @@ gongshiku.com gongsibao.com gongsizhang.com gongsizhijia.com -gongwenbao-ai.com -gongwenbao666.com gongxiangcj.com gongxiangjizhang.com gongxiao8.com @@ -38963,7 +38923,6 @@ gongyeku.com gongyelian.com gongyeyun.com gongyeyunwang.com -gongyi.center gongyi.la gongyi.net gongyi.xin @@ -39096,7 +39055,6 @@ gorouter.info gorse.com gortune.com gosailgis.com -goshare2.com goshijia.com goshopjp.com gosinoic.com @@ -39123,6 +39081,7 @@ gotocoding.com gotodn.com gotofreight.com gotohui.com +gotohz.com gotohzrb.com gotoip.net gotoip1.com @@ -39148,6 +39107,7 @@ goufang.com goufw.com gougoujp.com gouguoyin.com +gouhai.com gouhao.com gouhaowang.com gouhuasuan.shop @@ -39191,6 +39151,7 @@ gowinlease.com gowinxp.com gowlc.net gowmo.com +gowonganinn.com goyihu.com goyoo.com gozap.com @@ -39250,13 +39211,13 @@ gptkong.com gpubgm.com gpuez.com gpuztrvt.com -gpxiazai.com gpxiv5kew4mvk.com gpxxz.com gpxygpfx.com gpxz.com gpxzw.com gpydxl.com +gq60.com gqbmt.com gqgkj.com gqjd.net @@ -39268,7 +39229,7 @@ gqsj.cc gqsoso.com gqsyk.com gqt168.com -gqyvyq.com +gqxtq.com gr-hospital.com gra-moissanitesorg.com grablan.com @@ -39333,6 +39294,7 @@ greatwuyi.com gredmedic.com gree-jd.com gree.com +greebox.com greedc.com greedongaohotel.com greefinance.com @@ -39365,6 +39327,7 @@ greplay.com grescw.com gretf.com greyli.com +greywolfcdn.net greywolffast.com greywolfns.com grfexpo.com @@ -39410,6 +39373,7 @@ growthbox.net grpindex.com grria.net grspet.com +grstz.com grt-china.com grtrelay.com grtsports.com @@ -39425,6 +39389,7 @@ grzq.com gs-cdn.com gs090.com gs12122.com +gs14.com gs1cn.org gs2.ww.prod.dl.playstation.net gs307.com @@ -39441,6 +39406,7 @@ gscdn.pub gschaos.club gscidc.net gsdk.tv +gsdpw.com gsdtfx.com gsdyjsgs.com gseen.com @@ -39504,6 +39470,7 @@ gsslxh.com gsstargroup.com gsstic.com gsstock.com +gsstsdgs.com gsswtz.com gst.prod.dl.playstation.net gstarcad.com @@ -39563,7 +39530,6 @@ gter.net gtetern.com gtfund.com gtg56.com -gtgjtrip.com gtgqw.com gtgres.com gtht.com @@ -39670,7 +39636,6 @@ gtzy123.com gu166.com gu360.com gua123.com -gua9.com guabu.com guaguay.com guahao-inc.com @@ -39777,6 +39742,7 @@ guangxilonghua.com guangxima.com guangximinhang.com guangxinengyuan.com +guangxipubeihuaheng.com guangxircw.com guangxishangfu.com guangxishuizhiyangzhigongsi.com @@ -39820,7 +39786,6 @@ guanjiajf.com guankou.net guanlannet.com guanli360.com -guanlingms.com guanlixi.com guanliyun.com guanmeikj.com @@ -39891,6 +39856,7 @@ gugeapps.net gugezg.com gugong.net gugu.fun +gugud.com gugudang.com gugudata.com guguread.com @@ -39935,6 +39901,7 @@ guikangmaterials.com guikuan.com guilinaohu.com guilincyjt.com +guilinhd.com guilinhengda.com guilinihg.com guilinjizhuangxiang.com @@ -39949,6 +39916,7 @@ guilintravel.com guiluohuang.com guimamuye.com guimengjob.com +guimengning.com guimengshangeng.com guinsoft.com guipeibao.com @@ -39968,6 +39936,7 @@ guitarpro.cc guitarq.com guitongmy.com guitu18.com +guiwang.org guiweilian.com guixiaozi.com guixue.com @@ -39982,6 +39951,7 @@ guizhougames.com guizhougas.com guizhoushengyang.com guizhutanglao.com +gujianba.com gujing.com gujinshici.com gujiushu.com @@ -40040,6 +40010,7 @@ guocool.com guocuijingju.com guodashi.com guodatzjt.com +guodegang.org guodi.net guodiana.com guodingnet.com @@ -40060,6 +40031,7 @@ guogongxin.com guoguangmold.com guoguo-app.com guohanlawfirm.com +guohaokeji.com guohongxin.com guohu360.com guohua88.com @@ -40092,7 +40064,6 @@ guokang.com guokelonghui.com guoketest.com guokeyun.com -guoko.com guokongqixie.com guokr.com guokr.io @@ -40177,9 +40148,7 @@ guozhenyi.com guozhivip.com guozhuan.com guozhuangxincai.com -guozi-robotics.com guoziyx.com -guozunlaw.com gupang.com gupaoedu.com gupei.com @@ -40208,7 +40177,6 @@ gushidi.com gushiji.cc gushiju.net gushiwen.org -gusiwen.com gusspro.com gusucaishui.com gusuwang.com @@ -40262,11 +40230,13 @@ gwdzkj.com gweike.com gwell.cc gwenorcasv1.com +gwepy.org gwetech.com gwfls.com gwfx.net gwgl168.com gwgsc.com +gwi.cc gwidc.com gwin-cn.com gwinbody.com @@ -40284,6 +40254,7 @@ gwozai.com gwpdi.com gwpp.net gwpstools.com +gwsdns.com gwtt.com gwwg.com gwxeda.com @@ -40343,7 +40314,10 @@ gxalt.com gxanchen.com gxankao.com gxantu.com +gxany.com +gxaoma.com gxar.com +gxarl.com gxasjc.com gxasjn.com gxawjmy.com @@ -40354,6 +40328,7 @@ gxb.io gxbaichen.com gxbaidu.net gxbaidutg.com +gxbaifugch.com gxbaikuang.com gxbakj.com gxbaozhiyue.com @@ -40424,6 +40399,7 @@ gxcatv.com gxcbjs.com gxcbljt.com gxccblg.com +gxccedu.com gxccjt.com gxcd.pw gxcdc.com @@ -40444,6 +40420,7 @@ gxchengyun.com gxchlrf.com gxchr.com gxchuanghua.com +gxchuanlan.com gxchuen.com gxchunmao.com gxchuxin.com @@ -40459,6 +40436,7 @@ gxclzz.com gxcmgr.com gxcmicc.com gxcncec.com +gxcodemaker.com gxcors.com gxcounty.com gxcpa.com @@ -40479,6 +40457,7 @@ gxcsycj.com gxcsypm.com gxcszm.com gxctc.net +gxctd.com gxcthb.com gxcti.com gxctzb.com @@ -40500,12 +40479,14 @@ gxdajixiong.com gxdake.com gxdanbao.com gxdangan.com +gxdansi.com gxdanzo.com gxdaos.com gxdaosheng.com gxdbdl.com gxdbxrmyy.com gxdco.net +gxdcwh.com gxddcs.com gxddtz.com gxddzl.com @@ -40529,6 +40510,7 @@ gxdlxy.com gxdlzl.com gxdmds.com gxdmsq.com +gxdmtrade.com gxdna.com gxdnu.com gxdong.com @@ -40627,6 +40609,7 @@ gxfxm.com gxfxwh.com gxfxzb.com gxfybj.com +gxfygp.com gxfysteel.com gxfyzx.com gxfzf.com @@ -40652,6 +40635,7 @@ gxgcfscl.com gxgcjs.com gxgczxjt.com gxgd192.com +gxgdbg.com gxgdhg.com gxgdlsp.com gxgdpg.com @@ -40703,6 +40687,7 @@ gxgoodfirst.com gxgp123.com gxgpo.com gxgpzhtc.com +gxgqdz.com gxgqsn.com gxgrasp.com gxgree.com @@ -40723,6 +40708,7 @@ gxgtxny.com gxgtzb.com gxgtzx.com gxguanghui.com +gxguangxin.com gxguangyi.com gxguantai.com gxguanyu.com @@ -40743,6 +40729,7 @@ gxguojingjiuye.com gxguoyang.com gxguyu.com gxgwmb.com +gxgwyw.org gxgxjc.com gxgxncplm.com gxgxun.com @@ -40797,6 +40784,7 @@ gxhgx.net gxhgzb.com gxhgzc.com gxhh.com +gxhhgc.com gxhhgs.com gxhhhb.com gxhhig.com @@ -40827,6 +40815,7 @@ gxhongchuan.com gxhonggang.com gxhongning.com gxhongshimuye.com +gxhongyunsi.com gxhongzh.com gxhope.org gxhospital.com @@ -40842,6 +40831,7 @@ gxhrkj.com gxhs.site gxhsba.com gxhsjgs.com +gxhsltd.com gxhsry.com gxhsshj.com gxhsshjzl.com @@ -40863,6 +40853,7 @@ gxhuanbaojt.com gxhuaqu.com gxhuar.com gxhuaxing.com +gxhuaxintech.com gxhui.com gxhuicuibencao.com gxhuifa.com @@ -40878,13 +40869,16 @@ gxhxgroup.com gxhxh.com gxhxysgs.com gxhxyyjt.com +gxhxzyh.com gxhyart.com gxhydq.com gxhyey.com gxhygg.com gxhykglass.com +gxhyq.com gxhyscl.com gxhysm.com +gxhyww.com gxhyxf.com gxhyxt.com gxhyz168.com @@ -40895,7 +40889,9 @@ gxhzjsgc.com gxhzsbwg.com gxhzsqyg.com gxhztqt.com +gxhzxk.com gxhzxw.com +gxhzyd.com gxi.ink gxiang.org gxibvc.net @@ -40948,6 +40944,7 @@ gxjhcj.com gxjhgczx.com gxjhgd.com gxjhgs.com +gxjhjcw.com gxjhjdsb.com gxjhjs.com gxjhky.com @@ -40963,6 +40960,7 @@ gxjianyi.com gxjiaohang.com gxjiasheng.com gxjiatai.com +gxjichang.com gxjiebai.com gxjiefeng.com gxjien.com @@ -40987,6 +40985,8 @@ gxjjb.com gxjjfds.com gxjjfjt.com gxjjgy.com +gxjjh.com +gxjjyb.com gxjkamc.com gxjkhj.com gxjkjg.com @@ -40994,6 +40994,7 @@ gxjkjyjc.com gxjkwy.com gxjl99.com gxjla.com +gxjljz.com gxjlkj.com gxjlnm.com gxjlrc.com @@ -41044,11 +41045,15 @@ gxjxcloud.com gxjxsy.com gxjxwh.com gxjycjsb.com +gxjyfdc.com gxjyfkj.com gxjygljt.com +gxjyh.store +gxjyhb.com gxjyjs168.com gxjyjt.com gxjyjz.com +gxjyxxw.com gxjyy.com gxjyzl.com gxjyzyw.com @@ -41116,6 +41121,7 @@ gxlanbowang.com gxlanco.com gxlancogroup.com gxlanlian.com +gxlansheng.com gxlbang.com gxlbbwg.com gxlbi.com @@ -41168,6 +41174,7 @@ gxljjt.com gxljxs.com gxlke.com gxlkjy.com +gxlkl.net gxllsw888.com gxlmjt.com gxlmzs.com @@ -41256,6 +41263,7 @@ gxmjzs.com gxmk.net gxmlba.com gxmlyjy.com +gxmmhgs.com gxmmkt.com gxmoking.com gxmqhb.com @@ -41302,6 +41310,7 @@ gxnmzj.com gxnncj.com gxnnclt.com gxnndghb.com +gxnnedu.com gxnnfx.com gxnnhexiexinli.com gxnnip.com @@ -41327,9 +41336,11 @@ gxnongmu.com gxnpzbx.com gxnsjt.com gxntjz.com +gxnumba.com gxnun.net gxnwjt.com gxnxdb.com +gxnxgd.com gxnydq.com gxnzjz.com gxnzzy.com @@ -41375,6 +41386,7 @@ gxqdkj.com gxqfjzzs.com gxqgjx.com gxqgps.com +gxqhcm.com gxqhjc.com gxqhtec.com gxqianhan.com @@ -41393,6 +41405,7 @@ gxqmk.com gxqnjc.com gxqqxcl.com gxqrhb.com +gxqrjy.com gxqs.org gxqszl.com gxqtgroup.com @@ -41409,6 +41422,7 @@ gxqzrc.com gxqzrm.com gxqztv.com gxqztz.net +gxqzxjh.com gxqzxw.com gxqzxyd.com gxqzyz.com @@ -41467,6 +41481,7 @@ gxscjn.com gxscjx.com gxsckj.net gxscsw.com +gxsd.net gxsdem.com gxsdpx.com gxsdy.com @@ -41488,9 +41503,11 @@ gxshanyixing.com gxshbs.com gxshck.com gxshdl.com +gxshenglu.com gxshenyi.com gxshgk.com gxshile.com +gxshiteng.com gxshixinde.com gxshjy.com gxshjz.com @@ -41522,6 +41539,7 @@ gxsjwh.com gxskf.com gxsksw.com gxsksy.com +gxsl.com gxslbj.com gxslcc.com gxslyj.com @@ -41567,6 +41585,7 @@ gxszjf.com gxszjk.com gxszyy.com gxtagrm.com +gxtaishi.com gxtaiyinuo.com gxtalc.com gxtangmi.com @@ -41583,6 +41602,7 @@ gxtfxx.com gxthcpa.com gxthxxkj.com gxthyy.com +gxtianmiao.com gxtianpin.com gxticket.com gxtizi.com @@ -41642,11 +41662,13 @@ gxwbl.com gxwcll.com gxwcwl.com gxwdgg.com +gxwdjt.com gxweibo.net gxweipeng.com gxweite.com gxwellsun.com gxwenlian.com +gxwenyutech.com gxwgdq.com gxwgjf.com gxwhwy.com @@ -41686,6 +41708,7 @@ gxwzsz.com gxwzxhyq.com gxwzyl.com gxxbx.com +gxxbzm.com gxxdbp.com gxxdit.com gxxdpc.com @@ -41693,6 +41716,7 @@ gxxdzx.com gxxfbfg.com gxxfgg.com gxxfky.com +gxxfsl.com gxxfz.com gxxgg.com gxxgle.com @@ -41713,6 +41737,7 @@ gxxhtzp.com gxxhz.com gxxhzp.com gxxiangxing.com +gxxiangyi88.com gxxiaofu.com gxxiaolong.net gxxijiang.com @@ -41732,8 +41757,10 @@ gxxiyuanep.com gxxjcz.com gxxjry.com gxxjsy.com +gxxkai.com gxxkgs.com gxxkhj.com +gxxkslgy.com gxxldl.com gxxlk.com gxxlkj.com @@ -41848,9 +41875,11 @@ gxypjy.com gxypnh.com gxyqjc.com gxysbt.com +gxysbz.com gxysccsh.com gxyskz.com gxyslkj.com +gxysqj.com gxyss.com gxytdyf.com gxytgc.com @@ -41883,6 +41912,7 @@ gxyz120.com gxyzems.com gxyzh.com gxyzhhb.com +gxyzjc.com gxyzrmyy.com gxyzt.com gxyzxf119.com @@ -41915,10 +41945,12 @@ gxzh666.com gxzhdq.com gxzhenghua.com gxzhenhang.com +gxzhentao.com gxzhgz.com gxzhicui.com gxzhihui.com gxzhisai.com +gxzhixing.com gxzhiyuanxing.com gxzhizhi.com gxzhjj.com @@ -41931,6 +41963,7 @@ gxzhp.com gxzhpm.com gxzhshxx.com gxzhunchengbg.com +gxzhzb.com gxzhzy.com gxziheng.com gxzj-metal.com @@ -41959,6 +41992,7 @@ gxzpjx.com gxzpw.org gxzrdk.com gxzrjc.com +gxzrxf.com gxzscloud.com gxzsgl.com gxzsjzsj.com @@ -41996,15 +42030,19 @@ gxzzcpa.com gxzzd.com gxzztkj.com gxzzxin.com +gy-ggy.com gy120.net gy1688led.com gy2025.com gy328.com gy3y.com +gy794c.com gy7n.com gy818.com gyaqyy.com gyb086.com +gybcq.com +gybsn.com gybyscy.com gycharm.com gycode.com @@ -42012,7 +42050,7 @@ gyddos.com gydfsy.com gydongli.com gyedu.net -gyey.com +gyersf.com gyfensuiji.com gyfwyy.com gyfyy.com @@ -42066,6 +42104,7 @@ gyscw.com gysdzy.com gyseals.com gyshwl.online +gysk.com gysou.com gysq.org gysrmyy.com @@ -42074,6 +42113,7 @@ gystars.com gystatic.com gystc.com gyswzys.com +gytcwb.com gytxnc.com gytzkg.com gyuancdn.com @@ -42129,7 +42169,6 @@ gz007.net gz0668.com gz111.com gz121.com -gz163rsw.com gz1hua.com gz304.com gz360.com @@ -42143,7 +42182,6 @@ gzads.com gzanquan.com gzap.net gzaptech.net -gzasc.com gzasp.net gzate.com gzautojet.com @@ -42191,7 +42229,6 @@ gzcqs.com gzcrdzbk.com gzcsgs.com gzcsjg.com -gzculture.net gzcxhd.com gzcxlm.org gzcycling.com @@ -42229,8 +42266,6 @@ gzenxx.com gzeryun.com gzexpo.com gzfc.net -gzfeice.com -gzfeice.net gzfengmao.com gzfezx.com gzfgxh.com @@ -42337,7 +42372,6 @@ gzjk120.com gzjkfk.com gzjkfund.com gzjkjl.com -gzjkoa.com gzjkqh.com gzjkyljt.com gzjlp.com @@ -42346,6 +42380,7 @@ gzjlwy.com gzjlxh.com gzjmyy.com gzjob.net +gzjpad.com gzjqd.com gzjrkg.com gzjs020.com @@ -42379,6 +42414,7 @@ gzkmbg.com gzkofa.com gzktm.com gzkuaiyingyong.com +gzkunmao.com gzkydzyyy.com gzlarc.com gzlawyer.org @@ -42391,7 +42427,6 @@ gzlig.com gzlight.com gzliyuanhb.com gzlnholdings.com -gzlrck.com gzlsgy.com gzlt.net gzlujiao.com @@ -42412,6 +42447,7 @@ gzmath.com gzmc668.com gzmcg.com gzmcgjcpt.com +gzmediaclick.com gzmedri.com gzmeichang.com gzmiden.com @@ -42491,6 +42527,7 @@ gzrycl.com gzsaf.com gzscbio.com gzschknyy.com +gzscjrh.com gzsdwrmyy.com gzselon.com gzsenergy.com @@ -42516,6 +42553,7 @@ gzslyy.com gzsonic.com gzsouth.com gzspm.com +gzspring.com gzspt.com gzsq.com gzsqkfyy.com @@ -42547,6 +42585,7 @@ gzszsj.com gzszyy.com gztaiyou.com gztalx.com +gztamude.com gztcdj.com gztcm3.com gztea.vip @@ -42584,7 +42623,6 @@ gzupdc.com gzv6.com gzvalex.com gzvstc.net -gzvti.com gzw.net gzwanbao.com gzwanju.com @@ -42602,6 +42640,7 @@ gzwlcyjt.com gzwoman.org gzwonbo.com gzwrit.com +gzwrjt.com gzwshd.com gzwswjc.com gzwtqx.com @@ -42623,6 +42662,7 @@ gzxiaoban.com gzxict.com gzxijiu.com gzxinfo.com +gzxjgc.com gzxrsqj.com gzxswh.com gzxsyy.com @@ -42648,9 +42688,11 @@ gzyfjsjt.com gzyflw.com gzyhg.vip gzyiagu.com +gzyilongprinting.com gzylhyzx.com gzyouai.com gzyowin.com +gzyqtlxs.com gzyqwl.net gzytgf.com gzyucai.com @@ -42713,6 +42755,7 @@ h2vm.com h2weilai.com h3806.com h3807.com +h389.com h3c.com h3c.com.hk h3cfuwuqi.com @@ -42829,6 +42872,7 @@ hafuyoufk.com hagaozhong.com hagibis.com haguan.com +haguworld.com haha168.com haha33.com haha360.com @@ -42909,9 +42953,9 @@ haigoose.com haigouyan.com haigugroup.com haigui001.com -haihengwuye.com haihepharma.com haihetour.com +haihuainternational.com haihub.co haihuishou.com haiintelligent.com @@ -42954,7 +42998,7 @@ haima.me haima001.com haimacloud.com haimacloudpc.com -haimaiedu.net +haimaiyun.com haiman.io haimawan.com haimeec.com @@ -42982,7 +43026,6 @@ hainanlecheng.com hainanruiyuan.com hainanwangdai.com hainanyouxi.com -hainanyuyue.com hainanzuojia.com hainawater.com hainayun.net @@ -42996,7 +43039,6 @@ hainiugo.com hainiuxy.com hainuotech.com haiotsys.com -haiouchat.com haipal.com haipengtoy.com haipinggroup.com @@ -43008,6 +43050,7 @@ haiqq.com haiqu.vip hair8.net hairbobo.com +hairboxonline.com hairenren.com hairology.net hairongsw.com @@ -43030,6 +43073,7 @@ haita.io haitaibrowser.com haitaichina.com haitakuajing.com +haitangmm.com haitangw.cc haitangw.net haitao.co @@ -43049,6 +43093,7 @@ haitl.com haitong.com haitongjiaoyu.com haitou.cc +haitou360.com haitoujia.com haitunshenghuo.com haitunvoice.com @@ -43129,7 +43174,6 @@ halcyonz.com halead.com halfrost.com haligame.com -haling.com halixun.com haljl.com halloar.com @@ -43147,6 +43191,7 @@ hamashouzuo.com hamdl.com hamedal.com haminol.com +hammypuff.com hamu.site hanabi-live.com hanas.com @@ -43206,7 +43251,6 @@ hangjiayun.com hangkong.com hangkongxx.com hanglorygroup.com -hangluyuan.asia hangnakeji.com hangpai.org hangpu-topsys.com @@ -43220,7 +43264,6 @@ hanguangbaihuo.com hanguu.com hangw.com hangwei-media.com -hangwen520.com hangxinyiqi.xin hangyan.co hangyang.com @@ -43249,6 +43292,7 @@ hanhoo.com hanhua.com hanhuatin.com hanihanrf.com +hanjea.com hanjianbing.org hanjiaying.com hanjie.biz @@ -43291,7 +43335,6 @@ hanpokou.com hanpupharm.com hanqigroup.com hanqinghb.com -hanqiuming888.com hanqunfeng.com hans-ad.com hanschen.site @@ -43312,6 +43355,7 @@ hanstong.com hansuku.com hansunic.com hanswine.net +hant.cc hantang59.com hantangxintong.com hantangzy.com @@ -43356,6 +43400,7 @@ hanzhoulaser.com hanzify.org hanziguan.com hao-shangliang.com +hao.ac hao.gg hao.ink hao0517.com @@ -43382,6 +43427,7 @@ hao24.com hao245.com hao251.com hao268.com +hao315.cc hao315.com hao353.com hao360.com @@ -43447,6 +43493,7 @@ haoduofangs.com haoduojiaju.com haoduorou.net haoduoziti.com +haoe123.com haoejia.com haoeyou.com haofabiao.com @@ -43457,7 +43504,6 @@ haofang007.com haofang5.com haofangkankan.com haofangyu999.com -haofanhuoban.com haofeng-group.com haofenshu.com haofly.net @@ -43481,6 +43527,7 @@ haohaoxz.com haohaoyx.com haohaozhu.com haohead.com +haoht123.com haohuan.com haohuanjiao.com haohuoyuan.com @@ -43491,7 +43538,6 @@ haojiao.cc haojiao.net haojiaolian.com haojie.work -haojieyun.com haojing.org haojit.com haoju5.com @@ -43503,6 +43549,7 @@ haokan.com haokan5.com haokanbu.com haokanqq.com +haokanshipin.com haokavip.com haoke100.com haokebang.net @@ -43554,7 +43601,6 @@ haoniu1.com haonongzi.com haooyuan.com haopeixun.com -haopx123.com haoqiao.com haoqikan.com haoqiutiyu.com @@ -43592,6 +43638,7 @@ haoshunjia.com haoshunjx.com haoshuntm.com haoshuo.com +haoshuyou.net haoshuyun.com haositone.com haoso.com @@ -43701,12 +43748,12 @@ hapco-cn.com hapg-hitachi.com hapi123.net hapids.com -hapigo.com hapingapp.com hapjs.org haplat.net happi123.com happigo.com +happiness9999.com happy-ti.com happy-vpn.com happy88.com @@ -43776,7 +43823,6 @@ hasco-group.com hasea.com hasee.com hasee.net -haseecomputer.com hasen-cn.com hashnest.com hashyrmyy.com @@ -43832,12 +43878,12 @@ hb-green.com hb-hengda.com hb-jn.com hb-sx.net -hb-tulip.com hb-water.com hb-ws.com hb-xydq.com hb-young.com hb0771.com +hb10000.com hb10000sale.com hb1000kv.com hb110.cc @@ -43847,6 +43893,7 @@ hb2h.com hb30.com hb3rm.com hb500.com +hb56.cc hb96369.com hb96568.com hbaas.com @@ -43865,6 +43912,7 @@ hbbidding.com hbblxb.com hbbmjd.com hbbnqy.com +hbbrgd.com hbbst99.com hbbsw.vip hbbutler.com @@ -43881,6 +43929,7 @@ hbcdyz.com hbcg.cc hbchen.com hbchufeng.com +hbcjh.net hbcjkcfwjt.com hbcjlq.com hbcjw.com @@ -43995,6 +44044,7 @@ hbjir.com hbjjrb.com hbjk114.com hbjkjt.com +hbjmyljs.com hbjob88.com hbjomay.com hbjpim.com @@ -44008,6 +44058,7 @@ hbjubao.com hbjxad.com hbjxjy.org hbjxjyw.com +hbjxym.com hbjyjmzg.com hbjzgw.com hbjzxh.com @@ -44101,6 +44152,7 @@ hbshgzx.com hbshichang.com hbshls.com hbsia.org +hbsjym.com hbsjzyxh.com hbskw.com hbslft.com @@ -44181,7 +44233,6 @@ hbydsg.com hbydsy.com hbyh0561.com hbyhfcyy.com -hbyidc.com hbyidu.com hbyisen.com hbyjfs.com @@ -44192,6 +44243,7 @@ hbyouyunyouke.com hbyoyo.com hbyqtl.com hbysfhm.com +hbyt56.com hbyunxi.net hbyunyang.net hbyybwff.com @@ -44215,6 +44267,7 @@ hbzmw.com hbzncz.com hbzqzx.com hbzsb.com +hbzst.com hbzszy.net hbztn.com hbzuojia.com @@ -44239,6 +44292,7 @@ hc79.com hc943.com hca258.com hcaj.com +hcazb.com hcbbs.com hcbnjy.com hcbuy.com @@ -44251,7 +44305,6 @@ hcclhealthcare.com hccoeutg.com hccpcba.com hcdamai.com -hcdns21.com hcdyhr.com hceia.com hcepay.com @@ -44300,6 +44353,7 @@ hctxf.org hcty.com hcvac.com hcwebsite.com +hcwh.ltd hcwhjd.com hcwiki.com hcwljy.com @@ -44312,6 +44366,7 @@ hcxxy.com hcyacg.com hcydit.com hcykt.com +hcypzy.com hczc.com hczl.com hczq.com @@ -44340,7 +44395,7 @@ hdabc.com hdanc.com hdarea.club hdavchina.com -hdb489.com +hdb.com hdbaichuan.com hdbgjt.com hdbp.com @@ -44351,6 +44406,7 @@ hdcy123.com hdd-group.com hddata.net hddgood.com +hddid.com hddlion.com hddznet.com hdeexpo.com @@ -44364,6 +44420,7 @@ hdhosp.com hdhospital.com hdhui.com hditec.com +hdj.me hdjad.com hdjingwei.com hdjt.net @@ -44405,7 +44462,6 @@ hdslb.com hdslb.net hdslb.org hdsmgw.com -hdsxwhg.com hdtgtm.com hdtonghe.com hdtyre.com @@ -44449,6 +44505,7 @@ he29.com he2d.com heacn.net head-way.com +headconsultant.com heading123.com headingfilter.com headphoneclub.com @@ -44479,7 +44536,7 @@ heating-sh.com heatingtrace.com heavenlywind.cc heavenonearthhealingalternatives.com -heaye.shop +heavly1.com hebangdianzi.com hebbank.com hebbc.org @@ -44518,6 +44575,7 @@ hebgtjt.com hebi99.com hebiia.org hebinhospital.com +hebisf.com hebitv.com hebiw.com hebjxw.com @@ -44574,7 +44632,6 @@ heduibu.com heduismart.com hedysx.com heec.com -heeee.com heeeeeh.com heeeepin.com heemoney.com @@ -44583,13 +44640,13 @@ heepay.com heerit.com hefagear.com hefei.cc -hefei.website hefeilaws.com hefeimarathon.com heflc.com hefls.net hefunoodles.com hegii.com +hegouvip.com hegsryjq.com hehagame.com hehang.net @@ -44620,12 +44677,15 @@ heidiankeji.com heightindustry.com heiguang.com heiguang.net +heiha.net heihei.com heiheiyuyin.com heihekeji.com heijiao.net heijiaovip.com +heike07.com heilanhome.com +heilei.com heilifun.com heilongjianggames.com heiluo.com @@ -44684,11 +44744,11 @@ hejxf.com heketai.com hekouxin.com heku.org +hel168.com helensbar.com heliang.cc helianhealth.com helianwap.com -helib.net helichina.com heliforklift.com helight.info @@ -44750,6 +44810,7 @@ helpton.com helptousa.com helpweixin.com helunyun.com +heluowenhua.net helywin.com hema.ren hema.wiki @@ -44797,7 +44858,6 @@ hendera.com henduofang.com heng-f.com hengan-instruments.com -hengan.com hengansl.com hengaodebj.com hengbao.com @@ -44833,8 +44893,6 @@ hengkun.com hengli.com hengliguoji.com henglihotels.com -hengluelaw.com -hengluopanshi.xyz hengqian.com hengqifeng.com hengqijy.com @@ -44859,7 +44917,6 @@ hengxiangtaji.com hengxinjinshu.com hengxucapital.com hengxueedu.com -hengxunguoji.com hengyagongshui.com hengyan.com hengyankeji.com @@ -44885,14 +44942,17 @@ henmimang.com henningchem.com henovcom.com henrayglass.com +henri.ren hensctai.com hensgroup.com henzan.com henzanapp.com +heodoraiu.com hepalink.com hepan.com hepan.org hepartshome.com +hepatox.org hepmall.com hepost.com hepu123.com @@ -44901,6 +44961,7 @@ hepuwang.com hepuweilai.com hepuxw.com heqingloong.com +hercity.com hercules-logistics.com hercules-micro.com herdacdn.com @@ -44915,6 +44976,7 @@ heredlift.com herenit.com herllamo-med.com herllamo.com +hermod1.com hero-geek.com hero.com herocoming.com @@ -44924,6 +44986,7 @@ herohr.net heroic-ltd.com heroje.com heroone.com +herosanctuary.com heroskate.com herostart.com heroworld.net @@ -44961,6 +45024,7 @@ hetongamp.com hetusoft.com heu8.com heungkong.com +heupxtct.work heuvan.com hewaner.com hewascreen.com @@ -44976,6 +45040,7 @@ hexgears.com hexi-electric.com hexian.ltd hexiangroup.com +hexianrc.com hexiaoxiang.com hexie.cc hexieshaanxi.com @@ -45025,6 +45090,7 @@ heytapugc.com heytea.com heythings-iot.com heytime.com +heyuanstone.com heyuanxw.com heyuedi.com heyun100.com @@ -45092,7 +45158,6 @@ hfgjj.com hfgxbus.com hfhm.com hfhouse.com -hfhs8x.info hfhuamei.com hfi-health.com hfish.net @@ -45106,6 +45171,7 @@ hfkenfan.com hfkjsd.com hfkktt.com hfksmdl.com +hflbysm.com hfleda.net hflengku.com hflp88.com @@ -45127,9 +45193,7 @@ hfrc.net hfrcbc.com hfrsggff.com hfsava.com -hfsczx.net hfshec.com -hfshz.com hfsia.com hfsid.com hfspxh.com @@ -45144,6 +45208,7 @@ hftsoft.com hftx-jt.com hfw.cc hfx.net +hfxczj.com hfyestar.com hfykd.com hfykt.com @@ -45152,7 +45217,6 @@ hfyt365.com hfyuqin.com hfyyhyxh.com hfyylcy.com -hfyz.net hfzfzlw.com hfzhengxu.com hfzjxh.com @@ -45163,6 +45227,7 @@ hg-capacitor.com hg-daigou.com hg1218.com hg12333.com +hg5177.com hg568.com hg8880.org hg9895.com @@ -45189,6 +45254,14 @@ hglaser.com hgmai.com hgmri.com hgnc.net +hgo06070uyi.com +hgo06071uyi.com +hgo06080uyi.com +hgo06081uyi.com +hgo06090uyi.com +hgo06091uyi.com +hgo06101uyi.com +hgo06111uyi.com hgobox.com hgptech.com hgqizhong.com @@ -45204,6 +45277,7 @@ hgty5533.com hgty663.com hguduo.com hgvalve.com +hgveejt270.vip hgxxgz.com hgxxgz.net hgyrnk.com @@ -45218,6 +45292,7 @@ hh-gltd.com hh-honghu.com hh-jt.com hh-medic.com +hh-pcbs.com hh-pmp.com hh-post.com hh.global @@ -45232,9 +45307,11 @@ hhchampion.com hhchsw.com hhcjjy.com hhclby.com +hhcn.com hhcx-led.com hhcyt.com hhczy.com +hhdglm.com hhdna.net hhfxw.com hhglys.com @@ -45253,7 +45330,6 @@ hhhtscf.com hhhtyg.com hhitgroup.com hhjctest.com -hhjd.mobi hhjgqh.com hhjsyxh.com hhjtcn.com @@ -45267,6 +45343,7 @@ hhl1916.com hhlwchem.com hhmage.com hhmajiang.com +hhmanhua.net hhnykg.com hhnynews.com hho-hawater.com @@ -45353,7 +45430,6 @@ hichain.com hicheng.net hichina.com hichina.net -hichip.net hichipharm.com hichips.com hicitech.com @@ -45370,7 +45446,6 @@ hicosmo.com hicp.net hicsharp.com hicss.net -hicustom.com hiczp.com hidery.com hidesigncloud.com @@ -45407,7 +45482,6 @@ higame123.com higer.com higeshi.com higgmm.net -higgsweb.com high-genius.com highdigitizing.com highfaststudio.com @@ -45445,6 +45519,7 @@ hiigame.net hiiibrand.com hiiyun.com hijackorg.net +hijiangxi.com hijiaoshi.com hijin.vip hijoys.com @@ -45452,6 +45527,7 @@ hik-cloud.com hik-express.com hik-park.com hikailink.com +hikari-ch.com hikauto.com hikcreate.com hikemobile.com @@ -45481,6 +45557,7 @@ hilemic.com hilfv.com hiliad.com hiliwi.com +hillelmilwaukee.org hilllei.com hillstonenet.com hillyton.com @@ -45515,7 +45592,6 @@ hinotravel.com hinpy.com hinsyeow.org hintsnet.com -hiocloud.com hiofd.com hiosu.com hiparking.com @@ -45531,6 +45607,7 @@ hippoanimation.com hippter.com hipu.com hiputian.com +hiqiyu.com hirain.com hiram1009-dw.org hirata-cn.com @@ -45628,7 +45705,6 @@ hizom.com hizyw.com hizyy.com hj-bits.com -hj-hospital.com hj-ienergy.com hj-mail.com hj-pack.com @@ -45637,6 +45713,7 @@ hj1951.com hj217.com hj44103a1.shop hjapi.com +hjasiancenter.com hjbbs.com hjbxw.com hjcadc.com @@ -45648,7 +45725,6 @@ hjcm.net hjcpl.com hjd111.shop hjd123.com -hjdang.com hjdhdduekcdie.com hjdict.com hjdns.com @@ -45677,14 +45753,13 @@ hjlw.com hjmarathon.com hjpcc.com hjpp.net -hjqkox.com hjr-exchange.com hjren.com hjsj.com hjtag.com -hjtlink.com hjunkel.com hjw169.com +hjw68.com hjwsky.com hjwsxzz.com hjwxcps.com @@ -45719,9 +45794,9 @@ hk9.com hkaco.com hkaima.com hkance.com +hkance.xyz hkanews.com hkaohua.com -hkatv.com hkbchina.com hkcd.com hkcgart.com @@ -45737,6 +45812,7 @@ hkcwdc.com hkdfc.com hkdfgroup.com hkdqgroup.com +hkdzxs.com hkexpressworld.com hkfc.hk hkfcchina.com @@ -45759,8 +45835,8 @@ hkklock.com hkkuaiyixiu.com hklego.com hklmoto.com +hklmxcx.com hkm168.com -hkmanga.com hkmedtime.com hkmeinian.com hkmipo.com @@ -45817,7 +45893,6 @@ hldgp.com hldhouse.com hldhuanbao.com hldjob.com -hldlchina.com hldmzg.com hldnews.com hldszxyy.com @@ -45839,6 +45914,7 @@ hljcqjy.com hljdata.net hljgvc.com hljgwy.net +hljgzkj.com hljhgckj.com hljiasen.com hljjjb.com @@ -45861,6 +45937,7 @@ hlkkwl.com hlkncse.com hlktech.com hllinks.com +hllives.com hlmmold.com hlnhw.com hlnmg.com @@ -45868,6 +45945,7 @@ hlnpic.com hlnpm.com hlo-trade.com hlqiaojia.com +hlread.com hlsdq.com hlstlyy.com hltmsp.com @@ -45884,12 +45962,12 @@ hlxstipark.com hlxsykd.com hlxsz.com hlxy.com -hlxy.net hly.com hlybar.com hlyds.com hlyiq.com hlytec.com +hlyy8.com hlyykp.com hlzaojia.com hlzq.com @@ -45908,6 +45986,7 @@ hmadgz.com hmarathon.com hmbzfjt.com hmchina.com +hmdx.net hmedu.com hmeili.com hmf-china.com @@ -45945,6 +46024,7 @@ hmxixie.com hmxw.com hmxx.net hmyzs.com +hmz.com hmz8.com hmzhtc.cc hmzhtc.com @@ -45954,7 +46034,6 @@ hn-binglang.com hn-cbec.com hn-hwqjxh.com hn-medical.com -hn-tourdev.info hn-xqlhw.com hn0746.com hn165.com @@ -45962,6 +46041,7 @@ hn6j.com hn96520.com hn9mu.com hnacargo.com +hnacgs.com hnaec.com hnaec.org hnaee.com @@ -45994,7 +46074,6 @@ hnceg.com hncfa.com hncgkgjt.com hnchaosu.com -hnchasing.com hnchemtech.com hnchuangj.net hnchuangxiangkj.com @@ -46020,7 +46099,6 @@ hndcyg.com hndec.com hndfbg.com hndfsrmyy.com -hndfzx.com hndgxh.com hndhsyjt.com hndlhx.com @@ -46029,6 +46107,7 @@ hndmtjc.com hndnews.com hndpf.org hndpx.com +hnds88.com hndscg.com hndsyy.com hndt.com @@ -46037,6 +46116,7 @@ hndybus.com hndysx.com hndz413.com hndzxh.com +hnechz.com hnedition.com hnedutv.com hnerkang.com @@ -46068,6 +46148,7 @@ hngscloud.com hngsetc.com hngtrust.com hngwg.com +hngwkj.net hngwmt.com hngwy.org hngwzk.com @@ -46083,7 +46164,6 @@ hnhjjx.com hnhnled.com hnhp.com hnhsjt.com -hnhspc.com hnht56.com hnhtdg.com hnhw.com @@ -46115,7 +46195,6 @@ hnjme.com hnjmsk.com hnjshzy.com hnjsrcw.com -hnjsxy.com hnjtcl.com hnjttz.com hnjudarhr.com @@ -46222,7 +46301,6 @@ hnsiwei.com hnsjgroup.com hnsjlh.com hnsjrd.com -hnskl.org hnsktc.com hnskxy.com hnsky.net @@ -46279,7 +46357,6 @@ hntzyy.com hnubbs.com hnucc.com hnukai.com -hnw443.com hnwanglong.com hnwbxx.com hnwca.com @@ -46323,6 +46400,7 @@ hnydgl.com hnyesf.com hnyfkj.com hnyichang.com +hnyingfang.com hnyinhan.com hnyixiao.com hnysfww.com @@ -46335,7 +46413,6 @@ hnyunzhiyi.com hnyuyuhui.com hnyydg.com hnyygroup.com -hnyytech.com hnyyws.com hnyyxj.com hnyyyfsyy.com @@ -46374,12 +46451,11 @@ hnzyfy.com hnzywh.xyz hnzyxckj.com hnzyydx.com +hnzyzx.com hnzzjob.com hnzzlh.com hnzzms.com hnzzrc.com -hoaihe.store -hoatia.com hoau.net hobalab.com hobby-eagle.net @@ -46397,9 +46473,9 @@ hoehub.com hofcc.com hogacn.com hogasky.com -hogci.com hogesoft.com hogon17.com +hoho666.com hohode.com hoilon.com hoing.net @@ -46451,6 +46527,7 @@ homecdn.com homed.me homedgroup.com homedo.com +homeindus.com homeinframes.com homeinmists.com homeinns.com @@ -46466,6 +46543,7 @@ homesir110.com homestyler.com hometex114.com hometexnet.com +hometol.com homey-household.com homeyao.com homhow.com @@ -46501,6 +46579,7 @@ hongbo-sh.com hongbo100.com hongboluo.com hongcesys.com +hongchangpawn.com hongchisw.com hongchuangholding.com hongda-steeltube.com @@ -46533,6 +46612,7 @@ hongjia138.com hongjiang.info hongjiejia.com hongjigroupsz.com +hongjin2.com hongjing-wh.com hongjing.com hongjing3.com @@ -46552,12 +46632,14 @@ honglimfg.com honglimingbiao.com honglipai.net honglumedia.com +hongm.com hongmaoshiye.com hongmeiti.com hongmeiti.net hongmen.cc hongmen.com hongmingbus.com +hongmo.xyz hongmoka.com hongmu.com hongniang.com @@ -46590,7 +46672,6 @@ hongshipaint.com hongshizi.org hongshn.xyz hongshu.com -hongshu18.com hongshunet.com hongshunth.com hongshuxiao.com @@ -46615,7 +46696,6 @@ hongwu.com hongwuhuan.com hongxiangzaixian.com hongxiaolong.com -hongxin1.asia hongxingdl.com hongxingdl.love hongxinglin.com @@ -46690,13 +46770,12 @@ hoolee8.com hoolinks.com hoolo.tv hoonup.com +hoop-archi.com hoopchina.com hoopugames.net hoosho.com hooshun.com hoosuntec.com -hootnews.site -hooxz.com hooya.hk hooyagroup.com hooyoo.com @@ -46710,6 +46789,7 @@ hopechart.com hopecool.com hopeda.com hopegoocdn.com +hopehook.com hopemedinc.com hopenoah.com hoperun.com @@ -46771,6 +46851,7 @@ hospitalkg.com hospitalshy.com hospitalstar.com hospite.com +host263.com host888.net hostacc.net hostacc1.com @@ -46798,7 +46879,6 @@ hoteastday.com hotelbaijin.com hotelcis.com hotelgg.com -hotelincn.com hoteljianguo.com hotelpanpacific.com hotelsjianguo.com @@ -46871,6 +46951,7 @@ house5.net house510.com house86.com houseimg.com +houseoftantra.org houshaoan.com housoo.com houwuedu.com @@ -46896,6 +46977,7 @@ hoxue.com hoyakeji.com hoyatod.com hoyi-tech.com +hoyibox.xyz hoyip.com hoyo.link hoyoverse.com @@ -46903,7 +46985,6 @@ hozest.com hozin.com hozonauto.com hp-marathon.com -hp-ww.com hp.com hp123.com hp888.com @@ -46925,9 +47006,10 @@ hpigc.com hpjd.com hplyy.com hpmicro.com +hpnfjx.com hpoi.net hprt.com -hprtupgrade.com +hprx.com hps-sh.com hpstore-china.com hpstore.cc @@ -47078,10 +47160,10 @@ hrflc.com hrfoods.com hrgsmz.com hrgxyy.com -hrhgstock.com hrhuiyi.com hrhy365.com hrintl.com.hk +hrjextruders.com hrjkjt.com hrloo.com hrm100.com @@ -47093,7 +47175,6 @@ hrpackage.com hrs100.com hrsalon.org hrsay.com -hrsecn.com hrsee.com hrsel.com hrsoft-china.com @@ -47105,7 +47186,6 @@ hruikang.com hrvouge.com hrwuu.com hrxz.com -hrzs168.com hrzy.cc hs-bianma.com hs-biopharm.com @@ -47151,7 +47231,6 @@ hsg2oi3c.com hsgf.net hsgjj.com hsgjysj.com -hsgtour.net hshan.com hshdyw.com hshhlj.com @@ -47162,6 +47241,7 @@ hshsxkj.com hshton.com hshuiyi.com hsjk.com +hsjkaoyan.com hsjpgzx.com hsjrhy.com hsjt1983.com @@ -47181,7 +47261,6 @@ hsmob.com hsmrt.com hsnewsnet.com hsoow.com -hspdz.com hspharm.com hspm.net hspress.net @@ -47230,6 +47309,7 @@ hsxt.net hsy188.com hsyaguanjg.com hsyanyi.com +hsybyh.com hsyk023.com hsysupply.com hsyuntai.com @@ -47292,7 +47372,6 @@ htgkdz.com htguosheng.com htgwf.com hth.com -hthbet.com hti-instrument.com htidc.com htinfor.com @@ -47324,7 +47403,6 @@ htong.com htoo.vip htood.com htool.com -htqhedu.com htqjy.com htqyy.com htrip.biz @@ -47368,6 +47446,7 @@ htys123.com htyswzzgw.com htyunwang.com htzdj.com +htzdznjs.com htzhgd.com htzipr.com hu.com @@ -47395,13 +47474,11 @@ huabbao.com huabeicw.com huabian.com huabianyl.com -huabiaolaw.com huabo.net huabokeji.com huabot.com huacai-tech.com huacai.com -huacaihuayi.com huacaijia.com huacaole.com huacemedia.com @@ -47619,6 +47696,7 @@ huangqi1688.com huangshaotian.com huangshimarathon.com huangwei.me +huangwei.pro huangxin.dev huangxinwei.com huangyao.work @@ -47663,12 +47741,12 @@ huanqiu.org huanqiu56.com huanqiuauto.com huanqiuchuguo.com +huanqiujiemi.com huanqiukexue.com huanqiutape.com huanqiuw.com huanqiuyimin.com huanqunquan.com -huanse.net huansengifts.com huanshoulv.com huante.com @@ -47881,7 +47959,6 @@ huayilighting.com huayimedia.com huayiming.com huayin114.com -huayin99.com huayingglass.com huayingrc.com huayingsc.com @@ -47895,9 +47972,11 @@ huayiwork.com huayiyunxinxi.com huayou.com huayoumengze.com +huayoutianyu.com huayuan-print.com huayuanlcd.com huayuchaxiang.com +huayue119.com huayueivf.com huayufilter.com huayug.com @@ -47914,13 +47993,13 @@ huazhen2008.net huazhengcaiwu.com huazhengwuye.com huazhenjiaoyu.com +huazhiedu.com huazhiweilai.com huazhixingchina.com huazhongcar.com huazhongcnc.com huazhu.com huazhuanapp.com -huazhuangshi.net huazhucorp.com huazirc.com hubamdi.com @@ -47940,9 +48019,9 @@ hubeihome.net hubeiip.com hubeijingjunf.com hubeikj.com +hubeinet.com hubeipbx.com hubeiport.com -hubeixingyih.com hubeixuekao.com hubeiyanjiusheng.com hubeiyongtai.com @@ -47988,7 +48067,9 @@ hugecdn168.com hugecore.net hugeland.com hugetall.com +hugong-js.com hugong.com +huhaha.net huhaoyang.com huhexian.com huhoo.com @@ -48035,6 +48116,7 @@ huidafrp.com huidagroup.com huidan.net huidang.com +huidaocaishui.com huidaqg.com huidawanan.com huidazhe.vip @@ -48060,6 +48142,7 @@ huifengzhuzao.com huifenqi.com huifu.com huifudashi.com +huifusihai.com huifutz.com huifuzhinan.com huigao-magnetics.com @@ -48195,6 +48278,7 @@ huisucn.com huisuoping.com huitao.net huitaoche.com +huitaoyouhui.com huitengpipe.com huitongqingsuan.com huitouche.com @@ -48235,6 +48319,7 @@ huiyi-123.com huiyi365.net huiyi8.com huiyi9e.com +huiyiabc.com huiyiai.net huiyihealth.com huiyinxun.com @@ -48317,14 +48402,12 @@ humensec.com huming.com hummcars.com hunaen.com -hunan-bank.com hunan-changda.com hunan-huasheng.com hunan100km.com hunanbestall.com hunancatv.com hunaneu.com -hunanfapaiwang.com hunangaozhi.com hunangy.com hunanhaihong.com @@ -48345,6 +48428,7 @@ hunbei4.com hunbei5.com hunbohui.info hunbys.com +hunche.net hunchun123.com hundredcent.com hundsun.com @@ -48364,7 +48448,6 @@ hunlimama.com hunlimao.com hunmiao.com hunsh.net -hunsha.work huntchance.com huntermailfocus.com hunteron.com @@ -48374,6 +48457,13 @@ huntkeydiy.com huntsbot.com hunuo.com hunyinyiyuan.com +huo07100hy.com +huo07110hy.com +huo07120hy.com +huo07140hy.com +huo07150hy.com +huo07160hy.com +huoas.com huoban.com huobanbot.com huobanhuyu.com @@ -48397,6 +48487,7 @@ huocheso.com huocms.com huodao.hk huodong.org +huodong.store huodong5.com huodonghezi.com huodonghui.net @@ -48434,6 +48525,7 @@ huolishaonianwang.com huolug.com huomakeji.com huomao.com +huomaotv.com huomaqun.com huomujin.com huonan.net @@ -48447,7 +48539,6 @@ huoshan.cc huoshan.club huoshan.com huoshancdn.com -huoshanfake.com huoshangroup.com huoshanimg.com huoshanlive.com @@ -48496,6 +48587,7 @@ hurom.vip hurricane618.me hurricanechip.com hurun.net +hurx04.xyz hurys.com husenji.com hushangcaifu.com @@ -48532,6 +48624,7 @@ hutuii.com huuhoo.com huuing.com huwaibbs.com +huwaizb.com huway.com huweihuang.com huweishen.com @@ -48601,6 +48694,7 @@ hwastro.com hwasunpharma.com hwatson.com hwavi.org +hwbanaa.com hwbaoan.com hwbfxp5030.vip hwbim.com @@ -48666,6 +48760,7 @@ hx2cars.com hx36.net hx416.com hx5658.com +hx818.com hx8886.com hx95.com hx99.net @@ -48680,16 +48775,15 @@ hxccc.org hxcdn.net hxchem.net hxchx.org +hxclouds.com hxct.com hxd56.com hxdec.com hxdi.com hxdkfp.com hxdkj88.com -hxdpay.com hxdrisk.com hxdsbgg.com -hxdsmy.com hxdspa.com hxdtekf.com hxen.com @@ -48708,7 +48802,6 @@ hxgs.net hxhost.com hxhssw.com hxiangjia.com -hxiapp.com hxing.com hxinq.com hxjbh.com @@ -48756,6 +48849,7 @@ hxqc.mobi hxqcgf.com hxqcjt.com hxqgczx.com +hxqtedu.com hxqu.com hxr100.com hxrc.com @@ -48835,7 +48929,6 @@ hy5353.com hy552.com hy5553.com hy563.com -hy57.com hy576.com hy628.com hy636.com @@ -48852,7 +48945,6 @@ hyagv.com hyahm.com hyaimed.com hyb2b.com -hybaizhen.com hybase.com hybbs.net hybbtree.com @@ -48868,7 +48960,6 @@ hyckjic.com hycn.com hydarts.com hydbest.com -hydcn.com hyddd.com hydesolar.com hydst.com @@ -48878,7 +48969,6 @@ hydzfp.com hydzswyxgs.com hyec.com hyedu.com -hyeus.net hyexpo.com hyext.com hyey.com @@ -48903,10 +48993,10 @@ hyhqjt.com hyhro.com hyhscm.com hyht.fun -hyhudong.com hyhuo.com hyhxt.net hyhy.cc +hyhyn.com hyilp.com hyimmi.com hyipchina.com @@ -48914,7 +49004,6 @@ hyj999.com hyjgxx.com hyjhgy.com hyjnpx.com -hyjsxy.com hyjxmx.com hykang.com hykcsoft.com @@ -48951,6 +49040,7 @@ hypercachenet.com hypercachenode.com hypergryph.com hypergryph.net +hyperguestai.com hypers.com hypersilicon.com hypersnap.net @@ -48965,7 +49055,6 @@ hyqcw.com hysbz.com hysec.com hyseim.com -hyshe.cc hyshengnian.org hyshi.net hysound.com @@ -49028,7 +49117,6 @@ hz-hospital.com hz-jsyg.com hz-kedi.com hz-moon.com -hz-oa.com hz-pharm.com hz-polar.com hz-spring.net @@ -49044,7 +49132,6 @@ hz2y.com hz3201.com hz3ds.com hz3y.com -hz3yy.com hz66.com hz6z.com hz7hospital.com @@ -49113,7 +49200,6 @@ hzddwk.com hzdelian.com hzdely.com hzdgjc.com -hzdianqin.com hzdjr.com hzdjy.com hzdledu.com @@ -49135,7 +49221,6 @@ hzeg.com hzelec.com hzepd.com hzeyun.com -hzfanews.com hzfc.cc hzfc365.com hzfeat.com @@ -49166,6 +49251,7 @@ hzguode.com hzguojiao.com hzgwzn.com hzgxr.com +hzgymd.com hzgzsoft.com hzh0775.com hzh1.com @@ -49225,6 +49311,7 @@ hzjizhun.com hzjlcs.com hzjljt.com hzjmjl.com +hzjndz.com hzjqhy.com hzjsjl.com hzjtfw.com @@ -49307,6 +49394,7 @@ hzpgc.com hzpswy.com hzpzs.net hzqfy.com +hzqiuxue.com hzqj.com hzqjdz.net hzqlpt.com @@ -49371,7 +49459,6 @@ hzsun.com hzsunup.com hzswmotor.com hzswysyy.com -hzsycq.com hzszls.com hzszyyy.com hztbc.com @@ -49406,6 +49493,7 @@ hzwmw.com hzwomenmarathon.com hzwotu.com hzwqscl.com +hzwsjyjt.com hzwtech.com hzx.center hzx8188.com @@ -49419,7 +49507,6 @@ hzxiangshang.com hzxiaoya.com hzxinglong-ip.com hzxiyuege.com -hzxjhs.com hzxqf.com hzxsjgxx.com hzxsjtzt.com @@ -49450,7 +49537,6 @@ hzyys.com hzyz.net hzyzxx.net hzzbco.com -hzzbhb.com hzzckg.com hzzfcm.com hzzfxx.com @@ -49464,6 +49550,7 @@ hzzhonggang.net hzzhonghao.com hzzhuode.com hzzhyl.com +hzzhzm.com hzzjjsgc.com hzzkj.net hzzp.com @@ -49473,7 +49560,6 @@ hzzred.com hzzrmc.com hzzsfs.com hzzsxh.com -hzzszf.com hzztkj.com hzzuyin.com hzzx365.com @@ -49491,6 +49577,7 @@ i-excellence.com i-f.work i-fanr.com i-firefly.com +i-haitao.com i-iem.com i-ktv.com i-lewan.com @@ -49551,7 +49638,6 @@ i3abox.com i3ciebwk6ixfb.com i3done.com i3dpworld.com -i3f.cc i3geek.com i3gt.com i3smot.com @@ -49597,6 +49683,7 @@ iaapc.org iacstar.com iaddata.com iadmob.com +iadmore.com iadtracker.com iaeac.org iagefans.com @@ -49632,6 +49719,7 @@ iaoyou.com iaozi.com iape-js.com iapijy.com +iapkk.com iapolo.com iappdaily.com iappler.net @@ -49655,6 +49743,7 @@ iavlife.com iazhi.com ib-china.com ib3-gogin.com +ibabyjoy.com ibadboy.net ibailve.com ibaiqiu.com @@ -49694,7 +49783,6 @@ ibeta.me ibianma.com ibicn.com ibidian.com -ibidmob.com ibiji.com ibingniao.com ibiquge.info @@ -49718,13 +49806,13 @@ iblimg.com iblog.ren ibloger.net iblue.com +iblue.me ibluefrog.com ibluesocial.com iblwl.com ibm-dns.com ibmfwqdl.com ibmwclub.com -ibnjl.shop ibobscs.com ibodao.com ibodyhome.com @@ -49748,9 +49836,7 @@ ibuscloud.com ibuscloud.net ibuychem.com ibw.cc -ibwm5lynb6.com ibytedapm.com -ibytepluses-test.com ic-bro.com ic-captain.com ic-itssc.org @@ -49760,6 +49846,7 @@ ic-leasing.com ic-mag.com ic-spic.com ic-valley.com +ic001.org ic2china.com ic37.com ic72.com @@ -49783,7 +49870,6 @@ icanvideo.com icarbonx.com icardfinancial.com icaredbd.com -icarstory.com icasiso.com icastlewar.com icax.org @@ -49872,7 +49958,6 @@ ichanyu.com ichaoshangyue.com ichaotao.com ichaotu.com -icharityngo.com ichat800.com ichatcn.com ichdata.com @@ -49959,6 +50044,7 @@ icoou.com icoremail.net icos8.com icostapp.com +icosz.com icot.com icourse163.com icourse163.org @@ -50022,6 +50108,7 @@ icz.com iczhiku.com iczoom.com id-bear.com +id-photo-verify.com id57.com id6.me ida-a.org @@ -50042,11 +50129,11 @@ idatagx.com idataway.com idatawz.com idayer.com -idazhe.net idbhost.com idc-icp.com idc002.com idc021.com +idc027.net idc029.com idc123.com idc129.com @@ -50069,7 +50156,6 @@ idccun.com idcdoc.com idceb.com idcfengye.com -idcfx.net idcgcloudcs.com idchz.com idchz.net @@ -50120,6 +50206,7 @@ ideanote.cc ideapool.tv ideappt.com idearhanyu.com +ideasr.com ideassoft.com ideation.love ideazhao.com @@ -50191,12 +50278,12 @@ iduochong.com iduodou.com iduokan.net idux-vw.com -idwuhan.com idwzx.com idx365.com ie13.com ie515.com ie525.com +ie57.com ie815.com ie915.com ie935.com @@ -50352,6 +50439,7 @@ ifresh.mobi ifromvr.com ifscity.com ifseclabs.com +ifshot.com ifundstore.com ifunmac.com ifutest.com @@ -50359,7 +50447,6 @@ ifutureworks.com ifxtx.com ifzxs.cc ifzzw.com -iga-pages.com igaichong.com igame007.com igame58.com @@ -50451,7 +50538,6 @@ ihappy.vip ihappystudio.com ihappystudio.net ihasl.com -ihco3.com ihdt.tv ihdty.com ihealthcoming.com @@ -50465,6 +50551,7 @@ ihggccampaign.com ihicon.com ihigee.com ihint.me +ihisce.com ihitui.com ihitun.com ihkk.net @@ -50554,6 +50641,7 @@ iinorii.com iiolink.com iiong.com iipcloud.com +iipiano.com iirii.com iirpwigs.com iis7.com @@ -50637,6 +50725,7 @@ ikebukuro777.org ikeled.com ikemeng.com ikepu.com +ikgambwqeqnv.com ikhimalayaniq.com ikj123.com ikj168.com @@ -50644,6 +50733,7 @@ ikjds.com ikjtao.com ikjxc.com ikmoo.com +ikmt.net ikncn.com ikonfx.com ikongjian.com @@ -50665,7 +50755,6 @@ ikunac.com ikuncdnfb.com ikunpay.com ikutu.com -ikuuu.one ikx.me ikzybf.com il8r.com @@ -50684,6 +50773,7 @@ ilaw66.com ilawpress.com ilazycat.com ilcweloc.com +ilea-roswell.org ileapcloud.com ileci.com ileedarson.com @@ -50726,6 +50816,7 @@ ilucky.net iluezhi.com ilufan.com iluhang.com +ilustrepro.com iluvatar.ai iluvatar.com ilux.ai @@ -50752,11 +50843,13 @@ imageedu.com imagefuture101.com imagehub.cc imagelol.com +imageoss.com imageplusplus.com imageplusplus.net imagepy.org imagerjt.com images-cache.com +images.samsung.com images3.tripcdn.com imagestoryai.com imageter.com @@ -50778,6 +50871,7 @@ imao2.com imaojiang.com imarketchina.com imarkr.com +imaschina.com imatlas.com imayitxt.com imazingchina.com @@ -50821,6 +50915,7 @@ imeitou.com imelai.com imeme.tv imetacloud.com +imeyahair.com imfirewall.com imfooww.com img-space.com @@ -50838,11 +50933,11 @@ img168.net img16888.com img4399.com img898.com -img9g2026.com imgbed.link imgcdc.com imgchr.com imgcook.com +imgdd.cc imgdianying.com imgdianyingoss.com imge.cc @@ -50983,6 +51078,7 @@ imycloud.com imydns.net imyfone.club imyike.com +imys.net imyshare.com imyuedu.com imyushu.com @@ -51030,7 +51126,6 @@ inctrip.com ind-map.com ind4.net ind9ed.com -indeedpower.com indetek-lab.com indexea.com indexedu.com @@ -51091,7 +51186,6 @@ infomorning.com infong.net infoobs.com infoqstatic.com -inforamz.com inforbus.com inforeenviro.com inforguard.net @@ -51134,7 +51228,6 @@ initaf.com initah.com initaj.com initak.com -initba.com initbb.com initcc.com initdd.com @@ -51175,7 +51268,6 @@ inkuai.com inkwai.com inlandschool.com inlaylink.com -inlaylink.net inlishui.com inliuzhou.com inluckcalendar.com @@ -51223,7 +51315,6 @@ inoneh5.com inong.net inoteexpress.com inovance-automotive.com -inovance.com inovogen.com inovppg.com inovpu.com @@ -51243,6 +51334,7 @@ inshion.com inshotapp.com insigma-elec.com insistence.tech +insmoin.com insnail.com insneu.com insnex.com @@ -51259,6 +51351,7 @@ insta360.com instafogging.com installgreat.com installwage.com +instantinfographicspresence.com institution2.com instome.com instreet.com @@ -51273,7 +51366,6 @@ int2018.com int800.com intaek.com intdmp.com -inte.net intecheye.com intecol-10iwc.com intedc.com @@ -51281,6 +51373,7 @@ integrity-funds.com intekey.com intel-space.com intelcupid.com +intellect.black intelligen.ltd intelligence-electricity.net intelligentmanufactory.com @@ -51307,7 +51400,6 @@ intmedic.com intmes.com intohard.com intomod.com -intonead.com intopet.com intostarry.com intovfx.com @@ -51319,7 +51411,6 @@ intsavi.com intseamultiply.com intsig.com intsig.net -intvolunteer.com intwho.com intwing.com inuobi.com @@ -51346,6 +51437,7 @@ inwuoo.com inxedu.com inxni.com inxunoffice.com +inyota.com inzone-auto.com inzotek.com ioa365.com @@ -51422,6 +51514,7 @@ iotxx.com iotyeas.com iotyes.com iouluo.com +ioxqm.com ioxunyun.com ip-guard.net ip-hercules.com @@ -51435,6 +51528,7 @@ ip33.com ip3366.net ip3a.com ip518.com +ip66.com ip66.net ip669.com ip77.net @@ -51523,7 +51617,6 @@ ipoceo.com iposeidonbussiness.com iposeidoncdn.com iposeidongame.com -iposl.com ipostalcode.com ipple.net ipplus360.com @@ -51606,13 +51699,13 @@ iquanwai.com iquaveizeeru.com ique.com iquegui.com +iquhuo.com iquickfish.com iqujing.com iqunix.com iqunix.store iqupdate.com iqxedu.com -ir56.com irain.in irainone.com iranmahanair.com @@ -51651,10 +51744,12 @@ irlianmeng.com irmleader.com irobotbox.com irockbunny.com +iroing.com ironfishchina.com irongbei.com ironghui.com irootech.com +irort.com irouteros.com irrichina.com irs01.com @@ -51684,6 +51779,7 @@ isagzth.com isahome.net isaieg.com isamanhua.com +isameforum.org isawhis.com isawhs.com isawuhan.com @@ -51716,7 +51812,6 @@ ishanghome.com ishangman.com ishangtong.com ishangu.com -ishanin.com ishansong.com ishaohuang.com isharepc.com @@ -51739,6 +51834,7 @@ ishubao.org ishugui.com ishuiyun.com ishumei.com +ishuocha.com ishuqi.com ishuqi.net ishuquge.com @@ -51817,9 +51913,11 @@ istoreos.com istpei.com istrongcloud.com istrongcloud.net +istylepdf.com isuanyun.com isudaji.com isuike.com +isummi.com isun.org isunon.com isunton.com @@ -51838,6 +51936,7 @@ isxtv.com isyour.love it-bound.com it007.com +it0772.net it120.cc it165.net it168.com @@ -51906,19 +52005,22 @@ itcm.com itcn.cc itcodemonkey.com itcpn.net +itcqf.org itczh.com itdabao.com itdai.com itdayang.com itddo2page.com itdevnow.com -itdida.com itdks.com +itdog-dns.com itdog.com itdog.plus itdoisp.com +itdoor.net itdos.com itdos.net +itdp-china.org iteam-dress.com itechate.com itedou.com @@ -51983,7 +52085,6 @@ itmanbu.com itmind.net itmoocs.com itmop.com -itmopcdn.com itmuch.com itmuke.com itmyhome.com @@ -52026,7 +52127,6 @@ itpux.com itpwd.com itqaq.com itrace.cc -itravelsaas.com itredu.com itrid.com itrip.com @@ -52063,11 +52163,11 @@ itutu.tv ituun.com ituut.com itv.video +itvcn.com itwanger.com itwlw.com itwork.club itwsms.com -itwz.cc itxe.net itxia.club itxp365.com @@ -52093,6 +52193,7 @@ iu95522.com iuban.com iucdn.com iuctrip.com +iufida.com iuinns.com iuiu.site iumemo.com @@ -52124,7 +52225,6 @@ ivips.site ivistang.com ivixivi.com ivknow.com -ivolces-test.com ivolces.com ivon.work ivqamtkr.com @@ -52153,6 +52253,7 @@ iwanoutdoor.com iwanshow.com iwapan.com iwatani-gz.com +iwatch365.com iwatertech.com iway-tech.com iwebad.com @@ -52173,7 +52274,6 @@ iwhopro.com iwhr.com iwhr.org iwiki.com -iwill.vip iwin10.net iwingchina.com iwiscloud.com @@ -52183,12 +52283,14 @@ iwithu.net iwjw.com iwmmob.com iwncomm.com +iwooji.com iwopop.com iwordnet.com iwordshow.com iwosai.com iwpai.com iwshang.com +iwte-expo.com iwteexpo.com iwuchen.com iwurexs.info @@ -52258,6 +52360,7 @@ iyaxin.com iyaya.com iyaya.info iyb.tm +iybtv.com iycsky.com iydsj.com iydu.net @@ -52316,7 +52419,6 @@ iyuxiyang.com iyxing.com iyxku.com iyyin.com -iyys.ltd iyz168.com izacholsm.com izaodao.com @@ -52376,17 +52478,18 @@ j-techcnc.com j-test.com j-ui.com j03og.app +j0g0.com j1998.com j1j5q683cj.world j2ee.cc j2up.com j3cx.com j43439.com +j4lpr.com j5.cc j5k6.com j66.net j8.net -j8gm.com j8j9.com j95a.com j99h8.com @@ -52394,6 +52497,7 @@ ja-cloud.com jaadee.com jaadee.net jab88.com +jabansk-auymon.com jabizb.com jabpark.com jabrehoo.com @@ -52413,6 +52517,9 @@ jademond.net jadewd.com jadyf.com jaeapp.com +jaebanke-jocelyou.com +jaebanke-nochujapazsn20.com +jaebanke-nochujapazsn5.com jaecdn.com jaedu.com jaeger-hello.com @@ -52456,6 +52563,7 @@ jarhu.com jarods.org jarvisw.com jasangroup.com +jasbasnkilonau6.com jasminer.com jasolar.com jason-z.com @@ -52490,6 +52598,7 @@ jay.tg jaya.cc jayce.icu jayfc.com +jayfu.tk jayjw.com jayxhj.com jaz581.com @@ -52522,7 +52631,6 @@ jbryun.com jbs-kj.com jbsmartcity.com jbsx88.com -jbsy20riz9.com jbt.ink jbtlj.com jbtxy.net @@ -52650,6 +52758,7 @@ jcyai.com jcyes.com jcys120.com jcys12366.com +jcyspt.com jcyx2019.com jcyxds.com jczb.vip @@ -52767,6 +52876,7 @@ jdfschool.com jdfw1.com jdfzm.com jdgogo.com +jdgsgl.com jdgslb.com jdgslb.net jdgzf.net @@ -52797,13 +52907,13 @@ jdlingyu.net jdmwk.com jdmy.com jdnews.net -jdo2c.com jdon.com jdpay.com jdpaydns.com jdplay.com jdpta.com jdreader.net +jdrns.com jdrq.net jdsafe.com jdsha.com @@ -52813,6 +52923,7 @@ jdsry.com jdss.cc jdt-precision.com jdtiot.com +jdtjy.com jdtxgc.com jdunion.com jduoduo.com @@ -52829,6 +52940,7 @@ jdxc.net jdxfw.com jdxlt.com jdxs.com +jdxsr.com jdxzz.com jdy.com jdycdn.com @@ -52906,6 +53018,7 @@ jereh.com jerei.com jeremycn.com jerpx.com +jerryzou.com jescard.com jesdatools.com jesgoo.com @@ -52923,6 +53036,7 @@ jetgroup-cn.com jetgroup-nb.com jethoo.com jethro.fun +jetionservice.com jetlogistic.com jetmobo.com jetneed.com @@ -52955,6 +53069,7 @@ jfcoo.com jfcoop.com jfdaily.com jfedu.net +jfgjwl.com jfgou.com jfh.com jfhzfsn.com @@ -52976,7 +53091,6 @@ jfxiaopaoqi.com jfydgame.com jfyf.cc jfyiyao.com -jfyxw.com jfz.com jfzfund.com jfzhcx.com @@ -52997,12 +53111,13 @@ jgg09.com jggame.net jgjapp.com jglh.com +jglm.cc +jgs-ds.com jgscct.com jgsdaily.com jgsemicon.com jgstour.com jgsxfw.com -jgtab.link jgtc315.com jguanjia.com jgums.com @@ -53027,6 +53142,7 @@ jhak.com jhaoyou.com jhcb.net jhcfz.com +jhcheku.com jhcms.com jhconba.com jhctbank.com @@ -53041,16 +53157,19 @@ jhfsata.com jhgolfcarts.com jhgroup525.com jhgtgb.com +jhgykt.com jhhospital.com jhhygl.com jhi.cc jhjt.xyz jhjunda.com jhkao.com +jhkj.work jhkuajing.com jhltsl.com jhm2012.com jhmnew.com +jhmwo.com jhnsh.com jhnsyh.com jhonge.net @@ -53082,12 +53201,13 @@ jhxms.com jhxrmyy.com jhxzlsgs.com jhydns01.com -jhydns04.com jhydns05.com jhygame.com jhyongyou.com jhypcy.com jhytech.com +jhyusqo.com +jhyz.net jhzdhjt.com jhzhizao.com jhzhkj.com @@ -53186,7 +53306,6 @@ jialei168.com jialez.com jialiangad.com jialianzg.com -jialidun.vip jialinep.com jialiwood.com jialiyoukuang8.com @@ -53209,6 +53328,7 @@ jian27.com jianada-qianzheng.com jianae.com jianai.love +jianai360.com jianavi.com jianayangzhiguo01.com jianbaizhan.com @@ -53226,6 +53346,7 @@ jiancenj.com jiancent.com jiancepai.com jiancepaper.com +jianchacha.com jianchiapp.com jianchihu.net jiandaima.com @@ -53241,6 +53362,7 @@ jianfc.com jianfei.com jianfei.net jianfeiba.com +jianfeibaike.com jianfeidaren.com jianfengstudio.com jiang7.com @@ -53309,6 +53431,7 @@ jiangzheba.com jiangzidushu.com jiangzikanshu.com jiangziyuedu.com +jiangzuoku.net jianhaobao.com jianhuagroup.com jianhuasheng.com @@ -53374,6 +53497,7 @@ jianshihui.net jianshionline.com jianshu.com jianshu.io +jianshu.tech jianshuapi.com jianshukeji.com jiansuji001.com @@ -53452,7 +53576,6 @@ jiaoyibao.com jiaoyimao.com jiaoyin.com jiaoyixia.com -jiaoyiyou.com jiaoyizhu.com jiaoyu361.com jiaoyuangroup.com @@ -53461,6 +53584,7 @@ jiaoyundiandongmen.com jiaoyunw.com jiaoyuwo.com jiaoyuzhan.net +jiaozhou.net jiapin.com jiapu.tv jiapuvip.com @@ -53480,6 +53604,7 @@ jiashuba.com jiashule.com jiasou.cc jiass.cc +jiasu.work jiasubook.com jiasucai.com jiasuhui.com @@ -53501,6 +53626,7 @@ jiawin.com jiawonongye.com jiawutech.com jiawuzhanzheng.org +jiawuzi.com jiaxianggame.com jiaxianghudong.com jiaxiangxm.com @@ -53542,7 +53668,6 @@ jiazhao7.com jiazhaoba.com jiazhi.online jiazhichem.com -jiazhijia.net jiazhoulvke.com jiazhuang.com jiazile.com @@ -53619,7 +53744,6 @@ jiekon.com jiekou.ltd jieku.com jielaigroup.com -jiele.com jieliapp.com jielibj.com jieligo.net @@ -53666,7 +53790,6 @@ jieshu.me jieshui8.com jieshuitech.com jieshuwang.com -jietianz.com jietu365.com jietuhb.com jietuosh.com @@ -53736,6 +53859,7 @@ jijianzhineng.com jijiaoyu.com jijie168.com jijigugu.club +jijijijin.com jijing.site jijinhao.com jijitec.com @@ -53746,6 +53870,7 @@ jikaicai.com jike.city jike.com jike.info +jike800.com jikecdn.com jikedata.com jikedingyue.com @@ -53757,11 +53882,13 @@ jikejiang.com jikejiazhuang.com jikejishu.com jikeq.com +jiketuchuang.com jikewan.com jikexiaojiang.com jikexiu.com jikexueyuan.com jikipedia.com +jikklfexh.com jikstatic.com jikuai.work jilailawyer.com @@ -53793,6 +53920,7 @@ jimetec.com jimi168.com jimifashion.com jimihu.com +jimilier.com jimingbao.com jimistore.com jimmoo.com @@ -53811,7 +53939,6 @@ jin10.com jin10x.com jinan-marathon.com jinan7.com -jinangov.com jinanhaofang.com jinanhualian.com jinankingyue.com @@ -53828,7 +53955,6 @@ jinbifun.com jinbilianmeng.com jinbitou.net jinbondt.com -jinbuhuan.net jincaicaiwu.com jincao.com jincaocw.com @@ -53847,7 +53973,6 @@ jindaixx.com jindaoshangwu.com jindati.com jinde-logistics.com -jindianzi.net jindidata.com jindidq.com jinding.cc @@ -53884,7 +54009,6 @@ jingc.com jingcai360.net jingcaipaint.com jingcaituijian.com -jingcdn.net jingchang.tv jingchengban.com jingchengwl.com @@ -53894,7 +54018,9 @@ jingchurc.com jingdajiance.com jingdaka.com jingdata.com +jingdeyx.com jingdianju.com +jingdianlaoge.com jingdianxitong.com jingdiao.com jingdigital.com @@ -53988,7 +54114,6 @@ jingshizyy.com jingshun-wl.com jingshzh.com jingsocial.com -jingsoft.com jingtai-group.com jingtanggame.com jingtao58.com @@ -54037,7 +54162,6 @@ jingyunos.com jingyunyilian.com jingyuweike.com jingzhengu.com -jingzhi.biz jingzhi5.com jingzhouxw.com jingzhu-bio.com @@ -54111,7 +54235,6 @@ jinlishenghuo.com jinliufu.net jinliyang.net jinliyu.cc -jinlong.vip jinlonggeishui.com jinluowater.net jinluzl.com @@ -54144,6 +54267,7 @@ jinpupvc.com jinqi2023.com jinqiang.online jinqiangjc.com +jinqianguan.com jinqianma.com jinqiaopu.com jinqiexia.com @@ -54158,7 +54282,6 @@ jinr.com jinridiaoyu.com jinrirm.com jinrishici.com -jinrishuiyinxiangji.com jinritemai-inc.com jinritemai.com jinritoutiao.com @@ -54192,11 +54315,11 @@ jinshanip.cc jinshanju.com jinshanmz.com jinshasitemuseum.com -jinshaxuexiao.com jinshengceramics.com jinshengtang.net jinsheyi.com jinshi-nj.com +jinshier66.com jinshileasing.com jinshisoft.com jinshitan.com @@ -54241,7 +54364,6 @@ jinxuliang.com jinxun.cc jinyaco.com jinyafu.com -jinyedaojia.com jinyici.com jinyidun.com jinyindao.com @@ -54258,7 +54380,6 @@ jinyunal.com jinyunjob.com jinyunweb.com jinyuzd.cc -jinzanzan.com jinzhao.me jinzheled.com jinzhengjt.com @@ -54366,6 +54487,7 @@ jitgame.com jitianhz.com jitriroad.com jittbang.com +jitucdn.com jitukaisuo.com jituofuture.com jituwang.com @@ -54406,7 +54528,6 @@ jiuhongwang.com jiuhua0566.com jiuhuaiwenxue.com jiuhuang.com -jiuhuaqifu.com jiuhuashan.cc jiuhuishou.com jiuhuoba.com @@ -54441,6 +54562,8 @@ jiuphone.com jiuq.com jiuqianwan.group jiuqianwanjituan.com +jiuqings193004.asia +jiuqings21833.asia jiuquan.cc jiuqucloud.com jiuquhe.com @@ -54455,7 +54578,6 @@ jiushengas.com jiushiadx.com jiushigong.com jiushui.tv -jiushuyun.com jiushuyunshop.com jiusi.com jiusi.net @@ -54498,9 +54620,6 @@ jiuyezhinan.com jiuyf.com jiuyi120.com jiuyiwenhe.com -jiuyou.com -jiuyou.net -jiuyou.vip jiuyue919.com jiuyuehuyu.com jiuyuu.com @@ -54517,6 +54636,7 @@ jiuzhouzb.com jiuzungame.com jiway.net jiweichengzhu.com +jiweixin168.com jiwu.com jiwucdn.com jixiang-ht.com @@ -54543,6 +54663,7 @@ jixueedu.com jixuninfo.com jixunjsq.com jixunlyq.com +jiyaogroup.com jiyi.art jiyi.biz jiyida-logistics.com @@ -54552,11 +54673,9 @@ jiyili.net jiyin-tech.com jiyin2020.com jiyixcx.com -jiyixinwangluo123.com jiyou-tech.com jiyoujia.com jiyouwang.com -jiyuanmall.com jiyuantour.com jiyue-auto.com jiyuncn.com @@ -54692,6 +54811,7 @@ jk126.com jk13.net jk169.net jk2h.com +jk33zu6.org jk37du.com jk3a.com jk725.com @@ -54723,7 +54843,6 @@ jkl6.com jkllbd.com jklughj.work jknanotech.com -jknuo.net jkouu.com jkpan.cc jkpj.com @@ -54748,11 +54867,11 @@ jkydt.com jkyule.com jkzhilu.com jkzl.com -jkzlrs.com jkzn365.com jl-er.com jl-jssk.com jl0435.com +jl0775.com jl1mall.com jl465.com jl519.com @@ -54799,7 +54918,6 @@ jlcerp.com jlcfa.com jlcmc.com jlcops.com -jlcpcb.com jlcsj.com jlcsmt.com jldjam.com @@ -54827,13 +54945,13 @@ jljnkj.com jljob88.com jljzzs.com jlkfapp.com +jlkgj.com jlkj.cc jlkjgroup.com jllihua.com jllyzxyy.com jlmhk.com jlmuban.com -jlmy.com jlnku.com jlnls.com jlonline.com @@ -54887,8 +55005,8 @@ jm-machines.com jm-talents.com jm1ph.com jm2046.com +jm233333.com jm3q.com -jm3uvitq0.com jmads.net jmbao.com jmbbs.com @@ -54936,12 +55054,14 @@ jmrb.com jmrcw.com jmsqw.com jmstatic.com +jmstation.com jmsxsw.com jmt-bio.com jmtnt.com jmtsg.com jmwater.com jmxckj.com +jmxiangyi.com jmxw.net jmycapacitor.com jmycbus.com @@ -54974,9 +55094,9 @@ jncjjt.com jncjsgroup.com jncncq.com jncyx.com -jndft28.xyz jndfzt.com jndwyy.com +jndzx.com jnec-tencentclb.cloud jnec-tencentclb.com jnec-tencentclb.net @@ -54998,6 +55118,7 @@ jnhyyy.com jnhzxx.com jnjj.com jnjpkj.com +jnjszl.com jnkason.com jnkj.org jnky.com @@ -55012,12 +55133,12 @@ jnnews.tv jnoec.com jnpfsoft.com jnpjyy.com -jnpuz.com jnqzyy.com jnrain.com jnreli.com jnrmyy.com jnruilun.com +jnryc.com jns168.com jnshijia.com jnshu.com @@ -55034,15 +55155,17 @@ jntinchina.com jntyhl.com jnubio.com jnw.cc +jnwb.net jnwenlian.com jnwinner.com +jnxdgs.com jnxtzdh.com +jnxydefsxx.com jnyczx.com jnydgm.com jnyng.com jnyyjt.com jnzhuoxin.com -jnzk.net jnzl.com jnzongchi.com jnzx.cc @@ -55167,6 +55290,7 @@ jonrmal.com jonsbo.com jonvie.com jooancloud.com +joobot.com jooioo.com joojcc.com joojtech.com @@ -55182,6 +55306,7 @@ jooyuu.com joqoo.com josen.net josephcz.xyz +joshreso.com joshua317.com jotop.com jotrin.com @@ -55214,7 +55339,6 @@ joyapi.com joyargroup.com joycity.mobi joydin.com -joydns.net joyfire.net joyforce.com joygames.com @@ -55279,6 +55403,7 @@ jp-tencentclb.work jp.com jp.run jp0663.com +jp95.com jpbeta.net jpcec.com jpchinapress.com @@ -55314,25 +55439,28 @@ jpvat.com jpwb.cc jpwb.net jpwind.com +jpwindow.com jpwky.com jpwxapp.com jpxm.com jpxue.com +jpxww.com jpyoo.com jpzx.net jpzy01.com jq22.com jq33.com -jqahg.com jqbar.com jqgc.com jqhtml.com jqkgjt.com jqlv.com +jqnbp.com jqncp.com jqpress.com jqr.com jqr5.com +jqrc.net jqrc88.com jqrkc.com jqs4463333a7.shop @@ -55355,6 +55483,7 @@ jqzplat.com jqzw.com jr-soft.com jr123.com +jr18.com jr2019.com jravity.com jrbiopharma.com @@ -55391,7 +55520,6 @@ jrteck.com jrtgroup.net jrwenku.com jrxzj.com -jry0.com jryccm.com jryghq.com jryssj.com @@ -55405,6 +55533,7 @@ js-cxjt.com js-dw.com js-emap.com js-gear.com +js-haiyao.com js-jiatai.com js-jinhua.com js-jwt.com @@ -55455,6 +55584,7 @@ jsbfgg.com jsbgj.com jsblj.com jsbsxh.com +jsbzwh.com jscba.org jsccn.com jscdn.ink @@ -55489,6 +55619,7 @@ jsd-jasper.com jsd.cc jsd2021.com jsdagua.com +jsdas.com jsdcly.com jsddbs.com jsddhjt.com @@ -55592,6 +55723,7 @@ jshdwh.com jshealth.com jshemc.com jshfgroup.com +jshgfm.com jshggroup.com jshgyb.com jshhjkjt.com @@ -55642,7 +55774,6 @@ jsjdrcb.com jsjdzf.com jsjeda.com jsjffj.com -jsjform.com jsjfz.com jsjgbxg.com jsjgtz.com @@ -55731,6 +55862,7 @@ jsnjck.com jsnjjg.com jsnkmy.com jsnol.com +jsnovel.com jsntg.com jsntgas.com jsnx.net @@ -55815,6 +55947,7 @@ jssltz.com jssnrcb.com jssoar.com jssqwx.com +jsssha.com jsssrj.com jsssy.com jsstgs.com @@ -55880,6 +56013,7 @@ jsweiqi.com jsweixiu.com jswel.com jswenguang.com +jswenjin.com jswfgroup.com jswjkj.net jswmw.com @@ -55894,6 +56028,7 @@ jswx-ej.com jswxhy.com jswxjx.com jswxmax.com +jswyglw.com jswyjt.com jswyw.com jswzjt.com @@ -55991,6 +56126,7 @@ jszjxh.com jszjzf.com jszkrz.com jszlgjg.com +jszmgj.com jszmly.com jszn.ink jsznstny.com @@ -56022,6 +56158,7 @@ jtbtech.com jtcjd.com jtcopper.com jtexpress.com +jtfcg.com jtfengtou.com jtfulfillment.com jtg2g.com @@ -56047,6 +56184,7 @@ jtlw.com jtlzj.net jtlzx.com jtm-food.com +jtm.pub jtmedical.com jtn.com jtnsh.com @@ -56095,6 +56233,7 @@ juchuangfushi.com jucuiwangluo.com judajia.com judehahh.tech +judns.com judong-1.com judouapp.com juduoping.com @@ -56178,7 +56317,6 @@ julanggroup.com julanhp.com julanling.com julebu.co -julebu.pw julecn.com julefun.com juli-china.com @@ -56200,7 +56338,6 @@ julong.cc julongchina.com julonggr.com juluape.com -julycloud.net julycn.com julydate.com julyedu.com @@ -56215,6 +56352,7 @@ jumengco.com jumengren.com jumengtbs.net jumi-cdn.com +jumi.com jumi18.com jumin.cc juming-xz.com @@ -56224,6 +56362,7 @@ jumold.com jumore.com jump-center.com jump-game.com +jump301.com jumpjumpcat.com jumple.com jumppo.com @@ -56289,6 +56428,7 @@ junqing360.com junrunrenli.com junsaozg.com junshanggame.com +junshencm.com junshi.com junshi881.com junshidao.com @@ -56305,6 +56445,7 @@ juntu.com junwu262.com junxinmed.com junxunkji.com +junyao.tech junyi-auto.com junyimeng.com junying.com @@ -56326,19 +56467,19 @@ jupiterlauncher.com jupup.com juqi.com juqianwh.com -juqiao1913.com juqibike.com juqingla.com juqk.net juquanquanapp.com jurcc.net +juren.com jurenqi.com jurongfangchan.com jurongrencai.com jurp.net -jus475.com jusdasr.com juseey.com +jusen2008.com jusha.com jushe.org jushen.co @@ -56392,7 +56533,6 @@ jutubao.com jutuike.com jutuilian.com juuhe.com -juushop.com juvefans.com juwa.net juwan.com @@ -56401,7 +56541,6 @@ juwangmedia.com juwanhezi.com juwanshe.com juweixin.com -juwinmedia.com juxia.com juxian.com juxiang3d.com @@ -56416,6 +56555,7 @@ juyang-chem.com juyebwg.com juyingele.com juyingonline.com +juyisuliao.com juyoubao.com juyoukuaisong.net juyouqu.com @@ -56426,6 +56566,7 @@ juyouxuan.vip juyuan.com juyuewang.net juyun.tv +juyutube.com juyuweb.net juzhen.com juzhen.io @@ -56438,6 +56579,7 @@ juzhongjoy.com juzicon.com juzicy.com juzifenqi.com +juzijiudian.com juzikong.com juzilicai.com juzimi.cc @@ -56458,9 +56600,8 @@ jvcxp.com jvdebao.com jvgnwn.sbs jvmai.com -jvmcc.com -jvmee.com jvniubi.com +jvpin.vip jvrong.com jvshangwang.com jvshi.net @@ -56468,7 +56609,6 @@ jvtianshanuu.com jvyou.net jw100.net jw1588.com -jwangzhong.com jwappgc.com jwautoparts.com jwbf.online @@ -56476,11 +56616,13 @@ jwbl.com jwdili.com jwedit.net jwetech.com +jwfun.com jwgb.net jwgf.com jwick-switch.com jwipc.com jwkj.site +jwl100.com jwsaas.com jwsem.com jwshy.com @@ -56500,6 +56642,7 @@ jx116114.com jx139.com jx163-cname.com jx163.com +jx188.com jx3box.com jx3mogu.com jx3pve.com @@ -56528,7 +56671,6 @@ jxcua.com jxdcnc.com jxdcost.com jxdcw.com -jxddny.com jxdhhbhg.com jxdiguo.com jxdinfo.com @@ -56538,10 +56680,12 @@ jxdown.com jxdx.com jxdxxt.com jxdyf.com +jxdyk65ay.com jxdyyy.com jxeca.com jxedgroup.com jxedt.com +jxedu.net jxeduyun.com jxenglish.com jxep.net @@ -56566,13 +56710,11 @@ jxgztv.com jxh2000.net jxheming.com jxhesyy.com -jxhh.com jxhjxy.com jxhmjx.com jxhmxxjs.com jxhswhcb.com jxhuahang.com -jxhuanyun.com jxhxmed.com jxhyxx.com jxiaolan.com @@ -56581,15 +56723,16 @@ jximage.com jxjatv.com jxjdgy.com jxjee.com +jxjia.net jxjianwei.com jxjktzjt.com jxjmzc.com jxjob.net jxjt666.com jxjuwentech.com +jxjx6.com jxjywater.com jxkeda.com -jxkfxz.com jxkjzb.com jxkp.com jxksw.net @@ -56603,6 +56746,7 @@ jxlwgame.com jxlygo.com jxmhp.com jxmj.com +jxmlkd.com jxmrfire.com jxmy18.com jxncyy.com @@ -56617,7 +56761,6 @@ jxphone.com jxpp.com jxpta.com jxqcw.com -jxqx.net jxqy.city jxqyfw.com jxrays.com @@ -56649,6 +56792,7 @@ jxsltz.com jxslyw.com jxsrjt.com jxsrra.com +jxssjx.com jxssjy.com jxstm.com jxsuji.com @@ -56705,7 +56849,6 @@ jxzeto.com jxzikao.net jxzl.cc jxzyx.com -jy-heju.com jy-leasing.com jy-sz.net jy.cc @@ -56728,7 +56871,6 @@ jycbank.com jycinema.com jycloudgslb.com jycloudgslb.net -jydalycs.com jydc.com jydj.net jydoc.com @@ -56750,6 +56892,7 @@ jygo.cc jygpu.com jygsdyrmyy.com jyguagua.com +jygyl.com jygz.com jygz.org jyh.com @@ -56814,7 +56957,6 @@ jysu.com jysyyey.com jysyzk.com jysyzx.net -jyszyl.com jytaier.com jytcdq.com jytche.com @@ -56880,6 +57022,7 @@ jzhfz.com jzhkr.com jzhlgg.com jzhospital.com +jzhuishou.com jzhx.net jzhy5.com jzj2009.com @@ -56890,9 +57033,9 @@ jzking.com jzkjjt.com jzlt100.com jzmbti.com +jzmjtjn.xyz jzmlzy.com jzmob.com -jzmsg.com jzmt.net jznygf.com jznyjt.com @@ -56908,6 +57051,7 @@ jzrc.net jzrsks.com jzsbs.com jzsbxxh.com +jzsc.net jzsc8.com jzsec.com jzsf.com @@ -56959,6 +57103,7 @@ k1u.com k1wave.com k22.xyz k2os.com +k365.asia k366.com k369.com k382.com @@ -56966,6 +57111,7 @@ k3cdn.com k3yes.com k43439.com k518.com +k5hp4qte.work k5n.com k6uk.com k73.com @@ -56978,7 +57124,6 @@ k8smeetup.com k8stech.net k913.com k99.cc -ka016.com ka20.com ka5188.com kaaass.net @@ -57047,7 +57192,6 @@ kaihuaeva.com kaihuia.com kaijia-smt.com kaijia.com -kaijiacloud.com kaijiage.com kaijiejinrong.com kaijieunion.com @@ -57132,7 +57276,6 @@ kaiyuncare.com kaiyunwu.net kaizencpa.com kaizhan.com -kajely.com kajicam.com kaka.com kaka996.com @@ -57158,7 +57301,6 @@ kalifang.com kaliorg.com kalugaqueen.com kaluli.com -kamacoder.com kamaqc.com kameng98.com kamenwang.com @@ -57204,6 +57346,7 @@ kangbeijia.com kangbidz.com kangbixing.com kangchun.com +kangdacolorful.com kangdaep.com kangdajiuzhou.com kangdalawyers.com @@ -57225,6 +57368,7 @@ kanghuicy.com kanghuwang.com kangjiachildcare.com kangjian.com +kangjian888.com kangjiezx.net kangkang.com kanglaohui.com @@ -57282,7 +57426,6 @@ kanman.com kanniao.com kanong.com kanongyun.com -kanpinduo.com kanqibao.com kanqiye.com kanqq.com @@ -57322,6 +57465,7 @@ kao8.cc kaoaa.com kaobeitu.com kaochong.com +kaochongqing.com kaodaojy.com kaodongli.com kaoersi.com @@ -57356,7 +57500,6 @@ kaoshixing.com kaoshizixun.com kaosite.com kaostedu.com -kaouusi.com kaowana.com kaowang.com kaowx.com @@ -57428,6 +57571,7 @@ kblcdn.com kblin.com kbmlifesci.com kbn-zhejiang.com +kbnqy.com kbobo.com kboth.com kbrightlaw.com @@ -57443,6 +57587,7 @@ kc87.com kcbebank.com kccidc.com kccn.net +kcdn0.com kcdnvip.com kcfei.com kchance.com @@ -57460,7 +57605,6 @@ kcqcjt.com kcrcb.com kcrea.cc kctgov.com -kcttpa.com kctzgroup.com kcwiki.org kcyuri.com @@ -57472,6 +57616,7 @@ kd315.com kd58.com kd9000.com kdadj.com +kdaec.com kdatacenter.com kdcloud.com kdclub.net @@ -57484,6 +57629,7 @@ kdkefu.com kdlgs.com kdnet.net kdniao.com +kdpt.net kdr163.com kdrmd.com kdroid.club @@ -57647,11 +57793,11 @@ kelu.org kelun.com keluokelie.com keluyjs.com -kema.net kema66.com kemaicrm.com keman.com kemavip.com +keme.work kemiaotai.com kemicro.com kemike888.com @@ -57697,6 +57843,7 @@ kercoras.com kerisom.com kerlala.com kernel-sh.com +kernel.cc kernelfood.com kernelmed.com kernelnote.com @@ -57717,6 +57864,7 @@ kerust.com keruyun.com keruyun.net kery-pharm.com +kerysoft.com kesci.com kesheng.com keshenwei.com @@ -57737,6 +57885,7 @@ kevinlq.com kevke.com kewu.cc kewucool.com +kexgfv.com kexianggroup.com kexin001.com kexinbiotech.com @@ -57787,6 +57936,7 @@ keyunlaser.com keyunsoft.com kezehb.com kezhaozhao.com +kezhi.tech kf.ai kf155yy.com kf3msfm.com @@ -57798,7 +57948,6 @@ kfang.xin kfb126.com kfb163.com kfcbest.com -kfcccc.com kfcdn.com kfcjrl.com kfcrm.com @@ -57885,7 +58034,6 @@ kimi.ai kimi.com kimi.link kimi.pub -kimi.site kimiss.com kimiss.net kimiter.com @@ -57895,7 +58043,6 @@ kimsom.com kimxz.com kina.cc kinbull.com -kincony.com kindechem.com kindlelib.com kindobest.com @@ -58023,16 +58170,16 @@ kisops.com kiss998.com kisskisso.com kissyj.com +kissyui.com kit-lee.me kitic.net kitiu.com kitking.com kitontech.com kitstown.com +kitty.su kituin.fun kivend.net -kivicube.com -kivisense.com kivo.fun kivo.wiki kiwa-tech.com @@ -58040,7 +58187,6 @@ kiwenlau.com kiwifarms.net kiwifarms.st kiwimoore.com -kiwiot.com kiwisec.com kiyuu.club kj-pcb.com @@ -58071,6 +58217,7 @@ kjjxjy.com kjkd.com kjkp.com kjks.net +kjkxun.com kjlww.com kjmofang.com kjmte.com @@ -58084,6 +58231,7 @@ kjtbao.com kjtianshanxu.com kjtong.com kjtpay.com +kjutf-uejfncpo72u.com kjw.cc kjwlxt.com kjwugx.com @@ -58099,6 +58247,7 @@ kk-china.com kk1.vip kk169.com kk18.com +kk1bie336689.com kk30.com kk30.net kk3g.net @@ -58131,15 +58280,14 @@ kkid.vip kkidc.com kkj2.com kkjiaofei.com -kkjishu.com kkk5.com kkkwww.com kkkxj.com kklxj.com +kkmall.org kkmar.com kkmh.com kkmicro.com -kkmm.com kkmop.com kkong.vip kkrb.net @@ -58172,7 +58320,6 @@ kldhq.com klhpw.com klhuyan.com klicen.com -kling-ai.com klingai.com klingxai.com klinlee.com @@ -58210,7 +58357,6 @@ km28.com km5858.com km8z.net kmail.com -kmaosmart.com kmaoxx.com kmapp.net kmbbs.com @@ -58229,12 +58375,12 @@ kmeecc.com kmeila.com kmeitu.com kmf.com +kmfengli.com kmgdgs.com kmguolv.com kmhpc.net kmhwtz.com kmjt.net -kmksy.com kmlcl.com kmlhh.com kmmama.com @@ -58253,6 +58399,7 @@ kmsz.net kmszy.com kmteruite.com kmthy.com +kmtlbj.com kmtlfckyy.com kmtrh.org kmvtc.net @@ -58297,6 +58444,7 @@ knowfashionstyle.com knowhowedu.com knowingclouds.com knowingcloudvip.com +knowingyun.com knowledgu.com knowlink-assets.com knownpcb.com @@ -58328,7 +58476,6 @@ kodakbanjara.com kodcloud.com koderover.com kodmp.com -koebpmhcce.com koenli.com kof-kol.club kofficemart.com @@ -58360,7 +58507,9 @@ konekomoe.com konfan.net kongai.org kongapi.com +kongbugushi.com kongdao.com +kongduan.com kongfz.com kongge.com kongjibusiness.com @@ -58375,6 +58524,8 @@ kongquecheng.com kongqueyuzd.cc kongrong.com kongtiao163.com +kongtiao365.com +kongwu2022.com kongzhi.net kongzhong.com konka.com @@ -58406,6 +58557,7 @@ koovin.com koowo.com kopebe.com kopisee.com +kopitokein.com koplayer.com kopperchem.com koreabt.com @@ -58432,7 +58584,6 @@ koudaigou.net koudaili.com koudaionline.com koudaionline.net -koudaistory.com koudaitiku.com koudaitong.com koudashijie.com @@ -58506,16 +58657,16 @@ kr-tencentclb.com kr-tencentclb.net kr-tencentclb.work kr126.com +kra-5at.com krahag.com krak12.com krd168.com +krdrama.com krenzheng.com kridol.com kriszhang.com -krohnechina.com krones-group.com krones.com -krowork.com krpano.tech krqcitie.com krszf.com @@ -58549,11 +58700,10 @@ kschuangku.com kscloudapi.com ksco.cc ksdedu.com -ksdyob.store +ksdhgy.com ksecit.com ksedt.com kseibitools.com -ksepton.com ksfang.com kshahn.com kshaoteng.com @@ -58591,10 +58741,10 @@ ksren.com ksrenfan.com ksria.com ksrmtzx.com -ksrmyy.com ksrmyy.org ksrsy.com ksruanjian.com +kssip.msi.com kssjkj.com ksslxh.com kst-cn.com @@ -58636,6 +58786,7 @@ kszpw.com kszxzsxh.com kt007.com kt10000.com +kt286.com kt40.com kt5u.com ktallong.com @@ -58653,6 +58804,7 @@ ktmap.com ktmv.com ktmwan.net ktplay.com +ktq8e0zm.work ktrcn.com ktrlight.com ktstny.com @@ -58752,6 +58904,7 @@ kuaile800.com kuailedo.com kuailekaishi.com kuailelunwen.com +kuailepipixia.com kuailetongyao.com kuailexs.com kuailexue.com @@ -58817,6 +58970,7 @@ kuaizhang.com kuaizhaogong.com kuaizhe.com kuaizhihui.com +kuaizhou123.com kuaizi.co kuaizip.com kuaizitech.com @@ -58858,6 +59012,7 @@ kuark.com kuashou.com kuayuegroup.com kubercloud.com +kubey.cc kubikeji.com kuboluo.com kuche.com @@ -58866,13 +59021,11 @@ kuchuan.com kucoin-in.work kucunguanli.online kudapp.com -kudashi.com kudianvip.com kudiaoyu.com kudingyu.com kudou.org kuems.com -kufaka.com kufangwuyou.com kufaxian.com kufei.com @@ -58916,7 +59069,6 @@ kukasofa.com kuke.com kuke99.com kukecloud.com -kukongjian.com kukseo.com kukuda.net kukulv.com @@ -58946,6 +59098,7 @@ kumifeng.com kun-pharm.com kunchuang.com kunduo.com +kungfucloud.com kungfuenglish.com kungfumars.com kunguankeji.com @@ -58958,6 +59111,7 @@ kunlunaq.com kunlunar.com kunlunca.com kunluncan.com +kunlunce.com kunlundns.com kunlunea.com kunlungem.com @@ -58998,6 +59152,7 @@ kuo-yi.com kuobuy.com kuocaicdn.com kuocaidns.com +kuocaiyun.com kuoo8.com kuos.xyz kuosheng.com @@ -59032,6 +59187,7 @@ kushuzw.com kusnc17.com kuso.xyz kusouji.com +kut3974vc.com kutj.com kutongji.com kutuan.com @@ -59049,7 +59205,6 @@ kuxiaoji.com kuxiaomiao.com kuxiaozhu.com kuxiuktv.com -kuxsw.com kuxueedu.com kuyh.com kuyibu.com @@ -59073,6 +59228,7 @@ kviso.com kvogues.com kvov.com kvps85.com +kw007.com kwai-group.com kwai666.com kwaiadapp.com @@ -59139,6 +59295,7 @@ kxdw.com kxiaoshuo77.com kxji.com kxjlzx.com +kxl100.com kxlc.com kxll.com kxload.com @@ -59179,14 +59336,17 @@ kych5.com kydev.net kydl308015.vip kydl308029.vip +kydzfl.com kye-erp.com kye.vip kyec.cc kyemall.com kyfey.com kygroup.ltd +kygso.com kyhtech.com kyhyxy.com +kyjlhz.com kyjxy.com kyk.cc kykjgroup.com @@ -59202,6 +59362,7 @@ kylpharm.com kymjs.com kyo.hk kyppt.com +kysjhx.com kyslb.com kysnxt.com kysygs.com @@ -59211,12 +59372,9 @@ kyv5.com kyw4y0s.com kyxdloan.com kyxh.com -kyxinli.com kyxsw.org kyy6.com kyzhpt.com -kyzhsw.com -kyzhwater.com kyzs.com kz.cc kz0.cc @@ -59224,6 +59382,7 @@ kz321.com kzcpm.com kzgui.com kzmyhome.com +kzo.moe kzrcw.com kzread.com kzrqicae.com @@ -59238,16 +59397,20 @@ l1yu.com l2cn.com l2h.site l2t7.cc +l2z4l.net l3gt9.com l68.net +l6qmpykq.work l799vk4qe2.com l7audiolab.com +l85r.com l99.com la-bbs.net la-chinata.hk la-technology.com la31.com laawoo.com +lab-bst.com lab-easttitan.com lab-z.com labaoxian.com @@ -59303,6 +59466,7 @@ laibot.com laichon.com laichou.com laichuanfeng.com +laidacai.com laidazi.com laidingba.com laidudu.com @@ -59317,9 +59481,11 @@ laigong.com laihua.com laihuishequ.com laijiawen.com +laijishaofang.com laijuba.com laikan.com laikanxia.com +laikanxing.com laikanxs.com laike.net laiketui.com @@ -59330,6 +59496,7 @@ lailin.xyz lailinzhihui.com lailook.net laimaidi.com +lainse.store lainzy.net laipei.net laiqi.net @@ -59339,11 +59506,14 @@ laird-tek.com laisai.com laishui.info laisizuji.com +laisj.com laitelaide.com laituia.com laituijian.net laiwang.com laiwo.com +laiwu.net +laiwuyizhong.com laixi.com laixiangzuji.com laixiukeji.com @@ -59388,6 +59558,7 @@ lanall.com lanapartments.com lanbenjia.com lanbing510.info +lanbinimall.com lanbts.com lanbula.com lancdn.com @@ -59458,6 +59629,7 @@ langemedtech.com langfang.com langfang12345.com langfangfc.com +langfly.com langgine.com langhao-medical-platform.com langhuansoft.net @@ -59503,6 +59675,7 @@ lanhui.com lanin.tech lanindex.com lanjie100.com +lanjie520.com lanjingads.com lanjinger.com lanjingerp.com @@ -59588,7 +59761,6 @@ lanxiongsports.com lanxixiaowu.com lanxum.com lanyaa.com -lanyikeji.asia lanying.site lanyingwang.com lanyu.net @@ -59648,7 +59820,6 @@ laoduo.net laoduzhe.com laoevisa.gov.la laofengwei.com -laofengxiang.com laofu.online laoge.xyz laogongshuo.com @@ -59665,6 +59836,7 @@ laolai.com laolaishou.com laolaomiyou.com laoliang.net +laoliboke.com laolieren.com laolieren.shop laoliuceping.com @@ -59692,10 +59864,12 @@ laowalens.com laowuxx.com laoxiangji.com laoxianhui.com +laoxiezi.com laoxuean.com laoxuehost.net laoxuezhuji.com laoy.net +laoyancheng.com laoyaoba.com laoyi0773.com laoyoujiaju.com @@ -59738,7 +59912,9 @@ larksuiteimg-pre.com larkworld.com larmace.com larryms.com +larscheng.com laruence.com +lasashengdi.com laschina.org lascn.net laserfair.com @@ -59768,6 +59944,7 @@ lavago.com lavandehotels.com lavapm.com lavaradio.com +lavdrzv.xyz law-lib.com law-star.com law-wei.com @@ -59825,6 +60002,7 @@ lazada.vn lazcdn.com laze.cc lazyaudio.com +lazybios.com lazycat.cloud lazycatmicroserver.com lazycomposer.com @@ -59909,7 +60087,6 @@ lcchgg.com lccmw.com lccyy.com lccz.com -lcdfans.com lcdhome.net lcdtz.com lcdushi.com @@ -59938,6 +60115,7 @@ lckeshun.com lckfb.com lckiss.com lcloudcdn.com +lcmack.com lcmhbl.com lcnichia.com lcofjp.com @@ -59957,6 +60135,7 @@ lcsrw.com lcsssg.com lcsyzp.com lctech-inc.com +lctsggzz.com lcux.net lcxtgs.com lcxwfc.com @@ -60028,6 +60207,7 @@ le4.com le4le.com le5le.com le8.com +le855.com le890.com leacol.com leadada.com @@ -60131,6 +60311,7 @@ lecomposites.com lecong56.com leconiot.com lecoo.com +lecreperoyaloak.com lecu8.com lecuiwangluo.com lecuntao.com @@ -60180,7 +60361,6 @@ leftshadow.com leftso.com lefu8.com legalsiri.com -legaltech.cc legend-si.com legendsec.com legendsemi.com @@ -60204,6 +60384,7 @@ leiaomold.com leibei.cc leiboyiqi.com leidacj.com +leidianip.com leigod.com leigodjsq.com leihetg.com @@ -60215,6 +60396,7 @@ leikeji.com leileiluoluo.com leilong158.com leimengjixie.com +leimi.com leimingtech.com leimingtelab.com leimudata.com @@ -60245,6 +60427,7 @@ leixue.com leiyunge.com leiyunge.net leji.com +lejiachao.com lejian.com lejiao.tv lejiaolexue.com @@ -60258,6 +60441,7 @@ lejunwl.com lekan.com lekannews.com lekevr.com +lekoukou.com lektec.com lekuya.com lelaer.com @@ -60273,7 +60457,6 @@ lelelab.work lelepyq.com leletv.com leletv.net -leleyun.icu lelinly.com lelongpp.com lemai.com @@ -60291,7 +60474,7 @@ lemobar.com lemoes.com lemon4.club lemonban.com -lemonedrum.com +lemonnovel.com lemonpiggy.com lemonplus.asia lemonsay.com @@ -60312,7 +60495,6 @@ lenget.com lenglengyu.com lengliwh.com lenglv.com -lengmo.cc lengshuiji.org lengxiaohua.com lengxiaohua.net @@ -60348,6 +60530,7 @@ lenovouat.com lenovows.com lenovozdl.com lenschine.com +lenslifephoto.com lensuo.com lenwoo.com lenzhao.com @@ -60367,16 +60550,19 @@ lepidard.com leptv.com lepudding.com lepumedical.com +leqi.us leqian.com leqiaobh.com leqiaobhyy.com leqiku.com +leqiuba.com lequ.com lequanip.com lequgo.com lequji.com lequz.com lequzh.com +lercar.com lergle.com lerist.dev lers168.com @@ -60412,7 +60598,6 @@ letabc.com letang666.com letao.com letaoedu.com -letaohuo.com letaoren.com letbonchina.com leter.io @@ -60501,12 +60686,12 @@ leyifan.com leying.com leying365.com leyingtt.com +leyishandong.com leyixue.com leyonb.com leyoo.com leyoujia.com leyu.com -leyuansu.com leyue100.com leyuglobal.com leyun365.com @@ -60523,6 +60708,7 @@ lezhi99.com lezhibo.com lezhiyun.com lezhuan365.com +lezhuanwang.net lezhudai.com lezhufenqi.com lezhun.com @@ -60530,6 +60716,7 @@ lezi.com lezuan.net lezuan11.com lezuan9.com +lezuocai.com lf126.net lf127.net lfan.net @@ -60538,6 +60725,7 @@ lfbxw.com lfcharge.com lfcmw.com lfdjex.com +lfekaj.help lfex.com lffloor.com lfhacks.com @@ -60548,6 +60736,7 @@ lfjsly.com lfjx88.com lfkjgh.com lfksqzj.com +lfmxc.com lfppt.com lfqysm.com lfrczp.com @@ -60634,6 +60823,7 @@ lhkgs.com lhl.zone lhmj.com lhmp.cc +lhovoxcx.work lhp-cdn-game.online lhp-cdn-update.online lhpharma.com @@ -60645,6 +60835,7 @@ lhs99.com lhsdjxy.com lhsoso.com lhszyxx.com +lhulan.com lhvlkgbkjmrnc.com lhwill.com lhwytj.com @@ -60674,12 +60865,14 @@ lianda.fun liandaomobi.com liande.cc lianfawy.com +lianfengwh.com liang520.com liangc.com liangchan.net liangchanba.com liangduapp.com liangduiban.com +lianggao.com lianghuadashi.com liangjiangbashu.com liangjianghu.com @@ -60754,6 +60947,7 @@ lianqigong.com liansaipiao.com lianshang.com lianshijie.com +lianshun.cc liansn.com liansuo.com liantianhong.com @@ -60789,6 +60983,7 @@ liaochuo.com liaogu.com liaogx.com liaoing.com +liaojiu.net liaokong.com liaoliao.com liaoningmoduo.com @@ -60822,6 +61017,7 @@ liblib.cloud liblib.tv libmk.com libomarathon.com +libreofficechina.org libsou.com libssh.com libsys.net @@ -60909,7 +61105,9 @@ liewen.cc liewen.la liexing-ai.com liexing.com +lieyingjt.com lieyou.com +lieyouqi.com lieyuncapital.com lieyunwang.com liezhe.com @@ -60922,6 +61120,7 @@ lifediary.shop lifeeu.com lifefunkingdom.org lifegc.com +lifegreenmedical.com lifengshoe.com lifeofguangzhou.com lifesense.com @@ -60933,7 +61132,6 @@ lifeup.vip lifevc.com lifevccdn.com lifeweeker.com -lifexue.com lifeyk.com lifeyn.net lifezb.com @@ -61038,7 +61236,6 @@ lilaigroup.com lilanz.com lili.cc liliangji.com -lilihuyu.com lilinwei.com lilishare.com lilisi.com @@ -61065,7 +61262,6 @@ linakesi.com linancity.com linaoyiqi.com linban.com -linbeigame.com linchuangsy.com lincoc.com lindapatent.com @@ -61132,13 +61328,13 @@ lingkuyun.com lingla.com linglingkaimen.com linglingmo.site +linglong.dev linglongart.com linglonglife.com linglongtech.com lingmao.tech lingmeng888.com lingmovie.com -lingnanlv.com lingnanpass.com lingo-ace.com lingodeer.net @@ -61155,6 +61351,7 @@ lingshangmeien.com lingshenxl.com lingshi.com lingshimiyu.com +lingshou.com lingshunlab.com lingsiqiwu.com lingsky.com @@ -61215,12 +61412,14 @@ linhuatz.com linhuiba.com lining.com lining0806.com +linjia.me linjieapp.com linjin.net linjunlong.com link-ai.tech link-nemo.com link-trans.com +link27.com link2lib.com link2shops.com link3.cc @@ -61329,7 +61528,6 @@ linuoshi.com linuottc.com linux-code.com linux-ren.org -linux.sb linux.zone linux178.com linux265.com @@ -61339,6 +61537,7 @@ linuxbaike.com linuxbaodian.com linuxboy.net linuxde.net +linuxdiyf.com linuxdot.net linuxea.com linuxeden.com @@ -61413,6 +61612,8 @@ lishibu.com lishichunqiu.com lishicloud.com lishiip.com +lishiming.net +lishimingren.com lishixiaozhi.com lishixinzhi.com lishizhishi.com @@ -61427,7 +61628,6 @@ lisp123.com lissgx.com listary.net listarypro.com -listenai.com listeneer.com listeningo.com listenpa.com @@ -61469,6 +61669,7 @@ litree.com litten.me little-sun.com littleboy.net +littlegeek.work littlehero.xyz littleqiu.net littleroost.net @@ -61509,6 +61710,7 @@ liuhanyu.com liuhaolin.com liuhubang.com liujiajia.me +liujian666.com liujiaoyidai.com liujijun.com liujto.com @@ -61530,6 +61732,7 @@ liuliangmima.club liuliangmima.vip liuliangzu.com liuliguo.com +liulin.cc liulishuo.com liulishuo.work liulixuexiao.com @@ -61543,6 +61746,7 @@ liumx.com liunian.info liunianbanxia.com liunn.com +liuqh.icu liurq.com liushen.fun liushidong.com @@ -61581,6 +61785,7 @@ liuyangfcw.com liuyangjob.com liuyanzhao.com liuyifei.cc +liuyimin4.com liuyixiang.com liuyua.xyz liuyunflow.com @@ -61603,6 +61808,7 @@ live-voip.com live123.cc live800.com liveapp.ink +livebong68.com livecdnstatic.com livechina.com livecourse.com @@ -61614,8 +61820,6 @@ livemediav.com livemook.com livenmall.com liver-surgery.net -livesaascdn.com -livesaasvolccdn.com livesone.net livesupport24x7.com liveuc.net @@ -61624,8 +61828,8 @@ living.ai liwai.com liwanggui.com liwanght.com -liwei.biz liweiauto.com +liweicar.com liweijia.com liweijituan.com liweiliang.com @@ -61684,6 +61888,7 @@ liyunde.com liyunkm.com liyuplay.com liyx.fun +liyx.net lizaberese.com lizaike.com lizhehaozhongyi.com @@ -61722,7 +61927,6 @@ ljbao.net ljbbj.com ljcdn.com ljclz.work -ljcyun.xyz ljflavor.com ljh.cool ljhjgc.com @@ -61735,7 +61939,6 @@ ljjq.com ljjyjt.com ljk.cc ljkangyang.com -ljkfdx.com ljlcd.com ljlmdns.com ljlqw.com @@ -61748,6 +61951,7 @@ ljs.fun ljsdk.com ljsy2017.com ljsz.xyz +ljth.hk ljw113.com ljwebs.com ljwit.com @@ -61786,6 +61990,7 @@ lkpc.com lkqihang.com lksmarttech.com lkuaiy.com +lkxfeda.com lkyljt.com lkyou.com ll-hao123.com @@ -61795,6 +62000,7 @@ llaoyou.com llbzy.com llcat.tech lldlf.com +llever.com llewan.com llgjx.com llgkm.com @@ -61803,6 +62009,7 @@ llguangli30.com llhlkftzjt.com llidc.com llinkslaw.com +lljgame.com lljsq.net lljyx.com llku.com @@ -61830,6 +62037,7 @@ llumar-cn.com llwx.net llx168.com llxj119.com +llxx.cc llxzl.com llxzu.com llyj.net @@ -61941,7 +62149,6 @@ lnsrmyy.com lnsslhyxh.com lnsyzx.com lnszyjt.com -lntongyu.com lntvu.com lntycp.com lnvipsoft.com @@ -61954,6 +62161,7 @@ lnydjt.com lnyxcj.com lnyyzyxy.com lnzcj.com +lnzhongka.com lnzhqy.com lnzsks.com lnzy-edu.com @@ -62000,7 +62208,6 @@ logisteed-sc.com logistics-ea.com logisticstech.com logo-emblem.com -logo123.com logo123.net logo2008.net logo888.com @@ -62024,6 +62231,7 @@ logwirecloud.com lohaa.com lohalink.com lohand.com +lohasor.com lohjs.com lohkahhotels.com loho88.com @@ -62079,7 +62287,6 @@ longbridgeapp.com longbridgehk.com longcai.com longcai027.com -longcat.chat longchangjixiekeji.com longcheer.com longchunbajiao.com @@ -62175,6 +62382,7 @@ longxi-tech.net longxianwen.net longxinfa.com longxinglong.com +longxinli.com longxintec.com longxuan.ren longyanbus.com @@ -62197,6 +62405,7 @@ longzhu.tv longzhudagroup.com longzhulive.com lonhcloud.net +lonleaf.com lonlife.org lonmedcn.com lonsoon.com @@ -62235,6 +62444,7 @@ loongsin.com loongson.org loongsonclub.com loongtravel.com +loongxy.com loonlog.com loooooong.com looquan.com @@ -62260,7 +62470,6 @@ lot-ml.com lotevision.com lotianshangx.com lotlab.org -lotour.cc lotour.com lotour.net lotpc.com @@ -62301,6 +62510,7 @@ lovefree.cc lovehaimi.com lovehhy.net lovehifi.com +loveifgames.com loveinhere.com lovejavascript.com lovejia.win @@ -62323,8 +62533,8 @@ lovetan.net loveteemo.com loveu.life loveuav.com -loveutips.com lovev.com +lovevibe1.com lovewith.me lovfp.com lovgiin.com @@ -62359,6 +62569,7 @@ lpsckf.com lpspt.com lpszstv.com lptiyu.com +lpxinjuhui.com lpxinke.com lpxt.com lpxuqi2057.vip @@ -62369,9 +62580,9 @@ lqabr.com lqbby.com lqbj.com lqbj66.com -lqfaka.com lqfeather.com lqgy.com +lqhualang.com lqjob88.com lqjt.com lqlst.com @@ -62393,10 +62604,12 @@ lqzh.me lqzp.com lqzwdj.com lr-amm.com +lr-link.com lrc99.com lrcb.net lrdcq.com lrhold.net +lricn.com lrist.com lrkdzx.com lrkj.net @@ -62445,6 +62658,7 @@ lshdw.cc lshfreda.com lshitv.com lshou.com +lshzj.com lsij3km.com lsit.net lsjgcx.com @@ -62471,6 +62685,7 @@ lsmtjy.com lsmzt.cc lsnm.com lsoos.com +lspjy.com lsplayer.com lsqcjjt.com lsqpay.com @@ -62505,6 +62720,7 @@ lstx.vip lsun.net lsuoled.com lsup.net +lswfw.com lswgy.com lswld.com lswqw.com @@ -62536,6 +62752,7 @@ ltao.com ltd.com ltdcdn.com ltdspot.com +ltesting.net ltfwzs.com ltggc.com ltggzy.com @@ -62545,6 +62762,7 @@ lthqdl.com ltidc.com ltie.org ltimg.net +ltjczx.com ltjianhe.com ltkgjt.com ltkqjt.com @@ -62569,7 +62787,6 @@ lttvip.com ltwkw.com ltwy.com ltxbbs.com -ltxhglass.com ltxjob.com ltxsw.co ltxxgcxx.com @@ -62596,6 +62813,7 @@ luanzhougucheng.com luastudio.net luatos.com luba360.com +luban-furniture.com lubandata.com lubanjianye.com lubanlebiao.com @@ -62608,7 +62826,6 @@ lubanu.com lubaocar.com lubeichem.com lubiao.com -lubiao.wiki lubotv.com luboyun.com luchengas.com @@ -62637,7 +62854,6 @@ luckyair.net luckychipsmaster.com luckycoffee.com luckyop.com -luckyuyin.com luckyxp.net lucode.net luctonchongqing.com @@ -62683,6 +62899,7 @@ luhai.net luhaioil.com luhao198.com luhaoche.com +luhe.net luhehospital.com luhu.co luhua.cc @@ -62703,6 +62920,7 @@ lukiya.com lukou.com lukuanart.com lul8.com +lula.fun lulala.com lulinux.com lulisteel.com @@ -62790,10 +63008,10 @@ luoxudong.com luoxue.com luoyangdx.com luoyangkeji.com +luoyangmalasong.com luoyechenfei.com luoying66.com luoyingsh.com -luozhinet.com luozhiyun.com luozhongxu.com luozongle.com @@ -62905,6 +63123,7 @@ lvgangss.com lvgou.com lvguo.net lvhuawei.work +lvirahoe.com lvjieplus.com lvjinsuo.com lvjiwang.com @@ -62963,6 +63182,7 @@ lvyestudy.com lvyetong.com lvyidoor.com lvyinba.com +lvyinbar.com lvyou168.net lvyoubei.com lvyouf.com @@ -62976,6 +63196,7 @@ lvyuetravel.com lvzeep.com lvzheng.com lw0634.net +lw5188.com lw54.com lwccc.net lwcj.com @@ -62990,6 +63211,7 @@ lwhouse.com lwinst.com lwjl.com lwjt.net +lwjy.net lwlm.com lwlocks.com lwlt.net @@ -63004,6 +63226,7 @@ lwsy.org lwtylqx.com lwwandong.com lwxs.com +lwxs11.com lwxstxt.com lwzls.com lx.cok.elexapp.com @@ -63040,6 +63263,7 @@ lxg2016.com lxhg.com lxhkair.com lxhro.com +lxhuwai.com lxhz-avionics.com lxi.me lxjcjg.com @@ -63050,7 +63274,6 @@ lxlinux.net lxns.net lxny.vip lxq7t234u.shop -lxqrmyy.com lxrcsc.com lxsales.com lxsec.com @@ -63071,6 +63294,7 @@ lxybaike.com lxydoor.com lxyedu.com lxyes.com +lxykjsz.com lxyl020.com lxyl028.com lxyl053.com @@ -63112,6 +63336,7 @@ lybdfqh.com lybol.com lybtmy.com lybus.com +lybybz.com lycheer.net lyckw.com lycs-arc.com @@ -63139,6 +63364,7 @@ lyg.live lyg001.com lyg01.net lyg1.com +lyg12371.com lyg321.com lyg800.com lygcec.com @@ -63169,7 +63395,6 @@ lygrc.net lygsgt.com lygshjd.com lygshlxh.com -lygtylk.com lygxwmarathon.com lygxwxqrmyy.com lygyyjt.com @@ -63202,6 +63427,7 @@ lylhkq.com lylme.com lylxjxc.com lymarathon.com +lymmasu.xyz lymy1684.com lyngrhec.sbs lynjoy.com @@ -63225,6 +63451,7 @@ lyquanshunmall.com lyrc.cc lyrcw.com lyric-robot.com +lyrics.run lysafety.com lyshangdu.com lyshark.com @@ -63269,6 +63496,7 @@ lyyzedu.com lyz810.com lyzaix.com lyzb.com +lyzb33.app lyzfgjj.com lyzlzz.com lyzp100.com @@ -63312,6 +63540,7 @@ lzdsqcysgs.com lzdsyy.com lzdxb888.com lzdxdyyy.com +lzdymy.com lzdyyy.com lzetyy.com lzeweb.com @@ -63331,7 +63560,6 @@ lzgjschool.com lzgkyq.com lzgm.com lzgps.com -lzh2020.com lzhanghai.com lzhaoteng.com lzhdtk.com @@ -63395,6 +63623,7 @@ lzmmob.com lzmoyin.com lzmun.com lzmy123.com +lznbjz.com lznetease.com lznrlmxh.com lzoam.com @@ -63408,6 +63637,7 @@ lzprocess.com lzqjjx.com lzqjsm.com lzqqpcts.com +lzqxjx.com lzranqi.com lzrfc.com lzrfhg.com @@ -63441,7 +63671,9 @@ lzteli.com lztlcyxx.com lztvnet.com lztx123.com +lztxw.com lztzgroup.com +lzwg.com lzwi.fun lzwls.com lzwopu.com @@ -63501,6 +63733,7 @@ lzzy.net lzzyy.com m-edu.com m-hero.com +m.travelzoo.com m1.run m123.com m1315.com @@ -63519,6 +63752,7 @@ m2ucam.com m3-cloud.com m3cqjc3og6.com m3guo.com +m3kaiye.com m43ocq1uoj.com m5bn.com m5stack.com @@ -63531,6 +63765,7 @@ m999.com m9dz.com ma-china.com ma.run +ma3office.com ma3you.com ma5000.com maa.plus @@ -63601,7 +63836,6 @@ macxin.com macxz.com macz.com maczd.com -maczh.com maczhi.com maczj.com maczl.com @@ -63610,7 +63844,6 @@ madailicai.com madajiefood.com madaomall.com madboxi.com -made-in-china.com madefuns.com madeinchinastone.com madewei.com @@ -63633,6 +63866,7 @@ mafengwo.net mafengwoo.com maff.com mag10000.com +magadanryba.com magaoedu.com magcloud.net magecorn.com @@ -63666,12 +63900,14 @@ mahjongcup.com mahjongcup.net mahoupao.com mahua.com +mahuatalk.com mai.com maianhao.com maibaapp.com maibangbang.net maibaokeji.com maibuymai.com +maichawang.com maiche.com maiche168.com maicheme.com @@ -63695,11 +63931,13 @@ maiduo.com maifjb.com maigoo.com maihaoche.com +maihaojiu.com maihaome.com maihaowan.com maihaowuyou.com maihehd.com maihengqi.com +maihuacha.com maihuominiapps.com maihuwai.com maijia.com @@ -63761,6 +63999,7 @@ maisucai.com maisui1.com maitao.com maitaowang.com +maitegao.com maitewang.com maitix.com maitix.net @@ -63774,6 +64013,7 @@ maixhub.com maixiaba.com maixiang.net maixiaodao.com +maixinxin.com maiya91.com maiyadi.com maiyanju.com @@ -63793,6 +64033,7 @@ majianbo.com majiang520.com majilive.com majorbio.com +majorprecious.com majorsec.com majsoul.com maka.im @@ -63804,6 +64045,7 @@ makeapp.co makeblock.com makedie.me makeding.com +makeeu.com makefont.com makelie.com makelove.la @@ -63831,6 +64073,7 @@ males120.com malifenlawyer.com malifuke.org malimalihome.net +malingguzhai.com maliquankai.com maliuliu.com mall-builder.com @@ -63863,7 +64106,6 @@ man6.org managershare.com manamana.net manben.com -manbenapi.com manbetxoo.com manbetxrr.com manboker.com @@ -63885,12 +64127,12 @@ manduhu.com manew.com manewvr.com manfen.net +manfen5.com manfenyufa.com manfred-auto.com mangafuna.site mangafuna.xyz manganesenanhai.com -mangdream.com mangg.com mangguo168.com mangguonews.com @@ -63903,6 +64145,7 @@ mangolm.com mangomob.net mangoru.site mangren.com +mangrovetek.com mangrovetreeresort.com mangtian.com mangtuhuyu.com @@ -63922,7 +64165,6 @@ manhuapi.com manhuaren.com manhuatai.com manjiwang.com -manjuu.com mankebao.com mankewenxue.cc manlaxy.com @@ -63962,6 +64204,7 @@ manwahholdings.com manxing.net manxiu-law.com manyacan.com +manylaw.com manyoo.net manyou.com manyoujing.net @@ -63993,6 +64236,7 @@ maogua.com maogumaogu.com maogx.win maoha.com +maohongdz.com maojiaoque.com maojiuxs.com maokangbio.com @@ -64011,6 +64255,7 @@ maopaoya.com maopuyouxi.com maoqitian.com maoshanger.com +maotao.net maotiangroup.com maotuan.net maotuying.com @@ -64029,12 +64274,10 @@ maoyidi.com maoyigu.com maoyingaipu.com maoyouxi.com -maoyt.com maoyun.com maoyuncloud.com maozhishi.com maozhuashow.com -maozierp.com map-tencent.com map17.com map456.com @@ -64046,6 +64289,7 @@ mapfarm.com mapgis.com mapgx.com maphuan.com +mapks.com maple-game.com maple.ren maplecheck.tech @@ -64055,6 +64299,7 @@ mappn.com maproelec.com maptalks.com mapvq.com +maqingbo.com maqinnews.com mararun.com marathonbm.com @@ -64068,6 +64313,7 @@ maria23.com mariedalgar.com marimekko-hots.com marine-dancer.com +marinedancer.com marioall.com marioin.com mariowap.com @@ -64095,6 +64341,7 @@ maro6.com marry5.com mars-block.com marshal-ceramics.com +marshallscarlett.shop marshotspot.com marssenger.com marstor.com @@ -64104,6 +64351,7 @@ martin8023.com martincl2.me marto.cc maryek.net +marylandtenthcavalry.org mas10010.com mas300275.com masastack.com @@ -64152,6 +64400,8 @@ masterofmalteu.shop masterofsoccer.com mastersay.com mastersim123.com +masttoards.com +mastv.cc mastvnet.com masyi.com masyunrui.com @@ -64201,7 +64451,6 @@ max-c.com maxamchina.com maxd.cloud maxdo.net -maxesads.com maxfinesthair.com maxfor-tool.com maxgamehub.com @@ -64243,6 +64492,7 @@ maxwealthfund.com maxwi.com maxxipoint.com may.ltd +maya09.com maya777.com mayabot.com mayanchina.com @@ -64258,7 +64508,6 @@ mayicms.com mayihr.com mayiic.com mayikankan.com -mayikt.com mayikt.vip mayima.net mayishebao.com @@ -64281,12 +64530,14 @@ maywant.com maywonenergy.com mazakii.com mazarine-ap.com +mazc.org mazey.net mazhan.com mazhen.tech mazhizuo.com mazida.com mb-go.com +mb2p.com mba518.com mbabao.com mbachina.com @@ -64306,6 +64557,10 @@ mbbs.cc mbcloud.com mbd.pub mbestway.com +mbg06260pg.com +mbg06270pg.com +mbg06290pg.com +mbg06301pg.com mbgo.com mbhcibe.com mbhfit.com @@ -64327,7 +64582,6 @@ mbokee.com mbs.download.prss.microsoft.com mbsifu.com mbti16cc.com -mbtics.com mbtools.work mbwxzx.hk mbysrobot.com @@ -64344,7 +64598,6 @@ mc520.com mc91.com mc9y.net mcake.com -mcar.vip mcbaas.work mcbang.com mcbao.com @@ -64352,7 +64605,6 @@ mcbbs.co mcbbs.jp mcbbs.net mcbeam.pro -mcbjd.net mcc460.pub.3gppnetwork.org mccbim.com mccchina.com @@ -64371,15 +64623,18 @@ mcfound.net mcfun.tv mcfxw.com mcgsjt.com -mcgyaht1023.com +mchat.com mchifi.com mchim.net mchost.guru mchpk.com mchuiji.com mchweb.net +mchxx.net mcidc.net mcit.tech +mcjd.net +mckumf5ii4.com mcloudvr.com mcmap.cc mcmaster-asia.com @@ -64422,11 +64677,13 @@ mcyhfl.com mcypls.com mcyz.com mczhihui.com +mczmb.org mczsok.com mczwlt.net mczyz.com mczz.net md-hmjt.com +md-pms.com md5ma.com mdaehx.com mdbchina.com @@ -64439,9 +64696,9 @@ mdeasydiagnosis.com mdeer.com mdex.co mdex.com +mdfkyiyuan.com mdfors.com mdfull.com -mdict.net mditie.com mdjgjjt.com mdkj1.com @@ -64472,6 +64729,7 @@ mdydt.net mdymedical.com mdyseducation.org mdyuepai.com +mdzgjx.com mdzx.net me-city.com me-game.com @@ -64487,6 +64745,7 @@ meb.com mebhaoya.com mebo.com mebtf.com +mebyk.com mechatim.com mechina.org mechr.com @@ -64510,13 +64769,11 @@ medebound.com medejob.com medeming.com media.paperclipclub.net -mediaainet.com mediastory.cc mediatek.com mediav.com mediaxinan.com medical-union.com -medicalimagecloud.com medicalqc.com medicexam.net mediecogroup.com @@ -64574,10 +64831,12 @@ mefcl.com mefenglife.com mefenlife.com megaemoji.com +megaer.com megagamelog.com megagenchina.com megahugo.net megajoy.com +megalithwatch.com megarobo.com megasig.com megawords.cc @@ -64593,7 +64852,6 @@ mehecointl.com mei-shu.com mei-shu.net mei.com -mei.wiki mei1.com mei1.info meia.me @@ -64621,6 +64879,7 @@ meide-casting.com meidebi.com meidecloud.com meideng.net +meidepump.net meidongauto.com meidusacloud.com meierbei.com @@ -64651,7 +64910,6 @@ meiji-icecream.com meijia51.com meijiadaren.com meijiaedu.com -meijian.com meijiandaojia.com meijianpin.com meijiashang.com @@ -64695,7 +64953,6 @@ meiligaosu.com meilijia.com meilijian.com meiling.com -meilinvps.com meilishuo.com meilishuo.net meilisite.com @@ -64770,6 +65027,7 @@ meitanwang.com meite.com meitegou.com meitianhui.com +meitianzuche.com meitie.com meitifagao.com meitong-tech.com @@ -64906,6 +65164,7 @@ meng800.com mengaite.com mengarchitects.com mengat.com +mengbige.com mengchongzu.com mengdian.com mengdie.com @@ -64925,8 +65184,10 @@ menglechong.com menglegame.com menglu.com mengmei.org +mengniang.tv mengniuarla.com mengniuir.com +mengou.net mengqingpo.com mengqiuju.com mengsang.com @@ -64961,7 +65222,6 @@ menww.com menwww.com menxue.com menyuannews.com -meoo.com meoof-pet.com meovse.com meow.plus @@ -64972,7 +65232,6 @@ mepoem.com meppon.com meqlm.org merach.com -mercallure.com mercedes-benzarena.com merchaincargo.com mereith.com @@ -64989,6 +65248,7 @@ meshiot.com mesince.com mesnac.com mesonart.com +mesou.net mesowe.com mesresearch.com messawith.com @@ -65025,6 +65285,7 @@ meteric.com metersbonwe.com metin520.com metispharma.com +metmt.com metnews.net metong.com metools.info @@ -65105,6 +65366,7 @@ mggtech.vip mgh2-lab.com mgjianshe.com mgkj.vip +mgkjht.com mgl9.com mglhx.com mglip.com @@ -65116,6 +65378,7 @@ mgobe-webattle.com mgogo.com mgongkong.com mgplay.com.tw +mgs123.com mgsdk.com mgse.info mgskfjfod25.com @@ -65151,6 +65414,8 @@ mhhf.net mhi-ac.com mhinele.com mhito.net +mhkami.com +mhkcomment.com mhome.com mhotels.design mhpdf.com @@ -65199,6 +65464,7 @@ mianbao.com miancp.com miandanbx.com mianfa.org +mianfeiic.com mianfeiquming.com mianfeiwendang.com mianfeiwucan.org @@ -65232,7 +65498,6 @@ miaokaiyun.com miaokan.com miaokan100.com miaolaoshi.com -miaolaotai.com miaolianyunapp.com miaolingbio.com miaomaicar.com @@ -65247,7 +65512,6 @@ miaomuzhan.com miaoo.me miaopai.com miaoqutimes.com -miaosdk.com miaosha.com miaoshou.cc miaoshou.com @@ -65255,6 +65519,7 @@ miaoshou.net miaoshoucdn.com miaoshufang.com miaoshuwu.com +miaoshuzhai.net miaoso.com miaostreet.com miaotixing.com @@ -65264,6 +65529,7 @@ miaoweijianfei.com miaowenhk.com miaowlabs.com miaowutech.com +miaoxiazai.com miaoyanai.com miaoyin.pw miaoyun.link @@ -65309,11 +65575,13 @@ microcardio.com microchampion.com microdiag.com microdreams.com +microesim.com microfotos.com microfountain.com micronetpay.com microrui.net microsate.com +microsoftsa.com microsoftuwp.com microstarsoft.com microstern.com @@ -65326,12 +65594,9 @@ microwoo.com microwu.com microxiang.com microyan.com -microzl.com microzuji.com -micstatic.com mictormedical.com micu.hk -micun.com micw.com micyjz.com mid-link.net @@ -65340,6 +65605,7 @@ midadata.com midainc.com midanyi.com midasbuy.com +middleschoolcounselor.com midea-buy.com midea-group.com midea-hotwater.com @@ -65378,7 +65644,6 @@ miemie.la miercn.com mieseng.com mifacelive.com -mifan.cc mifan365.com mifangba.com mifanli.com @@ -65481,7 +65746,6 @@ milihua.com milike.com milimao.com milimili.tv -milinzone.com miliol.com miliol.org milipictures.com @@ -65508,6 +65772,7 @@ mimi123.vip mimi518.com mimidi.com mimimeu.com +mimixiaoke.com mimiyc.net mimo51.com mimomim.com @@ -65591,6 +65856,7 @@ mingjinglu.com mingjiudu.com mingjun2008.com mingjuyoupin.com +mingkj.com minglian.com minglunlaw.com mingmen-tech.com @@ -65634,7 +65900,6 @@ mingyuanfund.com mingyuanmuye.com mingyuanyun.com mingyueqingfengshe.com -mingyuhan.net mingzhi-tech.com mingzhucable.com mingzhujs.com @@ -65665,6 +65930,7 @@ minigameam.com minigui.com minigui.org minihaowan.com +miniluck.com minimaituan.com minimax.chat minimax.io @@ -65687,6 +65953,7 @@ miniyounger.com minjichem.com minkave.com minking.cc +minleai.com minli.com minmetals.com minor-tech.com @@ -65695,6 +65962,7 @@ minpayment.com minqiao.com minra.com minretail.com +minshangjie.com minshengec.com minshengjob.com minshenglife.com @@ -65748,7 +66016,6 @@ miraclevision.com miraclevision.net miracomotor.com mirahomes.shop -miraiemby.com miravia.es miredian.com miri.site @@ -65778,12 +66045,12 @@ missjia.net misslele.com misstar.com missyuan.net -mistfront.com misuland.com misunly.com mitalk.com mitang.com mitangtuan.com +mitao.bar mitaoping.com mitaowu.com mitay.net @@ -65837,7 +66104,6 @@ miyanlife.com miyapay.com miyateam.com miyatech.com -miyavip.vip miyilink.com miyoushe.com miyouu.com @@ -65888,10 +66154,8 @@ mjzhcl.com mjzj.com mjzq.net mk-yiliao.com -mk1688.shop mk2048.com mk5.xyz -mkadept.com mkaq.org mkb0898.com mkf.com @@ -65950,6 +66214,7 @@ mljydoors.com mlkmba.com mllj.net mlmcms.com +mlmtz.com mlnsoft.net mlocso.com mlogcn.com @@ -65962,6 +66227,7 @@ mlsub.net mlszp.com mlt.pub mltrans.net +mlunwen.com mlwanwan.com mlwdpx.com mlwed.com @@ -65978,6 +66244,7 @@ mlzs2008.com mm-sh.com mm.com mm111.net +mm131.kim mm1357.com mm2hservices.com mm3yy.com @@ -66008,6 +66275,7 @@ mmhygame.com mmi-shanghai.com mmia.com mmim8.com +mmjbh.com mmjynet.com mmjzxh.com mmkkiivv.com @@ -66029,6 +66297,7 @@ mmsase.com mmsccn.com mmscoo.com mmsfw.com +mmsk.com mmstat.com mmt3000.com mmtch.com @@ -66050,6 +66319,7 @@ mnbvdfg.com mnbvtgv.com mndqlib.net mnengine.com +mnfqw.org mnihyc.com mnjj.group mnkan.com @@ -66061,6 +66331,14 @@ mo298.com mo2g.com mo7.cc mo9.com +moa06181ju.com +moa06190ju.com +moa06191ju.com +moa06210ju.com +moa06211ju.com +moa06221ju.com +moa06240ju.com +moa06250ju.com moage.com moark.com mob.com @@ -66084,6 +66362,7 @@ mobawan.com mobayx.com mobcells.com mobcloud.mobi +mobdna.com mobeehome.com mobgi.com mobgroupbuy.com @@ -66125,6 +66404,7 @@ mocache.com mocafilm.com mocartoon.com mochafengbao.com +mochai.store mochateam.com mochi.website mochiwang.com @@ -66136,7 +66416,6 @@ moco-mall.com mocreak.com mocusez.site mocuz.com -modaiyun.com modao.cc modao.com modao.io @@ -66183,7 +66462,6 @@ moe233.org moe321.com moeclub.org moedot.net -moedu.com moeelf.com moefactory.com moefantasy.com @@ -66221,6 +66499,7 @@ mofangwang.com mofangyu.com mofanodes.com mofashi.ltd +mofavideo.com mofazhu.com moffettai.com mofile.com @@ -66281,7 +66560,6 @@ mokahr.com mokamrp.com mokatyper.com mokayuedu.com -mokexapp.tv mokeyjay.com moko.cc mokra.house @@ -66352,6 +66630,7 @@ montage-tech.com monternet.com montnets.com montres8.com +monurhineas.com monv.com monxin.com moocollege.com @@ -66359,7 +66638,6 @@ mooctest.net moodmoon.com moodoon.com moogos.com -mooho.cloud moojing.com moojnn.com moolsun.com @@ -66388,6 +66666,7 @@ moonvy.com moonvy.cool mooool.com mooore.net +moooyu.com moore.ren moore8.com moorecat.com @@ -66453,6 +66732,7 @@ morninghan.com morninginn.com morningwhistle.com morong-elec.com +morrisco.cc morstar.net moschat.com moseacg.com @@ -66502,6 +66782,9 @@ moumi.com mounriver.com mountor.net mounui.com +mouraeodor.com +mouralanco.com +mouratoriousi.com mousesquadca.org mousycoder.com moutaichina.com @@ -66534,6 +66817,7 @@ moxiu.net moxuangenet.com moyangmoyang.com moyann.com +moyol.com moyoyo.com moypk.com moyubuluo.com @@ -66546,6 +66830,7 @@ mozhedun.com mozhenhau.com mozichina.com mozigu.net +mozillaonline.com mozillazg.com moziqing.com mozouyan.com @@ -66566,6 +66851,7 @@ mpdsj.com mph11.com mphdx.com mpiano.com +mplus.tech mpmc-china.com mpnbenefits.download.prss.microsoft.com mpnbenefitsrtl.download.prss.microsoft.com @@ -66585,12 +66871,12 @@ mqmgroup.com mqqurl.com mqqy.com mqrouter.com -mqs983.com mqsyr.com mqttx.app mquanquan.com mqxpyy.com mqxww.com +mqyu.com mqzoneapp.com mr-ping.com mr77.com @@ -66607,6 +66893,7 @@ mrduan.com mrenbaike.com mrentea.com mrhallacg.com +mrhs.cc mrjeke.com mrjiang.com mrjjxw.com @@ -66619,17 +66906,18 @@ mro9.com mroall.com mrobao.com mrpyq.com +mrqf.com mrqoxfvs.com mrqxs.com mrrvendor.com mrsingsing.com mrsjzt.com mrsta.com -mrtdephoto.net mrts.com mru-taste.com mrutaste.com mrvcdn.com +mrw.so mrwish.net mrxiao.net mrxwlb.com @@ -66650,6 +66938,7 @@ msd-facing.com msddp.com msdkpass.com msdn.download.prss.microsoft.com +msdn.hk msdnwogaosuni.com msdnxitong.com msdpmarathon.com @@ -66675,6 +66964,8 @@ mshxw.com msits.com msjingmi.com msjpay.com +msjy123.com +mskoo.com mslmc.net msltbio.com mslzk.com @@ -66685,6 +66976,7 @@ msndvr.com msny.cc msolok.com mspace.cc +mspacecd.com mspharm.com msproduct.download.prss.microsoft.com msstatic.com @@ -66695,6 +66987,8 @@ mstxx.com msunland.com msweekly.com msxf.com +msxf.net +msxiaobing.com msxt.com msxxg.com msy5.com @@ -66735,8 +67029,8 @@ mte-shenzhen.com mtedu.com mtex.work mtfpos.com -mtftlcs.xyz mtgchina.com +mthlyp.com mthreads.com mti100.com mtiancity.com @@ -66774,6 +67068,7 @@ mttsq.com mtty.com mtv123.com mtvip.cc +mtw.so mtwine.com mtwl.net mtxshop.com @@ -66785,6 +67080,7 @@ mtzqb.com mtzscp.com mtzuichen.com mu69.com +muaedge.com mubanjianli.com mubanwan.com mubixueyuan.com @@ -66810,8 +67106,8 @@ muftc.com muge.info mugeda.com muguang.me +muhan.co muhan.ltd -muhemob.com muhou.net muhoujiemi.com muhuo.chat @@ -66840,13 +67136,13 @@ multilingual-volc.com multimodalmatch.com multiplym.com mulunspring.com -mulyclub.com mumayi.com mumbuy365.com mumingfang.com mumunv.com mumuplayer.com mumuxili.com +munantonio.com mundane.ink muniao.com munling.com @@ -66867,11 +67163,11 @@ muryi.net muse.ltd muselab-tech.com musenxi.com +muser168.com museradio.net musestudio.net musetransfer.com mushafa.net -mushroommarket.net music4x.com musicchina-expo.com musiccia.com @@ -66880,9 +67176,10 @@ musicdu.com musicedu8.com musiceol.com musicgw.com -musiclemon.net +musiciansfriendsaleusa.shop musiness.vip muslimwww.com +muspost.icu mussgirl.store mustangbattery.com mustbull.com @@ -66894,7 +67191,6 @@ mutean.com mutian.net mutianyugreatwall.com mutieffect.com -mutoglobal.vip mutouxb.com mutouyu.com mutualhunter.com @@ -66903,6 +67199,7 @@ muwaifanzhiliao.com muwenxi.com mux5.com muxin.fun +muxiulin.com muyangkuaibao.com muyee.com muyer.com @@ -66964,6 +67261,7 @@ mwrfabc.com mwstore.com mwtg.vip mww.so +mwyzhcdn.com mwzhtc.com mx-china.net mx-fm.com @@ -66972,6 +67270,7 @@ mx-xz.com mx007.com mx3g.com mx520.com +mxarts.com mxbc.com mxbc.net mxchip.com @@ -66984,7 +67283,6 @@ mxdpark-gs.com mxdraw.com mxdraw3d.com mxdx.net -mxdzlk.com mxew.com mxflutter.com mxfy.com @@ -66995,6 +67293,7 @@ mxhichina.com mxifund.com mxitie.com mxitres.com +mxj.cx mxjd.com mxjtedu.com mxjyxx.com @@ -67065,7 +67364,6 @@ myaiwecom.com myalicdn.com myalirtc.com myallvalue.com -myang.xyz myanjian.com myanmarembassy.com myanmarembassybeijing.com @@ -67092,14 +67390,12 @@ mycar58.com mycaraok.com mycarbar.com mycardgame.net -mycdnadmin.com mychery.com mychery.net mychuguan.com mychunyan.net myckjr.com mycleanmymac.com -mycloudnas.com mycloudstudy.com myclub2.com mycnc.org @@ -67133,6 +67429,7 @@ mydigit.net mydigitex.com mydisk.work mydnns.com +mydnser.com mydnspod.net mydnsw.com mydoc.io @@ -67145,6 +67442,7 @@ myechannel.com myechinese.com myeclipsecn.com myekp.net +myeriri.com myex.cc myezdns.com myfans.cc @@ -67222,8 +67520,10 @@ mylibs.org mylightsite.com mylike.cc mylike.com +mylike120.com mylikechat.com mylikesz.com +mylikeyk.com mylinkapp.hk mylitboy.com myliwu.net @@ -67246,7 +67546,6 @@ mymova.com mymuwu.net mynatapp.cc mynb8.com -myndj.com mynee.com myo.ink myoas.com @@ -67273,6 +67572,7 @@ mypitaya.com mypity.com mypiwik.com mypm.net +myprad.com mypscloud.com mypsy365.com mypx.org @@ -67280,6 +67580,7 @@ myqbosuppportt.com myqcloud.com myqcloud.net myqee.com +myqqdd.com myqqjd.com myr9.com myra2.com @@ -67308,6 +67609,7 @@ myshow800.com mysinamail.com mysipo.com mysiteres.com +mysm888.com mysmth.net mysongktv.com mysore-yoga.com @@ -67322,7 +67624,6 @@ mysteel.com mysteel.net mysteelcdn.com mysteelcms.com -mystery0.vip mysticalcard.com mysubmail.com mysupa.com @@ -67340,6 +67641,7 @@ mythcare.com mythidea.com mythroad.net mythsman.com +mythware.com mythware.net mytianchang.com mytijian.com @@ -67368,7 +67670,6 @@ mywirebox.com mywl123.com mywll.com myworld6.com -mywuwu.com myxxts.club myxxts.com myxycjh.com @@ -67390,6 +67691,7 @@ myzxsx.com myzxyy.com myzyy.com myzyzy.com +mz186.com mz52.com mz6.net mz99.com @@ -67403,7 +67705,6 @@ mzfile.com mzfpay.com mzfsm.com mzfxw.com -mzgjbj.com mzgroup.vip mzgtuan.com mzh.ren @@ -67463,13 +67764,11 @@ n62f.vip n63.com n69.com n78785.com -n7r65.com n802.com n8soft.com n9z.net na.ci naaln.com -nabel.cc nabluemedia.com naboyi.com nabucuo.com @@ -67564,6 +67863,7 @@ nanfang-pump.com nanfangfood.com nanfen.com nanfu.com +nanguache.com nanguakexue.biz nanguakexue.com nanguaxia.vip @@ -67579,6 +67879,7 @@ nanhuangic.com nanhufund.com nanhujianshe.com nanhunnvjia.com +nanhuwang.com nanjbjjt.com nanjet.com nanjianggroup.com @@ -67593,6 +67894,7 @@ nanjingelectric.com nanjinggaopeng.com nanjinghuihe.com nanjinghuojia.net +nanjinglf.org nanjingludeng.com nanjingtianqi114.com nanjingttym.com @@ -67615,6 +67917,7 @@ nanningrcw.com nanningtech.com nanningxiaoou.com nanningyouhua.com +nanningyuexing.com nannjlnk.com nanobody-biolab.com nanochrom.com @@ -67631,6 +67934,7 @@ nanputuo.com nanqi.org nanqiangbusiness.com nanrentu.cc +nanrenwa.com nanrenwo.net nanrenzhi.com nanshanfuzi.net @@ -67647,6 +67951,7 @@ nantoujituan.com nanvi.com nanxi.me nanxiang.info +nanxingmac.com nanxinwang.com nanxueqx.com nanxunfb.com @@ -67706,6 +68011,7 @@ nationalchip.com nationalee.com nationsky.com nationstech.com +nativosink.com natnps.com nattest-china.com naturali.io @@ -67752,6 +68058,7 @@ nbaqx.com nbaxiaoshuo.com nbbiao.com nbbjack.com +nbbull.com nbbuxiutie.com nbcbd.com nbchao.com @@ -67776,7 +68083,6 @@ nbenl.com nbfeyy.com nbfkgs.com nbfox.com -nbgbd.com nbgdjt.com nbginnovations.com nbgjwl.com @@ -67788,6 +68094,7 @@ nbhao.org nbhechang.com nbhhgroup.com nbhky.com +nbhxmr.com nbhysj.com nbimer.com nbit6d.com @@ -67820,7 +68127,6 @@ nbmidun.com nbmylike.com nbmyy.com nbmzyl.com -nbmzyy.com nbnnn.xyz nbocc.com nbocqdm.xyz @@ -67840,6 +68146,7 @@ nbruili.com nbscxh.com nbsdjyy.com nbsfgy.com +nbshunjian.com nbshuoxue.com nbshzwyy.com nbsijian.com @@ -67865,10 +68172,12 @@ nbunicom.com nbuser.com nbvps.net nbwaf.net +nbwan.net nbwbw.com nbwelldon.com nbwetc.com nbwhg.com +nbwskj666.com nbxdjt.com nbxiaoshi.net nbxry.com @@ -67886,6 +68195,7 @@ nbzjpc.com nbzsq.com nbzxgj.com nc-bio.com +nc189.net ncarzone.com ncboo.com ncc-cma.net @@ -67907,7 +68217,6 @@ nchycw.com ncidbj.com nciyuan.com ncjrailway.com -ncjsyy.com nclqq.com ncmbio.com ncmem.com @@ -67922,7 +68231,6 @@ ncpssd.org ncq8.com ncqiche.com ncsdyyy.com -ncsep.com ncshxd.com ncsjhf.com ncsxy.com @@ -67972,12 +68280,12 @@ ndmh.com ndoo.net ndpharm.com ndsad.com +ndsbbs.com ndscsoft.com ndser.net ndsyy.com ndszgb.com nduoa.com -nduoshousi.com nduotuan.com ndvfxyvj.sbs ndxlj.com @@ -68030,6 +68338,7 @@ nellit.info nellit.net nellit.xyz nelson-textiles.com +nelsonjulia.shop nelumbosp.com nengapp.com nengdarack.com @@ -68102,6 +68411,7 @@ netbirds.com netbooo.com netchina100.com netcoc.com +netcolc.cc netconst.com netcoretec.com netcute.com @@ -68121,6 +68431,7 @@ netherlandvcenter.com nethonghe.com netianshannu.com netiler.com +netinfi.com netinfi.net netingcn.com netitest.com @@ -68140,6 +68451,7 @@ netswise.com netsyq.com nett.to netvp.net +network-hk.com networkbench.com networkesl.com networklinkpro.com @@ -68259,8 +68571,10 @@ news18a.com newscctv.net newseasoft.com newsgd.com +newsgu.com newsgx.com newshengwei.com +newsighting.com newsing.com newskj.com newskj.org @@ -68288,6 +68602,7 @@ newsxy.com newsyc.com newszjk.com newtab123.com +newtalentaward.com newtimeai.com newtimevalve.com newtonghua.com @@ -68307,6 +68622,7 @@ newxitong.com newxue.com newyifagroup.com newyishi.com +newyorkerdownunder.com newyoton.com newyx.net newzealandvscenter.com @@ -68315,6 +68631,7 @@ newzhizao.com newzhongyuan.com nexaparty.com nexmoe.com +nexon.to next-bei.com next-playground.com nextclass.club @@ -68332,6 +68649,7 @@ nextvid.net nextworkshop.net nextyu.com nexus-holding.com +nexus.dell.com nexusedgeio.com nexushd.org neyetwatcher.com @@ -68398,6 +68716,7 @@ ngjjtg.com ngkjjt.com ngksz.com ngmap.com +ngmco.net ngmyt.com ngnice.com ngnlink.net @@ -68455,7 +68774,6 @@ niansir.com niao95.com niaobulashi.com niaocms.com -niaogebiji.com niaola.com niaoquan.fun niaosuangao.online @@ -68575,6 +68893,7 @@ ningmengdou.com ningmengyun.com ningshing.com ningtingche.com +ningto.com nington.com ningxi.com ningxiacaijing.com @@ -68613,6 +68932,7 @@ niuaniua.com niuap.com niubalun.com niubihonghong.net +niubilai.com niubilety.com niubixia.com niubo.cc @@ -68644,6 +68964,7 @@ niupinhui.com niupu.com niuqia.com niurenqushi.com +niurosoft.com niuschools.com niushe.com niushield.online @@ -68653,7 +68974,6 @@ niutk.com niutoushe.com niutrans.com niuwk.com -niuwoai.com niuxgame77.com niuxiaoer.net niuxyun.com @@ -68678,7 +68998,6 @@ nizkeyboard.com nj-anruitai.com nj-bl.com nj-bw.com -nj-cgp.com nj-chishun.com nj-control.com nj-deli.com @@ -68762,12 +69081,14 @@ njcl-gear.com njclwlkj.com njcmotor.com njcmsj.com +njcnmc.com njcomptech.com njctcm.com njcttq.com njcw.com njcwlk.com njcxj.com +njcyt99.com njd1.com njdapaidang.com njdatang.com @@ -68880,7 +69201,6 @@ njjhjt.com njjht.com njjianguo.com njjiantian.com -njjiejuwx.com njjienuo.com njjifei.com njjknkyy.com @@ -68909,6 +69229,7 @@ njkcsj.com njkeeryq.com njkerun.com njkeystone.com +njkhhb.com njkhly.com njkilter.com njklclear.com @@ -68933,6 +69254,7 @@ njljscl.com njlkjc.com njlndl.com njlofty.com +njlonsen.com njloyalty.net njlrxx.com njlsw.com @@ -68970,13 +69292,13 @@ njnhyx.net njnii.com njningyi.com njnkxt.com +njnkzz.com njnpfl.com njntdj.com njnwyy.com njnysoft.com njnzrs.com njodu.com -njonemall.com njouman.com njpeptide.com njpkwater.com @@ -69101,10 +69423,10 @@ njxjjsjt.com njxkyy.net njxlhd.com njxlxx.com -njxmeng.com njxnjt.com njxty.com njxushang.com +njxwyl.com njxxrc.com njxyyy.com njxzwh.com @@ -69118,6 +69440,7 @@ njyhznkj.com njyjglxh.com njyjxh.com njyjzz.com +njyouwin.com njypk.com njyqhj.com njyqkj0ksyz.com @@ -69190,7 +69513,6 @@ nlscan.com nlteck.com nlttms.com nlxn.com -nlyd.club nlypx.com nlyzzzxrmyy.com nlzpw.com @@ -69232,6 +69554,7 @@ nmgup.com nmgwhly.com nmgwxgs.com nmgyjszx.com +nmimi.com nmjtzy.com nmjyl.com nmkjxy.com @@ -69240,6 +69563,7 @@ nmlpa.com nmod.net nmpfkj.com nmrdata.com +nmsl.gs nmslwsnd.com nmt2.com nmufh.com @@ -69258,6 +69582,7 @@ nn2fy.com nn2yy.com nn3yy.com nn4yy.com +nn4z.com nn5itt.com nn5yy.com nn6yy.com @@ -69427,6 +69752,7 @@ nnlxs.com nnlyjp.com nnlzhs.com nnmama.com +nnmhzc.com nnminghe.com nnmingyuanyun.com nnmjm.com @@ -69517,6 +69843,8 @@ nnwytl.com nnxcx.com nnxczxjt.com nnxdj.com +nnxfz.com +nnxiehehospital.com nnxinxiang.com nnxiyun.com nnxjtf.com @@ -69563,7 +69891,6 @@ nnzp8.com nnzw168.com nnzxtx.net nnzyjob.com -no-mad-sub.one no-mad-world.club no1news.com no8ms.com @@ -69612,6 +69939,9 @@ nologo.tech nolovr.com nomax.vip nome.com +nomuaexander.com +nomuaheridan.com +nomuamarcia.com nomura-nset.com nomuraoi-sec.com nonfemet.com @@ -69632,6 +69962,7 @@ nongjx.com nongkeyu.com nongli.com nongli.net +nonglirili.net nongmintv.com nongnet.com nongshang.com @@ -69641,7 +69972,6 @@ nongye.tv nongyedns.com nongyelu.com nongyemen.com -nongyeplus.com nongyie.com nonobank.com noobboss.com @@ -69655,6 +69985,7 @@ noobwatches.com noobyard.com noobyy.com noobzz.net +noomuuhapmav.com noonaspizza.com noonnoora.com noontec.com @@ -69671,7 +70002,6 @@ nordicways.com nordkete.com nordonfire.com nordritools.com -norglo.com norinco-vehicle.com norinco.com norincogroup-ebuy.com @@ -69692,7 +70022,6 @@ northsoar.com northtexascribs.com northtimes.com nosec.org -nosetime.com nosoul99.com nossmoke.com nosub.net @@ -69781,7 +70110,6 @@ nptpark.com nptparking.com nptwedding.com npub.net -npud450c.com npxsw.com npz.com nq6.com @@ -69845,7 +70173,6 @@ nsknsk.com nskwj.com nsm-electrical.com nsmodel.com -nsns.in nsoad.com nsqtlcdn.cc nsqtlcdn.info @@ -69872,10 +70199,12 @@ nswzs.com nsxdns.com nsxww.com nsydt.com +nsyhwakrkq2.com nsynu.com nszmz.com nszone.com nszxsyxx.com +nszynd66ggbcx.com nt.app nt.cc nt56.net @@ -69906,6 +70235,7 @@ nthysp.com nti56.com ntiee.com ntjgjt.com +ntjgpx.com ntjhbw.com ntjhzy.com ntjob88.com @@ -69915,7 +70245,6 @@ ntjymall.com ntjzyxh.com ntkfqjy.com ntlcjd.com -ntlnrtx.com ntmlxm.com ntmyexp.com ntp.felixc.at @@ -69962,6 +70291,7 @@ nubia.mobi nucc.com nucleisys.com nuctech.com +nuedc-ti.com nuedcchina.com nufans.net nug08010lu.com @@ -69974,7 +70304,6 @@ nuist.pro nulipin.com nullice.com nullno.com -nulviw.com num1dns.com num2020.com numans.cc @@ -70045,8 +70374,6 @@ nvsheng.com nvshengjie.com nvshuyun.com nvsip.com -nvwalive.com -nvwnsy.com nvwu.com nvzhanshen.com nvziwu.com @@ -70058,7 +70385,6 @@ nwdlink.com nweon.com nwifyuz.com nwncd.com -nwovo.com nwshotel.com nwzg.net nx-sc.com @@ -70100,6 +70426,7 @@ nxstjt.com nxsyy.com nxtf.net nxtianshangb.com +nxwly.com nxxdns.com nxxh.net nxxhr.com @@ -70118,12 +70445,12 @@ ny1988.com ny2000.com nya.ink nyaacat.com -nyanket.com nyat.app nyato.com nybai.com nybaidu.net nybw.net +nybyggx.com nyckidsclub.com nyd7y.com nydsrrsh.com @@ -70133,7 +70460,6 @@ nyhnx.com nyhpyq.com nyjy-china.com nylingshang.com -nylvy.com nypd520.com nysenba.com nysgjgs.com @@ -70177,7 +70503,6 @@ o-star.cc o0310o.com o0o0w.com o136.com -o163.com o2123.com o2ee.com o2moment.com @@ -70210,7 +70535,6 @@ oadz.com oafocus.net oahelp.com oahelp.net -oai.sb oait360.com oak-amc.com oaloft.com @@ -70235,6 +70559,7 @@ obetal.com obins.net obj.cc obj6.com +objccn.io objcoding.com obkoro1.com obolee.com @@ -70264,7 +70589,6 @@ oceancus.com oceandatas.com oceando.cloud oceanengine.com -oceanhomeplus.com oceanhood.com oceanol.com oceanorama.com @@ -70277,9 +70601,11 @@ ocft.com ochirly.com ocic-static.com ocici.com +ocideal.com ocimg.com oclean.com oclkj.com +ocn187.com ocpuritech.com ocsjs.com ocsp.us.cdnetworks.com @@ -70301,6 +70627,7 @@ octopusgame.com octre.com octsszj.com octsunshine.com +oculist.net ocvh970428448.luxe ocwms.com odaily.news @@ -70308,14 +70635,13 @@ odalong.com odao.com odata.cc odeasports.com -odh36826.com odict.net odinichina.com odinjc.com odinjilin.com odinliu.com odlkj.com -odmt.net +odohx.org odyzj.com oealy.com oeasy.org @@ -70363,7 +70689,6 @@ officecdn.microsoft.com officectrl.com officemkt.download.prss.microsoft.com officemktuat.download.prss.microsoft.com -offices163.com officese.com officesoftcn.com officeweb365.com @@ -70373,6 +70698,7 @@ offshoremedia.net ofgame.net ofidc.com ofo.com +ofopp.com ofpay.com ofpay365.com ofuns.com @@ -70391,6 +70717,8 @@ ohipic.com ohltjt.com ohltk.com ohneen.com +ohqly.com +ohtly.com ohtpc.com ohyee.cc oi-wiki.com @@ -70417,6 +70745,7 @@ oincp.com oinva5yl.com oioidesign.com oioiok.com +oioj.net oishi-tm.com oiwas.com oiz611.com @@ -70435,7 +70764,6 @@ ok1616.com ok165.com ok168.com ok183.com -ok202.cc ok206.com ok3w.net ok619.com @@ -70457,6 +70785,7 @@ okcard.com okcdnns.com okchang.com okchexian.com +okcxo.com okdcc.com okdd.net okemu.com @@ -70505,7 +70834,6 @@ okweb.info okwuyou.com okxr.com okyueche.com -okywqapp.com ol-cdn.com ol-img.com olabo.net @@ -70519,7 +70847,6 @@ oldcat.me oldding.net oldj.net oldmanemu.net -oldmanemu.org oldmantvg.net oldpan.me ole-vod.com @@ -70533,13 +70860,11 @@ olipharma.com oliver.ren oliveryang.net ollomall.com -olo-home.com olo4.com olokitchen.com oltfm.com olxd.com olympicmuseum-nj.org -olympuschina.com olymtech.com olymvax.com olys88.com @@ -70562,7 +70887,6 @@ omicshare.com omicshare.net omifanyi.com omigr.com -omini-shield.com omlzx.com omlzz.com ommoo.com @@ -70625,6 +70949,7 @@ oneitfarm.com oneiwff.com onekey.cc onekeyghost.com +onekeyrom.com oneleafchina.com onelic.work onelife-love.com @@ -70655,6 +70980,7 @@ onethingtech.net onetop.net onetts.com onev.cat +onevcat.com oneway.mobi onewedesign.com onewo.com @@ -70670,11 +70996,13 @@ onezapp.com onezh.com onfun.net ongoalconveying.com +ongoaltech.com onijiang.com onishi-cn.com onixhiend.com onjobedu.com onkocares.com +onlady.net online-cmcc.net online-edu.org online-phaidon.shop @@ -70684,6 +71012,7 @@ onlinedown.net onlinekr.com onlinenic.net onlinesjtu.com +onlinesurvey.work onlinexijiang.com onlly.com onloon.net @@ -70707,6 +71036,7 @@ onlywem.com onnets1.xyz ono-bbb.com onochem.com +onrunningshop.com onsiteclub.com ontall.com ontheroadstore.com @@ -70742,7 +71072,6 @@ oooccc.com ooofoo.com ooogo.com ooojogo.com -ooomba.com ooomm.com ooooai.com oooooooooo213.com @@ -70790,7 +71119,6 @@ openasic.org openatom.club openbayes.com openbcs.com -openbitfun.com opencas.org opencitybrain.org opencloudgpt.online @@ -70803,7 +71131,6 @@ openedv.com openerp.hk openeuler.org openeuler.sh -openevai.com openew.com openfans.org openfde.com @@ -70840,9 +71167,10 @@ openrtbadx.com opensoce.com opensplendid.com openssw.com +openswap.space opentrust.net +openuc.com openvela.com -openviking.net openwbs.com openwrt.ai openwrt.pro @@ -70852,7 +71180,6 @@ operachina.com opfed.com opfibre.com opgw-oppc.com -opinstallinit.com opjmw1.ren opkjh.com oplay.net @@ -70908,11 +71235,11 @@ orange-ci.net orange2h.com orangeapk.com orangeclk.com -orangeconnex.com orangelovely.com orangemum.com orangenews.hk orangepi.org +orangesgame.com orangetage.com orangevip.com oraper.com @@ -70937,7 +71264,6 @@ ordosbank.com ordosqyjt.com ordostonghui.com orebotech.com -orence.net organo-sz.com orgcc.com orggd.com @@ -70978,7 +71304,6 @@ originsilicon.com originwater.com origloria.com orihard.com -orion34g.com oriphant.com oritive.com oriza.com @@ -71047,7 +71372,6 @@ ospchina.com ospod.com osportsmedia.com ospp.com -osr-tech.com osredm.com osrelease.download.prss.microsoft.com oss-cn-beijing-aliyuncs.com @@ -71091,7 +71415,6 @@ oubauneereid.com oubiix.lol ouchang.net ouchengzl.com -oucode.com oudapay.com oudas.tech oudianyun.com @@ -71116,6 +71439,7 @@ ouluyun.com oulvnet.com oumaan.com oumakspt.com +oume.cc oumengke.com ouming.com oumoo.com @@ -71144,6 +71468,7 @@ ourchem.com ourcm.net ourdian.com ourdlbs.com +ourdomains.com ourdvs.com ourdvs.info ourdvsss.com @@ -71229,6 +71554,7 @@ ouyingyimin.com ouyizs.com ouyu158.com ouzhou.cc +ouzhougoufang.com ov5.org ovalechina.com ovaqrzcw.com @@ -71289,8 +71615,8 @@ oyalee.com oyewifi.com oygteapq.com oym56lm.com -oyn01.cc oyohyee.com +oyonyou.com oyoozo.com oyospider.com oyoumo.com @@ -71303,7 +71629,9 @@ ozonabc.com ozonbigsell.com ozoninfo.com ozouckzr.com +ozsmartbuy.com ozxw.com +ozzair.org ozzyad.com p-an.com p-dragon.com @@ -71323,9 +71651,11 @@ p12345.com p2cdn.com p2hp.com p2p001.com +p2pcq.com p2peye.com p2peye.net p2psearchers.com +p3-china.com p4pp.com p555.cc p5w.net @@ -71361,11 +71691,13 @@ packty.com pacmantwo.com pacs-plus.com pactera.com +padao.org padasuo.net padddy.vip paddlepaddle.org paddlewaver.com padh.net +padns.com padtf.com paer.work pafj.net @@ -71387,7 +71719,6 @@ paiangmedical.com paiangstudy.com paibanxia.com paibaohy.com -paibo365.com paichen.net paichi.com paicoding.com @@ -71420,6 +71751,7 @@ paipianbang.com pairmb.com paishi.com paitol.com +paivideo.com paiwan.com paixiangxian.com paixin.com @@ -71473,6 +71805,7 @@ panaihua.com panasiashipping.com panasonic-door.com panawincn.com +panbaidu.net panbrake.com panchinasports.com panchip.com @@ -71485,6 +71818,7 @@ panda995.xyz pandabus.cc pandadairy.com pandadastudio.com +pandafoundation.org pandagreen.com pandahome.org pandainc.cc @@ -71492,6 +71826,7 @@ pandapaint.net pandara.xyz pandaremit.com pandateacher.com +pandatv.com pandax.wiki pandolia.net panduoduo.net @@ -71502,6 +71837,7 @@ pangcheng.com pangdago.com pangdasc.com pangdly.com +pangeng.vip panggugu.com panghuasheng.com pangjun.com @@ -71535,7 +71871,7 @@ pangxieke.com pangyuan.com panjiayuan.com panjin.net -panjue.com +panjk.com panku.cc panlai.com panlan.com @@ -71570,7 +71906,6 @@ pansou.com pansousuo.com pantherhealthcare.com pantonechina.com -pantonecn.com pantower.com pantrysbest.com pantuitui.com @@ -71595,6 +71930,7 @@ paopao.com paopaoche.net paopaohd.com paopaosz.com +paoshuba.cc paoshuba.org paoxue.com paozhengtong.com @@ -71645,13 +71981,13 @@ paperyy.com papocket.com papuanewguineans.com paquapp.com -par656.com parallelsras.com paratera.com parawikis.com parduscycle.com parentshk.com paris-girafe.com +parisblackpride.org parkbees.com parketech.com parkicloud.com @@ -71728,7 +72064,6 @@ paynews.net paypaytech.com pb89.com pbaohza.com -pbaohzc.com pbc-dcep.com pbcan.com pbcft.com @@ -71747,6 +72082,7 @@ pbtxt.com pbyz.net pc-120.com pc.wiki +pc02.com pc028.com pc120.com pc15.net @@ -71766,6 +72102,7 @@ pc768.com pc89.com pc8h.com pc9.com +pcapqz.com pcasl.com pcauto.com pcb-hl.com @@ -71786,6 +72123,7 @@ pcbtime.com pccm88.com pccpa.hk pccppc.com +pcdan.net pcdn100.com pcdog.com pcdrv.com @@ -71820,11 +72158,11 @@ pcscedu.com pcsee.org pcsfc.com pcshou.com +pcsjsm.com pct86.com pctutu.net pctvx.com pcw365.com -pcwatch.com pcwenti.com pcwgu.com pcwl.com @@ -71884,6 +72222,7 @@ pdty123.com pduoduo.vip pdvc.com pdvisa.com +pdwxo.vip pdxx.net pdxxg.com pdzls.com @@ -71909,6 +72248,7 @@ pebellows.com peccn.com pechoin.com pecmgd.com +pecoo.com pediatrixtherapeutics.com pediy.com pedli.com @@ -71977,9 +72317,11 @@ pengke.com penglei.name pengliao.com pengpailaw.com +pengqi.club pengqian.win pengrl.com pengrui-ssj.com +pengshancy.com pengtuzm.com penguin-logistics.space pengxinziyuan.com @@ -72024,6 +72366,7 @@ perfectdiary.com perfectlingo.com perfecttradinghk.com perfectwatchen.com +perfertw.com perfma.net peropero.net peroperogames.com @@ -72038,6 +72381,7 @@ pesrmyy.com pesyun.com pet-mri.com pet86.com +petaindonesia.org petalmail.com petalmaps.com petalsdata.com @@ -72074,6 +72418,7 @@ pfmmedicalchina.com pft12301.cc pftianshanno.com pfwx.com +pfzhiliao.com pg-leak.com pg114.net pg245348.cc @@ -72140,12 +72485,14 @@ phicomm.com philanthropy.xin philipswechat.com philisense.com +philjang.work phirda.com phirs.com phjqs.com phjt.com phlexing.com phmacn.com +phnamedns.com phnixhome.com phnixpool.com pho.so @@ -72199,7 +72546,6 @@ phpfs.com phpha.com phphub.org phpjiami.com -phpjoy.com phpkaiyuancms.com phplife.net phpor.net @@ -72212,7 +72558,6 @@ phpweb.net phpweblog.net phpxs.com phpyun.com -phqjsw.com phsb.com physicalclub.com physike.com @@ -72241,6 +72586,7 @@ piaobing.com piaobuy.com piaochong.com piaocom.com +piaode.ren piaodian.net piaododo.com piaodown.com @@ -72313,6 +72659,7 @@ pighaihe.com pigji.com pigmoral.tech pigonline.org +pigsty.cc pigv5.com pigx.vip pigyun.com @@ -72333,6 +72680,7 @@ pimaoji.com pimax.com pimei.com pimgeek.com +pimormebwf.com pin-color.net pin18pin.com pin2eat.com @@ -72342,6 +72690,7 @@ pinbang.com pinbayun.com pinble.com pinble.net +pincai.com pinchain.com pinchedashi.com pincn.com @@ -72386,6 +72735,7 @@ pingguobaoxiu.com pingguodj.com pingguolv.com pinghe.com +pinghu.tech pinghui-cn.com pingjiata.com pingmudiy.com @@ -72402,27 +72752,29 @@ pingshu365.com pingshu8.com pingshuku.com pingshuocoal.com +pingshuxiazai.com pingstart.com pinguan.com pinguo.us pingwest.com +pingxiangzhifa.com pingxiaow.com pingxuan123.com pingxx.com pingyin.cc pingzicloud.com -pingzicloudcdn.com pingzishuo.com pinhaohuo.com pinhui001.com -pinhxd.com pinidea.co pinjiago.com pinjiao.com pinjiaolian.com +pinjie.cc pinjieqicai.com pinjiesj.com pinkecity.com +pinkehao.com pinkertech.com pinkoichina.com pinkou.com @@ -72434,6 +72786,7 @@ pinmuch.com pinocchiowb.com pinpai-bang.com pinpai1.com +pinpai37.com pinpaihuoyuan.com pinpailiu.com pinpaime.com @@ -72442,7 +72795,6 @@ pinpopt.site pinqugongxiangktv.com pinqukeji.com pinshu.com -pinshuxsw.com pinsuodesign.com pintangshi.com pintechpharma.com @@ -72450,6 +72802,7 @@ pintreel.com pintu360.com pintuan.com pintuanya.com +pintuer.com pintuju.com pintuxiu.net pinuc.com @@ -72468,6 +72821,7 @@ pioneer-pharma.com pioneer-pku.com pioneerchina.com pioneerep.com +pioneernews.cc pipa.com pipacoding.com pipahealth.com @@ -72506,6 +72860,7 @@ pixiaojiang.com pixivic.com pixpark.net piyanzi.com +piyipiba.com pj-666.com pj-road.com pj.com @@ -72521,6 +72876,7 @@ pjf.name pjgear.com pjhome.net pjhubs.com +pjjyzx.com pjob.net pjtime.com pjtka.com @@ -72537,7 +72893,6 @@ pkcity.com pkfish.com pkfj.xyz pkfun.com -pkfwealth.com pkgame.com pkghund.com pkgklk.com @@ -72614,7 +72969,6 @@ playchd.com playcomet.jp playcool.com playcrab.com -playdeltaforce.com playerinfinite.com playfifa.com playgm.cc @@ -72636,12 +72990,12 @@ plcjs.com plcloud.com plctlab.com plentypolymer.com +pleo-securelogin.com plesk-cn.com plex2.com plexpt.com plfrog.com plll-fluid.com -plnav.com plob.org plopco.com plottersyservicioshdz.com @@ -72729,11 +73083,13 @@ po.co po7ryumvkx34.com pobaby.net pobasoft.com +pochezu.com pocketcloud.vip pocketdigi.com pocketuni.net pockpower.com pocomagnetic.com +pocosite.com pocsuite.org podcast.xyz podfest.tech @@ -72744,6 +73100,7 @@ poem88.com poemlife.com poemschina.com pofang.com +pohaier.com pohover.com poikm.com point-memory.com @@ -72825,6 +73182,7 @@ popkart.tv popkx.com poploli.com popmart.com +popmartfans.cc popoffices.com popoho.com popoim.com @@ -72866,14 +73224,17 @@ posmcc.com posn.net pospalit.com pospos.com +post-delivered.today post163.com post183.net postarlight.com +postdelivered.today posterlabs.com postgres.fun postgresqlchina.com postjson.com postpony.com +postxin.com posyn.com poszjia.com potalapalace.com @@ -72886,11 +73247,11 @@ potomaccottage.com potops.com potplayercn.com pouchcontainer.io +pouquiagievu.com pouser.net pova-elc.com power-rail.com power-sprayer.com -power-z.com power86.com power8t.com powerapp.io @@ -72906,7 +73267,6 @@ powerchinayun.com powercx.com powerde.com powereasy.net -poweremarket.com powerex1.com powerflow-tech.com powerfulchina.com @@ -72973,6 +73333,7 @@ ppgg.in ppgmm.com ppgslb.com pphimalayanrt.com +pphqq.com ppia-china.com ppinfra.com ppio.cloud @@ -73016,14 +73377,13 @@ ppsurl.com ppsz.net ppt118.com ppt20.com -ppt28.com ppt360.com ppt920.com pptair.com pptbest.com pptelf.com ppter8.com -pptgenius.com +ppthi-hoo.com pptianliao.com pptiyu.com pptkj.net @@ -73066,7 +73426,6 @@ pqdtcn.com pqpo.me pqt-bearing.com pqtygsfkv.com -pqxz.com pqyhigh.com pqylow.com pqymiddle.com @@ -73112,7 +73471,6 @@ printerwhy.net printhome.com printidea.art printlake.com -prism-news.com privateapi.xyz privatess.win privspace.net @@ -73200,7 +73558,7 @@ psd8.com psdee.com psdiv.com pse-meti.com -psf0404.shop +psfjz.com psjdhhnkjahbn.cfd psjia.com psjxty.com @@ -73224,10 +73582,10 @@ psyzg.com psznh.com pszwatch.com pszx.com +pszxw.net pt-link.com pt597.com pt80.net -pt8866.xyz pt963.com pt97.com ptacn.com @@ -73248,6 +73606,7 @@ pthxuexi.com pthxx.com pthxxw.com ptimg.org +pting.club ptkckj.com ptkill.com ptmind.com @@ -73262,14 +73621,12 @@ pts-ai-texture.com pts-testing.com pts.games ptshare.org -ptsyy.com ptszgh.org ptteng.com ptwbs.net ptweixin.com ptx123.com ptxie.com -ptxw.com ptxyrcw.com ptxz.com ptyg.com @@ -73293,18 +73650,19 @@ pubghelper.com pubgkam.com pubgtool.com pubgzh-cn.vip +public6.com publiccms.com publicdns.cc pubmed007.com pubmedplus.com pubone.cc -pubsub.tech pubtian.com pubukeji.com pubwinol.com pubyun.com pubyun.net pubyun.org +pucijiankang.com pudetouzi.com pudie.net pudijt.com @@ -73335,6 +73693,7 @@ pujie.com pujingjt888.com pujiugame.com pukinte.com +pule.com pulinmed.com pulisi.com pulixingfu.com @@ -73349,7 +73708,6 @@ punaide.com punanhospital.com punchbox.info pungboo.com -puno-filter.com puoke.com puoraiatorcubt.icu puppetchina.com @@ -73416,7 +73774,6 @@ puworld.com puxiang.com puxindesign.com puxun.co -puyasemi.com puyideshiye.com puyimed.com puyuan-electric.com @@ -73434,11 +73791,12 @@ pw-partners.com pw1999.com pw88.com pwand.com -pwccn.com pwcinema.com pwdding.icu pwithe.com +pwjptdg.xyz pwjt.com +pwkyyb.com pwmat.com pwmqr.com pwns.fun @@ -73457,13 +73815,12 @@ px5a.com pxb7.com pxbgp.com pxc33.com +pxcn168.com pxcoex.com pxdier.net pxemba.com pxene.com pxhuiben.com -pxhvc.com -pxlmxx.com pxrczpw.com pxsfybjy.com pxsrmyy.com @@ -73506,7 +73863,6 @@ pymeng.com pymh.com pyneo.com pyou.com -pyrc.net pyshszh.com pystar.com pyt2021.com @@ -73549,7 +73905,6 @@ pzhl.net pzhol.com pzhqz.com pzhr.com -pzhsz.com pzhwater.com pzhwyw.com pzjdimg.com @@ -73562,7 +73917,6 @@ pznsh.com pzoom.com pzpu.com pzzc.net -pzzgsj.com pzzx.com q-alumni.com q-bakery.com @@ -73584,17 +73938,18 @@ q6c.com q6haqi.com q6u.com q77777777.com +q83v5haaz.com q88b.net q88c.net q96bq8m39p.world qa114.com qacctv.com qacn.net -qagdxs.com qakkan.vip qalex.com qamemc.com qapi.cc +qaqa555.com qaros.com qast.com qaxanyu.com @@ -73605,6 +73960,7 @@ qaynak.com qazasd.com qazdsa.com qazso.com +qazxsdc.com qbangmang.com qbaobei.com qbb6.com @@ -73688,6 +74044,7 @@ qcly.love qcly.xyz qcmgkids.com qcmoe.com +qcmrjx.com qcmuzhi.com qcoco.com qconbeijing.com @@ -73695,6 +74052,7 @@ qconshanghai.com qcplay.com qcq3.com qcql.com +qcr.cc qcrencai.com qcrlvip.com qcrqll.com @@ -73807,6 +74165,7 @@ qdmcxh.com qdmm.com qdmswx.com qdnsyh.com +qdnxsyy.com qdnzrmyy.com qdpdjx.com qdport.com @@ -73815,6 +74174,7 @@ qdqihang.com qdqs.com qdrcsc.com qdreads.com +qdsay.com qdsbx.com qdsdeyljt.com qdsdyjt.com @@ -73825,6 +74185,7 @@ qdslcs.com qdsmjxh.com qdspr.com qdsrmyy.com +qdsysj.com qdsyxh.com qdtaide.com qdtech.ai @@ -73892,8 +74253,6 @@ qfedu.com qfeiche.com qfiee.com qfihdr.com -qfkjnb.club -qflyinc.com qfns1.com qfpay.com qfpq.com @@ -73963,6 +74322,7 @@ qhdatongnews.com qhdcm.com qhderwei.com qhdgjj.com +qhdglc.com qhdjgyy.com qhdlcdn.com qhdnews.com @@ -74013,10 +74373,12 @@ qhsat.com qhsdzs.com qhsetup.com qhsklw.com +qhsrmyy.com qhssyy.com qhstatic.com qhsxf.net qhtdow.help +qhtf-china.com qhtibetan.com qhtui.com qhtycp.com @@ -74050,12 +74412,15 @@ qialol.com qian-gua.com qian-lai.com qian.lu +qianaolawyer.com qianbao.com qianbaocard.com qianbaogroup.com qianbaohr.com qianbi360.com +qianbianapi.com qianbianma.com +qianbianxiazai.com qiancangwms.com qiancha.cc qianchengriben.com @@ -74079,7 +74444,6 @@ qianfan365.com qianfanwanmu.com qianfanyun.com qianfeng.com -qiangang.icu qiangbus.com qiangchuan.com qiangfu.xyz @@ -74172,7 +74536,6 @@ qianvisa.com qianwa.com qianwanku.com qianwen.com -qianwenai.com qianxiangbank.com qianxibj.net qianximiye.com @@ -74186,7 +74549,6 @@ qianxuecloud.com qianxuew.com qianxueyunke.com qianxun.com -qianxun1688.com qianxunclub.com qianxungroup.com qianxuntrip.com @@ -74272,6 +74634,7 @@ qicheedu.com qichegeyin.com qichehot.com qichejingwei.com +qichelian.com qicheliliang.com qichemen.com qichemoxing.net @@ -74282,6 +74645,7 @@ qicheq.com qichequan.net qichetong.com qichexin.com +qichezhan.net qichuang.com qichunfdc.com qichunzp.com @@ -74304,7 +74668,6 @@ qidianmm.com qidianpw.com qidiantu.com qidic.com -qiding.xin qidisheng.com qidiwang.com qidong.name @@ -74341,6 +74704,7 @@ qifeng-safety.com qifeng.com qifenxiao.com qifu.me +qifub.com qifuip.com qigonggate.com qigongworld.net @@ -74395,6 +74759,7 @@ qikegu.com qikekeji.com qikoo.com qikouu.com +qikqiak.com qiku.com qikuaibao.com qikucdn.com @@ -74421,6 +74786,7 @@ qilongyoule.com qilu-pharma.com qiludb.com qiluhospital.com +qiluhr.com qilupaint.com qiluyidian.mobi qiluyidian.net @@ -74442,15 +74808,14 @@ qiminzi.com qimodesign.com qimser.com qimu86.com -qimyu.com qinbei.com qinbing.com qincai.com qincaigame.com -qince.com qinchuan.com qinchugudao.com qinco.net +qindaohotel.com qinde.net qineasy.com qinengdongfang.com @@ -74516,10 +74881,10 @@ qinghedaxue.com qinghua.cc qinghua2017.com qinghuan.com +qinghuaonline.com qinghuaxuezi.com qinghuo.net qingicon.com -qingjiansoft.com qingjiaocloud.com qingju.com qingkai.net @@ -74546,17 +74911,18 @@ qinglinong.com qinglm.com qinglue.com qinglue.net +qingly.ink qingmail.com qingmayun.com qingmei.me qingmh.com -qingmings.com qingmo.com qingmob.com qingmucdn.com qingmuit.com qingmutec.com qingmuxinli.com +qingnianlvxing.com qingniantuzhai.com qingnianwang.com qingning88.com @@ -74568,6 +74934,7 @@ qingqin.com qingqingmedia.com qingqj.com qingque.co +qingqujie.com qingquyp.com qingr.com qingrenw.com @@ -74579,6 +74946,7 @@ qingshou.online qingshow.net qingshuo.com qingshuxuetang.com +qingsongcdn.com qingsongchou.com qingsongjituan.com qingsonngxx.com @@ -74599,6 +74967,7 @@ qingtingjh.com qinguanjia.com qingui123.com qinguoag.com +qingwabs.com qingwk.com qingxianrenminyiyuan.com qingxiaoyun.com @@ -74678,6 +75047,7 @@ qinxue.com qinxue100.com qinxue365.com qinxuye.me +qinyangtv.com qinyuanyang.com qinyukehuan.com qinzhe.com @@ -74766,7 +75136,6 @@ qiushu.cc qiushu.info qiushubang.com qiushuzw.com -qiusu.com qiutan.com qiutiangear.com qiuvps.com @@ -74780,7 +75149,6 @@ qiuxue360.com qiuxueshe.com qiuyewang.com qiuyexitong.com -qiuyl.com qiuyueli.com qiuzhang.com qiuzhijiangtang.com @@ -74809,6 +75177,7 @@ qixinworks.com qixiu88.com qixiushouce.com qixoo.com +qixuan888.com qixuny.com qiye.la qiye163.com @@ -74847,6 +75216,7 @@ qiyuanai.com qiyuange.com qiyuanxuetang.net qiyucloud.com +qiyue.com qiyuebio.com qiyuesuo.com qiyujiasu.com @@ -74893,7 +75263,6 @@ qjis.com qjjfin.com qjjmw.com qjmotor.com -qjmotorlink.com qjnice.com qjrc.com qjren.com @@ -74907,7 +75276,6 @@ qjwenming.com qjwh.xyz qjwhzs.com qjxgold.com -qjxns.com qjystang.com qjzl.com qjzyy.com @@ -74971,7 +75339,6 @@ qlwyjy.com qlxiaozhan.com qlxyedu.com qlydw.com -qlyfhdns.com qlyjt.com qlyygl.com qlyyqd.com @@ -75000,6 +75367,7 @@ qmht.com qmht.mobi qmjianli.com qmniu.com +qmoji.net qmqm.net qmrms.com qmsea.com @@ -75070,6 +75438,7 @@ qp110.com qp46.com qp49.com qpaimg.com +qpb187.com qpdca.com qpdiy.com qpgame.com @@ -75108,6 +75477,7 @@ qq3366.net qq499.com qq5.com qq52o.me +qq5818.com qq620.com qq7c.com qq933.com @@ -75119,6 +75489,7 @@ qqan.com qqb.pub qqbiaoqing.com qqbibile.com +qqbizhi.com qqbrowser.mobi qqcdn.com qqcfw.net @@ -75132,6 +75503,7 @@ qqdiannao.com qqdna.com qqdr.com qqdzzb.win +qqe2.com qqeml.com qqeo.com qqexmail.net @@ -75161,6 +75533,7 @@ qqhubei.com qqimage.net qqimg.net qqjapan.com +qqje.com qqjia.com qqjjsj.com qqjm.com @@ -75187,10 +75560,12 @@ qqpharm.com qqpifu.com qqplusapp.com qqpuke.org +qqq.tv qqq937.com qqqiyemail.com qqqiyeyouxiang.com qqqmmm.com +qqqv.press qqrain.com qqread.com qqrizhi.com @@ -75366,6 +75741,7 @@ qtlgslbcn.com qtlgslbcn.info qtlgslbcn.net qtmojo.com +qto-pay.com qtonghua.com qtool.net qtrun.com @@ -75383,7 +75759,6 @@ qtvnews.com qtw555.com qtx.com qtyd.com -qtyl001.com qu2000.com qu2345.com qu247.com @@ -75746,7 +76121,6 @@ qufutuan.com qugame.com quguonet.com quhaidiao.com -quhaotui.com quheqihuo.com quhua.com quhuaxue.com @@ -75766,14 +76140,15 @@ quickjoy.com quicklaser.com quicklyopen.com quickpark.cc -quickqnet.com quicksdk.com quicksdk.net quickswan.com quicktvui.com quickwis.com +quiksx.cfd quilimen.com quimg.com +quji.com qujiangyizhong.com qujie365.com qujingm.com @@ -75790,6 +76165,7 @@ qukuai.com qukuaila.com qulaoshi.com qule8.com +quledu.net qulianaiba.com qulishi.com quluying.com @@ -75857,6 +76233,7 @@ ququyou.com quqxphdm.com qushixi.net qushoumiao.com +qushuba.com qushuiying.net qutaiwan.com qutanme.com @@ -75879,6 +76256,7 @@ quumii.com quvisa.com quwan.com quwangming.com +quweiwu.com quwenqing.com quwentxw.com quwj.com @@ -75894,7 +76272,6 @@ quxingdong.com quxintiaodong.com quxiu.com quxuan.com -quxuanshu.com quyangyizhong.com quyaoya.com quyibao.com @@ -75918,7 +76295,6 @@ qvpublish.com qvxz.com qw5599.com qwbk.cc -qwdjapp.com qwe1e.com qweapi.com qweather.com @@ -75976,6 +76352,7 @@ qxhqxh.com qxioqq4283.vip qxiu.com qxjeff.com +qxka.com qxkjz.com qxkp.net qxlib.com @@ -75992,6 +76369,7 @@ qxqxa.com qxrcw.com qxsdq.com qxsfjq.com +qxshucai.com qxswk.com qxteacher.com qxtour.com @@ -76023,12 +76401,15 @@ qy57.com qy6.com qyaninfo.com qybc.com +qybhl.com qyc2008.com qycn.com qycn.net qycname.com qycylinder.com +qyd-rf.com qydimg.com +qydqw.com qydsj.com qyer.com qyerstatic.com @@ -76041,6 +76422,7 @@ qygbet140.vip qygbet381.vip qygbet427.vip qygjyey.com +qyglzz.com qyhgsb.com qyhl.vip qyhr.org @@ -76060,6 +76442,8 @@ qyrcrs.com qyrx.cc qysbj.com qysd.net +qysgf.com +qysport.com qysrmyy.com qyssgame.com qysulian.com @@ -76084,7 +76468,6 @@ qyxa-tencentclb.net qyxa-tencentclb.work qyxxpd.com qyxzfw.com -qyy888.com qyyt.com qyzba.club qyzc.net @@ -76157,13 +76540,12 @@ qznovelvod.com qznxt.com qzone.cc qzone.com -qzone6.com qzoneapp.com qzonei.com qzqcfw.com qzqcw.com -qzqi.com qzqn8.com +qzqstudio.com qzqxd.com qzqxw.com qzrbx.com @@ -76177,6 +76559,7 @@ qzsgyxx.com qzshangwu.com qzshly.com qzsmxx.com +qzsqsnhdzx.com qzssdy.com qzsx168.com qzsystem.com @@ -76184,7 +76567,7 @@ qzsyy.com qzt520.com qztc.vip qztingche.com -qztpay.com +qztour.com qztszls.com qztvxwgj.com qzwb.com @@ -76200,7 +76583,6 @@ qzyun.net qzyz.com qzzdtc.com qzze.com -qzzgame.com qzzgdl.com qzzhedu.com qzzhonghan.com @@ -76242,6 +76624,7 @@ rabbitbbs.com rabbitpre.com rabbitpre.me rabbitserve.com +rabook.com rabschina.com race604.com racent.com @@ -76258,6 +76641,7 @@ radida.com radio1964.com radio366.com radiotj.com +radiowar.org radissoncollection-wuxi.com radius-america.com radleybagssaleuk.org @@ -76333,7 +76717,6 @@ ranqibiao.net rantu.com ranwen.net ranwen.org -ranwen.tw ranwena.com ranxi.net ranyangrent.com @@ -76355,12 +76738,12 @@ rashost.com rastargame.com rat3c.com rate2003.com -ratetend.com rationalwh.com ratogh.com ratoo.net rauqa.net rauto.com +ravenna0943.xyz raverstern.site rawanfa.com rawchen.com @@ -76402,7 +76785,6 @@ raylink.live raymage.com raymx-micro.com raynext.info -rayootech.com rayoptek.com rayp.com rayps.com @@ -76467,6 +76849,7 @@ rcmxw.com rcnep.com rcolab.com rcpx.cc +rcswo.com rcsxzx.com rcunxyn.com rcuts.com @@ -76511,6 +76894,7 @@ rdyjs.com rdzjw.com rdzs.com rdzx.net +rdzy.net reabam.com reach-biology.com reachace.com @@ -76620,7 +77004,6 @@ redidc.com redisfans.com redmagic.com redmart.com -redmid.com redmou.com rednetdns.com rednote.com @@ -76637,6 +77020,7 @@ redq.cc redraingame.com redrcd.com redream.com +redredsquare.com redsea888.com redsh.com redshu.com @@ -76659,6 +77043,7 @@ reeiss.com reeji.com reenoo.com reenoo.net +refined-x.com refineidea.com refire.com refond.com @@ -76741,6 +77126,7 @@ renfei.net renfutm.com renguokeji.com renhaocw.com +renhebusiness.com renhence.com renhuaicode.com renji.com @@ -76836,6 +77222,7 @@ reservehemu.com resheji.com resistor.today resnics.com +resnowshop.com resona-wujl.com resone-shinab.com resowolf.com @@ -76857,6 +77244,7 @@ revefrance.com revenuads.com reviosky.com revolut.ltd +revolutwebapp.com rew65.com rewanyouxi.com reworlder.com @@ -76885,6 +77273,7 @@ rfhhzx.com rfid-e.com rfidcardcube.com rfidfans.com +rfidnfk.com rfidtech.cc rfilter.com rfjd.com @@ -76919,16 +77308,15 @@ rheemchina.com rhexe.com rhhz.net rhine-inc.com -rhino.auto rhinosgamestwhk.com rhinoxky.com rhjoyhotel.org rhkj.com rhky.com rhnewmaterials.com +rhoadshomebuyers.com rhonghai.com rhphos.com -rhrlawyer.com rhsj520.com rhspring.com rhtimes.com @@ -76983,6 +77371,7 @@ rightknights.com rightpaddle.com rigol.com rigouwang.com +riji001.com riji100zi.com rijigu.com rijiwang.com @@ -77064,6 +77453,7 @@ rizhili.com rizhiyi.com rizhuti.com rj.link +rj.net rj668.com rjaaa.com rjdownd.com @@ -77079,7 +77469,6 @@ rjlqq.com rjoy.com rjpharm.com rjpharma.com -rjqcfw.com rjreducer.com rjs.com rjsjmbwx.com @@ -77104,6 +77493,7 @@ rklive888.com rksec.com rkzxhyy.com rl-consult.com +rl1vypwyd2.com rlair.net rljydt.com rlkj.com @@ -77129,8 +77519,6 @@ rmejk.com rmhospital.com rmjiaju.com rmjtxw.com -rmk6.com -rmlinking.com rmny.tech rmrbwc.com rmrun.com @@ -77155,7 +77543,6 @@ rnmachine.com rnote.com ro50.com road-group.com -roaderp.com roadhb.com roadjava.com roadlady.com @@ -77271,6 +77658,7 @@ ronghub.com ronghuiad.com ronghuisign.com rongji.com +rongjiagroup.com rongkang.com rongkao.com rongkeyiyuan.com @@ -77334,11 +77722,11 @@ rosecmsc.com rosedata.com rosefinchfund.com rosesandgold.fun -roseshop.asia rosewin.com rosin-china.com rosirs-edu.com rosnas.com +rosoo.net rossoarts.com rossoarts.net rossopharm.com @@ -77398,6 +77786,7 @@ rqyy.com rqyz.com rr-sc.com rr365.com +rrajz.com rrb365.com rrbay.com rrbus.com @@ -77418,7 +77807,6 @@ rrrdai.com rrrrdaimao.com rrrxz.com rrs.com -rrsp.app rrsurg.com rrswl.com rrting.net @@ -77488,6 +77876,7 @@ rtahengtai.com rtalink.com rtb5.com rtbasia.com +rtbbox.com rtbmax.com rtbpb.com rtbtmc.com @@ -77621,7 +78010,6 @@ ruijiehuanbao.com ruijienetworks.com ruijiery.com ruijieyun.com -ruijingenergy.com ruijinginfo.com ruijinintl.com ruijinyy.com @@ -77640,6 +78028,7 @@ ruishengseal.com ruisilc.com ruisizt.com ruisong.tv +ruit56.com ruitairt.com ruite-tec.com ruitengmaoyi.com @@ -77651,6 +78040,7 @@ ruiwant.com ruiwen.com ruiwenruanjian.com ruixhz.com +ruixiangbest.com ruixin-eht.com ruixing.cc ruixueys.com @@ -77763,7 +78153,9 @@ rushiwowen.org rushmail.com rushui.net russellluo.com +rustc.cloud rustfisher.com +rustfs.com rustvnt.com rutbr.com ruthout.com @@ -77802,11 +78194,13 @@ rwdls.com rwjiankang.com rwjtgc.com rwkv.com +rwosf.space rwsignal.com rwtext.com rwxqfbj.com rwys.com rx-copper.com +rx-semi.com rxbj.com rxcrs.com rxftw.com @@ -77872,7 +78266,6 @@ rzfdc.com rzfyu.com rzglgc.com rzhr.com -rzhuce.com rzhushou.com rzhybh.com rzkj999.com @@ -77896,6 +78289,7 @@ s-famed.com s-jl.com s-ns.com s-pia.org +s-q-s.net s-reader.com s-ss.cc s-tech.com @@ -77911,10 +78305,11 @@ s10000.com s135.com s163.com s1979.com +s1blsecgerto.com +s1blseclvira.com s1craft.com s1mple.cc s1mplecode.com -s1ths95f1r.cc s2ceda.com s2cinc.com s2g2b2c.com @@ -77948,7 +78343,6 @@ sa96.com saaas.com saagasports.com saasddos.com -saaslb.com saasops.tech saasruanjian.com saasta.net @@ -77967,6 +78361,7 @@ saegedu.com saen.com saf158.com safbon.com +safdsafea.com safeb2b.com safecenter.com safeglp.com @@ -78060,6 +78455,7 @@ sakway.com saky.site salabs.org saladvideo.com +salamatcharity.org salasolo.com sale8.com saleenauto.com @@ -78219,6 +78615,7 @@ sanqiu.org sanquan.com sanrangas.com sanrengxin.com +sanrenwenku.com sanritzgroup.com sansancloud.com sansg.com @@ -78257,7 +78654,6 @@ sanxige.com sanxin-med.com sanxinbook.com sanxing.com -sanxingelectric.com sanxinwin.com sanyaairport.com sanyachloe.com @@ -78276,7 +78672,6 @@ sanygroup.com sanyhi.com sanyichemical.com sanyipos.com -sanykj.com sanyouco.com sanyoumed.com sanyoutj.com @@ -78304,6 +78699,7 @@ saolei123.com saolife.com saomadc.com saomadiancan.com +saoniuhuo.com saoshu.org saoso.com saowen.net @@ -78320,10 +78716,10 @@ sass.hk sasscss.com sasseur.com sasseur1989.com +sassi2956.xyz sast.fun sast.net sat0.net -satellitestress.st satgssb.com sating-tech.com sator.tech @@ -78334,6 +78730,7 @@ saturnbird.com saublenew.com savilehotelgroup.com savokiss.com +savouer.com sawenow.com sawuatsurgical.com saxydc.com @@ -78346,6 +78743,7 @@ sayodevice.com saywash.com sayyas.com sazeoq8158.vip +sb1secapply4.com sbc-mcc.com sbf56.com sbh15.com @@ -78355,6 +78753,9 @@ sbjd88.com sbjxyq.com sbk-h5.com sbkh5.com +sblseceorf.com +sblsechuorb3.net +sblsecorgan.com sbmscs.com sbnkca.com sbnkjl.com @@ -78409,6 +78810,7 @@ scarclinic-cn.com scardtech.com scatc.net scavc.com +scbaidu.com scbaijia.com scbao.com scbaopo.org @@ -78447,7 +78849,6 @@ scdanzhao.net scdbzzw.com scdccb.com scdcs.net -scdn.cyou scdn.im scdn.io scdn0077.com @@ -78589,7 +78990,6 @@ scemrq.com scengine.com scenictc.com scensmart.com -scetc.net scetop.com scezju.com scflcp.com @@ -78646,6 +79046,7 @@ scianet.org sciasc.com scichina.com scicn.net +scidict.org sciecure.com sciedu.org sciencecity.net @@ -78712,6 +79113,7 @@ sclrjc.com sclsnk.com sclssz.com sclsyz.com +sclvb.com sclyxw.com sclzfq.com scm121.com @@ -78747,7 +79149,6 @@ scpgj.com scpgroup.com scpidi.com scpolicec.com -scqbyy.com scqckypw.com scqcp.com scqjxh.com @@ -78803,6 +79204,7 @@ sctgo.com sctindustries.com sctobacco.com sctodr.com +sctszh.com scttwy.com sctv-tf.com sctv.com @@ -78820,6 +79222,7 @@ scujj.com scunionpay.com scusec.org scutech.com +scutedu.org scuvc.com scw98.com scwhx.com @@ -78827,7 +79230,6 @@ scwj.net scwlylqx.com scwmwl.com scwqxh.com -scwsrc.com scwy.net scwyzx.com scxd56.net @@ -78843,7 +79245,6 @@ scych.org scyesz.com scylzx.net scymob.com -scyol.com scyongqin.com scyqfhw.com scyqjs.com @@ -78921,6 +79322,7 @@ sdcbcnc.com sdccg.com sdcclh.com sdcfdq.net +sdcgc.com sdchelv.com sdchem.net sdcheshi.com @@ -79018,7 +79420,6 @@ sdgykg.com sdgyslfz.com sdgzkg.com sdhack.com -sdhaike.com sdhbcl.com sdhdssd.com sdhead.com @@ -79064,6 +79465,7 @@ sdicin.com sdicpower.com sdicqzdefd.com sdictktrust.com +sdictrade.com sdicvc.com sdigc.com sdiitu.com @@ -79103,9 +79505,9 @@ sdjxgj.com sdjys.org sdjzgt.com sdjzsemi.com -sdkairun.com sdkamaiduo.com sdkbalance.com +sdkclick.com sdkdch.com sdkeli.com sdkjjt.com @@ -79172,6 +79574,7 @@ sdpea.org sdpku.com sdplt.com sdptem.com +sdpua.com sdpxyq.com sdqcgs.com sdqcpc.com @@ -79211,7 +79614,6 @@ sdsenrong.com sdseshealth.com sdsfjy.com sdshangya.com -sdshdc.com sdshgk.com sdshihua.com sdshitu.com @@ -79250,7 +79652,6 @@ sdtdfz.com sdteleiptv.com sdteya.com sdtianjing.com -sdticai.com sdtkgl.com sdtlpm.com sdtlyyjt.com @@ -79343,7 +79744,6 @@ sdzpw.com sdzpw.net sdzrm.com sdzs.com -sdzs001.com sdzsyl.com sdztkj.com sdztxxkj.com @@ -79365,6 +79765,7 @@ seaide.com sealaly.net sealand100.com sealandtableware.com +sealeadbattery.com sealien.net sealimg.com sealion360.com @@ -79404,6 +79805,7 @@ seazor.com seblong.com sebug.net sec-in.com +sec-mail.cloud sec-motor.com sec-wiki.com secaibi.com @@ -79429,6 +79831,7 @@ secretgardenresorts.com secretmine.net secrss.com secrui.com +secshow.net secsib-eliaslias.com secsib-kendal.com secsilo.com @@ -79541,6 +79944,7 @@ selypan.com sem123.com semem99.com semeye.com +semgz.com semi-casi.com semi.design semiconductorpower.com @@ -79549,13 +79953,13 @@ semidata.info semiee.com semight.com semigraph.net +semiinsights.com semir.com semiway.com semiwebs.com sempk.com semptian.com semw-sh.com -senachina.com senaocargo.com senbeijia.com sencdn.com @@ -79585,7 +79989,6 @@ sengzai.com senhai.com senhaix.com senhe.com -seniohr.com senior.auto seniverse.com senken-international.com @@ -79593,7 +79996,6 @@ senlianshop.com senlinjimore.com senmiaoliuxue.com senmiaoschool.com -senmuse.com senorsen.com senpet.com senpian.com @@ -79613,6 +80015,7 @@ sensorsdata.com sensorsdatavip.com senssun.com sentaihb.com +sentaiwpc.com sentcss.com sentdream.net senteauto.com @@ -79626,7 +80029,6 @@ senyao1718.com senyou.com senypc.com senyuanhi.com -senyuanqc.com seo-lv.com seo.tm seo1158.com @@ -79645,6 +80047,7 @@ seosn.com seotcs.com seovx.com seowhy.com +seoxiaoxin.com sep.cc sepact.com sepcc.com @@ -79693,6 +80096,10 @@ sevensem.com sevnday.com sevnz.com sewise.com +sex291roushipin.wiki +sex2ribenwuma.wiki +sex2xiaoluoli.wiki +sex2yingtaoshipin.wiki sexytea2013.com seyoo.net seyuma-cn.com @@ -79737,6 +80144,7 @@ sfdrums.com sfdy13168.com sfdzh.com sfecr.com +sffdj.com sfgj.org sfgy.org sfhaa.com @@ -79772,6 +80180,7 @@ sftnow.com sfund.com sfvip1.com sfwl.co +sfwxf.com sfy-gmc.com sfyb.com sfybee.com @@ -79801,10 +80210,12 @@ sgccdn.com sgcctd.com sgcctop.com sgcec.com +sgchinese.com sgcyjy.com sgda.cc sgdmobile.com sge.sh +sgfsm.com sgjlkyjx.com sgjq.net sgjsgf.com @@ -79834,6 +80245,7 @@ sgsic.com sgsotools.com sgst.prod.dl.playstation.net sgsugou.com +sgsxw.com sgsxybiz.com sgsyxx.net sgt21.com @@ -79878,11 +80290,11 @@ sh-fy.com sh-game.com sh-gelanlishi.com sh-gexing.com -sh-gffm.com sh-gsg.com sh-henderson-metropolitan.com sh-hengyuan.com sh-hilead.com +sh-hitech.com sh-holfer.com sh-holiday.com sh-hs.com @@ -79957,6 +80369,7 @@ sh-zbfm.com sh002.com sh1011.com sh112.com +sh12320.com sh148.org sh17.com sh1nk1n-shokd.com @@ -79976,6 +80389,7 @@ sha-steel-yx.com sha-steel.com sha2777.com sha990.com +shaaidata.com shaangu.com shaanxigas.com shaanxiiot.com @@ -80080,7 +80494,6 @@ shangdian.biz shangdiguo.com shangdu.com shangdu.info -shangdu.net shangeyun.com shangfang56.com shangfox.com @@ -80176,6 +80589,7 @@ shanglischool.com shangluo.co shanglushan.com shanglv51.com +shangnaxue.cc shangnaxue.net shangpai123.com shangpin.com @@ -80202,6 +80616,7 @@ shangshuce.com shangshuyixue.com shangtaiw.com shangtao.net +shangtao360.com shangtianhui.com shangtongda.com shangtuf.com @@ -80214,7 +80629,6 @@ shangwu168.com shangwulink.com shangxue.com shangxueba.com -shangxueshuo.com shangyejihua.com shangyekj.com shangyexinzhi.com @@ -80245,6 +80659,7 @@ shankaisports.com shankejingling.com shanliao.com shanliaoapp.com +shanling.com shanlinjinrong.com shanlink.com shanliulian.com @@ -80314,7 +80729,6 @@ shanzhen.com shanzhen.me shanzhildq.com shanzhonglei.com -shanzhuhttp.com shanzhuyou.com shaoanlv007.com shaoerbc.org @@ -80330,6 +80744,7 @@ shaolvjt.com shaomingyang.com shaoniandream.com shaoshangwang.org +shaoshilei.com shaoxiao.net shaoxingwater.com shaoyangnews.net @@ -80363,6 +80778,7 @@ sharewaf.com sharexbar.com sharexiang.com sharjahmadrasa.com +sharkisland.store sharkselection.com sharkshopping.com sharpbai.com @@ -80374,6 +80790,7 @@ shatian.org shautomuseum.com shavpn.amd.com shavpn2.amd.com +shawdo.com shawnzeng.com shaxian.biz shayugg.com @@ -80405,6 +80822,7 @@ shboka.com shbpump.com shbqmp.com shbtpm.com +shbxzp.com shbyer.com shbyw.com shcaco3.com @@ -80449,7 +80867,6 @@ shdatagroup.com shdcjt.com shdgm.com shdingzhidental.com -shdjnet.com shdjt.com shdmic.com shdmt.net @@ -80463,6 +80880,7 @@ shdsd.com shdsn.com shdsqs.com shdszc.com +shdxgraphene.com shdy.com shdy168.com shdyiy.com @@ -80473,6 +80891,7 @@ she120.com sheasyoffice.com shebao.net shebao100.com +shebao5.com shebaomi.com shebaotong.com shebaowang.com @@ -80483,7 +80902,6 @@ sheca.com shedongyun.com shedoor.com shedunews.com -shedunews.net sheec-tencentclb.cloud sheec-tencentclb.com sheec-tencentclb.net @@ -80505,8 +80923,8 @@ shejidna.com shejijia.com shejijingsai.com shejiku.net -shejilogo.com shejinu.com +shejipi.com shejiqun.com shejis.com shejiwo.net @@ -80516,6 +80934,7 @@ shejiyue.com sheketiandi.com shekou.com shelive.net +shell.cdn.office.net shellpub.com shellsec.com shelter-china.com @@ -80524,6 +80943,7 @@ shelwee.com shen-grh.com shen-nao.com shen-xi.com +shen321.com shenanhui.com shenbanglawyer.com shenbinghang.com @@ -80583,6 +81003,7 @@ shenghuagroup.com shenghuaxi.com shenghui56.com shenghuigd.com +shenghuo365.com shenghuojia.com shenghuorili.com shenghuowo.com @@ -80599,6 +81020,7 @@ shengmaapp.com shengmage.com shengming.net shengminghitech.com +shengniuuz.com shengpay.com shengqian51.com shengquan.com @@ -80610,7 +81032,6 @@ shengshizhicheng.com shengtai.com shengtaigroup.net shengtian.com -shengtiangames.com shengtiangroup.com shengtongedu.com shengtuanyouxuan.com @@ -80707,7 +81128,6 @@ shenxingroup.com shenxm.com shenxuanche.com shenyang2car.com -shenyangbus.com shenyangoffice.com shenyd.com shenyecg.com @@ -80740,7 +81160,6 @@ shenzhentour.com shenzhenware.com shenzhenygx.com shenzhenyuren.com -shenzhong.net shenzhoublm.com shenzhouen.com shenzhoufu.com @@ -80824,14 +81243,13 @@ shhebio.com shhella.com shhenghesh.com shheywow.com -shhezhenzszy.com shhic.com shhigher.com shhkcc.com shhkfw.com shhkyy.com +shhl56.com shhlgroup.com -shhljsj.com shhmbio.com shhmu.net shholdingeu.com @@ -80882,7 +81300,6 @@ shicaidai.com shicaizhanlan.com shicehao.com shichangbu.com -shicheng6.com shichengbao.com shichengyi.com shichuangsj.com @@ -80974,7 +81391,9 @@ shilian.com shilian.net shilicdn.com shilincn.com +shilitie.net shiliuai.com +shiliupo.com shiluetl.com shiluoji.com shimano-fishchina.com @@ -80985,6 +81404,7 @@ shimaostargroup.com shimaotong.com shimaowy.com shimen.org +shimengcs.com shimengyuan.com shimengzhanghao.com shimge.com @@ -81001,6 +81421,7 @@ shimonote.com shimotx.com shimowendang.com shin-kinojseh.com +shinberto.com shinco.com shindaichem.com shine-consultant.com @@ -81021,7 +81442,6 @@ shinewing.com shinewonder.com shineyie.com shineyue.com -shinflow.com shinger.com shinianonline.com shining-electric.com @@ -81034,7 +81454,6 @@ shinkin-jpo-coy.com shinkinopsae.com shinnytech.com shinva.net -shinvasurgical.com shinycg.com shinye-ortho.com shinyway.org @@ -81050,6 +81469,7 @@ shipgroup.net shiphr.com shipin163.com shipin520.com +shipinzhibojian.com shipoe.com shippingate.com shippingchina.com @@ -81063,6 +81483,7 @@ shipuxiu.com shipxy.com shiqi.me shiqiao.com +shiqichuban.com shiqitech.com shiqu.com shiquan56.com @@ -81144,10 +81565,12 @@ shiyu.zone shiyuandx.com shiyue.com shiyuegame.com +shiyueliangpin.com shiyund.com shiyus.com shiyutianqi.com shizhanxia.com +shizhiad.work shizhuang-inc.com shizhuolin.com shizhuonet.com @@ -81301,7 +81724,9 @@ shopeesz.com shopex123.com shopimgs.com shopin.net +shopjyh.com shoplazza.com +shopline123.com shopmaxmb.com shopnc.net shoppkk.com @@ -81318,7 +81743,6 @@ shopxx.net shopyy.com shorcut88.com shorologe.com -shortdramaop.com shortof.com shotnba.com shou-qi.com @@ -81346,10 +81770,10 @@ shoudurx.com shoufaw.com shoufm.com shoufu.com +shougongke.com shougongke.net shougoumingbiao.com shouhaoche.com -shouhou.xin shouhougou.com shouhui.com shouhuigroup.com @@ -81366,13 +81790,14 @@ shouji56.com shoujibao.net shoujiduoduo.com shoujihuifu.com +shoujikanshu.net +shoujimi.com shoujitouping.com shoujiwan.com shoujixs.net shoukaigufen.com shoukala.com shoukangyiyuan.com -shoukawa.com shoukayun.com shoulian.org shoumaquan.com @@ -81454,6 +81879,7 @@ shpingda.com shppa.net shps518.com shpsncp.com +shpyedu.com shqec.com shqi7.net shqinghe.com @@ -81465,7 +81891,6 @@ shqpxc.com shqunlu.com shqxjx.com shqyg.com -shranji.com shrbank.com shrca.org shrcb.com @@ -81581,7 +82006,6 @@ shuaji.com shuaji.net shuajibao.com shuajizhijia.net -shualian.work shuame.com shuang-feng.com shuang-sen.com @@ -81676,6 +82100,7 @@ shuibaogs.com shuibengxinghao.com shuicao.cc shuichan.cc +shuichan51.com shuichuyu.com shuidichou.com shuididabingchou.net @@ -81696,6 +82121,7 @@ shuiguobang.com shuihulu.com shuijing100.com shuijingka.com +shuijingwanwq.com shuijingwuyu.com shuijingyibai.com shuijinshunzhuang.com @@ -81721,7 +82147,7 @@ shuitexxkj.com shuitou001.com shuiwushi.com shuiwushi.net -shuixing.com +shuixin.tech shuiyaohuo.com shuiye.cc shuiyinbao.com @@ -81777,11 +82203,11 @@ shumenol.com shumensy.com shumiao.com shumiimg.com +shumilou.org shumo.com shun176.com shunanholding.com shunbangsaifu.com -shunbd.com shunchangzhixing.com shunchaojinshu.com shuncom.com @@ -81839,6 +82265,7 @@ shupackaging.com shupaiyun.com shupeng.com shuqi.com +shuqiandiqiu.com shuqiaozt.com shuqiapi.com shuqiread.com @@ -81904,7 +82331,6 @@ shuzixindong.com shuziyingxiao.net shuziyuedong.com shuzong.com -shuzutech.com shwbs.org shwdir.com shwebspace.com @@ -81916,7 +82342,6 @@ shwkwai.com shwoody.com shwpbbs.com shwpg.com -shws.com shws.org shwsfy.com shwsg.net @@ -82019,6 +82444,7 @@ shyxwz.com shyy6688.com shyygh.com shyyp.net +shyywz.com shyyy.com shyyyl.com shyz07.com @@ -82067,9 +82493,11 @@ si-en.com si-era.com si-in.com si-win.com +si.cdn.dell.com sia1995.net siad-c.com siaedu.net +sialiagames.com.tw sian.cc siaoao.com sias-sha.com @@ -82083,7 +82511,6 @@ sibojin.com sibpt.com sibsnet.org sibuzyn.com -sicangge.com sicarrier.com sicc.cc sicent.com @@ -82118,6 +82545,7 @@ sifangbazhu.tech sifangclub.com sifanggroup.com sifangoa.com +sifangvideo.com sifary.com sifayun.com siff.com @@ -82175,8 +82603,11 @@ sikantech.com sikem.net sikiedu.com sikuwu.com +sikuyi5838.asia sikuyun.net silanggame.com +silasbuchanan.shop +sildyn.com sileadinc.com silenceper.com silexmicro.com @@ -82210,6 +82641,7 @@ silukex.com siluwu.com silvmark.store sim800.com +simaek.com simagic.com simaguo.com simanuo.com @@ -82304,9 +82736,11 @@ singbon.com singchy.com singdown.com singfosolar.com +singfun.com singgnetworkcdn.com singhead.com singlecool.com +singlegraindatabiz.com singmaan.com singoo.cc singpao.com @@ -82441,7 +82875,6 @@ sinopharm-fj.com sinopharm-fl.com sinopharm-gz.com sinopharm-henan.com -sinopharm-yz.com sinopharm.com sinopharmdbj.com sinopharmholding.com @@ -82473,7 +82906,6 @@ sinosuntop.com sinotau.com sinotechline.com sinotf.com -sinothaizone.com sinotide.com sinotn.com sinotone.net @@ -82513,6 +82945,7 @@ sintaytour.com sintien.com sintoacct.com sintu.com +sinture.com sinvofund.com sinvta.com sinyuan.com @@ -82541,6 +82974,7 @@ siqiangame.com siqiquan.org siqxmg4256.vip sir3.com +sir66.com siranbio.com sireda.com sirenyouxiang.com @@ -82552,12 +82986,12 @@ siscmag.com sisder.com sisen.com sisensing.com +sishui123.com sishuojixie.com sishuok.com sishuxuefu.com sisi-smu.org sisigad.com -sisiim.com sisp-china.com sissiok.com sisuts.com @@ -82607,6 +83041,7 @@ siyanhui.com siyetian.com siyi007.com siyrcw.com +siyuan.cc siyuan.ink siyuan.me siyuanedu.com @@ -82644,7 +83079,6 @@ sjdzp.com sjdzp.net sjebh.com sjetdz.com -sjez.com sjf029.com sjfcdn.com sjfh168.com @@ -82676,9 +83110,11 @@ sjlhlawyer.com sjlvyou.com sjm-zdh.com sjm.life +sjmao.net sjmdh.com sjmeigao.com sjmp3.com +sjmwsw.com sjono.com sjooo.com sjpif.net @@ -82716,6 +83152,7 @@ sjxtcw.com sjxydc.com sjxyit.com sjxysec.com +sjxyx.com sjxzc.com sjy-art.org sjy2.com @@ -82754,6 +83191,7 @@ sjzpco.org sjzqcrl.com sjzrbapp.com sjzrmyz.com +sjzslnyhy.com sjzswtz.com sjzszz.com sjztd.com @@ -82779,7 +83217,9 @@ skatehere.com skcto.com skd6.com skd62.com +skdj5.com skdlabs.com +ske.cc skeo.net sketchupbar.com sketchupbbs.com @@ -82792,9 +83232,9 @@ skimit.net skinjc.com skinme.cc skjcsc.com -skktec.com skl.net skland.com +sklbce.org skldoor.com sklinux.com skmgc.com @@ -82803,15 +83243,14 @@ skomart.com skongmx.com skp-beijing.com skpssz.com -skr003.cc skrskrskrskr.com sksdwl.com sksight.com skslfd.com skstravel.com +skswz.com sktcdn.com sktecfibre.com -sktqkf.com skuking.com skusoft.com skwfls.com @@ -82851,7 +83290,6 @@ skyheng.com skyislets.com skyleon.com skylerzhang.com -skym.asia skymoons.com skymoons.net skynan.com @@ -82968,7 +83406,6 @@ slwwedding.com slybjp.com slyld.com slyxmobi.com -slyz.net slzsxx.com sm-check.com sm-cq.com @@ -83085,7 +83522,6 @@ smgpt.com smgstar.com smgstv.com smgtech.net -smh.cc smhsw.com smhyplay.com smianao.com @@ -83111,6 +83547,7 @@ smlqcl.com smmc.com smmiki.com smo-clinplus.com +smo-software.com smoba.net smobird.cc smogfly.cloud @@ -83161,6 +83598,7 @@ smtsmt.com smtso.com smtsvs.com smttouch.com +smtukuzy.com smtul.com smtvip.com smtw.com @@ -83180,6 +83618,7 @@ smxs.com smxzls.com smyfinancial.com smyhvae.com +smynn.com smyx.net smyxxj.com smyz.net @@ -83188,8 +83627,10 @@ smzdmimg.com smzdwan.com smzhongran.com smzjy.cc +smzsffb.com smzy.com sn180.com +snack-show.com snai.edu snail.com snail007.com @@ -83225,6 +83666,7 @@ sndks.com sndnt.com sndo.com sndvc.com +sndzrg0.org sneac.com sneb3.com snedu.com @@ -83235,6 +83677,7 @@ snfox.com snfzsw.com sngct.com snh48.com +snhere.com snhrm.com snibe.com sniec.net @@ -83263,7 +83706,6 @@ snowballtech.com snowbeasts.com snowdream.tech snowflake.pink -snowjy.com snowkey.com snowlotusgroup.com snowyimall.com @@ -83291,7 +83733,6 @@ snupg.com snv1.com snxw.com snycloud.com -snylex.com snynas.com snyu.com snzfj.net @@ -83356,6 +83797,7 @@ sodion.net sodocloud.com sody123.com sofabiao.com +sofan.one sofang.com sofangche.com sofasofa.io @@ -83370,7 +83812,6 @@ soft50.com soft5566.com soft568.com soft6.com -soft711.com soft778.com soft8.net soft808.com @@ -83453,7 +83894,6 @@ sojiyin.com sojoline.com sojson.com sojump.com -sok100.com soke17.com soken-sz.com sokoban.ws @@ -83581,6 +84021,7 @@ sooauto.com soochowchem.com soocor.com sood6.com +sooele.com soofel.com soogf.com soogif.com @@ -83591,6 +84032,7 @@ soolinen.com soolou.net soolun.com soomal.com +soon.guru soonku.net soonv.com soonwill.com @@ -83625,7 +84067,6 @@ soqicrm.com soquano.com sorftime.com soripan.net -sorstek.com sorswitch.com sortdoor.com sos919.com @@ -83638,6 +84079,7 @@ sosoba.org sosobtc.com sosoled.com sosolight.com +sosomp.com sosonc.com sosonsk.com sosoo.net @@ -83713,12 +84155,12 @@ soundstay.com soupf.net soupin.com soupingguo.com -soupng.com soupu.com soupv.com souqian.com souqiantu.com sour-lemon.com +source.tutorabc.com source3g.com sourcecodebeat.com sourcecodecap.com @@ -83744,7 +84186,6 @@ southnews.cc southnews.net southseagy.com southsurvey.com -southteacher.com southyule.com soutiyun.com soutudi.so @@ -83773,7 +84214,6 @@ sowin.com sowotech.com sowu.com soxpai.com -soxsok.com soxyc.com soya-protein.com soyim.com @@ -83854,11 +84294,10 @@ speedaf.com speedcdns.com speedcdns.info speedcdns.org -speedifyvolcai.com -speedifyvolcaiv2.com speedmanager.net speednt.com speedpdf.com +speedsz.net speedws.com speedws.info speedws.org @@ -83866,7 +84305,6 @@ speedzonerc.com speiyou.com sperogenix.com spfbiotech.com -spfhi.com spforum.net spfosd.com spg-ls.com @@ -83901,7 +84339,9 @@ splmcn.com spmcn.com spnchinaren.com spochikj.com +spoience.com spointdesign.com +sporposten.today sport-syy.com sportman.cc sportnanoapi.com @@ -83932,7 +84372,6 @@ spsb114.com spsicloudport.com spsisctgroup.com spsisncl.com -spst2.com spsy.org sptcc.com sptccn.com @@ -83970,7 +84409,9 @@ sqis.com sqj888.com sqjk123.com sqjsxy.com +sqjt.com sqjtcy.com +sqjvx.org sqkb.com sqklrq.com sql110.com @@ -84065,12 +84506,12 @@ ssawhotels.com ssaya.win ssbbww.com ssbgzzs.com +ssbjf.com ssbjsy.com ssbx.me ssby.cc ssc-mcc.com sscanmou.com -sscct.com sscejia.com sscha.com sschengtou.com @@ -84093,6 +84534,7 @@ ssfetsz.org ssgedm.com ssgeek.com ssgsemi.com +ssgz.com sshr.net ssia.cc ssidc.net @@ -84106,6 +84548,7 @@ ssjj2.com ssjjss.com ssjjtt.com ssjlicai.com +ssjljk.com ssjytc.com ssjyxx.com sskc360.com @@ -84147,6 +84590,7 @@ ssports.com ssports.net ssptqt.com ssqgx.com +ssqtt.com ssqzj.com ssrcdn.com ssrcr.com @@ -84156,6 +84600,7 @@ sss.wiki sss348499.com sss437942.com sss495830.com +sss850697.com ssscdn.com sssch.net ssses.net @@ -84183,10 +84628,12 @@ ssycw.com ssydt.com ssyer.com ssyssf.com +ssyxlx.com ssyxmall.com ssyzx.net sszgit.com sszhg.com +sszjnc.com sszsj.cc st-jzx.com st-recovery.com @@ -84214,7 +84661,6 @@ standteam.net stanlyview.com staofchina.com stapharma.com -staplescn.com star-charge.com star-elink.com star-engine.com @@ -84239,7 +84685,6 @@ stardict.org stards.com stardust2000.com starduster.me -starfiread.com starfishcloud.com starfivetech.com stargame.com @@ -84258,7 +84703,6 @@ starrails.com starrevs.com starrockinvest.com starrtc.com -starryblu.com starrydyn.com starryfrp.com starrymed.com @@ -84302,6 +84746,7 @@ staticfile.net staticfile.org statickksmg.com statics.cc +statics.teams.cdn.office.net staticsdd.com staticsoe.com staticsoem.com @@ -84373,7 +84818,9 @@ steriguardmed.com stfile.com stg8.com stgiantfilms.com +stgowan.com sthforme.com +sthfsteel.com sthifi.com sthke.com sthospital.com @@ -84419,6 +84866,7 @@ store12.com storeapi.net storecorefulfillment.download.prss.microsoft.com storeedge.microsoft.com +storeedgefd.dsx.mp.microsoft.com storkapp.me stormorai.com story520.com @@ -84429,14 +84877,15 @@ stourweb.com stourweb.net stoyard.com stpos.net +stqiyuan.com stql.com +stql.org str-mo.com strategy-sight.com stray-soul.com streamax.com streamaxtech.com streamcomputing.com -streamlake.com streamlakeapi.com streffy.com strinova.com @@ -84457,6 +84906,7 @@ sttcq.com sttry.com stu-lab.com stu-works.com +stu51.com stubbornhuang.com studa.net studentboss.com @@ -84475,6 +84925,7 @@ studyingtours.com studypay.com studyquicks.com studytime.xin +studyuser.com studyvip.com stuhome.net stuhui.com @@ -84568,7 +85019,6 @@ sudu-xu9b.com sudu-y94k.com sudu123.net sududa.com -sudun.com sudundns.com sudupower.net sudusite.com @@ -84577,7 +85027,6 @@ suemor.com sueon.com sufachina.com sufangxu.com -sufe.me sufeinet.com sufoma.com sufont.com @@ -84600,7 +85049,7 @@ sui.me suibao-jiaozhu.com suibao.com suibiji.com -suifengy.com +suibo.org suiji123.com suijinetworks.com suijunlaowu.com @@ -84611,7 +85060,6 @@ suiningwang.com suiniyi.com suiqiao.com suirui.com -suishendai.vip suishenyun.net suishouji.com suishouxie.com @@ -84626,6 +85074,7 @@ suixin8.com suixingpay.com suixinzulin.com suixkan.com +suiyichong.com suiyifa.com suiyiju.com suiyuanjian.com @@ -84808,7 +85257,6 @@ sunnyplas.com sunnypure.com sunnyqi.com sunnysemi.com -sunnytextile.com sunnyxx.com sunocean.life sunofbeaches.com @@ -84854,7 +85302,6 @@ suntech-power.com suntechospital.com suntgj.com suntimehousehold.com -suntl.com suntop168.com suntray.com suntrayoa.com @@ -84864,6 +85311,7 @@ sunup3d.com sunupcg.com sunus-china.com sunvim.com +sunvio.com sunwardcap.com sunwatt.com sunwaygas.com @@ -84938,7 +85386,6 @@ supercarrier8.com supercrm.com superdns.org superfix.com -superguancai.com superhcloud.com superic.com superiorscope.com @@ -84964,6 +85411,7 @@ superstar-med.com superstarkennel.com superstars.vip supertime-malting.com +supertracker.net supertrw.com supervisionus.com supervote.cc @@ -84990,6 +85438,7 @@ supplierlist.com supplygw.com supplywater.com support-cn.samsung.com +support.amd.com supreme-oe.com supwisdom.com supwk.com @@ -84999,7 +85448,6 @@ suqing.com suqishi.com suqnn.com suqun-group.com -suredeliverses.com surely.cool surerp.com surface.download.prss.microsoft.com @@ -85035,12 +85483,9 @@ susongbbs.com susoul.com sustcra.com sustech.online -susudesu.com susudm.com susun.cc susungroup.com -sut56.com -sut999.vip sutanapp.com suteidc.com suteshop.com @@ -85083,12 +85528,12 @@ suzhoubeili.com suzhoubond.com suzhoucitymarathon.com suzhouexpo.com +suzhoufashion.com suzhouhengtai.com suzhouhui.com suzhouleasing.com suzhoulinsen.com suzhousj.com -suzhoutianqi114.com suzhouyabao.com suzip.com suzport.com @@ -85164,6 +85609,7 @@ swiftfintech.com swifthumb.com swiftjava.com swiftlet.net +swijoy.com swip.group swirebev.com swirecocacola.com @@ -85216,12 +85662,14 @@ sx-moen.com sx-seafood.com sx1211.com sx189.com +sx267.com sx311.cc sxaec.com sxafz.com sxalu.com sxand.com sxase.com +sxasuykzx2sq.icu sxatcm.com sxbada.com sxbang.net @@ -85229,6 +85677,7 @@ sxbawy.com sxbctv.com sxbdf.com sxbest.com +sxbjedu.com sxbpa.com sxbuszp.com sxbychem.com @@ -85243,6 +85692,8 @@ sxclassiclighting.com sxcm.net sxcntv.com sxcoal.com +sxcp.com +sxctf.com sxcxgf.com sxcxldjy.com sxcyts.com @@ -85276,6 +85727,7 @@ sxhctv.com sxhhwl.com sxhhyy.com sxhimalayanqd.com +sxhiway.com sxhjrc.com sxhkxy.com sxhlcc.com @@ -85329,7 +85781,6 @@ sxmhgas.com sxmty.com sxmxwh.com sxmyh.com -sxnb66.xyz sxncb.com sxnxs.com sxnxxny.com @@ -85375,7 +85826,6 @@ sxsjgy.com sxsjzyxh.com sxslhg.com sxslnews.com -sxsltlyy.com sxsme.org sxsmtgyxh.com sxsoft.com @@ -85405,6 +85855,7 @@ sxwbs.com sxwetalent.com sxwlyhzp.com sxworker.com +sxwpyx.com sxwq.com sxwstcm.com sxwtdyd.com @@ -85428,7 +85879,6 @@ sxygsj.com sxyj.net sxyqgs.asia sxyyc.net -sxyygh.com sxzhaobiao.com sxzhongfei.com sxzhyy.com @@ -85533,6 +85983,7 @@ sylangyue.xyz sylaryun.com sylincom.com sylixos.com +sylm2022.com sylnyx.com symama.com symarathon.com @@ -85591,6 +86042,7 @@ sysceo.net syscxp.com sysdyy120.com sysengi.com +syshell.com syshospital.com syshospital.org syshosts.net @@ -85625,7 +86077,6 @@ sytuku.com syuan.com syuan.net syue.com -sywdsjc.com sywg.com sywgy.com sywtqc.com @@ -85634,6 +86085,7 @@ syxb.com syxidao.com syxjjsw.com syxlgame.com +syxt.cc syxw.xyz syxwang.com syxwnet.com @@ -85650,13 +86102,13 @@ syyy99.com syyyd.com syyyj.com syyyking.com +syyzhpc.com syzdhyb.com syzjjt.com syzlzz.com syzoukan.com syzpw.com syzsgroup.com -syzsks.com sz-3a.com sz-acuvu.com sz-amc.com @@ -85687,7 +86139,6 @@ sz-hengdeyuan.com sz-hiragawa.com sz-huashi.com sz-huayuan.com -sz-huilian.com sz-hyauto.com sz-hzt.com sz-iso.com @@ -85725,7 +86176,6 @@ sz-ytq.com sz-zhenghe.com sz002329.com sz0429.com -sz120.com sz121.com sz1905.com sz1978.com @@ -85777,8 +86227,8 @@ szaudio.net szaupd.com szautism.com szbaba.com +szbaicao.com szbaike.com -szbaisc.com szbaleng.com szbaoly.com szbaoming.com @@ -85897,7 +86347,6 @@ szesens.com szetop.com szeua.org szeverich.com -szeyoung.com szfa.com szfachina.org szfangzhouhd.com @@ -85930,6 +86379,7 @@ szgays.org szgcyy.com szggzy.com szghedu.com +szghgw.com szgjtc.com szgky.com szgla.com @@ -86066,6 +86516,7 @@ szjxcft-tencentclb.work szjxgroup.com szjxj.com szjyos.com +szjys.net szjys1888.com szjytx.com szjyxtech.com @@ -86080,7 +86531,6 @@ szkinks.com szkjcn.com szkjjs.com szkjxh.com -szkke.com szknet.com szknk.net szknys.com @@ -86097,7 +86547,6 @@ szlangwei.com szlanyou.com szlawyers.com szlc9.com -szlcmb.com szlcsc.com szlcwy.com szldcc.com @@ -86235,7 +86684,6 @@ szrfstar.com szrgsh.com szrhg.com szrj.net -szrjyx.com szrlaw.net szrrjc.com szrsks.com @@ -86248,6 +86696,7 @@ szrzxh.com szs189.com szsaibao.com szsailong.com +szsaiwei.com szsamr.com szsandt.com szsangbo.com @@ -86302,6 +86751,7 @@ szsti.org szstndzsw.com szstyle.cc szsuanli.com +szsunlaser.com szsunwin.com szsupvan.com szswgcjc.com @@ -86321,6 +86771,7 @@ sztaijier.com sztalent.org sztanzo.com sztara.com +sztbjs.com sztc.com sztcg.com sztd123.com @@ -86343,7 +86794,6 @@ sztmjz.com sztncm.com sztongwang.com sztopbrand.com -sztopten.com sztower.com sztoys.com sztqjf.com @@ -86351,6 +86801,7 @@ sztreeent.com sztspi.com sztxcpa.com sztxsz.com +sztxw.com szty56.com sztz.org sztzzs.com @@ -86468,7 +86919,6 @@ szysmpay.com szystea.com szysxx.com szyt-hosp.com -szytop.com szyuda88.com szyundingschool.com szyuxin.com @@ -86578,6 +87028,8 @@ taaas.org taagoo.com tabalt.net tabbitbrowser.com +tabbypro.com +tabbywork.com tableauxmly.com tabuzhe.com tabxexplorer.com @@ -86645,6 +87097,7 @@ taihuboiler.com taihucn.com taihuoniao.com taihutour.com +taihuwang.com taihuwater.com taihuxue.com taihuyuan.com @@ -86678,6 +87131,7 @@ tailong.com taimei.com taimi100.com taimls.com +taininge.online taiorient.com taiott.com taipingyangshuiwu.com @@ -86710,6 +87164,7 @@ taixirobot.com taixubio.com taixuguoji.com taiyangd.com +taiyanghttp.com taiyechem.com taiyin117.com taiyiplus.com @@ -86736,6 +87191,7 @@ talbrain.com talebase.com talegenes.com talentable.com +talentlin.com talents-tech.com talentsmag.com talentspotgroup.com @@ -86758,10 +87214,13 @@ talkyun.com tallgu.com talmdhome.com taluo.com +taluo5.com taluoji.com talzjsj.com tamaegis.com tamarace.com +tamayaki.com +tamensay.com tamersunion.net tamigos.com tamigroup.com @@ -86840,7 +87299,6 @@ tanlong.org tanluxia.com tanma.tech tanmer.com -tannel.asia tanpaifang.com tanpoqiuer.com tanshudata.com @@ -86848,10 +87306,8 @@ tansiling.com tansoole.com tantaly.com tantanapp.com -tantanscience.com tantu.com tantu.info -tantu668.com tantuw.com tanv.com tanwan.com @@ -86871,9 +87327,9 @@ tao-jiujiu.com tao-star.com tao-studio.net tao-wu.com -tao.co tao008.com tao123.com +tao3.cc tao33.com tao66.com tao800.com @@ -86901,7 +87357,6 @@ taocdn.com taoche.com taocheche.com taoci.com -taoci10.com taoci163.com taocibao.com taocijiaju.com @@ -87000,7 +87455,6 @@ taoxiangyoushu.com taoxiaolu.com taoxie.com taoxuemiao.com -taoyaohh.site taoyitu.com taoyizhu.com taoyougou.com @@ -87025,7 +87479,6 @@ tapdb.com tapdb.net tapimg.com tapjoytech.com -tapnow.media tapotiexie.com tappile.com tapque.com @@ -87103,7 +87556,6 @@ tbadc.com tbadesign.org tbankw.com tbapp.com -tbbbk.com tbcache.com tbh5.com tbhcc.com @@ -87127,9 +87579,9 @@ tbs321.com tbsandbox.com tbsite.net tbt168.com -tbtk.asia tbtopc.com tburl.in +tbuser.com tbxsw.com tbyfsoft.com tc-21.com @@ -87166,7 +87618,6 @@ tcdnlivebak2.com tcdnlp.com tcdnos.com tcdnos.net -tcdns31.com tcdntip.com tcdnv3.com tcdnvod.com @@ -87176,10 +87627,13 @@ tcdnvp.com tcecps.org tced-transsion.com tcedshare.com +tceic.com +tcenn.com tceratronix.com tcfhty.com tcfmglobal.com tcgcardgame.com +tcgdxyb.xyz tcggkj.com tcgke.com tcgsw.com @@ -87284,6 +87738,7 @@ td2cn.com td300321.com td776.com td98.com +tdances.com tdasz.com tdatamaster.com tdataspace.com @@ -87400,6 +87855,7 @@ teambition.net teambitionapis.com teamlogs.com teamminus.com +teamotto.net teamshub.com teamtop.com teamtopgame.com @@ -87421,6 +87877,7 @@ tech-sonic.net tech002.com tech1024.com tech110.net +tech2ipo.com tech2real.com tech4joy.com techan.com @@ -87429,6 +87886,7 @@ techbeat.net techbrood.com techdow.com techfine.net +techgastronomy.com techgogogo.com techigh.net techingrid.net @@ -87474,6 +87932,7 @@ tedx.net tedy.cc teejia.com teeqee.com +tefact.com tefl-china.net tefscloud.com tefscloud.net @@ -87482,7 +87941,6 @@ tegongji.com tegoushe.com tegvzpvz.com tehang.com -tehlin-bj.com tehub.com tehuituan.com teilei.com @@ -87498,12 +87956,17 @@ telecomhb.com telecomhr.com telecomjs.com telefen.com +telegerlam.cc +telegramcn.co telegramtoke.com +telegroiam.cc telehr.com teleinfoo.com telekoml.cfd teleland.net +telemgrasm.cc teleows.com +telergaemoam.cc televivi.com telfri.net teligen-cloud.com @@ -87558,7 +88021,6 @@ tencentapis.com tencentapp.com tencentapps.com tencentbh.com -tencentbuddy.com tencentbyod.com tencentcc.com tencentcdb.com @@ -87682,8 +88144,6 @@ tencentdevices.com tencentdigitalassistant.com tencentdmp.com tencentdms.com -tencentdns.net -tencentedge.com tencentedi.com tencentehs.com tencenteiam.com @@ -87780,10 +88240,10 @@ tendfo.com tendis.net tendrones.com tendyron.com -tenfu.com tengamy.com tenganxinxi.com tengbai-it.com +tengbenyueji.com tengbo.cc tengchangjiancai.com tengchu.com @@ -87872,14 +88332,12 @@ tequanma.com terabuy.com terapark.com terapines.com -terebratulid.com terencemusic.com teridge.com terminal.icu terminus.io terose.com terra-master.com -terrabbs.ink terran.tech terransforce.com terratribes.com @@ -87887,7 +88345,6 @@ terrypacking.com terrytec.com teruide.net tese5.com -tesegu.com tesery.com tesexiu.com teshenqi.com @@ -87971,6 +88428,7 @@ tfsb.net tfsino.com tfsmy.com tftplay.com +tfvisa.com tfxqrmyy.com tfyum.net tfzikao.com @@ -87980,7 +88438,6 @@ tg-vision.net tg0123.com tg1234.com tg138.com -tgalileo.com tgametalent.com tgbus.com tgcid.org @@ -87989,13 +88446,11 @@ tgcook.com tgcyber.com tgect.com tgeosmart.com -tggfl.com tgjh.com tgking.net tgkjjg.com tgldfm.com tgljw.com -tglsinsure.com tglxh.com tgnet.com tgo-ai.com @@ -88017,6 +88472,7 @@ th-tencentclb.work th-water.net th.bing.com th21333.com +th38.com th99.com thaicn.com thailycare.com @@ -88058,6 +88514,7 @@ thecodeway.com thedatasys.com thederma.com theduapp.com +thedutchman.org thefastcdns.com thefastfile.com thefastimg.com @@ -88098,13 +88555,13 @@ thenextravelmarket.com theoborn.com theoreticalw.com theorychina.org +thepeak.com.my thepoemforyou.com thepoizon.ru thepredictivemodel.com thepresidentialhotel.com thepuli.com therasaganga.com -theringlive.com theseshepherd.com thesetech.com thesmartmelon.com @@ -88143,7 +88600,6 @@ thinkeffective-usa.com thinkeridea.com thinkerride.com thinkerx.com -thinkgoall.com thinkindrupal.com thinkive.com thinkjs.org @@ -88159,8 +88615,8 @@ thinmoo.com thinvent.com this6.com thishealthsummit.com +thismomentinamerica.org thisnew.com -thispx.com thisshop.com thiztech.com thjb.net @@ -88169,6 +88625,7 @@ thjjhs.com thjunshi.com thkconn.com thkill.com +thm3u8.com thmall.com thmins.com thmnet.com @@ -88219,6 +88676,7 @@ thwpmanage.com thxddb.com thxdx.com thxflt.com +thxnr.com thxtg.org thxy.org thxyy.com @@ -88275,6 +88733,7 @@ tianfeng.cc tianfucaijing.com tianfugroup.com tianfuhui.xin +tianfupic.com tianfusoftwarepark.com tiangang.com tiangen.com @@ -88376,10 +88835,10 @@ tianrow.com tianruihr.com tianrunshunteng.com tianruo.net -tianruo.xyz tianruoyun.com tiansdl.com tiansenjituan.com +tianshanxt.com tianshengdiyi.com tianshenyule.com tianshiyiyuan.com @@ -88404,7 +88863,6 @@ tianti.com tiantianbannixue.com tiantiancaige.com tiantiancaipu.com -tiantianditu.com tiantianfm.com tiantianfunds.com tiantianleshuiguo.com @@ -88426,6 +88884,7 @@ tianxiajiaoyi.com tianxiamaimai.com tianxianmao.com tianxiaquanchengapp.com +tianxiawangxiao.com tianxiawushi.com tianxiawuzei.org tianxiaxiao.net @@ -88434,7 +88893,6 @@ tianxiayouxi.com tianxiayouyue.com tianxin100.vip tianxing.com -tianxingfengshui.com tianxingjianyiliao.com tianxinkeji.com tianya.com @@ -88590,13 +89048,14 @@ tijian123.com tijianbao.com tijianshangmen.com tijianzhuanjia.com +tijox.cc tijox.com tijox.hk tijox.net +tijox.org tik-tokapi.com tik2019.com tikersport.com -tikmob.com tiktoknewaccount.com tiktokrow-cdn.com tikv.org @@ -88607,8 +89066,6 @@ timanetworks.com timbrd.com time-weekly.com time-year.com -time163.com -timecha.com timecloud.us timecoo.com timedg.com @@ -88648,7 +89105,6 @@ timjx.com timmerse.com timzuu.com tinavi.com -tineco.com tinengwang.com tinetcloud.com tinfinite.com @@ -88672,6 +89128,7 @@ tingmei.com tingmimi.net tingmubeef.com tingniukeji.com +tingood.com tingpiting.com tingroom.com tingshubao.net @@ -88695,12 +89152,12 @@ tinkerpatch.com tinktek.net tinman798.net tinning-automation.com -tinnitus-light.org tinsecret.com tinstu.com tinwod.com tinychen.com tinycms.xyz +tinyems.com tinyfeng.com tinyflare.com tinygroup.org @@ -88756,7 +89213,6 @@ tiyep.com tiyucdn.com tiyufeng.com tiyuguoji.com -tiyuhu.com tiyule.com tiyusaishi.com tiyushe.com @@ -88819,12 +89275,14 @@ tjgtgd.com tjhgmc.com tjhtcpvc.com tjhyzyxy.com +tji.io tjian.com tjinsuo.com tjj.com tjjfrh.com tjjhqyy.com tjjiaotong.com +tjjinglang.com tjjt360.com tjjtjt.net tjjwt.com @@ -88860,11 +89318,13 @@ tjskqyy.com tjsptech.com tjst.net tjstats.com +tjsylhh.com tjtele.com tjtjshengtu.com tjtongrentang.com tjtrust.com tjtvc.com +tjubbs.net tjumc.com tjupdi.com tjuzj.com @@ -88874,17 +89334,18 @@ tjwch.org tjwenjie.com tjwf.com tjwj88.com -tjwjh888.com tjwmschool.net tjxinyu.com tjxiqi.com tjxxcl.com tjxz.cc +tjydyt.com tjyun.com tjzb.com tjzcsj.com tjzfcg.com tjzhongyiyao.com +tjzhyj.com tjznjt.com tjzxyy.com tjzyec.com @@ -89034,16 +89495,17 @@ tltesoft.com tltuan.net tltzg.com tlu5.com -tluyou.com +tlwanjishan.com tlwk.net tlwok.com tlxxw.com +tly.cloud tlyz.net tlzey.com tlzhjt.com tlzyxy.com tm-auto.com -tm022.com +tm0755.com tm1949.com tm401k.com tm51.com @@ -89066,11 +89528,11 @@ tmcdn.net tmctool.com tmecd.com tmeiju.com -tmeoa.com tmfcloud.com tmgdb.com tmhong.com tmhtour.com +tmhttc.com tmianyang.com tmigrate.com tmirob.com @@ -89086,6 +89548,7 @@ tmqd.me tmqmqj.com tmrcw.com tmrenergy.com +tms-in.org tms8.com tmscnz.com tmsemi.com @@ -89104,7 +89567,6 @@ tmtsp.com tmuaih.com tmusoft.com tmuyun.com -tmwanba.com tmwcn.com tmwxxcx.com tmwzs.com @@ -89118,6 +89580,7 @@ tnblog.net tnblt.com tnbz.com tnccdn.com +tndsjka.com tnebula.net tnedu.com tnettms.com @@ -89129,6 +89592,7 @@ tnsou.com tnzuwu.com to-future.net to2025.com +to4f.com to8to.com to999.com toast.pub @@ -89157,6 +89621,7 @@ todayios.com todayisp.net todaymedtech.com todaynic.com +todaypublish.com todayyj.com todesk.com todgo.com @@ -89175,6 +89640,7 @@ toec-iot.com toec.com toecsec.com toewin.com +tofeat.com tofengmi.com tofflon.com tofine.com @@ -89187,6 +89653,7 @@ tohosting.net tohours.com toidea.com tokcoder.com +tokeimall080.com token-ad.com token-sensor.com tokenglish.com @@ -89211,7 +89678,6 @@ tompda.com tomson-group.com tomson-riviera.com tomwx.net -ton51.com tone-sun.com tonebj.com tonechemical.com @@ -89226,6 +89692,7 @@ tongbb.net tongbu.com tongbupan.com tongbusj.com +tongchaba.com tongcheng.cc tongchengbx.com tongchengchaku.com @@ -89261,7 +89728,6 @@ tongjiniao.com tongkask.com tongleer.com tonglei.com -tongli.net tonglian.com tongliangrc.com tongliaowang.com @@ -89325,7 +89791,6 @@ tongyicm.com tongyidrying.com tongyiplastic.com tongyonggroup.com -tongyongpe.com tongyongpe.net tongyongts.com tongyongzs.com @@ -89365,6 +89830,7 @@ toodudu.com tool.la tool.lu tool56.com +tool77.com tooleemesse.com toolgg.com toolkk.com @@ -89397,6 +89863,7 @@ top263.net top2fun.com top4xlc.com top6000.com +topbester.com topbiol.com topbiz360.com topbook.cc @@ -89418,6 +89885,7 @@ topeastic.com topeditsci.com topeet.com topeetboard.com +topexhib.net topfisc.com topflames.com topfo.com @@ -89430,8 +89898,10 @@ tophant.com tophold.com tophr.net tophub.app +tophub.fun topideal.com topit.pro +topit5.com topjoy.com topjoycloud.com topkhealth.com @@ -89480,7 +89950,6 @@ toptubeco.com topuc.com topunix.com topv1.com -topvee.com topwalk.com topway.org topwaysoft.com @@ -89498,6 +89967,7 @@ topzj.com torch.plus torcstark.com toromotor.com +torovo.com torphan.com torrealcielo.com toscdn.com @@ -89510,6 +89980,7 @@ tosohbioscience.net tosonet.com tosound.com tospur.com +tosstar5117.com tosuai.com tosunk.com totainfo.com @@ -89533,7 +90004,6 @@ touchat.online touchealth.com touchelf.com touchev.com -touchgal.ink touchjoin.com touchjoint.com touchmark.art @@ -89615,6 +90085,7 @@ touwho.com touxiang8.com touxiang88.com touying.com +touzhijia.com touzi.com touzid.com touzime.com @@ -89653,6 +90124,7 @@ tpe-tencentclb.cloud tpe-tencentclb.com tpe-tencentclb.net tpe-tencentclb.work +tpfangchan.com tphdled.com tpimg.xyz tpjwww.com @@ -89665,7 +90137,6 @@ tpoxiaozhan.com tpqxb.com tprtc.com tpsea.com -tpsem.com tpsge.com tpshleasing.com tpsns.com @@ -89755,6 +90226,7 @@ tranplanet.com trans-china.com trans4e.com transcendchina.com +transcenta.com transduck.com transer-cn.com transfarchem.com @@ -89784,7 +90256,6 @@ tratao.com travel-x.cc travel6.co.uk travelgo.com -travelincaucasus.com traveling-exhibitions.com travellaureate.com travellingwithhotel.com @@ -89793,7 +90264,6 @@ travelsky.com travelsky.net travelwuhan.com trawind.com -tre528.com treatgut.com treazr.store treehousesub.com @@ -89833,9 +90303,11 @@ triowin.com trip169.com trip8080.com tripbaba.com +tripbe.com triphr.com tripleuuu.com triplexservice.com +tripnearby.com tripodeck.com tripolers.com tripsanxia.net @@ -89848,6 +90320,7 @@ tristarinc.com triton-games.com tritoninfo.net trizenai.com +trizinfo.tech trizlaser.com trizmed.com trjcn.com @@ -89912,6 +90385,7 @@ trusple.com trust-mro.com trust-one.com trust400.com +trusta-lawyer.com trustasia.com trustasia.net trustcn.com @@ -89966,7 +90440,6 @@ tsa-page3.com tsa-page4.com tsa-page5.com tsa-page6.com -tsbear.com tsbjschool.com tsbtv.tv tschina.com @@ -89982,7 +90455,6 @@ tses.net tsflc.com tsfqw.com tsg-online.net -tsgaosu.com tsggx.com tsgks.com tsgyun.com @@ -90000,7 +90472,6 @@ tsing-jn.com tsingaero.com tsinghua-getinfo.com tsinghua-sz.org -tsinghua-tj.org tsinghua-vc.com tsinghua-wx.org tsinghuaic.com @@ -90016,7 +90487,6 @@ tsingoofoods.com tsingpost.com tsingshang.com tsingtek.com -tsingtengms.com tsingtoo.com tsingtuo.com tsingyangroup.com @@ -90026,7 +90496,6 @@ tsjtsy.com tsk-fixture.com tslib.net tsljzs.com -tslnqfzxx.com tslongtai.com tslsmart.com tslt.tech @@ -90056,7 +90525,6 @@ tssyedu.com tssyjt.com tstvxmt.com tsubakichina.com -tsuiyuan.com tsukistar.fun tsunbull.com tswjs.net @@ -90091,6 +90559,7 @@ ttbbss.com ttbyte.com ttbyte.net ttcad.com +ttcl.cc ttdailynews.com ttdnsa.com ttdown.com @@ -90160,16 +90629,15 @@ ttsz8.com tttang.com tttarot.com tttcykt.com -tttdh.com tttelephone.com ttthing.com tttiti.com +tttkkt.com ttttt22222.com tttuangou.net tttxf.com tttz.com ttunion.com -ttvod.net ttwanjia.com ttwebview.com ttwifi.net @@ -90177,6 +90645,7 @@ ttwx.com ttwxh.com ttxn.com ttxs123.net +ttxs7.com ttxsapp.com ttxuanpai.com ttxx8888.com @@ -90190,6 +90659,7 @@ ttyongche.com ttyqm.com ttysq.com ttyuyin.com +ttyy800.vip ttyyuuoo.com ttz.com ttzcw.com @@ -90197,6 +90667,7 @@ ttzubao.com ttzyw.com tu54o7863tbf6.com tu8.cc +tu93.biz tu960.com tuan800.com tuan800.net @@ -90243,7 +90714,6 @@ tubie.art tuboshu.com tuboshuxinxi.xyz tubutu.com -tucenb.com tuchong.com tuchong.net tuchuangs.com @@ -90262,6 +90732,7 @@ tudu.com tudu.im tuer.me tuer123.com +tuf3a353.com tuganjue.com tugemedical.com tugou.com @@ -90295,6 +90766,7 @@ tuifeiapi.com tuifish.com tuiguang91.com tuiguangjia.com +tuijiantong.com tuijianxin.com tuijie.cc tuikemima.com @@ -90462,6 +90934,7 @@ tusuguanjiage.com tusujiu.com tutechanhb.com tutengcloud.com +tutengdai.com tutuapp.com tutucloud.com tutudati.com @@ -90482,7 +90955,6 @@ tuxiangyan.com tuxiaobei.com tuxing.art tuxing2010.com -tuxingis.com tuxingren.com tuxiu.com tuxun.fun @@ -90510,7 +90982,6 @@ tuzhizhijia.com tuzhongit.com tuzi123.com tuzi8.com -tuzigames.com tuziip.com tv002.com tv189.com @@ -90527,13 +90998,13 @@ tventry.com tvfanqie.com tvfuwu.com tvguo.tv -tvhcoin.ai tvhf.com tvhuan.com tvjianshen.com tvkuai.com tvmao.com tvmcloud.com +tvmining.com tvoao.com tvodapi.com tvodapibk.com @@ -90548,7 +91019,7 @@ tw-joly.com tw-yun.com tw2sm.com twanxi.com -twb520.com +twatchesmall.com twbuild.org twcczhu.com twd2.me @@ -90574,8 +91045,8 @@ twszs.com twtime.vip twtstudio.com twty.vip +twwtn.com twyuxin.com -twyxh.com twyxi.com twzilla.com twzui6.com @@ -90634,7 +91105,6 @@ txjhqh.com txjscl.com txjsjgs888.com txjy689.com -txkjaisa.asia txlctong.com txleshare.com txlivecdn.com @@ -90694,9 +91164,7 @@ txzuranji.com ty-archdesign.com ty-group.net ty-im.com -ty-job.com ty-magnet.com -ty-space.com ty-tyre.com ty-xxl.com ty.ink @@ -90735,7 +91203,6 @@ tyhjzx.com tyi365.com tyihome.com tyjd.cc -tyjdj.org tyjnkj.com tyjsq.com tykd.com @@ -90745,6 +91212,7 @@ tym001.com tymcdn.com tymotor.cc tyn.cc +tynlwx.com tynxy.com tyorient.com tyouai.com @@ -90759,6 +91227,7 @@ typora.net typrotech.com typstify.com tyqian.com +tyqxzx.com tyrantg.com tyrbl.com tyrbw.com @@ -90767,7 +91236,6 @@ tysih.com tysj365.com tyst.cc tyszy.com -tyt.net tytgigty.com tytlj.com tytuyoo.com @@ -90786,7 +91254,6 @@ tywxw.la tyxcdn.com tyxcdn.net tyy6.com -tyycsm.com tyymt.com tyzh.com tyzhjx.com @@ -90808,6 +91275,7 @@ tz777666.com tz8733.com tz887.com tz8966.com +tzada.com tzbank.com tzbank.net tzbao.com @@ -90845,7 +91313,6 @@ tzqytv.com tzrc.com tzres.com tzrl.com -tzrsks.com tzsfhxx.com tzshipping.net tzsnw.com @@ -90872,14 +91339,12 @@ tzyun.com tzyy-sh.com tzyyao.com tzyyjt.com -tzyzkj.com tzzhkj.com tzzhtc.com tzzls.com tzzp.com tzzszb.com tzzx.net -tzzxrmyy.com u-camera.com u-carloan.com u-cdn.net @@ -90908,6 +91373,7 @@ u17i.com u17t.com u21a.com u22e.com +u235.net u2j2ha.com u2sz.com u3dc.com @@ -90933,13 +91399,13 @@ u8e.com u8see.com u8sy.com u8yx.com -u99tt.com u9baoku.xyz u9h.com u9time.com u9u8.com u9u9.com u9wan.com +uabkrsj.xyz uahh.site uancf.com uandi-wireless.com @@ -91066,17 +91532,20 @@ ucuuc.com ucw.pub ucweb.com ucxsw.com +ucying.com uczzd.com uczzd.net udache.com udalogistic.com udamall.com +udangjia.com udasauto.com udashi.com udbac.com udcgroup.com udcn.com uddtrip.com +udecig.com udelivrs.com udeskcs.com udeskglobal.com @@ -91109,6 +91578,7 @@ uelike.com uemo.net ueno-china.com uenu.com +ueoqex.help ueren.com uestcedu.com uestcliuxue.com @@ -91128,8 +91598,10 @@ ufhosted.com ufida-lcwy.com ufidaoa.com ufileos.com +ufirefly.com ufizl.com uflowx.com +ufo.club ufo110.net ufoer.com ufojoy.com @@ -91147,19 +91619,18 @@ ugc-up-dom.net ugdesk.com ugdocker.link ugdtimg.com -ugediao.com uggame.com uggd.com ugirls.tv ugmars.com ugmjd.com -ugnas.cloud ugnas.com ugnx.net ugo-china.com ugojp.com ugong.com ugoshop.com +ugostar.com ugreen.cloud ugreengroup.com ugshare-img.com @@ -91168,6 +91639,7 @@ ugslb.info ugslb.net ugslb2.net ugsnx.com +ugubl.net ugurl.cc ugxsd.com uhabo.com @@ -91191,6 +91663,7 @@ ui100day.com ui63.com uibep.com uibhealthcare.com +uibmm.com uicats.com uicmall.com uicom.net @@ -91254,13 +91727,13 @@ ukoo.net ukosgolfcart.com ukpass.org ukpathway.com -ukqu.com ukrainevisacenter.com uku6.com ukubang.com ukui.org ukusk12.com ukvisacenterd.com +ukworldsale.com ulab360.com ulamps.com ulanzou.com @@ -91283,7 +91756,7 @@ ulikepic.com ulikestatic.com ulinix.com ulinix.tv -ulongemg.com +ulinkcollege.com ulpay.com ultracachenode.com ultraeda.com @@ -91345,7 +91818,6 @@ unachina.org unaming.info unaming.net unbank.info -unbbs.net unccr.com uncfa.org uncitys.com @@ -91359,17 +91831,18 @@ unclenoway.net unclenowayapi.com uncletalk.com unclicks.com +uncoverman.com under-5.shop underfill.cc uneed.com -uneedx.com unfish.net ungifts.com uni-cent.com uni-perfect.com uni-ubi.com -uni4006.net +unibeauty.net unibizp.com +unicde.com unicloud.com unicloudgov.com unicloudsrv.com @@ -91385,7 +91858,6 @@ unicompayment.org unicomtest.com unicon-hibar.com unietec.net -unifiedbus.com unifl-networks.com uniflows.com unifound.net @@ -91462,6 +91934,7 @@ unitree.work unittec.com unitweld.com unitymanual.com +unityonehold.com univ-bio.com university-hr.com uniview.com @@ -91477,6 +91950,7 @@ unlcn.com unlgroup.com unlimax.com unlimithealth.com +unlitui.com unn114.com unncahs.net unnnnn.com @@ -91489,6 +91963,7 @@ unsedu.com unsemi.com.tw unshan.com unsuv.com +unvmax.com unwtonews.com unyx.com unzg.com @@ -91504,6 +91979,7 @@ uoko.com uokon.com uomg.com uomo.cc +uonglong.store uonline-sh.com uonline-sh.net uono4521.com @@ -91538,6 +92014,7 @@ upantool.com upashance.com upbiao.com upbz.net +upc-cn.com upcave.com upcd.org upcdn.net @@ -91545,10 +92022,11 @@ upchina.com upchinapro.com upchinaproduct.com upd.kaspersky.com +update1.cyou +update2.cyou update8.com updeals.com updf.com -updownstream.xyz updrv.com upe.net upecp.com @@ -91569,7 +92047,6 @@ upkuajing.com uplookedu.com uplooking.com upluck.cc -upma.site upnono.com upowerchain.com uppershop.hk @@ -91595,7 +92072,6 @@ upvixusa.com upvr.net upwater.net upx8.com -upxuan.com upyun.com upzxt.com upzxt.net @@ -91649,6 +92125,7 @@ urtrust.com urumqi-air.com urumqimarathon.com urumqimtr.com +us-ex.com us-qianzheng.com us0.me usa-gam.com @@ -91682,6 +92159,7 @@ useaudio.com usecubes.com uselesses.com usensejn.com +userbp.com userhostting.com userresearch.net useryun.net @@ -91712,6 +92190,7 @@ usoi.net usonetrip.com uspard.com usqiaobao.com +usst.store ustack.com ustalk.com ustarl.com @@ -91719,7 +92198,6 @@ ustbtc.com ustc.edu ustcers.com ustui.com -usunhome.com usuredata.com usus.ltd usuuu.com @@ -91745,6 +92223,7 @@ utgd.net utiao.com utofairy.com utogame.com +utom.design utoper.com utopiafar.com utoppromo.com @@ -91813,6 +92292,7 @@ uusky.com uusoo.net uustory.com uustv.com +uutils.com uutop.com uutrip.net uutytp.com @@ -91870,6 +92350,7 @@ uyang.co uyanip.com uyanke.com uycnr.com +uyesee.com uyhjnm.com uyiban.com uyiqggpa.com @@ -91883,6 +92364,7 @@ uyunbaby.com uyuncdn.com uyuncdn.net uyunce.com +uyunche.com uzai.com uzaicdn.com uzhika.com @@ -91911,6 +92393,7 @@ v15i.com v1kf.com v1lady.com v1pin.com +v1tx.com v1zhushou.com v2b3.com v2ex.cc @@ -91923,7 +92406,6 @@ v3.com v3best.com v3edu.org v3mh.com -v3x9.com v4.cc v479.com v4dwkcv.com @@ -91957,6 +92439,7 @@ v8gb.com v977.com v9b5n91.com va-etong.com +va05ex1.org vaakwe.com vaatn.com vacepcvu.com @@ -91998,6 +92481,7 @@ vanclimg.com vanda.cc vandream.com vanform.com +vangelinu.com vangotech.com vanjee.net vanjoin.com @@ -92022,6 +92506,7 @@ vanwardsmart.com vanyee.net vanzol.com vaopo.com +vapepie-web.com vapps.me vaptcha.com vaptcha.net @@ -92035,7 +92520,6 @@ vart.cc varygroup.com vasdgame.com vasee.com -vasen.com vaslco.com vasoon.com vastlandsc.com @@ -92049,7 +92533,6 @@ vautoshow.com vaydeer.com vayol.com vayuan.com -vazton.com vazyme.com vazymemedical.com vbango.com @@ -92065,7 +92548,6 @@ vbkhk.com vbkrhk.com vbmnmy.com vbsemi.com -vbw432.com vc800.com vcarepharmatech.com vcbeat.net @@ -92156,8 +92638,6 @@ vegalb.com vegslb.com vegtm.net veicplive.com -veigagslb.com -veigagslb.net veilytech.com veinbase.com veirun.com @@ -92241,6 +92721,7 @@ vesystem.com vetoolchain.com vetscloud.com vevor.net +vez.me vf5c.com vfcdnrd.com vfcsz.com @@ -92249,6 +92730,7 @@ vfinemusic.com vfocus.net vftfishing.com vfuiov.sbs +vfuke.net vfund.org vfvdf.com vfx123.com @@ -92309,6 +92791,7 @@ vicp.cc vicp.fun vicp.io vicp.net +vicpalm.com vicpv.com vicrab.com vicsdf.com @@ -92366,6 +92849,7 @@ vikilife.com vilives.com villachina.com viltd.com +vim8.org vimage1.com vimage2.com vimage3.com @@ -92392,7 +92876,6 @@ vinsondata.com violetgo.com violinstudy.net violinww.com -vip-cdn.com vip-chn.com vip-lexiang.com vip-wifi.com @@ -92413,6 +92896,7 @@ vipabcyun.com vipappsina.com vipbaihe.com vipbcw.com +vipbla.com vipbuluo.com vipcaocao.com vipchina.com @@ -92425,6 +92909,7 @@ vipfengfei.com vipfengxiao.com vipfenxiang.com vipfinal.com +vipflonline.com vipglobal.hk vipgouyouhui.com vipgs.net @@ -92466,6 +92951,7 @@ vipskill.com vipslib.com vipsmt.com vipsoft.cc +vipsrc.com vipstatic.com vipstore.com viptijian.com @@ -92478,6 +92964,7 @@ vipxf.com vipxs.la vipyl.com vipyyzz.com +vipzhuanli.com viqq.com virbox.com vircloud.net @@ -92516,6 +93003,7 @@ visbodyfit.com viscosefibre.com visfarm.com vishavideo.com +visheng.com vishoor.com visinextek.com vision-nj.com @@ -92574,11 +93062,11 @@ vivojrkj.com vivokb.com vivosjpt.com vivotc.com -viwei.com viwik.com vixiu.com vixue.com viyouhui.com +viyuan.com vizo-dns.com vjia.com vjianshen1688.com @@ -92640,6 +93128,7 @@ vmecum.com vmengblog.com vmeti.com vmic.xyz +vmicloud.com vmkj.net vmlib.com vmoiver.com @@ -92649,6 +93138,7 @@ vmoviercdn.com vmsky.com vmtdf.com vmtnet.com +vmuboh.com vmuhyu.site vmylan.com vnadssb.com @@ -92656,12 +93146,12 @@ vname.com vnanke.com vnet.com vnet.mobi +vniddlg.xyz vnlin.com vnnox.com vnpy.com vnvn33.com vnzmi.com -vo0.site voa365.com vobao.com voc.ai @@ -92722,20 +93212,13 @@ volcadvc.com volcalb.com volcanicengine.com volcano-force.com -volcanoaisearchshare.com -volcanoarkshare.com -volcapig.com -volcapp.com -volcappbuilder.com volcautovod.com volcbiz.com volcca.com -volcca.net volccdn.com volccdn1.com volccdn2.com volccloudidentity.com -volcdcdnlb.net volcddos.com volcddos001.com volcdem.com @@ -92744,14 +93227,10 @@ volcdns-test.com volcdns-test.net volcdns.com volcdns.pub -volcdsagslb.net -volcdsalb.net volceapi.com volceapplog.com volcecr.com volcecw.com -volcengine-api-test.com -volcengine-api.com volcengine-dns.com volcengine-dns.net volcengine.com @@ -92761,7 +93240,6 @@ volcengineapi.com volcenginedns.com volcenginedns.net volcenginepaas.com -volces-test.com volces.com volcfake.com volcfcdn.com @@ -92769,75 +93247,41 @@ volcfcdnbyte.com volcfcdndvs.com volcfcdndvs1.com volcfcdndvs2.com -volcfcdndvs3.com volcfcdnplus.com volcfcdnrd.com volcfcdnsc.com volcfxgjrtm.com -volcgalb.net volcgroup.com -volcgslb-b.com volcgslb-mlt.com -volcgslb-mltb.com volcgslb.com -volcgtm-b.com volcgtm.com volchina.com volciad.com volcimagex.com volcimagex.net volcimagextest.com -volcisms.com -volclivebyte.com -volclivedemo.com volclivedvs.com -volcliveplus.com -volclivesaas01.com -volclivesaas02.com -volclivesaas03.com -volclivesaas04.com -volclivesaas05.com -volclivesaasbp.com -volclivesaascdn.com volcmagicpage.com volcmcdn1.com volcmcdn2.com volcmcdn3.com volcmcdn4.com volcmcdnalias.com -volcmcdnalias1.com -volcmcdnalias2.com -volcmcdnsched1.com -volcmcdnsched2.com -volcmcp.com -volcmedialive.com -volcmedialivecn.com -volcmedialivecnn.com volcmgs.com -volcmlt-b.com volcmlt.com volcmusecdn.com volcocic.com volcopjrtm.com volcpartner.com volcpartner.net -volcpcs-test.com -volcpcs.com -volcproxy-boe.net -volcproxy-test.net -volcproxy.net -volcsdns-test.com volcsdns.com -volcsdns.net volcsirius.com volcsiriusbd.com volcspaceeduc.com -volcstack.com volctracer.com volctrack.com volctraffic.com volctranscdn.com -volcvehicle.com volcvideo.com volcvms.com volcvod.com @@ -92854,7 +93298,9 @@ voltmemo.com vomicer.com voming.com vommatec.com +voneseals.com vonets.com +vonng.com vonwei.com voo0.com vooct.com @@ -92915,7 +93361,6 @@ vpser.net vpsguo.com vpshu.com vpsjxw.com -vpsjyz.com vpsno.com vpsoff.net vpsor.com @@ -92939,11 +93384,13 @@ vr-cat.com vr186.com vr42.com vrbeing.com +vrbi.viveport.com vrbig.com vrbrothers.com vrbt.mobi vrcfo.com vrdiamondtools.com +vrindabg.com vrjie.com vrmajor.com vrnew.com @@ -92953,6 +93400,7 @@ vrqjcs.com vrqq.org vrrw.net vrtyg.com +vrupup.com vrvlink.com vrvmanager.com vrwuhan.com @@ -92961,6 +93409,7 @@ vrzhijia.com vrzwk.com vrzwk.net vs-gascloud.com +vs.cm vs2a.com vsaker.com vsamhos.com @@ -92989,6 +93438,7 @@ vsoontech.com vsping.com vspk.com vsread.com +vssou.com vsszan.com vstarstatic.com vstart.net @@ -93051,7 +93501,6 @@ vv91.net vvbin.com vvebo.vip vvfeng.com -vvghj1023.com vvgroup.com vvhan.com vvhunter.com @@ -93071,22 +93520,22 @@ vvvtt.com vvxue.com vvzero.com vw888.com +vwaycn.com vwe5pjt0jq.com vwhulian.com vwkbh1674.com vwo50.club vwvvwv.com vwwmsd.com -vx.com vx56.com vxe.com vxia.net vxiaocheng.com vxinyou.com vxixi.com -vxni.ink vxo7tu.com vxocok3197.vip +vxras.com vxsnk.com vxuepin.com vxuey.com @@ -93100,6 +93549,7 @@ vynior.com vyuan8.com vyymnahi.com vz.download.prss.microsoft.com +vz41.com vzan.cc vzan.com vzhang.net @@ -93119,13 +93569,13 @@ w-e.cc w-startech.com w-zhong.com w.biz -w0028.cc w032.com w0663.com w0y.com w10a.com w10xitong.com w123w.com +w18.net w1989.com w1b.com w218.com @@ -93142,12 +93592,14 @@ w3ctech.com w3cways.com w3h5.com w3pop.com +w3so.com w3techservices.com w3tt.com w3xue.com w4vwizxrvepq.com w5.com w61usi4a.org +w6pdp.com w7.cc w7000.com w918.com @@ -93160,6 +93612,7 @@ waaku.com waakuu.com waasee.com wabcw.info +wabestdealmall.com wabuw.com wacai.com wacai365.com @@ -93178,6 +93631,7 @@ wafatea.com wafcn.com wafunny.com wagen.cc +wagonsclub.com waha.cc wahahakid.org waheaven.com @@ -93213,7 +93667,6 @@ waimai.com waimai.zone waimai101.com waimai361.com -waimaijuan.com waimaimingtang.com waimaiwanjia.com waimaob2c.com @@ -93227,6 +93680,7 @@ waipojia.com waiqicha.com waiqin365.com waisnj.com +waiting.monster waitsun.com waiyuedu.com waizaowang.com @@ -93237,6 +93691,7 @@ wakeai.tech wakedata.com wakeofgods.com wakeup.fun +wakingsands.com wakkaa.com wakuai.com walanwalan.com @@ -93249,6 +93704,7 @@ walimaker.com walk-live.com walker-fan.com walkera.com +walkingpad.com walkkind.com walknode.com walkthechat.com @@ -93284,7 +93740,6 @@ wan886.com wan898.com wan95.com wanadalu.com -wanan8888.icu wanandroid.com wanbaapp.com wanbexpress.com @@ -93338,6 +93793,7 @@ wanfangche.com wanfangdata.com wanfangtech.com wanfangtech.net +wanfantian.com wanfayun.com wanfoquan.com wanfucc.com @@ -93380,12 +93836,14 @@ wangdianmaster.com wangdingcup.com wangdongjie.com wangdu.site +wangeda.com wangeditor.com wangejiba.com wangfujing.com wanggongwang.com wanggou.com wangguai.com +wanghaifeng.net wanghanyue.com wanghao.me wanghe.tv @@ -93395,6 +93853,8 @@ wanghualang.com wanghuinet.com wanghz.com wangid.com +wangjiezhe.com +wangjm.com wangjubao.com wangjumeng.xin wangjunwei.com @@ -93415,9 +93875,7 @@ wangmei360.com wangmeng.com wangmingdaquan.cc wangmou.com -wangmtd.asia wangniuwms.com -wangonglue.com wangpeiaiot.com wangpiao.com wangpiao.net @@ -93431,7 +93889,6 @@ wangshu.la wangshuashua.com wangshugu.com wangsu.com -wangsu8.com wangsucloud.com wangsuedge.com wangsuedge.net @@ -93523,6 +93980,7 @@ wanjutoy.com wankacn.com wankacn.net wankamall.com +wanke123.com wankeji.com wanku.com wanlaiwang.com @@ -93531,7 +93989,6 @@ wanli.org wanlian-group.com wanlicd.com wanliduo.com -wanlin888.com wanliniu.com wanlitong.com wanlongdianqi.com @@ -93577,6 +94034,7 @@ wanshu.com wanshuiqing.com wanshuiwater.com wanshulou.com +wanshuyun.com wansixie.com wansongpu.com wansusyj.com @@ -93594,6 +94052,7 @@ wantwords.net wantwu.com wantxt.cc wanwan4399.com +wanwan88.com wanwang.com wanwang.space wanwang.xin @@ -93693,7 +94152,9 @@ wasu.tv wasucnc.com watch-top.net watch4s.com +watchadmin.com watchdios.com +watchds.com watcheschep.com watchlead.com watchok.net @@ -93762,6 +94223,7 @@ waypons.com waysundata.com waytit.com waytoagi.com +wayupss.store wayzim.com wazhuti.com wb133.com @@ -93799,10 +94261,10 @@ wbtech.com wbtrans.com wbw.im wbwbwb.net -wbweilicai.com wbxcx.net wbxinxi.com wbzd.net +wc44.com wcansoft.com wcbygame.com wcccc.cc @@ -93811,6 +94273,7 @@ wcd.im wcdc.center wcfang.com wch-ic.com +wch17.com wch666.com wcjbb.com wcjbb.net @@ -93832,12 +94295,15 @@ wcxsw.com wcyecs.com wd-ljt.com wdace.com +wdad.cc wdashi.com wdaveh5game.com wddcn.com wddns.net wddream.com wdexam.com +wdf1tz.com +wdf1tz.net wdfangyi.com wdfxw.net wdgf.com @@ -93846,12 +94312,14 @@ wdiyi.com wdj21.com wdjimg.com wdjky.com +wdkao.com wdklchina.com wdkmall.com wdku.net wdkud6.com wdldl.com wdmcake.com +wdmuz.com wdmyksm.com wdnld.com wdomob.com @@ -93868,7 +94336,6 @@ wdtec.cc wduw.com wdw88.com wdwd.com -wdwdcdn.com wdwlb.com wdxmzy.com wdxtub.com @@ -93879,6 +94346,7 @@ wdyxgames.com wdyy.com wdzj.com wdzx.com +we-ai.work we-pass.com we-vmaxgroup.com we.com @@ -93894,6 +94362,7 @@ we54.com we7.cc weachat.net weadoc.com +weakyon.com weand.com weaoo.com weapp.com @@ -93934,6 +94403,7 @@ web89.net web930.com webacc.net webacg.com +webadminsystem66.com webank.com webankapp.com webankcdn.net @@ -93970,7 +94440,6 @@ webnovel.com webok.me webok.net webond.net -weboss.hk webpackjs.com webportal.cc webportalapi.com @@ -94123,6 +94592,7 @@ weicher-sz.com weichewl.com weichuanbo.com weichuangtech.com +weichuming.com weico.cc weico.com weicogif.com @@ -94168,6 +94638,7 @@ weiguanlaw.com weihai.tv weihaibsy.com weihaicollege.com +weihaifengji.com weihaihaiwang.com weihaisheng.com weihaobang.com @@ -94197,7 +94668,6 @@ weiju.net weijuju.com weikaowu.com weikasen.com -weikazf.com weike.fm weike21.com weikeimg.com @@ -94247,6 +94717,7 @@ weimeigu.net weimi24.com weimiaocaishang.com weimibio.com +weimingchem.com weimingcq.com weimingedu.com weimingkids.com @@ -94331,6 +94802,7 @@ weituobang.net weitupian.com weitushe.com weituya.com +weiunity.com weivd.com weiwall.com weiwangpu.com @@ -94396,7 +94868,6 @@ weiyangx.com weiyapaper.com weiye-alu.com weiye.me -weiyeac.com weiyes.com weiyi.com weiyi.link @@ -94515,12 +94986,12 @@ wendangmao.net wendangwang.com wendax.com wendaxiaowu.com -wendincdn.com wendns.com wendoc.com wendougee.com wendu.com wenduedu.com +wendumao.com wenfangcn.com wenfangjushe.com wenfangnet.com @@ -94550,6 +95021,7 @@ wenjingnetwork.com wenjingzhai.com wenjiwu.com wenju666.com +wenjuan.cc wenjuan.com wenjuan.link wenjuan.ltd @@ -94591,6 +95063,7 @@ wenroo.com wenrouge.com wenryxu.com wensang.com +wensb.org wenshaktv.com wenshannet.com wenshen.net @@ -94671,11 +95144,11 @@ werlchem.com wesane.com wescrm.com wesdom.me -wesemibay.com weshaketv.com weshape3d.com weshine.im weshineapp.com +wesiedu.com wesimiot.com wesing-game.com wesingapp.com @@ -94718,7 +95191,6 @@ wetestlab.net wetherm.com weti.me wetimetech.com -wetolink.com weton.net wetools.com wetools.pro @@ -94797,6 +95269,7 @@ wfswjt.com wfsydzxyy.com wfsyzx.net wftihvn.xyz +wftvqcm.com wfuyu.com wfwzg.xyz wfy.pub @@ -94822,6 +95295,7 @@ wgnds.com wgoic.com wgos.com wgppt.com +wgpsec.org wgtechjx.com wgxdxx.com wgxy.com @@ -94860,17 +95334,17 @@ whale-plus.com whale123.com whalecloud.com whalefall.space -whalesaas.com whaleskts.com +whalet.com whaleunique.com whalipaycs.com whampoa-design.com +whatbuytoday.com whatchina.com whatfugui.com whatsns.com whatswebyuo.com whattheybuy.com -whaty.com whaudio.com whbahyxh.com whbaishitong.com @@ -94880,6 +95354,7 @@ whbcrs.com whbear.com whbec.com whbester.com +whbgy.net whbhst.com whbjdn.com whbts.com @@ -94973,6 +95448,7 @@ whguo.com whgwbn.net whgyt.com whhaifang.com +whhaiyue.com whhdcz.com whhdgk.com whhdjzzl.com @@ -94990,6 +95466,7 @@ whhksj.com whhmgroup.com whhmmbl.com whhouse.com +whhpaccp.com whhr.com whhryd.com whhsg.com @@ -95014,6 +95491,7 @@ whicu.com whidc.com whidf.com whidy.net +whiee.com whiie-expo.com whinfo.net whir.net @@ -95034,11 +95512,11 @@ whjf.com whjh120.com whjiahai.com whjiaoy.com -whjiku.com whjinlong.com whjkcj.com whjkct.com whjksyxx.com +whjldj.com whjm.com whjrjjt.com whjrjt.com @@ -95049,7 +95527,6 @@ whjtjt.com whjuren.com whjxbaby.com whjy.net -whjyapp.com whjyx.com whjyxh.com whjyxx.com @@ -95076,6 +95553,7 @@ whlgchache.com whlib.com whlido.com whljyl.com +whlkwy.com whlovehome.com whlpa.com whlrhd.com @@ -95112,6 +95590,7 @@ whovii.com whpantosoft.com whpanva.com whpcschool.com +whphbc.com whplmd.com whpma.org whptc.org @@ -95179,6 +95658,7 @@ whtpi.com whtpyy.com whtpyzx.com whtran.com +whtryg.com whtryine.com whtsapp-part.team whtto.com @@ -95307,6 +95787,7 @@ wificstia.com wifidog.pro wifidown.com wifigx.com +wifihell.com wifijy.com wifilu.com wifimsl.com @@ -95414,6 +95895,7 @@ windmsn.com windoor168.com windows10.pro windows10zj.com +windows11.pro windows7en.com windowstool.net windowszj.com @@ -95454,7 +95936,6 @@ winhlb.com winhong.com winicssec.com winjoinit.com -winkcake.com winkingworks.com winkkie.com winksi.com @@ -95467,10 +95948,8 @@ winner9.com winnerholding.com winnermicro.com winnerracing.com -winnershang.com winnerway.com winnet.cc -winning11cn.com winningdq.com winos.me winotes.net @@ -95635,11 +96114,13 @@ wjgslb.com wjhh666.com wjhotelgroup.com wjhr.net +wjhtxx.com wjiaxing.com wjin.cc wjinmiao.com wjjfjt.com wjjyxxw.com +wjkjxcx.com wjlxmedia.com wjmh8.com wjnin.cc @@ -95678,10 +96159,10 @@ wkdty.com wkepu.com wkhub.com wkimg.com +wkkshu.com wklken.me wkmic.com wknky1296.com -wkoooo.com wkopen.com wkread.com wksc.com @@ -95703,9 +96184,11 @@ wlai.vip wlaiy.com wlanadmin.com wlanbanlv.com +wlcbnews.com wlcbw.com wlcxx.com wldbs.com +wldlr.com wldmarket.com wlds.net wldsb.com @@ -95713,6 +96196,7 @@ wldservice.com wlerp.com wlfce.com wlfimms.com +wlgkk.com wlgooo.com wlgou.com wlhcc.com @@ -95722,16 +96206,18 @@ wlinfor.com wljhealth.com wlkgo.com wlkst.com +wlku.com wll-xyz.com wllxcl.com +wllxx.com wllxy.net wlmf.vip wlmq.com wlmqedu.com wlmqrc.com +wlmqrsks.com wlmqwb.com wlnh.net -wlnjsb.com wlnkaep.xyz wlnmp.com wlnnosu.xyz @@ -95746,7 +96232,6 @@ wlstock.com wltieyaoban.com wltong.com wluotx.com -wlups.com wlwj.com wlwltech.com wlwx.com @@ -95841,7 +96326,6 @@ wniec.com wniecm.com wnjdtz.com wnkj88.com -wnl.cc wnlbs.com wnlpromain.com wnlproyunying.com @@ -95885,7 +96369,6 @@ wo1wan.com woa.com woaap.com woai310.com -woaidiaoyu.com woaidu.org woaihaoyouxi.com woaihuahua.com @@ -95947,6 +96430,7 @@ woheschool.com wohst8.com wohuishou.club woi3d.com +woiauto.com woiles.com woiwrj.com woiyu.com @@ -95987,6 +96471,7 @@ wolongge.com wolongmedia.com wolongyin.com wolongyoule.com +wolunliuliangji.org wolwo.ltd wolwobiotech.com wom186.com @@ -96071,7 +96556,7 @@ wopop.com woqifoundation.com woqu.com woquyun.com -word2txt.com +word666.com wordfc.com wordlm.com wordplay.work @@ -96080,11 +96565,11 @@ wordscan.net wordscheck.com wordstorming.com wordsunny.com -workbuddy.link workchat.com workec.com workehr.com workerman.net +workhelpmanila.com workpcb.com worksoho.com worktile.com @@ -96169,7 +96654,6 @@ woxian.com woxiaoyun.com woxihuan.com woxiu.com -woxshare.com woxuexue.com woxuyuan.com woyao998.com @@ -96193,7 +96677,7 @@ wozhuan.com wp-china-yes.net wp-hz.com wpan123.com -wpbattery.com +wpceo.com wpcio.com wpcsh.com wpcy.com @@ -96237,6 +96721,7 @@ wqchat.com wqcsjt.com wqdian.com wqdian.net +wqdsq.com wqgp.com wqhome.com wqhunqing.com @@ -96259,7 +96744,6 @@ wrcdn.com wrdtech.com wrfou.com wright9.com -wrilab.com write-bug.com writebp.com writingo-editor.com @@ -96312,6 +96796,8 @@ wsdvs.info wsdvs.org wsecar.com wseen.com +wselearning.com +wselearning.net wsf1234.com wsfdl.com wsfdn.com @@ -96333,7 +96819,6 @@ wsgri.com wsgtm1.com wsgtm3.com wshang.com -wshbe.com wshbzc.com wshengda2009.com wshenm.com @@ -96414,6 +96899,7 @@ wtd56.com wtdex.com wtdms.com wtecl.com +wtfeng.com wtiharbin.com wtimm.com wting.info @@ -96424,6 +96910,7 @@ wtmtest.com wtn-bearing.com wto-btb.com wto168.net +wto9000.com wtobj.com wtoip.com wtojob.com @@ -96494,6 +96981,7 @@ wugongdong.com wuguyufen.com wugx.net wuhaidaily.com +wuhaijy.com wuhan-guide.com wuhan-tour.net wuhan.com @@ -96537,7 +97025,6 @@ wuhanwyg.com wuhanyushidai.com wuhao13.xin wuhema.com -wuhetumu.com wuhexxg.com wuhongsheng.com wuht.net @@ -96601,6 +97088,7 @@ wuli.wiki wuliangroup.com wuliannanjing.com wuliaoo.com +wuliaosi.com wuliaozhuan.com wuliapi.com wulicdn.com @@ -96708,7 +97196,6 @@ wuxishuangfan.com wuxishuangyou.com wuxisj.com wuxitianlang.com -wuxituozhan.com wuxiwang.net wuxiwanli.com wuxiwenlv.com @@ -96729,6 +97216,7 @@ wuyangkeji.com wuyangmotor.com wuyangplatform.com wuyantonglun.org +wuyazi.com wuyecao.net wuyechaorenrcw.com wuyenews.com @@ -96736,7 +97224,6 @@ wuyetongxin.com wuyetoutiao.com wuyi.link wuyijt.com -wuying.com wuyishan.net wuyixinyi.com wuylh.com @@ -96807,6 +97294,7 @@ wwstat.com www-666789.com www-76244.com www-jabuank-co-jp.net +www.amd.com www.cdnetworks.com www.cg www.com.my @@ -96814,10 +97302,16 @@ www.djivideos.com www.epsonconnect.com www.gov.mo www.htc.com +www.nike.com www.redhat.com www.st.com www.vive.com +www.viveport.com +www.volvocars.com www100789.com +www11ic-shinkni-ib-jp.com +www2489.com +www48-365365.com www9912.com wwwer.net wwwfkw.com @@ -96891,7 +97385,6 @@ wxfncjd.com wxfr.net wxfsdff.com wxfsgj.com -wxfuyou.com wxfxw.com wxgamemini.com wxgamemini.work @@ -96961,6 +97454,7 @@ wxmolegames.com wxmovie.com wxmuseum.com wxnacy.com +wxngh.com wxpangu.com wxpayui.com wxpmc.com @@ -96998,6 +97492,7 @@ wxt2020.com wxtaihujx.com wxtcm.com wxtcxny.com +wxtdf.com wxthe.com wxtj.com wxtj10086.com @@ -97005,6 +97500,7 @@ wxtpb.com wxtrirh.com wxtrust.com wxtyjt.com +wxtyyy.com wxurls.com wxutil.com wxw120.com @@ -97061,6 +97557,7 @@ wyfluorine.com wygkmitk.com wyh138.com wyhef.com +wyhos.fun wyins.cc wyins.net wyjianzhan.com @@ -97239,6 +97736,7 @@ wzzbtb.com wzzcd.com wzzjzxx.com wzzlovesli.com +wzznft.com wzzp.com wzzpw.net wzzqqh.com @@ -97250,9 +97748,7 @@ x-abt.com x-bull.com x-cloud.cc x-cmd.com -x-dao.io x-droners.com -x-gpu.com x-imagine.com x-jishu.com x-kicks.com @@ -97265,6 +97761,7 @@ x-tetris.com x-vsion.com x0246.com x0769.com +x1106y.mobi x118.net x1abo.com x23us.us @@ -97296,7 +97793,6 @@ x86pi.com x8ds.com x8sb.com xa-bank.com -xa-junxu.com xa-online.com xa-psj.com xa.com @@ -97305,10 +97801,12 @@ xa4.com xa8yuan.com xa9t.com xaaycz.com -xabaoan.com +xabaotu.com +xabbs.com xabpo.com xacademy.cc xacbank.com +xacg.info xachangda.com xachangxing.com xachanhe.com @@ -97319,6 +97817,7 @@ xacnnic.com xacsjsedu.com xactad.net xacxxy.com +xacyyxq.com xadamai.com xadlwx.com xadsa.com @@ -97355,7 +97854,6 @@ xajx.com xajxcw.com xakaili.com xakjgzz.com -xaklkx.com xakqby.com xakrlab.com xalanq.com @@ -97412,13 +97910,11 @@ xaxcgx.com xaxddz.com xaxydr.com xaxzlsgs.com -xay.zone xayabx.com xayestar.com xaygddc.com xayhedu.com xayizhou.com -xaykxx.com xayzjc.com xazbts.com xazcit.com @@ -97431,6 +97927,7 @@ xazzs.com xb.app xb0.cc xb2s.com +xbaixing.com xbaodi.com xbaofun.com xbase.cloud @@ -97477,6 +97974,7 @@ xbjtkj.com xbk.icu xbkjvip.com xblaw.com +xblou.com xblqb.com xblqugex.cc xblsign.com @@ -97546,6 +98044,7 @@ xcjmcnc.com xcjtjt.com xcjyxx.com xckfsq.com +xckgq.com xckpjs.com xckssw.com xckszx.com @@ -97563,7 +98062,6 @@ xcode.me xcoder.in xcommon.com xcoodir.com -xcoresigma.com xcot.com xcpapa.site xcpapa.xyz @@ -97581,8 +98079,6 @@ xcultur.com xcurrency.com xcvec.com xcvmbyte.com -xcvpn.app -xcvpn.com xcvvs.com xcx-x.com xcxd-inc.com @@ -97593,7 +98089,6 @@ xcxwo.com xcxymw.com xcxzww.com xcyg.net -xcz.im xczhmzb.com xczhsh.com xczim.com @@ -97618,7 +98113,6 @@ xdcdn.net xdcg100.com xddpay.com xde.com -xde538.com xdebike.com xdf99.com xdfckjz.com @@ -97695,6 +98189,7 @@ xdyy.net xdyy100.com xdyyws.com xdzhsw.com +xdzu.net xe-live.com xed.plus xedaojia.com @@ -97768,7 +98263,6 @@ xfjxs.com xflapp.com xflimg.com xfliusheng.com -xflowedge.com xflstatic.com xfltd.net xfnano.com @@ -97817,6 +98311,7 @@ xgdfz.com xgdown.com xgdq.com xgdqsn.com +xggj56.com xggjj.com xghylt.com xgimi.com @@ -97841,6 +98336,7 @@ xgqq.com xgqyy.com xgsdk.com xgsdpm.com +xgss.net xgsxt.net xgsyun.com xgt2014.com @@ -97885,7 +98381,6 @@ xhg.com xhgame.com xhgamesdk.com xhgz.com -xhh.club xhh.pw xhhd6.com xhhdd.cc @@ -97906,6 +98401,7 @@ xhjs168.com xhjt.com xhjyxxw.com xhlcsl.com +xhlld002.shop xhlsgs.com xhma.com xhmedia.com @@ -97923,7 +98419,6 @@ xhscdn.com xhscdn.net xhsd.com xhsd.net -xhsdzd.com xhsf.com xhslink.com xhslw.com @@ -97943,6 +98438,7 @@ xhw520.com xhwater.com xhwcdasha.com xhwhouse.com +xhwtech.com xhwx100.com xhwyzsd.com xhxcedu.com @@ -97960,6 +98456,7 @@ xhzysg.com xi-9.com xi-soft.com xi.biz +xi.su xi5jie.com xia1ge.com xiaa.net @@ -97996,7 +98493,6 @@ xiamentianqi114.com xiamenwater.com xiami.com xiami.net -xiamiapi.xyz xiamo.fun xiamoyun.com xiamp4.com @@ -98013,6 +98509,8 @@ xianchengyou.com xiancn.com xiandaihospital.com xiandaimuye.com +xiandaiyuwen.com +xiandanjia.com xiandengdengguan.com xianer.net xianfae.com @@ -98026,6 +98524,7 @@ xiang578.com xiangange.com xianganquan.com xianganyu.com +xiangauto.com xiangbababus.com xiangbinmeigui.com xiangbojiubo.com @@ -98038,8 +98537,8 @@ xiangdian.com xiangdian.store xiangguo.com xiangguohe.com +xiangha.com xianghuanji.com -xianghuiin.com xianghumarathon.com xianghunet.com xianghus.com @@ -98091,7 +98590,6 @@ xianguomall.com xiangw.com xiangwushuo.com xiangxiangmf.com -xiangxinggl.com xiangxinggroup.com xiangxingnet.com xiangyang-marathon.com @@ -98154,13 +98652,14 @@ xiansimo.com xiansuan.com xiantao-marathon.com xiantao.com -xiantaohuangshan.com +xianweizhang.com xianxiadao.com xianxiadao.net xianxiazhuanjz.com xianxueba.com xianxwzj.com xianyang888.com +xianyer.com xianyongyong.com xianyouhe.com xianyuange.com @@ -98181,8 +98680,8 @@ xianzxjy.com xiao-an.com xiao-bo.com xiao-new.com -xiao-xin.net xiao100.com +xiao2she.com xiao688.com xiaoa.name xiaoac.com @@ -98204,24 +98703,25 @@ xiaobaitool.net xiaobaiupin.com xiaobaivr.com xiaobaixitong.com +xiaobal.com xiaobangbaoxian.com xiaobangguihua.com xiaobangtouzi.com xiaobao360.com +xiaobaodt.com xiaobaoming.com xiaobaoonline.com xiaobaostudio.com xiaobeibike.com xiaobeigl.com xiaobeiyangji.com +xiaobianli8.com xiaobingxitong.com xiaobool.com xiaobot.net xiaobu.tech -xiaobu.xin xiaobu121.com xiaobuwq.com -xiaocaiyuan.com xiaocanapp.com xiaocanhulian.com xiaocantech.com @@ -98230,12 +98730,10 @@ xiaoce.fun xiaocen.com xiaochamao.com xiaoche001.com -xiaochenbaoku.com xiaocheng.com xiaochengxu029.com xiaochengxucms.com xiaochi198.com -xiaochi7.com xiaochixiang.com xiaochuanyun.com xiaocifang.com @@ -98344,6 +98842,7 @@ xiaoice.com xiaoj.com xiaoji.com xiaoji001.com +xiaojian.site xiaojiaokeji.com xiaojiaoyar.com xiaojiaoyu.com @@ -98351,7 +98850,6 @@ xiaojiaoyu100.com xiaojing.work xiaojing360.com xiaojinzi.com -xiaojiyun.com xiaojl.com xiaojp.com xiaojuchefu.com @@ -98364,12 +98862,14 @@ xiaokanba.com xiaokanglongjiang.com xiaokao.com xiaokaxiu.com +xiaokcdn.com xiaokcehui.com xiaoke.space xiaoke101.com xiaokeai.com xiaokeduo.com xiaokepu.com +xiaokesoso.com xiaokuihua.net xiaokusha.com xiaolachuxing.com @@ -98402,12 +98902,12 @@ xiaoluyy.com xiaoluzhidian.com xiaolvji.com xiaolxiao.com +xiaoma.com xiaoma.net xiaomachuxing.com xiaomagaojian.com xiaomai.live xiaomai5.com -xiaomaicn.com xiaomaidong.com xiaomaigongkao.com xiaomaigui.com @@ -98425,7 +98925,6 @@ xiaomazhixing.com xiaomei.cc xiaomeiti.com xiaomeng1235.com -xiaomengai.com xiaomi.com xiaomi.hk xiaomi.net @@ -98549,6 +99048,7 @@ xiaowiba.com xiaowm.com xiaowuwl.com xiaoxia.vip +xiaoxiaapi.com xiaoxiang.club xiaoxiangbz.com xiaoxianggong.com @@ -98610,7 +99110,6 @@ xiaoyouxi100.com xiaoyouxiqun.com xiaoyouzb.net xiaoyu.com -xiaoyuan888.com xiaoyuananquantong.com xiaoyuankousuan.com xiaoyuansouti.com @@ -98619,11 +99118,11 @@ xiaoyuanyun2.com xiaoyuanzhao.com xiaoyuanzhaopin.net xiaoyuer.com -xiaoyueyun.com xiaoyujia.com xiaoyun.com xiaoyusan.com xiaoyusanchou.com +xiaoyutiao.com xiaoyuxitong.com xiaoyuzhoufm.com xiaoz.me @@ -98631,7 +99130,6 @@ xiaozhang365.com xiaozhao365.com xiaozhen.com xiaozhenpaotui.com -xiaozhenwaimai.com xiaozhibaoxian.com xiaozhibo.com xiaozhimed.com @@ -98655,6 +99153,7 @@ xiaozuanbike.com xiaozufan.com xiaozujian.com xiaozuowen.net +xiapac.com xiapilu.com xiappt.com xiapu.co @@ -98684,6 +99183,7 @@ xiazaijidi.com xiazais.com xiazaitool.com xiazaiwx.com +xibaike.com xibanyaqz.com xibao100.com xibeicanyin.com @@ -98728,6 +99228,7 @@ xiehehp.com xiehejx.com xiehekjkf.com xiehepcb.com +xiehouit.com xiehuiyi.com xiejiahe.com xiejianji.com @@ -98788,6 +99289,7 @@ xihuan xihuan.me xihusgh.com xiimoon.com +xiinnn.com xiji-express.com xiji.com xijie.com @@ -98809,6 +99311,7 @@ xikang365.net xikcloud.com xikii.com xikoutourism.com +xikrs.com xikuan.com xikuqi.com xilaijian.com @@ -98822,6 +99325,7 @@ xileyougame.com xili.fan xilian-group.com xiliangjituan.com +xilichi.com xiliguoji.com xilinsi.org xilinx-ic.com @@ -98944,13 +99448,13 @@ xinfuhk.com xinfushe.com xinfuyouxi.com xinfuyun.net +xing73.com xingames.com xingaochengtai.com xingb.net xingbangfl.com xingbo.tv xingchao1.com -xingcheclub.com xingchenjia.com xingcheshixian.com xingchiauto.com @@ -98999,9 +99503,11 @@ xingjiaoyun.com xingjiesj.com xingjijy.com xingjimob.com +xingjuhe.com xingjun-group.com xingkec.com xingkeqi.com +xingketech.com xingkongfy.xyz xingkongmt.com xingkupai.com @@ -99040,6 +99546,7 @@ xingshangnet.com xingshawater.com xingshen.com xingshu.com +xingshuishuiwu.net xingshulin.com xingsteel.com xingtai.net @@ -99055,6 +99562,7 @@ xinguad.com xinguangjian.com xinguge.com xinguida.com +xingumin.net xinguodu.com xingvps.com xingwajiang.com @@ -99102,7 +99610,6 @@ xingzi-vision.com xingzou.art xingzoushu.com xingzuo.com -xingzuobaike.com xingzuomi.com xingzuowu.com xingzuoyundns.com @@ -99140,9 +99647,9 @@ xinhuanet.ltd xinhuapo.com xinhuaprs.com xinhuapub.com +xinhuaqipai.com xinhuashe.org xinhuashudian.com -xinhuaskl.com xinhuasuye.com xinhuawang.com xinhuawz.com @@ -99150,6 +99657,7 @@ xinhuaxmt.com xinhuayimin.com xinhuazhiyun.com xinhuozhi.com +xining-marathon.com xiniu.com xiniu3d.com xiniugushi.com @@ -99169,9 +99677,9 @@ xinjinqiu.com xinjiren.com xinjisuan.net xinju.fun +xinjuc.com xinjunshi.net xinjunshicn.net -xinkailawyer.com xinkuai.com xinlangtupian.com xinle.com @@ -99191,7 +99699,6 @@ xinlifudao.com xinlilw.com xinlinghuayuan.com xinlingletu.com -xinlingshou.com xinlip.com xinlischool.com xinlishumeng.com @@ -99224,8 +99731,9 @@ xinnetdns.com xinnetvip.com xinniangjie.com xinnianhua.com +xinnong.com xinnong.net -xinnuosf.com +xinnuodazu.com xino-tech.com xinorngyk.com xinouhk.com @@ -99300,8 +99808,8 @@ xintianw.com xintianya.net xintiao100.com xintiaogroup.com -xintiaolv.com xintiaoyouxi.com +xintongconference.com xintongwang.com xintuan.com xintucdn.com @@ -99377,7 +99885,6 @@ xinyou.com xinyoudui.com xinyour.com xinyu-tam.com -xinyu1234.xyz xinyu19.com xinyuanclub.com xinyuanf.com @@ -99533,10 +100040,10 @@ xiushuang.com xiushui.net xiusifudianji.com xiustatic.com +xiutuan.com xiutv.com xiuxiandou.com xiuxianshipin.com -xiuxitong.com xiuxiu.com xiuxiuda.com xiuxiustatic.com @@ -99556,6 +100063,7 @@ xiwenquan.com xiwicloud.com xiwnn.com xiwuji.com +xiwuy.com xixhx.com xixiangongjiao.com xixianwatergroup.com @@ -99564,6 +100072,7 @@ xixiarc.com xixibobo.com xixidoudizhu.com xixig8.com +xixih.cc xixih.net xixik.com xixik.net @@ -99619,6 +100128,7 @@ xizice.com xiziiparking.com xiziquan.com xiziwang.net +xj-biotech.com xj-etyy.com xj-tianye.com xj-zp.com @@ -99710,6 +100220,7 @@ xjsmwl.com xjsy56.com xjtcm.com xjtjjt.com +xjtour.com xjtrcw.com xjtrry.com xjtsnews.com @@ -99741,6 +100252,7 @@ xjzhsh.com xjzlyy.com xjzp.net xk57.com +xk857.com xk89.com xk9l.com xkaxka.com @@ -99864,6 +100376,7 @@ xm-ais.net xm-chuang.com xm-gzf.com xm-olympic-museum.org +xm002.com xm200.com xm51.com xm5156.com @@ -99878,7 +100391,6 @@ xmaibu.com xmalaya.com xmamiga.com xmanblog.net -xmaosms.com xmasg.com xmayitxt.com xmbankonline.com @@ -99907,6 +100419,7 @@ xmfish.com xmfls.net xmfunny.com xmgd.com +xmgod.site xmgps.com xmgsd.com xmgslx.com @@ -99940,11 +100453,9 @@ xmjslh.com xmjyw.com xmjzykj.com xmkanshu.com -xmkj.beer xml-journal.net xmldz4.com xmlhifi.com -xmlib.net xmlvbarcode.com xmmade.com xmmama.com @@ -99953,7 +100464,6 @@ xmmtu.com xmmuye.com xmnjdwx.com xmocloud01.com -xmoj.tech xmonecode.com xmos.tv xmov.ai @@ -99987,7 +100497,6 @@ xmsumi.com xmsuperlite.com xmswim.com xmtbang.com -xmtcm.com xmtyy.net xmuli.tech xmwan.com @@ -100050,8 +100559,7 @@ xn--55qx5d xn--55qzsxj5y4ozkz93dswptmau4jc88dg75ctid8raf29c.com xn--5kv317c.com xn--5tzm5g -xn--65qy41j.com -xn--6fr40zm5ai2go3cnse89dtttbrb.com +xn--6fr61zj8c92fg34d.com xn--6frz82g xn--6kr66fp2ep1ac5edz2hy7s2wq.com xn--6krw3qs7jl59b.com @@ -100078,7 +100586,6 @@ xn--9pry86bq5ex68c.org xn--b0t462i.com xn--b0tp7p3met2a.com xn--b0tp7p3met2a.net -xn--bjq584at06c.shop xn--btvs3aw8fhtbms310k.com xn--btvu9x9qgt8c.com xn--bxyy83e.net @@ -100122,7 +100629,6 @@ xn--fjq5py34j65v.com xn--fjq720a xn--g2xx48c xn--glr604k.com -xn--gmq22ktps713c.cc xn--gmq238c5fy.com xn--gmqr9gdtrhuf56g.com xn--h5qy75o.vip @@ -100138,7 +100644,6 @@ xn--it-if7c19g5s4bps5c.com xn--jh1a128b.com xn--jor0b302fdhgwnccw8g.com xn--jpr47zq87axwjc0d.com -xn--jxqz98c.com xn--jxuv1s.net xn--kivq8be3whsi.com xn--kput3i @@ -100152,7 +100657,6 @@ xn--mts196b.net xn--n5q75cia631gba51vx4ag2a008o08l1t0adzay2skp4b.com xn--n6qy1xeobw60f.net xn--ncym25ahib.net -xn--nlya.cc xn--nmqp78hmufjwu.com xn--ntso8dsz1borbzvfm5h.com xn--ntsp37j.net @@ -100175,6 +100679,7 @@ xn--ror-j59d107t.net xn--rpv331d.com xn--rss237b.com xn--rss404ac6aj60e.net +xn--rsss0ke5ghnj.com xn--ruqs20ac8b5z7av8ir2u.net xn--ruqz9zcojm5sf19a.com xn--s4t325g.com @@ -100189,7 +100694,9 @@ xn--tlq092au7hsi3a.com xn--tlqz3aj77agil76ww4ni2k.com xn--tqq89g2tjj5x8xs.com xn--unup4y +xn--vcso1ukuz.net xn--vcsu51b3zccpm.com +xn--vcsu9p66gy1l9vpnnbk52f.com xn--vhq3m33sbqhpsmtnuxfq.com xn--vhq3mr8b802a.net xn--vhq4ut2dsxd5xqnicjxxo55a756aovhik0aunm.com @@ -100206,7 +100713,6 @@ xn--w9q675dm1p7em.net xn--w9qr0k.com xn--w9qy23cc6adz7d.net xn--wbsz85a2a.com -xn--wlq49r6tr7zal0u.com xn--wxtr44c.live xn--xcry9n251cvcar5xj6r.com xn--xhq521b @@ -100228,7 +100734,6 @@ xn--ykr169cm1pskt.com xn--z4q559dueav8q.com xn--z63a11k.com xn--zfr164b -xn--zfru1ggxt.fun xn0.cc xn121.com xna8.com @@ -100274,6 +100779,7 @@ xnzn.net xnzxjy.com xnzxyy.com xnzyyy.com +xo58tjrol4.work xoao.com xoliao.com xooooa.com @@ -100309,6 +100815,7 @@ xpccdn.com xpcdz.com xpcha.com xpchina.net +xpdf.net xpeae.com xpeng.link xpf.cc @@ -100319,9 +100826,9 @@ xpkjpk.com xpkongqipao.com xplaymobile.com xppjzs.com -xprinter.net xpsup.com xpsy.net +xptt.com xpu93.com xpw888.com xpwin7.com @@ -100373,6 +100880,7 @@ xrender.com xresgrbw.com xrhhg.com xrichengapp.com +xrjjk.com xrkapp.com xrkcdn.com xrlmold.com @@ -100392,6 +100900,7 @@ xs-servers.com xs058.com xs3cnc.com xs52.com +xs63.info xs7.cc xs7.com xs7.la @@ -100466,7 +100975,6 @@ xsnow.net xsnsyh.com xsool.com xsp0311.com -xspacexx.org xsphs.com xspinfo.com xspio.com @@ -100485,6 +100993,7 @@ xstv.net xstx.info xstzgs.com xsui.com +xsuweb.com xswang.com xswdcasting.com xsxgjsw.com @@ -100549,6 +101058,7 @@ xtrapowercn.com xtrc.net xtrunc.com xtsfuke.com +xttaff.com xttblog.com xttz.com xtu2.com @@ -100624,6 +101134,7 @@ xuanyusong.com xuanyutech.com xuanzhi.com xuanzhuanmumatuwen.com +xuavieres.com xubei.com xuchencq.com xuchuang.com @@ -100699,7 +101210,6 @@ xueleku.com xuelema.com xueleyun.com xueli9.com -xuelian.live xueliedu.com xueming.li xuenarui.com @@ -100788,7 +101298,6 @@ xuexicn.com xuexigang.com xuexili.com xuexin365.com -xuexiniu.com xuexinjiaoshi.com xuexito.com xuexitong.com @@ -100886,6 +101395,7 @@ xunlong.tv xunlongsoft.com xunlu-led.com xunlugame.com +xunmai888.com xunmall.net xunmei.net xunmeinet.com @@ -100899,7 +101409,6 @@ xunsearch.com xunshi.cc xunsho.com xunshou.com -xunshu.org xunsl.com xunsn.com xunsns.com @@ -100956,7 +101465,6 @@ xuyanmaoyi.com xuyechem.com xuyi.net xuyongrongmei.com -xuyuanyi.com xuyueswkj.com xuyunjt.com xuzai.com @@ -100973,6 +101481,7 @@ xv5.com xvacuum.com xvhttu3c9.com xvista.com +xvjhzuc.com xvuikerk.com xvwprdk.com xw-chip.com @@ -101040,6 +101549,7 @@ xxcang.com xxccx.com xxcig.com xxcipharm.com +xxcmw.com xxdao.com xxeden.com xxedu123.com @@ -101052,7 +101562,6 @@ xxhnanke.com xxhrd.com xxinficity.com xxir.com -xxjnjd.com xxjqgs.com xxjrjxc.com xxjzg.com @@ -101068,7 +101577,6 @@ xxliudsp.com xxlsmqzs.com xxlwin.com xxmac.com -xxmlyy.com xxmyf.com xxnet.vip xxnets.net @@ -101104,10 +101612,10 @@ xxtiao.com xxtjdz.com xxtlw.com xxtmail.com -xxuuuw.com xxw001.com xxwolo.com xxxbiquge.com +xxxcsf.com xxxedu.net xxxfeng.com xxxhhh.com @@ -101135,6 +101643,7 @@ xxzsgame.com xy-asia.com xy-ddh.com xy-dgyx.com +xy-display.com xy-invite.com xy-mp.com xy-technology.com @@ -101169,6 +101678,7 @@ xyclouds.com xycms.com xycsq.com xyctgroup.com +xycwei.com xycyky.com xyda.cc xydcname.com @@ -101286,6 +101796,7 @@ xywlhlh.com xywm.com xywy.com xywyfw.com +xywzs.com xyx234.com xyxcables.com xyxdie.com @@ -101366,7 +101877,6 @@ xzcykg.com xzdag.com xzdfcd.com xzdfyy.com -xzdkyq.com xzdtjt.com xzep.net xzepa.com @@ -101392,7 +101902,6 @@ xzhpck.com xzhyjsjt.com xzhzkd.com xzis.org -xzisc.com xzjhgt.com xzjiufa.com xzjsxy.com @@ -101410,9 +101919,9 @@ xzlsqy.com xzltrq.com xzltzc.com xzlzf.com +xzmai.com xznqcc.com xznqnews.com -xzong.online xzoo.org xzpf110.com xzpm.com @@ -101459,8 +101968,8 @@ xzxw.com xzxx.com xzxxlcp.com xzyhealth.com +xzyjl.com xzynyy.com -xzyseo.com xzzh.com xzzhbsq.com xzzhongye.com @@ -101562,6 +102071,7 @@ yafeilinux.com yafenglvsuo.com yago-mall.com yahacode.com +yahaha.net yahaizi.com yahanmr.com yahboom.com @@ -101578,9 +102088,9 @@ yaiyuan.com yajxc.com yake123.com yake5.com -yakejiayuan.com yakgamer.com yakjhfh.com +yakool.com yalayi.com yalayi.net yalewoo.com @@ -101608,6 +102118,7 @@ yanbinghu.com yanbm.com yanbmn.com yanboyuan.com +yance.wiki yanchebang.com yancheng-culture.com yanchengdj.com @@ -101626,7 +102137,6 @@ yanfeng.com yanfengauto.com yanfukun.com yang99.fun -yangben001.com yangbentong.com yangbinlvshi.com yangchanji.com @@ -101637,7 +102147,6 @@ yangchunjian.com yangcong.com yangcong345.com yangcongchufang.com -yangcongxueyuan.com yangdongjia.com yangfannie.com yanggang-group.com @@ -101660,6 +102169,7 @@ yangki.net yangkun.net yanglaocn.com yanglaofuwu365.com +yanglaotiandi.com yanglee.com yangli.com yangliping.com @@ -101669,7 +102179,7 @@ yangluojob.com yangmao.info yangmi.net yangmingauction.com -yangmysq.com +yangner.com yangnongchem.com yangoo-global.com yangqi.show @@ -101706,6 +102216,7 @@ yangxiangdb.com yangxingzhen.com yangxinren.com yangyangad.com +yangyangla.com yangyanxing.com yangyi.vip yangyi02.com @@ -101749,6 +102260,7 @@ yankon.com yankong.com yanliang.com yanliaofang.work +yanlong.shop yanmaiyingyu.com yannv.com yanoda.com @@ -101792,12 +102304,12 @@ yanxishe.com yanxiu.com yanxurui.cc yanyib2b.com +yanyidakaoyan.com yanyijingling.com yanyin.tech yanyiquan.com yanyiwu.com yanyizc.com -yanymobi.com yanyue.net yanyunmail.com yanzhaorc.com @@ -101806,7 +102318,6 @@ yanzhihuisc.com yanzhiwu.com yanzhoulugang.com yao.com -yao07.com yao123.com yao51.com yaobo.net @@ -101818,6 +102329,7 @@ yaocaizhongzi.com yaocdn.com yaochengwang.com yaochentech.com +yaochixie.com yaochufa.com yaocsoft.com yaodinongye.com @@ -101871,6 +102383,7 @@ yaoshanly.com yaoshimiaolianhua.com yaotia.com yaotiannano.com +yaotongjn.com yaotou.com yaoudq.com yaowan.com @@ -101947,7 +102460,7 @@ yayouapp.com yaypool.com yayu.net yayunjiqi.com -yazhongzhuangshi.com +yazhougoufang.com yazuo.com yazx.net yb-able.com @@ -101974,6 +102487,7 @@ ybcnjg.com ybcxjd.com ybcxz.com ybdbz.com +ybdlogistic.com ybe.net ybgkz.com ybgz.com @@ -101982,7 +102496,6 @@ ybi.net ybirds.com ybj.com ybjjsgc.com -ybjk.com ybk001.com ybk168.com ybk6.com @@ -102033,6 +102546,7 @@ yc8.com yc9y.com ycait.com ycamlyy.com +ycandyz.com ycangels.com ycaqr.com ycb.com @@ -102070,7 +102584,6 @@ ycgwl.com ycgzgame.com ychcqmu.com ychdzxsh.com -ychld.com ychr.com ychromedgeie.com ychszh.com @@ -102078,6 +102591,7 @@ ychxie.com ychxiex.com ycig.com ycigilink.com +yciou.com ycis-bj.com ycis-cq.com ycis-schools.com @@ -102113,6 +102627,7 @@ ycny.com ycoa0898.com ycool.com ycpack.net +ycpai.com ycpec.com ycphkj.com ycpinke.com @@ -102178,7 +102693,6 @@ yd-power.com yd-tec.com yd126.com yd166.com -yd666cdn.com ydadmob.com ydalison.com ydamc.com @@ -102215,10 +102729,10 @@ ydjt2288.com ydjwy.net ydjy.net ydkj2019.com -ydkkej.com ydl-sh.com ydl.com ydlcdn.com +ydlut.com ydmel.com ydmeng.com ydmob.com @@ -102227,6 +102741,7 @@ ydniu.com ydr.me ydsaso.com ydscan.net +ydsjjs.com ydsjpt.com ydsrmyy.com ydstatic.com @@ -102236,13 +102751,12 @@ ydt.link ydtbl.com ydtnotary.com ydtqd.com -ydtxisp.com yduav.com ydwatch.com ydwgame.net ydx2.com +ydxphb.com ydxrf.com -ydxxmk.com ydxxt.com ydyb.com ydycdn.com @@ -102268,12 +102782,10 @@ yealinkvc.com yeaosound.com yearlygreen.com yearnfar.com -yeasen.com yeastar.com yebaike.com yebangyu.org yebaojiasu.com -yebeta.com yebinnet.com yeboyzq.com yebrewing.com @@ -102347,6 +102859,7 @@ yelot.com yemacaijing.com yemadai.com yemajun.com +yemancomic.com yemaosheji.com yemaosoft.com yemayun.com @@ -102415,11 +102928,10 @@ yesxun.com yetaidrink.com yetianlian.cc yetianlian.info +yetianzi.com yettos.com yetu.net -yew734.com yewanba.com -yewcdn.com yewen.us yewuyuan.com yexinggroup.com @@ -102494,8 +103006,8 @@ yffy120.com yffzkl.com yfgg.com yfgj68.com -yfhcname2.com yfhex.com +yfhhf.com yfhl.net yfhospital.com yfhxtech.com @@ -102503,6 +103015,7 @@ yfinds.com yfiot.com yfisher.com yfjiakao.com +yfjnjc.com yfklxz.com yflcloud.online yfldocker.com @@ -102512,7 +103025,6 @@ yfmhgf.com yfmhw.com yfp2p.net yfpayment.com -yfqh.tech yfsafety.com yfsail.net yfscdn.net @@ -102545,7 +103057,6 @@ ygcooler.com ygct.com ygdatabase.com ygdl.com -ygduoyi.com yge.me ygeer.com ygei.com @@ -102567,6 +103078,7 @@ ygsf.com ygsoft.com ygtape.com ygtcpa.com +ygtf.net ygtiyu.com ygtl.com ygtq.net @@ -102585,9 +103097,9 @@ yh31.com yh598.com yh914.com yh99.cc +yh999999.com yhachina.com yham.net -yhans.com yhc-card.com yhcangchu.com yhchj.com @@ -102599,6 +103111,7 @@ yhcmovie.com yhcplatform.com yhcqw.com yhd.com +yhdd365.shop yhdfa.com yhdi.net yhdm5.com @@ -102648,6 +103161,7 @@ yhthing.com yhtools.cc yhtuchuang.com yhtx.tv +yhtzx.net yhurl.com yhwch.com yhwins.com @@ -102667,6 +103181,7 @@ yhz365.com yhz66.com yhzky.net yhzky1.net +yhzm.cc yhzm.com yhzrt.com yhzuche.com @@ -102693,7 +103208,6 @@ yibaijin.com yibaixun.com yiban.io yiban1314.com -yibanbianji.com yibaogao.com yibaojiankang.com yibaotech.com @@ -102703,7 +103217,9 @@ yibeiwangluo.com yibenmanhua.com yibentushu.com yibiao-sh.com +yibite.com yiboliu.com +yiboow.com yiboshi.com yibotec.com yiboyangguang.com @@ -102728,12 +103244,12 @@ yichengfood.net yichengji.com yichengnews.com yichengwangluo.net -yichengwlkj.com -yichenlawfirm.com yicheshi.com yichi.tech yichip.com +yichkp.com yichuan.net +yichuntv.com yichuyifan.com yickd.com yiclear.com @@ -102813,6 +103329,7 @@ yifancn.com yifanggl.com yifanghy.com yifanmedia.net +yifanshangplus.com yifanyy.com yifatong.com yifei.com @@ -102854,7 +103371,6 @@ yihafo.com yihaikerry.net yihaiquanyi.com yihaishijia.com -yihaisoft.com yihang.info yihao.com yihao01.com @@ -102934,7 +103450,6 @@ yikaiye.net yikang.work yikang1977.com yikanxs.com -yikao88.com yikaoapp.com yikaochacha.com yikebus.com @@ -102964,6 +103479,7 @@ yili.com yilianapp.com yilianmeiti.com yilianyixue.com +yiliaosheji.com yilibabyclub.com yilicar.com yilihuo.com @@ -102973,6 +103489,7 @@ yilikim.com yilingarden.com yilingshop.com yilingsj.com +yilinweb.com yiliqqstar.com yilishiji.com yiliwater.com @@ -103036,7 +103553,6 @@ yinchengli.com yinchengpai.com yinchuanwater.com yinchuanzxd.com -yindo-ohm.com yindon.com yindu.com yinduchina.com @@ -103088,6 +103604,7 @@ yinghuasuan.com yinghuiiot.com yinghuo.art yinghuochong.com +yinghuochong.fun yinghuochongjz.com yinghuodd.com yinghuoqingsu.com @@ -103115,13 +103632,13 @@ yingming.net yingnor.com yingpaigame.com yingpaikeji.com +yingpengbz.com yingpost.com yingriliuti.com yingrongit.com yingshe.com yingsheng.com yingshi-ai.com -yingshi.dog yingshiyou.com yingso.fun yingsoft.com @@ -103132,7 +103649,6 @@ yingt.asia yingt.fun yingtai.com yingtaigroup.com -yingtailaw.com yingtaorelian.com yingtaosiyue.com yingtaoyun.com @@ -103196,7 +103712,6 @@ yinjia.com yinjiabio.com yinjispace.com yinka.co -yinkead.com yinlimedia.com yinlingshuyuan.com yinlvaa.com @@ -103253,9 +103768,9 @@ yinzuo100.com yioulai.com yiovo.com yipai360.com +yipaiming.com yipaogan.com yiparts.com -yipayer.com yipemail.com yipeng888.com yipiaoyun.com @@ -103339,6 +103854,7 @@ yiruikecorp.com yiruituo.com yirujs.com yiruniot.com +yiruwijojn1.com yiryi.com yisa.com yisanban.com @@ -103366,6 +103882,7 @@ yishun.fun yishutang.com yishuzi.com yishuzi.org +yishuziti.com yisier.com yisimeimaoyi.xyz yiso.fun @@ -103513,7 +104030,6 @@ yiyouliao.com yiyouliuxue.com yiyouqi.com yiyoushu.net -yiyouxuan.xyz yiyu.com yiyuan.com yiyuanluye.com @@ -103530,10 +104046,11 @@ yizenb.com yizeseafood.com yizhanapp.com yizhang8.com -yizhangtu.com +yizhanhulian.com yizhanzx.com yizhaopin.com yizhedian.com +yizhengwx.com yizhibi.com yizhibo.com yizhifubj.com @@ -103547,7 +104064,6 @@ yizhiwechat.com yizhiweixin.com yizhiws.com yizhixiaogame.com -yizhiyc.com yizhoucb.com yizhu-tech.com yizhuan5.com @@ -103557,7 +104073,6 @@ yizu.org yizu.tv yizumi-group.com yizumi.com -yizuren.com yizuxing.com yj-fun.com yj-zn.com @@ -103574,9 +104089,9 @@ yjcf360.com yjcp.com yjctrip.com yjdatasos.com -yjdjfw.com yjfy.com yjgf.com +yjgxcx.com yjhbqx.com yjhnt888.com yjhospital.com @@ -103588,6 +104103,7 @@ yjiyun.com yjjsjt.com yjk.com yjk.im +yjkxw.org yjldp.com yjlhq.com yjlin4.com @@ -103623,12 +104139,12 @@ yjsry.com yjssishisi.com yjsswjt.com yjswsht.xyz -yjsyy.com yjtiyu.com yjtvw.com yjtw.com yjwlnet.com yjwlo.com +yjwmidc.com yjwujian.com yjxfz.com yjxlawyer.com @@ -103650,6 +104166,7 @@ ykccn.com ykccn.net ykcer.com ykclass.com +ykcuqlt.com ykdgd.com ykelai.com ykfc.net @@ -103671,7 +104188,6 @@ ykrcx.com yksdks.com yksign.com yksjjt.com -yksmgs.com yksuit.com ykt.io yktchina.com @@ -103753,6 +104269,7 @@ ylmf.cc ylmf123.com ylmf888.com ylmfeng.com +ylmfwin100.com ylmfwin8.com ylmm.com ylnetworks.com @@ -103773,6 +104290,7 @@ ylsssgg.com ylstatic.com ylstcgz.com ylstudy.com +ylsw.net ylt2008.com yltapi.com yltender.com @@ -103819,18 +104337,21 @@ ym01.tech ym23.com ym3222333.com ymacg.com +ymadly.com ymailcampaign.com ymanz.com ymapp.com ymark.cc ymars.com ymatou.com +ymawv.la ymbaidu.com ymbank.com ymcart.com ymcart.net ymcsepu.com ymdoctor.com +ymechina.com ymexf.com ymfund.com ymg.cc @@ -103855,6 +104376,7 @@ ymnsdk.com ympc88.com ympcb.com ymrcw.vip +yms.cool ymsoft.team ymsteam.com ymt.com @@ -103862,6 +104384,7 @@ ymt123.com ymt360.com ymtc.com ymtie.com +ymtmt.com ymtnet.com ymuuy.com ymvkt.com @@ -103870,11 +104393,9 @@ ymwl.net ymxinke.com ymxinxi.com ymxlass.com -ymy9.com ymyun.com ymyw.net ymyxsw.com -ymzec.com ymzer.com ymzsl.com ymzxconf.com @@ -103898,11 +104419,13 @@ yndaily.com yndcc.com yndkt.com yndzdj.com +yneg-ev.com yneit.com ynet.com ynfmly.com ynfww.com ynfwyy.com +ynfxw.com yngas.net yngp.com yngsxy.net @@ -103912,6 +104435,7 @@ ynho.com ynhotel.net ynhouse.com ynhr.com +ynhthbkj.com ynhuasong.com ynhzm.com yni84.com @@ -103952,7 +104476,6 @@ ynsfhq.com ynshangji.com ynshhyy.com ynshijian.com -ynsj001.com ynsjg.com ynsjzyxh.com ynsmyy.com @@ -103998,6 +104521,7 @@ ynzs.com ynztrq.com ynztzh.com ynzy-tobacco.com +ynzzwl.com yo4399.com yoagoa.com yobo.ink @@ -104053,7 +104577,6 @@ yokemart.com yokmob.com yokong.com yolanda.hk -yolcdn.com yolcool.com yolewa.com yolexi.com @@ -104107,6 +104630,7 @@ yongmei0537.com yongnangroup.com yongootech.com yongqianbao.com +yongqischool.net yongridt.com yongsheng-sl.com yongshenggroup.com @@ -104131,6 +104655,7 @@ yongxinxuexiao.com yongxiuren.com yongyi-valve.com yongyoujia.com +yongyu.xyz yongyuenj.com yongzhegroup.com yongzhentang.com @@ -104160,6 +104685,7 @@ yooek.com yoofh.com yoogene.com yoohe.net +yoohouse.com yoojia.com yoojing.com yooknet.com @@ -104172,6 +104698,7 @@ yooxun.com yooyo.com yoozai.com yoozhe.com +yoozhibo.cc yoozhibo.net yoozoo.com yopoint.cc @@ -104190,7 +104717,6 @@ yorui.net yoseleather.com yostar.net yostatic.com -yosulife.com yotopic.com you-mi.net you03.com @@ -104305,6 +104831,7 @@ youke.com youked.com youkeda.com youkego.com +youkexueyuan.com youkia.com youkia.net youking.com @@ -104325,10 +104852,12 @@ youleliwu.com youlesp.com youletd.com youleyou.com +youlian.fun youlianfuwu.com youliangda.com youlianghz.com youliao.com +youliao.love youliaobaike.com youliaoyi.com youlingtong.com @@ -104524,7 +105053,6 @@ youxiqun.com youxishuo.com youxitexiao.com youxituoluo.com -youxiuhr.com youxiuhui.com youxiwugui.com youxixinzhi.com @@ -104571,7 +105099,6 @@ youyuan.com youyudf.com youyuegame.com youyur.com -youyuwei.com youyuwenhuay.com youyuwo.com youyy.com @@ -104583,7 +105110,6 @@ youzhan.org youzhanjia.com youzhao.com youzhenhua.com -youzhi.com youzhi.net youzhi99.com youzhicai.com @@ -104664,9 +105190,9 @@ ypppt.com yprh.com ypshengxian.com ypshop.net -ypshuo.com ypstech.com ypwater.com +ypxiixs.xyz ypyyjt.com ypzdw.com ypzhushou.com @@ -104710,7 +105236,6 @@ yqrtv.com yqsbz.com yqslmall.com yqsn.com -yqt365.com yqtg.cc yqtkgzbk.com yqtsgg.com @@ -104724,6 +105249,7 @@ yqxsge.cc yqxxjy.com yqy021.com yqybzhan.com +yqyu.com yqzww.cc yqzww.net yqzwww.com @@ -104756,6 +105282,7 @@ yrz.name ys-fj.com ys-oss.xin ys.cc +ys001.com ys0431.net ys121.com ys133.com @@ -104778,8 +105305,8 @@ ysclass.net yscq.com yscro.com ysczw.com -ysdaima.com -ysdp.online +ysdq8.com +ysdwe.asia ysedu.com ysej.com ysemi.com @@ -104808,8 +105335,8 @@ yskjz.com yskjzj.com yslawyer.com yslcw.com -yslidc.com yslpaint.com +yslqo.com yslw.com yslyhr.com ysmiji.com @@ -104839,7 +105366,6 @@ ystencdn.com ysts.cc ystsx.com ystzzy.com -ysudunwaf.com ysug.com ysupan.com ysw1950.com @@ -104881,12 +105407,14 @@ ytcbh.com ytccr.com ytchangyang.com ytcj.com +ytcnc.net ytcutv.com ytdaily.com ytdcloud.com yte1.com ytecn.com ytedi.com +ytelc.com yteng.net ytesting.com ytf8888.com @@ -104898,7 +105426,6 @@ ytgos.com ythairui.com ythospital.com ythouse.com -ytj9999.com ytjcpj.com ytjiage.com ytjob.com @@ -104937,6 +105464,7 @@ ytpowder.com ytpp.com ytpu.com ytqh-electric.com +ytrain.com ytrcw.com ytrlzyw.com ytrmtzx.com @@ -104982,6 +105510,7 @@ yuanchengroup.com yuanchengxiezuo.com yuanchuangyinyue.com yuancoder.com +yuanda-fm.com yuandacn.com yuandaocn.com yuandi.com @@ -105024,7 +105553,6 @@ yuano.cc yuanpanguoji.com yuanqiao.net yuanqiao.pw -yuanqidesk.com yuanqilt.com yuanqingsh.com yuanqisenlin.com @@ -105045,7 +105573,6 @@ yuanteng.net yuantest.com yuantiku.biz yuantiku.com -yuantk.com yuantongyizhan.com yuantoushuo.com yuantu.info @@ -105053,6 +105580,7 @@ yuantuedu.com yuantujun.com yuantutech.com yuanu.com +yuanvip.shop yuanweish.com yuanwind.com yuanwsk.com @@ -105142,6 +105670,7 @@ yueduwuxianpic.com yueduyun.com yuegongyutu.com yuegowu.com +yuegui.shop yueguisuchong.com yuehaifeed.com yuehaowy.com @@ -105176,6 +105705,7 @@ yuenwooping-truelegend.com yuenyled.com yuepaijia.com yueqi.com +yueqiji.com yueqikan.com yueqingchayuan.com yueqiweixiu.com @@ -105229,7 +105759,6 @@ yueyangyy.com yueyat.net yueye7.com yueyear.com -yueyitingxin.com yueyouxs.com yueyu114.com yueyuanzhiye.com @@ -105279,6 +105808,11 @@ yuhuanghuagong.com yuhucoldchain.com yuhuijob.com yuhx.com +yui06111shga.com +yui06130shga.com +yui06131shga.com +yui06161shga.com +yui06171shga.com yujia.com yujiahui.com yujianai520.com @@ -105286,6 +105820,7 @@ yujianpay.com yujianxiaomian.com yujiawuliu.com yujiefs.com +yujifruit.com yujingkj.com yujiu.vip yujpa.com @@ -105295,7 +105830,6 @@ yukaidi.com yukaiprecision.com yukeinfo.com yukeweb.com -yukework.com yukexinchem.com yukicat.net yukicomic.com @@ -105324,6 +105858,7 @@ yulingtianxia.com yulinhuaran.com yulinjue.com yulinqj.com +yulins.com yulinshidefu.com yulinyw.com yuliqx.com @@ -105350,7 +105885,6 @@ yumi.com yumimobi.com yumingguwen.com yumingyouhui.com -yummxx.com yummy.tech yumstone.com yun @@ -105359,13 +105893,12 @@ yun-dns.com yun-gu.com yun-idc.com yun-img.com +yun-jinrong.com yun-jintong.com yun-kai.com yun-live.com yun-wp.com -yun.wtf yun123.com -yun163.net yun5.vip yun61.com yun88.com @@ -105375,7 +105908,6 @@ yunannet.com yunaq.com yunarm.com yunassess.com -yunauth.com yunaw.com yunba.io yunban.com @@ -105475,6 +106007,7 @@ yunfuwuqiba.com yungangbj.com yungao-ssp.com yungao.mobi +yungbang.com yungengxin.com yungongchang.com yungotec.com @@ -105482,6 +106015,7 @@ yungou618.com yungouos.com yungpu.com yungu.org +yunguajibao.com yungujia.com yunhaicangshu.com yunhaike.com @@ -105505,7 +106039,6 @@ yunhulu.org yunhuotong.net yunifang.com yunify.com -yunikly.com yunio.com yunip.com yunipo.com @@ -105523,6 +106056,7 @@ yunjiemi.net yunjifarm.com yunjiglobal.com yunjing720.com +yunjingdian.net yunjinggo.com yunjinginc.com yunjitele.com @@ -105576,6 +106110,7 @@ yunos.com yunpan.com yunpanx.com yunparking.cloud +yunpay.cc yunpei.com yunpian.com yunpiao.net @@ -105585,7 +106120,6 @@ yunqi6.com yunqiba.com yunqifly.com yunqiju.com -yunqin.online yunqingugm.com yunqishi.net yunqishi8.com @@ -105693,7 +106227,6 @@ yunxish.com yunxiu.com yunxs.com yunxuetang.com -yunxukeji.xyz yunxunmedia.com yunxya.com yunyangwang.com @@ -105704,7 +106237,6 @@ yunyibiji.com yunyichong.com yunyihudong.com yunyin.org -yunyin.xin yunyingbiotech.com yunyingdashu.com yunyingmiao.com @@ -105740,7 +106272,6 @@ yunzhonghe.com yunzhu100.com yunzhuan.com yunzhuangbei.com -yunzhuru.com yunzhuxue.com yunzitraining.com yunzmall.com @@ -105751,11 +106282,11 @@ yunzuoye.net yunzz.net yuoucn.com yupao.com -yupaoad.com yupaowang.com yupeiholdings.com yupinny.com yupoo.com +yupu.com yuqianshu.com yuqiao.com yuqiaolong.com @@ -105766,6 +106297,7 @@ yuque.com yur09130og.com yur09140og.com yuren.org +yuriimg.com yurongoptical.com yurun.com yusa.me @@ -105782,6 +106314,7 @@ yushu5.com yushunews.com yusi.com yusi.tv +yusi123.com yusii.com yusii.net yusinvestment.com @@ -105793,11 +106326,13 @@ yusxz.com yutai365.com yutainews.com yutaoyouxi.com +yuteng.site yutennet.com yutian.cc yutianedu.com yutonad.com yutong.com +yutongplay.vip yutongzyc.com yutuwo.com yuucn.com @@ -105809,6 +106344,7 @@ yuwanjianshe.com yuwanyouxi.com yuweikuijianzhan.com yuweitek.com +yuweiyanwo.com yuwell.com yuwellgroup.com yuwen.net @@ -105816,8 +106352,8 @@ yuwen123.com yuwen360.com yuwenchaoshi.com yuwennews.com +yuwenxiandaihua.com yux.team -yuxian.shop yuxianall.com yuxiangwang0525.com yuxiaogroup.com @@ -105876,13 +106412,13 @@ yvzfgigpiwmofux.com yw11.com yw160.com yw2005.com -yw70.com ywart.com ywbank.com ywcbs.com ywclxp.com ywdier.com ywei.org +yweisugar.com ywfby.com ywgc.net ywgd.com @@ -105937,6 +106473,7 @@ yx93.com yx988.com yx99.com yxacc6.com +yxad.com yxaz.com yxbabe.com yxbao.com @@ -105948,6 +106485,7 @@ yxc.hk yxcal.com yxcax.com yxcc.net +yxcity.com yxcxfw.com yxdaily.com yxdd.com @@ -105960,6 +106498,7 @@ yxdown.com yxdr.com yxduo.com yxdwj.com +yxecg.com yxeht.com yxen.net yxflzs.com @@ -105972,6 +106511,7 @@ yxgczx.com yxgf.net yxgxbike.com yxgxw.com +yxgxz.com yxhao.com yxhapi.com yxhenan.com @@ -105984,7 +106524,6 @@ yxholding.com yxhqj.com yxhy.asia yxhyu.com -yxhyxh.com yxi.cc yxiannetgz.com yxianypin.com @@ -105994,7 +106533,6 @@ yxilogistics.com yximgs.com yxin18.com yxinbao.com -yxingfan.com yxintent.com yxit.net yxixy.com @@ -106008,6 +106546,7 @@ yxjyy.net yxk120.com yxkjlcd.com yxkxyghx.org +yxlaba.com yxlady.com yxlady.net yxle.net @@ -106034,6 +106573,7 @@ yxqiche.com yxrb.net yxrcw.com yxrj.com +yxsc33.com yxsea.com yxsos.com yxss.com @@ -106078,6 +106618,7 @@ yy2hd.com yy365.com yy4080.com yy502.com +yy520.com yy591.com yy845.com yy960.com @@ -106101,8 +106642,8 @@ yydl-china.com yyds.co yyds.pink yyds.space +yydsmh.com yydsok.com -yydsym.com yydszp.com yydy.com yydzh.com @@ -106113,6 +106654,7 @@ yyfax.com yyfdcw.com yyfqm.com yyfunning.com +yyg.com yyg120.com yygamedev.com yyge.com @@ -106122,10 +106664,8 @@ yygrammar.com yyh78.com yyha168.com yyhao.com -yyhdadx.com yyhh.com yyhn365.com -yyhxps.com yyhybz.com yyi100.com yyijt.com @@ -106209,6 +106749,7 @@ yyzls.com yyzqta.com yyzqtb.com yyzsoft.com +yyzxcj.com yyzzqk.com yyzzsem.com yz-iot.com @@ -106257,12 +106798,12 @@ yzfbgjj.com yzfc8.com yzfcdn.com yzfchat.com -yzfcw.com yzfdc.net yzfjy.com yzfrkf.com yzftpx.com yzfybj.com +yzgcsj.com yzgcyy.com yzggdj.com yzgjgs.com @@ -106271,6 +106812,7 @@ yzgzx.com yzh.li yzhcloud.com yzhdyy.com +yzhejin.com yzhi.cc yzhifupay.com yzhmyy.com @@ -106300,6 +106842,7 @@ yzjtech.com yzjyfz.com yzkdfcw.com yzkhfw.com +yzkimage.com yzkjpcb.com yzkos.com yzlngi.com @@ -106316,6 +106859,7 @@ yzmls.com yzmoney.com yznano.com yzncms.com +yznn.com yzntv.com yzops.net yzpanstar.com @@ -106337,10 +106881,10 @@ yzrshop.com yzrsks.com yzrss.com yzrzgroup.com +yzs.com yzs.io yzsbh.com yzsfuer.com -yzsgo.com yzshkjxx.com yzshyzz.com yzsljz.com @@ -106439,6 +106983,7 @@ zaifan.com zaigl.com zaiguahao.com zaih.com +zaihuangshi.com zaijia.com zaijiawan.com zailaboratory.com @@ -106468,6 +107013,7 @@ zakc.group zaker.com zaku.fun zakww.com +zalandode.com zallcn.com zallgo.com zallimg.com @@ -106568,8 +107114,10 @@ zbca.com zbcars.com zbchem.com zbcyrq.com +zbczce.com zbdedu.com zbdzy.com +zbfilm.com zbgarden.cc zbgedu.com zbgl.net @@ -106650,6 +107198,7 @@ zbyz.net zbz.com zbzb.org zbzdm.com +zbzw.com zbzw.la zc-gs100.com zc-ha.com @@ -106659,7 +107208,6 @@ zc173.com zc61.com zcaijing.com zcand.com -zcanjia.com zcbearing.com zcbgy.net zcccc.com @@ -106709,12 +107257,12 @@ zcobrand.com zcodesign.com zcofuture.com zcom.com +zcomc.com zcoming.com zcooler.com zcosz.com zcowh.com zcpc.net -zcpin.com zcpm.net zcpzj.com zcqh.com @@ -106766,7 +107314,6 @@ zdbiogene.com zdbnm.com zdcgc.com zdcjw18.com -zdcod.com zdctid.com zddhr.com zddhub.com @@ -106818,7 +107365,6 @@ zdsju.com zdslb.com zdsr.net zdtent.com -zduo.me zdvalves.com zdvc.net zdwafis.com @@ -106866,6 +107412,7 @@ zeesin.com zeeteq.com zeetzj.com zeewain.com +zegarkirepliki.pl zegnau.shop zego.im zeheng.com @@ -106879,6 +107426,7 @@ zejunpharma.com zeku.com zekv.com zelinai.com +zemc.vip zemismart.com zen-est.com zencheer.com @@ -106889,11 +107437,11 @@ zenglong3d.com zengrong.net zengslb.com zengyt.com -zengyuanfen.com zengzeng.net zenha.net zenhotspring.com zenith-group.net +zenithfashion.asia zenithmining.com zenithspace.net zenixauto.com @@ -106940,7 +107488,7 @@ zettlernb.com zetyun.com zeusai.xin zeuux.com -zevost.com +zeuux.org zexiaoqiao.com zeyu99.com zeyuan.shop @@ -106948,6 +107496,7 @@ zeyuan123.com zezhengcnc.com zezhenwangluo.com zezhuanggd.com +zf313.com zf360.net zf3d.com zfancy.net @@ -106999,6 +107548,7 @@ zg163.net zg3721.com zg388.com zg58.com +zgaode.com zgaxr.com zgazxxw.com zgbaili.cc @@ -107012,8 +107562,8 @@ zgbnt.com zgboke.com zgbszf.com zgby114.com +zgbywl.com zgc-bigdata.org -zgc-blockchain.com zgc261.com zgcbank.com zgcbb.com @@ -107083,6 +107633,7 @@ zggwy.org zggx100.com zggxgp.com zggxhj.com +zggxlbc.com zggxsmlt.com zggysyw.com zggzgg.com @@ -107109,7 +107660,6 @@ zgjcks.com zgjct.com zgjgw.com zgjhjy.com -zgjia.com zgjianfang.com zgjiaoyan.com zgjiemeng.com @@ -107124,7 +107674,6 @@ zgjrjw.com zgjrw.com zgjscopper.com zgjsdsj.com -zgjsfz.com zgjsks.com zgjsqw.com zgjsyw.com @@ -107269,10 +107818,13 @@ zgxk.org zgxledu.com zgxmlsp.com zgxnnews.com +zgxnyhyxh.com +zgxnyxh.com zgxrjy.com zgxsczdldak.com zgxue.com zgxytc.com +zgxzcj.com zgxzhjx.com zgybsfxh.com zgycgc.com @@ -107334,7 +107886,6 @@ zha.co zhads.com zhaeec.com zhai14.com -zhaiad.com zhaiba.com zhaibao.vip zhaibian.com @@ -107367,7 +107918,9 @@ zhangchangfa.com zhangchi.art zhangdongxuan.com zhangdu.com +zhangdu5.net zhangdu520.com +zhange8.com zhangferry.com zhangfupeng.com zhanggaoyuan.com @@ -107408,6 +107961,7 @@ zhangshengcw.com zhangshengrong.com zhangshi.org zhangshuchang.com +zhangsifan.com zhangtaiwuye.com zhangtu.com zhangu365.com @@ -107470,6 +108024,7 @@ zhantai.com zhantuo.com zhanuan.com zhanxingfang.com +zhanyouyun.com zhanyugroup.com zhanzhanbao.com zhanzhang.net @@ -107529,6 +108084,7 @@ zhaopin.com zhaopin400.com zhaopin668.com zhaopinbao.me +zhaopingou.com zhaoqianwang.com zhaoqiufa.com zhaoqt.net @@ -107547,9 +108103,11 @@ zhaosheng.com zhaosheng365.com zhaoshixi.com zhaoshizhou.xyz +zhaosifang.com zhaosuliao.com zhaosw.com zhaota8.com +zhaotaicaiyin.com zhaouc.com zhaouc.net zhaowenyu.com @@ -107589,7 +108147,6 @@ zhbx.net zhby-point.com zhcic.com zhcidian.com -zhcil.com zhckw.com zhcnews.com zhcommerce.com @@ -107653,6 +108210,7 @@ zhendong365.com zhendonggames.com zhene.net zhenfacloud.com +zhenfangyuan.com zhenfund.com zhengbang.com zhengben56group.com @@ -107660,6 +108218,7 @@ zhengbiaoke.com zhengcaimall.com zhengcaishangcheng.com zhengchang.com +zhengdaijingji.com zhengdaojiapei.com zhengdapeanut.com zhengdichaiqian.com @@ -107711,6 +108270,7 @@ zhengyang-tek.com zhengyaokeji.net zhengyee.com zhengyounet.com +zhengyouyoule.com zhengyuanfu.com zhengyutuliao.com zhengzai.tv @@ -107867,7 +108427,6 @@ zhiexa.com zhifa.cc zhifa315.com zhifang.com -zhifangju.com zhifayiyuan.com zhifeishengwu.com zhifengtang.com @@ -107880,6 +108439,7 @@ zhifuquanzi.com zhifure.com zhifux.com zhifuzi.com +zhigaometal.com zhige.net zhigongfu.com zhigou.com @@ -107899,7 +108459,6 @@ zhiheiot.com zhihejia.com zhihejiaoyu.com zhihemobi.com -zhihenglawyer.com zhihengwangchen.com zhihepartners.com zhihevip.com @@ -107912,6 +108471,7 @@ zhihudsp.com zhihuichuangyanshi.com zhihuiep.com zhihuifangdong.net +zhihuihongze.com zhihuihub.com zhihuihuiwu.com zhihuihutong.com @@ -107932,7 +108492,7 @@ zhihuiyunbo.com zhihuizeyuan.com zhihuizhangyu.com zhihuizp.com -zhihupe.com +zhihuoseo.com zhihur.com zhiji.com zhijia.com @@ -107941,6 +108501,7 @@ zhijianbao.com zhijianchuhai.com zhijianfengyi.com zhijiangames.com +zhijiannuoche.com zhijiaow.com zhijiaow.net zhijiapro.com @@ -107963,6 +108524,7 @@ zhikexun.com zhikongyangpin.com zhikuai.com zhikubao.net +zhil.cloud zhilandaren.com zhilehuo.com zhileiqiye.com @@ -107988,6 +108550,7 @@ zhimantian.com zhimap.com zhimapay.net zhimaquan.net +zhimaruanjian.com zhimatech.com zhimawenda.com zhimaxkf.com @@ -108009,6 +108572,7 @@ zhinengxiehui.com zhinengyujia.com zhinet.com zhinianboke.com +zhiniceshi.com zhinikefu.com zhiniu8.com zhinvnetwork.com @@ -108080,7 +108644,6 @@ zhixiaohuoke.com zhixiaosj.com zhixiaowang.com zhixin-semi.com -zhixing.icu zhixingapp.com zhixingit.com zhixingjj88.com @@ -108117,6 +108680,7 @@ zhiyuanshijie.com zhiyuanxinglvye.com zhiyuanyun.com zhiyuanzhongyi.com +zhiyuapp.com zhiyun-cn.com zhiyun-tech.com zhiyunwang.net @@ -108133,6 +108697,7 @@ zhizhizhi.net zhizhonghl.com zhizhoukeji.com zhizhoumi.com +zhizhu35.net zhizhucms.com zhizhuip.com zhizhuma.com @@ -108177,6 +108742,7 @@ zhlm.com zhltech.net zhltraffic.com zhlyen.com +zhlzw.com zhmag.com zhmedcenter.com zhmf.com @@ -108244,7 +108810,6 @@ zhongguogouliang.com zhongguoguwan.com zhongguohao123.com zhongguohuo.com -zhongguolaoqu.com zhongguopeixun.net zhongguose.com zhongguosou.com @@ -108252,7 +108817,6 @@ zhongguoss.com zhongguowangshi.com zhongguoym.com zhonggushipping.com -zhonghaiqishengkeji.xyz zhonghaitech.com zhonghaojituan.com zhonghengyiyao.com @@ -108276,6 +108840,7 @@ zhonghuvalve.com zhongji.cc zhongjian.run zhongjiangapp.com +zhongjianyiliao.com zhongjiaochuxing.com zhongjijidian.com zhongjincc.com @@ -108378,6 +108943,7 @@ zhongxiangwang.co zhongxiaole.net zhongxiaoyl.com zhongxingglove.com +zhongxinjzzs.com zhongxinkeji.vip zhongxinlm.com zhongxinwei.net @@ -108387,6 +108953,7 @@ zhongxues.com zhongxuewuyou.net zhongxuewy.net zhongxunrunda.com +zhongxuntv.com zhongxuyiyuan.com zhongyagroup.com zhongyangkeji.com @@ -108422,9 +108989,11 @@ zhongyue001.com zhongyuefuwu.com zhongyulian.com zhongyunjt.net +zhongyunjy.com zhongyunqianbao.com zhongyuyx.com zhongzaisheng.net +zhongzeny.com zhongzetherapeutics.com zhongzhaizs.com zhongzhao.com @@ -108459,12 +109028,13 @@ zhoujianhui.com zhoujifood.com zhoujunji.com zhoukaiwen.com +zhoulaoshi.club zhoulingjie.com -zhoulishan.site zhoupu123.com zhoupudata.com zhouql.vip zhouweitong.site +zhouxiaoben.info zhouxingchi.info zhouxuanyu.com zhouyi.biz @@ -108484,6 +109054,7 @@ zhrct.com zhrczp.com zhrtc.com zhsapphire.com +zhsc.net zhsecurity.net zhsho.com zhshw.com @@ -108512,7 +109083,6 @@ zhuangbutong.com zhuanghebm.com zhuangji.net zhuangjiba.com -zhuangjidiy.com zhuangjinshanhe.com zhuangjizhuli.net zhuangkou.com @@ -108555,6 +109125,9 @@ zhuayou.com zhuayoukong.com zhuayuya.com zhuazi.com +zhubai.love +zhubai.pub +zhubaijia.com zhubajie.com zhubajie.la zhubangbang.com @@ -108595,6 +109168,7 @@ zhuige.com zhuigong.com zhuiguang.com zhuiguangzhe.com +zhuihuodong.com zhuimabk.com zhuimeng8.com zhuimengzhu.com @@ -108637,6 +109211,7 @@ zhujiw.com zhujiwanjia.com zhujiwiki.com zhujiwu.com +zhujizixun.com zhukai.com zhukang.tech zhukao666.com @@ -108644,6 +109219,7 @@ zhuke.com zhul.in zhulang.com zhulang.net +zhulanli.com zhulemei.com zhulianwines.com zhulincat.com @@ -108704,6 +109280,7 @@ zhuoquapp.com zhuoqun.info zhuoqun.xyz zhuoqundianli.com +zhuoshigroup.com zhuoshixiong.com zhuotingwl.com zhuoyachina.com @@ -108809,7 +109386,6 @@ zhylyy.com zhyouliang.com zhyourun.com zhysdxl.com -zhytstudio.com zhyymall.com zhyyz.com zhz.com @@ -108850,12 +109426,12 @@ zidanduanxin.com zidanduanxin.net zidg.com zidiankeji.com -zidianzaixian.com zidoo.tv zidootv.com zifandiaosu.com zifumao.com zigaokj.com +zige365.com zigeer.com zigonggroup.com ziguhonglan.com @@ -108915,6 +109491,7 @@ zilongshanren.com zilrms.com ziluolanh.com zimilan.com +zimlev.com zimudashi.com zimufy.com zimuism.com @@ -108980,6 +109557,7 @@ ziwuyunjiao.com zixia.com zixiaomao.com zixijiaoshi.com +zixingxinwen.com zixueguoxue.com zixuejie.com zixueren.com @@ -109019,6 +109597,7 @@ ziyuanm.com ziyuanniao.com ziyuanshare.cc ziyuantun.com +ziyuantx.com ziyuanxiyanly.com ziyuanyuan.com ziyuen.com @@ -109026,12 +109605,15 @@ ziyun.com ziyunshanju.com zizailvyou.com zizdog.com +zizhengfang.com +zizhigx.com zizhijie.com zizhuauto.com zizhuhui.com zizhupark.com zizhuyuangongyuan.com zizhuyunxuan.com +zizige.com zizizaizai.com zizizizizi.com zizyw.com @@ -109154,6 +109736,7 @@ zjcyxh.com zjcyyy.com zjda.com zjdadeyy.com +zjdashi.com zjdata.net zjdeju.com zjdeluo.com @@ -109271,7 +109854,6 @@ zjhnlianzhong.com zjhnrb.com zjhospital.net zjhpyy.com -zjhr.com zjhrnet.com zjhslyw.com zjhtcm.com @@ -109328,7 +109910,6 @@ zjjrtv.com zjjsbank.com zjjsit.com zjjsjt.com -zjjslawyer.com zjjstzhb.com zjjsw.com zjjta.com @@ -109512,6 +110093,7 @@ zjsuntex.com zjsw.org zjswxpx.com zjsxkj.com +zjsxlt.com zjsxrz.com zjsxss.com zjsyyhyxh.com @@ -109614,7 +110196,6 @@ zjxxkx.com zjxxt.com zjxymy.com zjxzgrd.com -zjyangfan.com zjyanxing.com zjyari.com zjycpx.com @@ -109638,6 +110219,7 @@ zjyzpcxx.com zjza.com zjzajsjt.com zjzcec.com +zjzcen.com zjzcj.com zjzfj.com zjzfjs.com @@ -109660,6 +110242,7 @@ zjzrzyjy.com zjzs.net zjzsa.com zjzsco.com +zjzsxb.com zjzwlab.com zjzy.com zjzybiotech.com @@ -109699,6 +110282,7 @@ zkicme.com zking.com zkjan.com zkjds.com +zkkailiaoji.com zkl2333.com zkmeiling.com zkmob.net @@ -109709,7 +110293,6 @@ zkpk.org zkrdlab.com zkrsks.com zksbxhyxh.com -zkscaiot.com zkscgj.com zksglaser.com zkshare.com @@ -109718,6 +110301,7 @@ zksps.com zksyzy.com zktecn.com zkteco.com +zkteco.xin zktecoiot.com zktecosj.com zktecowebui.com @@ -109735,7 +110319,6 @@ zkxblog.com zkxww.com zkyai.com zkydib.com -zkyg.com zkyl.vip zkyouxi.com zkyxc.com @@ -109770,6 +110353,7 @@ zlgmcu.com zlgpy.com zlgsj.com zlh-zh.com +zlhome.com zlhospital.com zlhui.com zlibs.com @@ -109784,7 +110368,6 @@ zljx.net zlkb.net zlketang.com zlkj20.com -zllinks.com zlm4.com zlmlt.com zlnewlife.com @@ -109808,6 +110391,7 @@ zlt365.com zlttxl.com zluren.com zlview.com +zlvod.com zlwh2026.com zlwl.vip zlwlhse.com @@ -109857,6 +110441,7 @@ zmgrcw.com zmhttp.com zmifi.com zmingcx.com +zmirrordemo.com zmis.me zmister.com zmjiudian.com @@ -109881,7 +110466,6 @@ zmshz.com zmsq.com zmssh.com zmtpc.com -zmtqsh.com zmtquan.com zmufivehospital.com zmumu.com @@ -109894,6 +110478,7 @@ zmyyc.com zmzb.com zmzjt.com zn99.com +znba.net znbo.com zncar.com zncmjt.com @@ -109925,11 +110510,11 @@ znlcn.org znlerp.com znlh.com znmq.com -znncb372.com znnu.com znonline.net znp9.com znpin.com +znpla.space znrfwy.com znrom.com znrsc.com @@ -109965,6 +110550,7 @@ zocolor.com zocoxx.com zodgame.me zoe360.com +zoebon.com zoeeasy.com zoeess.com zoform.com @@ -110015,6 +110601,7 @@ zongmutech.com zongs365.com zongshengjituan.com zongtiku.com +zongxiankj.com zongyiconverge.com zongyifile.com zongyigame.com @@ -110026,7 +110613,6 @@ zonhen.com zonsengroup.com zonsenmotor.com zonst.com -zonta-suzhou.com zontes.com zoocer.com zoocoffee.com @@ -110049,7 +110635,6 @@ zootope.ink zooyoo.cc zoqlan.com zoranchem.com -zorocloud.com zoroli.com zorrospray.com zorun.com @@ -110094,6 +110679,7 @@ zpascal.net zpb365.com zpc-cn.com zpcdi.com +zpchaji.com zpcmshopping.com zpedu.com zpedu.org @@ -110107,7 +110693,6 @@ zpm.so zpmc.com zpmg.com zpparts.com -zprc.com zpstar.com zpt966033.com zptq.com @@ -110125,14 +110710,17 @@ zqcaf.com zqcloud.com zqcloudgame.com zqcyzg.com +zqdns37.vip zqedu.net zqfdc.net zqgame.com zqgjz1312.com zqgreen.com zqhuahui.com +zqhuwkc.com zqids.com zqin758.xyz +zqjcedu.com zqjiese.com zqjinneng.com zqlian.com @@ -110164,6 +110752,7 @@ zrahh.com zran88.com zrblog.com zrblog.net +zrbn.ltd zrbx.com zrcaifu.com zrcbank.com @@ -110214,6 +110803,7 @@ zsbeike.com zsboai.com zsbqgz.com zsbsoft.com +zsbus.wiki zsbyw.com zsc-group.com zscbd.com @@ -110282,7 +110872,6 @@ zsmls.com zsmw.net zsmyy.com zsmz.com -zsph.com zspharm.com zsquant.com zsqx.com @@ -110321,13 +110910,11 @@ zsxq100.com zsxsoft.com zsyanxuan.com zsyknk.com +zsynjt.com zsythink.net zsytit.com -zsywang.com -zsyxxc.com zsyyart.com zszk.net -zsznz.com zszq.com zszxsz.com zszyss.com @@ -110533,6 +111120,7 @@ zulongacmall.com zumbacn.com zumulv.com zun.com +zun.gd zun9.com zunsou.com zunxiang17.com @@ -110584,7 +111172,6 @@ zuoyebao.com zuoyebao.net zuoyehezi.com zuoyesou.com -zuoyeti.com zuoyou-sofa.com zuozu.net zupig.com @@ -110629,6 +111216,7 @@ zwayoptik.com zwaztizp.com zwbdata.com zwcad.com +zwcctv.com zwcnw.com zwcsm.com zwcuo.com @@ -110662,6 +111250,7 @@ zwkf.net zwlhome.com zwoasi.com zwoptical.com +zwoptics.com zwpyyds.com zwslshy.com zwsmds.com @@ -110682,7 +111271,7 @@ zwzrent.com zwzsh.net zwzyzx.com zx-tour.com -zx.com +zx-xcx.com zx0093.com zx017.com zx017.net @@ -110692,6 +111281,7 @@ zx10000.com zx110.org zx1234.com zx181.com +zx18x.com zx350zx.com zx42195.com zx7b.com @@ -110701,16 +111291,15 @@ zx990.com zxblinux.com zxbook.net zxbzr.com -zxc123zxc123.xyz zxchemgroup.com zxcmk.com zxcoder.com zxczw.com zxd.com zxd666.com -zxdj.club zxdkj.com zxdu.net +zxdyw.com zxerp.com zxfw888.com zxfwgj.com @@ -110824,11 +111413,13 @@ zybest.com zybtp.com zybuluo.com zybwhsb.com +zybwj.cc zybz518.com zyc123.com zyccst.com zycits.com zycitscn.com +zycjcrz.org zycmmt.com zyctd.com zyczg.com @@ -110852,6 +111443,7 @@ zygjtzjt.com zygs.com zygx8.com zygxxs.com +zygxy.online zyh365.com zyhao.com zyhbjt.com @@ -110865,12 +111457,14 @@ zyiis.net zying.net zyip.com zyiwater.com +zyixinx.com zyjhzyy.com zyjiajiao.com zyjjt.com zyjkwh.com zyjoygame.com zyjtgas.com +zyjthb.com zyjymall.com zyjyxx.com zyjyyun.com @@ -110880,7 +111474,6 @@ zykjct.com zykjgame.com zykjnet.com zykpic.com -zyktech.com zykths.com zyku.net zyl.me @@ -110888,6 +111481,7 @@ zylianto.com zymc1.com zymkcdn.com zymkshop.com +zymreal.com zyms8.me zyoffice.com zyoo.net @@ -110898,11 +111492,13 @@ zypharm.com zyplayer.com zyq.today zyq366.com +zyqcs.com zyqjg.com zyqjs.com zyqxt.com zyrack-china.com zyrb.com +zyrc168.com zyrj.org zyrm.com zyrykbiandao.com @@ -110935,14 +111531,12 @@ zyxr.com zyxxlyg.com zyxyfy.com zyxzyyy.com -zyyct.com zyydb.com zyydjk.net zyyfy.com zyyimin.com zyykj168.com zyylee.com -zyyun.xyz zyz119.com zyzhan.com zyzl120.com @@ -110951,6 +111545,7 @@ zz-hh.com zz-invest.com zz.ci zz123456789.xyz +zz2024.com zz2z.com zz314.com zz34.com @@ -110978,7 +111573,9 @@ zzccp.com zzcdnx.com zzcjby.com zzcjxy.com -zzclass.com +zzcm1.com +zzcm2.com +zzcm5.com zzcmjn.com zzcomm.com zzcrcgas.com @@ -111015,7 +111612,6 @@ zzhfkm.com zzhybz.com zzicpa.com zzidc.com -zzimti.com zzjdgcxx.com zzjianyun.com zzjidi.com @@ -111056,14 +111652,12 @@ zzpzh.com zzqckj.com zzqfte.com zzqklm.com -zzqrgs3148.vip zzqss.com zzquan9.com zzqudu.com zzqxs.com zzqz2024.com zzqzz.com -zzr.cc zzrc.net zzrcw.net zzrmyy.com @@ -111085,6 +111679,7 @@ zzsmt.com zzsnewell.com zzspider.com zzsspnode.com +zzssptop.com zzsteel.com zzstep.com zzszbsw.com @@ -111146,7 +111741,6 @@ zzzhtc.com zzzj.com zzzla.com zzzlsh.com -zzzmap.com zzznkq.com zzzppp.com zzzqqp.com @@ -111158,3 +111752,581 @@ zzzyy.com zzzyyy.com zzzzaaaa.com zzzzzz.me +2mdn-cn.net +2mdn.net +a1.mzstatic.com +a2.mzstatic.com +a3.mzstatic.com +a4.mzstatic.com +a5.mzstatic.com +account-cn.alibabacloud.com +activate.activation-v2.kaspersky.com +activation-v2.geo.kaspersky.com +activation-v2.kaspersky.com +adcdownload.apple.com +adcdownload.apple.com.akadns.net +admob-cn.com +adservice.google.com +afcs.dell.com +ai.zhaomi.cn +alibaba.cdn.steampipe.steamcontent.com +amp-api-edge-lb-cn.itunes-apple.com.akadns.net +amp-api-edge-lb.itunes-apple.com.akadns.net +amp-api-edge.apps.apple.com +amp-api-edge.music.apple.com +amp-api-search-edge.apps.apple.com +amp-api-updates.apps.apple.com +amp-api.apps.apple.com +amp-api.media.apple.com +amp-api.music.apple.com +aod-ssl.itunes.apple.com +aod.itunes.apple.com +api-edge.apps.apple.com +api.alibabacloud.com +app-analytics-services.com +app-measurement-cn.com +app-measurement.com +app-site-association.cdn-apple.com +appldnld.apple.com +appldnld.g.aaplimg.com +appleid.cdn-apple.com +apps.mzstatic.com +apps5.oingo.com +apptrailers.itunes.apple.com +auth.music.apple.com +avail.googleflights.net +azuremigrate.download.prss.microsoft.com +azuremigratetest.download.prss.microsoft.com +azurestackhub.download.prss.microsoft.com +azurestackhubuat.download.prss.microsoft.com +b.c2r.ts.cdn.office.net +bag-cdn.itunes-apple.com.akadns.net +bag.itunes.apple.com +beacons.gcp.gvt2.com +beacons.gvt2.com +beacons2.gvt2.com +beacons3.gvt2.com +bj1.api.bing.com +bookkeeper.itunes.apple.com +c.admob.com +c.android.clients.google.com +c.pki.goog +cache-management-prod.google.com +cache.pack.google.com +cbdstest.download.prss.microsoft.com +cdn-cn.apple-mapkit.com +cdn-cn1.apple-mapkit.com +cdn-cn2.apple-mapkit.com +cdn-cn3.apple-mapkit.com +cdn-cn4.apple-mapkit.com +cdn.ampproject.org +cdn.apple-mapkit.com +cdn.globalsigncdn.com.cdn.cloudflare.net +cdn1.apple-mapkit.com +cdn2.apple-mapkit.com +cdn3.apple-mapkit.com +cdn4.apple-mapkit.com +cds-cdn.v.aaplimg.com +cds.apple.com +cds.apple.com.akadns.net +cdsassets.apple.com +certs-lb.apple.com.akadns.net +certs.apple.com +checkin.gstatic.com +cl1-cdn.origin-apple.com.akadns.net +cl1.apple.com +cl2-cdn.origin-apple.com.akadns.net +cl2-cn.apple.com +cl2.apple.com +cl2.apple.com.edgekey.net.globalredir.akadns.net +cl3-cdn.origin-apple.com.akadns.net +cl3.apple.com +cl4-cdn.origin-apple.com.akadns.net +cl4-cn.apple.com +cl4.apple.com +cl5-cdn.origin-apple.com.akadns.net +cl5.apple.com +clickserve.cc-dt.com +clickserve.dartsearch.net +clickserver.googleads.com +client-api.itunes.apple.com +clientflow.apple.com +clientflow.apple.com.akadns.net +clientperipherals.dell.com +clientservices.googleapis.com +cma.itunes.apple.com +cn-smp-paymentservices.apple.com +cn.alibabacloud.com +cn.download.nvidia.com +cn.widevine.com +cn.windowssearch.com +collaborate.download.prss.microsoft.com +collaborateppe.download.prss.microsoft.com +communities.apple.com +configuration.apple.com +configuration.apple.com.akadns.net +connectivitycheck.gstatic.com +crashlyticsreports-pa.googleapis.com +crl-lb.apple.com.akadns.net +crl.apple.com +crl.globalsign.net +crl.kaspersky.com +crl.pki.goog +crls.pki.goog +csi.gstatic.com +cstat.apple.com +cstat.cdn-apple.com +ctdsb.clouddiffuse.xyz +ctldl.windowsupdate.com +cueme-api.quark.cn +customization-cdn.dell.com +dartsearch-cn.net +dc1-cert.ksn.kaspersky-labs.com +dc1-file.ksn.kaspersky-labs.com +dc1-pp.ksn.kaspersky-labs.com +dc1-st.ksn.kaspersky-labs.com +dc1.ksn.kaspersky-labs.com +dd-cdn.origin-apple.com.akadns.net +dds.dell.com +dejavu.apple.com +developer.microsoft.com +devimages-cdn.apple.com +devstreaming-cdn.apple.com +dg-meta.video.google.com +discussionschinese.apple.com +dl.dell.com +dl.google.com +dl.l.google.com +dnl-00.geo.kaspersky.com +dnl-01.geo.kaspersky.com +dnl-02.geo.kaspersky.com +dnl-03.geo.kaspersky.com +dnl-04.geo.kaspersky.com +dnl-05.geo.kaspersky.com +dnl-06.geo.kaspersky.com +dnl-07.geo.kaspersky.com +dnl-08.geo.kaspersky.com +dnl-09.geo.kaspersky.com +dnl-10.geo.kaspersky.com +dnl-11.geo.kaspersky.com +dnl-12.geo.kaspersky.com +dnl-13.geo.kaspersky.com +dnl-14.geo.kaspersky.com +dnl-15.geo.kaspersky.com +dnl-16.geo.kaspersky.com +dnl-17.geo.kaspersky.com +dnl-18.geo.kaspersky.com +dnl-19.geo.kaspersky.com +doubleclick-cn.net +doubleclick.net +download.developer.apple.com +download.microsoft.com +download.mlcc.google.com +download.tensorflow.google.com +download.visualstudio.microsoft.com +downloaddispatch.itunes.apple.com +dreamspark.download.prss.microsoft.com +dreamsparkuat.download.prss.microsoft.com +ea2cn-dev-outlet.dell.com +ea2cn-prod-outlet.dell.com +ea2cn-staging-outlet.dell.com +edge.geo.kaspersky.com +emoi-cncdn.bing.com +end-api.shallow.ink +end.shallow.ink +entitlements-edge.itunes.apple.com +experiments.apple.com +f.c2r.ts.cdn.office.net +fcs.dell.com +fides-pol.apple.com +firebase-settings.crashlytics.com +fontfiles.googleapis.com +fonts.googleapis.com +fonts.gstatic.com +fpinit.itunes.apple.com +fta.dell.com +ftaapj.dell.com +ftaemea.dell.com +ftasitapj.dell.com +g0.gstatic.com +g1.gstatic.com +g2.gstatic.com +g3.gstatic.com +gbxgateway-dev.dell.com +gbxgateway.dell.com +geetest.datasink.sensorsdata.cn +gog.qtlglb.com +gonglchuangl.net +gongyichuangyi.net +google-analytics-cn.com +google-analytics.com +googleadservices-cn.com +googleadservices.com +googleanalytics.com +googleapis-cn.com +googleapps-cn.com +googleflights-cn.net +googleoptimize-cn.com +googleoptimize.com +googlesyndication-cn.com +googlesyndication.com +googletagmanager-cn.com +googletagmanager.com +googletagservices-cn.com +googletagservices.com +googletraveladservices-cn.com +googletraveladservices.com +googlevads-cn.com +gs-loc-cn.apple.com +gs-loc.apple.com +gsp10-ssl-cn.ls.apple.com +gsp11-cn.ls.apple.com +gsp12-cn.ls.apple.com +gsp13-cn.ls.apple.com +gsp4-cn.ls.apple.com +gsp4-cn.ls.apple.com.edgekey.net.globalredir.akadns.net +gsp5-cn.ls.apple.com +gsp85-cn-ssl.ls.apple.com +gspe11-2-cn-ssl.ls.apple.com +gspe12-cn-ssl.ls.apple.com +gspe19-2-cn-ssl.ls-apple.com.akadns.net +gspe19-2-cn-ssl.ls.apple.com +gspe19-cn-ssl.ls.apple.com +gspe19-cn.ls-apple.com.akadns.net +gspe19-cn.ls.apple.com +gspe21-ssl.ls.apple.com +gspe35-ssl.ls.apple.com +gspe79-cn-ssl.ls.apple.com +gspe85-cn-ssl.ls.apple.com +gstatic-cn.com +gstaticadssl.l.google.com +gtm.oasisfeng.com +guzzoni-apple-com.v.aaplimg.com +guzzoni.apple.com +guzzoni.smoot.apple.com +hellofontpreview.oss-cn-beijing.aliyuncs.com +hellowebfonts.oss-cn-beijing.aliyuncs.com +hospital.pku.edu.cn +i.dell.com +i.pki.goog +images-cn-8.ssl-images-amazon.com +images-cn.ssl-images-amazon.com +images.apple.com.edgekey.net.globalredir.akadns.net +imasdk.googleapis.com +inappcheck-cn.itunes-apple.com.akadns.net +inappcheck-lb.itunes-apple.com.akadns.net +inappcheck.itunes.apple.com +init-kt.apple.com +init-p01md-lb.push-apple.com.akadns.net +init-p01md.apple.com +init-p01st-lb.push-apple.com.akadns.net +init-p01st.push.apple.com +init-s01st-lb.push-apple.com.akadns.net +init-s01st.push.apple.com +init.ess.apple.com +init.gc-lb.apple.com.akadns.net +init.gc.apple.com +init.itunes.apple.com +iosapps.itunes.apple.com +iosapps.itunes.g.aaplimg.com +ipcdn.apple.com +iphone-ld.apple.com +iphone-ld.origin-apple.com.akadns.net +is-ssl.mzstatic.com-cn-lb.itunes-apple.com.akadns.net +is1-ssl.mzstatic.com +is1.mzstatic.com +is2-ssl.mzstatic.com +is2.mzstatic.com +is3-ssl.mzstatic.com +is3.mzstatic.com +is4-ssl.mzstatic.com +is4.mzstatic.com +is5-ssl.mzstatic.com +is5.mzstatic.com +itacademy.download.prss.microsoft.com +itacademyuat.download.prss.microsoft.com +itunes-apple.com.akadns.net +itunes.apple.com +itunesconnect.apple.com +izattime.qcomgeo2.com +js-cdn.music.apple.com +km.support.apple.com +ksn-cinfo-geo.kaspersky-labs.com +ksn-cinfo.geoksn.kaspersky.com +ksn-crypto-info-geo.kaspersky-labs.com +ksn-crypto-kas-geo.kaspersky-labs.com +ksn-crypto-tcert-geo.kaspersky-labs.com +ksn-crypto-url-geo.kaspersky-labs.com +ksn-crypto-verdict-geo.kaspersky-labs.com +ksn-crypto-wifiplus-geo.kaspersky-labs.com +ksn-crypto-wifiplus.geoksn.kaspersky.com +ksn-dc1-cert.geoksn.kaspersky.com +ksn-dc1-file.geoksn.kaspersky.com +ksn-dc1.geoksn.kaspersky.com +ksn-file-geo.kaspersky-labs.com +ksn-file.geoksn.kaspersky.com +ksn-info-geo.kaspersky-labs.com +ksn-info.geoksn.kaspersky.com +ksn-kas.geoksn.kaspersky.com +ksn-mdr.geoksn.kaspersky.com +ksn-tcert-geo.kaspersky-labs.com +ksn-tcert.geoksn.kaspersky.com +ksn-url-geo.kaspersky-labs.com +ksn-url.geoksn.kaspersky.com +ksn-verdict-geo.kaspersky-labs.com +ksn-verdict.geoksn.kaspersky.com +lex.download.prss.microsoft.com +lexuat.download.prss.microsoft.com +lv.queniujq.cn +maps.apple.com +mbs.download.prss.microsoft.com +mdr.ksn.kaspersky-labs.com +mensura.cdn-apple.com +mesu-cdn.apple.com.akadns.net +mesu-china.apple.com.akadns.net +mesu.apple.com +misc-assets.itunes.apple.com +ml.cdn-apple.com +moocs.unipus.cn +mpnbenefits.download.prss.microsoft.com +mpnbenefitsrtl.download.prss.microsoft.com +mpnbenefitsrtluat.download.prss.microsoft.com +msdn.download.prss.microsoft.com +msdprod-ad.download.prss.microsoft.com +msproduct.download.prss.microsoft.com +music.apple.com +musicstatus.music.apple.com +mvod.itunes.apple.com +myapp.itunes.apple.com +myvs.download.prss.microsoft.com +nexus.dell.com +np-edge.itunes.apple.com +ntp.aliyun.com +ntp.tencent.com +ntp1.aliyun.com +ntp1.tencent.com +ntp2.aliyun.com +ntp2.tencent.com +ntp3.aliyun.com +ntp3.tencent.com +ntp4.aliyun.com +ntp4.tencent.com +ntp5.aliyun.com +ntp5.tencent.com +ntp6.aliyun.com +ntp7.aliyun.com +o.pki.goog +ocsp.apple.com +ocsp.pki.goog +ocsp2.apple.com +oemsoc.download.prss.microsoft.com +oemsocuat.download.prss.microsoft.com +officecdn.microsoft.com +officemkt.download.prss.microsoft.com +officemktuat.download.prss.microsoft.com +opencourse.pku.edu.cn +oscdn.apple.com +oscdn.origin-apple.com.akadns.net +osrelease.download.prss.microsoft.com +osxapps.itunes.apple.com +osxapps.itunes.g.aaplimg.com +p.cdn.persaas.dell.com +p00.upd.kaspersky.com +p01.upd.kaspersky.com +p02.upd.kaspersky.com +p03.upd.kaspersky.com +p04.upd.kaspersky.com +p05.upd.kaspersky.com +p06.upd.kaspersky.com +p07.upd.kaspersky.com +p08.upd.kaspersky.com +p09.upd.kaspersky.com +p1-juejin.byteimg.com +p10.upd.kaspersky.com +p11.upd.kaspersky.com +p12.upd.kaspersky.com +p13.upd.kaspersky.com +p14.upd.kaspersky.com +p15.upd.kaspersky.com +p16.upd.kaspersky.com +p17.upd.kaspersky.com +p18.upd.kaspersky.com +p19.upd.kaspersky.com +p2-juejin.byteimg.com +p3-juejin.byteimg.com +p3-novel.byteimg.com +p4-juejin.byteimg.com +p5-juejin.byteimg.com +p6-juejin.byteimg.com +p6-novel.byteimg.com +p7-juejin.byteimg.com +p8-juejin.byteimg.com +p9-juejin.byteimg.com +pagead-googlehosted.l.google.com +pancake.apple.com +pba0.apple.com +pd-nk.itunes.apple.com +pd.itunes.apple.com +performanceparameters.googleapis.com +pki-goog.l.google.com +play.itunes.apple.com +play.music.apple.com +probe.siri.apple.com +prod-controlbe.floonet.goog +prod-databe.floonet.goog +prod-support.apple-support.akadns.net +prod.databe.floonet.goog +publicassets.cdn-apple.com +qiao-cn.com +qpx.googleflights.net +recaptcha-cn.net +recaptcha.net +redirector.bdn.dev +redirector.c.chat.google.com +redirector.c.mail.google.com +redirector.c.pack.google.com +redirector.c.play.google.com +redirector.c.youtubeeducation.com +redirector.gcpcdn.gvt1.com +redirector.gvt1.com +redirector.offline-maps.gvt1.com +redirector.snap.gvt1.com +redirector.xn--ngstr-lra8j.com +refresh-bkg.activation-v2.kaspersky.com +rsm.download.prss.microsoft.com +s.mzstatic.com +s00.upd.kaspersky.com +s01.upd.kaspersky.com +s02.upd.kaspersky.com +s03.upd.kaspersky.com +s04.upd.kaspersky.com +s05.upd.kaspersky.com +s06.upd.kaspersky.com +s07.upd.kaspersky.com +s08.upd.kaspersky.com +s09.upd.kaspersky.com +s1.mzstatic.com +s10.upd.kaspersky.com +s11.upd.kaspersky.com +s12.upd.kaspersky.com +s13.upd.kaspersky.com +s14.upd.kaspersky.com +s15.upd.kaspersky.com +s16.upd.kaspersky.com +s17.upd.kaspersky.com +s18.upd.kaspersky.com +s19.upd.kaspersky.com +s2.mzstatic.com +s3.mzstatic.com +s4.mzstatic.com +s5.mzstatic.com +safebrowsing-cache.google.com +safebrowsing.googleapis.com +scene7-cdn.dell.com +sdx.microsoft.com +se-edge.itunes.apple.com +se2.itunes.apple.com +search.itunes.apple.com +seed-sequoia.siri.apple.com +seed-swallow.siri.apple.com +seed.siri.apple.com +sequoia.apple.com +service.urchin.com +sf-api-token-service.itunes.apple.com +sh-pod2-smp-device.apple.com +shazam-insights.cdn-apple.com +shell.cdn.office.net +si.cdn.dell.com +sm.dell.com +smp-device-content.apple.com +snp.cdn.dell.com +snpi.dell.com +software.download.prss.microsoft.com +sp.itunes.apple.com +speedysub.music.apple.com +ss.bjmu.edu.cn +ssl-google-analytics.l.google.com +ssl.gstatic.com +staging-controlbe.floonet.goog +staging-databe.floonet.goog +staging.databe.floonet.goog +static.gc.apple.com +statics.teams.cdn.office.net +status.alibabacloud.com +stocks-sparkline-lb.apple.com.akadns.net +stocks-sparkline.apple.com +store.apple.com +store.apple.com.edgekey.net +store.apple.com.edgekey.net.globalredir.akadns.net +store.storeimages.apple.com.akadns.net +store.storeimages.cdn-apple.com +storecorefulfillment.download.prss.microsoft.com +storeedge.microsoft.com +storeedgefd.dsx.mp.microsoft.com +streamingaudio.itunes.apple.com +study.163.com +su.itunes.apple.com +support-china.apple-support.akadns.net +support.apple.com +supportassist.dell.com +surface.download.prss.microsoft.com +surface.downloads.prss.microsoft.com +swallow-apple-com.v.aaplimg.com +swallow.apple.com +swcatalog-cdn.apple.com.akadns.net +swcatalog.apple.com +swcdn.apple.com +swcdn.g.aaplimg.com +swdist.apple.com +swdist.apple.com.akadns.net +swscan-cdn.apple.com.akadns.net +swscan.apple.com +sylvan.apple.com +sync.itunes.apple.com +tac.googleapis.com +tesla-cdn.thron.cn +tf-feedback.itunes.apple.com +time.amazonaws.cn +time.izatcloud.net +time.xtracloud.net +tj-pod1-smp-device.apple.com +tools.google.com +tp.louisvuitton.com +universal-activity-service.itunes.apple.com +update.crashlytics.com +update.googleapis.com +updates-http.cdn-apple.com +updates-http.cdn-apple.com.akadns.net +updates.cdn-apple.com +uplaypc-s-ubisoft.cdn.ubi.com +upp.itunes.apple.com +valid.apple.com +valid.origin-apple.com.akadns.net +vlportal.download.prss.microsoft.com +volic.download.prss.microsoft.com +vscode.download.prss.microsoft.com +vz.download.prss.microsoft.com +wear.googleapis.com +weather-data.apple.com +weather-data.apple.com.akadns.net +weather-map.apple.com +weather-map2.apple.com +weatherkit.apple.com +windbg.download.prss.microsoft.com +www-csb.dell.com +www-google-analytics.l.google.com +www-googletagmanager.l.google.com +www.amd.com +www.apple.com +www.apple.com.edgekey.net.globalredir.akadns.net +www.dell.com +www.destinationurl.com +www.entrust.cn +www.gstatic.com +www.pxcc.com +www.recaptcha-cn.net +www.recaptcha.net +www.support.apple.com +xp.apple.com +xtratime.qcomgeo2.com +xz.pphimalayanrt.com diff --git a/luci-app-homeproxy/root/etc/homeproxy/resources/china_list.ver b/luci-app-homeproxy/root/etc/homeproxy/resources/china_list.ver index 5d7e941a2..f16503908 100644 --- a/luci-app-homeproxy/root/etc/homeproxy/resources/china_list.ver +++ b/luci-app-homeproxy/root/etc/homeproxy/resources/china_list.ver @@ -1 +1 @@ -202609130005 +202607052256 diff --git a/luci-app-homeproxy/root/etc/homeproxy/resources/gfw_list.txt b/luci-app-homeproxy/root/etc/homeproxy/resources/gfw_list.txt index d149da7b2..5a3c859c8 100644 --- a/luci-app-homeproxy/root/etc/homeproxy/resources/gfw_list.txt +++ b/luci-app-homeproxy/root/etc/homeproxy/resources/gfw_list.txt @@ -4,8 +4,6 @@ 1000giri.net 10beasts.net 10musume.com -123av.com -123av.me 12bet.com 12vpn.com 12vpn.net @@ -15,7 +13,6 @@ 173ng.com 18board.com 18comic.org -18comic.vip 18mh.net 1984bbs.com 1991way.com @@ -130,7 +127,6 @@ agoogleaday.com agro.hk ai.dev ai.studio -aihub.top aiosearch.com aiph.net airconsole.com @@ -215,15 +211,18 @@ aoxvpn.com apartmentratings.com apartments.com apat1989.org +api-gl.lbkrs.com api-secure.recaptcha.net api-verify.recaptcha.net api.ai +api.futunn.com +api.lbkrs.com api.moomoobull.com api.palworldgame.com api.pureapk.com api.recaptcha.net -api.shuaiapi.com api.steampowered.com +api5.futunn.com apiary.io apigee.com apk.support @@ -295,6 +294,7 @@ atlanta168.com atnext.com auctions.yahoo.co.jp audacy.com +auntology.fandom.com autodraw.com av.movie av01.tv @@ -342,7 +342,6 @@ baramangaonline.com barnabu.co.uk bartender.dowjones.com barton.de -basemaps.arcgis.com bastillepost.com bayvoice.net bb-chat.tv @@ -561,7 +560,6 @@ break.com breakgfw.com breakingtweets.com breakwall.net -briarproject.org brill.com brizzly.com broadpressinc.com @@ -667,6 +665,7 @@ cdjp.org cdn-images.mailchimp.com cdn-telegram.org cdn.arstechnica.net +cdn.futustatic.com cdn.jwplayer.com cdn.printfriendly.com cdn.seatguru.com @@ -687,7 +686,6 @@ centauro.com.br centerforhumanreprod.com centralnation.com centurys.net -cerebras.ai certificate-transparency.org certificate.revocationcheck.com cfr.org @@ -703,7 +701,6 @@ character.ai chat.com chat.lmsys.org chatgpt.com -chatgpt.site chatpdf.com chaturbate.com checkgfw.com @@ -769,12 +766,10 @@ chrome.com chromecast.com chromeexperiments.com chromestatus.com -cht.com.tw ci-en.jp cia.gov cici.com ciciai.com -circle19.org cirosantilli.com citizencn.com citizenlab.ca @@ -787,7 +782,6 @@ civilmedia.tw civitai.com cixiaoya.club ck101.com -clashyun.com classicalguitarblog.net claude.ai claude.com @@ -816,6 +810,7 @@ cn.fmnnow.com cn.sandscotaicentral.com cn.shafaqna.com cn.theaustralian.com.au +cn.uptodown.com cna.com.tw cnbbnews.wordpress.com cnbeta.com.tw @@ -896,7 +891,6 @@ css.pixnet.in csuchen.de csw.org.uk ct.org.tw -ctee.com.tw ctinets.com ctinews.com ctinsider.com @@ -997,7 +991,6 @@ disneyplus.com disp.cc disqus.com dit-inc.us -divdyn.com diyin.org dizhuzhishang.com dl-laby.jp @@ -1044,6 +1037,7 @@ dougscripts.com doujincafe.com dowjones.io download.dappcdn.com +download.futunn.com dpool.top dpp.org.tw dpr.info @@ -1146,7 +1140,6 @@ eromanga-kingdom.com eromangadouzin.com eromon.net esg.t91y.com -esim.redteago.com eslite.com esurance.com etherdelta.com @@ -1169,7 +1162,6 @@ exmormon.org expatshield.com expecthim.com expekt.com -experience.arcgis.com exploader.net expressnews.com expressvpn.com @@ -1209,7 +1201,6 @@ falundafaindia.org falunhr.org famunion.com fanbox.cc -fandom.com fangeqiang.com fanglizhi.info fangong.org @@ -1448,7 +1439,6 @@ geti2p.net getlantern.org getmalus.com getmdl.io -getmonero.org getoutline.org getsession.org getsync.com @@ -1838,7 +1828,6 @@ help.byspotify.com helpeachpeople.com helpster.de hembed.com -hentai.tv heqinglian.net heritage.org herokuapp.com @@ -1864,7 +1853,6 @@ himalayan-foundation.org himemix.com hindustantimes.com hinet.net -historylines.net hitbtc.com hitomi.la hive.blog @@ -1881,7 +1869,6 @@ hkcnews.com hkcoc.com hkcoc.weather.com.hk hkdc.us -hkej.com hket.com hkfaa.com hkgalden.com @@ -1905,6 +1892,7 @@ holyspiritspeaks.org home.saxo homedepot.com homeservershow.com +hongkong.fandom.com hongkongfp.com hongzhi.li honven.xyz @@ -2183,7 +2171,6 @@ kanshifang.com kantie.org kaotic.com karayou.com -kards.com kathmandupost.com kawaiikawaii.jp kawase.com @@ -2208,7 +2195,6 @@ kinmen.org.tw kinmen.travel kinokuniya.com kiwi.kz -kiwix.org kk-whys.co.jp kkbox.com kknews.cc @@ -2269,7 +2255,6 @@ lenwhite.com leonardo.ai lesoir.be letscorp.net -level-plus.net lexica.art lhakar.org li.taipei @@ -2304,7 +2289,6 @@ linkedin.com linktr.ee linux.do linux.org.hk -linux.sb liquiditytp.com liquidvpn.com listennotes.com @@ -2317,7 +2301,6 @@ liveleak.com livemint.com livestream.com livevideo.com -livingatlas.arcgis.com livingstream.com lmarena.ai localbitcoins.com @@ -2359,6 +2342,7 @@ lvv2.com lyfhk.net lzjscript.com lzmtnews.org +m.hkgalden.com m.me m.moegirl.org macgamestore.com @@ -2404,7 +2388,6 @@ mattwilcox.net maven.neoforged.net mcadforums.com mcaf.ee -mceindex.com mcusercontent.com md-t.org me.me @@ -2535,6 +2518,7 @@ mosavi.io motherless.com movements.org moviefap.com +mozilla.ai mpettis.com mpfinance.com mpinews.com @@ -2649,7 +2633,6 @@ nga.mil nhentai.net nic.cz.cc nic.gov -nicoseiga.jp nicovideo.jp nightswatch.top nikke-en.com @@ -2690,7 +2673,6 @@ ntd.tv ntdtv.com ntdtv.com.tw ntdtv.cz -nthlink.com nuexpo.com nurgo-software.com nusatrip.com @@ -2735,7 +2717,6 @@ oklink.com okpool.me okx.com old.honeynet.org -oldmapsonline.org olehdtv.com olelive.com olevod.com @@ -2767,8 +2748,12 @@ ooni.org open.firstory.me openai.com openapi-quote.longbridge.cn +openapi-quote.longbridge.com openapi-trade.longbridge.cn +openapi-trade.longbridge.com +openapi.futunn.com openapi.longbridge.cn +openapi.longbridge.com openart.ai opencritic.com opendemocracy.net @@ -3002,6 +2987,7 @@ puffinbrowser.com pullfolio.co pure18.com pureconcepts.net +puredns.org pureinsight.org purepdf.com purevpn.com @@ -3024,8 +3010,9 @@ qmp4.com qoos.com qq.co.za qstatus.com +qtcard.futunn.com +qtcardfthk.futufin.com qtrac.eu -quakemachinex.com questvisual.com quitccp.org quiz.directory @@ -3045,6 +3032,7 @@ radio.co radio.garden radioaustralia.net.au radiohilight.net +radiojar.com radioline.co radiovaticana.org radiovncr.com @@ -3116,7 +3104,6 @@ rlwlw.com rmbl.ws roblox.com robustnessiskey.com -roc-taiwan.org rocket-inc.net rocket.chat rocksdb.org @@ -3126,7 +3113,6 @@ rolia.net rolsociety.org ronjoneswriter.com rou.video -roushuwo.com rsdlmonitor.com rsf-chinese.org rsf.org @@ -3152,7 +3138,6 @@ rxhj.net s-cute.com s.yimg.com s3-ap-northeast-1.amazonaws.com -s3.dualstack.us-west-2.amazonaws.com sacks.com sacom.hk sadistic-v.com @@ -3160,6 +3145,7 @@ sadpanda.us safechat.com safeguarddefenders.com safervpn.com +sagernet.org saintyculture.com sakuralive.com salvation.org.hk @@ -3172,7 +3158,6 @@ savetibet.de savetibet.org savetibetstore.org saveuighur.org -sb.sb sbme.me sbti.unun.dev schema.org @@ -3429,7 +3414,7 @@ supchina.com superpages.com supervpn.net superzooi.com -supjav.com +support.futunn.com supremecourt.gov suprememastertv.com surfeasy.com @@ -3450,7 +3435,6 @@ synapse.org syncback.com synergyse.com syosetu.com -sysub.com t-g.com t.co t.me @@ -3459,12 +3443,10 @@ taa-usa.org taaze.tw taedp.org.tw tagwalk.com -taiav.com tails.net taipeisociety.org taipeitimes.com taisounds.com -taiwanembassy.org taiwanhot.net taiwanjustice.net taiwanncf.org.tw @@ -3666,7 +3648,6 @@ to-porno.com togetter.com token.im tokenlon.im -tokenplus.app tokyo-porn-tube.com tokyocn.com tomp3.cc @@ -3693,6 +3674,8 @@ totalvpn.com tou.tv tpi.org.tw tracfone.com +trade.futunn.com +trade.longportapp.com tradeup.com tradingview.com translate.goog @@ -3706,7 +3689,6 @@ trtworld.com truebuddha-md.org trustwallet.com truthsocial.com -tryai.dev tryheart.jp tsdr.uspto.gov tt1069.com @@ -3888,7 +3870,6 @@ uyghurstudies.org uyghurtribunal.com uygur.fc2web.com uymaarip.com -v.recipes v2.help v2.hysteria.network v2ex.com @@ -4099,7 +4080,6 @@ wiktionary.org willw.net wilsoncenter.org windscribe.com -windy.com wingamestore.com wingy.site wionews.com @@ -4142,11 +4122,9 @@ woyaolian.org wp.com wplace.live wpoforum.com -write.as writesonic.com wsj.com wsj.net -wtfpass.com wufafangwen.com wufi.org.tw wujieliulan.com @@ -4157,6 +4135,7 @@ www.ajsands.com www.antd.org www.aolnews.com www.bing.com +www.clashverge.dev www.cmoinc.org www.dmm.com www.eastturkistan.net @@ -4192,7 +4171,6 @@ x.co x.com x.company x3guide.com -x86.fr xbabe.com xbookcn.com xbtce.com @@ -4335,7 +4313,6 @@ zdnet.com.tw zello.com zenmate.com zenmate.com.ru -zenmux.ai zerohedge.com zeronet.io zh-hans.cfsh99.com diff --git a/luci-app-homeproxy/root/etc/homeproxy/resources/gfw_list.ver b/luci-app-homeproxy/root/etc/homeproxy/resources/gfw_list.ver index 5d7e941a2..f16503908 100644 --- a/luci-app-homeproxy/root/etc/homeproxy/resources/gfw_list.ver +++ b/luci-app-homeproxy/root/etc/homeproxy/resources/gfw_list.ver @@ -1 +1 @@ -202609130005 +202607052256 diff --git a/luci-app-homeproxy/root/etc/homeproxy/scripts/clean_log.sh b/luci-app-homeproxy/root/etc/homeproxy/scripts/clean_log.sh index c0d8f10b8..d2878ed0f 100755 --- a/luci-app-homeproxy/root/etc/homeproxy/scripts/clean_log.sh +++ b/luci-app-homeproxy/root/etc/homeproxy/scripts/clean_log.sh @@ -14,6 +14,6 @@ while true; do sleep 180 for i in "$main_log_file" "$singc_log_file" "$sings_log_file"; do [ -s "$i" ] || continue - [ "$(( $(ls -l "$i" | awk -F ' ' '{print $5}') / 1024 >= log_max_size))" -eq "0" ] || echo "" > "$i" + [ "$(( $(wc -c < "$i") / 1024 >= log_max_size))" -eq "0" ] || : > "$i" done done diff --git a/luci-app-homeproxy/root/etc/homeproxy/scripts/firewall_post.ut b/luci-app-homeproxy/root/etc/homeproxy/scripts/firewall_post.ut index 04a0f6d9b..37c653a55 100755 --- a/luci-app-homeproxy/root/etc/homeproxy/scripts/firewall_post.ut +++ b/luci-app-homeproxy/root/etc/homeproxy/scripts/firewall_post.ut @@ -1,9 +1,20 @@ #!/usr/bin/utpl -S {%- +/* + * Declares every homeproxy_* fw4 chain/set. The inventory of those objects is + * tracked in scripts/fw4_names.sh, which init.d/homeproxy uses to clean them up + * on stop; add/remove entries there together with any change below. + * tests/ucode/test_fw4_names.sh compares both lists, and + * tests/ucode/test_firewall_template.sh renders this template and checks the + * objects actually survive into the generated nftables script. + * + * Keep this comment inside the ucode block: text placed before `{%-` has its + * trailing newline trimmed, which would glue it onto the first nft statement. + */ import { readfile } from 'fs'; import { cursor } from 'uci'; -import { isEmpty } from '/etc/homeproxy/scripts/homeproxy.uc'; +import { isEmpty, isValidCIDR } from '/etc/homeproxy/scripts/homeproxy.uc'; const fw4 = require('fw4'); @@ -25,7 +36,24 @@ function resolve_ipv6(str) { if (ipv6.bits > -1) return `${ipv6.addr}/${ipv6.bits}`; else - return `& ${ipv6.mask} == ${ipv6.addr}`; + return ipv6.addr; +} + +/* Normalize a list of IPv6 entries into an nftables anonymous set + (or null when empty), so IPv6 ACLs match in a single set lookup + instead of one rule per address. */ +function ipv6_to_nftarr(list) { + if (isEmpty(list)) + return null; + + let out = []; + for (let ip in list) { + const r = resolve_ipv6(ip); + if (!isEmpty(r)) + push(out, r); + } + + return isEmpty(out) ? null : `{ ${join(', ', out)} }`; } function resolve_mark(str) { @@ -182,7 +210,9 @@ set homeproxy_mainland_addr_v4 { auto-merge elements = { {% for (let cnip4 in split(trim(readfile(resources_dir + '/china_ip4.txt')), /[\r\n]/)): %} + {% if (isValidCIDR(cnip4, 4)): %} {{ cnip4 }}, + {% endif %} {% endfor %} } } @@ -193,7 +223,9 @@ set homeproxy_mainland_addr_v6 { auto-merge elements = { {% for (let cnip6 in split(trim(readfile(resources_dir + '/china_ip6.txt')), /[\r\n]/)): %} + {% if (isValidCIDR(cnip6, 6)): %} {{ cnip6 }}, + {% endif %} {% endfor %} } } @@ -286,9 +318,9 @@ chain homeproxy_redirect_lanac { {% if (!isEmpty(control_info.lan_proxy_ipv4_ips)): %} ip saddr {{ array_to_nftarr(control_info.lan_proxy_ipv4_ips) }} counter goto homeproxy_redirect {% endif /* lan_proxy_ipv4_ips */ %} - {% for (let ipv6 in control_info.lan_proxy_ipv6_ips): %} - ip6 saddr {{ resolve_ipv6(ipv6) }} counter goto homeproxy_redirect - {% endfor /* lan_proxy_ipv6_ips */ %} + {% if (!isEmpty(control_info.lan_proxy_ipv6_ips)): %} + ip6 saddr {{ ipv6_to_nftarr(control_info.lan_proxy_ipv6_ips) }} counter goto homeproxy_redirect + {% endif /* lan_proxy_ipv6_ips */ %} {% if (!isEmpty(control_info.lan_proxy_mac_addrs)): %} ether saddr {{ array_to_nftarr(control_info.lan_proxy_mac_addrs) }} counter goto homeproxy_redirect {% endif /* lan_proxy_mac_addrs */ %} @@ -296,9 +328,9 @@ chain homeproxy_redirect_lanac { {% if (!isEmpty(control_info.lan_direct_ipv4_ips)): %} ip saddr {{ array_to_nftarr(control_info.lan_direct_ipv4_ips) }} counter return {% endif /* lan_direct_ipv4_ips */ %} - {% for (let ipv6 in control_info.lan_direct_ipv6_ips): %} - ip6 saddr {{ resolve_ipv6(ipv6) }} counter return - {% endfor /* lan_direct_ipv6_ips */ %} + {% if (!isEmpty(control_info.lan_direct_ipv6_ips)): %} + ip6 saddr {{ ipv6_to_nftarr(control_info.lan_direct_ipv6_ips) }} counter return + {% endif /* lan_direct_ipv6_ips */ %} {% if (!isEmpty(control_info.lan_direct_mac_addrs)): %} ether saddr {{ array_to_nftarr(control_info.lan_direct_mac_addrs) }} counter return {% endif /* lan_direct_mac_addrs */ %} @@ -326,9 +358,9 @@ chain homeproxy_redirect { {% if (!isEmpty(control_info.lan_global_proxy_ipv4_ips)): %} ip saddr {{ array_to_nftarr(control_info.lan_global_proxy_ipv4_ips) }} counter goto homeproxy_redirect_proxy_port {% endif /* lan_global_proxy_ipv4_ips */ %} - {% for (let ipv6 in control_info.lan_global_proxy_ipv6_ips): %} - ip6 saddr {{ resolve_ipv6(ipv6) }} counter goto homeproxy_redirect_proxy_port - {% endfor /* lan_global_proxy_ipv6_ips */ %} + {% if (!isEmpty(control_info.lan_global_proxy_ipv6_ips)): %} + ip6 saddr {{ ipv6_to_nftarr(control_info.lan_global_proxy_ipv6_ips) }} counter goto homeproxy_redirect_proxy_port + {% endif /* lan_global_proxy_ipv6_ips */ %} {% if (!isEmpty(control_info.lan_global_proxy_mac_addrs)): %} ether saddr {{ array_to_nftarr(control_info.lan_global_proxy_mac_addrs) }} counter goto homeproxy_redirect_proxy_port {% endif /* lan_global_proxy_mac_addrs */ %} @@ -359,9 +391,9 @@ chain homeproxy_redirect { {% if (!isEmpty(control_info.lan_gaming_mode_ipv4_ips)): %} ip saddr {{ array_to_nftarr(control_info.lan_gaming_mode_ipv4_ips) }} counter goto homeproxy_redirect_proxy {% endif /* lan_gaming_mode_ipv4_ips */ %} - {% for (let ipv6 in control_info.lan_gaming_mode_ipv6_ips): %} - ip6 saddr {{ resolve_ipv6(ipv6) }} counter goto homeproxy_redirect_proxy - {% endfor /* lan_gaming_mode_ipv6_ips */ %} + {% if (!isEmpty(control_info.lan_gaming_mode_ipv6_ips)): %} + ip6 saddr {{ ipv6_to_nftarr(control_info.lan_gaming_mode_ipv6_ips) }} counter goto homeproxy_redirect_proxy + {% endif /* lan_gaming_mode_ipv6_ips */ %} {% if (!isEmpty(control_info.lan_gaming_mode_mac_addrs)): %} ether saddr {{ array_to_nftarr(control_info.lan_gaming_mode_mac_addrs) }} counter goto homeproxy_redirect_proxy {% endif /* lan_gaming_mode_mac_addrs */ %} @@ -409,9 +441,9 @@ chain homeproxy_mangle_lanac { {% if (!isEmpty(control_info.lan_proxy_ipv4_ips)): %} ip saddr {{ array_to_nftarr(control_info.lan_proxy_ipv4_ips) }} counter goto homeproxy_mangle_prerouting {% endif /* lan_proxy_ipv4_ips */ %} - {% for (let ipv6 in control_info.lan_proxy_ipv6_ips): %} - ip6 saddr {{ resolve_ipv6(ipv6) }} counter goto homeproxy_mangle_prerouting - {% endfor /* lan_proxy_ipv6_ips */ %} + {% if (!isEmpty(control_info.lan_proxy_ipv6_ips)): %} + ip6 saddr {{ ipv6_to_nftarr(control_info.lan_proxy_ipv6_ips) }} counter goto homeproxy_mangle_prerouting + {% endif /* lan_proxy_ipv6_ips */ %} {% if (!isEmpty(control_info.lan_proxy_mac_addrs)): %} ether saddr {{ array_to_nftarr(control_info.lan_proxy_mac_addrs) }} counter goto homeproxy_mangle_prerouting {% endif /* lan_proxy_mac_addrs */ %} @@ -419,9 +451,9 @@ chain homeproxy_mangle_lanac { {% if (!isEmpty(control_info.lan_direct_ipv4_ips)): %} ip saddr {{ array_to_nftarr(control_info.lan_direct_ipv4_ips) }} counter return {% endif /* lan_direct_ipv4_ips */ %} - {% for (let ipv6 in control_info.lan_direct_ipv6_ips): %} - ip6 saddr {{ resolve_ipv6(ipv6) }} counter return - {% endfor /* lan_direct_ipv6_ips */ %} + {% if (!isEmpty(control_info.lan_direct_ipv6_ips)): %} + ip6 saddr {{ ipv6_to_nftarr(control_info.lan_direct_ipv6_ips) }} counter return + {% endif /* lan_direct_ipv6_ips */ %} {% if (!isEmpty(control_info.lan_direct_mac_addrs)): %} ether saddr {{ array_to_nftarr(control_info.lan_direct_mac_addrs) }} counter return {% endif /* lan_direct_mac_addrs */ %} @@ -447,9 +479,9 @@ chain homeproxy_mangle_prerouting { {% if (!isEmpty(control_info.lan_global_proxy_ipv4_ips)): %} ip saddr {{ array_to_nftarr(control_info.lan_global_proxy_ipv4_ips) }} counter goto homeproxy_mangle_tproxy_port {% endif /* lan_global_proxy_ipv4_ips */ %} - {% for (let ipv6 in control_info.lan_global_proxy_ipv6_ips): %} - ip6 saddr {{ resolve_ipv6(ipv6) }} counter goto homeproxy_mangle_tproxy_port - {% endfor /* lan_global_proxy_ipv6_ips */ %} + {% if (!isEmpty(control_info.lan_global_proxy_ipv6_ips)): %} + ip6 saddr {{ ipv6_to_nftarr(control_info.lan_global_proxy_ipv6_ips) }} counter goto homeproxy_mangle_tproxy_port + {% endif /* lan_global_proxy_ipv6_ips */ %} {% if (!isEmpty(control_info.lan_global_proxy_mac_addrs)): %} ether saddr {{ array_to_nftarr(control_info.lan_global_proxy_mac_addrs) }} counter goto homeproxy_mangle_tproxy_port {% endif /* lan_global_proxy_mac_addrs */ %} @@ -465,14 +497,14 @@ chain homeproxy_mangle_prerouting { {% if (ipv6_support === '1'): %} ip6 daddr != @homeproxy_gfw_list_v6 counter return {% endif /* ipv6_support */ %} - udp dport { 80, 443 } counter reject comment "!{{ cfgname }}: Fuck you QUIC" + udp dport { 80, 443 } counter reject comment "!{{ cfgname }}: Block QUIC (not proxyable)" {% elif (routing_mode === 'bypass_mainland_china' || bypass_cn_traffic === '1'): %} ip daddr @homeproxy_mainland_addr_v4 counter return {% if (ipv6_support === '1'): %} ip6 daddr @homeproxy_mainland_addr_v6 counter return {% endif /* ipv6_support */ %} {% if (routing_mode !== 'custom'): %} - udp dport { 80, 443 } counter reject comment "!{{ cfgname }}: Fuck you QUIC" + udp dport { 80, 443 } counter reject comment "!{{ cfgname }}: Block QUIC (not proxyable)" {% endif /* routing_mode */ %} {% elif (routing_mode === 'proxy_mainland_china'): %} ip daddr != @homeproxy_mainland_addr_v4 counter return @@ -484,9 +516,9 @@ chain homeproxy_mangle_prerouting { {% if (!isEmpty(control_info.lan_gaming_mode_ipv4_ips)): %} ip saddr {{ array_to_nftarr(control_info.lan_gaming_mode_ipv4_ips) }} counter goto homeproxy_mangle_tproxy {% endif /* lan_gaming_mode_ipv4_ips */ %} - {% for (let ipv6 in control_info.lan_gaming_mode_ipv6_ips): %} - ip6 saddr {{ resolve_ipv6(ipv6) }} counter goto homeproxy_mangle_tproxy - {% endfor /* lan_gaming_mode_ipv6_ips */ %} + {% if (!isEmpty(control_info.lan_gaming_mode_ipv6_ips)): %} + ip6 saddr {{ ipv6_to_nftarr(control_info.lan_gaming_mode_ipv6_ips) }} counter goto homeproxy_mangle_tproxy + {% endif /* lan_gaming_mode_ipv6_ips */ %} {% if (!isEmpty(control_info.lan_gaming_mode_mac_addrs)): %} ether saddr {{ array_to_nftarr(control_info.lan_gaming_mode_mac_addrs) }} counter goto homeproxy_mangle_tproxy {% endif /* lan_gaming_mode_mac_addrs */ %} @@ -555,9 +587,9 @@ chain homeproxy_mangle_lanac { {% if (!isEmpty(control_info.lan_proxy_ipv4_ips)): %} ip saddr {{ array_to_nftarr(control_info.lan_proxy_ipv4_ips) }} counter goto homeproxy_mangle_tun {% endif /* lan_proxy_ipv4_ips */ %} - {% for (let ipv6 in control_info.lan_proxy_ipv6_ips): %} - ip6 saddr {{ resolve_ipv6(ipv6) }} counter goto homeproxy_mangle_tun - {% endfor /* lan_proxy_ipv6_ips */ %} + {% if (!isEmpty(control_info.lan_proxy_ipv6_ips)): %} + ip6 saddr {{ ipv6_to_nftarr(control_info.lan_proxy_ipv6_ips) }} counter goto homeproxy_mangle_tun + {% endif /* lan_proxy_ipv6_ips */ %} {% if (!isEmpty(control_info.lan_proxy_mac_addrs)): %} ether saddr {{ array_to_nftarr(control_info.lan_proxy_mac_addrs) }} counter goto homeproxy_mangle_tun {% endif /* lan_proxy_mac_addrs */ %} @@ -565,9 +597,9 @@ chain homeproxy_mangle_lanac { {% if (!isEmpty(control_info.lan_direct_ipv4_ips)): %} ip saddr {{ array_to_nftarr(control_info.lan_direct_ipv4_ips) }} counter return {% endif /* lan_direct_ipv4_ips */ %} - {% for (let ipv6 in control_info.lan_direct_ipv6_ips): %} - ip6 saddr {{ resolve_ipv6(ipv6) }} counter return - {% endfor /* lan_direct_ipv6_ips */ %} + {% if (!isEmpty(control_info.lan_direct_ipv6_ips)): %} + ip6 saddr {{ ipv6_to_nftarr(control_info.lan_direct_ipv6_ips) }} counter return + {% endif /* lan_direct_ipv6_ips */ %} {% if (!isEmpty(control_info.lan_direct_mac_addrs)): %} ether saddr {{ array_to_nftarr(control_info.lan_direct_mac_addrs) }} counter return {% endif /* lan_direct_mac_addrs */ %} @@ -606,9 +638,9 @@ chain homeproxy_mangle_tun { {% if (!isEmpty(control_info.lan_global_proxy_ipv4_ips)): %} ip saddr {{ array_to_nftarr(control_info.lan_global_proxy_ipv4_ips) }} counter goto homeproxy_mangle_tun_mark {% endif /* lan_global_proxy_ipv4_ips */ %} - {% for (let ipv6 in control_info.lan_global_proxy_ipv6_ips): %} - ip6 saddr {{ resolve_ipv6(ipv6) }} counter goto homeproxy_mangle_tun_mark - {% endfor /* lan_global_proxy_ipv6_ips */ %} + {% if (!isEmpty(control_info.lan_global_proxy_ipv6_ips)): %} + ip6 saddr {{ ipv6_to_nftarr(control_info.lan_global_proxy_ipv6_ips) }} counter goto homeproxy_mangle_tun_mark + {% endif /* lan_global_proxy_ipv6_ips */ %} {% if (!isEmpty(control_info.lan_global_proxy_mac_addrs)): %} ether saddr {{ array_to_nftarr(control_info.lan_global_proxy_mac_addrs) }} counter goto homeproxy_mangle_tun_mark {% endif /* lan_global_proxy_mac_addrs */ %} @@ -626,14 +658,14 @@ chain homeproxy_mangle_tun { {% if (ipv6_support === '1'): %} ip6 daddr != @homeproxy_gfw_list_v6 counter return {% endif /* ipv6_support */ %} - udp dport { 80, 443 } counter reject comment "!{{ cfgname }}: Fuck you QUIC" + udp dport { 80, 443 } counter reject comment "!{{ cfgname }}: Block QUIC (not proxyable)" {% elif (routing_mode === 'bypass_mainland_china' || bypass_cn_traffic === '1'): %} ip daddr @homeproxy_mainland_addr_v4 counter return {% if (ipv6_support === '1'): %} ip6 daddr @homeproxy_mainland_addr_v6 counter return {% endif /* ipv6_support */ %} {% if (routing_mode !== 'custom'): %} - udp dport { 80, 443 } counter reject comment "!{{ cfgname }}: Fuck you QUIC" + udp dport { 80, 443 } counter reject comment "!{{ cfgname }}: Block QUIC (not proxyable)" {% endif /* routing_mode */ %} {% elif (routing_mode === 'proxy_mainland_china'): %} ip daddr != @homeproxy_mainland_addr_v4 counter return @@ -645,9 +677,9 @@ chain homeproxy_mangle_tun { {% if (!isEmpty(control_info.lan_gaming_mode_ipv4_ips)): %} ip saddr {{ array_to_nftarr(control_info.lan_gaming_mode_ipv4_ips) }} counter meta mark set {{ tun_mark }} {% endif /* lan_gaming_mode_ipv4_ips */ %} - {% for (let ipv6 in control_info.lan_gaming_mode_ipv6_ips): %} - ip6 saddr {{ resolve_ipv6(ipv6) }} counter meta mark set {{ tun_mark }} - {% endfor /* lan_gaming_mode_ipv6_ips */ %} + {% if (!isEmpty(control_info.lan_gaming_mode_ipv6_ips)): %} + ip6 saddr {{ ipv6_to_nftarr(control_info.lan_gaming_mode_ipv6_ips) }} counter meta mark set {{ tun_mark }} + {% endif /* lan_gaming_mode_ipv6_ips */ %} {% if (!isEmpty(control_info.lan_gaming_mode_mac_addrs)): %} ether saddr {{ array_to_nftarr(control_info.lan_gaming_mode_mac_addrs) }} counter meta mark set {{ tun_mark }} {% endif /* lan_gaming_mode_mac_addrs */ %} diff --git a/luci-app-homeproxy/root/etc/homeproxy/scripts/firewall_pre.uc b/luci-app-homeproxy/root/etc/homeproxy/scripts/firewall_pre.uc index 378df2be0..3b4bfe527 100755 --- a/luci-app-homeproxy/root/etc/homeproxy/scripts/firewall_pre.uc +++ b/luci-app-homeproxy/root/etc/homeproxy/scripts/firewall_pre.uc @@ -4,7 +4,7 @@ import { writefile } from 'fs'; import { cursor } from 'uci'; -import { isEmpty, RUN_DIR } from 'homeproxy'; +import { isEmpty, RUN_DIR, validation } from 'homeproxy'; const cfgname = 'homeproxy'; const uci = cursor(); @@ -39,7 +39,17 @@ if (server_enabled === '1') { if (s.enabled !== '1' || s.firewall !== '1') return; + if (!validation('port', s.port)) { + print(`WARN: skipping server ${s['.name']}: invalid port "${s.port}".`); + return; + } + let proto = s.network || '{ tcp, udp }'; + if (!(proto in ['tcp', 'udp', '{ tcp, udp }'])) { + print(`WARN: skipping server ${s['.name']}: invalid network "${proto}".`); + return; + } + push(input, `meta l4proto ${proto} th dport ${s.port} counter accept comment "!${cfgname}: accept server ${s['.name']}"`); }); } diff --git a/luci-app-homeproxy/root/etc/homeproxy/scripts/fw4_names.sh b/luci-app-homeproxy/root/etc/homeproxy/scripts/fw4_names.sh new file mode 100644 index 000000000..cdff5ee94 --- /dev/null +++ b/luci-app-homeproxy/root/etc/homeproxy/scripts/fw4_names.sh @@ -0,0 +1,48 @@ +# SPDX-License-Identifier: GPL-2.0-only +# +# Copyright (C) 2025 ImmortalWrt.org +# +# Single source of truth for every fw4 chain and set owned by homeproxy. +# +# * root/etc/homeproxy/scripts/firewall_post.ut declares these objects and +# decides which of them actually exist for the current proxy mode. +# * root/etc/init.d/homeproxy flushes and deletes them on stop. +# +# When you add or remove a chain/set in firewall_post.ut, update this list in +# the same commit -- tests/ucode/test_fw4_names.sh compares both sides and +# fails when they drift. +# +# Each object is cleaned up independently: the cleanup loop deletes one at a +# time so that a chain/set which does not exist in the current mode cannot +# abort the whole batch. A single `nft -f` batch is atomic and would roll back +# every preceding command in that case. + +HP_FW4_CHAINS=" + homeproxy_output_redir + homeproxy_redirect + homeproxy_redirect_proxy + homeproxy_redirect_proxy_port + homeproxy_redirect_lanac + homeproxy_mangle_prerouting + homeproxy_mangle_output + homeproxy_mangle_tproxy + homeproxy_mangle_tproxy_port + homeproxy_mangle_lanac + homeproxy_mangle_mark + homeproxy_mangle_tun + homeproxy_mangle_tun_mark +" + +HP_FW4_SETS=" + homeproxy_local_addr_v4 + homeproxy_local_addr_v6 + homeproxy_gfw_list_v4 + homeproxy_gfw_list_v6 + homeproxy_mainland_addr_v4 + homeproxy_mainland_addr_v6 + homeproxy_wan_proxy_addr_v4 + homeproxy_wan_proxy_addr_v6 + homeproxy_wan_direct_addr_v4 + homeproxy_wan_direct_addr_v6 + homeproxy_routing_port +" diff --git a/luci-app-homeproxy/root/etc/homeproxy/scripts/generate_client.uc b/luci-app-homeproxy/root/etc/homeproxy/scripts/generate_client.uc index 7a655d8c8..14ed6e09c 100755 --- a/luci-app-homeproxy/root/etc/homeproxy/scripts/generate_client.uc +++ b/luci-app-homeproxy/root/etc/homeproxy/scripts/generate_client.uc @@ -7,7 +7,6 @@ 'use strict'; -import { md5 } from 'digest'; import { readfile, writefile } from 'fs'; import { isnan } from 'math'; import { connect } from 'ubus'; @@ -15,7 +14,8 @@ import { cursor } from 'uci'; import { isEmpty, parseURL, strToBool, strToInt, strToTime, - removeBlankAttrs, validation, HP_DIR, RUN_DIR + removeBlankAttrs, validation, buildTLSObject, buildTransportObject, + HP_DIR, RUN_DIR } from 'homeproxy'; const ubus = connect(); @@ -30,10 +30,7 @@ uci.load(uciconfig); const uciinfra = 'infra', ucimain = 'config', - ucicontrol = 'control', - uciclashapi = 'clash_api', - ucintp = 'ntp', - ucicache = 'cache'; + ucicontrol = 'control'; const ucidnssetting = 'dns', ucidnsserver = 'dns_server', @@ -45,64 +42,23 @@ const uciroutingsetting = 'routing', const ucinode = 'node'; const uciruleset = 'ruleset'; -const RULESET_DIR = HP_DIR + '/ruleset'; const routing_mode = uci.get(uciconfig, ucimain, 'routing_mode') || 'bypass_mainland_china'; -function normalize_list(value) { - if (isEmpty(value)) - return []; - if (type(value) === 'array') - return value; - return [value]; -} - -function ruleset_file_name(tag, format) { - let filename = replace(tag || 'ruleset', /[^A-Za-z0-9_.-]+/g, '_'); - if (isEmpty(filename)) - filename = 'ruleset'; - - return filename + ((format === 'source') ? '.json' : '.srs'); -} - -function ruleset_default_path(tag, format) { - return RULESET_DIR + '/' + ruleset_file_name(tag, format); -} - -function ruleset_remote_path(path, tag, format) { - if (isEmpty(path)) - return ruleset_default_path(tag, format); - - if (match(path, /\/$/)) - return path + ruleset_file_name(tag, format); - - return path; -} - let wan_dns = ubus.call('network.interface', 'status', {'interface': 'wan'})?.['dns-server']?.[0]; if (!wan_dns) - wan_dns = (routing_mode in ['proxy_mainland_china', 'global']) ? '9.9.9.9' : '223.5.5.5'; + wan_dns = (routing_mode in ['proxy_mainland_china', 'global']) ? '8.8.8.8' : '223.5.5.5'; const dns_port = uci.get(uciconfig, uciinfra, 'dns_port') || '5333'; -let ntp_enabled = uci.get(uciconfig, ucintp, 'enabled'), - ntp_server = uci.get(uciconfig, ucintp, 'server'), - ntp_server_port = uci.get(uciconfig, ucintp, 'server_port'), - ntp_interval = uci.get(uciconfig, ucintp, 'interval'); - -if (isEmpty(ntp_enabled) && isEmpty(ntp_server)) { - ntp_server = uci.get(uciconfig, uciinfra, 'ntp_server'); - ntp_enabled = !isEmpty(ntp_server) ? '1' : '0'; -} +const ntp_server = uci.get(uciconfig, uciinfra, 'ntp_server') || 'time.apple.com'; const ipv6_support = uci.get(uciconfig, ucimain, 'ipv6_support') || '0'; -let cache_file_enabled, cache_file_path, cache_store_rdrc, cache_rdrc_timeout, - main_node, main_udp_node, dedicated_udp_node, default_outbound, default_outbound_dns, - domain_strategy, sniff_override, dns_server, china_dns_server, dns_default_strategy, - dns_default_server, dns_disable_cache, dns_disable_cache_expire, dns_independent_cache, - dns_client_subnet, direct_domain_list, - proxy_domain_list; +let main_node, main_udp_node, dedicated_udp_node, default_outbound, default_outbound_dns, + domain_strategy, dns_server, china_dns_server, dns_default_strategy, + dns_default_server, dns_disable_cache, dns_disable_cache_expire, + dns_client_subnet, direct_domain_list, proxy_domain_list; if (routing_mode !== 'custom') { main_node = uci.get(uciconfig, ucimain, 'main_node') || 'nil'; @@ -116,35 +72,35 @@ if (routing_mode !== 'custom') { if (routing_mode === 'bypass_mainland_china') { china_dns_server = uci.get(uciconfig, ucimain, 'china_dns_server'); if (isEmpty(china_dns_server) || type(china_dns_server) !== 'string' || china_dns_server === 'wan') - china_dns_server = wan_dns; + china_dns_server = '223.5.5.5'; } dns_default_strategy = (ipv6_support !== '1') ? 'ipv4_only' : null; - direct_domain_list = trim(readfile(HP_DIR + '/resources/direct_list.txt')); - if (direct_domain_list) - direct_domain_list = split(direct_domain_list, /[\r\n]/); + const direct_list_raw = readfile(HP_DIR + '/resources/direct_list.txt'); + direct_domain_list = direct_list_raw ? split(trim(direct_list_raw), /[\r\n]/) : []; - proxy_domain_list = trim(readfile(HP_DIR + '/resources/proxy_list.txt')); - if (proxy_domain_list) - proxy_domain_list = split(proxy_domain_list, /[\r\n]/); + const proxy_list_raw = readfile(HP_DIR + '/resources/proxy_list.txt'); + proxy_domain_list = proxy_list_raw ? split(trim(proxy_list_raw), /[\r\n]/) : []; - sniff_override = uci.get(uciconfig, uciinfra, 'sniff_override') || '1'; } else { /* DNS settings */ dns_default_strategy = uci.get(uciconfig, ucidnssetting, 'default_strategy'); dns_default_server = uci.get(uciconfig, ucidnssetting, 'default_server'); dns_disable_cache = uci.get(uciconfig, ucidnssetting, 'disable_cache'); dns_disable_cache_expire = uci.get(uciconfig, ucidnssetting, 'disable_cache_expire'); - dns_independent_cache = uci.get(uciconfig, ucidnssetting, 'independent_cache'); dns_client_subnet = uci.get(uciconfig, ucidnssetting, 'client_subnet'); /* Routing settings */ default_outbound = uci.get(uciconfig, uciroutingsetting, 'default_outbound') || 'nil'; default_outbound_dns = uci.get(uciconfig, uciroutingsetting, 'default_outbound_dns') || 'default-dns'; domain_strategy = uci.get(uciconfig, uciroutingsetting, 'domain_strategy'); - sniff_override = uci.get(uciconfig, uciroutingsetting, 'sniff_override'); } +const dns_optimistic_cache = uci.get(uciconfig, ucidnssetting, 'optimistic_cache') || '0', + dns_optimistic_timeout = uci.get(uciconfig, ucidnssetting, 'optimistic_timeout'), + dns_query_timeout = uci.get(uciconfig, ucidnssetting, 'dns_timeout'), + dns_store_dns = uci.get(uciconfig, ucidnssetting, 'cache_file_store_dns') || '0'; + const proxy_mode = uci.get(uciconfig, ucimain, 'proxy_mode') || 'redirect_tproxy', default_interface = uci.get(uciconfig, ucicontrol, 'bind_interface'); @@ -152,7 +108,7 @@ const mixed_port = uci.get(uciconfig, uciinfra, 'mixed_port') || '5330'; let self_mark, redirect_port, tproxy_port, tun_name, tun_addr4, tun_addr6, tun_mtu, tcpip_stack, - udp_timeout; + endpoint_independent_nat, udp_timeout; if (routing_mode === 'custom') udp_timeout = uci.get(uciconfig, uciroutingsetting, 'udp_timeout'); @@ -172,21 +128,34 @@ if (match(proxy_mode, /tun/)) { tun_addr6 = uci.get(uciconfig, uciinfra, 'tun_addr6') || 'fdfe:dcba:9876::1/126'; tun_mtu = uci.get(uciconfig, uciinfra, 'tun_mtu') || '9000'; tcpip_stack = 'system'; - if (routing_mode === 'custom') + if (routing_mode === 'custom') { tcpip_stack = uci.get(uciconfig, uciroutingsetting, 'tcpip_stack') || 'system'; + endpoint_independent_nat = uci.get(uciconfig, uciroutingsetting, 'endpoint_independent_nat'); + } } const log_level = uci.get(uciconfig, ucimain, 'log_level') || 'warn'; - -cache_file_enabled = uci.get(uciconfig, ucicache, 'enabled'); -cache_file_path = uci.get(uciconfig, ucicache, 'path'); -cache_store_rdrc = uci.get(uciconfig, ucicache, 'store_rdrc'); -cache_rdrc_timeout = uci.get(uciconfig, ucicache, 'rdrc_timeout'); - -let clash_api = null; /* UCI config end */ +const tun_dns_mode_raw = uci.get(uciconfig, ucimain, 'tun_dns_mode'), + tun_dns_address = uci.get(uciconfig, ucimain, 'tun_dns_address'), + udp_mapping_raw = uci.get(uciconfig, ucimain, 'udp_mapping'), + udp_filtering_raw = uci.get(uciconfig, ucimain, 'udp_filtering'), + udp_nat_max = strToInt(uci.get(uciconfig, ucimain, 'udp_nat_max')); + +const tun_dns_mode = (tun_dns_mode_raw === 'default') ? '' : tun_dns_mode_raw, + udp_mapping = (udp_mapping_raw === 'default') ? '' : udp_mapping_raw, + udp_filtering = (udp_filtering_raw === 'default') ? '' : udp_filtering_raw; + /* Config helper start */ +/* + * Direct-node destination override, keyed by node section name. It must be + * declared before the helpers that touch it: ucode resolves let/const + * lexically and does not hoist them, so a function defined earlier would + * resolve the name as an undeclared global and throw under strict mode. + */ +const direct_overrides = {}; + function parse_port(strport) { if (type(strport) !== 'array' || isEmpty(strport)) return null; @@ -215,31 +184,6 @@ function parse_dnsserver(server_addr, default_protocol) { } } -function parse_custom_dnsserver(cfg) { - let server = cfg.server, - server_port = (cfg.type in ['https', 'h3']) ? null : strToInt(cfg.server_port), - path = cfg.path; - - if (!isEmpty(server) && match(server, /:\/\//)) { - const server_url = parseURL(server); - - server = server_url.hostname; - if (isEmpty(server_port)) - server_port = strToInt(server_url.port); - if ((cfg.type in ['https', 'h3']) && isEmpty(path) && server_url.pathname !== '/') - path = server_url.pathname; - } - if ((cfg.type in ['https', 'h3']) && isEmpty(path)) - path = '/dns-query'; - - return { - type: cfg.type, - server, - server_port, - path - }; -} - function parse_dnsquery(strquery) { if (type(strquery) !== 'array' || isEmpty(strquery)) return null; @@ -252,149 +196,13 @@ function parse_dnsquery(strquery) { } -function filter_existing_nodes(nodes) { - if (type(nodes) !== 'array' || isEmpty(nodes)) - return []; - - return filter(nodes, (k) => { - const node = uci.get_all(uciconfig, k) || {}; - return !isEmpty(node); - }); -} - -function collect_group_nodes(groups, subscription_nodes, nodes, legacy_nodes) { - let result = []; - - for (let group in normalize_list(groups)) - uci.foreach(uciconfig, ucinode, (cfg) => { - if (cfg.grouphash === group && !~index(result, cfg['.name'])) - push(result, cfg['.name']); - }); - - for (let node in filter_existing_nodes(normalize_list(subscription_nodes))) - if (!~index(result, node)) - push(result, node); - - for (let node in filter_existing_nodes(normalize_list(nodes))) - if (!~index(result, node)) - push(result, node); - - for (let node in filter_existing_nodes(normalize_list(legacy_nodes))) - if (!~index(result, node)) - push(result, node); - - return result; -} - -function collect_policy_nodes(nodes, current) { - let result = []; - - for (let node in normalize_list(nodes)) { - if (node === current || ~index(result, node)) - continue; - - const outbound = uci.get_all(uciconfig, node) || {}; - if (!isEmpty(outbound) && outbound['.type'] === uciroutingnode && outbound.enabled === '1' && outbound.node in ['urltest', 'selector']) - push(result, node); - } - - return result; -} - -const reserved_outbound_tags = { - 'GLOBAL': true, - 'main-out': true, - 'main-udp-out': true, - 'direct-out': true, - 'block-out': true -}; - -let outbound_tag_map = {}, - outbound_tag_used = {}; - -function normalize_outbound_tag(tag) { - if (isEmpty(tag)) - return null; - - tag = trim(sprintf('%s', tag)); - tag = replace(tag, /[\r\n\t]+/g, ' '); - tag = replace(tag, /[\/\\?#%]+/g, '-'); - tag = replace(tag, /\s+/g, ' '); - - return tag || null; -} - -function section_display_name(section) { - if (type(section) !== 'object' || isEmpty(section)) - return null; - - let label = normalize_outbound_tag(section.label); - if (!isEmpty(label)) - return label; - - if (section['.type'] === ucinode) { - const address = trim(section.override_address || section.address || ''); - const port = trim(section.override_port || section.port || ''); - - if (address && port) - return normalize_outbound_tag(`${address}:${port}`); - } - - return null; -} - -function register_outbound_tag(section_id, display_name) { - if (isEmpty(section_id)) - return null; - - let tag = outbound_tag_map[section_id]; - if (!isEmpty(tag)) - return tag; - - const fallback_tag = `cfg-${section_id}-out`; - const base_tag = normalize_outbound_tag(display_name) || fallback_tag; - - tag = base_tag; - let suffix = 2; - while (reserved_outbound_tags[tag] || outbound_tag_used[tag]) { - tag = `${base_tag} (${suffix})`; - suffix++; - } - - outbound_tag_map[section_id] = tag; - outbound_tag_used[tag] = true; - - return tag; -} - -function get_section_outbound_tag(section_id) { - if (isEmpty(section_id)) - return null; - - let tag = outbound_tag_map[section_id]; - if (!isEmpty(tag)) - return tag; - - const section = uci.get_all(uciconfig, section_id) || {}; - return register_outbound_tag(section_id, section_display_name(section)); -} - -uci.foreach(uciconfig, ucinode, (cfg) => { - register_outbound_tag(cfg['.name'], section_display_name(cfg)); -}); - -uci.foreach(uciconfig, uciroutingnode, (cfg) => { - if (cfg.enabled === '1') - register_outbound_tag(cfg['.name'], section_display_name(cfg)); -}); - function generate_endpoint(node) { if (type(node) !== 'object' || isEmpty(node)) return null; const endpoint = { type: node.type, - tag: get_section_outbound_tag(node['.name']), + tag: 'cfg-' + node['.name'] + '-out', address: node.wireguard_local_address, mtu: strToInt(node.wireguard_mtu), private_key: node.wireguard_private_key, @@ -415,7 +223,10 @@ function generate_endpoint(node) { system: (node.type === 'wireguard') ? false : null, tcp_fast_open: strToBool(node.tcp_fast_open), tcp_multi_path: strToBool(node.tcp_multi_path), - udp_fragment: strToBool(node.udp_fragment) + udp_fragment: strToBool(node.udp_fragment), + udp_mapping: !isEmpty(udp_mapping) ? udp_mapping : null, + udp_filtering: !isEmpty(udp_filtering) ? udp_filtering : null, + udp_nat_max: udp_nat_max }; return endpoint; @@ -425,44 +236,56 @@ function generate_outbound(node) { if (type(node) !== 'object' || isEmpty(node)) return null; - const tls_utls_value = (node.type === 'anytls' && isEmpty(node.tls_utls)) ? 'chrome' : node.tls_utls; const outbound = { type: node.type, - tag: get_section_outbound_tag(node['.name']), + tag: 'cfg-' + node['.name'] + '-out', routing_mark: strToInt(self_mark), - server: (node.type !== 'direct') ? node.address : null, - server_port: (node.type !== 'direct') ? strToInt(node.port) : null, + server: node.address, + server_port: strToInt(node.port), /* Hysteria(2) */ server_ports: node.hysteria_hopping_port, username: (node.type !== 'ssh') ? node.username : null, user: (node.type === 'ssh') ? node.username : null, - password: node.password, + /* Snell authenticates with psk instead of password */ + password: (node.type !== 'snell') ? node.password : null, + psk: (node.type === 'snell') ? node.password : null, + userkey: (node.type === 'snell') ? node.snell_userkey : null, + reuse: (node.type === 'snell') ? strToBool(node.snell_reuse) : null, + /* Snell v4: HTTP obfuscation; v6: traffic shaping mode */ + obfs_mode: (node.type === 'snell') ? (node.snell_obfs_mode || null) : null, + obfs_host: (node.type === 'snell') ? (node.snell_obfs_host || null) : null, + mode: (node.type === 'snell') ? (node.snell_mode || null) : null, + /* Direct */ + proxy_protocol: strToInt(node.proxy_protocol), /* AnyTLS */ idle_session_check_interval: strToTime(node.anytls_idle_session_check_interval), idle_session_timeout: strToTime(node.anytls_idle_session_timeout), min_idle_session: strToInt(node.anytls_min_idle_session), /* Hysteria (2) */ hop_interval: strToTime(node.hysteria_hop_interval), + hop_interval_max: strToTime(node.hysteria_hop_interval_max), up_mbps: strToInt(node.hysteria_up_mbps), down_mbps: strToInt(node.hysteria_down_mbps), obfs: node.hysteria_obfs_type ? { type: node.hysteria_obfs_type, - password: node.hysteria_obfs_password + password: node.hysteria_obfs_password, + min_packet_size: strToInt(node.hysteria_obfs_min_packet_size), + max_packet_size: strToInt(node.hysteria_obfs_max_packet_size) } : node.hysteria_obfs_password, auth: (node.hysteria_auth_type === 'base64') ? node.hysteria_auth_payload : null, auth_str: (node.hysteria_auth_type === 'string') ? node.hysteria_auth_payload : null, - recv_window_conn: strToInt(node.hysteria_recv_window_conn), - recv_window: strToInt(node.hysteria_revc_window), - disable_mtu_discovery: strToBool(node.hysteria_disable_mtu_discovery), + /* sing-box 1.14: Hysteria2 QUIC params (Hysteria v1 recv-window tuning removed upstream) */ + bbr_profile: (node.type === 'hysteria2') ? (node.hysteria_bbr_profile || null) : null, + disable_chrome_parrot: (node.type === 'hysteria2' && node.hysteria_disable_chrome_parrot === '1') ? true : null, /* Shadowsocks */ method: node.shadowsocks_encrypt_method, plugin: node.shadowsocks_plugin, plugin_opts: node.shadowsocks_plugin_opts, - /* ShadowTLS / Socks */ - version: (node.type === 'shadowtls') ? strToInt(node.shadowtls_version) : ((node.type === 'socks') ? node.socks_version : null), + /* ShadowTLS / Socks / Snell */ + version: (node.type === 'shadowtls') ? strToInt(node.shadowtls_version) : ((node.type === 'socks') ? node.socks_version : ((node.type === 'snell') ? (strToInt(node.snell_version) || 4) : null)), /* SSH */ client_version: node.ssh_client_version, host_key: node.ssh_host_key, @@ -497,45 +320,8 @@ function generate_outbound(node) { down_mbps: strToInt(node.multiplex_brutal_down) } : null } : null, - tls: (node.tls === '1') ? { - enabled: true, - server_name: node.tls_sni, - insecure: strToBool(node.tls_insecure), - alpn: node.tls_alpn, - min_version: node.tls_min_version, - max_version: node.tls_max_version, - cipher_suites: node.tls_cipher_suites, - certificate_path: node.tls_cert_path, - ech: (node.tls_ech === '1') ? { - enabled: true, - config: node.tls_ech_config, - config_path: node.tls_ech_config_path - } : null, - utls: !isEmpty(tls_utls_value) ? { - enabled: true, - fingerprint: tls_utls_value - } : null, - reality: (node.tls_reality === '1') ? { - enabled: true, - public_key: node.tls_reality_public_key, - short_id: node.tls_reality_short_id - } : null - } : null, - transport: !isEmpty(node.transport) ? { - type: node.transport, - host: node.http_host || node.httpupgrade_host, - path: node.http_path || node.ws_path, - headers: node.ws_host ? { - Host: node.ws_host - } : null, - method: node.http_method, - max_early_data: strToInt(node.websocket_early_data), - early_data_header_name: node.websocket_early_data_header, - service_name: node.grpc_servicename, - idle_timeout: strToTime(node.http_idle_timeout), - ping_timeout: strToTime(node.http_ping_timeout), - permit_without_stream: strToBool(node.grpc_permit_without_stream) - } : null, + tls: buildTLSObject(node, false), + transport: buildTransportObject(node, false), udp_over_tcp: (node.udp_over_tcp === '1') ? { enabled: true, version: strToInt(node.udp_over_tcp_version) @@ -545,6 +331,14 @@ function generate_outbound(node) { udp_fragment: strToBool(node.udp_fragment) }; + /* Direct-node destination override: sing-box removed these options from + the direct outbound since 1.13; emit them via the route action instead */ + if (node.type === 'direct' && (!isEmpty(node.override_address) || !isEmpty(node.override_port))) + direct_overrides[node['.name']] = { + override_address: node.override_address, + override_port: strToInt(node.override_port) + }; + return outbound; } @@ -569,14 +363,28 @@ function get_outbound(cfg) { const node = uci.get(uciconfig, cfg, 'node'); if (isEmpty(node)) die(sprintf("%s's node is missing, please check your configuration.", cfg)); - else if (node in ['urltest', 'selector']) - return get_section_outbound_tag(cfg); + else if (node === 'urltest') + return 'cfg-' + cfg + '-out'; else - return get_section_outbound_tag(node); + return 'cfg-' + node + '-out'; } } } +function get_direct_override(outbound_selector) { + if (type(outbound_selector) === 'array' || isEmpty(outbound_selector)) + return null; + + switch (outbound_selector) { + case 'direct-out': + case 'block-out': + return null; + default: + const node = uci.get(uciconfig, outbound_selector, 'node'); + return (!isEmpty(node) && node !== 'urltest') ? (direct_overrides[node] || null) : null; + } +} + function get_resolver(cfg) { if (isEmpty(cfg)) return null; @@ -595,117 +403,21 @@ function get_ruleset(cfg) { return null; let rules = []; - for (let i in cfg) { - if (isEmpty(i)) { - push(rules, null); - continue; - } - - const ruleset = uci.get_all(uciconfig, i); - push(rules, !isEmpty(ruleset?.tag) ? ruleset.tag : ('cfg-' + i + '-rule')); - } + for (let i in cfg) + push(rules, isEmpty(i) ? null : 'cfg-' + i + '-rule'); return rules; } -function subscription_provider_name(name) { - name = trim(name || ''); - return name; +function isDirectOutboundTag(tag) { + if (isEmpty(tag) || tag === 'block-out') + return false; + if (tag === 'direct-out') + return true; + + const node_name = uci.get(uciconfig, tag, 'node') || tag; + const node = uci.get_all(uciconfig, node_name); + return !isEmpty(node) && node.type === 'direct'; } - -function unique_provider_name(name, used) { - const base = name; - let suffix = 2; - - while (used[name]) { - name = sprintf('%s (%d)', base, suffix); - suffix++; - } - used[name] = true; - - return name; -} - -function get_subscription_info(group_hash) { - const value = uci.get(uciconfig, 'subscription', 'subinfo_' + substr(group_hash, 0, 16)); - if (isEmpty(value)) - return null; - - try { - const info = json(value); - if (type(info) !== 'object') - return null; - - const has_subscription_info = ('upload' in info) || ('download' in info) || - ('total' in info) || ('expire' in info); - - return { - updated_at: info.updated_at, - subscription_info: has_subscription_info ? { - upload: info.upload, - download: info.download, - total: info.total, - expire: info.expire - } : null - }; - } catch (e) { - return null; - } -} - -function build_proxy_providers() { - let providers = [], - used_names = {}, - subscription_names = normalize_list(uci.get(uciconfig, 'subscription', 'subscription_name')), - sub_index = 0; - - for (let suburl in normalize_list(uci.get(uciconfig, 'subscription', 'subscription_url'))) { - const subscription_name = subscription_names[sub_index]; - sub_index++; - - if (isEmpty(suburl) || isEmpty(trim(subscription_name || ''))) - continue; - - const url = replace(suburl, /#.*$/, ''), - group_hash = md5(url); - - let proxies = []; - uci.foreach(uciconfig, ucinode, (cfg) => { - if (cfg.grouphash !== group_hash) - return; - - const tag = get_section_outbound_tag(cfg['.name']); - if (!isEmpty(tag) && !~index(proxies, tag)) - push(proxies, tag); - }); - - if (isEmpty(proxies)) - continue; - - const subscription_info = get_subscription_info(group_hash); - - push(providers, { - name: unique_provider_name(subscription_provider_name(subscription_name), used_names), - type: 'Proxy', - vehicle_type: 'HTTP', - proxies: proxies, - update_id: (routing_mode === 'custom') ? group_hash : null, - updated_at: subscription_info?.updated_at, - subscription_info: subscription_info?.subscription_info - }); - } - - return providers; -} - -clash_api = { - external_controller: uci.get(uciconfig, uciclashapi, 'external_controller') || '127.0.0.1:9090', - external_ui: uci.get(uciconfig, uciclashapi, 'external_ui'), - external_ui_download_url: uci.get(uciconfig, uciclashapi, 'external_ui_download_url'), - external_ui_download_detour: get_outbound(uci.get(uciconfig, uciclashapi, 'external_ui_download_detour')), - secret: uci.get(uciconfig, uciclashapi, 'secret'), - default_mode: uci.get(uciconfig, uciclashapi, 'default_mode') || 'rule', - proxy_providers: build_proxy_providers() -}; /* Config helper end */ const config = {}; @@ -721,10 +433,8 @@ config.log = { /* NTP */ if (!isEmpty(ntp_server)) config.ntp = { - enabled: ntp_enabled === '1', + enabled: true, server: ntp_server, - server_port: strToInt(ntp_server_port), - interval: ntp_interval, detour: 'direct-out', domain_resolver: 'default-dns', }; @@ -749,8 +459,12 @@ config.dns = { strategy: dns_default_strategy, disable_cache: strToBool(dns_disable_cache), disable_expire: strToBool(dns_disable_cache_expire), - independent_cache: strToBool(dns_independent_cache), - client_subnet: dns_client_subnet + client_subnet: dns_client_subnet, + optimistic: (dns_optimistic_cache === '1') ? { + enabled: true, + timeout: !isEmpty(dns_optimistic_timeout) ? dns_optimistic_timeout : '3d' + } : null, + timeout: !isEmpty(dns_query_timeout) ? strToTime(dns_query_timeout) : null }; if (!isEmpty(main_node)) { @@ -773,13 +487,11 @@ if (!isEmpty(main_node)) { server: (routing_mode === 'bypass_mainland_china') ? 'china-dns' : 'default-dns' }); - /* Filter out SVCB/HTTPS queries for "exquisite" Apple devices */ - if (routing_mode === 'gfwlist' || length(proxy_domain_list)) - push(config.dns.rules, { - rule_set: (routing_mode !== 'gfwlist') ? 'proxy-domain' : null, - query_type: [64, 65], - action: 'reject' - }); + /* Reject SVCB/HTTPS queries to avoid proxy DNS timeout on null domains */ + push(config.dns.rules, { + query_type: [64, 65], + action: 'reject' + }); if (routing_mode === 'bypass_mainland_china') { push(config.dns.servers, { @@ -792,6 +504,17 @@ if (!isEmpty(main_node)) { ...parse_dnsserver(china_dns_server) }); + /* Route NAPTR (qtype 35) queries for SIP/ENUM domains to the ISP + default-dns directly: china-dns (223.5.5.5) has intermittent + multi-second first responses for NAPTR, causing 'context deadline + exceeded' (e.g. sipgz12.hbq.r.10086.cn) */ + push(config.dns.rules, { + query_type: [35], + domain_suffix: ['r.10086.cn', '10086.cn', 'pub.3gppnetwork.org'], + action: 'route', + server: 'default-dns' + }); + if (length(proxy_domain_list)) push(config.dns.rules, { rule_set: 'proxy-domain', @@ -802,25 +525,23 @@ if (!isEmpty(main_node)) { push(config.dns.rules, { rule_set: 'geosite-cn', action: 'route', - server: 'china-dns', - strategy: 'prefer_ipv6' - }); - push(config.dns.rules, { - type: 'logical', - mode: 'and', - rules: [ - { - rule_set: 'geosite-noncn', - invert: true - }, - { - rule_set: 'geoip-cn' - } - ], - action: 'route', - server: 'china-dns', - strategy: 'prefer_ipv6' + server: 'china-dns' }); + + /* sing-box 1.14: restore CN-IP fallback via evaluate/match_response (opt-in) */ + if (uci.get(uciconfig, ucimain, 'cn_ip_fallback') === '1') { + push(config.dns.rules, { + action: 'evaluate', + server: 'main-dns', + tag: 'cn-fallback' + }); + push(config.dns.rules, { + match_response: 'cn-fallback', + rule_set: 'geoip-cn', + action: 'route', + server: 'china-dns' + }); + } } } else if (!isEmpty(default_outbound)) { /* DNS servers */ @@ -834,7 +555,10 @@ if (!isEmpty(main_node)) { push(config.dns.servers, { tag: 'cfg-' + cfg['.name'] + '-dns', - ...parse_custom_dnsserver(cfg), + type: cfg.type, + server: cfg.server, + server_port: strToInt(cfg.server_port), + path: cfg.path, headers: cfg.headers, tls: cfg.tls_sni ? { enabled: true, @@ -849,11 +573,14 @@ if (!isEmpty(main_node)) { }); /* DNS rules */ + /* sing-box >= 1.14: legacy address-filter rules are auto-wrapped with an + evaluate action; deprecated strategy/accept_empty fields are dropped. */ + const builtin_dns_rules = []; uci.foreach(uciconfig, ucidnsrule, (cfg) => { if (cfg.enabled !== '1') return; - push(config.dns.rules, { + const rule = { ip_version: strToInt(cfg.ip_version), query_type: parse_dnsquery(cfg.query_type), network: cfg.network, @@ -866,8 +593,6 @@ if (!isEmpty(main_node)) { port_range: cfg.port_range, source_ip_cidr: cfg.source_ip_cidr, source_ip_is_private: strToBool(cfg.source_ip_is_private), - ip_cidr: cfg.ip_cidr, - ip_is_private: strToBool(cfg.ip_is_private), source_port: parse_port(cfg.source_port), source_port_range: cfg.source_port_range, process_name: cfg.process_name, @@ -877,24 +602,75 @@ if (!isEmpty(main_node)) { rule_set: get_ruleset(cfg.rule_set), rule_set_ip_cidr_match_source: strToBool(cfg.rule_set_ip_cidr_match_source), invert: strToBool(cfg.invert), - outbound: get_outbound(cfg.outbound), + race: strToBool(cfg.race), + speculative: strToBool(cfg.speculative), action: cfg.action, server: get_resolver(cfg.server), - strategy: cfg.domain_strategy, disable_cache: strToBool(cfg.dns_disable_cache), + disable_optimistic_cache: strToBool(cfg.disable_optimistic_cache), rewrite_ttl: strToInt(cfg.rewrite_ttl), + timeout: strToTime(cfg.dns_timeout), client_subnet: cfg.client_subnet, + remove_client_subnet: strToBool(cfg.remove_client_subnet), method: cfg.reject_method, no_drop: strToBool(cfg.reject_no_drop), rcode: cfg.predefined_rcode, answer: cfg.predefined_answer, ns: cfg.predefined_ns, extra: cfg.predefined_extra - }); - }); + }; - if (isEmpty(config.dns.rules)) - config.dns.rules = null; + if (cfg.action === 'evaluate') + rule.tag = cfg.evaluate_tag || null; + + if (cfg.match_response && cfg.match_response !== '0') + rule.match_response = (cfg.match_response === '1') ? true : cfg.match_response; + + rule.query_client_subnet = cfg.query_client_subnet; + rule.query_dnssec = strToBool(cfg.query_dnssec); + rule.response_rcode = cfg.response_rcode; + rule.response_answer = cfg.response_answer; + rule.response_ns = cfg.response_ns; + rule.response_extra = cfg.response_extra; + rule.source_mac_address = cfg.source_mac_address; + rule.source_hostname = cfg.source_hostname; + + const legacy_filter = !isEmpty(cfg.ip_cidr) || strToBool(cfg.ip_is_private) === true; + if (legacy_filter && !rule.match_response && cfg.action === 'route') { + /* Wrap a legacy address-filter rule into the 1.14 evaluate/match_response + paradigm. Carry the original query-matching fields onto the evaluate + prefix rule so only queries that would have hit this rule get + pre-resolved; an unconditional evaluate would resolve every query. */ + const eval_tag = '_hp_eval_' + cfg['.name']; + const eval_rule = { + action: 'evaluate', + server: get_resolver(cfg.server), + tag: eval_tag + }; + const eval_match_fields = [ + 'inbound', 'ip_version', 'query_type', 'network', 'protocol', 'auth_user', + 'domain', 'domain_suffix', 'domain_keyword', 'domain_regex', + 'port', 'port_range', 'source_ip_cidr', 'source_ip_is_private', + 'source_port', 'source_port_range', 'process_name', 'process_path', + 'process_path_regex', 'user', 'rule_set', 'rule_set_ip_cidr_match_source', + 'invert', 'query_client_subnet', 'query_dnssec', 'source_mac_address', + 'source_hostname' + ]; + for (let f in eval_match_fields) + eval_rule[f] = rule[f]; + push(builtin_dns_rules, eval_rule); + rule.match_response = eval_tag; + } + + /* ip_cidr / ip_is_private are only valid with match_response in 1.14 */ + if (rule.match_response) { + rule.ip_cidr = cfg.ip_cidr; + rule.ip_is_private = strToBool(cfg.ip_is_private); + } + + push(builtin_dns_rules, rule); + }); + config.dns.rules = builtin_dns_rules; config.dns.final = get_resolver(dns_default_server); } @@ -935,7 +711,10 @@ if (match(proxy_mode, /tproxy/)) listen: '::', listen_port: int(tproxy_port), network: 'udp', - udp_timeout: strToTime(udp_timeout) + udp_timeout: strToTime(udp_timeout), + udp_mapping: !isEmpty(udp_mapping) ? udp_mapping : null, + udp_filtering: !isEmpty(udp_filtering) ? udp_filtering : null, + udp_nat_max: udp_nat_max, }); if (match(proxy_mode, /tun/)) push(config.inbounds, { @@ -946,8 +725,14 @@ if (match(proxy_mode, /tun/)) address: (ipv6_support === '1') ? [tun_addr4, tun_addr6] : [tun_addr4], mtu: strToInt(tun_mtu), auto_route: false, + endpoint_independent_nat: strToBool(endpoint_independent_nat), udp_timeout: strToTime(udp_timeout), - stack: tcpip_stack + dns_mode: !isEmpty(tun_dns_mode) ? tun_dns_mode : null, + dns_address: !isEmpty(tun_dns_address) ? tun_dns_address : null, + udp_mapping: !isEmpty(udp_mapping) ? udp_mapping : null, + udp_filtering: !isEmpty(udp_filtering) ? udp_filtering : null, + udp_nat_max: udp_nat_max, + stack: tcpip_stack, }); /* Inbound end */ @@ -972,16 +757,14 @@ if (!isEmpty(main_node)) { let urltest_nodes = []; if (main_node === 'urltest') { - const main_urltest_nodes = filter_existing_nodes( - normalize_list(uci.get(uciconfig, ucimain, 'main_urltest_nodes')) - ); + const main_urltest_nodes = filter(uci.get(uciconfig, ucimain, 'main_urltest_nodes') || [], (k) => uci.get(uciconfig, k)); const main_urltest_interval = uci.get(uciconfig, ucimain, 'main_urltest_interval'); const main_urltest_tolerance = uci.get(uciconfig, ucimain, 'main_urltest_tolerance'); push(config.outbounds, { type: 'urltest', tag: 'main-out', - outbounds: map(main_urltest_nodes, (k) => get_section_outbound_tag(k)), + outbounds: map(main_urltest_nodes, (k) => `cfg-${k}-out`), interval: strToTime(main_urltest_interval), tolerance: strToInt(main_urltest_tolerance), idle_timeout: (strToInt(main_urltest_interval) > 1800) ? `${main_urltest_interval * 2}s` : null, @@ -990,31 +773,23 @@ if (!isEmpty(main_node)) { } else { const main_node_cfg = uci.get_all(uciconfig, main_node) || {}; if (main_node_cfg.type === 'wireguard') { - const main_endpoint = generate_endpoint(main_node_cfg); - if (main_endpoint) { - main_endpoint.tag = 'main-out'; - push(config.endpoints, main_endpoint); - } + push(config.endpoints, generate_endpoint(main_node_cfg)); + config.endpoints[length(config.endpoints)-1].tag = 'main-out'; } else { - const main_outbound = generate_outbound(main_node_cfg); - if (main_outbound) { - main_outbound.tag = 'main-out'; - push(config.outbounds, main_outbound); - } + push(config.outbounds, generate_outbound(main_node_cfg)); + config.outbounds[length(config.outbounds)-1].tag = 'main-out'; } } if (main_udp_node === 'urltest') { - const main_udp_urltest_nodes = filter_existing_nodes( - normalize_list(uci.get(uciconfig, ucimain, 'main_udp_urltest_nodes')) - ); + const main_udp_urltest_nodes = filter(uci.get(uciconfig, ucimain, 'main_udp_urltest_nodes') || [], (k) => uci.get(uciconfig, k)); const main_udp_urltest_interval = uci.get(uciconfig, ucimain, 'main_udp_urltest_interval'); const main_udp_urltest_tolerance = uci.get(uciconfig, ucimain, 'main_udp_urltest_tolerance'); push(config.outbounds, { type: 'urltest', tag: 'main-udp-out', - outbounds: map(main_udp_urltest_nodes, (k) => get_section_outbound_tag(k)), + outbounds: map(main_udp_urltest_nodes, (k) => `cfg-${k}-out`), interval: strToTime(main_udp_urltest_interval), tolerance: strToInt(main_udp_urltest_tolerance), idle_timeout: (strToInt(main_udp_urltest_interval) > 1800) ? `${main_udp_urltest_interval * 2}s` : null, @@ -1023,17 +798,11 @@ if (!isEmpty(main_node)) { } else if (dedicated_udp_node) { const main_udp_node_cfg = uci.get_all(uciconfig, main_udp_node) || {}; if (main_udp_node_cfg.type === 'wireguard') { - const main_udp_endpoint = generate_endpoint(main_udp_node_cfg); - if (main_udp_endpoint) { - main_udp_endpoint.tag = 'main-udp-out'; - push(config.endpoints, main_udp_endpoint); - } + push(config.endpoints, generate_endpoint(main_udp_node_cfg)); + config.endpoints[length(config.endpoints)-1].tag = 'main-udp-out'; } else { - const main_udp_outbound = generate_outbound(main_udp_node_cfg); - if (main_udp_outbound) { - main_udp_outbound.tag = 'main-udp-out'; - push(config.outbounds, main_udp_outbound); - } + push(config.outbounds, generate_outbound(main_udp_node_cfg)); + config.outbounds[length(config.outbounds)-1].tag = 'main-udp-out'; } } @@ -1041,19 +810,12 @@ if (!isEmpty(main_node)) { const urltest_node = uci.get_all(uciconfig, i) || {}; if (isEmpty(urltest_node)) continue; - if (urltest_node.type === 'wireguard') { - const endpoint = generate_endpoint(urltest_node); - if (endpoint) { - endpoint.tag = get_section_outbound_tag(i); - push(config.endpoints, endpoint); - } + push(config.endpoints, generate_endpoint(urltest_node)); + config.endpoints[length(config.endpoints)-1].tag = 'cfg-' + i + '-out'; } else { - const outbound = generate_outbound(urltest_node); - if (outbound) { - outbound.tag = get_section_outbound_tag(i); - push(config.outbounds, outbound); - } + push(config.outbounds, generate_outbound(urltest_node)); + config.outbounds[length(config.outbounds)-1].tag = 'cfg-' + i + '-out'; } } } else if (!isEmpty(default_outbound)) { @@ -1065,63 +827,38 @@ if (!isEmpty(main_node)) { return; if (cfg.node === 'urltest') { - const legacy_nodes = (isEmpty(cfg.subscription_groups) && isEmpty(cfg.subscription_nodes) && isEmpty(cfg.selected_nodes)) ? cfg.urltest_nodes : null; - const urltest_list = collect_group_nodes(cfg.subscription_groups, cfg.subscription_nodes, cfg.selected_nodes, legacy_nodes); + const cfg_urltest_nodes = filter(cfg.urltest_nodes || [], (k) => uci.get(uciconfig, k)); push(config.outbounds, { type: 'urltest', - tag: get_section_outbound_tag(cfg['.name']), - outbounds: map(urltest_list, (k) => get_section_outbound_tag(k)), + tag: 'cfg-' + cfg['.name'] + '-out', + outbounds: map(cfg_urltest_nodes, (k) => `cfg-${k}-out`), url: cfg.urltest_url, interval: strToTime(cfg.urltest_interval), tolerance: strToInt(cfg.urltest_tolerance), idle_timeout: strToTime(cfg.urltest_idle_timeout), interrupt_exist_connections: strToBool(cfg.urltest_interrupt_exist_connections) }); - urltest_nodes = [...urltest_nodes, ...filter(urltest_list, (l) => !~index(urltest_nodes, l))]; - } else if (cfg.node === 'selector') { - const selector_node_list = collect_group_nodes(cfg.subscription_groups, cfg.subscription_nodes, cfg.selected_nodes, null); - const selector_policy_list = collect_policy_nodes(cfg.policy_nodes, cfg['.name']); - const selector_list = [...selector_node_list, ...filter(selector_policy_list, (l) => !~index(selector_node_list, l))]; - const selector_default = (!isEmpty(cfg.selector_default) && ~index(selector_list, cfg.selector_default)) ? cfg.selector_default : null; - push(config.outbounds, { - type: 'selector', - tag: get_section_outbound_tag(cfg['.name']), - outbounds: map(selector_list, (k) => get_section_outbound_tag(k)), - default: selector_default ? get_section_outbound_tag(selector_default) : null, - interrupt_exist_connections: strToBool(cfg.selector_interrupt_exist_connections) - }); - urltest_nodes = [...urltest_nodes, ...filter(selector_node_list, (l) => !~index(urltest_nodes, l))]; + urltest_nodes = [...urltest_nodes, ...filter(cfg_urltest_nodes, (l) => !~index(urltest_nodes, l))]; } else { const outbound = uci.get_all(uciconfig, cfg.node) || {}; - if (isEmpty(outbound)) - return; - if (outbound.type === 'wireguard') { - const endpoint = generate_endpoint(outbound); - if (!endpoint) - return; - - endpoint.bind_interface = cfg.bind_interface; - endpoint.detour = get_outbound(cfg.outbound); + push(config.endpoints, generate_endpoint(outbound)); + config.endpoints[length(config.endpoints)-1].bind_interface = cfg.bind_interface; + config.endpoints[length(config.endpoints)-1].detour = get_outbound(cfg.outbound); if (cfg.domain_resolver) - endpoint.domain_resolver = { + config.endpoints[length(config.endpoints)-1].domain_resolver = { server: get_resolver(cfg.domain_resolver), strategy: cfg.domain_strategy }; - push(config.endpoints, endpoint); } else { - const routed_outbound = generate_outbound(outbound); - if (!routed_outbound) - return; - - routed_outbound.bind_interface = cfg.bind_interface; - routed_outbound.detour = get_outbound(cfg.outbound); + push(config.outbounds, generate_outbound(outbound)); + config.outbounds[length(config.outbounds)-1].bind_interface = cfg.bind_interface; + config.outbounds[length(config.outbounds)-1].detour = get_outbound(cfg.outbound); if (cfg.domain_resolver) - routed_outbound.domain_resolver = { + config.outbounds[length(config.outbounds)-1].domain_resolver = { server: get_resolver(cfg.domain_resolver), strategy: cfg.domain_strategy }; - push(config.outbounds, routed_outbound); } push(routing_nodes, cfg.node); } @@ -1129,18 +866,10 @@ if (!isEmpty(main_node)) { for (let i in filter(urltest_nodes, (l) => !~index(routing_nodes, l))) { const urltest_node = uci.get_all(uciconfig, i) || {}; - if (isEmpty(urltest_node)) - continue; - - if (urltest_node.type === 'wireguard') { - const endpoint = generate_endpoint(urltest_node); - if (endpoint) - push(config.endpoints, endpoint); - } else { - const outbound = generate_outbound(urltest_node); - if (outbound) - push(config.outbounds, outbound); - } + if (urltest_node.type === 'wireguard') + push(config.endpoints, generate_endpoint(urltest_node)); + else + push(config.outbounds, generate_outbound(urltest_node)); } } @@ -1157,7 +886,8 @@ config.route = { action: 'hijack-dns' }, { - action: 'sniff' + action: 'sniff', + timeout: '300ms' } ], rule_set: [], @@ -1167,10 +897,13 @@ config.route = { /* Routing rules */ if (!isEmpty(main_node)) { - /* Avoid DNS loop */ + /* Resolve outbound server domains through the WAN default resolver. + Do not use china-dns here: china-dns is for resolving mainland China + destinations, not the proxy node itself. Coupling node bootstrap to + china_dns_server can break dialing when that resolver is polluted or + unsuitable for the node domain. */ config.route.default_domain_resolver = { - action: 'route', - server: (routing_mode === 'bypass_mainland_china') ? 'china-dns' : 'default-dns', + server: 'default-dns', strategy: (ipv6_support !== '1') ? 'prefer_ipv4' : null }; @@ -1182,12 +915,46 @@ if (!isEmpty(main_node)) { outbound: 'direct-out' }); + /* Bypass CN traffic: resolve the destination first, then route by IP. + sing-box does not match an IP-based rule set (geoip-cn) against a domain + destination unless it is resolved first, so add an explicit resolve + action; geoip-cn then sends China IPs to direct and everything else falls + through to main-out (proxy). This avoids relying on the geosite-* domain + lists, which can mis-classify foreign domains (e.g. Google's gvt2.com + beacons) as "cn" and send them direct to time out. Keep the direct-domain + fast-path above for known direct domains. */ + if (routing_mode === 'bypass_mainland_china') { + push(config.route.rules, { + action: 'resolve', + strategy: (ipv6_support !== '1') ? 'prefer_ipv4' : null + }); + push(config.route.rules, { + rule_set: 'geoip-cn', + action: 'route', + outbound: 'direct-out' + }); + } + /* Main UDP out */ - if (dedicated_udp_node) + if (dedicated_udp_node) { + const udp_override = direct_overrides[main_udp_node] || null; push(config.route.rules, { network: 'udp', action: 'route', - outbound: 'main-udp-out' + outbound: 'main-udp-out', + override_address: udp_override ? udp_override.override_address : null, + override_port: udp_override ? udp_override.override_port : null + }); + } + + /* Direct-node destination override, emitted as route-options action + (direct outbound options removed since sing-box 1.13) */ + const main_override = direct_overrides[main_node] || null; + if (main_override) + push(config.route.rules, { + action: 'route-options', + override_address: main_override.override_address, + override_port: main_override.override_port }); config.route.final = 'main-out'; @@ -1218,28 +985,35 @@ if (!isEmpty(main_node)) { }); if (routing_mode === 'bypass_mainland_china') { + /* + * Fetched straight from the upstream SagerNet repositories and + * downloaded through the selected node. A direct fetch depends on + * the CDN staying reachable from mainland China, where DNS pollution + * makes it fail intermittently; the three files total ~250 KB per + * day, so proxying the download costs almost nothing. + */ push(config.route.rule_set, { type: 'remote', tag: 'geoip-cn', format: 'binary', - url: 'https://fastly.jsdelivr.net/gh/1715173329/IPCIDR-CHINA@rule-set/cn.srs', - initial_path: ruleset_default_path('geoip-cn', 'binary'), + url: 'https://raw.githubusercontent.com/SagerNet/sing-geoip/rule-set/geoip-cn.srs', + update_interval: '24h', download_detour: 'main-out' }); push(config.route.rule_set, { type: 'remote', tag: 'geosite-cn', format: 'binary', - url: 'https://fastly.jsdelivr.net/gh/1715173329/sing-geosite@rule-set-unstable/geosite-geolocation-cn.srs', - initial_path: ruleset_default_path('geosite-cn', 'binary'), + url: 'https://raw.githubusercontent.com/SagerNet/sing-geosite/rule-set/geosite-geolocation-cn.srs', + update_interval: '24h', download_detour: 'main-out' }); push(config.route.rule_set, { type: 'remote', tag: 'geosite-noncn', format: 'binary', - url: 'https://fastly.jsdelivr.net/gh/1715173329/sing-geosite@rule-set-unstable/geosite-geolocation-!cn.srs', - initial_path: ruleset_default_path('geosite-noncn', 'binary'), + url: 'https://raw.githubusercontent.com/SagerNet/sing-geosite/rule-set/geosite-geolocation-!cn.srs', + update_interval: '24h', download_detour: 'main-out' }); } @@ -1248,10 +1022,12 @@ if (!isEmpty(main_node)) { config.route.rule_set = null; } else if (!isEmpty(default_outbound)) { config.route.default_domain_resolver = { - action: 'resolve', server: get_resolver(default_outbound_dns) }; + if (uci.get(uciconfig, uciroutingsetting, 'find_neighbor') === '1') + config.route.find_neighbor = true; + if (domain_strategy) push(config.route.rules, { action: 'resolve', @@ -1262,10 +1038,25 @@ if (!isEmpty(main_node)) { if (cfg.enabled !== '1') return null; - push(config.route.rules, { + const rule_outbound = get_outbound(cfg.outbound); + const rule_direct_override = get_direct_override(cfg.outbound); + let rule_override_address = cfg.override_address, + rule_override_port = strToInt(cfg.override_port); + if (isEmpty(rule_override_address) && isEmpty(rule_override_port) && rule_direct_override) { + rule_override_address = rule_direct_override.override_address; + rule_override_port = rule_direct_override.override_port; + } + + /* sing-box routing rule: emit match fields plus action-specific fields. + client is the sniffed client type (only set with protocol quic/ssh); + resolve adds server/strategy/disable_cache/rewrite_ttl/client_subnet; + reject adds method/no_drop. Emitted conditionally so a given action + never carries fields sing-box rejects for it. */ + const rule = { ip_version: strToInt(cfg.ip_version), protocol: cfg.protocol, network: cfg.network, + client: cfg.client, domain: cfg.domain, domain_suffix: cfg.domain_suffix, domain_keyword: cfg.domain_keyword, @@ -1284,28 +1075,48 @@ if (!isEmpty(main_node)) { user: cfg.user, rule_set: get_ruleset(cfg.rule_set), rule_set_ip_cidr_match_source: strToBool(cfg.rule_set_ip_cidr_match_source), - rule_set_ip_cidr_accept_empty: strToBool(cfg.rule_set_ip_cidr_accept_empty), invert: strToBool(cfg.invert), action: cfg.action, - outbound: (cfg.action === 'route') ? get_outbound(cfg.outbound) : null, - server: (cfg.action === 'resolve') ? get_resolver(cfg.resolve_server) : null, - strategy: (cfg.action === 'resolve') ? cfg.resolve_strategy : null, - disable_cache: (cfg.action === 'resolve') ? strToBool(cfg.resolve_disable_cache) : null, - rewrite_ttl: (cfg.action === 'resolve') ? strToInt(cfg.resolve_rewrite_ttl) : null, - client_subnet: (cfg.action === 'resolve') ? cfg.resolve_client_subnet : null, - override_address: (cfg.action in ['route', 'route-options']) ? cfg.override_address : null, - override_port: (cfg.action in ['route', 'route-options']) ? strToInt(cfg.override_port) : null, - udp_disable_domain_unmapping: (cfg.action in ['route', 'route-options']) ? strToBool(cfg.udp_disable_domain_unmapping) : null, - udp_connect: (cfg.action in ['route', 'route-options']) ? strToBool(cfg.udp_connect) : null, - udp_timeout: (cfg.action in ['route', 'route-options']) ? strToTime(cfg.udp_timeout) : null, - tls_fragment: (cfg.action in ['route', 'route-options']) ? strToBool(cfg.tls_fragment) : null, - tls_fragment_fallback_delay: (cfg.action in ['route', 'route-options']) ? strToTime(cfg.tls_fragment_fallback_delay) : null, - tls_record_fragment: (cfg.action in ['route', 'route-options']) ? strToBool(cfg.tls_record_fragment) : null, - method: (cfg.action === 'reject') ? cfg.reject_method : null, - no_drop: (cfg.action === 'reject') ? strToBool(cfg.reject_no_drop) : null - }); + outbound: rule_outbound, + override_address: rule_override_address, + override_port: rule_override_port, + udp_disable_domain_unmapping: strToBool(cfg.udp_disable_domain_unmapping), + udp_connect: strToBool(cfg.udp_connect), + udp_timeout: strToTime(cfg.udp_timeout), + tls_fragment: strToBool(cfg.tls_fragment), + tls_fragment_fallback_delay: strToTime(cfg.tls_fragment_fallback_delay), + tls_record_fragment: strToBool(cfg.tls_record_fragment), + tls_spoof: cfg.tls_spoof || null, + tls_spoof_method: cfg.tls_spoof_method || null, + source_mac_address: cfg.source_mac_address, + source_hostname: cfg.source_hostname + }; + if (cfg.action === 'resolve') { + rule.server = get_resolver(cfg.resolve_server); + rule.strategy = cfg.resolve_strategy; + rule.disable_cache = strToBool(cfg.resolve_disable_cache); + rule.disable_optimistic_cache = strToBool(cfg.resolve_disable_optimistic_cache); + rule.rewrite_ttl = strToInt(cfg.resolve_rewrite_ttl); + rule.timeout = strToTime(cfg.resolve_timeout); + rule.client_subnet = cfg.resolve_client_subnet; + } + if (cfg.action === 'reject') { + rule.method = cfg.reject_method; + rule.no_drop = strToBool(cfg.reject_no_drop); + } + push(config.route.rules, rule); }); + /* Direct-node destination override, emitted as route-options action + (direct outbound options removed since sing-box 1.13) */ + const final_override = get_direct_override(default_outbound); + if (final_override) + push(config.route.rules, { + action: 'route-options', + override_address: final_override.override_address, + override_port: final_override.override_port + }); + config.route.final = get_outbound(default_outbound); /* Rule set */ @@ -1313,35 +1124,94 @@ if (!isEmpty(main_node)) { if (cfg.enabled !== '1') return null; - const tag = !isEmpty(cfg.tag) ? cfg.tag : ('cfg-' + cfg['.name'] + '-rule'); + const extra_tags = cfg.extra_tags || []; + let rs_tag = 'cfg-' + cfg['.name'] + '-rule'; + if (length(extra_tags) && cfg.type !== 'inline') { + rs_tag = [rs_tag]; + for (let t in extra_tags) + push(rs_tag, 'cfg-' + t + '-rule'); + /* sing-box 1.14: multi-tag requires a {tag} placeholder in the fetch source + (remote: url and initial_path, local: path) */ + const fetch_ref = (cfg.type === 'remote') ? (cfg.url || '') : (cfg.path || ''); + if (!match(fetch_ref, /\{tag\}/)) + warn(sprintf("homeproxy: rule-set '%s' uses extra tags but its %s source lacks a {tag} placeholder.", cfg['.name'], cfg.type)); + if (cfg.type === 'remote' && !isEmpty(cfg.initial_path) && !match(cfg.initial_path, /\{tag\}/)) + warn(sprintf("homeproxy: rule-set '%s' uses extra tags but its initial_path lacks a {tag} placeholder.", cfg['.name'])); + } - push(config.route.rule_set, { + const ruleset = { type: cfg.type, - tag: tag, + tag: rs_tag, format: cfg.format, + path: cfg.path, url: cfg.url, - path: (cfg.type === 'remote') ? ruleset_remote_path(cfg.remote_path || cfg.path, tag, cfg.format) : cfg.path, - download_detour: get_outbound(cfg.outbound), - update_interval: (cfg.type === 'remote') ? '87600h' : null - }); + update_interval: cfg.update_interval + }; + /* download_detour is a pre-1.14 option that only makes sense for + remote rule-sets; emitting it for local/inline ones makes sing-box + 1.14 reject the whole config. It is translated into http_clients + right below. */ + if (cfg.type === 'remote') + ruleset.download_detour = get_outbound(cfg.outbound) || get_outbound(default_outbound); + if (cfg.type === 'remote' && !isEmpty(cfg.initial_path)) + ruleset.initial_path = cfg.initial_path; + push(config.route.rule_set, ruleset); }); } + +/* sing-box 1.14: remote rule-sets download via top-level http_clients; + replaces the legacy download_detour field everywhere (preset + custom). */ +const http_clients = []; +const http_seen = {}; +for (let rs in (config.route.rule_set || [])) { + /* Strip the legacy field from every entry first, including the + local/inline ones: sing-box 1.14 rejects it everywhere except on + remote rule-sets, where it is replaced by http_client below. */ + let detour = rs.download_detour; + delete rs.download_detour; + + if (rs.type !== 'remote') + continue; + + if (isEmpty(detour)) + detour = (routing_mode === 'custom') ? (get_outbound(default_outbound) || 'direct-out') : 'direct-out'; + + const tag = 'hp-' + detour; + rs.http_client = tag; + if (!http_seen[detour]) { + http_seen[detour] = true; + /* sing-box 1.14 rejects detouring to an empty direct outbound + (pure TUN mode has no self_mark on direct-out). Omitting detour + uses the same system direct dialer, so behavior is unchanged. */ + const client = { tag: tag }; + if (!(isEmpty(self_mark) && isDirectOutboundTag(detour))) + client.detour = detour; + push(http_clients, client); + } +} +if (length(http_clients)) + config.http_clients = http_clients; /* Routing rules end */ /* Experimental start */ if (routing_mode in ['bypass_mainland_china', 'custom']) { config.experimental = { - clash_api, cache_file: { - enabled: cache_file_enabled !== '0', - path: cache_file_path || (HP_DIR + '/cache.db'), - store_rdrc: strToBool(cache_store_rdrc), - rdrc_timeout: strToTime(cache_rdrc_timeout), + enabled: true, + path: '/etc/homeproxy/cache.db', + store_dns: (dns_store_dns === '1') ? true : null } }; } /* Experimental end */ +config['$schema'] = 'https://sing-box.sagernet.org/schema.json'; + system('mkdir -p ' + RUN_DIR); -system('mkdir -p ' + RULESET_DIR); -writefile(RUN_DIR + '/sing-box-c.json', sprintf('%.J\n', removeBlankAttrs(config))); +const client_tmp = RUN_DIR + '/sing-box-c.json.tmp'; +writefile(client_tmp, sprintf('%.J\n', removeBlankAttrs(config))); +if (system('/usr/bin/sing-box check --config ' + client_tmp) !== 0) { + system('rm -f ' + client_tmp); + exit(1); +} +system('mv -f ' + client_tmp + ' ' + RUN_DIR + '/sing-box-c.json'); diff --git a/luci-app-homeproxy/root/etc/homeproxy/scripts/generate_server.uc b/luci-app-homeproxy/root/etc/homeproxy/scripts/generate_server.uc index 7941afa6f..40e0c93d4 100755 --- a/luci-app-homeproxy/root/etc/homeproxy/scripts/generate_server.uc +++ b/luci-app-homeproxy/root/etc/homeproxy/scripts/generate_server.uc @@ -11,8 +11,8 @@ import { writefile } from 'fs'; import { cursor } from 'uci'; import { - isEmpty, strToBool, strToInt, strToTime, - removeBlankAttrs, HP_DIR, RUN_DIR + strToBool, strToInt, strToTime, + removeBlankAttrs, buildTLSObject, buildTransportObject, HP_DIR, RUN_DIR } from 'homeproxy'; /* UCI config start */ @@ -42,6 +42,26 @@ uci.foreach(uciconfig, uciserver, (cfg) => { if (cfg.enabled !== '1') return; + /* Snell (1.14): single-psk inbound; shape differs from the generic users[] block below */ + if (cfg.type === 'snell') { + push(config.inbounds, { + type: 'snell', + tag: 'cfg-' + cfg['.name'] + '-in', + + listen: cfg.address || '::', + listen_port: strToInt(cfg.port), + bind_interface: cfg.bind_interface, + reuse_addr: strToBool(cfg.reuse_addr), + tcp_fast_open: strToBool(cfg.tcp_fast_open), + tcp_multi_path: strToBool(cfg.tcp_multi_path), + version: strToInt(cfg.snell_version) || 5, + psk: cfg.password, + obfs_mode: cfg.snell_obfs_mode, + mode: cfg.snell_mode + }); + return; + } + push(config.inbounds, { type: cfg.type, tag: 'cfg-' + cfg['.name'] + '-in', @@ -59,17 +79,15 @@ uci.foreach(uciconfig, uciserver, (cfg) => { /* AnyTLS */ padding_scheme: cfg.anytls_padding_scheme, - /* Hysteria */ + /* Hysteria (2) */ up_mbps: strToInt(cfg.hysteria_up_mbps), down_mbps: strToInt(cfg.hysteria_down_mbps), obfs: cfg.hysteria_obfs_type ? { type: cfg.hysteria_obfs_type, - password: cfg.hysteria_obfs_password + password: cfg.hysteria_obfs_password, + min_packet_size: strToInt(cfg.hysteria_obfs_min_packet_size), + max_packet_size: strToInt(cfg.hysteria_obfs_max_packet_size) } : cfg.hysteria_obfs_password, - recv_window_conn: strToInt(cfg.hysteria_recv_window_conn), - recv_window_client: strToInt(cfg.hysteria_recv_window_client), - max_conn_client: strToInt(cfg.hysteria_max_conn_client), - disable_mtu_discovery: strToBool(cfg.hysteria_disable_mtu_discovery), ignore_client_bandwidth: strToBool(cfg.hysteria_ignore_client_bandwidth), masquerade: cfg.hysteria_masquerade, @@ -113,73 +131,22 @@ uci.foreach(uciconfig, uciserver, (cfg) => { } : null } : null, - tls: (cfg.tls === '1') ? { - enabled: true, - server_name: cfg.tls_sni, - alpn: cfg.tls_alpn, - min_version: cfg.tls_min_version, - max_version: cfg.tls_max_version, - cipher_suites: cfg.tls_cipher_suites, - certificate_path: cfg.tls_cert_path, - key_path: cfg.tls_key_path, - acme: (cfg.tls_acme === '1') ? { - domain: cfg.tls_acme_domain, - data_directory: HP_DIR + '/certs', - default_server_name: cfg.tls_acme_dsn, - email: cfg.tls_acme_email, - provider: cfg.tls_acme_provider, - disable_http_challenge: strToBool(cfg.tls_acme_dhc), - disable_tls_alpn_challenge: (cfg.tls_acme_dtac), - alternative_http_port: strToInt(cfg.tls_acme_ahp), - alternative_tls_port: strToInt(cfg.tls_acme_atp), - external_account: (cfg.tls_acme_external_account === '1') ? { - key_id: cfg.tls_acme_ea_keyid, - mac_key: cfg.tls_acme_ea_mackey - } : null, - dns01_challenge: (cfg.tls_dns01_challenge === '1') ? { - provider: cfg.tls_dns01_provider, - access_key_id: cfg.tls_dns01_ali_akid, - access_key_secret: cfg.tls_dns01_ali_aksec, - region_id: cfg.tls_dns01_ali_rid, - api_token: cfg.tls_dns01_cf_api_token - } : null - } : null, - ech: (cfg.tls_ech_key) ? { - enabled: true, - key: split(cfg.tls_ech_key, '\n'), - // config: split(cfg.tls_ech_config, '\n') - } : null, - reality: (cfg.tls_reality === '1') ? { - enabled: true, - private_key: cfg.tls_reality_private_key, - short_id: cfg.tls_reality_short_id, - max_time_difference: strToTime(cfg.tls_reality_max_time_difference), - handshake: { - server: cfg.tls_reality_server_addr, - server_port: strToInt(cfg.tls_reality_server_port) - } - } : null - } : null, + tls: buildTLSObject(cfg, true), - transport: !isEmpty(cfg.transport) ? { - type: cfg.transport, - host: cfg.http_host || cfg.httpupgrade_host, - path: cfg.http_path || cfg.ws_path, - headers: cfg.ws_host ? { - Host: cfg.ws_host - } : null, - method: cfg.http_method, - max_early_data: strToInt(cfg.websocket_early_data), - early_data_header_name: cfg.websocket_early_data_header, - service_name: cfg.grpc_servicename, - idle_timeout: strToTime(cfg.http_idle_timeout), - ping_timeout: strToTime(cfg.http_ping_timeout) - } : null + transport: buildTransportObject(cfg, true) }); }); if (length(config.inbounds) === 0) exit(1); +config['$schema'] = 'https://sing-box.sagernet.org/schema.json'; + system('mkdir -p ' + RUN_DIR); -writefile(RUN_DIR + '/sing-box-s.json', sprintf('%.J\n', removeBlankAttrs(config))); +const server_tmp = RUN_DIR + '/sing-box-s.json.tmp'; +writefile(server_tmp, sprintf('%.J\n', removeBlankAttrs(config))); +if (system('/usr/bin/sing-box check --config ' + server_tmp) !== 0) { + system('rm -f ' + server_tmp); + exit(1); +} +system('mv -f ' + server_tmp + ' ' + RUN_DIR + '/sing-box-s.json'); diff --git a/luci-app-homeproxy/root/etc/homeproxy/scripts/homeproxy.uc b/luci-app-homeproxy/root/etc/homeproxy/scripts/homeproxy.uc old mode 100755 new mode 100644 index 8ff55bf7f..93e2d7e59 --- a/luci-app-homeproxy/root/etc/homeproxy/scripts/homeproxy.uc +++ b/luci-app-homeproxy/root/etc/homeproxy/scripts/homeproxy.uc @@ -26,30 +26,55 @@ export function isBinary(str) { return false; }; +/* Close a file descriptor, swallowing secondary errors (e.g. an already + closed fd). ucode has no `finally` clause, so both the normal and the + exceptional path of executeCommand() have to close explicitly. */ +function closeFD(fd) { + if (fd) { + try { + fd.close(); + } catch (e) { + /* already closed */ + } + } +}; + export function executeCommand(...args) { - let outfd = mkstemp(); - let errfd = mkstemp(); + let outfd = null, errfd = null; - const exitcode = system(`${join(' ', args)} >&${outfd.fileno()} 2>&${errfd.fileno()}`); + try { + outfd = mkstemp(); + errfd = mkstemp(); - outfd.seek(0); - errfd.seek(0); + const exitcode = system(`${join(' ', args)} >&${outfd.fileno()} 2>&${errfd.fileno()}`); - const stdout = outfd.read(1024 * 512) ?? ''; - const stderr = errfd.read(1024 * 512) ?? ''; + outfd.seek(0); + errfd.seek(0); - outfd.close(); - errfd.close(); + const stdout = outfd.read(1024 * 512) ?? ''; + const stderr = errfd.read(1024 * 512) ?? ''; - const binary = isBinary(stdout); + const binary = isBinary(stdout); - return { - command: join(' ', args), - stdout: binary ? null : stdout, - stderr, - exitcode, - binary - }; + /* mkstemp() returns delete-on-close files, so closing is enough */ + closeFD(outfd); + closeFD(errfd); + + return { + command: join(' ', args), + stdout: binary ? null : stdout, + stderr, + exitcode, + binary + }; + } catch (e) { + /* Never leak the temporary descriptors on a failing run. ucode has + no `finally` clause, so the exception is re-raised by hand. */ + closeFD(outfd); + closeFD(errfd); + + die(e); + } }; export function getTime(epoch) { @@ -66,34 +91,35 @@ export function getTime(epoch) { }; -export function wGETResponse(url, ua) { +/* + * Fetch a URL and report both the body and, on failure, the reason. The + * reason is wget's own stderr (whitespace collapsed, length-capped) so the + * caller can tell a DNS failure from a timeout or a TLS handshake error. + */ +export function wGETVerbose(url, ua) { if (!url || type(url) !== 'string') - return null; + return { content: null, error: 'invalid URL' }; if (!ua) ua = 'Wget/1.21 (HomeProxy, like v2rayN)'; - const output = executeCommand(`/usr/bin/wget -O- -S --user-agent ${shellQuote(ua)} --timeout=10 ${shellQuote(url)}`) || {}; - return { - body: trim(output.stdout), - headers: output.stderr || '', - exitcode: output.exitcode - }; + /* -nv (not -q) so wget still reports *why* a fetch failed on stderr */ + const output = executeCommand(`/usr/bin/wget -nv -O- --user-agent ${shellQuote(ua)} --timeout=10 ${shellQuote(url)}`) || {}; + if (output.exitcode !== 0) { + let reason = trim(output.stderr || ''); + reason = reason ? replace(reason, /\s+/g, ' ') : 'no error output'; + + if (length(reason) > 200) + reason = substr(reason, 0, 200) + '...'; + + return { content: null, error: `wget exited with status ${output.exitcode}: ${reason}` }; + } + + return { content: trim(output.stdout), error: null }; }; export function wGET(url, ua) { - return wGETResponse(url, ua)?.body; -}; - -export function wGETHeaders(url, ua) { - if (!url || type(url) !== 'string') - return null; - - if (!ua) - ua = 'clash.meta'; - - const output = executeCommand(`/usr/bin/wget -O /dev/null -S --user-agent ${shellQuote(ua)} --timeout=10 ${shellQuote(url)}`) || {}; - return output.stderr || ''; + return wGETVerbose(url, ua).content; }; /* Utilities end */ @@ -103,7 +129,7 @@ export function isEmpty(res) { }; export function strToBool(str) { - return (str === '1') || null; + return str === '1' ? true : (str === '0' ? false : null); }; export function strToInt(str) { @@ -111,7 +137,11 @@ export function strToInt(str) { }; export function strToTime(str) { - return !isEmpty(str) ? (str + 's') : null; + if (isEmpty(str)) + return null; + + /* Preserve values that already carry a time unit (e.g. "30s", "1m") */ + return match(str, /[a-zA-Z]$/) ? str : (str + 's'); }; export function removeBlankAttrs(res) { @@ -152,6 +182,77 @@ export function validation(datatype, data) { const ret = system(`/sbin/validate_data ${shellQuote(datatype)} ${shellQuote(data)} 2>/dev/null`); return (ret === 0); }; + +/* Validate IP/CIDR format to prevent nftables template injection from resource files */ +export function isValidCIDR(addr, family) { + if (isEmpty(addr)) + return false; + + /* Strip leading/trailing whitespace */ + addr = trim(addr); + if (!addr) + return false; + + /* Split address and optional prefix */ + const parts = split(addr, '/'); + const ip = parts[0]; + const prefix = parts[1]; + + /* Validate IP part */ + if (family === 4) { + if (!match(ip, /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/)) + return false; + /* Validate octet ranges */ + const octets = split(ip, '.'); + for (let o in octets) + if (int(o) > 255) + return false; + /* Validate prefix if present */ + if (prefix && (int(prefix) < 0 || int(prefix) > 32)) + return false; + } else if (family === 6) { + /* Only hex digits and colons */ + if (!match(ip, /^[0-9a-fA-F:]+$/)) + return false; + + /* At most one "::" */ + if (match(ip, /::.*::/)) + return false; + + /* Validate group structure */ + const dcolon = index(ip, '::'); + if (dcolon === -1) { + /* Uncompressed form: exactly 8 groups of 1-4 hex digits */ + const groups = split(ip, ':'); + if (length(groups) !== 8) + return false; + for (let g in groups) + if (!match(g, /^[0-9a-fA-F]{1,4}$/)) + return false; + } else { + /* Compressed form: "::" expands to at least one zero group */ + let count = 0; + for (let part in [substr(ip, 0, dcolon), substr(ip, dcolon + 2)]) { + if (part === '') + continue; + for (let g in split(part, ':')) { + if (!match(g, /^[0-9a-fA-F]{1,4}$/)) + return false; + count++; + } + } + if (count > 7) + return false; + } + + if (prefix && (int(prefix) < 0 || int(prefix) > 128)) + return false; + } else { + return false; + } + + return true; +}; /* String helper end */ /* String parser start */ @@ -160,8 +261,8 @@ export function decodeBase64Str(str) { return null; str = trim(str); - str = replace(str, '_', '/'); - str = replace(str, '-', '+'); + str = replace(str, /_/g, '/'); + str = replace(str, /-/g, '+'); const padding = length(str) % 4; if (padding) @@ -247,3 +348,139 @@ export function parseURL(url) { return objurl; }; /* String parser end */ + +/* Config generator helper start */ +/* + * Shared sing-box TLS object builder for the client outbound and the server + * inbound. The property order below is significant: the generated JSON keeps + * the insertion order of this object after removeBlankAttrs() drops the blank + * attributes, and both generators used to emit the fields in exactly this + * order. Keep client-only fields (insecure/handshake_timeout/utls) and + * server-only fields (key_path/certificate_provider) at their current + * positions when editing. + */ +export function buildTLSObject(cfg, is_server) { + if (cfg.tls !== '1') + return null; + + return { + enabled: true, + server_name: cfg.tls_sni, + insecure: is_server ? null : strToBool(cfg.tls_insecure), + alpn: cfg.tls_alpn, + min_version: cfg.tls_min_version, + max_version: cfg.tls_max_version, + handshake_timeout: is_server ? null : strToTime(cfg.tls_handshake_timeout), + cipher_suites: cfg.tls_cipher_suites, + certificate_path: cfg.tls_cert_path, + key_path: is_server ? cfg.tls_key_path : null, + certificate_provider: (is_server && cfg.tls_acme === '1') ? { + type: 'acme', + domain: (type(cfg.tls_acme_domain) === 'array') ? cfg.tls_acme_domain + : (isEmpty(cfg.tls_acme_domain) ? [] : [cfg.tls_acme_domain]), + data_directory: HP_DIR + '/certs', + default_server_name: cfg.tls_acme_dsn, + email: cfg.tls_acme_email, + provider: cfg.tls_acme_provider, + account_key: cfg.tls_acme_account_key, + key_type: cfg.tls_acme_key_type, + profile: cfg.tls_acme_profile, + disable_http_challenge: strToBool(cfg.tls_acme_dhc), + disable_tls_alpn_challenge: strToBool(cfg.tls_acme_dtac), + alternative_http_port: strToInt(cfg.tls_acme_ahp), + alternative_tls_port: strToInt(cfg.tls_acme_atp), + external_account: (cfg.tls_acme_external_account === '1') ? { + key_id: cfg.tls_acme_ea_keyid, + mac_key: cfg.tls_acme_ea_mackey + } : null, + dns01_challenge: (cfg.tls_dns01_challenge === '1') ? { + provider: cfg.tls_dns01_provider, + access_key_id: cfg.tls_dns01_ali_akid, + access_key_secret: cfg.tls_dns01_ali_aksec, + region_id: cfg.tls_dns01_ali_rid, + api_token: cfg.tls_dns01_cf_api_token + } : null + } : null, + ech: is_server ? (cfg.tls_ech_key ? { + enabled: true, + key: split(cfg.tls_ech_key, '\n') + /* config: split(cfg.tls_ech_config, '\n') */ + } : null) : ((cfg.tls_ech === '1') ? { + enabled: true, + config: cfg.tls_ech_config, + config_path: cfg.tls_ech_config_path + } : null), + utls: (is_server || isEmpty(cfg.tls_utls)) ? null : { + enabled: true, + fingerprint: cfg.tls_utls + }, + reality: (cfg.tls_reality !== '1') ? null : (is_server ? { + enabled: true, + private_key: cfg.tls_reality_private_key, + short_id: cfg.tls_reality_short_id, + max_time_difference: strToTime(cfg.tls_reality_max_time_difference), + handshake: { + server: cfg.tls_reality_server_addr, + server_port: strToInt(cfg.tls_reality_server_port) + } + } : { + enabled: true, + public_key: cfg.tls_reality_public_key, + short_id: cfg.tls_reality_short_id + }) + }; +}; + +/* Shared sing-box transport object builder; the client transport additionally + supports the gRPC keepalive hint, the server one does not. */ +export function buildTransportObject(cfg, is_server) { + if (isEmpty(cfg.transport)) + return null; + + return { + type: cfg.transport, + host: cfg.http_host || cfg.httpupgrade_host, + path: cfg.http_path || cfg.ws_path, + headers: cfg.ws_host ? { + Host: cfg.ws_host + } : null, + method: cfg.http_method, + max_early_data: strToInt(cfg.websocket_early_data), + early_data_header_name: cfg.websocket_early_data_header, + service_name: cfg.grpc_servicename, + idle_timeout: strToTime(cfg.http_idle_timeout), + ping_timeout: strToTime(cfg.http_ping_timeout), + permit_without_stream: is_server ? null : strToBool(cfg.grpc_permit_without_stream) + }; +}; +/* Config generator helper end */ + +/* PEM validation start */ +/* + * Check that `content` is a PEM certificate (is_private_key = false) or an + * RSA/EC private key (is_private_key = true): matching BEGIN/END boundaries + * with a base64 body in between. Kanged from luci-proto-openconnect; used by + * the rpcd certificate upload and available for future certificate features. + */ +export function isValidPEM(content, is_private_key) { + if (isEmpty(content)) + return false; + + const beg = is_private_key ? /^-----BEGIN (RSA|EC) PRIVATE KEY-----$/ : /^-----BEGIN CERTIFICATE-----$/, + end = is_private_key ? /^-----END (RSA|EC) PRIVATE KEY-----$/ : /^-----END CERTIFICATE-----$/, + lines = split(trim(content), /[\r\n]/); + let start = false, i; + + for (i = 0; i < length(lines); i++) { + if (match(lines[i], beg)) + start = true; + else if (start && !b64dec(lines[i]) && length(lines[i]) !== 64) + break; + } + + if (!start || i < length(lines) - 1 || !match(lines[i], end)) + return false; + + return true; +}; +/* PEM validation end */ diff --git a/luci-app-homeproxy/root/etc/homeproxy/scripts/migrate_config.uc b/luci-app-homeproxy/root/etc/homeproxy/scripts/migrate_config.uc index 5f6278787..a0b9d8570 100755 --- a/luci-app-homeproxy/root/etc/homeproxy/scripts/migrate_config.uc +++ b/luci-app-homeproxy/root/etc/homeproxy/scripts/migrate_config.uc @@ -7,34 +7,14 @@ 'use strict'; -import { popen } from 'fs'; import { cursor } from 'uci'; -import { isEmpty, parseURL } from 'homeproxy'; +import { isEmpty, parseURL, validation } from 'homeproxy'; const uci = cursor(); const uciconfig = 'homeproxy'; uci.load(uciconfig); -function random_secret() { - const fd = popen('tr -dc "A-Za-z0-9" < /dev/urandom 2>/dev/null | head -c 16'); - let random = ''; - if (fd) { - random = trim(fd.read('all') || ''); - fd.close(); - } - - if (isEmpty(random)) { - const fallback = popen('awk \'BEGIN{srand(); printf "%06d", int(rand() * 1000000)}\''); - if (fallback) { - random = trim(fallback.read('all') || ''); - fallback.close(); - } - } - - return random; -} - const uciinfra = 'infra', ucimigration = 'migration', ucimain = 'config', @@ -45,16 +25,8 @@ const uciinfra = 'infra', ucirouting = 'routing', uciroutingnode = 'routing_node', uciroutingrule = 'routing_rule', - uciclashapi = 'clash_api', - ucintp = 'ntp', - ucicache = 'cache', uciserver = 'server'; -function is_update_cron(value) { - let matched = match(value || '', /^(\d{1,2})\s+(\d{1,2})\s+\*\s+\*\s+([0-7*])$/); - return !isEmpty(matched) && int(matched[1]) <= 59 && int(matched[2]) <= 23; -} - /* chinadns-ng has been removed */ if (uci.get(uciconfig, uciinfra, 'china_dns_port')) uci.delete(uciconfig, uciinfra, 'china_dns_port'); @@ -64,7 +36,9 @@ const china_dns_server = uci.get(uciconfig, ucimain, 'china_dns_server'); if (type(china_dns_server) === 'array') { uci.set(uciconfig, ucimain, 'china_dns_server', china_dns_server[0]); } else { - if (match(china_dns_server, /,/)) + if (china_dns_server === 'wan_114') + uci.set(uciconfig, ucimain, 'china_dns_server', '114.114.114.114'); + else if (match(china_dns_server, /,/)) uci.set(uciconfig, ucimain, 'china_dns_server', split(china_dns_server, ',')[0]); } @@ -83,93 +57,6 @@ if (!uci.get(uciconfig, uciinfra, 'ntp_server')) if (!isEmpty(uci.get(uciconfig, uciinfra, 'tun_gso'))) uci.delete(uciconfig, uciinfra, 'tun_gso'); -/* endpoint_independent_nat was removed in sing-box 1.13 */ -if (!isEmpty(uci.get(uciconfig, ucirouting, 'endpoint_independent_nat'))) - uci.delete(uciconfig, ucirouting, 'endpoint_independent_nat'); - -/* direct outbound proxy_protocol was removed in sing-box 1.13 */ -uci.foreach(uciconfig, ucinode, (cfg) => { - if (cfg.type === 'direct' && !isEmpty(cfg.proxy_protocol)) - uci.delete(uciconfig, cfg['.name'], 'proxy_protocol'); -}); - -const legacy_panel_url = 'https://github.com/Zephyruso/zashboard/releases/latest/download/dist.zip'; -const legacy_panel_proxy_url = 'https://gh-proxy.com/https://github.com/Zephyruso/zashboard/releases/latest/download/dist.zip'; -const old_panel_url = 'https://github.com/Zephyruso/zashboard/releases/latest/download/dist-cdn-fonts.zip'; -const old_panel_proxy_url = 'https://gh-proxy.com/https://github.com/Zephyruso/zashboard/releases/latest/download/dist-cdn-fonts.zip'; -const default_panel_url = 'https://gh-proxy.com/https://github.com/Zephyruso/zashboard/releases/latest/download/dist-cdn-fonts.zip'; - -/* clash api panel options were introduced */ -if (!uci.get(uciconfig, uciclashapi)) - uci.set(uciconfig, uciclashapi, uciconfig); - -if (isEmpty(uci.get(uciconfig, uciclashapi, 'external_ui'))) - uci.set(uciconfig, uciclashapi, 'external_ui', '/etc/homeproxy/run/ui'); - -const panel_url = uci.get(uciconfig, uciclashapi, 'external_ui_download_url'); -if (isEmpty(panel_url) || panel_url === legacy_panel_url || panel_url === legacy_panel_proxy_url || panel_url === old_panel_proxy_url) - uci.set(uciconfig, uciclashapi, 'external_ui_download_url', default_panel_url); - -if (isEmpty(uci.get(uciconfig, uciclashapi, 'external_ui_download_detour'))) - uci.set(uciconfig, uciclashapi, 'external_ui_download_detour', 'direct-out'); - -if (isEmpty(uci.get(uciconfig, uciclashapi, 'external_controller'))) - uci.set(uciconfig, uciclashapi, 'external_controller', '0.0.0.0:9095'); - -if (isEmpty(uci.get(uciconfig, uciclashapi, 'secret')) || uci.get(uciconfig, uciclashapi, 'secret') === 'homeproxy') { - let random = random_secret(); - if (!isEmpty(random)) - uci.set(uciconfig, uciclashapi, 'secret', random); -} - -if (isEmpty(uci.get(uciconfig, uciclashapi, 'default_mode'))) - uci.set(uciconfig, uciclashapi, 'default_mode', 'rule'); - -/* ntp options were moved into a dedicated section */ -if (!uci.get(uciconfig, ucintp)) - uci.set(uciconfig, ucintp, uciconfig); - -const legacy_ntp_server = uci.get(uciconfig, uciinfra, 'ntp_server'); -if (isEmpty(uci.get(uciconfig, ucintp, 'enabled'))) - uci.set(uciconfig, ucintp, 'enabled', '1'); - -if (isEmpty(uci.get(uciconfig, ucintp, 'server'))) - uci.set(uciconfig, ucintp, 'server', !isEmpty(legacy_ntp_server) ? legacy_ntp_server : 'ntp.aliyun.com'); - -if (isEmpty(uci.get(uciconfig, ucintp, 'server_port'))) - uci.set(uciconfig, ucintp, 'server_port', '123'); - -if (isEmpty(uci.get(uciconfig, ucintp, 'interval'))) - uci.set(uciconfig, ucintp, 'interval', '30m'); - -/* cache file options were moved into a dedicated section */ -if (!uci.get(uciconfig, ucicache)) - uci.set(uciconfig, ucicache, uciconfig); - -if (isEmpty(uci.get(uciconfig, ucicache, 'enabled'))) - uci.set(uciconfig, ucicache, 'enabled', '1'); - -const old_cache_path = '/var/run/homeproxy/cache.db'; -const default_cache_path = '/etc/homeproxy/cache.db'; -const cache_path = uci.get(uciconfig, ucicache, 'path'); -if (isEmpty(cache_path) || cache_path === old_cache_path) - uci.set(uciconfig, ucicache, 'path', default_cache_path); - -if (!isEmpty(uci.get(uciconfig, ucicache, 'store_fakeip'))) - uci.delete(uciconfig, ucicache, 'store_fakeip'); - -if (isEmpty(uci.get(uciconfig, ucicache, 'store_rdrc'))) - uci.set(uciconfig, ucicache, 'store_rdrc', isEmpty(uci.get(uciconfig, ucidns, 'cache_file_store_rdrc')) ? '1' : uci.get(uciconfig, ucidns, 'cache_file_store_rdrc')); - -if (isEmpty(uci.get(uciconfig, ucicache, 'rdrc_timeout')) && !isEmpty(uci.get(uciconfig, ucidns, 'cache_file_rdrc_timeout'))) - uci.set(uciconfig, ucicache, 'rdrc_timeout', uci.get(uciconfig, ucidns, 'cache_file_rdrc_timeout')); - -if (!isEmpty(uci.get(uciconfig, ucidns, 'cache_file_store_rdrc'))) - uci.delete(uciconfig, ucidns, 'cache_file_store_rdrc'); - -if (!isEmpty(uci.get(uciconfig, ucidns, 'cache_file_rdrc_timeout'))) - uci.delete(uciconfig, ucidns, 'cache_file_rdrc_timeout'); - /* create migration section */ if (!uci.get(uciconfig, ucimigration)) uci.set(uciconfig, ucimigration, uciconfig); @@ -177,7 +64,7 @@ if (!uci.get(uciconfig, ucimigration)) /* delete old crontab command */ const migration_crontab = uci.get(uciconfig, ucimigration, 'crontab'); if (!migration_crontab) { - system('sed -i "/update_crond.sh/d" "/etc/crontabs/root" 2>"/dev/null"'); + system('sed -i "/update_crond.sh/d" "/etc/crontabs/root" 2>/dev/null'); uci.set(uciconfig, ucimigration, 'crontab', '1'); } @@ -188,10 +75,6 @@ if (isEmpty(uci.get(uciconfig, ucimain, 'log_level'))) if (isEmpty(uci.get(uciconfig, uciserver, 'log_level'))) uci.set(uciconfig, uciserver, 'log_level', 'warn'); -if (!isEmpty(uci.get(uciconfig, 'subscription', 'auto_update_time')) && - !is_update_cron(uci.get(uciconfig, 'subscription', 'auto_update_time'))) - uci.set(uciconfig, 'subscription', 'auto_update_time', '0 0 * * *'); - /* empty value defaults to all ports now */ if (uci.get(uciconfig, ucimain, 'routing_port') === 'all') uci.delete(uciconfig, ucimain, 'routing_port'); @@ -211,6 +94,8 @@ if (default_dns_server === 'block-dns') { uci.set(uciconfig, '_migration_dns_final_block', 'action', 'reject'); uci.set(uciconfig, ucidns, 'default_server', 'default-dns'); } +else if (default_dns_server === 'local-dns') + uci.set(uciconfig, ucidns, 'default_server', 'default-dns'); const dns_server_migration = {}; /* DNS servers options */ @@ -288,7 +173,7 @@ uci.foreach(uciconfig, ucidnsrule, (cfg) => { uci.set(uciconfig, ucirouting, 'default_outbound_dns', cfg.server); break; default: - uci.set(uciconfig, cfg.outbound, 'domain_resolver', cfg.server); + uci.set(uciconfig, outbound, 'domain_resolver', cfg.server); break; } }); @@ -338,6 +223,29 @@ uci.foreach(uciconfig, ucinode, (cfg) => { /* wireguard_gso was deprecated in sb 1.11 */ if (!isEmpty(cfg.wireguard_gso)) uci.delete(uciconfig, cfg['.name'], 'wireguard_gso'); + + /* hysteria_revc_window was a typo, renamed to hysteria_recv_window */ + if (!isEmpty(cfg.hysteria_revc_window)) + uci.rename(uciconfig, cfg['.name'], 'hysteria_revc_window', 'hysteria_recv_window'); +}); + +/* sing-box 1.14: remove deprecated DNS semantics */ +if (!isEmpty(uci.get(uciconfig, ucidns, 'independent_cache'))) + uci.delete(uciconfig, ucidns, 'independent_cache'); + +const legacy_store_rdrc = uci.get(uciconfig, ucidns, 'cache_file_store_rdrc'); +if (!isEmpty(legacy_store_rdrc)) { + uci.set(uciconfig, ucidns, 'cache_file_store_dns', legacy_store_rdrc); + uci.delete(uciconfig, ucidns, 'cache_file_store_rdrc'); +} +if (!isEmpty(uci.get(uciconfig, ucidns, 'cache_file_rdrc_timeout'))) + uci.delete(uciconfig, ucidns, 'cache_file_rdrc_timeout'); + +uci.foreach(uciconfig, ucidnsrule, (cfg) => { + if (!isEmpty(cfg.domain_strategy)) + uci.delete(uciconfig, cfg['.name'], 'domain_strategy'); + if (!isEmpty(cfg.rule_set_ip_cidr_accept_empty)) + uci.delete(uciconfig, cfg['.name'], 'rule_set_ip_cidr_accept_empty'); }); /* routing rules options */ @@ -356,47 +264,6 @@ uci.foreach(uciconfig, uciroutingrule, (cfg) => { } }); -/* routing node options */ -uci.foreach(uciconfig, uciroutingnode, (cfg) => { - if (cfg.node === 'urltest' && !isEmpty(cfg.urltest_nodes)) { - let custom_nodes = [], - subscription_nodes = []; - - for (let node in (type(cfg.urltest_nodes) === 'array' ? cfg.urltest_nodes : [ cfg.urltest_nodes ])) { - let node_cfg = uci.get_all(uciconfig, node); - if (isEmpty(node_cfg)) - continue; - - if (!isEmpty(node_cfg.grouphash)) - push(subscription_nodes, node); - else - push(custom_nodes, node); - } - - if (isEmpty(cfg.selected_nodes) && !isEmpty(custom_nodes)) - uci.set(uciconfig, cfg['.name'], 'selected_nodes', custom_nodes); - - if (isEmpty(cfg.subscription_nodes) && !isEmpty(subscription_nodes)) - uci.set(uciconfig, cfg['.name'], 'subscription_nodes', subscription_nodes); - - uci.delete(uciconfig, cfg['.name'], 'urltest_nodes'); - } -}); - -/* rule set options */ -uci.foreach(uciconfig, uciruleset, (cfg) => { - if (isEmpty(cfg.tag)) - uci.set(uciconfig, cfg['.name'], 'tag', 'cfg-' + cfg['.name'] + '-rule'); - - if (cfg.type === 'remote') { - if (isEmpty(cfg.auto_update)) - uci.set(uciconfig, cfg['.name'], 'auto_update', '1'); - - if (!is_update_cron(cfg.update_interval)) - uci.set(uciconfig, cfg['.name'], 'update_interval', '0 0 * * *'); - } -}); - /* server options */ /* auto_firewall was moved into server options */ const auto_firewall = uci.get(uciconfig, uciserver, 'auto_firewall'); @@ -404,13 +271,6 @@ if (!isEmpty(auto_firewall)) uci.delete(uciconfig, uciserver, 'auto_firewall'); uci.foreach(uciconfig, uciserver, (cfg) => { - if (!isEmpty(cfg.hysteria_revc_window_client) && isEmpty(cfg.hysteria_recv_window_client)) { - uci.set(uciconfig, cfg['.name'], 'hysteria_recv_window_client', cfg.hysteria_revc_window_client); - } - - if (!isEmpty(cfg.hysteria_revc_window_client)) - uci.delete(uciconfig, cfg['.name'], 'hysteria_revc_window_client'); - /* auto_firewall was moved into server options */ if (auto_firewall === '1') uci.set(uciconfig, cfg['.name'], 'firewall' , '1'); diff --git a/luci-app-homeproxy/root/etc/homeproxy/scripts/parse_uri.uc b/luci-app-homeproxy/root/etc/homeproxy/scripts/parse_uri.uc new file mode 100644 index 000000000..8becd1721 --- /dev/null +++ b/luci-app-homeproxy/root/etc/homeproxy/scripts/parse_uri.uc @@ -0,0 +1,500 @@ +/* + * SPDX-License-Identifier: GPL-2.0-only + * + * Copyright (C) 2023-2025 ImmortalWrt.org + */ + +'use strict'; + +import { urldecode, urlencode } from 'luci.http'; + +import { decodeBase64Str, parseURL, isEmpty, validation } from 'homeproxy'; + +/* + * Share-link parsers. Every protocol has its own parse__uri() so the + * branches can be read, changed and unit-tested in isolation; parse_uri() only + * dispatches on the scheme and applies the common address/port validation and + * label fallback afterwards. + * + * `features` is the sing-box feature map (with_quic/with_utls/...), `log` is a + * logging callback, both injected so the parsers stay free of ubus/uci. + */ + +/* https://shadowsocks.org/guide/sip008.html */ +export function parse_sip008_uri(uri) { + return { + label: uri.remarks, + type: 'shadowsocks', + address: uri.server, + port: uri.server_port, + shadowsocks_encrypt_method: uri.method, + password: uri.password, + shadowsocks_plugin: uri.plugin, + shadowsocks_plugin_opts: uri.plugin_opts + }; +}; + +/* https://github.com/anytls/anytls-go/blob/v0.0.8/docs/uri_scheme.md */ +export function parse_anytls_uri(uri) { + uri = split(trim(uri), '://'); + + const url = parseURL('http://' + uri[1]) || {}; + const params = url.searchParams || {}; + + return { + label: url.hash ? urldecode(url.hash) : null, + type: 'anytls', + address: url.hostname, + port: url.port, + password: urldecode(url.username), + tls: '1', + tls_sni: params.sni, + tls_insecure: (params.insecure === '1') ? '1' : '0' + }; +}; + +export function parse_http_uri(uri) { + uri = split(trim(uri), '://'); + + const url = parseURL('http://' + uri[1]) || {}; + + return { + label: url.hash ? urldecode(url.hash) : null, + type: 'http', + address: url.hostname, + port: url.port, + username: url.username ? urldecode(url.username) : null, + password: url.password ? urldecode(url.password) : null, + tls: (uri[0] === 'https') ? '1' : '0' + }; +}; + +/* https://github.com/HyNetwork/hysteria/wiki/URI-Scheme */ +export function parse_hysteria_uri(uri, features, log) { + uri = split(trim(uri), '://'); + + const url = parseURL('http://' + uri[1]) || {}; + const params = url.searchParams || {}; + + if (!features.with_quic || (params.protocol && params.protocol !== 'udp')) { + log(sprintf('Skipping unsupported %s node: %s.', uri[0], urldecode(url.hash) || url.hostname)); + if (!features.with_quic) + log(sprintf('Please rebuild sing-box with %s support!', 'QUIC')); + + return null; + } + + return { + label: url.hash ? urldecode(url.hash) : null, + type: 'hysteria', + address: url.hostname, + port: url.port, + hysteria_protocol: params.protocol || 'udp', + hysteria_auth_type: params.auth ? 'string' : null, + hysteria_auth_payload: params.auth, + hysteria_obfs_password: params.obfsParam, + hysteria_down_mbps: params.downmbps, + hysteria_up_mbps: params.upmbps, + tls: '1', + tls_insecure: (params.insecure in ['true', '1']) ? '1' : '0', + tls_sni: params.peer, + tls_alpn: params.alpn + }; +}; + +/* https://v2.hysteria.network/docs/developers/URI-Scheme/ */ +export function parse_hysteria2_uri(uri, features, log) { + uri = split(trim(uri), '://'); + + const url = parseURL('http://' + uri[1]) || {}; + const params = url.searchParams || {}; + + if (!features.with_quic) { + log(sprintf('Skipping unsupported %s node: %s.', uri[0], urldecode(url.hash) || url.hostname)); + log(sprintf('Please rebuild sing-box with %s support!', 'QUIC')); + return null; + } + + return { + label: url.hash ? urldecode(url.hash) : null, + type: 'hysteria2', + address: url.hostname, + port: url.port, + password: url.username ? ( + urldecode(url.username + (url.password ? (':' + url.password) : '')) + ) : null, + hysteria_obfs_type: params.obfs, + hysteria_obfs_password: params['obfs-password'], + tls: '1', + tls_insecure: (params.insecure === '1') ? '1' : '0', + tls_sni: params.sni + }; +}; + +/* Surge Snell share link: snell://host:port?psk=..&obfs=http&obfs-host=..#name */ +export function parse_snell_uri(uri) { + uri = split(trim(uri), '://'); + + const url = parseURL('http://' + uri[1]) || {}; + const params = url.searchParams || {}; + + return { + label: url.hash ? urldecode(url.hash) : null, + type: 'snell', + address: url.hostname, + port: url.port, + password: url.username ? urldecode(url.username) + : (params.psk ? urldecode(params.psk) : null), + snell_version: params.version || '4', + snell_userkey: params.userkey, + snell_obfs_mode: (params.obfs === 'http') ? 'http' : null, + snell_obfs_host: params['obfs-host'], + snell_reuse: (params.reuse === '1') ? '1' : '0' + }; +}; + +export function parse_socks_uri(uri) { + uri = split(trim(uri), '://'); + + const url = parseURL('http://' + uri[1]) || {}; + + return { + label: url.hash ? urldecode(url.hash) : null, + type: 'socks', + address: url.hostname, + port: url.port, + username: url.username ? urldecode(url.username) : null, + password: url.password ? urldecode(url.password) : null, + socks_version: (match(uri[0], /4/)) ? '4' : '5' + }; +}; + +export function parse_ss_uri(uri) { + uri = split(trim(uri), '://'); + + /* "Lovely" Shadowrocket format */ + const ss_suri = split(uri[1], '#'); + let ss_slabel = ''; + if (length(ss_suri) <= 2) { + if (length(ss_suri) === 2) + ss_slabel = '#' + urlencode(ss_suri[1]); + if (decodeBase64Str(ss_suri[0])) + uri[1] = decodeBase64Str(ss_suri[0]) + ss_slabel; + } + + /* Legacy format is not supported, it should be never appeared in modern subscriptions */ + /* https://github.com/shadowsocks/shadowsocks-org/commit/78ca46cd6859a4e9475953ed34a2d301454f579e */ + + /* SIP002 format https://shadowsocks.org/guide/sip002.html */ + const url = parseURL('http://' + uri[1]) || {}; + + let ss_userinfo = {}; + if (url.username && url.password) + /* User info encoded with URIComponent */ + ss_userinfo = [url.username, urldecode(url.password)]; + else if (url.username) + /* User info encoded with base64 */ + ss_userinfo = split(decodeBase64Str(urldecode(url.username)), ':', 2); + + let ss_plugin, ss_plugin_opts; + if (url.search && url.searchParams.plugin) { + const ss_plugin_info = split(url.searchParams.plugin, ';', 2); + ss_plugin = ss_plugin_info[0]; + if (ss_plugin === 'simple-obfs') + /* Fix non-standard plugin name */ + ss_plugin = 'obfs-local'; + ss_plugin_opts = ss_plugin_info[1]; + } + + return { + label: url.hash ? urldecode(url.hash) : null, + type: 'shadowsocks', + address: url.hostname, + port: url.port, + shadowsocks_encrypt_method: ss_userinfo[0], + password: ss_userinfo[1], + shadowsocks_plugin: ss_plugin, + shadowsocks_plugin_opts: ss_plugin_opts + }; +}; + +/* https://p4gefau1t.github.io/trojan-go/developer/url/ */ +export function parse_trojan_uri(uri) { + uri = split(trim(uri), '://'); + + const url = parseURL('http://' + uri[1]) || {}; + const params = url.searchParams || {}; + + const config = { + label: url.hash ? urldecode(url.hash) : null, + type: 'trojan', + address: url.hostname, + port: url.port, + password: urldecode(url.username), + transport: (params.type !== 'tcp') ? params.type : null, + tls: '1', + tls_sni: params.sni + }; + switch (params.type) { + case 'grpc': + config.grpc_servicename = params.serviceName; + break; + case 'ws': + config.ws_host = params.host ? urldecode(params.host) : null; + config.ws_path = params.path ? urldecode(params.path) : null; + if (config.ws_path && match(config.ws_path, /\?ed=/)) { + config.websocket_early_data_header = 'Sec-WebSocket-Protocol'; + config.websocket_early_data = split(config.ws_path, '?ed=')[1]; + config.ws_path = split(config.ws_path, '?ed=')[0]; + } + break; + } + + return config; +}; + +/* https://github.com/daeuniverse/dae/discussions/182 */ +export function parse_tuic_uri(uri, features, log) { + uri = split(trim(uri), '://'); + + const url = parseURL('http://' + uri[1]) || {}; + const params = url.searchParams || {}; + + if (!features.with_quic) { + log(sprintf('Skipping unsupported %s node: %s.', uri[0], urldecode(url.hash) || url.hostname)); + log(sprintf('Please rebuild sing-box with %s support!', 'QUIC')); + + return null; + } + + return { + label: url.hash ? urldecode(url.hash) : null, + type: 'tuic', + address: url.hostname, + port: url.port, + uuid: url.username, + password: url.password ? urldecode(url.password) : null, + tuic_congestion_control: params.congestion_control, + tuic_udp_relay_mode: params.udp_relay_mode, + tls: '1', + tls_sni: params.sni, + tls_alpn: params.alpn ? split(urldecode(params.alpn), ',') : null, + }; +}; + +/* https://github.com/XTLS/Xray-core/discussions/716 */ +export function parse_vless_uri(uri, features, log) { + uri = split(trim(uri), '://'); + + const url = parseURL('http://' + uri[1]) || {}; + const params = url.searchParams || {}; + + /* Unsupported protocol */ + if (params.type === 'kcp') { + log(sprintf('Skipping unsupported %s node: %s.', uri[0], urldecode(url.hash) || url.hostname)); + return null; + } else if (params.type === 'quic' && ((params.quicSecurity && params.quicSecurity !== 'none') || !features.with_quic)) { + log(sprintf('Skipping unsupported %s node: %s.', uri[0], urldecode(url.hash) || url.hostname)); + if (!features.with_quic) + log(sprintf('Please rebuild sing-box with %s support!', 'QUIC')); + + return null; + } + + const config = { + label: url.hash ? urldecode(url.hash) : null, + type: 'vless', + address: url.hostname, + port: url.port, + uuid: url.username, + transport: (params.type !== 'tcp') ? params.type : null, + tls: (params.security in ['tls', 'xtls', 'reality']) ? '1' : '0', + tls_sni: params.sni, + tls_alpn: params.alpn ? split(urldecode(params.alpn), ',') : null, + tls_reality: (params.security === 'reality') ? '1' : '0', + tls_reality_public_key: params.pbk ? urldecode(params.pbk) : null, + tls_reality_short_id: params.sid, + tls_utls: features.with_utls ? params.fp : null, + vless_flow: (params.security in ['tls', 'reality']) ? params.flow : null + }; + switch (params.type) { + case 'grpc': + config.grpc_servicename = params.serviceName; + break; + case 'http': + case 'tcp': + if (params.type === 'http' || params.headerType === 'http') { + config.http_host = params.host ? split(urldecode(params.host), ',') : null; + config.http_path = params.path ? urldecode(params.path) : null; + } + break; + case 'httpupgrade': + config.httpupgrade_host = params.host ? urldecode(params.host) : null; + config.http_path = params.path ? urldecode(params.path) : null; + break; + case 'ws': + config.ws_host = params.host ? urldecode(params.host) : null; + config.ws_path = params.path ? urldecode(params.path) : null; + if (config.ws_path && match(config.ws_path, /\?ed=/)) { + config.websocket_early_data_header = 'Sec-WebSocket-Protocol'; + config.websocket_early_data = split(config.ws_path, '?ed=')[1]; + config.ws_path = split(config.ws_path, '?ed=')[0]; + } + break; + } + + return config; +}; + +/* https://github.com/2dust/v2rayN/wiki/Description-of-VMess-share-link */ +export function parse_vmess_uri(uri, features, log) { + uri = split(trim(uri), '://'); + + /* "Lovely" shadowrocket format */ + if (match(uri, /&/)) { + log(sprintf('Skipping unsupported %s format.', uri[0])); + return null; + } + + let payload; + try { + payload = json(decodeBase64Str(uri[1])) || {}; + } catch(e) { + log(sprintf('Skipping unsupported %s format.', uri[0])); + return null; + } + + if (payload.v != '2') { + log(sprintf('Skipping unsupported %s format.', uri[0])); + return null; + /* Unsupported protocol */ + } else if (payload.net === 'kcp') { + log(sprintf('Skipping unsupported %s node: %s.', uri[0], payload.ps || payload.add)); + return null; + } else if (payload.net === 'quic' && ((payload.type && payload.type !== 'none') || payload.path || !features.with_quic)) { + log(sprintf('Skipping unsupported %s node: %s.', uri[0], payload.ps || payload.add)); + if (!features.with_quic) + log(sprintf('Please rebuild sing-box with %s support!', 'QUIC')); + + return null; + } + /* + * https://www.v2fly.org/config/protocols/vmess.html#vmess-md5-%E8%AE%A4%E8%AF%81%E4%BF%A1%E6%81%AF-%E6%B7%98%E6%B1%B0%E6%9C%BA%E5%88%B6 + * else if (payload.aid && int(payload.aid) !== 0) { + * log(sprintf('Skipping unsupported %s node: %s.', uri[0], payload.ps || payload.add)); + * return null; + * } + */ + + const config = { + label: payload.ps ? urldecode(payload.ps) : null, + type: 'vmess', + address: payload.add, + port: payload.port, + uuid: payload.id, + vmess_alterid: payload.aid, + vmess_encrypt: payload.scy || 'auto', + vmess_global_padding: '1', + transport: (payload.net !== 'tcp') ? payload.net : null, + tls: (payload.tls === 'tls') ? '1' : '0', + tls_sni: payload.sni || payload.host, + tls_alpn: payload.alpn ? split(payload.alpn, ',') : null, + tls_utls: features.with_utls ? payload.fp : null + }; + switch (payload.net) { + case 'grpc': + config.grpc_servicename = payload.path; + break; + case 'h2': + case 'tcp': + if (payload.net === 'h2' || payload.type === 'http') { + config.transport = 'http'; + config.http_host = payload.host ? split(payload.host, ',') : null; + config.http_path = payload.path; + } + break; + case 'httpupgrade': + config.httpupgrade_host = payload.host; + config.http_path = payload.path; + break; + case 'ws': + config.ws_host = payload.host; + config.ws_path = payload.path; + if (config.ws_path && match(config.ws_path, /\?ed=/)) { + config.websocket_early_data_header = 'Sec-WebSocket-Protocol'; + config.websocket_early_data = split(config.ws_path, '?ed=')[1]; + config.ws_path = split(config.ws_path, '?ed=')[0]; + } + break; + } + + return config; +}; + +export function parse_uri(uri, features, log) { + if (!features) features = {}; + if (!log) log = function() {}; + + let config; + + if (type(uri) === 'object') { + if (uri.nodetype === 'sip008') + config = parse_sip008_uri(uri); + } else if (type(uri) === 'string') { + switch (split(trim(uri), '://')[0]) { + case 'anytls': + config = parse_anytls_uri(uri, features, log); + break; + case 'http': + case 'https': + config = parse_http_uri(uri, features, log); + break; + case 'hysteria': + config = parse_hysteria_uri(uri, features, log); + break; + case 'hysteria2': + case 'hy2': + config = parse_hysteria2_uri(uri, features, log); + break; + case 'snell': + config = parse_snell_uri(uri, features, log); + break; + case 'socks': + case 'socks4': + case 'socks4a': + case 'socks5': + case 'socks5h': + config = parse_socks_uri(uri, features, log); + break; + case 'ss': + config = parse_ss_uri(uri, features, log); + break; + case 'trojan': + config = parse_trojan_uri(uri, features, log); + break; + case 'tuic': + config = parse_tuic_uri(uri, features, log); + break; + case 'vless': + config = parse_vless_uri(uri, features, log); + break; + case 'vmess': + config = parse_vmess_uri(uri, features, log); + break; + } + } + + if (!isEmpty(config)) { + if (config.address) + config.address = replace(config.address, /\[|\]/g, ''); + + if (!validation('host', config.address) || !validation('port', config.port)) { + log(sprintf('Skipping invalid %s node: %s.', config.type, config.label || 'NULL')); + return null; + } else if (!config.label) + config.label = (validation('ip6addr', config.address) ? + `[${config.address}]` : config.address) + ':' + config.port; + } + + return config; +}; diff --git a/luci-app-homeproxy/root/etc/homeproxy/scripts/update_provider.sh b/luci-app-homeproxy/root/etc/homeproxy/scripts/update_provider.sh deleted file mode 100644 index 76e2cfc9f..000000000 --- a/luci-app-homeproxy/root/etc/homeproxy/scripts/update_provider.sh +++ /dev/null @@ -1,46 +0,0 @@ -#!/bin/sh -# SPDX-License-Identifier: GPL-2.0-only - -set -eu - -NAME="homeproxy" -RUN_DIR="/var/run/$NAME" -REQUEST_FILE="$RUN_DIR/provider-update-id" -LOCK_FILE="$RUN_DIR/provider-update-v2.lock" -LOG_FILE="$RUN_DIR/homeproxy.log" -PROVIDER_ID="${1:-}" - -log() { - printf '%s [SUBSCRIBE] %s\n' "$(date '+%Y-%m-%d %H:%M:%S')" "$*" >> "$LOG_FILE" -} - -case "$PROVIDER_ID" in - *[!0-9a-f]*|'') exit 1 ;; -esac -[ "${#PROVIDER_ID}" -eq 32 ] || exit 1 - -mkdir -p "$RUN_DIR" -if ! lock -n "$LOCK_FILE" 2>/dev/null; then - log "Another provider update is running; waiting for it to finish..." - lock "$LOCK_FILE" -fi - -umask 077 -printf '%s\n' "$PROVIDER_ID" > "$REQUEST_FILE" -cleanup() { - rm -f "$REQUEST_FILE" - lock -u "$LOCK_FILE" 2>/dev/null || true -} -trap cleanup EXIT -trap 'exit 130' INT -trap 'exit 143' TERM - -# Give the Clash API response time to reach the panel before HomeProxy restarts. -log "Updating provider $PROVIDER_ID from Clash API..." -sleep 1 -if /etc/homeproxy/scripts/update_subscriptions.uc; then - log "Provider $PROVIDER_ID update completed." -else - log "Provider $PROVIDER_ID update failed." - exit 4 -fi diff --git a/luci-app-homeproxy/root/etc/homeproxy/scripts/update_resources.sh b/luci-app-homeproxy/root/etc/homeproxy/scripts/update_resources.sh index 83f49aef4..c100c6c18 100755 --- a/luci-app-homeproxy/root/etc/homeproxy/scripts/update_resources.sh +++ b/luci-app-homeproxy/root/etc/homeproxy/scripts/update_resources.sh @@ -21,65 +21,89 @@ to_upper() { } check_list_update() { - local LIST_FILE="$1" - local REPO_NAME="$2" - local REPO_BRANCH="$3" - local REPO_FILE="$4" - local LOCK_FILE="$RUN_DIR/update_resources-$LIST_FILE.lock" - local GITHUB_TOKEN="$(uci -q get homeproxy.config.github_token)" + local listtype="$1" + local listrepo="$2" + local listref="$3" + local listname="$4" + local lock="$RUN_DIR/update_resources-$listtype.lock" + local github_token="$(uci -q get homeproxy.config.github_token)" + local wget="wget --timeout=10 -q" - if ! lock -n "$LOCK_FILE" 2>"/dev/null"; then - log "[$(to_upper "$LIST_FILE")] A task is already running." + exec 200>"$lock" + if ! flock -n 200 &> "/dev/null"; then + log "[$(to_upper "$listtype")] A task is already running." return 2 fi - local NEW_VER=$(curl -sL ${GITHUB_TOKEN:+-H "Authorization: Bearer $GITHUB_TOKEN"} "https://api.github.com/repos/$REPO_NAME/releases/latest" | jsonfilter -e "@.tag_name") - if [ -z "$NEW_VER" ]; then - log "[$(to_upper "$LIST_FILE")] Failed to get the latest version, please retry later." - - return 1 + local github_header_file="" + if [ -n "$github_token" ]; then + github_header_file="$RUN_DIR/.gh_header_${listtype}" + ( umask 077; printf 'Authorization: Bearer %s\n' "$github_token" > "$github_header_file" ) + trap "[ -n \"$github_header_file\" ] && rm -f \"$github_header_file\"" EXIT INT TERM fi - local OLD_VER=$(cat "$RESOURCES_DIR/$LIST_FILE.ver" 2>/dev/null || echo "NOT FOUND") - if [ "$OLD_VER" = "$NEW_VER" ]; then - log "[$(to_upper "$LIST_FILE")] Current version: $NEW_VER." - log "[$(to_upper "$LIST_FILE")] You're already at the latest version." + local list_info="$($wget ${github_header_file:+--header-file=$github_header_file} -O- "https://api.github.com/repos/$listrepo/commits?sha=$listref&path=$listname&per_page=1")" + local wget_exit=$? + [ -n "$github_header_file" ] && rm -f "$github_header_file" + trap - EXIT INT TERM + + if [ $wget_exit -ne 0 ]; then + log "[$(to_upper "$listtype")] Failed to fetch version info (wget exit $wget_exit)." + return 1 + fi + local list_sha="$(echo -e "$list_info" | jsonfilter -qe "@[0].sha")" + local list_date="$(echo -e "$list_info" | jsonfilter -qe "@[0].commit.committer.date" | cut -d 'T' -f1)" + if [ -z "$list_sha" ]; then + log "[$(to_upper "$listtype")] Failed to get the latest version, please retry later." + return 1 + fi + local list_ver="${list_date:+$list_date }$list_sha" + + local local_list_ver="$(cat "$RESOURCES_DIR/$listtype.ver" 2>"/dev/null" || echo "NOT_FOUND")" + local local_list_sha="${local_list_ver##* }" + local local_list_disp="${local_list_ver%% *}" + if [ "$local_list_sha" = "$list_sha" ]; then + [ "$local_list_ver" = "$local_list_sha" ] && [ -n "$list_date" ] && \ + echo -e "$list_ver" > "$RESOURCES_DIR/$listtype.ver" + log "[$(to_upper "$listtype")] Current version: ${list_ver%% *}." + log "[$(to_upper "$listtype")] You're already at the latest version." return 3 else - log "[$(to_upper "$LIST_FILE")] Local version: $OLD_VER, latest version: $NEW_VER." + log "[$(to_upper "$listtype")] Local version: $local_list_disp, latest version: ${list_ver%% *}." fi - if ! curl -sL -o "$RUN_DIR/$REPO_FILE" "https://cdn.jsdelivr.net/gh/$REPO_NAME@$REPO_BRANCH/$REPO_FILE" || [ ! -s "$RUN_DIR/$REPO_FILE" ]; then - rm -f "$RUN_DIR/$REPO_FILE" - log "[$(to_upper "$LIST_FILE")] Update failed." - + if ! $wget "https://fastly.jsdelivr.net/gh/$listrepo@$list_sha/$listname" -O "$RUN_DIR/$listname" || [ ! -s "$RUN_DIR/$listname" ]; then + rm -f "$RUN_DIR/$listname" + log "[$(to_upper "$listtype")] Download failed." return 1 fi - mv -f "$RUN_DIR/$REPO_FILE" "$RESOURCES_DIR/$LIST_FILE.${REPO_FILE##*.}" - echo -e "$NEW_VER" > "$RESOURCES_DIR/$LIST_FILE.ver" - log "[$(to_upper "$LIST_FILE")] Successfully updated." + if mv -f "$RUN_DIR/$listname" "$RESOURCES_DIR/$listtype.${listname##*.}"; then + echo -e "$list_ver" > "$RESOURCES_DIR/$listtype.ver" + log "[$(to_upper "$listtype")] Successfully updated." + else + rm -f "$RUN_DIR/$listname" + log "[$(to_upper "$listtype")] Failed to install update (mv failed)." + return 1 + fi return 0 } case "$1" in "china_ip4") - check_list_update "$1" "Loyalsoldier/surge-rules" "release" "cncidr.txt" && \ - sed -i "/IP-CIDR6,/d; s/IP-CIDR,//g" "$RESOURCES_DIR/china_ip4.txt" + check_list_update "$1" "1715173329/IPCIDR-CHINA" "master" "ipv4.txt" ;; "china_ip6") - check_list_update "$1" "Loyalsoldier/surge-rules" "release" "cncidr.txt" && \ - sed -i "/IP-CIDR,/d; s/IP-CIDR6,//g" "$RESOURCES_DIR/china_ip6.txt" + check_list_update "$1" "1715173329/IPCIDR-CHINA" "master" "ipv6.txt" ;; "gfw_list") - check_list_update "$1" "Loyalsoldier/surge-rules" "release" "gfw.txt" && \ - sed -i "s/^\.//g" "$RESOURCES_DIR/gfw_list.txt" + check_list_update "$1" "Loyalsoldier/v2ray-rules-dat" "release" "gfw.txt" ;; "china_list") - check_list_update "$1" "Loyalsoldier/surge-rules" "release" "direct.txt" && \ - sed -i "s/^\.//g" "$RESOURCES_DIR/china_list.txt" + check_list_update "$1" "Loyalsoldier/v2ray-rules-dat" "release" "direct-list.txt" && \ + sed -i -e "s/full://g" -e "/:/d" "$RESOURCES_DIR/china_list.txt" ;; *) echo -e "Usage: $0 " diff --git a/luci-app-homeproxy/root/etc/homeproxy/scripts/update_rulesets.sh b/luci-app-homeproxy/root/etc/homeproxy/scripts/update_rulesets.sh deleted file mode 100644 index efba96f51..000000000 --- a/luci-app-homeproxy/root/etc/homeproxy/scripts/update_rulesets.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/sh -# SPDX-License-Identifier: GPL-2.0-only -# -# Copyright (C) 2025 ImmortalWrt.org - -CACHE_PATH="$(uci -q get homeproxy.cache.path)" -[ -n "$CACHE_PATH" ] || CACHE_PATH="/etc/homeproxy/cache.db" - -rm -f "$CACHE_PATH" -/etc/init.d/homeproxy restart diff --git a/luci-app-homeproxy/root/etc/homeproxy/scripts/update_subscriptions.uc b/luci-app-homeproxy/root/etc/homeproxy/scripts/update_subscriptions.uc index e824c1e03..4fcdee32e 100755 --- a/luci-app-homeproxy/root/etc/homeproxy/scripts/update_subscriptions.uc +++ b/luci-app-homeproxy/root/etc/homeproxy/scripts/update_subscriptions.uc @@ -8,18 +8,18 @@ 'use strict'; import { md5 } from 'digest'; -import { open, readfile } from 'fs'; +import { open } from 'fs'; import { connect } from 'ubus'; import { cursor } from 'uci'; -import { urldecode, urlencode } from 'luci.http'; import { init_action } from 'luci.sys'; import { - wGETResponse, wGETHeaders, decodeBase64Str, getTime, isEmpty, parseURL, - validation, HP_DIR, RUN_DIR + wGETVerbose, decodeBase64Str, getTime, isEmpty, HP_DIR, RUN_DIR } from 'homeproxy'; +import { parse_uri } from 'parse_uri'; + /* UCI config start */ const uci = cursor(); @@ -34,17 +34,11 @@ const allow_insecure = uci.get(uciconfig, ucisubscription, 'allow_insecure') || filter_mode = uci.get(uciconfig, ucisubscription, 'filter_nodes') || 'disabled', filter_keywords = uci.get(uciconfig, ucisubscription, 'filter_keywords') || [], packet_encoding = uci.get(uciconfig, ucisubscription, 'packet_encoding') || 'xudp', - all_subscription_urls = uci.get(uciconfig, ucisubscription, 'subscription_url') || [], - user_agent = uci.get(uciconfig, ucisubscription, 'user_agent'), - via_proxy = uci.get(uciconfig, ucisubscription, 'update_via_proxy') || '0'; + subscription_urls = uci.get(uciconfig, ucisubscription, 'subscription_url') || [], + user_agent = uci.get(uciconfig, ucisubscription, 'user_agent'), + via_proxy = uci.get(uciconfig, ucisubscription, 'update_via_proxy') || '0'; -const provider_update_id = trim(readfile(RUN_DIR + '/provider-update-id') || ''); -let subscription_urls = all_subscription_urls; -if (provider_update_id) - subscription_urls = filter(all_subscription_urls, (url) => - md5(replace(url, /#.*$/, '')) === provider_update_id); - -const routing_mode = uci.get(uciconfig, ucimain, 'routing_mode') || 'bypass_mainalnd_china'; +const routing_mode = uci.get(uciconfig, ucimain, 'routing_mode') || 'bypass_mainland_china'; let main_node, main_udp_node; if (routing_mode !== 'custom') { main_node = uci.get(uciconfig, ucimain, 'main_node') || 'nil'; @@ -59,8 +53,14 @@ function filter_check(name) { let ret = false; for (let i in filter_keywords) { - const patten = regexp(i); - if (match(name, patten)) + let patten; + try { + patten = regexp(i); + } catch(e) { + log(sprintf('Skipping invalid filter keyword regex: %s.', i)); + continue; + } + if (patten && match(name, patten)) ret = true; } if (filter_mode === 'whitelist') @@ -76,6 +76,8 @@ const node_cache = {}, const ubus = connect(); const sing_features = ubus.call('luci.homeproxy', 'singbox_get_features', {}) || {}; +if (isEmpty(sing_features)) + log('Warning: Failed to query sing-box features via ubus, assuming defaults.'); /* Common var end */ /* Log */ @@ -86,1334 +88,8 @@ function log(...args) { logfile.close(); } -function has_value(value) { - return value !== null && value !== '' && value !== 'nil'; -} - -function to_string(value) { - return has_value(value) ? sprintf('%s', value) : null; -} - -function bool_to_uci(value) { - if (value === true) - return '1'; - if (value === false) - return '0'; - return null; -} - -function normalize_list(value) { - if (!has_value(value)) - return null; - if (type(value) === 'array') - return value; - return [to_string(value)]; -} - -function normalize_alpn(value) { - if (!has_value(value)) - return null; - if (type(value) === 'array') - return value; - if (type(value) === 'string') { - let items = map(split(value, ','), (v) => trim(v)); - items = filter(items, (v) => length(v)); - return length(items) ? items : null; - } - return [to_string(value)]; -} - -function normalize_host_list(value) { - if (!has_value(value)) - return null; - if (type(value) === 'array') - return value; - return split(to_string(value), ','); -} - -function normalize_first(value) { - if (!has_value(value)) - return null; - if (type(value) === 'array') - return length(value) ? value[0] : null; - return to_string(value); -} - -function normalize_hysteria_hopping_port(mport) { - if (!has_value(mport)) - return null; - - let ports = []; - for (let p in split(to_string(mport), ',')) { - p = trim(p); - if (!p) - continue; - if (match(p, /^\d+$/)) - p = p + ':' + p; - else - p = replace(p, '-', ':'); - push(ports, p); - } - - return length(ports) ? ports : null; -} - -function normalize_mihomo_ports(ports) { - if (!has_value(ports)) - return null; - - if (type(ports) === 'array') - return map(ports, (p) => { - const v = to_string(p); - if (match(v, /^\d+$/)) - return v + ':' + v; - return replace(v, '-', ':'); - }); - - return normalize_hysteria_hopping_port(to_string(ports)); -} - -function parse_mihomo_speed(value) { - if (!has_value(value)) - return null; - - const str = to_string(value); - const match_val = match(str, /[0-9]+(\.[0-9]+)?/); - if (!match_val) - return null; - - const num_str = type(match_val) === 'array' ? match_val[0] : match_val; - if (!num_str) - return null; - - const num = int(num_str); - if (num === null || num != num) - return null; - - return to_string(num); -} - -function get_header_host(headers) { - if (type(headers) !== 'object') - return null; - - return headers.Host || headers.host || headers['HOST']; -} - -function apply_transport_opts(config, proxy) { - const network = proxy.network; - if (!has_value(network) || network === 'tcp') - return; - - let ws_opts = proxy['ws-opts'] || {}; - let grpc_opts = proxy['grpc-opts'] || {}; - let http_opts = proxy['http-opts'] || proxy['h2-opts'] || {}; - let httpupgrade_opts = proxy['http-upgrade-opts'] || {}; - - switch (network) { - case 'ws': - config.transport = 'ws'; - config.ws_path = ws_opts.path ? to_string(ws_opts.path) : null; - config.ws_host = get_header_host(ws_opts.headers); - config.websocket_early_data = ws_opts['early-data'] ? to_string(ws_opts['early-data']) : null; - config.websocket_early_data_header = ws_opts['early-data-header-name'] ? - to_string(ws_opts['early-data-header-name']) : null; - break; - case 'grpc': - config.transport = 'grpc'; - config.grpc_servicename = to_string(grpc_opts['grpc-service-name'] || grpc_opts['service-name']); - break; - case 'http': - case 'h2': - config.transport = 'http'; - config.http_path = normalize_first(http_opts.path); - config.http_host = normalize_host_list(get_header_host(http_opts.headers) || http_opts.host); - break; - case 'httpupgrade': - config.transport = 'httpupgrade'; - config.httpupgrade_host = get_header_host(httpupgrade_opts.headers) || httpupgrade_opts.host; - config.http_path = normalize_first(httpupgrade_opts.path); - break; - } -} - -function parse_mihomo_proxy(proxy) { - if (type(proxy) !== 'object') - return null; - - let config; - const tls_sni = proxy.servername || proxy.sni; - const tls_fingerprint = proxy['client-fingerprint'] || proxy.fingerprint; - const tls_insecure = (proxy['skip-cert-verify'] === true || proxy.insecure === '1' || proxy.allowInsecure === true || proxy.allowInsecure === '1') ? '1' - : (proxy['skip-cert-verify'] === false || proxy.insecure === '0' || proxy.allowInsecure === false || proxy.allowInsecure === '0') ? '0' - : null; - - switch (proxy.type) { - case 'anytls': { - let anytls_fp = (proxy['client-fingerprint'] !== null && proxy['client-fingerprint'] !== undefined) ? - proxy['client-fingerprint'] : proxy.fingerprint; - anytls_fp = to_string(anytls_fp); - if (anytls_fp === 'none' || anytls_fp === 'disable' || anytls_fp === 'disabled') - anytls_fp = null; - else if (!has_value(anytls_fp)) - anytls_fp = 'chrome'; - config = { - label: proxy.name, - type: 'anytls', - address: proxy.server, - port: to_string(proxy.port), - password: proxy.password, - tls: '1', - tls_sni: tls_sni || proxy.peer, - tls_alpn: normalize_alpn(proxy.alpn), - tls_insecure, - tls_utls: sing_features.with_utls ? anytls_fp : null, - anytls_idle_session_check_interval: to_string(proxy['idle-session-check-interval']), - anytls_idle_session_timeout: to_string(proxy['idle-session-timeout']), - anytls_min_idle_session: to_string(proxy['min-idle-session']), - tcp_fast_open: (proxy.tfo === true) ? '1' : null - }; - break; - } - case 'vmess': - config = { - label: proxy.name, - type: 'vmess', - address: proxy.server, - port: to_string(proxy.port), - uuid: proxy.uuid, - vmess_alterid: has_value(proxy.alterId) ? to_string(proxy.alterId) : null, - vmess_encrypt: proxy.cipher, - packet_encoding: proxy['packet-encoding'], - tls: (proxy.tls === true) ? '1' : '0', - tls_sni, - tls_alpn: normalize_alpn(proxy.alpn), - tls_insecure, - tls_utls: sing_features.with_utls ? tls_fingerprint : null, - tcp_fast_open: (proxy.tfo === true) ? '1' : null - }; - apply_transport_opts(config, proxy); - break; - case 'hysteria2': - if (!sing_features.with_quic) { - log(sprintf('Skipping unsupported %s node: %s.', proxy.type, proxy.name || proxy.server)); - log(sprintf('Please rebuild sing-box with %s support!', 'QUIC')); - return null; - } - config = { - label: proxy.name, - type: 'hysteria2', - address: proxy.server, - port: to_string(proxy.port), - password: proxy.password, - hysteria_hopping_port: normalize_mihomo_ports(proxy.ports), - hysteria_down_mbps: parse_mihomo_speed(proxy.down), - hysteria_up_mbps: parse_mihomo_speed(proxy.up), - hysteria_obfs_type: proxy.obfs, - hysteria_obfs_password: proxy['obfs-password'], - tls: '1', - tls_sni, - tls_alpn: normalize_alpn(proxy.alpn), - tls_insecure, - tcp_fast_open: (proxy.tfo === true) ? '1' : null - }; - break; - case 'hysteria': - if (!sing_features.with_quic) { - log(sprintf('Skipping unsupported %s node: %s.', proxy.type, proxy.name || proxy.server)); - log(sprintf('Please rebuild sing-box with %s support!', 'QUIC')); - return null; - } - config = { - label: proxy.name, - type: 'hysteria', - address: proxy.server, - port: to_string(proxy.port), - hysteria_hopping_port: normalize_mihomo_ports(proxy.ports), - hysteria_protocol: proxy.protocol, - hysteria_auth_type: proxy['auth-str'] ? 'string' : (proxy.auth ? 'base64' : null), - hysteria_auth_payload: proxy['auth-str'] || proxy.auth, - hysteria_obfs_password: proxy.obfs, - hysteria_down_mbps: parse_mihomo_speed(proxy.down), - hysteria_up_mbps: parse_mihomo_speed(proxy.up), - tls: '1', - tls_sni, - tls_alpn: normalize_alpn(proxy.alpn), - tls_insecure, - tcp_fast_open: (proxy.tfo === true) ? '1' : null - }; - break; - case 'vless': - config = { - label: proxy.name, - type: 'vless', - address: proxy.server, - port: to_string(proxy.port), - uuid: proxy.uuid, - vless_flow: proxy.flow, - packet_encoding: proxy['packet-encoding'], - tls: (proxy.tls === true || proxy['reality-opts']) ? '1' : '0', - tls_sni, - tls_alpn: normalize_alpn(proxy.alpn), - tls_insecure, - tls_utls: sing_features.with_utls ? tls_fingerprint : null, - tls_reality: proxy['reality-opts'] ? '1' : '0', - tls_reality_public_key: proxy['reality-opts'] ? proxy['reality-opts']['public-key'] : null, - tls_reality_short_id: proxy['reality-opts'] ? proxy['reality-opts']['short-id'] : null, - tcp_fast_open: (proxy.tfo === true) ? '1' : null - }; - apply_transport_opts(config, proxy); - break; - case 'trojan': - config = { - label: proxy.name, - type: 'trojan', - address: proxy.server, - port: to_string(proxy.port), - password: proxy.password, - tls: (proxy.tls === false) ? '0' : '1', - tls_sni, - tls_alpn: normalize_alpn(proxy.alpn), - tls_insecure, - tls_utls: sing_features.with_utls ? tls_fingerprint : null, - tcp_fast_open: (proxy.tfo === true) ? '1' : null - }; - apply_transport_opts(config, proxy); - break; - case 'ss': { - let ss_plugin = proxy.plugin; - if (ss_plugin === 'simple-obfs') - ss_plugin = 'obfs-local'; - config = { - label: proxy.name, - type: 'shadowsocks', - address: proxy.server, - port: to_string(proxy.port), - shadowsocks_encrypt_method: proxy.cipher, - password: proxy.password, - shadowsocks_plugin: ss_plugin, - shadowsocks_plugin_opts: proxy['plugin-opts'], - udp_over_tcp: bool_to_uci(proxy['udp-over-tcp']), - udp_over_tcp_version: to_string(proxy['udp-over-tcp-version']), - tcp_fast_open: (proxy.tfo === true) ? '1' : null - }; - break; - } - case 'ssr': - log(sprintf('Skipping unsupported ssr node: %s.', proxy.name || proxy.server)); - return null; - case 'socks5': - case 'socks': - case 'socks4': - case 'socks4a': - config = { - label: proxy.name, - type: 'socks', - address: proxy.server, - port: to_string(proxy.port), - username: proxy.username, - password: proxy.password, - socks_version: (proxy.type === 'socks4a') ? '4a' : ((proxy.type === 'socks4') ? '4' : '5'), - tls: (proxy.tls === true) ? '1' : '0', - tls_sni, - tls_insecure, - tls_utls: sing_features.with_utls ? tls_fingerprint : null, - tcp_fast_open: (proxy.tfo === true) ? '1' : null - }; - break; - case 'http': - config = { - label: proxy.name, - type: 'http', - address: proxy.server, - port: to_string(proxy.port), - username: proxy.username, - password: proxy.password, - tls: (proxy.tls === true) ? '1' : '0', - tls_sni, - tls_insecure, - tls_utls: sing_features.with_utls ? tls_fingerprint : null, - tcp_fast_open: (proxy.tfo === true) ? '1' : null - }; - break; - case 'tuic': { - if (!sing_features.with_quic) { - log(sprintf('Skipping unsupported %s node: %s.', proxy.type, proxy.name || proxy.server)); - log(sprintf('Please rebuild sing-box with %s support!', 'QUIC')); - return null; - } - let tuic_heartbeat = proxy['heartbeat-interval']; - if (has_value(tuic_heartbeat)) { - tuic_heartbeat = int(tuic_heartbeat); - if (tuic_heartbeat >= 1000) - tuic_heartbeat = int(tuic_heartbeat / 1000); - } - config = { - label: proxy.name, - type: 'tuic', - address: proxy.server, - port: to_string(proxy.port), - uuid: proxy.uuid, - password: proxy.password || proxy.token, - tuic_congestion_control: proxy['congestion-controller'], - tuic_udp_relay_mode: proxy['udp-relay-mode'], - tuic_udp_over_stream: bool_to_uci(proxy['udp-over-stream']), - tuic_enable_zero_rtt: bool_to_uci(proxy['zero-rtt-handshake']), - tuic_heartbeat: has_value(tuic_heartbeat) ? to_string(tuic_heartbeat) : null, - tls: '1', - tls_sni: proxy['disable-sni'] ? null : tls_sni, - tls_alpn: normalize_alpn(proxy.alpn), - tls_insecure, - tcp_fast_open: (proxy.tfo === true) ? '1' : null - }; - break; - } - case 'ssh': - config = { - label: proxy.name, - type: 'ssh', - address: proxy.server, - port: to_string(proxy.port), - username: proxy.username, - password: proxy.password, - ssh_client_version: proxy['client-version'], - ssh_host_key: normalize_list(proxy['host-key']), - ssh_host_key_algo: normalize_list(proxy['host-key-algorithms']), - ssh_priv_key: normalize_list(proxy['private-key']), - ssh_priv_key_pp: proxy['private-key-passphrase'], - tcp_fast_open: (proxy.tfo === true) ? '1' : null - }; - break; - case 'wireguard': { - let wg_addresses = []; - if (has_value(proxy.ip)) - push(wg_addresses, to_string(proxy.ip)); - if (has_value(proxy.ipv6)) - push(wg_addresses, to_string(proxy.ipv6)); - config = { - label: proxy.name, - type: 'wireguard', - address: proxy.server, - port: to_string(proxy.port), - wireguard_local_address: length(wg_addresses) ? wg_addresses : null, - wireguard_private_key: proxy['private-key'], - wireguard_peer_public_key: proxy['public-key'], - wireguard_pre_shared_key: proxy['pre-shared-key'], - wireguard_reserved: normalize_list(proxy.reserved), - wireguard_mtu: to_string(proxy.mtu), - wireguard_persistent_keepalive_interval: to_string(proxy['persistent-keepalive'] || proxy['persistent-keepalive-interval'] || proxy.keepalive) - }; - break; - } - default: - return null; - } - - return config; -} - -function parse_subscription_userinfo(headers) { - let header_value = null; - for (let line in split(headers || '', '\n')) { - const matched = match(line, /^\s*subscription-userinfo:\s*(.*)$/i); - if (matched) - header_value = trim(matched[1]); - } - - if (isEmpty(header_value)) - return null; - - let info = {}; - for (let item in split(header_value, ';')) { - const matched = match(trim(item), /^([a-z]+)\s*=\s*([0-9]+)$/i); - if (!matched) - continue; - - const value = int(matched[2]); - if (value < 0) - continue; - - if (match(matched[1], /^upload$/i)) - info.upload = value; - else if (match(matched[1], /^download$/i)) - info.download = value; - else if (match(matched[1], /^total$/i)) - info.total = value; - else if (match(matched[1], /^expire$/i)) - info.expire = value; - } - - return length(info) ? info : null; -} - -function subscription_info_option(url) { - url = replace(url || '', /#.*$/, ''); - return 'subinfo_' + substr(md5(url), 0, 16); -} - -function subscription_display_name(url) { - const names = normalize_list(uci.get(uciconfig, ucisubscription, 'subscription_name')) || []; - let index = 0; - for (let configured_url in all_subscription_urls) { - if (replace(configured_url, /#.*$/, '') === replace(url, /#.*$/, '')) { - const name = trim(names[index] || ''); - return name || substr(md5(replace(url, /#.*$/, '')), 0, 8); - } - index++; - } - return substr(md5(replace(url, /#.*$/, '')), 0, 8); -} - -function previous_subscription_info(info_option) { - const value = uci.get(uciconfig, ucisubscription, info_option); - if (isEmpty(value)) - return null; - - try { - const info = json(value); - if (type(info) === 'object' && (('upload' in info) || ('download' in info) || - ('total' in info) || ('expire' in info))) - return info; - } catch (e) {} - - return null; -} - -function merge_subscription_info(current, previous) { - if (!current) - return previous || null; - if (!previous) - return current; - - for (let field in ['upload', 'download', 'total', 'expire']) - if (!(field in current) && (field in previous)) - current[field] = previous[field]; - - return current; -} - -function cleanup_subscription_info() { - let active_options = {}; - for (let url in all_subscription_urls) - active_options[subscription_info_option(url)] = true; - - const subscription = uci.get_all(uciconfig, ucisubscription) || {}; - for (let option in keys(subscription)) - if (match(option, /^subinfo_/) && !active_options[option]) - uci.delete(uciconfig, ucisubscription, option); -} - -function apply_sing_box_tls(config, outbound) { - const tls = outbound.tls; - if (type(tls) !== 'object') - return; - - config.tls = (tls.enabled === false) ? '0' : '1'; - config.tls_sni = tls.server_name; - config.tls_insecure = bool_to_uci(tls.insecure); - config.tls_alpn = normalize_alpn(tls.alpn); - config.tls_utls = sing_features.with_utls ? tls.utls?.fingerprint : null; - config.tls_reality = tls.reality ? '1' : '0'; - config.tls_reality_public_key = tls.reality?.public_key; - config.tls_reality_short_id = tls.reality?.short_id; -} - -function apply_sing_box_transport(config, outbound) { - const transport = outbound.transport; - if (type(transport) !== 'object') - return; - - config.transport = transport.type; - switch (transport.type) { - case 'ws': - config.ws_path = transport.path; - config.ws_host = get_header_host(transport.headers); - config.websocket_early_data = to_string(transport.max_early_data); - config.websocket_early_data_header = transport.early_data_header_name; - break; - case 'grpc': - config.grpc_servicename = transport.service_name; - break; - case 'http': - config.http_path = normalize_first(transport.path); - config.http_host = normalize_host_list(get_header_host(transport.headers) || transport.host); - config.http_method = transport.method; - break; - case 'httpupgrade': - config.httpupgrade_host = get_header_host(transport.headers) || transport.host; - config.http_path = normalize_first(transport.path); - break; - } -} - -function parse_sing_box_outbound(outbound) { - if (type(outbound) !== 'object') - return null; - - let config; - const port = to_string(outbound.server_port || outbound.port); - - switch (outbound.type) { - case 'anytls': - config = { - label: outbound.tag, - type: 'anytls', - address: outbound.server, - port, - password: outbound.password, - tls: '1' - }; - break; - case 'vmess': - config = { - label: outbound.tag, - type: 'vmess', - address: outbound.server, - port, - uuid: outbound.uuid, - vmess_alterid: to_string(outbound.alter_id), - vmess_encrypt: outbound.security, - packet_encoding: outbound.packet_encoding - }; - break; - case 'vless': - config = { - label: outbound.tag, - type: 'vless', - address: outbound.server, - port, - uuid: outbound.uuid, - vless_flow: outbound.flow, - packet_encoding: outbound.packet_encoding - }; - break; - case 'trojan': - config = { - label: outbound.tag, - type: 'trojan', - address: outbound.server, - port, - password: outbound.password, - tls: '1' - }; - break; - case 'shadowsocks': - config = { - label: outbound.tag, - type: 'shadowsocks', - address: outbound.server, - port, - shadowsocks_encrypt_method: outbound.method, - password: outbound.password, - shadowsocks_plugin: outbound.plugin, - shadowsocks_plugin_opts: outbound.plugin_opts - }; - break; - case 'hysteria': - config = { - label: outbound.tag, - type: 'hysteria', - address: outbound.server, - port, - hysteria_hopping_port: outbound.server_ports, - hysteria_auth_type: outbound.auth_str ? 'string' : (outbound.auth ? 'base64' : null), - hysteria_auth_payload: outbound.auth_str || outbound.auth, - hysteria_obfs_password: outbound.obfs, - hysteria_down_mbps: to_string(outbound.down_mbps), - hysteria_up_mbps: to_string(outbound.up_mbps), - tls: '1' - }; - break; - case 'hysteria2': - config = { - label: outbound.tag, - type: 'hysteria2', - address: outbound.server, - port, - password: outbound.password, - hysteria_hopping_port: outbound.server_ports, - hysteria_down_mbps: to_string(outbound.down_mbps), - hysteria_up_mbps: to_string(outbound.up_mbps), - hysteria_obfs_type: outbound.obfs?.type, - hysteria_obfs_password: outbound.obfs?.password, - tls: '1' - }; - break; - case 'tuic': - config = { - label: outbound.tag, - type: 'tuic', - address: outbound.server, - port, - uuid: outbound.uuid, - password: outbound.password, - tuic_congestion_control: outbound.congestion_control, - tuic_udp_relay_mode: outbound.udp_relay_mode, - tuic_udp_over_stream: bool_to_uci(outbound.udp_over_stream), - tuic_enable_zero_rtt: bool_to_uci(outbound.zero_rtt_handshake), - tuic_heartbeat: to_string(outbound.heartbeat), - tls: '1' - }; - break; - case 'socks': - config = { - label: outbound.tag, - type: 'socks', - address: outbound.server, - port, - username: outbound.username, - password: outbound.password, - socks_version: outbound.version || '5' - }; - break; - case 'http': - config = { - label: outbound.tag, - type: 'http', - address: outbound.server, - port, - username: outbound.username, - password: outbound.password - }; - break; - case 'ssh': - config = { - label: outbound.tag, - type: 'ssh', - address: outbound.server, - port, - username: outbound.user || outbound.username, - password: outbound.password, - ssh_client_version: outbound.client_version, - ssh_host_key: normalize_list(outbound.host_key), - ssh_host_key_algo: normalize_list(outbound.host_key_algorithms), - ssh_priv_key: normalize_list(outbound.private_key), - ssh_priv_key_pp: outbound.private_key_passphrase - }; - break; - case 'wireguard': - config = { - label: outbound.tag, - type: 'wireguard', - address: outbound.server, - port, - wireguard_local_address: normalize_list(outbound.local_address || outbound.address), - wireguard_private_key: outbound.private_key, - wireguard_peer_public_key: outbound.peer_public_key, - wireguard_pre_shared_key: outbound.pre_shared_key, - wireguard_reserved: normalize_list(outbound.reserved), - wireguard_mtu: to_string(outbound.mtu), - wireguard_persistent_keepalive_interval: to_string(outbound.persistent_keepalive_interval) - }; - break; - default: - return null; - } - - if (!isEmpty(config)) { - apply_sing_box_tls(config, outbound); - apply_sing_box_transport(config, outbound); - config.tcp_fast_open = bool_to_uci(outbound.tcp_fast_open); - config.tcp_multi_path = bool_to_uci(outbound.tcp_multi_path); - config.udp_fragment = bool_to_uci(outbound.udp_fragment); - } - - return config; -} - -function parse_uri(uri) { - let config, url, params; - - if (type(uri) === 'object') { - if (uri.nodetype === 'mihomo') { - return parse_mihomo_proxy(uri); - } - if (uri.nodetype === 'sing-box') { - return parse_sing_box_outbound(uri); - } - if (uri.nodetype === 'sip008') { - /* https://shadowsocks.org/guide/sip008.html */ - config = { - label: uri.remarks, - type: 'shadowsocks', - address: uri.server, - port: uri.server_port, - shadowsocks_encrypt_method: uri.method, - password: uri.password, - shadowsocks_plugin: uri.plugin, - shadowsocks_plugin_opts: uri.plugin_opts - }; - } - } else if (type(uri) === 'string') { - uri = split(trim(uri), '://'); - - switch (uri[0]) { - case 'anytls': - /* https://github.com/anytls/anytls-go/blob/v0.0.8/docs/uri_scheme.md */ - url = parseURL('http://' + uri[1]) || {}; - params = url.searchParams || {}; - let anytls_fp = params.fp || params.fingerprint; - if (anytls_fp === 'none' || anytls_fp === 'disable' || anytls_fp === 'disabled') - anytls_fp = null; - else if (!has_value(anytls_fp)) - anytls_fp = 'chrome'; - - config = { - label: url.hash ? urldecode(url.hash) : null, - type: 'anytls', - address: url.hostname, - port: url.port, - password: urldecode(url.username), - tls: '1', - tls_insecure: (params.insecure === '1' || params.allowInsecure === '1') ? '1' : '0', - tls_sni: params.sni, - tls_utls: sing_features.with_utls ? anytls_fp : null - }; - - break; - case 'http': - case 'https': - url = parseURL('http://' + uri[1]) || {}; - - config = { - label: url.hash ? urldecode(url.hash) : null, - type: 'http', - address: url.hostname, - port: url.port, - username: url.username ? urldecode(url.username) : null, - password: url.password ? urldecode(url.password) : null, - tls: (uri[0] === 'https') ? '1' : '0' - }; - - break; - case 'hysteria': - /* https://github.com/HyNetwork/hysteria/wiki/URI-Scheme */ - url = parseURL('http://' + uri[1]) || {}; - params = url.searchParams || {}; - - if (!sing_features.with_quic || (params.protocol && params.protocol !== 'udp')) { - log(sprintf('Skipping unsupported %s node: %s.', uri[0], urldecode(url.hash) || url.hostname)); - if (!sing_features.with_quic) - log(sprintf('Please rebuild sing-box with %s support!', 'QUIC')); - - return null; - } - - config = { - label: url.hash ? urldecode(url.hash) : null, - type: 'hysteria', - address: url.hostname, - port: url.port, - hysteria_hopping_port: normalize_hysteria_hopping_port(params.mport), - hysteria_protocol: params.protocol || 'udp', - hysteria_auth_type: params.auth ? 'string' : null, - hysteria_auth_payload: params.auth, - hysteria_obfs_password: params.obfsParam, - hysteria_down_mbps: params.downmbps, - hysteria_up_mbps: params.upmbps, - tls: '1', - tls_insecure: (params.insecure === '1' || params.allowInsecure === '1') ? '1' : '0', - tls_sni: params.peer, - tls_alpn: params.alpn - }; - - break; - case 'hysteria2': - case 'hy2': - /* https://v2.hysteria.network/docs/developers/URI-Scheme/ */ - url = parseURL('http://' + uri[1]) || {}; - params = url.searchParams || {}; - - if (!sing_features.with_quic) { - log(sprintf('Skipping unsupported %s node: %s.', uri[0], urldecode(url.hash) || url.hostname)); - log(sprintf('Please rebuild sing-box with %s support!', 'QUIC')); - return null; - } - - config = { - label: url.hash ? urldecode(url.hash) : null, - type: 'hysteria2', - address: url.hostname, - port: url.port, - password: url.username ? ( - urldecode(url.username + (url.password ? (':' + url.password) : '')) - ) : null, - hysteria_hopping_port: normalize_hysteria_hopping_port(params.mport), - hysteria_obfs_type: params.obfs, - hysteria_obfs_password: params['obfs-password'], - tls: '1', - tls_insecure: (params.insecure === '1' || params.allowInsecure === '1') ? '1' : '0', - tls_sni: params.sni - }; - - break; - case 'socks': - case 'socks4': - case 'socks4a': - case 'socsk5': - case 'socks5h': - url = parseURL('http://' + uri[1]) || {}; - - config = { - label: url.hash ? urldecode(url.hash) : null, - type: 'socks', - address: url.hostname, - port: url.port, - username: url.username ? urldecode(url.username) : null, - password: url.password ? urldecode(url.password) : null, - socks_version: (match(uri[0], /4/)) ? '4' : '5' - }; - - break; - case 'ss': - /* "Lovely" Shadowrocket format */ - const ss_suri = split(uri[1], '#'); - let ss_slabel = ''; - if (length(ss_suri) <= 2) { - if (length(ss_suri) === 2) - ss_slabel = '#' + urlencode(ss_suri[1]); - if (decodeBase64Str(ss_suri[0])) - uri[1] = decodeBase64Str(ss_suri[0]) + ss_slabel; - } - - /* Legacy format is not supported, it should be never appeared in modern subscriptions */ - /* https://github.com/shadowsocks/shadowsocks-org/commit/78ca46cd6859a4e9475953ed34a2d301454f579e */ - - /* SIP002 format https://shadowsocks.org/guide/sip002.html */ - url = parseURL('http://' + uri[1]) || {}; - - let ss_userinfo = {}; - if (url.username && url.password) - /* User info encoded with URIComponent */ - ss_userinfo = [url.username, urldecode(url.password)]; - else if (url.username) - /* User info encoded with base64 */ - ss_userinfo = split(decodeBase64Str(urldecode(url.username)), ':', 2); - - let ss_plugin, ss_plugin_opts; - if (url.search && url.searchParams.plugin) { - const ss_plugin_info = split(url.searchParams.plugin, ';', 2); - ss_plugin = ss_plugin_info[0]; - if (ss_plugin === 'simple-obfs') - /* Fix non-standard plugin name */ - ss_plugin = 'obfs-local'; - ss_plugin_opts = ss_plugin_info[1]; - } - - config = { - label: url.hash ? urldecode(url.hash) : null, - type: 'shadowsocks', - address: url.hostname, - port: url.port, - shadowsocks_encrypt_method: ss_userinfo[0], - password: ss_userinfo[1], - shadowsocks_plugin: ss_plugin, - shadowsocks_plugin_opts: ss_plugin_opts - }; - - break; - case 'trojan': - /* https://p4gefau1t.github.io/trojan-go/developer/url/ */ - url = parseURL('http://' + uri[1]) || {}; - params = url.searchParams || {}; - - config = { - label: url.hash ? urldecode(url.hash) : null, - type: 'trojan', - address: url.hostname, - port: url.port, - password: urldecode(url.username), - transport: (params.type !== 'tcp') ? params.type : null, - tls: '1', - tls_insecure: (params.insecure === '1' || params.allowInsecure === '1') ? '1' : '0', - tls_sni: params.sni - }; - switch(params.type) { - case 'grpc': - config.grpc_servicename = params.serviceName; - break; - case 'ws': - config.ws_host = params.host ? urldecode(params.host) : null; - config.ws_path = params.path ? urldecode(params.path) : null; - if (config.ws_path && match(config.ws_path, /\?ed=/)) { - config.websocket_early_data_header = 'Sec-WebSocket-Protocol'; - config.websocket_early_data = split(config.ws_path, '?ed=')[1]; - config.ws_path = split(config.ws_path, '?ed=')[0]; - } - break; - } - - break; - case 'tuic': - /* https://github.com/daeuniverse/dae/discussions/182 */ - url = parseURL('http://' + uri[1]) || {}; - params = url.searchParams || {}; - - if (!sing_features.with_quic) { - log(sprintf('Skipping unsupported %s node: %s.', uri[0], urldecode(url.hash) || url.hostname)); - log(sprintf('Please rebuild sing-box with %s support!', 'QUIC')); - - return null; - } - - config = { - label: url.hash ? urldecode(url.hash) : null, - type: 'tuic', - address: url.hostname, - port: url.port, - uuid: url.username, - password: url.password ? urldecode(url.password) : null, - tuic_congestion_control: params.congestion_control, - tuic_udp_relay_mode: params.udp_relay_mode, - tls: '1', - tls_insecure: (params.insecure === '1' || params.allowInsecure === '1') ? '1' : '0', - tls_sni: params.sni, - tls_alpn: params.alpn ? split(urldecode(params.alpn), ',') : null, - }; - - break; - case 'vless': - /* https://github.com/XTLS/Xray-core/discussions/716 */ - url = parseURL('http://' + uri[1]) || {}; - params = url.searchParams || {}; - - /* Unsupported protocol */ - if (params.type === 'kcp') { - log(sprintf('Skipping sunsupported %s node: %s.', uri[0], urldecode(url.hash) || url.hostname)); - return null; - } else if (params.type === 'quic' && ((params.quicSecurity && params.quicSecurity !== 'none') || !sing_features.with_quic)) { - log(sprintf('Skipping sunsupported %s node: %s.', uri[0], urldecode(url.hash) || url.hostname)); - if (!sing_features.with_quic) - log(sprintf('Please rebuild sing-box with %s support!', 'QUIC')); - - return null; - } - - config = { - label: url.hash ? urldecode(url.hash) : null, - type: 'vless', - address: url.hostname, - port: url.port, - uuid: url.username, - transport: (params.type !== 'tcp') ? params.type : null, - tls: (params.security in ['tls', 'xtls', 'reality']) ? '1' : '0', - tls_insecure: (params.insecure === '1' || params.allowInsecure === '1') ? '1' : '0', - tls_sni: params.sni, - tls_alpn: params.alpn ? split(urldecode(params.alpn), ',') : null, - tls_reality: (params.security === 'reality') ? '1' : '0', - tls_reality_public_key: params.pbk ? urldecode(params.pbk) : null, - tls_reality_short_id: params.sid, - tls_utls: sing_features.with_utls ? params.fp : null, - vless_flow: (params.security in ['tls', 'reality']) ? params.flow : null - }; - switch(params.type) { - case 'grpc': - config.grpc_servicename = params.serviceName; - break; - case 'http': - case 'tcp': - if (params.type === 'http' || params.headerType === 'http') { - config.http_host = params.host ? split(urldecode(params.host), ',') : null; - config.http_path = params.path ? urldecode(params.path) : null; - } - break; - case 'httpupgrade': - config.httpupgrade_host = params.host ? urldecode(params.host) : null; - config.http_path = params.path ? urldecode(params.path) : null; - break; - case 'ws': - config.ws_host = params.host ? urldecode(params.host) : null; - config.ws_path = params.path ? urldecode(params.path) : null; - if (config.ws_path && match(config.ws_path, /\?ed=/)) { - config.websocket_early_data_header = 'Sec-WebSocket-Protocol'; - config.websocket_early_data = split(config.ws_path, '?ed=')[1]; - config.ws_path = split(config.ws_path, '?ed=')[0]; - } - break; - } - - break; - case 'vmess': - /* "Lovely" shadowrocket format */ - if (match(uri, /&/)) { - log(sprintf('Skipping unsupported %s format.', uri[0])); - return null; - } - - /* https://github.com/2dust/v2rayN/wiki/Description-of-VMess-share-link */ - try { - uri = json(decodeBase64Str(uri[1])) || {}; - } catch(e) { - log(sprintf('Skipping unsupported %s format.', uri[0])); - return null; - } - - if (uri.v != '2') { - log(sprintf('Skipping unsupported %s format.', uri[0])); - return null; - /* Unsupported protocol */ - } else if (uri.net === 'kcp') { - log(sprintf('Skipping unsupported %s node: %s.', uri[0], uri.ps || uri.add)); - return null; - } else if (uri.net === 'quic' && ((uri.type && uri.type !== 'none') || uri.path || !sing_features.with_quic)) { - log(sprintf('Skipping unsupported %s node: %s.', uri[0], uri.ps || uri.add)); - if (!sing_features.with_quic) - log(sprintf('Please rebuild sing-box with %s support!', 'QUIC')); - - return null; - } - /* - * https://www.v2fly.org/config/protocols/vmess.html#vmess-md5-%E8%AE%A4%E8%AF%81%E4%BF%A1%E6%81%AF-%E6%B7%98%E6%B1%B0%E6%9C%BA%E5%88%B6 - * else if (uri.aid && int(uri.aid) !== 0) { - * log(sprintf('Skipping unsupported %s node: %s.', uri[0], uri.ps || uri.add)); - * return null; - * } - */ - - config = { - label: uri.ps ? urldecode(uri.ps) : null, - type: 'vmess', - address: uri.add, - port: uri.port, - uuid: uri.id, - vmess_alterid: uri.aid, - vmess_encrypt: uri.scy || 'auto', - vmess_global_padding: '1', - transport: (uri.net !== 'tcp') ? uri.net : null, - tls: (uri.tls === 'tls') ? '1' : '0', - tls_sni: uri.sni || uri.host, - tls_alpn: uri.alpn ? split(uri.alpn, ',') : null, - tls_utls: sing_features.with_utls ? uri.fp : null - }; - switch (uri.net) { - case 'grpc': - config.grpc_servicename = uri.path; - break; - case 'h2': - case 'tcp': - if (uri.net === 'h2' || uri.type === 'http') { - config.transport = 'http'; - config.http_host = uri.host ? split(uri.host, ',') : null; - config.http_path = uri.path; - } - break; - case 'httpupgrade': - config.httpupgrade_host = uri.host; - config.http_path = uri.path; - break; - case 'ws': - config.ws_host = uri.host; - config.ws_path = uri.path; - if (config.ws_path && match(config.ws_path, /\?ed=/)) { - config.websocket_early_data_header = 'Sec-WebSocket-Protocol'; - config.websocket_early_data = split(config.ws_path, '?ed=')[1]; - config.ws_path = split(config.ws_path, '?ed=')[0]; - } - break; - } - - break; - } - } - - if (!isEmpty(config)) { - if (config.address) - config.address = replace(config.address, /\[|\]/g, ''); - - if (!validation('host', config.address) || !validation('port', config.port)) { - log(sprintf('Skipping invalid %s node: %s.', config.type, config.label || 'NULL')); - return null; - } else if (!config.label) - config.label = (validation('ip6addr', config.address) ? - `[${config.address}]` : config.address) + ':' + config.port; - } - - return config; -} - -function split_top_level(str, separator) { - let items = [], current = '', quote = null, depth = 0; - - for (let i = 0; i < length(str); i++) { - const ch = substr(str, i, 1); - - if (quote) { - current += ch; - if (ch === quote) - quote = null; - continue; - } - - if (ch === '"' || ch === "'") { - quote = ch; - current += ch; - continue; - } - - if (ch === '[' || ch === '{') - depth++; - else if (ch === ']' || ch === '}') - depth--; - - if (ch === separator && depth === 0) { - push(items, trim(current)); - current = ''; - } else { - current += ch; - } - } - - if (length(trim(current))) - push(items, trim(current)); - - return items; -} - -function strip_yaml_quotes(value) { - value = trim(value); - if ((match(value, /^".*"$/) || match(value, /^'.*'$/)) && length(value) >= 2) - return substr(value, 1, length(value) - 2); - - return value; -} - -function parse_yaml_value(value) { - value = trim(value || ''); - if (value === '' || value === 'null' || value === '~') - return null; - - if (match(value, /^\[.*\]$/)) { - let arr = []; - const inner = substr(value, 1, length(value) - 2); - for (let item in split_top_level(inner, ',')) - push(arr, parse_yaml_value(item)); - return arr; - } - - if (match(value, /^\{.*\}$/)) - return parse_yaml_inline_object(value); - - value = strip_yaml_quotes(value); - if (value === 'true') - return true; - if (value === 'false') - return false; - - return value; -} - -function parse_yaml_key_value(line) { - const m = match(line, /^([^:]+):\s*(.*)$/); - if (!m) - return null; - - return { - key: strip_yaml_quotes(trim(m[1])), - value: m[2] - }; -} - -function parse_yaml_inline_object(text) { - let obj = {}; - text = trim(text); - text = substr(text, 1, length(text) - 2); - - for (let part in split_top_level(text, ',')) { - const kv = parse_yaml_key_value(part); - if (kv) - obj[kv.key] = parse_yaml_value(kv.value); - } - - return obj; -} - -function yaml_indent(line) { - const m = match(line, /^(\s*)/); - return m ? length(m[1]) : 0; -} - -function stack_pop(stack) { - let next = []; - for (let i = 0; i < length(stack) - 1; i++) - push(next, stack[i]); - return next; -} - -function parse_mihomo_yaml(text) { - if (isEmpty(text) || type(text) !== 'string') - return null; - - let in_proxies = false, proxies = [], current = null, stack = []; - - for (let raw_line in split(text, '\n')) { - raw_line = replace(raw_line, /\r$/, ''); - let line = trim(raw_line); - - if (!line || match(line, /^#/)) - continue; - - if (line === 'proxies:' || match(line, /^proxies:\s*$/)) { - in_proxies = true; - continue; - } - if (!in_proxies) - continue; - - if (yaml_indent(raw_line) === 0 && match(line, /^[A-Za-z0-9_-]+:\s*$/)) - break; - - if (match(line, /^-\s*/)) { - if (current) - push(proxies, current); - - current = {}; - stack = [{ indent: yaml_indent(raw_line), obj: current }]; - line = replace(line, /^-\s*/, ''); - - if (!line) - continue; - - if (match(line, /^\{.*\}$/)) { - current = parse_yaml_inline_object(line); - current.nodetype = 'mihomo'; - stack = [{ indent: yaml_indent(raw_line), obj: current }]; - continue; - } - } - - if (!current) - continue; - - const kv = parse_yaml_key_value(line); - if (!kv) - continue; - - const indent = yaml_indent(raw_line); - while (length(stack) > 1 && indent <= stack[length(stack) - 1].indent) - stack = stack_pop(stack); - - const parent = stack[length(stack) - 1].obj; - if (trim(kv.value) === '') { - parent[kv.key] = {}; - push(stack, { indent, obj: parent[kv.key] }); - } else { - parent[kv.key] = parse_yaml_value(kv.value); - } - } - - if (current) - push(proxies, current); - - for (let proxy in proxies) - proxy.nodetype = 'mihomo'; - - return length(proxies) ? proxies : null; -} - function main() { - cleanup_subscription_info(); - - if (via_proxy !== '1' && !provider_update_id) { + if (via_proxy !== '1') { log('Stopping service...'); init_action('homeproxy', 'stop'); } @@ -1423,61 +99,38 @@ function main() { const groupHash = md5(url); node_cache[groupHash] = {}; - const response = wGETResponse(url, user_agent), - res = response?.body; - if (isEmpty(res)) { - log(sprintf('Failed to fetch resources from %s.', url)); + const fetched = wGETVerbose(url, user_agent); + if (isEmpty(fetched.content)) { + log(sprintf('Failed to fetch resources from %s: %s', url, fetched.error || 'empty response')); continue; } + const res = fetched.content; let nodes; try { - const parsed = json(res); - if (type(parsed?.servers) === 'array') { - nodes = parsed.servers; + nodes = json(res).servers || json(res); - /* Shadowsocks SIP008 format */ - if (nodes[0].server && nodes[0].method) - map(nodes, (_, i) => nodes[i].nodetype = 'sip008'); - } else if (type(parsed?.proxies) === 'array') { - nodes = parsed.proxies; - map(nodes, (_, i) => nodes[i].nodetype = 'mihomo'); - } else if (type(parsed?.outbounds) === 'array') { - nodes = parsed.outbounds; - map(nodes, (_, i) => nodes[i].nodetype = 'sing-box'); - } else if (type(parsed) === 'array') { - nodes = parsed; - if (nodes[0]?.server && nodes[0]?.method) - map(nodes, (_, i) => nodes[i].nodetype = 'sip008'); - else if (nodes[0]?.type && nodes[0]?.server) - map(nodes, (_, i) => nodes[i].nodetype = 'sing-box'); - } else { - nodes = []; - } + /* Shadowsocks SIP008 format */ + if (nodes[0].server && nodes[0].method) + map(nodes, (_, i) => nodes[i].nodetype = 'sip008'); } catch(e) { - nodes = parse_mihomo_yaml(res); - if (isEmpty(nodes)) { - nodes = decodeBase64Str(res); - const decoded_nodes = parse_mihomo_yaml(nodes); - if (!isEmpty(decoded_nodes)) - nodes = decoded_nodes; - else - nodes = nodes ? split(trim(replace(nodes, / /g, '_')), '\n') : []; - } + log(sprintf('JSON parse failed for %s, trying base64: %s', url, e.message)); + nodes = decodeBase64Str(res); + nodes = nodes ? split(trim(nodes), '\n') : []; } let count = 0; for (let node in nodes) { let config; if (!isEmpty(node)) - config = parse_uri(node); + config = parse_uri(node, sing_features, log); if (isEmpty(config)) continue; const label = config.label; config.label = null; const confHash = md5(sprintf('%J', config)), - nameHash = md5(label); + nameHash = md5(groupHash + label); config.label = label; if (filter_check(config.label)) @@ -1487,7 +140,7 @@ function main() { else { if (config.tls === '1' && allow_insecure === '1') config.tls_insecure = '1'; - if (config.type in ['vless', 'vmess'] && isEmpty(config.packet_encoding)) + if (config.type in ['vless', 'vmess']) config.packet_encoding = packet_encoding; config.grouphash = groupHash; @@ -1500,53 +153,16 @@ function main() { } } - if (count == 0) + if (count === 0) log(sprintf('No valid node found in %s.', url)); - else { - const info_option = subscription_info_option(url), - display_name = subscription_display_name(url); - const previous_info = previous_subscription_info(info_option); - let subscription_info = parse_subscription_userinfo(response.headers); - - if (!subscription_info || !('total' in subscription_info) || !('expire' in subscription_info)) { - const fallback_headers = wGETHeaders(url, 'clash.meta'); - const fallback_info = parse_subscription_userinfo(fallback_headers); - if (fallback_info) { - if (subscription_info) - log(sprintf('Supplemented subscription user info for %s with Clash Meta user agent.', display_name)); - else - log(sprintf('Fetched subscription user info for %s with Clash Meta user agent.', display_name)); - subscription_info = merge_subscription_info(subscription_info, fallback_info); - } - } - - if (!subscription_info) { - subscription_info = previous_info || {}; - if (length(subscription_info)) - log(sprintf('Subscription %s did not return user info; keeping the previous values.', display_name)); - else - log(sprintf('Subscription %s did not return Subscription-Userinfo.', display_name)); - } else { - if (!('expire' in subscription_info)) - log(sprintf('Subscription %s returned traffic data without an expire value%s.', display_name, - previous_info && ('expire' in previous_info) ? '; keeping the previous value' : '')); - if (!('total' in subscription_info)) - log(sprintf('Subscription %s returned user info without a total value%s.', display_name, - previous_info && ('total' in previous_info) ? '; keeping the previous value' : '')); - subscription_info = merge_subscription_info(subscription_info, previous_info); - } - - subscription_info.updated_at = getTime(); - uci.set(uciconfig, ucisubscription, info_option, sprintf('%.J', subscription_info)); - + else log(sprintf('Successfully fetched %s nodes of total %s from %s.', count, length(nodes), url)); - } } if (isEmpty(node_result)) { log('Failed to update subscriptions: no valid node found.'); - if (via_proxy !== '1' && !provider_update_id) { + if (via_proxy !== '1') { log('Starting service...'); init_action('homeproxy', 'start'); } @@ -1560,15 +176,11 @@ function main() { if (!cfg.grouphash) return null; - /* A provider update must not touch nodes from other subscriptions. */ - if (!(cfg.grouphash in node_cache)) + /* Empty object - failed to fetch nodes, or subscription URL not yet processed */ + if (!node_cache[cfg.grouphash] || length(node_cache[cfg.grouphash]) === 0) return null; - /* Empty object - failed to fetch nodes */ - if (length(node_cache[cfg.grouphash]) === 0) - return null; - - if (!node_cache[cfg.grouphash] || !node_cache[cfg.grouphash][cfg['.name']]) { + if (!node_cache[cfg.grouphash][cfg['.name']]) { uci.delete(uciconfig, cfg['.name']); removed++; @@ -1588,7 +200,7 @@ function main() { if (node.isExisting) return null; - const nameHash = md5(node.label); + const nameHash = md5(node.grouphash + node.label); uci.set(uciconfig, nameHash, 'node'); map(keys(node), (v) => uci.set(uciconfig, nameHash, v, node[v])); @@ -1597,19 +209,25 @@ function main() { }); uci.commit(uciconfig); - let need_restart = (via_proxy !== '1') || !!provider_update_id; + let need_restart = (via_proxy !== '1'); if (!isEmpty(main_node)) { const first_server = uci.get_first(uciconfig, ucinode); if (first_server) { let main_urltest_nodes; if (main_node === 'urltest') { - main_urltest_nodes = filter(uci.get(uciconfig, ucimain, 'main_urltest_nodes'), (v) => { + const old_urltest_nodes = uci.get(uciconfig, ucimain, 'main_urltest_nodes') || []; + main_urltest_nodes = filter(old_urltest_nodes, (v) => { if (!uci.get(uciconfig, v)) { log(sprintf('Node %s is gone, removing from urltest list.', v)); return false; } return true; }); + if (length(main_urltest_nodes) !== length(old_urltest_nodes)) { + uci.set(uciconfig, ucimain, 'main_urltest_nodes', main_urltest_nodes); + uci.commit(uciconfig); + need_restart = true; + } } if ((main_node === 'urltest') ? !length(main_urltest_nodes) : !uci.get(uciconfig, main_node)) { @@ -1623,13 +241,19 @@ function main() { if (!isEmpty(main_udp_node) && main_udp_node !== 'same') { let main_udp_urltest_nodes; if (main_udp_node === 'urltest') { - main_udp_urltest_nodes = filter(uci.get(uciconfig, ucimain, 'main_udp_urltest_nodes'), (v) => { + const old_udp_urltest_nodes = uci.get(uciconfig, ucimain, 'main_udp_urltest_nodes') || []; + main_udp_urltest_nodes = filter(old_udp_urltest_nodes, (v) => { if (!uci.get(uciconfig, v)) { log(sprintf('Node %s is gone, removing from urltest list.', v)); return false; } return true; }); + if (length(main_udp_urltest_nodes) !== length(old_udp_urltest_nodes)) { + uci.set(uciconfig, ucimain, 'main_udp_urltest_nodes', main_udp_urltest_nodes); + uci.commit(uciconfig); + need_restart = true; + } } if ((main_udp_node === 'urltest') ? !length(main_udp_urltest_nodes) : !uci.get(uciconfig, main_udp_node)) { @@ -1650,6 +274,21 @@ function main() { } } + /* Scrub stale urltest member references in custom routing nodes */ + uci.foreach(uciconfig, 'routing_node', (cfg) => { + if (cfg.node !== 'urltest' || isEmpty(cfg.urltest_nodes)) + return null; + + const cleaned_nodes = filter(cfg.urltest_nodes, (v) => uci.get(uciconfig, v)); + if (length(cleaned_nodes) !== length(cfg.urltest_nodes)) { + uci.set(uciconfig, cfg['.name'], 'urltest_nodes', cleaned_nodes); + uci.commit(uciconfig); + need_restart = true; + + log(sprintf('Routing node %s: removed gone nodes from urltest list.', cfg['.name'])); + } + }); + if (need_restart) { log('Restarting service...'); init_action('homeproxy', 'stop'); @@ -1660,15 +299,9 @@ function main() { log('Successfully updated subscriptions.'); } -if (provider_update_id && isEmpty(subscription_urls)) { - log(sprintf('Provider %s does not match any subscription.', provider_update_id)); - exit(1); -} - if (!isEmpty(subscription_urls)) try { - if (call(main) === false) - exit(1); + call(main); } catch(e) { log('[FATAL ERROR] An error occurred during updating subscriptions:'); log(sprintf('%s: %s', e.type, e.message)); @@ -1677,5 +310,4 @@ if (!isEmpty(subscription_urls)) log('Restarting service...'); init_action('homeproxy', 'stop'); init_action('homeproxy', 'start'); - exit(1); } diff --git a/luci-app-homeproxy/root/etc/init.d/homeproxy b/luci-app-homeproxy/root/etc/init.d/homeproxy index ae3e64721..7784c5148 100755 --- a/luci-app-homeproxy/root/etc/init.d/homeproxy +++ b/luci-app-homeproxy/root/etc/init.d/homeproxy @@ -15,94 +15,60 @@ HP_DIR="/etc/homeproxy" RUN_DIR="/var/run/homeproxy" LOG_PATH="$RUN_DIR/homeproxy.log" -# we don't know which is the default server, just take the first one -DNSMASQ_UCI_CONFIG="$(uci -q show "dhcp.@dnsmasq[0]" | awk 'NR==1 {split($0, conf, /[.=]/); print conf[2]}')" -if [ -f "/tmp/etc/dnsmasq.conf.$DNSMASQ_UCI_CONFIG" ]; then - DNSMASQ_DIR="$(awk -F '=' '/^conf-dir=/ {print $2}' "/tmp/etc/dnsmasq.conf.$DNSMASQ_UCI_CONFIG")/dnsmasq-homeproxy.d" -else - DNSMASQ_DIR="/tmp/dnsmasq.d/dnsmasq-homeproxy.d" -fi +# fw4 chain/set inventory; single source of truth shared with firewall_post.ut +[ -f "$HP_DIR/scripts/fw4_names.sh" ] && . "$HP_DIR/scripts/fw4_names.sh" log() { echo -e "$(date "+%Y-%m-%d %H:%M:%S") [DAEMON] $*" >> "$LOG_PATH" } -init_logs() { - mkdir -p "$RUN_DIR" - mkdir -p "$HP_DIR/run/ui" - touch "$LOG_PATH" "$RUN_DIR/sing-box-c.log" "$RUN_DIR/sing-box-s.log" - chown -R sing-box:sing-box "$RUN_DIR" 2>"/dev/null" - chown -R sing-box:sing-box "$HP_DIR/run" 2>"/dev/null" -} +# Locate the directory dnsmasq reads the homeproxy snippets from. The UCI +# section name of the dnsmasq config is part of /tmp/etc/dnsmasq.conf., +# but `uci get` cannot return a section name (there is no `__name__`), so it is +# derived from the first `uci show` line. Either step can fail on an unusual +# setup; fall back to the generic directory and say so in the log instead of +# silently writing dnsmasq snippets nobody reads. +DNSMASQ_UCI_CONFIG="$(uci -q show "dhcp.@dnsmasq[0]" 2>"/dev/null" | head -n1)" +DNSMASQ_UCI_CONFIG="${DNSMASQ_UCI_CONFIG#*.}" +DNSMASQ_UCI_CONFIG="${DNSMASQ_UCI_CONFIG%%=*}" -valid_update_cron() { - echo "$1" | grep -Eq '^([0-9]|[0-5][0-9]) ([0-9]|[01][0-9]|2[0-3]) \* \* ([0-7]|\*)$' -} +DNSMASQ_DIR="" +if [ -n "$DNSMASQ_UCI_CONFIG" ] && [ -f "/tmp/etc/dnsmasq.conf.$DNSMASQ_UCI_CONFIG" ]; then + DNSMASQ_CONF_DIR="$(awk -F '=' '/^conf-dir=/ {print $2; exit}' "/tmp/etc/dnsmasq.conf.$DNSMASQ_UCI_CONFIG")" + [ -n "$DNSMASQ_CONF_DIR" ] && DNSMASQ_DIR="$DNSMASQ_CONF_DIR/dnsmasq-homeproxy.d" +fi -has_ruleset_cron() { - printf '%s\n' "$ruleset_cron_list" | grep -Fxq -- "$1" -} +if [ -z "$DNSMASQ_DIR" ]; then + log "WARNING: unable to derive the dnsmasq conf-dir (section '${DNSMASQ_UCI_CONFIG:-unknown}'), using /tmp/dnsmasq.d/dnsmasq-homeproxy.d." + DNSMASQ_DIR="/tmp/dnsmasq.d/dnsmasq-homeproxy.d" +fi -add_ruleset_cron() { - local section="$1" - local enabled auto_update type update_time - - config_get_bool enabled "$section" "enabled" "0" - config_get_bool auto_update "$section" "auto_update" "1" - config_get type "$section" "type" "local" - config_get update_time "$section" "update_interval" "" - - [ "$enabled" = "1" ] || return - [ "$auto_update" = "1" ] || return - [ "$type" = "remote" ] || return - [ -n "$update_time" ] || return - valid_update_cron "$update_time" || return - has_ruleset_cron "$update_time" && return - - echo -e "$update_time sh $HP_DIR/scripts/update_rulesets.sh #${CONF}_autosetup" >> "/etc/crontabs/root" - ruleset_cron_list="${ruleset_cron_list} -${update_time}" - cron_reload="1" -} - -setup_auto_update_cron() { - local cron_reload="0" - mkdir -p "/etc/crontabs" - touch "/etc/crontabs/root" - grep -q "#${CONF}_autosetup" "/etc/crontabs/root" 2>"/dev/null" && cron_reload="1" - sed -i "/#${CONF}_autosetup/d" "/etc/crontabs/root" 2>"/dev/null" - - local auto_update auto_update_time - config_get_bool auto_update "subscription" "auto_update" "0" - if [ "$auto_update" = "1" ]; then - config_get auto_update_time "subscription" "auto_update_time" "0 0 * * *" - if valid_update_cron "$auto_update_time"; then - echo -e "$auto_update_time sh $HP_DIR/scripts/update_crond.sh #${CONF}_autosetup" >> "/etc/crontabs/root" - cron_reload="1" - fi - fi - - local ruleset_cron_list="" - config_foreach add_ruleset_cron "ruleset" - [ "$cron_reload" = "1" ] && /etc/init.d/cron restart +restore_upnp_mappings() { + [ -x /etc/init.d/miniupnpd ] && /etc/init.d/miniupnpd enabled && /etc/init.d/miniupnpd running \ + && /etc/init.d/miniupnpd restart >"/dev/null" 2>&1 } start_service() { - init_logs - config_load "$CONF" - setup_auto_update_cron + + local sb_ver sb_major sb_minor + sb_ver="$(sing-box version -n 2>/dev/null)" + if [ -z "$sb_ver" ]; then + log "Error: cannot detect sing-box version, abort." + return 1 + fi + sb_major="${sb_ver%%.*}" + sb_minor="${sb_ver#*.}" + sb_minor="${sb_minor%%.*}" + if [ "$sb_major" -lt 1 ] || { [ "$sb_major" -eq 1 ] && [ "$sb_minor" -lt 14 ]; }; then + log "Error: sing-box >= 1.14.0 required, found ${sb_ver}." + return 1 + fi local routing_mode proxy_mode config_get routing_mode "config" "routing_mode" "bypass_mainland_china" config_get proxy_mode "config" "proxy_mode" "redirect_tproxy" - local cache_path - config_get cache_path "cache" "path" "$HP_DIR/cache.db" - mkdir -p "$(dirname "$cache_path")" - [ -e "$cache_path" ] || touch "$cache_path" - chown sing-box:sing-box "$cache_path" 2>"/dev/null" - local outbound_node if [ "$routing_mode" != "custom" ]; then config_get outbound_node "config" "main_node" "nil" @@ -114,11 +80,28 @@ start_service() { config_get_bool server_enabled "server" "enabled" "0" if [ "$outbound_node" = "nil" ] && [ "$server_enabled" = "0" ]; then + log "Neither client nor server is configured. Service not started." return 1 fi + mkdir -p "$RUN_DIR" + + local disable_gso=0 + uname -r | grep -Eq "^6\.6" && disable_gso=1 + if [ "$outbound_node" != "nil" ]; then - # Generate/Validate client config + local wan_waited=0 + while ! { ip route show default 2>"/dev/null" | grep -q . \ + || ip -6 route show default 2>"/dev/null" | grep -q . \ + || ifstatus wan 2>"/dev/null" | grep -q '"up": true'; }; do + wan_waited=$((wan_waited + 1)) + if [ "$wan_waited" -ge 60 ]; then + log "WARNING: No network route after 60s, starting sing-box anyway." + break + fi + sleep 1 + done + ucode -S "$HP_DIR/scripts/generate_client.uc" 2>>"$LOG_PATH" if [ ! -e "$RUN_DIR/sing-box-c.json" ]; then @@ -129,15 +112,26 @@ start_service() { return 1 fi - # DNSMasq rules + local auto_update auto_update_time + config_get_bool auto_update "subscription" "auto_update" "0" + if [ "$auto_update" = "1" ]; then + config_get auto_update_time "subscription" "auto_update_time" "2" + sed -i "/#${CONF}_autosetup/d" "/etc/crontabs/root" 2>"/dev/null" \ + || log "Warning: failed to drop the previous auto-update cron entry." + echo -e "0 $auto_update_time * * * $HP_DIR/scripts/update_crond.sh #${CONF}_autosetup" >> "/etc/crontabs/root" \ + || log "Warning: failed to install the auto-update cron entry." + /etc/init.d/cron restart >"/dev/null" 2>&1 || log "Warning: failed to restart cron." + fi + local ipv6_support dns_port config_get_bool ipv6_support "config" "ipv6_support" "0" config_get dns_port "infra" "dns_port" "5333" - mkdir -p "$DNSMASQ_DIR" - echo -e "conf-dir=$DNSMASQ_DIR" > "$DNSMASQ_DIR/../dnsmasq-homeproxy.conf" + mkdir -p "$DNSMASQ_DIR" || log "Warning: failed to create ${DNSMASQ_DIR}." + echo -e "conf-dir=$DNSMASQ_DIR" > "$DNSMASQ_DIR/../dnsmasq-homeproxy.conf" \ + || log "Warning: failed to write the dnsmasq conf-dir file." case "$routing_mode" in "bypass_mainland_china"|"custom"|"global") - cat <<-EOF >> "$DNSMASQ_DIR/redirect-dns.conf" + cat <<-EOF > "$DNSMASQ_DIR/redirect-dns.conf" no-poll no-resolv server=127.0.0.1#$dns_port @@ -161,7 +155,9 @@ start_service() { sed -r -e '/^\s*$/d' -e "s/(.*)/server=\/\1\/127.0.0.1#$dns_port\nnftset=\/\1\\/4#inet#fw4#homeproxy_wan_proxy_addr_v4$wan_nftset_v6/g" \ "$HP_DIR/resources/proxy_list.txt" > "$DNSMASQ_DIR/proxy_list.conf" fi - # Setup routing table + /etc/init.d/dnsmasq restart >"/dev/null" 2>&1 \ + || log "Warning: failed to restart dnsmasq, DNS-based routing may be stale." + local table_mark config_get table_mark "infra" "table_mark" "100" case "$proxy_mode" in @@ -172,12 +168,16 @@ start_service() { local tproxy_mark config_get tproxy_mark "infra" "tproxy_mark" "101" - ip rule add fwmark "$tproxy_mark" table "$table_mark" - ip route add local 0.0.0.0/0 dev lo table "$table_mark" + ip rule add fwmark "$tproxy_mark" table "$table_mark" 2>"/dev/null" \ + || log "Error: failed to add the tproxy ip rule (fwmark ${tproxy_mark}, table ${table_mark})." + ip route add local 0.0.0.0/0 dev lo table "$table_mark" 2>"/dev/null" \ + || log "Error: failed to add the tproxy local route (table ${table_mark})." if [ "$ipv6_support" -eq "1" ]; then - ip -6 rule add fwmark "$tproxy_mark" table "$table_mark" - ip -6 route add local ::/0 dev lo table "$table_mark" + ip -6 rule add fwmark "$tproxy_mark" table "$table_mark" 2>"/dev/null" \ + || log "Error: failed to add the tproxy IPv6 rule (fwmark ${tproxy_mark}, table ${table_mark})." + ip -6 route add local ::/0 dev lo table "$table_mark" 2>"/dev/null" \ + || log "Error: failed to add the tproxy IPv6 local route (table ${table_mark})." fi fi ;; @@ -186,33 +186,38 @@ start_service() { config_get tun_name "infra" "tun_name" "singtun0" config_get tun_mark "infra" "tun_mark" "102" - ip tuntap add mode tun user root name "$tun_name" + ip tuntap add mode tun user root name "$tun_name" 2>"/dev/null" \ + || log "Error: failed to create the TUN device ${tun_name}." sleep 1s - ip link set "$tun_name" up + ip link set "$tun_name" up 2>"/dev/null" \ + || log "Error: failed to bring up the TUN device ${tun_name}." - ip route replace default dev "$tun_name" table "$table_mark" - ip rule add fwmark "$tun_mark" lookup "$table_mark" + ip route replace default dev "$tun_name" table "$table_mark" 2>"/dev/null" \ + || log "Error: failed to set the TUN default route (table ${table_mark})." + ip rule add fwmark "$tun_mark" lookup "$table_mark" 2>"/dev/null" \ + || log "Error: failed to add the TUN ip rule (fwmark ${tun_mark}, table ${table_mark})." - ip -6 route replace default dev "$tun_name" table "$table_mark" - ip -6 rule add fwmark "$tun_mark" lookup "$table_mark" + if [ "$ipv6_support" -eq "1" ]; then + ip -6 route replace default dev "$tun_name" table "$table_mark" 2>"/dev/null" \ + || log "Error: failed to set the TUN IPv6 default route (table ${table_mark})." + ip -6 rule add fwmark "$tun_mark" lookup "$table_mark" 2>"/dev/null" \ + || log "Error: failed to add the TUN IPv6 rule (fwmark ${tun_mark}, table ${table_mark})." + fi ;; esac - # sing-box (client) procd_open_instance "sing-box-c" procd_set_param command "$PROG" procd_append_param command run --config "$RUN_DIR/sing-box-c.json" - # QUIC-GO GSO is broken on kernel 6.6 currently - uname -r | grep -Eq "^6\.6" && procd_set_param env "QUIC_GO_DISABLE_GSO"="true" + [ "$disable_gso" -eq "1" ] && procd_set_param env "QUIC_GO_DISABLE_GSO"="true" if [ -x "/sbin/ujail" ] && [ "$routing_mode" != "custom" ] && ! grep -Eq '"type": "(wireguard|tun)"' "$RUN_DIR/sing-box-c.json"; then procd_add_jail "sing-box-c" log procfs procd_add_jail_mount "$RUN_DIR/sing-box-c.json" procd_add_jail_mount_rw "$RUN_DIR/sing-box-c.log" - procd_add_jail_mount_rw "$cache_path" - procd_add_jail_mount_rw "$HP_DIR/run/" + [ "$routing_mode" != "bypass_mainland_china" ] || procd_add_jail_mount_rw "$HP_DIR/cache.db" procd_add_jail_mount "$HP_DIR/certs/" procd_add_jail_mount "/etc/ssl/" procd_add_jail_mount "/etc/localtime" @@ -232,7 +237,6 @@ start_service() { fi if [ "$server_enabled" = "1" ]; then - # Generate/Validate server config ucode -S "$HP_DIR/scripts/generate_server.uc" 2>>"$LOG_PATH" if [ ! -e "$RUN_DIR/sing-box-s.json" ]; then @@ -243,14 +247,12 @@ start_service() { return 1 fi - # sing-box (server) procd_open_instance "sing-box-s" procd_set_param command "$PROG" procd_append_param command run --config "$RUN_DIR/sing-box-s.json" - # QUIC-GO GSO is broken on kernel 6.6 currently - uname -r | grep -Eq "^6\.6" && procd_set_param env "QUIC_GO_DISABLE_GSO"="true" + [ "$disable_gso" -eq "1" ] && procd_set_param env "QUIC_GO_DISABLE_GSO"="true" if [ -x "/sbin/ujail" ]; then procd_add_jail "sing-box-s" log procfs @@ -275,43 +277,46 @@ start_service() { procd_close_instance fi - # log-cleaner procd_open_instance "log-cleaner" procd_set_param command "$HP_DIR/scripts/clean_log.sh" procd_set_param respawn procd_close_instance case "$routing_mode" in + "bypass_mainland_china") + [ -e "$HP_DIR/cache.db" ] || touch "$HP_DIR/cache.db" \ + || log "Warning: failed to create ${HP_DIR}/cache.db." + ;; "custom") - # Prepare ruleset directory - [ -d "$HP_DIR/ruleset" ] || mkdir -p "$HP_DIR/ruleset" + [ -d "$HP_DIR/ruleset" ] || mkdir -p "$HP_DIR/ruleset" \ + || log "Warning: failed to create ${HP_DIR}/ruleset." ;; esac - [ "$outbound_node" = "nil" ] || : > "$RUN_DIR/sing-box-c.log" + [ "$outbound_node" = "nil" ] || echo > "$RUN_DIR/sing-box-c.log" if [ "$server_enabled" = "1" ]; then - : > "$RUN_DIR/sing-box-s.log" - mkdir -p "$HP_DIR/certs" + echo > "$RUN_DIR/sing-box-s.log" + mkdir -p "$HP_DIR/certs" || log "Warning: failed to create ${HP_DIR}/certs." fi - # Update permissions for ujail - chown -R sing-box:sing-box "$RUN_DIR" + chown sing-box:sing-box "$RUN_DIR"/sing-box-*.json "$RUN_DIR"/sing-box-*.log "$HP_DIR"/cache.db 2>"/dev/null" \ + || log "Warning: failed to change the ownership of the runtime files to sing-box." - # Setup firewall - ucode "$HP_DIR/scripts/firewall_pre.uc" - [ "$outbound_node" = "nil" ] || utpl -S "$HP_DIR/scripts/firewall_post.ut" > "$RUN_DIR/fw4_post.nft" - fw4 reload >"/dev/null" 2>&1 - /etc/init.d/dnsmasq restart >"/dev/null" 2>&1 + ucode "$HP_DIR/scripts/firewall_pre.uc" 2>"/dev/null" || log "Error: firewall pre-script failed." + if [ "$outbound_node" != "nil" ]; then + utpl -S "$HP_DIR/scripts/firewall_post.ut" > "$RUN_DIR/fw4_post.nft" 2>"/dev/null" || log "Error: firewall post-script failed." + fi + fw4 reload >"/dev/null" 2>&1 || log "Error: fw4 reload failed." + restore_upnp_mappings - log "sing-box $(sing-box version -n) started." + log "sing-box $(sing-box version -n 2>/dev/null || echo "unknown") started." } stop_service() { - sed -i "/#${CONF}_autosetup/d" "/etc/crontabs/root" 2>"/dev/null" - /etc/init.d/cron restart >"/dev/null" 2>&1 + sed -i "/#${CONF}_autosetup/d" "/etc/crontabs/root" 2>"/dev/null" \ + || log "Warning: failed to drop the auto-update cron entry." + /etc/init.d/cron restart >"/dev/null" 2>&1 || log "Warning: failed to restart cron." - # Setup firewall - # Load config config_load "$CONF" local table_mark tproxy_mark tun_mark tun_name config_get table_mark "infra" "table_mark" "100" @@ -319,61 +324,53 @@ stop_service() { config_get tun_mark "infra" "tun_mark" "102" config_get tun_name "infra" "tun_name" "singtun0" - # Tproxy - ip rule del fwmark "$tproxy_mark" table "$table_mark" 2>"/dev/null" + # ip rule del removes a single matching rule, so a repeated start (or an + # upgrade that starts before the old instance stopped) leaves duplicates + # behind. Delete every match instead of only the first one. + while ip rule del fwmark "$tproxy_mark" table "$table_mark" 2>"/dev/null"; do :; done ip route del local 0.0.0.0/0 dev lo table "$table_mark" 2>"/dev/null" - ip -6 rule del fwmark "$tproxy_mark" table "$table_mark" 2>"/dev/null" + while ip -6 rule del fwmark "$tproxy_mark" table "$table_mark" 2>"/dev/null"; do :; done ip -6 route del local ::/0 dev lo table "$table_mark" 2>"/dev/null" - # TUN ip route del default dev "$tun_name" table "$table_mark" 2>"/dev/null" - ip rule del fwmark "$tun_mark" table "$table_mark" 2>"/dev/null" + while ip rule del fwmark "$tun_mark" table "$table_mark" 2>"/dev/null"; do :; done ip -6 route del default dev "$tun_name" table "$table_mark" 2>"/dev/null" - ip -6 rule del fwmark "$tun_mark" table "$table_mark" 2>"/dev/null" + while ip -6 rule del fwmark "$tun_mark" table "$table_mark" 2>"/dev/null"; do :; done - # Nftables rules - for i in "homeproxy_dstnat_redir" "homeproxy_output_redir" \ - "homeproxy_redirect" "homeproxy_redirect_proxy" \ - "homeproxy_redirect_proxy_port" "homeproxy_redirect_lanac" \ - "homeproxy_mangle_prerouting" "homeproxy_mangle_output" \ - "homeproxy_mangle_tproxy" "homeproxy_mangle_tproxy_port" \ - "homeproxy_mangle_tproxy_lanac" "homeproxy_mangle_mark" \ - "homeproxy_mangle_tun" "homeproxy_mangle_tun_mark"; do - nft flush chain inet fw4 "$i" - nft delete chain inet fw4 "$i" - done 2>"/dev/null" - for i in "homeproxy_local_addr_v4" "homeproxy_local_addr_v6" \ - "homeproxy_gfw_list_v4" "homeproxy_gfw_list_v6" \ - "homeproxy_mainland_addr_v4" "homeproxy_mainland_addr_v6" \ - "homeproxy_wan_proxy_addr_v4" "homeproxy_wan_proxy_addr_v6" \ - "homeproxy_wan_direct_addr_v4" "homeproxy_wan_direct_addr_v6" \ - "homeproxy_routing_port"; do - nft flush set inet fw4 "$i" - nft delete set inet fw4 "$i" - done 2>"/dev/null" - echo 2>"/dev/null" > "$RUN_DIR/fw4_forward.nft" - echo 2>"/dev/null" > "$RUN_DIR/fw4_input.nft" - echo 2>"/dev/null" > "$RUN_DIR/fw4_post.nft" - fw4 reload >"/dev/null" 2>&1 + # Flush and delete every fw4 object homeproxy owns. Deleting one at a + # time matters: `nft -f` batches are atomic, so a single object that + # does not exist in the current proxy mode would roll back the rest. + local fw4_name + for fw4_name in $HP_FW4_CHAINS; do + nft flush chain inet fw4 "$fw4_name" 2>"/dev/null" + nft delete chain inet fw4 "$fw4_name" 2>"/dev/null" + done + for fw4_name in $HP_FW4_SETS; do + nft flush set inet fw4 "$fw4_name" 2>"/dev/null" + nft delete set inet fw4 "$fw4_name" 2>"/dev/null" + done + : > "$RUN_DIR/fw4_forward.nft" + : > "$RUN_DIR/fw4_input.nft" + : > "$RUN_DIR/fw4_post.nft" + fw4 reload >"/dev/null" 2>&1 || log "Warning: fw4 reload failed during stop." + restore_upnp_mappings - # Remove DNS hijack rm -rf "$DNSMASQ_DIR/../dnsmasq-homeproxy.conf" "$DNSMASQ_DIR" - /etc/init.d/dnsmasq restart >"/dev/null" 2>&1 + /etc/init.d/dnsmasq restart >"/dev/null" 2>&1 \ + || log "Warning: failed to restart dnsmasq after removing the homeproxy snippets." - rm -f "$RUN_DIR/sing-box-c.json" "$RUN_DIR/sing-box-s.json" - init_logs + rm -f "$RUN_DIR/sing-box-c.json" "$RUN_DIR/sing-box-c.log" \ + "$RUN_DIR/sing-box-s.json" "$RUN_DIR/sing-box-s.log" log "Service stopped." } service_stopped() { - # Load config config_load "$CONF" local tun_name config_get tun_name "infra" "tun_name" "singtun0" - # TUN ip link set "$tun_name" down 2>"/dev/null" ip tuntap del mode tun name "$tun_name" 2>"/dev/null" } @@ -381,6 +378,35 @@ service_stopped() { reload_service() { log "Reloading service..." + config_load "$CONF" + local routing_mode + config_get routing_mode "config" "routing_mode" "bypass_mainland_china" + + local outbound_node + if [ "$routing_mode" != "custom" ]; then + config_get outbound_node "config" "main_node" "nil" + else + config_get outbound_node "routing" "default_outbound" "nil" + fi + + if [ "$outbound_node" != "nil" ]; then + ucode -S "$HP_DIR/scripts/generate_client.uc" 2>>"$LOG_PATH" + if ! "$PROG" check --config "$RUN_DIR/sing-box-c.json" 2>>"$LOG_PATH"; then + log "Error: new client config is invalid, reload aborted." + return 1 + fi + fi + + local server_enabled + config_get_bool server_enabled "server" "enabled" "0" + if [ "$server_enabled" = "1" ]; then + ucode -S "$HP_DIR/scripts/generate_server.uc" 2>>"$LOG_PATH" + if ! "$PROG" check --config "$RUN_DIR/sing-box-s.json" 2>>"$LOG_PATH"; then + log "Error: new server config is invalid, reload aborted." + return 1 + fi + fi + stop start } diff --git a/luci-app-homeproxy/root/etc/uci-defaults/luci-homeproxy b/luci-app-homeproxy/root/etc/uci-defaults/luci-homeproxy old mode 100755 new mode 100644 index 8d8cbf913..fb6ebb36a --- a/luci-app-homeproxy/root/etc/uci-defaults/luci-homeproxy +++ b/luci-app-homeproxy/root/etc/uci-defaults/luci-homeproxy @@ -3,36 +3,6 @@ [ -f "/www/luci-static/resources/icons/loading.gif" ] && \ sed -i "s,/loading.svg,/loading.gif,g" "/www/luci-static/resources/view/homeproxy/status.js" -uci -q set luci.main.lang='zh_cn' -uci -q commit luci - -api_secret="$(uci -q get homeproxy.clash_api.secret)" -if [ -z "$api_secret" ] || [ "$api_secret" = "homeproxy" ]; then - api_secret="$(tr -dc 'A-Za-z0-9' < /dev/urandom 2>"/dev/null" | head -c 16)" - [ -n "$api_secret" ] || api_secret="$(awk 'BEGIN{srand(); printf "%06d", int(rand() * 1000000)}')" - uci -q set homeproxy.clash_api.secret="$api_secret" - uci -q commit homeproxy -fi - -legacy_panel_url="https://github.com/Zephyruso/zashboard/releases/latest/download/dist.zip" -legacy_panel_proxy_url="https://gh-proxy.com/https://github.com/Zephyruso/zashboard/releases/latest/download/dist.zip" -old_panel_url="https://github.com/Zephyruso/zashboard/releases/latest/download/dist-cdn-fonts.zip" -old_panel_proxy_url="https://gh-proxy.com/https://github.com/Zephyruso/zashboard/releases/latest/download/dist-cdn-fonts.zip" -default_panel_url="https://gh-proxy.com/https://github.com/Zephyruso/zashboard/releases/latest/download/dist-cdn-fonts.zip" -panel_url="$(uci -q get homeproxy.clash_api.external_ui_download_url)" -if [ -z "$panel_url" ] || [ "$panel_url" = "$legacy_panel_url" ] || [ "$panel_url" = "$legacy_panel_proxy_url" ] || [ "$panel_url" = "$old_panel_proxy_url" ]; then - uci -q set homeproxy.clash_api.external_ui_download_url="$default_panel_url" - uci -q commit homeproxy -fi - -rm -f /tmp/luci-indexcache /tmp/luci-modulecache/* 2>"/dev/null" - -mkdir -p /var/run/homeproxy -touch /var/run/homeproxy/homeproxy.log \ - /var/run/homeproxy/sing-box-c.log \ - /var/run/homeproxy/sing-box-s.log -chown -R sing-box:sing-box /var/run/homeproxy 2>"/dev/null" - uci -q batch <<-EOF >"/dev/null" delete firewall.homeproxy_pre diff --git a/luci-app-homeproxy/root/etc/uci-defaults/luci-homeproxy-migration b/luci-app-homeproxy/root/etc/uci-defaults/luci-homeproxy-migration old mode 100755 new mode 100644 diff --git a/luci-app-homeproxy/root/usr/share/rpcd/acl.d/luci-app-homeproxy.json b/luci-app-homeproxy/root/usr/share/rpcd/acl.d/luci-app-homeproxy.json index d65e15e06..b4b97ea84 100644 --- a/luci-app-homeproxy/root/usr/share/rpcd/acl.d/luci-app-homeproxy.json +++ b/luci-app-homeproxy/root/usr/share/rpcd/acl.d/luci-app-homeproxy.json @@ -9,7 +9,6 @@ "/var/run/homeproxy/sing-box-s.log": [ "read" ] }, "ubus": { - "rc": [ "*" ], "service": [ "list" ], "luci.homeproxy": [ "*" ] }, @@ -17,11 +16,7 @@ }, "write": { "file": { - "/tmp/homeproxy_certificate.tmp": [ "write" ], - "/tmp/homeproxy_panel.tmp": [ "write" ] - }, - "ubus": { - "rc": [ "*" ] + "/tmp/homeproxy_certificate.tmp": [ "write" ] }, "uci": [ "homeproxy" ] } diff --git a/luci-app-homeproxy/root/usr/share/rpcd/ucode/luci.homeproxy b/luci-app-homeproxy/root/usr/share/rpcd/ucode/luci.homeproxy index f0292ebac..fe1f0aa98 100644 --- a/luci-app-homeproxy/root/usr/share/rpcd/ucode/luci.homeproxy +++ b/luci-app-homeproxy/root/usr/share/rpcd/ucode/luci.homeproxy @@ -8,7 +8,8 @@ 'use strict'; import { access, error, lstat, popen, readfile, writefile } from 'fs'; -import { cursor } from 'uci'; + +import { isBinary, isValidPEM } from '/etc/homeproxy/scripts/homeproxy.uc'; /* Kanged from ucode/luci */ function shellquote(s) { @@ -22,72 +23,6 @@ function hasKernelModule(kmod) { const HP_DIR = '/etc/homeproxy'; const RUN_DIR = '/var/run/homeproxy'; -function getClashAPIConfig(uci) { - const external_controller = trim(uci.get('homeproxy', 'clash_api', 'external_controller') || '127.0.0.1:9090'); - const secret = trim(uci.get('homeproxy', 'clash_api', 'secret') || ''); - const matched = match(external_controller, /:(\d+)$/); - const port = matched ? matched[1] : '9090'; - - return { - base_url: `http://127.0.0.1:${port}`, - secret - }; -} - -function readProcess(fd) { - let payload = '', line; - for (line = fd.read('line'); length(line); line = fd.read('line')) - payload += line; - fd.close(); - - return payload; -} - -function clashAPIRequest(api, method, path, timeout) { - const auth = api.secret ? `--header ${shellquote(`Authorization: Bearer ${api.secret}`)} ` : ''; - const post = (method === 'POST') ? "--post-data='' " : ''; - const fd = popen(`/usr/bin/wget -qO- -T ${timeout || 10} ${auth}${post}${shellquote(api.base_url + path)} 2>"/dev/null"`); - - if (!fd) - return null; - - return readProcess(fd); -} - -function getPanelDir(uci) { - return trim(uci.get('homeproxy', 'clash_api', 'external_ui') || `${HP_DIR}/run/ui`); -} - -function hasDirectoryContent(directory) { - return (system(`[ -d ${shellquote(directory)} ] && [ -n "$(ls -A ${shellquote(directory)} 2>/dev/null)" ]`) === 0); -} - -function preparePanelBackup(panel_dir, backup_dir) { - const parent_dir = replace(panel_dir, /\/[^/]+$/, '') || '/'; - - system(`rm -rf ${shellquote(backup_dir)}`); - system(`mkdir -p ${shellquote(parent_dir)}`); - - if (hasDirectoryContent(panel_dir)) { - if (system(`mv ${shellquote(panel_dir)} ${shellquote(backup_dir)}`) !== 0) - return false; - } - - return (system(`mkdir -p ${shellquote(panel_dir)}`) === 0); -} - -function restorePanelBackup(panel_dir, backup_dir) { - if (!access(backup_dir)) - return true; - - system(`rm -rf ${shellquote(panel_dir)}`); - return (system(`mv ${shellquote(backup_dir)} ${shellquote(panel_dir)}`) === 0); -} - -function cleanupPanelBackup(backup_dir) { - system(`rm -rf ${shellquote(backup_dir)}`); -} - const methods = { acllist_read: { args: { type: 'type' }, @@ -114,6 +49,15 @@ const methods = { content = replace(content, /\r\n?/g, '\n'); if (!match(content, /\n$/)) content += '\n'; + + /* Domains only: reject lines that could break the downstream + dnsmasq/nftset injection (whitespace / shell or directive chars). */ + for (let line in split(content, /\n/)) { + if (!trim(line)) + continue; + if (match(line, /[ \t\/\\;<>="'&#|]/)) + return { result: false, error: 'invalid character in domain list' }; + } } system(`mkdir -p ${HP_DIR}/resources`); @@ -136,25 +80,13 @@ const methods = { } let filecontent = readfile(tmpcert); - if (is_binary(filecontent)) { + if (isBinary(filecontent)) { system(`rm -f ${tmpcert}`); return { result: false, error: 'illegal file type: binary' }; } - /* Kanged from luci-proto-openconnect */ - const beg = priv ? /^-----BEGIN (RSA|EC) PRIVATE KEY-----$/ : /^-----BEGIN CERTIFICATE-----$/, - end = priv ? /^-----END (RSA|EC) PRIVATE KEY-----$/ : /^-----END CERTIFICATE-----$/, - lines = split(trim(filecontent), /[\r\n]/); - let start = false, i; - - for (i = 0; i < length(lines); i++) { - if (match(lines[i], beg)) - start = true; - else if (start && !b64dec(lines[i]) && length(lines[i]) !== 64) - break; - } - - if (!start || i < length(lines) - 1 || !match(lines[i], end)) { + /* Validate the PEM structure before storing it */ + if (!isValidPEM(filecontent, priv)) { system(`rm -f ${tmpcert}`); return { result: false, error: 'this does not look like a correct PEM file' }; } @@ -197,1106 +129,14 @@ const methods = { url = 'https://www.baidu.com'; break; case 'google': - url = 'https://www.google.com/generate_204'; - break; - case 'github': - url = 'https://github.com'; - break; - case 'youtube': - url = 'https://www.youtube.com'; + url = 'https://www.google.com'; break; default: return { result: false, error: 'illegal site' }; break; } - const fd = popen(`/usr/bin/curl --connect-timeout 3 --max-time 5 -o /dev/null -I -skL -w "%{http_code}:%{time_pretransfer}" ${shellquote(url)} 2>"/dev/null"`); - if (!fd) - return { result: false }; - - const output = trim(readProcess(fd) || ''); - const parts = split(output, ':'); - const code = int(parts[0] || 0); - const parsed = match(parts[1] || '', /^([0-9]+)(\.([0-9]+))?$/); - - if (code > 0 && parsed) { - const sec = int(parsed[1]); - const frac = ((parsed[3] || '') + '00000'); - const centims = sec * 100000 + int(substr(frac, 0, 5)); - - return { - result: true, - latency: sprintf('%d.%02d', int(centims / 100), centims % 100), - type: 'curl' - }; - } - - return { result: false }; - } - }, - - current_node_get: { - call: function() { - const uci = cursor(); - uci.load('homeproxy'); - - const formatNode = (section_id, fallback_name) => { - if (!section_id || section_id in ['nil', 'same']) - return { id: section_id, label: fallback_name || section_id, type: null }; - - const section = uci.get_all('homeproxy', section_id); - if (!section || section['.type'] !== 'node') - return { id: section_id, label: fallback_name || section_id, type: null }; - - const address = trim(section.override_address || section.address || ''); - const port = trim(section.override_port || section.port || ''); - const label = trim(section.label || '') || ((address && port) ? `${address}:${port}` : section_id); - return { - id: section_id, - label, - type: section.type || null - }; - }; - - const normalizeOutboundTag = (tag) => { - if (!tag) - return null; - - tag = trim(sprintf('%s', tag)); - tag = replace(tag, /[\r\n\t]+/g, ' '); - tag = replace(tag, /[\/\\?#%]+/g, '-'); - tag = replace(tag, /\s+/g, ' '); - - return tag || null; - }; - - const sectionDisplayName = (section) => { - if (!section) - return null; - - let label = normalizeOutboundTag(section.label); - if (label) - return label; - - if (section['.type'] === 'node') { - const address = trim(section.override_address || section.address || ''); - const port = trim(section.override_port || section.port || ''); - - if (address && port) - return normalizeOutboundTag(`${address}:${port}`); - } - - return null; - }; - - const buildOutboundTagMap = () => { - const reserved_tags = { - 'GLOBAL': true, - 'main-out': true, - 'main-udp-out': true, - 'direct-out': true, - 'block-out': true - }; - let tag_map = {}, - used_tags = {}; - - const register = (section_id, display_name) => { - if (!section_id || tag_map[section_id]) - return; - - const fallback_tag = `cfg-${section_id}-out`; - const base_tag = normalizeOutboundTag(display_name) || fallback_tag; - let tag = base_tag, - suffix = 2; - - while (reserved_tags[tag] || used_tags[tag]) { - tag = `${base_tag} (${suffix})`; - suffix++; - } - - tag_map[section_id] = tag; - used_tags[tag] = true; - }; - - uci.foreach('homeproxy', 'node', (section) => { - register(section['.name'], sectionDisplayName(section)); - }); - - uci.foreach('homeproxy', 'routing_node', (section) => { - if (section.enabled === '1') - register(section['.name'], sectionDisplayName(section)); - }); - - let reverse_map = {}; - for (let section_id in tag_map) - reverse_map[tag_map[section_id]] = section_id; - - return reverse_map; - }; - - const main_node = trim(uci.get('homeproxy', 'config', 'main_node') || 'nil'); - if (main_node !== 'urltest') - return { - mode: main_node, - active: formatNode(main_node, (main_node === 'nil') ? '禁用' : null), - error: null - }; - - const payload = clashAPIRequest(getClashAPIConfig(uci), 'GET', '/proxies/main-out', 3); - if (payload === null) - return { - mode: 'urltest', - active: { id: 'urltest', label: '自动选择', type: 'urltest' }, - error: 'clash_api_unavailable' - }; - - let data = null; - try { - data = json(payload); - } catch (e) {} - - const tag = trim(data?.now || ''); - if (!tag) - return { - mode: 'urltest', - active: { id: 'urltest', label: '自动选择', type: 'urltest' }, - error: 'missing_current_proxy' - }; - - const tag_map = buildOutboundTagMap(); - const matched = match(tag, /^cfg-(.*)-out$/); - const section_id = tag_map[tag] || (matched ? matched[1] : tag); - - return { - mode: 'urltest', - active: formatNode(section_id, tag), - error: null - }; - } - }, - clash_api_update_panel: { - call: function() { - const uci = cursor(); - uci.load('homeproxy'); - const panel_dir = getPanelDir(uci); - const backup_dir = `${panel_dir}.backup`; - - if (!preparePanelBackup(panel_dir, backup_dir)) - return { result: false, error: 'panel_backup_failed' }; - - const payload = clashAPIRequest(getClashAPIConfig(uci), 'POST', '/upgrade/ui', 120); - if (payload === null) { - restorePanelBackup(panel_dir, backup_dir); - return { result: false, error: 'clash_api_unavailable' }; - } - - let data = null; - try { - data = json(payload); - } catch (e) {} - - if (data?.status === 'ok') { - cleanupPanelBackup(backup_dir); - return { result: true }; - } - - if (!restorePanelBackup(panel_dir, backup_dir)) - return { result: false, error: 'panel_restore_failed' }; - - return { - result: false, - error: data?.message || data?.error || 'update_panel_failed' - }; - } - }, - clash_api_install_panel: { - call: function() { - const uci = cursor(); - uci.load('homeproxy'); - - const tmpzip = '/tmp/homeproxy_panel.tmp'; - const filestat = lstat(tmpzip); - if (!filestat || filestat.type !== 'file' || filestat.size <= 0) { - system(`rm -f ${shellquote(tmpzip)}`); - return { result: false, error: 'empty_panel_zip' }; - } - - if (system('command -v unzip >/dev/null 2>&1') !== 0) { - system(`rm -f ${shellquote(tmpzip)}`); - return { result: false, error: 'unzip_unavailable' }; - } - - const panel_dir = getPanelDir(uci); - const backup_dir = `${panel_dir}.backup`; - const extract_dir = '/tmp/homeproxy_panel_extract'; - const stage_dir = '/tmp/homeproxy_panel_stage'; - const install_cmd = ` - set -e - rm -rf ${shellquote(extract_dir)} ${shellquote(stage_dir)} - mkdir -p ${shellquote(extract_dir)} ${shellquote(stage_dir)} - unzip -oq ${shellquote(tmpzip)} -d ${shellquote(extract_dir)} >/dev/null - src_dir=${shellquote(extract_dir)} - for depth in 1 2 3; do - [ -f "$src_dir/index.html" ] && break - first_entry="" - entry_count=0 - for entry in "$src_dir"/* "$src_dir"/.[!.]* "$src_dir"/..?*; do - [ -e "$entry" ] || continue - case "$(basename "$entry")" in - __MACOSX|.DS_Store) continue ;; - esac - entry_count=$((entry_count + 1)) - [ -n "$first_entry" ] || first_entry="$entry" - done - if [ "$entry_count" -eq 1 ] && [ -d "$first_entry" ]; then - src_dir="$first_entry" - else - break - fi - done - copied=0 - for entry in "$src_dir"/* "$src_dir"/.[!.]* "$src_dir"/..?*; do - [ -e "$entry" ] || continue - cp -a "$entry" ${shellquote(stage_dir)}/ - copied=1 - done - [ "$copied" -eq 1 ] - `; - - if (system(install_cmd) !== 0) { - system(`rm -f ${shellquote(tmpzip)}`); - system(`rm -rf ${shellquote(extract_dir)} ${shellquote(stage_dir)}`); - return { result: false, error: 'invalid_panel_zip' }; - } - - if (!preparePanelBackup(panel_dir, backup_dir)) { - system(`rm -f ${shellquote(tmpzip)}`); - system(`rm -rf ${shellquote(extract_dir)} ${shellquote(stage_dir)}`); - return { result: false, error: 'panel_backup_failed' }; - } - - const replace_cmd = ` - set -e - rm -rf ${shellquote(panel_dir)} - mkdir -p ${shellquote(panel_dir)} - cp -a ${shellquote(stage_dir)}/. ${shellquote(panel_dir)}/ - chown -R sing-box:sing-box ${shellquote(panel_dir)} 2>/dev/null || true - `; - - let result = { result: true }; - if (system(replace_cmd) !== 0) { - if (!restorePanelBackup(panel_dir, backup_dir)) - result = { result: false, error: 'panel_restore_failed' }; - else - result = { result: false, error: 'panel_install_failed' }; - } else { - cleanupPanelBackup(backup_dir); - } - - system(`rm -f ${shellquote(tmpzip)}`); - system(`rm -rf ${shellquote(extract_dir)} ${shellquote(stage_dir)}`); - return result; - } - }, - - node_latency_test: { - args: { node: 'node', mode: 'mode' }, - call: function(req) { - const error_codes = { - invalid_node: 'invalid_node', - invalid_mode: 'invalid_mode', - mode_mismatch: 'mode_mismatch', - rp_invalid_outbound: 'rp_invalid_outbound', - rp_runtime_prepare_failed: 'rp_runtime_prepare_failed', - rp_runtime_launch_failed: 'rp_runtime_launch_failed', - rp_runtime_timeout: 'rp_runtime_timeout', - rp_delay_timeout: 'rp_delay_timeout', - rp_delay_failed: 'rp_delay_failed', - icmp_probe_unavailable: 'icmp_probe_unavailable', - icmp_timeout: 'icmp_timeout', - icmp_failed: 'icmp_failed', - probe_timeout: 'probe_timeout', - backend_execution_failed: 'backend_execution_failed', - probe_failed: 'probe_failed' - }; - const probe_timeout_s = 3; - const probe_timeout_ms = probe_timeout_s * 1000; - const probe_system_timeout_ms = probe_timeout_ms + 250; - const rp_probe_url = 'https://cp.cloudflare.com/generate_204'; - const rp_probe_url_encoded = 'https%3A%2F%2Fcp.cloudflare.com%2Fgenerate_204'; - const rp_delay_timeout_ms = 5000; - - const formatResult = (node, state, latency_ms, err, extras) => ({ - node, - state, - latency_ms, - measured_at: time(), - error: err, - icmp_latency_ms: (extras && extras.icmp_latency_ms != null) ? extras.icmp_latency_ms : null, - icmp_error: (extras && extras.icmp_error) ? extras.icmp_error : null, - rp_runtime: (extras && extras.rp_runtime) ? extras.rp_runtime : null - }); - - const strToBool = (str) => ((str === '1') || null); - const strToInt = (str) => (str != null && trim(sprintf('%s', str)) !== '') ? (int(str) || null) : null; - const strToTime = (str) => (str != null && trim(sprintf('%s', str)) !== '') ? (str + 's') : null; - - function removeBlankAttrs(res) { - let content; - - if (type(res) === 'object') { - content = {}; - map(keys(res), (k) => { - if (type(res[k]) in ['array', 'object']) - content[k] = removeBlankAttrs(res[k]); - else if (res[k] !== null && res[k] !== '') - content[k] = res[k]; - }); - } else if (type(res) === 'array') { - content = []; - map(res, (k) => { - if (type(k) in ['array', 'object']) - push(content, removeBlankAttrs(k)); - else if (k !== null && k !== '') - push(content, k); - }); - } else - return res; - - return content; - } - - const parse_port = (strport) => { - if (type(strport) !== 'array' || length(strport) === 0) - return null; - - let ports = []; - for (let i = 0; i < length(strport); i++) - push(ports, int(strport[i])); - - return ports; - }; - - const generate_endpoint = (node_cfg) => { - if (type(node_cfg) !== 'object' || length(node_cfg) === 0) - return null; - - return { - type: node_cfg.type, - tag: 'cfg-' + node_cfg['.name'] + '-out', - address: node_cfg.wireguard_local_address, - mtu: strToInt(node_cfg.wireguard_mtu), - private_key: node_cfg.wireguard_private_key, - peers: (node_cfg.type === 'wireguard') ? [ - { - address: node_cfg.address, - port: strToInt(node_cfg.port), - allowed_ips: [ - '0.0.0.0/0', - '::/0' - ], - persistent_keepalive_interval: strToInt(node_cfg.wireguard_persistent_keepalive_interval), - public_key: node_cfg.wireguard_peer_public_key, - pre_shared_key: node_cfg.wireguard_pre_shared_key, - reserved: parse_port(node_cfg.wireguard_reserved) - } - ] : null, - system: (node_cfg.type === 'wireguard') ? false : null, - tcp_fast_open: strToBool(node_cfg.tcp_fast_open), - tcp_multi_path: strToBool(node_cfg.tcp_multi_path), - udp_fragment: strToBool(node_cfg.udp_fragment) - }; - }; - - const generate_outbound = (node_cfg) => { - if (type(node_cfg) !== 'object' || length(node_cfg) === 0) - return null; - - return { - type: node_cfg.type, - tag: 'cfg-' + node_cfg['.name'] + '-out', - - server: (node_cfg.type !== 'direct') ? node_cfg.address : null, - server_port: (node_cfg.type !== 'direct') ? strToInt(node_cfg.port) : null, - server_ports: node_cfg.hysteria_hopping_port, - - username: (node_cfg.type !== 'ssh') ? node_cfg.username : null, - user: (node_cfg.type === 'ssh') ? node_cfg.username : null, - password: node_cfg.password, - - idle_session_check_interval: strToTime(node_cfg.anytls_idle_session_check_interval), - idle_session_timeout: strToTime(node_cfg.anytls_idle_session_timeout), - min_idle_session: strToInt(node_cfg.anytls_min_idle_session), - hop_interval: strToTime(node_cfg.hysteria_hop_interval), - up_mbps: strToInt(node_cfg.hysteria_up_mbps), - down_mbps: strToInt(node_cfg.hysteria_down_mbps), - obfs: node_cfg.hysteria_obfs_type ? { - type: node_cfg.hysteria_obfs_type, - password: node_cfg.hysteria_obfs_password - } : node_cfg.hysteria_obfs_password, - auth: (node_cfg.hysteria_auth_type === 'base64') ? node_cfg.hysteria_auth_payload : null, - auth_str: (node_cfg.hysteria_auth_type === 'string') ? node_cfg.hysteria_auth_payload : null, - recv_window_conn: strToInt(node_cfg.hysteria_recv_window_conn), - recv_window: strToInt(node_cfg.hysteria_revc_window), - disable_mtu_discovery: strToBool(node_cfg.hysteria_disable_mtu_discovery), - method: node_cfg.shadowsocks_encrypt_method, - plugin: node_cfg.shadowsocks_plugin, - plugin_opts: node_cfg.shadowsocks_plugin_opts, - version: (node_cfg.type === 'shadowtls') ? strToInt(node_cfg.shadowtls_version) : ((node_cfg.type === 'socks') ? node_cfg.socks_version : null), - client_version: node_cfg.ssh_client_version, - host_key: node_cfg.ssh_host_key, - host_key_algorithms: node_cfg.ssh_host_key_algo, - private_key: node_cfg.ssh_priv_key, - private_key_passphrase: node_cfg.ssh_priv_key_pp, - uuid: node_cfg.uuid, - congestion_control: node_cfg.tuic_congestion_control, - udp_relay_mode: node_cfg.tuic_udp_relay_mode, - udp_over_stream: strToBool(node_cfg.tuic_udp_over_stream), - zero_rtt_handshake: strToBool(node_cfg.tuic_enable_zero_rtt), - heartbeat: strToTime(node_cfg.tuic_heartbeat), - flow: node_cfg.vless_flow, - alter_id: strToInt(node_cfg.vmess_alterid), - security: node_cfg.vmess_encrypt, - global_padding: strToBool(node_cfg.vmess_global_padding), - authenticated_length: strToBool(node_cfg.vmess_authenticated_length), - packet_encoding: node_cfg.packet_encoding, - - multiplex: (node_cfg.multiplex === '1') ? { - enabled: true, - protocol: node_cfg.multiplex_protocol, - max_connections: strToInt(node_cfg.multiplex_max_connections), - min_streams: strToInt(node_cfg.multiplex_min_streams), - max_streams: strToInt(node_cfg.multiplex_max_streams), - padding: strToBool(node_cfg.multiplex_padding), - brutal: (node_cfg.multiplex_brutal === '1') ? { - enabled: true, - up_mbps: strToInt(node_cfg.multiplex_brutal_up), - down_mbps: strToInt(node_cfg.multiplex_brutal_down) - } : null - } : null, - tls: (node_cfg.tls === '1') ? { - enabled: true, - server_name: node_cfg.tls_sni, - insecure: strToBool(node_cfg.tls_insecure), - alpn: node_cfg.tls_alpn, - min_version: node_cfg.tls_min_version, - max_version: node_cfg.tls_max_version, - cipher_suites: node_cfg.tls_cipher_suites, - certificate_path: node_cfg.tls_cert_path, - ech: (node_cfg.tls_ech === '1') ? { - enabled: true, - config: node_cfg.tls_ech_config, - config_path: node_cfg.tls_ech_config_path - } : null, - utls: node_cfg.tls_utls ? { - enabled: true, - fingerprint: node_cfg.tls_utls - } : null, - reality: (node_cfg.tls_reality === '1') ? { - enabled: true, - public_key: node_cfg.tls_reality_public_key, - short_id: node_cfg.tls_reality_short_id - } : null - } : null, - transport: node_cfg.transport ? { - type: node_cfg.transport, - host: node_cfg.http_host || node_cfg.httpupgrade_host, - path: node_cfg.http_path || node_cfg.ws_path, - headers: node_cfg.ws_host ? { - Host: node_cfg.ws_host - } : null, - method: node_cfg.http_method, - max_early_data: strToInt(node_cfg.websocket_early_data), - early_data_header_name: node_cfg.websocket_early_data_header, - service_name: node_cfg.grpc_servicename, - idle_timeout: node_cfg.http_idle_timeout, - ping_timeout: node_cfg.http_ping_timeout, - permit_without_stream: strToBool(node_cfg.grpc_permit_without_stream) - } : null, - udp_over_tcp: (node_cfg.udp_over_tcp === '1') ? { - enabled: true, - version: strToInt(node_cfg.udp_over_tcp_version) - } : null, - tcp_fast_open: strToBool(node_cfg.tcp_fast_open), - tcp_multi_path: strToBool(node_cfg.tcp_multi_path), - udp_fragment: strToBool(node_cfg.udp_fragment) - }; - }; - - const isControllerPortBusy = (port) => { - const hex_port = sprintf('%04X', int(port)); - const tcp_v4 = readfile('/proc/net/tcp') || ''; - const tcp_v6 = readfile('/proc/net/tcp6') || ''; - - for (let line in split(tcp_v4 + '\n' + tcp_v6, /\n/)) { - const fields = split(trim(line), /\s+/); - if (length(fields) < 4) - continue; - - const local_addr = split(fields[1], ':'); - const state = fields[3]; - if (length(local_addr) !== 2) - continue; - - if (local_addr[1] === hex_port && state === '0A') - return true; - } - - return false; - }; - - const pickControllerPort = (seed) => { - const min_port = 19090; - const span = 100; - let hash_seed = 0; - - for (let i = 0; i < length(seed); i++) - hash_seed += ord(seed, i); - - const start = hash_seed % span; - for (let i = 0; i < span; i++) { - const candidate = min_port + ((start + i) % span); - if (candidate === 9090) - continue; - if (!isControllerPortBusy(candidate)) - return candidate; - } - - return null; - }; - - const listRuntimePidsByConfig = (config_path) => { - if (!config_path) - return []; - - const scan_cmd = sprintf( - '/bin/sh -c %s -- %s', - shellquote('cfg="$1"; for proc in /proc/[0-9]*; do [ -d "$proc" ] || continue; pid="${proc#/proc/}"; [ -r "$proc/cmdline" ] || continue; found_cfg=0; has_sig=0; p1=""; p2=""; set -f; for arg in $(tr "\\000" "\\n" <"$proc/cmdline" 2>/dev/null); do [ "$arg" = "$cfg" ] && found_cfg=1; [ "${p2##*/}" = "sing-box" ] && [ "$p1" = "run" ] && [ "$arg" = "--config" ] && has_sig=1; p2="$p1"; p1="$arg"; done; set +f; [ "$has_sig" -eq 1 ] && [ "$found_cfg" -eq 1 ] && printf "%s\\n" "$pid"; done'), - shellquote(config_path) - ); - - const fd = popen(scan_cmd); - if (!fd) - return []; - - let pids = []; - let line; - for (line = fd.read('line'); line !== null && line !== ''; line = fd.read('line')) { - const pid = trim(line); - if (match(pid, /^[0-9]+$/) && index(pids, pid) === -1) - push(pids, pid); - } - fd.close(); - - return pids; - }; - - const isRuntimeProcess = (pid, config_path) => { - if (!pid || !match(pid, /^[0-9]+$/) || !config_path) - return false; - - if (system(`/bin/kill -0 ${shellquote(pid)} >/dev/null 2>&1`) !== 0) - return false; - - return (index(listRuntimePidsByConfig(config_path), pid) !== -1); - }; - - const findRuntimePidByConfig = (config_path) => { - const pids = listRuntimePidsByConfig(config_path); - for (let i = 0; i < length(pids); i++) { - const pid = pids[i]; - if (system(`/bin/kill -0 ${shellquote(pid)} >/dev/null 2>&1`) === 0) - return pid; - } - - return null; - }; - - const resolveRuntimePid = (runtime_meta) => { - if (!runtime_meta?.config_path) - return null; - - const pid_file = trim(readfile(runtime_meta.pid_path) || ''); - if (isRuntimeProcess(pid_file, runtime_meta.config_path)) - return pid_file; - - const discovered = findRuntimePidByConfig(runtime_meta.config_path); - if (discovered) - writefile(runtime_meta.pid_path, discovered + '\n'); - - return discovered; - }; - - const cleanupProbeRuntime = (runtime_meta) => { - if (!runtime_meta) - return; - - const terminateRuntimePid = (pid) => { - if (!pid) - return; - - system(`/bin/kill ${shellquote(pid)} >/dev/null 2>&1`); - system('/bin/sleep 1'); - if (system(`/bin/kill -0 ${shellquote(pid)} >/dev/null 2>&1`) === 0) - system(`/bin/kill -9 ${shellquote(pid)} >/dev/null 2>&1`); - }; - - let pid = resolveRuntimePid(runtime_meta); - while (pid) { - terminateRuntimePid(pid); - system(`/bin/rm -f ${shellquote(runtime_meta.pid_path)}`); - pid = findRuntimePidByConfig(runtime_meta.config_path); - } - - system(`/bin/rm -rf ${shellquote(runtime_meta.session_dir)}`); - }; - - const waitControllerReady = (runtime_meta, timeout_ms) => { - try { - let retries = int((timeout_ms + 999) / 1000); - if (!retries || retries < 1) - retries = 1; - - for (let i = 0; i < retries; i++) { - resolveRuntimePid(runtime_meta); - - const probe_fd = popen(`/usr/bin/wget -qO- ${shellquote(runtime_meta.controller_url + '/version')} 2>"/dev/null"`); - if (probe_fd) { - let payload = '', line; - while (true) { - line = probe_fd.read('line'); - if (line === null || line === '') - break; - payload += line; - } - probe_fd.close(); - if (trim(payload)) - return true; - } - - if (i + 1 < retries) - system('/bin/sleep 1'); - } - - return false; - } catch (e) { - return false; - } - }; - - const buildProbeRuntime = (node_name, node_cfg) => { - const runtime_root = RUN_DIR + '/latency-test'; - const session_id = sprintf('%s-%d-%d', node_name, time(), int(readfile('/proc/uptime') || '0')); - const session_dir = `${runtime_root}/${session_id}`; - const config_path = `${session_dir}/sing-box.json`; - const log_path = `${session_dir}/sing-box.log`; - const cache_path = `${session_dir}/cache.db`; - const pid_path = `${session_dir}/sing-box.pid`; - - const controller_port = pickControllerPort(node_name || 'real-proxy'); - if (!controller_port) - return { error: 'no available temporary controller port' }; - - const selected_tag = 'probe-out'; - const config = { - log: { - disabled: false, - level: 'warn', - output: log_path, - timestamp: true - }, - outbounds: [ - { - type: 'direct', - tag: 'direct-out' - }, - { - type: 'block', - tag: 'block-out' - } - ], - endpoints: [], - route: { - final: selected_tag, - auto_detect_interface: true - }, - experimental: { - clash_api: { - external_controller: `127.0.0.1:${controller_port}` - }, - cache_file: { - enabled: true, - path: cache_path - } - } - }; - - const rendered_outbound = (node_cfg.type === 'wireguard') ? generate_endpoint(node_cfg) : generate_outbound(node_cfg); - if (rendered_outbound && type(rendered_outbound) === 'object') - rendered_outbound.tag = selected_tag; - - if (!rendered_outbound || type(rendered_outbound) !== 'object' || rendered_outbound.tag !== selected_tag || !rendered_outbound.type) - return { - error: 'failed to render temporary outbound for selected node', - code: error_codes.rp_invalid_outbound - }; - - if (node_cfg.type === 'wireguard') - push(config.endpoints, rendered_outbound); - else - push(config.outbounds, rendered_outbound); - - if (system(`/bin/mkdir -p ${shellquote(session_dir)}`) !== 0) - return { error: 'failed to prepare temporary runtime directory' }; - - if (!writefile(config_path, sprintf('%.J\n', removeBlankAttrs(config)))) { - system(`/bin/rm -rf ${shellquote(session_dir)}`); - return { error: 'failed to write temporary sing-box config' }; - } - - return { - runtime_root, - session_dir, - config_path, - log_path, - cache_path, - pid_path, - controller_port, - controller_url: `http://127.0.0.1:${controller_port}` - }; - }; - - const launchProbeRuntime = (runtime_meta) => { - if (!runtime_meta) - return false; - - const launch_cmd = sprintf( - '/usr/bin/sing-box run --config %s >/dev/null 2>&1 & pid=$!; [ -n "$pid" ] && printf "%%s\\n" "$pid" > %s', - shellquote(runtime_meta.config_path), - shellquote(runtime_meta.pid_path) - ); - - if (system(`/bin/sh -c ${shellquote(launch_cmd)}`) !== 0) - return false; - - for (let i = 0; i < 5; i++) { - const pid = resolveRuntimePid(runtime_meta); - if (pid) - return true; - - system('/bin/sleep 1'); - } - - return false; - }; - - const monotonicMs = () => { - const uptime = trim(readfile('/proc/uptime') || ''); - const parsed = match(uptime, /^([0-9]+)(\.([0-9]+))?/); - - if (!parsed) - return null; - - const sec = int(parsed[1]); - const frac = ((parsed[3] || '') + '000'); - const msec = int(substr(frac, 0, 3)); - - return sec * 1000 + msec; - }; - - const probeRealProxyDelay = (runtime_meta, node_name) => { - const selected_tag = 'probe-out'; - const delay_endpoint = sprintf( - '%s/proxies/%s/delay?url=%s&timeout=%d', - runtime_meta.controller_url, - selected_tag, - rp_probe_url_encoded, - rp_delay_timeout_ms - ); - - const started_ms = monotonicMs(); - const fd = popen(sprintf( - '/usr/bin/wget -qO- -T %d %s 2>"/dev/null"', - int((rp_delay_timeout_ms + 999) / 1000), - shellquote(delay_endpoint) - )); - if (!fd) - return { - state: 'timeout', - error: { - code: error_codes.rp_delay_timeout, - message: 'failed to open temporary Clash API delay endpoint' - } - }; - - let payload = '', line; - while (true) { - line = fd.read('line'); - if (line === null || line === '') - break; - payload += line; - } - fd.close(); - - const ended_ms = monotonicMs(); - if (!trim(payload || '')) { - if (started_ms !== null && ended_ms !== null && ended_ms - started_ms >= rp_delay_timeout_ms) - return { - state: 'timeout', - error: { - code: error_codes.rp_delay_timeout, - message: sprintf('temporary Clash API delay request timed out after %dms', rp_delay_timeout_ms) - } - }; - - return { - state: 'error', - error: { - code: error_codes.rp_delay_failed, - message: 'temporary Clash API delay response is empty' - } - }; - } - - let data = null; - try { - data = json(payload); - } catch (e) { - return { - state: 'error', - error: { - code: error_codes.rp_delay_failed, - message: 'temporary Clash API delay response is not valid JSON' - } - }; - } - - const delay_ms = int(data?.delay || '0'); - if (delay_ms > 0) - return { - state: 'success', - latency_ms: delay_ms - }; - - const failure_msg = trim(sprintf('%s', data?.message || data?.error || '')) || 'temporary Clash API delay request failed'; - if (match(failure_msg, /timeout/i) || (started_ms !== null && ended_ms !== null && ended_ms - started_ms >= rp_delay_timeout_ms)) - return { - state: 'timeout', - error: { - code: error_codes.rp_delay_timeout, - message: failure_msg - } - }; - - return { - state: 'error', - error: { - code: error_codes.rp_delay_failed, - message: failure_msg - } - }; - }; - - const normalizeLatencyMode = (m) => (m === 'tcp') ? 'icmp' : m; - const node = trim(req.args?.node || '') || null; - const requested_mode = trim(req.args?.mode || ''); - const mode = normalizeLatencyMode(requested_mode); - const allowed_modes = ['icmp', 'rp']; - const allowed_configured_modes = ['icmp', 'tcp', 'rp']; - if (!node) - return formatResult(null, 'error', null, { - code: error_codes.invalid_node, - message: 'missing node section id' - }); - - if (index(allowed_modes, mode) === -1) - return formatResult(node, 'error', null, { - code: error_codes.invalid_mode, - message: sprintf('invalid latency test mode: %s', mode || '(empty)') - }); - - const uci = cursor(); - uci.load('homeproxy'); - - const configured_mode_raw = trim(uci.get('homeproxy', 'subscription', 'latency_test_mode') || ''); - const configured_mode = normalizeLatencyMode(configured_mode_raw); - if (configured_mode_raw && index(allowed_configured_modes, configured_mode_raw) === -1) - return formatResult(node, 'error', null, { - code: error_codes.invalid_mode, - message: sprintf('configured latency test mode is invalid: %s', configured_mode_raw || '(empty)') - }); - - if (configured_mode && configured_mode !== mode) - return formatResult(node, 'error', null, { - code: error_codes.mode_mismatch, - message: sprintf('request mode %s does not match configured mode %s', mode, configured_mode) - }); - - const section = uci.get_all('homeproxy', node); - if (!section || section['.type'] !== 'node') - return formatResult(node, 'error', null, { - code: error_codes.invalid_node, - message: 'node section does not exist or is not a node section' - }); - - const address = trim(section.address || ''); - const port = int(section.port || '0'); - if (!address || port <= 0 || port > 65535) - return formatResult(node, 'error', null, { - code: error_codes.invalid_node, - message: 'node address or port is invalid' - }); - - if (mode === 'rp') { - let runtime_meta = null; - let runtime_active = false; - let runtime_info = { - runtime_root: RUN_DIR + '/latency-test', - session_dir: null, - config_path: null, - pid_path: null, - controller: null, - launched: false, - controller_ready: false, - cleaned_up: false - }; - - runtime_meta = buildProbeRuntime(node, section); - if (runtime_meta?.error) - runtime_info.cleaned_up = true; - - if (runtime_meta?.error) - return formatResult(node, 'error', null, { - code: runtime_meta.code || error_codes.rp_runtime_prepare_failed, - message: runtime_meta.error - }, { - rp_runtime: runtime_info - }); - - runtime_info.session_dir = runtime_meta.session_dir; - runtime_info.config_path = runtime_meta.config_path; - runtime_info.pid_path = runtime_meta.pid_path; - runtime_info.controller = `127.0.0.1:${runtime_meta.controller_port}`; - runtime_active = true; - - const finalizeRealProxyResult = (state, latency_ms, err) => { - if (runtime_active && runtime_meta) { - cleanupProbeRuntime(runtime_meta); - runtime_active = false; - runtime_info.cleaned_up = true; - } - - return formatResult(node, state, latency_ms, err, { - rp_runtime: runtime_info - }); - }; - - try { - if (!launchProbeRuntime(runtime_meta)) - return finalizeRealProxyResult('error', null, { - code: error_codes.rp_runtime_launch_failed, - message: 'failed to launch temporary sing-box runtime' - }); - - runtime_info.launched = true; - - if (!waitControllerReady(runtime_meta, rp_delay_timeout_ms)) - return finalizeRealProxyResult('timeout', null, { - code: error_codes.rp_runtime_timeout, - message: 'temporary sing-box runtime controller did not become ready in time' - }); - - runtime_info.controller_ready = true; - const delay_result = probeRealProxyDelay(runtime_meta, node); - if (delay_result.state === 'success' && delay_result.latency_ms > 0) - return finalizeRealProxyResult('success', delay_result.latency_ms, null); - - if (delay_result.state === 'timeout') - return finalizeRealProxyResult('timeout', null, delay_result.error || { - code: error_codes.rp_delay_timeout, - message: sprintf('temporary Clash API delay request timed out after %dms', rp_delay_timeout_ms) - }); - - return finalizeRealProxyResult('error', null, delay_result.error || { - code: error_codes.rp_delay_failed, - message: sprintf('temporary Clash API delay probe failed for %s', rp_probe_url) - }); - } catch (e) { - return finalizeRealProxyResult('error', null, { - code: error_codes.backend_execution_failed, - message: 'unexpected backend error while handling temporary rp runtime' - }); - } - } - - const ping = access('/bin/ping') ? '/bin/ping' : (access('/usr/bin/ping') ? '/usr/bin/ping' : null); - - const runProbe = (command, timeout_ms) => { - const started_ms = monotonicMs(); - const probe_exit = system(command, timeout_ms); - const ended_ms = monotonicMs(); - let latency_ms = null; - if (started_ms !== null && ended_ms !== null && ended_ms >= started_ms) - latency_ms = ended_ms - started_ms; - return { probe_exit, latency_ms }; - }; - - let icmp_latency_ms = null; - let icmp_error = null; - - if (!ping) { - icmp_error = { - code: error_codes.icmp_probe_unavailable, - message: 'missing ping executable for ICMP probe' - }; - } - else { - const result = runProbe( - `${ping} -c 1 -W ${probe_timeout_s} ${shellquote(address)} >/dev/null 2>/dev/null`, - probe_system_timeout_ms - ); - - if (result.probe_exit === 0) - icmp_latency_ms = (result.latency_ms !== null) ? result.latency_ms : 0; - else if (result.probe_exit === -1 || (result.latency_ms !== null && result.latency_ms >= probe_timeout_ms)) - icmp_error = { - code: error_codes.icmp_timeout, - message: `ICMP ping timeout after ${probe_timeout_s}s` - }; - else if (result.probe_exit === 127) - icmp_error = { - code: error_codes.backend_execution_failed, - message: 'ICMP ping command execution failed' - }; - else - icmp_error = { - code: error_codes.icmp_failed, - message: `ICMP ping failed with exit code ${result.probe_exit}` - }; - } - - if (icmp_latency_ms !== null) - return formatResult(node, 'success', icmp_latency_ms, null, { - icmp_latency_ms, - icmp_error - }); - - if (icmp_error?.code === error_codes.icmp_timeout) - return formatResult(node, 'timeout', null, { - code: error_codes.probe_timeout, - message: `ICMP probe timed out after ${probe_timeout_s}s` - }, { - icmp_latency_ms, - icmp_error - }); - - return formatResult(node, 'error', null, icmp_error || { - code: error_codes.probe_failed, - message: 'ICMP probe failed' - }, { - icmp_latency_ms, - icmp_error - }); + return { result: (system(`/usr/bin/wget --spider -qT3 ${url} 2>"/dev/null"`, 3100) === 0) }; } }, @@ -1309,10 +149,6 @@ const methods = { const filestat = lstat(`${RUN_DIR}/${req.args?.type}.log`); if (filestat) writefile(`${RUN_DIR}/${req.args?.type}.log`, ''); - else { - system(`mkdir -p ${RUN_DIR}`); - writefile(`${RUN_DIR}/${req.args?.type}.log`, ''); - } return { result: true }; } }, @@ -1394,70 +230,24 @@ const methods = { } }, - package_get_version: { - call: function() { - let version = trim(readfile('/usr/share/homeproxy/version') || ''); - - if (!version) { - const status = readfile('/usr/lib/opkg/status'); - let in_package = false; - - if (status) { - const lines = split(status, '\n'); - for (let i = 0; i < length(lines); i++) { - let line = lines[i]; - line = trim(line); - - if (!line) { - in_package = false; - continue; - } - - if (line == 'Package: luci-app-homeproxy') { - in_package = true; - continue; - } - - if (in_package) { - let matched = match(line, /^Version: (.*)/); - if (matched) { - version = matched[1]; - break; - } - } - } - } - } - - if (!version) { - const fd = popen('/usr/bin/opkg status luci-app-homeproxy 2>/dev/null'); - if (fd) { - for (let line = fd.read('line'); length(line); line = fd.read('line')) { - let matched = match(trim(line), /^Version: (.*)/); - if (matched) { - version = matched[1]; - break; - } - } - - fd.close(); - } - } - - return { version: version || '-' }; - } - }, - resources_get_version: { args: { type: 'type' }, call: function(req) { - const version = trim(readfile(`${HP_DIR}/resources/${req.args?.type}.ver`)); + /* whitelist resource types to prevent path traversal */ + if (index(['china_ip4', 'china_ip6', 'gfw_list', 'china_list'], req.args?.type) === -1) + return { error: 'illegal type', version: null }; + let version = trim(readfile(`${HP_DIR}/resources/${req.args?.type}.ver`)); + const fields = version ? match(version, /^(\S+) (\S+)$/) : null; + if (fields) + version = fields[1]; return { version: version, error: error() }; } }, resources_update: { args: { type: 'type' }, call: function(req) { + if (index(['china_ip4', 'china_ip6', 'gfw_list', 'china_list'], req.args?.type) === -1) + return { status: 255, error: 'illegal type' }; if (req.args?.type) { const type = shellquote(req.args?.type); const exit_code = system(`${HP_DIR}/scripts/update_resources.sh ${type}`); diff --git a/luci-app-homeproxy/tests/README.md b/luci-app-homeproxy/tests/README.md new file mode 100644 index 000000000..8283c9b83 --- /dev/null +++ b/luci-app-homeproxy/tests/README.md @@ -0,0 +1,60 @@ +# luci-app-homeproxy tests + +Automated checks for the pieces that `sing-box check` cannot validate: the +share-link parsers, the UCI→JSON generators and the LuCI form definitions. + +## Running + +```sh +tests/run.sh +``` + +* The **LuCI form snapshots** run locally and only need `node`. They re-render + the node/server views through a mock LuCI runtime and diff the result against + `tests/snapshots/*.json`. +* The **ucode tests** need `ucode`; the generator cases additionally run + `sing-box check`, so they need sing-box ≥ 1.14 as well (available on an + OpenWrt/ImmortalWrt target). When the host running `tests/run.sh` has neither, + the checkout is copied over ssh to `$HP_TEST_HOST` (default + `root@192.168.1.1`) and the tests run there: + + ```sh + HP_TEST_HOST=root@192.168.1.1 tests/run.sh + HP_TEST_DIR=/tmp/hp-tests tests/run.sh + ``` + +`tests/run.sh` exits non-zero if anything fails. The ucode part can also be run +on its own on a target: + +```sh +sh tests/ucode/run.sh "$PWD" +``` + +## What is covered + +| Path | Checks | +| --- | --- | +| `tests/i18n-coverage.py` | Reports how many `po/templates/homeproxy.pot` strings have a non-fuzzy, non-empty `po/zh_Hans/homeproxy.po` translation. Technical tokens that stay as-is are listed in `tests/i18n-ignore.txt`; anything else missing produces a warning annotation (`--warn-below 100` by default) and a job-summary entry. Run by `.github/workflows/i18n.yml` on push/PR and before a release. | +| `tests/luci-form-snapshot.js` | Dumps every option (name, kind, title, description, depends, values, datatype/default/…) of the node and server views. Diffs against `tests/snapshots/{node,server}.json`, so a refactor that changes a field or its visibility fails. | +| `tests/ucode/test_homeproxy_utils.uc` | `executeCommand()` return shape, stderr/exit-code capture, binary detection, and a descriptor-leak check (200 calls). | +| `tests/ucode/test_homeproxy_utils_inject.uc` | The failure path of `executeCommand()`: the script stages a copy of `homeproxy.uc` whose `system()` call is replaced by `die()`, then checks that the exception still propagates and that neither descriptor leaks. | +| `tests/ucode/test_fw4_names.sh` | Keeps the fw4 chain/set inventory in `scripts/fw4_names.sh` (used by `init.d/homeproxy` to clean up on stop) in sync with the objects declared in `scripts/firewall_post.ut`. | +| `tests/ucode/test_parse_uri.uc` | Per-scheme assertions on the `parse_uri()` result: anytls, http/https, hysteria, hysteria2/hy2, snell, socks(4/4a/5/5h), shadowsocks (SIP002 base64 + plain + plugin, Shadowrocket), trojan (ws/grpc), tuic, vless (reality/ws/http/httpupgrade), vmess (ws/h2/httpupgrade/grpc) and SIP008 objects, plus the rejection paths (unsupported kcp/quic, no QUIC support, invalid port, unknown scheme). | +| `tests/ucode/test_generators.sh` | Runs `generate_client.uc`/`generate_server.uc` against the UCI fixtures in `tests/fixtures/generators/` inside a scratch directory (the `uci` cursor and `HP_DIR`/`RUN_DIR` are redirected) and validates each result with `sing-box check`. | + +`tests/ucode/mocks/homeproxy.uc` is a test double for the real module: only +`validation()` is stubbed (the real one runs `/sbin/validate_data`, which does +not exist outside OpenWrt), everything else is a copy of the production code. + +## Adding cases + +* New share link → add an `expect_fields(...)` case to `test_parse_uri.uc`. +* New protocol option that reaches the generator → extend the fixtures in + `tests/fixtures/generators/`, keeping values schema-valid so `sing-box check` + still passes. +* Intentional LuCI form change → regenerate the snapshots: + + ```sh + node tests/luci-form-snapshot.js . node > tests/snapshots/node.json + node tests/luci-form-snapshot.js . server > tests/snapshots/server.json + ``` diff --git a/luci-app-homeproxy/tests/fixtures/generators/client.uci b/luci-app-homeproxy/tests/fixtures/generators/client.uci new file mode 100644 index 000000000..eeaf7c03f --- /dev/null +++ b/luci-app-homeproxy/tests/fixtures/generators/client.uci @@ -0,0 +1,170 @@ +# SPDX-License-Identifier: GPL-2.0-only +# +# Regression fixture for generate_client.uc: a node of every supported +# protocol reachable through a single urltest main node, so one run exercises +# all outbound builders (TLS, transport, reality, mux, obfuscation). + +config homeproxy 'config' + option routing_mode 'bypass_mainland_china' + option proxy_mode 'tun' + option ipv6_support '0' + option log_level 'error' + option main_node 'urltest' + option main_udp_node 'nil' + option dns_server 'https://cloudflare-dns.com/dns-query' + list main_urltest_nodes 'n_anytls' + list main_urltest_nodes 'n_vless_reality_ws' + list main_urltest_nodes 'n_vmess_http' + list main_urltest_nodes 'n_trojan_grpc' + list main_urltest_nodes 'n_ss' + list main_urltest_nodes 'n_hy2' + list main_urltest_nodes 'n_snell' + list main_urltest_nodes 'n_http' + list main_urltest_nodes 'n_socks' + list main_urltest_nodes 'n_shadowtls' + +config homeproxy 'infra' + option mixed_port '5330' + option dns_port '5333' + option tun_name 'singtun0' + option tun_addr4 '172.19.0.1/30' + option tun_addr6 'fdfe:dcba:9876::1/126' + option tun_mtu '9000' + option self_mark '100' + option tun_mark '102' + option table_mark '100' + option ntp_server 'nil' + +config node 'n_anytls' + option label 'anytls' + option type 'anytls' + option address 'a.example.com' + option port '443' + option password 'secret' + option tls '1' + option tls_sni 'a.example.com' + option tls_insecure '0' + option anytls_idle_session_check_interval '30' + option anytls_idle_session_timeout '30' + option anytls_min_idle_session '0' + +config node 'n_vless_reality_ws' + option label 'vless-reality-ws' + option type 'vless' + option address 'b.example.com' + option port '443' + option uuid '3af88561-9c69-4b19-8f7e-f08d580bc339' + option transport 'ws' + option ws_host 'b.example.com' + option ws_path '/ws?ed=2048' + option tls '1' + option tls_sni 'b.example.com' + option tls_reality '1' + option tls_reality_public_key '4UAg690QziXeelpUJoAmXiim0gfQESSiJkNfvF-o8Uw' + option tls_reality_short_id 'abcd' + option tls_utls 'chrome' + option vless_flow 'xtls-rprx-vision' + option packet_encoding 'xudp' + +config node 'n_vmess_http' + option label 'vmess-http' + option type 'vmess' + option address 'c.example.com' + option port '80' + option uuid '3af88561-9c69-4b19-8f7e-f08d580bc339' + option transport 'http' + option http_host 'c.example.com' + option http_path '/path' + option http_method 'GET' + option vmess_alterid '0' + option vmess_encrypt 'auto' + option vmess_global_padding '1' + option tls '0' + option packet_encoding 'packetaddr' + +config node 'n_trojan_grpc' + option label 'trojan-grpc' + option type 'trojan' + option address 'd.example.com' + option port '443' + option password 'secret' + option transport 'grpc' + option grpc_servicename 'gs' + option grpc_permit_without_stream '1' + option tls '1' + option tls_sni 'd.example.com' + option tls_handshake_timeout '15' + option tls_min_version '1.2' + option tls_max_version '1.3' + option tls_cipher_suites 'TLS_AES_128_GCM_SHA256' + +config node 'n_ss' + option label 'ss' + option type 'shadowsocks' + option address 'e.example.com' + option port '8388' + option shadowsocks_encrypt_method 'aes-256-gcm' + option password 'secret' + option multiplex '1' + option multiplex_protocol 'h2mux' + option multiplex_padding '1' + option multiplex_max_connections '4' + option udp_over_tcp '1' + option udp_over_tcp_version '2' + +config node 'n_hy2' + option label 'hy2' + option type 'hysteria2' + option address 'f.example.com' + option port '443' + option password 'secret' + option tls '1' + option tls_sni 'f.example.com' + option hysteria_obfs_type 'salamander' + option hysteria_obfs_password 'obfspass' + option hysteria_up_mbps '100' + option hysteria_down_mbps '500' + option hysteria_hopping_port '20000:30000' + option hysteria_hop_interval '30' + option hysteria_bbr_profile 'conservative' + +config node 'n_snell' + option label 'snell' + option type 'snell' + option address 'g.example.com' + option port '443' + option password 'psk123456789012' + option snell_version '4' + option snell_obfs_mode 'http' + option snell_obfs_host 'bing.com' + option snell_reuse '1' + option snell_userkey 'ukey' + +config node 'n_http' + option label 'http' + option type 'http' + option address 'h.example.com' + option port '8080' + option username 'u' + option password 'p' + option tls '0' + +config node 'n_socks' + option label 'socks' + option type 'socks' + option address 'i.example.com' + option port '1080' + option username 'u' + option password 'p' + option socks_version '5' + +config node 'n_shadowtls' + option label 'shadowtls' + option type 'shadowtls' + option address 'j.example.com' + option port '443' + option password 'secret' + option shadowtls_version '3' + option tls '1' + option tls_sni 'j.example.com' + diff --git a/luci-app-homeproxy/tests/fixtures/generators/custom.uci b/luci-app-homeproxy/tests/fixtures/generators/custom.uci new file mode 100644 index 000000000..eb56202cb --- /dev/null +++ b/luci-app-homeproxy/tests/fixtures/generators/custom.uci @@ -0,0 +1,56 @@ +# SPDX-License-Identifier: GPL-2.0-only +# +# Regression fixture for routing_mode='custom'. It reproduces two crashes +# that only the custom path could hit: +# +# * a direct node with an override forces generate_outbound() to write into +# direct_overrides, and the routing rule below forces get_direct_override() +# to read it -- so the table has to be declared before both helpers; +# * a local rule-set must not carry the legacy download_detour field, which +# sing-box 1.14 rejects on anything but a remote rule-set. +# +# __RULESET_DIR__ is substituted by tests/ucode/test_generators.sh with a +# directory holding a real compiled .srs file. + +config homeproxy 'config' + option routing_mode 'custom' + option proxy_mode 'redirect_tproxy' + option ipv6_support '0' + option log_level 'error' + +config homeproxy 'routing' + option default_outbound 'direct-out' + option default_outbound_dns 'default-dns' + +config homeproxy 'infra' + option mixed_port '5330' + option dns_port '5333' + option redirect_port '5331' + option self_mark '100' + +# direct node: exercises the direct_overrides write path +config node 'n_direct' + option label 'direct-node' + option type 'direct' + option override_address '1.2.3.4' + option override_port '8443' + +# routing node + rule: exercises get_direct_override() reading direct_overrides +config routing_node 'rn_direct' + option enabled '1' + option label 'rn-direct' + option node 'n_direct' + +config routing_rule 'rr_direct' + option enabled '1' + option label 'rr-direct' + option outbound 'rn_direct' + option action 'route' + +# local rule-set: must never carry download_detour +config ruleset 'rs_local' + option enabled '1' + option label 'local-rs' + option type 'local' + option format 'binary' + option path '__RULESET_DIR__/test.srs' diff --git a/luci-app-homeproxy/tests/fixtures/generators/server.uci b/luci-app-homeproxy/tests/fixtures/generators/server.uci new file mode 100644 index 000000000..9fb7285b6 --- /dev/null +++ b/luci-app-homeproxy/tests/fixtures/generators/server.uci @@ -0,0 +1,112 @@ +# SPDX-License-Identifier: GPL-2.0-only +# +# Regression fixture for generate_server.uc: one inbound per protocol family, +# covering the shared TLS/transport builders (ACME provider, ECH key, REALITY, +# WebSocket/gRPC/HTTP transports) on the server side. + +config homeproxy 'server' + option enabled '1' + option log_level 'warn' + +config server 's_vless_ws' + option enabled '1' + option type 'vless' + option listen_port '8443' + option uuid '3af88561-9c69-4b19-8f7e-f08d580bc339' + option transport 'ws' + option ws_host 'a.example.com' + option ws_path '/ws' + option websocket_early_data '2048' + option tls '1' + option tls_sni 'a.example.com' + option tls_acme '1' + option tls_acme_domain 'a.example.com' + option tls_acme_provider 'letsencrypt' + option tls_acme_email 'admin@example.com' + option tls_acme_dsn 'a.example.com' + option tls_acme_key_type 'p256' + option tls_alpn 'h2' + option tls_min_version '1.2' + +config server 's_anytls' + option enabled '1' + option type 'anytls' + option listen_port '8444' + option password 'secret' + option anytls_padding_scheme 'stop=8' + option tls '1' + option tls_sni 'b.example.com' + option tls_acme '1' + option tls_acme_domain 'b.example.com' + option tls_acme_provider 'zerossl' + option tls_acme_email 'admin@example.com' + option tls_acme_dsn 'b.example.com' + +config server 's_hy2' + option enabled '1' + option type 'hysteria2' + option listen_port '8445' + option password 'secret' + option hysteria_up_mbps '100' + option hysteria_down_mbps '500' + option hysteria_obfs_type 'salamander' + option hysteria_obfs_password 'obfspass' + option hysteria_masquerade 'https://example.com' + option tls '1' + option tls_sni 'c.example.com' + option tls_acme '1' + option tls_acme_domain 'c.example.com' + option tls_acme_provider 'letsencrypt' + option tls_acme_email 'admin@example.com' + option tls_acme_dsn 'c.example.com' + +config server 's_trojan_grpc' + option enabled '1' + option type 'trojan' + option listen_port '8446' + option password 'secret' + option transport 'grpc' + option grpc_servicename 'gs' + option multiplex '1' + option multiplex_padding '1' + option tls '1' + option tls_sni 'd.example.com' + option tls_acme '1' + option tls_acme_domain 'd.example.com' + option tls_acme_provider 'letsencrypt' + option tls_acme_email 'admin@example.com' + option tls_acme_dsn 'd.example.com' + +config server 's_ss' + option enabled '1' + option type 'shadowsocks' + option listen_port '8447' + option network 'tcp' + option shadowsocks_encrypt_method 'aes-256-gcm' + option password 'secret' + option udp_timeout '300' + +config server 's_snell' + option enabled '1' + option type 'snell' + option listen_port '8448' + option password 'psk123456789012' + option snell_version '5' + option snell_obfs_mode 'http' + +config server 's_tuic' + option enabled '1' + option type 'tuic' + option listen_port '8449' + option uuid '3af88561-9c69-4b19-8f7e-f08d580bc339' + option password 'secret' + option tuic_congestion_control 'bbr' + option tuic_auth_timeout '3' + option tuic_heartbeat '10' + option tls '1' + option tls_sni 'e.example.com' + option tls_acme '1' + option tls_acme_domain 'e.example.com' + option tls_acme_provider 'letsencrypt' + option tls_acme_email 'admin@example.com' + option tls_acme_dsn 'e.example.com' diff --git a/luci-app-homeproxy/tests/i18n-coverage.py b/luci-app-homeproxy/tests/i18n-coverage.py new file mode 100755 index 000000000..df1312313 --- /dev/null +++ b/luci-app-homeproxy/tests/i18n-coverage.py @@ -0,0 +1,152 @@ +#!/usr/bin/env python3 +# SPDX-License-Identifier: GPL-2.0-only +# +# Copyright (C) 2025 ImmortalWrt.org +# +# Report how much of the gettext template (po/templates/homeproxy.pot) is +# translated in po/zh_Hans/homeproxy.po. Missing, empty and fuzzy entries all +# count as untranslated. The check only warns by default so it does not block +# a build; pass --fail-below to turn the warning into a failure. +# +# Usage: +# tests/i18n-coverage.py # warn below 95% +# tests/i18n-coverage.py --warn-below 90 +# tests/i18n-coverage.py --fail-below 95 +# tests/i18n-coverage.py --list 20 + +import argparse +import os +import sys + +ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) +TEMPLATE = os.path.join(ROOT, "po/templates/homeproxy.pot") +TRANSLATION = os.path.join(ROOT, "po/zh_Hans/homeproxy.po") +IGNORE = os.path.join(ROOT, "tests/i18n-ignore.txt") + + +def load_ignore(path): + """msgids that are deliberately not translated (technical tokens).""" + if not os.path.exists(path): + return set() + ignored = set() + with open(path, encoding="utf-8") as handle: + for raw in handle: + line = raw.strip() + if line and not line.startswith("#"): + ignored.add(line) + return ignored + + +def unquote(value): + value = value.strip() + if len(value) >= 2 and value[0] == '"' and value[-1] == '"': + return value[1:-1] + return value + + +def parse_po(path): + """Return {msgid: {'msgstr': str, 'fuzzy': bool}} for non-empty msgids.""" + entries = {} + msgid = None + msgstr = "" + state = None + pending_fuzzy = False + entry_fuzzy = False + + def flush(): + if msgid: + entries[msgid] = {"msgstr": msgstr, "fuzzy": entry_fuzzy} + + with open(path, encoding="utf-8") as handle: + for raw in handle: + line = raw.rstrip("\n") + + if line.startswith("#,"): + if "fuzzy" in line: + pending_fuzzy = True + continue + + if line.startswith("#"): + continue + + if line.startswith("msgid "): + flush() + msgid = unquote(line[len("msgid "):]) + msgstr = "" + entry_fuzzy = pending_fuzzy + pending_fuzzy = False + state = "msgid" + elif line.startswith("msgstr "): + msgstr = unquote(line[len("msgstr "):]) + state = "msgstr" + elif line.startswith('"'): + if state == "msgid": + msgid += unquote(line) + elif state == "msgstr": + msgstr += unquote(line) + + flush() + return entries + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--warn-below", type=float, default=100.0, + help="warn when coverage is below this percentage (default: 100)") + parser.add_argument("--fail-below", type=float, default=None, + help="exit non-zero when coverage is below this percentage") + parser.add_argument("--list", type=int, default=10, + help="list at most this many untranslated entries (default: 10)") + args = parser.parse_args() + + template = parse_po(TEMPLATE) + translation = parse_po(TRANSLATION) + ignored = load_ignore(IGNORE) + + total = 0 + untranslated = [] + for msgid in template: + if msgid in ignored: + continue + total += 1 + entry = translation.get(msgid) + if not entry or entry["fuzzy"] or not entry["msgstr"].strip(): + untranslated.append(msgid) + + translated = total - len(untranslated) + coverage = (translated / total * 100) if total else 100.0 + + print(f"zh_Hans translation coverage: {translated}/{total} ({coverage:.1f}%)" + f", {len(ignored)} msgid(s) ignored by tests/i18n-ignore.txt") + + if untranslated and args.list: + print(f"{len(untranslated)} untranslated entries, first {min(args.list, len(untranslated))}:") + for msgid in untranslated[:args.list]: + print(f" - {msgid}") + + summary = os.environ.get("GITHUB_STEP_SUMMARY") + if summary: + with open(summary, "a", encoding="utf-8") as handle: + handle.write("## zh_Hans translation coverage\n\n") + handle.write(f"**{translated}/{total} ({coverage:.1f}%)** — " + f"{len(untranslated)} untranslated entry/entries.\n\n") + if untranslated: + handle.write("
Untranslated\n\n") + for msgid in untranslated: + handle.write(f"- `{msgid}`\n") + handle.write("\n
\n") + + if args.fail_below is not None and coverage < args.fail_below: + print(f"::error title=Translation coverage::zh_Hans coverage {coverage:.1f}% " + f"is below {args.fail_below}%") + return 1 + + if coverage < args.warn_below: + print(f"::warning title=Translation coverage::zh_Hans coverage {coverage:.1f}% " + f"is below {args.warn_below}% ({len(untranslated)} untranslated entry/entries)") + + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/luci-app-homeproxy/tests/i18n-ignore.txt b/luci-app-homeproxy/tests/i18n-ignore.txt new file mode 100644 index 000000000..fa914177a --- /dev/null +++ b/luci-app-homeproxy/tests/i18n-ignore.txt @@ -0,0 +1,13 @@ +# msgids that are intentionally left untranslated (protocol/technical tokens +# whose zh_Hans form is the same as the source). One msgid per line, matching +# the unquoted template string; '#' starts a comment. +http +unsafe-raw +unshaped +v4 +v5 +v6 +wrong-ack +wrong-checksum +wrong-md5 +wrong-timestamp diff --git a/luci-app-homeproxy/tests/luci-form-snapshot.js b/luci-app-homeproxy/tests/luci-form-snapshot.js new file mode 100644 index 000000000..10552940f --- /dev/null +++ b/luci-app-homeproxy/tests/luci-form-snapshot.js @@ -0,0 +1,214 @@ +#!/usr/bin/env node +/* + * SPDX-License-Identifier: GPL-2.0-only + * + * Copyright (C) 2025 ImmortalWrt.org + * + * Dump the LuCI form definition of the homeproxy node/client/server views as + * JSON, using a minimal mock of the LuCI client runtime. It is meant to be run + * against two checkouts (e.g. HEAD and the working tree) and the resulting + * snapshots diffed, so that a pure refactor can be proven not to change any + * option name, dependency, default or label. + * + * Usage: node tests/luci-form-snapshot.js [node|server] + */ + +'use strict'; + +const fs = require('fs'); +const path = require('path'); + +/* --- LuCI runtime mock start ------------------------------------------- */ + +String.prototype.format = function (...args) { + const values = args.length === 1 && Array.isArray(args[0]) ? args[0] : args; + let i = 0; + return this.replace(/%[sdj%]/g, (m) => m === '%%' ? '%' : (i < values.length ? String(values[i++]) : m)); +}; + +function E(tag, attrs, children) { + return { tag: tag, attrs: attrs, children: children }; +} + +function _(text) { return text; } + +const L = { + bind: (fn, self, ...args) => fn.bind(self, ...args), + resolveDefault: (promise, fallback) => promise.catch(() => fallback), + ui: { hideModal: () => {}, addNotification: () => {}, changes: { apply: () => {} } }, + env: { paths: {} } +}; + +let sectionSeq = 0; + +class Option { + constructor(kind, name, title, description) { + this.__kind = kind; + this.__name = name; + this.__title = title; + this.__description = description; + this.__depends = []; + this.__values = []; + } + + depends(...args) { this.__depends.push(args.length === 1 ? args[0] : args); } + value(value, label) { this.__values.push([ value, label === undefined ? null : label ]); } + + toJSON() { + const props = {}; + for (const key of Object.keys(this).sort()) { + if (key.startsWith('__') || key === 'subsection') + continue; + const value = this[key]; + if (typeof value === 'function' || value === undefined) + continue; + props[key] = value; + } + return { + kind: this.__kind, + name: this.__name, + title: this.__title, + description: this.__description === undefined ? null : this.__description, + depends: this.__depends, + values: this.__values, + props: props + }; + } +} + +class Section { + constructor(kind, name) { + this.__kind = kind; + this.__name = name; + this.__id = `${kind}:${name || ''}#${sectionSeq++}`; + this.__options = []; + this.__tabs = []; + if (kind === 'SectionValue') + this.subsection = new Section('GridSection', name); + } + + option(kind, name, title, description) { + const kindName = kind && kind.__name__ ? kind.__name__ : String(kind); + const option = new Option(kindName, name, title, description); + if (kindName === 'SectionValue') + option.subsection = new Section('GridSection', name); + this.__options.push(option); + return option; + } + + tab(id, title) { this.__tabs.push([ id, title ]); } + taboption(_tab, ...args) { return this.option(...args); } + + toJSON() { + return { + id: this.__id, + kind: this.__kind, + name: this.__name, + tabs: this.__tabs, + options: this.__options.map((o) => o.toJSON()), + subsection: this.subsection ? this.subsection.toJSON() : null + }; + } +} + +const classes = [ 'Value', 'ListValue', 'Flag', 'DynamicList', 'MultiValue', 'TextValue', 'Button', 'TypedSection', + 'NamedSection', 'GridSection', 'SectionValue' ]; + +const form = {}; +for (const name of classes) { + form[name] = class {}; + form[name].__name__ = name; +} + +form.DynamicList.extend = function (obj) { + const cls = class extends form.DynamicList {}; + Object.assign(cls.prototype, obj); + cls.__name__ = obj.__name__ || 'DynamicList'; + return cls; +}; + +form.Value.extend = function (obj) { + const cls = class extends form.Value {}; + Object.assign(cls.prototype, obj); + cls.__name__ = obj.__name__ || 'Value'; + return cls; +}; + +form.Map = class { + constructor(title) { this.title = title; this.sections = []; } + section(kind, name) { + const section = new Section(kind && kind.__name__ ? kind.__name__ : String(kind), name); + this.sections.push(section); + return section; + } + render() { return { sections: this.sections.map((s) => s.toJSON()) }; } +}; + +const uci = { + load: () => Promise.resolve(), + get: () => undefined, + get_first: () => null, + get_all: () => ({}), + sections: () => {}, + foreach: () => {}, + set: () => {}, add: () => 'section', remove: () => {}, save: () => Promise.resolve() +}; + +const ui = { + addNotification: () => {}, + showModal: () => {}, + hideModal: () => {}, + uploadFile: () => Promise.resolve({}), + addValidator: () => {}, + Textarea: class { render() { return E('textarea'); } getValue() { return ''; } }, + createHandlerFn: (self, fn) => fn +}; + +const baseclass = { extend: (obj) => obj }; +const view = { extend: (obj) => obj }; +const poll = { add: () => {} }; +const rpc = { declare: () => () => Promise.resolve({}) }; +const fsMock = { exec_direct: () => Promise.resolve(''), read: () => Promise.resolve(''), write: () => Promise.resolve() }; +const widgets = { DeviceSelect: class {} }; + +const deps = { + baseclass, form, fs: fsMock, rpc, uci, ui, view, poll, + 'luci.http': { urldecode: (s) => s, urlencode: (s) => s, urldecode_params: () => ({}) }, + 'luci.sys': { init_action: () => {} }, + 'tools.widgets': widgets +}; + +/* --- LuCI runtime mock end --------------------------------------------- */ + +function loadLuciModule(file, extraDeps) { + let src = fs.readFileSync(file, 'utf8'); + src = src.replace(/^'require ([^']+) as (\w+)';$/gm, + (_m, mod, alias) => `const ${alias} = __deps[${JSON.stringify(mod)}];`); + src = src.replace(/^'require ([^']+)';$/gm, + (_m, mod) => `const ${mod.split('.').pop().replace(/[^\w]/g, '_')} = __deps[${JSON.stringify(mod)}];`); + /* eslint-disable-next-line no-new-func */ + const factory = new Function('__deps', '_', 'E', 'L', src); + return factory(Object.assign({}, deps, extraDeps), _, E, L); +} + +function main() { + const root = process.argv[2]; + const target = process.argv[3] || 'node'; + if (!root) + throw new Error('usage: luci-form-snapshot.js [node|server]'); + + const viewDir = path.join(root, 'htdocs/luci-static/resources'); + const homeproxy = loadLuciModule(path.join(viewDir, 'homeproxy.js'), {}); + const mod = loadLuciModule(path.join(viewDir, 'view/homeproxy', target + '.js'), { homeproxy }); + + const features = { + version: '1.14.0', + with_acme: true, with_grpc: true, with_gvisor: true, with_quic: true, + with_utls: true, with_wireguard: true, hp_has_tcp_brutal: true + }; + + const rendered = mod.render([ undefined, features ]); + process.stdout.write(JSON.stringify(rendered, null, '\t') + '\n'); +} + +main(); diff --git a/luci-app-homeproxy/tests/run.sh b/luci-app-homeproxy/tests/run.sh new file mode 100755 index 000000000..b46570940 --- /dev/null +++ b/luci-app-homeproxy/tests/run.sh @@ -0,0 +1,61 @@ +#!/bin/sh +# SPDX-License-Identifier: GPL-2.0-only +# +# One-shot entry point for the test suite: +# +# tests/run.sh +# +# Translation coverage and the LuCI form snapshots run locally (they only need +# python3 / node). The ucode tests run locally when ucode and sing-box are +# available, otherwise the checkout is copied to $HP_TEST_HOST and run there. +# +# HP_TEST_HOST=root@192.168.1.1 tests/run.sh +# HP_TEST_DIR=/tmp/hp-tests tests/run.sh + +ROOT="$(cd "$(dirname "$0")/.." && pwd)" +HOST="${HP_TEST_HOST:-root@192.168.1.1}" +REMOTE_DIR="${HP_TEST_DIR:-/tmp/hp-tests}" +FAILED=0 + +echo "== zh_Hans translation coverage ==" +python3 "$ROOT/tests/i18n-coverage.py" --warn-below 100 + +echo "== LuCI form snapshots ==" +for target in node server; do + if ! node "$ROOT/tests/luci-form-snapshot.js" "$ROOT" "$target" > "/tmp/hp-snapshot-$target.json" 2> "/tmp/hp-snapshot-$target.err"; then + echo "FAIL: could not render the $target form" + cat "/tmp/hp-snapshot-$target.err" + FAILED=1 + continue + fi + + if diff -q "$ROOT/tests/snapshots/$target.json" "/tmp/hp-snapshot-$target.json" > "/dev/null"; then + echo "PASS: $target form snapshot" + else + echo "FAIL: $target form snapshot changed:" + diff "$ROOT/tests/snapshots/$target.json" "/tmp/hp-snapshot-$target.json" | head -40 + FAILED=1 + fi +done + +echo "== ucode tests ==" +if command -v ucode > "/dev/null" 2>&1 && command -v sing-box > "/dev/null" 2>&1; then + sh "$ROOT/tests/ucode/run.sh" "$ROOT" || FAILED=1 +else + echo "(no local ucode/sing-box, executing on $HOST)" + if tar czf - -C "$ROOT" --exclude .git --exclude node_modules . \ + | ssh "$HOST" "rm -rf $REMOTE_DIR && mkdir -p $REMOTE_DIR && tar xzf - -C $REMOTE_DIR"; then + ssh "$HOST" "sh $REMOTE_DIR/tests/ucode/run.sh $REMOTE_DIR" || FAILED=1 + else + echo "FAIL: could not stage the tests on $HOST" + FAILED=1 + fi +fi + +if [ "$FAILED" -eq 0 ]; then + echo "ALL TESTS PASSED" +else + echo "SOME TESTS FAILED" +fi + +exit $FAILED diff --git a/luci-app-homeproxy/tests/snapshots/node.json b/luci-app-homeproxy/tests/snapshots/node.json new file mode 100644 index 000000000..4b735b35a --- /dev/null +++ b/luci-app-homeproxy/tests/snapshots/node.json @@ -0,0 +1,293 @@ +{ + "sections": [ + { + "id": "NamedSection:subscription#0", + "kind": "NamedSection", + "name": "subscription", + "tabs": [ + [ + "node", + "Nodes" + ], + [ + "subscription", + "Subscriptions" + ] + ], + "options": [ + { + "kind": "SectionValue", + "name": "_node", + "description": "node", + "depends": [], + "values": [], + "props": {} + }, + { + "kind": "Flag", + "name": "auto_update", + "title": "Auto update", + "description": "Auto update subscriptions and geodata.", + "depends": [], + "values": [], + "props": { + "rmempty": false + } + }, + { + "kind": "ListValue", + "name": "auto_update_time", + "title": "Update time", + "description": null, + "depends": [ + [ + "auto_update", + "1" + ] + ], + "values": [ + [ + 0, + "0:00" + ], + [ + 1, + "1:00" + ], + [ + 2, + "2:00" + ], + [ + 3, + "3:00" + ], + [ + 4, + "4:00" + ], + [ + 5, + "5:00" + ], + [ + 6, + "6:00" + ], + [ + 7, + "7:00" + ], + [ + 8, + "8:00" + ], + [ + 9, + "9:00" + ], + [ + 10, + "10:00" + ], + [ + 11, + "11:00" + ], + [ + 12, + "12:00" + ], + [ + 13, + "13:00" + ], + [ + 14, + "14:00" + ], + [ + 15, + "15:00" + ], + [ + 16, + "16:00" + ], + [ + 17, + "17:00" + ], + [ + 18, + "18:00" + ], + [ + 19, + "19:00" + ], + [ + 20, + "20:00" + ], + [ + 21, + "21:00" + ], + [ + 22, + "22:00" + ], + [ + 23, + "23:00" + ] + ], + "props": { + "default": "2" + } + }, + { + "kind": "Flag", + "name": "update_via_proxy", + "title": "Update via proxy", + "description": "Update subscriptions via proxy.", + "depends": [], + "values": [], + "props": { + "rmempty": false + } + }, + { + "kind": "DynamicList", + "name": "subscription_url", + "title": "Subscription URL-s", + "description": "Support Hysteria, Shadowsocks, Trojan, v2rayN (VMess), and XTLS (VLESS) online configuration delivery standard.", + "depends": [], + "values": [], + "props": {} + }, + { + "kind": "ListValue", + "name": "filter_nodes", + "title": "Filter nodes", + "description": "Drop/keep specific nodes from subscriptions.", + "depends": [], + "values": [ + [ + "disabled", + "Disable" + ], + [ + "blacklist", + "Blacklist mode" + ], + [ + "whitelist", + "Whitelist mode" + ] + ], + "props": { + "default": "disabled", + "rmempty": false + } + }, + { + "kind": "DynamicList", + "name": "filter_keywords", + "title": "Filter keywords", + "description": "Drop/keep nodes that contain the specific keywords. Regex is supported.", + "depends": [ + { + "filter_nodes": "disabled", + "!reverse": true + } + ], + "values": [], + "props": { + "rmempty": false + } + }, + { + "kind": "Value", + "name": "user_agent", + "title": "User-Agent", + "description": null, + "depends": [], + "values": [], + "props": { + "placeholder": "Wget/1.21 (HomeProxy, like v2rayN)" + } + }, + { + "kind": "Flag", + "name": "allow_insecure", + "title": "Allow insecure", + "description": "Allow insecure connection by default when add nodes from subscriptions.
This is DANGEROUS, your traffic is almost like PLAIN TEXT! Use at your own risk!", + "depends": [], + "values": [], + "props": { + "rmempty": false + } + }, + { + "kind": "ListValue", + "name": "packet_encoding", + "title": "Default packet encoding", + "description": null, + "depends": [], + "values": [ + [ + "", + "none" + ], + [ + "packetaddr", + "packet addr (v2ray-core v5+)" + ], + [ + "xudp", + "Xudp (Xray-core)" + ] + ], + "props": {} + }, + { + "kind": "Button", + "name": "_save_subscriptions", + "title": "Save subscriptions settings", + "description": "NOTE: Save current settings before updating subscriptions.", + "depends": [], + "values": [], + "props": { + "inputstyle": "apply", + "inputtitle": "Save current settings" + } + }, + { + "kind": "Button", + "name": "_update_subscriptions", + "title": "Update nodes from subscriptions", + "description": null, + "depends": [], + "values": [], + "props": { + "inputstyle": "apply" + } + }, + { + "kind": "Button", + "name": "_remove_subscriptions", + "title": "Remove all nodes from subscriptions", + "description": null, + "depends": [], + "values": [], + "props": { + "inputstyle": "reset" + } + } + ], + "subsection": null + } + ] +} diff --git a/luci-app-homeproxy/tests/snapshots/server.json b/luci-app-homeproxy/tests/snapshots/server.json new file mode 100644 index 000000000..bf1f797f4 --- /dev/null +++ b/luci-app-homeproxy/tests/snapshots/server.json @@ -0,0 +1,2150 @@ +{ + "sections": [ + { + "id": "TypedSection:#0", + "kind": "TypedSection", + "tabs": [], + "options": [], + "subsection": null + }, + { + "id": "NamedSection:server#1", + "kind": "NamedSection", + "name": "server", + "tabs": [], + "options": [ + { + "kind": "Flag", + "name": "enabled", + "title": "Enable", + "description": null, + "depends": [], + "values": [], + "props": { + "rmempty": false + } + } + ], + "subsection": null + }, + { + "id": "GridSection:server#2", + "kind": "GridSection", + "name": "server", + "tabs": [], + "options": [ + { + "kind": "Value", + "name": "label", + "title": "Label", + "description": null, + "depends": [], + "values": [], + "props": { + "modalonly": true, + "rmempty": false + } + }, + { + "kind": "Flag", + "name": "enabled", + "title": "Enable", + "description": null, + "depends": [], + "values": [], + "props": { + "editable": true, + "rmempty": false + } + }, + { + "kind": "Flag", + "name": "firewall", + "title": "Firewall", + "description": "Allow access from the Internet.", + "depends": [], + "values": [], + "props": { + "editable": true + } + }, + { + "kind": "ListValue", + "name": "type", + "title": "Type", + "description": null, + "depends": [], + "values": [ + [ + "anytls", + "AnyTLS" + ], + [ + "http", + "HTTP" + ], + [ + "hysteria", + "Hysteria" + ], + [ + "hysteria2", + "Hysteria2" + ], + [ + "naive", + "NaïveProxy" + ], + [ + "mixed", + "Mixed" + ], + [ + "shadowsocks", + "Shadowsocks" + ], + [ + "snell", + "Snell (1.14)" + ], + [ + "socks", + "Socks" + ], + [ + "trojan", + "Trojan" + ], + [ + "tuic", + "Tuic" + ], + [ + "vless", + "VLESS" + ], + [ + "vmess", + "VMess" + ] + ], + "props": { + "rmempty": false + } + }, + { + "kind": "Value", + "name": "address", + "title": "Listen address", + "description": null, + "depends": [], + "values": [], + "props": { + "datatype": "ipaddr", + "modalonly": true, + "placeholder": "::" + } + }, + { + "kind": "Value", + "name": "port", + "title": "Listen port", + "description": "The port must be unique.", + "depends": [], + "values": [], + "props": { + "datatype": "port" + } + }, + { + "kind": "Value", + "name": "username", + "title": "Username", + "description": null, + "depends": [ + [ + "type", + "http" + ], + [ + "type", + "mixed" + ], + [ + "type", + "naive" + ], + [ + "type", + "socks" + ] + ], + "values": [], + "props": { + "modalonly": true + } + }, + { + "kind": "CBI.GenValue", + "name": "password", + "title": "Password", + "description": null, + "depends": [ + [ + "type", + "anytls" + ], + { + "type": {}, + "username": {} + }, + [ + "type", + "hysteria2" + ], + [ + "type", + "shadowsocks" + ], + [ + "type", + "snell" + ], + [ + "type", + "trojan" + ], + [ + "type", + "tuic" + ] + ], + "values": [], + "props": { + "modalonly": true, + "password": true + } + }, + { + "kind": "DynamicList", + "name": "anytls_padding_scheme", + "title": "Padding scheme", + "description": "AnyTLS padding scheme in array.", + "depends": [ + [ + "type", + "anytls" + ] + ], + "values": [], + "props": { + "modalonly": true + } + }, + { + "kind": "ListValue", + "name": "hysteria_protocol", + "title": "Protocol", + "description": null, + "depends": [ + [ + "type", + "hysteria" + ] + ], + "values": [ + [ + "udp", + null + ] + ], + "props": { + "default": "udp", + "modalonly": true, + "rmempty": false + } + }, + { + "kind": "Value", + "name": "hysteria_down_mbps", + "title": "Max download speed", + "description": "Max download speed in Mbps.", + "depends": [ + [ + "type", + "hysteria" + ], + [ + "type", + "hysteria2" + ] + ], + "values": [], + "props": { + "datatype": "uinteger", + "modalonly": true + } + }, + { + "kind": "Value", + "name": "hysteria_up_mbps", + "title": "Max upload speed", + "description": "Max upload speed in Mbps.", + "depends": [ + [ + "type", + "hysteria" + ], + [ + "type", + "hysteria2" + ] + ], + "values": [], + "props": { + "datatype": "uinteger", + "modalonly": true + } + }, + { + "kind": "ListValue", + "name": "hysteria_auth_type", + "title": "Authentication type", + "description": null, + "depends": [ + [ + "type", + "hysteria" + ] + ], + "values": [ + [ + "", + "Disable" + ], + [ + "base64", + "Base64" + ], + [ + "string", + "String" + ] + ], + "props": { + "modalonly": true + } + }, + { + "kind": "Value", + "name": "hysteria_auth_payload", + "title": "Authentication payload", + "description": null, + "depends": [ + { + "type": "hysteria", + "hysteria_auth_type": {} + } + ], + "values": [], + "props": { + "modalonly": true, + "password": true, + "rmempty": false + } + }, + { + "kind": "ListValue", + "name": "hysteria_obfs_type", + "title": "Obfuscate type", + "description": null, + "depends": [ + [ + "type", + "hysteria2" + ] + ], + "values": [ + [ + "", + "Disable" + ], + [ + "salamander", + "Salamander" + ], + [ + "gecko", + "Gecko (1.14)" + ] + ], + "props": { + "modalonly": true + } + }, + { + "kind": "CBI.GenValue", + "name": "hysteria_obfs_password", + "title": "Obfuscate password", + "description": null, + "depends": [ + [ + "type", + "hysteria" + ], + { + "type": "hysteria2", + "hysteria_obfs_type": {} + } + ], + "values": [], + "props": { + "modalonly": true, + "password": true + } + }, + { + "kind": "Value", + "name": "hysteria_obfs_min_packet_size", + "title": "Min obfs packet size (1.14)", + "description": "Minimum on-wire packet size in bytes. Gecko only.", + "depends": [ + { + "type": "hysteria2", + "hysteria_obfs_type": "gecko" + } + ], + "values": [], + "props": { + "datatype": "uinteger", + "modalonly": true, + "placeholder": "512" + } + }, + { + "kind": "Value", + "name": "hysteria_obfs_max_packet_size", + "title": "Max obfs packet size (1.14)", + "description": "Maximum on-wire packet size in bytes. Gecko only.", + "depends": [ + { + "type": "hysteria2", + "hysteria_obfs_type": "gecko" + } + ], + "values": [], + "props": { + "datatype": "uinteger", + "modalonly": true, + "placeholder": "1200" + } + }, + { + "kind": "Flag", + "name": "hysteria_ignore_client_bandwidth", + "title": "Ignore client bandwidth", + "description": "Tell the client to use the BBR flow control algorithm instead of Hysteria CC.", + "depends": [ + { + "type": "hysteria2", + "hysteria_down_mbps": "", + "hysteria_up_mbps": "" + } + ], + "values": [], + "props": { + "modalonly": true + } + }, + { + "kind": "Value", + "name": "hysteria_masquerade", + "title": "Masquerade", + "description": "HTTP3 server behavior when authentication fails.
A 404 page will be returned if empty.", + "depends": [ + [ + "type", + "hysteria2" + ] + ], + "values": [], + "props": { + "modalonly": true + } + }, + { + "kind": "ListValue", + "name": "snell_version", + "title": "Snell version", + "description": "The pre-shared key (password) above must be 12-255 bytes for v6.", + "depends": [ + [ + "type", + "snell" + ] + ], + "values": [ + [ + "5", + "v5" + ], + [ + "6", + "v6" + ] + ], + "props": { + "default": "5", + "modalonly": true + } + }, + { + "kind": "ListValue", + "name": "snell_obfs_mode", + "title": "Obfuscation mode", + "description": "HTTP obfuscation. v5 only.", + "depends": [ + { + "type": "snell", + "snell_version": "5" + } + ], + "values": [ + [ + "", + "none" + ], + [ + "http", + "http" + ] + ], + "props": { + "modalonly": true + } + }, + { + "kind": "ListValue", + "name": "snell_mode", + "title": "Traffic shaping mode", + "description": "v6 only.", + "depends": [ + { + "type": "snell", + "snell_version": "6" + } + ], + "values": [ + [ + "", + "default" + ], + [ + "unshaped", + "unshaped" + ], + [ + "unsafe-raw", + "unsafe-raw" + ] + ], + "props": { + "modalonly": true + } + }, + { + "kind": "ListValue", + "name": "shadowsocks_encrypt_method", + "title": "Encrypt method", + "description": null, + "depends": [ + [ + "type", + "shadowsocks" + ] + ], + "values": [ + [ + "none", + null + ], + [ + "aes-128-gcm", + null + ], + [ + "aes-192-gcm", + null + ], + [ + "aes-256-gcm", + null + ], + [ + "chacha20-ietf-poly1305", + null + ], + [ + "xchacha20-ietf-poly1305", + null + ], + [ + "2022-blake3-aes-128-gcm", + null + ], + [ + "2022-blake3-aes-256-gcm", + null + ], + [ + "2022-blake3-chacha20-poly1305", + null + ] + ], + "props": { + "default": "aes-128-gcm", + "modalonly": true + } + }, + { + "kind": "CBI.GenValue", + "name": "uuid", + "title": "UUID", + "description": null, + "depends": [ + [ + "type", + "tuic" + ], + [ + "type", + "vless" + ], + [ + "type", + "vmess" + ] + ], + "values": [], + "props": { + "modalonly": true, + "password": true + } + }, + { + "kind": "ListValue", + "name": "tuic_congestion_control", + "title": "Congestion control algorithm", + "description": "QUIC congestion control algorithm.", + "depends": [ + [ + "type", + "tuic" + ] + ], + "values": [ + [ + "cubic", + null + ], + [ + "new_reno", + null + ], + [ + "bbr", + null + ] + ], + "props": { + "default": "cubic", + "modalonly": true + } + }, + { + "kind": "Value", + "name": "tuic_auth_timeout", + "title": "Auth timeout", + "description": "How long the server should wait for the client to send the authentication command (in seconds).", + "depends": [ + [ + "type", + "tuic" + ] + ], + "values": [], + "props": { + "datatype": "uinteger", + "default": "3", + "modalonly": true + } + }, + { + "kind": "Flag", + "name": "tuic_enable_zero_rtt", + "title": "Enable 0-RTT handshake", + "description": "Enable 0-RTT QUIC connection handshake on the client side. This is not impacting much on the performance, as the protocol is fully multiplexed.
Disabling this is highly recommended, as it is vulnerable to replay attacks.", + "depends": [ + [ + "type", + "tuic" + ] + ], + "values": [], + "props": { + "modalonly": true + } + }, + { + "kind": "Value", + "name": "tuic_heartbeat", + "title": "Heartbeat interval", + "description": "Interval for sending heartbeat packets for keeping the connection alive (in seconds).", + "depends": [ + [ + "type", + "tuic" + ] + ], + "values": [], + "props": { + "datatype": "uinteger", + "default": "10", + "modalonly": true + } + }, + { + "kind": "ListValue", + "name": "vless_flow", + "title": "Flow", + "description": null, + "depends": [ + [ + "type", + "vless" + ] + ], + "values": [ + [ + "", + "None" + ], + [ + "xtls-rprx-vision", + null + ] + ], + "props": { + "modalonly": true + } + }, + { + "kind": "Value", + "name": "vmess_alterid", + "title": "Alter ID", + "description": "Legacy protocol support (VMess MD5 Authentication) is provided for compatibility purposes only, use of alterId > 1 is not recommended.", + "depends": [ + [ + "type", + "vmess" + ] + ], + "values": [], + "props": { + "datatype": "uinteger", + "modalonly": true + } + }, + { + "kind": "ListValue", + "name": "transport", + "title": "Transport", + "description": "No TCP transport, plain HTTP is merged into the HTTP transport.", + "depends": [ + [ + "type", + "trojan" + ], + [ + "type", + "vless" + ], + [ + "type", + "vmess" + ] + ], + "values": [ + [ + "", + "None" + ], + [ + "grpc", + "gRPC" + ], + [ + "http", + "HTTP" + ], + [ + "httpupgrade", + "HTTPUpgrade" + ], + [ + "quic", + "QUIC" + ], + [ + "ws", + "WebSocket" + ] + ], + "props": { + "modalonly": true + } + }, + { + "kind": "Value", + "name": "grpc_servicename", + "title": "gRPC service name", + "description": null, + "depends": [ + [ + "transport", + "grpc" + ] + ], + "values": [], + "props": { + "modalonly": true + } + }, + { + "kind": "DynamicList", + "name": "http_host", + "title": "Host", + "description": null, + "depends": [ + [ + "transport", + "http" + ] + ], + "values": [], + "props": { + "datatype": "hostname", + "modalonly": true + } + }, + { + "kind": "Value", + "name": "httpupgrade_host", + "title": "Host", + "description": null, + "depends": [ + [ + "transport", + "httpupgrade" + ] + ], + "values": [], + "props": { + "datatype": "hostname", + "modalonly": true + } + }, + { + "kind": "Value", + "name": "http_path", + "title": "Path", + "description": null, + "depends": [ + [ + "transport", + "http" + ], + [ + "transport", + "httpupgrade" + ] + ], + "values": [], + "props": { + "modalonly": true + } + }, + { + "kind": "Value", + "name": "http_method", + "title": "Method", + "description": null, + "depends": [ + [ + "transport", + "http" + ] + ], + "values": [], + "props": { + "modalonly": true + } + }, + { + "kind": "Value", + "name": "http_idle_timeout", + "title": "Idle timeout", + "description": "Specifies the time (in seconds) until idle clients should be closed with a GOAWAY frame. PING frames are not considered as activity.", + "depends": [ + [ + "transport", + "grpc" + ], + { + "transport": "http", + "tls": "1" + } + ], + "values": [], + "props": { + "datatype": "uinteger", + "modalonly": true + } + }, + { + "kind": "Value", + "name": "http_ping_timeout", + "title": "Ping timeout", + "description": "The timeout (in seconds) that after performing a keepalive check, the client will wait for activity. If no activity is detected, the connection will be closed.", + "depends": [ + [ + "transport", + "grpc" + ] + ], + "values": [], + "props": { + "datatype": "uinteger", + "modalonly": true + } + }, + { + "kind": "Value", + "name": "ws_host", + "title": "Host", + "description": null, + "depends": [ + [ + "transport", + "ws" + ] + ], + "values": [], + "props": { + "modalonly": true + } + }, + { + "kind": "Value", + "name": "ws_path", + "title": "Path", + "description": null, + "depends": [ + [ + "transport", + "ws" + ] + ], + "values": [], + "props": { + "modalonly": true + } + }, + { + "kind": "Value", + "name": "websocket_early_data", + "title": "Early data", + "description": "Allowed payload size is in the request.", + "depends": [ + [ + "transport", + "ws" + ] + ], + "values": [ + [ + "2048", + null + ] + ], + "props": { + "datatype": "uinteger", + "modalonly": true + } + }, + { + "kind": "Value", + "name": "websocket_early_data_header", + "title": "Early data header name", + "description": "Early data is sent in path instead of header by default.
To be compatible with Xray-core, set this to Sec-WebSocket-Protocol.", + "depends": [ + [ + "transport", + "ws" + ] + ], + "values": [ + [ + "Sec-WebSocket-Protocol", + null + ] + ], + "props": { + "modalonly": true + } + }, + { + "kind": "Flag", + "name": "multiplex", + "title": "Multiplex", + "description": null, + "depends": [ + [ + "type", + "shadowsocks" + ], + [ + "type", + "trojan" + ], + [ + "type", + "vless" + ], + [ + "type", + "vmess" + ] + ], + "values": [], + "props": { + "modalonly": true + } + }, + { + "kind": "Flag", + "name": "multiplex_padding", + "title": "Enable padding", + "description": null, + "depends": [ + [ + "multiplex", + "1" + ] + ], + "values": [], + "props": { + "modalonly": true + } + }, + { + "kind": "Flag", + "name": "multiplex_brutal", + "title": "Enable TCP Brutal", + "description": "Enable TCP Brutal congestion control algorithm", + "depends": [ + [ + "multiplex", + "1" + ] + ], + "values": [], + "props": { + "modalonly": true + } + }, + { + "kind": "Value", + "name": "multiplex_brutal_down", + "title": "Download bandwidth", + "description": "Download bandwidth in Mbps.", + "depends": [ + [ + "multiplex_brutal", + "1" + ] + ], + "values": [], + "props": { + "datatype": "uinteger", + "modalonly": true + } + }, + { + "kind": "Value", + "name": "multiplex_brutal_up", + "title": "Upload bandwidth", + "description": "Upload bandwidth in Mbps.", + "depends": [ + [ + "multiplex_brutal", + "1" + ] + ], + "values": [], + "props": { + "datatype": "uinteger", + "modalonly": true + } + }, + { + "kind": "Flag", + "name": "tls", + "title": "TLS", + "description": null, + "depends": [ + [ + "type", + "anytls" + ], + [ + "type", + "http" + ], + [ + "type", + "hysteria" + ], + [ + "type", + "hysteria2" + ], + [ + "type", + "naive" + ], + [ + "type", + "trojan" + ], + [ + "type", + "tuic" + ], + [ + "type", + "vless" + ], + [ + "type", + "vmess" + ] + ], + "values": [], + "props": { + "modalonly": true, + "rmempty": false + } + }, + { + "kind": "Value", + "name": "tls_sni", + "title": "TLS SNI", + "description": "Used to verify the hostname on the returned certificates unless insecure is given.", + "depends": [ + [ + "tls", + "1" + ] + ], + "values": [], + "props": { + "modalonly": true + } + }, + { + "kind": "DynamicList", + "name": "tls_alpn", + "title": "TLS ALPN", + "description": "List of supported application level protocols, in order of preference.", + "depends": [ + [ + "tls", + "1" + ] + ], + "values": [], + "props": { + "modalonly": true + } + }, + { + "kind": "ListValue", + "name": "tls_min_version", + "title": "Minimum TLS version", + "description": "The minimum TLS version that is acceptable.", + "depends": [ + [ + "tls", + "1" + ] + ], + "values": [ + [ + "", + "default" + ], + [ + "1.0", + null + ], + [ + "1.1", + null + ], + [ + "1.2", + null + ], + [ + "1.3", + null + ] + ], + "props": { + "modalonly": true + } + }, + { + "kind": "ListValue", + "name": "tls_max_version", + "title": "Maximum TLS version", + "description": "The maximum TLS version that is acceptable.", + "depends": [ + [ + "tls", + "1" + ] + ], + "values": [ + [ + "", + "default" + ], + [ + "1.0", + null + ], + [ + "1.1", + null + ], + [ + "1.2", + null + ], + [ + "1.3", + null + ] + ], + "props": { + "modalonly": true + } + }, + { + "kind": "CBI.StaticList", + "name": "tls_cipher_suites", + "title": "Cipher suites", + "description": "The elliptic curves that will be used in an ECDHE handshake, in preference order. If empty, the default will be used.", + "depends": [ + [ + "tls", + "1" + ] + ], + "values": [ + [ + "TLS_RSA_WITH_AES_128_CBC_SHA", + null + ], + [ + "TLS_RSA_WITH_AES_256_CBC_SHA", + null + ], + [ + "TLS_RSA_WITH_AES_128_GCM_SHA256", + null + ], + [ + "TLS_RSA_WITH_AES_256_GCM_SHA384", + null + ], + [ + "TLS_AES_128_GCM_SHA256", + null + ], + [ + "TLS_AES_256_GCM_SHA384", + null + ], + [ + "TLS_CHACHA20_POLY1305_SHA256", + null + ], + [ + "TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA", + null + ], + [ + "TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA", + null + ], + [ + "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA", + null + ], + [ + "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA", + null + ], + [ + "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256", + null + ], + [ + "TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384", + null + ], + [ + "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256", + null + ], + [ + "TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384", + null + ], + [ + "TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256", + null + ], + [ + "TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256", + null + ] + ], + "props": { + "modalonly": true, + "optional": true + } + }, + { + "kind": "Flag", + "name": "tls_acme", + "title": "Enable ACME", + "description": "Use ACME TLS certificate issuer.", + "depends": [ + [ + "tls", + "1" + ] + ], + "values": [], + "props": { + "modalonly": true + } + }, + { + "kind": "DynamicList", + "name": "tls_acme_domain", + "title": "Domains", + "description": null, + "depends": [ + [ + "tls_acme", + "1" + ] + ], + "values": [], + "props": { + "datatype": "hostname", + "modalonly": true, + "rmempty": false + } + }, + { + "kind": "Value", + "name": "tls_acme_dsn", + "title": "Default server name", + "description": "Server name to use when choosing a certificate if the ClientHello's ServerName field is empty.", + "depends": [ + [ + "tls_acme", + "1" + ] + ], + "values": [], + "props": { + "modalonly": true, + "rmempty": false + } + }, + { + "kind": "Value", + "name": "tls_acme_email", + "title": "Email", + "description": "The email address to use when creating or selecting an existing ACME server account.", + "depends": [ + [ + "tls_acme", + "1" + ] + ], + "values": [], + "props": { + "modalonly": true + } + }, + { + "kind": "Value", + "name": "tls_acme_key_type", + "title": "ACME key type", + "description": "Private key type for new certificates (1.14). Empty uses the default.", + "depends": [ + [ + "tls_acme", + "1" + ] + ], + "values": [ + [ + "ed25519", + null + ], + [ + "p256", + null + ], + [ + "p384", + null + ], + [ + "rsa2048", + null + ], + [ + "rsa4096", + null + ] + ], + "props": { + "modalonly": true + } + }, + { + "kind": "Value", + "name": "tls_acme_profile", + "title": "ACME profile", + "description": "ACME profile for certificate issuance (1.14). Example: shortlived.", + "depends": [ + [ + "tls_acme", + "1" + ] + ], + "values": [], + "props": { + "modalonly": true, + "placeholder": "shortlived" + } + }, + { + "kind": "TextValue", + "name": "tls_acme_account_key", + "title": "ACME account key", + "description": "PEM-encoded private key of an existing ACME account (1.14).", + "depends": [ + [ + "tls_acme", + "1" + ] + ], + "values": [], + "props": { + "modalonly": true, + "monospace": true, + "rows": 3 + } + }, + { + "kind": "Value", + "name": "tls_acme_provider", + "title": "CA provider", + "description": "The ACME CA provider to use.", + "depends": [ + [ + "tls_acme", + "1" + ] + ], + "values": [ + [ + "letsencrypt", + "Let's Encrypt" + ], + [ + "zerossl", + "ZeroSSL" + ] + ], + "props": { + "modalonly": true, + "rmempty": false + } + }, + { + "kind": "Flag", + "name": "tls_dns01_challenge", + "title": "DNS01 challenge", + "description": null, + "depends": [ + [ + "tls_acme", + "1" + ] + ], + "values": [], + "props": { + "modalonly": true + } + }, + { + "kind": "ListValue", + "name": "tls_dns01_provider", + "title": "DNS provider", + "description": null, + "depends": [ + [ + "tls_dns01_challenge", + "1" + ] + ], + "values": [ + [ + "alidns", + "Alibaba Cloud DNS" + ], + [ + "cloudflare", + "Cloudflare" + ] + ], + "props": { + "default": "cloudflare", + "modalonly": true, + "rmempty": false + } + }, + { + "kind": "Value", + "name": "tls_dns01_ali_akid", + "title": "Access key ID", + "description": null, + "depends": [ + [ + "tls_dns01_provider", + "alidns" + ] + ], + "values": [], + "props": { + "modalonly": true, + "password": true, + "rmempty": false + } + }, + { + "kind": "Value", + "name": "tls_dns01_ali_aksec", + "title": "Access key secret", + "description": null, + "depends": [ + [ + "tls_dns01_provider", + "alidns" + ] + ], + "values": [], + "props": { + "modalonly": true, + "password": true, + "rmempty": false + } + }, + { + "kind": "Value", + "name": "tls_dns01_ali_rid", + "title": "Region ID", + "description": null, + "depends": [ + [ + "tls_dns01_provider", + "alidns" + ] + ], + "values": [], + "props": { + "modalonly": true, + "rmempty": false + } + }, + { + "kind": "Value", + "name": "tls_dns01_cf_api_token", + "title": "API token", + "description": null, + "depends": [ + [ + "tls_dns01_provider", + "cloudflare" + ] + ], + "values": [], + "props": { + "modalonly": true, + "password": true, + "rmempty": false + } + }, + { + "kind": "Flag", + "name": "tls_acme_dhc", + "title": "Disable HTTP challenge", + "description": null, + "depends": [ + [ + "tls_dns01_challenge", + "0" + ] + ], + "values": [], + "props": { + "modalonly": true + } + }, + { + "kind": "Flag", + "name": "tls_acme_dtac", + "title": "Disable TLS ALPN challenge", + "description": null, + "depends": [ + [ + "tls_dns01_challenge", + "0" + ] + ], + "values": [], + "props": { + "modalonly": true + } + }, + { + "kind": "Value", + "name": "tls_acme_ahp", + "title": "Alternative HTTP port", + "description": "The alternate port to use for the ACME HTTP challenge; if non-empty, this port will be used instead of 80 to spin up a listener for the HTTP challenge.", + "depends": [ + [ + "tls_dns01_challenge", + "0" + ] + ], + "values": [], + "props": { + "datatype": "port", + "modalonly": true + } + }, + { + "kind": "Value", + "name": "tls_acme_atp", + "title": "Alternative TLS port", + "description": "The alternate port to use for the ACME TLS-ALPN challenge; the system must forward 443 to this port for challenge to succeed.", + "depends": [ + [ + "tls_dns01_challenge", + "0" + ] + ], + "values": [], + "props": { + "datatype": "port", + "modalonly": true + } + }, + { + "kind": "Flag", + "name": "tls_acme_external_account", + "title": "External Account Binding", + "description": "EAB (External Account Binding) contains information necessary to bind or map an ACME account to some other account known by the CA.
External account bindings are \"used to associate an ACME account with an existing account in a non-ACME system, such as a CA customer database.", + "depends": [ + [ + "tls_acme", + "1" + ] + ], + "values": [], + "props": { + "modalonly": true + } + }, + { + "kind": "Value", + "name": "tls_acme_ea_keyid", + "title": "External account key ID", + "description": null, + "depends": [ + [ + "tls_acme_external_account", + "1" + ] + ], + "values": [], + "props": { + "modalonly": true, + "password": true, + "rmempty": false + } + }, + { + "kind": "Value", + "name": "tls_acme_ea_mackey", + "title": "External account MAC key", + "description": null, + "depends": [ + [ + "tls_acme_external_account", + "1" + ] + ], + "values": [], + "props": { + "modalonly": true, + "password": true, + "rmempty": false + } + }, + { + "kind": "Flag", + "name": "tls_reality", + "title": "REALITY", + "description": null, + "depends": [ + { + "tls": "1", + "tls_acme": "0", + "type": {} + }, + { + "tls": "1", + "tls_acme": null, + "type": {} + } + ], + "values": [], + "props": { + "modalonly": true + } + }, + { + "kind": "CBI.GenValue", + "name": "tls_reality_private_key", + "title": "REALITY private key", + "description": null, + "depends": [ + [ + "tls_reality", + "1" + ] + ], + "values": [], + "props": { + "hp_options": { + "type": "reality-keypair", + "params": "" + }, + "modalonly": true, + "password": true, + "rmempty": false + } + }, + { + "kind": "Value", + "name": "tls_reality_public_key", + "title": "REALITY public key", + "description": null, + "depends": [ + [ + "tls_reality", + "1" + ] + ], + "values": [], + "props": { + "modalonly": true + } + }, + { + "kind": "DynamicList", + "name": "tls_reality_short_id", + "title": "REALITY short ID", + "description": null, + "depends": [ + [ + "tls_reality", + "1" + ] + ], + "values": [], + "props": { + "modalonly": true, + "rmempty": false + } + }, + { + "kind": "Value", + "name": "tls_reality_max_time_difference", + "title": "Max time difference", + "description": "The maximum time difference between the server and the client.", + "depends": [ + [ + "tls_reality", + "1" + ] + ], + "values": [], + "props": { + "modalonly": true + } + }, + { + "kind": "Value", + "name": "tls_reality_server_addr", + "title": "Handshake server address", + "description": null, + "depends": [ + [ + "tls_reality", + "1" + ] + ], + "values": [], + "props": { + "datatype": "hostname", + "modalonly": true, + "rmempty": false + } + }, + { + "kind": "Value", + "name": "tls_reality_server_port", + "title": "Handshake server port", + "description": null, + "depends": [ + [ + "tls_reality", + "1" + ] + ], + "values": [], + "props": { + "datatype": "port", + "modalonly": true, + "rmempty": false + } + }, + { + "kind": "Value", + "name": "tls_cert_path", + "title": "Certificate path", + "description": "The server public key, in PEM format.", + "depends": [ + { + "tls": "1", + "tls_acme": "0", + "tls_reality": null + }, + { + "tls": "1", + "tls_acme": "0", + "tls_reality": "0" + }, + { + "tls": "1", + "tls_acme": null, + "tls_reality": "0" + }, + { + "tls": "1", + "tls_acme": null, + "tls_reality": null + } + ], + "values": [ + [ + "/etc/homeproxy/certs/server_publickey.pem", + null + ] + ], + "props": { + "modalonly": true, + "rmempty": false + } + }, + { + "kind": "Button", + "name": "_upload_cert", + "title": "Upload certificate", + "description": "Save your configuration before uploading files!", + "depends": [ + { + "tls": "1", + "tls_cert_path": "/etc/homeproxy/certs/server_publickey.pem" + } + ], + "values": [], + "props": { + "inputstyle": "action", + "inputtitle": "Upload...", + "modalonly": true + } + }, + { + "kind": "Value", + "name": "tls_key_path", + "title": "Key path", + "description": "The server private key, in PEM format.", + "depends": [ + { + "tls": "1", + "tls_acme": "0", + "tls_reality": "0" + }, + { + "tls": "1", + "tls_acme": "0", + "tls_reality": null + }, + { + "tls": "1", + "tls_acme": null, + "tls_reality": "0" + }, + { + "tls": "1", + "tls_acme": null, + "tls_reality": null + } + ], + "values": [ + [ + "/etc/homeproxy/certs/server_privatekey.pem", + null + ] + ], + "props": { + "modalonly": true, + "rmempty": false + } + }, + { + "kind": "Button", + "name": "_upload_key", + "title": "Upload key", + "description": "Save your configuration before uploading files!", + "depends": [ + { + "tls": "1", + "tls_key_path": "/etc/homeproxy/certs/server_privatekey.pem" + } + ], + "values": [], + "props": { + "inputstyle": "action", + "inputtitle": "Upload...", + "modalonly": true + } + }, + { + "kind": "TextValue", + "name": "tls_ech_key", + "title": "ECH key", + "description": null, + "depends": [ + [ + "tls", + "1" + ] + ], + "values": [], + "props": { + "cols": 30, + "hp_options": { + "type": "ech-keypair", + "params": "" + }, + "modalonly": true, + "monospace": true, + "placeholder": "-----BEGIN ECH KEYS-----\nACBE2+piYBLrOywCbRYU+ZpEkk8keeBlUXbKqLRmQ/68FwBL/g0ARwAAIAAgn8HI\n93RfdV/LaDk+LC9H4h+4WhVBFmWKdhiT3vvpGi8ACAABAAEAAQADABRvdXRlci1z\nbmkuYW55LmRvbWFpbgAA\n-----END ECH KEYS-----", + "rows": 3 + } + }, + { + "kind": "TextValue", + "name": "tls_ech_config", + "title": "ECH config", + "description": null, + "depends": [ + [ + "tls", + "1" + ] + ], + "values": [], + "props": { + "cols": 30, + "modalonly": true, + "monospace": true, + "placeholder": "-----BEGIN ECH CONFIGS-----\nAEv+DQBHAAAgACCfwcj3dF91X8toOT4sL0fiH7haFUEWZYp2GJPe++kaLwAIAAEA\nAQABAAMAFG91dGVyLXNuaS5hbnkuZG9tYWluAAA=\n-----END ECH CONFIGS-----", + "rows": 3 + } + }, + { + "kind": "Flag", + "name": "tcp_fast_open", + "title": "TCP fast open", + "description": "Enable tcp fast open for listener.", + "depends": [ + { + "network": "udp", + "!reverse": true + } + ], + "values": [], + "props": { + "modalonly": true + } + }, + { + "kind": "Flag", + "name": "tcp_multi_path", + "title": "MultiPath TCP", + "description": null, + "depends": [ + { + "network": "udp", + "!reverse": true + } + ], + "values": [], + "props": { + "modalonly": true + } + }, + { + "kind": "Flag", + "name": "udp_fragment", + "title": "UDP Fragment", + "description": "Enable UDP fragmentation.", + "depends": [ + { + "network": "tcp", + "!reverse": true + } + ], + "values": [], + "props": { + "modalonly": true + } + }, + { + "kind": "Value", + "name": "udp_timeout", + "title": "UDP NAT expiration time", + "description": "In seconds.", + "depends": [ + { + "network": "tcp", + "!reverse": true + } + ], + "values": [], + "props": { + "datatype": "uinteger", + "modalonly": true, + "placeholder": "300" + } + }, + { + "kind": "ListValue", + "name": "network", + "title": "Network", + "description": null, + "depends": [ + [ + "type", + "naive" + ], + [ + "type", + "shadowsocks" + ] + ], + "values": [ + [ + "tcp", + "TCP" + ], + [ + "udp", + "UDP" + ], + [ + "", + "Both" + ] + ], + "props": { + "modalonly": true + } + }, + { + "kind": "class {}", + "name": "bind_interface", + "title": "Bind interface", + "description": "The network interface to bind to.", + "depends": [], + "values": [], + "props": { + "modalonly": true, + "multiple": false, + "noaliases": true + } + }, + { + "kind": "Flag", + "name": "reuse_addr", + "title": "Reuse address", + "description": "Reuse listener address.", + "depends": [], + "values": [], + "props": { + "modalonly": true + } + } + ], + "subsection": null + } + ] +} diff --git a/luci-app-homeproxy/tests/ucode/mocks/homeproxy.uc b/luci-app-homeproxy/tests/ucode/mocks/homeproxy.uc new file mode 100644 index 000000000..c410fd07f --- /dev/null +++ b/luci-app-homeproxy/tests/ucode/mocks/homeproxy.uc @@ -0,0 +1,140 @@ +/* + * SPDX-License-Identifier: GPL-2.0-only + * + * Copyright (C) 2025 ImmortalWrt.org + * + * Test double for root/etc/homeproxy/scripts/homeproxy.uc. + * + * Only `validation()` is stubbed: the real one shells out to + * /sbin/validate_data, which does not exist outside OpenWrt. Everything else + * (isEmpty, decodeBase64Str, parseURL) is a verbatim copy so the parser tests + * exercise the same string handling as production. Keep these in sync when + * homeproxy.uc changes. + */ + +import { urldecode_params } from 'luci.http'; + +export function isEmpty(res) { + return !res || res === 'nil' || (type(res) in ['array', 'object'] && length(res) === 0); +}; + +export function decodeBase64Str(str) { + if (isEmpty(str)) + return null; + + str = trim(str); + str = replace(str, /_/g, '/'); + str = replace(str, /-/g, '+'); + + const padding = length(str) % 4; + if (padding) + str = str + substr('====', padding); + + return b64dec(str); +}; + +/* Pure-ucode stand-in for /sbin/validate_data (host/port/ip4/ip6/hostname). */ +export function validation(datatype, data) { + if (!datatype || !data) + return null; + + switch (datatype) { + case 'port': + return match(data, /^\d+$/) != null && int(data) >= 0 && int(data) <= 65535; + case 'ip4addr': + if (match(data, /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/) == null) + return false; + for (let octet in split(data, '.')) + if (int(octet) > 255) + return false; + return true; + case 'ip6addr': + return match(data, /^[0-9a-fA-F:]+$/) != null && match(data, /::.*::/) == null; + case 'hostname': + return match(data, /^[A-Za-z0-9_][A-Za-z0-9_%-.]*[A-Za-z0-9]$/) != null || + match(data, /^[A-Za-z0-9_]$/) != null; + case 'host': + return validation('ip4addr', data) === true || + validation('ip6addr', data) === true || + validation('hostname', data) === true; + default: + return null; + } +}; + +export function parseURL(url) { + if (type(url) !== 'string') + return null; + + const services = { + http: '80', + https: '443' + }; + + const objurl = {}; + + objurl.href = url; + + url = replace(url, /#(.+)$/, (_, val) => { + objurl.hash = val; + return ''; + }); + + url = replace(url, /^(\w[A-Za-z0-9\+\-\.]+):/, (_, val) => { + objurl.protocol = val; + return ''; + }); + + url = replace(url, /\?(.+)/, (_, val) => { + objurl.search = val; + objurl.searchParams = urldecode_params(val); + return ''; + }); + + url = replace(url, /^\/\/([^\/]+)/, (_, val) => { + val = replace(val, /^([^@]+)@/, (_, val) => { + objurl.userinfo = val; + return ''; + }); + + val = replace(val, /:(\d+)$/, (_, val) => { + objurl.port = val; + return ''; + }); + + if (validation('ip4addr', val) || + validation('ip6addr', replace(val, /\[|\]/g, '')) || + validation('hostname', val)) + objurl.hostname = val; + + return ''; + }); + + objurl.pathname = url || '/'; + + if (!objurl.protocol || !objurl.hostname) + return null; + + if (objurl.userinfo) { + objurl.userinfo = replace(objurl.userinfo, /:(.+)$/, (_, val) => { + objurl.password = val; + return ''; + }); + + if (match(objurl.userinfo, /^[A-Za-z0-9\+\-\_\.]+$/)) { + objurl.username = objurl.userinfo; + delete objurl.userinfo; + } else { + delete objurl.userinfo; + delete objurl.password; + } + }; + + if (!objurl.port) + objurl.port = services[objurl.protocol]; + + objurl.host = objurl.hostname + (objurl.port ? `:${objurl.port}` : ''); + objurl.origin = `${objurl.protocol}://${objurl.host}`; + + return objurl; +}; diff --git a/luci-app-homeproxy/tests/ucode/run.sh b/luci-app-homeproxy/tests/ucode/run.sh new file mode 100755 index 000000000..7606a80ae --- /dev/null +++ b/luci-app-homeproxy/tests/ucode/run.sh @@ -0,0 +1,87 @@ +#!/bin/sh +# SPDX-License-Identifier: GPL-2.0-only +# +# Run the ucode-level tests: the parse_uri unit tests, the fw4 inventory check +# and the generator regression fixtures. Requires ucode; sing-box is needed for +# the generator cases (they validate the emitted config with `sing-box check`). +# +# Usage: sh tests/ucode/run.sh [work-dir] + +ROOT="${1:-.}" +WORK="${2:-/tmp/hp-ucode-tests}" + +ROOT="$(cd "$ROOT" && pwd)" +FAILED=0 + +echo "== ucode syntax check ==" +for file in "$ROOT"/root/etc/homeproxy/scripts/*.uc "$ROOT"/root/usr/share/rpcd/ucode/*; do + [ -f "$file" ] || continue + # Modules (with export statements) cannot be compiled as a program; they + # are loaded through `import` below instead. + case "$file" in + *homeproxy.uc|*parse_uri.uc) continue ;; + esac + if ! ucode -c -o "/dev/null" "$file" 2> "/tmp/hp-ucode-syntax.err"; then + echo "FAIL: $file" + head -8 "/tmp/hp-ucode-syntax.err" + FAILED=1 + fi +done +for module in homeproxy parse_uri; do + if ! ucode -L "$ROOT/root/etc/homeproxy/scripts" -e "import * as m from \"$module\";" 2> "/tmp/hp-ucode-syntax.err"; then + echo "FAIL: module $module" + head -8 "/tmp/hp-ucode-syntax.err" + FAILED=1 + fi +done +[ "$FAILED" -eq 0 ] && echo "PASS: all ucode sources compile" + +echo "== fw4 chain/set inventory ==" +sh "$ROOT/tests/ucode/test_fw4_names.sh" "$ROOT" || FAILED=1 + +echo "== firewall template rendering ==" +sh "$ROOT/tests/ucode/test_firewall_template.sh" "$ROOT" || FAILED=1 + +echo "== parse_uri unit tests ==" +rm -rf "$WORK/parse_uri" +mkdir -p "$WORK/parse_uri" +cp "$ROOT/root/etc/homeproxy/scripts/parse_uri.uc" "$WORK/parse_uri/" +cp "$ROOT/tests/ucode/mocks/homeproxy.uc" "$WORK/parse_uri/" +cp "$ROOT/tests/ucode/test_parse_uri.uc" "$WORK/parse_uri/" + +if ( cd "$WORK/parse_uri" && ucode test_parse_uri.uc ); then + echo "PASS: parse_uri unit tests" +else + echo "FAIL: parse_uri unit tests" + FAILED=1 +fi + +echo "== homeproxy helper tests ==" +rm -rf "$WORK/homeproxy" +mkdir -p "$WORK/homeproxy" +cp "$ROOT/root/etc/homeproxy/scripts/homeproxy.uc" "$WORK/homeproxy/" +cp "$ROOT/tests/ucode/test_homeproxy_utils.uc" "$WORK/homeproxy/" +if ( cd "$WORK/homeproxy" && ucode test_homeproxy_utils.uc ); then + echo "PASS: executeCommand() regression tests" +else + echo "FAIL: executeCommand() regression tests" + FAILED=1 +fi + +echo "== executeCommand() failure-path test ==" +rm -rf "$WORK/homeproxy_inject" +mkdir -p "$WORK/homeproxy_inject" +sed 's|const exitcode = system(.*);|die("injected failure");|' \ + "$ROOT/root/etc/homeproxy/scripts/homeproxy.uc" > "$WORK/homeproxy_inject/homeproxy.uc" +cp "$ROOT/tests/ucode/test_homeproxy_utils_inject.uc" "$WORK/homeproxy_inject/" +if ( cd "$WORK/homeproxy_inject" && ucode test_homeproxy_utils_inject.uc 2>"/dev/null" ); then + echo "PASS: executeCommand() failure path" +else + echo "FAIL: executeCommand() failure path" + FAILED=1 +fi + +echo "== generator regression tests ==" +sh "$ROOT/tests/ucode/test_generators.sh" "$ROOT" "$WORK/generators" || FAILED=1 + +exit $FAILED diff --git a/luci-app-homeproxy/tests/ucode/test_firewall_template.sh b/luci-app-homeproxy/tests/ucode/test_firewall_template.sh new file mode 100644 index 000000000..51a03eb4c --- /dev/null +++ b/luci-app-homeproxy/tests/ucode/test_firewall_template.sh @@ -0,0 +1,47 @@ +#!/bin/sh +# SPDX-License-Identifier: GPL-2.0-only +# +# Render firewall_post.ut and verify the homeproxy fw4 objects survive as real +# nft statements. +# +# The template opens with `{%-`, which trims the whitespace in front of it: any +# text placed above that tag loses its trailing newline and is glued onto the +# first generated statement, turning it into a comment. That silently dropped +# every homeproxy chain/set from the fw4 ruleset once, so keep this check. +# +# Usage: sh tests/ucode/test_firewall_template.sh + +ROOT="${1:-.}" +ROOT="$(cd "$ROOT" && pwd)" +OUT="$(mktemp)" +FAILED=0 + +if ! utpl -S "$ROOT/root/etc/homeproxy/scripts/firewall_post.ut" > "$OUT" 2>"/tmp/hp-fw4tpl.err"; then + echo "FAIL: could not render firewall_post.ut" + head -5 "/tmp/hp-fw4tpl.err" + rm -f "$OUT" + exit 1 +fi + +# Declared unconditionally by the template, so they must always be present as +# standalone statements. +for name in homeproxy_local_addr_v4 homeproxy_wan_proxy_addr_v4; do + if ! grep -q "^set $name {" "$OUT"; then + echo "FAIL: 'set $name {' is missing from the rendered firewall template" + grep -n "$name" "$OUT" | head -2 + FAILED=1 + fi +done + +# A statement glued onto the preceding comment looks like +# "# .set homeproxy_x {" -- exactly the failure mode above. +if grep -nE "^#[^!].*homeproxy_[a-z0-9_]+ \{" "$OUT" > "/dev/null"; then + echo "FAIL: an nft statement is glued onto a comment line" + grep -nE "^#[^!].*homeproxy_[a-z0-9_]+ \{" "$OUT" | head -2 + FAILED=1 +fi + +[ "$FAILED" -eq 0 ] && echo "PASS: firewall_post.ut renders homeproxy objects as standalone nft statements" + +rm -f "$OUT" +exit $FAILED diff --git a/luci-app-homeproxy/tests/ucode/test_fw4_names.sh b/luci-app-homeproxy/tests/ucode/test_fw4_names.sh new file mode 100644 index 000000000..fd037df1c --- /dev/null +++ b/luci-app-homeproxy/tests/ucode/test_fw4_names.sh @@ -0,0 +1,67 @@ +#!/bin/sh +# SPDX-License-Identifier: GPL-2.0-only +# +# The fw4 chain/set inventory in scripts/fw4_names.sh must stay in sync with +# the objects declared by scripts/firewall_post.ut: the first drives the +# cleanup in init.d/homeproxy, the second creates them. A drift means either a +# leftover object or a delete of something that never existed (which used to +# abort the whole cleanup batch). +# +# Usage: sh tests/ucode/test_fw4_names.sh + +ROOT="${1:-.}" +ROOT="$(cd "$ROOT" && pwd)" + +NAMES="$ROOT/root/etc/homeproxy/scripts/fw4_names.sh" +POST="$ROOT/root/etc/homeproxy/scripts/firewall_post.ut" +PRE="$ROOT/root/etc/homeproxy/scripts/firewall_pre.uc" + +FAILED=0 + +# shellcheck source=/dev/null +. "$NAMES" + +check_group() { + group="$1" + list="$(printf '%s\n' $2 | tr '\n' ' ')" + declared="$(printf '%s\n' $3 | tr '\n' ' ')" + missing="" + extra="" + + for name in $declared; do + case " $list " in + *" $name "*) ;; + *) missing="$missing $name" ;; + esac + done + + for name in $list; do + case " $declared " in + *" $name "*) ;; + *) extra="$extra $name" ;; + esac + done + + if [ -z "$missing$extra" ]; then + echo "PASS: $group inventory matches firewall_post.ut" + else + [ -n "$missing" ] && echo "FAIL: $group declared in firewall_post.ut but missing from fw4_names.sh:$missing" + [ -n "$extra" ] && echo "FAIL: $group listed in fw4_names.sh but not declared in firewall_post.ut:$extra" + FAILED=1 + fi +} + +post_chains="$(grep -oE '^chain homeproxy_[a-z0-9_]+' "$POST" | awk '{print $2}' | sort -u)" +post_sets="$(grep -oE '^set homeproxy_[a-z0-9_]+' "$POST" | awk '{print $2}' | sort -u)" + +check_group "chain" "$HP_FW4_CHAINS" "$post_chains" +check_group "set" "$HP_FW4_SETS" "$post_sets" + +# firewall_pre.uc only writes forward/input accept rules; it must not own any +# chain/set of its own. +pre_refs="$(grep -oE 'homeproxy_[a-z0-9_]+' "$PRE" | sort -u)" +if [ -n "$pre_refs" ]; then + echo "NOTE: firewall_pre.uc references fw4 objects:$pre_refs" +fi + +exit $FAILED diff --git a/luci-app-homeproxy/tests/ucode/test_generators.sh b/luci-app-homeproxy/tests/ucode/test_generators.sh new file mode 100755 index 000000000..2c06ff131 --- /dev/null +++ b/luci-app-homeproxy/tests/ucode/test_generators.sh @@ -0,0 +1,89 @@ +#!/bin/sh +# SPDX-License-Identifier: GPL-2.0-only +# +# Run generate_client.uc / generate_server.uc against the UCI fixtures and let +# sing-box validate the result. The generators read /etc/config and write +# /var/run, so this script materialises an isolated copy of them: homeproxy.uc +# is rewritten to point HP_DIR/RUN_DIR at a scratch directory, and the uci +# cursor is pointed at the fixture config. +# +# Usage: sh tests/ucode/test_generators.sh [work-dir] + +ROOT="${1:-.}" +WORK="${2:-/tmp/hp-generator-test}" + +ROOT="$(cd "$ROOT" && pwd)" +FAILED=0 + +run_case() { + name="$1" + fixture="$2" + generator="$3" + outfile="$4" + dir="$WORK/$name" + + rm -rf "$dir" + mkdir -p "$dir/config" "$dir/run" "$dir/scripts" "$dir/resources" "$dir/ruleset" + : > "$dir/resources/direct_list.txt" + : > "$dir/resources/proxy_list.txt" + + if grep -q "__RULESET_DIR__" "$fixture"; then + # The fixture needs a real local rule-set on disk. + printf '%s' '{"version":1,"rules":[{"domain_suffix":["example.com"]}]}' > "$dir/ruleset/src.json" + if ! sing-box rule-set compile "$dir/ruleset/src.json" -o "$dir/ruleset/test.srs"; then + echo "FAIL: $name: could not compile the local rule-set fixture" + FAILED=1 + return + fi + sed "s#__RULESET_DIR__#$dir/ruleset#" "$fixture" > "$dir/config/homeproxy" + else + cp "$fixture" "$dir/config/homeproxy" + fi + + sed -e "s#^export const HP_DIR = '/etc/homeproxy';#export const HP_DIR = '$dir';#" \ + -e "s#^export const RUN_DIR = '/var/run/homeproxy';#export const RUN_DIR = '$dir/run';#" \ + "$ROOT/root/etc/homeproxy/scripts/homeproxy.uc" > "$dir/scripts/homeproxy.uc" + + sed -e "s#const uci = cursor();#const uci = cursor('$dir/config');#" \ + "$ROOT/root/etc/homeproxy/scripts/$generator" > "$dir/scripts/$generator" + + if ! ( cd "$dir/scripts" && ucode "$generator" ); then + echo "FAIL: $name: $generator exited non-zero" + FAILED=1 + return + fi + + if [ ! -f "$dir/run/$outfile" ]; then + echo "FAIL: $name: $outfile was not generated" + FAILED=1 + return + fi + + if ! sing-box check --config "$dir/run/$outfile"; then + echo "FAIL: $name: sing-box rejected the generated $outfile" + FAILED=1 + return + fi + + echo "PASS: $name ($(wc -c < "$dir/run/$outfile") bytes)" +} + +run_case client "$ROOT/tests/fixtures/generators/client.uci" generate_client.uc sing-box-c.json + +# The preset remote rule-sets must be fetched through the node. A direct +# download depends on the CDN staying reachable from mainland China and fails +# intermittently under DNS pollution, which shows up as "open connection to +# :443 using outbound/direct[direct]: i/o timeout" in sing-box-c.log. +if grep -q '"detour": "direct-out"' "$WORK/client/run/sing-box-c.json"; then + echo "FAIL: client: a remote rule-set would still be downloaded directly" + FAILED=1 +fi +if ! grep -q '"detour": "main-out"' "$WORK/client/run/sing-box-c.json"; then + echo "FAIL: client: no remote rule-set is configured to download through main-out" + FAILED=1 +fi + +run_case custom "$ROOT/tests/fixtures/generators/custom.uci" generate_client.uc sing-box-c.json +run_case server "$ROOT/tests/fixtures/generators/server.uci" generate_server.uc sing-box-s.json + +exit $FAILED diff --git a/luci-app-homeproxy/tests/ucode/test_homeproxy_utils.uc b/luci-app-homeproxy/tests/ucode/test_homeproxy_utils.uc new file mode 100644 index 000000000..f46587a5e --- /dev/null +++ b/luci-app-homeproxy/tests/ucode/test_homeproxy_utils.uc @@ -0,0 +1,80 @@ +#!/usr/bin/ucode +/* + * SPDX-License-Identifier: GPL-2.0-only + * + * Copyright (C) 2025 ImmortalWrt.org + * + * Regression tests for homeproxy.uc helpers, focused on executeCommand(): + * return shape, stderr/exit-code capture, binary detection and (most + * importantly) that the temporary descriptors are closed on every run. + */ + +'use strict'; + +import { lsdir } from 'fs'; +import { executeCommand, isValidPEM, shellQuote } from 'homeproxy'; + +let failures = 0, + checks = 0; + +function expect(name, actual, want) { + checks++; + if (sprintf('%J', actual) !== sprintf('%J', want)) { + printf('FAIL %s: expected %J, got %J\n', name, want, actual); + failures++; + } +} + +function fd_count() { + let n = 0; + for (let _entry in lsdir('/proc/self/fd')) + n++; + return n; +} + +/* successful command */ +const ok = executeCommand('echo', 'hello'); +expect('ok.exitcode', ok.exitcode, 0); +expect('ok.stdout', ok.stdout, 'hello\n'); +expect('ok.stderr', ok.stderr, ''); +expect('ok.binary', ok.binary, false); +expect('ok.command', ok.command, 'echo hello'); + +/* failing command keeps stderr and the exit code */ +const bad = executeCommand('sh', '-c', shellQuote('echo oops >&2; exit 3')); +expect('bad.exitcode', bad.exitcode, 3); +expect('bad.stderr', bad.stderr, 'oops\n'); +expect('bad.stdout', bad.stdout, ''); + +/* nondescript exit code */ +expect('false.exitcode', executeCommand('false').exitcode, 1); + +/* binary output is detected and withheld */ +const bin = executeCommand('sh', '-c', shellQuote('printf "\\001\\002\\003"')); +expect('bin.binary', bin.binary, true); +expect('bin.stdout', bin.stdout, null); + +/* isValidPEM(): certificate vs private key, boundaries and body */ +const pem_cert = '-----BEGIN CERTIFICATE-----\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n-----END CERTIFICATE-----'; +const pem_key = '-----BEGIN RSA PRIVATE KEY-----\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n-----END RSA PRIVATE KEY-----'; +expect('pem.cert', isValidPEM(pem_cert, false), true); +expect('pem.cert-as-key', isValidPEM(pem_cert, true), false); +expect('pem.key', isValidPEM(pem_key, true), true); +expect('pem.key-as-cert', isValidPEM(pem_key, false), false); +expect('pem.garbage', isValidPEM('not a pem at all', false), false); +expect('pem.empty', isValidPEM('', false), false); + +/* descriptors must not leak across calls */ +const before = fd_count(); +for (let i = 0; i < 200; i++) + executeCommand('true'); +const after = fd_count(); + +checks++; +if (after > before) { + printf('FAIL descriptor leak: %d -> %d after 200 calls\n', before, after); + failures++; +} + +printf('%d checks, %d failures\n', checks, failures); +exit(failures === 0 ? 0 : 1); diff --git a/luci-app-homeproxy/tests/ucode/test_homeproxy_utils_inject.uc b/luci-app-homeproxy/tests/ucode/test_homeproxy_utils_inject.uc new file mode 100644 index 000000000..a81722d7b --- /dev/null +++ b/luci-app-homeproxy/tests/ucode/test_homeproxy_utils_inject.uc @@ -0,0 +1,53 @@ +#!/usr/bin/ucode +/* + * SPDX-License-Identifier: GPL-2.0-only + * + * Copyright (C) 2025 ImmortalWrt.org + * + * Exceptional-path test for executeCommand(): the copy of homeproxy.uc staged + * next to this file has its `system()` call replaced by `die()`, so every call + * throws before the descriptors are read. ucode has no `finally`, so this + * checks that the catch block still closes both descriptors. + */ + +'use strict'; + +import { lsdir } from 'fs'; +import { executeCommand } from 'homeproxy'; + +let failures = 0; + +function fd_count() { + let n = 0; + for (let _entry in lsdir('/proc/self/fd')) + n++; + return n; +} + +const before = fd_count(); +let caught = 0; + +for (let i = 0; i < 50; i++) { + try { + executeCommand('true'); + } catch (e) { + caught++; + } +} + +const after = fd_count(); + +if (caught !== 50) { + printf('FAIL: expected 50 propagated exceptions, got %d\n', caught); + failures++; +} + +if (after > before) { + printf('FAIL descriptor leak on the exceptional path: %d -> %d\n', before, after); + failures++; +} + +if (failures === 0) + printf('PASS: injected failure propagated and both descriptors were closed\n'); + +exit(failures === 0 ? 0 : 1); diff --git a/luci-app-homeproxy/tests/ucode/test_parse_uri.uc b/luci-app-homeproxy/tests/ucode/test_parse_uri.uc new file mode 100644 index 000000000..8bab48f3c --- /dev/null +++ b/luci-app-homeproxy/tests/ucode/test_parse_uri.uc @@ -0,0 +1,170 @@ +#!/usr/bin/ucode +/* + * SPDX-License-Identifier: GPL-2.0-only + * + * Copyright (C) 2025 ImmortalWrt.org + * + * Unit tests for the share-link parsers in parse_uri.uc. Run through + * tests/ucode/run.sh, which stages parse_uri.uc next to the mocked + * homeproxy.uc. + */ + +'use strict'; + +import { parse_uri } from 'parse_uri'; + +const FEATURES = { with_quic: true, with_utls: true }; +const NO_QUIC = { with_quic: false, with_utls: true }; +const LOG = (..._args) => {}; + +let failures = 0, + checks = 0; + +function expect_fields(name, cfg, expected) { + if (type(cfg) !== 'object') { + printf('FAIL %s: expected an object, got %J\n', name, cfg); + failures++; + return; + } + + for (let key in expected) { + checks++; + if (sprintf('%J', cfg[key]) !== sprintf('%J', expected[key])) { + printf('FAIL %s: %s expected %J, got %J\n', name, key, expected[key], cfg[key]); + failures++; + } + } +} + +function expect_null(name, cfg) { + checks++; + if (cfg !== null) { + printf('FAIL %s: expected null, got %J\n', name, cfg); + failures++; + } +} + +/* anytls */ +expect_fields('anytls', parse_uri('anytls://secret@a.example.com:443?sni=a.example.com&insecure=1#AnyTLS-Node', FEATURES, LOG), { + label: 'AnyTLS-Node', type: 'anytls', address: 'a.example.com', port: '443', + password: 'secret', tls: '1', tls_sni: 'a.example.com', tls_insecure: '1' +}); + +/* http / https */ +expect_fields('https', parse_uri('https://user:pass@b.example.com:8443#HTTPS-Node', FEATURES, LOG), { + label: 'HTTPS-Node', type: 'http', address: 'b.example.com', port: '8443', + username: 'user', password: 'pass', tls: '1' +}); +expect_fields('http', parse_uri('http://c.example.com:8080#HTTP-Node', FEATURES, LOG), { + label: 'HTTP-Node', type: 'http', address: 'c.example.com', port: '8080', tls: '0' +}); + +/* hysteria */ +expect_fields('hysteria', parse_uri('hysteria://d.example.com:36712?auth=pass&peer=d.example.com&insecure=1&upmbps=100&downmbps=200&alpn=h3&protocol=udp#Hy1', FEATURES, LOG), { + label: 'Hy1', type: 'hysteria', address: 'd.example.com', port: '36712', + hysteria_protocol: 'udp', hysteria_auth_type: 'string', hysteria_auth_payload: 'pass', + hysteria_up_mbps: '100', hysteria_down_mbps: '200', + tls: '1', tls_insecure: '1', tls_sni: 'd.example.com', tls_alpn: 'h3' +}); + +/* hysteria2 */ +expect_fields('hysteria2', parse_uri('hysteria2://pass@e.example.com:443?sni=e.example.com&obfs=salamander&obfs-password=op#Hy2', FEATURES, LOG), { + label: 'Hy2', type: 'hysteria2', address: 'e.example.com', port: '443', + password: 'pass', hysteria_obfs_type: 'salamander', hysteria_obfs_password: 'op', + tls: '1', tls_insecure: '0', tls_sni: 'e.example.com' +}); +expect_fields('hy2-alias', parse_uri('hy2://pass@e.example.com:443#Hy2Alias', FEATURES, LOG), { + label: 'Hy2Alias', type: 'hysteria2', address: 'e.example.com', port: '443' +}); + +/* snell */ +expect_fields('snell', parse_uri('snell://f.example.com:443?psk=pskvalue&version=4&obfs=http&obfs-host=bing.com&reuse=1#Snell', FEATURES, LOG), { + label: 'Snell', type: 'snell', address: 'f.example.com', port: '443', + password: 'pskvalue', snell_version: '4', snell_obfs_mode: 'http', + snell_obfs_host: 'bing.com', snell_reuse: '1' +}); + +/* socks */ +expect_fields('socks5', parse_uri('socks5://user:pass@g.example.com:1080#Socks', FEATURES, LOG), { + label: 'Socks', type: 'socks', address: 'g.example.com', port: '1080', + username: 'user', password: 'pass', socks_version: '5' +}); +expect_fields('socks4', parse_uri('socks4://h.example.com:1080#Socks4', FEATURES, LOG), { + socks_version: '4' +}); + +/* shadowsocks: SIP002 with base64 user info */ +expect_fields('ss-sip002-b64', parse_uri('ss://YWVzLTI1Ni1nY206cGFzc3dvcmQ=@i.example.com:8388#SS-Node', FEATURES, LOG), { + label: 'SS-Node', type: 'shadowsocks', address: 'i.example.com', port: '8388', + shadowsocks_encrypt_method: 'aes-256-gcm', password: 'password' +}); + +/* shadowsocks: SIP002 with plugin */ +expect_fields('ss-sip002-plugin', parse_uri('ss://YWVzLTI1Ni1nY206cGFzc3dvcmQ=@j.example.com:8388?plugin=simple-obfs%3Bobfs%3Dhttp#SS-Plugin', FEATURES, LOG), { + label: 'SS-Plugin', type: 'shadowsocks', address: 'j.example.com', port: '8388', + shadowsocks_plugin: 'obfs-local', shadowsocks_plugin_opts: 'obfs=http' +}); + +/* shadowsocks: Shadowrocket whole-payload base64 */ +expect_fields('ss-shadowrocket', parse_uri('ss://YWVzLTI1Ni1nY206cGFzc3dvcmRAay5leGFtcGxlLmNvbTo4Mzg4#SS-SR', FEATURES, LOG), { + label: 'SS-SR', type: 'shadowsocks', address: 'k.example.com', port: '8388', + shadowsocks_encrypt_method: 'aes-256-gcm', password: 'password' +}); + +/* trojan */ +expect_fields('trojan-ws', parse_uri('trojan://pass@l.example.com:443?type=ws&host=l.example.com&path=%2Fpath%3Fed%3D2048&sni=l.example.com#TrojanWs', FEATURES, LOG), { + label: 'TrojanWs', type: 'trojan', address: 'l.example.com', port: '443', password: 'pass', + transport: 'ws', ws_host: 'l.example.com', ws_path: '/path', + websocket_early_data: '2048', websocket_early_data_header: 'Sec-WebSocket-Protocol', + tls: '1', tls_sni: 'l.example.com' +}); +expect_fields('trojan-grpc', parse_uri('trojan://pass@l.example.com:443?type=grpc&serviceName=gs#TrojanGrpc', FEATURES, LOG), { + transport: 'grpc', grpc_servicename: 'gs' +}); + +/* tuic */ +expect_fields('tuic', parse_uri('tuic://tuic-uuid:pass@m.example.com:443?congestion_control=bbr&udp_relay_mode=native&alpn=h3&sni=m.example.com#Tuic', FEATURES, LOG), { + label: 'Tuic', type: 'tuic', address: 'm.example.com', port: '443', + uuid: 'tuic-uuid', password: 'pass', tuic_congestion_control: 'bbr', + tuic_udp_relay_mode: 'native', tls: '1', tls_sni: 'm.example.com', tls_alpn: [ 'h3' ] +}); + +/* vless */ +expect_fields('vless-reality-grpc', parse_uri('vless://vless-uuid@n.example.com:443?security=reality&pbk=PUBKEY&sid=abcd&fp=chrome&type=grpc&serviceName=gs&sni=n.example.com&flow=xtls-rprx-vision#Vless', FEATURES, LOG), { + label: 'Vless', type: 'vless', address: 'n.example.com', port: '443', uuid: 'vless-uuid', + transport: 'grpc', grpc_servicename: 'gs', tls: '1', tls_sni: 'n.example.com', + tls_reality: '1', tls_reality_public_key: 'PUBKEY', tls_reality_short_id: 'abcd', + tls_utls: 'chrome', vless_flow: 'xtls-rprx-vision' +}); +expect_fields('vless-ws-early-data', parse_uri('vless://vless-uuid@o.example.com:443?security=tls&type=ws&host=o.example.com&path=%2Fws%3Fed%3D1024&sni=o.example.com&alpn=h2%2Chttp%2F1.1#VlessWs', FEATURES, LOG), { + type: 'vless', transport: 'ws', ws_host: 'o.example.com', ws_path: '/ws', + websocket_early_data: '1024', websocket_early_data_header: 'Sec-WebSocket-Protocol', + tls: '1', tls_alpn: [ 'h2', 'http/1.1' ] +}); + +/* vmess */ +expect_fields('vmess-ws', parse_uri('vmess://eyJ2IjoiMiIsInBzIjoiVk1lc3MiLCJhZGQiOiJwLmV4YW1wbGUuY29tIiwicG9ydCI6IjQ0MyIsImlkIjoiM2FmODg1NjEtOWM2OS00YjE5LThmN2UtZjA4ZDU4MGJjMzM5IiwiYWlkIjoiMCIsIm5ldCI6IndzIiwidHlwZSI6Im5vbmUiLCJob3N0IjoicC5leGFtcGxlLmNvbSIsInBhdGgiOiIvd3MiLCJ0bHMiOiJ0bHMiLCJzbmkiOiJwLmV4YW1wbGUuY29tIn0=', FEATURES, LOG), { + label: 'VMess', type: 'vmess', address: 'p.example.com', port: '443', + uuid: '3af88561-9c69-4b19-8f7e-f08d580bc339', vmess_alterid: '0', vmess_encrypt: 'auto', + vmess_global_padding: '1', transport: 'ws', ws_host: 'p.example.com', ws_path: '/ws', + tls: '1', tls_sni: 'p.example.com' +}); + +/* sip008 object */ +expect_fields('sip008', parse_uri({ + nodetype: 'sip008', remarks: 'SIP008', server: 'q.example.com', server_port: 8388, + method: 'aes-256-gcm', password: 'pw' +}, FEATURES, LOG), { + label: 'SIP008', type: 'shadowsocks', address: 'q.example.com', port: 8388, + shadowsocks_encrypt_method: 'aes-256-gcm', password: 'pw' +}); + +/* rejection paths */ +expect_null('vless-kcp-unsupported', parse_uri('vless://u@r.example.com:443?type=kcp#Kcp', FEATURES, LOG)); +expect_null('hysteria-without-quic', parse_uri('hysteria://s.example.com:443?auth=a#NoQuic', NO_QUIC, LOG)); +expect_null('tuic-without-quic', parse_uri('tuic://u:p@s.example.com:443#NoQuic', NO_QUIC, LOG)); +expect_null('invalid-port', parse_uri('vless://u@t.example.com:99999?security=tls#BadPort', FEATURES, LOG)); +expect_null('unknown-scheme', parse_uri('unknown://u@t.example.com:443', FEATURES, LOG)); + +printf('%d checks, %d failures\n', checks, failures); +exit(failures === 0 ? 0 : 1); diff --git a/luci-app-passwall/Makefile b/luci-app-passwall/Makefile index a89be1858..65f5a12dd 100644 --- a/luci-app-passwall/Makefile +++ b/luci-app-passwall/Makefile @@ -8,7 +8,7 @@ include $(TOPDIR)/rules.mk PKG_NAME:=luci-app-passwall PKG_VERSION:=26.9.9 -PKG_RELEASE:=273 +PKG_RELEASE:=274 PKG_PO_VERSION:=$(PKG_VERSION) PKG_CONFIG_DEPENDS:= \ diff --git a/luci-app-passwall/luasrc/passwall/util_sing-box.lua b/luci-app-passwall/luasrc/passwall/util_sing-box.lua index 31895d26f..697e78480 100644 --- a/luci-app-passwall/luasrc/passwall/util_sing-box.lua +++ b/luci-app-passwall/luasrc/passwall/util_sing-box.lua @@ -93,15 +93,11 @@ function gen_outbound(flag, node, tag, proxy_table) end local remarks = node.remarks - local proxy_tag = nil - local fragment = nil - local record_fragment = nil - local run_socks_instance = true + local proxy_tag, fragment, record_fragment if proxy_table ~= nil and type(proxy_table) == "table" then proxy_tag = proxy_table.tag or nil fragment = (proxy_table.fragment and node.protocol ~= "naive" and not node.hysteria2_realms) and true or nil record_fragment = (proxy_table.record_fragment and node.protocol ~= "naive" and not node.hysteria2_realms) and true or nil - run_socks_instance = proxy_table.run_socks_instance end if node.type ~= "sing-box" then @@ -110,7 +106,12 @@ function gen_outbound(flag, node, tag, proxy_table) proxy_tag = "socks <- " .. node_id else local new_port - if run_socks_instance then + local run_socks_instance = true + if NO_RUN then + TMP_PORT = TMP_PORT and TMP_PORT + 1 or 3001 + new_port = TMP_PORT + run_socks_instance = nil + else local relay_port = (proxy_tag and node.port) and tostring(node.port) or "" if relay_port == "" then local cache = api.get_socks_port_by_cache(node_id) @@ -140,9 +141,6 @@ function gen_outbound(flag, node, tag, proxy_table) api.set_socks_port_to_cache(node_id, new_port) end end - else - TMP_PORT = TMP_PORT and TMP_PORT + 1 or 3001 -- 导出配置时作为演示 - new_port = TMP_PORT end if new_port then node = { @@ -1163,10 +1161,11 @@ function gen_config(var) local dns_cache = var["dns_cache"] local dns_socks_address = var["dns_socks_address"] local dns_socks_port = var["dns_socks_port"] - local no_run = var["no_run"] local use_proxy_list = var["use_proxy_list"] local use_gfw_list = var["use_gfw_list"] local chn_list = var["chn_list"] + local run_in_global = var["run_in_global"] + NO_RUN = var["no_run"] local dns_domain_rules = {} local dns = nil @@ -1360,7 +1359,9 @@ function gen_config(var) ut_nodes = _node.urltest_node end - -- api.log(" - 加载 Sing-Box URLTest 节点【" .. (_node.remarks or "") .. "】,子节点数量:" .. #(ut_nodes or {})) + if not NO_RUN and run_in_global then + api.log(" - 加载 Sing-Box URLTest 节点【" .. (_node.remarks or "") .. "】,子节点数量:" .. #(ut_nodes or {})) + end local valid_nodes = {} for i = 1, #(ut_nodes or {}) do @@ -1375,7 +1376,7 @@ function gen_config(var) end end if is_new_ut_node then - local outboundTag = gen_outbound_get_tag(flag, ut_node_id, ut_node_tag, { fragment = singbox_settings.fragment == "1" or nil, record_fragment = singbox_settings.record_fragment == "1" or nil, run_socks_instance = not no_run }) + local outboundTag = gen_outbound_get_tag(flag, ut_node_id, ut_node_tag, { fragment = singbox_settings.fragment == "1" or nil, record_fragment = singbox_settings.record_fragment == "1" or nil }) if outboundTag then valid_nodes[#valid_nodes + 1] = outboundTag end @@ -1478,7 +1479,6 @@ function gen_config(var) to_node.port = new_port to_outbound = gen_outbound(node[".name"], to_node, tag, { tag = tag, - run_socks_instance = not no_run }) else to_outbound = gen_outbound(node[".name"], to_node) @@ -1571,7 +1571,6 @@ function gen_config(var) local proxy_table = { fragment = singbox_settings.fragment == "1", record_fragment = singbox_settings.record_fragment == "1", - run_socks_instance = not no_run, } local preproxy_node_id = node[rule_name .. "_proxy_tag"] if preproxy_node_id == _node_id then preproxy_node_id = nil end @@ -1855,7 +1854,6 @@ function gen_config(var) COMMON.default_outbound_tag = gen_outbound_get_tag(flag, node or node_id, nil, { fragment = singbox_settings.fragment == "1" or nil, record_fragment = singbox_settings.record_fragment == "1" or nil, - run_socks_instance = not no_run }) end @@ -2316,7 +2314,7 @@ function gen_config(var) routing_mark = 255, }) for index, value in ipairs(config.outbounds) do - if not value["_flag_proxy_tag"] and not value.detour and value["_id"] and value.server and (value.server_port or value.server_ports) and not no_run then + if not value["_flag_proxy_tag"] and not value.detour and value["_id"] and value.server and (value.server_port or value.server_ports) and not NO_RUN then sys.call(string.format("echo '%s' >> %s", value["_id"], api.TMP_PATH .. "/direct_node_list")) end if not value.detour and not value.bind_interface and value.server then @@ -2464,7 +2462,7 @@ if arg[1] then var = jsonc.parse(arg[2]) end print(func(var)) - if (next(GEO_VAR.SITE_TAGS) or next(GEO_VAR.IP_TAGS)) and not no_run then + if (next(GEO_VAR.SITE_TAGS) or next(GEO_VAR.IP_TAGS)) and not NO_RUN then convert_geofile() end end diff --git a/luci-app-passwall/luasrc/passwall/util_xray.lua b/luci-app-passwall/luasrc/passwall/util_xray.lua index ebeeec547..e87d54153 100644 --- a/luci-app-passwall/luasrc/passwall/util_xray.lua +++ b/luci-app-passwall/luasrc/passwall/util_xray.lua @@ -43,16 +43,11 @@ function gen_outbound(flag, node, tag, proxy_table) end local remarks = node.remarks - local proxy_tag = nil - local dialer_proxy_tag = nil - local fragment = nil - local noise = nil - local run_socks_instance = true + local proxy_tag, dialer_proxy_tag, fragment, noise if proxy_table ~= nil and type(proxy_table) == "table" then proxy_tag = proxy_table.tag or nil fragment = (proxy_table.fragment and not node.hysteria2_realms) and true or nil noise = (proxy_table.noise and not node.hysteria2_realms) and true or nil - run_socks_instance = proxy_table.run_socks_instance end if node.type ~= "Xray" then @@ -61,7 +56,12 @@ function gen_outbound(flag, node, tag, proxy_table) node.transport = "raw" else local new_port - if run_socks_instance then + local run_socks_instance = true + if NO_RUN then + TMP_PORT = TMP_PORT and TMP_PORT + 1 or 3001 + new_port = TMP_PORT + run_socks_instance = nil + else local relay_port = (proxy_tag and node.port) and tostring(node.port) or "" if relay_port == "" then local cache = api.get_socks_port_by_cache(node_id) @@ -91,9 +91,6 @@ function gen_outbound(flag, node, tag, proxy_table) api.set_socks_port_to_cache(node_id, new_port) end end - else - TMP_PORT = TMP_PORT and TMP_PORT + 1 or 3001 -- 导出配置时作为演示 - new_port = TMP_PORT end if new_port then node = {} @@ -913,10 +910,11 @@ function gen_config(var) local dns_socks_address = var["dns_socks_address"] local dns_socks_port = var["dns_socks_port"] local loglevel = var["loglevel"] or "warning" - local no_run = var["no_run"] local use_proxy_list = var["use_proxy_list"] local use_gfw_list = var["use_gfw_list"] local chn_list = var["chn_list"] + local run_in_global = var["run_in_global"] + NO_RUN = var["no_run"] local dns_domain_rules = {} local dns = nil @@ -1091,7 +1089,9 @@ function gen_config(var) blc_nodes = _node.balancing_node end - -- api.log(" - 加载 Xray 负载均衡 节点【" .. (_node.remarks or "") .. "】,子节点数量:" .. #(blc_nodes or {})) + if not NO_RUN and run_in_global then + api.log(" - 加载 Xray 负载均衡 节点【" .. (_node.remarks or "") .. "】,子节点数量:" .. #(blc_nodes or {})) + end local valid_nodes = {} for i = 1, #(blc_nodes or {}) do @@ -1106,7 +1106,7 @@ function gen_config(var) end end if is_new_blc_node then - local outboundTag = gen_outbound_get_tag(flag, blc_node_id, blc_node_tag, { fragment = xray_settings.fragment == "1" or nil, noise = xray_settings.noise == "1" or nil, run_socks_instance = not no_run }) + local outboundTag = gen_outbound_get_tag(flag, blc_node_id, blc_node_tag, { fragment = xray_settings.fragment == "1" or nil, noise = xray_settings.noise == "1" or nil }) if outboundTag then valid_nodes[#valid_nodes + 1] = outboundTag end @@ -1135,7 +1135,7 @@ function gen_config(var) local fallback_node = get_node_by_id(fallback_node_id) if fallback_node then if fallback_node.protocol ~= "_balancing" then - local outboundTag = gen_outbound_get_tag(flag, fallback_node, fallback_node_id, { fragment = xray_settings.fragment == "1" or nil, noise = xray_settings.noise == "1" or nil, run_socks_instance = not no_run }) + local outboundTag = gen_outbound_get_tag(flag, fallback_node, fallback_node_id, { fragment = xray_settings.fragment == "1" or nil, noise = xray_settings.noise == "1" or nil }) if outboundTag then fallback_node_tag = outboundTag end @@ -1267,7 +1267,6 @@ function gen_config(var) }) to_outbound = gen_outbound(node[".name"], to_node, to_node[".name"], { tag = to_node[".name"], - run_socks_instance = not no_run }) else to_outbound = gen_outbound(node[".name"], to_node) @@ -1375,7 +1374,6 @@ function gen_config(var) local proxy_table = { fragment = xray_settings.fragment == "1", noise = xray_settings.noise == "1", - run_socks_instance = not no_run, } local preproxy_node_id = node[rule_name .. "_proxy_tag"] if preproxy_node_id == _node_id then preproxy_node_id = nil end @@ -1577,7 +1575,6 @@ function gen_config(var) COMMON.default_outbound_tag = gen_outbound_get_tag(flag, node or node_id, nil, { fragment = xray_settings.fragment == "1" or nil, noise = xray_settings.noise == "1" or nil, - run_socks_instance = not no_run }) if COMMON.default_outbound_tag then routing = { @@ -2073,7 +2070,7 @@ function gen_config(var) for index, value in ipairs(config.outbounds) do local pt = value.protocol local exclude = { blackhole=1, dns=1, freedom=1, loopback=1 } - if not value["_flag_proxy_tag"] and value["_id"] and pt and not exclude[pt] and not no_run then + if not value["_flag_proxy_tag"] and value["_id"] and pt and not exclude[pt] and not NO_RUN then sys.call(string.format("echo '%s' >> %s", value["_id"], api.TMP_PATH .. "/direct_node_list")) end for k, v in pairs(config.outbounds[index]) do diff --git a/luci-app-passwall/root/usr/share/passwall/app.sh b/luci-app-passwall/root/usr/share/passwall/app.sh index cee2811be..8daf595ad 100755 --- a/luci-app-passwall/root/usr/share/passwall/app.sh +++ b/luci-app-passwall/root/usr/share/passwall/app.sh @@ -87,7 +87,7 @@ run_ipt2socks() { run_singbox() { local flag type node redir_port tcp_proxy_way socks_address socks_port socks_username socks_password http_address http_port http_username http_password local dns_listen_port direct_dns_query_strategy direct_dns_port direct_dns_udp_server direct_dns_tcp_server remote_dns_protocol remote_dns_udp_server remote_dns_tcp_server remote_dns_doh remote_dns_client_ip remote_fakedns remote_dns_query_strategy remote_rewrite_ttl dns_cache dns_socks_address dns_socks_port - local loglevel log_file config_file server_host server_port no_run use_proxy_list use_gfw_list chn_list + local loglevel log_file config_file server_host server_port no_run use_proxy_list use_gfw_list chn_list run_in_global eval_set_val "$@" [ -z "$type" ] && { type=$(echo $(config_n_get $node type) | tr 'A-Z' 'a-z') @@ -182,13 +182,17 @@ run_singbox() { [ "$remote_fakedns" = "1" ] && json_add_string "remote_dns_fake" "1" [ -n "$remote_rewrite_ttl" ] && json_add_string "remote_rewrite_ttl" "${remote_rewrite_ttl}" [ -n "$no_run" ] && json_add_string "no_run" "1" + [ -n "$run_in_global" ] && json_add_string "run_in_global" "1" local _json_arg="$(json_dump)" lua $UTIL_SINGBOX gen_config "${_json_arg}" > $config_file [ -n "$no_run" ] && return local test_log_file=$log_file + local status=0 [ "$test_log_file" = "/dev/null" ] && test_log_file="${TMP_PATH}/${config_file##*/}_test.log" - $SINGBOX_BIN check -c "$config_file" > $test_log_file 2>&1; local status=$? + [ -n "$run_in_global" ] && { + $SINGBOX_BIN check -c "$config_file" > $test_log_file 2>&1; status=$? + } if [ "${status}" = 0 ]; then ln_run "$SINGBOX_BIN" "sing-box" "${log_file}" run -c "$config_file" else @@ -201,7 +205,7 @@ run_singbox() { run_xray() { local flag type node redir_port tcp_proxy_way socks_address socks_port socks_username socks_password http_address http_port http_username http_password local dns_listen_port direct_dns_query_strategy direct_dns_port direct_dns_udp_server direct_dns_tcp_server remote_dns_protocol remote_dns_udp_server remote_dns_tcp_server remote_dns_doh remote_dns_client_ip remote_fakedns remote_dns_query_strategy dns_cache dns_socks_address dns_socks_port - local loglevel log_file config_file server_host server_port no_run use_proxy_list use_gfw_list chn_list + local loglevel log_file config_file server_host server_port no_run use_proxy_list use_gfw_list chn_list run_in_global eval_set_val "$@" [ -z "$type" ] && { type=$(echo $(config_n_get $node type) | tr 'A-Z' 'a-z') @@ -278,13 +282,17 @@ run_xray() { json_add_string "loglevel" "$loglevel" [ -n "$no_run" ] && json_add_string "no_run" "1" + [ -n "$run_in_global" ] && json_add_string "run_in_global" "1" local _json_arg="$(json_dump)" lua $UTIL_XRAY gen_config "${_json_arg}" > $config_file [ -n "$no_run" ] && return local test_log_file=$log_file + local status=0 [ "$test_log_file" = "/dev/null" ] && test_log_file="${TMP_PATH}/${config_file##*/}_test.log" - $XRAY_BIN run -test -c "$config_file" > $test_log_file; local status=$? + [ -n "$run_in_global" ] && { + $XRAY_BIN run -test -c "$config_file" > $test_log_file; status=$? + } if [ "${status}" = 0 ]; then ln_run "$XRAY_BIN" "xray" "${log_file}" run -c "$config_file" else @@ -599,7 +607,7 @@ start_global() { ;; sing-box) local _flag="global" - local _args="" + local _args="run_in_global=1" [ "$on_node_socks" = "1" ] && { node_socks_flag=1 _args="${_args} socks_address=${node_socks_bind} socks_port=${GLOBAL_SOCKS_port}" @@ -677,7 +685,7 @@ start_global() { ;; xray) local _flag="global" - local _args="" + local _args="run_in_global=1" [ "$on_node_socks" = "1" ] && { node_socks_flag=1 _args="${_args} socks_address=${node_socks_bind} socks_port=${GLOBAL_SOCKS_port}" diff --git a/mise/Makefile b/mise/Makefile index b04e1a0e7..08a6026b1 100644 --- a/mise/Makefile +++ b/mise/Makefile @@ -14,8 +14,8 @@ MISE_HASH_x86_64:=3832f39c325e343f81fe3d92b2447c5d1a5eea1bc85092bb7b6c2580622264 MISE_HASH_aarch64:=06186cfbfe947049b21d58575fb0ea800cc26ed1375f20f4b678cb3a9d679437 PKG_NAME:=mise -PKG_VERSION:=2026.9.8 -PKG_RELEASE:=14 +PKG_VERSION:=2026.9.9 +PKG_RELEASE:=15 PKG_SOURCE:=$(PKG_NAME)-v$(PKG_VERSION)-linux-$(MISE_ARCH)-musl.tar.gz PKG_SOURCE_URL:=https://github.com/jdx/mise/releases/download/v$(PKG_VERSION)/ PKG_HASH:=skip diff --git a/sing-box/Makefile b/sing-box/Makefile index 048503038..8fd5f8441 100644 --- a/sing-box/Makefile +++ b/sing-box/Makefile @@ -6,7 +6,7 @@ include $(TOPDIR)/rules.mk PKG_NAME:=sing-box PKG_VERSION:=1.14.1 -PKG_RELEASE:=33 +PKG_RELEASE:=34 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz PKG_SOURCE_URL:=https://codeload.github.com/SagerNet/sing-box/tar.gz/v$(PKG_VERSION)? diff --git a/sing-box/patches/002-support-clash-proxy-providers.patch b/sing-box/patches/002-support-clash-proxy-providers.patch deleted file mode 100644 index 639069b9c..000000000 --- a/sing-box/patches/002-support-clash-proxy-providers.patch +++ /dev/null @@ -1,403 +0,0 @@ -diff --git a/experimental/clashapi/provider.go b/experimental/clashapi/provider.go -index 352b289..ef07e6d 100644 ---- a/experimental/clashapi/provider.go -+++ b/experimental/clashapi/provider.go -@@ -3,43 +3,65 @@ package clashapi - import ( - "context" - "net/http" -+ "os/exec" -+ "regexp" -+ -+ "github.com/sagernet/sing-box/option" - - "github.com/go-chi/chi/v5" - "github.com/go-chi/render" - ) - --func proxyProviderRouter() http.Handler { -+func proxyProviderRouter(server *Server) http.Handler { - r := chi.NewRouter() -- r.Get("/", getProviders) -+ r.Get("/", getProviders(server)) - - r.Route("/{name}", func(r chi.Router) { -- r.Use(parseProviderName, findProviderByName) -- r.Get("/", getProvider) -+ r.Use(parseProviderName, findProviderByName(server)) -+ r.Get("/", getProvider(server)) - r.Put("/", updateProvider) - r.Get("/healthcheck", healthCheckProvider) - }) - return r - } - --func getProviders(w http.ResponseWriter, r *http.Request) { -- render.JSON(w, r, render.M{ -- "providers": render.M{}, -- }) -+func getProviders(server *Server) func(w http.ResponseWriter, r *http.Request) { -+ return func(w http.ResponseWriter, r *http.Request) { -+ providers := render.M{} -+ for _, provider := range server.proxyProviders { -+ if provider.Name == "" { -+ continue -+ } -+ providers[provider.Name] = proxyProviderInfo(server, provider) -+ } -+ render.JSON(w, r, render.M{ -+ "providers": providers, -+ }) -+ } - } - --func getProvider(w http.ResponseWriter, r *http.Request) { -- /*provider := r.Context().Value(CtxKeyProvider).(provider.ProxyProvider) -- render.JSON(w, r, provider)*/ -- render.NoContent(w, r) -+func getProvider(server *Server) func(w http.ResponseWriter, r *http.Request) { -+ return func(w http.ResponseWriter, r *http.Request) { -+ provider := r.Context().Value(CtxKeyProvider).(option.ClashProxyProviderOptions) -+ render.JSON(w, r, proxyProviderInfo(server, provider)) -+ } - } - - func updateProvider(w http.ResponseWriter, r *http.Request) { -- /*provider := r.Context().Value(CtxKeyProvider).(provider.ProxyProvider) -- if err := provider.Update(); err != nil { -+ provider := r.Context().Value(CtxKeyProvider).(option.ClashProxyProviderOptions) -+ if !regexp.MustCompile(`^[0-9a-f]{32}$`).MatchString(provider.UpdateID) { -+ render.Status(r, http.StatusServiceUnavailable) -+ render.JSON(w, r, newError("Provider update is unavailable")) -+ return -+ } -+ -+ command := exec.Command("/bin/sh", "/etc/homeproxy/scripts/update_provider.sh", provider.UpdateID) -+ if err := command.Start(); err != nil { - render.Status(r, http.StatusServiceUnavailable) - render.JSON(w, r, newError(err.Error())) - return -- }*/ -+ } -+ _ = command.Process.Release() - render.NoContent(w, r) - } - -@@ -57,18 +79,58 @@ func parseProviderName(next http.Handler) http.Handler { - }) - } - --func findProviderByName(next http.Handler) http.Handler { -- return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { -- /*name := r.Context().Value(CtxKeyProviderName).(string) -- providers := tunnel.ProxyProviders() -- provider, exist := providers[name] -- if !exist {*/ -- render.Status(r, http.StatusNotFound) -- render.JSON(w, r, ErrNotFound) -- //return -- //} -+func findProviderByName(server *Server) func(next http.Handler) http.Handler { -+ return func(next http.Handler) http.Handler { -+ return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { -+ name := r.Context().Value(CtxKeyProviderName).(string) -+ for _, provider := range server.proxyProviders { -+ if provider.Name == name { -+ ctx := context.WithValue(r.Context(), CtxKeyProvider, provider) -+ next.ServeHTTP(w, r.WithContext(ctx)) -+ return -+ } -+ } -+ render.Status(r, http.StatusNotFound) -+ render.JSON(w, r, ErrNotFound) -+ }) -+ } -+} - -- // ctx := context.WithValue(r.Context(), CtxKeyProvider, provider) -- // next.ServeHTTP(w, r.WithContext(ctx)) -- }) -+func proxyProviderInfo(server *Server, provider option.ClashProxyProviderOptions) render.M { -+ providerType := provider.Type -+ if providerType == "" { -+ providerType = "Proxy" -+ } -+ vehicleType := provider.VehicleType -+ if vehicleType == "" { -+ vehicleType = "HTTP" -+ } -+ -+ proxies := make([]any, 0, len(provider.Proxies)) -+ for _, proxyName := range provider.Proxies { -+ proxy, exists := lookupProxyByName(server, proxyName) -+ if !exists { -+ continue -+ } -+ proxies = append(proxies, proxyInfo(server, proxy)) -+ } -+ -+ info := render.M{ -+ "name": provider.Name, -+ "type": providerType, -+ "vehicleType": vehicleType, -+ "proxies": proxies, -+ } -+ if provider.UpdatedAt != "" { -+ info["updatedAt"] = provider.UpdatedAt -+ } -+ if provider.SubscriptionInfo != nil { -+ info["subscriptionInfo"] = render.M{ -+ "Upload": provider.SubscriptionInfo.Upload, -+ "Download": provider.SubscriptionInfo.Download, -+ "Total": provider.SubscriptionInfo.Total, -+ "Expire": provider.SubscriptionInfo.Expire, -+ } -+ } -+ return info - } -diff --git a/experimental/clashapi/proxies.go b/experimental/clashapi/proxies.go -index ef88ff3..1f7d14d 100644 ---- a/experimental/clashapi/proxies.go -+++ b/experimental/clashapi/proxies.go -@@ -21,6 +21,50 @@ import ( - "github.com/go-chi/render" - ) - -+func proxyDisplayName(tag string) string { -+ switch tag { -+ case "GLOBAL": -+ return "GLOBAL" -+ case "main-out": -+ return "主代理" -+ case "main-udp-out": -+ return "UDP 主代理" -+ case "direct-out": -+ return "直连" -+ case "block-out": -+ return "拦截" -+ default: -+ return tag -+ } -+} -+ -+func lookupProxyByName(server *Server, name string) (adapter.Outbound, bool) { -+ proxy, exist := server.outbound.Outbound(name) -+ if exist { -+ return proxy, true -+ } -+ -+ for _, detour := range server.outbound.Outbounds() { -+ if proxyDisplayName(detour.Tag()) == name { -+ return detour, true -+ } -+ } -+ -+ for _, endpoint := range server.endpoint.Endpoints() { -+ if proxyDisplayName(endpoint.Tag()) == name { -+ return endpoint, true -+ } -+ } -+ -+ return nil, false -+} -+ -+func proxyDisplayNames(tags []string) []string { -+ return common.Map(tags, func(tag string) string { -+ return proxyDisplayName(tag) -+ }) -+} -+ - func proxyRouter(server *Server, router adapter.Router) http.Handler { - r := chi.NewRouter() - r.Get("/", getProxies(server)) -@@ -29,7 +73,7 @@ func proxyRouter(server *Server, router adapter.Router) http.Handler { - r.Use(parseProxyName, findProxyByName(server)) - r.Get("/", getProxy(server)) - r.Get("/delay", getProxyDelay(server)) -- r.Put("/", updateProxy) -+ r.Put("/", updateProxy(server)) - }) - return r - } -@@ -46,7 +90,7 @@ func findProxyByName(server *Server) func(next http.Handler) http.Handler { - return func(next http.Handler) http.Handler { - return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - name := r.Context().Value(CtxKeyProxyName).(string) -- proxy, exist := server.outbound.Outbound(name) -+ proxy, exist := lookupProxyByName(server, name) - if !exist { - render.Status(r, http.StatusNotFound) - render.JSON(w, r, ErrNotFound) -@@ -68,7 +112,7 @@ func proxyInfo(server *Server, detour adapter.Outbound) *badjson.JSONObject { - clashType = C.ProxyDisplayName(detour.Type()) - } - info.Put("type", clashType) -- info.Put("name", detour.Tag()) -+ info.Put("name", proxyDisplayName(detour.Tag())) - info.Put("udp", common.Contains(detour.Network(), N.NetworkUDP)) - delayHistory := server.urlTestHistory.LoadURLTestHistory(adapter.OutboundTag(detour)) - if delayHistory != nil { -@@ -77,8 +121,8 @@ func proxyInfo(server *Server, detour adapter.Outbound) *badjson.JSONObject { - info.Put("history", []*adapter.URLTestHistory{}) - } - if group, isGroup := detour.(adapter.OutboundGroup); isGroup { -- info.Put("now", group.Now()) -- info.Put("all", group.All()) -+ info.Put("now", proxyDisplayName(group.Now())) -+ info.Put("all", proxyDisplayNames(group.All())) - } - return &info - } -@@ -102,10 +146,10 @@ func getProxies(server *Server) func(w http.ResponseWriter, r *http.Request) { - case C.TypeDirect, C.TypeBlock, C.TypeDNS: - continue - } -- allProxies = append(allProxies, detour.Tag()) -+ allProxies = append(allProxies, proxyDisplayName(detour.Tag())) - } - -- defaultTag := server.outbound.Default().Tag() -+ defaultTag := proxyDisplayName(server.outbound.Default().Tag()) - - sort.SliceStable(allProxies, func(i, j int) bool { - return allProxies[i] == defaultTag -@@ -114,7 +158,7 @@ func getProxies(server *Server) func(w http.ResponseWriter, r *http.Request) { - // fix clash dashboard - proxyMap.Put("GLOBAL", map[string]any{ - "type": "Fallback", -- "name": "GLOBAL", -+ "name": proxyDisplayName("GLOBAL"), - "udp": true, - "history": []*adapter.URLTestHistory{}, - "all": allProxies, -@@ -126,7 +170,7 @@ func getProxies(server *Server) func(w http.ResponseWriter, r *http.Request) { - if detour.Tag() == "" { - tag = F.ToString(i) - } else { -- tag = detour.Tag() -+ tag = proxyDisplayName(detour.Tag()) - } - proxyMap.Put(tag, proxyInfo(server, detour)) - } -@@ -159,29 +203,36 @@ type UpdateProxyRequest struct { - Name string `json:"name"` - } - --func updateProxy(w http.ResponseWriter, r *http.Request) { -- req := UpdateProxyRequest{} -- if err := render.DecodeJSON(r.Body, &req); err != nil { -- render.Status(r, http.StatusBadRequest) -- render.JSON(w, r, ErrBadRequest) -- return -- } -+func updateProxy(server *Server) func(w http.ResponseWriter, r *http.Request) { -+ return func(w http.ResponseWriter, r *http.Request) { -+ req := UpdateProxyRequest{} -+ if err := render.DecodeJSON(r.Body, &req); err != nil { -+ render.Status(r, http.StatusBadRequest) -+ render.JSON(w, r, ErrBadRequest) -+ return -+ } - -- proxy := r.Context().Value(CtxKeyProxy).(adapter.Outbound) -- selector, ok := proxy.(*group.Selector) -- if !ok { -- render.Status(r, http.StatusBadRequest) -- render.JSON(w, r, newError("Must be a Selector")) -- return -- } -+ proxy := r.Context().Value(CtxKeyProxy).(adapter.Outbound) -+ selector, ok := proxy.(*group.Selector) -+ if !ok { -+ render.Status(r, http.StatusBadRequest) -+ render.JSON(w, r, newError("Must be a Selector")) -+ return -+ } - -- if !selector.SelectOutbound(req.Name) { -- render.Status(r, http.StatusBadRequest) -- render.JSON(w, r, newError("Selector update error: not found")) -- return -- } -+ selectedName := req.Name -+ if targetProxy, exist := lookupProxyByName(server, req.Name); exist { -+ selectedName = targetProxy.Tag() -+ } -+ -+ if !selector.SelectOutbound(selectedName) { -+ render.Status(r, http.StatusBadRequest) -+ render.JSON(w, r, newError("Selector update error: not found")) -+ return -+ } - -- render.NoContent(w, r) -+ render.NoContent(w, r) -+ } - } - - func getProxyDelay(server *Server) func(w http.ResponseWriter, r *http.Request) { -diff --git a/experimental/clashapi/server.go b/experimental/clashapi/server.go -index b9222ad5440..d4fd9dd3db1 100644 ---- a/experimental/clashapi/server.go -+++ b/experimental/clashapi/server.go -@@ -57,6 +57,7 @@ type Server struct { - externalUI string - externalUIDownloadURL string - externalUIDownloadDetour string -+ proxyProviders []option.ClashProxyProviderOptions - } - - func NewServer(ctx context.Context, logFactory log.ObservableFactory, options option.ClashAPIOptions) (adapter.LifecycleService, error) { -@@ -92,6 +93,7 @@ func NewServer(ctx context.Context, logFactory log.ObservableFactory, options op - externalController: options.ExternalController != "", - externalUIDownloadURL: options.ExternalUIDownloadURL, - externalUIDownloadDetour: options.ExternalUIDownloadDetour, -+ proxyProviders: options.ProxyProviders, - } - //goland:noinspection GoDeprecation - //nolint:staticcheck -@@ -120,7 +122,7 @@ func NewServer(ctx context.Context, logFactory log.ObservableFactory, options op - r.Mount("/proxies", proxyRouter(s, s.router)) - r.Mount("/rules", ruleRouter(s.router)) - r.Mount("/connections", connectionRouter(s.ctx, s.network, trafficManager)) -- r.Mount("/providers/proxies", proxyProviderRouter()) -+ r.Mount("/providers/proxies", proxyProviderRouter(s)) - r.Mount("/providers/rules", ruleProviderRouter()) - r.Mount("/script", scriptRouter()) - r.Mount("/profile", profileRouter()) -diff --git a/option/experimental.go b/option/experimental.go -index bf144ad4452..89f303a7b26 100644 ---- a/option/experimental.go -+++ b/option/experimental.go -@@ -34,6 +34,7 @@ type ClashAPIOptions struct { - ExternalUIDownloadDetour string `json:"external_ui_download_detour,omitempty" reference:"outbound"` - Secret string `json:"secret,omitempty"` - DefaultMode string `json:"default_mode,omitempty"` -+ ProxyProviders []ClashProxyProviderOptions `json:"proxy_providers,omitempty"` - AccessControlAllowOrigin badoption.Listable[string] `json:"access_control_allow_origin,omitempty"` - AccessControlAllowPrivateNetwork bool `json:"access_control_allow_private_network,omitempty"` - -@@ -49,6 +50,23 @@ type ClashAPIOptions struct { - StoreFakeIP bool `json:"store_fakeip,omitempty" schema:"omit"` - } - -+type ClashProxyProviderOptions struct { -+ Name string `json:"name,omitempty"` -+ Type string `json:"type,omitempty"` -+ VehicleType string `json:"vehicle_type,omitempty"` -+ Proxies []string `json:"proxies,omitempty"` -+ UpdatedAt string `json:"updated_at,omitempty"` -+ UpdateID string `json:"update_id,omitempty"` -+ SubscriptionInfo *ClashProxyProviderSubscriptionInfo `json:"subscription_info,omitempty"` -+} -+ -+type ClashProxyProviderSubscriptionInfo struct { -+ Upload uint64 `json:"upload,omitempty"` -+ Download uint64 `json:"download,omitempty"` -+ Total uint64 `json:"total,omitempty"` -+ Expire int64 `json:"expire,omitempty"` -+} -+ - type V2RayAPIOptions struct { - Listen string `json:"listen,omitempty"` - Stats *V2RayStatsServiceOptions `json:"stats,omitempty"`