From 77912647d3033a4bdb753116b62c3f3be24ac421 Mon Sep 17 00:00:00 2001 From: "github-action[bot]" Date: Mon, 17 Mar 2025 19:35:52 +0100 Subject: [PATCH] Update On Mon Mar 17 19:35:52 CET 2025 --- .github/update.log | 1 + .../foss/golang/clash/.github/mihomo.service | 4 +- .../foss/golang/clash/.github/mihomo@.service | 4 +- .../clash/adapter/outbound/shadowsocks.go | 45 +- .../golang/clash/adapter/provider/provider.go | 7 - .../foss/golang/clash/common/utils/ranges.go | 22 + .../golang/clash/common/utils/ranges_test.go | 82 + .../golang/clash/component/dialer/dialer.go | 20 +- .../golang/clash/component/iface/iface.go | 66 +- .../clash/component/sniffer/dispatcher.go | 27 +- .../clash/component/sniffer/quic_sniffer.go | 268 +- .../clash/component/sniffer/sniff_test.go | 171 +- .../src/foss/golang/clash/config/config.go | 12 - .../golang/clash/constant/sniffer/sniffer.go | 4 + .../src/foss/golang/clash/docs/config.yaml | 20 + .../core/src/foss/golang/clash/go.mod | 19 +- .../core/src/foss/golang/clash/go.sum | 14 +- .../golang/clash/listener/sing_tun/iface.go | 66 +- .../golang/clash/listener/sing_tun/server.go | 20 +- .../clash/transport/gost-plugin/websocket.go | 102 + .../src/foss/golang/clash/tunnel/tunnel.go | 12 +- .../core/src/foss/golang/go.mod | 7 +- .../core/src/foss/golang/go.sum | 14 +- .../core/src/main/golang/go.mod | 7 +- .../core/src/main/golang/go.sum | 14 +- .../java/com/github/kr328/clash/core/Clash.kt | 2 +- .../clash/module/NetworkObserveModule.kt | 6 +- .../kr328/clash/service/util/Address.kt | 13 +- .../kr328/clash/service/util/Connectivity.kt | 7 +- clash-meta/.github/mihomo.service | 4 +- clash-meta/.github/mihomo@.service | 4 +- clash-meta/common/net/packet/packet_posix.go | 6 +- .../common/net/packet/packet_windows.go | 6 +- clash-meta/component/dialer/dialer.go | 20 +- clash-meta/component/iface/iface.go | 62 +- clash-meta/dns/system_windows.go | 20 +- clash-meta/go.mod | 1 + clash-meta/go.sum | 2 + clash-meta/listener/sing_tun/iface.go | 35 +- .../frontend/interface/package.json | 2 +- clash-nyanpasu/frontend/nyanpasu/package.json | 10 +- clash-nyanpasu/frontend/ui/package.json | 2 +- clash-nyanpasu/manifest/version.json | 4 +- clash-nyanpasu/pnpm-lock.yaml | 144 +- clash-verge-rev/.github/workflows/alpha.yml | 8 + clash-verge-rev/scripts/check.sh | 5988 ---- clash-verge-rev/src-tauri/src/cmd/app.rs | 7 + .../src-tauri/src/cmd/media_unlock_checker.rs | 178 +- clash-verge-rev/src-tauri/src/core/sysopt.rs | 41 +- clash-verge-rev/src-tauri/src/lib.rs | 1 + .../src/components/home/clash-info-card.tsx | 146 +- .../src/components/home/clash-mode-card.tsx | 220 +- .../components/home/current-proxy-card.tsx | 707 +- .../home/enhanced-traffic-graph.tsx | 489 +- .../home/enhanced-traffic-stats.tsx | 232 +- .../src/components/home/home-profile-card.tsx | 439 +- .../src/components/home/ip-info-card.tsx | 460 +- .../src/components/home/proxy-tun-card.tsx | 355 +- .../src/components/home/system-info-card.tsx | 253 +- .../src/components/home/test-card.tsx | 179 +- .../src/components/setting/setting-system.tsx | 27 +- clash-verge-rev/src/locales/en.json | 12 +- clash-verge-rev/src/locales/zh.json | 14 +- clash-verge-rev/src/pages/home.tsx | 7 +- clash-verge-rev/src/services/cmds.ts | 10 + mihomo/.github/mihomo.service | 4 +- mihomo/.github/mihomo@.service | 4 +- mihomo/common/net/packet/packet_posix.go | 6 +- mihomo/common/net/packet/packet_windows.go | 6 +- mihomo/component/dialer/dialer.go | 20 +- mihomo/component/iface/iface.go | 62 +- mihomo/dns/system_windows.go | 20 +- mihomo/go.mod | 1 + mihomo/go.sum | 2 + mihomo/listener/sing_tun/iface.go | 35 +- openwrt-packages/luci-app-partexp/Makefile | 6 +- .../luasrc/model/cbi/partexp/global.lua | 14 +- .../luasrc/model/diskmount.lua | 1 + .../luci-app-partexp/po/zh-cn/partexp.po | 5 +- .../luci-app-partexp/po/zh_Hans/partexp.po | 3 + .../luci-app-partexp/root/etc/init.d/partexp | 267 +- .../luasrc/controller/passwall.lua | 4 +- .../cbi/passwall/client/type/sing-box.lua | 4 + .../luasrc/passwall/util_sing-box.lua | 10 + .../luci-app-passwall/po/zh-cn/passwall.po | 6 + shadowsocks-rust/Makefile | 4 +- sing-box/common/dialer/dialer.go | 2 +- sing-box/docs/changelog.md | 9 + .../docs/configuration/inbound/shadowtls.md | 30 +- .../configuration/inbound/shadowtls.zh.md | 27 +- .../root/etc/config/homeproxy | 1 + .../etc/homeproxy/scripts/generate_client.uc | 4 +- small/luci-app-nikki/Makefile | 2 +- .../luci-static/resources/tools/nikki.js | 12 +- .../luci-static/resources/view/nikki/mixin.js | 2 +- .../luasrc/controller/passwall.lua | 4 +- .../cbi/passwall/client/type/sing-box.lua | 4 + .../luasrc/passwall/util_sing-box.lua | 10 + small/luci-app-passwall/po/zh-cn/passwall.po | 6 + small/nikki/Makefile | 8 +- small/nikki/files/nikki.conf | 2 - small/nikki/files/uci-defaults/migrate.sh | 2 - small/v2ray-geodata/Makefile | 8 +- v2rayn/v2rayN/Directory.Build.props | 2 +- v2rayn/v2rayN/ServiceLib/Common/Utils.cs | 51 +- .../v2rayN/ServiceLib/Handler/PacHandler.cs | 7 + v2rayn/v2rayN/ServiceLib/Sample/pac | 24349 +--------------- .../ViewModels/ClashConnectionsViewModel.cs | 2 +- .../ViewModels/ClashProxiesViewModel.cs | 4 +- yt-dlp/yt_dlp/extractor/_extractors.py | 3 + yt-dlp/yt_dlp/extractor/canalsurmas.py | 84 + yt-dlp/yt_dlp/extractor/msn.py | 314 +- yt-dlp/yt_dlp/extractor/nbc.py | 2 +- yt-dlp/yt_dlp/extractor/skyit.py | 99 +- 114 files changed, 4103 insertions(+), 32582 deletions(-) create mode 100644 clash-meta-android/core/src/foss/golang/clash/common/utils/ranges_test.go create mode 100644 clash-meta-android/core/src/foss/golang/clash/transport/gost-plugin/websocket.go delete mode 100644 clash-verge-rev/scripts/check.sh create mode 100644 yt-dlp/yt_dlp/extractor/canalsurmas.py diff --git a/.github/update.log b/.github/update.log index 0a07e78de7..d5c6d59268 100644 --- a/.github/update.log +++ b/.github/update.log @@ -944,3 +944,4 @@ Update On Thu Mar 13 19:35:33 CET 2025 Update On Fri Mar 14 19:34:32 CET 2025 Update On Sat Mar 15 19:32:45 CET 2025 Update On Sun Mar 16 19:33:44 CET 2025 +Update On Mon Mar 17 19:35:42 CET 2025 diff --git a/clash-meta-android/core/src/foss/golang/clash/.github/mihomo.service b/clash-meta-android/core/src/foss/golang/clash/.github/mihomo.service index a3793fe369..7ecc848661 100644 --- a/clash-meta-android/core/src/foss/golang/clash/.github/mihomo.service +++ b/clash-meta-android/core/src/foss/golang/clash/.github/mihomo.service @@ -5,8 +5,8 @@ After=network.target nss-lookup.target network-online.target [Service] Type=simple -CapabilityBoundingSet=CAP_NET_ADMIN CAP_NET_RAW CAP_NET_BIND_SERVICE CAP_SYS_PTRACE CAP_DAC_READ_SEARCH -AmbientCapabilities=CAP_NET_ADMIN CAP_NET_RAW CAP_NET_BIND_SERVICE CAP_SYS_PTRACE CAP_DAC_READ_SEARCH +CapabilityBoundingSet=CAP_NET_ADMIN CAP_NET_RAW CAP_NET_BIND_SERVICE CAP_SYS_TIME CAP_SYS_PTRACE CAP_DAC_READ_SEARCH CAP_DAC_OVERRIDE +AmbientCapabilities=CAP_NET_ADMIN CAP_NET_RAW CAP_NET_BIND_SERVICE CAP_SYS_TIME CAP_SYS_PTRACE CAP_DAC_READ_SEARCH CAP_DAC_OVERRIDE ExecStart=/usr/bin/mihomo -d /etc/mihomo ExecReload=/bin/kill -HUP $MAINPID Restart=on-failure diff --git a/clash-meta-android/core/src/foss/golang/clash/.github/mihomo@.service b/clash-meta-android/core/src/foss/golang/clash/.github/mihomo@.service index a3793fe369..7ecc848661 100644 --- a/clash-meta-android/core/src/foss/golang/clash/.github/mihomo@.service +++ b/clash-meta-android/core/src/foss/golang/clash/.github/mihomo@.service @@ -5,8 +5,8 @@ After=network.target nss-lookup.target network-online.target [Service] Type=simple -CapabilityBoundingSet=CAP_NET_ADMIN CAP_NET_RAW CAP_NET_BIND_SERVICE CAP_SYS_PTRACE CAP_DAC_READ_SEARCH -AmbientCapabilities=CAP_NET_ADMIN CAP_NET_RAW CAP_NET_BIND_SERVICE CAP_SYS_PTRACE CAP_DAC_READ_SEARCH +CapabilityBoundingSet=CAP_NET_ADMIN CAP_NET_RAW CAP_NET_BIND_SERVICE CAP_SYS_TIME CAP_SYS_PTRACE CAP_DAC_READ_SEARCH CAP_DAC_OVERRIDE +AmbientCapabilities=CAP_NET_ADMIN CAP_NET_RAW CAP_NET_BIND_SERVICE CAP_SYS_TIME CAP_SYS_PTRACE CAP_DAC_READ_SEARCH CAP_DAC_OVERRIDE ExecStart=/usr/bin/mihomo -d /etc/mihomo ExecReload=/bin/kill -HUP $MAINPID Restart=on-failure diff --git a/clash-meta-android/core/src/foss/golang/clash/adapter/outbound/shadowsocks.go b/clash-meta-android/core/src/foss/golang/clash/adapter/outbound/shadowsocks.go index 94a7763d8f..eb21561a43 100644 --- a/clash-meta-android/core/src/foss/golang/clash/adapter/outbound/shadowsocks.go +++ b/clash-meta-android/core/src/foss/golang/clash/adapter/outbound/shadowsocks.go @@ -13,6 +13,7 @@ import ( "github.com/metacubex/mihomo/component/proxydialer" "github.com/metacubex/mihomo/component/resolver" C "github.com/metacubex/mihomo/constant" + gost "github.com/metacubex/mihomo/transport/gost-plugin" "github.com/metacubex/mihomo/transport/restls" obfs "github.com/metacubex/mihomo/transport/simple-obfs" shadowtls "github.com/metacubex/mihomo/transport/sing-shadowtls" @@ -34,6 +35,7 @@ type ShadowSocks struct { obfsMode string obfsOption *simpleObfsOption v2rayOption *v2rayObfs.Option + gostOption *gost.Option shadowTLSOption *shadowtls.ShadowTLSOption restlsConfig *restlsC.Config } @@ -71,6 +73,17 @@ type v2rayObfsOption struct { V2rayHttpUpgradeFastOpen bool `obfs:"v2ray-http-upgrade-fast-open,omitempty"` } +type gostObfsOption struct { + Mode string `obfs:"mode"` + Host string `obfs:"host,omitempty"` + Path string `obfs:"path,omitempty"` + TLS bool `obfs:"tls,omitempty"` + Fingerprint string `obfs:"fingerprint,omitempty"` + Headers map[string]string `obfs:"headers,omitempty"` + SkipCertVerify bool `obfs:"skip-cert-verify,omitempty"` + Mux bool `obfs:"mux,omitempty"` +} + type shadowTLSOption struct { Password string `obfs:"password"` Host string `obfs:"host"` @@ -97,7 +110,13 @@ func (ss *ShadowSocks) StreamConnContext(ctx context.Context, c net.Conn, metada c = obfs.NewHTTPObfs(c, ss.obfsOption.Host, port) case "websocket": var err error - c, err = v2rayObfs.NewV2rayObfs(ctx, c, ss.v2rayOption) + if ss.v2rayOption != nil { + c, err = v2rayObfs.NewV2rayObfs(ctx, c, ss.v2rayOption) + } else if ss.gostOption != nil { + c, err = gost.NewGostWebsocket(ctx, c, ss.gostOption) + } else { + return nil, fmt.Errorf("plugin options is required") + } if err != nil { return nil, fmt.Errorf("%s connect error: %w", ss.addr, err) } @@ -240,6 +259,7 @@ func NewShadowSocks(option ShadowSocksOption) (*ShadowSocks, error) { } var v2rayOption *v2rayObfs.Option + var gostOption *gost.Option var obfsOption *simpleObfsOption var shadowTLSOpt *shadowtls.ShadowTLSOption var restlsConfig *restlsC.Config @@ -281,6 +301,28 @@ func NewShadowSocks(option ShadowSocksOption) (*ShadowSocks, error) { v2rayOption.SkipCertVerify = opts.SkipCertVerify v2rayOption.Fingerprint = opts.Fingerprint } + } else if option.Plugin == "gost-plugin" { + opts := gostObfsOption{Host: "bing.com", Mux: true} + if err := decoder.Decode(option.PluginOpts, &opts); err != nil { + return nil, fmt.Errorf("ss %s initialize gost-plugin error: %w", addr, err) + } + + if opts.Mode != "websocket" { + return nil, fmt.Errorf("ss %s obfs mode error: %s", addr, opts.Mode) + } + obfsMode = opts.Mode + gostOption = &gost.Option{ + Host: opts.Host, + Path: opts.Path, + Headers: opts.Headers, + Mux: opts.Mux, + } + + if opts.TLS { + gostOption.TLS = true + gostOption.SkipCertVerify = opts.SkipCertVerify + gostOption.Fingerprint = opts.Fingerprint + } } else if option.Plugin == shadowtls.Mode { obfsMode = shadowtls.Mode opt := &shadowTLSOption{ @@ -336,6 +378,7 @@ func NewShadowSocks(option ShadowSocksOption) (*ShadowSocks, error) { option: &option, obfsMode: obfsMode, v2rayOption: v2rayOption, + gostOption: gostOption, obfsOption: obfsOption, shadowTLSOption: shadowTLSOpt, restlsConfig: restlsConfig, diff --git a/clash-meta-android/core/src/foss/golang/clash/adapter/provider/provider.go b/clash-meta-android/core/src/foss/golang/clash/adapter/provider/provider.go index 2abf961833..3dccefea5f 100644 --- a/clash-meta-android/core/src/foss/golang/clash/adapter/provider/provider.go +++ b/clash-meta-android/core/src/foss/golang/clash/adapter/provider/provider.go @@ -326,13 +326,6 @@ func (cp *CompatibleProvider) Close() error { return cp.compatibleProvider.Close() } -func proxiesOnUpdate(pd *proxySetProvider) func([]C.Proxy) { - return func(elm []C.Proxy) { - pd.setProxies(elm) - pd.version += 1 - } -} - func NewProxiesParser(filter string, excludeFilter string, excludeType string, dialerProxy string, override OverrideSchema) (resource.Parser[[]C.Proxy], error) { excludeFilterReg, err := regexp2.Compile(excludeFilter, regexp2.None) if err != nil { diff --git a/clash-meta-android/core/src/foss/golang/clash/common/utils/ranges.go b/clash-meta-android/core/src/foss/golang/clash/common/utils/ranges.go index f7dcf9c459..21eacda534 100644 --- a/clash-meta-android/core/src/foss/golang/clash/common/utils/ranges.go +++ b/clash-meta-android/core/src/foss/golang/clash/common/utils/ranges.go @@ -3,6 +3,7 @@ package utils import ( "errors" "fmt" + "sort" "strconv" "strings" @@ -149,3 +150,24 @@ func (ranges IntRanges[T]) Range(f func(t T) bool) { } } } + +func (ranges IntRanges[T]) Merge() (mergedRanges IntRanges[T]) { + if len(ranges) == 0 { + return + } + sort.Slice(ranges, func(i, j int) bool { + return ranges[i].Start() < ranges[j].Start() + }) + mergedRanges = ranges[:1] + var rangeIndex int + for _, r := range ranges[1:] { + if mergedRanges[rangeIndex].End()+1 > mergedRanges[rangeIndex].End() && // integer overflow + r.Start() > mergedRanges[rangeIndex].End()+1 { + mergedRanges = append(mergedRanges, r) + rangeIndex++ + } else if r.End() > mergedRanges[rangeIndex].End() { + mergedRanges[rangeIndex].end = r.End() + } + } + return +} diff --git a/clash-meta-android/core/src/foss/golang/clash/common/utils/ranges_test.go b/clash-meta-android/core/src/foss/golang/clash/common/utils/ranges_test.go new file mode 100644 index 0000000000..3ae829d18a --- /dev/null +++ b/clash-meta-android/core/src/foss/golang/clash/common/utils/ranges_test.go @@ -0,0 +1,82 @@ +package utils + +import ( + "github.com/stretchr/testify/assert" + "testing" +) + +func TestMergeRanges(t *testing.T) { + t.Parallel() + for _, testRange := range []struct { + ranges IntRanges[uint16] + expected IntRanges[uint16] + }{ + { + ranges: IntRanges[uint16]{ + NewRange[uint16](0, 1), + NewRange[uint16](1, 2), + }, + expected: IntRanges[uint16]{ + NewRange[uint16](0, 2), + }, + }, + { + ranges: IntRanges[uint16]{ + NewRange[uint16](0, 3), + NewRange[uint16](5, 7), + NewRange[uint16](8, 9), + NewRange[uint16](10, 10), + }, + expected: IntRanges[uint16]{ + NewRange[uint16](0, 3), + NewRange[uint16](5, 10), + }, + }, + { + ranges: IntRanges[uint16]{ + NewRange[uint16](1, 3), + NewRange[uint16](2, 6), + NewRange[uint16](8, 10), + NewRange[uint16](15, 18), + }, + expected: IntRanges[uint16]{ + NewRange[uint16](1, 6), + NewRange[uint16](8, 10), + NewRange[uint16](15, 18), + }, + }, + { + ranges: IntRanges[uint16]{ + NewRange[uint16](1, 3), + NewRange[uint16](2, 7), + NewRange[uint16](2, 6), + }, + expected: IntRanges[uint16]{ + NewRange[uint16](1, 7), + }, + }, + { + ranges: IntRanges[uint16]{ + NewRange[uint16](1, 3), + NewRange[uint16](2, 6), + NewRange[uint16](2, 7), + }, + expected: IntRanges[uint16]{ + NewRange[uint16](1, 7), + }, + }, + { + ranges: IntRanges[uint16]{ + NewRange[uint16](1, 3), + NewRange[uint16](2, 65535), + NewRange[uint16](2, 7), + NewRange[uint16](3, 16), + }, + expected: IntRanges[uint16]{ + NewRange[uint16](1, 65535), + }, + }, + } { + assert.Equal(t, testRange.expected, testRange.ranges.Merge()) + } +} diff --git a/clash-meta-android/core/src/foss/golang/clash/component/dialer/dialer.go b/clash-meta-android/core/src/foss/golang/clash/component/dialer/dialer.go index da217f280d..0ecccdf8cf 100644 --- a/clash-meta-android/core/src/foss/golang/clash/component/dialer/dialer.go +++ b/clash-meta-android/core/src/foss/golang/clash/component/dialer/dialer.go @@ -88,21 +88,22 @@ func ListenPacket(ctx context.Context, network, address string, rAddrPort netip. if DefaultSocketHook != nil { // ignore interfaceName, routingMark when DefaultSocketHook not null (in CMFA) socketHookToListenConfig(lc) } else { - if cfg.interfaceName == "" { + interfaceName := cfg.interfaceName + if interfaceName == "" { if finder := DefaultInterfaceFinder.Load(); finder != nil { - cfg.interfaceName = finder.FindInterfaceName(rAddrPort.Addr()) + interfaceName = finder.FindInterfaceName(rAddrPort.Addr()) } } if rAddrPort.Addr().Unmap().IsLoopback() { // avoid "The requested address is not valid in its context." - cfg.interfaceName = "" + interfaceName = "" } - if cfg.interfaceName != "" { + if interfaceName != "" { bind := bindIfaceToListenConfig if cfg.fallbackBind { bind = fallbackBindIfaceToListenConfig } - addr, err := bind(cfg.interfaceName, lc, network, address, rAddrPort) + addr, err := bind(interfaceName, lc, network, address, rAddrPort) if err != nil { return nil, err } @@ -162,17 +163,18 @@ func dialContext(ctx context.Context, network string, destination netip.Addr, po if DefaultSocketHook != nil { // ignore interfaceName, routingMark and tfo when DefaultSocketHook not null (in CMFA) socketHookToToDialer(dialer) } else { - if opt.interfaceName == "" { + interfaceName := opt.interfaceName // don't change the "opt", it's a pointer + if interfaceName == "" { if finder := DefaultInterfaceFinder.Load(); finder != nil { - opt.interfaceName = finder.FindInterfaceName(destination) + interfaceName = finder.FindInterfaceName(destination) } } - if opt.interfaceName != "" { + if interfaceName != "" { bind := bindIfaceToDialer if opt.fallbackBind { bind = fallbackBindIfaceToDialer } - if err := bind(opt.interfaceName, dialer, network, destination); err != nil { + if err := bind(interfaceName, dialer, network, destination); err != nil { return nil, err } } diff --git a/clash-meta-android/core/src/foss/golang/clash/component/iface/iface.go b/clash-meta-android/core/src/foss/golang/clash/component/iface/iface.go index a0fa4d5bd9..62a46f1f8d 100644 --- a/clash-meta-android/core/src/foss/golang/clash/component/iface/iface.go +++ b/clash-meta-android/core/src/foss/golang/clash/component/iface/iface.go @@ -7,15 +7,17 @@ import ( "time" "github.com/metacubex/mihomo/common/singledo" + + "github.com/metacubex/bart" ) type Interface struct { Index int MTU int Name string - Addresses []netip.Prefix HardwareAddr net.HardwareAddr Flags net.Flags + Addresses []netip.Prefix } var ( @@ -23,16 +25,23 @@ var ( ErrAddrNotFound = errors.New("addr not found") ) -var interfaces = singledo.NewSingle[map[string]*Interface](time.Second * 20) +type ifaceCache struct { + ifMap map[string]*Interface + ifTable bart.Table[*Interface] +} -func Interfaces() (map[string]*Interface, error) { - value, err, _ := interfaces.Do(func() (map[string]*Interface, error) { +var caches = singledo.NewSingle[*ifaceCache](time.Second * 20) + +func getCache() (*ifaceCache, error) { + value, err, _ := caches.Do(func() (*ifaceCache, error) { ifaces, err := net.Interfaces() if err != nil { return nil, err } - r := map[string]*Interface{} + cache := &ifaceCache{ + ifMap: make(map[string]*Interface), + } for _, iface := range ifaces { addrs, err := iface.Addrs() @@ -61,21 +70,34 @@ func Interfaces() (map[string]*Interface, error) { } } - r[iface.Name] = &Interface{ + ifaceObj := &Interface{ Index: iface.Index, MTU: iface.MTU, Name: iface.Name, - Addresses: ipNets, HardwareAddr: iface.HardwareAddr, Flags: iface.Flags, + Addresses: ipNets, + } + cache.ifMap[iface.Name] = ifaceObj + + for _, prefix := range ipNets { + cache.ifTable.Insert(prefix, ifaceObj) } } - return r, nil + return cache, nil }) return value, err } +func Interfaces() (map[string]*Interface, error) { + cache, err := getCache() + if err != nil { + return nil, err + } + return cache.ifMap, nil +} + func ResolveInterface(name string) (*Interface, error) { ifaces, err := Interfaces() if err != nil { @@ -90,23 +112,29 @@ func ResolveInterface(name string) (*Interface, error) { return iface, nil } -func IsLocalIp(ip netip.Addr) (bool, error) { - ifaces, err := Interfaces() +func ResolveInterfaceByAddr(addr netip.Addr) (*Interface, error) { + cache, err := getCache() + if err != nil { + return nil, err + } + iface, ok := cache.ifTable.Lookup(addr) + if !ok { + return nil, ErrIfaceNotFound + } + + return iface, nil +} + +func IsLocalIp(addr netip.Addr) (bool, error) { + cache, err := getCache() if err != nil { return false, err } - for _, iface := range ifaces { - for _, addr := range iface.Addresses { - if addr.Contains(ip) { - return true, nil - } - } - } - return false, nil + return cache.ifTable.Contains(addr), nil } func FlushCache() { - interfaces.Reset() + caches.Reset() } func (iface *Interface) PickIPv4Addr(destination netip.Addr) (netip.Prefix, error) { diff --git a/clash-meta-android/core/src/foss/golang/clash/component/sniffer/dispatcher.go b/clash-meta-android/core/src/foss/golang/clash/component/sniffer/dispatcher.go index 5d457cf165..0ed3d2e637 100644 --- a/clash-meta-android/core/src/foss/golang/clash/component/sniffer/dispatcher.go +++ b/clash-meta-android/core/src/foss/golang/clash/component/sniffer/dispatcher.go @@ -60,28 +60,35 @@ func (sd *Dispatcher) forceSniff(metadata *C.Metadata) bool { return false } -func (sd *Dispatcher) UDPSniff(packet C.PacketAdapter) bool { +// UDPSniff is called when a UDP NAT is created and passed the first initialization packet. +// It may return a wrapped packetSender if the sniffer process needs to wait for multiple packets. +// This function must be non-blocking, and any blocking operations should be done in the wrapped packetSender. +func (sd *Dispatcher) UDPSniff(packet C.PacketAdapter, packetSender C.PacketSender) C.PacketSender { metadata := packet.Metadata() if sd.shouldOverride(metadata) { - for sniffer, config := range sd.sniffers { - if sniffer.SupportNetwork() == C.UDP || sniffer.SupportNetwork() == C.ALLNet { - inWhitelist := sniffer.SupportPort(metadata.DstPort) + for current, config := range sd.sniffers { + if current.SupportNetwork() == C.UDP || current.SupportNetwork() == C.ALLNet { + inWhitelist := current.SupportPort(metadata.DstPort) overrideDest := config.OverrideDest if inWhitelist { - host, err := sniffer.SniffData(packet.Data()) + if wrapable, ok := current.(sniffer.MultiPacketSniffer); ok { + return wrapable.WrapperSender(packetSender, overrideDest) + } + + host, err := current.SniffData(packet.Data()) if err != nil { continue } - sd.replaceDomain(metadata, host, overrideDest) - return true + replaceDomain(metadata, host, overrideDest) + return packetSender } } } } - return false + return packetSender } // TCPSniff returns true if the connection is sniffed to have a domain @@ -130,13 +137,13 @@ func (sd *Dispatcher) TCPSniff(conn *N.BufferedConn, metadata *C.Metadata) bool sd.skipList.Delete(dst) - sd.replaceDomain(metadata, host, overrideDest) + replaceDomain(metadata, host, overrideDest) return true } return false } -func (sd *Dispatcher) replaceDomain(metadata *C.Metadata, host string, overrideDest bool) { +func replaceDomain(metadata *C.Metadata, host string, overrideDest bool) { metadata.SniffHost = host if overrideDest { log.Debugln("[Sniffer] Sniff %s [%s]-->[%s] success, replace domain [%s]-->[%s]", diff --git a/clash-meta-android/core/src/foss/golang/clash/component/sniffer/quic_sniffer.go b/clash-meta-android/core/src/foss/golang/clash/component/sniffer/quic_sniffer.go index 0e3994f079..6cc377d2cf 100644 --- a/clash-meta-android/core/src/foss/golang/clash/component/sniffer/quic_sniffer.go +++ b/clash-meta-android/core/src/foss/golang/clash/component/sniffer/quic_sniffer.go @@ -7,10 +7,15 @@ import ( "encoding/binary" "errors" "io" + "sync" + "time" "github.com/metacubex/mihomo/common/buf" + "github.com/metacubex/mihomo/common/pool" "github.com/metacubex/mihomo/common/utils" + "github.com/metacubex/mihomo/constant" C "github.com/metacubex/mihomo/constant" + "github.com/metacubex/mihomo/constant/sniffer" "github.com/metacubex/quic-go/quicvarint" "golang.org/x/crypto/hkdf" @@ -21,6 +26,16 @@ import ( const ( versionDraft29 uint32 = 0xff00001d version1 uint32 = 0x1 + + quicPacketTypeInitial = 0x00 + quicPacketType0RTT = 0x01 + + // Timeout before quic sniffer all packets + quicWaitConn = time.Second * 3 + + // maxCryptoStreamOffset is the maximum offset allowed on any of the crypto streams. + // This limits the size of the ClientHello and Certificates that can be received. + maxCryptoStreamOffset = 16 * (1 << 10) ) var ( @@ -30,6 +45,9 @@ var ( errNotQuicInitial = errors.New("not QUIC initial packet") ) +var _ sniffer.Sniffer = (*QuicSniffer)(nil) +var _ sniffer.MultiPacketSniffer = (*QuicSniffer)(nil) + type QuicSniffer struct { *BaseSniffer } @@ -44,67 +62,160 @@ func NewQuicSniffer(snifferConfig SnifferConfig) (*QuicSniffer, error) { }, nil } -func (quic QuicSniffer) Protocol() string { +func (sniffer *QuicSniffer) Protocol() string { return "quic" } -func (quic QuicSniffer) SupportNetwork() C.NetWork { +func (sniffer *QuicSniffer) SupportNetwork() C.NetWork { return C.UDP } -func (quic QuicSniffer) SniffData(b []byte) (string, error) { +func (sniffer *QuicSniffer) SniffData(b []byte) (string, error) { + return "", ErrorUnsupportedSniffer +} + +func (sniffer *QuicSniffer) WrapperSender(packetSender constant.PacketSender, override bool) constant.PacketSender { + return &quicPacketSender{ + sender: packetSender, + chClose: make(chan struct{}), + override: override, + } +} + +var _ constant.PacketSender = (*quicPacketSender)(nil) + +type quicPacketSender struct { + lock sync.RWMutex + ranges utils.IntRanges[uint64] + buffer []byte + result string + override bool + + sender constant.PacketSender + + chClose chan struct{} + closed bool +} + +// Send will send PacketAdapter nonblocking +// the implement must call UDPPacket.Drop() inside Send +func (q *quicPacketSender) Send(current constant.PacketAdapter) { + defer q.sender.Send(current) + + q.lock.RLock() + if q.closed { + q.lock.RUnlock() + return + } + q.lock.RUnlock() + + err := q.readQuicData(current.Data()) + if err != nil { + q.close() + return + } +} + +// Process is a blocking loop to send PacketAdapter to PacketConn and update the WriteBackProxy +func (q *quicPacketSender) Process(conn constant.PacketConn, proxy constant.WriteBackProxy) { + q.sender.Process(conn, proxy) +} + +// ResolveUDP wait sniffer recv all fragments and update the domain +func (q *quicPacketSender) ResolveUDP(data *constant.Metadata) error { + select { + case <-q.chClose: + q.lock.RLock() + replaceDomain(data, q.result, q.override) + q.lock.RUnlock() + break + case <-time.After(quicWaitConn): + q.close() + } + + return q.sender.ResolveUDP(data) +} + +// Close stop the Process loop +func (q *quicPacketSender) Close() { + q.sender.Close() + q.close() +} + +func (q *quicPacketSender) close() { + q.lock.Lock() + q.closeLocked() + q.lock.Unlock() +} + +func (q *quicPacketSender) closeLocked() { + if !q.closed { + close(q.chClose) + q.closed = true + if q.buffer != nil { + _ = pool.Put(q.buffer) + q.buffer = nil + } + q.ranges = nil + } +} + +func (q *quicPacketSender) readQuicData(b []byte) error { buffer := buf.As(b) typeByte, err := buffer.ReadByte() if err != nil { - return "", errNotQuic + return errNotQuic } isLongHeader := typeByte&0x80 > 0 if !isLongHeader || typeByte&0x40 == 0 { - return "", errNotQuicInitial + return errNotQuicInitial } vb, err := buffer.ReadBytes(4) if err != nil { - return "", errNotQuic + return errNotQuic } versionNumber := binary.BigEndian.Uint32(vb) if versionNumber != 0 && typeByte&0x40 == 0 { - return "", errNotQuic + return errNotQuic } else if versionNumber != versionDraft29 && versionNumber != version1 { - return "", errNotQuic + return errNotQuic } - if (typeByte&0x30)>>4 != 0x0 { - return "", errNotQuicInitial + connIdLen, err := buffer.ReadByte() + if err != nil || connIdLen == 0 { + return errNotQuic + } + destConnID := make([]byte, int(connIdLen)) + if _, err := io.ReadFull(buffer, destConnID); err != nil { + return errNotQuic } - var destConnID []byte - if l, err := buffer.ReadByte(); err != nil { - return "", errNotQuic - } else if destConnID, err = buffer.ReadBytes(int(l)); err != nil { - return "", errNotQuic + packetType := (typeByte & 0x30) >> 4 + if packetType != quicPacketTypeInitial { + return nil } if l, err := buffer.ReadByte(); err != nil { - return "", errNotQuic + return errNotQuic } else if _, err := buffer.ReadBytes(int(l)); err != nil { - return "", errNotQuic + return errNotQuic } tokenLen, err := quicvarint.Read(buffer) if err != nil || tokenLen > uint64(len(b)) { - return "", errNotQuic + return errNotQuic } if _, err = buffer.ReadBytes(int(tokenLen)); err != nil { - return "", errNotQuic + return errNotQuic } packetLen, err := quicvarint.Read(buffer) if err != nil { - return "", errNotQuic + return errNotQuic } hdrLen := len(b) - buffer.Len() @@ -120,7 +231,7 @@ func (quic QuicSniffer) SniffData(b []byte) (string, error) { hpKey := hkdfExpandLabel(crypto.SHA256, secret, []byte{}, "quic hp", 16) block, err := aes.NewCipher(hpKey) if err != nil { - return "", err + return err } cache := buf.NewPacket() @@ -130,6 +241,7 @@ func (quic QuicSniffer) SniffData(b []byte) (string, error) { block.Encrypt(mask, b[hdrLen+4:hdrLen+4+16]) firstByte := b[0] // Encrypt/decrypt first byte. + if isLongHeader { // Long header: 4 bits masked // High 4 bits are not protected. @@ -153,8 +265,8 @@ func (quic QuicSniffer) SniffData(b []byte) (string, error) { packetNumber[i] ^= mask[1+i] } - if packetNumber[0] != 0 && packetNumber[0] != 1 { - return "", errNotQuicInitial + if int(packetLen)+hdrLen > len(b) || extHdrLen > len(b) { + return errNotQuic } data := b[extHdrLen : int(packetLen)+hdrLen] @@ -163,12 +275,13 @@ func (quic QuicSniffer) SniffData(b []byte) (string, error) { iv := hkdfExpandLabel(crypto.SHA256, secret, []byte{}, "quic iv", 12) aesCipher, err := aes.NewCipher(key) if err != nil { - return "", err + return err } aead, err := cipher.NewGCM(aesCipher) if err != nil { - return "", err + return err } + // We only decrypt once, so we do not need to XOR it back. // https://github.com/quic-go/qtls-go1-20/blob/e132a0e6cb45e20ac0b705454849a11d09ba5a54/cipher_suites.go#L496 for i, b := range packetNumber { @@ -177,13 +290,20 @@ func (quic QuicSniffer) SniffData(b []byte) (string, error) { dst := cache.Extend(len(data)) decrypted, err := aead.Open(dst[:0], iv, data, extHdr) if err != nil { - return "", err + return err } + buffer = buf.As(decrypted) - cryptoLen := uint(0) - cryptoData := cache.Extend(buffer.Len()) for i := 0; !buffer.IsEmpty(); i++ { + q.lock.RLock() + if q.closed { + q.lock.RUnlock() + // close() was called, just return + return nil + } + q.lock.RUnlock() + frameType := byte(0x0) // Default to PADDING frame for frameType == 0x0 && !buffer.IsEmpty() { frameType, _ = buffer.ReadByte() @@ -193,79 +313,123 @@ func (quic QuicSniffer) SniffData(b []byte) (string, error) { case 0x01: // PING frame case 0x02, 0x03: // ACK frame if _, err = quicvarint.Read(buffer); err != nil { // Field: Largest Acknowledged - return "", io.ErrUnexpectedEOF + return io.ErrUnexpectedEOF } if _, err = quicvarint.Read(buffer); err != nil { // Field: ACK Delay - return "", io.ErrUnexpectedEOF + return io.ErrUnexpectedEOF } ackRangeCount, err := quicvarint.Read(buffer) // Field: ACK Range Count if err != nil { - return "", io.ErrUnexpectedEOF + return io.ErrUnexpectedEOF } if _, err = quicvarint.Read(buffer); err != nil { // Field: First ACK Range - return "", io.ErrUnexpectedEOF + return io.ErrUnexpectedEOF } for i := 0; i < int(ackRangeCount); i++ { // Field: ACK Range if _, err = quicvarint.Read(buffer); err != nil { // Field: ACK Range -> Gap - return "", io.ErrUnexpectedEOF + return io.ErrUnexpectedEOF } if _, err = quicvarint.Read(buffer); err != nil { // Field: ACK Range -> ACK Range Length - return "", io.ErrUnexpectedEOF + return io.ErrUnexpectedEOF } } if frameType == 0x03 { if _, err = quicvarint.Read(buffer); err != nil { // Field: ECN Counts -> ECT0 Count - return "", io.ErrUnexpectedEOF + return io.ErrUnexpectedEOF } if _, err = quicvarint.Read(buffer); err != nil { // Field: ECN Counts -> ECT1 Count - return "", io.ErrUnexpectedEOF + return io.ErrUnexpectedEOF } if _, err = quicvarint.Read(buffer); err != nil { //nolint:misspell // Field: ECN Counts -> ECT-CE Count - return "", io.ErrUnexpectedEOF + return io.ErrUnexpectedEOF } } case 0x06: // CRYPTO frame, we will use this frame offset, err := quicvarint.Read(buffer) // Field: Offset if err != nil { - return "", io.ErrUnexpectedEOF + return io.ErrUnexpectedEOF } length, err := quicvarint.Read(buffer) // Field: Length if err != nil || length > uint64(buffer.Len()) { - return "", io.ErrUnexpectedEOF + return io.ErrUnexpectedEOF } - if cryptoLen < uint(offset+length) { - cryptoLen = uint(offset + length) + + end := offset + length + if end > maxCryptoStreamOffset { + return io.ErrShortBuffer } - if _, err := buffer.Read(cryptoData[offset : offset+length]); err != nil { // Field: Crypto Data - return "", io.ErrUnexpectedEOF + + q.lock.Lock() + if q.closed { + q.lock.Unlock() + // close() was called, just return + return nil } + if q.buffer == nil { + q.buffer = pool.Get(maxCryptoStreamOffset)[:end] + } else if end > uint64(len(q.buffer)) { + q.buffer = q.buffer[:end] + } + target := q.buffer[offset:end] + if _, err := buffer.Read(target); err != nil { // Field: Crypto Data + q.lock.Unlock() + return io.ErrUnexpectedEOF + } + q.ranges = append(q.ranges, utils.NewRange(offset, end)) + q.ranges = q.ranges.Merge() + q.lock.Unlock() case 0x1c: // CONNECTION_CLOSE frame, only 0x1c is permitted in initial packet if _, err = quicvarint.Read(buffer); err != nil { // Field: Error Code - return "", io.ErrUnexpectedEOF + return io.ErrUnexpectedEOF } if _, err = quicvarint.Read(buffer); err != nil { // Field: Frame Type - return "", io.ErrUnexpectedEOF + return io.ErrUnexpectedEOF } length, err := quicvarint.Read(buffer) // Field: Reason Phrase Length if err != nil { - return "", io.ErrUnexpectedEOF + return io.ErrUnexpectedEOF } if _, err := buffer.ReadBytes(int(length)); err != nil { // Field: Reason Phrase - return "", io.ErrUnexpectedEOF + return io.ErrUnexpectedEOF } default: // Only above frame types are permitted in initial packet. // See https://www.rfc-editor.org/rfc/rfc9000.html#section-17.2.2-8 - return "", errNotQuicInitial + return errNotQuicInitial } } - domain, err := ReadClientHello(cryptoData[:cryptoLen]) - if err != nil { - return "", err + _ = q.tryAssemble() + + return nil +} + +func (q *quicPacketSender) tryAssemble() error { + q.lock.RLock() + + if q.closed { + q.lock.RUnlock() + // close() was called, just return + return nil } - return *domain, nil + if len(q.ranges) != 1 || q.ranges[0].Start() != 0 || q.ranges[0].End() != uint64(len(q.buffer)) { + q.lock.RUnlock() + return ErrNoClue + } + + domain, err := ReadClientHello(q.buffer) + q.lock.RUnlock() + if err != nil { + return err + } + + q.lock.Lock() + q.result = *domain + q.closeLocked() + q.lock.Unlock() + + return nil } func hkdfExpandLabel(hash crypto.Hash, secret, context []byte, label string, length int) []byte { diff --git a/clash-meta-android/core/src/foss/golang/clash/component/sniffer/sniff_test.go b/clash-meta-android/core/src/foss/golang/clash/component/sniffer/sniff_test.go index 18cc91520a..bc250d59b4 100644 --- a/clash-meta-android/core/src/foss/golang/clash/component/sniffer/sniff_test.go +++ b/clash-meta-android/core/src/foss/golang/clash/component/sniffer/sniff_test.go @@ -3,35 +3,184 @@ package sniffer import ( "bytes" "encoding/hex" - "github.com/stretchr/testify/assert" + "net" + "net/netip" "testing" + + "github.com/metacubex/mihomo/constant" + "github.com/stretchr/testify/assert" ) +type fakeSender struct { + resultCh chan *constant.Metadata +} + +var _ constant.PacketSender = (*fakeSender)(nil) + +func (e *fakeSender) Send(packet constant.PacketAdapter) { + // Ensure that the wrapper's Send can correctly handle the situation where the packet is directly discarded. + packet.Drop() +} + +func (e *fakeSender) Process(constant.PacketConn, constant.WriteBackProxy) { + panic("not implemented") +} + +func (e *fakeSender) ResolveUDP(metadata *constant.Metadata) error { + e.resultCh <- metadata + return nil +} + +func (e *fakeSender) Close() { + panic("not implemented") +} + +type fakeUDPPacket struct { + data []byte + data2 []byte // backup +} + +func (s *fakeUDPPacket) InAddr() net.Addr { + return net.UDPAddrFromAddrPort(netip.AddrPortFrom(netip.IPv4Unspecified(), 0)) +} + +func (s *fakeUDPPacket) LocalAddr() net.Addr { + return net.UDPAddrFromAddrPort(netip.AddrPortFrom(netip.IPv4Unspecified(), 0)) +} + +func (s *fakeUDPPacket) Data() []byte { + return s.data +} + +func (s *fakeUDPPacket) WriteBack(b []byte, addr net.Addr) (n int, err error) { + return 0, net.ErrClosed +} + +func (s *fakeUDPPacket) Drop() { + for i := range s.data { + if s.data[i] != s.data2[i] { // ensure input data not changed + panic("data has been changed!") + } + s.data[i] = 0 // forcing data to become illegal + } + s.data = nil +} + +var _ constant.UDPPacket = (*fakeUDPPacket)(nil) + +func asPacket(data string) constant.PacketAdapter { + pktData, _ := hex.DecodeString(data) + + meta := &constant.Metadata{} + pkt := &fakeUDPPacket{data: pktData, data2: bytes.Clone(pktData)} + pktAdp := constant.NewPacketAdapter(pkt, meta) + + return pktAdp +} + +func testQuicSniffer(data []string, async bool) (string, error) { + q, err := NewQuicSniffer(SnifferConfig{}) + if err != nil { + return "", err + } + + resultCh := make(chan *constant.Metadata, 1) + emptySender := &fakeSender{resultCh: resultCh} + + sender := q.WrapperSender(emptySender, true) + + go func() { + meta := constant.Metadata{} + err = sender.ResolveUDP(&meta) + if err != nil { + panic(err) + } + }() + + for _, d := range data { + if async { + go sender.Send(asPacket(d)) + } else { + sender.Send(asPacket(d)) + } + } + + meta := <-resultCh + return meta.SniffHost, nil +} + func TestQuicHeaders(t *testing.T) { + cases := []struct { - input string + input []string domain string }{ + //Normal domain quic sniff { - input: "cd0000000108f1fb7bcc78aa5e7203a8f86400421531fe825b19541876db6c55c38890cd73149d267a084afee6087304095417a3033df6a81bbb71d8512e7a3e16df1e277cae5df3182cb214b8fe982ba3fdffbaa9ffec474547d55945f0fddbeadfb0b5243890b2fa3da45169e2bd34ec04b2e29382f48d612b28432a559757504d158e9e505407a77dd34f4b60b8d3b555ee85aacd6648686802f4de25e7216b19e54c5f78e8a5963380c742d861306db4c16e4f7fc94957aa50b9578a0b61f1e406b2ad5f0cd3cd271c4d99476409797b0c3cb3efec256118912d4b7e4fd79d9cb9016b6e5eaa4f5e57b637b217755daf8968a4092bed0ed5413f5d04904b3a61e4064f9211b2629e5b52a89c7b19f37a713e41e27743ea6dfa736dfa1bb0a4b2bc8c8dc632c6ce963493a20c550e6fdb2475213665e9a85cfc394da9cec0cf41f0c8abed3fc83be5245b2b5aa5e825d29349f721d30774ef5bf965b540f3d8d98febe20956b1fc8fa047e10e7d2f921c9c6622389e02322e80621a1cf5264e245b7276966eb02932584e3f7038bd36aa908766ad3fb98344025dec18670d6db43a1c5daac00937fce7b7c7d61ff4e6efd01a2bdee0ee183108b926393df4f3d74bbcbb015f240e7e346b7d01c41111a401225ce3b095ab4623a5836169bf9599eeca79d1d2e9b2202b5960a09211e978058d6fc0484eff3e91ce4649a5e3ba15b906d334cf66e28d9ff575406e1ae1ac2febafd72870b6f5d58fc5fb949cb1f40feb7c1d9ce5e71b", + input: []string{"cd0000000108f1fb7bcc78aa5e7203a8f86400421531fe825b19541876db6c55c38890cd73149d267a084afee6087304095417a3033df6a81bbb71d8512e7a3e16df1e277cae5df3182cb214b8fe982ba3fdffbaa9ffec474547d55945f0fddbeadfb0b5243890b2fa3da45169e2bd34ec04b2e29382f48d612b28432a559757504d158e9e505407a77dd34f4b60b8d3b555ee85aacd6648686802f4de25e7216b19e54c5f78e8a5963380c742d861306db4c16e4f7fc94957aa50b9578a0b61f1e406b2ad5f0cd3cd271c4d99476409797b0c3cb3efec256118912d4b7e4fd79d9cb9016b6e5eaa4f5e57b637b217755daf8968a4092bed0ed5413f5d04904b3a61e4064f9211b2629e5b52a89c7b19f37a713e41e27743ea6dfa736dfa1bb0a4b2bc8c8dc632c6ce963493a20c550e6fdb2475213665e9a85cfc394da9cec0cf41f0c8abed3fc83be5245b2b5aa5e825d29349f721d30774ef5bf965b540f3d8d98febe20956b1fc8fa047e10e7d2f921c9c6622389e02322e80621a1cf5264e245b7276966eb02932584e3f7038bd36aa908766ad3fb98344025dec18670d6db43a1c5daac00937fce7b7c7d61ff4e6efd01a2bdee0ee183108b926393df4f3d74bbcbb015f240e7e346b7d01c41111a401225ce3b095ab4623a5836169bf9599eeca79d1d2e9b2202b5960a09211e978058d6fc0484eff3e91ce4649a5e3ba15b906d334cf66e28d9ff575406e1ae1ac2febafd72870b6f5d58fc5fb949cb1f40feb7c1d9ce5e71b"}, domain: "www.google.com", }, { - input: "c3000000011266f50524e8d0fe88cbf51e3ad71a13198235000044c82dc5d943fb34cc6d5c5e433610dc7a44f5951935c2c1d14ac641b02472340a892c4492dbfe3f8262109108fc36d96bdc1e9e46b5f1f6ef6104add2aafbfd8e79246eb3b4637541aaed7d195571724e642ab4d31c909f1db86e7d8516117ce8716bd1e3acb664c499086b0f3bc7258595420e7bb969f934457d195e832ffff4ffddf11123eeadacc48190e356c8f0f6abc381deb7e285e3b0613a795b19bddb9f002ffdf6fd70f0ff2072302b33d2421aac6540bb9f0e85c7237af0dd56225b2264d769160febab952e64bd5155f23e58c6113891143f946591032b41816aed3ac54f521f60605f86791de24c5765b664c1348cc53d5d631b4bbefe1915f2b21fefafb47badeb72d8ba1fd5c3cfeb0ba9d0112396f170e94cd33952c4fa87997b870931bf1a300e8e127f530815ff087815b4f9d004cbcd17013ac143847572a1655a5b36e054e8b9951d747c2c6ff25d7b2edb13a2a6b8074062332f2191f6830cf435a4ed9db5d9c4eb43a143bf3edf0c48f6f9435dafad4afb743a5a33990379df953ecd388e848aff0ebba9ccc052b8303c0bd1fee7e7553af1894e81b7772818bb69249540ccb8cfb47b1517abaf71c81c3bd271f1a5f1b66465f850f377c9db682b8e543c3d0c10fcd2dee263630889b7d1d521d1d27e866ea4ab5f43790d6a7f76ceefd5783678ca92cc131fa42fc4a01e2a81cad734ddf17a53e1bda8e0a21afc9e8c1118c9459b13519f5b3c3d9692c92234f01129d47ae8ec70625170847472801190b46d36f73b868f55f5a18a3cb05af6d38610e0829e4fbf13ddcc202341702e43dcf33be76ff4afe327e5783287c137aad075752940b41e7d9f5146e36d908897c6d7a9fdc343fde2d9c9d6e6a6b237669bd3e6abe0a732861a679eadfa29a876c6a646953c9361830811b012b26b31c9e7158f8de9c9a108346ddee3dd3886da6258364c1281bff8e055f6384e3a23e198b5e6b726fa7f811b3338072019d4b5fd05891770d11e3ed6ab5f7ed33db1c6220c5aa8fa1909949ac55d5435b75982e17aa80940fa574f0aba4dc340129cad491fdf1f5e05c4e83e36ad29ff38f15e1c9436c792024442f57f07583d671dd05446c84ea20b471303f6ae4e5e13f244d671e0ebe94d3d5c17d3f3f378cdd51fa8a6d2c977c78a2397dd1e251cd979803d617d45f575e5d9db0a28b3c4c25fe2af24af5bddac09786b6d6d8aa19cfbd5409bdbfed7d518ef5c863f3ee757bd9d37cddc546cc57d2e52b6ae58789f297a300f1d76c3842603eae4b1224de31a939a68875c86e697aeebf7ebc65568f43fc681bacab830ac4a2164d324e90067125bad702192d01cb3cb3d2689ae681967e86fd7ac93a25cf2e905c88ca5ad7d11962f021754cf3f61224517bd3411d5b5a83955bcea79d702466d073a6eaadc1202b3693e555b051a5b19457023a01e7f943742bb7f5f8aeba8d4e363973aebdccfb12479619cfb93e833be702a307e796dc7431a48abd9b755b392c510b98cd20ef778e2ac88d6a04f23ba8a253d7eb7c13e0c88c3a21f7e23857c58704d139703a47e0965bf2dc8810dc36894ac1f3da73c155e271c106a718b2d184e4e5637c820fe909984642960edfc9e62ac50af5dd3feee6bc560ced7bda676d4e290c9c5916fad52180bbc83d3483e95c79bac15c209936f21042dc2b6253eefdac06e7f4745044eaa0acedabf1d1c8cd9402738", + input: []string{"c3000000011266f50524e8d0fe88cbf51e3ad71a13198235000044c82dc5d943fb34cc6d5c5e433610dc7a44f5951935c2c1d14ac641b02472340a892c4492dbfe3f8262109108fc36d96bdc1e9e46b5f1f6ef6104add2aafbfd8e79246eb3b4637541aaed7d195571724e642ab4d31c909f1db86e7d8516117ce8716bd1e3acb664c499086b0f3bc7258595420e7bb969f934457d195e832ffff4ffddf11123eeadacc48190e356c8f0f6abc381deb7e285e3b0613a795b19bddb9f002ffdf6fd70f0ff2072302b33d2421aac6540bb9f0e85c7237af0dd56225b2264d769160febab952e64bd5155f23e58c6113891143f946591032b41816aed3ac54f521f60605f86791de24c5765b664c1348cc53d5d631b4bbefe1915f2b21fefafb47badeb72d8ba1fd5c3cfeb0ba9d0112396f170e94cd33952c4fa87997b870931bf1a300e8e127f530815ff087815b4f9d004cbcd17013ac143847572a1655a5b36e054e8b9951d747c2c6ff25d7b2edb13a2a6b8074062332f2191f6830cf435a4ed9db5d9c4eb43a143bf3edf0c48f6f9435dafad4afb743a5a33990379df953ecd388e848aff0ebba9ccc052b8303c0bd1fee7e7553af1894e81b7772818bb69249540ccb8cfb47b1517abaf71c81c3bd271f1a5f1b66465f850f377c9db682b8e543c3d0c10fcd2dee263630889b7d1d521d1d27e866ea4ab5f43790d6a7f76ceefd5783678ca92cc131fa42fc4a01e2a81cad734ddf17a53e1bda8e0a21afc9e8c1118c9459b13519f5b3c3d9692c92234f01129d47ae8ec70625170847472801190b46d36f73b868f55f5a18a3cb05af6d38610e0829e4fbf13ddcc202341702e43dcf33be76ff4afe327e5783287c137aad075752940b41e7d9f5146e36d908897c6d7a9fdc343fde2d9c9d6e6a6b237669bd3e6abe0a732861a679eadfa29a876c6a646953c9361830811b012b26b31c9e7158f8de9c9a108346ddee3dd3886da6258364c1281bff8e055f6384e3a23e198b5e6b726fa7f811b3338072019d4b5fd05891770d11e3ed6ab5f7ed33db1c6220c5aa8fa1909949ac55d5435b75982e17aa80940fa574f0aba4dc340129cad491fdf1f5e05c4e83e36ad29ff38f15e1c9436c792024442f57f07583d671dd05446c84ea20b471303f6ae4e5e13f244d671e0ebe94d3d5c17d3f3f378cdd51fa8a6d2c977c78a2397dd1e251cd979803d617d45f575e5d9db0a28b3c4c25fe2af24af5bddac09786b6d6d8aa19cfbd5409bdbfed7d518ef5c863f3ee757bd9d37cddc546cc57d2e52b6ae58789f297a300f1d76c3842603eae4b1224de31a939a68875c86e697aeebf7ebc65568f43fc681bacab830ac4a2164d324e90067125bad702192d01cb3cb3d2689ae681967e86fd7ac93a25cf2e905c88ca5ad7d11962f021754cf3f61224517bd3411d5b5a83955bcea79d702466d073a6eaadc1202b3693e555b051a5b19457023a01e7f943742bb7f5f8aeba8d4e363973aebdccfb12479619cfb93e833be702a307e796dc7431a48abd9b755b392c510b98cd20ef778e2ac88d6a04f23ba8a253d7eb7c13e0c88c3a21f7e23857c58704d139703a47e0965bf2dc8810dc36894ac1f3da73c155e271c106a718b2d184e4e5637c820fe909984642960edfc9e62ac50af5dd3feee6bc560ced7bda676d4e290c9c5916fad52180bbc83d3483e95c79bac15c209936f21042dc2b6253eefdac06e7f4745044eaa0acedabf1d1c8cd9402738"}, domain: "cloudflare-dns.com", }, + + // Fragmented quic sniff + { + input: []string{ + "c70000000108afb466a232f7f9f2000044d0168a15a021477ecb9731ed77784d42301462e2d59b0395adc1fa6b569d428583f100860d6b6ae29b6c1b8c0f9c0d9081475ff801f34a9e0677adf685f02b1169fe86c683fb51934915ff43921a73b98fb0b734406f8dd90ce6060d75e923b0d3c738291b421bf16de27ed4785d727ce589f5d0957c413c81d6ee75052e3ab50fe53f1abbb24a138a52e1412683992ad769e65ed301a736914843543e2a3e11eb395726d4fcc9283f8607b38685069f63d05ab8bf38aa24d4073a1e68fa1b6087cec44d7fa628342e9d88a0d20b381014cdd1a07b9d913a3bbcad0cfbddd0560617cf26054138075eb86e06db1e68781541587302e6dda86cae779f9848fcefcc33626f8953bfe4dc293d23e74c87020e79e9ffd58ee345382bd4d1d6e5a3389b0a977124708d05e3c305545857041734dc7092901ab54604b3750b3139dd3b8f2bd94cda89d85be3756fda6f0cfb6f66af3d2e36a7808ff7bce271a0272f8dbc88193ede31613433985cd35c7bd9b627d434e7b2e94b38402b8f1b5619a903572dcf4c2b864c6ee66657c9ec81e03fbe765037f83b2229171888ba08651fc78a1b50c7cc52f6dfe8273723e08932b1a16a6b717a80b5520cf3f40e46f9d9c350eaa914bf99dd4ab700cfdae21437daf695916d4f3121235e4913e0657d8cdcf4afd8f2c7ef977a2dfe49f46fef46c8fa6932e745311d4a6eb3124d5e0a204b9e3227e86a55e662f7002d4f4a72cba8c77c3adc3eff076dfb9195cf68455cecbbfc9b5444d9c4a4775bba68d57ff52edac6ce6ff4efbf6466579bf68308f2ba9a59b2c09506064091a86af621e9dae52366a90599db0d64a23944bc48966b6d3ab8e20f4afb5b0e94370d26a89a9c4207b454554e58ac74f62ffb3eb2686eaa596b9610322a5ce8eeb42f2ead1c71b11b51bc4f1800eb549a2bb529ca4a0d165ae461e45b556b2365e9459d531489d59d0dfa544a76c5c00b0a01270741d4061a331c32fd6cd0e68bbce49137b852e215c9db52f3e430416d8979520e5270be324f3d93132358c0eac35a4618ea7aad997dbbd8e99d4ea577271b935e3fe928f90abd94593806d272a565a414686b8e56c28e34b77671de6a696b09414380bc658c69a309d3225ba8493e9076dac776c845ce11a7ccd6cae58fba5434014250f3e211058b2efe3424b991d679a02ba949b086ba12144c7df3e049b5d026f386e4ae712c9b0b4b02730dd6862ed4e72730224cb6ec9101c5cbb7ee4fc30d497bb1dbf74ffdd49d8cae6c7c9a364ede453d9ae25edf27a2153ab285f3e3be66b2968d67a56480f1f74c4fe61dc69db3451f5b113d7ca02e5afa8627f579c07a9b1814853fb8fdaf0c0f220f89725c757f5617ba4e43cb4f3ad9ce18f48f23d10f9e8950b0fd737070655730532896d93df8768860ebf941365d0634db399feab1f8a88bad28d25e689c5a57321debb8d1435130e90a699e17fa5255f2063f09659a432e9ab5f89eeabe12756bfc5e02fcae2b78a9d0f570934b8d4af8f4afbd57549176f465a0cea485dd89c95a8ae915b4b99548a4c939710c16908f968368baf5f547cfee07f3cbb6142041d6e6084aac253a0d3aeac628cfe76f87b94c3806cb14a912ce8e4981e316511d5ede36f526805d6c3fab5b72d9d91f4eacd26e28cb181ec66611818f5c206ddd52488707a940dc12144ae825d25929bc32b718f46e471fdb30762d299b45c84f6310a72b60", + "c20000000108afb466a232f7f9f2000044d00582e8683e329a63e5bf4dc93e93e325ff661e74b9cabefdfbf6065c7ab203c8a629534e87e5f2d4c0f463352904642358b8f137e99802c3a26cf22235782a777769ecd134c6b4d0dce6aa10b485c45ccdcf6deb805342e99ef97e2777aee0b2a44073843fccc2f8eb837031f76a8e968cb01c13c1268af095f54f860958e4062a84e2527bcc9b25a7791650a844de1b0c4b2476282a0e00c9de9d39a41914d1e797a88a8997b96b25a4c194762912b2ddee0e01a365f1afa1e82ea266c14ae94e47c90b5679e2cd00e63ee5a834505ca33463751bac22f3b87afc80099335dc7bfd12b7df224a23ced3d2e25b58a04c4b5cb089ca187abc54d782973c7bb157cc515c7508431ff5bdc227871da58b9ca8a9a576960f38edb384112b08e4c70672a6f23d17d9d901342e56c12370deaaafcb22810eb352f1a6d9377e96bdc1ad4dd397dbc6a227b70f204c1a4e9a4db2705763b82ec4df1fab11420aae547155c6b49abceeed997ff01b7d24e369c65f7edf18665d067c7d2bda5ec8623281fce8c77d893cb8a42053756713e910894a58ef5bf3d9f3a41071026660dd7cd05e1640767ec68f78e22c1716700ca9c0f076f90a65cffc394c10a32071c6532d07b59414181070d08c9c84e3d13842718d51bf90dd36ab1b3f708df7eeb3939dc8553787308983c3e9ba971e7d447788477a7140196c2f717b9ba4f5da92d73316dd11c1d1830b4200f26f733a6c65ec1cc21549b485e3a43dc7a2b68e95466a53544082a20d9a43387a7ccbfd353f7e590b7047f13bfc0d91923c2d75dad4f8091ea96502f98e83e5c30e52e4cd5c670f6c2248ce37cd6ee8b3970531fbf0c53c5fa9a0d73200442b755c91fa4f70524ffe8a36063b6709d3aa9f6b53eb0aaecc57a8c8c9a7ac5e57e03e9cfb290b67dd8222a245ff5439914147e2799fd1cd2ca2cb22fda299443b81e8024adc59d098058432fa4bde376b8e59075f6b86427b4ef6cd7c83b5c08add0c3d3543aee8d672c41cb287c1f0a17f1bc30f62a57490afb2d9f401bf302fd473ddbaf63f6883221579743d6aa1f386b8b2f5db06d7d6c36be81f29fafd14b82e863d744f116ce2be4921631f1fb2797289fffa9ee16a3e537ddfa52350546bc544459c0c9d66fdcbd41612cfc0e2744f50927983a3224291c1ae51608fbc00f40c60ec72573a7e128c3415b0d9a7db52de8ff763dd66e2eeb03ef2e67838c9e68cfddae4b86a3f34a69e0a473b5a73ab627282648df7912c11a4bf033ade185a8f438036b99b960aa6213c800abbbd751248a7ae600357ab888433125d49c5643705ecb8c86f2980050edd7e3c579ad6fcae9bbe2c8d8b38004426f35eadb543a3bef42355acb1b94c21d7eae7b6ed422ca0d58fa03b227b035628871465ed6509254c8a3bf43dfadbb247ecbc52d80d65e9c03c4bc7bc35a829502bde3868af9c33737cd88d70f7427790313eed4ed1938955c5dd360212ef700f274efcc8c26ea94c4e2e0937d475c5c4909edfb66714d15d12e153e5586725ce0c47e8a1506bb197366754ca8960508f22fe7b83a5eaa40f05f3cb87464dc6b848080c0e0cecf2dae82bfa42cc6f52694478dc3d00ab0e1ed696b98e26c7fd34d2efd969f83e284c28ce3f27b178f4691c772011f61722266153142dd0d526393e6c6848d201115b256e65f12b911a983bc2f96a5b4b99f63f0b58485a521553a3e1d4498ac5d4ee70c3f9", + }, + domain: "quic.nginx.org", + }, + { + input: []string{ + "c00000000108e63b9140d034563d000044d066e1913892ec1d84c179dfa9596e0ce930171a134a09446a888d9e579a6f7bd77df6deda715b028d64f7866603c6deb468d60ecc6488b5e5ee2e2daa1840b76ead998023593c9ebc4178ec89cb198d3c79a867e27177a74ee5f3db74ea194e36e328047ffc3890192665a6feba09ba1e224967fa9575dc7b094e1c29c7f3be9961ba62e3e063f674a09786b7611138e1edaee32cd1d47839e840a74f25ed786463fc48bf3d38a4c793178ab7cbf5a3eb974415b9f9ef7861dfc73460594332f5545c7b7037043afdfc1aa62ac3dfb76ec2c6ae8ebd351f7483992c762d6483b3e2c1454c8ed939ce43f858ccca22d9149cc9da16af86a010be7f3248cf19fa442e94d625ec7f7144b01ac9afb8fb8c595d4cd12fcd2b2d9986371ae65f6f216bed152b79d2782d60f1f01e06b359f88900c4bb3f987f3ce336854a5beaaa616813af4e5f9bd82dca0af6886b544fff0261807bbd8cf90213299f5802b98edc27a6606be8e2bbc18fa7519eac260dcda139f164796a082908459c31aa964a5d3f6fed8944ad61bda126991468f3b7627f2470179619864f234a395ea3bd4f7ba4c0cdf9f5f0dd95d7d59476f2d2a36521c13886265a2fbbd4345e8d1d1e7b5d01a58fb11de23730b087e2b702200155a1ebd50db5751d279438822ac158173533140998a3056893bf470ac84720cb37a4a3205fa88267abc56520bcddacee06011d929c3a114314822d8ccf7cfef89f2fcf0a4fef800afbfca4a62ee848f22066f68c7d3c5c9a24402d422fc2fd5da6d3b470b0ea253f12a883705f7f78bd67006ade4f1c8a3e8fa052656b5b40dacd8062228871cc3bfb1a9c38472b0a720c3c750430edbcbdcecd46b144dfcaa009fee06770238d0270e80671e8ee5f5df18b86dfe8df2f121245c0710ccaefecbeda0ba3db945c768624dc38f21a4ac53741f4e58a5052f3d667fc466b69905f05d0843cfcb830163fae18dd1eb0ce62a59420db9c44958a0eca9ba4258c8060a9956343f155da6c55b2060427d07d9e311729d2971439c7541ae2babfce25a3f5f361fde86c39ef6c04e4e3cf7dd70c9cc0758ec5db3f0cb368e2447080af51c8a5fa6b84ec3175d2d3e6d877b6953e433b4e94b52e1a5f2a1ca37124c27e47f9de5d4c74644181cd37f3f3863ca529c0847bba91c246dadba94b4566b08eaa06a0db4d58b8cb0c8d3070533306a3089891b24a7c4e11b3aa50d5628fc1d136388e8bfbc420a6f12701333ccdc95dec25d09ce25fa4b654260965b91f05b1542c2ee02008d01de4419f14d6749c4bcfcc45a332ba0772def720ea3c8d207802418137b733e779eb406dace0b4b5f5e5e14c787f3e044e6d8160f90fc3c65bcc7f3449205b63294fbc11e9bb92c007d1cb59183eafbf76be9680224cb442806500d71870777d087bf864890848f4a79424c02304f2a6ee2b07f9257f4a2f185ee21239625e246cf680e74b85d292cca44261c6cee6da39bfac3882d28fe547a500f79519ffcd3f54ff5a905c99f22a5e8142c903c41adbe1eb9770b6cf554688529091b126ed2168a23bb191c2b89728e31773623bc58bcb9baebc2c664c79d6ffee7e4404e039723eb05e7f7835c87212431a0131603fcc3fe090cc2fda8239b8f42188b35f98d7fff949b3044544b3bb962ae236a664d76d0c751d9c9ed1271715d240f111febdf7045502f2afd7de8aaaac650511e7bc7716a5b6622ae925abb7", + "c90000000108e63b9140d034563d000044d00b2498988864d8b7f59a00d26165f5ae638fc9b1c12d546ffd86212ccd85f654259cb8b8c9d753c696ddad7ee4847bf3b3c10063606cf3972f75e17ae23e73b6a3029f23541f674256d19677665cdd0b8ac15c3f60984bc14ff5dc7a9ae37395516204f2020965713fccaf35cb0a5823085cd6211d681dc6b39be9db46cbfef154a2b9049ed202e9088961b0b710e94bd73259b0967e4d6b8cdfd5b72774fee2f2ceb16bcafa010f247c43b0a9ca25578e7d45bfda7edb82e91f8e1c0a2cfa990223bf97ece42862d3f329521fe2d12493b717f174f966d173102e5cca10943d5b612101d65d0dd48b44416f9ac1eac4575558ecaaa39c47ade2dee6e25fd219d799b499143b47a5bf449701b939c1dde111349cd0d63efd2ff74fbd3573ed40abfdb2310e2740da40fc50c7a137a3f32c3a26b3d407f80e669fe7f9a3542fdd412a9cb53f845d9c1af0814377bf92e30f05ee387fb8675807a6de083c85d3d7860601c8170923c53e5773ee388b68e510a28cd7009c485bd4cb861eddfdd265de042e5a018d20cb810614e2bb17b0f52d6bf620a6f173e0b41951e1b83ffb29e3b3b3c5d9fff13acd3b409021195201d003e281d8cda7b0f02c273e17b1f9b9e8cec4296d65a1c4923b78a2e4273cb42e4e159980472e440078e542eeddcc5a9bfefa5a72871fbcd9ebb74fef20a50215bf75cfd8572d5ab9ac5945e8d6ca35884caf0af0446ee9aab0a1cc3a452ec79c9de786119e63bb3a75fce0ae29c15a0c320fff87e87cc23a05e75b4f4b30b75c6aa036c4b6657f8200ea014185b31ee7fcd00d1eaf40973f347fae227f89d41794fa57ac1ed1efda3ba840ef27852cf33a9dc9e2d77b56af9ced9e75707837aa8c5395cdc15134ba132de87152ce53d506c53284dab912bbc276542504cc94afaca71a5173ff13ea6cb45b47dde9965428ba5d8eb968cc2a5729c2f9b8f1c1de208943a2cd565196e040dcc415d769ceb6300c7909d7e32bbbe83c4cbf4d49f6e34fe56b651838628f3a0001e99f39cafe45c98e455aff8d98f89942a862f7505b9f7fe3f64dacf8c574affacf91c2c05f094127acaa5187f9dfa188f67db421243a02e583942138c2edf45fec4c6b6a8a791da9055be247e9b252e9f7c1330e76f9cb3aa5feebb21f871315b5fb90a1df0b8056513b74daeb6ac995f85c64150ad115a14830d145e5f4e6638c26987b676a1dd19a9775df29ab442ce6143b0fbf8f8d4618084896e34812ed59d63041e2b4ccf6c959a6c849813dd926082bb7b1adedf69246547f335552bcdbae7e466ac31e07e442530ad114abebc6f58015b786e7f35644307fa7ad3d9248c56c8ff472735c6911da1843fe53821b8f5180f8844db4a9f7a826a919fd93c4db4d25861054929260dcdc46d085827c46d60f1097424a6ef250f5aaf3235c80230eda4eb580ce93e1ac8aac422a7aa1241562af601981b84b74949f1c476705c8030eb5d447b2414f9716ff3fd606cd750030b94345c016078bdcb97b7ebc24f661fbd08802f32df18d6a2aa85bfe2e9b8dc76b121c44ae9f29e4413051b527e99fde29720724337476c0eff325cb6220a290a9eb852151c84836729d6a223032e2c638857d9e7f469b84d7d650c45e56e763aee73f902e82b055425c4568725e2d4efd7fde8b02906bda48af86bf47ea27ff00f4528494b74be9bbff001cc841449a184a4e00d64e51a72660a2c21f704f", + }, + domain: "chat.openai.com", + }, + // Fragmented quic and 0-rtt packet sniff + { + input: []string{ + "de0000000108c2751a596bd51c6e004041948ab7d9d493e9e1e9902a7734534fb9eaddc70ca7f821d1b58a406b23ba9db1d03266ae74765b03fac21c284fd50cb0a3d1ca71d8c3cabef5553dd1cb748ac662", + "c50000000108c2751a596bd51c6e000044d0538af4ba75e226a6fc7f43e7f1f59610973b8a6670bb8338ca7ef7d90f81aa59f179dae5f8f6dbd24ec6fe576b28f6ce6cd46f26de143b8c99cdadaecf2041948a61bd5a8591486e10022fd100aa20e6423b4f4ca5773edb1aba79b73d6150ee185e66da60e658b2a698098462122b6b80c7fbc5542b0b8e9532898c1f31aa2ef55cbdf036d74c3069abbb261660f048d950b00b7db279ec2bc39912102679ddbffb53f1b1921f137fce43e164af86c72908532f4cdc48eb462a9d9e9cdd6d3c3faaf8aa8aea312dcac5d6aa75b1ade4af6901576649da7e3efd4199b92107d7acee8bbf06734b2484957c3d8cbb1f3fc0ccd56c55223628ed8ea514ffd101bac370c97b28c7da81175ab0508c0002d458cf41f7159dfce22b447c1ec502c186b782c1854718b7fc0fc39e5c09aee31113fc4c5003803fc27ca48850c08a54dbbfdef6ea9a6a138cac0ecd045cfd5607cb6c99c39c0cb21778857f97416b78fa7c6ac8ae3fa2ef2adb3b85fe3fdba70ef9265bb3d54e56ec68b8887d54d02d4a571a6b793ae4df8ff171c881a554b5c5a7848351d446ab94c90ee9c600f03b785fee6300450a4ffc2a55d417952e15449a491296d463ac6942bce4ca93c99440396bc8984073ec028b11ad412e97e26f9248031dc4b1a6ae385803bb578fa1a3b3a58a8ef19c6c511f17b28a275e8c40e51fca8f410a4a1879b5d8749a44a6a9f97c0c9df25318cc28fd0cc61eea78ddc603a17e74eb542c8c08cdbaafa3b44566db4d67e8d1429332375cd30cdaead9594c46d8ce91bce9813c3ca23f55ec2f4dd3ff141471bc3df590367bc65e4830018ff7d845ec4987d11e471d114c48acd1ae9b7670341a34077ae59ea6c3bfc4675cf419d37db48a98a5573b69867039731f537098b46415a193f50b2c85bf9e5da45d6757c5c366e21f04ea62d64b81c28be5148d89e53535414067cf609e59686b7fd135f5cb473e57f6c82dbb291308a1065e0f755935d77517adecee55e72cf37ecaab1b5c0c6e0c7463a014e7e439757913f6e43abb6af775d21ab6e43cbdbcd1935a000cf8025ebc11378d86d6f72d51bf2dfe4be1db5d3b0fcacd13e1b9fbaac6e9153c3d1f4e876f2fa9c3cfc84fd0910b778105b66be70827b1830b7b3c9633af5d83ad527efd81498cbbdd112873cc5ced573e6579acfe817b62280c2122b582b591d52b96cac047bff91192a5cfc001d15c811e055dcb1c9710dc892258ed1ab5152af2cfc57a0b93205dd41fd82b86090b4281b1493a8828ebc96bbd603b888cbca4a15799a5f3eaef93655d5609948080ca57c696d0ffc9a07665bdb063b547bb5a862c3b058c9efb2e7b79cf405fd83efacaa4b8e3a1fd126270587119756562c03d69a9cb67550369030a0204e531cb8df91ab2dfa2e4106c590c59b1b13c447843937929a574d3ea1785db0d52b4b2eeefd1a07c69729bec7c2813c9eb1249f706b3cc14a3d489d6b42a641dfd9e91aa70c7d3222e154af2d7fc1a8f48e5ba11739ae128d1f32ff929aaf4b249df5ea23f7847301e36ffda02342cdf1bd9dfd1979cbd8de32eb8b1eb8c415ddd267efe53f54678d9fc32435b34b00ee2256d8b6190e30a280df5bc48cf9fd669a52469954deccb0f1da37371d513ea57f31ead22a34f9379c7931fd18286d9fde6ecfaac8ca2a9be79d688c5401c65407543c066532f6621f256551c4a98a86b543c576ed0f3254daa4915", + "cc0000000108c2751a596bd51c6e000044d07b624bf3d95fb3b7299b67dd836fbbbeb05a51650f9b2da3b2695070a0d19ab0d5334cc04de7ea7494fbe6c438f4e84fa56a3f246132468b5b4f1ba0fcc0251cf278338e15fdd715d5bfed18c1f98ca3cd3cc7b6f904aeeea2914a8b998dd3ae7df694c49c1742dccbf4c3472ddfe2e447959655459c11f18bddd9481eb597b887fb3f90a7d0f05224a144f87a5fdad502ea1e46c1c9f4b4154bafa4542c026296040228703bcd020202acceb772b596bf788341cceca864c8907037c39739e511b04e8ba956efa0fb5cb151ac90eb5817444f6488d593325ad4466058ba45214b965c5738f33d5591624584559ba18e89913b868619d498072e3aa1f333f5d6e3d1db88b28adf7d9350c3c383c1eda894f36bf1bb2a58c7a5e5c8b20597b71a099e46bbd3d8894877e43b0183919185b4e9f059472203979d3334c535fc4eaedebebc79bd1e423184765047a50e6dcc76ba2b23ad23511cae2edd2ad8e7f7f302226dbf6c0e4dbc8c08cda26340b9abfef1ef3333cd511295f14c87197d7890576b4076dd9686047854e67733599d96a99194aecf7b927cae2e5fa4568afc71e748dabd3bd71e6c3984f45b06a068a7c9c3a1ca7b5c245a9bb2cc7e2726e833e283430a25b6ccad55bc5b7644b44f99fedeff3c3bbf995a0387cf1e45a5684e5d1c01350d0cd2d615ffb6d1011d80ad16b75925efcbee483e4e2c0e2386e9e1b35b5a107ed97058adb60e323342989559856faeaafe5149bdcd60c113230f9923b2f654c95f986944a014198686f9c2275053c05080e3bf9fab7d46302948b152e2f2fb1ecbe71b412016b3f25ae512ad45cd096d5f284a0c2808b5eab03b4b9b2dff4d81bf234e75e30d480f39a5f9737563e31a19b14d1038296915af33e0ac0dc18e9c871e539e8772d525e5fa19afc582b1c00ae573af39fe293e16d182bbe57af5bee1c0939862ffb62e3d52a60aeb71e4db2a4a1708e75afa5f37d72cd6c0e036abcb4eb8db6515fbbdf98be95d0a6d261a9445797a8f38c3579a2f04c9f5b74dfd1ffaba2c6aa05959704b9b8cb0db30bcc360711c5afef0d1e7c2b076466dcaab104c70f3cc0cda33d7a47462c3fa3d7e34a99b2d8ff3fe5cafd27ede28b9e09b547cf955b97b0d0d4ec126957601c6982d176252be422df3366118895ca25fe27a96c9c234d484fe98634fb9e970e0d2b096f2ced5d56603505990a65363726c828aed2df0f112e0c44f058424ff5c25ae60aa2cb5fdfa289e8ebb63908365aa4e4609eae87e567f1e86d92c43992e6d505f55226fe3533f9fc9c9facff9dae02a3e3c97ca54191bebab93881c0e89b9de5bb4acd5c6fed5b1e7978803f693bfdbc125b4d08fd34fdc6aaf02444c4b06010b0eb2f15d86850a7aa5af05af438f6b7345fad4315f631bc5b017c7482e7af725a09844472f48e4de79b15284932a7e99a46ae72b187ee3faaa0f31a36726056e86eb706bc8eac04b68a3302307a157c91639f30bafc2d180670625673310a9a45a171063011e59c57c8eb67353a8ea344a87853e7b600c2b49a7a1b60a2904c0ea55951af6430667ecdfa6e90a8d2d0ed9857ba5b876cf78af190d5013d16208d2b30d02cf2c23e6ad1466f76c30d11034d5d2eca113e2764b2fb6298fc4940c16d971e28e3e6e5d0e8eea1ccb9b4b89741ed675861fc3680457ee08547f4efcf68bb6247313f8218ae3ec372e51ba8786ecae115dcff241e0", + }, + domain: "fonts.gstatic.com", + }, + // Test sniffer packet out of order + { + input: []string{ + "c50000000108b4b6d5c8b9a19769004047007e07df0d887979774085206f2e7f0146b02a8699715a54fc71ef27ab5a9e8cfbf155497bed9e25934aa74db1b3b270112472b7bf7587423b3ab2aaf99de34cdc591bfe04cc0a448875483ec1f071622121a49c456dc3ce16bae5f61f84ceaef9e8b71db56479845b764507dd9416e8c44b8c93406a230945eb8e484471c1b6207c9afd944fa0fee555a5c966f27ccffb4bfed37fe3936f2c84e9852c0d46c7e2e94b897fcef18c4b0b83d966aef75c0af4240325a24668bc017e0d3f69680ea5b2f59bd0b964062bc40190be86aef3ed0716a18a67057f309faaf3a040222812142a399deb72ebb330d03d59961e2ca10cf78d40886dd094368a881db261068920968f6adf7a7b1266faf8842e71840a29859e877c66e3ebc47d7fe3ee586b6512d9b0e1bea82b302647706473e68dc8209f4e9ca19f1dd25fe386e62c21d9c741e75cb8b11606739ba3de6d6325ee3a9cd1bb2b9613746140ccdaaf936eefdaa1ca7ad73d684e5d82b1ba1dd3356ca0c881f6eee72c02c8b78d02a8217a8fd972e463c77374d0fcbb761459e3ab0bb5492e516d7d4304c19c16a4bed11ea7f4e75616a26a7c81b04ffa580cce04d59825b8ed929578f9219e64bdbc6352ae6e4150a993fc3cc27ce4d66c62893866b9053bb737ac40364094b53d91e8b325b9dab5f537af04f10bf8db644897b0b03b42b1bd6c3aedfe018a6e4f6533183649f4ef6a6300383430f86e802fb4e51976d056a3c40c3b53c847b8308cfbe54dc2d20b8cdc870c73f5fc22c376c35d9a85348ca6a2288ae03dda6b97f0f502f35219e19cff3a810143289cb1f0715f8785028f887bf02c656c9cc372bdc419290f05957ad3dee82b56db352db65aca58e6fa0bd2f753160dd9e7214968c0496be1ab49f978a9252e49266939fedf542760abd653dd38b1659bcf452c753cb89e8235bcf732afcff8f524331be9b6f4a5081c81255e68c358b3444fb1d57bf5659d86b6674544fe2826ca81ee52f93a17b3291826678e488c3074c259223845e4083a413af7fc93d9992823620a8d29d321438a760293e36c4232216207060dd3ee5c4036250ede71ca9cbe335a1e068eb3ff6c10a7f1c8204750d6d0f3145014949a7b4e88a723566ee5446f960a95d9f81cc45155443da561d85a3a311df8172a1c4eb118bf27ec4b3cc4573b1ab421d96d41cc1e5557797ca68f701fe75c474527144d30b9bb00a117637f88896b0b2dcb9bb29ba144ec384b5a085e82e7387e0560a4621423c306b041ad42e84928ce23bc2a7f995ef5c21616de43be8a1657847489b32c8e364846389e7c8cae99530c499f3662a2ae7090e54958ba940b5d3eaf1333ebcecc7f06f29f68ffd97defe65017519c29d355ecb0a4b47ab08dbad8cb0cc5c86de65dfa703110c60a0c55281925018fb4ef49fe5d0132dcc86602c2ab9921a8f3451480d3e931f01c2f9a81873435bb83860128aa78dcc950fb13e416d90ea969aa92763f9caefa0fe3ef4ea82e3af4a3e717fabcc589fe8cb9bfba6810ddf7def8c1445fc0048fb07be043a628e9c920bb72c04d3b9472caafc6c14bffb854a1ba2170dda919322a6d79eab92e3a88888a224093946b87840033fe41941f780f569eaf1fdac55e36b74514d72d09823d71f48f5d5f0ceb7b6d69c5da0e0408c1b13c265d4775db6a0f952ae72bd5c277b22c4be2f2728451ce31e921c856000d20da0489103bad6a6ab4", + "c60000000108b4b6d5c8b9a19769004047007e07df0d887979774085206f2e7f0146b02a8699715a54fc71ef27ab5a9e8cfbf155497bed9e25934aa74db1b3b270112472b7bf7587423b3ab2aaf99de34cdc591bfe04cc0a44884e9e716461869ca408431e1ba92740c598aa74e9cd45706f28942f9cc64dbfd7c292cd33e82b50ae0e2e08dc478c19886718cde33e56c38517f8834d64904bf4fb1d30650caedecb9567ea8ef50157c287a2741e98a00f8e7e19e76bbb0143ac7862a49393f17ec66aa0e2c02123ffb5abcc96ccf92cd542c8f571bd7a4382ff81432d11f83796959696c38f2029db6c6a536a9ea24b74c848b95882562d74739ac95f5a069d48e8756d1a9750c7ebc23d4ee22d617b29b415b7458b3bb8106c22de3a9ace9ec689e6e00471aa33e570f7481d15911d7cf46a429cee1a416558c5e78360795d905ff1e0c81d18fcf4954131fa5b9289ed2291e122cdffd666c66209aa2cab01730739249ce293b3ba3abb31683c108bdfd51f54593f47411077e948f01105bd9bfff1578d235674e96a8b9cfdde119edaa960b84e70fd681312514151de1d5939c79abdfe4953e22be5ad3e6e242d0ce9b3f2e589ce3c768f610d4d3a32e33225d8a5ce2ad74a9b40859cdd9ea99f14fa2a7018e4b6aa6e46a0d73d46d161ec5d3b30bd55078e23987865551a605a33472931428ce222040d20c07d1ebe970e576d9d54ae688a3fe9388adda3da4d011a7cbb604f1f19d2ef1be7ef4713bfa84d4d69ffa606a08b61a1ebb99aacc4e19d0c5034642da1ce2d7d5abecc8adbbc6d7f72ff2da4ce5228ff8626509b38e17b31717c0b7821558b021ba81502d54da7e778d4526367109333383e7c67d5d5bde86bd4001fa13a703ff9259e1c2268ca8f4ed2e6c022a7466e2178bc725f59792803ba28c629e3df7696c416dc294b510920077b2d2b258fdc3506c36c42d37796c8fdb20ba797ee68fdc410325a355f6c1189aa9fc9ee220d42186677e3955cd3c844ce505cd601f04201cc390e923db2ea6407fa2fb4ca7f3f82d0a82d52697ff5ba5d4633bb0d655d7ee3348b89c9cb42870cdfe7c0c162babab4208a9a54700c5785d4134e9e33361480e3512ac8b556e11775536e90ee1270a4cb4d6bf2faa72d7e1f23ceb4fc3aded0e423b6be6a55bc25e5a99163b4f5f72ec4a24fe96f68c739d1848c92c4236a5a637d19871456b8dae671ea6ae5c16ed4fc257612a0821e6dc1cbe2ef4963a1436925dcc4e6ce528fa75e41f7721b379fae8ca09e6fb51d0c3e3ae6c19b98860ab9f74013146c6d375656dd1f530abfa64670a510390e9a54bb9a4ad19977491377c8cd743597bc156ee3f58cfcafa5a547b20852749e66fa8838c100ebde039ea25c8ec32b0c6325b793797546a095e79b9388d8e67dc6b4b3892f93ecd13e64ba4b2ad26fc810fedc374b831921531344c581927da9ba822bd625584d98c7582759ae40f01e14277a0a13d30c2c12536df698330d8aa6a3613a42c493c42692b468b4a2cc6bb6dd45684ee6115848110bf517074efd93bf212c071013f4359f140cfed17bbe10328f2026cb8ada16427122d3fc8a933119a1e3e4cfe2b95cbc73af5044cb099cf34247228972495488ebaa4696280d17665c421be5f1727c5d5b013d8aac0e9943bbbb7fbc2162a4000a306dffe3bc4425cf272f1ebb63c8e4998f867fa6b05d71a8642e29392244d4e2e2351bc149d665efe1b9519cb1b15005393f938d", + }, + domain: "ogads-pa.clients6.google.com", + }, + { + input: []string{ + "cf0000000108277148f2b916666000404700403986db57eaa4b165be8ab9c95452bddb922eb35b7610a8e664f6b4620d870507c241290ce885c36d7672c51d94063bf893e01bc79e1d81bf023338da3d22f63bc7aa433f9944884c88b10f198e849dddbc1e9f9bac61f98f67f27d5452da6e2bda1f5210a145b1f1416ad2fc15e60aa00444362630650bcd0ee47999b689a40100dcacf40a4c3d74fa6293d4a5cb0487d8c76787c04dd2b47ec7718df5a2dc6942069062617b3d40a95360802957419433436c9065bda5a6156291d909a079b6d3819941368d7e17a2e97e36be829bb421b44545af47e37d7815ee1f200ca28ffd361d955ebe0484fb234a7e8a7c68ad824fd14d517fa7b35f878beebaf3dd22bd9f7a39cb7e0fd8369cdd28c05a06323be7af0b2d69ed2a2f4ea9f25d000de71bf5bd6765a20ddf81d976cff2321f1a4584ad6c4b7e9a42a6d4aa3a02b59f7d994a8e4a3070a4646e51fdf354448420ebfd0aa9118d010d019cc168f2fe5a9ff0c42e6091676be11f28a372ea97d008a1a02efd58149106cfdec7ef86f5416c4b1a408d8efba6c8d4742d781374ff0a1a8ac183bffa1345dc8e3a7cce04f66cc865f434decb912dc9e8e811eb59b80d3e39d5788639ae7c5ede73a935edb47d907725656be0522195bd2c099b0241f36664fad1543e4ae43862252662707fb424a8f5f9486b8e3779ac24bac457671ad664475d1fc9eb1de3c46f624b559742b3477953552e44f20cc1725a11ab915423fdce7cfbc8dafebc0c43d1ac3d3373ca2f0210924433c46e5fcface47a65579efaa1999d52b2632f69c33c3c63537c01be68fb679f9229f8f68c5caaa23dc4c61d3c45dee90affed984dbbfb06b2659447400b4dcbf6e574719e8d49fe0dacea9509182a42f6463138d8693a3b8d797d3bb6b0b02648829d666341373939ac41a57e90fdc2469623b6e2d772199d7c806d5998f439603c0de8413f9d29f79323ec5410b409ab8c95547ab50bb921fe0c407b7aaaf663389bdea5ba56c023dc4622d6dd9cacd8f318a6a0297d041cc6ed455d906be50dc85a25ecb32f4a565432fec9f359833be1c6a6b7b4bd119d3c4b29932eeec8d140dd467ab4d969bd23e9d2a95b92835587f32428f957b6785b8206a4834e00a3013e0b6a5855f16207268bbdf311572c54d2e6ff9c659cd02c258f494c3b168ea170c69138b63e0dde487b72576e87657befa44548b0b4e1e5a837dbbe66a559cd1df8f2151ba513930243fd2b7705bd29b183dff966224d87ffabb74017d634ab2e4b368052504a7f6bc1c62d39a29dc2dcfba683bee2039e376ff391abbd13a0b89512fd8f6a4e66051dfa04e0e1a3cb4bd56a9b17e27651873bf2ed50f65cf1cc608afaf06fe7e6238347adb66f01d1f0b9b51f0078615553cb8ff8d6786b87e19dbc44000025693c4b34cfd695601a680efdc1e7465a981b0f028cbd3dbb938789f240e39223290e34ec303ff5c78a4a637ac04dad60d744f82e96c3c9e8ed6cb0248ac73b5b3a92007edfc1277c3cc6fa1d0045c1c371820f06bedaf046dd999665cc4745ddf8934084ae02e9238acae6dea330b5798e046138f5b15011875eae72d6eb6689e56e0ac5c5d9e25dc4fc1874cf37265e68ce5b8630b84ad8dab7704474f0bfd08ac295b3a508284fb6ff201f0aee6388d0e1d5cdaaf4c20429874792109f5b8e2f3eae6c397e46a510ed829a6746e523481465f64be4e145c83d6fa6951229d3", + "c90000000108277148f2b916666000404700403986db57eaa4b165be8ab9c95452bddb922eb35b7610a8e664f6b4620d870507c241290ce885c36d7672c51d94063bf893e01bc79e1d81bf023338da3d22f63bc7aa433f994488828e6082edd53e228164d8862067483762ea9523c90d565b9e4b185b7805eaf8220664264e82a95164ab6cab4fb3f5e795e246e7205aca236b3c94dde0ff4fa66ce0924d654829d59c3eb690470b20c5011c739102257e9c2247dee67c0b98190d0015154d31041aadb026b8d3a828c861a15dccdab0cec8cc99b8d6c2acddbb93ab66253e87ac39016507dba42e8fa9f5d22c7f27645a02361842a59ebb2eafefd0f3b92bd9692a96b93875defcfe2796243be8861c59ce5ab03f1d65d308ae456cb9656da1f01026ef0807cc9930021b29d69b36881c3e7d70fc68799ca81922008db93c9ca4a365ee191e214d9829481fd430194ad4583a0ab2e920c25244d7d64662872b3b69ab413ccf0dfb6bf2ea9a9b93e04ed19f8a0e146613ca9d511179f80aeab40d573590d38a7c10840e3f8b9ac1bd23b0826aecabf6d1cdb2aef02deb982c2029dd6d8bc21da6c262c8116b7b383ce8c9eec69da3e16c044dd96ae08a98595d128e89dd55e6dc8eb08b8d51327278027137f60a0e1b42878f98ca898587474f6d509c3a58ff4dd7f8b10905c200cf3170bdec725ee14a1ac8ebd1022509d3e499f5e72168eac43264d7246daa0bfc81a216ca97730b7e043cad8d8a9af5c443a5d15e9a88d82b6750c740eecfd63561712a185c69532b1a18b23513d7cf871f14d164ec544f22b6a8cc77d6fae5fc6e47eb64f08617098d229da78a378d6a0864684a7978f650c7922c907f97b0ebf2be29cc834ffe995c9636b310f4a8c2c5623c3b7b533518193d226923f111da1a0e8055b9053ad7f7504d194fbc3ae2b41cef30aa099624d5e229ffb56d5883a5a09163d22455cac52e37ee0ed5367b7c3bbcd4818a46b9b363b592c53c780eeae2c8b80a1d60d296614c998a9774f76453a58bc55d1c26bb10dc321c159858d7ba2f7855ba01aadf3585632c097e5471591dcc24d87e9b76509c10e2710310e4869de710ce0f484d326be751f8e9f765a685312423f1801aefb28dfe0c8f286432356d06857101a67a432497c5849111db2792fa0ee4ffff49a9124c152bcff82da1951258f989681e4f1338357f2c9f82333f6051b188f640bf200a0a75be1d35d2301e8d3813f7ba1926a28a0df05c21413cc0c4090c1e4ba4877dca8e129876c72ab3a801b4093320f5f685120680541d97889eea5dfcaf07a7ecb00c0ba0ae193969a4cddcbd753609a5304ea88783358ab0ae005c6af27bb58b2c4282186461ea50540845e2e2a2f4efced88c8ab9cd9fb4a226a265714c77ce7b79d1a40bd00b24cbba498dafde6bbad91686cf2e13e75669234bc342218887ba910ac81680122ddd36466e7e8a983d5a0fc18a6e9a386762c32132be08abe5554e334ec7d88734cfad9a378553b71222c55f6aa114392e015dfa2bb6cb4ad241c6bca82fdd0a00eb8d6b4afac61268130dea2807a97e4c0adc0e2be39abccbe64dca5c480e09c4bebb8b598e4f60afb0e92dce710859013b1ffa9c78fbf380160f31b1e72340dea86d353ff0e95884b72e2c2c10f6eff5f36c588ee845b7bc97c3b6bec4aa879dd0eb56b838b7bc2ec6e66a5b5517908197a67566dce7df421a8daedc98848c70d1d2c39b2f3538e6f17800bee3d3", + "df0000000108277148f2b916666000403a52317841946860def0d7829c06fec03ffe8b97f84e10116fafd93d1d2d39bbfda0d148778c21bb1e1667eb789b1ff70c2e3d557ed9c31570d20d", + "d00000000108277148f2b91666600044cd5e860e3fa7ac4769ec75d9b7d20f19e69265939a42afd3c4248a7f5210358a044f42869567e72a05642e96ddffa67bf24ec2d966d860c6accdee01d6917c8c43d4d089d8bb63ff848b617c13fbeefafcbb049ab0822a9ca7716c95af84d019b755b145dfe43c218555d1a7e047deda7d8db352a386b2b6d03f2e7f4510f47ff4ab199348dfa81c86bea5d09d7c7af4ef3f04e99fe4e6c21d53c4335407e27913129152033f17580f97d0345c8487a7ad329dc5c97b298ec7b80fee7813f1d6f94945a44ff662a69453c2dc7ac5e8a1cb90400e63818632d7f9654f140a61280df183b3d9f9b824e53d82f2c14ea3de89befdc79b84a4a3eb659a41db25622add94f2ad4b0d5977f1091aae0a4b83c7b41bca61c6c8d807ef02a8ce6240b76d442559a8b338b39418d27e99aff38840fc79a20995af65b3bbe1e3177074079a47578c51655a4016363364fd2c108d384e602deebd022da3c814549cd57d73c5bfc20e279045e2ad436fbd7e7c9e1985f0ec2f422e310e7aa8cfc48e637f9ac61d06d6482cb40b4376ff3c7abff3c3c26634689ae16d704bab1343d6413fc7b6c076eb0454eda2e0d1e077db40c922ebba6b0b1fa814e3ba76d8d6c4289abbd655f0cf5968eb2aba7131680b44da8910056a76647a6dfea95f27364a7ce694b8fbe19ebcb2a47e7350d33a36f7f5ca67af5e934f449125f4aae870a5b23b4370680ee02b194784d5d188ecdf58ae5454221406bde0ddd3e50d3363a564d6ca9fe0fb57d4df8716cb430cf553be573aa690e5645075ec74edd38cf23215bd50bcda0639dfbbe08dd6c476249e35da819ea6ccef808911b0eef6efaa4947244472795bc071d7154ed87e4a43575b3d61a551fcfccfb7ca3edaee9324f33f54dc9809747e59e24e79f256e8e72f01b8647f71c4b9dc260715fd9d83d3dbd9e124c432c04b3398e74efa3869fe129e368c15b6ca234a243fcac675adcc1db247e3f8485ac4a78f4a1ce2db3b437a1960b02f0c227901d165dcc05abdb3929a80dff2eaf72816185d4af4e28eea05430b736ddd2962e03ec64fa48649dd610e0e221c48f781b45cd9963c176126110e662369874e6a55f28039a23484c5c53714fc2d2030b48f1c895102ca9ad8acae1ec4eb0ae8d8bde31cd74fc515930078d22ad07dc3c7221ddbc4027c746207fa038b31080714091459c9a66ba4f5912d8d3905d3a9a47e4d8829a8110c96c0c9c81291c7985073808814109364df15b04520dc07e8d67cafcda71f0ca59423df5fadae92417a8661b3cdbbf6b1059780fb8b43eb4dcdacf731bb8db26294f978f6be7506b87d17a95367cdb83000565a4986e66dd60d0851f9b593d68790f8097434f62ea7a7396017c3c84754845d3a97f028cf8697d929a2826451653ccf84aba4d2f40fa530b258c13f08c6523c3c02d9669fd46b6a51f20ad323857d767150e3530a66bf88976dbadf99aeea549254c07e11e14085979b60f3b7e1728a4a2d7a35b0377c6501ae7d1d4bba338fb51a17ca8f7e698bd70cd01e8f30edf3e83591a2eb0038811e347bfcfab159b0d1ff6153e0f9ee4c129cfb7687e30b82eed74130c466eee06506dde50805b58c2acccd4cf4b2cc86c52fa2af602a8a7064eb9d90e1c568373b19e43ef4e7c1e4e1c9a58ccedf80a02a46ed64e68e72d4e75c7436e2bc0ba59f95a00456e5680af9e6cf4bf3a6d302ddaf8847cfd5ea606797", + "d30000000108277148f2b91666600043d24b66b2531ed9f9c13b07b2654186b0410a608592fdf728479734933197ec06a1cde860f36b3170fb2a9c85c62a7867ba6520dcb2d0ab2f6a484d9ebf8237d7a6f3c1fb16c1e0458ccf20e6d1b298a7530cea42636166027d92812915e76fbcc436a5e414147672dd7b0d19ff24513800e63cd86984f1c93ef1430bb848d37830eed61675d7c9999b92c6e5796d384554c74dd5a163de341ab309d6b0cb028aa08e56d79c60980d4a49a1c095456ca119fc3f04e496c93a084d017f60c6e031d6e9ad2e4fa699bb4b0c92fdcb44131129db0d30ce9efb740d3db0339127d9bdd1d4f677b1cb532a33647851ba9bb20bd8d6aa593271a85c3a9dc9835065663e61faa8dc6af209a0caf183d0fda3d4839d40edd5659dd053778642db8fba21f1f793e45c5c517e68bbef8543e3a727743c7bf87d047d441d13226b9021fac56904872774cf6768dc91db8ea489a244500e9e527acdc0088437357acf9397b014e66fef2db1248f9c6a578af07d7a02b1356fee02e27b8207e57633fa7bfd87ccd382e368c14b946aea780fcbe696d6e4fa3aa589184e104177db2fc3d91d4af120d9da3bdad021d003796b8261b590d8113f995dc1db4fac1c62cb68370d41cc87c982815017ae2143d5a469b742d019e5556d813877fec9d021cb37f80e5987d9f743c2b39093a34f6654164a8185a5caefbbef8ea17f62f6801a3fd89fae333c878cec9b25d10dfee2abca65d7c909ad2e4f11736d13b1642df4c5a0761f8f29f35f37def9ed327f4a9d8e53269fa6c7cedd0f4fd67d6cde81934e291d9fca695cc9745890cb54503e29e09f4a30f80e2f574bbbeedb7d20481c583d8362d22b2dbec09494095a043cdae283e86f905d8807f7b7c0f06ce968487bbca1e20b87245b68f24537a7c7e768c838f1bf26650afdabec2c0bb9736b345473f279c9b73ecf0d2c4aea49330ecfef0949ef7cb81861b05950ec0772db856365b136ba75d5509c01d7a970c84ebc77d8d5c3ceae1ef5f3079afc7d78965ffa3bc4c64ef1b4718ffb488a571528c83b615c43022616bb4c494c838b556df5ede711a688b0315c1ce6e2892247df582b7c3f2b06cac0bd8d670e2b581f074750596ba162189060b8af3dfc650ba3b45932edc4f94f08741d3072bfd1ef8159b27a7f3673a4fc504304c12116e3c2d7636c663c9fa1b2f5571be88769f33ccb94a09abd9c5a7dc8a8c2031bb2bc256b84aeb68a9abf7673151cec41b48bdd74f395a46acf30dae43e060e596bb2e739274210701ee9bb6cc3ff81ace751e375a01f17b3c5cc5f1234c488d69611bb27f6e3ee17e3c3843ebe4a280d6aa8ef017058a872810a437f85331adb3cb8d382650897b1b1589ee6", + "dd0000000108277148f2b9166660004053972df1beb451f73eb070e33ed63f681eb9b7e1e03f20baff3f54157598c7dd90a0de49850a3ccd6eb1b1cfc9dc6d3ba9ed1c0a19c69bf433da300d3cecc4ef151c44a721d680e3e3aaaf3eefec23091c5fde22", + "c90000000108277148f2b916666000404700403986db57eaa4b165be8ab9c95452bddb922eb35b7610a8e664f6b4620d870507c241290ce885c36d7672c51d94063bf893e01bc79e1d81bf023338da3d22f63bc7aa433f99448825ee873013b006b2a6c87c7581c7117bfeb4ec3d68405a68d9488f6d58474dd16539677e869812ead055e70d655a660062e17083995c0dbecd565c79800b11c8ca0c351ecffa61e707d62d443b3810bc60d4ef87aa99b979ff55ee1ea46b65436c15534e5315113138aed6daa9f04d3050d77a7e379c83b948d3797177c1793e59b2555423bd52595d93e293ea8ffa3c428c6dbba4e202d76933caf6a5609b0a4aa6cf4fd2aadb6505382381ef2d5b33efc43eba24c84b7805baf2ddab44a50180e5e6f2a31f9ea8089aef562d3b578a799d61befec99c016fadec3363f68a1be4ca1e13e8bdd2809a1dacc41134663e22f21978167c5ee8ef49652ae152fc6c1bcf52109cd3076cdd599cb43261941de7aed148d7d3e956cd615549a9647496f43f998daad4c841cc40ce1501fbfc152b957c94be558f6743061e312d746137db2ae6a44e181587dbf6b0d9508cef4aefd99ea5d3369898bd4c3df5e95ac89eaaba54019ffe0402b8f567c91b9371e80c621c67d3c831331acc063892bbd8a81cfc0498e78474b11e8c05dd8f540c449505342ae95f6281940aae973db35b8e31ff801f6bc8975f592538881ae9cc4cedcbdb39a784a9fe962a1f12be51c11b91d4dedf649bb5672dec8e03db97b0d69fce36edfbecb6836644bad1ab8e6d4e13644d9c3476db0e8a8eb4b5a5c32f7a5604c8e19700c53602839478531579cb4c4bb5cc969cf482f325dd837629318baf128920d9978e23296d7016e6c05c954f95881b4f9f7e43bcea393951e91af0e4a671400dc435bd2a1616c60618df2476d0ece060dbbda11e751e256956a0dbcd7e4a8d6d85a3319f22a2c5f26dad50e82f70f3dd91feff19c775aa60499a3b7daa57e344c07c3787e99d53303488801d2b17cdbfdee61ea3fc473f6c146f06eb60d70594a59e0ed79cee6ca4a5f78b037637ddab69fb8522c0f7bf37aa7f59cc7fa659e759db69966455944975cd22a1a1355f35a589a4978c8f3272e1c4f6793288a00ab879299aa6ad02d966e3dc67cee0c808b1a046458cff9bdac25a4071eb10038a6389a0ef7233003641bd4ee1efad0e9b2f693396a89ca0db3c05b6abfed3b246eb1b23a6b77e8b486f26d9c3dde9dd6f3637a8115940ed2ca762ca6320609f61c37ffc9c3f2f7a0f27edc9891c2eeac49ba258a0d09c35c4fe1dc52d4d9319aa9b1a271a5d8d2d3a75fef4d59fb04679ba526aecbd19d73f72fee537630444326e2543ce564c669bf378499738385dda9ac63521a1b91f580d0737a7326009f0ff0dcb05aa8b86222c934d9ddb4628e30b6e12ae370154ab39c605431b4c40683592afcfd6fccf35df9fe5850442595d24be3d9f4298bf3d541f09e7e71f552c88eed9642df46953622d5aea05b5060325304ec81c0447ac95b90f9da4359e3286938f06aea3d45030cb836be15b1c65e3edf44cbcfe2f01ef8d7209c69d7c81334c866ebee50e418a28336cea1982069b4df090eab81303761d1af337e083f1e0ad1440a02ef1eefb03506c39d2377807e335ee64bdb76527f786223cee5233299eda9fcb1d38f19c34480f790a328b0735f80908e3aa70086df828d56b6c79516f71a24c9d94f60335f86e9d29c0c5d3872b", + "dd0000000108277148f2b916666000406672db10ab41db38c01f7021709bac4d1659d872623eb5852b12b494535d13779a88d37e9685da572f6b2de35793a519a457493456ac4ee242933cf92d783f783656899c31832274bf1c26d24720d9d8ecfec598e19c58a478d2991dfc1cda3000f7bd7bd17e80", + "d60000000108277148f2b916666000404ed98b1b4ac35c0c0ef18c88adf08a6701ccb0876ea75aac8c128349936fa3cb6728e4e58de8673dd7dc8457b092957f26bc8194233bb81c7e78127844f9b833f196dc46c5cb4064c773f3c6e0bc73", + }, + domain: "www.google.com", + }, } - q, err := NewQuicSniffer(SnifferConfig{}) - assert.NoError(t, err) for _, test := range cases { - pkt, err := hex.DecodeString(test.input) + data, err := testQuicSniffer(test.input, true) assert.NoError(t, err) - oriPkt := bytes.Clone(pkt) - domain, err := q.SniffData(pkt) + assert.Equal(t, test.domain, data) + + data, err = testQuicSniffer(test.input, false) assert.NoError(t, err) - assert.Equal(t, test.domain, domain) - assert.Equal(t, oriPkt, pkt) // ensure input data not changed + assert.Equal(t, test.domain, data) } } diff --git a/clash-meta-android/core/src/foss/golang/clash/config/config.go b/clash-meta-android/core/src/foss/golang/clash/config/config.go index ba6097bcf7..ce1e0fb725 100644 --- a/clash-meta-android/core/src/foss/golang/clash/config/config.go +++ b/clash-meta-android/core/src/foss/golang/clash/config/config.go @@ -428,12 +428,6 @@ type RawConfig struct { ClashForAndroid RawClashForAndroid `yaml:"clash-for-android" json:"clash-for-android"` } -var ( - GroupsList = list.New() - ProxiesList = list.New() - ParsingProxiesCallback func(groupsList *list.List, proxiesList *list.List) -) - // Parse config func Parse(buf []byte) (*Config, error) { rawCfg, err := UnmarshalRawConfig(buf) @@ -927,12 +921,6 @@ func parseProxies(cfg *RawConfig) (proxies map[string]C.Proxy, providersMap map[ ) proxies["GLOBAL"] = adapter.NewProxy(global) } - ProxiesList = proxiesList - GroupsList = groupsList - if ParsingProxiesCallback != nil { - // refresh tray menu - go ParsingProxiesCallback(GroupsList, ProxiesList) - } return proxies, providersMap, nil } diff --git a/clash-meta-android/core/src/foss/golang/clash/constant/sniffer/sniffer.go b/clash-meta-android/core/src/foss/golang/clash/constant/sniffer/sniffer.go index 36da69a3ba..8de4b89644 100644 --- a/clash-meta-android/core/src/foss/golang/clash/constant/sniffer/sniffer.go +++ b/clash-meta-android/core/src/foss/golang/clash/constant/sniffer/sniffer.go @@ -10,6 +10,10 @@ type Sniffer interface { SupportPort(port uint16) bool } +type MultiPacketSniffer interface { + WrapperSender(packetSender constant.PacketSender, override bool) constant.PacketSender +} + const ( TLS Type = iota HTTP diff --git a/clash-meta-android/core/src/foss/golang/clash/docs/config.yaml b/clash-meta-android/core/src/foss/golang/clash/docs/config.yaml index 88030a1b60..263d67b65c 100644 --- a/clash-meta-android/core/src/foss/golang/clash/docs/config.yaml +++ b/clash-meta-android/core/src/foss/golang/clash/docs/config.yaml @@ -449,6 +449,26 @@ proxies: # socks5 password: "shadow_tls_password" version: 2 # support 1/2/3 + - name: "ss5" + type: ss + server: server + port: 443 + cipher: chacha20-ietf-poly1305 + password: "password" + plugin: gost-plugin + plugin-opts: + mode: websocket + # tls: true # wss + # 可使用 openssl x509 -noout -fingerprint -sha256 -inform pem -in yourcert.pem 获取 + # 配置指纹将实现 SSL Pining 效果 + # fingerprint: xxxx + # skip-cert-verify: true + # host: bing.com + # path: "/" + # mux: true + # headers: + # custom: value + - name: "ss-restls-tls13" type: ss server: [YOUR_SERVER_IP] diff --git a/clash-meta-android/core/src/foss/golang/clash/go.mod b/clash-meta-android/core/src/foss/golang/clash/go.mod index 9405a2f1fa..f1ba043671 100644 --- a/clash-meta-android/core/src/foss/golang/clash/go.mod +++ b/clash-meta-android/core/src/foss/golang/clash/go.mod @@ -7,17 +7,18 @@ require ( github.com/bahlo/generic-list-go v0.2.0 github.com/coreos/go-iptables v0.8.0 github.com/dlclark/regexp2 v1.11.5 - github.com/enfein/mieru/v3 v3.11.2 + github.com/enfein/mieru/v3 v3.12.0 github.com/go-chi/chi/v5 v5.2.1 github.com/go-chi/render v1.0.3 github.com/gobwas/ws v1.4.0 github.com/gofrs/uuid/v5 v5.3.1 github.com/insomniacslk/dhcp v0.0.0-20250109001534-8abf58130905 github.com/klauspost/compress v1.17.9 // lastest version compatible with golang1.20 - github.com/klauspost/cpuid/v2 v2.2.9 + github.com/klauspost/cpuid/v2 v2.2.9 // lastest version compatible with golang1.20 github.com/lunixbochs/struc v0.0.0-20200707160740-784aaebc1d40 github.com/mdlayher/netlink v1.7.2 github.com/metacubex/amneziawg-go v0.0.0-20240922133038-fdf3a4d5a4ab + github.com/metacubex/bart v0.19.0 github.com/metacubex/bbolt v0.0.0-20240822011022-aed6d4850399 github.com/metacubex/chacha v0.1.1 github.com/metacubex/gopacket v1.1.20-0.20230608035415-7e2f98a3e759 @@ -27,7 +28,7 @@ require ( github.com/metacubex/sing-quic v0.0.0-20250119013740-2a19cce83925 github.com/metacubex/sing-shadowsocks v0.2.8 github.com/metacubex/sing-shadowsocks2 v0.2.2 - github.com/metacubex/sing-tun v0.4.5 + github.com/metacubex/sing-tun v0.4.6-0.20250312042506-6d3b4dc05c04 github.com/metacubex/sing-vmess v0.1.14-0.20250228002636-abc39e113b82 github.com/metacubex/sing-wireguard v0.0.0-20241126021510-0827d417b589 github.com/metacubex/tfo-go v0.0.0-20241231083714-66613d49c422 @@ -37,7 +38,7 @@ require ( github.com/mroth/weightedrand/v2 v2.1.0 github.com/openacid/low v0.1.21 github.com/oschwald/maxminddb-golang v1.12.0 // lastest version compatible with golang1.20 - github.com/puzpuzpuz/xsync/v3 v3.5.0 + github.com/puzpuzpuz/xsync/v3 v3.5.1 github.com/sagernet/cors v1.2.1 github.com/sagernet/fswatch v0.1.1 github.com/sagernet/netlink v0.0.0-20240612041022-b9a21c07ac6a @@ -46,7 +47,7 @@ require ( github.com/sagernet/sing-shadowtls v0.1.5 github.com/sagernet/smux v0.0.0-20231208180855-7041f6ea79e7 github.com/samber/lo v1.49.1 - github.com/shirou/gopsutil/v4 v4.25.1 + github.com/shirou/gopsutil/v4 v4.25.1 // lastest version compatible with golang1.20 github.com/sirupsen/logrus v1.9.3 github.com/stretchr/testify v1.10.0 github.com/vmihailenco/msgpack/v5 v5.4.1 @@ -54,13 +55,13 @@ require ( gitlab.com/go-extension/aes-ccm v0.0.0-20230221065045-e58665ef23c7 go.uber.org/automaxprocs v1.6.0 go4.org/netipx v0.0.0-20231129151722-fdeea329fbba - golang.org/x/crypto v0.33.0 + golang.org/x/crypto v0.33.0 // lastest version compatible with golang1.20 golang.org/x/exp v0.0.0-20240904232852-e7e105dedf7e // lastest version compatible with golang1.20 - golang.org/x/net v0.35.0 - golang.org/x/sys v0.30.0 + golang.org/x/net v0.35.0 // lastest version compatible with golang1.20 + golang.org/x/sys v0.30.0 // lastest version compatible with golang1.20 google.golang.org/protobuf v1.34.2 // lastest version compatible with golang1.20 gopkg.in/yaml.v3 v3.0.1 - lukechampine.com/blake3 v1.3.0 + lukechampine.com/blake3 v1.3.0 // lastest version compatible with golang1.20 ) require ( diff --git a/clash-meta-android/core/src/foss/golang/clash/go.sum b/clash-meta-android/core/src/foss/golang/clash/go.sum index 9660cf30d2..c74b82fba5 100644 --- a/clash-meta-android/core/src/foss/golang/clash/go.sum +++ b/clash-meta-android/core/src/foss/golang/clash/go.sum @@ -28,8 +28,8 @@ github.com/dlclark/regexp2 v1.11.5 h1:Q/sSnsKerHeCkc/jSTNq1oCm7KiVgUMZRDUoRu0JQZ github.com/dlclark/regexp2 v1.11.5/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= github.com/ebitengine/purego v0.8.2 h1:jPPGWs2sZ1UgOSgD2bClL0MJIqu58nOmIcBuXr62z1I= github.com/ebitengine/purego v0.8.2/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= -github.com/enfein/mieru/v3 v3.11.2 h1:06KyGbXiiGz2nSHLJDOOkztAVY3cRr3wBMOpYxPotTo= -github.com/enfein/mieru/v3 v3.11.2/go.mod h1:XvVfNsM78lUMSlJJKXJZ0Hn3lAB2o/ETXTbb84x5egw= +github.com/enfein/mieru/v3 v3.12.0 h1:sV3moozWpRjjqwqFZJjGtMB0EacN8+D7BpjzsmacsXM= +github.com/enfein/mieru/v3 v3.12.0/go.mod h1:zJBUCsi5rxyvHM8fjFf+GLaEl4OEjjBXr1s5F6Qd3hM= github.com/ericlagergren/aegis v0.0.0-20230312195928-b4ce538b56f9 h1:/5RkVc9Rc81XmMyVqawCiDyrBHZbLAZgTTCqou4mwj8= github.com/ericlagergren/aegis v0.0.0-20230312195928-b4ce538b56f9/go.mod h1:hkIFzoiIPZYxdFOOLyDho59b7SrDfo+w3h+yWdlg45I= github.com/ericlagergren/polyval v0.0.0-20220411101811-e25bc10ba391 h1:8j2RH289RJplhA6WfdaPqzg1MjH2K8wX5e0uhAxrw2g= @@ -97,6 +97,8 @@ github.com/mdlayher/socket v0.4.1 h1:eM9y2/jlbs1M615oshPQOHZzj6R6wMT7bX5NPiQvn2U github.com/mdlayher/socket v0.4.1/go.mod h1:cAqeGjoufqdxWkD7DkpyS+wcefOtmu5OQ8KuoJGIReA= github.com/metacubex/amneziawg-go v0.0.0-20240922133038-fdf3a4d5a4ab h1:Chbw+/31UC14YFNr78pESt5Vowlc62zziw05JCUqoL4= github.com/metacubex/amneziawg-go v0.0.0-20240922133038-fdf3a4d5a4ab/go.mod h1:xVKK8jC5Sd3hfh7WjmCq+HorehIbrBijaUWmcuKjPcI= +github.com/metacubex/bart v0.19.0 h1:XQ9AJeI+WO+phRPkUOoflAFwlqDJnm5BPQpixciJQBY= +github.com/metacubex/bart v0.19.0/go.mod h1:DCcyfP4MC+Zy7sLK7XeGuMw+P5K9mIRsYOBgiE8icsI= github.com/metacubex/bbolt v0.0.0-20240822011022-aed6d4850399 h1:oBowHVKZycNtAFbZ6avaCSZJYeme2Nrj+4RpV2cNJig= github.com/metacubex/bbolt v0.0.0-20240822011022-aed6d4850399/go.mod h1:4xcieuIK+M4bGQmQYZVqEaIYqjS1ahO4kXG7EmDgEro= github.com/metacubex/chacha v0.1.1 h1:OHIv11Nd9CISAIzegpjfupIoZp9DYm6uQw41RxvmU/c= @@ -119,8 +121,8 @@ github.com/metacubex/sing-shadowsocks v0.2.8 h1:wIhlaigswzjPw4hej75sEvWte3QR0+AJ github.com/metacubex/sing-shadowsocks v0.2.8/go.mod h1:X3x88XtJpBxG0W0/ECOJL6Ib0SJ3xdniAkU/6/RMWU0= github.com/metacubex/sing-shadowsocks2 v0.2.2 h1:eaf42uVx4Lr21S6MDYs0ZdTvGA0GEhDpb9no4+gdXPo= github.com/metacubex/sing-shadowsocks2 v0.2.2/go.mod h1:BhOug03a/RbI7y6hp6q+6ITM1dXjnLTmeWBHSTwvv2Q= -github.com/metacubex/sing-tun v0.4.5 h1:kWSyQzuzHI40r50OFBczfWIDvMBMy1RIk+JsXeBPRB0= -github.com/metacubex/sing-tun v0.4.5/go.mod h1:V0N4rr0dWPBEE20ESkTXdbtx2riQYcb6YtwC5w/9wl0= +github.com/metacubex/sing-tun v0.4.6-0.20250312042506-6d3b4dc05c04 h1:B211C+i/I8CWf4I/BaAV0mmkEHrDBJ0XR9EWxjPbFEg= +github.com/metacubex/sing-tun v0.4.6-0.20250312042506-6d3b4dc05c04/go.mod h1:V0N4rr0dWPBEE20ESkTXdbtx2riQYcb6YtwC5w/9wl0= github.com/metacubex/sing-vmess v0.1.14-0.20250228002636-abc39e113b82 h1:zZp5uct9+/0Hb1jKGyqDjCU4/72t43rs7qOq3Rc9oU8= github.com/metacubex/sing-vmess v0.1.14-0.20250228002636-abc39e113b82/go.mod h1:nE7Mdzj/QUDwgRi/8BASPtsxtIFZTHA4Yst5GgwbGCQ= github.com/metacubex/sing-wireguard v0.0.0-20241126021510-0827d417b589 h1:Z6bNy0HLTjx6BKIkV48sV/yia/GP8Bnyb5JQuGgSGzg= @@ -156,8 +158,8 @@ github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZN github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF4JjgDlrVEn3C11VoGHZN7m8qihwgMEtzYw= github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= github.com/prashantv/gostub v1.1.0 h1:BTyx3RfQjRHnUWaGF9oQos79AlQ5k8WNktv7VGvVH4g= -github.com/puzpuzpuz/xsync/v3 v3.5.0 h1:i+cMcpEDY1BkNm7lPDkCtE4oElsYLn+EKF8kAu2vXT4= -github.com/puzpuzpuz/xsync/v3 v3.5.0/go.mod h1:VjzYrABPabuM4KyBh1Ftq6u8nhwY5tBPKP9jpmh0nnA= +github.com/puzpuzpuz/xsync/v3 v3.5.1 h1:GJYJZwO6IdxN/IKbneznS6yPkVC+c3zyY/j19c++5Fg= +github.com/puzpuzpuz/xsync/v3 v3.5.1/go.mod h1:VjzYrABPabuM4KyBh1Ftq6u8nhwY5tBPKP9jpmh0nnA= github.com/quic-go/qpack v0.4.0 h1:Cr9BXA1sQS2SmDUWjSofMPNKmvF6IiIfDRmgU0w1ZCo= github.com/quic-go/qpack v0.4.0/go.mod h1:UZVnYIfi5GRk+zI9UMaCPsmZ2xKJP7XBUvVyT1Knj9A= github.com/quic-go/qtls-go1-20 v0.4.1 h1:D33340mCNDAIKBqXuAvexTNMUByrYmFYVfKfDN5nfFs= diff --git a/clash-meta-android/core/src/foss/golang/clash/listener/sing_tun/iface.go b/clash-meta-android/core/src/foss/golang/clash/listener/sing_tun/iface.go index 543d206c0d..3551a853bb 100644 --- a/clash-meta-android/core/src/foss/golang/clash/listener/sing_tun/iface.go +++ b/clash-meta-android/core/src/foss/golang/clash/listener/sing_tun/iface.go @@ -1,12 +1,12 @@ package sing_tun import ( - "errors" + "net" "net/netip" "github.com/metacubex/mihomo/component/iface" - "github.com/sagernet/sing/common/control" + "github.com/metacubex/sing-tun/control" ) type defaultInterfaceFinder struct{} @@ -15,7 +15,8 @@ var DefaultInterfaceFinder control.InterfaceFinder = (*defaultInterfaceFinder)(n func (f *defaultInterfaceFinder) Update() error { iface.FlushCache() - return nil + _, err := iface.Interfaces() + return err } func (f *defaultInterfaceFinder) Interfaces() []control.Interface { @@ -31,45 +32,46 @@ func (f *defaultInterfaceFinder) Interfaces() []control.Interface { return interfaces } -var errNoSuchInterface = errors.New("no such network interface") - -func (f *defaultInterfaceFinder) InterfaceIndexByName(name string) (int, error) { - ifaces, err := iface.Interfaces() - if err != nil { - return 0, err +func (f *defaultInterfaceFinder) ByName(name string) (*control.Interface, error) { + netInterface, err := iface.ResolveInterface(name) + if err == nil { + return (*control.Interface)(netInterface), nil } - for _, netInterface := range ifaces { - if netInterface.Name == name { - return netInterface.Index, nil + if _, err := net.InterfaceByName(name); err == nil { + err = f.Update() + if err != nil { + return nil, err } + return f.ByName(name) } - return 0, errNoSuchInterface + return nil, err } -func (f *defaultInterfaceFinder) InterfaceNameByIndex(index int) (string, error) { - ifaces, err := iface.Interfaces() - if err != nil { - return "", err - } - for _, netInterface := range ifaces { - if netInterface.Index == index { - return netInterface.Name, nil - } - } - return "", errNoSuchInterface -} - -func (f *defaultInterfaceFinder) InterfaceByAddr(addr netip.Addr) (*control.Interface, error) { +func (f *defaultInterfaceFinder) ByIndex(index int) (*control.Interface, error) { ifaces, err := iface.Interfaces() if err != nil { return nil, err } for _, netInterface := range ifaces { - for _, prefix := range netInterface.Addresses { - if prefix.Contains(addr) { - return (*control.Interface)(netInterface), nil - } + if netInterface.Index == index { + return (*control.Interface)(netInterface), nil } } - return nil, errNoSuchInterface + _, err = net.InterfaceByIndex(index) + if err == nil { + err = f.Update() + if err != nil { + return nil, err + } + return f.ByIndex(index) + } + return nil, iface.ErrIfaceNotFound +} + +func (f *defaultInterfaceFinder) ByAddr(addr netip.Addr) (*control.Interface, error) { + netInterface, err := iface.ResolveInterfaceByAddr(addr) + if err != nil { + return nil, err + } + return (*control.Interface)(netInterface), nil } diff --git a/clash-meta-android/core/src/foss/golang/clash/listener/sing_tun/server.go b/clash-meta-android/core/src/foss/golang/clash/listener/sing_tun/server.go index 342defaf38..0ab5afee3c 100644 --- a/clash-meta-android/core/src/foss/golang/clash/listener/sing_tun/server.go +++ b/clash-meta-android/core/src/foss/golang/clash/listener/sing_tun/server.go @@ -23,6 +23,7 @@ import ( "github.com/metacubex/mihomo/log" tun "github.com/metacubex/sing-tun" + "github.com/metacubex/sing-tun/control" "github.com/sagernet/sing/common" E "github.com/sagernet/sing/common/exceptions" F "github.com/sagernet/sing/common/format" @@ -291,7 +292,12 @@ func New(options LC.Tun, tunnel C.Tunnel, additions ...inbound.Addition) (l *Lis return } l.defaultInterfaceMonitor = defaultInterfaceMonitor - defaultInterfaceMonitor.RegisterCallback(func(event int) { + defaultInterfaceMonitor.RegisterCallback(func(defaultInterface *control.Interface, event int) { + if defaultInterface != nil { + log.Warnln("[TUN] default interface changed by monitor, => %s", defaultInterface.Name) + } else { + log.Errorln("[TUN] default interface lost by monitor") + } iface.FlushCache() resolver.ResetConnection() // reset resolver's connection after default interface changed }) @@ -534,9 +540,19 @@ type cDialerInterfaceFinder struct { defaultInterfaceMonitor tun.DefaultInterfaceMonitor } +func (d *cDialerInterfaceFinder) DefaultInterfaceName(destination netip.Addr) string { + if netInterface, _ := DefaultInterfaceFinder.ByAddr(destination); netInterface != nil { + return netInterface.Name + } + if netInterface := d.defaultInterfaceMonitor.DefaultInterface(); netInterface != nil { + return netInterface.Name + } + return "" +} + func (d *cDialerInterfaceFinder) FindInterfaceName(destination netip.Addr) string { for _, dest := range []netip.Addr{destination, netip.IPv4Unspecified(), netip.IPv6Unspecified()} { - autoDetectInterfaceName := d.defaultInterfaceMonitor.DefaultInterfaceName(dest) + autoDetectInterfaceName := d.DefaultInterfaceName(dest) if autoDetectInterfaceName == d.tunName { log.Warnln("[TUN] Auto detect interface for %s get same name with tun", destination.String()) } else if autoDetectInterfaceName == "" || autoDetectInterfaceName == "" { diff --git a/clash-meta-android/core/src/foss/golang/clash/transport/gost-plugin/websocket.go b/clash-meta-android/core/src/foss/golang/clash/transport/gost-plugin/websocket.go new file mode 100644 index 0000000000..e60af59550 --- /dev/null +++ b/clash-meta-android/core/src/foss/golang/clash/transport/gost-plugin/websocket.go @@ -0,0 +1,102 @@ +package gost + +import ( + "context" + "crypto/tls" + "net" + "net/http" + + "github.com/metacubex/mihomo/component/ca" + "github.com/metacubex/mihomo/transport/vmess" + smux "github.com/sagernet/smux" +) + +// Option is options of gost websocket +type Option struct { + Host string + Port string + Path string + Headers map[string]string + TLS bool + SkipCertVerify bool + Fingerprint string + Mux bool +} + +// muxConn is a wrapper around smux.Stream that also closes the session when closed +type muxConn struct { + net.Conn + session *smux.Session +} + +func (m *muxConn) Close() error { + streamErr := m.Conn.Close() + sessionErr := m.session.Close() + + // Return stream error if there is one, otherwise return session error + if streamErr != nil { + return streamErr + } + return sessionErr +} + +// NewGostWebsocket return a gost websocket +func NewGostWebsocket(ctx context.Context, conn net.Conn, option *Option) (net.Conn, error) { + header := http.Header{} + for k, v := range option.Headers { + header.Add(k, v) + } + + config := &vmess.WebsocketConfig{ + Host: option.Host, + Port: option.Port, + Path: option.Path, + Headers: header, + } + + if option.TLS { + config.TLS = true + tlsConfig := &tls.Config{ + ServerName: option.Host, + InsecureSkipVerify: option.SkipCertVerify, + NextProtos: []string{"http/1.1"}, + } + var err error + config.TLSConfig, err = ca.GetSpecifiedFingerprintTLSConfig(tlsConfig, option.Fingerprint) + if err != nil { + return nil, err + } + + if host := config.Headers.Get("Host"); host != "" { + config.TLSConfig.ServerName = host + } + } + + var err error + conn, err = vmess.StreamWebsocketConn(ctx, conn, config) + if err != nil { + return nil, err + } + + if option.Mux { + config := smux.DefaultConfig() + config.KeepAliveDisabled = true + + session, err := smux.Client(conn, config) + if err != nil { + return nil, err + } + + stream, err := session.OpenStream() + if err != nil { + session.Close() + return nil, err + } + + return &muxConn{ + Conn: stream, + session: session, + }, nil + } + return conn, nil +} diff --git a/clash-meta-android/core/src/foss/golang/clash/tunnel/tunnel.go b/clash-meta-android/core/src/foss/golang/clash/tunnel/tunnel.go index a4486df797..b9507930c1 100644 --- a/clash-meta-android/core/src/foss/golang/clash/tunnel/tunnel.go +++ b/clash-meta-android/core/src/foss/golang/clash/tunnel/tunnel.go @@ -378,12 +378,14 @@ func handleUDPConn(packet C.PacketAdapter) { return } - if sniffingEnable && snifferDispatcher.Enable() { - snifferDispatcher.UDPSniff(packet) - } - key := packet.Key() - sender, loaded := natTable.GetOrCreate(key, newPacketSender) + sender, loaded := natTable.GetOrCreate(key, func() C.PacketSender { + sender := newPacketSender() + if sniffingEnable && snifferDispatcher.Enable() { + return snifferDispatcher.UDPSniff(packet, sender) + } + return sender + }) if !loaded { dial := func() (C.PacketConn, C.WriteBackProxy, error) { if err := sender.ResolveUDP(metadata); err != nil { diff --git a/clash-meta-android/core/src/foss/golang/go.mod b/clash-meta-android/core/src/foss/golang/go.mod index ad74fcafb4..786d29165b 100644 --- a/clash-meta-android/core/src/foss/golang/go.mod +++ b/clash-meta-android/core/src/foss/golang/go.mod @@ -16,7 +16,7 @@ require ( github.com/coreos/go-iptables v0.8.0 // indirect github.com/dlclark/regexp2 v1.11.5 // indirect github.com/ebitengine/purego v0.8.2 // indirect - github.com/enfein/mieru/v3 v3.11.2 // indirect + github.com/enfein/mieru/v3 v3.12.0 // indirect github.com/ericlagergren/aegis v0.0.0-20230312195928-b4ce538b56f9 // indirect github.com/ericlagergren/polyval v0.0.0-20220411101811-e25bc10ba391 // indirect github.com/ericlagergren/siv v0.0.0-20220507050439-0b757b3aa5f1 // indirect @@ -45,6 +45,7 @@ require ( github.com/mdlayher/netlink v1.7.2 // indirect github.com/mdlayher/socket v0.4.1 // indirect github.com/metacubex/amneziawg-go v0.0.0-20240922133038-fdf3a4d5a4ab // indirect + github.com/metacubex/bart v0.19.0 // indirect github.com/metacubex/bbolt v0.0.0-20240822011022-aed6d4850399 // indirect github.com/metacubex/chacha v0.1.1 // indirect github.com/metacubex/gopacket v1.1.20-0.20230608035415-7e2f98a3e759 // indirect @@ -56,7 +57,7 @@ require ( github.com/metacubex/sing-quic v0.0.0-20250119013740-2a19cce83925 // indirect github.com/metacubex/sing-shadowsocks v0.2.8 // indirect github.com/metacubex/sing-shadowsocks2 v0.2.2 // indirect - github.com/metacubex/sing-tun v0.4.5 // indirect + github.com/metacubex/sing-tun v0.4.6-0.20250312042506-6d3b4dc05c04 // indirect github.com/metacubex/sing-vmess v0.1.14-0.20250228002636-abc39e113b82 // indirect github.com/metacubex/sing-wireguard v0.0.0-20241126021510-0827d417b589 // indirect github.com/metacubex/tfo-go v0.0.0-20241231083714-66613d49c422 // indirect @@ -70,7 +71,7 @@ require ( github.com/oschwald/maxminddb-golang v1.12.0 // indirect github.com/pierrec/lz4/v4 v4.1.14 // indirect github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect - github.com/puzpuzpuz/xsync/v3 v3.5.0 // indirect + github.com/puzpuzpuz/xsync/v3 v3.5.1 // indirect github.com/quic-go/qpack v0.4.0 // indirect github.com/quic-go/qtls-go1-20 v0.4.1 // indirect github.com/sagernet/cors v1.2.1 // indirect diff --git a/clash-meta-android/core/src/foss/golang/go.sum b/clash-meta-android/core/src/foss/golang/go.sum index febaa65ca3..4a59c2ee78 100644 --- a/clash-meta-android/core/src/foss/golang/go.sum +++ b/clash-meta-android/core/src/foss/golang/go.sum @@ -28,8 +28,8 @@ github.com/dlclark/regexp2 v1.11.5 h1:Q/sSnsKerHeCkc/jSTNq1oCm7KiVgUMZRDUoRu0JQZ github.com/dlclark/regexp2 v1.11.5/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= github.com/ebitengine/purego v0.8.2 h1:jPPGWs2sZ1UgOSgD2bClL0MJIqu58nOmIcBuXr62z1I= github.com/ebitengine/purego v0.8.2/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= -github.com/enfein/mieru/v3 v3.11.2 h1:06KyGbXiiGz2nSHLJDOOkztAVY3cRr3wBMOpYxPotTo= -github.com/enfein/mieru/v3 v3.11.2/go.mod h1:XvVfNsM78lUMSlJJKXJZ0Hn3lAB2o/ETXTbb84x5egw= +github.com/enfein/mieru/v3 v3.12.0 h1:sV3moozWpRjjqwqFZJjGtMB0EacN8+D7BpjzsmacsXM= +github.com/enfein/mieru/v3 v3.12.0/go.mod h1:zJBUCsi5rxyvHM8fjFf+GLaEl4OEjjBXr1s5F6Qd3hM= github.com/ericlagergren/aegis v0.0.0-20230312195928-b4ce538b56f9 h1:/5RkVc9Rc81XmMyVqawCiDyrBHZbLAZgTTCqou4mwj8= github.com/ericlagergren/aegis v0.0.0-20230312195928-b4ce538b56f9/go.mod h1:hkIFzoiIPZYxdFOOLyDho59b7SrDfo+w3h+yWdlg45I= github.com/ericlagergren/polyval v0.0.0-20220411101811-e25bc10ba391 h1:8j2RH289RJplhA6WfdaPqzg1MjH2K8wX5e0uhAxrw2g= @@ -97,6 +97,8 @@ github.com/mdlayher/socket v0.4.1 h1:eM9y2/jlbs1M615oshPQOHZzj6R6wMT7bX5NPiQvn2U github.com/mdlayher/socket v0.4.1/go.mod h1:cAqeGjoufqdxWkD7DkpyS+wcefOtmu5OQ8KuoJGIReA= github.com/metacubex/amneziawg-go v0.0.0-20240922133038-fdf3a4d5a4ab h1:Chbw+/31UC14YFNr78pESt5Vowlc62zziw05JCUqoL4= github.com/metacubex/amneziawg-go v0.0.0-20240922133038-fdf3a4d5a4ab/go.mod h1:xVKK8jC5Sd3hfh7WjmCq+HorehIbrBijaUWmcuKjPcI= +github.com/metacubex/bart v0.19.0 h1:XQ9AJeI+WO+phRPkUOoflAFwlqDJnm5BPQpixciJQBY= +github.com/metacubex/bart v0.19.0/go.mod h1:DCcyfP4MC+Zy7sLK7XeGuMw+P5K9mIRsYOBgiE8icsI= github.com/metacubex/bbolt v0.0.0-20240822011022-aed6d4850399 h1:oBowHVKZycNtAFbZ6avaCSZJYeme2Nrj+4RpV2cNJig= github.com/metacubex/bbolt v0.0.0-20240822011022-aed6d4850399/go.mod h1:4xcieuIK+M4bGQmQYZVqEaIYqjS1ahO4kXG7EmDgEro= github.com/metacubex/chacha v0.1.1 h1:OHIv11Nd9CISAIzegpjfupIoZp9DYm6uQw41RxvmU/c= @@ -119,8 +121,8 @@ github.com/metacubex/sing-shadowsocks v0.2.8 h1:wIhlaigswzjPw4hej75sEvWte3QR0+AJ github.com/metacubex/sing-shadowsocks v0.2.8/go.mod h1:X3x88XtJpBxG0W0/ECOJL6Ib0SJ3xdniAkU/6/RMWU0= github.com/metacubex/sing-shadowsocks2 v0.2.2 h1:eaf42uVx4Lr21S6MDYs0ZdTvGA0GEhDpb9no4+gdXPo= github.com/metacubex/sing-shadowsocks2 v0.2.2/go.mod h1:BhOug03a/RbI7y6hp6q+6ITM1dXjnLTmeWBHSTwvv2Q= -github.com/metacubex/sing-tun v0.4.5 h1:kWSyQzuzHI40r50OFBczfWIDvMBMy1RIk+JsXeBPRB0= -github.com/metacubex/sing-tun v0.4.5/go.mod h1:V0N4rr0dWPBEE20ESkTXdbtx2riQYcb6YtwC5w/9wl0= +github.com/metacubex/sing-tun v0.4.6-0.20250312042506-6d3b4dc05c04 h1:B211C+i/I8CWf4I/BaAV0mmkEHrDBJ0XR9EWxjPbFEg= +github.com/metacubex/sing-tun v0.4.6-0.20250312042506-6d3b4dc05c04/go.mod h1:V0N4rr0dWPBEE20ESkTXdbtx2riQYcb6YtwC5w/9wl0= github.com/metacubex/sing-vmess v0.1.14-0.20250228002636-abc39e113b82 h1:zZp5uct9+/0Hb1jKGyqDjCU4/72t43rs7qOq3Rc9oU8= github.com/metacubex/sing-vmess v0.1.14-0.20250228002636-abc39e113b82/go.mod h1:nE7Mdzj/QUDwgRi/8BASPtsxtIFZTHA4Yst5GgwbGCQ= github.com/metacubex/sing-wireguard v0.0.0-20241126021510-0827d417b589 h1:Z6bNy0HLTjx6BKIkV48sV/yia/GP8Bnyb5JQuGgSGzg= @@ -155,8 +157,8 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF4JjgDlrVEn3C11VoGHZN7m8qihwgMEtzYw= github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= -github.com/puzpuzpuz/xsync/v3 v3.5.0 h1:i+cMcpEDY1BkNm7lPDkCtE4oElsYLn+EKF8kAu2vXT4= -github.com/puzpuzpuz/xsync/v3 v3.5.0/go.mod h1:VjzYrABPabuM4KyBh1Ftq6u8nhwY5tBPKP9jpmh0nnA= +github.com/puzpuzpuz/xsync/v3 v3.5.1 h1:GJYJZwO6IdxN/IKbneznS6yPkVC+c3zyY/j19c++5Fg= +github.com/puzpuzpuz/xsync/v3 v3.5.1/go.mod h1:VjzYrABPabuM4KyBh1Ftq6u8nhwY5tBPKP9jpmh0nnA= github.com/quic-go/qpack v0.4.0 h1:Cr9BXA1sQS2SmDUWjSofMPNKmvF6IiIfDRmgU0w1ZCo= github.com/quic-go/qpack v0.4.0/go.mod h1:UZVnYIfi5GRk+zI9UMaCPsmZ2xKJP7XBUvVyT1Knj9A= github.com/quic-go/qtls-go1-20 v0.4.1 h1:D33340mCNDAIKBqXuAvexTNMUByrYmFYVfKfDN5nfFs= diff --git a/clash-meta-android/core/src/main/golang/go.mod b/clash-meta-android/core/src/main/golang/go.mod index 1274bab6ff..976495527b 100644 --- a/clash-meta-android/core/src/main/golang/go.mod +++ b/clash-meta-android/core/src/main/golang/go.mod @@ -24,7 +24,7 @@ require ( github.com/cloudflare/circl v1.3.7 // indirect github.com/coreos/go-iptables v0.8.0 // indirect github.com/ebitengine/purego v0.8.2 // indirect - github.com/enfein/mieru/v3 v3.11.2 // indirect + github.com/enfein/mieru/v3 v3.12.0 // indirect github.com/ericlagergren/aegis v0.0.0-20230312195928-b4ce538b56f9 // indirect github.com/ericlagergren/polyval v0.0.0-20220411101811-e25bc10ba391 // indirect github.com/ericlagergren/siv v0.0.0-20220507050439-0b757b3aa5f1 // indirect @@ -54,6 +54,7 @@ require ( github.com/mdlayher/netlink v1.7.2 // indirect github.com/mdlayher/socket v0.4.1 // indirect github.com/metacubex/amneziawg-go v0.0.0-20240922133038-fdf3a4d5a4ab // indirect + github.com/metacubex/bart v0.19.0 // indirect github.com/metacubex/bbolt v0.0.0-20240822011022-aed6d4850399 // indirect github.com/metacubex/chacha v0.1.1 // indirect github.com/metacubex/gopacket v1.1.20-0.20230608035415-7e2f98a3e759 // indirect @@ -64,7 +65,7 @@ require ( github.com/metacubex/sing-quic v0.0.0-20250119013740-2a19cce83925 // indirect github.com/metacubex/sing-shadowsocks v0.2.8 // indirect github.com/metacubex/sing-shadowsocks2 v0.2.2 // indirect - github.com/metacubex/sing-tun v0.4.5 // indirect + github.com/metacubex/sing-tun v0.4.6-0.20250312042506-6d3b4dc05c04 // indirect github.com/metacubex/sing-vmess v0.1.14-0.20250228002636-abc39e113b82 // indirect github.com/metacubex/sing-wireguard v0.0.0-20241126021510-0827d417b589 // indirect github.com/metacubex/tfo-go v0.0.0-20241231083714-66613d49c422 // indirect @@ -78,7 +79,7 @@ require ( github.com/oschwald/maxminddb-golang v1.12.0 // indirect github.com/pierrec/lz4/v4 v4.1.14 // indirect github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect - github.com/puzpuzpuz/xsync/v3 v3.5.0 // indirect + github.com/puzpuzpuz/xsync/v3 v3.5.1 // indirect github.com/quic-go/qpack v0.4.0 // indirect github.com/quic-go/qtls-go1-20 v0.4.1 // indirect github.com/sagernet/cors v1.2.1 // indirect diff --git a/clash-meta-android/core/src/main/golang/go.sum b/clash-meta-android/core/src/main/golang/go.sum index 5288bf6298..94b65759d9 100644 --- a/clash-meta-android/core/src/main/golang/go.sum +++ b/clash-meta-android/core/src/main/golang/go.sum @@ -28,8 +28,8 @@ github.com/dlclark/regexp2 v1.11.5 h1:Q/sSnsKerHeCkc/jSTNq1oCm7KiVgUMZRDUoRu0JQZ github.com/dlclark/regexp2 v1.11.5/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= github.com/ebitengine/purego v0.8.2 h1:jPPGWs2sZ1UgOSgD2bClL0MJIqu58nOmIcBuXr62z1I= github.com/ebitengine/purego v0.8.2/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= -github.com/enfein/mieru/v3 v3.11.2 h1:06KyGbXiiGz2nSHLJDOOkztAVY3cRr3wBMOpYxPotTo= -github.com/enfein/mieru/v3 v3.11.2/go.mod h1:XvVfNsM78lUMSlJJKXJZ0Hn3lAB2o/ETXTbb84x5egw= +github.com/enfein/mieru/v3 v3.12.0 h1:sV3moozWpRjjqwqFZJjGtMB0EacN8+D7BpjzsmacsXM= +github.com/enfein/mieru/v3 v3.12.0/go.mod h1:zJBUCsi5rxyvHM8fjFf+GLaEl4OEjjBXr1s5F6Qd3hM= github.com/ericlagergren/aegis v0.0.0-20230312195928-b4ce538b56f9 h1:/5RkVc9Rc81XmMyVqawCiDyrBHZbLAZgTTCqou4mwj8= github.com/ericlagergren/aegis v0.0.0-20230312195928-b4ce538b56f9/go.mod h1:hkIFzoiIPZYxdFOOLyDho59b7SrDfo+w3h+yWdlg45I= github.com/ericlagergren/polyval v0.0.0-20220411101811-e25bc10ba391 h1:8j2RH289RJplhA6WfdaPqzg1MjH2K8wX5e0uhAxrw2g= @@ -98,6 +98,8 @@ github.com/mdlayher/socket v0.4.1 h1:eM9y2/jlbs1M615oshPQOHZzj6R6wMT7bX5NPiQvn2U github.com/mdlayher/socket v0.4.1/go.mod h1:cAqeGjoufqdxWkD7DkpyS+wcefOtmu5OQ8KuoJGIReA= github.com/metacubex/amneziawg-go v0.0.0-20240922133038-fdf3a4d5a4ab h1:Chbw+/31UC14YFNr78pESt5Vowlc62zziw05JCUqoL4= github.com/metacubex/amneziawg-go v0.0.0-20240922133038-fdf3a4d5a4ab/go.mod h1:xVKK8jC5Sd3hfh7WjmCq+HorehIbrBijaUWmcuKjPcI= +github.com/metacubex/bart v0.19.0 h1:XQ9AJeI+WO+phRPkUOoflAFwlqDJnm5BPQpixciJQBY= +github.com/metacubex/bart v0.19.0/go.mod h1:DCcyfP4MC+Zy7sLK7XeGuMw+P5K9mIRsYOBgiE8icsI= github.com/metacubex/bbolt v0.0.0-20240822011022-aed6d4850399 h1:oBowHVKZycNtAFbZ6avaCSZJYeme2Nrj+4RpV2cNJig= github.com/metacubex/bbolt v0.0.0-20240822011022-aed6d4850399/go.mod h1:4xcieuIK+M4bGQmQYZVqEaIYqjS1ahO4kXG7EmDgEro= github.com/metacubex/chacha v0.1.1 h1:OHIv11Nd9CISAIzegpjfupIoZp9DYm6uQw41RxvmU/c= @@ -120,8 +122,8 @@ github.com/metacubex/sing-shadowsocks v0.2.8 h1:wIhlaigswzjPw4hej75sEvWte3QR0+AJ github.com/metacubex/sing-shadowsocks v0.2.8/go.mod h1:X3x88XtJpBxG0W0/ECOJL6Ib0SJ3xdniAkU/6/RMWU0= github.com/metacubex/sing-shadowsocks2 v0.2.2 h1:eaf42uVx4Lr21S6MDYs0ZdTvGA0GEhDpb9no4+gdXPo= github.com/metacubex/sing-shadowsocks2 v0.2.2/go.mod h1:BhOug03a/RbI7y6hp6q+6ITM1dXjnLTmeWBHSTwvv2Q= -github.com/metacubex/sing-tun v0.4.5 h1:kWSyQzuzHI40r50OFBczfWIDvMBMy1RIk+JsXeBPRB0= -github.com/metacubex/sing-tun v0.4.5/go.mod h1:V0N4rr0dWPBEE20ESkTXdbtx2riQYcb6YtwC5w/9wl0= +github.com/metacubex/sing-tun v0.4.6-0.20250312042506-6d3b4dc05c04 h1:B211C+i/I8CWf4I/BaAV0mmkEHrDBJ0XR9EWxjPbFEg= +github.com/metacubex/sing-tun v0.4.6-0.20250312042506-6d3b4dc05c04/go.mod h1:V0N4rr0dWPBEE20ESkTXdbtx2riQYcb6YtwC5w/9wl0= github.com/metacubex/sing-vmess v0.1.14-0.20250228002636-abc39e113b82 h1:zZp5uct9+/0Hb1jKGyqDjCU4/72t43rs7qOq3Rc9oU8= github.com/metacubex/sing-vmess v0.1.14-0.20250228002636-abc39e113b82/go.mod h1:nE7Mdzj/QUDwgRi/8BASPtsxtIFZTHA4Yst5GgwbGCQ= github.com/metacubex/sing-wireguard v0.0.0-20241126021510-0827d417b589 h1:Z6bNy0HLTjx6BKIkV48sV/yia/GP8Bnyb5JQuGgSGzg= @@ -156,8 +158,8 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF4JjgDlrVEn3C11VoGHZN7m8qihwgMEtzYw= github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= -github.com/puzpuzpuz/xsync/v3 v3.5.0 h1:i+cMcpEDY1BkNm7lPDkCtE4oElsYLn+EKF8kAu2vXT4= -github.com/puzpuzpuz/xsync/v3 v3.5.0/go.mod h1:VjzYrABPabuM4KyBh1Ftq6u8nhwY5tBPKP9jpmh0nnA= +github.com/puzpuzpuz/xsync/v3 v3.5.1 h1:GJYJZwO6IdxN/IKbneznS6yPkVC+c3zyY/j19c++5Fg= +github.com/puzpuzpuz/xsync/v3 v3.5.1/go.mod h1:VjzYrABPabuM4KyBh1Ftq6u8nhwY5tBPKP9jpmh0nnA= github.com/quic-go/qpack v0.4.0 h1:Cr9BXA1sQS2SmDUWjSofMPNKmvF6IiIfDRmgU0w1ZCo= github.com/quic-go/qpack v0.4.0/go.mod h1:UZVnYIfi5GRk+zI9UMaCPsmZ2xKJP7XBUvVyT1Knj9A= github.com/quic-go/qtls-go1-20 v0.4.1 h1:D33340mCNDAIKBqXuAvexTNMUByrYmFYVfKfDN5nfFs= diff --git a/clash-meta-android/core/src/main/java/com/github/kr328/clash/core/Clash.kt b/clash-meta-android/core/src/main/java/com/github/kr328/clash/core/Clash.kt index a58dc41f33..a3be5fa561 100644 --- a/clash-meta-android/core/src/main/java/com/github/kr328/clash/core/Clash.kt +++ b/clash-meta-android/core/src/main/java/com/github/kr328/clash/core/Clash.kt @@ -49,7 +49,7 @@ object Clash { } fun notifyDnsChanged(dns: List) { - Bridge.nativeNotifyDnsChanged(dns.joinToString(separator = ",")) + Bridge.nativeNotifyDnsChanged(dns.toSet().joinToString(separator = ",")) } fun notifyTimeZoneChanged(name: String, offset: Int) { diff --git a/clash-meta-android/service/src/main/java/com/github/kr328/clash/service/clash/module/NetworkObserveModule.kt b/clash-meta-android/service/src/main/java/com/github/kr328/clash/service/clash/module/NetworkObserveModule.kt index 837f0b3bc7..b7132153af 100644 --- a/clash-meta-android/service/src/main/java/com/github/kr328/clash/service/clash/module/NetworkObserveModule.kt +++ b/clash-meta-android/service/src/main/java/com/github/kr328/clash/service/clash/module/NetworkObserveModule.kt @@ -6,7 +6,7 @@ import android.os.Build import androidx.core.content.getSystemService import com.github.kr328.clash.common.log.Log import com.github.kr328.clash.core.Clash -import com.github.kr328.clash.service.util.resolvePrimaryDns +import com.github.kr328.clash.service.util.resolveDns import kotlinx.coroutines.NonCancellable import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.channels.trySendBlocking @@ -69,8 +69,8 @@ class NetworkObserveModule(service: Service) : Module(service) { } } - val dns = networks.mapNotNull { - connectivity.resolvePrimaryDns(it) + val dns = networks.flatMap { network -> + connectivity?.resolveDns(network) ?: emptyList() } Clash.notifyDnsChanged(dns) diff --git a/clash-meta-android/service/src/main/java/com/github/kr328/clash/service/util/Address.kt b/clash-meta-android/service/src/main/java/com/github/kr328/clash/service/util/Address.kt index d1c54c561e..9ee5b32c86 100644 --- a/clash-meta-android/service/src/main/java/com/github/kr328/clash/service/util/Address.kt +++ b/clash-meta-android/service/src/main/java/com/github/kr328/clash/service/util/Address.kt @@ -7,7 +7,7 @@ import java.net.InetAddress fun InetAddress.asSocketAddressText(port: Int): String { return when (this) { is Inet6Address -> - "[${numericToTextFormat(this.address)}]:$port" + "[${numericToTextFormat(this)}]:$port" is Inet4Address -> "${this.hostAddress}:$port" else -> throw IllegalArgumentException("Unsupported Inet type ${this.javaClass}") @@ -16,7 +16,8 @@ fun InetAddress.asSocketAddressText(port: Int): String { private const val INT16SZ = 2 private const val INADDRSZ = 16 -private fun numericToTextFormat(src: ByteArray): String { +private fun numericToTextFormat(address: Inet6Address): String { + var src = address.getAddress() val sb = StringBuilder(39) for (i in 0 until INADDRSZ / INT16SZ) { sb.append( @@ -29,6 +30,14 @@ private fun numericToTextFormat(src: ByteArray): String { sb.append(":") } } + // handle [fe80::1%wlan0] like address from Inet6Address.getHostAddress() + // For the Android system, a ScopeId must be carried when initiating a connection to an ipv6 link-local address + // Note that the Scope must be returned as an int type, not a string format + // Reference: https://github.com/golang/go/issues/68082 + if (address.getScopeId() > 0) { + sb.append("%") + sb.append(address.getScopeId()) + } return sb.toString() } diff --git a/clash-meta-android/service/src/main/java/com/github/kr328/clash/service/util/Connectivity.kt b/clash-meta-android/service/src/main/java/com/github/kr328/clash/service/util/Connectivity.kt index 51e4b4f837..32aa48270f 100644 --- a/clash-meta-android/service/src/main/java/com/github/kr328/clash/service/util/Connectivity.kt +++ b/clash-meta-android/service/src/main/java/com/github/kr328/clash/service/util/Connectivity.kt @@ -3,8 +3,7 @@ package com.github.kr328.clash.service.util import android.net.ConnectivityManager import android.net.Network -fun ConnectivityManager.resolvePrimaryDns(network: Network?): String? { - val properties = getLinkProperties(network) ?: return null - - return properties.dnsServers.firstOrNull()?.asSocketAddressText(53) +fun ConnectivityManager.resolveDns(network: Network?): List { + val properties = getLinkProperties(network) ?: return listOf() + return properties.dnsServers.map { it.asSocketAddressText(53) } } diff --git a/clash-meta/.github/mihomo.service b/clash-meta/.github/mihomo.service index a3793fe369..7ecc848661 100644 --- a/clash-meta/.github/mihomo.service +++ b/clash-meta/.github/mihomo.service @@ -5,8 +5,8 @@ After=network.target nss-lookup.target network-online.target [Service] Type=simple -CapabilityBoundingSet=CAP_NET_ADMIN CAP_NET_RAW CAP_NET_BIND_SERVICE CAP_SYS_PTRACE CAP_DAC_READ_SEARCH -AmbientCapabilities=CAP_NET_ADMIN CAP_NET_RAW CAP_NET_BIND_SERVICE CAP_SYS_PTRACE CAP_DAC_READ_SEARCH +CapabilityBoundingSet=CAP_NET_ADMIN CAP_NET_RAW CAP_NET_BIND_SERVICE CAP_SYS_TIME CAP_SYS_PTRACE CAP_DAC_READ_SEARCH CAP_DAC_OVERRIDE +AmbientCapabilities=CAP_NET_ADMIN CAP_NET_RAW CAP_NET_BIND_SERVICE CAP_SYS_TIME CAP_SYS_PTRACE CAP_DAC_READ_SEARCH CAP_DAC_OVERRIDE ExecStart=/usr/bin/mihomo -d /etc/mihomo ExecReload=/bin/kill -HUP $MAINPID Restart=on-failure diff --git a/clash-meta/.github/mihomo@.service b/clash-meta/.github/mihomo@.service index a3793fe369..7ecc848661 100644 --- a/clash-meta/.github/mihomo@.service +++ b/clash-meta/.github/mihomo@.service @@ -5,8 +5,8 @@ After=network.target nss-lookup.target network-online.target [Service] Type=simple -CapabilityBoundingSet=CAP_NET_ADMIN CAP_NET_RAW CAP_NET_BIND_SERVICE CAP_SYS_PTRACE CAP_DAC_READ_SEARCH -AmbientCapabilities=CAP_NET_ADMIN CAP_NET_RAW CAP_NET_BIND_SERVICE CAP_SYS_PTRACE CAP_DAC_READ_SEARCH +CapabilityBoundingSet=CAP_NET_ADMIN CAP_NET_RAW CAP_NET_BIND_SERVICE CAP_SYS_TIME CAP_SYS_PTRACE CAP_DAC_READ_SEARCH CAP_DAC_OVERRIDE +AmbientCapabilities=CAP_NET_ADMIN CAP_NET_RAW CAP_NET_BIND_SERVICE CAP_SYS_TIME CAP_SYS_PTRACE CAP_DAC_READ_SEARCH CAP_DAC_OVERRIDE ExecStart=/usr/bin/mihomo -d /etc/mihomo ExecReload=/bin/kill -HUP $MAINPID Restart=on-failure diff --git a/clash-meta/common/net/packet/packet_posix.go b/clash-meta/common/net/packet/packet_posix.go index 2073e35de3..8a39288716 100644 --- a/clash-meta/common/net/packet/packet_posix.go +++ b/clash-meta/common/net/packet/packet_posix.go @@ -45,7 +45,11 @@ func (c *enhanceUDPConn) WaitReadFrom() (data []byte, put func(), addr net.Addr, addr = &net.UDPAddr{IP: ip[:], Port: from.Port} case *syscall.SockaddrInet6: ip := from.Addr // copy from.Addr; ip escapes, so this line allocates 16 bytes - addr = &net.UDPAddr{IP: ip[:], Port: from.Port, Zone: strconv.FormatInt(int64(from.ZoneId), 10)} + zone := "" + if from.ZoneId != 0 { + zone = strconv.FormatInt(int64(from.ZoneId), 10) + } + addr = &net.UDPAddr{IP: ip[:], Port: from.Port, Zone: zone} } } // udp should not convert readN == 0 to io.EOF diff --git a/clash-meta/common/net/packet/packet_windows.go b/clash-meta/common/net/packet/packet_windows.go index 3c467c6dc3..e6743ee517 100644 --- a/clash-meta/common/net/packet/packet_windows.go +++ b/clash-meta/common/net/packet/packet_windows.go @@ -54,7 +54,11 @@ func (c *enhanceUDPConn) WaitReadFrom() (data []byte, put func(), addr net.Addr, addr = &net.UDPAddr{IP: ip[:], Port: from.Port} case *windows.SockaddrInet6: ip := from.Addr // copy from.Addr; ip escapes, so this line allocates 16 bytes - addr = &net.UDPAddr{IP: ip[:], Port: from.Port, Zone: strconv.FormatInt(int64(from.ZoneId), 10)} + zone := "" + if from.ZoneId != 0 { + zone = strconv.FormatInt(int64(from.ZoneId), 10) + } + addr = &net.UDPAddr{IP: ip[:], Port: from.Port, Zone: zone} } } // udp should not convert readN == 0 to io.EOF diff --git a/clash-meta/component/dialer/dialer.go b/clash-meta/component/dialer/dialer.go index da217f280d..0ecccdf8cf 100644 --- a/clash-meta/component/dialer/dialer.go +++ b/clash-meta/component/dialer/dialer.go @@ -88,21 +88,22 @@ func ListenPacket(ctx context.Context, network, address string, rAddrPort netip. if DefaultSocketHook != nil { // ignore interfaceName, routingMark when DefaultSocketHook not null (in CMFA) socketHookToListenConfig(lc) } else { - if cfg.interfaceName == "" { + interfaceName := cfg.interfaceName + if interfaceName == "" { if finder := DefaultInterfaceFinder.Load(); finder != nil { - cfg.interfaceName = finder.FindInterfaceName(rAddrPort.Addr()) + interfaceName = finder.FindInterfaceName(rAddrPort.Addr()) } } if rAddrPort.Addr().Unmap().IsLoopback() { // avoid "The requested address is not valid in its context." - cfg.interfaceName = "" + interfaceName = "" } - if cfg.interfaceName != "" { + if interfaceName != "" { bind := bindIfaceToListenConfig if cfg.fallbackBind { bind = fallbackBindIfaceToListenConfig } - addr, err := bind(cfg.interfaceName, lc, network, address, rAddrPort) + addr, err := bind(interfaceName, lc, network, address, rAddrPort) if err != nil { return nil, err } @@ -162,17 +163,18 @@ func dialContext(ctx context.Context, network string, destination netip.Addr, po if DefaultSocketHook != nil { // ignore interfaceName, routingMark and tfo when DefaultSocketHook not null (in CMFA) socketHookToToDialer(dialer) } else { - if opt.interfaceName == "" { + interfaceName := opt.interfaceName // don't change the "opt", it's a pointer + if interfaceName == "" { if finder := DefaultInterfaceFinder.Load(); finder != nil { - opt.interfaceName = finder.FindInterfaceName(destination) + interfaceName = finder.FindInterfaceName(destination) } } - if opt.interfaceName != "" { + if interfaceName != "" { bind := bindIfaceToDialer if opt.fallbackBind { bind = fallbackBindIfaceToDialer } - if err := bind(opt.interfaceName, dialer, network, destination); err != nil { + if err := bind(interfaceName, dialer, network, destination); err != nil { return nil, err } } diff --git a/clash-meta/component/iface/iface.go b/clash-meta/component/iface/iface.go index a56b3432bb..62a46f1f8d 100644 --- a/clash-meta/component/iface/iface.go +++ b/clash-meta/component/iface/iface.go @@ -7,6 +7,8 @@ import ( "time" "github.com/metacubex/mihomo/common/singledo" + + "github.com/metacubex/bart" ) type Interface struct { @@ -23,16 +25,23 @@ var ( ErrAddrNotFound = errors.New("addr not found") ) -var interfaces = singledo.NewSingle[map[string]*Interface](time.Second * 20) +type ifaceCache struct { + ifMap map[string]*Interface + ifTable bart.Table[*Interface] +} -func Interfaces() (map[string]*Interface, error) { - value, err, _ := interfaces.Do(func() (map[string]*Interface, error) { +var caches = singledo.NewSingle[*ifaceCache](time.Second * 20) + +func getCache() (*ifaceCache, error) { + value, err, _ := caches.Do(func() (*ifaceCache, error) { ifaces, err := net.Interfaces() if err != nil { return nil, err } - r := map[string]*Interface{} + cache := &ifaceCache{ + ifMap: make(map[string]*Interface), + } for _, iface := range ifaces { addrs, err := iface.Addrs() @@ -61,7 +70,7 @@ func Interfaces() (map[string]*Interface, error) { } } - r[iface.Name] = &Interface{ + ifaceObj := &Interface{ Index: iface.Index, MTU: iface.MTU, Name: iface.Name, @@ -69,13 +78,26 @@ func Interfaces() (map[string]*Interface, error) { Flags: iface.Flags, Addresses: ipNets, } + cache.ifMap[iface.Name] = ifaceObj + + for _, prefix := range ipNets { + cache.ifTable.Insert(prefix, ifaceObj) + } } - return r, nil + return cache, nil }) return value, err } +func Interfaces() (map[string]*Interface, error) { + cache, err := getCache() + if err != nil { + return nil, err + } + return cache.ifMap, nil +} + func ResolveInterface(name string) (*Interface, error) { ifaces, err := Interfaces() if err != nil { @@ -90,23 +112,29 @@ func ResolveInterface(name string) (*Interface, error) { return iface, nil } -func IsLocalIp(ip netip.Addr) (bool, error) { - ifaces, err := Interfaces() +func ResolveInterfaceByAddr(addr netip.Addr) (*Interface, error) { + cache, err := getCache() + if err != nil { + return nil, err + } + iface, ok := cache.ifTable.Lookup(addr) + if !ok { + return nil, ErrIfaceNotFound + } + + return iface, nil +} + +func IsLocalIp(addr netip.Addr) (bool, error) { + cache, err := getCache() if err != nil { return false, err } - for _, iface := range ifaces { - for _, addr := range iface.Addresses { - if addr.Contains(ip) { - return true, nil - } - } - } - return false, nil + return cache.ifTable.Contains(addr), nil } func FlushCache() { - interfaces.Reset() + caches.Reset() } func (iface *Interface) PickIPv4Addr(destination netip.Addr) (netip.Prefix, error) { diff --git a/clash-meta/dns/system_windows.go b/clash-meta/dns/system_windows.go index 2f4d1b633d..a86d50ed1d 100644 --- a/clash-meta/dns/system_windows.go +++ b/clash-meta/dns/system_windows.go @@ -3,8 +3,9 @@ package dns import ( - "net" + "net/netip" "os" + "strconv" "syscall" "unsafe" @@ -23,28 +24,31 @@ func dnsReadConfig() (servers []string, err error) { if err != nil { continue } - var ip net.IP + var ip netip.Addr switch sa := sa.(type) { case *syscall.SockaddrInet4: - ip = net.IPv4(sa.Addr[0], sa.Addr[1], sa.Addr[2], sa.Addr[3]) + ip = netip.AddrFrom4(sa.Addr) case *syscall.SockaddrInet6: - ip = make(net.IP, net.IPv6len) - copy(ip, sa.Addr[:]) - if ip[0] == 0xfe && ip[1] == 0xc0 { + if sa.Addr[0] == 0xfe && sa.Addr[1] == 0xc0 { // Ignore these fec0/10 ones. Windows seems to // populate them as defaults on its misc rando // interfaces. continue } + ip = netip.AddrFrom16(sa.Addr) + if sa.ZoneId != 0 { + ip = ip.WithZone(strconv.FormatInt(int64(sa.ZoneId), 10)) + } //continue default: // Unexpected type. continue } - if slices.Contains(servers, ip.String()) { + ipStr := ip.String() + if slices.Contains(servers, ipStr) { continue } - servers = append(servers, ip.String()) + servers = append(servers, ipStr) } } return diff --git a/clash-meta/go.mod b/clash-meta/go.mod index ffc2685dd4..f1ba043671 100644 --- a/clash-meta/go.mod +++ b/clash-meta/go.mod @@ -18,6 +18,7 @@ require ( github.com/lunixbochs/struc v0.0.0-20200707160740-784aaebc1d40 github.com/mdlayher/netlink v1.7.2 github.com/metacubex/amneziawg-go v0.0.0-20240922133038-fdf3a4d5a4ab + github.com/metacubex/bart v0.19.0 github.com/metacubex/bbolt v0.0.0-20240822011022-aed6d4850399 github.com/metacubex/chacha v0.1.1 github.com/metacubex/gopacket v1.1.20-0.20230608035415-7e2f98a3e759 diff --git a/clash-meta/go.sum b/clash-meta/go.sum index feacad2d22..c74b82fba5 100644 --- a/clash-meta/go.sum +++ b/clash-meta/go.sum @@ -97,6 +97,8 @@ github.com/mdlayher/socket v0.4.1 h1:eM9y2/jlbs1M615oshPQOHZzj6R6wMT7bX5NPiQvn2U github.com/mdlayher/socket v0.4.1/go.mod h1:cAqeGjoufqdxWkD7DkpyS+wcefOtmu5OQ8KuoJGIReA= github.com/metacubex/amneziawg-go v0.0.0-20240922133038-fdf3a4d5a4ab h1:Chbw+/31UC14YFNr78pESt5Vowlc62zziw05JCUqoL4= github.com/metacubex/amneziawg-go v0.0.0-20240922133038-fdf3a4d5a4ab/go.mod h1:xVKK8jC5Sd3hfh7WjmCq+HorehIbrBijaUWmcuKjPcI= +github.com/metacubex/bart v0.19.0 h1:XQ9AJeI+WO+phRPkUOoflAFwlqDJnm5BPQpixciJQBY= +github.com/metacubex/bart v0.19.0/go.mod h1:DCcyfP4MC+Zy7sLK7XeGuMw+P5K9mIRsYOBgiE8icsI= github.com/metacubex/bbolt v0.0.0-20240822011022-aed6d4850399 h1:oBowHVKZycNtAFbZ6avaCSZJYeme2Nrj+4RpV2cNJig= github.com/metacubex/bbolt v0.0.0-20240822011022-aed6d4850399/go.mod h1:4xcieuIK+M4bGQmQYZVqEaIYqjS1ahO4kXG7EmDgEro= github.com/metacubex/chacha v0.1.1 h1:OHIv11Nd9CISAIzegpjfupIoZp9DYm6uQw41RxvmU/c= diff --git a/clash-meta/listener/sing_tun/iface.go b/clash-meta/listener/sing_tun/iface.go index ed152b69c7..3551a853bb 100644 --- a/clash-meta/listener/sing_tun/iface.go +++ b/clash-meta/listener/sing_tun/iface.go @@ -1,7 +1,6 @@ package sing_tun import ( - "errors" "net" "net/netip" @@ -16,7 +15,8 @@ var DefaultInterfaceFinder control.InterfaceFinder = (*defaultInterfaceFinder)(n func (f *defaultInterfaceFinder) Update() error { iface.FlushCache() - return nil + _, err := iface.Interfaces() + return err } func (f *defaultInterfaceFinder) Interfaces() []control.Interface { @@ -32,27 +32,19 @@ func (f *defaultInterfaceFinder) Interfaces() []control.Interface { return interfaces } -var errNoSuchInterface = errors.New("no such network interface") - func (f *defaultInterfaceFinder) ByName(name string) (*control.Interface, error) { - ifaces, err := iface.Interfaces() - if err != nil { - return nil, err - } - for _, netInterface := range ifaces { - if netInterface.Name == name { - return (*control.Interface)(netInterface), nil - } - } - _, err = net.InterfaceByName(name) + netInterface, err := iface.ResolveInterface(name) if err == nil { + return (*control.Interface)(netInterface), nil + } + if _, err := net.InterfaceByName(name); err == nil { err = f.Update() if err != nil { return nil, err } return f.ByName(name) } - return nil, errNoSuchInterface + return nil, err } func (f *defaultInterfaceFinder) ByIndex(index int) (*control.Interface, error) { @@ -73,20 +65,13 @@ func (f *defaultInterfaceFinder) ByIndex(index int) (*control.Interface, error) } return f.ByIndex(index) } - return nil, errNoSuchInterface + return nil, iface.ErrIfaceNotFound } func (f *defaultInterfaceFinder) ByAddr(addr netip.Addr) (*control.Interface, error) { - ifaces, err := iface.Interfaces() + netInterface, err := iface.ResolveInterfaceByAddr(addr) if err != nil { return nil, err } - for _, netInterface := range ifaces { - for _, prefix := range netInterface.Addresses { - if prefix.Contains(addr) { - return (*control.Interface)(netInterface), nil - } - } - } - return nil, errNoSuchInterface + return (*control.Interface)(netInterface), nil } diff --git a/clash-nyanpasu/frontend/interface/package.json b/clash-nyanpasu/frontend/interface/package.json index ba9c6ba798..5aaa806a4b 100644 --- a/clash-nyanpasu/frontend/interface/package.json +++ b/clash-nyanpasu/frontend/interface/package.json @@ -11,7 +11,7 @@ "build": "tsc" }, "dependencies": { - "@tanstack/react-query": "5.67.3", + "@tanstack/react-query": "5.68.0", "@tauri-apps/api": "2.3.0", "ahooks": "3.8.4", "dayjs": "1.11.13", diff --git a/clash-nyanpasu/frontend/nyanpasu/package.json b/clash-nyanpasu/frontend/nyanpasu/package.json index e7bf284f09..035a822986 100644 --- a/clash-nyanpasu/frontend/nyanpasu/package.json +++ b/clash-nyanpasu/frontend/nyanpasu/package.json @@ -29,7 +29,7 @@ "allotment": "1.20.3", "country-code-emoji": "2.3.0", "dayjs": "1.11.13", - "framer-motion": "12.4.10", + "framer-motion": "12.5.0", "i18next": "24.2.3", "jotai": "2.12.2", "json-schema": "0.4.0", @@ -55,10 +55,10 @@ "@emotion/react": "11.14.0", "@iconify/json": "2.2.317", "@monaco-editor/react": "4.7.0", - "@tanstack/react-query": "5.67.3", - "@tanstack/react-router": "1.114.22", - "@tanstack/router-devtools": "1.114.22", - "@tanstack/router-plugin": "1.114.22", + "@tanstack/react-query": "5.68.0", + "@tanstack/react-router": "1.114.23", + "@tanstack/router-devtools": "1.114.23", + "@tanstack/router-plugin": "1.114.23", "@tauri-apps/plugin-clipboard-manager": "2.2.2", "@tauri-apps/plugin-dialog": "2.2.0", "@tauri-apps/plugin-fs": "2.2.0", diff --git a/clash-nyanpasu/frontend/ui/package.json b/clash-nyanpasu/frontend/ui/package.json index c61ebfa6df..2e007efef1 100644 --- a/clash-nyanpasu/frontend/ui/package.json +++ b/clash-nyanpasu/frontend/ui/package.json @@ -28,7 +28,7 @@ "@vitejs/plugin-react": "4.3.4", "ahooks": "3.8.4", "d3": "7.9.0", - "framer-motion": "12.4.10", + "framer-motion": "12.5.0", "react": "19.0.0", "react-dom": "19.0.0", "react-error-boundary": "5.0.0", diff --git a/clash-nyanpasu/manifest/version.json b/clash-nyanpasu/manifest/version.json index 92857f7e2d..605ec3dc6c 100644 --- a/clash-nyanpasu/manifest/version.json +++ b/clash-nyanpasu/manifest/version.json @@ -5,7 +5,7 @@ "mihomo_alpha": "alpha-dee5898", "clash_rs": "v0.7.6", "clash_premium": "2023-09-05-gdcc8d87", - "clash_rs_alpha": "0.7.6-alpha+sha.4124feb" + "clash_rs_alpha": "0.7.6-alpha+sha.47236aa" }, "arch_template": { "mihomo": { @@ -69,5 +69,5 @@ "linux-armv7hf": "clash-armv7-unknown-linux-gnueabihf" } }, - "updated_at": "2025-03-15T22:20:39.234Z" + "updated_at": "2025-03-16T22:20:31.758Z" } diff --git a/clash-nyanpasu/pnpm-lock.yaml b/clash-nyanpasu/pnpm-lock.yaml index 27d538e698..e2513f7335 100644 --- a/clash-nyanpasu/pnpm-lock.yaml +++ b/clash-nyanpasu/pnpm-lock.yaml @@ -175,8 +175,8 @@ importers: frontend/interface: dependencies: '@tanstack/react-query': - specifier: 5.67.3 - version: 5.67.3(react@19.0.0) + specifier: 5.68.0 + version: 5.68.0(react@19.0.0) '@tauri-apps/api': specifier: 2.3.0 version: 2.3.0 @@ -246,7 +246,7 @@ importers: version: 4.0.14 '@tanstack/router-zod-adapter': specifier: 1.81.5 - version: 1.81.5(@tanstack/react-router@1.114.22(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(zod@3.24.2) + version: 1.81.5(@tanstack/react-router@1.114.23(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(zod@3.24.2) '@tauri-apps/api': specifier: 2.3.0 version: 2.3.0 @@ -266,8 +266,8 @@ importers: specifier: 1.11.13 version: 1.11.13 framer-motion: - specifier: 12.4.10 - version: 12.4.10(@emotion/is-prop-valid@1.3.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + specifier: 12.5.0 + version: 12.5.0(@emotion/is-prop-valid@1.3.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) i18next: specifier: 24.2.3 version: 24.2.3(typescript@5.8.2) @@ -339,17 +339,17 @@ importers: specifier: 4.7.0 version: 4.7.0(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@tanstack/react-query': - specifier: 5.67.3 - version: 5.67.3(react@19.0.0) + specifier: 5.68.0 + version: 5.68.0(react@19.0.0) '@tanstack/react-router': - specifier: 1.114.22 - version: 1.114.22(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + specifier: 1.114.23 + version: 1.114.23(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@tanstack/router-devtools': - specifier: 1.114.22 - version: 1.114.22(@tanstack/react-router@1.114.22(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@tanstack/router-core@1.114.22)(csstype@3.1.3)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(tiny-invariant@1.3.3) + specifier: 1.114.23 + version: 1.114.23(@tanstack/react-router@1.114.23(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@tanstack/router-core@1.114.23)(csstype@3.1.3)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(tiny-invariant@1.3.3) '@tanstack/router-plugin': - specifier: 1.114.22 - version: 1.114.22(@tanstack/react-router@1.114.22(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.2)(sass-embedded@1.85.1)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0)) + specifier: 1.114.23 + version: 1.114.23(@tanstack/react-router@1.114.23(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.2)(sass-embedded@1.85.1)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0)) '@tauri-apps/plugin-clipboard-manager': specifier: 2.2.2 version: 2.2.2 @@ -486,8 +486,8 @@ importers: specifier: 7.9.0 version: 7.9.0 framer-motion: - specifier: 12.4.10 - version: 12.4.10(@emotion/is-prop-valid@1.3.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + specifier: 12.5.0 + version: 12.5.0(@emotion/is-prop-valid@1.3.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) react: specifier: 19.0.0 version: 19.0.0 @@ -2738,24 +2738,24 @@ packages: resolution: {integrity: sha512-Wo1iKt2b9OT7d+YGhvEPD3DXvPv2etTusIMhMUoG7fbhmxcXCtIjJDEygy91Y2JFlwGyjqiBPRozme7UD8hoqg==} engines: {node: '>=12'} - '@tanstack/query-core@5.67.3': - resolution: {integrity: sha512-pq76ObpjcaspAW4OmCbpXLF6BCZP2Zr/J5ztnyizXhSlNe7fIUp0QKZsd0JMkw9aDa+vxDX/OY7N+hjNY/dCGg==} + '@tanstack/query-core@5.68.0': + resolution: {integrity: sha512-r8rFYYo8/sY/LNaOqX84h12w7EQev4abFXDWy4UoDVUJzJ5d9Fbmb8ayTi7ScG+V0ap44SF3vNs/45mkzDGyGw==} - '@tanstack/react-query@5.67.3': - resolution: {integrity: sha512-u/n2HsQeH1vpZIOzB/w2lqKlXUDUKo6BxTdGXSMvNzIq5MHYFckRMVuFABp+QB7RN8LFXWV6X1/oSkuDq+MPIA==} + '@tanstack/react-query@5.68.0': + resolution: {integrity: sha512-mMOdGDKlwTP/WV72QqSNf4PAMeoBp/DqBHQ222wBfb51Looi8QUqnCnb9O98ZgvNISmy6fzxRGBJdZ+9IBvX2Q==} peerDependencies: react: ^18 || ^19 - '@tanstack/react-router-devtools@1.114.22': - resolution: {integrity: sha512-jPbj1ocehP4iV7nClb9e7mJjcSygWxI7dRWIy0ehMYZelsE7QjQ27RwFxmHVNBZRbHr7MfqlBaArP81qWMZ4wA==} + '@tanstack/react-router-devtools@1.114.23': + resolution: {integrity: sha512-eOTlXeLlT5PfSrOrDEljTz8F7Sl3YjjI+yTGn5ern0FrFlc3GlBxJqFaKC19mT9H4ZkwETnSqDHrLZKV06ykRA==} engines: {node: '>=12'} peerDependencies: - '@tanstack/react-router': ^1.114.22 + '@tanstack/react-router': ^1.114.23 react: '>=18.0.0 || >=19.0.0' react-dom: '>=18.0.0 || >=19.0.0' - '@tanstack/react-router@1.114.22': - resolution: {integrity: sha512-Z58+pgN1uPAlw42uq3iH+S08+rS93594MNmdMY6wvTsHnanZ28eOd5pgfn9tshrmD7zdKJrfJ8zD2xpgRvpA5Q==} + '@tanstack/react-router@1.114.23': + resolution: {integrity: sha512-L9TS8HE5nvXzCyjwlwfXwnC7pfiofbDLCSAGN7Me2jUbxHPyQpAtxRYqtByANaFVclOJgYBmZkx1m6/GVk9oiA==} engines: {node: '>=12'} peerDependencies: react: '>=18.0.0 || >=19.0.0' @@ -2780,15 +2780,15 @@ packages: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - '@tanstack/router-core@1.114.22': - resolution: {integrity: sha512-gWiHB+QxOiwIFm43xsOiQu5BKUucOxW3yiV3YBnrZQu8IpdREEKoYkBxuEEKW23gMi2mmoJMZC8N4mN7NiIxrg==} + '@tanstack/router-core@1.114.23': + resolution: {integrity: sha512-aJkqAtVyRbdNBuoAsiy5Jmc9MYa2Gt9r1s/xlYBDfSEWoJzhMmWVoKfgBI6Ggeu3dwe6uCr/gkBRmpRkgWjg1w==} engines: {node: '>=12'} - '@tanstack/router-devtools-core@1.114.22': - resolution: {integrity: sha512-3vm/5EDFc6asJ+d1ATNrWH/dbdZi/hRG4WDdyBRc27glyqpiFXlkTZzrxN6aqZXGe84y3J0vIjilDpv6kBdO/A==} + '@tanstack/router-devtools-core@1.114.23': + resolution: {integrity: sha512-PP2JFokatFdL3RANKibZPWK1L1vy4LM2chEvwyJYVUhAKg+gWPIB4aE5FnhkI/sn7N/8dzt83Xbruj+NPEPfmg==} engines: {node: '>=12'} peerDependencies: - '@tanstack/router-core': ^1.114.22 + '@tanstack/router-core': ^1.114.23 csstype: ^3.0.10 solid-js: '>=1.9.5' tiny-invariant: ^1.3.3 @@ -2796,11 +2796,11 @@ packages: csstype: optional: true - '@tanstack/router-devtools@1.114.22': - resolution: {integrity: sha512-wkT4JjjMRxpHi4+iLlrXMizVPWlBdV5zZCA/Aa8M9is28eIaw4ML+tEC2ckX292zPs0NpySdtPSMD3Ml50TLrQ==} + '@tanstack/router-devtools@1.114.23': + resolution: {integrity: sha512-i7F7VkA73fVvaZuPc/hsAiTlkDu/PF11Y3ERDNGL8G9NUaDEKeW8rvK0V+KTNNg8Tnm0FOHH4xohquzBXPkcuA==} engines: {node: '>=12'} peerDependencies: - '@tanstack/react-router': ^1.114.22 + '@tanstack/react-router': ^1.114.23 csstype: ^3.0.10 react: '>=18.0.0 || >=19.0.0' react-dom: '>=18.0.0 || >=19.0.0' @@ -2808,21 +2808,21 @@ packages: csstype: optional: true - '@tanstack/router-generator@1.114.22': - resolution: {integrity: sha512-MpUYgW/EfFbse63QJqaE1QLEyzxpVpaf2UadByhCpD+DB1MFpLagg/kbegc0+PO3Plz/GcW0H8rBxgTfrsx99Q==} + '@tanstack/router-generator@1.114.23': + resolution: {integrity: sha512-+6YwCXXL4H6CwdWLIrO8Bmy9HZIB8p9yJGcIBGXefN3D0vOUOi7EJa2+MQgQCQgjdygP4zuutqXD/5qxEZQQNw==} engines: {node: '>=12'} peerDependencies: - '@tanstack/react-router': ^1.114.22 + '@tanstack/react-router': ^1.114.23 peerDependenciesMeta: '@tanstack/react-router': optional: true - '@tanstack/router-plugin@1.114.22': - resolution: {integrity: sha512-QQ4GjZvPJ3/xZ5JrujwPmP7Jgtg3rx6eIVgigZL9Q/yHW8bzN5CMxFbMvA6ICJY2y2s/9W3v+TIjj4SwlvxCpw==} + '@tanstack/router-plugin@1.114.23': + resolution: {integrity: sha512-4D5558eQ4So2HXnVrN5inZs4tU5nlv75VH6u95NZvVSGc+zUBryzBg7ElkhzMh+UPQoJ0RTf4NxNcKG3vw2+6w==} engines: {node: '>=12'} peerDependencies: '@rsbuild/core': '>=1.0.2' - '@tanstack/react-router': ^1.114.22 + '@tanstack/react-router': ^1.114.23 vite: '>=5.0.0 || >=6.0.0' vite-plugin-solid: ^2.11.2 webpack: '>=5.92.0' @@ -4776,8 +4776,8 @@ packages: fraction.js@4.3.7: resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} - framer-motion@12.4.10: - resolution: {integrity: sha512-3Msuyjcr1Pb5hjkn4EJcRe1HumaveP0Gbv4DBMKTPKcV/1GSMkQXj+Uqgneys+9DPcZM18Hac9qY9iUEF5LZtg==} + framer-motion@12.5.0: + resolution: {integrity: sha512-buPlioFbH9/W7rDzYh1C09AuZHAk2D1xTA1BlounJ2Rb9aRg84OXexP0GLd+R83v0khURdMX7b5MKnGTaSg5iA==} peerDependencies: '@emotion/is-prop-valid': '*' react: ^18.0.0 || ^19.0.0 @@ -6053,11 +6053,11 @@ packages: peerDependencies: monaco-editor: '>=0.36' - motion-dom@12.4.10: - resolution: {integrity: sha512-ISP5u6FTceoD6qKdLupIPU/LyXBrxGox+P2e3mBbm1+pLdlBbwv01YENJr7+1WZnW5ucVKzFScYsV1eXTCG4Xg==} + motion-dom@12.5.0: + resolution: {integrity: sha512-uH2PETDh7m+Hjd1UQQ56yHqwn83SAwNjimNPE/kC+Kds0t4Yh7+29rfo5wezVFpPOv57U4IuWved5d1x0kNhbQ==} - motion-utils@12.4.10: - resolution: {integrity: sha512-NPwZd94V013SwRf++jMrk2+HEBgPkeIE2RiOzhAuuQlqxMJPkKt/LXVh6Upl+iN8oarSGD2dlY5/bqgsYXDABA==} + motion-utils@12.5.0: + resolution: {integrity: sha512-+hFFzvimn0sBMP9iPxBa9OtRX35ZQ3py0UHnb8U29VD+d8lQ8zH3dTygJWqK7av2v6yhg7scj9iZuvTS0f4+SA==} ms@2.0.0: resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} @@ -10485,17 +10485,17 @@ snapshots: dependencies: remove-accents: 0.5.0 - '@tanstack/query-core@5.67.3': {} + '@tanstack/query-core@5.68.0': {} - '@tanstack/react-query@5.67.3(react@19.0.0)': + '@tanstack/react-query@5.68.0(react@19.0.0)': dependencies: - '@tanstack/query-core': 5.67.3 + '@tanstack/query-core': 5.68.0 react: 19.0.0 - '@tanstack/react-router-devtools@1.114.22(@tanstack/react-router@1.114.22(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@tanstack/router-core@1.114.22)(csstype@3.1.3)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(tiny-invariant@1.3.3)': + '@tanstack/react-router-devtools@1.114.23(@tanstack/react-router@1.114.23(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@tanstack/router-core@1.114.23)(csstype@3.1.3)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(tiny-invariant@1.3.3)': dependencies: - '@tanstack/react-router': 1.114.22(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@tanstack/router-devtools-core': 1.114.22(@tanstack/router-core@1.114.22)(csstype@3.1.3)(solid-js@1.9.5)(tiny-invariant@1.3.3) + '@tanstack/react-router': 1.114.23(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@tanstack/router-devtools-core': 1.114.23(@tanstack/router-core@1.114.23)(csstype@3.1.3)(solid-js@1.9.5)(tiny-invariant@1.3.3) react: 19.0.0 react-dom: 19.0.0(react@19.0.0) solid-js: 1.9.5 @@ -10504,11 +10504,11 @@ snapshots: - csstype - tiny-invariant - '@tanstack/react-router@1.114.22(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@tanstack/react-router@1.114.23(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: '@tanstack/history': 1.114.22 '@tanstack/react-store': 0.7.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@tanstack/router-core': 1.114.22 + '@tanstack/router-core': 1.114.23 jsesc: 3.1.0 react: 19.0.0 react-dom: 19.0.0(react@19.0.0) @@ -10534,14 +10534,14 @@ snapshots: react: 19.0.0 react-dom: 19.0.0(react@19.0.0) - '@tanstack/router-core@1.114.22': + '@tanstack/router-core@1.114.23': dependencies: '@tanstack/history': 1.114.22 '@tanstack/store': 0.7.0 - '@tanstack/router-devtools-core@1.114.22(@tanstack/router-core@1.114.22)(csstype@3.1.3)(solid-js@1.9.5)(tiny-invariant@1.3.3)': + '@tanstack/router-devtools-core@1.114.23(@tanstack/router-core@1.114.23)(csstype@3.1.3)(solid-js@1.9.5)(tiny-invariant@1.3.3)': dependencies: - '@tanstack/router-core': 1.114.22 + '@tanstack/router-core': 1.114.23 clsx: 2.1.1 goober: 2.1.16(csstype@3.1.3) solid-js: 1.9.5 @@ -10549,10 +10549,10 @@ snapshots: optionalDependencies: csstype: 3.1.3 - '@tanstack/router-devtools@1.114.22(@tanstack/react-router@1.114.22(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@tanstack/router-core@1.114.22)(csstype@3.1.3)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(tiny-invariant@1.3.3)': + '@tanstack/router-devtools@1.114.23(@tanstack/react-router@1.114.23(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@tanstack/router-core@1.114.23)(csstype@3.1.3)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(tiny-invariant@1.3.3)': dependencies: - '@tanstack/react-router': 1.114.22(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@tanstack/react-router-devtools': 1.114.22(@tanstack/react-router@1.114.22(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@tanstack/router-core@1.114.22)(csstype@3.1.3)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(tiny-invariant@1.3.3) + '@tanstack/react-router': 1.114.23(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@tanstack/react-router-devtools': 1.114.23(@tanstack/react-router@1.114.23(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@tanstack/router-core@1.114.23)(csstype@3.1.3)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(tiny-invariant@1.3.3) clsx: 2.1.1 goober: 2.1.16(csstype@3.1.3) react: 19.0.0 @@ -10563,16 +10563,16 @@ snapshots: - '@tanstack/router-core' - tiny-invariant - '@tanstack/router-generator@1.114.22(@tanstack/react-router@1.114.22(react-dom@19.0.0(react@19.0.0))(react@19.0.0))': + '@tanstack/router-generator@1.114.23(@tanstack/react-router@1.114.23(react-dom@19.0.0(react@19.0.0))(react@19.0.0))': dependencies: '@tanstack/virtual-file-routes': 1.114.12 prettier: 3.5.3 tsx: 4.19.3 zod: 3.24.2 optionalDependencies: - '@tanstack/react-router': 1.114.22(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@tanstack/react-router': 1.114.23(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@tanstack/router-plugin@1.114.22(@tanstack/react-router@1.114.22(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.2)(sass-embedded@1.85.1)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0))': + '@tanstack/router-plugin@1.114.23(@tanstack/react-router@1.114.23(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.2)(sass-embedded@1.85.1)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0))': dependencies: '@babel/core': 7.26.9 '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.9) @@ -10580,8 +10580,8 @@ snapshots: '@babel/template': 7.26.9 '@babel/traverse': 7.26.9 '@babel/types': 7.26.9 - '@tanstack/router-core': 1.114.22 - '@tanstack/router-generator': 1.114.22(@tanstack/react-router@1.114.22(react-dom@19.0.0(react@19.0.0))(react@19.0.0)) + '@tanstack/router-core': 1.114.23 + '@tanstack/router-generator': 1.114.23(@tanstack/react-router@1.114.23(react-dom@19.0.0(react@19.0.0))(react@19.0.0)) '@tanstack/router-utils': 1.114.12 '@tanstack/virtual-file-routes': 1.114.12 '@types/babel__core': 7.20.5 @@ -10592,7 +10592,7 @@ snapshots: unplugin: 2.2.0 zod: 3.24.2 optionalDependencies: - '@tanstack/react-router': 1.114.22(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@tanstack/react-router': 1.114.23(react-dom@19.0.0(react@19.0.0))(react@19.0.0) vite: 6.2.2(@types/node@22.13.10)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.2)(sass-embedded@1.85.1)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0) transitivePeerDependencies: - supports-color @@ -10604,9 +10604,9 @@ snapshots: ansis: 3.12.0 diff: 7.0.0 - '@tanstack/router-zod-adapter@1.81.5(@tanstack/react-router@1.114.22(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(zod@3.24.2)': + '@tanstack/router-zod-adapter@1.81.5(@tanstack/react-router@1.114.23(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(zod@3.24.2)': dependencies: - '@tanstack/react-router': 1.114.22(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@tanstack/react-router': 1.114.23(react-dom@19.0.0(react@19.0.0))(react@19.0.0) zod: 3.24.2 '@tanstack/store@0.7.0': {} @@ -12917,10 +12917,10 @@ snapshots: fraction.js@4.3.7: {} - framer-motion@12.4.10(@emotion/is-prop-valid@1.3.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + framer-motion@12.5.0(@emotion/is-prop-valid@1.3.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0): dependencies: - motion-dom: 12.4.10 - motion-utils: 12.4.10 + motion-dom: 12.5.0 + motion-utils: 12.5.0 tslib: 2.7.0 optionalDependencies: '@emotion/is-prop-valid': 1.3.0 @@ -14311,11 +14311,11 @@ snapshots: vscode-uri: 3.0.8 yaml: 2.7.0 - motion-dom@12.4.10: + motion-dom@12.5.0: dependencies: - motion-utils: 12.4.10 + motion-utils: 12.5.0 - motion-utils@12.4.10: {} + motion-utils@12.5.0: {} ms@2.0.0: {} diff --git a/clash-verge-rev/.github/workflows/alpha.yml b/clash-verge-rev/.github/workflows/alpha.yml index 6258de309b..dfddd4304a 100644 --- a/clash-verge-rev/.github/workflows/alpha.yml +++ b/clash-verge-rev/.github/workflows/alpha.yml @@ -269,6 +269,9 @@ jobs: - name: Checkout Repository uses: actions/checkout@v4 + - name: Install Rust Stable + uses: dtolnay/rust-toolchain@stable + - name: Add Rust Target run: rustup target add ${{ matrix.target }} @@ -310,6 +313,11 @@ jobs: TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }} TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }} with: + tagName: alpha + releaseName: "Clash Verge Rev Alpha" + releaseBody: "More new features are now supported." + releaseDraft: false + prerelease: true tauriScript: pnpm args: --target ${{ matrix.target }} diff --git a/clash-verge-rev/scripts/check.sh b/clash-verge-rev/scripts/check.sh deleted file mode 100644 index 331457bfe6..0000000000 --- a/clash-verge-rev/scripts/check.sh +++ /dev/null @@ -1,5988 +0,0 @@ -#!/bin/bash - -VER='1.0.0' - -UA_BROWSER="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36" -UA_SEC_CH_UA='"Google Chrome";v="125", "Chromium";v="125", "Not.A/Brand";v="24"' -UA_ANDROID="Mozilla/5.0 (Linux; Android 10; Pixel 4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Mobile Safari/537.36" - -color_print() { - Font_Black="\033[30m" - Font_Red="\033[31m" - Font_Green="\033[32m" - Font_Yellow="\033[33m" - Font_Blue="\033[34m" - Font_Purple="\033[35m" - Font_SkyBlue="\033[36m" - Font_White="\033[37m" - Font_Suffix="\033[0m" -} - -command_exists() { - command -v "$1" > /dev/null 2>&1 -} - -gen_uuid() { - if [ -f /proc/sys/kernel/random/uuid ]; then - local genuuid=$(cat /proc/sys/kernel/random/uuid) - echo "${genuuid}" - return 0 - fi - - if command_exists uuidgen; then - local genuuid=$(uuidgen) - echo "${genuuid}" - return 0 - fi - - if command_exists powershell && [ "$OS_WINDOWS" == 1 ]; then - local genuuid=$(powershell -c "[guid]::NewGuid().ToString()") - echo "${genuuid}" - return 0 - fi - - return 1 -} - -gen_random_str() { - if [ -z "$1" ]; then - echo -e "${Font_Red}Length missing.${Font_Suffix}" - exit 1 - fi - local randomstr=$(< /dev/urandom tr -dc A-Za-z0-9 | head -c "$1") - echo "${randomstr}" -} - -resolve_ip_address() { - if [ -z "$1" ]; then - echo -e "${Font_Red}Domain missing.${Font_Suffix}" - exit 1 - fi - if [ -z "$2" ]; then - echo -e "${Font_Red}DNS Record type missing.${Font_Suffix}" - exit 1 - fi - - local domain="$1" - local recordType="$2" - - if command_exists nslookup && [ "$OS_WINDOWS" != 1 ]; then - local nslookupExists=1 - fi - if command_exists dig; then - local digExists=1 - fi - if [ "$OS_IOS" == 1 ]; then - local nslookupExists=0 - local digExists=0 - fi - - if [ "$nslookupExists" == 1 ]; then - if [ "$recordType" == 'AAAA' ]; then - local result=$(nslookup -q=AAAA "${domain}" | grep -woP "Address: \K[\d:a-f]+") - echo "${result}" - return - else - local result=$(nslookup -q=A "${domain}" | grep -woP "Address: \K[\d.]+") - echo "${result}" - return - fi - fi - if [ "$digExists" == 1 ]; then - if [ "$recordType" == 'AAAA' ]; then - local result=$(dig +short "${domain}" AAAA) - echo "${result}" - return - else - local result=$(dig +short "${domain}" A) - echo "${result}" - return - fi - fi - - if [ "$recordType" == 'AAAA' ]; then - local pingArgs='-6 -c 1 -w 1 -W 1' - [ "$OS_ANDROID" == 1 ] && pingArgs='-c 1 -w 1 -W 1' - local result=$(ping6 ${pingArgs} "${domain}" 2>/dev/null | head -n 1 | grep -woP '\s\(\K[\d:a-f]+') - echo "${result}" - return - else - local pingArgs='-4 -c 1 -w 1 -W 1' - [ "$OS_ANDROID" == 1 ] && pingArgs='-c 1 -w 1 -W 1' - local result=$(ping ${pingArgs} "${domain}" 2>/dev/null | head -n 1 | grep -woP '\s\(\K[\d.]+') - echo "${result}" - return - fi -} - -validate_proxy() { - if [ -z "$1" ]; then - echo -e "${Font_Red}Param Proxy Address is missing.${Font_Suffix}" - exit 1 - fi - - local tmpresult=$(echo "$1" | grep -P '^(socks|socks4|socks5|http)://([^:]+:[^@]+@)?(([0-9]{1,3}\.){3}[0-9]{1,3}|(\[[0-9a-fA-F:]+\]|([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|((([0-9a-fA-F]{1,4}:){1,6})|::(([0-9a-fA-F]{1,4}:){1,6}))([0-9a-fA-F]{1,4}))):(0|[1-9][0-9]{0,4})$') - if [ -z "$tmpresult" ]; then - echo -e "${Font_Red}Proxy IP invalid.${Font_Suffix}" - exit 1 - fi - - local port=$(echo "$1" | grep -woP ':\K[0-9]+$') - if [ "$port" -ge 65535 ]; then - echo -e "${Font_Red}Proxy Port invalid.${Font_Suffix}" - exit 1 - fi -} - -validate_ip_address() { - if [ -z "$1" ]; then - echo -e "${Font_Red}Param IP Address is missing.${Font_Suffix}" - exit 1 - fi - - if echo "$1" | awk '{$1=$1; print}' | grep -Eq '^([0-9]{1,3}\.){3}[0-9]{1,3}$'; then - return 4 - fi - echo "$1" | awk '{$1=$1; print}' | grep -Eq '^([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}$|^(([0-9a-fA-F]{1,4}:){1,7}|:):([0-9a-fA-F]{1,4}:){1,7}|:$|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}$|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}$|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}$|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}$|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}$|([0-9a-fA-F]{1,4}:){1}(:[0-9a-fA-F]{1,4}){1,6}$|:(:[0-9a-fA-F]{1,4}){1,7}$|((([0-9a-fA-F]{1,4}:){1,4}:|:):(([0-9a-fA-F]{1,4}:){0,1}[0-9a-fA-F]{1,4}){1,4})$' - if [ "$?" == 0 ]; then - return 6 - fi - - return 1 -} - -validate_intranet() { - if [ -z "$1" ]; then - echo -e "${Font_Red}Param missing.${Font_Suffix}" - fi - # See https://en.wikipedia.org/wiki/Reserved_IP_addresses - local tmpresult=$(echo "$1" | grep -E '(^|\s)(10\.(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\.(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\.(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])|172\.(1[6-9]|2[0-9]|3[01])\.(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\.(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])|192\.168\.(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\.(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])|100\.([6-9][4-9]|1[0-2][0-7])\.(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\.(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])|169\.254\.(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\.(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])|192\.88\.99\.(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])|192\.0\.(0|2)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])|198\.(1[89])\.(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\.(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])|198\.51\.100\.(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])|203\.0\.113\.(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])|2[23][4-9]\.(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\.(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\.(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])|233\.252\.(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\.(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])|(24[0-9]|25[0-5])\.(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\.(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\.(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9]))(\s|$)') - if [ -z "$tmpresult" ]; then - return 1 - fi - - return 0 -} - -validate_region_id() { - if [ -z "$1" ]; then - echo -e "${Font_Red}Param missing.${Font_Suffix}" - exit 1 - fi - local regionid="$1" - local result=$(echo "$regionid" | grep -E '^[0-9]$|^1[0-1]$|^99$|^88$|^66$') - if [ -z "$result" ]; then - return 1 - fi - return 0 -} - -validate_net_type() { - if [ -z "$1" ]; then - echo -e "${Font_Red}Param missing.${Font_Suffix}" - exit 1 - fi - local netType="$1" - local result=$(echo "$netType" | grep -E '^4$|^6$|^0$') - if [ -z "$result" ]; then - echo -e "${Font_Red}Invalid Network Type.${Font_Suffix}" - exit 1 - fi - return 0 -} - -check_proxy_connectivity() { - local result1=$(curl $USE_NIC $USE_PROXY -s 'https://ip.sb' --user-agent "${UA_BROWSER}" ) - local result2=$(curl $USE_NIC $USE_PROXY -s 'https://1.0.0.1/cdn-cgi/trace' --user-agent "${UA_BROWSER}") - if [ -n "$result1" ] && [ -n "$result2" ]; then - return 0 - fi - - return 1 -} - -check_net_connctivity() { - if [ -z "$1" ]; then - echo -e "${Font_Red}Param missing.${Font_Suffix}" - exit 1 - fi - - if [ "$1" == 4 ]; then - local result1=$(curl -4 ${CURL_OPTS} -fs 'http://www.msftconnecttest.com/connecttest.txt' -w '%{http_code}' -o /dev/null --user-agent "${UA_BROWSER}") - if [ "$result1" == '200' ]; then - return 0 - fi - fi - - if [ "$1" == 6 ]; then - local result2=$(curl -6 ${CURL_OPTS} -fs 'http://ipv6.msftconnecttest.com/connecttest.txt' -w '%{http_code}' -o /dev/null --user-agent "${UA_BROWSER}") - if [ "$result2" == '200' ]; then - return 0 - fi - fi - - return 1 -} - -check_os_type() { - OS_TYPE='' - local ifLinux=$(uname -a | grep -i 'linux') - local ifFreeBSD=$(uname -a | grep -i 'freebsd') - local ifTermux=$(echo "$PWD" | grep -i 'termux') - local ifMacOS=$(uname -a | grep -i 'Darwin') - local ifMinGW=$(uname -a | grep -i 'MINGW') - local ifCygwin=$(uname -a | grep -i 'CYGWIN') - local ifAndroid=$(uname -a | grep -i 'android') - local ifiSh=$(uname -a | grep -i '\-ish') - - if [ -n "$ifLinux" ] && [ -z "$ifAndroid" ] && [ -z "$ifiSh" ]; then - OS_TYPE='linux' - OS_LINUX=1 - return - fi - if [ -n "$ifTermux" ]; then - OS_TYPE='termux' - OS_TERMUX=1 - OS_ANDROID=1 - return - fi - if [ -n "$ifMacOS" ]; then - OS_TYPE='macos' - OS_MACOS=1 - return - fi - if [ -n "$ifMinGW" ]; then - OS_TYPE='msys' - OS_WINDOWS=1 - return - fi - if [ -n "$ifCygwin" ]; then - OS_TYPE='cygwin' - OS_WINDOWS=1 - return - fi - if [ -n "$ifFreeBSD" ]; then - OS_TYPE='freebsd' - OS_FREEBSD=1 - return - fi - if [ -n "$ifAndroid" ]; then - OS_TYPE='android' - OS_ANDROID=1 - return - fi - if [ -n "$ifiSh" ]; then - OS_TYPE='ish' - OS_IOS=1 - return - fi - - echo -e "${Font_Red}Unsupported OS Type.${Font_Suffix}" - exit 1 -} - -check_dependencies() { - CURL_SSL_CIPHERS_OPT='' - - if [ "$OS_TYPE" == 'linux' ]; then - source /etc/os-release - if [ -z "$ID" ]; then - echo -e "${Font_Red}Unsupported Linux OS Type.${Font_Suffix}" - exit 1 - fi - - case "$ID" in - debian|devuan|kali) - OS_NAME='debian' - PKGMGR='apt' - ;; - ubuntu) - OS_NAME='ubuntu' - PKGMGR='apt' - ;; - centos|fedora|rhel|almalinux|rocky|amzn) - OS_NAME='rhel' - PKGMGR='dnf' - ;; - arch|archarm) - OS_NAME='arch' - PKGMGR='pacman' - ;; - alpine) - OS_NAME='alpine' - PKGMGR='apk' - ;; - *) - OS_NAME="$ID" - PKGMGR='apt' - ;; - esac - fi - - if [ -z $(echo 'e' | grep -P 'e' 2>/dev/null) ]; then - echo -e "${Font_Red}command 'grep' function is incomplete, please install the full version first.${Font_Suffix}" - exit 1 - fi - - if ! command_exists curl; then - echo -e "${Font_Red}command 'curl' is missing, please install it first.${Font_Suffix}" - exit 1 - fi - - if ! gen_uuid >/dev/null; then - echo -e "${Font_Red}command 'uuidgen' is missing, please install it first.${Font_Suffix}" - exit 1 - fi - - if ! command_exists openssl; then - echo -e "${Font_Red}command 'openssl' is missing, please install it first.${Font_Suffix}" - exit 1 - fi - - if [ "$OS_MACOS" == 1 ]; then - if ! command_exists md5sum; then - echo -e "${Font_Red}command 'md5sum' is missing, please install it first.${Font_Suffix}" - exit 1 - fi - if ! command_exists sha256sum; then - echo -e "${Font_Red}command 'sha256sum' is missing, please install it first.${Font_Suffix}" - exit 1 - fi - fi - - if [ "$OS_NAME" == 'debian' ] || [ "$OS_NAME" == 'ubuntu' ]; then - local os_version=$(echo "$VERSION_ID" | tr -d '.') - if [ "$os_version" == "2004" ] || [ "$os_version" == "10" ] || [ "$os_version" == "11" ]; then - CURL_SSL_CIPHERS_OPT='-k --ciphers DEFAULT@SECLEVEL=1' - fi - fi - - if command_exists usleep; then - USE_USLEEP=1 - fi -} - -process() { - local iface='' - local xip='' - local proxy='' - USE_NIC='' - NETWORK_TYPE='' - LANGUAGE='' - X_FORWARD='' - USE_PROXY='' - - while [ $# -gt 0 ]; do - case "$1" in - -I | --interface) - local iface="$2" - USE_NIC="--interface $2" - shift - ;; - -M | --network-type) - local netType="$2" - shift - ;; - -E | --language) - LANGUAGE="$2" - shift - ;; - -X | --x-forwarded-for) - local xip="$2" - shift - ;; - -P | --proxy) - local proxy="$2" - shift - ;; - -R | --region) - local regionid="$2" - shift - ;; - *) - echo -e "${Font_Red}Unknown error while processing options.${Font_Suffix}" - exit 1 - ;; - esac - shift - done - - if [ -z "$iface" ]; then - USE_NIC='' - fi - - if [ -z "$xip" ]; then - X_FORWARD='' - fi - - if [ -n "$xip" ]; then - local xip=$(echo "$xip" | awk '{$1=$1; print}') - validate_ip_address "$xip" - local result="$?" - if [ "$result" == 4 ] || [ "$result" == 6 ]; then - X_FORWARD="--header X-Forwarded-For:$xip" - fi - fi - - if [ -z "$proxy" ]; then - USE_PROXY='' - fi - - if [ -n "$proxy" ]; then - local proxy=$(echo "$proxy" | awk '{$1=$1; print}') - if validate_proxy "$proxy"; then - USE_PROXY="-x $proxy" - fi - fi - - if [ -z "$netType" ]; then - NETWORK_TYPE='' - fi - - if [ -n "$netType" ]; then - local netType=$(echo "$netType" | awk '{$1=$1; print}') - if validate_net_type "$netType"; then - NETWORK_TYPE="$netType" - fi - fi - - if [ -z "$LANGUAGE" ]; then - LANGUAGE='zh' - fi - - if [ -n "$regionid" ]; then - if validate_region_id "$regionid"; then - REGION_ID="$regionid" - fi - fi - - CURL_OPTS="$USE_NIC $USE_PROXY $X_FORWARD ${CURL_SSL_CIPHERS_OPT} --max-time 10 --retry 3 --retry-max-time 20" -} - -delay() { - if [ -z $1 ]; then - exit 1 - fi - local val=$1 - if [ "$USE_USLEEP" == 1 ]; then - usleep $(awk 'BEGIN{print '$val' * 1000000}') - return 0 - fi - sleep $val - return 0 -} - -count_run_times() { - local tmpresult=$(curl ${CURL_OPTS} -s "https://hits.seeyoufarm.com/api/count/incr/badge.svg?url=https%3A%2F%2Fcheck.unclock.media&count_bg=%2379C83D&title_bg=%23555555&icon=&icon_color=%23E7E7E7&title=visit&edge_flat=false") - TODAY_RUN_TIMES=$(echo "$tmpresult" | tail -3 | head -n 1 | awk '{print $5}') - TOTAL_RUN_TIMES=$(($(echo "$tmpresult" | tail -3 | head -n 1 | awk '{print $7}') + 2527395)) -} - -download_extra_data() { - MEDIA_COOKIE=$(curl ${CURL_OPTS} -s "https://raw.githubusercontent.com/lmc999/RegionRestrictionCheck/main/cookies") - IATACODE=$(curl ${CURL_OPTS} -s "https://raw.githubusercontent.com/lmc999/RegionRestrictionCheck/main/reference/IATACode.txt") - IATACODE2=$(curl ${CURL_OPTS} -s "https://raw.githubusercontent.com/lmc999/RegionRestrictionCheck/main/reference/IATACode2.txt") - if [ -z "$MEDIA_COOKIE" ] || [ -z "$IATACODE" ] || [ -z "$IATACODE2" ]; then - echo -e "${Font_Red}Extra data download failed.${Font_Suffix}" - delay 3 - fi -} - -get_ip_info() { - LOCAL_IP_ASTERISK='' - LOCAL_ISP='' - local local_ip=$(curl ${CURL_DEFAULT_OPTS} -s https://api64.ipify.org --user-agent "${UA_BROWSER}") - local get_local_isp=$(curl ${CURL_DEFAULT_OPTS} -s "https://api.ip.sb/geoip/${local_ip}" -H 'accept: */*;q=0.8,application/signed-exchange;v=b3;q=0.7' -H 'accept-language: en-US,en;q=0.9' -H "sec-ch-ua: ${UA_SEC_CH_UA}" -H 'sec-ch-ua-mobile: ?0' -H 'sec-ch-ua-platform: "Windows"' -H 'sec-fetch-dest: document' -H 'sec-fetch-mode: navigate' -H 'sec-fetch-site: none' -H 'sec-fetch-user: ?1' -H 'upgrade-insecure-requests: 1' --user-agent "${UA_BROWSER}") - - if [ -z "$local_ip" ]; then - echo -e "${Font_Red}Failed to Query IP Address.${Font_Suffix}" - fi - if [ -z "$get_local_isp" ]; then - echo -e "${Font_Red}Failed to Query IP Info.${Font_Suffix}" - fi - - validate_ip_address "$local_ip" - local resp="$?" - if [ "$resp" == 4 ]; then - LOCAL_IP_ASTERISK=$(awk -F"." '{print $1"."$2".*.*"}' <<<"${local_ip}") - fi - if [ "$resp" == 6 ]; then - LOCAL_IP_ASTERISK=$(awk -F":" '{print $1":"$2":"$3":*:*"}' <<<"${local_ip}") - fi - - LOCAL_ISP=$(echo "$get_local_isp" | grep 'organization' | cut -f4 -d '"') -} - -show_region() { - echo -e "${Font_Yellow} ---${1}---${Font_Suffix}" -} - -function GameTest_Steam() { - if [ "${USE_IPV6}" == 1 ]; then - echo -n -e "\r Steam Currency:\t\t\t${Font_Red}IPv6 Is Not Currently Supported${Font_Suffix}\n" - return - fi - - local tmpresult=$(curl ${CURL_DEFAULT_OPTS} -sL 'https://store.steampowered.com/app/761830' --user-agent "${UA_BROWSER}") - if [ -z "$tmpresult" ]; then - echo -n -e "\r Steam Currency:\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" - return - fi - - local result=$(echo "$tmpresult" | grep 'priceCurrency' | cut -d '"' -f4) - if [ -z "$result" ]; then - echo -n -e "\r Steam Currency:\t\t\t${Font_Red}Failed (Error: PAGE ERROR)${Font_Suffix}\n" - return - fi - - echo -n -e "\r Steam Currency:\t\t\t${Font_Green}${result}${Font_Suffix}\n" -} - -# 流媒体解锁测试-动画疯 -function MediaUnlockTest_BahamutAnime() { - if [ "${USE_IPV6}" == 1 ]; then - echo -n -e "\r Bahamut Anime:\t\t\t\t${Font_Red}IPv6 Is Not Currently Supported${Font_Suffix}\n" - return - fi - - local tmpresult=$(curl ${CURL_DEFAULT_OPTS} -sL 'https://ani.gamer.com.tw/ajax/getdeviceid.php' --cookie-jar bahamut_cookie.txt --user-agent "${UA_BROWSER}") - if [ -z "$tmpresult" ]; then - echo -n -e "\r Bahamut Anime:\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" - rm -f bahamut_cookie.txt - return - fi - - local tempdeviceid=$(echo "$tmpresult" | grep -woP '"deviceid"\s{0,}:\s{0,}"\K[^"]+') - # I Was Reincarnated as the 7th Prince - local sn='37783' - local tmpresult1=$(curl ${CURL_DEFAULT_OPTS} -sL "https://ani.gamer.com.tw/ajax/token.php?adID=89422&sn=${sn}&device=${tempdeviceid}" -b bahamut_cookie.txt --user-agent "${UA_BROWSER}") - local tmpresult2=$(curl ${CURL_DEFAULT_OPTS} -sL 'https://ani.gamer.com.tw/' -H 'accept: */*;q=0.8,application/signed-exchange;v=b3;q=0.7' -H 'accept-language: zh-CN,zh;q=0.9' -H "sec-ch-ua: ${UA_SEC_CH_UA}" -H 'sec-ch-ua-mobile: ?0' -H 'sec-ch-ua-model: ""' -H 'sec-ch-ua-platform: "Windows"' -H 'sec-ch-ua-platform-version: "15.0.0"' -H 'sec-fetch-dest: document' -H 'sec-fetch-mode: navigate' -H 'sec-fetch-site: none' -H 'sec-fetch-user: ?1' -b bahamut_cookie.txt --user-agent "${UA_BROWSER}") - rm -f bahamut_cookie.txt - if [ -z "$tmpresult1" ] || [ -z "$tmpresult2" ]; then - echo -n -e "\r Bahamut Anime:\t\t\t\t${Font_Red}Failed (Network Connection 1)${Font_Suffix}\n" - return - fi - - local result=$(echo "$tmpresult1" | grep 'animeSn') - - if [ -z "$result" ]; then - echo -n -e "\r Bahamut Anime:\t\t\t\t${Font_Red}No${Font_Suffix}\n" - return - fi - - local region=$(echo "$tmpresult2" | grep -woP 'data-geo="\K[^"]+') - if [ -n "$region" ]; then - echo -n -e "\r Bahamut Anime:\t\t\t\t${Font_Green}Yes (Region: ${region})${Font_Suffix}\n" - return - fi - - echo -n -e "\r Bahamut Anime:\t\t\t\t${Font_Red}Failed (Error: Unknown)${Font_Suffix}\n" -} - -# 流媒体解锁测试-哔哩哔哩大陆限定 -function MediaUnlockTest_BilibiliChinaMainland() { - if [ "${USE_IPV6}" == 1 ]; then - echo -n -e "\r BiliBili China Mainland Only:\t\t${Font_Red}IPv6 Is Not Currently Supported${Font_Suffix}\n" - return - fi - - local randsession=$(gen_uuid | md5sum | head -c 32) - # 尝试获取成功的结果 - local tmpresult=$(curl ${CURL_DEFAULT_OPTS} -fsL "https://api.bilibili.com/pgc/player/web/playurl?avid=82846771&qn=0&type=&otype=json&ep_id=307247&fourk=1&fnver=0&fnval=16&session=${randsession}&module=bangumi" --user-agent "${UA_BROWSER}") - if [ -z "$tmpresult" ]; then - echo -n -e "\r BiliBili China Mainland Only:\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" - return - fi - - local result=$(echo "$tmpresult" | grep -woP '"code"\s{0,}:\s{0,}\K[-\d]+' | head -n 1) - case "$result" in - '0') echo -n -e "\r BiliBili China Mainland Only:\t\t${Font_Green}Yes${Font_Suffix}\n" ;; - '-10403') echo -n -e "\r BiliBili China Mainland Only:\t\t${Font_Red}No${Font_Suffix}\n" ;; - *) echo -n -e "\r BiliBili China Mainland Only:\t\t${Font_Red}Failed (Error: ${result})${Font_Suffix}\n" ;; - esac -} - -# 流媒体解锁测试-哔哩哔哩港澳台限定 -function MediaUnlockTest_BilibiliHKMCTW() { - if [ "${USE_IPV6}" == 1 ]; then - echo -n -e "\r BiliBili Hongkong/Macau/Taiwan:\t${Font_Red}IPv6 Is Not Currently Supported${Font_Suffix}\n" - return - fi - - local randsession=$(gen_uuid | md5sum | head -c 32) - # 尝试获取成功的结果 - local tmpresult=$(curl ${CURL_DEFAULT_OPTS} -fsL "https://api.bilibili.com/pgc/player/web/playurl?avid=18281381&cid=29892777&qn=0&type=&otype=json&ep_id=183799&fourk=1&fnver=0&fnval=16&session=${randsession}&module=bangumi" --user-agent "${UA_BROWSER}") - if [ -z "$tmpresult" ]; then - echo -n -e "\r BiliBili Hongkong/Macau/Taiwan:\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" - return - fi - - local result=$(echo "$tmpresult" | grep -woP '"code"\s{0,}:\s{0,}\K[-\d]+' | head -n 1) - case "$result" in - '0') echo -n -e "\r BiliBili Hongkong/Macau/Taiwan:\t${Font_Green}Yes${Font_Suffix}\n" ;; - '-10403') echo -n -e "\r BiliBili Hongkong/Macau/Taiwan:\t${Font_Red}No${Font_Suffix}\n" ;; - *) echo -n -e "\r BiliBili Hongkong/Macau/Taiwan:\t${Font_Red}Failed (Error: ${result})${Font_Suffix}\n" ;; - esac -} - -# 流媒体解锁测试-哔哩哔哩台湾限定 -function MediaUnlockTest_BilibiliTW() { - if [ "${USE_IPV6}" == 1 ]; then - echo -n -e "\r Bilibili Taiwan Only:\t\t\t${Font_Red}IPv6 Is Not Currently Supported${Font_Suffix}\n" - return - fi - - local randsession=$(gen_uuid | md5sum | head -c 32) - # 尝试获取成功的结果 - local tmpresult=$(curl ${CURL_DEFAULT_OPTS} -fsL "https://api.bilibili.com/pgc/player/web/playurl?avid=50762638&cid=100279344&qn=0&type=&otype=json&ep_id=268176&fourk=1&fnver=0&fnval=16&session=${randsession}&module=bangumi" --user-agent "${UA_BROWSER}") - if [ -z "$tmpresult" ]; then - echo -n -e "\r Bilibili Taiwan Only:\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" - return - fi - - local result=$(echo "$tmpresult" | grep -woP '"code"\s{0,}:\s{0,}\K[-\d]+' | head -n 1) - case "$result" in - '0') echo -n -e "\r Bilibili Taiwan Only:\t\t\t${Font_Green}Yes${Font_Suffix}\n" ;; - '-10403') echo -n -e "\r Bilibili Taiwan Only:\t\t\t${Font_Red}No${Font_Suffix}\n" ;; - *) echo -n -e "\r Bilibili Taiwan Only:\t\t\t${Font_Red}Failed (Error: ${result})${Font_Suffix}\n" ;; - esac -} - -function MediaUnlockTest_AbemaTV() { - if [ "${USE_IPV6}" == 1 ]; then - echo -n -e "\r Abema.TV:\t\t\t\t${Font_Red}IPv6 Is Not Currently Supported${Font_Suffix}\n" - return - fi - - local tmpresult=$(curl ${CURL_DEFAULT_OPTS} -sL 'https://api.abema.io/v1/ip/check?device=android' --user-agent "${UA_ANDROID}") - if [ -z "$tmpresult" ]; then - echo -n -e "\r Abema.TV:\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" - return - fi - - local region=$(echo "$tmpresult" | grep -woP '"isoCountryCode"\s{0,}:\s{0,}"\K[^"]+') - if [ -z "$region" ]; then - echo -n -e "\r Abema.TV:\t\t\t\t${Font_Red}No${Font_Suffix}\n" - return - fi - if [ "$region" == 'JP' ]; then - echo -n -e "\r Abema.TV:\t\t\t\t${Font_Green}Yes (Region: ${region})${Font_Suffix}\n" - else - echo -n -e "\r Abema.TV:\t\t\t\t${Font_Yellow}Oversea Only (Region: ${region})${Font_Suffix}\n" - fi -} - -function GameTest_PCRJP() { - if [ "${USE_IPV6}" == 1 ]; then - echo -n -e "\r Princess Connect Re:Dive Japan:\t${Font_Red}IPv6 Is Not Currently Supported${Font_Suffix}\n" - return - fi - - local result=$(curl ${CURL_DEFAULT_OPTS} -fsL 'https://api-priconne-redive.cygames.jp/' -w %{http_code} -o /dev/null --user-agent "${UA_ANDROID}") - - case "$result" in - '000') echo -n -e "\r Princess Connect Re:Dive Japan:\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" ;; - '404') echo -n -e "\r Princess Connect Re:Dive Japan:\t${Font_Green}Yes${Font_Suffix}\n" ;; - '403') echo -n -e "\r Princess Connect Re:Dive Japan:\t${Font_Red}No${Font_Suffix}\n" ;; - *) echo -n -e "\r Princess Connect Re:Dive Japan:\t${Font_Red}Failed (Error: ${result})${Font_Suffix}\n" ;; - esac -} - -function GameTest_UMAJP() { - local result=$(curl ${CURL_DEFAULT_OPTS} -fsL 'https://api-umamusume.cygames.jp/' -w %{http_code} -o /dev/null --user-agent "${UA_ANDROID}") - - case "$result" in - '000') echo -n -e "\r Pretty Derby Japan:\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" ;; - '404') echo -n -e "\r Pretty Derby Japan:\t\t\t${Font_Green}Yes${Font_Suffix}\n" ;; - '403') echo -n -e "\r Pretty Derby Japan:\t\t\t${Font_Red}No${Font_Suffix}\n" ;; - *) echo -n -e "\r Pretty Derby Japan:\t\t\t${Font_Red}Failed (Error: ${result})${Font_Suffix}\n" ;; - esac -} - -function GameTest_Kancolle() { - if [ "${USE_IPV6}" == 1 ]; then - echo -n -e "\r Kancolle Japan:\t\t\t${Font_Red}IPv6 Is Not Currently Supported${Font_Suffix}\n" - return - fi - - local result=$(curl ${CURL_DEFAULT_OPTS} -fsL 'http://203.104.209.7/kcscontents/twitter/maintenance_info.html' -w %{http_code} -o /dev/null --user-agent "${UA_ANDROID}") - # curl 'http://203.104.209.7/kcscontents/twitter/maintenance_info.html' \ - # -H 'Accept: */*;q=0.8,application/signed-exchange;v=b3;q=0.7' \ - # -H 'Accept-Language: en-US,en;q=0.9' \ - # -H 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36' \ - # --insecure - - case "$result" in - '000') echo -n -e "\r Kancolle Japan:\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" ;; - '200') echo -n -e "\r Kancolle Japan:\t\t\t${Font_Green}Yes${Font_Suffix}\n" ;; - '403') echo -n -e "\r Kancolle Japan:\t\t\t${Font_Red}No${Font_Suffix}\n" ;; - *) echo -n -e "\r Kancolle Japan:\t\t\t${Font_Red}Failed (Error: ${result})${Font_Suffix}\n" ;; - esac -} - -function MediaUnlockTest_Lemino() { - local result=$(curl ${CURL_DEFAULT_OPTS} -fsL 'https://if.lemino.docomo.ne.jp/v1/user/delivery/watch/ready' -w %{http_code} -o /dev/null -H 'accept: application/json, text/plain, */*' -H 'accept-language: en-US,en;q=0.9' -H 'content-type: application/json' -H 'origin: https://lemino.docomo.ne.jp' -H 'referer: https://lemino.docomo.ne.jp/' -H "sec-ch-ua: ${UA_SEC_CH_UA}" -H 'sec-ch-ua-mobile: ?0' -H 'sec-ch-ua-platform: "Windows"' -H 'sec-fetch-dest: empty' -H 'sec-fetch-mode: cors' -H 'sec-fetch-site: same-site' -H 'x-service-token: f365771afd91452fa279863f240c233d' -H 'x-trace-id: 556db33f-d739-4a82-84df-dd509a8aa179' --data-raw '{"inflow_flows":[null,"crid://plala.iptvf.jp/group/b100ce3"],"play_type":1,"key_download_only":null,"quality":null,"groupcast":null,"avail_status":"1","terminal_type":3,"test_account":0,"content_list":[{"kind":"main","service_id":null,"cid":"00lm78dz30","lid":"a0lsa6kum1","crid":"crid://plala.iptvf.jp/vod/0000000000_00lm78dymn","preview":0,"trailer":0,"auto_play":0,"stop_position":0}]}' --user-agent "${UA_BROWSER}") - - case "$result" in - '000') echo -n -e "\r Lemino:\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" ;; - '200') echo -n -e "\r Lemino:\t\t\t\t${Font_Green}Yes${Font_Suffix}\n" ;; - '403') echo -n -e "\r Lemino:\t\t\t\t${Font_Red}No${Font_Suffix}\n" ;; - *) echo -n -e "\r Lemino:\t\t\t\t${Font_Red}Failed (Error: ${result})${Font_Suffix}\n" ;; - esac -} - -MediaUnlockTest_AnimeFesta() { - local result=$(curl ${CURL_DEFAULT_OPTS} -fsL 'https://api-animefesta.iowl.jp/v1/titles/1560' -w %{http_code} -o /dev/null -H 'accept: application/json' -H 'accept-language: en-US,en;q=0.9' -H 'anime-user-tracking-id: yEZr4P_U7JEdBucZOkv1Y' -H 'authorization;' -H 'origin: https://animefesta.iowl.jp' -H 'referer: https://animefesta.iowl.jp/' -H "sec-ch-ua: ${UA_SEC_CH_UA}" -H 'sec-ch-ua-mobile: ?0' -H 'sec-ch-ua-platform: "Windows"' -H 'sec-fetch-dest: empty' -H 'sec-fetch-mode: cors' -H 'sec-fetch-site: same-site' -H 'sec-gpc: 1' -H 'x-requested-with: XMLHttpRequest' --user-agent "${UA_BROWSER}") - - case "$result" in - '000') echo -n -e "\r AnimeFesta:\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" ;; - '200') echo -n -e "\r AnimeFesta:\t\t\t\t${Font_Green}Yes${Font_Suffix}\n" ;; - '403') echo -n -e "\r AnimeFesta:\t\t\t\t${Font_Red}No${Font_Suffix}\n" ;; - *) echo -n -e "\r AnimeFesta:\t\t\t\t${Font_Red}Failed (Error: ${result})${Font_Suffix}\n" ;; - esac -} - -function MediaUnlockTest_mora() { - if [ "${USE_IPV6}" == 1 ]; then - echo -n -e "\r Mora:\t\t\t\t\t${Font_Red}IPv6 Is Not Currently Supported${Font_Suffix}\n" - return - fi - - local result=$(curl ${CURL_DEFAULT_OPTS} -fsL 'https://mora.jp/buy?__requestToken=1713764407153&returnUrl=https%3A%2F%2Fmora.jp%2Fpackage%2F43000087%2FTFDS01006B00Z%2F%3Ffmid%3DTOPRNKS%26trackMaterialNo%3D31168909&fromMoraUx=false&deleteMaterial=' -w %{http_code} -o /dev/null -H 'host: mora.jp' --user-agent "${UA_BROWSER}") - - case "$result" in - '000') echo -n -e "\r Mora:\t\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" ;; - '200') echo -n -e "\r Mora:\t\t\t\t\t${Font_Green}Yes${Font_Suffix}\n" ;; - '403') echo -n -e "\r Mora:\t\t\t\t\t${Font_Red}No${Font_Suffix}\n" ;; - '500') echo -n -e "\r Mora:\t\t\t\t\t${Font_Red}No${Font_Suffix}\n" ;; - *) echo -n -e "\r Mora:\t\t\t\t\t${Font_Red}Failed (Error: ${result})${Font_Suffix}\n" ;; - esac -} - -function MediaUnlockTest_BBCiPLAYER() { - if [ "${USE_IPV6}" == 1 ]; then - echo -n -e "\r BBC iPLAYER:\t\t\t\t${Font_Red}IPv6 Is Not Currently Supported${Font_Suffix}\n" - return - fi - - local tmpresult=$(curl ${CURL_DEFAULT_OPTS} -sL 'https://open.live.bbc.co.uk/mediaselector/6/select/version/2.0/mediaset/pc/vpid/bbc_one_london/format/json/jsfunc/JS_callbacks0' --user-agent "${UA_BROWSER}") - if [ -z "$tmpresult" ]; then - echo -n -e "\r BBC iPLAYER:\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" - return - fi - - local isBlocked=$(echo "$tmpresult" | grep -i 'geolocation') - local isOK=$(echo "$tmpresult" | grep -i 'vs-hls-push-uk') - - if [ -z "$isBlocked" ] && [ -z "$isOK" ]; then - echo -n -e "\r BBC iPLAYER:\t\t\t\t${Font_Red}Failed (Error: PAGE ERROR)${Font_Suffix}\n" - return - fi - if [ -n "$isBlocked" ]; then - echo -n -e "\r BBC iPLAYER:\t\t\t\t${Font_Red}No${Font_Suffix}\n" - return - fi - if [ -n "$isOK" ]; then - echo -n -e "\r BBC iPLAYER:\t\t\t\t${Font_Green}Yes${Font_Suffix}\n" - return - fi - - echo -n -e "\r BBC iPLAYER:\t\t\t\t${Font_Red}Failed (Error: Unknown)${Font_Suffix}\n" -} - -function MediaUnlockTest_Netflix() { - # LEGO Ninjago - local result1=$(curl ${CURL_DEFAULT_OPTS} -fsL 'https://www.netflix.com/title/81280792' -w %{http_code} -o /dev/null -H 'host: www.netflix.com' -H 'accept-language: en-US,en;q=0.9' -H "sec-ch-ua: ${UA_SEC_CH_UA}" -H 'sec-ch-ua-mobile: ?0' -H 'sec-ch-ua-platform: "Windows"' -H 'sec-fetch-site: none' -H 'sec-fetch-mode: navigate' -H 'sec-fetch-user: ?1' -H 'sec-fetch-dest: document' --user-agent "${UA_BROWSER}") - # Breaking bad - local result2=$(curl ${CURL_DEFAULT_OPTS} -fsL 'https://www.netflix.com/title/70143836' -w %{http_code} -o /dev/null -H 'host: www.netflix.com' -H 'accept-language: en-US,en;q=0.9' -H "sec-ch-ua: ${UA_SEC_CH_UA}" -H 'sec-ch-ua-mobile: ?0' -H 'sec-ch-ua-platform: "Windows"' -H 'sec-fetch-site: none' -H 'sec-fetch-mode: navigate' -H 'sec-fetch-user: ?1' -H 'sec-fetch-dest: document' --user-agent "${UA_BROWSER}") - - if [ "${result1}" == '000' ] || [ "$result2" == '000' ]; then - echo -n -e "\r Netflix:\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" - return - fi - if [ "$result1" == '404' ] && [ "$result2" == '404' ]; then - echo -n -e "\r Netflix:\t\t\t\t${Font_Yellow}Originals Only${Font_Suffix}\n" - return - fi - if [ "$result1" == '403' ] || [ "$result2" == '403' ]; then - echo -n -e "\r Netflix:\t\t\t\t${Font_Red}No${Font_Suffix}\n" - return - fi - if [ "$result1" == '200' ] || [ "$result2" == '200' ]; then - local tmpresult=$(curl ${CURL_DEFAULT_OPTS} -sL 'https://www.netflix.com/' -H 'accept-language: en-US,en;q=0.9' -H "sec-ch-ua: ${UA_SEC_CH_UA}" -H 'sec-ch-ua-mobile: ?0' -H 'sec-ch-ua-platform: "Windows"' -H 'sec-fetch-site: none' -H 'sec-fetch-mode: navigate' -H 'sec-fetch-user: ?1' -H 'sec-fetch-dest: document' --user-agent "${UA_BROWSER}") - local region=$(echo "$tmpresult" | grep -oP '"id":"\K[^"]+' | grep -E '^[A-Z]{2}$' | head -n 1) - echo -n -e "\r Netflix:\t\t\t\t${Font_Green}Yes (Region: ${region})${Font_Suffix}\n" - return - fi - - echo -n -e "\r Netflix:\t\t\t\t\t${Font_Red}Failed (Error: ${result1}_${result2})${Font_Suffix}\n" -} - -function MediaUnlockTest_DisneyPlus() { - if [ "${USE_IPV6}" == 1 ]; then - echo -n -e "\r Disney+:\t\t\t\t${Font_Red}IPv6 Is Not Currently Supported${Font_Suffix}\n" - return - fi - - local tempresult=$(curl ${CURL_DEFAULT_OPTS} -s 'https://disney.api.edge.bamgrid.com/devices' -X POST -H "authorization: Bearer ZGlzbmV5JmJyb3dzZXImMS4wLjA.Cu56AgSfBTDag5NiRA81oLHkDZfu5L3CKadnefEAY84" -H "content-type: application/json; charset=UTF-8" -d '{"deviceFamily":"browser","applicationRuntime":"chrome","deviceProfile":"windows","attributes":{}}' --user-agent "${UA_BROWSER}") - if [ -z "$tempresult" ]; then - echo -n -e "\r Disney+:\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" - return - fi - - local is403=$(echo "$tempresult" | grep -i '403 ERROR') - if [ -n "$is403" ]; then - echo -n -e "\r Disney+:\t\t\t\t${Font_Red}No (IP Banned By Disney+)${Font_Suffix}\n" - return - fi - - local assertion=$(echo "$tempresult" | grep -woP '"assertion"\s{0,}:\s{0,}"\K[^"]+') - if [ -z "$assertion" ]; then - echo -n -e "\r Disney+:\t\t\t\t${Font_Red}Failed (Error: PAGE ERROR)${Font_Suffix}\n" - return - fi - - local preDisneyCookie=$(echo "$MEDIA_COOKIE" | sed -n '1p') - local disneyCookie=$(echo "$preDisneyCookie" | sed "s/DISNEYASSERTION/${assertion}/g") - local tokenContent=$(curl ${CURL_DEFAULT_OPTS} -s 'https://disney.api.edge.bamgrid.com/token' -X POST -H "authorization: Bearer ZGlzbmV5JmJyb3dzZXImMS4wLjA.Cu56AgSfBTDag5NiRA81oLHkDZfu5L3CKadnefEAY84" -d "${disneyCookie}" --user-agent "${UA_BROWSER}") - - local isBlocked=$(echo "$tokenContent" | grep -i 'forbidden-location') - local is403=$(echo "$tokenContent" | grep -i '403 ERROR') - - if [ -n "$isBlocked" ] || [ -n "$is403" ]; then - echo -n -e "\r Disney+:\t\t\t\t${Font_Red}No (IP Banned By Disney+ 1)${Font_Suffix}\n" - return - fi - - local fakeContent=$(echo "$MEDIA_COOKIE" | sed -n '8p') - local refreshToken=$(echo "$tokenContent" | grep -woP '"refresh_token"\s{0,}:\s{0,}"\K[^"]+') - local disneyContent=$(echo "$fakeContent" | sed "s/ILOVEDISNEY/${refreshToken}/g") - local tmpresult=$(curl ${CURL_DEFAULT_OPTS} -sL 'https://disney.api.edge.bamgrid.com/graph/v1/device/graphql' -X POST -H "authorization: ZGlzbmV5JmJyb3dzZXImMS4wLjA.Cu56AgSfBTDag5NiRA81oLHkDZfu5L3CKadnefEAY84" -d "${disneyContent}" --user-agent "${UA_BROWSER}") - - local previewcheck=$(curl ${CURL_DEFAULT_OPTS} -sL 'https://disneyplus.com' -w '%{url_effective}\n' -o /dev/null --user-agent "${UA_BROWSER}") - local isUnavailable=$(echo "$previewcheck" | grep -E 'preview|unavailable') - local region=$(echo "$tmpresult" | grep -woP '"countryCode"\s{0,}:\s{0,}"\K[^"]+') - local inSupportedLocation=$(echo "$tmpresult" | grep -woP '"inSupportedLocation"\s{0,}:\s{0,}\K(false|true)') - - if [ -z "$region" ]; then - echo -n -e "\r Disney+:\t\t\t\t${Font_Red}No${Font_Suffix}\n" - return - fi - if [ "$region" == 'JP' ]; then - echo -n -e "\r Disney+:\t\t\t\t${Font_Green}Yes (Region: JP)${Font_Suffix}\n" - return - fi - if [ -n "$isUnavailable" ]; then - echo -n -e "\r Disney+:\t\t\t\t${Font_Red}No${Font_Suffix}\n" - return - fi - if [ "$inSupportedLocation" == 'false' ]; then - echo -n -e "\r Disney+:\t\t\t\t${Font_Yellow}Available For [Disney+ ${region}] Soon${Font_Suffix}\n" - return - fi - if [ "$inSupportedLocation" == 'true' ]; then - echo -n -e "\r Disney+:\t\t\t\t${Font_Green}Yes (Region: ${region})${Font_Suffix}\n" - return - fi - - echo -n -e "\r Disney+:\t\t\t\t${Font_Red}Failed (Error: ${inSupportedLocation}_${region})${Font_Suffix}\n" -} - -function MediaUnlockTest_Dazn() { - if [ "${USE_IPV6}" == 1 ]; then - echo -n -e "\r Dazn:\t\t\t\t\t${Font_Red}IPv6 Is Not Currently Supported${Font_Suffix}\n" - return - fi - - local tmpresult=$(curl ${CURL_DEFAULT_OPTS} -s 'https://startup.core.indazn.com/misl/v5/Startup' -X POST -H "Content-Type: application/json" -d '{"LandingPageKey":"generic","languages":"en-US,en","Platform":"web","PlatformAttributes":{},"Manufacturer":"","PromoCode":"","Version":"2"}' --user-agent "${UA_BROWSER}") - if [ -z "$tmpresult" ]; then - echo -n -e "\r Dazn:\t\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" - return - fi - - local result=$(echo "$tmpresult" | grep -woP '"isAllowed"\s{0,}:\s{0,}\K(false|true)') - local region=$(echo "$tmpresult" | grep -woP '"GeolocatedCountry"\s{0,}:\s{0,}"\K[^"]+' | tr a-z A-Z) - case "$result" in - 'false') echo -n -e "\r Dazn:\t\t\t\t\t${Font_Red}No${Font_Suffix}\n" ;; - 'true') echo -n -e "\r Dazn:\t\t\t\t\t${Font_Green}Yes (Region: ${region})${Font_Suffix}\n" ;; - *) echo -n -e "\r Dazn:\t\t\t\t\t${Font_Red}Failed (Error: ${result})${Font_Suffix}\n" ;; - esac -} - -function MediaUnlockTest_HuluJP() { - if [ "${USE_IPV6}" == 1 ]; then - echo -n -e "\r Hulu Japan:\t\t\t\t${Font_Red}IPv6 Is Not Currently Supported${Font_Suffix}\n" - return - fi - - local tmpresult=$(curl ${CURL_DEFAULT_OPTS} -fsL 'https://id.hulu.jp/' -w '%{http_code}_TAG_%{url_effective}\n' -o /dev/null -H 'Accept: */*;q=0.8' -H 'Accept-Language: en-US,en;q=0.5' -H 'Accept-Encoding: none' -H 'Sec-GPC: 1' -H 'Upgrade-Insecure-Requests: 1' -H 'Sec-Fetch-Dest: document' -H 'Sec-Fetch-Mode: navigate' -H 'Sec-Fetch-Site: none' -H 'Sec-Fetch-User: ?1' -H 'Priority: u=1' --user-agent "${UA_BROWSER}") - - local httpCode=$(echo "$tmpresult" | awk -F'_TAG_' '{print $1}') - if [ "$httpCode" == '000' ]; then - echo -n -e "\r Hulu Japan:\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" - return - fi - - local urlEffective=$(echo "$tmpresult" | awk -F'_TAG_' '{print $2}') - local isBlocked=$(echo "$urlEffective" | grep 'restrict') - - if [ -n "$isBlocked" ]; then - echo -n -e "\r Hulu Japan:\t\t\t\t${Font_Red}No${Font_Suffix}\n" - return - fi - if [ "$httpCode" == '200' ]; then - echo -n -e "\r Hulu Japan:\t\t\t\t${Font_Green}Yes${Font_Suffix}\n" - return - fi - if [ "$httpCode" == '403' ]; then - echo -n -e "\r Hulu Japan:\t\t\t\t${Font_Red}No${Font_Suffix}\n" - return - fi - - echo -n -e "\r Hulu Japan:\t\t\t\t${Font_Red}Failed (Error: ${httpCode})${Font_Suffix}\n" -} - -function MediaUnlockTest_MyTVSuper() { - if [ "${USE_IPV6}" == 1 ]; then - echo -n -e "\r MyTVSuper:\t\t\t\t${Font_Red}IPv6 Is Not Currently Supported${Font_Suffix}\n" - return - fi - - local tmpresult=$(curl ${CURL_DEFAULT_OPTS} -s 'https://www.mytvsuper.com/api/auth/getSession/self/' --user-agent "${UA_BROWSER}") - if [ -z "$tmpresult" ]; then - echo -n -e "\r MyTVSuper:\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" - return - fi - - local result=$(echo "$tmpresult" | grep -woP '"country_code"\s{0,}:\s{0,}"\K[^"]+') - if [ "$result" == 'HK' ]; then - echo -n -e "\r MyTVSuper:\t\t\t\t${Font_Green}Yes${Font_Suffix}\n" - return - else - echo -n -e "\r MyTVSuper:\t\t\t\t${Font_Red}No${Font_Suffix}\n" - return - fi - - echo -n -e "\r MyTVSuper:\t\t\t\t${Font_Red}Failed (Error: ${result})${Font_Suffix}\n" -} - -function MediaUnlockTest_NowE() { - if [ "${USE_IPV6}" == 1 ]; then - echo -n -e "\r Now E:\t\t\t\t\t${Font_Red}IPv6 Is Not Currently Supported${Font_Suffix}\n" - return - fi - - local tmpresult=$(curl ${CURL_DEFAULT_OPTS} -s 'https://webtvapi.nowe.com/16/1/getVodURL' \ - -H 'accept: application/json, text/javascript, */*; q=0.01' \ - -H 'accept-language: zh-CN,zh;q=0.9,en-GB;q=0.8,en;q=0.7,en-US;q=0.6' \ - -H 'content-type: text/plain' \ - -H 'origin: https://www.nowe.com' \ - -H 'priority: u=1, i' \ - -H 'referer: https://www.nowe.com/' \ - -H 'sec-fetch-dest: empty' \ - -H 'sec-fetch-mode: cors' \ - -H 'sec-fetch-site: same-site' \ - -H 'user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36 Edg/131.0.0.0' \ - --data-raw '{"contentId":"202310181863841","contentType":"Vod","pin":"","deviceName":"Browser","deviceId":"w-678913af-3998-3998-3998-39983998","deviceType":"WEB","secureCookie":null,"callerReferenceNo":"W17370372345461425","profileId":null,"mupId":null,"trackId":"738296446.226.1737037103860.2","sessionId":"c39f03e6-9e74-4d24-a82f-e0d0f328bb70"}') - - if [ -z "$tmpresult" ]; then - echo -n -e "\r Now E:\t\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" - return - fi - - local result=$(echo "$tmpresult" | grep -woP '"OTTAPI_ResponseCode"\s{0,}:\s{0,}"\K[^"]+') - case "$result" in - 'GEO_CHECK_FAIL') echo -n -e "\r Now E:\t\t\t\t\t${Font_Red}No${Font_Suffix}\n" ;; - 'SUCCESS') echo -n -e "\r Now E:\t\t\t\t\t${Font_Green}Yes${Font_Suffix}\n" ;; - *) echo -n -e "\r Now E:\t\t\t\t\t${Font_Red}Failed (Error: ${result})${Font_Suffix}\n" ;; - esac -} - -function MediaUnlockTest_ViuTV() { - if [ "${USE_IPV6}" == 1 ]; then - echo -n -e "\r Viu.TV:\t\t\t\t${Font_Red}IPv6 Is Not Currently Supported${Font_Suffix}\n" - return - fi - - local tmpresult=$(curl ${CURL_DEFAULT_OPTS} -s 'https://api.viu.now.com/p8/3/getLiveURL' -X POST -H "Content-Type: application/json" -d '{"callerReferenceNo":"20210726112323","contentId":"099","contentType":"Channel","channelno":"099","mode":"prod","deviceId":"29b3cb117a635d5b56","deviceType":"ANDROID_WEB"}' --user-agent "${UA_BROWSER}") - if [ -z "$tmpresult" ]; then - echo -n -e "\r Viu.TV:\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" - return - fi - - local result=$(echo "$tmpresult" | grep -woP '"responseCode"\s{0,}:\s{0,}"\K[^"]+') - case "$result" in - 'GEO_CHECK_FAIL') echo -n -e "\r Viu.TV:\t\t\t\t${Font_Red}No${Font_Suffix}\n" ;; - 'SUCCESS') echo -n -e "\r Viu.TV:\t\t\t\t${Font_Green}Yes${Font_Suffix}\n" ;; - *) echo -n -e "\r Viu.TV:\t\t\t\t${Font_Red}Failed (Error: ${result})${Font_Suffix}\n" ;; - esac -} - -function MediaUnlockTest_unext() { - local tmpresult=$(curl ${CURL_DEFAULT_OPTS} -s 'https://cc.unext.jp' -H 'content-type: application/json' --data-raw '{"operationName":"cosmo_getPlaylistUrl","variables":{"code":"ED00479780","playMode":"caption","bitrateLow":192,"bitrateHigh":null,"validationOnly":false},"query":"query cosmo_getPlaylistUrl($code: String, $playMode: String, $bitrateLow: Int, $bitrateHigh: Int, $validationOnly: Boolean) {\n webfront_playlistUrl(\n code: $code\n playMode: $playMode\n bitrateLow: $bitrateLow\n bitrateHigh: $bitrateHigh\n validationOnly: $validationOnly\n ) {\n subTitle\n playToken\n playTokenHash\n beaconSpan\n result {\n errorCode\n errorMessage\n __typename\n }\n resultStatus\n licenseExpireDate\n urlInfo {\n code\n startPoint\n resumePoint\n endPoint\n endrollStartPosition\n holderId\n saleTypeCode\n sceneSearchList {\n IMS_AD1\n IMS_L\n IMS_M\n IMS_S\n __typename\n }\n movieProfile {\n cdnId\n type\n playlistUrl\n movieAudioList {\n audioType\n __typename\n }\n licenseUrlList {\n type\n licenseUrl\n __typename\n }\n __typename\n }\n umcContentId\n movieSecurityLevelCode\n captionFlg\n dubFlg\n commodityCode\n movieAudioList {\n audioType\n __typename\n }\n __typename\n }\n __typename\n }\n}\n"}' --user-agent "${UA_BROWSER}") - if [ -z "$tmpresult" ]; then - echo -n -e "\r U-NEXT:\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" - return - fi - - local result=$(echo "$tmpresult" | grep -woP '"resultStatus"\s{0,}:\s{0,}\K\d+') - case "$result" in - '475') echo -n -e "\r U-NEXT:\t\t\t\t${Font_Green}Yes${Font_Suffix}\n" ;; - '200') echo -n -e "\r U-NEXT:\t\t\t\t${Font_Green}Yes${Font_Suffix}\n" ;; - '467') echo -n -e "\r U-NEXT:\t\t\t\t${Font_Red}No${Font_Suffix}\n" ;; - *) echo -n -e "\r U-NEXT:\t\t\t\t${Font_Red}Failed (Error: ${result})${Font_Suffix}\n" ;; - esac -} - -function MediaUnlockTest_wowow() { - if [ "${USE_IPV6}" == 1 ]; then - echo -n -e "\r WOWOW:\t\t\t\t\t${Font_Red}IPv6 Is Not Currently Supported${Font_Suffix}\n" - return - fi - - local timestamp=$[$(date +%s%N)/1000000] - # 取原创剧集列表 - local tmpresult=$(curl ${CURL_DEFAULT_OPTS} -s "https://www.wowow.co.jp/drama/original/json/lineup.json?_=${timestamp}" -H 'Accept: application/json, text/javascript, */*; q=0.01' -H 'Referer: https://www.wowow.co.jp/drama/original/' -H 'Sec-Fetch-Dest: empty' -H 'Sec-Fetch-Mode: cors' -H 'Sec-Fetch-Site: same-origin' -H 'X-Requested-With: XMLHttpRequest' -H 'accept-language: en-US,en;q=0.9' -H "sec-ch-ua: ${UA_SEC_CH_UA}" -H 'sec-ch-ua-mobile: ?0' -H 'sec-ch-ua-platform: "Windows"' --user-agent "${UA_BROWSER}") - if [ -z "$tmpresult" ]; then - echo -n -e "\r WOWOW:\t\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" - return - fi - # 取无料剧集来播放 example: https://www.wowow.co.jp/drama/original/hakubo/ - local playUrlList=$(echo "$tmpresult" | grep -woP '"link"\s{0,}:\s{0,}"\K[^"]+' | grep 'drama/original' | head -n 4 | xargs) - if [ -z "$playUrlList" ]; then - echo -n -e "\r WOWOW:\t\t\t\t\t${Font_Red}Failed (Error: PAGE ERROR)${Font_Suffix}\n" - return - fi - - for playUrl in $playUrlList ; do - # 访问并获取真实链接 - local tmpresult2=$(curl ${CURL_DEFAULT_OPTS} -s "${playUrl}" --user-agent "${UA_BROWSER}") - if [ -z "$tmpresult2" ]; then - echo -n -e "\r WOWOW:\t\t\t\t\t${Font_Red}Failed (Network Connection 1)${Font_Suffix}\n" - return - fi - - # 取得真实链接 - local wodUrl=$(echo "$tmpresult2" | grep -o '"https://wod.wowow.co.jp/content/.*"' | cut -f2 -d'"' | head -n 1) - if [ -n "$wodUrl" ]; then - break - fi - done - - if [ -z "$wodUrl" ]; then - echo -n -e "\r WOWOW:\t\t\t\t\t${Font_Red}Failed (Error: PAGE ERROR 1)${Font_Suffix}\n" - return - fi - - # 访问并获取 meta_id - local tmpresult3=$(curl ${CURL_DEFAULT_OPTS} -s "$wodUrl" -H 'accept: */*;q=0.8,application/signed-exchange;v=b3;q=0.7' -H 'accept-language: en-US,en;q=0.9' -H "sec-ch-ua: ${UA_SEC_CH_UA}" -H 'sec-ch-ua-mobile: ?0' -H 'sec-ch-ua-platform: "Windows"' -H 'sec-fetch-dest: document' -H 'sec-fetch-mode: navigate' -H 'sec-fetch-site: none' -H 'sec-fetch-user: ?1' -H 'upgrade-insecure-requests: 1' --user-agent "${UA_BROWSER}") - - if [ -z "$tmpresult3" ]; then - echo -n -e "\r WOWOW:\t\t\t\t\t${Font_Red}Failed (Network Connection 2)${Font_Suffix}\n" - return - fi - - local metaId=$(echo "$tmpresult3" | grep -woP '"https://wod.wowow.co.jp/watch/\K\d{0,}[^"]+') - # Fake Vistor UID - local vUid=$(echo -n "$timestamp" | md5sum | cut -f1 -d' ') - # 最终测试 - local tmpresult4=$(curl ${CURL_DEFAULT_OPTS} -s 'https://mapi.wowow.co.jp/api/v1/playback/auth' -H 'accept: application/json, text/plain, */*' -H 'content-type: application/json;charset=UTF-8' -H 'origin: https://wod.wowow.co.jp' -H 'referer: https://wod.wowow.co.jp/' -H 'accept-language: en-US,en;q=0.9' -H "sec-ch-ua: ${UA_SEC_CH_UA}" -H 'sec-ch-ua-mobile: ?0' -H 'sec-ch-ua-platform: "Windows"' -H 'sec-fetch-dest: empty' -H 'sec-fetch-mode: cors' -H 'sec-fetch-site: same-site' -H 'x-requested-with: XMLHttpRequest' --data-raw "{\"meta_id\":${metaId},\"vuid\":\"${vUid}\",\"device_code\":1,\"app_id\":1,\"ua\":\"${UA_BROWSER}\"}" --user-agent "${UA_BROWSER}") - if [ -z "$tmpresult4" ]; then - echo -n -e "\r WOWOW:\t\t\t\t\t${Font_Red}Failed (Network Connection 3)${Font_Suffix}\n" - return - fi - local isBlocked=$(echo "$tmpresult4" | grep -i 'VPN') - local isOK=$(echo "$tmpresult4" | grep -i 'playback_session_id') - - if [ -z "$isBlocked" ] && [ -z "$isOK" ]; then - echo -n -e "\r WOWOW:\t\t\t\t\t${Font_Red}Failed (Error: PAGE ERROR 2)${Font_Suffix}\n" - return - fi - - if [ -n "$isBlocked" ]; then - echo -n -e "\r WOWOW:\t\t\t\t\t${Font_Red}No${Font_Suffix}\n" - return - fi - if [ -n "$isOK" ]; then - echo -n -e "\r WOWOW:\t\t\t\t\t${Font_Green}Yes${Font_Suffix}\n" - return - fi - - echo -n -e "\r WOWOW:\t\t\t\t\t${Font_Red}Failed (Error: Unknown)${Font_Suffix}\n" -} - -function MediaUnlockTest_TVer() { - if [ "${USE_IPV6}" == 1 ]; then - echo -n -e "\r TVer:\t\t\t\t\t${Font_Red}IPv6 Is Not Currently Supported${Font_Suffix}\n" - return - fi - - local tmpresult=$(curl ${CURL_DEFAULT_OPTS} -s 'https://platform-api.tver.jp/v2/api/platform_users/browser/create' -H 'content-type: application/x-www-form-urlencoded' -H 'origin: https://s.tver.jp' -H 'referer: https://s.tver.jp/' -H 'accept-language: en-US,en;q=0.9' -H "sec-ch-ua: ${UA_SEC_CH_UA}" -H 'sec-ch-ua-mobile: ?0' -H 'sec-ch-ua-platform: "Windows"' -H 'sec-fetch-dest: empty' -H 'sec-fetch-mode: cors' -H 'sec-fetch-site: same-site' --data-raw 'device_type=pc' --user-agent "${UA_BROWSER}") - if [ -z "$tmpresult" ]; then - echo -n -e "\r TVer:\t\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" - return - fi - # 先取 UID 和 TOKEN - local platformUid=$(echo "$tmpresult" | grep -woP '"platform_uid"\s{0,}:\s{0,}"\K[^"]+') - local platformToken=$(echo "$tmpresult" | grep -woP '"platform_token"\s{0,}:\s{0,}"\K[^"]+') - # 根据 UID 和 TOKEN 取得当前正在播放的剧集 - local tmpresult2=$(curl ${CURL_DEFAULT_OPTS} -s "https://platform-api.tver.jp/service/api/v1/callHome?platform_uid=${platformUid}&platform_token=${platformToken}&require_data=mylist%2Cresume%2Clater" -H 'origin: https://tver.jp' -H 'referer: https://tver.jp/' -H 'accept-language: en-US,en;q=0.9' -H "sec-ch-ua: ${UA_SEC_CH_UA}" -H 'sec-ch-ua-mobile: ?0' -H 'sec-ch-ua-platform: "Windows"' -H 'sec-fetch-dest: empty' -H 'sec-fetch-mode: cors' -H 'sec-fetch-site: same-site' -H 'x-tver-platform-type: web' --user-agent "${UA_BROWSER}") - if [ -z "$tmpresult2" ]; then - echo -n -e "\r TVer:\t\t\t\t\t${Font_Red}Failed (Network Connection 1)${Font_Suffix}\n" - return - fi - # 返回结果取新电视剧第一个值 - # echo "$tmpresult2" | jq -r '.result.components.[] | select(.componentID | contains("newer-drama")) | limit(1; .contents.[].content.id)' - local episodeId=$(echo "$tmpresult2" | sed -E 's/.*"variety.catchup.recomend([.]{0,})"//' | sed 's/"componentID".*//' | sed 's/"id"/_TAG_/;s/.*_TAG_//' | cut -f2 -d'"' | grep -E '[a-z0-9]{10}') - if [ -z "$episodeId" ]; then - echo -n -e "\r TVer:\t\t\t\t\t${Font_Red}Failed (Error: PAGE ERROR)${Font_Suffix}\n" - return - fi - - # 取得该剧集信息 - local tmpresult3=$(curl ${CURL_DEFAULT_OPTS} -s "https://statics.tver.jp/content/episode/${episodeId}.json" -H 'origin: https://tver.jp' -H 'referer: https://tver.jp/' -H 'accept-language: en-US,en;q=0.9' -H "sec-ch-ua: ${UA_SEC_CH_UA}" -H 'sec-ch-ua-mobile: ?0' -H 'sec-ch-ua-platform: "Windows"' -H 'sec-fetch-dest: empty' -H 'sec-fetch-mode: cors' -H 'sec-fetch-site: same-site' --user-agent "${UA_BROWSER}") - if [ -z "$tmpresult3" ]; then - echo -n -e "\r TVer:\t\t\t\t\t${Font_Red}Failed (Network Connection 2)${Font_Suffix}\n" - return - fi - # 取 accountID / playerID / videoID / videoRefID - local accountID=$(echo "$tmpresult3" | grep -woP '"accountID"\s{0,}:\s{0,}"\K[^"]+') - local playerID=$(echo "$tmpresult3" | grep -woP '"playerID"\s{0,}:\s{0,}"\K[^"]+') - local videoID=$(echo "$tmpresult3" | grep -woP '"videoID"\s{0,}:\s{0,}"\K[^"]+') - local videoRefID=$(echo "$tmpresult3" | grep -woP '"videoRefID"\s{0,}:\s{0,}"\K[^"]+' | head -n 1) - # 取得 brightcove 播放器信息 - local tmpresult4=$(curl ${CURL_DEFAULT_OPTS} -s "https://players.brightcove.net/${accountID}/${playerID}_default/index.min.js" -H 'Referer: https://tver.jp/' -H 'Sec-Fetch-Dest: script' -H 'Sec-Fetch-Mode: no-cors' -H 'Sec-Fetch-Site: cross-site' -H 'accept-language: en-US,en;q=0.9' -H "sec-ch-ua: ${UA_SEC_CH_UA}" -H 'sec-ch-ua-mobile: ?0' -H 'sec-ch-ua-platform: "Windows"' --user-agent "${UA_BROWSER}") - if [ -z "$tmpresult4" ]; then - echo -n -e "\r TVer:\t\t\t\t\t${Font_Red}Failed (Network Connection 3)${Font_Suffix}\n" - return - fi - # 取 policy_key - local policyKey=$(echo "$tmpresult4" | sed 's/.*policyKey:"//' | awk -F'"' '{print $1}') - - if [ -z "${videoRefID}" ]; then - # 取 deliveryConfigId - local deliveryConfigId=$(echo "$tmpresult4" | sed 's/.*deliveryConfigId:"//' | awk -F'"' '{print $1}') - # 最终检查 - local tmpresult5=$(curl ${CURL_DEFAULT_OPTS} -s "https://edge.api.brightcove.com/playback/v1/accounts/${accountID}/videos/${videoID}?config_id=${deliveryConfigId}" -H "accept: application/json;pk=${policyKey}" -H 'origin: https://tver.jp' -H 'referer: https://tver.jp/' -H 'accept-language: en-US,en;q=0.9' -H "sec-ch-ua: ${UA_SEC_CH_UA}" -H 'sec-ch-ua-mobile: ?0' -H 'sec-ch-ua-platform: "Windows"' -H 'sec-fetch-dest: empty' -H 'sec-fetch-mode: cors' -H 'sec-fetch-site: cross-site' --user-agent "${UA_BROWSER}") - else - # 最终检查 - local tmpresult5=$(curl ${CURL_DEFAULT_OPTS} -s "https://edge.api.brightcove.com/playback/v1/accounts/${accountID}/videos/ref%3A${videoRefID}" -H "accept: application/json;pk=${policyKey}" -H 'origin: https://tver.jp' -H 'referer: https://tver.jp/' -H 'accept-language: en-US,en;q=0.9' -H "sec-ch-ua: ${UA_SEC_CH_UA}" -H 'sec-ch-ua-mobile: ?0' -H 'sec-ch-ua-platform: "Windows"' -H 'sec-fetch-dest: empty' -H 'sec-fetch-mode: cors' -H 'sec-fetch-site: cross-site' --user-agent "${UA_BROWSER}") - fi - - if [ -z "$tmpresult5" ]; then - echo -n -e "\r TVer:\t\t\t\t\t${Font_Red}Failed (Network Connection 4)${Font_Suffix}\n" - return - fi - local result=$(echo "$tmpresult5" | grep -woP '"error_subcode"\s{0,}:\s{0,}"\K[^"]+') - case "$result" in - 'CLIENT_GEO') echo -n -e "\r TVer:\t\t\t\t\t${Font_Red}No${Font_Suffix}\n" ;; - '') echo -n -e "\r TVer:\t\t\t\t\t${Font_Green}Yes${Font_Suffix}\n" ;; - *) echo -n -e "\r TVer:\t\t\t\t\t${Font_Red}Failed (Error: ${result})${Font_Suffix}\n" ;; - esac -} - -function MediaUnlockTest_HamiVideo() { - if [ "${USE_IPV6}" == 1 ]; then - echo -n -e "\r Hami Video:\t\t\t\t${Font_Red}IPv6 Is Not Currently Supported${Font_Suffix}\n" - return - fi - - local tmpresult=$(curl ${CURL_DEFAULT_OPTS} -s 'https://hamivideo.hinet.net/api/play.do?id=OTT_VOD_0000249064&freeProduct=1' --user-agent "${UA_BROWSER}") - if [ -z "$tmpresult" ]; then - echo -n -e "\r Hami Video:\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" - return - fi - - local result=$(echo "$tmpresult" | grep -woP '"code"\s{0,}:\s{0,}"\K[^"]+') - case "$result" in - '06001-106') echo -n -e "\r Hami Video:\t\t\t\t${Font_Red}No${Font_Suffix}\n" ;; - '06001-107') echo -n -e "\r Hami Video:\t\t\t\t${Font_Green}Yes${Font_Suffix}\n" ;; - *) echo -n -e "\r Hami Video:\t\t\t\t${Font_Red}Failed (Error: ${result})${Font_Suffix}\n" ;; - esac -} - -function MediaUnlockTest_4GTV() { - if [ "${USE_IPV6}" == 1 ]; then - echo -n -e "\r 4GTV.TV:\t\t\t\t${Font_Red}IPv6 Is Not Currently Supported${Font_Suffix}\n" - return - fi - - local tmpresult=$(curl ${CURL_DEFAULT_OPTS} --tlsv1.3 -s 'https://api2.4gtv.tv/Web/IsTaiwanArea' -H 'origin: https://www.4gtv.tv' -H 'referer: https://www.4gtv.tv/' -H 'accept-language: en-US,en;q=0.9' -H "sec-ch-ua: ${UA_SEC_CH_UA}" -H 'sec-ch-ua-mobile: ?0' -H 'sec-ch-ua-platform: "Windows"' -H 'sec-fetch-dest: empty' -H 'sec-fetch-mode: cors' -H 'sec-fetch-site: same-site' --user-agent "${UA_BROWSER}") - if [ -z "$tmpresult" ]; then - echo -n -e "\r 4GTV.TV:\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" - return - fi - - result=$(echo "$tmpresult" | grep -woP '"Data"\s{0,}:\s{0,}"\K[^"]+') - case "$result" in - 'N') echo -n -e "\r 4GTV.TV:\t\t\t\t${Font_Red}No${Font_Suffix}\n" ;; - 'Y') echo -n -e "\r 4GTV.TV:\t\t\t\t${Font_Green}Yes${Font_Suffix}\n" ;; - *) echo -n -e "\r 4GTV.TV:\t\t\t\t${Font_Red}Failed (Error: ${result})${Font_Suffix}\n" ;; - esac -} - -function MediaUnlockTest_SlingTV() { - local tmpresult=$(curl ${CURL_DEFAULT_OPTS} -fsL 'https://www.sling.com/' -w '%{http_code}_TAG_%{url_effective}\n' -o /dev/null --user-agent "${UA_BROWSER}") - - local httpCode=$(echo "$tmpresult" | awk -F'_TAG_' '{print $1}') - if [ "$httpCode" == '000' ]; then - echo -n -e "\r Sling TV:\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" - return - fi - - local urlEffective=$(echo "$tmpresult" | awk -F'_TAG_' '{print $2}') - local isBlocked=$(echo "$urlEffective" | grep -i 'geo-block') - - if [ -n "$isBlocked" ]; then - echo -n -e "\r Sling TV:\t\t\t\t${Font_Red}No${Font_Suffix}\n" - return - fi - if [ "$httpCode" == '200' ]; then - echo -n -e "\r Sling TV:\t\t\t\t${Font_Green}Yes${Font_Suffix}\n" - return - fi - - echo -n -e "\r Sling TV:\t\t\t\t${Font_Red}Failed (Error: ${httpCode})${Font_Suffix}\n" -} - -function MediaUnlockTest_PlutoTV() { - if [ "${USE_IPV6}" == 1 ]; then - echo -n -e "\r Pluto TV:\t\t\t\t${Font_Red}IPv6 Is Not Currently Supported${Font_Suffix}\n" - return - fi - - local tmpresult=$(curl ${CURL_DEFAULT_OPTS} -fsL 'https://pluto.tv/' -w '%{http_code}_TAG_%{url_effective}\n' -o /dev/null --user-agent "${UA_BROWSER}") - - local httpCode=$(echo "$tmpresult" | awk -F'_TAG_' '{print $1}') - if [ "$httpCode" == '000' ]; then - echo -n -e "\r Pluto TV:\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" - return - fi - - local urlEffective=$(echo "$tmpresult" | awk -F'_TAG_' '{print $2}') - local isBlocked=$(echo "$urlEffective" | grep 'plutotv-is-not-available') - - if [ -n "$isBlocked" ]; then - echo -n -e "\r Pluto TV:\t\t\t\t${Font_Red}No${Font_Suffix}\n" - return - fi - if [ "$httpCode" == '200' ]; then - echo -n -e "\r Pluto TV:\t\t\t\t${Font_Green}Yes${Font_Suffix}\n" - return - fi - - echo -n -e "\r Pluto TV:\t\t\t\t${Font_Red}Failed (Error: ${httpCode})${Font_Suffix}\n" -} - -function MediaUnlockTest_HBOMax() { - local tmpresult=$(curl ${CURL_DEFAULT_OPTS} -sLi 'https://www.max.com/' -w "_TAG_%{http_code}_TAG_" --user-agent "${UA_BROWSER}") - local httpCode=$(echo "$tmpresult" | grep '_TAG_' | awk -F'_TAG_' '{print $2}') - if [ "$httpCode" == '000' ]; then - echo -n -e "\r HBO Max:\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" - return - fi - - local countryList=$(echo "$tmpresult" | grep -woP '"url":"/[a-z]{2}/[a-z]{2}"' | cut -f4 -d'"' | cut -f2 -d'/' | sort -n | uniq | xargs | tr a-z A-Z) - local countryList="${countryList} US" - local region=$(echo "$tmpresult" | grep -woP 'countryCode=\K[A-Z]{2}' | head -n 1) - local isUnavailable=$(echo "$countryList" | grep "$region") - - if [ -z "$region" ]; then - echo -n -e "\r HBO Max:\t\t\t\t${Font_Red}Failed (Error: Country Code Not Found)${Font_Suffix}\n" - return - fi - if [ -n "$isUnavailable" ]; then - echo -n -e "\r HBO Max:\t\t\t\t${Font_Green}Yes (Region: ${region})${Font_Suffix}\n" - return - fi - - echo -n -e "\r HBO Max:\t\t\t\t${Font_Red}No${Font_Suffix}\n" -} - -function MediaUnlockTest_Showmax() { - local region=$(curl ${CURL_DEFAULT_OPTS} -si 'https://www.showmax.com/' -H 'host: www.showmax.com' -H 'connection: keep-alive' -H 'sec-ch-ua: "Chromium";v="124", "Microsoft Edge";v="124", "Not-A.Brand";v="99"' -H 'sec-ch-ua-mobile: ?0' -H 'sec-ch-ua-platform: "Windows"' -H 'upgrade-insecure-requests: 1' -H 'user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36 Edg/124.0.0.0' -H 'accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7' -H 'sec-fetch-site: none' -H 'sec-fetch-mode: navigate' -H 'sec-fetch-user: ?1' -H 'sec-fetch-dest: document' -H 'accept-language: zh-CN,zh;q=0.9' 2>&1 | grep 'activeTerritory'| awk -F'[=;]' '{print $2}') - if [[ "$region" == "curl"* ]]; then - echo -n -e "\r Showmax:\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" - return - fi - if [ -n "$region" ]; then - echo -n -e "\r Showmax:\t\t\t\t${Font_Green}Yes (Region: $region)${Font_Suffix}\n" - return - elif [ -z "$region" ]; then - echo -n -e "\r Showmax:\t\t\t\t${Font_Red}No${Font_Suffix}\n" - return - else - echo -n -e "\r Showmax:\t\t\t\t${Font_Red}No${Font_Suffix}\n" - return - fi -} - -function MediaUnlockTest_Channel4() { - if [ "${USE_IPV6}" == 1 ]; then - echo -n -e "\r Channel 4:\t\t\t\t${Font_Red}IPv6 Is Not Currently Supported${Font_Suffix}\n" - return - fi - - local result=$(curl ${CURL_DEFAULT_OPTS} -fsL 'https://www.channel4.com/simulcast/channels/C4' -w %{http_code} -o /dev/null --user-agent "${UA_BROWSER}") - - case "$result" in - '000') echo -n -e "\r Channel 4:\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" ;; - '403') echo -n -e "\r Channel 4:\t\t\t\t${Font_Red}No${Font_Suffix}\n" ;; - '200') echo -n -e "\r Channel 4:\t\t\t\t${Font_Green}Yes${Font_Suffix}\n" ;; - *) echo -n -e "\r Channel 4:\t\t\t\t${Font_Red}Failed (Error: ${result})${Font_Suffix}\n" ;; - esac -} - -function MediaUnlockTest_ITVHUB() { - if [ "${USE_IPV6}" == 1 ]; then - echo -n -e "\r ITV Hub:\t\t\t\t${Font_Red}IPv6 Is Not Currently Supported${Font_Suffix}\n" - return - fi - - local tmpresult=$(curl ${CURL_DEFAULT_OPTS} -sL 'https://magni.itv.com/playlist/itvonline/ITV/10_4782_0001.001' -H 'Accept: application/vnd.itv.vod.playlist.v2+json' -H 'Accept-Language: en-US,en;q=0.9' -H 'Content-Type: application/json' -H 'Origin: https://www.itv.com' -H 'Referer: https://www.itv.com/' -H 'Sec-Fetch-Dest: empty' -H 'Sec-Fetch-Mode: cors' -H 'Sec-Fetch-Site: same-site' -H "sec-ch-ua: ${UA_SEC_CH_UA}" -H 'sec-ch-ua-mobile: ?0' -H 'sec-ch-ua-platform: "Windows"' --data-raw '{"user":{"entitlements":[]},"device":{"manufacturer":"Chrome","model":"125.0.0.0","os":{"name":"Windows","version":"10","type":"desktop"}},"client":{"version":"4.1","id":"browser","supportsAdPods":true,"service":"itv.x","appversion":"2.237.0"},"variantAvailability":{"player":"dash","featureset":{"min":["mpeg-dash","widevine","outband-webvtt","hd","single-track"],"max":["mpeg-dash","widevine","outband-webvtt","hd","single-track"]},"platformTag":"dotcom"}}' --user-agent "${UA_BROWSER}") - if [ -z "$tmpresult" ]; then - echo -n -e "\r ITV Hub:\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" - return - fi - - local isBlocked=$(echo "$tmpresult" | grep -i 'Outside Of Allowed Geographic') - local isOK=$(echo "$tmpresult" | grep -i 'Playlist') - - if [ -z "$isBlocked" ] && [ -z "$isOK" ]; then - echo -n -e "\r ITV Hub:\t\t\t\t${Font_Red}Failed (Error: PAGE ERROR)${Font_Suffix}\n" - return - fi - if [ -n "$isBlocked" ]; then - echo -n -e "\r ITV Hub:\t\t\t\t${Font_Red}No${Font_Suffix}\n" - return - fi - if [ -n "$isOK" ]; then - echo -n -e "\r ITV Hub:\t\t\t\t${Font_Green}Yes${Font_Suffix}\n" - return - fi - - echo -n -e "\r ITV Hub:\t\t\t\t${Font_Red}Failed (Error: Unknown)${Font_Suffix}\n" -} - -function MediaUnlockTest_DSTV() { - if [ "${USE_IPV6}" == 1 ]; then - echo -n -e "\r DSTV:\t\t\t\t\t${Font_Red}IPv6 Is Not Currently Supported${Font_Suffix}\n" - return - fi - - local result=$(curl ${CURL_DEFAULT_OPTS} -fsL --tlsv1.3 'https://authentication.dstv.com/favicon.ico' -w %{http_code} -o /dev/null --user-agent "${UA_BROWSER}") - - case "$result" in - '000') echo -n -e "\r DSTV:\t\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" ;; - '403'|'451') echo -n -e "\r DSTV:\t\t\t\t\t${Font_Red}No${Font_Suffix}\n" ;; - '404') echo -n -e "\r DSTV:\t\t\t\t\t${Font_Green}Yes${Font_Suffix}\n" ;; - *) echo -n -e "\r DSTV:\t\t\t\t\t${Font_Red}Failed (Error: ${result})${Font_Suffix}\n" ;; - esac -} - -function RegionTest_iQYI() { - if [ "${USE_IPV6}" == 1 ]; then - echo -n -e "\r iQyi Oversea Region:\t\t\t${Font_Red}IPv6 Is Not Currently Supported${Font_Suffix}\n" - return - fi - - local tmpresult=$(curl ${CURL_DEFAULT_OPTS} -sL 'https://www.iq.com/' -w "_TAG_%{http_code}_TAG_" -o /dev/null --user-agent "${UA_BROWSER}" -D -) - - local httpCode=$(echo "$tmpresult" | grep '_TAG_' | awk -F'_TAG_' '{print $2}') - if [ "$httpCode" == '000' ]; then - echo -n -e "\r iQyi Oversea Region:\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" - return - fi - - local region=$(echo "$tmpresult" | grep -woP 'mod=\K[a-z]+' | tr a-z A-Z) - if [ -z "$region" ]; then - echo -n -e "\r iQyi Oversea Region:\t\t\t${Font_Red}Failed (Error: Country Code Not Found)${Font_Suffix}\n" - return - fi - - if [ "$region" == 'NTW' ]; then - region='TW' - fi - - echo -n -e "\r iQyi Oversea Region:\t\t\t${Font_Green}${region}${Font_Suffix}\n" -} - -function MediaUnlockTest_HuluUS() { - local tmpresult=$(curl ${CURL_DEFAULT_OPTS} -s 'https://auth.hulu.com/v4/web/password/authenticate' -H 'Accept: application/json' -H 'accept-language: en-US,en;q=0.9' -H 'Content-Type: application/x-www-form-urlencoded; charset=utf-8' -H 'Cookie: _hulu_at=eyJhbGciOiJSUzI1NiJ9.eyJhc3NpZ25tZW50cyI6ImV5SjJNU0k2VzExOSIsInJlZnJlc2hfaW50ZXJ2YWwiOjg2NDAwMDAwLCJ0b2tlbl9pZCI6IjQyZDk0YzA5LWYyZTEtNDdmNC1iYzU4LWUwNTA2NGNhYTdhZCIsImFub255bW91c19pZCI6IjYzNDUzMjA2LWFmYzgtNDU4Yi1iODBkLWNiMzk2MmYzZGQyZCIsImlzc3VlZF9hdCI6MTcwNjYwOTUzODc5MiwidHRsIjozMTUzNjAwMDAwMCwiZGV2aWNlX3VwcGVyIjoxfQ.e7sRCOndgn1j30XYkenLcLSQ7vwc2PXk-gFHMIF2gu_3UNEJ3pp3xNOZMN0n7DQRw5Jv68WiGxIvf65s8AetOoD4NLt4sZUDDz9HCRmFHzpmAJdtXWZ-HZ4fYucENuqDDDrsdQ-FCc0mgIe2IXkmQJ6tpIN3Zgcgmpmbeoq6jYyLlqg6f8eMsI1bNAsBGGj-9DXw2PMotlYHWB22pw2NRfJw1TjWXwywRBodAOve7rsu2Vhx-A2-OH4GplRvxLqzCpl2pcjkYg9atmUB7jnNIf_jHqlek4oRRawahWq-2vWnWmb1eMQcH-v2IHs3YdVk7I-t4iS19auPQrdgo6jPaA; _hulu_assignments=eyJ2MSI6W119; bm_mi=8896E057E2FC39F20852615A0C46A2B4~YAAQZB0gFyQrnlSNAQAAU/naWRaCMaJFIPi3L8KYSiCL3AN7XHCPw0gKvdIl0XZ/VE3QiKEr31qjm9sPulHbdQ4XXIXPXZ53DpIK43fLybrT6WxIpmGz3iThk6+xefI2dPLzwBAdoTrsbAbHC2q4LDx0SBM+n21LvTD7UnT2+DyVBK75YCDJJKHlJ5jzB3Q81JIlmqfTzibjgVmPIxXrFdTs5Ll8mtp6WzE3VDISmjGjTRTrSOVYM0YGpyhye1nsm3zBCO13vDjKMCJ/6oAsVqBfgfW07e7sWkWeUiDYLUifRDymc4GaMhavenBvCma/G1qW~1; bm_sv=FEE04D9D797D0237C312D77F57DABBFD~YAAQZB0gFyUrnlSNAQAAU/naWRaMNI8KmoGX9XNJkm9x9VeeGzGQyPfu49M9MnLObz8D4ZYk9Td+3Y8Z/Jfx+kl2qOPXmtOC5GZpA++9bxUKV0SwaoGhivl+ibIJSQTc7lw4kzdM/2w8b3rwItRaHXFa+shMtD3eiKvBePrqCiezucqrcss1U4ojLKEOvcsKJGt6ZTGGs2H+Qu6cyns9BVN0BprMHRY3njHXyxbFIcGy8Lq7aPn6nuZ0ehfZ9Q==~1; ak_bmsc=55F791116713DDB91AB0978225853B77~000000000000000000000000000000~YAAQZB0gF6ErnlSNAQAAHALbWRaA625r4bWVW8g2gHV797RN8bfCwNy6KfnGEucUPiPt4QKjJUldR6lyaM7sarag6A7WLqxEFr/zAFlPQI12Uxsqdzg3IgU0R8g2eMQRnRoGMNSUPyt4rdCWWwGjEcM+dQ8TI+y1vKw9dLXoBJAHofaWe/dZhY4fx2mYKhKFibvdpwJT6UPe4rBz8igd9oTQBn69Ebi6/9YFykqGuKsllxa5+QZWczb0+HLLDRKV4CkZdhbFj0yljEOyz4GHqqP8qg3Xa3lCKzdzsrmPn6zdFbgzCE8HsyPjsmy+/rRfFxagH5rYudLqFXg5o5dXFFJPTiLXtZ/S30ckc/OUWk4JP2ywAQVm/zbp8nlRVMFDEdjIPh/F+5QXfYBV+yL4a85ThlBEXSr54/QWXiHxBRiOwhv2ydoZDfT78r9bUHbMOra37C0xutfo37fbYEw9LWlLdZCub9U5HA/zSeIN3KxrZr0yNKfJjOau7BqdHL+AuvDj134ZPZPVig==; _customer_type=anonymous; s_fid=66C80912997F4CF8-2D3140F8EDC76274; s_cc=true; _rdt_uuid=1706609517486.d5b309e4-2b0b-440f-9817-cf619e4ce15d; _gcl_au=1.1.602757068.1706609518; _scid=cc980fef-26dc-479a-b9a8-b0e531c87cd3; _scid_r=cc980fef-26dc-479a-b9a8-b0e531c87cd3; _tt_enable_cookie=1; _ttp=1h5M9exzlSz7wAFDR78KCHCsnDC; utag_main=v_id:018d59da9a5c00215e601dada5700507d001c07500bd0$_sn:1$_ss:0$_st:1706611329541$ses_id:1706609515101%3Bexp-session$_pn:1%3Bexp-session$_prevpage:%2Fwelcome%3Bexp-1706613129564$trial_duration:undefined%3Bexp-session$program_id:undefined%3Bexp-session$vapi_domain:hulu.com$g_sync_ran:1%3Bexp-session$dc_visit:1$dc_event:1%3Bexp-session$dc_region:ap-east-1%3Bexp-session; _hulu_metrics_context_v1_=%7B%22cookie_session_guid%22%3A%227dc4f3a6826f2c35125268f5ddab1849%22%2C%22referrer_url%22%3A%22%22%2C%22curr_page_uri%22%3A%22www.hulu.com%2Fwelcome%22%2C%22primary_ref_page_uri%22%3Anull%2C%22secondary_ref_page_uri%22%3Anull%2C%22curr_page_type%22%3A%22landing%22%2C%22primary_ref_page_type%22%3Anull%2C%22secondary_ref_page_type%22%3Anull%2C%22secondary_ref_click%22%3A%22%22%2C%22primary_ref_click%22%3A%22%22%7D; metrics_tracker_session_manager=%7B%22session_id%22%3A%22B26515EB8A7952D4D35F374465362A72-529671c4-c8c2-4c7c-8bff-cc201bcd4075%22%2C%22creation_time%22%3A1706609513429%2C%22visit_count%22%3A1%2C%22session_seq%22%3A4%2C%22idle_time%22%3A1706609529579%7D; guid=B26515EB8A7952D4D35F374465362A72; JSESSIONID=ED7031784C3B1843BFC9AACBB156C6BA; s_sq=wdghuluwebprod%3D%2526c.%2526a.%2526activitymap.%2526page%253Dwelcome%2526link%253DLOG%252520IN%2526region%253Dlogin-modal%2526pageIDType%253D1%2526.activitymap%2526.a%2526.c%2526pid%253Dwelcome%2526pidt%253D1%2526oid%253Dfunctionsn%252528%252529%25257B%25257D%2526oidt%253D2%2526ot%253DBUTTON; XSRF-TOKEN=bcfa1766-1f73-442d-a71b-e1cf6c275f45; _h_csrf_id=2a52618e9d006ac2e0b3e65740aa55e2584359553466051c3b01a2f1fb91726a' -H 'Origin: https://www.hulu.com' -H 'Referer: https://www.hulu.com/welcome' -H 'Sec-Fetch-Dest: empty' -H 'Sec-Fetch-Mode: cors' -H 'Sec-Fetch-Site: same-site' -H "sec-ch-ua: ${UA_SEC_CH_UA}" -H 'sec-ch-ua-mobile: ?0' -H 'sec-ch-ua-platform: "Windows"' --data-raw 'user_email=me%40jamchoi.cc&password=Jam0.5cm~&recaptcha_type=web_invisible&rrventerprise=03AFcWeA6UFet_b_82RUmGfFWJCWuqy6kIn854Rhqjwd7vrkjH6Vku1wBZy8-FBA3Efx1p2cuNnKeJRuk7yJWm-xZgFfUx0Wdj2OAhiGvIdWrcpfeuQSXEqaXH4FKdmAHVZ3EqHwe5-h_zgtcyIxq-Nn1-sjeUfx1Y7QyVkb_GWJcr0GLoKgTFLzbF4kmJ8Qsi4IFx9hyYo9TFbBqtYdgxCI2q9DnEzOHrxK-987PEY8qzsR08Hrb9oDvumqLp1gs4uEVTwDKWt37aNB3CMVBKL2lHj7n768kXpgkXFDIhcM2eiJJ-H22qxKzNUpg-Q_N1xzkYsavCJG3ckQgsCTRRP2NU3nIERTWDTVXRBEq52-_ZQWu_Ds4W4UZyP0hEhCD2gambN4YJqEzaeHdGPwOR943nFbG6GILBx4vY-UUc7zjMf2HRjkNPvPpQiHMIYo21JXq6l8-IWyTeHY26NU6M4vCCbzwZEsdSln48rXM_fdBcDHC-8AxUFuBR8j3DMsB6Q3xMS2EHeGVrmhDY1izDNJZsVC_cN0W2tRneOJmni7ZU1iAYoBAGBBM5FDTE4UbYUTnuUn-htm9Q0RzukpYTumF_WwQ3HnEL0JK1Q1xea-hteI8lB4oAkhVOBOHVPii9atdZR9ZLpxRh1pdy3Lwmr1ltsubxE05wqmrmt33P2WsvH_3nBJXC_FhTD06BxT60RuiGtFr2gscHjjl_NCa1F-Dv9Hgi5ek2nLHK37a84bRSoKwLL3Lnpi9byuBntlpf-UXj7nveawKZmZTUBOSc7j6Vmmf124DTPJXsFeofMfUXkqTauPTWJBOz0OdKnLKDHMSsk7oSJVKsDUEeq0iKMdtCMBPvQBaPYAb79LDRwv_ereqyklKcUKQxeZRZmEXLKIWp8BS4U9uTXA2w8hwZWe7goLnUBQATIwojeHKpypSLnzQBu9JCwMU4aXfKIplL8sXuAx3QFD52eGZSCEyuFXP3ACN53QOlTAjjlP2eDT9fEwWHT4o8eJfviyjvm8xDmzKtq4F3u5XB3tL86-dK40XYbGcTI0Irw1nz1UTcxplFgHQgb6i8WEAqb69CQkpGWAUlmnknBirRAv2adqPaW2d_lv6L3Eo-ZupWcZ9Cu4PibM5BruVNXifBwPNPXHKw-sWBj-UP1g9VtxHVEVwoTXrbB-lT8EvjDEDQKrvOwnri4_tzVzn6YKvQMELbxSegvmc2w7xypT2qFzKRFXqwTMLT9d0rf2p9tbwbe39REMR8oI7wPfbjyJjK2XF4DmEAyVvBMuJlBaBsKBs5VynITHFWs4xvkAOe4jO_fzkKXzB6F6DB03ldasxbrNK_cepUOF6FD39-pHvbAGcoTrDrx6FSfecYXwSvc3GxM3IHSKwISKWav2iqPMtIt6ClCgUPgTCBDng2ZptXeVG8FckGIGMEdVlgGt5DG2tdMO2p8Hs5tKXuu8anc_csaaSfLIQ1_kav0dp8vpSXhCxeg899o5coXderUoIBcUsfaBJJm80YnCAc4LaM8HmYtJBcKqCC_uwCckPDOuC0SQy3d07LEi6wyifvY0Kv_-ER6wXvhNWnDZIXJNlH2369X7y8o3y2HMisOwAhfmKN7_ZAaODEOO-5x9JHocAYnt4a8_focwU9JQ_hUQgtdzYpP1ACEqxVjJb0A0NlABpm-CG8V9n9y6XpZkGQiMYJIH3jr6VilHSEM9rQSEv6LN8NFigl3-5Y4Ri7W4joz3LUMQcjFj3qXd3AXonarXhwglVNB9BYquCdA5eq4wVUeAkm3R-e56TK5IZwpb5wNJDO3PhuXHSMwv1k-NEAIfI9_w&scenario=web_password_login&csrf=c2c20e89ce4e314771dcda79994b2cd020b9c30fc25faccdc1ebef3351a5b36b' --user-agent "${UA_BROWSER}") - if [ -z "$tmpresult" ]; then - echo -n -e "\r Hulu:\t\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" - return - fi - - local result=$(echo "$tmpresult" | grep -woP '"name"\s{0,}:\s{0,}"\K[^"]+') - case "$result" in - 'LOGIN_FORBIDDEN') echo -n -e "\r Hulu:\t\t\t\t\t${Font_Green}Yes${Font_Suffix}\n" ;; - 'GEO_BLOCKED') echo -n -e "\r Hulu:\t\t\t\t\t${Font_Red}No${Font_Suffix}\n" ;; - '' ) echo -n -e "\r Hulu:\t\t\t\t\t${Font_Red}Failed (Error: PAGE ERROR)${Font_Suffix}\n" ;; - *) echo -n -e "\r Hulu:\t\t\t\t\t${Font_Red}Failed (Error: ${result})${Font_Suffix}\n" ;; - esac -} - -function MediaUnlockTest_encoreTVB() { - if [ "${USE_IPV6}" == 1 ]; then - echo -n -e "\r encoreTVB:\t\t\t\t${Font_Red}IPv6 Is Not Currently Supported${Font_Suffix}\n" - return - fi - - local tmpresult=$(curl ${CURL_DEFAULT_OPTS} -s 'https://edge.api.brightcove.com/playback/v1/accounts/5324042807001/videos/6005570109001' -H "Accept: application/json;pk=BCpkADawqM2Gpjj8SlY2mj4FgJJMfUpxTNtHWXOItY1PvamzxGstJbsgc-zFOHkCVcKeeOhPUd9MNHEGJoVy1By1Hrlh9rOXArC5M5MTcChJGU6maC8qhQ4Y8W-QYtvi8Nq34bUb9IOvoKBLeNF4D9Avskfe9rtMoEjj6ImXu_i4oIhYS0dx7x1AgHvtAaZFFhq3LBGtR-ZcsSqxNzVg-4PRUI9zcytQkk_YJXndNSfhVdmYmnxkgx1XXisGv1FG5GOmEK4jZ_Ih0riX5icFnHrgniADr4bA2G7TYh4OeGBrYLyFN_BDOvq3nFGrXVWrTLhaYyjxOr4rZqJPKK2ybmMsq466Ke1ZtE-wNQ" -H "Origin: https://www.encoretvb.com" -H 'accept-language: en-US,en;q=0.9' --user-agent "${UA_BROWSER}") - if [ -z "$tmpresult" ]; then - echo -n -e "\r encoreTVB:\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" - return - fi - - local result=$(echo "$tmpresult" | grep -woP '"error_subcode"\s{0,}:\s{0,}"\K[^"]+') - case "$result" in - 'CLIENT_GEO') echo -n -e "\r encoreTVB:\t\t\t\t${Font_Red}No${Font_Suffix}\n" ;; - '') echo -n -e "\r encoreTVB:\t\t\t\t${Font_Green}Yes${Font_Suffix}\n" ;; - *) echo -n -e "\r encoreTVB:\t\t\t\t${Font_Red}Failed (Error: ${result})${Font_Suffix}\n" ;; - esac -} - -function MediaUnlockTest_Molotov() { - local tmpresult=$(curl ${CURL_DEFAULT_OPTS} -s 'https://fapi.molotov.tv/v1/open-europe/is-france' --user-agent "${UA_BROWSER}") - if [ -z "$tmpresult" ]; then - echo -n -e "\r Molotov:\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" - return - fi - - local result=$(echo "$tmpresult" | grep -woP '"is_france"\s{0,}:\s{0,}\K(false|true)') - - case "$result" in - 'false') echo -n -e "\r Molotov:\t\t\t\t${Font_Red}No${Font_Suffix}\n" ;; - 'true') echo -n -e "\r Molotov:\t\t\t\t${Font_Green}Yes${Font_Suffix}\n" ;; - '') echo -n -e "\r Molotov:\t\t\t\t${Font_Red}Failed (Error: PAGE ERROR)${Font_Suffix}\n" ;; - *) echo -n -e "\r Molotov:\t\t\t\t${Font_Red}Failed (Error: ${result})${Font_Suffix}\n" ;; - esac -} - -function MediaUnlockTest_LineTVTW() { - if [ "${USE_IPV6}" == 1 ]; then - echo -n -e "\r LineTV.TW:\t\t\t\t${Font_Red}IPv6 Is Not Currently Supported${Font_Suffix}\n" - return - fi - - local tmpresult=$(curl ${CURL_DEFAULT_OPTS} -s 'https://www.linetv.tw/' --user-agent "${UA_BROWSER}") - if [ -z "$tmpresult" ]; then - echo -n -e "\r LineTV.TW:\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" - return - fi - # 找 main js 的链接 - local mainJsUrl=$(echo "$tmpresult" | grep -woP 'src="\K[^"]+' | grep -E '/main-[a-z0-9]{8}') - # 下载 main js - local tmpresult2=$(curl ${CURL_DEFAULT_OPTS} -s "${mainJsUrl}" -H 'referer: https://www.linetv.tw/' --user-agent "${UA_BROWSER}") - if [ -z "$tmpresult2" ]; then - echo -n -e "\r LineTV.TW:\t\t\t\t${Font_Red}Failed (Network Connection 1)${Font_Suffix}\n" - return - fi - # 从 main js 里找 appId - local appId=$(echo "$tmpresult2" | grep -woP 'appId:"\K[^"]+' | head -n 1) - # 正式测试 - local tmpresult3=$(curl ${CURL_DEFAULT_OPTS} -s "https://www.linetv.tw/api/part/11829/eps/1/part?appId=${appId}&productType=FAST&version=10.38.0" --user-agent "${UA_BROWSER}") - if [ -z "$tmpresult3" ]; then - echo -n -e "\r LineTV.TW:\t\t\t\t${Font_Red}Failed (Network Connection 2)${Font_Suffix}\n" - return - fi - - local result=$(echo "$tmpresult3" | grep -woP '"countryCode"\s{0,}:\s{0,}\K\d+') - case "$result" in - '228') echo -n -e "\r LineTV.TW:\t\t\t\t${Font_Green}Yes${Font_Suffix}\n" ;; - '') echo -n -e "\r LineTV.TW:\t\t\t\t${Font_Red}Failed (Error: Country Code Not Found)${Font_Suffix}\n" ;; - *) echo -n -e "\r LineTV.TW:\t\t\t\t${Font_Red}No${Font_Suffix}\n" ;; - esac -} - -function MediaUnlockTest_ViuCom() { - if [ "${USE_IPV6}" == 1 ]; then - echo -n -e "\r Viu.com:\t\t\t\t${Font_Red}IPv6 Is Not Currently Supported${Font_Suffix}\n" - return - fi - - local tmpresult=$(curl ${CURL_DEFAULT_OPTS} -fsL 'https://www.viu.com/' -w '%{http_code}_TAG_%{url_effective}\n' -o /dev/null --user-agent "${UA_BROWSER}") - local httpCode=$(echo "$tmpresult" | awk -F'_TAG_' '{print $1}') - if [ "$httpCode" == '000' ]; then - echo -n -e "\r Viu.com:\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" - return - fi - - local urlEffective=$(echo "$tmpresult" | awk -F'_TAG_' '{print $2}') - local region=$(echo "$urlEffective" | cut -f5 -d'/' | tr a-z A-Z) - if [ -z "$region" ]; then - echo -n -e "\r Viu.com:\t\t\t\t${Font_Red}Failed (Error: Country Code Not Found)${Font_Suffix}\n" - return - fi - if [ "$region" == 'NO-SERVICE' ]; then - echo -n -e "\r Viu.com:\t\t\t\t${Font_Red}No${Font_Suffix}\n" - return - fi - if [ "$httpCode" == '200' ]; then - echo -n -e "\r Viu.com:\t\t\t\t${Font_Green}Yes (Region: ${region})${Font_Suffix}\n" - return - fi - - echo -n -e "\r Viu.com:\t\t\t\t${Font_Red}Failed (Error: ${httpCode})${Font_Suffix}\n" -} - -function MediaUnlockTest_Niconico() { - if [ "${USE_IPV6}" == 1 ]; then - echo -n -e "\r Niconico:\t\t\t\t${Font_Red}IPv6 Is Not Currently Supported${Font_Suffix}\n" - return - fi - - local tmpresult=$(curl ${CURL_DEFAULT_OPTS} -sL 'https://www.nicovideo.jp/watch/so23017073' -H 'accept: */*;q=0.8,application/signed-exchange;v=b3;q=0.7' -H 'accept-language: en-US,en;q=0.9' -H "sec-ch-ua: ${UA_SEC_CH_UA}" -H 'sec-ch-ua-mobile: ?0' -H 'sec-ch-ua-platform: "Windows"' -H 'sec-fetch-dest: document' -H 'sec-fetch-mode: navigate' -H 'sec-fetch-site: none' -H 'sec-fetch-user: ?1' -H 'upgrade-insecure-requests: 1' --user-agent "${UA_BROWSER}") - if [ -z "$tmpresult" ]; then - echo -n -e "\r Niconico:\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" - return - fi - - # 获取直播网页 - local tmpresult2=$(curl ${CURL_DEFAULT_OPTS} -sL 'https://live.nicovideo.jp/?cmnhd_ref=device=pc&site=nicolive&pos=header_servicelink&ref=WatchPage-Anchor' -H 'accept: */*;q=0.8,application/signed-exchange;v=b3;q=0.7' -H 'accept-language: en-US,en;q=0.9' -H "sec-ch-ua: ${UA_SEC_CH_UA}" -H 'sec-ch-ua-mobile: ?0' -H 'sec-ch-ua-platform: "Windows"' -H 'sec-fetch-dest: document' -H 'sec-fetch-mode: navigate' -H 'sec-fetch-site: none' -H 'sec-fetch-user: ?1' -H 'upgrade-insecure-requests: 1' --user-agent "${UA_BROWSER}") - if [ -z "$tmpresult2" ]; then - echo -n -e "\r Niconico:\t\t\t\t${Font_Red}Failed (Network Connection 1)${Font_Suffix}\n" - return - fi - - # 从直播网页中找到第一个官方直播剧 - # echo "$tmpresult2" | grep -woP 'id="DAT-csr-data" data-value="[^"]+' | sed 's/id="DAT-csr-data" data-value="//;s/"/"/g' | \ - # jq -r '.props.view.popularBeforeOpenBroadcastStatusProgramListSectionState.programList.[] | select(.isOfficialChannelMemberFree == false) | .id' | head -n 1 - local liveID=$(echo "$tmpresult2" | sed 's/"isOfficialChannelMemberFree":false/"isOfficialChannelMemberFree":false\r\n/g' | grep -v '"isOfficialChannelMemberFree":true' | grep -v -E 'playerProgram|"ON_AIR"' | grep '話' | grep -woP '"id":"\Klv[0-9]+' | head -n 1) - if [ -z "$liveID" ]; then - echo -n -e "\r Niconico:\t\t\t\t${Font_Red}Failed (Error: PAGE ERROR)${Font_Suffix}\n" - return - fi - - local tmpresult3=$(curl ${CURL_DEFAULT_OPTS} -sL "https://live.nicovideo.jp/watch/${liveID}" -H 'accept: */*;q=0.8,application/signed-exchange;v=b3;q=0.7' -H 'accept-language: en-US,en;q=0.9' -H "sec-ch-ua: ${UA_SEC_CH_UA}" -H 'sec-ch-ua-mobile: ?0' -H 'sec-ch-ua-platform: "Windows"' -H 'sec-fetch-dest: document' -H 'sec-fetch-mode: navigate' -H 'sec-fetch-site: none' -H 'sec-fetch-user: ?1' -H 'upgrade-insecure-requests: 1' --user-agent "${UA_BROWSER}") - if [ -z "$tmpresult3" ]; then - echo -n -e "\r Niconico:\t\t\t\t${Font_Red}Failed (Network Connection 2)${Font_Suffix}\n" - return - fi - - local isBlocked=$(echo "$tmpresult" | grep '同じ地域') - local isJapanOnly=$(echo "$tmpresult3" | grep 'notAllowedCountry') - - if [ -z "$isBlocked" ] && [ -z "$isJapanOnly" ]; then - echo -n -e "\r Niconico:\t\t\t\t${Font_Green}Yes (LiveID: $liveID)${Font_Suffix}\n" - return - fi - - if [ -n "$isBlocked" ]; then - echo -n -e "\r Niconico:\t\t\t\t${Font_Red}No${Font_Suffix}\n" - return - fi - - if [ -n "$isJapanOnly" ]; then - echo -n -e "\r Niconico:\t\t\t\t${Font_Yellow}No (Official Live Unavailable. LiveID: ${liveID})${Font_Suffix}\n" - return - fi - - echo -n -e "\r Niconico:\t\t\t\t${Font_Red}Failed (Error: Unknown)${Font_Suffix}\n" -} - -function MediaUnlockTest_ParamountPlus() { - local tmpresult=$(curl ${CURL_DEFAULT_OPTS} -fsL 'https://www.paramountplus.com/' -w '%{http_code}_TAG_%{url_effective}\n' -o /dev/null --user-agent "${UA_BROWSER}") - local httpCode=$(echo "$tmpresult" | awk -F'_TAG_' '{print $1}') - if [ "$httpCode" == '000' ]; then - echo -n -e "\r Paramount+:\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" - return - fi - - local urlEffective=$(echo "$tmpresult" | awk -F'_TAG_' '{print $2}') - local region=$(echo "$urlEffective" | cut -f4 -d'/' | tr a-z A-Z) - - if [ "$region" == 'INTL' ]; then - echo -n -e "\r Paramount+:\t\t\t\t${Font_Red}No${Font_Suffix}\n" - return - fi - if [ "$httpCode" == '200' ]; then - if [ -z "$region" ]; then - local region='US' - fi - echo -n -e "\r Paramount+:\t\t\t\t${Font_Green}Yes (Region: ${region})${Font_Suffix}\n" - return - fi - - echo -n -e "\r Paramount+:\t\t\t\t${Font_Red}Failed (Error: ${httpCode})${Font_Suffix}\n" -} - -function MediaUnlockTest_KKTV() { - if [ "${USE_IPV6}" == 1 ]; then - echo -n -e "\r KKTV:\t\t\t\t\t${Font_Red}IPv6 Is Not Currently Supported${Font_Suffix}\n" - return - fi - - local tmpresult=$(curl ${CURL_DEFAULT_OPTS} -s 'https://api.kktv.me/v3/ipcheck' --user-agent "${UA_BROWSER}") - if [ -z "$tmpresult" ]; then - echo -n -e "\r KKTV:\t\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" - return - fi - - result=$(echo "$tmpresult" | grep -woP '"country"\s{0,}:\s{0,}"\K[^"]+') - if [ "$result" == 'TW' ]; then - echo -n -e "\r KKTV:\t\t\t\t\t${Font_Green}Yes${Font_Suffix}\n" - return - fi - - echo -n -e "\r KKTV:\t\t\t\t\t${Font_Red}No${Font_Suffix}\n" -} - -function MediaUnlockTest_PeacockTV() { - local tmpresult=$(curl ${CURL_DEFAULT_OPTS} -fsL 'https://www.peacocktv.com/' -w '%{http_code}_TAG_%{url_effective}\n' -o dev/null --user-agent "${UA_BROWSER}") - local httpCode=$(echo "$tmpresult" | awk -F'_TAG_' '{print $1}') - if [ "$httpCode" == '000' ]; then - echo -n -e "\r Peacock TV:\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" - return - fi - - local urlEffective=$(echo "$tmpresult" | awk -F'_TAG_' '{print $2}') - local result=$(echo "$urlEffective" | grep -i 'unavailable') - - if [ -n "$result" ]; then - echo -n -e "\r Peacock TV:\t\t\t\t${Font_Red}No${Font_Suffix}\n" - return - fi - if [ "$httpCode" == '200' ]; then - echo -n -e "\r Peacock TV:\t\t\t\t${Font_Green}Yes${Font_Suffix}\n" - return - fi - - echo -n -e "\r Peacock TV:\t\t\t\t${Font_Red}Failed (Error: ${httpCode})${Font_Suffix}\n" -} - -function MediaUnlockTest_FOD() { - if [ "${USE_IPV6}" == 1 ]; then - echo -n -e "\r FOD(Fuji TV):\t\t\t\t${Font_Red}IPv6 Is Not Currently Supported${Font_Suffix}\n" - return - fi - - local tmpresult=$(curl ${CURL_DEFAULT_OPTS} -s 'https://geocontrol1.stream.ne.jp/fod-geo/check.xml?time=1624504256' --user-agent "${UA_BROWSER}") - if [ -z "$tmpresult" ]; then - echo -n -e "\r FOD(Fuji TV):\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" - return - fi - - local result=$(echo "$tmpresult" | grep -woP '\K[^<(]+') - if [ -z "$result" ]; then - echo -n -e "\r Google Play Store:\t\t\t${Font_Red}Failed${Font_Suffix}\n" - return - else - echo -n -e "\r Google Play Store:\t\t\t${Font_Green}${result}${Font_Suffix}\n" - return - fi -} - -function RegionTest_Apple() { - local result=$(curl ${CURL_DEFAULT_OPTS} -sL 'https://gspe1-ssl.ls.apple.com/pep/gcc') - if [ -z "$result" ]; then - echo -n -e "\r Apple Region:\t\t\t\t${Font_Red}Failed${Font_Suffix}\n" - return - else - echo -n -e "\r Apple Region:\t\t\t\t${Font_Green}${result}${Font_Suffix}\n" - return - fi -} - -function RegionTest_YouTubeCDN() { - local tmpresult=$(curl ${CURL_DEFAULT_OPTS} -s 'https://redirector.googlevideo.com/report_mapping' --user-agent "${UA_BROWSER}") - if [ -z "$tmpresult" ]; then - echo -n -e "\r YouTube CDN:\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" - return - fi - - local iata=$(echo "$tmpresult" | grep '=>' | awk "NR==1" | awk '{print $3}' | cut -f2 -d'-' | cut -c 1-3 | tr a-z A-Z) - local isIDC=$(echo "$tmpresult" | grep 'router') - local isIataFound1=$(echo "$IATACODE" | grep -w "$iata") - local isIataFound2=$(echo "$IATACODE2" | grep -w "$iata") - - if [ -z "$iata" ]; then - echo -n -e "\r YouTube CDN:\t\t\t\t${Font_Red}Failed (Error: Location Unknown)${Font_Suffix}\n" - return - fi - if [ -z "$isIataFound1" ] && [ -z "$isIataFound2" ]; then - echo -n -e "\r YouTube CDN:\t\t\t\t${Font_Red}Failed (Error: IATA: ${iata} Not Found)${Font_Suffix}\n" - return - fi - if [ -n "$isIataFound1" ]; then - local location=$(echo "$IATACODE" | grep -w "$iata" | awk -F'|' '{print $1}' | awk '{$1=$1; print}') - fi - if [ -z "$isIataFound1" ] && [ -n "$isIataFound2" ]; then - local location=$(echo "$IATACODE2" | grep -w "$iata" | awk -F',' '{print $2}' | awk '{$1=$1; print}' | tr A-Z a-z | sed 's/\b[a-z]/\U&/g') - fi - - if [ -z "$isIDC" ]; then - local cdnISP=$(echo "$tmpresult" | awk 'NR==1' | awk '{print $3}' | cut -f1 -d'-' | tr a-z A-Z) - echo -n -e "\r YouTube CDN:\t\t\t\t${Font_Yellow}[${cdnISP}] in [${location}]${Font_Suffix}\n" - return - fi - if [ -n "$isIDC" ]; then - echo -n -e "\r YouTube CDN:\t\t\t\t${Font_Green}${location}${Font_Suffix}\n" - return - fi - - echo -n -e "\r YouTube CDN:\t\t\t\t${Font_Red}Failed (Error: Unknown)${Font_Suffix}\n" -} - -function WebTest_GoogleSearchCAPTCHA() { - local tmpresult=$(curl ${CURL_DEFAULT_OPTS} -sL 'https://www.google.com/search?q=curl&oq=curl&gs_lcrp=EgZjaHJvbWUyBggAEEUYOdIBBzg1MmowajGoAgCwAgE&sourceid=chrome&ie=UTF-8' -H 'accept: */*;q=0.8,application/signed-exchange;v=b3;q=0.7' -H 'accept-language: en-US,en;q=0.9' -H "sec-ch-ua: ${UA_SEC_CH_UA}" -H 'sec-ch-ua-mobile: ?0' -H 'sec-ch-ua-model: ""' -H 'sec-ch-ua-platform: "Windows"' -H 'sec-ch-ua-platform-version: "15.0.0"' -H 'sec-ch-ua-wow64: ?0' -H 'sec-fetch-dest: document' -H 'sec-fetch-mode: navigate' -H 'sec-fetch-site: none' -H 'sec-fetch-user: ?1' -H 'upgrade-insecure-requests: 1' --user-agent "${UA_BROWSER}") - if [ -z "$tmpresult" ]; then - echo -n -e "\r Google Search CAPTCHA Free:\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" - return - fi - - local isBlocked=$(echo "$tmpresult" | grep -iE 'unusual traffic from|is blocked|unaddressed abuse') - local isOK=$(echo "$tmpresult" | grep -i 'curl') - - if [ -z "$isBlocked" ] && [ -z "$isOK" ]; then - echo -n -e "\r Google Search CAPTCHA Free:\t\t${Font_Red}Failed (Error: PAGE ERROR)${Font_Suffix}\n" - return - fi - if [ -n "$isBlocked" ]; then - echo -n -e "\r Google Search CAPTCHA Free:\t\t${Font_Red}No${Font_Suffix}\n" - return - fi - if [ -n "$isOK" ]; then - echo -n -e "\r Google Search CAPTCHA Free:\t\t${Font_Green}Yes${Font_Suffix}\n" - return - fi - - echo -n -e "\r Google Search CAPTCHA Free:\t\t${Font_Red}Failed (Error: Unknown)${Font_Suffix}\n" -} - -function MediaUnlockTest_BritBox() { - local tmpresult=$(curl ${CURL_DEFAULT_OPTS} -fsL 'https://www.britbox.com/' -w '%{http_code}_TAG_%{url_effective}\n' -o dev/null --user-agent "${UA_BROWSER}") - local httpCode=$(echo "$tmpresult" | awk -F'_TAG_' '{print $1}') - if [ "$httpCode" == '000' ]; then - echo -n -e "\r BritBox:\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" - return - fi - - local urlEffective=$(echo "$tmpresult" | awk -F'_TAG_' '{print $2}') - local result=$(echo "$urlEffective" | grep -E 'locationnotsupported|locationnotvalidated|britbox.co.uk') - - if [ -n "$result" ]; then - echo -n -e "\r BritBox:\t\t\t\t${Font_Red}No${Font_Suffix}\n" - return - fi - if [ "$httpCode" == '200' ]; then - echo -n -e "\r BritBox:\t\t\t\t${Font_Green}Yes${Font_Suffix}\n" - return - fi - - echo -n -e "\r BritBox:\t\t\t\t${Font_Red}Failed (Error: ${httpCode})${Font_Suffix}\n" -} - -function MediaUnlockTest_PrimeVideo() { - if [ "${USE_IPV6}" == 1 ]; then - echo -n -e "\r Amazon Prime Video:\t\t\t${Font_Red}IPv6 Is Not Currently Supported${Font_Suffix}\n" - return - fi - - local tmpresult=$(curl ${CURL_DEFAULT_OPTS} -sL 'https://www.primevideo.com' --user-agent "${UA_BROWSER}") - if [ -z "$tmpresult" ]; then - echo -n -e "\r Amazon Prime Video:\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" - return - fi - - local isBlocked=$(echo "$tmpresult" | grep -i 'isServiceRestricted') - local region=$(echo "$tmpresult" | grep -woP '"currentTerritory":"\K[^"]+' | head -n 1) - - if [ -z "$isBlocked" ] && [ -z "$region" ]; then - echo -n -e "\r Amazon Prime Video:\t\t\t${Font_Red}Failed (Error: PAGE ERROR)${Font_Suffix}\n" - return - fi - if [ -n "$isBlocked" ]; then - echo -n -e "\r Amazon Prime Video:\t\t\t${Font_Red}No (Service Not Available)${Font_Suffix}\n" - return - fi - if [ -n "$region" ]; then - echo -n -e "\r Amazon Prime Video:\t\t\t${Font_Green}Yes (Region: ${region})${Font_Suffix}\n" - return - fi - - echo -n -e "\r Amazon Prime Video:\t\t\t${Font_Red}Failed (Error: Unknown Region)${Font_Suffix}\n" -} - -function MediaUnlockTest_Radiko() { - if [ "${USE_IPV6}" == 1 ]; then - echo -n -e "\r Radiko:\t\t\t\t${Font_Red}IPv6 Is Not Currently Supported${Font_Suffix}\n" - return - fi - - local tmpresult=$(curl ${CURL_DEFAULT_OPTS} -s 'https://radiko.jp/area?_=1625406539531' --user-agent "${UA_BROWSER}") - if [ -z "$tmpresult" ]; then - echo -n -e "\r Radiko:\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" - return - fi - - local isBlocked=$(echo "$tmpresult" | grep 'class="OUT"') - local isOK=$(echo "$tmpresult" | grep -i 'JAPAN') - - if [ -z "$isBlocked" ] && [ -z "$isOK" ]; then - echo -n -e "\r Radiko:\t\t\t\t${Font_Red}Failed (Error: PAGE ERROR)${Font_Suffix}\n" - return - fi - if [ -n "$isBlocked" ]; then - echo -n -e "\r Radiko:\t\t\t\t${Font_Red}No${Font_Suffix}\n" - return - fi - if [ -n "$isOK" ]; then - local area=$(echo "$tmpresult" | awk '{print $2}' | sed 's/.*>//') - echo -n -e "\r Radiko:\t\t\t\t${Font_Green}Yes (City: $area)${Font_Suffix}\n" - return - fi - - echo -n -e "\r Radiko:\t\t\t\t${Font_Red}Failed (Error: Unknown)${Font_Suffix}\n" -} - -function MediaUnlockTest_DMM() { - if [ "${USE_IPV6}" == 1 ]; then - echo -n -e "\r DMM:\t\t\t\t\t${Font_Red}IPv6 Is Not Currently Supported${Font_Suffix}\n" - return - fi - - local tmpresult=$(curl ${CURL_DEFAULT_OPTS} -s 'https://bitcoin.dmm.com/' -H 'accept: */*;q=0.8,application/signed-exchange;v=b3;q=0.7' -H 'accept-language: en-US,en;q=0.9' -H "sec-ch-ua: ${UA_SEC_CH_UA}" -H 'sec-ch-ua-mobile: ?0' -H 'sec-ch-ua-platform: "Windows"' -H 'sec-fetch-dest: document' -H 'sec-fetch-mode: navigate' -H 'sec-fetch-site: none' -H 'sec-fetch-user: ?1' --user-agent "${UA_BROWSER}") - if [ -z "$tmpresult" ]; then - echo -n -e "\r DMM:\t\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" - return - fi - - local isBlocked=$(echo "$tmpresult" | grep 'This page is not available in your area') - local isOK=$(echo "$tmpresult" | grep '暗号資産') - - - if [ -z "$isBlocked" ] && [ -z "$isOK" ]; then - echo -n -e "\r DMM:\t\t\t\t\t${Font_Red}Failed (Error: PAGE ERROR)${Font_Suffix}\n" - return - fi - if [ -n "$isBlocked" ]; then - echo -n -e "\r DMM:\t\t\t\t\t${Font_Red}No${Font_Suffix}\n" - return - fi - if [ -n "$isOK" ]; then - echo -n -e "\r DMM:\t\t\t\t\t${Font_Green}Yes${Font_Suffix}\n" - return - fi - - echo -n -e "\r DMM:\t\t\t\t\t${Font_Red}Failed (Error: Unknown)${Font_Suffix}\n" -} - -function MediaUnlockTest_DMMTV() { - if [ "${USE_IPV6}" == 1 ]; then - echo -n -e "\r DMM TV:\t\t\t\t${Font_Red}IPv6 Is Not Currently Supported${Font_Suffix}\n" - return - fi - - local tmpresult=$(curl ${CURL_DEFAULT_OPTS} -s 'https://api.beacon.dmm.com/v1/streaming/start' -X POST -d '{"player_name":"dmmtv_browser","player_version":"0.0.0","content_type_detail":"VOD_SVOD","content_id":"11uvjcm4fw2wdu7drtd1epnvz","purchase_product_id":null}' -H 'accept: */*;q=0.8,application/signed-exchange;v=b3;q=0.7' -H 'accept-language: en-US,en;q=0.9' -H "sec-ch-ua: ${UA_SEC_CH_UA}" -H 'sec-ch-ua-mobile: ?0' -H 'sec-ch-ua-platform: "Windows"' -H 'sec-fetch-dest: document' -H 'sec-fetch-mode: navigate' -H 'sec-fetch-site: none' -H 'sec-fetch-user: ?1' --user-agent "${UA_BROWSER}") - if [ -z "$tmpresult" ]; then - echo -n -e "\r DMM TV:\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" - return - fi - - local isBlocked=$(echo "$tmpresult" | grep 'FOREIGN') - local isOK=$(echo "$tmpresult" | grep 'UNAUTHORIZED') - - if [ -z "$isBlocked" ] && [ -z "$isOK" ]; then - echo -n -e "\r DMM TV:\t\t\t\t${Font_Red}Failed (Error: PAGE ERROR)${Font_Suffix}\n" - return - fi - if [ -n "$isBlocked" ]; then - echo -n -e "\r DMM TV:\t\t\t\t${Font_Red}No${Font_Suffix}\n" - return - fi - if [ -n "$isOK" ]; then - echo -n -e "\r DMM TV:\t\t\t\t${Font_Green}Yes${Font_Suffix}\n" - return - fi - - echo -n -e "\r DMM TV:\t\t\t\t${Font_Red}Failed (Error: Unknown)${Font_Suffix}\n" -} - -function MediaUnlockTest_Catchplay() { - if [ "${USE_IPV6}" == 1 ]; then - echo -n -e "\r CatchPlay+:\t\t\t\t${Font_Red}IPv6 Is Not Currently Supported${Font_Suffix}\n" - return - fi - - local tmpresult=$(curl ${CURL_DEFAULT_OPTS} -s 'https://sunapi.catchplay.com/geo' -H "authorization: Basic NTQ3MzM0NDgtYTU3Yi00MjU2LWE4MTEtMzdlYzNkNjJmM2E0Ok90QzR3elJRR2hLQ01sSDc2VEoy" --user-agent "${UA_BROWSER}") - if [ -z "$tmpresult" ]; then - echo -n -e "\r CatchPlay+:\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" - return - fi - - local result=$(echo "$tmpresult" | grep -woP '"code"\s{0,}:\s{0,}"\K[^"]+') - if [ -z "$result" ]; then - echo -n -e "\r CatchPlay+:\t\t\t\t${Font_Red}Failed (Error: PAGE ERROR)${Font_Suffix}\n" - return - fi - case "$result" in - '0') echo -n -e "\r CatchPlay+:\t\t\t\t${Font_Green}Yes${Font_Suffix}\n" ;; - '100016') echo -n -e "\r CatchPlay+:\t\t\t\t${Font_Red}No${Font_Suffix}\n" ;; - *) echo -n -e "\r Now E:\t\t\t\t\t${Font_Red}Failed (Error: ${result})${Font_Suffix}\n" ;; - esac -} - -function MediaUnlockTest_HotStar() { - local tmpresult=$(curl ${CURL_DEFAULT_OPTS} -sLi 'https://www.hotstar.com' -w '\n_TAG_%{http_code}_TAG_%{url_effective}_TAG_\n' --user-agent "${UA_BROWSER}") - - local httpCode=$(echo "$tmpresult" | grep -o '_TAG_.*_TAG_' | awk -F'_TAG_' '{print $2}') - - if [ "$httpCode" == '000' ]; then - echo -n -e "\r HotStar:\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" - return - fi - if [ "$httpCode" == '403' ]; then - echo -n -e "\r HotStar:\t\t\t\t${Font_Red}No${Font_Suffix}\n" - return - fi - if [ "$httpCode" == '475' ]; then - echo -n -e "\r HotStar:\t\t\t\t${Font_Red}No${Font_Suffix}\n" - return - fi - - local urlEffective=$(echo "$tmpresult" | grep -o '_TAG_.*_TAG_' | awk -F'_TAG_' '{print $3}') - local region=$(echo "$tmpresult" | grep -woP 'geo=\K[A-Z]+' | head -n 1) - local siteRegion=$(echo "$urlEffective" | sed 's@.*com/@@' | tr a-z A-Z) - - if [ -z "$region" ]; then - echo -n -e "\r HotStar:\t\t\t\t${Font_Red}Failed (Error: PAGE ERROR)${Font_Suffix}\n" - return - fi - if [ "$region" == 'US' ]; then - echo -n -e "\r HotStar:\t\t\t\t${Font_Yellow}No (Discontinued in the US)${Font_Suffix}\n" - return - fi - if [ "$region" == "$siteRegion" ]; then - echo -n -e "\r HotStar:\t\t\t\t${Font_Green}Yes (Region: ${region})${Font_Suffix}\n" - return - fi - - echo -n -e "\r HotStar:\t\t\t\t${Font_Red}Failed (Error: REGION ERROR ${region}_${siteRegion})${Font_Suffix}\n" -} - -function MediaUnlockTest_LiTV() { - if [ "${USE_IPV6}" == 1 ]; then - echo -n -e "\r LiTV:\t\t\t\t\t${Font_Red}IPv6 Is Not Currently Supported${Font_Suffix}\n" - return - fi - - local fakePUid=$(gen_uuid) - local tmpresult=$(curl ${CURL_DEFAULT_OPTS} -s 'https://www.litv.tv/api/get-urls-no-auth' -H 'accept: application/json, text/plain, */*' -H 'content-type: application/json' -H 'accept-language: en-US,en;q=0.9' -H 'origin: https://www.litv.tv' -H 'referer: https://www.litv.tv/drama/watch/VOD00328856' -H "sec-ch-ua: ${UA_SEC_CH_UA}" -H 'sec-ch-ua-mobile: ?0' -H 'sec-ch-ua-platform: "Windows"' -H 'sec-fetch-dest: empty' -H 'sec-fetch-mode: cors' -H 'sec-fetch-site: same-origin' --data-raw "{\"AssetId\":\"vod70810-000001M001_1500K\",\"MediaType\":\"vod\",\"puid\":\"${fakePUid}\"}" --user-agent "${UA_BROWSER}") - if [ -z "$tmpresult" ]; then - echo -n -e "\r LiTV:\t\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" - return - fi - - local isOK=$(echo "$tmpresult" | grep 'AssetURLs') - local result=$(echo "$tmpresult" | grep -woP '"code"\s{0,}:\s{0,}\K[^"][0-9]{0,}') - - if [ -n "$isOK" ]; then - echo -n -e "\r LiTV:\t\t\t\t\t${Font_Green}Yes${Font_Suffix}\n" - return - fi - - case "$result" in - '42000087') echo -n -e "\r LiTV:\t\t\t\t\t${Font_Red}No${Font_Suffix}\n" ;; - '42000075') echo -n -e "\r LiTV:\t\t\t\t\t${Font_Green}Yes${Font_Suffix}\n" ;; # 剧集不存在 - '') echo -n -e "\r LiTV:\t\t\t\t\t${Font_Red}Failed (Error: PAGE ERROR)${Font_Suffix}\n" ;; - *) echo -n -e "\r LiTV:\t\t\t\t\t${Font_Red}Failed (Error: ${result})${Font_Suffix}\n" ;; - esac -} - -function MediaUnlockTest_FuboTV() { - if [ "${USE_IPV6}" == 1 ]; then - echo -n -e "\r Fubo TV:\t\t\t\t${Font_Red}IPv6 Is Not Currently Supported${Font_Suffix}\n" - return - fi - - local tmpresult=$(curl ${CURL_DEFAULT_OPTS} -fs "https://api.fubo.tv/v3/location" -H 'accept: */*' -H 'accept-language: en-US,en;q=0.9' -H 'origin: https://www.fubo.tv' -H 'referer: https://www.fubo.tv/' -H "sec-ch-ua: ${UA_SEC_CH_UA}" -H 'sec-ch-ua-mobile: ?0' -H 'sec-ch-ua-platform: "Windows"' -H 'sec-fetch-dest: empty' -H 'sec-fetch-mode: cors' -H 'sec-fetch-site: same-site' --user-agent "${UA_BROWSER}") - if [ -z "$tmpresult" ]; then - echo -n -e "\r Fubo TV:\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" - return - fi - - local noService=$(echo "$tmpresult" | grep -i 'NO_SERVICE_IN_COUNTRY') - local isAllowed=$(echo "$tmpresult" | grep -o '"network_allowed":true') - local isBlocked=$(echo "$tmpresult" | grep -o '"network_allowed":false') - local countryCode=$(echo "$tmpresult" | grep -oP '"country_code2":"\K[^"]+') - - if [ -n "$noService" ]; then - echo -n -e "\r Fubo TV:\t\t\t\t${Font_Red}No${Font_Suffix}\n" - return - fi - if [ -n "$isBlocked" ]; then - echo -n -e "\r Fubo TV:\t\t\t\t${Font_Red}No${Font_Suffix}\n" - return - fi - if [ -n "$isAllowed" ]; then - echo -n -e "\r Fubo TV:\t\t\t\t${Font_Green}Yes (Region:${countryCode})${Font_Suffix}\n" - return - fi - - echo -n -e "\r Fubo TV:\t\t\t\t${Font_Red}Failed (Error: Unknown)${Font_Suffix}\n" -} - -function MediaUnlockTest_Fox() { - local result=$(curl ${CURL_DEFAULT_OPTS} -fsL 'https://x-live-fox-stgec.uplynk.com/ausw/slices/8d1/d8e6eec26bf544f084bad49a7fa2eac5/8d1de292bcc943a6b886d029e6c0dc87/G00000000.ts?pbs=c61e60ee63ce43359679fb9f65d21564&cloud=aws&si=0' -w %{http_code} -o /dev/null --user-agent "${UA_BROWSER}") - - case "$result" in - '000') echo -n -e "\r FOX:\t\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" ;; - '200') echo -n -e "\r FOX:\t\t\t\t\t${Font_Green}Yes${Font_Suffix}\n" ;; - '403') echo -n -e "\r FOX:\t\t\t\t\t${Font_Red}No${Font_Suffix}\n" ;; - *) echo -n -e "\r FOX:\t\t\t\t\t${Font_Red}Failed (Error: ${result})${Font_Suffix}\n" ;; - esac -} - -function MediaUnlockTest_Joyn() { - if [ "${USE_IPV6}" == 1 ]; then - echo -n -e "\r Joyn:\t\t\t\t\t${Font_Red}IPv6 Is Not Currently Supported${Font_Suffix}\n" - return - fi - - local tmpauth=$(curl ${CURL_DEFAULT_OPTS} -s 'https://auth.joyn.de/auth/anonymous' -X POST -H "Content-Type: application/json" -d '{"client_id":"b74b9f27-a994-4c45-b7eb-5b81b1c856e7","client_name":"web","anon_device_id":"b74b9f27-a994-4c45-b7eb-5b81b1c856e7"}' --user-agent "${UA_BROWSER}") - if [ -z "$tmpauth" ]; then - echo -n -e "\r Joyn:\t\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" - return - fi - - local auth=$(echo "$tmpauth" | grep -woP '"access_token"\s{0,}:\s{0,}"\K[^"]+') - local tmpresult=$(curl ${CURL_DEFAULT_OPTS} -s 'https://api.joyn.de/content/entitlement-token' -H "x-api-key: 36lp1t4wto5uu2i2nk57ywy9on1ns5yg" -H "content-type: application/json" -d '{"content_id":"daserste-de-hd","content_type":"LIVE"}' -H "authorization: Bearer ${auth}" --user-agent "${UA_BROWSER}") - if [ -z "$tmpresult" ]; then - echo -n -e "\r Joyn:\t\t\t\t\t${Font_Red}Failed (Error: PAGE ERROR)${Font_Suffix}\n" - return - fi - - local isOK=$(echo "$tmpresult" | grep -i 'entitlement_token') - local isBlocked=$(echo "$tmpresult" | grep -i 'ENT_AssetNotAvailableInCountry') - - if [ -z "$isOK" ] && [ -z "$isBlocked" ]; then - echo -n -e "\r Joyn:\t\t\t\t\t${Font_Red}Failed (Error: PAGE ERROR)${Font_Suffix}\n" - return - fi - if [ -n "$isBlocked" ]; then - echo -n -e "\r Joyn:\t\t\t\t\t${Font_Red}No${Font_Suffix}\n" - return - fi - if [ -n "$isOK" ]; then - echo -n -e "\r Joyn:\t\t\t\t\t${Font_Green}Yes${Font_Suffix}\n" - return - fi - - echo -n -e "\r Joyn:\t\t\t\t\t${Font_Red}Failed (Error: Unknown)${Font_Suffix}\n" -} - -function MediaUnlockTest_SpotvNow() { - if [ "${USE_IPV6}" == 1 ]; then - echo -n -e "\r SPOTV NOW:\t\t\t\t${Font_Red}IPv6 Is Not Currently Supported${Font_Suffix}\n" - return - fi - - local tmpresult=$(curl ${CURL_DEFAULT_OPTS} -s 'https://edge.api.brightcove.com/playback/v1/accounts/5764318566001/videos/6349973203112' -H 'accept: application/json;pk=BCpkADawqM0U3mi_PT566m5lvtapzMq3Uy7ICGGjGB6v4Ske7ZX_ynzj8ePedQJhH36nym_5mbvSYeyyHOOdUsZovyg2XlhV6rRspyYPw_USVNLaR0fB_AAL2HSQlfuetIPiEzbUs1tpNF9NtQxt3BAPvXdOAsvy1ltLPWMVzJHiw9slpLRgI2NUufc' -H 'accept-language: en-US,en;q=0.9' -H 'origin: https://www.spotvnow.co.kr' -H 'referer: https://www.spotvnow.co.kr/' -H "sec-ch-ua: ${UA_SEC_CH_UA}" -H 'sec-ch-ua-mobile: ?0' -H 'sec-ch-ua-platform: "Windows"' -H 'sec-fetch-dest: empty' -H 'sec-fetch-mode: cors' -H 'sec-fetch-site: cross-site' --user-agent "${UA_BROWSER}") - if [ -z "$tmpresult" ]; then - echo -n -e "\r SPOTV NOW:\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" - return - fi - - local result=$(echo "$tmpresult" | grep -woP '"error_subcode"\s{0,}:\s{0,}"\K[^"]+') - - case "$result" in - 'CLIENT_GEO') echo -n -e "\r SPOTV NOW:\t\t\t\t${Font_Red}No${Font_Suffix}\n" ;; - '') echo -n -e "\r SPOTV NOW:\t\t\t\t${Font_Green}Yes${Font_Suffix}\n" ;; - *) echo -n -e "\r SPOTV NOW:\t\t\t\t${Font_Red}Failed (Error: ${result})${Font_Suffix}\n" ;; - esac -} - -function MediaUnlockTest_SKY_DE() { - if [ "${USE_IPV6}" == 1 ]; then - echo -n -e "\r SKY DE:\t\t\t\t${Font_Red}IPv6 Is Not Currently Supported${Font_Suffix}\n" - return - fi - - local tmpresult=$(curl ${CURL_DEFAULT_OPTS} -s 'https://edge.api.brightcove.com/playback/v1/accounts/1050888051001/videos/6247131490001' -H "Accept: application/json;pk=BCpkADawqM0OXCLe4eIkpyuir8Ssf3kIQAM62a1KMa4-1_vTOWQIxoHHD4-oL-dPmlp-rLoS-WIAcaAMKuZVMR57QY4uLAmP4Ov3V416hHbqr0GNNtzVXamJ6d4-rA3Xi98W-8wtypdEyjGEZNepUCt3D7UdMthbsG-Ean3V4cafT4nZX03st5HlyK1chp51SfA-vKcAOhHZ4_Oa9TTN61tEH6YqML9PWGyKrbuN5myICcGsFzP3R2aOF8c5rPCHT2ZAiG7MoavHx8WMjhfB0QdBr2fphX24CSpUKlcjEnQJnBiA1AdLg9iyReWrAdQylX4Eyhw5OwKiCGJznfgY6BDtbUmeq1I9r9RfmhP5bfxVGjILSEFZgXbMqGOvYdrdare0aW2fTCxeHdHt0vyKOWTC6CS1lrGJF2sFPKn1T1csjVR8s4MODqCBY1PTbHY4A9aZ-2MDJUVJDkOK52hGej6aXE5b9N9_xOT2B9wbXL1B1ZB4JLjeAdBuVtaUOJ44N0aCd8Ns0o02E1APxucQqrjnEociLFNB0Bobe1nkGt3PS74IQcs-eBvWYSpolldMH6TKLu8JqgdnM4WIp3FZtTWJRADgAmvF9tVDUG9pcJoRx_CZ4im-rn-AzN3FeOQrM4rTlU3Q8YhSmyEIoxYYqsFDwbFlhsAcvqQkgaElYtuciCL5i3U8N4W9rIhPhQJzsPafmLdWxBP_FXicyek25GHFdQzCiT8nf1o860Jv2cHQ4xUNcnP-9blIkLy9JmuB2RgUXOHzWsrLGGW6hq9wLUtqwEoxcEAAcNJgmoC0k8HE-Ga-NHXng6EFWnqiOg_mZ_MDd7gmHrrKLkQV" -H "Origin: https://www.sky.de" --user-agent "${UA_BROWSER}") - if [ -z "$tmpresult" ]; then - echo -n -e "\r SKY DE:\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" - return - fi - - local result=$(echo "$tmpresult" | grep -woP '"error_subcode"\s{0,}:\s{0,}"\K[^"]+') - - case "$result" in - 'CLIENT_GEO') echo -n -e "\r SKY DE:\t\t\t\t${Font_Red}No${Font_Suffix}\n" ;; - '') echo -n -e "\r SKY DE:\t\t\t\t${Font_Green}Yes${Font_Suffix}\n" ;; - *) echo -n -e "\r SKY DE:\t\t\t\t${Font_Red}Failed (Error: ${result})${Font_Suffix}\n" ;; - esac -} - -function MediaUnlockTest_ZDF() { - if [ "${USE_IPV6}" == 1 ]; then - echo -n -e "\r ZDF: \t\t\t\t\t${Font_Red}IPv6 Is Not Currently Supported${Font_Suffix}\n" - return - fi - - local result=$(curl ${CURL_DEFAULT_OPTS} -fsL 'https://ssl.zdf.de/geo/de/geo.txt/' -w %{http_code} -o /dev/null --user-agent "${UA_ANDROID}") - - case "$result" in - '000') echo -n -e "\r ZDF: \t\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" ;; - '404') echo -n -e "\r ZDF: \t\t\t\t\t${Font_Green}Yes${Font_Suffix}\n" ;; - '403') echo -n -e "\r ZDF: \t\t\t\t\t${Font_Red}No${Font_Suffix}\n" ;; - *) echo -n -e "\r ZDF: \t\t\t\t\t${Font_Red}Failed (Error: ${result})${Font_Suffix}\n" ;; - esac -} - -function MediaUnlockTest_HBOGO_ASIA() { - if [ "${USE_IPV6}" == 1 ]; then - echo -n -e "\r HBO GO Asia:\t\t\t\t${Font_Red}IPv6 Is Not Currently Supported${Font_Suffix}\n" - return - fi - - local tmpresult=$(curl ${CURL_DEFAULT_OPTS} -s 'https://api2.hbogoasia.com/v1/geog?lang=undefined&version=0&bundleId=www.hbogoasia.com' --user-agent "${UA_BROWSER}") - if [ -z "$tmpresult" ]; then - echo -n -e "\r HBO GO Asia:\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" - return - fi - - local result=$(echo "$tmpresult" | grep -woP '"territory"\s{0,}:\s{0,}"\K[^"]+') - if [ -z "$result" ]; then - echo -n -e "\r HBO GO Asia:\t\t\t\t${Font_Red}No${Font_Suffix}\n" - return - fi - - local region=$(echo "$tmpresult" | grep -woP '"country"\s{0,}:\s{0,}"\K[^"]+') - if [ -n "$region" ]; then - echo -n -e "\r HBO GO Asia:\t\t\t\t${Font_Green}Yes (Region: ${region})${Font_Suffix}\n" - return - fi - - echo -n -e "\r HBO GO Asia:\t\t\t\t${Font_Red}Failed (Error: Country Code Not Found)${Font_Suffix}\n" -} - -function MediaUnlockTest_EPIX() { - if [ "${USE_IPV6}" == 1 ]; then - echo -n -e "\r MGM+:\t\t\t\t\t${Font_Red}IPv6 Is Not Currently Supported${Font_Suffix}\n" - return - fi - - local tmpToken=$(curl ${CURL_DEFAULT_OPTS} -s 'https://api.epix.com/v2/sessions' -X POST -H 'host: api.epix.com' -H "sec-ch-ua: ${UA_SEC_CH_UA}" -H 'traceparent: 00-000000000000000015b7efdb572b7bf2-4aefaea90903bd1f-01' -H 'sec-ch-ua-mobile: ?0' -H 'x-datadog-origin: rum' -H 'x-datadog-sampling-priority: 1' -H 'accept: application/json' -H 'x-datadog-trace-id: 1564983120873880562' -H 'x-datadog-parent-id: 5399726519264460063' -H 'sec-ch-ua-platform: "Windows"' -H 'origin: https://www.mgmplus.com' -H 'sec-fetch-site: cross-site' -H 'sec-fetch-mode: cors' -H 'sec-fetch-dest: empty' -H 'referer: https://www.mgmplus.com/' -H 'accept-language: en-US,en;q=0.9' -H 'content-type: application/json' -d '{"device":{"guid":"7a0baaaf-384c-45cd-a21d-310ca5d3002a","format":"console","os":"web","display_width":1865,"display_height":942,"app_version":"1.0.2","model":"browser","manufacturer":"google"},"apikey":"53e208a9bbaee479903f43b39d7301f7"}' --user-agent "${UA_BROWSER}") - if [ -z "$tmpToken" ]; then - echo -n -e "\r MGM+:\t\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" - return - fi - - local is403=$(echo "$tmpToken" | grep -i '403 ERROR') - if [ -n "$is403" ]; then - echo -n -e "\r MGM+:\t\t\t\t\t${Font_Red}No${Font_Suffix}\n" - return - fi - - local epixToken=$(echo "$tmpToken" | grep -woP '"session_token"\s{0,}:\s{0,}"\K[^"]+') - if [ -z "$epixToken" ]; then - echo -n -e "\r MGM+:\t\t\t\t\t${Font_Red}Failed (Error: PAGE ERROR)${Font_Suffix}\n" - return - fi - - local tmpresult=$(curl ${CURL_DEFAULT_OPTS} -s 'https://api.epix.com/graphql' -X POST -H 'host: api.epix.com' -H "sec-ch-ua: ${UA_SEC_CH_UA}" -H 'traceparent: 00-0000000000000000603047c112148412-32d64f8c890631ef-01' -H 'sec-ch-ua-mobile: ?0' -H 'x-datadog-origin: rum' -H 'x-datadog-sampling-priority: 1' -H 'accept: application/json' -H "x-session-token: ${epixToken}" -H 'x-datadog-trace-id: 6931118721080787986' -H 'x-datadog-parent-id: 3663202811925377519' -H 'sec-ch-ua-platform: "Windows"' -H 'origin: https://www.mgmplus.com' -H 'sec-fetch-site: cross-site' -H 'sec-fetch-mode: cors' -H 'sec-fetch-dest: empty' -H 'referer: https://www.mgmplus.com/' -H 'accept-language: en-US,en;q=0.9' -H 'content-type: application/json' -d '{"operationName":"PlayFlow","variables":{"id":"c2VyaWVzOzEwMTc=","supportedActions":["open_url","show_notice","start_billing","play_content","log_in","noop","confirm_provider","unlinked_provider"],"streamTypes":[{"encryptionScheme":"CBCS","packagingSystem":"DASH"},{"encryptionScheme":"CENC","packagingSystem":"DASH"},{"encryptionScheme":"NONE","packagingSystem":"HLS"},{"encryptionScheme":"SAMPLE_AES","packagingSystem":"HLS"}]},"query":"fragment ShowNotice on ShowNotice {\n type\n actions {\n continuationContext\n text\n __typename\n }\n description\n title\n __typename\n}\n\nfragment OpenUrl on OpenUrl {\n type\n url\n __typename\n}\n\nfragment Content on Content {\n title\n __typename\n}\n\nfragment Movie on Movie {\n id\n shortName\n __typename\n}\n\nfragment Episode on Episode {\n id\n series {\n shortName\n __typename\n }\n seasonNumber\n number\n __typename\n}\n\nfragment Preroll on Preroll {\n id\n __typename\n}\n\nfragment ContentUnion on ContentUnion {\n ...Content\n ...Movie\n ...Episode\n ...Preroll\n __typename\n}\n\nfragment PlayContent on PlayContent {\n type\n continuationContext\n heartbeatToken\n currentItem {\n content {\n ...ContentUnion\n __typename\n }\n __typename\n }\n nextItem {\n content {\n ...ContentUnion\n __typename\n }\n showNotice {\n ...ShowNotice\n __typename\n }\n showNoticeAt\n __typename\n }\n amazonPlaybackData {\n pid\n playbackToken\n materialType\n __typename\n }\n playheadPosition\n vizbeeStreamInfo {\n customStreamInfo\n __typename\n }\n closedCaptions {\n ttml {\n location\n __typename\n }\n vtt {\n location\n __typename\n }\n xml {\n location\n __typename\n }\n __typename\n }\n hints {\n duration\n seekAllowed\n trackingEnabled\n trackingId\n __typename\n }\n streams(types: $streamTypes) {\n playlistUrl\n closedCaptionsEmbedded\n packagingSystem\n encryptionScheme\n videoQuality {\n height\n width\n __typename\n }\n widevine {\n authenticationToken\n licenseServerUrl\n __typename\n }\n playready {\n authenticationToken\n licenseServerUrl\n __typename\n }\n fairplay {\n authenticationToken\n certificateUrl\n licenseServerUrl\n __typename\n }\n __typename\n }\n __typename\n}\n\nfragment StartBilling on StartBilling {\n type\n __typename\n}\n\nfragment LogIn on LogIn {\n type\n __typename\n}\n\nfragment Noop on Noop {\n type\n __typename\n}\n\nfragment PreviewContent on PreviewContent {\n type\n title\n description\n stream {\n sources {\n hls {\n location\n __typename\n }\n __typename\n }\n __typename\n }\n __typename\n}\n\nfragment ConfirmProvider on ConfirmProvider {\n type\n __typename\n}\n\nfragment UnlinkedProvider on UnlinkedProvider {\n type\n __typename\n}\n\nquery PlayFlow($id: String!, $supportedActions: [PlayFlowActionEnum!]!, $context: String, $behavior: BehaviorEnum = DEFAULT, $streamTypes: [StreamDefinition!]) {\n playFlow(\n id: $id\n supportedActions: $supportedActions\n context: $context\n behavior: $behavior\n ) {\n ...ShowNotice\n ...OpenUrl\n ...PlayContent\n ...StartBilling\n ...LogIn\n ...Noop\n ...PreviewContent\n ...ConfirmProvider\n ...UnlinkedProvider\n __typename\n }\n}"}' --user-agent "${UA_BROWSER}") - - local isBlocked=$(echo "$tmpresult" | grep -i 'MGM+ is only available in the United States') - local isOK=$(echo "$tmpresult" | grep -i 'StartBilling') - - if [ -z "$isBlocked" ] && [ -z "$isOK" ]; then - echo -n -e "\r MGM+:\t\t\t\t\t${Font_Red}Failed (Error: PAGE ERROR)${Font_Suffix}\n" - return - fi - if [ -n "$isBlocked" ]; then - echo -n -e "\r MGM+:\t\t\t\t\t${Font_Red}No${Font_Suffix}\n" - return - fi - if [ -n "$isOK" ]; then - echo -n -e "\r MGM+:\t\t\t\t\t${Font_Green}Yes${Font_Suffix}\n" - return - fi - - echo -n -e "\r MGM+:\t\t\t\t\t${Font_Red}Failed (Error: Unknown)${Font_Suffix}\n" -} - -function MediaUnlockTest_NLZIET() { - if [ "${USE_IPV6}" == 1 ]; then - echo -n -e "\r NLZIET:\t\t\t\t${Font_Red}IPv6 Is Not Currently Supported${Font_Suffix}\n" - return - fi - - local tmpresult=$(curl ${CURL_DEFAULT_OPTS} -s 'https://api.nlziet.nl/v7/stream/handshake/Widevine/Dash/VOD/rzIL9rb-TkSn-ek_wBmvaw?playerName=BitmovinWeb' -H 'accept: application/json, text/plain, */*' -H 'accept-language: en-US,en;q=0.9' -H 'authorization: Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6IkM4M0YzQUFGOTRCOTM0ODA2NkQwRjZDRTNEODhGQkREIiwidHlwIjoiYXQrand0In0.eyJuYmYiOjE3MTIxMjY0NTMsImV4cCI6MTcxMjE1NTI0OCwiaXNzIjoiaHR0cHM6Ly9pZC5ubHppZXQubmwiLCJhdWQiOiJhcGkiLCJjbGllbnRfaWQiOiJ0cmlwbGUtd2ViIiwic3ViIjoiMDAzMTZiNGEtMDAwMC0wMDAwLWNhZmUtZjFkZTA1ZGVlZmVlIiwiYXV0aF90aW1lIjoxNzEyMTI2NDUzLCJpZHAiOiJsb2NhbCIsImVtYWlsIjoibXVsdGkuZG5zMUBvdXRsb29rLmNvbSIsInVzZXJJZCI6IjMyMzg3MzAiLCJjdXN0b21lcklkIjoiMCIsImRldmljZUlkZW50aWZpZXIiOiJJZGVudGl6aWV0LTI0NWJiNmYzLWM2ZjktNDNjZS05ODhmLTgxNDc2OTcwM2E5OCIsImV4dGVybmFsVXNlcklkIjoiZTM1ZjdkMzktMjQ0ZC00ZTkzLWFkOTItNGFjYzVjNGY0NGNlIiwicHJvZmlsZUlkIjoiMjdDMzM3RjktOTRDRS00NjBDLTlBNjktMTlDNjlCRTYwQUIzIiwicHJvZmlsZUNvbG9yIjoiRkY0MjdDIiwicHJvZmlsZVR5cGUiOiJBZHVsdCIsIm5hbWUiOiJTdHJlYW1pbmciLCJqdGkiOiI4Q0M1QzYzNkJGRjg3MEE2REJBOERBNUMwQTk0RUZDRiIsImlhdCI6MTcxMjEyNjQ1Mywic2NvcGUiOlsiYXBpIiwib3BlbmlkIl0sImFtciI6WyJwcm9maWxlIiwicHdkIl19.bk-ziFPJM00bpE7TcgPmIYFFx-2Q5N3BkUzEvQ_dDMK9O1F9f7DEe-Qzmnb5ym7ChlnXwrCV3QyOOA24hu_gCrlNlD7-vI3XGZR-54zFD-F7cRDOoL-1-iO_10tmgwb5Io-svY0bn0EDYKeRxYYBi0w_3bFVFDM2CxxA6tWeBYIfN5rCSzBHd3RPPjYtqX-sogyh_5W_7KJ83GK5kpsywT3mz8q7Cs1mtKs9QA1-o01N0RvTxZAcfzsHg3-qGgLnvaAuZ_XqRK9kLWqJWeJTWKWtUI6OlPex22sY3keKFpfZnUtFv-BvkCM6tvbIlMZAClk3lhI8rMFAWDpUcbcS3w' -H 'nlziet-appname: WebApp' -H 'nlziet-appversion: 5.43.24' -H 'origin: https://app.nlziet.nl' -H 'referer: https://app.nlziet.nl/' -H "sec-ch-ua: ${UA_SEC_CH_UA}" -H 'sec-ch-ua-mobile: ?0' -H 'sec-ch-ua-platform: "Windows"' -H 'sec-fetch-dest: empty' -H 'sec-fetch-mode: cors' -H 'sec-fetch-site: same-site' --user-agent "${UA_BROWSER}") - if [ -z "$tmpresult" ]; then - echo -n -e "\r NLZIET:\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" - return - fi - - local isBlocked=$(echo "$tmpresult" | grep -i 'CountryNotAllowed') - local isOK=$(echo "$tmpresult" | grep -i 'streamSessionId') - - if [ -z "$isBlocked" ] && [ -z "$isOK" ]; then - echo -n -e "\r NLZIET:\t\t\t\t${Font_Red}Failed (Error: PAGE ERROR)${Font_Suffix}\n" - return - fi - if [ -n "$isBlocked" ]; then - echo -n -e "\r NLZIET:\t\t\t\t${Font_Red}No${Font_Suffix}\n" - return - fi - if [ -n "$isOK" ]; then - echo -n -e "\r NLZIET:\t\t\t\t${Font_Green}Yes${Font_Suffix}\n" - return - fi - - echo -n -e "\r NLZIET:\t\t\t\t${Font_Red}Failed (Error: Unknown)${Font_Suffix}\n" -} - -function MediaUnlockTest_videoland() { - local tmpresult=$(curl ${CURL_DEFAULT_OPTS} -s 'https://api.videoland.com/subscribe/videoland-account/graphql' -X POST -H 'host: api.videoland.com' -H "sec-ch-ua: ${UA_SEC_CH_UA}" -H 'apollographql-client-name: apollo_accounts_base' -H 'traceparent: 00-cab2dbd109bf1e003903ec43eb4c067d-623ef8e56174b85a-01' -H 'sec-ch-ua-mobile: ?0' -H 'accept: */*' -H 'sec-ch-ua-platform: "Windows"' -H 'origin: https://www.videoland.com' -H 'sec-fetch-site: same-site' -H 'sec-fetch-mode: cors' -H 'sec-fetch-dest: empty' -H 'referer: https://www.videoland.com/' -H 'accept-language: en-US,en;q=0.9' -H 'content-type: application/json' -d '{"operationName":"IsOnboardingGeoBlocked","variables":{},"query":"query IsOnboardingGeoBlocked {\n isOnboardingGeoBlocked\n}\n"}' --user-agent "${UA_BROWSER}") - if [ -z "$tmpresult" ]; then - echo -n -e "\r videoland:\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" - return - fi - - local result=$(echo "$tmpresult" | grep -woP '"isOnboardingGeoBlocked"\s{0,}:\s{0,}\K(false|true)') - case "$result" in - 'false') echo -n -e "\r videoland:\t\t\t\t${Font_Green}Yes${Font_Suffix}\n" ;; - 'true') echo -n -e "\r videoland:\t\t\t\t${Font_Red}No${Font_Suffix}\n" ;; - '') echo -n -e "\r videoland:\t\t\t\t${Font_Red}Failed (Error: PAGE ERROR)${Font_Suffix}\n" ;; - *) echo -n -e "\r videoland:\t\t\t\t${Font_Red}Failed (Error: ${result})${Font_Suffix}\n" ;; - esac -} - -function MediaUnlockTest_NPO_Start_Plus() { - local tmpresult=$(curl ${CURL_DEFAULT_OPTS} -sL 'https://www.npo.nl/start/api/domain/player-token?productId=LI_NL1_4188102' -H 'host: www.npo.nl' -H "sec-ch-ua: ${UA_SEC_CH_UA}" -H 'accept: application/json, text/plain, */*' -H 'sec-ch-ua-mobile: ?0' -H 'sec-ch-ua-platform: "Windows"' -H 'sec-fetch-site: same-origin' -H 'sec-fetch-mode: cors' -H 'sec-fetch-dest: empty' -H 'referer: https://www.npo.nl/start/live?channel=NPO1' -H 'accept-language: en-US,en;q=0.9' --user-agent "${UA_BROWSER}") - if [ -z "$tmpresult" ]; then - echo -n -e "\r NPO Start Plus:\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" - return - fi - - local token=$(echo "$tmpresult" | grep -woP '"token"\s{0,}:\s{0,}"\K[^"]+') - local result=$(curl ${CURL_DEFAULT_OPTS} -s 'https://prod.npoplayer.nl/stream-link' -w %{http_code} -o /dev/null -H 'accept: */*' -H "authorization: ${token}" -H 'content-type: application/json' -H 'origin: https://npo.nl' -H 'referer: https://npo.nl/' -H "sec-ch-ua: ${UA_SEC_CH_UA}" -H 'sec-ch-ua-mobile: ?0' -H 'sec-ch-ua-platform: "Windows"' -H 'sec-fetch-dest: empty' -H 'sec-fetch-mode: cors' -H 'sec-fetch-site: cross-site' --data-raw '{"profileName":"dash","drmType":"playready","referrerUrl":"https://npo.nl/start/live?channel=NPO1"}' -H 'accept-language: en-US,en;q=0.9' --user-agent "${UA_BROWSER}") - - case "$result" in - '000') echo -n -e "\r NPO Start Plus:\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" ;; - '200') echo -n -e "\r NPO Start Plus:\t\t\t${Font_Green}Yes${Font_Suffix}\n" ;; - '451') echo -n -e "\r NPO Start Plus:\t\t\t${Font_Red}No${Font_Suffix}\n" ;; - *) echo -n -e "\r NPO Start Plus:\t\t\t${Font_Red}Failed (Error: ${result})${Font_Suffix}\n" ;; - esac -} - -function MediaUnlockTest_RakutenTV() { - if [ "${USE_IPV6}" == 1 ]; then - echo -n -e "\r Rakuten TV:\t\t\t\t${Font_Red}IPv6 Is Not Currently Supported${Font_Suffix}\n" - return - fi - - local fakeUuid=$(gen_uuid) - local fakeIfaId=$(gen_uuid) - local tmpresult=$(curl ${CURL_DEFAULT_OPTS} -s 'https://gizmo.rakuten.tv/v3/me/start?device_identifier=web&device_stream_audio_quality=2.0&device_stream_hdr_type=NONE&device_stream_video_quality=FHD' -H 'accept: application/json, text/plain, */*' -H 'accept-language: en-US,en;q=0.9' -H 'content-type: application/json' -H 'origin: https://www.rakuten.tv' -H 'referer: https://www.rakuten.tv/' -H "sec-ch-ua: ${UA_SEC_CH_UA}" -H 'sec-ch-ua-mobile: ?0' -H 'sec-ch-ua-platform: "Windows"' -H 'sec-fetch-dest: empty' -H 'sec-fetch-mode: cors' -H 'sec-fetch-site: same-site' --data-raw '{"device_identifier":"web","device_metadata":{"app_version":"v5.5.30","audio_quality":"2.0","brand":"chrome","firmware":"XX.XX.XX","hdr":false,"model":"GENERIC","os":"Windows 10","sdk":"125.0.0","serial_number":"not implemented","trusted_uid":false,"uid":"824b3fe9-e080-4c33-912b-3f67d96f5f99","video_quality":"FHD","year":1970},"ifa_id":"4ac8a156-b857-4335-96c1-fa8930430092"}' --user-agent "${UA_BROWSER}") - - if [ -z "$tmpresult" ]; then - echo -n -e "\r Rakuten TV:\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" - return - fi - - local isBlocked=$(echo "$tmpresult" | grep -iE 'VPN|forbidden|is not available') - if [ -n "$isBlocked" ]; then - echo -n -e "\r Rakuten TV:\t\t\t\t${Font_Red}No${Font_Suffix}\n" - return - fi - - local region=$(echo "$tmpresult" | grep -woP '"iso3166_code"\s{0,}:\s{0,}"\K[^"]+') - if [ -z "$region" ]; then - echo -n -e "\r Rakuten TV:\t\t\t\t${Font_Red}Failed (Error: PAGE ERROR)${Font_Suffix}\n" - return - fi - - local isOK=$(echo "$tmpresult" | grep -i 'streaming_drm_types') - if [ -n "$isOK" ]; then - echo -n -e "\r Rakuten TV:\t\t\t\t${Font_Green}Yes (Region: ${region})${Font_Suffix}\n" - return - fi - - echo -n -e "\r Rakuten TV:\t\t\t\t${Font_Red}Failed (Error: Unknown)${Font_Suffix}\n" -} - -function MediaUnlockTest_MoviStarPlus() { - if [ "${USE_IPV6}" == 1 ]; then - echo -n -e "\r Movistar+:\t\t\t\t${Font_Red}IPv6 Is Not Currently Supported${Font_Suffix}\n" - return - fi - - local result=$(curl ${CURL_DEFAULT_OPTS} -s 'https://contratar.movistarplus.es/' -w %{http_code} -o /dev/null --user-agent "${UA_BROWSER}") - - case "$result" in - '000') echo -n -e "\r Movistar+:\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" ;; - '200') echo -n -e "\r Movistar+:\t\t\t\t${Font_Green}Yes${Font_Suffix}\n" ;; - '403') echo -n -e "\r Movistar+:\t\t\t\t${Font_Red}No${Font_Suffix}\n" ;; - *) echo -n -e "\r Movistar+:\t\t\t\t${Font_Red}Failed (Error: ${result})${Font_Suffix}\n" ;; - esac -} - -function MediaUnlockTest_Starz() { - if [ "${USE_IPV6}" == 1 ]; then - echo -n -e "\r Starz:\t\t\t\t\t${Font_Red}IPv6 Is Not Currently Supported${Font_Suffix}\n" - return - fi - - local authorization=$(curl ${CURL_DEFAULT_OPTS} -s 'https://www.starz.com/sapi/header/v1/starz/us/09b397fc9eb64d5080687fc8a218775b' -H "Referer: https://www.starz.com/us/en/" --user-agent "${UA_BROWSER}") - if [ -z "$authorization" ]; then - echo -n -e "\r Starz:\t\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" - return - fi - local tmpresult=$(curl ${CURL_DEFAULT_OPTS} -s 'https://auth.starz.com/api/v4/User/geolocation' -H "AuthTokenAuthorization: $authorization") - if [ -z "$tmpresult" ]; then - echo -n -e "\r Starz:\t\t\t\t\t${Font_Red}Failed (Network Connection 1)${Font_Suffix}\n" - return - fi - - local isAllowedAccess=$(echo "$tmpresult" | grep -woP '"isAllowedAccess"\s{0,}:\s{0,}\K(false|true)') - local isAllowedCountry=$(echo "$tmpresult" | grep -woP '"isAllowedCountry"\s{0,}:\s{0,}\K(false|true)') - local isKnownProxy=$(echo "$tmpresult" | grep -woP '"isKnownProxy"\s{0,}:\s{0,}\K(false|true)') - - if [ -z "$isAllowedAccess" ] || [ -z "$isAllowedCountry" ] || [ -z "$isKnownProxy" ]; then - echo -n -e "\r Starz:\t\t\t\t\t${Font_Red}Failed (Error: PAGE ERROR)${Font_Suffix}\n" - return - fi - if [ "$isAllowedAccess" == 'true' ] && [ "$isAllowedCountry" == 'true' ] && [ "$isKnownProxy" == 'false' ]; then - echo -n -e "\r Starz:\t\t\t\t\t${Font_Green}Yes${Font_Suffix}\n" - return - fi - if [ "$isAllowedAccess" == 'false' ]; then - echo -n -e "\r Starz:\t\t\t\t\t${Font_Red}No${Font_Suffix}\n" - return - fi - if [ "$isKnownProxy" == 'false' ]; then - echo -n -e "\r Starz:\t\t\t\t\t${Font_Red}No${Font_Suffix}\n" - return - fi - - echo -n -e "\r Starz:\t\t\t\t\t${Font_Red}Failed (Error: Unknown)${Font_Suffix}\n" -} - -function MediaUnlockTest_CanalPlus() { - if [ "${USE_IPV6}" == 1 ]; then - echo -n -e "\r Canal+:\t\t\t\t${Font_Red}IPv6 Is Not Currently Supported${Font_Suffix}\n" - return - fi - - local tmpresult=$(curl ${CURL_DEFAULT_OPTS} -fsL 'https://boutique-tunnel.canalplus.com/' -w '%{http_code}_TAG_%{url_effective}\n' -o dev/null --user-agent "${UA_BROWSER}") - local httpCode=$(echo "$tmpresult" | awk -F'_TAG_' '{print $1}') - if [ "$httpCode" == '000' ]; then - echo -n -e "\r Canal+:\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" - return - fi - - local urlEffective=$(echo "$tmpresult" | awk -F'_TAG_' '{print $2}') - local result=$(echo "$urlEffective" | grep -i 'other-country-blocking') - if [ -n "$result" ]; then - echo -n -e "\r Canal+:\t\t\t\t${Font_Red}No${Font_Suffix}\n" - return - fi - if [ "$httpCode" == '200' ]; then - echo -n -e "\r Canal+:\t\t\t\t${Font_Green}Yes${Font_Suffix}\n" - return - fi - - echo -n -e "\r Canal+:\t\t\t\t${Font_Red}Failed (Error: ${httpCode})${Font_Suffix}\n" -} - -function MediaUnlockTest_Sky_CH() { - local tmpresult=$(curl ${CURL_DEFAULT_OPTS} -fsL 'https://sky.ch/' -w '%{http_code}_TAG_%{url_effective}\n' -o /dev/null --user-agent "${UA_BROWSER}") - local httpCode=$(echo "$tmpresult" | awk -F'_TAG_' '{print $1}') - if [ "$httpCode" == '000' ]; then - echo -n -e "\r SKY CH:\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" - return - fi - - if [ "$httpCode" == '403' ]; then - echo -n -e "\r SKY CH:\t\t\t\t${Font_Red}No${Font_Suffix}\n" - return - fi - - local urlEffective=$(echo "$tmpresult" | awk -F'_TAG_' '{print $2}') - local result=$(echo "$urlEffective" | grep -i 'out-of-country') - if [ -n "$result" ]; then - echo -n -e "\r SKY CH:\t\t\t\t${Font_Red}No${Font_Suffix}\n" - return - fi - - if [ "$httpCode" == '200' ]; then - echo -n -e "\r SKY CH:\t\t\t\t${Font_Green}Yes${Font_Suffix}\n" - return - fi - - echo -n -e "\r SKY CH:\t\t\t\t${Font_Red}Failed (Error: ${httpCode})${Font_Suffix}\n" -} - -function MediaUnlockTest_CBCGem() { - if [ "${USE_IPV6}" == 1 ]; then - echo -n -e "\r CBC Gem:\t\t\t\t${Font_Red}IPv6 Is Not Currently Supported${Font_Suffix}\n" - return - fi - - local tmpresult=$(curl ${CURL_DEFAULT_OPTS} -s 'https://www.cbc.ca/g/stats/js/cbc-stats-top.js' --user-agent "${UA_BROWSER}") - if [ -z "$tmpresult" ]; then - echo -n -e "\r CBC Gem:\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" - return - fi - - local result=$(echo "$tmpresult" | grep -woP '"country"\s{0,}:\s{0,}"\K[^"]+') - if [ -z "${result}" ]; then - echo -n -e "\r CBC Gem:\t\t\t\t${Font_Red}Failed (Error: PAGE ERROR)${Font_Suffix}\n" - return - fi - - if [ "$result" == 'CA' ]; then - echo -n -e "\r CBC Gem:\t\t\t\t${Font_Green}Yes${Font_Suffix}\n" - return - fi - - echo -n -e "\r CBC Gem:\t\t\t\t${Font_Red}No${Font_Suffix}\n" -} - -function MediaUnlockTest_AcornTV() { - if [ "${USE_IPV6}" == 1 ]; then - echo -n -e "\r Acorn TV:\t\t\t\t${Font_Red}IPv6 Is Not Currently Supported${Font_Suffix}\n" - return - fi - - local tmpresult=$(curl ${CURL_DEFAULT_OPTS} -sL 'https://acorn.tv/' -H 'accept: */*;q=0.8,application/signed-exchange;v=b3;q=0.7' -H 'accept-language: en-US,en;q=0.9' -H "sec-ch-ua: ${UA_SEC_CH_UA}" -H 'sec-ch-ua-mobile: ?0' -H 'sec-ch-ua-platform: "Windows"' -H 'sec-fetch-dest: document' -H 'sec-fetch-mode: navigate' -H 'sec-fetch-site: none' -H 'sec-fetch-user: ?1' -H 'upgrade-insecure-requests: 1' --user-agent "${UA_BROWSER}") - if [ -z "$tmpresult" ]; then - echo -n -e "\r Acorn TV:\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" - return - fi - - local isBlocked=$(echo "$tmpresult" | grep -iE 'not yet available in your|unavailable in your') - local isOK=$(echo "$tmpresult" | grep -i 'signup.acorn.tv') - - if [ -z "$isBlocked" ] && [ -z "$isOK" ]; then - echo -n -e "\r Acorn TV:\t\t\t\t${Font_Red}Failed (Error: PAGE ERROR)${Font_Suffix}\n" - return - fi - if [ -n "$isBlocked" ]; then - echo -n -e "\r Acorn TV:\t\t\t\t${Font_Red}No${Font_Suffix}\n" - return - fi - if [ -n "$isOK" ]; then - echo -n -e "\r Acorn TV:\t\t\t\t${Font_Green}Yes${Font_Suffix}\n" - return - fi - - echo -n -e "\r Acorn TV:\t\t\t\t${Font_Red}Failed (Error: Unknown)${Font_Suffix}\n" -} - -function MediaUnlockTest_Crave() { - if [ "${USE_IPV6}" == 1 ]; then - echo -n -e "\r Crave:\t\t\t\t\t${Font_Red}IPv6 Is Not Currently Supported${Font_Suffix}\n" - return - fi - - local tmpresult=$(curl ${CURL_DEFAULT_OPTS} -s 'https://capi.9c9media.com/destinations/crave_atexace/platforms/desktop/playback/contents/2917721/contentPackages/6642701/manifest.mpd?action=reference&ssl=true&filter=fe&mca=false&uhd=false&mcv=false&hd=true&tpt=true&mta=true&stt=true&multilang=true' -H 'Content-Type: application/json' -H 'Origin: https://www.crave.ca' -H 'Referer: https://www.crave.ca/' -H 'accept-language: en-US,en;q=0.9' -H 'Sec-Fetch-Dest: empty' -H 'Sec-Fetch-Mode: cors' -H 'Sec-Fetch-Site: cross-site' -H "sec-ch-ua: ${UA_SEC_CH_UA}" -H 'sec-ch-ua-mobile: ?0' -H 'sec-ch-ua-platform: "Windows"' --user-agent "${UA_BROWSER}") - if [ -z "$tmpresult" ]; then - echo -n -e "\r Crave:\t\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" - return - fi - - local isOK=$(echo "$tmpresult" | grep -i 'video.9c9media.com') - local isBlocked=$(echo "$tmpresult" | grep -i 'Geo Constraint Restrictions') - - if [ -z "$isOK" ] && [ -z "$isBlocked" ]; then - echo -n -e "\r Crave:\t\t\t\t\t${Font_Red}Failed (Error: PAGE ERROR)${Font_Suffix}\n" - return - fi - if [ -n "$isBlocked" ]; then - echo -n -e "\r Crave:\t\t\t\t\t${Font_Red}No${Font_Suffix}\n" - return - fi - if [ -n "$isOK" ]; then - echo -n -e "\r Crave:\t\t\t\t\t${Font_Green}Yes${Font_Suffix}\n" - return - fi - - echo -n -e "\r Crave:\t\t\t\t\t${Font_Red}Failed (Error: Unknown)${Font_Suffix}\n" -} - -function MediaUnlockTest_Amediateka() { - if [ "${USE_IPV6}" == 1 ]; then - echo -n -e "\r Amediateka:\t\t\t\t${Font_Red}IPv6 Is Not Currently Supported${Font_Suffix}\n" - return - fi - - local tmpresult=$(curl ${CURL_DEFAULT_OPTS} -fsL 'https://www.amediateka.ru/' -w '%{http_code}_TAG_%{url_effective}\n' -o /dev/null --user-agent "${UA_BROWSER}") - local httpCode=$(echo "$tmpresult" | awk -F'_TAG_' '{print $1}') - if [ "$httpCode" == '000' ]; then - echo -n -e "\r Amediateka:\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" - return - fi - - local urlEffective=$(echo "$tmpresult" | awk -F'_TAG_' '{print $2}') - local result=$(echo "$urlEffective" | grep -i 'unavailable') - if [ -n "$result" ]; then - echo -n -e "\r Amediateka:\t\t\t\t${Font_Red}No${Font_Suffix}\n" - return - fi - if [ "$httpCode" == '503' ]; then - echo -n -e "\r Amediateka:\t\t\t\t${Font_Red}No${Font_Suffix}\n" - return - fi - if [ "$httpCode" == '200' ]; then - echo -n -e "\r Amediateka:\t\t\t\t${Font_Green}Yes${Font_Suffix}\n" - return - fi - - echo -n -e "\r Amediateka:\t\t\t\t${Font_Red}Failed (Error: ${httpCode})${Font_Suffix}\n" -} - -function MediaUnlockTest_MegogoTV() { - if [ "${USE_IPV6}" == 1 ]; then - echo -n -e "\r Megogo TV:\t\t\t\t${Font_Red}IPv6 Is Not Currently Supported${Font_Suffix}\n" - return - fi - - local tmpresult=$(curl ${CURL_DEFAULT_OPTS} -s 'https://megogo.net/en' --user-agent "${UA_BROWSER}") - if [ -z "$tmpresult" ]; then - echo -n -e "\r Megogo TV:\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" - return - fi - - local vpnDetected=$(echo "$tmpresult" | grep -i 'VPN') - if [ -n "$vpnDetected" ]; then - echo -n -e "\r Megogo TV:\t\t\t\t${Font_Red}No (VPN Detected)${Font_Suffix}\n" - return - fi - - echo -n -e "\r Megogo TV:\t\t\t\t${Font_Green}Yes${Font_Suffix}\n" -} - -function MediaUnlockTest_RaiPlay() { - if [ "${USE_IPV6}" == 1 ]; then - echo -n -e "\r Rai Play:\t\t\t\t${Font_Red}IPv6 Is Not Currently Supported${Font_Suffix}\n" - return - fi - - local tmpresult=$(curl ${CURL_DEFAULT_OPTS} -s 'https://mediapolisvod.rai.it/relinker/relinkerServlet.htm?cont=VxXwi7UcqjApssSlashbjsAghviAeeqqEEqualeeqqEEqual&output=64' --user-agent "${UA_BROWSER}") - if [ -z "$tmpresult" ]; then - echo -n -e "\r Rai Play:\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" - return - fi - - local result=$(echo "$tmpresult" | grep -woP '\K[^<]+') - local isBlocked=$(echo "$tmpresult" | grep -i 'video_no_available') - - if [ -z "$result" ]; then - echo -n -e "\r Rai Play:\t\t\t\t${Font_Red}Failed (Error: PAGE ERROR)${Font_Suffix}\n" - return - fi - if [ -n "$isBlocked" ]; then - echo -n -e "\r Rai Play:\t\t\t\t${Font_Red}No${Font_Suffix}\n" - return - fi - - case "$result" in - 'Y') echo -n -e "\r Rai Play:\t\t\t\t${Font_Green}Yes${Font_Suffix}\n" ;; - 'N') echo -n -e "\r Rai Play:\t\t\t\t${Font_Red}No${Font_Suffix}\n" ;; - *) echo -n -e "\r Rai Play:\t\t\t\t${Font_Red}Failed (Error: Unknown)${Font_Suffix}\n" ;; - esac -} - -function MediaUnlockTest_TVBAnywhere() { - if [ "${USE_IPV6}" == 1 ]; then - echo -n -e "\r TVBAnywhere+:\t\t\t\t${Font_Red}IPv6 Is Not Currently Supported${Font_Suffix}\n" - return - fi - - local tmpresult=$(curl ${CURL_DEFAULT_OPTS} -s 'https://uapisfm.tvbanywhere.com.sg/geoip/check/platform/android' -H 'accept: */*;q=0.8,application/signed-exchange;v=b3;q=0.7' -H 'accept-language: en-US,en;q=0.9' -H "sec-ch-ua: ${UA_SEC_CH_UA}" -H 'sec-ch-ua-mobile: ?0' -H 'sec-ch-ua-platform: "Windows"' -H 'sec-fetch-dest: document' -H 'sec-fetch-mode: navigate' -H 'sec-fetch-site: none' -H 'sec-fetch-user: ?1' -H 'upgrade-insecure-requests: 1' --user-agent "${UA_BROWSER}") - if [ -z "$tmpresult" ]; then - echo -n -e "\r TVBAnywhere+:\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" - return - fi - - local result=$(echo "$tmpresult" | grep -woP '"allow_in_this_country"\s{0,}:\s{0,}\K(false|true)') - if [ -z "$result" ]; then - echo -n -e "\r TVBAnywhere+:\t\t\t\t${Font_Red}Failed (Error: PAGE ERROR)${Font_Suffix}\n" - return - fi - - case "$result" in - 'true') echo -n -e "\r TVBAnywhere+:\t\t\t\t${Font_Green}Yes${Font_Suffix}\n" ;; - 'false') echo -n -e "\r TVBAnywhere+:\t\t\t\t${Font_Red}No${Font_Suffix}\n" ;; - *) echo -n -e "\r TVBAnywhere+:\t\t\t\t${Font_Red}Failed (Error: Unknown)${Font_Suffix}\n" ;; - esac -} - -function GameTest_ProjectSekai() { - if [ "${USE_IPV6}" == 1 ]; then - echo -n -e "\r Project Sekai: Colorful Stage:\t\t${Font_Red}IPv6 Is Not Currently Supported${Font_Suffix}\n" - return - fi - - local result=$(curl ${CURL_DEFAULT_OPTS} -fsL 'https://game-version.sekai.colorfulpalette.org/1.8.1/3ed70b6a-8352-4532-b819-108837926ff5' -w %{http_code} -o /dev/null -H "User-Agent: pjsekai/48 CFNetwork/1240.0.4 Darwin/20.6.0") - - case "$result" in - '000') echo -n -e "\r Project Sekai: Colorful Stage:\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" ;; - '200') echo -n -e "\r Project Sekai: Colorful Stage:\t\t${Font_Green}Yes${Font_Suffix}\n" ;; - '403') echo -n -e "\r Project Sekai: Colorful Stage:\t\t${Font_Red}No${Font_Suffix}\n" ;; - *) echo -n -e "\r Project Sekai: Colorful Stage:\t\t${Font_Red}Failed (Error: ${result})${Font_Suffix}\n" ;; - esac -} - -function GameTest_KonosubaFD() { - if [ "${USE_IPV6}" == 1 ]; then - echo -n -e "\r Konosuba Fantastic Days:\t\t${Font_Red}IPv6 Is Not Currently Supported${Font_Suffix}\n" - return - fi - - local result=$(curl ${CURL_DEFAULT_OPTS} -fsL 'https://api.konosubafd.jp/api/masterlist' -X POST -w %{http_code} -o /dev/null -H "User-Agent: pj0007/212 CFNetwork/1240.0.4 Darwin/20.6.0") - - case "$result" in - '000') echo -n -e "\r Konosuba Fantastic Days:\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" ;; - '200') echo -n -e "\r Konosuba Fantastic Days:\t\t${Font_Green}Yes${Font_Suffix}\n" ;; - '403') echo -n -e "\r Konosuba Fantastic Days:\t\t${Font_Red}No${Font_Suffix}\n" ;; - *) echo -n -e "\r Konosuba Fantastic Days:\t\t${Font_Red}Failed (Error: ${result})${Font_Suffix}\n" ;; - esac -} - -function MediaUnlockTest_NBATV() { - local tmpresult=$(curl ${CURL_DEFAULT_OPTS} -sL 'https://www.nba.com/watch/' --user-agent "${UA_BROWSER}") - if [ -z "$tmpresult" ]; then - echo -n -e "\r NBA TV:\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" - return - fi - - local result=$(echo "$tmpresult" | grep -i 'Service is not available in your region') - - if [ -z "$result" ]; then - echo -n -e "\r NBA TV:\t\t\t\t${Font_Green}Yes${Font_Suffix}\n" - return - fi - - echo -n -e "\r NBA TV:\t\t\t\t${Font_Red}No${Font_Suffix}\n" -} - -function MediaUnlockTest_Directv() { - local result=$(curl ${CURL_DEFAULT_OPTS} -fsL 'https://stream.directv.com/watchnow' -w %{http_code} -o /dev/null -H 'accept: */*;q=0.8,application/signed-exchange;v=b3;q=0.7' -H 'accept-language: en-US,en;q=0.9' -H "sec-ch-ua: ${UA_SEC_CH_UA}" -H 'sec-ch-ua-mobile: ?0' -H 'sec-ch-ua-platform: "Windows"' -H 'sec-fetch-dest: document' -H 'sec-fetch-mode: navigate' -H 'sec-fetch-site: none' -H 'sec-fetch-user: ?1' --user-agent "${UA_BROWSER}") - - case "$result" in - '000') echo -n -e "\r Directv Stream:\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" ;; - '200') echo -n -e "\r Directv Stream:\t\t\t${Font_Green}Yes${Font_Suffix}\n" ;; - '403') echo -n -e "\r Directv Stream:\t\t\t${Font_Red}No${Font_Suffix}\n" ;; - *) echo -n -e "\r Directv Stream:\t\t\t${Font_Red}Failed (Error: ${result})${Font_Suffix}\n" ;; - esac -} - -function RegionTest_NetflixCDN() { - local tmpresult=$(curl ${CURL_DEFAULT_OPTS} -s 'https://api.fast.com/netflix/speedtest/v2?https=true&token=YXNkZmFzZGxmbnNkYWZoYXNkZmhrYWxm&urlCount=1' -w '_TAG_%{http_code}' --user-agent "${UA_BROWSER}") - local httpCode=$(echo "$tmpresult" | grep '_TAG_' | awk -F'_TAG_' '{print $2}') - local respContent=$(echo "$tmpresult" | awk -F'_TAG_' '{print $1}') - if [ "$httpCode" == '000' ]; then - echo -n -e "\r Netflix Preferred CDN:\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" - return - fi - if [ "$httpCode" == '403' ]; then - echo -n -e "\r Netflix Preferred CDN:\t\t\t${Font_Red}Failed (IP Banned By Netflix)${Font_Suffix}\n" - return - fi - - local cdnDomain=$(echo "$respContent" | grep -woP '"url":"\K[^"]+' | awk -F'[/:]' '{print $4}') - if [ -z "$cdnDomain" ]; then - echo -n -e "\r Netflix Preferred CDN:\t\t\t${Font_Red}Failed (Error: PAGE ERROR)${Font_Suffix}\n" - return - fi - - if [ "${USE_IPV6}" == 1 ]; then - local cdnIP=$(resolve_ip_address "$cdnDomain" 'AAAA') - else - local cdnIP=$(resolve_ip_address "$cdnDomain" 'A') - fi - - if [ -z "$cdnIP" ]; then - echo -n -e "\r Netflix Preferred CDN:\t\t\t${Font_Red}Failed (CDN IP Not Found)${Font_Suffix}\n" - return - fi - - if ! validate_intranet "$cdnIP"; then - local tmpresult1=$(curl ${CURL_DEFAULT_OPTS} -s "https://api.ip.sb/geoip/${cdnIP}" -H 'accept: */*;q=0.8,application/signed-exchange;v=b3;q=0.7' -H 'accept-language: en-US,en;q=0.9' -H "sec-ch-ua: ${UA_SEC_CH_UA}" -H 'sec-ch-ua-mobile: ?0' -H 'sec-ch-ua-platform: "Windows"' -H 'sec-fetch-dest: document' -H 'sec-fetch-mode: navigate' -H 'sec-fetch-site: none' -H 'sec-fetch-user: ?1' -H 'upgrade-insecure-requests: 1' --user-agent "${UA_BROWSER}") - if [ -z "$tmpresult1" ]; then - echo -n -e "\r Netflix Preferred CDN:\t\t\t${Font_Red}Failed (Network Connection 1)${Font_Suffix}\n" - return - fi - - local cdnISP=$(echo "$tmpresult1" | grep -woP '"isp"\s{0,}:\s{0,}"\K[^"]+') - if [ -z "$cdnISP" ]; then - echo -n -e "\r Netflix Preferred CDN:\t\t\t${Font_Red}Failed (Error: No ISP Info Found)${Font_Suffix}\n" - return - fi - else - cdnISP='Hidden by a VPN' - fi - - local iata=$(echo "$cdnDomain" | cut -f3 -d'-' | sed 's/.\{3\}$//' | tr a-z A-Z) - - # local IATACODE2=$(curl ${CURL_DEFAULT_OPTS} -s "https://raw.githubusercontent.com/lmc999/RegionRestrictionCheck/main/reference/IATACODE2.txt" 2>&1) - local isIataFound1=$(echo "$IATACODE" | grep -w "$iata") - local isIataFound2=$(echo "$IATACODE2" | grep -w "$iata") - - if [ -n "$isIataFound1" ]; then - local location=$(echo "$IATACODE" | grep -w "$iata" | awk -F'|' '{print $1}' | awk '{$1=$1; print}') - fi - if [ -z "$isIataFound1" ] && [ -n "$isIataFound2" ]; then - local location=$(echo "$IATACODE2" | grep -w "$iata" | awk -F',' '{print $2}' | awk '{$1=$1; print}' | tr A-Z a-z | sed 's/\b[a-z]/\U&/g') - fi - - if [ -z "$location" ]; then - echo -n -e "\r Netflix Preferred CDN:\t\t\t${Font_Red}Failed (Error: IATA CODE ERROR)${Font_Suffix}\n" - return - fi - - if [ "$cdnISP" == 'Netflix Streaming Services' ]; then - echo -n -e "\r Netflix Preferred CDN:\t\t\t${Font_Green}${location}${Font_Suffix}\n" - return - else - echo -n -e "\r Netflix Preferred CDN:\t\t\t${Font_Yellow}[${cdnISP}] in [${location}]${Font_Suffix}\n" - return - fi - - echo -n -e "\r Netflix Preferred CDN:\t\t\t${Font_Red}Failed (Error: Unknown)${Font_Suffix}\n" -} - -function MediaUnlockTest_SkyGo() { - if [ "${USE_IPV6}" == 1 ]; then - echo -n -e "\r Sky Go:\t\t\t\t${Font_Red}IPv6 Is Not Currently Supported${Font_Suffix}\n" - return - fi - - local tmpresult=$(curl ${CURL_DEFAULT_OPTS} -sL 'https://skyid.sky.com/authorise/skygo?response_type=token&client_id=sky&appearance=compact&redirect_uri=skygo://auth' --user-agent "${UA_BROWSER}") - if [ -z "$tmpresult" ]; then - echo -n -e "\r Sky Go:\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" - return - fi - - local isSignIn=$(echo "$tmpresult" | grep -E "Sign in|skygoSignin") - if [ -n "$isSignIn" ]; then - echo -n -e "\r Sky Go:\t\t\t\t${Font_Green}Yes${Font_Suffix}\n" - return - fi - - local isBlocked=$(echo "$tmpresult" | grep -E "Access Denied.*You don't have permission to access") - if [ -n "$isBlocked" ]; then - echo -n -e "\r Sky Go:\t\t\t\t${Font_Red}No${Font_Suffix}\n" - return - fi - - echo -n -e "\r Sky Go:\t\t\t\t${Font_Red}Failed (Error: Unknown)${Font_Suffix}\n" -} - -function MediaUnlockTest_DirecTVGO() { - if [ "${USE_IPV6}" == 1 ]; then - echo -n -e "\r DirecTV Go:\t\t\t\t${Font_Red}IPv6 Is Not Currently Supported${Font_Suffix}\n" - return - fi - - local tmpresult=$(curl ${CURL_DEFAULT_OPTS} -sL 'https://www.directvgo.com/registrarse' -w '%{http_code}_TAG_%{url_effective}\n' -o /dev/null --user-agent "${UA_BROWSER}") - local httpCode=$(echo "$tmpresult" | awk -F'_TAG_' '{print $1}') - if [ "$httpCode" == '000' ]; then - echo -n -e "\r DirecTV Go:\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" - return - fi - - local urlEffective=$(echo "$tmpresult" | awk -F'_TAG_' '{print $2}') - local isForbidden=$(echo "$urlEffective" | grep 'proximamente') - local region=$(echo "$urlEffective" | cut -f4 -d'/' | tr a-z A-Z) - - if [ -n "$isForbidden" ]; then - echo -n -e "\r DirecTV Go:\t\t\t\t${Font_Red}No${Font_Suffix}\n" - return - fi - if [ "$httpCode" == '403' ]; then - echo -n -e "\r DirecTV Go:\t\t\t\t${Font_Red}No${Font_Suffix}\n" - return - fi - if [ "$httpCode" == '200' ]; then - echo -n -e "\r DirecTV Go:\t\t\t\t${Font_Green}Yes (Region: ${region})${Font_Suffix}\n" - return - fi - - echo -n -e "\r DirecTV Go:\t\t\t\t${Font_Red}Failed (Error: ${httpCode})${Font_Suffix}\n" -} - -function MediaUnlockTest_DAM() { - if [ "${USE_IPV6}" == 1 ]; then - echo -n -e "\r Karaoke@DAM:\t\t\t\t${Font_Red}IPv6 Is Not Currently Supported${Font_Suffix}\n" - return - fi - - local result=$(curl ${CURL_DEFAULT_OPTS} -fsL 'http://cds1.clubdam.com/vhls-cds1/site/xbox/sample_1.mp4.m3u8' -w %{http_code} -o /dev/null --user-agent "${UA_BROWSER}") - - case "$result" in - '000') echo -n -e "\r Karaoke@DAM:\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" ;; - '200') echo -n -e "\r Karaoke@DAM:\t\t\t\t${Font_Green}Yes${Font_Suffix}\n" ;; - '403') echo -n -e "\r Karaoke@DAM:\t\t\t\t${Font_Red}No${Font_Suffix}\n" ;; - *) echo -n -e "\r Karaoke@DAM:\t\t\t\t${Font_Red}Failed (Error: ${result})${Font_Suffix}\n" ;; - esac -} - -function MediaUnlockTest_DiscoveryPlus() { - if [ "${USE_IPV6}" == 1 ]; then - echo -n -e "\r Discovery+:\t\t\t\t${Font_Red}IPv6 Is Not Currently Supported${Font_Suffix}\n" - return - fi - - # 取得 API 网址 - local tmpresult=$(curl ${CURL_DEFAULT_OPTS} -s 'https://global-prod.disco-api.com/bootstrapInfo' -H 'accept: */*' -H 'accept-language: en-US,en;q=0.9' -H 'origin: https://www.discoveryplus.com' -H 'referer: https://www.discoveryplus.com/' -H "sec-ch-ua: ${UA_SEC_CH_UA}" -H 'sec-ch-ua-mobile: ?0' -H 'sec-ch-ua-platform: "Windows"' -H 'sec-fetch-dest: empty' -H 'sec-fetch-mode: cors' -H 'sec-fetch-site: cross-site' -H 'x-disco-client: WEB:UNKNOWN:dplus_us:2.46.0' -H 'x-disco-params: bid=dplus,hn=www.discoveryplus.com' --user-agent "${UA_BROWSER}") - if [ -z "$tmpresult" ]; then - echo -n -e "\r Discovery+:\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" - return - fi - - local baseApiUrl=$(echo "$tmpresult" | grep -woP '"baseApiUrl"\s{0,}:\s{0,}"\K[^"]+') - local realm=$(echo "$tmpresult" | grep -woP '"realm"\s{0,}:\s{0,}"\K[^"]+') - - if [ -z "$baseApiUrl" ] || [ -z "$realm" ]; then - echo -n -e "\r Discovery+:\t\t\t\t${Font_Red}Failed (Error: PAGE ERROR)${Font_Suffix}\n" - return - fi - - if [ "$realm" == 'dplusapac' ]; then - echo -n -e "\r Discovery+:\t\t\t\t${Font_Red}No (Not Yet Available in Asia Pacific)${Font_Suffix}\n" - return - fi - - local fakeDeviceId=$(gen_uuid | md5sum | cut -f1 -d' ') - - local tmpresult1=$(curl ${CURL_DEFAULT_OPTS} -s "${baseApiUrl}/token?deviceId=${fakeDeviceId}&realm=${realm}&shortlived=true" -H 'accept: */*' -H 'accept-language: en-US,en;q=0.9' -H 'origin: https://www.discoveryplus.com' -H 'referer: https://www.discoveryplus.com/' -H "sec-ch-ua: ${UA_SEC_CH_UA}" -H 'sec-ch-ua-mobile: ?0' -H 'sec-ch-ua-platform: "Windows"' -H 'sec-fetch-dest: empty' -H 'sec-fetch-mode: cors' -H 'sec-fetch-site: same-site' -H "x-device-info: dplus_us/2.46.0 (desktop/desktop; Windows/NT 10.0; ${fakeDeviceId})" -H 'x-disco-client: WEB:UNKNOWN:dplus_us:2.46.0' -H "x-disco-params: realm=${realm},bid=dplus,hn=www.discoveryplus.com,hth=,features=ar" --user-agent "${UA_BROWSER}") - if [ -z "$tmpresult1" ]; then - echo -n -e "\r Discovery+:\t\t\t\t${Font_Red}Failed (Network Connection 1)${Font_Suffix}\n" - return - fi - - local token=$(echo "$tmpresult1" | grep -woP '"token"\s{0,}:\s{0,}"\K[^"]+') - if [ -z "$token" ]; then - echo -n -e "\r Discovery+:\t\t\t\t${Font_Red}Failed (Error: PAGE ERROR 1)${Font_Suffix}\n" - return - fi - - local tmpresult2=$(curl ${CURL_DEFAULT_OPTS} -s "${baseApiUrl}/cms/routes/tabbed-home?include=default&decorators=viewingHistory,isFavorite,playbackAllowed,contentAction" -H 'accept: */*' -H 'accept-language: en-US,en;q=0.9' -H 'origin: https://www.discoveryplus.com' -H 'referer: https://www.discoveryplus.com/' -H "sec-ch-ua: ${UA_SEC_CH_UA}" -H 'sec-ch-ua-mobile: ?0' -H 'sec-ch-ua-platform: "Windows"' -H 'sec-fetch-dest: empty' -H 'sec-fetch-mode: cors' -H 'sec-fetch-site: same-site' -H 'x-disco-client: WEB:UNKNOWN:dplus_us:2.46.0' -H 'x-disco-params: realm=dplay,bid=dplus,hn=www.discoveryplus.com,hth=,features=ar' -b "st=${token}" --user-agent "${UA_BROWSER}") - if [ -z "$tmpresult2" ]; then - echo -n -e "\r Discovery+:\t\t\t\t${Font_Red}Failed (Network Connection 2)${Font_Suffix}\n" - return - fi - - local isBlocked=$(echo "$tmpresult2" | grep -iE 'is unavailable in your|not yet available') - local isOK=$(echo "$tmpresult2" | grep -i 'relationships') - local region=$(echo "$tmpresult2" | grep -woP '"mainTerritoryCode"\s{0,}:\s{0,}"\K[^"]+' | tr a-z A-Z) - - if [ -z "$isBlocked" ] && [ -z "$isOK" ]; then - echo -n -e "\r Discovery+:\t\t\t\t${Font_Red}Failed (Error: PAGE ERROR 2)${Font_Suffix}\n" - return - fi - - if [ -n "$isBlocked" ]; then - echo -n -e "\r Discovery+:\t\t\t\t${Font_Red}No${Font_Suffix}\n" - return - fi - - if [ -n "$isOK" ]; then - echo -n -e "\r Discovery+:\t\t\t\t${Font_Green}Yes (Region: ${region})${Font_Suffix}\n" - return - fi - - echo -n -e "\r Discovery+:\t\t\t\t${Font_Red}Failed (Error: Unknown)${Font_Suffix}\n" -} - -function MediaUnlockTest_ESPNPlus() { - local espnCookies=$(echo "$MEDIA_COOKIE" | sed -n '11p') - local tokenContent=$(curl ${CURL_DEFAULT_OPTS} -s 'https://espn.api.edge.bamgrid.com/token' -X POST -H "authorization: Bearer ZXNwbiZicm93c2VyJjEuMC4w.ptUt7QxsteaRruuPmGZFaJByOoqKvDP2a5YkInHrc7c" -d "$espnCookies" --user-agent "${UA_BROWSER}") - if [ -z "$tokenContent" ]; then - echo -n -e "\r ESPN+:${Font_SkyBlue}[Sponsored by Jam]${Font_Suffix}\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" - return - fi - - local isBlocked=$(echo "$tokenContent" | grep 'forbidden-location') - local is403=$(echo "$tokenContent" | grep '403 ERROR') - - if [ -n "$isBlocked" ] || [ -n "$is403" ]; then - echo -n -e "\r ESPN+:${Font_SkyBlue}[Sponsored by Jam]${Font_Suffix}\t\t${Font_Red}No${Font_Suffix}\n" - return - fi - - local fakeContent=$(echo "$MEDIA_COOKIE" | sed -n '10p') - local refreshToken=$(echo "$tokenContent" | grep -woP '"refresh_token"\s{0,}:\s{0,}"\K[^"]+') - if [ -z "$refreshToken" ]; then - echo -n -e "\r ESPN+:${Font_SkyBlue}[Sponsored by Jam]${Font_Suffix}\t\t${Font_Red}Failed (Error: PAGE ERROR)${Font_Suffix}\n" - return - fi - - local espnContent=$(echo "$fakeContent" | sed "s/ILOVESTAR/${refreshToken}/g") - local tmpresult=$(curl ${CURL_DEFAULT_OPTS} -sL 'https://espn.api.edge.bamgrid.com/graph/v1/device/graphql' -X POST -H "authorization: ZXNwbiZicm93c2VyJjEuMC4w.ptUt7QxsteaRruuPmGZFaJByOoqKvDP2a5YkInHrc7c" -d "$espnContent" --user-agent "${UA_BROWSER}") - if [ -z "$tmpresult" ]; then - echo -n -e "\r ESPN+:${Font_SkyBlue}[Sponsored by Jam]${Font_Suffix}\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" - return - fi - - local region=$(echo "$tmpresult" | grep -woP '"countryCode"\s{0,}:\s{0,}"\K[^"]+') - local inSupportedLocation=$(echo "$tmpresult" | grep -woP '"inSupportedLocation"\s{0,}:\s{0,}\K(false|true)') - - if [ -z "$region" ] || [ -z "$inSupportedLocation" ]; then - echo -n -e "\r ESPN+:${Font_SkyBlue}[Sponsored by Jam]${Font_Suffix}\t\t${Font_Red}Failed (Error: PAGE ERROR)${Font_Suffix}\n" - return - fi - - if [ "$region" == 'US' ] && [ "$inSupportedLocation" == 'true' ]; then - echo -n -e "\r ESPN+:${Font_SkyBlue}[Sponsored by Jam]${Font_Suffix}\t\t${Font_Green}Yes${Font_Suffix}\n" - return - fi - - echo -n -e "\r ESPN+:${Font_SkyBlue}[Sponsored by Jam]${Font_Suffix}\t\t${Font_Red}No${Font_Suffix}\n" -} - -function MediaUnlockTest_Stan() { - if [ "${USE_IPV6}" == 1 ]; then - echo -n -e "\r Stan:\t\t\t\t\t${Font_Red}IPv6 Is Not Currently Supported${Font_Suffix}\n" - return - fi - - local tmpresult=$(curl ${CURL_DEFAULT_OPTS} -s 'https://api.stan.com.au/login/v1/sessions/web/account' -X POST -w '_TAG_%{http_code}' --user-agent "${UA_BROWSER}") - local httpCode=$(echo "$tmpresult" | grep '_TAG_' | awk -F'_TAG_' '{print $2}') - local respContent=$(echo "$tmpresult" | awk -F'_TAG_' '{print $1}') - if [ "$httpCode" == '000' ]; then - echo -n -e "\r Stan:\t\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" - return - fi - if [ "$httpCode" == '403' ]; then - echo -n -e "\r Stan:\t\t\t\t\t${Font_Red}Failed (Error: PAGE ERROR)${Font_Suffix}\n" - return - fi - if [ "$httpCode" == '411' ]; then - echo -n -e "\r Stan:\t\t\t\t\t${Font_Red}Failed (Error: PAGE ERROR)${Font_Suffix}\n" - return - fi - - if [ -z "$respContent" ]; then - echo -n -e "\r Stan:\t\t\t\t\t${Font_Red}Failed (Error: PAGE ERROR)${Font_Suffix}\n" - return - fi - - local result=$(echo "$respContent" | grep -i 'VPNDetected') - if [ -z "$result" ]; then - echo -n -e "\r Stan:\t\t\t\t\t${Font_Green}Yes${Font_Suffix}\n" - return - fi - - echo -n -e "\r Stan:\t\t\t\t\t${Font_Red}No${Font_Suffix}\n" -} - -function MediaUnlockTest_Binge() { - local result=$(curl ${CURL_DEFAULT_OPTS} -fsL 'https://auth.streamotion.com.au' -w %{http_code} -o /dev/null --user-agent "${UA_BROWSER}") - - case "$result" in - '000') echo -n -e "\r Binge:\t\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" ;; - '200') echo -n -e "\r Binge:\t\t\t\t\t${Font_Green}Yes${Font_Suffix}\n" ;; - '403') echo -n -e "\r Binge:\t\t\t\t\t${Font_Red}No${Font_Suffix}\n" ;; - *) echo -n -e "\r Binge:\t\t\t\t\t${Font_Red}Failed (Error: ${result})${Font_Suffix}\n" ;; - esac -} - -function MediaUnlockTest_Docplay() { - if [ "${USE_IPV6}" == 1 ]; then - echo -n -e "\r Docplay:\t\t\t\t${Font_Red}IPv6 Is Not Currently Supported${Font_Suffix}\n" - return - fi - - local tmpresult=$(curl ${CURL_DEFAULT_OPTS} -fsL 'https://www.docplay.com/subscribe' -w '%{http_code}_TAG_%{url_effective}\n' -o /dev/null --user-agent "${UA_BROWSER}") - local httpCode=$(echo "$tmpresult" | awk -F'_TAG_' '{print $1}') - if [ "$httpCode" == '000' ]; then - echo -n -e "\r Docplay:\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" - return - fi - - local urlEffective=$(echo "$tmpresult" | awk -F'_TAG_' '{print $2}') - local isBlocked=$(echo "$urlEffective" | grep -i 'geoblocked') - - if [ -n "$isBlocked" ]; then - echo -n -e "\r Docplay:\t\t\t\t${Font_Red}No${Font_Suffix}\n" - return - fi - if [ "$httpCode" == '403' ]; then - echo -n -e "\r Docplay:\t\t\t\t${Font_Red}No${Font_Suffix}\n" - return - fi - if [ "$httpCode" == '200' ]; then - echo -n -e "\r Docplay:\t\t\t\t${Font_Green}Yes${Font_Suffix}\n" - return - fi - - echo -n -e "\r Docplay:\t\t\t\t${Font_Red}Failed (Error: ${httpCode})${Font_Suffix}\n" -} - -function MediaUnlockTest_OptusSports() { - local result=$(curl ${CURL_DEFAULT_OPTS} -fsL 'https://sport.optus.com.au/api/userauth/validate/web/username/restriction.check@gmail.com' -w %{http_code} -o /dev/null --user-agent "${UA_BROWSER}") - - case "$result" in - '000') echo -n -e "\r Optus Sports:\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" ;; - '200') echo -n -e "\r Optus Sports:\t\t\t\t${Font_Green}Yes${Font_Suffix}\n" ;; - '403') echo -n -e "\r Optus Sports:\t\t\t\t${Font_Red}No${Font_Suffix}\n" ;; - *) echo -n -e "\r Optus Sports:\t\t\t\t${Font_Red}Failed (Error: ${result})${Font_Suffix}\n" ;; - esac -} - -function MediaUnlockTest_KayoSports() { - local result=$(curl ${CURL_DEFAULT_OPTS} -fsL 'https://billingapi.streamotion.com.au/v2/offers/kayo/' -H 'accept: */*' -H 'accept-language: en-US,en;q=0.9' -H 'origin: https://kayosports.com.au' -H 'referer: https://kayosports.com.au/' -H "sec-ch-ua: ${SEC_CH_UA}" -H 'sec-ch-ua-mobile: ?0' -H 'sec-ch-ua-platform: "Windows"' -H 'sec-fetch-dest: empty' -H 'sec-fetch-mode: cors' -H 'sec-fetch-site: cross-site' -w %{http_code} -o /dev/null --user-agent "${UA_BROWSER}") - - case "$result" in - '000') echo -n -e "\r Kayo Sports:\t\t\t\t${Font_Red}Failed${Font_Suffix}\n" ;; - '200') echo -n -e "\r Kayo Sports:\t\t\t\t${Font_Green}Yes${Font_Suffix}\n" ;; - '403') echo -n -e "\r Kayo Sports:\t\t\t\t${Font_Red}No${Font_Suffix}\n" ;; - *) echo -n -e "\r Kayo Sports:\t\t\t\t${Font_Red}Failed (Error: ${result})${Font_Suffix}\n" ;; - esac -} - -function MediaUnlockTest_NeonTV() { - if [ "${USE_IPV6}" == 1 ]; then - echo -n -e "\r Neon TV:\t\t\t\t${Font_Red}IPv6 Is Not Currently Supported${Font_Suffix}\n" - return - fi - - local neonHeader=$(echo "$MEDIA_COOKIE" | sed -n '12p') - local neonContent=$(echo "$MEDIA_COOKIE" | sed -n '13p') - local tmpresult=$(curl ${CURL_DEFAULT_OPTS} -s 'https://api.neontv.co.nz/api/client/gql?' -X POST -H "content-type: application/json" -H "$neonHeader" -d "$neonContent" -w '_TAG_%{http_code}' --user-agent "${UA_BROWSER}") - - local httpCode=$(echo "$tmpresult" | grep '_TAG_' | awk -F'_TAG_' '{print $2}') - local respContent=$(echo "$tmpresult" | awk -F'_TAG_' '{print $1}') - if [ "$httpCode" == '000' ]; then - echo -n -e "\r Neon TV:\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" - return - fi - if [ "$httpCode" == '403' ]; then - echo -n -e "\r Neon TV:\t\t\t\t${Font_Red}No${Font_Suffix}\n" - return - fi - - if [ -z "$respContent" ]; then - echo -n -e "\r Neon TV:\t\t\t\t${Font_Red}Failed (Error: PAGE ERROR)${Font_Suffix}\n" - return - fi - - local result=$(echo "$respContent" | grep -i 'RESTRICTED_GEOLOCATION') - if [ -z "$result" ]; then - echo -n -e "\r Neon TV:\t\t\t\t${Font_Green}Yes${Font_Suffix}\n" - return - fi - - echo -n -e "\r Neon TV:\t\t\t\t${Font_Red}No${Font_Suffix}\n" -} - -function MediaUnlockTest_SkyGONZ() { - if [ "${USE_IPV6}" == 1 ]; then - echo -n -e "\r SkyGo NZ:\t\t\t\t${Font_Red}IPv6 Is Not Currently Supported${Font_Suffix}\n" - return - fi - - local result=$(curl ${CURL_DEFAULT_OPTS} -fsL 'https://login.sky.co.nz/authorize?audience=https%3A%2F%2Fapi.sky.co.nz&client_id=dXhXjmK9G90mOX3B02R1kV7gsC4bp8yx&redirect_uri=https%3A%2F%2Fwww.skygo.co.nz&connection=Sky-Internal-Connection&scope=openid%20profile%20email%20offline_access&response_type=code&response_mode=query&state=OXg3QjBGTHpoczVvdG1fRnJFZXVoNDlPc01vNzZjWjZsT3VES2VhN1dDWA%3D%3D&nonce=OEdvci4xZHBHU3VLb1M0T1JRbTZ6WDZJVGQ3R3J0TTdpTndvWjNMZDM5ZA%3D%3D&code_challenge=My5fiXIl-cX79KOUe1yDFzA6o2EOGpJeb6w1_qeNkpI&code_challenge_method=S256&auth0Client=eyJuYW1lIjoiYXV0aDAtcmVhY3QiLCJ2ZXJzaW9uIjoiMS4zLjAifQ%3D%3D' -w %{http_code} -o /dev/null --user-agent "${UA_BROWSER}") - - case "$result" in - '000') echo -n -e "\r SkyGo NZ:\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" ;; - '200') echo -n -e "\r SkyGo NZ:\t\t\t\t${Font_Green}Yes${Font_Suffix}\n" ;; - '403') echo -n -e "\r SkyGo NZ:\t\t\t\t${Font_Red}No${Font_Suffix}\n" ;; - *) echo -n -e "\r SkyGo NZ:\t\t\t\t${Font_Red}Failed (Error: ${result})${Font_Suffix}\n" ;; - esac -} - -function MediaUnlockTest_ThreeNow() { - if [ "${USE_IPV6}" == 1 ]; then - echo -n -e "\r ThreeNow:\t\t\t\t${Font_Red}IPv6 Is Not Currently Supported${Font_Suffix}\n" - return - fi - - local result=$(curl ${CURL_DEFAULT_OPTS} -fsL 'https://bravo-livestream.fullscreen.nz/index.m3u8' -w %{http_code} -o /dev/null --user-agent "${UA_BROWSER}") - - case "$result" in - '000') echo -n -e "\r ThreeNow:\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" ;; - '200') echo -n -e "\r ThreeNow:\t\t\t\t${Font_Green}Yes${Font_Suffix}\n" ;; - '403') echo -n -e "\r ThreeNow:\t\t\t\t${Font_Red}No${Font_Suffix}\n" ;; - *) echo -n -e "\r ThreeNow:\t\t\t\t${Font_Red}Failed (Error: ${result})${Font_Suffix}\n" ;; - esac -} - -function MediaUnlockTest_MaoriTV() { - if [ "${USE_IPV6}" == 1 ]; then - echo -n -e "\r Maori TV:\t\t\t\t${Font_Red}IPv6 Is Not Currently Supported${Font_Suffix}\n" - return - fi - - local tmpresult=$(curl ${CURL_DEFAULT_OPTS} -s 'https://www.maoriplus.co.nz/live-tv/whakaata-maori' -H 'accept: */*;q=0.8,application/signed-exchange;v=b3;q=0.7' -H 'accept-language: en-US,en;q=0.9' -H "sec-ch-ua: ${SEC_CH_UA}" -H 'sec-ch-ua-mobile: ?0' -H 'sec-ch-ua-platform: "Windows"' -H 'sec-fetch-dest: document' -H 'sec-fetch-mode: navigate' -H 'sec-fetch-site: none' -H 'sec-fetch-user: ?1' -H 'upgrade-insecure-requests: 1' --user-agent "${UA_BROWSER}") - if [ -z "$tmpresult" ]; then - echo -n -e "\r Maori TV:\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" - return - fi - - # 找出 index-*.js - local indexJsPath=$(echo "$tmpresult" | grep -woP 'src="\K/assets/index-[a-z0-9]{8}[^"]+') - if [ -z "$indexJsPath" ]; then - echo -n -e "\r Maori TV:\t\t\t\t${Font_Red}Failed (Error: PAGE ERROR)${Font_Suffix}\n" - return - fi - # 下载 index-*.js - local tmpresult2=$(curl ${CURL_DEFAULT_OPTS} -s "https://www.maoriplus.co.nz${indexJsPath}" -H 'accept: */*' -H 'accept-language: en-US,en;q=0.9' -H 'origin: https://www.maoriplus.co.nz' -H 'referer: https://www.maoriplus.co.nz/live-tv/whakaata-maori' -H "sec-ch-ua: ${SEC_CH_UA}" -H 'sec-ch-ua-mobile: ?0' -H 'sec-ch-ua-platform: "Windows"' -H 'sec-fetch-dest: script' -H 'sec-fetch-mode: cors' -H 'sec-fetch-site: same-origin' --user-agent "${UA_BROWSER}") - if [ -z "$tmpresult2" ]; then - echo -n -e "\r Maori TV:\t\t\t\t${Font_Red}Failed (Network Connection 1)${Font_Suffix}\n" - return - fi - # 取得 brightcove 播放器链接 - local playerJsUrl=$(echo "$tmpresult2" | grep -woP 'players.brightcove.net/[0-9]{13}/\w{9}_default/index.min.js') - local accountId=$(echo "$playerJsUrl" | grep -woP 'players.brightcove.net/\K[0-9]{13}') - if [ -z "$playerJsUrl" ]; then - echo -n -e "\r Maori TV:\t\t\t\t${Font_Red}Failed (Error: PAGE ERROR)${Font_Suffix}\n" - return - fi - - # 取得 brightcove 播放器信息 - local tmpresult3=$(curl ${CURL_DEFAULT_OPTS} -s "https://${playerJsUrl}" -H 'accept: */*' -H 'accept-language: en-US,en;q=0.9' -H 'referer: https://www.maoriplus.co.nz/' -H "sec-ch-ua: ${SEC_CH_UA}" -H 'sec-ch-ua-mobile: ?0' -H 'sec-ch-ua-platform: "Windows"' -H 'sec-fetch-dest: script' -H 'sec-fetch-mode: no-cors' -H 'sec-fetch-site: cross-site' --user-agent "${UA_BROWSER}") - if [ -z "$tmpresult3" ]; then - echo -n -e "\r Maori TV:\t\t\t\t${Font_Red}Failed (Network Connection 2)${Font_Suffix}\n" - return - fi - - # 取 policy_key - local policyKey=$(echo "$tmpresult3" | grep -woP 'policyKey\s{0,}:\s{0,}"\KBCpk[^"]+') - - # 由于频道 ID 换的不是特别勤,直接固定,少几个请求 - # 该值从该 API 获取:https://api.one.accedo.tv/content/entries?typeAlias=live-channels - local bcChannelId='6278939271001' - # 最终检查 - local tmpresult4=$(curl ${CURL_DEFAULT_OPTS} -s "https://edge.api.brightcove.com/playback/v1/accounts/${accountId}/videos/${bcChannelId}" -H "accept: application/json;pk=${policyKey}" -H 'accept-language: en-US,en;q=0.9' -H 'origin: https://www.maoriplus.co.nz' -H 'referer: https://www.maoriplus.co.nz/' -H "sec-ch-ua: ${SEC_CH_UA}" -H 'sec-ch-ua-mobile: ?0' -H 'sec-ch-ua-platform: "Windows"' -H 'sec-fetch-dest: empty' -H 'sec-fetch-mode: cors' -H 'sec-fetch-site: cross-site' --user-agent "${UA_BROWSER}") - if [ -z "$tmpresult4" ]; then - echo -n -e "\r Maori TV:\t\t\t\t${Font_Red}Failed (Network Connection 3)${Font_Suffix}\n" - return - fi - - local result=$(echo "$tmpresult4" | grep -woP '"error_subcode"\s{0,}:\s{0,}"\K[^"]+') - - case "$result" in - 'CLIENT_GEO') echo -n -e "\r Maori TV:\t\t\t\t${Font_Red}No${Font_Suffix}\n" ;; - 'SUCCESS') echo -n -e "\r Maori TV:\t\t\t\t${Font_Green}Yes${Font_Suffix}\n" ;; - '') echo -n -e "\r Maori TV:\t\t\t\t${Font_Red}Failed (Error: PAGE ERROR)${Font_Suffix}\n" ;; - *) echo -n -e "\r Maori TV:\t\t\t\t${Font_Red}Failed (Error: ${result})${Font_Suffix}\n" ;; - esac -} - -function MediaUnlockTest_SBSonDemand() { - if [ "${USE_IPV6}" == 1 ]; then - echo -n -e "\r SBS on Demand:\t\t\t\t${Font_Red}IPv6 Is Not Currently Supported${Font_Suffix}\n" - return - fi - - local tmpresult=$(curl ${CURL_DEFAULT_OPTS} -s 'https://www.sbs.com.au/api/v3/network?context=odwebsite' --user-agent "${UA_BROWSER}") - if [ -z "$tmpresult" ]; then - echo -n -e "\r SBS on Demand:\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" - return - fi - - local result=$(echo "$tmpresult" | grep -woP '"country_code"\s{0,}:\s{0,}"\K[^"]+') - if [ -z "$result" ]; then - echo -n -e "\r SBS on Demand:\t\t\t\t${Font_Red}Failed (Error: PAGE ERROR)${Font_Suffix}\n" - return - fi - - if [ "$result" == 'AU' ]; then - echo -n -e "\r SBS on Demand:\t\t\t\t${Font_Green}Yes${Font_Suffix}\n" - return - fi - - echo -n -e "\r SBS on Demand:\t\t\t\t${Font_Red}No${Font_Suffix}\n" -} - -function MediaUnlockTest_ABCiView() { - if [ "${USE_IPV6}" == 1 ]; then - echo -n -e "\r ABC iView:\t\t\t\t${Font_Red}IPv6 Is Not Currently Supported${Font_Suffix}\n" - return - fi - - local tmpresult=$(curl ${CURL_DEFAULT_OPTS} -s 'https://api.iview.abc.net.au/v2/show/abc-kids-live-stream/video/LS1604H001S00?embed=highlightVideo,selectedSeries' --user-agent "${UA_BROWSER}") - if [ -z "$tmpresult" ]; then - echo -n -e "\r ABC iView:\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" - return - fi - - local isBlocked=$(echo "$tmpresult" | grep -i 'unavailable outside Australia') - local isOK=$(echo "$tmpresult" | grep -woP '"playable"\s{0,}:\s{0,}\K(false|true)') - - if [ -z "$isBlocked" ] && [ -z "$isOK" ]; then - echo -n -e "\r ABC iView:\t\t\t\t${Font_Red}Failed (Error: PAGE ERROR)${Font_Suffix}\n" - return - fi - - if [ -n "$isBlocked" ] ; then - echo -n -e "\r ABC iView:\t\t\t\t${Font_Red}No${Font_Suffix}\n" - return - fi - - if [ "$isOK" == 'true' ]; then - echo -n -e "\r ABC iView:\t\t\t\t${Font_Green}Yes${Font_Suffix}\n" - return - fi - - echo -n -e "\r ABC iView:\t\t\t\t${Font_Red}Failed (Error: Unknown)${Font_Suffix}\n" -} - -function MediaUnlockTest_Channel9() { - local tmpresult=$(curl ${CURL_DEFAULT_OPTS} -sL 'https://login.nine.com.au' --user-agent "${UA_BROWSER}") - if [ -z "$tmpresult" ]; then - echo -n -e "\r Channel 9:\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" - return - fi - - local isBlocked=$(echo "$tmpresult" | grep -i 'Geoblock') - local isOK=$(echo "$tmpresult" | grep -i 'Log in to') - - if [ -z "$isBlocked" ] && [ -z "$isOK" ]; then - echo -n -e "\r Channel 9:\t\t\t\t${Font_Red}Failed (Error: PAGE ERROR)${Font_Suffix}\n" - return - fi - if [ -n "$isBlocked" ]; then - echo -n -e "\r Channel 9:\t\t\t\t${Font_Red}No${Font_Suffix}\n" - return - fi - if [ -n "$isOK" ]; then - echo -n -e "\r Channel 9:\t\t\t\t${Font_Green}Yes${Font_Suffix}\n" - return - fi - - echo -n -e "\r Channel 9:\t\t\t\t${Font_Red}Failed (Error: Unknown)${Font_Suffix}\n" -} - -function MediaUnlockTest_Telasa() { - local tmpresult=$(curl ${CURL_DEFAULT_OPTS} -s 'https://api-videopass-anon.kddi-video.com/v1/playback/system_status' -H "X-Device-ID: d36f8e6b-e344-4f5e-9a55-90aeb3403799" --user-agent "${UA_BROWSER}") - if [ -z "$tmpresult" ]; then - echo -n -e "\r Telasa:\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" - return - fi - - local isForbidden=$(echo "$tmpresult" | grep -i 'IPLocationNotAllowed') - local isAllowed=$(echo "$tmpresult" | grep -woP '"type"\s{0,}:\s{0,}"\K[^"]+') - - if [ -z "$isAllowed" ] && [ -z "$isForbidden" ]; then - echo -n -e "\r Telasa:\t\t\t\t${Font_Red}Failed (Error: PAGE ERROR)${Font_Suffix}\n" - return - fi - if [ -n "$isForbidden" ]; then - echo -n -e "\r Telasa:\t\t\t\t${Font_Red}No${Font_Suffix}\n" - return - fi - if [ "$isAllowed" == 'OK' ]; then - echo -n -e "\r Telasa:\t\t\t\t${Font_Green}Yes${Font_Suffix}\n" - return - fi - - echo -n -e "\r Telasa:\t\t\t\t${Font_Red}Failed (Error: Unknown)${Font_Suffix}\n" -} - -function MediaUnlockTest_SetantaSports() { - if [ "${USE_IPV6}" == 1 ]; then - echo -n -e "\r Setanta Sports:\t\t\t${Font_Red}IPv6 Is Not Currently Supported${Font_Suffix}\n" - return - fi - - local tmpresult=$(curl ${CURL_DEFAULT_OPTS} -s 'https://dce-frontoffice.imggaming.com/api/v2/consent-prompt' -H 'Realm: dce.adjara' -H 'x-api-key: 857a1e5d-e35e-4fdf-805b-a87b6f8364bf' --user-agent "${UA_BROWSER}") - if [ -z "$tmpresult" ]; then - echo -n -e "\r Setanta Sports:\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" - return - fi - - local result=$(echo "$tmpresult" | grep -woP '"outsideAllowedTerritories"\s{0,}:\s{0,}\K(false|true)') - if [ -z "$result" ]; then - echo -n -e "\r Setanta Sports:\t\t\t${Font_Red}Failed (Error: PAGE ERROR)${Font_Suffix}\n" - return - fi - - if [ "$result" == 'true' ]; then - echo -n -e "\r Setanta Sports:\t\t\t${Font_Red}No${Font_Suffix}\n" - return - fi - if [ "$result" == 'false' ]; then - echo -n -e "\r Setanta Sports:\t\t\t${Font_Green}Yes${Font_Suffix}\n" - return - fi - - echo -n -e "\r Setanta Sports:\t\t\t${Font_Red}Failed (Error: Unknown)${Font_Suffix}\n" -} - -function MediaUnlockTest_MolaTV() { - if [ "${USE_IPV6}" == 1 ]; then - echo -n -e "\r Mola TV:\t\t\t\t${Font_Red}IPv6 Is Not Currently Supported${Font_Suffix}\n" - return - fi - - local tmpresult=$(curl ${CURL_DEFAULT_OPTS} -s 'https://mola.tv/api/v2/videos/geoguard/check/vd30491025' --user-agent "${UA_BROWSER}") - if [ -z "$tmpresult" ]; then - echo -n -e "\r Mola TV:\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" - return - fi - - local result=$(echo "$tmpresult" | grep -woP '"isAllowed"\s{0,}:\s{0,}\K(false|true)') - if [ -z "$result" ]; then - echo -n -e "\r Mola TV:\t\t\t\t${Font_Red}Failed (Error: PAGE ERROR)${Font_Suffix}\n" - return - fi - - if [ "$result" == 'true' ]; then - echo -n -e "\r Mola TV:\t\t\t\t${Font_Green}Yes${Font_Suffix}\n" - return - fi - if [ "$result" == 'false' ]; then - echo -n -e "\r Mola TV:\t\t\t\t${Font_Red}No${Font_Suffix}\n" - return - fi - - echo -n -e "\r Mola TV:\t\t\t\t${Font_Red}Failed (Error: Unknown)${Font_Suffix}\n" -} - -function MediaUnlockTest_BeinConnect() { - if [ "${USE_IPV6}" == 1 ]; then - echo -n -e "\r Bein Sports Connect:\t\t\t${Font_Red}IPv6 Is Not Currently Supported${Font_Suffix}\n" - return - fi - - local result=$(curl ${CURL_DEFAULT_OPTS} -fsL 'https://proxies.bein-mena-production.eu-west-2.tuc.red/proxy/availableOffers' -w %{http_code} -o /dev/null --user-agent "${UA_BROWSER}") - - case "$result" in - '000') echo -n -e "\r Bein Sports Connect:\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" ;; - '500') echo -n -e "\r Bein Sports Connect:\t\t\t${Font_Green}Yes${Font_Suffix}\n" ;; - '451') echo -n -e "\r Bein Sports Connect:\t\t\t${Font_Red}No${Font_Suffix}\n" ;; - *) echo -n -e "\r Bein Sports Connect:\t\t\t${Font_Red}Failed (Error: ${result})${Font_Suffix}\n" ;; - esac -} - -function MediaUnlockTest_EurosportRO() { - if [ "${USE_IPV6}" == 1 ]; then - echo -n -e "\r Eurosport RO:\t\t\t\t${Font_Red}IPv6 Is Not Currently Supported${Font_Suffix}\n" - return - fi - - local fakeUuid=$(gen_uuid) - # 取得 Bearer 认证 token - local tmpresult=$(curl ${CURL_DEFAULT_OPTS} -s 'https://eu3-prod-direct.eurosport.ro/token?realm=eurosport' -H 'accept: */*' -H 'accept-language: en-US,en;q=0.9' -H 'origin: https://www.eurosport.ro' -H 'referer: https://www.eurosport.ro/' -H "sec-ch-ua: ${UA_SEC_CH_UA}" -H 'sec-ch-ua-mobile: ?0' -H 'sec-ch-ua-platform: "Windows"' -H 'sec-fetch-dest: empty' -H 'sec-fetch-mode: cors' -H 'sec-fetch-site: same-site' -H "x-device-info: escom/0.295.1 (unknown/unknown; Windows/10; ${fakeUuid})" -H 'x-disco-client: WEB:UNKNOWN:escom:0.295.1' --user-agent "${UA_BROWSER}") - if [ -z "$tmpresult" ]; then - echo -n -e "\r Eurosport RO:\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" - return - fi - - local token=$(echo "$tmpresult" | grep -woP '"token"\s{0,}:\s{0,}"\K[^"]+') - if [ -z "$token" ]; then - echo -n -e "\r Eurosport RO:\t\t\t\t${Font_Red}Failed (Error: PAGER ERROR)${Font_Suffix}\n" - return - fi - - # 随便选的视频 - local sourceSystemId='eurosport-vid2133403' - local tmpresult1=$(curl ${CURL_DEFAULT_OPTS} -s "https://eu3-prod-direct.eurosport.ro/playback/v2/videoPlaybackInfo/sourceSystemId/${sourceSystemId}?usePreAuth=true" -H "Authorization: Bearer ${token}" --user-agent "${UA_BROWSER}") - - local isBlocked=$(echo "$tmpresult1" | grep 'access.denied.geoblocked') - local isOK=$(echo "$tmpresult1" | grep 'eurosport-vod') - - if [ -z "$isBlocked" ] && [ -z "$isOK" ]; then - echo -n -e "\r Eurosport RO:\t\t\t\t${Font_Red}Failed (Error: PAGE ERROR)${Font_Suffix}\n" - return - fi - if [ -n "$isBlocked" ]; then - echo -n -e "\r Eurosport RO:\t\t\t\t${Font_Red}No${Font_Suffix}\n" - return - fi - if [ -n "$isOK" ]; then - echo -n -e "\r Eurosport RO:\t\t\t\t${Font_Green}Yes${Font_Suffix}\n" - return - fi - - echo -n -e "\r Eurosport RO:\t\t\t\t${Font_Red}Failed (Error: Unknown)${Font_Suffix}\n" -} - -function MediaUnlockTest_Channel5() { - if [ "${USE_IPV6}" == 1 ]; then - echo -n -e "\r Channel 5:\t\t\t\t${Font_Red}IPv6 Is Not Currently Supported${Font_Suffix}\n" - return - fi - - local timestamp=$(date +%s) - local tmpresult=$(curl ${CURL_DEFAULT_OPTS} -sL "https://cassie.channel5.com/api/v2/live_media/my5desktopng/C5.json?timestamp=${timestamp}&auth=0_rZDiY0hp_TNcDyk2uD-Kl40HqDbXs7hOawxyqPnbI" --user-agent "${UA_BROWSER}") - if [ -z "$tmpresult" ]; then - echo -n -e "\r Channel 5:\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" - return - fi - - local result=$(echo "$tmpresult" | grep -woP '"code"\s{0,}:\s{0,}"\K[^"]+') - - case "$result" in - '3000') echo -n -e "\r Channel 5:\t\t\t\t${Font_Red}No${Font_Suffix}\n" ;; - '4003') echo -n -e "\r Channel 5:\t\t\t\t${Font_Green}Yes${Font_Suffix}\n" ;; - '') echo -n -e "\r Channel 5:\t\t\t\t${Font_Red}Failed (Error: PAGE ERROR)${Font_Suffix}\n" ;; - *) echo -n -e "\r Channel 5:\t\t\t\t${Font_Red}Failed (Error: ${result})${Font_Suffix}\n" ;; - esac -} - -function MediaUnlockTest_MyVideo() { - if [ "${USE_IPV6}" == 1 ]; then - echo -n -e "\r MyVideo:\t\t\t\t${Font_Red}IPv6 Is Not Currently Supported${Font_Suffix}\n" - return - fi - - local tmpresult=$(curl ${CURL_DEFAULT_OPTS} -fsL 'https://www.myvideo.net.tw/login.do' -w '%{http_code}_TAG_%{url_effective}\n' -o /dev/null --user-agent "${UA_BROWSER}") - local httpCode=$(echo "$tmpresult" | awk -F'_TAG_' '{print $1}') - - if [ "$httpCode" == '000' ]; then - echo -n -e "\r MyVideo:\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" - return - fi - - local urlEffective=$(echo "$tmpresult" | awk -F'_TAG_' '{print $2}') - local isBlocked=$(echo "$urlEffective" | grep -i 'serviceAreaBlock') - - if [ -n "$isBlocked" ]; then - echo -n -e "\r MyVideo:\t\t\t\t${Font_Red}No${Font_Suffix}\n" - return - fi - if [ "$httpCode" == '403' ]; then - echo -n -e "\r MyVideo:\t\t\t\t${Font_Red}No${Font_Suffix}\n" - return - fi - if [ "$httpCode" == '200' ]; then - echo -n -e "\r MyVideo:\t\t\t\t${Font_Green}Yes${Font_Suffix}\n" - return - fi - - echo -n -e "\r MyVideo:\t\t\t\t${Font_Red}Failed (Error: ${httpCode})${Font_Suffix}\n" -} - -function MediaUnlockTest_7plus() { - if [ "${USE_IPV6}" == 1 ]; then - echo -n -e "\r 7plus:\t\t\t\t\t${Font_Red}IPv6 Is Not Currently Supported${Font_Suffix}\n" - return - fi - - local result1=$(curl ${CURL_DEFAULT_OPTS} -fsL "https://7plus-sevennetwork.akamaized.net/media/v1/dash/live/cenc/5303576322001/68dca38b-85d7-4dae-b1c5-c88acc58d51c/f4ea4711-514e-4cad-824f-e0c87db0a614/225ec0a0-ef18-4b7c-8fd6-8dcdd16cf03a/1x/segment0.m4f?akamai_token=exp=1672500385~acl=/media/v1/dash/live/cenc/5303576322001/68dca38b-85d7-4dae-b1c5-c88acc58d51c/f4ea4711-514e-4cad-824f-e0c87db0a614/*~hmac=800e1e1d1943addf12b71339277c637c7211582fe12d148e486ae40d6549dbde" -w %{http_code} -o /dev/null --user-agent "${UA_BROWSER}") - - if [ "$result1" == '000' ]; then - echo -n -e "\r 7plus:\t\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" - return - fi - - if [ "$result1" == '200' ]; then - echo -n -e "\r 7plus:\t\t\t\t\t${Font_Green}Yes${Font_Suffix}\n" - return - else - echo -n -e "\r 7plus:\t\t\t\t\t${Font_Red}No${Font_Suffix}\n" - return - fi -} - -function MediaUnlockTest_Channel10() { - if [ "${USE_IPV6}" == 1 ]; then - echo -n -e "\r Channel 10:\t\t\t\t${Font_Red}IPv6 Is Not Currently Supported${Font_Suffix}\n" - return - fi - - local tmpresult=$(curl ${CURL_DEFAULT_OPTS} -sL 'https://e410fasadvz.global.ssl.fastly.net/geo' --user-agent "${UA_BROWSER}") - if [ -z "$tmpresult" ]; then - echo -n -e "\r Channel 10:\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" - return - fi - - local result=$(echo "$tmpresult" | grep -woP '"allow"\s{0,}:\s{0,}\K(false|true)') - if [ -z "$result" ]; then - echo -n -e "\r Channel 10:\t\t\t\t${Font_Red}Failed (Error: PAGE ERROR)${Font_Suffix}\n" - return - fi - - if [ "$result" == 'true' ]; then - echo -n -e "\r Channel 10:\t\t\t\t${Font_Green}Yes${Font_Suffix}\n" - return - fi - if [ "$result" == 'false' ]; then - echo -n -e "\r Channel 10:\t\t\t\t${Font_Red}No${Font_Suffix}\n" - return - fi - - echo -n -e "\r Channel 10:\t\t\t\t${Font_Red}Failed (Error: Unknown)${Font_Suffix}\n" -} - -function MediaUnlockTest_Spotify() { - local tmpresult=$(curl ${CURL_DEFAULT_OPTS} -s 'https://spclient.wg.spotify.com/signup/public/v1/account' -d "birth_day=11&birth_month=11&birth_year=2000&collect_personal_info=undefined&creation_flow=&creation_point=https%3A%2F%2Fwww.spotify.com%2Fhk-en%2F&displayname=Gay%20Lord&gender=male&iagree=1&key=a1e486e2729f46d6bb368d6b2bcda326&platform=www&referrer=&send-email=0&thirdpartyemail=0&identifier_token=AgE6YTvEzkReHNfJpO114514" -X POST -H "Accept-Language: en" --user-agent "${UA_BROWSER}") - if [ -z "$tmpresult" ]; then - echo -n -e "\r Spotify Registration:\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" - return - fi - - local statusCode=$(echo "$tmpresult" | grep -woP '"status"\s{0,}:\s{0,}\K\d+') - local region=$(echo "$tmpresult" | grep -woP '"country"\s{0,}:\s{0,}"\K[^"]+') - local isLaunched=$(echo "$tmpresult" | grep -woP '"is_country_launched"\s{0,}:\s{0,}\K(false|true)') - - if [ -z "$statusCode" ]; then - echo -n -e "\r Spotify Registration:\t\t\t${Font_Red}Failed (Error: PAGE ERROR)${Font_Suffix}\n" - return - fi - if [ "$statusCode" == '320' ] || [ "$statusCode" == '120' ]; then - echo -n -e "\r Spotify Registration:\t\t\t${Font_Red}No${Font_Suffix}\n" - return - fi - if [ -z "$isLaunched" ] || [ -z "$region" ]; then - echo -n -e "\r Spotify Registration:\t\t\t${Font_Red}Failed (Error: PAGE ERROR)${Font_Suffix}\n" - return - fi - if [ "$isLaunched" == 'false' ]; then - echo -n -e "\r Spotify Registration:\t\t\t${Font_Red}No${Font_Suffix}\n" - return - fi - if [ "$statusCode" == '311' ]; then - echo -n -e "\r Spotify Registration:\t\t\t${Font_Green}Yes (Region: ${region})${Font_Suffix}\n" - return - fi - - echo -n -e "\r Spotify Registration:\t\t\t${Font_Red}Failed (Error: $statusCode)${Font_Suffix}\n" -} - -function MediaUnlockTest_VideoMarket() { - if [ "${USE_IPV6}" == 1 ]; then - echo -n -e "\r VideoMarket:\t\t\t\t${Font_Red}IPv6 Is Not Currently Supported${Font_Suffix}\n" - return - fi - - local tmpresult=$(curl ${CURL_DEFAULT_OPTS} -s 'https://www.videomarket.jp/graphql' -H 'authority: www.videomarket.jp' -H 'accept: */*' -H 'accept-language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6' -H 'authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjQ4MTkxNTkyMDIsImlhdCI6MTY2NTU1OTIwMiwiaXNzIjoiaHR0cHM6Ly9hdXRoLnZpZGVvbWFya2V0LmpwIiwic3ViIjoiY2ZjZDIwODQ5NWQ1NjVlZjY2ZTdkZmY5Zjk4NzY0ZGEiLCJ1c2VyX3R5cGUiOjAsInNpdGVfdHlwZSI6MiwiY2xpZW50X2lkIjoiYmVkNDdkOTFiMDVhYjgzMGM4YzBhYmFiYjQwNTg5MTFhY2E5NTdkMDBkMTUzNjA2MjI3NzNhOTQ0Y2RlNzRhNSIsInZtaWQiOjB9.Tq18RCxpVz1oV1lja52uRmF0nT6Oa0QsZMTVlPfANwb-RrcSn7PwE9vh7GdNIBc0ydDxRoUMuhStz_Kbu8KxvAh25eafFh7hf0DDqWKKU4ayPMueaR12t74SjFIRC7Cla1NR4uRn3_mgJfZFqOkIf6L5OR9LOVIBhrQPkhbMyqwZyh_kxTH7ToJIQoINb036ftqcF1KfR8ndtBlkrrWWnDpfkmE7-fJQHh92oKKd9l98W5awuEQo0MFspIdSNgt3gLi9t1RRKPDISGlzJkwMLPkHIUlWWZaAmnEkwSeZCPj_WJaqUqBATYKhi3yJZNGlHsScQ_KgAopxlsI6-c88Gps8i6yHvPVYw3hQ9XYq9gVL_SpyW9dKKSPE9MY6I19JHLBXuFXi5OJccqtQzTnKm_ZQM3EcKt5s0cNlXm9RMt0fNdRTQdJ53noD9o-b6hUIxDcHScJ_-30Emiv-55g5Sq9t5KPWO6o0Ggokkj42zin69MxCiUSHXk5FgeY8rX76yGBeLPLPIaaRPXEC1Jeo1VO56xNnQpyX_WHqHWDKhmOh1qSzaxiAiC5POMsTfwGr19TwXHUldYXxuNMIfeAaPZmNTzR5J6XdenFkLnrssVzXdThdlqHpfguLFvHnXTCAm0ZhFIJmacMNw1IxGmCQfkM4HtgKB9ZnWm6P0jIISdg' -H 'content-type: application/json' -H 'cookie: _gid=GA1.2.1853799793.1706147718; VM_REGIST_BANNER_REF_LINK=%2Ftitle%2F292072; __ulfpc=202401250957239984; _im_vid=01HMZ5C5GNNC6VWSPKD3E4W7YP; __td_signed=true; _td_global=0d11678b-5151-473e-b3a8-4f4d780f26a6; __juicer_sesid_9i3nsdfP_=d36a2e17-0117-47ce-95de-fbd5ffcda2d9; __juicer_session_referrer_9i3nsdfP_=d36a2e17-0117-47ce-95de-fbd5ffcda2d9___https%253A%252F%252Fwww.videomarket.jp%252Fplayer%252F292072%252FA292072001999H01; _gat_UA-221872486-2=1; _ga=GA1.2.777206008.1706147718; _ga_8HZQ9F8HV0=GS1.1.1706147717.1.1.1706147941.0.0.0; _td=3317738c-2329-4b61-ad5a-4e0ad230841d; dc_cl_id=ab38GzrmoV7muvtI' -H 'origin: https://www.videomarket.jp' -H 'referer: https://www.videomarket.jp/player/292072/A292072001999H01' -H "sec-ch-ua: ${UA_SEC_CH_UA}" -H 'sec-ch-ua-mobile: ?0' -H 'sec-ch-ua-platform: "Windows"' -H 'sec-fetch-dest: empty' -H 'sec-fetch-mode: cors' -H 'sec-fetch-site: same-origin' -H 'x-videomarket-requested: spa' --data-raw $'{"operationName":"repPacks","variables":{"repFullPackIds":["A292072001999H01"],"isOnSale":false,"isOnlyLatest":true},"query":"query repPacks($repFullPackIds: [String], $fullPacksIds: [String], $isOnSale: Boolean\u0021, $isOnlyLatest: Boolean\u0021) {\\n repPacks(\\n repFullPackIds: $repFullPackIds\\n fullPackIds: $fullPacksIds\\n onSale: $isOnSale\\n onlyLatest: $isOnlyLatest\\n ) {\\n repFullPackId\\n groupType\\n packName\\n fullTitleId\\n titleName\\n storyImageUrl16x9\\n playTime\\n subtitleDubType\\n outlines\\n courseIds\\n price\\n discountRate\\n couponPrice\\n couponDiscountRate\\n rentalDays\\n viewDays\\n deliveryExpiredAt\\n salesType\\n counter {\\n currentPage\\n currentResult\\n totalPages\\n totalResults\\n __typename\\n }\\n undiscountedPrice\\n packs {\\n undiscountedPrice\\n canPurchase\\n fullPackId\\n subGroupType\\n fullTitleId\\n qualityConsentType\\n courseIds\\n price\\n discountRate\\n couponPrice\\n couponDiscountRate\\n rentalDays\\n viewDays\\n deliveryExpiredAt\\n salesType\\n extId\\n stories {\\n fullStoryId\\n subtitleDubType\\n encodeVersion\\n isDownloadable\\n isBonusMaterial\\n fileSize\\n __typename\\n }\\n __typename\\n }\\n status {\\n hasBeenPlayed\\n isCourseRegistered\\n isEstPurchased\\n isNowPlaying\\n isPlayable\\n isRented\\n playExpiredAt\\n playableQualityType\\n rentalExpiredAt\\n __typename\\n }\\n __typename\\n }\\n}\\n"}' --user-agent "${UA_BROWSER}") - - if [ -z "$tmpresult" ]; then - echo -n -e "\r VideoMarket:\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" - return - fi - - local isBlocked=$(echo "$tmpresult" | grep 'OverseasAccess') - local isOK=$(echo "$tmpresult" | grep '292072') - - if [ -z "$isBlocked" ] && [ -z "$isOK" ]; then - echo -n -e "\r VideoMarket:\t\t\t\t${Font_Red}Failed (Error: PAGE ERROR)${Font_Suffix}\n" - return - fi - if [ -n "$isBlocked" ]; then - echo -n -e "\r VideoMarket:\t\t\t\t${Font_Red}No${Font_Suffix}\n" - return - fi - if [ -n "$isOK" ]; then - echo -n -e "\r VideoMarket:\t\t\t\t${Font_Green}Yes${Font_Suffix}\n" - return - fi - - echo -n -e "\r VideoMarket:\t\t\t\t${Font_Red}Failed (Error: PAGE ERROR)${Font_Suffix}\n" -} - -function MediaUnlockTest_JCOM_ON_DEMAND() { - local result=$(curl ${CURL_DEFAULT_OPTS} -fsL 'https://auth.id2.zaq.ne.jp/login' -w %{http_code} -o /dev/null --user-agent "${UA_BROWSER}") - - case "$result" in - '000') echo -n -e "\r J:com On Demand:\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" ;; - '200') echo -n -e "\r J:com On Demand:\t\t\t${Font_Green}Yes${Font_Suffix}\n" ;; - '403') echo -n -e "\r J:com On Demand:\t\t\t${Font_Red}No${Font_Suffix}\n" ;; - *) echo -n -e "\r J:com On Demand:\t\t\t${Font_Red}Failed (Error: ${result})${Font_Suffix}\n" ;; - esac -} - -function MediaUnlockTest_musicjp() { - if [ "${USE_IPV6}" == 1 ]; then - echo -n -e "\r music.jp:\t\t\t\t${Font_Red}IPv6 Is Not Currently Supported${Font_Suffix}\n" - return - fi - - local tmpresult=$(curl ${CURL_DEFAULT_OPTS} -sL 'https://overseaauth.music-book.jp/globalIpcheck.js' -w '_TAG_%{http_code}' --user-agent "${UA_BROWSER}") - - local httpCode=$(echo "$tmpresult" | grep '_TAG_' | awk -F'_TAG_' '{print $2}') - local respContent=$(echo "$tmpresult" | awk -F'_TAG_' '{print $1}') - local isOK=$(echo "$respContent" | grep -i 'checkIp') - - if [ "$httpCode" == '000' ]; then - echo -n -e "\r music.jp:\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" - return - fi - if [ "$httpCode" == '403' ]; then - echo -n -e "\r music.jp:\t\t\t\t${Font_Red}No${Font_Suffix}\n" - return - fi - if [ -z "$respContent" ]; then - echo -n -e "\r music.jp:\t\t\t\t${Font_Red}No${Font_Suffix}\n" - return - fi - if [ -n "$isOK" ]; then - echo -n -e "\r music.jp:\t\t\t\t${Font_Green}Yes${Font_Suffix}\n" - return - fi - - echo -n -e "\r music.jp:\t\t\t\t${Font_Red}Failed (Error: PAGE ERROR)${Font_Suffix}\n" -} - -function MediaUnlockTest_InstagramMusic() { - ARCH=$(uname -m) - - if [ "$ARCH" = "x86_64" ]; then - curl -sL -o ./ins https://github.com/lmc999/RegionRestrictionCheck/raw/refs/heads/main/binary/ins_amd64 - chmod +x ./ins - clear - ./ins - elif [ "$ARCH" = "aarch64" ]; then - curl -sL -o ./ins https://github.com/lmc999/RegionRestrictionCheck/raw/refs/heads/main/binary/ins_arm64 - chmod +x ./ins - clear - ./ins - else - echo "Unsupported architecture: $ARCH" - exit 1 - fi - - rm ./ins - exit 0 -} - -function WebTest_Reddit() { - if [ "${USE_IPV6}" == 1 ]; then - echo -n -e "\r Reddit:\t\t\t\t${Font_Red}IPv6 Is Not Currently Supported${Font_Suffix}\n" - return - fi - - local result=$(curl ${CURL_DEFAULT_OPTS} -fsL 'https://www.reddit.com/' -w %{http_code} -o /dev/null --user-agent "${UA_BROWSER}") - case "$result" in - '000') echo -n -e "\r Reddit:\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" ;; - '403') echo -n -e "\r Reddit:\t\t\t\t${Font_Red}No${Font_Suffix}\n" ;; - '200') echo -n -e "\r Reddit:\t\t\t\t${Font_Green}Yes${Font_Suffix}\n" ;; - *) echo -n -e "\r Reddit:\t\t\t\t${Font_Red}Failed (Error: ${result})${Font_Suffix}\n" ;; - esac -} - -function MediaUnlockTest_Popcornflix() { - if [ "${USE_IPV6}" == 1 ]; then - echo -n -e "\r Popcornflix:\t\t\t\t${Font_Red}IPv6 Is Not Currently Supported${Font_Suffix}\n" - return - fi - - local result=$(curl ${CURL_DEFAULT_OPTS} -s 'https://popcornflix-prod.cloud.seachange.com/cms/popcornflix/clientconfiguration/versions/2' -w %{http_code} -o /dev/null --user-agent "${UA_BROWSER}") - if [ "$result" == '000' ]; then - echo -n -e "\r Popcornflix:\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" - return - fi - - case "$result" in - '403') echo -n -e "\r Popcornflix:\t\t\t\t${Font_Red}No${Font_Suffix}\n" ;; - '200') echo -n -e "\r Popcornflix:\t\t\t\t${Font_Green}Yes${Font_Suffix}\n" ;; - *) echo -n -e "\r Popcornflix:\t\t\t\t${Font_Red}Failed (Error: ${result})${Font_Suffix}\n" ;; - esac -} - -function MediaUnlockTest_TubiTV() { - local tmpresult=$(curl ${CURL_DEFAULT_OPTS} -sL 'https://tubitv.com/home' --user-agent "${UA_BROWSER}") - if [ -z "$tmpresult" ]; then - echo -n -e "\r Tubi TV:\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" - return - fi - - local isBlocked=$(echo "$tmpresult" | grep -i 'not currently available in your area') - local isOK=$(echo "$tmpresult" | grep -i 'manifest') - - if [ -z "$isBlocked" ] && [ -z "$isOK" ]; then - echo -n -e "\r Tubi TV:\t\t\t\t${Font_Red}Failed (Error: PAGE ERROR)${Font_Suffix}\n" - return - fi - - if [ -n "$isBlocked" ]; then - echo -n -e "\r Tubi TV:\t\t\t\t${Font_Red}No${Font_Suffix}\n" - return - fi - if [ -n "$isOK" ]; then - echo -n -e "\r Tubi TV:\t\t\t\t${Font_Green}Yes${Font_Suffix}\n" - return - fi - - echo -n -e "\r Tubi TV:\t\t\t\t${Font_Red}Failed (Error: Unknown)${Font_Suffix}\n" -} - -function MediaUnlockTest_Philo() { - if [ "${USE_IPV6}" == 1 ]; then - echo -n -e "\r Philo:\t\t\t\t\t${Font_Red}IPv6 Is Not Currently Supported${Font_Suffix}\n" - return - fi - - local tmpresult=$(curl ${CURL_DEFAULT_OPTS} -sL 'https://content-us-east-2-fastly-b.www.philo.com/geo' --user-agent "${UA_BROWSER}") - if [ -z "$tmpresult" ]; then - echo -n -e "\r Philo:\t\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" - return - fi - - local result=$(echo "$tmpresult" | grep -woP '"status"\s{0,}:\s{0,}"\K[^"]+') - if [ -z "$result" ]; then - echo -n -e "\r Philo:\t\t\t\t\t${Font_Red}Failed (Error: PAGE ERROR)${Font_Suffix}\n" - return - fi - - case "$result" in - 'FAIL') echo -n -e "\r Philo:\t\t\t\t\t${Font_Red}No${Font_Suffix}\n" ;; - 'SUCCESS') echo -n -e "\r Philo:\t\t\t\t\t${Font_Green}Yes${Font_Suffix}\n" ;; - *) echo -n -e "\r Philo:\t\t\t\t\t${Font_Red}Failed (Error: ${result})${Font_Suffix}\n" ;; - esac -} - -function MediaUnlockTest_FXNOW() { - if [ "${USE_IPV6}" == 1 ]; then - echo -n -e "\r FXNOW:\t\t\t\t\t${Font_Red}IPv6 Is Not Currently Supported${Font_Suffix}\n" - return - fi - - local tmpresult=$(curl ${CURL_DEFAULT_OPTS} -sL 'https://fxnow.fxnetworks.com/' --user-agent "${UA_BROWSER}") - if [ -z "$tmpresult" ]; then - echo -n -e "\r FXNOW:\t\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" - return - fi - - local isBlocked=$(echo "$tmpresult" | grep -i 'is not accessible') - local isOK=$(echo "$tmpresult" | grep -i "FX Movies") - - if [ -z "$isBlocked" ] && [ -z "$isOK" ]; then - echo -n -e "\r FXNOW:\t\t\t\t\t${Font_Red}Failed (Error: PAGE ERROR)${Font_Suffix}\n" - return - fi - - if [ -n "$isBlocked" ]; then - echo -n -e "\r FXNOW:\t\t\t\t\t${Font_Red}No${Font_Suffix}\n" - return - fi - if [ -n "$isOK" ]; then - echo -n -e "\r FXNOW:\t\t\t\t\t${Font_Green}Yes${Font_Suffix}\n" - return - fi - - echo -n -e "\r FXNOW:\t\t\t\t\t${Font_Red}Failed (Error: Unknown)${Font_Suffix}\n" -} - -function MediaUnlockTest_Crunchyroll() { - if [ "${USE_IPV6}" == 1 ]; then - echo -n -e "\r Crunchyroll:\t\t\t\t${Font_Red}IPv6 Is Not Currently Supported${Font_Suffix}\n" - return - fi - - local tmpresult=$(curl ${CURL_DEFAULT_OPTS} -fsL 'https://c.evidon.com/geo/country.js' --user-agent "${UA_BROWSER}") - if [ -z "$tmpresult" ]; then - echo -n -e "\r Crunchyroll:\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" - return - fi - - local result=$(echo "$tmpresult" | grep "'code':'us'") - if [ -z "$result" ]; then - echo -n -e "\r Crunchyroll:\t\t\t\t${Font_Red}No${Font_Suffix}\n" - else - echo -n -e "\r Crunchyroll:\t\t\t\t${Font_Green}Yes${Font_Suffix}\n" - fi -} - -function MediaUnlockTest_CWTV() { - local result=$(curl ${CURL_DEFAULT_OPTS} -fsL "https://www.cwtv.com/" -w %{http_code} -o /dev/null --user-agent "${UA_BROWSER}") - - case "$result" in - '000') echo -n -e "\r CW TV:\t\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" ;; - '403'|'451') echo -n -e "\r CW TV:\t\t\t\t\t${Font_Red}No${Font_Suffix}\n" ;; - '200') echo -n -e "\r CW TV:\t\t\t\t\t${Font_Green}Yes${Font_Suffix}\n" ;; - *) echo -n -e "\r CW TV:\t\t\t\t\t${Font_Red}Failed (Error: ${result})${Font_Suffix}\n" ;; - esac -} - -function MediaUnlockTest_Shudder() { - local tmpresult=$(curl ${CURL_DEFAULT_OPTS} -sL 'https://www.shudder.com/' --user-agent "${UA_BROWSER}") - if [ -z "$tmpresult" ]; then - echo -n -e "\r Shudder:\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" - return - fi - - local isBlocked=$(echo "$tmpresult" | grep -iE 'not available|not yet available|403 ERROR') - local isOK=$(echo "$tmpresult" | grep -i 'movies') - - if [ -z "$isBlocked" ] && [ -z "$isOK" ]; then - echo -n -e "\r Shudder:\t\t\t\t${Font_Red}Failed (Error: PAGE ERROR)${Font_Suffix}\n" - return - fi - - if [ -n "$isBlocked" ]; then - echo -n -e "\r Shudder:\t\t\t\t${Font_Red}No${Font_Suffix}\n" - return - fi - if [ -n "$isOK" ]; then - echo -n -e "\r Shudder:\t\t\t\t${Font_Green}Yes${Font_Suffix}\n" - return - fi - - echo -n -e "\r Shudder:\t\t\t\t${Font_Red}Failed (Error: Unknown)${Font_Suffix}\n" -} - -function MediaUnlockTest_TLCGO() { - if [ "${USE_IPV6}" == 1 ]; then - echo -n -e "\r TLC GO:\t\t\t\t${Font_Red}IPv6 Is Not Currently Supported${Font_Suffix}\n" - return - fi - - local fakeDeviceId=$(gen_uuid) - local tmpresult=$(curl ${CURL_DEFAULT_OPTS} -s "https://us1-prod-direct.tlc.com/token?deviceId=${fakeDeviceId}&realm=go&shortlived=true" -H 'accept-language: en-US,en;q=0.9' -H 'origin: https://go.tlc.com' -H 'referer: https://go.tlc.com/' -H "sec-ch-ua: ${UA_SEC_CH_UA}" -H 'sec-ch-ua-mobile: ?0' -H 'sec-ch-ua-platform: "Windows"' -H 'sec-fetch-dest: empty' -H 'sec-fetch-mode: cors' -H 'sec-fetch-site: same-site' -H 'x-device-info: tlc/3.17.0 (desktop/desktop; Windows/NT 10.0; ${fakeDeviceId})' -H 'x-disco-client: WEB:UNKNOWN:tlc:3.17.0' -H 'x-disco-params: realm=go,siteLookupKey=tlc,bid=tlc,hn=go.tlc.com,hth=us,features=ar' --user-agent "${UA_BROWSER}") - if [ -z "$tmpresult" ]; then - echo -n -e "\r TLC GO:\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" - return - fi - - local token=$(echo "$tmpresult" | grep -woP '"token"\s{0,}:\s{0,}"\K[^"]+') - if [ -z "$token" ]; then - echo -n -e "\r TLC GO:\t\t\t\t${Font_Red}Failed (Error: PAGE ERROR)${Font_Suffix}\n" - return - fi - - local tmpresult1=$(curl ${CURL_DEFAULT_OPTS} -s 'https://us1-prod-direct.tlc.com/cms/routes/home?include=default&decorators=viewingHistory,isFavorite,playbackAllowed&page\[items.number\]=1&page\[items.size\]=8' -H 'accept-language: en-US,en;q=0.9' -H "Authorization: Bearer ${token}" -H 'origin: https://go.tlc.com' -H 'referer: https://go.tlc.com/' -H "sec-ch-ua: ${UA_SEC_CH_UA}" -H 'sec-ch-ua-mobile: ?0' -H 'sec-ch-ua-platform: "Windows"' -H 'sec-fetch-dest: empty' -H 'sec-fetch-mode: cors' -H 'sec-fetch-site: same-site' -H 'x-disco-client: WEB:UNKNOWN:tlc:3.17.0' -H 'x-disco-params: realm=go,siteLookupKey=tlc,bid=tlc,hn=go.tlc.com,hth=us,features=ar' --user-agent "${UA_BROWSER}") - - local isBlocked=$(echo "$tmpresult1" | grep -i 'is not yet available') - local isOK=$(echo "$tmpresult1" | grep -i 'Episodes') - local region=$(echo "$tmpresult1" | grep -woP '"mainTerritoryCode"\s{0,}:\s{0,}"\K[^"]+' | tr a-z A-Z) - - if [ -z "$isBlocked" ] && [ -z "$isOK" ]; then - echo -n -e "\r TLC GO:\t\t\t\t${Font_Red}Failed (Error: PAGE ERROR)${Font_Suffix}\n" - return - fi - - if [ -n "$isBlocked" ]; then - echo -n -e "\r TLC GO:\t\t\t\t${Font_Red}No${Font_Suffix}\n" - return - fi - if [ -n "$isOK" ]; then - echo -n -e "\r TLC GO:\t\t\t\t${Font_Green}Yes (Region: ${region})${Font_Suffix}\n" - return - fi - - echo -n -e "\r TLC GO:\t\t\t\t${Font_Red}Failed (Error: Unknown)${Font_Suffix}\n" -} - -function RegionTest_oneTrust() { - local tmpresult=$(curl ${CURL_DEFAULT_OPTS} -s 'https://geolocation.onetrust.com/cookieconsentpub/v1/geo/location' --user-agent "${UA_BROWSER}") - if [ -z "$tmpresult" ]; then - echo -n -e "\r OneTrust Region:\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" - return - fi - - local region=$(echo "$tmpresult" | grep -woP '"country"\s{0,}:\s{0,}"\K[^"]+') - local stateName=$(echo "$tmpresult" | grep -woP '"stateName"\s{0,}:\s{0,}"\K[^"]+') - if [ -z "$region" ]; then - echo -n -e "\r OneTrust Region:\t\t\t${Font_Red}Failed (Error: PAGE ERROR)${Font_Suffix}\n" - return - fi - if [ -z "$stateName" ]; then - local stateName='Unknown' - fi - - echo -n -e "\r OneTrust Region:\t\t\t${Font_Green}${region} [${stateName}]${Font_Suffix}\n" -} - -function MediaUnlockTest_Wavve() { - if [ "${USE_IPV6}" == 1 ]; then - echo -n -e "\r Wavve:\t\t\t\t\t${Font_Red}IPv6 Is Not Currently Supported${Font_Suffix}\n" - return - fi - - local result=$(curl ${CURL_DEFAULT_OPTS} -fsL 'https://apis.wavve.com/fz/streaming?device=pc&partner=pooq&apikey=E5F3E0D30947AA5440556471321BB6D9&credential=none&service=wavve&pooqzone=none®ion=kor&drm=pr&targetage=all&contentid=MV_C3001_C300000012559&contenttype=movie&hdr=sdr&videocodec=avc&audiocodec=ac3&issurround=n&format=normal&withinsubtitle=n&action=dash&protocol=dash&quality=auto&deviceModelId=Windows%2010&guid=1a8e9c88-6a3b-11ed-8584-eed06ef80652&lastplayid=none&authtype=cookie&isabr=y&ishevc=n' -w %{http_code} -o /dev/null --user-agent "${UA_BROWSER}") - if [ "$result" == '000' ]; then - echo -n -e "\r Wavve:\t\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" - return - fi - - case "$result" in - '403'|'550') echo -n -e "\r Wavve:\t\t\t\t\t${Font_Red}No${Font_Suffix}\n" ;; - '200') echo -n -e "\r Wavve:\t\t\t\t\t${Font_Green}Yes${Font_Suffix}\n" ;; - *) echo -n -e "\r Wavve:\t\t\t\t\t${Font_Red}Failed (Error: ${result})${Font_Suffix}\n" ;; - esac -} - -function MediaUnlockTest_Tving() { - if [ "${USE_IPV6}" == 1 ]; then - echo -n -e "\r Tving:\t\t\t\t\t${Font_Red}IPv6 Is Not Currently Supported${Font_Suffix}\n" - return - fi - - local tmpresult=$(curl ${CURL_DEFAULT_OPTS} -sL 'https://api.tving.com/v2a/media/stream/info?apiKey=1e7952d0917d6aab1f0293a063697610&mediaCode=RV60891248' --user-agent "${UA_BROWSER}") - if [ -z "$tmpresult" ]; then - echo -n -e "\r Tving:\t\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" - return - fi - - local isBlocked=$(echo "$tmpresult" | grep -i 'available in South Korea') - local isOK=$(echo "$tmpresult" | grep 'vod_type') - - if [ -z "$isBlocked" ] && [ -z "$isOK" ]; then - echo -n -e "\r Tving:\t\t\t\t\t${Font_Red}Failed (Error: PAGE ERROR)${Font_Suffix}\n" - return - fi - - if [ -n "$isBlocked" ]; then - echo -n -e "\r Tving:\t\t\t\t\t${Font_Red}No${Font_Suffix}\n" - return - fi - if [ -n "$isOK" ]; then - echo -n -e "\r Tving:\t\t\t\t\t${Font_Green}Yes${Font_Suffix}\n" - return - fi - - echo -n -e "\r Tving:\t\t\t\t\t${Font_Red}Failed (Error: Unknown)${Font_Suffix}\n" -} - -function MediaUnlockTest_CoupangPlay() { - if [ "${USE_IPV6}" == 1 ]; then - echo -n -e "\r Coupang Play:\t\t\t\t${Font_Red}IPv6 Is Not Currently Supported${Font_Suffix}\n" - return - fi - - local tmpresult=$(curl ${CURL_DEFAULT_OPTS} -sL 'https://www.coupangplay.com/' -w '%{http_code}_TAG_%{url_effective}\n' -o /dev/null --user-agent "${UA_BROWSER}") - local httpCode=$(echo "$tmpresult" | awk -F'_TAG_' '{print $1}') - - if [ "$httpCode" == '000' ]; then - echo -n -e "\r Coupang Play:\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" - return - fi - - local urlEffective=$(echo "$tmpresult" | awk -F'_TAG_' '{print $2}') - local isBlocked=$(echo "$urlEffective" | grep -i 'not-available') - - if [ -n "$isBlocked" ]; then - echo -n -e "\r Coupang Play:\t\t\t\t${Font_Red}No${Font_Suffix}\n" - return - fi - if [ "$httpCode" == '403' ]; then - echo -n -e "\r Coupang Play:\t\t\t\t${Font_Red}No${Font_Suffix}\n" - return - fi - if [ "$httpCode" == '200' ]; then - echo -n -e "\r Coupang Play:\t\t\t\t${Font_Green}Yes${Font_Suffix}\n" - return - fi - - echo -n -e "\r Coupang Play:\t\t\t\t${Font_Red}Failed (Error: ${httpCode})${Font_Suffix}\n" -} - -function MediaUnlockTest_NaverTV() { - if [ "${USE_IPV6}" == 1 ]; then - echo -n -e "\r Naver TV:\t\t\t\t${Font_Red}IPv6 Is Not Currently Supported${Font_Suffix}\n" - return - fi - - local ts=$(date +%s%3N) - local base_url='https://apis.naver.com/' - local key='nbxvs5nwNG9QKEWK0ADjYA4JZoujF4gHcIwvoCxFTPAeamq5eemvt5IWAYXxrbYM' - local sign_text="https://apis.naver.com/now_web2/now_web_api/v1/clips/31030608/play-info${ts}" - local signature=$(printf "%s" "${sign_text}" | openssl dgst -sha1 -hmac "${key}" -binary | openssl base64) - local signature_encoded=$(printf "%s" "${signature}" | sed 's/ /%20/g;s/!/%21/g;s/"/%22/g;s/#/%23/g;s/\$/%24/g;s/\&/%26/g;s/'\''/%27/g;s/(/%28/g;s/)/%29/g;s/\*/%2a/g;s/+/%2b/g;s/,/%2c/g;s/\//%2f/g;s/:/%3a/g;s/;/%3b/g;s/=/%3d/g;s/?/%3f/g;s/@/%40/g;s/\[/%5b/g;s/\]/%5d/g') - local req_url="${base_url}now_web2/now_web_api/v1/clips/31030608/play-info?msgpad=${ts}&md=${signature_encoded}" - local tmpresult=$(curl ${CURL_DEFAULT_OPTS} -s "${req_url}" --user-agent "${UA_Browser}" -H 'host: apis.naver.com' -H "sec-ch-ua: ${UA_SecCHUA}" -H 'accept: application/json, text/plain, */*' -H 'sec-ch-ua-mobile: ?0' -H 'sec-ch-ua-platform: "Windows"' -H 'origin: https://tv.naver.com' -H 'sec-fetch-site: same-site' -H 'sec-fetch-mode: cors' -H 'sec-fetch-dest: empty' -H 'referer: https://tv.naver.com/v/31030608' -H 'accept-language: en-US,en;q=0.9') - - if [ -z "$tmpresult" ]; then - echo -n -e "\r Naver TV:\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" - return - fi - - local result=$(echo "$tmpresult" | grep -woP '"playable"\s{0,}:\s{0,}"\K[^"]+') - - case "$result" in - 'NOT_COUNTRY_AVAILABLE') echo -n -e "\r Naver TV:\t\t\t\t${Font_Red}No${Font_Suffix}\n" ;; - 'PLAYABLE') echo -n -e "\r Naver TV:\t\t\t\t${Font_Green}Yes${Font_Suffix}\n" ;; - '') echo -n -e "\r Naver TV:\t\t\t\t${Font_Red}Failed (Error: PAGE ERROR)${Font_Suffix}\n" ;; - *) echo -n -e "\r Naver TV:\t\t\t\t${Font_Red}Failed (Error: ${result})${Font_Suffix}\n" ;; - esac -} - -function MediaUnlockTest_Afreeca() { - if [ "${USE_IPV6}" == 1 ]; then - echo -n -e "\r Afreeca TV:\t\t\t\t${Font_Red}IPv6 Is Not Currently Supported${Font_Suffix}\n" - return - fi - - local tmpresult=$(curl ${CURL_DEFAULT_OPTS} -sL 'https://vod.afreecatv.com/player/97464151' --user-agent "${UA_BROWSER}") - if [ -z "$tmpresult" ]; then - echo -n -e "\r Afreeca TV:\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" - return - fi - - local result=$(echo "$tmpresult" | grep "document.location.href='https://vod.afreecatv.com'" ) - if [ -z "$result" ]; then - echo -n -e "\r Afreeca TV:\t\t\t\t${Font_Green}Yes${Font_Suffix}\n" - else - echo -n -e "\r Afreeca TV:\t\t\t\t${Font_Red}No${Font_Suffix}\n" - fi -} - -function MediaUnlockTest_KBSDomestic() { - if [ "${USE_IPV6}" == 1 ]; then - echo -n -e "\r KBS Domestic:\t\t\t\t${Font_Red}IPv6 Is Not Currently Supported${Font_Suffix}\n" - return - fi - - local tmpresult=$(curl ${CURL_DEFAULT_OPTS} -sL 'https://vod.kbs.co.kr/index.html?source=episode&sname=vod&stype=vod&program_code=T2022-0690&program_id=PS-2022164275-01-000&broadcast_complete_yn=N&local_station_code=00§ion_code=03' --user-agent "${UA_BROWSER}") - if [ -z "$tmpresult" ]; then - echo -n -e "\r KBS Domestic:\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" - return - fi - - local result=$(echo "$tmpresult" | grep 'ipck' | grep -woP 'Domestic\\\"\s{0,}:\s{0,}\K(false|true)') - - if [ -z "$result" ]; then - echo -n -e "\r KBS Domestic:\t\t\t\t${Font_Red}Failed (Error: PAGE ERROR)${Font_Suffix}\n" - return - fi - if [ "$result" == 'true' ]; then - echo -n -e "\r KBS Domestic:\t\t\t\t${Font_Green}Yes${Font_Suffix}\n" - return - fi - if [ "$result" == 'false' ]; then - echo -n -e "\r KBS Domestic:\t\t\t\t${Font_Red}No${Font_Suffix}\n" - return - fi - - echo -n -e "\r KBS Domestic:\t\t\t\t${Font_Red}Failed (Error: Unknown)${Font_Suffix}\n" -} - -function MediaUnlockTest_KBSAmerican() { - if [ "${USE_IPV6}" == 1 ]; then - echo -n -e "\r KBS American:\t\t\t\t${Font_Red}IPv6 Is Not Currently Supported${Font_Suffix}\n" - return - fi - - local tmpresult=$(curl ${CURL_DEFAULT_OPTS} -fsL 'https://vod.kbs.co.kr/index.html?source=episode&sname=vod&stype=vod&program_code=T2022-0690&program_id=PS-2022164275-01-000&broadcast_complete_yn=N&local_station_code=00§ion_code=03' --user-agent "${UA_BROWSER}") - if [ -z "$tmpresult" ]; then - echo -n -e "\r KBS American:\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" - return - fi - - local result=$(echo "$tmpresult" | grep 'ipck' | grep -woP 'Domestic\\\"\s{0,}:\s{0,}\K(false|true)') - - if [ -z "$result" ]; then - echo -n -e "\r KBS American:\t\t\t\t${Font_Red}Failed (Error: PAGE ERROR)${Font_Suffix}\n" - return - fi - if [ "$result" == 'true' ]; then - echo -n -e "\r KBS American:\t\t\t\t${Font_Green}Yes${Font_Suffix}\n" - return - fi - if [ "$result" == 'false' ]; then - echo -n -e "\r KBS American:\t\t\t\t${Font_Red}No${Font_Suffix}\n" - return - fi - - echo -n -e "\r KBS American:\t\t\t\t${Font_Red}Failed (Error: Unknown)${Font_Suffix}\n" -} - -function MediaUnlockTest_Watcha() { - if [ "${USE_IPV6}" == 1 ]; then - echo -n -e "\r WATCHA:\t\t\t\t${Font_Red}IPv6 Is Not Currently Supported${Font_Suffix}\n" - return - fi - - local result=$(curl ${CURL_DEFAULT_OPTS} -fsL 'https://watcha.com/' -w %{http_code} -o /dev/null -H 'host: watcha.com' -H "sec-ch-ua: ${UA_SEC_CH_UA}" -H 'sec-ch-ua-mobile: ?0' -H 'sec-ch-ua-platform: "Windows"' -H 'upgrade-insecure-requests: 1' -H 'accept: */*;q=0.8,application/signed-exchange;v=b3;q=0.7' -H 'sec-fetch-site: none' -H 'sec-fetch-mode: navigate' -H 'sec-fetch-user: ?1' -H 'sec-fetch-dest: document' -H 'accept-language: en-US,en;q=0.9' --user-agent "${UA_BROWSER}") - - case "$result" in - '000') echo -n -e "\r WATCHA:\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" ;; - '200') echo -n -e "\r WATCHA:\t\t\t\t${Font_Green}Yes${Font_Suffix}\n" ;; - '451') echo -n -e "\r WATCHA:\t\t\t\t${Font_Red}No${Font_Suffix}\n" ;; - *) echo -n -e "\r WATCHA:\t\t\t\t${Font_Red}Failed (Error: ${result})${Font_Suffix}\n" ;; - esac -} - -function MediaUnlockTest_KOCOWA() { - if [ "${USE_IPV6}" == 1 ]; then - echo -n -e "\r KOCOWA:\t\t\t\t${Font_Red}IPv6 Is Not Currently Supported${Font_Suffix}\n" - return - fi - - local result=$(curl ${CURL_DEFAULT_OPTS} -fsL 'https://www.kocowa.com/' -w %{http_code} -o /dev/null --user-agent "${UA_BROWSER}") - - if [ "$result" == '000' ]; then - echo -n -e "\r KOCOWA:\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" - return - fi - - case "$result" in - '200') echo -n -e "\r KOCOWA:\t\t\t\t${Font_Green}Yes${Font_Suffix}\n" ;; - '403') echo -n -e "\r KOCOWA:\t\t\t\t${Font_Red}No${Font_Suffix}\n" ;; - *) echo -n -e "\r KOCOWA:\t\t\t\t${Font_Red}Failed (Error: ${result})${Font_Suffix}\n" ;; - esac -} - -function MediaUnlockTest_NBCTV() { - local fakeUuid=$(gen_uuid | tr a-z A-Z) - local tmpresult=$(curl ${CURL_DEFAULT_OPTS} -s 'https://geolocation.digitalsvc.apps.nbcuni.com/geolocation/live/usa' -H 'accept: application/media.geo-v2+json' -H 'accept-language: en-US,en;q=0.9' -H "app-session-id: ${fakeUuid}" -H 'authorization: NBC-Basic key="usa_live", version="3.0", type="cpc"' -H 'client: oneapp' -H 'content-type: application/json' -H 'origin: https://www.nbc.com' -H 'referer: https://www.nbc.com/' -H "sec-ch-ua: ${UA_SEC_CH_UA}" -H 'sec-ch-ua-mobile: ?0' -H 'sec-ch-ua-platform: "Windows"' -H 'sec-fetch-dest: empty' -H 'sec-fetch-mode: cors' -H 'sec-fetch-site: cross-site' --data-raw '{"adobeMvpdId":null,"serviceZip":null,"device":"web"}' --user-agent "${UA_BROWSER}") - if [ -z "$tmpresult" ]; then - echo -n -e "\r NBC TV:\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" - return - fi - - local result=$(echo "$tmpresult" | grep -woP '"restricted"\s{0,}:\s{0,}\K(false|true)') - - case "$result" in - 'false') echo -n -e "\r NBC TV:\t\t\t\t${Font_Green}Yes${Font_Suffix}\n" ;; - 'true') echo -n -e "\r NBC TV:\t\t\t\t${Font_Red}No${Font_Suffix}\n" ;; - '') echo -n -e "\r NBC TV:\t\t\t\t${Font_Red}Failed (Error: PAGE ERROR)${Font_Suffix}\n" ;; - *) echo -n -e "\r NBC TV:\t\t\t\t${Font_Red}Failed (Error: ${result})${Font_Suffix}\n" ;; - esac -} - -function MediaUnlockTest_Crackle() { - local tmpresult=$(curl ${CURL_DEFAULT_OPTS} -sLi 'https://prod-api.crackle.com/appconfig' -w "_TAG_%{http_code}_TAG_" -H 'Accept-Language: en-US,en;q=0.9' -H 'Content-Type: application/json' -H 'Origin: https://www.crackle.com' -H 'Referer: https://www.crackle.com/' -H 'Sec-Fetch-Dest: empty' -H 'Sec-Fetch-Mode: cors' -H 'Sec-Fetch-Site: same-site' -H "sec-ch-ua: ${UA_SEC_CH_UA}" -H 'sec-ch-ua-mobile: ?0' -H 'sec-ch-ua-platform: "Windows"' -H 'x-crackle-apiversion: v2.0.0' -H 'x-crackle-brand: crackle' -H 'x-crackle-platform: 5FE67CCA-069A-42C6-A20F-4B47A8054D46' --user-agent "${UA_BROWSER}") - - local httpCode=$(echo "$tmpresult" | grep '_TAG_' | awk -F'_TAG_' '{print $2}') - if [ "$httpCode" == '000' ]; then - echo -n -e "\r Crackle:\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" - return - fi - - local region=$(echo "$tmpresult" | grep -woP 'x-crackle-region:\s{0,}\K[A-Z]+') - - if [ -z "$region" ]; then - echo -n -e "\r Crackle:\t\t\t\t${Font_Red}Failed (Error: PAGE ERROR)${Font_Suffix}\n" - return - fi - if [ "$region" == 'US' ]; then - echo -n -e "\r Crackle:\t\t\t\t${Font_Green}Yes${Font_Suffix}\n" - else - echo -n -e "\r Crackle:\t\t\t\t${Font_Red}No${Font_Suffix}\n" - fi -} - -function MediaUnlockTest_AETV() { - if [ "${USE_IPV6}" == 1 ]; then - echo -n -e "\r A&E TV:\t\t\t\t${Font_Red}IPv6 Is Not Currently Supported${Font_Suffix}\n" - return - fi - - local tmpresult=$(curl ${CURL_DEFAULT_OPTS} -s 'https://link.theplatform.com/s/xc6n8B/UR27JDU0bu2s/' --user-agent "${UA_BROWSER}") - if [ -z "$tmpresult" ]; then - echo -n -e "\r A&E TV:\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" - return - fi - - local isBlocked=$(echo "$tmpresult" | grep -i 'GeoLocationBlocked') - if [ -n "$isBlocked" ]; then - echo -n -e "\r A&E TV:\t\t\t\t${Font_Red}No${Font_Suffix}\n" - return - fi - - local tmpresult1=$(curl ${CURL_DEFAULT_OPTS} -s 'https://play.aetv.com/' -o /dev/null -D - --user-agent "${UA_BROWSER}") - - local region=$(echo "$tmpresult1" | grep -woP 'AETN-Country-Code=\K[A-Z]+' | head -n 1) - if [ -z "$region" ]; then - echo -n -e "\r A&E TV:\t\t\t\t${Font_Red}Failed (Error: PAGE ERROR)${Font_Suffix}\n" - return - fi - - case "$region" in - 'CA'|'US') echo -n -e "\r A&E TV:\t\t\t\t${Font_Green}Yes${Font_Suffix}\n" ;; - *) echo -n -e "\r A&E TV:\t\t\t\t${Font_Red}No${Font_Suffix}\n" ;; - esac -} - -function MediaUnlockTest_NFLPlus() { - if [ "${USE_IPV6}" == 1 ]; then - echo -n -e "\r NFL+:\t\t\t\t\t${Font_Red}IPv6 Is Not Currently Supported${Font_Suffix}\n" - return - fi - - local tmpresult=$(curl ${CURL_DEFAULT_OPTS} -fsL 'https://www.nfl.com/plus/' -w '%{http_code}_TAG_%{url_effective}\n' -o dev/null --user-agent "${UA_BROWSER}") - local httpCode=$(echo "$tmpresult" | awk -F'_TAG_' '{print $1}') - if [ "$httpCode" == '000' ]; then - echo -n -e "\r NFL+:\t\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" - return - fi - - local urlEffective=$(echo "$tmpresult" | awk -F'_TAG_' '{print $2}') - local isBlocked=$(echo "$urlEffective" | grep -iE 'nfl-game-pass|gpi.nfl.com') - - if [ -n "$isBlocked" ]; then - echo -n -e "\r NFL+:\t\t\t\t\t${Font_Red}No${Font_Suffix}\n" - return - fi - if [ "$httpCode" == '200' ]; then - echo -n -e "\r NFL+:\t\t\t\t\t${Font_Green}Yes${Font_Suffix}\n" - return - fi - - echo -n -e "\r NFL+:\t\t\t\t\t${Font_Red}Failed (Error: ${httpCode})${Font_Suffix}\n" -} - -function MediaUnlockTest_SkyShowTime() { - local tmpresult=$(curl ${CURL_DEFAULT_OPTS} -fsL 'https://www.skyshowtime.com/' -w "_TAG_%{http_code}_TAG_" -o /dev/null -D - -H 'accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7' -H 'accept-language: en-US,en;q=0.9' -H "sec-ch-ua: ${UA_SEC_CH_UA}" -H 'sec-ch-ua-mobile: ?0' -H 'sec-ch-ua-platform: "Windows"' -H 'sec-fetch-dest: document' -H 'sec-fetch-mode: navigate' -H 'sec-fetch-site: none' -H 'sec-fetch-user: ?1' --user-agent "${UA_BROWSER}") - - local httpCode=$(echo "$tmpresult" | grep '_TAG_' | awk -F'_TAG_' '{print $2}') - if [ "$httpCode" == '000' ]; then - echo -n -e "\r SkyShowTime:\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" - return - fi - - if [ "$httpCode" == '403' ]; then - echo -n -e "\r SkyShowTime:\t\t\t\t${Font_Red}No${Font_Suffix}\n" - return - fi - - local isBlocked=$(echo "$tmpresult" | grep -i 'where-can-i-stream') - if [ -n "$isBlocked" ]; then - echo -n -e "\r SkyShowTime:\t\t\t\t${Font_Red}No${Font_Suffix}\n" - return - fi - - local region=$(echo "$tmpresult" | grep -woP 'activeTerritory=\K[A-Z]+' | head -n 1) - if [ -z "$region" ]; then - echo -n -e "\r SkyShowTime:\t\t\t\t${Font_Red}Failed (Error: PAGE ERROR)${Font_Suffix}\n" - return - fi - - if [ "$httpCode" == '200' ]; then - echo -n -e "\r SkyShowTime:\t\t\t\t${Font_Green}Yes (Region: ${region})${Font_Suffix}\n" - return - fi - - echo -n -e "\r SkyShowTime:\t\t\t\t${Font_Red}Faild (Error: ${httpCode})${Font_Suffix}\n" -} - -function GameTest_MathsSpot() { - if [ "${USE_IPV6}" == 1 ]; then - echo -n -e "\r MathsSpot Roblox:\t\t\t${Font_Red}IPv6 Is Not Currently Supported${Font_Suffix}\n" - return - fi - - local tmpresult=$(curl ${CURL_DEFAULT_OPTS} -sL 'https://mathsspot.com/' -H 'accept: */*;q=0.8,application/signed-exchange;v=b3;q=0.7' -H 'accept-language: en-US,en;q=0.9' --user-agent "${UA_BROWSER}") - if [ -z "$tmpresult" ]; then - echo -n -e "\r MathsSpot Roblox:\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" - return - fi - - local isBlocked=$(echo "$tmpresult" | grep -i 'FailureServiceNotInRegion') - if [ -n "$isBlocked" ]; then - echo -n -e "\r MathsSpot Roblox:\t\t\t${Font_Red}No${Font_Suffix}\n" - return - fi - - local apiPath=$(echo "$tmpresult" | grep -woP 'fetch\("\K[^"]+' | grep 'reportEvent' | sed 's/\/reportEvent//;s/^\///') - local region=$(echo "$tmpresult" | grep -woP '"countryCode"\s{0,}:\s{0,}"\K[^"]+') - local nggFeVersion=$(echo "$tmpresult" | grep -woP '"NEXT_PUBLIC_FE_VERSION"\s{0,}:\s{0,}"\K[^"]+') - if [ -z "$apiPath" ] || [ -z "$nggFeVersion" ] || [ -z "$region" ]; then - echo -n -e "\r MathsSpot Roblox:\t\t\t${Font_Red}Failed (Error: PAGE ERROR)${Font_Suffix}\n" - return - fi - - local fakeUAId=$(gen_random_str 21) - local fakeSessId=$(gen_random_str 21) - local fakeFesessId=$(gen_random_str 21) - local fakeVisitId=$(gen_random_str 21) - - local tmpresult1=$(curl ${CURL_DEFAULT_OPTS} -sL "https://mathsspot.com/${apiPath}/startSession?appId=5349&uaId=ua-${fakeUAId}&uaSessionId=uasess-${fakeSessId}&feSessionId=fesess-${fakeFesessId}&visitId=visitid-${fakeVisitId}&initialOrientation=landscape&utmSource=NA&utmMedium=NA&utmCampaign=NA&deepLinkUrl=&accessCode=&ngReferrer=NA&pageReferrer=NA&ngEntryPoint=https%3A%2F%2Fmathsspot.com%2F&ntmSource=NA&customData=&appLaunchExtraData=&feSessionTags=nowgg&sdpType=&eVar=&isIframe=false&feDeviceType=desktop&feOsName=window&userSource=direct&visitSource=direct&userCampaign=NA&visitCampaign=NA" -H 'accept: */*' -H 'accept-language: en-US,en;q=0.9' -H 'referer: https://mathsspot.com/' -H "sec-ch-ua: ${UA_SEC_CH_UA}" -H 'sec-ch-ua-mobile: ?0' -H 'sec-ch-ua-platform: "Windows"' -H 'sec-fetch-dest: empty' -H 'sec-fetch-mode: cors' -H 'sec-fetch-site: same-origin' -H 'x-ngg-skip-evar-check: true' -H "x-ngg-fe-version: ${nggFeVersion}") - if [ -z "$tmpresult1" ]; then - echo -n -e "\r MathsSpot Roblox:\t\t\t${Font_Red}Failed (Network Connection 1)${Font_Suffix}\n" - return - fi - - local status=$(echo "$tmpresult1" | grep -woP '"status"\s{0,}:\s{0,}"\K[^"]+' | head -n 1) - if [ -z "$status" ]; then - echo -n -e "\r MathsSpot Roblox:\t\t\t${Font_Red}Failed (Error: PAGE ERROR 1)${Font_Suffix}\n" - return - fi - - case "$status" in - 'FailureServiceNotInRegion') echo -n -e "\r MathsSpot Roblox:\t\t\t${Font_Red}No${Font_Suffix}\n" ;; - 'FailureProxyUserLimitExceeded') echo -n -e "\r MathsSpot Roblox:\t\t\t${Font_Red}No (Proxy/VPN Detected)${Font_Suffix}\n" ;; - 'Success') echo -n -e "\r MathsSpot Roblox:\t\t\t${Font_Green}Yes (Region: ${region})${Font_Suffix}\n" ;; - *) echo -n -e "\r MathsSpot Roblox:\t\t\t${Font_Red}Failed (Error: $status)${Font_Suffix}\n" ;; - esac -} - -function MediaUnlockTest_BGlobalSEA() { - if [ "${USE_IPV6}" == 1 ]; then - echo -n -e "\r B-Global SouthEastAsia:\t\t${Font_Red}IPv6 Is Not Currently Supported${Font_Suffix}\n" - return - fi - - local tmpresult=$(curl ${CURL_DEFAULT_OPTS} -sL 'https://api.bilibili.tv/intl/gateway/web/playurl?s_locale=en_US&platform=web&ep_id=347666' --user-agent "${UA_BROWSER}") - if [ -z "$tmpresult" ]; then - echo -n -e "\r B-Global SouthEastAsia:\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" - return - fi - - local result=$(echo "$tmpresult" | grep -woP '"code"\s{0,}:\s{0,}\K[-\d]+' | head -n 1) - - case "$result" in - '0') echo -n -e "\r B-Global SouthEastAsia:\t\t${Font_Green}Yes${Font_Suffix}\n" ;; - '10003003'|'10004001') echo -n -e "\r B-Global SouthEastAsia:\t\t${Font_Red}No${Font_Suffix}\n" ;; - *) echo -n -e "\r B-Global SouthEastAsia:\t\t${Font_Red}Failed (Error: ${result})${Font_Suffix}\n" ;; - esac -} - -function MediaUnlockTest_BGlobalTH() { - if [ "${USE_IPV6}" == 1 ]; then - echo -n -e "\r B-Global Thailand Only:\t\t${Font_Red}IPv6 Is Not Currently Supported${Font_Suffix}\n" - return - fi - - local tmpresult=$(curl ${CURL_DEFAULT_OPTS} -sL 'https://api.bilibili.tv/intl/gateway/web/playurl?s_locale=en_US&platform=web&ep_id=10077726' --user-agent "${UA_BROWSER}") - if [ -z "$tmpresult" ]; then - echo -n -e "\r B-Global Thailand Only:\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" - return - fi - - local result=$(echo "$tmpresult" | grep -woP '"code"\s{0,}:\s{0,}\K[-\d]+' | head -n 1) - - case "$result" in - '0') echo -n -e "\r B-Global Thailand Only:\t\t${Font_Green}Yes${Font_Suffix}\n" ;; - '10003003'|'10004001') echo -n -e "\r B-Global Thailand Only:\t\t${Font_Red}No${Font_Suffix}\n" ;; - *) echo -n -e "\r B-Global Thailand Only:\t\t${Font_Red}Failed (Error: ${result})${Font_Suffix}\n" ;; - esac -} - -function MediaUnlockTest_BGlobalID() { - if [ "${USE_IPV6}" == 1 ]; then - echo -n -e "\r B-Global Indonesia Only:\t\t${Font_Red}IPv6 Is Not Currently Supported${Font_Suffix}\n" - return - fi - - local tmpresult=$(curl ${CURL_DEFAULT_OPTS} -fsL 'https://api.bilibili.tv/intl/gateway/web/playurl?s_locale=en_US&platform=web&ep_id=11130043' --user-agent "${UA_BROWSER}") - if [ -z "$tmpresult" ]; then - echo -n -e "\r B-Global Indonesia Only:\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" - return - fi - - local result=$(echo "$tmpresult" | grep -woP '"code"\s{0,}:\s{0,}\K[-\d]+' | head -n 1) - - case "$result" in - '0') echo -n -e "\r B-Global Indonesia Only:\t\t${Font_Green}Yes${Font_Suffix}\n" ;; - '10003003'|'10004001') echo -n -e "\r B-Global Indonesia Only:\t\t${Font_Red}No${Font_Suffix}\n" ;; - *) echo -n -e "\r B-Global Indonesia Only:\t\t${Font_Red}Failed (Error: ${result})${Font_Suffix}\n" ;; - esac -} - -function MediaUnlockTest_BGlobalVN() { - if [ "${USE_IPV6}" == 1 ]; then - echo -n -e "\r B-Global Việt Nam Only:\t\t${Font_Red}IPv6 Is Not Currently Supported${Font_Suffix}\n" - return - fi - - local tmpresult=$(curl ${CURL_DEFAULT_OPTS} -sL 'https://api.bilibili.tv/intl/gateway/web/playurl?s_locale=en_US&platform=web&ep_id=11405745' --user-agent "${UA_BROWSER}") - if [ -z "$tmpresult" ]; then - echo -n -e "\r B-Global Việt Nam Only:\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" - return - fi - - local result=$(echo "$tmpresult" | grep -woP '"code"\s{0,}:\s{0,}\K[-\d]+' | head -n 1) - - case "$result" in - '0') echo -n -e "\r B-Global Việt Nam Only:\t\t${Font_Green}Yes${Font_Suffix}\n" ;; - '10003003'|'10004001') echo -n -e "\r B-Global Việt Nam Only:\t\t${Font_Red}No${Font_Suffix}\n" ;; - *) echo -n -e "\r B-Global Việt Nam Only:\t\t${Font_Red}Failed (Error: ${result})${Font_Suffix}\n" ;; - esac -} - -function MediaUnlockTest_AISPlay() { - if [ "${USE_IPV6}" == 1 ]; then - echo -n -e "\r AIS Play:\t\t\t\t${Font_Red}IPv6 Is Not Currently Supported${Font_Suffix}\n" - return - fi - - local userId='09e8b25510' - local userPasswd='e49e9f9e7f' - local fakeApiKey=$(gen_uuid | md5sum | cut -f1 -d' ') - local fakeUdid=$(gen_uuid | md5sum | cut -f1 -d' ') - local timestamp=$(date +%s) - local tmpresult=$(curl ${CURL_DEFAULT_OPTS} -sL "https://web-tls.ais-vidnt.com/device/login/?d=gstweb&gst=1&user=${userId}&pass=${userPasswd}" -H 'accept-language: th' -H 'api-version: 2.8.2' -H "api_key: ${fakeApiKey}" -H 'content-type: multipart/form-data; boundary=----WebKitFormBoundaryBj2RhUIW7BtRvfK0' -H 'device-info: com.vimmi.ais.portal, Windows + Chrome, AppVersion: 4.9.97, 10, language: tha' -H 'origin: https://aisplay.ais.co.th' -H "privateid: ${userId}" -H 'referer: https://aisplay.ais.co.th/' -H "sec-ch-ua: ${UA_SEC_CH_UA}" -H 'sec-ch-ua-mobile: ?0' -H 'sec-ch-ua-platform: "Windows"' -H 'sec-fetch-dest: empty' -H 'sec-fetch-mode: cors' -H 'sec-fetch-site: cross-site' -H "time: ${timestamp}" -H "udid: ${fakeUdid}" --data-raw $'------WebKitFormBoundaryBj2RhUIW7BtRvfK0--\r\n' --user-agent "${UA_BROWSER}") - if [ -z "$tmpresult" ]; then - echo -n -e "\r AIS Play:\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" - return - fi - - local sId=$(echo "$tmpresult" | grep -woP '"sid"\s{0,}:\s{0,}"\K[^"]+') - local datAuth=$(echo "$tmpresult" | grep -woP '"dat"\s{0,}:\s{0,}"\K[^"]+') - # 新时间戳 - local timestamp=$(date +%s) - # 取播放模板 - local tmpresult1=$(curl ${CURL_DEFAULT_OPTS} -sL 'https://web-sila.ais-vidnt.com/playtemplate/?d=gstweb' -H 'accept-language: en-US,en;q=0.9' -H 'api-version: 2.8.2' -H "api_key: ${fakeApiKey}" -H "dat: ${datAuth}" -H 'device-info: com.vimmi.ais.portal, Windows + Chrome, AppVersion: 0.0.0, 10, Language: unknown' -H 'origin: https://web-player.ais-vidnt.com' -H "privateid: ${userId}" -H 'referer: https://web-player.ais-vidnt.com/' -H "sec-ch-ua: ${UA_SEC_CH_UA}" -H 'sec-ch-ua-mobile: ?0' -H 'sec-ch-ua-platform: "Windows"' -H 'sec-fetch-dest: empty' -H 'sec-fetch-mode: cors' -H 'sec-fetch-site: same-site' -H "sid: ${sId}" -H "time: ${timestamp}" -H "udid: ${fakeUdid}" --user-agent "${UA_BROWSER}") - if [ -z "$tmpresult1" ]; then - echo -n -e "\r AIS Play:\t\t\t\t${Font_Red}Failed (Network Connection 1)${Font_Suffix}\n" - return - fi - - local tmpLiveUrl=$(echo "$tmpresult1" | grep -woP '"live"\s{0,}:\s{0,}"\K[^"]+') - if [ -z "$tmpLiveUrl" ]; then - echo -n -e "\r AIS Play:\t\t\t\t${Font_Red}Failed (Error: PAGE ERROR)${Font_Suffix}\n" - return - fi - - local mediaId='B0006' - local realLiveUrl=$(echo "$tmpLiveUrl" | sed "s/{MID}/${mediaId}/g;s/metadata.xml/metadata.json/g" ) - local realLiveUrl="${realLiveUrl}-https&tuid=${userId}&tdid=${fakeUdid}&chunkHttps=true&origin=anevia" - # example: 'https://redirector.ais-vidnt.com/live/ais/B0006/hls/metadata.json?https_streaming=true&tt=f0037b2dae1b884e32fa90f00f146b7e&tpbk=DOGPcIOg1bIpIIrW&tfa=f0-fc&tttlt=1716631179&cdn=live_free-https&tuid=09e8b25510&tdid=01552b8e90f7e9f9e94ea4779cec29e6&chunkHttps=true&origin=anevia' - - # 取剧集播放网址 - local tmpresult2=$(curl ${CURL_DEFAULT_OPTS} -sL "$realLiveUrl" -H 'Accept-Language: en-US,en;q=0.9' -H 'Origin: https://web-player.ais-vidnt.com' -H 'Referer: https://web-player.ais-vidnt.com/' -H 'Sec-Fetch-Dest: empty' -H 'Sec-Fetch-Mode: cors' -H 'Sec-Fetch-Site: same-site' -H "sec-ch-ua: ${UA_SEC_CH_UA}" -H 'sec-ch-ua-mobile: ?0' -H 'sec-ch-ua-platform: "Windows"' --user-agent "${UA_BROWSER}") - - # 取第一优先级播放地址 - local playUrl=$(echo "$tmpresult2" | grep -woP '"url"\s{0,}:\s{0,}"\K[^"]+' | grep 'rewriter' | head -n 1) - if [ -z "$playUrl" ]; then - echo -n -e "\r AIS Play:\t\t\t\t${Font_Red}Failed (Error: PAGE ERROR)${Font_Suffix}\n" - return - fi - - local tmpresult3=$(curl ${CURL_DEFAULT_OPTS} -sLi "$playUrl" -H 'Accept-Language: en-US,en;q=0.9' -H 'Origin: https://web-player.ais-vidnt.com' -H 'Referer: https://web-player.ais-vidnt.com/' -H 'Sec-Fetch-Dest: empty' -H 'Sec-Fetch-Mode: cors' -H 'Sec-Fetch-Site: same-site' -H "sec-ch-ua: ${UA_SEC_CH_UA}" -H 'sec-ch-ua-mobile: ?0' -H 'sec-ch-ua-platform: "Windows"' --user-agent "${UA_BROWSER}") - - # X-Base-Request-Check-Status: INCORRECT X-Geo-Protection-System-Status: BLOCK - local baseRequstCheckStatus=$(echo "$tmpresult3" | grep -woP 'X-Base-Request-Check-Status:\s{0,}\K\w+') - if [ -z "$baseRequstCheckStatus" ]; then - echo -n -e "\r AIS Play:\t\t\t\t${Font_Red}Failed (Error: PAGE ERROR)${Font_Suffix}\n" - return - fi - if [ "$baseRequstCheckStatus" == 'INCORRECT' ]; then - echo -n -e "\r AIS Play:\t\t\t\t${Font_Red}Failed (Error: PAGE ERROR)${Font_Suffix}\n" - return - fi - - local result="$(echo "$tmpresult3" | grep -woP 'X-Geo-Protection-System-Status:\s{0,}\K\w+')" - - case "$result" in - 'BLOCK') echo -n -e "\r AIS Play:\t\t\t\t${Font_Red}No${Font_Suffix}\n" ;; - 'ALLOW') echo -n -e "\r AIS Play:\t\t\t\t${Font_Green}Yes${Font_Suffix}\n" ;; - '') echo -n -e "\r AIS Play:\t\t\t\t${Font_Red}Failed (Error: PAGE ERROR)${Font_Suffix}\n" ;; - *) echo -n -e "\r AIS Play:\t\t\t\t${Font_Red}Failed (Error: ${result})${Font_Suffix}\n" ;; - esac -} - -function WebTest_OpenAI() { - local tmpresult1=$(curl ${CURL_DEFAULT_OPTS} -s 'https://api.openai.com/compliance/cookie_requirements' -H 'authority: api.openai.com' -H 'accept: */*' -H 'accept-language: en-US,en;q=0.9' -H 'authorization: Bearer null' -H 'content-type: application/json' -H 'origin: https://platform.openai.com' -H 'referer: https://platform.openai.com/' -H "sec-ch-ua: ${UA_SEC_CH_UA}" -H 'sec-ch-ua-mobile: ?0' -H 'sec-ch-ua-platform: "Windows"' -H 'sec-fetch-dest: empty' -H 'sec-fetch-mode: cors' -H 'sec-fetch-site: same-site' --user-agent "${UA_BROWSER}") - local tmpresult2=$(curl ${CURL_DEFAULT_OPTS} -s 'https://ios.chat.openai.com/' -H 'authority: ios.chat.openai.com' -H 'accept: */*;q=0.8,application/signed-exchange;v=b3;q=0.7' -H 'accept-language: en-US,en;q=0.9' -H "sec-ch-ua: ${UA_SEC_CH_UA}" -H 'sec-ch-ua-mobile: ?0' -H 'sec-ch-ua-platform: "Windows"' -H 'sec-fetch-dest: document' -H 'sec-fetch-mode: navigate' -H 'sec-fetch-site: none' -H 'sec-fetch-user: ?1' -H 'upgrade-insecure-requests: 1' --user-agent "${UA_BROWSER}") - if [ -z "$tmpresult1" ]; then - echo -n -e "\r ChatGPT:\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" - return - fi - if [ -z "$tmpresult2" ]; then - echo -n -e "\r ChatGPT:\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" - return - fi - - local result1=$(echo "$tmpresult1" | grep -i 'unsupported_country') - local result2=$(echo "$tmpresult2" | grep -i 'VPN') - if [ -z "$result2" ] && [ -z "$result1" ]; then - echo -n -e "\r ChatGPT:\t\t\t\t${Font_Green}Yes${Font_Suffix}\n" - return - fi - if [ -n "$result2" ] && [ -n "$result1" ]; then - echo -n -e "\r ChatGPT:\t\t\t\t${Font_Red}No${Font_Suffix}\n" - return - fi - if [ -z "$result1" ] && [ -n "$result2" ]; then - echo -n -e "\r ChatGPT:\t\t\t\t${Font_Yellow}No (Only Available with Web Browser)${Font_Suffix}\n" - return - fi - if [ -n "$result1" ] && [ -z "$result2" ]; then - echo -n -e "\r ChatGPT:\t\t\t\t${Font_Yellow}No (Only Available with Mobile APP)${Font_Suffix}\n" - return - fi - - echo -n -e "\r ChatGPT:\t\t\t\t${Font_Red}Failed (Error: Unknown)${Font_Suffix}\n" -} - -function WebTest_Gemini() { - local tmpresult=$(curl ${CURL_DEFAULT_OPTS} -sL "https://gemini.google.com" --user-agent "${UA_BROWSER}") - if [[ "$tmpresult" = "curl"* ]]; then - echo -n -e "\r Google Gemini:\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" - return - fi - result=$(echo "$tmpresult" | grep -q '45631641,null,true' && echo "Yes" || echo "") - countrycode=$(echo "$tmpresult" | grep -o ',2,1,200,"[A-Z]\{3\}"' | sed 's/,2,1,200,"//;s/"//' || echo "") - if [ -n "$result" ] && [ -n "$countrycode" ]; then - echo -n -e "\r Google Gemini:\t\t\t\t${Font_Green}Yes (Region: $countrycode)${Font_Suffix}\n" - return - elif [ -n "$result" ]; then - echo -n -e "\r Google Gemini:\t\t\t\t${Font_Green}Yes${Font_Suffix}\n" - return - else - echo -n -e "\r Google Gemini:\t\t\t\t${Font_Red}No${Font_Suffix}\n" - return - fi -} - -function WebTest_Claude() { - local UA_Browser="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36" - local response=$(curl ${CURL_DEFAULT_OPTS} -s -o /dev/null -w "%{http_code}" -A "${UA_Browser}" "https://claude.ai/") - if [ -z "$response" ]; then - echo -n -e "\r Claude:\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" - return - fi - if [ "$response" -eq 200 ]; then - echo -n -e "\r Claude:\t\t\t\t${Font_Green}Yes${Font_Suffix}\n" - else - echo -n -e "\r Claude:\t\t\t\t${Font_Red}No${Font_Suffix}\n" - fi -} - -function WebTest_MetaAI() { - local tmpresult=$(curl ${CURL_DEFAULT_OPTS} -sL 'https://www.meta.ai/' -H 'accept: */*;q=0.8,application/signed-exchange;v=b3;q=0.7' -H 'accept-language: en-US,en;q=0.9' -H "sec-ch-ua: ${UA_SEC_CH_UA}" -H 'sec-ch-ua-mobile: ?0' -H 'sec-ch-ua-platform: "Windows"' -H 'sec-fetch-dest: document' -H 'sec-fetch-mode: navigate' -H 'sec-fetch-site: none' -H 'sec-fetch-user: ?1' -H 'upgrade-insecure-requests: 1' --user-agent "${UA_BROWSER}") - if [ -z "$tmpresult" ]; then - echo -n -e "\r Meta AI:\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" - return - fi - - local isBlocked=$(echo "$tmpresult" | grep -i 'AbraGeoBlockedErrorRoot') - local isOK=$(echo "$tmpresult" | grep -i 'AbraHomeRootConversationQuery') - - if [ -z "$isBlocked" ] && [ -z "$isOK" ]; then - echo -n -e "\r Meta AI:\t\t\t\t${Font_Red}Failed (Error: PAGE ERROR)${Font_Suffix}\n" - return - fi - - if [ -n "$isBlocked" ]; then - echo -n -e "\r Meta AI:\t\t\t\t${Font_Red}No${Font_Suffix}\n" - return - fi - - if [ -n "$isOK" ]; then - local region=$(echo "$tmpresult" | grep -woP '"code"\s{0,}:\s{0,}"\K[^"]+' | cut -d'_' -f2) - echo -n -e "\r Meta AI:\t\t\t\t${Font_Green}Yes (Region: ${region})${Font_Suffix}\n" - return - fi - - echo -n -e "\r Meta AI:\t\t\t\t${Font_Red}Failed (Error: Unknown)${Font_Suffix}\n" -} - -function RegionTest_Bing() { - local tmpresult=$(curl ${CURL_DEFAULT_OPTS} -s 'https://www.bing.com/search?q=curl' --user-agent "${UA_BROWSER}") - if [ -z "$tmpresult" ]; then - echo -n -e "\r Bing Region:\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" - return - fi - - local isCN=$(echo "$tmpresult" | grep 'cn.bing.com') - local region=$(echo "$tmpresult" | grep -woP 'Region\s{0,}:\s{0,}"\K[^"]+') - - if [ -n "$isCN" ]; then - local region='CN' - echo -n -e "\r Bing Region:\t\t\t\t${Font_Yellow}${region}${Font_Suffix}\n" - return - fi - - local isRisky=$(echo "$tmpresult" | grep 'sj_cook.set("SRCHHPGUSR","HV"') - - if [ -n "$isRisky" ]; then - echo -n -e "\r Bing Region:\t\t\t\t${Font_Yellow}${region} (Risky)${Font_Suffix}\n" - return - fi - - echo -n -e "\r Bing Region:\t\t\t\t${Font_Green}${region}${Font_Suffix}\n" -} - -function WebTest_Wikipedia_Editable() { - local tmpresult=$(curl ${CURL_DEFAULT_OPTS} -s 'https://zh.wikipedia.org/w/index.php?title=Wikipedia%3A%E6%B2%99%E7%9B%92&action=edit' --user-agent "${UA_BROWSER}") - if [ -z "$tmpresult" ]; then - echo -n -e "\r Wikipedia Editability:\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" - return - fi - - local result=$(echo "$tmpresult" | grep -i 'Banned') - if [ -z "$result" ]; then - echo -n -e "\r Wikipedia Editability:\t\t\t${Font_Green}Yes${Font_Suffix}\n" - return - fi - - echo -n -e "\r Wikipedia Editability:\t\t\t${Font_Red}No${Font_Suffix}\n" -} - -function MediaUnlockTest_K_PLUS() { - if [ "${USE_IPV6}" == 1 ]; then - echo -n -e "\r K+:\t\t\t\t\t${Font_Red}IPv6 Is Not Currently Supported${Font_Suffix}\n" - return - fi - - local token=$(curl ${CURL_DEFAULT_OPTS} -s -H "Origin: https://xem.kplus.vn" -H "Referer: https://xem.kplus.vn/" -X POST -d '{"osVersion":"Windows NT 10.0","appVersion":"114.0.0.0","deviceModel":"Chrome","deviceType":"PC","deviceSerial":"w39db81c0-a2e9-11ed-952a-49b91c9e6f09","deviceOem":"Chrome","devicePrettyName":"Chrome","ssoToken":"eyJrZXkiOiJ2c3R2IiwiZW5jIjoiQTEyOENCQy1IUzI1NiIsImFsZyI6ImRpciJ9..MWbBlLuci2KNLl9lvMe63g.IbBX7-dg3BWaXzzoxTQz-pJFulm_Y8axWLuG5DcJxQ9jTUPOhA2e6dzOP2hryAFVPFoIRs97ONGTHEYTFQgUtRlvqvx53jyTi3yegU6zWhJnhYZA2sdaj9khsNvVAth0zcWFoWA9GGwfNE5TZLOwczAexIxqC1Ee-tQDILC4XklFrJfvdzoCQBABRXpD_O4HHHIYFs0jBMtYSyD9Vq7dTD61sAVca_83lav7jvpP17PuAo3HHIFQtUdcugpgkB91mJbABIDTPdo0mqdzbgTA_FilwO1Z5qnpwqIZIXy0bhVXFFcwUZPIUxjLEVzP3SyHceFF5N-v7OeYhYZRLYuBKxWj1cRb3LAa3FGJvefqRsBadlsr0cZnOgx0TsL51a2SaIpNyyGtaq8KTTLULIZBb2Zsq2jmBkZtxjoPxUR8ku7J4sL0tfLDoMlWVZkrX4_1tls3E-l8Ael-wd0kbS1i2vpf-Vdh80lRClpDg3ibSSUFPsp3wYMFsuKfyY8vpHrCfYDJDDbYOSv20sfnU7q7gcmizTCFBuiszmXbFX9_aH8UOaCGeqkYDV1ZZ3mQ26TM7JEquuZTV09wdi81ABoM8RZcb2ua0cuocaO4-asMh8KQWNea9BCYlKK5NSPz--oGgGxSdvxZ63qQz1Lr4QZytA2buoQV5OlMoEP7k87fPcig5rPqsK7aeWUXJSmfiOBbSLztoiamvvHClMpds3frv0ud8NWUUoijmS_JUGfF7XYNxWWqEGJuDUoSllV5MVwtIb5wM069gR7zknrr5aRVDi3Nho16KHQ_iB3vxoIr-ExajWLNlvo44CopGhxhgOAKPkULV356uamZpB7twY_iEVrwGMQA1_hEH4usO-UbzuxL_pssLhJKD4NjVcTe86Z08Bfm0IyiNWESmFkA6FVfsxu57Yfd4bXT8mxnfXXmklb7u7vB0RVYRo4i26QGJbPknybHdfgQWEvRCMoAjEG-E2LymBAMwFneWEpPTwBMpfvlTHnGnUtfViA4Zy1xqF2q95g9AF9nF3sE4YpYuSFSkUQB4sZd8emDApIdP6Avqsq809Gg06_R2sUGrD9SQ-XbXhvtAYMcaUcSv54hJvRcSUkygqU8tdg4tJHR23UBb-I.UfpC5BKhvt8EE5gpIFMQoQ","brand":"vstv","environment":"p","language":"en_US","memberId":"0","featureLevel":4,"provisionData":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpYyI6dHJ1ZSwiaWF0IjoxNjg2NTc4NzYyLCJ1cCI6ImNwaSIsImRlIjoiYnJhbmRNYXBwaW5nIiwiYnIiOiJ2c3R2IiwiZHMiOiJ3MzlkYjgxYzAtYTJlOS0xMWVkLTk1MmEtNDliOTFjOWU2ZjA5In0.3mbI7wnJKtRf3493yc_ZEMEvzUXldwDx0sSZdwQnlNk"}' "https://tvapi-sgn.solocoo.tv/v1/session" | grep -woP '"token"\s{0,}:\s{0,}"\K[^"]+' | awk '{print $2}' | cut -f2 -d'"') - if [ -z "$token" ]; then - echo -n -e "\r K+:\t\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" - return - fi - - local tmpresult=$(curl ${CURL_DEFAULT_OPTS} -s -X POST -d '{"player":{"name":"RxPlayer","version":"3.29.0","capabilities":{"mediaTypes":["DASH","DASH"],"drmSystems":["PlayReady","Widevine"],"smartLib":true}}}' -H "Content-Type: application/json" -H "Authorization: Bearer $token" "https://tvapi-sgn.solocoo.tv/v1/assets/BJO0h8jMwJWg5Id_4VLxIJ-VscUzRry_myp4aC21/play") - if [ -z "$tmpresult" ]; then - echo -n -e "\r K+:\t\t\t\t\t${Font_Red}Failed (Network Connection 1)${Font_Suffix}\n" - return - fi - - local result=$(echo "$tmpresult" | grep 'geoblock') - - if [ -n "$result" ]; then - echo -n -e "\r K+:\t\t\t\t\t${Font_Red}No${Font_Suffix}\n" - return - fi - - echo -n -e "\r K+:\t\t\t\t\t${Font_Green}Yes${Font_Suffix}\n" -} - -function MediaUnlockTest_TV360() { - if [ "${USE_IPV6}" == 1 ]; then - echo -n -e "\r TV360:\t\t\t\t\t${Font_Red}IPv6 Is Not Currently Supported${Font_Suffix}\n" - return - fi - - local tmpresult=$(curl ${CURL_DEFAULT_OPTS} -s 'http://api-v2.tv360.vn/public/v1/composite/get-link?childId=998335&device_type=WEB_IPHONE&id=19474&network_device_id=prIUMaumjI7dNWKSUxFkEViFygs%3D&t=1686572228&type=film' -H "userid: 182551343" -H "devicetype: WEB_IPHONE" -H "deviceName: iPad Air 5th Gen (WiFi)" -H "profileid: 182733455" -H "s: cSkV/vwUfX6tahDwe6xh9Bl0yhNs/TdWTaOJiWDt3gHekijGnNYh9i4YaUmdfBfI4oKOwvioKJ7PuKMH7ctWA6rEHeGXH/nUYOY1g7l4Umh6zoed5bBwWCgUuh5eMqdNNoptwaeCee58USTteOkbHQ==" -H "deviceid: 69FFABD6-F9D8-4C2E-8C44-7195CF0A2930" -H "devicedrmid: prIUMaumjI7dNWKSUxFkEViFygs=" -H "Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxODI1NTEzNDMiLCJ1c2VySWQiOjE4MjU1MTM0MywicHJvZmlsZUlkIjoxODI3MzM0NTUsImR2aSI6MjY5NDY3MTUzLCJjb250ZW50RmlsdGVyIjoiMTAwIiwiZ25hbWUiOiIiLCJpYXQiOjE2ODY1NzIyMDEsImV4cCI6MTY4NzE3NzAwMX0.oi0BKvATgBzPEkqR_liBrvMKXBUiWzp2BQme-biDnwiVhuta0qn_aZo6z3azLdjW5kH6PfEwEkc4K9jCfAK5rw" -H "osappversion: 1.9.27" -H "sessionid: C5017358-5327-4185-999A-CA3291CC66AC" -H "zoneid: 1" -H "Accept: application/json, text/html" -H "Content-Type: application/json" -H "osapptype: IPAD" -H "tv360transid: 1686572228_69FFABD6-F9D8-4C2E-8C44-7195CF0A2930" -H "User-Agent: TV360/31 CFNetwork/1402.0.8 Darwin/22.2.0") - if [ -z "$tmpresult" ]; then - echo -n -e "\r TV360:\t\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" - return - fi - - local result=$(echo "$tmpresult" | grep -woP '"errorCode"\s{0,}:\s{0,}\K\d+') - - case "$result" in - '310') echo -n -e "\r TV360:\t\t\t\t\t${Font_Red}No${Font_Suffix}\n" ;; - '200') echo -n -e "\r TV360:\t\t\t\t\t${Font_Green}Yes${Font_Suffix}\n" ;; - *) echo -n -e "\r TV360:\t\t\t\t\t${Font_Red}Failed (Error: ${result})${Font_Suffix}\n" ;; - esac -} - -function MediaUnlockTest_MeWatch() { - if [ "${USE_IPV6}" == 1 ]; then - echo -n -e "\r MeWatch:\t\t\t\t${Font_Red}IPv6 Is Not Currently Supported${Font_Suffix}\n" - return - fi - - local tmpresult=$(curl ${CURL_DEFAULT_OPTS} -s 'https://cdn.mewatch.sg/api/items/97098/videos?delivery=stream%2Cprogressive&ff=idp%2Cldp%2Crpt%2Ccd&lang=en&resolution=External&segments=all' --user-agent "${UA_BROWSER}") - if [ -z "$tmpresult" ]; then - echo -n -e "\r MeWatch:\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" - return - fi - - local isBlocked=$(echo "$tmpresult" | grep -woP '"code"\s{0,}:\s{0,}\K\d+') - local isOK=$(echo "$tmpresult" | grep -i 'Stream') - - if [ -z "$isBlocked" ] && [ -z "$isOK" ]; then - echo -n -e "\r MeWatch:\t\t\t\t${Font_Red}Failed (Error: PAGE ERROR)${Font_Suffix}\n" - return - fi - - if [ -n "$isBlocked" ]; then - echo -n -e "\r MeWatch:\t\t\t\t${Font_Red}No${Font_Suffix}\n" - return - fi - if [ -n "$isOK" ]; then - echo -n -e "\r MeWatch:\t\t\t\t${Font_Green}Yes${Font_Suffix}\n" - return - fi - - echo -n -e "\r MeWatch:\t\t\t\t${Font_Red}Failed (Error: Unknown)${Font_Suffix}\n" -} - -function MediaUnlockTest_trueID() { - if [ "${USE_IPV6}" == 1 ]; then - echo -n -e "\r trueID:\t\t\t\t${Font_Red}IPv6 Is Not Currently Supported${Font_Suffix}\n" - return - fi - - local tmpresult=$(curl ${CURL_DEFAULT_OPTS} -sL "https://tv.trueid.net/th-en/live/thairathtv-hd" -H "sec-ch-ua: ${UA_SEC_CH_UA}" -H 'sec-ch-ua-mobile: ?0' -H 'sec-ch-ua-platform: "Windows"' -H 'sec-fetch-dest: document' -H 'sec-fetch-mode: navigate' -H 'sec-fetch-site: same-origin' -H 'sec-fetch-user: ?1' -H 'upgrade-insecure-requests: 1' --user-agent "${UA_BROWSER}") - if [ -z "$tmpresult" ]; then - echo -n -e "\r trueID:\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" - return - fi - local channelId=$(echo "$tmpresult" | grep -woP '"channelId"\s{0,}:\s{0,}"\K[^"]+' | head -n 1) - local authUser=$(echo "$tmpresult" | grep -woP '"buildId"\s{0,}:\s{0,}"\K[^"]+' | head -n 1) - local authKey=${authUser:10} - local tmpresult2=$(curl ${CURL_DEFAULT_OPTS} -s "https://tv.trueid.net/api/stream/checkedPlay?channelId=${channelId}&lang=en&country=th" -H "sec-ch-ua: ${UA_SEC_CH_UA}" -H 'sec-ch-ua-mobile: ?0' -H 'sec-ch-ua-platform: "Windows"' -H 'sec-fetch-dest: document' -H 'sec-fetch-mode: navigate' -H 'sec-fetch-site: same-origin' -H 'sec-fetch-user: ?1' -H 'upgrade-insecure-requests: 1' -u ${authUser}:${authKey} -H 'accept: application/json, text/plain, */*' -H 'referer: https://tv.trueid.net/th-en/live/thairathtv-hd' --user-agent "${UA_BROWSER}") - - local result=$(echo "$tmpresult2" | grep -woP '"billboardType"\s{0,}:\s{0,}"\K[^"]+') - case "$result" in - 'GEO_BLOCK') echo -n -e "\r trueID:\t\t\t\t${Font_Red}No${Font_Suffix}\n" ;; - 'LOADING') echo -n -e "\r trueID:\t\t\t\t${Font_Green}Yes${Font_Suffix}\n" ;; - *) echo -n -e "\r trueID:\t\t\t\t${Font_Red}Failed (Error: ${result})${Font_Suffix}\n" ;; - esac -} - -function MediaUnlockTest_SonyLiv() { - local tmpresult=$(curl ${CURL_DEFAULT_OPTS} -sL 'https://www.sonyliv.com/' -H "sec-ch-ua: ${UA_SEC_CH_UA}" -H 'sec-ch-ua-mobile: ?0' -H 'sec-ch-ua-platform: "Windows"' -H 'sec-fetch-dest: document' -H 'sec-fetch-mode: navigate' -H 'sec-fetch-site: none' -H 'sec-fetch-user: ?1' -H 'upgrade-insecure-requests: 1' --user-agent "${UA_BROWSER}") - if [ -z "$tmpresult" ]; then - echo -n -e "\r SonyLiv:\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" - return - fi - local isBlocked=$(echo "$tmpresult" | grep 'geolocation_notsupported') - if [ -n "$isBlocked" ]; then - echo -n -e "\r SonyLiv:\t\t\t\t${Font_Red}No${Font_Suffix}\n" - return - fi - # 取得 JWT Token - local jwtToken=$(echo "$tmpresult" | grep 'securityToken' | sed 's/.*securityToken//' | sed 's/.*resultObj//' | cut -f2 -d'"' | head -n 1) - # 取得国家代码 - local tmpresult2=$(curl ${CURL_DEFAULT_OPTS} -s 'https://apiv2.sonyliv.com/AGL/1.4/A/ENG/WEB/ALL/USER/ULD' -H "sec-ch-ua: ${UA_SEC_CH_UA}" -H 'sec-ch-ua-mobile: ?0' -H 'sec-ch-ua-platform: "Windows"' -H 'accept: application/json, text/plain, */*' -H 'referer: https://www.sonyliv.com/' -H 'device_id: 25a417c3b5f246a393fadb022adc82d5-1715309762699' -H 'app_version: 3.5.59' -H "security_token: ${jwtToken}" --user-agent "${UA_BROWSER}") - if [ -z "$tmpresult2" ]; then - echo -n -e "\r SonyLiv:\t\t\t\t${Font_Red}Failed (Network Connection 1)${Font_Suffix}\n" - return - fi - local region=$(echo "$tmpresult2" | grep -woP '"country_code"\s{0,}:\s{0,}"\K[^"]+') - # 取得播放详情 - local tmpresult3=$(curl ${CURL_DEFAULT_OPTS} -s "https://apiv2.sonyliv.com/AGL/3.8/A/ENG/WEB/${region}/ALL/CONTENT/VIDEOURL/VOD/1000045427/prefetch" -H "sec-ch-ua: ${UA_SEC_CH_UA}" -H 'sec-ch-ua-mobile: ?0' -H 'sec-ch-ua-platform: "Windows"' -H 'sec-fetch-dest: document' -H 'sec-fetch-mode: navigate' -H 'sec-fetch-site: same-origin' -H 'sec-fetch-user: ?1' -H 'upgrade-insecure-requests: 1' -H 'accept: application/json, text/plain, */*' -H 'origin: https://www.sonyliv.com' -H 'referer: https://www.sonyliv.com/' -H 'device_id: 25a417c3b5f246a393fadb022adc82d5-1715309762699' -H "security_token: ${jwtToken}" --user-agent "${UA_BROWSER}") - if [ -z "$tmpresult3" ]; then - echo -n -e "\r SonyLiv:\t\t\t\t${Font_Red}Failed (Network Connection 2)${Font_Suffix}\n" - return - fi - - local result=$(echo "$tmpresult3" | grep -woP '"resultCode"\s{0,}:\s{0,}"\K[^"]+') - local reason=$(echo "$tmpresult3" | grep -woP '"message"\s{0,}:\s{0,}"\K[^"]+') - case "$result" in - "KO") echo -n -e "\r SonyLiv:\t\t\t\t${Font_Red}No (${reason})${Font_Suffix}\n" ;; - "OK") echo -n -e "\r SonyLiv:\t\t\t\t${Font_Green}Yes (Region: ${region})${Font_Suffix}\n" ;; - *) echo -n -e "\r SonyLiv:\t\t\t\t${Font_Red}Failed (Error: ${result})${Font_Suffix}\n" ;; - esac -} - -function MediaUnlockTest_JioCinema() { - local tmpresult=$(curl ${CURL_DEFAULT_OPTS} -s 'https://apis-jiocinema.voot.com/location' -H 'Accept: application/json, text/plain, */*' -H 'Accept-Language: en-US,en;q=0.9' -H 'Origin: https://www.jiocinema.com' -H 'Referer: https://www.jiocinema.com/' -H 'Sec-Fetch-Dest: empty' -H 'Sec-Fetch-Mode: cors' -H 'Sec-Fetch-Site: cross-site' -H "sec-ch-ua: ${UA_SEC_CH_UA}" -H 'sec-ch-ua-mobile: ?0' -H 'sec-ch-ua-platform: "Windows"' --user-agent "${UA_BROWSER}") - if [ -z "$tmpresult" ]; then - echo -n -e "\r Jio Cinema:\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" - return - fi - - local tmpresult2=$(curl ${CURL_DEFAULT_OPTS} -s 'https://content-jiovoot.voot.com/psapi/voot/v1/voot-web//view/show/3500210?subNavId=38fa57ba_1706064514668&excludeTray=player-tray,subnav&responseType=common&devicePlatformType=desktop&page=1&layoutCohort=default&supportedChips=comingsoon' -X 'OPTIONS' -H 'Accept: */*' -H 'Accept-Language: en-US,en;q=0.9' -H 'Access-Control-Request-Headers: app-version' -H 'Access-Control-Request-Method: GET' -H 'Origin: https://www.jiocinema.com' -H 'Referer: https://www.jiocinema.com/' -H 'Sec-Fetch-Dest: empty' -H 'Sec-Fetch-Mode: cors' -H 'Sec-Fetch-Site: cross-site' --user-agent "${UA_BROWSER}") - if [ -z "$tmpresult2" ]; then - echo -n -e "\r Jio Cinema:\t\t\t\t${Font_Red}Failed (Network Connection 1)${Font_Suffix}\n" - return - fi - - local isBlocked1=$(echo "$tmpresult" | grep -i 'Access Denied') - local isOK1=$(echo "$tmpresult" | grep -i 'Success') - local isBlocked2=$(echo "$tmpresult2" | grep -i 'is unavailable at your') - local isOK2=$(echo "$tmpresult2" | grep -i 'Ok') - - if [ -n "$isBlocked1" ] || [ -n "$isBlocked2" ]; then - echo -n -e "\r Jio Cinema:\t\t\t\t${Font_Red}No${Font_Suffix}\n" - return - fi - if [ -n "$isOK1" ] && [ -n "$isOK2" ]; then - echo -n -e "\r Jio Cinema:\t\t\t\t${Font_Green}Yes${Font_Suffix}\n" - return - fi - - echo -n -e "\r Jio Cinema:\t\t\t\t${Font_Red}Failed (Error: Unknown)${Font_Suffix}\n" -} - -function MediaUnlockTest_MXPlayer() { - if [ "${USE_IPV6}" == 1 ]; then - echo -n -e "\r MX Player:\t\t\t\t${Font_Red}IPv6 Is Not Currently Supported${Font_Suffix}\n" - return - fi - - local tmpresult=$(curl ${CURL_DEFAULT_OPTS} -sLi 'https://www.mxplayer.in/' -w "_TAG_%{http_code}_TAG_" --user-agent "${UA_BROWSER}") - local httpCode=$(echo "$tmpresult" | grep '_TAG_' | awk -F'_TAG_' '{print $2}') - if [ "$httpCode" == '000' ]; then - echo -n -e "\r MX Player:\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" - return - fi - - local isOK=$(echo "$tmpresult" | grep 'set-cookie') - local isBlocked=$(echo "$tmpresult" | grep -iE '403 ERROR|not available in your') - - if [ -n "$isBlocked" ]; then - echo -n -e "\r MX Player:\t\t\t\t${Font_Red}No${Font_Suffix}\n" - return - fi - if [ -n "$isOK" ]; then - echo -n -e "\r MX Player:\t\t\t\t${Font_Green}Yes${Font_Suffix}\n" - return - fi - - echo -n -e "\r MX Player:\t\t\t\t${Font_Red}Failed (Error: Unknown)${Font_Suffix}\n" -} - -function MediaUnlockTest_Zee5() { - local tmpresult=$(curl ${CURL_DEFAULT_OPTS} -sLi 'https://www.zee5.com/' -w "_TAG_%{http_code}_TAG_" -H 'Upgrade-Insecure-Requests: 1' --user-agent "${UA_BROWSER}") - local httpCode=$(echo "$tmpresult" | grep '_TAG_' | awk -F'_TAG_' '{print $2}') - if [ "$httpCode" == '000' ]; then - echo -n -e "\r Zee5:\t\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" - return - fi - - local region=$(echo "$tmpresult" | grep -woP 'country=\K[A-Z]{2}' | head -n 1) - if [ -n "$region" ]; then - echo -n -e "\r Zee5:\t\t\t\t\t${Font_Green}Yes (Region: ${region})${Font_Suffix}\n" - return - fi - - echo -n -e "\r Zee5:\t\t\t\t\t${Font_Red}Failed (Error: Unknown)${Font_Suffix}\n" -} - -function WebTest_EroGameSpace() { - if [ "${USE_IPV6}" == 1 ]; then - echo -n -e "\r EroGameSpace:\t\t\t\t${Font_Red}IPv6 Is Not Currently Supported${Font_Suffix}\n" - return - fi - - local tmpresult=$(curl ${CURL_DEFAULT_OPTS} -sL "https://erogamescape.org" --user-agent "${UA_BROWSER}") - if [ -z "$tmpresult" ]; then - echo -n -e "\r EroGameSpace:\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" - return - fi - - local result=$(echo "$tmpresult" | grep -i '18歳') - if [ -n "$result" ]; then - echo -n -e "\r EroGameSpace:\t\t\t\t${Font_Green}Yes${Font_Suffix}\n" - return - fi - - echo -n -e "\r EroGameSpace:\t\t\t\t${Font_Red}No${Font_Suffix}\n" -} - -function MediaUnlockTest_DAnimeStore() { - if [ "${USE_IPV6}" == 1 ]; then - echo -n -e "\r D Anime Store:\t\t\t\t${Font_Red}IPv6 Is Not Currently Supported${Font_Suffix}\n" - return - fi - - local tmpresult=$(OPENSSL_CONF=<(cat < CmdResult { Ok(app_home_dir) } +/// 获取当前自启动状态 +#[tauri::command] +pub fn get_auto_launch_status() -> CmdResult { + use crate::core::sysopt::Sysopt; + wrap_err!(Sysopt::global().get_launch_status()) +} + /// 下载图标缓存 #[tauri::command] pub async fn download_icon_cache(url: String, name: String) -> CmdResult { diff --git a/clash-verge-rev/src-tauri/src/cmd/media_unlock_checker.rs b/clash-verge-rev/src-tauri/src/cmd/media_unlock_checker.rs index 2e99dfe699..c51bb9d480 100644 --- a/clash-verge-rev/src-tauri/src/cmd/media_unlock_checker.rs +++ b/clash-verge-rev/src-tauri/src/cmd/media_unlock_checker.rs @@ -4,6 +4,7 @@ use reqwest::header::{HeaderMap, HeaderValue}; use reqwest::Client; use serde::{Deserialize, Serialize}; use std::collections::HashMap; +use std::error::Error; use std::sync::Arc; use tauri::command; use tokio::sync::Mutex; @@ -286,7 +287,7 @@ async fn check_gemini(client: &Client) -> UnlockItem { } } -// 测试YouTube Premium +// 测试 YouTube Premium async fn check_youtube_premium(client: &Client) -> UnlockItem { let url = "https://www.youtube.com/premium"; @@ -453,39 +454,43 @@ async fn check_bahamut_anime(client: &Client) -> UnlockItem { // 测试 Netflix async fn check_netflix(client: &Client) -> UnlockItem { + // 首先尝试使用Fast.com API检测Netflix CDN区域 + let cdn_result = check_netflix_cdn(client).await; + if cdn_result.status == "Yes" { + return cdn_result; + } + + // 如果CDN方法失败,尝试传统的内容检测方法 // 测试两个 Netflix 内容 (LEGO Ninjago 和 Breaking Bad) let url1 = "https://www.netflix.com/title/81280792"; // LEGO Ninjago let url2 = "https://www.netflix.com/title/70143836"; // Breaking Bad - let headers = { - let mut headers = HeaderMap::new(); - headers.insert( - "accept-language", - HeaderValue::from_static("en-US,en;q=0.9"), - ); - headers.insert("sec-ch-ua-mobile", HeaderValue::from_static("?0")); - headers.insert( - "sec-ch-ua-platform", - HeaderValue::from_static("\"Windows\""), - ); - headers.insert("sec-fetch-site", HeaderValue::from_static("none")); - headers.insert("sec-fetch-mode", HeaderValue::from_static("navigate")); - headers.insert("sec-fetch-user", HeaderValue::from_static("?1")); - headers.insert("sec-fetch-dest", HeaderValue::from_static("document")); - headers - }; - - // 执行第一个请求 - let result1 = client.get(url1).headers(headers.clone()).send().await; - - // 执行第二个请求 - let result2 = client.get(url2).headers(headers.clone()).send().await; + // 创建简单的请求(不添加太多头部信息) + let result1 = client.get(url1) + .timeout(std::time::Duration::from_secs(30)) + .send().await; // 检查连接失败情况 - if result1.is_err() || result2.is_err() { + if let Err(e) = &result1 { + eprintln!("Netflix请求错误: {}", e); return UnlockItem { name: "Netflix".to_string(), - status: "Failed (Network Connection)".to_string(), + status: "Failed".to_string(), + region: None, + check_time: Some(get_local_date_string()), + }; + } + + // 如果第一个请求成功,尝试第二个请求 + let result2 = client.get(url2) + .timeout(std::time::Duration::from_secs(30)) + .send().await; + + if let Err(e) = &result2 { + eprintln!("Netflix请求错误: {}", e); + return UnlockItem { + name: "Netflix".to_string(), + status: "Failed".to_string(), region: None, check_time: Some(get_local_date_string()), }; @@ -514,21 +519,23 @@ async fn check_netflix(client: &Client) -> UnlockItem { }; } - if status1 == 200 || status2 == 200 { + if status1 == 200 || status1 == 301 || status2 == 200 || status2 == 301 { // 成功解锁,尝试获取地区信息 - match client - .get("https://www.netflix.com/") - .headers(headers) + // 使用Netflix测试内容获取区域 + let test_url = "https://www.netflix.com/title/80018499"; + match client.get(test_url) + .timeout(std::time::Duration::from_secs(30)) .send() .await { Ok(response) => { - if let Ok(body) = response.text().await { - // 使用正则表达式提取区域代码 - let re = Regex::new(r#""id":"([A-Z]{2})"#).unwrap(); - if let Some(caps) = re.captures(&body) { - if let Some(region_match) = caps.get(1) { - let region_code = region_match.as_str(); + // 检查重定向位置 + if let Some(location) = response.headers().get("location") { + if let Ok(location_str) = location.to_str() { + // 解析位置获取区域 + let parts: Vec<&str> = location_str.split('/').collect(); + if parts.len() >= 4 { + let region_code = parts[3].split('-').next().unwrap_or("unknown"); let emoji = country_code_to_emoji(region_code); return UnlockItem { name: "Netflix".to_string(), @@ -539,32 +546,108 @@ async fn check_netflix(client: &Client) -> UnlockItem { } } } - // 如果无法获取区域信息,仍然返回成功 + // 如果没有重定向,假设是美国 + let emoji = country_code_to_emoji("us"); UnlockItem { name: "Netflix".to_string(), status: "Yes".to_string(), - region: None, + region: Some(format!("{}{}", emoji, "us")), check_time: Some(get_local_date_string()), } } - Err(_) => UnlockItem { - name: "Netflix".to_string(), - status: "Yes".to_string(), - region: None, - check_time: Some(get_local_date_string()), + Err(e) => { + eprintln!("获取Netflix区域信息失败: {}", e); + UnlockItem { + name: "Netflix".to_string(), + status: "Yes (但无法获取区域)".to_string(), + region: None, + check_time: Some(get_local_date_string()), + } }, } } else { // 其他未知错误状态 UnlockItem { name: "Netflix".to_string(), - status: format!("Failed (Error: {}_{}", status1, status2), + status: format!("Failed (状态码: {}_{}", status1, status2), region: None, check_time: Some(get_local_date_string()), } } } +// 使用Fast.com API检测Netflix CDN区域 +async fn check_netflix_cdn(client: &Client) -> UnlockItem { + // Fast.com API URL + let url = "https://api.fast.com/netflix/speedtest/v2?https=true&token=YXNkZmFzZGxmbnNkYWZoYXNkZmhrYWxm&urlCount=5"; + + let result = client.get(url) + .timeout(std::time::Duration::from_secs(30)) + .send().await; + + match result { + Ok(response) => { + // 检查状态码 + if response.status().as_u16() == 403 { + return UnlockItem { + name: "Netflix".to_string(), + status: "No (IP Banned By Netflix)".to_string(), + region: None, + check_time: Some(get_local_date_string()), + }; + } + + // 尝试解析响应 + match response.json::().await { + Ok(data) => { + // 尝试从数据中提取区域信息 + if let Some(targets) = data.get("targets").and_then(|t| t.as_array()) { + if !targets.is_empty() { + if let Some(location) = targets[0].get("location") { + if let Some(country) = location.get("country").and_then(|c| c.as_str()) { + let emoji = country_code_to_emoji(country); + return UnlockItem { + name: "Netflix".to_string(), + status: "Yes".to_string(), + region: Some(format!("{}{}", emoji, country)), + check_time: Some(get_local_date_string()), + }; + } + } + } + } + + // 如果无法解析区域信息 + return UnlockItem { + name: "Netflix".to_string(), + status: "Unknown".to_string(), + region: None, + check_time: Some(get_local_date_string()), + }; + } + Err(e) => { + eprintln!("解析Fast.com API响应失败: {}", e); + UnlockItem { + name: "Netflix".to_string(), + status: "Failed (解析错误)".to_string(), + region: None, + check_time: Some(get_local_date_string()), + } + } + } + } + Err(e) => { + eprintln!("Fast.com API请求失败: {}", e); + UnlockItem { + name: "Netflix".to_string(), + status: "Failed (CDN API)".to_string(), + region: None, + check_time: Some(get_local_date_string()), + } + } + } +} + // 测试 Disney+ async fn check_disney_plus(client: &Client) -> UnlockItem { // Disney+ 不支持 IPv6,但这里不做额外检查,因为我们使用的是系统默认网络 @@ -1072,9 +1155,14 @@ pub async fn get_unlock_items() -> Result, String> { // 开始检测流媒体解锁状态 #[command] pub async fn check_media_unlock() -> Result, String> { - // 创建一个http客户端 + // 创建一个http客户端,增加更多配置 let client = match Client::builder() .user_agent("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36") + .timeout(std::time::Duration::from_secs(30)) // 全局超时设置 + .danger_accept_invalid_certs(true) // 接受无效证书,防止SSL错误 + .danger_accept_invalid_hostnames(true) // 接受无效主机名 + .tcp_keepalive(std::time::Duration::from_secs(60)) // TCP keepalive + .connection_verbose(true) // 详细连接信息 .build() { Ok(client) => client, Err(e) => return Err(format!("创建HTTP客户端失败: {}", e)), diff --git a/clash-verge-rev/src-tauri/src/core/sysopt.rs b/clash-verge-rev/src-tauri/src/core/sysopt.rs index 492fc53f8f..c6aca45264 100644 --- a/clash-verge-rev/src-tauri/src/core/sysopt.rs +++ b/clash-verge-rev/src-tauri/src/core/sysopt.rs @@ -220,15 +220,50 @@ impl Sysopt { let enable = enable.unwrap_or(false); let app_handle = Handle::global().app_handle().unwrap(); let autostart_manager = app_handle.autolaunch(); - println!("enable: {}", enable); + + log::info!(target: "app", "Setting auto launch to: {}", enable); + match enable { - true => log_err!(autostart_manager.enable()), - false => log_err!(autostart_manager.disable()), + true => { + let result = autostart_manager.enable(); + if let Err(ref e) = result { + log::error!(target: "app", "Failed to enable auto launch: {}", e); + } else { + log::info!(target: "app", "Auto launch enabled successfully"); + } + log_err!(result) + }, + false => { + let result = autostart_manager.disable(); + if let Err(ref e) = result { + log::error!(target: "app", "Failed to disable auto launch: {}", e); + } else { + log::info!(target: "app", "Auto launch disabled successfully"); + } + log_err!(result) + }, }; Ok(()) } + /// 获取当前自启动的实际状态 + pub fn get_launch_status(&self) -> Result { + let app_handle = Handle::global().app_handle().unwrap(); + let autostart_manager = app_handle.autolaunch(); + + match autostart_manager.is_enabled() { + Ok(status) => { + log::info!(target: "app", "Auto launch status: {}", status); + Ok(status) + }, + Err(e) => { + log::error!(target: "app", "Failed to get auto launch status: {}", e); + Err(anyhow::anyhow!("Failed to get auto launch status: {}", e)) + } + } + } + fn guard_proxy(&self) { let _lock = self.guard_state.lock(); diff --git a/clash-verge-rev/src-tauri/src/lib.rs b/clash-verge-rev/src-tauri/src/lib.rs index 43420a21d7..2f35a97c87 100644 --- a/clash-verge-rev/src-tauri/src/lib.rs +++ b/clash-verge-rev/src-tauri/src/lib.rs @@ -154,6 +154,7 @@ pub fn run() { cmd::get_running_mode, cmd::install_service, cmd::get_app_uptime, + cmd::get_auto_launch_status, // clash cmd::get_clash_info, cmd::patch_clash_config, diff --git a/clash-verge-rev/src/components/home/clash-info-card.tsx b/clash-verge-rev/src/components/home/clash-info-card.tsx index 02c94e6da6..f8ef7acb22 100644 --- a/clash-verge-rev/src/components/home/clash-info-card.tsx +++ b/clash-verge-rev/src/components/home/clash-info-card.tsx @@ -7,47 +7,94 @@ import { EnhancedCard } from "./enhanced-card"; import useSWR from "swr"; import { getRules } from "@/services/api"; import { getAppUptime } from "@/services/cmds"; -import { useState } from "react"; +import { useMemo } from "react"; + +// 将毫秒转换为时:分:秒格式的函数 +const formatUptime = (uptimeMs: number) => { + const hours = Math.floor(uptimeMs / 3600000); + const minutes = Math.floor((uptimeMs % 3600000) / 60000); + const seconds = Math.floor((uptimeMs % 60000) / 1000); + return `${hours}:${minutes.toString().padStart(2, "0")}:${seconds.toString().padStart(2, "0")}`; +}; export const ClashInfoCard = () => { const { t } = useTranslation(); const { clashInfo } = useClashInfo(); const { version: clashVersion } = useClash(); - // 计算运行时间 - const [uptime, setUptime] = useState("0:00:00"); - - // 使用SWR定期获取应用运行时间 - useSWR( + // 使用SWR获取应用运行时间,降低更新频率 + const { data: uptimeMs = 0 } = useSWR( "appUptime", - async () => { - const uptimeMs = await getAppUptime(); - // 将毫秒转换为时:分:秒格式 - const hours = Math.floor(uptimeMs / 3600000); - const minutes = Math.floor((uptimeMs % 3600000) / 60000); - const seconds = Math.floor((uptimeMs % 60000) / 1000); - setUptime( - `${hours}:${minutes.toString().padStart(2, "0")}:${seconds.toString().padStart(2, "0")}`, - ); - return uptimeMs; - }, + getAppUptime, { - refreshInterval: 1000, // 每秒更新一次 + refreshInterval: 1000, revalidateOnFocus: false, - dedupingInterval: 500, + dedupingInterval: 1000, }, ); - // 获取规则数 - const { data: rulesData } = useSWR("getRules", getRules, { - fallbackData: [], - suspense: false, + // 使用useMemo缓存格式化后的uptime,避免频繁计算 + const uptime = useMemo(() => formatUptime(uptimeMs), [uptimeMs]); + + // 获取规则数据,只在组件加载时获取一次 + const { data: rules = [] } = useSWR("getRules", getRules, { revalidateOnFocus: false, errorRetryCount: 2, }); - // 获取规则数据 - const rules = rulesData || []; + // 使用备忘录组件内容,减少重新渲染 + const cardContent = useMemo(() => { + if (!clashInfo) return null; + + return ( + + + + {t("Core Version")} + + + {clashVersion || "-"} + + + + + + {t("System Proxy Address")} + + + {clashInfo.server || "-"} + + + + + + {t("Mixed Port")} + + + {clashInfo.mixed_port || "-"} + + + + + + {t("Uptime")} + + + {uptime} + + + + + + {t("Rules Count")} + + + {rules.length} + + + + ); + }, [clashInfo, clashVersion, t, uptime, rules.length]); return ( { iconColor="warning" action={null} > - {clashInfo && ( - - - - {t("Core Version")} - - - {clashVersion || "-"} - - - - - - {t("System Proxy Address")} - - - {clashInfo.server || "-"} - - - - - - {t("Mixed Port")} - - - {clashInfo.mixed_port || "-"} - - - - - - {t("Uptime")} - - - {uptime} - - - - - - {t("Rules Count")} - - - {rules.length} - - - - )} + {cardContent} ); }; diff --git a/clash-verge-rev/src/components/home/clash-mode-card.tsx b/clash-verge-rev/src/components/home/clash-mode-card.tsx index 7274de75ff..ea50039ebd 100644 --- a/clash-verge-rev/src/components/home/clash-mode-card.tsx +++ b/clash-verge-rev/src/components/home/clash-mode-card.tsx @@ -10,7 +10,7 @@ import { MultipleStopRounded, DirectionsRounded, } from "@mui/icons-material"; -import { useState, useEffect } from "react"; +import { useState, useEffect, useMemo } from "react"; export const ClashModeCard = () => { const { t } = useTranslation(); @@ -20,15 +20,13 @@ export const ClashModeCard = () => { const { data: clashConfig, mutate: mutateClash } = useSWR( "getClashConfig", getClashConfig, - { - revalidateOnFocus: false, - }, + { revalidateOnFocus: false } ); - // 支持的模式列表 - 添加直连模式 - const modeList = ["rule", "global", "direct"]; + // 支持的模式列表 + const modeList = useMemo(() => ["rule", "global", "direct"] as const, []); - // 本地状态记录当前模式,提供更快的UI响应 + // 本地状态记录当前模式 const [localMode, setLocalMode] = useState("rule"); // 当从API获取到当前模式时更新本地状态 @@ -38,25 +36,27 @@ export const ClashModeCard = () => { } }, [clashConfig]); + // 模式图标映射 + const modeIcons = useMemo(() => ({ + rule: , + global: , + direct: + }), []); + // 切换模式的处理函数 const onChangeMode = useLockFn(async (mode: string) => { - // 如果已经是当前模式,不做任何操作 if (mode === localMode) return; - - // 立即更新本地UI状态 + setLocalMode(mode); - - // 断开连接(如果启用了设置) + if (verge?.auto_close_connection) { closeAllConnections(); } try { await patchClashMode(mode); - // 成功后刷新数据 mutateClash(); } catch (error) { - // 如果操作失败,恢复之前的状态 console.error("Failed to change mode:", error); if (clashConfig?.mode) { setLocalMode(clashConfig.mode.toLowerCase()); @@ -64,32 +64,55 @@ export const ClashModeCard = () => { } }); - // 获取模式对应的图标 - const getModeIcon = (mode: string) => { - switch (mode) { - case "rule": - return ; - case "global": - return ; - case "direct": - return ; - default: - return null; - } - }; + // 按钮样式 + const buttonStyles = (mode: string) => ({ + cursor: "pointer", + px: 2, + py: 1.2, + display: "flex", + alignItems: "center", + justifyContent: "center", + gap: 1, + bgcolor: mode === localMode ? "primary.main" : "background.paper", + color: mode === localMode ? "primary.contrastText" : "text.primary", + borderRadius: 1.5, + transition: "all 0.2s ease-in-out", + position: "relative", + overflow: "visible", + "&:hover": { + transform: "translateY(-1px)", + boxShadow: 1, + }, + "&:active": { + transform: "translateY(1px)", + }, + "&::after": mode === localMode + ? { + content: '""', + position: "absolute", + bottom: -16, + left: "50%", + width: 2, + height: 16, + bgcolor: "primary.main", + transform: "translateX(-50%)", + } + : {}, + }); - // 获取模式说明文字 - const getModeDescription = (mode: string) => { - switch (mode) { - case "rule": - return t("Rule Mode Description"); - case "global": - return t("Global Mode Description"); - case "direct": - return t("Direct Mode Description"); - default: - return ""; - } + // 描述样式 + const descriptionStyles = { + width: "95%", + textAlign: "center", + color: "text.secondary", + p: 0.8, + borderRadius: 1, + borderColor: "primary.main", + borderWidth: 1, + borderStyle: "solid", + backgroundColor: "background.paper", + wordBreak: "break-word", + hyphens: "auto", }; return ( @@ -111,44 +134,9 @@ export const ClashModeCard = () => { key={mode} elevation={mode === localMode ? 2 : 0} onClick={() => onChangeMode(mode)} - sx={{ - cursor: "pointer", - px: 2, - py: 1.2, - display: "flex", - alignItems: "center", - justifyContent: "center", - gap: 1, - bgcolor: mode === localMode ? "primary.main" : "background.paper", - color: - mode === localMode ? "primary.contrastText" : "text.primary", - borderRadius: 1.5, - transition: "all 0.2s ease-in-out", - position: "relative", - overflow: "visible", - "&:hover": { - transform: "translateY(-1px)", - boxShadow: 1, - }, - "&:active": { - transform: "translateY(1px)", - }, - "&::after": - mode === localMode - ? { - content: '""', - position: "absolute", - bottom: -16, - left: "50%", - width: 2, - height: 16, - bgcolor: "primary.main", - transform: "translateX(-50%)", - } - : {}, - }} + sx={buttonStyles(mode)} > - {getModeIcon(mode)} + {modeIcons[mode]} { overflow: "visible", }} > - {localMode === "rule" && ( - - - {getModeDescription("rule")} - - - )} - - {localMode === "global" && ( - - - {getModeDescription("global")} - - - )} - - {localMode === "direct" && ( - - - {getModeDescription("direct")} - - - )} + + + {t(`${localMode} Mode Description`)} + + ); diff --git a/clash-verge-rev/src/components/home/current-proxy-card.tsx b/clash-verge-rev/src/components/home/current-proxy-card.tsx index 7f7b4930cb..c65282523a 100644 --- a/clash-verge-rev/src/components/home/current-proxy-card.tsx +++ b/clash-verge-rev/src/components/home/current-proxy-card.tsx @@ -13,7 +13,7 @@ import { SelectChangeEvent, Tooltip, } from "@mui/material"; -import { useEffect, useState } from "react"; +import { useEffect, useState, useMemo, useCallback, useRef } from "react"; import { SignalWifi4Bar as SignalStrong, SignalWifi3Bar as SignalGood, @@ -45,17 +45,7 @@ interface ProxyOption { } // 将delayManager返回的颜色格式转换为MUI Chip组件需要的格式 -function convertDelayColor( - delayValue: number, -): - | "default" - | "success" - | "warning" - | "error" - | "primary" - | "secondary" - | "info" - | undefined { +function convertDelayColor(delayValue: number) { const colorStr = delayManager.formatDelayColor(delayValue); if (!colorStr) return "default"; @@ -63,445 +53,365 @@ function convertDelayColor( const mainColor = colorStr.split(".")[0]; switch (mainColor) { - case "success": - return "success"; - case "warning": - return "warning"; - case "error": - return "error"; - case "primary": - return "primary"; - default: - return "default"; + case "success": return "success"; + case "warning": return "warning"; + case "error": return "error"; + case "primary": return "primary"; + default: return "default"; } } // 根据延迟值获取合适的WiFi信号图标 -function getSignalIcon(delay: number): { - icon: JSX.Element; - text: string; - color: string; -} { +function getSignalIcon(delay: number) { if (delay < 0) - return { - icon: , - text: "未测试", - color: "text.secondary", - }; + return { icon: , text: "未测试", color: "text.secondary" }; if (delay >= 10000) - return { - icon: , - text: "超时", - color: "error.main", - }; + return { icon: , text: "超时", color: "error.main" }; if (delay >= 500) - return { - icon: , - text: "延迟较高", - color: "error.main", - }; + return { icon: , text: "延迟较高", color: "error.main" }; if (delay >= 300) - return { - icon: , - text: "延迟中等", - color: "warning.main", - }; + return { icon: , text: "延迟中等", color: "warning.main" }; if (delay >= 200) - return { - icon: , - text: "延迟良好", - color: "info.main", - }; - return { - icon: , - text: "延迟极佳", - color: "success.main", + return { icon: , text: "延迟良好", color: "info.main" }; + return { icon: , text: "延迟极佳", color: "success.main" }; +} + +// 简单的防抖函数 +function debounce(fn: Function, ms = 100) { + let timeoutId: ReturnType; + return function(this: any, ...args: any[]) { + clearTimeout(timeoutId); + timeoutId = setTimeout(() => fn.apply(this, args), ms); }; } export const CurrentProxyCard = () => { const { t } = useTranslation(); - const { currentProxy, primaryGroupName, mode, refreshProxy } = - useCurrentProxy(); + const { currentProxy, primaryGroupName, mode, refreshProxy } = useCurrentProxy(); const navigate = useNavigate(); const theme = useTheme(); const { verge } = useVerge(); // 判断模式 const isGlobalMode = mode === "global"; - const isDirectMode = mode === "direct"; // 添加直连模式判断 + const isDirectMode = mode === "direct"; - // 从本地存储获取初始值,如果是特殊模式或没有存储值则使用默认值 - const getSavedGroup = () => { - // 全局模式使用 GLOBAL 组 - if (isGlobalMode) { - return "GLOBAL"; - } - // 直连模式使用 DIRECT - if (isDirectMode) { - return "DIRECT"; - } - const savedGroup = localStorage.getItem(STORAGE_KEY_GROUP); - return savedGroup || primaryGroupName || "GLOBAL"; + // 使用 useRef 存储最后一次刷新时间和是否正在刷新 + const lastRefreshRef = useRef(0); + const isRefreshingRef = useRef(false); + const pendingRefreshRef = useRef(false); + + // 定义状态类型 + type ProxyState = { + proxyData: { + groups: { name: string; now: string; all: string[] }[]; + records: Record; + globalProxy: string; + directProxy: any; + }; + selection: { + group: string; + proxy: string; + }; + displayProxy: any; }; - // 状态管理 - const [groups, setGroups] = useState< - { name: string; now: string; all: string[] }[] - >([]); - const [selectedGroup, setSelectedGroup] = useState(getSavedGroup()); - const [proxyOptions, setProxyOptions] = useState([]); - const [selectedProxy, setSelectedProxy] = useState(""); - const [displayProxy, setDisplayProxy] = useState(null); - const [records, setRecords] = useState>({}); - const [globalProxy, setGlobalProxy] = useState(""); // 存储全局代理 - const [directProxy, setDirectProxy] = useState(null); // 存储直连代理信息 + // 合并状态,减少状态更新次数 + const [state, setState] = useState({ + proxyData: { + groups: [], + records: {}, + globalProxy: "", + directProxy: null, + }, + selection: { + group: "", + proxy: "", + }, + displayProxy: null, + }); - // 保存选择的代理组到本地存储 - useEffect(() => { - // 只有在普通模式下才保存到本地存储 - if (selectedGroup && !isGlobalMode && !isDirectMode) { - localStorage.setItem(STORAGE_KEY_GROUP, selectedGroup); - } - }, [selectedGroup, isGlobalMode, isDirectMode]); - - // 保存选择的代理节点到本地存储 - useEffect(() => { - // 只有在普通模式下才保存到本地存储 - if (selectedProxy && !isGlobalMode && !isDirectMode) { - localStorage.setItem(STORAGE_KEY_PROXY, selectedProxy); - } - }, [selectedProxy, isGlobalMode, isDirectMode]); - - // 当模式变化时更新选择的组 + // 初始化选择的组 useEffect(() => { + // 根据模式确定初始组 if (isGlobalMode) { - setSelectedGroup("GLOBAL"); + setState(prev => ({ + ...prev, + selection: { + ...prev.selection, + group: "GLOBAL" + } + })); } else if (isDirectMode) { - setSelectedGroup("DIRECT"); - } else if (primaryGroupName) { + setState(prev => ({ + ...prev, + selection: { + ...prev.selection, + group: "DIRECT" + } + })); + } else { const savedGroup = localStorage.getItem(STORAGE_KEY_GROUP); - setSelectedGroup(savedGroup || primaryGroupName); + setState(prev => ({ + ...prev, + selection: { + ...prev.selection, + group: savedGroup || primaryGroupName || "" + } + })); } }, [isGlobalMode, isDirectMode, primaryGroupName]); - // 获取所有代理组和代理信息 - useEffect(() => { - const fetchProxies = async () => { - try { - const data = await getProxies(); - // 保存所有节点记录信息,用于显示详细节点信息 - setRecords(data.records); - - // 检查并存储全局代理信息 - if (data.global) { - setGlobalProxy(data.global.now || ""); - } - - // 查找并存储直连代理信息 - if (data.records && data.records["DIRECT"]) { - setDirectProxy(data.records["DIRECT"]); - } - - const filteredGroups = data.groups - .filter((g) => g.name !== "DIRECT" && g.name !== "REJECT") - .map((g) => ({ - name: g.name, - now: g.now || "", - all: g.all.map((p) => p.name), - })); - - setGroups(filteredGroups); - - // 直连模式处理 - if (isDirectMode) { - // 直连模式下使用 DIRECT 节点 - setSelectedGroup("DIRECT"); - setSelectedProxy("DIRECT"); - - if (data.records && data.records["DIRECT"]) { - setDisplayProxy(data.records["DIRECT"]); - } - - // 设置仅包含 DIRECT 节点的选项 - setProxyOptions([{ name: "DIRECT" }]); - return; - } - - // 全局模式处理 - if (isGlobalMode) { - // 在全局模式下,使用 GLOBAL 组和 data.global.now 作为选中节点 - if (data.global) { - const globalNow = data.global.now || ""; - setSelectedGroup("GLOBAL"); - setSelectedProxy(globalNow); - - if (globalNow && data.records[globalNow]) { - setDisplayProxy(data.records[globalNow]); - } - - // 设置全局组的代理选项 - const options = data.global.all.map((proxy) => ({ - name: proxy.name, - })); - - setProxyOptions(options); - } - return; - } - - // 以下是普通模式的处理逻辑 - let targetGroup = primaryGroupName; - - // 非特殊模式下,尝试从本地存储获取上次选择的代理组 - const savedGroup = localStorage.getItem(STORAGE_KEY_GROUP); - targetGroup = savedGroup || primaryGroupName; - - // 如果目标组在列表中,则选择它 - if (targetGroup && filteredGroups.some((g) => g.name === targetGroup)) { - setSelectedGroup(targetGroup); - - // 设置该组下的代理选项 - const currentGroup = filteredGroups.find( - (g) => g.name === targetGroup, - ); - if (currentGroup) { - // 创建代理选项 - const options = currentGroup.all.map((proxyName) => { - return { name: proxyName }; - }); - - setProxyOptions(options); - - let targetProxy = currentGroup.now; - - const savedProxy = localStorage.getItem(STORAGE_KEY_PROXY); - // 如果有保存的代理节点且该节点在当前组中,则选择它 - if (savedProxy && currentGroup.all.includes(savedProxy)) { - targetProxy = savedProxy; - } - - setSelectedProxy(targetProxy); - - if (targetProxy && data.records[targetProxy]) { - setDisplayProxy(data.records[targetProxy]); - } - } - } else if (filteredGroups.length > 0) { - // 否则选择第一个组 - setSelectedGroup(filteredGroups[0].name); - - // 创建代理选项 - const options = filteredGroups[0].all.map((proxyName) => { - return { name: proxyName }; - }); - - setProxyOptions(options); - setSelectedProxy(filteredGroups[0].now); - - // 更新显示的代理节点信息 - if (filteredGroups[0].now && data.records[filteredGroups[0].now]) { - setDisplayProxy(data.records[filteredGroups[0].now]); - } - } - } catch (error) { - console.error("获取代理信息失败", error); - } - }; - - fetchProxies(); - }, [primaryGroupName, isGlobalMode, isDirectMode]); - - // 当选择的组发生变化时更新代理选项 - useEffect(() => { - // 如果是特殊模式,已在 fetchProxies 中处理 - if (isGlobalMode || isDirectMode) return; - - const group = groups.find((g) => g.name === selectedGroup); - if (group && records) { - // 创建代理选项 - const options = group.all.map((proxyName) => { - return { name: proxyName }; - }); - - setProxyOptions(options); - - let targetProxy = group.now; - - const savedProxy = localStorage.getItem(STORAGE_KEY_PROXY); - // 如果保存的代理节点在当前组中,则选择它 - if (savedProxy && group.all.includes(savedProxy)) { - targetProxy = savedProxy; - } - - setSelectedProxy(targetProxy); - - if (targetProxy && records[targetProxy]) { - setDisplayProxy(records[targetProxy]); - } + // 带锁的代理数据获取函数,防止并发请求 + const fetchProxyData = useCallback(async (force = false) => { + // 防止重复请求 + if (isRefreshingRef.current) { + pendingRefreshRef.current = true; + return; } - }, [selectedGroup, groups, records, isGlobalMode, isDirectMode]); - // 刷新代理信息 - const refreshProxyData = async () => { + // 检查刷新间隔 + const now = Date.now(); + if (!force && now - lastRefreshRef.current < 1000) { + return; + } + + isRefreshingRef.current = true; + lastRefreshRef.current = now; + try { const data = await getProxies(); - // 更新所有代理记录 - setRecords(data.records); - - // 更新代理组信息 + + // 过滤和格式化组 const filteredGroups = data.groups - .filter((g) => g.name !== "DIRECT" && g.name !== "REJECT") - .map((g) => ({ + .filter(g => g.name !== "DIRECT" && g.name !== "REJECT") + .map(g => ({ name: g.name, now: g.now || "", - all: g.all.map((p) => p.name), + all: g.all.map(p => p.name), })); - setGroups(filteredGroups); + // 使用函数式更新确保状态更新的原子性 + setState(prev => { + let newProxy = ""; + let newDisplayProxy = null; + let newGroup = prev.selection.group; - // 检查并更新全局代理信息 - if (isGlobalMode && data.global) { - const globalNow = data.global.now || ""; - setSelectedProxy(globalNow); - - if (globalNow && data.records[globalNow]) { - setDisplayProxy(data.records[globalNow]); - } - - // 更新全局组的代理选项 - const options = data.global.all.map((proxy) => ({ - name: proxy.name, - })); - - setProxyOptions(options); - } - // 更新直连代理信息 - else if (isDirectMode && data.records["DIRECT"]) { - setDirectProxy(data.records["DIRECT"]); - setDisplayProxy(data.records["DIRECT"]); - } - // 更新普通模式下当前选中组的信息 - else { - const currentGroup = filteredGroups.find( - (g) => g.name === selectedGroup, - ); - if (currentGroup) { - // 如果当前选中的代理节点与组中的now不一致,则需要更新 - if (currentGroup.now !== selectedProxy) { - setSelectedProxy(currentGroup.now); - - if (data.records[currentGroup.now]) { - setDisplayProxy(data.records[currentGroup.now]); + // 根据模式确定新代理 + if (isDirectMode) { + newGroup = "DIRECT"; + newProxy = "DIRECT"; + newDisplayProxy = data.records?.DIRECT || null; + } else if (isGlobalMode && data.global) { + newGroup = "GLOBAL"; + newProxy = data.global.now || ""; + newDisplayProxy = data.records?.[newProxy] || null; + } else { + // 普通模式 - 检查当前选择的组是否存在 + const currentGroup = filteredGroups.find(g => g.name === prev.selection.group); + + // 如果当前组不存在或为空,自动选择第一个组 + if (!currentGroup && filteredGroups.length > 0) { + newGroup = filteredGroups[0].name; + const firstGroup = filteredGroups[0]; + newProxy = firstGroup.now; + newDisplayProxy = data.records?.[newProxy] || null; + + // 保存到本地存储 + if (!isGlobalMode && !isDirectMode) { + localStorage.setItem(STORAGE_KEY_GROUP, newGroup); + if (newProxy) { + localStorage.setItem(STORAGE_KEY_PROXY, newProxy); + } } + } else if (currentGroup) { + // 使用当前组的代理 + newProxy = currentGroup.now; + newDisplayProxy = data.records?.[newProxy] || null; } - - // 更新代理选项 - const options = currentGroup.all.map((proxyName) => ({ - name: proxyName, - })); - - setProxyOptions(options); } - } + + // 返回新状态 + return { + proxyData: { + groups: filteredGroups, + records: data.records || {}, + globalProxy: data.global?.now || "", + directProxy: data.records?.DIRECT || null, + }, + selection: { + group: newGroup, + proxy: newProxy + }, + displayProxy: newDisplayProxy + }; + }); } catch (error) { - console.error("刷新代理信息失败", error); + console.error("获取代理信息失败", error); + } finally { + isRefreshingRef.current = false; + + // 处理待处理的刷新请求 + if (pendingRefreshRef.current) { + pendingRefreshRef.current = false; + setTimeout(() => fetchProxyData(), 100); + } } - }; + }, [isGlobalMode, isDirectMode]); - // 每隔一段时间刷新代理信息 - 修改为在所有模式下都刷新 + // 响应 currentProxy 变化 useEffect(() => { - // 初始刷新一次 - refreshProxyData(); + if (currentProxy && (!state.displayProxy || currentProxy.name !== state.displayProxy.name)) { + fetchProxyData(true); + } + }, [currentProxy, fetchProxyData, state.displayProxy]); - // 定期刷新所有模式下的代理信息 - const refreshInterval = setInterval(refreshProxyData, 2000); - return () => clearInterval(refreshInterval); - }, [isGlobalMode, isDirectMode, selectedGroup]); // 依赖项添加selectedGroup以便在切换组时重新设置定时器 + // 平滑的定期刷新,使用固定间隔 + useEffect(() => { + fetchProxyData(); + + const intervalId = setInterval(() => { + fetchProxyData(); + }, 3000); // 使用固定的3秒间隔,平衡响应速度和性能 + + return () => clearInterval(intervalId); + }, [fetchProxyData]); + + // 计算要显示的代理选项 - 使用 useMemo 优化 + const proxyOptions = useMemo(() => { + if (isDirectMode) { + return [{ name: "DIRECT" }]; + } + if (isGlobalMode && state.proxyData.records) { + // 全局模式下的选项 + return Object.keys(state.proxyData.records) + .filter(name => name !== "DIRECT" && name !== "REJECT") + .map(name => ({ name })); + } + + // 普通模式 + const group = state.proxyData.groups.find(g => g.name === state.selection.group); + if (group) { + return group.all.map(name => ({ name })); + } + return []; + }, [isDirectMode, isGlobalMode, state.proxyData, state.selection.group]); + + // 使用防抖包装状态更新,避免快速连续更新 + const debouncedSetState = useCallback( + debounce((updateFn: (prev: ProxyState) => ProxyState) => { + setState(updateFn); + }, 50), + [] + ); // 处理代理组变更 - const handleGroupChange = (event: SelectChangeEvent) => { - // 特殊模式下不允许切换组 + const handleGroupChange = useCallback((event: SelectChangeEvent) => { if (isGlobalMode || isDirectMode) return; - + const newGroup = event.target.value; - setSelectedGroup(newGroup); - }; + + // 保存到本地存储 + localStorage.setItem(STORAGE_KEY_GROUP, newGroup); + + // 获取该组当前选中的代理 + setState(prev => { + const group = prev.proxyData.groups.find(g => g.name === newGroup); + if (group) { + return { + ...prev, + selection: { + group: newGroup, + proxy: group.now + }, + displayProxy: prev.proxyData.records[group.now] || null + }; + } + return { + ...prev, + selection: { + ...prev.selection, + group: newGroup + } + }; + }); + }, [isGlobalMode, isDirectMode]); // 处理代理节点变更 - const handleProxyChange = async (event: SelectChangeEvent) => { - // 直连模式下不允许切换节点 + const handleProxyChange = useCallback(async (event: SelectChangeEvent) => { if (isDirectMode) return; - + const newProxy = event.target.value; - const previousProxy = selectedProxy; // 保存变更前的代理节点名称 - - setSelectedProxy(newProxy); - - // 更新显示的代理节点信息 - if (records[newProxy]) { - setDisplayProxy(records[newProxy]); + const currentGroup = state.selection.group; + const previousProxy = state.selection.proxy; + + // 立即更新UI,优化体验 + debouncedSetState((prev: ProxyState) => ({ + ...prev, + selection: { + ...prev.selection, + proxy: newProxy + }, + displayProxy: prev.proxyData.records[newProxy] || null + })); + + // 非特殊模式下保存到本地存储 + if (!isGlobalMode && !isDirectMode) { + localStorage.setItem(STORAGE_KEY_PROXY, newProxy); } - + try { // 更新代理设置 - await updateProxy(selectedGroup, newProxy); - - // 添加断开连接逻辑 - 与proxy-groups.tsx中的逻辑相同 + await updateProxy(currentGroup, newProxy); + + // 自动关闭连接设置 if (verge?.auto_close_connection && previousProxy) { getConnections().then(({ connections }) => { - connections.forEach((conn) => { + connections.forEach(conn => { if (conn.chains.includes(previousProxy)) { deleteConnection(conn.id); } }); }); } - + + // 刷新代理信息,使用较短的延迟 setTimeout(() => { refreshProxy(); - if (isGlobalMode || isDirectMode) { - refreshProxyData(); // 特殊模式下额外刷新数据 - } - }, 300); + fetchProxyData(true); + }, 200); } catch (error) { console.error("更新代理失败", error); } - }; + }, [isDirectMode, isGlobalMode, state.proxyData.records, state.selection, verge?.auto_close_connection, refreshProxy, fetchProxyData, debouncedSetState]); // 导航到代理页面 - const goToProxies = () => { - // 修正路由路径,根据_routers.tsx配置,代理页面的路径是"/" + const goToProxies = useCallback(() => { navigate("/"); - }; + }, [navigate]); // 获取要显示的代理节点 - const proxyToDisplay = displayProxy || currentProxy; - + const proxyToDisplay = state.displayProxy || currentProxy; + // 获取当前节点的延迟 const currentDelay = proxyToDisplay - ? delayManager.getDelayFix(proxyToDisplay, selectedGroup) + ? delayManager.getDelayFix(proxyToDisplay, state.selection.group) : -1; - + // 获取信号图标 const signalInfo = getSignalIcon(currentDelay); // 自定义渲染选择框中的值 - const renderProxyValue = (selected: string) => { - if (!selected || !records[selected]) return selected; + const renderProxyValue = useCallback((selected: string) => { + if (!selected || !state.proxyData.records[selected]) return selected; const delayValue = delayManager.getDelayFix( - records[selected], - selectedGroup, + state.proxyData.records[selected], + state.selection.group ); return ( - + {selected} { /> ); - }; + }, [state.proxyData.records, state.selection.group]); return ( { {proxyToDisplay.name} - - + + {proxyToDisplay.type} {isGlobalMode && ( - + )} {isDirectMode && ( - + )} {/* 节点特性 */} - {proxyToDisplay.udp && ( - - )} - {proxyToDisplay.tfo && ( - - )} - {proxyToDisplay.xudp && ( - - )} - {proxyToDisplay.mptcp && ( - - )} - {proxyToDisplay.smux && ( - - )} + {proxyToDisplay.udp && } + {proxyToDisplay.tfo && } + {proxyToDisplay.xudp && } + {proxyToDisplay.mptcp && } + {proxyToDisplay.smux && } @@ -610,31 +494,22 @@ export const CurrentProxyCard = () => { {proxyToDisplay && !isDirectMode && ( )} {/* 代理组选择器 */} - + {t("Group")} { > {proxyOptions.map((proxy) => { const delayValue = delayManager.getDelayFix( - records[proxy.name], - selectedGroup, + state.proxyData.records[proxy.name], + state.selection.group ); return ( ( const theme = useTheme(); const { t } = useTranslation(); - // 时间范围状态(默认10分钟) - const [timeRange, setTimeRange] = useState(10); + // 从全局变量恢复状态 + const [timeRange, setTimeRange] = useState( + window.trafficHistoryTimeRange || 10 + ); + const [chartStyle, setChartStyle] = useState<"line" | "area">( + window.trafficHistoryStyle || "area" + ); // 使用useRef存储数据,避免不必要的重渲染 const dataBufferRef = useRef([]); @@ -84,9 +104,6 @@ export const EnhancedTrafficGraph = memo(forwardRef( [getMaxPointsByTimeRange], ); - // 图表样式:line 或 area - const [chartStyle, setChartStyle] = useState<"line" | "area">("area"); - // 颜色配置 const colors = useMemo( () => ({ @@ -103,43 +120,90 @@ export const EnhancedTrafficGraph = memo(forwardRef( const handleTimeRangeClick = useCallback(() => { setTimeRange((prevRange) => { // 在1、5、10分钟之间循环切换 - if (prevRange === 1) return 5; - if (prevRange === 5) return 10; - return 1; + const newRange = prevRange === 1 ? 5 : prevRange === 5 ? 10 : 1; + window.trafficHistoryTimeRange = newRange; // 保存到全局 + return newRange; }); }, []); - // 初始化空数据缓冲区 + // 初始化数据缓冲区 useEffect(() => { - // 生成10分钟的初始数据点 - const now = Date.now(); - const tenMinutesAgo = now - 10 * 60 * 1000; + let initialBuffer: DataPoint[] = []; + + // 如果全局有保存的数据,优先使用 + if (window.trafficHistoryData && window.trafficHistoryData.length > 0) { + initialBuffer = [...window.trafficHistoryData]; + + // 确保数据长度符合要求 + if (initialBuffer.length > MAX_BUFFER_SIZE) { + initialBuffer = initialBuffer.slice(-MAX_BUFFER_SIZE); + } else if (initialBuffer.length < MAX_BUFFER_SIZE) { + // 如果历史数据不足,则在前面补充空数据 + const now = Date.now(); + const oldestTimestamp = initialBuffer.length > 0 + ? initialBuffer[0].timestamp + : now - 10 * 60 * 1000; + + const additionalPoints = MAX_BUFFER_SIZE - initialBuffer.length; + const timeInterval = initialBuffer.length > 0 + ? (initialBuffer[0].timestamp - (now - 10 * 60 * 1000)) / additionalPoints + : (10 * 60 * 1000) / MAX_BUFFER_SIZE; + + const emptyPrefix: DataPoint[] = Array.from( + { length: additionalPoints }, + (_, index) => { + const pointTime = oldestTimestamp - (additionalPoints - index) * timeInterval; + const date = new Date(pointTime); + + return { + up: 0, + down: 0, + timestamp: pointTime, + name: date.toLocaleTimeString("en-US", { + hour12: false, + hour: "2-digit", + minute: "2-digit", + second: "2-digit", + }), + }; + } + ); + + initialBuffer = [...emptyPrefix, ...initialBuffer]; + } + } else { + // 没有历史数据时,创建空的初始缓冲区 + const now = Date.now(); + const tenMinutesAgo = now - 10 * 60 * 1000; - // 创建初始缓冲区,降低点的密度 - const initialBuffer: DataPoint[] = Array.from( - { length: MAX_BUFFER_SIZE }, - (_, index) => { - // 计算每个点的时间 - const pointTime = - tenMinutesAgo + index * ((10 * 60 * 1000) / MAX_BUFFER_SIZE); - const date = new Date(pointTime); + initialBuffer = Array.from( + { length: MAX_BUFFER_SIZE }, + (_, index) => { + const pointTime = + tenMinutesAgo + index * ((10 * 60 * 1000) / MAX_BUFFER_SIZE); + const date = new Date(pointTime); - return { - up: 0, - down: 0, - timestamp: pointTime, - name: date.toLocaleTimeString("en-US", { - hour12: false, - hour: "2-digit", - minute: "2-digit", - second: "2-digit", - }), - }; - }, - ); + return { + up: 0, + down: 0, + timestamp: pointTime, + name: date.toLocaleTimeString("en-US", { + hour12: false, + hour: "2-digit", + minute: "2-digit", + second: "2-digit", + }), + }; + } + ); + } dataBufferRef.current = initialBuffer; - setDisplayData(initialBuffer); + window.trafficHistoryData = initialBuffer; // 保存到全局 + + // 更新显示数据 + const pointsToShow = getMaxPointsByTimeRange(timeRange); + setDisplayData(initialBuffer.slice(-pointsToShow)); // 清理函数,取消任何未完成的动画帧 return () => { @@ -148,7 +212,7 @@ export const EnhancedTrafficGraph = memo(forwardRef( rafIdRef.current = null; } }; - }, [MAX_BUFFER_SIZE]); + }, [MAX_BUFFER_SIZE, getMaxPointsByTimeRange, timeRange]); // 处理数据更新并控制帧率的函数 const updateDisplayData = useCallback(() => { @@ -217,8 +281,12 @@ export const EnhancedTrafficGraph = memo(forwardRef( timestamp: timestamp, }; - // 直接更新ref,不触发重渲染 - dataBufferRef.current = [...dataBufferRef.current.slice(1), newPoint]; + // 更新ref,但保持原数组大小 + const newBuffer = [...dataBufferRef.current.slice(1), newPoint]; + dataBufferRef.current = newBuffer; + + // 保存到全局变量 + window.trafficHistoryData = newBuffer; // 使用节流更新显示数据 throttledUpdateData(); @@ -226,7 +294,11 @@ export const EnhancedTrafficGraph = memo(forwardRef( // 切换图表样式 const toggleStyle = useCallback(() => { - setChartStyle((prev) => (prev === "line" ? "area" : "line")); + setChartStyle((prev) => { + const newStyle = prev === "line" ? "area" : "line"; + window.trafficHistoryStyle = newStyle; // 保存到全局 + return newStyle; + }); }, []); // 暴露方法给父组件 @@ -264,161 +336,23 @@ export const EnhancedTrafficGraph = memo(forwardRef( return t("{{time}} Minutes", { time: timeRange }); }, [timeRange, t]); - // 渲染图表内的标签 - const renderInnerLabels = useCallback(() => ( - <> - {/* 上传标签 - 右上角 */} - - {t("Upload")} - - - {/* 下载标签 - 右上角下方 */} - - {t("Download")} - - - ), [colors.up, colors.down, t]); - // 共享图表配置 - const commonProps = useMemo(() => ({ + const chartConfig = useMemo(() => ({ data: displayData, margin: { top: 10, right: 20, left: 0, bottom: 0 }, }), [displayData]); - // 曲线类型 - 使用平滑曲线 - const curveType = "basis"; + // 共享的线条/区域配置 + const commonLineProps = useMemo(() => ({ + dot: false, + strokeWidth: 2, + connectNulls: false, + activeDot: { r: 4, strokeWidth: 1 }, + isAnimationActive: false, // 禁用动画以减少CPU使用 + }), []); - // 共享图表子组件 - const commonChildren = useMemo(() => ( - <> - - - - `${t("Time")}: ${label}`} - contentStyle={{ - backgroundColor: colors.tooltip, - borderColor: colors.grid, - borderRadius: 4, - }} - itemStyle={{ color: colors.text }} - isAnimationActive={false} - /> - - {/* 可点击的时间范围标签 */} - - - {getTimeRangeText()} - - - - ), [colors, formatXLabel, formatYAxis, formatTooltip, timeRange, theme.palette.text.secondary, handleTimeRangeClick, getTimeRangeText, t]); - - // 渲染图表 - 线图或面积图 - const renderChart = useCallback(() => { - // 共享的线条/区域配置 - const commonLineProps = { - dot: false, - strokeWidth: 2, - connectNulls: false, - activeDot: { r: 4, strokeWidth: 1 }, - isAnimationActive: false, // 禁用动画以减少CPU使用 - }; - - return chartStyle === "line" ? ( - - {commonChildren} - - - {renderInnerLabels()} - - ) : ( - - {commonChildren} - - - {renderInnerLabels()} - - ); - }, [chartStyle, commonProps, commonChildren, renderInnerLabels, colors, t]); + // 曲线类型 - 使用线性曲线避免错位 + const curveType = "monotone"; return ( ( onClick={toggleStyle} > - {renderChart()} + {chartStyle === "line" ? ( + + + + + `${t("Time")}: ${label}`} + contentStyle={{ + backgroundColor: colors.tooltip, + borderColor: colors.grid, + borderRadius: 4, + }} + itemStyle={{ color: colors.text }} + isAnimationActive={false} + /> + + + + {/* 可点击的时间范围标签 */} + + {getTimeRangeText()} + + + {/* 上传标签 - 右上角 */} + + {t("Upload")} + + + {/* 下载标签 - 右上角下方 */} + + {t("Download")} + + + ) : ( + + + + + `${t("Time")}: ${label}`} + contentStyle={{ + backgroundColor: colors.tooltip, + borderColor: colors.grid, + borderRadius: 4, + }} + itemStyle={{ color: colors.text }} + isAnimationActive={false} + /> + + + + {/* 可点击的时间范围标签 */} + + {getTimeRangeText()} + + + {/* 上传标签 - 右上角 */} + + {t("Upload")} + + + {/* 下载标签 - 右上角下方 */} + + {t("Download")} + + + )} ); diff --git a/clash-verge-rev/src/components/home/enhanced-traffic-stats.tsx b/clash-verge-rev/src/components/home/enhanced-traffic-stats.tsx index ed96188451..56ebebdb0b 100644 --- a/clash-verge-rev/src/components/home/enhanced-traffic-stats.tsx +++ b/clash-verge-rev/src/components/home/enhanced-traffic-stats.tsx @@ -1,4 +1,4 @@ -import { useState, useEffect, useRef, useCallback, memo } from "react"; +import { useState, useEffect, useRef, useCallback, memo, useMemo } from "react"; import { useTranslation } from "react-i18next"; import { Typography, @@ -62,6 +62,7 @@ declare global { // 控制更新频率 const CONNECTIONS_UPDATE_INTERVAL = 5000; // 5秒更新一次连接数据 +const THROTTLE_TRAFFIC_UPDATE = 500; // 500ms节流流量数据更新 // 统计卡片组件 - 使用memo优化 const CompactStatCard = memo(({ @@ -74,18 +75,18 @@ const CompactStatCard = memo(({ }: StatCardProps) => { const theme = useTheme(); - // 获取调色板颜色 - const getColorFromPalette = (colorName: string) => { + // 获取调色板颜色 - 使用useMemo避免重复计算 + const colorValue = useMemo(() => { const palette = theme.palette; if ( - colorName in palette && - palette[colorName as keyof typeof palette] && - "main" in (palette[colorName as keyof typeof palette] as PaletteColor) + color in palette && + palette[color as keyof typeof palette] && + "main" in (palette[color as keyof typeof palette] as PaletteColor) ) { - return (palette[colorName as keyof typeof palette] as PaletteColor).main; + return (palette[color as keyof typeof palette] as PaletteColor).main; } return palette.primary.main; - }; + }, [theme.palette, color]); return ( {icon} @@ -156,24 +157,24 @@ export const EnhancedTrafficStats = () => { const pageVisible = useVisibility(); const [isDebug, setIsDebug] = useState(false); - // 为流量数据和内存数据准备状态 - const [trafficData, setTrafficData] = useState({ - up: 0, - down: 0, - }); - const [memoryData, setMemoryData] = useState({ inuse: 0 }); - const [trafficStats, setTrafficStats] = useState({ - uploadTotal: 0, - downloadTotal: 0, - activeConnections: 0, + // 使用单一状态对象减少状态更新次数 + const [stats, setStats] = useState({ + traffic: { up: 0, down: 0 }, + memory: { inuse: 0, oslimit: undefined as number | undefined }, + connections: { uploadTotal: 0, downloadTotal: 0, activeConnections: 0 }, }); + // 创建一个标记来追踪最后更新时间,用于节流 + const lastUpdateRef = useRef({ traffic: 0 }); + // 是否显示流量图表 const trafficGraph = verge?.traffic_graph ?? true; // WebSocket引用 - const trafficSocketRef = useRef | null>(null); - const memorySocketRef = useRef | null>(null); + const socketRefs = useRef({ + traffic: null as ReturnType | null, + memory: null as ReturnType | null, + }); // 获取连接数据 const fetchConnections = useCallback(async () => { @@ -191,11 +192,14 @@ export const EnhancedTrafficStats = () => { 0, ); - setTrafficStats({ - uploadTotal, - downloadTotal, - activeConnections: connections.connections.length, - }); + setStats(prev => ({ + ...prev, + connections: { + uploadTotal, + downloadTotal, + activeConnections: connections.connections.length, + } + })); } } catch (err) { console.error("Failed to fetch connections:", err); @@ -204,11 +208,11 @@ export const EnhancedTrafficStats = () => { // 定期更新连接数据 useEffect(() => { - if (pageVisible) { - fetchConnections(); - const intervalId = setInterval(fetchConnections, CONNECTIONS_UPDATE_INTERVAL); - return () => clearInterval(intervalId); - } + if (!pageVisible) return; + + fetchConnections(); + const intervalId = setInterval(fetchConnections, CONNECTIONS_UPDATE_INTERVAL); + return () => clearInterval(intervalId); }, [pageVisible, fetchConnections]); // 检查是否支持调试 @@ -216,7 +220,7 @@ export const EnhancedTrafficStats = () => { isDebugEnabled().then((flag) => setIsDebug(flag)); }, []); - // 处理流量数据更新 + // 处理流量数据更新 - 使用节流控制更新频率 const handleTrafficUpdate = useCallback((event: MessageEvent) => { try { const data = JSON.parse(event.data) as ITrafficItem; @@ -225,28 +229,40 @@ export const EnhancedTrafficStats = () => { typeof data.up === "number" && typeof data.down === "number" ) { + // 使用节流控制更新频率 + const now = Date.now(); + if (now - lastUpdateRef.current.traffic < THROTTLE_TRAFFIC_UPDATE) { + // 如果距离上次更新时间小于阈值,只更新图表不更新状态 + if (trafficRef.current) { + trafficRef.current.appendData({ + up: data.up, + down: data.down, + timestamp: now, + }); + } + return; + } + + // 更新最后更新时间 + lastUpdateRef.current.traffic = now; + // 验证数据有效性,防止NaN const safeUp = isNaN(data.up) ? 0 : data.up; const safeDown = isNaN(data.down) ? 0 : data.down; - setTrafficData({ - up: safeUp, - down: safeDown, - }); + // 批量更新状态 + setStats(prev => ({ + ...prev, + traffic: { up: safeUp, down: safeDown } + })); // 更新图表数据 if (trafficRef.current) { trafficRef.current.appendData({ up: safeUp, down: safeDown, - timestamp: Date.now(), + timestamp: now, }); - - // 清除之前可能存在的动画帧 - if (window.animationFrameId) { - cancelAnimationFrame(window.animationFrameId); - window.animationFrameId = undefined; - } } } } catch (err) { @@ -259,74 +275,50 @@ export const EnhancedTrafficStats = () => { try { const data = JSON.parse(event.data) as MemoryUsage; if (data && typeof data.inuse === "number") { - setMemoryData({ - inuse: isNaN(data.inuse) ? 0 : data.inuse, - oslimit: data.oslimit, - }); + setStats(prev => ({ + ...prev, + memory: { + inuse: isNaN(data.inuse) ? 0 : data.inuse, + oslimit: data.oslimit, + } + })); } } catch (err) { console.error("[Memory] 解析数据错误:", err); } }, []); - // 使用 WebSocket 连接获取流量数据 + // 使用 WebSocket 连接获取数据 - 合并流量和内存连接逻辑 useEffect(() => { if (!clashInfo || !pageVisible) return; const { server, secret = "" } = clashInfo; if (!server) return; + // 清理现有连接的函数 + const cleanupSockets = () => { + Object.values(socketRefs.current).forEach(socket => { + if (socket) { + socket.close(); + } + }); + socketRefs.current = { traffic: null, memory: null }; + }; + // 关闭现有连接 - if (trafficSocketRef.current) { - trafficSocketRef.current.close(); - } + cleanupSockets(); // 创建新连接 - trafficSocketRef.current = createAuthSockette(`${server}/traffic`, secret, { + socketRefs.current.traffic = createAuthSockette(`${server}/traffic`, secret, { onmessage: handleTrafficUpdate, }); - - return () => { - if (trafficSocketRef.current) { - trafficSocketRef.current.close(); - trafficSocketRef.current = null; - } - }; - }, [clashInfo, pageVisible, handleTrafficUpdate]); - - // 使用 WebSocket 连接获取内存数据 - useEffect(() => { - if (!clashInfo || !pageVisible) return; - - const { server, secret = "" } = clashInfo; - if (!server) return; - - // 关闭现有连接 - if (memorySocketRef.current) { - memorySocketRef.current.close(); - } - - // 创建新连接 - memorySocketRef.current = createAuthSockette(`${server}/memory`, secret, { + + socketRefs.current.memory = createAuthSockette(`${server}/memory`, secret, { onmessage: handleMemoryUpdate, }); - return () => { - if (memorySocketRef.current) { - memorySocketRef.current.close(); - memorySocketRef.current = null; - } - }; - }, [clashInfo, pageVisible, handleMemoryUpdate]); - - // 解析流量数据 - const [up, upUnit] = parseTraffic(trafficData.up); - const [down, downUnit] = parseTraffic(trafficData.down); - const [inuse, inuseUnit] = parseTraffic(memoryData.inuse); - const [uploadTotal, uploadTotalUnit] = parseTraffic(trafficStats.uploadTotal); - const [downloadTotal, downloadTotalUnit] = parseTraffic( - trafficStats.downloadTotal, - ); + return cleanupSockets; + }, [clashInfo, pageVisible, handleTrafficUpdate, handleMemoryUpdate]); // 执行垃圾回收 const handleGarbageCollection = useCallback(async () => { @@ -340,8 +332,22 @@ export const EnhancedTrafficStats = () => { } }, [isDebug]); - // 渲染流量图表 - const renderTrafficGraph = useCallback(() => { + // 使用useMemo计算解析后的流量数据 + const parsedData = useMemo(() => { + const [up, upUnit] = parseTraffic(stats.traffic.up); + const [down, downUnit] = parseTraffic(stats.traffic.down); + const [inuse, inuseUnit] = parseTraffic(stats.memory.inuse); + const [uploadTotal, uploadTotalUnit] = parseTraffic(stats.connections.uploadTotal); + const [downloadTotal, downloadTotalUnit] = parseTraffic(stats.connections.downloadTotal); + + return { + up, upUnit, down, downUnit, inuse, inuseUnit, + uploadTotal, uploadTotalUnit, downloadTotal, downloadTotalUnit + }; + }, [stats]); + + // 渲染流量图表 - 使用useMemo缓存渲染结果 + const trafficGraphComponent = useMemo(() => { if (!trafficGraph || !pageVisible) return null; return ( @@ -382,58 +388,58 @@ export const EnhancedTrafficStats = () => { ); }, [trafficGraph, pageVisible, theme.palette.divider, isDebug]); - // 统计卡片配置 - const statCards = [ + // 使用useMemo计算统计卡片配置 + const statCards = useMemo(() => [ { icon: , title: t("Upload Speed"), - value: up, - unit: `${upUnit}/s`, + value: parsedData.up, + unit: `${parsedData.upUnit}/s`, color: "secondary" as const, }, { icon: , title: t("Download Speed"), - value: down, - unit: `${downUnit}/s`, + value: parsedData.down, + unit: `${parsedData.downUnit}/s`, color: "primary" as const, }, { icon: , title: t("Active Connections"), - value: trafficStats.activeConnections, + value: stats.connections.activeConnections, unit: "", color: "success" as const, }, { icon: , title: t("Uploaded"), - value: uploadTotal, - unit: uploadTotalUnit, + value: parsedData.uploadTotal, + unit: parsedData.uploadTotalUnit, color: "secondary" as const, }, { icon: , title: t("Downloaded"), - value: downloadTotal, - unit: downloadTotalUnit, + value: parsedData.downloadTotal, + unit: parsedData.downloadTotalUnit, color: "primary" as const, }, { icon: , title: t("Memory Usage"), - value: inuse, - unit: inuseUnit, + value: parsedData.inuse, + unit: parsedData.inuseUnit, color: "error" as const, onClick: isDebug ? handleGarbageCollection : undefined, }, - ]; + ], [t, parsedData, stats.connections.activeConnections, isDebug, handleGarbageCollection]); return ( {/* 流量图表区域 */} - {renderTrafficGraph()} + {trafficGraphComponent} {/* 统计卡片区域 */} {statCards.map((card, index) => ( diff --git a/clash-verge-rev/src/components/home/home-profile-card.tsx b/clash-verge-rev/src/components/home/home-profile-card.tsx index 0d0468a475..cc5adc5c46 100644 --- a/clash-verge-rev/src/components/home/home-profile-card.tsx +++ b/clash-verge-rev/src/components/home/home-profile-card.tsx @@ -22,7 +22,7 @@ import { } from "@mui/icons-material"; import dayjs from "dayjs"; import parseTraffic from "@/utils/parse-traffic"; -import { useState } from "react"; +import { useMemo, useCallback, useState } from "react"; import { openWebUrl, updateProfile } from "@/services/cmds"; import { useLockFn } from "ahooks"; import { Notice } from "@/components/base"; @@ -35,16 +35,25 @@ const round = keyframes` `; // 辅助函数解析URL和过期时间 -function parseUrl(url?: string) { +const parseUrl = (url?: string, maxLength: number = 25) => { if (!url) return "-"; - if (url.startsWith("http")) return new URL(url).host; - return "local"; -} + let parsedUrl = ""; + if (url.startsWith("http")) { + parsedUrl = new URL(url).host; + } else { + parsedUrl = "local"; + } + + if (parsedUrl.length > maxLength) { + return parsedUrl.substring(0, maxLength - 3) + "..."; + } + return parsedUrl; +}; -function parseExpire(expire?: number) { +const parseExpire = (expire?: number) => { if (!expire) return "-"; return dayjs(expire * 1000).format("YYYY-MM-DD"); -} +}; // 使用类型定义,而不是导入 interface ProfileExtra { @@ -64,20 +73,184 @@ export interface ProfileItem { updated?: number; extra?: ProfileExtra; home?: string; - option?: any; // 添加option以兼容原始类型 + option?: any; } export interface HomeProfileCardProps { current: ProfileItem | null | undefined; + onProfileUpdated?: () => void; } -export const HomeProfileCard = ({ current }: HomeProfileCardProps) => { +// 提取独立组件减少主组件复杂度 +const ProfileDetails = ({ current, onUpdateProfile, updating }: { + current: ProfileItem; + onUpdateProfile: () => void; + updating: boolean; +}) => { const { t } = useTranslation(); - const navigate = useNavigate(); const theme = useTheme(); + const usedTraffic = useMemo(() => { + if (!current.extra) return 0; + return current.extra.upload + current.extra.download; + }, [current.extra]); + + const trafficPercentage = useMemo(() => { + if (!current.extra || !current.extra.total) return 1; + return Math.min( + Math.round((usedTraffic * 100) / (current.extra.total + 0.01)) + 1, + 100 + ); + }, [current.extra, usedTraffic]); + + return ( + + + {current.url && ( + + + + {t("From")}:{" "} + {current.home ? ( + current.home && openWebUrl(current.home)} + sx={{ + display: "inline-flex", + alignItems: "center" + }} + > + {parseUrl(current.url)} + + + ) : ( + + {parseUrl(current.url)} + + )} + + + )} + + {current.updated && ( + + + + {t("Update Time")}:{" "} + + {dayjs(current.updated * 1000).format("YYYY-MM-DD HH:mm")} + + + + )} + + {current.extra && ( + <> + + + + {t("Used / Total")}:{" "} + + {parseTraffic(usedTraffic)} / {parseTraffic(current.extra.total)} + + + + + {current.extra.expire > 0 && ( + + + + {t("Expire Time")}:{" "} + + {parseExpire(current.extra.expire)} + + + + )} + + + + {trafficPercentage}% + + + + + )} + + + ); +}; + +// 提取空配置组件 +const EmptyProfile = ({ onClick }: { onClick: () => void }) => { + const { t } = useTranslation(); + + return ( + + + + {t("Import")} {t("Profiles")} + + + {t("Click to import subscription")} + + + ); +}; + +export const HomeProfileCard = ({ current, onProfileUpdated }: HomeProfileCardProps) => { + const { t } = useTranslation(); + const navigate = useNavigate(); + // 更新当前订阅 const [updating, setUpdating] = useState(false); + const onUpdateProfile = useLockFn(async () => { if (!current?.uid) return; @@ -85,6 +258,7 @@ export const HomeProfileCard = ({ current }: HomeProfileCardProps) => { try { await updateProfile(current.uid); Notice.success(t("Update subscription successfully")); + onProfileUpdated?.(); } catch (err: any) { Notice.error(err?.message || err.toString()); } finally { @@ -93,204 +267,71 @@ export const HomeProfileCard = ({ current }: HomeProfileCardProps) => { }); // 导航到订阅页面 - const goToProfiles = () => { + const goToProfiles = useCallback(() => { navigate("/profile"); - }; + }, [navigate]); + + // 卡片标题 + const cardTitle = useMemo(() => { + if (!current) return t("Profiles"); + + if (!current.home) return current.name; + + return ( + current.home && openWebUrl(current.home)} + sx={{ + display: "inline-flex", + alignItems: "center", + color: "inherit", + textDecoration: "none", + }} + > + {current.name} + + + ); + }, [current, t]); + + // 卡片操作按钮 + const cardAction = useMemo(() => { + if (!current) return null; + + return ( + + ); + }, [current, goToProfiles, t]); return ( current.home && openWebUrl(current.home)} - sx={{ - display: "inline-flex", - alignItems: "center", - color: "inherit", - textDecoration: "none", - }} - > - {current.name} - - - ) : ( - current.name - ) - ) : ( - t("Profiles") - ) - } + title={cardTitle} icon={} iconColor="info" - action={ - current && ( - - ) - } + action={cardAction} > {current ? ( - // 已导入订阅,显示详情 - - - {current.url && ( - - - - {t("From")}:{" "} - {current.home ? ( - current.home && openWebUrl(current.home)} - sx={{ display: "inline-flex", alignItems: "center" }} - > - {parseUrl(current.url)} - - - ) : ( - - {parseUrl(current.url)} - - )} - - - )} - - {current.updated && ( - - - - {t("Update Time")}:{" "} - - {dayjs(current.updated * 1000).format("YYYY-MM-DD HH:mm")} - - - - )} - - {current.extra && ( - <> - - - - {t("Used / Total")}:{" "} - - {parseTraffic( - current.extra.upload + current.extra.download, - )}{" "} - / {parseTraffic(current.extra.total)} - - - - - {current.extra.expire > 0 && ( - - - - {t("Expire Time")}:{" "} - - {parseExpire(current.extra.expire)} - - - - )} - - - - {Math.min( - Math.round( - ((current.extra.download + current.extra.upload) * - 100) / - (current.extra.total + 0.01), - ) + 1, - 100, - )} - % - - - - - )} - - + ) : ( - // 未导入订阅,显示导入按钮 - - - - {t("Import")} {t("Profiles")} - - - {t("Click to import subscription")} - - + )} ); diff --git a/clash-verge-rev/src/components/home/ip-info-card.tsx b/clash-verge-rev/src/components/home/ip-info-card.tsx index 926dc58663..dcfd22c1be 100644 --- a/clash-verge-rev/src/components/home/ip-info-card.tsx +++ b/clash-verge-rev/src/components/home/ip-info-card.tsx @@ -15,15 +15,50 @@ import { } from "@mui/icons-material"; import { EnhancedCard } from "./enhanced-card"; import { getIpInfo } from "@/services/api"; -import { useState, useEffect, useCallback } from "react"; +import { useState, useEffect, useCallback, memo } from "react"; // 定义刷新时间(秒) const IP_REFRESH_SECONDS = 300; +// 提取InfoItem子组件并使用memo优化 +const InfoItem = memo(({ label, value }: { label: string; value: string }) => ( + + + {label}: + + + {value || "Unknown"} + + +)); + +// 获取国旗表情 +const getCountryFlag = (countryCode: string) => { + if (!countryCode) return ""; + const codePoints = countryCode + .toUpperCase() + .split("") + .map((char) => 127397 + char.charCodeAt(0)); + return String.fromCodePoint(...codePoints); +}; + // IP信息卡片组件 export const IpInfoCard = () => { const { t } = useTranslation(); - const theme = useTheme(); const [ipInfo, setIpInfo] = useState(null); const [loading, setLoading] = useState(true); const [error, setError] = useState(""); @@ -48,250 +83,241 @@ export const IpInfoCard = () => { // 组件加载时获取IP信息 useEffect(() => { fetchIpInfo(); - }, [fetchIpInfo]); - - // 倒计时自动刷新 - useEffect(() => { - const timer = setInterval(() => { - setCountdown((prev) => { - if (prev <= 1) { + + // 倒计时实现优化,减少不必要的重渲染 + let timer: number | null = null; + let currentCount = IP_REFRESH_SECONDS; + + // 只在必要时更新状态,减少重渲染次数 + const startCountdown = () => { + timer = window.setInterval(() => { + currentCount -= 1; + + if (currentCount <= 0) { fetchIpInfo(); - return IP_REFRESH_SECONDS; + currentCount = IP_REFRESH_SECONDS; } - return prev - 1; - }); - }, 1000); - - return () => clearInterval(timer); + + // 每5秒或倒计时结束时才更新UI + if (currentCount % 5 === 0 || currentCount <= 0) { + setCountdown(currentCount); + } + }, 1000); + }; + + startCountdown(); + return () => { + if (timer) clearInterval(timer); + }; }, [fetchIpInfo]); - // 刷新按钮点击处理 - const handleRefresh = () => { - fetchIpInfo(); - }; + const toggleShowIp = useCallback(() => { + setShowIp(prev => !prev); + }, []); - // 切换显示/隐藏IP - const toggleShowIp = () => { - setShowIp(!showIp); - }; - - // 获取国旗表情 - const getCountryFlag = (countryCode: string) => { - if (!countryCode) return ""; - const codePoints = countryCode - .toUpperCase() - .split("") - .map((char) => 127397 + char.charCodeAt(0)); - return String.fromCodePoint(...codePoints); - }; - - // 信息项组件 - 默认不换行,但在需要时可以换行 - const InfoItem = ({ label, value }: { label: string; value: string }) => ( - - } + iconColor="info" + action={ + + + + } > - {label}: - - - {value || t("Unknown")} - - - ); + + + + + + + + ); + } + // 渲染错误状态 + if (error) { + return ( + } + iconColor="info" + action={ + + + + } + > + + + {error} + + + + + ); + } + + // 渲染正常数据 return ( } iconColor="info" action={ - + } > - {loading ? ( - - - - - - - ) : error ? ( - - - {error} - - - - ) : ( - <> + + {/* 左侧:国家和IP地址 */} + - {/* 左侧:国家和IP地址 */} - - - - {getCountryFlag(ipInfo?.country_code)} - - - {ipInfo?.country || t("Unknown")} - - - - - - {t("IP")}: - - - - {showIp ? ipInfo?.ip : "••••••••••"} - - - {showIp ? ( - - ) : ( - - )} - - - - - - - - {/* 右侧:组织、ISP和位置信息 */} - - - - - - - - - - - - - - {t("Auto refresh")}: {countdown}s - - - {ipInfo?.country_code}, {ipInfo?.longitude?.toFixed(2)},{" "} - {ipInfo?.latitude?.toFixed(2)} + {getCountryFlag(ipInfo?.country_code)} + + + {ipInfo?.country || t("Unknown")} - - )} + + + + {t("IP")}: + + + + {showIp ? ipInfo?.ip : "••••••••••"} + + + {showIp ? ( + + ) : ( + + )} + + + + + + + + {/* 右侧:组织、ISP和位置信息 */} + + + + + + + + + + + {t("Auto refresh")}: {countdown}s + + + {ipInfo?.country_code}, {ipInfo?.longitude?.toFixed(2)},{" "} + {ipInfo?.latitude?.toFixed(2)} + + ); diff --git a/clash-verge-rev/src/components/home/proxy-tun-card.tsx b/clash-verge-rev/src/components/home/proxy-tun-card.tsx index cfe1431909..ae91536933 100644 --- a/clash-verge-rev/src/components/home/proxy-tun-card.tsx +++ b/clash-verge-rev/src/components/home/proxy-tun-card.tsx @@ -7,17 +7,16 @@ import { Tooltip, alpha, useTheme, - Button, Fade, } from "@mui/material"; -import { useState, useEffect } from "react"; +import { useState, useMemo, memo, FC } from "react"; import ProxyControlSwitches from "@/components/shared/ProxyControlSwitches"; import { Notice } from "@/components/base"; import { - LanguageRounded, ComputerRounded, TroubleshootRounded, HelpOutlineRounded, + SvgIconComponent, } from "@mui/icons-material"; import useSWR from "swr"; import { @@ -26,15 +25,131 @@ import { getRunningMode, } from "@/services/cmds"; -export const ProxyTunCard = () => { +const LOCAL_STORAGE_TAB_KEY = "clash-verge-proxy-active-tab"; + +interface TabButtonProps { + isActive: boolean; + onClick: () => void; + icon: SvgIconComponent; + label: string; + hasIndicator?: boolean; +} + +// 抽取Tab组件以减少重复代码 +const TabButton: FC = memo(({ + isActive, + onClick, + icon: Icon, + label, + hasIndicator = false +}) => ( + + + + {label} + + {hasIndicator && ( + + )} + +)); + +interface TabDescriptionProps { + description: string; + tooltipTitle: string; +} + +// 抽取描述文本组件 +const TabDescription: FC = memo(({ description, tooltipTitle }) => ( + + + {description} + + + + + +)); + +export const ProxyTunCard: FC = () => { const { t } = useTranslation(); const theme = useTheme(); - const [error, setError] = useState(null); - const [activeTab, setActiveTab] = useState("system"); + const [activeTab, setActiveTab] = useState(() => + localStorage.getItem(LOCAL_STORAGE_TAB_KEY) || "system" + ); // 获取代理状态信息 const { data: sysproxy } = useSWR("getSystemProxy", getSystemProxy); - const { data: autoproxy } = useSWR("getAutotemProxy", getAutotemProxy); const { data: runningMode } = useSWR("getRunningMode", getRunningMode); // 是否以sidecar模式运行 @@ -42,26 +157,34 @@ export const ProxyTunCard = () => { // 处理错误 const handleError = (err: Error) => { - setError(err.message); Notice.error(err.message || err.toString(), 3000); }; - // 用户提示文本 - const getTabDescription = (tab: string) => { - switch (tab) { - case "system": - return sysproxy?.enable - ? t("System Proxy Enabled") - : t("System Proxy Disabled"); - case "tun": - return isSidecarMode - ? t("TUN Mode Service Required") - : t("TUN Mode Intercept Info"); - default: - return ""; - } + // 处理标签切换并保存到localStorage + const handleTabChange = (tab: string) => { + setActiveTab(tab); + localStorage.setItem(LOCAL_STORAGE_TAB_KEY, tab); }; + // 用户提示文本 - 使用useMemo避免重复计算 + const tabDescription = useMemo(() => { + if (activeTab === "system") { + return { + text: sysproxy?.enable + ? t("System Proxy Enabled") + : t("System Proxy Disabled"), + tooltip: t("System Proxy Info") + }; + } else { + return { + text: isSidecarMode + ? t("TUN Mode Service Required") + : t("TUN Mode Intercept Info"), + tooltip: t("Tun Mode Info") + }; + } + }, [activeTab, sysproxy?.enable, isSidecarMode, t]); + return ( {/* 选项卡 */} @@ -75,112 +198,19 @@ export const ProxyTunCard = () => { zIndex: 2, }} > - setActiveTab("system")} - sx={{ - cursor: "pointer", - px: 2, - py: 1, - display: "flex", - alignItems: "center", - justifyContent: "center", - gap: 1, - bgcolor: - activeTab === "system" ? "primary.main" : "background.paper", - color: - activeTab === "system" ? "primary.contrastText" : "text.primary", - borderRadius: 1.5, - flex: 1, - maxWidth: 160, - transition: "all 0.2s ease-in-out", - position: "relative", - "&:hover": { - transform: "translateY(-1px)", - boxShadow: 1, - }, - "&:after": - activeTab === "system" - ? { - content: '""', - position: "absolute", - bottom: -9, - left: "50%", - width: 2, - height: 9, - bgcolor: "primary.main", - transform: "translateX(-50%)", - } - : {}, - }} - > - - - {t("System Proxy")} - - {sysproxy?.enable && ( - - )} - - setActiveTab("tun")} - sx={{ - cursor: "pointer", - px: 2, - py: 1, - display: "flex", - alignItems: "center", - justifyContent: "center", - gap: 1, - bgcolor: activeTab === "tun" ? "primary.main" : "background.paper", - color: - activeTab === "tun" ? "primary.contrastText" : "text.primary", - borderRadius: 1.5, - flex: 1, - maxWidth: 160, - transition: "all 0.2s ease-in-out", - position: "relative", - "&:hover": { - transform: "translateY(-1px)", - boxShadow: 1, - }, - "&:after": - activeTab === "tun" - ? { - content: '""', - position: "absolute", - bottom: -9, - left: "50%", - width: 2, - height: 9, - bgcolor: "primary.main", - transform: "translateX(-50%)", - } - : {}, - }} - > - - - {t("Tun Mode")} - - + handleTabChange("system")} + icon={ComputerRounded} + label={t("System Proxy")} + hasIndicator={sysproxy?.enable} + /> + handleTabChange("tun")} + icon={TroubleshootRounded} + label={t("Tun Mode")} + /> {/* 说明文本区域 */} @@ -194,71 +224,10 @@ export const ProxyTunCard = () => { overflow: "visible", }} > - {activeTab === "system" && ( - - - {getTabDescription("system")} - - - - - - )} - - {activeTab === "tun" && ( - - - {getTabDescription("tun")} - - - - - - )} + {/* 控制开关部分 */} diff --git a/clash-verge-rev/src/components/home/system-info-card.tsx b/clash-verge-rev/src/components/home/system-info-card.tsx index bc4b7b2901..82d7874ce9 100644 --- a/clash-verge-rev/src/components/home/system-info-card.tsx +++ b/clash-verge-rev/src/components/home/system-info-card.tsx @@ -7,7 +7,7 @@ import useSWR from "swr"; import { getRunningMode, getSystemInfo, installService } from "@/services/cmds"; import { useNavigate } from "react-router-dom"; import { version as appVersion } from "@root/package.json"; -import { useEffect, useState } from "react"; +import { useCallback, useEffect, useMemo, useState } from "react"; import { check as checkUpdate } from "@tauri-apps/plugin-updater"; import { useLockFn } from "ahooks"; import { Notice } from "@/components/base"; @@ -17,99 +17,97 @@ export const SystemInfoCard = () => { const { verge, patchVerge } = useVerge(); const navigate = useNavigate(); + // 系统信息状态 + const [systemState, setSystemState] = useState({ + osInfo: "", + lastCheckUpdate: "-", + }); + // 获取运行模式 const { data: runningMode = "sidecar", mutate: mutateRunningMode } = useSWR( "getRunningMode", getRunningMode, + { suspense: false, revalidateOnFocus: false } ); - // 获取系统信息 - const [osInfo, setOsInfo] = useState(""); + // 初始化系统信息 useEffect(() => { + // 获取系统信息 getSystemInfo() .then((info) => { const lines = info.split("\n"); if (lines.length > 0) { - // 提取系统名称和版本信息 - const sysNameLine = lines[0]; // System Name: xxx - const sysVersionLine = lines[1]; // System Version: xxx - - const sysName = sysNameLine.split(": ")[1] || ""; - const sysVersion = sysVersionLine.split(": ")[1] || ""; - - setOsInfo(`${sysName} ${sysVersion}`); + const sysName = lines[0].split(": ")[1] || ""; + const sysVersion = lines[1].split(": ")[1] || ""; + setSystemState(prev => ({ ...prev, osInfo: `${sysName} ${sysVersion}` })); } }) - .catch((err) => { - console.error("Error getting system info:", err); - }); - }, []); + .catch(console.error); - // 获取最后检查更新时间 - const [lastCheckUpdate, setLastCheckUpdate] = useState("-"); - - // 在组件挂载时检查本地存储中的最后更新时间 - useEffect(() => { // 获取最后检查更新时间 const lastCheck = localStorage.getItem("last_check_update"); if (lastCheck) { try { const timestamp = parseInt(lastCheck, 10); if (!isNaN(timestamp)) { - const date = new Date(timestamp); - setLastCheckUpdate(date.toLocaleString()); + setSystemState(prev => ({ + ...prev, + lastCheckUpdate: new Date(timestamp).toLocaleString() + })); } } catch (e) { console.error("Error parsing last check update time", e); } } else if (verge?.auto_check_update) { - // 如果启用了自动检查更新但没有最后检查时间记录,则触发一次检查 + // 如果启用了自动检查更新但没有记录,设置当前时间并延迟检查 const now = Date.now(); localStorage.setItem("last_check_update", now.toString()); - setLastCheckUpdate(new Date(now).toLocaleString()); - - // 延迟执行检查更新,避免在应用启动时立即执行 + setSystemState(prev => ({ + ...prev, + lastCheckUpdate: new Date(now).toLocaleString() + })); + setTimeout(() => { - checkUpdate().catch((e) => console.error("Error checking update:", e)); + if (verge?.auto_check_update) { + checkUpdate().catch(console.error); + } }, 5000); } }, [verge?.auto_check_update]); - // 监听 checkUpdate 调用并更新时间 + // 自动检查更新逻辑 useSWR( - "checkUpdate", + verge?.auto_check_update ? "checkUpdate" : null, async () => { - // 更新最后检查时间 const now = Date.now(); localStorage.setItem("last_check_update", now.toString()); - setLastCheckUpdate(new Date(now).toLocaleString()); - - // 实际执行检查更新 + setSystemState(prev => ({ + ...prev, + lastCheckUpdate: new Date(now).toLocaleString() + })); return await checkUpdate(); }, { revalidateOnFocus: false, - refreshInterval: 24 * 60 * 60 * 1000, // 每天检查一次更新 - dedupingInterval: 60 * 60 * 1000, // 1小时内不重复检查, - isPaused: () => !(verge?.auto_check_update ?? true), // 根据 auto_check_update 设置决定是否启用 - }, + refreshInterval: 24 * 60 * 60 * 1000, // 每天检查一次 + dedupingInterval: 60 * 60 * 1000, // 1小时内不重复检查 + } ); // 导航到设置页面 - const goToSettings = () => { + const goToSettings = useCallback(() => { navigate("/settings"); - }; + }, [navigate]); // 切换自启动状态 - const toggleAutoLaunch = async () => { + const toggleAutoLaunch = useCallback(async () => { + if (!verge) return; try { - if (!verge) return; - // 将当前的启动状态取反 await patchVerge({ enable_auto_launch: !verge.enable_auto_launch }); } catch (err) { console.error("切换开机自启动状态失败:", err); } - }; + }, [verge, patchVerge]); // 安装系统服务 const onInstallService = useLockFn(async () => { @@ -117,34 +115,48 @@ export const SystemInfoCard = () => { Notice.info(t("Installing Service..."), 1000); await installService(); Notice.success(t("Service Installed Successfully"), 2000); - // 重新获取运行模式 await mutateRunningMode(); } catch (err: any) { Notice.error(err.message || err.toString(), 3000); } }); - // 点击运行模式 - const handleRunningModeClick = () => { + // 点击运行模式处理 + const handleRunningModeClick = useCallback(() => { if (runningMode === "sidecar") { onInstallService(); } - }; + }, [runningMode, onInstallService]); // 检查更新 - const onCheckUpdate = async () => { + const onCheckUpdate = useLockFn(async () => { try { const info = await checkUpdate(); if (!info?.available) { Notice.success(t("Currently on the Latest Version")); } else { Notice.info(t("Update Available"), 2000); - goToSettings(); // 跳转到设置页面查看更新 + goToSettings(); } } catch (err: any) { Notice.error(err.message || err.toString()); } - }; + }); + + // 是否启用自启动 + const autoLaunchEnabled = useMemo(() => verge?.enable_auto_launch || false, [verge]); + + // 运行模式样式 + const runningModeStyle = useMemo(() => ({ + cursor: runningMode === "sidecar" ? "pointer" : "default", + textDecoration: runningMode === "sidecar" ? "underline" : "none", + "&:hover": { + opacity: runningMode === "sidecar" ? 0.7 : 1, + }, + }), [runningMode]); + + // 只有当verge存在时才渲染内容 + if (!verge) return null; return ( { } > - {verge && ( - - - - {t("OS Info")} - - - {osInfo} - - - - - - {t("Auto Launch")} - - - - - - - {t("Running Mode")} - - - {runningMode === "service" - ? t("Service Mode") - : t("Sidecar Mode")} - - - - - - {t("Last Check Update")} - - - {lastCheckUpdate} - - - - - - {t("Verge Version")} - - - v{appVersion} - - + + + + {t("OS Info")} + + + {systemState.osInfo} + - )} + + + + {t("Auto Launch")} + + + + + + + {t("Running Mode")} + + + {runningMode === "service" ? t("Service Mode") : t("Sidecar Mode")} + + + + + + {t("Last Check Update")} + + + {systemState.lastCheckUpdate} + + + + + + {t("Verge Version")} + + + v{appVersion} + + + ); }; diff --git a/clash-verge-rev/src/components/home/test-card.tsx b/clash-verge-rev/src/components/home/test-card.tsx index cab3641bf1..83e8a9d626 100644 --- a/clash-verge-rev/src/components/home/test-card.tsx +++ b/clash-verge-rev/src/components/home/test-card.tsx @@ -1,4 +1,4 @@ -import { useEffect, useRef } from "react"; +import { useEffect, useRef, useMemo, useCallback } from "react"; import { useVerge } from "@/hooks/use-verge"; import { Box, IconButton, Tooltip, alpha, styled } from "@mui/material"; import Grid from "@mui/material/Grid2"; @@ -40,67 +40,79 @@ const ScrollBox = styled(Box)(({ theme }) => ({ }, })); +// 默认测试列表,移到组件外部避免重复创建 +const DEFAULT_TEST_LIST = [ + { + uid: nanoid(), + name: "Apple", + url: "https://www.apple.com", + icon: apple, + }, + { + uid: nanoid(), + name: "GitHub", + url: "https://www.github.com", + icon: github, + }, + { + uid: nanoid(), + name: "Google", + url: "https://www.google.com", + icon: google, + }, + { + uid: nanoid(), + name: "Youtube", + url: "https://www.youtube.com", + icon: youtube, + }, +]; + export const TestCard = () => { const { t } = useTranslation(); const sensors = useSensors(useSensor(PointerSensor)); const { verge, mutateVerge, patchVerge } = useVerge(); + const viewerRef = useRef(null); - // test list - const testList = verge?.test_list ?? [ - { - uid: nanoid(), - name: "Apple", - url: "https://www.apple.com", - icon: apple, - }, - { - uid: nanoid(), - name: "GitHub", - url: "https://www.github.com", - icon: github, - }, - { - uid: nanoid(), - name: "Google", - url: "https://www.google.com", - icon: google, - }, - { - uid: nanoid(), - name: "Youtube", - url: "https://www.youtube.com", - icon: youtube, - }, - ]; + // 使用useMemo优化测试列表,避免每次渲染重新计算 + const testList = useMemo(() => { + return verge?.test_list ?? DEFAULT_TEST_LIST; + }, [verge?.test_list]); - const onTestListItemChange = ( - uid: string, - patch?: Partial, - ) => { - if (patch) { - const newList = testList.map((x) => { - if (x.uid === uid) { - return { ...x, ...patch }; - } - return x; - }); + // 使用useCallback优化函数引用,避免不必要的重新渲染 + const onTestListItemChange = useCallback( + (uid: string, patch?: Partial) => { + if (!patch) { + mutateVerge(); + return; + } + + const newList = testList.map((x) => + x.uid === uid ? { ...x, ...patch } : x + ); + mutateVerge({ ...verge, test_list: newList }, false); - } else { - mutateVerge(); - } - }; + }, + [testList, verge, mutateVerge] + ); - const onDeleteTestListItem = (uid: string) => { - const newList = testList.filter((x) => x.uid !== uid); - patchVerge({ test_list: newList }); - mutateVerge({ ...verge, test_list: newList }, false); - }; + const onDeleteTestListItem = useCallback( + (uid: string) => { + const newList = testList.filter((x) => x.uid !== uid); + patchVerge({ test_list: newList }); + mutateVerge({ ...verge, test_list: newList }, false); + }, + [testList, verge, patchVerge, mutateVerge] + ); - const onDragEnd = async (event: DragEndEvent) => { - const { active, over } = event; - if (over && active.id !== over.id) { - let old_index = testList.findIndex((x) => x.uid === active.id); - let new_index = testList.findIndex((x) => x.uid === over.id); + const onDragEnd = useCallback( + async (event: DragEndEvent) => { + const { active, over } = event; + if (!over || active.id === over.id) return; + + const old_index = testList.findIndex((x) => x.uid === active.id); + const new_index = testList.findIndex((x) => x.uid === over.id); + if (old_index >= 0 && new_index >= 0) { const newList = [...testList]; const [removed] = newList.splice(old_index, 1); @@ -109,17 +121,42 @@ export const TestCard = () => { await mutateVerge({ ...verge, test_list: newList }, false); await patchVerge({ test_list: newList }); } - } - }; + }, + [testList, verge, mutateVerge, patchVerge] + ); + // 仅在verge首次加载时初始化测试列表 useEffect(() => { - if (!verge) return; - if (!verge?.test_list) { - patchVerge({ test_list: testList }); + if (verge && !verge.test_list) { + patchVerge({ test_list: DEFAULT_TEST_LIST }); } - }, [verge]); + }, [verge, patchVerge]); - const viewerRef = useRef(null); + // 使用useMemo优化UI内容,减少渲染计算 + const renderTestItems = useMemo(() => ( + + x.uid)}> + {testList.map((item) => ( + + viewerRef.current?.edit(item)} + onDelete={onDeleteTestListItem} + /> + + ))} + + + ), [testList, onDeleteTestListItem]); + + const handleTestAll = useCallback(() => { + emit("verge://test-all"); + }, []); + + const handleCreateTest = useCallback(() => { + viewerRef.current?.create(); + }, []); return ( { action={ - emit("verge://test-all")}> + - viewerRef.current?.create()} - > + @@ -149,20 +183,7 @@ export const TestCard = () => { collisionDetection={closestCenter} onDragEnd={onDragEnd} > - - x.uid)}> - {testList.map((item) => ( - - viewerRef.current?.edit(item)} - onDelete={onDeleteTestListItem} - /> - - ))} - - + {renderTestItems} diff --git a/clash-verge-rev/src/components/setting/setting-system.tsx b/clash-verge-rev/src/components/setting/setting-system.tsx index 69c088553d..3e0ce233e4 100644 --- a/clash-verge-rev/src/components/setting/setting-system.tsx +++ b/clash-verge-rev/src/components/setting/setting-system.tsx @@ -1,5 +1,5 @@ import useSWR, { mutate } from "swr"; -import { useRef } from "react"; +import { useRef, useEffect } from "react"; import { useTranslation } from "react-i18next"; import { SettingsRounded, @@ -20,6 +20,7 @@ import { getAutotemProxy, getRunningMode, installService, + getAutoLaunchStatus, } from "@/services/cmds"; import { useLockFn } from "ahooks"; import { Box, Button, Tooltip } from "@mui/material"; @@ -39,6 +40,15 @@ const SettingSystem = ({ onError }: Props) => { "getRunningMode", getRunningMode, ); + const { data: autoLaunchEnabled } = useSWR("getAutoLaunchStatus", getAutoLaunchStatus); + + // 当实际自启动状态与配置不同步时更新配置 + useEffect(() => { + if (autoLaunchEnabled !== undefined && verge && verge.enable_auto_launch !== autoLaunchEnabled) { + // 静默更新配置,不触发UI刷新 + mutateVerge({ ...verge, enable_auto_launch: autoLaunchEnabled }, false); + } + }, [autoLaunchEnabled]); // 是否以sidecar模式运行 const isSidecarMode = runningMode === "sidecar"; @@ -181,7 +191,20 @@ const SettingSystem = ({ onError }: Props) => { onCatch={onError} onFormat={onSwitchFormat} onChange={(e) => onChangeData({ enable_auto_launch: e })} - onGuard={(e) => patchVerge({ enable_auto_launch: e })} + onGuard={async (e) => { + try { + // 在应用更改之前先触发UI更新,让用户立即看到反馈 + onChangeData({ enable_auto_launch: e }); + await patchVerge({ enable_auto_launch: e }); + // 更新实际状态 + await mutate("getAutoLaunchStatus"); + return Promise.resolve(); + } catch (error) { + // 如果出错,恢复原始状态 + onChangeData({ enable_auto_launch: !e }); + return Promise.reject(error); + } + }} > diff --git a/clash-verge-rev/src/locales/en.json b/clash-verge-rev/src/locales/en.json index df766b85e5..73517834fe 100644 --- a/clash-verge-rev/src/locales/en.json +++ b/clash-verge-rev/src/locales/en.json @@ -207,9 +207,9 @@ "System Proxy Disabled": "System proxy is disabled, it is recommended for most users to turn on this option", "TUN Mode Service Required": "TUN mode requires service mode, please install the service first", "TUN Mode Intercept Info": "TUN mode can take over all application traffic, suitable for special applications", - "Rule Mode Description": "Routes traffic according to preset rules, provides flexible proxy strategies", - "Global Mode Description": "All traffic goes through proxy servers, suitable for scenarios requiring global internet access", - "Direct Mode Description": "All traffic doesn't go through proxy nodes, but is forwarded by Clash kernel to target servers, suitable for specific scenarios requiring kernel traffic distribution", + "rule Mode Description": "Routes traffic according to preset rules, provides flexible proxy strategies", + "global Mode Description": "All traffic goes through proxy servers, suitable for scenarios requiring global internet access", + "direct Mode Description": "All traffic doesn't go through proxy nodes, but is forwarded by Clash kernel to target servers, suitable for specific scenarios requiring kernel traffic distribution", "Stack": "Tun Stack", "System and Mixed Can Only be Used in Service Mode": "System and Mixed Can Only be Used in Service Mode", "Device": "Device Name", @@ -565,5 +565,9 @@ "Failed": "Failed", "Completed": "Completed", "Bahamut Anime": "Bahamut Anime", - "Disallowed ISP": "Disallowed ISP" + "Disallowed ISP": "Disallowed ISP", + "Originals Only": "Originals Only", + "No (IP Banned By Disney+)": "No (IP Banned By Disney+)", + "Unsupported Country": "Unsupported Country", + "Failed (Network Connection)": "Failed (Network Connection)" } diff --git a/clash-verge-rev/src/locales/zh.json b/clash-verge-rev/src/locales/zh.json index 6556dc6dce..69897c524a 100644 --- a/clash-verge-rev/src/locales/zh.json +++ b/clash-verge-rev/src/locales/zh.json @@ -207,9 +207,9 @@ "System Proxy Disabled": "系统代理已关闭,建议大多数用户打开此选项", "TUN Mode Service Required": "TUN模式需要服务模式,请先安装服务", "TUN Mode Intercept Info": "TUN模式可以接管所有应用流量,适用于特殊应用", - "Rule Mode Description": "基于预设规则智能判断流量走向,提供灵活的代理策略", - "Global Mode Description": "所有流量均通过代理服务器,适用于需要全局科学上网的场景", - "Direct Mode Description": "所有流量不经过代理节点,但经过Clash内核转发连接目标服务器,适用于需要通过内核进行分流的特定场景", + "rule Mode Description": "基于预设规则智能判断流量走向,提供灵活的代理策略", + "global Mode Description": "所有流量均通过代理服务器,适用于需要全局科学上网的场景", + "direct Mode Description": "所有流量不经过代理节点,但经过Clash内核转发连接目标服务器,适用于需要通过内核进行分流的特定场景", "Stack": "TUN 模式堆栈", "System and Mixed Can Only be Used in Service Mode": "System 和 Mixed 只能在服务模式下使用", "Device": "TUN 网卡名称", @@ -479,7 +479,7 @@ "Service Administrator Prompt": "Clash Verge 需要使用管理员权限来重新安装系统服务", "DNS Settings": "DNS 设置", "DNS Overwrite": "DNS 覆写", - "DNS Settings Warning": "如果你不清楚这里的设置请不要修改,并保持 DNS 设置开启", + "DNS Settings Warning": "如果你不清楚这里的设置请不要修改,并保持 DNS 覆写开启", "Enable DNS": "启用 DNS", "DNS Listen": "DNS 监听地址", "Enhanced Mode": "增强模式", @@ -565,5 +565,9 @@ "Failed": "测试失败", "Completed": "检测完成", "Bahamut Anime": "动画疯", - "Disallowed ISP": "不允许的 ISP" + "Disallowed ISP": "不允许的 ISP", + "Originals Only": "仅限原创", + "No (IP Banned By Disney+)": "不支持(IP被Disney+禁止)", + "Unsupported Country": "不支持的国家", + "Failed (Network Connection)": "测试失败(网络连接问题)" } diff --git a/clash-verge-rev/src/pages/home.tsx b/clash-verge-rev/src/pages/home.tsx index 56f242e7ef..a5a8eaf7fd 100644 --- a/clash-verge-rev/src/pages/home.tsx +++ b/clash-verge-rev/src/pages/home.tsx @@ -201,7 +201,7 @@ const HomeSettingsDialog = ({ const HomePage = () => { const { t } = useTranslation(); const { verge } = useVerge(); - const { current } = useProfiles(); + const { current, mutateProfiles } = useProfiles(); const navigate = useNavigate(); const theme = useTheme(); @@ -275,7 +275,10 @@ const HomePage = () => { {/* 订阅和当前节点部分 */} {homeCards.profile && ( - + )} diff --git a/clash-verge-rev/src/services/cmds.ts b/clash-verge-rev/src/services/cmds.ts index c95929447e..61618ae988 100644 --- a/clash-verge-rev/src/services/cmds.ts +++ b/clash-verge-rev/src/services/cmds.ts @@ -118,6 +118,16 @@ export async function getAutotemProxy() { }>("get_auto_proxy"); } +export async function getAutoLaunchStatus() { + try { + return await invoke("get_auto_launch_status"); + } catch (error) { + console.error("获取自启动状态失败:", error); + // 出错时返回false作为默认值 + return false; + } +} + export async function changeClashCore(clashCore: string) { return invoke("change_clash_core", { clashCore }); } diff --git a/mihomo/.github/mihomo.service b/mihomo/.github/mihomo.service index a3793fe369..7ecc848661 100644 --- a/mihomo/.github/mihomo.service +++ b/mihomo/.github/mihomo.service @@ -5,8 +5,8 @@ After=network.target nss-lookup.target network-online.target [Service] Type=simple -CapabilityBoundingSet=CAP_NET_ADMIN CAP_NET_RAW CAP_NET_BIND_SERVICE CAP_SYS_PTRACE CAP_DAC_READ_SEARCH -AmbientCapabilities=CAP_NET_ADMIN CAP_NET_RAW CAP_NET_BIND_SERVICE CAP_SYS_PTRACE CAP_DAC_READ_SEARCH +CapabilityBoundingSet=CAP_NET_ADMIN CAP_NET_RAW CAP_NET_BIND_SERVICE CAP_SYS_TIME CAP_SYS_PTRACE CAP_DAC_READ_SEARCH CAP_DAC_OVERRIDE +AmbientCapabilities=CAP_NET_ADMIN CAP_NET_RAW CAP_NET_BIND_SERVICE CAP_SYS_TIME CAP_SYS_PTRACE CAP_DAC_READ_SEARCH CAP_DAC_OVERRIDE ExecStart=/usr/bin/mihomo -d /etc/mihomo ExecReload=/bin/kill -HUP $MAINPID Restart=on-failure diff --git a/mihomo/.github/mihomo@.service b/mihomo/.github/mihomo@.service index a3793fe369..7ecc848661 100644 --- a/mihomo/.github/mihomo@.service +++ b/mihomo/.github/mihomo@.service @@ -5,8 +5,8 @@ After=network.target nss-lookup.target network-online.target [Service] Type=simple -CapabilityBoundingSet=CAP_NET_ADMIN CAP_NET_RAW CAP_NET_BIND_SERVICE CAP_SYS_PTRACE CAP_DAC_READ_SEARCH -AmbientCapabilities=CAP_NET_ADMIN CAP_NET_RAW CAP_NET_BIND_SERVICE CAP_SYS_PTRACE CAP_DAC_READ_SEARCH +CapabilityBoundingSet=CAP_NET_ADMIN CAP_NET_RAW CAP_NET_BIND_SERVICE CAP_SYS_TIME CAP_SYS_PTRACE CAP_DAC_READ_SEARCH CAP_DAC_OVERRIDE +AmbientCapabilities=CAP_NET_ADMIN CAP_NET_RAW CAP_NET_BIND_SERVICE CAP_SYS_TIME CAP_SYS_PTRACE CAP_DAC_READ_SEARCH CAP_DAC_OVERRIDE ExecStart=/usr/bin/mihomo -d /etc/mihomo ExecReload=/bin/kill -HUP $MAINPID Restart=on-failure diff --git a/mihomo/common/net/packet/packet_posix.go b/mihomo/common/net/packet/packet_posix.go index 2073e35de3..8a39288716 100644 --- a/mihomo/common/net/packet/packet_posix.go +++ b/mihomo/common/net/packet/packet_posix.go @@ -45,7 +45,11 @@ func (c *enhanceUDPConn) WaitReadFrom() (data []byte, put func(), addr net.Addr, addr = &net.UDPAddr{IP: ip[:], Port: from.Port} case *syscall.SockaddrInet6: ip := from.Addr // copy from.Addr; ip escapes, so this line allocates 16 bytes - addr = &net.UDPAddr{IP: ip[:], Port: from.Port, Zone: strconv.FormatInt(int64(from.ZoneId), 10)} + zone := "" + if from.ZoneId != 0 { + zone = strconv.FormatInt(int64(from.ZoneId), 10) + } + addr = &net.UDPAddr{IP: ip[:], Port: from.Port, Zone: zone} } } // udp should not convert readN == 0 to io.EOF diff --git a/mihomo/common/net/packet/packet_windows.go b/mihomo/common/net/packet/packet_windows.go index 3c467c6dc3..e6743ee517 100644 --- a/mihomo/common/net/packet/packet_windows.go +++ b/mihomo/common/net/packet/packet_windows.go @@ -54,7 +54,11 @@ func (c *enhanceUDPConn) WaitReadFrom() (data []byte, put func(), addr net.Addr, addr = &net.UDPAddr{IP: ip[:], Port: from.Port} case *windows.SockaddrInet6: ip := from.Addr // copy from.Addr; ip escapes, so this line allocates 16 bytes - addr = &net.UDPAddr{IP: ip[:], Port: from.Port, Zone: strconv.FormatInt(int64(from.ZoneId), 10)} + zone := "" + if from.ZoneId != 0 { + zone = strconv.FormatInt(int64(from.ZoneId), 10) + } + addr = &net.UDPAddr{IP: ip[:], Port: from.Port, Zone: zone} } } // udp should not convert readN == 0 to io.EOF diff --git a/mihomo/component/dialer/dialer.go b/mihomo/component/dialer/dialer.go index da217f280d..0ecccdf8cf 100644 --- a/mihomo/component/dialer/dialer.go +++ b/mihomo/component/dialer/dialer.go @@ -88,21 +88,22 @@ func ListenPacket(ctx context.Context, network, address string, rAddrPort netip. if DefaultSocketHook != nil { // ignore interfaceName, routingMark when DefaultSocketHook not null (in CMFA) socketHookToListenConfig(lc) } else { - if cfg.interfaceName == "" { + interfaceName := cfg.interfaceName + if interfaceName == "" { if finder := DefaultInterfaceFinder.Load(); finder != nil { - cfg.interfaceName = finder.FindInterfaceName(rAddrPort.Addr()) + interfaceName = finder.FindInterfaceName(rAddrPort.Addr()) } } if rAddrPort.Addr().Unmap().IsLoopback() { // avoid "The requested address is not valid in its context." - cfg.interfaceName = "" + interfaceName = "" } - if cfg.interfaceName != "" { + if interfaceName != "" { bind := bindIfaceToListenConfig if cfg.fallbackBind { bind = fallbackBindIfaceToListenConfig } - addr, err := bind(cfg.interfaceName, lc, network, address, rAddrPort) + addr, err := bind(interfaceName, lc, network, address, rAddrPort) if err != nil { return nil, err } @@ -162,17 +163,18 @@ func dialContext(ctx context.Context, network string, destination netip.Addr, po if DefaultSocketHook != nil { // ignore interfaceName, routingMark and tfo when DefaultSocketHook not null (in CMFA) socketHookToToDialer(dialer) } else { - if opt.interfaceName == "" { + interfaceName := opt.interfaceName // don't change the "opt", it's a pointer + if interfaceName == "" { if finder := DefaultInterfaceFinder.Load(); finder != nil { - opt.interfaceName = finder.FindInterfaceName(destination) + interfaceName = finder.FindInterfaceName(destination) } } - if opt.interfaceName != "" { + if interfaceName != "" { bind := bindIfaceToDialer if opt.fallbackBind { bind = fallbackBindIfaceToDialer } - if err := bind(opt.interfaceName, dialer, network, destination); err != nil { + if err := bind(interfaceName, dialer, network, destination); err != nil { return nil, err } } diff --git a/mihomo/component/iface/iface.go b/mihomo/component/iface/iface.go index a56b3432bb..62a46f1f8d 100644 --- a/mihomo/component/iface/iface.go +++ b/mihomo/component/iface/iface.go @@ -7,6 +7,8 @@ import ( "time" "github.com/metacubex/mihomo/common/singledo" + + "github.com/metacubex/bart" ) type Interface struct { @@ -23,16 +25,23 @@ var ( ErrAddrNotFound = errors.New("addr not found") ) -var interfaces = singledo.NewSingle[map[string]*Interface](time.Second * 20) +type ifaceCache struct { + ifMap map[string]*Interface + ifTable bart.Table[*Interface] +} -func Interfaces() (map[string]*Interface, error) { - value, err, _ := interfaces.Do(func() (map[string]*Interface, error) { +var caches = singledo.NewSingle[*ifaceCache](time.Second * 20) + +func getCache() (*ifaceCache, error) { + value, err, _ := caches.Do(func() (*ifaceCache, error) { ifaces, err := net.Interfaces() if err != nil { return nil, err } - r := map[string]*Interface{} + cache := &ifaceCache{ + ifMap: make(map[string]*Interface), + } for _, iface := range ifaces { addrs, err := iface.Addrs() @@ -61,7 +70,7 @@ func Interfaces() (map[string]*Interface, error) { } } - r[iface.Name] = &Interface{ + ifaceObj := &Interface{ Index: iface.Index, MTU: iface.MTU, Name: iface.Name, @@ -69,13 +78,26 @@ func Interfaces() (map[string]*Interface, error) { Flags: iface.Flags, Addresses: ipNets, } + cache.ifMap[iface.Name] = ifaceObj + + for _, prefix := range ipNets { + cache.ifTable.Insert(prefix, ifaceObj) + } } - return r, nil + return cache, nil }) return value, err } +func Interfaces() (map[string]*Interface, error) { + cache, err := getCache() + if err != nil { + return nil, err + } + return cache.ifMap, nil +} + func ResolveInterface(name string) (*Interface, error) { ifaces, err := Interfaces() if err != nil { @@ -90,23 +112,29 @@ func ResolveInterface(name string) (*Interface, error) { return iface, nil } -func IsLocalIp(ip netip.Addr) (bool, error) { - ifaces, err := Interfaces() +func ResolveInterfaceByAddr(addr netip.Addr) (*Interface, error) { + cache, err := getCache() + if err != nil { + return nil, err + } + iface, ok := cache.ifTable.Lookup(addr) + if !ok { + return nil, ErrIfaceNotFound + } + + return iface, nil +} + +func IsLocalIp(addr netip.Addr) (bool, error) { + cache, err := getCache() if err != nil { return false, err } - for _, iface := range ifaces { - for _, addr := range iface.Addresses { - if addr.Contains(ip) { - return true, nil - } - } - } - return false, nil + return cache.ifTable.Contains(addr), nil } func FlushCache() { - interfaces.Reset() + caches.Reset() } func (iface *Interface) PickIPv4Addr(destination netip.Addr) (netip.Prefix, error) { diff --git a/mihomo/dns/system_windows.go b/mihomo/dns/system_windows.go index 2f4d1b633d..a86d50ed1d 100644 --- a/mihomo/dns/system_windows.go +++ b/mihomo/dns/system_windows.go @@ -3,8 +3,9 @@ package dns import ( - "net" + "net/netip" "os" + "strconv" "syscall" "unsafe" @@ -23,28 +24,31 @@ func dnsReadConfig() (servers []string, err error) { if err != nil { continue } - var ip net.IP + var ip netip.Addr switch sa := sa.(type) { case *syscall.SockaddrInet4: - ip = net.IPv4(sa.Addr[0], sa.Addr[1], sa.Addr[2], sa.Addr[3]) + ip = netip.AddrFrom4(sa.Addr) case *syscall.SockaddrInet6: - ip = make(net.IP, net.IPv6len) - copy(ip, sa.Addr[:]) - if ip[0] == 0xfe && ip[1] == 0xc0 { + if sa.Addr[0] == 0xfe && sa.Addr[1] == 0xc0 { // Ignore these fec0/10 ones. Windows seems to // populate them as defaults on its misc rando // interfaces. continue } + ip = netip.AddrFrom16(sa.Addr) + if sa.ZoneId != 0 { + ip = ip.WithZone(strconv.FormatInt(int64(sa.ZoneId), 10)) + } //continue default: // Unexpected type. continue } - if slices.Contains(servers, ip.String()) { + ipStr := ip.String() + if slices.Contains(servers, ipStr) { continue } - servers = append(servers, ip.String()) + servers = append(servers, ipStr) } } return diff --git a/mihomo/go.mod b/mihomo/go.mod index ffc2685dd4..f1ba043671 100644 --- a/mihomo/go.mod +++ b/mihomo/go.mod @@ -18,6 +18,7 @@ require ( github.com/lunixbochs/struc v0.0.0-20200707160740-784aaebc1d40 github.com/mdlayher/netlink v1.7.2 github.com/metacubex/amneziawg-go v0.0.0-20240922133038-fdf3a4d5a4ab + github.com/metacubex/bart v0.19.0 github.com/metacubex/bbolt v0.0.0-20240822011022-aed6d4850399 github.com/metacubex/chacha v0.1.1 github.com/metacubex/gopacket v1.1.20-0.20230608035415-7e2f98a3e759 diff --git a/mihomo/go.sum b/mihomo/go.sum index feacad2d22..c74b82fba5 100644 --- a/mihomo/go.sum +++ b/mihomo/go.sum @@ -97,6 +97,8 @@ github.com/mdlayher/socket v0.4.1 h1:eM9y2/jlbs1M615oshPQOHZzj6R6wMT7bX5NPiQvn2U github.com/mdlayher/socket v0.4.1/go.mod h1:cAqeGjoufqdxWkD7DkpyS+wcefOtmu5OQ8KuoJGIReA= github.com/metacubex/amneziawg-go v0.0.0-20240922133038-fdf3a4d5a4ab h1:Chbw+/31UC14YFNr78pESt5Vowlc62zziw05JCUqoL4= github.com/metacubex/amneziawg-go v0.0.0-20240922133038-fdf3a4d5a4ab/go.mod h1:xVKK8jC5Sd3hfh7WjmCq+HorehIbrBijaUWmcuKjPcI= +github.com/metacubex/bart v0.19.0 h1:XQ9AJeI+WO+phRPkUOoflAFwlqDJnm5BPQpixciJQBY= +github.com/metacubex/bart v0.19.0/go.mod h1:DCcyfP4MC+Zy7sLK7XeGuMw+P5K9mIRsYOBgiE8icsI= github.com/metacubex/bbolt v0.0.0-20240822011022-aed6d4850399 h1:oBowHVKZycNtAFbZ6avaCSZJYeme2Nrj+4RpV2cNJig= github.com/metacubex/bbolt v0.0.0-20240822011022-aed6d4850399/go.mod h1:4xcieuIK+M4bGQmQYZVqEaIYqjS1ahO4kXG7EmDgEro= github.com/metacubex/chacha v0.1.1 h1:OHIv11Nd9CISAIzegpjfupIoZp9DYm6uQw41RxvmU/c= diff --git a/mihomo/listener/sing_tun/iface.go b/mihomo/listener/sing_tun/iface.go index ed152b69c7..3551a853bb 100644 --- a/mihomo/listener/sing_tun/iface.go +++ b/mihomo/listener/sing_tun/iface.go @@ -1,7 +1,6 @@ package sing_tun import ( - "errors" "net" "net/netip" @@ -16,7 +15,8 @@ var DefaultInterfaceFinder control.InterfaceFinder = (*defaultInterfaceFinder)(n func (f *defaultInterfaceFinder) Update() error { iface.FlushCache() - return nil + _, err := iface.Interfaces() + return err } func (f *defaultInterfaceFinder) Interfaces() []control.Interface { @@ -32,27 +32,19 @@ func (f *defaultInterfaceFinder) Interfaces() []control.Interface { return interfaces } -var errNoSuchInterface = errors.New("no such network interface") - func (f *defaultInterfaceFinder) ByName(name string) (*control.Interface, error) { - ifaces, err := iface.Interfaces() - if err != nil { - return nil, err - } - for _, netInterface := range ifaces { - if netInterface.Name == name { - return (*control.Interface)(netInterface), nil - } - } - _, err = net.InterfaceByName(name) + netInterface, err := iface.ResolveInterface(name) if err == nil { + return (*control.Interface)(netInterface), nil + } + if _, err := net.InterfaceByName(name); err == nil { err = f.Update() if err != nil { return nil, err } return f.ByName(name) } - return nil, errNoSuchInterface + return nil, err } func (f *defaultInterfaceFinder) ByIndex(index int) (*control.Interface, error) { @@ -73,20 +65,13 @@ func (f *defaultInterfaceFinder) ByIndex(index int) (*control.Interface, error) } return f.ByIndex(index) } - return nil, errNoSuchInterface + return nil, iface.ErrIfaceNotFound } func (f *defaultInterfaceFinder) ByAddr(addr netip.Addr) (*control.Interface, error) { - ifaces, err := iface.Interfaces() + netInterface, err := iface.ResolveInterfaceByAddr(addr) if err != nil { return nil, err } - for _, netInterface := range ifaces { - for _, prefix := range netInterface.Addresses { - if prefix.Contains(addr) { - return (*control.Interface)(netInterface), nil - } - } - } - return nil, errNoSuchInterface + return (*control.Interface)(netInterface), nil } diff --git a/openwrt-packages/luci-app-partexp/Makefile b/openwrt-packages/luci-app-partexp/Makefile index 00437e3b21..8318ecc886 100644 --- a/openwrt-packages/luci-app-partexp/Makefile +++ b/openwrt-packages/luci-app-partexp/Makefile @@ -7,14 +7,14 @@ include $(TOPDIR)/rules.mk PKG_NAME:=luci-app-partexp -PKG_VERSION:=1.1.2 -PKG_RELEASE:=20250305 +PKG_VERSION:=1.2.1 +PKG_RELEASE:=20250315 PKG_LICENSE:=Apache-2.0 PKG_MAINTAINER:=Sirpdboy LUCI_TITLE:=LuCI Support for Automatic Partition Mount -LUCI_DEPENDS:=+fdisk +block-mount +LUCI_DEPENDS:=+fdisk +block-mount +bc +parted LUCI_PKGARCH:=all diff --git a/openwrt-packages/luci-app-partexp/luasrc/model/cbi/partexp/global.lua b/openwrt-packages/luci-app-partexp/luasrc/model/cbi/partexp/global.lua index 9d8d5deb94..a18a8a803e 100644 --- a/openwrt-packages/luci-app-partexp/luasrc/model/cbi/partexp/global.lua +++ b/openwrt-packages/luci-app-partexp/luasrc/model/cbi/partexp/global.lua @@ -7,18 +7,17 @@ local util = require "nixio.util" local tp = require "luci.template.parser" local uci=luci.model.uci.cursor() luci.sys.exec("echo '-' >/tmp/partexp.log&&echo 1 > /tmp/lucilogpos" ) - -- get all device names (sdX and mmcblkX) - local target_devnames = {} - for dev in fs.dir("/dev") do +local target_devnames = {} +for dev in fs.dir("/dev") do if dev:match("^sd[a-z]$") or dev:match("^mmcblk%d+$") or dev:match("^sata[a-z]$") or dev:match("^nvme%d+n%d+$") - or dev:match("^vd[a-z]$") + or dev:match("^vd[a-z]") then - table.insert(target_devnames, dev) + table.insert(target_devnames, dev) end - end +end local devices = {} for i, bname in pairs(target_devnames) do local device_info = {} @@ -41,8 +40,6 @@ t.anonymous=true e=t:option(ListValue,"target_function", translate("Select function"),translate("Select the function to be performed")) e:value("/overlay", translate("Expand application space overlay (/overlay)")) --- e:value("/", translate("Use as root filesystem (/)")) --- e:value("/lnoverlay", translate("Soft chain partition expansion(/overlay)")) e:value("/opt", translate("Used as Docker data disk (/opt)")) e:value("/dev", translate("Normal mount and use by device name(/dev/x1)")) e.default="/opt" @@ -63,7 +60,6 @@ e.default=0 e=t:option(Flag,'auto_format', translate('Format before use'),translate("Ticking indicates formatting")) e:depends("target_function", "/opt") e:depends("target_function", "/dev") --- e:depends("target_function", "/lnoverlay") e.default=0 e=t:option(Button, "restart", translate("Perform operation")) diff --git a/openwrt-packages/luci-app-partexp/luasrc/model/diskmount.lua b/openwrt-packages/luci-app-partexp/luasrc/model/diskmount.lua index e25fabc965..42764fcfa7 100644 --- a/openwrt-packages/luci-app-partexp/luasrc/model/diskmount.lua +++ b/openwrt-packages/luci-app-partexp/luasrc/model/diskmount.lua @@ -17,6 +17,7 @@ local d.list_disks = function() or dev:match("^mmcblk%d+$") or dev:match("^sata[a-z]$") or dev:match("^nvme%d+n%d+$") + or dev:match("^vd[a-z]$") then table.insert(target_devnames, dev) end diff --git a/openwrt-packages/luci-app-partexp/po/zh-cn/partexp.po b/openwrt-packages/luci-app-partexp/po/zh-cn/partexp.po index 9177b33f43..b56604f3d2 100644 --- a/openwrt-packages/luci-app-partexp/po/zh-cn/partexp.po +++ b/openwrt-packages/luci-app-partexp/po/zh-cn/partexp.po @@ -45,6 +45,9 @@ msgstr "选择需要操作的硬盘设备" msgid "Select function" msgstr "选择功能" +msgid "Select the function to be performed" +msgstr "选择要执行的功能" + msgid "Click to execute" msgstr "点击执行" @@ -73,4 +76,4 @@ msgid "Ticking indicates formatting" msgstr "打勾选择表示格式化" msgid "Tick means to retain the settings" -msgstr "打勾选择表示保留设置" \ No newline at end of file +msgstr "打勾选择表示保留设置" diff --git a/openwrt-packages/luci-app-partexp/po/zh_Hans/partexp.po b/openwrt-packages/luci-app-partexp/po/zh_Hans/partexp.po index 1eea307b22..b56604f3d2 100644 --- a/openwrt-packages/luci-app-partexp/po/zh_Hans/partexp.po +++ b/openwrt-packages/luci-app-partexp/po/zh_Hans/partexp.po @@ -45,6 +45,9 @@ msgstr "选择需要操作的硬盘设备" msgid "Select function" msgstr "选择功能" +msgid "Select the function to be performed" +msgstr "选择要执行的功能" + msgid "Click to execute" msgstr "点击执行" diff --git a/openwrt-packages/luci-app-partexp/root/etc/init.d/partexp b/openwrt-packages/luci-app-partexp/root/etc/init.d/partexp index b1466736b4..81bbda8b30 100644 --- a/openwrt-packages/luci-app-partexp/root/etc/init.d/partexp +++ b/openwrt-packages/luci-app-partexp/root/etc/init.d/partexp @@ -21,7 +21,7 @@ limit_log() { local sc=100 [ -n "$2" ] && sc=$2 local count=$(grep -c "" $logf) - if [ $count -gt $sc ];then + if [[ $count -gt $sc ]];then let count=count-$sc sed -i "1,$count d" $logf fi @@ -50,19 +50,54 @@ get_config() { config_get_bool auto_format $1 auto_format 1 } -nfdisk(){ +# 定义函数:检查硬盘是否已挂载 +is_disk_mounted() { + DISK=$1 + # 检查是否已挂载 + if mount | grep -q "^/dev/$DISK"; then + return 0 # 已挂载 + else + return 1 # 未挂载 + fi +} -#Start partition -fdisk $1 << EOF >/dev/null 2> /dev/null -n -p - - - -wq -EOF +# 定义函数:取消挂载硬盘 +unmount_disk() { + DISK=$1 + # log "正在取消挂载 /dev/$DISK..." + MOUNT='';eval $(block info "/dev/$DISK" | grep -o -e "MOUNT=\S*") + if [ "$MOUNT" ] ; then + umount /dev/$DISK 2>/dev/null + if [ $? -eq 0 ]; then + log "取消挂载成功: /dev/$DISK" + else + log "取消挂载失败: /dev/$DISK" + fi + fi } + +# 定义函数:检查是否有共享挂载(如 Samba 或 NFS) +check_shared_mount() { + DISK=$1 + if [ -f /etc/config/samba ]; then + SHARED=$(grep -q "/dev/$DISK" /etc/config/samba) + if [ $? -eq 0 ]; then + log "检测到 Samba 共享挂载: /dev/$DISK" + return 0 + fi + fi + # 检查是否有 NFS 共享 + if [ -f /etc/exports ]; then + SHARED=$(grep -q "/dev/$DISK" /etc/exports) + if [ $? -eq 0 ]; then + log "检测到 NFS 共享挂载: /dev/$DISK" + return 0 + fi + fi + return 1 +} + usamba(){ s=$1 s2=$2 @@ -75,33 +110,63 @@ s2=$2 uci delete $s.@sambashare[$i] uci commit $s log "分区/dev/$b被挂载$MOUNT共享使用,删除$s共享成功!" - sleep 5 - /etc/init.d/$s restart + sleep 1 } done } + # 取消 Samba 共享 + if [ -f /etc/config/$s ]; then + sed -i "/\/dev\/$b/d" /etc/config/$s + /etc/init.d/$s restart + fi + # 取消 NFS 共享 + if [ -f /etc/exports ]; then + sed -i "/\/dev\/$b/d" /etc/exports + /etc/init.d/nfs restart + fi +} + + +is_disk_partitioned() { + PARTITION_COUNT=$(fdisk -l /dev/$1 2>/dev/null | grep -E "^/dev/$2" | wc -l) + if [[ "$PARTITION_COUNT" -gt 0 ]]; then + echo 1 + else + echo 0 + fi +} + +partednew(){ + DISK=$1 + parted -s /dev/$DISK mklabel gpt + parted -s /dev/$DISK mkpart primary ext4 1MiB -1 +} + +fdisknew(){ + echo -e "n\np\n\n\n\nw" | fdisk /dev/$1 >/dev/null 2> /dev/null +} + +fdisksave(){ + echo -e "n\w" | fdisk /dev/$1 >/dev/null 2> /dev/null } fdiskB(){ a=$1 b=$1$2 - log "检测$a是否分区..." - isP=`fdisk -l /dev/$a |grep -v "bytes"|grep "/dev/$b" ` - sleep 2 + log "检测$a是否分区$b..." isfdisk=0 - if [ ! "$isP" ];then - nfdisk /dev/$a + isP=$(is_disk_partitioned $a $b) + if [ "$isP" == '0' ] ;then + fdisksave $a + fdisknew $a sleep 2 isfdisk=1 - - else - isfdisk=2 fi - isP=`fdisk -l /dev/$a |grep -v "bytes" | grep "/dev/$b"| wc -l` - if [ "$isP" == 1 -a "$isfdisk" = 1 ] ;then + isP=$(is_disk_partitioned $a $b) + if [ $isP == '1' -a "$isfdisk" == 1 ] ;then log "分区$b建立成功!" - elif [ "$isP" == 1 -a "$isfdisk" = 2 ] ;then + elif [ $isP == '1' -a "$isfdisk" = 0 ] ;then log "检测目标分区$b已存在." else log "分区$b建立失败,没有足够的空间操作失败!" @@ -109,6 +174,7 @@ fdiskB(){ fi sleep 1 [ -e "/etc/config/dockerd" ] && /etc/init.d/dockerd stop >/dev/null 2> /dev/null + block detect > /etc/config/fstab isD=` block info "/dev/$b" ` if [ "$isD" ];then @@ -119,7 +185,7 @@ fdiskB(){ usamba samba4 $MOUNT usamba samba $MOUNT sleep 5 - umount $MOUNT || block umount /dev/$b + umount $MOUNT || block umount /dev/$b >/dev/null 2> /dev/null sleep 5 MOUNT='';eval $(block info "/dev/$b" | grep -o -e "MOUNT=\S*") if [ "x$MOUNT" != 'x' ] ;then @@ -137,7 +203,6 @@ fdiskB(){ mkfs.ext4 -L extroot /dev/$b >/dev/null 2> /dev/null log "设备/dev/$b格式化EXT4成功!" elif [ "$auto_format" = "1" -o "$isfdisk" = "1" ] ; then - log "正在将/dev/$b格式化为EXT4文件系统..." mkfs.ext4 -F /dev/$b >/dev/null 2> /dev/null log "设备/dev/$b格式化EXT4成功!" elif [ "$TYPE" ];then @@ -150,7 +215,7 @@ fdiskB(){ [ -d "/mnt/$b" ] || mkdir -p /mnt/$b MOUNT='';eval $(block info "/dev/$b" | grep -o -e "MOUNT=\S*") if [ "x$MOUNT" != 'x' ] ;then - umount /mnt/$b || block umount /dev/$b + umount /mnt/$b || block umount /dev/$b >/dev/null 2> /dev/null MOUNT='';eval $(block info "/dev/$b" | grep -o -e "MOUNT=\S*") if [ "$MOUNT" ] ; then log "检测设备/dev/$b被占用,请检查设备硬件或中止其他插件等占用权限再重试!" @@ -158,8 +223,8 @@ fdiskB(){ fi fi TYPE='';eval $(block info "/dev/$b" | grep -o -e "TYPE=\S*") - log "检测设备/dev/$b分区是$TYPE格式!" if [ "$TYPE" = "ntfs" ];then + log "检测设备/dev/$b分区是$TYPE格式!" if [ `which ntfs-3g ` ] ;then mount -t ntfs-3g /dev/$b /mnt/$b >/dev/null 2> /dev/null elif [ `which ntfs3 ` ] ;then @@ -169,7 +234,7 @@ fdiskB(){ expquit 1 fi else - mount /dev/$b /mnt/$b >/dev/null 2> /dev/null + /usr/bin/mount /dev/$b /mnt/$b >/dev/null 2> /dev/null fi UUID='';eval $(block info /dev/$b | grep -o -e "UUID=\S*") if [ ! "$UUID" ] ; then @@ -184,7 +249,7 @@ fdiskB(){ mount --bind / /tmp/introot tar -C /tmp/introot -cvf - . | tar -C /mnt/$b -xf - umount /tmp/introot || block umount /tmp/introot - umount /mnt/$b || block umount /dev/$b + umount /mnt/$b || block umount /dev/$b >/dev/null 2> /dev/null block detect > /etc/config/fstab OVERLAY=`uci -q get fstab.@mount[0].target ` if [ "$OVERLAY" == "/overlay" -o "$OVERLAY" == "/dev/loop0" ] ;then @@ -203,7 +268,7 @@ fdiskB(){ # cp -a -f /overlay/* /mnt/$b/ || cp -a -f /rom/overlay/* /mnt/$b/ tar -C /overlay -cvf - . | tar -C /mnt/$b/ -xf - || tar -C /rom/overlay -cvf - . | tar -C /mnt/$b/ -xf - - umount /mnt/$b || block umount /dev/$b + umount /mnt/$b || block umount /dev/$b >/dev/null 2> /dev/null block detect > /etc/config/fstab OVERLAY=`uci -q get fstab.@mount[0].target ` if [ "$OVERLAY" == "/overlay" -o "$OVERLAY" == "/dev/loop0" ] ;then @@ -230,7 +295,7 @@ fdiskB(){ else - umount /mnt/$b || block umount /dev/$b + umount /mnt/$b || block umount /dev/$b >/dev/null 2> /dev/null block detect > /etc/config/fstab OVERLAY=`uci -q get fstab.@mount[0].target ` if [ "$OVERLAY" == "/overlay" -o "$OVERLAY" == "/dev/loop0" ] ;then @@ -258,7 +323,7 @@ fdiskB(){ fi elif [ "$target_function" = "/lnoverlay" ] ; then - umount /mnt/$b || block umount /dev/$b + umount /mnt/$b || block umount /dev/$b >/dev/null 2> /dev/null block detect > /etc/config/fstab mkdir -p $target_function @@ -278,7 +343,7 @@ fdiskB(){ log "设备重启才能生效" expquit 2 else - umount /mnt/$b || block umount /dev/$b + umount /mnt/$b || block umount /dev/$b >/dev/null 2> /dev/null block detect > /etc/config/fstab mkdir -p $target_function @@ -302,55 +367,115 @@ fdiskB(){ fi } +get_system_disk() { + SYSTEM_DISK=$(mount | grep 'on /overlay' | awk '{print $1}' | sed 's/[0-9]*$//' |head -1) + [ -z ${SYSTEM_DISK} ] && SYSTEM_DISK=$( df -h | grep boot |awk -F ' ' '{print $1}' |head -1) + echo "$SYSTEM_DISK" +} + +get_all_disks() { + DISKS=`find /dev -regex '.*/\(sd[a-z]\|mmcblk[0-9]\+\|sata[a-z]\|nvme[0-9]\+n[0-9]\+\|vd[a-z]\)$'` + echo "$DISKS" +} + +check_free_space() { + DISK=$1 + PARTED_OUTPUT=$(parted /dev/$DISK unit GB print free 2>/dev/null) + FREE_SPACE=$(echo "$PARTED_OUTPUT" | grep "Free Space" | awk '{print $3}' ) + echo $FREE_SPACE |awk -F '.' '{print $1}' +} + +# 定义函数:获取下一个新的可用的分区号 +get_next_partition_number() { + DISK=$1 + PARTITIONS=$(fdisk -l /dev/$DISK 2>/dev/null | grep -v boot | grep -E "^/dev/$DISK" | awk '{print $1}' | sed 's/\/dev\/[a-z]*//g' | awk -F '[^0-9]+' '{print $NF}') + MAX_PARTITION=$(echo "$PARTITIONS" | sort -n | tail -n 1) + NEXT_PARTITION=$(awk -v n="$MAX_PARTITION" 'BEGIN { print n + 1 }') + #NEXT_PARTITION=$((MAX_PARTITION + 1)) + echo "$NEXT_PARTITION" +} + +# 定义函数:获取最后一个可用的分区号 +get_last_partition_number() { + DISK=$1 + PARTITIONS=$(fdisk -l /dev/$DISK 2>/dev/null | grep -v boot | grep -E "^/dev/$DISK" | awk '{print $1}' | sed 's/\/dev\/[a-z]*//g' | awk -F '[^0-9]+' '{print $NF}') + MAX_PARTITION=$(echo "$PARTITIONS" | sort -n | tail -n 1) + echo "$MAX_PARTITION" +} + + +# 定义函数:获取硬盘分区数 +get_partition_number() { + DISK=$1 + PARTITIONS=$(fdisk -l /dev/$DISK 2>/dev/null | grep -v boot | grep -E "^/dev/$DISK" | awk '{print $1}' | sed 's/\/dev\/[a-z]*//g' | wc -l) + echo "$PARTITIONS" +} + autopart() { - # [ -f $LOCK ] && exit config_load partexp config_foreach get_config global init_env - # touch $LOCK gen_log - log "此次执行操作功能:$target_function ,目标盘:/dev/$target_disk" - isP=`fdisk -l /dev/$target_disk |grep "Disk /dev/$target_disk"` - if [ "$isP" = "" ];then - log "没有检测到/dev/$target_disk目标设备!操作失败!" - expquit 1 - else - isB="$(sed -n -e "\|\s/boot\s.*$|{s///p;q}" /etc/mtab)" - isb=`fdisk -l | grep /dev/$target_disk | grep -v "bytes" | wc -l` - if [ "$isb" = 0 -o "$isb" = 1 ] ;then - isb=1 - - log "检测到设备/dev/$target_disk分区数为$isb个!" - elif [ "$isb" = 3 -o "$isb" = 4 ] ;then - isb=3 - - log "检测到设备/dev/$target_disk分区数为$isb个!" - else - log "检测到设备/dev/$target_disk分区数$isb个,请备份数据后删除分区重新操作!" - expquit 1 - fi - log "检测到操作目标设备:/dev/$target_disk$isb!" - case "$target_disk" in - vd*) - [ "$isB" = "/dev/${target_disk}1" -a "$target_function" = "/overlay" ] && fdiskB $target_disk 3 || fdiskB $target_disk $isb - ;; + NEXTPART=1 #目标分区 + DISK=$target_disk #目标硬盘 + DISKSALL=$(get_all_disks) #硬盘名列表 + DISK_COUNT=$(echo "$DISKSALL" | wc -l) #所有硬盘数量 + log "系统中检测到的硬盘数量: $DISK_COUNT" + log "硬盘信息列表:" $DISKSALL + SYSTEM_DISK=$(get_system_disk) + log "系统盘: "$SYSTEM_DISK + if [ "/dev/$DISK" == "$SYSTEM_DISK" ] ;then + fdisksave /dev/$DISK + log "此次执行操作功能:$target_function ,目标盘是系统盘:/dev/$DISK" + PARTITIONSUM=$(get_partition_number $DISK) + log "目标盘 $DISK 一共有分区数: $PARTITIONSUM个" + if [[ "$PARTITIONSUM" -gt 3 ]];then + FREE_SPACE=$(check_free_space $(basename $DISK)) + log "目标盘 $DISK 有剩余空间: $FREE_SPACE Gb" + if [[ "$FREE_SPACE" -gt 2 ]]; then + NEXTPART=$(get_next_partition_number $DISK) + else + NEXTPART=$(get_last_partition_number $DISK) + fi + else + FREE_SPACE=$(check_free_space $(basename $DISK)) + log "目标盘 $DISK 有剩余空间: $FREE_SPACE Gb" + if [[ "$FREE_SPACE" -gt 2 ]]; then + NEXTPART=$(get_next_partition_number $DISK) + else - sd*) - [ "$isB" = "/dev/${target_disk}1" -a "$target_function" = "/overlay" ] && fdiskB $target_disk 3 || fdiskB $target_disk $isb - ;; - nvme*) - [ "$isB" = "/dev/${target_disk}p1" -a "$target_function" = "/overlay" ] && fdiskB $target_disk p3 || fdiskB $target_disk p$isb - ;; - mmc*) - [ "$isB" = "/dev/${target_disk}p1" -a "$target_function" = "/overlay" ] && fdiskB $target_disk p3 || fdiskB $target_disk p$isb - ;; + log "目标盘 $SYSTEM_DISK 没有足够的剩余空间!" + expquit 1 + fi + fi + else + log "此次执行操作功能:$target_function ,目标盘是:/dev/$DISK" + PARTITIONSUM=$(get_partition_number $DISK) + log "目标盘 $DISK 一共有分区数: $PARTITIONSUM个" + if [[ "$PARTITIONSUM" -gt 1 ]];then + FREE_SPACE=$(check_free_space $(basename $DISK)) + log "目标盘 $DISK 有剩余空间: $FREE_SPACE Gb" + + [[ $FREE_SPACE -gt 2 ]] && NEXTPART=$(get_next_partition_number $DISK) || NEXTPART=$(get_last_partition_number $DISK) + else + NEXTPART=1 + fi + + fi + + log "定位到操作目标设备分区:/dev/$DISK$NEXTPART" + case "$DISK" in + vd*) fdiskB $DISK $NEXTPART;; + + sd*) fdiskB $DISK $NEXTPART;; + nvme*) fdiskB $DISK p$NEXTPART;; + mmc*) fdiskB $DISK p$NEXTPART;; *) log "目标设备/dev/$target_disk暂不支持!请联系作者sirpdboy!" expquit 1 ;; esac - fi rm -f $LOCK } diff --git a/openwrt-passwall/luci-app-passwall/luasrc/controller/passwall.lua b/openwrt-passwall/luci-app-passwall/luasrc/controller/passwall.lua index f6355d818e..e4c4318a6e 100644 --- a/openwrt-passwall/luci-app-passwall/luasrc/controller/passwall.lua +++ b/openwrt-passwall/luci-app-passwall/luasrc/controller/passwall.lua @@ -192,7 +192,7 @@ function get_redir_log() proto = "TCP" end if fs.access(path .. "/" .. proto .. ".log") then - local content = luci.sys.exec("cat ".. path .. "/" .. proto .. ".log") + local content = luci.sys.exec("tail -n 19999 ".. path .. "/" .. proto .. ".log") content = content:gsub("\n", "
") luci.http.write(content) else @@ -216,7 +216,7 @@ function get_chinadns_log() local flag = luci.http.formvalue("flag") local path = "/tmp/etc/passwall/acl/" .. flag .. "/chinadns_ng.log" if fs.access(path) then - local content = luci.sys.exec("cat ".. path) + local content = luci.sys.exec("tail -n 5000 ".. path) content = content:gsub("\n", "
") luci.http.write(content) else diff --git a/openwrt-passwall/luci-app-passwall/luasrc/model/cbi/passwall/client/type/sing-box.lua b/openwrt-passwall/luci-app-passwall/luasrc/model/cbi/passwall/client/type/sing-box.lua index eb90c5da91..189be90f1e 100644 --- a/openwrt-passwall/luci-app-passwall/luasrc/model/cbi/passwall/client/type/sing-box.lua +++ b/openwrt-passwall/luci-app-passwall/luasrc/model/cbi/passwall/client/type/sing-box.lua @@ -401,6 +401,10 @@ if singbox_tags:find("with_quic") then end if singbox_tags:find("with_quic") then + o = s:option(Value, _n("hysteria2_ports"), translate("Port hopping range")) + o.description = translate("Format as 1000:2000 Multiple groups are separated by commas (,).") + o:depends({ [_n("protocol")] = "hysteria2" }) + o = s:option(Value, _n("hysteria2_up_mbps"), translate("Max upload Mbps")) o:depends({ [_n("protocol")] = "hysteria2" }) diff --git a/openwrt-passwall/luci-app-passwall/luasrc/passwall/util_sing-box.lua b/openwrt-passwall/luci-app-passwall/luasrc/passwall/util_sing-box.lua index c4a26a7617..37f1fd4758 100644 --- a/openwrt-passwall/luci-app-passwall/luasrc/passwall/util_sing-box.lua +++ b/openwrt-passwall/luci-app-passwall/luasrc/passwall/util_sing-box.lua @@ -383,7 +383,17 @@ function gen_outbound(flag, node, tag, proxy_table) end if node.protocol == "hysteria2" then + local server_ports = {} + if node.hysteria2_ports then + for range in node.hysteria2_ports:gmatch("([^,]+)") do + if range:match("^%d+:%d+$") then + table.insert(server_ports, range) + end + end + end protocol_table = { + server_ports = next(server_ports) and server_ports or nil, + hop_interval = next(server_ports) and "30s" or nil, up_mbps = (node.hysteria2_up_mbps and tonumber(node.hysteria2_up_mbps)) and tonumber(node.hysteria2_up_mbps) or nil, down_mbps = (node.hysteria2_down_mbps and tonumber(node.hysteria2_down_mbps)) and tonumber(node.hysteria2_down_mbps) or nil, obfs = { diff --git a/openwrt-passwall/luci-app-passwall/po/zh-cn/passwall.po b/openwrt-passwall/luci-app-passwall/po/zh-cn/passwall.po index 929cd133b8..2925a998b6 100644 --- a/openwrt-passwall/luci-app-passwall/po/zh-cn/passwall.po +++ b/openwrt-passwall/luci-app-passwall/po/zh-cn/passwall.po @@ -1821,3 +1821,9 @@ msgstr "中断现有连接" msgid "Interrupt existing connections when the selected outbound has changed." msgstr "当选择的出站发生变化时中断现有连接。" + +msgid "Port hopping range" +msgstr "端口跳跃范围" + +msgid "Format as 1000:2000 Multiple groups are separated by commas (,)." +msgstr "格式为:1000:2000 多组时用逗号(,)隔开。" diff --git a/shadowsocks-rust/Makefile b/shadowsocks-rust/Makefile index 34d1564ca3..8e961696e0 100644 --- a/shadowsocks-rust/Makefile +++ b/shadowsocks-rust/Makefile @@ -6,9 +6,9 @@ all: build build: ifeq (${TARGET}, release) - cargo build --release --features "local-tun local-redir" + cargo build --release --features "full" else - cargo build --features "local-tun local-redir" + cargo build --features "full" endif install: diff --git a/sing-box/common/dialer/dialer.go b/sing-box/common/dialer/dialer.go index 00ebbeacc0..b93b709671 100644 --- a/sing-box/common/dialer/dialer.go +++ b/sing-box/common/dialer/dialer.go @@ -52,7 +52,7 @@ func NewWithOptions(options Options) (N.Dialer, error) { return nil, err } } - if options.RemoteIsDomain && (dialOptions.Detour == "" || options.ResolverOnDetour) { + if options.RemoteIsDomain && (dialOptions.Detour == "" || options.ResolverOnDetour || dialOptions.DomainResolver != nil && dialOptions.DomainResolver.Server != "") { networkManager := service.FromContext[adapter.NetworkManager](options.Context) dnsTransport := service.FromContext[adapter.DNSTransportManager](options.Context) var defaultOptions adapter.NetworkOptions diff --git a/sing-box/docs/changelog.md b/sing-box/docs/changelog.md index bb0389c65e..70bdff69b9 100644 --- a/sing-box/docs/changelog.md +++ b/sing-box/docs/changelog.md @@ -2,6 +2,15 @@ icon: material/alert-decagram --- +#### 1.12.0-alpha.18 + +* Add wildcard SNI support for ShadowTLS inbound **1** +* Fixes and improvements + +**1**: + +See [ShadowTLS](/configuration/inbound/shadowtls/#wildcard_sni). + #### 1.12.0-alpha.17 * Add NTP sniffer **1** diff --git a/sing-box/docs/configuration/inbound/shadowtls.md b/sing-box/docs/configuration/inbound/shadowtls.md index 0f6684d20e..9dbf1dd5cb 100644 --- a/sing-box/docs/configuration/inbound/shadowtls.md +++ b/sing-box/docs/configuration/inbound/shadowtls.md @@ -1,3 +1,11 @@ +--- +icon: material/new-box +--- + +!!! quote "Changes in sing-box 1.12.0" + + :material-plus: [wildcard_sni](#wildcard_sni) + ### Structure ```json @@ -29,7 +37,8 @@ ... // Dial Fields } }, - "strict_mode": false + "strict_mode": false, + "wildcard_sni": "" } ``` @@ -55,7 +64,6 @@ ShadowTLS password. Only available in the ShadowTLS protocol 2. - #### users ShadowTLS users. @@ -66,6 +74,8 @@ Only available in the ShadowTLS protocol 3. ==Required== +When `wildcard_sni` is configured to `all`, the server address is optional. + Handshake server address and [Dial Fields](/configuration/shared/dial/). #### handshake_for_server_name @@ -79,3 +89,19 @@ Only available in the ShadowTLS protocol 2/3. ShadowTLS strict mode. Only available in the ShadowTLS protocol 3. + +#### wildcard_sni + +!!! question "Since sing-box 1.12.0" + +ShadowTLS wildcard SNI mode. + +Available values are: + +* `off`: (default) Disabled. +* `authed`: Authenticated connections will have their destination overwritten to `(servername):443` +* `all`: All connections will have their destination overwritten to `(servername):443` + +Additionally, connections matching `handshake_for_server_name` are not affected. + +Only available in the ShadowTLS protocol 3. diff --git a/sing-box/docs/configuration/inbound/shadowtls.zh.md b/sing-box/docs/configuration/inbound/shadowtls.zh.md index 1497ac42f8..be86005131 100644 --- a/sing-box/docs/configuration/inbound/shadowtls.zh.md +++ b/sing-box/docs/configuration/inbound/shadowtls.zh.md @@ -1,3 +1,11 @@ +--- +icon: material/new-box +--- + +!!! quote "sing-box 1.12.0 中的更改" + + :material-plus: [wildcard_sni](#wildcard_sni) + ### 结构 ```json @@ -29,7 +37,8 @@ ... // 拨号字段 } }, - "strict_mode": false + "strict_mode": false, + "wildcard_sni": "" } ``` @@ -80,3 +89,19 @@ ShadowTLS 用户。 ShadowTLS 严格模式。 仅在 ShadowTLS 协议版本 3 中可用。 + +#### wildcard_sni + +!!! question "自 sing-box 1.12.0 起" + +ShadowTLS 通配符 SNI 模式。 + +可用值: + +* `off`:(默认)禁用。 +* `authed`:已认证的连接的目标将被重写为 `(servername):443`。 +* `all`:所有连接的目标将被重写为 `(servername):443`。 + +此外,匹配 `handshake_for_server_name` 的连接不受影响。 + +仅在 ShadowTLS 协议 3 中可用。 diff --git a/small/luci-app-homeproxy/root/etc/config/homeproxy b/small/luci-app-homeproxy/root/etc/config/homeproxy index 60c6be3252..de331268f7 100644 --- a/small/luci-app-homeproxy/root/etc/config/homeproxy +++ b/small/luci-app-homeproxy/root/etc/config/homeproxy @@ -6,6 +6,7 @@ config homeproxy 'infra' option redirect_port '5331' option tproxy_port '5332' option dns_port '5333' + option sniff_override '1' option udp_timeout '' option tun_name 'singtun0' option tun_addr4 '172.19.0.1/30' diff --git a/small/luci-app-homeproxy/root/etc/homeproxy/scripts/generate_client.uc b/small/luci-app-homeproxy/root/etc/homeproxy/scripts/generate_client.uc index c1175cd506..78d9594a68 100755 --- a/small/luci-app-homeproxy/root/etc/homeproxy/scripts/generate_client.uc +++ b/small/luci-app-homeproxy/root/etc/homeproxy/scripts/generate_client.uc @@ -51,7 +51,7 @@ if (!wan_dns) const dns_port = uci.get(uciconfig, uciinfra, 'dns_port') || '5333'; -let main_node, main_udp_node, dedicated_udp_node, default_outbound, domain_strategy, sniff_override = '1', +let main_node, main_udp_node, dedicated_udp_node, default_outbound, 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, cache_file_store_rdrc, cache_file_rdrc_timeout, direct_domain_list, proxy_domain_list; @@ -78,6 +78,8 @@ if (routing_mode !== 'custom') { proxy_domain_list = trim(readfile(HP_DIR + '/resources/proxy_list.txt')); if (proxy_domain_list) proxy_domain_list = split(proxy_domain_list, /[\r\n]/); + + sniff_override = uci.get(uciconfig, uciinfra, 'sniff_override') || '1'; } else { /* DNS settings */ dns_default_strategy = uci.get(uciconfig, ucidnssetting, 'default_strategy'); diff --git a/small/luci-app-nikki/Makefile b/small/luci-app-nikki/Makefile index 1ca25b78ec..abafb9d346 100644 --- a/small/luci-app-nikki/Makefile +++ b/small/luci-app-nikki/Makefile @@ -1,6 +1,6 @@ include $(TOPDIR)/rules.mk -PKG_VERSION:=1.21.0 +PKG_VERSION:=1.21.1 LUCI_TITLE:=LuCI Support for nikki LUCI_DEPENDS:=+luci-base +nikki diff --git a/small/luci-app-nikki/htdocs/luci-static/resources/tools/nikki.js b/small/luci-app-nikki/htdocs/luci-static/resources/tools/nikki.js index faaf71e54b..a8e3d2f4c5 100644 --- a/small/luci-app-nikki/htdocs/luci-static/resources/tools/nikki.js +++ b/small/luci-app-nikki/htdocs/luci-static/resources/tools/nikki.js @@ -105,8 +105,9 @@ return baseclass.extend({ }, api: async function (method, path, query, body) { - const apiListen = uci.get('nikki', 'mixin', 'api_listen'); - const apiSecret = uci.get('nikki', 'mixin', 'api_secret') ?? ''; + const profile = await callNikkiProfile(); + const apiListen = profile['external-controller']; + const apiSecret = profile['secret'] ?? ''; const apiPort = apiListen.substring(apiListen.lastIndexOf(':') + 1); const url = `http://${window.location.hostname}:${apiPort}${path}`; return request.request(url, { @@ -118,9 +119,10 @@ return baseclass.extend({ }, openDashboard: async function () { - const uiName = uci.get('nikki', 'mixin', 'ui_name'); - const apiListen = uci.get('nikki', 'mixin', 'api_listen'); - const apiSecret = uci.get('nikki', 'mixin', 'api_secret') ?? ''; + const profile = await callNikkiProfile(); + const uiName = profile['external-ui-name']; + const apiListen = profile['external-controller']; + const apiSecret = profile['secret'] ?? ''; const apiPort = apiListen.substring(apiListen.lastIndexOf(':') + 1); const params = { host: window.location.hostname, diff --git a/small/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js b/small/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js index 5e9e6c860f..f3215d37eb 100644 --- a/small/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js +++ b/small/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js @@ -125,7 +125,7 @@ return view.extend({ o = s.taboption('external_control', form.Value, 'api_secret', _('API Secret')); o.password = true; - o.rmempty = false; + o.placeholder = _('Unmodified'); o = s.taboption('external_control', form.ListValue, 'selection_cache', _('Save Proxy Selection')); o.optional = true; diff --git a/small/luci-app-passwall/luasrc/controller/passwall.lua b/small/luci-app-passwall/luasrc/controller/passwall.lua index f6355d818e..e4c4318a6e 100644 --- a/small/luci-app-passwall/luasrc/controller/passwall.lua +++ b/small/luci-app-passwall/luasrc/controller/passwall.lua @@ -192,7 +192,7 @@ function get_redir_log() proto = "TCP" end if fs.access(path .. "/" .. proto .. ".log") then - local content = luci.sys.exec("cat ".. path .. "/" .. proto .. ".log") + local content = luci.sys.exec("tail -n 19999 ".. path .. "/" .. proto .. ".log") content = content:gsub("\n", "
") luci.http.write(content) else @@ -216,7 +216,7 @@ function get_chinadns_log() local flag = luci.http.formvalue("flag") local path = "/tmp/etc/passwall/acl/" .. flag .. "/chinadns_ng.log" if fs.access(path) then - local content = luci.sys.exec("cat ".. path) + local content = luci.sys.exec("tail -n 5000 ".. path) content = content:gsub("\n", "
") luci.http.write(content) else diff --git a/small/luci-app-passwall/luasrc/model/cbi/passwall/client/type/sing-box.lua b/small/luci-app-passwall/luasrc/model/cbi/passwall/client/type/sing-box.lua index eb90c5da91..189be90f1e 100644 --- a/small/luci-app-passwall/luasrc/model/cbi/passwall/client/type/sing-box.lua +++ b/small/luci-app-passwall/luasrc/model/cbi/passwall/client/type/sing-box.lua @@ -401,6 +401,10 @@ if singbox_tags:find("with_quic") then end if singbox_tags:find("with_quic") then + o = s:option(Value, _n("hysteria2_ports"), translate("Port hopping range")) + o.description = translate("Format as 1000:2000 Multiple groups are separated by commas (,).") + o:depends({ [_n("protocol")] = "hysteria2" }) + o = s:option(Value, _n("hysteria2_up_mbps"), translate("Max upload Mbps")) o:depends({ [_n("protocol")] = "hysteria2" }) diff --git a/small/luci-app-passwall/luasrc/passwall/util_sing-box.lua b/small/luci-app-passwall/luasrc/passwall/util_sing-box.lua index c4a26a7617..37f1fd4758 100644 --- a/small/luci-app-passwall/luasrc/passwall/util_sing-box.lua +++ b/small/luci-app-passwall/luasrc/passwall/util_sing-box.lua @@ -383,7 +383,17 @@ function gen_outbound(flag, node, tag, proxy_table) end if node.protocol == "hysteria2" then + local server_ports = {} + if node.hysteria2_ports then + for range in node.hysteria2_ports:gmatch("([^,]+)") do + if range:match("^%d+:%d+$") then + table.insert(server_ports, range) + end + end + end protocol_table = { + server_ports = next(server_ports) and server_ports or nil, + hop_interval = next(server_ports) and "30s" or nil, up_mbps = (node.hysteria2_up_mbps and tonumber(node.hysteria2_up_mbps)) and tonumber(node.hysteria2_up_mbps) or nil, down_mbps = (node.hysteria2_down_mbps and tonumber(node.hysteria2_down_mbps)) and tonumber(node.hysteria2_down_mbps) or nil, obfs = { diff --git a/small/luci-app-passwall/po/zh-cn/passwall.po b/small/luci-app-passwall/po/zh-cn/passwall.po index 929cd133b8..2925a998b6 100644 --- a/small/luci-app-passwall/po/zh-cn/passwall.po +++ b/small/luci-app-passwall/po/zh-cn/passwall.po @@ -1821,3 +1821,9 @@ msgstr "中断现有连接" msgid "Interrupt existing connections when the selected outbound has changed." msgstr "当选择的出站发生变化时中断现有连接。" + +msgid "Port hopping range" +msgstr "端口跳跃范围" + +msgid "Format as 1000:2000 Multiple groups are separated by commas (,)." +msgstr "格式为:1000:2000 多组时用逗号(,)隔开。" diff --git a/small/nikki/Makefile b/small/nikki/Makefile index e27916fed4..64ad9219f8 100644 --- a/small/nikki/Makefile +++ b/small/nikki/Makefile @@ -5,9 +5,9 @@ PKG_RELEASE:=1 PKG_SOURCE_PROTO:=git PKG_SOURCE_URL:=https://github.com/MetaCubeX/mihomo.git -PKG_SOURCE_DATE:=2025-03-14 -PKG_SOURCE_VERSION:=1e22f4daa964c54abea4c8b0f09f8171398a2821 -PKG_MIRROR_HASH:=0b65cd12cb6927b118d3802303b97dbc3299db1b3e6d8a849dedb32a276c30ff +PKG_SOURCE_DATE:=2025-03-17 +PKG_SOURCE_VERSION:=e3d4ec247670dc88f8a3410e9bca2c69ca053f32 +PKG_MIRROR_HASH:=ab8e39fec0675a77d575acf5ed705bb327a5f9f2b8d72792896e884e491b25e6 PKG_LICENSE:=GPL3.0+ PKG_MAINTAINER:=Joseph Mory @@ -16,7 +16,7 @@ PKG_BUILD_DEPENDS:=golang/host PKG_BUILD_PARALLEL:=1 PKG_BUILD_FLAGS:=no-mips16 -PKG_BUILD_VERSION:=alpha-1e22f4d +PKG_BUILD_VERSION:=alpha-e3d4ec2 PKG_BUILD_TIME:=$(shell date -u -Iseconds) GO_PKG:=github.com/metacubex/mihomo diff --git a/small/nikki/files/nikki.conf b/small/nikki/files/nikki.conf index 3e378d2c07..f323e6bd0c 100644 --- a/small/nikki/files/nikki.conf +++ b/small/nikki/files/nikki.conf @@ -41,10 +41,8 @@ config proxy 'proxy' list 'bypass_cgroup' 'aria2' list 'bypass_cgroup' 'dnsmasq' list 'bypass_cgroup' 'netbird' - list 'bypass_cgroup' 'nginx' list 'bypass_cgroup' 'qbittorrent' list 'bypass_cgroup' 'tailscale' - list 'bypass_cgroup' 'uhttpd' list 'bypass_cgroup' 'zerotier' list 'bypass_dscp' '4' option 'bypass_china_mainland_ip' '0' diff --git a/small/nikki/files/uci-defaults/migrate.sh b/small/nikki/files/uci-defaults/migrate.sh index e4a2a365a3..42635387b2 100644 --- a/small/nikki/files/uci-defaults/migrate.sh +++ b/small/nikki/files/uci-defaults/migrate.sh @@ -70,10 +70,8 @@ proxy_bypass_cgroup=$(uci -q get nikki.proxy.bypass_cgroup); [ -z "$proxy_bypass uci add_list nikki.proxy.bypass_cgroup=aria2 uci add_list nikki.proxy.bypass_cgroup=dnsmasq uci add_list nikki.proxy.bypass_cgroup=netbird - uci add_list nikki.proxy.bypass_cgroup=nginx uci add_list nikki.proxy.bypass_cgroup=qbittorrent uci add_list nikki.proxy.bypass_cgroup=tailscale - uci add_list nikki.proxy.bypass_cgroup=uhttpd uci add_list nikki.proxy.bypass_cgroup=zerotier } diff --git a/small/v2ray-geodata/Makefile b/small/v2ray-geodata/Makefile index 9da1d2727e..6a04582a0c 100644 --- a/small/v2ray-geodata/Makefile +++ b/small/v2ray-geodata/Makefile @@ -21,22 +21,22 @@ define Download/geoip HASH:=83337c712b04d8c16351cf5a5394eae5cb9cfa257fb4773485945dce65dcea76 endef -GEOSITE_VER:=20250312064659 +GEOSITE_VER:=20250317014824 GEOSITE_FILE:=dlc.dat.$(GEOSITE_VER) define Download/geosite URL:=https://github.com/v2fly/domain-list-community/releases/download/$(GEOSITE_VER)/ URL_FILE:=dlc.dat FILE:=$(GEOSITE_FILE) - HASH:=eb752838bf61a39f1e1d3962d0aeecae103e96f925755ee18f206490744c91a8 + HASH:=aeeb32dedabbd0a42c3beb14a65ce34d6c30087b401ce83fd39337320307b9f8 endef -GEOSITE_IRAN_VER:=202503100030 +GEOSITE_IRAN_VER:=202503170037 GEOSITE_IRAN_FILE:=iran.dat.$(GEOSITE_IRAN_VER) define Download/geosite-ir URL:=https://github.com/bootmortis/iran-hosted-domains/releases/download/$(GEOSITE_IRAN_VER)/ URL_FILE:=iran.dat FILE:=$(GEOSITE_IRAN_FILE) - HASH:=548afd9a291bca6c89c344dc2b06c3103ca6f5e10b11dbd9fa8e844a545489d6 + HASH:=588cd831ccbb3e8c1a1523cfd893af6e632ee19062046985a1641dacb41eba8b endef define Package/v2ray-geodata/template diff --git a/v2rayn/v2rayN/Directory.Build.props b/v2rayn/v2rayN/Directory.Build.props index 3bf10e0908..4a6893106d 100644 --- a/v2rayn/v2rayN/Directory.Build.props +++ b/v2rayn/v2rayN/Directory.Build.props @@ -1,7 +1,7 @@ - 7.10.4 + 7.10.5 diff --git a/v2rayn/v2rayN/ServiceLib/Common/Utils.cs b/v2rayn/v2rayN/ServiceLib/Common/Utils.cs index dcfc04e42c..8b75e2cdf2 100644 --- a/v2rayn/v2rayN/ServiceLib/Common/Utils.cs +++ b/v2rayn/v2rayN/ServiceLib/Common/Utils.cs @@ -225,15 +225,54 @@ namespace ServiceLib.Common public static string GetMd5(string str) { - var byteOld = Encoding.UTF8.GetBytes(str); - var byteNew = MD5.HashData(byteOld); - StringBuilder sb = new(32); - foreach (var b in byteNew) + if (string.IsNullOrEmpty(str)) { - sb.Append(b.ToString("x2")); + return string.Empty; } - return sb.ToString(); + try + { + var byteOld = Encoding.UTF8.GetBytes(str); + var byteNew = MD5.HashData(byteOld); + StringBuilder sb = new(32); + foreach (var b in byteNew) + { + sb.Append(b.ToString("x2")); + } + + return sb.ToString(); + } + catch (Exception ex) + { + Logging.SaveLog(_tag, ex); + return string.Empty; + } + } + + public static string GetFileHash(string filePath) + { + if (string.IsNullOrEmpty(filePath)) + { + return string.Empty; + } + + if (!File.Exists(filePath)) + { + return string.Empty; + } + + try + { + using var md5 = MD5.Create(); + using var stream = File.OpenRead(filePath); + var hash = md5.ComputeHash(stream); + return BitConverter.ToString(hash).Replace("-", "").ToLowerInvariant(); + } + catch (Exception ex) + { + Logging.SaveLog(_tag, ex); + return string.Empty; + } } /// diff --git a/v2rayn/v2rayN/ServiceLib/Handler/PacHandler.cs b/v2rayn/v2rayN/ServiceLib/Handler/PacHandler.cs index f70173c5eb..5a9e31aa51 100644 --- a/v2rayn/v2rayN/ServiceLib/Handler/PacHandler.cs +++ b/v2rayn/v2rayN/ServiceLib/Handler/PacHandler.cs @@ -33,6 +33,13 @@ namespace ServiceLib.Handler private static async Task InitText() { var path = Path.Combine(_configPath, "pac.txt"); + + // Delete the old pac file + if (File.Exists(path) && Utils.GetFileHash(path).Equals("b590c07280f058ef05d5394aa2f927fe")) + { + File.Delete(path); + } + if (!File.Exists(path)) { var pac = EmbedUtils.GetEmbedText(Global.PacFileName); diff --git a/v2rayn/v2rayN/ServiceLib/Sample/pac b/v2rayn/v2rayN/ServiceLib/Sample/pac index 844d96176b..1378c49f13 100644 --- a/v2rayn/v2rayN/ServiceLib/Sample/pac +++ b/v2rayn/v2rayN/ServiceLib/Sample/pac @@ -4,1834 +4,374 @@ var rules = [ [], [ "000webhost.com", - "01.org", - "02weqj32.com", "030buy.com", - "04.si", - "04647.club", - "0cgdklr5sfwj.com", - "0emm.com", - "0plkijj.vip", "0rz.tw", - "0x0.st", - "0xxx.ws", "1-apple.com.tw", "10.tt", "1000giri.net", - "100beatscheap.com", - "100bucksbabes.com", - "100classicbooks.com", "100ke.org", - "1010.com.hk", - "101boyvideos.com", - "101tubeporn.com", - "101xxx.xyz", "10beasts.net", - "10bet.com", - "10c10qoo.one", "10conditionsoflove.com", "10musume.com", - "10xfotolia.com", - "110xnxx.com", - "1111mod-tube.buzz", - "1111mode.xyz", - "1111modpo.info", - "112263.com", - "114av.xyz", - "119474.xyz", - "11jav.com", - "123-hp.com", - "123bin.cc", - "123dapp.com", - "123dappipad.com", - "123dartisan.com", - "123dcatch.com", - "123dcircuits.com", - "123dcreature.com", - "123dcreaturenews.com", - "123ddesign.com", - "123ddoodler.com", - "123dmake.com", - "123dnews.com", - "123dpro.com", - "123dpro.net", - "123dsculpt.com", - "123hplaserjet.com", "123rf.com", - "123sex.top", - "123videos.tv", - "126728.net", - "128100.xyz", "12bet.com", - "12diasdepresentesdeitunes.com", - "12diasderegalosdeitunes.cl", - "12diasderegalosdeitunes.co", - "12diasderegalosdeitunes.co.cr", - "12diasderegalosdeitunes.co.ni", - "12diasderegalosdeitunes.co.ve", - "12diasderegalosdeitunes.com", - "12diasderegalosdeitunes.com.co", - "12diasderegalosdeitunes.com.hn", - "12diasderegalosdeitunes.com.ni", - "12diasderegalosdeitunes.com.ve", - "12diasderegalosdeitunes.cr", - "12diasderegalosdeitunes.gt", - "12diasderegalosdeitunes.hn", - "12diasderegalosdeitunes.pe", - "12joursdecadeauxdeitunes.com", "12vpn.com", "12vpn.net", - "1337x.gd", - "1337x.is", - "1337x.st", "1337x.to", - "1337x.tw", - "1337xto.to", - "1337xx.to", "138.com", - "13mei13.top", - "140033.xyz", "141-hk.com", "141hongkong.com", - "141jav.com", "141jj.com", "141tube.com", - "159i.com", - "161sex.com", "1688.com.au", - "16885858.com", - "168sex.top", - "16fhgdty.xyz", - "16honeys.com", "17.live", - "170.icu", - "1717se.cc", - "171xx.com", "173ng.com", "177pic.info", - "177picyy.com", - "179na.com", - "17lu.xyz", - "17mimei.club", - "17mimei.com", - "17supxxx.com", "17t17p.com", - "18-teen-porn.com", - "18-teen-xxx.com", - "188channel.com", - "18acg.us", - "18av.pro", - "18avx.com", "18board.com", "18board.info", - "18comic-god.cc", - "18comic-god.club", - "18comic-god.xyz", - "18comic.cc", - "18comic.company", "18comic.org", "18comic.vip", - "18commic.com", - "18doujin.com", - "18doujinshi.xyz", - "18eighteen.com", - "18exgfs.com", - "18fby.com", - "18h.tv", "18hmanga.click", - "18hmanga.com", - "18insta.com", - "18j.tv", - "18jms.com", - "18novel.xyz", + "18jav.tv", "18onlygirls.com", "18p2p.com", - "18porncomic.com", - "18porno.tv", - "18push.com", - "18qt.com", - "18sex.org", - "18tube.xxx", "18virginsex.com", - "18ww.life", - "18yiren.tv", - "191porn.com", "1949er.org", "1984.city", "1984bbs.com", "1984bbs.org", "1991way.com", - "1992qq.xyz", - "1994group.ac.uk", "1998cdp.org", "1bao.org", - "1bigclub.com", - "1bokeponline.top", - "1classtube.com", - "1degree.com.au", - "1drv.com", - "1drv.ms", "1dumb.com", "1e100.net", "1eew.com", - "1inch.io", - "1jjdg2.vip", - "1lib.cloud", - "1lib.cz", "1lib.domains", - "1lib.education", - "1lib.eu", - "1lib.limited", - "1lib.pl", - "1lib.to", - "1lib.tw", "1mobile.com", "1mobile.tw", - "1monsterbeatsbydreus.com", + "1point3acres.com", "1pondo.tv", - "1pornlist.com", - "1thek.com", - "1to1computing.com.au", - "1to1conference.com.au", - "1ucrs.com", - "1watchmygf.com", - "1xbet.cm", - "1xbet.co.ke", "2-hand.info", "2000fun.com", "2008xianzhang.info", - "2013beatsbydrdreonline.com", - "2013beatsbydrdreshop.com", - "2013beatsbydreshop.com", - "2013beatshdcybermonday.com", - "2013cheapestbeats.com", - "2013newbeatsworld.com", - "2013pascherbeatsbydre.com", - "2014cheapbeatsbydre.com", "2017.hk", - "2019baidu.xyz", "2021hkcharter.com", "2047.name", "2047.one", "2049bbs.xyz", - "20thcenturystudios.com.au", - "20thcenturystudios.com.br", - "20thcenturystudios.jp", - "20yearsoffea.com", "21andy.com", - "21centuryaccess.com", - "21heise360dh.cc", - "21hub.com", "21join.com", - "21naturals.com", "21pron.com", "21sextury.com", - "21vv.cc", "228.net.tw", "233abc.com", "233v2.com", - "2371tom.com", - "24hjav.com", "24hrs.ca", - "24porn.com", - "24porn.pro", "24smile.org", "25u.com", - "265sdwe3.com", - "2789av.com", - "27mmwmmw.top", - "2adultflashgames.com", - "2beatsdre.com", - "2beeg.me", - "2bit8.com", - "2buybeatsbydre.com", - "2ch.hk", - "2ch.net", - "2chav.com", - "2dgen.com", - "2drdrebeats.com", "2du5.com", - "2gayboys.com", - "2k.com", - "2kcoretech.online", - "2kgames.com", - "2lib.org", "2lipstube.com", - "2mdn-cn.net", - "2mdn.net", - "2o7.net", "2shared.com", "2waky.com", "3-a.net", "30boxes.com", - "30plusgirls.com", "315lz.com", - "32bm.cc", "32red.com", - "35s4.com", - "360autodesk.com", - "360nexus.com", - "360nexus.net", - "360plm.com", - "360trailers.com", - "365buymy.com", - "36717.info", "36rain.com", - "3789av.com", - "39group.info", "3a5a.com", - "3aaa.ac.uk", - "3animalsextube.com", - "3arabporn.com", "3arabtv.com", "3boys2girls.com", - "3d-comics.com", - "3d-december.com", - "3d-fossils.ac.uk", "3d-game.com", - "3d-toon.com", - "3d-xxx.com", - "3dadultgames.net", - "3danimeworld.com", - "3ddecember.com", - "3december.com", - "3decemberonline.com", - "3devilattack.net", - "3dfuckhouse.com", - "3dhentai.tv", - "3dhentaix.com", - "3drules.com", - "3dsexgames.biz", - "3dsexmovies.biz", - "3dsexplay.xyz", - "3dsexvilla.com", - "3dsexy.net", - "3dstudio.com", - "3dtin.com", - "3dtin.net", - "3go.fun", - "3hentai.net", - "3lib.net", - "3movs.com", - "3movs.xyz", - "3naked.com", - "3pornhere.com", - "3pornstarmovies.com", "3proxy.ru", "3ren.ca", - "3sixty-ucc.ac.uk", "3tui.net", - "3xplanet.com", - "3xplanet.net", - "3xplanetimg.com", - "3xxx.pro", "404museum.com", - "40momporntube.com", - "40shopping.com", - "40somethingmag.com", - "41maonn.com", "43110.cf", - "444.coffee", - "445gei.com", - "445jun.com", - "445nan.com", - "44yu.cc", - "4550.fun", - "45porn.com", "466453.com", - "47gyosei.jp", - "47news.jp", - "4beatsbydre.com", "4bluestones.biz", - "4cdn.org", "4chan.com", - "4chan.org", - "4channel.org", - "4club.com", "4dq.com", - "4ebaytraders.com", - "4ertik.live", - "4ertik.one", - "4everland.io", "4everproxy.com", - "4gls.ac.uk", - "4greedy.com", "4gtv.tv", - "4hu.one", - "4hu.tv", "4irc.com", - "4kporn.xxx", - "4ksex.me", - "4kup.net", "4mydomain.com", - "4myminicard.com", - "4pcdn.org", - "4pig.com", - "4plebs.org", - "4porn.com", - "4porn4.com", "4pu.com", "4rbtv.com", "4shared.com", "4sqi.net", - "4tube.com", - "4tubefree.net", - "4u4c.com", - "5-d.com", - "500caocao.com", - "50dh.app", - "50plusmilfs.com", + "500px.com", + "500px.org", "50webs.com", "51.ca", - "51cg1.com", - "51dh.site", "51jav.org", "51luoben.com", - "51luoli.info", - "51mh.app", - "51pincha.cc", - "51tuqiang.com", - "520aa.tv", - "520avtv.com", - "5238.me", "5278.cc", "5299.tv", - "52av.be", - "52av.com", - "52av.one", - "52fuliji.cc", - "52hyse.com", - "52kmz.com", - "531tr.com", - "53world.com", - "53worldsweeps.com", - "54647.global", - "54647.io", - "54647.online", - "54647.org", "55comic.com", - "55dndn.com", - "567321.online", - "568xe.com", - "58avgo.com", - "592r.com", - "59mvmv.com", "5aimiku.com", - "5axis-machining.com", - "5beatsbydre.com", - "5ch.net", - "5fang.cc", "5i01.com", "5isotoi5.org", - "5lml.com", "5maodang.com", - "5mb48g.com", - "5mo.fun", - "5q5zu9f1.me", - "5w.ag", - "5xsq.com", - "6-ar.com", - "60plusmilfs.com", - "61jxbs42.xyz", - "62fh1bnj.me", - "634.tv", + "611.icu", + "611study.com", + "611study.icu", "63i.com", "64museum.org", "64tianwang.com", "64wiki.com", "66.ca", "666kb.com", - "66lu.link", - "66wwmm.com", - "66xing.cc", - "67maoab.com", - "69-sexgames.com", - "69av.one", - "69bag.xyz", - "69dys.pw", - "69femdom.com", - "69flv.com", - "69games.xxx", - "69gayporno.com", - "69hongdq6.buzz", - "69hongdq7.buzz", - "69loli.com", - "69luolie.com", - "69re.net", + "666pool.cn", "69shu.com", - "69story.com", - "69tubesex.com", - "69vj.com", - "69xporn.com", - "69xx.one", - "69xx560.xyz", - "6arabs.com", + "69shuba.cx", "6do.news", "6do.world", - "6e8xr2gk.me", - "6japaneseporn.com", - "6kea.com", - "6mature9.com", - "6neek.com", "6park.com", "6parkbbs.com", "6parker.com", "6parknews.com", - "6sextube.com", - "6twseb.com", - "6xxxvideos.com", - "720video.tv", - "721av.com", - "748av.com", - "75m.co", - "7719.me", - "777tv.net", - "777xporn.com", - "77maott.com", "7capture.com", "7cow.com", - "7jp.info", - "7mm.tv", - "7mmtv.sx", "7mmtv.tv", - "7tb.cc", "8-d.com", - "8008206616.com", - "8111y.top", - "81jia.tv", - "81tower.com", - "82mvmv.com", "85cc.net", "85cc.us", "85st.com", - "85tube.com", - "8664av.com", "881903.com", "888.com", "888poker.com", - "88av.one", - "88gals.com", - "88kkn.com", - "88manhua.top", - "88square.com", "89-64.org", - "89.com", "8964museum.com", - "8kcosplay.com", - "8kpornvids.com", - "8muses.com", - "8muses.io", - "8muses.xxx", "8news.com.tw", - "8sp.biz", - "8teenxxx.com", - "8thstreetlatinas.com", "8world.com", - "8xxx.net", "8z1.net", "9001700.com", "908taiwan.org", - "90seconds.asia", - "91av.one", - "91avfuli.com", - "91beiyong.com", - "91cy.app", - "91dy.club", - "91fans.org", - "91gay.me", "91jinman.com", - "91md.me", - "91moxiong.com", - "91oo.xyz", "91porn.com", - "91pornplus.com", "91porny.com", - "91porny.store", - "91qk41rf.com", - "91quanji.com", - "91rb.com", - "91rb.net", - "91rb99.com", - "91se.fun", - "91sesex.xyz", - "91sew.xyz", - "91sew40.buzz", - "91vhome.com", "91vps.club", - "920share.com", - "921bb.com", - "922tp.com", - "928.plus", "92ccav.com", - "92hm.life", - "92hm.top", - "941tube.com", - "9527.rocks", - "9550.fun", - "978.life", - "97dounai.top", "991.com", "99btgc01.com", "99cn.info", - "99quse.cc", - "99re.com", - "99thz.cc", - "99thz.com", - "9anime.cz", - "9anime.id", - "9anime.to", - "9anime.ws", "9bis.com", "9bis.net", "9cache.com", - "9cao9.com", - "9cdn.net", "9gag.com", - "9hentai.ru", - "9hentai.to", - "9hentaiz.com", - "9ineverse.com", - "9k6v4y.cyou", - "9nation.com.au", "9news.com.au", - "9now.com.au", - "9tak-nav.buzz", - "9to5google.com", - "9to5mac.com", - "9to5terminal.com", - "9to5toys.com", - "9xav.cc", - "9xlove.xyz", - "9zipai.net", - "a-hentai.tv", - "a-msedge.net", "a-normal-day.com", - "a-tap.ac.uk", - "a-teenz.com", - "a0pple.net", - "a1av.xyz", - "a2z.com", "a5.com.ru", "a5vpn.com", - "a7sex.com", - "aa77kk.com", - "aaacymru.ac.uk", - "aaagradeheadphones.com", - "aaapp.cyou", - "aabb1802.com", - "aabb1803.com", - "aacrjournals.org", - "aadmv.com", - "aaex.uk", - "aalah.me", "aamacau.com", - "aanaan.com", - "aapl.tw", - "aaplimg.com", - "aaschool.ac.uk", - "aau.ac.uk", - "aave.com", - "aavs.xyz", - "abank.com.mm", - "abbeygatesfc.ac.uk", - "abbeygatesixthformcollege.ac.uk", - "abbywintersfree.com", - "abc-studios.com", "abc.com", "abc.net.au", "abc.xyz", - "abcheadphones.com", "abchinese.com", - "abclider.com", "abclite.net", - "abcol.ac.uk", - "abcolstudents.ac.uk", - "abdn-access-biomedical.ac.uk", - "abdn-online.ac.uk", - "abdn.ac.uk", - "abeatsbydrdre.com", + "abebooks.co.uk", "abebooks.com", - "abellalist.com", - "abema-tv.com", - "abema.io", - "abema.tv", - "abematv.co.jp", - "aber.ac.uk", - "aberbangorpartnership.ac.uk", - "aberbangorstrategicalliance.ac.uk", - "aberdare.ac.uk", - "aberdeen-isc.ac.uk", - "aberdeen.ac.uk", - "aberdeenenergy.ac.uk", - "aberdeenrescon.ac.uk", - "abertawe.ac.uk", - "abertay.ac.uk", - "abertaydundee.ac.uk", - "aberystwyth.ac.uk", - "abgsp1.buzz", - "abhsc.ac.uk", - "abicollege.ac.uk", - "abigass.com", - "abingdon-witney.ac.uk", - "abira.ac.uk", - "ablmm.com", "ablwang.com", "aboluowang.com", "about.google", "about.me", - "aboutamazon.co.uk", - "aboutamazon.com", - "aboutamazon.com.au", - "aboutamazon.de", - "aboutamazon.es", - "aboutamazon.eu", - "aboutamazon.fr", - "aboutamazon.in", - "aboutamazon.it", - "aboutamazon.jp", - "aboutamazon.pl", - "aboutfacebook.com", "aboutgfw.com", - "aboutmcdonalds.com", - "aboutporno.net", - "aboutyourmini.com", - "abow.jp", - "abrsm.ac.uk", - "abs.ac.uk", "abs.edu", - "absoluporn.com", - "absolutewhores.com", - "ac-pocketcamp.com", - "ac.ir", "ac.jp", - "acacia.ac.uk", - "academic-clinician.ac.uk", - "academicpaediatricsassociation.ac.uk", - "academicpeerlearning.ac.uk", - "academyforhealthcarescience.ac.uk", - "academynetriders.com", - "academyofmusic.ac.uk", - "acaric.co.jp", - "acasadasbrasileirinhas.com.br", "acast.com", - "accbusiness.com", - "acceleratedcomputing.ac.uk", - "acces-vod.com", - "access-summit.ac.uk", - "accesscollege.ac.uk", - "accesscreative.ac.uk", - "accessfacebookfromschool.com", - "accesshe.ac.uk", - "accessheonline.ac.uk", - "accesstohe.ac.uk", - "accesstohighereducation.ac.uk", - "accesstomusic.ac.uk", "accim.org", - "account-paypal.info", - "account-paypal.net", - "account-paypal.org", - "accountancylearning.ac.uk", "accountkit.com", - "accountpaypal.com", - "accountpaypal.net", - "accountpaypal.org", - "accross.ac.uk", - "accs.ac.uk", - "accuweather.com", - "accv.es", - "acdocs.com", - "ace-lp.ac.uk", - "acebooik.com", - "acebook.com", - "aced.ac.uk", - "acer-group.com", - "acer.ac.uk", - "acer.com", "aceros-de-hispania.com", - "aces.ac.uk", - "acets.ac.uk", "acevpn.com", + "acg.rip", "acg18.me", "acgbox.link", "acgbox.org", - "acgcf.com", - "acgdg.com", - "acgdv.com", - "acgfabu.com", - "acgfbw.com", "acgkj.com", - "acgnmanhua.com", "acgnx.se", - "acgvipss.com", - "acgwr.com", - "acgww.cyou", - "achat-followers-instagram.com", - "acheter-followers-instagram.com", - "acheterdesfollowersinstagram.com", - "acheterfollowersinstagram.com", - "achievementanalytics.com", - "acjj.net", - "aclweb.org", - "acm.ac.uk", - "acm.org", "acmedia365.com", - "acmedsci.ac.uk", "acmetoy.com", - "acmvalidations.com", - "acmvalidationsaws.com", "acnw.com.au", - "acoustics.ac.uk", - "acp.ac.uk", - "acpica.com", - "acpme.ac.uk", - "acrobat.com", - "acs.org", - "acsis.ac.uk", - "actalis.com", - "actalis.it", "actfortibet.org", "actimes.com.au", - "activatelearning.ac.uk", - "activelearnprimary.co.uk", - "activelearnprimary.com.au", - "activeteachonline.com", "activpn.com", - "actofunion.ac.uk", - "actris.ac.uk", - "actual.ac.uk", - "acu.ac.uk", "aculo.us", - "ad69.com", - "ada.ac.uk", - "ada.support", - "adacollege.ac.uk", - "adalovelacecentre.ac.uk", - "adams-institute.ac.uk", - "adamsmith.ac.uk", - "adamsmithcollege.ac.uk", - "adanaatikhaber.com", - "adapt.ac.uk", - "adaptivecards.io", - "adas.ac.uk", - "adbecrsl.com", - "adbkm.com", - "adblockplus.org", "adcex.com", - "adcommerce.tv", "addictedtocoffee.de", - "addison-wesley.ch", - "addison.ac.uk", - "addthis.com", - "addthiscdn.com", - "addthisedge.com", - "addtoany.com", "addyoutube.com", "adelaidebbs.com", - "adelaidenow.com.au", - "adeptt.ac.uk", - "adgoogle.net", - "adguard-dns.com", - "adguard-dns.io", "adguard-vpn.com", - "adguard-vpn.online", - "adguard.app", - "adguard.com", - "adguard.info", - "adguard.io", - "adguard.org", - "adguardvpn.com", - "adhelpnews.com", - "adidas.at", - "adidas.be", - "adidas.ch", - "adidas.co.in", - "adidas.co.uk", - "adidas.com", - "adidas.com.sa", - "adidas.com.tw", - "adidas.cz", - "adidas.de", - "adidas.dk", - "adidas.hu", - "adidas.ie", - "adidas.it", - "adidas.nl", - "adidas.pl", - "adidas.ru", - "adidas.se", - "adinst.com", - "adlib.ac.uk", - "adls.ac.uk", - "admeld.com", - "admob-cn.com", "admob.com", - "adobe-aemassets-value.com", - "adobe-audience-finder.com", - "adobe-video-partner-finder.com", - "adobe.com", - "adobe.io", - "adobe.ly", - "adobeaemcloud.com", - "adobeaemcloud.net", - "adobeawards.com", - "adobecc.com", - "adobecce.com", - "adobeccstatic.com", - "adobecontent.io", - "adobecreativityawards.com", - "adobedc.net", - "adobedemo.com", - "adobedtm.com", - "adobeereg.com", - "adobeexchange.com", - "adobeexperienceawards.com", - "adobegov.com", - "adobehiddentreasures.com", - "adobejanus.com", - "adobeku.com", - "adobelanding.com", - "adobelogin.com", - "adobeoobe.com", - "adobeplatinumclub.com", - "adobepress.ch", - "adobeprojectm.com", - "adobesc.com", - "adobesign.com", - "adobesigncdn.com", - "adobespark.com", - "adobess.com", - "adobestock.com", - "adobetag.com", - "adobetarget.com", - "adobetcstrialdvd.com", - "adobetechcomm.com", - "adobetechcommcallback.com", - "adobetechcommdemo.com", - "adobexdplatform.com", - "adorevids.com", "adpl.org.hk", - "adporn.cc", - "adpornu.xyz", - "adrc-e.ac.uk", - "adrn.ac.uk", - "ads-pixiv.net", "ads-twitter.com", - "ads.ac.uk", "adsense.com", - "adsensecustomsearchads.com", - "adsenseformobileapps.com", - "adskcloud.com", - "adskcloud.net", - "adskeng.net", - "adskengineering.net", - "adskengpp.net", - "adskengpr.net", - "adtcc.com", - "adtidy.net", - "adtidy.org", - "adult-h.com", - "adult-home-videos.com", - "adult-list.com", "adult-sex-games.com", - "adult-web-site.net", - "adult3dcomics.com", - "adult3dfantasycomics.com", - "adult3dporno.com", - "adult3dtoons.com", - "adultartsites.com", - "adultbay.org", - "adultblogranking.com", - "adultblogtoplist.com", - "adultcamslover.com", - "adultclinic.jp", - "adultdeepfakes.com", - "adultdvdmarketplace.com", - "adultdvdtalk.com", - "adultempire.com", - "adultepic.com", - "adulterfree.com", - "adulters.org", - "adultexpo.com.tw", - "adultfilmdatabase.com", - "adultfreex.com", "adultfriendfinder.com", - "adultgamereviews.com", - "adultgames.games", - "adultgames.me", - "adultgames18.com", - "adultgamesapk.com", - "adultgamescollector.com", - "adultgameson.com", - "adultgamesportal.com", - "adultgamestop.com", - "adultgamingroom.com", - "adultgeek.net", - "adulti01.com", - "adultinfojpn.com", - "adultism.com", "adultkeep.net", - "adultlearningbcc.ac.uk", - "adultlister.com", - "adultmagazinespdf.com", - "adulto.vip", - "adultpornvideos.net", - "adultrental.com", - "adultsexgame.biz", - "adultsexgames.biz", - "adultsextoys.com", - "adulttime.com", - "adulttoontube.com", - "adultvideodump.com", - "adultvideotop.com", - "adultvirtualworlds.net", - "advance-he.ac.uk", - "advanced-he.ac.uk", - "advanced-radiotherapy.ac.uk", - "advancedhe.ac.uk", - "advancediddetection.com", - "advancedtherapeutics-cdt.ac.uk", - "advancehe.ac.uk", - "advancingaccess.ac.uk", "advanscene.com", - "advantagenottinghamshire.ac.uk", - "adventofcode.com", - "adventuresbydisney.com", "advertfan.com", "advertisercommunity.com", - "advertiserscommunity.com", - "adwords-community.com", - "adwords.com", - "adwordsexpress.com", - "adx.promo", "ae.org", - "aeasyshop.com", - "aebn.com", - "aecc-chiropractic.ac.uk", - "aecc.ac.uk", - "aecexcellence.com", "aei.org", - "aemap.ac.uk", - "aengd.ac.uk", "aenhancers.com", - "aerogard.com.au", - "aerogardcn.com", - "aerosol-cdt.ac.uk", - "aerospace-cadcam.com", - "aerospace-design.com", - "aerospace-training-wales.ac.uk", - "aes.ac.uk", - "aesworkshops.com", "aex.com", "af.mil", "afantibbs.com", - "afao.ac.uk", - "afappyending.com", - "afewmomentswith.com", - "affect3dstore.com", - "affirmtrust.com", - "afi.ac.uk", - "afkv28.com", - "aflamporn.com", - "aflamsex.net", - "aflamsexhd.com", - "afp.com", - "afpforum.com", "afr.com", "afreecatv.com", - "afriboyz.com", - "africadesk.ac.uk", - "africanplants.ac.uk", - "afsni.ac.uk", - "afterenglish.ac.uk", - "aga-expo.com", - "agag.tw", - "agdbank.com", - "age.tv", - "agedm.app", - "agedm.org", - "agedm.tv", - "agefans.com", "agemys.net", - "agemys.org", - "agendaweek.com", - "agenet.ac.uk", "agnesb.fr", - "agocg.ac.uk", "agoogleaday.com", - "agrd.io", - "agressofinanceroyalholloway.ac.uk", - "agrifoodatp.ac.uk", - "agrifor.ac.uk", - "agriforwards-cdt.ac.uk", "agro.hk", - "agroforestry.ac.uk", - "ags.ac.uk", - "agu.org", - "agzy1.com", - "ah-me.com", - "ahc.ac.uk", - "ahcathyxxx.com", - "ahcs.ac.uk", - "ahds.ac.uk", - "ahegao.online", - "ahentaitv.com", - "ahessc.ac.uk", - "ahgtm.ac.uk", - "ahlxs-me.buzz", - "ahlxsdh.sbs", - "ahmia.fi", - "ahorsecock.com", - "ahpd.ac.uk", - "ahpornogratuit.com", - "ahpornotube.com", - "ahrc.ac.uk", - "ahrcfoodnetwork.ac.uk", - "ahsexfilme.com", - "ahswingerporno.com", - "ahtops.com", - "ahtranny.com", - "ahua.ac.uk", - "ahvideosexe.com", - "ahxxx.club", "ai-kan.net", "ai-wen.net", - "ai.com", "ai.google", - "ai3sd.ac.uk", - "ai7995.site", - "ai91porn.cc", - "aiaa.org", - "aiasahi.jp", - "aib.ac.uk", - "aim25.ac.uk", - "aimei133.com", - "aimhighergreatermerseyside.ac.uk", - "aimhighernorthamptonshire.ac.uk", - "aimhighernw.ac.uk", - "aimhigherscotland.ac.uk", - "aimhighersurrey.ac.uk", - "aimhighersw.ac.uk", - "aimhigherwm-alps.ac.uk", - "aimhigherwm.ac.uk", - "aims.ac.uk", - "aimsciences.org", - "aipa553.com", + "aiosearch.com", "aiph.net", - "air-nike-shoes.com", - "air-watch.com", "airasia.com", - "airav.cc", - "airav.wiki", "airconsole.com", "aircrack-ng.org", - "aire-wharf-coll.ac.uk", - "airgonetworks.com", - "airgunstudio.com", - "airhorn.solutions", - "airhornbot.com", - "airiti.com", "airitilibrary.com", - "airmax360.com", - "airmay.com", - "airport-gov-cn.com", - "airport.brussels", - "airport.com", - "airport.eu", - "airsextube.com", - "airsupportapp.com", - "airtunes.com", - "airtunes.info", - "airtunes.net", "airvpn.org", - "airwatchexpress.com", - "airwatchqa.com", - "airwick.at", - "airwick.be", - "airwick.ca", - "airwick.ch", - "airwick.cl", - "airwick.co.in", - "airwick.co.nz", - "airwick.co.uk", - "airwick.co.za", - "airwick.com", - "airwick.com.au", - "airwick.com.br", - "airwick.com.mx", - "airwick.com.tr", - "airwick.cz", - "airwick.de", - "airwick.dk", - "airwick.es", - "airwick.fi", - "airwick.fr", - "airwick.hr", - "airwick.hu", - "airwick.ie", - "airwick.it", - "airwick.jp", - "airwick.net", - "airwick.nl", - "airwick.no", - "airwick.pl", - "airwick.pt", - "airwick.ro", - "airwick.ru", - "airwick.se", - "airwick.si", - "airwick.sk", - "airwick.tv", - "airwick.us", - "airwickarabia.com", - "aisejushi.com", "aisex.com", - "aishegw.com", "ait.org.tw", "aiv-cdn.net", "aiv-delivery.net", "aiweiwei.com", "aiweiweiblog.com", - "aiwucm-us.sbs", - "aixingge2.cc", - "aizyk.buzz", - "aizyk.xyz", - "ajplus.net", "ajsands.com", - "ajsjx.com", - "ajtalk.com", - "ak1.net", - "aka-ai.com", - "aka-ai.net", - "aka.ms", - "akacrypto.net", - "akadeem.net", "akademiye.org", - "akadns.com", - "akadns.net", - "akadns6.net", - "akaeai.com", - "akafms.net", - "akagtm.org", - "akahost.net", - "akaint.net", - "akam.net", - "akamaa.com", - "akamah.com", - "akamai-access.com", - "akamai-access.net", - "akamai-cdn.com", - "akamai-platform-internal.net", - "akamai-platform-staging.com", - "akamai-platform.net", - "akamai-regression.net", - "akamai-staging.net", - "akamai-sucks.net", - "akamai-thailand.com", - "akamai-thailand.net", - "akamai-trials.com", - "akamai.co.kr", "akamai.net", - "akamaiedge.net", - "akamaientrypoint.net", - "akamaietpcnctest.com", - "akamaietpcompromisedcnctest.com", - "akamaietpcompromisedmalwaretest.com", - "akamaietpmalwaretest.com", - "akamaietpphishingtest.com", - "akamaihd-staging.net", - "akamaihd.com", "akamaihd.net", - "akamaimagicmath.net", - "akamainewzealand.com", - "akamaiphillipines.com", - "akamaiphillipines.net", - "akamaisingapore.net", "akamaistream.net", - "akamaitech.com", - "akamaitech.net", - "akamaitechnologies.com", - "akamaitechnologies.net", - "akamaized-staging.net", "akamaized.net", - "akamaizercentral.com", - "akamak.com", - "akamam.com", - "akamci.com", - "akami.com", - "akami.net", - "akamii.com", - "akamqi.com", - "akasha.world", - "akastream.com", - "akastream.net", - "akatns.net", "akiba-online.com", "akiba-web.com", "akinator.com", "akow.org", - "akthelp.com", "al-islam.com", "al-qimmah.net", - "al.ru", "alabout.com", "alanhou.com", "alarab.qa", "alasbarricadas.org", - "albagals.com", - "albastudio.co", - "albeats.com", - "alc.ac.uk", - "alchemysynth.com", - "alcs.ac.uk", - "aldinhe.ac.uk", - "alexa.com", - "alexanderlondoncollege.ac.uk", - "alexanderstreet.com", "alexlur.org", - "alfera.com.hk", - "alfera.com.my", - "alfera.in", - "alfera.my", "alforattv.net", "alhayat.com", - "alhs.link", - "alhs.xyz", - "alias.com", - "aliasadvantage.com", - "aliasimaginationsengine.com", - "aliasple.com", - "aliasshowcase.com", - "aliassketchbook.com", - "aliassketchbookpro.com", - "aliassystems.com", - "aliasvisualizationstudio.com", - "aliaswavefront.com", - "alibabacloud.co.in", - "alibabacloud.com", - "alibabacloud.com.au", - "alibabacloud.com.hk", - "alibabacloud.com.my", - "alibabacloud.com.sg", - "alibabacloud.com.tw", "alicejapan.co.jp", - "alicloud.com", "aliengu.com", - "alis-wales.ac.uk", "alive.bar", - "aliveipc.com", - "aliveitsm.com", - "aliveprofiler.com", - "alivercm.com", - "aliverewind.com", - "alivertsm.com", - "alivevm.com", - "alivevmax.com", - "alivevue.com", - "aliyuncs.com", "aljazeera.com", "aljazeera.net", "alkasir.com", - "all-sex-links.com", - "all3dsexpics.com", "all4mom.org", "allcoin.com", "allconnected.co", - "allcu.ac.uk", - "alldrawingshere.com", "alldrawnsex.com", "allervpn.com", - "allfet.net", "allfinegirls.com", "allgirlmassage.com", "allgirlsallowed.org", "allgravure.com", - "allhen.online", - "allhorsesex.com", "alliance.org.hk", - "alliancemanchester.ac.uk", - "alliancemanchesterbusinessschool.ac.uk", - "alliancembs.ac.uk", - "alliancesages.com", "allinfa.com", - "allinternal.com", - "allizom.net", - "allizom.org", "alljackpotscasino.com", - "alljapanesepass.com", - "allmomsex.com", "allmovie.com", - "allnations.ac.uk", - "allover30.com", "allowed.org", - "allpasswords.com", - "allporncomic.com", - "allpornsites.net", - "allpornsitespass.com", - "allspyclips.com", - "allswingersclubs.org", - "allthefallen.moe", - "alma.ac.uk", "almasdarnews.com", - "almcollege.ac.uk", "almostmy.com", - "aloe.ac.uk", - "alohatube.com", - "alotporn.com", - "alphabet.asia", - "alphabet.at", - "alphabet.be", - "alphabet.biz", - "alphabet.ch", - "alphabet.co.hu", - "alphabet.co.uk", - "alphabet.co.za", - "alphabet.com", - "alphabet.com.es", - "alphabet.com.lv", - "alphabet.com.mx", - "alphabet.com.pl", - "alphabet.com.pt", - "alphabet.cz", - "alphabet.de", - "alphabet.es", - "alphabet.eu", - "alphabet.fr", - "alphabet.info", - "alphabet.jp", - "alphabet.lt", - "alphabet.lu", - "alphabet.lv", - "alphabet.mx", - "alphabet.no", - "alphabet.org.uk", - "alphabet.pl", - "alphabet.pt", - "alphabet.uk", - "alphabet.us", - "alphabetfinance.net", "alphaporno.com", - "alphera-finance.co.in", - "alphera-finance.com.hk", - "alphera-finance.in", - "alphera.ca", - "alphera.co.in", - "alphera.co.nz", - "alphera.com", - "alphera.com.es", - "alphera.com.hk", - "alphera.com.my", - "alphera.de", - "alphera.es", - "alphera.ie", - "alphera.in", - "alphera.my", - "alphera.net", - "alpherafinance.com.hk", - "alpherafinancialservices.es", - "alpherafinancialservices.in", - "alpherafs.ca", - "alpherafs.co.nz", - "alpherafs.com.hk", - "alpherafs.com.my", - "alpherafs.ie", - "alpherafs.in", - "alpherafs.my", - "alpinedc.ch", - "alpinelinux.org", - "alps-cetl.ac.uk", - "alps-wm.ac.uk", - "alsalam.ac.uk", - "alsod.ac.uk", - "alt.ac.uk", - "alt.com", - "altera.com", - "alteraforum.com", - "alteraforums.com", - "alteraforums.net", - "alterauserforum.com", - "alterauserforum.net", - "alterauserforums.com", - "alterauserforums.net", - "altereco.ac.uk", "alternate-tools.com", "alternativeto.net", - "altis.ac.uk", - "altmetric.com", - "alton.ac.uk", - "altoncollege.ac.uk", - "altporn.net", "altrec.com", "alvinalexander.com", - "always-we-need.games", "alwaysdata.com", "alwaysdata.net", "alwaysvpn.com", - "alwcymru.ac.uk", - "alzheimers.ac.uk", "am730.com.hk", - "amaaozn.com", - "amabitch.com", - "amakings.com", - "amamanualofstyle.com", - "amandalist.com", - "amanmi.com", - "amapornofilme.com", - "amateur-cougar.com", - "amateur-exhibitionist.org", - "amateur-fetish.com", - "amateur-gallery-post.com", - "amateur-home-sex.com", - "amateur-porn-clips.com", - "amateur-porn-tube.net", - "amateur-pussies.com", - "amateur-threesomes.com", - "amateuralbum.net", - "amateuranalporn.com", - "amateuranalvideos.com", - "amateurarchiver.com", - "amateurbdsmporn.com", - "amateurblondegirls.com", - "amateurblowjobporn.com", - "amateurcool.com", - "amateurcuckoldporn.com", - "amateure-xtreme.com", - "amateurest.com", - "amateurgalore.net", - "amateurgirlfriends.net", - "amateurhomevids.com", - "amateurhousewifefuck.com", - "amateurmommymovies.com", - "amateuroldsluts.com", - "amateurpages.com", - "amateurporn.photos", - "amateurpornhouse.com", - "amateurpornonly.com", - "amateurpornsexvideos.com", - "amateurs-fuck.com", - "amateurs-gone-wild.com", - "amateursecrets.net", - "amateursexpussy.com", - "amateursexstart.nl", - "amateurslovesporn.com", - "amateursvid.com", - "amateurswingersmovies.com", - "amateurthreesomeporn.com", - "amateurwifefuck.com", - "amateurwifetits.com", - "amateurwifevideos.com", - "amateurwivesvideos.com", - "amateurxx.org", - "amatorialesesso.com", - "amatporn.com", - "amatura.com", - "amazingcuckold.com", - "amazon-adsystem.com", - "amazon-fashions.com", - "amazon-jp-recruiting.com", - "amazon-lantern.com", - "amazon-launchpad.com", - "amazon.ae", - "amazon.ca", "amazon.co.jp", - "amazon.co.uk", "amazon.com", - "amazon.com.au", - "amazon.com.br", - "amazon.com.mx", - "amazon.com.tr", - "amazon.de", - "amazon.dev", - "amazon.es", - "amazon.fr", - "amazon.in", - "amazon.it", - "amazon.jobs", - "amazon.jp", - "amazon.nl", - "amazon.red", - "amazon.sg", - "amazonalexavoxcon.com", - "amazonauthorinsights.com", - "amazonaws-china.com", - "amazonaws.biz", - "amazonaws.co.uk", - "amazonaws.com", - "amazonaws.info", - "amazonaws.net", - "amazonaws.org", - "amazonaws.tv", - "amazonbusiness.org", - "amazonbusinessblog.com", - "amazondevicesupport.com", - "amazonfctours.com", - "amazonianblog.com", - "amazonimages.com", - "amazonlaunchpad.com", - "amazonliterarypartnership.com", - "amazonlumberyard.wang", - "amazonpay.com", - "amazonpay.in", - "amazonprimevideos.com", - "amazonsdi.com", - "amazonses.com", - "amazonstudiosguilds.com", - "amazontrust.com", - "amazonvideo.cc", "amazonvideo.com", - "amazonvideodirect.com", - "amazonworkdocs.com", - "ambs.ac.uk", - "amc.com", - "amcn.com", - "amcnetworks.com", - "amcplus.com", - "amd.com", - "amd.com.cn", - "amdfanstore.com", - "amdigital.co.uk", "ameba.jp", - "amebame.com", - "amebaownd.com", - "amebaowndme.com", "ameblo.jp", - "amerc.ac.uk", "america.gov", - "americabrox.ac.uk", "american.edu", "americangreencard.com", "americanunfinished.com", - "americasvoice.news", "americorps.gov", - "amerikaninsesi.com", - "amerikaninsesi.org", - "amerikaovozi.com", - "amerikayidzayn.com", - "amerikiskhma.com", - "amersham.ac.uk", - "amerwyc-coll.ac.uk", - "amf.ac.uk", - "amgueddfacymru.ac.uk", - "amh.ac.uk", - "ami.ac.uk", "amiblockedornot.com", "amigobbs.net", - "amiibo.com", "amitabhafoundation.us", - "amity.ac.uk", - "amlg.io", "amnesty.org", "amnesty.org.hk", "amnesty.tw", "amnestyusa.org", "amnyemachen.org", - "amodoll.com", - "amof.ac.uk", "amoiist.com", - "amourangels.com", - "amp.dev", - "amplifi.com", - "amplifyapp.com", - "amplifyframework.com", - "ampproject.com", - "ampproject.net", "ampproject.org", - "amrtraining.ac.uk", - "ams.org", - "ams02.space", - "amsterdamhotescort.com", - "amsterdamluxescort.com", "amtb-taipei.org", - "amytele.com", - "amzn.asia", - "amzn.com", - "amzn.to", - "amznl.com", - "anacams.com", - "anaconda.cloud", - "anaconda.com", - "anaconda.org", - "anaesthetistswales.ac.uk", - "anal-f.net", - "anal-pantyhose.com", - "anal.casa", - "anal.media", - "analamateursex.com", - "analcamshow.com", - "analdin.com", - "analfuckvideo.com", - "analhomeporn.com", - "anallivecams.com", - "analpornhouse.com", - "analpornonly.com", - "analpornosex.com", - "analqts.com", - "analsaga.com", - "analscreen.com", - "analtime.org", - "analvids.com", - "analytictech.com", - "anandtech.com", - "anatomy.tv", - "anb.org", - "ancensored.com", "anchor.fm", "anchorfree.com", - "ancientcyprus.ac.uk", - "ancientwisdoms.ac.uk", "ancsconf.org", "andfaraway.net", - "andover.ac.uk", - "andovercollege.ac.uk", "android-x86.org", "android.com", - "androidauthority.com", + "androidapksfree.com", "androidcombo.com", - "androidfilehost.com", "androidify.com", "androidplus.co", - "androidpolice.com", "androidtv.com", "andygod.com", - "andysparis.com", - "anfutong.com", - "angel-gto.com", - "angel.ac.uk", "angela-merkel.de", - "angelbeats.jp", "angelfire.com", - "angelweb.jp", - "angle.com.tw", - "anglia-polytechnic.ac.uk", - "anglia-ruskin.ac.uk", - "anglia.ac.uk", "angola.org", - "angulardart.org", "angularjs.org", - "angus.ac.uk", - "anguscollege.ac.uk", - "anibooru.com", - "anic.ac.uk", - "anidom.com", - "anigema.jp", - "anilos.com", - "animal-hentai.com", - "animal-porn.net", - "animalforsex.com", - "animalincum.com", - "animalporn.me", - "animalpornxxx.me", - "animalsporn.net", - "animalsporn.tv", - "animalzoosex.me", - "anime-pictures.net", - "anime-tube.pw", "animecrazy.net", - "animedao-tv.com", - "animegal.net", - "animehentaihub.com", - "animeidhentai.com", - "animepornhd.com", - "animesex.me", - "animesexhq.com", "animeshippuuden.com", - "animestigma.com", "animezilla.com", "aniscartujo.com", - "anistreaming.xyz", - "ankarazirvesi2018.com", - "anm.co.uk", - "annamilk.com", "annas-archive.org", + "annas-archive.se", "annatam.com", - "anniesland-fe.ac.uk", - "anniesland.ac.uk", - "annstores.net", - "annualpelvicexam.com", - "annualreviews.org", "anobii.com", - "anon-v.com", - "anon-v.lol", "anonfiles.com", "anontext.com", "anonymise.us", "anonymitynetwork.com", - "anonymize.com", "anonymizer.com", "anonymouse.org", "anpopo.com", "answering-islam.org", - "antarctic.ac.uk", - "antarctica.ac.uk", - "antarvasnaclips.com", - "antarvasnax.com", "antd.org", - "antenna.co.kr", - "antf.ac.uk", - "anthemgame.com", - "anthemthegame.com", "anthonycalzadilla.com", "anthropic.com", - "anthropology.ac.uk", "anti1984.com", "antichristendom.com", - "anticipate.ac.uk", - "antiquity.ac.uk", - "antislavery.ac.uk", - "antislaverylaw.ac.uk", "antisocial.science", "antiwave.net", - "anudetube.com", + "antpool.com", "anws.gov.tw", - "anxiangxing.com", - "anybunny.org", - "anybunny.tv", - "anydesk.com", - "anyhentai.com", "anyporn.com", - "anypornhd.com", - "anypornsexxx.com", "anysex.com", - "anyshemale.com", - "anyxxx.me", - "anyxxx.pro", "ao3.org", "aobo.com.au", - "aoc.ac.uk", - "aoc.cat", - "aocc.ac.uk", "aofriend.com", "aofriend.com.au", "aojiao.org", - "aokwholesale.net", "aol.ca", "aol.co.uk", "aol.com", "aolnews.com", - "aomedia.org", "aomiwang.com", - "aopcuk.ac.uk", - "aorus.com", - "aoxx69.net", "ap.org", - "ap0le.com", - "apa.org", - "apache.org", "apartmentratings.com", "apartments.com", "apat1989.org", "apetube.com", - "apexlegends.com", - "apexprint.com.hk", - "aphe.ac.uk", - "api-extractor.com", "api.ai", - "api.news", "apiary.io", - "apibay.org", "apigee.com", - "apina.biz", - "apis.ac.uk", - "apisof.net", "apk-dl.com", "apk.support", "apk.tw", @@ -1841,406 +381,19 @@ var rules = [ "apkplz.com", "apkpure.com", "apkpure.net", - "aple.com", - "aplestore.com", - "aplleipods.com", - "aplustraining.ac.uk", "aplusvpn.com", - "apnews.com", - "apole.com", - "apollo.ac.uk", - "apollocampus.ac.uk", - "apollocrewe.ac.uk", - "apornotube.net", - "aporntv.com", - "apornvideo.com", - "app-dynamics.com", - "app-measurement-cn.com", - "app-measurement.com", - "app-store.wang", - "app.link", - "app0le.com", - "app756.com", + "appadvice.com", "appbrain.com", - "appbridge.ca", - "appbridge.io", - "appbridge.it", - "appcenter.ms", - "appcloud.com", - "appdomain.cloud", "appdownloader.net", - "appdynamics.co.uk", - "appdynamics.com", - "appdynamics.de", - "appdynamics.fr", - "appdynamics.info", - "appdynamics.jp", - "appdynamics.org", - "appe-store.com", - "appexchange.com", - "apphb.com", - "appl-e.com", - "appl.com", - "appl4e.com", - "appla.com", - "apple-cloudkit.com", - "apple-darwin.com", - "apple-darwin.net", - "apple-darwin.org", - "apple-dns.com", - "apple-dns.net", - "apple-enews.com", - "apple-expo.com", - "apple-expo.eu", - "apple-hk.com", - "apple-imac.com", - "apple-inc.net", - "apple-livephotoskit.com", - "apple-mapkit.com", - "apple-online.com", - "apple-pay.com", - "apple-pay.rs", - "apple-pay.wang", - "apple-store.net", - "apple-store.wang", - "apple-usa.net", - "apple-watch.com.ru", - "apple.ae", - "apple.at", - "apple.be", - "apple.bg", - "apple.bs", - "apple.ca", - "apple.ch", - "apple.cl", - "apple.cm", - "apple.co", - "apple.co.cr", - "apple.co.hu", - "apple.co.jp", - "apple.co.kr", - "apple.co.mz", - "apple.co.nz", - "apple.co.th", - "apple.co.uk", - "apple.com", - "apple.com.af", - "apple.com.au", - "apple.com.bo", - "apple.com.br", - "apple.com.co", - "apple.com.de", - "apple.com.do", - "apple.com.gr", - "apple.com.gy", - "apple.com.jm", - "apple.com.lk", - "apple.com.mg", - "apple.com.mx", - "apple.com.my", - "apple.com.pa", - "apple.com.pe", - "apple.com.pl", - "apple.com.pr", - "apple.com.pt", - "apple.com.py", - "apple.com.sg", - "apple.com.sv", - "apple.com.tr", - "apple.com.tw", - "apple.com.uy", - "apple.cz", - "apple.de", - "apple.dk", - "apple.ee", - "apple.es", - "apple.eu", - "apple.fi", - "apple.fr", - "apple.hamburg", - "apple.hn", - "apple.hr", - "apple.hu", - "apple.ie", - "apple.in", - "apple.is", - "apple.it", - "apple.jo", - "apple.jp", - "apple.kr", - "apple.lk", - "apple.lt", - "apple.lv", - "apple.me", - "apple.my", - "apple.net", - "apple.net.gr", - "apple.news", - "apple.nl", - "apple.no", - "apple.pk", - "apple.pl", - "apple.pt", - "apple.ro", - "apple.rs", - "apple.ru", - "apple.sa", - "apple.se", - "apple.sg", - "apple.si", - "apple.sk", - "apple.so", - "apple.tt", - "apple.tw", - "apple.uk", - "apple.us", - "apple.xyz", - "appleaccount.net", - "appleafrica.com", - "appleantilles.com", - "appleappstore.net", - "appleappstore.tv", - "appleaustralia.com", - "appleaustralia.com.au", - "appleaustralia.net.au", - "applebk.net", - "applecarbon.com", - "applecard.tv", - "applecare.berlin", - "applecare.cc", - "applecare.eu", - "applecare.hamburg", - "applecare.wang", - "applecensorship.com", - "applecentar.co.rs", - "applecentar.rs", - "applecentre.com.au", - "applecentre.info", - "appleclassicipod.com", - "appleclub.com.hk", - "applecom.com", - "applecomputer-imac.com", - "applecomputer.co.in", - "applecomputer.co.nz", - "applecomputer.com", - "applecomputer.com.hk", - "applecomputer.com.tw", - "applecomputer.hu", - "applecomputer.kr", - "applecomputerimac.com", - "applecomputerinc.info", - "applecomputers.co.nz", - "applecoronavirus.com", "appledaily.com", "appledaily.com.hk", "appledaily.com.tw", - "appledaily.hk", - "appledarwin.com", - "appledarwin.net", - "appleenews.com", - "appleexpo.eu", - "appleexpo.info", - "applefilmaker.com", - "applefilmmaker.com", - "applefinalcutproworld.com", - "applefinalcutproworld.net", - "applefinalcutproworld.org", - "applefruity.com", - "applehealth.com.hk", - "applehongkong.com", - "applehongkong.com.hk", - "appleid-applemx.com", - "appleid-applemx.us", - "appleid-iclou.com", - "appleid-uk.us", - "appleid.berlin", - "appleid.com", - "appleid.hamburg", - "appleid.hk", - "appleimac.com", - "appleinclegal.com", - "appleinsider.com", - "appleiphone.hu", - "appleiphone.net", - "appleiphonecell.com", - "appleipodsettlement.com", - "appleiservices.com", - "applelink.com", - "applemagickeyboard.com", - "applemalaysia.com.my", - "applemasters.info", - "applemusic.berlin", - "applemusic.co", - "applemusic.com", - "applemusic.com.au", - "applemusic.hamburg", - "applemusic.wang", - "applemusicconnect.com", - "applemusicfestival.com", - "applemx-icloud.com", - "applenews.berlin", - "applenews.hamburg", - "applenews.tv", - "applenewsformat.com", - "appleone.audio", - "appleone.blog", - "appleone.chat", - "appleone.cloud", - "appleone.club", - "appleone.community", - "appleone.film", - "appleone.guide", - "appleone.host", - "appleone.space", - "appleone.tech", - "appleone.website", - "appleonline.com", - "appleonline.net", - "appleoriginalproductions.com", - "appleos.tv", - "applepay.berlin", - "applepay.co.rs", - "applepay.com.tw", - "applepay.hamburg", - "applepay.hk", - "applepay.info", - "applepay.jp", - "applepay.rs", - "applepay.tv", - "applepaycash.net", - "applepaycash.tv", - "applepaymerchantsupplies.info", - "applepaysupplies.berlin", - "applepaysupplies.com", - "applepaysupplies.info", - "applepaysupplies.net", - "applepaysupplies.tv", - "applepencil.net", - "applepodcasts.com", - "applepremiumreseller.com.au", - "applepremiumresellers.com.au", - "applereach.com", - "applereach.net", - "apples-msk.ru", - "applescreensavers.com", - "applescript.info", - "appleshare.info", - "appleshop.co.uk", - "applestor.com", - "applestore.bg", - "applestore.cc", - "applestore.ch", - "applestore.cm", - "applestore.co.hu", - "applestore.co.jp", - "applestore.co.ug", - "applestore.co.uk", - "applestore.com", - "applestore.com.au", - "applestore.com.bn", - "applestore.com.ee", - "applestore.com.eg", - "applestore.com.gr", - "applestore.com.hk", - "applestore.com.hr", - "applestore.com.jo", - "applestore.com.my", - "applestore.com.ph", - "applestore.com.pl", - "applestore.com.pt", - "applestore.com.ro", - "applestore.com.ru", - "applestore.com.sn", - "applestore.com.tw", - "applestore.de", - "applestore.hk", - "applestore.kr", - "applestore.me", - "applestore.net", - "applestore.net.gr", - "applestore.ph", - "applestore.qa", - "applestore.sg", - "applestore.wang", - "applestoreonline.com", - "applestorepro.eu", - "applesurveys.com", - "appleswift.com", - "appletaiwan.com", - "appletips.net", - "appletv.com", - "appletv.fr", - "appletv.wang", - "appletvapp.apple", - "applewallet.com", - "applewallet.tv", - "applewatch.hk", - "applewatch.tv", - "applewatch.tw", - "applewatch.wang", - "applewatchedition.com", - "applewatchseries3.net", - "applewatchsport.com", - "appleweb.net", - "applexpo.net", - "applezh.com", - "applf.com", - "applfe.com", - "applicationinsights.io", - "applicationinsights.net", - "applle.com", - "applw.com", - "appmediagroup.com", - "approvedusedbmw.com", - "appsflayer.com", "appshopper.com", "appsocks.net", - "appsonebay.net", "appspot-preview.com", "appspot.com", "appsto.re", - "appstore.co.id", - "appstore.hk", - "appstore.my", - "appstore.ph", - "appule.com", - "appye.com", - "appyq.com", - "apr.ac.uk", - "apress.com", - "aps.org", - "apt.ac.uk", "aptoide.com", - "apts.ac.uk", - "apture.com", - "apu.ac.uk", - "apuc-scot.ac.uk", - "apyarstorybooks.blogspot.com", - "apyle.com", - "aqdlt.net", - "aqmen.ac.uk", - "aquinas.ac.uk", - "arabianchicks.com", - "arabidopsis.org", - "arabnek.com", - "arabxn.com", - "arabxnxx.org", - "arabysexy.com", - "arabysexy.mobi", - "aragon.network", - "aranzadi.es", - "arauc.br", - "arc.ac.uk", - "arcadewank.com", - "arcgis.com", - "arcgisonline.com", - "archaeologydataservice.ac.uk", - "archangel.ac.uk", - "archer.ac.uk", - "archie-west.ac.uk", - "architectural-cadcam.com", - "archive-it.org", - "archive.ac.uk", "archive.fo", "archive.is", "archive.li", @@ -2248,1723 +401,262 @@ var rules = [ "archive.org", "archive.ph", "archive.today", + "archive.vn", "archiveofourown.com", - "archiveofourown.net", "archiveofourown.org", "archives.gov", "archives.gov.tw", - "archiveshub.ac.uk", - "archivx.to", - "archlinux.org", - "archlinuxarm.org", - "archway.ac.uk", - "arcom.ac.uk", - "arctic.ac.uk", "arctosia.com", - "arden.ac.uk", - "ardencampus.ac.uk", - "ardencollege.ac.uk", - "ardenu.ac.uk", - "ardenuni.ac.uk", - "ardenuniversity.ac.uk", - "area120.com", - "area51.to", "areca-backup.org", "arena.taipei", "arethusa.su", - "arewereadyyet.com", - "areyoucreditwise.com", - "argotunnel.com", - "argyllcollege.ac.uk", - "aria.ms", - "ariadne.ac.uk", - "aricd.ac.uk", - "aries-dtp.ac.uk", - "ark-genomics.ac.uk", - "ark.ac.uk", - "ark.to", "arlingtoncemetery.mil", - "arm.ac.uk", - "arma.ac.uk", - "armagh.ac.uk", - "armovs.com", "army.mil", - "arnold-carlton.ac.uk", - "arnoldrenderer.com", - "arphic.com", - "arphic.com.cn", - "arphic.com.tw", - "arrc.ac.uk", - "ars.ac.uk", - "art1lib.com", "art4tibet1998.org", - "artcam.com", - "artcamexpress.com", - "artcaminsignia.com", - "artcamjewelsmith.com", - "artcampro.com", - "artdesignhull.ac.uk", "arte.tv", - "artifact.ac.uk", - "artixlinux.org", - "artnudegalleries.com", - "artoferotica.info", - "artofmaking.ac.uk", "artofpeacefoundation.org", - "arts-inst-bournemouth.ac.uk", - "arts.ac.uk", - "artsigns.ac.uk", - "artsmethodsnorthwest.ac.uk", - "artsresearchatnorthampton.ac.uk", "artstation.com", - "artstationmedia.com", - "artstor.org", "artsy.net", - "aru.ac.uk", "arunachalforests.gov.in", - "arupoc.ac.uk", - "arxiv.org", - "arzon.jp", - "as-hp.ca", "asacp.org", - "asagaku.com", - "asahi.com", - "asahicom.jp", - "asakonet.co.jp", - "ascelibrary.org", - "ascent.ac.uk", - "ascentis.ac.uk", - "ascorpus.ac.uk", - "ascr.ac.uk", - "ascribed.ac.uk", "asdfg.jp", - "asearch.ac.uk", - "asebay.com", - "asen.ac.uk", - "asexdoll.com", - "asextube.net", - "asfc.ac.uk", "asg.to", - "asgp.ac.uk", - "asha.org", - "ashemaletube.com", - "ashemaletv.com", - "ashford.ac.uk", - "ashleysageellison.com", - "ashridge.ac.uk", - "ashtoninstitute.ac.uk", "asia-gaming.com", - "asiabrox.ac.uk", - "asiacrazy.xyz", "asiaharvest.org", - "asiamap.ac.uk", - "asiamoviepass.com", - "asian-anal-sex.com", "asianage.com", - "asianboygay.com", - "asiancamgirllive.com", - "asiancamly.com", "asianews.it", "asianfreeforum.com", - "asianfreeporn.net", - "asiangfvideos.com", - "asiangirlsnextdoor.com", - "asianphd.com", - "asianporn.rest", - "asianporn.sexy", - "asianpornjav.com", - "asianpornlabs.com", - "asianpornmovies.com", - "asianpornonly.com", - "asianporntrends.com", - "asianpornup.com", - "asianscreens.com", - "asiansex.sexy", "asiansexdiary.com", - "asiansmaster.com", "asianspiss.com", - "asianthumbs.org", - "asianwifeporn.com", "asianwomensfilm.de", - "asianxxxvideos.cc", "asiaone.com", "asiatgp.com", "asiatimes.com", "asiatoday.us", - "ask-sam.ac.uk", "ask.com", - "askfacebook.net", - "askfacebook.org", - "askham-bryan.ac.uk", - "askham.ac.uk", - "askhambryan.ac.uk", - "asknudes.com", "askstudent.com", - "askubuntu.com", "askynz.net", - "asm.org", - "asme.org", - "asmhentai.com", - "asminternational.org", - "asmrbuluo.com", - "asn-online.org", - "asp-cc.com", - "asp.net", - "aspbjournals.org", - "aspect.ac.uk", - "aspectnetwork.ac.uk", - "aspenpublishing.com", "aspi.org.au", - "aspire.ac.uk", - "aspiretrainingteam.ac.uk", "aspistrategist.org.au", - "aspnetcdn.com", - "asproex.com", - "asproexapi.com", - "asra.ac.uk", - "asredas.com", "asrockind.com", - "ass4all.com", - "assap.ac.uk", "assembla.com", - "assemblesystems.com", - "assesphoto.com", - "assetsadobe.com", "assimp.org", - "assistirhentai.com", - "assoass.com", - "associates-amazon.com", - "associationforpoliticalthought.ac.uk", - "assylum.com", - "astec.ac.uk", - "asthma-allergy.ac.uk", - "astm.org", - "asto.re", - "aston.ac.uk", "astrill.com", - "astrobiology.ac.uk", - "astrogrid.ac.uk", - "astronomy.ac.uk", - "asus.com", - "asuscloud.com", - "asuswebstorage.com", - "asvin.ac.uk", - "atandt.com", "atc.org.au", "atchinese.com", - "atdmt.com", - "atdmt2.com", - "ateam-oracle.com", "atgfw.org", "athenaeizou.com", - "athens.ac.uk", - "atkgallery.com", "atlanta168.com", - "atlantaminidealers.com", - "atlars.ac.uk", - "atlas.ac.uk", - "atlasdmt.com", - "atlasonepoint.com", "atlaspost.com", - "atlassian.com", - "atlassian.net", "atnext.com", - "atom.io", - "atos.net", - "atp.ac.uk", - "atscaleconference.com", - "atsip.ac.uk", - "att-bundles.com", - "att-idns.net", - "att-japan.com", - "att-mail.com", - "att-promotions.com", - "att-rsvp.com", - "att.com", - "att.jobs", - "att.net", - "att.tv", - "attackers.net", - "attalascom.com", - "attbelieves.com", - "attbusiness.net", - "attcenter.com", - "attcollaborate.com", - "attdns.com", - "attdns.net", - "attexperts.com", - "attglobal.net", - "atthelimits.ac.uk", - "attic.io", - "attinnovationspace.com", - "attinternetservice.com", - "attjoy.com", - "attnetclient.com", - "attonlineoffers.com", - "attproxy.com", - "attpublicpolicy.com", - "attpurchasing.com", - "attsavings.com", - "attspecial.com", - "attssl.com", - "attstadium.com", - "attsuppliers.com", - "atttvnow.com", - "attuverseoffers.com", - "attuverseonline.com", - "attvoip.com", - "attwatchtv.com", - "attwifi.com", - "attwirelessinternet.com", - "attwirelessonline.com", - "attwirelesssolutions.com", - "atube.sex", - "atube.xxx", - "atubex.com", - "atwiki.jp", - "atypi.org", - "aua.ac.uk", - "aub.ac.uk", - "auc.ac.uk", - "aucb.ac.uk", - "aucheapbeats.com", - "aucyfrwngcymraeg.ac.uk", - "aude.ac.uk", - "audelondon.ac.uk", - "audible.com", - "audiencenetwork.com", - "audiencenetwork.tv", - "audiobeatsau.com", - "audiobeatsbydre.com", - "audiomonsterbeatsonline.com", + "audacy.com", "audionow.com", - "aue.ac.uk", - "auee.ac.uk", - "aukcar.ac.uk", - "aulic.ac.uk", - "auntymaza.com", - "auphf.ac.uk", - "auricularemonsterbeats.com", - "auricularesbeatsbaratosshop.com", - "auricularesbeatsmarkt.com", - "auroraoss.com", - "ausbeatsbydrdre.com", - "auth0.com", "authorizeddns.net", "authorizeddns.org", "authorizeddns.us", - "authorxml.com", - "authy.com", - "autocad-schulungen.com", - "autocad.com", - "autocad360.com", - "autocad3d.com", - "autocadarchitecturecc.com", - "autocadexpert.com", - "autocadformac.com", - "autocadfreestyle.com", - "autocadlt.com", - "autocadltbg.com", - "autocadmac.com", - "autocadmobile.com", - "autocadsucks.com", - "autocadsucks.net", - "autocadws.com", - "autocadws.net", - "autodesk-aia-me.com", - "autodesk-events.com", - "autodesk-kickoff.com", - "autodesk-mm.com", - "autodesk-news.com", - "autodesk-online.com", - "autodesk-service.com", - "autodesk-services.com", - "autodesk-support.com", - "autodesk-university.com", - "autodesk-usability.com", - "autodesk.com", - "autodesk.dev", - "autodesk.net", - "autodesk123d.com", - "autodesk123dnews.com", - "autodesk360.com", - "autodesk360access.com", - "autodesk360beta.com", - "autodesk360bim.com", - "autodesk360express.com", - "autodesk360forbim.com", - "autodesk360forplm.com", - "autodesk360nexus.com", - "autodesk360nexus.net", - "autodesk360plm.com", - "autodesk360pro.com", - "autodesk360solutionforbim.com", - "autodesk360solutionforplm.com", - "autodesk360vault.com", - "autodeskaecfeed.com", - "autodeskandcitrix.com", - "autodeskarcade.com", - "autodeskautocadlt.com", - "autodeskautomotive.com", - "autodeskbim360.com", - "autodeskbookrequest.com", - "autodeskbuild.com", - "autodeskbuildingops.com", - "autodeskbuildspc.com", - "autodeskcave.com", - "autodeskchronicle.com", - "autodeskcommunications.com", - "autodeskcompetitions.com", - "autodeskdesigncompetition.com", - "autodeskdesigncompetitions.com", - "autodeskdiscussions.com", - "autodeskdocandmedia.com", - "autodeskdocandmediaamericas.com", - "autodeskdocandmediaasia.com", - "autodeskdocandmediaemea.com", - "autodeskdocandmediaeurope.com", - "autodeskegitimleri.com", - "autodeskenterprise.com", - "autodeskevents.com", - "autodeskfashionstyler.com", - "autodeskforgames.com", - "autodeskforge.com", - "autodeskformit.com", - "autodeskfoundation.com", - "autodeskfusionlifecycle.com", - "autodeskgovernment.net", - "autodeskgreenbuildingstudio.com", - "autodeskhelp.com", - "autodeskicpcouncil.com", - "autodeskimpression.com", - "autodeskinform.com", - "autodeskinstant.com", - "autodeskjournal.com", - "autodesklearning.com", - "autodesklistens.com", - "autodesklivedesign.com", - "autodesklms.com", - "autodeskmanufacturingacademy.com", - "autodeskmayaformotiongraphics.com", - "autodeskmedbookrequest.com", - "autodeskmedia.com", - "autodeskmediarequest.com", - "autodeskmeetings.com", - "autodeskmfg.com", - "autodeskmotiongraphicsandmore.com", - "autodesknews.com", - "autodeskonline.com", - "autodeskpartner.com", - "autodeskplm.com", - "autodeskplm360.com", - "autodeskplm360.net", - "autodeskproductreviews.com", - "autodeskprofiles.com", - "autodeskprograms.com", - "autodeskresearch.com", - "autodeskrevit.com", - "autodeskrevit.net", - "autodeskrevitsucks.com", - "autodeskrevitsucks.net", - "autodeskseek.com", - "autodesksketchbook.com", - "autodesksketchbookdesigner.com", - "autodeskstylebook.com", - "autodesksubscription.com", - "autodesksucks.com", - "autodesksucks.net", - "autodesktechdays.com", - "autodesktechx.com", - "autodesktinkerbox.com", - "autodesktravel.com", - "autodeskturkiye.com", - "autodeskuniversity.com", - "autodeskuniversity2013.com", - "autodeskvasari.com", - "autodeskvasari.net", - "autodeskvietnam.com", - "autodeskviewer.com", - "autodeskworkshop.com", - "autodeskworkshop.net", "autodraw.com", - "automobile.fr", - "automotive-cadcam.com", - "autosketch.com", - "autosub.ac.uk", - "autumn-jade.com", - "auxdubai.com", - "av-baron.com", - "av-channel.com", "av-e-body.com", - "av-movie.cc", - "av-th.net", - "av-top.com", "av.com", "av.movie", "av01.tv", - "av11.org", - "av1688.cc", - "av369.net", - "av4.us", - "av69.tv", - "av69.us", - "av6k.com", - "av6k.vip", "avaaz.org", - "avant.ac.uk", - "avatara.com", - "avbebe.com", "avbody.tv", - "avcar.vip", - "avcens.xyz", "avcity.tv", - "avcnn.com", "avcool.com", - "avcrempie.com", - "avday.tv", "avdb.in", "avdb.tv", - "avdby-up.buzz", - "avdudu.top", - "avdwang.xyz", - "avelip.com", - "aventertainments.com", "avfantasy.com", - "avfox.cc", "avg.com", - "avgigi.com", "avgle.com", - "avgle.net", - "avgod.club", - "avh.world", - "avhbo.com", - "avhd101.com", - "avhome.one", - "avhu.com", "avidemux.org", - "avinetworks.com", - "avinin.com", - "avizoon.site", - "avizoone.com", - "avjb.com", - "avjiasu.com", - "avjoy.me", - "avjzy67.xyz", - "avking-mp4.sbs", - "avlulu.cc", "avmo.pw", - "avmoo.click", "avmoo.com", "avmoo.net", "avmoo.pw", - "avn.com", - "avnana5.com", - "avnight-shipin.com", "avoision.com", - "avpanda.cc", - "avphd.ac.uk", - "avple.tv", - "avprc.ac.uk", - "avrila.cc", - "avrila2.cc", - "avrila2023.top", - "avrila23.cc", - "avriri.top", - "avsee01.tv", - "avseesee.com", - "avsforum.com", - "avstar.me", - "avstar01.me", - "avstar02.me", - "avstar03.me", - "avstar04.com", - "avstar04.me", - "avstar05.me", - "avstar06.me", - "avstar07.com", - "avstar07.me", - "avstar09.com", - "avstar09.me", - "avstar1.com", - "avstar2.com", - "avstar3.com", - "avstar4.com", - "avstar5.com", - "avstar6.com", - "avstar8.com", - "avstar9.com", - "avwong.com", - "avwto.com", - "avxde.org", - "avxhm.is", - "avxhm.se", - "avxlive.icu", - "avxxc.com", "avyahoo.com", - "awayoutgame.com", - "aweencore.com", - "awempire.com", - "awesomeent.co.kr", - "awetv.com", - "awfdcp.ac.uk", - "awflapp.top", - "awjq.cc", - "awlc.ac.uk", - "aws-iot-hackathon.com", - "awsautopilot.com", - "awsautoscaling.com", - "awsbraket.com", - "awscommandlineinterface.com", - "awsedstart.com", - "awseducate.com", - "awseducate.net", - "awseducate.org", - "awsglobalaccelerator.com", - "awsloft-johannesburg.com", - "awsloft-stockholm.com", - "awssecworkshops.com", - "awsstatic.com", - "awsthinkbox.com", - "awstrack.me", - "awstrust.com", - "awwcn.buzz", - "awwcn.xyz", - "axbdoll.com.tw", "axios.com", "axureformac.com", - "ayabank.com", - "aylesbury.ac.uk", - "ayrcoll.ac.uk", - "ayrshire.ac.uk", - "ayshdade.info", - "ayshdee.xyz", - "ayudanintendo.com", - "azadiradio.com", - "azadliq.org", - "azathabar.com", - "azatliq.org", - "azattyk.org", - "azattyq.org", - "azatutyun.am", "azerbaycan.tv", "azerimix.com", - "aziani.com", "azirevpn.com", - "aznude.com", "azubu.tv", - "azure-devices-int.net", - "azure-devices.net", - "azure-dns.com", - "azure-dns.info", - "azure-dns.net", - "azure-dns.org", - "azure-mobile.net", - "azure-sphere.com", - "azure-test.net", - "azure.com", - "azure.net", - "azurecomcdn.net", - "azurecomm.net", - "azurecontainer.io", - "azurecosmos.net", - "azurecosmosdb.com", - "azurecosmosdb.info", - "azurecosmosdb.net", - "azurecr.io", - "azuredatabricks.net", - "azuredevopslaunch.com", - "azuredigitaltwin.com", - "azuredigitaltwins.com", - "azuredigitaltwins.net", - "azuredns-prd.info", - "azuredns-prd.org", - "azureedge-test.net", - "azureedge.net", - "azurefd.net", - "azureiotcentral.com", - "azureiotsolutions.com", - "azureiotsuite.com", - "azureplanetscale.info", - "azureplanetscale.net", - "azureserviceprofiler.com", - "azuresmartspaces.net", - "azurestackvalidation.com", "azurewebsites.net", "b-cdn.net", - "b-eroland.net", - "b-ok.africa", - "b-ok.asia", "b-ok.cc", - "b-ok.global", - "b-ok.org", "b0ne.com", - "b3boos.com", - "b6b33.com", - "b6fc.ac.uk", - "baa.ac.uk", - "baap.ac.uk", - "baas.ac.uk", - "baazee.com", - "babble.com", - "babecentrum.com", - "babeimpact.com", - "babeltech.ac.uk", - "babepedia.com", - "babes.com", - "babes34.com", - "babes34.pro", - "babesandbitches.net", - "babesandgirls.com", - "babesandstars.com", - "babesaround.com", - "babesbang.com", - "babesinporn.com", - "babesmachine.com", - "babesnetwork.com", - "babesofindia.com", - "babesource.com", - "babestube.com", - "babosas.com", - "babraham.ac.uk", - "babushky.club", "baby-kingdom.com", - "baby-me-nrt.ac.uk", - "babycondom.com", "babylonbee.com", - "babylongirls.co.uk", "babynet.com.hk", - "babypink.to", - "babyzone.com", - "bach.ac.uk", "backchina.com", - "backdoorlesbians.com", - "backoncourse.ac.uk", "backpackers.com.tw", - "backroomcastingcouch.com", - "backstage.ac.uk", "backtotiananmen.com", - "bacl.ac.uk", - "baclaw.ac.uk", - "bacoll.ac.uk", - "bacon.com", - "bacsitinhyeu.vn", "bad.news", - "badaas.com", - "badasianpussy.com", - "badc.ac.uk", - "badgen.net", "badiucao.com", "badjojo.com", - "badoinkvr.com", "badoo.com", - "badsexygirl.com", - "badteenspunished.com", - "badvirtue.com", - "baeb.com", - "baec.ac.uk", - "baes.ac.uk", - "bafa.ac.uk", - "bag-glasses1.com", "bahamut.com.tw", - "bahcesehir.ac.uk", - "bai29.xyz", - "baicaonetwork.com", - "baice.ac.uk", "baidu.jp", "baijie.org", "bailandaily.com", - "bailer.ac.uk", - "bais.ac.uk", "baixing.me", "baizhi.org", - "baj.ac.uk", "bakgeekhome.tk", - "balance.ac.uk", - "ballbustingtube.com", - "balletwest.ac.uk", - "baltimorebmw.com", - "bam.ac.uk", "bamgrid.com", - "bams.ac.uk", - "bamtoki.com", - "banan.tv", "banana-vpn.com", - "banatfun.com", - "banbury-bicester.ac.uk", - "banbury-college.ac.uk", "band.us", - "bandag.cc", - "bandag.com", "bandcamp.com", - "bandgirlz.com", - "bandp.ac.uk", "bandpage.com", - "bandpcoll.ac.uk", "bandwagonhost.com", - "banff-buchan.ac.uk", - "bang-movies.com", - "bangbros.com", "bangbrosnetwork.com", "bangchen.net", "bangdream.space", - "bangher.net", "bangkokpost.com", - "bangkokstreetwhores.com", - "bangor-university-london.ac.uk", - "bangor.ac.uk", + "bangumi.moe", "bangyoulater.com", - "bangyourwife.com", "bankmobilevibe.com", - "banned.video", - "bannedbook.net", "bannedbook.org", "bannednews.org", "banorte.com", - "baraero.com", "baramangaonline.com", - "barefootnetworks.com", - "barelist.com", "barenakedislam.com", - "bareporno.com", - "barfuck.com", - "barium-enema.com", - "barkadahansasmartone.com", - "barking-coll.ac.uk", - "barkingcollege.ac.uk", - "barkingdagenhamcollege.ac.uk", "barnabu.co.uk", - "barnet.ac.uk", - "barnetsouthgate.ac.uk", - "barnfield.ac.uk", - "barnsley.ac.uk", - "barony.ac.uk", - "barricades.ac.uk", - "barrons-advisor.com", - "barrons-conferences.com", - "barrons.com", - "barrow6fc.ac.uk", - "barry.ac.uk", - "bars.ac.uk", - "barss1207.pro", - "barton-peveril.ac.uk", - "barton.ac.uk", "barton.de", "bartvpn.com", - "bas.ac.uk", - "baselinestudy.com", - "baselinestudy.org", - "basford-hall.ac.uk", - "basildon.ac.uk", - "basilisk-browser.org", - "basingstoke.ac.uk", - "basketry.ac.uk", - "basp.ac.uk", - "basr.ac.uk", "bastillepost.com", - "bastropfirestone.com", - "baterias-hp.com", - "bath.ac.uk", - "bathcollege.ac.uk", - "bathnortheastsomerset-acl.ac.uk", - "bathspa.ac.uk", - "batsa.me", - "battle.net", - "battlebreakers.com", - "battlefield.com", - "battlefield1943.com", - "battlefield3.com", - "battlefield4.com", - "battlefield5.com", - "battlefieldbadcompany2.com", - "battlefieldheroes.com", - "battlefieldv.com", - "battleforcecomix.com", - "battlefront2.com", - "battlefrontii.com", - "battlelog.com", - "bavs.ac.uk", - "baxsound.com", - "bayareabmw.com", "bayvoice.net", "baywords.com", - "bazel.build", "bb-chat.tv", - "bb33.net", - "bbbaihu.vip", - "bbc-anal.com", - "bbc-reporting-api.app", - "bbc.ac.uk", "bbc.co.uk", "bbc.com", "bbc.in", - "bbc.net.uk", "bbcchinese.com", "bbchat.tv", "bbci.co.uk", - "bbcmedia.co.uk", - "bbcpersian.com", - "bbcpornonly.com", - "bbcslln.ac.uk", - "bbcverticals.com", - "bbe.ac.uk", - "bbestmall.com", "bbg.gov", - "bbgevent.com", - "bbgwatch.com", - "bbhub.io", - "bbk.ac.uk", "bbkz.com", "bbnradio.org", - "bbqm1.xyz", - "bbs-cove.ac.uk", "bbs-tw.com", "bbsdigest.com", "bbsfeed.com", "bbsland.com", "bbsmo.com", "bbsone.com", - "bbsrc.ac.uk", - "bbthat.com", "bbtoystore.com", - "bbw-yoyo.buzz", - "bbwmilftube.com", - "bbwyoyo.info", - "bby.com", - "bbycastatic.ca", - "bbycloud.com", - "bbycontent.com", - "bbycontent.net", - "bbyintl.com", - "bbystatic.com", - "bbyurl.us", - "bca.ac.uk", - "bcam.ac.uk", - "bcast.ac.uk", "bcast.co.nz", - "bcbits.com", - "bcc.ac.uk", "bcc.com.tw", "bcchinese.net", - "bccolleges.ac.uk", "bcex.ca", - "bcftcs.ac.uk", - "bcicdn.com", "bcmorning.com", - "bcno.ac.uk", - "bcom.ac.uk", - "bcomstudents.ac.uk", - "bcot.ac.uk", - "bcove.video", - "bcovlive.io", "bcrncdn.com", - "bctcs.ac.uk", - "bcu.ac.uk", - "bcuc.ac.uk", - "bcvp0rtal.com", - "bcy01.com", - "bdc.ac.uk", - "bdn.dev", - "bdsm-mov.net", - "bdsm.com", - "bdsm123.xyz", - "bdsmboard.org", - "bdsmbunker.com", - "bdsmcafe.com", - "bdsmhd.cc", - "bdsmland.org", - "bdsmlibrary.com", - "bdsmlr.com", - "bdsmpornonly.com", - "bdsmsexgame.com", - "bdsmstreak.com", - "bdsmtubexxx.com", - "bdsmtv.cc", "bdsmvideos.net", - "beaa.ac.uk", "beaconevents.com", "beanfun.com", - "beascoremodel.com", - "beastiegals.com", - "beastysexlinks.com", - "beastythumbs.com", - "beatbd.com", - "beatbydre2013.com", - "beatbydreheadphonesonsale.com", - "beatbydrekopen.com", - "beatbydremonster.com", - "beatbydreuk2014.com", - "beatdrdres.com", - "beatfactoryoutlets.com", - "beatmonstersaustralia.net", - "beats-by-dre-australia.com", - "beats-bydrdre.net", - "beats-bydre-mall.com", - "beats-bydrecheapsale.com", - "beats-bydreoutletonline.com", - "beats-bydreoutletsale.com", - "beats-bydreoutletsale.net", - "beats-bydreoutletssale.net", - "beats-bydrestore.com", - "beats-bydreuk.com", - "beats-deal.com", - "beats-dre-us.com", - "beats-headphones-buy-cheap.com", - "beats-headphones.us", - "beats-sale.com", - "beats-seller.com", - "beats-soaho.com", - "beats1.cc", - "beats1.tv", - "beats123.com", - "beats4.net", - "beats4outlets.com", - "beats4salecheap.com", - "beatsallsale.com", - "beatsaudifonos.com", - "beatsaudiobydre.com", - "beatsaudiobydre.net", - "beatsaudios.net", - "beatsbeatsmonster.com", - "beatsbestdeals.com", - "beatsblackfridaydeals.net", - "beatsblackfridayretails.com", - "beatsboxingdayuksale.com", - "beatsbydrdre-headphones.com", - "beatsbydrdre-officials5.com", - "beatsbydrdre-online.com", - "beatsbydrdre-onsale.com", - "beatsbydrdre-store.com", - "beatsbydrdre-store.us", - "beatsbydrdre4sale.com", - "beatsbydrdrebiz.com", - "beatsbydrdrecustom.com", - "beatsbydrdredanmark.com", - "beatsbydrdremall.com", - "beatsbydrdreoutlet.com", - "beatsbydrdres.com", - "beatsbydrdresale.net", - "beatsbydrdrestore.com", - "beatsbydrdreus.com", - "beatsbydre-beatsheadphone.com", - "beatsbydre-chen.com", - "beatsbydre-club.com", - "beatsbydre-headphones.com", - "beatsbydre-headphonesshop.com", - "beatsbydre-mall.com", - "beatsbydre-outlet.com", - "beatsbydre-outletsale.net", - "beatsbydre-outletstore.com", - "beatsbydre-sell.com", - "beatsbydre-store.com", - "beatsbydre-studio.com", - "beatsbydre-us.com", - "beatsbydre.jp", - "beatsbydre2081.com", - "beatsbydre411.com", - "beatsbydre4usales.com", - "beatsbydreauofficial.com", - "beatsbydreausale.net", - "beatsbydreaustralia-sale.com", - "beatsbydreaustraliaonline.com", - "beatsbydreaustraliaonlines.com", - "beatsbydreaustraliasales.com", - "beatsbydrebeatsby.com", - "beatsbydreblackfriday2013.com", - "beatsbydreblackfridaypro.com", - "beatsbydreboxingdayca.com", - "beatsbydrecasquesfr.com", - "beatsbydrecheap-outletstore.com", - "beatsbydrecheaper.com", - "beatsbydrecheaponlinesales.com", - "beatsbydrecolors.com", - "beatsbydrecustomwireless.com", - "beatsbydrecybermondaydeals2013.com", - "beatsbydrecybermondaydeals2013.net", - "beatsbydredanmarks.com", - "beatsbydredealsblackfriday.com", - "beatsbydredealscybermonday.com", - "beatsbydrediscount.com", - "beatsbydrediscountonline.net", - "beatsbydredr.com", - "beatsbydreexecutivesale.com", - "beatsbydreformall2013-nl.com", - "beatsbydreforsalesonline.com", - "beatsbydreforshop2013-nl.com", - "beatsbydreforstore.com", - "beatsbydreforyououtlet.com", - "beatsbydrefr.com", - "beatsbydrefrcasquepascher.com", - "beatsbydrefriday.com", - "beatsbydregot.com", - "beatsbydrehd.com", - "beatsbydrehd.net", - "beatsbydreheadphones-nz.com", - "beatsbydreheadphonesolo.com", - "beatsbydrehut.com", - "beatsbydreinexpensive.com", - "beatsbydreireland-sales.com", - "beatsbydreirelandonlines.com", - "beatsbydreirelandsale.com", - "beatsbydreirelandsonline.com", - "beatsbydremall2013.com", - "beatsbydremonsteraustralia.com", - "beatsbydrenls.com", - "beatsbydrenorge1.net", - "beatsbydreofficialdanmark.com", - "beatsbydreoksale.com", - "beatsbydreol.com", - "beatsbydreonlie2013-nl.com", - "beatsbydreonlines-ireland.com", - "beatsbydreonlines-uk.com", - "beatsbydreonlinesale-nz.com", - "beatsbydreoordopjes.com", - "beatsbydreoslo.com", - "beatsbydreoutletsale.com", - "beatsbydreoutletscheap.com", - "beatsbydrerealstore.com", - "beatsbydres-shop.com", - "beatsbydresale-uk.com", - "beatsbydresalemall2013.com", - "beatsbydresaleonlines-nz.com", - "beatsbydresales.us", - "beatsbydresalesonline-australia.com", - "beatsbydresdanmark.net", - "beatsbydreshop-uk.com", - "beatsbydreshops.net", - "beatsbydresingapores.com", - "beatsbydresingaporesale.com", - "beatsbydresold.com", - "beatsbydresolohdonline-canada.com", - "beatsbydresonline-nz.com", - "beatsbydrespeakers.com", - "beatsbydressale.com", - "beatsbydressolo.com", - "beatsbydresstudio.com", - "beatsbydrestorevip.com", - "beatsbydrestudio-australia.com", - "beatsbydrestudio.com", - "beatsbydretoutlet.com", - "beatsbydreuk.com", - "beatsbydreuk.net", - "beatsbydreus.com", - "beatsbydrevipde.com", - "beatsbydrew.com", - "beatsbydrsmonsterinusa.com", - "beatsbymusic.net", - "beatsbysdrbre.com", - "beatsbysdrdres.com", - "beatscasque-france.com", - "beatscheap-nz.com", - "beatscheap-uk.com", - "beatscheapforsale.com", - "beatscollection2014.com", - "beatscustomblackfriday.com", - "beatsdanmark2013.com", - "beatsdrdre-headphones.com", - "beatsdrdre-it.com", - "beatsdrdre-solo.com", - "beatsdrdre2014.com", - "beatsdrdrecuffie.net", - "beatsdrdrekaufenschweiz.net", - "beatsdrdreneon.com", - "beatsdre-monster.com", - "beatsdre.net", - "beatsdre4cheap.com", - "beatsdrecheap.com", - "beatsdredreheadphones.com", - "beatsdreforsale.com", - "beatsdreinau.com", - "beatsdremonster-uk.com", - "beatsdrenewcolorful4usale.com", - "beatsdreoutletsale.com", - "beatsdresale2013.com", - "beatsdresalestore.com", - "beatsdresolo2013.com", - "beatsdreus.com", - "beatsearbudsheadphoness.com", - "beatselectronic.net", - "beatselectronics.com", - "beatsep.com", - "beatsep.net", - "beatsfacstore.com", - "beatsfactoroutlets.com", - "beatsfactorycollection.com", - "beatsfactoryoutles.com", - "beatsforcheap-usa.com", - "beatsforme.com", - "beatsfranceofficiel.com", - "beatsheadphones-discount.com", - "beatsheadphones1.com", - "beatsheadphones2u.com", - "beatsheadphonesale.com", - "beatsheadphonesdealer.com", - "beatsheadphonesforcheap.net", - "beatsheadphonesonline.com", - "beatsheadphoness.com", - "beatsheadphonestudio.com", - "beatsheadphonesusamall.com", - "beatshopuk.com", - "beatsincanada.com", - "beatsinsingapore.com", - "beatsireland.net", - "beatsjoy.com", - "beatsmonstersales.com", - "beatsmusic.com", - "beatsmusic.wang", - "beatsneon.com", - "beatsnzsale.com", - "beatsodre.com", - "beatsofdre-usa.com", - "beatsonblackfriday2013.com", - "beatsone.net", - "beatsoutlet.net", - "beatsoutletanytime.com", - "beatsoutletonlines.com", - "beatspascher-bydre.com", - "beatspascher-fr.net", - "beatspascher.net", - "beatspaschers.net", - "beatspillnewcolor.com", - "beatspills.com", - "beatspromonsterjp.com", - "beatspromotions.com", - "beatssales.com", - "beatssaleus.com", - "beatssaustraliabuy.com", - "beatssbyaustralia.com", - "beatssbydredanmark.com", - "beatsshop-uk.com", - "beatsshop-usa.com", - "beatsshopstore.com", - "beatssingapores.com", - "beatssingaporeshop.com", - "beatsstudiohodetelefoner.com", - "beatsstudiosite.com", - "beatstoreusa.com", - "beatsua.com", - "beatswholesale.us", - "beatswirelesscheap.com", - "beatswirelesscuffie.com", - "beatthatquote.com", - "beaumontcollege.ac.uk", - "beautifulandbusty.com", - "beautyandthebeastmusical.co.uk", - "beautyescortsamsterdam.com", - "bebepremium3.com.bo", - "bebirkbeck.ac.uk", + "bearteach.com", "bebo.com", - "beck.de", - "becomeindex.com", - "becoming-a-teacher.ac.uk", - "beddit.tv", - "bede.ac.uk", - "bedford.ac.uk", - "bedfordshire.ac.uk", - "bedfordsixthform.ac.uk", - "beds.ac.uk", - "bedsacl.ac.uk", - "bedstegratisporno.com", "beeg.com", - "beeg.rest", - "beegfree.com", - "beejp.net", - "beep.ac.uk", - "bees.ac.uk", + "beepool.com", + "beepool.org", "beevpn.com", - "befuck.com", - "befuck.net", - "begellhouse.com", - "begin-trade.com", "behance.net", - "behaviour4learning.ac.uk", - "behavioural-science.ac.uk", "behindkink.com", - "behindthescreenz.com", - "bei.ac.uk", - "beibao.com", "beijing1989.com", "beijing2022.art", - "beijingnike.com", "beijingspring.com", "beijingzx.org", - "beinghumanfestival.ac.uk", - "beinspiredatstaffs.ac.uk", - "beirc.ac.uk", - "beiyongzhan1.com", - "bejav.net", - "bejeweledstars.com", - "bejewled-stars.com", - "bekijkporno.nl", "belamionline.com", - "belfastinstitute.ac.uk", - "belfastmet.ac.uk", - "belfastmetropolitan.ac.uk", - "belfastmetropolitancollege.ac.uk", - "belfordcollege.ac.uk", - "bell.ac.uk", "bell.wiki", - "bellebound.com", - "bellerbys.ac.uk", - "bellesa.co", - "bellotube.com", - "bellsouth.net", - "belwue.net", - "bemix.ac.uk", "bemywife.cc", - "benaughty.fun", - "benc.ac.uk", - "bengalisexvideos.com", - "benliton.com", - "bentobox.tv", - "bep.ac.uk", - "bera.ac.uk", "beric.me", - "berkanawireless.com", - "berkeley.edu", - "berks-coll-ag.ac.uk", - "berkscollag.ac.uk", - "berlincompanions.com", "berlinerbericht.de", "berlintwitterwall.com", "berm.co.nz", - "bern.ac.uk", - "bernards.ac.uk", - "besa.ac.uk", - "besc.ac.uk", - "beside.ac.uk", - "bess.ac.uk", - "best-practice.se", - "best-sex-games.com", - "best.ac.uk", - "best4bim.com", - "bestbeats4u.com", - "bestbhy.com", - "bestbim.com", - "bestbuy-audio.com", - "bestbuy-communityrelations.com", - "bestbuy-giftcard.info", - "bestbuy-int.com", - "bestbuy-jobs.com", - "bestbuy.ca", - "bestbuy.com", - "bestbuy.com.mx", - "bestbuy.info", - "bestbuy24x7solutions.com", - "bestbuybusiness.com", - "bestbuybusinessadvantageaccount.com", - "bestbuycanada.ca", - "bestbuycanada.com", - "bestbuycanadaltd.ca", - "bestbuycharityclassic.com", - "bestbuycoffeemakers.com", - "bestbuyethics.com", - "bestbuyforbusiness.ca", - "bestbuygsm.com", - "bestbuyideax.com", - "bestbuyphotoworkshoptours.com", - "bestbuyrewards.com", - "bestbuyrewardzone.ca", - "bestbuys.com", - "bestbuysgeeksquad.com", - "bestbuysolutions.net", - "bestbuystores.com", - "bestbuytradein.com", - "bestbuyus.com", - "bestcamsites.net", - "besterpornos.com", - "bestescortgirls.nl", "bestforchina.org", - "bestfreecams.club", - "bestfreesexgames.com", - "bestfreetube.net", - "bestfreetube.xxx", - "bestgames-2022.com", "bestgore.com", - "besthandjobporn.com", - "besthentaitube.com", - "bestiality.guru", - "bestialitysextaboo.com", - "bestialitytaboo.tv", - "bestialityvideo.us", - "bestiphonestuff.com", - "bestjapanesepornsites.com", - "bestjavporn.com", - "bestjavporn.net", - "bestkinky.com", - "bestlistofporn.com", - "bestmallawards.com", - "bestofu.ac.uk", - "bestporn.su", - "bestpornclip.com", - "bestporncomix.com", - "bestporngames.com", - "bestpornsites.eu", - "bestpornsites.guide", "bestpornstardb.com", - "bestporntube.me", - "bestpremiumpornsite.com", - "bestrecipes.com.au", - "bestsexcam.com", - "bestshoesale2014.net", - "besttitstube.com", "bestvpn.com", "bestvpnanalysis.com", + "bestvpnforchina.net", "bestvpnserver.com", "bestvpnservice.com", "bestvpnusa.com", - "bestxxxsites.com", - "besuty99.com", - "besztbuy.com", "bet365.com", + "betaclouds.net", "betfair.com", - "beth.games", - "bethesda.net", - "bethesdagamestudios.com", - "bethsoft.com", - "betterbim.com", - "betterexplained.com", - "betterhdporn.com", "betternet.co", - "betternike.com", - "bettertogether.ac.uk", "bettervpn.com", - "betterwithautodesk.com", "bettween.com", "betvictor.com", - "between-legs.com", - "beurettesvideo.com", - "beverleycollege.ac.uk", "bewww.net", - "bexhillcollege.ac.uk", - "bexley.ac.uk", - "bexleycollege.ac.uk", - "bextbuy.com", - "beyondcore.com", "beyondfirewall.com", - "beyondtext.ac.uk", - "bffshd.com", - "bfmat.ac.uk", "bfnn.org", "bfsh.hk", - "bftv.ac.uk", - "bgc.ac.uk", "bgme.me", - "bgov.com", - "bgr.in", - "bgs.ac.uk", - "bgu.ac.uk", "bgvpn.com", - "bham.ac.uk", - "bhamcity.ac.uk", - "bhamcityuniversity.ac.uk", - "bhasvic.ac.uk", - "bhent.co.kr", - "bhggn.xyz", - "bhpgms.ac.uk", - "bhpms.ac.uk", - "bhrc.ac.uk", - "bhzyk.buzz", - "bhzyw2.top", - "biaa.ac.uk", - "biab.ac.uk", "bianlei.com", "biantailajiao.com", "biantailajiao.in", - "biaoqs.xyz", - "biaoqs1.xyz", - "biaoqs2.xyz", "biblesforamerica.org", - "bibliography.ac.uk", + "bibliocommons.com", "bibox.com", "bic2011.org", - "bicc.ac.uk", - "bicpa.ac.uk", - "bicton.ac.uk", - "bidbay.com", - "bidi.net.uk", - "bidong25.com", - "bidong9.com", - "bidorbuyindia.com", - "bids.ac.uk", "bidswitch.net", - "bidvestbank.co.za", - "biea.ac.uk", "biedian.me", - "bienvenuechezbestbuy.ca", "big.one", - "bigassporn.tv", - "bigbeans.solutions", - "bigbigchannel.com.hk", - "bigbigshop.com", - "bigblackdicklover.com", - "bigboobbundle.com", - "bigboobsalert.com", - "bigboobsandhotsex.com", - "bigboobsonline.org", - "bigboobspov.com", - "bigboobswives.com", - "bigboss.video", - "bigbuckbunny.org", - "bigcharts.com", - "bigcocker.com", - "bigdata-cdt.ac.uk", - "bigdata.ac.uk", - "bigdick.com", - "bigdickorgasm.com", - "bigf.ac.uk", "bigfools.com", - "biggggg.com", "biggo.com.tw", - "bighead.group", - "bighealthactuarialdata.ac.uk", - "bigidea.ac.uk", - "bigindiansex.mobi", "bigjapanesesex.com", "bigmoney.biz", "bignews.org", + "bignewsnetwork.com", "bigone.com", - "bigporn.com", - "bigsex.tv", "bigsound.org", - "bigtitangelawhite.com", - "bigtithitomi.com", - "bigtithooker.com", - "bigtitsextapes.com", - "bigtitsgallery.net", - "bigtitsmodelsdirectory.com", - "bigtitsthreesomes.com", - "bigtitterrynova.com", - "bigtitvenera.com", - "bigtopsites.com", - "biguz.net", - "bihg.ac.uk", - "biitii.com", - "bijukujo.club", - "bikaa.xyz", - "bikac.xyz", - "bikaios.xyz", - "bil.ac.uk", - "bilborough.ac.uk", "bild.de", - "bileta.ac.uk", - "bili2.cc", - "bili888.com", - "bili999.com", "bilibili.tv", - "biliplus.com", "biliworld.com", - "bilk.ac.uk", - "bill-safe.com", - "billmelater.com", - "billmelater.info", - "billmelater.net", - "billpoint.com", - "billpoint.info", - "billpoint.tv", - "billpoint.us", - "billpointnewzealand.com", "billypan.com", - "bilston.ac.uk", - "bim-360.com", - "bim360.com", - "bim360.net", - "bim360field.com", - "bim360glue.com", - "bim360ops.com", - "bim3dcontent.com", - "bimacademy.ac.uk", - "bimadsk.com", - "bimbim.com", - "bimbolive.com", - "bimglue.com", - "bimlibrary.com", - "bimm.ac.uk", - "bimmstudents.ac.uk", - "bimseeker.com", - "bimsource.com", - "bimworld.com", - "binads.com", - "binance.cc", - "binance.cloud", - "binance.co", "binance.com", - "binance.info", - "binance.me", - "binance.net", - "binance.org", "binance.us", - "binance.vision", - "binanceapi.com", - "binancecnt.com", - "binancezh.be", - "binancezh.biz", "binancezh.cc", - "binancezh.co", - "binancezh.com", - "binancezh.info", - "binancezh.ink", - "binancezh.kim", - "binancezh.link", - "binancezh.live", - "binancezh.mobi", - "binancezh.net", - "binancezh.pro", - "binancezh.sh", - "binancezh.top", "bing.com", - "bing.net", - "bing123.com", - "bingads.com", - "bingagencyawards.com", - "bingapis.com", - "bingapistatistics.com", - "bingparachute.com", - "bingsandbox.com", - "bingvisualsearch.com", - "bingworld.com", - "binoculus.com", - "bintray.com", "binux.me", "binwang.me", - "biobank.ac.uk", - "biobankingsolutions.ac.uk", - "biobankuk.ac.uk", - "biochar.ac.uk", - "bioethics.ac.uk", - "bioethicsweb.ac.uk", - "biofilms.ac.uk", - "bioinf.ac.uk", - "bioinfo.ac.uk", - "bioinformatics.ac.uk", - "biologists.com", - "biome.ac.uk", - "biomedcentral.com", - "bioone.org", - "bioporno.com", - "bioresearch.ac.uk", - "biorxiv.org", - "bioss.ac.uk", - "bioville.ac.uk", - "bioware.com", - "biowarestore.com", - "bioyork.ac.uk", "bipic.net", - "bips.ac.uk", - "biqle.org", - "biqle.ru", - "birbeckstratford.ac.uk", "bird.so", - "birkbeck.ac.uk", - "birkbeckstratford.ac.uk", - "birmingham-nottingham.ac.uk", - "birmingham.ac.uk", - "birminghamcity.ac.uk", - "birminghamcityuniversity.ac.uk", - "birminghamschoolofacting.ac.uk", - "bisa.ac.uk", - "bishopaucklandcollege.ac.uk", - "bishopb-college.ac.uk", - "bishopburton.ac.uk", - "bishopburtoncollege.ac.uk", - "bishopg.ac.uk", - "bisi.ac.uk", - "bisq.io", - "bisq.network", "bit-z.com", "bit.do", "bit.ly", - "bitballoon.com", - "bitbank.cc", "bitbay.net", - "bitbucket.io", - "bitbucket.org", - "bitchesgirls.com", - "bitchmomporn.com", "bitchute.com", - "bitcoin.org", "bitcointalk.org", "bitcoinworld.com", - "bite.ac.uk", "bitfinex.com", - "bitflyer.com", - "bitflyer.jp", "bitget.com", "bithumb.com", "bitinka.com.ar", - "bitly.com", - "bitly.is", "bitmex.com", - "bitnami.com", - "bitnamiapp.com", - "bitnamistudio.com", - "bitporno.com", - "bitquick.co", "bitshare.com", "bitsnoop.com", - "bitsquare.io", - "bitstamp.net", - "bitstream.com", "bitterwinter.org", - "bittrex.com", "bitvise.com", - "bitwarden.com", - "bitwarden.eu", - "bitwarden.net", "bitz.ai", "bitz.com", - "bizarresexuality.com", "bizhat.com", - "bizographics.com", - "bjini.cc", "bjnewlife.org", "bjs.org", "bjzc.org", - "bkkdown.site", "bl-doujinsouko.com", - "black-country.ac.uk", - "blackamateurfuck.com", - "blackamateursvideos.com", - "blackandasiangrad.ac.uk", - "blackandstacked.com", - "blackboxgames.com", - "blackburn.ac.uk", - "blackcountryandmarchesiot.ac.uk", "blacked.com", - "blackfridaydrebeatsnew.com", - "blackfridaydrebeatsshop.com", - "blackhomeporn.com", "blacklogic.com", - "blackmonsterterror.com", - "blackpool-acl.ac.uk", - "blackpool.ac.uk", - "blackpoolsixth.ac.uk", - "blackshemalevideo.com", - "blacksonblondes.com", - "blackstonespoliceservice.com", - "blacktowhite.net", "blackvpn.com", - "blake.ac.uk", - "blaoshi.cc", - "blazor.net", - "blc.ac.uk", - "ble.ac.uk", - "blend-ed.ac.uk", - "blender.org", "blewpass.com", "blingblingsquad.net", - "blink.org", - "blinkload.zone", "blinkx.com", "blinw.com", "blip.tv", - "blizzak-juken.jp", - "blizzard.com", - "blizzardgearstore.com", - "blms.ac.uk", "blockcast.it", "blockcn.com", "blockedbyhk.com", - "blockfrost.io", "blockless.com", "blocktempo.com", "blog.de", @@ -3974,15 +666,11 @@ var rules = [ "blogcatalog.com", "blogcity.me", "blogdns.org", - "blogebay.com", "blogger.com", - "bloggrowup.com", "blogimg.jp", - "blogism.jp", + "blogjav.net", "bloglines.com", "bloglovin.com", - "blogo.jp", - "blogoverflow.com", "blogs.com", "blogspot.ae", "blogspot.al", @@ -3990,19 +678,11 @@ var rules = [ "blogspot.ba", "blogspot.be", "blogspot.bg", - "blogspot.bj", "blogspot.ca", "blogspot.cat", - "blogspot.cf", "blogspot.ch", "blogspot.cl", - "blogspot.co.at", - "blogspot.co.id", - "blogspot.co.il", - "blogspot.co.ke", - "blogspot.co.nz", "blogspot.co.uk", - "blogspot.co.za", "blogspot.com", "blogspot.com.ar", "blogspot.com.au", @@ -4017,7 +697,6 @@ var rules = [ "blogspot.com.ng", "blogspot.com.tr", "blogspot.com.uy", - "blogspot.cv", "blogspot.cz", "blogspot.de", "blogspot.dk", @@ -4045,1602 +724,231 @@ var rules = [ "blogspot.pe", "blogspot.pt", "blogspot.qa", - "blogspot.re", "blogspot.ro", - "blogspot.rs", "blogspot.ru", "blogspot.se", "blogspot.sg", "blogspot.si", "blogspot.sk", "blogspot.sn", - "blogspot.td", "blogspot.tw", "blogspot.ug", - "blogspot.vn", "blogtd.net", "blogtd.org", - "blogterest.net", "bloodshed.net", "bloomberg.cn", - "bloomberg.co.jp", - "bloomberg.co.kr", "bloomberg.com", - "bloomberg.com.br", "bloomberg.de", - "bloomberg.fm", - "bloomberg.tv", - "bloombergapps.com", - "bloombergarcade.com", - "bloombergbeta.com", - "bloombergbna.com", - "bloombergbreakaway.com", - "bloombergbriefs.com", - "bloombergchina.com", - "bloombergenvironment.com", - "bloombergforeducation.com", - "bloomberggovernment.com", - "bloombergindices.com", - "bloombergindustry.com", - "bloomberglabs.com", - "bloomberglaw.com", - "bloomberglive.com", - "bloomberglp.com", - "bloombergmedia.com", - "bloombergnext.com", - "bloombergpolarlake.com", - "bloombergprep.com", - "bloombergquint.com", - "bloombergradio.com", - "bloombergsef.com", - "bloombergspace.com", - "bloombergstatus.com", - "bloombergsurvey.com", - "bloombergtax.com", - "bloombergtax1.com", - "bloombergtaxtech.com", - "bloombergtradingchallenge.com", - "bloombergtv.mn", - "bloombergvault.com", "bloombergview.com", "bloomfortune.com", - "bloommicroventures.com", - "bloomsbury.ac.uk", - "bloomsburycollections.com", - "bloomsburydesignlibrary.com", - "bloomsburydtc.ac.uk", - "bloomsburyinstitute.ac.uk", - "blowjobit.com", - "blowjobqueens.net", - "blpcareers.com", - "blpevents.com", - "blpprofessional.com", "blubrry.com", "blueangellive.com", - "bluearchive.jp", - "bluefootcms.com", - "bluegreencities.ac.uk", - "bluehatil.com", - "bluehatnights.com", - "bluekai.com", - "bluemix.com", - "bluemix.net", - "bluestacks.com", - "bluestone.ac.uk", - "bluffyporn.com", - "blurams.com", - "blws.ac.uk", - "blylq.buzz", - "blz-contentstack.com", - "bm14.ac.uk", - "bmac.ac.uk", - "bmc.ac.uk", - "bme.ac.uk", - "bmet.ac.uk", - "bmetc.ac.uk", + "bmdru.com", "bmfinn.com", - "bmia.org", - "bmj.com", - "bml.info", - "bms.ac.uk", - "bmth-poole-cad.ac.uk", - "bmth.ac.uk", - "bmva.ac.uk", - "bmw-abudhabi.com", - "bmw-adventskalender.com", - "bmw-albania.com", - "bmw-antilles.fr", - "bmw-art-journey.com", - "bmw-arts-design.com", - "bmw-asia.com", - "bmw-auslieferungszentrum.com", - "bmw-authority-vehicles.com", - "bmw-bahrain.com", - "bmw-businessdrive.com", - "bmw-calgary.ca", - "bmw-carit.de", - "bmw-classic.com", - "bmw-clubs-international.com", - "bmw-connected-drive.com", - "bmw-connecteddrive.ae", - "bmw-connecteddrive.at", - "bmw-connecteddrive.be", - "bmw-connecteddrive.bg", - "bmw-connecteddrive.ca", - "bmw-connecteddrive.ch", - "bmw-connecteddrive.co.nz", - "bmw-connecteddrive.co.uk", - "bmw-connecteddrive.co.za", - "bmw-connecteddrive.com", - "bmw-connecteddrive.com.au", - "bmw-connecteddrive.com.br", - "bmw-connecteddrive.com.cy", - "bmw-connecteddrive.com.hr", - "bmw-connecteddrive.com.kw", - "bmw-connecteddrive.com.mt", - "bmw-connecteddrive.cz", - "bmw-connecteddrive.de", - "bmw-connecteddrive.dk", - "bmw-connecteddrive.ee", - "bmw-connecteddrive.es", - "bmw-connecteddrive.fi", - "bmw-connecteddrive.fr", - "bmw-connecteddrive.gr", - "bmw-connecteddrive.hu", - "bmw-connecteddrive.ie", - "bmw-connecteddrive.it", - "bmw-connecteddrive.jp", - "bmw-connecteddrive.kr", - "bmw-connecteddrive.lt", - "bmw-connecteddrive.lu", - "bmw-connecteddrive.lv", - "bmw-connecteddrive.mx", - "bmw-connecteddrive.my", - "bmw-connecteddrive.nl", - "bmw-connecteddrive.no", - "bmw-connecteddrive.pl", - "bmw-connecteddrive.pt", - "bmw-connecteddrive.ro", - "bmw-connecteddrive.ru", - "bmw-connecteddrive.se", - "bmw-connecteddrive.sg", - "bmw-connecteddrive.si", - "bmw-connecteddrive.sk", - "bmw-connecteddrive.tw", - "bmw-corporate-sales.com", - "bmw-diplomatic-sales.com", - "bmw-driving-center.co.kr", - "bmw-drivingexperience.com", - "bmw-dubai.com", - "bmw-eg.com", - "bmw-fleet.net", - "bmw-ghana.com", - "bmw-golfsport.com", - "bmw-group.com", - "bmw-group.net", - "bmw-grouparchiv.de", - "bmw-grouparchives.com", - "bmw-gta.ca", - "bmw-i-pure-impulse.com", - "bmw-i.jp", - "bmw-int1.com", - "bmw-iraq.com", - "bmw-jordan.com", - "bmw-konzernarchiv.de", - "bmw-ksa.com", - "bmw-kuwait.com", - "bmw-lao.la", - "bmw-lebanon.com", - "bmw-m-safetycar.com", - "bmw-m.com", - "bmw-mdrivetour.com", - "bmw-me.com", - "bmw-military-sales.com", - "bmw-motorcycle.com", - "bmw-motorcycles.vn", - "bmw-motorrad-abudhabi.com", - "bmw-motorrad-authorities.com", - "bmw-motorrad-dubai.com", - "bmw-motorrad-motorsport.com", - "bmw-motorrad-now-or-never.com", - "bmw-motorrad-service-inclusive.com", - "bmw-motorrad-test-ride.com", - "bmw-motorrad.at", - "bmw-motorrad.be", - "bmw-motorrad.bg", - "bmw-motorrad.bh", - "bmw-motorrad.bo", - "bmw-motorrad.ca", - "bmw-motorrad.ch", - "bmw-motorrad.cl", - "bmw-motorrad.co", - "bmw-motorrad.co.id", - "bmw-motorrad.co.kr", - "bmw-motorrad.co.nz", - "bmw-motorrad.co.th", - "bmw-motorrad.co.uk", - "bmw-motorrad.co.za", - "bmw-motorrad.com", - "bmw-motorrad.com.ar", - "bmw-motorrad.com.au", - "bmw-motorrad.com.br", - "bmw-motorrad.com.do", - "bmw-motorrad.com.hr", - "bmw-motorrad.com.mx", - "bmw-motorrad.com.my", - "bmw-motorrad.com.pe", - "bmw-motorrad.com.py", - "bmw-motorrad.com.tr", - "bmw-motorrad.cr", - "bmw-motorrad.cz", - "bmw-motorrad.de", - "bmw-motorrad.dk", - "bmw-motorrad.dz", - "bmw-motorrad.ec", - "bmw-motorrad.ee", - "bmw-motorrad.es", - "bmw-motorrad.fi", - "bmw-motorrad.fr", - "bmw-motorrad.gr", - "bmw-motorrad.gt", - "bmw-motorrad.hu", - "bmw-motorrad.in", - "bmw-motorrad.it", - "bmw-motorrad.jp", - "bmw-motorrad.lu", - "bmw-motorrad.ma", - "bmw-motorrad.nl", - "bmw-motorrad.no", - "bmw-motorrad.pa", - "bmw-motorrad.pl", - "bmw-motorrad.pt", - "bmw-motorrad.ro", - "bmw-motorrad.rs", - "bmw-motorrad.ru", - "bmw-motorrad.sa", - "bmw-motorrad.se", - "bmw-motorrad.si", - "bmw-motorrad.sk", - "bmw-motorrad.sv", - "bmw-motorrad.tw", - "bmw-motorrad.ua", - "bmw-motorrad.uy", - "bmw-motorsport.com", - "bmw-mountains.com", - "bmw-museum.com", - "bmw-museum.net", - "bmw-nigeria.com", - "bmw-oman.com", - "bmw-ottawa.ca", - "bmw-pakistan.com", - "bmw-plant-munich.com", - "bmw-pma.com.sg", - "bmw-powertrain.com", - "bmw-product-highlights.com", - "bmw-qatar.com", - "bmw-routes.com", - "bmw-rp.com", - "bmw-rrdays.com", - "bmw-saudiarabia.com", - "bmw-security-vehicles.com", - "bmw-special-sales.com", - "bmw-sports.com", - "bmw-sudan.com", - "bmw-tahiti.com", - "bmw-tunisia.com", - "bmw-vancouver.ca", - "bmw-voli.me", - "bmw-welt.com", - "bmw-welt.net", - "bmw-welt.tv", - "bmw-werk-berlin.de", - "bmw-world.com", - "bmw-world.net", - "bmw-world.tv", - "bmw-worldfinal.com", - "bmw-yachtsport.com", - "bmw-yeg.ca", - "bmw-yemen.com", - "bmw.am", - "bmw.at", - "bmw.az", - "bmw.ba", - "bmw.bb", - "bmw.be", - "bmw.bg", - "bmw.bm", - "bmw.bs", - "bmw.by", - "bmw.ca", - "bmw.cc", - "bmw.ch", - "bmw.cl", - "bmw.co.ao", - "bmw.co.cr", - "bmw.co.id", - "bmw.co.il", - "bmw.co.jp", - "bmw.co.ke", - "bmw.co.kr", - "bmw.co.nz", - "bmw.co.th", - "bmw.co.uk", - "bmw.co.za", - "bmw.com", - "bmw.com.ar", - "bmw.com.au", - "bmw.com.bd", - "bmw.com.bn", - "bmw.com.bo", - "bmw.com.br", - "bmw.com.co", - "bmw.com.cy", - "bmw.com.do", - "bmw.com.ec", - "bmw.com.ge", - "bmw.com.gt", - "bmw.com.kh", - "bmw.com.ky", - "bmw.com.mk", - "bmw.com.mo", - "bmw.com.mt", - "bmw.com.mx", - "bmw.com.my", - "bmw.com.ni", - "bmw.com.pa", - "bmw.com.pe", - "bmw.com.ph", - "bmw.com.py", - "bmw.com.sg", - "bmw.com.sv", - "bmw.com.tr", - "bmw.com.tw", - "bmw.com.uy", - "bmw.com.ve", - "bmw.cw", - "bmw.cz", - "bmw.de", - "bmw.dk", - "bmw.dz", - "bmw.ee", - "bmw.es", - "bmw.fi", - "bmw.fr", - "bmw.gp", - "bmw.gr", - "bmw.hn", - "bmw.hr", - "bmw.ht", - "bmw.hu", - "bmw.ie", - "bmw.in", - "bmw.is", - "bmw.it", - "bmw.kg", - "bmw.kz", - "bmw.lc", - "bmw.lk", - "bmw.lt", - "bmw.lu", - "bmw.lv", - "bmw.ly", - "bmw.ma", - "bmw.md", - "bmw.mn", - "bmw.mq", - "bmw.mu", - "bmw.nc", - "bmw.nl", - "bmw.no", - "bmw.pl", - "bmw.ps", - "bmw.pt", - "bmw.re", - "bmw.ro", - "bmw.rs", - "bmw.se", - "bmw.si", - "bmw.sk", - "bmw.sn", - "bmw.tm", - "bmw.tt", - "bmw.ua", - "bmw.uz", - "bmw.vn", - "bmwarchiv.at", - "bmwarchiv.de", - "bmwartjourney.com", - "bmwasia.com", - "bmwauslieferungszentrum.com", - "bmwbikes.com", - "bmwbkk.de", - "bmwccrc.ca", - "bmwcenternet.com", - "bmwchampionship.com", - "bmwchampionshipusa.com", - "bmwcharitygolf.com", - "bmwcitychallenge.com", - "bmwclassic.com", - "bmwcolorado.com", - "bmwconnecteddrive.com", - "bmwcustomapparel.com", - "bmwdcsnet.net", - "bmwdealercareers.com", - "bmwdealerdirect.com", - "bmwdelawarevalley.com", - "bmwfilms.com", - "bmwgroup-classic-heart.com", - "bmwgroup-classic.com", - "bmwgroup-gaad.com", - "bmwgroup-plants.com", - "bmwgroup-posdigital.com", - "bmwgroup-werke.com", - "bmwgroup.at", - "bmwgroup.com", - "bmwgroup.jobs", - "bmwgroup.net", - "bmwgroupclassic.com", - "bmwgroupdesignworks.com", - "bmwgroupdirect.com", - "bmwgroupfs.com", - "bmwgroupinfobahn.com", - "bmwgroupna.com", - "bmwhk.com", - "bmwi.ca", - "bmwi.jp", - "bmwiventures.com", - "bmwjamaica.com", - "bmwlat.com", - "bmwlifestyle.ca", - "bmwm.com", - "bmwmagazine.com", - "bmwmagazine.de", - "bmwmass.com", - "bmwmass.net", - "bmwmc.net", - "bmwmontreal.ca", - "bmwmotorcycles.com", - "bmwmotorcycleusa.com", - "bmwmotorrad.co.kr", - "bmwmotorrad.com.au", - "bmwmotorrad.com.ph", - "bmwmotorrad.com.sg", - "bmwmotorradhk.com", - "bmwmotorshowblog.com", - "bmwmotorsport.com", - "bmwmperformance.com", - "bmwmuseum.net", - "bmwmyanmar.com", - "bmwofannapolis.com", - "bmwofcentralpa.com", - "bmwoftulsa.com", - "bmwondemandusa.com", - "bmworegon.com", - "bmwperformancecenter.com", - "bmwpittsburgh.com", - "bmwproductnews.com", - "bmwsafari.com", - "bmwsfl.com", - "bmwsfl.net", - "bmwshop.ca", - "bmwspecialoffers.ca", - "bmwsports.com", - "bmwstartupgarage.com", - "bmwstep.com", - "bmwstepconnections.com", - "bmwsummerschool.com", - "bmwtampabay.com", - "bmwusa.com", - "bmwusaservice.com", - "bmwusatires.com", - "bmwusfactory.com", - "bmwusrideracademy.com", - "bmwvalueservice.com", - "bmwwholesaleconnect.com", - "bmwworld.com", - "bmwworld.net", - "bmwworld.tv", - "bmwzentrum.com", - "bn5x.net", - "bnac.ac.uk", "bnbstatic.com", - "bnef.com", "bnews.co", "bnext.com.tw", "bnn.co", "bnrmetal.com", "bntrace.com", - "bnu.ac.uk", - "boa.ac.uk", "boardreader.com", - "bobble.ac.uk", - "boboporn.com", - "boboporn.net", - "bobovip.cc", - "bobs-tube.com", - "bobvoyeur.com", - "bocici.buzz", "bod.asia", - "bodc.ac.uk", - "bodgirls.com", "bodog88.com", - "bodyandsoul.com.au", - "bodyfluids-jav.com", - "bognor-training.ac.uk", - "bognor.ac.uk", - "bokep.net", - "bokepseks.org", - "bokepvidz.com", "bolehvpn.net", - "bollywoodlife.com", - "bolt.ac.uk", - "boltdns.net", - "bolton-college.ac.uk", - "bolton-community-college.ac.uk", - "bolton-sfc.ac.uk", - "bolton.ac.uk", - "boltoncc.ac.uk", - "boltoncollege.ac.uk", - "boltoncollege365.ac.uk", - "boltoncollegestem.ac.uk", - "boltonsix.ac.uk", - "bon.ac.uk", "bonbonme.com", "bonbonsex.com", - "bondagecomixxx.net", - "bondagesex-xxx.com", - "bondagesm.xyz", - "bone.ac.uk", - "bonedathome.com", "bonfoundation.org", "bongacams.com", - "bonyu.cyou", - "boobieblog.com", - "boobpedia.com", - "boobsrealm.com", "boobstagram.com", - "boodigo.com", - "boodigogo.com", "book.com.tw", - "book18.org", - "book4you.org", - "bookclubcorner.com", - "bookclubgirl.com", "bookdepository.com", "bookepub.com", - "bookfi.net", - "bookhad.ac.uk", - "booking.com", - "bookmark.xxx", - "bookmybridgestonetyre.com", - "bookonsky.net", "books.com.tw", - "booksc.eu", - "booksc.me", - "booksc.org", - "booksc.xyz", - "bookshome.info", - "bookshome.net", - "bookshome.world", - "booksinprint.com", - "bookstagram.com", "booktopia.com.au", - "booloo.com", - "boomba.club", - "boomerang.com", + "bookwalker.com.tw", "boomssr.com", - "booru.org", - "booth.pm", "bootstrapcdn.com", - "bootyliciousmag.com", - "bootysource.com", - "bopcris.ac.uk", - "boqimod.com", - "boqitube.cc", - "borderlessprepaid.com", - "bordersandborderlands.ac.uk", - "borderscollege.ac.uk", "borgenmagazine.com", - "boringcompany.com", - "borneo.world", - "borneoasia.com", - "borneoschematic.com", - "borwap.com", - "bosco.ac.uk", - "boshancy.com", - "bosharso.net", - "boslife.biz", - "boslife.net", - "bossae.com", - "bossagency.co.uk", - "bosta.ac.uk", - "bostaa.ac.uk", - "boston.ac.uk", - "bostoncentre.ac.uk", - "boswp.com", "bot.nu", "botanwang.com", - "botframework.com", - "botorch.org", - "botstop.com", - "boulx.com", - "boundhub.com", - "bountyhunterporn.com", - "bourne.ac.uk", - "bournemouth.ac.uk", - "bournemouthandpoole-cfe.ac.uk", - "bournville.ac.uk", "bowenpress.com", - "bowlroll.net", - "bowsersinsidestory.com", "box.com", "box.net", - "box57.one", - "boxofficemojo.com", "boxpn.com", "boxun.com", "boxun.tv", "boxunblog.com", "boxunclub.com", - "boy18tube.com", "boyangu.com", - "boycall.com", "boyfriendtv.com", - "boylabs.net", - "boylove.cc", - "boylove.com", - "boylove.live", - "boylove1.cc", - "boyloves.cc", - "boypost.com", "boysfood.com", "boysmaster.com", - "boyspornpics.com", - "boyvid.com", - "boyztube.com", - "bpa.ac.uk", - "bpc.ac.uk", - "bpcoll.ac.uk", - "bpmf.ac.uk", - "bppuniversity.ac.uk", - "bps.ac.uk", "br.st", - "bracknell.ac.uk", - "brad.ac.uk", - "bradcoll.ac.uk", - "bradford.ac.uk", - "bradfordcollege.ac.uk", - "bradforduni-recruitment.ac.uk", - "braeburncapital.com", - "brain.ac.uk", - "brainsimagebank.ac.uk", - "braintree.ac.uk", - "braintreegateway.com", - "braintreegateway.tv", - "braintreepayments.com", - "braintreepayments.info", - "braintreepayments.org", - "braintreepayments.tv", - "braintreepaymentsolutions.com", - "braintreeps.com", "brainyquote.com", - "brais.ac.uk", - "brams.ac.uk", - "branchportal.com", - "brand-protection-team.com", - "brandeasygo.com", - "brandelectronic.com", "brandonhutchinson.com", - "brandporno.com", - "brandproducts1688.com", - "brands098.com", - "brasilincesto.com", - "brasiltudoliberado.com", - "brasshouse.ac.uk", "braumeister.org", "brave.com", - "braventures.com", - "braveux.com", - "bravoerotica.com", - "bravoporn.com", - "bravoteens.com", "bravotube.net", - "bravotube.tv", - "brazilpartneruniversity.com", - "brazzer.com", - "brazzers-porno.online", - "brazzers-xxx.net", "brazzers.com", - "brazzers.xxx", - "brazzersnetwork.com", - "brazzersporn.mobi", - "brazzfan.com", - "brc.ac.uk", - "brdteengal.com", "breached.to", "break.com", - "breakdown.me", "breakgfw.com", "breaking911.com", - "breakingofbritain.ac.uk", "breakingtweets.com", "breakwall.net", - "breasthealthinfo.com", - "breath-takers.com", - "breitbart.com", - "brent-acl.ac.uk", - "brentstart.ac.uk", - "brepolis.net", - "bretton.ac.uk", - "brew.sh", - "brewmp.com", - "briantreepayments.net", - "briantreepayments.tv", - "bricoltech.ac.uk", - "bridgce.ac.uk", - "bridge-studio.co.uk", - "bridgebim.com", - "bridgecollege.ac.uk", - "bridgend.ac.uk", - "bridgendcollege.ac.uk", - "bridgestone-asiapacific.com", - "bridgestone-bandag.com", - "bridgestone-brand.com", - "bridgestone-business-service.jp", - "bridgestone-korea.co.kr", - "bridgestone-plt-eng.com", - "bridgestone-tac-oman.com", - "bridgestone.cl", - "bridgestone.co.cr", - "bridgestone.co.id", - "bridgestone.co.in", - "bridgestone.co.jp", - "bridgestone.co.th", - "bridgestone.com", - "bridgestone.com.ar", - "bridgestone.com.br", - "bridgestone.com.co", - "bridgestone.com.mx", - "bridgestone.com.sg", - "bridgestone.com.tw", - "bridgestone.com.vn", - "bridgestoneamericas.com", - "bridgestonearena.com", - "bridgestonecntc.com", - "bridgestonecomercial.cl", - "bridgestonecomercial.co.cr", - "bridgestonecomercial.com.ar", - "bridgestonecomercial.com.br", - "bridgestonecomercial.com.co", - "bridgestonecomercial.com.mx", - "bridgestonegolf.com", - "bridgestonegz.com", - "bridgestonela.com", - "bridgestonemarketing.com", - "bridgestonemerchandise.com", - "bridgestonenationalfleet.com", - "bridgestoneperformance.com", - "bridgestoneperformancemedia.net", - "bridgestonerapiddelivery.com", - "bridgestonerewards.com", - "bridgestonesyb.com", - "bridgestonetire.ca", - "bridgestonetire.com", - "bridgestonetyre.com.my", - "bridgestonevan.com", - "bridgestonewx.com", - "bridgwater.ac.uk", "briefdream.com", - "brightcove.com", - "brightcove.net", - "brightcove.services", - "brightcovecdn.com", - "brightline.tv", - "brighton.ac.uk", - "brightonandsussexmedicalschool.ac.uk", - "brightoncity.ac.uk", - "brightoncitycollege.ac.uk", - "brightonlegacy.ac.uk", - "brightonmedicalschool.ac.uk", - "brightstudy.ac.uk", "briian.com", - "brilcom.ac.uk", "brill.com", - "brilliant.org", - "brin.ac.uk", - "brinsbury.ac.uk", - "brinsburycollege.ac.uk", - "brinscoll.ac.uk", - "bris.ac.uk", - "brismes.ac.uk", - "bristol-baptist.ac.uk", - "bristol.ac.uk", - "bristolinstituteoflegalpractice.ac.uk", - "bristollawschool.ac.uk", - "bristolroboticslaboratory.ac.uk", - "bristoltheological.ac.uk", - "bristoluwe.ac.uk", - "britac.ac.uk", - "britarch.ac.uk", - "britcollege.ac.uk", - "british-antarctic-survey.ac.uk", - "british-geological-survey.ac.uk", - "british-history.ac.uk", - "british-museum.ac.uk", - "britishacademy.ac.uk", - "britishart.ac.uk", - "britishartstudies.ac.uk", - "britishelectionstudy.ac.uk", - "britishlibrary.ac.uk", - "britishludwigwittgensociety.ac.uk", - "britishmuseum.ac.uk", - "britishwittgensteinsociety.ac.uk", - "britsexcash.com", "brizzly.com", "brkmd.com", - "brl.ac.uk", - "brnc.ac.uk", - "brni.com", - "broadbandreports.com", "broadbook.com", "broadpressinc.com", - "broadstairscollege.ac.uk", - "brocaproject.com", - "brock.ac.uk", "brockbbs.com", - "brokenteens.com", - "bromite.org", - "bromley.ac.uk", - "bromleyadulteducation.ac.uk", - "bromleyapps.ac.uk", - "bromo.com", - "bronch.ac.uk", - "bronto.com", - "brookehouse.ac.uk", - "brookes.ac.uk", "brookings.edu", - "brooklands.ac.uk", - "brooks.ac.uk", - "brooksby.ac.uk", - "brooksbymelton.ac.uk", - "broomfield.ac.uk", - "broomsbarn.ac.uk", - "brotli.org", - "brourou.com", - "browser-intake-datadoghq.com", - "browserleaks.com", - "brox-coll.ac.uk", - "broxtowe.ac.uk", "brucewang.net", - "bruford.ac.uk", - "brunel.ac.uk", - "bruneldigital.ac.uk", - "bruneluniversitylondon.ac.uk", - "brutalbdsmtube.com", - "brutalfetish.com", "brutaltgp.com", - "bs-adreview.com", - "bs-awh.ne.jp", - "bsa.ac.uk", - "bsaw.ac.uk", - "bsbec.ac.uk", - "bsdc.ac.uk", - "bsfc.ac.uk", - "bsg.ac.uk", - "bshm.ac.uk", - "bsix.ac.uk", - "bsixbrookehouse.ac.uk", - "bsixbrookehousesixthformcollege.ac.uk", - "bsixcollege.ac.uk", "bsky.app", "bsky.network", "bsky.social", - "bsls.ac.uk", - "bsmb.ac.uk", - "bsms.ac.uk", - "bsmslegacy.ac.uk", - "bsnti.ac.uk", - "bso.ac.uk", - "bsom.ac.uk", - "bsr.ac.uk", - "bsrg.ac.uk", - "bssd.ac.uk", - "bssh.ac.uk", - "bstatic.com", - "bsu.ac.uk", - "bsw.co.jp", - "bsw.jp", - "bsxm1213.pro", "bt2mag.com", "bt95.com", "btaia.com", - "btas.ac.uk", + "btbit.net", "btbtav.com", - "btc.ac.uk", + "btbtt.co", + "btbtt.me", + "btc.com", "btc98.com", "btcbank.bank", - "btcbox.co.jp", "btctrade.im", "btdig.com", "btdigg.org", - "btec.co.uk", + "btguard.com", "btku.me", "btku.org", - "bton.ac.uk", - "btrp-hyperpolarised.ac.uk", "btspread.com", "btsynckeys.com", - "btt804.com", - "btt904.com", - "bttzyw.com", - "bttzyw.net", - "btwrdn.com", - "buba.ac.uk", - "bubbaporn.com", - "bubl.ac.uk", - "buck.ac.uk", - "buck.build", - "buckbuild.com", - "bucketeer.jp", - "buckingham.ac.uk", - "buckinghamshire.ac.uk", - "bucks.ac.uk", - "buckscol.ac.uk", - "buckscollege.ac.uk", - "buckscollegegroup.ac.uk", - "bucksnewuni.ac.uk", "budaedu.org", - "budatt.com", "buddhanet.com.tw", "buddhistchannel.tv", - "buddymedia.com", - "bufdg.ac.uk", "buffered.com", - "bufvc.ac.uk", - "bugzilla.org", - "buhidoh.net", - "bui.ac.uk", - "buic.ac.uk", - "buicha.social", - "buila.ac.uk", - "building3dcontent.com", - "builtenvsigns.ac.uk", - "builtfromebay.com", - "bukkake-jav.com", "bullguard.com", "bullog.org", "bullogger.com", - "bululusexdoll.com", "bumingbai.net", - "bumpshare.com", - "bumptop.ca", - "bumptop.com", - "bumptop.net", - "bumptop.org", - "bumptunes.com", "bunbunhk.com", - "bunnylust.com", - "burningcamel.com", - "burnley.ac.uk", - "burstly.net", - "burstlyrewards.com", - "burton-college.ac.uk", - "burton-southderbyshirecollege.ac.uk", - "burton.ac.uk", - "burtonandsouthderbyshirecollege.ac.uk", - "buryacl.ac.uk", - "burycollege.ac.uk", "busayari.com", "business-humanrights.org", - "business-i.jp", - "business-intelligence.ac.uk", "business.page", "business.site", - "businessaccess.ac.uk", - "businesscatalyst.com", - "businesscove-blackcountry.ac.uk", - "businessfocus.io", - "businessinsider.co.za", "businessinsider.com", "businessinsider.com.au", - "businessinsider.com.pl", - "businessinsider.de", - "businessinsider.es", - "businessinsider.fr", - "businessinsider.in", - "businessinsider.jp", - "businessinsider.mx", - "businessinsider.my", - "businessinsider.nl", - "businessinsider.sg", "businesstoday.com.tw", - "businesswebwise.com", "businessweek.com", "businessweekly.com.tw", - "businessweekmag.com", - "bustyangelique.com", - "bustyarianna.com", - "bustydanniashe.com", - "bustydustystash.com", - "bustyinescudna.com", - "bustykellykay.com", - "bustykerrymarie.com", - "bustylornamorgan.com", - "bustymerilyn.com", - "bustymomsvideo.com", - "bustynudebabes.com", - "bustyoldsluts.com", - "bustysammieblack.com", "busu.org", "busytrade.com", - "butex.ac.uk", "buugaa.com", - "buxtoncollege.ac.uk", - "buy-from-shanghai.com", - "buyaapl.com", - "buyaapl.net", - "buyaltera.com", - "buyaple.com", - "buybeatsbydre-uk.com", - "buybeatsheadphonesbydre.com", - "buycheapbeatsbus.com", - "buycheapbeatsbydre.com", - "buycheapbeatsbydreshop.com", - "buycheapbeatsdreuk.com", - "buydrdrebeatbox.com", - "buyfast-paysmart.net", - "buyingfacebooklikes.com", - "buyitnow.com", - "buyitnow.net", - "buyitnow.org", - "buyitnow.tv", - "buyitnowshop.net", - "buymeacoff.ee", - "buymeacoffee.com", - "buyminibeatbox.com", - "buynikechina.com", - "buyoculus.com", - "buyonlineheadphones.com", - "buypass-ssl.com", - "buypass.com", - "buypass.no", - "buypass.se", - "buyshoponly.com", - "buzzardflapper.com", - "buzzav.com", "buzzhand.com", "buzzhand.net", "buzzorange.com", "buzzsprout.com", - "bvdinfo.com", "bvpn.com", "bwbx.io", "bwgyhw.com", "bwh1.net", - "bwh8.net", - "bwh81.net", - "bwh88.net", - "bwh89.net", - "bwhstatus.com", - "bwin.com", - "bwrhub.ac.uk", - "bws.ac.uk", "bwsj.hk", "bx.in.th", "bx.tl", - "byam-shaw.ac.uk", - "byapis.com", - "bybeatsdre.com", - "bybit-exchange.github.io", "bybit.com", - "bycbe.com", - "bycsi.com", - "bydrebeats.com", - "bygpp1207.world", - "byjav.me", - "byjhd.com", - "bymj.io", "bynet.co.il", "bypasscensorship.org", "byrut.org", - "byspotify.com", "byteoversea.com", - "bytick.com", - "byzantine-ahrb-centre.ac.uk", - "byzantium.ac.uk", "c-est-simple.com", - "c-ij.com", - "c-scaipe.ac.uk", "c-span.org", "c-spanvideo.org", - "c0930.com", "c100tibet.org", "c2cx.com", - "c4ccetl.ac.uk", - "c4rex.co", - "c4slive.com", + "c3pool.com", "ca.gov", - "caacentre.ac.uk", - "caadoc.ac.uk", - "caagcc.ac.uk", - "caban.ac.uk", "cableav.tv", - "cableav.xyz", "cablegatesearch.net", - "cabletv.com.hk", - "cabletvdirectv.com", - "cabot.ac.uk", "cachefly.com", "cachefly.net", "cachinese.com", "cacnw.com", "cactusvpn.com", - "cad-mep.com", - "cadarn.ac.uk", - "cadarnskillscentre.ac.uk", - "cadbury.ac.uk", - "cadburycollege.ac.uk", - "cadcamsystemsinc.com", - "cadcol.ac.uk", - "cadduct.com", - "cade.ac.uk", - "cadise.ac.uk", - "cadmep.com", - "cadoverlay.com", - "cadren.com", - "cadres.ac.uk", - "caepr.ac.uk", - "caerdydd.ac.uk", "cafepress.com", - "cafmad.ac.uk", - "cafr.ca", - "cafre.ac.uk", "cahr.org.tw", - "cai21.xyz", - "caice.com", "caijinglengyan.com", - "caime.xyz", - "cairn.info", - "cairnspost.com.au", - "calam.ac.uk", "calameo.com", - "calat.ac.uk", - "calderdale-acl.ac.uk", - "calderdale.ac.uk", - "calderdaletraining.ac.uk", "calebelston.com", - "caledonian.ac.uk", - "calendarserver.org", "calendarz.com", "calgarychinese.ca", "calgarychinese.com", "calgarychinese.net", - "calgon.at", - "calgon.be", - "calgon.ch", - "calgon.co.uk", - "calgon.com", - "calgon.com.tr", - "calgon.de", - "calgon.es", - "calgon.fr", - "calgon.ie", - "calgon.it", - "calgon.nl", - "calgon.pt", - "calgon.ru", - "calgon.tv", - "calgoncarbon-china.com", - "calgoncarbon.com", - "calgonit.com", "calibre-ebook.com", - "callabitch.org", - "callersbane.com", - "callhulu.com", - "calls.ac.uk", - "callywith.ac.uk", "caltech.edu", - "cam-duct.com", - "cam-man-cic.ac.uk", - "cam-pgmc.ac.uk", - "cam.ac.uk", "cam4.com", "cam4.jp", "cam4.sg", - "cam69.com", - "cambaddies.com", - "cambb.xxx", - "camborne.ac.uk", - "cambria.ac.uk", - "cambridge-university.ac.uk", - "cambridge.ac.uk", - "cambridge.org", - "cambridgedigital.net", - "cambridgeislamiccollege.ac.uk", - "cambridgemaths.org", - "cambridgemuslimcollege.ac.uk", - "cambridgeschoolshakespeare.com", - "cambridgeshireskills.ac.uk", - "cambridgeuniversity.ac.uk", - "cambro.tv", - "cambslearning.ac.uk", - "camcam.cc", - "camden-acl.ac.uk", - "camdolls.com", - "camduct.com", - "camelot-europe.com", - "camelotherald.com", - "camelotherald.net", - "camelphat.com", - "camelspaceeffect.com", - "camera.ac.uk", - "cameraboys.com", - "camerfirma.com", - "camfinder.com", - "camfox.com", "camfrog.com", - "camgirlfinder.net", - "camgirlstemple.com", - "camgoddess.tv", - "camonster.com", + "campaign-archive.com", "campaignforuyghurs.org", - "camphill.ac.uk", - "campushp.com", - "campuslondon.com", - "campwsbydeangcymru.ac.uk", - "camrabbit.com", - "camre.ac.uk", - "camri.ac.uk", "cams.com", "cams.org.sg", - "camsfc.ac.uk", - "camsoda.com", - "camsoda1.com", - "camstagestudio.com", - "camster.com", - "camstreams.tv", - "camsvids.tv", - "camvideos.org", - "camvideos.tv", - "camvideoshub.com", - "camwhores-tv.com", - "camwhores.forum", - "camwhores.tv", - "camwhores.video", - "camwhoresbay.com", - "camwhoreshd.com", - "camwhoria.com", - "can.ac.uk", - "canada-beatsbydre.com", "canadameet.com", "canalporno.com", - "cancerandsociety.ac.uk", - "candi.ac.uk", - "candidforum-videos.com", - "cando.ac.uk", - "candycumcity.com", - "candypleasure.com", - "cannington.ac.uk", - "cannock.ac.uk", - "canolfansgiliaucadarn.ac.uk", - "canolfanyramgylcheddolcymru.ac.uk", - "canon-cee.com", - "canon-cmos-sensors.com", - "canon-cna.com", - "canon-ebm.com.hk", - "canon-emea.com", - "canon-emirates.ae", - "canon-europa.com", - "canon-europe.com", - "canon-me.com", - "canon-ois.qa", - "canon-se.com.tw", - "canon.am", - "canon.at", - "canon.az", - "canon.ba", - "canon.be", - "canon.bg", - "canon.ca", - "canon.ch", - "canon.co.il", - "canon.co.uk", - "canon.co.za", - "canon.com", - "canon.com.al", - "canon.com.au", - "canon.com.by", - "canon.com.cy", - "canon.com.hk", - "canon.com.mk", - "canon.com.mt", - "canon.com.my", - "canon.com.tr", - "canon.com.tw", - "canon.cz", - "canon.de", - "canon.dk", - "canon.ee", - "canon.es", - "canon.fi", - "canon.fr", - "canon.ge", - "canon.gr", - "canon.hr", - "canon.hu", - "canon.ie", - "canon.it", - "canon.kz", - "canon.lt", - "canon.lu", - "canon.lv", - "canon.me", - "canon.net", - "canon.nl", - "canon.no", - "canon.pl", - "canon.pt", - "canon.ro", - "canon.rs", - "canon.ru", - "canon.se", - "canon.si", - "canon.sk", - "canon.tj", - "canon.ua", - "canon.uz", - "canonfoundation.org", - "canonical.com", - "canonproprinters.com", - "cant-col.ac.uk", - "cant.ac.uk", - "cantab.ac.uk", - "canterbury.ac.uk", - "canterburycollege.ac.uk", - "canterburytrust.ac.uk", "cantonese.asia", "canyu.org", "cao.im", "caobian.info", "caochangqing.com", + "caoporn.us", "cap.org.hk", - "cape.ac.uk", - "capel.ac.uk", - "capitalccg.ac.uk", - "capitalcct.ac.uk", - "capitalcitycg.ac.uk", - "capitalgames.com", - "capitaliq.com", - "capitalisingoncreativity.ac.uk", - "capsule.ac.uk", "captainfawcett.com", "carabinasypistolas.com", - "carbo-biocrop.ac.uk", - "carbobiocrop.ac.uk", - "carbon.com", - "carcare-and-tireshop.jp", - "card.io", - "cardiff-institute.ac.uk", - "cardiff.ac.uk", - "cardiffandvalecollege.ac.uk", - "cardiffmet.ac.uk", - "cardiffmetropolitanuniversity.ac.uk", "cardinalkungfoundation.org", - "cardinalnewman.ac.uk", - "cardonald.ac.uk", - "carebay.com", "careerengine.us", - "careerfundas.com", - "careerjournal.com", - "careersatfb.com", - "careersinresearch.ac.uk", - "careerswales.ac.uk", - "carekit.org", "carfax.com", - "cargigileads.com", "cari.com.my", "caribbeancom.com", - "caribbeancompr.com", - "carlisle.ac.uk", - "carmel.ac.uk", - "carmer.ac.uk", "carmotorshow.com", - "carnegie.ac.uk", - "carnegiecollege.ac.uk", - "carnet.hr", "carousell.com.hk", - "carr-lse.ac.uk", "carrd.co", "carryzhou.com", - "carshalton.ac.uk", - "carstagram.com", - "cartoon-sex.tv", "cartoon18.com", - "cartoon3thumbs.com", "cartoonmovement.com", - "cartoonporn.com", - "cartoonporno.xxx", - "cartoonpornonly.com", - "cartoonpornvideos.com", - "cartoonregistry.com", - "cartoons.ac.uk", - "cartoonscity.com", - "cartoonsexfantazy.com", - "cartoontube.com", - "cartoonville.net", - "cas.org", "casadeltibetbcn.org", "casatibet.org.mx", - "casaw.ac.uk", - "cash.app", - "cash2.com", - "cashback69.com", - "cashbycashapp.com", - "cashify.com", - "cashify.net", - "cashpassport.ca", - "cashpassport.co.za", - "cashpassport.com", - "cashpassport.com.br", - "cashpassport.net", - "cashpassportglobe.com", - "cashvideotube.com", - "casim.ac.uk", - "casimages.com", "casinobellini.com", "casinoking.com", "casinoriva.com", - "casms.ac.uk", - "casnewydd.ac.uk", - "casoneexchange.com", - "casque-fr.com", - "casquebeatsbydrdresolohd.com", - "casquebeatsdocteurdre.com", - "casquebeatsdre2013.com", - "casquebeatsenligne.com", - "casquebeatsfracheter.com", - "casquebeatsmer.net", - "casquebeatsofficiel-fr.com", - "casquebeatspascher2013.com", - "casquebeatssolo.net", - "casquedrdrebeatssfr.com", - "casquemonsterbeats.com", - "casquemonsterbeatsbydre2013.com", - "casquesbeatsaudio.com", - "cast.ac.uk", "castbox.fm", - "castingcouch-x.com", - "castle-coll.ac.uk", - "castle.ac.uk", - "castlecollege.ac.uk", - "castlereagh.ac.uk", - "castro.fm", - "catalina.hk", - "catalinacruz.com", - "cataloguementalhealth.ac.uk", - "catalysis-cdt.ac.uk", "catbox.moe", - "catcert.cat", "catch22.net", "catchgod.com", - "catchplay.com", "catfightpayperview.xxx", - "cathedralsgroup.ac.uk", "catholic.org.hk", "catholic.org.tw", "cathvoice.org.tw", - "catmiimi.com", "cato.org", "cattt.com", - "causeway.ac.uk", - "cava.ac.uk", - "cavc.ac.uk", - "cave.ac.uk", - "cavendish.ac.uk", - "cavhot.com", - "cavporn.com", - "cavporn.github.io", - "caw.ac.uk", - "caxton.ac.uk", - "cayt.ac.uk", - "cbart.net", - "cbbank.com.mm", + "caus.com", "cbc.ca", - "cbcdc.ac.uk", - "cbm.com.mm", - "cbpar.ac.uk", - "cbrl.ac.uk", - "cbs.ac.uk", - "cbs.com", - "cbsaavideo.com", - "cbscorporation.com", - "cbsi.com", - "cbsi.video", - "cbsiam.com", - "cbsig.net", - "cbsimg.net", - "cbsinteractive.com", - "cbsistatic.com", - "cbsivideo.com", "cbsnews.com", - "cbspressexpress.com", - "cbssports.com", - "cbsstatic.com", - "cbssvideo.com", "cbtc.org.hk", "cc.com", - "cc18.biz", - "cc18.tv", - "cc18tv.com", - "ccad.ac.uk", - "ccap.ac.uk", - "ccav69.info", - "ccav69.me", - "ccav691api.com", - "ccavb.tv", - "ccb.ac.uk", - "ccc.ac.uk", "cccat.cc", "cccat.co", - "cccep.ac.uk", - "cccr.ac.uk", - "cccu.ac.uk", - "ccdc.ac.uk", "ccdtr.org", - "ccesd.ac.uk", - "ccfe.ac.uk", - "cch.ac.uk", + "ccfd.org.tw", "cchere.com", - "cchsr.ac.uk", - "cci.ac.uk", - "cciernslabs.com", - "cciesecuritylabs.com", - "ccievoicelabs.com", "ccim.org", - "ccl.ac.uk", "cclife.ca", "cclife.org", "cclifefl.org", - "cclrc.ac.uk", - "ccm.ac.uk", - "ccms.ac.uk", - "ccn.ac.uk", - "ccna5.net", - "ccnsite.com", - "ccol.ac.uk", - "ccp-mag.ac.uk", - "ccp-wsi.ac.uk", - "ccp.ac.uk", - "ccp1.ac.uk", - "ccp11.ac.uk", - "ccp13.ac.uk", - "ccp14.ac.uk", - "ccp2.ac.uk", - "ccp3.ac.uk", - "ccp4.ac.uk", - "ccp5.ac.uk", - "ccp6.ac.uk", - "ccp9.ac.uk", - "ccpb.ac.uk", - "ccpbiosim.ac.uk", - "ccpem.ac.uk", - "ccpforge.ac.uk", - "ccpi.ac.uk", - "ccplymouth.ac.uk", - "ccpn.ac.uk", - "ccpnc.ac.uk", - "ccpp.ac.uk", - "ccppetmr.ac.uk", - "ccpq.ac.uk", - "ccpsx.com", - "ccri.ac.uk", - "ccs.ac.uk", - "ccscfe-cdt.ac.uk", - "ccse.ac.uk", - "ccsr.ac.uk", - "ccstatic.org", - "ccsw.ac.uk", - "ccta.ac.uk", "ccthere.com", "ccthere.net", "cctmweb.net", @@ -5650,315 +958,67 @@ var rules = [ "ccue.com", "ccvoice.ca", "ccw.org.tw", - "ccwp.ac.uk", "cdbook.org", "cdcparty.com", - "cdd.ac.uk", "cdef.org", "cdig.info", "cdjp.org", - "cdkworkshop.com", - "cdmatech.com", "cdn-apple.com", "cdn-telegram.org", - "cdn-terapeak.com", - "cdn.ac.uk", - "cdn20.com", - "cdn77.com", - "cdn77.org", "cdnews.com.tw", "cdninstagram.com", - "cdnjs.com", - "cdnlab.live", - "cdnpure.com", "cdp1989.org", "cdp1998.org", "cdp2006.org", "cdpa.url.tw", "cdpeu.org", + "cdpuk.co.uk", "cdpusa.org", "cdpweb.org", "cdpwu.org", - "cdrc.ac.uk", - "cdt-art-ai.ac.uk", - "cdt-cmp.ac.uk", - "cdt-piads.ac.uk", - "cdtceltic.ac.uk", "cdw.com", - "cebay.com", - "cecan.ac.uk", "cecc.gov", - "cecos.ac.uk", - "ceda.ac.uk", - "cedar.ac.uk", - "cee.ac.uk", - "ceeds.ac.uk", - "ceelbas-cdt.ac.uk", - "ceelbas.ac.uk", - "ceesi.ac.uk", - "cefims.ac.uk", - "ceg.ac.uk", - "ceh-nerc.ac.uk", - "ceh-wallingford.ac.uk", - "ceh.ac.uk", - "cehuk.ac.uk", - "ceicdata.com", - "celebforum.co", - "celebgramme.com", - "celebmasta.live", - "celebritygay.com", - "celebritynakeds.com", - "celebrityslips.com", - "celebritystorysite.com", - "celebsporno.com", - "celebsroulette.com", - "celeron.com", - "celeron.net", "celestiallight.org", - "cell.com", "cellulo.info", - "celluloidfilmfutures.ac.uk", - "cem.ac.uk", - "cem1.ac.uk", - "ceme.ac.uk", - "cemmap.ac.uk", - "cemp.ac.uk", - "cencoastbmw.com", "cenews.eu", - "cenkei.com", - "censorship.ai", - "censorship.no", - "census-registration.ac.uk", - "census.ac.uk", - "centa.ac.uk", "centauro.com.br", "centerforhumanreprod.com", - "centervillage.co.jp", - "centos.org", - "central-glasgow.ac.uk", - "central-lancashire.ac.uk", - "centralbeds.ac.uk", - "centralcollege.ac.uk", "centralnation.com", - "centralnottingham.ac.uk", - "centralstmichaels.ac.uk", - "centralsussex.ac.uk", - "centralvalidation.com", - "centreformacroeconomics.ac.uk", - "centreforsustainablecities.ac.uk", - "centreforyouthministry.ac.uk", - "centreonconstitutionalchange.ac.uk", - "centrino.com", - "centrino.net", "centurys.net", - "ceoi.ac.uk", - "cepacol.ca", - "cepacol.com", - "ceramics-cadcam.com", - "cercia.ac.uk", - "cerdas.com", - "ceredigion.ac.uk", - "ceri.ac.uk", - "cerlim.ac.uk", - "cern.ch", - "certificat2.com", "certificate-transparency.org", - "certinomis.com", - "certinomis.fr", - "certsign.ro", - "certum.pl", - "ceruk.ac.uk", - "ceskeporno.cz", - "cetc.ac.uk", - "cetis.ac.uk", - "cetl4healthne.ac.uk", - "cetl4musicne.ac.uk", - "ceug.ac.uk", "cex.io", - "cf-ipfs.com", - "cf.ac.uk", - "cfake.com", - "cfas.ac.uk", - "cfblob.com", - "cfd-tv.com", - "cfdesign.com", "cfhks.org.hk", - "cfl.re", - "cfldcol.ac.uk", - "cfna.com", "cfos.de", "cfr.org", - "cfs.ac.uk", + "cfsh99.com", "cftfc.com", - "cfwives.com", "cgdepot.org", - "cgh.ac.uk", - "cglas.ac.uk", "cgst.edu", - "ch9.ms", - "chace.ac.uk", - "championshipseriesleague.com", "change.org", "changeip.name", "changeip.net", "changeip.org", - "changing-arctic-ocean.ac.uk", "changp.com", "changsa.net", "channel8news.sg", "channelnewsasia.com", + "chanworld.org", "chaoex.com", + "chaos.social", "chapm25.com", - "chargenow.com", - "chargenowusa.com", - "charlemagne-icon.ac.uk", - "charlemagneseurope.ac.uk", - "charleslyellcentre.ac.uk", - "charlestonroadregistry.com", - "charlotte-anime.jp", - "charmescorts.com", - "chart.ac.uk", - "charteredcollegeofteaching.ac.uk", - "charticulator.com", - "chase.ac.uk", - "chasestudy.ac.uk", - "chat.com", - "chatango.com", + "character.ai", "chatgpt.com", - "chatgptvideo.xyz", - "chatgptvideob.buzz", "chatnook.com", - "chatsex.xxx", - "chatter.com", - "chatterbate.io", "chaturbate.com", - "chatwhores.com", - "chatwhores.net", - "chatwhores.org", - "chatwhores.sex", - "chatwhores.tv", - "chcc.ac.uk", - "che.ac.uk", - "chea-nmidlands.ac.uk", - "chead.ac.uk", - "cheadlecollege.ac.uk", - "cheap-beats-by-dre.net", - "cheap-beatsbydre.com", - "cheap-nike.com", - "cheapbagshoes.com", - "cheapbeats.us", - "cheapbeats365.com", - "cheapbeats4sale.net", - "cheapbeatsaustraliasale.com", - "cheapbeatsbus.com", - "cheapbeatsbydr.com", - "cheapbeatsbydrdrepro.com", - "cheapbeatsbydre-au.com", - "cheapbeatsbydre99.com", - "cheapbeatsbydrefau.com", - "cheapbeatsbydremall.com", - "cheapbeatsbydremonster.com", - "cheapbeatsbydrenz.net", - "cheapbeatsbydreonsale.com", - "cheapbeatsbydreoutlet-nz.com", - "cheapbeatsbydreoutlet.com", - "cheapbeatsbydreoutlets2013.com", - "cheapbeatsbydresale.com", - "cheapbeatsbydreshop.com", - "cheapbeatsbydrestudioedition.com", - "cheapbeatsbydrestudioutlet.com", - "cheapbeatsdrdresolo.com", - "cheapbeatsdrestudios.com", - "cheapbeatsheadphone2014.com", - "cheapbeatsheadphones.us", - "cheapbeatsie.com", - "cheapbeatsla.com", - "cheapbeatssale4u.com", - "cheapbeatsshopbydre.com", - "cheapcustombeatsbydre.com", - "cheapdrdrebeats8.com", - "cheapdrdrebeatsca.com", - "cheapdrebeats8.net", - "cheaperbeatsbydresale.com", - "cheapestbeatsdrdre.com", - "cheapheadphonesland.com", - "cheapheadphonessale.com", - "cheapheadsetmall.com", - "cheapheadsetshop.com", - "cheapmonsterbeatsbydrdre.com", - "cheapmonsterbeatsheadsets.com", - "cheapmonsterbeatssale.com", - "cheapmonsterbeatsusa.us", - "cheapmonstersbeatsonsale.com", - "cheapnewbeatsbydre.com", - "cheapnikedunks.com", - "cheapnikeoutlet.com", - "cheapsalemonster.com", - "cheapshoesvip.com", - "cheapwireless04.com", - "cheapwirelessbeats.com", "checkgfw.com", - "cheep.ac.uk", - "cheerwholesale.us", - "chegg.com", - "cheggcdn.com", - "cheia.ac.uk", - "cheib.ac.uk", - "chelmsford-college.ac.uk", - "chelmsford.ac.uk", - "chelt.ac.uk", - "cheltenham-he.ac.uk", - "chemequations.com", - "chemicalbiology.ac.uk", - "chemnetbase.com", - "chemreact.ac.uk", - "chenel.ac.uk", - "chengjuanseo.com", "chengmingmag.com", - "chengrendouyin-app.com", - "chengrenshipin-app.com", "chenguangcheng.com", "chenpokong.com", "chenpokong.net", "chenpokongvip.com", - "cherry-tale.com", - "cherryasia.com", - "cherrybrady.com", - "cherrynudes.com", - "cherrypai.com", - "cherrypanpan.com", - "cherrypimps.com", - "cherrypornhd.com", "cherrysave.com", - "cheshire.ac.uk", - "cheshirecolleges.ac.uk", - "cheshirehe.ac.uk", - "chest.ac.uk", - "chester.ac.uk", - "chesterfield.ac.uk", - "chesterfieldcollegegroup.ac.uk", "chhongbi.org", - "chi-med.ac.uk", - "chi.ac.uk", - "chialumni.ac.uk", - "chianxv.buzz", - "chicagolandbmw.com", "chicagoncmtv.com", - "chichester.ac.uk", - "chichestercollegegroup.ac.uk", - "chickstagram.com", - "chickteases.com", - "chicloud.ac.uk", - "chid.com.mm", - "chigroup.ac.uk", - "chihair-straightener.com", - "chikiporn.com", - "chilbolton.ac.uk", - "childrenofthe90s.ac.uk", - "chillingo.com", - "chimeforchange.org", - "china-autodesk.com", - "china-facebook.com", "china-mmm.jp.net", "china-mmm.net", "china-mmm.sa.com", @@ -5977,13 +1037,10 @@ var rules = [ "chinachange.org", "chinachannel.hk", "chinacitynews.be", - "chinaclothesstore.com", "chinacomments.org", - "chinaculturalvisitinghub.ac.uk", - "chinadecoding.com", + "chinademocrats.org", "chinadialogue.net", "chinadigitaltimes.net", - "chinaeconomicreview.com", "chinaelections.org", "chinaeweekly.com", "chinafile.com", @@ -6007,28 +1064,22 @@ var rules = [ "chinapost.com.tw", "chinapress.com.my", "chinarightsia.org", - "chinasex.com.es", "chinasmile.net", "chinasocialdemocraticparty.com", "chinasoul.org", "chinasucks.net", - "chinatimes.com", - "chinatimes.com.tw", "chinatopsex.com", "chinatown.com.au", "chinatweeps.com", + "chinauncensored.tv", "chinaway.org", "chinaworker.info", "chinaxchina.com", "chinayouth.org.hk", "chinayuanmin.org", - "chinchuqi-av.lat", - "chinese-empires.ac.uk", "chinese-hermit.net", "chinese-leaders.org", "chinese-memorial.org", - "chinese-porn-videos.com", - "chinese-xnxx.com", "chinesedaily.com", "chinesedailynews.com", "chinesedemocracy.com", @@ -6037,357 +1088,92 @@ var rules = [ "chinesenews.net.au", "chinesepen.org", "chineseradioseattle.com", - "chinesespanking.com", "chinesetalks.net", "chineseupress.com", - "chinesexxxporn.net", "chingcheong.com", "chinman.net", - "chipcoll.ac.uk", - "chipmong13g.buzz", - "chippcoll.ac.uk", - "chips.com", - "chipscohort.ac.uk", "chithu.org", - "chiuni.ac.uk", - "chla3.com", - "chlamydia.ac.uk", - "chlg.ac.uk", - "chloesworld.com", - "chms.ac.uk", "chobit.cc", - "chocam.com", - "chocolatey.org", - "choicereviews.org", - "chomp.com", - "chopinonline.ac.uk", "chosun.com", "chped.com", "chrdnet.com", "christianfreedom.org", "christianstudy.com", "christiantimes.org.hk", - "christredeemer.ac.uk", "christusrex.org", - "christymarks.com", "chrlawyers.hk", "chrome.com", - "chromebook.com", "chromecast.com", "chromeenterprise.google", "chromeexperiments.com", - "chromeos.dev", "chromercise.com", "chromestatus.com", "chromium.org", - "chronicle.security", - "chroniclesec.com", - "chrysaliscourses.ac.uk", - "chs.ac.uk", "cht.com.tw", - "chtf.org.tw", "chuang-yen.org", - "chuangb15.xyz", - "chubbypornonly.com", "chubold.com", "chubun.com", - "chugd.ac.uk", "chuizi.net", - "chuls.ac.uk", - "chuneo.xyz", - "chunja19.net", - "chuokoron.jp", - "chuporno.com", - "churchill.ac.uk", "churchinhongkong.org", "chushigangdrug.ch", - "chutuno.fun", - "chuzs2.xyz", - "chwr7s8u.com", - "chyoa.com", "ci-en.jp", - "ci-en.net", - "cia.ac.uk", "cia.gov", - "cias.ac.uk", - "ciattackers.com", - "cib.ac.uk", "ciciai.com", - "cicl.ac.uk", - "cied.ac.uk", - "ciemap.ac.uk", "cienen.com", - "cignet.ac.uk", - "cile.ac.uk", - "cilexlawschool.ac.uk", - "cilk.com", - "cilk.net", - "cim-laser.ac.uk", - "cimcomp.ac.uk", - "cindymovies.com", "cineastentreff.de", - "cinemax.com", - "cinepornogratis.com", - "cios.org", - "ciota.ac.uk", "cipfg.org", "circlethebayfortibet.org", - "cirencester.ac.uk", - "cirius.ac.uk", "cirosantilli.com", - "cirre.ac.uk", - "cirrus.ac.uk", - "cisban.ac.uk", - "cisco-returns.com", - "cisco-warrantyfinder.com", - "cisco.com", - "cisco.mobi", - "ciscoccservice.com", - "ciscoconnectcloud.com", - "ciscoconnectcloud.net", - "ciscoconnectcloud.org", - "ciscocontest.com", - "ciscoerate.com", - "ciscofax.com", - "ciscoinvestments.com", - "ciscojabbervideo.net", - "ciscokinetic.com", - "ciscoknowledgenetwork.com", - "ciscolearningsociety.org", - "ciscolearningsystem.com", - "ciscolive.com", - "cisconetapp.com", - "cisconetspace.com", - "cisconetspace.info", - "cisconetspace.net", - "ciscopartnermarketing.com", - "ciscopowercube.com", - "ciscopress.ch", - "ciscoprice.com", - "ciscoresearch.com", - "ciscosoftware.com", - "ciscospark.ca", - "ciscospark.com", - "ciscospark.jp", - "ciscotaccc.com", - "ciscotr.com", - "ciscoturk.net", - "ciscovideo.com", - "ciscowebseminars.com", - "cispaletter.com", - "cispaletter.org", - "citas-para-mayoresde50.ec", - "citasecuador.com", "citizencn.com", "citizenlab.ca", "citizenlab.org", "citizenpowerforchina.org", "citizenscommission.hk", "citizensradio.org", - "citrixandautodesk.com", - "citscapes.ac.uk", - "city-and-guilds.ac.uk", - "city-hentai.com", - "city-poly.ac.uk", - "city.ac.uk", "city365.ca", "city9x.com", - "cityandguilds.ac.uk", - "cityandguildsartschool.ac.uk", - "citybathcoll.ac.uk", - "citycol.ac.uk", - "citycollege.ac.uk", - "citycollegebrighton.ac.uk", - "citycollegepeterborough.ac.uk", - "citycollegeplymouth.ac.uk", - "citycollegesoton.ac.uk", - "cityheaven.net", - "citylab.com", - "citylit.ac.uk", - "cityofbristol.ac.uk", - "cityofglacol.ac.uk", - "cityofglasgowcollege.ac.uk", - "cityoflondonbschool.ac.uk", - "cityoflove.com", - "cityofoxford.ac.uk", - "cityplym.ac.uk", "citypopulation.de", - "citysun.ac.uk", "citytalk.tw", - "citytourgirls.com", - "cityuniversitybirmingham.ac.uk", - "ciu.ac.uk", "civicparty.hk", - "civil3d.com", - "civilcc.com", "civildisobediencemovement.org", "civilhrfront.org", "civiliangunner.com", "civilmedia.tw", - "civilsoftware.net", - "civilwarpetitions.ac.uk", "civisec.org", "civitai.com", - "cixp.net", - "ciyuanjie.cc", + "cixiaoya.club", "cjb.net", "ck101.com", - "ckcdn.com", - "ckck.fun", - "ckeene.ac.uk", - "ckss98.com", - "clackmannan-college.ac.uk", - "clacks.ac.uk", - "clacton.ac.uk", - "clad.ac.uk", - "clannad-movie.jp", - "claravenger.com", - "clarendon.ac.uk", - "clarin.ac.uk", "clarionproject.org", - "clarivate.com", - "clasporno.org", "classicalguitarblog.net", - "classicnike.com", - "classics.ac.uk", - "classymomsex.com", "claude.ai", - "claudeusercontent.com", "clb.org.hk", - "clc-london.ac.uk", - "clco.cc", - "clean-cooling.ac.uk", "cleansite.biz", "cleansite.info", "cleansite.us", - "clearasil.us", - "clearflo.ac.uk", "clearharmony.net", - "clearlinux.org", - "clearpool.finance", "clearsurance.com", "clearwisdom.net", "clementine-player.org", - "cleveland.ac.uk", - "clh.ac.uk", - "click-url.com", - "clickandgovideo.ac.uk", - "clickedu.co.uk", "clickme.net", - "cliffcollege.ac.uk", - "climate-lab-book.ac.uk", - "climate-server.com", - "climatechangewales.ac.uk", - "climateone.blogspot.co.id", - "climb.ac.uk", "clinica-tibet.ru", - "clinical-videos.com", - "clinicalkey.com", - "clinicalnotes.ac.uk", - "clinicalskillscentre.ac.uk", - "clip16.com", - "clipcake.com", - "clipdrop.co", + "clipconverter.cc", "clipfish.de", - "cliphayho.com", - "cliphunter.com", "clips4sale.com", - "clipsaoyai.com", - "clipsbai.com", - "clipseksi.com", - "clipsex.asia", - "clitgames.com", - "cln.ac.uk", "cloakpoint.com", - "clojure.org", - "clonoth.com", - "closer.ac.uk", - "cloud.ac.uk", - "cloudapp.net", - "cloudappsecurity.com", - "cloudburstresearch.com", - "cloudc.one", - "cloudchoose.com", "cloudcone.com", - "cloudcone.net", - "cloudconvert.com", - "cloudcraze.com", - "cloudcredibility.com", - "cloudflare-dns.com", - "cloudflare-ech.com", - "cloudflare-esni.com", - "cloudflare-gateway.com", "cloudflare-ipfs.com", - "cloudflare-quic.com", - "cloudflare.com", - "cloudflare.net", - "cloudflare.tv", - "cloudflareaccess.com", - "cloudflareapps.com", - "cloudflarebolt.com", - "cloudflareclient.com", - "cloudflareinsights.com", - "cloudflareok.com", - "cloudflarepartners.com", - "cloudflareportal.com", - "cloudflarepreview.com", - "cloudflareresolve.com", - "cloudflaressl.com", - "cloudflarestatus.com", - "cloudflarestorage.com", - "cloudflarestream.com", - "cloudflaretest.com", - "cloudflarewarp.com", - "cloudfront.com", "cloudfront.net", "cloudfunctions.net", - "cloudhealthtech.com", - "cloudimage.io", - "cloudimg.io", - "cloudinary.com", - "cloudinary.net", - "cloudinsights.com", - "cloudlatex.io", - "cloudlive.com", - "cloudlock.com", - "cloudn.me", "cloudokyo.cloud", - "cloudproxy.app", - "cloudrobotics.com", - "cloudsync-prod.s3.amazonaws.com", - "cloudvolumes.com", - "cloudworks.ac.uk", - "cloudyzgirl.com", - "cloupia.com", - "cloupia.net", - "clova.ai", - "clp.ac.uk", - "clrc.ac.uk", "club1069.com", - "clubhouse.com", "clubhouseapi.com", - "clubseventeen.com", - "clubsweethearts.com", - "clubtubes.com", - "clusterconnection.com", - "clydebank.ac.uk", "clyp.it", - "clzz2.xyz", - "cmac.ac.uk", "cmcn.org", - "cmcnet.ac.uk", - "cmcsm.ac.uk", "cmegroup.com", - "cmhalq.com", "cmi.org.tw", - "cmmedia.com.tw", "cmoinc.org", - "cmpaas.com", - "cmpcp.ac.uk", - "cms-twdigitalassets.com", - "cms.ac.uk", "cms.gov", - "cmu.ac.uk", "cmu.edu", "cmule.com", "cmule.org", @@ -6396,785 +1182,158 @@ var rules = [ "cn6.eu", "cna.com.tw", "cnabc.com", - "cnbc.com", - "cnbcfm.com", - "cnbeta.com", "cnbeta.com.tw", - "cnbetacdn.com", - "cncrivals.com", "cnd.org", - "cnet.co.kr", "cnet.com", - "cnet.de", - "cnetfrance.fr", "cnex.org.cn", "cnineu.com", "cnitter.com", - "cnivogue.com.au", - "cnix-gov-cn.com", - "cnmd.ac.uk", "cnn.com", - "cnn.io", - "cnn.it", - "cnnamador.com", - "cnnarabic.com", - "cnnikebrand.com", - "cnnlabs.com", - "cnnmoney.ch", - "cnnmoney.com", - "cnnmoneystream.com", - "cnnpolitics.com", - "cnpmjs.org", "cnpolitics.org", "cnproxy.com", - "cnshopin.com", - "cnwl.ac.uk", "cnyes.com", - "cnzjp.xyz", - "co-op.ac.uk", - "co-opcollege.ac.uk", - "co-operative-university.ac.uk", - "co-operative.ac.uk", - "co-operativeuniversity.ac.uk", - "co.de", - "co.ph", "co.tv", "coat.co.jp", - "coatbridge.ac.uk", - "cobatt.com", "cobinhood.com", - "cobra.ac.uk", - "cobrasearch.com", - "coccfea.ac.uk", "cochina.co", "cochina.org", - "cochrane-airways.ac.uk", - "cochrane.ac.uk", - "cochranelibrary.com", - "cock4stepmom.com", - "cockcroft.ac.uk", - "cockofhorse.com", - "cocksuckersguide.com", - "cocktailsandcocktalk.com", - "cockyboys.com", - "cocorees.ac.uk", - "cod-health.ac.uk", - "code.ac.uk", - "code.org", "code1984.com", - "codeberg.org", - "codeberg.page", - "codecademy.com", - "codeforaliving.io", - "codeforces.com", - "codei.sh", - "codeish.co", - "codeish.io", "codeplex.com", "codeshare.io", "codeskulptor.org", - "codespot.com", - "codethemicrobit.com", - "codima.ac.uk", - "codivorexxx.com", - "cods-nursing.ac.uk", - "coedcherry.com", - "coem.ac.uk", - "cof.ac.uk", - "cogc.ac.uk", + "cofacts.tw", "coin2co.in", - "coinalyze.net", "coinbase.com", "coinbene.com", - "coindesk.com", "coinegg.com", "coinex.com", "coingecko.com", "coingi.com", - "coinglass.com", - "coinmap.org", "coinmarketcap.com", - "coinone.co.kr", - "coinonecore.com", - "coinonecorp.com", "coinrail.co.kr", "cointiger.com", "cointobe.com", "coinut.com", - "coithienthai.com", - "coitustube.com", - "col-westanglia.ac.uk", - "col.ac.uk", - "colc.ac.uk", - "colcc.ac.uk", - "colch-inst.ac.uk", - "colchester.ac.uk", - "colchsfc.ac.uk", - "coleg-powys.ac.uk", - "colegaucymru.ac.uk", - "colegcymraeg.ac.uk", - "colegdewisant.ac.uk", - "colegelidyr.ac.uk", - "coleggwent.ac.uk", - "coleggwyrabertawe.ac.uk", - "colegialasdeverdad.com", - "colegialasreales.com", - "colegmorgannwg.ac.uk", - "colegpenybont.ac.uk", - "colegsirbenfro.ac.uk", - "colegsirgar.ac.uk", - "coliriodemacho.com.br", - "collabora.co.uk", - "collabora.com", - "collabora.org", - "collaboraoffice.com", - "collaborateni.ac.uk", + "colacloud.net", "collateralmurder.com", "collateralmurder.org", - "collection-3d.com", - "collectionofbestporn.com", - "collective99.com", - "college-falmouth.ac.uk", - "collegecareearlyed.ac.uk", - "collegedevelopmentnetwork.ac.uk", - "collegejournal.com", - "collegeofosteopaths.ac.uk", - "collegeofteachers.ac.uk", - "collegeofteaching.ac.uk", - "collegepornonly.com", - "collegesexgames.com", - "collegesni.ac.uk", - "collegesscotland.ac.uk", - "collegeswales.ac.uk", - "collegewebsites.ac.uk", - "collemergencymed.ac.uk", - "colliderporn.com", - "collins.co.uk", - "collins.in", - "collyers.ac.uk", - "colombianas.webcam", - "colorfulpalette.org", - "colorfulstage.com", - "colorprotechnology.com", - "colpet.ac.uk", - "com.am", "com.google", - "com.in", - "com.kn", "com.uk", - "combinedhonours.ac.uk", - "comcast.net", - "comdotgame.com", - "come29.xyz", "comedycentral.com", "comefromchina.com", - "comet-study.ac.uk", - "cometotheduckside.com", "comic-mega.me", - "comicbox.xyz", "comico.tw", - "comics.ac.uk", - "comicscartoonporn.com", - "comicsporno.es", - "comicunivers.com", - "comicuniverse.org", - "comixzilla.com", - "comm-coll-hackney.ac.uk", - "commandandconquer.com", "commandarms.com", "comments.app", "commentshk.com", - "commerceos.com", - "commnet.ac.uk", "communistcrimes.org", "communitychoicecu.com", - "como-hackearfacebook.com", - "comodo.com", - "comodo.net", - "comodoca.com", - "comodoca2.com", - "comodoca3.com", - "comodoca4.com", - "compaq.org", "comparitech.com", - "compass-system.com", - "compass-systems.com", - "compass.is", - "competitionpolicy.ac.uk", "compileheart.com", - "complex.ac.uk", - "componentkit.org", - "compose-spec.io", "compress.to", - "compresspdf.new", - "computer.org", - "computing.ac.uk", - "computingreviews.com", "compython.net", - "comscoreresearch.com", - "comsoc.org", - "conair.me", - "conan.xxx", - "concordat.ac.uk", - "concordats.ac.uk", - "conda.io", - "condenastcollege.ac.uk", - "condovercollege.ac.uk", - "conductrics.com", - "conductus.ac.uk", - "conel.ac.uk", - "confetti.ac.uk", - "conform.ac.uk", - "confuciusinstitute.ac.uk", "congyu.moe", - "connaissancesfinancierespratiques.ca", - "connect-ed.ac.uk", - "connect-in-canada.com", - "connect.ac.uk", - "connectcommerce.hk", - "connectcommerce.info", - "connectcommerce.tv", - "connected-drive.com", - "connectedcommerce.com", - "connectedcommerce.tv", - "connectedeverything.ac.uk", - "connectionsacademy.com", - "connectionseducation.com", - "connectionslearning.com", - "connell.ac.uk", "conoha.jp", - "conquerwithcharacter.com", - "conscrypt.com", - "conscrypt.org", - "conservatoiresuk.ac.uk", - "consilience.ac.uk", "constitutionalism.solutions", - "constructware.com", - "consul.io", - "consultants.ac.uk", "contactmagazine.net", - "contactossexoecuador.com", - "containersonaws.com", - "contechacademy.com", - "contemp-hist-arch.ac.uk", - "contentful.com", - "contest.com", "convio.net", - "convrgencegame.com", "coobay.com", - "cooer.su", - "cookiechoices.org", - "cookielaw.org", - "cookiepro.com", - "cool-comics.com", "cool18.com", "coolaler.com", "coolder.com", - "coolinet.net", - "cooliphonecasesstore.com", "coolloud.org.tw", - "coolmonster.net", "coolncute.com", - "coolsexnew.com", "coolstuffinc.com", - "coomer.party", - "coova.com", - "coova.net", - "coova.org", - "copac.ac.uk", - "copim.ac.uk", - "copior.ac.uk", - "copro.pw", - "cops.ac.uk", - "copstat.ac.uk", - "coqnu.com", - "corbinfisher.com", - "cordcloud.org", - "cordwainers.ac.uk", - "core.ac.uk", - "coreduo.com", - "coreextreme.com", - "corel.com", - "corel.net", - "coreldraw.app", - "coreldraw.com", - "corelstore.com", - "coreml.net", - "coreoptics.net", - "corepublishingsolutions.com", - "cornell-brown-penn.ac.uk", - "cornwall-acl.ac.uk", - "cornwall-vithform.ac.uk", - "cornwall.ac.uk", - "coronavirusnow.com", - "corpasnagaidhlig.ac.uk", - "corpmerchandise.com", - "corporatecashpassport.com", - "cortanaanalytics.com", - "cortanaskills.com", - "cortexrpg.com", "corumcollege.com", "cos-moe.com", - "cosc.ac.uk", - "coseelis.ac.uk", - "cosfans-tw.com", - "cosmosdb.info", - "cosmosdb.net", - "cosplay-jav.com", - "cosplayeromania.jp", "cosplayjav.pl", - "cosplayporntube.com", - "cosplayworld.net", - "cospop.ac.uk", - "costco-static.com", "costco.com", - "costcobusinessdelivery.com", - "cot.ac.uk", - "cotolia.com", - "cotr.ac.uk", "cotweet.com", - "cougarsexmovies.com", - "coulsdon.ac.uk", - "councilofhealthcarescience.ac.uk", - "counsellingresearch.ac.uk", "counter.social", - "countytraining.ac.uk", - "coup.ac.uk", - "coupang.com", - "coupangcdn.com", - "couplecam.co.uk", - "couriermail.com.au", "coursehero.com", - "coursera-for-business.org", - "coursera.community", - "coursera.help", - "coursera.org", - "courtauld.ac.uk", - "cov.ac.uk", - "covcollege.ac.uk", - "cove4careinkent.ac.uk", - "coventry.ac.uk", - "coventrycollege.ac.uk", - "coventryuniversity.ac.uk", - "covid19-rx.org", - "covid19rx.org", - "covuni.ac.uk", - "covuniapps.ac.uk", - "cowboom.com", - "cowc.ac.uk", - "cowork.ac.uk", "coze.com", - "cozydrdrebeats.com", - "cp44.net", - "cpan.org", - "cpc.ac.uk", - "cpd25.ac.uk", - "cpd4phd.ac.uk", - "cpdnoticeboard.ac.uk", - "cpedge.com", - "cpel.ac.uk", - "cphc.ac.uk", - "cpib.ac.uk", "cpj.org", - "cppe.ac.uk", - "cppr.ac.uk", - "cptt.ac.uk", - "cpz.to", "cq99.us", - "cqcorea.com", - "crabporn.com", "crackle.com", - "craigslist.org", - "cral.ac.uk", - "cran.ac.uk", - "cranfield.ac.uk", - "crankplayer.com", - "crash.ac.uk", - "crates.io", - "craven-college.ac.uk", - "crawley-college.ac.uk", - "crawley.ac.uk", - "crazy-amateurs.com", - "crazyav.xyz", - "crazybook.xyz", - "crazycloud.ru", - "crazyfiction.xyz", - "crazylivecams.com", - "crazynovel.xyz", + "crazypool.org", "crazys.cc", "crazyshit.com", - "crazyxxx3dworld.com", - "crazyxxx3dworld.net", - "crazyxxx3dworld.org", - "crazyxxxworld.com", "crbug.com", "crchina.org", "crd-net.org", "creaders.net", "creadersnet.com", - "cream.ac.uk", - "creamasia.com", - "creamlemon.info", - "creampieforgranny.com", - "create.ac.uk", - "createspace.com", - "createwhatsnext.com", - "creativecloud.com", - "creativecommons.engineering", - "creativecommons.org", - "creativeindustries.ac.uk", "creativelab5.com", - "creativepass.com", - "creativesdk.com", - "creativity-cetl.ac.uk", - "creatwhatsnext.com", - "crececonebay.com", - "creditcardsbay.com", - "creditlink-east.ac.uk", - "creds.ac.uk", - "cresc.ac.uk", - "crescentlearning.ac.uk", - "crest.ac.uk", - "crestresearch.ac.uk", - "crew.ac.uk", - "crfr.ac.uk", - "crh.ac.uk", - "cri.ac.uk", - "cric.ac.uk", - "cricbristol.ac.uk", - "crichton.ac.uk", - "crick.ac.uk", - "cricketcountry.com", - "cricklade.ac.uk", "crisisresponse.google", "cristyli.com", - "crit-staging.com", - "critica.ac.uk", - "critical.ac.uk", - "criticalfriend.ac.uk", - "criticaltheology.ac.uk", - "crmdynint-gcc.com", - "crmdynint.com", - "crocels.ac.uk", "crocotube.com", - "cromite.org", - "cronton.ac.uk", - "crontonsixthform.ac.uk", - "crontonsixthformcollege.ac.uk", - "cropdiversity.ac.uk", - "cropyields.ac.uk", - "cros.ac.uk", - "crossborderexpansion.com", "crossfire.co.kr", - "crossfitfirestone.com", - "crossmediapanel.com", "crossthewall.net", "crossvpn.net", - "crosswalk-project.com", - "crosswalk-project.net", - "crowdtangle.com", + "crosswall.org", "croxyproxy.com", - "croydon.ac.uk", - "croydon6f.ac.uk", - "croydonacl.ac.uk", - "croydonhe.ac.uk", - "croydonsec.ac.uk", - "crr.com", "crrev.com", - "crsbi.ac.uk", - "crsp.ac.uk", - "crtsgfb1.top", "crucial.com", - "crucible-cetl.ac.uk", - "cruel-furies.com", - "cruisse.ac.uk", "crunchyroll.com", - "crustwebsites.net", + "cruxpool.com", "crwdcntrl.net", "crypto.com", - "cryptocompare.com", "cryptographyengineering.com", - "crypton.co.jp", - "crysis.jp", - "crystalgunnsworld.com", - "crystalmiss.com", - "cs.co", - "cs4hs.com", - "csakporno.hu", - "csc.ac.uk", - "cscd.ac.uk", - "csct.ac.uk", - "cscuk.ac.uk", - "csd3.ac.uk", "csdparty.com", - "csec.ac.uk", - "cser.ac.uk", - "cserge.ac.uk", - "csg.ac.uk", - "cshive.com", - "cshl.ac.uk", - "csifund.org", - "csis-prod.s3.amazonaws.com", "csis.org", - "csm.ac.uk", - "csmen.ac.uk", "csmonitor.com", - "csn-cetl.ac.uk", - "csrankings.org", - "csrf.ac.uk", - "csrs.ac.uk", - "csrw.ac.uk", - "cssd.ac.uk", - "cstatic.net", - "csu.ac.uk", "csuchen.de", "csw.org.uk", - "ct-toolkit.ac.uk", "ct.org.tw", - "cta-observatory.ac.uk", - "ctan.org", "ctao.org", - "ctc.ac.uk", - "ctcrm.ac.uk", - "ctee.com.tw", - "ctfassets.net", "ctfriend.net", - "ctg.ac.uk", "ctitv.com.tw", - "ctk.ac.uk", - "ctkaquinas.ac.uk", - "ctkemmanuel.ac.uk", - "ctksfc.ac.uk", - "ctkstmarys.ac.uk", - "ctotires.com", "ctowc.org", - "ctr-math-phys.ac.uk", - "cts.ac.uk", "cts.com.tw", - "cttoolkit.ac.uk", - "ctv.com.tw", "ctwant.com", - "ctyun.online", - "cubo.ac.uk", - "cuc.ac.uk", - "cuckfilmswifefuck.com", - "cuckold69.com", - "cuckoldfuck.com", - "cuckoldingwifey.com", - "cuckoldinterracialporn.com", - "cuckoldinterracialwife.com", - "cuckoldplacetube.com", - "cuckoldporntube.com", - "cuckoldwifesex.com", - "cuckoldwifesexxx.com", - "cuckoldwifetube.com", - "cuckporn.com", - "cuckvideos.com", - "cuckwatchingwife.com", - "cuckwimp.com", - "cudah.ac.uk", - "cudassh.ac.uk", - "cudos.ac.uk", - "cue.ac.uk", - "cuebic.biz", - "cuffiesaldi.com", "cuhk.edu.hk", "cuhkacs.org", - "cuhop.ac.uk", "cuihua.org", - "cuinc.tw", "cuiweiping.net", - "cukas.ac.uk", - "culham.ac.uk", - "cullenproject.ac.uk", - "cultiva.ac.uk", - "cultoferotica.com", - "cultura-kolomna.ru", "culture.tw", - "cultureofthecountryside.ac.uk", - "cum4k.cc", - "cumasianporn.com", - "cumberlandlodge.ac.uk", - "cumbernauld.ac.uk", - "cumbria.ac.uk", - "cumbriacad.ac.uk", - "cumbriahigherlearning.ac.uk", "cumlouder.com", - "cumshotlist.com", - "cumswappingsis.com", - "cumteenporn.com", - "cunhua.pics", "cuntcrack.com", - "cuntempire.com", - "cuntwars.com", - "cunw.ac.uk", - "cup.com.hk", - "cups.org", - "curator.ac.uk", - "curbed.com", - "curdev-fe-ni.ac.uk", - "curioustravellers.ac.uk", - "curl.ac.uk", - "currently.com", - "currently.net", - "currenttime.tv", - "cursecdn.com", - "curseforge.com", - "cursor-cdn.com", - "cursor.com", - "cursor.sh", - "cursorapi.com", - "curve.fi", "curvefish.com", - "curvybbwwives.com", - "curvyerotic.com", - "cusp.ac.uk", "cusp.hk", - "cusplondon.ac.uk", - "custom-iphonecase.com", - "custombeatsbydrebuy.com", - "custombeatsdeals.com", - "custombeatsforcheap.com", - "custombeatsny.com", - "custombeatssbydreus.com", - "customdrdrebeats.com", - "customercontrolpanel.de", - "customizedbeatbydre.com", - "customizedbeatsbydre.com", - "customizedbeatsdre.com", - "customnikeshoes.com", "cusu.hk", - "cutg.ac.uk", + "cutout.pro", "cutscenes.net", - "cutt.ly", - "cuv.ac.uk", - "cuwm.ac.uk", - "cvcp.ac.uk", - "cvma.ac.uk", - "cvr.ac.uk", - "cvs.ac.uk", - "cvu.ac.uk", "cw.com.tw", - "cwa.ac.uk", "cwb.gov.tw", - "cwc.ac.uk", - "cwcams.com", - "cwcfe.ac.uk", - "cwrc.ac.uk", - "cws.ac.uk", - "cy22.tv", - "cyber-bay.info", - "cyber-bay.org", - "cyber-college.ac.uk", "cyberctm.com", "cyberghostvpn.com", - "cybermondaybeats4sale.com", - "cybersecurity-cdt.ac.uk", - "cybersecuritycdt.ac.uk", - "cybertrust.co.jp", - "cybertrust.ne.jp", - "cyberx.com", - "cyclops-network.ac.uk", - "cygames.co.jp", - "cygames.jp", - "cygwin.com", - "cylink.pro", - "cylink0122.icu", - "cym.ac.uk", - "cymdeithasddysgedig.ac.uk", - "cymdeithasddysgedigcymru.ac.uk", - "cymoedd.ac.uk", - "cymru.ac.uk", - "cynghrairstrategolaberbangor.ac.uk", "cynscribe.com", - "cython.org", "cytode.us", "cz.cc", - "czechav.com", - "czechbiporn.com", - "czechcasting.com", - "czechhunter.com", - "czechlesbians.com", - "czechmassage.com", - "czechstreets.com", - "czechvr.com", - "czechwifeswap.com", - "cztv117.shop", "d-fukyu.com", - "d-trust.net", - "d-upp.com", + "d.cash", "d0z.net", "d100.net", - "d1b183sg0nvnuh.cloudfront.net", - "d1c37gjwa26taa.cloudfront.net", - "d1g1f25tn8m2e6.cloudfront.net", - "d1k2us671qcoau.cloudfront.net", - "d1m7jfoe9zdc1j.cloudfront.net", - "d1mhjrowxxagfy.cloudfront.net", - "d1oca24q5dwo6d.cloudfront.net", - "d1w2poirtb3as9.cloudfront.net", - "d1xhnb4ptk05mw.cloudfront.net", - "d1ymi26ma8va5x.cloudfront.net", - "d29vzk4ow07wi7.cloudfront.net", - "d2aba1wr3818hz.cloudfront.net", - "d2anahhhmp1ffz.cloudfront.net", "d2bay.com", - "d2dylwb3shzel1.cloudfront.net", - "d2e2de1etea730.cloudfront.net", - "d2mrry2to5rg.com", - "d2nvs31859zcd8.cloudfront.net", "d2pass.com", - "d2um2qdswy1tb0.cloudfront.net", - "d2vjef5jvl6bfs.cloudfront.net", - "d2xmjdvx03ij56.cloudfront.net", - "d33wubrfki0l68.cloudfront.net", - "d36nr0u3xmc4mm.cloudfront.net", - "d3aqoihi2n8ty8.cloudfront.net", - "d3c27h4odz752x.cloudfront.net", - "d3c33hcgiwev3.cloudfront.net", - "d3rhr7kgmtrq1v.cloudfront.net", - "d3vd9lfkzbru3h.cloudfront.net", - "d6d4ismr40iw.cloudfront.net", - "d6tizftlrpuof.cloudfront.net", - "da-files.com", - "da3dsoul.dev", - "daboja18.com", "dabr.co.uk", "dabr.eu", "dabr.me", "dabr.mobi", - "dacebook.com", - "dachix.com", "dadazim.com", - "daddyslilangel.com", "dadi360.com", "dafabet.com", "dafagood.com", "dafahao.com", - "dafanhao-app.com", - "dafni.ac.uk", "dafoh.org", - "daft.sex", "daftporn.com", - "daftsex-hd.com", - "daftsex.com", "dagelijksestandaard.nl", - "dagfs.com", "daidostup.ru", "dailidaili.com", - "dailybasis.com", - "dailym.ai", "dailymail.co.uk", - "dailymail.com", - "dailymail.com.au", - "dailymail.dk", - "dailymailonline.com", "dailymotion.com", - "dailyporn.club", "dailysabah.com", - "dailytelegraph.com.au", "dailyview.tw", - "daindianporn.com", "daiphapinfo.net", "dajiyuan.com", "dajiyuan.de", @@ -7198,124 +1357,31 @@ var rules = [ "dalailamaworld.com", "dalianmeng.org", "daliulian.org", - "damduc.org", - "damplips.com", - "dance-archives.ac.uk", - "dandalinvoa.com", - "dandanzan.cc", - "danemarket.com", "danke4china.net", - "danmarkbeatsbydrdre.com", - "danskpornofilm.com", - "dansmovies.com", "danwei.org", - "daoc.net", "daolan.net", "daozhongxing.org", - "daresbury.ac.uk", - "daretoku-eromanga.info", - "darivoa.com", - "darkageofcamelot.com", - "darkcategories.com", - "darknaija.com", - "darkness-risen.com", - "darknessporn.com", - "darknun.com", - "darksidemagazine.com", "darktech.org", "darktoy.net", - "darlington.ac.uk", - "darlingtonlearningandskills.ac.uk", "darpa.mil", "darrenliuwei.com", - "dart.dev", - "dartington.ac.uk", - "dartlang.org", - "dartpad.dev", - "darts.ac.uk", - "dartsearch.net", - "darwin.ac.uk", - "darwindimensions.com", - "darwinproject.ac.uk", - "darwinsource.com", - "darwinsource.org", - "darwinsourcecode.com", - "dasaob.online", - "dasg.ac.uk", - "dash-1.ac.uk", "dashlane.com", - "dashwood360.com", - "dassh.ac.uk", - "dastanhisexy.cc", "dastrassi.org", - "dat.foundation", - "data-archive.ac.uk", - "data-intensive-cdt.ac.uk", - "data-service.ac.uk", "data-vocabulary.org", - "data.ac.uk", - "data.com", "data.gov.tw", - "datafuturesalphapilot.ac.uk", - "datagrid.ac.uk", "datalabour.com", - "dataliberation.org", - "datalore.io", - "datasheets360.com", - "datashield.ac.uk", - "datasig.ac.uk", - "datawav.club", - "date2night.xyz", "daum.net", - "daumcdn.net", - "daumkakao.io", - "daumpcbang.com", - "davcoll.ac.uk", - "daventrylearningpartnership.ac.uk", "david-kilgour.com", - "david-laserscanner.com", - "davidlewis.ac.uk", "dawangidc.com", - "dawngate.com", - "dawngatechronicles.com", "daxa.cn", - "dayabook.com", - "daylenerio.com", "daylife.com", - "daytonbmw.com", - "daytontrucktires.com", - "dazn-api.com", - "dazn.com", - "dazndn.com", "db.tt", - "dba.dk", - "dbc.hk", "dbgjd.com", - "dc-msedge.net", - "dca.ac.uk", - "dcard.cc", - "dcard.io", - "dcard.link", "dcard.tw", - "dcc.ac.uk", - "dcd.ac.uk", - "dcdp.ac.uk", - "dcg.ac.uk", "dcmilitary.com", - "dct.ac.uk", - "dctbeatsbydre.com", - "ddacn6pr5v0tl.cloudfront.net", "ddc.com.tw", - "ddd-smart.net", - "ddff66.com", - "ddff77.com", - "ddg.co", - "ddg.gg", - "ddh.gg", + "ddex.io", "ddhw.info", - "ddi.ac.uk", - "dditsadn.com", - "dditscdn.com", "ddns.info", "ddns.me.uk", "ddns.mobi", @@ -7323,564 +1389,92 @@ var rules = [ "ddns.name", "ddns.net", "ddns.us", - "de-montfort.ac.uk", "de-sci.org", - "de1lib.org", + "deadhouse.org", "deadline.com", - "deadspacegame.com", - "deafandcreative.ac.uk", - "deafheritagenetwork.ac.uk", "deaftone.com", - "dealbay.com", - "dealerspeed.net", - "dealsbeatsblackfriday.com", - "dealtime.com", - "dealtree.org", - "deansofscience.ac.uk", - "dearne-coll.ac.uk", - "deas.ac.uk", - "deasians.com", - "debank.com", - "debian.org", - "debs.ac.uk", "debug.com", - "debugproject.com", - "dec.ac.uk", - "decentr.net", - "dechamora.com", "deck.ly", + "deck.new", "decodet.co", - "decorativemodels.com", - "decrypt.day", - "decymru.ac.uk", - "deed.ac.uk", + "deepai.org", "deepdiscount.com", - "deeper.com", - "deepfake-porn.com", - "deepfakeporn.net", - "deepfreeze.co.uk", - "deepfreeze.com", - "deepfreeze.com.br", - "deepfreeze.eu", - "deepfreeze.net", - "deepfreeze.tech", - "deeping.ac.uk", - "deepl.com", "deepmind.com", - "deepmind.google", - "deeside.ac.uk", "deezer.com", - "defac.ac.uk", - "defenceacademy.ac.uk", "definebabe.com", - "definefetish.com", - "degruyter.com", "deja.com", - "delcam-ams.com", - "delcam-electrode.com", - "delcam-na.com", - "delcam-robotics.com", - "delcam-services.com", - "delcam.com", - "delcamconsulting.com", - "delcamforsolidworks.com", - "delcamna.com", "delcamp.net", - "delcamtv.com", - "delcamuniversity.com", - "delcamusa.com", "delicious.com", - "delicious.com.au", - "dell-brand.com", - "dell.com", - "dellcdn.com", - "dellsupportcenter.com", - "delltechnologies.com", - "deluxe.com.hk", - "delvenetworks.com", - "demand.ac.uk", - "demandware.com", - "demarco-archive.ac.uk", - "demdex.net", - "dementianet.ac.uk", - "dementiaresearchinstitute.ac.uk", - "democracy.earth", "democrats.org", - "demonoid.is", - "demoprint.com", - "demos.ac.uk", "demosisto.hk", - "den.ac.uk", - "dengeamerika.com", - "dengiamerika.com", - "deno.com", - "deno.land", - "dentalhypotheses.com", - "dentalschoolscouncil.ac.uk", - "dentpostgradwales.ac.uk", - "dependabot.com", "depositphotos.com", - "deps.dev", - "deps.info", - "derby-college.ac.uk", - "derby.ac.uk", - "derbyals.ac.uk", - "derbycollege.ac.uk", - "derbyonline.ac.uk", - "derbyshire.ac.uk", "derekhsu.homeip.net", - "deribit.com", - "derpibooru.org", - "derweb.ac.uk", - "derwen.ac.uk", - "derwencollege.ac.uk", - "derwentside.ac.uk", "desc.se", - "descargasgay.com", - "desertbmw.com", - "design-ledrev.com", - "design-ledrevolution.com", "design.google", - "designeriphonescases.com", - "designledrevolution.com", - "designsformovement.com", - "designxml.com", - "designxml.net", - "desihoes.com", - "desiporn.tube", - "desipornfilms.com", "desipro.de", - "desiraesworld.com", - "desiresecrets.com", - "desk.com", - "desktopmovie.com", - "desktopmovie.net", - "desktopmovie.org", - "desktopmovies.net", - "desktopmovies.org", "dessci.com", - "destinationbim.com", "destroy-china.jp", - "detaliczny.com", - "detentiongirls.com", "detroitnews.com", - "dettol-prize.com", - "dettol.at", - "dettol.be", - "dettol.ch", - "dettol.cl", - "dettol.co.id", - "dettol.co.in", - "dettol.co.ke", - "dettol.co.nz", - "dettol.co.uk", - "dettol.com", - "dettol.com.au", - "dettol.com.bd", - "dettol.com.br", - "dettol.com.eg", - "dettol.com.hk", - "dettol.com.my", - "dettol.com.ng", - "dettol.com.sg", - "dettol.cz", - "dettol.fr", - "dettol.hu", - "dettol.ie", - "dettol.net", - "dettol.nl", - "dettol.pk", - "dettol.pl", - "dettol.pt", - "dettol.ru", - "dettolarabia.com", - "dettolcleannaija.com", - "dettolsitishield.co.in", - "dettolthailand.com", - "deutsch-sexfilme.com", - "deutsche-pornos-kostenlos.xxx", "deutsche-welle.de", - "deutschepornos-kostenlos.net", - "deutschsex.com", - "dev-guardianapis.com", - "dev-theguardian.com", - "dev.to", - "devcon.org", - "developebp.ac.uk", - "developer-advisor.com", - "developria.com", "deviantart.com", "deviantart.net", - "deviantclip.com", - "device-manager.us", - "devilsfilm.com", "devio.us", - "devm2m.com", - "devolution.ac.uk", - "devopsassessment.net", - "devopsms.com", "devpn.com", - "devsitetest.how", - "devtools-paypal.com", "devv.ai", - "dewcol.ac.uk", - "dewitwithdurex.com", - "dewsbury.ac.uk", - "dexterhorn.com", - "dezyred.com", "dfas.mil", "dfn.org", - "dfp6rglgjqszk.cloudfront.net", - "dgaqp.com", - "dgeft87wbj63p.cloudfront.net", - "dgg.gg", - "dghe.ac.uk", - "dgwav.com", - "dh44.lol", "dharamsalanet.com", "dharmakara.net", "dhcp.biz", - "dhi.ac.uk", - "dhlestudio.com.co", - "diabetes-healthnet.ac.uk", - "diablo3.com", - "diabloimmortal.com", - "dialga.com", - "dialogflow.com", - "diamantewebcam.com", - "diamm.ac.uk", - "diamond.ac.uk", - "diamondgirls.co.uk", - "diamondgirlstudio.com", - "dianapost.com", - "dianepoppos.com", "diaoyuislands.org", - "diasporas.ac.uk", - "dice.se", - "dicela.com", - "dicela.net", - "dickeomas.com", - "dickhardon.com", - "dickwhiteacademy.ac.uk", - "dictate.ms", - "didce.com", - "diddykongracing.com", - "didet.ac.uk", - "didilist.com", - "dierectv.com", - "dietandhealth.ac.uk", "difangwenge.org", "dify.ai", "digg.com", - "digicert-cn.com", - "digicert-validation.com", - "digicert.com", "digiland.tw", - "digimap.ac.uk", "digisfera.com", - "digital-anime.com", - "digital-id.ch", - "digital-rb.com", - "digitalassetlinks.org", - "digitalcertvalidation.com", - "digitalcreativity.ac.uk", - "digitaldesire.com", - "digitalhub.com", - "digitalid.ch", - "digitallifespan.ac.uk", "digitalnomadsproject.org", - "digitalocean.com", - "digitaloceanspaces.com", - "digitalpack.com", - "digitalplayground.com", - "digitalplaygroundnetwork.com", - "digitalprototyping.com", - "digitalscholarship.ac.uk", - "digitalsocialresearch.ac.uk", - "digitaltransformations.ac.uk", - "digitaltrends.com", - "digitisingscotland.ac.uk", - "digitop.ac.uk", - "digitrans.ac.uk", - "digitwin.ac.uk", "diigo.com", "dilber.se", - "dilcdn.com", - "dilstoncollege.ac.uk", "dingchin.com.tw", - "dinotube.com", "dipity.com", - "dippam.ac.uk", - "dirac.ac.uk", - "dirctv.com", - "direcpath.com", - "direcpath.net", "directcreative.com", - "directtv-deals.tv", - "directtv-dish.com", - "directtv.net", - "directtvdeals.tv", - "directtvreviews.com", - "directv-4-you.com", - "directv-newyork.com", - "directv.com", - "directvadsales.com", - "directvatlantaga.com", - "directvboston.com", - "directvbundles.com", - "directvbusiness.com", - "directvbusinessmarket.com", - "directvcincinnatioh.com", - "directvcinema.com", - "directvconnect.com", - "directvcookevilletn.com", - "directvcrossvilletn.com", - "directvdealer.com", - "directvdeals.com", - "directvdealsnow.com", - "directvdsl.tv", - "directvforhotels.com", - "directvgrandslam.com", - "directvhouston.com", - "directvinternet.com", - "directvkentucky.com", - "directvlebanontn.com", - "directvlosangeles.com", - "directvmetropolisil.com", - "directvmonitoring.com", - "directvmurfreesborotn.com", - "directvnewhampshire.com", - "directvnow.com", - "directvoffercodes.com", - "directvonline.com", - "directvplans.com", - "directvpomise.com", - "directvpromise.com", - "directvpromotions.com", - "directvrebate.com", - "directvrichmond.com", - "directvsavings.com", - "directvsports.com", - "directvsundayticket.com", - "direectv.com", - "diretv.com", - "dirty.games", - "dirtyasiantube.com", - "dirtydoglinks.com", - "dirtyfarmer.com", - "dirtyflix.com", - "dirtyhomefuck.com", - "dirtyleague.com", - "dirtyonline.com", - "dirtypornvids.com", - "dirtyscat.org", - "dirtyshack.com", - "dirtyship.com", - "dis.gd", - "disability.ac.uk", - "disabilitytoolkits.ac.uk", - "disco-api.com", "discoins.com", - "discomax.com", "disconnect.me", - "discord-activities.com", - "discord.co", "discord.com", - "discord.design", - "discord.dev", "discord.gg", - "discord.gift", - "discord.gifts", "discord.media", - "discord.new", - "discord.store", - "discord.tools", - "discordactivities.com", "discordapp.com", - "discordapp.io", "discordapp.net", - "discordcdn.com", - "discordmerch.com", - "discordpartygames.com", - "discordsays.com", - "discordstatus.com", - "discountbeatsbydre-us.com", - "discountbeatsstore.com", - "discountedporn.com", - "discountporn.club", - "discover.ac.uk", - "discovereconomics.ac.uk", - "discovery.ac.uk", - "discoveryinvestigations.ac.uk", - "discoveryplus.com", - "discreet.com", "discuss.com.hk", "discuss4u.com", - "discussionsapple.com", "dish.com", - "dishworld.com", - "disinhe.ac.uk", "disk.yandex", - "disney-asia.com", - "disney-discount.com", "disney-plus.net", - "disney-studio.com", - "disney-studio.net", - "disney.asia", - "disney.be", - "disney.bg", - "disney.ca", - "disney.ch", - "disney.co.il", - "disney.co.jp", - "disney.co.kr", - "disney.co.th", - "disney.co.uk", - "disney.co.za", - "disney.com", - "disney.com.au", - "disney.com.br", - "disney.com.hk", - "disney.com.tw", - "disney.cz", - "disney.de", - "disney.dk", - "disney.es", - "disney.fi", - "disney.fr", - "disney.gr", - "disney.hu", - "disney.id", - "disney.in", - "disney.io", - "disney.it", - "disney.my", - "disney.nl", - "disney.no", - "disney.ph", - "disney.pl", - "disney.pt", - "disney.ro", - "disney.ru", - "disney.se", - "disney.sg", - "disneyadsales.com", - "disneyarena.com", - "disneyaulani.com", - "disneybaby.com", - "disneycareers.com", - "disneychannelonstage.com", - "disneychannelroadtrip.com", - "disneycruisebrasil.com", - "disneyenconcert.com", - "disneyhentai.com", - "disneyiejobs.com", - "disneyinflight.com", - "disneyinternational.com", - "disneyinternationalhd.com", - "disneyjunior.com", - "disneyjuniortreataday.com", - "disneylatino.com", - "disneymagicmoments.co.il", - "disneymagicmoments.co.uk", - "disneymagicmoments.co.za", - "disneymagicmoments.de", - "disneymagicmoments.es", - "disneymagicmoments.fr", - "disneymagicmoments.gen.tr", - "disneymagicmoments.gr", - "disneymagicmoments.it", - "disneymagicmoments.pl", - "disneymagicmomentsme.com", - "disneyme.com", - "disneymeetingsandevents.com", - "disneymovieinsiders.com", - "disneymusicpromotion.com", - "disneynewseries.com", - "disneynow.com", - "disneypeoplesurveys.com", "disneyplus.com", - "disneyredirects.com", - "disneysrivieraresort.com", - "disneystore.com", - "disneystreaming.com", - "disneysubscription.com", - "disneytickets.co.uk", - "disneyturkiye.com.tr", - "disneytvajobs.com", - "disneyworld-go.com", "disp.cc", "disqus.com", - "disquscdn.com", - "disqusservice.com", - "distillate.ac.uk", - "distinct.ac.uk", "dit-inc.us", - "divas.com.uy", - "diversityuk.ac.uk", - "diyarbakirescort.com", - "diyuser.buzz", + "diyin.org", "dizhidizhi.com", "dizhuzhishang.com", "djangosnippets.org", - "djkav.mom", "djorz.com", - "djreprints.com", - "dkbeatsbydre.com", - "dkcloud.cc", - "dkk37.com", - "dkr.com", - "dkrecttv.com", - "dl-iphone.com", "dl-laby.jp", - "dl.ac.uk", - "dl4d.ac.uk", - "dlap001.xyz", - "dlap301.com", - "dldlinks.com", - "dldshare.net", - "dlercloud.com", - "dlercloud.me", - "dlercloud.org", - "dleris.best", - "dlfacebook.com", - "dlhe.ac.uk", "dlive.tv", - "dls.ac.uk", "dlsite.com", - "dlsite.com.tw", "dlsite.jp", - "dlsitenews.com", - "dlsitestudio.com", "dlyoutube.com", - "dm-event.net", "dm530.net", + "dma.mil", "dmarcnetworks.com", "dmc.nico", "dmcdn.net", - "dmed.technology", - "dmgmediaprivacy.co.uk", "dmhy.org", - "dml.ac.uk", - "dmm-extension.com", "dmm.co.jp", "dmm.com", - "dmmapis.com", - "dmmrex.com", - "dmu.ac.uk", - "dmuk.ac.uk", - "dna-network.ac.uk", - "dna.ac.uk", - "dnaav.com", - "dnai.in", - "dnaindia.com", - "dnaspaces.io", - "dncolleges.ac.uk", - "dndbeyond.com", "dns-dns.com", "dns-stuff.com", "dns.google", - "dns.sb", "dns04.com", "dns05.com", "dns1.us", @@ -7890,471 +1484,107 @@ var rules = [ "dnset.com", "dnsrd.com", "dnssec.net", - "dnsvisa.com", "dnvod.tv", - "dnvodcdn.me", - "do.co", - "dobbyporn.com", - "dobendan.de", - "doceapower.com", + "doc.new", "docker.com", "docker.io", - "dockerizer.com", - "docleradn.com", - "doclercdn.com", - "docs.com", "docs.new", - "docs.rs", - "doctor-videos.com", "doctorvoice.org", - "documentforce.com", "documentingreality.com", - "docusend.ac.uk", - "dodgersexcartoons.com", - "dodi-repacks.download", - "dodi-repacks.site", - "dodv.com", - "doeda.com", - "dogatch.jp", - "dogcumshot.net", - "dogecoin.com", - "dogfart.com", "dogfartnetwork.com", - "dogmovie.net", - "dogofcum.com", - "dogslife.ac.uk", - "dogspics.net", - "doi.info", - "doi.org", - "doitpoms.ac.uk", - "dojin-dl.com", "dojin.com", - "dojindb.net", - "dojinmanga.net", - "dojinwatch.com", "dok-forum.net", - "dokusho-ojikan.jp", "dolc.de", "dolf.org.hk", - "dollarfotoclub.com", - "dollarphotoclub.com", - "dollarphotosclub.com", "dollf.com", - "dolphiners.com", "domain.club.tw", "domain.glass", "domains.google", "domaintoday.com.au", - "dombosco.com.br", - "domesticabuserisk.ac.uk", - "domywife.com", - "don.ac.uk", - "donatecarsoh.org", - "doncaster.ac.uk", "donga.com", "dongtaiwang.com", "dongtaiwang.net", "dongyangjing.com", - "donkeykongcountryreturns.com", - "donkparty.com", "donmai.us", - "donpornogratis.com", - "donsnaughtymodels.com", - "dontbubble.us", "dontfilter.us", "dontmovetochina.com", - "donttrack.us", - "doodhwali.com", - "doom.com", - "doom9.org", - "dopaminegirl.com", + "doosho.com", + "doourbest.org", "dorjeshugden.com", - "dorset-acl.ac.uk", - "dorset-al.ac.uk", - "doseofporn.com", - "dot-mac.de", - "dot.net", - "dotcernpilot.info", - "dotdeb.org", - "dotfacebook.com", - "dotfacebook.net", - "dotfreesex.com", - "dotherex.com", - "dothq.org", - "dotmac.de", "dotplane.com", - "dotrural.ac.uk", "dotsub.com", "dotvpn.com", "doub.io", "doubibackup.com", - "doubleclick-cn.net", - "doubleclick.cn", - "doubleclick.com", - "doubleclick.net", + "doubiyunbackup.com", "doublethinklab.org", "doubmirror.cf", "douchi.space", - "doufurufabu.xyz", "dougscripts.com", "douhokanko.net", - "doujin-eromanga.com", - "doujin-freee.com", - "doujin-info.net", - "doujin-night.com", "doujincafe.com", - "doujinfree.com", - "doujinland.info", - "doujinnomori.com", - "doujins.com", - "doure.net", - "douwriteright.com", - "douya.org", - "douyintt10.me", - "douzinnsi-eromannga.com", - "dovercollege.ac.uk", - "dovertechnicalcollege.ac.uk", "dowei.org", "dowjones.com", - "dowjones.io", - "dowjoneson.com", - "download.com", - "downloadpass.com", - "downloadsforipod.com", "dphk.org", - "dpoc.ac.uk", + "dpool.top", "dpp.org.tw", "dpr.info", - "dpscitt.ac.uk", - "dqrpb9wgowsf5.cloudfront.net", - "draftjs.org", - "dragonage.com", - "dragonagekeep.com", - "dragonagemovie.com", "dragonex.io", - "dragonhentai.net", - "dragonip.ac.uk", - "dragoniscoming.com", "dragonsprings.org", - "drainage.com", - "drakemarineinstitute.ac.uk", - "drawnevidence.ac.uk", - "drbdsmporn.com", - "drbeatsukmart.com", - "drbizzaro.com", - "drbl.in", - "drdre-beats.com", - "drdrebeats-chen.com", - "drdrebeats-headphone.com", - "drdrebeats-usa.com", - "drdrebeatsale.com", - "drdrebeatsbillig.com", - "drdrebeatsdesale.com", - "drdrebeatsdiscount.com", - "drdrebeatsforu.com", - "drdrebeatsretail2013.com", - "drdrebeatssale7.com", - "drdrebeatsuk.com", - "drdrefnac.com", - "drdreheadphonebeats.com", - "drdreheadphonekey.com", - "drdreheadphonesusstore.com", - "drdremonster-beats.com", - "drdremonsterdre.com", - "drdreprobeatssale.com", - "dream-cdt.ac.uk", "dreamamateurs.com", - "dreambmw.ca", - "dreamforce.com", - "dreammovies.com", - "dreamteamfc.com", - "dreamtoplay.com", - "dreamworks.com", - "drebeats-australia.com", - "drebeats-france.com", - "drebeats-monster.com", - "drebeats-monsteraustralia.com", - "drebeats-monsterusa.com", - "drebeats-singapore.com", - "drebeats-singapore.net", - "drebeats-singaporecheap.com", - "drebeats-singaporecheap.net", - "drebeats-solo.com", - "drebeats-studio.com", - "drebeatsaustralia-cheap.com", - "drebeatsaustralia-cheap.net", - "drebeatsbuy.com", - "drebeatsbydreoutlet.com", - "drebeatscanada.com", - "drebeatsdeutschland.net", - "drebeatsforsaleus.com", - "drebeatsheadphones-nz.com", - "drebeatshome.com", - "drebeatsoldes.com", - "drebeatsoutletstore.com", - "drebeatspill.com", - "drebeatssite.com", - "drebeatssolocybermondaysale.com", - "drebeatsstudio2013.com", - "drebeatstudio.com", - "drebyby.com", - "dreeam.ac.uk", - "dremonsterbeatsoutlets.com", - "dreprobeats.com", - "dreprofy.com", "drepung.org", - "drg.ac.uk", "drgan.net", - "dri.ac.uk", - "dribbble.com", - "drindod.ac.uk", - "driverxxx.com", - "drivevideo.xyz", - "driving.co.uk", - "drkogyi.com", - "drmario-world.com", - "drmgmggyi-mm.blogspot.com", "drmingxia.org", - "drnastran.com", - "drns.ac.uk", - "dronedj.com", "dropbooks.tv", - "dropbox-dns.com", "dropbox.com", - "dropbox.tech", "dropboxapi.com", - "dropboxbusiness.com", - "dropboxcaptcha.com", - "dropboxforum.com", - "dropboxforums.com", - "dropboxinsiders.com", - "dropboxmail.com", - "dropboxpartners.com", - "dropboxstatic.com", "dropboxusercontent.com", "drsunacademy.com", "drtuber.com", - "drunk6.com", - "drunkenstepfather.com", - "drunkentop.com", - "drweb-av.de", - "drweb-av.es", - "drweb-av.it", - "drweb-av.pl", - "drweb.by", - "drweb.cn", - "drweb.co.jp", - "drweb.com", - "drweb.fr", - "drweb.kz", - "drweb.uz", - "ds0h3roq6wcgc.cloudfront.net", - "dscis.ac.uk", "dscn.info", - "dses.ac.uk", - "dsex.to", - "dsfc.ac.uk", - "dsl.ac.uk", - "dslr.net", - "dslreports.com", "dsmtp.com", "dssott.com", - "dst-dtc.ac.uk", "dstk.dk", - "dsw.ac.uk", - "dswz88.xyz", - "dsyiren.com", - "dt-toolkit.ac.uk", - "dtc-online.ac.uk", - "dtci.co", - "dtci.technology", "dtdns.net", "dtiblog.com", "dtic.mil", - "dtlgalleryint.cloudapp.net", - "dtsell.com", - "dtv2009offers.com", - "dtvce.com", "dtwang.org", - "dualeotruyen1s.com", "duanzhihu.com", - "dubai-escort-list.com", "dubox.com", - "ducere.ac.uk", - "duchy.ac.uk", - "duck.co", "duck.com", "duckdns.org", - "duckduckco.com", - "duckduckco.de", - "duckduckgo.ca", - "duckduckgo.co", - "duckduckgo.co.uk", "duckduckgo.com", - "duckduckgo.com.mx", - "duckduckgo.com.tw", - "duckduckgo.de", - "duckduckgo.dk", - "duckduckgo.in", - "duckduckgo.jp", - "duckduckgo.ke", - "duckduckgo.mx", - "duckduckgo.nl", - "duckduckgo.org", - "duckduckgo.pl", - "duckduckgo.sg", - "duckduckgo.uk", - "duckduckhack.com", - "duckgo.com", "duckload.com", - "duckmovie.com", "duckmylife.com", - "ducksear.ch", - "duckside.com", - "dudethrill.com", - "dudley.ac.uk", - "dudleycol.ac.uk", - "dudleylearners.ac.uk", - "dudleylearning.ac.uk", "duga.jp", "duihua.org", "duihuahrjournal.org", - "dukgo.com", - "dulceecuador.com", "dumb1.com", - "dumgal.ac.uk", - "dump.xxx", - "dumpxxx.net", - "dun.ac.uk", - "dund.ac.uk", - "dundee-tech.ac.uk", - "dundee.ac.uk", - "dundeeandangus.ac.uk", - "dundeeandanguscollege.ac.uk", - "dundeecoll.ac.uk", - "dundeecollege.ac.uk", - "dune.ac.uk", - "dungeonkeeper.cn", - "dungeonkeeper.com", - "dungeonkeeper.com.cn", - "dunstable.ac.uk", - "dunstaffnage-marine-lab.ac.uk", "dunyabulteni.net", - "duolaapian126.xyz", - "duolaapian127.xyz", - "duolingo.com", "duoweitimes.com", - "duoweiweek.com", "duping.net", "duplicati.com", "dupola.com", "dupola.net", - "dur.ac.uk", - "durex-shop.ch", - "durex-shopline.com", - "durex-slovenia.si", - "durex.at", - "durex.be", - "durex.cl", - "durex.co.id", - "durex.co.il", - "durex.co.nz", - "durex.co.th", - "durex.co.uk", - "durex.co.za", - "durex.com", - "durex.com.au", - "durex.com.bd", - "durex.com.co", - "durex.com.hr", - "durex.com.my", - "durex.com.ng", - "durex.com.pe", - "durex.com.ph", - "durex.com.pk", - "durex.com.sg", - "durex.com.tr", - "durex.cz", - "durex.de", - "durex.dk", - "durex.ee", - "durex.es", - "durex.fi", - "durex.fr", - "durex.hu", - "durex.ie", - "durex.it", - "durex.jp", - "durex.lv", - "durex.mx", - "durex.nl", - "durex.no", - "durex.pl", - "durex.pt", - "durex.ro", - "durex.ru", - "durex.se", - "durex.us", - "durexcam.com", - "durexcanada.com", - "durexchina.com", - "durexindia.com", - "durexloveclub.com", - "durexukraine.com", - "durexusa.com", - "durham.ac.uk", - "durhampriory.ac.uk", "dushi.ca", - "dutch.ac.uk", - "dutrai.com", "duyaoss.com", - "duyaossr.com", "dvdpac.com", - "dvdstudiopro.biz", - "dvdstudiopro.com", - "dvdstudiopro.info", - "dvdstudiopro.net", - "dvdstudiopro.org", - "dvdstudiopro.us", - "dvdtrailertube.com", "dvorak.org", "dw-world.com", "dw-world.de", "dw.com", "dw.de", "dweb.link", - "dwg.com", - "dwgtrueconvert.com", - "dwgtrueview.com", "dwheeler.com", - "dwl.ac.uk", "dwnews.com", "dwnews.net", - "dx9527.cc", "dxiong.com", - "dxyav.co", - "dydx.exchange", - "dyfl1.pw", - "dykkng5hnh52u.cloudfront.net", - "dykycl.com", - "dynacw.co.jp", - "dynacw.com", - "dynacw.com.cn", - "dynacw.com.hk", - "dynacw.com.tw", - "dynafleetonline.com", "dynamic-dns.net", - "dynamicdialects.ac.uk", "dynamicdns.biz", "dynamicdns.co.uk", "dynamicdns.me.uk", "dynamicdns.org.uk", - "dynamics.com", - "dynamobuilds.com", - "dynamopackages.com", - "dynamoreach.com", "dynawebinc.com", - "dyncdn.me", "dyndns-ip.com", "dyndns-pics.com", "dyndns.org", @@ -8363,1170 +1593,191 @@ var rules = [ "dynu.com", "dynu.net", "dysfz.cc", - "dzen.ru", "dzze.com", - "e-bay.com", - "e-bay.it", - "e-bay.net", - "e-c-a.ac.uk", - "e-cba.org", "e-classical.com.tw", "e-gold.com", - "e-goods.ru", "e-hentai.org", "e-hentaidb.com", - "e-htpx.ac.uk", "e-info.org.tw", - "e-learningnorthwest.ac.uk", - "e-learningresearch.ac.uk", - "e-liv.ac.uk", - "e-merlin.ac.uk", - "e-rihs.ac.uk", - "e-science.ac.uk", - "e-scrf.ac.uk", - "e-studio.ac.uk", - "e-szigno.hu", - "e-timing.ne.jp", "e-traderland.net", - "e-tugra.com", "e-zone.com.hk", "e123.hk", - "e3an.ac.uk", - "e53w.com", - "e621.net", - "ea-anz-press.com", - "ea.com", - "eaaccess.com", - "eablackbox.com", - "eac-cdn.com", - "eacashcard.com", - "eachpay.com", - "eachpay.net", - "eacodigos.com", - "eadultgames.com", - "eafootballworld.com", - "eaifhe.ac.uk", - "eakorea.co.kr", - "ealingcoll.ac.uk", - "eamirrorsedge.com", - "eamobile.com", - "eamythic.com", - "eamythic.net", - "eandc-sirgar.ac.uk", - "eanordic.com", - "eaplay.com", - "earlham.ac.uk", - "earlhaminstitute.ac.uk", - "earlyenglishlaws.ac.uk", - "earlymoderndressandtextiles.ac.uk", - "earlyphonography.ac.uk", "earlytibet.com", - "earngeek.com", - "earphonescheapest.com", - "earpod.net", "earthcam.com", - "earthsciencescotland.ac.uk", "earthvpn.com", - "ease.ac.uk", - "easeit-eng.ac.uk", - "easic.com", - "easports.com", - "easports.jp", - "easportsactive.com", - "easportsactiveonline.com", - "easportsfootball.com", - "easportsfootballclub.com", - "easportsmma.com", - "easportsworld.com", - "east-anglia.ac.uk", - "east-london.ac.uk", - "east-yorks-coll.ac.uk", - "east15.ac.uk", - "eastantrim-institute.ac.uk", - "eastbabes.com", - "eastberks.ac.uk", - "eastchem.ac.uk", - "eastcoast.ac.uk", - "eastdevon.ac.uk", - "eastdurham.ac.uk", - "eastendcbc.ac.uk", + "eastasiaforum.org", "eastern-ark.com", - "easternarc.ac.uk", "easternlightning.org", - "eastkent.ac.uk", - "eastkentcollege.ac.uk", - "eastleigh.ac.uk", - "eastmallingresearch.ac.uk", - "eastmidlandscetls.ac.uk", - "eastnorfolk.ac.uk", - "easton-college.ac.uk", - "easton.ac.uk", - "eastonotley.ac.uk", - "eastore.com", - "eastridingadultlearn.ac.uk", - "eastridingcollege.ac.uk", - "eastscotbiodtp.ac.uk", - "eastsurrey.ac.uk", - "eastsurreycollege.ac.uk", - "easttouch.com.hk", "eastturkestan.com", "eastturkistan-gov.org", "eastturkistan.net", "eastturkistancc.org", "eastturkistangovernmentinexile.us", - "eastview.com", - "eastweek.com.hk", - "easy-jtag.com", - "easy.ac", - "easyanticheat.net", "easyca.ca", - "easylist.to", - "easynike.com", "easypic.com", - "easysexporn.com", - "eater.com", - "eatthatfrog.ac.uk", - "eb.com", - "ebahy.com", - "ebalovo.com", - "ebam.ac.uk", - "ebay-25-assets.s3-us-west-1.amazonaws.com", - "ebay-authenticate.net", - "ebay-confirm.com", - "ebay-course.com", - "ebay-cz.com", - "ebay-delivery.com", - "ebay-discoveries.com", - "ebay-fashion.com", - "ebay-inc.com", - "ebay-inc.net", - "ebay-inc.org", - "ebay-online.com", - "ebay-sales.com", - "ebay-stories.com", - "ebay-us.com", - "ebay-vacation.com", - "ebay.at", - "ebay.be", - "ebay.ca", - "ebay.ch", - "ebay.co.nz", - "ebay.co.uk", - "ebay.co.ve", - "ebay.co.za", - "ebay.com", - "ebay.com.ar", - "ebay.com.au", - "ebay.com.ec", - "ebay.com.hk", - "ebay.com.mt", - "ebay.com.my", - "ebay.com.ph", - "ebay.com.sg", - "ebay.de", - "ebay.es", - "ebay.fr", - "ebay.ie", - "ebay.in", - "ebay.it", - "ebay.jp", - "ebay.lt", - "ebay.mn", - "ebay.nl", - "ebay.org", - "ebay.ph", - "ebay.pk", - "ebay.pl", - "ebay.sg", - "ebay.us", - "ebay.vn", - "ebay25.com", - "ebay68.com", - "ebaya.com", - "ebayads.com", - "ebayads.net", - "ebayadvertising.com", - "ebayanunsios.net", - "ebayauction.com", - "ebayaustralia.com", - "ebayauthenticate.com.cn", - "ebaybags.com", - "ebaybank.com", - "ebaybenefits.com", - "ebayboutique.com", - "ebayca.com", - "ebayca.org", - "ebaycafe.com", - "ebaycar.com", - "ebaycareers.com", - "ebaycbt.co.kr", - "ebaycdn.net", - "ebaychina.net", - "ebayclassifieds.com", - "ebayclassifieds.info", - "ebayclassifieds.org", - "ebayclassifieds.tv", - "ebayclassifiedsgroup.com", - "ebayclassifiedsgroup.info", - "ebayclassifiedsgroup.org", - "ebayclassifies.com", - "ebayclub.com", - "ebaycoins.com", - "ebaycom.com", - "ebaycommercenetwork.com", - "ebaycourse.com", - "ebayd.com", - "ebayde.com", - "ebaydlassifieds.com", - "ebaydts.com", - "ebayedu.com", - "ebayeletro.com", - "ebayenterprise.com", - "ebayenterprise.info", - "ebayenterprise.net", - "ebayenterprise.tv", - "ebayetc.com", - "ebayexpress.sg", - "ebayfashion.com", - "ebayfashion.net", - "ebayforcharity.org", - "ebayforeclosure.org", - "ebayfrance.com", - "ebayglobalshipping.com", - "ebaygroup.com", - "ebayhabit.com", - "ebayheels.com", - "ebayhots.com", - "ebayimg.com", - "ebayinc.com", - "ebayinc.net", - "ebayinc.org", - "ebayincconnectedcommerce.net", - "ebayinkblog.com", - "ebayinternetsalestax.com", - "ebayit.com", - "ebayjewelry.com", - "ebayjob.com", - "ebayla.org", - "ebaylisting.com", - "ebaylocal.net", - "ebaylocationsdevacances.com", - "ebaymag.com", - "ebaymainstreet.com", - "ebaymall.com", - "ebaymarketplace.net", - "ebaymotors.ca", - "ebaymotors.com", - "ebaymotors.org", - "ebaymotorsblog.com", - "ebaynow.com", - "ebaynyc.com", - "ebayon.com", - "ebayon.net", - "ebayoncampus.com", - "ebayopen.com", - "ebayopensource.com", - "ebayopensource.net", - "ebaypakistan.net", - "ebaypark.com", - "ebayparts.com", - "ebayprivacycenter.com", - "ebayqq.com", - "ebayradio.com", - "ebayrtm.com", - "ebayseller.com", - "ebayshoesstore.com", - "ebayshop.com", - "ebayshop111.com", - "ebayshopping.org", - "ebaysocial.com", - "ebaysocial.ru", - "ebaysoho.com", - "ebaysohos.com", - "ebaystatic.com", - "ebaystore.com", - "ebaystore77.com", - "ebaystyle.com", - "ebaysweden.com", - "ebayt.com", - "ebaytechblog.com", - "ebaytopratedseller.net", - "ebaytrading.com", - "ebaytradingassistant.com", - "ebaytv.org", - "ebayuae.net", - "ebayvakantiehuizen.com", - "ebayvalet.com", - "ebayvietnam.net", - "ebayworlds.com", - "ebayy.com", "ebc.net.tw", - "ebenporno.com", - "ebi.ac.uk", - "ebnet.ac.uk", "ebony-beauty.com", - "ebonyinlove.com", - "ebonywebcamhub.com", - "eboobstore.com", "ebookbrowse.com", "ebookee.com", - "ebookforipad.com", - "ebrahimcollege.ac.uk", - "ebrc.ac.uk", - "ebs.ac.uk", - "ebsco.com", - "ebscohost.com", - "ebsl.ac.uk", - "ebslondon.ac.uk", "ebtcbank.com", - "ebuyheadphones.com", - "eca.ac.uk", - "ecampus-leeds.ac.uk", - "ecc.ac.uk", - "ecchinohentai.ru", - "ecci.ac.uk", - "ecclescollege.ac.uk", - "ecdc.ac.uk", - "ecert.gov.hk", - "eceta.ac.uk", "ecfa.org.tw", - "ecgapp.net", "echainhost.com", - "echichimato.com", - "echocdn.com", "echofon.com", - "echosign.com", "ecimg.tw", "eckosia.org", - "eclipse.ac.uk", - "eclw.ac.uk", "ecministry.net", - "ecn.ac.uk", - "ecoforme.jp", - "economicfutures.ac.uk", - "economics.ac.uk", - "economicsnetwork.ac.uk", "economist.com", - "economistgroup.com", - "economistgroupcareers.com", - "ecos.ac.uk", - "ecosystemservices.ac.uk", - "ecotect.com", - "ecotect.net", - "ecpa.fr", - "ecr.aws", - "ecsa.ac.uk", - "ecscad.com", - "ecspublisher.com", "ecstart.com", - "ecu.ac.uk", - "ecuatorianas.best", - "ecw.ac.uk", - "ed-coll.ac.uk", - "ed.ac.uk", - "ed6.ac.uk", - "edam.ac.uk", - "edc.ac.uk", - "edcity.hk", - "edcoll.ac.uk", - "edengay.net", - "edge-hill-college.ac.uk", "edgecastcdn.net", - "edgedatg.com", - "edgefonts.net", - "edgehill.ac.uk", - "edgehilluniversity.ac.uk", - "edgehotelschool.ac.uk", - "edgekey.net", - "edgemeplease.com", "edgesuite.net", - "edhcc.ac.uk", "edicypages.com", - "edifhe.ac.uk", - "edina.ac.uk", - "edinburgh.ac.uk", - "edinburghcollege.ac.uk", - "edinburghstelford.ac.uk", - "edinburghstelfordcollege.ac.uk", - "edinburghtc.ac.uk", - "edisebay.com", - "editorx.com", - "edlab.ac.uk", "edmontonchina.cn", "edmontonservice.com", - "edninfo.com", "edns.biz", "edoors.com", - "edshare.ac.uk", - "edtech.ac.uk", - "edu-research.org", - "edu.ir", "edubridge.com", - "education-cadcam.com", - "educationlondonconnect.ac.uk", - "educationpartnershipne.ac.uk", - "educationpartnershipnortheast.ac.uk", - "eduplus.hk", "edupro.org", - "eduroam.ac.uk", - "eduserv.ac.uk", - "edward-greene.ac.uk", - "edwardllwyd.ac.uk", "edx-cdn.org", - "edx.org", - "eebay.com", - "eecm.ac.uk", - "eenike.com", - "eep.ac.uk", - "eera.ac.uk", - "ees.ac.uk", "eesti.ee", - "eevl.ac.uk", - "eevlextra.ac.uk", - "eevlxtra.ac.uk", "eevpn.com", - "efc.ac.uk", "efcc.org.hk", - "efetedc.ac.uk", - "eff.org", "effers.com", - "efficiencyexchange.ac.uk", "efksoft.com", - "efproject.net", "efreenews.com", - "efs.ac.uk", "efukt.com", - "efutures.ac.uk", - "egghead.io", - "egmontbooks.co.uk", - "egotastic.com", - "egta.com", - "egyptrevolution2011.ac.uk", - "ehche.ac.uk", - "ehgt.org", - "ehtracker.org", - "ehu.ac.uk", - "ehv.cc", - "ehwiki.org", "eic-av.com", - "eicdt.ac.uk", - "eidc.ac.uk", - "eighteen-store18x.jp", - "eilieili.cc", - "einfrastructureforum.ac.uk", - "einfrastructuresouth.ac.uk", - "einstein.com", - "eira.ac.uk", "eireinikotaerukai.com", "eisbb.com", - "eiu.com", - "eius.ac.uk", - "ekcgroup.ac.uk", - "ekhindi.com", - "ekhokavkaza.com", - "eklearning.ac.uk", - "ekolojik.org", "eksisozluk.com", - "el-ladies.com", - "elanguages.ac.uk", - "elasticbeanstalk.com", - "elatt.ac.uk", - "elc.ac.uk", "elconfidencial.com", - "elder-cove.ac.uk", - "elderscrolls.com", - "elearning.ac.uk", - "elearningnortheast.ac.uk", - "elearningresearch.ac.uk", - "electbabe.com", "electionsmeter.com", - "electrek.co", - "electricalmachineshub.ac.uk", - "electricluxury.com", - "electrochem.org", - "electronicarts.com", - "electronicarts.fr", - "electronjs.org", - "element.io", - "elephantlist.com", - "elephantsdream.org", - "elephanttube.com", - "elephanttubenew.com", - "elgaronline.com", "elgoog.im", - "elib.ac.uk", - "elifesciences.org", - "elihe.ac.uk", - "elite.ac.uk", - "elite.com", - "elitebabes.com", - "eliteindianporn.com", - "elitvip.ru", - "elixir-lang.org", - "elixir.ac.uk", - "elizabethmontagunetwork.ac.uk", "ellawine.org", - "elliotthudsoncollege.ac.uk", - "elmwood.ac.uk", - "elne.ac.uk", - "elog-ch.com", - "elog-ch.net", - "elp.ac.uk", "elpais.com", - "elpornoamateur.com", - "elpube-scat-movies.blogspot.com", - "elrah.ac.uk", - "elrc.ac.uk", - "elrepo.org", - "els-cdn.com", - "elsa-project.ac.uk", - "elsa.ac.uk", - "elsevier-ae.com", - "elsevier.com", - "elsevier.io", - "elt.ac.uk", "eltondisney.com", - "elum.ac.uk", - "em-toolkit.ac.uk", - "emac.co.in", - "emac.in", "emaga.com", - "emagic.de", - "emahsn.ac.uk", - "email-bimm.ac.uk", "emanna.com", - "emas.ac.uk", - "embase.com", - "embed-cdn.com", - "embed.ly", - "embedly.com", - "ember3dp.com", - "emberprinter.com", - "embl-ebi.ac.uk", - "embl-hamburg.de", - "embl.de", - "embl.fr", - "embl.it", - "embl.org", - "emblstatic.net", "embr.in", - "embs.ac.uk", - "embs.org", - "emc.ac.uk", - "emc.com", - "emcs.org", - "eme.ac.uk", - "emec.ac.uk", - "emedlab.ac.uk", - "emerald.com", - "emergingsolutions.com", - "emgrad.ac.uk", - "emidsvikings.ac.uk", "emilylau.org.hk", - "emo-pain.ac.uk", - "emojipedia.org", - "emol.ac.uk", - "emome.net", "emory.edu", - "empero-right.mom", "empfil.com", - "empflix.com", - "emphasis.ac.uk", - "empornium.site", - "emr.ac.uk", - "ems-ph.org", - "ems.ac.uk", - "emttp.ac.uk", - "emua.ac.uk", "emule-ed2k.com", "emulefans.com", "emuparadise.me", - "emwprep.ac.uk", - "en-compass.ac.uk", - "enablementadobe.com", "enanyang.my", - "enbit.ac.uk", "enca.com", - "encoretvb.com", "encrypt.me", - "encuentroscasualesoecuador.com", "encyclopedia.com", - "enema-porn.com", - "enema-videos.com", - "enemabasics.com", - "enemaexperiences.com", - "enemahistory.com", - "enemainformation.com", - "enemaporn.blogspot.com", - "enemarotica.com", - "enemas4fun.com", - "enemasexfetish.com", - "enematube.com", - "energy2050.ac.uk", - "energybiographies.ac.uk", - "energyforchange.ac.uk", - "energystarbuildings.com", - "energystorage-cdt.ac.uk", "enewstree.com", - "enf-cmnf.com", - "enfa.co.id", - "enfa.com.vn", - "enfaaplus.com", - "enfababy.com", - "enfabebe.com", - "enfabebe.com.br", - "enfabebe.com.co", - "enfabebe.com.do", - "enfabebe.com.ec", - "enfabebe.com.mx", - "enfabebe.com.pe", - "enfabebe.com.ve", - "enfabebe3.com.ar", - "enfagrow.co.in", - "enfagrow.com.bn", - "enfagrow.com.my", - "enfagrow.com.ph", - "enfagrow.com.sg", - "enfagrow4.com", "enfal.de", - "enfamama.com.ar", - "enfamama.com.ph", - "enfamil.ca", - "enfamil.com", - "enfamil.es", - "enfamil.pl", - "enfamil.pt", - "enfasmart.com", "engadget.com", "engagedaily.org", - "engageinresearch.ac.uk", - "engageni.ac.uk", - "engcetl.ac.uk", - "engineering.ac.uk", - "engineeringnonlinearity.ac.uk", - "engineeringsigns.ac.uk", - "engineeringvillage.com", - "englishassociation.ac.uk", "englishforeveryone.org", "englishfromengland.co.uk", "englishpen.org", - "engsc.ac.uk", - "enhancementthemes.ac.uk", - "enjoyasianporn.com", - "enjoyfuck.com", "enlighten.org.tw", - "enmat.ac.uk", - "enorf.ac.uk", - "enos.ac.uk", - "enpirion.com", - "ensa.ac.uk", - "ensemble.ac.uk", - "ensemblepurchasing.ac.uk", - "ensfc.ac.uk", - "enspireformula.com", - "enteentegeh.de", - "entensity.net", "entermap.com", - "entermediadb.net", - "entermediadb.org", - "enterprise.ac.uk", - "enterprisebydesign.ac.uk", - "enterprisepaging.com", - "enterpriseresearch.ac.uk", - "enterprisessl.com", "entnt.com", - "entrust.net", - "entrustdatacard.com", - "enveast.ac.uk", - "environment-health.ac.uk", "environment.google", "epa.gov.tw", "epac.to", - "epc.ac.uk", - "epic.ac.uk", - "epic.network", - "epicbrowser.com", - "epicgames.com", - "epicgames.dev", - "epicgamescdn.com", - "epicreads.com", - "epics.ac.uk", - "epicure.ac.uk", - "epigeum.com", - "epikporn.com", - "epinions.com", "episcopalchurch.org", - "episodic.com", - "epizy.com", - "epne.ac.uk", - "epoch.cloud", - "epoch.org.il", - "epochbase.com", - "epochbuy.com", - "epochcar.com", "epochhk.com", - "epochmall.com", - "epochmediagroup.com", - "epochshop.com", - "epochstories.com", - "epochtime.com", "epochtimes-bg.com", "epochtimes-romania.com", - "epochtimes.bg", "epochtimes.co.il", "epochtimes.co.kr", - "epochtimes.co.uk", "epochtimes.com", - "epochtimes.com.au", - "epochtimes.com.br", - "epochtimes.com.sg", "epochtimes.com.tw", - "epochtimes.com.ua", "epochtimes.cz", "epochtimes.de", - "epochtimes.eu", "epochtimes.fr", "epochtimes.ie", "epochtimes.it", "epochtimes.jp", - "epochtimes.nl", - "epochtimes.pl", "epochtimes.ru", "epochtimes.se", - "epochtimeshk.org", "epochtimestr.com", "epochweek.com", "epochweekly.com", "eporner.com", - "eportfolios.ac.uk", - "eppi.ac.uk", - "epping-forest.ac.uk", - "eprc.com.hk", - "epress.ac.uk", "eprice.com.hk", - "eprintsw.com", - "eps.ac.uk", - "epsilon.ac.uk", - "epsrc-centre-lime.ac.uk", - "epsrc-cim-macromoleculartherapies.ac.uk", - "epsrc.ac.uk", - "equal.ac.uk", - "equalityhigher.ac.uk", - "equator.ac.uk", "equinenow.com", - "equistudy.ac.uk", - "era.ac.uk", "erabaru.net", "eracom.com.tw", - "eraofconnection.com", - "erasmus.ac.uk", "eraysoft.com.tr", - "erbecdt.ac.uk", - "erc.ac.uk", "erepublik.com", - "eres.ac.uk", - "eresearchsouth.ac.uk", - "eri.ac.uk", "erights.net", - "erini.ac.uk", - "erito.com", "eriversoft.com", "erktv.com", - "erlang.org", "ernestmandel.org", - "ernw.ac.uk", - "ero-anime.net", - "ero-comic-hunter.net", - "ero-kawa.com", - "ero-labs.cloud", - "ero-labs.com", - "ero-labs.fun", - "ero-labs.net", - "ero-labs.online", - "ero-labs.site", - "ero-ma-nia.com", - "ero-manga-platinum.net", - "ero-mangalife.com", - "eroan.xyz", - "erocurves.com", "erodaizensyu.com", - "erodayo.com", - "erodougazo.com", "erodoujinlog.com", - "erodoujinshi-world.com", "erodoujinworld.com", - "eroelog.com", - "eroero69.work", - "erofights.com", - "erofullsets.net", - "erofus.com", - "erogames.com", - "erogazo-jp.net", - "erogazo-ngo.com", - "erogazopple.com", - "erogazou-pinkline.com", - "erogazoufactory.com", - "erohentai.net", - "erolabs.cloud", - "erolabs.com", - "erolabs.fun", - "erolabs.game", - "erolabs.net", - "erolabs.online", - "erolabsshare.xyz", - "eromanga-ace.com", - "eromanga-cafe.com", "eromanga-kingdom.com", - "eromanga-kong.com", - "eromanga-mainichi.com", - "eromanga-school.com", "eromangadouzin.com", - "eromangajukujo.com", - "eromazofu.com", - "erome.com", - "erome.it", "eromon.net", - "eropasture.com", - "eropics.org", - "eropics.to", "eroprofile.com", - "erosberry.com", - "eroshiko.net", - "erotelki.org", - "eroterest.net", - "erothots.co", - "erotic-artsites.com", - "erotic-hentai.com", - "erotic-photos.net", - "eroticart-top100.com", - "eroticbeauties.net", - "eroticbeautyhub.com", - "erotichdworld.com", "eroticsaloon.net", - "erotictube.me", - "erotikaweb.hu", - "erovizor.ru", - "eroxia.com", - "erp.ac.uk", - "erpe.ac.uk", - "err.sh", - "ertk.net", - "es-visiontimes.com", - "esala.ac.uk", - "esbeatsbydrebuy.com", - "esc.ac.uk", - "escalate.ac.uk", - "escandinavia-arg.com", - "escape.com.au", - "escapestudios.ac.uk", - "escapestudios.co.uk", - "escg.ac.uk", - "escience-etf.ac.uk", - "escience.ac.uk", - "escobarvip.it", - "escoe.ac.uk", - "escort.guide", - "escortamsterdam1.com", - "escortdude.com", - "escortgirls.be", - "escortrankings.uk", - "escp-eap.ac.uk", - "esdi.ac.uk", - "esds.ac.uk", - "ese.ac.uk", - "eselondon.ac.uk", - "esg.ac.uk", - "eshcru.ac.uk", - "esher.ac.uk", - "esi.ac.uk", - "esim.ac.uk", - "esiss.ac.uk", - "eskimotube.com", "eslite.com", - "esm.run", - "esmarthealth.com", - "esmatube.com", "esmtp.biz", - "esnw.ac.uk", - "eso.ac.uk", - "esopworld.com", - "esp-scotland.ac.uk", - "esp32.com", - "esp8266.com", - "espa-headlines.ac.uk", - "espa.ac.uk", - "espadoldettol.com.ar", - "esperanzagomez.org", - "espn.co.uk", - "espn.com", - "espn.net", - "espncdn.com", - "espnqa.com", - "esposasymaridos.com", - "espressif.com", - "esrc.ac.uk", - "esrcfestival.ac.uk", - "esrcmanchesterfest.ac.uk", - "esrcsocietytoday.ac.uk", - "esri.com", - "essex.ac.uk", - "essexacl.ac.uk", - "estudio360.com.co", - "estudiopenthouse.com", - "esu.dog", "esu.im", "esurance.com", "etaa.org.au", "etadult.com", "etaiwannews.com", - "etbc.com.hk", - "etc.ac.uk", - "etcfhe.ac.uk", - "eternum.io", - "etextbooks.ac.uk", - "etheadphones.com", "etherdelta.com", - "ethereum.foundation", - "ethereum.org", "ethermine.org", + "etherscan.com", "etherscan.io", - "ethicsguidebook.ac.uk", - "ethnicity.ac.uk", - "ethos.ac.uk", "etizer.org", - "etnet.com.hk", "etokki.com", "etowns.net", "etowns.org", - "etp-scotland.ac.uk", - "etpress.com.hk", - "ets.ac.uk", "etsy.com", "ettoday.net", - "ettrade.com.hk", - "etviet.com", "etvonline.hk", - "etwealth.com", - "eu-consumer-empowerment.com", "eu.org", - "eubluecardvisa.com", "eucasino.com", - "eued.ac.uk", - "eueuropeansustainabledesign.net", "eulam.com", - "eurekaselect.com", "eurekavpt.com", - "eurobabeindex.com", - "eurobrox.ac.uk", - "eurocodesoftware.com", "eurodasp.com", - "eurogirlsescort.com", - "euroipad.com", - "euromod.ac.uk", "euronews.com", "europa.eu", - "europalibera.org", - "europeansustainabledesign.com", - "europeansustainabledesign.net", - "europeansustainabledesigncouncil.com", - "europeansustainabledesigncouncil.net", - "europepmc.org", - "europeunit.ac.uk", - "europornstar.com", - "eurosexscene.com", - "eva.ac.uk", - "evaelfie.com", - "evalviewer.com", - "evanottyvideos.com", - "evemodels.com", - "eventsinfocus.org", - "evergage.com", - "everia.club", "everipedia.org", - "evernote.com", - "every1dns.net", - "everydayporn.co", - "everymantheatrearchive.ac.uk", - "evesham.ac.uk", - "evilangel.com", - "evilx.su", - "evise.com", - "evolve.ac.uk", - "evolver.com", - "evolver3d.com", - "evolverpro.com", "evozi.com", - "evropaelire.org", "evschool.net", - "ewlc.ac.uk", - "eworld.com", - "ewrs.ac.uk", - "ewva.ac.uk", - "ex.ac.uk", - "exacttarget.com", - "exam-ta.ac.uk", - "exascale-tech.com", + "exam.gov.tw", "exblog.co.jp", "exblog.jp", - "excedo.com", - "excellence.ac.uk", - "excellencelondon.ac.uk", - "exchange.ac.uk", "exchristian.hk", "excite.co.jp", - "excitebots.com", - "exe-coll.ac.uk", - "exec-appointments.com", - "exemplashe.ac.uk", - "exeter.ac.uk", - "exetercollege.ac.uk", - "exeterdeafacademy.ac.uk", - "exetermathematicsschool.ac.uk", - "exetermrcsdf.ac.uk", - "exeterms.ac.uk", - "exgfvideos.xxx", - "exgirlfriendmarket.com", "exhentai.org", - "exiporn.com", "exmo.com", "exmormon.org", - "exoav.com", - "exondomesday.ac.uk", - "exotic-ghana.com", - "exoticuganda.com", - "exp-tas.com", "expatshield.com", "expecthim.com", "expekt.com", - "experience-vmware.com", - "experiencebillmelater.com", - "experienceworks.ac.uk", - "expertmaker.com", "experts-univers.com", - "experts.ac.uk", - "explicittube.com", "exploader.net", - "exploitedcollegegirls.com", - "exploitedteensasia.com", - "exploreintel.com", - "explorespanking.com", "expofutures.com", - "exporntoons.net", - "exposedlatinas.com", "expressvpn.com", - "expresswifi.com", "exrates.me", - "ext-twitch.tv", - "extensions4revit.com", - "extensionworkshop.com", "extmatrix.com", - "extraasian.com", "extrabux.com", - "extraindiansex.com", - "extrajapaneseporn.com", - "extreme-board.com", - "extremepornfilms.com", "extremetube.com", "exx.com", - "exxxtra.net", - "exxxtrasmall.com", - "exxxtrasmall1.com", + "ey.gov.tw", "eyevio.jp", "eyny.com", "ezpc.tk", "ezpeer.com", "ezua.com", - "f-boro-sfc.ac.uk", - "f-dro1d.org", - "f-droid.com", "f-droid.org", "f2pool.com", - "f5pf.com", - "f6988.com", "f8.com", - "f95zone.to", "fa.gov.tw", - "faacebok.com", - "faacebook.com", - "faam.ac.uk", - "faapy.com", - "faasbook.com", - "fabhairypussy.com", - "fablabplymouth.ac.uk", - "fabricmc.net", - "fabuye.top", - "fabuyemian.com", - "facbebook.com", - "facbeok.com", - "facboo.com", - "facbook.com", - "facbool.com", - "facboox.com", - "faccebook.com", - "faccebookk.com", - "facdbook.com", - "facdebook.com", - "face-book.com", - "face.ac.uk", - "face3d.ac.uk", - "faceabook.com", - "facebboc.com", - "facebbook.com", - "facebboook.com", - "facebcook.com", - "facebdok.com", - "facebgook.com", - "facebhook.com", - "facebkkk.com", - "facebo-ok.com", - "faceboak.com", - "facebock.com", - "facebocke.com", - "facebof.com", - "faceboik.com", - "facebok.com", - "facebokbook.com", - "facebokc.com", - "facebokk.com", - "facebokok.com", - "faceboks.com", - "facebol.com", - "facebolk.com", - "facebomok.com", - "faceboo.com", - "facebooa.com", - "faceboob.com", - "faceboobok.com", - "facebooc.com", - "faceboock.com", - "facebood.com", - "facebooe.com", - "faceboof.com", - "facebooi.com", - "facebooik.com", - "facebooik.org", - "facebooj.com", - "facebook-corp.com", - "facebook-covid-19.com", - "facebook-ebook.com", - "facebook-forum.com", - "facebook-hardware.com", - "facebook-inc.com", - "facebook-login.com", - "facebook-newsroom.com", - "facebook-newsroom.org", - "facebook-pmdcenter.com", - "facebook-pmdcenter.net", - "facebook-pmdcenter.org", - "facebook-privacy.com", - "facebook-program.com", - "facebook-studio.com", - "facebook-support.org", - "facebook-texas-holdem.com", - "facebook-texas-holdem.net", "facebook.br", - "facebook.ca", - "facebook.cc", "facebook.com", "facebook.de", "facebook.design", @@ -9534,209 +1785,20 @@ var rules = [ "facebook.in", "facebook.net", "facebook.nl", - "facebook.org", "facebook.se", - "facebook.shop", - "facebook.tv", - "facebook.us", - "facebook.wang", - "facebook123.org", - "facebook30.com", - "facebook30.net", - "facebook30.org", - "facebook4business.com", - "facebookads.com", - "facebookadvertisingsecrets.com", - "facebookappcenter.info", - "facebookappcenter.net", - "facebookappcenter.org", - "facebookatschool.com", - "facebookawards.com", - "facebookblueprint.net", - "facebookbrand.com", - "facebookbrand.net", - "facebookcanadianelectionintegrityinitiative.com", - "facebookcareer.com", - "facebookcheats.com", - "facebookck.com", - "facebookclub.com", - "facebookcom.com", - "facebookconnect.com", - "facebookconsultant.org", - "facebookcoronavirus.com", - "facebookcovers.org", - "facebookcredits.info", - "facebookdating.net", - "facebookdevelopergarage.com", - "facebookdusexe.org", - "facebookemail.com", - "facebookenespanol.com", - "facebookexchange.com", - "facebookexchange.net", - "facebookfacebook.com", - "facebookflow.com", - "facebookgames.com", - "facebookgraphsearch.com", - "facebookgraphsearch.info", - "facebookgroups.com", - "facebookhome.cc", - "facebookhome.com", - "facebookhome.info", - "facebookhub.com", - "facebooki.com", - "facebookinc.com", - "facebookland.com", - "facebooklikeexchange.com", - "facebooklive.com", - "facebooklivestaging.net", - "facebooklivestaging.org", - "facebooklogin.com", - "facebooklogin.info", - "facebookloginhelp.net", - "facebooklogs.com", "facebookmail.com", - "facebookmail.tv", - "facebookmanager.info", - "facebookmarketing.info", - "facebookmarketingpartner.com", - "facebookmarketingpartners.com", - "facebookmobile.com", - "facebookmsn.com", - "facebooknews.com", - "facebooknfl.com", - "facebooknude.com", - "facebookofsex.com", - "facebookook.com", - "facebookpaper.com", - "facebookpay.com", - "facebookphonenumber.net", - "facebookphoto.com", - "facebookphotos.com", - "facebookpmdcenter.com", - "facebookpoke.net", - "facebookpoke.org", - "facebookpoker.info", - "facebookpokerchips.info", - "facebookporn.net", - "facebookporn.org", - "facebookporno.net", - "facebookportal.com", "facebookquotes4u.com", - "facebooks.com", - "facebooksafety.com", - "facebooksecurity.net", - "facebookshop.com", - "facebooksignup.net", - "facebooksite.net", - "facebookstories.com", - "facebookstudios.net", - "facebookstudios.org", - "facebooksupplier.com", - "facebooksuppliers.com", - "facebookswagemea.com", - "facebookswagstore.com", - "facebooksz.com", - "facebookthreads.net", - "facebooktv.net", - "facebooktv.org", - "facebookvacation.com", - "facebookw.com", - "facebookwork.com", - "facebookworld.com", - "facebool.com", - "facebool.info", - "facebooll.com", - "faceboom.com", - "faceboon.com", - "faceboonk.com", - "faceboooik.com", - "faceboook.com", - "faceboop.com", - "faceboot.com", - "faceboox.com", - "facebopk.com", - "facebpook.com", - "facebuk.com", - "facebuok.com", - "facebvook.com", - "facebyook.com", - "facebzook.com", - "facecbgook.com", - "facecbook.com", - "facecbook.org", - "facecook.com", - "facecook.org", - "facedbook.com", - "faceebok.com", - "faceebook.com", - "faceebot.com", - "facegbok.com", - "facegbook.com", - "faceid99.com", - "faceid99.net", - "faceidglobal.com", "faceless.me", - "faceobk.com", - "faceobok.com", - "faceobook.com", - "faceook.com", - "facerbooik.com", - "facerbook.com", - "facesbooc.com", "facesofnyfw.com", "facesoftibetanselfimmolators.info", - "facesounds.com", - "facetime.net", - "facetook.com", - "facevbook.com", - "facewbook.co", - "facewook.com", - "facfacebook.com", - "facfebook.com", - "facilities.ac.uk", - "faciometrics.com", - "fackebook.com", - "faclair.ac.uk", - "facnbook.com", - "facoccmed.ac.uk", - "facrbook.com", - "factograph.info", + "factchecklab.org", "factpedia.org", - "factwire.org", - "facultyopinions.com", - "facvebook.com", - "facwebook.com", - "facxebook.com", - "fadebook.com", - "faebok.com", - "faebook.com", - "faebookc.com", - "faeboook.com", - "faecebok.com", - "faesebook.com", - "fafacebook.com", - "faicbooc.com", "fail.hk", - "failte.ac.uk", - "fairbairn.ac.uk", - "fairfieldfarmcollege.ac.uk", - "fairfieldopportunityfarm.ac.uk", - "fairmarket.com", "faith100.org", "faithfuleye.com", "faiththedog.info", - "fakehub.com", - "fakeorfoto.com", - "fakeorphoto.com", - "faketaxi.com", - "fakings.com", "fakku.net", - "faldgjalg.xyz", - "falkirkcollege.ac.uk", "fallenark.com", - "falmouth.ac.uk", - "falmouthexeterplus.ac.uk", - "falmouthmarineschool.ac.uk", "falsefire.com", "falun-co.org", "falun-ny.net", @@ -9750,7 +1812,6 @@ var rules = [ "falundafa-pa.net", "falundafa-sacramento.org", "falundafa.org", - "falundafa.org.tw", "falundafaindia.org", "falundafamuseum.org", "falungong.club", @@ -9761,40 +1822,11 @@ var rules = [ "faluninfo.net", "falunpilipinas.net", "falunworld.net", - "fameregistry.com", - "famifun.com.tw", - "family-sex.me", - "family-simulator.io", - "family.co.jp", - "family.com.tw", "familyfed.org", - "familylifestudy.ac.uk", - "familymart.com.my", - "familymart.com.ph", - "familypies.net", - "familyporn.tv", - "familypornhd.com", - "familysexsimulator.com", - "familysimulator.com", - "familysimulator.io", - "familystrokes.com", - "familyswap.xxx", - "famima.vn", - "famosascalvas.com", - "famous-nudes.com", - "famous.ac.uk", - "famousinternetgirls.com", - "famousinternetgirlsgalleries.com", - "famousnudes.com", - "famouspornstars.com", "famunion.com", "fan-qiang.com", - "fanaken.com", - "fanatical.com", "fanbox.cc", - "fandango.com", "fandom.com", - "fanfox.net", "fangbinxing.com", "fangeming.com", "fangeqiang.com", @@ -9802,939 +1834,218 @@ var rules = [ "fangmincn.org", "fangong.org", "fangongheike.com", - "fangsung.com", "fanhaodang.com", - "fanhaodian.com", "fanhaolou.com", - "fanhowab.buzz", - "fank.ru", - "fanleakstoday.com", "fanqiang.network", "fanqiang.tk", "fanqiangdang.com", "fanqiangdang.org", "fanqianghou.com", - "fanqianglu.com", "fanqiangyakexi.net", "fanqiangzhe.com", - "fans-here.com", - "fans17.com", - "fans66.tw", - "fansking.tw", - "fansnudes.com", - "fansone.co", - "fansta.me", - "fansteek.com", "fanswong.com", - "fantasiasguatemala.com", - "fantasti.cc", "fantv.hk", "fanyue.info", - "fap-xxx.com", - "fap18.net", - "fap666.com", - "fapality.com", - "fapcat.com", "fapdu.com", - "fapdude.com", - "fapello.com", - "faperoni.com", - "fapforfun.net", - "faphdporn.com", - "faphouse.com", - "fapmovz.com", - "fapnado.com", - "fapomania.com", - "fapopedia.net", - "fappcelebs.com", - "fappeningbook.com", - "fappeningthots.com", - "fappenist.com", - "fapphub.com", - "fapporn.me", - "faproulette.co", - "faproulette.online", "faproxy.com", - "fapsafari.com", - "fapster.xxx", - "fapteencam.com", - "faptitans.com", - "fapvid.com", "faqserv.com", - "faraday.ac.uk", - "fareastpornhub.com", - "fareham.ac.uk", - "farfetch-apps.com", - "farfetch-contents.com", - "farfetch.com", - "farfetch.net", - "farmington.ac.uk", - "farmplus.ac.uk", - "farn-ct.ac.uk", - "farnborough.ac.uk", - "farnboroughcollege.ac.uk", - "farnboroughsfc.ac.uk", - "farnboroughsfc2.ac.uk", - "farnham.ac.uk", - "faronics.ca", - "faronics.co.uk", - "faronics.com", - "faronics.com.au", - "faronics.com.sg", - "faronics.eu", - "faronics.tech", - "faronicslabs.com", - "faronicswise.co.uk", - "faronicswise.com", "fartit.com", "farwestchina.com", - "fasebokk.com", - "fasebook.com", - "faseboox.com", - "fashionbykakao.com", - "fashioningtheearlymodern.ac.uk", - "fashionnike.com", - "fashionretail.ac.uk", - "fashionretailacademy.ac.uk", - "fashiontechnologyacademy.ac.uk", "fast.com", - "fastech.ac.uk", "fastestvpn.com", - "fastindianporn.com", - "fastlane.ci", - "fastlane.tools", - "fastly-edge.com", - "fastly-terrarium.com", - "fastly.com", - "fastly.io", "fastly.net", - "fastlylabs.com", - "fastlylb.net", "fastpic.ru", "fastssh.com", "faststone.org", - "fasttext.cc", - "fasttrackreadysupport.com", "fatakat-n.club", "fatbtc.com", - "fatstube.com", - "fault-analysis-group.ac.uk", - "favebook.com", - "favelaporno.com", - "favepornmovs.com", - "favepornvids.com", - "favjapaneseporn.com", "favotter.net", "favstar.fm", "fawanghuihui.org", - "faycbok.com", "faydao.com", - "fayuanbooks.com", "faz.net", - "fb.careers", "fb.com", - "fb.gg", "fb.me", "fb.watch", - "fba.ac.uk", - "fbacebook.com", "fbaddins.com", - "fbbmarket.com", - "fbboostyourbusiness.com", - "fbcdn.com", "fbcdn.net", - "fbf8.com", - "fbfeedback.com", - "fbhome.com", - "fbidb.io", - "fbinc.com", - "fbinfer.com", - "fbinnovation.com", - "fbiqiyiav.buzz", - "fbjav.com", - "fblitho.com", - "fbmarketing.com", - "fbmessenger.com", - "fbooktaiwan.com", - "fbredex.com", - "fbreg.com", - "fbrell.com", - "fbrpms.com", "fbsbx.com", - "fbsbx.net", - "fbsupport-covid.net", - "fbthirdpartypixel.com", - "fbthirdpartypixel.net", - "fbthirdpartypixel.org", - "fburl.com", - "fbwat.ch", "fbworkmail.com", "fc2.com", "fc2blog.net", "fc2china.com", "fc2cn.com", - "fc2ppv.tv", "fc2web.com", - "fca.ac.uk", - "fcacebook.com", - "fcaebook.com", - "fcebook.com", - "fcebookk.com", - "fcfacebook.com", - "fcot.ac.uk", - "fcrt.ac.uk", - "fcw.xxx", - "fcww0.com", "fda.gov.tw", - "fdacebook.info", "fdbox.com", "fdc64.de", "fdc64.jp", "fdc64.org", "fdc89.jp", - "fdf.ac.uk", - "fdiintelligence.com", - "fdroid.org", - "fdtl.ac.uk", - "feacboo.com", - "feacbook.com", - "feacbooke.com", - "feacebook.com", - "feanonlinear.com", - "featurecam.com", - "fecbbok.com", - "fecbooc.com", - "fecbook.com", - "feceboock.com", - "fecebook.net", - "feceboox.com", - "fececbook.com", - "federalschool.ac.uk", - "federalsurrey.ac.uk", - "fedoraforum.org", - "fedoramagazine.org", - "fedorapeople.org", - "fedoraproject.org", "feedburner.com", "feeder.co", - "feedherfuckher.com", "feedly.com", "feedx.net", "feelssh.com", "feer.com", - "feet9.com", - "fefc.ac.uk", - "fehesorp.ac.uk", - "fei.ru", "feifeiss.com", - "feipang.link", "feitian-california.org", "feitianacademy.org", "feixiaohao.com", - "felp.ac.uk", - "femalefounderscomp.com", - "femalestars.com", - "femdomcc.net", "feministteacher.com", - "feminizingpolitics.ac.uk", - "femjoy.com", - "femscat.com", "fengzhenghu.com", "fengzhenghu.net", - "feook.com", - "ferabook.com", - "fermanaghcoll.ac.uk", - "ferronetwork.com", - "ferryclean.com", - "fescebook.com", - "fesebook.com", - "fesery-com.sbs", - "festinhasbrasil.com", - "fetalmedicine.ac.uk", - "fetish-bb.com", - "fetishbank.net", - "fetishdreamz.com", - "fetishes.cam", - "fetishfishcams.com", - "fetishpapa.com", - "fetishpornonly.com", - "fetishshrine.com", - "fetlife.com", "fevernet.com", "ff.im", - "ffacebook.com", - "ffc.ac.uk", - "fffdm.com", "fffff.at", - "fffucked.com", "fflick.com", - "fflm.ac.uk", - "fflnk.net", - "fflogs.com", - "ffmpeg.org", - "ffotolia.com", - "ffprofile.com", "ffvpn.com", - "fgacebook.com", - "fgirl.ch", - "fgls.ac.uk", "fgmtv.net", "fgmtv.org", "fhreports.net", - "fi11.com", - "fi11av1.com", - "fi11tv1.com", - "fibre-diffraction.ac.uk", - "ficeboock.com", - "ficm.ac.uk", - "fictionmania.tv", - "fifastreet.com", - "fifastreet3.com", - "fife.ac.uk", - "fifeglen.ac.uk", - "fightforux.com", - "figma.com", "figprayer.com", "fileflyer.com", "fileforum.com", "files2me.com", "fileserve.com", - "filesmonster.vip", "filesor.com", - "filipino-music.net", "fillthesquare.org", - "filmandsound.ac.uk", - "filme2.xxx", - "filmeleporno.xxx", - "filmeporno.blog", - "filmeporno.xxx", - "filmesdesexo.blog", - "filmesporno.com.br", - "filmesporno.net.br", - "filmespornos.net", "filmingfortibet.org", - "filmporno.it", - "filmsexeporno.com", - "filt-coll.ac.uk", - "filtercams.com", "filthdump.com", - "filton-college.ac.uk", - "filton.ac.uk", - "fimfiction.net", - "finalcutpro.com", - "financeleadsonline.com", "financetwitter.com", - "financialadvisoriq.com", - "financialsoccer.ca", "finchvpn.com", - "find-apple.com", - "find-cdt.ac.uk", - "findacard.com", - "findasians.live", - "findbare.com", "findbook.tw", - "findcams.live", - "finder.ac.uk", - "findhername.net", "findmespot.com", - "findmybeats.com", - "findmyipad.com", - "findsav.com", - "findtubes.com", - "findvrporn.com", - "findyourlimits.com", "findyoutube.com", "findyoutube.net", - "fine-art-nude.org", - "fineart.ac.uk", - "fineartteens.com", - "finenike.com", - "finesse.ac.uk", - "finevids.xxx", "fingerdaily.com", - "finish.at", - "finish.bg", - "finish.co.kr", - "finish.co.nz", - "finish.co.uk", - "finish.co.za", - "finish.com.hr", - "finish.com.tr", - "finish.de", - "finish.es", - "finish.fr", - "finish.gr", - "finish.hu", - "finish.lv", - "finish.pl", - "finish.pt", - "finish.ro", - "finish.si", - "finish.sk", - "finisharabia.com", - "finishbrasil.com.br", - "finishdishwashing.ca", - "finishdishwashing.com", - "finishinfo.be", - "finishinfo.cl", - "finishinfo.com", - "finishinfo.com.ar", - "finishinfo.com.au", - "finishinfo.cz", - "finishinfo.fi", - "finishinfo.it", - "finishinfo.jp", - "finishinfo.nl", - "finishinfo.no", - "finishinfo.ru", - "finishinfo.se", - "finishkilpailu.fi", - "finishwin.be", "finler.net", - "finlitsummit.org", - "fiord.ru", - "fiotolia.com", - "fipc.ac.uk", - "fircroft.ac.uk", - "fire-emblem-heroes.com", "firearmsworld.net", - "firebase.com", - "firebase.googleapis.com", - "firebase.io", - "firebaseapp.com", - "firebaseappcheck.googleapis.com", - "firebasedynamiclinks-ipv4.googleapis.com", - "firebasedynamiclinks-ipv6.googleapis.com", - "firebasedynamiclinks.googleapis.com", - "firebaseinappmessaging.googleapis.com", - "firebaseinstallations.googleapis.com", "firebaseio.com", - "firebaselogging-pa.googleapis.com", - "firebaselogging.googleapis.com", - "firebaseperusertopics-pa.googleapis.com", - "firebaseremoteconfig.googleapis.com", - "fireemblemawakening.com", - "fireflyresearch.ac.uk", "firefox.com", - "firefoxusercontent.com", + "fireofliberty.info", "fireofliberty.org", - "fireservicecollege.ac.uk", - "fireside.fm", - "firesidegatherings.com", - "firestone.cl", - "firestone.co.cr", - "firestone.com.ar", - "firestone.com.br", - "firestone.com.co", - "firestone.com.mx", - "firestonebpco.com", - "firestonecomercial.cl", - "firestonecomercial.co.cr", - "firestonecomercial.com.ar", - "firestonecomercial.com.br", - "firestonecomercial.com.co", - "firestonecomercial.com.mx", - "firestonecompleteautocare.com", - "firestonedrivestore.com", - "firestoneip.com", - "firestonerewards.com", - "firestonetire.ca", - "firestonetire.com", "firetweet.io", - "firewire.cl", - "firewire.eu", - "firmaprofesional.com", - "first-ns.de", - "firstanalvideos.com", - "firstchancesfife.ac.uk", "firstfivefollowers.com", - "firstgynexam.com", - "firstpelvicexam.com", + "firstory.me", "firstpost.com", - "firstprivatebank.com.mm", "firstrade.com", - "fiscalstudies.ac.uk", - "fishmpegs.com", - "fitbit.com", - "fitgirl-repacks.site", - "fitnakedgirls.com", - "five-d.com", - "fivestarpornsites.com", - "fixtracking.com", - "fiz-karlsruhe.de", + "fish.audio", "fizzik.com", - "fjlkajhgfa.top", - "fkse.ac.uk", - "fl310.com", - "flagrasamadores.net", "flagsonline.it", - "flame.ac.uk", - "flameunleashed.com", - "flaru.com", - "flashtranny.com", - "flatandfuckedmilfs.com", - "flathub.org", - "flatmates.com.au", - "flatpak.org", - "flavournetwork.ac.uk", - "fldz8.buzz", "flecheinthepeche.fr", - "fleek.co", "fleshbot.com", - "fleshlyx.com", "fleursdeslettres.com", - "flexsig.com", + "flexpool.io", "flgg.us", "flgjustice.org", - "fli8.xyz", - "flic.kr", "flickr.com", - "flickr.net", "flickrhivemind.net", "flickriver.com", "fling.com", "flipboard.com", - "flipfap.com", "flipkart.com", - "flipnotestudio.com", - "flipshare.com", - "flipwithsurface.com", - "flirt4free.com", - "flirtmoms.com", - "flirtyhoookup.com", "flitto.com", - "fljmh.com", "flnet.org", "flog.tw", - "floorp.app", - "floppy-tits.com", - "flow.dev", - "flow.org", - "flowfront.com", - "flowfront.net", - "flowtype.org", - "fluidfxapp.com", - "fluidpreview.com", - "fluids.ac.uk", + "flowhongkong.net", "flurry.com", - "flutter.dev", - "flutterapp.com", - "flyflv.com", - "flyingjizz.com", + "flypool.org", "flyvpn.com", - "flyyindh-cc.sbs", "flyzy2005.com", - "fm4.jp", - "fmav.top", - "fmav51.icu", - "fmc.ac.uk", - "fmcebook.com", - "fmdesktop.com", - "fmdv.ac.uk", - "fmg.ac.uk", - "fmlm.ac.uk", "fmnnow.com", "fnac.be", "fnac.com", - "fnacebook.com", - "fnlondon.com", - "fnmt.es", - "foampositeshoes.com", "fochk.org", - "focus.ac.uk", "focustaiwan.tw", "focusvpn.com", "fofg-europe.net", "fofg.org", "fofldfradio.org", - "foftolia.com", - "folkestonecollege.ac.uk", - "follasian.com", - "followpype.com", - "fom.ac.uk", - "fonolia.com", - "fontawesome.com", - "fontbook.com", - "fontexplorerx.com", - "fonts.com", - "fonts.net", - "fontshop-prod-responsive-images.s3.amazonaws.com", - "fontshop.com", - "fontsinuse.com", - "foodchain.ac.uk", - "foodsecurity.ac.uk", - "foofle.com", "foolsmountain.com", "fooooo.com", "footprint.net", - "footprintdns.com", - "footseen.com", - "footstockings.com", - "footwear-cadcam.com", "footwiball.com", "forbes.com", - "forbesimg.com", - "forbiddenasian.com", - "forbiddenmomsarchive.com", - "force.com", - "forduck.cyou", "foreignaffairs.com", "foreignpolicy.com", - "forestsixth.ac.uk", - "forestyouth.ac.uk", - "forgecdn.net", - "forhertube.com", - "formission.ac.uk", - "formit360.com", - "formitfactory.com", - "forpojie.pics", - "forster.ac.uk", - "fortawesome.com", - "forte.ac.uk", - "forthebadge.com", - "forthethrone.com", - "forthvalley.ac.uk", - "fortitude-group.ac.uk", - "fortnite.com", - "fortune.ac.uk", - "fortunecentre.ac.uk", - "fortuneinsight.com", + "form.new", + "forms.new", "forum4hk.com", "forums-free.com", - "forzamotorsport.net", - "forzaracingchampionship.com", - "forzarc.com", - "fosebook.com", "fotile.me", - "fotiolia.com", - "fotoiia.com", - "fotolia-noticias.com", - "fotolia.cc", - "fotolia.com", - "fotolia.tv", - "fotolja.com", - "fotoscaserasx.com", - "foundationdb.org", - "foundationyear.ac.uk", + "fountmedia.io", "fourthinternational.org", - "fout.jp", - "fox-corporation.com", - "fox-news.com", - "fox.com", - "fox.tv", - "fox10.tv", - "fox10news.com", - "fox10phoenix.com", - "fox11.com", - "fox13memphis.com", - "fox13news.com", - "fox23.com", - "fox23maine.com", - "fox247.com", - "fox247.tv", - "fox26.com", - "fox26houston.com", - "fox28media.com", - "fox29.com", - "fox2detroit.com", - "fox2news.com", - "fox32.com", - "fox32chicago.com", - "fox35orlando.com", - "fox38corpuschristi.com", - "fox42kptm.com", - "fox46.com", - "fox46charlotte.com", - "fox47.com", - "fox49.tv", - "fox4news.com", - "fox51tns.net", - "fox5atlanta.com", - "fox5dc.com", - "fox5ny.com", - "fox5storm.com", - "fox6now.com", - "fox7.com", - "fox7austin.com", - "fox9.com", - "foxacrossamerica.com", - "foxaffiliateportal.com", - "foxandfriends.com", - "foxbet.com", "foxbusiness.com", - "foxbusiness.tv", - "foxbusinessgo.com", - "foxcanvasroom.com", - "foxcareers.com", - "foxcharlotte.com", - "foxcincy.com", - "foxcincy.jobs", - "foxcincy.net", - "foxcollegesports.com", - "foxcorporation.com", - "foxcreativeuniversity.com", - "foxcredit.com", - "foxcredit.org", - "foxd.tv", - "foxdcg.com", - "foxdeportes.com", - "foxdeportes.net", - "foxdeportes.tv", "foxdie.us", - "foxdigitalmovies.com", - "foxdoua.com", - "foxentertainment.com", - "foxesacademy.ac.uk", - "foxest.com", - "foxfaq.com", - "foxfdm.com", - "foxfiles.com", "foxgay.com", - "foxhq.com", - "foxinc.com", - "foxkansas.com", - "foxla.com", - "foxla.tv", - "foxlexington.com", - "foxmediacloud.com", - "foxnation.com", - "foxnebraska.com", - "foxneo.com", - "foxneodigital.com", - "foxnetworks.info", - "foxnetworksinfo.com", - "foxnews.cc", - "foxnews.com", - "foxnews.net", - "foxnews.org", - "foxnews.tv", - "foxnewsaffiliates.com", - "foxnewsaroundtheworld.com", - "foxnewsb2b.com", - "foxnewschannel.com", - "foxnewsgo.net", - "foxnewsgo.org", - "foxnewsgo.tv", - "foxnewshealth.com", - "foxnewslatino.com", - "foxnewsmagazine.com", - "foxnewsnetwork.com", - "foxnewsopinion.com", - "foxnewspodcasts.com", - "foxnewspolitics.com", - "foxnewsradio.com", - "foxnewsrundown.com", - "foxnewssunday.com", - "foxon.com", - "foxphiladelphia.com", - "foxplus.com", - "foxpoker.com", - "foxporns.com", - "foxrad.io", - "foxredeem.com", - "foxrelease.com", - "foxrichmond.com", - "foxrobots.com", - "foxsmallbusinesscenter.com", - "foxsmallbusinesscenter.net", - "foxsmallbusinesscenter.org", - "foxsoccer.net", - "foxsoccer.tv", - "foxsoccermatchpass.com", - "foxsoccerplus.com", - "foxsoccerplus.net", - "foxsoccerplus.tv", - "foxsoccershop.com", - "foxsports-chicago.com", - "foxsports-newyork.com", - "foxsports-world.com", - "foxsports.cl", - "foxsports.co", - "foxsports.co.ve", - "foxsports.com", - "foxsports.com.ar", - "foxsports.com.bo", - "foxsports.com.br", - "foxsports.com.co", - "foxsports.com.ec", - "foxsports.com.gt", - "foxsports.com.mx", - "foxsports.com.pe", - "foxsports.com.py", - "foxsports.com.uy", - "foxsports.com.ve", - "foxsports.gt", - "foxsports.info", - "foxsports.net", - "foxsports.net.br", - "foxsports.pe", - "foxsports.sv", - "foxsports.uy", - "foxsports2.com", - "foxsportsflorida.com", - "foxsportsgo.com", - "foxsportsla.com", - "foxsportsnetmilwaukee.com", - "foxsportsneworleans.com", - "foxsportsracing.com", - "foxsportssupports.com", - "foxsportsuniversity.com", - "foxsportsworld.com", - "foxstudiolot.com", "foxsub.com", - "foxsuper6.com", "foxtang.com", - "foxtel.com", - "foxtel.com.au", - "foxtelevisionstations.com", - "foxtube.com", - "foxtv.com", - "foxtvdvd.com", - "foxuv.com", - "foxweatherwatch.com", - "fpacebook.com", - "fpm.ac.uk", "fpmt-osel.org", "fpmt.org", "fpmt.tw", "fpmtmexico.org", - "fptolia.com", - "fqcebook.com", "fqok.org", "fqrouter.com", - "fr-beatsbydrestore.com", - "fra.ac.uk", - "fracebook.com", - "fragment.com", - "fragrancebay.com", - "francecasquebeatssolde.com", - "francemail.com", - "francistowne.ac.uk", + "frank2019.me", "franklc.com", - "franklin.ac.uk", - "fratec.net", - "frcasquesbeats.com", "freakshare.com", - "free-3d-porn.com", - "free-aa.com", - "free-abbywinters.com", - "free-avx.jp", - "free-erobooks.com", "free-gate.org", "free-hada-now.org", "free-proxy.cz", - "free-sns.com", "free-ss.site", "free-ssh.com", - "free-strip-games.com", - "free-wap-tube.com", - "free-xxx-porn.org", + "free.bg", + "free.com.tw", "free.fr", - "free00.com", - "free18.net", "free4u.com.ar", - "free64all.com", - "freeadultcomix.com", - "freeadultgames.tv", "freealim.com", - "freeanimalporn.net", - "freearabsexx.com", - "freeav.tv", - "freeb.com", - "freebasics.com", - "freebasics.net", - "freebdsmxxx.org", "freebeacon.com", "freebearblog.org", - "freebigmovies.com", "freebrowser.org", - "freebs.com", - "freebsd.org", - "freecamsfan.com", - "freecartoons.biz", "freechal.com", - "freechatnow.com", "freechina.net", "freechina.news", "freechinaforum.org", "freechinaweibo.com", - "freecodecamp.org", "freeddns.com", "freeddns.org", - "freedirecttvspecial.com", "freedl.org", "freedomchina.info", "freedomcollection.org", "freedomhongkong.org", "freedomhouse.org", - "freedomplatform.tv", "freedomsherald.org", - "freefacebook.com", - "freefacebook.net", - "freefacebookads.net", - "freefblikes.com", - "freefbx.com", "freeforums.org", "freefq.com", "freefuckvids.com", "freegao.com", - "freegaypornhdtube.com", - "freegaysexgames.com", - "freehdinterracialporn.in", - "freehdvideos.xxx", - "freehentaipic.com", - "freehentaistream.com", "freehongkong.org", - "freehqtube.com", - "freehulu.com", "freeilhamtohti.org", - "freejavbt.com", - "freejavporn.mobi", "freekazakhs.org", "freekwonpyong.org", - "freelifetimefuckbook.com", "freelotto.com", - "freeman-centre.ac.uk", "freeman2.com", - "freematuresgallery.com", "freemoren.com", "freemorenews.com", "freemuse.org", "freenet-china.org", "freenetproject.org", "freenewscn.com", - "freenode.net", - "freeomovie.to", "freeones.com", "freeopenvpn.com", "freeoz.org", - "freeporn.com", - "freepornhdonlinegay.com", - "freepornhentaigames.com", - "freeporno.asia", - "freepornpreview.net", - "freepornq.com", - "freepornvideos.life", "freeproxylists.net", - "freerangecloud.com", "freerk.com", - "freescotcoll.ac.uk", - "freesexalbum.com", - "freesexgames.games", - "freesexgames.ws", - "freesexvideos2k.com", - "freesexyindians.com", - "freesexyindians.org", + "freess.org", "freessh.us", - "freessl.com", "freetcp.com", "freetibet.net", "freetibet.org", "freetibetanheroes.org", + "freetls.fastly.net", "freetribe.me", - "freeuseporn.com", "freeviewmovies.com", - "freeviewplus.net.au", "freevpn.me", "freevpn.nl", "freewallpaper4.me", @@ -10744,512 +2055,141 @@ var rules = [ "freewww.biz", "freewww.info", "freexinwen.com", - "freexvideos.org", - "freexxx.best", - "freexxx.win", - "freexxxporn.org", "freeyellow.com", - "freeyouporn.mobi", "freeyoutubeproxy.net", - "freezeframe.ac.uk", "freezhihu.org", - "freieporno.com", - "freindfeed.com", - "frenchhistorysociety.ac.uk", - "frescolib.org", - "freshporno.net", - "freshscat.com", - "freudbox.com", - "freyalist.com", "friday.tw", - "friendbook.info", "frienddy.com", - "friendfed.com", - "friendfeed-api.com", "friendfeed-media.com", "friendfeed.com", - "friendfeedmedia.com", "friendfinder.com", "friends-of-tibet.org", "friendsoftibet.org", + "fril.jp", "fring.com", "fringenetwork.com", - "frishoes.com", - "fritchy.com", "from-pr.com", "from-sd.com", "fromchinatousa.net", "frommel.net", - "frontier.ac.uk", - "frontiersin.org", - "frontiersofoncology.ac.uk", "frontlinedefenders.org", - "frontrow.com", - "froogle.com", "frootvpn.com", - "frostbite.com", - "frprn.com", - "fruitycams.com", - "fsacebok.com", - "fsb.ac.uk", - "fscebook.com", + "froth.zone", "fscked.org", - "fsdn.com", - "fse.tv", - "fsem.ac.uk", - "fslra.ac.uk", - "fsmone.com", - "fsmone.com.hk", - "fsmone.com.my", - "fssta.com", - "fst.ac.uk", - "fstopimages.com", "fsurf.com", "ft.com", - "ftadviser.com", - "ftcdn.net", "ftchinese.com", - "fteproxy.org", - "ftiecla.com", - "ftop.ru", - "ftopx.com", "ftp1.biz", "ftpserver.biz", "ftv.com.tw", - "ftvgirls.com", - "ftvmilfs.com", "ftvnews.com.tw", "ftx.com", - "fu62.vip", "fucd.com", "fuchsia.dev", - "fuck-xxx-movies.com", - "fuck.com", - "fuck.sc", - "fuck55.net", - "fuck6teen.com", - "fuckableteens.net", - "fuckbookecuador.com", "fuckcnnic.net", - "fuckcuck.com", - "fuckgames.xxx", "fuckgfw.org", "fuckgfw233.org", - "fuckingawesome.com", - "fuckingfreemovies.com", - "fuckingmatures.com", - "fuckingthreesome.com", - "fuckmatureporn.com", - "fuckmaturepussy.com", - "fuckmeplease.net", - "fuckmoral.com", - "fuckmypakistanigf.com", - "fucksexhub.com", - "fuckteenvids.com", - "fuckthathussy.com", - "fucktube.com", - "fuckup.xxx", - "fuckvideos.biz", - "fuellearning.ac.uk", - "fuhouse.club", - "fujinkoron.jp", - "fujossy.jp", - "fukzr1.cc", - "fulanax.com", - "fulcrum.ac.uk", - "fuli-wangzhan.com", - "fuli3.net", - "fulib711.shop", - "fuliba2021.com", - "fuliba2023.net", "fulione.com", - "fullbookmm.blogspot.com", - "fulldesisex.com", "fullerconsideration.com", - "fullfuli.com", - "fullhdxxx.com", - "fullpornnetwork.com", - "fullsexmovs.com", - "fulltaboo.tv", - "fullxxxmovies.net", + "fullservicegame.com", "fulue.com", - "fundaiphone5s.com", - "fundfire.com", - "fundinginstitutional.com", - "fundingrates.xyz", - "fundpaypal.com", - "fundraisingwithfacebook.com", - "fundsupermart.com", + "funami.tech", "funf.tw", - "funimation.com", "funkyimg.com", - "funnyfacebook.org", - "funnyordie.com", "funp.com", - "funshemale.com", "fuq.com", - "fuqqt.com", - "furaffinity.net", "furbo.org", "furhhdl.org", "furinkan.com", "furl.net", - "furness.ac.uk", - "furrypornvideos.com", - "furuke.com", - "fury.blog", - "fury.co", - "fury.dev", - "fury.help", - "fury.io", - "fuse.ac.uk", - "fusion-cdt.ac.uk", - "fusion.ac.uk", - "fusionlifecycle.com", - "fusionproductionapps.com", - "fuskator.com", - "fusker.xxx", - "futanarihq.com", - "futhead.com", - "futoka.jp", - "futpromos.com", - "futunited.com", - "future-media.ac.uk", - "future-reserves-research.ac.uk", - "futurearmedforces.ac.uk", - "futurecat.ac.uk", "futurechinaforum.org", - "futureme.ac.uk", - "futuremedia.ac.uk", "futuremessage.org", - "futureofbritishmanufacturing.com", - "futureofbusinesssurvey.org", - "futureofmaktingthings.com", - "futureshop.ca", - "futuretrack.ac.uk", - "futurevehicles.ac.uk", - "futureworks.ac.uk", "fux.com", - "fuxporn.com", "fuyin.net", "fuyindiantai.org", "fuyu.org.tw", - "fuzokudx.com", - "fv-distribution-database.ac.uk", "fw.cm", "fxcm-chinese.com", - "fxcorporate.com", - "fxn.ws", - "fxnetwork.com", "fxnetworks.com", - "fxplus.ac.uk", - "fxporn.net", - "fzdm.com", - "fzdshare.net", "fzh999.com", "fzh999.net", "fzlm.com", "g-area.org", "g-desktop.ru", "g-queen.com", - "g-technology.com", - "g-tun.com", - "g-tvapp.com", - "g-xxxhub.com", "g.co", - "g.dev", - "g.page", "g0v.social", "g6hentai.com", "gab.com", "gabocorp.com", - "gacebook.com", - "gaelicstoryatgu.ac.uk", "gaeproxy.com", "gaforum.org", "gagaoolala.com", - "gaia.ac.uk", - "gainsborough.ac.uk", - "gaito.xyz", - "galaxyappstore.com", "galaxymacau.com", - "galaxymobile.jp", - "gale.com", - "galegroup.com", "galenwu.com", - "gallery-dump.club", - "galleryarchives.com", "gallup.com", "galstars.net", - "galt.ac.uk", - "gamboporn.com", - "gamcore.com", - "game-platform.net", - "game-repack.site", "game735.com", "gamebase.com.tw", - "gamebeforethegame.com", "gamejolt.com", - "gamelore.fun", - "gameon-masters.com", - "gamepass.com", - "gamepedia.com", - "gameplan.ac.uk", "gamer.com.tw", - "gameroom.com", - "gamerotic.com", "gamerp.jp", - "gamesathletes.com", - "gamesfuckgirls.com", - "gamesofdesire.com", - "gamesstack.com", - "gameuxmasterguide.com", "gamez.com.tw", - "gaming-notebooks.com", "gamousa.com", - "gandhara.ru", - "gandi.net", "ganges.com", "ganjing.com", "ganjing.world", "ganjingworld.com", - "gannett-cdn.com", - "gannett.com", - "gannettdigital.com", - "gao1.cc", - "gaofuwu.cc", "gaoming.net", "gaopi.net", "gaozhisheng.net", "gaozhisheng.org", - "gaozs18.buzz", "gardennetworks.com", "gardennetworks.org", - "garena.co.id", - "garena.co.th", - "garena.com", - "garena.live", - "garena.my", - "garena.ph", - "garena.sg", - "garena.tv", - "garena.tw", - "garena.vn", - "garenanow.com", - "garotaporno.com", "gartlive.com", - "gashe.ac.uk", - "gastrointestinalexam.com", "gate-project.com", - "gate.ac.uk", - "gate.cc", "gate.io", "gatecoin.com", - "gatedata.org", - "gateimg.com", - "gateio.live", - "gateio.services", - "gateshead.ac.uk", - "gatesheadcollege.ac.uk", - "gatesheadlearningskills.ac.uk", - "gateway.ac.uk", - "gateway.dev", "gather.com", "gatherproxy.com", "gati.org.tw", - "gauleporno.xxx", - "gay.bingo", - "gay0day.com", - "gay1069sex.com", - "gay4tube.com", - "gayapatal.com", - "gayasianamateurs.com", - "gayasiantheater.com", - "gaybeeg.info", - "gaybf.com", - "gayboystube.com", "gaybubble.com", - "gaycamvideos.net", "gaycn.net", - "gaycock4u.com", - "gayforit.eu", - "gayfuckporn.com", - "gayfuror.com", - "gayharem.com", - "gayheaven.org", "gayhub.com", - "gaymaletube.com", "gaymap.cc", "gaymenring.com", - "gayonthenet.net", - "gaypad.net", - "gaypinoyporn.com", - "gayporn.com", - "gayporn.pro", - "gaypornforyou.com", - "gaypornhdfree.com", - "gaypornlinks.com", - "gaypornlove.net", - "gaypornmenu.com", - "gayporno.fm", - "gaypornonly.com", - "gaypornsky.com", - "gayrawclub.com", - "gayroom.com", - "gaysheaven.blogspot.com", - "gaysonic.eu", - "gaystarnews.com", - "gaystream.pw", - "gaythebest.com", - "gaytopcams.com", "gaytube.com", - "gayvl.net", "gaywatch.com", "gazotube.com", - "gazounabi.com", - "gbank.com.mm", - "gbluebooks.blogspot.com", - "gbmc.ac.uk", - "gbmolluscatypes.ac.uk", - "gbnews.uk", - "gbs3trial.ac.uk", - "gbxml.net", - "gca.ac.uk", - "gcadt.ac.uk", - "gcal.ac.uk", - "gcbp.ac.uk", - "gcc.ac.uk", "gcc.org.hk", - "gceducationandskills.ac.uk", - "gcft-gla.ac.uk", - "gcft.ac.uk", - "gcg.ac.uk", - "gci.ac.uk", - "gcld-line.com", - "gclg.ac.uk", "gclooney.com", "gclubs.com", "gcmasia.com", - "gcns.ac.uk", - "gcolle.net", "gcpnews.com", "gcr.io", - "gcrb.ac.uk", - "gcrtires.com", - "gcs.ac.uk", - "gcsp.ac.uk", - "gcu.ac.uk", - "gculondon.ac.uk", - "gda.ac.uk", "gdaily.org", - "gdansk-amazon.com", "gdbt.net", - "gdian-dh.mom", - "gdsrx888.com", "gdzf.org", - "gears5.com", - "gearspop.com", - "gearstactics.com", - "geasontraining.ac.uk", - "geceguby.ru", - "gecko.ac.uk", "geek-art.net", - "geek-squad-support.com", - "geek-squad.net", - "geek-squad.org", - "geek-squads.net", "geekerhome.com", "geekheart.info", - "geeksquad.ca", - "geeksquad.cc", - "geeksquad.com", - "geeksquad.net", - "geeksquad.tv", - "geeksquadcares.com", - "geeksquadcentral.com", - "geeksquadforums.com", - "geeksquadonline.com", - "geeksquadprotectionplan.org", - "geeksquadservices.org", - "geeksquadwebroot.org", - "geelongadvertiser.com.au", - "geforce.co.kr", - "geforce.co.uk", - "geforce.com", - "geforce.com.tw", - "geilegratisporno.com", - "geileomas.com", - "geinoueroch.com", - "geiriadur.ac.uk", "gekikame.com", "gelbooru.com", - "gelbooru.me", - "geller-pa.googleapis.com", - "gem.ac.uk", - "gemfire.net", - "gemfury.com", "gemini.com", - "gen2.ac.uk", - "gendai.net", "generated.photos", - "generationpup.ac.uk", - "generativeai.google", - "generativelanguage.googleapis.com", - "genesis.ac.uk", - "genesys.ac.uk", - "genet.ac.uk", - "geneticconstructor.com", - "geng8cn.xyz", - "gengba-av.mom", - "gengba.cc", "genius.com", - "genkai-hounyo.com", - "genomeanalysiscentre.ac.uk", - "genomicsnetwork.ac.uk", - "genshin-porn.com", - "genshinh.com", - "genshinimpact.com", - "gentoo.org", "geocities.co.jp", "geocities.com", "geocities.jp", - "geodesummit.com", - "geohazard.ac.uk", - "geolytics.com", - "geoport.com", - "george-monoux.ac.uk", - "geospatialimaging.com", - "geospatialinfo.com", - "geotrust.com", - "geoxwalk.ac.uk", "geph.io", - "geraldoatlarge.com", - "gerc.ac.uk", "gerefoundation.org", - "gerritcodereview.com", - "gesource.ac.uk", "get.app", "get.dev", "get.how", - "get.new", "get.page", - "get.rsvp", - "getadblock.com", - "getamoveon.ac.uk", "getastrill.com", - "getbootstrap.com", - "getboxer.com", - "getbraintree.com", - "getbumptop.com", - "getbuzzsaw.com", "getchu.com", "getcloak.com", - "getcomposer.org", - "getdirect.tv", - "getdrebeatssale.com", - "getdropbox.com", - "getfappy.com", - "getfedora.org", "getfoxyproxy.org", "getfreedur.com", "getgom.com", @@ -11260,303 +2200,83 @@ var rules = [ "getmalus.com", "getmdl.io", "getoutline.org", - "getpocket.com", - "getporn.tv", - "getprintersupports.com", - "getscorecash.com", - "getsexgames.com", + "getsession.org", "getsocialscope.com", "getsync.com", "gettr.com", "gettrials.com", - "gettyimages.ae", - "gettyimages.at", - "gettyimages.be", - "gettyimages.ca", - "gettyimages.ch", - "gettyimages.co.jp", - "gettyimages.co.nz", - "gettyimages.co.uk", - "gettyimages.com", - "gettyimages.com.au", - "gettyimages.com.br", - "gettyimages.com.mx", - "gettyimages.de", - "gettyimages.dk", - "gettyimages.es", - "gettyimages.fi", - "gettyimages.fr", "gettyimages.hk", - "gettyimages.ie", - "gettyimages.in", - "gettyimages.it", - "gettyimages.nl", - "gettyimages.no", - "gettyimages.pt", - "gettyimages.se", "getuploader.com", - "getws1.com", - "getwsone.com", - "getzola.org", - "gfacecbook.com", - "gfarchive.com", - "gfashion.com", "gfbv.de", "gfgold.com.hk", - "gfleaks.com", "gfnormal05at.com", - "gfotolia.com", - "gfpics.com", - "gfpornbox.com", - "gfpornmovies.com", - "gfpornvideos.com", - "gfrevenge.com", "gfsale.com", "gfw.org.ua", "gfw.press", "gfw.report", - "gfx.ms", - "gfycat.com", - "gfysex.com", - "ggdiao.com", + "gfwatch.org", "ggjav.com", - "ggoogle.com", - "ggpds.com", "ggpht.com", - "ggsrv.com", "ggssl.com", "ghanely.me", - "ghcr.io", - "ghettotube.com", "ghidra-sre.org", - "ghil.ac.uk", - "ghostgames.com", "ghostpath.com", "ghut.org", - "giantessbooru.com", "giantessnight.com", - "giffgaff.com", - "giffgaff.design", - "gifnuki.com", "gifree.com", - "gift-surg.ac.uk", "giga-web.jp", - "gigabyte.com", "gigacircle.com", "giganews.com", - "gigantits.com", - "gigaporn.org", - "gigaxvideos.com", - "gigjam.com", "gigporno.ru", - "gimsig.ac.uk", - "gimy.cc", - "gimy.co", - "gimy.to", - "gimy.tv", - "ginmoe.com", - "ginzasonypark.jp", - "gipscorp.com", - "giratina.com", - "girl-secret.com", - "girl7942.com", "girlbanker.com", - "girlfriendgalleries.net", - "girlfriendhomeporn.com", - "girlfriendvideos.com", - "girlfriendvids.net", - "girlfuckshorse.net", - "girlfur.com", - "girls.xyz", - "girls2see.ch", - "girlscanner.cc", - "girlscv.com", - "girlsdelta.com", - "girlsfuck-tube.com", - "girlsheaven-job.net", - "girlsnudepic.com", - "girlsofdesire.org", - "girlsongirlstube.com", - "girlspoopingtube.com", - "girlssexxxx.com", - "girlstryanal.com", - "girlsway.com", - "girlswelustfor.com", - "girlsxxx.net", - "gisplanning.com", - "git-scm.com", "git.io", - "gitbook.com", "gitbook.io", "gitbooks.io", "githack.com", - "github-cloud.s3.amazonaws.com", "github.blog", "github.com", - "github.community", - "github.dev", "github.io", - "githubapp.com", "githubassets.com", "githubcopilot.com", - "githubhackathon.com", - "githubnext.com", - "githubpreview.dev", - "githubstatus.com", - "githubuniverse.com", "githubusercontent.com", - "gitlab-static.net", - "gitlab.com", - "gitlab.io", - "gitlab.net", - "gitstar.com", - "gitstar.net", - "gittigidiyor.net", - "gittigidiyorsikayet.com", - "givemebuzzsaw.com", "gizlen.net", - "gizmoxxx.com", "gjczz.com", - "gla.ac.uk", - "glaadh.ac.uk", - "gladporn.com", - "gladstudy.ac.uk", - "glam.ac.uk", - "glam0ur.com", - "glammies.ac.uk", - "glamorgan.ac.uk", - "glamourtits.com", - "glan-hafren.ac.uk", - "glasamerike.net", - "glasgow-caledonian.ac.uk", - "glasgow-nautical.ac.uk", - "glasgow.ac.uk", - "glasgowclyde.ac.uk", - "glasgowcolleges.ac.uk", - "glasgowkelvin.ac.uk", - "glasgowmedhums.ac.uk", - "glasgowmet.ac.uk", - "glasgowschoolofart.ac.uk", - "glasgowsciencecentre.ac.uk", - "glasgowsequencingsolutions.ac.uk", + "glarity.app", "glass8.eu", - "gleline.com", - "glen-coll.ac.uk", - "glenfife.ac.uk", - "glenrothes-college.ac.uk", - "glhl.ac.uk", - "gllm.ac.uk", - "global-sci.org", - "globalbanking.ac.uk", - "globalbusinessofforcedlabour.ac.uk", - "globaledu.org", + "global.ssl.fastly.net", "globaljihad.net", "globalmediaoutreach.com", "globalmuseumoncommunism.org", "globalrescue.net", - "globalriskregulator.com", - "globalsecurity.org", - "globalshakespeare.ac.uk", - "globalsign-media.com", - "globalsign.be", - "globalsign.ch", - "globalsign.cloud", - "globalsign.co.uk", - "globalsign.com.au", - "globalsign.com.br", - "globalsign.com.hk", - "globalsign.com.sg", - "globalsign.es", - "globalsign.eu", - "globalsign.fr", - "globalsign.net", - "globalsign.nl", - "globalspec.com", "globaltm.org", "globalvoices.org", "globalvoicesonline.org", "globalvpn.net", - "globolakes.ac.uk", "glock.com", - "gloknos.ac.uk", - "gloporn.com", "gloryhole.com", - "gloryholeswallow.com", - "gloryofheracles.com", "glorystar.me", - "glos.ac.uk", - "gloscat.ac.uk", - "gloscol.ac.uk", - "gloscolgov.ac.uk", - "gloscollege.ac.uk", - "glosnexus.ac.uk", - "gloucestershire.ac.uk", - "gloucestershirecollege.ac.uk", - "gloucestershirecolleges.ac.uk", - "gloucestershirelaunchpad.ac.uk", - "gloucs.ac.uk", - "glovitas.ac.uk", - "glow.ac.uk", - "glsms.ac.uk", - "gltc.ac.uk", "gluckman.com", - "glyndwr.ac.uk", - "glyndwrlondonholdingslimited.ac.uk", - "glyndwrlondonschoolofmanagementandscience.ac.uk", "glype.com", - "glyphsapp.com", "gmail.com", - "gmc.ac.uk", - "gmcg.ac.uk", - "gmcyberfoundry.ac.uk", "gmgard.com", - "gmhigher.ac.uk", "gmhz.org", "gmiddle.com", "gmiddle.net", - "gmims.ac.uk", "gmll.org", - "gmms.ac.uk", - "gmnetworks.net", "gmodules.com", - "gmoney.org", - "gmossp-sp.jp", - "gmsa.ac.uk", "gmx.net", - "gnai-dh.sbs", - "gnailapp.sbs", - "gnatwork.ac.uk", "gnci.org.hk", "gnews.org", - "gnom-cham.com", - "gnu.org", - "gnzi.xyz", - "gnzi1.top", - "go-disneyworldgo.com", - "go-gaytube.com", - "go-lang.com", - "go-lang.net", - "go-lang.org", "go-pki.com", + "go-to-zlibrary.se", "go.com", - "go.dev", "go141.com", - "go2av.com", - "go4uni.ac.uk", "go5.dev", - "go6.si", "goagent.biz", "goagentplus.com", "goagle.de", - "goals.ac.uk", - "gobeatsye.com", "gobet.cc", - "gobianywhere.com", - "gobuildx.net", - "gobuyonlinestore.net", - "gockhuatviet.com", "godaddy.com", - "godalming.ac.uk", "godfootsteps.org", "godns.work", "godoc.org", @@ -11564,90 +2284,41 @@ var rules = [ "godsdirectcontact.org", "godsdirectcontact.org.tw", "godsimmediatecontact.com", - "goduckgo.com", - "goetec.ac.uk", - "gofile.me", - "gofit.ac.uk", - "gofucker.com", - "gofuckmenow.com", "gofundme.com", - "gog-statics.com", - "gog.com", - "gogeo.ac.uk", - "gogle.com", "gogle.de", - "gogo-load.com", - "gogoanime.vc", - "gogoanime.wiki", - "gogoanime3.co", - "gogocdn.net", "gogole.com", - "gogotaku.info", "gogotunnel.com", "gohappy.com.tw", - "gohentai.net", - "gohigherwestyorks.ac.uk", "gokbayrak.com", - "golang.com", - "golang.net", "golang.org", - "gold-gay.com", - "gold.ac.uk", "goldbet.com", "goldbetsports.com", - "goldcoastbulletin.com.au", "golden-ages.org", "goldeneyevault.com", "goldenfrog.com", - "goldengate.hu", - "goldgay.tv", "goldjizz.com", - "goldnikeclub.com", - "goldproject.ac.uk", - "goldsexvideos.com", - "goldsmiths.ac.uk", "goldstep.net", - "goldteenporn.com", - "goldvip.cyou", "goldwave.com", - "golos-ameriki.ru", - "golosameriki.com", - "gongkou-cc.sbs", - "gonglchuangl.net", "gongm.in", "gongmeng.info", "gongminliliang.com", "gongwt.com", - "gonike.com", - "gonzo-movies.com", - "gonzo.com", "goo.gl", "goo.gle", "goo.ne.jp", - "good-gay.com", + "good.news", "gooday.xyz", - "gooddaychicago.com", "gooddns.info", - "goodenough.ac.uk", "goodhope.school", - "goodporn.to", - "goodporno.cc", + "goodnewsnetwork.org", "goodreaders.com", "goodreads.com", - "goodsdunk.net", - "goodsexporn.org", "goodtv.com.tw", "goodtv.tv", "goofind.com", - "googel.com", "googel.de", - "googil.com", - "googl.com", - "google-access.net", - "google-analytics-cn.com", "google-analytics.com", "google-base.de", - "google-syndication.com", "google.ad", "google.ae", "google.al", @@ -11657,7 +2328,6 @@ var rules = [ "google.az", "google.ba", "google.be", - "google.berlin", "google.bf", "google.bg", "google.bi", @@ -11675,7 +2345,6 @@ var rules = [ "google.cl", "google.cm", "google.cn", - "google.co", "google.co.ao", "google.co.bw", "google.co.ck", @@ -11811,12 +2480,10 @@ var rules = [ "google.mv", "google.mw", "google.ne", - "google.net", "google.nl", "google.no", "google.nr", "google.nu", - "google.org", "google.pl", "google.pn", "google.ps", @@ -11843,39 +2510,23 @@ var rules = [ "google.tn", "google.to", "google.tt", - "google.ventures", "google.vg", "google.vu", "google.ws", - "googleacquisitionmigration.com", - "googleadapis.com", - "googleads-cn.com", - "googleads.com", - "googleadservices-cn.com", - "googleadservices.com", - "googleadsserving.cn", "googleanalytics.com", - "googleapis.cn", "googleapis.com", "googleapps.com", "googlearth.com", "googleartproject.com", "googleblog.com", "googlebot.com", - "googlecapital.com", - "googlecert.net", "googlechinawebmaster.com", "googlecode.com", "googlecommerce.com", - "googlecompare.co.uk", - "googledanmark.com", "googledomains.com", "googledrive.com", - "googlee.com", "googleearth.com", - "googlefiber.com", "googlefiber.net", - "googlefinland.com", "googlegroups.com", "googlehosted.com", "googleideas.com", @@ -11883,881 +2534,193 @@ var rules = [ "googlelabs.com", "googlelocal.nl", "googlemail.com", - "googlemaps.com", "googlemaps.sv", "googlemashups.com", - "googleoptimize-cn.com", - "googleoptimize.com", "googlepagecreator.com", - "googlephotos.com", "googleplay.com", "googleplus.com", "googlescholar.com", "googlesile.com", "googlesource.com", - "googlestore.com", - "googlesverige.com", - "googlesyndication-cn.com", "googlesyndication.com", - "googletagmanager-cn.com", - "googletagmanager.com", - "googletagservices-cn.com", - "googletagservices.com", - "googletraveladservices-cn.com", - "googletraveladservices.com", "googleusercontent.com", - "googlevads-cn.com", - "googleventures.com", "googlevideo.com", "googleweblight.com", "googlezip.net", - "googlr.com", - "goole-college.ac.uk", - "goolge.com", - "gooogle.com", "gopetition.com", - "gopivotal.com", - "gopivotal.net", - "goporngate.com", "goproxing.net", - "goragay.com", - "gordonmoore.com", "goreforum.com", "goregrish.com", - "gorin.jp", - "gorseinon-bizcentre.ac.uk", - "gorseinon.ac.uk", - "gosc.ac.uk", - "gosexpod.com", - "goshemalecams.com", "gospelherald.com", - "gosport.ac.uk", - "gosportmarineskillscentre.ac.uk", - "gosq.co", - "gosq.com", - "gossipfuli4511.xyz", - "gossipfuli5522.xyz", - "gossipfuli6883.xyz", - "gostorego.com", - "gostosanovinha.com", "got-game.org", - "gotblop.com", - "gotcosmos.com", "gotdns.ch", - "gotgayporn.com", "gotgeeks.com", - "gothdporn.com", - "gotporn.com", - "gotraffic.net", "gotrusted.com", "gotw.ca", - "gouri.xyz", "gov.taipei", "gov.tw", - "governmentengineer.com", - "govforce.com", - "gowales.ac.uk", - "gower.ac.uk", - "gowercollege.ac.uk", - "gowercollegeswansea.ac.uk", - "gpkss.ac.uk", - "gpstheseries.com", - "gpucomputing.ac.uk", - "gputechconf.co.kr", - "gputechconf.com", - "gputechconf.com.au", - "gputechconf.com.tw", - "gputechconf.eu", - "gputechconf.in", - "gputechconf.jp", - "gqzmnav.cc", - "gr-assets.com", "gr8domain.biz", "gr8name.biz", - "grabhentai.com", - "grabpussy.com", - "grace.ac.uk", - "grad2teach.ac.uk", - "gradcareers-scotland.ac.uk", "gradconnection.com", - "gradeuptube.com", - "gradschools.ac.uk", - "graduate-careers-wales.ac.uk", - "graduate-jobs-in-wales.ac.uk", - "graduate-jobs.ac.uk", - "graduatecareers-wales.ac.uk", - "graduateconnection.ac.uk", - "graduateoutcomes.ac.uk", - "graduateswales.ac.uk", - "graduatewales.ac.uk", - "grafolio.com", - "graias.com", - "graiasmovies.com", "grammaly.com", - "grandepornogratis.com", - "grandfuckauto.xxx", "grandtrial.org", - "granduniondtp.ac.uk", - "graneodin.com.mx", "grangorz.org", - "grannygetsafacial.com", - "grannylister.com", - "grannylovesbbc.com", - "grannylovesyoungcock.com", - "grannytube.net", - "grantham.ac.uk", - "grantleyhall.ac.uk", "graph.org", - "graphenecentre.ac.uk", - "graphengine.io", "graphis.ne.jp", "graphql.org", "gravatar.com", - "gravitytank.com", - "gray.ac.uk", - "graylab.ac.uk", - "grazie.ai", - "grcb.ac.uk", - "gre.ac.uk", "greasespot.net", + "greasyfork.org", "great-firewall.com", "great-roc.org", - "greatapedictionary.ac.uk", - "greatergothammini.com", - "greatermanchesterbiobankingnetwork.ac.uk", - "greatermanchestercolleges.ac.uk", - "greatermanchesterinternationalmedicalschool.ac.uk", - "greatermanchestermedicalschool.ac.uk", "greatfire.org", "greatfirewall.biz", "greatfirewallofchina.net", "greatfirewallofchina.org", - "greatretroporn.com", "greatroc.org", "greatroc.tw", - "greatwesternresearch.ac.uk", "greatzhonghua.org", - "greenbankcollege.ac.uk", - "greenbuildingstudio.com", - "greenend.org.uk", "greenfieldbookstore.com.hk", - "greenhead.ac.uk", - "greenhill.ac.uk", - "greenlakeaas.com", - "greenlakehybridcloud.com", "greenparty.org.tw", "greenpeace.com.tw", "greenpeace.org", - "greenplum.net", "greenreadings.com", "greenvpn.net", "greenvpn.org", - "greenwich-college.ac.uk", - "greenwich.ac.uk", - "greenwichdev.ac.uk", - "greginhollywood.com", - "gregynog.ac.uk", - "gresham-college.ac.uk", - "gresham.ac.uk", - "greshamcollege.ac.uk", - "grid-support.ac.uk", - "grid.ac.uk", - "gridaware.app", - "gridpp.ac.uk", - "grids.ac.uk", - "grimsby.ac.uk", - "grimsbytec.ac.uk", "grindr.com", - "grooby.com", + "grok.com", "grotty-monday.com", - "groupfun.com", - "groups.com", + "ground.news", "grow.google", - "grows.ac.uk", - "grpeng.ac.uk", - "grss-ieee.org", - "grupobmw.com", "gs-discuss.com", - "gsa.ac.uk", - "gscanada.info", - "gsccdn.com", "gsearch.media", - "gslink.us", - "gsmd.ac.uk", - "gsmlondon.ac.uk", - "gsrc.io", - "gssw.ac.uk", "gstatic.com", "gstf.org", - "gsuite.com", - "gt536.top", - "gtc.ac.uk", "gtricks.com", "gts-vpn.com", - "gttr.ac.uk", "gtv.org", "gtv1.org", - "gtvmediagroupfairfund.com", - "gtyarmouthcoll.ac.uk", "gu-chu-sum.org", - "gu-web.net", "guaguass.com", "guaguass.org", - "guambmw.com", "guancha.org", "guaneryu.com", "guangming.com.my", - "guangming.org", "guangnianvpn.com", - "guaranitermal.com", - "guardianapis.com", - "guardianapps.co.uk", - "guardianproject.info", "guardster.com", - "gucci.com", - "guccimuseo.com", - "guccitimeless.com", - "guifw.xyz", - "guildford.ac.uk", - "guildhallschool.ac.uk", - "guildhe.ac.uk", - "guim.co.uk", - "guimcode.co.uk", "guishan.org", "gumroad.com", - "gumtree.sg", "gun-world.net", "gunsamerica.com", "gunsandammo.com", "guo.media", - "guochantube.com", - "guochanw.life", - "guruofporn.com", "guruonline.hk", "gutteruncensored.com", - "guysnightlife.com", - "gv.com", "gvideo.de", "gvlib.com", "gvm.com.tw", "gvt0.com", "gvt1.com", - "gvt2.com", "gvt3.com", - "gvt5.com", - "gvt6.com", - "gvt7.com", - "gvt9.com", - "gw-partnership.ac.uk", - "gw4-cat.ac.uk", - "gw4.ac.uk", - "gw4biomed.ac.uk", "gwave.com", - "gwent.ac.uk", - "gwiki.net", "gwins.org", - "gwktravelex.nl", - "gwr.ac.uk", "gwtproject.org", - "gyakusimei.com", "gyalwarinpoche.com", "gyatsostudio.com", - "gyc.ac.uk", - "gynoexam.info", - "gyutte.site", - "gyutto.com", "gzm.tv", "gzone-anime.info", - "h-cdn.com", "h-china.org", "h-comic.com", - "h-doujinshi.xyz", - "h-flash.com", "h-moe.com", - "h-webtoon.com", - "h0930.com", - "h18ani1.vip", "h1n1china.org", - "h2porn.com", "h528.com", "h5dm.com", "h5galgame.me", - "hace.ac.uk", "hacg.club", "hacg.in", "hacg.li", "hacg.me", "hacg.red", - "hackday.com.au", "hacken.cc", "hacker.org", - "hackerfacebook.com", - "hackerguardian.com", - "hackfacebook.com", - "hackfacebookid.com", - "hacklang.org", "hackmd.io", - "hackney.ac.uk", - "hacksear.ch", "hackthatphone.net", - "hackthedrive.com", - "hackyourconsole.com", - "hadesex.com", - "hadlow.ac.uk", - "hadlowgroup.ac.uk", - "hae-acl.ac.uk", - "haha888.xyz", "hahlo.com", - "haho.moe", "haijiao.com", - "hairdressing.ac.uk", - "hairy-amateurs.com", - "hairy-beauty.com", - "hairy-women-pussy.net", - "hairyclassic.com", - "hairydivas.com", - "hairynature.com", - "hairyolder.com", - "hairypornsite.com", - "haisetu.net", - "haitenjp.com", "haiwaikan.com", "hakkatv.org.tw", - "halcyon.ac.uk", - "halesowen.ac.uk", - "half.com", - "half.tv", - "halfcanada.com", - "halfjapan.com", "halktv.com.tr", - "halton-acl.ac.uk", - "haltoncollege.ac.uk", - "hamec.ac.uk", - "hami-mod.buzz", - "hampsteadscience.ac.uk", - "hamsterfucktube.com", - "hamsterporn.tv", - "hanbao-tv.lol", - "handbags-nike.com", - "handbagsoutletebay.com", "handcraftedsoftware.org", - "handjobhub.com", - "handjobtube4free.com", - "handsworth.ac.uk", - "hanime.me", "hanime.tv", - "hanime.xxx", "hanime1.me", "hanminzu.org", - "hannah.ac.uk", - "hanr-bao.mom", "hanunyi.com", "hao.news", "hao123.com", "hao123img.com", - "hao21.xyz", - "hao62.xyz", - "haori888.com", - "haplorrhini.com", "happy-vpn.com", - "happymeal.co.nz", - "happymeal.com", - "happymeal.com.au", - "happymealdigital.com", "haproxy.org", - "hardcore-sex-filme.com", - "hardcoregayblog.com", - "hardsex8.com", "hardsextube.com", - "hardx.com", - "harica.gr", - "haringey6.ac.uk", - "harlaxton.ac.uk", - "harlech.ac.uk", - "harlow-college.ac.uk", - "harper-adams.ac.uk", - "harper.ac.uk", - "harperacademic.com", - "harperadams.ac.uk", - "harperapps.com", - "harpercollins.ca", - "harpercollins.co.in", - "harpercollins.co.uk", - "harpercollins.com", - "harpercollins.com.au", - "harpercollinsadvantage.com", - "harpercollinschildrensbooks.co.uk", - "harpercollinschristian.com", - "harpercollinsspeakersbureau.com", - "harperkeelevets.ac.uk", - "harperkeelevetschool.ac.uk", - "harrogate-college.ac.uk", - "harrogate.ac.uk", - "harrow.ac.uk", - "hartlepoolacademy.ac.uk", - "hartlepoolacl.ac.uk", - "hartlepoolfe.ac.uk", - "hartlepoolsixth.ac.uk", - "hartpury.ac.uk", - "hartpurycollege.ac.uk", - "hartpuryuni.ac.uk", - "hartpuryuniversity.ac.uk", - "hartpuryuniversitycentre.ac.uk", - "hartree.ac.uk", "harunyahya.com", - "hashflow.com", - "hashicorp.com", "hasi.wang", - "haskell.org", - "haskellstack.org", - "hastings.ac.uk", - "hastingsonline.ac.uk", - "hath.network", - "hau.ac.uk", + "hatena.ne.jp", "hautelook.com", "hautelookcdn.com", - "havant.ac.uk", - "havantandsouthdowns.ac.uk", - "havantsouthdowns.ac.uk", "have8.com", - "haveibeenpwned.com", - "havering-college.ac.uk", - "havering-sfc.ac.uk", - "havering.ac.uk", - "hawaiibmw.com", - "hayabusa.dev", - "hayabusa.io", - "hayabusa.media", - "hayle.ac.uk", - "haywardsheath.ac.uk", - "hbabit.com", - "hbfile.net", "hbg.com", "hbo.com", - "hbo.map.fastly.net", - "hboasia.com", - "hbogo.co.th", - "hbogo.com", - "hbogo.eu", - "hbogoasia.com", - "hbogoasia.hk", - "hbogoasia.id", - "hbogoasia.ph", - "hbogoasia.sg", - "hbogoasia.tw", - "hbomax.com", - "hbomaxcdn.com", - "hbonow.com", - "hbox.jp", - "hbrowse.com", - "hbs.ac.uk", - "hbvc.ac.uk", - "hca.ac.uk", "hcaptcha.com", - "hcaptchastatus.com", - "hcbdsm.com", - "hcctraining.ac.uk", - "hcebusiness.ac.uk", - "hcfe.ac.uk", "hclips.com", - "hclrg.ac.uk", - "hcomic.net", - "hcomicbook.com", - "hcpdts.com", - "hcri.ac.uk", - "hct.ac.uk", - "hcuc.ac.uk", - "hd-tubes.com", - "hdabla.net", - "hdb1.app", - "hdbigass.com", - "hddgames.cc", - "hddirectv.com", - "hdfreeporn.net", - "hdgaytube.xxx", - "hdhole.com", - "hdjavonline.com", "hdlt.me", - "hdouban.com", - "hdouban2.com", - "hdouga.com", - "hdporn1080.net", - "hdporn92.com", - "hdporncomics.com", - "hdpornfree.xxx", - "hdpornmax.net", - "hdpornt.com", - "hdpornvideo.xxx", - "hdready.xxx", - "hdreporn.com", - "hdrplusdata.org", - "hdruk.ac.uk", - "hdsex.pro", - "hdsexxx.net", "hdsky.me", - "hdtube.co", - "hdtube1.com", "hdtvb.net", - "hdvideosporn.net", - "hdxnxx.xxx", - "hdxx.tv", "hdzog.com", - "he-purchasing.ac.uk", "he.net", - "heacademy.ac.uk", - "headline.ac.uk", - "headlinejobs.hk", - "headphonepubs.com", - "headphones-cool.com", - "headphones-dre.com", - "headphones-outlet-online.com", - "headphonesbeatsaudio.com", - "headphonesbeatsbydre.com", - "headphoneses.com", - "headphoneshome.com", - "headphoneshotsales.com", - "headphonesol.com", - "headphonesretailer.com", - "headphonessupply.com", - "headphonezip.com", - "headset987.com", - "headteachers.ac.uk", - "health.ac.uk", - "health026.click", - "healthcare.ac.uk", - "healthcarecareeronline.com", - "healthcarescience.ac.uk", - "healthcaretechnologies.ac.uk", - "healthdataresearchuk.ac.uk", - "healtheducation.ac.uk", - "healthreach.hk", - "healthsciencescotland.ac.uk", - "healthyuniversities.ac.uk", - "hear.ac.uk", - "heart.ac.uk", - "heartbreakers.gallery", - "heartbreakers.info", - "heartofworcestershirecollege.ac.uk", - "heartofworcestershirelawschool.ac.uk", "heartyit.com", - "heat.ac.uk", - "heated.ac.uk", - "heaven-burns-red.com", - "heavenlyhentai.com", "heavy-r.com", - "heavyfetish.com", - "hebcon.ac.uk", - "hebetterregulation.ac.uk", - "hebiphone.com", "hec.su", - "hecail.ac.uk", "hecaitou.net", - "hecbiosim.ac.uk", "hechaji.com", - "hecollegeadvisersinlondon.ac.uk", - "hecsu.ac.uk", - "hector.ac.uk", - "hedata.ac.uk", - "hedd.ac.uk", - "hedg.ac.uk", - "hediip.ac.uk", - "hedip.ac.uk", "heeact.edu.tw", - "heefs.ac.uk", - "heeg.ac.uk", - "heep.ac.uk", - "heesf.ac.uk", - "heestates.ac.uk", - "hefce.ac.uk", - "hefcw.ac.uk", - "hefestis.ac.uk", - "hegovernance.ac.uk", "hegre-art.com", - "hegre.com", - "hei-worcester.ac.uk", - "heia.ac.uk", - "heidi.ac.uk", - "heids.ac.uk", - "heiguab.top", - "heijidi.life", - "heilbronn.ac.uk", - "heinlondon.ac.uk", - "heinonline.org", - "heise360181.buzz", - "heise360182.buzz", - "helf.ac.uk", "helixstudios.net", "helloandroid.com", "helloavgirls.com", - "hellofuture.ac.uk", - "hellokittybeats.com", "helloqueer.com", - "hellosmartbook.com", "helloss.pw", "hellotxt.com", "hellouk.org", - "hellporno.com", - "hellven.net", - "heloa.ac.uk", "helpeachpeople.com", "helplinfen.com", - "helpshift.com", "helpster.de", "helpuyghursnow.org", "helpzhuling.org", - "hendon.ac.uk", "henduohao.com", - "henley-cov.ac.uk", - "henley.ac.uk", - "henleycol.ac.uk", - "henleycollege.ac.uk", - "henleymc.ac.uk", - "henry-moore.ac.uk", - "henryfordcollege.ac.uk", - "hensa.ac.uk", - "henshaws.ac.uk", - "hentai-ani.me", - "hentai-archive.com", - "hentai-books.com", - "hentai-cosplays.com", - "hentai-covers.site", - "hentai-eroanime.net", - "hentai-for.net", - "hentai-fun.com", - "hentai-gamer.com", - "hentai-gif-anime.com", - "hentai-img.com", - "hentai-moon.com", - "hentai-vostfr.net", - "hentai.desi", - "hentai.game", - "hentai.io", - "hentai.name", - "hentai.pink", - "hentai.pro", "hentai.to", - "hentai.toys", - "hentai.tv", - "hentai0.com", - "hentai01.com", - "hentai2.net", - "hentai2012.com", - "hentai247.net", - "hentai24h.org", - "hentai24h.tv", - "hentai2games.com", - "hentai2read.com", - "hentai2w.com", - "hentai3dvideo.biz", - "hentai44.com", - "hentai4free.net", - "hentai4manga.com", - "hentai69.life", - "hentai69.online", - "hentaia.net", - "hentaiaction.net", - "hentaiasmr.moe", - "hentaiathome.net", - "hentaibaka.one", - "hentaibar.com", - "hentaiblue.com", - "hentaibros.com", - "hentaicity.com", - "hentaicloud.com", - "hentaiclub.net", - "hentaicomic.ru", - "hentaicomics.asia", - "hentaicomics.life", - "hentaicore.net", - "hentaicore.org", - "hentaicovid.com", - "hentaidirectory.org", - "hentaidude.com", - "hentaidude.xxx", - "hentaienvy.com", - "hentaiera.com", - "hentaiero.net", - "hentaifc.com", - "hentaifox.com", - "hentaifox.tv", - "hentaifreak.org", - "hentaifromhell.org", - "hentaigamer.org", - "hentaigamesplanet.com", - "hentaigasm.com", - "hentaihand.com", - "hentaihaven.com", - "hentaihaven.io", - "hentaihaven.me", - "hentaihaven.red", - "hentaihaven.xxx", - "hentaiheadlines.com", - "hentaihere.com", - "hentaiheroes.com", - "hentaihub.xxx", - "hentaikey.com", - "hentaiknight.com", - "hentailabs.com", - "hentailegendado.com", - "hentaimama.io", - "hentaimangaporn.com", - "hentaimovieplanet.com", - "hentainanime.com", - "hentainhaven.com", - "hentainstream.com", - "hentaipapa.com", "hentaipaw.com", - "hentaiplay.net", - "hentaiporn.com", - "hentaipornonly.com", - "hentaiprn.com", - "hentaiprno.com", - "hentaipros.com", - "hentairead.com", - "hentairead.info", - "hentairead.vip", - "hentairox.com", - "hentairules.net", - "hentais.tube", - "hentaisea.com", - "hentaiseason.com", - "hentaispark.com", - "hentaistream.com", - "hentaistream.tv", - "hentaistube.com", - "hentaisub.info", - "hentaitalk.com", - "hentaitk.com", - "hentaitokyo.com", - "hentaitube.online", "hentaitube.tv", - "hentaiverse.org", - "hentaivideos.net", "hentaivideoworld.com", - "hentaivn.de", - "hentaivn.la", - "hentaivn.net", - "hentaivvz.com", - "hentaiworld.eu", - "hentaiworld.tv", - "hentaiworldporn.com", - "hentaix.me", - "hentaixxx.vip", - "hentaixxxvids.com", - "hentaiyes.com", - "hentaiz.co", - "hentaiz.mobi", - "hentaiz.vip", - "hentaizap.com", - "hentaizilla.com", - "hentaizz.net", - "henti-night.com", - "hep.ac.uk", - "hepa.ac.uk", - "hepcw.ac.uk", - "hepi.ac.uk", - "hepp.ac.uk", - "heptio.com", "heqinglian.net", - "hera.ac.uk", - "heraldsun.com.au", - "herbi.ac.uk", - "herc.ac.uk", "here.com", - "hereford-art-col.ac.uk", - "hereford-tech.ac.uk", - "hereford.ac.uk", - "hereistheporn.com", - "hereward.ac.uk", - "herexxx.com", - "heriot-watt.ac.uk", "heritage.org", - "heritageconsortium.ac.uk", - "heritagequay.ac.uk", - "heritagescience.ac.uk", - "hernudepics.com", - "heroero.com", - "heroesofdragonage.com", - "heroesofthestorm.com", - "heroku-app.com", - "heroku-charge.com", - "heroku.co", "heroku.com", - "heroku.me", "herokuapp.com", - "herokucdn.com", - "herokucharge.com", - "herokussl.com", - "heron.ac.uk", - "herringnetwork.com", - "hertfordshire.ac.uk", - "hertfordshirebusinessschool.ac.uk", - "hertreg.ac.uk", - "herts-e-learn.ac.uk", - "herts-he.ac.uk", - "herts-regional.ac.uk", - "herts.ac.uk", - "hesa.ac.uk", - "hesharedlegal.ac.uk", - "hesin.ac.uk", - "hespa.ac.uk", - "hestem.ac.uk", - "heswbusnet.ac.uk", - "hetzner.cloud", - "hetzner.com", - "hetzner.company", - "hetzner.de", "heungkongdiscuss.com", - "hew.ac.uk", - "hewit.ac.uk", - "hewlett-packard.asia", - "hewlett-packard.ch", - "hewlett-packard.co", - "hewlett-packard.co.il", - "hewlett-packard.co.uk", - "hewlett-packard.com.cn", - "hewlett-packard.com.mx", - "hewlett-packard.com.sg", - "hewlett-packard.jp", - "hewlett-packard.mobi", - "hewlettpackard.enterprises", - "hex.pm", - "hexatronik.com", - "hexdocs.pm", "hexieshe.com", "hexieshe.xyz", "hexxeh.net", - "hey.boo", - "heydoga.com", - "heydouga.com", - "heythrop.ac.uk", - "heythropcollege.ac.uk", "heyuedi.com", "heywire.com", "heyzo.com", - "hf-iphone.com", - "hfaes.ac.uk", - "hfals.ac.uk", - "hfma.ac.uk", - "hg.cool", "hgamefree.info", - "hgamer.pro", "hgseav.com", - "hh-content.com", - "hhc.ac.uk", "hhdcb3office.org", "hhthesakyatrizin.org", - "hhvm.com", "hi-on.org.tw", - "hibdontire.com", "hiccears.com", "hidden-advent.org", - "hiddenhistorieswwi.ac.uk", - "hiddenvoyeurspy.com", - "hiddify.com", "hide.me", "hidecloud.com", - "hidefporn.ws", "hidein.net", "hideipvpn.com", "hideman.net", @@ -12765,119 +2728,60 @@ var rules = [ "hidemy.name", "hidemyass.com", "hidemycomp.com", - "hidive.com", - "hifacebook.info", - "hifiporn.fun", - "hifixxx.fun", - "hifuli.com", "higfw.com", - "highbolt.net", - "highbury.ac.uk", - "highburygroup.ac.uk", - "highdefinitionbeatsbydre.com", - "higher-education.ac.uk", - "highfieldscentre.ac.uk", - "highlands-jersey.ac.uk", - "highlands.ac.uk", - "highpeak.ac.uk", "highpeakspureearth.com", - "highporn.net", "highrockmedia.com", "hightail.com", - "hightopnikes.com", - "highwirepress.com", "hihiforum.com", - "hihigv.com", "hihistory.net", "hiitch.com", "hikinggfw.org", - "hilderstone.ac.uk", "hilive.tv", - "hillcroft.ac.uk", - "hillsroad.ac.uk", - "hilostripper.com", "himalaya.exchange", "himalayan-foundation.org", "himalayanglacier.com", "himemix.com", "himemix.net", - "hindawi.com", - "hindiweb.com", "hindustantimes.com", "hinet.net", - "hipaa6020.com", - "hiperduct.ac.uk", - "hiporn.net", - "hippyhillscomix.com", - "hipzoom.net", - "hison.ac.uk", - "historicalmusicpedagogy.ac.uk", - "historicalpageants.ac.uk", - "historicbooks.ac.uk", - "history-uk.ac.uk", - "history.ac.uk", - "historyofdota.com", - "historyofdota.net", - "historyofdota.org", - "historysubjectcentre.ac.uk", - "histparl.ac.uk", - "hiswifepussy.com", - "hitbdsm.com", "hitbtc.com", "hitomi.la", - "hitun.io", - "hitxhot.com", + "hiveon.net", "hiwifi.com", "hizb-ut-tahrir.info", "hizb-ut-tahrir.org", "hizbuttahrir.org", - "hjb246.top", - "hjb7e9.top", "hjclub.info", "hjd.tw", "hjd2048.com", "hk-pub.com", "hk01.com", - "hk1lib.org", "hk32168.com", "hkacg.com", "hkacg.net", "hkatvnews.com", "hkbc.net", "hkbf.org", - "hkbigman.net", - "hkbn.com.hk", - "hkbn.net", - "hkbnes.net", "hkbookcity.com", "hkchronicles.com", "hkchurch.org", "hkci.org.hk", - "hkcircleapp.com", - "hkcitizenmedia.com", "hkcmi.edu", "hkcnews.com", "hkcoc.com", - "hkcsl.com", "hkctu.org.hk", "hkdailynews.com.hk", "hkday.net", "hkdc.us", "hkdf.org", - "hkedcity.net", "hkej.com", "hkepc.com", "hket.com", - "hketgroup.com", - "hkf2023.lat", - "hkf202311.site", - "hkf202312.shop", "hkfaa.com", "hkfreezone.com", "hkfront.org", "hkgalden.com", "hkgolden.com", - "hkgolden.media", "hkgpao.com", "hkgreenradio.org", "hkheadline.com", @@ -12893,930 +2797,201 @@ var rules = [ "hkmap.live", "hkopentv.com", "hkpeanut.com", - "hkporn.net", "hkptu.org", "hkreadingcity.net", "hkreporter.com", - "hkt-enterprise.com", - "hkt-eye.com", - "hkt.com", - "hkteducation.com", - "hktpremier.com", - "hktshop.com", "hku.hk", "hkusu.net", - "hkvets.ac.uk", "hkvwet.com", "hkwcc.org.hk", "hkzone.org", - "hlbelygl.com", - "hlcollege.ac.uk", - "hlg.ac.uk", - "hlnsc.ac.uk", - "hlsp1.pw", - "hm.com", - "hmd.site", - "hmfby.com", - "hmfun.top", "hmoegirl.com", "hmonghot.com", - "hmovie-moe.us", - "hmsxpress.com", "hmv.co.jp", "hmvdigital.ca", "hmvdigital.com", - "hnalady.com", - "hnext.jp", "hnjhj.com", "hnntube.com", "ho5ho.com", - "hobonichielog.com", - "hochi.news", - "hockeyapp.net", - "hoes.com", - "hogarth.ac.uk", "hojemacau.com.mo", "hola.com", "hola.org", - "holaporno.xxx", - "holdemstripem.com", - "holloporn.com", - "hollyrandall.com", - "holmelacy.ac.uk", - "hololens.com", - "holts.ac.uk", - "holycross.ac.uk", "holymountaincn.com", "holyspiritspeaks.org", - "home-made-porn-movies.com", - "home-made-videos.com", - "home-sex-tapes.com", - "home-song.com", - "homealonemilfs.com", - "homedepot-static.com", + "home.saxo", "homedepot.com", - "homefieldcollege.ac.uk", - "homefuckingmovies.com", - "homegrownfreaks.net", - "homemade-porn-video.com", - "homemadeamateur.com", - "homemadeanalporn.com", - "homemadefucktube.com", - "homemadepornclip.com", - "homemadeporntubes.com", - "homemadevids.net", - "homemoviestube.com", - "homenetworks.ac.uk", "homeperversion.com", - "homephoneplus.com", - "homepornbay.com", - "homepornking.com", - "homepornvideo.net", "homeservershow.com", - "homesexmade.com", - "homestylerapp.com", - "homestylernews.com", - "hometrack.com.au", - "hominis.media", - "homo.xxx", - "homofans.blogspot.com", - "honawalaan.com", - "honestpornreviews.com", - "honey-monitoring.ac.uk", "honeynet.org", - "hongjie10.xyz", - "hongjie11.xyz", - "hongkongdoll.tv", - "hongkongdollvideo.org", "hongkongfp.com", - "hongkongpost.gov.hk", "hongmeimei.com", "hongzhi.li", - "honkaiimpact3.com", - "honkaistarrail.com", - "honnaka.jp", "honven.xyz", - "hoodamateurs.com", - "hooligapps.com", - "hooloo.tv", - "hoolu.com", - "hoolu.tv", "hootsuite.com", "hoover.org", "hoovers.com", - "hope.ac.uk", "hopedialogue.org", - "hopstop.tv", "hopto.org", - "hopwood.ac.uk", - "horizon.ac.uk", - "horizonscollege.ac.uk", - "horizontal-llc.com", - "horizontal-systems.com", - "horizontalglue.com", - "horizontalsystems.com", - "horniman.ac.uk", - "hornybitches.org", - "hornybutt.com", - "hornychat.net", - "hornyelephant.com", "hornygamer.com", - "hornygfporn.com", - "hornygirlsonline.org", - "hornyjav.com", "hornytrip.com", - "hornywhores.net", "horrorporn.com", - "horse-cum.net", - "horse4sex.com", - "horsecock.guru", - "horsecumshot.net", - "horsedick.net", - "horsedicks.net", - "horsemecum.com", - "horseporn.tv", - "hostborneo.org", "hostloc.com", - "hot-arab-films.com", - "hot-cartoon.com", - "hot-gayporn.com", - "hot-sex-photos.com", - "hot-sex-tube.com", - "hot-teens.com", - "hot2048.com", "hotair.com", - "hotamateurblowjobs.com", - "hotasianbabes.com", "hotav.tv", - "hotbeatsonsale.com", - "hotbed.ac.uk", - "hotcandyland.com", "hotcoin.com", - "hotcuckoldwife.com", - "hotcumporn.com", "hotels.cn", - "hotescortdusseldorf.com", - "hotfiesta.com", "hotfrog.com.tw", - "hotfucktube.com", - "hotgaylist.com", - "hotgirl.asia", - "hotgirlsclips.com", "hotgoo.com", - "hothdsex.xxx", - "hothomemade.com", - "hotindianbabe.com", - "hotindianxxxsex.com", - "hotjav.tv", - "hotladsworld.com", - "hotladyhere.com", - "hotmail.co", - "hotmail.com", - "hotmail.eu", - "hotmail.net", - "hotmail.org", - "hotmonsterbeats.com", - "hotmovies.com", - "hotmovs.com", - "hotntubes.com", - "hotnudegirls.net", - "hotporn.today", - "hotpornbible.com", - "hotpornfile.org", "hotpornshow.com", - "hotporntubes.com", "hotpot.hk", - "hotscope.tv", - "hotsexvideo.mobi", - "hotsexydolls.com", "hotshame.com", "hotspotshield.com", - "hotstar-cdn.net", - "hotstar-labs.com", - "hotstar.com", - "hotstarext.com", - "hotstunners.com", - "hotteenfreecam.com", - "hottestfilms.com", - "hottestheadphonesonline.com", "hottg.com", - "hottystop.com", "hotvpn.com", - "hotwifemovies.com", - "hotzxgirl.com", "hougaige.com", - "houghall.ac.uk", "house.gov", - "housefraserarchive.ac.uk", - "housing.com", - "housingcdn.com", - "housingevidence.ac.uk", - "howcollege.ac.uk", - "howfuck.me", "howtoforge.com", - "howtogetmo.co.uk", - "howtohackfacebook-account.com", "hoxx.com", - "hoyo.link", + "hoy.tv", "hoyolab.com", - "hoyoverse.com", - "hp-imagine.com", - "hp-infolab.com", - "hp-invent.com", - "hp-invent.info", - "hp-mns.com", - "hp-printing.com", - "hp-webplatform.com", - "hp-ww.com", - "hp.com", - "hp.company", - "hp.io", - "hp3d.com", - "hp3dmetals.com", - "hp3dprinter.com", - "hp3dsamplepromo.com", "hpa.gov.tw", - "hpallinoneprinter.com", - "hpapplicationscenter.com", - "hpayshop.com", - "hpbestbuy.com", - "hpbluecarpet.com", - "hpbluecarpet.net", - "hpbuiltforlearning.com", - "hpbundle.com", - "hpc-diversity.ac.uk", - "hpc-midlands-plus.ac.uk", - "hpc-midlands.ac.uk", - "hpc-sc.ac.uk", - "hpc-uk.ac.uk", - "hpcampus.com", - "hpcatridge.com", - "hpccp.com", - "hpceo.com", - "hpci.ac.uk", - "hpcmw.net", - "hpcodewarsbcn.com", - "hpcomputers.com", - "hpcomputerservices.com", - "hpconnected.com", - "hpconnected.net", - "hpconnected.org", - "hpconnected.us", - "hpconnectedstage.com", - "hpcontinuum.com", - "hpcpi.com", - "hpcu.org", - "hpcustomersupport.com", - "hpcustomersupport.net", - "hpcx.ac.uk", - "hpdaas.com", - "hpdesignjetl25500.com", - "hpdesktopcomputer.com", - "hpdownloadstore.com", - "hpdreamcolor.com", - "hpdriver.com", - "hpdrivers.com", - "hpdrivers.org", - "hpe.com", - "hpeclipse.com", - "hpecyber.com", - "hpefonts.s3.amazonaws.com", - "hpengage.com", - "hpeprint.com", - "hpeprintcenter.com", - "hpeurope.com", - "hpeventcenter.com", - "hpfaqs.com", - "hpfeedback.com", - "hpgift.com", - "hpgpas.com", - "hpgraphicspartners.com", - "hpiie.org", - "hpinc.info", - "hpinc.net", - "hpindigopress.com", - "hpinkjet.com", - "hpinstantink.ca", - "hpinstantink.com", - "hpjav.tv", - "hpkeyboard.com", - "hplaptop.com", - "hplaptopbattery.com", - "hplargeformatremote.com", - "hplatexknowledgecenter.com", - "hplfmedia.com", - "hplip.net", - "hplipopensource.com", - "hpmarketplace.com", - "hpmemorychips.com", - "hpmicrcartridge.com", - "hpmini.com", - "hpmobile.com", - "hpofficejetprinter.com", - "hponlinehelp.com", - "hponlineprinting.com", - "hpoolsfc.ac.uk", - "hppage5000.com", - "hppavillionlaptop.com", - "hpphotoscanners.com", - "hpprinterdrivers.com", - "hpprinterinstalls.com", - "hpprintersupplies.com", - "hpsalescentral.com", - "hpserver.com", - "hpservices.com", - "hpshooping.com", - "hpshop.com", - "hpshoping.com", - "hpshopping.hk", - "hpsignage.com", - "hpsmart.com", - "hpsmarts.com", - "hpsmartstage.com", - "hpsmartupdate.com", - "hpsoftware.com", - "hpspeaker.com", - "hpsprocket.com", - "hpsso.com", - "hpstore-china.com", - "hpstore-emea.com", - "hpstore.com", - "hpstorethailand.com", - "hpsupport.com", - "hpsuresupply.com", - "hptechventures.com", - "hpto.net", - "hptouch.com", - "hptouchpointmanager.com", - "hptrainingcenter.com", - "hptv.fun", - "hpuae.com", - "hpuniversity.info", - "hpusertraining.com", - "hpveer.com", - "hpvirtualthin.com", - "hpwallart.com", - "hpwellnesscentral.com", - "hpwsn.com", - "hq69.com", - "hqbabes.com", - "hqbutt.com", + "hpjav.com", "hqcdp.org", - "hqdesexo.com", "hqjapanesesex.com", "hqmovies.com", - "hqporner.com", - "hqseek.com", - "hqtrannytube.com", - "hqtube.xxx", - "hqxxxmovies.com", - "hrbdt.ac.uk", - "hrc.ac.uk", "hrcchina.org", "hrcir.com", "hrea.org", - "hrecords.jp", - "hri.ac.uk", "hrichina.org", - "hrionline.ac.uk", "hrntt.org", - "hrsaz.com", - "hrsfc.ac.uk", "hrtsea.com", "hrw.org", "hrweb.org", - "hsad.ac.uk", - "hsbc-alternatives.de", - "hsbc-transactionservices.de", - "hsbc-zertifikate.de", - "hsbc.ae", - "hsbc.am", - "hsbc.bm", - "hsbc.ca", - "hsbc.co.id", - "hsbc.co.in", - "hsbc.co.jp", - "hsbc.co.kr", - "hsbc.co.mu", - "hsbc.co.nz", - "hsbc.co.th", - "hsbc.co.uk", - "hsbc.com", - "hsbc.com.ar", - "hsbc.com.au", - "hsbc.com.bd", - "hsbc.com.bh", - "hsbc.com.br", - "hsbc.com.cn", - "hsbc.com.eg", - "hsbc.com.hk", - "hsbc.com.mo", - "hsbc.com.mt", - "hsbc.com.mx", - "hsbc.com.my", - "hsbc.com.ph", - "hsbc.com.sg", - "hsbc.com.tr", - "hsbc.com.tw", - "hsbc.com.uy", - "hsbc.com.vn", - "hsbc.de", - "hsbc.fr", - "hsbc.lk", - "hsbc.net", - "hsbc.uk", - "hsbcamanah.com.my", - "hsbcinnovationbanking.com", - "hsbcinsurance.com.cn", - "hsbcnet.com", - "hsbcprivatebank.com", - "hsbcqh.com.cn", - "hsbctrinkaus.de", - "hsdc.ac.uk", - "hsdp.ac.uk", - "hsex.icu", "hsex.men", - "hsex.tv", - "hsfacebook.com", - "hshsxkj.com", "hsjp.net", - "hsm-works.com", - "hsm-xpress.com", - "hsmexpress.com", - "hsmworks.com", - "hsmxpress.com", - "hss.ac.uk", "hsselite.com", "hst.net.tw", "hstern.net", "hstt.net", - "hsxsp1.buzz", - "hsyy.vip", - "ht.ac.uk", "ht.ly", - "hta.ac.uk", "htkou.net", "htl.li", "html5rocks.com", - "htp.ac.uk", - "hts.ac.uk", - "httpfacebook.com", "https443.net", "https443.org", - "httpsfacebook.com", - "httpwwwfacebook.com", - "htvncdn.net", - "htx.com", - "htyj-bj.com", - "htznr.li", - "hu1u.com", "hua-yue.net", - "huabansp.com", - "huabansp7.club", "huaglad.com", "huaibinmall.com", "huanghuagang.org", - "huangse.love", "huangyiyu.com", - "huanyuju.com", "huaren.us", "huaren4us.com", - "huarenav.com", - "huarenporn.com", "huashangnews.com", - "huashundg.com", "huasing.org", - "huati.cc", - "huawen.ac.uk", "huaxia-news.com", "huaxiabao.org", - "huaxin-lls.xyz", "huaxin.ph", - "huaxin80.com", - "huaxinvip.top", "huayuworld.org", - "hubbard-theory-consortium.ac.uk", - "hubblephone.com", - "hubg.org", - "hud.ac.uk", "hudatoriq.web.id", - "huddcoll.ac.uk", - "huddersfield.ac.uk", - "huddnewcoll.ac.uk", "hudson.org", - "huffingtonpost.ca", - "huffingtonpost.co.uk", - "huffingtonpost.co.za", "huffingtonpost.com", - "huffingtonpost.com.au", - "huffingtonpost.com.mx", - "huffingtonpost.de", - "huffingtonpost.es", - "huffingtonpost.fr", - "huffingtonpost.gr", - "huffingtonpost.in", - "huffingtonpost.it", - "huffingtonpost.jp", - "huffingtonpost.kr", "huffpost.com", - "huffpostarabi.com", - "huffpostbrasil.com", - "huffpostmaghreb.com", - "hugedildo.com", - "hugesex.tv", "huggingface.co", - "hughbaird.ac.uk", "hugoroy.eu", "huhaitai.com", "huhamhire.com", "huhangfei.com", - "huiav.com", "huigui.tw", - "huish.ac.uk", "huiyi.in", - "huj-pizda.com", "hulkshare.com", - "hull-college.ac.uk", - "hull.ac.uk", - "hullacl.ac.uk", - "hullschoolartdesign.ac.uk", - "hulltraining.ac.uk", - "huloo.cc", - "huloo.tv", "hulu.com", - "hulu.jp", - "hulu.tv", - "hulu.us", - "huluaction.com", - "huluad.com", - "huluapp.com", - "huluasks.com", - "hulucall.com", - "hulufree.com", - "hulugans.com", - "hulugermany.com", - "hulugo.com", - "huluhuluhuluhulu10.work", "huluim.com", - "huluinstantmessenger.com", - "huluitaly.com", - "hulunet.com", - "hulunetwork.com", - "huluplus.com", - "hulupremium.com", - "hulupurchase.com", - "huluqa.com", - "hulurussia.com", - "huluspain.com", - "hulusports.com", - "hulustream.com", - "huluteam.com", - "hulutv.com", - "huluusa.com", - "humanities-human-rights.ac.uk", - "humanities.ac.uk", - "humanmind.ac.uk", "humanparty.me", - "humanrights-lse.ac.uk", "humanrightsbriefing.org", "humanrightspressawards.org", - "humber.ac.uk", - "humbermaritimecollege.ac.uk", - "humblebundle.com", - "humbox.ac.uk", - "humbug.ac.uk", - "humbul.ac.uk", - "hummingbird.ms", - "humoron.com", "hung-ya.com", - "hungerford.ac.uk", "hungerstrikeforaids.org", - "hungryclit.com", - "hunk.ws", - "huntingdon.ac.uk", "huobi.co", "huobi.com", "huobi.me", "huobi.pro", "huobi.sc", "huobi.vc", - "huobiasia.vip", - "huobigroup.com", + "huobipool.com", "huobipro.com", - "huobitoken.com", - "huohaore.net", "huping.net", "hurgokbayrak.com", "hurriyet.com.tr", - "hussiepass.com", "hustler.com", "hustlercash.com", "hut2.ru", - "hutao.cloud", "hutianyi.net", "hutong9.net", - "hutpromos.com", - "hutton.ac.uk", "huyandex.com", - "hw.ac.uk", "hwadzan.tw", "hwayue.org.tw", - "hwcdn.net", - "hwgo.com", "hwinfo.com", - "hwlc.ac.uk", - "hwlln.ac.uk", - "hwslabs.com", - "hxcsxs.pro", - "hxdoll.com", "hxwk.org", "hxwq.org", - "hxxn12.top", "hybrid-analysis.com", - "hybrid-group.ac.uk", - "hyde.ac.uk", - "hydeclarendon.ac.uk", - "hydrogenaud.io", - "hydronationscholars.ac.uk", - "hyms.ac.uk", - "hyp.ac.uk", - "hyper.is", - "hyperdreams.com", "hyperrate.com", - "hyperscan.io", - "hypnohub.net", - "hypnoporn.net", - "hypnotube.com", + "hypothes.is", "hyread.com.tw", - "hysbys.ac.uk", "hysteria.network", - "hzmn.net", - "i-123-hp.com", - "i-book.com", - "i-book.net", "i-cable.com", - "i-centralwm.ac.uk", - "i-lab.ac.uk", - "i-mobile.co.jp", - "i-o-u.info", "i-part.com.tw", "i-scmp.com", - "i.org", "i1.hk", "i2p2.de", "i2runner.com", - "i69.com.tw", "i818hk.com", - "i91dz.com", - "iaablog.com", - "iaac.ac.uk", - "iafd.com", - "iagp.ac.uk", - "iah.ac.uk", - "ial-wrecsam.ac.uk", - "ials.ac.uk", "iam.soy", - "iamakamai.com", - "iamakamai.net", - "iamremarkable.org", "iamtopone.com", - "iana.org", - "iapetus.ac.uk", - "iapetus2.ac.uk", "iask.bz", "iask.ca", - "iat.ac.uk", - "iau.ac.ir", "iav19.com", - "iavnight.com", - "ibb.co", - "ibd-boost.ac.uk", - "ibeats-uk.com", - "ibeatsbydre.cc", - "ibeatsbydre.com", + "iavian.net", "ibiblio.org", - "ibis.ac.uk", "ibit.am", "iblist.com", "iblogserv-f.net", - "ibm.com", - "ibm.eu", - "ibm.net", - "ibm.us", - "ibonedyourmom.com", - "ibook.co.nz", - "ibook.com", - "ibook.eu", - "ibook.net", - "ibookpartner.com", - "ibooksauthor.com", - "ibradome.com", "ibros.org", - "ibss.ac.uk", "ibtimes.com", - "ibuild.ac.uk", "ibvpn.com", "ibytedtos.com", - "ic.ac.uk", - "icac.ac.uk", - "icair.ac.uk", "icams.com", - "icashpassport.com.mx", - "icca.ac.uk", - "iccliverpool.ac.uk", - "ice-cse.ac.uk", - "iced.ac.uk", "icedrive.net", - "icegay.tv", - "icegaytube.tv", - "iceporn.com", - "iceporncasting.com", "icerocket.com", - "icevirtuallibrary.com", - "ichat.co.in", - "ichigocandy.com", - "ichineseporn.com", - "icif.ac.uk", "icij.org", - "icit.ac.uk", "icl-fi.org", - "icloud-content.com", - "icloud-isupport.com", - "icloud-sandbox.com", - "icloud.ch", - "icloud.com", - "icloud.de", - "icloud.ee", - "icloud.fi", - "icloud.fr", - "icloud.hu", - "icloud.ie", - "icloud.is", - "icloud.jp", - "icloud.lv", - "icloud.om", - "icloud.org", - "icloud.pt", - "icloud.ro", - "icloud.se", - "icloud.si", - "icloud.sk", - "icloud.vn", - "icloudads.net", - "icloudbox.net", - "icloudbrowser.net", - "icloude.com", - "icloudhome.com", - "icloudmail.net", - "icloudmusic.net", - "icloudnet.net", - "icloudo.com", - "icloudo.de", - "icloudo.net", - "icloudos.de", - "icloudos.net", - "icloudpay.net", - "icloudsecure.net", - "icloudsetup.com", - "icls.ac.uk", - "icma.ac.uk", - "icmacentre.ac.uk", - "icmp.ac.uk", "icoco.com", - "iconcollege.ac.uk", "iconfactory.net", - "iconnect.ac.uk", "iconpaper.org", - "icr.ac.uk", - "ics.ac.uk", - "icsa.ac.uk", - "icsl.ac.uk", - "ictheatre.ac.uk", "icu-project.org", - "icuminside.com", "idaiwan.com", - "idarkdoll.com", - "idcore.ac.uk", - "idea-server.com", - "ideal-teens.com", - "idealse.ac.uk", - "ideapocket.com", - "idelreal.org", "idemocracy.asia", "identi.ca", - "identrust.co.uk", - "identrust.com", - "identrust.net", - "idgo.ac.uk", "idiomconnection.com", "idlcoyote.com", - "idnike.com", - "idol-sagasukun.com", "idouga.com", - "idras.ac.uk", "idreamx.com", - "ids-apple.com", - "ids.ac.uk", "idsam.com", "idv.tw", - "idvd.eu", - "idx.dev", - "ie10.com", - "ie11.com", - "ie8.co", - "ie9.com", "ieasy5.com", - "iebay.com", "ied2k.net", - "ieee-aess.org", - "ieee-cas.org", - "ieee-ccnc.org", - "ieee-ceda.org", - "ieee-ecce.org", - "ieee-edusociety.org", - "ieee-ies.org", - "ieee-ims.org", - "ieee-into-focus.org", - "ieee-isto.org", - "ieee-npss.org", - "ieee-pels.org", - "ieee-pes.org", - "ieee-ras.org", - "ieee-region6.org", - "ieee-sensors.org", - "ieee-tems.org", - "ieee-uffc.org", - "ieee-vics.org", - "ieee.ca", - "ieee.org", - "ieee.tv", - "ieeeaps.org", - "ieeecsc.org", - "ieeecss.org", - "ieeeday.org", - "ieeedeis.org", - "ieeefoundation.org", - "ieeemagnetics.org", - "ieeemce.org", - "ieeenano.org", - "ieeeoes.org", - "ieeer10.org", - "ieeer5.org", - "ieeer8.org", - "ieeesmc.org", - "ieeesystemscouncil.org", - "ieeeusa.org", "ienergy1.com", "iepl.us", - "ies.ac.uk", - "iesr.ac.uk", - "ietf.org", - "iexchange.ac.uk", "ifanqiang.com", - "ifastcapital.com.my", - "ifastcorp.com", - "ifastfinancial.co.in", - "ifastfinancial.com.hk", - "ifastgb.com", - "ifastgp.com", - "ifastgp.com.hk", - "ifastnetwork.com", - "ifasttv.com", "ifcss.org", - "ife.ac.uk", "ifjc.org", - "ifl.ac.uk", - "ifm.ac.uk", - "ifontcloud.com", - "ifr.ac.uk", - "iframejav.com", "ifreewares.com", - "ifs.ac.uk", - "ifslearning.ac.uk", - "ifstal.ac.uk", "ift.tt", - "ifuckedmy.mom", - "ifuckedtheboss.com", "ig.com", - "ig.me", - "igaychat.com", - "igayporn.tv", "igcd.net", - "igcdn.com", - "iger.ac.uk", - "igetnaughty.com", "igfw.net", "igfw.tech", - "igi-global.com", - "igkbroker.com", "igmg.de", - "igmm.ac.uk", - "ign.jp", - "ignite.ac.uk", "ignitedetroit.net", - "ignites.com", - "ignitesasia.com", - "igniteseurope.com", "igoogle.ae", "igoogle.am", "igoogle.as", @@ -13867,1470 +3042,271 @@ var rules = [ "igoogle.tt", "igoogle.vu", "igoogle.ws", - "igoshopping.net", "igotmail.com.tw", - "igotpornpics.com", - "igpublish.com", - "igsonar.com", - "igsqt.ac.uk", - "igtv.com", "igvita.com", "ihakka.net", "ihao.org", - "ihgs.ac.uk", - "ihighbury.ac.uk", - "ihrinfo.ac.uk", - "ihsd-mp4.pics", - "ihsdav.cc", "iicns.com", - "iijav.com", - "iillii.net", - "iina.io", - "iirmll.com", - "iis.ac.uk", - "ijavhd.com", - "ijavtorrent.com", - "ikanhm.xyz", - "ikanmh.xyz", - "ikea.ae", - "ikea.at", - "ikea.au", - "ikea.be", - "ikea.bg", - "ikea.bh", - "ikea.ca", - "ikea.ch", - "ikea.cl", - "ikea.co.at", - "ikea.co.ca", - "ikea.co.id", - "ikea.co.il", - "ikea.co.jp", - "ikea.co.kr", - "ikea.co.om", - "ikea.co.pl", - "ikea.co.th", - "ikea.co.uk", - "ikea.com", - "ikea.com.au", - "ikea.com.cy", - "ikea.com.de", - "ikea.com.do", - "ikea.com.eg", - "ikea.com.gr", - "ikea.com.hk", - "ikea.com.kw", - "ikea.com.lv", - "ikea.com.mx", - "ikea.com.my", - "ikea.com.om", - "ikea.com.pl", - "ikea.com.pr", - "ikea.com.pt", - "ikea.com.ro", - "ikea.com.ru", - "ikea.com.sa", - "ikea.com.sg", - "ikea.com.tr", - "ikea.com.tw", - "ikea.com.ua", - "ikea.cz", - "ikea.de", - "ikea.dk", - "ikea.do", - "ikea.ee", - "ikea.eg", - "ikea.es", - "ikea.fi", - "ikea.fr", - "ikea.gr", - "ikea.hk", - "ikea.hr", - "ikea.hu", - "ikea.ie", - "ikea.in", - "ikea.is", - "ikea.it", - "ikea.jo", - "ikea.jp", - "ikea.kr", - "ikea.lt", - "ikea.lv", - "ikea.ma", - "ikea.mx", - "ikea.my", - "ikea.net", - "ikea.nl", - "ikea.no", - "ikea.om", - "ikea.ph", - "ikea.pl", - "ikea.pr", - "ikea.pt", - "ikea.qa", - "ikea.ro", - "ikea.rs", - "ikea.ru", - "ikea.sa", - "ikea.sg", - "ikea.si", - "ikea.sk", - "ikea.ua", - "ikea.us", - "ikids.com", - "iknowthatgirl.com", "ikstar.com", "ikwb.com", - "ilab.ac.uk", "ilbe.com", - "ilecture.co.nz", - "ilex-tutorial.ac.uk", "ilhamtohtiinstitute.org", - "ilife.eu", - "ilife.gr", - "ilife.wang", "illawarramercury.com.au", - "illianacomputerrecycling.com", - "illusion.co.jp", - "illusion.jp", - "illusion111.com", - "illusionas.com", - "illusionchn.com", "illusionfactory.com", - "illusiongw.com", - "illusionh.com", - "illusionl.com", - "illusionn2.com", - "illusionn3.com", - "illusionn4.com", - "illusionn5.com", - "illusionxz.com", - "illusiony.com", - "illusionze.com", - "illusnoi.com", - "ilnk.info", - "ilongman.com", - "ilove-movies.com", "ilove80.be", - "iloveinterracial.com", "ilovelongtoes.com", - "ilovexs.com", - "ilt.ac.uk", - "ilthe.ac.uk", - "im-apps.net", "im.tv", "im88.tw", - "imac-apple.com", - "imac-applecomputer.com", - "imac.co", - "imac.co.nz", - "imac.com", - "imac.eu", - "imac.gr", - "imac.one", - "imac.rs", - "imacapple.com", - "imacapplecomputer.com", - "imacsources.com", - "image-guided-therapies.ac.uk", "imageab.com", - "imagebam.com", - "imagecurl.com", - "imagecurl.org", "imagefap.com", "imageflea.com", "imageglass.org", - "imagemodeler.com", - "imagepost.com", - "images-amazon.com", "images-gaytube.com", - "imageshack.com", "imageshack.us", - "imagetwist.com", "imagevenue.com", - "imageworks.com", - "imageworkshop.ac.uk", "imagezilla.net", - "imaginationsengine.com", - "imaginecup.pl", - "imagineecommerce.com", "imago-images.com", - "imaypb.com", "imb.org", "imdb.com", - "imdb.to", - "imems.ac.uk", - "imessage.tv", - "imet.ac.uk", "img.ly", "imgasd.com", - "imgbb.com", "imgchili.net", - "imgcrl.org", - "imgix.com", - "imgix.net", "imgmega.com", - "imgsmail.ru", "imgur.com", - "imgur.io", - "imgurinc.com", - "imhentai.xxx", - "imilfs.com", "imkev.com", - "imlab.ac.uk", + "imlive.co", "imlive.com", - "immidio.com", "immigration.gov.tw", "immoral.jp", - "immxd.com", - "imod.com", - "imonsterbeats.com", - "imovie.eu", - "imoviegallery.com", - "imoviestage.com", - "impact-ad.jp", - "impact-hei.ac.uk", - "impact.ac.uk", "impact.org.au", - "impactdesignhub.com", - "impala-media-production.s3.amazonaws.com", - "impala.ac.uk", - "imperial.ac.uk", - "imperialbusiness.school", - "imperiodefamosas.com", - "impermium.com", "impp.mn", - "imr-cdt.ac.uk", - "imrci.ac.uk", - "imstagram.com", - "imt.ac.uk", - "imtagram.com", - "imzog.com", + "improd.works", "in-disguise.com", "in.com", "in99.org", - "inaporn.com", - "inasian.club", "incapdns.net", - "incentivetravelgifts.com", - "incestflix.com", - "incesto.blog.br", - "incestporn.xxx", - "incestvidz.com", - "incezt.net", "incloak.com", - "inclusion.ac.uk", - "inclusivegrowthscore.com", - "incommon-rsa.org", "incredibox.fr", - "ind.sh", - "indazn.com", - "indaznlab.com", - "indeedproject.ac.uk", "independent.co.uk", - "independentoperatorcn.com", - "indexxx.com", - "india.com", "indiablooms.com", - "indiaipad.com", - "indian-free-xnxx.com", "indianarrative.com", - "indiancolleges.com", "indiandefensenews.in", "indianexpress.com", - "indianfuck2.com", - "indiangfvideos.com", - "indiangirlsclub.com", - "indianhiddencams.com", - "indianpornfast.com", - "indianporngirls.com", - "indianpornvideo.org", - "indianpornvideos2.com", - "indiansexmms2.com", - "indiansexpussy.com", - "indiansexstories.net", - "indiansexstories2.net", "indiatimes.com", "indiatoday.in", "indiemerch.com", - "indienudes.com", - "indies-av.co.jp", - "indonesiaporn.name", "indsr.org.tw", - "industrialtoys.com", - "infinitetoons.com", - "infinitetube.com", - "influencersgonewild.com", "info-graf.fr", - "infocert.digital", - "infocert.it", - "infogov.ac.uk", - "infolinker.com.tw", - "inform25.ac.uk", - "information-systems.ac.uk", - "informedchoices.ac.uk", "informer.com", - "informs.org", - "infosciscotland.ac.uk", - "infotimes.com.tw", - "infowars.com", - "infowarsmedia.com", - "infrapedia.com", - "infraworks.com", - "infura.io", - "ingads.com", - "ingka.com", - "ingka.dev", - "ingkacentres.com", "ingress.com", - "inherd.mom", - "inhumanity.com", - "inikesneakers.com", - "init.shop", - "initiate.ac.uk", + "inherit.live", "initiativesforchina.org", - "initproducts.com", "inkbunny.net", - "inkchoice.com", - "inkedravens.com", "inkui.com", "inlang.com", - "inlethd.com", "inmediahk.net", "innermongolia.org", - "innogen.ac.uk", - "innovation-exchange.ac.uk", - "innovation.ac.uk", - "innovations-i.com", - "innovations.ac.uk", "inoreader.com", "inote.tw", - "inporn.com", - "inquisitionspostmortem.ac.uk", "insecam.org", - "insendi.com", - "inshot.cc", - "inshot.com", - "inshotapp.com", "inside.com.tw", - "insidefilms.com", - "insidemacintosh.com", - "insider-intelligence.com", - "insider.com", - "insiderdevtour.com", - "insiderintelligence.com", "insidevoa.com", - "inspire-dtp.ac.uk", - "inspiretrust.ac.uk", - "inst-of-oceanographic-sci.ac.uk", - "instaadder.com", - "instabang.com", - "instachecker.com", - "instafallow.com", - "instafollower.com", - "instagainer.com", - "instagda.com", - "instagify.com", - "instagmania.com", - "instagor.com", - "instagram-brand.com", - "instagram-engineering.com", - "instagram-help.com", - "instagram-press.com", - "instagram-press.net", "instagram.com", - "instagramci.com", - "instagramcn.com", - "instagramdi.com", - "instagramhashtags.net", - "instagramhilecim.com", - "instagramhilesi.org", - "instagramium.com", - "instagramizlenme.com", - "instagramkusu.com", - "instagramlogin.com", - "instagramm.com", - "instagramn.com", - "instagrampartners.com", - "instagramphoto.com", - "instagramq.com", - "instagramsepeti.com", - "instagramtakipcisatinal.net", - "instagramtakiphilesi.com", - "instagramtips.com", - "instagramtr.com", - "instagran.com", - "instagranm.com", - "instagrem.com", - "instagrm.com", - "instagtram.com", - "instagy.com", - "installbuzzsaw.com", - "instamgram.com", - "instangram.com", - "instantfap.com", - "instantfapgay.com", "instanthq.com", - "instantink.com", - "instantssl.com", - "instanttelegram.com", - "instaplayer.net", - "instastyle.tv", - "instawank.com", - "instgram.com", "institut-tibetain.org", - "institute-of-cancer-research.ac.uk", - "instituteofcoding.ac.uk", - "instituteofcounselling.ac.uk", - "instituteofwar.org", - "institutionofelectronics.ac.uk", - "insuyo.xyz", - "intagram.com", - "intagrm.com", - "intarch.ac.uk", - "intc.com", - "integral7.com", - "integrativebiology.ac.uk", - "intel-research.net", - "intel-university-collaboration.net", - "intel.ac", - "intel.ae", - "intel.af", - "intel.ag", - "intel.ai", - "intel.ar", - "intel.at", - "intel.az", - "intel.ba", - "intel.bg", - "intel.bh", - "intel.bi", - "intel.bo", - "intel.bs", - "intel.by", - "intel.ca", - "intel.cc", - "intel.cg", - "intel.ch", - "intel.cl", - "intel.cm", - "intel.co.ae", - "intel.co.cr", - "intel.co.id", - "intel.co.il", - "intel.co.jp", - "intel.co.kr", - "intel.co.uk", - "intel.co.za", - "intel.com", - "intel.com.ar", - "intel.com.au", - "intel.com.bo", - "intel.com.br", - "intel.com.co", - "intel.com.ec", - "intel.com.hk", - "intel.com.jm", - "intel.com.mx", - "intel.com.my", - "intel.com.pe", - "intel.com.ph", - "intel.com.pr", - "intel.com.py", - "intel.com.tr", - "intel.com.tw", - "intel.com.uy", - "intel.com.ve", - "intel.cr", - "intel.cu", - "intel.cz", - "intel.de", - "intel.dk", - "intel.dz", - "intel.ec", - "intel.ee", - "intel.eg", - "intel.es", - "intel.eu", - "intel.fi", - "intel.fr", - "intel.ga", - "intel.gd", - "intel.ge", - "intel.gl", - "intel.gm", - "intel.gr", - "intel.gs", - "intel.gt", - "intel.gy", - "intel.hk", - "intel.hn", - "intel.ht", - "intel.hu", - "intel.ie", - "intel.in", - "intel.io", - "intel.it", - "intel.je", - "intel.jo", - "intel.jp", - "intel.ke", - "intel.la", - "intel.lc", - "intel.lk", - "intel.lt", - "intel.lu", - "intel.ly", - "intel.ma", - "intel.md", - "intel.me", - "intel.mg", - "intel.mk", - "intel.mn", - "intel.mp", - "intel.mt", - "intel.mu", - "intel.mw", - "intel.mx", - "intel.my", - "intel.ng", - "intel.nl", - "intel.nu", - "intel.nz", - "intel.pa", - "intel.pe", - "intel.ph", - "intel.pl", - "intel.pn", - "intel.re", - "intel.ro", - "intel.ru", - "intel.rw", - "intel.sa", - "intel.sc", - "intel.se", - "intel.sg", - "intel.si", - "intel.sk", - "intel.sn", - "intel.sr", - "intel.st", - "intel.sv", - "intel.sx", - "intel.sy", - "intel.tf", - "intel.tj", - "intel.tl", - "intel.tm", - "intel.tn", - "intel.tt", - "intel.tv", - "intel.tw", - "intel.ua", - "intel.uk", - "intel.us", - "intel.uy", - "intel.uz", - "intel.vg", - "intel.vn", - "intel.vu", - "intel.wf", - "intel.yt", - "intelamericasstore.com", - "intelapacstore.com", - "intelatom.net", - "intelcapital.com", - "intelcapital.net", - "intelcloudbuilders.com", - "intelcloudfinder.com", - "intelemeastore.com", - "inteleventexpress.com", - "intelforchange.com", - "intelfreepress.com", - "intelgo.net", - "intelinsight.com", - "inteliotmarketplace.com", - "intelisolve.com", - "intell.com", - "intellearningseries.com", - "intellij.com", - "intellij.net", - "intellij.org", - "intellinuxgraphics.com", - "intellinuxgraphics.net", - "intellinuxwireless.net", - "intelnervana.com", - "intelplay.com", - "intelquark.com", - "intelrealsense.com", - "intelrxt.com", - "intelsalestraining.com", - "intelsecurity.com", - "intelserveredge.com", - "intelsoftwarenetwork.com", - "intelstore.com", - "inteltechnologyprovider.com", - "intelvmwarecybersecurity.com", - "interactcbt.ac.uk", - "interactive-e.ac.uk", "interactivebrokers.com", - "interactiveeducation.ac.uk", - "interactivesex.xxx", - "intercamcashpassport.com.mx", - "intercom.com", - "intercom.io", - "intercomassets.com", - "intercomcdn.com", - "international-house-london.ac.uk", - "international-union-crystallography.ac.uk", - "international.ac.uk", - "internationalcollegedundee.ac.uk", - "internationalconnectionsacademy.com", - "internationalsaimoe.com", - "internationalstaff.ac.uk", - "internationalstudies.ac.uk", "internet.org", "internetdefenseleague.org", - "internetdownloadmanager.com", - "internetexplorer.co", - "internetexplorer.com", "internetfreedom.org", - "internetofeverything.com", "internetpopculture.com", - "interracial-sites.com", - "intescort.com", - "intgram.com", - "intheknow.com.au", "inthenameofconfuciusmovie.com", - "intimateinvasions.com", - "into-newcastle.ac.uk", - "intporn.com", - "intramuscularinjection.info", - "intunewiki.com", - "intute.ac.uk", - "inventor-certified.com", - "inventorfusion.com", - "inventorseries.com", - "inventorship.com.au", - "investorschronicle.co.uk", - "invity.io", + "invidio.us", "inxian.com", - "inxporn.com", - "ioe.ac.uk", - "ioe.com", - "ioffergift.com", - "ioinformatics.org", - "iole.tv", - "ion.ac.uk", - "iooog.sbs", - "iop.org", - "ios-icloud.com", - "ios.ac.uk", - "iosinthecar.com", - "iotinactionevents.com", "iownyour.biz", "iownyour.org", - "ioz.ac.uk", - "ip.gs", - "ip.sb", - "ip73.com", - "ipa-iphone.net", - "ipad.co.kr", - "ipad.de", - "ipad.host", - "ipad.wang", - "ipad3.com", - "ipadair.cl", - "ipadair.cm", - "ipadair.com.br", - "ipadair.com.es", - "ipadair.fr", - "ipadair.hk", - "ipadair.ie", - "ipadair.jp", - "ipadair.tw", - "ipadaustralia.com", - "ipadmini.cm", - "ipadmini.com.lk", - "ipadmini.lk", - "ipadpro.buzz", "ipalter.com", - "ipcc-wg3.ac.uk", "ipdefenseforum.com", - "ipem.ac.uk", "ipfire.org", - "ipforesightforum.ac.uk", - "ipfs-gateway.cloud", "ipfs.io", - "ipfs.tech", - "ipgc.ac.uk", - "iphine.com", - "iphone-cd.com", - "iphone-cn.com", - "iphone-sh.com", - "iphone-vip1.com", - "iphone-vip2.com", - "iphone-vip3.com", - "iphone-vip4.com", - "iphone-vip5.com", - "iphone-x.tv", - "iphone-yh.com", - "iphone-zh.com", - "iphone.cm", - "iphone.com", - "iphone.com.au", - "iphone.com.gr", - "iphone.es", - "iphone.host", - "iphone.net.gr", - "iphone.pt", - "iphone.rs", - "iphone.ru", - "iphone.wang", - "iphone4.com", - "iphone4.com.br", "iphone4hongkong.com", - "iphone4s.com", - "iphone5.com", - "iphone5casescovers.com", - "iphone5s5case.com", - "iphoneacessorios.com.br", - "iphonecase2013.com", - "iphonecase5.com", - "iphonecases100.com", - "iphonecases5.com", - "iphoneclaro.com.br", - "iphonecollcase.com", - "iphonefc.com", - "iphonegermany.com", "iphonehacks.com", - "iphonehangzhou.com", - "iphoneimessage.com", - "iphoneplus.wang", - "iphonerip.net", - "iphonese.tv", "iphonetaiwan.org", - "iphoneunlockimei.com", - "iphonexs.tv", "iphonix.fr", - "iphoto.eu", - "iphoto.no", - "iphoto.se", - "iphoto.wang", - "ipi.ac.uk", "ipicture.ru", "ipjetable.net", - "ipleadership.org", - "ipns.co", "ipobar.com", - "ipod.ca", - "ipod.ch", - "ipod.cm", - "ipod.co", - "ipod.co.nz", - "ipod.co.uk", - "ipod.co.za", - "ipod.com", - "ipod.com.au", - "ipod.com.fr", - "ipod.com.hk", - "ipod.com.sg", - "ipod.com.tw", - "ipod.de", - "ipod.es", - "ipod.eu", - "ipod.fr", - "ipod.gr", - "ipod.hk", - "ipod.is", - "ipod.net", - "ipod.no", - "ipod.pk", - "ipod.rs", - "ipod.ru", - "ipod.tw", - "ipodcentre.nl", - "ipodcleaner.com", - "ipoditouch.com", - "ipodnano.com", - "ipodnano.net", - "ipodprices.com", - "ipodrip.ca", - "ipodrocks.com.au", - "ipods.com", - "ipodshop.com.au", - "ipodtouch.co", - "ipodtouch.com", "ipoock.com", - "iporntoo.com", - "iporntv.net", "iportal.me", - "ipostnaked.com", - "ipple.com", - "ippog.org", "ippotv.com", - "ippstatic.com", "ipredator.se", - "iproperty.com", - "iproperty.com.my", - "iproperty.com.sg", "iptv.com.tw", "iptvbin.com", - "ipv6.ac.uk", "ipvanish.com", "iqiyi.com", - "iqiyiavlive.buzz", - "iqq2.cc", - "iqq3.cc", - "iqqtv.net", - "iranianboobs.com", - "iranlms.ir", - "iransextv.com", - "iranx.net", - "irc-sphere.ac.uk", - "irdeto.com", - "ired.ac.uk", "iredmail.org", - "irese.ac.uk", - "iri-scotland.ac.uk", "irib.ir", - "iridiumbrowser.de", - "iris.ac.uk", - "iriss.ac.uk", - "ironna.jp", "ironpython.net", "ironsocket.com", - "irotv301.top", - "irribay.com", - "irscl.ac.uk", "is-a-hunter.com", "is.gd", "isaacmao.com", "isasecret.com", - "isbgpsafeyet.com", - "isc.ac.uk", - "isc.org", - "isca-speech.org", - "ischool.com", - "iscp.ac.uk", - "isexlove.tw", - "isfocus.net", - "isgame365.cc", "isgreat.org", - "isheppc.com", - "isic.ac.uk", - "isiknowledge.com", - "isis.ac.uk", - "iskoot.com", + "ishr.ch", "islahhaber.net", - "islam-anatolia.ac.uk", "islam.org.hk", "islamawareness.net", "islamhouse.com", - "islamic-college.ac.uk", - "islamicacademy.ac.uk", - "islamiccenterofnewlondon.com", "islamicity.com", "islamicpluralism.org", - "islamicstudiesnetwork.ac.uk", "islamtoday.net", - "isle.ac.uk", - "isli.ac.uk", - "islington-acl.ac.uk", - "ism.ac.uk", "ismaelan.com", "ismalltits.com", - "ismg.ac.uk", "ismprofessional.net", "isohunt.com", - "ispan.ac.uk", "israbox.com", - "iss138.com", - "issitedownrightnow.com", - "issquaredown.com", - "issquareup.com", "issuu.com", - "istar.ac.uk", "istars.co.nz", "istarshine.com", "istef.info", - "istent.co.kr", "istiqlalhewer.com", "istockphoto.com", - "istorytell.com", - "istripper.com", "isunaffairs.com", "isuntv.com", "isupportuyghurs.org", - "isvc.ac.uk", - "it.nf", - "ita-do.com", "itaboo.info", - "itaeromanga.com", "itaiwan.gov.tw", - "italiabeatsbydrdre.com", "italiatibet.org", "itasoftware.com", - "itcanwait.com", - "itcfonts.com", "itch.io", - "itchen.ac.uk", - "iteach.ac.uk", - "itec.ac.uk", "itemdb.com", "itemfix.com", - "itfromtheinside.com", "ithome.com.tw", - "itlearningspace-scot.ac.uk", - "itnel.com", - "itnow.ac.uk", - "itol.ac.uk", - "itools.info", - "itrace.ac.uk", - "itripto.com", "itsaol.com", - "itsbetterwhenyouwinit.com", - "itsfuck.com", "itshidden.com", "itsky.it", - "itsoc.org", - "itu.int", - "itun.es", - "itunbes.com", - "ituneas.com", - "itunes-radio.net", - "itunes.ca", - "itunes.co", - "itunes.co.th", - "itunes.com", - "itunes.hk", - "itunes.mx", - "itunes.org", - "itunes.rio", - "itunes.us", - "itunes12days.com", - "itunesessentials.com", - "itunesfestivals.com", - "itunesiradio.com", - "ituneslatino.com", - "ituneslogin.net", - "itunesmatch.com", - "itunesparty.com", - "itunesradio.com", - "itunesradio.rio", - "itunesradio.tv", - "itunesradio.tw", - "itunesstore.co", - "itunesu.com", - "itunesu.net", - "itutility.ac.uk", "itweet.net", - "iu13.net", "iu45.com", - "iucr.ac.uk", "iuhrdf.org", "iuksky.com", - "ius.io", - "iutunes.com", "ivacy.com", "iverycd.com", - "ivintageporn.com", "ivonblog.com", "ivpn.net", - "iwank.tv", - "iwantavnow.com", - "iwantgalleries.com", - "iwantmature.com", - "iwantporn.net", - "iwaponline.com", "iwara.tv", - "iwcollege.ac.uk", - "iwcommunitylearning.ac.uk", - "iwightc.ac.uk", - "iwm.ac.uk", - "iwork.com", - "iwork.se", - "iwork.wang", - "iwyn138.com", - "ixnxx.tv", "ixquick.com", "ixxx.com", - "iyalc.com", - "iyf.tv", "iyouport.com", "iyouport.org", - "iza.ne.jp", "izaobao.us", "izihost.org", "izles.net", "izlesem.org", - "izmirautodeskegitimleri.com", "j.mp", - "j2objc.org", - "jabcomix.com", - "jable.one", - "jable.org", "jable.tv", "jackjia.com", - "jade-net-home.com", - "jade.ac.uk", - "jadult.net", "jamaat.org", - "jamanetwork.com", - "jambotube.com", - "jamesbondstudies.ac.uk", "jamestown.org", "jamyangnorbu.com", "jan.ai", "jandyx.com", - "janeausten.ac.uk", - "janet-brokerage.ac.uk", - "janet.ac.uk", - "janetbrokerage.ac.uk", - "janetcollaborate.ac.uk", - "janor6.net", "janwongphoto.com", - "japan-forward.com", "japan-whores.com", - "japan18tube.com", - "japanbeast.com", - "japanese-scat.net", - "japaneseasmr.com", - "japanesebeauties.net", - "japanesebeauties.one", - "japanesegirlspictures.com", - "japaneselovelygirl.com", - "japanfist.org", - "japanknowledge.com", - "japanporn.tv", + "japanhdv.com", "japantimes.co.jp", - "japanxxxfilms.com", - "japon-girls.com", - "japteenx.com", - "japxtube.com", - "jas-mine.ac.uk", - "jasa3dmax.com", - "jasaautocad.com", - "jasmin.ac.uk", - "jasmin.com", - "jasper.ai", - "jav-angel.net", - "jav-subtitles.com", - "jav-vr.net", "jav.com", - "jav.dog", - "jav.gallery", - "jav.guru", - "jav.la", - "jav.land", - "jav.place", - "jav.si", - "jav.wine", - "jav01.cc", "jav101.com", - "jav168.cc", - "jav19.com", - "jav223.com", - "jav24.com", - "jav2be.com", "jav321.com", - "jav4you.org", "jav68.tv", "jav777.cc", - "jav789.com", - "jav889.xyz", - "jav9999.com", - "java.com", - "java.net", "javakiba.org", - "javbabe.net", - "javbangers.com", - "javbest.tv", - "javbobo.com", - "javbooks.com", - "javbraze.com", "javbus.co", "javbus.com", - "javbus22.com", - "javbuz.com", - "javcc.cc", - "javcc.com", - "javcdn.cc", - "javcl.com", - "javct.net", - "javcup.com", - "javdatabase.com", - "javday.tv", "javdb.com", - "javdisk.com", - "javdock.com", - "javdoe.to", - "javdove.com", - "javdove8.xyz", - "javextreme.net", - "javfilms.com", + "javfinder.ai", "javfor.me", - "javforme.ninja", - "javfree.la", "javfree.me", - "javfree.sh", - "javfuck.net", - "javfull.net", - "javfun.me", - "javfv.com", - "javgg.net", - "javgrown.com", - "javhard.net", - "javhard.org", - "javhaven.com", - "javhay.net", "javhd.com", - "javhd.icu", - "javhd.pro", - "javhd.today", - "javhd3x.com", - "javhdfree.net", - "javhdhello.com", - "javhdonline.com", - "javhdporn.com", - "javhdporn.net", - "javher.com", - "javheroine.com", - "javhihi.com", "javhip.com", - "javhub.me", "javhub.net", "javhuge.com", - "javidol.org", - "javjack.com", - "javjunkies.com", - "javlands.net", - "javleak.com", "javlibrary.com", - "javlibrary.tv", - "javmenu.com", - "javmix.me", - "javmix.tv", - "javmobile.mobi", "javmobile.net", - "javmodel.com", "javmoo.com", "javmoo.xyz", - "javmost.com", - "javmost.cx", - "javmost.xyz", - "javmuch.com", - "javmulu.net", - "javnew.net", - "javopen.co", - "javout.co", - "javplatform.com", - "javpop.com", - "javpop.link", - "javporn.tech", - "javporn.ws", - "javpost.net", - "javprice.com", - "javprime.net", - "javpub.me", - "javpush.com", - "javqd.com", - "javrank.com", - "javrave.club", - "javroot.com", - "javscat.net", - "javscatsex.com", - "javscatting.com", - "javscreens.com", "javseen.com", - "javseen.tv", - "javsex.asia", - "javsin.tv", - "javsky.tv", - "javspanking.com", - "javstar.club", - "javstore.net", - "javsx.com", "javtag.com", - "javtag.net", - "javtasty.com", - "javteg.net", - "javtiful.com", - "javtorrent.me", - "javtrailers.com", - "javtrust.com", - "javtube.cc", - "javtube.com", - "javtube.net", - "javvids.com", - "javwide.com", - "javwide.tv", - "javxspot.com", - "javxxx.me", - "javynow.com", "javzoo.com", "javzz.com", - "jayspov.net", - "jb.gg", - "jb22.lol", - "jbe-platform.com", "jbtalks.cc", "jbtalks.com", "jbtalks.my", - "jburl.top", - "jc11.tw", - "jca.ac.uk", - "jcc.ac.uk", - "jcmaxwell.ac.uk", "jcpenney.com", - "jcpsg.ac.uk", - "jdav-css.shop", - "jdavsp.asia", - "jdavsp.com", - "jdavsp.info", - "jdavsp.pw", - "jdavsp.top", - "jdavsp.xyz", - "jdbimgs.com", - "jdbstatic.com", - "jdforum.net", "jdwsy.com", "jeanyim.com", - "jec.ac.uk", - "jeded.com", - "jenkins.io", - "jenner.ac.uk", - "jennylist.xyz", - "jenporno.cz", - "jerk-porn.com", - "jerk24.com", - "jerkdolls.com", - "jerkdude.com", - "jerkmate.com", - "jerkmate.tv", - "jerkmatelive.org", - "jerkofftocelebs.com", - "jessicaturner.com", - "jetbrains.ai", - "jetbrains.com", - "jetbrains.net", - "jetbrains.space", - "jetbrains.team", - "jetfuelapp.com", - "jetfuelapps.com", "jetos.com", - "jevc.ac.uk", - "jewel-esk.ac.uk", "jex.com", - "jfengtime.com", "jfqu36.club", "jfqu37.xyz", - "jfrog.com", - "jfrog.org", - "jga-group.ac.uk", - "jgg18.xyz", "jgoodies.com", - "jhu.edu", - "jhxl.org", - "jhzyw.xyz", "jiangweiping.com", - "jiaochuanba25.buzz", - "jiaochuanba26.buzz", "jiaoyou8.com", - "jiayoulu.com", - "jibemobile.com", - "jic.ac.uk", "jichangtj.com", - "jieav.com", "jiehua.cz", "jiepang.com", "jieshibaobao.com", + "jifangge.com", "jigglegifs.com", "jigong1024.com", "jigsy.com", "jihadology.net", "jiji.com", - "jijiji.ca", - "jilhub.com", - "jimeng22.com", "jims.net", "jinbushe.org", "jingpin.org", "jingsim.org", "jinhai.de", "jinpianwang.com", + "jinrizhiyi.news", "jinroukong.com", "jintian.net", "jinx.com", "jiruan.net", - "jisc-collections.ac.uk", - "jisc-content.ac.uk", - "jisc-liberate-migrate1.ac.uk", - "jisc-liberate-migrate2.ac.uk", - "jisc-liberate-migrate3.ac.uk", - "jisc-liberate.ac.uk", - "jisc-mau.ac.uk", - "jisc-services.ac.uk", - "jisc-tau.ac.uk", - "jisc.ac.uk", - "jiscadvance.ac.uk", - "jisccollections.ac.uk", - "jisccontent.ac.uk", - "jiscdigitalmedia.ac.uk", - "jiscecollections.ac.uk", - "jischistoricbooks.ac.uk", - "jischistories.ac.uk", - "jiscinfonet.ac.uk", - "jiscjournalarchives.ac.uk", - "jiscmail.ac.uk", - "jiscmediahub.ac.uk", - "jiscmu.ac.uk", - "jiscpas.ac.uk", - "jiscwell.ac.uk", "jitouch.com", - "jitsi.org", - "jiuse.ai", - "jiuse.com.co", - "jiuse.icu", - "jiuse.io", - "jiuse6666.com", - "jiuse821.com", - "jiuse822.com", - "jiuse823.com", - "jiyou520.com", - "jiyu-kobo.co.jp", - "jizzboom.com", - "jizzbunker.com", - "jizzhut.com", - "jizzle.com", - "jizzonline.com", "jizzthis.com", "jjgirls.com", - "jjsuo.sbs", "jkb.cc", - "jkbeats.com", - "jkf.net", - "jkface.net", "jkforum.net", "jkub.com", - "jkycjk.mom", - "jkzvz.shop", - "jkzw.shop", - "jlb0011.site", - "jm98.cc", "jma.go.jp", - "jmc.ac.uk", - "jmcomic.ltd", "jmcomic.me", - "jmcomic.mobi", - "jmcomic.moe", - "jmcomic1.city", - "jmcomic1.me", - "jmcomic1.mobi", - "jmcomic2.moe", - "jmlr.org", "jmscult.com", - "jmu.ac.uk", - "jmvbt.com", - "jneurosci.org", - "jnt.ac.uk", "joachims.org", - "joanabliss.com", - "jobmarket.com.hk", - "jobs.ac.uk", "jobso.tv", - "jodic-forum.org", - "joeswall.com", - "johnpersons.com", - "johnruskin.ac.uk", - "johren.games", - "johren.net", - "joiasmr.com", "joinbbs.net", "joinclubhouse.com", - "joinmaidez.com", "joinmastodon.org", "joinpeertube.org", "joins.com", - "joinside.org", - "joinup.ac.uk", - "jokerlu-go.buzz", - "jokerlu.asia", - "jokerlu.world", - "jokerlu1.cc", - "jokerlu1.info", - "jolt.ac.uk", - "joox.com", "jornaldacidadeonline.com.br", - "jorropo.net", - "jorum.ac.uk", - "jos.com", - "joseph-chamberlain.ac.uk", - "joseph-priestley.ac.uk", - "joseph-priestly.ac.uk", - "josephwright6form.ac.uk", "jotform.com", - "journalarchives.ac.uk", "journalchretien.net", "journalofdemocracy.org", - "journaltocs.ac.uk", - "jove.com", - "joyclub.de", - "joyjoy.net", - "joylovedolls.com", "joymiihub.com", "joyourself.com", - "joysporn.com", "jp1lib.org", - "jpav.us", - "jpavcom.com", - "jpbabe.com", - "jpboy1069.net", - "jpg4.biz", - "jpg4.pw", - "jpg4us.net", "jpopforum.net", - "jpvhub.com", "jquery.com", - "jquerymobile.com", "jqueryui.com", - "jr24h.com", "jrf.org.tw", - "jrs.ac.uk", - "js.org", - "js7k.com", - "jsati.com", - "jsatmobile.com", - "jsbridgestone.com", - "jsdelivr.com", "jsdelivr.net", "jsfiddle.net", "jshell.net", - "jsmc.ac.uk", - "jst.go.jp", - "jstor.ac.uk", - "jstor.org", - "jstv51.com", - "jstv52.com", - "jstv53.com", - "jsz91.com", - "jtap.ac.uk", - "jtltraining.ac.uk", - "jtt.ir", - "jtube.space", "jtvnw.net", - "jubileecentre.ac.uk", "jubushoushen.com", - "juc.ac.uk", - "judeporn.com", - "juggsjoy.com", + "judicial.gov.tw", "juhuaren.com", - "juiceced.xyz", - "juicytwink.com", "jukujo-club.com", - "julesjordan.com", - "juliamiles.com", - "juliamovies.com", "juliepost.com", "juliereyc.com", "junauza.com", @@ -15338,2328 +3314,478 @@ var rules = [ "junefourth-20.net", "jungleheart.com", "junglobal.net", - "juno.ac.uk", "juoaa.com", - "jupyter.org", - "just.xxx", - "justav.net", "justdied.com", - "justdoit.us", - "justduckit.com", - "justfamilyporn.com", "justfreevpn.com", - "justfullporn.org", - "justhd.xyz", "justhost.ru", "justicefortenzin.org", - "justincraig.ac.uk", - "justindianporn.me", - "justlesbianpussy.com", "justmysocks.net", "justmysocks1.net", - "justmysocks2.net", - "justmysocks4.net", - "justnudepic.com", + "justmysockscn.com", "justpaste.it", - "justpicsplease.com", - "justporn.com", - "justporn.link", - "justporno.es", - "justporno.sex", - "justporno.tv", - "justswallows.com", "justtristan.com", - "justusboys.com", - "juyangbee.xyz", - "juyangto.info", "juyuange.org", - "juzi-js.shop", - "juzige.xyz", "juziyue.com", - "jvid.com", "jw.org", - "jwfl.ac.uk", - "jwheatley.ac.uk", - "jwide.co.kr", "jwmusic.org", - "jwpcdn.com", - "jwplatform.com", "jwplayer.com", - "jwpltx.com", - "jwpsrv.com", - "jwt.ms", "jyxf.net", - "jzydh.com", "k-doujin.net", - "k8s.io", - "k9vidz.com", "ka-wai.com", - "kaamuu.com", "kadokawa.co.jp", - "kaes.ac.uk", - "kaggle.com", - "kaggle.io", - "kaggle.net", - "kaggleusercontent.com", - "kagi.com", "kagyu.org", "kagyu.org.za", "kagyumonlam.org", "kagyunews.com.hk", "kagyuoffice.org", "kagyuoffice.org.tw", - "kairakudoujin.net", "kaiyuan.de", - "kakao.co.kr", "kakao.com", - "kakao.vc", - "kakaobank.com", - "kakaobank.io", - "kakaobankcontent.com", - "kakaobrain.com", - "kakaocdn.net", - "kakaocloud.com", - "kakaocorp.com", - "kakaoent.com", - "kakaoenterprise.com", - "kakaogamescorp.com", - "kakaohealthcare.com", - "kakaoilaas.com", - "kakaoinvestment.com", - "kakaomobility.com", - "kakaopay.com", - "kakaopaysec.com", - "kakaopiccoma.com", - "kakaostyle.com", - "kakaotalk.jp", - "kakaovx.com", - "kaktuz.com", "kalachakralugano.org", - "kali.org", - "kama-nk.ru", - "kamababa.com", - "kamisama-day.jp", - "kamisama-maeda-lab.com", - "kampalaexclusiveescorts.com", - "kanav.info", + "kanald.com.tr", "kangye.org", "kankan.today", "kannewyork.com", - "kanporno.com", "kanshifang.com", "kantie.org", "kanzhongguo.com", "kanzhongguo.eu", - "kaob3.xyz", "kaotic.com", "karayou.com", - "karechat.ai", - "karger.com", - "karinahart.com", "karkhung.com", - "karlajames.com", "karmapa-teachings.org", "karmapa.org", - "karupsha.com", - "karupspc.com", - "kastatic.org", - "katestube.com", - "kavkazr.com", "kawaiikawaii.jp", "kawase.com", - "kayako.com", - "kaydara.com", "kba-tx.org", - "kbplus.ac.uk", - "kbzbank.com", - "kbzpay.com", - "kc3000.shop", - "kcb.ac.uk", - "kcc.ac.uk", - "kcl.ac.uk", - "kclwave.ac.uk", - "kcollege.ac.uk", "kcoolonline.com", - "kcqsw-na.sbs", - "kdfuli.com", - "kdy202312.shop", - "ke-westyorkshire.ac.uk", - "keaiav.com", "kebrum.com", - "kec-stourbridge.ac.uk", "kechara.com", - "kechtube.com", - "kecnuneaton.ac.uk", - "kedst.ac.uk", - "keele.ac.uk", "keepandshare.com", - "keepmovingwithmovefree.com", - "keepyourcad.com", "keezmovies.com", - "keiba.net", - "keighleycollege.ac.uk", - "kemomi.me", "kemono.party", - "kemono.su", - "kendal.ac.uk", - "kendalcollege.ac.uk", "kendatire.com", "kendincos.net", - "kendralist.com", "kenengba.com", - "kennedy.ac.uk", - "kensingtoncoll.ac.uk", - "kent.ac.uk", - "kentadulteducation.ac.uk", - "kentcls.ac.uk", - "kentman.ac.uk", - "kenxxx.com", - "kenya4.com", - "kenyanporn.blogspot.com", - "kenyaraha.net", "keontech.net", "kepard.com", - "kernel.org", "keso.cn", - "kess2.ac.uk", - "kew.ac.uk", "kex.com", - "keybase.io", - "keybaseapi.com", "keycdn.com", - "keyhole.com", - "keyporntube.com", - "keyseducation.ac.uk", - "keyskillbuilder.ac.uk", - "keytransparency.com", - "keytransparency.foo", - "keytransparency.org", "kfd.me", - "kfs.io", - "kgslb.com", - "kgv.ac.uk", "khabdha.org", - "khanacademy.org", "khatrimaza.org", - "khayannpyar.blogspot.com", "khmusic.com.tw", - "khotruyentranhx.com", - "kiad.ac.uk", "kichiku-doujinko.com", - "kichikuou.com", - "kickporn.com", - "kickshatchannel.com", - "kicksnike1.com", - "kicu.tv", - "kiddercoll.ac.uk", - "kidderminster.ac.uk", - "kidgrid.tv", - "kidsfirst.ac.uk", - "kidsnikeshoes.com", - "kidspot.com.au", - "kiji.ca", - "kijii.ca", - "kijij.ca", - "kijiji.ca", - "kijijiauto.ca", - "kijijiautos.ca", - "kijijiforbusiness.ca", - "kijijii.ca", - "kijijiraps.ca", - "kijji.ca", - "kijjiji.ca", "kik.com", - "kikdirty.com", "killwall.com", - "kilmarnock.ac.uk", - "kilmeadeandfriends.com", - "kimchi.tv", - "kimogirl.cc", - "kimosex.com", "kimy.com.tw", - "kindgirls.com", - "kindindianporn.com", - "kindle.co.jp", - "kindle.co.uk", - "kindle.com", - "kindle.de", - "kindle.es", - "kindle.fr", - "kindle.in", - "kindle.it", - "kindle.jp", "kindle4rss.com", - "kindleoasis.com", - "kindleoasis.info", - "kindleoasis.jp", - "kindleoasis.org", - "kindleoasis.us", - "kindleoasisnews.com", - "kindleproject.com", "kindleren.com", - "kindnudist.com", - "kinds.ac.uk", - "kindteenporn.com", - "king.ac.uk", - "kingalfreds.ac.uk", - "kingalfredsbasingstoke.ac.uk", - "kingcomix.com", "kingdomsalvation.org", - "kinged6nun.ac.uk", - "kingextre.me", - "kingf-av.buzz", - "kingf-av.lol", - "kingf-av.mom", - "kingf-av.sbs", - "kingf-tv.buzz", - "kingfav.sbs", "kinghost.com", "kingkong.com.tw", - "kingkongapp.com", - "kingofpics.com", - "kings.ac.uk", - "kingshillinstitute.ac.uk", - "kingshurst.ac.uk", - "kingslondon.ac.uk", - "kingstagram.com", - "kingston-college.ac.uk", - "kingston.ac.uk", - "kingstonalumni.ac.uk", "kingstone.com.tw", - "kingsway.ac.uk", - "kinguno.xyz", "kink.com", - "kinkbook.com", - "kinklive.com", - "kinkoid.com", - "kinkyfamily.com", - "kinkypeepz.com", "kinmen.org.tw", "kinmen.travel", "kinokuniya.com", "kir.jp", - "kir2kos.net", - "kirbysepicyarn.com", - "kirbysuperstarultra.com", - "kirkleescollege.ac.uk", - "kirkley.ac.uk", - "kisharon.ac.uk", - "kismia.com", "kissbbao.cn", - "kisscos.net", "kissjav.com", - "kissjav.li", - "kitazawa.me", - "kitts.ac.uk", "kiwi.kz", - "kiwibrowser.com", "kk-whys.co.jp", - "kk.stream", "kkbox.com", - "kkbox.com.tw", - "kkddsex7.com", - "kkfcc03.com", - "kkiah.com", "kknews.cc", - "kktix.com", - "kktv.com.tw", - "kktv.me", - "kl.ac.uk", - "klik.me", "klip.me", - "kmc.ac.uk", - "kmdhyy.com", - "kmeleonbrowser.org", - "kmff17.com", - "kmms.ac.uk", "kmuh.org.tw", - "knightlearning.ac.uk", - "knovel.com", - "knowledge-house.ac.uk", - "knowledgehouse.ac.uk", "knowledgerush.com", - "knowsleycc.ac.uk", - "knowsleycollege.ac.uk", - "knowswho.co.jp", "knowyourmeme.com", - "knoxemm.com", - "knti.ac.uk", "ko-fi.com", - "koalaporn.com", - "kobbeatssbydredk.com", - "kobe-pastel.com", "kobo.com", "kobobooks.com", - "kochudaho.me", - "kodi.tv", - "kodi.wiki", "kodingen.com", - "kompoz.com", - "kompoz2.com", "kompozer.net", "konachan.com", - "konachan.net", "kone.com", "koolsolutions.com", "koornk.com", - "kopfhorergunstigshop.com", "koranmandarin.com", "korea.net", - "koreanpornmovie.com", "korenan2.com", - "korewaeroi.com", - "kostenlosepornoclips.com", - "kotlinlang.org", - "koubaibu.jp", - "kouwobb.com", - "kphimsex.net", - "kpht85.com", - "kpinsurances.com", - "kpptoto.info", + "kpkuang.org", "kqes.net", "kraken.com", - "krakenjs.com", - "krhentai.com", - "kristenbjorn.com", - "krosspictures.com", "krtco.com.tw", - "krux.com", - "krymr.com", - "ksc.ac.uk", - "kscisco.com", - "ksd235qw.com", "ksdl.org", - "ksep.ac.uk", - "ksescortclub.com", "ksnews.com.tw", "kspcoin.com", - "kssacademy.ac.uk", - "kssdeanery.ac.uk", - "ksyp10.com", - "ktvu.com", "ktzhk.com", - "ku77.xyz", - "kuaimao-app.com", - "kuaipa.net", - "kuanrenxs.com", - "kubakuba.global", - "kubakuba1996.com", - "kubeacademy.com", - "kubeapps.com", - "kubernetes.io", + "kuaichedao.co", "kucoin.com", - "kucoin.plus", "kui.name", - "kuke.com", "kukuku.uk", - "kum.com", - "kumo.com", "kun.im", - "kun66.xyz", - "kundun1069.com", "kurashsultan.com", "kurtmunger.com", "kusocity.com", - "kusugurizanmai.com", - "kutjeporno.com", "kwcg.ca", "kwok7.com", "kwongwah.com.my", "kxsw.life", - "kynogon.com", - "kyodo-d.info", - "kyodo-d.jp", - "kyodoimages.jp", - "kyodonews.jp", - "kyodonews.net", "kyofun.com", "kyohk.net", "kyoyue.com", - "kyurem.com", "kyzyhello.com", + "kzaobao.com", "kzeng.info", - "l-msedge.net", "la-forum.org", - "la-mama.ru", - "laban.ac.uk", "labiennale.org", - "labinacell.ac.uk", - "lackcoll.ac.uk", - "lackham.ac.uk", - "lacomics.org", "ladbrokes.com", - "ladies.com", - "ladsp.com", - "ladybaba.net", - "ladyboygold.com", - "ladyboygold.eu", - "ladyboypornonly.com", - "lae.ac.uk", - "laetottenham.ac.uk", "lagranepoca.com", - "lahp.ac.uk", - "laia.ac.uk", - "lain.la", - "lakescollege.ac.uk", - "lakescollegewestcumbria.ac.uk", - "lal.ac.uk", "lala.im", "lalulalu.com", "lama.com.tw", "lamayeshe.com", - "lambeth.ac.uk", - "lambethacl.ac.uk", - "lambethcollege.ac.uk", - "lamda.ac.uk", "lamenhu.com", "lamnia.co.uk", - "lamp.ac.uk", - "lampeter.ac.uk", "lamrim.com", - "lanarkshirefederation.ac.uk", - "lanasbigboobs.com", - "lancashire.ac.uk", - "lancashirecompact.ac.uk", - "lancashireinstituteoftechnology.ac.uk", - "lancashirelawacademy.ac.uk", - "lancashirelawschool.ac.uk", - "lancaster.ac.uk", - "lancasterbeijingjiaotong.ac.uk", - "lancs-cumbrianti.ac.uk", - "lancs-initiative.ac.uk", - "lancs.ac.uk", - "lancsngfl.ac.uk", - "landmap.ac.uk", - "landmarks.ac.uk", "landofhope.tv", - "landscape.ac.uk", - "langdoncollege.ac.uk", - "langpol.ac.uk", - "langside.ac.uk", - "langsuirs.com", - "languagebox.ac.uk", - "languagesmythsfinds.ac.uk", - "languagesresearch.ac.uk", - "languagessoutheast.ac.uk", - "lanik.us", - "lanmdh.net", - "lanniser-ylo.shop", - "lantern.io", - "lanternal.com", "lanterncn.cn", "lantosfoundation.org", "laod.cn", "laogai.org", "laogairesearch.org", "laomiu.com", - "laosijifuli9009.top", "laowang.vip", "laoyang.info", - "lapriere.jp", - "laps.ac.uk", "laptoplockdown.com", "laqingdan.net", - "laracasts.com", - "largecamtube.com", - "largeporntube.com", "larsgeorge.com", - "lasersawapp.com", - "last.fm", "lastcombat.com", "lastfm.es", - "lastfm.freetls.fastly.net", - "lasvegasbmw.com", - "latampartneruniversity.com", - "latamvmwareforum.com", "latelinenews.com", - "latencytop.com", - "latex-project.org", "latibet.org", - "latinaabuse.com", - "latintubeporn.com", - "latticedata.com", - "launchpad.net", - "launchpad.wang", - "launchpadcontent.net", - "launchpadlibrarian.com", - "launchpadlibrarian.net", - "launchpadlibrarian.org", "lausan.hk", - "lavteam.org", - "law.ac.uk", "law.com", - "lawcabs.ac.uk", - "lawdata.com.tw", - "lawteacher.ac.uk", - "laxd.com", - "lazymike.com", "lbank.info", - "lbc-northwood.ac.uk", - "lbc.ac.uk", - "lbfmaddiction.com", - "lbkrs.com", - "lboro.ac.uk", - "lborolondon.ac.uk", - "lbpresearch.ac.uk", - "lbs.ac.uk", - "lbtube.com", - "lbu.ac.uk", - "lcad.ac.uk", - "lcb.ac.uk", - "lcbs.ac.uk", - "lcbt.ac.uk", - "lcds.ac.uk", - "lcf.ac.uk", - "lcfi.ac.uk", - "lcgirls.com", - "lcgroup.ac.uk", - "lciot.ac.uk", - "lcirah.ac.uk", - "lcit.ac.uk", - "lcm.ac.uk", - "lcriconvergence.ac.uk", - "lcsmerch.com", - "lcssp.ac.uk", - "lct.ac.uk", - "lcuck.ac.uk", - "lcwc.ac.uk", - "ldoc-cdt.ac.uk", - "le-direct.tv", "le-vpn.com", - "le.ac.uk", - "leadershipfoundation.ac.uk", - "leadershiphe.ac.uk", "leafyvpn.net", - "leaguehighschool.com", - "leagueoflegends.ca", - "leagueoflegends.co.kr", - "leagueoflegends.com", - "leagueoflegends.info", - "leagueoflegends.kr", - "leagueoflegends.net", - "leagueoflegends.org", - "leagueoflegendsscripts.com", - "leaguesharp.info", - "leaguoflegends.com", - "leakedmeat.com", - "leakedzone.com", - "leaksmodels.com", - "leakxxx.com", - "leanhe.ac.uk", - "leanhehub.ac.uk", - "leannecrowvideos.com", - "leap.ac.uk", - "leapahead.ac.uk", - "learna.ac.uk", - "learnbaes.ac.uk", - "learndirect.ac.uk", - "learnedsocietywales.ac.uk", - "learnharrow.ac.uk", - "learnhigher.ac.uk", - "learningbites.ac.uk", - "learninglink.ac.uk", - "learningmathsonline.ac.uk", - "learningonscreen.ac.uk", - "learningstaffordshire.ac.uk", - "learningtogether.ac.uk", - "learningzone.ac.uk", - "learninscotland.ac.uk", - "learninworcestershire.ac.uk", - "learnit-northampton.ac.uk", - "learnnorthants.ac.uk", - "learnportsmouth.ac.uk", - "learnsafl.ac.uk", - "learntelford.ac.uk", - "learntogive.ac.uk", - "learnwithleague.com", - "leavinghpinc.com", - "lec.ac.uk", - "lecb.ac.uk", "lecloud.net", - "lecoin.cc", - "ledas.ac.uk", - "lede-project.org", - "leder.ac.uk", "ledger.com", "leeao.com.cn", - "leecountytimes.com", - "leeds-art.ac.uk", - "leeds-ecampus.ac.uk", - "leeds-lcot.ac.uk", - "leeds-met.ac.uk", - "leeds-metropolitan.ac.uk", - "leeds.ac.uk", - "leedsadultlearning.ac.uk", - "leedsbeckett.ac.uk", - "leedsbeckettuniversity.ac.uk", - "leedscitycollege.ac.uk", - "leedscollege.ac.uk", - "leedsd.ac.uk", - "leedsmet.ac.uk", - "leedsmetcarnegie.ac.uk", - "leedsmetropolitan.ac.uk", - "leedssixthform.ac.uk", - "leedsthomasdanby.ac.uk", - "leedstrinity.ac.uk", - "leek.ac.uk", "lefora.com", "left21.hk", - "legacy.ac.uk", "legalporno.com", - "legalscholars.ac.uk", - "legaltracker.com", - "leggott.ac.uk", - "legsex.com", + "legra.ph", "legsjapan.com", - "leicester-poly.ac.uk", - "leicester.ac.uk", - "leicestercollege.ac.uk", - "leicesterlearns.ac.uk", - "leicestermuseums.ac.uk", - "leicp.ac.uk", - "leics-als.ac.uk", - "leighcollege.ac.uk", "leirentv.ca", - "leis.ac.uk", "leisurecafe.ca", "leisurepro.com", - "leliao1.com", "lematin.ch", - "lemoncams.com", "lemonde.fr", - "lencr.org", - "lenkino.xxx", - "lenporno.red", "lenwhite.com", "leorockwell.com", - "leos-scot.ac.uk", - "leporno.org", - "lepornochaud.com", - "lepornofrais.com", "lerosua.org", "lers.google", - "lersnet.ac.uk", - "lesbian8.com", - "lesbianpics.org", - "lesbianpornvideos.com", - "lesbiansubmission.com", - "lesboerotica.net", - "lesoco.ac.uk", "lesoir.be", "lester850.info", - "letbsharedservice.ac.uk", - "letfap.com", - "lethalhardcore.com", - "lethalhardcorevr.com", - "letmejerk.com", - "letmejerk.fun", "letou.com", "letscorp.net", - "letsdoeit.com", - "letsencrypt.com", "letsencrypt.org", - "letsfuckme.net", - "letsjerk.cc", - "lettherebeporn.com", - "lettol.ac.uk", - "levelsex.com", - "leverhulme.ac.uk", "levyhsu.com", - "lewcol.ac.uk", - "lewdthots.com", - "lewdvrgames.com", - "lewdweb.net", - "lewestraining.ac.uk", - "lewisham.ac.uk", - "lewishamsouthwarkcollege.ac.uk", - "lexisnexis.com", - "lexuemei.com", - "leyton.ac.uk", - "lezpoo.com", - "lfa.ac.uk", - "lfai.foundation", - "lfhe.ac.uk", "lflink.com", "lflinkup.com", "lflinkup.net", "lflinkup.org", "lfpcontent.com", - "lg.com", - "lgappstv.com", - "lgbtnonhe.ac.uk", - "lgbtq.games", - "lge.co.kr", - "lge.com", - "lgecareers.com", - "lghvac.com", - "lghvacstory.com", - "lgrecyclingprogram.com", - "lgsalesportal.com", - "lgu.ac.uk", "lhakar.org", "lhasocialwork.org", - "lhc.ac.uk", - "lhcb.ac.uk", - "lhec.ac.uk", "li.taipei", "liangyou.net", "liangzhichuanmei.com", - "lianhonghong.com", - "lianjiajr.net", "lianyue.net", "liaowangxizang.net", "liberal.org.hk", - "liberapay.com", - "liberapay.org", "libertysculpturepark.com", "libertytimes.com.tw", - "libf.ac.uk", - "libgen.fun", - "libgen.is", - "libgen.life", - "libgen.me", - "libgen.rs", - "libgen.st", - "liboggirls.net", - "library.lol", "libraryinformationtechnology.com", - "librarylovefest.com", - "libraryofthumbs.com", "libredd.it", - "librewolf.net", - "libsolutions.app", - "libsolutions.domains", - "libsolutions.net", - "licdn.com", - "licensebuttons.net", - "licenseparser.com", - "lichfield.ac.uk", - "lidc.ac.uk", "lidecheng.com", - "lido-dtp.ac.uk", - "life-global.org", - "life.ac.uk", - "lifearc.ac.uk", - "lifeatkings.ac.uk", - "lifelab.ac.uk", - "lifelonglearning.ac.uk", "lifemiles.com", - "lifeselector.com", - "lifesign.ac.uk", - "lifestudy.ac.uk", - "lifewire.com", - "liftapp.ac.uk", - "lightbridge.com", "lighten.org.tw", - "lighthouselearningtrust.ac.uk", "lighti.me", "lightnovel.cn", - "lightxxxtube.com", "lightyearvpn.com", "lih.kg", - "lihe.ac.uk", "lihkg.com", - "lihksnap.com", "like.com", - "likeseiyu.com", - "liketruyen.net", - "liketwice.com", - "likuoo.video", "lilaoshibushinilaoshi.com", - "lilhumpers.com", - "liliav.com", - "lilith-soft.com", - "limavady.ac.uk", - "lime.ac.uk", - "limedia.tw", - "limelight.com", - "limer.tw", - "limertw.cc", - "limeteensex.com", + "limelight.moe", "limiao.net", - "lims.ac.uk", - "lin.ee", - "lincoln.ac.uk", - "lincolncollege.ac.uk", - "lincolninstitute.ac.uk", - "lincolninstituteoftechnology.ac.uk", - "lincolnmedicalschool.ac.uk", - "lincolnshireinstituteoftechnology.ac.uk", - "lincsiot.ac.uk", - "lincsit.ac.uk", - "lindylist.org", - "line-apps-beta.com", - "line-apps-rc.com", "line-apps.com", - "line-beta.me", - "line-cdn.net", "line-scdn.net", - "line.biz", "line.me", - "linearcollider.org", - "linecorp.com", - "linefriends.com", - "linefriends.com.tw", - "linegame.jp", - "linemobile.com", - "linemyshop.com", - "lineshoppingseller.com", - "linetv.tw", - "lingeriepornonly.com", "linglingfa.com", "lingualeo.com", - "linguee.com", - "linguistics.ac.uk", "lingvodics.com", "link-o-rama.com", - "link.com", - "link19college.ac.uk", - "link2galleries.com", - "link2learn-ni.ac.uk", - "link69.com", - "linkage.ac.uk", - "linkagecollege.ac.uk", - "linkedin.at", "linkedin.com", "linkideo.com", - "linkinglondon.ac.uk", - "linkjunkies.com", "linksalpha.com", - "linkshit.com", - "linksintolanguages.ac.uk", "linktr.ee", "linkuswell.com", - "linotype.com", "linpie.com", - "linseysworld.com", - "linst.ac.uk", - "linux.org", "linux.org.hk", - "linuxfoundation.org", - "linuxfromscratch.org", - "linuxmint.com", "linuxtoy.org", - "lionhearts.co.kr", "lionsroar.com", - "lipa.ac.uk", - "liparm.ac.uk", - "lipidomics.ac.uk", - "lipsit.ac.uk", "lipuman.com", "liquiditytp.com", - "liquidtelecom.net", "liquidvpn.com", - "liscol.ac.uk", - "lisiku.com", - "lisiku1.com", - "liss-dtp.ac.uk", "list-manage.com", - "listar.ac.uk", - "listen-up.ac.uk", "listennotes.com", "listentoyoutube.com", - "listerpostgraduate.ac.uk", - "listinganalytics.net", "listorious.com", - "litbus-anime.com", - "literatumonline.com", - "literotica.com", + "litenews.hk", "lithium.com", - "litt.ac.uk", - "littleasians.com", - "littlehampton.ac.uk", - "littlesexdolls.com", - "litv.tv", "liu-xiaobo.org", "liudejun.com", "liuhanyu.com", - "liuhefabu.club", "liujianshu.com", "liuxiaobo.net", "liuxiaotong.com", - "liv-coll.ac.uk", - "liv-e.ac.uk", - "liv.ac.uk", - "live-patreon-marketing.pantheonsite.io", - "live-video.net", - "live.ac.uk", "live.com", - "live.com.au", - "live.eu", - "live.net", - "liveauction.com", - "livecamclips.com", "livecoin.net", - "livedoor.biz", - "livedoor.blog", "livedoor.jp", - "livefilestore.com", - "livehdcams.com", - "livejasmin.com", - "livejasminbabes.net", - "livekit.cloud", "liveleak.com", "livemint.com", - "livemodels.co", - "livenet.ac.uk", - "livephotos.tv", - "liveporngirls.com", - "liveprivates.com", - "liverail.com", - "liverail.tv", - "liverpool.ac.uk", - "liverpoolsas.ac.uk", - "livesandletters.ac.uk", - "livesex.com", - "livesexasian.com", - "livesketchshare.com", "livestation.com", "livestream.com", "livevideo.com", - "livewell.ac.uk", - "livexxx.me", - "livhope.ac.uk", - "livingdigital.ac.uk", - "livinglab.ac.uk", - "livinglaboratory.ac.uk", - "livinglegacies1914-18.ac.uk", "livingonline.us", "livingstream.com", - "livingwithmachines.ac.uk", - "livingyourambition.com", - "livjm.ac.uk", - "livrariart.com.br", "liwangyang.com", - "lizardporn.com", "lizhizhuangbi.com", - "lizol.co.in", - "ljmu.ac.uk", "lkcn.net", - "lkl.ac.uk", - "ll82y2ifdd.top", - "llakes.ac.uk", - "llambed.ac.uk", - "llandrillo.ac.uk", - "llas.ac.uk", - "llbd10.shop", - "llcaoxm-avi.sbs", - "lldns.net", - "lliusno.com", - "llnw-trials.com", - "llnw.com", - "llnw.net", - "llnwd.net", - "llnwi.net", "llss.me", - "llwht88.xyz", - "llysfasi.ac.uk", - "lma.ac.uk", - "lmbru.ac.uk", - "lmc.ac.uk", - "lmd.ac.uk", - "lmi4he.ac.uk", - "lmm167.shop", - "lmmbtc.com", - "lms.ac.uk", "lmsys.org", - "lmu.ac.uk", - "lnat.ac.uk", "lncn.org", - "lnkd.in", - "lnstagram-help.com", "load.to", - "loanbuilder.com", "lobsangwangyal.com", - "lobstertube.com", "localbitcoins.com", - "localbitcoinschain.com", "localdomain.ws", - "localizecdn.com", - "localizejs.com", - "localizestatus.com", "localpresshk.com", - "localxlist.org", - "locate.ac.uk", "lockestek.com", - "lockssalliance.ac.uk", "logbot.net", - "logi.com", - "logic.ac.uk", - "logicool.co.jp", - "logicoolg.com", - "login-account.net", - "login-paypal.com", - "login-paypal.info", "logiqx.com", - "logitech.biz", - "logitech.com", - "logitech.com.cn", - "logitech.fr", - "logitech.io", - "logitechg.com", - "logitechg.com.cn", - "logitechg.fr", - "logitechio.com.cn", "logmein.com", "logos.com.hk", - "logosfilm.co.kr", - "loholidayhk.com", - "lojaiphone.com.br", - "lokinet.org", - "lol-europe.com", - "lolclub.org", - "lolespor.com", - "lolesports.com", - "lolfanart.net", - "lolhentai.net", - "loli.net", - "lolibus.cc", - "lolibus.top", - "lolislove.info", - "lolita.bet", - "lollipopescorts.com", - "lolo.ac.uk", - "lolpcs.com", - "lolshop.co.kr", - "lolstatic.com", - "lolusercontent.com", - "lon.ac.uk", - "london-college.ac.uk", - "london-fashion.ac.uk", - "london-guildhall.ac.uk", - "london-pgmde.ac.uk", - "london.ac.uk", - "londonbiblecollege.ac.uk", - "londonbusinessschool.ac.uk", - "londoncbs.ac.uk", - "londoncentre-hstm.ac.uk", "londonchinese.ca", - "londonchurchillcollege.ac.uk", - "londondeanery.ac.uk", - "londoneastcove.ac.uk", - "londonexternal.ac.uk", - "londonfilmacademy.ac.uk", - "londonhigher.ac.uk", - "londonhotescort.com", - "londoninternational.ac.uk", - "londonknowledgelab.ac.uk", - "londonlinks.ac.uk", - "londonmedicine.ac.uk", - "londonmet.ac.uk", - "londonmetro.ac.uk", - "londonmetropolitan.ac.uk", - "londonmetropolitanuniversity.ac.uk", - "londonmetuniversity.ac.uk", - "londonmithraeum.com", - "londonp4p.ac.uk", - "londonreach.ac.uk", - "londonreal.tv", - "londonschooloftheology.ac.uk", - "londonscreenacademy.ac.uk", - "londonstudiocenter.ac.uk", - "londonstudiocentre.ac.uk", - "lonestarnaughtygirls.com", - "longbridge.cloud", - "longbridge.global", - "longbridge.hk", - "longbridge.sg", - "longbridgeapp.com", - "longeaton.ac.uk", "longhair.hk", - "longley-park.ac.uk", - "longley-parksfc.ac.uk", - "longleypark.ac.uk", - "longleyparkcollege.ac.uk", - "longleyparksfc.ac.uk", - "longleyparksixthformcollege.ac.uk", - "longman.ch", "longmusic.com", - "longportapp.com", - "longroad.ac.uk", - "longtailvideo.com", "longtermly.net", "longtoes.com", - "lonklab.ac.uk", - "lonmet.ac.uk", - "lonmetro.ac.uk", - "lonmt.ac.uk", - "lookinside.com", "lookpic.com", "looktoronto.com", "loongese.com", - "looporn.com", - "looti.net", - "lordofultima.com", - "loreto.ac.uk", - "lostbetsgames.com", - "lotcrap.com", - "lothiancolleges.ac.uk", + "lorenzetti.com.br", "lotsawahouse.org", "lotuslight.org.hk", "lotuslight.org.tw", - "lou.ac.uk", - "loucoll.ac.uk", - "loughborough.ac.uk", "loukky.com", - "love-sextoys.co.uk", - "love4porn.com", - "love6.tv", - "love7.xyz", - "loveamateurfacials.com", - "loveavdh15.cc", - "loveavdh21.cc", - "loveavvip.com", - "lovebeatsdr.com", "loved.hk", - "lovedolltorso.com", - "lovegirls.cam", - "lovehomeporn.com", - "lovejav.net", - "loveloveskill.com", - "lovemarca.com", - "loveminiso.com.br", - "loveparents.org", - "lovepartners.life", - "loverslab.com", - "lovesexbody.com", - "lovesexdurex.com", - "lovethiscity.com", "lovetvshow.com", - "lovex.life", - "lowergiseries.com", - "lowestoft.ac.uk", - "lowestoftsfc.ac.uk", - "lowestoftsixthformcollege.ac.uk", - "lowiro.com", - "lp99.pw", - "lpc.ac.uk", - "lpmde.ac.uk", "lpsg.com", - "lqpjw.cyou", - "lrfdsoftware.com", "lrfz.com", "lrip.org", - "lrysgee.xyz", - "ls-uc.ac.uk", - "lsa.ac.uk", - "lsawards.com", - "lsbm.ac.uk", - "lsbu.ac.uk", - "lscollege.ac.uk", - "lscs.ac.uk", "lsd.org.hk", - "lse-departments.ac.uk", - "lse-events.ac.uk", - "lse-global.ac.uk", - "lse-marketing.ac.uk", - "lse-nursery.ac.uk", - "lse-research.ac.uk", - "lse-residences.ac.uk", - "lse-sport.ac.uk", - "lse-students.ac.uk", - "lse.ac.uk", - "lseapplicants.ac.uk", - "lsec.ac.uk", - "lsecollaborators.ac.uk", - "lsejournals.ac.uk", - "lsestaff.ac.uk", - "lsfc.ac.uk", "lsforum.net", - "lsgnt-cdt.ac.uk", - "lshtm.ac.uk", - "lsj2.shop", - "lsj40.xyz", - "lsjfuli308.xyz", - "lsjs.ac.uk", "lsm.org", "lsmchinese.org", - "lsme.ac.uk", "lsmkorean.org", "lsmradio.com", "lsmwebcast.com", - "lso.ac.uk", - "lspimg.com", - "lsrc.ac.uk", - "lsrnw.ac.uk", - "lss55.com", - "lsst.ac.uk", - "lst.ac.uk", - "lstmed.ac.uk", - "lstmliverpool.ac.uk", - "lstonline.ac.uk", "lsxszzg.com", - "ltcc.ac.uk", - "ltea.ac.uk", - "ltegroup.ac.uk", - "lthgav.buzz", "ltn.com.tw", - "ltscotland.ac.uk", - "ltsn-01.ac.uk", - "ltsn.ac.uk", - "ltsneng.ac.uk", - "ltsports.com.tw", - "ltube.life", - "lu2100.com", - "lu2200.com", - "lu23.com", - "lu2300.cc", - "lua.org", - "luanlunmv.cc", - "lubetube.com", - "lucahmelayu.club", - "lucasentertainment.com", - "lucbjtu.ac.uk", - "lucid.ac.uk", "luckydesigner.space", - "luckyissue.com", - "ludlow-college.ac.uk", - "lufton-college-fe.ac.uk", - "luftoncollege.ac.uk", - "luil.ac.uk", "luke54.com", "luke54.org", - "lululu.one", - "luminate.ac.uk", - "luminateeducation.ac.uk", - "luminateeducationgroup.ac.uk", - "luminategroup.ac.uk", - "lunchwithpype.com", - "luoli.info", - "luotihg-tv.buzz", - "luotihg.cc", - "lupc.ac.uk", "lupm.org", - "lupoporno.com", - "luscious.net", "lushstories.com", - "lustery.com", - "lusthero.com", - "lustylist.com", - "lut.ac.uk", - "luticlip.com", - "luton-acl.ac.uk", - "luton.ac.uk", - "lutonacl.ac.uk", - "lutonsfc.ac.uk", - "lutube2310.com", - "luvmov.com", - "luw666.xyz", - "luw666cm.cc", "luxebc.com", - "luxuretv.com", - "luxuretv.fun", "lvhai.org", - "lvv.ac.uk", "lvv2.com", - "lwms.ac.uk", - "lww-cetl.ac.uk", - "lwwcn.buzz", - "lwwcn.xyz", - "lxxlxx.com", - "lyellcentre.ac.uk", + "ly.gov.tw", "lyfhk.net", - "lysol.ca", - "lysol.cl", - "lysol.co.cr", - "lysol.com", - "lysol.com.mx", - "lysol.net", - "lythamsixth.ac.uk", - "lyzsxx.com", - "lz.ac.uk", "lzjscript.com", "lzmtnews.org", - "m-power.com", - "m-rhex.ac.uk", "m-sport.co.uk", "m-team.cc", "m.me", - "m12.vc", - "m25lib.ac.uk", - "m2m.com", - "m5servicedesk.ac.uk", - "m5universities.ac.uk", "m8008.com", - "ma1lib.org", - "maa.plus", - "mabbank.com", - "mablethorpe.ac.uk", - "mac-migs.ac.uk", - "mac-mini.com", - "mac.com", - "mac.com.au", - "mac.eu", - "mac.rs", - "mac.wang", - "macappsto.re", - "macaulay.ac.uk", - "macbook.co", - "macbook.hk", - "macbook.tw", - "macbook.wang", - "macbookair.co.kr", - "macbookair.co.uk", - "macbookair.com", - "macbookair.com.au", - "macbookair.com.es", - "macbookair.es", - "macbookair.hk", - "macbookair.jp", - "macbookair.kr", - "macbookair.net", - "macbookpro.co", - "macbookpro.com", - "macbookpro.com.au", - "macbookpro.net", - "macbookpro.us", - "macbookpros.com", - "macbooksale.com", - "macboxset.com", - "macclesfield-college.ac.uk", - "macclesfield.ac.uk", "macgamestore.com", - "mach-os.com", - "mach-os.net", "machbbs.com", - "machigle-sp.com", - "machigoto.jp", - "machine-dna.com", - "machogaytube.com", - "machos.net", - "machosaonatural.com.br", - "machotube.tv", - "macintosh.eu", - "macintoshsoftware.com", - "mackworth-college.ac.uk", - "mackworth.ac.uk", - "macmini.com", - "macos.com.au", - "macosforge.org", - "macossierra.com", - "macosx.info", - "macosxlion.com", - "macpazar.com", - "macports.org", - "macreach.com", - "macreach.net", - "macromedia.com", "macrovpn.com", - "macruby.com", - "macruby.net", - "macruby.org", - "macrumors.com", "macts.com.tw", "mad-ar.ch", - "madamlive.tv", - "madchensex.com", - "maddawgjav.net", - "maddenchampionship.com", - "maddenrewards.com", - "maddenseason.info", - "maddenseason.net", - "maddenseason.org", "madewithcode.com", - "madewithmaya.com", - "madewithstudiotools.com", - "madhomemadeporn.com", "madonna-av.com", "madou.club", - "madou.la", - "madou.tv", - "madouav.one", - "madouqu.com", "madrau.com", - "madshi.net", "madthumbs.com", - "madvagina.com", - "madvr.com", - "madvr.net", - "maes.ac.uk", - "mafia-linkz.to", - "mageconf.com", - "mageconf.com.ua", - "magento.com", - "magento.net", - "magentocommerce.com", - "magentoliveconference.com", - "magentomobile.com", - "magestic.com", "magic-net.info", - "magic.ac.uk", - "magicalmirai.com", - "magicmovies.com", - "maglue.ac.uk", - "magnacartacollege.ac.uk", "mahabodhi.org", - "mahajantech.com", - "mahsc.ac.uk", + "mahjongsoul.com", "maiio.net", "mail-archive.com", "mail.ru", "mailchimp.com", "maildns.xyz", - "maileoch.com", - "mailhealth.com", - "mailonline.co.uk", - "mailonline.com", - "mailonsunday.co.uk", - "mailonsunday.ie", - "mailtalk.ac.uk", - "main.jp", - "mainichi-athletepartners.jp", - "mainichi.jp", - "mainichibooks.com", "maiplus.com", - "mairbeats.com", "maizhong.org", - "makaan.com", - "makeanything.com", - "makebettercode.com", - "makecode.org", - "makeeu.com", - "makeitopen.com", - "makeitrealcontest.com", "makemymood.com", - "makesenseofdata.com", - "makingassessmentcount.ac.uk", - "makingstartshere.com", - "makingthemostofmasters.ac.uk", "makkahnewspaper.com", - "maktoob.com", - "malayalamanorama.com", - "malayporn.site", - "malayporn.space", - "malaypornhub.com", "malaysiakini.com", - "mallandrinhas.net", - "mallheadphone.com", - "malvastudios.com", - "malvern.ac.uk", - "mamacitaz.com", "mamingzhe.com", - "man.ac.uk", - "managed-pki.ch", - "managed-pki.de", - "managedmeetingrooms.com", - "managedpki.com", - "managedpki.ne.jp", - "management-azure-devices-int.net", - "management-azure-devices.net", - "managementcontrolassociation.ac.uk", - "mancat.ac.uk", - "manchester-business-school.ac.uk", - "manchester-city-coll.ac.uk", - "manchester-computing-centre.ac.uk", - "manchester-metropolitan-university.ac.uk", - "manchester-worldwide.ac.uk", - "manchester.ac.uk", - "manchesterbusinessschool.ac.uk", - "manchesterdentalschool.ac.uk", - "manchesterjmce.ac.uk", - "manchestermedicalschool.ac.uk", - "manchestermethod.ac.uk", - "manchesternti.ac.uk", - "manchesternursingmidwiferyandsocialworkschool.ac.uk", - "manchesternursingschool.ac.uk", - "manchesterpharmacyschool.ac.uk", - "manchesterpsychologyschool.ac.uk", - "manchesterschoolofdentistry.ac.uk", - "manchesterschoolofmedicine.ac.uk", - "manchesterschoolofnursing.ac.uk", - "manchesterschoolofnursingmidwiferyandsocialwork.ac.uk", - "manchesterschoolofpharmacy.ac.uk", - "manchesterschoolofpsychology.ac.uk", "manchukuo.net", "manchustate.org", - "mandatewire.com", "mandiant.com", - "manga-mill.com", - "manga18.art", + "mangabz.com", "mangafox.com", "mangafox.me", - "mangahasu.se", - "mangahentai.me", - "mangahome.com", - "mangoporn.net", - "mangotporn.com", + "mangmang.run", "manhuabika.com", "manhuache.com", "manhuagui.com", - "manhub.com", - "manhunt.net", - "manhuntdaily.com", - "manhwa24h.com", - "manhwahentai.me", - "maniakey.homes", "maniash.com", "manicur4ik.ru", - "manlitphil.ac.uk", - "manorama.com", - "manoramanews.com", - "manoramaonline.com", - "manoramayearbook.in", - "manoto1.tv", - "manototv.com", - "manporn.xxx", "mansion.com", - "mansionglobal.com", "mansionpoker.com", - "mansurfer.com", "manta.com", - "mantais.ac.uk", - "mantochichi.com", - "manufacturingedc.ac.uk", - "manurefetish.com", - "manytoon.com", - "manyvids.com", "manyvoices.news", - "maoeraobjects.ac.uk", - "maomi-shipin.com", - "maomiav.one", - "map-software.com", - "mapbox.com", - "mapguide.com", - "maple.finance", "maplew.com", - "mapp.ac.uk", - "mappingonline.com", - "mappingthemedievalmargins.ac.uk", - "mappingtheunderworld.ac.uk", - "mappingwales.ac.uk", - "mappingwelshmarches.ac.uk", - "marble.ac.uk", "marc.info", - "marchmont.ac.uk", - "maremap.ac.uk", "marguerite.su", - "mariadb.org", - "marianstudies.ac.uk", - "marinecadcam.com", - "marinecentrewales.ac.uk", - "marioandluigidreamteam.com", - "mariobroswii.com", - "mariokart7.com", - "mariokart8.com", - "mariosupersluggers.com", - "marjon.ac.uk", - "marketexecutive.net", - "marketing-cloud.com", - "marketing-nirvana.com", - "marketingcloud.com", - "marketo.co.uk", - "marketo.com", - "marketo.net", - "marketo.tv", - "marketodesigner.com", - "marketolive.com", - "marketwatch.com", - "markingmenus.com", - "markzuckerberg.com", - "marlab.ac.uk", - "marlin.ac.uk", - "marplecollege.ac.uk", - "marranazas.com", "martau.com", "martincartoons.com", "martinoei.com", "martsangkagyuofficial.org", "maruta.be", - "maruzen.co.jp", - "marvel.com", - "marvel10thanniversary.com", - "marveldimensionofheroes.com", - "marvelparty.net", - "marvelpinball.com", - "marvelsdoubleagent.com", - "marvelspotlightplays.com", - "marvelsuperheroseptember.com", - "marvelsuperwar.com", "marxist.com", "marxist.net", "marxists.org", - "maryvale.ac.uk", - "maryward.ac.uk", - "marywardcentre.ac.uk", - "masalabin.com", - "masaladesi.com", - "masalaseen.net", - "masalladeloslimites.com", - "masc25.ac.uk", "mash.to", - "mashaalradio.com", "mashash.com", - "mashiro.site", "maskedip.com", - "maskedsingerfox.com", - "massage-in-taipei.com", - "massagerepublic.com", - "masseffect.com", - "masseffectarchives.com", - "mastercad.com", - "mastercard-email.com", - "mastercard.ae", - "mastercard.at", - "mastercard.az", - "mastercard.ba", - "mastercard.be", - "mastercard.bg", - "mastercard.by", - "mastercard.ca", - "mastercard.ch", - "mastercard.cl", - "mastercard.co.id", - "mastercard.co.il", - "mastercard.co.in", - "mastercard.co.jp", - "mastercard.co.ke", - "mastercard.co.kr", - "mastercard.co.nz", - "mastercard.co.th", - "mastercard.co.uk", - "mastercard.co.ve", - "mastercard.co.za", - "mastercard.com", - "mastercard.com.ar", - "mastercard.com.au", - "mastercard.com.bh", - "mastercard.com.br", - "mastercard.com.bz", - "mastercard.com.co", - "mastercard.com.cy", - "mastercard.com.eg", - "mastercard.com.ge", - "mastercard.com.gt", - "mastercard.com.hk", - "mastercard.com.kw", - "mastercard.com.lb", - "mastercard.com.mx", - "mastercard.com.my", - "mastercard.com.ng", - "mastercard.com.pe", - "mastercard.com.ph", - "mastercard.com.sa", - "mastercard.com.sg", - "mastercard.com.tr", - "mastercard.com.tw", - "mastercard.com.ve", - "mastercard.com.vn", - "mastercard.cz", - "mastercard.de", - "mastercard.dk", - "mastercard.es", - "mastercard.eu", - "mastercard.fi", - "mastercard.fr", - "mastercard.gr", - "mastercard.hr", - "mastercard.hu", - "mastercard.ie", - "mastercard.it", - "mastercard.jo", - "mastercard.ke", - "mastercard.kz", - "mastercard.lu", - "mastercard.md", - "mastercard.my", - "mastercard.nl", - "mastercard.no", - "mastercard.om", - "mastercard.pl", - "mastercard.pt", - "mastercard.qa", - "mastercard.ro", - "mastercard.rs", - "mastercard.ru", - "mastercard.se", - "mastercard.si", - "mastercard.sk", - "mastercard.ua", - "mastercard.us", - "mastercardacademy.com", - "mastercardadvisors.com", - "mastercardbiz.ca", - "mastercardbiz.com", - "mastercardbusinessnetwork.com", - "mastercardcenter.com", - "mastercardcenter.org", - "mastercardcenterforinclusivegrowth.org", - "mastercardconnect.com", - "mastercardezsavings.com", - "mastercardidtheftalerts.com", - "mastercardmoments.com", - "mastercardrestaurant.com", - "mastercardservices.com", - "mastercardworldwide.com", - "masterclass.com", - "masterintelligence.com", - "masterpassteststore.com", - "mastersprojects.ac.uk", - "masterwanker.com", "mastodon.cloud", "mastodon.host", "mastodon.online", "mastodon.social", "mastodon.xyz", - "masts.ac.uk", - "masturbate2gether.com", - "mat6tube.com", "matainja.com", - "match.ac.uk", - "matchmover.com", "material.io", - "materials.ac.uk", - "materialsnexus.ac.uk", "mathable.io", - "mathcentre.ac.uk", - "mathematics.ac.uk", - "mathfit.ac.uk", - "mathgate.ac.uk", "mathiew-badimon.com", - "mathoverflow.net", - "maths-magic.ac.uk", - "mathscentre.ac.uk", - "mathstore.ac.uk", - "mathsvideoclubs.ac.uk", - "mathtutor.ac.uk", "matome-plus.com", "matome-plus.net", - "matrix.ac.uk", "matrix.org", - "matrix.to", "matsushimakaede.com", "matters.news", - "matters.one", "matters.town", - "mattersprotocol.io", - "matthew-boulton.ac.uk", - "mattu.ac.uk", "mattwilcox.net", - "matu.ac.uk", - "mature-amateur-sex.com", - "mature-nl.eu", - "mature-porn-flix.com", - "mature-tube.sexy", - "mature.nl", - "matureclub.com", - "maturefuck.cc", "maturejp.com", - "matureladiesxxx.com", - "matureporner.com", - "maturepornonly.com", - "matures-loving-sex.com", - "maturescam.com", - "maturesexual.com", - "maturesinhd.com", - "maturetube.com", - "maturewifeporn.cc", - "maturewomenanal.com", - "maturexxxvideos.cc", - "mau.ac.uk", - "max.com", - "maxgo.com", - "maxillofacial-cadcam.com", - "maximize.ac.uk", - "maximumerotica.com", "maxing.jp", - "maxis.com", - "maxwell.ac.uk", - "maya5.net", - "mayacomplete.com", - "mayaconductors.com", - "mayafluideffects.com", - "mayaformotiongraphics.com", - "mayagames.com", - "mayamasters.com", - "mayamentor.net", - "mayamentors.com", - "mayamentors.net", - "mayaonlinux.com", - "mayaonmac.com", - "mayaonosx.com", - "mayapressbooks.com", - "mayasucks.com", - "mayaunlimited.com", - "mayauser.com", - "mayauser.net", - "mayavisualization.com", - "mayijiejie.com", "mayimayi.com", - "maying.co", - "mba.ac.uk", - "mbc.ac.uk", - "mbeats-tech.com", - "mbheadphone.com", - "mbn.ac.uk", - "mbro.ac.uk", - "mbs-worldwide.ac.uk", - "mbs.ac.uk", - "mc6.ac.uk", - "mca.ac.uk", "mcadforums.com", "mcaf.ee", - "mcb.com.mm", - "mcc.ac.uk", - "mcd-holdings.co.jp", - "mcd.com", - "mcdelivery.co.id", - "mcdelivery.co.in", - "mcdelivery.co.kr", - "mcdelivery.com.au", - "mcdelivery.com.my", - "mcdelivery.com.ph", - "mcdelivery.com.sg", - "mcdelivery.com.tw", - "mcdindia.com", - "mcdindonesia.com", - "mcdonalds-online.com", - "mcdonalds.be", - "mcdonalds.ca", - "mcdonalds.co.id", - "mcdonalds.co.jp", - "mcdonalds.co.kr", - "mcdonalds.co.nz", - "mcdonalds.co.uk", - "mcdonalds.com", - "mcdonalds.com.au", - "mcdonalds.com.hk", - "mcdonalds.com.lb", - "mcdonalds.com.my", - "mcdonalds.com.ph", - "mcdonalds.com.tw", - "mcdonalds.hk", - "mcdonalds.it", - "mcdonalds.no", - "mcdonalds.se", - "mcdonaldsapps.com", - "mcdonaldsarabia.com", - "mcdonaldsparties.co.nz", "mcfog.com", - "mcisco.com", - "mcls.ac.uk", - "mcpeaceofmind.com", "mcreasite.com", - "mcrouter.net", - "mcrouter.org", - "mcstories.com", - "mcsw.ac.uk", - "mctimoney-college.ac.uk", "md-t.org", - "mdbankpublic.com", - "mdhcdn.com", - "mdialog.com", - "mdn.dev", - "mdnkids.com", - "mdnplay.dev", - "mdnyalp.dev", - "mdpi.com", - "mdpj-mov.shop", - "mdpjoin.buzz", - "mdr-good.sbs", - "mdr100ya.lat", - "mdtt-tv.sbs", - "mdx.ac.uk", - "mdyy.de", - "me-gay.com", "me.com", "me.me", - "meadjohnson.com", - "meadjohnson.com.hk", - "meadjohnson.com.tw", - "meadjohnson.net", "meansys.com", - "mearki.com", - "meb.gov.mm", - "meddyliwchamgymru.ac.uk", - "mede-innovation.ac.uk", - "medev.ac.uk", - "medhist.ac.uk", - "media-amazon.com", - "media-imdb.com", "media.org.hk", "mediachinese.com", - "mediafiles-cisco.com", "mediafire.com", "mediafreakcity.com", - "mediahub.ac.uk", - "median.ac.uk", - "mediasama.com", "mediawiki.org", - "medicalimplants-cadcam.com", "medicalnewstoday.com", - "medicine.ac.uk", - "medievalchester.ac.uk", - "medievalfrancophone.ac.uk", - "medievalswansea.ac.uk", - "medipathways.ac.uk", "medium.com", - "medium.systems", - "medow.ru", - "medrxiv.org", - "medschools.ac.uk", - "medway.ac.uk", - "medwayacl.ac.uk", "mee6.xyz", - "meendo.com", - "meet.new", - "meetandfuck.games", - "meetandfuckgames.com", "meetav.com", - "meetfasttrack.com", - "meetsmartbook.com", "meetup.com", - "meetyourdevices.com", "mefeedia.com", "meforum.org", "mefound.com", "mega.co.nz", "mega.io", "mega.nz", - "megacamz.com", - "megafilmporno.com", "megalodon.jp", - "megamon.co.kr", - "megaphone.fm", - "megapornfreehd.com", - "megaporno.com.br", - "megapornpics.com", "megaproxy.com", "megarotic.com", - "megatitsminka.com", "megavideo.com", - "meguk.ac.uk", "megurineluka.com", - "meguso.com", - "meijinsen.jp", - "meilleurpornos.com", - "meirion-dwyfor.ac.uk", "meirixiaochao.com", - "meitula.net", "meizhong.blog", "meizhong.report", - "melon.com", "melon365.com", - "melonbooks.co.jp", - "melonstube.com", "meltoday.com", - "meme111.com", "memehk.com", "memes.tw", "memorybbs.com", "memri.org", "memrijttm.org", - "men.com", - "men18.net", - "menai.ac.uk", - "menatplay.com", - "mendel.ac.uk", - "mendeley.com", - "mengnan.shop", - "menhdv.com", - "mensheaven.jp", - "menshin-channel.com", - "meoriental.com", - "meplg.ac.uk", - "mepn.com", - "meraki-go.com", - "meraki.hk", - "merakigo.com", - "merc.ac.uk", "mercari.com", "mercari.jp", "mercatox.com", "mercdn.net", "mercyprophet.org", + "mergersandinquisitions.com", "mergersandinquisitions.org", "meridian-trust.org", - "meridian.net", "meripet.biz", "meripet.com", "merit-times.com.tw", - "merlin.ac.uk", "merlinblog.xyz", - "merops.ac.uk", - "merristwood.ac.uk", - "merseyandwestlancslln.ac.uk", - "merthyr.ac.uk", - "merton-acl.ac.uk", - "merton-adult-education.ac.uk", - "merton.ac.uk", - "mertonadulteducation.ac.uk", - "meshmixer.com", - "meshmixerforum.com", "meshrep.com", "mesotw.com", "messenger.com", - "messengerdevelopers.com", - "messytube.com", - "met-nude.com", - "meta.ai", "meta.com", - "metabolomics.ac.uk", - "metabora.io", "metacafe.com", - "metacloud.com", - "metacpan.org", "metacubex.one", - "metadac.ac.uk", "metafilter.com", - "metalpha.finance", - "metamind.io", - "metanoia.ac.uk", - "metaporn.com", "metart.com", "metarthunter.com", - "metartnetwork.com", - "metcaerdydd.ac.uk", - "metcams.com", - "meteorr.ac.uk", "meteorshowersonline.com", - "metfilm.ac.uk", - "metfilmschool.ac.uk", - "methnet.ac.uk", - "methodsnetwork.ac.uk", - "methodsnorthwest.ac.uk", - "metro.co.uk", "metro.taipei", "metrohk.com.hk", "metrolife.ca", - "metropolitana.tokyo", "metroradio.com.hk", - "metrotoons.com", - "meu.ac.uk", - "meuhentai.com", "mewe.com", - "mexc.com", - "mexcsensors.com", "meyou.jp", "meyul.com", - "mfeed.ad.jp", - "mfg-inspector.com", - "mfmf.club", - "mfo.ac.uk", "mfxmedia.com", - "mgo-images.com", - "mgo.com", "mgoon.com", - "mgsdtp.ac.uk", "mgstage.com", "mh4u.org", - "mhdss.ac.uk", - "mhhanman.xyz", - "mhie.ac.uk", - "mhqwe.xyz", "mhradio.org", - "mhrn.ac.uk", - "mhs-relay.ac.uk", - "mhs.ac.uk", - "mhshosting.com", "mi.com", - "mi9.com.au", - "mi9cdn.com", - "miamifintechfestival.com", - "miaomwu.com", - "miaopa.net", - "mib.ac.uk", - "mic.ac.uk", - "micb.gov.mm", - "michaelanti.com", "michaelmarketl.com", - "mickey.tv", - "mickybells.com", - "microad.co.jp", - "microad.jp", - "microbit.org", - "microbusiness.ac.uk", - "microgravity.ac.uk", - "micron.ac.uk", - "micronanoflows.ac.uk", - "microsimulation.ac.uk", - "microsoft-falcon.io", - "microsoft-give.com", - "microsoft-int.com", - "microsoft-ppe.com", - "microsoft-sap-events.com", - "microsoft-sbs-domains.com", - "microsoft.az", - "microsoft.be", - "microsoft.by", - "microsoft.ca", - "microsoft.cat", - "microsoft.ch", - "microsoft.cl", "microsoft.com", - "microsoft.cz", - "microsoft.de", - "microsoft.dk", - "microsoft.ee", - "microsoft.es", - "microsoft.eu", - "microsoft.fi", - "microsoft.ge", - "microsoft.hu", - "microsoft.io", - "microsoft.is", - "microsoft.it", - "microsoft.jp", - "microsoft.lt", - "microsoft.lu", - "microsoft.lv", - "microsoft.md", - "microsoft.net", - "microsoft.pl", - "microsoft.pt", - "microsoft.red", - "microsoft.ro", - "microsoft.rs", - "microsoft.ru", - "microsoft.se", - "microsoft.si", - "microsoft.tv", - "microsoft.ua", - "microsoft.uz", - "microsoft.vn", - "microsoft365.com", - "microsoftaccountguard.com", - "microsoftadc.com", - "microsoftads.com", - "microsoftadvertising.com", - "microsoftadvertisingregionalawards.com", - "microsoftaffiliates.com", - "microsoftapp.net", - "microsoftazuresponsorships.com", - "microsoftcloud.com", - "microsoftcloudsummit.com", - "microsoftcloudworkshop.com", - "microsoftcommunitytraining.com", - "microsoftdiplomados.com", - "microsofteca.com", - "microsoftedge.com", - "microsoftgamestack.com", - "microsofthouse.com", - "microsofthouse.net", - "microsoftinternetsafety.net", - "microsoftiotcentral.com", - "microsoftiotinsiderlabs.com", - "microsoftlatamaitour.com", - "microsoftlatamholiday.com", - "microsoftlinc.com", - "microsoftmxfilantropia.com", - "microsoftnews.cc", - "microsoftnews.com", - "microsoftnews.net", - "microsoftnews.org", - "microsoftnewsforkids.com", - "microsoftnewsforkids.net", - "microsoftnewsforkids.org", - "microsoftnewskids.com", - "microsoftnewskids.net", - "microsoftnewskids.org", - "microsoftonline-p.com", - "microsoftonline.com", - "microsoftpartnercommunity.com", - "microsoftpartnersolutions.com", - "microsoftreactor.info", - "microsoftreactor.net", - "microsoftreactor.org", - "microsoftready.com", - "microsoftsilverlight.com", - "microsoftsilverlight.net", - "microsoftsilverlight.org", - "microsoftsiteselection.com", - "microsoftsqlserver.com", - "microsoftstart.com", - "microsoftstore.com", - "microsoftstore.com.hk", - "microsoftstream.com", - "microsoftteams.com", - "microsofttradein.com", - "microsofttranslator.com", - "microsoftuwp.com", "microvpn.com", - "micstl.com", - "midatlanticbmwmotorcycles.com", - "midchesh.ac.uk", "middle-way.net", - "middlesbro.ac.uk", - "middlesex.ac.uk", - "midentsolutions.com", - "midfife.ac.uk", - "midhurst.ac.uk", - "midkent.ac.uk", - "midlands3cities.ac.uk", - "midlands4cities.ac.uk", - "midlandsenergyconsortium.ac.uk", - "midlandsphysicsalliance.ac.uk", - "midoushe.com", - "midplus.ac.uk", - "midrib.ac.uk", - "miexnoviadesnuda.com", - "mihe.ac.uk", "mihk.hk", - "mihomeone.info", "mihr.com", "mihua.org", - "miitomo.com", - "miiverse.com", "mikanani.me", "mikesoltys.com", "mikocon.com", - "mikrotik.com", - "miktex.org", - "mikuexpo.com", - "milehighmedia.com", - "milfav.icu", - "milfbundle.com", - "milfed.com", - "milffox.com", - "milfhunter.com", - "milflove.live", - "milfmaturesex.net", - "milfmovs.com", - "milfnut.com", - "milfporn.pro", - "milfpornonly.com", - "milfpornpics.xxx", - "milfprime.com", - "milfs-gone-wild.com", - "milfs-now.com", - "milfsexstart.nl", - "milfslesbian.com", - "milfsover30.com", - "milfthreesomes.com", - "milftube.pro", - "milftugs.com", - "milfvr.com", - "milfzr.com", - "miliav.com", - "milkmanbook.com", - "millionplus.ac.uk", - "millymarks.com", - "milofetch.com", "milph.net", "milsurps.com", - "mimas.ac.uk", - "mimei.store", - "mimi-zhibo.com", - "mimi2022.link", - "mimi22.top", - "mimi222.top", "mimiai.net", - "mimistudio.com", - "mimistyler.com", "mimivip.com", "mimivv.com", - "mimizy-go.buzz", - "minbrowser.org", - "mindgeek.com", - "mindmeld.com", "mindrolling.org", - "minecraft.net", - "minecraft.wiki", - "minecraftservices.com", - "minecraftshop.com", - "mineofinfo.ac.uk", - "minerva.ac.uk", "mingdemedia.org", "minghui-a.org", "minghui-b.org", @@ -17669,8 +3795,6 @@ var rules = [ "mingjinglishi.com", "mingjingnews.com", "mingjingtimes.com", - "mingky.org", - "mingkyaa.com", "mingpao.com", "mingpaocanada.com", "mingpaomonthly.com", @@ -17679,528 +3803,74 @@ var rules = [ "mingpaosf.com", "mingpaotor.com", "mingpaovan.com", - "mings-fashion.com", - "mings.hk", "mingshengbao.com", - "mingw.org", - "mingwatch.com", - "minhajcollege.ac.uk", "minhhue.net", - "mini-abudhabi.com", - "mini-antilles.fr", - "mini-bahrain.com", - "mini-bosnia.com", - "mini-clubs-international.com", - "mini-connected.at", - "mini-connected.be", - "mini-connected.ch", - "mini-connected.co.uk", - "mini-connected.com", - "mini-connected.cz", - "mini-connected.de", - "mini-connected.dk", - "mini-connected.ee", - "mini-connected.es", - "mini-connected.fi", - "mini-connected.fr", - "mini-connected.ie", - "mini-connected.it", - "mini-connected.lt", - "mini-connected.lu", - "mini-connected.lv", - "mini-connected.nl", - "mini-connected.no", - "mini-connected.pl", - "mini-connected.pt", - "mini-connected.se", - "mini-corporate-sales.com", - "mini-coupe.ca", - "mini-dubai.com", - "mini-e.com", - "mini-egypt.com", - "mini-georgia.com", - "mini-grouparchiv.de", - "mini-grouparchive.com", - "mini-jordan.com", - "mini-ksa.com", - "mini-kuwait.com", - "mini-lebanon.com", - "mini-me.com", - "mini-oman.com", - "mini-qatar.com", - "mini-srilanka.com", - "mini-stjohns.ca", - "mini-stjohns.com", - "mini-tahiti.com", - "mini-vietnam.com", - "mini-windsor.ca", - "mini-windsor.com", - "mini.am", - "mini.at", - "mini.be", - "mini.bg", - "mini.by", - "mini.ca", - "mini.cc", - "mini.ch", - "mini.cl", - "mini.co.cr", - "mini.co.id", - "mini.co.il", - "mini.co.kr", - "mini.co.me", - "mini.co.th", - "mini.co.uk", - "mini.co.za", - "mini.com", - "mini.com.ar", - "mini.com.bn", - "mini.com.br", - "mini.com.co", - "mini.com.cy", - "mini.com.do", - "mini.com.ec", - "mini.com.gr", - "mini.com.gt", - "mini.com.hr", - "mini.com.mk", - "mini.com.mo", - "mini.com.mt", - "mini.com.mx", - "mini.com.pa", - "mini.com.pe", - "mini.com.ph", - "mini.com.pl", - "mini.com.py", - "mini.com.sg", - "mini.com.tr", - "mini.com.tw", - "mini.com.uy", - "mini.cz", - "mini.de", - "mini.dk", - "mini.dz", - "mini.es", - "mini.fi", - "mini.fr", - "mini.gp", - "mini.hu", - "mini.ie", - "mini.in", - "mini.is", - "mini.it", - "mini.jp", - "mini.kz", - "mini.lu", - "mini.ma", - "mini.md", - "mini.mq", - "mini.mu", - "mini.my", - "mini.nc", - "mini.nl", - "mini.no", - "mini.pt", - "mini.re", - "mini.ro", - "mini.rs", - "mini.ru", - "mini.se", - "mini.si", - "mini.sk", - "mini.tm", - "mini.tn", - "mini.ua", - "mini101.ca", - "miniargentina.com", - "minibrossard.ca", - "minibrossard.com", - "minicanada.ca", - "minicaribbean.com", - "miniccrc.ca", - "minicooper.ca", - "minid.no", - "minidealer.com", - "minidealernet.com", - "minidowntown.ca", - "minidowntown.com", - "minidrivingexperienceusa.com", - "minidurham.ca", - "minidurham.com", - "minie.com", "miniforum.org", - "minifs.com", - "minigeorgian.ca", - "minigrandriver.com", - "minihalifax.ca", - "minihalifax.com", - "minihk.com", - "miniinvasion.ca", - "miniitalianjob.com", - "minikelowna.ca", - "minikelowna.com", - "minilangley.ca", - "minilangley.com", - "minilat.com", - "minilaval.ca", - "minilaval.com", - "minilondon.ca", - "minilondon.co", - "minim.ac.uk", - "minimarkham.ca", - "minimarkham.com", - "minimoncton.ca", - "minimoncton.com", - "minimontrealcentre.ca", - "minimontroyal.ca", - "minimontroyal.com", - "minimotoringrewards.com", - "minimotoringschool.com", - "minimotorsport.com", - "mininanaimo.ca", - "mininanaimo.com", - "minioakville.com", - "miniofmonrovia.com", - "minipetfriendly.com", - "minirichmond.ca", - "minirichmond.com", - "minisaskatoon.ca", - "minisaskatoon.com", - "minisexdoll.com", - "minishop.ca", - "miniso-au.com", - "miniso-bh.com", - "miniso-np.com", - "miniso-nz.com", - "miniso.by", - "miniso.ca", - "miniso.co", - "miniso.co.id", - "miniso.co.tz", - "miniso.com", - "miniso.com.es", - "miniso.com.gr", - "miniso.com.mx", - "miniso.com.pl", - "miniso.com.py", - "miniso.com.tr", - "miniso.ge", - "miniso.ie", - "miniso.jp", - "miniso.ma", - "miniso.my", - "miniso.pe", - "miniso.pk", - "miniso.ua", - "miniso.uz", - "minisoindia.com", - "minisojordan.com", - "minisokorea.com", - "minisolife.co.za", - "minisothailand.com", - "minisovietam.vn", - "minispace.com", - "minispecialoffers.ca", - "minispygear.com", - "ministcatharines.ca", - "ministeagathe.com", - "ministjohns.ca", + "miningpoolhub.com", "ministrybooks.org", - "minitakesthestates.com", - "minitoronto.ca", - "minitroisrivieres.ca", - "miniusa.com", - "miniusaservice.com", - "miniusatires.com", - "minivalueservice.com", - "minivancouver.ca", - "minivaughanwest.ca", - "minivaughanwest.com", - "minivictoria.ca", - "minivictoria.com", - "minivilledequebec.ca", - "minivilledequebec.com", - "miniwholesaleconnect.com", - "miniwidget.ca", - "miniwindsor.com", - "miniworkshop.com", - "miniyaletown.ca", - "minnano-av.com", - "minneapolisbmw.com", - "minneapolisbmw.net", - "minstercentre.ac.uk", - "minuporno.com", "minzhuhua.net", "minzhuzhanxian.com", "minzhuzhongguo.org", - "miohentai.com", "miraheze.org", - "mirailab.tech", - "mirandanet.ac.uk", "miroguide.com", - "mirror.ac.uk", "mirror.xyz", "mirrorbooks.com", "mirrormedia.com.tw", "mirrormedia.mg", - "mirrorsedge.com", - "mirrorsedge.jp", - "mirrorsedge.net", - "mirrorsedge2.com", - "mirrorsedge2d.com", - "misoc.ac.uk", "missav.com", - "missav.uno", - "missendenabbey.ac.uk", - "misshotgirls.com", - "misskey-square.net", - "misskey.art", - "misskey.cloud", - "misskey.design", - "misskey.flowers", - "misskey.gg", - "misskey.io", - "misskey.stream", - "misskeyusercontent.jp", - "mist.ac.uk", "mist.vip", - "mistresskym.com", "mit.edu", - "mit.net", - "mitao.bar", "mitao.com.tw", "mitbbs.com", "mitbbsau.com", - "mitnaka.com", - "mitpressjournals.org", - "mixasiansex.com", + "miuipolska.pl", "mixero.com", "mixi.jp", - "mixmaturesex.com", "mixpod.com", - "mixvintagesex.com", "mixx.com", "mizzmona.com", "mjib.gov.tw", - "mjv-art.org", "mk5000.com", - "mkcollege.ac.uk", - "mkncc.ac.uk", - "mksa.top", - "mkt.com", - "mktdns.com", - "mkto-c0100.com", - "mktorest.com", - "mktroute.com", - "mlab.ac.uk", + "mlc.ai", "mlcool.com", - "mluri.ac.uk", "mlzs.work", "mm-cg.com", - "mm9841.cc", "mmaaxx.com", - "mmbbank.com.mm", - "mmdnn.com", - "mmf.ac.uk", - "mmftb.gov.mm", - "mmgy.cc", - "mminsurance.gov.mm", - "mmmanual.com", "mmmca.com", - "mmmhub.ac.uk", - "mmonsterheadphones.net", - "mmscdh.one", - "mmtongdao.xyz", - "mmtourismbank.com", - "mmtv.life", - "mmu.ac.uk", - "mmubs.ac.uk", - "mmwxl27.top", - "mnc.ac.uk", - "mndregister.ac.uk", "mnewstv.com", "mobatek.net", - "mobile.de", "mobile01.com", - "mobilecumbria.ac.uk", - "mobilefacebook.com", - "mobileinternational.com", - "mobilemarketo.com", - "mobileme.dk", - "mobileporngames.com", - "mobilepornmovies.com", - "mobileview.page", - "mobilevrxxx.com", "mobileways.de", - "mobilitymoodplace.ac.uk", - "mobmyanmar.com", "moby.to", "mobypicture.com", - "mochajs.org", - "mocloudplus.com", "mod.io", - "modelmediaus.com", - "modeloswebcambogota.com", - "modelsfreecams.com", - "modelsofauthority.ac.uk", - "modeltv.com", "modernchinastudies.org", - "modip.ac.uk", - "modmedmicro.ac.uk", - "modoo.at", - "modperl.pl", - "modrinth.com", - "modular.im", "moeaic.gov.tw", - "moeero-library.com", "moeerolibrary.com", - "moefuns.co", "moegirl.org", - "moeimg.net", - "moez-m.com", + "moeshare.cc", "mofa.gov.tw", "mofaxiehui.com", "mofos.com", - "mofosex.com", - "mofosnetwork.com", "mog.com", "mohu.club", "mohu.ml", "mohu.rocks", - "moidigital.ac.uk", - "mojang.com", "mojim.com", - "mol.ac.uk", "mol.gov.tw", - "mol.im", - "moldflow.com", - "moldflowexpress.com", - "mole.ac.uk", - "moleculardesigntoolkit.com", - "molecularsimulationtools.com", - "molecularviewer.com", - "molesports.com", "molihua.org", - "mollnet.ac.uk", - "molviewer.com", - "mom-gfs.com", - "mom-sex-videos.com", - "mom50.com", - "momentumms.com", - "momesear-chs.buzz", - "momfucktube.com", - "momhomeporn.com", - "mommystoytime.com", - "momo.dm", - "momo5188.com", - "momomall.com.tw", - "momon-ga.com", - "momoniji.com", "momoshop.com.tw", - "momotk.com", - "moms-sex-videos.com", - "momsbangteens.com", - "momsboysmovies.net", - "momsexypics.com", - "momsfuckingboys.net", - "momsgiveass.com", - "momshardcoreporn.com", - "momsneversayno.com", - "momsporn.su", - "momspornvideos.com", - "momsteachsex.com", - "momsteachsex.info", - "momsyoungboys.net", - "momtarts3d.com", - "momtube.club", - "monaitv.me", "monar.ch", - "monash.ac.uk", - "monbeats2013.com", "mondex.org", "money-link.com.tw", + "moneydj.com", "moneyhome.biz", - "moneywithfacebook.com", - "mongodb.com", - "mongodb.org", "monica.im", "monitorchina.org", "monitorware.com", - "monitrix.net", - "monkwear.ac.uk", "monlamit.org", - "mono-project.com", "monocloud.me", - "monogram.ac.uk", - "monotype.com", - "monotypeimaging.com", - "monster-beats-by-dr-dre.com", - "monster-beats-headphones.com", "monster.com", - "monsterbeats-cheap.com", - "monsterbeats-headphone.com", - "monsterbeats-onsale.com", - "monsterbeats-solo.com", - "monsterbeats-solo.net", - "monsterbeats365buy.com", - "monsterbeats8beatsbydre.com", - "monsterbeatsale.com", - "monsterbeatsalestore.com", - "monsterbeatsau.com", - "monsterbeatsbydrdre-nz.com", - "monsterbeatsbydrdre-usa.com", - "monsterbeatsbydrdrecanada.com", - "monsterbeatsbydrdrestudio.com", - "monsterbeatsbydre-nz.com", - "monsterbeatsbydre-usa.com", - "monsterbeatsbydre2015.com", - "monsterbeatsbydreaustraliacheap.com", - "monsterbeatsbydrebilligde.com", - "monsterbeatsbydrefactory.com", - "monsterbeatsbydrenew.com", - "monsterbeatsbydres.com", - "monsterbeatsbydreshop.com", - "monsterbeatscasques.com", - "monsterbeatscommunity.com", - "monsterbeatsdrdrecheap.com", - "monsterbeatsfactory.net", - "monsterbeatsfinland.com", - "monsterbeatsforsale.com", - "monsterbeatsheadphone.com", - "monsterbeatsheadphones.net", - "monsterbeatshere.com", - "monsterbeatsitaly.com", - "monsterbeatsmall.com", - "monsterbeatsnegozi.net", - "monsterbeatsok.com", - "monsterbeatsonlinestoreuk.com", - "monsterbeatsoutlet.us", - "monsterbeatspascher.net", - "monsterbeatsru.com", - "monsterbeatssales.com", - "monsterbeatssalg.com", - "monsterbeatsshops.net", - "monsterbeatsstore.com", - "monsterbeatssydneyaustralia.com", - "monsterbeatstang.com", - "monsterbeatstienda.com", - "monsterbeatstudio.com", - "monsterbydrebeat.com", - "monstercasquebeatspascher.net", - "monstercheapbeatss.com", - "monstercockland.com", - "monsterdrebeats-canada.net", - "monsterdrebeats-usa.com", - "monsterdrebeats-usa.net", - "monsterheadphone.net", - "monsterproduct.net", - "monstersbeatbydres.com", - "monstersdebea.com", - "monstersexporn.net", - "monstershopcheapbeats.net", - "monthlyav.com", - "moodleshare-hw.ac.uk", - "moodstocks.com", "moodyz.com", "moomoo.com", "moon.fm", @@ -18208,1430 +3878,288 @@ var rules = [ "moonbbs.info", "moonbingo.com", "mooo.com", - "moorlands.ac.uk", - "moov.hk", - "moozporn.com", "moptt.tw", - "moray.ac.uk", - "morazzia.com", "morbell.com", - "moredun.ac.uk", - "moreheadphones.com", "moresci.sale", - "morewithautodesk.com", - "morganclaypool.com", - "morgannwg.ac.uk", - "morisawa.co.jp", - "morley.ac.uk", - "morleycollege.ac.uk", - "morleycollegelondon.ac.uk", "morningsun.org", - "mornporn.com", "moroneta.com", - "morphcharts.com", - "mortein.co.in", - "mortein.co.nz", - "mortein.co.za", - "mortein.com", - "mortein.com.au", - "mortein.com.br", - "mortein.com.ng", - "mortein.com.pk", - "morteincam.com", "mos.ru", - "mostly.jp", - "mostpopularpornsites.com", "mosucloud.site", "motherless.com", - "motherwell.ac.uk", - "motiongraphicsandmore.com", - "motionpictureser.com", "motiyun.com", - "motolia.com", "motor4ik.ru", - "motorshowblog.com", - "mottainai.info", - "moulton.ac.uk", - "mountcollyer.ac.uk", "mousebreaker.com", - "move-free.net", - "move.ac.uk", - "move.com", - "moveaws.com", - "movefreeoffers.com", - "movefreerewards.com", - "movefrees.com", "movements.org", - "movenetworks.com", - "moveonmoveup.ac.uk", - "movetv.com", - "movidius.com", - "movidius.net", - "movie-erog.com", - "movie1000.xyz", "moviefap.com", - "moviepost.com", - "moviesanywhere.com", - "moviesarena.com", - "moviesfree4u.xyz", - "moviesneek.com", - "movinghistory.ac.uk", - "movingmedicine.ac.uk", - "mox.moe", - "moxing.mobi", - "moxing.news", - "moystoys.com", - "mozgcp.net", - "mozilla.com", - "mozilla.community", - "mozilla.net", "mozilla.org", - "mozillademos.org", - "mozit.cloud", "moztw.org", - "mp-pxcdn.com", "mp3buscador.com", "mp3ye.eu", - "mpa-mpp.ac.uk", - "mpa-uk.ac.uk", - "mpags.ac.uk", - "mpese.ac.uk", "mpettis.com", "mpfinance.com", "mpinews.com", - "mplstudios.com", - "mpnevolution.com", "mponline.hk", - "mpsi.ac.uk", - "mpv.io", - "mpw.ac.uk", - "mpweekly.com", - "mql5.com", "mqxd.org", - "mr-apple.com.tw", - "mr-tireman.jp", - "mray.club", "mrbasic.com", - "mrbdsm.com", "mrbonus.com", - "mrc.ac.uk", - "mrchewsasianbeaver.com", - "mrcieu.ac.uk", - "mrcollege.ac.uk", - "mrcong.com", - "mrcp.ac.uk", - "mrdeepfakes.com", "mrface.com", - "mri.ac.uk", - "mrlivecam.com", - "mrloli.com", - "mrpinks.com", - "mrporngeek.com", - "mrpornlive.com", - "mrskin.com", "mrslove.com", - "mrssiren.com", "mrtweet.com", - "mrvideosdesexo.xxx", - "ms-studiosmedia.com", - "ms365surfaceoffer.com", - "ms4dre.com", "msa-it.org", - "msa.ac.uk", - "msads.net", - "msauth.net", - "mscassessment.ac.uk", - "mschallenge2018.com", - "mscos.ac.uk", - "msdn.com", - "msec.ac.uk", - "msecnd.net", - "msedge.net", - "msft.info", - "msft.net", - "msftauth.net", - "msfteducation.ca", - "msftnet.org", - "msgamesresearch.com", "msguancha.com", "msha.gov", - "msinnovationchallenge.com", "msn.com", "msn.com.tw", - "msn.net", - "msnbc.com", - "msnewskids.com", - "msnewskids.net", - "msnewskids.org", - "msnkids.com", - "msocdn.com", - "msocsp.com", - "msoopent.com", - "msp.ac.uk", - "mspairlift.com", - "msportknowledge.ac.uk", - "msropendata.com", - "mssn.ac.uk", "mstdn.social", - "msturing.org", - "msudalosti.com", - "msunlimitedcloudsummit.com", "mswe1.org", - "mt.lv", - "mt0011.site", - "mtao.fun", - "mtec.ac.uk", "mthruf.com", - "mti.ac.uk", - "mtt.org", - "mtvnservices.com", "mtw.tl", "mtzfile.pw", - "muarc.ac.uk", "mubi.com", - "muchohentai.com", - "muchomasporno.com", "muchosucko.com", - "mucinex.ca", - "mucinex.cn", - "mucinex.co.nz", - "mucinex.com", - "mucinex.com.cn", - "mucinex.net", - "mucinex.tv", - "mucinexprofessional.com", - "mucm.ac.uk", - "mudbox3d.com", - "mudfish.net", - "mudvod.tv", - "muji.com", - "muji.com.hk", - "muji.eu", - "muji.net", - "muji.tw", - "muji.us", - "mujikorea.net", - "mulheresafoder.com", "mullvad.net", - "mult34.com", - "multicurrencycashpassport.com", "multiply.com", - "multiplydiversity.com", "multiproxy.org", "multiupload.com", - "multporn.net", "mummysgold.com", - "muncloud.dog", - "mundomais.com.br", - "mundus.ac.uk", - "muramura.tv", - "murg.ac.uk", "murmur.tw", - "muryouav.net", "muscdn.com", - "musclegirlflix.com", - "museumofwriting.ac.uk", - "museumwales.ac.uk", - "mushroomtrack.com", - "mushymush.tv", - "music-research.ac.uk", "musicade.net", "musical.ly", - "musicandphilosophy.ac.uk", - "musicbay.net", - "musiche.ac.uk", - "musickit.net", - "musiconline.ac.uk", "musixmatch.com", - "muslimcollege.ac.uk", "muslimvideo.com", - "mut.ch", - "muthead.com", - "muther.ac.uk", - "muycerdas.xxx", - "muyzorras.com", "muzi.com", "muzi.net", "muzu.tv", "mvdis.gov.tw", "mvg.jp", - "mvideoporno.xxx", - "mvk.com", - "mwcu00.com", - "mwdbank.com", - "mwell.ac.uk", - "mwhentai.net", - "mwrc.ac.uk", "mx981.com", - "mxmcdn.net", - "mxshm.site", - "my-enema.com", "my-formosa.com", - "my-magazine.me", "my-private-network.co.uk", "my-proxy.com", "my03.com", - "my13la.com", - "my1stflame.com", - "my20dc.com", - "my20houston.com", - "my29tv.com", - "my3dhentai.com", - "my45.com", "my903.com", - "my9nj.com", - "myaccountglobalcash.com", "myactimes.com", - "myamateurgirls.net", - "myamateurtv.com", "myanniu.com", - "myappleid.com", - "myatos.net", "myaudiocast.com", - "myautocad.com", - "myautodeskbenefits.com", "myav.com.tw", - "myav886.buzz", - "myavfun.com", - "myavok.com", - "myavsuper.com", - "myavxx.xyz", - "mybabehotz.com", "mybbs.us", - "mybeatsbydrestudio.com", - "mybeatsbydreuk.com", - "mybeatscheapbydre.com", - "mybestbuy.com", - "mybestbuyclaims.com", "mybet.com", - "mybmw.ca", - "mybmw.com", - "myboylove.com", - "mybridgestoneeducation.com", - "mybukkakeporn.com", "myca168.com", - "mycalderdale.ac.uk", - "mycams.com", "mycanadanow.com", - "mycandi.ac.uk", - "mycardbenefits.com", - "mycartoonsexgames.com", - "mycdn.me", "mychat.to", "mychinamyhome.com", "mychinanet.com", "mychinanews.com", "mychinese.news", - "mycib.ac.uk", - "myciscobenefits.com", - "myclitgames.com", - "myclyde.ac.uk", "mycnnews.com", - "mycomicsxxx.com", - "myconstructionworld.net", "mycould.com", "mydad.info", "mydati.com", "myddns.com", - "mydirectgroove.com", - "mydirectvchannels.com", - "mydirtyhobby.com", "myeasytv.com", - "myebay.com", "myeclipseide.com", - "myeplg.ac.uk", - "myerscough.ac.uk", - "myfappening.org", - "myfavoritearcade.com", - "myfbfans.com", - "myferrariheadphones.com", - "myfirstflame.com", - "myfistingporn.com", - "myfonts.com", - "myfonts.net", "myforum.com.hk", - "myfoxatlanta.com", - "myfoxaustin.com", - "myfoxboston.com", - "myfoxcharlotte.com", - "myfoxchicago.com", - "myfoxdc.com", - "myfoxdetroit.com", - "myfoxdfw.com", - "myfoxhouston.com", - "myfoxhurricane.com", - "myfoxla.com", - "myfoxlosangeles.com", - "myfoxlubbock.com", - "myfoxmaine.com", - "myfoxny.com", - "myfoxorlando.com", - "myfoxphilly.com", - "myfoxphoenix.com", - "myfoxsanfran.com", - "myfoxtampa.com", - "myfoxtampabay.com", - "myfoxtwincities.com", - "myfoxzone.com", - "myfreeblack.com", "myfreecams.com", "myfreepaysite.com", - "myfreeporngames.com", "myfreshnet.com", "myftp.info", "myftp.name", - "myfun.com", - "mygaysites.com", - "myguide.hk", - "myhelpinglab.com", - "myhentaicomics.com", - "myhentaigallery.com", - "myhomemadesex.com", - "myhpsupport.com", - "myhulu.com", - "myicloud.net", "myip.com", "myiphide.com", "myiphider.com", - "myipod.net", - "myjkwd.com", + "myjs.tw", "mykomica.org", - "mylabnotebook.ac.uk", - "mylcb.ac.uk", - "mylcloud.net", - "mylf.com", "mylftv.com", - "mylittlenieces.com", - "mylogiclab.com", - "mylust.com", "mymaji.com", - "mymapportal.com", - "mymasturbators.com", "mymediarom.com", - "mymicrosoft.com", - "myminisexdoll.com", - "myminiso.com", - "mymmode.com", "mymoe.moe", "mymom.info", - "mymusclevideo.com", "mymusic.net.tw", - "mynescol.ac.uk", "mynetav.net", "mynetav.org", - "mynetname.net", - "mynike.com", "mynumber.org", - "myoctocat.com", "myparagliding.com", - "mypearson.com", - "mypearsonenglish.ch", - "mypearsonshop.com.mx", - "mypearsonshop.mx", "mypicasa.com", "mypicture.info", "mypikpak.com", - "mypikpak.net", - "myplace.ac.uk", "mypop3.net", "mypop3.org", "mypopescu.com", - "mypornads.com", - "mypornadviser.com", - "mypornbookmarks.com", - "mypornfox.com", - "myporngay.com", - "mypornhere.com", - "myporno.cz", - "myporno.photos", - "mypornolab.click", - "mypornstarbook.net", - "mypornvid.fun", - "mypornwap.fun", - "myport.ac.uk", - "myq2.com", - "myqnapcloud.com", - "myradio.com.hk", "myradio.hk", "myreadingmanga.info", - "myrewardzone.com", - "myrimmingporn.com", - "myrz.com", - "myscience.ac.uk", - "mysdn.com", - "mysdn.info", - "mysdn.net", "mysecondarydns.com", - "mysexgames.com", - "mysexygfs.com", - "myshopify.com", - "mysims.com", - "mysimsracing.com", "mysinablog.com", - "mysinchew.com", - "mysocialworklab.com", "myspace.com", "myspacecdn.com", - "mysql.com", - "mystrikingly.com", "mytalkbox.com", - "myteenwebcam.com", - "mythicentertainment.com", - "mythicentertainment.net", - "mythicgames.com", - "mytimesplus.co.uk", "mytizi.com", - "mytokenapi.com", - "mytrannycams.com", - "mytvsuper.com", - "myvisaluxuryhotels.com", - "myvodafone.com.au", - "myvodafone.com.ws", - "mywaytopay.info", - "mywaytopay.net", "mywife.cc", - "mywifecuckold.com", - "mywnsc.ac.uk", "mywww.biz", - "myxvids.com", - "myxxgirl.com", - "myyoungmomisnude.com", - "myyoungwifeisnude.com", "myz.info", - "mzed.com", - "mzstatic.com", - "n0vadesktop.com", - "n3ro.lol", - "n3ro.net", - "n3ro.wtf", - "n8agrifood.ac.uk", - "na-att-idns.net", - "na-me.ac.uk", "naacoalition.org", - "naaktevrouwenporno.com", - "nab.com.au", "nabble.com", - "nabtravellercard.com.au", - "nacro.ac.uk", - "nacstock.ac.uk", - "nactem.ac.uk", - "nado.ac.uk", - "naea.ac.uk", - "nafc.ac.uk", - "nagty.ac.uk", - "nahste.ac.uk", - "naiadsystems.com", - "naihenda.shop", - "naihendauou.lol", - "naijauncut.com", - "nailedhard.com", "naitik.net", - "naizitv.top", - "nakadashi.to", - "naked-asian-porn.com", - "naked-girls.me", - "naked.com", - "nakedamateurmilf.com", - "nakedasiansex.com", - "nakedgirlpic.com", - "nakedgirls.biz", - "nakedmodelsxxx.com", - "nakednews.com", "nakido.com", - "nakn.jp", "nakuz.com", "nalandabodhi.org", "nalandawest.org", - "naln.ac.uk", - "nam.ac.uk", - "namemybeats.com", - "namethatporn.com", - "namethatpornad.com", "namgyal.org", "namgyalmonastery.org", "namsisi.com", - "namss.ac.uk", - "nan-net.com", "nanhuyt.com", - "nanocmos.ac.uk", + "nanopool.org", "nanyang.com", "nanyangpost.com", "nanzao.com", - "nao.ac.jp", - "naoconto.com", "naol.ca", "naol.cc", - "napier-cloud.ac.uk", - "napier.ac.uk", - "napiszex.com", - "narf.ac.uk", "narod.ru", - "narti.ac.uk", "nasa.gov", - "nash.ac.uk", - "nastranincad.com", - "nastrannx.com", - "nastrantraining.com", - "nastranworldwide.com", - "nasty.singles", - "nastyvids.com", "nat.gov.tw", "nat.moe", - "nat.ms", "natado.com", - "nataliefiore.com", - "natcen.ac.uk", - "natcor.ac.uk", - "natdisteam.ac.uk", - "natgeokidsbooks.co.uk", - "natgeomaps.com", - "national-army-museum.ac.uk", - "national-confidential-inquiry.ac.uk", - "national-learning-network.ac.uk", "national-lottery.co.uk", - "nationalacademiclibraries.ac.uk", - "nationalandacademiclibraries.ac.uk", "nationalawakening.org", - "nationalcollegeforadvancedtransportinfrastructure.ac.uk", - "nationalcollegeforhighspeedrail.ac.uk", - "nationalcollegefornuclear.ac.uk", "nationalgeographic.com", - "nationalgeographicpartners.com", "nationalinterest.org", - "nationalnetworkforinterpreting.ac.uk", - "nationalnetworkfortranslation.ac.uk", "nationalreview.com", - "nationalskillsacademy.ac.uk", - "nationaltechnicianscentre.ac.uk", "nationsonline.org", "nationwide.com", - "nativeincolour.com.au", - "natmatsci.ac.uk", - "natsal.ac.uk", - "natstar.ac.uk", - "naturalhistorymuseum.ac.uk", - "naturalvoices.com", - "nature.ac.uk", - "nature.com", - "naturemag.org", - "naughty.com", "naughtyamerica.com", - "naughtyblog.org", - "naughtyfootjobs.com", - "naughtygamesource.com", - "naughtyhentai.biz", - "naughtymachinima.com", - "naughtymag.com", - "naughtysophie.com", - "naughtytugs.com", - "naughtywomenpics.com", - "naver.com", "naver.jp", - "naver.me", - "naver.net", - "naverads.com", - "navercloudcorp.com", - "navercorp.com", - "naverfincorp.com", - "naverlabs.com", - "naverncp.com", - "navisworks.com", - "navisworks.net", "navy.mil", "naweeklytimes.com", - "nazarene.ac.uk", - "nbabot.net", - "nbc.co", "nbc.com", "nbcnews.com", - "nbcol.ac.uk", - "nbcolympics.com", - "nbcsports.com", - "nbcudigitaladops.com", - "nbcuni.com", - "nbcuniversal.com", - "nbdh15.buzz", - "nbe.ac.uk", - "nbi.ac.uk", - "nbolton-sfc.ac.uk", - "nbpa.ac.uk", - "nbria.ac.uk", - "nbs.ac.uk", "nbtvpn.com", - "nbu.ac.uk", - "nbys.tv", - "nbys1.tv", "nbyy.tv", - "nc3rs.ac.uk", - "nc4m.ac.uk", - "nca.ac.uk", - "ncas.ac.uk", - "ncati.ac.uk", - "ncaveo.ac.uk", - "ncb.ac.uk", - "ncbradford.ac.uk", - "ncc.ac.uk", - "nccadultlearning.ac.uk", - "nccc.ac.uk", - "ncccs.ac.uk", - "ncclondon.ac.uk", "nccwatch.org.tw", - "ncdoncaster.ac.uk", - "nceo.ac.uk", - "ncess.ac.uk", - "ncfn.ac.uk", - "ncg.ac.uk", - "ncgc.ac.uk", - "ncgrp.ac.uk", "nch.com.tw", - "nchlondon.ac.uk", - "nchp.ac.uk", "nchrd.org", - "nchsr.ac.uk", - "nciul.ac.uk", - "ncl-coll.ac.uk", - "ncl-lyme.ac.uk", - "ncl-u-lyme.ac.uk", - "ncl.ac.uk", - "ncl.edu.tw", - "nclan.ac.uk", - "nclanarkshire.ac.uk", - "ncloud.com", - "ncls.ac.uk", - "nclt.ac.uk", - "ncn.ac.uk", "ncn.org", "ncol.com", - "ncpontefract.ac.uk", - "ncrcl.ac.uk", - "ncrm.ac.uk", - "ncs.ac.uk", - "ncse.ac.uk", - "nct.ac.uk", - "ncti.ac.uk", - "ncuk.ac.uk", - "nda.ac.uk", - "ndai.ac.uk", "nde.de", - "ndff.ac.uk", "ndi.org", - "ndonline.ac.uk", "ndr.de", - "ndtc.ac.uk", "ndtv.com", - "ne-worcs.ac.uk", - "ne-worcscol.ac.uk", - "neab.ac.uk", - "neaco.ac.uk", - "near.by", - "neath.ac.uk", - "nebay.net", - "neborder.com", - "nebula-emby.com", - "nec-arundel.ac.uk", - "nec.ac.uk", - "necah.ac.uk", - "nectar.ac.uk", "ned.org", - "nedial.ac.uk", - "nedtc.ac.uk", - "nee4you.com", - "needforspeed.com", - "needforspeedboost.com", - "needforspeeddriftkings.com", - "needforspeedeliminator.com", - "needforspeedlightning.com", - "needforspeedoverdrive.com", - "needforspeedproven.com", - "needforspeedredline.com", - "needforspeedshowdown.com", - "needforspeedstreetkings.com", - "needforspeedtakedown.com", - "needforspeedtherun.com", - "needforspeedtimeattack.com", - "needforspeedundergroundeast.com", - "needgayporn.com", - "nefficient.co.kr", - "negozimonsterbeats.com", - "negoziomonsterbeats.com", - "nei.ac.uk", - "neicad.com", - "neiexplicit.com", - "neifea.com", - "neimotion.com", - "neinastranincad.com", - "neipdg.ac.uk", - "neisoftware.com", - "neisolutions.com", - "neiworks.com", - "nejm.org", - "nek.ac.uk", "nekoslovakia.net", - "nekoxxx.com", - "nelcls.ac.uk", - "nelson.ac.uk", - "nelsoncollege.ac.uk", - "nelsongroup.ac.uk", - "nemcon.ac.uk", - "nemode.ac.uk", - "nenastran.com", - "nene.ac.uk", "nengcard.com", - "nenitas.club", - "nentindo.net", "neo-miracle.com", - "neodaas.ac.uk", - "neonatalsociety.ac.uk", - "neow.in", "neowin.net", "nepusoku.com", - "nerap.ac.uk", - "nerc-arsf.ac.uk", - "nerc-bangor.ac.uk", - "nerc-bas.ac.uk", - "nerc-belfast.ac.uk", - "nerc-bush.ac.uk", - "nerc-cardiff.ac.uk", - "nerc-cdt-oil-and-gas.ac.uk", - "nerc-dorset.ac.uk", - "nerc-east-kilbride.ac.uk", - "nerc-eskdalemuir.ac.uk", - "nerc-essc.ac.uk", - "nerc-gilmerton.ac.uk", - "nerc-hartland.ac.uk", - "nerc-keyworth.ac.uk", - "nerc-lancaster.ac.uk", - "nerc-lerwick.ac.uk", - "nerc-liv.ac.uk", - "nerc-loanhead.ac.uk", - "nerc-mst-radar.ac.uk", - "nerc-murchison.ac.uk", - "nerc-oban.ac.uk", - "nerc-oxford.ac.uk", - "nerc-pml.ac.uk", - "nerc-smru.ac.uk", - "nerc-solardome.ac.uk", - "nerc-southampton.ac.uk", - "nerc-swindon.ac.uk", - "nerc-wallingford.ac.uk", - "nerc-wytham.ac.uk", - "nerc.ac.uk", - "nercgw4plus.ac.uk", - "nerdnudes.com", - "neresc.ac.uk", - "nervanasys.com", - "nesaporn.com", - "nesaporn.mobi", - "nesc.ac.uk", - "nesci.ac.uk", - "nescol.ac.uk", - "nescot.ac.uk", - "nesi.ac.uk", - "nesli.ac.uk", - "nesli2.ac.uk", "nesnode.com", - "nest.ac.uk", - "nest.com", "net-fits.pro", - "netacad.com", - "netacad.net", "netalert.me", - "netarabic.com", "netbig.com", "netbirds.com", "netcolony.com", - "netcup-news.de", - "netcup-sonderangebote.de", - "netcup.com", - "netcup.de", - "netcup.eu", - "netcup.net", - "netfapx.com", "netfirms.com", "netflav.com", - "netflav1.com", - "netflav5.com", - "netflix.ca", "netflix.com", "netflix.net", - "netflixdnstest0.com", - "netflixdnstest1.com", - "netflixdnstest10.com", - "netflixdnstest2.com", - "netflixdnstest3.com", - "netflixdnstest4.com", - "netflixdnstest5.com", - "netflixdnstest6.com", - "netflixdnstest7.com", - "netflixdnstest8.com", - "netflixdnstest9.com", - "netflixinvestor.com", - "netflixtechblog.com", - "netlab.ac.uk", "netlify.app", - "netlify.com", - "netlifystatus.com", - "netlock.hu", "netme.cc", - "netname.com.br", - "netpornsex.com", - "netpornsex.net", "netsarang.com", - "netscc.ac.uk", - "netskills.ac.uk", "netsneak.com", - "netsolssl.com", - "netsurf-browser.org", - "nettyinternet.com", - "netvideogirls.com", - "netvigator.com", - "netwise.ac.uk", "network54.com", "networkedblogs.com", "networktunnel.net", - "netzerobuildings.com", - "netzerobuildingstudio.com", - "netzwerkdeutsch.ac.uk", - "neuerporno.com", - "neupc.ac.uk", - "neuralink.com", - "neurogrid.ac.uk", - "neurohub.ac.uk", - "neurology.org", "neverforget8964.org", - "nevex.com", "new-3lunch.net", "new-akiba.com", - "new-campus-basildon.ac.uk", - "new-coll-cf.ac.uk", - "new-jero.net", - "new-redtube.com", - "new.day", - "new2fea.com", - "new3dcomics.com", "new96.ca", - "newark.ac.uk", - "newbasildon.ac.uk", - "newbattleabbeycollege.ac.uk", - "newbeatsblackfriday.com", - "newbemany.com", - "newbienudes.com", - "newbold.ac.uk", - "newbrazz.com", - "newbury-college.ac.uk", - "newcampusbasildon.ac.uk", - "newcampusglasgow.ac.uk", - "newcastle-college.ac.uk", - "newcastle.ac.uk", - "newcastlecitylearning.ac.uk", - "newcastlecollege.ac.uk", - "newcastlenewslocal.com.au", - "newcastlesfc.ac.uk", - "newcastlesixthformcollege.ac.uk", "newcenturymc.com", "newcenturynews.com", - "newceys.ac.uk", "newchen.com", - "newcollege.ac.uk", - "newcollegedurham.ac.uk", - "newcollegeglasgow.ac.uk", - "newcollegetelford.ac.uk", - "newcollpont.ac.uk", - "newdirectionsreading.ac.uk", - "newdrediscount.com", - "newdur.ac.uk", - "neweconomyforum.com", - "newenergyfinance.com", - "newestbeatsbydre.com", "newgrounds.com", - "newham-vic.ac.uk", - "newham.ac.uk", - "newhamcfe.ac.uk", - "newhampshirebmw.com", - "newhentai.org", "newhighlandvision.com", - "newi.ac.uk", "newipnow.com", - "newisiknowledge.com", "newlandmagazine.com.au", - "newlineporn.com", - "newlysprung.net", - "newman.ac.uk", "newmitbbs.com", - "newmonst1erbeatsto1re.com", - "newmonsterbeatsheadphones.com", "newnews.ca", - "newphd.ac.uk", - "newport.ac.uk", - "newpppp.com", - "newroutephd.ac.uk", - "news.co.uk", "news.com.au", - "news.net.au", + "news1.kr", "news100.com.tw", "news18.com", - "newsadds.com.au", - "newsamerica.com", "newsancai.com", - "newsapi.com.au", - "newscareers.co.uk", - "newscdn.com.au", + "newsblur.com", "newschinacomment.org", - "newschristmasshopping.com", "newscn.org", - "newscommercial.co.uk", - "newsconcierge.com.au", - "newscorp.com", - "newscorpaustralia.com", "newsdetox.ca", "newsdh.com", - "newsensations.com", - "newsextv.com", - "newsexwap.com", - "newsexxxx.com", - "newsfeed.com", - "newsfilm.ac.uk", - "newsgawakaru.com", - "newslicensing.co.uk", "newsmagazine.asia", - "newsmart.jp", "newsmax.com", - "newsmax.in", - "newsmaxtv.com", - "newsnowfox.com", "newspeak.cc", - "newsprestigenetwork.com.au", - "newsprinters.co.uk", - "newssyndication.com", "newstamago.com", "newstapa.org", "newstarnet.com", "newstatesman.com", - "newsukadops.com", - "newsupermariobrosu.com", "newsweek.com", - "newsxtend.com.au", "newtaiwan.com.tw", "newtalk.tw", - "newtec.ac.uk", - "newtofea.com", - "newton.ac.uk", - "newton.com", - "newtonfund.ac.uk", - "newtonrigg.ac.uk", - "newvic.ac.uk", - "newxxx24.cc", + "newthuhole.com", "newyorker.com", "newyorktimes.com", - "nexcat.com", - "nexitally.com", - "nexitallysafe.com", - "nexitcore.com", - "nexon.co.jp", "nexon.com", - "nexon.io", - "nexoncdn.co.kr", - "nexpart.com", - "nexpart.tv", - "next-institute.ac.uk", - "next.com", - "next.hk", "next11.co.jp", "nextapple.com", "nextapple.tw", "nextdigital.com.hk", - "nextdigital.com.tw", - "nextechafrica.net", - "nextfilm.com.hk", - "nextgenerationcam.com", - "nextgenerationcenter.com", - "nextjs.org", "nextmag.com.tw", "nextmedia.com", - "nextmedia.com.tw", - "nextmgz.com", "nexton-net.jp", - "nextplus.com.hk", - "nextstepssw.ac.uk", - "nextstop.com", "nexttv.com.tw", - "nextwork.com.hk", - "nextwork.com.tw", - "nextwork.hk", - "nextwork.tw", - "nexusmods.com", "nf.id.au", - "nfacstem.ac.uk", - "nfer.ac.uk", "nfjtyd.com", - "nflhotsalejerseys.com", "nflxext.com", "nflximg.com", "nflximg.net", - "nflxsearch.net", "nflxso.net", "nflxvideo.net", - "nfo.ac.uk", - "nfsc.global", - "nfscdict.com", - "nfscofficial.com", - "nfsworld.com", - "nftstorage.link", "ng.mil", "nga.mil", - "ngc.ac.uk", "ngensis.com", - "ngeo.com", - "ngfl.ac.uk", - "ngflscotland.ac.uk", - "nginx.com", - "nginx.org", - "nginxconfig.io", "ngodupdongchung.com", - "ngs.ac.uk", - "ngwnet.ac.uk", - "nhc.ac.uk", - "nhcscotland.ac.uk", - "nhentai.com", - "nhentai.io", "nhentai.net", - "nhentai.to", - "nhentai.xxx", - "nhentaihaven.com", - "nhentaihaven.org", - "nheos.com", "nhi.gov.tw", "nhk-ondemand.jp", - "nhm.ac.uk", - "nhncorp.jp", - "niab.ac.uk", - "niace.ac.uk", - "nib.ac.uk", - "nibs.ac.uk", - "nibsc.ac.uk", - "nic.cz", "nic.google", "nic.gov", - "nicats.ac.uk", - "nicd.ac.uk", - "niceanimegames.com", - "niceporn.tv", - "nicer.ac.uk", - "nicesshop.net", - "nichepornsite.com", - "nichepornsites.com", - "nicis.ac.uk", - "nickscipio.com", - "nicky.xxx", - "nicodic.jp", - "nicolepeters.com", - "nicomanga.jp", - "niconico.com", - "nicoseiga.jp", "nicovideo.jp", - "nict.jp", - "niees.ac.uk", - "niesr.ac.uk", "nighost.org", - "nightclub.eu", "nightlife141.com", - "nightline.ac.uk", - "nights.fun", - "nihcc.ac.uk", - "nihr.ac.uk", - "nii.ac.jp", - "niimle.ac.uk", - "nijiclamp.com", - "nijidoujin.com", - "nijie.info", - "nijifeti.com", - "nijigen-daiaru.com", - "nijimiss.moe", - "nijinchu.com", - "nijioma.blog", - "nijiyome.jp", - "nike-air-max.com", - "nike-dunksb.com", - "nike-fr.com", - "nike-org.com", - "nike-uk.com", - "nike-us.com", - "nike-usa.com", - "nike.ci", + "nightswatch.top", "nike.com", - "nike.com.br", - "nike.com.hk", - "nike.gy", - "nike.hk", - "nike.host", - "nike.shop", - "nike.us", - "nike0594.com", - "nike23.com", - "nikeadidas.com", - "nikeairhuarache.com", - "nikeairmax.com", - "nikeairmaxs.com", - "nikeairmaxshoes.com", - "nikeairrift.com", - "nikeasia.com", - "nikeaustralia.com", - "nikeaw77.com", - "nikeb.com", - "nikebbn.com", - "nikebetrue.com", - "nikebetterworld.com", - "nikebetterworld.info", - "nikebetterworld.net", - "nikebetterworld.org", - "nikebiz.info", - "nikebuy.com", - "nikeby.com", - "nikecdn.com", - "nikechosen.com", - "nikecloud.com", - "nikeclub.com", - "nikecompany.com", - "nikeconfluence.com", - "nikecraft.com", - "nikedawn.com", - "nikedunks.net", - "nikedunksshoes.com", - "nikeelite.com", - "nikefactorystore.com", - "nikefind.com", - "nikefirm.com", - "nikefoamposites.com", - "nikefoampositeshoes.com", - "nikefootballcleats.com", - "nikefootballgloves.com", - "nikefootballjersey.com", - "nikefoundation.org", - "nikefr.com", - "nikefrance.com", - "nikefree.com", - "nikefreeshoes.com", - "nikefuelband.com", - "nikegadgets.com", - "nikegenealogy.com", - "nikegolf.ca", - "nikegrid.com", - "nikehelp.com", - "nikehightops.com", - "nikehyperdunk.com", - "nikeidshoes.com", - "nikeinc.com", - "nikeincchemistry.com", - "nikeinstock.com", - "nikeit.com", - "nikeitalia.com", - "nikeitaly.com", - "nikekd.com", - "nikekid.com", - "nikelink.com", - "nikeliuxiang.com", - "nikelives.com", - "nikelunarglide.com", - "nikemarketing.com", - "niken7.com", - "nikenews.com", - "nikeonlinestore.com", - "nikeoutletstore.com", - "nikeoutletstores.com", - "nikepioneer.com", - "nikeplus.com", - "nikeplus.org", - "nikepress.com", - "nikeprice.com", - "nikeproduct.com", - "nikepromax.com", - "nikeresponsibility.com", - "nikereuseashoe.com", - "nikerunner.com", - "nikerunningshoes.com", - "nikesb.com", - "nikesbdunks.net", - "nikeseason.com", - "nikeselling.com", - "nikesellorder.com", - "nikeshoemarket.com", - "nikeshoes-store.com", - "nikeshoes21.com", - "nikeshoes4u.com", - "nikeshoescity.com", - "nikeshoesgroup.com", - "nikeshoesinc.com", - "nikeshoesmarket.com", - "nikeshoesretro.com", - "nikeshoeswon.com", - "nikeshoponline.com", - "nikeshoxsale.com", - "nikesku.com", - "nikesnowboarding.com", - "nikesoccercleats.com", - "nikesportswear.com", - "nikestares.com", - "nikestore.com", - "nikestore.com.au", - "nikestyles.com", - "nikeswim.com", - "niketaiwan.net", - "niketracking.com", - "niketradeweb.com", - "niketrainer.com", - "niketrainers.com", - "niketraining.com", - "nikeusa.com", - "nikewear.com", - "nikey.com", - "nikezoom.com", - "nikkan-gendai.com", - "nikkansports.com", - "nikke-de.com", - "nikke-en.com", - "nikke-fr.com", - "nikke-jp.com", - "nikke-kr.com", - "nikke-sea.com", - "nikkei-cnbc.co.jp", - "nikkei.co.jp", "nikkei.com", - "nikkei.jp", - "nikkei4946.com", - "nikkeibp.co.jp", - "nimg.jp", - "nine.com.au", "ninecommentaries.com", - "ninedtp.ac.uk", - "nineentertainment.com.au", - "nineentertainmentco.com.au", - "ninemediaroom.com.au", - "ninemsn.com.au", - "nineteentube.com", "ning.com", "ninjacloak.com", "ninjaproxy.ninja", - "ninpu.cyou", "nintendium.com", - "nintendo-europe-sales.com", - "nintendo-europe.com", - "nintendo.at", - "nintendo.be", - "nintendo.ch", - "nintendo.co.jp", - "nintendo.co.kr", - "nintendo.co.uk", - "nintendo.co.za", - "nintendo.com", - "nintendo.com.hk", - "nintendo.com.pt", - "nintendo.de", - "nintendo.dk", - "nintendo.es", - "nintendo.eu", - "nintendo.fi", - "nintendo.fr", - "nintendo.it", - "nintendo.net", - "nintendo.nl", - "nintendo.no", - "nintendo.pt", - "nintendo.ru", - "nintendo.se", - "nintendo.tw", - "nintendo3ds.com", - "nintendodsi.com", - "nintendoeurope.com", - "nintendonetwork.net", - "nintendonyc.com", - "nintendostore.com", - "nintendoswitch.com", - "nintendoswitch.net", - "nintendoswitchtogether.com", - "nintendowii.com", "ninth.biz", - "niosii.com", - "niosii.net", - "niran.ac.uk", - "nismod.ac.uk", - "nist.gov", "nitter.cc", "nitter.net", "niu.moe", - "niuc2.com", "niusnews.com", - "nivod.tv", - "nivodi.tv", - "nivodz.com", - "nixos.org", - "niziero.info", "njactb.org", "njav.tv", - "njncscotlandscolleges.ac.uk", "njuice.com", - "nkc.ac.uk", - "nke6.com", - "nkw.ac.uk", - "nlc.ac.uk", "nlfreevpn.com", - "nlgs.ac.uk", - "nlincs-coll.ac.uk", - "nlm.io", - "nln.ac.uk", - "nlow.ac.uk", - "nls.ac.uk", - "nlsexfilmpjes.com", - "nlt-media.com", - "nmahp-ru.ac.uk", - "nmahp.ac.uk", - "nmap.ac.uk", - "nmbmw.com", - "nmgm.ac.uk", - "nmgw.ac.uk", - "nmh.ac.uk", - "nmite.ac.uk", - "nmm.ac.uk", - "nms.ac.uk", - "nmsi.ac.uk", "nmsl.website", - "nmssc.ac.uk", - "nmwcte.ac.uk", - "nna.jp", - "nnc.ac.uk", "nnews.eu", - "nnotts-col.ac.uk", - "nnuf.ac.uk", "no-ip.com", "no-ip.org", - "noa.ac.uk", "nobel.se", "nobelprize.org", "nobodycanstop.us", - "noc.ac.uk", - "nocn.ac.uk", - "nocookie.net", - "nocs.ac.uk", - "nodejs.org", - "nodes.ac.uk", + "nodeseek.com", "nodesnoop.com", - "nodesource.com", - "noellabo.jp", "nofile.io", - "noisullifb.com", - "nokiantyres.com", "nokogiri.org", "nokola.com", - "nomachine.com", - "nomadlandmovie.ch", - "nomadproject.io", - "nomulus.foo", - "nondh-room.mom", - "nonktube.com", - "nonlinearnastran.com", - "nonstopfap.com", - "noodlemagazine.com", "noodlevpn.com", - "noonvob.com", "norbulingka.org", "nordcdn.com", "nordstrom.com", @@ -19639,123 +4167,25 @@ var rules = [ "nordstrommedia.com", "nordstromrack.com", "nordvpn.com", - "norfolkcove.ac.uk", - "norland.ac.uk", - "normanmanagedservices.ac.uk", - "noroutetohost.net", - "norsk.mobi", - "nortcoll.ac.uk", - "north-gla.ac.uk", - "north-london.ac.uk", - "north-trafford-college.ac.uk", - "northampton.ac.uk", - "northamptonapps.ac.uk", - "northamptoncoll.ac.uk", - "northamptoncollege.ac.uk", - "northbham.ac.uk", - "northbrook-online.ac.uk", - "northbrook.ac.uk", - "northbrookcollege.ac.uk", - "northderbycollege.ac.uk", - "northeast.ac.uk", - "northeastoutreachhub.ac.uk", - "northern-consortium.ac.uk", - "northern.ac.uk", - "northernart.ac.uk", - "northernbridge.ac.uk", - "northernenterpriseschools.ac.uk", - "northerngrid.ac.uk", - "northernlogisticsacademy.ac.uk", - "northglasgowcollege.ac.uk", - "northgrid.ac.uk", - "northhighland.ac.uk", - "northkent.ac.uk", - "northland.ac.uk", - "northlindsey.ac.uk", - "northscotland-research.ac.uk", - "northtrafford.ac.uk", - "northumberland-acl.ac.uk", - "northumberland.ac.uk", - "northumbria.ac.uk", - "norwichresearchpark.ac.uk", - "notebooklm.google", + "nos.nl", "notepad-plus-plus.org", - "notion-static.com", - "notion.com", - "notion.new", "notion.site", - "notion.so", - "notionusercontent.com", - "notredamecoll.ac.uk", - "nott.ac.uk", - "nottingham-trent.ac.uk", - "nottingham.ac.uk", - "nottinghamartsandhumanitiesresearchinstitute.ac.uk", - "nottinghamcollege.ac.uk", - "nottinghamcourses.ac.uk", - "nottinghameuniversity.ac.uk", - "nottinghamgraduateschoolofbusiness.ac.uk", - "nottinghaminnovation.ac.uk", - "nottinghaminternationalbusinessschool.ac.uk", - "nottinghamknowledge.ac.uk", "nottinghampost.com", - "nottinghamtrentadfs.ac.uk", - "nottm-coll.ac.uk", - "nottsmaternity.ac.uk", "novelasia.com", - "novella.ac.uk", - "noveltrove.com", - "novids.com", - "novinhabucetuda.com", - "novinhagostosa10.com", - "novinhasdozapzap.com", - "novojoy.com", - "novostrong.com", - "novus.ac.uk", - "novuscambria.ac.uk", - "now-ashare.com", - "now-tv.com", "now.com", - "now.com.hk", "now.im", - "now.sh", - "nowal.ac.uk", - "nowe.com", - "nowe.hk", - "nowjav.com", "nownews.com", "nowtorrents.com", - "nox.ac.uk", "noxinfluencer.com", "noypf.com", - "nozomi.la", "npa.go.jp", "npa.gov.tw", - "npcrdc.ac.uk", - "nphcardiac-research.ac.uk", - "npm.ac.uk", - "npm.community", "npm.edu.tw", "npm.gov.tw", - "npmjs.com", - "npmjs.org", "npnt.me", - "npr.org", - "nps.gov", "npsboost.com", - "npsc.ac.uk", - "nptc.ac.uk", - "nptcgroup.ac.uk", - "nptsibinbank.com", "nradio.me", - "nrc.ac.uk", - "nrc.ca", - "nrdh99.buzz", "nrk.no", - "nrn-lcee.ac.uk", - "nrooms-dh.sbs", - "nrp.ac.uk", - "nrs.ac.uk", "ns.ci", "ns01.biz", "ns01.info", @@ -19766,277 +4196,50 @@ var rules = [ "ns1.name", "ns2.name", "ns3.name", - "nsad.ac.uk", - "nsals.ac.uk", - "nsamr.ac.uk", - "nsc.ac.uk", "nsc.gov.tw", - "nsccs.ac.uk", - "nscd.ac.uk", - "nscg.ac.uk", - "nsea.ac.uk", - "nsf.ac.uk", - "nsfnet-relay.ac.uk", - "nsfw.xxx", - "nsfw247.to", - "nsfwmemes.com", - "nsimg.net", - "nsirc.ac.uk", - "nso.ac.uk", - "nspcr.ac.uk", - "nss.ac.uk", - "nsu.ac.uk", - "nsw.ac.uk", - "ntb.ac.uk", "ntbk.gov.tw", "ntbna.gov.tw", "ntbt.gov.tw", - "ntc.ac.uk", - "ntc.party", - "ntd.com", "ntd.tv", - "ntdc.ac.uk", - "ntdca.com", - "ntdimg.com", "ntdsf.tv", - "ntdtv-dc.com", "ntdtv.ca", "ntdtv.co.kr", "ntdtv.com", "ntdtv.com.tw", "ntdtv.cz", "ntdtv.jp", - "ntdtv.kr", "ntdtv.org", "ntdtv.ru", "ntdtvla.com", - "ntdvn.com", - "ntec.ac.uk", - "ntfs.ac.uk", - "ntidagenham.ac.uk", - "ntnews.com.au", - "ntp.org", - "ntp.se", "ntrfun.com", "ntsna.gov.tw", - "ntten-mg.buzz", - "ntu.ac.uk", "ntu.edu.tw", - "ntyneside.ac.uk", - "nu-bay.com", - "nu-sense.ac.uk", "nu.nl", - "nu36.vip", - "nua.ac.uk", - "nubilefilms.com", - "nubiles-casting.com", - "nubiles-porn.com", "nubiles.net", - "nubileset.com", - "nubilesunscripted.com", - "nuc.ac.uk", - "nuca.ac.uk", - "nucarts.ac.uk", - "nuccam.ac.uk", - "nuccat.ac.uk", - "nucfs.ac.uk", - "nuclear.ac.uk", - "nuclear2050.ac.uk", - "nuclearcollege.ac.uk", - "nucleartheory.ac.uk", - "nuclearuniversities.ac.uk", - "nuddess.com", - "nude-pics.org", - "nude-share.com", - "nude.hu", - "nudeandhairy.com", - "nudebeachpussy.com", - "nudecams.cam", - "nudecelebforum.com", - "nudedrawer.com", - "nudedxxx.com", - "nudeeroticteens.com", - "nudefiles.net", - "nudegfporn.com", - "nudekenya.com", - "nudelive.com", - "nudematurewomenpics.com", - "nudemilfporn.com", - "nudes7.com", - "nudespree.com", - "nudeteen.org", - "nudeteenboys.net", - "nudeteenladies.com", - "nudevietnam.com", - "nudevista.best", - "nudevista.club", - "nudevista.com", - "nudevista.es", - "nudevista.fun", - "nudevista.link", - "nudevista.net", - "nudevista.vip", - "nudewifeporn.com", - "nudewomenpics.net", "nudezz.com", - "nudify.online", - "nudistbeachporn.com", - "nudistic.com", - "nudistlog.com", - "nudistsexvideos.com", - "nudistvoyeurbeach.com", - "nudity911.com", - "nudogram.com", - "nudography.com", - "nudostar.tv", - "nuespournous.com", "nuexpo.com", - "nuget.org", - "nugettest.org", - "nuita.net", - "nukemanga.com", - "nuki-dokoro.com", "nukistream.com", - "nulc.ac.uk", - "nulcollege.ac.uk", - "nunuyy.cc", - "nupha.ac.uk", - "nuqmu-2kt.ac.uk", - "nurgay.to", "nurgo-software.com", - "nuro.jp", - "nurofen.at", - "nurofen.bg", - "nurofen.co.il", - "nurofen.co.nz", - "nurofen.co.uk", - "nurofen.co.za", - "nurofen.com", - "nurofen.com.au", - "nurofen.com.sg", - "nurofen.cz", - "nurofen.de", - "nurofen.es", - "nurofen.fr", - "nurofen.hr", - "nurofen.hu", - "nurofen.ie", - "nurofen.it", - "nurofen.net", - "nurofen.no", - "nurofen.pl", - "nurofen.pt", - "nurofen.ro", - "nurofen.ru", - "nurofen.sk", - "nurofengel.com", - "nurofensk-prod-env.eu-west-1.elasticbeanstalk.com", - "nurse.ac.uk", - "nurture.ac.uk", - "nurumassage.net", - "nurxxx.mobi", "nusatrip.com", - "nushemale.com", - "nutaku.com", "nutaku.net", - "nutramigen.net", - "nutramigen.pl", "nutsvpn.work", - "nuuporn.com", "nuuvem.com", "nuvid.com", "nuzcom.com", "nvdst.com", - "nvidia.asia", - "nvidia.at", - "nvidia.be", - "nvidia.ch", - "nvidia.co.at", - "nvidia.co.in", - "nvidia.co.jp", - "nvidia.co.kr", - "nvidia.co.uk", - "nvidia.com", - "nvidia.com.au", - "nvidia.com.br", - "nvidia.com.mx", - "nvidia.com.pe", - "nvidia.com.pl", - "nvidia.com.tr", - "nvidia.com.tw", - "nvidia.com.ua", - "nvidia.com.ve", - "nvidia.cz", - "nvidia.de", - "nvidia.dk", - "nvidia.es", - "nvidia.eu", - "nvidia.fi", - "nvidia.fr", - "nvidia.in", - "nvidia.it", - "nvidia.jp", - "nvidia.lu", - "nvidia.mx", - "nvidia.nl", - "nvidia.no", - "nvidia.pl", - "nvidia.ro", - "nvidia.ru", - "nvidia.se", - "nvidia.tw", - "nvidiaforhp.com", - "nvidiagrid.net", "nvquan.org", "nvtongzhisheng.org", - "nw-grid.ac.uk", - "nwba.ac.uk", - "nwcdtp.ac.uk", - "nwcs.ac.uk", - "nwdtc.ac.uk", - "nwhc.ac.uk", - "nwi.ac.uk", - "nwifhe.ac.uk", - "nwkc.ac.uk", - "nwkcollege.ac.uk", - "nwkent.ac.uk", - "nwl.ac.uk", - "nwlcc.ac.uk", - "nwman.ac.uk", - "nwmentoring.ac.uk", - "nwrc.ac.uk", - "nwsgc.ac.uk", - "nwslc.ac.uk", - "nwspm.ac.uk", - "nwssdtp.ac.uk", - "nwstudentandgraduate.ac.uk", "nwtca.org", - "nwtf.ac.uk", - "nwua.ac.uk", - "nwueu.ac.uk", - "nwupc.ac.uk", - "nwworkbank.ac.uk", - "nwxs8.com", - "nwy.ac.uk", - "nxta.org", - "nxtdig.com.hk", - "nxtdig.com.tw", "nyaa.eu", - "nyaa.net", "nyaa.si", - "nyahentai.re", - "nyansa.com", "nybooks.com", "nydailynews.com", "nydus.ca", + "nyinfor.com", "nylon-angel.com", "nylonstockingsonline.com", - "nym97.net", "nypost.com", - "nypost.help", - "nypostreprints.com", "nyt.com", - "nyt.net", "nytchina.com", "nytcn.me", "nytco.com", @@ -20046,275 +4249,77 @@ var rules = [ "nytimg.com", "nytlog.com", "nytstyle.com", - "nyu.ac.uk", "nzchinese.com", "nzchinese.net.nz", - "o2action.co.kr", - "o365weve-dev.com", - "o365weve-ppe.com", - "o365weve.com", "o3o.ca", - "oaa-anaes.ac.uk", "oaistatic.com", "oaiusercontent.com", - "oakhill.ac.uk", - "oaklands.ac.uk", - "oakley.ac.uk", - "oakwoodcourt.ac.uk", "oanda.com", - "oanencore.com", "oann.com", - "oas.ac.uk", - "oasis.ac.uk", - "oasiscollege.ac.uk", - "oasp.ac.uk", - "oath.cloud", - "oath.com", - "oatridge.ac.uk", "oauth.net", - "oauthz.com", - "obc.ac.uk", - "obhe.ac.uk", - "objectarx.com", - "obs.ac.uk", - "observable.net", "observechina.net", - "obsrvbl.com", - "obutsumania.com", "obutu.com", "obyte.org", - "oca.ac.uk", "ocaspro.com", - "ocbmwdealers.com", - "occ.ac.uk", "occupytiananmen.com", - "oceanography.ac.uk", - "ocfe.ac.uk", - "ochjs.ac.uk", - "oclc.org", "oclp.hk", - "ocms.ac.uk", - "ocn.ad.jp", - "ocnkm.ac.uk", "ocreampies.com", "ocry.com", - "ocsp-certum.com", - "ocsp-responder.com", "october-review.org", - "ocul.us", - "oculus-china.com", "oculus.com", - "oculus2014.com", - "oculus3d.com", - "oculusblog.com", - "oculusbrand.com", - "oculuscasino.net", "oculuscdn.com", - "oculusconnect.com", - "oculusdiving.com", - "oculusforbusiness.com", - "oculusrift.com", - "oculusvr.com", - "ocvc.ac.uk", "odysee.com", - "oecd-ilibrary.org", - "oed.com", - "oekakiskey.com", - "oen.tw", - "oeps.ac.uk", - "oercymru.ac.uk", - "oerwales.ac.uk", "oex.com", "offbeatchina.com", - "offerairjordanlebron.com", - "office.com", - "office.net", - "office365.com", - "office365love.com", - "office365tw.com", - "officeforstudents.ac.uk", "officeoftibet.com", - "officialbeatsbydreshop.com", - "officialbeatsbydrestore.com", - "officialblog.jp", - "officialdrdre.com", - "officialheadphone.com", - "offresspecialesbmw.ca", - "offrezdesipods.com", - "offshorerenewables.ac.uk", "ofile.org", - "ofs.ac.uk", - "ogameblog.com", "ogaoga.org", "ogate.org", - "oge.ac.uk", - "ogp.me", - "ogsa-dai.ac.uk", "ohchr.org", - "ohentai.org", - "ohgratisporrfilm.com", "ohmyrss.com", - "ohpornocasero.com", - "ohpornovideo.com", - "ohsesso.com", - "ohsexfilm.com", - "ohsexotube.com", - "ohu.ac.uk", - "ohyeah1080.com", - "oibc.ac.uk", "oikos.com.tw", "oiktv.com", - "oiobbs.com", "oizoblog.com", "ok.ru", "ok.xxx", - "okaapps.com", "okayfreedom.com", - "okazudouga.tokyo", "okcoin.com", "okex.com", "okk.tw", - "okkisokuho.com", - "okx-dns.com", - "okx-dns1.com", - "okx-dns2.com", + "okpool.me", "okx.com", "olabloga.pl", "old-cat.net", - "oldbury.ac.uk", - "older-women-movies.com", - "older-women-porn.com", - "older.tube", - "oldham-sfc.ac.uk", - "oldham.ac.uk", - "oldhornymilfs.com", - "oldje.com", - "oldroyd.ac.uk", - "olds.ac.uk", - "oldvic.ac.uk", - "olehd.com", "olehdtv.com", "olelive.com", - "olemovienews.com", "olevod.com", - "olevod.io", - "olevod.tv", - "olevodtv.com", - "olf.ac.uk", - "oli-school.com", - "oli.ac.uk", "olumpo.com", "olympicwatch.org", - "omafotze.com", - "omagh.ac.uk", - "omaghcollege.ac.uk", - "omandrilling.ac.uk", - "omaps.app", - "omcrg.ac.uk", "omct.org", - "omekinteractive.com", - "omg.adult", - "omg.blog", - "omghk.com", "omgili.com", - "omgteens.com", - "omii.ac.uk", - "omni.ac.uk", "omni7.jp", - "omniroot.com", "omnitalk.com", "omnitalk.org", - "omnitek.tv", - "omniture.com", "omny.fm", - "omobi.cc", - "omoplanet.com", - "omorashi.jp", - "omorashi.org", - "omscr.com", - "omsiirc.ac.uk", "omtrdc.net", "omy.sg", "on.cc", - "on.here", - "on.net", "on2.com", - "onahodouga.com", - "onani-daisuki.com", "onapp.com", - "onbeatsbydresale.com", - "oncars.in", "one.one", - "one889.app", - "oneapi.com", - "onedinesfree.com", - "onedrive.co", - "onedrive.co.uk", "onedrive.com", - "onedrive.eu", - "onedrive.net", - "onedrive.org", "onedumb.com", - "onefifteen.net", - "onefifteen.org", - "onejapanese.com", "onejav.com", - "onekey-asset.com", - "onekey.so", - "onekeycn.com", - "onenote.com", - "onenote.net", - "onepornlist.com", - "onesiterip.com", "onesto.re", "onestore.co.kr", - "onestore.ms", - "oneteamconference.com", - "onetrust.com", - "oneworldmanystories.com", - "onindiansex.com", - "oninstagram.com", + "onevps.com", "onion.city", "onion.ly", "onion666.com", - "onionshare.org", - "onkakao.net", - "online-deals.net", - "online-instagram.com", - "onlineapplestore.com", "onlinecha.com", - "onlinefucktube.com", - "onlinegeeksquad.com", - "onlineinstagram.com", - "onlinemonsterbeatsonsale.com", - "onlineporn-vids.com", - "onlinesurveys.ac.uk", - "onlineteenhub.com", - "onlinexxxgames.com", "onlineyoutube.com", - "onlinm.ac.uk", - "only-xxx-porn.com", - "only-xxx.com", - "only3x.com", - "onlyams.com", - "onlycartoonsex.com", - "onlydudes.com", - "onlyfanspw.com", - "onlyfreelatinaporn.com", "onlygayvideo.com", - "onlyhdporn.com", - "onlyhentaistuff.com", - "onlyhomemadeanal.com", - "onlyincestporn.com", - "onlyindianporn.tv", - "onlyindianporn2.com", - "onlyiphone5case.com", - "onlyleaks.me", - "onlynudes.org", - "onlyprime.ru", - "onlysiterip.com", "onlytweets.com", - "onmanorama.com", "onmoon.com", "onmoon.net", "onmypc.biz", @@ -20322,2961 +4327,641 @@ var rules = [ "onmypc.net", "onmypc.org", "onmypc.us", - "onsalekey.com", - "onsaletrend.com", - "onstream.cc", "onthehunt.com", "ontrac.com", - "ontrack.ac.uk", - "onxxxtube.com", - "onxxxvideo.com", - "oocdtp.ac.uk", - "ooni.org", "oopsforum.com", - "ootbstudio.co.kr", - "op.gg", - "op7979.com", - "opdems.ac.uk", "open-assistant.io", - "open.ac.uk", "open.com.hk", "openai.com", "openallweb.com", - "openamt.com", - "openapiplatform.com", - "openapiservice.com", - "openart.ai", - "opencollective.com", - "opencreate.org", "opendemocracy.net", "opendn.xyz", - "opendroneid.org", - "opened.ac.uk", - "openengineeringlaboratory.ac.uk", "openervpn.in", - "openfields.ac.uk", - "opengraphprotocol.com", - "opengraphprotocol.org", - "opengw.net", "openid.net", - "openjsf.org", "openleaks.org", - "openlibrary.org", - "openmaps.org", - "openreality.com", - "openresty.org", - "opensciencelab.ac.uk", - "opensciencelaboratory.ac.uk", "opensea.io", - "opensource.ac.uk", "opensource.google", - "opensource.guide", - "opensourceinsight.dev", - "opensourceinsights.dev", - "openssl.org", - "openstemlab.ac.uk", - "openstemlabs.ac.uk", - "openstreetmap.com", - "openstreetmap.net", "openstreetmap.org", - "openstreetmaps.org", - "opensuse.org", "opentech.fund", - "opentgc.com", - "openthread.io", - "opentranslatorstothings.org", - "openuniversity.ac.uk", - "openurl.ac.uk", - "openvinotoolkit.org", "openvpn.net", "openvpn.org", - "openweather.co.uk", - "openweathermap.org", - "openweave.io", "openwebster.com", - "openwrt.org", "openwrt.org.cn", - "opera-archive.ac.uk", "opera-mini.net", "opera.com", - "opinionjournal.com", - "oppai-doga.info", - "oppainorakuen.com", - "opsource.net", - "optanedifference.com", - "opte.org", - "optica.org", - "opticore.com", - "opticsforthecloud.net", - "optima-cdt.ac.uk", - "optimumssl.com", "opus-gaming.com", - "opwall.ac.uk", - "oracle.com", "oraclecloud.com", - "oraclefoundation.org", - "oracleimg.com", - "oracleinfinity.io", - "oranum.com", - "orbitalsouthcolleges.ac.uk", - "orbitera.com", - "orchardhill.ac.uk", - "orchestra.ac.uk", - "orchid.ac.uk", "orchidbbs.com", - "orcon.net.nz", - "oreil.ly", - "oreilly.com", - "oreilly.review", - "oreillystatic.com", - "oreno3d.com", "organcare.org.tw", "organharvestinvestigation.net", "organiccrap.com", - "organicmaps.app", "orgasm.com", - "orgasmlist.com", "orgfree.com", - "orgypornonly.com", - "orgyxxxhub.com", "oricon.co.jp", "orient-doll.com", - "orientalasianporn.com", "orientaldaily.com.my", - "orientalmed.ac.uk", - "origin.com", - "origin.tv", - "originalhulu.com", - "originalindianporn.com", - "orithegame.com", - "orl.ly", - "orlandohurricane.com", - "ormskirk.ac.uk", "orn.jp", - "orpington.ac.uk", - "orsas.ac.uk", - "orsm.net", - "orthopaedic-cadcam.com", - "orthotics-cadcam.com", "orzdream.com", "orzistic.org", - "osakamotion.net", - "osapublishing.org", - "osc.ac.uk", - "oscar.ac.uk", - "oscg.ac.uk", - "osdn.net", - "osfc.ac.uk", "osfoora.com", - "osianxiety.ac.uk", - "osier.ac.uk", - "osiri-suki-club.com", - "osl.com", - "osm.org", - "osmfoundation.org", - "osmosis.ac.uk", - "ospray.net", - "ospray.org", - "oss-watch.ac.uk", - "otaku-168.com", - "otaku18a.info", - "otaku55.xyz", - "otbm.com", "otcbtc.com", - "otleycollege.ac.uk", - "otleyeaston.ac.uk", - "otleyonline.ac.uk", "otnd.org", - "otokonokoland.com", "otto.de", "otzo.com", - "ou.ac.uk", - "oubs.ac.uk", - "oudoll.com", - "oup.com", - "ouplaw.com", "ourdearamy.com", "ourhobby.com", - "ourjourney.ac.uk", - "ouroath.com", - "oursexgames.com", - "ourshdtv.com", - "ourshemales.com", "oursogo.com", "oursteps.com.au", "oursweb.net", "ourtv.hk", - "oustudios.ac.uk", - "outbound.io", - "outdoorpublicsex.com", - "outduction.ac.uk", - "outingsapp.com", - "outletbeatsshop.com", - "outletnike.com", - "outlook.com", - "outofhourshelp.ac.uk", - "ovc.ac.uk", "over-blog.com", - "over18arcade.com", - "overapple.com", "overcast.fm", "overdaily.org", - "overleaf.com", "overplay.net", - "overthumbs.com", "ovi.com", - "ovid.com", "ovpn.com", "ow.ly", "owind.com", - "owl-elearning.ac.uk", "owl.li", "owltail.com", - "owsc.ac.uk", - "ox.ac.uk", - "oxademy.ac.uk", - "oxahsc.ac.uk", - "oxcis.ac.uk", - "oxdent.ac.uk", - "oxford-brookes.ac.uk", - "oxford-cherwell.ac.uk", - "oxford.ac.uk", - "oxfordaasc.com", - "oxfordadvancedstudies.ac.uk", - "oxfordartonline.com", - "oxfordbibliographies.com", - "oxfordbrookes.ac.uk", - "oxfordbusinesscollege.ac.uk", - "oxfordclinicalpsych.com", - "oxfordcollege.ac.uk", - "oxforddnb.com", - "oxforddrama.ac.uk", - "oxfordfirstsource.com", - "oxfordgsb.ac.uk", - "oxfordhandbooks.com", - "oxfordlawtrove.com", - "oxfordmedicine.com", - "oxfordmusiconline.com", - "oxfordpoliticstrove.com", - "oxfordre.com", - "oxfordreference.com", - "oxfordscholarlyeditions.com", "oxfordscholarship.com", - "oxfordtutorialcollege.ac.uk", - "oxfordwesternmusic.com", "oxid.it", - "oxilp.ac.uk", - "oxlife.co", - "oxwasp-cdt.ac.uk", "oyax.com", - "oyeloca.com", "oyghan.com", "ozchinese.com", - "ozeex.com", - "ozodi.org", - "ozodlik.org", "ozvoice.org", "ozxw.com", "ozyoyo.com", - "pa9pal.com", - "paaypal.com", "pachosting.com", - "pacifickitchenandhome.com", "pacificpoker.com", - "packaging-cadcam.com", - "packagingcadcam.com", - "packagist.org", - "packer.io", "packetix.net", - "pacloudflare.com", + "pacom.mil", "pacopacomama.com", - "pact.ac.uk", "padmanet.com", - "pads.ac.uk", - "paerosnen.club", "page.link", "page.tl", "page2rss.com", - "page3.com", - "pagecdn.com", - "pagecdn.io", "pages.dev", - "pagespeedmobilizer.com", - "pageview.mobi", "pagodabox.com", - "pahabicilemezsurprizler.com", - "pahc.ac.uk", - "paheal.net", - "paidpornguide.com", - "paidpornsites.com", - "paily.net", - "paily.org", "paimon.moe", - "painfulpussytortures.com", - "painnovel.com", - "paipal.com", - "paipancon.com", - "paisapay.cc", - "paisapay.info", - "paisapay.tv", - "paisley.ac.uk", - "pakistanporntube.net", - "pala.ac.uk", "palacemoon.com", - "palaeography.ac.uk", - "palatine.ac.uk", - "palcomix.com", "paldengyal.com", - "palemoon.org", - "palestineremix.com", - "pali.ltd", "paljorpublications.com", - "palmers.ac.uk", "palmislife.com", - "pals.ac.uk", "paltalk.com", - "panasonic.com", - "panasonic.jp", - "pancolle-movie.jp", - "panda.ac.uk", - "panda30.shop", - "pandamovies.pw", - "pandanet-igs.com", + "pandafan.pub", "pandapow.co", "pandapow.net", "pandavpn-jp.com", "pandavpnpro.com", "pandora.com", "pandora.tv", - "pankwire.com", "panluan.net", - "panorama-dtp.ac.uk", "panoramio.com", - "pantswalker.net", "pao-pao.net", - "paofu.cloud", - "paofuyun.me", - "paon.site", - "papalah.com", - "paper-attachments.s3.amazonaws.com", "paper.li", "paperb.us", "paperclip.tk", - "papermc.io", - "paradigm.ac.uk", "paradisehill.cc", - "paradisehotelquizfox.com", "paradisepoker.com", - "paragon.com", - "paramount.com", - "paramountplus.com", - "parastorage.com", - "pardot.com", - "park-college.ac.uk", - "park-now.com", "parkansky.com", - "parkcol.ac.uk", - "parkinfo.com", - "parklane.ac.uk", - "parklanecoll.ac.uk", - "parksandgardens.ac.uk", - "parkvv.com", "parler.com", "parse.com", "parsevideo.com", - "parstream.com", - "parstream.net", - "parstream.org", - "particlephysics.ac.uk", - "partmaker.com", - "partneriaethaberbangor.ac.uk", "partycasino.com", - "partylikeits1986.org", "partypoker.com", - "pascherbeatsmonster.com", - "pase.ac.uk", - "pashtovoa.com", - "pasionmujeres.com", - "paskoocheh.com", - "passion-hd.com", "passion.com", "passiontimes.hk", - "passport.net", "passwords.google", - "pastahealth.com", "paste.ee", "pastebin.com", "pastie.org", - "paston.ac.uk", - "patentgold.net", - "patenttruth.org", - "path.ac.uk", - "pathcal.ac.uk", "pathtosharepoint.com", - "pathways.ac.uk", - "pathwaystohe.ac.uk", "patreon.com", - "patreoncommunity.com", "patreonusercontent.com", - "patsy.ac.uk", - "paul-mellon-centre.ac.uk", - "paulmelloncentre.ac.uk", - "paulsimon-music.com", - "pavpal.com", "pawoo.net", "paxful.com", - "paxlicense.org", - "paydiant.com", - "paygonline.com", - "payhulu.com", - "paylike.com", - "paypa1.com", - "paypa1.org", - "paypaal.com", - "paypal-activate.com", - "paypal-activate.info", - "paypal-activate.org", - "paypal-apac.com", - "paypal-apps.com", - "paypal-biz.com", - "paypal-brandcentral.com", - "paypal-business.com", - "paypal-business.net", - "paypal-business.org", - "paypal-cardcash.com", - "paypal-cash.com", - "paypal-center.com", - "paypal-center.info", - "paypal-center.net", - "paypal-center.org", - "paypal-communication.com", - "paypal-communications.com", - "paypal-communications.net", - "paypal-community.com", - "paypal-community.net", - "paypal-comunidad.com", - "paypal-corp.com", - "paypal-database.com", - "paypal-database.us", - "paypal-donations.com", - "paypal-dynamic.com", - "paypal-engineering.com", - "paypal-europe.com", - "paypal-excelinvoicing.com", - "paypal-exchanges.com", - "paypal-forward.com", - "paypal-galactic.com", - "paypal-gift.com", - "paypal-gifts.com", - "paypal-gpplus.com", - "paypal-here.com", - "paypal-hrsystem.com", - "paypal-innovationlab.com", - "paypal-integration.com", - "paypal-japan.com", - "paypal-knowledge.com", - "paypal-labs.com", - "paypal-latam.com", - "paypal-learning.com", - "paypal-login.com", - "paypal-login.info", - "paypal-login.org", - "paypal-login.us", - "paypal-luxury.com", - "paypal-mainstreet.net", - "paypal-marketing.com", - "paypal-media.com", - "paypal-merchantloyalty.com", - "paypal-mobilemoney.com", - "paypal-network.org", - "paypal-notice.com", - "paypal-notify.com", - "paypal-online.info", - "paypal-online.net", - "paypal-online.org", - "paypal-optimizer.com", - "paypal-pages.com", - "paypal-photocard.com", - "paypal-plaza.com", - "paypal-portal.com", - "paypal-prepagata.com", - "paypal-prepagata.net", - "paypal-prepaid.com", - "paypal-profile.com", - "paypal-proserv.com", - "paypal-qrshopping.org", - "paypal-recargacelular.com", - "paypal-redeem.com", - "paypal-referral.com", - "paypal-retail.com", - "paypal-scoop.com", - "paypal-search.com", - "paypal-secure.net", - "paypal-secure.org", - "paypal-security.net", - "paypal-security.org", - "paypal-service.org", - "paypal-signin.com", - "paypal-signin.us", - "paypal-special.com", - "paypal-specialoffers.com", - "paypal-sptam.com", - "paypal-status.com", - "paypal-support.com", - "paypal-survey.com", - "paypal-survey.org", - "paypal-team.com", - "paypal-viewpoints.net", - "paypal.ca", - "paypal.com", - "paypal.com.hk", - "paypal.com.sg", - "paypal.hk", - "paypal.info", - "paypal.jp", - "paypal.me", - "paypal.so", - "paypal.us", - "paypalbeacon.com", - "paypalbenefits.com", - "paypalbrasil.com", - "paypalcommunity.com", - "paypalcommunity.net", - "paypalcommunity.org", - "paypalcorp.com", - "paypalcredit.com", - "paypalcreditcard.com", - "paypalgivingfund.org", - "paypalhere.com", - "paypalhere.info", - "paypalhere.net", - "paypalhere.org", - "paypalhere.tv", - "paypali.net", - "paypalinc.com", - "paypalindia.com", - "paypalinsuranceservices.org", - "paypall.com", - "paypallabs.com", - "paypalme.com", - "paypalnet.net", - "paypalnet.org", - "paypalnetwork.info", - "paypalnetwork.net", - "paypalnetwork.org", - "paypalobjects.com", - "paypalonline.net", - "paypalonline.org", - "paypalprepagata.com", - "paypalprepagata.net", - "paypalservice.com", - "paypalshopping.com", - "paypalshopping.net", - "paypalsurvey.com", - "paypalx.com", - "paypaly.com", - "paypass.net", - "payppal.com", - "payserve.com", - "paysitesreviews.net", - "payypal.com", - "pbabes.com", - "pbjar1205.pro", - "pble.ac.uk", "pbs.org", "pbwiki.com", "pbworks.com", "pbxes.com", "pbxes.org", - "pc.com", - "pca.ac.uk", - "pca.st", - "pcad.ac.uk", - "pcae.ac.uk", "pcanywhere.net", "pcc.gov.tw", - "pccw.com", - "pccwglobal.com", - "pccwsolutions.com", "pcdvd.com.tw", - "pcfe.ac.uk", - "pcfeonline.ac.uk", "pcgamestorrents.com", "pchome.com.tw", "pchomeec.tw", - "pchomeonline.com.tw", - "pchomepay.com.tw", "pcij.org", - "pcl.ac.uk", "pcloud.com", - "pcloud.tw", "pcmarket.com.hk", - "pcmd.ac.uk", - "pcre.org", "pcstore.com.tw", "pct.org.tw", - "pctlwm.com", - "pcydds.ac.uk", "pdetails.com", - "pdf.new", - "pdi.ac.uk", - "pdncommunity.com", "pdproxy.com", - "pds.ac.uk", - "pdxbmw.com", "peace.ca", "peacefire.org", "peacehall.com", - "peach-cherry.com", - "peachy18.com", - "peachyforum.com", - "peacocktv.com", - "pearl.ac.uk", "pearlher.org", - "pearson-anaya.com", - "pearson-intl.com", - "pearson-schule.ch", - "pearson-studium.ch", - "pearson.ch", - "pearson.cl", - "pearson.co.in", - "pearson.co.jp", - "pearson.com", - "pearson.com.ar", - "pearson.com.au", - "pearson.com.hk", - "pearson.com.uy", - "pearson.es", - "pearson.fr", - "pearson.pl", - "pearsonactivelearn.com", - "pearsonassessment.be", - "pearsonassessment.de", - "pearsonassessment.dk", - "pearsonassessment.fr", - "pearsonassessment.nl", - "pearsonassessment.no", - "pearsonassessment.se", - "pearsonassessments.com", - "pearsonbusinessschool.ac.uk", - "pearsoncanada.ca", - "pearsonclinical.be", - "pearsonclinical.ca", - "pearsonclinical.co.uk", - "pearsonclinical.com.au", - "pearsonclinical.com.br", - "pearsonclinical.de", - "pearsonclinical.dk", - "pearsonclinical.es", - "pearsonclinical.eu", - "pearsonclinical.fr", - "pearsonclinical.in", - "pearsonclinical.nl", - "pearsonclinical.no", - "pearsonclinical.se", - "pearsoncmg.com", - "pearsoncollege.ac.uk", - "pearsoncollegelondon.ac.uk", - "pearsoncred.com", - "pearsoned.co.nz", - "pearsoned.com", - "pearsoneducacion.net", - "pearsoneducationbooks.com", - "pearsonelt.ch", - "pearsonelt.com", - "pearsonenespanol.com", - "pearsonhighered.com", - "pearsoninstitute.ac.za", - "pearsonlongman.ch", - "pearsononlineacademy.com", - "pearsonperu.pe", - "pearsonplaces.com.au", - "pearsonschoolsandfecolleges.co.uk", - "pearsonvue.com", - "pearsonvue.net", - "peas.ac.uk", - "pec.ac.uk", - "pedagogicequality.ac.uk", "peeasian.com", - "peekvids.com", - "peep.ac.uk", - "peepholecam.com", - "peerj.com", - "peerlearning.ac.uk", "peing.net", "pekingduck.org", - "pelvicexam.info", - "pembrokeshire.ac.uk", - "pembs.ac.uk", "pemulihan.or.id", "pen.io", "penchinese.com", "penchinese.net", - "pencoed.ac.uk", - "pendcoll.ac.uk", - "pengwerncollege.ac.uk", - "peninsula.ac.uk", - "peninsular.ac.uk", - "penisbot.com", - "pennine.ac.uk", - "pensions-expert.com", + "pendrivelinux.com", "pentalogic.net", "penthouse.com", - "pentium.com", - "pentium.net", "pentoy.hk", - "penwith.ac.uk", - "penwithcollege.ac.uk", - "penybont.ac.uk", - "penzance.ac.uk", "peoplebookcafe.com", - "peopledreamfunding.com", - "peoplelikeyou.ac.uk", "peoplenews.tw", - "peoples.ac.uk", "peopo.org", - "pepa.ac.uk", "percy.in", "perfect-privacy.com", - "perfected.ac.uk", "perfectgirls.net", - "perfectgonzo.com", - "perfectkickz.net", - "perfectnaked.com", - "perfectsexnow.com", - "perfectshemales.com", - "perfecttitspics.com", "perfectvpn.net", - "performancescience.ac.uk", "periscope.tv", - "perl.org", "perplexity.ai", - "persagg.com", "persecutionblog.com", - "pershore.ac.uk", - "persianepochtimes.com", "persiankitty.com", - "person.com", - "personaltrainermath.com", - "personeelsland.com", - "perth.ac.uk", - "perthcoll.ac.uk", - "pervclips.com", - "perverse.sex", - "perverttube.com", - "petardas.com", - "petardas.xxx", - "petardashd.com.ve", - "peterborough.ac.uk", - "petite.one", - "petiteamateurteen.com", - "petiteballerinasfucked.com", - "petitehdporn.com", - "petroc.ac.uk", "pfd.org.hk", - "pggc.ac.uk", - "pgreen.ac.uk", - "pgyy67.top", - "phantomjs.org", "phapluan.org", - "pharmacy.ac.uk", - "pharmacyschools.ac.uk", - "pharmacyschoolscouncil.ac.uk", "phayul.com", - "phc.ac.uk", - "phdcymru.ac.uk", - "pheds-dtc.ac.uk", - "pheonix.money", - "phes.ac.uk", "philborges.com", - "philtar.ac.uk", - "phimsex47.club", - "phimsexhentai.me", - "phimsexkhongche.cyou", - "phimsexnhanh.club", "phmsociety.org", "phncdn.com", - "phoenix.ac.uk", "phonegap.com", - "photo-image.monster", "photodharma.net", "photofocus.com", - "photolia.net", - "photonics.ac.uk", - "photonicssociety.org", - "photos18.com", - "photoshop.com", - "php.net", + "photonmedia.net", "phprcdn.com", "phptutorial.net", - "phr.ac.uk", - "phun.org", "phuquocservices.com", - "phxbmw.com", - "physicalexam.info", - "physiology.org", - "pi-project.ac.uk", - "pi-vr.com", - "piapp.com.tw", - "piapro.net", - "picacg2022.com", - "picacgp.com", - "picacgy.com", - "picacn.xyz", + "piaotia.com", "picacomic.com", - "picacomic.xyz", "picacomiccn.com", - "picasa.com", "picasaweb.com", - "picasaweb.net", - "picasaweb.org", - "pichunter.com", "picidae.net", - "picker.ac.uk", - "pickereurope.ac.uk", - "pickering.ac.uk", - "pickinguppussy.com", - "picknicekicks.net", - "pickshoesclothes.com", - "picnik.com", - "picpost.com", - "pics.ee", - "pics.vc", - "picsee.co", - "picsee.pro", - "pictoa.com", - "pictocum.com", "picturedip.com", "picturesocial.com", - "pieceofplastic.com", - "pier18.ac.uk", - "pifpafarabia.com", + "picuki.com", "pigav.com", - "piirus.ac.uk", - "pikabu.monster", - "pikpak.me", - "pikpakdrive.com", - "pilgrimageandcathedrals.ac.uk", - "pilgrimagestudies.ac.uk", - "pillbeatsblackfridaysale.com", "pimg.tw", "pin-cong.com", - "pin.it", "pin6.com", - "pinata.cloud", "pincong.rocks", - "pinduck.com", - "pinflix.com", "ping.fm", - "ping.pe", - "ping.sx", - "pingguotv.xyz", - "pingxiangpuer.com", "pinimg.com", - "pinkcore.com", - "pinkcore.net", - "pinkdh-bb.sbs", - "pinkdino.com", - "pinkporno.com", - "pinkpussy.tv", "pinkrod.com", - "pinksporn.com", - "pinkvelvetvault.com", - "pinkworld.com", "pinoy-n.com", "pinterest.at", - "pinterest.be", "pinterest.ca", - "pinterest.ch", - "pinterest.cl", - "pinterest.co", - "pinterest.co.at", - "pinterest.co.in", - "pinterest.co.kr", - "pinterest.co.nz", "pinterest.co.uk", "pinterest.com", - "pinterest.com.au", - "pinterest.com.bo", - "pinterest.com.ec", - "pinterest.com.mx", - "pinterest.com.pe", - "pinterest.com.py", - "pinterest.com.uy", - "pinterest.com.vn", "pinterest.de", "pinterest.dk", - "pinterest.ec", - "pinterest.engineering", - "pinterest.es", "pinterest.fr", - "pinterest.hu", - "pinterest.id", - "pinterest.ie", - "pinterest.in", - "pinterest.info", - "pinterest.it", "pinterest.jp", - "pinterest.kr", - "pinterest.map.fastly.net", - "pinterest.mx", - "pinterest.net", "pinterest.nl", - "pinterest.nz", - "pinterest.pe", - "pinterest.ph", - "pinterest.pt", - "pinterest.ru", "pinterest.se", - "pinterest.th", - "pinterest.tw", - "pinterest.uk", - "pinterest.vn", - "pinterestmail.com", - "pintool.com", - "pion.ac.uk", "pionex.com", - "pipebots.ac.uk", "pipii.tv", "piposay.com", "piraattilahti.org", - "piratecams.com", - "pirates-forum.org", - "pirbright.ac.uk", "piring.com", - "pirouvr.com", - "piru.ac.uk", - "pise.pw", - "pitch-in.ac.uk", - "pittpatt.com", - "pivotalinitiative.com", - "piwheels.org", - "pixanalytics.com", - "pixapp.net", - "pixate.com", "pixeldrain.com", "pixelqi.com", - "pixfs.net", - "pixhost.to", - "pixinsight.com.tw", - "pixiv.co.jp", - "pixiv.me", "pixiv.net", "pixiv.org", - "pixlr-o-matic.com", - "pixlromatic.com", - "pixnet.cc", + "pixivsketch.net", "pixnet.in", "pixnet.net", - "pixnet.pro", - "pixnet.tw", - "pixplug.in", - "pixtronix.com", - "pjbyj.top", - "pjful-app.lol", - "pjgirls.com", "pk.com", - "pki-post.ch", - "pki-posta.ch", - "pki-poste.ch", "pki.goog", + "pkqjiasu.com", + "pkuanvil.com", "placemix.com", - "placemyad.com.au", - "placesdocs.com", - "plala.or.jp", - "planetminecraft.com", - "planetsuzy.org", - "plansondemand.com", - "plant-phenomics.ac.uk", - "plantsvszombies2.com", - "plasticlabs.com", - "plastics-cadcam.com", - "platinumlinks.org", "play-asia.com", - "play-bmm.shop", - "play-bmmer.buzz", - "play-fe.googleapis.com", - "play.googleapis.com", - "play4free.com", - "playapex.com", - "playartifact.com", - "playbar.biz", "playbeasts.com", "playboy.com", "playboyplus.com", - "playbydurex.com", - "playcover.io", "player.fm", - "playerjs.io", - "playforceone.com", - "playhearthstone.com", - "playmation.com", - "playmeow.com", - "playnintendo.com", "playno1.com", - "playoverwatch.com", - "playparagon.com", "playpcesor.com", - "playporngame.com", - "playporngames.com", - "playpornogames.com", "plays.com.tw", - "playsexgames.xxx", - "playsexygame.com", - "playshow.io", - "playshowtv.com", - "playstation.com", - "playstation.net", - "playvalorant.com", - "playvids.com", - "playwarcraft3.com", - "playyoungtube.com", - "playz.jp", - "pldfscotland.ac.uk", - "pleasefuck.org", - "pleasurebabe.com", - "pleasuregirl.net", - "pleasuremore.com", "plexvpn.pro", "plixi.com", "plm.org.hk", - "plos.org", - "plug-into.com", - "plug.game", - "plumperpass.com", - "plumpton.ac.uk", - "plumptononline.ac.uk", "plunder.com", "plurk.com", - "plus.ac.uk", "plus.codes", "plus28.com", "plusbb.com", - "plusone8.com", - "plusporn.net", - "pluto.tv", - "plutotv.net", - "plym.ac.uk", - "plymouth-marine-laboratory.ac.uk", - "plymouth.ac.uk", - "plymouthart.ac.uk", - "plymouthcfe.ac.uk", - "plymsea.ac.uk", - "plzpf.com", - "pm.me", "pmatehunter.com", "pmates.com", - "pml.ac.uk", - "pms.ac.uk", - "pnas.org", "po2b.com", "pobieramy.top", - "pobl-content.com", - "pocketbiketrader.com", - "pocketcasts.com", "podbean.com", "podcast.app", "podcast.co", "podictionary.com", - "podium.ac.uk", "poe.com", - "poecdn.net", - "pogo.com", - "pogobeta.com", - "poi.moe", - "point.ac.uk", - "pointblank.ac.uk", - "pointblankmusicschool.ac.uk", - "poisontube.com", - "pojapp.cfd", - "pojbayj1030.top", - "pojie7.com", - "pojiefuli20033.xyz", - "pojiefuli9113.xyz", - "pokedex3d.com", - "pokemon-moon.com", - "pokemon-sun.com", - "pokemon-sunmoon.com", - "pokemon-unitepgame.com", - "pokemon.com", - "pokemonbank.com", - "pokemonblackwhite.com", - "pokemonbw.com", - "pokemonchampionships.com", - "pokemongoldsilver.com", - "pokemonhome.com", - "pokemonletsgoeevee.com", - "pokemonletsgopikachu.com", - "pokemonmysterydungeon.com", - "pokemonpicross.com", - "pokemonplatinum.com", - "pokemonrubysapphire.com", - "pokemonsunmoon.com", - "pokemonswordshield.com", - "pokemonultrasunmoon.com", - "pokemonvgc.com", - "pokemonwifi.net", + "points-media.com", "pokerstars.com", "pokerstars.net", "pokerstrategy.com", - "pol.ac.uk", - "political-science.ac.uk", "politicalchina.org", "politicalconsultation.org", "politico.eu", - "politicsblog.ac.uk", - "politicsinaction.ac.uk", "politiscales.net", "poloniex.com", - "poly-of-wales.ac.uk", - "polygon.com", + "polymarket.com", "polymer-project.org", "polymerhk.com", - "polymerproject.org", - "poms.ac.uk", - "pone.ac.uk", - "pontypridd.ac.uk", - "ponyanimalsex.com", - "poofetish.com", - "pooleacl.ac.uk", + "poolbinance.com", "poolin.com", - "poop-pee.online", - "poopee-puke.com", - "poopeegirls.com", - "popcap.com", - "popjav.tv", + "popai.pro", "popo.tw", - "popo8.com", - "popporn-world.com", "popvote.hk", "popxi.click", "popyard.com", "popyard.org", - "porcore.com", - "poringa.net", - "porkahd.co", - "porkbun.com", - "porm.club", - "porn-bokep.com", - "porn-comic.com", - "porn-discounts.com", - "porn-discounts.xxx", - "porn-gratis.info", - "porn-images-xxx.com", - "porn-list.site", - "porn-portal.com", - "porn-sex-video.me", - "porn-star.com", "porn.biz", "porn.com", - "porn.to", - "porn.xxx", "porn2.com", - "porn2012.com", - "porn300.com", - "porn300.online", - "porn34.me", - "porn3dgalleries.com", - "porn4days.cc", - "porn4fap.com", "porn5.com", - "porn555.com", - "porn5f.com", - "porn62.com", - "porn7.net", - "porn7.xxx", - "porn87.com", - "porn91.org", - "porn93.cc", - "pornachi.com", - "pornacho.com", - "pornadoo.com", - "pornaf.com", - "pornaffected.com", - "pornandxxxvideos.com", - "pornaroma.com", - "pornav.co", - "pornaxo.com", "pornbase.org", - "pornbest.org", - "pornbit.cc", - "pornbl.com", - "pornbozz.com", - "pornbraze.com", - "pornburger.com", - "pornburst.xxx", - "porncana.com", - "porncoil.com", - "porncomics.com", - "porncomics.me", - "porncomixonline.net", - "porncore.net", - "porncoven.com", - "porncrash.com", - "porndabster.com", - "porndeals.com", - "porndeepfake.net", - "porndex.com", - "porndiamond.com", - "porndig.com", - "porndigger.me", - "porndiscount.org", - "porndiscounts.com", - "porndish.com", - "porndisk.com", - "pornditos.com", - "porndoe.com", - "porndoepremium.com", - "porndork.com", - "porndr.com", - "porndroids.com", - "porndude2.com", - "porndudecasting.com", - "pornelephant.com", - "pornenix.com", - "porner.tv", "pornerbros.com", - "pornexpress.net", - "pornfactory.info", - "pornfhd.com", - "pornfidelity.com", - "pornfind.org", - "pornfinder.biz", - "pornflip.com", - "pornfoolery.com", - "pornfu.tv", - "pornfuck.net", - "pornfuror.com", - "porngames.club", - "porngames.com", - "porngames.games", - "porngames.tv", - "porngameshub.com", - "porngamesverse.com", - "porngeek.com", - "porngem.com", - "porngifs.xxx", - "porngladiator.com", - "porngo.com", - "porngo.tube", - "porngrabbz.com", - "porngub.com", - "pornguide.blog", - "pornguz.com", - "pornhail.com", - "pornhat.com", - "pornhat.one", - "pornhat.tv", "pornhd.com", - "pornhd3x.tv", - "pornhd8k.net", - "pornhdfuck.com", - "pornhdtube.tv", - "pornhdvideos.tv", - "pornheed.com", - "pornheli.com", - "pornhits.com", - "pornhoho.com", "pornhost.com", - "pornhub-deutsch.info", - "pornhub-deutsch.net", - "pornhub-german.com", - "pornhub-sexfilme.net", "pornhub.com", - "pornhub.org", - "pornhub00.com", - "pornhubapparel.com", "pornhubdeutsch.net", "pornhubpremium.com", - "pornhubs.video", - "pornhubselect.com", - "pornhun.xyz", - "pornhutdeutsch.com", - "pornicom.com", - "pornid.xxx", - "pornimg.xyz", - "porniq.com", - "pornirani.com", - "pornjam.com", - "pornjav.org", - "pornjk.com", - "pornkai.com", - "pornkind.net", - "pornking.fun", - "pornkino.cc", - "pornkro.com", - "pornktube.com", - "pornky.com", - "pornlaundry.com", - "pornlegendsclub.com", - "pornlist18.com", - "pornlistdude.com", - "pornloser.com", - "pornlulu.com", - "pornluxme.com", - "pornma.com", - "pornmadeathome.com", - "pornmagnet.org", - "pornmaki.com", - "pornmaster.fun", - "pornmate.com", - "pornmaturetube.com", - "pornmd.com", - "pornmegaload.com", - "pornmemo.com", "pornmm.net", - "pornmonde.com", - "pornmovies2.me", - "pornmoviescave.com", - "pornmz.com", - "pornmz.net", - "pornnetworkdeals.com", - "pornnut.com", - "porno-erotica.com", - "porno.org.in", - "porno365.net", - "porno365.website", - "porno49.com", - "pornoaid.com", - "pornoamateurlatino.net", - "pornobae.com", - "pornobengala.com", - "pornoboard.net", - "pornoboliviaxxx.com", - "pornobom.com.br", - "pornobox.net", - "pornobrasil.blog.br", - "pornobrasil.com", - "pornobrasil.org", - "pornobrasileiro.tv", - "pornobrasileiro.xyz", - "pornobuzz.net", - "pornocarioca.com", - "pornocaserotube.com", - "pornocd.ru", - "pornocomic.net", - "pornodanke.com", - "pornodoido.com", - "pornodrome.tv", - "pornoecuadorxxx.com", - "pornoelena.net", - "pornofiles.ru", - "pornofilmlist.com", - "pornofint.com", - "pornofrog.com", - "pornogayphy.com", - "pornogids.net", - "pornogram.xxx", - "pornogramxxx.com", - "pornogratis.vlog.br", - "pornogrund.com", - "pornohd.blue", - "pornohd.plus", - "pornohd.porn", - "pornohoo.com.mx", - "pornohut.info", - "pornohutdeutsch.net", - "pornoid.com", - "pornoincreible.com", - "pornoingyen.hu", - "pornoirado.com", - "pornoitaliano.com", - "pornojefe.com", - "pornojux.com", - "pornoko.net", - "pornokrol.com", - "pornolab.net", - "pornolaba.mobi", - "pornolandia.xxx", - "pornomasse.com", - "pornomineiro.com", - "pornomovies.mobi", - "pornone.com", - "pornoorzel.com", - "pornoprive.xxx", - "pornoreino.com", - "pornorips.com", - "pornos.live", - "pornoscanner.com", - "pornosex.cam", - "pornosfilmes.com", - "pornoslon.me", - "pornosphere.com", - "pornotime.net", - "pornotree.com", - "pornotron.net", - "pornotube.blog.br", - "pornotube69.nl", - "pornov1080.name", - "pornovenezolano.com.ve", - "pornovenezolanox.com", - "pornovideosfree.net", - "pornovideoshub.com", - "pornovideow.com", - "pornoweb.hu", - "pornoweb.win", "pornoxo.com", - "pornozona.tv", - "pornpair.com", - "pornpander.com", - "pornpaw.com", - "pornpen.ai", - "pornper.com", - "pornpics.com", - "pornpost.net", - "pornpros.com", - "pornprosnetwork.com", - "pornproxy.app", - "pornqd.com", - "pornrabbit.com", "pornrapidshare.com", - "pornreactor.cc", - "pornrips.cc", - "pornrox.com", - "pornscat.org", - "pornscum.com", - "pornsexer.com", - "pornshare.biz", "pornsharing.com", - "pornsites.com", - "pornsites.xxx", - "pornsitesnow.com", "pornsocket.com", - "pornsoldiers.com", - "pornsos.com", - "pornspark.com", "pornstarbyface.com", "pornstarclub.com", - "pornstreams.tv", - "pornstripgames.com", - "porntea.com", - "pornteen123.com", - "porntn.com", - "porntop.com", - "porntoplinks.com", - "porntrex.com", - "porntry.com", - "porntsunami.com", "porntube.com", "porntubenews.com", - "porntubent.com", - "porntv.com", "porntvblog.com", - "pornuj.cz", - "pornultras.com", - "pornv.org", - "pornve.com", - "pornvibe.org", - "pornvideobb.com", - "pornvideos.casa", - "pornvideotop.com", - "pornvideotube.online", - "pornvidhd.club", "pornvisit.com", - "pornwatchers.com", - "pornwebmasters.com", - "pornwhite.com", - "pornwhitelist.com", - "pornwild.to", - "pornworld.to", - "pornxnxxmovies.com", - "pornxp.com", - "pornxp.net", - "pornxp.org", - "pornxs.com", - "pornxvideos.tv", - "pornxvideos.win", - "pornxxxmovies.cc", - "pornxxxplace.com", - "pornxxxweb.com", - "pornyeah.com", - "pornyteen.com", - "pornzog.com", - "pornzone.com", - "porstoporno.site", - "port.ac.uk", "port25.biz", "portablevpn.nl", - "portfolio.ac.uk", - "portfoliowall.com", - "porth.ac.uk", - "portland.ac.uk", - "portsmouth-college.ac.uk", - "portsmouth.ac.uk", - "portsmouthuni.ac.uk", - "porzo.com", - "porzo.tv", - "poshtestgallery.cloudapp.net", - "poshtestgallery.com", - "positivessl.com", "poskotanews.com", "post01.com", "post76.com", "post852.com", "postadult.com", - "postegro.it", - "postgrad.ac.uk", - "postgraducas.ac.uk", - "postgresql.org", - "postimages.org", - "postimg.cc", "postimg.org", - "postini.com", - "posty.kr", - "postyourgirls.ws", "potato.im", - "potenza.jp", - "potteries.ac.uk", - "potterieseducationaltrust.ac.uk", + "potatso.com", "potvpn.com", "pourquoi.tw", - "poverty.ac.uk", - "povpornonly.com", - "povr.com", - "pow.ac.uk", "power.com", - "poweranimator.com", "powerapple.com", - "powerappscdn.net", - "powerautomate.com", - "powerbeats2wireless.com", - "powerbeatsbydrdre.com", - "powerbeatsbydre.com", - "powerbi.com", - "powerbook.eu", "powercx.com", - "poweredbyintel.com", - "powerelectronics.ac.uk", - "powerinspect.com", - "powermill.com", - "powermillna.com", - "powerofresolve.ca", - "powerofresolve.com", "powerphoto.org", "powerpointninja.com", - "powershape-e.com", - "powershape.com", - "powershellgallery.com", - "powersunitedvr.com", - "powia.ac.uk", - "pp-soc.com", "pp.ru", - "pp6.info", - "pparc.ac.uk", - "ppaypal.com", - "ppb-mod.buzz", - "ppe.lawyer", - "pplah.com", - "pplusstatic.com", - "ppp91.cc", - "pppds.com", - "ppre.ac.uk", "ppy.sh", - "practicalbusinessskills.com", - "practicalmoneyskills.ca", - "practicalmoneyskills.jp", - "practicum.ac.uk", - "pramu.ac.uk", - "prastitutki.ru", "prayforchina.net", - "pre-bmwgroup.jobs", - "predictivetechnologies.com", "premeforwindows7.com", - "premia.ac.uk", - "premium-beauty.com", - "premiumfs.de", - "premiumhd.net", - "premiumpornlist.com", - "premobay.com", "premproxy.com", - "preprod-publicca.googleapis.com", - "prepsure.com", - "prescribe.ac.uk", - "prescribingsafetyassessment.ac.uk", + "presentation.new", "presentationzen.com", - "presidencylondoncollege.ac.uk", "presidentlee.tw", - "press.vin", - "pressreader.com", "prestige-av.com", - "preston.ac.uk", - "prestoncoll.ac.uk", - "pretty-ass.xyz", - "prettynubiles.com", "prettyvirgin.com", - "priceless.com", - "priceless.org", - "pricelessafrica.com", - "pricelessarabia.com", - "pricelessaruba.com", - "pricelessbeijing.com", - "pricelesshongkong.com", - "pricelesshonolulu.com", - "pricelessmarketingengine.com", - "pricelesspick.com", - "pricelesssantiago.com", - "pricelesssurprises.com", - "pricelesssydney.com", - "pricelesstoronto.ca", - "pricelesstv.com", - "priconne-redive.jp", "pride.google", - "pridetube.com", - "priestley.ac.uk", - "priestleycollege.ac.uk", - "prifysgolioncymru.ac.uk", - "primarygoal.ac.uk", - "prime-video.com", - "primecurves.com", - "primeday.info", - "primeindianporn.com", - "primematures.com", - "primepornlist.com", - "primevideo.cc", "primevideo.com", - "primevideo.info", - "primevideo.org", - "primevideo.tv", - "princesscum.com", - "princeton.edu", - "principlesinpatterns.ac.uk", - "printeron.com", - "printersetupsupport.com", "printfriendly.com", - "printspots.com", - "printspots.net", - "prioned.ac.uk", "prism-break.org", - "prism.ac.uk", - "prismic.io", - "prismlauncher.org", - "prismlive.com", "prisoneralert.com", "pritunl.com", "privacybox.de", - "privacysandbox.com", - "privacysimplified.com", - "privacytools.io", "private.com", - "privatebrowsingmyths.com", - "privatecasting-x.com", - "privateclassics.com", "privateinternetaccess.com", - "privatemarketplaces.net", - "privatemarketplaces.us", "privatepaste.com", "privatetunnel.com", - "privatevoyeurvideos.com", "privatevpn.com", - "privelt.ac.uk", - "privilege.hk", - "privilege.tw", "privoxy.org", - "proactivebackend-pa.googleapis.com", - "procat.ac.uk", - "procatdigital.ac.uk", - "procatstudent.ac.uk", "procopytips.com", - "proctoscopeexam.com", - "prodrive-japan.com", - "product.co.jp", - "productivemargins.ac.uk", - "profile.ac.uk", - "profilemaster.com", - "profreeporno.com", - "programme3.ac.uk", "prohashing.com", "project-syndicate.org", - "projectapex.com", - "projectara.com", - "projectbaseline.com", - "projecteuclid.org", - "projectjav.com", - "projectmurphy.net", - "projectpoint.com", - "projectpoint.net", - "projectsangam.com", - "projectshoreline.com", - "projectvasari.com", - "projectvoyeur.com", - "promonsterbeatsbydre.com", - "promotingpartnership.ac.uk", - "proms.ac.uk", - "pron.guru", - "propagandastudies.ac.uk", - "property.com.au", - "propertysex.com", - "proporn.com", - "proptiger.com", - "proquest.com", - "pros.ee", "prosiben.de", - "prospects.ac.uk", - "prostoporno.net", - "prostores.com", - "prostudiobeatscybersale.com", - "proteus.ac.uk", - "prothots.com", "proton.me", - "protondb.com", - "protonmail.ch", - "protonmail.com", - "protonstatus.com", "protonvpn.com", - "proudman-oceanographic-lab.ac.uk", - "provide.ac.uk", "provideocoalition.com", "provpnaccounts.com", - "prowe.ac.uk", "proxfree.com", "proxifier.com", "proxlet.com", - "proxomics.ac.uk", "proxomitron.info", "proxpn.com", "proxy.org", "proxy1.xyz", - "proxyadult.org", "proxyanonimo.es", "proxydns.com", "proxylist.org.uk", "proxynetwork.org.uk", "proxypy.net", - "proxyrarbg.org", "proxyroad.com", "proxytunnel.net", + "proxz.com", "proyectoclubes.com", "prozz.net", - "prpops.com", - "prs-ltsn.ac.uk", - "prts.plus", - "prucomm.ac.uk", - "ps-exchange.com", - "psa.ac.uk", "psblog.name", - "psc.ac.uk", - "pscdn.co", - "psci-com.ac.uk", "pscp.tv", - "psds.ac.uk", - "pse.is", - "psg-int-centralus.cloudapp.net", - "psg-int-eastus.cloudapp.net", "pshvpn.com", - "psigate.ac.uk", "psiphon.ca", "psiphon3.com", "psiphontoday.com", - "pssru.ac.uk", "pstatic.net", - "pstorage.space", - "psyccareers.com", "pt.im", - "ptapjmp.com", "pts.org.tw", "ptt.cc", - "ptt.sex", - "ptt2.cc", - "ptt3.cc", "pttgame.com", "ptthito.com", "pttvan.org", "pttweb.cc", "pttyes.com", - "ptzwx.com", - "pu82.vip", - "pub.dev", - "public-sex-porn.com", - "public-trust.com", - "publicagentxxx.com", - "publicca.googleapis.com", - "publicengagement.ac.uk", - "publicinterest.ac.uk", - "publicpornvideo.com", - "publicservices.ac.uk", - "publicsexhub.com", - "publicspace.ac.uk", - "publishproxy.com", - "pubmatic.co.jp", - "pubmatic.com", + "ptwxz.com", "pubu.com.tw", "puffin.com", "puffinbrowser.com", "puffstore.com", - "pugetsoundbmw.com", - "pugetsoundmini.com", - "pugpig-dev.com", - "pugpig-stage.com", "pugpig.com", "pullfolio.com", - "pullstring.net", - "pulsebrowser.app", - "punishbang.com", - "punishworld.com", "punjab.gov.in", "punjab.gov.pk", "punyu.com", - "puppiesofourtime.ac.uk", "pure18.com", "pureapk.com", "pureconcepts.net", "pureinsight.org", - "purelov5.com", - "purelyceleb.com", - "purenudism.com", "purepdf.com", - "puretaboo.com", "purevpn.com", - "purextc.com", - "puripuriunkomura.com", "purplelotus.org", - "pursglove.ac.uk", "pursuestar.com", - "pururin.to", "pushchinawall.com", "pussthecat.org", - "pussy-pics.net", - "pussy3dporn.com", - "pussyboy.net", - "pussymomsex.com", - "pussyporntubes.com", - "pussysexgames.com", - "pussyshine.info", "pussyspace.com", - "pussyspace.net", "putihome.org", - "putinho.net", "putlocker.com", "putty.org", "puuko.com", - "pvp.net", - "pvp.tv", - "pvt.sexy", - "pvue1.com", - "pvue2.com", - "pvzgw2.com", - "pvzheroes.com", - "pwabuilder.com", - "pwmnet.com", "pwned.com", - "pwnedpasswords.com", "pximg.net", - "pxt.io", - "pycon.org", - "pypa.io", - "pypi.io", - "pypi.org", - "pypl.com", - "pypl.info", - "pypl.net", - "pypl.tv", - "pyrobot.org", "python.com", "python.com.tw", - "python.org", "pythonhackers.com", - "pythonhosted.org", "pythonic.life", "pytorch.org", - "pzforever.skin", - "pzforever01.homes", - "pzhanfor.today", - "q10.jp", - "q13.com", - "q13fox.com", - "qaa.ac.uk", - "qac.ac.uk", - "qacollege.ac.uk", "qanote.com", - "qatarescortsvip.com", - "qattdh.cc", - "qattdh.top", - "qattdh1.cc", - "qattdh2.cc", - "qattdh6.top", "qbittorrent.org", - "qbmengmei6.mom", - "qbsc.ac.uk", - "qcmod.xyz", - "qctconnect.com", - "qdiehzz7.me", - "qeliz.ac.uk", "qgirl.com.tw", "qhigh.com", "qi-gong.me", "qianbai.tw", "qiandao.today", + "qianglie.com", "qiangwaikan.com", "qiangyou.org", + "qianmo.tw", "qidian.ca", "qienkuen.org", - "qinav.com", - "qingse.one", - "qise100.com", "qiwen.lu", "qixianglu.cn", "qkshare.com", - "qlink.to", - "qmap.pub", - "qmbsc.ac.uk", - "qmc.ac.uk", - "qmced.ac.uk", - "qml.ac.uk", - "qmov.com", - "qmov.net", - "qmpgmc.ac.uk", - "qmttqg3k.me", - "qmu.ac.uk", - "qmuc.ac.uk", - "qmul.ac.uk", - "qmw.ac.uk", "qmzdd.com", - "qnap.com", - "qombol.com", - "qoo10.jp", - "qooqlevideo.com", "qoos.com", - "qorno.com", - "qoru.ac.uk", "qpoe.com", - "qporno.xxx", - "qprize.com", "qq.co.za", - "qqbs.asia", - "qqbs.work", - "qr.ae", - "qsi.ac.uk", - "qso.ac.uk", "qstatus.com", - "qt-project.org", - "qt.io", - "qtlglb.com", "qtrac.eu", "qtweeter.com", - "quadram.ac.uk", - "quadraminstitute.ac.uk", - "quadrat.ac.uk", - "qualcomm-email.com", - "qualcomm.co.id", - "qualcomm.co.in", - "qualcomm.co.jp", - "qualcomm.co.kr", - "qualcomm.co.uk", - "qualcomm.com", - "qualcomm.com.br", - "qualcomm.com.tw", - "qualcomm.de", - "qualcomm.fr", - "qualcommhalo.com", - "qualcommlabs.com", - "qualcommmea.com", - "qualcommretail.com", - "qualcommventures.cn", - "qualcommventures.com", - "qualidata.ac.uk", - "qualphone.com", - "quanben-xiaoshuo.com", - "quanben.io", "quannengshen.org", - "quantic.ac.uk", - "quantil.com", - "quantitativemethods.ac.uk", "quantumbooter.net", - "quatrowireless.com", - "quatrum.com.br", - "quay.io", - "quayside.ac.uk", - "qub.ac.uk", - "queens-belfast.ac.uk", - "queens.ac.uk", - "queensu.ac.uk", - "quercus.ac.uk", "questvisual.com", - "quicinc.com", - "quickconnect.to", - "quickiepage.com", - "quickoffice.com", - "quicktake.video", - "quicktime.cc", - "quicktime.com", - "quicktime.com.au", - "quicktime.eu", - "quicktime.net", - "quicktime.tv", - "quiksee.com", - "quiltmc.org", - "quip-cdn.com", - "quip.com", - "quipelements.com", "quitccp.net", "quitccp.org", "quiz.directory", - "qumingwz.com", - "qumrancavesdispersed.ac.uk", "quora.com", "quoracdn.net", - "quotable.com", - "quovadisglobal.com", "quran.com", "quranexplorer.com", "qusi8.net", - "qutebrowser.org", "qvodzy.org", "qwant.com", - "qwant.de", - "qwant.fr", - "qwant.it", - "qwapi.com", "qx.net", "qxbbs.org", - "qysg.cc", - "qysg7.buzz", - "qysg8.buzz", "qz.com", - "qzav.tv", - "r-project.org", + "r-pool.net", "r0.ru", - "r10s.com", "r10s.jp", "r18.com", - "r18av.com", - "r18lu-avi.shop", - "r18lu.com", - "r34porn.net", - "ra-review.ac.uk", "ra.gg", - "raa.ac.uk", - "rabbitscams.com", - "rabbitscams.sex", - "rabbitsreviews.com", - "rac.ac.uk", - "racals.ac.uk", - "racc.ac.uk", - "racked.com", - "rad-sat.ac.uk", - "rada.ac.uk", - "radeon.com", - "radian6.com", "radicalparty.org", "radiko.jp", "radio-canada.ca", + "radio-en-ligne.fr", "radio.garden", "radioaustralia.net.au", - "radiofarda.com", "radiohilight.net", "radioline.co", - "radiomango.fm", - "radiomarsho.com", - "radioresearch.ac.uk", - "radiosvoboda.org", - "radiotavisupleba.ge", "radiotime.com", "radiovaticana.org", "radiovncr.com", - "radiyoyacuvoa.com", - "rae.ac.uk", "rael.org", - "raft.ac.uk", "raggedbanner.com", "raidcall.com.tw", "raidtalk.com.tw", "rainbowplan.org", "raindrop.io", "raizoji.or.jp", - "rajwaphq.com", - "rakuten-static.com", - "rakuten.ca", "rakuten.co.jp", - "rakuten.com", "rakuten.com.tw", - "rakuten.ne.jp", - "rakuten.tw", - "rakuya.com.tw", - "ram.ac.uk", "ramcity.com.au", - "randd.ac.uk", - "randomsystems-cdt.ac.uk", - "randyblue.com", "rangwang.biz", "rangzen.com", "rangzen.net", "rangzen.org", - "ranranhome.info", "ranxiang.com", "ranyunfei.com", "rapbull.net", - "rapefilms.net", - "rapetube.me", - "rapid.ac.uk", "rapidmoviez.com", - "rapidprototyping-cadcam.com", - "rapidssl.com", "rapidvpn.com", - "raponlinereview.com", - "raratutor.ac.uk", - "rarbg.is", - "rarbg.me", - "rarbg.to", - "rarbgaccess.org", - "rarbgaccessed.org", - "rarbgget.org", - "rarbggo.org", - "rarbgmirror.com", - "rarbgmirror.org", - "rarbgproxy.org", "rarbgprx.org", - "rarbgto.org", - "rarbgunblock.com", - "rarbgunblock.org", - "rarbgunblocked.org", - "rarbgway.org", "raremovie.cc", "raremovie.net", - "rareview.ac.uk", - "ras.ac.uk", - "rascal.ac.uk", - "rascommunity.ac.uk", - "raspberrypi.org", - "raspbian.org", - "rat.xxx", - "ratedgross.com", "rateyourmusic.com", "rationalwiki.org", "ratx.com", - "rau.ac.uk", - "rave.ac.uk", - "ravemedia.ac.uk", - "ravensbourne.ac.uk", - "ravensbourneuniversitylondon.ac.uk", - "ravm.tv", "rawgit.com", "rawgithub.com", "raxcdn.com", - "razer.com", - "razerofficial.com", - "razersupport.com", - "razerzone.jp", "razyboard.com", - "rb-crisis.com", - "rb.com", - "rb.gy", - "rb.net", - "rbbusinessshop.com", - "rbc007.com", - "rbdigitalab.com", - "rbdigitallab.com", - "rbe996.com", - "rbeopp.com", - "rbeuroinfo.com", - "rbge.ac.uk", - "rbgkew.ac.uk", - "rbgrads.com", - "rbgraduates.com", - "rbmavericks.com", - "rbnainternational.com", - "rbplc.com", - "rbrandlibrary.com", - "rbsgr.com", - "rbsl.ac.uk", - "rbslondon.ac.uk", - "rbspeakup.com", - "rc-harwell.ac.uk", - "rca.ac.uk", - "rcahmw.ac.uk", - "rcc.ac.uk", - "rcds.ac.uk", - "rcem.ac.uk", "rcinet.ca", - "rcl.ac.uk", - "rcl07.xyz", - "rclon.com", - "rcm.ac.uk", - "rcnde.ac.uk", - "rcni.ac.uk", - "rcoa.ac.uk", - "rcog.ac.uk", - "rcophth.ac.uk", - "rcp.ac.uk", - "rcpch.ac.uk", - "rcpe.ac.uk", - "rcplondon.ac.uk", - "rcpnorth.ac.uk", - "rcpsg.ac.uk", - "rcpsglasg.ac.uk", - "rcpsych.ac.uk", - "rcr.ac.uk", - "rcs.ac.uk", - "rcsed.ac.uk", - "rcseng.ac.uk", - "rcuk.ac.uk", - "rcukssc.ac.uk", - "rcvs.ac.uk", "rd.com", - "rdf.ac.uk", - "rdg.ac.uk", - "rdi.ac.uk", "rdio.com", - "rdmrsc.ac.uk", - "rdnet.ac.uk", - "rds-yes.buzz", - "rdtcdn.com", - "re-net.ac.uk", - "re25.vip", - "rea-asia.com", - "rea-group.com", - "rea.design", - "rea.global", - "rea.io", - "rea.tech", "reabble.com", - "reach.ac.uk", - "reachingwider.ac.uk", - "reachporn.com", - "reachtheworldonfacebook.com", - "react.com", - "reactjs.com", - "reactjs.org", "read01.com", "read100.com", - "readerswivesonline.com", - "reading-college.ac.uk", - "reading.ac.uk", - "readingosi.ac.uk", "readingtimes.com.tw", "readmoo.com", - "readthedocs-hosted.com", - "readthedocs.com", - "readthedocs.io", - "readthedocs.org", "readydown.com", - "readytoresearch.ac.uk", - "real-homemade-movies.com", - "real-mature-porn.com", - "real-thaipussy.com", - "realamericanstories.com", - "realamericanstories.info", - "realamericanstories.net", - "realamericanstories.org", - "realamericanstories.tv", - "realcaledonian.ac.uk", - "realclear.com", - "realclearbooks.com", - "realcleardefense.com", - "realcleareducation.com", - "realclearenergy.org", - "realclearfoundation.org", - "realclearhealth.com", - "realclearhistory.com", - "realclearinvestigations.com", - "realclearlife.com", - "realclearmarkets.com", - "realclearpolicy.com", - "realclearpolitics.com", - "realclearpublicaffairs.com", - "realclearreligion.org", - "realclearscience.com", - "realclearworld.com", - "realcommercial.com.au", "realcourage.org", - "realcuckoldsex.com", - "realdoll.com", - "realestate.com.au", - "realestatejournal.com", - "realgfporn.com", - "realisingopportunities.ac.uk", - "reality-computing.com", "realitykings.com", - "reallesbianexposed.com", - "reallifemethods.ac.uk", - "realmaturesfuck.com", - "realmilwaukeenow.com", - "realpeople-realprojects.com", - "realpeoplerealprojects.com", - "realpornclip.com", "realraptalk.com", - "realsexdoll.com", "realsexpass.com", - "realteengirls.com", - "realtor.com", - "realtype.co.jp", - "realtype.jp", - "realvision.com", - "realviz.com", - "realzoomovies.com", - "reap.ac.uk", - "reaseheath.ac.uk", "reason.com", - "reastatic.net", - "reaxys.com", - "rebates.jp", "rebatesrule.net", - "rebrandly.com", - "rebuildingmacroeconomics.ac.uk", "recaptcha.net", - "recelebrity.com", - "reckitt.net", - "reckittbenckiser.com", - "reckittbenckiser.net", - "reckittbenckiser.tv", - "reckittprofessional.com", - "recode.net", - "recoiljs.org", - "reconinstruments.com", - "reconjet.com", "recordhistory.org", - "recordingachievement.ac.uk", "recovery.org.tw", "recoveryversion.com.tw", "recoveryversion.org", "red-lang.org", - "redamateurtube.com", "redballoonsolidarity.org", - "redbridge-college.ac.uk", - "redbridge-iae.ac.uk", - "redbridge.ac.uk", - "redbridgeinstitute.ac.uk", "redbubble.com", - "redcar.ac.uk", "redchinacn.net", "redchinacn.org", - "redcliffe.ac.uk", "redd.it", "reddit.com", - "reddit.map.fastly.net", - "redditblog.com", - "reddithelp.com", - "redditinc.com", "redditlist.com", - "redditmail.com", "redditmedia.com", "redditspace.com", "redditstatic.com", - "redditstatus.com", - "redfaptube.com", - "redgifs.com", - "redhat.com", - "redhat.org", - "redhdtube.xxx", "redhotlabs.com", - "redino.tw", - "redis.io", - "redislabs.com", - "redkix.com", - "redlightcenter.com", - "redmatureporn.com", - "redporn.xxx", - "redporno.cz", - "redpornpictures.com", - "redsexhub.com", - "redteenporn.com", - "redtub3xxx.com", - "redtube.blog", "redtube.com", - "redtube.com.br", - "redtube9.com", - "redtubepremium.com", - "redvideo.io", - "redwap-xxx.com", - "redwap.me", - "redwap.pro", - "redxxx.cc", - "redxxxvideo.tv", - "redzonechannel.com", - "ree007.xyz", - "reednet.ac.uk", - "ref.ac.uk", "referer.us", "reflectivecode.com", - "reform-apple.com", - "refrain.ac.uk", - "regard.ac.uk", - "regener8.ac.uk", - "regent-academy.ac.uk", - "regent-college.ac.uk", - "regentcollegelondon.ac.uk", - "regents-tc.ac.uk", - "regents.ac.uk", - "regentscollege.ac.uk", - "regex101.com", - "regional-studies-assoc.ac.uk", - "regionalhpc.ac.uk", - "regionalsciencecentreoldham.ac.uk", - "regionalvisions.ac.uk", - "regiongold.com", - "registerhulu.com", - "registeridm.com", "registry.google", - "reid-kerr.ac.uk", - "reidkerr.ac.uk", - "reigate.ac.uk", - "reiporno.com", - "relateinstitute.ac.uk", - "relateiq.com", + "reimu.net", "relaxbbs.com", "relay.com.tw", "releaseinternational.org", "religionnews.com", "religioustolerance.org", - "reload.ac.uk", - "relu.ac.uk", - "rememberingslavery.ac.uk", - "remirepo.net", - "rems-cdt.ac.uk", - "renaissanceskin.ac.uk", - "renchead.com", - "renderos.com", - "reneerossvideos.com", "renminbao.com", - "renovacionoffice.com", - "renovacionxboxlive.com", - "rentaride.com", - "rentaride.de", - "renu.ac.uk", "renyurenquan.org", - "renzhe.cloud", - "repe21.com", - "repo.new", - "repositorynet.ac.uk", - "repsils.no", - "repsneakermall.com", - "repswing.com", - "rerc.ac.uk", "rerouted.org", - "resao.com", - "research-clinician.ac.uk", - "research-councils.ac.uk", - "research-scotland.ac.uk", - "research-socialsciences.ac.uk", "research.google", - "research4justice.ac.uk", - "researchandcare.org", - "researchconcordat.ac.uk", - "researchers14.ac.uk", - "researchgate.net", - "researchintel.com", - "researchkit.hk", - "researchkit.net", - "researchkit.org", - "researchkit.tv", - "researchscotland.ac.uk", - "researchwales.ac.uk", - "resilient-decarbonised-energy-cdt.ac.uk", - "resilient-decarbonised-energy-dtc.ac.uk", "resilio.com", "resistchina.org", - "resl.ac.uk", - "resoubanana.buzz", - "resoubang.buzz", - "resourceshare.ac.uk", - "respawnbyrazer.com", - "restore.ac.uk", - "results.ac.uk", - "rethink.net", - "retimer.com", - "retroclassicporn.com", - "retrohomevideos.com", - "retroxxxmovs.com", "retweeteffect.com", "retweetist.com", "retweetrank.com", - "reurl.cc", - "reut.rs", "reuters.com", - "reuters.tv", - "reutersagency.cn", "reutersmedia.net", - "revenue-performance-management.com", - "revit.com", - "revitcc.com", - "revitsucks.net", "revleft.com", "revocationcheck.com", - "revolv.com", "revver.com", - "rewind.ac.uk", - "rewrite-anime.tv", - "rexcha.com", - "rexxx.org", "rfa.org", "rfachina.com", "rfamobile.org", "rfaweb.org", - "rfdc.ac.uk", "rferl.org", - "rfhsm.ac.uk", - "rfi.ac.uk", "rfi.fr", "rfi.my", - "rgo.ac.uk", - "rgpub.io", - "rgu.ac.uk", - "rh.ac.uk", - "rhacc.ac.uk", - "rhbnc.ac.uk", - "rhcda-aac.ac.uk", - "rhees.ac.uk", - "rhfc.ac.uk", - "rhodeislandbmw.com", - "rhs.ac.uk", - "rhul.ac.uk", - "rhyac.ac.uk", - "rhyw.me", - "rhyw31.life", - "ri.ac.uk", - "ricefever.com", - "richardtaunton.ac.uk", - "richardtaunton6thformcollege.ac.uk", - "richardtauntons.ac.uk", - "richardwilsononline.ac.uk", - "richmond-utcoll.ac.uk", - "richmond.ac.uk", - "richmondbusinessschool.ac.uk", - "richuish.ac.uk", - "ridepenguin.com", - "riding.ac.uk", - "right-2.ac.uk", "rightbtc.com", "rightster.com", "rigpa.org", - "rigums.xyz", "riku.me", "rileyguide.com", - "rimg.com.tw", - "rin.ac.uk", - "ring.gr.jp", - "rinvdh7.xyz", - "riot-games.com", - "riot.com", - "riot.im", - "riot.net", - "riotcdn.net", - "riotforgegames.com", - "riotgames.co.kr", - "riotgames.com", - "riotgames.info", - "riotgames.jp", - "riotgames.net", - "riotgames.tv", - "riotpin.com", - "riotpoints.com", - "ripe.net", - "ripon-cuddesdon.ac.uk", - "ripple.com", - "riscl.ac.uk", - "riseholme.ac.uk", "riseup.net", - "risextube.com", "ritouki.jp", "ritter.vg", - "riverside.ac.uk", - "riversidecollege.ac.uk", - "riversidecollegehalton.ac.uk", - "riversidemusiccollege.ac.uk", - "rivic.ac.uk", "rixcloud.com", "rixcloud.us", - "rjgsp.buzz", - "rjgsp1.buzz", - "rk.com", - "rl.ac.uk", "rlcdn.com", - "rlczdo.xyz", - "rlg.ac.uk", - "rln.ac.uk", - "rlo-cetl.ac.uk", - "rluk.ac.uk", "rlwlw.com", - "rm2029.com", - "rma.ac.uk", - "rmas.ac.uk", "rmbl.ws", "rmjdw.com", "rmjdw132.info", - "rnc.ac.uk", - "rncb.ac.uk", - "rncm.ac.uk", - "rnib-redhill.ac.uk", - "rnibcollege.ac.uk", - "rnibncw.ac.uk", - "rnibvocoll.ac.uk", - "rnn.ac.uk", - "rnngroup.ac.uk", - "ro89.com", - "road-crew.com", "roadshow.hk", - "robobat.com", "roboforex.com", - "roborecall.com", - "robotoffice.com", "robustnessiskey.com", - "rochdalesfc.ac.uk", "rocket-inc.net", + "rocket.chat", "rocketbbs.com", - "rocketfishproducts.com", - "rockettube.com", - "rocksdb.com", - "rocksdb.net", "rocksdb.org", - "rocksextube.com", - "rockstargames.com", - "rodbaston.ac.uk", - "roe.ac.uk", - "roedu.net", - "roehampton-online.ac.uk", - "roehampton.ac.uk", - "roffeypark.ac.uk", - "roisolutions.ac.uk", "rojo.com", - "roku.com", - "rokutime.com", "rolfoundation.org", "rolia.net", - "rolls-roycecullinan.com", - "rolls-roycemotorcars.com", - "rolls-roycemotorcarsna.com", - "roloflix.com", - "roloxxx.com", "rolsociety.org", - "romanrepublic.ac.uk", - "romansocietyrac.ac.uk", - "romantic-sex-video.com", - "romeo.ac.uk", "ronjoneswriter.com", "roodo.com", - "root-signing.ch", - "rootsigning.com", "rosechina.net", - "rosemarydoll.com", - "rosemount.ac.uk", - "roses.ac.uk", - "rosetta.ac.uk", - "roshy.tv", - "roslin.ac.uk", - "rothamsted.ac.uk", - "rotherham-coll.ac.uk", - "rotherham.ac.uk", - "rothervalley.ac.uk", "rotten.com", "rou.video", "roucdn.link", - "roudao6.buzz", - "roudaosp.cc", - "roughebonysex.com", - "roughman.net", - "roundtable.ac.uk", - "routerboard.com", - "routesintolanguages.ac.uk", - "routledgehandbooks.com", - "rowett.ac.uk", - "rowleycollege.ac.uk", - "royagcol.ac.uk", - "royal-institution.ac.uk", - "royalacademyofmusic.ac.uk", - "royalarmouries.ac.uk", - "royalcams.com", - "royalholloway.ac.uk", - "royalhollowaycommunication.ac.uk", - "royalhollowaycommunications.ac.uk", - "royalhollowayinternational.ac.uk", - "royalhollowayuniforum.ac.uk", - "royalmarsdenschool.ac.uk", - "royalsoc.ac.uk", - "royalsociety.ac.uk", - "royalsocietypublishing.org", - "royce-institute.ac.uk", - "royce.ac.uk", - "roysocmed.ac.uk", "rpglogs.com", - "rplay.live", - "rpmfusion.org", - "rprimelab.com", - "rps.ac.uk", - "rrl28.buzz", - "rrs1.xyz", - "rrtis.com", - "rs1024.com", - "rs2022.com", - "rsa-ls.ac.uk", - "rsamd.ac.uk", - "rsc-cymru.ac.uk", - "rsc-east-midlands.ac.uk", - "rsc-east.ac.uk", - "rsc-eastern.ac.uk", - "rsc-em.ac.uk", - "rsc-london.ac.uk", - "rsc-ne-scotland.ac.uk", - "rsc-ni.ac.uk", - "rsc-north.ac.uk", - "rsc-northern.ac.uk", - "rsc-northwest.ac.uk", - "rsc-scotland.ac.uk", - "rsc-south-east.ac.uk", - "rsc-southeast.ac.uk", - "rsc-sw-scotland.ac.uk", - "rsc-wales.ac.uk", - "rsc-westmidlands.ac.uk", - "rsc-wm.ac.uk", - "rsc-yh.ac.uk", - "rsc-yorkshire-humber.ac.uk", - "rsc-yorkshire-humberside.ac.uk", - "rsc.org", - "rscem.ac.uk", - "rsd-exeter.ac.uk", "rsdlmonitor.com", - "rse.ac.uk", "rsf-chinese.org", "rsf.org", - "rsg.sc", "rsgamen.org", - "rslg.ac.uk", - "rslondon.ac.uk", - "rslp.ac.uk", - "rsm.ac.uk", - "rsms.ac.uk", - "rsp.ac.uk", - "rspao.com", "rsshub.app", "rssing.com", "rssmeme.com", - "rstatic.net", - "rt.com", "rtalabel.org", "rthk.hk", "rthk.org.hk", "rti.org.tw", "rti.tw", - "rtings.com", "rtycminnesota.org", - "rua-project.ac.uk", "ruanyifeng.com", - "ruby-lang.org", - "rubygems.org", - "rude.com", - "rugby-coll.ac.uk", - "rugby-college.ac.uk", - "rugby.ac.uk", - "rugbycoll.ac.uk", - "rugit.ac.uk", - "ruinedking.com", - "rukoebxx.com", "rukor.org", - "rul.ac.uk", - "rulaisc-tv.buzz", "rule34.xxx", - "rule34h.com", - "rule34pornvids.com", - "rule34video.com", - "ruleporn.com", - "rumah123.com", "rumble.com", - "run.app", "runbtx.com", - "runfission.com", - "runnike.com", - "runningnike.com", - "runporn.com", - "runshaw.ac.uk", - "runshawcollege.ac.uk", - "runwayescorts.com", - "rupress.org", - "ruru.ac.uk", - "rus.ec", "rushbee.com", - "rushporn.online", - "rushporn.xxx", - "ruskin.ac.uk", - "russell-group.ac.uk", - "russellgroup.ac.uk", - "russianrape.org", - "rust-lang.org", - "rustdesk.com", - "rustup.rs", "rusvpn.com", - "rutc.ac.uk", "ruten.com.tw", - "rutherford.ac.uk", - "rutlandcollege.ac.uk", "rutracker.net", "rutracker.org", "rutube.ru", - "ruvideos.net", "ruyiseek.com", - "rvc.ac.uk", - "rwcmd.ac.uk", "rxhj.net", - "ryokoyomiuri.co.jp", - "s-bluemix.net", - "s-books.com", - "s-cashonmobile.com", - "s-cat.ac.uk", - "s-cheshire.ac.uk", "s-cute.com", - "s-dc-msedge.net", - "s-devon.ac.uk", "s-dragon.org", - "s-microsoft.com", - "s-msedge.net", - "s-msft.com", - "s-msn.com", "s-nbcnews.com", - "s-rewards.hk", - "s-xoom.com", - "s.team", "s1heng.com", "s1s1s1.com", - "s2stagehance.com", - "s3-accelerate.amazonaws.com", - "s3-ap-northeast-1.amazonaws.com", + "s3-ap-southeast-1.amazonaws.com", "s3-ap-southeast-2.amazonaws.com", "s3.amazonaws.com", - "s3.ap-northeast-1.amazonaws.com", "s4miniarchive.com", - "s81c.com", - "s8ds5gfm.xyz", "s8forum.com", - "saasexch.com", - "saasexch.io", "saboom.com", - "sabuibo.net", - "sac.ac.uk", - "sacduc.com", "sacks.com", - "saclnet.ac.uk", "sacom.hk", - "sacredhentai.com", - "sacwg.ac.uk", "sadistic-v.com", "sadpanda.us", - "sae.org", "saeima.lv", - "saerock.com", - "saes.ac.uk", - "saet.ac.uk", - "safa.ac.uk", - "safebooru.org", - "safecampuscommunities.ac.uk", "safechat.com", "safeguarddefenders.com", - "safepodnetwork.ac.uk", "safervpn.com", "safety.google", - "saffrontech.com", - "sagepub.com", "sagernet.org", - "sages.ac.uk", - "sahabatsetiasmartone.com", - "sahfos.ac.uk", - "sainsbury-laboratory.ac.uk", - "sainsburycentre.ac.uk", - "sainsburyinstituteforart.ac.uk", "saintyculture.com", "saiq.me", "sakura-paris.org", "sakuralive.com", "sakya.org", - "sale-nikeshoes.com", - "salebeatslasteststyle4you.com", - "saleblackfridaydrebeats.com", - "salecheaphandbags.com", - "salesforce.com", - "salesforce.org", - "salesforceiq.com", - "salesforceliveagent.com", - "salesforcemarketingcloud.com", - "salford-col.ac.uk", - "salford.ac.uk", - "salfordcc.ac.uk", - "salfordcitycollege-trinity.ac.uk", - "salfordcitycollege.ac.uk", - "salg.ac.uk", - "salisbury-college.ac.uk", - "salisbury.ac.uk", - "salisbury6c.ac.uk", - "salisburycollege.ac.uk", - "saltash.ac.uk", - "salts.ac.uk", "salvation.org.hk", - "salvationarmy.ac.uk", "samair.ru", - "sambaporno.com", "sambhota.org", - "samc.ac.uk", - "samebags.com", - "sams.ac.uk", - "samsung.com", - "samsungapps.com", - "samsungcloud.com", - "samsungdm.com", - "samsunggalaxyfriends.com", - "samsungknox.com", - "samsungqbe.com", - "sandisk.ae", - "sandisk.co.jp", - "sandisk.co.kr", - "sandisk.co.uk", - "sandisk.com", - "sandisk.com.au", - "sandisk.com.br", - "sandisk.com.tr", - "sandisk.com.tw", - "sandisk.de", - "sandisk.es", - "sandisk.fr", - "sandisk.hk", - "sandisk.id", - "sandisk.in", - "sandisk.it", - "sandisk.nl", - "sandisk.sg", "sandscotaicentral.com", - "sandwell.ac.uk", - "sandwellcollege.ac.uk", - "sanger.ac.uk", - "sanjesh.org", "sankakucomplex.com", - "sankei-ad-info.com", - "sankei-ad.net", - "sankei-books.co.jp", - "sankei-call.jp", - "sankei-digital.co.jp", - "sankei-eiga.co.jp", - "sankei-kaihatsu.co.jp", - "sankei-kurashi.com", - "sankei-shougakukai.jp", - "sankei-tours.com", - "sankei.co.jp", "sankei.com", - "sankei.jp", - "sankeibiz.jp", - "sankeishop.jp", - "sankie.net", "sanmin.com.tw", "sans.edu", - "sanspo.com", - "sanvaras.com", - "saobjpg.com", - "saoni91.xyz", - "saonia.xyz", - "saonidh-one.sbs", - "saonidh.world", - "saonidh01.cc", - "sapc.ac.uk", "sapikachu.net", - "sapphicerotica.com", - "sapphicpornonly.com", - "sapphire.ac.uk", - "sarajevopodopsadom.com", - "sarapbabe.com", - "sarennasworld.com", - "sari.ac.uk", - "sartre.ac.uk", - "sarum.ac.uk", - "sas.ac.uk", - "satan18av.com", - "satnym.com", - "satoshilabs.com", - "satsixthformacademiestrust.ac.uk", - "satv01.me", "saveliuxiaobo.com", "savemedia.com", "savethedate.foo", @@ -23289,877 +4974,163 @@ var rules = [ "savetibetstore.org", "saveuighur.org", "savevid.com", - "savitabhabhi.com", - "savitabhabhi.vip", - "savitahd.net", - "savoycomputing.com", - "savvyshopper.net.au", "say2.info", - "saynow.com", - "sb-cd.com", - "sb-mobile.jp", - "sb-telecom.net", - "sb.sb", - "sbc.ac.uk", - "sbgkstv.shop", - "sbirmc.ac.uk", - "sbitravelcard.com", "sbme.me", - "sbnation.com", - "sbrc-nottingham.ac.uk", - "sbrn.ac.uk", - "sbs.ac.uk", "sbs.com.au", - "sbu.ac.uk", - "sbusinesslondon.ac.uk", - "sbux.com.my", - "sbuxcard.com", - "sc-cdn.net", - "sc-toolkit.ac.uk", - "sc1.ac.uk", - "sca-tolo.info", - "scaan.ac.uk", - "scadr.ac.uk", - "scae.ac.uk", - "scala-lang.org", - "scala-sbt.org", - "scaleflex.com", - "scaleform.com", - "scandalplanet.com", - "scanlover.com", - "scapa.ac.uk", - "scarb-6-form.ac.uk", - "scarboroughtec.ac.uk", - "scarboroughuniversity.ac.uk", - "scarboroughuniversitycampus.ac.uk", - "scarboroughuniversitycentre.ac.uk", - "scarboroughuniversitycollege.ac.uk", "scasino.com", - "scat-enema.com", - "scat-japan.com", - "scat-shop.net", - "scat.gold", - "scatfap.com", - "scatfinder.com", - "scathd.com", - "scatkings.com", - "scatnetwork.com", - "scatshop.com", - "scatsite.com", - "scatvids.club", - "scatville.com", - "scc.ac.uk", - "sccb.ac.uk", - "sccc.ac.uk", - "sccjr.ac.uk", - "scct.ac.uk", - "scde.ac.uk", - "scdn.co", - "scene7.com", - "scenesource.me", - "scentro.ac.uk", - "scep.ac.uk", - "scg.ac.uk", - "scharferporno.com", "schema.org", - "schemer.com", - "schiffvitamins.com", - "schml.ac.uk", - "scholarpedia.org", - "scholarsschool.ac.uk", - "schome.ac.uk", - "schoms.ac.uk", - "school-economic-science.ac.uk", - "sci-hub.ee", - "sci-hub.se", - "sci-hub.st", - "sci.ac.uk", - "sciculture.ac.uk", - "science-museum-group.ac.uk", - "science.com", - "science.org", - "sciencedirect.com", - "sciencedirectassets.com", "sciencemag.org", - "sciencemuseum.ac.uk", - "sciencemuseumgroup.ac.uk", "sciencenets.com", - "scienceonline.org", - "sciencesigns.ac.uk", - "scientificamerican.com", - "scientificlinux.org", "scieron.com", - "scifisex.net", - "scills.ac.uk", - "scilly-acl.ac.uk", - "scinet.ac.uk", - "scip.ac.uk", - "scir.ac.uk", - "scisci.ac.uk", - "scitation.org", - "scitech.ac.uk", - "scival.com", - "sclondon.ac.uk", "scmp.com", "scmpchinese.com", - "scnshop.cc", - "scnsrc.me", - "scoc.ac.uk", - "scola.ac.uk", - "scolle.net", - "sconul.ac.uk", - "scoop.sh", - "scoopstudy.ac.uk", - "scop.ac.uk", - "scope-uk.ac.uk", - "scopic.ac.uk", - "scopus.com", - "score.ac.uk", - "scoreclassics.com", - "scorediscounts.club", - "scoregroup.com", - "scoreland.com", - "scoreland2.com", - "scorepass.com", - "scoretv.tv", - "scoreuniverse.com", - "scorevideos.com", - "scot-hip.ac.uk", - "scot-reman.ac.uk", - "scot-ship.ac.uk", - "scot.ac.uk", - "scotcatproject.ac.uk", - "scotchem.ac.uk", - "scotcit.ac.uk", - "scotcol.ac.uk", - "scotdist.ac.uk", - "scotgem.ac.uk", - "scotgrid.ac.uk", - "scotland-aspirenorth.ac.uk", - "scotland-northforum.ac.uk", - "scotlandscolleges.ac.uk", - "scotssyntaxatlas.ac.uk", - "scottishborderscampus.ac.uk", - "scottishciviljustice.ac.uk", - "scottishcollegegovernance.ac.uk", - "scottishcorpus.ac.uk", - "scottishdisabilityteam.ac.uk", - "scottisheconomics.ac.uk", - "scottishelections.ac.uk", - "scottishinsight.ac.uk", - "scottishmarineinstitute.ac.uk", - "scottishresearch.ac.uk", - "scottishresearchpools.ac.uk", - "scottishuniversitygovernance.ac.uk", - "scp-wiki.net", - "scpdb.org", - "scphrp.ac.uk", - "scpic.net", - "scpr.ac.uk", - "scpwiki.com", "scramble.io", - "scrambledmessages.ac.uk", - "scran.ac.uk", - "scre.ac.uk", - "screenacademyscotland.ac.uk", - "screenfilmschool.ac.uk", - "screens-lab.jp", - "screenspace.ac.uk", - "screenwisetrends.com", - "screenwisetrendspanel.com", - "screw-my-wife.com", - "scri.ac.uk", "scribd.com", "scriptspot.com", - "scrolla.ac.uk", - "scrolller.com", - "scrr.ac.uk", - "scrsj.ac.uk", - "sculpoly.com", - "scunthorpeinstituteoftechnology.ac.uk", - "scurl.ac.uk", - "scutrea.ac.uk", - "scva.ac.uk", - "scvs.ac.uk", - "scweims.ac.uk", - "sda.ac.uk", - "sdc.ac.uk", - "sdcountybmw.com", - "sdeo.ac.uk", - "sdf.ac.uk", - "sdhi.ac.uk", - "sdn.ac.uk", - "sdnice.one", - "sdnitube.buzz", - "sdos.ac.uk", - "sdss.ac.uk", - "sdt.ac.uk", - "se-derbys.ac.uk", - "se-essex-college.ac.uk", - "sea-mammal-research-unit.ac.uk", - "seacams.ac.uk", - "seagroup.com", - "seaha-cdt.ac.uk", - "seamonkey-project.org", - "seancody.com", - "seaofsolitude.com", - "seaporn.org", "seapuff.com", - "search.ac.uk", "search.com", "search.xxx", - "search25.ac.uk", "searchtruth.com", "searx.me", - "seas.ac.uk", - "seasidestory.tokyo", "seatguru.com", "seattlefdc.com", - "secom.co.jp", - "secomtrust.net", - "second-ns.com", - "second-ns.de", - "secret-flirt-hub.com", - "secretbabes.co.uk", "secretchina.com", "secretgarden.no", "secretsline.biz", - "secretubes.com", - "sectigo.com", - "secure-paypal.info", - "secureharvests.ac.uk", - "securepaypal.info", "secureservercdn.net", "securetunnel.com", "securityinabox.org", "securitykiss.com", - "seda.ac.uk", - "sedc.ac.uk", - "sedg.ac.uk", "see.xxx", - "seecoll.ac.uk", "seed4.me", - "seedmov18.com", - "seedstor.ac.uk", - "seehorsepenis.com", "seehua.com", - "seeingspeech.ac.uk", - "seematureporn.com", - "seemilfporn.com", - "seemygf.com", - "seemyporn.com", "seesmic.com", - "seevic-college.ac.uk", - "seevic.ac.uk", "seevpn.com", "seezone.net", - "sefton-acl.ac.uk", - "sefton.ac.uk", - "sego8.cc", - "sego8.co", - "sego8.xyz", "sehuatang.net", "sehuatang.org", - "seintiaucymru.ac.uk", - "seiroganmania.com", - "seiron-sankei.com", "sejie.com", - "sejie80.com", "seju.life", - "seksmet.nl", - "sekswebsite.nl", - "sekur1213.guru", - "selby.ac.uk", - "selcog.ac.uk", - "seldensociety.ac.uk", - "selectanescort.com", - "selectyourgame.com", - "selfloversworld.com", "sellclassics.com", - "sellercommunity.com", - "sellyoak.ac.uk", - "selsey.ac.uk", - "semanticaudio.ac.uk", - "semanticscholar.org", - "sena.co.kr", - "senatehouselibrary.ac.uk", "sendsmtp.com", "sendspace.com", - "seneporno.com", - "seniortgp.com", - "senpaiheat.com", - "sense-east.ac.uk", - "sensorcity.ac.uk", "sensortower.com", - "sensorynetworks.com", - "senss-dtp.ac.uk", - "sensualgirls.org", - "sensualmothers.com", - "sensueel.net", - "sentry.io", - "senzuritv.net", - "sepnet.ac.uk", - "seqing.one", - "seqingwangzhan.pro", - "seqingx.com", - "sequence.com", - "ser7.cc", - "sera.ac.uk", - "seraph.me", - "serbiporno.net", - "serc.ac.uk", - "serena.ac.uk", - "serialssolutions.com", - "serio.ac.uk", - "serl.ac.uk", - "serlucap.lol", - "serlutv258.xyz", "servehttp.com", - "serverfault.com", - "serverlesslibrary.net", "serveuser.com", "serveusers.com", - "services-apple.net", - "services-exchange.com", - "serviceshp.com", - "servicetalk.io", - "serving-sys.com", - "serviporno.com", - "ses.ac.uk", "sesawe.net", "sesawe.org", - "seselah.com", - "sesenovel.com", - "sesez.com", - "sessoamatorialeitaliano.com", - "setapp.com", "sethwklein.net", - "seti.ac.uk", "setn.com", - "setsquared.ac.uk", "settv.com.tw", "setty.com.tw", "sevenload.com", - "severeporn.com", - "severreal.org", - "sevgikurtulmaz.com", "sex-11.com", - "sex-amateur-clips.com", - "sex-av.com", - "sex-douga.jp", - "sex-for-work.com", - "sex-gif.org", - "sex-hay.pro", - "sex-hot-sites.com", - "sex-ly.com", - "sex-teen.net", - "sex-young.com", - "sex.cam", "sex.com", - "sex.sex", - "sex.xxx", - "sex0098.com", - "sex021.net", "sex3.com", - "sex3.mobi", - "sex4arabxxx.com", - "sex588.net", "sex8.cc", - "sexaidh.com", - "sexalarab.com", - "sexandsplash.com", "sexandsubmission.com", - "sexanimalvideos.com", - "sexanime.net", - "sexarea.org", - "sexasia.net", - "sexavidols.com", - "sexbebin.com", - "sexbomba.ru", - "sexbombo.com", - "sexbookecuador.com", "sexbot.com", - "sexbq.com", - "sexcartoon.biz", - "sexcelebrity.net", - "sexcord.com", - "sexdollpornhd.com", - "sexdolls.com", - "sexdollsshow.com", - "sexdug.com", - "sexecherche.com", - "sexedanslepre.net", - "sexei.net", - "sexemulator.com", - "sexfilm4free.com", - "sexfilmeporno.com", - "sexfilmstube.com", - "sexfl.xyz", - "sexflashgame.org", - "sexflexible.com", - "sexgalaxy.net", - "sexgame.com", - "sexgamefun.com", - "sexgames.cc", - "sexgames.xxx", - "sexgamesbox.com", - "sexgamesclub.com", - "sexguide.ro", - "sexhd.fun", - "sexhd.pics", - "sexhdmovs.com", - "sexhotgames.com", "sexhu.com", "sexhuang.com", - "sexhub.red", - "sexhubhd.com", "sexidude.com", - "sexifilm.top", - "sexiframe.com", - "sexindians.cc", "sexinsex.net", - "sexiranian.party", - "sexjk.com", - "sexjobs.it", - "sexkomix2.com", - "sexkorea.net", - "sexlikereal.com", - "sexmadeathome.com", - "sexmature.club", - "sexmerci.com", - "sexmex.xxx", - "sexmix.net", - "sexmomsex.com", - "sexmovies24.com", - "sexmummy.com", - "sexmutant.com", - "sexnaweb.net", - "sexnudo.com", - "sexo123.net", - "sexodama.com", - "sexodeamor.com", - "sexopornolive.com", - "sexoquente.blog", - "sexpornimg.com", - "sexpornpictures.com", - "sexpornvideoasian.com", - "sexsaoy.com", - "sexsex1.com", - "sexsiam.com", - "sexsim.com", - "sexsimulator.com", - "sexsiteinc.com", - "sexstoriespost.com", - "sextb.net", - "sextime.tv", - "sextop.net", - "sextop1.net", - "sextorso.com", - "sextoystop.com", - "sextreffen-portale.com", - "sextreffensite.com", - "sextube.desi", - "sextube.fm", - "sextube69free.net", - "sextubebox.com", - "sextubedot.com", - "sextubehub.com", - "sextubeset.com", - "sextubespot.com", - "sextubexxl.com", - "sextubish.com", "sextvx.com", - "sextw.net", - "sexu.com", - "sexualhentai.net", - "sexuria.com", - "sexvid.xxx", - "sexvideo10.com", - "sexvideo12com.pro", - "sexvideos.host", - "sexvideos.tel", - "sexvideosxxx.mobi", - "sexvids.cc", - "sexvr.com", - "sexwebvideo.com", - "sexwenheav.shop", - "sexwithhorse.net", - "sexxhd.de", - "sexxx8.xyz", - "sexxxdoll.com", - "sexxxtape.net", - "sexxxx.rodeo", - "sexxxxfilms.com", "sexxxy.biz", - "sexy-babe-pics.com", - "sexy-beauties.com", - "sexy-models.net", - "sexy-more.com", - "sexy-older-women.com", - "sexy-photos.net", - "sexy-torrents.com", - "sexy3dtoon.com", - "sexyandfunny.com", - "sexyasiangirls.cc", - "sexyavenue.com", - "sexybabesz.com", - "sexycandidgirls.com", - "sexyculo.com", - "sexyfeet.tv", - "sexyfuckgames.com", - "sexyfucking.ru", - "sexygirlfriendtube.com", - "sexygirlspics.com", - "sexyhomewives.com", - "sexyhub.com", - "sexyhumorgames.com", - "sexykittenporn.com", - "sexyoung.me", - "sexypornpictures.org", - "sexyseeker.com", - "sexysexdoll.com", - "sexysites.com.ph", - "sexyteenssite.com", - "sexytuber.com", - "sexywetpussy.com", - "sexzy4.com", "sf.net", - "sfbassets.com", - "sfbassets.net", - "sfc.ac.uk", - "sfdcstatic.com", - "sfefc.ac.uk", - "sfeu.ac.uk", - "sfhub.ac.uk", "sfileydy.com", - "sfmcompile.club", - "sforce.com", - "sfps.ac.uk", - "sfra.ac.uk", - "sfs.ac.uk", "sfshibao.com", - "sfsstudents.ac.uk", "sftindia.org", "sftuk.org", - "sfx.ac.uk", - "sfx.ms", - "sfxc.ac.uk", - "sg120.me", - "sg1lib.org", - "sgeulnagaidhlig.ac.uk", - "sghms.ac.uk", - "sgiliaith.ac.uk", - "sgm.ac.uk", - "sgmc.ac.uk", - "sgp1.fun", - "sgpe.ac.uk", - "sgsah.ac.uk", - "sgscol.ac.uk", - "sgspe.de", - "sgspt.buzz", - "sgsss.ac.uk", - "sgul.ac.uk", "sgwritings.com", "sgzhan.com", - "sh-xuxingda.com", - "sh83.xyz", - "shadbase.com", "shadeyouvpn.com", "shadow.ma", - "shadowcomplex.com", "shadowsky.xyz", - "shadowslaves.com", "shadowsocks-r.com", "shadowsocks.asia", "shadowsocks.be", "shadowsocks.com", "shadowsocks.com.hk", - "shadowsocks.nl", + "shadowsocks.nu", "shadowsocks.org", "shadowsocks9.com", "shafaqna.com", "shahit.biz", - "shahvani.com", - "shahvani.site", - "shakethesnake.com", "shambalapost.com", "shambhalasun.com", - "shameless.com", "shangfang.org", "shanxivideo.com", - "shapelcounset.xyz", "shapeservices.com", + "share-videos.se", "sharebee.com", "sharecool.org", - "shared-ed.ac.uk", - "shared-es.ac.uk", - "sharedsolutions.ac.uk", - "sharegeo.ac.uk", - "sharepoint.com", - "sharepointonline.com", - "sharethis.com", - "sharif.edu", - "sharif.ir", - "sharingpractice.ac.uk", - "sharizelvideos.com", - "sharks-lagoon.fr", - "sharkyporn.com", - "sharmota.com", "sharpdaily.com.hk", "sharpdaily.hk", "sharpdaily.tw", "shat-tibet.com", "shattered.io", - "shazam.com", - "shc.ac.uk", - "shdd.ink", - "shdf.ac.uk", - "sheef.ac.uk", + "sheet.new", "sheets.new", - "shef.ac.uk", - "shefc.ac.uk", - "sheffcol.ac.uk", - "sheffield-hallam.ac.uk", - "sheffield-lls.ac.uk", - "sheffield.ac.uk", - "sheffield2.ac.uk", - "sheffieldcareersfairs.ac.uk", - "sheffieldcetle.ac.uk", - "sheffieldlegalfair.ac.uk", - "sheffieldrobotics.ac.uk", - "sheflix.com", - "shegg.com", - "shegods.com", "sheikyermami.com", - "sheilingcollege.ac.uk", - "shelfstuff.com", - "shellcheck.net", "shellfire.de", - "shemale-porn-galls.com", - "shemalebestlabel.com", - "shemalehd.sex", - "shemaleleaks.com", - "shemalemodelstube.com", - "shemaleporn.fun", - "shemaleporn.xxx", - "shemalepornonly.com", - "shemaleporntube.tv", - "shemalespoiledwhore.com", - "shemalestardb.com", - "shemalestube.com", - "shemaletrannypics.com", - "shemaletube.pro", - "shemaletubevideos.com", "shemalez.com", - "shenasimon.ac.uk", - "shenshi-cha.com", "shenshou.org", "shenyun.com", - "shenyun.org", - "shenyuncreations.com", "shenyunperformingarts.org", "shenyunshop.com", "shenzhoufilm.com", "shenzhouzhengdao.org", - "sheppeycollege.ac.uk", - "shequ8.cam", - "shequdaohang.com", "sherabgyaltsen.com", - "sherif.ac.uk", - "sherpa-leap.ac.uk", - "sherpa.ac.uk", - "shesfreaky.com", - "sheshaft.com", "shiatv.net", - "shibashuwu.net", "shicheng.org", - "shields.io", - "shikorina.net", "shiksha.com", "shiksha.ws", - "shinhangmc.com", "shinychan.com", "shipcamouflage.com", - "shiplay.ac.uk", - "shipley.ac.uk", "shireyishunjian.com", - "shiroutoav.net", - "shishijump001.com", - "shit-porn.net", "shitaotv.org", - "shithd.com", - "shitjav.com", - "shittytube.com", "shixiao.org", "shizhao.org", "shkspr.mobi", - "shockingmovies.com", "shodanhq.com", - "shoers.com", - "shoestop2.com", "shooshtime.com", - "shootershill.ac.uk", - "shop-headphones.net", - "shop.app", "shop2000.com.tw", - "shopbeatsdre.com", - "shopbmwmotorcycles.com", - "shopbmwusa.com", - "shopbydre.com", - "shopcustomizedbeats.com", - "shopdisney.com", - "shopdrebeats.com", - "shopdurex.com", - "shopee.cl", - "shopee.co.id", - "shopee.co.th", - "shopee.com", - "shopee.com.br", - "shopee.com.co", - "shopee.com.mx", - "shopee.com.my", - "shopee.es", - "shopee.fr", - "shopee.id", - "shopee.in", - "shopee.io", - "shopee.ph", - "shopee.sg", "shopee.tw", - "shopee.vn", - "shopeemobile.com", - "shopfacebook.com", - "shopibay.net", - "shopify.com", - "shopify.dev", - "shopifycdn.com", - "shopifycloud.com", - "shopifystatus.com", - "shopifysvc.com", - "shoping.com", - "shopminiusa.com", - "shopmonsterbeats.com", - "shoppercentre.com", - "shopping-days.net", "shopping.com", - "shoppinguheadphones.com", - "shops-disney.com", - "shopspeedtv.com", - "shoptraivip.com", - "shorturl.at", - "shotgridsoftware.com", - "shotgridstudio.com", - "shotguncloud.com", - "shotgunfx.com", - "shotgunlocalhost.com", - "shotgunsoftware.com", - "shotgunsoftware.net", - "shotgunstudio-test.com", - "shotgunstudio.com", - "shotgunvfx.com", - "shotwithgeforce.com", "showhaotu.com", - "shownote.com", - "showtime.com", "showtime.jp", - "showtimeanytime.com", - "showup.tv", "showwe.tw", - "showybeauty.com", - "shp.ee", - "shrewsbury.ac.uk", - "shrimpia.network", - "shrkurl.com", - "shsh201.com", - "shu.ac.uk", - "shuangmawei.xyz", - "shufflesex.com", "shutterstock.com", - "shuttleworth.ac.uk", - "shuttleworthcollege.ac.uk", - "shuziyimin.org", "shvoong.com", "shwchurch.org", "shwchurch3.com", - "shwebank.com", - "shymysex.com", - "shywifeswap.com", - "siam.org", - "sibreal.org", - "sicsa.ac.uk", "siddharthasintent.org", - "side.ac.uk", "sidelinesnews.com", "sidelinessportseatery.com", - "sie.ac.uk", - "siege-amazon.com", "sierrafriendsoftibet.org", - "sifa.ac.uk", - "sifangclub.com", - "sigma-cetl.ac.uk", - "sigma-network.ac.uk", - "sigmoidoscopeexam.com", - "sign.ac.uk", - "sign.new", - "signal.art", "signal.org", - "signalbar.com", - "signalprocessingsociety.org", - "signalr.net", - "signalusers.org", - "sihe.ac.uk", "sijihuisuo.club", "sijihuisuo.com", - "sikh-uni.ac.uk", - "sikiswap.com", "silkbook.com", - "silkengirl.com", - "silverchair-cdn.com", - "silversluts.com", - "simbios.ac.uk", + "silvergatebank.com", "simbolostwitter.com", - "simcity-buildit.com", - "simcity.com", - "simg.jp", - "simgbb.com", - "simian.ac.uk", - "similar-porn.fun", - "simility.com", - "simonsgirls.com", - "simpcity.su", + "simplecd.me", "simplecd.org", "simpleproductivityblog.com", - "simplify.com", - "simplifycommerce.com", - "simply-hentai.com", - "simplyipod.com", - "simsquad.com", - "simulationsquad.com", + "simpleswap.io", "sina.com", "sina.com.hk", "sina.com.tw", - "sinapse.ac.uk", "sinchew.com.my", - "sinchew.my", - "sinet.ac.uk", - "sing4.lat", - "sing68.com", "singaporepools.com.sg", "singfortibet.com", - "singlelogin.app", "singlelogin.me", - "singlelogin.re", - "singlelogin.site", + "singlelogin.se", "singpao.com.hk", "singtao.ca", "singtao.com", - "singtaobooks.com", - "singtaola.com", - "singtaonewscorp.com", - "singtaoopo.com", "singtaousa.com", - "sinica.ac.uk", - "sino-cs.ac.uk", "sino-monthly.com", "sinoants.com", "sinoca.com", @@ -24170,307 +5141,89 @@ var rules = [ "sinonet.ca", "sinopitt.info", "sinoquebec.com", - "sinto.ac.uk", - "sip.ac.uk", - "sipher.ac.uk", "sipml5.org", - "siport.com", - "sipr.ac.uk", - "sipriyearbook.org", - "sircharleslyellcentre.ac.uk", - "sire.ac.uk", - "sirenxxxstudios.com", - "siri.com", - "sirius.ac.uk", - "sirm.ac.uk", - "sis.la", "sis.xxx", "sis001.com", "sis001.us", - "siscache.com", - "siser.ac.uk", - "sisisl.com", - "siska.video", - "sislovesme.com", - "sissc.ac.uk", - "sissy-university.com", - "sissy.eu.org", - "sissy.game", - "sissyporncrossdresser.com", - "site.com", + "site.new", "site2unblock.com", "site90.net", "sitebro.tw", "sitekreator.com", "sitemaps.org", - "sitepoint.com", - "siterips.org", - "siteripz.com", - "siteripz.net", - "siti.ac.uk", - "situero.com", - "siva.ac.uk", + "sites.new", "six-degrees.io", - "six9dy.pw", - "sixte.st", "sixth.biz", - "sjcollect.com", - "sjd.ac.uk", - "sjhsp1.buzz", - "sjr.ac.uk", "sjrt.org", "sjum.cn", - "skate2.com", - "skebetter.com", - "skegnesstec.ac.uk", - "skelmersdale.ac.uk", "sketchappsources.com", - "sketchbookdesigner.com", - "sketchbookmobile.com", - "sketchbooknews.com", - "sketchbookpro.com", - "skillsbridge.ac.uk", - "skillscompetitionwales.ac.uk", - "skillsgroupuk.ac.uk", - "skillshare.com", - "skillswestyorks.ac.uk", "skimtube.com", - "skinstrip.net", "skk.moe", - "skokka.com", - "sksarab.top", - "skunkgirl.cc", - "sky.com", - "skyassets.com", "skybet.com", "skyking.com.tw", "skykiwi.com", - "skymansion.net", - "skymatter.com", "skynet.be", - "skyoceanrescue.com", - "skyoceanrescue.de", - "skyoceanrescue.it", "skype.com", - "skype.net", - "skypeassets.com", - "skypeassets.net", - "skyperfectjsat.space", - "skyperfectv.co.jp", - "skyporn.online", - "skyrmions.ac.uk", - "skysports.com", - "skysports.fr", - "skysports.ie", - "skysportsonline.com", - "skysportsracing.com", "skyvegas.com", "skyxvpn.com", "sl-reverse.com", - "sl99mod.buzz", - "slack-core.com", - "slack-edge.com", - "slack-files.com", - "slack-imgs.com", - "slack-msgs.com", - "slack-redir.net", - "slack.com", - "slackb.com", - "slackcertified.com", - "slackdemo.com", "slacker.com", - "slackhq.com", "slandr.net", - "slashdot.org", "slashine.onl", "slaytizle.com", - "slc.ac.uk", - "slcollege.ac.uk", - "slcs.ac.uk", - "sldo.ac.uk", - "sldolls.com", - "sleaford.ac.uk", "sleazydream.com", - "sleazyneasy.com", - "sleepandwakefulnessresearch.ac.uk", - "slg.ac.uk", + "sleazyfork.org", "slheng.com", - "sli-institute.ac.uk", "slickvpn.com", + "slides.com", "slides.new", - "slideshare.com", "slideshare.net", - "slidesharecdn.com", "slime.com.tw", - "sling.com", - "slinginternational.com", - "slingshot.co.nz", "slinkset.com", - "sloan.ac.uk", - "slobodnaevropa.mk", - "slotbitches.com", - "slsa.ac.uk", - "slss.ac.uk", - "slt-cdt.ac.uk", "slutload.com", "slutmoonbeam.com", - "sluts.xyz", - "sluttyrat.com", "slyip.com", "slyip.net", "sm-miracle.com", - "sm.ms", "sm3ha.ru", - "sma.ac.uk", - "small-angle.ac.uk", - "smallteenpussy.com", - "smart-edge.com", - "smart.ac.uk", - "smartcommunitiescoalition.com", - "smartcommunitiescoalition.org", "smartdnsproxy.com", - "smartexpos.com", - "smartfea.com", "smarthide.com", - "smartline.com.au", "smartmailcloud.com", - "smartnastran.com", - "smartone.com", - "smartoneholdings.com", - "smartonerobotics.com", - "smartonesolutions.com.hk", - "smartonesolutions.hk", - "smashed.xxx", "smashwords.com", - "smbgroup.ac.uk", - "smc.ac.uk", - "smca.ac.uk", - "smcblackburn.ac.uk", "smchbooks.com", - "smcl.ac.uk", - "smedevelopmentbank.com.mm", - "smg.ac.uk", "smh.com.au", "smhric.org", - "smi.ac.uk", "smith.edu", - "smithinst.ac.uk", - "sml.ac.uk", - "smmsp.xyz", - "smokinmovies.com", - "smplace.com", - "smpte.org", - "smru.ac.uk", - "smsj.ac.uk", - "smstc.ac.uk", - "smu.ac.uk", - "smuc.ac.uk", - "smucb.ac.uk", - "smul.ac.uk", - "smutcam.com", - "smutcams.com", - "smutindia.com", - "smutstone.com", - "smutty.com", - "smuttymoms.com", - "smyw.org", + "smn.news", "smyxy.org", - "snap-dev.net", - "snap-telemetry.io", - "snap.com", - "snapads.com", "snapchat.com", - "snapcraft.io", - "snapdragon.cn", - "snapdragonbooth.com", - "snapkit.co", "snapseed.com", - "snapstore.io", "snaptu.com", - "snapvolumes.com", - "snapwebcams.com", - "snc.ac.uk", "sndcdn.com", - "sneaker666.com", - "sneakerpage.net", - "sneakerskick.com", "sneakme.net", - "snjulebu.com", - "snk-corp.co.jp", - "snkplaymore.info", - "snow.me", - "snowcorp.com", + "snow-plus.net", "snowlionpub.com", - "snowmiku.com", - "snug.ac.uk", - "so-net.ne.jp", "so-net.net.tw", - "soas.ac.uk", - "soasta-dswb.com", "soav.com", "sobees.com", - "soc.ac.uk", "soc.mil", - "socailcam.com", - "socalbmw.com", - "socbcdt.ac.uk", - "soccerfanz.com.my", - "soccerfinancier.ca", - "soccermatchpass.com", - "socdm.com", - "social.com", "social.edu.ci", "socialblade.com", - "socialcam.com", - "socialcammail.com", - "socialkam.com", - "socialmediagirls.com", - "socialpolicy.ac.uk", - "socialsciences.ac.uk", "socialwhale.com", - "societycentral.ac.uk", - "societyofjewelleryhistorians.ac.uk", - "societyoflegalscholars.ac.uk", - "sociolotron.com", "socks-proxy.net", "sockscap64.com", "sockslist.net", "socrec.org", - "socres.ac.uk", - "socsciscotland.ac.uk", "sod.co.jp", - "soficdt.ac.uk", - "softbank-ipo.com", - "softbank-jp.com", - "softbank-robotics.com", - "softbank-telecom.com", - "softbank-telecom.net", - "softbank.jp", - "softbank.tv", - "softbankbb.com", - "softbankbb.net", - "softbankci.com", - "softbankhawksstore.jp", - "softbankmobile.net", - "softbankrobotics.com", - "softbanktelecom.com", - "softbankusa.net", - "softbankventuresasia.com", - "softbankworld.com", - "softeng-support.ac.uk", "softether-download.com", "softether.co.jp", "softether.org", "softfamous.com", "softlayer.net", - "softmattercdt.ac.uk", - "softmodels.net", "softnology.biz", "softonic.cn", "softsmirror.cf", - "software.ac.uk", "softwarebychuck.com", - "softwareoutlook.ac.uk", "sogclub.com", "sogoo.org", "sogrady.me", @@ -24478,1090 +5231,217 @@ var rules = [ "sohcradio.com", "sohfrance.org", "soifind.com", - "soillse.ac.uk", - "sojiy1124.top", "sokamonline.com", "sokmil.com", "solana.com", - "solarcity.com", - "solent-university.ac.uk", - "solent.ac.uk", - "solentmarineacademy.ac.uk", - "solentuniversity.ac.uk", "solidaritetibet.org", "solidfiles.com", - "solihull.ac.uk", - "solihullsfc.ac.uk", - "solostudioksale.com", - "solsfc.ac.uk", - "solutions-worcestershire.ac.uk", "solv.finance", - "solveforx.com", "somee.com", - "somerset.ac.uk", - "somersetcolleges.ac.uk", "songjianjun.com", "sonicbbs.cc", "sonidodelaesperanza.org", - "sonorousporn.com", - "sony-africa.com", - "sony-asia.com", - "sony-europe.com", - "sony-hes.co.jp", - "sony-latin.com", - "sony-mea.com", - "sony-olympus-medical.com", - "sony-promotion.eu", - "sony-semicon.co.jp", - "sony-semicon.com", - "sony.at", - "sony.ba", - "sony.be", - "sony.bg", - "sony.biz", - "sony.ca", - "sony.ch", - "sony.cl", - "sony.co.cr", - "sony.co.id", - "sony.co.in", - "sony.co.jp", - "sony.co.kr", - "sony.co.nz", - "sony.co.th", - "sony.co.uk", "sony.com", - "sony.com.ar", - "sony.com.au", - "sony.com.bo", - "sony.com.br", - "sony.com.co", - "sony.com.do", - "sony.com.ec", - "sony.com.gt", - "sony.com.hk", - "sony.com.hn", - "sony.com.mk", - "sony.com.mx", - "sony.com.my", - "sony.com.ni", - "sony.com.pa", - "sony.com.pe", - "sony.com.ph", - "sony.com.sg", - "sony.com.sv", - "sony.com.tr", - "sony.com.tw", - "sony.com.vn", - "sony.cz", - "sony.de", - "sony.dk", - "sony.ee", - "sony.es", - "sony.eu", - "sony.fi", - "sony.fr", - "sony.gr", - "sony.hr", - "sony.hu", - "sony.ie", - "sony.it", - "sony.kz", - "sony.lt", - "sony.lu", - "sony.lv", - "sony.net", - "sony.nl", - "sony.no", - "sony.pl", - "sony.pt", - "sony.ro", - "sony.rs", - "sony.ru", - "sony.se", - "sony.si", - "sony.sk", - "sony.ua", - "sonybo.co.jp", - "sonybsc.com", - "sonybuilding.jp", - "sonyclassics.com", - "sonydesign.com", - "sonydna.com", - "sonyentertainmentnetwork.com", - "sonyglobalsolutions.jp", - "sonykigyo.jp", - "sonylatvija.com", - "sonynetwork.co.jp", - "sonypcl.jp", - "sonypictures.com", - "sonypicturesanimation.com", - "sonypicturesmuseum.com", - "sonypicturesstudios.com", - "sonypicturestelevision.com", - "sonypicturestelevisiongames.com", - "sonyprotechnosupport.co.jp", - "sonystoragemedia.co.jp", - "sonytc.co.jp", - "soolakhi.com", - "soooyinfor.lol", "sopcast.com", "sopcast.org", "sophos.com", - "soporn.com", - "sora.com", - "sora6.com", "sorazone.net", - "sorcerersarena.com", "sorting-algorithms.com", "sos.org", - "sos44.com", - "soso7778.com", + "sosad.fun", "sosreader.com", "sostibet.org", - "sothebys-institute.ac.uk", - "soton.ac.uk", - "sots.ac.uk", "sotwe.com", "sou-tong.org", "soubory.com", - "souka.xyz", "soul-plus.net", "soulcaliburhentai.net", "soumo.info", - "sound-heritage.ac.uk", "soundcloud.com", - "soundofhope.eu", "soundofhope.kr", "soundofhope.org", "soundon.fm", - "soundsoftware.ac.uk", - "soundwell.ac.uk", "soup.io", "soupofmedia.com", - "source.ac.uk", - "sourceforge.com", "sourceforge.net", - "sourcehut.org", "sourcewadio.com", - "sourcingforebay.com.cn", - "sourcingforebay.net", - "sourcingforebay.tv", - "south-lanarkshire-college.ac.uk", "south-plus.net", "south-plus.org", - "south-thames.ac.uk", - "southampton-city.ac.uk", - "southampton-institute.ac.uk", - "southampton-solent-university.ac.uk", - "southampton.ac.uk", - "southamptonalumni.ac.uk", - "southamptonbusiness.ac.uk", - "southamptonsolentuniversity.ac.uk", - "southbank-university.ac.uk", - "southcheshirecollege.ac.uk", - "southcoastdtp.ac.uk", - "southcoll-bolton.ac.uk", - "southdevon.ac.uk", - "southdowns.ac.uk", - "southeastdtc.ac.uk", - "southeastessex.ac.uk", - "southend-acl-college.ac.uk", - "southend-adult.ac.uk", - "southend.ac.uk", - "southendcollege.ac.uk", - "southessex.ac.uk", - "southessexcollege.ac.uk", - "southfloridamini.com", - "southgate.ac.uk", - "southgrid.ac.uk", - "southkent.ac.uk", + "southmongolia.org", "southnews.com.tw", - "southport-college.ac.uk", - "southport.ac.uk", - "southsefton6thform.ac.uk", - "southsefton6thformcollege.ac.uk", - "southseftoncollege.ac.uk", - "southstaffs.ac.uk", - "southwales.ac.uk", - "southwark.ac.uk", - "southwestcollege.ac.uk", - "southwestiot.ac.uk", - "southwestnuclearhub.ac.uk", - "sovec.net", "sowers.org.hk", "sowiki.net", - "soyinyj.top", "soylent.com", "soylentnews.org", - "sp.cool", - "spa.ac.uk", - "spaceexplored.com", - "spacely.com.au", - "spacemail.com", - "spaceship.com", - "spaceuniversitiesnetwork.ac.uk", - "spaceweather.ac.uk", - "spacex.com", - "spaindisney.com", - "spalding.ac.uk", - "span.ac.uk", - "spankandbang.com", "spankbang.com", - "spankbang.party", - "spankbang1.com", - "spanking.wiki", - "spankingstudio.com", "spankingtube.com", - "spankmonster.com", - "spankred3d.com", "spankwire.com", - "sparc.ac.uk", - "sparqs.ac.uk", - "sparsholt.ac.uk", - "sparsholtcollegegroup.ac.uk", - "sparsholtcollegeservices.ac.uk", - "sparsholtservices.ac.uk", + "sparkpool.com", "spatial.io", - "spatialeconomics.ac.uk", "spb.com", - "spc.ac.uk", - "spcc-sp.com", - "spcollege.ac.uk", "speakerdeck.com", - "spearhead.kr", - "specialtyheadphones.com", - "spectraltube.com", - "spectrum.ac.uk", - "speeddreamride.com", - "speedfantasybid.com", - "speedhunters.com", + "speedcat.me", "speedify.com", - "speedproject.ac.uk", - "speedracegear.com", - "speedrun.com", - "speedtest.com.hk", - "speedxtra.com", - "spektral.cc", - "spelthorne.ac.uk", "spem.at", "spencertipping.com", "spendee.com", - "spermyporn.com", - "spero.ac.uk", - "speybay.com", - "spice.ac.uk", - "spicebar.de", "spicevpn.com", - "spiceworks.com", - "spiceworksstatic.com", - "spicybigtits.com", - "spider.ac.uk", "spideroak.com", - "spiedigitallibrary.org", + "spiderpool.com", "spiegel.de", "spike.com", - "spinesurgeons.ac.uk", - "spiritclubs.com", - "spiritofecstasy.com", - "spiritstudios.ac.uk", - "spitfire.ac.uk", - "spizoo.com", - "splatoon2tournament.com", - "splint-cetl.ac.uk", - "spokenword.ac.uk", - "sponichi.co.jp", - "spore.com", - "sportsfacebook.com", - "sportstream.com", - "sportswomanoftheyear.co.uk", - "sportswomenoftheyear.co.uk", "spotflux.com", - "spoti.fi", - "spotify-everywhere.com", "spotify.com", - "spotify.design", - "spotify.map.fastly.net", - "spotify.map.fastlylb.net", - "spotifycdn.com", - "spotifycdn.net", - "spotifycharts.com", - "spotifycodes.com", - "spotifyforbrands.com", - "spotifyjobs.com", - "spr.ac.uk", - "spraynwash.com", - "spreadprivacy.com", + "spreadsheet.new", "spreadshirt.es", - "sprg.ac.uk", + "spreaker.com", "spring-plus.net", "spring4u.info", "springboardplatform.com", - "springer.com", - "springerlink.com", - "springernature.com", "springwood.me", - "sprinklesapp.com", - "sprint.ac.uk", "sprite.org", "sproutcore.com", "sproxy.info", - "spsrn.ac.uk", - "sptvbroadcast.com", - "spurgeons.ac.uk", - "spyjinx.com", - "sqhwesternconsortium.ac.uk", - "sqlite.org", - "sqlserveronlinux.com", - "squ1.com", - "squarecapital.com", - "squarecdn.com", - "squarecloudservices.com", - "squarefoot.com.hk", - "squareup.com", - "squidplatform.com", "squirly.info", - "squirrelgroup.net", "squirrelvpn.com", - "sqyzh-dh.sbs", - "sr.ht", - "src.ac.uk", - "srebrenica360.com", - "srf.ac.uk", - "srhe.ac.uk", - "srip.ac.uk", - "sroc.ac.uk", "srocket.us", - "srpe.ac.uk", - "srs.ac.uk", - "srtcdn.net", - "srttu.edu", - "sruc.ac.uk", "ss-link.com", - "ss2.us", - "ss7.app", - "ssdevrd.com", - "ssees.ac.uk", - "ssfc.ac.uk", "ssglobal.co", "ssglobal.me", "ssh91.com", - "sshm.ac.uk", - "sshs.club", - "sshs.pw", - "sshs.xyz", - "ssl-certificate.ch", - "ssl-images-amazon.com", - "ssl.com", "ssl443.org", - "sslpaypal.org", - "ssmh.ac.uk", "sspanel.net", "sspanel.org", - "sspc.ac.uk", - "sspf.ac.uk", - "ssphr.ac.uk", - "ssplive.pw", "sspro.ml", "ssr.tools", - "ssrpass.pw", "ssrshare.com", + "ssrshare.us", + "ssrtool.com", "sss.camp", - "sss.xxx", - "sssfc.ac.uk", - "ssshuqian.xyz", - "sssins.com", - "sssjav.com", - "sssuo1.xyz", - "sstatic.net", "sstm.moe", "sstmlt.moe", "sstmlt.net", - "ssttest.net", - "ssu.ac.uk", - "ssx3.com", - "st-and.ac.uk", - "st-andrews.ac.uk", - "st-austell.ac.uk", - "st-davids-coll.ac.uk", - "st-ives.ac.uk", - "st-patricks.ac.uk", - "st.com", - "stac.ac.uk", - "stackage.org", - "stackapps.com", - "stackauth.com", "stackcommerce.net", - "stackexchange.com", - "stackmod.blog", - "stackoverflow.blog", - "stackoverflow.co", "stackoverflow.com", - "stackoverflow.email", - "stackoverflowbusiness.com", - "stackoverflowcareers.com", - "stackpath.com", - "stackpath.dev", - "stacksnippets.net", "stacksocial.com", - "stacyvandenbergboobs.com", - "stadia.dev", - "staffhub.ms", - "stafford.ac.uk", - "staffordcoll.ac.uk", - "staffordshire.ac.uk", - "staffs.ac.uk", "stage64.hk", - "stak.ac.uk", - "stamford.ac.uk", - "stamfordparktrust.ac.uk", - "standardsuniversity.org", "standupfortibet.org", "standwithhk.org", "stanford.edu", - "stanmore.ac.uk", - "stanstedairportcollege.ac.uk", - "star-brasil.com", - "star-latam.com", - "star.ac.uk", - "starbucks-stars.com", - "starbucks.ad", - "starbucks.at", - "starbucks.be", - "starbucks.bg", - "starbucks.ca", - "starbucks.ch", - "starbucks.co.id", - "starbucks.co.jp", - "starbucks.co.nz", - "starbucks.co.th", - "starbucks.co.uk", - "starbucks.co.za", - "starbucks.com", - "starbucks.com.ar", - "starbucks.com.bn", - "starbucks.com.co", - "starbucks.com.cy", - "starbucks.com.gr", - "starbucks.com.hk", - "starbucks.com.kh", - "starbucks.com.kz", - "starbucks.com.mx", - "starbucks.com.my", - "starbucks.com.pe", - "starbucks.com.sg", - "starbucks.com.tr", - "starbucks.com.uy", - "starbucks.de", - "starbucks.dk", - "starbucks.es", - "starbucks.fr", - "starbucks.hu", - "starbucks.ie", - "starbucks.in", - "starbucks.it", - "starbucks.nl", - "starbucks.no", - "starbucks.ph", - "starbucks.pl", - "starbucks.pt", - "starbucks.rs", - "starbucks.ru", - "starbucks.se", - "starbucks.tt", - "starbucks.vn", - "starbucksathome.com", - "starbucksavie.ca", - "starbuckscard.ph", - "starbuckscardb2b.com", - "starbuckscoffee.cz", - "starbuckscoffeegear.com", - "starbuckscoffeegearstore.com", - "starbucksforlife.ca", - "starbucksforlife.com", - "starbuckspoq.com", - "starbucksreserve.com", - "starbucksrewardsstarland.ca", - "starbucksrewardsstarland.com", - "starbucksromania.ro", - "starbucksrtd.com", - "starbucksslovakia.sk", - "starbuckssummergame.ca", - "starbuckssummergame.com", - "starcraft.com", - "starcraft2.com", - "starfieldtech.com", "starfishfx.com", - "starfox.com", - "stark-verlag.ch", - "starlink.ac.uk", - "starott.com", "starp2p.com", - "starplus.com", - "stars.ac.uk", - "starship-ent.com", - "starsze.icu", - "start.com", "startpage.com", - "startpath.com", - "startupjournal.com", "startuplivingchina.com", - "startupschool.org", - "starwars.com", - "starwarsbattlefront.com", - "starwarsbattlefront2.com", - "starwarsfallenorder.com", - "starwarsgalacticstarcruiser.com", - "starwarsjedifallenorder.com", - "starwarskids.com", - "starwarstheoldrepublic.com", "stat.gov.tw", "state.gov", - "stateofthemap.com", - "stateofthemap.org", - "static-cisco.com", "static-economist.com", - "static-nike.com", - "static-verizon.com", - "static.fun", - "static9.net.au", + "statically.io", "staticflickr.com", - "statistics.ac.uk", "statsig.com", - "statsmakemecry.com", - "statstutor.ac.uk", "statueofdemocracy.org", - "statuspage.io", - "staugustinescollege.ac.uk", - "staxus.com", "stboy.net", - "stbr.ac.uk", - "stbrendans.ac.uk", - "stbrn.ac.uk", - "stc-server.com", - "stc.ac.uk", "stc.com.sa", - "stcg.ac.uk", - "stchads.ac.uk", - "stcharles-mail.ac.uk", - "stcharles.ac.uk", - "stclares.ac.uk", - "stcoll.ac.uk", - "stcroixmosquito.com", - "stcroixmosquitoproject.com", - "stdavidscollege.ac.uk", - "stdavidsdaygroup.ac.uk", - "stdoms.ac.uk", - "steam-api.com", - "steam-chat.com", - "steam.tv", "steamcommunity.com", - "steamcontent.com", - "steamdb.info", - "steamdeck.com", - "steamgames.com", - "steamhouse.ac.uk", - "steamofporn.com", "steampowered.com", - "steamserver.net", "steamstatic.com", - "steamunlocked.net", - "steamusercontent.com", - "steamygamer.com", - "stec.ac.uk", "steel-storm.com", - "steelbrick.com", "steemit.com", - "steezylist.com", "steganos.com", "steganos.net", - "stem.ac.uk", - "stemacademy.ac.uk", - "stemequals.ac.uk", "stepchina.com", - "stepdaughter.love", - "stepfamilyporn.com", "stephaniered.com", - "stephenson.ac.uk", - "stephensoncoll.ac.uk", - "stepmaturesex.com", - "stepmom.one", - "stepsiblingscaught.com", - "sterling.ac.uk", - "stets.ac.uk", - "stfc.ac.uk", - "stgeorges.ac.uk", "stgloballink.com", - "sth-leic-coll.ac.uk", "stheadline.com", - "sthelens.ac.uk", - "sthelensacl.ac.uk", "sthoo.com", "stickam.com", "stickeraction.com", - "stickofjoy.com", "stileproject.com", - "stimorolsex.com", - "stin31.ru", - "stingrayengine.com", - "stir.ac.uk", - "stirling.ac.uk", - "stjohns-nottm.ac.uk", - "stlouisbmw.net", - "stloyes.ac.uk", - "stlukes.ac.uk", - "stmartins.ac.uk", - "stmarys-belfast.ac.uk", - "stmarys-blackburn.ac.uk", - "stmarys-sfc.ac.uk", - "stmarys.ac.uk", - "stmarysblackburn.ac.uk", - "stmaryslondon.ac.uk", - "stmellitus.ac.uk", - "stmellituscollege.ac.uk", - "stmichaels.ac.uk", + "stitcher.com", "sto.cc", - "stockagainstphotography.com", - "stockbill.ac.uk", - "stocking-tease.com", - "stockingfetishvideo.com", - "stockport.ac.uk", - "stockton.ac.uk", - "stocktonlearningandskillsservice.ac.uk", - "stocktonsfc.ac.uk", - "stocsf.ac.uk", - "stokecoll.ac.uk", - "stokecollege.ac.uk", - "stokesfc.ac.uk", - "stomp.ac.uk", - "stonefoxlingerie.com", - "stonefoxproductions.com", - "stonyhurst.ac.uk", "stoporganharvesting.org", "stoptibetcrisis.net", - "storage.googleapis.com", "storagenewsletter.com", - "storcuram.ac.uk", - "store-bridgestonesports.com", - "storesense.com", "stories.google", - "storiesofchange.ac.uk", - "storiesonline.net", "storify.com", "storj.io", "storm.mg", "stormmediagroup.com", - "storyful.com", - "stourbridge.ac.uk", - "stow.ac.uk", "stoweboyd.com", - "stpadarns.ac.uk", - "straightouttasomewhere.com", - "straightpornstuds.com", "straitstimes.com", - "stran.ac.uk", "stranabg.com", "straplessdildo.com", - "strat-avon.ac.uk", - "stratavoncol.ac.uk", - "stratford.ac.uk", - "stratfordislanduniversitycentre.ac.uk", - "stratforduniversitycentre.ac.uk", - "stratgroup.ac.uk", - "strath.ac.uk", - "strathclyde.ac.uk", - "strathmore.ac.uk", - "stream-mydirtyhobby.biz", "streamable.com", "streamate.com", - "streamingdisney.net", - "streamingporn.xyz", + "streamguys1.com", "streamingthe.net", - "streamlatina.com", - "streamporn.cc", - "streamporn.pw", - "streamsex.com", "streema.com", - "streetmeatasia.com", "streetvoice.com", - "strepsils.at", - "strepsils.ch", - "strepsils.co.kr", - "strepsils.co.nz", - "strepsils.co.za", - "strepsils.com.ar", - "strepsils.com.au", - "strepsils.com.br", - "strepsils.com.co", - "strepsils.com.hk", - "strepsils.com.ph", - "strepsils.com.tw", - "strepsils.es", - "strepsils.fi", - "strepsils.fr", - "strepsils.hr", - "strepsils.hu", - "strepsils.ie", - "strepsils.net", - "strepsils.pl", - "strepsils.pt", - "strepsils.ro", - "strepsils.ru", - "strepsils.si", - "strepsils.us", - "strepsilsarabia.com", - "streva.ac.uk", "striek.com", "strikingly.com", - "strikinglycdn.com", - "strip-poker.xxx", - "stripcamfun.com", - "stripchat.com", - "stripe-terminal-local-reader.net", - "stripe.ac.uk", - "stripe.com", - "stripe.network", - "stripecdn.com", - "stripparadise.com", - "stripselector.com", - "stripskunk.com", - "stripst.com", - "strode-coll.ac.uk", - "strode-college.ac.uk", - "strodes.ac.uk", - "strodeslanguages.ac.uk", "strongvpn.com", "strongwindpress.com", - "stroud.ac.uk", - "stroudcol.ac.uk", - "stroudcollege.ac.uk", - "sttc.ac.uk", "student.tw", - "studentengagement.ac.uk", "studentsforafreetibet.org", - "studentshows.ac.uk", - "studentvoteregistration.ac.uk", - "studentvoterregistration.ac.uk", - "studiobeatsbydrdre.com", - "studiofow.com", - "studiolico.com", - "studioluxus.com", - "studioncorp.com", - "studiopaint.com", - "studiosucks.com", - "studygroup.ac.uk", - "studyhigher.ac.uk", - "studyinengland.ac.uk", - "studyingeconomics.ac.uk", - "studyinglanguages.ac.uk", - "studyinwales.ac.uk", - "studylondon.ac.uk", - "studywatchbyverily.com", - "studywatchbyverily.org", - "studywithplymouth.ac.uk", - "stufferdb.com", - "stuidok110.com", - "stuk.ac.uk", "stumbleupon.com", - "stunnel.org", - "stupidcams.com", "stupidvideos.com", - "stvincent.ac.uk", "stweetly.com", - "stxmosquito.com", - "stxmosquitoproject.com", - "stxmosquitoproject.net", - "stxmosquitoproject.org", - "sub147.com", - "sublimedirectory.com", - "sublimetext.com", - "submarin.online", - "submittal-log.com", - "submityourflicks.com", - "subscene.com", "substack.com", - "suburbansolutions.ac.uk", - "succeeds.ac.uk", "successfn.com", - "successwithteams.com", - "sucksex.com", "sueddeutsche.de", - "suffolk-maag.ac.uk", - "suffolk.ac.uk", - "suffolkacademiestrust.ac.uk", - "suffolkbusinessschool.ac.uk", - "suffolkone.ac.uk", "sugarsync.com", "sugobbs.com", "sugumiru18.com", "suissl.com", - "sukafeti.jp", - "sukebelinks.com", - "sulc.ac.uk", "sulian.me", - "sulne.ac.uk", - "sulsa.ac.uk", - "sulwerphoto.com", - "sumac.ac.uk", "summify.com", - "sumomo-ch.com", "sumrando.com", - "sums.ac.uk", - "sumsconsulting.ac.uk", - "sun.com", "sun1911.com", - "sunbingo.co.uk", - "suncat.ac.uk", - "suncol.ac.uk", - "sund.ac.uk", - "sundanceignite2016.com", "sundayguardianlive.com", - "sundayready.com", - "sunderland.ac.uk", - "sunderlandcollege.ac.uk", - "sunderlandsixthform.ac.uk", - "sunglassessale2014.com", - "sunitec.ac.uk", "sunmedia.ca", "suno.ai", + "suno.com", "sunporno.com", "sunskyforum.com", "sunta.com.tw", "sunvpn.net", "suoluo.org", - "supa.ac.uk", - "supanimegames.com", - "supc.ac.uk", "supchina.com", - "superadultgames.com", - "supercell.com", - "supercell.net", - "supercoach.com.au", - "supercomputingwales.ac.uk", - "superdarn.ac.uk", - "superearsenjoy.com", "superfreevpn.com", - "supergratisporno.com", - "superhqporn.com", - "superjanet.ac.uk", - "superjapanesesex.com", - "superjournal.ac.uk", - "supermario.com", - "supermario3dworld.com", - "supermariogalaxy.com", - "supermariorun.com", "superokayama.com", "superpages.com", - "superpapermario.com", - "supersexeamateur.com", - "superstation.com.tw", - "superstem.ac.uk", - "supertop-100.com", - "superuser.com", "supervpn.net", "superzooi.com", "supjav.com", "suppig.net", - "supply-chain.ac.uk", - "supplybestjerseys.com", - "supportfacebook.com", - "supremacy.com", - "supremacy.net", "suprememastertv.com", - "sureporn.com", - "surf.ac.uk", - "surface.com", "surfeasy.com", "surfeasy.com.au", - "surflite.co", - "surflite.net", "surfshark.com", "suroot.com", - "surrart.ac.uk", - "surrealismcentre.ac.uk", "surrenderat20.net", - "surrey.ac.uk", - "surreyadultlearning.ac.uk", - "surreyibc.ac.uk", - "surreyspace.ac.uk", - "suruga-ya.com", - "suruga-ya.jp", - "surveynet.ac.uk", - "suschem-nottingham-cdt.ac.uk", - "sushi.ski", - "susiewildin.com", - "sussex.ac.uk", - "sussexbusinessschool.ac.uk", - "sussexcoast.ac.uk", - "sussexdowns.ac.uk", - "sussexmedicalschool.ac.uk", - "sussexvirtualcollege.ac.uk", - "sussp.ac.uk", - "sustain.ac.uk", "sustainability.google", - "sustainabilityexchange.ac.uk", - "sustainablebuildingstudio.com", - "sustainabledesigncouncil.com", - "sustainabledesigncouncil.net", - "sustainablehydrogen-cdt.ac.uk", - "sustainablelifestyles.ac.uk", - "sustainablepractices.ac.uk", - "sustainableproperty.ac.uk", - "sustainableprosperity.ac.uk", - "sustainabletechnologies.ac.uk", - "sustainsteel.ac.uk", - "sustainthesound.com", - "susx.ac.uk", - "sutcol.ac.uk", - "sutcoll.ac.uk", - "suttoncollege.ac.uk", - "suxib.com", - "suxiebu.com", "suyangg.com", - "svaboda.org", - "svc.ms", - "svensksexfilm.com", - "sverigebeatsbydrdre.com", - "svipshipin.store", - "svoboda.org", - "svobodnaevropa.bg", - "svp-team.com", - "svpply.com", - "svscomics.asia", - "svscomics.com", "svsfx.com", - "svsgames.org", - "sw-iot.ac.uk", - "swag-live.co", - "swag.live", "swagbucks.com", - "swan.ac.uk", - "swancoll.ac.uk", - "swanmet.ac.uk", - "swansea-institute.ac.uk", - "swansea.ac.uk", - "swanseamet.ac.uk", - "swap.ac.uk", - "swapbox.ac.uk", - "swapsmut.com", "swapspace.co", - "swarf.ac.uk", - "sway-cdn.com", - "sway.com", - "swbio.ac.uk", "swbusdev.com", - "swc.ac.uk", - "swdtc.ac.uk", - "swdtp.ac.uk", - "sweep.ac.uk", - "sweetadult-tube.com", - "sweetandmaxwell.co.uk", - "sweetsext.com", - "sweetsinner.com", - "swegold.com", - "sweltec.ac.uk", - "swift.ac.uk", - "swift.org", - "swiftbank.info", - "swiftbank.us", - "swiftcapital.com", - "swiftfinancial.com", - "swiftfinancial.info", - "swiftfinancial.net", - "swincoll.ac.uk", - "swindon-college.ac.uk", - "swindon.ac.uk", - "swindonart.ac.uk", - "swingercuckoldporn.com", - "swingerpornfun.com", - "swingerporntube.com", - "swingers-homemade-videos.com", - "swingersexorgy.com", - "swingexpert.nl", - "swiot.ac.uk", - "swiss-machining.com", - "swiss-turn.com", - "swissid.ch", - "swissign.com", - "swissign.li", "swissinfo.ch", - "swisssign-group.ch", - "swisssign-group.com", - "swisssign-group.li", - "swisssign.ch", - "swisssign.com", - "swisssign.li", - "swisssign.net", - "swisssign.org", - "swisssigner.ch", - "swisssigner.com", - "swisssigngroup.ch", - "swisssigngroup.com", - "swissstick.com", - "swisstsa.ch", - "swisstsa.li", "swissvpn.net", "switch1.jp", "switchvpn.net", - "swjedifallenorder.com", - "swjfo.com", - "swlacademicnetwork.ac.uk", - "swlc.ac.uk", - "swoo.sh", - "swoosh.com", - "swoosh.tv", - "sworcs.ac.uk", - "swrac.ac.uk", - "swtor.com", - "swtor.net", - "swurcc.ac.uk", - "sww-ahdtp.ac.uk", - "swwcte.ac.uk", - "swwhep.ac.uk", - "sx.ac.uk", - "sxarab.top", - "sxshentai.com", - "sxyprn.com", - "sybj91.one", - "sybjav.online", - "sycolleges.ac.uk", "sydneytoday.com", - "syfec.ac.uk", - "syfor.click", - "syhacked.com", "sylfoundation.org", - "symantec.com", - "symcb.com", - "symcd.com", - "symonds.ac.uk", - "synaptic.net", - "synbio-cdt.ac.uk", + "synapse.org", "syncback.com", - "syncbak.com", "synergyse.com", - "synology.com", - "synologydownload.com", - "synologyupdate.com", - "synsym.ac.uk", - "syntheticbiology.ac.uk", "syosetu.com", - "sysinternals.com", - "sysmic.ac.uk", "sysresccd.org", - "systemicrisk.ac.uk", "sytes.net", "syx86.cn", "syx86.com", - "syzbj36.xyz", - "szabadeuropa.hu", "szbbs.net", - "szcheapmonsterheadphones.com", "szetowah.org.hk", - "szexvideo.top", - "szwinnertechnology.com", "t-g.com", - "t-mus.ac.uk", - "t-splines.com", "t.co", "t.me", "t35.com", @@ -25571,40 +5451,20 @@ var rules = [ "taa-usa.org", "taaze.tw", "tablesgenerator.com", - "tablet-academy.ac.uk", - "taboola.com", - "tabooporn.tv", - "tabooporns.com", - "tabootube.xxx", "tabtter.jp", - "tabustudios.co", - "tacamateurs.com", - "tacc.ac.uk", "tacem.org", - "tachusz.xyz", "taconet.com.tw", "taedp.org.tw", "tafm.org", - "tagapie.com.tw", "tagesschau.de", - "tags.ac.uk", "tagwa.org.au", "tagwalk.com", "tahr.org.tw", - "taiav.com", - "tail-f.com", - "tailf.com", - "tailscale.com", - "tailscale.io", - "tailwindtraders.com", - "taiolongdh.sbs", "taipei.gov.tw", "taipeisociety.org", "taipeitimes.com", "taisounds.com", - "tait.ac.uk", "taiwan-sex.com", - "taiwanadultexpo.com", "taiwanbible.com", "taiwancon.com", "taiwandaily.net", @@ -25619,89 +5479,34 @@ var rules = [ "taiwanncf.org.tw", "taiwannews.com.tw", "taiwanonline.cc", - "taiwansex.tw", "taiwantp.net", "taiwantt.org.tw", "taiwanus.net", "taiwanyes.com", - "take2games.com", - "takegoto.com", - "takens.tw", - "takeyourplace.ac.uk", - "taknai.com", - "takporn.com", - "talentlens.com", - "taleofthenight.com", "talk853.com", "talkboxapp.com", "talkcc.com", - "talkinghealthmatters.ac.uk", "talkonly.net", - "talksport.com", - "tamescol.ac.uk", - "tameside-acl.ac.uk", - "tameside.ac.uk", - "tamesidecollege.ac.uk", "tamiaode.tk", - "tamilsexvideos.cc", "tampabay.com", - "tamworth.ac.uk", - "tamworthandlichfield.ac.uk", "tanc.org", - "tandberg-china.com", - "tandberg.com", - "tandf.co.uk", - "tandfonline.com", - "tanflix.com", "tangben.com", - "tangbr.net", "tangren.us", - "tantaly.com", - "taoil-cn.sbs", "taoism.net", "taolun.info", - "taose.in", "tapanwap.com", "tapatalk.com", - "tapb.ac.uk", - "tapestry.ac.uk", - "taptotokyo.com", - "taqunuhai.vip", - "taradinhos.com", "taragana.com", - "tarf-lcv.ac.uk", + "tardigrade.io", "target.com", - "targetedgrad.ac.uk", - "targetimg1.com", - "tarn.ac.uk", - "tasc.ac.uk", "tascn.com.au", - "tasexy.com", - "tasexy.top", - "taste.com.au", - "tasteofpremium.jp", - "tastyblacks.com", - "tati-log.com", - "tau.ac.uk", - "tauntons.ac.uk", "taup.net", "taup.org.tw", - "tavi-port.ac.uk", - "tavistockandportman.ac.uk", - "tavistockrelationships.ac.uk", "taweet.com", - "tawny-peaks.com", - "taxi69.com", - "taxidrivermovie.com", - "tay.ac.uk", - "taylorandfrancis.com", - "taylorfrancis.com", "tbcollege.org", "tbi.org.hk", - "tbib.org", "tbicn.org", "tbjyt.org", - "tbm.ac.uk", "tbpic.info", "tbrc.org", "tbs-rainbow.org", @@ -25713,480 +5518,130 @@ var rules = [ "tbswd.org", "tbtemple.org.uk", "tbthouston.org", - "tcat.ac.uk", - "tcch.ac.uk", - "tccr.ac.uk", "tccwonline.org", "tcewf.org", - "tcg.ac.uk", "tchrd.org", - "tcm.ac.uk", "tcnynj.org", - "tcpartnership.ac.uk", "tcpspeed.co", "tcpspeed.com", "tcsofbc.org", "tcsovi.org", "tdesktop.com", "tdm.com.mo", - "tdotp.ac.uk", - "teachenergy.ac.uk", - "teacherfucksteens.com", - "teachingaccessibility.ac.uk", - "teachingshakespeare.ac.uk", - "teachmyass.com", "teachparentstech.org", "teamamericany.com", - "teamneedforspeed.com", - "teamskeet.com", - "teamviewer.com", - "teamviewer.us", - "teamwork.ac.uk", - "tean.ac.uk", - "tearapeak.com", - "teatroporno.com", - "tec.ac.uk", - "techatbloomberg.com", "techcrunch.com", - "techextra.ac.uk", - "techhub.ms", - "techliquidators.com", - "techne.ac.uk", "technews.tw", - "technics.com", - "technologyandsociety.org", - "techradar.com", "techspot.com", - "techstreet.com", - "techtimes.com", "techviz.net", - "techxtra.ac.uk", "teck.in", "teco-hk.org", "teco-mo.org", - "ted.com", - "tedcdn.com", "teddysun.com", - "tedi-london.ac.uk", - "tedi.ac.uk", - "teds.ac.uk", - "teen-girl.net", - "teen-lover.net", - "teen-sexy.com", - "teen3x.mobi", - "teenagefucking.com", - "teenchoice.com", - "teendreams.com", "teenfucks.org", - "teengirlfriendtube.com", "teeniefuck.net", - "teenporngallery.net", - "teenporntube.xxx", - "teenpornvideo.xxx", - "teenport.com", - "teenpussypicture.com", - "teenqueens.net", - "teenrave.org", - "teensex.me", "teensinasia.com", - "teensloveanal.com", - "teensloveporn.net", - "teensnow.com", - "teensnow.link", - "teentube.pro", - "teenwebcamtube.com", "teepr.com", - "tees.ac.uk", - "teeslearn.ac.uk", - "teesside.ac.uk", - "teesvalley-acl.ac.uk", - "teeztube.com", - "tegrazone.co", - "tegrazone.co.kr", - "tegrazone.com", - "tegrazone.jp", - "tegrazone.kr", "tehrantimes.com", - "tel.ac.uk", - "telebay.com", "telecomspace.com", - "telega.one", "telegra.ph", "telegram-cdn.org", - "telegram-porn.com", "telegram.dog", "telegram.me", "telegram.org", "telegram.space", "telegramdownload.com", "telegraph.co.uk", - "telekom.com", - "telekom.de", "telesco.pe", - "telesec.de", - "telesell.com", - "telex.cc", - "telfordcollege.ac.uk", - "tellapart.com", "tellme.pw", - "tellmewhygame.com", - "tellusgb.ac.uk", - "telri.ac.uk", - "temenos.ac.uk", - "temetube.xyz", - "tempusuk.ac.uk", "tenacy.com", - "tenbyfotolia.com", "tenor.com", "tensorflow.org", - "tentowns.ac.uk", "tenzinpalmo.com", "terabox.com", - "terapeack.com", - "terapeak.ca", - "terapeak.com", - "terapeak.com.hk", - "terapeak.hk", - "terapeak.info", - "teraperk.com", - "terc.ac.uk", - "terk.nl", - "termius.com", - "termux.com", - "termux.dev", - "termux.org", - "terraform.io", - "terragraph.com", - "terrapeak.com", - "tesla.com", - "tesla.services", - "teslaenergy.services", - "teslamotors.com", - "teslazta.net", - "test-ipv6.cl", - "test-ipv6.com", - "test-ipv6.cz", - "test-ipv6.hu", - "test-ipv6.is", - "test-ipv6.se", - "testa.ac.uk", - "testipv6.de", - "testonfox.com", - "tettediferro.it", "tew.org", - "tex-talk.net", - "tex.ac.uk", - "textminingcentre.ac.uk", + "textnow.com", "textnow.me", - "texttobuy.org", - "texture.com", - "tferwq.com", + "tfc-taiwan.org.tw", "tfhub.dev", "tfiflve.com", - "tfsallin.net", - "tg.dev", - "tgac.ac.uk", - "tgirlcentral.com", - "tgirlpostop.com", - "tgp6.com", + "tg-me.com", "tgstat.com", - "tgtube.com", - "tgutube.com", - "thai-xxx.com", - "thai69.com", - "thaichix.com", "thaicn.com", - "thaicuties.com", - "thaigirls.net", - "thaigirls100.net", - "thamesgatewaycollege.ac.uk", - "thamesvalleytraining.ac.uk", - "thanet.ac.uk", - "thanetcollege.ac.uk", - "thanksloyalty.com", - "thatcham.ac.uk", - "thawte.com", - "thawte.de", - "thawte.fr", "thb.gov.tw", - "thdh.cc", - "the-area.com", - "the-british-museum.ac.uk", - "the-britishmuseum.ac.uk", - "the-etc.ac.uk", - "the-japan-news.com", - "the-m-festival.com", - "the-monster-beats.com", - "the-tls.co.uk", - "the123d.com", - "theadulthub.com", - "theaffairs.com", "theage.com.au", - "thealanturinginstitute.ac.uk", - "thearden.ac.uk", "theatlantic.com", "theatrum-belli.com", "theaustralian.com.au", - "theav.cc", - "theav.xyz", "theb.ai", - "thebanker.com", - "thebankerdatabase.com", - "thebayuk.com", - "thebcc.ac.uk", "thebcomplex.com", - "thebeatsbydre.com", - "thebeatsbydre.net", - "thebeatsheadphonesale.com", - "thebestfetishsites.com", "theblaze.com", "theblemish.com", - "theblock.co", "thebobs.com", "thebodyshop-usa.com", - "thebondagefiles.com", - "thebritishacademy.ac.uk", - "thebritishmuseum.ac.uk", - "thecamdude.com", - "thecandidbay.com", - "thecandidforum-voyeur.ru", - "thechesterfieldcollegegroup.ac.uk", + "thechasernews.co.uk", "thechinabeat.org", "thechinacollection.org", "thechinaproject.com", "thechinastory.org", - "thechronicle.com.au", - "theclasshroom.com", - "thecleversense.com", - "theclub.com.hk", - "theclubprive.com", - "thecobaltstudy.ac.uk", - "thecompaqstore.com", - "thecontactpartnership.ac.uk", "theconversation.com", - "thecpc.ac.uk", - "thecuckold.com", - "thecuckoldporn.com", - "thedailysnkr.com", "thedalailamamovie.com", - "thedesignworkshop.com", - "thedesk.com", - "thedigitalpicture.ac.uk", "thediplomat.com", - "thedreadwolfrises.com", "thedw.us", - "theebayshop.com", "theepochtimes.com", - "theepochtimessubscribe.com", - "theetc.ac.uk", "thefacebook.com", - "thefacebook.net", - "thefappening.pro", - "thefappening.wiki", - "thefappeningblog.com", - "thefind.com", - "thefoxnation.com", "thefrontier.hk", - "thegatewaypundit.com", "thegay.com", - "thegayoffice.com", - "thegeorgiascene.com", "thegioitinhoc.vn", - "thegithubshop.com", - "theglobalsite.ac.uk", "thegly.com", - "thegooglestore.com", - "thegraduationproject.ac.uk", "theguardian.com", - "theguardiandns.com", - "thehabibshow.com", - "thehealthsite.com", - "thehenleycollege.ac.uk", - "thehentaiworld.com", "thehindu.com", "thehots.info", "thehousenews.com", - "thehulubraintrust.com", "thehun.net", - "theindianleaks.com", "theinitium.com", - "theinstagramhack.com", - "theintelstore.com", - "theinternetlawschool.ac.uk", - "theinventionworks.com", - "theinventionworks.net", - "thekarups.com", - "theknowledgeacademy.ac.uk", - "thelancet.com", - "theleakbay.com", - "thelearningcentrebexley.ac.uk", - "thelearningconsortium.ac.uk", - "thelearningmatrix.ac.uk", - "thelegendarystarfy.com", - "theletterspage.ac.uk", - "thelittleslush.com", - "thelondonknowledgelab.ac.uk", - "theman.in", - "themanchestercollege.ac.uk", - "themarvelexperiencetour.com", - "themathsfactor.com", - "themercury.com.au", - "themessengeradelaide.com.au", - "themilfmovies.com", - "themis.ac.uk", - "themoviedb.org", - "thenationalpulse.com", - "thenewgirlspooping.com", - "thenewporn.com", "thenewslens.com", - "thenextweb.com", - "thenipslip.com", - "theoca.ac.uk", - "theopportunityproject.org", - "thepaypalshop.com", - "thepervs.com", "thepiratebay.ee", "thepiratebay.org", - "theplatform.com", - "theporn.cc", - "thepornarea.com", - "thepornbest.com", - "thepornbet.com", - "thepornbin.com", - "thepornblender.com", - "theporndude.cc", "theporndude.com", - "theporndude.vip", - "thepornguy.org", - "thepornlinks.com", - "thepornlist.com", - "thepornlist.net", - "thepornlistdude.com", - "thepornmap.com", - "thepornscat.com", - "theporntoplist.com", - "theporny.com", "theportalwiki.com", "theprint.in", "thereallove.kr", "therock.net.nz", - "theroslininstitute.ac.uk", - "thesafeporn.com", "thesaturdaypaper.com.au", - "thesaurus.ac.uk", - "thescottishsun.co.uk", - "thesenses.ac.uk", - "thesesalive.ac.uk", - "thesffblog.com", - "theshoppingexpresslane.net", - "thesims.com", - "thesims3.com", - "thesims4.com", - "thesimssocial.com", - "theskillsco.ac.uk", "thespeeder.com", "thestandard.com.hk", "thestandnews.com", "thestar.com", - "thestationbymaker.com", - "thesun.co.uk", - "thesun.ie", - "thesundaytimes.co.uk", - "thethothub.com", + "thetatoken.org", "thetibetcenter.org", "thetibetconnection.org", "thetibetmuseum.org", "thetibetpost.com", - "thetimes.co.uk", - "thetimes.ie", - "thetinhat.com", - "thetranny.com", - "thetread.com", "thetrotskymovie.com", "thetvdb.com", - "thetype.com", - "theuab.net", - "theverge.com", - "thevirtualsexreview.com", "thevivekspot.com", - "theweek.in", "thewgo.org", - "thewomenslibrary.ac.uk", - "thewonderful101.com", + "thewirechina.com", "theync.com", - "theyxxx.com", - "thieme-connect.com", - "thieme-connect.de", - "thieme.com", - "thieme.de", - "thinkboxsoftware.com", - "thinkdifferent.us", "thinkgeek.com", - "thinkhigher.ac.uk", "thinkhk.com", - "thinking3d.ac.uk", "thinkingtaiwan.com", - "thinkofliving.com", - "thinkquarterly.co.uk", - "thinkquarterly.com", - "thinkwales.ac.uk", "thinkwithgoogle.com", + "thirdmill.org", "thisav.com", - "thisismoney.co.uk", - "thisispolaris.com", - "thismon.ee", - "thisvid.com", - "thisvidscat.net", "thlib.org", "thomasbernhard.org", - "thomasdanby.ac.uk", - "thomashpc.ac.uk", - "thomasway.ac.uk", - "thomroth.ac.uk", - "thomsonreuters.ca", - "thomsonreuters.cn", - "thomsonreuters.co.jp", - "thomsonreuters.co.kr", - "thomsonreuters.co.nz", - "thomsonreuters.co.uk", - "thomsonreuters.com", - "thomsonreuters.com.ar", - "thomsonreuters.com.au", - "thomsonreuters.com.br", - "thomsonreuters.com.hk", - "thomsonreuters.com.my", - "thomsonreuters.com.pe", - "thomsonreuters.com.sg", - "thomsonreuters.com.tr", - "thomsonreuters.es", - "thomsonreuters.in", - "thomsonreuters.ru", - "thomsonreutersmexico.com", "thongdreams.com", - "thornbeck.ac.uk", - "thotbook.tv", - "thothub.ru", - "thothub.to", - "thottok.com", - "thotvids.com", "threadreaderapp.com", "threads.net", "threatchaos.com", - "thri.xxx", - "thrixxx.com", - "thron.com", "throughnightsfire.com", - "thtmod1.com", - "thumbnailseries.com", + "thu.monster", + "thuhole.com", "thumbzilla.com", - "thunderbird.net", - "thunderbolttechnology.net", - "thurrock.ac.uk", - "thurrockcampus.ac.uk", "thywords.com", "thywords.com.tw", - "thz7.net", - "thzu.cc", "tiananmenduizhi.com", "tiananmenmother.org", "tiananmenuniv.com", @@ -26194,15 +5649,10 @@ var rules = [ "tiandixing.org", "tianhuayuan.com", "tianlawoffice.com", - "tiantang.today", "tianti.io", "tiantibooks.org", "tianyantong.org.cn", "tianzhu.org", - "tiava.com", - "tiava1.com", - "tiaz.site", - "tiberiumalliances.com", "tibet-envoy.eu", "tibet-foundation.org", "tibet-house-trust.co.uk", @@ -26285,198 +5735,72 @@ var rules = [ "tibettimes.net", "tibettruth.com", "tibetwrites.org", - "tiburon.com", - "tic.ac.uk", - "tickdata.com", "ticket.com.tw", - "tictoc.video", - "tictocs.ac.uk", - "tidal.com", - "tidalhifi.com", - "tidelift.com", - "tiendabestbuy.com", - "tiffany-towers.com", - "tig-ol-bitties.live", "tigervpn.com", - "tiipple.ac.uk", - "tik-tokapi.com", "tiktok.com", - "tiktokcdn-eu.com", "tiktokcdn-us.com", "tiktokcdn.com", - "tiktokd.net", - "tiktokd.org", "tiktokv.com", - "tiktokv.eu", "tiktokv.us", - "tiktokw.eu", - "tiktokw.us", - "tilehill.ac.uk", "tiltbrush.com", "timdir.com", "time.com", - "time.gov", - "timefxapp.com", - "timelinestoryteller.com", - "timesmembership.com", "timesnownews.com", - "timestalks.com", - "timi1.me", - "timo0.com", "timsah.com", "timtales.com", "tinc-vpn.org", "tiney.com", "tineye.com", - "ting53.xyz", - "tinhduc.org", - "tinkerboxapp.com", - "tinkercad.com", - "tinkerentertainment.com", - "tinkerplay.net", + "tingtalk.me", "tintuc101.com", "tiny.cc", - "tiny4k.com", "tinychat.com", "tinypaste.com", "tinyurl.com", - "tiohentai.com", "tipas.net", "tipo.gov.tw", - "tipple.ac.uk", - "tire-cadcam.com", - "tiresplus.com", "tistory.com", - "titanfall.com", - "title.sh", - "titsandtugs.com", - "titsbox.com", - "titsintops.com", - "tittykings.com", - "tkb008.xyz", - "tkb2233.life", - "tkbqf2.life", "tkcs-collins.com", - "tktube.com", - "tl.ac.uk", "tl.gd", - "tla.ac.uk", - "tlc.ac.uk", - "tlcbexley.ac.uk", - "tlccollege.ac.uk", - "tlcmd.ac.uk", - "tlcmoodle.ac.uk", - "tltp.ac.uk", "tma.co.jp", "tmagazine.com", - "tmc.ac.uk", - "tmcs.ac.uk", - "tmdb.org", "tmdfish.com", - "tmei-taoyuan.com", "tmi.me", - "tmn.ac.uk", "tmpp.org", - "tmsnrt.rs", "tnaflix.com", - "tnatryouts.com", "tngrnow.com", "tngrnow.net", - "tnntoday.com", "tnp.org", - "tnt-ea.com", "to-porno.com", - "toget.com.tw", "togetter.com", "toh.info", - "tohoku.ac.jp", + "token.im", + "tokenlon.im", "tokyo-247.com", "tokyo-hot.com", "tokyo-porn-tube.com", - "tokyo-sports.co.jp", - "tokyo-tosho.net", "tokyocn.com", - "tokyomotion.com", - "tokyomotion.net", - "tokyonightstyle.com", - "tokyoporns.com", - "tokyotosho.info", - "tokyotosho.se", - "tomatespodres.com", - "tombola.ac.uk", "tomonews.net", - "tomsguide.com", - "tonec.com", + "tomp3.cc", "tongil.or.kr", - "tonicmovies.com", "tono-oka.jp", "tonyyan.net", "toodoc.com", - "toolforge.org", - "toolmaking-cadcam.com", - "toomadporn.pro", - "toon-3d.com", "toonel.net", - "toonsearch.net", - "toonsexblog.com", "top.tv", - "top100nl.net", - "top100sexgames.com", "top10vpn.com", "top81.ws", - "topadultgames.biz", - "topanime.biz", - "topartporn.com", - "topaz.ne.jp", - "topbabesblog.org", - "topbeatsbydrdreoutlet.com", - "topbeatsdealer.com", - "topbeatsforsale.com", "topbtc.com", - "topcartoonsites.com", - "topcelebnudes.com", - "topchats.com", - "topchineseporn.com", - "topcoder.com", - "topcuckolds.com", - "toperoticartsites.com", - "topescort.nl", - "topescortbabes.com", - "topexhib.net", - "topface.com", - "topfantasyart.com", - "topfreepornvideos.com", - "tophd.xxx", - "tophdsex.com", - "tophentai.biz", - "tophentaicomics.com", - "toplayerserver.com", - "topmanga.biz", "topnews.in", - "topnudemalecelebs.com", - "topobase.com", - "topporn.me", - "toppornguide.com", - "toppornoduro.com", "toppornsites.com", - "toppornsites.net", - "toprealvideos.com", - "topsexart.com", - "topsexhdvideos.com", - "topsexygames.com", "topshareware.com", "topsy.com", "toptip.ca", - "toptoonsites.com", - "topvids.net", - "topxxxpornvids.com", - "topyoungporn.com", + "toptoon.net", "tora.to", - "torcidadeouro.com", "torcn.com", "torguard.net", "torlock.com", - "toroporno.com", "torproject.org", "torrentgalaxy.to", "torrentkitty.tv", @@ -26484,299 +5808,61 @@ var rules = [ "torrentproject.se", "torrenty.org", "torrentz.eu", - "torrindex.net", "tortoisesvn.net", "torvpn.com", - "tospo-keiba.jp", - "totalmateria.com", "totalvpn.com", - "totoleak.com", - "totton.ac.uk", - "toucan-network.ac.uk", - "touchid.tv", - "touchid.wang", - "touchsmartpc.com", - "touchsmartpc.net", - "touchsmartpc.org", - "touhouwiki.net", - "tourporno.com", - "tousatu.fun", - "toutapp.com", + "tou.tv", "toutiaoabc.com", - "tower.ac.uk", - "towerauction.com", - "towerhamletscollege.ac.uk", - "towerhamletsllls.ac.uk", - "towerhamletslls.ac.uk", "towngain.com", - "townofsins.com", - "townsvillebulletin.com.au", - "toxin-up.sbs", - "toxinzoo.sbs", - "toy-cadcam.com", - "toycadcam.com", "toypark.in", "toythieves.com", "toytractorshow.com", "tparents.org", - "tpc.ac.uk", - "tpea.ac.uk", "tpi.org.tw", - "tpmde.ac.uk", - "tpornstars.com", - "tr.com", - "trac.ac.uk", "tracfone.com", - "tracingnetworks.ac.uk", - "tracking-location.com", - "tradevip1.com", "tradingview.com", - "traffcoll.ac.uk", "traffichaus.com", - "trafficmanager.net", - "trafford.ac.uk", - "traffordcollege.ac.uk", - "traindelayprediction.ac.uk", - "traintogainstoke.ac.uk", - "tranny.one", - "trannygem.com", - "trannytube.tv", - "trannyvideosxxx.com", - "trans.ac.uk", - "trans500.com", - "transangels.com", - "transarmuito.com", - "transcamslive.com", - "transcocon.ac.uk", - "transferwise.com", - "transforming-musicology.ac.uk", - "transformingmusicology.ac.uk", - "transit.ac.uk", - "transitwestyorkshire.ac.uk", - "translate-medtech.ac.uk", "translate.goog", - "translatetheweb.com", - "translatewiki.net", - "translatewiki.org", - "transnationalmodernlanguages.ac.uk", "transparency.org", - "transpharmtech-cdt.ac.uk", - "transpharmtech-dtc.ac.uk", - "transpornsites.com", - "travelcontroller.com", - "travelex.be", - "travelex.bh", - "travelex.ca", - "travelex.co.in", - "travelex.co.jp", - "travelex.co.nz", - "travelex.co.uk", - "travelex.com", - "travelex.com.au", - "travelex.com.hk", - "travelex.com.my", - "travelex.com.om", - "travelex.com.tr", - "travelex.de", - "travelex.fr", - "travelex.it", - "travelex.qa", - "travelexae.com", - "travelexch.com", - "travelexmoneycard.com", - "travelgirls.com", "travelinkcard.com", - "trc.ac.uk", "treemall.com.tw", - "trello.com", - "trellocdn.com", - "trendmicro.com", "trendsmap.com", - "trendyporn.com", - "tresham.ac.uk", - "trezor.io", - "tri-london.ac.uk", "trialofccp.org", - "triballo.net", - "tribler.org", "trickip.net", "trickip.org", - "tricky-topics-guide.ac.uk", - "trident.ac.uk", - "trikepatrol.com", - "trilt.ac.uk", "trimondi.de", - "trinity-bris.ac.uk", - "trinity-cm.ac.uk", - "trinitycollegebristol.ac.uk", - "trinitylaban.ac.uk", - "trinitysaintdavid.ac.uk", - "triokini.com", - "tristatebmw.com", - "trithucvn.net", - "trithucvn.org", - "trixhentai.com", - "trmini.com", - "trocoll.ac.uk", - "troisrivieresmini.com", "tron.network", "tronscan.org", - "tropictube.com", - "tropmed.ac.uk", "trouw.nl", - "trpger.us", - "trs.ac.uk", "trt.net.tr", "trtc.com.tw", - "trueamateurmodels.com", - "trueamateurs.com", - "trueanal.com", - "truebeachporn.com", - "truebim.com", "truebuddha-md.org", - "truedepth3d.com", - "truedwg.com", - "truefi.io", "trulyergonomic.com", - "trunest.com", - "truro-penwith.ac.uk", - "truro.ac.uk", - "trurocollege.ac.uk", - "truropenwith.ac.uk", - "trust-provider.com", - "trustcor.ca", - "trustcor.com", - "trustdoc.ch", - "trusted-dwg.com", - "trustedanalytics.com", - "trustedanalytics.net", - "trusteddwg.com", - "trustedpeach.com", - "trustisfps.com", - "trustsign.ch", - "trustwave.com", "truthontour.org", - "truthordarepics.com", "truthsocial.com", "truveo.com", - "truyen-hentai.com", - "truyen-hentai.fr", - "truyen-hentai.ru", - "truyen18.xyz", - "truyengihay.net", - "truyenhentai.xyz", - "truyenkk1.com", - "truyentranh86.com", - "truyenwk.com", - "tryalias.com", - "tryboobs.com", - "trycloudflare.com", - "trycuckold.com", - "trydesign.com", - "trydurex.net", - "trydurex.tv", - "tryengineering.org", - "tryfuckmenow.com", - "tryfunctions.com", "tryheart.jp", - "tryquinn.com", - "tryrating.com", - "tryst.link", - "ts.la", - "ts.net", "tsctv.net", - "tsd.ac.uk", - "tsdlondon.ac.uk", - "tse.ac.uk", - "tsec-biosys.ac.uk", "tsemtulku.com", - "tsescortsdirectory.com", - "tsi.ai", - "tsl.ac.uk", - "tsmodelstube.com", - "tspline.com", - "tsplines.com", "tsquare.tv", - "tsrc.ac.uk", - "tssp.best", - "tsthai.com", "tsu.org.tw", - "tsumino.com", "tsunagarumon.com", - "tsundora.com", - "tsyum.com", "tt1069.com", - "ttc.ac.uk", - "tte-lisa.ac.uk", - "tteshop.com", - "ttetraining.ac.uk", - "ttk.ru", - "ttlivecdn.com", - "ttrb.ac.uk", "tttan.com", "ttv.com.tw", "ttvnw.net", "ttwstatic.com", "tu8964.com", "tubaholic.com", - "tube-pornomovs.com", - "tube-sex-videos.com", - "tube.bz", "tube.com", - "tube18.sex", - "tube188.com", - "tube2011.com", - "tube2012.com", - "tube2017.com", - "tube4sex.com", - "tube4world.com", "tube8.com", - "tube8.fr", - "tube8zoo.com", "tube911.com", - "tubebdsm.com", - "tubecaptain.com", - "tubecop.com", "tubecup.com", - "tubedna.com", - "tubedupe.com", - "tubeenema.com", - "tubefuckme.net", - "tubegalore.com", "tubegals.com", - "tubegold.xxx", "tubeislam.com", - "tubelombia.net", - "tubemature.tv", - "tubemogul.com", - "tubemovies4k.com", - "tubeorigin.com", - "tubepatrol.org", "tubepornclassic.com", - "tubepornlist.com", - "tubepornstars.com", - "tubepornup.com", - "tubesafari.com", - "tubesex.me", - "tubeshemales.com", "tubestack.com", - "tubetop69.com", - "tubetria.mobi", - "tubetubetube.com", - "tubev.pro", - "tubev.sex", - "tubevintageporn.com", "tubewolf.com", - "tubexclips.com", - "tubinge.com", - "tubsexer.com", - "tubxporn.com", - "tubxporn.xxx", - "tuca.ac.uk", - "tuco.ac.uk", - "tudorpartbooks.ac.uk", - "tufos.com.br", - "tug.org", "tuibeitu.net", "tuidang.net", "tuidang.org", @@ -26784,11 +5870,9 @@ var rules = [ "tuitui.info", "tuitwit.com", "tukaani.org", - "tukif.com", "tumblr.com", "tumutanzi.com", "tumview.com", - "tuncommercialbank.com", "tunein.com", "tunnelbear.com", "tunnelblick.net", @@ -26807,66 +5891,36 @@ var rules = [ "tuo8.space", "turansam.org", "turbobit.net", - "turbogvideos.com", "turbohide.com", - "turborepo.org", "turbotwitter.com", - "turbulence.ac.uk", - "turing.ac.uk", - "turingsafehaven.ac.uk", - "turkeyblocks.org", "turkistantimes.com", "turntable.fm", - "tushy.com", "tushycash.com", - "tut.ac.jp", - "tuta.io", "tutanota.com", "tuvpn.com", "tuzaijidi.com", "tv.com", "tv.google", "tvants.com", - "tvappstore.net", "tvb.com", - "tvb.com.au", - "tvbanywhere.com", - "tvbanywhere.com.sg", - "tvbeventpower.com.hk", "tvboxnow.com", "tvbs.com.tw", - "tvbusa.com", - "tvbweekly.com", - "tvc.ac.uk", - "tver.co.jp", - "tver.jp", "tvider.com", - "tvmedia.net.au", "tvmost.com.hk", - "tvnaviweb.jp", - "tvof.ac.uk", "tvplayvideos.com", - "tvpromise.com", - "tvu.ac.uk", "tvunetworks.com", "tw-blog.com", "tw-npo.org", "tw01.org", - "tw985.com", "twaitter.com", "twapperkeeper.com", "twaud.io", "twavi.com", - "twavking.com", "twbbs.net.tw", "twbbs.org", "twbbs.tw", "twblogger.com", - "twca.com.tw", "twcomix.com", - "tweakadmin.com", - "tweakfilms.com", - "tweaksoftware.com", "tweepguide.com", "tweeplike.me", "tweepmag.com", @@ -26886,56 +5940,38 @@ var rules = [ "tweetymail.com", "tweez.net", "twelve.today", - "twenty65.ac.uk", "twerkingbutt.com", "twftp.org", "twgreatdaily.com", - "twgreatnews.com", - "twhentai.com", - "twi-videos.net", "twibase.com", "twibble.de", "twibbon.com", "twibs.com", "twicountry.org", "twicsy.com", - "twidouga.net", - "twidouga.tv", "twiends.com", "twifan.com", "twiffo.com", - "twifuli.com", "twiggit.org", "twilightsex.com", "twilio.com", "twilog.org", "twimbow.com", "twimg.com", - "twin-research.ac.uk", "twindexx.com", - "twinkboyfriends.tv", - "twinkspornos.com", - "twinkybf.com", - "twinprime.com", - "twinsuk.ac.uk", "twip.me", "twipple.jp", - "twirl.ac.uk", "twishort.com", "twistar.cc", - "twistedlinks.net", "twister.net.co", "twisterio.com", "twisternow.com", "twistory.net", - "twistys.com", "twit2d.com", "twitbrowser.net", "twitcause.com", "twitch.tv", "twitchcdn.net", - "twitchsvc.net", - "twitcomike.jp", "twitgether.com", "twitgoo.com", "twitiq.com", @@ -26946,21 +5982,15 @@ var rules = [ "twitpic.com", "twitstat.com", "twittbot.net", - "twitter.biz", "twitter.com", "twitter.jp", "twitter4j.org", - "twittercommunity.com", "twittercounter.com", "twitterfeed.com", - "twitterflightschool.com", "twittergadget.com", - "twitterinc.com", "twitterkr.com", "twittermail.com", - "twitteroauth.com", "twitterrific.com", - "twitterstat.us", "twittertim.es", "twitthat.com", "twitturk.com", @@ -26968,541 +5998,132 @@ var rules = [ "twitvid.com", "twitzap.com", "twiyia.com", - "twlegs.com", - "twline5.com", - "twnextdigital.com", + "twkan.com", "twnorth.org.tw", - "twoo.com", - "twporn.net", "twreporter.org", "twskype.com", "twstar.net", "twt.tl", "twtkr.com", - "twtrdns.net", "twtrland.com", "twttr.com", - "twttr.net", "twurl.nl", - "twvid.com", "twyac.org", - "tx.me", - "tx5254.com", - "txcloud.net", - "txdirectv.com", - "txqzz34r.com", - "txvia.com", - "txvlog.com", "txxx.com", - "txxx1.com", "tycool.com", - "tyler-brown.com", - "tyms2022.com", - "tyndall.ac.uk", - "tynecoast.ac.uk", - "tynecoll.ac.uk", - "tynemet.ac.uk", - "typeisbeautiful.com", - "typekit.com", "typekit.net", - "typenetwork.com", "typepad.com", - "typesquare.com", - "typography.com", + "typeset.io", "typora.io", - "tyre-cadcam.com", - "tyrecadcam.com", - "tytng189.com", - "tytporno.online", - "u-tokyo.ac.jp", - "u.nu", "u15.info", - "u3c3.com", - "u4heusergroup.ac.uk", - "u9a9.cc", - "u9a9.com", "u9un.com", - "ua92.ac.uk", - "uaa.com", - "uab.com.mm", - "uad.ac.uk", - "uag.ac.uk", - "ual.ac.uk", - "uall.ac.uk", - "uas.ac.uk", + "ua5v.com", "ub0.cc", - "ubdc.ac.uk", "ubddns.org", - "ubel-dtp.ac.uk", - "uber-assets.com", - "uber.com", - "ubereats.com", "uberproxy.net", - "ubi.com", - "ubisoft-orbit-savegames.s3.amazonaws.com", - "ubisoft-uplay-savegames.s3.amazonaws.com", - "ubisoft.com", - "ubisoftconnect.com", - "ubn.ac.uk", - "ubncloud.com", - "ubnw.net", - "ubuntu-touch.io", - "ubuntu.com", - "ubuntu.net", - "ubuntuforums.org", "uc-japan.org", - "uc-scarborough.ac.uk", - "uca.ac.uk", - "ucam.ac.uk", "ucam.org", "ucanews.com", - "ucas.ac.uk", - "ucas01.ac.uk", - "ucasgraduate.ac.uk", - "ucaspg.ac.uk", - "ucaspostgrad.ac.uk", - "ucaspostgraduate.ac.uk", - "ucat.ac.uk", - "ucav.ac.uk", - "ucb.ac.uk", - "ucc.ac.uk", "ucdc1998.org", - "uce.ac.uk", - "ucea.ac.uk", - "ucem.ac.uk", - "ucenmanchester.ac.uk", - "ucet.ac.uk", - "ucf.ac.uk", - "ucfb.ac.uk", - "ucg.ac.uk", "uchicago.edu", - "ucisa.ac.uk", - "ucl-status.ac.uk", - "ucl.ac.uk", - "ucla.edu", - "uclan.ac.uk", - "uclanresearch.ac.uk", - "ucleeds.ac.uk", - "uclglobal.ac.uk", - "ucmk.ac.uk", - "ucml.ac.uk", - "ucn.ac.uk", - "ucnl.ac.uk", - "uco.ac.uk", - "ucp.ac.uk", - "ucpmarjon.ac.uk", - "ucq.ac.uk", - "ucreaseheath.ac.uk", - "ucreative.ac.uk", - "ucs.ac.uk", - "ucsalf.ac.uk", - "ucsalford.ac.uk", - "ucsd.ac.uk", - "ucshrewsbury.ac.uk", - "ucsm.ac.uk", - "ucsp.ac.uk", - "ucss.ac.uk", - "ucw.ac.uk", - "ucwa.ac.uk", - "ucy.ac.uk", - "udacity.com", - "udel.ac.uk", - "udemy.com", - "udemycdn.com", "uderzo.it", - "udfs.com", "udn.com", "udn.com.tw", "udnbkk.com", "udndata.com", - "udnfunlife.com", - "udtrucksmeena.com", - "uea.ac.uk", - "ueberamazon.de", - "uec.ac.uk", - "uedu.ac.uk", - "uee.ac.uk", - "ueharlax.ac.uk", - "uel.ac.uk", - "uetcollege.ac.uk", - "ufe.cz", - "uflash.tv", - "ufm.ac.uk", "uforadio.com.tw", "ufreevpn.com", "ugo.com", - "uguisupapa.net", - "uhairy.com", "uhdwallpapers.org", - "uhi.ac.uk", - "uhicloud.ac.uk", - "uhmlg.ac.uk", - "uhovi.ac.uk", - "uhr.ac.uk", "uhrp.org", - "uhsl.ac.uk", - "uhub.com", - "ui.com", "uighur.nl", "uighurbiz.net", - "uiporn.com", - "uisp.com", - "ujapanesesex.com", - "ujizzcn.com", - "uk-cdi.ac.uk", - "uk-data-service.ac.uk", - "uk-exhibitionist.com", - "uk-imr.ac.uk", - "uk-india-energynetwork.ac.uk", "uk.to", - "ukadia.ac.uk", - "ukaea.ac.uk", - "ukaff.ac.uk", - "ukandeu.ac.uk", - "ukarc.ac.uk", - "ukbiobank.ac.uk", - "ukc.ac.uk", - "ukca.ac.uk", - "ukcasa.ac.uk", - "ukcat.ac.uk", - "ukcbc.ac.uk", - "ukccsrc.ac.uk", "ukcdp.co.uk", - "ukceh.ac.uk", - "ukcge.ac.uk", - "ukchinab4g.ac.uk", - "ukcle.ac.uk", - "ukclt.ac.uk", - "ukcmri.ac.uk", - "ukcp.ac.uk", - "ukcpmn.ac.uk", - "ukctas.ac.uk", - "ukda.ac.uk", - "ukdataservice.ac.uk", - "ukdementiaresearchinstitute.ac.uk", - "ukdri.ac.uk", - "ukds.ac.uk", - "ukerc.ac.uk", - "ukerna.ac.uk", - "ukesm.ac.uk", - "ukfast.ac.uk", - "ukgeos.ac.uk", - "ukgrad.ac.uk", - "ukhec.ac.uk", - "ukhls.ac.uk", - "ukimr.ac.uk", - "ukipad.com", - "ukirc.ac.uk", - "uklibrariesplus.ac.uk", "ukliferadio.co.uk", - "uklight.ac.uk", - "ukm.ac.uk", - "ukmed.ac.uk", - "ukmhd.ac.uk", - "ukmhr.ac.uk", - "ukmsn.ac.uk", - "ukndn.ac.uk", - "uknet.ac.uk", - "ukngi.ac.uk", - "uknibc.ac.uk", - "ukoln.ac.uk", - "ukorea.ac.uk", - "ukpass.ac.uk", - "ukpmc.ac.uk", - "ukpmcplus.ac.uk", - "ukpubmedcentral.ac.uk", - "ukqcd.ac.uk", - "ukresearchandinnovation.ac.uk", - "ukrheeo.ac.uk", - "ukri.ac.uk", - "ukro.ac.uk", - "ukrr.ac.uk", - "ukscl.ac.uk", - "ukserp.ac.uk", - "uksrn.ac.uk", - "ukssdc.ac.uk", - "ukt0.ac.uk", - "uktrc.ac.uk", "uku.im", - "ukupc.ac.uk", - "ukwhoswho.com", - "ukzikaresponse.ac.uk", - "ulcc.ac.uk", - "ulh.ac.uk", "ulifestyle.com.hk", "ulike.net", - "ull.ac.uk", - "ulol.com", "ulop.net", - "ulsop.ac.uk", - "ulst.ac.uk", - "ulster.ac.uk", - "ulth.ac.uk", - "ultimaforever.com", - "ultimaonline.com", - "ultradonkey.com", - "ultralab.ac.uk", + "ultrasurf.us", + "ultravpn.com", "ultravpn.fr", "ultraxs.com", - "umagazine.com.hk", - "umass.edu", - "umd.edu", - "umds.ac.uk", "umich.edu", - "umis.ac.uk", - "umist.ac.uk", - "ums.ac.uk", - "umslg.ac.uk", - "umtc.ac.uk", - "un.org", "unblock-us.com", "unblock.cn.com", "unblockdmm.com", "unblocker.yt", "unblocksit.es", - "unbrandedproducts.com", - "uncams.com", - "uncensoredhentai.xxx", - "uncensoredsexparties.com", "uncyclomedia.org", "uncyclopedia.hk", "uncyclopedia.tw", - "underhentai.net", - "underlords.com", - "underpinningexcellenceinhe.ac.uk", - "understanding-inequalities.ac.uk", - "understandingsociety.ac.uk", "underwoodammo.com", - "unfiltered.news", "unholyknight.com", - "uni-east.ac.uk", "uni.cc", - "unialliance.ac.uk", "unicode.org", - "unidesk.ac.uk", "unification.net", "unification.org.tw", - "unilang.ac.uk", - "uninhibitedcomix.com", - "union.ac.uk", "unirule.cloud", - "unis4ne.ac.uk", - "unisat.io", - "unistats.ac.uk", - "unisurreydirect.ac.uk", - "uniswales.ac.uk", - "uniswap.org", - "unitedcollegegroup.ac.uk", - "unitedcollegesgroup.ac.uk", "unitedsocialpress.com", - "unity.ac.uk", - "unity.cn", - "unity.com", - "unity3d.com", - "unitychina.cn", - "univault.ac.uk", - "universalorlando.com", - "universalpictures.com", - "universalpicturesinternational.com", - "universalstudioshollywood.com", - "universities-scotland.ac.uk", - "universitiesengland.ac.uk", - "universitiesfornottingham.ac.uk", - "universitieshr.ac.uk", - "universitiesinlondon.ac.uk", - "universitiesireland.ac.uk", - "universitiesnorthernireland.ac.uk", - "universitiesscotland.ac.uk", - "universitiesuk.ac.uk", - "universitieswales.ac.uk", - "universitiesweek.ac.uk", - "universitieswm.ac.uk", - "university-alliance.ac.uk", - "university-central-england.ac.uk", - "university-of-cambridge.ac.uk", - "universityacademy92.ac.uk", - "universitycampusscarborough.ac.uk", - "universitycentreharlow.ac.uk", - "universitycentrehastings.ac.uk", - "universitycentresouthend.ac.uk", - "universitycentrestratford.ac.uk", - "universitycentrethurrock.ac.uk", - "universitychairs.ac.uk", - "universitycollegefalmouth.ac.uk", - "universitycollegescarborough.ac.uk", - "universityenglish.ac.uk", - "universityofcambridge.ac.uk", - "universityofchichester.ac.uk", - "universityoflondon.ac.uk", - "universityofscarborough.ac.uk", - "universityofscarboroughcollege.ac.uk", - "universityofsuffolk.ac.uk", - "universityofwestlondon.ac.uk", - "universitypressscholarship.com", - "universityquarter-stoke.ac.uk", - "universitysquarestratford.ac.uk", "unix100.com", "unknownspace.org", - "unkoscene.com", - "unl.ac.uk", - "unlocklimitlesslearning.com", - "unlocktool.net", - "unn.ac.uk", + "unlock-music.dev", + "unmineable.com", "unodedos.com", - "unpkg.com", "unpo.org", - "unravel2.com", - "unraveltwo.com", - "unrealengine.com", - "unrealtournament.com", "unseen.is", "unstable.icu", - "unstyle.us", "untraceable.us", - "unusualporn.net", "unwire.hk", - "uo.com", "uocn.org", - "uod.ac.uk", - "uoherald.com", - "uol.ac.uk", - "uos.ac.uk", - "up01.cc", - "upa.ac.uk", - "updates.ac.uk", "updatestar.com", - "updatetube.com", - "upen.ac.uk", - "upenn.edu", - "upfrontcfd.com", - "upfrontfea.com", "upghsbc.com", "upholdjustice.org", - "upjav.cc", - "uplay-istrip.com", - "uplay.com", - "uplinq.com", "upload4u.info", "uploaded.net", "uploaded.to", "uploadstation.com", - "uplust.com", - "uplynk.com", "upmedia.mg", - "upmg.ac.uk", "upornia.com", - "uporno.xxx", "uproxy.org", "uptodown.com", "upwill.org", "ur7s.com", - "ura-akiba.jp", "uraban.me", - "urasma.com", - "urbanbigdatacentre.ac.uk", "urbandictionary.com", - "urbanfloodresilience.ac.uk", - "urbanflows.ac.uk", - "urbanlivinglab.ac.uk", - "urbanobservatory.ac.uk", "urbansurvival.com", "urchin.com", - "urduvoa.com", "url.com.tw", "urlborg.com", - "urlgalleries.net", "urlparser.com", - "urukawa.com", - "us-west-2.amazonaws.com", "us.to", - "usa-beatsbydreheadphonesonsale.net", - "usablepast.ac.uk", "usacn.com", - "usaco.org", "usaip.eu", - "usatoday.com", - "usatodaynetworkservice.com", "usc.edu", "uscardforum.com", + "uscg.mil", "uscnpm.org", - "use-of-mans.ac.uk", "usefreevpn.com", - "uselessjunk.com", "usembassy.gov", - "useplannr.com", - "userapi.com", - "usercontent.dev", - "userpxt.io", - "usertrust.com", + "usercontent.goog", "usfk.mil", - "ushare.ac.uk", - "ushaw.ac.uk", "usma.edu", "usmc.mil", "usocctn.com", - "uspcollege.ac.uk", "uspto.gov", - "usstratford.ac.uk", - "ust.ac.uk", - "ustc.ac.uk", "ustibetcommittee.org", "ustream.tv", "usunitednews.com", "usus.cc", - "usvimosquito.com", - "usvimosquitoproject.com", - "usw.ac.uk", - "utcreading.ac.uk", "utopianpal.com", "uu-gg.com", - "uug22.com", - "uug23.com", - "uug25.com", - "uug26.com", - "uug27.com", - "uuk.ac.uk", - "uuk28.com", + "uujiasu.com", "uukanshu.com", - "uun78.com", - "uun79.com", - "uun82.com", - "uun83.com", - "uun85.com", - "uun86.com", - "uun87.com", - "uun89.com", - "uun92.com", - "uun93.com", - "uun95.com", - "uun96.com", - "uun97.com", - "uun98.com", - "uun99.com", - "uup76.com", - "uusexdoll.com", - "uusextoy.com", - "uux68.com", - "uvac.ac.uk", - "uverse.com", + "uupool.cn", "uvwxyz.xyz", "uwants.com", "uwants.net", - "uwaterloo.ca", - "uwb-global.ac.uk", - "uwcatlantic.ac.uk", - "uwchgyfrifiaduracymru.ac.uk", - "uwe-bristol.ac.uk", - "uwe.ac.uk", - "uwern.ac.uk", - "uwic.ac.uk", - "uwinat.ac.uk", - "uwl.ac.uk", - "uwpcommunitytoolkit.com", - "uws.ac.uk", - "uwtsd.ac.uk", - "uwtsdlondon.ac.uk", - "uxbridge.ac.uk", - "uxbridgecollege.ac.uk", "uyghur-archive.com", "uyghur-j.org", "uyghur.co.uk", @@ -27519,889 +6140,108 @@ var rules = [ "uyghurtribunal.com", "uygur.org", "uymaarip.com", - "v-av.com", - "v-has.com", - "v-resort.ac.uk", - "v.gd", + "v2.help", "v2board.com", "v2ex.com", "v2fly.org", "v2mm.tech", - "v2ph.com", "v2ray.com", - "v2ray.cool", "v2raya.org", "v2raycn.com", "v2raytech.com", - "v7hds.com", - "v8.dev", - "v8project.org", - "vaccine.ac.uk", - "vads.ac.uk", - "vagabundasdoorkut.net", - "vagina.nl", - "vaginacontest.com", - "vaginal-ultrasound.com", - "vaginalultrasound.info", - "vaginapics.pro", - "vagrantcloud.com", - "vagrantup.com", "valeursactuelles.com", - "valoryirene.com", - "valuegb.com", - "valvesoftware.com", - "vam.ac.uk", - "vamsas.ac.uk", "van001.com", "van698.com", - "vancouverbmwretailers.ca", "vanemu.cn", "vanilla-jp.com", - "vanish.at", - "vanish.be", - "vanish.ch", - "vanish.cl", - "vanish.co.id", - "vanish.co.il", - "vanish.co.in", - "vanish.co.nz", - "vanish.co.uk", - "vanish.co.za", - "vanish.com.ar", - "vanish.com.br", - "vanish.com.co", - "vanish.com.hr", - "vanish.com.mx", - "vanish.com.my", - "vanish.com.pe", - "vanish.com.sg", - "vanish.com.tr", - "vanish.de", - "vanish.dk", - "vanish.es", - "vanish.fi", - "vanish.fr", - "vanish.hu", - "vanish.ie", - "vanish.it", - "vanish.nl", - "vanish.no", - "vanish.pl", - "vanish.pt", - "vanish.ro", - "vanish.ru", - "vanish.se", - "vanish.si", - "vanish.sk", - "vanisharabia.com", - "vanishbancaseulook.com.br", - "vanishcentroamerica.com", - "vanishinfo.cz", - "vanishstains.com", - "vanishstains.com.au", - "vanitaonline.com", - "vanitha.in", - "vanithaveedu.com", "vanpeople.com", "vansky.com", - "varndean.ac.uk", - "vast.ac.uk", - "vastenm.com", "vaticannews.va", "vatn.org", - "vaughan.ac.uk", - "vaultify.com", - "vaultify.info", - "vaultify.net", - "vaultproject.io", - "vbejeyv.shop", - "vcanedge.com", "vcf-online.org", "vcfbuilder.org", - "vcloudair.net", - "vcol.ac.uk", - "vcoll.ac.uk", - "vct.news", - "vday.io", - "vdoav.com", - "vecchiescopate.casa", - "vector.im", - "veet.at", - "veet.be", - "veet.ca", - "veet.ch", - "veet.cl", - "veet.co.id", - "veet.co.in", - "veet.co.kr", - "veet.co.nz", - "veet.co.uk", - "veet.co.za", - "veet.com", - "veet.com.ar", - "veet.com.au", - "veet.com.bd", - "veet.com.br", - "veet.com.co", - "veet.com.hk", - "veet.com.mx", - "veet.com.my", - "veet.com.ph", - "veet.com.pk", - "veet.com.sg", - "veet.com.tr", - "veet.de", - "veet.dk", - "veet.es", - "veet.fi", - "veet.fr", - "veet.hu", - "veet.jp", - "veet.nl", - "veet.no", - "veet.pt", - "veet.ro", - "veet.ru", - "veet.se", - "veet.tv", - "veet.us", - "veetarabia.com", - "veetbangladesh.com", - "veetcentroamerica.com", - "veetclub.it", "vegasred.com", - "velaserver.com", - "velastaging.com", - "velasync.com", - "velasystems.com", - "velatest.com", - "velkaepocha.cz", "velkaepocha.sk", - "velocloud.com", - "velostrata.com", "venbbs.com", "venchina.com", - "vendu.com", "venetianmacao.com", - "venezporn.com", - "venmo-touch.com", - "venmo.com", - "venmo.info", - "venmo.net", - "venmo.org", - "venmo.s3.amazonaws.com", "ventureswell.com", "veoh.com", - "veporn.com", - "vepornhd.club", - "veporno.net", - "vercel-dns.com", - "vercel-status.com", "vercel.app", - "vercel.blog", "vercel.com", - "vercel.events", - "vercel.live", - "vercel.pub", - "vercel.sh", - "vercel.store", - "vercomicsporno.xxx", - "verhentai.tv", - "verifid.ac.uk", - "verily.com", - "verilylifesciences.com", - "verilystudyhub.com", - "verilystudywatch.com", - "verilystudywatch.org", - "verisign.asia", - "verisign.biz", - "verisign.ch", - "verisign.co.in", - "verisign.co.uk", - "verisign.com", - "verisign.com.au", - "verisign.com.br", - "verisign.com.cn", - "verisign.com.es", - "verisign.com.hk", - "verisign.com.sg", - "verisign.com.tw", - "verisign.com.vn", - "verisign.de", - "verisign.dk", - "verisign.es", - "verisign.fr", - "verisign.hk", - "verisign.in", - "verisign.info", - "verisign.jobs", - "verisign.mobi", - "verisign.name", - "verisign.net", - "verisign.org", - "verisign.pro", - "verisign.se", - "verisign.sg", - "verisign.tw", - "verisign.us", - "verisign.vn", - "verisigninc.com", - "verizon.com", "verizon.net", - "verizonbusinessfios.com", - "verizondigitalmedia.com", - "verizonenterprise.com", - "verizonfios.com", - "verizonmedia.com", - "verizonwireless.com", "vermonttibet.org", - "verpeliculasporno.gratis", + "vern.cc", "versavpn.com", - "versign.net", - "versly.com", - "vervesex.com", "verybs.com", - "verygoodnike.com", - "veryladyboy.com", - "veryshortintroductions.com", - "vetgate.ac.uk", - "vetnetlln.ac.uk", - "vetschools.ac.uk", - "vetschoolscouncil.ac.uk", - "vetset2go.ac.uk", - "vetvaccnet.ac.uk", "vevo.com", - "vfabric.net", - "vfsco.at", - "vfsco.be", - "vfsco.bg", - "vfsco.ca", - "vfsco.ch", - "vfsco.cl", - "vfsco.co.uk", - "vfsco.co.za", - "vfsco.com", - "vfsco.com.au", - "vfsco.com.br", - "vfsco.com.tr", - "vfsco.cz", - "vfsco.de", - "vfsco.dk", - "vfsco.ee", - "vfsco.es", - "vfsco.fi", - "vfsco.fr", - "vfsco.hu", - "vfsco.ie", - "vfsco.in", - "vfsco.it", - "vfsco.jp", - "vfsco.kr", - "vfsco.lt", - "vfsco.lv", - "vfsco.mx", - "vfsco.nl", - "vfsco.no", - "vfsco.pe", - "vfsco.pl", - "vfsco.ro", - "vfsco.ru", - "vfsco.se", - "vfsco.sk", - "vfsco.us", - "vfsforgit.com", - "vfsforgit.org", + "vewas.net", "vft.com.tw", - "vgcareers.net", - "vge.ac.uk", - "vgg8.com", - "vgta.ac.uk", - "vhx.tv", - "vhxqa1.com", - "vhxqa2.com", - "vhxqa3.com", - "vhxqa4.com", - "vhxqa6.com", - "via0.com", - "viacbs.com", - "viacom.com", - "viacomcbs.com", - "viacomcbspressexpress.com", "viber.com", "vica.info", - "vicarious.ac.uk", "victimsofcommunism.org", - "victoriacountyhistory.ac.uk", "vid.me", "vidble.com", - "video-jav.net", - "video-one.com", - "video01.org", - "videoactive.ac.uk", "videobam.com", - "videobreakdown.com", - "videochampion.com", - "videodelivery.net", - "videodesexo.blog", "videodetective.com", - "videoindexer.ai", - "videojs.com", - "videolan.org", - "videoleak.me", - "videomarket.jp", "videomega.tv", "videomo.com", "videopediaworld.com", "videopress.com", - "videos4sale.com", - "videosamadoresreais.com", - "videosdemadurasx.com", - "videosdepornografia.blog.br", - "videosdesexo.br.com", - "videosdesexo.com.br", - "videosection.com", - "videoshorny.com", - "videoskaseros.com", - "videosmadeathome.com", - "videosporno.com.br", - "videosporno.life", - "videostravestis.xxx", - "videoxxxporn.biz", - "videozzz.com", "vidinfo.org", - "vidlearn.ac.uk", - "vidmpreview.com", - "vidown.com", - "vidspornoduro.com", - "viet.sex", - "viet69.dev", - "viet69.link", - "viet69.news", "vietdaikynguyen.com", - "viewerswives.net", - "viewgals.com", - "viewpointsfromfacebook.com", "vijayatemple.org", - "vikiporn.com", + "vilanet.me", "vilavpn.com", - "vilavpn.xyz", - "vilavpn1.xyz", - "vilavpn2.xyz", - "vilavpn3.xyz", - "vilavpn4.xyz", - "vilavpn5.xyz", - "vilavpn6.xyz", - "vilavpn7.xyz", - "vim.org", - "vimeo-staging.com", - "vimeo-staging2.com", "vimeo.com", - "vimeo.fr", - "vimeobusiness.com", "vimeocdn.com", - "vimeogoods.com", - "vimeoondemand.com", - "vimeostatus.com", "vimperator.org", "vincnd.com", "vine.co", "vinniev.com", - "vintage-erotica-forum.com", - "vintageamateurporn.com", - "vintagehomemadesex.com", - "vintagemedicalpictures.com", - "vintagexxxfilms.com", - "vip-beats.com", "vip-enterprise.com", - "vipbeatsbydre.com", - "vipergirls.to", - "vipheadphones.com", - "vipissy.com", - "vipmatureporn.com", - "vipoo.es", - "vipshoes2.com", - "vipstudiocali.com", - "viralcum.com", - "viralporn.com", "virginia.edu", - "virginpornlinks.com", - "viriondb.com", - "virsto.com", - "virsto.net", - "virtualbox.org", - "virtualcollege.ac.uk", - "virtualearth.net", - "virtualpartyworld.com", - "virtualporn.com", - "virtualrealgay.com", "virtualrealporn.com", - "virtualrealtrans.com", - "virtualtaboo.com", - "virtuata.com", - "virulogenome.ac.uk", - "visa-atm.com", - "visa-news.jp", - "visa.be", - "visa.ca", - "visa.cl", - "visa.co.ao", - "visa.co.cr", - "visa.co.id", - "visa.co.il", - "visa.co.in", - "visa.co.jp", - "visa.co.ke", - "visa.co.ni", - "visa.co.nz", - "visa.co.th", - "visa.co.uk", - "visa.co.ve", - "visa.co.za", - "visa.com", - "visa.com.ag", - "visa.com.ai", - "visa.com.ar", - "visa.com.au", - "visa.com.az", - "visa.com.bo", - "visa.com.br", - "visa.com.bs", - "visa.com.bz", - "visa.com.co", - "visa.com.cy", - "visa.com.dm", - "visa.com.do", - "visa.com.ec", - "visa.com.ge", - "visa.com.gt", - "visa.com.gy", - "visa.com.hk", - "visa.com.hn", - "visa.com.hr", - "visa.com.jm", - "visa.com.kh", - "visa.com.kz", - "visa.com.lc", - "visa.com.lk", - "visa.com.ms", - "visa.com.mx", - "visa.com.my", - "visa.com.ng", - "visa.com.pa", - "visa.com.pe", - "visa.com.ph", - "visa.com.pr", - "visa.com.py", - "visa.com.ru", - "visa.com.sg", - "visa.com.sv", - "visa.com.tr", - "visa.com.tt", - "visa.com.tw", - "visa.com.ua", - "visa.com.uy", - "visa.com.vc", - "visa.com.vi", - "visa.com.vn", - "visa.cz", - "visa.de", - "visa.dk", - "visa.es", - "visa.fi", - "visa.fr", - "visa.gd", - "visa.gp", - "visa.gr", - "visa.hk", - "visa.hu", - "visa.ie", - "visa.is", - "visa.ky", - "visa.lt", - "visa.lv", - "visa.mn", - "visa.mq", - "visa.nl", - "visa.no", - "visa.pl", - "visa.pt", - "visa.ro", - "visa.se", - "visa.sk", - "visa.so", - "visa.sx", - "visa.tc", - "visabank.org", - "visabg.com", - "visabusinessinsights.com", - "visacarddesignlab.com", - "visacards.com", - "visacheckout.net", - "visacheckout.org", - "visaconciergelac.com", - "visadigital.com", - "visadigitalconcierge.com", - "visadns.com", - "visadpsonline.us", - "visaeurope.at", - "visaeurope.ch", - "visaeurope.lu", - "visaeurope.si", - "visaeverywhereshop.com", - "visafintechfasttrack.com", - "visafulfillment.com", - "visagiftcard.us", - "visaglobalfinance.com", - "visaicsdirect.com", - "visainfinite.ca", - "visainfiniteluxuryhotels.ca", - "visaitalia.com", - "visakorea.com", - "visaluxuryhotelcollection.com", - "visaluxuryhotelcollection.com.br", - "visaluxuryhotelcollection.com.mx", - "visaluxuryhotels.com", - "visaluxuryhotels.com.ar", - "visamiddleeast.com", - "visanet.net", - "visapcsdirect.com", - "visaplus.com", - "visasavingsedge.ca", - "visasignature.co.kr", - "visasignaturehotels.com", - "visasoutheasteurope.com", - "visb.org", - "visceralgames.com", "visibletweets.com", - "visionnaires.ac.uk", "visiontimes.com", - "visiontimes.de", - "visiontimes.fr", - "visiontimes.it", - "visiontimes.net", - "visiontimesjp.com", - "visnet.ac.uk", - "vista.ac.uk", - "visual-arts.jp", - "visual-evidence.ac.uk", - "visualarts.gr.jp", - "visuallearninglab.ac.uk", - "visualrhetoric.ac.uk", - "visualstudio-staging.com", - "visualstudio.co", - "visualstudio.co.uk", "visualstudio.com", - "visualstudio.eu", - "visualstudio.net", - "vitae.ac.uk", - "vital.ac.uk", "vital247.org", - "vitukali.com", "viu.com", "viu.tv", "vivahentai4u.net", "vivaldi.com", "vivatube.com", - "vivaxnxx.com", "vivthomas.com", - "vixen.com", - "vixvids.to", - "viznet.ac.uk", "vizvaz.com", "vjav.com", "vjmedia.com.hk", - "vk-cdn.me", - "vk-cdn.net", - "vk-portal.net", - "vk.cc", - "vk.com", - "vk.design", - "vk.link", - "vk.me", - "vk.ru", - "vkcache.com", - "vkgo.app", - "vklive.app", - "vkmessenger.app", - "vkmessenger.com", - "vkontakte.ru", - "vkuseraudio.com", - "vkuserlive.net", - "vkuservideo.com", - "vkuservideo.net", - "vl4x.net", "vllcs.org", - "vmglobal.net", "vmixcore.com", - "vmmark.com", "vmpsoft.com", - "vmtestdrive.com", - "vmw.com", - "vmware-cloudmanagement.com", - "vmware-techcenter.com", - "vmware.com", - "vmware20mosaic.com", - "vmwareausnews.com", - "vmwarecertificationvideos.com", - "vmwarecloud.com", - "vmwaredemandcenter.com", - "vmwareemeablog.com", - "vmwaregrid.com", - "vmwarehorizon.com", - "vmwareidentity.com", - "vmwarelearning.com", - "vmwarelearningplatform.com", - "vmwarestuff.com", - "vmwareusergroupstore.com", - "vmwareviewpoint.com", - "vmwarevmc.com", - "vmwdemo.com", - "vmwgcomms.com", - "vmwhorizonair.com", - "vmwidm-ads.com", - "vmwidm.com", - "vmwlabconnect.com", - "vmwlearningplatform.com", - "vmworld.com", - "vmworld2010.com", - "vmworld2013.com", - "vmwsalesrewards.com", - "vmwservices.com", - "vmwxw.com", - "vnanchoi.ca", "vnet.link", - "vnware.net", - "voa.gov", "voa.mobi", - "voaafaanoromoo.com", - "voaafrique.com", - "voabambara.com", - "voabangla.com", "voacambodia.com", "voacantonese.com", "voachinese.com", "voachineseblog.com", - "voadeewanews.com", - "voadeewaradio.com", "voagd.com", - "voahausa.com", "voaindonesia.com", - "voakorea.com", - "voalingala.com", - "voandebele.com", "voanews.com", - "voanews.eu", - "voanoticias.com", - "voanouvel.com", - "voaportugues.com", - "voashona.com", - "voasomali.com", - "voaswahili.com", - "voathai.com", "voatibetan.com", "voatibetanenglish.com", - "voatiengviet.com", - "voatour.com", - "voazimbabwe.com", + "vocaroo.com", "vocativ.com", "vocn.tv", "vocus.cc", - "vod360.net", - "vodafone.co.uk", - "vodafone.com", - "vodafone.com.au", - "vodafone.com.tr", - "vodafone.de", - "vodafone.it", "voi.id", "voicettank.org", - "voila.ac.uk", - "vokevr.com", - "vol.moe", - "volstudy.ac.uk", - "volvo-truck.nl", - "volvo.ca", - "volvo.com", - "volvo.se", - "volvobrandshop.com", - "volvobuses.at", - "volvobuses.be", - "volvobuses.ca", - "volvobuses.ch", - "volvobuses.co", - "volvobuses.co.nz", - "volvobuses.co.uk", - "volvobuses.co.za", - "volvobuses.com", - "volvobuses.com.ar", - "volvobuses.com.au", - "volvobuses.com.br", - "volvobuses.com.kw", - "volvobuses.com.pt", - "volvobuses.com.tw", - "volvobuses.de", - "volvobuses.dk", - "volvobuses.es", - "volvobuses.fi", - "volvobuses.fr", - "volvobuses.hk", - "volvobuses.hu", - "volvobuses.in", - "volvobuses.it", - "volvobuses.jo", - "volvobuses.kr", - "volvobuses.ma", - "volvobuses.mx", - "volvobuses.my", - "volvobuses.no", - "volvobuses.om", - "volvobuses.ph", - "volvobuses.pk", - "volvobuses.pl", - "volvobuses.ru", - "volvobuses.se", - "volvobuses.sg", - "volvobuses.tn", - "volvobuses.us", - "volvoce.com", - "volvodefense.com", - "volvogroup.be", - "volvogroup.com", - "volvogroup.com.br", - "volvogroup.de", - "volvogroup.fr", - "volvogroup.jp", - "volvogroup.kr", - "volvogroup.mx", - "volvogroup.nl", - "volvogroup.pe", - "volvogroup.pl", - "volvogroup.ru", - "volvogroup.se", - "volvogrouptruckcenter.nl", - "volvomerchandise.com", - "volvopenta.com", - "volvopenta.com.br", - "volvopenta.de", - "volvopenta.es", - "volvopenta.fr", - "volvopenta.it", - "volvopenta.nl", - "volvopenta.se", - "volvopenta.us", - "volvosaatio.fi", - "volvospares.com", - "volvotruckcenter.be", - "volvotruckcenter.dk", - "volvotruckcenter.es", - "volvotruckcenter.fi", - "volvotruckcenter.it", - "volvotruckcenter.kr", - "volvotruckcenter.kz", - "volvotruckcenter.nl", - "volvotruckcenter.no", - "volvotruckcenter.se", - "volvotruckrental.be", - "volvotrucks.ae", - "volvotrucks.al", - "volvotrucks.am", - "volvotrucks.at", - "volvotrucks.az", - "volvotrucks.ba", - "volvotrucks.be", - "volvotrucks.bg", - "volvotrucks.by", - "volvotrucks.ch", - "volvotrucks.cl", - "volvotrucks.co.ao", - "volvotrucks.co.bw", - "volvotrucks.co.il", - "volvotrucks.co.mz", - "volvotrucks.co.na", - "volvotrucks.co.nz", - "volvotrucks.co.uk", - "volvotrucks.co.za", - "volvotrucks.co.zm", - "volvotrucks.co.zw", - "volvotrucks.com", - "volvotrucks.com.ar", - "volvotrucks.com.au", - "volvotrucks.com.bn", - "volvotrucks.com.br", - "volvotrucks.com.co", - "volvotrucks.com.kw", - "volvotrucks.com.pt", - "volvotrucks.com.tr", - "volvotrucks.com.tw", - "volvotrucks.com.ua", - "volvotrucks.cz", - "volvotrucks.de", - "volvotrucks.dk", - "volvotrucks.ee", - "volvotrucks.es", - "volvotrucks.fi", - "volvotrucks.fr", - "volvotrucks.ge", - "volvotrucks.gr", - "volvotrucks.hk", - "volvotrucks.hr", - "volvotrucks.hu", - "volvotrucks.id", - "volvotrucks.in", - "volvotrucks.it", - "volvotrucks.jp", - "volvotrucks.kg", - "volvotrucks.kr", - "volvotrucks.kz", - "volvotrucks.lt", - "volvotrucks.lv", - "volvotrucks.ma", - "volvotrucks.md", - "volvotrucks.mk", - "volvotrucks.mn", - "volvotrucks.my", - "volvotrucks.net", - "volvotrucks.nl", - "volvotrucks.no", - "volvotrucks.pe", - "volvotrucks.ph", - "volvotrucks.pk", - "volvotrucks.pl", - "volvotrucks.ps", - "volvotrucks.qa", - "volvotrucks.ro", - "volvotrucks.rs", - "volvotrucks.ru", - "volvotrucks.se", - "volvotrucks.sg", - "volvotrucks.si", - "volvotrucks.sk", - "volvotrucks.tm", - "volvotrucks.tn", - "volvotrucks.uy", - "vomitkings.com", - "vortexmachining.com", "vot.org", - "votolia.com", "vovo2000.com", - "vows.ac.uk", - "vox-cdn.com", "vox.com", - "voxcreative.com", "voxer.com", - "voxfieldguide.com", - "voxmedia.com", - "voxops.net", "voy.com", - "voyeureye.com", - "voyeurhit.com", - "voyeurhouse.com", - "voyeurmonkey.com", - "voyeurpapa.com", - "voyeurporntapes.com", - "voyeurstyle.com", - "voyeurweb.com", "vpn.ac", + "vpn.net", "vpn4all.com", "vpnaccount.org", "vpnaccounts.com", @@ -28428,6 +6268,7 @@ var rules = [ "vpnpick.com", "vpnpop.com", "vpnpronet.com", + "vpnproxymaster.com", "vpnreactor.com", "vpnreviewz.com", "vpnsecure.me", @@ -28441,312 +6282,101 @@ var rules = [ "vpnvip.com", "vpnworldwide.com", "vporn.com", - "vpornvideos.com", - "vpro.com", - "vpro.net", "vpser.net", - "vr.org", "vraiesagesse.net", - "vrbgay.com", - "vrcams.io", - "vred-essentials.com", - "vredessentials.com", - "vredprofessional.com", - "vrfun18.com", + "vrchat.com", "vrmtr.com", - "vrnastran.com", "vrporn.com", - "vrporncat.com", - "vrpornjack.com", - "vrpornmania.com", - "vrpornranked.com", - "vrsexgames.biz", "vrsmash.com", - "vrsumo.com", - "vrv.co", "vs.com", - "vsallin.net", - "vsassets.io", - "vscode-cdn.net", - "vscode-unpkg.net", - "vscode.dev", - "vsezoo.com", - "vsphere.com", - "vsphere.net", - "vssn.ac.uk", - "vtri.ac.uk", - "vts.ac.uk", - "vtsociety.org", - "vtstutorials.ac.uk", "vtunnel.com", - "vtvan.com", "vuku.cc", - "vulgarx.com", - "vultr.com", "vultryhw.com", - "vuvuzela.io", "vyprvpn.com", "vzw.com", - "w-mt.co", - "w.org", + "w-pool.com", "w.wiki", - "w0512.com", "w3.org", - "w3schools.com", - "w6un.com", - "wa.me", - "waa.tw", - "wac.ac.uk", - "wacc.ac.uk", - "waes.ac.uk", - "waf.ac.uk", "waffle1999.com", "wahas.com", "waigaobu.com", "waikeung.org", "wailaike.net", "wainao.me", - "waisongcha.com", "waiwaier.com", - "wakcoll.ac.uk", - "wakefield.ac.uk", - "wakwak.com", - "wal-mart.com", - "wal.co", - "walc.ac.uk", - "walcat.ac.uk", - "wales.ac.uk", - "wales1801-1919.ac.uk", - "walesdtc.ac.uk", - "walesdtp.ac.uk", - "walesglobalcampus.ac.uk", - "walesmep.ac.uk", - "walker-institute.ac.uk", - "walker.ac.uk", - "wallet.com", - "walletconnect.com", "wallhaven.cc", "wallmama.com", "wallornot.org", "wallpapercasa.com", "wallproxy.com", "wallsttv.com", - "walmart-content.com", - "walmart.com", - "walmart.pharmacy", - "walmartimages.com", - "walsall-coce.ac.uk", - "walsallcollege.ac.uk", "waltermartin.com", "waltermartin.org", - "waltham.ac.uk", - "walthamintcollege.ac.uk", "wan-press.org", - "wana-tv.sbs", - "wancctv.asia", - "wandan-dh.buzz", "wanderinghorse.net", - "wanduww.buzz", "wangafu.net", "wangjinbo.org", "wanglixiong.com", "wango.org", "wangruoshui.net", "wangruowang.org", - "wankgames.com", - "wankizer.com", - "wankoz.com", - "wankz.com", - "wankzvr.com", - "wanokokorosoh.com", "want-daily.com", - "want-media.com", - "want520.com", - "wantblogger.com", - "wantmywife.com", "wanz-factory.com", "wapedia.mobi", - "waplog.com", - "wapm.io", - "waranlov.com", - "warddogs.com", "warehouse333.com", - "wariolandshakeit.com", - "wariowarediy.com", - "warkscol.ac.uk", - "warnermediacdn.com", - "warp.plus", - "warr.ac.uk", - "warrington.ac.uk", "warroom.org", - "warwick.ac.uk", - "warwickequine.ac.uk", - "warwickhri.ac.uk", - "warwickshire.ac.uk", - "wasdj.com", "waselpro.com", - "washa.tv", "washeng.net", - "washingtondcbmw.com", "washingtonpost.com", - "waskucity.com", - "wasmer.io", - "watch-ebay.org", - "watch-my-gf.com", - "watch-porn.net", "watch8x.com", - "watchanimeattheoffice.com", - "watchdisneyfe.com", - "watchersweb.com", - "watchespn.com", - "watchindianporn.net", "watchinese.com", - "watchjavonline.com", - "watchmyexgf.net", - "watchmygf.me", "watchmygf.net", - "watchmygf.to", - "watchmygirlfriend.tv", "watchout.tw", - "watchteencam.com", - "water-and-power.com", - "waterdamagesandiego.org", - "waterfox.net", - "watersex.com", - "waterwisercdt.ac.uk", "wattpad.com", "wav.tv", - "waveomoney.com.mm", "waveprotocol.org", - "waverleyabbeycollege.ac.uk", + "waybig.com", "waymo.com", - "waze.com", - "wballiance.com", - "wbd.ms", - "wbdnbo.net", - "wbrks.com", - "wbs.ac.uk", - "wbvm4s.com", - "wcc.ac.uk", - "wccsj.ac.uk", - "wcg.ac.uk", - "wcmd.ac.uk", - "wcoh.ac.uk", - "wcs.ac.uk", - "wct.ac.uk", "wd.bible", - "wd.com", "wda.gov.tw", - "wdc.com", - "wddcp.ac.uk", "wdf5.com", - "wdfiles.com", - "wea.ac.uk", - "weald.ac.uk", "wealth.com.tw", - "weareebay.com", "wearehairy.com", "wearn.com", - "wearside.ac.uk", "weather.com.hk", - "weav.xyz", - "web-instagram.net", - "web.app", "web.dev", "web2project.net", - "webappfieldguide.com", "webbang.net", - "webcam-teen.net", - "webcamgirls.chat", - "webcamjackers.com", - "webcammedellin.co", - "webcams.tv", - "webcamtubexxx.com", "webevader.org", - "webex.ca", - "webex.co.in", - "webex.co.it", - "webex.co.jp", - "webex.co.kr", - "webex.co.nz", - "webex.co.uk", - "webex.com", - "webex.com.au", - "webex.com.br", - "webex.com.hk", - "webex.com.mx", - "webex.de", - "webex.es", - "webex.fr", - "webflow.com", "webfreer.com", - "webgata.net", - "webgirlsonline.net", - "webhosting.com", "webjb.org", - "webkit.org", - "webkitgtk.org", "weblagu.com", - "webmoneyinfo.com", "webmproject.org", - "webnovel.com", - "webobjects.co.uk", - "webobjects.com", - "webobjects.de", - "webobjects.eu", - "webobjects.net", - "webofknowledge.com", - "webofscience.com", - "webpa.ac.uk", "webpack.de", "webpkgcache.com", - "webra.ru", "webrtc.org", "webrush.net", "webs-tv.net", + "website.new", "websitepulse.com", "websnapr.com", - "webster.ac.uk", - "webtoons.com", - "webtoonscorp.com", - "webtype.com", "webwarper.net", "webworkerdaily.com", "wechatlawsuit.com", "weebly.com", - "weekly-economist.com", - "weeklytimesnow.com.au", "weekmag.info", "wefightcensorship.org", "wefong.com", "weiboleak.com", "weihuo.org", "weijingsheng.org", - "weimi180.com", "weiming.info", - "weinvoiceit.com", "weiquanwang.org", "weisuo.ws", "weitt.us", - "weiyuksj.com", - "weknowporn.com", - "welbeck.ac.uk", - "welcometobestbuy.ca", - "welcomix.com", - "welfareconditionality.ac.uk", - "well.ac.uk", - "wellbeing.ac.uk", - "wellcome.ac.uk", - "wellfuckedwife.com", - "wellmaturetube.com", "welovecock.com", - "welsh-dictionary.ac.uk", - "welshmediumhe.ac.uk", - "welshsaints.ac.uk", "welt.de", - "weltweitwachsen.de", "wemigrate.org", - "wen21.xyz", "wengewang.com", "wengewang.org", "wenhui.ch", @@ -28754,188 +6384,44 @@ var rules = [ "wenxuecity.com", "wenyunchao.com", "wenzhao.ca", - "wern.ac.uk", - "wesc.ac.uk", - "wescfoundation.ac.uk", - "wess.ac.uk", - "wessex.ac.uk", - "wessexsfc.ac.uk", - "west-cheshire.ac.uk", - "west-lothian.ac.uk", - "west-thames.ac.uk", "westca.com", - "westchem.ac.uk", - "westcollegescotland.ac.uk", - "westcumbcoll.ac.uk", - "westdean.ac.uk", - "westengland.ac.uk", - "westerndigital.com", "westernshugdensociety.org", "westernwolves.com", - "westherts.ac.uk", - "westhill.ac.uk", - "westkent.ac.uk", - "westkentandashford.ac.uk", - "westking.ac.uk", "westkit.net", - "westlancs.ac.uk", - "westlaw.com", - "westlondon.ac.uk", - "westlondoncollege.ac.uk", - "westlondoniot.ac.uk", - "westlondonuniversity.ac.uk", - "westminster-cfe.ac.uk", - "westminster.ac.uk", - "westminsterutc.ac.uk", - "westnotts.ac.uk", - "westofscotland.ac.uk", - "weston.ac.uk", - "westonstudents.ac.uk", "westpoint.edu", - "westsuffolk.ac.uk", - "westsuffolkcollege.ac.uk", - "westyorkshirecolleges.ac.uk", - "wet-ass-pussy.com", - "wetandpuffy.com", - "wetchicks.org", - "wetnhorny.com", "wetplace.com", "wetpussygames.com", - "wetsextube.com", - "weverse.io", "wexiaobo.org", - "weymouth.ac.uk", - "weymouthcollege.ac.uk", "wezhiyong.org", "wezone.net", - "wfdc.ac.uk", - "wfm.com", "wforum.com", - "wgu.ac.uk", "wha.la", - "whasil.xyz", - "what-fan.net", "whatblocked.com", - "whatboyswant.com", "whatbrowser.org", - "whatisairwatch.com", - "whatisworkspaceone.com", "whats.new", - "whatsapp-plus.info", - "whatsapp-plus.me", - "whatsapp-plus.net", - "whatsapp.cc", "whatsapp.com", - "whatsapp.info", "whatsapp.net", - "whatsapp.org", - "whatsapp.tv", - "whatsappbrand.com", - "whatscotlandthinks.ac.uk", "whatsonweibo.com", - "whatthefox.com", - "whatworksscotland.ac.uk", - "whcgroup.ac.uk", "wheatseeds.org", - "wheb.ac.uk", "wheelockslatin.com", - "wheelpop.com", - "wheelworks.net", - "whelf.ac.uk", - "whengirlsplay.com", - "whentai.com", - "whereilive.com.au", - "whereiskpkuang.com", "whereiswerner.com", "wheretowatch.com", - "wherl.ac.uk", "whichav.com", "whichav.video", - "whimn.com.au", "whippedass.com", - "whisolutions.com", "whispersystems.org", - "whitegates-feu.ac.uk", - "whiterose-mechanisticbiology-dtp.ac.uk", - "whiterose-social-science-doctoral-training-centre.ac.uk", - "whiterose.ac.uk", - "whitexxxtube.com", - "who.int", "who.is", "whodns.xyz", "whoer.net", - "wholecitiesfoundation.org", - "wholefoods.com", - "wholefoodsmarket.co.uk", - "wholefoodsmarket.com", - "wholekidsfoundation.org", - "wholeplanetfoundation.org", - "wholesale-exporter1.com", - "wholesalediscountpurses.com", - "wholesalefine.com", - "wholesaleonlinemart.com", - "wholesem.ac.uk", - "wholevideos.com", - "whonix.org", - "whoreasianporn.com", - "whoreshub.com", - "whoreslag.com", - "whoreteensex.com", - "whorevintagesex.com", - "whosthehost.com", "whotalking.com", - "whvuxtub.com", - "whychoosehorizon.com", - "whychooseview.com", - "whychoosevmwareeuc.com", - "whyfacebook.com", - "whyiwantciscotelepresence.com", "whylover.com", - "whynotbi.com", - "whystudyamerica.ac.uk", - "whystudyeconomics.ac.uk", - "whystudyenglish.ac.uk", - "whystudylanguages.ac.uk", - "whystudymaterials.ac.uk", "whyx.org", - "wias.ac.uk", - "wicn.ac.uk", "widevine.com", - "widnesandruncornsixthformcollege.ac.uk", - "widnesruncorn.ac.uk", - "widnessixthformcollege.ac.uk", - "wife-home-videos.com", - "wifehomeporn.com", - "wifeinlove.com", - "wifeinterracialfuck.com", - "wifeloversporn.com", - "wifemovies.net", - "wifesexorgy.com", - "wifesharingpics.com", - "wifevideos.net", - "wifewantstoplay.com", - "wifi-mx.com", - "wifiman.com", - "wigan-leigh.ac.uk", - "wigs.ac.uk", - "wigstoncollege.ac.uk", - "wii-u.com", - "wiifit.com", - "wiifitu.com", - "wiipartyu.com", - "wiisports.com", - "wiisportsresort.com", - "wiiugamepad.com", - "wiivc.net", "wikaba.com", - "wikawika.xyz", "wikia.com", "wikia.org", "wikibooks.org", "wikidata.org", - "wikidot.com", - "wikifeet.com", - "wikihow.com", "wikileaks-forum.com", "wikileaks.ch", "wikileaks.com", @@ -28947,291 +6433,88 @@ var rules = [ "wikilivres.info", "wikimapia.org", "wikimedia.org", - "wikimediacloud.org", - "wikimediafoundation.org", "wikinews.org", "wikipedia-on-ipfs.org", "wikipedia.org", - "wikiporn.tv", "wikiquote.org", - "wikisexguide.com", "wikisource.org", - "wikiunblocked.org", "wikiversity.org", "wikivoyage.org", "wikiwand.com", - "wikiwiki.jp", "wiktionary.org", - "wilberforce.ac.uk", "wildammo.com", - "wildcamporn.com", - "wildfanny.com", - "wildfreevideos.com", - "wildxxxhardcore.com", - "wiley.com", "williamhill.com", "willw.net", - "willyporn.com", - "wiltscoll.ac.uk", - "wiltshire.ac.uk", - "wiltshirecollege.ac.uk", - "wimbledon-school.ac.uk", - "wimbledon.ac.uk", - "wimcs.ac.uk", - "wimpmusic.com", - "winchester.ac.uk", - "wincoll.ac.uk", - "windows-int.net", - "windows.com", - "windows.net", - "windows.nl", - "windows8.hk", - "windowsazure.com", - "windowscommunity.net", - "windowsmarketplace.com", - "windowsphone-int.com", - "windowsphone.com", + "wilsoncenter.org", "windowsphoneme.com", - "windowssearch.com", - "windowsuem.com", - "windowsupdate.com", "windscribe.com", - "windsor-forest.ac.uk", "windy.com", "wingamestore.com", "wingy.site", - "winhec.com", - "winhec.net", - "winncop.ac.uk", "winning11.com", - "winningstudents-scotland.ac.uk", - "winstanley.ac.uk", - "wintermute.com", - "winticket.jp", - "winudf.com", "winwhispers.info", "wionews.com", - "wipower.com", "wire.com", - "wired.com", "wiredbytes.com", "wiredpen.com", "wireguard.com", - "wireless.radio", - "wirelessgroup.co.uk", - "wirelessreach.com", - "wiremoneytoirelandwithxoomeasierandcheaper.com", - "wireshark.org", - "wirralmet.ac.uk", "wisdompubs.org", - "wise-research.com", - "wise.com", - "wisecoin.com", - "wiseid.com", - "wisekey.com", - "wisekey.com.hk", - "wiserd.ac.uk", "wisevid.com", - "wish.com", "wistia.com", - "wistia.net", - "witcmi.ac.uk", "withgoogle.com", "withyoutube.com", "witnessleeteaching.com", "witopia.net", - "wittgen-cam.ac.uk", - "wivc.ac.uk", - "wix-code.com", - "wix.com", - "wixanswers.com", - "wixapps.net", - "wixipedia.net", - "wixmp.com", "wixsite.com", - "wixstatic.com", - "wiz-s.jp", "wizcrafts.net", "wjbk.org", - "wjcodes.com", - "wjny-one.sbs", - "wkac.ac.uk", - "wkap.nl", - "wkc.ac.uk", - "wkcic.ac.uk", - "wlc.ac.uk", - "wlcbms.ac.uk", - "wlcbs.ac.uk", - "wlpms.ac.uk", - "wlu.ac.uk", - "wlv.ac.uk", - "wm-air.ac.uk", - "wm18s.buzz", - "wma.ac.uk", - "wmc.ac.uk", - "wmcc.ac.uk", - "wmcloud.org", - "wmcollege.ac.uk", - "wmcu.ac.uk", "wmflabs.org", "wmfusercontent.org", - "wmhea.ac.uk", - "wmin.ac.uk", - "wmsf.ac.uk", - "wmt.co", - "wmucs.ac.uk", "wn.com", "wnacg.com", - "wnacg.link", "wnacg.org", - "wnc.ac.uk", - "wnoaissulli1.com", - "wnsc.ac.uk", "wo.tc", - "wocns.ac.uk", "woeser.com", - "wofl.tv", - "woflthenewsstation.com", - "wogx.com", "wokar.org", - "woking.ac.uk", - "wolcol.ac.uk", - "wolfatbestbuy.com", - "wolfatbestbuy.net", "wolfax.com", - "wolfsex-me.sbs", - "wolseymanuscripts.ac.uk", - "wolterskluwer.com", - "wolvcoll.ac.uk", - "wolverhampton.ac.uk", - "wolverhamptonline.ac.uk", "wombo.ai", - "womensnikeshox.com", - "womenwill.com", - "womenwill.com.br", - "womenwill.id", - "womenwill.in", - "womenwill.mx", - "won.ac.uk", - "wonporn.com", - "wonporn.net", - "woodhouse.ac.uk", - "woodmancastingx.com", - "woolite.ca", - "woolite.com", - "woolite.pl", - "woolite.us", - "woolitecarpet.com", "woolyss.com", "woopie.jp", "woopie.tv", - "worc.ac.uk", - "worcester.ac.uk", "wordpress.com", - "wordpress.org", - "wordpress.tv", - "workandhome.ac.uk", + "work2icu.org", "workatruna.com", "workerdemo.org.hk", "workerempowerment.org", "workers.dev", "workersthebig.net", "workflow.is", - "workingclasswriting.ac.uk", - "workingtogethernorthwest.ac.uk", - "workplace.com", - "workplacementscotland.ac.uk", - "workplaceusecases.com", - "worksmobile.com", - "workspaceair.com", - "workspaceone.com", - "workstations.tv", - "world3d.biz", - "worldbank.org", "worldcat.org", - "worldcoinpay.com", - "worldcurrencycard.co.za", - "worldemojiawards.com", - "worldemojiday.com", - "worldescortindex.com", - "worldflipper.jp", - "worldhack.com", "worldjournal.com", - "worldofslaves.io", - "worldofwarcraft.com", "worldpopulationreview.com", - "worldpornvideos.com", - "worldscientific.com", - "worldsecureemail.com", - "worldsecuresystems.com", - "worldsex.com", - "worldsfastestgamer.net", "worldvpn.net", - "wortech.ac.uk", - "worthing.ac.uk", - "wovs.tk", "wow-life.net", "wow.com", "wowgirls.com", "wowhead.com", - "wowindianporn.com", "wowlegacy.ml", "wowporn.com", - "wowpornlist.xyz", "wowrk.com", - "wowstars.com", - "wowyoungporn.com", "woxinghuiguo.com", "woyaolian.org", "wozy.in", - "wp-themes.com", "wp.com", - "wpewebkit.org", "wpoforum.com", - "wpvip.com", - "wqe.ac.uk", - "wqeic.ac.uk", "wqyd.org", - "wrapp.ac.uk", "wrchina.org", - "wrdtc.ac.uk", - "wrdtp.ac.uk", - "wrekincollege.ac.uk", - "wren.ac.uk", - "wrenchead.com", "wretch.cc", - "wrexham.ac.uk", - "wripa.ac.uk", - "writenow.ac.uk", "writesonic.com", - "writing-pad.ac.uk", - "writtle.ac.uk", - "writtlecollege.ac.uk", - "writtleuniversitycollege.ac.uk", - "wrocah.ac.uk", - "wroxton-college.ac.uk", - "wrssdtp.ac.uk", - "wsc.ac.uk", - "wscinternational.ac.uk", - "wsfc.ac.uk", "wsimg.com", "wsj.com", - "wsj.jobs", "wsj.net", - "wsjbarrons.com", "wsjhk.com", - "wsjmediakit.com", - "wsjplus.com", - "wsjshop.com", - "wsjwine.com", - "wspcr.ac.uk", "wtbn.org", - "wtc.ac.uk", "wtfpeople.com", - "wto.org", - "wton-acl.ac.uk", - "wton-adulteducation.ac.uk", - "wttw.ac.uk", "wuerkaixi.com", "wufafangwen.com", "wufi.org.tw", @@ -29239,224 +6522,59 @@ var rules = [ "wujie.net", "wujieliulan.com", "wukangrui.net", - "wulfrun.ac.uk", - "wun.ac.uk", - "wunvb.com", - "wuso.me", + "wunderground.com", "wuw.red", - "wuxiapple.com", "wuyanblog.com", - "wuyefuli.org", - "wvlln.ac.uk", - "wvm0agb4.me", - "wvn.ac.uk", - "wvr.ac.uk", - "ww9094.com", - "wwapple.net", "wwe.com", - "wwe9.com", "wwitv.com", - "wwmpcrn.ac.uk", - "wwtbam.com", - "www-bestbuystores.com", - "www-facebook.com", - "www-paypal.info", - "www-paypal.us", - "www-sms-apple.com", - "www.sb", "www1.biz", - "www8-hp.com", - "wwwapple.com", - "wwwapple.net", - "wwwapplemusic.com", - "wwwdecide.com", - "wwwebay.com", - "wwwebay.net", - "wwwfacebok.com", - "wwwfacebook.com", "wwwhost.biz", - "wwwhuluplus.com", - "wwwicloud.com", - "wwwinstagram.com", - "wwwipodlounge.com", - "wwwitunes.com", - "wwwlapple.com", - "wwwmacbookair.com", - "wwwmfacebook.com", - "wwwpaypass.com", - "wwwpornhub.pro", - "wwwwebay.com", - "wwwxoom.com", - "wxoyt.com", - "wyams.ac.uk", - "wyke.ac.uk", - "wylln.ac.uk", - "wynd.network", - "wyndlabs.ai", - "wyqqdz.com", - "wzlthw.com", - "wzmyg.com", - "wztv8.com", "wzyboy.im", - "wzzyw.buzz", "x-art.com", - "x-artvideo.net", "x-berry.com", - "x-caprice.com", - "x-fetish.org", "x-wall.org", "x.ai", "x.co", "x.com", "x.company", - "x.org", - "x.team", - "x0rd38.xyz", - "x1337x.eu", - "x1337x.se", - "x1337x.ws", - "x18r.co", - "x18r.com", "x1949x.com", "x24hr.com", "x365x.com", "x3guide.com", - "x3vid.com", - "x6av.com", - "x99av.com", - "xamarin.com", - "xandr.com", + "xaislam.com", "xanga.com", - "xanimeporn.com", - "xanimeporn.tv", - "xapplist.com", - "xattractive.com", - "xaverian.ac.uk", - "xavs.ac.uk", - "xaxy.xyz", - "xb18.me", "xbabe.com", - "xbabe.mobi", - "xbanny.com", - "xbase.ac.uk", - "xbeegtube.com", - "xbhuijiab.info", - "xbnat.com", "xbookcn.com", - "xbookcn.net", - "xbooks.work", - "xbooru.com", - "xbox.co", - "xbox.com", - "xbox.eu", - "xbox.org", - "xbox360.co", - "xbox360.com", - "xbox360.eu", - "xbox360.org", - "xboxab.com", - "xboxgamepass.com", - "xboxgamestudios.com", - "xboxlive.com", - "xboxone.co", - "xboxone.com", - "xboxone.eu", - "xboxplayanywhere.com", - "xboxservices.com", - "xboxstudios.com", - "xboyvids.com", - "xbrasilporno.com", "xbtce.com", - "xbx.lv", - "xcafe.com", "xcafe.in", - "xcams.com", - "xcg123.com", "xchina.co", - "xchina.fun", "xcity.jp", "xcritic.com", - "xcum.com", - "xda-cdn.com", - "xda-developers.com", - "xdaddy.in", - "xdaforums.com", - "xdh999.one", - "xdir.vip", - "xdporner.com", - "xdsummit.com", - "xdty.org", - "xecce.com", - "xemales.com", - "xenoblade.com", - "xeon.com", "xerotica.com", - "xfantazy.com", - "xfemaledom.com", "xfiles.to", "xfinity.com", - "xfockers.com", - "xfreehd.com", - "xfuckonline.com", - "xgames.zone", - "xgaytube.com", - "xgaytube.tv", - "xgirls.webcam", + "xfxssr.me", "xgmyd.com", - "xgroovy.com", - "xgsp.tv", - "xgtd3.com", - "xgtdr.buzz", - "xh-porn.com", - "xh.video", "xhamster.com", - "xhamster.desi", - "xhamster.xxx", - "xhamster18.com", - "xhamster18.desi", - "xhamster2.com", - "xhamsterlive.com", "xhcdn.com", - "xhot.pro", - "xhub.tv", "xianba.net", "xianchawang.net", - "xiangrikui-app.com", - "xianir.xyz", "xianjian.tw", "xianqiao.net", "xiaobaiwu.com", "xiaochuncnjp.com", "xiaod.in", - "xiaofu.me", - "xiaogirls.com", "xiaohexie.com", "xiaolan.me", "xiaoma.org", "xiaomi.eu", - "xiaoou.io", - "xiaoou.tv", - "xiaoshuobb.life", - "xiaoyaoge.xyz", "xiaxiaoqiang.net", - "xie56.xyz", "xiezhua.com", "xihua.es", - "xii.jp", - "xin21.xyz", - "xinaia-av.buzz", "xinbao.de", - "xindelu.com", - "xinfhw.com", "xing.com", - "xing66.life", - "xing840.info", - "xinggan77.vip", - "xingrz.me", "xinhuanet.org", "xinjiangpolicefiles.org", - "xinlan995.xyz", - "xinmeitulu.com", "xinmiao.com.hk", "xinsheng.net", "xinshijue.com", @@ -29465,961 +6583,149 @@ var rules = [ "xiuren.org", "xixicui.icu", "xizang-zhiye.org", - "xjavporn.com", "xjp.cc", "xjtravelguide.com", - "xkeezmovies.com", "xkiwi.tk", - "xknoop.com", - "xkontakt18.com", - "xkorean.cam", - "xl-gaytube.com", - "xlecx.org", "xlfmtalk.com", "xlfmwz.info", - "xlgirls.com", - "xlinkz.to", - "xlovecam.com", - "xlstudio.com", - "xlydh.cc", "xm.com", - "xmalay.com", - "xmas.ac.uk", - "xmat.ac.uk", - "xmature.su", - "xmav99.com", - "xmbsyj.top", - "xmforever.rest", - "xmissy.nl", "xml-training-guide.com", - "xmm.ac.uk", "xmonk.net", "xmovies.com", - "xmoviesforyou.com", - "xmulib.org", - "xn--096-4g6em5t.com", - "xn--201-4g6em5t.com", - "xn--202-4g6em5t.com", - "xn--203-4g6em5t.com", - "xn--204-4g6em5t.com", - "xn--205-4g6em5t.com", - "xn--2vxsp6vi4j.com", - "xn--3et96bj49ahpq.com", + "xn--11xs86f.icu", "xn--4gq171p.com", - "xn--4vq475g.com", - "xn--4vq477m.com", - "xn--6eup7j.com", - "xn--6eup7j.net", - "xn--74q434dwff.com", - "xn--74q434dwff.net", - "xn--7hv594h.com", - "xn--8uq428d76d.tokyo", "xn--90wwvt03e.com", - "xn--9kr7l.com", "xn--9pr62r24a.com", - "xn--9trs65b.com", - "xn--av-o44ep1d.com", - "xn--cck4d8b3009a.com", - "xn--colegsirgr-c5a.ac.uk", "xn--czq75pvv1aj5c.org", - "xn--d4ty0ojsqzfd.com", - "xn--flw351e.com", - "xn--ggle-55da.com", - "xn--gmq348bujlxrb.com", - "xn--gmq92kd2rm1kx34a.com", - "xn--gogl-0nd52e.com", - "xn--gogl-1nd42e.com", - "xn--gtvz22d.wang", - "xn--hb4aw0g.com", - "xn--hckl3e1e8a8ajin0czf.net", - "xn--hhr917d3fecva.xyz", "xn--i2ru8q2qg.com", - "xn--mts47c3w9b1qr.net", - "xn--mtswd61ejxq.com", "xn--ngstr-lra8j.com", + "xn--noss43i.com", "xn--oiq.cc", - "xn--pearsonenespaol-brb.com", - "xn--q41am8x.com", - "xn--qoq462m.com", - "xn--r8jwklh769h2mc880dk1o431a.com", - "xn--r8jwklh769hk43amcfoyl3z3a.com", - "xn--sgt856gbjl.cc", - "xn--sjqr38j.com", - "xn--tkry91n.com", - "xn--ubt498knmf.com", - "xn--uis17aj9kmuf.com", - "xn--urs05q.jp", - "xn--x-qeu1ji09tzlg.biz", - "xn--x-qeu1ji09tzlg.net", - "xn--xsq421m.com", - "xn--xsq605n.com", - "xn--xsq959n.com", - "xn--yf1at58a.com", - "xn--yt8h.la", - "xn--ztsq84g.cn", - "xnalgas.com", - "xnertv.shop", - "xnostars.com", - "xnxvideos.org", + "xnpool.com", "xnxx-cdn.com", - "xnxx-sex-tube.com", - "xnxx-sex-videos.com", - "xnxx-teens.com", - "xnxx-tv.net", - "xnxx-xxx.win", "xnxx.com", - "xnxx.health", - "xnxx.net", - "xnxx.tv", - "xnxx18.pro", - "xnxx2.info", - "xnxx2.it", - "xnxx2.org", - "xnxx2.pro", - "xnxx3.com", - "xnxx4porn.com", - "xnxxarab.cc", - "xnxxarabsex.com", - "xnxxcom.club", - "xnxxcom.xyz", - "xnxxcomvideos.com", - "xnxxfap.info", - "xnxxhamster.net", - "xnxxhd.biz", - "xnxxhd.tv", - "xnxxmovies.com", - "xnxxporn.de", - "xnxxporn.fun", - "xnxxpornvid.com", - "xnxxsexclips.com", - "xnxxsexmovies.com", - "xnxxtime.com", - "xnxxvideos.rest", - "xnxxx.cc", - "xo.com", - "xo104.com", - "xogogo.com", - "xomfsp.xyz", - "xoom-experience.com", - "xoom.com", - "xoom.io", - "xoom.us", - "xoomcom.com", - "xoteens.com", - "xoxoteiras.com", - "xozilla.com", - "xpaja.net", "xpdo.net", - "xpee.com", - "xplr.co", - "xpoleuno.com", - "xpornblog.com", - "xpornplease.com", - "xposed.info", "xpud.org", - "xqwherb.sbs", "xrentdvd.com", - "xsava.xyz", - "xscale.com", "xsden.info", "xsden.org", - "xsela.cc", - "xshaker.net", - "xshr.online", - "xsijishe.com", "xskywalker.com", "xskywalker.net", - "xslist.org", - "xstas.biz", - "xsvod.xyz", - "xsz-av.com", - "xtapes.to", - "xtegvk.xyz", - "xtracloud.net", + "xt.com", + "xt.pub", "xtube.com", - "xtubebdsm.com", - "xtubezoo.com", - "xu97.vip", "xuchao.net", "xuchao.org", "xuehua.us", "xuite.net", - "xujan.com", "xuzhiyong.net", - "xv1.monster", "xvbelink.com", - "xvds.tv", - "xvedo.net", - "xvideo-jp.com", "xvideo.cc", - "xvideo.com", - "xvideo.run", - "xvideo.vlog.br", - "xvideoporno.tv", "xvideos-cdn.com", - "xvideos-dl.top", - "xvideos-porn-video.com", - "xvideos-xxxx.com", - "xvideos.blog", - "xvideos.co", "xvideos.com", "xvideos.es", - "xvideos.la", - "xvideos.red", - "xvideos.tv.br", "xvideos2.com", - "xvideos3.com", - "xvideos5.com.br", - "xvideosamadoras.com", - "xvideosbrasil.com", - "xvideosbrasileiro.net", - "xvideoscom.me", - "xvideosincesto.com", - "xvideosjingxiang.com", - "xvideosnovinha.com", - "xvideosnovinha.com.br", - "xvideosnovinhas.com", - "xvideostravestis.xxx", - "xvideosup.com.br", - "xvideosx.com.br", - "xvideoz.win", - "xvidios.blog", - "xvidios.xxx", - "xvidzz.com", "xvinlink.com", - "xvirtual.com", - "xvxx.stream", - "xvxxtube.com", - "xwbo.com", - "xx-map.com", - "xx9.app", - "xxbay.com", "xxbbx.com", - "xxbook.cc", - "xxbrits.com", - "xxeronetxx.info", - "xxfbiaa.xyz", - "xxgasm.com", - "xxindianporn.com", - "xxiqiyiavxx.buzz", "xxlmovies.com", - "xxmovz.com", - "xxnx.rest", - "xxnxx-porn.com", - "xxnxx-sex.com", - "xxu.mobi", "xxuz.com", - "xxvideo.mobi", - "xxvideos.xxx", - "xxvideoss.org", - "xxvids.net", - "xxx-av.com", - "xxx-com.cfd", - "xxx-fap.com", - "xxx-files.org", - "xxx-hentai.blogspot.com", - "xxx-porn-fuck.com", - "xxx-porn-tube.com", - "xxx-porn.info", - "xxx-video.cfd", - "xxx-videos.tv", - "xxx-ways.com", "xxx.com", "xxx.xxx", - "xxx18.uno", - "xxx18teen.net", - "xxx2022.com", - "xxx2023.com", - "xxx4hindi.com", - "xxxaporn.com", - "xxxassfuck.com", - "xxxbit.com", - "xxxbolivianas.com", - "xxxbule.com", - "xxxbullet.com", - "xxxbunker.com", - "xxxclub.club", - "xxxcomics.org", - "xxxdan.com", - "xxxdesi.cc", - "xxxdinotube.com", - "xxxengine.net", - "xxxfile.org", - "xxxfiles.com", - "xxxflare.com", - "xxxforte.com", - "xxxfree.watch", "xxxfuckmom.com", - "xxxgames.biz", - "xxxgames.games", - "xxxgirls88.com", - "xxxgratisfilms.com", - "xxxhd.pro", - "xxxhdporn.cc", - "xxxhentai.net", - "xxxhentaipics.com", - "xxxhentaipics.pro", - "xxxhomefuck.com", - "xxxhub123.com", - "xxxhubvideos.com", - "xxxifuck.com", - "xxxindianporn2.com", - "xxxindiantv.com", - "xxxjapanesemovies.com", - "xxxland.net", - "xxxlesbians.me", - "xxxlucah.com", - "xxxmaturepussypics.com", - "xxxmatures.net", - "xxxmofo.com", - "xxxmomporn.tube", - "xxxmovies.fun", - "xxxmovies.pro", - "xxxn.me", - "xxxn.tv", - "xxxner.com", - "xxxnewvideos.com", - "xxxnu.com", - "xxxnxx.me", - "xxxpenguin.com", - "xxxpicz.com", - "xxxporn.su", - "xxxporn123.com", - "xxxporndig.com", - "xxxpornhd.pro", - "xxxpornmovs.com", - "xxxpornotuber.com", - "xxxpornozinho.blog.br", - "xxxpornzeed.com", - "xxxreal.com", - "xxxscenes.net", - "xxxsexanal.com", - "xxxsexcinema.com", - "xxxsexocasero.com", - "xxxsextubes.com", - "xxxsexzoo.com", - "xxxshame.com", - "xxxstreams.eu", - "xxxstreams.org", - "xxxstreams.watch", - "xxxteenanal.net", - "xxxtube1.com", - "xxxtubeasian.net", - "xxxtubedot.com", - "xxxtubegf.com", - "xxxtubenote.com", - "xxxtubeset.com", - "xxxtubezoo.com", - "xxxv.mobi", - "xxxvideo.blog.br", - "xxxvideo.one", - "xxxvideo.vip", - "xxxvideo.world", - "xxxvideoamatoriali.com", - "xxxvideor.com", - "xxxvideos247.com", - "xxxvideoszoo.com", - "xxxvidos.vip", - "xxxvidso.com", - "xxxvirtualworld.com", - "xxxvogue.net", - "xxxwow.net", "xxxx.com.au", - "xxxxvideo.uno", "xxxy.biz", "xxxy.info", - "xxxyaom.xyz", "xxxymovies.com", - "xxxyoungxxx.com", "xys.org", "xysblogs.org", "xyy69.com", "xyy69.info", - "xzone.to", - "xzxxporn.com", - "xzxxtube.com", "y2mate.com", - "ya.ru", - "yaddal.tv", "yadi.sk", - "yadori.club", - "yaeby.info", - "yahoo-news.com.hk", - "yahoo.ae", - "yahoo.am", - "yahoo.as", - "yahoo.at", - "yahoo.az", - "yahoo.ba", - "yahoo.be", - "yahoo.bg", - "yahoo.bi", - "yahoo.bs", - "yahoo.bt", - "yahoo.by", - "yahoo.ca", - "yahoo.cat", - "yahoo.cd", - "yahoo.cg", - "yahoo.ch", - "yahoo.cl", - "yahoo.cm", - "yahoo.co.ao", - "yahoo.co.bw", - "yahoo.co.ck", - "yahoo.co.cr", - "yahoo.co.id", - "yahoo.co.il", - "yahoo.co.in", "yahoo.co.jp", - "yahoo.co.kr", - "yahoo.co.mz", - "yahoo.co.nz", - "yahoo.co.th", - "yahoo.co.tz", - "yahoo.co.uk", - "yahoo.co.uz", - "yahoo.co.ve", - "yahoo.co.vi", - "yahoo.co.za", "yahoo.com", - "yahoo.com.af", - "yahoo.com.ag", - "yahoo.com.ai", - "yahoo.com.ar", - "yahoo.com.au", - "yahoo.com.bd", - "yahoo.com.bo", - "yahoo.com.br", - "yahoo.com.bz", - "yahoo.com.co", - "yahoo.com.do", - "yahoo.com.ec", - "yahoo.com.eg", - "yahoo.com.es", - "yahoo.com.fj", - "yahoo.com.gi", - "yahoo.com.gt", "yahoo.com.hk", - "yahoo.com.kw", - "yahoo.com.lb", - "yahoo.com.ly", - "yahoo.com.mt", - "yahoo.com.mx", - "yahoo.com.my", - "yahoo.com.na", - "yahoo.com.nf", - "yahoo.com.om", - "yahoo.com.pa", - "yahoo.com.pe", - "yahoo.com.ph", - "yahoo.com.pk", - "yahoo.com.pr", - "yahoo.com.py", - "yahoo.com.sa", - "yahoo.com.sb", - "yahoo.com.sg", - "yahoo.com.sv", - "yahoo.com.tj", - "yahoo.com.tr", "yahoo.com.tw", - "yahoo.com.ua", - "yahoo.com.uy", - "yahoo.com.vc", - "yahoo.com.vn", - "yahoo.cz", - "yahoo.de", - "yahoo.dj", - "yahoo.dk", - "yahoo.dm", - "yahoo.ee", - "yahoo.es", - "yahoo.fi", - "yahoo.fm", - "yahoo.fr", - "yahoo.ge", - "yahoo.gg", - "yahoo.gl", - "yahoo.gm", - "yahoo.gp", - "yahoo.gr", - "yahoo.gy", - "yahoo.hk", - "yahoo.hr", - "yahoo.hu", - "yahoo.ie", - "yahoo.im", - "yahoo.in", - "yahoo.is", - "yahoo.it", - "yahoo.je", - "yahoo.jo", - "yahoo.la", - "yahoo.lt", - "yahoo.lu", - "yahoo.lv", - "yahoo.md", - "yahoo.me", - "yahoo.mk", - "yahoo.mw", - "yahoo.mx", "yahoo.net", - "yahoo.nl", - "yahoo.no", - "yahoo.nu", - "yahoo.ph", - "yahoo.pl", - "yahoo.pn", - "yahoo.ps", - "yahoo.pt", - "yahoo.ro", - "yahoo.ru", - "yahoo.rw", - "yahoo.se", - "yahoo.sg", - "yahoo.sh", - "yahoo.si", - "yahoo.sk", - "yahoo.sm", - "yahoo.sn", - "yahoo.so", - "yahoo.sr", - "yahoo.st", - "yahoo.tg", - "yahoo.tk", - "yahoo.tl", - "yahoo.tm", - "yahoo.tn", - "yahoo.vg", - "yahoo.ws", - "yahooapis.com", - "yahoodns.net", - "yahoofinance.com", - "yahoohealth.com", - "yahoomusic.com", "yahoosandbox.com", - "yahoosportsbook.com", "yakbutterblues.com", - "yale-wrexham.ac.uk", - "yale.ac.uk", - "yale.edu", "yam.com", "yam.org.tw", - "yamaxun.com", - "yamibo.com", - "yammer.com", - "yamoon.club", "yande.re", - "yandex.aero", - "yandex.az", - "yandex.by", - "yandex.co.il", "yandex.com", - "yandex.com.ge", - "yandex.com.ru", - "yandex.com.tr", - "yandex.com.ua", - "yandex.de", - "yandex.ee", - "yandex.eu", - "yandex.fi", - "yandex.fr", - "yandex.jobs", - "yandex.kg", - "yandex.kz", - "yandex.lt", - "yandex.lv", - "yandex.md", "yandex.net", - "yandex.org", - "yandex.pl", "yandex.ru", - "yandex.st", - "yandex.sx", - "yandex.tj", - "yandex.tm", - "yandex.ua", - "yandex.uz", - "yandexcloud.net", "yanghengjun.com", "yangjianli.com", - "yantaqu.com", - "yaohubaba.com", - "yaoimangaonline.com", - "yaoiotaku.com", - "yaole91.xyz", - "yaoliuno.fun", - "yaoyaomumu.com", - "yaptube.com", - "yarininsuyu.com", - "yarnpkg.com", - "yasarang.net", "yasni.co.uk", - "yastatic.net", - "yavtube.com", - "yaya.cyou", + "yasukuni.or.jp", "yayabay.com", - "yayadizhi.xyz", - "yazhouse8.com", - "ycc.ac.uk", - "ycoastco.ac.uk", "ycombinator.com", - "ycuc.ac.uk", - "ycw.ac.uk", - "ydds.ac.uk", - "ydn.com.tw", - "ydrindoddewisant.ac.uk", "ydy.com", "yeahteentube.com", "yecl.net", "yeelou.com", "yeeyi.com", "yegle.net", - "yeonda.com", - "yeovil-college.ac.uk", - "yeovil.ac.uk", - "yepporn.com", "yes-news.com", "yes.xxx", "yes123.com.tw", "yesasia.com", "yesasia.com.hk", - "yespornfree.com", "yespornplease.com", - "yespornpleasexxx.com", - "yeswegays.com", "yeyeclub.com", - "yft-mv.sbs", "ygto.com", - "ygugu4.com", "yhcw.net", - "yhelln.ac.uk", - "yhgwgtv.xyz", - "yho.com", - "yhua.ac.uk", - "yhy.cool", "yibada.com", "yibaochina.com", - "yibei.org", "yidio.com", "yigeni.com", "yilubbs.com", "yimg.com", - "yimg.jp", - "yinac.xyz", - "yinac5.top", - "yingpianqu.com", "yingsuoss.com", - "yinhdhan.sbs", - "yinhuafish.lat", "yinlei.org", - "yinmh.com", - "yinshuiger.info", - "yinya.shop", "yipub.com", - "yiqiedoushiganggangkaishi.org", "yizhihongxing.com", - "yjcontentdelivery.com", - "ymail.com", - "ymca-wales.ac.uk", - "ymca.ac.uk", - "ymhsf.top", - "ymhsf1.top", - "ync.ne.jp", - "ynoproject.net", - "yo1health.com", "yobit.net", "yobt.com", "yobt.tv", - "yogalayout.com", "yogichen.org", - "yogify.com", "yolasite.com", - "yomabank.com", - "yomikyo.or.jp", - "yomilogi.com", - "yomiuri-johkai.co.jp", - "yomiuri-ryokou.co.jp", - "yomiuri-systec.co.jp", "yomiuri.co.jp", "yong.hu", - "yopo.work", - "yopornshop.com", - "york-sfc.ac.uk", - "york.ac.uk", "yorkbbs.ca", - "yorkcollege.ac.uk", - "yorkcollegeapps.ac.uk", - "yorkshireuniversities.ac.uk", - "yorksj.ac.uk", - "yorkstonemasonrycove.ac.uk", - "yoshisnewisland.com", "you-get.org", "you.com", - "youassporn.com", - "youav.com", "youdontcare.com", - "youflix.is", - "youjism.com", "youjizz.com", - "youjizz.sex", "youlucky.com", "youmaker.com", - "young-amateur-movies.com", - "young-webcam.net", - "young-xxx.net", - "youngamateursporn.com", - "younger19.com", - "youngerbabes.com", - "youngermommy.com", - "youngfoundation.ac.uk", - "youngheaven.com", - "younglibertines.com", - "youngmommyfucksme.com", - "youngpornhd.com", - "youngpornonly.com", "youngpornvideos.com", - "youngsex.sexy", - "youngsex.video", "youngspiration.hk", - "youngteenhomeporn.com", - "youngtube.me", "youpai.org", - "youporn-germany.com", "youporn.com", - "youporner.eu", "youporngay.com", - "youpornlist.com", - "youpornpremium.com", - "youpornru.com", - "youpornxvideos.net", "your-freedom.net", - "your-objectstorage.com", - "your-server.de", - "youramateurporn.com", - "yourassbig.com", - "yourbrain.com", - "yourdailypornvideos.ws", - "yourdirtymind.com", - "yourdoll.com", "yourepeat.com", - "yourfantasybeginsnow.com", - "yourflashporn.com", - "yourfreeporn.tv", - "yourfuture-eastmidlands.ac.uk", - "yourgynexam.com", "yourlisten.com", "yourlust.com", - "yourmomlovesanal.com", - "yourmomsgotbigtits.com", - "yourmonsterbeats.com", - "yourpelvicexam.com", - "yourporn.sexy", - "yourporndump.com", - "yourporngod.com", "yourprivatevpn.com", "yourtrap.com", - "yourtv.com.au", - "yourupskirt.com", - "yourvoyeurvideos.com", - "yourwifemymeat.com", - "yourxxxvideos.pro", "yousendit.com", - "youshare.ac.uk", "youshun12.com", - "youskbe.com", "youthforfreechina.org", "youthnetradio.org", "youthwant.com.tw", - "youtrannytube.com", "youtu.be", "youtube-nocookie.com", - "youtube.ae", - "youtube.al", - "youtube.am", - "youtube.at", - "youtube.az", - "youtube.ba", - "youtube.be", - "youtube.bg", - "youtube.bh", - "youtube.bo", - "youtube.by", - "youtube.ca", - "youtube.cat", - "youtube.ch", - "youtube.cl", - "youtube.co", - "youtube.co.ae", - "youtube.co.at", - "youtube.co.cr", - "youtube.co.hu", - "youtube.co.id", - "youtube.co.il", - "youtube.co.in", - "youtube.co.jp", - "youtube.co.ke", - "youtube.co.kr", - "youtube.co.ma", - "youtube.co.nz", - "youtube.co.th", - "youtube.co.tz", - "youtube.co.ug", - "youtube.co.uk", - "youtube.co.ve", - "youtube.co.za", - "youtube.co.zw", "youtube.com", - "youtube.com.ar", - "youtube.com.au", - "youtube.com.az", - "youtube.com.bd", - "youtube.com.bh", - "youtube.com.bo", - "youtube.com.br", - "youtube.com.by", - "youtube.com.co", - "youtube.com.do", - "youtube.com.ec", - "youtube.com.ee", - "youtube.com.eg", - "youtube.com.es", - "youtube.com.gh", - "youtube.com.gr", - "youtube.com.gt", - "youtube.com.hk", - "youtube.com.hn", - "youtube.com.hr", - "youtube.com.jm", - "youtube.com.jo", - "youtube.com.kw", - "youtube.com.lb", - "youtube.com.lv", - "youtube.com.ly", - "youtube.com.mk", - "youtube.com.mt", - "youtube.com.mx", - "youtube.com.my", - "youtube.com.ng", - "youtube.com.ni", - "youtube.com.om", - "youtube.com.pa", - "youtube.com.pe", - "youtube.com.ph", - "youtube.com.pk", - "youtube.com.pt", - "youtube.com.py", - "youtube.com.qa", - "youtube.com.ro", - "youtube.com.sa", - "youtube.com.sg", - "youtube.com.sv", - "youtube.com.tn", - "youtube.com.tr", - "youtube.com.tw", - "youtube.com.ua", - "youtube.com.uy", - "youtube.com.ve", - "youtube.cr", - "youtube.cz", - "youtube.de", - "youtube.dk", - "youtube.ee", - "youtube.es", - "youtube.fi", - "youtube.fr", - "youtube.ge", - "youtube.googleapis.com", - "youtube.gr", - "youtube.gt", - "youtube.hk", - "youtube.hr", - "youtube.hu", - "youtube.ie", - "youtube.in", - "youtube.iq", - "youtube.is", - "youtube.it", - "youtube.jo", - "youtube.jp", - "youtube.kr", - "youtube.kz", - "youtube.la", - "youtube.lk", - "youtube.lt", - "youtube.lu", - "youtube.lv", - "youtube.ly", - "youtube.ma", - "youtube.md", - "youtube.me", - "youtube.mk", - "youtube.mn", - "youtube.mx", - "youtube.my", - "youtube.ng", - "youtube.ni", - "youtube.nl", - "youtube.no", - "youtube.pa", - "youtube.pe", - "youtube.ph", - "youtube.pk", - "youtube.pl", - "youtube.pr", - "youtube.pt", - "youtube.qa", - "youtube.ro", - "youtube.rs", - "youtube.ru", - "youtube.sa", - "youtube.se", - "youtube.sg", - "youtube.si", - "youtube.sk", - "youtube.sn", - "youtube.soy", - "youtube.sv", - "youtube.tn", - "youtube.tv", - "youtube.ua", - "youtube.ug", - "youtube.uy", - "youtube.vn", - "youtubecisco.com", "youtubecn.com", "youtubeeducation.com", - "youtubeembeddedplayer.googleapis.com", - "youtubefanfest.com", "youtubegaming.com", - "youtubego.co.id", - "youtubego.co.in", - "youtubego.com", - "youtubego.com.br", - "youtubego.id", - "youtubego.in", - "youtubei.googleapis.com", "youtubekids.com", - "youtubemobilesupport.com", "youversion.com", "youwin.com", - "youwuss.com", - "youx.xxx", "youxu.info", - "youyu.services", - "yoyoav.net", - "ypmate.com", - "ypncdn.com", - "yporth.ac.uk", - "yra.ac.uk", - "ysav184.xyz", - "ysg-link.sbs", - "ysj.ac.uk", - "yskg-ber.buzz", - "ysporn.com", - "ystrad-mynach.ac.uk", - "ysulondon.ac.uk", - "ysx-mm.com", "yt.be", "ytht.net", "ytimg.com", @@ -30430,117 +6736,43 @@ var rules = [ "yts.mx", "yuanming.net", "yuanzhengtang.org", - "yuenuge113.xyz", - "yuenuge18.cc", - "yukineko.me", "yulghun.com", "yunchao.net", - "yunlaopo.cc", - "yunlaopo.com", - "yunlaopo.net", + "yunomi.tokyo", "yuntipub.com", - "yusercontent.com", - "yusjb.com", "yuvutu.com", "yvesgeleyn.com", - "ywoos.com", "ywpw.com", "yx51.net", - "yy55.tv", - "yy7y.com", - "yy8y.com", - "yyfb.cyou", "yyii.org", "yyjlymb.xyz", "yysub.net", - "yzld188.top", "yzzk.com", + "z-lib.io", "z-lib.org", - "z-library.se", - "z00.world", - "z18r.co", - "z18r.com", - "z3x-team.com", - "z5.app", - "z5.com", - "z676869.com", - "za77.xyz", "zacebook.com", - "zakzak.co.jp", "zalmos.com", "zamimg.com", "zannel.com", - "zaobao.com", "zaobao.com.sg", - "zaobao.sg", "zaozon.com", - "zapper.fi", "zapto.org", - "zatrahal.online", "zattoo.com", - "zavat.pw", - "zazzybabes.com", - "zb.app", "zb.com", - "zb.io", - "zb.live", - "zbporn.com", - "zctb.buzz", - "zdassets.com", - "zdnet.com", "zdnet.com.tw", - "zdusercontent.com", - "zee.com", - "zee5.com", - "zee5.in", - "zee5.tv", - "zeebioskop.com", - "zeebiz.com", - "zeeentertainment.com", - "zeenews-fonts.s3.amazonaws.com", - "zeenews.com", - "zeenite.com", - "zeetv.co.uk", - "zeetv.com", - "zeeuk.com", - "zeit-world.co.uk", - "zeit-world.com", - "zeit-world.net", - "zeit-world.org", - "zeit.co", - "zeit.sh", - "zeitworld.com", "zello.com", - "zen8ok.xyz", - "zencdn.net", - "zencoder.com", - "zendesk.com", "zengjinyan.org", - "zenlesszonezero.com", "zenmate.com", "zenmate.com.ru", - "zenodo.org", - "zeplerinstitute.ac.uk", - "zeplin.dev", - "zeplin.io", "zergpool.com", - "zeriamerikes.com", - "zerochan.net", "zerohedge.com", "zeronet.io", - "zert.ch", - "zettai-ero.com", "zeutch.com", "zfreet.com", "zgsddh.com", "zgzcjj.net", - "zh99.net", - "zhaimankan.com", - "zhainanjidi.xyz", - "zhainanjidid.top", "zhanbin.net", "zhangboli.net", - "zhangboz1.xyz", "zhangtianliang.com", "zhanlve.org", "zhenghui.org", @@ -30549,115 +6781,54 @@ var rules = [ "zhenlibu.info", "zhenlibu1984.com", "zhenxiang.biz", - "zhimeishe888.com", "zhinengluyou.com", + "zhizhu.top", "zhongguo.ca", "zhongguorenquan.org", "zhongguotese.net", "zhongmeng.org", + "zhongzidi.com", "zhoushuguang.com", "zhreader.com", - "zhtv01.com", "zhuangbi.me", "zhuanxing.cn", "zhuatieba.com", "zhuichaguoji.org", "zhujiget.com", - "zhuzhushipin-app.com", "zi.media", "zi5.me", - "zibacity.com", "ziddu.com", - "zigzag.kr", "zillionk.com", "zim.vn", - "zind.cloud", - "zingtruyen.net", "zinio.com", - "zipcine.com", "ziporn.com", "zippyshare.com", - "zishy.com", "zkaip.com", "zkiz.com", - "zlib.life", - "zlibcdn.com", - "zlibcdn2.com", + "zmedia.com.tw", "zmw.cn", - "zndsk.com", "zodgame.us", "zoho.com", - "zoho.com.au", - "zoho.eu", - "zoho.in", - "zohocdn.com", - "zohomeetups.com", - "zohomerchandise.com", - "zohopublic.com", - "zohoschools.com", - "zohostatic.com", - "zohostatic.in", - "zohouniversity.com", - "zohowebstatic.com", - "zoig.com", "zomobo.net", "zonaeuropa.com", "zonghexinwen.com", "zonghexinwen.net", - "zoo-hardcore.com", - "zoo-porno.biz", - "zoo-tube8.com", - "zoo-xnxx.com", - "zoofiction.com", - "zoofilianet.com", "zoogvpn.com", - "zoohun.com", - "zoom.com", - "zoom.com.cn", - "zoom.us", - "zoomingin.tv", - "zoomobileporn.com", - "zoonoses.ac.uk", - "zoonosis.ac.uk", - "zoophilist.net", - "zooporn.pro", - "zooporn.shiksha", - "zooporn.video", - "zoopornmd.com", - "zooporno.biz", - "zooredtube.com", - "zoosexfarm.com", - "zoosexnet.com", - "zooskoolvideos.com", + "zoominfo.com", + "zooqle.com", "zootool.com", - "zootube1.com", - "zooxxxsexporn.red", - "zooyouporn.com", - "zoozhamster.com", "zoozle.net", "zophar.net", - "zopim.com", - "zorglist.com", "zorrovpn.com", "zozotown.com", "zpn.im", - "zqqpwz.com", "zsdxzk.com", - "zsh.org", "zspeeder.me", "zsrhao.com", - "zsuxtx-ktv.shop", - "zteman.net", - "zuckerberg.com", - "zuckerberg.net", - "zukunftswerkstatt.de", - "zunked.com", "zuo.la", "zuobiao.me", "zuola.com", "zvereff.com", - "zweiporn.com", - "zwtvusa.com", "zynaima.com", "zynamics.com", "zyns.com", @@ -30665,17 +6836,7 @@ var rules = [ "zyzc9.com", "zzcartoon.com", "zzcloud.me", - "zzdh.biz", - "zzdh.cc", - "zzdh.pw", - "zzdh.run", - "zzdh.ws", - "zzdh77.com", - "zzdh808.com", - "zzdh99.com", - "zzgays.com", - "zzux.com", - "zzycdz.com" + "zzux.com" ] ], [ diff --git a/v2rayn/v2rayN/ServiceLib/ViewModels/ClashConnectionsViewModel.cs b/v2rayn/v2rayN/ServiceLib/ViewModels/ClashConnectionsViewModel.cs index e5b5585fe3..a9bb4eae10 100644 --- a/v2rayn/v2rayN/ServiceLib/ViewModels/ClashConnectionsViewModel.cs +++ b/v2rayn/v2rayN/ServiceLib/ViewModels/ClashConnectionsViewModel.cs @@ -53,7 +53,7 @@ namespace ServiceLib.ViewModels private async Task Init() { - _ = DelayTestTask(); + await DelayTestTask(); } private async Task GetClashConnections() diff --git a/v2rayn/v2rayN/ServiceLib/ViewModels/ClashProxiesViewModel.cs b/v2rayn/v2rayN/ServiceLib/ViewModels/ClashProxiesViewModel.cs index f1011f2632..45339bdfbe 100644 --- a/v2rayn/v2rayN/ServiceLib/ViewModels/ClashProxiesViewModel.cs +++ b/v2rayn/v2rayN/ServiceLib/ViewModels/ClashProxiesViewModel.cs @@ -95,7 +95,7 @@ namespace ServiceLib.ViewModels private async Task Init() { - _ = DelayTestTask(); + await DelayTestTask(); } private async Task DoRuleModeSelected(bool c) @@ -366,7 +366,7 @@ namespace ServiceLib.ViewModels private async Task ProxiesDelayTest(bool blAll = true) { - ClashApiHandler.Instance.ClashProxiesDelayTest(blAll, _proxyDetails.ToList(), async (item, result) => + ClashApiHandler.Instance.ClashProxiesDelayTest(blAll, _proxyDetails.ToList(), (item, result) => { if (item == null || result.IsNullOrEmpty()) { diff --git a/yt-dlp/yt_dlp/extractor/_extractors.py b/yt-dlp/yt_dlp/extractor/_extractors.py index 3ab0f5efa2..74a043b9c8 100644 --- a/yt-dlp/yt_dlp/extractor/_extractors.py +++ b/yt-dlp/yt_dlp/extractor/_extractors.py @@ -336,6 +336,7 @@ from .canal1 import Canal1IE from .canalalpha import CanalAlphaIE from .canalc2 import Canalc2IE from .canalplus import CanalplusIE +from .canalsurmas import CanalsurmasIE from .caracoltv import CaracolTvPlayIE from .cartoonnetwork import CartoonNetworkIE from .cbc import ( @@ -1882,6 +1883,8 @@ from .skyit import ( SkyItVideoIE, SkyItVideoLiveIE, TV8ItIE, + TV8ItLiveIE, + TV8ItPlaylistIE, ) from .skylinewebcams import SkylineWebcamsIE from .skynewsarabia import ( diff --git a/yt-dlp/yt_dlp/extractor/canalsurmas.py b/yt-dlp/yt_dlp/extractor/canalsurmas.py new file mode 100644 index 0000000000..210973a0b8 --- /dev/null +++ b/yt-dlp/yt_dlp/extractor/canalsurmas.py @@ -0,0 +1,84 @@ +import json +import time + +from .common import InfoExtractor +from ..utils import ( + determine_ext, + float_or_none, + jwt_decode_hs256, + parse_iso8601, + url_or_none, + variadic, +) +from ..utils.traversal import traverse_obj + + +class CanalsurmasIE(InfoExtractor): + _VALID_URL = r'https?://(?:www\.)?canalsurmas\.es/videos/(?P\d+)' + _TESTS = [{ + 'url': 'https://www.canalsurmas.es/videos/44006-el-gran-queo-1-lora-del-rio-sevilla-20072014', + 'md5': '861f86fdc1221175e15523047d0087ef', + 'info_dict': { + 'id': '44006', + 'ext': 'mp4', + 'title': 'Lora del Río (Sevilla)', + 'description': 'md5:3d9ee40a9b1b26ed8259e6b71ed27b8b', + 'thumbnail': 'https://cdn2.rtva.interactvty.com/content_cards/00f3e8f67b0a4f3b90a4a14618a48b0d.jpg', + 'timestamp': 1648123182, + 'upload_date': '20220324', + }, + }] + _API_BASE = 'https://api-rtva.interactvty.com' + _access_token = None + + @staticmethod + def _is_jwt_expired(token): + return jwt_decode_hs256(token)['exp'] - time.time() < 300 + + def _call_api(self, endpoint, video_id, fields=None): + if not self._access_token or self._is_jwt_expired(self._access_token): + self._access_token = self._download_json( + f'{self._API_BASE}/jwt/token/', None, + 'Downloading access token', 'Failed to download access token', + headers={'Content-Type': 'application/json'}, + data=json.dumps({ + 'username': 'canalsur_demo', + 'password': 'dsUBXUcI', + }).encode())['access'] + + return self._download_json( + f'{self._API_BASE}/api/2.0/contents/{endpoint}/{video_id}/', video_id, + f'Downloading {endpoint} API JSON', f'Failed to download {endpoint} API JSON', + headers={'Authorization': f'jwtok {self._access_token}'}, + query={'optional_fields': ','.join(variadic(fields))} if fields else None) + + def _real_extract(self, url): + video_id = self._match_id(url) + video_info = self._call_api('content', video_id, fields=[ + 'description', 'image', 'duration', 'created_at', 'tags', + ]) + stream_info = self._call_api('content_resources', video_id, 'media_url') + + formats, subtitles = [], {} + for stream_url in traverse_obj(stream_info, ('results', ..., 'media_url', {url_or_none})): + if determine_ext(stream_url) == 'm3u8': + fmts, subs = self._extract_m3u8_formats_and_subtitles( + stream_url, video_id, m3u8_id='hls', fatal=False) + formats.extend(fmts) + self._merge_subtitles(subs, target=subtitles) + else: + formats.append({'url': stream_url}) + + return { + 'id': video_id, + 'formats': formats, + 'subtitles': subtitles, + **traverse_obj(video_info, { + 'title': ('name', {str.strip}), + 'description': ('description', {str}), + 'thumbnail': ('image', {url_or_none}), + 'duration': ('duration', {float_or_none}), + 'timestamp': ('created_at', {parse_iso8601}), + 'tags': ('tags', ..., {str}), + }), + } diff --git a/yt-dlp/yt_dlp/extractor/msn.py b/yt-dlp/yt_dlp/extractor/msn.py index dd864952c4..6ede7c5cfc 100644 --- a/yt-dlp/yt_dlp/extractor/msn.py +++ b/yt-dlp/yt_dlp/extractor/msn.py @@ -1,167 +1,215 @@ -import re - from .common import InfoExtractor from ..utils import ( ExtractorError, + clean_html, determine_ext, int_or_none, - unescapeHTML, + parse_iso8601, + url_or_none, ) +from ..utils.traversal import traverse_obj class MSNIE(InfoExtractor): - _WORKING = False - _VALID_URL = r'https?://(?:(?:www|preview)\.)?msn\.com/(?:[^/]+/)+(?P[^/]+)/[a-z]{2}-(?P[\da-zA-Z]+)' + _VALID_URL = r'https?://(?:(?:www|preview)\.)?msn\.com/(?P[a-z]{2}-[a-z]{2})/(?:[^/?#]+/)+(?P[^/?#]+)/[a-z]{2}-(?P[\da-zA-Z]+)' _TESTS = [{ - 'url': 'https://www.msn.com/en-in/money/video/7-ways-to-get-rid-of-chest-congestion/vi-BBPxU6d', - 'md5': '087548191d273c5c55d05028f8d2cbcd', + 'url': 'https://www.msn.com/en-gb/video/news/president-macron-interrupts-trump-over-ukraine-funding/vi-AA1zMcD7', 'info_dict': { - 'id': 'BBPxU6d', - 'display_id': '7-ways-to-get-rid-of-chest-congestion', + 'id': 'AA1zMcD7', 'ext': 'mp4', - 'title': 'Seven ways to get rid of chest congestion', - 'description': '7 Ways to Get Rid of Chest Congestion', - 'duration': 88, - 'uploader': 'Health', - 'uploader_id': 'BBPrMqa', + 'display_id': 'president-macron-interrupts-trump-over-ukraine-funding', + 'title': 'President Macron interrupts Trump over Ukraine funding', + 'description': 'md5:5fd3857ac25849e7a56cb25fbe1a2a8b', + 'uploader': 'k! News UK', + 'uploader_id': 'BB1hz5Rj', + 'duration': 59, + 'thumbnail': 'https://img-s-msn-com.akamaized.net/tenant/amp/entityid/AA1zMagX.img', + 'tags': 'count:14', + 'timestamp': 1740510914, + 'upload_date': '20250225', + 'release_timestamp': 1740513600, + 'release_date': '20250225', + 'modified_timestamp': 1741413241, + 'modified_date': '20250308', }, }, { - # Article, multiple Dailymotion Embeds - 'url': 'https://www.msn.com/en-in/money/sports/hottest-football-wags-greatest-footballers-turned-managers-and-more/ar-BBpc7Nl', + 'url': 'https://www.msn.com/en-gb/video/watch/films-success-saved-adam-pearsons-acting-career/vi-AA1znZGE?ocid=hpmsn', 'info_dict': { - 'id': 'BBpc7Nl', + 'id': 'AA1znZGE', + 'ext': 'mp4', + 'display_id': 'films-success-saved-adam-pearsons-acting-career', + 'title': "Films' success saved Adam Pearson's acting career", + 'description': 'md5:98c05f7bd9ab4f9c423400f62f2d3da5', + 'uploader': 'Sky News', + 'uploader_id': 'AA2eki', + 'duration': 52, + 'thumbnail': 'https://img-s-msn-com.akamaized.net/tenant/amp/entityid/AA1zo7nU.img', + 'timestamp': 1739993965, + 'upload_date': '20250219', + 'release_timestamp': 1739977753, + 'release_date': '20250219', + 'modified_timestamp': 1742076259, + 'modified_date': '20250315', }, - 'playlist_mincount': 4, }, { - 'url': 'http://www.msn.com/en-ae/news/offbeat/meet-the-nine-year-old-self-made-millionaire/ar-BBt6ZKf', - 'only_matching': True, - }, { - 'url': 'http://www.msn.com/en-ae/video/watch/obama-a-lot-of-people-will-be-disappointed/vi-AAhxUMH', - 'only_matching': True, - }, { - # geo restricted - 'url': 'http://www.msn.com/en-ae/foodanddrink/joinourtable/the-first-fart-makes-you-laugh-the-last-fart-makes-you-cry/vp-AAhzIBU', - 'only_matching': True, - }, { - 'url': 'http://www.msn.com/en-ae/entertainment/bollywood/watch-how-salman-khan-reacted-when-asked-if-he-would-apologize-for-his-‘raped-woman’-comment/vi-AAhvzW6', - 'only_matching': True, - }, { - # Vidible(AOL) Embed - 'url': 'https://www.msn.com/en-us/money/other/jupiter-is-about-to-come-so-close-you-can-see-its-moons-with-binoculars/vi-AACqsHR', - 'only_matching': True, + 'url': 'https://www.msn.com/en-us/entertainment/news/rock-frontman-replacements-you-might-not-know-happened/vi-AA1yLVcD', + 'info_dict': { + 'id': 'AA1yLVcD', + 'ext': 'mp4', + 'display_id': 'rock-frontman-replacements-you-might-not-know-happened', + 'title': 'Rock Frontman Replacements You Might Not Know Happened', + 'description': 'md5:451a125496ff0c9f6816055bb1808da9', + 'uploader': 'Grunge (Video)', + 'uploader_id': 'BB1oveoV', + 'duration': 596, + 'thumbnail': 'https://img-s-msn-com.akamaized.net/tenant/amp/entityid/AA1yM4OJ.img', + 'timestamp': 1739223456, + 'upload_date': '20250210', + 'release_timestamp': 1739219731, + 'release_date': '20250210', + 'modified_timestamp': 1741427272, + 'modified_date': '20250308', + }, }, { # Dailymotion Embed - 'url': 'https://www.msn.com/es-ve/entretenimiento/watch/winston-salem-paire-refait-des-siennes-en-perdant-sa-raquette-au-service/vp-AAG704L', - 'only_matching': True, + 'url': 'https://www.msn.com/de-de/nachrichten/other/the-first-descendant-gameplay-trailer-zu-serena-der-neuen-gefl%C3%BCgelten-nachfahrin/vi-AA1B1d06', + 'info_dict': { + 'id': 'x9g6oli', + 'ext': 'mp4', + 'title': 'The First Descendant: Gameplay-Trailer zu Serena, der neuen geflügelten Nachfahrin', + 'description': '', + 'uploader': 'MeinMMO', + 'uploader_id': 'x2mvqi4', + 'view_count': int, + 'like_count': int, + 'age_limit': 0, + 'duration': 60, + 'thumbnail': 'https://s1.dmcdn.net/v/Y3fO61drj56vPB9SS/x1080', + 'tags': ['MeinMMO', 'The First Descendant'], + 'timestamp': 1742124877, + 'upload_date': '20250316', + }, }, { - # YouTube Embed - 'url': 'https://www.msn.com/en-in/money/news/meet-vikram-%E2%80%94-chandrayaan-2s-lander/vi-AAGUr0v', - 'only_matching': True, + # Youtube Embed + 'url': 'https://www.msn.com/en-gb/video/webcontent/web-content/vi-AA1ybFaJ', + 'info_dict': { + 'id': 'kQSChWu95nE', + 'ext': 'mp4', + 'title': '7 Daily Habits to Nurture Your Personal Growth', + 'description': 'md5:6f233c68341b74dee30c8c121924e827', + 'uploader': 'TopThink', + 'uploader_id': '@TopThink', + 'uploader_url': 'https://www.youtube.com/@TopThink', + 'channel': 'TopThink', + 'channel_id': 'UCMlGmHokrQRp-RaNO7aq4Uw', + 'channel_url': 'https://www.youtube.com/channel/UCMlGmHokrQRp-RaNO7aq4Uw', + 'channel_is_verified': True, + 'channel_follower_count': int, + 'comment_count': int, + 'view_count': int, + 'like_count': int, + 'age_limit': 0, + 'duration': 705, + 'thumbnail': 'https://i.ytimg.com/vi/kQSChWu95nE/maxresdefault.jpg', + 'categories': ['Howto & Style'], + 'tags': ['topthink', 'top think', 'personal growth'], + 'timestamp': 1722711620, + 'upload_date': '20240803', + 'playable_in_embed': True, + 'availability': 'public', + 'live_status': 'not_live', + }, }, { - # NBCSports Embed - 'url': 'https://www.msn.com/en-us/money/football_nfl/week-13-preview-redskins-vs-panthers/vi-BBXsCDb', - 'only_matching': True, + # Article with social embed + 'url': 'https://www.msn.com/en-in/news/techandscience/watch-earth-sets-and-rises-behind-moon-in-breathtaking-blue-ghost-video/ar-AA1zKoAc', + 'info_dict': { + 'id': 'AA1zKoAc', + 'title': 'Watch: Earth sets and rises behind Moon in breathtaking Blue Ghost video', + 'description': 'md5:0ad51cfa77e42e7f0c46cf98a619dbbf', + 'uploader': 'India Today', + 'uploader_id': 'AAyFWG', + 'tags': 'count:11', + 'timestamp': 1740485034, + 'upload_date': '20250225', + 'release_timestamp': 1740484875, + 'release_date': '20250225', + 'modified_timestamp': 1740488561, + 'modified_date': '20250225', + }, + 'playlist_count': 1, }] def _real_extract(self, url): - display_id, page_id = self._match_valid_url(url).groups() + locale, display_id, page_id = self._match_valid_url(url).group('locale', 'display_id', 'id') - webpage = self._download_webpage(url, display_id) + json_data = self._download_json( + f'https://assets.msn.com/content/view/v2/Detail/{locale}/{page_id}', page_id) - entries = [] - for _, metadata in re.findall(r'data-metadata\s*=\s*(["\'])(?P.+?)\1', webpage): - video = self._parse_json(unescapeHTML(metadata), display_id) - - provider_id = video.get('providerId') - player_name = video.get('playerName') - if player_name and provider_id: - entry = None - if player_name == 'AOL': - if provider_id.startswith('http'): - provider_id = self._search_regex( - r'https?://delivery\.vidible\.tv/video/redirect/([0-9a-f]{24})', - provider_id, 'vidible id') - entry = self.url_result( - 'aol-video:' + provider_id, 'Aol', provider_id) - elif player_name == 'Dailymotion': - entry = self.url_result( - 'https://www.dailymotion.com/video/' + provider_id, - 'Dailymotion', provider_id) - elif player_name == 'YouTube': - entry = self.url_result( - provider_id, 'Youtube', provider_id) - elif player_name == 'NBCSports': - entry = self.url_result( - 'http://vplayer.nbcsports.com/p/BxmELC/nbcsports_embed/select/media/' + provider_id, - 'NBCSportsVPlayer', provider_id) - if entry: - entries.append(entry) - continue - - video_id = video['uuid'] - title = video['title'] + common_metadata = traverse_obj(json_data, { + 'title': ('title', {str}), + 'description': (('abstract', ('body', {clean_html})), {str}, filter, any), + 'timestamp': ('createdDateTime', {parse_iso8601}), + 'release_timestamp': ('publishedDateTime', {parse_iso8601}), + 'modified_timestamp': ('updatedDateTime', {parse_iso8601}), + 'thumbnail': ('thumbnail', 'image', 'url', {url_or_none}), + 'duration': ('videoMetadata', 'playTime', {int_or_none}), + 'tags': ('keywords', ..., {str}), + 'uploader': ('provider', 'name', {str}), + 'uploader_id': ('provider', 'id', {str}), + }) + page_type = json_data['type'] + source_url = traverse_obj(json_data, ('sourceHref', {url_or_none})) + if page_type == 'video': + if traverse_obj(json_data, ('thirdPartyVideoPlayer', 'enabled')) and source_url: + return self.url_result(source_url) formats = [] - for file_ in video.get('videoFiles', []): - format_url = file_.get('url') - if not format_url: - continue - if 'format=m3u8-aapl' in format_url: - # m3u8_native should not be used here until - # https://github.com/ytdl-org/youtube-dl/issues/9913 is fixed - formats.extend(self._extract_m3u8_formats( - format_url, display_id, 'mp4', - m3u8_id='hls', fatal=False)) - elif 'format=mpd-time-csf' in format_url: - formats.extend(self._extract_mpd_formats( - format_url, display_id, 'dash', fatal=False)) - elif '.ism' in format_url: - if format_url.endswith('.ism'): - format_url += '/manifest' - formats.extend(self._extract_ism_formats( - format_url, display_id, 'mss', fatal=False)) - else: - format_id = file_.get('formatCode') - formats.append({ - 'url': format_url, - 'ext': 'mp4', - 'format_id': format_id, - 'width': int_or_none(file_.get('width')), - 'height': int_or_none(file_.get('height')), - 'vbr': int_or_none(self._search_regex(r'_(\d+)\.mp4', format_url, 'vbr', default=None)), - 'quality': 1 if format_id == '1001' else None, - }) - subtitles = {} - for file_ in video.get('files', []): - format_url = file_.get('url') - format_code = file_.get('formatCode') - if not format_url or not format_code: - continue - if str(format_code) == '3100': - subtitles.setdefault(file_.get('culture', 'en'), []).append({ - 'ext': determine_ext(format_url, 'ttml'), - 'url': format_url, - }) + for file in traverse_obj(json_data, ('videoMetadata', 'externalVideoFiles', lambda _, v: url_or_none(v['url']))): + file_url = file['url'] + ext = determine_ext(file_url) + if ext == 'm3u8': + fmts, subs = self._extract_m3u8_formats_and_subtitles( + file_url, page_id, 'mp4', m3u8_id='hls', fatal=False) + formats.extend(fmts) + self._merge_subtitles(subs, target=subtitles) + elif ext == 'mpd': + fmts, subs = self._extract_mpd_formats_and_subtitles( + file_url, page_id, mpd_id='dash', fatal=False) + formats.extend(fmts) + self._merge_subtitles(subs, target=subtitles) + else: + formats.append( + traverse_obj(file, { + 'url': 'url', + 'format_id': ('format', {str}), + 'filesize': ('fileSize', {int_or_none}), + 'height': ('height', {int_or_none}), + 'width': ('width', {int_or_none}), + })) + for caption in traverse_obj(json_data, ('videoMetadata', 'closedCaptions', lambda _, v: url_or_none(v['href']))): + lang = caption.get('locale') or 'en-us' + subtitles.setdefault(lang, []).append({ + 'url': caption['href'], + 'ext': 'ttml', + }) - entries.append({ - 'id': video_id, + return { + 'id': page_id, 'display_id': display_id, - 'title': title, - 'description': video.get('description'), - 'thumbnail': video.get('headlineImage', {}).get('url'), - 'duration': int_or_none(video.get('durationSecs')), - 'uploader': video.get('sourceFriendly'), - 'uploader_id': video.get('providerId'), - 'creator': video.get('creator'), - 'subtitles': subtitles, 'formats': formats, - }) + 'subtitles': subtitles, + **common_metadata, + } + elif page_type == 'webcontent': + if not source_url: + raise ExtractorError('Could not find source URL') + return self.url_result(source_url) + elif page_type == 'article': + entries = [] + for embed_url in traverse_obj(json_data, ('socialEmbeds', ..., 'postUrl', {url_or_none})): + entries.append(self.url_result(embed_url)) - if not entries: - error = unescapeHTML(self._search_regex( - r'data-error=(["\'])(?P.+?)\1', - webpage, 'error', group='error')) - raise ExtractorError(f'{self.IE_NAME} said: {error}', expected=True) + return self.playlist_result(entries, page_id, **common_metadata) - return self.playlist_result(entries, page_id) + raise ExtractorError(f'Unsupported page type: {page_type}') diff --git a/yt-dlp/yt_dlp/extractor/nbc.py b/yt-dlp/yt_dlp/extractor/nbc.py index 8f6fb22b17..d9aded09ea 100644 --- a/yt-dlp/yt_dlp/extractor/nbc.py +++ b/yt-dlp/yt_dlp/extractor/nbc.py @@ -736,7 +736,7 @@ class NBCStationsIE(InfoExtractor): webpage = self._download_webpage(url, video_id) nbc_data = self._search_json( - r'