[
  {
    "path": ".circleci/config.yml",
    "content": "version: 2.1\n\norbs:\n  android: circleci/android@2.3.0\n\njobs:\n  build:\n    executor:\n      name: android/android-docker\n      tag: 2025.04.1-ndk\n      resource-class: large\n    environment:\n      GRADLE_OPTS: -Dorg.gradle.workers.max=1 -Dorg.gradle.daemon=false -Dkotlin.compiler.execution.strategy=\"in-process\"\n      RUST_VERSION: 1.86.0\n    steps:\n      - checkout\n      - run: git submodule update --init --recursive\n      - run: curl https://sh.rustup.rs -sSf | sh -s -- --default-toolchain $RUST_VERSION -y\n      - run:\n          name: Update environment variables\n          command: |\n            echo 'export PATH=\"$HOME\"/.cargo/bin:\"$PATH\"' >> \"$BASH_ENV\"\n      - run: rustup target add armv7-linux-androideabi aarch64-linux-android i686-linux-android x86_64-linux-android\n      - android/restore-gradle-cache\n      - run:\n          name: Run Build and Tests\n          command: ./gradlew assembleDebug check -PCARGO_PROFILE=debug\n      - android/save-gradle-cache\n      - store_artifacts:\n          path: mobile/build/outputs/apk\n          destination: apk/mobile\n      - store_artifacts:\n          path: tv/build/outputs/apk\n          destination: apk/tv\n      - store_artifacts:\n          path: core/build/reports\n          destination: reports/core\n      - store_artifacts:\n          path: mobile/build/reports\n          destination: reports/mobile\n      - store_artifacts:\n          path: plugin/build/reports\n          destination: reports/plugin\n      - store_artifacts:\n          path: tv/build/reports\n          destination: reports/tv\n\nworkflows:\n  test:\n    jobs:\n      - build\n"
  },
  {
    "path": ".github/FUNDING.yml",
    "content": "github: [Mygod]\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.md",
    "content": "---\nname: Bug report\nabout: Create a report to help us improve\ntitle: ''\nlabels: bug\nassignees: ''\n\n---\n\nPlease read contributing guidelines. Thanks.\n\n**Describe the bug**\nA clear and concise description of what the bug is.\n\n**To Reproduce**\nSteps to reproduce the behavior:\n1. Go to '...'\n2. Click on '....'\n3. Scroll down to '....'\n4. See error\n\n**Expected behavior**\nA clear and concise description of what you expected to happen.\n\n**Screenshots**\nIf applicable, add screenshots to help explain your problem.\n\n**Smartphone (please complete the following information):**\n - Android/Chrome OS version: [e.g. \"7.0.0_r14\" or \"71.0.3578.94 (32-bit)\", more detailed description is preferred]\n - Device: [e.g. Google Pixel XL]\n - Version: [e.g. version code \"v3.0.0\" or commit ID \"a073f85\"]\n - Last version that did not exhibit the issue: [not applicable]\n\n**Configuration**\nPut an `x` inside the [ ] that applies.\n\n* [ ] IPv4 server address\n* [ ] IPv6 server address\n* [ ] Client IPv4 availability\n* [ ] Client IPv6 availability\n* Encrypt method:\n* Route\n  * [ ] All\n  * [ ] Bypass LAN\n  * [ ] Bypass China\n  * [ ] Bypass LAN & China\n  * [ ] GFW List\n  * [ ] China List\n  * [ ] Custom rules\n* [ ] IPv6 route\n* [ ] Apps VPN mode\n  * [ ] Bypass mode\n* Remote DNS: 8.8.8.8\n* [ ] DNS over UDP\n* Plugin configuration (if applicable):\n* [ ] Auto Connect\n* [ ] TCP Fast Open\n* If you're not using VPN mode, please supply more details here:\n\n**Additional context**\nAdd any other context about the problem here.\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature_request.md",
    "content": "---\nname: Feature request\nabout: Suggest an idea for this project\ntitle: ''\nlabels: enhancement\nassignees: ''\n\n---\n\nPlease read contributing guidelines. Thanks.\n\n**Is your feature request related to a problem? Please describe.**\nA clear and concise description of what the problem is. Ex. I'm always frustrated when [...]\n\n**Describe the solution you'd like**\nA clear and concise description of what you want to happen.\n\n**Describe alternatives you've considered**\nA clear and concise description of any alternative solutions or features you've considered.\n\n**Additional context**\nAdd any other context or screenshots about the feature request here.\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/questions-support-requests-other.md",
    "content": "---\nname: Questions/Support requests/Other\nabout: You should probably use the forum\ntitle: ''\nlabels: question\nassignees: ''\n\n---\n\nPlease use the forum at https://discourse.shadowsocks.org/c/implementations/shadowsocks-android instead. Your issue will probably be closed.\n"
  },
  {
    "path": ".github/doc-json.md",
    "content": "# Documentation for JSON format\n\nshadowsocks-android accepts processing Shadowsocks configs through JSON files.\nThis documentation is targeted towards Shadowsocks server maintainers, who might need to distribute server configs through subscription JSON files, which is supported since [v5.0.0](https://github.com/shadowsocks/shadowsocks-android/releases/tag/v5.0.0).\n\n## `Profile` JSON object\n\nIn general, shadowsocks-android respects [the specification at shadowsocks.org](https://shadowsocks.org/en/config/quick-guide.html).\nA JSON object is recognized as a `Profile` (i.e. a valid server config), if all of the following required fields are present and valid:\n\n* `server`\n* `server_port`\n* `password`\n* `method`\n\nThese fields have the same meaning as specified by shadowsocks.org.\nThe specification at shadowsocks.org additionally specifies two additional fields, which is not used by shadowsocks-android:\n\n* `local_port`: This field is configured globally through \"SOCKS5 proxy port\".\n* `timeout`: This field is hardcoded to 600 in shadowsocks-android (however, it is only used as a write timeout, so long idle connections like GMS heartbeat are allowed).\n\nAdditionally, shadowsocks-android accepts the following optional fields:\n\n* `plugin`: shadowsocks-android plugin ID or [alias](https://github.com/shadowsocks/shadowsocks-android/pull/2431).\n* `plugin_opts`: Plugin options [as specified in shadowsocks.org](https://shadowsocks.org/en/spec/Plugin.html).\n* `remarks`: \"Profile Name\". (also used by [shadowsocks-windows](https://github.com/shadowsocks/shadowsocks-windows))\n* `udp_fallback`: \"UDP Fallback\", should be a `Profile` JSON object or null.\n\nThe following optional fields are \"Feature Settings\" in shadowsocks-android, if omitted, their values will be copied from currently selected profile:\n\n* `route`: \"Route\", should be one of `all`, `bypass-lan`, `bypass-china`, `bypass-lan-china`, `gfwlist`, `china-list`, `custom-rules`.\n* `ipv6`: \"IPv6 Route\", Boolean.\n* `proxy_apps`: \"Apps VPN mode\", is a JSON object with the following fields:\n  - `enabled`: Boolean.\n  - `bypass`: Boolean, whether the app specified should be bypassed or proxied.\n  - `android_list`: An array of strings, specifying a list of Android app [package names](https://developer.android.com/studio/build/application-id).\n* `udpdns`: \"Send DNS over UDP\", Boolean.\n\n`Profile` objects can have additional fields, which will be ignored by shadowsocks-android.\n\n\n## Parsing/Importing JSON\n\nshadowsocks-android imports JSON using the following logic, which should support all reasonable formats of JSON files containing `Profile`s, including `gui-config.json` used by shadowsocks-windows.\n\n1. On input a JSON file, try to recognize it as a `Profile`.\n2. If input is an object and all the required fields of a `Profile` is present, return the parsed `Profile`.\n3. Otherwise if input is an object, recursively search for `Profile`s in each field and return all found `Profile`s.\n4. Otherwise if input is an array, recursively search for `Profile`s for each element and return all found `Profile`s.\n5. Conclude that there is no `Profile` in input.\n\nIn general, subscription JSON file can be in any structure, as long as they contain the `Profile` JSON objects recognized by the above procedure.\n\n\n## Exporting JSON\n\nThe easiest way to write JSON files is to configure them in shadowsocks-android and export the JSON file using the app.\nThe output will be a JSON file consisting of a JSON array with all the `Profile`s.\n\n\n## Subscription update behavior\n\nIn shadowsocks-android, `Profile` is indexed by the triple `(server, server_port, remarks)`.\nIf two `Profile`s share the exact same triple, they will be treated as the exact same `Profile`, despite possibly having different plugins, passwords, or even encryption methods.\n\nWhen doing subscription updates,\n\n* If an old `Profile` shares the same triple as a new `Profile`, the following field in the old `Profile` will be updated: `password`, `method`, `plugin`, `plugin_opts`, `udp_fallback`.\n  This ensures that user configured feature settings and traffic stats are preserved.\n* If two `Profile` across all the subscriptions share the exact same triple, the behavior is undefined.\n  Please avoid this if possible.\n\n\n## Appendix: Sample exported JSON file\n\n```json\n[\n  {\n    \"server\": \"198.199.101.152\",\n    \"server_port\": 8388,\n    \"password\": \"u1rRWTssNv0p\",\n    \"method\": \"aes-256-cfb\",\n    \"remarks\": \"Example 1\"\n  },\n  {\n    \"server\": \"198.199.101.12\",\n    \"server_port\": 8388,\n    \"password\": \"u1rRWTssNv0p\",\n    \"method\": \"aes-256-cfb\",\n    \"plugin\": \"v2ray\",\n    \"plugin_opts\": \"host=www.example.com\",\n    \"remarks\": \"Example 2\",\n    \"route\": \"bypass-lan-china\",\n    \"remote_dns\": \"dns.google\",\n    \"ipv6\": true,\n    \"metered\": false,\n    \"proxy_apps\": {\n      \"enabled\": true,\n      \"bypass\": true,\n      \"android_list\": [\n        \"com.eg.android.AlipayGphone\",\n        \"com.wudaokou.hippo\",\n        \"com.zhihu.android\"\n      ]\n    },\n    \"udpdns\": false\n  }\n]\n```\n"
  },
  {
    "path": ".github/faq.md",
    "content": "### Troubleshooting\n\nCannot connect to server:\n\n1. Stop battery saver if it's active;\n2. Check your config;\n3. Wipe app data.\n\nCrash: [Submit an issue](https://github.com/shadowsocks/shadowsocks-android/issues/new) with logcat attached, or submit a crash report to Google Play. Then, try wiping app data.\n\n### How to create a widget and/or switch profile based on network connectivity?\n\nUse [Tasker](http://tasker.dinglisch.net/) integration.\n\n### Why is NAT mode deprecated?\n\n1. Requiring ROOT permission;\n2. No IPv6 support;\n3. No UDP relay support.\n\n### How to remove the exclamation mark when using VPN mode?\n\nThe exclamation mark in the Wi-Fi/cellular icon appears because the system fails to connect to portal server (defaults to `clients3.google.com`) without VPN connection. To remove it, follow the instructions in [this article](https://www.noisyfox.cn/45.html). (in Simplified Chinese)\n\n### Why is my ROM not supported?\n\n1. Some ROM has broken VPNService implementation, especially for IPv6;\n2. Some ROM has aggressive (or called broken) background service killing policy;\n3. Some ROM like [Flyme](https://github.com/shadowsocks/shadowsocks-android/issues/1821) is basically broken **in every way possible**;\n4. If you have Xposed framework and/or battery saver apps, it's likely that this app wouldn't work well with these either.\n\n* Fixes for MIUI: [#772](https://github.com/shadowsocks/shadowsocks-android/issues/772)\n* Fixes for EMUI: [#888](https://github.com/shadowsocks/shadowsocks-android/issues/888)\n* Fixes for Huawei: [#1091 (comment)](https://github.com/shadowsocks/shadowsocks-android/issues/1091#issuecomment-276949836)\n* Related to Xposed: [#1414](https://github.com/shadowsocks/shadowsocks-android/issues/1414)\n* Samsung and/or Brevent: [#1410](https://github.com/shadowsocks/shadowsocks-android/issues/1410)\n* Another Samsung: [#1712](https://github.com/shadowsocks/shadowsocks-android/issues/1712)\n* Samsung with GMS: [#2138](https://github.com/shadowsocks/shadowsocks-android/issues/2138)\n* Don't install this app on SD card because of permission issues: [#1124 (comment)](https://github.com/shadowsocks/shadowsocks-android/issues/1124#issuecomment-307556453)\n* `INTERACT_ACROSS_USERS` permission missing: [#1184](https://github.com/shadowsocks/shadowsocks-android/issues/1184)\n\n### How to pause Shadowsocks service?\n\n* For Android 7.0+: Use quick switch tile in Quick Settings;\n* Use Tasker integration;\n* Add a profile with per-app proxy enabled for Shadowsocks only, bypass mode off.\n\n### Why does Shadowsocks consume so much battery on Android 5.0+?\n\nAs Shadowsocks takes over the whole device network, any battery used by network activities from other apps are also counted as those from Shadowsocks. So, the battery usage of Shadowsocks equals to the sum of all the network activities of your device. Shadowsocks itself is a totally I/O bound application on modern Android devices, which is expected not to consume any notable battery.\n\nSo if you notice a significant increase in battery usage after you use Shadowsocks, it's most likely caused by other apps. For example, Google Play services can consume more battery after being able to connecting to Google, etc.\n\nMore details: https://kb.adguard.com/en/android/solving-problems/battery\n\n### It works fine under Wi-Fi but can't connect through cellular data?\n\nAllow this app to consume background data in app settings.\n\n### How to use Transproxy mode?\n\n1. Install [AFWall+](https://github.com/ukanth/afwall);\n2. Set custom script:\n```sh\nIP6TABLES=/system/bin/ip6tables\nIPTABLES=/system/bin/iptables\nULIMIT=/system/bin/ulimit\nSHADOWSOCKS_UID=`dumpsys package com.github.shadowsocks | grep userId | cut -d= -f2 - | cut -d' ' -f1 -`\nPORT_DNS=5450\nPORT_TRANSPROXY=8200\n$ULIMIT -n 4096\n$IP6TABLES -F\n$IP6TABLES -A INPUT -j DROP\n$IP6TABLES -A OUTPUT -j DROP\n$IPTABLES -t nat -F OUTPUT\n$IPTABLES -t nat -A OUTPUT -o lo -j RETURN\n$IPTABLES -t nat -A OUTPUT -d 127.0.0.1 -j RETURN\n$IPTABLES -t nat -A OUTPUT -m owner --uid-owner $SHADOWSOCKS_UID -j RETURN\n$IPTABLES -t nat -A OUTPUT -p tcp --dport 53 -j DNAT --to-destination 127.0.0.1:$PORT_DNS\n$IPTABLES -t nat -A OUTPUT -p udp --dport 53 -j DNAT --to-destination 127.0.0.1:$PORT_DNS\n$IPTABLES -t nat -A OUTPUT -p tcp -j DNAT --to-destination 127.0.0.1:$PORT_TRANSPROXY\n$IPTABLES -t nat -A OUTPUT -p udp -j DNAT --to-destination 127.0.0.1:$PORT_TRANSPROXY\n```\n3. Set custom shutdown script:\n```sh\nIP6TABLES=/system/bin/ip6tables\nIPTABLES=/system/bin/iptables\n$IPTABLES -t nat -F OUTPUT\n$IP6TABLES -F\n```\n4. Make sure to allow traffic for Shadowsocks;\n5. Start Shadowsocks transproxy service and enable firewall.\n"
  },
  {
    "path": ".github/faq.ru.md",
    "content": "### Решение проблем\n\nНе получается подключиться к серверу:\n\n1. Выключите режим энергосбережения, если он активен;\n2. Проверьте настройки;\n3. Сотрите данные приложения.\n\nНе работает: [Добавьте отчет](https://github.com/shadowsocks/shadowsocks-android/issues/new) прикрепив лог (logcat), или отправьте отзыв в Google Play. Затем попробуйте стереть данные приложения.\n\n### Как добавить виджет и/или переключать профиль на основании состояния сети?\n\nИспользйте интеграцию с [Tasker](http://tasker.dinglisch.net/).\n\n### Почему режим NAT более не поддерживается?\n\n1. Требуются ROOT права;\n2. Нет поддержки IPv6;\n3. Нет поддержки UDP relay.\n\n### Как убрать восклицательный знак когда используется режим VPN?\n\nВосклицательный знак на значке Wi-Fi/Сотовой связи появляется, потому что система не может подключиться к portal-серверу (по-умолчанию к `clients3.google.com`) без VPN подключения. Чтобы убрать его, следуйте инструкциям в [этом топике](https://www.noisyfox.cn/45.html). (на упрощенном китайском)\n\n### Почему мой ROM не поддерживается?\n\n1. Некоторые ROM используют неправильную реализацию службы VPN, особенно IPv6;\n2. Некоторые ROM используют агрессивную (или так называемую испорченную) неправильную политику остановки фоновых служб;\n3. Некоторые ROM, такие как [Flyme](https://github.com/shadowsocks/shadowsocks-android/issues/1821) просто не работают **в любом случае**;\n4. Если вы используете фреймворк Xposed и/или приложения для энергосбережения, вероятно наше приложение не будет нормально работать с ними.\n\n* Исправления для MIUI: [#772](https://github.com/shadowsocks/shadowsocks-android/issues/772)\n* Исправления для EMUI: [#888](https://github.com/shadowsocks/shadowsocks-android/issues/888)\n* Иправления для Huawei: [#1091 (комментарий)](https://github.com/shadowsocks/shadowsocks-android/issues/1091#issuecomment-276949836)\n* Связанные с Xposed: [#1414](https://github.com/shadowsocks/shadowsocks-android/issues/1414)\n* Samsung и/или Brevent: [#1410](https://github.com/shadowsocks/shadowsocks-android/issues/1410)\n* Ещё Samsung: [#1712](https://github.com/shadowsocks/shadowsocks-android/issues/1712)\n* Не устанавливайте это приложение на SD карту, из-за проблем с разрешениями: [#1124 (комментарий)](https://github.com/shadowsocks/shadowsocks-android/issues/1124#issuecomment-307556453)\n* Отсутствует разрешение `INTERACT_ACROSS_USERS`: [#1184](https://github.com/shadowsocks/shadowsocks-android/issues/1184)\n\n### Как приостановить службу Shadowsocks?\n\n* Для Android 7.0+: Используйте переключатель в быстрых настройках;\n* Используйте интеграцию с Tasker;\n* Добавьте профиль c выбранными приложениями, которые будут работать через Shadowsocks прокси, выключив обходной режим.\n\n### Почему Shadowsocks потребляет так много энергии на Android 5.0+?\n\nТак как Shadowsocks работает со всем траффиком устройства, заряд батареи используемый другими приложениями также считается за тот, что использует Shadowsocks. Таким образом использование батареи Shadowsocks'ом равен сумме всей активности устройства в сети. Shadowsocks сам по себе в общем-то является приложением связанного процесса ввода/вывода на современных Android устройствах, которое, ожидаемо, не потребляет значительного количества энергии.\n\nТак что если вы заметите значительное увеличение потребляемой энергии после того, как вы использовали Shadowsocks, это скорее всего вызванно другими приложениями. Например, сервисы Google Play могут потреблять больше энергии после того, как смогут подключиться к Google, и т.д.\n\nБольше информации: https://kb.adguard.com/en/android/solving-problems/battery\n\n### Оно прекрасно работает при Wi-Fi но не может подключиться через сотовую связь?\n\nРазрешите этому приложению передачу данных в фоновом режиме в настройках приложения.\n\nЕсли у вас оперератор Yota, то увы, но они запрещают P2P-траффик, коим является (или просто определяется фильтрами оператора как P2P-траффик) Shadowsocks. Оператор не будет предпринимать никаких действий для решения данной проблемы.\n\n### Как использовать режим Transproxy (прозрачный прокси)?\n\n1. Установите [AFWall+](https://github.com/ukanth/afwall);\n2. Настройте пользовательский скрипт:\n```sh\nIP6TABLES=/system/bin/ip6tables\nIPTABLES=/system/bin/iptables\nULIMIT=/system/bin/ulimit\nSHADOWSOCKS_UID=`dumpsys package com.github.shadowsocks | grep userId | cut -d= -f2 - | cut -d' ' -f1 -`\nPORT_DNS=5450\nPORT_TRANSPROXY=8200\n$ULIMIT -n 4096\n$IP6TABLES -F\n$IP6TABLES -A INPUT -j DROP\n$IP6TABLES -A OUTPUT -j DROP\n$IPTABLES -t nat -F OUTPUT\n$IPTABLES -t nat -A OUTPUT -o lo -j RETURN\n$IPTABLES -t nat -A OUTPUT -d 127.0.0.1 -j RETURN\n$IPTABLES -t nat -A OUTPUT -m owner --uid-owner $SHADOWSOCKS_UID -j RETURN\n$IPTABLES -t nat -A OUTPUT -p tcp --dport 53 -j DNAT --to-destination 127.0.0.1:$PORT_DNS\n$IPTABLES -t nat -A OUTPUT -p udp --dport 53 -j DNAT --to-destination 127.0.0.1:$PORT_DNS\n$IPTABLES -t nat -A OUTPUT -p tcp -j DNAT --to-destination 127.0.0.1:$PORT_TRANSPROXY\n$IPTABLES -t nat -A OUTPUT -p udp -j DNAT --to-destination 127.0.0.1:$PORT_TRANSPROXY\n```\n3. Настройте пользовательский скрипт отключения:\n```sh\nIP6TABLES=/system/bin/ip6tables\nIPTABLES=/system/bin/iptables\n$IPTABLES -t nat -F OUTPUT\n$IP6TABLES -F\n```\n4. Убедитесь, что траффик для Shadowsocks разрешен;\n5. Запустите службу прозрачного прокси (transproxy) в Shadowsocks и включите брандмауэр.\n"
  },
  {
    "path": ".github/workflows/e2e-test.yml",
    "content": "name: E2E Test\non:\n  push:\n    branches: [master]\n  pull_request:\n  workflow_dispatch:\n\njobs:\n  e2e-test:\n    runs-on: ubuntu-latest\n    timeout-minutes: 45\n    steps:\n      - uses: actions/checkout@v4\n        with:\n          submodules: recursive\n\n      - uses: actions/setup-java@v4\n        with:\n          distribution: jetbrains\n          java-version: 21\n\n      - uses: dtolnay/rust-toolchain@stable\n        with:\n          targets: x86_64-linux-android\n\n      - name: Enable KVM\n        run: |\n          echo 'KERNEL==\"kvm\", GROUP=\"kvm\", MODE=\"0666\", OPTIONS+=\"static_node=kvm\"' \\\n            | sudo tee /etc/udev/rules.d/99-kvm4all.rules\n          sudo udevadm control --reload-rules\n          sudo udevadm trigger --name-match=kvm\n\n      - name: Gradle cache\n        uses: actions/cache@v4\n        with:\n          path: |\n            ~/.gradle/caches\n            ~/.gradle/wrapper\n          key: gradle-${{ hashFiles('**/*.gradle*', 'gradle/wrapper/gradle-wrapper.properties') }}\n\n      - name: Cargo cache\n        uses: actions/cache@v4\n        with:\n          path: |\n            ~/.cargo/registry\n            ~/.cargo/git\n            core/src/main/rust/shadowsocks-rust/target\n          key: cargo-${{ hashFiles('core/src/main/rust/shadowsocks-rust/Cargo.lock') }}\n\n      - name: Build debug APK (x86_64)\n        run: ./gradlew assembleDebug -PCARGO_PROFILE=debug -PTARGET_ABI=x86_64\n\n      - name: Build ssserver\n        run: |\n          cd core/src/main/rust/shadowsocks-rust\n          cargo build --release --bin ssserver --features \"server,aead-cipher,logging\"\n\n      - name: E2E Test\n        uses: ReactiveCircus/android-emulator-runner@v2\n        with:\n          api-level: 34\n          target: google_apis\n          arch: x86_64\n          force-avd-creation: true\n          emulator-options: >-\n            -no-snapshot-save -no-window -gpu swiftshader_indirect\n            -noaudio -no-boot-anim\n          disable-animations: true\n          script: bash test-e2e.sh\n        env:\n          SKIP_EMULATOR_BOOT: \"true\"\n          ADB: adb\n          APK: ${{ github.workspace }}/mobile/build/outputs/apk/debug/mobile-x86_64-debug.apk\n          SSSERVER: ${{ github.workspace }}/core/src/main/rust/shadowsocks-rust/target/release/ssserver\n\n      - name: Upload screenshots\n        uses: actions/upload-artifact@v4\n        if: always()\n        with:\n          name: e2e-screenshots\n          path: screen_*.png\n"
  },
  {
    "path": ".gitignore",
    "content": "# Gradle & Android Studio\nlocal.properties\n.gradle/\n.externalNativeBuild/\nbuild/\ncaptures/\nrelease/\n\n.idea/\n*.iml\n\n# release apks\n*.apk\n.DS_Store\n"
  },
  {
    "path": ".gitmodules",
    "content": "[submodule \"core/src/main/jni/badvpn\"]\n\tpath = core/src/main/jni/badvpn\n\turl = https://github.com/shadowsocks/badvpn.git\n\tbranch = shadowsocks-android\n[submodule \"core/src/main/jni/libancillary\"]\n\tpath = core/src/main/jni/libancillary\n\turl = https://github.com/shadowsocks/libancillary.git\n\tbranch = shadowsocks-android\n[submodule \"core/src/main/jni/libevent\"]\n\tpath = core/src/main/jni/libevent\n\turl = https://github.com/shadowsocks/libevent.git\n\tbranch = shadowsocks-android\n[submodule \"core/src/main/jni/redsocks\"]\n\tpath = core/src/main/jni/redsocks\n\turl = https://github.com/shadowsocks/redsocks.git\n\tbranch = shadowsocks-android\n[submodule \"core/src/main/rust/shadowsocks-rust\"]\n\tpath = core/src/main/rust/shadowsocks-rust\n\turl = https://github.com/shadowsocks/shadowsocks-rust.git\n"
  },
  {
    "path": ".travis.yml",
    "content": "sudo: required\n\naddons:\n    artifacts: true\n\nservices:\n    - docker\n\nbefore_install:\n    - docker pull circleci/android:api-28-ndk\n    - chmod -R a+wrx .\n\nscript:\n    - docker run --rm -v ${PWD}:/build circleci/android:api-28-ndk bash -c \"cd /build; ./gradlew assembleDebug check\"\n"
  },
  {
    "path": "AUTHORS",
    "content": "Shadowsocks-android was originally created in late 2013, by\nMax Lv <max.c.lv@gmail.com>.\n\nHere is an inevitably incomplete list of MUCH-APPRECIATED CONTRIBUTORS --\npeople who have submitted patches, fixed bugs, added translations, and\ngenerally made shadowsocks-android that much better:\n\nhttps://github.com/shadowsocks/shadowsocks-android/graphs/contributors\n"
  },
  {
    "path": "CONTRIBUTING.md",
    "content": "# Submitting Issues\n\n* Issues can be submitted in two different places:\n    1) [The GitHub issue log](https://github.com/shadowsocks/shadowsocks-android/issues)\n    2) [The Shadowsocks.org Discourse Forum](https://discourse.shadowsocks.org/c/implementations/shadowsocks-android)\n* Please search for your issues in both places before submitting new issues.\n* If you have any questions, please check the [FAQ](https://github.com/shadowsocks/shadowsocks-android/blob/master/.github/faq.md) and the questions submitted at the [Discourse Forum](https://discourse.shadowsocks.org/c/implementations/shadowsocks-android).\n* General discussions should go to the [Discourse Forum](https://discourse.shadowsocks.org/c/implementations/shadowsocks-android).\n* Always provide information asked in the template unless you know what you're doing.\n* Utilizing Logcat would also be helpful.\n"
  },
  {
    "path": "LICENSE",
    "content": "\nCopyright (C) 2017 by Max Lv <max.c.lv@gmail.com>\nCopyright (C) 2017 by Mygod Studio <contact-shadowsocks-android@mygod.be>\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU General Public License as published by\nthe Free Software Foundation, either version 3 of the License, or\n(at your option) any later version.\n\nThis program is distributed in the hope that it will be useful,\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\nGNU General Public License for more details.\n\nYou should have received a copy of the GNU General Public License\nalong with this program. If not, see <http://www.gnu.org/licenses/>.\n\n"
  },
  {
    "path": "README.md",
    "content": "## [Shadowsocks](https://shadowsocks.org) for Android\n\n[![CircleCI](https://circleci.com/gh/shadowsocks/shadowsocks-android.svg?style=shield)](https://circleci.com/gh/shadowsocks/shadowsocks-android)\n[![API](https://img.shields.io/badge/API-23%2B-brightgreen.svg?style=flat)](https://android-arsenal.com/api?level=23)\n[![Releases](https://img.shields.io/github/downloads/shadowsocks/shadowsocks-android/total.svg)](https://github.com/shadowsocks/shadowsocks-android/releases)\n[![Language: Kotlin](https://img.shields.io/github/languages/top/shadowsocks/shadowsocks-android.svg)](https://github.com/shadowsocks/shadowsocks-android/search?l=kotlin)\n[![Codacy Badge](https://app.codacy.com/project/badge/Grade/22ca240f272445548e332a42d5a20d95)](https://www.codacy.com/gh/shadowsocks/shadowsocks-android/dashboard?utm_source=github.com&amp;utm_medium=referral&amp;utm_content=shadowsocks/shadowsocks-android&amp;utm_campaign=Badge_Grade)\n[![License: GPL-3.0](https://img.shields.io/badge/license-GPL--3.0-orange.svg)](https://www.gnu.org/licenses/gpl-3.0)\n\n<a href=\"https://play.google.com/store/apps/details?id=com.github.shadowsocks\"><img src=\"https://play.google.com/intl/en_us/badges/images/generic/en-play-badge.png\" height=\"48\"></a>\nfor Android & Chrome OS ([beta](https://play.google.com/apps/testing/com.github.shadowsocks))  \n<a href=\"https://play.google.com/store/apps/details?id=com.github.shadowsocks.tv\"><img src=\"https://play.google.com/intl/en_us/badges/images/generic/en-play-badge.png\" height=\"48\"></a>\nfor Android TV ([beta](https://play.google.com/apps/testing/com.github.shadowsocks.tv))\n\n\n### PREREQUISITES\n\n* JDK 11+\n* Android SDK\n  - Android NDK\n* Rust with Android targets installed using `rustup target add armv7-linux-androideabi aarch64-linux-android i686-linux-android x86_64-linux-android`\n\n### BUILD\n\nYou can check whether the latest commit builds under UNIX environment by checking Travis status.\n\n* Install prerequisites\n* Clone the repo using `git clone --recurse-submodules <repo>` or update submodules using `git submodule update --init --recursive`\n* Build it using Android Studio or gradle script\n\n### CONTRIBUTING\n\nIf you are interested in contributing or getting involved with this project, please read the CONTRIBUTING page for more information.  The page can be found [here](https://github.com/shadowsocks/shadowsocks-android/blob/master/CONTRIBUTING.md).\n\n\n### [TRANSLATE](https://discourse.shadowsocks.org/t/poeditor-translation-main-thread/30)\n\n## OPEN SOURCE LICENSES\n\n<ul>\n    <li>redsocks: <a href=\"https://github.com/shadowsocks/redsocks/blob/shadowsocks-android/README\">APL 2.0</a></li>\n    <li>libevent: <a href=\"https://github.com/shadowsocks/libevent/blob/master/LICENSE\">BSD</a></li>\n    <li>tun2socks: <a href=\"https://github.com/shadowsocks/badvpn/blob/shadowsocks-android/COPYING\">BSD</a></li>\n    <li>shadowsocks-rust: <a href=\"https://github.com/shadowsocks/shadowsocks-rust/blob/master/LICENSE\">MIT</a></li>\n    <li>libsodium: <a href=\"https://github.com/jedisct1/libsodium/blob/master/LICENSE\">ISC</a></li>\n    <li>OpenSSL: <a href=\"https://www.openssl.org/source/license-openssl-ssleay.txt\">OpenSSL License</a></li>\n</ul>\n\n\n### LICENSE\n\nCopyright (C) 2017 by Max Lv <<max.c.lv@gmail.com>>  \nCopyright (C) 2017 by Mygod Studio <<contact-shadowsocks-android@mygod.be>>\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU General Public License as published by\nthe Free Software Foundation, either version 3 of the License, or\n(at your option) any later version.\n\nThis program is distributed in the hope that it will be useful,\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\nGNU General Public License for more details.\n\nYou should have received a copy of the GNU General Public License\nalong with this program. If not, see <http://www.gnu.org/licenses/>.\n"
  },
  {
    "path": "build.gradle.kts",
    "content": "// Top-level build file where you can add configuration options common to all sub-projects/modules.\n\nplugins {\n    alias(libs.plugins.versions)\n    alias(libs.plugins.ksp) apply false\n}\n\nbuildscript {\n    apply(from = \"repositories.gradle.kts\")\n\n    repositories {\n        google()\n        mavenCentral()\n        gradlePluginPortal()\n    }\n\n    dependencies {\n        classpath(libs.android.gradle)\n        classpath(libs.dokka)\n        classpath(libs.firebase.crashlytics.gradle)\n        classpath(libs.google.oss.licenses)\n        classpath(libs.google.services)\n        classpath(libs.gradle.maven.publish)\n        classpath(libs.kotlin.gradle)\n        classpath(libs.rust.android)\n    }\n}\n\nallprojects {\n    apply(from = \"${rootProject.projectDir}/repositories.gradle.kts\")\n}\n\n// skip uploading the mapping to Crashlytics\nsubprojects {\n    tasks.whenTaskAdded {\n        if (name.contains(\"uploadCrashlyticsMappingFile\")) enabled = false\n    }\n}\n"
  },
  {
    "path": "buildSrc/build.gradle.kts",
    "content": "plugins {\n    `kotlin-dsl`\n}\n\napply(from = \"../repositories.gradle.kts\")\n\ndependencies {\n    implementation(libs.android.gradle)\n    implementation(libs.kotlin.gradle)\n}\n"
  },
  {
    "path": "buildSrc/settings.gradle.kts",
    "content": "dependencyResolutionManagement {\n    versionCatalogs {\n        create(\"libs\") {\n            from(files(\"../gradle/libs.versions.toml\"))\n        }\n    }\n}\n"
  },
  {
    "path": "buildSrc/src/main/kotlin/Helpers.kt",
    "content": "import com.android.build.api.dsl.CommonExtension\nimport com.android.build.gradle.BaseExtension\nimport org.gradle.api.JavaVersion\nimport org.gradle.api.Project\nimport org.gradle.kotlin.dsl.dependencies\nimport org.gradle.kotlin.dsl.getByName\nimport org.jetbrains.kotlin.gradle.dsl.JvmTarget\nimport org.jetbrains.kotlin.gradle.dsl.KotlinAndroidProjectExtension\n\nprivate val Project.android get() = extensions.getByName<BaseExtension>(\"android\")\nprivate val BaseExtension.lint get() = (this as CommonExtension<*, *, *, *, *, *>).lint\n\nval Project.currentFlavor get() = gradle.startParameter.taskNames.let { tasks ->\n    when {\n        tasks.any { it.contains(\"Release\", ignoreCase = true) } -> \"release\"\n        tasks.any { it.contains(\"Debug\", ignoreCase = true) } -> \"debug\"\n        else -> \"debug\".also {\n            println(\"Warning: No match found for $tasks\")\n        }\n    }\n}\n\nfun Project.setupCommon() {\n    val javaVersion = JavaVersion.VERSION_11\n    android.apply {\n        compileSdkVersion(36)\n        defaultConfig {\n            minSdk = 23\n            targetSdk = 36\n            testInstrumentationRunner = \"androidx.test.runner.AndroidJUnitRunner\"\n        }\n        compileOptions {\n            sourceCompatibility = javaVersion\n            targetCompatibility = javaVersion\n        }\n        lint.apply {\n            warning += \"ExtraTranslation\"\n            warning += \"ImpliedQuantity\"\n            informational += \"MissingQuantity\"\n            informational += \"MissingTranslation\"\n        }\n    }\n    extensions.getByName<KotlinAndroidProjectExtension>(\"kotlin\").compilerOptions.jvmTarget\n        .set(JvmTarget.fromTarget(javaVersion.toString()))\n}\n\nfun Project.setupCore() {\n    setupCommon()\n    android.apply {\n        defaultConfig {\n            versionCode = 5030550\n            versionName = \"5.3.5-nightly\"\n        }\n        compileOptions.isCoreLibraryDesugaringEnabled = true\n        lint.apply {\n            disable += \"BadConfigurationProvider\"\n            warning += \"RestrictedApi\"\n            disable += \"UseAppTint\"\n        }\n        buildFeatures.buildConfig = true\n    }\n}\n\nfun Project.setupApp() {\n    setupCore()\n\n    android.apply {\n        defaultConfig.resourceConfigurations.addAll(listOf(\n            \"ar\",\n            \"de\",\n            \"es\",\n            \"fa\",\n            \"fr\",\n            \"ja\",\n            \"ko\",\n            \"ru\",\n            \"tr\",\n            \"uk\",\n            \"zh-rCN\",\n            \"zh-rTW\",\n        ))\n        buildTypes {\n            getByName(\"debug\") {\n                isPseudoLocalesEnabled = true\n                packagingOptions.doNotStrip(\"**/libsslocal.so\")\n            }\n            getByName(\"release\") {\n                isShrinkResources = true\n                isMinifyEnabled = true\n                proguardFile(getDefaultProguardFile(\"proguard-android.txt\"))\n            }\n        }\n        lint.disable += \"RemoveWorkManagerInitializer\"\n        packagingOptions.jniLibs.useLegacyPackaging = true\n        splits.abi {\n            isEnable = true\n            isUniversalApk = true\n        }\n    }\n\n    dependencies.add(\"implementation\", project(\":core\"))\n}\n"
  },
  {
    "path": "core/.gitignore",
    "content": "/build\n/.cxx/\n"
  },
  {
    "path": "core/build.gradle.kts",
    "content": "import com.android.build.gradle.internal.tasks.factory.dependsOn\n\nplugins {\n    id(\"com.android.library\")\n    id(\"com.google.devtools.ksp\")\n    id(\"org.mozilla.rust-android-gradle.rust-android\")\n    kotlin(\"android\")\n    id(\"kotlin-parcelize\")\n}\n\nsetupCore()\n\nval allAbis = mapOf(\"arm\" to \"armeabi-v7a\", \"arm64\" to \"arm64-v8a\", \"x86\" to \"x86\", \"x86_64\" to \"x86_64\")\nval targetAbi = findProperty(\"TARGET_ABI\")?.toString()\n\nandroid {\n    namespace = \"com.github.shadowsocks.core\"\n\n    defaultConfig {\n        consumerProguardFiles(\"proguard-rules.pro\")\n\n        externalNativeBuild.ndkBuild {\n            val abis = if (targetAbi != null) listOf(allAbis.getValue(targetAbi)) else allAbis.values.toList()\n            abiFilters(*abis.toTypedArray())\n            arguments(\"-j${Runtime.getRuntime().availableProcessors()}\")\n        }\n\n        ksp {\n            arg(\"room.incremental\", \"true\")\n            arg(\"room.schemaLocation\", \"$projectDir/schemas\")\n        }\n    }\n\n    externalNativeBuild.ndkBuild.path(\"src/main/jni/Android.mk\")\n\n    sourceSets.getByName(\"androidTest\") {\n        assets.setSrcDirs(assets.srcDirs + files(\"$projectDir/schemas\"))\n    }\n\n    buildFeatures.aidl = true\n}\n\ncargo {\n    module = \"src/main/rust/shadowsocks-rust\"\n    libname = \"sslocal\"\n    targets = if (targetAbi != null) listOf(targetAbi) else listOf(\"arm\", \"arm64\", \"x86\", \"x86_64\")\n    profile = findProperty(\"CARGO_PROFILE\")?.toString() ?: currentFlavor\n    extraCargoBuildArguments = listOf(\"--bin\", libname!!)\n    featureSpec.noDefaultBut(arrayOf(\n        \"stream-cipher\",\n        \"aead-cipher-extra\",\n        \"logging\",\n        \"local-flow-stat\",\n        \"local-dns\",\n        \"aead-cipher-2022\",\n    ))\n    exec = { spec, toolchain ->\n        run {\n            try {\n                Runtime.getRuntime().exec(arrayOf(\"python3\", \"-V\"))\n                spec.environment(\"RUST_ANDROID_GRADLE_PYTHON_COMMAND\", \"python3\")\n                project.logger.lifecycle(\"Python 3 detected.\")\n            } catch (e: java.io.IOException) {\n                project.logger.lifecycle(\"No python 3 detected.\")\n                try {\n                    Runtime.getRuntime().exec(arrayOf(\"python\", \"-V\"))\n                    spec.environment(\"RUST_ANDROID_GRADLE_PYTHON_COMMAND\", \"python\")\n                    project.logger.lifecycle(\"Python detected.\")\n                } catch (e: java.io.IOException) {\n                    throw GradleException(\"No any python version detected. You should install the python first to compile project.\")\n                }\n            }\n            // https://developer.android.com/guide/practices/page-sizes#other-build-systems\n            spec.environment(\"RUST_ANDROID_GRADLE_CC_LINK_ARG\", \"-Wl,-z,max-page-size=16384,-soname,lib$libname.so\")\n            spec.environment(\"RUST_ANDROID_GRADLE_LINKER_WRAPPER_PY\", \"$projectDir/$module/../linker-wrapper.py\")\n            spec.environment(\"RUST_ANDROID_GRADLE_TARGET\", \"target/${toolchain.target}/$profile/lib$libname.so\")\n        }\n    }\n}\n\ntasks.whenTaskAdded {\n    when (name) {\n        \"mergeDebugJniLibFolders\", \"mergeReleaseJniLibFolders\" -> {\n            dependsOn(\"cargoBuild\")\n            inputs.dir(layout.buildDirectory.dir(\"rustJniLibs/android\"))\n        }\n    }\n}\n\ntasks.register<Exec>(\"cargoClean\") {\n    executable(\"cargo\")     // cargo.cargoCommand\n    args(\"clean\")\n    workingDir(\"$projectDir/${cargo.module}\")\n}\ntasks.clean.dependsOn(\"cargoClean\")\n\ndependencies {\n    api(project(\":plugin\"))\n    api(libs.androidx.core.ktx)\n    api(libs.androidx.lifecycle.livedata.core.ktx)\n    api(libs.androidx.preference)\n    api(libs.androidx.room.runtime)\n    api(libs.androidx.work.multiprocess)\n    api(libs.androidx.work.runtime.ktx)\n    api(libs.dnsjava)\n    api(libs.firebase.analytics)\n    api(libs.firebase.crashlytics)\n    api(libs.kotlinx.coroutines.android)\n    api(libs.kotlinx.coroutines.play.services)\n    api(libs.material)\n    api(libs.play.services.oss.licenses)\n    api(libs.timber)\n    coreLibraryDesugaring(libs.desugar)\n    ksp(libs.androidx.room.compiler)\n    testImplementation(libs.junit)\n    androidTestImplementation(libs.androidx.espresso.core)\n    androidTestImplementation(libs.androidx.junit.ktx)\n    androidTestImplementation(libs.androidx.room.testing)\n    androidTestImplementation(libs.androidx.test.runner)\n}\n"
  },
  {
    "path": "core/gfwlist/gen.pl",
    "content": "#!/usr/bin/env perl\n## ArchLinux install package via pacman: perl-net-cidr-lite\nuse strict;\nuse warnings;\nuse Net::CIDR::Lite;\nmy $cidr = Net::CIDR::Lite->new;\nwhile (my $line=<>) {\n    $cidr->add($line);\n}\nforeach my $line( @{$cidr->list} ) {\n    print \"<item>$line</item>\\n\";\n}\n"
  },
  {
    "path": "core/gfwlist/gen.py",
    "content": "#!/usr/bin/python\n# -*- encoding: utf8 -*-\n\nimport sys\n\nimport IPy\n\n\ndef main():\n    china_list_set = IPy.IPSet()\n    for line in sys.stdin:\n        china_list_set.add(IPy.IP(line))\n\n    # 输出结果\n    for ip in china_list_set:\n        print '<item>' + str(ip) + '</item>'\n\n\nif __name__ == \"__main__\":\n    main()\n"
  },
  {
    "path": "core/gfwlist/parse.py",
    "content": "#!/usr/bin/python\n# -*- coding: utf-8 -*-\n\nimport pkgutil\nimport urlparse\nimport socket\nimport logging\nfrom argparse import ArgumentParser\nfrom datetime import date\n\n__all__ = ['main']\n\n\ndef parse_args():\n    parser = ArgumentParser()\n    parser.add_argument('-i', '--input', dest='input', required=True,\n                      help='path to gfwlist', metavar='GFWLIST')\n    parser.add_argument('-f', '--file', dest='output', required=True,\n                      help='path to output acl', metavar='ACL')\n    return parser.parse_args()\n\n\ndef decode_gfwlist(content):\n    # decode base64 if have to\n    try:\n        return content.decode('base64')\n    except:\n        return content\n\n\ndef get_hostname(something):\n    try:\n        # quite enough for GFW\n        if not something.startswith('http:'):\n            something = 'http://' + something\n        r = urlparse.urlparse(something)\n        return r.hostname\n    except Exception as e:\n        logging.error(e) \n        return None\n\n\ndef add_domain_to_set(s, something):\n    hostname = get_hostname(something)\n    if hostname is not None:\n        if hostname.startswith('.'):\n            hostname = hostname.lstrip('.')\n        if hostname.endswith('/'):\n            hostname = hostname.rstrip('/')\n        if hostname:\n            s.add(hostname)\n\n\ndef parse_gfwlist(content):\n    gfwlist = content.splitlines(False)\n    domains = set()\n    for line in gfwlist:\n        if line.find('.*') >= 0:\n            continue\n        elif line.find('*') >= 0:\n            line = line.replace('*', '/')\n        if line.startswith('!'):\n            continue\n        elif line.startswith('['):\n            continue\n        elif line.startswith('@'):\n            # ignore white list\n            continue\n        elif line.startswith('||'):\n            add_domain_to_set(domains, line.lstrip('||'))\n        elif line.startswith('|'):\n            add_domain_to_set(domains, line.lstrip('|'))\n        elif line.startswith('.'):\n            add_domain_to_set(domains, line.lstrip('.'))\n        else:\n            add_domain_to_set(domains, line)\n    # TODO: reduce ['www.google.com', 'google.com'] to ['google.com']\n    return domains\n\n\ndef generate_acl(domains):\n    header =\"\"\"#\n# GFW list from https://github.com/gfwlist/gfwlist/blob/master/gfwlist.txt\n# updated on DATE\n#\n\n[bypass_all]\n\n[proxy_list]\n\n\"\"\"\n    header = header.replace('DATE', str(date.today()))\n    proxy_content = \"\"\n    ip_content = \"\"\n\n    for domain in sorted(domains):\n        try:\n            socket.inet_aton(domain)\n            ip_content += (domain + \"\\n\")\n        except socket.error:\n            domain = domain.replace('.', '\\.')\n            proxy_content += ('(?:^|\\.)' + domain + '$\\n')\n\n    proxy_content = header + ip_content + proxy_content\n\n    return proxy_content\n\n\ndef main():\n    args = parse_args()\n    with open(args.input, 'rb') as f:\n        content = f.read()\n    content = decode_gfwlist(content)\n    domains = parse_gfwlist(content)\n    acl_content = generate_acl(domains)\n    with open(args.output, 'wb') as f:\n        f.write(acl_content)\n\nif __name__ == '__main__':\n    main()\n\n"
  },
  {
    "path": "core/proguard-rules.pro",
    "content": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguardFiles setting in build.gradle.\n#\n# For more details, see\n#   http://developer.android.com/guide/developing/tools/proguard.html\n\n# If your project uses WebView with JS, uncomment the following\n# and specify the fully qualified class name to the JavaScript interface\n# class:\n#-keepclassmembers class fqcn.of.javascript.interface.for.webview {\n#   public *;\n#}\n\n# Uncomment this to preserve the line number information for\n# debugging stack traces.\n-keepattributes SourceFile,LineNumberTable\n-dontobfuscate\n\n-dontwarn lombok.Generated\n-dontwarn org.slf4j.impl.StaticLoggerBinder\n-dontwarn org.xbill.DNS.spi.DnsjavaInetAddressResolverProvider\n-dontwarn sun.net.spi.nameservice.NameServiceDescriptor\n\n# If you keep the line number information, uncomment this to\n# hide the original source file name.\n#-renamesourcefileattribute SourceFile\n"
  },
  {
    "path": "core/schemas/com.github.shadowsocks.database.PrivateDatabase/26.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 26,\n    \"identityHash\": \"a69accf94393d71abdb60873d4ea74a2\",\n    \"entities\": [\n      {\n        \"tableName\": \"Profile\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `name` TEXT, `host` TEXT NOT NULL, `remotePort` INTEGER NOT NULL, `password` TEXT NOT NULL, `method` TEXT NOT NULL, `route` TEXT NOT NULL, `remoteDns` TEXT NOT NULL, `proxyApps` INTEGER NOT NULL, `bypass` INTEGER NOT NULL, `udpdns` INTEGER NOT NULL, `ipv6` INTEGER NOT NULL, `individual` TEXT NOT NULL, `tx` INTEGER NOT NULL, `rx` INTEGER NOT NULL, `userOrder` INTEGER NOT NULL, `plugin` TEXT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"remotePort\",\n            \"columnName\": \"remotePort\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"password\",\n            \"columnName\": \"password\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"method\",\n            \"columnName\": \"method\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"route\",\n            \"columnName\": \"route\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"remoteDns\",\n            \"columnName\": \"remoteDns\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"proxyApps\",\n            \"columnName\": \"proxyApps\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bypass\",\n            \"columnName\": \"bypass\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"udpdns\",\n            \"columnName\": \"udpdns\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"ipv6\",\n            \"columnName\": \"ipv6\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"individual\",\n            \"columnName\": \"individual\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"tx\",\n            \"columnName\": \"tx\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"rx\",\n            \"columnName\": \"rx\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userOrder\",\n            \"columnName\": \"userOrder\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"plugin\",\n            \"columnName\": \"plugin\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"KeyValuePair\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`key` TEXT NOT NULL, `valueType` INTEGER NOT NULL, `value` BLOB NOT NULL, PRIMARY KEY(`key`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"key\",\n            \"columnName\": \"key\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"valueType\",\n            \"columnName\": \"valueType\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"value\",\n            \"columnName\": \"value\",\n            \"affinity\": \"BLOB\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"key\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      }\n    ],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, \\\"a69accf94393d71abdb60873d4ea74a2\\\")\"\n    ]\n  }\n}"
  },
  {
    "path": "core/schemas/com.github.shadowsocks.database.PrivateDatabase/27.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 27,\n    \"identityHash\": \"8743c2e56bdbdabca7fcb89dff5434ba\",\n    \"entities\": [\n      {\n        \"tableName\": \"Profile\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `name` TEXT, `host` TEXT NOT NULL, `remotePort` INTEGER NOT NULL, `password` TEXT NOT NULL, `method` TEXT NOT NULL, `route` TEXT NOT NULL, `remoteDns` TEXT NOT NULL, `proxyApps` INTEGER NOT NULL, `bypass` INTEGER NOT NULL, `udpdns` INTEGER NOT NULL, `ipv6` INTEGER NOT NULL, `individual` TEXT NOT NULL, `tx` INTEGER NOT NULL, `rx` INTEGER NOT NULL, `userOrder` INTEGER NOT NULL, `plugin` TEXT, `udpFallback` INTEGER)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"remotePort\",\n            \"columnName\": \"remotePort\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"password\",\n            \"columnName\": \"password\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"method\",\n            \"columnName\": \"method\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"route\",\n            \"columnName\": \"route\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"remoteDns\",\n            \"columnName\": \"remoteDns\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"proxyApps\",\n            \"columnName\": \"proxyApps\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bypass\",\n            \"columnName\": \"bypass\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"udpdns\",\n            \"columnName\": \"udpdns\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"ipv6\",\n            \"columnName\": \"ipv6\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"individual\",\n            \"columnName\": \"individual\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"tx\",\n            \"columnName\": \"tx\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"rx\",\n            \"columnName\": \"rx\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userOrder\",\n            \"columnName\": \"userOrder\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"plugin\",\n            \"columnName\": \"plugin\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"udpFallback\",\n            \"columnName\": \"udpFallback\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"KeyValuePair\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`key` TEXT NOT NULL, `valueType` INTEGER NOT NULL, `value` BLOB NOT NULL, PRIMARY KEY(`key`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"key\",\n            \"columnName\": \"key\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"valueType\",\n            \"columnName\": \"valueType\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"value\",\n            \"columnName\": \"value\",\n            \"affinity\": \"BLOB\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"key\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      }\n    ],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, \\\"8743c2e56bdbdabca7fcb89dff5434ba\\\")\"\n    ]\n  }\n}"
  },
  {
    "path": "core/schemas/com.github.shadowsocks.database.PrivateDatabase/28.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 28,\n    \"identityHash\": \"b60ecca4d684ffe73173478bffd50a17\",\n    \"entities\": [\n      {\n        \"tableName\": \"Profile\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `name` TEXT, `host` TEXT NOT NULL, `remotePort` INTEGER NOT NULL, `password` TEXT NOT NULL, `method` TEXT NOT NULL, `route` TEXT NOT NULL, `remoteDns` TEXT NOT NULL, `proxyApps` INTEGER NOT NULL, `bypass` INTEGER NOT NULL, `udpdns` INTEGER NOT NULL, `ipv6` INTEGER NOT NULL, `metered` INTEGER NOT NULL, `individual` TEXT NOT NULL, `tx` INTEGER NOT NULL, `rx` INTEGER NOT NULL, `userOrder` INTEGER NOT NULL, `plugin` TEXT, `udpFallback` INTEGER)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"remotePort\",\n            \"columnName\": \"remotePort\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"password\",\n            \"columnName\": \"password\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"method\",\n            \"columnName\": \"method\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"route\",\n            \"columnName\": \"route\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"remoteDns\",\n            \"columnName\": \"remoteDns\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"proxyApps\",\n            \"columnName\": \"proxyApps\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bypass\",\n            \"columnName\": \"bypass\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"udpdns\",\n            \"columnName\": \"udpdns\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"ipv6\",\n            \"columnName\": \"ipv6\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"metered\",\n            \"columnName\": \"metered\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"individual\",\n            \"columnName\": \"individual\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"tx\",\n            \"columnName\": \"tx\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"rx\",\n            \"columnName\": \"rx\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userOrder\",\n            \"columnName\": \"userOrder\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"plugin\",\n            \"columnName\": \"plugin\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"udpFallback\",\n            \"columnName\": \"udpFallback\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"KeyValuePair\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`key` TEXT NOT NULL, `valueType` INTEGER NOT NULL, `value` BLOB NOT NULL, PRIMARY KEY(`key`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"key\",\n            \"columnName\": \"key\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"valueType\",\n            \"columnName\": \"valueType\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"value\",\n            \"columnName\": \"value\",\n            \"affinity\": \"BLOB\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"key\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      }\n    ],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, \\\"b60ecca4d684ffe73173478bffd50a17\\\")\"\n    ]\n  }\n}"
  },
  {
    "path": "core/schemas/com.github.shadowsocks.database.PrivateDatabase/29.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 29,\n    \"identityHash\": \"5b5c55a1277c63e14416316f9198ed43\",\n    \"entities\": [\n      {\n        \"tableName\": \"Profile\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `name` TEXT, `host` TEXT NOT NULL, `remotePort` INTEGER NOT NULL, `password` TEXT NOT NULL, `method` TEXT NOT NULL, `route` TEXT NOT NULL, `remoteDns` TEXT NOT NULL, `proxyApps` INTEGER NOT NULL, `bypass` INTEGER NOT NULL, `udpdns` INTEGER NOT NULL, `ipv6` INTEGER NOT NULL, `metered` INTEGER NOT NULL, `individual` TEXT NOT NULL, `plugin` TEXT, `udpFallback` INTEGER, `subscription` INTEGER NOT NULL, `tx` INTEGER NOT NULL, `rx` INTEGER NOT NULL, `userOrder` INTEGER NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"remotePort\",\n            \"columnName\": \"remotePort\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"password\",\n            \"columnName\": \"password\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"method\",\n            \"columnName\": \"method\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"route\",\n            \"columnName\": \"route\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"remoteDns\",\n            \"columnName\": \"remoteDns\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"proxyApps\",\n            \"columnName\": \"proxyApps\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bypass\",\n            \"columnName\": \"bypass\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"udpdns\",\n            \"columnName\": \"udpdns\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"ipv6\",\n            \"columnName\": \"ipv6\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"metered\",\n            \"columnName\": \"metered\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"individual\",\n            \"columnName\": \"individual\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"plugin\",\n            \"columnName\": \"plugin\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"udpFallback\",\n            \"columnName\": \"udpFallback\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"subscription\",\n            \"columnName\": \"subscription\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"tx\",\n            \"columnName\": \"tx\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"rx\",\n            \"columnName\": \"rx\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userOrder\",\n            \"columnName\": \"userOrder\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"KeyValuePair\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`key` TEXT NOT NULL, `valueType` INTEGER NOT NULL, `value` BLOB NOT NULL, PRIMARY KEY(`key`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"key\",\n            \"columnName\": \"key\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"valueType\",\n            \"columnName\": \"valueType\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"value\",\n            \"columnName\": \"value\",\n            \"affinity\": \"BLOB\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"key\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      }\n    ],\n    \"views\": [],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '5b5c55a1277c63e14416316f9198ed43')\"\n    ]\n  }\n}"
  },
  {
    "path": "core/schemas/com.github.shadowsocks.database.PublicDatabase/3.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 3,\n    \"identityHash\": \"f1aab1fb633378621635c344dbc8ac7b\",\n    \"entities\": [\n      {\n        \"tableName\": \"KeyValuePair\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`key` TEXT NOT NULL, `valueType` INTEGER NOT NULL, `value` BLOB NOT NULL, PRIMARY KEY(`key`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"key\",\n            \"columnName\": \"key\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"valueType\",\n            \"columnName\": \"valueType\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"value\",\n            \"columnName\": \"value\",\n            \"affinity\": \"BLOB\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"key\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      }\n    ],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, \\\"f1aab1fb633378621635c344dbc8ac7b\\\")\"\n    ]\n  }\n}"
  },
  {
    "path": "core/src/androidTest/java/com/github/shadowsocks/acl/AclTest.kt",
    "content": "/*******************************************************************************\n *                                                                             *\n *  Copyright (C) 2017 by Max Lv <max.c.lv@gmail.com>                          *\n *  Copyright (C) 2017 by Mygod Studio <contact-shadowsocks-android@mygod.be>  *\n *                                                                             *\n *  This program is free software: you can redistribute it and/or modify       *\n *  it under the terms of the GNU General Public License as published by       *\n *  the Free Software Foundation, either version 3 of the License, or          *\n *  (at your option) any later version.                                        *\n *                                                                             *\n *  This program is distributed in the hope that it will be useful,            *\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of             *\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the              *\n *  GNU General Public License for more details.                               *\n *                                                                             *\n *  You should have received a copy of the GNU General Public License          *\n *  along with this program. If not, see <http://www.gnu.org/licenses/>.       *\n *                                                                             *\n *******************************************************************************/\n\npackage com.github.shadowsocks.acl\n\nimport org.junit.Assert\nimport org.junit.Test\n\nclass AclTest {\n    companion object {\n        const val BYPASS_BASE = \"\"\"[bypass_all]\n[proxy_list]\"\"\"\n        const val INPUT1 = \"\"\"$BYPASS_BASE\n1.0.1.0/24\n2000::/8\n(?:^|\\.)4tern\\.com$\n\"\"\"\n        const val INPUT2 = \"\"\"[proxy_all]\n[bypass_list]\n10.3.0.0/16\n10.0.0.0/8\n(?:^|\\.)chrome\\.com$\n\n[proxy_list]\n# ignored\n0.0.0.0/0\n(?:^|\\.)about\\.google$\n\"\"\"\n    }\n\n    @Test\n    fun parse() {\n        Assert.assertEquals(INPUT1, Acl().fromReader(INPUT1.reader()).toString())\n        Assert.assertEquals(INPUT2, Acl().fromReader(INPUT2.reader()).toString())\n    }\n}\n"
  },
  {
    "path": "core/src/androidTest/java/com/github/shadowsocks/database/MigrationTest.kt",
    "content": "/*******************************************************************************\n *                                                                             *\n *  Copyright (C) 2019 by Max Lv <max.c.lv@gmail.com>                          *\n *  Copyright (C) 2019 by Mygod Studio <contact-shadowsocks-android@mygod.be>  *\n *                                                                             *\n *  This program is free software: you can redistribute it and/or modify       *\n *  it under the terms of the GNU General Public License as published by       *\n *  the Free Software Foundation, either version 3 of the License, or          *\n *  (at your option) any later version.                                        *\n *                                                                             *\n *  This program is distributed in the hope that it will be useful,            *\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of             *\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the              *\n *  GNU General Public License for more details.                               *\n *                                                                             *\n *  You should have received a copy of the GNU General Public License          *\n *  along with this program. If not, see <http://www.gnu.org/licenses/>.       *\n *                                                                             *\n *******************************************************************************/\n\npackage com.github.shadowsocks.database\n\nimport androidx.room.testing.MigrationTestHelper\nimport androidx.sqlite.db.framework.FrameworkSQLiteOpenHelperFactory\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport androidx.test.platform.app.InstrumentationRegistry\nimport org.junit.Rule\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport java.io.IOException\n\n@RunWith(AndroidJUnit4::class)\nclass MigrationTest {\n    companion object {\n        private const val TEST_DB = \"migration-test\"\n    }\n\n    @get:Rule\n    val privateDatabase = MigrationTestHelper(InstrumentationRegistry.getInstrumentation(),\n            PrivateDatabase::class.java.canonicalName, FrameworkSQLiteOpenHelperFactory())\n\n    @Test\n    @Throws(IOException::class)\n    fun migrate27() {\n        val db = privateDatabase.createDatabase(TEST_DB, 26)\n        db.close()\n        privateDatabase.runMigrationsAndValidate(TEST_DB, 27, true, PrivateDatabase.Migration27)\n    }\n    @Test\n    @Throws(IOException::class)\n    fun migrate28() {\n        val db = privateDatabase.createDatabase(TEST_DB, 27)\n        db.close()\n        privateDatabase.runMigrationsAndValidate(TEST_DB, 28, true, PrivateDatabase.Migration28)\n    }\n}\n"
  },
  {
    "path": "core/src/androidTest/java/com/github/shadowsocks/database/ProfileTest.kt",
    "content": "/*******************************************************************************\n *                                                                             *\n *  Copyright (C) 2017 by Max Lv <max.c.lv@gmail.com>                          *\n *  Copyright (C) 2017 by Mygod Studio <contact-shadowsocks-android@mygod.be>  *\n *                                                                             *\n *  This program is free software: you can redistribute it and/or modify       *\n *  it under the terms of the GNU General Public License as published by       *\n *  the Free Software Foundation, either version 3 of the License, or          *\n *  (at your option) any later version.                                        *\n *                                                                             *\n *  This program is distributed in the hope that it will be useful,            *\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of             *\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the              *\n *  GNU General Public License for more details.                               *\n *                                                                             *\n *  You should have received a copy of the GNU General Public License          *\n *  along with this program. If not, see <http://www.gnu.org/licenses/>.       *\n *                                                                             *\n *******************************************************************************/\n\npackage com.github.shadowsocks.database\n\nimport androidx.core.net.toUri\nimport org.junit.Assert\nimport org.junit.Test\n\nclass ProfileTest {\n    @Test\n    fun parsing() {\n        val results = Profile.findAllUrls(\"garble ss://YmYtY2ZiOnRlc3RAMTkyLjE2OC4xMDAuMTo4ODg4#example-server garble\")\n                .toList()\n        Assert.assertEquals(1, results.size)\n        Assert.assertEquals(\"ss://YmYtY2ZiOnRlc3Q@192.168.100.1:8888#example-server\".toUri(),\n                results.single().toUri())\n    }\n}\n"
  },
  {
    "path": "core/src/androidTest/java/com/github/shadowsocks/net/SubnetTest.kt",
    "content": "package com.github.shadowsocks.net\n\nimport android.net.InetAddresses.parseNumericAddress\nimport org.junit.Assert\nimport org.junit.Test\nimport java.net.InetAddress\n\nclass SubnetTest {\n    @Test\n    fun parsingAndEquals() {\n        Assert.assertEquals(Subnet(InetAddress.getByName(\"1.10.11.12\"), 25), Subnet.fromString(\"1.10.11.12/25\"))\n        Assert.assertEquals(Subnet(InetAddress.getByName(\"12.118.130.86\"), 32), Subnet.fromString(\"12.118.130.86\"))\n        Assert.assertEquals(Subnet(InetAddress.getByName(\"caec:cec6:c4ef:bb7b:1a78:d055:216d:3a78\"), 96),\n                Subnet.fromString(\"caec:cec6:c4ef:bb7b:1a78:d055:216d:3a78/96\"))\n        Assert.assertEquals(Subnet(InetAddress.getByName(\"be37:44bd:8630:7a0:2a3d:ff95:dd33:42f0\"), 128),\n                Subnet.fromString(\"be37:44bd:8630:7a0:2a3d:ff95:dd33:42f0\"))\n        Assert.assertNotEquals(Subnet.fromString(\"1.2.3.4/12\"), Subnet.fromString(\"1.2.3.5/12\"))\n    }\n\n    @Test\n    fun invalidParsings() {\n        Assert.assertEquals(null, Subnet.fromString(\"1.2.3.456\"))\n        Assert.assertEquals(null, Subnet.fromString(\"ffff::f0000\"))\n        Assert.assertEquals(null, Subnet.fromString(\"caec:cec6:c4ef:bb7b:1a78:d055:216d:3a78/129\"))\n        Assert.assertEquals(null, Subnet.fromString(\"caec:cec6:c4ef:bb7b:1a78:d055:216d:3a78/129\"))\n        Assert.assertEquals(null, Subnet.fromString(\"caec:cec6:c4ef:bb7b:1a78:d055:216d:3a78/-99\"))\n        Assert.assertEquals(null, Subnet.fromString(\"caec:cec6:c4ef:bb7b:1a78:d055:216d:3a78/1/0\"))\n    }\n\n    @Test\n    fun matching1() {\n        val matcher = Subnet.fromString(\"1.10.11.12/25\")!!.toImmutable()\n        Assert.assertFalse(matcher.matches(parseNumericAddress(\"1.10.10.12\").address))\n        Assert.assertTrue(matcher.matches(parseNumericAddress(\"1.10.11.13\").address))\n        Assert.assertFalse(matcher.matches(parseNumericAddress(\"1.10.11.212\").address))\n    }\n\n    @Test\n    fun matching2() {\n        val matcher = Subnet.fromString(\"14.208.0.0/12\")!!.toImmutable()\n        Assert.assertTrue(matcher.matches(parseNumericAddress(\"14.215.178.36\").address))\n        Assert.assertTrue(matcher.matches(parseNumericAddress(\"14.215.178.37\").address))\n        Assert.assertFalse(matcher.matches(parseNumericAddress(\"1.10.11.212\").address))\n    }\n}\n"
  },
  {
    "path": "core/src/main/AndroidManifest.xml",
    "content": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n          xmlns:tools=\"http://schemas.android.com/tools\"\n          android:installLocation=\"internalOnly\">\n\n    <uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>\n    <uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\"/>\n    <uses-permission android:name=\"android.permission.FOREGROUND_SERVICE\"/>\n    <uses-permission android:name=\"android.permission.FOREGROUND_SERVICE_SPECIAL_USE\"/>\n    <uses-permission android:name=\"android.permission.FOREGROUND_SERVICE_SYSTEM_EXEMPTED\"/>\n    <uses-permission android:name=\"android.permission.INTERNET\"/>\n    <uses-permission android:name=\"android.permission.POST_NOTIFICATIONS\"/>\n    <uses-permission android:name=\"android.permission.RECEIVE_BOOT_COMPLETED\"/>\n    <uses-permission android:name=\"android.permission.WAKE_LOCK\"/>\n    <uses-permission android:name=\"android.permission.WRITE_EXTERNAL_STORAGE\"\n                     android:maxSdkVersion=\"28\"/>\n\n    <queries>\n        <intent>\n            <action android:name=\"com.github.shadowsocks.plugin.ACTION_NATIVE_PLUGIN\" />\n        </intent>\n    </queries>\n\n    <application\n        android:icon=\"@mipmap/ic_launcher\"\n        android:allowBackup=\"true\"\n        android:enableOnBackInvokedCallback=\"true\"\n        android:extractNativeLibs=\"true\"\n        android:fullBackupContent=\"@xml/backup_descriptor\"\n        android:fullBackupOnly=\"true\"\n        android:hasFragileUserData=\"true\"\n        android:label=\"@string/app_name\"\n        android:supportsRtl=\"true\"\n        android:networkSecurityConfig=\"@xml/network_security_config\"\n        android:banner=\"@mipmap/banner\">\n\n        <meta-data android:name=\"android.webkit.WebView.EnableSafeBrowsing\"\n                   android:value=\"true\" />\n        <meta-data android:name=\"com.google.android.backup.api_key\"\n                   android:value=\"AEdPqrEAAAAI_zVxZthz2HDuz9toTvkYvL0L5GA-OjeUIfBeXg\"/>\n\n        <service\n            android:name=\"com.github.shadowsocks.bg.VpnService\"\n            android:process=\":bg\"\n            android:directBootAware=\"true\"\n            android:label=\"@string/app_name\"\n            android:permission=\"android.permission.BIND_VPN_SERVICE\"\n            android:foregroundServiceType=\"systemExempted\"\n            android:exported=\"false\"\n            tools:ignore=\"ForegroundServicePermission\">\n            <intent-filter>\n                <action android:name=\"android.net.VpnService\"/>\n            </intent-filter>\n        </service>\n\n        <service\n            android:name=\"com.github.shadowsocks.bg.TransproxyService\"\n            android:process=\":bg\"\n            android:directBootAware=\"true\"\n            android:foregroundServiceType=\"specialUse\"\n            android:exported=\"false\">\n            <property\n                android:name=\"android.app.PROPERTY_SPECIAL_USE_FGS_SUBTYPE\"\n                android:value=\"Proxy service that handles incoming SOCKS5 and Transproxy traffic\" />\n        </service>\n\n        <service\n            android:name=\"com.github.shadowsocks.bg.ProxyService\"\n            android:process=\":bg\"\n            android:directBootAware=\"true\"\n            android:foregroundServiceType=\"specialUse\"\n            android:exported=\"false\">\n            <property\n                android:name=\"android.app.PROPERTY_SPECIAL_USE_FGS_SUBTYPE\"\n                android:value=\"Proxy service that handles incoming SOCKS5 traffic\" />\n        </service>\n\n        <service\n            android:name=\"com.github.shadowsocks.subscription.SubscriptionService\"\n            android:exported=\"false\">\n        </service>\n\n        <activity\n            android:name=\"com.github.shadowsocks.UrlImportActivity\"\n            android:theme=\"@style/Theme.Shadowsocks.Translucent\"\n            android:exported=\"true\"\n            android:excludeFromRecents=\"true\">\n            <intent-filter>\n                <action android:name=\"android.intent.action.VIEW\"/>\n                <category android:name=\"android.intent.category.DEFAULT\"/>\n                <category android:name=\"android.intent.category.BROWSABLE\"/>\n                <data android:scheme=\"ss\"/>\n            </intent-filter>\n        </activity>\n\n        <activity\n            android:name=\"com.github.shadowsocks.VpnRequestActivity\"\n            android:theme=\"@style/Theme.Shadowsocks.Translucent\"\n            android:exported=\"false\"\n            android:excludeFromRecents=\"true\"\n            android:taskAffinity=\"\"/>\n\n        <receiver android:name=\"com.github.shadowsocks.BootReceiver\"\n                  android:process=\":bg\"\n                  android:directBootAware=\"true\"\n                  android:exported=\"true\"\n                  android:enabled=\"false\">\n            <intent-filter>\n                <action android:name=\"android.intent.action.BOOT_COMPLETED\"/>\n                <action android:name=\"android.intent.action.LOCKED_BOOT_COMPLETED\" />\n                <action android:name=\"android.intent.action.MY_PACKAGE_REPLACED\" />\n            </intent-filter>\n        </receiver>\n\n        <activity android:name=\"com.google.android.gms.oss.licenses.OssLicensesActivity\"\n                  android:theme=\"@style/Theme.Shadowsocks.ActionBar\"/>\n        <activity android:name=\"com.google.android.gms.oss.licenses.OssLicensesMenuActivity\"\n                  android:theme=\"@style/Theme.Shadowsocks.ActionBar\"/>\n        <service android:name=\"com.google.firebase.components.ComponentDiscoveryService\"\n                 android:directBootAware=\"true\"/>\n        <provider android:name=\"com.google.firebase.provider.FirebaseInitProvider\"\n                  tools:node=\"remove\"/>\n        <service android:name=\"androidx.room.MultiInstanceInvalidationService\"\n                 android:process=\":bg\"/>\n    </application>\n</manifest>\n"
  },
  {
    "path": "core/src/main/aidl/com/github/shadowsocks/aidl/IShadowsocksService.aidl",
    "content": "package com.github.shadowsocks.aidl;\n\nimport com.github.shadowsocks.aidl.IShadowsocksServiceCallback;\n\ninterface IShadowsocksService {\n  int getState();\n  String getProfileName();\n\n  void registerCallback(in IShadowsocksServiceCallback cb);\n  void startListeningForBandwidth(in IShadowsocksServiceCallback cb, long timeout);\n  oneway void stopListeningForBandwidth(in IShadowsocksServiceCallback cb);\n  oneway void unregisterCallback(in IShadowsocksServiceCallback cb);\n}\n"
  },
  {
    "path": "core/src/main/aidl/com/github/shadowsocks/aidl/IShadowsocksServiceCallback.aidl",
    "content": "package com.github.shadowsocks.aidl;\n\nimport com.github.shadowsocks.aidl.TrafficStats;\n\noneway interface IShadowsocksServiceCallback {\n  void stateChanged(int state, String profileName, String msg);\n  void trafficUpdated(long profileId, in TrafficStats stats);\n  // Traffic data has persisted to database, listener should refetch their data from database\n  void trafficPersisted(long profileId);\n}\n"
  },
  {
    "path": "core/src/main/aidl/com/github/shadowsocks/aidl/TrafficStats.aidl",
    "content": "package com.github.shadowsocks.aidl;\n\nparcelable TrafficStats;\n"
  },
  {
    "path": "core/src/main/assets/acl/bypass-china.acl",
    "content": "[proxy_all]\n\n[bypass_list]\n1.0.1.0/24\n1.0.2.0/23\n1.0.8.0/21\n1.0.32.0/19\n1.1.0.0/24\n1.1.2.0/23\n1.1.4.0/22\n1.1.8.0/21\n1.1.16.0/20\n1.1.32.0/19\n1.2.0.0/23\n1.2.2.0/24\n1.2.4.0/22\n1.2.8.0/21\n1.2.16.0/20\n1.2.32.0/19\n1.2.64.0/18\n1.3.0.0/16\n1.4.1.0/24\n1.4.2.0/23\n1.4.4.0/22\n1.4.8.0/21\n1.4.16.0/20\n1.4.32.0/19\n1.4.64.0/18\n1.8.0.0/16\n1.10.0.0/21\n1.10.8.0/23\n1.10.11.0/24\n1.10.12.0/22\n1.10.16.0/20\n1.10.32.0/19\n1.10.64.0/18\n1.12.0.0/14\n1.24.0.0/13\n1.45.0.0/16\n1.48.0.0/14\n1.56.0.0/13\n1.68.0.0/14\n1.80.0.0/12\n1.116.0.0/14\n1.180.0.0/14\n1.184.0.0/15\n1.188.0.0/14\n1.192.0.0/13\n1.202.0.0/15\n1.204.0.0/14\n14.0.0.0/21\n14.0.12.0/22\n14.1.0.0/22\n14.1.24.0/22\n14.1.96.0/22\n14.1.108.0/22\n14.16.0.0/12\n14.102.128.0/22\n14.102.156.0/22\n14.102.180.0/22\n14.103.0.0/16\n14.104.0.0/13\n14.112.0.0/12\n14.130.0.0/15\n14.134.0.0/15\n14.144.0.0/12\n14.192.60.0/22\n14.192.76.0/22\n14.196.0.0/15\n14.204.0.0/15\n14.208.0.0/12\n27.0.128.0/21\n27.0.160.0/21\n27.0.188.0/22\n27.0.204.0/22\n27.0.208.0/21\n27.8.0.0/13\n27.16.0.0/12\n27.34.232.0/21\n27.36.0.0/14\n27.40.0.0/13\n27.50.40.0/21\n27.50.128.0/17\n27.54.72.0/21\n27.54.152.0/21\n27.54.192.0/18\n27.98.208.0/20\n27.98.224.0/19\n27.99.128.0/17\n27.103.0.0/16\n27.106.128.0/18\n27.106.204.0/22\n27.109.32.0/19\n27.109.124.0/22\n27.112.0.0/18\n27.112.80.0/20\n27.112.112.0/21\n27.113.128.0/18\n27.115.0.0/17\n27.116.44.0/22\n27.121.72.0/21\n27.121.120.0/21\n27.128.0.0/15\n27.131.220.0/22\n27.144.0.0/16\n27.148.0.0/14\n27.152.0.0/13\n27.184.0.0/13\n27.192.0.0/11\n27.224.0.0/14\n36.0.0.0/22\n36.0.8.0/21\n36.0.16.0/20\n36.0.32.0/19\n36.0.64.0/18\n36.0.128.0/17\n36.1.0.0/16\n36.4.0.0/14\n36.16.0.0/12\n36.32.0.0/14\n36.36.0.0/16\n36.37.0.0/19\n36.37.36.0/23\n36.37.39.0/24\n36.37.40.0/21\n36.37.48.0/20\n36.40.0.0/13\n36.48.0.0/15\n36.51.0.0/16\n36.56.0.0/13\n36.96.0.0/11\n36.128.0.0/10\n36.192.0.0/11\n36.248.0.0/14\n36.254.0.0/16\n36.255.116.0/22\n36.255.128.0/22\n36.255.164.0/22\n36.255.172.0/22\n36.255.176.0/22\n39.0.0.0/24\n39.0.2.0/23\n39.0.4.0/22\n39.0.8.0/21\n39.0.16.0/20\n39.0.32.0/19\n39.0.64.0/18\n39.0.128.0/17\n39.64.0.0/11\n39.96.0.0/13\n39.104.0.0/14\n39.108.0.0/16\n39.128.0.0/10\n40.72.0.0/15\n40.125.128.0/17\n40.126.64.0/18\n42.0.0.0/22\n42.0.8.0/21\n42.0.16.0/21\n42.0.24.0/22\n42.0.32.0/19\n42.0.128.0/17\n42.1.0.0/19\n42.1.32.0/20\n42.1.48.0/21\n42.1.56.0/22\n42.1.128.0/17\n42.4.0.0/14\n42.48.0.0/13\n42.56.0.0/14\n42.62.0.0/17\n42.62.128.0/19\n42.62.160.0/20\n42.62.180.0/22\n42.62.184.0/21\n42.63.0.0/16\n42.80.0.0/15\n42.83.64.0/20\n42.83.80.0/22\n42.83.88.0/21\n42.83.96.0/19\n42.83.128.0/17\n42.84.0.0/14\n42.88.0.0/13\n42.96.64.0/19\n42.96.96.0/21\n42.96.108.0/22\n42.96.112.0/20\n42.96.128.0/17\n42.97.0.0/16\n42.99.0.0/18\n42.99.64.0/19\n42.99.96.0/20\n42.99.112.0/22\n42.99.120.0/21\n42.100.0.0/14\n42.120.0.0/15\n42.122.0.0/16\n42.123.0.0/19\n42.123.36.0/22\n42.123.40.0/21\n42.123.48.0/20\n42.123.64.0/18\n42.123.128.0/17\n42.128.0.0/12\n42.156.0.0/19\n42.156.36.0/22\n42.156.40.0/21\n42.156.48.0/20\n42.156.64.0/18\n42.156.128.0/17\n42.157.0.0/16\n42.158.0.0/15\n42.160.0.0/12\n42.176.0.0/13\n42.184.0.0/15\n42.186.0.0/16\n42.187.0.0/18\n42.187.64.0/19\n42.187.96.0/20\n42.187.112.0/21\n42.187.120.0/22\n42.187.128.0/17\n42.192.0.0/13\n42.201.0.0/17\n42.202.0.0/15\n42.204.0.0/14\n42.208.0.0/12\n42.224.0.0/12\n42.240.0.0/16\n42.242.0.0/15\n42.244.0.0/14\n42.248.0.0/13\n43.224.12.0/22\n43.224.24.0/22\n43.224.44.0/22\n43.224.52.0/22\n43.224.56.0/22\n43.224.64.0/21\n43.224.72.0/22\n43.224.80.0/22\n43.224.100.0/22\n43.224.144.0/22\n43.224.160.0/22\n43.224.176.0/22\n43.224.184.0/22\n43.224.200.0/21\n43.224.208.0/21\n43.224.216.0/22\n43.224.240.0/22\n43.225.76.0/22\n43.225.84.0/22\n43.225.120.0/21\n43.225.140.0/22\n43.225.172.0/22\n43.225.180.0/22\n43.225.208.0/22\n43.225.216.0/21\n43.225.224.0/20\n43.225.240.0/21\n43.225.252.0/22\n43.226.32.0/19\n43.226.64.0/19\n43.226.96.0/20\n43.226.112.0/21\n43.226.120.0/22\n43.226.128.0/18\n43.226.192.0/20\n43.226.208.0/21\n43.226.236.0/22\n43.226.240.0/20\n43.227.0.0/21\n43.227.8.0/22\n43.227.32.0/19\n43.227.64.0/19\n43.227.96.0/21\n43.227.104.0/22\n43.227.136.0/21\n43.227.144.0/22\n43.227.152.0/21\n43.227.160.0/20\n43.227.176.0/21\n43.227.188.0/22\n43.227.192.0/19\n43.227.232.0/22\n43.227.248.0/21\n43.228.0.0/18\n43.228.64.0/21\n43.228.76.0/22\n43.228.100.0/22\n43.228.116.0/22\n43.228.120.0/22\n43.228.132.0/22\n43.228.136.0/22\n43.228.148.0/22\n43.228.152.0/22\n43.228.188.0/22\n43.229.40.0/22\n43.229.48.0/22\n43.229.56.0/22\n43.229.96.0/22\n43.229.120.0/22\n43.229.136.0/21\n43.229.144.0/22\n43.229.168.0/21\n43.229.176.0/20\n43.229.192.0/21\n43.229.216.0/21\n43.229.232.0/21\n43.230.20.0/22\n43.230.32.0/22\n43.230.68.0/22\n43.230.72.0/22\n43.230.84.0/22\n43.230.124.0/22\n43.230.136.0/22\n43.230.168.0/22\n43.230.220.0/22\n43.230.224.0/19\n43.231.32.0/20\n43.231.80.0/20\n43.231.96.0/20\n43.231.136.0/21\n43.231.144.0/20\n43.231.160.0/20\n43.231.176.0/21\n43.236.0.0/15\n43.238.0.0/16\n43.239.0.0/19\n43.239.32.0/20\n43.239.48.0/22\n43.239.116.0/22\n43.239.120.0/22\n43.239.172.0/22\n43.239.176.0/22\n43.240.0.0/22\n43.240.56.0/21\n43.240.68.0/22\n43.240.72.0/21\n43.240.84.0/22\n43.240.124.0/22\n43.240.128.0/21\n43.240.136.0/22\n43.240.144.0/22\n43.240.156.0/22\n43.240.160.0/19\n43.240.192.0/19\n43.240.236.0/22\n43.240.240.0/20\n43.241.0.0/20\n43.241.16.0/21\n43.241.48.0/22\n43.241.76.0/22\n43.241.80.0/20\n43.241.112.0/22\n43.241.168.0/21\n43.241.176.0/21\n43.241.184.0/22\n43.241.196.0/22\n43.241.208.0/20\n43.241.224.0/20\n43.241.240.0/22\n43.241.248.0/21\n43.242.8.0/21\n43.242.16.0/20\n43.242.44.0/22\n43.242.48.0/20\n43.242.64.0/22\n43.242.72.0/21\n43.242.80.0/20\n43.242.96.0/22\n43.242.144.0/20\n43.242.160.0/21\n43.242.168.0/22\n43.242.180.0/22\n43.242.188.0/22\n43.242.192.0/21\n43.242.204.0/22\n43.242.216.0/21\n43.242.252.0/22\n43.243.4.0/22\n43.243.8.0/21\n43.243.16.0/22\n43.243.24.0/22\n43.243.88.0/22\n43.243.128.0/22\n43.243.136.0/22\n43.243.144.0/21\n43.243.156.0/22\n43.243.168.0/22\n43.243.180.0/22\n43.243.188.0/22\n43.243.228.0/22\n43.243.232.0/22\n43.243.244.0/22\n43.246.0.0/18\n43.246.64.0/19\n43.246.96.0/22\n43.246.112.0/22\n43.246.212.0/22\n43.246.228.0/22\n43.247.4.0/22\n43.247.8.0/22\n43.247.44.0/22\n43.247.48.0/22\n43.247.68.0/22\n43.247.76.0/22\n43.247.84.0/22\n43.247.88.0/21\n43.247.96.0/21\n43.247.108.0/22\n43.247.112.0/22\n43.247.148.0/22\n43.247.152.0/22\n43.247.176.0/20\n43.247.196.0/22\n43.247.200.0/21\n43.247.208.0/20\n43.247.224.0/19\n43.248.0.0/21\n43.248.20.0/22\n43.248.28.0/22\n43.248.48.0/22\n43.248.76.0/22\n43.248.80.0/20\n43.248.96.0/19\n43.248.128.0/20\n43.248.144.0/21\n43.248.176.0/20\n43.248.192.0/20\n43.248.208.0/22\n43.248.228.0/22\n43.248.232.0/22\n43.248.244.0/22\n43.249.4.0/22\n43.249.8.0/22\n43.249.120.0/22\n43.249.132.0/22\n43.249.136.0/22\n43.249.144.0/20\n43.249.160.0/21\n43.249.168.0/22\n43.249.192.0/22\n43.249.236.0/22\n43.250.4.0/22\n43.250.12.0/22\n43.250.16.0/21\n43.250.28.0/22\n43.250.32.0/21\n43.250.72.0/22\n43.250.96.0/20\n43.250.112.0/21\n43.250.128.0/22\n43.250.144.0/21\n43.250.160.0/22\n43.250.168.0/21\n43.250.176.0/22\n43.250.200.0/22\n43.250.212.0/22\n43.250.216.0/21\n43.250.236.0/22\n43.250.244.0/22\n43.251.4.0/22\n43.251.8.0/21\n43.251.36.0/22\n43.251.100.0/22\n43.251.116.0/22\n43.251.192.0/22\n43.251.232.0/21\n43.251.244.0/22\n43.252.40.0/22\n43.252.48.0/22\n43.252.56.0/22\n43.252.224.0/22\n43.254.0.0/21\n43.254.8.0/22\n43.254.24.0/22\n43.254.36.0/22\n43.254.44.0/22\n43.254.52.0/22\n43.254.64.0/22\n43.254.72.0/22\n43.254.84.0/22\n43.254.88.0/21\n43.254.100.0/22\n43.254.104.0/22\n43.254.112.0/21\n43.254.128.0/22\n43.254.136.0/21\n43.254.144.0/20\n43.254.168.0/21\n43.254.180.0/22\n43.254.184.0/21\n43.254.192.0/21\n43.254.200.0/22\n43.254.208.0/22\n43.254.220.0/22\n43.254.224.0/20\n43.254.240.0/22\n43.254.248.0/21\n43.255.0.0/21\n43.255.8.0/22\n43.255.16.0/22\n43.255.48.0/22\n43.255.64.0/20\n43.255.84.0/22\n43.255.96.0/22\n43.255.108.0/22\n43.255.144.0/22\n43.255.168.0/22\n43.255.176.0/22\n43.255.184.0/22\n43.255.192.0/22\n43.255.200.0/21\n43.255.208.0/21\n43.255.224.0/21\n43.255.232.0/22\n43.255.244.0/22\n45.40.192.0/18\n45.65.16.0/20\n45.112.132.0/22\n45.112.188.0/22\n45.112.208.0/20\n45.112.228.0/22\n45.112.232.0/21\n45.113.12.0/22\n45.113.16.0/20\n45.113.40.0/22\n45.113.52.0/22\n45.113.56.0/22\n45.113.72.0/22\n45.113.144.0/21\n45.113.168.0/22\n45.113.176.0/22\n45.113.184.0/22\n45.113.200.0/21\n45.113.208.0/20\n45.113.240.0/22\n45.113.252.0/22\n45.114.0.0/22\n45.114.12.0/22\n45.114.32.0/22\n45.114.40.0/22\n45.114.52.0/22\n45.114.96.0/22\n45.114.104.0/21\n45.114.124.0/22\n45.114.136.0/22\n45.114.196.0/22\n45.114.200.0/22\n45.114.228.0/22\n45.114.252.0/22\n45.115.44.0/22\n45.115.100.0/22\n45.115.120.0/22\n45.115.132.0/22\n45.115.144.0/22\n45.115.156.0/22\n45.115.164.0/22\n45.115.200.0/22\n45.115.212.0/22\n45.115.228.0/22\n45.115.236.0/22\n45.115.244.0/22\n45.115.248.0/22\n45.116.12.0/22\n45.116.16.0/22\n45.116.24.0/22\n45.116.32.0/21\n45.116.52.0/22\n45.116.96.0/21\n45.116.140.0/22\n45.116.152.0/22\n45.116.208.0/22\n45.117.8.0/22\n45.117.20.0/22\n45.117.68.0/22\n45.117.124.0/22\n45.117.252.0/22\n45.119.52.0/22\n45.119.60.0/22\n45.119.64.0/21\n45.119.72.0/22\n45.119.104.0/22\n45.119.116.0/22\n45.119.232.0/22\n45.120.100.0/22\n45.120.140.0/22\n45.120.164.0/22\n45.120.220.0/22\n45.120.240.0/22\n45.121.20.0/22\n45.121.52.0/22\n45.121.64.0/21\n45.121.72.0/22\n45.121.92.0/22\n45.121.96.0/22\n45.121.172.0/22\n45.121.176.0/22\n45.121.212.0/22\n45.121.240.0/20\n45.122.0.0/19\n45.122.32.0/21\n45.122.40.0/22\n45.122.60.0/22\n45.122.64.0/19\n45.122.96.0/20\n45.122.112.0/21\n45.122.160.0/19\n45.122.192.0/20\n45.122.208.0/21\n45.122.216.0/22\n45.123.28.0/22\n45.123.32.0/21\n45.123.44.0/22\n45.123.48.0/20\n45.123.64.0/20\n45.123.80.0/21\n45.123.88.0/22\n45.123.120.0/22\n45.123.128.0/21\n45.123.136.0/22\n45.123.148.0/22\n45.123.152.0/21\n45.123.164.0/22\n45.123.168.0/21\n45.123.176.0/21\n45.123.184.0/22\n45.123.204.0/22\n45.123.212.0/22\n45.123.224.0/19\n45.124.0.0/22\n45.124.20.0/22\n45.124.28.0/22\n45.124.32.0/21\n45.124.44.0/22\n45.124.68.0/22\n45.124.76.0/22\n45.124.80.0/22\n45.124.100.0/22\n45.124.124.0/22\n45.124.172.0/22\n45.124.176.0/22\n45.124.208.0/22\n45.124.248.0/22\n45.125.12.0/22\n45.125.16.0/22\n45.125.24.0/21\n45.125.32.0/22\n45.125.44.0/22\n45.125.52.0/22\n45.125.56.0/22\n45.125.76.0/22\n45.125.80.0/20\n45.125.96.0/21\n45.125.104.0/22\n45.125.136.0/22\n45.126.48.0/21\n45.126.100.0/22\n45.126.108.0/22\n45.126.112.0/21\n45.126.120.0/22\n45.126.212.0/22\n45.126.220.0/22\n45.127.8.0/21\n45.127.96.0/22\n45.127.116.0/22\n45.127.124.0/22\n45.127.128.0/22\n45.127.144.0/21\n45.127.156.0/22\n45.127.216.0/22\n45.248.8.0/22\n45.248.80.0/21\n45.248.88.0/22\n45.248.96.0/20\n45.248.128.0/21\n45.248.204.0/22\n45.248.208.0/20\n45.248.224.0/19\n45.249.0.0/21\n45.249.12.0/22\n45.249.16.0/20\n45.249.32.0/21\n45.249.92.0/22\n45.249.112.0/22\n45.249.180.0/22\n45.249.188.0/22\n45.249.192.0/20\n45.249.208.0/21\n45.250.12.0/22\n45.250.16.0/22\n45.250.28.0/22\n45.250.32.0/21\n45.250.40.0/22\n45.250.76.0/22\n45.250.80.0/20\n45.250.96.0/22\n45.250.104.0/21\n45.250.112.0/20\n45.250.128.0/20\n45.250.144.0/21\n45.250.152.0/22\n45.250.164.0/22\n45.250.180.0/22\n45.250.184.0/21\n45.250.192.0/22\n45.251.0.0/22\n45.251.8.0/22\n45.251.16.0/21\n45.251.52.0/22\n45.251.84.0/22\n45.251.88.0/21\n45.251.96.0/21\n45.251.120.0/21\n45.251.136.0/21\n45.251.144.0/20\n45.251.160.0/19\n45.251.192.0/19\n45.251.224.0/22\n45.251.240.0/22\n45.252.0.0/19\n45.252.32.0/20\n45.252.48.0/22\n45.252.60.0/22\n45.252.84.0/22\n45.252.88.0/21\n45.252.96.0/19\n45.252.128.0/19\n45.252.160.0/20\n45.252.176.0/22\n45.252.192.0/19\n45.252.224.0/21\n45.252.232.0/22\n45.253.0.0/18\n45.253.64.0/20\n45.253.80.0/21\n45.253.92.0/22\n45.253.96.0/20\n45.253.112.0/21\n45.253.120.0/22\n45.253.132.0/22\n45.253.136.0/21\n45.253.144.0/20\n45.253.160.0/19\n45.253.192.0/19\n45.253.224.0/20\n45.253.240.0/22\n45.254.0.0/19\n45.254.40.0/22\n45.254.48.0/20\n45.254.64.0/18\n45.254.128.0/18\n45.254.192.0/19\n45.254.224.0/21\n45.254.236.0/22\n45.254.240.0/22\n45.254.248.0/22\n45.255.0.0/17\n45.255.132.0/22\n45.255.136.0/21\n45.255.144.0/20\n45.255.160.0/19\n45.255.192.0/19\n45.255.224.0/20\n45.255.240.0/21\n45.255.248.0/22\n47.92.0.0/14\n47.96.0.0/11\n49.4.0.0/14\n49.51.0.0/16\n49.52.0.0/14\n49.64.0.0/11\n49.112.0.0/13\n49.120.0.0/14\n49.128.0.0/24\n49.128.2.0/23\n49.128.4.0/22\n49.140.0.0/15\n49.152.0.0/14\n49.208.0.0/14\n49.220.0.0/14\n49.232.0.0/14\n49.239.0.0/18\n49.239.192.0/18\n49.246.224.0/19\n52.80.0.0/14\n52.130.0.0/15\n54.222.0.0/15\n58.14.0.0/15\n58.16.0.0/13\n58.24.0.0/15\n58.30.0.0/15\n58.32.0.0/11\n58.65.232.0/21\n58.66.0.0/15\n58.68.128.0/17\n58.82.0.0/17\n58.83.0.0/16\n58.87.64.0/18\n58.99.128.0/17\n58.100.0.0/15\n58.116.0.0/14\n58.128.0.0/13\n58.144.0.0/16\n58.154.0.0/15\n58.192.0.0/11\n58.240.0.0/12\n59.32.0.0/11\n59.64.0.0/12\n59.80.0.0/14\n59.107.0.0/16\n59.108.0.0/14\n59.151.0.0/17\n59.152.16.0/20\n59.152.32.0/21\n59.152.64.0/20\n59.152.112.0/21\n59.153.4.0/22\n59.153.32.0/22\n59.153.60.0/22\n59.153.64.0/21\n59.153.72.0/22\n59.153.92.0/22\n59.153.116.0/22\n59.153.136.0/22\n59.153.152.0/21\n59.153.164.0/22\n59.153.168.0/21\n59.153.176.0/20\n59.153.192.0/22\n59.155.0.0/16\n59.172.0.0/14\n59.191.0.0/17\n59.191.240.0/20\n59.192.0.0/10\n60.0.0.0/11\n60.55.0.0/16\n60.63.0.0/16\n60.160.0.0/11\n60.194.0.0/15\n60.200.0.0/13\n60.208.0.0/12\n60.232.0.0/15\n60.235.0.0/16\n60.245.128.0/17\n60.247.0.0/16\n60.252.0.0/16\n60.253.128.0/17\n60.255.0.0/16\n61.4.80.0/20\n61.4.176.0/20\n61.8.160.0/20\n61.14.212.0/22\n61.14.216.0/21\n61.14.240.0/21\n61.28.0.0/17\n61.29.128.0/18\n61.29.192.0/19\n61.29.224.0/20\n61.45.128.0/18\n61.45.224.0/20\n61.47.128.0/18\n61.48.0.0/13\n61.87.192.0/18\n61.128.0.0/10\n61.232.0.0/14\n61.236.0.0/15\n61.240.0.0/14\n62.234.0.0/16\n68.79.0.0/18\n69.230.192.0/18\n69.231.128.0/18\n69.234.192.0/18\n69.235.128.0/18\n71.131.192.0/18\n71.132.0.0/18\n71.136.64.0/18\n71.137.0.0/18\n81.68.0.0/14\n82.156.0.0/15\n91.234.36.0/24\n94.191.0.0/17\n101.0.0.0/22\n101.1.0.0/22\n101.2.172.0/22\n101.4.0.0/14\n101.16.0.0/12\n101.33.128.0/17\n101.34.0.0/15\n101.36.0.0/14\n101.40.0.0/13\n101.48.0.0/15\n101.50.8.0/21\n101.50.56.0/22\n101.52.0.0/16\n101.53.100.0/22\n101.54.0.0/16\n101.55.224.0/21\n101.64.0.0/13\n101.72.0.0/14\n101.76.0.0/15\n101.78.0.0/22\n101.78.32.0/19\n101.80.0.0/12\n101.96.0.0/21\n101.96.8.0/22\n101.96.16.0/20\n101.96.128.0/17\n101.99.96.0/19\n101.101.64.0/19\n101.101.100.0/24\n101.101.102.0/23\n101.101.104.0/21\n101.101.112.0/20\n101.102.64.0/19\n101.102.100.0/23\n101.102.102.0/24\n101.102.104.0/21\n101.102.112.0/20\n101.104.0.0/14\n101.110.64.0/19\n101.110.96.0/20\n101.110.116.0/22\n101.110.120.0/21\n101.120.0.0/14\n101.124.0.0/15\n101.126.0.0/16\n101.128.0.0/22\n101.128.8.0/21\n101.128.16.0/20\n101.128.32.0/19\n101.129.0.0/16\n101.130.0.0/15\n101.132.0.0/14\n101.144.0.0/12\n101.192.0.0/13\n101.200.0.0/15\n101.203.128.0/19\n101.203.160.0/21\n101.203.172.0/22\n101.203.176.0/20\n101.204.0.0/14\n101.224.0.0/13\n101.232.0.0/15\n101.234.64.0/21\n101.234.76.0/22\n101.234.80.0/20\n101.234.96.0/19\n101.236.0.0/14\n101.240.0.0/13\n101.248.0.0/15\n101.251.0.0/22\n101.251.8.0/21\n101.251.16.0/20\n101.251.32.0/19\n101.251.64.0/18\n101.251.128.0/17\n101.252.0.0/15\n101.254.0.0/16\n103.1.8.0/22\n103.1.20.0/22\n103.1.24.0/22\n103.1.72.0/22\n103.1.88.0/22\n103.1.168.0/22\n103.2.108.0/22\n103.2.156.0/22\n103.2.164.0/22\n103.2.200.0/21\n103.2.208.0/21\n103.3.84.0/22\n103.3.88.0/21\n103.3.96.0/19\n103.3.128.0/20\n103.3.148.0/22\n103.3.152.0/21\n103.4.56.0/22\n103.4.168.0/22\n103.4.184.0/22\n103.4.224.0/22\n103.5.36.0/22\n103.5.52.0/22\n103.5.56.0/22\n103.5.152.0/22\n103.5.168.0/22\n103.5.192.0/22\n103.5.252.0/22\n103.6.76.0/22\n103.6.108.0/22\n103.6.220.0/22\n103.6.228.0/22\n103.7.4.0/22\n103.7.28.0/22\n103.7.140.0/22\n103.7.212.0/22\n103.7.216.0/21\n103.8.0.0/21\n103.8.8.0/22\n103.8.32.0/22\n103.8.52.0/22\n103.8.68.0/22\n103.8.108.0/22\n103.8.156.0/22\n103.8.200.0/21\n103.8.220.0/22\n103.9.8.0/22\n103.9.24.0/22\n103.9.108.0/22\n103.9.152.0/22\n103.9.192.0/22\n103.9.248.0/21\n103.10.0.0/22\n103.10.16.0/22\n103.10.84.0/22\n103.10.140.0/22\n103.11.16.0/22\n103.11.168.0/22\n103.11.180.0/22\n103.12.32.0/22\n103.12.68.0/22\n103.12.92.0/22\n103.12.136.0/22\n103.12.184.0/22\n103.12.232.0/22\n103.13.12.0/22\n103.13.124.0/22\n103.13.144.0/22\n103.13.196.0/22\n103.13.220.0/22\n103.13.244.0/22\n103.14.32.0/22\n103.14.84.0/22\n103.14.100.0/22\n103.14.132.0/22\n103.14.136.0/22\n103.14.156.0/22\n103.14.240.0/22\n103.15.4.0/22\n103.15.8.0/22\n103.15.16.0/22\n103.15.96.0/22\n103.15.200.0/22\n103.16.52.0/22\n103.16.80.0/21\n103.16.88.0/22\n103.16.108.0/22\n103.16.124.0/22\n103.17.40.0/22\n103.17.64.0/22\n103.17.120.0/22\n103.17.136.0/22\n103.17.160.0/22\n103.17.204.0/22\n103.17.228.0/22\n103.18.192.0/22\n103.18.208.0/21\n103.18.224.0/22\n103.19.0.0/22\n103.19.12.0/22\n103.19.40.0/21\n103.19.64.0/21\n103.19.72.0/22\n103.19.232.0/22\n103.20.12.0/22\n103.20.32.0/22\n103.20.44.0/22\n103.20.68.0/22\n103.20.112.0/22\n103.20.128.0/22\n103.20.160.0/22\n103.20.248.0/22\n103.21.112.0/21\n103.21.136.0/21\n103.21.176.0/22\n103.21.208.0/22\n103.21.240.0/22\n103.22.0.0/18\n103.22.64.0/19\n103.22.100.0/22\n103.22.104.0/21\n103.22.112.0/20\n103.22.188.0/22\n103.22.228.0/22\n103.22.252.0/22\n103.23.8.0/22\n103.23.56.0/22\n103.23.160.0/21\n103.23.176.0/22\n103.23.228.0/22\n103.24.24.0/22\n103.24.116.0/22\n103.24.128.0/22\n103.24.144.0/22\n103.24.176.0/22\n103.24.184.0/22\n103.24.220.0/22\n103.24.228.0/22\n103.24.248.0/21\n103.25.8.0/23\n103.25.20.0/22\n103.25.24.0/21\n103.25.32.0/21\n103.25.40.0/22\n103.25.48.0/22\n103.25.64.0/21\n103.25.148.0/22\n103.25.156.0/22\n103.25.216.0/22\n103.26.0.0/22\n103.26.64.0/22\n103.26.76.0/22\n103.26.132.0/22\n103.26.156.0/22\n103.26.160.0/22\n103.26.228.0/22\n103.26.240.0/22\n103.27.4.0/22\n103.27.12.0/22\n103.27.24.0/22\n103.27.56.0/22\n103.27.96.0/22\n103.27.184.0/22\n103.27.208.0/21\n103.27.240.0/22\n103.28.4.0/22\n103.28.8.0/22\n103.28.184.0/22\n103.28.204.0/22\n103.28.212.0/22\n103.29.16.0/22\n103.29.128.0/21\n103.29.136.0/22\n103.30.20.0/22\n103.30.96.0/22\n103.30.148.0/22\n103.30.200.0/22\n103.30.228.0/22\n103.30.236.0/22\n103.31.0.0/22\n103.31.48.0/20\n103.31.64.0/21\n103.31.148.0/22\n103.31.160.0/22\n103.31.168.0/22\n103.31.200.0/22\n103.31.236.0/22\n103.32.0.0/15\n103.34.0.0/16\n103.35.0.0/19\n103.35.32.0/20\n103.35.48.0/22\n103.35.104.0/22\n103.35.116.0/22\n103.35.180.0/22\n103.35.200.0/22\n103.35.220.0/22\n103.36.28.0/22\n103.36.36.0/22\n103.36.56.0/21\n103.36.64.0/22\n103.36.72.0/22\n103.36.96.0/22\n103.36.132.0/22\n103.36.136.0/22\n103.36.160.0/19\n103.36.192.0/19\n103.36.224.0/20\n103.36.240.0/21\n103.37.0.0/22\n103.37.12.0/22\n103.37.16.0/22\n103.37.24.0/22\n103.37.44.0/22\n103.37.52.0/22\n103.37.56.0/22\n103.37.72.0/22\n103.37.100.0/22\n103.37.104.0/22\n103.37.124.0/22\n103.37.136.0/21\n103.37.144.0/20\n103.37.160.0/21\n103.37.172.0/22\n103.37.176.0/22\n103.37.188.0/22\n103.37.208.0/20\n103.37.248.0/21\n103.38.0.0/22\n103.38.32.0/22\n103.38.40.0/21\n103.38.56.0/22\n103.38.76.0/22\n103.38.84.0/22\n103.38.92.0/22\n103.38.96.0/22\n103.38.116.0/22\n103.38.132.0/22\n103.38.140.0/22\n103.38.224.0/21\n103.38.232.0/22\n103.38.252.0/22\n103.39.16.0/22\n103.39.64.0/22\n103.39.88.0/22\n103.39.100.0/22\n103.39.104.0/21\n103.39.160.0/19\n103.39.200.0/21\n103.39.208.0/20\n103.39.224.0/21\n103.39.232.0/22\n103.40.12.0/22\n103.40.16.0/20\n103.40.32.0/20\n103.40.88.0/22\n103.40.100.0/22\n103.40.192.0/22\n103.40.212.0/22\n103.40.220.0/22\n103.40.228.0/22\n103.40.232.0/21\n103.40.240.0/20\n103.41.0.0/22\n103.41.16.0/22\n103.41.52.0/22\n103.41.140.0/22\n103.41.148.0/22\n103.41.152.0/22\n103.41.160.0/21\n103.41.220.0/22\n103.41.224.0/21\n103.41.232.0/22\n103.42.8.0/22\n103.42.24.0/21\n103.42.32.0/22\n103.42.64.0/21\n103.42.76.0/22\n103.42.104.0/22\n103.42.180.0/22\n103.42.232.0/22\n103.43.16.0/22\n103.43.84.0/22\n103.43.96.0/21\n103.43.104.0/22\n103.43.124.0/22\n103.43.184.0/22\n103.43.192.0/21\n103.43.208.0/22\n103.43.220.0/22\n103.43.224.0/22\n103.43.232.0/22\n103.43.240.0/22\n103.44.56.0/22\n103.44.80.0/22\n103.44.88.0/22\n103.44.120.0/21\n103.44.132.0/22\n103.44.144.0/22\n103.44.168.0/22\n103.44.176.0/20\n103.44.192.0/20\n103.44.224.0/22\n103.44.236.0/22\n103.44.240.0/20\n103.45.0.0/18\n103.45.72.0/21\n103.45.80.0/20\n103.45.96.0/19\n103.45.128.0/18\n103.45.192.0/19\n103.45.224.0/22\n103.45.248.0/22\n103.46.0.0/22\n103.46.12.0/22\n103.46.16.0/20\n103.46.32.0/19\n103.46.64.0/18\n103.46.128.0/21\n103.46.136.0/22\n103.46.152.0/21\n103.46.160.0/20\n103.46.176.0/21\n103.46.244.0/22\n103.46.248.0/22\n103.47.4.0/22\n103.47.20.0/22\n103.47.36.0/22\n103.47.40.0/22\n103.47.48.0/22\n103.47.80.0/22\n103.47.96.0/22\n103.47.108.0/22\n103.47.116.0/22\n103.47.120.0/22\n103.47.136.0/21\n103.47.212.0/22\n103.48.52.0/22\n103.48.92.0/22\n103.48.144.0/20\n103.48.202.0/23\n103.48.216.0/21\n103.48.224.0/20\n103.48.240.0/21\n103.49.12.0/22\n103.49.20.0/22\n103.49.72.0/21\n103.49.92.0/22\n103.49.96.0/22\n103.49.108.0/22\n103.49.128.0/22\n103.49.176.0/21\n103.49.196.0/22\n103.49.248.0/22\n103.50.36.0/22\n103.50.44.0/22\n103.50.48.0/20\n103.50.64.0/21\n103.50.72.0/22\n103.50.108.0/22\n103.50.112.0/20\n103.50.132.0/22\n103.50.136.0/21\n103.50.172.0/22\n103.50.176.0/20\n103.50.192.0/21\n103.50.200.0/22\n103.50.220.0/22\n103.50.224.0/20\n103.50.240.0/21\n103.50.248.0/22\n103.52.40.0/22\n103.52.72.0/21\n103.52.80.0/21\n103.52.96.0/21\n103.52.104.0/22\n103.52.160.0/21\n103.52.172.0/22\n103.52.176.0/22\n103.52.184.0/22\n103.52.196.0/22\n103.53.4.0/22\n103.53.64.0/21\n103.53.92.0/22\n103.53.100.0/22\n103.53.124.0/22\n103.53.128.0/20\n103.53.144.0/22\n103.53.180.0/22\n103.53.204.0/22\n103.53.208.0/21\n103.53.216.0/22\n103.53.236.0/22\n103.53.248.0/22\n103.54.8.0/22\n103.54.48.0/22\n103.54.60.0/22\n103.54.160.0/21\n103.54.212.0/22\n103.54.240.0/22\n103.55.24.0/22\n103.55.80.0/22\n103.55.120.0/22\n103.55.152.0/22\n103.55.172.0/22\n103.55.204.0/22\n103.55.208.0/22\n103.55.228.0/22\n103.55.236.0/22\n103.56.8.0/22\n103.56.16.0/21\n103.56.32.0/22\n103.56.52.0/22\n103.56.56.0/21\n103.56.72.0/21\n103.56.140.0/22\n103.56.152.0/22\n103.56.184.0/22\n103.56.200.0/22\n103.57.12.0/22\n103.57.52.0/22\n103.57.56.0/22\n103.57.76.0/22\n103.57.136.0/22\n103.57.196.0/22\n103.58.24.0/22\n103.59.76.0/22\n103.59.100.0/22\n103.59.112.0/20\n103.59.128.0/22\n103.59.148.0/22\n103.59.164.0/22\n103.60.32.0/22\n103.60.44.0/22\n103.60.164.0/22\n103.60.228.0/22\n103.60.236.0/22\n103.61.60.0/22\n103.61.104.0/22\n103.61.140.0/22\n103.61.152.0/21\n103.61.160.0/22\n103.61.172.0/22\n103.61.176.0/22\n103.61.184.0/21\n103.62.24.0/22\n103.62.52.0/22\n103.62.72.0/21\n103.62.80.0/21\n103.62.88.0/22\n103.62.96.0/19\n103.62.128.0/21\n103.62.156.0/22\n103.62.160.0/19\n103.62.192.0/22\n103.62.204.0/22\n103.62.208.0/20\n103.62.224.0/22\n103.63.32.0/19\n103.63.64.0/20\n103.63.80.0/21\n103.63.88.0/22\n103.63.140.0/22\n103.63.144.0/22\n103.63.152.0/22\n103.63.160.0/20\n103.63.176.0/21\n103.63.184.0/22\n103.63.192.0/20\n103.63.208.0/22\n103.63.240.0/20\n103.64.0.0/21\n103.64.24.0/21\n103.64.32.0/19\n103.64.64.0/18\n103.64.140.0/22\n103.64.144.0/22\n103.64.152.0/21\n103.64.160.0/19\n103.64.192.0/18\n103.65.0.0/20\n103.65.16.0/22\n103.65.36.0/22\n103.65.40.0/22\n103.65.48.0/20\n103.65.64.0/19\n103.65.100.0/22\n103.65.104.0/21\n103.65.112.0/22\n103.65.144.0/20\n103.65.160.0/20\n103.66.32.0/22\n103.66.40.0/22\n103.66.92.0/22\n103.66.108.0/22\n103.66.200.0/22\n103.66.216.0/22\n103.66.240.0/20\n103.67.0.0/21\n103.67.8.0/22\n103.67.100.0/22\n103.67.104.0/21\n103.67.112.0/20\n103.67.128.0/20\n103.67.144.0/21\n103.67.172.0/22\n103.67.192.0/22\n103.67.212.0/22\n103.67.252.0/22\n103.68.64.0/22\n103.68.88.0/22\n103.68.100.0/22\n103.68.128.0/22\n103.68.192.0/22\n103.69.16.0/22\n103.69.116.0/22\n103.69.132.0/22\n103.69.152.0/22\n103.69.212.0/22\n103.70.8.0/22\n103.70.148.0/22\n103.70.184.0/22\n103.70.220.0/22\n103.70.224.0/22\n103.70.236.0/22\n103.70.252.0/22\n103.71.0.0/22\n103.71.32.0/22\n103.71.48.0/22\n103.71.68.0/22\n103.71.72.0/22\n103.71.80.0/21\n103.71.88.0/22\n103.71.120.0/21\n103.71.128.0/22\n103.71.144.0/22\n103.71.196.0/22\n103.71.200.0/22\n103.71.232.0/22\n103.72.12.0/22\n103.72.16.0/20\n103.72.32.0/20\n103.72.48.0/21\n103.72.112.0/20\n103.72.128.0/21\n103.72.144.0/21\n103.72.172.0/22\n103.72.180.0/22\n103.72.224.0/19\n103.73.0.0/19\n103.73.48.0/22\n103.73.88.0/22\n103.73.96.0/22\n103.73.116.0/22\n103.73.120.0/22\n103.73.128.0/20\n103.73.144.0/22\n103.73.168.0/22\n103.73.176.0/22\n103.73.204.0/22\n103.73.208.0/22\n103.73.240.0/21\n103.73.248.0/22\n103.74.24.0/21\n103.74.32.0/20\n103.74.48.0/22\n103.74.56.0/21\n103.74.80.0/22\n103.74.124.0/22\n103.74.148.0/22\n103.74.152.0/21\n103.74.204.0/22\n103.74.232.0/22\n103.75.16.0/22\n103.75.88.0/21\n103.75.104.0/21\n103.75.112.0/22\n103.75.120.0/22\n103.75.128.0/22\n103.75.144.0/22\n103.75.152.0/22\n103.75.236.0/24\n103.76.60.0/22\n103.76.64.0/21\n103.76.72.0/22\n103.76.84.0/22\n103.76.92.0/22\n103.76.216.0/21\n103.76.224.0/22\n103.77.28.0/22\n103.77.52.0/22\n103.77.56.0/22\n103.77.72.0/22\n103.77.88.0/21\n103.77.132.0/22\n103.77.148.0/22\n103.77.220.0/22\n103.78.56.0/21\n103.78.64.0/21\n103.78.124.0/22\n103.78.172.0/22\n103.78.176.0/22\n103.78.196.0/22\n103.78.228.0/22\n103.79.24.0/21\n103.79.36.0/22\n103.79.40.0/21\n103.79.52.0/22\n103.79.56.0/21\n103.79.64.0/21\n103.79.80.0/21\n103.79.120.0/22\n103.79.136.0/22\n103.79.188.0/22\n103.79.192.0/20\n103.79.208.0/21\n103.79.240.0/22\n103.80.24.0/21\n103.80.44.0/22\n103.80.72.0/22\n103.80.176.0/21\n103.80.184.0/22\n103.80.192.0/22\n103.80.200.0/22\n103.80.232.0/22\n103.81.4.0/22\n103.81.8.0/22\n103.81.16.0/21\n103.81.44.0/22\n103.81.48.0/22\n103.81.96.0/22\n103.81.120.0/22\n103.81.148.0/22\n103.81.164.0/22\n103.81.168.0/22\n103.81.183.0/24\n103.81.184.0/22\n103.81.200.0/22\n103.81.232.0/22\n103.82.52.0/22\n103.82.60.0/22\n103.82.68.0/22\n103.82.84.0/22\n103.82.104.0/22\n103.82.224.0/22\n103.82.236.0/22\n103.83.44.0/22\n103.83.52.0/22\n103.83.60.0/22\n103.83.64.0/22\n103.83.72.0/22\n103.83.112.0/22\n103.83.120.0/22\n103.83.180.0/22\n103.84.0.0/22\n103.84.12.0/22\n103.84.16.0/20\n103.84.48.0/22\n103.84.64.0/22\n103.84.72.0/22\n103.84.92.0/22\n103.84.108.0/22\n103.84.136.0/22\n103.85.20.0/22\n103.85.24.0/22\n103.85.44.0/22\n103.85.48.0/22\n103.85.84.0/22\n103.85.136.0/22\n103.85.144.0/22\n103.85.164.0/22\n103.85.168.0/21\n103.85.176.0/22\n103.85.224.0/22\n103.86.28.0/22\n103.86.32.0/22\n103.86.44.0/22\n103.86.60.0/22\n103.86.68.0/22\n103.86.80.0/21\n103.86.88.0/22\n103.86.204.0/22\n103.86.208.0/20\n103.86.224.0/19\n103.87.0.0/21\n103.87.20.0/22\n103.87.32.0/22\n103.87.72.0/22\n103.87.96.0/22\n103.87.132.0/22\n103.87.180.0/22\n103.87.224.0/22\n103.88.4.0/22\n103.88.8.0/21\n103.88.16.0/21\n103.88.32.0/21\n103.88.60.0/22\n103.88.64.0/22\n103.88.72.0/22\n103.88.96.0/21\n103.88.164.0/22\n103.88.176.0/22\n103.88.184.0/21\n103.88.212.0/22\n103.89.28.0/22\n103.89.96.0/20\n103.89.112.0/21\n103.89.148.0/22\n103.89.172.0/22\n103.89.184.0/21\n103.89.192.0/19\n103.89.224.0/21\n103.90.52.0/22\n103.90.92.0/22\n103.90.100.0/22\n103.90.104.0/21\n103.90.112.0/20\n103.90.128.0/21\n103.90.152.0/22\n103.90.168.0/22\n103.90.173.0/24\n103.90.176.0/22\n103.90.188.0/22\n103.90.192.0/22\n103.91.36.0/22\n103.91.40.0/22\n103.91.108.0/22\n103.91.152.0/22\n103.91.176.0/22\n103.91.200.0/22\n103.91.208.0/21\n103.91.219.0/24\n103.91.236.0/22\n103.91.252.0/22\n103.92.0.0/20\n103.92.48.0/20\n103.92.64.0/20\n103.92.80.0/22\n103.92.86.0/24\n103.92.88.0/22\n103.92.108.0/22\n103.92.124.0/22\n103.92.128.0/24\n103.92.132.0/22\n103.92.156.0/22\n103.92.164.0/22\n103.92.168.0/21\n103.92.176.0/20\n103.92.192.0/22\n103.92.236.0/22\n103.92.240.0/20\n103.93.0.0/21\n103.93.28.0/22\n103.93.76.0/22\n103.93.84.0/22\n103.93.121.0/24\n103.93.152.0/22\n103.93.180.0/22\n103.93.204.0/22\n103.94.12.0/22\n103.94.20.0/22\n103.94.28.0/22\n103.94.32.0/20\n103.94.72.0/22\n103.94.88.0/22\n103.94.116.0/22\n103.94.160.0/22\n103.94.180.0/22\n103.94.200.0/22\n103.95.28.0/22\n103.95.52.0/22\n103.95.64.0/21\n103.95.88.0/21\n103.95.116.0/22\n103.95.128.0/22\n103.95.136.0/21\n103.95.144.0/22\n103.95.152.0/22\n103.95.207.0/24\n103.95.216.0/21\n103.95.224.0/22\n103.95.236.0/22\n103.95.240.0/20\n103.96.0.0/22\n103.96.8.0/22\n103.96.80.0/22\n103.96.124.0/22\n103.96.136.0/22\n103.96.140.0/24\n103.96.148.0/22\n103.96.152.0/21\n103.96.160.0/19\n103.96.192.0/20\n103.96.208.0/21\n103.96.216.0/22\n103.97.8.0/21\n103.97.16.0/20\n103.97.32.0/21\n103.97.40.0/22\n103.97.56.0/21\n103.97.64.0/21\n103.97.72.0/22\n103.97.80.0/22\n103.97.112.0/21\n103.97.128.0/22\n103.97.144.0/21\n103.97.188.0/22\n103.97.192.0/22\n103.97.224.0/22\n103.97.228.0/23\n103.98.28.0/23\n103.98.40.0/21\n103.98.48.0/22\n103.98.56.0/22\n103.98.80.0/22\n103.98.88.0/21\n103.98.96.0/21\n103.98.124.0/22\n103.98.136.0/21\n103.98.144.0/22\n103.98.164.0/22\n103.98.168.0/22\n103.98.180.0/22\n103.98.196.0/22\n103.98.216.0/21\n103.98.224.0/21\n103.98.232.0/22\n103.98.240.0/20\n103.99.40.0/23\n103.99.52.0/22\n103.99.56.0/21\n103.99.76.0/22\n103.99.104.0/22\n103.99.116.0/22\n103.99.120.0/22\n103.99.152.0/22\n103.99.220.0/22\n103.99.232.0/21\n103.100.0.0/22\n103.100.32.0/22\n103.100.40.0/22\n103.100.48.0/20\n103.100.64.0/21\n103.100.88.0/22\n103.100.116.0/22\n103.100.140.0/22\n103.100.144.0/22\n103.100.236.0/22\n103.100.240.0/22\n103.100.248.0/21\n103.101.4.0/22\n103.101.8.0/21\n103.101.28.0/22\n103.101.60.0/22\n103.101.120.0/21\n103.101.144.0/21\n103.101.153.0/24\n103.101.180.0/22\n103.101.184.0/22\n103.102.76.0/22\n103.102.80.0/22\n103.102.168.0/21\n103.102.180.0/22\n103.102.184.0/21\n103.102.192.0/21\n103.102.200.0/22\n103.102.208.0/21\n103.103.12.0/22\n103.103.16.0/22\n103.103.36.0/22\n103.103.68.0/22\n103.103.72.0/22\n103.103.176.0/22\n103.103.188.0/22\n103.103.200.0/21\n103.103.220.0/22\n103.103.224.0/21\n103.103.232.0/22\n103.103.248.0/21\n103.104.0.0/21\n103.104.36.0/22\n103.104.40.0/22\n103.104.64.0/22\n103.104.104.0/22\n103.104.152.0/22\n103.104.168.0/21\n103.104.188.0/22\n103.104.198.0/23\n103.104.252.0/22\n103.105.0.0/21\n103.105.12.0/22\n103.105.16.0/22\n103.105.23.0/24\n103.105.56.0/21\n103.105.116.0/22\n103.105.132.0/22\n103.105.180.0/22\n103.105.184.0/22\n103.105.200.0/21\n103.105.220.0/22\n103.106.36.0/22\n103.106.40.0/21\n103.106.60.0/22\n103.106.68.0/22\n103.106.96.0/22\n103.106.120.0/22\n103.106.128.0/21\n103.106.160.0/22\n103.106.188.0/22\n103.106.196.0/22\n103.106.202.0/23\n103.106.212.0/22\n103.106.244.0/22\n103.106.252.0/22\n103.107.0.0/22\n103.107.8.0/24\n103.107.28.0/22\n103.107.32.0/22\n103.107.44.0/22\n103.107.72.0/22\n103.107.108.0/22\n103.107.164.0/22\n103.107.168.0/22\n103.107.188.0/22\n103.107.192.0/22\n103.107.208.0/20\n103.108.52.0/22\n103.108.64.0/22\n103.108.160.0/21\n103.108.184.0/23\n103.108.188.0/23\n103.108.192.0/21\n103.108.208.0/21\n103.108.224.0/22\n103.108.244.0/22\n103.108.251.0/24\n103.109.20.0/22\n103.109.48.0/22\n103.109.88.0/22\n103.109.106.0/23\n103.109.248.0/22\n103.110.32.0/22\n103.110.80.0/23\n103.110.92.0/22\n103.110.100.0/22\n103.110.116.0/22\n103.110.127.0/24\n103.110.128.0/23\n103.110.131.0/24\n103.110.132.0/22\n103.110.136.0/22\n103.110.152.0/21\n103.110.188.0/22\n103.110.204.0/22\n103.111.38.0/23\n103.111.64.0/22\n103.111.172.0/22\n103.111.252.0/22\n103.112.28.0/22\n103.112.68.0/22\n103.112.72.0/22\n103.112.88.0/21\n103.112.96.0/22\n103.112.108.0/22\n103.112.112.0/21\n103.112.140.0/22\n103.112.172.0/22\n103.112.184.0/22\n103.112.208.0/22\n103.113.4.0/22\n103.113.92.0/22\n103.113.144.0/22\n103.113.220.0/22\n103.113.232.0/21\n103.114.4.0/22\n103.114.28.0/22\n103.114.68.0/22\n103.114.72.0/22\n103.114.100.0/22\n103.114.132.0/22\n103.114.148.0/22\n103.114.156.0/22\n103.114.176.0/22\n103.114.212.0/22\n103.114.236.0/22\n103.114.240.0/22\n103.115.16.0/22\n103.115.40.0/21\n103.115.48.0/20\n103.115.64.0/21\n103.115.92.0/22\n103.115.120.0/22\n103.115.148.0/22\n103.115.204.0/23\n103.115.248.0/22\n103.116.20.0/22\n103.116.40.0/22\n103.116.64.0/22\n103.116.72.0/21\n103.116.92.0/22\n103.116.120.0/22\n103.116.128.0/22\n103.116.132.0/23\n103.116.148.0/22\n103.116.184.0/22\n103.116.206.0/23\n103.116.220.0/22\n103.116.224.0/21\n103.117.16.0/22\n103.117.72.0/22\n103.117.88.0/22\n103.117.132.0/22\n103.117.136.0/22\n103.117.188.0/22\n103.117.220.0/22\n103.118.19.0/24\n103.118.36.0/22\n103.118.52.0/22\n103.118.56.0/21\n103.118.64.0/21\n103.118.72.0/22\n103.118.88.0/22\n103.118.173.0/24\n103.118.192.0/19\n103.118.240.0/20\n103.119.0.0/22\n103.119.12.0/22\n103.119.16.0/22\n103.119.28.0/22\n103.119.44.0/22\n103.119.104.0/22\n103.119.115.0/24\n103.119.156.0/22\n103.119.180.0/22\n103.119.200.0/22\n103.119.224.0/22\n103.120.52.0/22\n103.120.72.0/22\n103.120.76.0/24\n103.120.88.0/22\n103.120.96.0/21\n103.120.140.0/22\n103.120.196.0/22\n103.120.224.0/22\n103.121.52.0/22\n103.121.92.0/22\n103.121.160.0/21\n103.121.250.0/24\n103.121.252.0/22\n103.122.48.0/22\n103.122.176.0/22\n103.122.192.0/22\n103.122.240.0/22\n103.123.4.0/22\n103.123.56.0/22\n103.123.88.0/21\n103.123.116.0/22\n103.123.160.0/22\n103.123.176.0/22\n103.123.200.0/21\n103.123.208.0/21\n103.124.24.0/22\n103.124.48.0/22\n103.124.64.0/22\n103.124.212.0/22\n103.124.216.0/22\n103.125.20.0/22\n103.125.44.0/22\n103.125.132.0/22\n103.125.164.0/22\n103.125.196.0/22\n103.125.236.0/22\n103.125.248.0/22\n103.126.0.0/22\n103.126.16.0/22\n103.126.44.0/22\n103.126.100.0/22\n103.126.124.0/22\n103.126.128.0/21\n103.126.208.0/22\n103.126.241.0/24\n103.129.52.0/22\n103.130.132.0/22\n103.130.152.0/24\n103.130.160.0/22\n103.130.228.0/22\n103.131.20.0/22\n103.131.36.0/22\n103.131.152.0/22\n103.131.168.0/22\n103.131.176.0/22\n103.131.224.0/21\n103.131.240.0/22\n103.132.60.0/22\n103.132.64.0/20\n103.132.80.0/22\n103.132.104.0/21\n103.132.112.0/21\n103.132.120.0/22\n103.132.160.0/21\n103.132.188.0/22\n103.132.208.0/21\n103.132.234.0/23\n103.133.12.0/22\n103.133.40.0/22\n103.133.128.0/22\n103.133.136.0/22\n103.133.176.0/22\n103.133.232.0/22\n103.134.12.0/24\n103.134.196.0/22\n103.135.80.0/22\n103.135.124.0/22\n103.135.148.0/22\n103.135.156.0/22\n103.135.160.0/21\n103.135.176.0/22\n103.135.184.0/22\n103.135.192.0/21\n103.135.236.0/22\n103.136.128.0/22\n103.136.232.0/22\n103.137.58.0/23\n103.137.60.0/24\n103.137.76.0/22\n103.137.136.0/23\n103.137.149.0/24\n103.137.180.0/22\n103.137.236.0/22\n103.138.2.0/23\n103.138.12.0/23\n103.138.80.0/22\n103.138.134.0/23\n103.138.156.0/23\n103.138.208.0/23\n103.138.220.0/23\n103.138.246.0/23\n103.138.248.0/23\n103.139.0.0/22\n103.139.22.0/23\n103.139.113.0/24\n103.139.134.0/23\n103.139.136.0/23\n103.139.172.0/23\n103.139.200.0/23\n103.139.204.0/23\n103.139.212.0/23\n103.140.8.0/23\n103.140.14.0/23\n103.140.46.0/23\n103.140.70.0/23\n103.140.126.0/23\n103.140.140.0/23\n103.140.144.0/23\n103.140.152.0/23\n103.140.192.0/22\n103.140.228.0/23\n103.141.10.0/23\n103.141.36.0/23\n103.141.58.0/23\n103.141.128.0/23\n103.141.186.0/23\n103.141.190.0/23\n103.141.242.0/23\n103.142.0.0/23\n103.142.28.0/23\n103.142.58.0/23\n103.142.82.0/23\n103.142.96.0/23\n103.142.102.0/23\n103.142.122.0/23\n103.142.126.0/24\n103.142.128.0/23\n103.142.140.0/23\n103.142.154.0/23\n103.142.156.0/23\n103.142.172.0/23\n103.142.180.0/23\n103.142.186.0/23\n103.142.190.0/23\n103.142.220.0/23\n103.142.230.0/24\n103.142.234.0/23\n103.142.238.0/23\n103.142.248.0/23\n103.143.16.0/22\n103.143.31.0/24\n103.143.74.0/23\n103.143.120.0/23\n103.143.124.0/23\n103.143.132.0/22\n103.143.174.0/23\n103.143.228.0/23\n103.144.40.0/23\n103.144.52.0/23\n103.144.66.0/23\n103.144.70.0/23\n103.144.72.0/23\n103.144.88.0/24\n103.144.108.0/23\n103.144.136.0/23\n103.144.148.0/23\n103.144.158.0/23\n103.144.240.0/23\n103.145.38.0/23\n103.145.40.0/22\n103.145.60.0/23\n103.145.72.0/23\n103.145.80.0/23\n103.145.86.0/23\n103.145.92.0/22\n103.145.98.0/23\n103.145.106.0/23\n103.145.122.0/23\n103.145.188.0/22\n103.146.6.0/23\n103.146.72.0/23\n103.146.88.0/22\n103.146.124.0/23\n103.192.0.0/19\n103.192.48.0/21\n103.192.56.0/22\n103.192.84.0/22\n103.192.88.0/21\n103.192.96.0/20\n103.192.112.0/22\n103.192.128.0/20\n103.192.144.0/22\n103.192.164.0/22\n103.192.188.0/22\n103.192.208.0/21\n103.192.216.0/22\n103.192.252.0/22\n103.193.40.0/21\n103.193.120.0/21\n103.193.140.0/22\n103.193.144.0/21\n103.193.160.0/22\n103.193.188.0/22\n103.193.192.0/22\n103.193.212.0/22\n103.193.216.0/21\n103.193.224.0/20\n103.193.240.0/22\n103.194.16.0/22\n103.195.104.0/22\n103.195.112.0/22\n103.195.136.0/22\n103.195.148.0/22\n103.195.152.0/22\n103.195.160.0/22\n103.195.192.0/22\n103.196.60.0/22\n103.196.64.0/22\n103.196.72.0/22\n103.196.88.0/21\n103.196.96.0/22\n103.196.168.0/22\n103.196.204.0/22\n103.197.180.0/22\n103.197.228.0/22\n103.198.20.0/22\n103.198.60.0/22\n103.198.64.0/22\n103.198.72.0/22\n103.198.124.0/22\n103.198.156.0/22\n103.198.180.0/22\n103.198.196.0/22\n103.198.200.0/22\n103.198.216.0/21\n103.198.224.0/20\n103.198.240.0/21\n103.199.164.0/22\n103.199.196.0/22\n103.199.228.0/22\n103.199.248.0/21\n103.200.28.0/22\n103.200.32.0/22\n103.200.52.0/22\n103.200.64.0/21\n103.200.136.0/21\n103.200.144.0/20\n103.200.160.0/19\n103.200.192.0/22\n103.200.220.0/22\n103.200.224.0/19\n103.201.0.0/20\n103.201.16.0/21\n103.201.28.0/22\n103.201.32.0/19\n103.201.64.0/22\n103.201.76.0/22\n103.201.80.0/20\n103.201.96.0/20\n103.201.112.0/21\n103.201.120.0/22\n103.201.152.0/21\n103.201.160.0/19\n103.201.192.0/18\n103.202.0.0/19\n103.202.32.0/20\n103.202.56.0/21\n103.202.64.0/18\n103.202.128.0/20\n103.202.144.0/22\n103.202.152.0/21\n103.202.160.0/19\n103.202.192.0/20\n103.202.212.0/22\n103.202.228.0/22\n103.202.236.0/22\n103.202.240.0/20\n103.203.0.0/19\n103.203.32.0/22\n103.203.52.0/22\n103.203.56.0/22\n103.203.96.0/19\n103.203.128.0/22\n103.203.140.0/22\n103.203.164.0/22\n103.203.168.0/22\n103.203.192.0/22\n103.203.200.0/22\n103.203.212.0/22\n103.203.216.0/22\n103.204.24.0/22\n103.204.72.0/22\n103.204.88.0/22\n103.204.112.0/22\n103.204.136.0/21\n103.204.144.0/21\n103.204.152.0/22\n103.204.196.0/22\n103.204.232.0/21\n103.205.4.0/22\n103.205.8.0/22\n103.205.40.0/21\n103.205.52.0/22\n103.205.108.0/22\n103.205.116.0/22\n103.205.120.0/22\n103.205.136.0/22\n103.205.162.0/24\n103.205.188.0/22\n103.205.192.0/21\n103.205.200.0/22\n103.205.236.0/22\n103.205.248.0/21\n103.206.0.0/22\n103.206.44.0/22\n103.206.108.0/22\n103.206.148.0/22\n103.207.48.0/22\n103.207.104.0/22\n103.207.164.0/22\n103.207.184.0/21\n103.207.192.0/20\n103.207.208.0/21\n103.207.220.0/22\n103.207.228.0/22\n103.207.232.0/22\n103.208.12.0/22\n103.208.16.0/22\n103.208.28.0/22\n103.208.40.0/21\n103.208.48.0/22\n103.208.148.0/22\n103.209.112.0/22\n103.209.136.0/22\n103.209.200.0/22\n103.209.208.0/22\n103.209.216.0/22\n103.210.0.0/22\n103.210.20.0/22\n103.210.96.0/22\n103.210.156.0/22\n103.210.160.0/19\n103.210.216.0/22\n103.211.44.0/22\n103.211.96.0/21\n103.211.156.0/22\n103.211.164.0/22\n103.211.192.0/22\n103.211.220.0/22\n103.211.224.0/22\n103.211.248.0/22\n103.212.0.0/20\n103.212.32.0/22\n103.212.44.0/22\n103.212.48.0/22\n103.212.84.0/22\n103.212.100.0/22\n103.212.104.0/21\n103.212.148.0/22\n103.212.164.0/22\n103.212.196.0/22\n103.212.200.0/22\n103.212.228.0/22\n103.212.252.0/22\n103.213.40.0/21\n103.213.48.0/20\n103.213.64.0/19\n103.213.96.0/22\n103.213.132.0/22\n103.213.136.0/21\n103.213.144.0/20\n103.213.160.0/19\n103.213.248.0/22\n103.214.32.0/22\n103.214.48.0/22\n103.214.84.0/22\n103.214.168.0/22\n103.214.212.0/22\n103.214.240.0/21\n103.215.28.0/22\n103.215.32.0/21\n103.215.44.0/22\n103.215.48.0/22\n103.215.100.0/22\n103.215.104.0/21\n103.215.116.0/22\n103.215.120.0/22\n103.215.140.0/22\n103.215.184.0/22\n103.215.228.0/22\n103.216.4.0/22\n103.216.8.0/21\n103.216.16.0/20\n103.216.32.0/20\n103.216.64.0/22\n103.216.108.0/22\n103.216.136.0/22\n103.216.152.0/22\n103.216.224.0/21\n103.216.240.0/20\n103.217.0.0/18\n103.217.168.0/22\n103.217.180.0/22\n103.217.184.0/21\n103.217.192.0/20\n103.218.0.0/22\n103.218.8.0/21\n103.218.16.0/21\n103.218.28.0/22\n103.218.32.0/19\n103.218.64.0/19\n103.218.184.0/22\n103.218.192.0/20\n103.218.208.0/21\n103.218.216.0/22\n103.219.24.0/21\n103.219.32.0/21\n103.219.64.0/22\n103.219.84.0/22\n103.219.88.0/21\n103.219.96.0/21\n103.219.176.0/22\n103.219.184.0/22\n103.220.48.0/20\n103.220.64.0/22\n103.220.92.0/22\n103.220.96.0/20\n103.220.116.0/22\n103.220.120.0/21\n103.220.128.0/20\n103.220.144.0/21\n103.220.152.0/22\n103.220.160.0/19\n103.220.192.0/21\n103.220.200.0/22\n103.220.240.0/20\n103.221.0.0/19\n103.221.32.0/20\n103.221.48.0/22\n103.221.88.0/21\n103.221.96.0/19\n103.221.128.0/18\n103.221.192.0/20\n103.222.0.0/20\n103.222.16.0/22\n103.222.24.0/21\n103.222.32.0/19\n103.222.64.0/18\n103.222.128.0/18\n103.222.192.0/19\n103.222.224.0/21\n103.222.232.0/22\n103.222.240.0/21\n103.223.16.0/20\n103.223.32.0/19\n103.223.64.0/18\n103.223.128.0/21\n103.223.140.0/22\n103.223.144.0/20\n103.223.160.0/20\n103.223.176.0/21\n103.223.188.0/22\n103.223.192.0/18\n103.224.0.0/22\n103.224.40.0/21\n103.224.60.0/22\n103.224.80.0/22\n103.224.220.0/22\n103.224.224.0/21\n103.224.232.0/22\n103.225.84.0/22\n103.226.16.0/22\n103.226.40.0/22\n103.226.56.0/21\n103.226.80.0/22\n103.226.132.0/22\n103.226.156.0/22\n103.226.180.0/22\n103.226.196.0/22\n103.227.48.0/22\n103.227.72.0/21\n103.227.80.0/22\n103.227.100.0/22\n103.227.120.0/22\n103.227.132.0/22\n103.227.136.0/22\n103.227.196.0/22\n103.227.204.0/22\n103.227.212.0/22\n103.227.228.0/22\n103.228.12.0/22\n103.228.28.0/22\n103.228.68.0/22\n103.228.88.0/22\n103.228.128.0/22\n103.228.136.0/22\n103.228.160.0/22\n103.228.176.0/22\n103.228.204.0/22\n103.228.208.0/22\n103.228.228.0/22\n103.228.232.0/22\n103.229.20.0/22\n103.229.60.0/22\n103.229.136.0/22\n103.229.148.0/22\n103.229.172.0/22\n103.229.212.0/22\n103.229.216.0/21\n103.229.228.0/22\n103.229.236.0/22\n103.229.240.0/22\n103.230.0.0/22\n103.230.28.0/22\n103.230.44.0/22\n103.230.96.0/22\n103.230.196.0/22\n103.230.200.0/21\n103.230.212.0/22\n103.230.236.0/22\n103.231.16.0/21\n103.231.64.0/21\n103.231.144.0/22\n103.231.180.0/22\n103.231.184.0/22\n103.231.244.0/22\n103.232.4.0/22\n103.232.144.0/22\n103.232.188.0/22\n103.232.212.0/22\n103.233.4.0/22\n103.233.44.0/22\n103.233.52.0/22\n103.233.104.0/22\n103.233.128.0/22\n103.233.136.0/22\n103.233.228.0/22\n103.234.0.0/22\n103.234.20.0/22\n103.234.56.0/22\n103.234.128.0/22\n103.234.172.0/22\n103.234.180.0/22\n103.234.244.0/22\n103.235.16.0/22\n103.235.48.0/22\n103.235.56.0/21\n103.235.80.0/21\n103.235.128.0/20\n103.235.144.0/21\n103.235.184.0/22\n103.235.192.0/22\n103.235.200.0/22\n103.235.220.0/22\n103.235.224.0/19\n103.236.0.0/18\n103.236.64.0/19\n103.236.96.0/22\n103.236.120.0/22\n103.236.184.0/22\n103.236.220.0/22\n103.236.232.0/22\n103.236.240.0/20\n103.237.0.0/20\n103.237.24.0/21\n103.237.68.0/22\n103.237.88.0/22\n103.237.152.0/22\n103.237.176.0/20\n103.237.192.0/18\n103.238.0.0/21\n103.238.16.0/20\n103.238.32.0/20\n103.238.48.0/21\n103.238.56.0/22\n103.238.88.0/21\n103.238.96.0/22\n103.238.132.0/22\n103.238.140.0/22\n103.238.144.0/22\n103.238.160.0/19\n103.238.196.0/22\n103.238.204.0/22\n103.238.252.0/22\n103.239.0.0/22\n103.239.44.0/22\n103.239.68.0/22\n103.239.96.0/22\n103.239.152.0/21\n103.239.176.0/21\n103.239.184.0/22\n103.239.192.0/21\n103.239.204.0/22\n103.239.208.0/22\n103.239.224.0/22\n103.239.244.0/22\n103.240.16.0/22\n103.240.36.0/22\n103.240.72.0/22\n103.240.84.0/22\n103.240.124.0/22\n103.240.156.0/22\n103.240.172.0/22\n103.240.188.0/22\n103.240.244.0/22\n103.241.12.0/22\n103.241.72.0/22\n103.241.92.0/22\n103.241.96.0/22\n103.241.160.0/22\n103.241.184.0/21\n103.241.220.0/22\n103.242.64.0/22\n103.242.128.0/21\n103.242.160.0/22\n103.242.168.0/21\n103.242.176.0/22\n103.242.200.0/22\n103.242.212.0/22\n103.242.220.0/22\n103.242.240.0/22\n103.243.136.0/22\n103.243.252.0/22\n103.244.16.0/22\n103.244.58.0/23\n103.244.60.0/22\n103.244.64.0/20\n103.244.80.0/21\n103.244.116.0/22\n103.244.164.0/22\n103.244.232.0/22\n103.244.252.0/22\n103.245.23.0/24\n103.245.52.0/22\n103.245.60.0/22\n103.245.80.0/22\n103.245.124.0/22\n103.245.128.0/22\n103.246.8.0/21\n103.246.120.0/21\n103.246.132.0/22\n103.246.152.0/21\n103.247.168.0/21\n103.247.176.0/22\n103.247.200.0/22\n103.247.212.0/22\n103.248.0.0/23\n103.248.64.0/22\n103.248.100.0/22\n103.248.124.0/22\n103.248.152.0/22\n103.248.168.0/22\n103.248.192.0/22\n103.248.212.0/22\n103.248.220.0/22\n103.248.224.0/22\n103.249.8.0/21\n103.249.52.0/22\n103.249.104.0/22\n103.249.128.0/22\n103.249.136.0/22\n103.249.144.0/22\n103.249.164.0/22\n103.249.168.0/21\n103.249.176.0/22\n103.249.188.0/22\n103.249.192.0/22\n103.249.244.0/22\n103.249.252.0/22\n103.250.32.0/22\n103.250.104.0/22\n103.250.124.0/22\n103.250.180.0/22\n103.250.192.0/22\n103.250.216.0/22\n103.250.224.0/22\n103.250.236.0/22\n103.250.248.0/21\n103.251.32.0/21\n103.251.84.0/22\n103.251.96.0/22\n103.251.124.0/22\n103.251.128.0/22\n103.251.160.0/22\n103.251.192.0/22\n103.251.204.0/22\n103.251.236.0/22\n103.251.240.0/22\n103.252.28.0/22\n103.252.36.0/22\n103.252.64.0/22\n103.252.96.0/22\n103.252.104.0/22\n103.252.172.0/22\n103.252.204.0/22\n103.252.208.0/22\n103.252.232.0/22\n103.252.248.0/22\n103.253.4.0/22\n103.253.60.0/22\n103.253.204.0/22\n103.253.220.0/22\n103.253.224.0/22\n103.253.232.0/22\n103.254.8.0/22\n103.254.20.0/22\n103.254.64.0/20\n103.254.112.0/22\n103.254.176.0/22\n103.254.188.0/22\n103.254.196.0/24\n103.254.220.0/22\n103.255.56.0/22\n103.255.68.0/22\n103.255.88.0/21\n103.255.136.0/21\n103.255.184.0/22\n103.255.200.0/22\n103.255.212.0/22\n103.255.228.0/22\n106.0.0.0/24\n106.0.2.0/23\n106.0.4.0/22\n106.0.8.0/21\n106.0.16.0/20\n106.0.44.0/22\n106.0.64.0/18\n106.2.0.0/15\n106.4.0.0/14\n106.8.0.0/15\n106.11.0.0/16\n106.12.0.0/14\n106.16.0.0/12\n106.32.0.0/12\n106.48.0.0/15\n106.50.0.0/16\n106.52.0.0/14\n106.56.0.0/13\n106.74.0.0/15\n106.80.0.0/12\n106.108.0.0/14\n106.112.0.0/12\n106.224.0.0/12\n109.244.0.0/16\n110.6.0.0/15\n110.16.0.0/14\n110.34.40.0/21\n110.40.0.0/14\n110.44.12.0/22\n110.44.144.0/20\n110.48.0.0/16\n110.51.0.0/16\n110.52.0.0/15\n110.56.0.0/13\n110.64.0.0/15\n110.72.0.0/15\n110.75.0.0/16\n110.76.0.0/18\n110.76.132.0/22\n110.76.156.0/22\n110.76.184.0/22\n110.76.192.0/18\n110.77.0.0/17\n110.80.0.0/13\n110.88.0.0/14\n110.92.68.0/22\n110.93.32.0/19\n110.94.0.0/15\n110.96.0.0/11\n110.152.0.0/14\n110.156.0.0/15\n110.165.32.0/19\n110.166.0.0/15\n110.172.192.0/18\n110.173.0.0/19\n110.173.32.0/20\n110.173.64.0/18\n110.173.192.0/19\n110.176.0.0/12\n110.192.0.0/11\n110.228.0.0/14\n110.232.32.0/19\n110.236.0.0/15\n110.240.0.0/12\n111.0.0.0/10\n111.66.0.0/16\n111.67.192.0/20\n111.68.64.0/19\n111.72.0.0/13\n111.85.0.0/16\n111.91.192.0/19\n111.92.248.0/21\n111.112.0.0/14\n111.116.0.0/15\n111.118.200.0/21\n111.119.64.0/18\n111.119.128.0/19\n111.120.0.0/14\n111.124.0.0/16\n111.126.0.0/15\n111.128.0.0/11\n111.160.0.0/13\n111.170.0.0/16\n111.172.0.0/14\n111.176.0.0/13\n111.186.0.0/15\n111.192.0.0/12\n111.208.0.0/13\n111.221.28.0/24\n111.221.128.0/17\n111.222.0.0/16\n111.223.4.0/22\n111.223.8.0/21\n111.223.16.0/22\n111.223.240.0/22\n111.223.248.0/22\n111.224.0.0/13\n111.235.96.0/19\n111.235.156.0/22\n111.235.160.0/19\n112.0.0.0/10\n112.64.0.0/14\n112.73.0.0/16\n112.74.0.0/15\n112.80.0.0/12\n112.96.0.0/13\n112.109.128.0/17\n112.111.0.0/16\n112.112.0.0/14\n112.116.0.0/15\n112.122.0.0/15\n112.124.0.0/14\n112.128.0.0/14\n112.132.0.0/16\n112.137.48.0/21\n112.192.0.0/14\n112.224.0.0/11\n113.0.0.0/13\n113.8.0.0/15\n113.11.192.0/19\n113.12.0.0/14\n113.16.0.0/15\n113.18.0.0/16\n113.21.232.0/21\n113.24.0.0/14\n113.31.0.0/16\n113.44.0.0/14\n113.48.0.0/14\n113.52.160.0/19\n113.52.228.0/22\n113.54.0.0/15\n113.56.0.0/15\n113.58.0.0/16\n113.59.0.0/17\n113.59.224.0/22\n113.62.0.0/15\n113.64.0.0/10\n113.128.0.0/15\n113.130.96.0/20\n113.130.112.0/21\n113.132.0.0/14\n113.136.0.0/13\n113.194.0.0/15\n113.197.100.0/22\n113.200.0.0/15\n113.202.0.0/16\n113.204.0.0/14\n113.208.96.0/19\n113.208.128.0/17\n113.209.0.0/16\n113.212.0.0/18\n113.212.64.0/22\n113.212.88.0/22\n113.212.100.0/22\n113.212.184.0/21\n113.213.0.0/17\n113.214.0.0/15\n113.218.0.0/15\n113.220.0.0/14\n113.224.0.0/12\n113.240.0.0/13\n113.248.0.0/14\n114.28.0.0/16\n114.31.64.0/21\n114.54.0.0/15\n114.60.0.0/14\n114.64.0.0/14\n114.68.0.0/16\n114.79.64.0/18\n114.80.0.0/12\n114.96.0.0/13\n114.104.0.0/14\n114.110.0.0/20\n114.110.64.0/18\n114.111.0.0/19\n114.111.160.0/19\n114.112.0.0/14\n114.116.0.0/15\n114.118.0.0/16\n114.119.0.0/17\n114.119.192.0/18\n114.132.0.0/16\n114.135.0.0/16\n114.138.0.0/15\n114.141.64.0/21\n114.141.80.0/21\n114.141.128.0/18\n114.196.0.0/15\n114.198.248.0/21\n114.208.0.0/12\n114.224.0.0/11\n115.24.0.0/14\n115.28.0.0/15\n115.31.64.0/20\n115.32.0.0/14\n115.42.56.0/22\n115.44.0.0/14\n115.48.0.0/12\n115.69.64.0/20\n115.84.0.0/18\n115.84.192.0/19\n115.85.192.0/18\n115.100.0.0/14\n115.104.0.0/14\n115.120.0.0/14\n115.124.16.0/20\n115.148.0.0/14\n115.152.0.0/13\n115.166.64.0/19\n115.168.0.0/13\n115.180.0.0/14\n115.187.0.0/20\n115.190.0.0/15\n115.192.0.0/11\n115.224.0.0/12\n116.0.8.0/21\n116.0.24.0/21\n116.1.0.0/16\n116.2.0.0/15\n116.4.0.0/14\n116.8.0.0/14\n116.13.0.0/16\n116.16.0.0/12\n116.50.0.0/20\n116.52.0.0/14\n116.56.0.0/15\n116.58.128.0/20\n116.58.208.0/20\n116.60.0.0/14\n116.66.0.0/17\n116.66.176.0/22\n116.68.136.0/21\n116.68.176.0/21\n116.69.0.0/16\n116.70.0.0/17\n116.76.0.0/14\n116.85.0.0/16\n116.89.144.0/20\n116.89.240.0/22\n116.90.80.0/20\n116.90.184.0/21\n116.95.0.0/16\n116.112.0.0/14\n116.116.0.0/15\n116.128.0.0/10\n116.192.0.0/16\n116.193.16.0/20\n116.193.32.0/19\n116.193.152.0/22\n116.193.164.0/22\n116.193.176.0/21\n116.194.0.0/15\n116.196.0.0/16\n116.197.160.0/21\n116.198.0.0/16\n116.199.0.0/17\n116.199.128.0/19\n116.204.0.0/17\n116.204.132.0/22\n116.204.168.0/22\n116.204.216.0/22\n116.204.232.0/21\n116.204.244.0/22\n116.205.0.0/16\n116.206.92.0/22\n116.206.176.0/22\n116.207.0.0/16\n116.208.0.0/14\n116.212.160.0/20\n116.213.44.0/22\n116.213.64.0/18\n116.213.128.0/17\n116.214.32.0/19\n116.214.64.0/20\n116.214.128.0/17\n116.215.0.0/16\n116.216.0.0/14\n116.224.0.0/12\n116.242.0.0/15\n116.244.0.0/14\n116.248.0.0/15\n116.251.64.0/18\n116.252.0.0/15\n116.254.104.0/21\n116.254.128.0/17\n116.255.128.0/17\n117.8.0.0/13\n117.21.0.0/16\n117.22.0.0/15\n117.24.0.0/13\n117.32.0.0/13\n117.40.0.0/14\n117.44.0.0/15\n117.48.0.0/14\n117.53.48.0/20\n117.53.176.0/20\n117.57.0.0/16\n117.58.0.0/17\n117.59.0.0/16\n117.60.0.0/14\n117.64.0.0/13\n117.72.0.0/15\n117.74.64.0/19\n117.74.128.0/17\n117.75.0.0/16\n117.76.0.0/14\n117.80.0.0/12\n117.100.0.0/15\n117.103.16.0/20\n117.103.40.0/21\n117.103.72.0/21\n117.103.128.0/20\n117.104.168.0/21\n117.106.0.0/15\n117.112.0.0/13\n117.120.64.0/18\n117.120.128.0/17\n117.121.0.0/17\n117.121.128.0/18\n117.121.192.0/21\n117.122.128.0/17\n117.124.0.0/14\n117.128.0.0/10\n118.24.0.0/15\n118.26.0.0/16\n118.28.0.0/14\n118.64.0.0/15\n118.66.0.0/16\n118.67.112.0/20\n118.72.0.0/13\n118.80.0.0/15\n118.84.0.0/15\n118.88.32.0/19\n118.88.64.0/18\n118.88.128.0/17\n118.89.0.0/16\n118.91.240.0/20\n118.102.16.0/20\n118.102.32.0/21\n118.103.164.0/22\n118.103.168.0/21\n118.103.176.0/22\n118.107.180.0/22\n118.112.0.0/13\n118.120.0.0/14\n118.124.0.0/15\n118.126.0.0/16\n118.127.128.0/19\n118.132.0.0/14\n118.144.0.0/14\n118.178.0.0/16\n118.180.0.0/14\n118.184.0.0/16\n118.186.0.0/15\n118.188.0.0/16\n118.190.0.0/15\n118.192.0.0/16\n118.193.0.0/20\n118.193.32.0/19\n118.193.64.0/20\n118.193.96.0/19\n118.193.128.0/17\n118.194.0.0/15\n118.196.0.0/14\n118.202.0.0/15\n118.204.0.0/14\n118.212.0.0/15\n118.215.192.0/18\n118.224.0.0/14\n118.228.0.0/15\n118.230.0.0/16\n118.239.0.0/16\n118.242.0.0/16\n118.244.0.0/14\n118.248.0.0/13\n119.0.0.0/15\n119.2.0.0/19\n119.2.128.0/17\n119.3.0.0/16\n119.4.0.0/14\n119.10.0.0/17\n119.15.136.0/21\n119.16.0.0/16\n119.18.192.0/20\n119.18.208.0/21\n119.18.224.0/19\n119.19.0.0/16\n119.20.0.0/14\n119.27.64.0/18\n119.27.128.0/17\n119.28.0.0/15\n119.30.48.0/20\n119.31.192.0/19\n119.32.0.0/13\n119.40.0.0/18\n119.40.64.0/20\n119.40.128.0/17\n119.41.0.0/16\n119.42.0.0/19\n119.42.52.0/22\n119.42.128.0/20\n119.42.224.0/19\n119.44.0.0/15\n119.48.0.0/13\n119.57.0.0/16\n119.58.0.0/16\n119.59.128.0/17\n119.60.0.0/15\n119.62.0.0/16\n119.63.32.0/19\n119.75.208.0/20\n119.78.0.0/15\n119.80.0.0/16\n119.82.208.0/20\n119.84.0.0/14\n119.88.0.0/14\n119.96.0.0/13\n119.108.0.0/15\n119.112.0.0/12\n119.128.0.0/12\n119.144.0.0/14\n119.148.160.0/19\n119.151.192.0/18\n119.160.200.0/21\n119.161.120.0/21\n119.161.128.0/17\n119.162.0.0/15\n119.164.0.0/14\n119.176.0.0/12\n119.232.0.0/15\n119.235.128.0/18\n119.248.0.0/14\n119.252.96.0/21\n119.252.240.0/20\n119.253.0.0/16\n119.254.0.0/15\n120.0.0.0/12\n120.24.0.0/14\n120.30.0.0/15\n120.32.0.0/12\n120.48.0.0/15\n120.52.0.0/14\n120.64.0.0/13\n120.72.32.0/19\n120.72.128.0/17\n120.76.0.0/14\n120.80.0.0/13\n120.88.8.0/21\n120.90.0.0/15\n120.92.0.0/16\n120.94.0.0/15\n120.128.0.0/13\n120.136.16.0/21\n120.136.128.0/18\n120.137.0.0/17\n120.143.128.0/19\n120.192.0.0/10\n121.0.8.0/21\n121.0.16.0/20\n121.4.0.0/15\n121.8.0.0/13\n121.16.0.0/12\n121.32.0.0/13\n121.40.0.0/14\n121.46.0.0/18\n121.46.76.0/22\n121.46.128.0/17\n121.47.0.0/16\n121.48.0.0/15\n121.50.8.0/21\n121.51.0.0/16\n121.52.160.0/19\n121.52.208.0/20\n121.52.224.0/19\n121.54.176.0/21\n121.54.188.0/22\n121.55.0.0/18\n121.56.0.0/15\n121.58.0.0/17\n121.58.136.0/21\n121.58.144.0/20\n121.58.160.0/21\n121.59.0.0/16\n121.60.0.0/14\n121.68.0.0/14\n121.76.0.0/15\n121.79.128.0/18\n121.89.0.0/16\n121.100.128.0/17\n121.101.0.0/18\n121.101.208.0/20\n121.192.0.0/13\n121.200.192.0/21\n121.201.0.0/16\n121.204.0.0/14\n121.224.0.0/12\n121.248.0.0/14\n121.255.0.0/16\n122.0.64.0/18\n122.0.128.0/17\n122.4.0.0/14\n122.8.0.0/15\n122.10.128.0/22\n122.10.132.0/23\n122.10.136.0/23\n122.10.164.0/22\n122.10.168.0/21\n122.10.176.0/20\n122.10.192.0/22\n122.10.200.0/21\n122.10.208.0/21\n122.10.216.0/22\n122.10.228.0/22\n122.10.232.0/21\n122.10.240.0/22\n122.11.0.0/17\n122.12.0.0/15\n122.14.0.0/16\n122.48.0.0/16\n122.49.0.0/18\n122.51.0.0/16\n122.64.0.0/11\n122.96.0.0/15\n122.102.0.0/20\n122.102.64.0/19\n122.112.0.0/14\n122.119.0.0/16\n122.128.100.0/22\n122.128.120.0/21\n122.136.0.0/13\n122.144.128.0/17\n122.152.192.0/18\n122.156.0.0/14\n122.188.0.0/14\n122.192.0.0/14\n122.198.0.0/16\n122.200.40.0/21\n122.200.64.0/18\n122.201.48.0/20\n122.204.0.0/14\n122.224.0.0/12\n122.240.0.0/13\n122.248.24.0/21\n122.248.48.0/20\n122.255.64.0/21\n123.0.128.0/18\n123.4.0.0/14\n123.8.0.0/13\n123.49.128.0/17\n123.50.160.0/19\n123.52.0.0/14\n123.56.0.0/14\n123.60.0.0/15\n123.62.0.0/16\n123.64.0.0/11\n123.96.0.0/15\n123.98.0.0/17\n123.99.128.0/17\n123.100.0.0/19\n123.101.0.0/16\n123.103.0.0/17\n123.108.128.0/20\n123.108.208.0/20\n123.112.0.0/12\n123.128.0.0/13\n123.136.80.0/20\n123.137.0.0/16\n123.138.0.0/15\n123.144.0.0/12\n123.160.0.0/12\n123.176.60.0/22\n123.176.80.0/20\n123.177.0.0/16\n123.178.0.0/15\n123.180.0.0/14\n123.184.0.0/13\n123.196.0.0/15\n123.199.128.0/17\n123.206.0.0/15\n123.232.0.0/14\n123.242.0.0/17\n123.242.192.0/21\n123.244.0.0/14\n123.249.0.0/16\n123.253.108.0/22\n123.253.240.0/22\n123.254.96.0/21\n124.6.64.0/18\n124.14.0.0/15\n124.16.0.0/15\n124.20.0.0/14\n124.28.192.0/18\n124.29.0.0/17\n124.31.0.0/16\n124.40.112.0/20\n124.40.128.0/18\n124.40.192.0/19\n124.40.240.0/22\n124.42.0.0/16\n124.47.0.0/18\n124.64.0.0/15\n124.66.0.0/17\n124.67.0.0/16\n124.68.0.0/14\n124.72.0.0/13\n124.88.0.0/13\n124.108.8.0/21\n124.108.40.0/21\n124.109.96.0/21\n124.112.0.0/13\n124.126.0.0/15\n124.128.0.0/13\n124.147.128.0/17\n124.150.137.0/24\n124.151.0.0/16\n124.152.0.0/16\n124.160.0.0/13\n124.172.0.0/14\n124.192.0.0/15\n124.196.0.0/16\n124.200.0.0/13\n124.220.0.0/14\n124.224.0.0/12\n124.240.0.0/17\n124.240.128.0/18\n124.242.0.0/16\n124.243.192.0/18\n124.248.0.0/17\n124.249.0.0/16\n124.250.0.0/15\n124.254.0.0/18\n125.31.192.0/18\n125.32.0.0/12\n125.58.128.0/17\n125.61.128.0/17\n125.62.0.0/18\n125.64.0.0/11\n125.96.0.0/15\n125.98.0.0/16\n125.104.0.0/13\n125.112.0.0/12\n125.169.0.0/16\n125.171.0.0/16\n125.208.0.0/18\n125.210.0.0/15\n125.213.0.0/17\n125.214.96.0/19\n125.215.0.0/18\n125.216.0.0/13\n125.254.128.0/17\n128.108.0.0/16\n129.28.0.0/16\n129.204.0.0/16\n129.211.0.0/16\n132.232.0.0/16\n134.175.0.0/16\n137.59.59.0/24\n137.59.88.0/22\n139.5.56.0/21\n139.5.80.0/22\n139.5.92.0/22\n139.5.108.0/22\n139.5.128.0/22\n139.5.160.0/22\n139.5.192.0/22\n139.5.204.0/22\n139.5.208.0/21\n139.5.244.0/22\n139.9.0.0/16\n139.129.0.0/16\n139.148.0.0/16\n139.155.0.0/16\n139.159.0.0/16\n139.170.0.0/16\n139.176.0.0/16\n139.183.0.0/16\n139.186.0.0/16\n139.189.0.0/16\n139.196.0.0/14\n139.200.0.0/13\n139.208.0.0/13\n139.217.0.0/16\n139.219.0.0/16\n139.220.0.0/15\n139.224.0.0/16\n139.226.0.0/15\n140.75.0.0/16\n140.143.0.0/16\n140.179.0.0/16\n140.205.0.0/16\n140.206.0.0/15\n140.210.0.0/16\n140.224.0.0/16\n140.237.0.0/16\n140.240.0.0/16\n140.243.0.0/16\n140.246.0.0/16\n140.249.0.0/16\n140.250.0.0/16\n140.255.0.0/16\n144.0.0.0/16\n144.7.0.0/16\n144.12.0.0/16\n144.48.8.0/22\n144.48.64.0/22\n144.48.88.0/22\n144.48.156.0/22\n144.48.180.0/22\n144.48.184.0/22\n144.48.204.0/22\n144.48.208.0/21\n144.48.220.0/22\n144.48.252.0/22\n144.52.0.0/16\n144.123.0.0/16\n144.255.0.0/16\n146.56.192.0/18\n146.196.56.0/22\n146.196.68.0/22\n146.196.72.0/22\n146.196.92.0/22\n146.196.112.0/21\n146.196.124.0/22\n148.70.0.0/16\n150.0.0.0/16\n150.115.0.0/16\n150.121.0.0/16\n150.122.0.0/16\n150.129.136.0/22\n150.129.192.0/22\n150.129.216.0/22\n150.129.252.0/22\n150.138.0.0/15\n150.158.0.0/16\n150.223.0.0/16\n150.242.0.0/21\n150.242.8.0/22\n150.242.28.0/22\n150.242.44.0/22\n150.242.48.0/21\n150.242.56.0/22\n150.242.76.0/22\n150.242.80.0/22\n150.242.92.0/22\n150.242.96.0/22\n150.242.112.0/21\n150.242.120.0/22\n150.242.152.0/21\n150.242.160.0/21\n150.242.168.0/22\n150.242.184.0/21\n150.242.192.0/22\n150.242.212.0/22\n150.242.224.0/20\n150.242.240.0/21\n150.242.248.0/22\n150.255.0.0/16\n152.104.128.0/17\n152.136.0.0/16\n153.0.0.0/16\n153.3.0.0/16\n153.34.0.0/15\n153.36.0.0/15\n153.99.0.0/16\n153.101.0.0/16\n153.118.0.0/15\n154.8.128.0/17\n157.0.0.0/16\n157.18.0.0/16\n157.61.0.0/16\n157.119.0.0/22\n157.119.8.0/21\n157.119.16.0/22\n157.119.28.0/22\n157.119.68.0/22\n157.119.112.0/22\n157.119.132.0/22\n157.119.136.0/21\n157.119.144.0/20\n157.119.160.0/21\n157.119.172.0/22\n157.119.192.0/21\n157.119.240.0/22\n157.119.252.0/22\n157.122.0.0/16\n157.148.0.0/16\n157.156.0.0/16\n157.255.0.0/16\n159.75.0.0/16\n159.226.0.0/16\n160.19.208.0/21\n160.19.216.0/22\n160.20.48.0/22\n160.202.60.0/22\n160.202.148.0/22\n160.202.152.0/22\n160.202.168.0/22\n160.202.212.0/22\n160.202.216.0/21\n160.202.224.0/19\n160.238.64.0/22\n161.189.0.0/16\n161.207.0.0/16\n162.14.0.0/16\n162.105.0.0/16\n163.0.0.0/16\n163.47.4.0/22\n163.53.0.0/20\n163.53.36.0/22\n163.53.40.0/21\n163.53.48.0/20\n163.53.64.0/22\n163.53.88.0/21\n163.53.96.0/19\n163.53.128.0/21\n163.53.136.0/22\n163.53.160.0/20\n163.53.188.0/22\n163.53.220.0/22\n163.53.240.0/22\n163.125.0.0/16\n163.142.0.0/16\n163.177.0.0/16\n163.179.0.0/16\n163.204.0.0/16\n164.52.0.0/17\n166.111.0.0/16\n167.139.0.0/16\n167.189.0.0/16\n167.220.244.0/22\n168.160.0.0/16\n170.179.0.0/16\n171.8.0.0/13\n171.34.0.0/15\n171.36.0.0/14\n171.40.0.0/13\n171.80.0.0/12\n171.104.0.0/13\n171.112.0.0/12\n171.208.0.0/12\n172.81.192.0/18\n175.0.0.0/12\n175.16.0.0/13\n175.24.0.0/14\n175.30.0.0/15\n175.42.0.0/15\n175.44.0.0/16\n175.46.0.0/15\n175.48.0.0/12\n175.64.0.0/11\n175.102.0.0/16\n175.106.128.0/17\n175.111.144.0/20\n175.111.160.0/20\n175.111.184.0/22\n175.146.0.0/15\n175.148.0.0/14\n175.152.0.0/14\n175.158.96.0/22\n175.160.0.0/12\n175.176.156.0/22\n175.176.176.0/22\n175.176.188.0/22\n175.176.192.0/22\n175.178.0.0/16\n175.184.128.0/18\n175.185.0.0/16\n175.186.0.0/15\n175.188.0.0/14\n180.76.0.0/14\n180.84.0.0/15\n180.86.0.0/16\n180.88.0.0/14\n180.94.56.0/21\n180.94.96.0/20\n180.94.120.0/21\n180.95.128.0/17\n180.96.0.0/11\n180.129.128.0/17\n180.130.0.0/16\n180.136.0.0/13\n180.148.16.0/21\n180.148.152.0/21\n180.148.216.0/21\n180.148.224.0/19\n180.149.128.0/19\n180.149.236.0/22\n180.150.160.0/19\n180.152.0.0/13\n180.160.0.0/12\n180.178.112.0/21\n180.178.192.0/18\n180.184.0.0/14\n180.188.0.0/17\n180.189.148.0/22\n180.200.252.0/22\n180.201.0.0/16\n180.202.0.0/15\n180.208.0.0/15\n180.210.212.0/22\n180.210.224.0/19\n180.212.0.0/15\n180.222.224.0/19\n180.223.0.0/16\n180.233.0.0/18\n180.233.64.0/19\n180.233.144.0/22\n180.235.64.0/19\n180.235.112.0/22\n180.235.136.0/22\n182.16.144.0/21\n182.16.192.0/19\n182.18.0.0/17\n182.23.184.0/21\n182.23.200.0/21\n182.32.0.0/12\n182.48.96.0/19\n182.49.0.0/16\n182.50.0.0/20\n182.50.112.0/20\n182.51.0.0/16\n182.54.0.0/17\n182.54.244.0/22\n182.61.0.0/16\n182.80.0.0/13\n182.88.0.0/14\n182.92.0.0/16\n182.96.0.0/11\n182.128.0.0/12\n182.144.0.0/13\n182.157.0.0/16\n182.160.64.0/19\n182.174.0.0/15\n182.200.0.0/13\n182.236.128.0/17\n182.237.24.0/21\n182.238.0.0/16\n182.239.0.0/19\n182.240.0.0/13\n182.254.0.0/16\n182.255.32.0/21\n182.255.60.0/22\n183.0.0.0/10\n183.64.0.0/13\n183.78.160.0/21\n183.78.180.0/22\n183.81.172.0/22\n183.81.180.0/22\n183.84.0.0/15\n183.91.128.0/22\n183.91.136.0/21\n183.91.144.0/20\n183.92.0.0/14\n183.128.0.0/11\n183.160.0.0/13\n183.168.0.0/15\n183.170.0.0/16\n183.172.0.0/14\n183.182.0.0/19\n183.184.0.0/13\n183.192.0.0/10\n185.203.36.0/22\n188.131.128.0/17\n192.51.188.0/24\n192.55.46.0/24\n192.55.68.0/22\n192.102.204.0/23\n192.124.154.0/24\n192.140.128.0/21\n192.140.136.0/22\n192.140.156.0/22\n192.140.160.0/19\n192.140.192.0/20\n192.140.208.0/21\n192.144.128.0/17\n192.197.113.0/24\n193.112.0.0/16\n198.175.100.0/22\n199.212.57.0/24\n202.0.100.0/23\n202.0.122.0/23\n202.0.176.0/22\n202.3.128.0/23\n202.3.134.0/24\n202.4.128.0/19\n202.4.252.0/22\n202.5.208.0/21\n202.5.216.0/22\n202.6.6.0/23\n202.6.66.0/23\n202.6.72.0/23\n202.6.87.0/24\n202.6.88.0/23\n202.6.92.0/23\n202.6.103.0/24\n202.6.108.0/24\n202.6.110.0/23\n202.6.114.0/24\n202.6.176.0/20\n202.8.0.0/24\n202.8.2.0/23\n202.8.4.0/23\n202.8.12.0/24\n202.8.24.0/24\n202.8.77.0/24\n202.8.120.0/22\n202.8.128.0/19\n202.8.192.0/20\n202.9.32.0/24\n202.9.34.0/23\n202.9.48.0/23\n202.9.51.0/24\n202.9.52.0/23\n202.9.54.0/24\n202.9.57.0/24\n202.9.58.0/23\n202.10.64.0/20\n202.10.112.0/20\n202.12.1.0/24\n202.12.2.0/24\n202.12.17.0/24\n202.12.18.0/23\n202.12.72.0/24\n202.12.84.0/23\n202.12.96.0/24\n202.12.98.0/23\n202.12.106.0/24\n202.12.111.0/24\n202.12.116.0/24\n202.14.64.0/23\n202.14.69.0/24\n202.14.73.0/24\n202.14.74.0/23\n202.14.76.0/24\n202.14.78.0/23\n202.14.88.0/24\n202.14.97.0/24\n202.14.104.0/23\n202.14.108.0/23\n202.14.111.0/24\n202.14.114.0/23\n202.14.118.0/23\n202.14.124.0/23\n202.14.127.0/24\n202.14.129.0/24\n202.14.135.0/24\n202.14.136.0/24\n202.14.149.0/24\n202.14.151.0/24\n202.14.157.0/24\n202.14.158.0/23\n202.14.169.0/24\n202.14.170.0/23\n202.14.172.0/22\n202.14.176.0/24\n202.14.184.0/23\n202.14.208.0/23\n202.14.213.0/24\n202.14.219.0/24\n202.14.220.0/24\n202.14.222.0/23\n202.14.225.0/24\n202.14.226.0/23\n202.14.231.0/24\n202.14.235.0/24\n202.14.236.0/22\n202.14.246.0/24\n202.14.251.0/24\n202.20.66.0/24\n202.20.79.0/24\n202.20.87.0/24\n202.20.88.0/23\n202.20.90.0/24\n202.20.94.0/23\n202.20.114.0/24\n202.20.117.0/24\n202.20.120.0/24\n202.20.125.0/24\n202.20.126.0/23\n202.21.48.0/20\n202.21.131.0/24\n202.21.132.0/24\n202.21.141.0/24\n202.21.142.0/24\n202.21.147.0/24\n202.21.148.0/24\n202.21.150.0/23\n202.21.152.0/23\n202.21.154.0/24\n202.21.156.0/24\n202.22.248.0/21\n202.27.12.0/24\n202.27.14.0/24\n202.27.136.0/23\n202.36.226.0/24\n202.38.0.0/22\n202.38.8.0/21\n202.38.48.0/20\n202.38.64.0/18\n202.38.128.0/21\n202.38.136.0/23\n202.38.138.0/24\n202.38.140.0/22\n202.38.146.0/23\n202.38.149.0/24\n202.38.150.0/23\n202.38.152.0/22\n202.38.156.0/24\n202.38.158.0/23\n202.38.160.0/23\n202.38.164.0/22\n202.38.168.0/22\n202.38.176.0/23\n202.38.184.0/21\n202.38.192.0/18\n202.40.4.0/23\n202.40.7.0/24\n202.40.15.0/24\n202.40.135.0/24\n202.40.136.0/24\n202.40.140.0/24\n202.40.143.0/24\n202.40.144.0/23\n202.40.150.0/24\n202.40.155.0/24\n202.40.156.0/24\n202.40.158.0/23\n202.40.162.0/24\n202.41.8.0/23\n202.41.11.0/24\n202.41.12.0/23\n202.41.128.0/24\n202.41.130.0/23\n202.41.152.0/21\n202.41.192.0/24\n202.41.196.0/22\n202.41.200.0/22\n202.41.240.0/20\n202.43.76.0/22\n202.43.144.0/20\n202.44.16.0/20\n202.44.48.0/22\n202.44.67.0/24\n202.44.74.0/24\n202.44.97.0/24\n202.44.129.0/24\n202.44.132.0/23\n202.44.146.0/23\n202.45.0.0/23\n202.45.2.0/24\n202.45.15.0/24\n202.45.16.0/20\n202.46.16.0/23\n202.46.18.0/24\n202.46.20.0/23\n202.46.32.0/19\n202.46.128.0/24\n202.46.224.0/20\n202.47.82.0/23\n202.47.96.0/20\n202.47.126.0/24\n202.47.128.0/24\n202.47.130.0/23\n202.52.33.0/24\n202.52.34.0/24\n202.52.47.0/24\n202.52.143.0/24\n202.52.144.0/24\n202.53.140.0/24\n202.53.143.0/24\n202.57.192.0/20\n202.57.212.0/22\n202.57.216.0/22\n202.57.240.0/20\n202.58.0.0/24\n202.58.101.0/24\n202.58.104.0/22\n202.58.112.0/22\n202.59.0.0/23\n202.59.212.0/22\n202.59.236.0/24\n202.59.240.0/24\n202.60.48.0/21\n202.60.96.0/21\n202.60.112.0/20\n202.60.132.0/22\n202.60.136.0/21\n202.60.144.0/20\n202.61.68.0/22\n202.61.76.0/22\n202.61.88.0/22\n202.61.123.0/24\n202.61.127.0/24\n202.62.112.0/22\n202.62.248.0/22\n202.62.252.0/24\n202.62.255.0/24\n202.63.80.0/20\n202.63.160.0/19\n202.63.248.0/22\n202.63.253.0/24\n202.65.0.0/21\n202.65.8.0/23\n202.65.96.0/20\n202.66.168.0/22\n202.67.0.0/22\n202.69.4.0/22\n202.69.16.0/20\n202.70.0.0/19\n202.70.96.0/20\n202.70.192.0/20\n202.71.32.0/20\n202.72.40.0/21\n202.72.80.0/20\n202.72.112.0/20\n202.73.128.0/22\n202.73.240.0/20\n202.74.8.0/21\n202.74.36.0/24\n202.74.42.0/24\n202.74.52.0/24\n202.74.80.0/20\n202.74.232.0/22\n202.74.254.0/23\n202.75.208.0/20\n202.75.252.0/22\n202.76.252.0/22\n202.77.80.0/21\n202.77.92.0/22\n202.78.8.0/21\n202.79.224.0/21\n202.79.248.0/22\n202.80.192.0/20\n202.81.0.0/22\n202.81.176.0/20\n202.83.252.0/22\n202.84.0.0/20\n202.84.16.0/23\n202.84.22.0/24\n202.84.24.0/21\n202.85.208.0/20\n202.86.249.0/24\n202.86.252.0/22\n202.87.80.0/20\n202.88.32.0/22\n202.89.8.0/21\n202.89.96.0/22\n202.89.108.0/22\n202.89.119.0/24\n202.89.232.0/21\n202.90.0.0/22\n202.90.16.0/20\n202.90.37.0/24\n202.90.96.0/19\n202.90.193.0/24\n202.90.196.0/24\n202.90.205.0/24\n202.90.224.0/20\n202.91.0.0/22\n202.91.36.0/22\n202.91.96.0/20\n202.91.128.0/22\n202.91.176.0/20\n202.91.224.0/19\n202.92.0.0/22\n202.92.8.0/21\n202.92.48.0/20\n202.92.252.0/22\n202.93.0.0/22\n202.93.252.0/22\n202.94.68.0/24\n202.94.74.0/24\n202.94.81.0/24\n202.94.92.0/22\n202.95.240.0/21\n202.95.252.0/22\n202.96.0.0/12\n202.112.0.0/13\n202.120.0.0/15\n202.122.0.0/21\n202.122.32.0/21\n202.122.64.0/19\n202.122.112.0/20\n202.122.128.0/24\n202.122.132.0/24\n202.123.96.0/20\n202.123.116.0/22\n202.123.120.0/22\n202.124.16.0/21\n202.124.24.0/22\n202.125.107.0/24\n202.125.109.0/24\n202.125.112.0/20\n202.125.176.0/20\n202.127.0.0/21\n202.127.12.0/22\n202.127.16.0/20\n202.127.40.0/21\n202.127.48.0/20\n202.127.112.0/20\n202.127.128.0/19\n202.127.160.0/21\n202.127.192.0/20\n202.127.208.0/23\n202.127.212.0/22\n202.127.216.0/21\n202.127.224.0/19\n202.129.208.0/24\n202.130.0.0/19\n202.130.39.0/24\n202.130.224.0/19\n202.131.16.0/21\n202.131.48.0/20\n202.131.208.0/20\n202.133.32.0/20\n202.134.58.0/24\n202.134.128.0/20\n202.134.208.0/20\n202.136.48.0/20\n202.136.208.0/20\n202.136.224.0/20\n202.136.248.0/22\n202.137.231.0/24\n202.140.140.0/22\n202.140.144.0/20\n202.141.160.0/19\n202.142.16.0/20\n202.143.4.0/22\n202.143.16.0/20\n202.143.32.0/20\n202.143.56.0/21\n202.143.100.0/22\n202.143.104.0/22\n202.144.196.0/22\n202.146.160.0/20\n202.146.186.0/24\n202.146.188.0/22\n202.146.196.0/22\n202.146.200.0/21\n202.147.144.0/20\n202.148.32.0/20\n202.148.64.0/18\n202.149.32.0/19\n202.149.160.0/19\n202.149.224.0/19\n202.150.16.0/20\n202.150.32.0/20\n202.150.56.0/22\n202.150.192.0/20\n202.150.224.0/19\n202.151.0.0/22\n202.151.33.0/24\n202.151.128.0/19\n202.152.176.0/20\n202.153.0.0/22\n202.153.7.0/24\n202.153.48.0/20\n202.157.192.0/19\n202.158.160.0/19\n202.158.242.0/24\n202.160.140.0/22\n202.160.156.0/22\n202.160.176.0/20\n202.162.67.0/24\n202.162.75.0/24\n202.164.0.0/20\n202.164.96.0/19\n202.165.176.0/20\n202.165.208.0/20\n202.165.239.0/24\n202.165.240.0/23\n202.165.243.0/24\n202.165.245.0/24\n202.165.251.0/24\n202.165.252.0/22\n202.166.224.0/19\n202.168.80.0/22\n202.168.128.0/20\n202.168.160.0/19\n202.170.128.0/19\n202.170.216.0/21\n202.170.224.0/19\n202.171.216.0/21\n202.171.232.0/24\n202.171.235.0/24\n202.172.0.0/22\n202.172.7.0/24\n202.173.0.0/22\n202.173.6.0/24\n202.173.8.0/21\n202.173.112.0/22\n202.173.224.0/19\n202.174.64.0/20\n202.174.124.0/22\n202.176.224.0/19\n202.179.160.0/20\n202.179.240.0/20\n202.180.128.0/19\n202.180.208.0/21\n202.181.8.0/22\n202.181.28.0/22\n202.181.112.0/20\n202.182.32.0/20\n202.182.192.0/19\n202.189.0.0/18\n202.189.80.0/20\n202.189.184.0/21\n202.191.0.0/24\n202.191.68.0/22\n202.191.72.0/21\n202.191.80.0/20\n202.192.0.0/12\n203.0.4.0/22\n203.0.10.0/23\n203.0.18.0/24\n203.0.24.0/24\n203.0.42.0/23\n203.0.45.0/24\n203.0.46.0/23\n203.0.81.0/24\n203.0.82.0/23\n203.0.90.0/23\n203.0.96.0/23\n203.0.104.0/21\n203.0.114.0/23\n203.0.122.0/24\n203.0.128.0/24\n203.0.130.0/23\n203.0.132.0/22\n203.0.137.0/24\n203.0.142.0/24\n203.0.144.0/24\n203.0.146.0/24\n203.0.148.0/24\n203.0.150.0/23\n203.0.152.0/24\n203.0.177.0/24\n203.0.224.0/24\n203.1.4.0/22\n203.1.18.0/24\n203.1.26.0/23\n203.1.65.0/24\n203.1.66.0/23\n203.1.70.0/23\n203.1.76.0/23\n203.1.90.0/24\n203.1.97.0/24\n203.1.98.0/23\n203.1.100.0/22\n203.1.108.0/24\n203.1.253.0/24\n203.1.254.0/24\n203.2.64.0/21\n203.2.73.0/24\n203.2.112.0/21\n203.2.126.0/23\n203.2.140.0/24\n203.2.150.0/24\n203.2.152.0/22\n203.2.156.0/23\n203.2.160.0/21\n203.2.180.0/23\n203.2.196.0/23\n203.2.209.0/24\n203.2.214.0/23\n203.2.226.0/23\n203.2.229.0/24\n203.2.236.0/23\n203.3.68.0/24\n203.3.72.0/23\n203.3.75.0/24\n203.3.80.0/21\n203.3.96.0/22\n203.3.105.0/24\n203.3.112.0/21\n203.3.120.0/24\n203.3.123.0/24\n203.3.135.0/24\n203.3.139.0/24\n203.3.143.0/24\n203.4.132.0/23\n203.4.134.0/24\n203.4.151.0/24\n203.4.152.0/22\n203.4.174.0/23\n203.4.180.0/24\n203.4.186.0/24\n203.4.205.0/24\n203.4.208.0/22\n203.4.227.0/24\n203.4.230.0/23\n203.5.4.0/23\n203.5.7.0/24\n203.5.8.0/23\n203.5.11.0/24\n203.5.21.0/24\n203.5.22.0/24\n203.5.44.0/24\n203.5.46.0/23\n203.5.52.0/22\n203.5.56.0/23\n203.5.60.0/23\n203.5.114.0/23\n203.5.118.0/24\n203.5.120.0/24\n203.5.172.0/24\n203.5.180.0/23\n203.5.182.0/24\n203.5.185.0/24\n203.5.186.0/24\n203.5.188.0/23\n203.5.190.0/24\n203.5.195.0/24\n203.5.214.0/23\n203.5.218.0/23\n203.6.131.0/24\n203.6.136.0/24\n203.6.138.0/23\n203.6.142.0/24\n203.6.150.0/23\n203.6.157.0/24\n203.6.159.0/24\n203.6.224.0/20\n203.6.248.0/23\n203.7.129.0/24\n203.7.138.0/23\n203.7.147.0/24\n203.7.150.0/23\n203.7.158.0/24\n203.7.192.0/23\n203.7.200.0/24\n203.8.0.0/24\n203.8.8.0/24\n203.8.23.0/24\n203.8.70.0/24\n203.8.82.0/24\n203.8.86.0/23\n203.8.91.0/24\n203.8.110.0/23\n203.8.115.0/24\n203.8.166.0/23\n203.8.169.0/24\n203.8.173.0/24\n203.8.184.0/24\n203.8.186.0/23\n203.8.190.0/23\n203.8.192.0/24\n203.8.197.0/24\n203.8.198.0/23\n203.8.203.0/24\n203.8.209.0/24\n203.8.210.0/23\n203.8.212.0/22\n203.8.217.0/24\n203.8.220.0/24\n203.9.32.0/24\n203.9.36.0/23\n203.9.57.0/24\n203.9.63.0/24\n203.9.65.0/24\n203.9.70.0/23\n203.9.72.0/24\n203.9.75.0/24\n203.9.76.0/23\n203.9.96.0/22\n203.9.100.0/23\n203.9.108.0/24\n203.9.158.0/24\n203.10.34.0/24\n203.10.56.0/24\n203.10.74.0/23\n203.10.84.0/22\n203.10.88.0/24\n203.10.95.0/24\n203.10.125.0/24\n203.11.70.0/24\n203.11.76.0/22\n203.11.82.0/24\n203.11.84.0/22\n203.11.100.0/22\n203.11.109.0/24\n203.11.117.0/24\n203.11.122.0/24\n203.11.126.0/24\n203.11.136.0/22\n203.11.141.0/24\n203.11.142.0/23\n203.11.180.0/22\n203.11.208.0/22\n203.12.16.0/24\n203.12.19.0/24\n203.12.24.0/24\n203.12.57.0/24\n203.12.65.0/24\n203.12.66.0/24\n203.12.70.0/23\n203.12.87.0/24\n203.12.100.0/23\n203.12.103.0/24\n203.12.114.0/24\n203.12.118.0/24\n203.12.130.0/24\n203.12.137.0/24\n203.12.196.0/22\n203.12.211.0/24\n203.12.219.0/24\n203.12.226.0/24\n203.12.240.0/22\n203.13.18.0/24\n203.13.24.0/24\n203.13.44.0/23\n203.13.88.0/23\n203.13.92.0/22\n203.13.173.0/24\n203.13.224.0/23\n203.13.227.0/24\n203.13.233.0/24\n203.14.24.0/22\n203.14.33.0/24\n203.14.56.0/24\n203.14.61.0/24\n203.14.62.0/24\n203.14.104.0/24\n203.14.114.0/23\n203.14.118.0/24\n203.14.162.0/24\n203.14.192.0/24\n203.14.194.0/23\n203.14.214.0/24\n203.14.231.0/24\n203.14.246.0/24\n203.15.0.0/20\n203.15.20.0/23\n203.15.22.0/24\n203.15.87.0/24\n203.15.88.0/23\n203.15.105.0/24\n203.15.112.0/21\n203.15.130.0/23\n203.15.149.0/24\n203.15.151.0/24\n203.15.156.0/22\n203.15.174.0/24\n203.15.227.0/24\n203.15.232.0/21\n203.15.240.0/23\n203.15.246.0/24\n203.16.10.0/24\n203.16.12.0/23\n203.16.16.0/21\n203.16.27.0/24\n203.16.38.0/24\n203.16.49.0/24\n203.16.50.0/23\n203.16.58.0/24\n203.16.63.0/24\n203.16.133.0/24\n203.16.161.0/24\n203.16.162.0/24\n203.16.186.0/23\n203.16.228.0/24\n203.16.238.0/24\n203.16.240.0/24\n203.16.245.0/24\n203.17.2.0/24\n203.17.18.0/24\n203.17.28.0/24\n203.17.39.0/24\n203.17.56.0/24\n203.17.74.0/23\n203.17.88.0/23\n203.17.136.0/24\n203.17.164.0/24\n203.17.187.0/24\n203.17.190.0/23\n203.17.231.0/24\n203.17.233.0/24\n203.17.248.0/23\n203.17.255.0/24\n203.18.2.0/23\n203.18.4.0/24\n203.18.7.0/24\n203.18.31.0/24\n203.18.37.0/24\n203.18.48.0/23\n203.18.52.0/24\n203.18.72.0/22\n203.18.80.0/23\n203.18.87.0/24\n203.18.100.0/23\n203.18.105.0/24\n203.18.107.0/24\n203.18.110.0/24\n203.18.129.0/24\n203.18.131.0/24\n203.18.132.0/23\n203.18.144.0/24\n203.18.153.0/24\n203.18.199.0/24\n203.18.208.0/24\n203.18.211.0/24\n203.18.215.0/24\n203.19.1.0/24\n203.19.18.0/24\n203.19.24.0/24\n203.19.30.0/24\n203.19.32.0/21\n203.19.41.0/24\n203.19.44.0/23\n203.19.46.0/24\n203.19.58.0/24\n203.19.60.0/23\n203.19.64.0/24\n203.19.68.0/24\n203.19.72.0/24\n203.19.101.0/24\n203.19.111.0/24\n203.19.131.0/24\n203.19.133.0/24\n203.19.144.0/24\n203.19.147.0/24\n203.19.149.0/24\n203.19.156.0/24\n203.19.176.0/24\n203.19.178.0/23\n203.19.208.0/24\n203.19.228.0/22\n203.19.233.0/24\n203.19.242.0/24\n203.19.248.0/23\n203.19.255.0/24\n203.20.17.0/24\n203.20.40.0/23\n203.20.44.0/24\n203.20.48.0/24\n203.20.61.0/24\n203.20.65.0/24\n203.20.84.0/23\n203.20.89.0/24\n203.20.106.0/23\n203.20.115.0/24\n203.20.117.0/24\n203.20.118.0/23\n203.20.122.0/24\n203.20.126.0/23\n203.20.135.0/24\n203.20.136.0/21\n203.20.150.0/24\n203.20.230.0/24\n203.20.232.0/24\n203.20.236.0/24\n203.21.0.0/23\n203.21.2.0/24\n203.21.8.0/24\n203.21.10.0/24\n203.21.18.0/24\n203.21.33.0/24\n203.21.34.0/24\n203.21.41.0/24\n203.21.44.0/24\n203.21.68.0/24\n203.21.82.0/24\n203.21.96.0/22\n203.21.124.0/24\n203.21.136.0/23\n203.21.145.0/24\n203.21.206.0/24\n203.22.24.0/24\n203.22.28.0/23\n203.22.31.0/24\n203.22.68.0/24\n203.22.76.0/24\n203.22.78.0/24\n203.22.84.0/24\n203.22.87.0/24\n203.22.92.0/22\n203.22.99.0/24\n203.22.106.0/24\n203.22.122.0/23\n203.22.131.0/24\n203.22.163.0/24\n203.22.166.0/24\n203.22.170.0/24\n203.22.176.0/21\n203.22.194.0/24\n203.22.242.0/23\n203.22.245.0/24\n203.22.246.0/24\n203.22.252.0/23\n203.23.0.0/24\n203.23.47.0/24\n203.23.61.0/24\n203.23.62.0/23\n203.23.73.0/24\n203.23.85.0/24\n203.23.92.0/22\n203.23.98.0/24\n203.23.107.0/24\n203.23.112.0/24\n203.23.130.0/24\n203.23.140.0/23\n203.23.172.0/24\n203.23.182.0/24\n203.23.186.0/23\n203.23.192.0/24\n203.23.197.0/24\n203.23.198.0/24\n203.23.204.0/22\n203.23.224.0/24\n203.23.226.0/23\n203.23.228.0/22\n203.23.249.0/24\n203.23.251.0/24\n203.24.13.0/24\n203.24.18.0/24\n203.24.27.0/24\n203.24.43.0/24\n203.24.56.0/24\n203.24.58.0/24\n203.24.67.0/24\n203.24.74.0/24\n203.24.79.0/24\n203.24.80.0/23\n203.24.84.0/23\n203.24.86.0/24\n203.24.90.0/24\n203.24.111.0/24\n203.24.112.0/24\n203.24.116.0/24\n203.24.122.0/23\n203.24.145.0/24\n203.24.152.0/23\n203.24.157.0/24\n203.24.161.0/24\n203.24.167.0/24\n203.24.186.0/23\n203.24.199.0/24\n203.24.202.0/24\n203.24.212.0/23\n203.24.217.0/24\n203.24.219.0/24\n203.24.244.0/24\n203.25.19.0/24\n203.25.20.0/23\n203.25.46.0/24\n203.25.48.0/21\n203.25.64.0/23\n203.25.91.0/24\n203.25.99.0/24\n203.25.100.0/24\n203.25.106.0/24\n203.25.131.0/24\n203.25.135.0/24\n203.25.138.0/24\n203.25.147.0/24\n203.25.153.0/24\n203.25.154.0/23\n203.25.164.0/24\n203.25.166.0/24\n203.25.174.0/23\n203.25.180.0/24\n203.25.182.0/24\n203.25.191.0/24\n203.25.199.0/24\n203.25.200.0/24\n203.25.202.0/23\n203.25.208.0/20\n203.25.229.0/24\n203.25.235.0/24\n203.25.236.0/24\n203.25.242.0/24\n203.26.12.0/24\n203.26.34.0/24\n203.26.49.0/24\n203.26.50.0/24\n203.26.55.0/24\n203.26.56.0/23\n203.26.60.0/24\n203.26.65.0/24\n203.26.68.0/24\n203.26.76.0/24\n203.26.80.0/24\n203.26.84.0/24\n203.26.97.0/24\n203.26.102.0/23\n203.26.115.0/24\n203.26.116.0/24\n203.26.129.0/24\n203.26.143.0/24\n203.26.144.0/24\n203.26.148.0/23\n203.26.154.0/24\n203.26.158.0/23\n203.26.170.0/24\n203.26.173.0/24\n203.26.176.0/24\n203.26.185.0/24\n203.26.202.0/23\n203.26.210.0/24\n203.26.214.0/24\n203.26.222.0/24\n203.26.224.0/24\n203.26.228.0/24\n203.26.232.0/24\n203.27.0.0/24\n203.27.10.0/24\n203.27.15.0/24\n203.27.16.0/24\n203.27.20.0/24\n203.27.22.0/23\n203.27.40.0/24\n203.27.45.0/24\n203.27.53.0/24\n203.27.65.0/24\n203.27.66.0/24\n203.27.81.0/24\n203.27.88.0/24\n203.27.102.0/24\n203.27.109.0/24\n203.27.117.0/24\n203.27.121.0/24\n203.27.122.0/23\n203.27.125.0/24\n203.27.200.0/24\n203.27.202.0/24\n203.27.233.0/24\n203.27.241.0/24\n203.27.250.0/24\n203.28.10.0/24\n203.28.12.0/24\n203.28.33.0/24\n203.28.34.0/23\n203.28.43.0/24\n203.28.44.0/24\n203.28.54.0/24\n203.28.56.0/24\n203.28.73.0/24\n203.28.74.0/24\n203.28.76.0/24\n203.28.86.0/24\n203.28.88.0/24\n203.28.112.0/24\n203.28.131.0/24\n203.28.136.0/24\n203.28.140.0/24\n203.28.145.0/24\n203.28.165.0/24\n203.28.169.0/24\n203.28.170.0/24\n203.28.178.0/23\n203.28.185.0/24\n203.28.187.0/24\n203.28.196.0/24\n203.28.226.0/23\n203.28.239.0/24\n203.29.2.0/24\n203.29.8.0/23\n203.29.13.0/24\n203.29.14.0/24\n203.29.28.0/24\n203.29.46.0/24\n203.29.57.0/24\n203.29.61.0/24\n203.29.63.0/24\n203.29.69.0/24\n203.29.73.0/24\n203.29.81.0/24\n203.29.90.0/24\n203.29.95.0/24\n203.29.100.0/24\n203.29.103.0/24\n203.29.112.0/24\n203.29.120.0/22\n203.29.182.0/23\n203.29.187.0/24\n203.29.189.0/24\n203.29.190.0/24\n203.29.205.0/24\n203.29.210.0/24\n203.29.217.0/24\n203.29.227.0/24\n203.29.231.0/24\n203.29.233.0/24\n203.29.234.0/24\n203.29.248.0/24\n203.29.254.0/23\n203.30.16.0/23\n203.30.25.0/24\n203.30.27.0/24\n203.30.29.0/24\n203.30.66.0/24\n203.30.81.0/24\n203.30.87.0/24\n203.30.111.0/24\n203.30.121.0/24\n203.30.123.0/24\n203.30.152.0/24\n203.30.156.0/24\n203.30.162.0/24\n203.30.173.0/24\n203.30.175.0/24\n203.30.187.0/24\n203.30.194.0/24\n203.30.217.0/24\n203.30.220.0/24\n203.30.222.0/24\n203.30.232.0/23\n203.30.235.0/24\n203.30.240.0/23\n203.30.246.0/24\n203.30.250.0/23\n203.31.45.0/24\n203.31.46.0/24\n203.31.49.0/24\n203.31.51.0/24\n203.31.54.0/23\n203.31.69.0/24\n203.31.72.0/24\n203.31.80.0/24\n203.31.85.0/24\n203.31.97.0/24\n203.31.105.0/24\n203.31.106.0/24\n203.31.108.0/23\n203.31.124.0/24\n203.31.162.0/24\n203.31.174.0/24\n203.31.177.0/24\n203.31.181.0/24\n203.31.187.0/24\n203.31.189.0/24\n203.31.204.0/24\n203.31.220.0/24\n203.31.222.0/23\n203.31.225.0/24\n203.31.229.0/24\n203.31.248.0/23\n203.31.253.0/24\n203.32.20.0/24\n203.32.48.0/23\n203.32.56.0/24\n203.32.60.0/24\n203.32.62.0/24\n203.32.68.0/23\n203.32.76.0/24\n203.32.81.0/24\n203.32.84.0/23\n203.32.95.0/24\n203.32.102.0/24\n203.32.105.0/24\n203.32.130.0/24\n203.32.133.0/24\n203.32.140.0/24\n203.32.152.0/24\n203.32.186.0/23\n203.32.192.0/24\n203.32.196.0/24\n203.32.203.0/24\n203.32.204.0/23\n203.32.212.0/24\n203.33.4.0/24\n203.33.7.0/24\n203.33.8.0/21\n203.33.21.0/24\n203.33.26.0/24\n203.33.32.0/24\n203.33.63.0/24\n203.33.64.0/24\n203.33.67.0/24\n203.33.68.0/24\n203.33.73.0/24\n203.33.79.0/24\n203.33.100.0/24\n203.33.122.0/24\n203.33.129.0/24\n203.33.131.0/24\n203.33.145.0/24\n203.33.156.0/24\n203.33.158.0/23\n203.33.174.0/24\n203.33.185.0/24\n203.33.200.0/24\n203.33.202.0/23\n203.33.204.0/24\n203.33.206.0/23\n203.33.214.0/23\n203.33.224.0/23\n203.33.226.0/24\n203.33.233.0/24\n203.33.243.0/24\n203.33.250.0/24\n203.34.4.0/24\n203.34.21.0/24\n203.34.27.0/24\n203.34.39.0/24\n203.34.48.0/23\n203.34.54.0/24\n203.34.56.0/23\n203.34.67.0/24\n203.34.69.0/24\n203.34.76.0/24\n203.34.92.0/24\n203.34.106.0/24\n203.34.113.0/24\n203.34.147.0/24\n203.34.150.0/24\n203.34.152.0/23\n203.34.161.0/24\n203.34.162.0/24\n203.34.187.0/24\n203.34.192.0/21\n203.34.204.0/22\n203.34.232.0/24\n203.34.240.0/24\n203.34.242.0/24\n203.34.245.0/24\n203.34.251.0/24\n203.55.2.0/23\n203.55.4.0/24\n203.55.10.0/24\n203.55.13.0/24\n203.55.22.0/24\n203.55.30.0/24\n203.55.93.0/24\n203.55.101.0/24\n203.55.109.0/24\n203.55.110.0/24\n203.55.116.0/23\n203.55.119.0/24\n203.55.128.0/23\n203.55.146.0/23\n203.55.192.0/24\n203.55.196.0/24\n203.55.218.0/23\n203.55.221.0/24\n203.55.224.0/24\n203.56.1.0/24\n203.56.4.0/24\n203.56.12.0/24\n203.56.24.0/24\n203.56.38.0/24\n203.56.40.0/24\n203.56.46.0/24\n203.56.48.0/21\n203.56.68.0/23\n203.56.82.0/23\n203.56.84.0/23\n203.56.95.0/24\n203.56.110.0/24\n203.56.121.0/24\n203.56.161.0/24\n203.56.169.0/24\n203.56.172.0/23\n203.56.175.0/24\n203.56.183.0/24\n203.56.185.0/24\n203.56.187.0/24\n203.56.192.0/24\n203.56.198.0/24\n203.56.201.0/24\n203.56.208.0/23\n203.56.210.0/24\n203.56.214.0/24\n203.56.216.0/24\n203.56.227.0/24\n203.56.228.0/24\n203.56.231.0/24\n203.56.232.0/24\n203.56.240.0/24\n203.56.252.0/24\n203.56.254.0/24\n203.57.5.0/24\n203.57.6.0/24\n203.57.12.0/23\n203.57.28.0/24\n203.57.39.0/24\n203.57.46.0/24\n203.57.58.0/24\n203.57.61.0/24\n203.57.66.0/24\n203.57.69.0/24\n203.57.70.0/23\n203.57.73.0/24\n203.57.90.0/24\n203.57.101.0/24\n203.57.109.0/24\n203.57.123.0/24\n203.57.157.0/24\n203.57.200.0/24\n203.57.202.0/24\n203.57.206.0/24\n203.57.222.0/24\n203.57.224.0/20\n203.57.246.0/23\n203.57.249.0/24\n203.57.253.0/24\n203.57.254.0/23\n203.62.2.0/24\n203.62.131.0/24\n203.62.139.0/24\n203.62.161.0/24\n203.62.197.0/24\n203.62.228.0/22\n203.62.234.0/24\n203.62.246.0/24\n203.76.160.0/22\n203.76.168.0/22\n203.76.208.0/21\n203.76.216.0/22\n203.76.240.0/21\n203.77.180.0/22\n203.78.48.0/20\n203.78.156.0/22\n203.79.0.0/20\n203.79.32.0/20\n203.80.4.0/23\n203.80.32.0/20\n203.80.57.0/24\n203.80.129.0/24\n203.80.132.0/22\n203.80.136.0/21\n203.80.144.0/20\n203.81.0.0/21\n203.81.16.0/20\n203.81.244.0/22\n203.82.0.0/23\n203.82.16.0/21\n203.82.112.0/20\n203.82.224.0/20\n203.83.0.0/22\n203.83.8.0/21\n203.83.56.0/21\n203.83.224.0/20\n203.86.0.0/17\n203.86.250.0/24\n203.86.254.0/23\n203.88.32.0/19\n203.88.100.0/22\n203.88.192.0/19\n203.89.0.0/22\n203.89.8.0/21\n203.89.100.0/22\n203.89.133.0/24\n203.89.136.0/22\n203.89.144.0/24\n203.90.0.0/22\n203.90.8.0/21\n203.90.128.0/18\n203.90.192.0/19\n203.91.32.0/19\n203.91.96.0/20\n203.91.120.0/21\n203.92.0.0/22\n203.92.6.0/24\n203.92.160.0/19\n203.93.0.0/16\n203.94.0.0/19\n203.95.0.0/21\n203.95.96.0/19\n203.95.128.0/18\n203.95.200.0/21\n203.95.208.0/22\n203.95.224.0/19\n203.99.8.0/21\n203.99.16.0/20\n203.99.80.0/20\n203.100.32.0/20\n203.100.48.0/21\n203.100.58.0/24\n203.100.60.0/24\n203.100.63.0/24\n203.100.80.0/20\n203.100.96.0/19\n203.100.192.0/20\n203.104.32.0/20\n203.105.96.0/19\n203.105.128.0/19\n203.107.0.0/17\n203.110.160.0/19\n203.110.208.0/20\n203.110.232.0/23\n203.110.234.0/24\n203.114.80.0/20\n203.114.244.0/22\n203.118.192.0/19\n203.118.241.0/24\n203.118.248.0/22\n203.119.24.0/21\n203.119.32.0/22\n203.119.80.0/22\n203.119.85.0/24\n203.119.113.0/24\n203.119.114.0/23\n203.119.116.0/22\n203.119.120.0/21\n203.119.128.0/17\n203.123.58.0/24\n203.128.32.0/19\n203.128.96.0/19\n203.128.224.0/21\n203.129.8.0/21\n203.130.32.0/19\n203.132.32.0/19\n203.134.240.0/21\n203.135.96.0/19\n203.135.160.0/20\n203.142.219.0/24\n203.142.224.0/19\n203.144.96.0/19\n203.145.0.0/19\n203.148.0.0/18\n203.148.64.0/20\n203.148.80.0/22\n203.148.86.0/23\n203.149.92.0/22\n203.152.64.0/19\n203.152.128.0/19\n203.153.0.0/22\n203.156.192.0/18\n203.158.16.0/21\n203.160.52.0/22\n203.160.104.0/21\n203.160.129.0/24\n203.160.192.0/19\n203.161.0.0/22\n203.161.180.0/24\n203.161.183.0/24\n203.161.192.0/19\n203.166.160.0/19\n203.167.28.0/22\n203.168.0.0/19\n203.170.58.0/23\n203.171.0.0/22\n203.171.208.0/24\n203.171.224.0/20\n203.174.4.0/24\n203.174.6.0/23\n203.174.96.0/19\n203.175.128.0/19\n203.175.192.0/18\n203.176.0.0/18\n203.176.64.0/19\n203.176.168.0/21\n203.184.80.0/20\n203.185.189.0/24\n203.187.160.0/19\n203.189.0.0/23\n203.189.6.0/23\n203.189.112.0/22\n203.189.192.0/19\n203.189.232.0/22\n203.189.240.0/22\n203.190.96.0/20\n203.190.249.0/24\n203.191.0.0/23\n203.191.2.0/24\n203.191.5.0/24\n203.191.7.0/24\n203.191.16.0/20\n203.191.64.0/18\n203.191.133.0/24\n203.191.144.0/20\n203.192.0.0/19\n203.193.224.0/19\n203.194.120.0/21\n203.195.64.0/19\n203.195.112.0/21\n203.195.128.0/17\n203.196.0.0/20\n203.196.28.0/22\n203.201.181.0/24\n203.201.182.0/24\n203.202.236.0/22\n203.205.64.0/19\n203.205.128.0/17\n203.207.64.0/18\n203.207.128.0/17\n203.208.0.0/20\n203.208.16.0/22\n203.208.32.0/19\n203.209.224.0/19\n203.212.0.0/20\n203.212.80.0/20\n203.215.232.0/21\n203.217.164.0/22\n203.223.0.0/20\n203.223.16.0/21\n204.52.191.0/24\n210.2.0.0/19\n210.5.0.0/19\n210.5.56.0/21\n210.5.128.0/19\n210.7.56.0/21\n210.12.0.0/15\n210.14.64.0/19\n210.14.112.0/20\n210.14.128.0/17\n210.15.0.0/17\n210.15.128.0/18\n210.16.104.0/22\n210.16.128.0/18\n210.21.0.0/16\n210.22.0.0/16\n210.23.32.0/19\n210.25.0.0/16\n210.26.0.0/15\n210.28.0.0/14\n210.32.0.0/12\n210.51.0.0/16\n210.52.0.0/15\n210.56.192.0/19\n210.72.0.0/14\n210.76.0.0/15\n210.78.0.0/16\n210.79.64.0/18\n210.79.224.0/19\n210.82.0.0/15\n210.87.128.0/18\n210.185.192.0/18\n210.192.96.0/19\n211.64.0.0/13\n211.80.0.0/12\n211.96.0.0/13\n211.136.0.0/13\n211.144.0.0/12\n211.160.0.0/13\n212.64.0.0/17\n212.129.128.0/17\n218.0.0.0/11\n218.56.0.0/13\n218.64.0.0/11\n218.96.0.0/14\n218.100.88.0/21\n218.100.96.0/19\n218.100.128.0/17\n218.104.0.0/14\n218.108.0.0/15\n218.185.192.0/19\n218.185.240.0/21\n218.192.0.0/12\n218.240.0.0/13\n218.249.0.0/16\n219.72.0.0/16\n219.82.0.0/16\n219.83.128.0/17\n219.90.68.0/22\n219.90.72.0/21\n219.128.0.0/11\n219.216.0.0/13\n219.224.0.0/12\n219.242.0.0/15\n219.244.0.0/14\n220.101.192.0/18\n220.112.0.0/14\n220.152.128.0/17\n220.154.0.0/15\n220.158.240.0/22\n220.160.0.0/11\n220.192.0.0/12\n220.231.0.0/18\n220.231.128.0/17\n220.232.64.0/18\n220.234.0.0/16\n220.242.0.0/15\n220.247.136.0/21\n220.248.0.0/14\n220.252.0.0/16\n221.0.0.0/13\n221.8.0.0/14\n221.12.0.0/17\n221.12.128.0/18\n221.13.0.0/16\n221.14.0.0/15\n221.122.0.0/15\n221.128.128.0/17\n221.129.0.0/16\n221.130.0.0/15\n221.133.224.0/19\n221.136.0.0/15\n221.172.0.0/14\n221.176.0.0/13\n221.192.0.0/14\n221.196.0.0/15\n221.198.0.0/16\n221.199.0.0/17\n221.199.128.0/18\n221.199.192.0/20\n221.199.224.0/19\n221.200.0.0/13\n221.208.0.0/12\n221.224.0.0/12\n222.16.0.0/12\n222.32.0.0/11\n222.64.0.0/11\n222.125.0.0/16\n222.126.128.0/17\n222.128.0.0/12\n222.160.0.0/14\n222.168.0.0/13\n222.176.0.0/12\n222.192.0.0/11\n222.240.0.0/13\n222.248.0.0/15\n223.0.0.0/12\n223.20.0.0/15\n223.27.184.0/22\n223.29.208.0/22\n223.29.252.0/22\n223.64.0.0/11\n223.96.0.0/12\n223.112.0.0/14\n223.116.0.0/15\n223.120.128.0/17\n223.121.128.0/17\n223.122.0.0/15\n223.124.0.0/14\n223.128.0.0/15\n223.144.0.0/12\n223.160.0.0/14\n223.166.0.0/15\n223.192.0.0/15\n223.198.0.0/15\n223.201.0.0/16\n223.202.0.0/15\n223.208.0.0/13\n223.220.0.0/15\n223.223.176.0/20\n223.223.192.0/20\n223.240.0.0/13\n223.248.0.0/14\n223.252.128.0/17\n223.254.0.0/16\n223.255.0.0/17\n223.255.236.0/22\n223.255.252.0/23\n2001:250::/31\n2001:252::/32\n2001:254::/32\n2001:256::/32\n2001:7fa:5::/48\n2001:7fa:10::/48\n2001:c68::/32\n2001:cc0::/32\n2001:da8::/31\n2001:daa::/32\n2001:dc7::/32\n2001:dd8:1::/48\n2001:dd8:5::/48\n2001:dd8:1a::/48\n2001:dd9::/48\n2001:df0:27e::/48\n2001:df0:423::/48\n2001:df0:2180::/48\n2001:df0:2d80::/48\n2001:df0:2e00::/48\n2001:df0:2e80::/48\n2001:df0:4500::/48\n2001:df0:4580::/48\n2001:df0:5d00::/47\n2001:df0:5d80::/48\n2001:df0:9a00::/48\n2001:df0:b180::/48\n2001:df0:bf80::/48\n2001:df0:d180::/48\n2001:df0:d880::/48\n2001:df1:680::/48\n2001:df1:c80::/48\n2001:df1:2080::/48\n2001:df1:3d00::/48\n2001:df1:4180::/48\n2001:df1:4580::/48\n2001:df1:5280::/48\n2001:df1:5b80::/48\n2001:df1:6180::/48\n2001:df1:6b80::/48\n2001:df1:8b00::/48\n2001:df1:a100::/48\n2001:df1:b980::/48\n2001:df1:bd80::/48\n2001:df1:c900::/48\n2001:df1:d100::/48\n2001:df1:d180::/48\n2001:df1:da00::/48\n2001:df1:e600::/48\n2001:df1:f480::/48\n2001:df1:f580::/48\n2001:df1:fd80::/48\n2001:df2:80::/48\n2001:df2:180::/47\n2001:df2:5200::/48\n2001:df2:5780::/48\n2001:df2:5a80::/48\n2001:df3:b100::/48\n2001:df4:1500::/48\n2001:df4:2f00::/48\n2001:df4:5900::/48\n2001:df4:cf00::/48\n2001:df5:7800::/48\n2001:df6:100::/48\n2001:df6:f00::/48\n2001:df6:1c00::/48\n2001:df6:3d00::/48\n2001:df6:5d00::/48\n2001:df6:6800::/48\n2001:df6:df00::/48\n2001:df6:f400::/48\n2001:df7:5900::/48\n2001:df7:6600::/48\n2001:df7:ab00::/48\n2001:e08::/32\n2001:e18::/32\n2001:e80::/32\n2001:e88::/32\n2001:f38::/32\n2001:f88::/32\n2001:4438::/32\n2001:4510::/29\n2400:1040::/32\n2400:12c0::/32\n2400:1340::/32\n2400:1380::/32\n2400:15c0::/32\n2400:1640::/32\n2400:16c0::/32\n2400:1740::/32\n2400:17c0::/32\n2400:1840::/32\n2400:18c0::/32\n2400:1940::/32\n2400:19c0::/32\n2400:1a40::/32\n2400:1ac0::/32\n2400:1b40::/32\n2400:1cc0::/32\n2400:1d40::/32\n2400:1dc0::/32\n2400:1e40::/32\n2400:1ec0::/32\n2400:1f40::/32\n2400:1fc0::/32\n2400:3040::/32\n2400:3140::/32\n2400:31c0::/32\n2400:3200::/32\n2400:3280::/32\n2400:32c0::/32\n2400:3340::/32\n2400:33c0::/32\n2400:3440::/32\n2400:34c0::/32\n2400:3540::/32\n2400:35c0::/32\n2400:3600::/32\n2400:3640::/32\n2400:36c0::/32\n2400:38c0::/32\n2400:39c0::/32\n2400:3a00::/32\n2400:3a40::/32\n2400:3b40::/32\n2400:3bc0::/32\n2400:3c40::/32\n2400:3cc0::/32\n2400:3e00::/32\n2400:3f40::/32\n2400:3fc0::/32\n2400:4440::/32\n2400:44c0::/32\n2400:4540::/32\n2400:4600::/32\n2400:4640::/32\n2400:46c0::/32\n2400:4740::/32\n2400:4bc0::/32\n2400:4e00::/32\n2400:4e40::/32\n2400:5080::/32\n2400:5280::/32\n2400:5400::/32\n2400:5580::/32\n2400:55c0::/32\n2400:5600::/32\n2400:5640::/32\n2400:56c0::/32\n2400:57c0::/32\n2400:5840::/32\n2400:5a00::/32\n2400:5a40::/32\n2400:5ac0::/32\n2400:5b40::/32\n2400:5bc0::/32\n2400:5c40::/32\n2400:5c80::/32\n2400:5cc0::/32\n2400:5e80::/32\n2400:5fc0::/32\n2400:6000::/32\n2400:6040::/32\n2400:60c0::/32\n2400:61c0::/32\n2400:6200::/32\n2400:6600::/32\n2400:6640::/32\n2400:66c0::/32\n2400:6740::/32\n2400:67c0::/32\n2400:6840::/32\n2400:68c0::/32\n2400:6940::/32\n2400:69c0::/32\n2400:6a00::/32\n2400:6a40::/32\n2400:6ac0::/32\n2400:6b40::/32\n2400:6bc0::/32\n2400:6c40::/32\n2400:6cc0::/32\n2400:6d40::/32\n2400:6dc0::/32\n2400:6e00::/32\n2400:6e40::/32\n2400:6ec0::/32\n2400:6f40::/32\n2400:6f80::/32\n2400:6fc0::/32\n2400:7040::/32\n2400:7100::/32\n2400:7140::/32\n2400:71c0::/32\n2400:7200::/32\n2400:7240::/32\n2400:72c0::/32\n2400:7340::/32\n2400:73c0::/32\n2400:7440::/32\n2400:74c0::/32\n2400:7540::/32\n2400:75c0::/32\n2400:7640::/32\n2400:7680::/32\n2400:76c0::/32\n2400:7740::/32\n2400:77c0::/32\n2400:79c0::/32\n2400:7ac0::/32\n2400:7bc0::/32\n2400:7f80::/32\n2400:7fc0::/32\n2400:8080::/32\n2400:8200::/32\n2400:82c0::/32\n2400:8580::/32\n2400:8600::/32\n2400:8780::/32\n2400:87c0::/32\n2400:8840::/32\n2400:8980::/32\n2400:89c0::/32\n2400:8e00::/32\n2400:8f00::/32\n2400:8fc0::/32\n2400:9040::/32\n2400:9340::/32\n2400:9580::/32\n2400:95c0::/32\n2400:9600::/32\n2400:98c0::/32\n2400:9a00::/32\n2400:9dc0::/32\n2400:9e00::/32\n2400:a040::/32\n2400:a380::/32\n2400:a480::/32\n2400:a6c0::/32\n2400:a780::/32\n2400:a8c0::/32\n2400:a900::/32\n2400:a980::/29\n2400:abc0::/32\n2400:ae00::/32\n2400:b200::/32\n2400:b2c0::/32\n2400:b500::/32\n2400:b600::/32\n2400:b6c0::/32\n2400:b700::/32\n2400:b7c0::/32\n2400:b8c0::/32\n2400:b9c0::/32\n2400:ba00::/32\n2400:ba40::/31\n2400:bac0::/32\n2400:bc40::/32\n2400:be00::/32\n2400:bf00::/32\n2400:c200::/32\n2400:c380::/32\n2400:c840::/32\n2400:c8c0::/32\n2400:c940::/32\n2400:c9c0::/32\n2400:ca40::/32\n2400:cac0::/32\n2400:cb40::/32\n2400:cb80::/32\n2400:cbc0::/32\n2400:cc40::/32\n2400:cc80::/32\n2400:ccc0::/32\n2400:cd40::/32\n2400:cdc0::/32\n2400:ce00::/32\n2400:ce40::/32\n2400:cf40::/32\n2400:cf80::/32\n2400:cfc0::/32\n2400:d0c0::/32\n2400:d100::/32\n2400:d1c0::/32\n2400:d200::/32\n2400:d300::/32\n2400:d380::/32\n2400:d440::/32\n2400:d600::/32\n2400:d6c0::/32\n2400:d780::/32\n2400:da00::/32\n2400:dd00::/28\n2400:dd40::/32\n2400:de00::/32\n2400:de80::/32\n2400:e0c0::/32\n2400:e140::/32\n2400:e5c0::/32\n2400:e680::/32\n2400:e880::/32\n2400:ebc0::/32\n2400:edc0::/32\n2400:ee00::/32\n2400:eec0::/32\n2400:ef40::/32\n2400:f480::/32\n2400:f540::/32\n2400:f5c0::/32\n2400:f7c0::/32\n2400:f840::/32\n2400:f980::/32\n2400:fac0::/32\n2400:fb40::/32\n2400:fbc0::/32\n2400:fc40::/32\n2400:fcc0::/32\n2400:fe00::/32\n2401:80::/32\n2401:140::/32\n2401:1c0::/32\n2401:540::/32\n2401:780::/32\n2401:7c0::/32\n2401:9c0::/32\n2401:a00::/32\n2401:a40::/32\n2401:ac0::/32\n2401:b40::/32\n2401:bc0::/32\n2401:c40::/32\n2401:cc0::/32\n2401:d40::/32\n2401:e00::/32\n2401:1000::/32\n2401:11c0::/32\n2401:1200::/32\n2401:12c0::/32\n2401:15c0::/32\n2401:1740::/32\n2401:18c0::/32\n2401:1940::/32\n2401:19c0::/32\n2401:1a40::/32\n2401:1ac0::/32\n2401:1d40::/32\n2401:1dc0::/32\n2401:1e00::/32\n2401:1ec0::/32\n2401:1f40::/32\n2401:2040::/32\n2401:2080::/32\n2401:23c0::/32\n2401:2600::/32\n2401:2780::/32\n2401:2980::/32\n2401:2a00::/32\n2401:2b40::/32\n2401:2e00::/32\n2401:3100::/32\n2401:3380::/32\n2401:33c0::/32\n2401:3440::/32\n2401:3480::/32\n2401:34c0::/32\n2401:3640::/32\n2401:3780::/32\n2401:3800::/32\n2401:3880::/32\n2401:3980::/32\n2401:3a00::/32\n2401:3a80::/32\n2401:3b80::/32\n2401:3c80::/32\n2401:3d80::/32\n2401:3e80::/32\n2401:3f80::/32\n2401:4080::/32\n2401:4180::/32\n2401:4280::/32\n2401:4380::/32\n2401:4480::/32\n2401:4580::/32\n2401:4680::/32\n2401:4780::/32\n2401:4880::/32\n2401:4a80::/32\n2401:4b00::/32\n2401:4f80::/32\n2401:5180::/32\n2401:5680::/32\n2401:56c0::/32\n2401:59c0::/32\n2401:5b40::/32\n2401:5c80::/32\n2401:7180::/32\n2401:71c0::/32\n2401:7240::/32\n2401:7340::/32\n2401:7580::/32\n2401:7680::/32\n2401:7700::/32\n2401:7780::/32\n2401:7880::/32\n2401:7980::/32\n2401:7a00::/32\n2401:7a80::/32\n2401:7b80::/32\n2401:7bc0::/32\n2401:7c80::/32\n2401:7cc0::/32\n2401:7d40::/32\n2401:7d80::/32\n2401:7e00::/32\n2401:7f80::/32\n2401:8200::/32\n2401:82c0::/32\n2401:8380::/32\n2401:8540::/32\n2401:8600::/32\n2401:8680::/32\n2401:8840::/32\n2401:8d00::/32\n2401:8e40::/32\n2401:8f40::/32\n2401:8fc0::/32\n2401:9340::/32\n2401:9380::/32\n2401:9600::/32\n2401:96c0::/32\n2401:9740::/32\n2401:98c0::/32\n2401:9a00::/32\n2401:9ac0::/32\n2401:9b40::/32\n2401:9bc0::/32\n2401:9dc0::/32\n2401:9e40::/32\n2401:9f80::/32\n2401:a140::/32\n2401:a180::/32\n2401:a340::/32\n2401:a3c0::/32\n2401:a4c0::/32\n2401:a540::/32\n2401:a5c0::/32\n2401:a640::/32\n2401:a940::/32\n2401:a980::/32\n2401:aa00::/32\n2401:aa40::/32\n2401:acc0::/32\n2401:ad40::/32\n2401:adc0::/32\n2401:b040::/32\n2401:b180::/32\n2401:b340::/32\n2401:b400::/32\n2401:b480::/32\n2401:b4c0::/32\n2401:b540::/32\n2401:b580::/32\n2401:b600::/32\n2401:b680::/32\n2401:b6c0::/32\n2401:b7c0::/32\n2401:b940::/32\n2401:ba00::/32\n2401:ba40::/32\n2401:bb80::/32\n2401:be00::/32\n2401:c200::/32\n2401:c540::/32\n2401:c600::/32\n2401:c640::/32\n2401:c6c0::/32\n2401:c840::/32\n2401:c8c0::/32\n2401:ca00::/32\n2401:ca80::/32\n2401:cb80::/32\n2401:cc00::/32\n2401:ce00::/32\n2401:cf40::/32\n2401:cfc0::/32\n2401:d0c0::/32\n2401:d140::/32\n2401:d180::/32\n2401:d2c0::/32\n2401:d340::/32\n2401:d780::/32\n2401:da00::/32\n2401:de00::/32\n2401:e080::/32\n2401:e0c0::/32\n2401:e140::/32\n2401:e240::/32\n2401:e2c0::/32\n2401:e340::/32\n2401:e6c0::/32\n2401:e840::/32\n2401:e8c0::/32\n2401:e940::/32\n2401:e9c0::/32\n2401:ec00::/32\n2401:ec40::/32\n2401:f300::/32\n2401:f7c0::/32\n2401:fa80::/32\n2401:fac0::/32\n2401:fb80::/32\n2401:fc80::/32\n2401:fe80::/32\n2401:ffc0::/32\n2402:440::/32\n2402:5c0::/32\n2402:840::/32\n2402:880::/32\n2402:ac0::/32\n2402:e00::/32\n2402:fc0::/32\n2402:1000::/32\n2402:1440::/32\n2402:14c0::/32\n2402:1540::/32\n2402:1600::/32\n2402:1740::/32\n2402:19c0::/32\n2402:1ec0::/32\n2402:1f40::/32\n2402:1f80::/32\n2402:2000::/32\n2402:2280::/32\n2402:22c0::/32\n2402:2440::/32\n2402:24c0::/32\n2402:2540::/32\n2402:2640::/32\n2402:2780::/32\n2402:27c0::/32\n2402:2a00::/32\n2402:2b80::/32\n2402:2bc0::/32\n2402:2d00::/32\n2402:2d80::/32\n2402:2e80::/32\n2402:2f40::/32\n2402:3040::/32\n2402:3080::/32\n2402:3140::/32\n2402:3180::/32\n2402:31c0::/32\n2402:3240::/32\n2402:33c0::/32\n2402:39c0::/32\n2402:3a40::/32\n2402:3ac0::/32\n2402:3c00::/32\n2402:3e00::/32\n2402:3ec0::/32\n2402:3f40::/32\n2402:3f80::/32\n2402:4140::/32\n2402:42c0::/32\n2402:4340::/32\n2402:43c0::/32\n2402:4440::/32\n2402:4500::/32\n2402:4540::/32\n2402:4a00::/32\n2402:4a40::/32\n2402:4a80::/32\n2402:4ac0::/32\n2402:4b80::/32\n2402:4bc0::/32\n2402:4c40::/32\n2402:4d80::/32\n2402:4e00::/32\n2402:4ec0::/32\n2402:4f80::/32\n2402:50c0::/32\n2402:5140::/32\n2402:5180::/32\n2402:51c0::/32\n2402:5240::/32\n2402:52c0::/32\n2402:5340::/32\n2402:5880::/32\n2402:5940::/32\n2402:59c0::/32\n2402:5a40::/32\n2402:5b40::/32\n2402:5bc0::/32\n2402:5d00::/32\n2402:5e00::/32\n2402:5e40::/32\n2402:5ec0::/32\n2402:5f40::/32\n2402:6280::/32\n2402:62c0::/32\n2402:64c0::/32\n2402:65c0::/32\n2402:66c0::/32\n2402:6740::/32\n2402:67c0::/32\n2402:6a00::/32\n2402:6b40::/32\n2402:6bc0::/32\n2402:6dc0::/32\n2402:6e00::/32\n2402:6e80::/32\n2402:6ec0::/32\n2402:6f40::/32\n2402:6fc0::/32\n2402:7040::/32\n2402:7080::/32\n2402:70c0::/32\n2402:7140::/32\n2402:71c0::/32\n2402:7240::/32\n2402:72c0::/32\n2402:7540::/32\n2402:75c0::/32\n2402:7740::/32\n2402:7d00::/32\n2402:7d80::/32\n2402:8180::/32\n2402:8280::/32\n2402:8300::/32\n2402:8380::/32\n2402:85c0::/32\n2402:87c0::/32\n2402:8800::/32\n2402:8840::/32\n2402:8900::/32\n2402:8940::/32\n2402:89c0::/32\n2402:8b40::/32\n2402:8bc0::/32\n2402:8cc0::/32\n2402:8d40::/32\n2402:8f40::/32\n2402:8f80::/32\n2402:9240::/32\n2402:92c0::/32\n2402:93c0::/32\n2402:9440::/32\n2402:9480::/32\n2402:94c0::/32\n2402:9580::/32\n2402:95c0::/32\n2402:9680::/32\n2402:96c0::/32\n2402:9840::/32\n2402:98c0::/32\n2402:9940::/32\n2402:9a80::/32\n2402:9b80::/32\n2402:9f80::/32\n2402:9fc0::/32\n2402:a080::/32\n2402:a180::/32\n2402:a200::/32\n2402:a240::/32\n2402:a280::/32\n2402:a380::/32\n2402:a3c0::/32\n2402:a640::/32\n2402:a680::/32\n2402:a6c0::/32\n2402:a840::/32\n2402:a880::/32\n2402:a9c0::/32\n2402:aa80::/32\n2402:ab80::/32\n2402:ae00::/32\n2402:ae40::/32\n2402:aec0::/32\n2402:af80::/32\n2402:afc0::/32\n2402:b080::/32\n2402:b200::/32\n2402:b380::/32\n2402:b3c0::/32\n2402:b440::/32\n2402:b6c0::/32\n2402:b880::/32\n2402:b8c0::/32\n2402:b940::/32\n2402:b980::/32\n2402:ba80::/32\n2402:bac0::/32\n2402:bbc0::/32\n2402:bec0::/32\n2402:bf80::/32\n2402:c280::/32\n2402:c3c0::/32\n2402:c5c0::/32\n2402:c9c0::/32\n2402:cbc0::/32\n2402:cc40::/32\n2402:cc80::/32\n2402:cf00::/32\n2402:cf40::/32\n2402:d040::/32\n2402:d140::/32\n2402:d2c0::/32\n2402:d300::/32\n2402:d340::/32\n2402:d380::/32\n2402:d5c0::/32\n2402:d6c0::/32\n2402:d740::/32\n2402:d780::/32\n2402:d880::/32\n2402:d980::/32\n2402:da40::/32\n2402:db40::/32\n2402:dcc0::/32\n2402:de40::/32\n2402:dec0::/32\n2402:df40::/32\n2402:dfc0::/32\n2402:e040::/32\n2402:e0c0::/32\n2402:e140::/32\n2402:e2c0::/32\n2402:e3c0::/32\n2402:e480::/32\n2402:e540::/32\n2402:e680::/32\n2402:e740::/32\n2402:e780::/32\n2402:e7c0::/32\n2402:e880::/32\n2402:e980::/32\n2402:eb80::/32\n2402:ec80::/32\n2402:ed80::/32\n2402:ef40::/32\n2402:ef80::/32\n2402:f000::/32\n2402:f140::/32\n2402:f340::/32\n2402:f3c0::/32\n2402:f480::/32\n2402:f540::/32\n2402:f580::/32\n2402:f740::/32\n2402:f780::/32\n2402:f8c0::/32\n2402:f980::/32\n2402:f9c0::/32\n2402:fac0::/32\n2402:fcc0::/32\n2402:ff40::/32\n2402:ffc0::/32\n2403:600::/32\n2403:700::/32\n2403:7c0::/32\n2403:800::/31\n2403:980::/32\n2403:a80::/32\n2403:b80::/32\n2403:c80::/32\n2403:d40::/32\n2403:d80::/32\n2403:e80::/32\n2403:f00::/32\n2403:f40::/32\n2403:f80::/32\n2403:fc0::/32\n2403:1180::/32\n2403:1340::/32\n2403:1440::/32\n2403:1580::/32\n2403:16c0::/32\n2403:17c0::/32\n2403:1980::/32\n2403:1a40::/32\n2403:1b80::/32\n2403:1c80::/32\n2403:1d80::/32\n2403:1dc0::/32\n2403:1e80::/32\n2403:1ec0::/32\n2403:1f80::/32\n2403:2040::/32\n2403:2080::/32\n2403:2180::/32\n2403:2240::/32\n2403:2280::/32\n2403:2380::/32\n2403:2440::/32\n2403:24c0::/32\n2403:2580::/32\n2403:25c0::/32\n2403:2680::/32\n2403:26c0::/32\n2403:2740::/32\n2403:2780::/32\n2403:28c0::/32\n2403:2940::/32\n2403:2a00::/32\n2403:2a40::/32\n2403:2ac0::/32\n2403:2b40::/32\n2403:2bc0::/32\n2403:2cc0::/32\n2403:2d80::/32\n2403:2f40::/32\n2403:2fc0::/32\n2403:3040::/32\n2403:30c0::/32\n2403:3140::/32\n2403:3280::/32\n2403:32c0::/32\n2403:3380::/32\n2403:3480::/32\n2403:3580::/32\n2403:3640::/32\n2403:3680::/32\n2403:36c0::/32\n2403:3740::/32\n2403:3780::/32\n2403:37c0::/32\n2403:3840::/32\n2403:3880::/32\n2403:38c0::/32\n2403:3940::/32\n2403:3980::/32\n2403:39c0::/32\n2403:3a40::/32\n2403:3b40::/32\n2403:3b80::/32\n2403:3bc0::/32\n2403:3c40::/32\n2403:3c80::/32\n2403:3cc0::/32\n2403:3d40::/32\n2403:3d80::/32\n2403:3dc0::/32\n2403:3e80::/32\n2403:3ec0::/32\n2403:3f40::/32\n2403:3f80::/32\n2403:4080::/32\n2403:4180::/32\n2403:4240::/32\n2403:4280::/32\n2403:4300::/32\n2403:4380::/32\n2403:4580::/32\n2403:4680::/32\n2403:4840::/32\n2403:4880::/32\n2403:4980::/32\n2403:4a40::/32\n2403:4a80::/32\n2403:4b40::/32\n2403:4b80::/32\n2403:4c80::/32\n2403:4cc0::/32\n2403:4d40::/32\n2403:4d80::/32\n2403:4ec0::/32\n2403:5040::/32\n2403:5080::/32\n2403:50c0::/32\n2403:5280::/32\n2403:5380::/32\n2403:54c0::/32\n2403:5540::/32\n2403:5580::/32\n2403:5640::/32\n2403:5780::/32\n2403:58c0::/32\n2403:5980::/32\n2403:5a80::/32\n2403:5b40::/32\n2403:5b80::/32\n2403:5c80::/32\n2403:5d80::/32\n2403:5e40::/32\n2403:5e80::/32\n2403:5ec0::/32\n2403:5f80::/32\n2403:5fc0::/32\n2403:6080::/32\n2403:6180::/32\n2403:6280::/32\n2403:62c0::/32\n2403:6380::/32\n2403:6580::/32\n2403:6680::/32\n2403:6740::/32\n2403:6780::/32\n2403:6880::/32\n2403:6980::/32\n2403:6a00::/32\n2403:6c80::/32\n2403:6d40::/32\n2403:6d80::/32\n2403:6e80::/32\n2403:6f40::/32\n2403:6fc0::/32\n2403:7040::/32\n2403:7080::/32\n2403:7180::/32\n2403:7280::/32\n2403:7380::/32\n2403:7480::/32\n2403:7540::/32\n2403:7580::/32\n2403:76c0::/32\n2403:7700::/32\n2403:7840::/32\n2403:78c0::/32\n2403:7a80::/32\n2403:7b00::/32\n2403:7d80::/32\n2403:7e80::/32\n2403:7f80::/32\n2403:8080::/32\n2403:8180::/32\n2403:8280::/32\n2403:8380::/32\n2403:83c0::/32\n2403:8480::/32\n2403:8580::/32\n2403:8880::/32\n2403:8900::/32\n2403:8980::/32\n2403:8a40::/32\n2403:8a80::/32\n2403:8b00::/32\n2403:8b80::/32\n2403:8c00::/32\n2403:8c80::/32\n2403:8d00::/32\n2403:8d80::/32\n2403:8f80::/32\n2403:9080::/32\n2403:9180::/32\n2403:9280::/32\n2403:9380::/32\n2403:9480::/32\n2403:9580::/32\n2403:9680::/32\n2403:9780::/32\n2403:9880::/32\n2403:9a80::/32\n2403:9ac0::/32\n2403:9b00::/32\n2403:9b40::/32\n2403:9b80::/32\n2403:9c80::/32\n2403:9d00::/32\n2403:9d80::/32\n2403:9e40::/32\n2403:9e80::/32\n2403:9ec0::/32\n2403:9f80::/32\n2403:a100::/32\n2403:a140::/32\n2403:a200::/32\n2403:a300::/32\n2403:a480::/32\n2403:a580::/32\n2403:a680::/32\n2403:a6c0::/32\n2403:a780::/32\n2403:a880::/32\n2403:a940::/32\n2403:a980::/32\n2403:a9c0::/32\n2403:aa40::/32\n2403:aa80::/32\n2403:ab80::/32\n2403:ac00::/32\n2403:af80::/32\n2403:b080::/32\n2403:b180::/32\n2403:b280::/32\n2403:b380::/32\n2403:b400::/32\n2403:b480::/32\n2403:b580::/32\n2403:b680::/32\n2403:b780::/32\n2403:b880::/32\n2403:b980::/32\n2403:ba40::/32\n2403:c040::/32\n2403:c080::/32\n2403:c100::/32\n2403:c140::/32\n2403:c180::/32\n2403:c3c0::/32\n2403:c440::/32\n2403:c480::/32\n2403:c4c0::/32\n2403:c980::/32\n2403:cdc0::/32\n2403:cec0::/32\n2403:cf80::/32\n2403:d080::/32\n2403:d180::/32\n2403:d280::/32\n2403:d2c0::/32\n2403:d380::/32\n2403:d400::/32\n2403:d440::/32\n2403:d480::/32\n2403:d580::/32\n2403:d680::/32\n2403:d780::/32\n2403:d7c0::/32\n2403:d880::/32\n2403:d980::/32\n2403:d9c0::/32\n2403:da80::/32\n2403:dac0::/32\n2403:db00::/32\n2403:db80::/32\n2403:dc80::/32\n2403:dd80::/32\n2403:de80::/32\n2403:df80::/32\n2403:e080::/32\n2403:e180::/32\n2403:e280::/32\n2403:e300::/32\n2403:e480::/32\n2403:e500::/32\n2403:e580::/32\n2403:e640::/32\n2403:e680::/32\n2403:e700::/32\n2403:e780::/32\n2403:e7c0::/32\n2403:e880::/32\n2403:e980::/32\n2403:ea80::/32\n2403:eac0::/32\n2403:eb80::/32\n2403:ec80::/32\n2403:ed00::/32\n2403:ed40::/32\n2403:ed80::/32\n2403:ee80::/32\n2403:ef80::/32\n2403:f080::/32\n2403:f100::/32\n2403:f180::/32\n2403:f240::/32\n2403:f280::/32\n2403:f300::/32\n2403:f380::/32\n2403:f4c0::/32\n2403:f580::/32\n2403:f740::/32\n2403:f8c0::/32\n2403:f980::/32\n2403:fb00::/32\n2403:fb80::/32\n2403:fc40::/32\n2403:fe40::/32\n2403:fe80::/32\n2403:fec0::/32\n2403:ff80::/32\n2403:ffc0::/32\n2404:100::/32\n2404:158::/32\n2404:240::/32\n2404:280::/32\n2404:440::/32\n2404:480::/32\n2404:680::/32\n2404:a80::/32\n2404:b80::/32\n2404:bc0::/32\n2404:c40::/32\n2404:d80::/32\n2404:f00::/32\n2404:f80::/32\n2404:1080::/32\n2404:10c0::/32\n2404:1180::/32\n2404:14c0::/32\n2404:1880::/32\n2404:1c80::/32\n2404:1cc0::/32\n2404:1d80::/32\n2404:1e80::/32\n2404:1f40::/32\n2404:21c0::/32\n2404:30c0::/32\n2404:3140::/32\n2404:31c0::/32\n2404:3240::/32\n2404:32c0::/32\n2404:3300::/32\n2404:3340::/32\n2404:3480::/32\n2404:35c0::/32\n2404:3640::/32\n2404:36c0::/32\n2404:3700::/32\n2404:3740::/32\n2404:37c0::/32\n2404:3840::/32\n2404:3940::/32\n2404:3b00::/32\n2404:3bc0::/32\n2404:3c40::/32\n2404:3f40::/32\n2404:4080::/32\n2404:41c0::/32\n2404:4540::/32\n2404:4740::/32\n2404:4bc0::/32\n2404:4d00::/32\n2404:4dc0::/32\n2404:51c0::/32\n2404:5640::/32\n2404:5a80::/32\n2404:5b00::/32\n2404:5d00::/32\n2404:5e80::/32\n2404:6000::/32\n2404:6100::/32\n2404:6380::/32\n2404:6500::/32\n2404:65c0::/32\n2404:6a40::/32\n2404:6f80::/32\n2404:7100::/32\n2404:7180::/32\n2404:71c0::/32\n2404:7240::/32\n2404:74c0::/32\n2404:7600::/32\n2404:7740::/32\n2404:7940::/32\n2404:7d00::/32\n2404:8040::/32\n2404:80c0::/32\n2404:8140::/32\n2404:81c0::/32\n2404:8480::/32\n2404:8580::/32\n2404:8700::/32\n2404:8880::/32\n2404:8a80::/32\n2404:8b00::/32\n2404:8dc0::/32\n2404:9340::/32\n2404:9880::/32\n2404:9b80::/32\n2404:9c80::/32\n2404:a000::/32\n2404:a080::/32\n2404:a0c0::/32\n2404:a180::/32\n2404:a240::/32\n2404:a740::/32\n2404:b100::/32\n2404:b340::/32\n2404:b3c0::/32\n2404:b440::/32\n2404:b4c0::/32\n2404:b900::/32\n2404:bbc0::/32\n2404:bc40::/32\n2404:c1c0::/32\n2404:c240::/32\n2404:c2c0::/32\n2404:c300::/32\n2404:c3c0::/32\n2404:c440::/32\n2404:c4c0::/32\n2404:c540::/32\n2404:c5c0::/32\n2404:c640::/32\n2404:c940::/32\n2404:c9c0::/32\n2404:cd00::/32\n2404:d040::/32\n2404:d080::/32\n2404:d140::/32\n2404:d280::/32\n2404:d3c0::/32\n2404:d480::/32\n2404:d640::/32\n2404:d6c0::/32\n2404:d780::/32\n2404:d7c0::/32\n2404:d840::/32\n2404:dd80::/32\n2404:df00::/32\n2404:e180::/32\n2404:e280::/32\n2404:e540::/32\n2404:e5c0::/32\n2404:e780::/32\n2404:e880::/32\n2404:e8c0::/32\n2404:eb40::/32\n2404:eb80::/32\n2404:ec40::/32\n2404:ecc0::/32\n2404:edc0::/32\n2404:f040::/32\n2404:f4c0::/32\n2404:f7c0::/32\n2405:80::/32\n2405:480::/32\n2405:580::/32\n2405:680::/32\n2405:6c0::/32\n2405:780::/32\n2405:880::/32\n2405:940::/32\n2405:980::/32\n2405:9c0::/32\n2405:a80::/32\n2405:b80::/32\n2405:c80::/32\n2405:d80::/32\n2405:e80::/32\n2405:f40::/32\n2405:f80::/32\n2405:1080::/32\n2405:1180::/32\n2405:1280::/32\n2405:1380::/32\n2405:1480::/32\n2405:1580::/32\n2405:1680::/32\n2405:18c0::/32\n2405:1c80::/32\n2405:1d80::/32\n2405:1e80::/32\n2405:1f80::/32\n2405:1fc0::/32\n2405:2080::/32\n2405:2180::/32\n2405:2280::/32\n2405:2340::/32\n2405:2380::/32\n2405:2480::/32\n2405:24c0::/32\n2405:2580::/32\n2405:2680::/32\n2405:2780::/32\n2405:2880::/32\n2405:2980::/32\n2405:2a80::/32\n2405:2b80::/32\n2405:2bc0::/32\n2405:2c80::/32\n2405:2d80::/32\n2405:2e80::/32\n2405:2ec0::/32\n2405:2f40::/32\n2405:2f80::/32\n2405:3140::/32\n2405:31c0::/32\n2405:37c0::/32\n2405:3880::/32\n2405:3980::/32\n2405:39c0::/32\n2405:3a80::/32\n2405:3ac0::/32\n2405:3b00::/32\n2405:3b80::/32\n2405:3bc0::/32\n2405:3c40::/32\n2405:3c80::/32\n2405:3d80::/32\n2405:3e80::/32\n2405:3f40::/32\n2405:3f80::/32\n2405:4080::/32\n2405:4140::/32\n2405:4180::/32\n2405:41c0::/32\n2405:4280::/32\n2405:4380::/32\n2405:4480::/32\n2405:44c0::/32\n2405:4540::/32\n2405:4580::/32\n2405:4680::/32\n2405:4780::/32\n2405:4880::/32\n2405:4980::/32\n2405:4a80::/32\n2405:4b80::/32\n2405:4d40::/32\n2405:4e80::/32\n2405:4f80::/32\n2405:5080::/32\n2405:5180::/32\n2405:5240::/32\n2405:5280::/32\n2405:52c0::/32\n2405:5380::/32\n2405:5480::/32\n2405:5580::/32\n2405:5680::/32\n2405:5780::/32\n2405:57c0::/32\n2405:5880::/32\n2405:5980::/32\n2405:5a80::/32\n2405:5b00::/32\n2405:5b80::/32\n2405:5c80::/32\n2405:5cc0::/32\n2405:5d40::/32\n2405:5d80::/32\n2405:5dc0::/32\n2405:5e80::/32\n2405:5f80::/32\n2405:6080::/32\n2405:6180::/32\n2405:6200::/32\n2405:66c0::/32\n2405:6880::/32\n2405:68c0::/32\n2405:6940::/32\n2405:69c0::/32\n2405:6a80::/32\n2405:6b80::/32\n2405:6c80::/32\n2405:6d80::/32\n2405:6e80::/32\n2405:6f00::/32\n2405:6f80::/32\n2405:7040::/32\n2405:7080::/32\n2405:7180::/32\n2405:7240::/32\n2405:7280::/32\n2405:7380::/32\n2405:7480::/32\n2405:7580::/32\n2405:7680::/32\n2405:7780::/32\n2405:7880::/32\n2405:78c0::/32\n2405:7980::/32\n2405:79c0::/32\n2405:7a80::/32\n2405:7b80::/32\n2405:7c80::/32\n2405:7d40::/32\n2405:7f40::/32\n2405:7fc0::/32\n2405:8280::/32\n2405:83c0::/32\n2405:8480::/32\n2405:84c0::/32\n2405:8580::/32\n2405:8680::/32\n2405:8780::/32\n2405:8880::/32\n2405:8980::/32\n2405:8a40::/32\n2405:8a80::/32\n2405:8ac0::/32\n2405:8b40::/32\n2405:8b80::/32\n2405:8c80::/32\n2405:8d80::/32\n2405:8e80::/32\n2405:8f40::/32\n2405:8f80::/32\n2405:9080::/32\n2405:9180::/32\n2405:9280::/32\n2405:9300::/32\n2405:9340::/32\n2405:9380::/32\n2405:93c0::/32\n2405:9480::/32\n2405:94c0::/32\n2405:9580::/32\n2405:9680::/32\n2405:9700::/32\n2405:9780::/32\n2405:9880::/32\n2405:9900::/32\n2405:9980::/32\n2405:9a80::/32\n2405:9b00::/32\n2405:9b80::/32\n2405:9e00::/32\n2405:a500::/32\n2405:a680::/32\n2405:a900::/32\n2405:a980::/32\n2405:aa80::/32\n2405:ab00::/32\n2405:ad00::/32\n2405:af00::/32\n2405:b100::/32\n2405:b300::/32\n2405:b880::/32\n2405:b980::/32\n2405:bb00::/32\n2405:bd00::/32\n2405:bd80::/32\n2405:be80::/32\n2405:bf00::/32\n2405:c280::/32\n2405:c380::/32\n2405:c480::/32\n2405:c500::/32\n2405:c580::/32\n2405:c680::/32\n2405:c780::/32\n2405:c880::/32\n2405:c980::/32\n2405:ca80::/32\n2405:cb80::/32\n2405:cc80::/32\n2405:cd80::/32\n2405:ce80::/32\n2405:d280::/32\n2405:d700::/32\n2405:d900::/32\n2405:e000::/32\n2405:e600::/32\n2405:ee80::/32\n2405:f380::/32\n2405:f580::/32\n2405:fe80::/32\n2405:ff80::/32\n2406:80::/32\n2406:280::/32\n2406:880::/32\n2406:d80::/32\n2406:e80::/32\n2406:f80::/32\n2406:1080::/32\n2406:1100::/32\n2406:1180::/32\n2406:1280::/32\n2406:1380::/32\n2406:1480::/32\n2406:1580::/32\n2406:1680::/32\n2406:1780::/32\n2406:1880::/32\n2406:1980::/32\n2406:1a80::/32\n2406:1b80::/32\n2406:1c80::/32\n2406:1d80::/32\n2406:1e80::/32\n2406:1f80::/32\n2406:2080::/32\n2406:2580::/32\n2406:2700::/32\n2406:2780::/32\n2406:2880::/32\n2406:2980::/32\n2406:2a80::/32\n2406:2b80::/32\n2406:2c80::/32\n2406:2d80::/32\n2406:2e80::/32\n2406:2f80::/32\n2406:3080::/32\n2406:3180::/32\n2406:3280::/32\n2406:3300::/32\n2406:3380::/32\n2406:3480::/32\n2406:3580::/32\n2406:3680::/32\n2406:3700::/32\n2406:3780::/32\n2406:3880::/32\n2406:3980::/32\n2406:3d80::/32\n2406:3e80::/32\n2406:3f80::/32\n2406:4080::/32\n2406:4180::/32\n2406:4280::/32\n2406:4380::/32\n2406:4480::/32\n2406:4500::/32\n2406:4680::/32\n2406:4980::/32\n2406:4b80::/32\n2406:4c80::/32\n2406:4d00::/32\n2406:4d80::/32\n2406:4e80::/32\n2406:4f00::/32\n2406:4f80::/32\n2406:5080::/32\n2406:5180::/32\n2406:5280::/32\n2406:5380::/32\n2406:5480::/32\n2406:5580::/32\n2406:5680::/32\n2406:5780::/32\n2406:5880::/32\n2406:5980::/32\n2406:5d80::/32\n2406:5e80::/32\n2406:5f80::/32\n2406:6080::/32\n2406:6100::/32\n2406:6180::/32\n2406:6280::/32\n2406:6300::/32\n2406:6380::/32\n2406:6480::/32\n2406:6500::/32\n2406:6580::/32\n2406:6680::/32\n2406:6780::/32\n2406:6880::/32\n2406:6980::/32\n2406:6a80::/32\n2406:6b80::/32\n2406:6c80::/32\n2406:6d80::/32\n2406:6e80::/32\n2406:6f80::/32\n2406:7080::/32\n2406:7280::/32\n2406:7380::/32\n2406:7480::/32\n2406:7580::/32\n2406:7680::/32\n2406:7780::/32\n2406:7880::/32\n2406:7980::/32\n2406:7a80::/32\n2406:7b80::/32\n2406:7c80::/32\n2406:7d00::/32\n2406:7d80::/32\n2406:7e80::/32\n2406:7f80::/32\n2406:8080::/32\n2406:8180::/32\n2406:8280::/32\n2406:8380::/32\n2406:8480::/32\n2406:8500::/32\n2406:8580::/32\n2406:8780::/32\n2406:8880::/32\n2406:8980::/32\n2406:8a80::/32\n2406:8b80::/32\n2406:8c80::/32\n2406:8d80::/32\n2406:8e80::/32\n2406:8f80::/32\n2406:9180::/32\n2406:9200::/32\n2406:9280::/32\n2406:9380::/32\n2406:9480::/32\n2406:9780::/32\n2406:9d80::/32\n2406:9e80::/32\n2406:9f80::/32\n2406:a080::/32\n2406:a180::/32\n2406:a280::/32\n2406:a380::/32\n2406:a480::/32\n2406:a580::/32\n2406:a680::/32\n2406:a780::/32\n2406:a880::/32\n2406:a980::/32\n2406:aa80::/32\n2406:ab80::/32\n2406:ac80::/32\n2406:ad80::/32\n2406:ae80::/32\n2406:af80::/32\n2406:b080::/32\n2406:b880::/32\n2406:b980::/32\n2406:ba80::/32\n2406:bb80::/32\n2406:bc80::/32\n2406:bd80::/32\n2406:be80::/32\n2406:bf80::/32\n2406:c080::/32\n2406:c180::/32\n2406:c280::/32\n2406:c480::/32\n2406:c580::/32\n2406:c680::/32\n2406:c780::/32\n2406:c880::/32\n2406:c900::/32\n2406:c980::/32\n2406:ca80::/32\n2406:cb80::/32\n2406:cc80::/32\n2406:cd80::/32\n2406:ce80::/32\n2406:cf00::/30\n2406:cf80::/32\n2406:d080::/32\n2406:d180::/32\n2406:d280::/32\n2406:d380::/32\n2406:d480::/32\n2406:d580::/32\n2406:d680::/32\n2406:d780::/32\n2406:d880::/32\n2406:d980::/32\n2406:db80::/32\n2406:dc80::/32\n2406:dd00::/32\n2406:dd80::/32\n2406:de80::/32\n2406:df80::/32\n2406:e080::/32\n2406:e180::/32\n2406:e280::/32\n2406:e380::/32\n2406:e500::/32\n2406:e580::/32\n2406:e680::/32\n2406:e780::/32\n2406:f280::/32\n2406:f300::/32\n2406:f980::/32\n2406:fc80::/32\n2406:fd80::/32\n2406:fe80::/32\n2406:ff00::/32\n2407:480::/32\n2407:580::/32\n2407:1180::/32\n2407:1900::/32\n2407:1d00::/32\n2407:1e80::/32\n2407:2280::/32\n2407:2380::/32\n2407:2780::/32\n2407:3700::/32\n2407:3900::/32\n2407:4580::/32\n2407:4680::/32\n2407:4880::/32\n2407:4980::/32\n2407:4a80::/32\n2407:4c80::/32\n2407:4d80::/32\n2407:4e80::/32\n2407:4f00::/32\n2407:5380::/32\n2407:5500::/32\n2407:5780::/32\n2407:6580::/32\n2407:6a80::/32\n2407:7680::/32\n2407:7780::/32\n2407:7880::/32\n2407:7980::/32\n2407:7c80::/32\n2407:7d00::/32\n2407:7d80::/32\n2407:7e80::/32\n2407:8880::/32\n2407:8b80::/32\n2407:9080::/32\n2407:9180::/32\n2407:9680::/32\n2407:9980::/32\n2407:9f00::/32\n2407:9f80::/32\n2407:a480::/32\n2407:a880::/32\n2407:ad80::/32\n2407:ae80::/32\n2407:af80::/32\n2407:b080::/32\n2407:b180::/32\n2407:b280::/32\n2407:b380::/32\n2407:b580::/32\n2407:b680::/32\n2407:b780::/32\n2407:b880::/32\n2407:b980::/32\n2407:ba00::/32\n2407:ba80::/32\n2407:bb80::/32\n2407:bc00::/32\n2407:bc80::/32\n2407:bd80::/32\n2407:be80::/32\n2407:bf80::/32\n2407:c080::/32\n2407:c380::/32\n2407:c400::/32\n2407:c480::/32\n2407:c580::/32\n2407:c680::/32\n2407:c780::/32\n2407:c880::/32\n2407:c900::/32\n2407:c980::/32\n2407:cb80::/32\n2407:cc80::/32\n2407:cd80::/32\n2407:ce80::/32\n2407:cf00::/32\n2407:cf80::/32\n2407:d480::/32\n2407:d580::/32\n2407:d680::/32\n2407:d780::/32\n2407:d880::/32\n2407:d980::/32\n2407:da80::/32\n2407:db80::/32\n2407:dc80::/32\n2407:dd80::/32\n2407:de80::/32\n2407:df80::/32\n2407:e080::/32\n2407:e180::/32\n2407:e280::/32\n2407:e380::/32\n2407:e480::/32\n2407:e580::/32\n2407:e680::/32\n2407:e780::/32\n2407:e800::/32\n2407:ea80::/32\n2407:eb80::/32\n2407:ec80::/32\n2407:ed80::/32\n2407:ee80::/32\n2407:ef80::/32\n2407:f080::/32\n2407:f180::/32\n2407:f280::/32\n2407:f380::/32\n2407:f480::/32\n2407:f580::/32\n2407:f680::/32\n2407:f780::/32\n2407:f880::/32\n2407:f980::/32\n2407:fa80::/32\n2407:fb80::/32\n2407:fc80::/32\n2407:fd80::/32\n2408:4000::/22\n2408:8000::/20\n2409:8000::/20\n240a:4000::/21\n240a:8000::/21\n240a:c000::/20\n240b:8000::/21\n240c::/28\n240c:4000::/22\n240c:8000::/21\n240c:c000::/20\n240d:4000::/21\n240d:8000::/24\n240e::/18\n240f:4000::/24\n240f:8000::/24\n240f:c000::/24\n\n[proxy_list]\n# Telegram IPs$\n91.108.4.0/22\n91.108.8.0/21\n91.108.16.0/21\n91.108.36.0/22\n91.108.56.0/22\n109.239.140.0/24\n149.154.160.0/20\n14.102.250.18\n14.102.250.19\n174.142.105.153\n50.7.31.230\n67.220.91.15\n67.220.91.18\n67.220.91.23\n69.65.19.160\n72.52.81.22\n85.17.73.31\n(?:^|\\.)030buy\\.com$\n(?:^|\\.)0rz\\.tw$\n(?:^|\\.)1-apple\\.com\\.tw$\n(?:^|\\.)10\\.tt$\n(?:^|\\.)1000giri\\.net$\n(?:^|\\.)100ke\\.org$\n(?:^|\\.)10conditionsoflove\\.com$\n(?:^|\\.)10musume\\.com$\n(?:^|\\.)123rf\\.com$\n(?:^|\\.)12bet\\.com$\n(?:^|\\.)12vpn\\.com$\n(?:^|\\.)12vpn\\.net$\n(?:^|\\.)138\\.com$\n(?:^|\\.)141hongkong\\.com$\n(?:^|\\.)141jj\\.com$\n(?:^|\\.)141tube\\.com$\n(?:^|\\.)1688\\.com\\.au$\n(?:^|\\.)173ng\\.com$\n(?:^|\\.)177pic\\.info$\n(?:^|\\.)17t17p\\.com$\n(?:^|\\.)18board\\.com$\n(?:^|\\.)18board\\.info$\n(?:^|\\.)18onlygirls\\.com$\n(?:^|\\.)18p2p\\.com$\n(?:^|\\.)18virginsex\\.com$\n(?:^|\\.)1949er\\.org$\n(?:^|\\.)1984bbs\\.com$\n(?:^|\\.)1984bbs\\.org$\n(?:^|\\.)1989report\\.hkja\\.org\\.hk$\n(?:^|\\.)1991way\\.com$\n(?:^|\\.)1998cdp\\.org$\n(?:^|\\.)1bao\\.org$\n(?:^|\\.)1dumb\\.com$\n(?:^|\\.)1e100\\.net$\n(?:^|\\.)1eew\\.com$\n(?:^|\\.)1mobile\\.com$\n(?:^|\\.)1pondo\\.tv$\n(?:^|\\.)2-hand\\.info$\n(?:^|\\.)2000fun\\.com$\n(?:^|\\.)2008xianzhang\\.info$\n(?:^|\\.)2017\\.hk$\n(?:^|\\.)21andy\\.com$\n(?:^|\\.)21pron\\.com$\n(?:^|\\.)21sextury\\.com$\n(?:^|\\.)228\\.net\\.tw$\n(?:^|\\.)233abc\\.com$\n(?:^|\\.)24hrs\\.ca$\n(?:^|\\.)24smile\\.org$\n(?:^|\\.)25u\\.com$\n(?:^|\\.)2lipstube\\.com$\n(?:^|\\.)2shared\\.com$\n(?:^|\\.)2waky\\.com$\n(?:^|\\.)3-a\\.net$\n(?:^|\\.)30boxes\\.com$\n(?:^|\\.)315lz\\.com$\n(?:^|\\.)32red\\.com$\n(?:^|\\.)36rain\\.com$\n(?:^|\\.)3a5a\\.com$\n(?:^|\\.)3arabtv\\.com$\n(?:^|\\.)3boys2girls\\.com$\n(?:^|\\.)3d-game\\.com$\n(?:^|\\.)3proxy\\.ru$\n(?:^|\\.)3ren\\.ca$\n(?:^|\\.)3tui\\.net$\n(?:^|\\.)43110\\.cf$\n(?:^|\\.)466453\\.com$\n(?:^|\\.)4bluestones\\.biz$\n(?:^|\\.)4chan\\.com$\n(?:^|\\.)4dq\\.com$\n(?:^|\\.)4everproxy\\.com$\n(?:^|\\.)4irc\\.com$\n(?:^|\\.)4mydomain\\.com$\n(?:^|\\.)4pu\\.com$\n(?:^|\\.)4rbtv\\.com$\n(?:^|\\.)4shared\\.com$\n(?:^|\\.)51\\.ca$\n(?:^|\\.)51jav\\.org$\n(?:^|\\.)51luoben\\.com$\n(?:^|\\.)5278\\.cc$\n(?:^|\\.)5299\\.tv$\n(?:^|\\.)56cun04\\.jigsy\\.com$\n(?:^|\\.)5aimiku\\.com$\n(?:^|\\.)5i01\\.com$\n(?:^|\\.)5isotoi5\\.org$\n(?:^|\\.)5maodang\\.com$\n(?:^|\\.)63i\\.com$\n(?:^|\\.)64memo$\n(?:^|\\.)64museum\\.org$\n(?:^|\\.)64tianwang\\.com$\n(?:^|\\.)64wiki\\.com$\n(?:^|\\.)66\\.ca$\n(?:^|\\.)666kb\\.com$\n(?:^|\\.)6park\\.com$\n(?:^|\\.)6parker\\.com$\n(?:^|\\.)7capture\\.com$\n(?:^|\\.)7cow\\.com$\n(?:^|\\.)8-d\\.com$\n(?:^|\\.)85cc\\.net$\n(?:^|\\.)85cc\\.us$\n(?:^|\\.)85st\\.com$\n(?:^|\\.)881903\\.com$\n(?:^|\\.)888\\.com$\n(?:^|\\.)888poker\\.com$\n(?:^|\\.)89-64\\.org$\n(?:^|\\.)89\\.64\\.charter\\.constitutionalism\\.solutions$\n(?:^|\\.)8news\\.com\\.tw$\n(?:^|\\.)8z1\\.net$\n(?:^|\\.)9001700\\.com$\n(?:^|\\.)908taiwan\\.org$\n(?:^|\\.)91porn\\.com$\n(?:^|\\.)91vps\\.club$\n(?:^|\\.)92ccav\\.com$\n(?:^|\\.)991\\.com$\n(?:^|\\.)99btgc01\\.com$\n(?:^|\\.)99cn\\.info$\n(?:^|\\.)9bis\\.com$\n(?:^|\\.)9bis\\.net$\n(?:^|\\.)9gag\\.com$\n(?:^|\\.)a-normal-day\\.com$\n(?:^|\\.)a248\\.e\\.akamai\\.net$\n(?:^|\\.)a5\\.com\\.ru$\n(?:^|\\.)aamacau\\.com$\n(?:^|\\.)abc\\.com$\n(?:^|\\.)abc\\.net\\.au$\n(?:^|\\.)abc\\.pp\\.ru$\n(?:^|\\.)abc\\.xyz$\n(?:^|\\.)abchinese\\.com$\n(?:^|\\.)abclite\\.net$\n(?:^|\\.)abebooks\\.com$\n(?:^|\\.)abematv\\.akamaized\\.net$\n(?:^|\\.)abitno\\.linpie\\.com$\n(?:^|\\.)ablwang\\.com$\n(?:^|\\.)aboluowang\\.com$\n(?:^|\\.)about\\.google$\n(?:^|\\.)aboutgfw\\.com$\n(?:^|\\.)abs\\.edu$\n(?:^|\\.)ac\\.jiruan\\.net$\n(?:^|\\.)accim\\.org$\n(?:^|\\.)aceros-de-hispania\\.com$\n(?:^|\\.)acevpn\\.com$\n(?:^|\\.)acg18\\.me$\n(?:^|\\.)acgkj\\.com$\n(?:^|\\.)acmedia365\\.com$\n(?:^|\\.)acmetoy\\.com$\n(?:^|\\.)acnw\\.com\\.au$\n(?:^|\\.)actfortibet\\.org$\n(?:^|\\.)actimes\\.com\\.au$\n(?:^|\\.)activpn\\.com$\n(?:^|\\.)aculo\\.us$\n(?:^|\\.)adcex\\.com$\n(?:^|\\.)addictedtocoffee\\.de$\n(?:^|\\.)adelaidebbs\\.com$\n(?:^|\\.)admin\\.recaptcha\\.net$\n(?:^|\\.)admob\\.com$\n(?:^|\\.)adpl\\.org\\.hk$\n(?:^|\\.)ads-twitter\\.com$\n(?:^|\\.)adsense\\.com$\n(?:^|\\.)adult-sex-games\\.com$\n(?:^|\\.)adult\\.friendfinder\\.com$\n(?:^|\\.)adultfriendfinder\\.com$\n(?:^|\\.)adultkeep\\.net$\n(?:^|\\.)advanscene\\.com$\n(?:^|\\.)advertfan\\.com$\n(?:^|\\.)ae\\.hao123\\.com$\n(?:^|\\.)ae\\.org$\n(?:^|\\.)aenhancers\\.com$\n(?:^|\\.)aex\\.com$\n(?:^|\\.)af\\.mil$\n(?:^|\\.)afantibbs\\.com$\n(?:^|\\.)agnesb\\.fr$\n(?:^|\\.)agoogleaday\\.com$\n(?:^|\\.)agro\\.hk$\n(?:^|\\.)ahr0chm6ly95zwnslm5lda$\n(?:^|\\.)ai-kan\\.net$\n(?:^|\\.)ai-wen\\.net$\n(?:^|\\.)ai\\.binwang\\.me$\n(?:^|\\.)ai\\.google$\n(?:^|\\.)aiph\\.net$\n(?:^|\\.)airasia\\.com$\n(?:^|\\.)airconsole\\.com$\n(?:^|\\.)airvpn\\.org$\n(?:^|\\.)aisex\\.com$\n(?:^|\\.)ait\\.org\\.tw$\n(?:^|\\.)aiweiwei\\.com$\n(?:^|\\.)aiweiweiblog\\.com$\n(?:^|\\.)akademiye\\.org$\n(?:^|\\.)akiba-online\\.com$\n(?:^|\\.)akiba-web\\.com$\n(?:^|\\.)akow\\.org$\n(?:^|\\.)al-islam\\.com$\n(?:^|\\.)al-qimmah\\.net$\n(?:^|\\.)alabout\\.com$\n(?:^|\\.)alanhou\\.com$\n(?:^|\\.)alarab\\.qa$\n(?:^|\\.)alasbarricadas\\.org$\n(?:^|\\.)alexlur\\.org$\n(?:^|\\.)alforattv\\.net$\n(?:^|\\.)alhayat\\.com$\n(?:^|\\.)alicejapan\\.co\\.jp$\n(?:^|\\.)aliengu\\.com$\n(?:^|\\.)alkasir\\.com$\n(?:^|\\.)allcoin\\.com$\n(?:^|\\.)allconnected\\.co$\n(?:^|\\.)alldrawnsex\\.com$\n(?:^|\\.)allervpn\\.com$\n(?:^|\\.)allfinegirls\\.com$\n(?:^|\\.)allgirlmassage\\.com$\n(?:^|\\.)allgirlsallowed\\.org$\n(?:^|\\.)allgravure\\.com$\n(?:^|\\.)alliance\\.org\\.hk$\n(?:^|\\.)allinfa\\.com$\n(?:^|\\.)alljackpotscasino\\.com$\n(?:^|\\.)allmovie\\.com$\n(?:^|\\.)allowed\\.org$\n(?:^|\\.)almasdarnews\\.com$\n(?:^|\\.)almostmy\\.com$\n(?:^|\\.)alphaporno\\.com$\n(?:^|\\.)alternate-tools\\.com$\n(?:^|\\.)alternativeto\\.net$\n(?:^|\\.)altrec\\.com$\n(?:^|\\.)alvinalexander\\.com$\n(?:^|\\.)alwaysdata\\.com$\n(?:^|\\.)alwaysdata\\.net$\n(?:^|\\.)alwaysvpn\\.com$\n(?:^|\\.)am730\\.com\\.hk$\n(?:^|\\.)amazon\\.co\\.jp$\n(?:^|\\.)amazon\\.com$\n(?:^|\\.)ameblo\\.jp$\n(?:^|\\.)americangreencard\\.com$\n(?:^|\\.)americanunfinished\\.com$\n(?:^|\\.)amiblockedornot\\.com$\n(?:^|\\.)amigobbs\\.net$\n(?:^|\\.)amitabhafoundation\\.us$\n(?:^|\\.)amnesty\\.org$\n(?:^|\\.)amnesty\\.org\\.hk$\n(?:^|\\.)amnesty\\.tw$\n(?:^|\\.)amnestyusa\\.org$\n(?:^|\\.)amnyemachen\\.org$\n(?:^|\\.)amoiist\\.com$\n(?:^|\\.)ampproject\\.org$\n(?:^|\\.)amtb-taipei\\.org$\n(?:^|\\.)anchorfree\\.com$\n(?:^|\\.)ancsconf\\.org$\n(?:^|\\.)andfaraway\\.net$\n(?:^|\\.)android-x86\\.org$\n(?:^|\\.)android\\.com$\n(?:^|\\.)androidify\\.com$\n(?:^|\\.)androidplus\\.co$\n(?:^|\\.)androidtv\\.com$\n(?:^|\\.)andygod\\.com$\n(?:^|\\.)angela-merkel\\.de$\n(?:^|\\.)angelfire\\.com$\n(?:^|\\.)angola\\.org$\n(?:^|\\.)angularjs\\.org$\n(?:^|\\.)animecrazy\\.net$\n(?:^|\\.)animeshippuuden\\.com$\n(?:^|\\.)aniscartujo\\.com$\n(?:^|\\.)annatam\\.com$\n(?:^|\\.)anobii\\.com$\n(?:^|\\.)anontext\\.com$\n(?:^|\\.)anonymise\\.us$\n(?:^|\\.)anonymitynetwork\\.com$\n(?:^|\\.)anonymizer\\.com$\n(?:^|\\.)anonymouse\\.org$\n(?:^|\\.)anpopo\\.com$\n(?:^|\\.)answering-islam\\.org$\n(?:^|\\.)anthonycalzadilla\\.com$\n(?:^|\\.)anti1984\\.com$\n(?:^|\\.)antichristendom\\.com$\n(?:^|\\.)antiwave\\.net$\n(?:^|\\.)anyporn\\.com$\n(?:^|\\.)anysex\\.com$\n(?:^|\\.)aobo\\.com\\.au$\n(?:^|\\.)aofriend\\.com$\n(?:^|\\.)aofriend\\.com\\.au$\n(?:^|\\.)aojiao\\.org$\n(?:^|\\.)aolchannels\\.aol\\.com$\n(?:^|\\.)aomiwang\\.com$\n(?:^|\\.)apartmentratings\\.com$\n(?:^|\\.)apartments\\.com$\n(?:^|\\.)apetube\\.com$\n(?:^|\\.)api-secure\\.recaptcha\\.net$\n(?:^|\\.)api-verify\\.recaptcha\\.net$\n(?:^|\\.)api\\.ai$\n(?:^|\\.)api\\.dropboxapi\\.com$\n(?:^|\\.)api\\.linksalpha\\.com$\n(?:^|\\.)api\\.proxlet\\.com$\n(?:^|\\.)api\\.pureapk\\.com$\n(?:^|\\.)api\\.recaptcha\\.net$\n(?:^|\\.)apiary\\.io$\n(?:^|\\.)apidocs\\.linksalpha\\.com$\n(?:^|\\.)apigee\\.com$\n(?:^|\\.)apk-dl\\.com$\n(?:^|\\.)apkdler\\.com$\n(?:^|\\.)apkmirror\\.com$\n(?:^|\\.)apkmonk\\.com$\n(?:^|\\.)apkplz\\.com$\n(?:^|\\.)apkpure\\.com$\n(?:^|\\.)aplusvpn\\.com$\n(?:^|\\.)app\\.box\\.com$\n(?:^|\\.)app\\.heywire\\.com$\n(?:^|\\.)app\\.smartmailcloud\\.com$\n(?:^|\\.)app\\.tutanota\\.com$\n(?:^|\\.)appdownloader\\.net$\n(?:^|\\.)appledaily\\.com$\n(?:^|\\.)appledaily\\.com\\.hk$\n(?:^|\\.)appledaily\\.com\\.tw$\n(?:^|\\.)appshopper\\.com$\n(?:^|\\.)appsocks\\.net$\n(?:^|\\.)appspot\\.com$\n(?:^|\\.)appsto\\.re$\n(?:^|\\.)aptoide\\.com$\n(?:^|\\.)ar\\.hao123\\.com$\n(?:^|\\.)archive\\.fo$\n(?:^|\\.)archive\\.is$\n(?:^|\\.)archive\\.li$\n(?:^|\\.)archive\\.org$\n(?:^|\\.)archive\\.today$\n(?:^|\\.)archives\\.gov$\n(?:^|\\.)archives\\.gov\\.tw$\n(?:^|\\.)arctosia\\.com$\n(?:^|\\.)areca-backup\\.org$\n(?:^|\\.)arena\\.taipei$\n(?:^|\\.)arethusa\\.su$\n(?:^|\\.)arlingtoncemetery\\.mil$\n(?:^|\\.)army\\.mil$\n(?:^|\\.)art4tibet1998\\.org$\n(?:^|\\.)arte\\.tv$\n(?:^|\\.)artofpeacefoundation\\.org$\n(?:^|\\.)artstation\\.com$\n(?:^|\\.)artsy\\.net$\n(?:^|\\.)asacp\\.org$\n(?:^|\\.)asdfg\\.jp$\n(?:^|\\.)asg\\.to$\n(?:^|\\.)asia-gaming\\.com$\n(?:^|\\.)asiaharvest\\.org$\n(?:^|\\.)asianews\\.it$\n(?:^|\\.)asiansexdiary\\.com$\n(?:^|\\.)asianspiss\\.com$\n(?:^|\\.)asianwomensfilm\\.de$\n(?:^|\\.)asiatgp\\.com$\n(?:^|\\.)asiatoday\\.us$\n(?:^|\\.)askstudent\\.com$\n(?:^|\\.)askynz\\.net$\n(?:^|\\.)assembla\\.com$\n(?:^|\\.)assets\\.bwbx\\.io$\n(?:^|\\.)assimp\\.org$\n(?:^|\\.)astrill\\.com$\n(?:^|\\.)atc\\.org\\.au$\n(?:^|\\.)atchinese\\.com$\n(?:^|\\.)atdmt\\.com$\n(?:^|\\.)atgfw\\.org$\n(?:^|\\.)athenaeizou\\.com$\n(?:^|\\.)atlanta168\\.com$\n(?:^|\\.)atlaspost\\.com$\n(?:^|\\.)atnext\\.com$\n(?:^|\\.)authorizeddns\\.net$\n(?:^|\\.)authorizeddns\\.org$\n(?:^|\\.)authorizeddns\\.us$\n(?:^|\\.)autodraw\\.com$\n(?:^|\\.)av-e-body\\.com$\n(?:^|\\.)av\\.com$\n(?:^|\\.)av\\.movie$\n(?:^|\\.)av\\.nightlife141\\.com$\n(?:^|\\.)avaaz\\.org$\n(?:^|\\.)avbody\\.tv$\n(?:^|\\.)avcity\\.tv$\n(?:^|\\.)avcool\\.com$\n(?:^|\\.)avdb\\.in$\n(?:^|\\.)avdb\\.tv$\n(?:^|\\.)avfantasy\\.com$\n(?:^|\\.)avgle\\.com$\n(?:^|\\.)avidemux\\.org$\n(?:^|\\.)avmo\\.pw$\n(?:^|\\.)avmoo\\.com$\n(?:^|\\.)avmoo\\.net$\n(?:^|\\.)avmoo\\.pw$\n(?:^|\\.)avoision\\.com$\n(?:^|\\.)avyahoo\\.com$\n(?:^|\\.)axureformac\\.com$\n(?:^|\\.)azerbaycan\\.tv$\n(?:^|\\.)azerimix\\.com$\n(?:^|\\.)azubu\\.tv$\n(?:^|\\.)b0ne\\.com$\n(?:^|\\.)babynet\\.com\\.hk$\n(?:^|\\.)backchina\\.com$\n(?:^|\\.)backpackers\\.com\\.tw$\n(?:^|\\.)backtotiananmen\\.com$\n(?:^|\\.)badiucao\\.com$\n(?:^|\\.)badjojo\\.com$\n(?:^|\\.)badoo\\.com$\n(?:^|\\.)baidu\\.jp$\n(?:^|\\.)baijie\\.org$\n(?:^|\\.)bailandaily\\.com$\n(?:^|\\.)baixing\\.me$\n(?:^|\\.)bakgeekhome\\.tk$\n(?:^|\\.)banana-vpn\\.com$\n(?:^|\\.)band\\.us$\n(?:^|\\.)bandwagonhost\\.com$\n(?:^|\\.)bangbrosnetwork\\.com$\n(?:^|\\.)bangchen\\.net$\n(?:^|\\.)bangdream\\.space$\n(?:^|\\.)bangyoulater\\.com$\n(?:^|\\.)bankmobilevibe\\.com$\n(?:^|\\.)bannedbook\\.org$\n(?:^|\\.)bannednews\\.org$\n(?:^|\\.)banorte\\.com$\n(?:^|\\.)baramangaonline\\.com$\n(?:^|\\.)barenakedislam\\.com$\n(?:^|\\.)barnabu\\.co\\.uk$\n(?:^|\\.)barton\\.de$\n(?:^|\\.)bartvpn\\.com$\n(?:^|\\.)bash-hackers\\.org$\n(?:^|\\.)bastillepost\\.com$\n(?:^|\\.)bayvoice\\.net$\n(?:^|\\.)bb-chat\\.tv$\n(?:^|\\.)bb\\.ttv\\.com\\.tw$\n(?:^|\\.)bbc\\.co\\.uk$\n(?:^|\\.)bbc\\.com$\n(?:^|\\.)bbc\\.in$\n(?:^|\\.)bbcchinese\\.com$\n(?:^|\\.)bbchat\\.tv$\n(?:^|\\.)bbci\\.co\\.uk$\n(?:^|\\.)bbg\\.gov$\n(?:^|\\.)bbkz\\.com$\n(?:^|\\.)bbnradio\\.org$\n(?:^|\\.)bbs-tw\\.com$\n(?:^|\\.)bbs\\.brockbbs\\.com$\n(?:^|\\.)bbs\\.cantonese\\.asia$\n(?:^|\\.)bbs\\.ecstart\\.com$\n(?:^|\\.)bbs\\.hanminzu\\.org$\n(?:^|\\.)bbs\\.hasi\\.wang$\n(?:^|\\.)bbs\\.huasing\\.org$\n(?:^|\\.)bbs\\.junglobal\\.net$\n(?:^|\\.)bbs\\.kimy\\.com\\.tw$\n(?:^|\\.)bbs\\.mikocon\\.com$\n(?:^|\\.)bbs\\.morbell\\.com$\n(?:^|\\.)bbs\\.mychat\\.to$\n(?:^|\\.)bbs\\.netbig\\.com$\n(?:^|\\.)bbs\\.ozchinese\\.com$\n(?:^|\\.)bbs\\.qmzdd\\.com$\n(?:^|\\.)bbs\\.sina\\.com$\n(?:^|\\.)bbs\\.sina\\.com%2f$\n(?:^|\\.)bbs\\.skykiwi\\.com$\n(?:^|\\.)bbs\\.sou-tong\\.org$\n(?:^|\\.)bbs\\.tuitui\\.info$\n(?:^|\\.)bbsdigest\\.com$\n(?:^|\\.)bbsfeed\\.com$\n(?:^|\\.)bbsland\\.com$\n(?:^|\\.)bbsmo\\.com$\n(?:^|\\.)bbsone\\.com$\n(?:^|\\.)bbtoystore\\.com$\n(?:^|\\.)bcast\\.co\\.nz$\n(?:^|\\.)bcc\\.com\\.tw$\n(?:^|\\.)bcchinese\\.net$\n(?:^|\\.)bcex\\.ca$\n(?:^|\\.)bcmorning\\.com$\n(?:^|\\.)bdsmvideos\\.net$\n(?:^|\\.)beaconevents\\.com$\n(?:^|\\.)bebo\\.com$\n(?:^|\\.)beeg\\.com$\n(?:^|\\.)beevpn\\.com$\n(?:^|\\.)behance\\.net$\n(?:^|\\.)behindkink\\.com$\n(?:^|\\.)beijing1989\\.com$\n(?:^|\\.)beijingspring\\.com$\n(?:^|\\.)beijingzx\\.org$\n(?:^|\\.)belamionline\\.com$\n(?:^|\\.)bell\\.wiki$\n(?:^|\\.)bemywife\\.cc$\n(?:^|\\.)beric\\.me$\n(?:^|\\.)berlintwitterwall\\.com$\n(?:^|\\.)berm\\.co\\.nz$\n(?:^|\\.)bestforchina\\.org$\n(?:^|\\.)bestgore\\.com$\n(?:^|\\.)bestpornstardb\\.com$\n(?:^|\\.)bestvpn\\.com$\n(?:^|\\.)bestvpnanalysis\\.com$\n(?:^|\\.)bestvpnserver\\.com$\n(?:^|\\.)bestvpnservice\\.com$\n(?:^|\\.)bestvpnusa\\.com$\n(?:^|\\.)bet365\\.com$\n(?:^|\\.)betfair\\.com$\n(?:^|\\.)betternet\\.co$\n(?:^|\\.)bettervpn\\.com$\n(?:^|\\.)bettween\\.com$\n(?:^|\\.)betvictor\\.com$\n(?:^|\\.)bewww\\.net$\n(?:^|\\.)beyondfirewall\\.com$\n(?:^|\\.)bfnn\\.org$\n(?:^|\\.)bfsh\\.hk$\n(?:^|\\.)bgvpn\\.com$\n(?:^|\\.)bianlei\\.com$\n(?:^|\\.)biantailajiao\\.com$\n(?:^|\\.)biantailajiao\\.in$\n(?:^|\\.)biblesforamerica\\.org$\n(?:^|\\.)bibox\\.com$\n(?:^|\\.)bic2011\\.org$\n(?:^|\\.)big\\.one$\n(?:^|\\.)bigfools\\.com$\n(?:^|\\.)bigjapanesesex\\.com$\n(?:^|\\.)bigmoney\\.biz$\n(?:^|\\.)bignews\\.org$\n(?:^|\\.)bigsound\\.org$\n(?:^|\\.)biliworld\\.com$\n(?:^|\\.)billypan\\.com$\n(?:^|\\.)binance\\.com$\n(?:^|\\.)binux\\.me$\n(?:^|\\.)bipic\\.net$\n(?:^|\\.)bird\\.so$\n(?:^|\\.)bit-z\\.com$\n(?:^|\\.)bit\\.do$\n(?:^|\\.)bit\\.ly$\n(?:^|\\.)bitc\\.bme\\.emory\\.edu$\n(?:^|\\.)bitcointalk\\.org$\n(?:^|\\.)bitcoinworld\\.com$\n(?:^|\\.)bitfinex\\.com$\n(?:^|\\.)bithumb\\.com$\n(?:^|\\.)bitinka\\.com\\.ar$\n(?:^|\\.)bitmex\\.com$\n(?:^|\\.)bitshare\\.com$\n(?:^|\\.)bitsnoop\\.com$\n(?:^|\\.)bitvise\\.com$\n(?:^|\\.)bizhat\\.com$\n(?:^|\\.)bjnewlife\\.org$\n(?:^|\\.)bjs\\.org$\n(?:^|\\.)bjzc\\.org$\n(?:^|\\.)bl-doujinsouko\\.com$\n(?:^|\\.)blacklogic\\.com$\n(?:^|\\.)blackvpn\\.com$\n(?:^|\\.)blewpass\\.com$\n(?:^|\\.)blinkx\\.com$\n(?:^|\\.)blinw\\.com$\n(?:^|\\.)blip\\.tv$\n(?:^|\\.)blockcn\\.com$\n(?:^|\\.)blockless\\.com$\n(?:^|\\.)blog\\.calibre-ebook\\.com$\n(?:^|\\.)blog\\.cnyes\\.com$\n(?:^|\\.)blog\\.daum\\.net$\n(?:^|\\.)blog\\.de$\n(?:^|\\.)blog\\.exblog\\.co\\.jp$\n(?:^|\\.)blog\\.excite\\.co\\.jp$\n(?:^|\\.)blog\\.expofutures\\.com$\n(?:^|\\.)blog\\.fizzik\\.com$\n(?:^|\\.)blog\\.foolsmountain\\.com$\n(?:^|\\.)blog\\.fuckgfw233\\.org$\n(?:^|\\.)blog\\.goo\\.ne\\.jp$\n(?:^|\\.)blog\\.google$\n(?:^|\\.)blog\\.inoreader\\.com$\n(?:^|\\.)blog\\.istef\\.info$\n(?:^|\\.)blog\\.jackjia\\.com$\n(?:^|\\.)blog\\.jp$\n(?:^|\\.)blog\\.kangye\\.org$\n(?:^|\\.)blog\\.lester850\\.info$\n(?:^|\\.)blog\\.martinoei\\.com$\n(?:^|\\.)blog\\.pathtosharepoint\\.com$\n(?:^|\\.)blog\\.pentalogic\\.net$\n(?:^|\\.)blog\\.qooza\\.hk$\n(?:^|\\.)blog\\.ranxiang\\.com$\n(?:^|\\.)blog\\.sina\\.com\\.tw$\n(?:^|\\.)blog\\.sogoo\\.org$\n(?:^|\\.)blog\\.soylent\\.com$\n(?:^|\\.)blog\\.syx86\\.cn$\n(?:^|\\.)blog\\.syx86\\.com$\n(?:^|\\.)blog\\.taragana\\.com$\n(?:^|\\.)blog\\.tiney\\.com$\n(?:^|\\.)blog\\.workflow\\.is$\n(?:^|\\.)blog\\.xuite\\.net$\n(?:^|\\.)blog\\.youthwant\\.com\\.tw$\n(?:^|\\.)blog\\.youxu\\.info$\n(?:^|\\.)blogblog\\.com$\n(?:^|\\.)blogcatalog\\.com$\n(?:^|\\.)blogcity\\.me$\n(?:^|\\.)blogdns\\.org$\n(?:^|\\.)blogger\\.com$\n(?:^|\\.)blogimg\\.jp$\n(?:^|\\.)bloglines\\.com$\n(?:^|\\.)bloglovin\\.com$\n(?:^|\\.)blogs\\.icerocket\\.com$\n(?:^|\\.)blogs\\.libraryinformationtechnology\\.com$\n(?:^|\\.)blogs\\.tampabay\\.com$\n(?:^|\\.)blogs\\.yahoo\\.co\\.jp$\n(?:^|\\.)blogspot(\\.[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?){1,2}$\n(?:^|\\.)blogtd\\.net$\n(?:^|\\.)blogtd\\.org$\n(?:^|\\.)bloodshed\\.net$\n(?:^|\\.)bloomberg\\.cn$\n(?:^|\\.)bloomberg\\.com$\n(?:^|\\.)bloomberg\\.de$\n(?:^|\\.)bloombergview\\.com$\n(?:^|\\.)bloomfortune\\.com$\n(?:^|\\.)blueangellive\\.com$\n(?:^|\\.)bmfinn\\.com$\n(?:^|\\.)bnews\\.co$\n(?:^|\\.)bnn\\.co$\n(?:^|\\.)bnrmetal\\.com$\n(?:^|\\.)boardreader\\.com$\n(?:^|\\.)bod\\.asia$\n(?:^|\\.)bodog88\\.com$\n(?:^|\\.)bolehvpn\\.net$\n(?:^|\\.)bolin\\.netfirms\\.com$\n(?:^|\\.)bonbonme\\.com$\n(?:^|\\.)bonbonsex\\.com$\n(?:^|\\.)bonfoundation\\.org$\n(?:^|\\.)bongacams\\.com$\n(?:^|\\.)boobstagram\\.com$\n(?:^|\\.)book\\.com\\.tw$\n(?:^|\\.)book\\.zi5\\.me$\n(?:^|\\.)bookepub\\.com$\n(?:^|\\.)books\\.com\\.tw$\n(?:^|\\.)booktopia\\.com\\.au$\n(?:^|\\.)boomssr\\.com$\n(?:^|\\.)bot\\.nu$\n(?:^|\\.)botanwang\\.com$\n(?:^|\\.)bowenpress\\.com$\n(?:^|\\.)boxpn\\.com$\n(?:^|\\.)boxun$\n(?:^|\\.)boxun\\.com$\n(?:^|\\.)boxun\\.tv$\n(?:^|\\.)boxunblog\\.com$\n(?:^|\\.)boxunclub\\.com$\n(?:^|\\.)boyangu\\.com$\n(?:^|\\.)boyfriendtv\\.com$\n(?:^|\\.)boysfood\\.com$\n(?:^|\\.)boysmaster\\.com$\n(?:^|\\.)br\\.hao123\\.com$\n(?:^|\\.)br\\.st$\n(?:^|\\.)brainyquote\\.com$\n(?:^|\\.)brandonhutchinson\\.com$\n(?:^|\\.)braumeister\\.org$\n(?:^|\\.)bravotube\\.net$\n(?:^|\\.)brazzers\\.com$\n(?:^|\\.)break\\.com$\n(?:^|\\.)breakgfw\\.com$\n(?:^|\\.)breaking911\\.com$\n(?:^|\\.)breakingtweets\\.com$\n(?:^|\\.)breakwall\\.net$\n(?:^|\\.)briefdream\\.com$\n(?:^|\\.)briian\\.com$\n(?:^|\\.)brizzly\\.com$\n(?:^|\\.)brkmd\\.com$\n(?:^|\\.)broadbook\\.com$\n(?:^|\\.)broadpressinc\\.com$\n(?:^|\\.)brucewang\\.net$\n(?:^|\\.)brutaltgp\\.com$\n(?:^|\\.)bt2mag\\.com$\n(?:^|\\.)bt95\\.com$\n(?:^|\\.)btaia\\.com$\n(?:^|\\.)btbtav\\.com$\n(?:^|\\.)btc98\\.com$\n(?:^|\\.)btcbank\\.bank$\n(?:^|\\.)btctrade\\.im$\n(?:^|\\.)btdigg\\.org$\n(?:^|\\.)btku\\.me$\n(?:^|\\.)btku\\.org$\n(?:^|\\.)btspread\\.com$\n(?:^|\\.)btsynckeys\\.com$\n(?:^|\\.)budaedu\\.org$\n(?:^|\\.)buddhanet\\.com\\.tw$\n(?:^|\\.)buddhistchannel\\.tv$\n(?:^|\\.)buffered\\.com$\n(?:^|\\.)bullog\\.org$\n(?:^|\\.)bullogger\\.com$\n(?:^|\\.)bunbunhk\\.com$\n(?:^|\\.)busayari\\.com$\n(?:^|\\.)businessinsider\\.com$\n(?:^|\\.)businesstoday\\.com\\.tw$\n(?:^|\\.)businessweek\\.com$\n(?:^|\\.)busu\\.org$\n(?:^|\\.)busytrade\\.com$\n(?:^|\\.)buugaa\\.com$\n(?:^|\\.)buy\\.yahoo\\.com\\.tw$\n(?:^|\\.)buzzhand\\.com$\n(?:^|\\.)buzzhand\\.net$\n(?:^|\\.)buzzorange\\.com$\n(?:^|\\.)bvpn\\.com$\n(?:^|\\.)bwgyhw\\.com$\n(?:^|\\.)bwh1\\.net$\n(?:^|\\.)bwsj\\.hk$\n(?:^|\\.)bx\\.in\\.th$\n(?:^|\\.)bx\\.tl$\n(?:^|\\.)bynet\\.co\\.il$\n(?:^|\\.)c-est-simple\\.com$\n(?:^|\\.)c-spanvideo\\.org$\n(?:^|\\.)c100tibet\\.org$\n(?:^|\\.)c1522\\.mooo\\.com$\n(?:^|\\.)c2cx\\.com$\n(?:^|\\.)cablegatesearch\\.net$\n(?:^|\\.)cachinese\\.com$\n(?:^|\\.)cacnw\\.com$\n(?:^|\\.)cactusvpn\\.com$\n(?:^|\\.)cafepress\\.com$\n(?:^|\\.)cahr\\.org\\.tw$\n(?:^|\\.)calameo\\.com$\n(?:^|\\.)calebelston\\.com$\n(?:^|\\.)calgarychinese\\.ca$\n(?:^|\\.)calgarychinese\\.com$\n(?:^|\\.)calgarychinese\\.net$\n(?:^|\\.)cam4\\.com$\n(?:^|\\.)cam4\\.jp$\n(?:^|\\.)cam4\\.sg$\n(?:^|\\.)camfrog\\.com$\n(?:^|\\.)cams\\.com$\n(?:^|\\.)cams\\.org\\.sg$\n(?:^|\\.)canadameet\\.com$\n(?:^|\\.)canalporno\\.com$\n(?:^|\\.)canyu\\.org$\n(?:^|\\.)cao\\.im$\n(?:^|\\.)caobian\\.info$\n(?:^|\\.)caochangqing\\.com$\n(?:^|\\.)cap\\.org\\.hk$\n(?:^|\\.)carabinasypistolas\\.com$\n(?:^|\\.)cardinalkungfoundation\\.org$\n(?:^|\\.)carfax\\.com$\n(?:^|\\.)cari\\.com\\.my$\n(?:^|\\.)caribbeancom\\.com$\n(?:^|\\.)carmotorshow\\.com$\n(?:^|\\.)cartoonmovement\\.com$\n(?:^|\\.)casadeltibetbcn\\.org$\n(?:^|\\.)casatibet\\.org\\.mx$\n(?:^|\\.)casino\\.williamhill\\.com$\n(?:^|\\.)casinobellini\\.com$\n(?:^|\\.)casinoking\\.com$\n(?:^|\\.)casinoriva\\.com$\n(?:^|\\.)castbox\\.fm$\n(?:^|\\.)catch22\\.net$\n(?:^|\\.)catchgod\\.com$\n(?:^|\\.)catfightpayperview\\.xxx$\n(?:^|\\.)catholic\\.org\\.hk$\n(?:^|\\.)catholic\\.org\\.tw$\n(?:^|\\.)cathvoice\\.org\\.tw$\n(?:^|\\.)cattt\\.com$\n(?:^|\\.)cbc\\.ca$\n(?:^|\\.)cbs\\.ntu\\.edu\\.tw$\n(?:^|\\.)cbsnews\\.com$\n(?:^|\\.)cbtc\\.org\\.hk$\n(?:^|\\.)cccat\\.cc$\n(?:^|\\.)cccat\\.co$\n(?:^|\\.)ccdtr\\.org$\n(?:^|\\.)cchere\\.com$\n(?:^|\\.)ccim\\.org$\n(?:^|\\.)cclife\\.ca$\n(?:^|\\.)cclife\\.org$\n(?:^|\\.)cclifefl\\.org$\n(?:^|\\.)ccthere\\.com$\n(?:^|\\.)ccthere\\.net$\n(?:^|\\.)cctmweb\\.net$\n(?:^|\\.)cctongbao\\.com$\n(?:^|\\.)ccue\\.ca$\n(?:^|\\.)ccue\\.com$\n(?:^|\\.)ccvoice\\.ca$\n(?:^|\\.)ccw\\.org\\.tw$\n(?:^|\\.)cdbook\\.org$\n(?:^|\\.)cdcparty\\.com$\n(?:^|\\.)cdef\\.org$\n(?:^|\\.)cdig\\.info$\n(?:^|\\.)cdjp\\.org$\n(?:^|\\.)cdn$\n(?:^|\\.)cdn-apple\\.com$\n(?:^|\\.)cdn-images\\.mailchimp\\.com$\n(?:^|\\.)cdn\\.assets\\.lfpcontent\\.com$\n(?:^|\\.)cdn\\.helixstudios\\.net$\n(?:^|\\.)cdn\\.printfriendly\\.com$\n(?:^|\\.)cdn\\.seatguru\\.com$\n(?:^|\\.)cdn\\.softlayer\\.net$\n(?:^|\\.)cdn1\\.lp\\.saboom\\.com$\n(?:^|\\.)cdnews\\.com\\.tw$\n(?:^|\\.)cdninstagram\\.com$\n(?:^|\\.)cdp1989\\.org$\n(?:^|\\.)cdp1998\\.org$\n(?:^|\\.)cdp2006\\.org$\n(?:^|\\.)cdpa\\.url\\.tw$\n(?:^|\\.)cdpeu\\.org$\n(?:^|\\.)cdpusa\\.org$\n(?:^|\\.)cdpweb\\.org$\n(?:^|\\.)cdpwu\\.org$\n(?:^|\\.)cdw\\.com$\n(?:^|\\.)cecc\\.gov$\n(?:^|\\.)cellulo\\.info$\n(?:^|\\.)cenews\\.eu$\n(?:^|\\.)centauro\\.com\\.br$\n(?:^|\\.)centerforhumanreprod\\.com$\n(?:^|\\.)centralnation\\.com$\n(?:^|\\.)centurys\\.net$\n(?:^|\\.)certificate-transparency\\.org$\n(?:^|\\.)certificate\\.revocationcheck\\.com$\n(?:^|\\.)cfhks\\.org\\.hk$\n(?:^|\\.)cfos\\.de$\n(?:^|\\.)cftfc\\.com$\n(?:^|\\.)cgdepot\\.org$\n(?:^|\\.)cgst\\.edu$\n(?:^|\\.)ch\\.shvoong\\.com$\n(?:^|\\.)change\\.org$\n(?:^|\\.)changeip\\.name$\n(?:^|\\.)changeip\\.net$\n(?:^|\\.)changeip\\.org$\n(?:^|\\.)changp\\.com$\n(?:^|\\.)changsa\\.net$\n(?:^|\\.)channel8news\\.sg$\n(?:^|\\.)chaoex\\.com$\n(?:^|\\.)chapm25\\.com$\n(?:^|\\.)chatnook\\.com$\n(?:^|\\.)chaturbate\\.com$\n(?:^|\\.)chengmingmag\\.com$\n(?:^|\\.)chenguangcheng\\.com$\n(?:^|\\.)chenpokong\\.com$\n(?:^|\\.)chenpokong\\.net$\n(?:^|\\.)chenshan20042005\\.wordpress\\.com$\n(?:^|\\.)cherrysave\\.com$\n(?:^|\\.)chhongbi\\.org$\n(?:^|\\.)chicagoncmtv\\.com$\n(?:^|\\.)china-mmm\\.jp\\.net$\n(?:^|\\.)china-mmm\\.net$\n(?:^|\\.)china-mmm\\.sa\\.com$\n(?:^|\\.)china-review\\.com\\.ua$\n(?:^|\\.)china-week\\.com$\n(?:^|\\.)china\\.hket\\.com$\n(?:^|\\.)china\\.ucanews\\.com$\n(?:^|\\.)china101\\.com$\n(?:^|\\.)china18\\.org$\n(?:^|\\.)china21\\.com$\n(?:^|\\.)china21\\.org$\n(?:^|\\.)china5000\\.us$\n(?:^|\\.)chinaaffairs\\.org$\n(?:^|\\.)chinaaid\\.me$\n(?:^|\\.)chinaaid\\.net$\n(?:^|\\.)chinaaid\\.org$\n(?:^|\\.)chinaaid\\.us$\n(?:^|\\.)chinachange\\.org$\n(?:^|\\.)chinachannel\\.hk$\n(?:^|\\.)chinacitynews\\.be$\n(?:^|\\.)chinacomments\\.org$\n(?:^|\\.)chinadialogue\\.net$\n(?:^|\\.)chinadigitaltimes\\.net$\n(?:^|\\.)chinaelections\\.org$\n(?:^|\\.)chinaeweekly\\.com$\n(?:^|\\.)chinafreepress\\.org$\n(?:^|\\.)chinagate\\.com$\n(?:^|\\.)chinageeks\\.org$\n(?:^|\\.)chinagfw\\.org$\n(?:^|\\.)chinagonet\\.com$\n(?:^|\\.)chinagreenparty\\.org$\n(?:^|\\.)chinahorizon\\.org$\n(?:^|\\.)chinahush\\.com$\n(?:^|\\.)chinainperspective\\.com$\n(?:^|\\.)chinainterimgov\\.org$\n(?:^|\\.)chinalaborwatch\\.org$\n(?:^|\\.)chinalawandpolicy\\.com$\n(?:^|\\.)chinalawtranslate\\.com$\n(?:^|\\.)chinamule\\.com$\n(?:^|\\.)chinamz\\.org$\n(?:^|\\.)chinanewscenter\\.com$\n(?:^|\\.)chinapost\\.com\\.tw$\n(?:^|\\.)chinapress\\.com\\.my$\n(?:^|\\.)chinarightsia\\.org$\n(?:^|\\.)chinasmile\\.net$\n(?:^|\\.)chinasocialdemocraticparty\\.com$\n(?:^|\\.)chinasoul\\.org$\n(?:^|\\.)chinasucks\\.net$\n(?:^|\\.)chinatimes\\.com$\n(?:^|\\.)chinatopsex\\.com$\n(?:^|\\.)chinatown\\.com\\.au$\n(?:^|\\.)chinatweeps\\.com$\n(?:^|\\.)chinaview\\.wordpress\\.com$\n(?:^|\\.)chinaway\\.org$\n(?:^|\\.)chinaworker\\.info$\n(?:^|\\.)chinaxchina\\.com$\n(?:^|\\.)chinayouth\\.org\\.hk$\n(?:^|\\.)chinayuanmin\\.org$\n(?:^|\\.)chinese-hermit\\.net$\n(?:^|\\.)chinese-leaders\\.org$\n(?:^|\\.)chinese-memorial\\.org$\n(?:^|\\.)chinese\\.donga\\.com$\n(?:^|\\.)chinese\\.engadget\\.com$\n(?:^|\\.)chinese\\.irib\\.ir$\n(?:^|\\.)chinese\\.soifind\\.com$\n(?:^|\\.)chinesedaily\\.com$\n(?:^|\\.)chinesedailynews\\.com$\n(?:^|\\.)chinesedemocracy\\.com$\n(?:^|\\.)chinesegay\\.org$\n(?:^|\\.)chinesen\\.de$\n(?:^|\\.)chinesenews\\.net\\.au$\n(?:^|\\.)chinesepen\\.org$\n(?:^|\\.)chinesetalks\\.net$\n(?:^|\\.)chineseupress\\.com$\n(?:^|\\.)chingcheong\\.com$\n(?:^|\\.)chinman\\.net$\n(?:^|\\.)chithu\\.org$\n(?:^|\\.)chn\\.chosun\\.com$\n(?:^|\\.)chobit\\.cc$\n(?:^|\\.)chrdnet\\.com$\n(?:^|\\.)christianfreedom\\.org$\n(?:^|\\.)christianstudy\\.com$\n(?:^|\\.)christiantimes\\.org\\.hk$\n(?:^|\\.)christusrex\\.org$\n(?:^|\\.)chrlawyers\\.hk$\n(?:^|\\.)chrome\\.com$\n(?:^|\\.)chromecast\\.com$\n(?:^|\\.)chromeexperiments\\.com$\n(?:^|\\.)chromercise\\.com$\n(?:^|\\.)chromestatus\\.com$\n(?:^|\\.)chromium\\.org$\n(?:^|\\.)chuang-yen\\.org$\n(?:^|\\.)chubold\\.com$\n(?:^|\\.)chubun\\.com$\n(?:^|\\.)chuizi\\.net$\n(?:^|\\.)churchinhongkong\\.org$\n(?:^|\\.)chushigangdrug\\.ch$\n(?:^|\\.)cienen\\.com$\n(?:^|\\.)cineastentreff\\.de$\n(?:^|\\.)cipfg\\.org$\n(?:^|\\.)circlethebayfortibet\\.org$\n(?:^|\\.)cirosantilli\\.com$\n(?:^|\\.)citizencn\\.com$\n(?:^|\\.)citizenlab\\.org$\n(?:^|\\.)citizenscommission\\.hk$\n(?:^|\\.)citizensradio\\.org$\n(?:^|\\.)city365\\.ca$\n(?:^|\\.)city9x\\.com$\n(?:^|\\.)citypopulation\\.de$\n(?:^|\\.)citytalk\\.tw$\n(?:^|\\.)civicparty\\.hk$\n(?:^|\\.)civildisobediencemovement\\.org$\n(?:^|\\.)civilhrfront\\.org$\n(?:^|\\.)civiliangunner\\.com$\n(?:^|\\.)civilmedia\\.tw$\n(?:^|\\.)ck101\\.com$\n(?:^|\\.)cl\\.d0z\\.net$\n(?:^|\\.)clarionproject\\.org$\n(?:^|\\.)classicalguitarblog\\.net$\n(?:^|\\.)clb\\.org\\.hk$\n(?:^|\\.)cldr\\.unicode\\.org$\n(?:^|\\.)cleansite\\.biz$\n(?:^|\\.)cleansite\\.info$\n(?:^|\\.)cleansite\\.us$\n(?:^|\\.)clearharmony\\.net$\n(?:^|\\.)clearsurance\\.com$\n(?:^|\\.)clearwisdom\\.net$\n(?:^|\\.)clementine-player\\.org$\n(?:^|\\.)cling\\.omy\\.sg$\n(?:^|\\.)clinica-tibet\\.ru$\n(?:^|\\.)clipfish\\.de$\n(?:^|\\.)cloakpoint\\.com$\n(?:^|\\.)cloud\\.feedly\\.com$\n(?:^|\\.)cloud\\.mail\\.ru$\n(?:^|\\.)club1069\\.com$\n(?:^|\\.)clyp\\.it$\n(?:^|\\.)cmcn\\.org$\n(?:^|\\.)cmi\\.org\\.tw$\n(?:^|\\.)cmp\\.hku\\.hk$\n(?:^|\\.)cms\\.gov$\n(?:^|\\.)cmule\\.com$\n(?:^|\\.)cmule\\.org$\n(?:^|\\.)cmx\\.im$\n(?:^|\\.)cn-proxy\\.com$\n(?:^|\\.)cn\\.calameo\\.com$\n(?:^|\\.)cn\\.dayabook\\.com$\n(?:^|\\.)cn\\.fmnnow\\.com$\n(?:^|\\.)cn\\.freeones\\.com$\n(?:^|\\.)cn\\.giganews\\.com$\n(?:^|\\.)cn\\.ibtimes\\.com$\n(?:^|\\.)cn\\.nytstyle\\.com$\n(?:^|\\.)cn\\.sandscotaicentral\\.com$\n(?:^|\\.)cn\\.shafaqna\\.com$\n(?:^|\\.)cn\\.streetvoice\\.com$\n(?:^|\\.)cn\\.thegay\\.com$\n(?:^|\\.)cn\\.uncyclopedia\\.wikia\\.com$\n(?:^|\\.)cn\\.uptodown\\.com$\n(?:^|\\.)cn\\.voa\\.mobi$\n(?:^|\\.)cn2\\.streetvoice\\.com$\n(?:^|\\.)cn6\\.eu$\n(?:^|\\.)cna\\.com\\.tw$\n(?:^|\\.)cnabc\\.com$\n(?:^|\\.)cnbbnews\\.wordpress\\.com$\n(?:^|\\.)cnd\\.org$\n(?:^|\\.)cnex\\.org\\.cn$\n(?:^|\\.)cnineu\\.com$\n(?:^|\\.)cnn\\.com$\n(?:^|\\.)cnnews\\.chosun\\.com$\n(?:^|\\.)cnpolitics\\.org$\n(?:^|\\.)cnproxy\\.com$\n(?:^|\\.)co\\.ng\\.mil$\n(?:^|\\.)coat\\.co\\.jp$\n(?:^|\\.)cobinhood\\.com$\n(?:^|\\.)cochina\\.co$\n(?:^|\\.)cochina\\.org$\n(?:^|\\.)code1984\\.com$\n(?:^|\\.)codeshare\\.io$\n(?:^|\\.)codeskulptor\\.org$\n(?:^|\\.)coin2co\\.in$\n(?:^|\\.)coinbene\\.com$\n(?:^|\\.)coinegg\\.com$\n(?:^|\\.)coinex\\.com$\n(?:^|\\.)coingi\\.com$\n(?:^|\\.)coinrail\\.co\\.kr$\n(?:^|\\.)cointiger\\.com$\n(?:^|\\.)cointobe\\.com$\n(?:^|\\.)coinut\\.com$\n(?:^|\\.)collateralmurder\\.com$\n(?:^|\\.)collateralmurder\\.org$\n(?:^|\\.)com\\.google$\n(?:^|\\.)comefromchina\\.com$\n(?:^|\\.)comic-mega\\.me$\n(?:^|\\.)commandarms\\.com$\n(?:^|\\.)commentshk\\.com$\n(?:^|\\.)communistcrimes\\.org$\n(?:^|\\.)community\\.windy\\.com$\n(?:^|\\.)communitychoicecu\\.com$\n(?:^|\\.)compileheart\\.com$\n(?:^|\\.)compress\\.to$\n(?:^|\\.)connect\\.facebook\\.net$\n(?:^|\\.)conoha\\.jp$\n(?:^|\\.)contactmagazine\\.net$\n(?:^|\\.)contests\\.twilio\\.com$\n(?:^|\\.)convio\\.net$\n(?:^|\\.)coobay\\.com$\n(?:^|\\.)coolaler\\.com$\n(?:^|\\.)coolder\\.com$\n(?:^|\\.)coolloud\\.org\\.tw$\n(?:^|\\.)coolncute\\.com$\n(?:^|\\.)coolstuffinc\\.com$\n(?:^|\\.)corumcollege\\.com$\n(?:^|\\.)cos-moe\\.com$\n(?:^|\\.)cosmic\\.monar\\.ch$\n(?:^|\\.)cosplayjav\\.pl$\n(?:^|\\.)costco\\.com$\n(?:^|\\.)cotweet\\.com$\n(?:^|\\.)counter\\.social$\n(?:^|\\.)coursehero\\.com$\n(?:^|\\.)cpj\\.org$\n(?:^|\\.)cq99\\.us$\n(?:^|\\.)crackle\\.com$\n(?:^|\\.)crazys\\.cc$\n(?:^|\\.)crazyshit\\.com$\n(?:^|\\.)crbug\\.com$\n(?:^|\\.)crchina\\.org$\n(?:^|\\.)crd-net\\.org$\n(?:^|\\.)creaders\\.net$\n(?:^|\\.)creadersnet\\.com$\n(?:^|\\.)creativelab5\\.com$\n(?:^|\\.)crisisresponse\\.google$\n(?:^|\\.)cristyli\\.com$\n(?:^|\\.)crocotube\\.com$\n(?:^|\\.)crossfire\\.co\\.kr$\n(?:^|\\.)crossthewall\\.net$\n(?:^|\\.)crossvpn\\.net$\n(?:^|\\.)crrev\\.com$\n(?:^|\\.)crucial\\.com$\n(?:^|\\.)csdparty\\.com$\n(?:^|\\.)css\\.pixnet\\.in$\n(?:^|\\.)csuchen\\.de$\n(?:^|\\.)csw\\.org\\.uk$\n(?:^|\\.)ct\\.org\\.tw$\n(?:^|\\.)ctao\\.org$\n(?:^|\\.)ctfriend\\.net$\n(?:^|\\.)cthlo\\.github\\.io$\n(?:^|\\.)ctitv\\.com\\.tw$\n(?:^|\\.)cts\\.com\\.tw$\n(?:^|\\.)cuhkacs\\.org$\n(?:^|\\.)cuihua\\.org$\n(?:^|\\.)cuiweiping\\.net$\n(?:^|\\.)culture\\.tw$\n(?:^|\\.)cumlouder\\.com$\n(?:^|\\.)curvefish\\.com$\n(?:^|\\.)cusu\\.hk$\n(?:^|\\.)cutscenes\\.net$\n(?:^|\\.)cw\\.com\\.tw$\n(?:^|\\.)cyberghost\\.natado\\.com$\n(?:^|\\.)cyberghostvpn\\.com$\n(?:^|\\.)cynscribe\\.com$\n(?:^|\\.)cytode\\.us$\n(?:^|\\.)d-fukyu\\.com$\n(?:^|\\.)d100\\.net$\n(?:^|\\.)d1b183sg0nvnuh\\.cloudfront\\.net$\n(?:^|\\.)d1c37gjwa26taa\\.cloudfront\\.net$\n(?:^|\\.)d2bay\\.com$\n(?:^|\\.)d2pass\\.com$\n(?:^|\\.)d3c33hcgiwev3\\.cloudfront\\.net$\n(?:^|\\.)d3rhr7kgmtrq1v\\.cloudfront\\.net$\n(?:^|\\.)dabr\\.co\\.uk$\n(?:^|\\.)dabr\\.eu$\n(?:^|\\.)dabr\\.me$\n(?:^|\\.)dabr\\.mobi$\n(?:^|\\.)dadazim\\.com$\n(?:^|\\.)dadi360\\.com$\n(?:^|\\.)dafabet\\.com$\n(?:^|\\.)dafagood\\.com$\n(?:^|\\.)dafahao\\.com$\n(?:^|\\.)dafoh\\.org$\n(?:^|\\.)daftporn\\.com$\n(?:^|\\.)dagelijksestandaard\\.nl$\n(?:^|\\.)daidostup\\.ru$\n(?:^|\\.)dailidaili\\.com$\n(?:^|\\.)dailymotion\\.com$\n(?:^|\\.)dailynews\\.sina\\.com$\n(?:^|\\.)dailynews\\.sina\\.com%2f$\n(?:^|\\.)dailyview\\.tw$\n(?:^|\\.)daiphapinfo\\.net$\n(?:^|\\.)dajiyuan\\.com$\n(?:^|\\.)dajiyuan\\.de$\n(?:^|\\.)dajiyuan\\.eu$\n(?:^|\\.)dajusha\\.baywords\\.com$\n(?:^|\\.)dalailama-archives\\.org$\n(?:^|\\.)dalailama\\.com$\n(?:^|\\.)dalailama\\.mn$\n(?:^|\\.)dalailama\\.ru$\n(?:^|\\.)dalailama\\.usc\\.edu$\n(?:^|\\.)dalailama80\\.org$\n(?:^|\\.)dalailamacenter\\.org$\n(?:^|\\.)dalailamafellows\\.org$\n(?:^|\\.)dalailamafilm\\.com$\n(?:^|\\.)dalailamafoundation\\.org$\n(?:^|\\.)dalailamahindi\\.com$\n(?:^|\\.)dalailamainaustralia\\.org$\n(?:^|\\.)dalailamajapanese\\.com$\n(?:^|\\.)dalailamaprotesters\\.info$\n(?:^|\\.)dalailamaquotes\\.org$\n(?:^|\\.)dalailamatrust\\.org$\n(?:^|\\.)dalailamavisit\\.org\\.nz$\n(?:^|\\.)dalailamaworld\\.com$\n(?:^|\\.)dalianmeng\\.org$\n(?:^|\\.)daliulian\\.org$\n(?:^|\\.)danbooru\\.donmai\\.us$\n(?:^|\\.)danke4china\\.net$\n(?:^|\\.)danwei\\.org$\n(?:^|\\.)daodu14\\.jigsy\\.com$\n(?:^|\\.)daolan\\.net$\n(?:^|\\.)daozhongxing\\.org$\n(?:^|\\.)darktech\\.org$\n(?:^|\\.)darktoy\\.net$\n(?:^|\\.)darpa\\.mil$\n(?:^|\\.)dastrassi\\.org$\n(?:^|\\.)data-vocabulary\\.org$\n(?:^|\\.)data\\.flurry\\.com$\n(?:^|\\.)data\\.gov\\.tw$\n(?:^|\\.)daum\\.net$\n(?:^|\\.)david-kilgour\\.com$\n(?:^|\\.)dawangidc\\.com$\n(?:^|\\.)daxa\\.cn$\n(?:^|\\.)daylife\\.com$\n(?:^|\\.)db\\.tt$\n(?:^|\\.)dbc\\.hk$\n(?:^|\\.)dcard\\.tw$\n(?:^|\\.)dcmilitary\\.com$\n(?:^|\\.)ddc\\.com\\.tw$\n(?:^|\\.)ddhw\\.info$\n(?:^|\\.)ddns\\.info$\n(?:^|\\.)ddns\\.me\\.uk$\n(?:^|\\.)ddns\\.mobi$\n(?:^|\\.)ddns\\.ms$\n(?:^|\\.)ddns\\.name$\n(?:^|\\.)ddns\\.net$\n(?:^|\\.)ddns\\.us$\n(?:^|\\.)de-sci\\.org$\n(?:^|\\.)deaftone\\.com$\n(?:^|\\.)debug\\.com$\n(?:^|\\.)deck\\.ly$\n(?:^|\\.)decodet\\.co$\n(?:^|\\.)deepmind\\.com$\n(?:^|\\.)deezer\\.com$\n(?:^|\\.)definebabe\\.com$\n(?:^|\\.)deja\\.com$\n(?:^|\\.)delcamp\\.net$\n(?:^|\\.)delicious\\.com$\n(?:^|\\.)demo\\.opera-mini\\.net$\n(?:^|\\.)democrats\\.org$\n(?:^|\\.)depositphotos\\.com$\n(?:^|\\.)derekhsu\\.homeip\\.net$\n(?:^|\\.)desc\\.se$\n(?:^|\\.)design\\.google$\n(?:^|\\.)desipro\\.de$\n(?:^|\\.)dessci\\.com$\n(?:^|\\.)destiny\\.xfiles\\.to$\n(?:^|\\.)destroy-china\\.jp$\n(?:^|\\.)deutsche-welle\\.de$\n(?:^|\\.)developers\\.box\\.net$\n(?:^|\\.)devio\\.us$\n(?:^|\\.)devpn\\.com$\n(?:^|\\.)dfas\\.mil$\n(?:^|\\.)dfn\\.org$\n(?:^|\\.)dharamsalanet\\.com$\n(?:^|\\.)dharmakara\\.net$\n(?:^|\\.)dhcp\\.biz$\n(?:^|\\.)diaoyuislands\\.org$\n(?:^|\\.)dictionary\\.goo\\.ne\\.jp$\n(?:^|\\.)difangwenge\\.org$\n(?:^|\\.)digiland\\.tw$\n(?:^|\\.)digisfera\\.com$\n(?:^|\\.)digitalnomadsproject\\.org$\n(?:^|\\.)diigo\\.com$\n(?:^|\\.)dilber\\.se$\n(?:^|\\.)dingchin\\.com\\.tw$\n(?:^|\\.)dipity\\.com$\n(?:^|\\.)directcreative\\.com$\n(?:^|\\.)discoins\\.com$\n(?:^|\\.)disconnect\\.me$\n(?:^|\\.)discordapp\\.com$\n(?:^|\\.)discordapp\\.net$\n(?:^|\\.)discuss\\.com\\.hk$\n(?:^|\\.)discuss4u\\.com$\n(?:^|\\.)dish\\.com$\n(?:^|\\.)disp\\.cc$\n(?:^|\\.)disqus\\.com$\n(?:^|\\.)dit-inc\\.us$\n(?:^|\\.)dizhidizhi\\.com$\n(?:^|\\.)dizhuzhishang\\.com$\n(?:^|\\.)djangosnippets\\.org$\n(?:^|\\.)djorz\\.com$\n(?:^|\\.)dl-laby\\.jp$\n(?:^|\\.)dl\\.box\\.net$\n(?:^|\\.)dlsite\\.com$\n(?:^|\\.)dlyoutube\\.com$\n(?:^|\\.)dm530\\.net$\n(?:^|\\.)dmcdn\\.net$\n(?:^|\\.)dmm\\.co\\.jp$\n(?:^|\\.)dns-dns\\.com$\n(?:^|\\.)dns-stuff\\.com$\n(?:^|\\.)dns\\.google$\n(?:^|\\.)dns04\\.com$\n(?:^|\\.)dns05\\.com$\n(?:^|\\.)dns1\\.us$\n(?:^|\\.)dns2\\.us$\n(?:^|\\.)dns2go\\.com$\n(?:^|\\.)dnscrypt\\.org$\n(?:^|\\.)dnset\\.com$\n(?:^|\\.)dnsrd\\.com$\n(?:^|\\.)dnssec\\.net$\n(?:^|\\.)dnvod\\.tv$\n(?:^|\\.)doctorvoice\\.org$\n(?:^|\\.)dogfartnetwork\\.com$\n(?:^|\\.)dojin\\.com$\n(?:^|\\.)dok-forum\\.net$\n(?:^|\\.)dolc\\.de$\n(?:^|\\.)dolf\\.org\\.hk$\n(?:^|\\.)dollf\\.com$\n(?:^|\\.)domain\\.club\\.tw$\n(?:^|\\.)domainhelp\\.search\\.com$\n(?:^|\\.)domains\\.google$\n(?:^|\\.)domaintoday\\.com\\.au$\n(?:^|\\.)dongtaiwang\\.com$\n(?:^|\\.)dongtaiwang\\.net$\n(?:^|\\.)dongyangjing\\.com$\n(?:^|\\.)dontfilter\\.us$\n(?:^|\\.)dontmovetochina\\.com$\n(?:^|\\.)dorjeshugden\\.com$\n(?:^|\\.)dotplane\\.com$\n(?:^|\\.)dotsub\\.com$\n(?:^|\\.)dotvpn\\.com$\n(?:^|\\.)doub\\.io$\n(?:^|\\.)doubibackup\\.com$\n(?:^|\\.)doubmirror\\.cf$\n(?:^|\\.)dougscripts\\.com$\n(?:^|\\.)douhokanko\\.net$\n(?:^|\\.)doujincafe\\.com$\n(?:^|\\.)dowei\\.org$\n(?:^|\\.)download\\.aircrack-ng\\.org$\n(?:^|\\.)download\\.cnet\\.com$\n(?:^|\\.)download\\.ithome\\.com\\.tw$\n(?:^|\\.)dphk\\.org$\n(?:^|\\.)dpp\\.org\\.tw$\n(?:^|\\.)dpr\\.info$\n(?:^|\\.)dragonex\\.io$\n(?:^|\\.)dragonsprings\\.org$\n(?:^|\\.)dreamamateurs\\.com$\n(?:^|\\.)drepung\\.org$\n(?:^|\\.)drgan\\.net$\n(?:^|\\.)drmingxia\\.org$\n(?:^|\\.)dropbooks\\.tv$\n(?:^|\\.)dropbox\\.com$\n(?:^|\\.)dropboxusercontent\\.com$\n(?:^|\\.)drsunacademy\\.com$\n(?:^|\\.)drtuber\\.com$\n(?:^|\\.)dscn\\.info$\n(?:^|\\.)dsmtp\\.com$\n(?:^|\\.)dstk\\.dk$\n(?:^|\\.)dtdns\\.net$\n(?:^|\\.)dtiblog\\.com$\n(?:^|\\.)dtic\\.mil$\n(?:^|\\.)dtwang\\.org$\n(?:^|\\.)duanzhihu\\.com$\n(?:^|\\.)duck\\.com$\n(?:^|\\.)duckdns\\.org$\n(?:^|\\.)duckduckgo-owned-server\\.yahoo\\.net$\n(?:^|\\.)duckduckgo\\.com$\n(?:^|\\.)duckload\\.com$\n(?:^|\\.)duckmylife\\.com$\n(?:^|\\.)duga\\.jp$\n(?:^|\\.)duihua\\.org$\n(?:^|\\.)duihuahrjournal\\.org$\n(?:^|\\.)dumb1\\.com$\n(?:^|\\.)dunyabulteni\\.net$\n(?:^|\\.)duoweitimes\\.com$\n(?:^|\\.)duping\\.net$\n(?:^|\\.)duplicati\\.com$\n(?:^|\\.)dupola\\.com$\n(?:^|\\.)dupola\\.net$\n(?:^|\\.)dushi\\.ca$\n(?:^|\\.)dvdpac\\.com$\n(?:^|\\.)dvorak\\.org$\n(?:^|\\.)dw-world\\.com$\n(?:^|\\.)dw-world\\.de$\n(?:^|\\.)dw\\.com$\n(?:^|\\.)dw\\.de$\n(?:^|\\.)dwnews\\.com$\n(?:^|\\.)dwnews\\.net$\n(?:^|\\.)dynamic-dns\\.net$\n(?:^|\\.)dynamicdns\\.biz$\n(?:^|\\.)dynamicdns\\.co\\.uk$\n(?:^|\\.)dynamicdns\\.me\\.uk$\n(?:^|\\.)dynamicdns\\.org\\.uk$\n(?:^|\\.)dynawebinc\\.com$\n(?:^|\\.)dyndns-ip\\.com$\n(?:^|\\.)dyndns-pics\\.com$\n(?:^|\\.)dyndns\\.org$\n(?:^|\\.)dyndns\\.pro$\n(?:^|\\.)dynssl\\.com$\n(?:^|\\.)dynu\\.com$\n(?:^|\\.)dynu\\.net$\n(?:^|\\.)dynupdate\\.no-ip\\.com$\n(?:^|\\.)dysfz\\.cc$\n(?:^|\\.)dzze\\.com$\n(?:^|\\.)e-classical\\.com\\.tw$\n(?:^|\\.)e-gold\\.com$\n(?:^|\\.)e-hentai\\.org$\n(?:^|\\.)e-hentaidb\\.com$\n(?:^|\\.)e-info\\.org\\.tw$\n(?:^|\\.)e-traderland\\.net$\n(?:^|\\.)e-zone\\.com\\.hk$\n(?:^|\\.)e123\\.hk$\n(?:^|\\.)earlytibet\\.com$\n(?:^|\\.)earthcam\\.com$\n(?:^|\\.)earthvpn\\.com$\n(?:^|\\.)eastern-ark\\.com$\n(?:^|\\.)easternlightning\\.org$\n(?:^|\\.)eastturkestan\\.com$\n(?:^|\\.)eastturkistan-gov\\.org$\n(?:^|\\.)eastturkistancc\\.org$\n(?:^|\\.)eastturkistangovernmentinexile\\.us$\n(?:^|\\.)easyca\\.ca$\n(?:^|\\.)easypic\\.com$\n(?:^|\\.)ebony-beauty\\.com$\n(?:^|\\.)ebook\\.hyread\\.com\\.tw$\n(?:^|\\.)ebookbrowse\\.com$\n(?:^|\\.)ebookee\\.com$\n(?:^|\\.)ebtcbank\\.com$\n(?:^|\\.)ecfa\\.org\\.tw$\n(?:^|\\.)echofon\\.com$\n(?:^|\\.)ecimg\\.tw$\n(?:^|\\.)ecministry\\.net$\n(?:^|\\.)economist\\.com$\n(?:^|\\.)ecsm\\.vs\\.com$\n(?:^|\\.)edgecastcdn\\.net$\n(?:^|\\.)edicypages\\.com$\n(?:^|\\.)edmontonchina\\.cn$\n(?:^|\\.)edmontonservice\\.com$\n(?:^|\\.)edns\\.biz$\n(?:^|\\.)edoors\\.com$\n(?:^|\\.)edubridge\\.com$\n(?:^|\\.)edupro\\.org$\n(?:^|\\.)eeas\\.europa\\.eu$\n(?:^|\\.)eesti\\.ee$\n(?:^|\\.)eevpn\\.com$\n(?:^|\\.)efcc\\.org\\.hk$\n(?:^|\\.)effers\\.com$\n(?:^|\\.)efksoft\\.com$\n(?:^|\\.)efukt\\.com$\n(?:^|\\.)eic-av\\.com$\n(?:^|\\.)eireinikotaerukai\\.com$\n(?:^|\\.)eisbb\\.com$\n(?:^|\\.)eksisozluk\\.com$\n(?:^|\\.)electionsmeter\\.com$\n(?:^|\\.)elgoog\\.im$\n(?:^|\\.)ellawine\\.org$\n(?:^|\\.)elpais\\.com$\n(?:^|\\.)eltondisney\\.com$\n(?:^|\\.)emaga\\.com$\n(?:^|\\.)emanna\\.com$\n(?:^|\\.)embr\\.in$\n(?:^|\\.)emilylau\\.org\\.hk$\n(?:^|\\.)empfil\\.com$\n(?:^|\\.)emule-ed2k\\.com$\n(?:^|\\.)emulefans\\.com$\n(?:^|\\.)emuparadise\\.me$\n(?:^|\\.)en\\.favotter\\.net$\n(?:^|\\.)en\\.hao123\\.com$\n(?:^|\\.)enanyang\\.my$\n(?:^|\\.)encyclopedia\\.com$\n(?:^|\\.)enewstree\\.com$\n(?:^|\\.)enfal\\.de$\n(?:^|\\.)engagedaily\\.org$\n(?:^|\\.)englishforeveryone\\.org$\n(?:^|\\.)englishfromengland\\.co\\.uk$\n(?:^|\\.)englishpen\\.org$\n(?:^|\\.)enlighten\\.org\\.tw$\n(?:^|\\.)entermap\\.com$\n(?:^|\\.)entnt\\.com$\n(?:^|\\.)environment\\.google$\n(?:^|\\.)epa\\.gov\\.tw$\n(?:^|\\.)epac\\.to$\n(?:^|\\.)episcopalchurch\\.org$\n(?:^|\\.)epochhk\\.com$\n(?:^|\\.)epochtimes-bg\\.com$\n(?:^|\\.)epochtimes-romania\\.com$\n(?:^|\\.)epochtimes\\.co\\.il$\n(?:^|\\.)epochtimes\\.co\\.kr$\n(?:^|\\.)epochtimes\\.com$\n(?:^|\\.)epochtimes\\.cz$\n(?:^|\\.)epochtimes\\.de$\n(?:^|\\.)epochtimes\\.fr$\n(?:^|\\.)epochtimes\\.ie$\n(?:^|\\.)epochtimes\\.it$\n(?:^|\\.)epochtimes\\.jp$\n(?:^|\\.)epochtimes\\.ru$\n(?:^|\\.)epochtimes\\.se$\n(?:^|\\.)epochtimestr\\.com$\n(?:^|\\.)epochweek\\.com$\n(?:^|\\.)epochweekly\\.com$\n(?:^|\\.)eporner\\.com$\n(?:^|\\.)equinenow\\.com$\n(?:^|\\.)erabaru\\.net$\n(?:^|\\.)eracom\\.com\\.tw$\n(?:^|\\.)eraysoft\\.com\\.tr$\n(?:^|\\.)erepublik\\.com$\n(?:^|\\.)erights\\.net$\n(?:^|\\.)eriversoft\\.com$\n(?:^|\\.)erktv\\.com$\n(?:^|\\.)ernestmandel\\.org$\n(?:^|\\.)erodaizensyu\\.com$\n(?:^|\\.)erodoujinlog\\.com$\n(?:^|\\.)erodoujinworld\\.com$\n(?:^|\\.)eromanga-kingdom\\.com$\n(?:^|\\.)eromangadouzin\\.com$\n(?:^|\\.)eromon\\.net$\n(?:^|\\.)eroprofile\\.com$\n(?:^|\\.)eroticsaloon\\.net$\n(?:^|\\.)eslite\\.com$\n(?:^|\\.)esmtp\\.biz$\n(?:^|\\.)esurance\\.com$\n(?:^|\\.)etaa\\.org\\.au$\n(?:^|\\.)etadult\\.com$\n(?:^|\\.)etaiwannews\\.com$\n(?:^|\\.)etherdelta\\.com$\n(?:^|\\.)etizer\\.org$\n(?:^|\\.)etokki\\.com$\n(?:^|\\.)etools\\.ncol\\.com$\n(?:^|\\.)etowns\\.net$\n(?:^|\\.)etowns\\.org$\n(?:^|\\.)ettoday\\.net$\n(?:^|\\.)etvonline\\.hk$\n(?:^|\\.)eu\\.org$\n(?:^|\\.)eucasino\\.com$\n(?:^|\\.)eulam\\.com$\n(?:^|\\.)eurekavpt\\.com$\n(?:^|\\.)euronews\\.com$\n(?:^|\\.)evchk\\.wikia\\.com$\n(?:^|\\.)evschool\\.net$\n(?:^|\\.)exblog\\.jp$\n(?:^|\\.)exchristian\\.hk$\n(?:^|\\.)exmo\\.com$\n(?:^|\\.)exmormon\\.org$\n(?:^|\\.)expatshield\\.com$\n(?:^|\\.)expecthim\\.com$\n(?:^|\\.)expekt\\.com$\n(?:^|\\.)experts-univers\\.com$\n(?:^|\\.)exploader\\.net$\n(?:^|\\.)expressvpn\\.com$\n(?:^|\\.)exrates\\.me$\n(?:^|\\.)extmatrix\\.com$\n(?:^|\\.)extremetube\\.com$\n(?:^|\\.)exx\\.com$\n(?:^|\\.)eyevio\\.jp$\n(?:^|\\.)eyny\\.com$\n(?:^|\\.)ezpc\\.tk$\n(?:^|\\.)ezpeer\\.com$\n(?:^|\\.)ezua\\.com$\n(?:^|\\.)fa\\.gov\\.tw$\n(?:^|\\.)facebook\\.br$\n(?:^|\\.)facebook\\.com$\n(?:^|\\.)facebook\\.design$\n(?:^|\\.)facebook\\.hu$\n(?:^|\\.)facebook\\.in$\n(?:^|\\.)facebook\\.nl$\n(?:^|\\.)facebook\\.se$\n(?:^|\\.)facebookmail\\.com$\n(?:^|\\.)facebookquotes4u\\.com$\n(?:^|\\.)faceless\\.me$\n(?:^|\\.)facesofnyfw\\.com$\n(?:^|\\.)facesoftibetanselfimmolators\\.info$\n(?:^|\\.)fail\\.hk$\n(?:^|\\.)faith100\\.org$\n(?:^|\\.)faithfuleye\\.com$\n(?:^|\\.)faiththedog\\.info$\n(?:^|\\.)fakku\\.net$\n(?:^|\\.)falsefire\\.com$\n(?:^|\\.)falun-co\\.org$\n(?:^|\\.)falun-ny\\.net$\n(?:^|\\.)falun\\.caltech\\.edu$\n(?:^|\\.)falunart\\.org$\n(?:^|\\.)falunasia\\.info$\n(?:^|\\.)falunau\\.org$\n(?:^|\\.)falunaz\\.net$\n(?:^|\\.)falundafa-dc\\.org$\n(?:^|\\.)falundafa-florida\\.org$\n(?:^|\\.)falundafa-nc\\.org$\n(?:^|\\.)falundafa-pa\\.net$\n(?:^|\\.)falundafa-sacramento\\.org$\n(?:^|\\.)falundafa\\.org$\n(?:^|\\.)falundafaindia\\.org$\n(?:^|\\.)falundafamuseum\\.org$\n(?:^|\\.)falungong\\.club$\n(?:^|\\.)falungong\\.de$\n(?:^|\\.)falungong\\.org\\.uk$\n(?:^|\\.)falunhr\\.org$\n(?:^|\\.)faluninfo\\.de$\n(?:^|\\.)faluninfo\\.net$\n(?:^|\\.)falunpilipinas\\.net$\n(?:^|\\.)falunworld\\.net$\n(?:^|\\.)familyfed\\.org$\n(?:^|\\.)famunion\\.com$\n(?:^|\\.)fan-qiang\\.com$\n(?:^|\\.)fangbinxing\\.com$\n(?:^|\\.)fangeming\\.com$\n(?:^|\\.)fangeqiang\\.com$\n(?:^|\\.)fanglizhi\\.info$\n(?:^|\\.)fangmincn\\.org$\n(?:^|\\.)fangong\\.forums-free\\.com$\n(?:^|\\.)fangong\\.org$\n(?:^|\\.)fangongheike\\.com$\n(?:^|\\.)fanhaodang\\.com$\n(?:^|\\.)fanqiang\\.tk$\n(?:^|\\.)fanqianghou\\.com$\n(?:^|\\.)fanqiangyakexi\\.net$\n(?:^|\\.)fanqiangzhe\\.com$\n(?:^|\\.)fanswong\\.com$\n(?:^|\\.)fanyue\\.info$\n(?:^|\\.)fapdu\\.com$\n(?:^|\\.)faproxy\\.com$\n(?:^|\\.)faqserv\\.com$\n(?:^|\\.)fartit\\.com$\n(?:^|\\.)farwestchina\\.com$\n(?:^|\\.)fast\\.wistia\\.com$\n(?:^|\\.)fastpic\\.ru$\n(?:^|\\.)fastssh\\.com$\n(?:^|\\.)faststone\\.org$\n(?:^|\\.)fatbtc\\.com$\n(?:^|\\.)favstar\\.fm$\n(?:^|\\.)fawanghuihui\\.org$\n(?:^|\\.)faydao\\.com$\n(?:^|\\.)fb\\.com$\n(?:^|\\.)fb\\.me$\n(?:^|\\.)fbaddins\\.com$\n(?:^|\\.)fbcdn\\.net$\n(?:^|\\.)fbsbx\\.com$\n(?:^|\\.)fbworkmail\\.com$\n(?:^|\\.)fc2\\.com$\n(?:^|\\.)fc2blog\\.net$\n(?:^|\\.)fc2china\\.com$\n(?:^|\\.)fc2cn\\.com$\n(?:^|\\.)fda\\.gov\\.tw$\n(?:^|\\.)fdc64\\.de$\n(?:^|\\.)fdc64\\.org$\n(?:^|\\.)fdc89\\.jp$\n(?:^|\\.)feedburner\\.com$\n(?:^|\\.)feeds\\.fileforum\\.com$\n(?:^|\\.)feelssh\\.com$\n(?:^|\\.)feer\\.com$\n(?:^|\\.)feifeiss\\.com$\n(?:^|\\.)feitian-california\\.org$\n(?:^|\\.)feitianacademy\\.org$\n(?:^|\\.)feministteacher\\.com$\n(?:^|\\.)fengzhenghu\\.com$\n(?:^|\\.)fengzhenghu\\.net$\n(?:^|\\.)fevernet\\.com$\n(?:^|\\.)ff\\.im$\n(?:^|\\.)fffff\\.at$\n(?:^|\\.)fflick\\.com$\n(?:^|\\.)ffvpn\\.com$\n(?:^|\\.)fgmtv\\.net$\n(?:^|\\.)fgmtv\\.org$\n(?:^|\\.)fhreports\\.net$\n(?:^|\\.)fiddle\\.jshell\\.net$\n(?:^|\\.)figprayer\\.com$\n(?:^|\\.)fileflyer\\.com$\n(?:^|\\.)files2me\\.com$\n(?:^|\\.)fileserve\\.com$\n(?:^|\\.)filesor\\.com$\n(?:^|\\.)fillthesquare\\.org$\n(?:^|\\.)filmingfortibet\\.org$\n(?:^|\\.)filmy\\.olabloga\\.pl$\n(?:^|\\.)filthdump\\.com$\n(?:^|\\.)financetwitter\\.com$\n(?:^|\\.)finchvpn\\.com$\n(?:^|\\.)findmespot\\.com$\n(?:^|\\.)findyoutube\\.com$\n(?:^|\\.)findyoutube\\.net$\n(?:^|\\.)fingerdaily\\.com$\n(?:^|\\.)finler\\.net$\n(?:^|\\.)firearmsworld\\.net$\n(?:^|\\.)firebaseio\\.com$\n(?:^|\\.)fireofliberty\\.org$\n(?:^|\\.)firetweet\\.io$\n(?:^|\\.)firstfivefollowers\\.com$\n(?:^|\\.)flagsonline\\.it$\n(?:^|\\.)flecheinthepeche\\.fr$\n(?:^|\\.)fleshbot\\.com$\n(?:^|\\.)fleursdeslettres\\.com$\n(?:^|\\.)flgg\\.us$\n(?:^|\\.)flgjustice\\.org$\n(?:^|\\.)flickr\\.com$\n(?:^|\\.)flickrhivemind\\.net$\n(?:^|\\.)flickriver\\.com$\n(?:^|\\.)fling\\.com$\n(?:^|\\.)flipboard\\.com$\n(?:^|\\.)flipkart\\.com$\n(?:^|\\.)flitto\\.com$\n(?:^|\\.)flnet\\.org$\n(?:^|\\.)flog\\.tw$\n(?:^|\\.)flyvpn\\.com$\n(?:^|\\.)flyzy2005\\.com$\n(?:^|\\.)fnac\\.be$\n(?:^|\\.)fnac\\.com$\n(?:^|\\.)fochk\\.org$\n(?:^|\\.)focustaiwan\\.tw$\n(?:^|\\.)focusvpn\\.com$\n(?:^|\\.)fofg-europe\\.net$\n(?:^|\\.)fofg\\.org$\n(?:^|\\.)fofldfradio\\.org$\n(?:^|\\.)fooooo\\.com$\n(?:^|\\.)footwiball\\.com$\n(?:^|\\.)foreignpolicy\\.com$\n(?:^|\\.)forum\\.baby-kingdom\\.com$\n(?:^|\\.)forum\\.cyberctm\\.com$\n(?:^|\\.)forum\\.idsam\\.com$\n(?:^|\\.)forum\\.my903\\.com$\n(?:^|\\.)forum\\.mymaji\\.com$\n(?:^|\\.)forum\\.omy\\.sg$\n(?:^|\\.)forum\\.palmislife\\.com$\n(?:^|\\.)forum\\.setty\\.com\\.tw$\n(?:^|\\.)forum\\.sina\\.com\\.hk$\n(?:^|\\.)forum\\.slime\\.com\\.tw$\n(?:^|\\.)forum\\.tvb\\.com$\n(?:^|\\.)forum\\.xinbao\\.de$\n(?:^|\\.)forum4hk\\.com$\n(?:^|\\.)fotile\\.me$\n(?:^|\\.)fourface\\.nodesnoop\\.com$\n(?:^|\\.)fourthinternational\\.org$\n(?:^|\\.)foxdie\\.us$\n(?:^|\\.)foxgay\\.com$\n(?:^|\\.)foxsub\\.com$\n(?:^|\\.)foxtang\\.com$\n(?:^|\\.)fpmt-osel\\.org$\n(?:^|\\.)fpmt\\.org$\n(?:^|\\.)fpmt\\.tw$\n(?:^|\\.)fpmtmexico\\.org$\n(?:^|\\.)fq\\.wikia\\.com$\n(?:^|\\.)fqok\\.org$\n(?:^|\\.)fqrouter\\.com$\n(?:^|\\.)franklc\\.com$\n(?:^|\\.)freakshare\\.com$\n(?:^|\\.)free-gate\\.org$\n(?:^|\\.)free-hada-now\\.org$\n(?:^|\\.)free-proxy\\.cz$\n(?:^|\\.)free-ss\\.site$\n(?:^|\\.)free-ssh\\.com$\n(?:^|\\.)free\\.fr$\n(?:^|\\.)free4u\\.com\\.ar$\n(?:^|\\.)freealim\\.com$\n(?:^|\\.)freebrowser\\.org$\n(?:^|\\.)freechal\\.com$\n(?:^|\\.)freechina\\.net$\n(?:^|\\.)freechina\\.news$\n(?:^|\\.)freechinaforum\\.org$\n(?:^|\\.)freechinaweibo\\.com$\n(?:^|\\.)freeddns\\.com$\n(?:^|\\.)freeddns\\.org$\n(?:^|\\.)freedomchina\\.info$\n(?:^|\\.)freedomcollection\\.org$\n(?:^|\\.)freedomhouse\\.org$\n(?:^|\\.)freedominfonetweb\\.wordpress\\.com$\n(?:^|\\.)freedomsherald\\.org$\n(?:^|\\.)freeforums\\.org$\n(?:^|\\.)freefq\\.com$\n(?:^|\\.)freefuckvids\\.com$\n(?:^|\\.)freegao\\.com$\n(?:^|\\.)freeilhamtohti\\.org$\n(?:^|\\.)freekwonpyong\\.org$\n(?:^|\\.)freelotto\\.com$\n(?:^|\\.)freeman2\\.com$\n(?:^|\\.)freemoren\\.com$\n(?:^|\\.)freemorenews\\.com$\n(?:^|\\.)freemuse\\.org$\n(?:^|\\.)freenet$\n(?:^|\\.)freenet-china\\.org$\n(?:^|\\.)freenetproject\\.org$\n(?:^|\\.)freenewscn\\.com$\n(?:^|\\.)freeopenvpn\\.com$\n(?:^|\\.)freeoz\\.org$\n(?:^|\\.)freessh\\.us$\n(?:^|\\.)freetcp\\.com$\n(?:^|\\.)freetibet\\.net$\n(?:^|\\.)freetibet\\.org$\n(?:^|\\.)freetibetanheroes\\.org$\n(?:^|\\.)freeviewmovies\\.com$\n(?:^|\\.)freevpn\\.me$\n(?:^|\\.)freevpn\\.nl$\n(?:^|\\.)freewallpaper4\\.me$\n(?:^|\\.)freewebs\\.com$\n(?:^|\\.)freewechat\\.com$\n(?:^|\\.)freeweibo\\.com$\n(?:^|\\.)freewww\\.biz$\n(?:^|\\.)freewww\\.info$\n(?:^|\\.)freexinwen\\.com$\n(?:^|\\.)freeyellow\\.com$\n(?:^|\\.)freeyoutubeproxy\\.net$\n(?:^|\\.)friendfeed-media\\.com$\n(?:^|\\.)friendfeed\\.com$\n(?:^|\\.)friends-of-tibet\\.org$\n(?:^|\\.)friendsoftibet\\.org$\n(?:^|\\.)fring\\.com$\n(?:^|\\.)fringenetwork\\.com$\n(?:^|\\.)from-pr\\.com$\n(?:^|\\.)from-sd\\.com$\n(?:^|\\.)fromchinatousa\\.net$\n(?:^|\\.)frommel\\.net$\n(?:^|\\.)frontlinedefenders\\.org$\n(?:^|\\.)frootvpn\\.com$\n(?:^|\\.)fscked\\.org$\n(?:^|\\.)fsurf\\.com$\n(?:^|\\.)ftchinese\\.com$\n(?:^|\\.)ftp1\\.biz$\n(?:^|\\.)ftpserver\\.biz$\n(?:^|\\.)ftv\\.com\\.tw$\n(?:^|\\.)fucd\\.com$\n(?:^|\\.)fuckcnnic\\.net$\n(?:^|\\.)fuckgfw\\.org$\n(?:^|\\.)fulione\\.com$\n(?:^|\\.)fullerconsideration\\.com$\n(?:^|\\.)fulue\\.com$\n(?:^|\\.)funf\\.tw$\n(?:^|\\.)funkyimg\\.com$\n(?:^|\\.)funp\\.com$\n(?:^|\\.)fuq\\.com$\n(?:^|\\.)furbo\\.org$\n(?:^|\\.)furhhdl\\.org$\n(?:^|\\.)furinkan\\.com$\n(?:^|\\.)furl\\.net$\n(?:^|\\.)futurechinaforum\\.org$\n(?:^|\\.)futuremessage\\.org$\n(?:^|\\.)fux\\.com$\n(?:^|\\.)fuyin\\.net$\n(?:^|\\.)fuyindiantai\\.org$\n(?:^|\\.)fuyu\\.org\\.tw$\n(?:^|\\.)fw\\.cm$\n(?:^|\\.)fxcm-chinese\\.com$\n(?:^|\\.)fxnetworks\\.com$\n(?:^|\\.)fzh999\\.com$\n(?:^|\\.)fzh999\\.net$\n(?:^|\\.)fzlm\\.com$\n(?:^|\\.)g-area\\.org$\n(?:^|\\.)g-queen\\.com$\n(?:^|\\.)g\\.co$\n(?:^|\\.)g0v\\.social$\n(?:^|\\.)g6hentai\\.com$\n(?:^|\\.)gabocorp\\.com$\n(?:^|\\.)gaeproxy\\.com$\n(?:^|\\.)gaforum\\.org$\n(?:^|\\.)galaxymacau\\.com$\n(?:^|\\.)galenwu\\.com$\n(?:^|\\.)galstars\\.net$\n(?:^|\\.)game735\\.com$\n(?:^|\\.)gamebase\\.com\\.tw$\n(?:^|\\.)gamejolt\\.com$\n(?:^|\\.)gamer-cds\\.cdn\\.hinet\\.net$\n(?:^|\\.)gamer\\.com\\.tw$\n(?:^|\\.)gamer2-cds\\.cdn\\.hinet\\.net$\n(?:^|\\.)gamez\\.com\\.tw$\n(?:^|\\.)gamousa\\.com$\n(?:^|\\.)ganges\\.com$\n(?:^|\\.)gaoming\\.net$\n(?:^|\\.)gaopi\\.net$\n(?:^|\\.)gaozhisheng\\.net$\n(?:^|\\.)gaozhisheng\\.org$\n(?:^|\\.)gardennetworks\\.com$\n(?:^|\\.)gardennetworks\\.org$\n(?:^|\\.)gartlive\\.com$\n(?:^|\\.)gate-project\\.com$\n(?:^|\\.)gate\\.io$\n(?:^|\\.)gatecoin\\.com$\n(?:^|\\.)gather\\.com$\n(?:^|\\.)gatherproxy\\.com$\n(?:^|\\.)gati\\.org\\.tw$\n(?:^|\\.)gaybubble\\.com$\n(?:^|\\.)gaycn\\.net$\n(?:^|\\.)gayhub\\.com$\n(?:^|\\.)gaymap\\.cc$\n(?:^|\\.)gaymenring\\.com$\n(?:^|\\.)gaytube\\.com$\n(?:^|\\.)gaywatch\\.com$\n(?:^|\\.)gazotube\\.com$\n(?:^|\\.)gcc\\.org\\.hk$\n(?:^|\\.)gclooney\\.com$\n(?:^|\\.)gcmasia\\.com$\n(?:^|\\.)gcpnews\\.com$\n(?:^|\\.)gcr\\.io$\n(?:^|\\.)gdbt\\.net$\n(?:^|\\.)gdzf\\.org$\n(?:^|\\.)geek-art\\.net$\n(?:^|\\.)geekerhome\\.com$\n(?:^|\\.)geekheart\\.info$\n(?:^|\\.)gekikame\\.com$\n(?:^|\\.)gelbooru\\.com$\n(?:^|\\.)geocities\\.co\\.jp$\n(?:^|\\.)geocities\\.com$\n(?:^|\\.)geocities\\.jp$\n(?:^|\\.)gerefoundation\\.org$\n(?:^|\\.)get\\.app$\n(?:^|\\.)get\\.dev$\n(?:^|\\.)get\\.how$\n(?:^|\\.)get\\.page$\n(?:^|\\.)getastrill\\.com$\n(?:^|\\.)getchu\\.com$\n(?:^|\\.)getcloak\\.com$\n(?:^|\\.)getfoxyproxy\\.org$\n(?:^|\\.)getfreedur\\.com$\n(?:^|\\.)getgom\\.com$\n(?:^|\\.)geti2p\\.net$\n(?:^|\\.)getiton\\.com$\n(?:^|\\.)getjetso\\.com$\n(?:^|\\.)getlantern\\.org$\n(?:^|\\.)getmdl\\.io$\n(?:^|\\.)getoutline\\.org$\n(?:^|\\.)getsocialscope\\.com$\n(?:^|\\.)getsync\\.com$\n(?:^|\\.)gettrials\\.com$\n(?:^|\\.)gettyimages\\.com$\n(?:^|\\.)getuploader\\.com$\n(?:^|\\.)gfbv\\.de$\n(?:^|\\.)gfgold\\.com\\.hk$\n(?:^|\\.)gfsale\\.com$\n(?:^|\\.)gfw\\.org\\.ua$\n(?:^|\\.)gfw\\.press$\n(?:^|\\.)ggpht\\.com$\n(?:^|\\.)ggssl\\.com$\n(?:^|\\.)ghostpath\\.com$\n(?:^|\\.)ghut\\.org$\n(?:^|\\.)giantessnight\\.com$\n(?:^|\\.)gifree\\.com$\n(?:^|\\.)giga-web\\.jp$\n(?:^|\\.)gigporno\\.ru$\n(?:^|\\.)girlbanker\\.com$\n(?:^|\\.)git\\.io$\n(?:^|\\.)github\\.com$\n(?:^|\\.)githubusercontent\\.com$\n(?:^|\\.)gizlen\\.net$\n(?:^|\\.)gjczz\\.com$\n(?:^|\\.)glass8\\.eu$\n(?:^|\\.)global\\.bing\\.com$\n(?:^|\\.)globaljihad\\.net$\n(?:^|\\.)globalmediaoutreach\\.com$\n(?:^|\\.)globalmuseumoncommunism\\.org$\n(?:^|\\.)globalrescue\\.net$\n(?:^|\\.)globaltm\\.org$\n(?:^|\\.)globalvoices\\.org$\n(?:^|\\.)globalvoicesonline\\.org$\n(?:^|\\.)globalvpn\\.net$\n(?:^|\\.)glock\\.com$\n(?:^|\\.)gloryhole\\.com$\n(?:^|\\.)glorystar\\.me$\n(?:^|\\.)gluckman\\.com$\n(?:^|\\.)glype\\.com$\n(?:^|\\.)gmail\\.com$\n(?:^|\\.)gmbd\\.cn$\n(?:^|\\.)gmhz\\.org$\n(?:^|\\.)gmll\\.org$\n(?:^|\\.)gmodules\\.com$\n(?:^|\\.)gmozomg\\.izihost\\.org$\n(?:^|\\.)gnci\\.org\\.hk$\n(?:^|\\.)go-pki\\.com$\n(?:^|\\.)go\\.nesnode\\.com$\n(?:^|\\.)go141\\.com$\n(?:^|\\.)goagent\\.biz$\n(?:^|\\.)goagent\\.codeplex\\.com$\n(?:^|\\.)goagentplus\\.com$\n(?:^|\\.)gobet\\.cc$\n(?:^|\\.)godfootsteps\\.org$\n(?:^|\\.)godns\\.work$\n(?:^|\\.)godoc\\.org$\n(?:^|\\.)godsdirectcontact\\.co\\.uk$\n(?:^|\\.)godsdirectcontact\\.org$\n(?:^|\\.)godsdirectcontact\\.org\\.tw$\n(?:^|\\.)godsimmediatecontact\\.com$\n(?:^|\\.)gogotunnel\\.com$\n(?:^|\\.)gohappy\\.com\\.tw$\n(?:^|\\.)gojet\\.krtco\\.com\\.tw$\n(?:^|\\.)gokbayrak\\.com$\n(?:^|\\.)golang\\.org$\n(?:^|\\.)goldbet\\.com$\n(?:^|\\.)goldbetsports\\.com$\n(?:^|\\.)goldeneyevault\\.com$\n(?:^|\\.)goldenfrog\\.com$\n(?:^|\\.)goldjizz\\.com$\n(?:^|\\.)goldstep\\.net$\n(?:^|\\.)goldwave\\.com$\n(?:^|\\.)gongm\\.in$\n(?:^|\\.)gongmeng\\.info$\n(?:^|\\.)gongminliliang\\.com$\n(?:^|\\.)gongwt\\.com$\n(?:^|\\.)goo\\.gl$\n(?:^|\\.)gooday\\.xyz$\n(?:^|\\.)gooddns\\.info$\n(?:^|\\.)goodreaders\\.com$\n(?:^|\\.)goodreads\\.com$\n(?:^|\\.)goodtv\\.com\\.tw$\n(?:^|\\.)goodtv\\.tv$\n(?:^|\\.)goofind\\.com$\n(?:^|\\.)google(\\.[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?){1,2}$\n(?:^|\\.)googleapis(\\.[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?){1,2}$\n(?:^|\\.)googleapps\\.com$\n(?:^|\\.)googlearth\\.com$\n(?:^|\\.)googleartproject\\.com$\n(?:^|\\.)googleblog\\.com$\n(?:^|\\.)googlebot\\.com$\n(?:^|\\.)googlechinawebmaster\\.com$\n(?:^|\\.)googlecode\\.com$\n(?:^|\\.)googlecommerce\\.com$\n(?:^|\\.)googledomains\\.com$\n(?:^|\\.)googledrive\\.com$\n(?:^|\\.)googleearth\\.com$\n(?:^|\\.)googlegroups\\.com$\n(?:^|\\.)googlehosted\\.com$\n(?:^|\\.)googleideas\\.com$\n(?:^|\\.)googleinsidesearch\\.com$\n(?:^|\\.)googlelabs\\.com$\n(?:^|\\.)googlemail\\.com$\n(?:^|\\.)googlemashups\\.com$\n(?:^|\\.)googlepagecreator\\.com$\n(?:^|\\.)googleplay\\.com$\n(?:^|\\.)googleplus\\.com$\n(?:^|\\.)googlescholar\\.com$\n(?:^|\\.)googlesile\\.com$\n(?:^|\\.)googlesource\\.com$\n(?:^|\\.)googleusercontent\\.com$\n(?:^|\\.)googlevideo\\.com$\n(?:^|\\.)googleweblight\\.com$\n(?:^|\\.)googlezip\\.net$\n(?:^|\\.)gopetition\\.com$\n(?:^|\\.)goproxing\\.net$\n(?:^|\\.)goregrish\\.com$\n(?:^|\\.)gospelherald\\.com$\n(?:^|\\.)got-game\\.org$\n(?:^|\\.)gotdns\\.ch$\n(?:^|\\.)gotgeeks\\.com$\n(?:^|\\.)gotrusted\\.com$\n(?:^|\\.)gotw\\.ca$\n(?:^|\\.)gov\\.taipei$\n(?:^|\\.)gov\\.tw$\n(?:^|\\.)gr8domain\\.biz$\n(?:^|\\.)gr8name\\.biz$\n(?:^|\\.)grammaly\\.com$\n(?:^|\\.)grandtrial\\.org$\n(?:^|\\.)grangorz\\.org$\n(?:^|\\.)graphis\\.ne\\.jp$\n(?:^|\\.)graphql\\.org$\n(?:^|\\.)greasespot\\.net$\n(?:^|\\.)great-firewall\\.com$\n(?:^|\\.)great-roc\\.org$\n(?:^|\\.)greatfire\\.org$\n(?:^|\\.)greatfire\\.us7\\.list-manage\\.com$\n(?:^|\\.)greatfirewall\\.biz$\n(?:^|\\.)greatfirewallofchina\\.net$\n(?:^|\\.)greatfirewallofchina\\.org$\n(?:^|\\.)greatroc\\.org$\n(?:^|\\.)greatroc\\.tw$\n(?:^|\\.)greatzhonghua\\.org$\n(?:^|\\.)greenfieldbookstore\\.com\\.hk$\n(?:^|\\.)greenparty\\.org\\.tw$\n(?:^|\\.)greenpeace\\.com\\.tw$\n(?:^|\\.)greenpeace\\.org$\n(?:^|\\.)greenreadings\\.com$\n(?:^|\\.)greenvpn\\.net$\n(?:^|\\.)greenvpn\\.org$\n(?:^|\\.)grotty-monday\\.com$\n(?:^|\\.)groups\\.google\\.cn$\n(?:^|\\.)grow\\.google$\n(?:^|\\.)gs-discuss\\.com$\n(?:^|\\.)gsp\\.target\\.com$\n(?:^|\\.)gstatic\\.com$\n(?:^|\\.)gtricks\\.com$\n(?:^|\\.)gts-vpn\\.com$\n(?:^|\\.)gu-chu-sum\\.org$\n(?:^|\\.)guaguass\\.com$\n(?:^|\\.)guaguass\\.org$\n(?:^|\\.)guancha\\.org$\n(?:^|\\.)guaneryu\\.com$\n(?:^|\\.)guangming\\.com\\.my$\n(?:^|\\.)guardster\\.com$\n(?:^|\\.)guishan\\.org$\n(?:^|\\.)gumroad\\.com$\n(?:^|\\.)gun-world\\.net$\n(?:^|\\.)gunsamerica\\.com$\n(?:^|\\.)gunsandammo\\.com$\n(?:^|\\.)guo\\.media$\n(?:^|\\.)guruonline\\.hk$\n(?:^|\\.)gutteruncensored\\.com$\n(?:^|\\.)gvlib\\.com$\n(?:^|\\.)gvm\\.com\\.tw$\n(?:^|\\.)gvt0\\.com$\n(?:^|\\.)gvt1\\.com$\n(?:^|\\.)gvt3\\.com$\n(?:^|\\.)gwtproject\\.org$\n(?:^|\\.)gyalwarinpoche\\.com$\n(?:^|\\.)gyatsostudio\\.com$\n(?:^|\\.)gzm\\.tv$\n(?:^|\\.)gzone-anime\\.info$\n(?:^|\\.)h-china\\.org$\n(?:^|\\.)h-moe\\.com$\n(?:^|\\.)h1n1china\\.org$\n(?:^|\\.)h528\\.com$\n(?:^|\\.)h5dm\\.com$\n(?:^|\\.)h5galgame\\.me$\n(?:^|\\.)hacg\\.club$\n(?:^|\\.)hacg\\.in$\n(?:^|\\.)hacg\\.li$\n(?:^|\\.)hacg\\.me$\n(?:^|\\.)hacg\\.red$\n(?:^|\\.)hacken\\.cc$\n(?:^|\\.)hacker\\.org$\n(?:^|\\.)hackthatphone\\.net$\n(?:^|\\.)hahaxixi\\.github\\.io$\n(?:^|\\.)hahlo\\.com$\n(?:^|\\.)hakkatv\\.org\\.tw$\n(?:^|\\.)handcraftedsoftware\\.org$\n(?:^|\\.)hanunyi\\.com$\n(?:^|\\.)hao\\.news$\n(?:^|\\.)haoel\\.github\\.io$\n(?:^|\\.)happy-vpn\\.com$\n(?:^|\\.)haproxy\\.org$\n(?:^|\\.)hardsextube\\.com$\n(?:^|\\.)harunyahya\\.com$\n(?:^|\\.)hautelook\\.com$\n(?:^|\\.)hautelookcdn\\.com$\n(?:^|\\.)have8\\.com$\n(?:^|\\.)hbg\\.com$\n(?:^|\\.)hbo\\.com$\n(?:^|\\.)hclips\\.com$\n(?:^|\\.)hd\\.stheadline\\.com$\n(?:^|\\.)hdlt\\.me$\n(?:^|\\.)hdtvb\\.net$\n(?:^|\\.)hdzog\\.com$\n(?:^|\\.)heartyit\\.com$\n(?:^|\\.)heavy-r\\.com$\n(?:^|\\.)hec\\.su$\n(?:^|\\.)hecaitou\\.net$\n(?:^|\\.)hechaji\\.com$\n(?:^|\\.)heeact\\.edu\\.tw$\n(?:^|\\.)hegre-art\\.com$\n(?:^|\\.)heix\\.pp\\.ru$\n(?:^|\\.)helloandroid\\.com$\n(?:^|\\.)helloqueer\\.com$\n(?:^|\\.)helloss\\.pw$\n(?:^|\\.)hellotxt\\.com$\n(?:^|\\.)hellouk\\.org$\n(?:^|\\.)help\\.linksalpha\\.com$\n(?:^|\\.)helpeachpeople\\.com$\n(?:^|\\.)helplinfen\\.com$\n(?:^|\\.)helpster\\.de$\n(?:^|\\.)helpzhuling\\.org$\n(?:^|\\.)hentai\\.to$\n(?:^|\\.)hentaitube\\.tv$\n(?:^|\\.)hentaivideoworld\\.com$\n(?:^|\\.)heqinglian\\.net$\n(?:^|\\.)heungkongdiscuss\\.com$\n(?:^|\\.)hexieshe\\.com$\n(?:^|\\.)hexieshe\\.xyz$\n(?:^|\\.)hexxeh\\.net$\n(?:^|\\.)heyzo\\.com$\n(?:^|\\.)hgseav\\.com$\n(?:^|\\.)hhdcb3office\\.org$\n(?:^|\\.)hhthesakyatrizin\\.org$\n(?:^|\\.)hi-on\\.org\\.tw$\n(?:^|\\.)hidden-advent\\.org$\n(?:^|\\.)hide\\.me$\n(?:^|\\.)hidecloud\\.com$\n(?:^|\\.)hidein\\.net$\n(?:^|\\.)hideipvpn\\.com$\n(?:^|\\.)hideman\\.net$\n(?:^|\\.)hideme\\.nl$\n(?:^|\\.)hidemy\\.name$\n(?:^|\\.)hidemyass\\.com$\n(?:^|\\.)hidemycomp\\.com$\n(?:^|\\.)higfw\\.com$\n(?:^|\\.)highpeakspureearth\\.com$\n(?:^|\\.)highrockmedia\\.com$\n(?:^|\\.)hihiforum\\.com$\n(?:^|\\.)hihistory\\.net$\n(?:^|\\.)hiitch\\.com$\n(?:^|\\.)hikinggfw\\.org$\n(?:^|\\.)hilive\\.tv$\n(?:^|\\.)himalayan-foundation\\.org$\n(?:^|\\.)himalayanglacier\\.com$\n(?:^|\\.)himemix\\.com$\n(?:^|\\.)himemix\\.net$\n(?:^|\\.)hitbtc\\.com$\n(?:^|\\.)hitomi\\.la$\n(?:^|\\.)hiwifi\\.com$\n(?:^|\\.)hizb-ut-tahrir\\.info$\n(?:^|\\.)hizb-ut-tahrir\\.org$\n(?:^|\\.)hizbuttahrir\\.org$\n(?:^|\\.)hjclub\\.info$\n(?:^|\\.)hk-pub\\.com$\n(?:^|\\.)hk\\.frienddy\\.com$\n(?:^|\\.)hk\\.geocities\\.com$\n(?:^|\\.)hk\\.gradconnection\\.com$\n(?:^|\\.)hk\\.hao123img\\.com$\n(?:^|\\.)hk\\.jiepang\\.com$\n(?:^|\\.)hk\\.knowledge\\.yahoo\\.com$\n(?:^|\\.)hk\\.myblog\\.yahoo\\.com$\n(?:^|\\.)hk\\.news\\.yahoo\\.com$\n(?:^|\\.)hk\\.rd\\.yahoo\\.com$\n(?:^|\\.)hk\\.search\\.yahoo\\.com$\n(?:^|\\.)hk\\.video\\.news\\.yahoo\\.com$\n(?:^|\\.)hk\\.yahoo\\.com$\n(?:^|\\.)hk01\\.com$\n(?:^|\\.)hk32168\\.com$\n(?:^|\\.)hka8964\\.wordpress\\.com$\n(?:^|\\.)hkacg\\.com$\n(?:^|\\.)hkacg\\.net$\n(?:^|\\.)hkanews\\.wordpress\\.com$\n(?:^|\\.)hkatvnews\\.com$\n(?:^|\\.)hkbc\\.net$\n(?:^|\\.)hkbf\\.org$\n(?:^|\\.)hkbookcity\\.com$\n(?:^|\\.)hkchurch\\.org$\n(?:^|\\.)hkci\\.org\\.hk$\n(?:^|\\.)hkcmi\\.edu$\n(?:^|\\.)hkcnews\\.com$\n(?:^|\\.)hkcoc\\.com$\n(?:^|\\.)hkcoc\\.weather\\.com\\.hk$\n(?:^|\\.)hkdailynews\\.com\\.hk$\n(?:^|\\.)hkday\\.net$\n(?:^|\\.)hkdf\\.org$\n(?:^|\\.)hkej\\.com$\n(?:^|\\.)hkepc\\.com$\n(?:^|\\.)hkfaa\\.com$\n(?:^|\\.)hkfreezone\\.com$\n(?:^|\\.)hkfront\\.org$\n(?:^|\\.)hkgalden\\.com$\n(?:^|\\.)hkgolden\\.com$\n(?:^|\\.)hkgreenradio\\.org$\n(?:^|\\.)hkheadline\\.com$\n(?:^|\\.)hkhkhk\\.com$\n(?:^|\\.)hkhrc\\.org\\.hk$\n(?:^|\\.)hkhrm\\.org\\.hk$\n(?:^|\\.)hkip\\.org\\.uk$\n(?:^|\\.)hkjc\\.com$\n(?:^|\\.)hkjp\\.org$\n(?:^|\\.)hklft\\.com$\n(?:^|\\.)hklts\\.org\\.hk$\n(?:^|\\.)hkptu\\.org$\n(?:^|\\.)hkreporter\\.com$\n(?:^|\\.)hkreporter\\.loved\\.hk$\n(?:^|\\.)hkupop\\.hku\\.hk$\n(?:^|\\.)hkusu\\.net$\n(?:^|\\.)hkvwet\\.com$\n(?:^|\\.)hkwcc\\.org\\.hk$\n(?:^|\\.)hkzone\\.org$\n(?:^|\\.)hmonghot\\.com$\n(?:^|\\.)hmv\\.co\\.jp$\n(?:^|\\.)hmvdigital\\.ca$\n(?:^|\\.)hmvdigital\\.com$\n(?:^|\\.)hnjhj\\.com$\n(?:^|\\.)hnntube\\.com$\n(?:^|\\.)hola\\.com$\n(?:^|\\.)hola\\.org$\n(?:^|\\.)holymountaincn\\.com$\n(?:^|\\.)holyspiritspeaks\\.org$\n(?:^|\\.)home\\.sina\\.com$\n(?:^|\\.)home\\.so-net\\.net\\.tw$\n(?:^|\\.)homedepot\\.com$\n(?:^|\\.)homeperversion\\.com$\n(?:^|\\.)homeservershow\\.com$\n(?:^|\\.)hongkongfp\\.com$\n(?:^|\\.)hongmeimei\\.com$\n(?:^|\\.)hongzhi\\.li$\n(?:^|\\.)hootsuite\\.com$\n(?:^|\\.)hoovers\\.com$\n(?:^|\\.)hopedialogue\\.org$\n(?:^|\\.)hopto\\.org$\n(?:^|\\.)hornygamer\\.com$\n(?:^|\\.)hornytrip\\.com$\n(?:^|\\.)hotav\\.tv$\n(?:^|\\.)hotels\\.cn$\n(?:^|\\.)hotfrog\\.com\\.tw$\n(?:^|\\.)hotgoo\\.com$\n(?:^|\\.)hotpornshow\\.com$\n(?:^|\\.)hotpot\\.hk$\n(?:^|\\.)hotshame\\.com$\n(?:^|\\.)hotspotshield\\.com$\n(?:^|\\.)hotvpn\\.com$\n(?:^|\\.)hougaige\\.com$\n(?:^|\\.)howtoforge\\.com$\n(?:^|\\.)hoxx\\.com$\n(?:^|\\.)hpa\\.gov\\.tw$\n(?:^|\\.)hqcdp\\.org$\n(?:^|\\.)hqjapanesesex\\.com$\n(?:^|\\.)hqmovies\\.com$\n(?:^|\\.)hqsbnet\\.wordpress\\.com$\n(?:^|\\.)hqsbonline\\.wordpress\\.com$\n(?:^|\\.)hrcchina\\.org$\n(?:^|\\.)hrcir\\.com$\n(?:^|\\.)hrea\\.org$\n(?:^|\\.)hrichina\\.org$\n(?:^|\\.)hrtsea\\.com$\n(?:^|\\.)hrw\\.org$\n(?:^|\\.)hrweb\\.org$\n(?:^|\\.)hsjp\\.net$\n(?:^|\\.)hsselite\\.com$\n(?:^|\\.)hst\\.net\\.tw$\n(?:^|\\.)hstern\\.net$\n(?:^|\\.)hstt\\.net$\n(?:^|\\.)ht\\.ly$\n(?:^|\\.)htkou\\.net$\n(?:^|\\.)htl\\.li$\n(?:^|\\.)html5rocks\\.com$\n(?:^|\\.)https$\n(?:^|\\.)https443\\.net$\n(?:^|\\.)https443\\.org$\n(?:^|\\.)hua-yue\\.net$\n(?:^|\\.)huaglad\\.com$\n(?:^|\\.)huanghuagang\\.org$\n(?:^|\\.)huangyiyu\\.com$\n(?:^|\\.)huaren\\.us$\n(?:^|\\.)huaren4us\\.com$\n(?:^|\\.)huashangnews\\.com$\n(?:^|\\.)huaxia-news\\.com$\n(?:^|\\.)huaxiabao\\.org$\n(?:^|\\.)huaxin\\.ph$\n(?:^|\\.)huayuworld\\.org$\n(?:^|\\.)hudatoriq\\.web\\.id$\n(?:^|\\.)hudson\\.org$\n(?:^|\\.)huffingtonpost\\.com$\n(?:^|\\.)hugoroy\\.eu$\n(?:^|\\.)huhaitai\\.com$\n(?:^|\\.)huhamhire\\.com$\n(?:^|\\.)huiyi\\.in$\n(?:^|\\.)hulkshare\\.com$\n(?:^|\\.)hulu\\.com$\n(?:^|\\.)huluim\\.com$\n(?:^|\\.)hum$\n(?:^|\\.)humanrightsbriefing\\.org$\n(?:^|\\.)hung-ya\\.com$\n(?:^|\\.)hungerstrikeforaids\\.org$\n(?:^|\\.)huobi\\.com$\n(?:^|\\.)huobi\\.pro$\n(?:^|\\.)huobipro\\.com$\n(?:^|\\.)huping\\.net$\n(?:^|\\.)hurgokbayrak\\.com$\n(?:^|\\.)hurriyet\\.com\\.tr$\n(?:^|\\.)hustlercash\\.com$\n(?:^|\\.)hut2\\.ru$\n(?:^|\\.)hutianyi\\.net$\n(?:^|\\.)hutong9\\.net$\n(?:^|\\.)huyandex\\.com$\n(?:^|\\.)hwadzan\\.tw$\n(?:^|\\.)hwayue\\.org\\.tw$\n(?:^|\\.)hwinfo\\.com$\n(?:^|\\.)hxwk\\.org$\n(?:^|\\.)hxwq\\.org$\n(?:^|\\.)hybrid-analysis\\.com$\n(?:^|\\.)hyperrate\\.com$\n(?:^|\\.)i-cable\\.com$\n(?:^|\\.)i-part\\.com\\.tw$\n(?:^|\\.)i\\.lithium\\.com$\n(?:^|\\.)i1\\.hk$\n(?:^|\\.)i2p2\\.de$\n(?:^|\\.)i2runner\\.com$\n(?:^|\\.)i818hk\\.com$\n(?:^|\\.)iam\\.soy$\n(?:^|\\.)iamtopone\\.com$\n(?:^|\\.)iask\\.bz$\n(?:^|\\.)iask\\.ca$\n(?:^|\\.)iav19\\.com$\n(?:^|\\.)ibiblio\\.org$\n(?:^|\\.)iblist\\.com$\n(?:^|\\.)iblogserv-f\\.net$\n(?:^|\\.)ibros\\.org$\n(?:^|\\.)ibvpn\\.com$\n(?:^|\\.)icams\\.com$\n(?:^|\\.)ice\\.audionow\\.com$\n(?:^|\\.)icij\\.org$\n(?:^|\\.)icl-fi\\.org$\n(?:^|\\.)icoco\\.com$\n(?:^|\\.)iconpaper\\.org$\n(?:^|\\.)icu-project\\.org$\n(?:^|\\.)id\\.hao123\\.com$\n(?:^|\\.)id\\.heroku\\.com$\n(?:^|\\.)iddddg\\.com$\n(?:^|\\.)idemocracy\\.asia$\n(?:^|\\.)identi\\.ca$\n(?:^|\\.)idiomconnection\\.com$\n(?:^|\\.)idouga\\.com$\n(?:^|\\.)idreamx\\.com$\n(?:^|\\.)idv\\.tw$\n(?:^|\\.)ieasy5\\.com$\n(?:^|\\.)ied2k\\.net$\n(?:^|\\.)ienergy1\\.com$\n(?:^|\\.)if\\.ttt$\n(?:^|\\.)ifan\\.cz\\.cc$\n(?:^|\\.)ifanqiang\\.com$\n(?:^|\\.)ifcss\\.org$\n(?:^|\\.)ifjc\\.org$\n(?:^|\\.)ifreewares\\.com$\n(?:^|\\.)ift\\.tt$\n(?:^|\\.)igcd\\.net$\n(?:^|\\.)igfw\\.net$\n(?:^|\\.)igfw\\.tech$\n(?:^|\\.)igmg\\.de$\n(?:^|\\.)ignitedetroit\\.net$\n(?:^|\\.)igoogle\\.com$\n(?:^|\\.)igotmail\\.com\\.tw$\n(?:^|\\.)igvita\\.com$\n(?:^|\\.)ihakka\\.net$\n(?:^|\\.)ihao\\.org$\n(?:^|\\.)iicns\\.com$\n(?:^|\\.)iipdigital\\.usembassy\\.gov$\n(?:^|\\.)ikstar\\.com$\n(?:^|\\.)ikwb\\.com$\n(?:^|\\.)illusionfactory\\.com$\n(?:^|\\.)ilove80\\.be$\n(?:^|\\.)ilovelongtoes\\.com$\n(?:^|\\.)im\\.tv$\n(?:^|\\.)im88\\.tw$\n(?:^|\\.)imageab\\.com$\n(?:^|\\.)imagefap\\.com$\n(?:^|\\.)imageflea\\.com$\n(?:^|\\.)images-gaytube\\.com$\n(?:^|\\.)images\\.comico\\.tw$\n(?:^|\\.)imageshack\\.us$\n(?:^|\\.)imagevenue\\.com$\n(?:^|\\.)imagezilla\\.net$\n(?:^|\\.)imb\\.org$\n(?:^|\\.)imdb\\.com$\n(?:^|\\.)img$\n(?:^|\\.)img\\.dlsite\\.jp$\n(?:^|\\.)img\\.ly$\n(?:^|\\.)imgchili\\.net$\n(?:^|\\.)imgmega\\.com$\n(?:^|\\.)imgur\\.com$\n(?:^|\\.)imkev\\.com$\n(?:^|\\.)imlive\\.com$\n(?:^|\\.)immigration\\.gov\\.tw$\n(?:^|\\.)immoral\\.jp$\n(?:^|\\.)impact\\.org\\.au$\n(?:^|\\.)impp\\.mn$\n(?:^|\\.)in-disguise\\.com$\n(?:^|\\.)in99\\.org$\n(?:^|\\.)incapdns\\.net$\n(?:^|\\.)incloak\\.com$\n(?:^|\\.)incredibox\\.fr$\n(?:^|\\.)indiandefensenews\\.in$\n(?:^|\\.)indiemerch\\.com$\n(?:^|\\.)info-graf\\.fr$\n(?:^|\\.)initiativesforchina\\.org$\n(?:^|\\.)inkui\\.com$\n(?:^|\\.)inmediahk\\.net$\n(?:^|\\.)innermongolia\\.org$\n(?:^|\\.)inote\\.tw$\n(?:^|\\.)insecam\\.org$\n(?:^|\\.)insidevoa\\.com$\n(?:^|\\.)instagram\\.com$\n(?:^|\\.)instanthq\\.com$\n(?:^|\\.)institut-tibetain\\.org$\n(?:^|\\.)international-news\\.newsmagazine\\.asia$\n(?:^|\\.)internet\\.org$\n(?:^|\\.)internetdefenseleague\\.org$\n(?:^|\\.)internetfreedom\\.org$\n(?:^|\\.)internetpopculture\\.com$\n(?:^|\\.)inthenameofconfuciusmovie\\.com$\n(?:^|\\.)investigating\\.wordpress\\.com$\n(?:^|\\.)inxian\\.com$\n(?:^|\\.)iownyour\\.biz$\n(?:^|\\.)iownyour\\.org$\n(?:^|\\.)ipalter\\.com$\n(?:^|\\.)ipfire\\.org$\n(?:^|\\.)ipfs\\.io$\n(?:^|\\.)iphone4hongkong\\.com$\n(?:^|\\.)iphonehacks\\.com$\n(?:^|\\.)iphonetaiwan\\.org$\n(?:^|\\.)iphonix\\.fr$\n(?:^|\\.)ipicture\\.ru$\n(?:^|\\.)ipjetable\\.net$\n(?:^|\\.)ipobar\\.com$\n(?:^|\\.)ipoock\\.com$\n(?:^|\\.)iportal\\.me$\n(?:^|\\.)ippotv\\.com$\n(?:^|\\.)ipredator\\.se$\n(?:^|\\.)iptv\\.com\\.tw$\n(?:^|\\.)iptvbin\\.com$\n(?:^|\\.)ipvanish\\.com$\n(?:^|\\.)iredmail\\.org$\n(?:^|\\.)ironbigfools\\.compython\\.net$\n(?:^|\\.)ironpython\\.net$\n(?:^|\\.)ironsocket\\.com$\n(?:^|\\.)is-a-hunter\\.com$\n(?:^|\\.)is\\.gd$\n(?:^|\\.)isaacmao\\.com$\n(?:^|\\.)isasecret\\.com$\n(?:^|\\.)isc\\.sans\\.edu$\n(?:^|\\.)isgreat\\.org$\n(?:^|\\.)islahhaber\\.net$\n(?:^|\\.)islam\\.org\\.hk$\n(?:^|\\.)islamawareness\\.net$\n(?:^|\\.)islamhouse\\.com$\n(?:^|\\.)islamicity\\.com$\n(?:^|\\.)islamicpluralism\\.org$\n(?:^|\\.)islamtoday\\.net$\n(?:^|\\.)ismaelan\\.com$\n(?:^|\\.)ismalltits\\.com$\n(?:^|\\.)ismprofessional\\.net$\n(?:^|\\.)isohunt\\.com$\n(?:^|\\.)israbox\\.com$\n(?:^|\\.)issuu\\.com$\n(?:^|\\.)istars\\.co\\.nz$\n(?:^|\\.)istiqlalhewer\\.com$\n(?:^|\\.)istockphoto\\.com$\n(?:^|\\.)isunaffairs\\.com$\n(?:^|\\.)isuntv\\.com$\n(?:^|\\.)itaboo\\.info$\n(?:^|\\.)itaiwan\\.gov\\.tw$\n(?:^|\\.)italiatibet\\.org$\n(?:^|\\.)itasoftware\\.com$\n(?:^|\\.)itemdb\\.com$\n(?:^|\\.)ithelp\\.ithome\\.com\\.tw$\n(?:^|\\.)its\\.caltech\\.edu$\n(?:^|\\.)itsaol\\.com$\n(?:^|\\.)itshidden\\.com$\n(?:^|\\.)itsky\\.it$\n(?:^|\\.)itweet\\.net$\n(?:^|\\.)iu45\\.com$\n(?:^|\\.)iuhrdf\\.org$\n(?:^|\\.)iuksky\\.com$\n(?:^|\\.)ivacy\\.com$\n(?:^|\\.)iverycd\\.com$\n(?:^|\\.)ivpn\\.net$\n(?:^|\\.)ixquick\\.com$\n(?:^|\\.)ixxx\\.com$\n(?:^|\\.)iyouport\\.com$\n(?:^|\\.)izaobao\\.us$\n(?:^|\\.)izles\\.net$\n(?:^|\\.)izlesem\\.org$\n(?:^|\\.)j\\.mp$\n(?:^|\\.)ja\\.wikipedia\\.org$\n(?:^|\\.)jamaat\\.org$\n(?:^|\\.)jamyangnorbu\\.com$\n(?:^|\\.)jandyx\\.com$\n(?:^|\\.)janwongphoto\\.com$\n(?:^|\\.)japan-whores\\.com$\n(?:^|\\.)japanfirst\\.asianfreeforum\\.com$\n(?:^|\\.)japantimes\\.co\\.jp$\n(?:^|\\.)jav\\.com$\n(?:^|\\.)jav101\\.com$\n(?:^|\\.)jav2be\\.com$\n(?:^|\\.)jav68\\.tv$\n(?:^|\\.)javakiba\\.org$\n(?:^|\\.)javbus\\.com$\n(?:^|\\.)javfor\\.me$\n(?:^|\\.)javhd\\.com$\n(?:^|\\.)javhip\\.com$\n(?:^|\\.)javhub\\.net$\n(?:^|\\.)javhuge\\.com$\n(?:^|\\.)javlibrary\\.com$\n(?:^|\\.)javmobile\\.net$\n(?:^|\\.)javmoo\\.com$\n(?:^|\\.)javmoo\\.xyz$\n(?:^|\\.)javseen\\.com$\n(?:^|\\.)javtag\\.com$\n(?:^|\\.)javzoo\\.com$\n(?:^|\\.)jbtalks\\.cc$\n(?:^|\\.)jbtalks\\.com$\n(?:^|\\.)jbtalks\\.my$\n(?:^|\\.)jcpenney\\.com$\n(?:^|\\.)jdwsy\\.com$\n(?:^|\\.)jeanyim\\.com$\n(?:^|\\.)jetos\\.com$\n(?:^|\\.)jex\\.com$\n(?:^|\\.)jfqu36\\.club$\n(?:^|\\.)jfqu37\\.xyz$\n(?:^|\\.)jgoodies\\.com$\n(?:^|\\.)jiangweiping\\.com$\n(?:^|\\.)jiaoyou8\\.com$\n(?:^|\\.)jiehua\\.cz$\n(?:^|\\.)jieshibaobao\\.com$\n(?:^|\\.)jigglegifs\\.com$\n(?:^|\\.)jigong1024\\.com$\n(?:^|\\.)jihadintel\\.meforum\\.org$\n(?:^|\\.)jihadology\\.net$\n(?:^|\\.)jiji\\.com$\n(?:^|\\.)jims\\.net$\n(?:^|\\.)jinbushe\\.org$\n(?:^|\\.)jingpin\\.org$\n(?:^|\\.)jingsim\\.org$\n(?:^|\\.)jinpianwang\\.com$\n(?:^|\\.)jinroukong\\.com$\n(?:^|\\.)jintian\\.net$\n(?:^|\\.)jinx\\.com$\n(?:^|\\.)jitouch\\.com$\n(?:^|\\.)jizzthis\\.com$\n(?:^|\\.)jjgirls\\.com$\n(?:^|\\.)jkb\\.cc$\n(?:^|\\.)jkforum\\.net$\n(?:^|\\.)jkub\\.com$\n(?:^|\\.)jma\\.go\\.jp$\n(?:^|\\.)jmscult\\.com$\n(?:^|\\.)joachims\\.org$\n(?:^|\\.)jobnewera\\.wordpress\\.com$\n(?:^|\\.)jobso\\.tv$\n(?:^|\\.)joinmastodon\\.org$\n(?:^|\\.)journalchretien\\.net$\n(?:^|\\.)journalofdemocracy\\.org$\n(?:^|\\.)joymiihub\\.com$\n(?:^|\\.)joyourself\\.com$\n(?:^|\\.)jp\\.hao123\\.com$\n(?:^|\\.)jpl\\.nasa\\.gov$\n(?:^|\\.)jpopforum\\.net$\n(?:^|\\.)jtvnw\\.net$\n(?:^|\\.)jubushoushen\\.com$\n(?:^|\\.)juhuaren\\.com$\n(?:^|\\.)jukujo-club\\.com$\n(?:^|\\.)juliepost\\.com$\n(?:^|\\.)juliereyc\\.com$\n(?:^|\\.)junauza\\.com$\n(?:^|\\.)june4commemoration\\.org$\n(?:^|\\.)junefourth-20\\.net$\n(?:^|\\.)jungleheart\\.com$\n(?:^|\\.)juoaa\\.com$\n(?:^|\\.)justdied\\.com$\n(?:^|\\.)justfreevpn\\.com$\n(?:^|\\.)justicefortenzin\\.org$\n(?:^|\\.)justpaste\\.it$\n(?:^|\\.)justtristan\\.com$\n(?:^|\\.)juyuange\\.org$\n(?:^|\\.)juziyue\\.com$\n(?:^|\\.)jwmusic\\.org$\n(?:^|\\.)jyxf\\.net$\n(?:^|\\.)k-doujin\\.net$\n(?:^|\\.)ka-wai\\.com$\n(?:^|\\.)kagyu\\.org$\n(?:^|\\.)kagyu\\.org\\.za$\n(?:^|\\.)kagyumonlam\\.org$\n(?:^|\\.)kagyunews\\.com\\.hk$\n(?:^|\\.)kagyuoffice\\.org$\n(?:^|\\.)kagyuoffice\\.org\\.tw$\n(?:^|\\.)kaiyuan\\.de$\n(?:^|\\.)kakao\\.com$\n(?:^|\\.)kalachakralugano\\.org$\n(?:^|\\.)kankan\\.today$\n(?:^|\\.)kannewyork\\.com$\n(?:^|\\.)kanshifang\\.com$\n(?:^|\\.)kantie\\.org$\n(?:^|\\.)kanzhongguo\\.com$\n(?:^|\\.)kanzhongguo\\.eu$\n(?:^|\\.)kaotic\\.com$\n(?:^|\\.)karayou\\.com$\n(?:^|\\.)karkhung\\.com$\n(?:^|\\.)karmapa-teachings\\.org$\n(?:^|\\.)karmapa\\.org$\n(?:^|\\.)kawaiikawaii\\.jp$\n(?:^|\\.)kawase\\.com$\n(?:^|\\.)kb\\.monitorware\\.com$\n(?:^|\\.)kba-tx\\.org$\n(?:^|\\.)kcoolonline\\.com$\n(?:^|\\.)kebrum\\.com$\n(?:^|\\.)kechara\\.com$\n(?:^|\\.)keepandshare\\.com$\n(?:^|\\.)keezmovies\\.com$\n(?:^|\\.)kendatire\\.com$\n(?:^|\\.)kendincos\\.net$\n(?:^|\\.)kenengba\\.com$\n(?:^|\\.)keontech\\.net$\n(?:^|\\.)kepard\\.com$\n(?:^|\\.)kex\\.com$\n(?:^|\\.)keycdn\\.com$\n(?:^|\\.)khabdha\\.org$\n(?:^|\\.)khatrimaza\\.org$\n(?:^|\\.)khmusic\\.com\\.tw$\n(?:^|\\.)kichiku-doujinko\\.com$\n(?:^|\\.)kik\\.com$\n(?:^|\\.)killwall\\.com$\n(?:^|\\.)kindleren\\.com$\n(?:^|\\.)kineox\\.free\\.fr$\n(?:^|\\.)kingdomsalvation\\.org$\n(?:^|\\.)kinghost\\.com$\n(?:^|\\.)kingstone\\.com\\.tw$\n(?:^|\\.)kink\\.com$\n(?:^|\\.)kinmen\\.org\\.tw$\n(?:^|\\.)kinmen\\.travel$\n(?:^|\\.)kinokuniya\\.com$\n(?:^|\\.)kir\\.jp$\n(?:^|\\.)kissbbao\\.cn$\n(?:^|\\.)kiwi\\.kz$\n(?:^|\\.)kk-whys\\.co\\.jp$\n(?:^|\\.)kkbox\\.com$\n(?:^|\\.)kknews\\.cc$\n(?:^|\\.)kmuh\\.org\\.tw$\n(?:^|\\.)knowledgerush\\.com$\n(?:^|\\.)kobo\\.com$\n(?:^|\\.)kobobooks\\.com$\n(?:^|\\.)kodingen\\.com$\n(?:^|\\.)kompozer\\.net$\n(?:^|\\.)konachan\\.com$\n(?:^|\\.)kone\\.com$\n(?:^|\\.)koolsolutions\\.com$\n(?:^|\\.)koornk\\.com$\n(?:^|\\.)koranmandarin\\.com$\n(?:^|\\.)korenan2\\.com$\n(?:^|\\.)ksdl\\.org$\n(?:^|\\.)ksnews\\.com\\.tw$\n(?:^|\\.)kspcoin\\.com$\n(?:^|\\.)ktzhk\\.com$\n(?:^|\\.)kucoin\\.com$\n(?:^|\\.)kui\\.name$\n(?:^|\\.)kun\\.im$\n(?:^|\\.)kurashsultan\\.com$\n(?:^|\\.)kurtmunger\\.com$\n(?:^|\\.)kusocity\\.com$\n(?:^|\\.)kwcg\\.ca$\n(?:^|\\.)kwongwah\\.com\\.my$\n(?:^|\\.)kxsw\\.life$\n(?:^|\\.)kyofun\\.com$\n(?:^|\\.)kyohk\\.net$\n(?:^|\\.)kyoyue\\.com$\n(?:^|\\.)kyzyhello\\.com$\n(?:^|\\.)kzeng\\.info$\n(?:^|\\.)la-forum\\.org$\n(?:^|\\.)labiennale\\.org$\n(?:^|\\.)ladbrokes\\.com$\n(?:^|\\.)lagranepoca\\.com$\n(?:^|\\.)lalulalu\\.com$\n(?:^|\\.)lama\\.com\\.tw$\n(?:^|\\.)lamayeshe\\.com$\n(?:^|\\.)lamnia\\.co\\.uk$\n(?:^|\\.)lamrim\\.com$\n(?:^|\\.)lanterncn\\.cn$\n(?:^|\\.)lantosfoundation\\.org$\n(?:^|\\.)laod\\.cn$\n(?:^|\\.)laogai\\.org$\n(?:^|\\.)laomiu\\.com$\n(?:^|\\.)laoyang\\.info$\n(?:^|\\.)laptoplockdown\\.com$\n(?:^|\\.)laqingdan\\.net$\n(?:^|\\.)larsgeorge\\.com$\n(?:^|\\.)lastcombat\\.com$\n(?:^|\\.)lastfm\\.es$\n(?:^|\\.)latelinenews\\.com$\n(?:^|\\.)latibet\\.org$\n(?:^|\\.)lbank\\.info$\n(?:^|\\.)ld\\.hao123img\\.com$\n(?:^|\\.)le-vpn\\.com$\n(?:^|\\.)leafyvpn\\.net$\n(?:^|\\.)lecloud\\.net$\n(?:^|\\.)leeao\\.com\\.cn$\n(?:^|\\.)lefora\\.com$\n(?:^|\\.)left21\\.hk$\n(?:^|\\.)legalporno\\.com$\n(?:^|\\.)legaltech\\.law\\.com$\n(?:^|\\.)legsjapan\\.com$\n(?:^|\\.)leirentv\\.ca$\n(?:^|\\.)leisurecafe\\.ca$\n(?:^|\\.)leisurepro\\.com$\n(?:^|\\.)lematin\\.ch$\n(?:^|\\.)lemonde\\.fr$\n(?:^|\\.)lenwhite\\.com$\n(?:^|\\.)lerosua\\.org$\n(?:^|\\.)lers\\.google$\n(?:^|\\.)lesoir\\.be$\n(?:^|\\.)letou\\.com$\n(?:^|\\.)letscorp\\.net$\n(?:^|\\.)lflink\\.com$\n(?:^|\\.)lflinkup\\.com$\n(?:^|\\.)lflinkup\\.net$\n(?:^|\\.)lflinkup\\.org$\n(?:^|\\.)lhakar\\.org$\n(?:^|\\.)lhasocialwork\\.org$\n(?:^|\\.)liangyou\\.net$\n(?:^|\\.)liangzhichuanmei\\.com$\n(?:^|\\.)lianyue\\.net$\n(?:^|\\.)liaowangxizang\\.net$\n(?:^|\\.)liberal\\.org\\.hk$\n(?:^|\\.)libertytimes\\.com\\.tw$\n(?:^|\\.)library\\.usc\\.cuhk\\.edu\\.hk$\n(?:^|\\.)lidecheng\\.com$\n(?:^|\\.)lifemiles\\.com$\n(?:^|\\.)lighten\\.org\\.tw$\n(?:^|\\.)lighti\\.me$\n(?:^|\\.)lightnovel\\.cn$\n(?:^|\\.)lihkg\\.com$\n(?:^|\\.)like\\.com$\n(?:^|\\.)limiao\\.net$\n(?:^|\\.)line-apps\\.com$\n(?:^|\\.)line-scdn\\.net$\n(?:^|\\.)line\\.me$\n(?:^|\\.)line\\.naver\\.jp$\n(?:^|\\.)linear-abematv\\.akamaized\\.net$\n(?:^|\\.)linglingfa\\.com$\n(?:^|\\.)lingvodics\\.com$\n(?:^|\\.)linkedin\\.com$\n(?:^|\\.)link-o-rama\\.com$\n(?:^|\\.)linkideo\\.com$\n(?:^|\\.)linkuswell\\.com$\n(?:^|\\.)linux\\.org\\.hk$\n(?:^|\\.)linuxtoy\\.org$\n(?:^|\\.)lionsroar\\.com$\n(?:^|\\.)lipuman\\.com$\n(?:^|\\.)liquidvpn\\.com$\n(?:^|\\.)listentoyoutube\\.com$\n(?:^|\\.)listorious\\.com$\n(?:^|\\.)lists\\.w3\\.org$\n(?:^|\\.)liu-xiaobo\\.org$\n(?:^|\\.)liudejun\\.com$\n(?:^|\\.)liuhanyu\\.com$\n(?:^|\\.)liujianshu\\.com$\n(?:^|\\.)liuxiaobo\\.net$\n(?:^|\\.)liuxiaotong\\.com$\n(?:^|\\.)livecoin\\.net$\n(?:^|\\.)livedoor\\.jp$\n(?:^|\\.)liveleak\\.com$\n(?:^|\\.)livestation\\.com$\n(?:^|\\.)livestream\\.com$\n(?:^|\\.)livevideo\\.com$\n(?:^|\\.)livingonline\\.us$\n(?:^|\\.)livingstream\\.com$\n(?:^|\\.)liwangyang\\.com$\n(?:^|\\.)lizhizhuangbi\\.com$\n(?:^|\\.)lkcn\\.net$\n(?:^|\\.)llss\\.me$\n(?:^|\\.)load\\.to$\n(?:^|\\.)lobsangwangyal\\.com$\n(?:^|\\.)localbitcoins\\.com$\n(?:^|\\.)localdomain\\.ws$\n(?:^|\\.)localpresshk\\.com$\n(?:^|\\.)lockestek\\.com$\n(?:^|\\.)logbot\\.net$\n(?:^|\\.)login\\.target\\.com$\n(?:^|\\.)logiqx\\.com$\n(?:^|\\.)londonchinese\\.ca$\n(?:^|\\.)longhair\\.hk$\n(?:^|\\.)longmusic\\.com$\n(?:^|\\.)longtermly\\.net$\n(?:^|\\.)longtoes\\.com$\n(?:^|\\.)lookpic\\.com$\n(?:^|\\.)looktoronto\\.com$\n(?:^|\\.)lotsawahouse\\.org$\n(?:^|\\.)lotuslight\\.org\\.hk$\n(?:^|\\.)lotuslight\\.org\\.tw$\n(?:^|\\.)lovetvshow\\.com$\n(?:^|\\.)lpsg\\.com$\n(?:^|\\.)lrfz\\.com$\n(?:^|\\.)lrip\\.org$\n(?:^|\\.)lsd\\.org\\.hk$\n(?:^|\\.)lsforum\\.net$\n(?:^|\\.)lsm\\.org$\n(?:^|\\.)lsmchinese\\.org$\n(?:^|\\.)lsmkorean\\.org$\n(?:^|\\.)lsmradio\\.com$\n(?:^|\\.)lsmwebcast\\.com$\n(?:^|\\.)lsxszzg\\.com$\n(?:^|\\.)ltn\\.com\\.tw$\n(?:^|\\.)luke54\\.com$\n(?:^|\\.)luke54\\.org$\n(?:^|\\.)lupm\\.org$\n(?:^|\\.)lushstories\\.com$\n(?:^|\\.)luxebc\\.com$\n(?:^|\\.)lvhai\\.org$\n(?:^|\\.)lvv2\\.com$\n(?:^|\\.)lyfhk\\.net$\n(?:^|\\.)lzmtnews\\.org$\n(?:^|\\.)m\\.hkgalden\\.com$\n(?:^|\\.)m\\.me$\n(?:^|\\.)m\\.plixi\\.com$\n(?:^|\\.)m\\.slandr\\.net$\n(?:^|\\.)ma\\.hao123\\.com$\n(?:^|\\.)macgamestore\\.com$\n(?:^|\\.)macrovpn\\.com$\n(?:^|\\.)macts\\.com\\.tw$\n(?:^|\\.)mad-ar\\.ch$\n(?:^|\\.)madewithcode\\.com$\n(?:^|\\.)madonna-av\\.com$\n(?:^|\\.)madrau\\.com$\n(?:^|\\.)madthumbs\\.com$\n(?:^|\\.)magazines\\.sina\\.com\\.tw$\n(?:^|\\.)magic-net\\.info$\n(?:^|\\.)mahabodhi\\.org$\n(?:^|\\.)maiio\\.net$\n(?:^|\\.)mail-archive\\.com$\n(?:^|\\.)maildns\\.xyz$\n(?:^|\\.)maiplus\\.com$\n(?:^|\\.)maizhong\\.org$\n(?:^|\\.)makemymood\\.com$\n(?:^|\\.)makkahnewspaper\\.com$\n(?:^|\\.)makzhou\\.warehouse333\\.com$\n(?:^|\\.)malaysiakini\\.com$\n(?:^|\\.)mamingzhe\\.com$\n(?:^|\\.)manchukuo\\.net$\n(?:^|\\.)mangafox\\.com$\n(?:^|\\.)mangafox\\.me$\n(?:^|\\.)maniash\\.com$\n(?:^|\\.)manicur4ik\\.ru$\n(?:^|\\.)mansion\\.com$\n(?:^|\\.)mansionpoker\\.com$\n(?:^|\\.)manta\\.com$\n(?:^|\\.)maplew\\.com$\n(?:^|\\.)marc\\.info$\n(?:^|\\.)marguerite\\.su$\n(?:^|\\.)martau\\.com$\n(?:^|\\.)martincartoons\\.com$\n(?:^|\\.)martsangkagyuofficial\\.org$\n(?:^|\\.)maruta\\.be$\n(?:^|\\.)marxist\\.com$\n(?:^|\\.)marxist\\.net$\n(?:^|\\.)marxists\\.org$\n(?:^|\\.)mash\\.to$\n(?:^|\\.)maskedip\\.com$\n(?:^|\\.)mastodon\\.cloud$\n(?:^|\\.)mastodon\\.host$\n(?:^|\\.)mastodon\\.social$\n(?:^|\\.)matainja\\.com$\n(?:^|\\.)material\\.io$\n(?:^|\\.)mathable\\.io$\n(?:^|\\.)mathiew-badimon\\.com$\n(?:^|\\.)matome-plus\\.com$\n(?:^|\\.)matome-plus\\.net$\n(?:^|\\.)matsushimakaede\\.com$\n(?:^|\\.)matters\\.news$\n(?:^|\\.)mattwilcox\\.net$\n(?:^|\\.)maturejp\\.com$\n(?:^|\\.)maxing\\.jp$\n(?:^|\\.)mayimayi\\.com$\n(?:^|\\.)mcadforums\\.com$\n(?:^|\\.)mcaf\\.ee$\n(?:^|\\.)mcfog\\.com$\n(?:^|\\.)mcreasite\\.com$\n(?:^|\\.)md-t\\.org$\n(?:^|\\.)me\\.me$\n(?:^|\\.)me\\.youthwant\\.com\\.tw$\n(?:^|\\.)meansys\\.com$\n(?:^|\\.)media\\.nu\\.nl$\n(?:^|\\.)media\\.org\\.hk$\n(?:^|\\.)mediachinese\\.com$\n(?:^|\\.)mediafire\\.com$\n(?:^|\\.)mediafreakcity\\.com$\n(?:^|\\.)medium\\.com$\n(?:^|\\.)meetav\\.com$\n(?:^|\\.)meetup\\.com$\n(?:^|\\.)mefeedia\\.com$\n(?:^|\\.)mefound\\.com$\n(?:^|\\.)mega\\.nz$\n(?:^|\\.)megaproxy\\.com$\n(?:^|\\.)megarotic\\.com$\n(?:^|\\.)megavideo\\.com$\n(?:^|\\.)megurineluka\\.com$\n(?:^|\\.)meirixiaochao\\.com$\n(?:^|\\.)meltoday\\.com$\n(?:^|\\.)meme\\.yahoo\\.com$\n(?:^|\\.)memehk\\.com$\n(?:^|\\.)memorybbs\\.com$\n(?:^|\\.)memri\\.org$\n(?:^|\\.)memrijttm\\.org$\n(?:^|\\.)mercatox\\.com$\n(?:^|\\.)mercyprophet\\.org$\n(?:^|\\.)mergersandinquisitions\\.org$\n(?:^|\\.)meridian-trust\\.org$\n(?:^|\\.)meripet\\.biz$\n(?:^|\\.)meripet\\.com$\n(?:^|\\.)merit-times\\.com\\.tw$\n(?:^|\\.)meshrep\\.com$\n(?:^|\\.)mesotw\\.com$\n(?:^|\\.)messenger\\.com$\n(?:^|\\.)metacafe\\.com$\n(?:^|\\.)metart\\.com$\n(?:^|\\.)metarthunter\\.com$\n(?:^|\\.)meteorshowersonline\\.com$\n(?:^|\\.)metrohk\\.com\\.hk$\n(?:^|\\.)metrolife\\.ca$\n(?:^|\\.)metroradio\\.com\\.hk$\n(?:^|\\.)meyou\\.jp$\n(?:^|\\.)meyul\\.com$\n(?:^|\\.)mfxmedia\\.com$\n(?:^|\\.)mgoon\\.com$\n(?:^|\\.)mgstage\\.com$\n(?:^|\\.)mh4u\\.org$\n(?:^|\\.)mhradio\\.org$\n(?:^|\\.)michaelanti\\.com$\n(?:^|\\.)michaelmarketl\\.com$\n(?:^|\\.)microvpn\\.com$\n(?:^|\\.)middle-way\\.net$\n(?:^|\\.)mihk\\.hk$\n(?:^|\\.)mihr\\.com$\n(?:^|\\.)mihua\\.org$\n(?:^|\\.)mike\\.cz\\.cc$\n(?:^|\\.)mikesoltys\\.com$\n(?:^|\\.)milph\\.net$\n(?:^|\\.)milsurps\\.com$\n(?:^|\\.)mimiai\\.net$\n(?:^|\\.)mimivip\\.com$\n(?:^|\\.)mimivv\\.com$\n(?:^|\\.)mindrolling\\.org$\n(?:^|\\.)minghui-a\\.org$\n(?:^|\\.)minghui-b\\.org$\n(?:^|\\.)minghui-school\\.org$\n(?:^|\\.)minghui\\.or\\.kr$\n(?:^|\\.)minghui\\.org$\n(?:^|\\.)minghuiyw\\.wordpress\\.com$\n(?:^|\\.)mingjinglishi\\.com$\n(?:^|\\.)mingjingnews\\.com$\n(?:^|\\.)mingjingtimes\\.com$\n(?:^|\\.)mingpao\\.com$\n(?:^|\\.)mingpaocanada\\.com$\n(?:^|\\.)mingpaomonthly\\.com$\n(?:^|\\.)mingpaonews\\.com$\n(?:^|\\.)mingpaony\\.com$\n(?:^|\\.)mingpaosf\\.com$\n(?:^|\\.)mingpaotor\\.com$\n(?:^|\\.)mingpaovan\\.com$\n(?:^|\\.)mingshengbao\\.com$\n(?:^|\\.)minhhue\\.net$\n(?:^|\\.)miniforum\\.org$\n(?:^|\\.)ministrybooks\\.org$\n(?:^|\\.)minzhuhua\\.net$\n(?:^|\\.)minzhuzhanxian\\.com$\n(?:^|\\.)minzhuzhongguo\\.org$\n(?:^|\\.)miroguide\\.com$\n(?:^|\\.)mirrorbooks\\.com$\n(?:^|\\.)mist\\.vip$\n(?:^|\\.)mitao\\.com\\.tw$\n(?:^|\\.)mitbbs\\.com$\n(?:^|\\.)mitbbsau\\.com$\n(?:^|\\.)mixero\\.com$\n(?:^|\\.)mixpod\\.com$\n(?:^|\\.)mixx\\.com$\n(?:^|\\.)mizzmona\\.com$\n(?:^|\\.)mjib\\.gov\\.tw$\n(?:^|\\.)mjlsh\\.usc\\.cuhk\\.edu\\.hk$\n(?:^|\\.)mk5000\\.com$\n(?:^|\\.)mlcool\\.com$\n(?:^|\\.)mlzs\\.work$\n(?:^|\\.)mm-cg\\.com$\n(?:^|\\.)mmaaxx\\.com$\n(?:^|\\.)mmmca\\.com$\n(?:^|\\.)mnewstv\\.com$\n(?:^|\\.)mo\\.nightlife141\\.com$\n(?:^|\\.)mobatek\\.net$\n(?:^|\\.)mobile01\\.com$\n(?:^|\\.)mobileways\\.de$\n(?:^|\\.)moby\\.to$\n(?:^|\\.)mobypicture\\.com$\n(?:^|\\.)moeaic\\.gov\\.tw$\n(?:^|\\.)moeerolibrary\\.com$\n(?:^|\\.)mofa\\.gov\\.tw$\n(?:^|\\.)mofaxiehui\\.com$\n(?:^|\\.)mofos\\.com$\n(?:^|\\.)mog\\.com$\n(?:^|\\.)mohu\\.club$\n(?:^|\\.)mohu\\.ml$\n(?:^|\\.)mojim\\.com$\n(?:^|\\.)mol\\.gov\\.tw$\n(?:^|\\.)molihua\\.org$\n(?:^|\\.)mondex\\.org$\n(?:^|\\.)money-link\\.com\\.tw$\n(?:^|\\.)moneyhome\\.biz$\n(?:^|\\.)monitorchina\\.org$\n(?:^|\\.)monster\\.com$\n(?:^|\\.)moodyz\\.com$\n(?:^|\\.)moonbbs\\.com$\n(?:^|\\.)moonbingo\\.com$\n(?:^|\\.)morningsun\\.org$\n(?:^|\\.)moroneta\\.com$\n(?:^|\\.)mos\\.ru$\n(?:^|\\.)motherless\\.com$\n(?:^|\\.)motiyun\\.com$\n(?:^|\\.)motor4ik\\.ru$\n(?:^|\\.)mousebreaker\\.com$\n(?:^|\\.)movements\\.org$\n(?:^|\\.)moviefap\\.com$\n(?:^|\\.)mp3buscador\\.com$\n(?:^|\\.)mp3ye\\.eu$\n(?:^|\\.)mpettis\\.com$\n(?:^|\\.)mpfinance\\.com$\n(?:^|\\.)mpinews\\.com$\n(?:^|\\.)mponline\\.hk$\n(?:^|\\.)mqxd\\.org$\n(?:^|\\.)mrbasic\\.com$\n(?:^|\\.)mrbonus\\.com$\n(?:^|\\.)mrface\\.com$\n(?:^|\\.)mrslove\\.com$\n(?:^|\\.)mrtweet\\.com$\n(?:^|\\.)msa-it\\.org$\n(?:^|\\.)msguancha\\.com$\n(?:^|\\.)msha\\.gov$\n(?:^|\\.)mswe1\\.org$\n(?:^|\\.)mthruf\\.com$\n(?:^|\\.)mtw\\.tl$\n(?:^|\\.)muchosucko\\.com$\n(?:^|\\.)mullvad\\.net$\n(?:^|\\.)multiply\\.com$\n(?:^|\\.)multiproxy\\.org$\n(?:^|\\.)multiupload\\.com$\n(?:^|\\.)mummysgold\\.com$\n(?:^|\\.)murmur\\.tw$\n(?:^|\\.)musicade\\.net$\n(?:^|\\.)muslimvideo\\.com$\n(?:^|\\.)muzi\\.com$\n(?:^|\\.)muzi\\.net$\n(?:^|\\.)muzu\\.tv$\n(?:^|\\.)mvdis\\.gov\\.tw$\n(?:^|\\.)mvg\\.jp$\n(?:^|\\.)mx\\.hao123\\.com$\n(?:^|\\.)mx981\\.com$\n(?:^|\\.)my-formosa\\.com$\n(?:^|\\.)my-private-network\\.co\\.uk$\n(?:^|\\.)my-proxy\\.com$\n(?:^|\\.)my\\.mail\\.ru$\n(?:^|\\.)my\\.opera\\.com$\n(?:^|\\.)my\\.pcloud\\.com$\n(?:^|\\.)my03\\.com$\n(?:^|\\.)myactimes\\.com$\n(?:^|\\.)myanniu\\.com$\n(?:^|\\.)myaudiocast\\.com$\n(?:^|\\.)myav\\.com\\.tw$\n(?:^|\\.)mybbs\\.us$\n(?:^|\\.)mybet\\.com$\n(?:^|\\.)myca168\\.com$\n(?:^|\\.)mycanadanow\\.com$\n(?:^|\\.)mychinamyhome\\.com$\n(?:^|\\.)mychinanet\\.com$\n(?:^|\\.)mychinanews\\.com$\n(?:^|\\.)mychinese\\.news$\n(?:^|\\.)mycnnews\\.com$\n(?:^|\\.)mycould\\.com$\n(?:^|\\.)mydad\\.info$\n(?:^|\\.)myddns\\.com$\n(?:^|\\.)myeasytv\\.com$\n(?:^|\\.)myeclipseide\\.com$\n(?:^|\\.)myforum\\.com\\.hk$\n(?:^|\\.)myforum\\.com\\.uk$\n(?:^|\\.)myfreecams\\.com$\n(?:^|\\.)myfreepaysite\\.com$\n(?:^|\\.)myfreshnet\\.com$\n(?:^|\\.)myftp\\.info$\n(?:^|\\.)myftp\\.name$\n(?:^|\\.)myiphide\\.com$\n(?:^|\\.)mykomica\\.org$\n(?:^|\\.)mylftv\\.com$\n(?:^|\\.)mymediarom\\.com$\n(?:^|\\.)mymoe\\.moe$\n(?:^|\\.)mymom\\.info$\n(?:^|\\.)mymusic\\.net\\.tw$\n(?:^|\\.)mynetav\\.net$\n(?:^|\\.)mynetav\\.org$\n(?:^|\\.)mynumber\\.org$\n(?:^|\\.)myparagliding\\.com$\n(?:^|\\.)mypicture\\.info$\n(?:^|\\.)mypop3\\.net$\n(?:^|\\.)mypop3\\.org$\n(?:^|\\.)mypopescu\\.com$\n(?:^|\\.)myradio\\.hk$\n(?:^|\\.)myreadingmanga\\.info$\n(?:^|\\.)mysecondarydns\\.com$\n(?:^|\\.)myshare\\.url\\.com\\.tw$\n(?:^|\\.)mysinablog\\.com$\n(?:^|\\.)mysite\\.verizon\\.net$\n(?:^|\\.)myspace\\.com$\n(?:^|\\.)myspacecdn\\.com$\n(?:^|\\.)mytalkbox\\.com$\n(?:^|\\.)mytizi\\.com$\n(?:^|\\.)mywww\\.biz$\n(?:^|\\.)myz\\.info$\n(?:^|\\.)naacoalition\\.org$\n(?:^|\\.)naitik\\.net$\n(?:^|\\.)nakido\\.com$\n(?:^|\\.)nakuz\\.com$\n(?:^|\\.)nalandabodhi\\.org$\n(?:^|\\.)nalandawest\\.org$\n(?:^|\\.)namgyal\\.org$\n(?:^|\\.)namgyalmonastery\\.org$\n(?:^|\\.)namsisi\\.com$\n(?:^|\\.)nanyang\\.com$\n(?:^|\\.)nanyangpost\\.com$\n(?:^|\\.)nanzao\\.com$\n(?:^|\\.)naol\\.ca$\n(?:^|\\.)naol\\.cc$\n(?:^|\\.)nat\\.gov\\.tw$\n(?:^|\\.)nat\\.moe$\n(?:^|\\.)national-lottery\\.co\\.uk$\n(?:^|\\.)nationsonline\\.org$\n(?:^|\\.)nationwide\\.com$\n(?:^|\\.)naughtyamerica\\.com$\n(?:^|\\.)navyfamily\\.navy\\.mil$\n(?:^|\\.)navyreserve\\.navy\\.mil$\n(?:^|\\.)naweeklytimes\\.com$\n(?:^|\\.)nbtvpn\\.com$\n(?:^|\\.)nccwatch\\.org\\.tw$\n(?:^|\\.)nch\\.com\\.tw$\n(?:^|\\.)ncn\\.org$\n(?:^|\\.)nde\\.de$\n(?:^|\\.)ndr\\.de$\n(?:^|\\.)ned\\.org$\n(?:^|\\.)nekoslovakia\\.net$\n(?:^|\\.)nemesis2\\.qx\\.net$\n(?:^|\\.)neo-miracle\\.com$\n(?:^|\\.)nepusoku\\.com$\n(?:^|\\.)net-fits\\.pro$\n(?:^|\\.)netbirds\\.com$\n(?:^|\\.)netcolony\\.com$\n(?:^|\\.)netflix\\.com$\n(?:^|\\.)netme\\.cc$\n(?:^|\\.)netsneak\\.com$\n(?:^|\\.)network54\\.com$\n(?:^|\\.)networkedblogs\\.com$\n(?:^|\\.)networktunnel\\.net$\n(?:^|\\.)neverforget8964\\.org$\n(?:^|\\.)new-3lunch\\.net$\n(?:^|\\.)new-akiba\\.com$\n(?:^|\\.)new96\\.ca$\n(?:^|\\.)newcenturymc\\.com$\n(?:^|\\.)newcenturynews\\.com$\n(?:^|\\.)newchen\\.com$\n(?:^|\\.)newgrounds\\.com$\n(?:^|\\.)newipnow\\.com$\n(?:^|\\.)newlandmagazine\\.com\\.au$\n(?:^|\\.)newnews\\.ca$\n(?:^|\\.)news\\.cnyes\\.com$\n(?:^|\\.)news\\.hk\\.msn\\.com$\n(?:^|\\.)news\\.hkpeanut\\.com$\n(?:^|\\.)news\\.msn\\.com\\.tw$\n(?:^|\\.)news\\.nationalgeographic\\.com$\n(?:^|\\.)news\\.now\\.com$\n(?:^|\\.)news\\.now\\.com%2fhome$\n(?:^|\\.)news\\.omy\\.sg$\n(?:^|\\.)news\\.seehua\\.com$\n(?:^|\\.)news\\.sina\\.com\\.hk$\n(?:^|\\.)news\\.sina\\.com\\.tw$\n(?:^|\\.)news\\.sinchew\\.com\\.my$\n(?:^|\\.)news\\.singtao\\.ca$\n(?:^|\\.)news\\.tvb\\.com$\n(?:^|\\.)news\\.tvbs\\.com\\.tw$\n(?:^|\\.)news\\.yahoo\\.com$\n(?:^|\\.)news100\\.com\\.tw$\n(?:^|\\.)newsancai\\.com$\n(?:^|\\.)newschinacomment\\.org$\n(?:^|\\.)newscn\\.org$\n(?:^|\\.)newsdetox\\.ca$\n(?:^|\\.)newsdh\\.com$\n(?:^|\\.)newspeak\\.cc$\n(?:^|\\.)newstamago\\.com$\n(?:^|\\.)newstapa\\.org$\n(?:^|\\.)newstarnet\\.com$\n(?:^|\\.)newtaiwan\\.com\\.tw$\n(?:^|\\.)newtalk\\.tw$\n(?:^|\\.)newyorktimes\\.com$\n(?:^|\\.)nexon\\.com$\n(?:^|\\.)next11\\.co\\.jp$\n(?:^|\\.)nextmag\\.com\\.tw$\n(?:^|\\.)nextmedia\\.com$\n(?:^|\\.)nexton-net\\.jp$\n(?:^|\\.)nexttv\\.com\\.tw$\n(?:^|\\.)nf\\.id\\.au$\n(?:^|\\.)nfjtyd\\.com$\n(?:^|\\.)nflxext\\.com$\n(?:^|\\.)nflximg\\.com$\n(?:^|\\.)nflximg\\.net$\n(?:^|\\.)nflxso\\.net$\n(?:^|\\.)nflxvideo\\.net$\n(?:^|\\.)nga\\.mil$\n(?:^|\\.)ngensis\\.com$\n(?:^|\\.)nhentai\\.net$\n(?:^|\\.)nhi\\.gov\\.tw$\n(?:^|\\.)nhk-ondemand\\.jp$\n(?:^|\\.)nic\\.cz\\.cc$\n(?:^|\\.)nic\\.google$\n(?:^|\\.)nic\\.gov$\n(?:^|\\.)nicovideo\\.jp$\n(?:^|\\.)nighost\\.org$\n(?:^|\\.)nikkei\\.com$\n(?:^|\\.)ninecommentaries\\.com$\n(?:^|\\.)ninjacloak\\.com$\n(?:^|\\.)ninjaproxy\\.ninja$\n(?:^|\\.)nintendium\\.com$\n(?:^|\\.)ninth\\.biz$\n(?:^|\\.)niu\\.moe$\n(?:^|\\.)niusnews\\.com$\n(?:^|\\.)njactb\\.org$\n(?:^|\\.)njuice\\.com$\n(?:^|\\.)nko\\.navy\\.mil$\n(?:^|\\.)nlfreevpn\\.com$\n(?:^|\\.)no-ip\\.org$\n(?:^|\\.)nobel\\.se$\n(?:^|\\.)nobelprize\\.org$\n(?:^|\\.)nobodycanstop\\.us$\n(?:^|\\.)nofile\\.io$\n(?:^|\\.)nokogiri\\.org$\n(?:^|\\.)nokola\\.com$\n(?:^|\\.)noodlevpn\\.com$\n(?:^|\\.)norbulingka\\.org$\n(?:^|\\.)nordstrom\\.com$\n(?:^|\\.)nordstromimage\\.com$\n(?:^|\\.)nordstromrack\\.com$\n(?:^|\\.)nordvpn\\.com$\n(?:^|\\.)notify\\.dropboxapi\\.com$\n(?:^|\\.)nottinghampost\\.com$\n(?:^|\\.)novelasia\\.com$\n(?:^|\\.)now\\.com$\n(?:^|\\.)now\\.im$\n(?:^|\\.)nownews\\.com$\n(?:^|\\.)nowtorrents\\.com$\n(?:^|\\.)noypf\\.com$\n(?:^|\\.)npa\\.go\\.jp$\n(?:^|\\.)npa\\.gov\\.tw$\n(?:^|\\.)npnt\\.me$\n(?:^|\\.)nps\\.gov$\n(?:^|\\.)npsboost\\.com$\n(?:^|\\.)nradio\\.me$\n(?:^|\\.)nrk\\.no$\n(?:^|\\.)ns01\\.biz$\n(?:^|\\.)ns01\\.info$\n(?:^|\\.)ns01\\.us$\n(?:^|\\.)ns02\\.biz$\n(?:^|\\.)ns02\\.info$\n(?:^|\\.)ns02\\.us$\n(?:^|\\.)ns1\\.name$\n(?:^|\\.)ns2\\.name$\n(?:^|\\.)ns3\\.name$\n(?:^|\\.)nsc\\.gov\\.tw$\n(?:^|\\.)ntbk\\.gov\\.tw$\n(?:^|\\.)ntbna\\.gov\\.tw$\n(?:^|\\.)ntbt\\.gov\\.tw$\n(?:^|\\.)ntd\\.tv$\n(?:^|\\.)ntdtv\\.ca$\n(?:^|\\.)ntdtv\\.co\\.kr$\n(?:^|\\.)ntdtv\\.com$\n(?:^|\\.)ntdtv\\.cz$\n(?:^|\\.)ntdtv\\.org$\n(?:^|\\.)ntdtv\\.ru$\n(?:^|\\.)ntdtvla\\.com$\n(?:^|\\.)ntrfun\\.com$\n(?:^|\\.)ntsna\\.gov\\.tw$\n(?:^|\\.)nubiles\\.net$\n(?:^|\\.)nuexpo\\.com$\n(?:^|\\.)nukistream\\.com$\n(?:^|\\.)nurgo-software\\.com$\n(?:^|\\.)nusatrip\\.com$\n(?:^|\\.)nutaku\\.net$\n(?:^|\\.)nuuvem\\.com$\n(?:^|\\.)nuvid\\.com$\n(?:^|\\.)nuzcom\\.com$\n(?:^|\\.)nvdst\\.com$\n(?:^|\\.)nvquan\\.org$\n(?:^|\\.)nvtongzhisheng\\.org$\n(?:^|\\.)nwtca\\.org$\n(?:^|\\.)ny\\.stgloballink\\.com$\n(?:^|\\.)ny\\.visiontimes\\.com$\n(?:^|\\.)nyaa\\.eu$\n(?:^|\\.)nydus\\.ca$\n(?:^|\\.)nylon-angel\\.com$\n(?:^|\\.)nylonstockingsonline\\.com$\n(?:^|\\.)nyt\\.com$\n(?:^|\\.)nytchina\\.com$\n(?:^|\\.)nytcn\\.me$\n(?:^|\\.)nytco\\.com$\n(?:^|\\.)nyti\\.ms$\n(?:^|\\.)nytimes\\.com$\n(?:^|\\.)nytimes\\.map\\.fastly\\.net$\n(?:^|\\.)nytimg\\.com$\n(?:^|\\.)nytstyle\\.com$\n(?:^|\\.)nzchinese\\.com$\n(?:^|\\.)nzchinese\\.net\\.nz$\n(?:^|\\.)observechina\\.net$\n(?:^|\\.)obutu\\.com$\n(?:^|\\.)ocaspro\\.com$\n(?:^|\\.)occupytiananmen\\.com$\n(?:^|\\.)oclp\\.hk$\n(?:^|\\.)ocreampies\\.com$\n(?:^|\\.)ocry\\.com$\n(?:^|\\.)october-review\\.org$\n(?:^|\\.)oculus\\.com$\n(?:^|\\.)oculuscdn\\.com$\n(?:^|\\.)oex\\.com$\n(?:^|\\.)offbeatchina\\.com$\n(?:^|\\.)officeoftibet\\.com$\n(?:^|\\.)ofile\\.org$\n(?:^|\\.)ogaoga\\.org$\n(?:^|\\.)ogate\\.org$\n(?:^|\\.)oikos\\.com\\.tw$\n(?:^|\\.)oiktv\\.com$\n(?:^|\\.)oizoblog\\.com$\n(?:^|\\.)ok\\.ru$\n(?:^|\\.)okayfreedom\\.com$\n(?:^|\\.)okex\\.com$\n(?:^|\\.)okk\\.tw$\n(?:^|\\.)old-cat\\.net$\n(?:^|\\.)old\\.honeynet\\.org$\n(?:^|\\.)old\\.nabble\\.com$\n(?:^|\\.)olumpo\\.com$\n(?:^|\\.)olympicwatch\\.org$\n(?:^|\\.)omgili\\.com$\n(?:^|\\.)omni7\\.jp$\n(?:^|\\.)omnitalk\\.com$\n(?:^|\\.)omnitalk\\.org$\n(?:^|\\.)on\\.cc$\n(?:^|\\.)on2\\.com$\n(?:^|\\.)onapp\\.com$\n(?:^|\\.)onedrive\\.live\\.com$\n(?:^|\\.)onedumb\\.com$\n(?:^|\\.)onejav\\.com$\n(?:^|\\.)onion\\.city$\n(?:^|\\.)online\\.recoveryversion\\.org$\n(?:^|\\.)onlinecha\\.com$\n(?:^|\\.)onlineyoutube\\.com$\n(?:^|\\.)onlytweets\\.com$\n(?:^|\\.)onmoon\\.com$\n(?:^|\\.)onmoon\\.net$\n(?:^|\\.)onmypc\\.biz$\n(?:^|\\.)onmypc\\.info$\n(?:^|\\.)onmypc\\.net$\n(?:^|\\.)onmypc\\.org$\n(?:^|\\.)onmypc\\.us$\n(?:^|\\.)onthehunt\\.com$\n(?:^|\\.)ontrac\\.com$\n(?:^|\\.)oopsforum\\.com$\n(?:^|\\.)open\\.com\\.hk$\n(?:^|\\.)openallweb\\.com$\n(?:^|\\.)opendemocracy\\.net$\n(?:^|\\.)opendn\\.xyz$\n(?:^|\\.)openervpn\\.in$\n(?:^|\\.)openid\\.net$\n(?:^|\\.)openleaks\\.org$\n(?:^|\\.)openvpn\\.net$\n(?:^|\\.)openvpn\\.org$\n(?:^|\\.)openwebster\\.com$\n(?:^|\\.)openwrt\\.org\\.cn$\n(?:^|\\.)opml\\.radiotime\\.com$\n(?:^|\\.)opus-gaming\\.com$\n(?:^|\\.)organcare\\.org\\.tw$\n(?:^|\\.)organharvestinvestigation\\.net$\n(?:^|\\.)organiccrap\\.com$\n(?:^|\\.)orgasm\\.com$\n(?:^|\\.)orgfree\\.com$\n(?:^|\\.)orient-doll\\.com$\n(?:^|\\.)orientaldaily\\.com\\.my$\n(?:^|\\.)orn\\.jp$\n(?:^|\\.)orzistic\\.org$\n(?:^|\\.)osfoora\\.com$\n(?:^|\\.)otcbtc\\.com$\n(?:^|\\.)otnd\\.org$\n(?:^|\\.)otto\\.de$\n(?:^|\\.)otzo\\.com$\n(?:^|\\.)ourdearamy\\.com$\n(?:^|\\.)ourhobby\\.com$\n(?:^|\\.)oursogo\\.com$\n(?:^|\\.)oursteps\\.com\\.au$\n(?:^|\\.)oursweb\\.net$\n(?:^|\\.)ourtv\\.hk$\n(?:^|\\.)overplay\\.net$\n(?:^|\\.)oversea\\.istarshine\\.com$\n(?:^|\\.)ow\\.ly$\n(?:^|\\.)owl\\.li$\n(?:^|\\.)oyax\\.com$\n(?:^|\\.)oyghan\\.com$\n(?:^|\\.)ozchinese\\.com$\n(?:^|\\.)ozvoice\\.org$\n(?:^|\\.)ozxw\\.com$\n(?:^|\\.)ozyoyo\\.com$\n(?:^|\\.)pachosting\\.com$\n(?:^|\\.)pacificpoker\\.com$\n(?:^|\\.)packages\\.debian\\.org$\n(?:^|\\.)packetix\\.net$\n(?:^|\\.)pacopacomama\\.com$\n(?:^|\\.)padmanet\\.com$\n(?:^|\\.)page\\.bid\\.yahoo\\.com$\n(?:^|\\.)page2rss\\.com$\n(?:^|\\.)pagodabox\\.com$\n(?:^|\\.)palacemoon\\.com$\n(?:^|\\.)paldengyal\\.com$\n(?:^|\\.)paljorpublications\\.com$\n(?:^|\\.)paltalk\\.com$\n(?:^|\\.)panamapapers\\.sueddeutsche\\.de$\n(?:^|\\.)pandapow\\.co$\n(?:^|\\.)pandapow\\.net$\n(?:^|\\.)pandavpn-jp\\.com$\n(?:^|\\.)pandora\\.com$\n(?:^|\\.)pandora\\.tv$\n(?:^|\\.)panluan\\.net$\n(?:^|\\.)panoramio\\.com$\n(?:^|\\.)pao-pao\\.net$\n(?:^|\\.)paper\\.li$\n(?:^|\\.)paperb\\.us$\n(?:^|\\.)paradisehill\\.cc$\n(?:^|\\.)paradisepoker\\.com$\n(?:^|\\.)parkansky\\.com$\n(?:^|\\.)partycasino\\.com$\n(?:^|\\.)partypoker\\.com$\n(?:^|\\.)passion\\.com$\n(?:^|\\.)passiontimes\\.hk$\n(?:^|\\.)paste\\.ee$\n(?:^|\\.)pastebin\\.com$\n(?:^|\\.)pastie\\.org$\n(?:^|\\.)pbs\\.org$\n(?:^|\\.)pbwiki\\.com$\n(?:^|\\.)pbworks\\.com$\n(?:^|\\.)pbxes\\.com$\n(?:^|\\.)pbxes\\.org$\n(?:^|\\.)pcanywhere\\.net$\n(?:^|\\.)pcc\\.gov\\.tw$\n(?:^|\\.)pcdvd\\.com\\.tw$\n(?:^|\\.)pchome\\.com\\.tw$\n(?:^|\\.)pcij\\.org$\n(?:^|\\.)pcstore\\.com\\.tw$\n(?:^|\\.)pct\\.org\\.tw$\n(?:^|\\.)pdetails\\.com$\n(?:^|\\.)pdproxy\\.com$\n(?:^|\\.)pds\\.nasa\\.gov$\n(?:^|\\.)peace\\.ca$\n(?:^|\\.)peacefire\\.org$\n(?:^|\\.)peacehall\\.com$\n(?:^|\\.)pearlher\\.org$\n(?:^|\\.)peeasian\\.com$\n(?:^|\\.)pekingduck\\.org$\n(?:^|\\.)pemulihan\\.or\\.id$\n(?:^|\\.)pen\\.io$\n(?:^|\\.)penchinese\\.com$\n(?:^|\\.)penchinese\\.net$\n(?:^|\\.)pengyulong\\.com$\n(?:^|\\.)penisbot\\.com$\n(?:^|\\.)penthouse\\.com$\n(?:^|\\.)pentoy\\.hk$\n(?:^|\\.)peoplebookcafe\\.com$\n(?:^|\\.)peoplenews\\.tw$\n(?:^|\\.)peopo\\.org$\n(?:^|\\.)percy\\.in$\n(?:^|\\.)perfectgirls\\.net$\n(?:^|\\.)perfectvpn\\.net$\n(?:^|\\.)periscope\\.tv$\n(?:^|\\.)persecutionblog\\.com$\n(?:^|\\.)persiankitty\\.com$\n(?:^|\\.)pfd\\.org\\.hk$\n(?:^|\\.)phapluan\\.org$\n(?:^|\\.)phayul\\.com$\n(?:^|\\.)philborges\\.com$\n(?:^|\\.)philly\\.com$\n(?:^|\\.)phmsociety\\.org$\n(?:^|\\.)phncdn\\.com$\n(?:^|\\.)phobos\\.apple\\.com$\n(?:^|\\.)phosphation13\\.rssing\\.com$\n(?:^|\\.)photodharma\\.net$\n(?:^|\\.)photofocus\\.com$\n(?:^|\\.)phuquocservices\\.com$\n(?:^|\\.)picacomic\\.com$\n(?:^|\\.)picacomiccn\\.com$\n(?:^|\\.)picasaweb\\.com$\n(?:^|\\.)picidae\\.net$\n(?:^|\\.)pictures\\.playboy\\.com$\n(?:^|\\.)picturesocial\\.com$\n(?:^|\\.)pin-cong\\.com$\n(?:^|\\.)pin6\\.com$\n(?:^|\\.)pincong\\.rocks$\n(?:^|\\.)ping\\.fm$\n(?:^|\\.)pinimg\\.com$\n(?:^|\\.)pinkrod\\.com$\n(?:^|\\.)pinoy-n\\.com$\n(?:^|\\.)pinterest\\.at$\n(?:^|\\.)pinterest\\.ca$\n(?:^|\\.)pinterest\\.co\\.kr$\n(?:^|\\.)pinterest\\.co\\.uk$\n(?:^|\\.)pinterest\\.com$\n(?:^|\\.)pinterest\\.de$\n(?:^|\\.)pinterest\\.dk$\n(?:^|\\.)pinterest\\.fr$\n(?:^|\\.)pinterest\\.jp$\n(?:^|\\.)pinterest\\.nl$\n(?:^|\\.)pinterest\\.se$\n(?:^|\\.)pioneer-worker\\.forums-free\\.com$\n(?:^|\\.)pipii\\.tv$\n(?:^|\\.)piposay\\.com$\n(?:^|\\.)piraattilahti\\.org$\n(?:^|\\.)piring\\.com$\n(?:^|\\.)pixelqi\\.com$\n(?:^|\\.)pixiv\\.net$\n(?:^|\\.)pixnet\\.net$\n(?:^|\\.)pk\\.com$\n(?:^|\\.)pki\\.goog$\n(?:^|\\.)placemix\\.com$\n(?:^|\\.)playboy\\.com$\n(?:^|\\.)playboyplus\\.com$\n(?:^|\\.)player\\.fm$\n(?:^|\\.)playno1\\.com$\n(?:^|\\.)playpcesor\\.com$\n(?:^|\\.)plays\\.com\\.tw$\n(?:^|\\.)plm\\.org\\.hk$\n(?:^|\\.)plunder\\.com$\n(?:^|\\.)plurk\\.com$\n(?:^|\\.)plus\\.codes$\n(?:^|\\.)plus28\\.com$\n(?:^|\\.)plusbb\\.com$\n(?:^|\\.)pmatehunter\\.com$\n(?:^|\\.)pmates\\.com$\n(?:^|\\.)po2b\\.com$\n(?:^|\\.)pobieramy\\.top$\n(?:^|\\.)podictionary\\.com$\n(?:^|\\.)pokerstars\\.com$\n(?:^|\\.)pokerstars\\.net$\n(?:^|\\.)politicalchina\\.org$\n(?:^|\\.)politicalconsultation\\.org$\n(?:^|\\.)politiscales\\.net$\n(?:^|\\.)poloniex\\.com$\n(?:^|\\.)polymer-project\\.org$\n(?:^|\\.)polymerhk\\.com$\n(?:^|\\.)popo\\.tw$\n(?:^|\\.)popvote\\.hk$\n(?:^|\\.)popyard\\.com$\n(?:^|\\.)popyard\\.org$\n(?:^|\\.)porn\\.com$\n(?:^|\\.)porn2\\.com$\n(?:^|\\.)porn5\\.com$\n(?:^|\\.)pornbase\\.org$\n(?:^|\\.)pornerbros\\.com$\n(?:^|\\.)pornhd\\.com$\n(?:^|\\.)pornhost\\.com$\n(?:^|\\.)pornhub\\.com$\n(?:^|\\.)pornhubdeutsch\\.net$\n(?:^|\\.)pornmm\\.net$\n(?:^|\\.)pornoxo\\.com$\n(?:^|\\.)pornrapidshare\\.com$\n(?:^|\\.)pornsharing\\.com$\n(?:^|\\.)pornsocket\\.com$\n(?:^|\\.)pornstarclub\\.com$\n(?:^|\\.)porntube\\.com$\n(?:^|\\.)porntubenews\\.com$\n(?:^|\\.)porntvblog\\.com$\n(?:^|\\.)pornvisit\\.com$\n(?:^|\\.)port25\\.biz$\n(?:^|\\.)portablevpn\\.nl$\n(?:^|\\.)poskotanews\\.com$\n(?:^|\\.)post01\\.com$\n(?:^|\\.)post76\\.com$\n(?:^|\\.)post852\\.com$\n(?:^|\\.)postadult\\.com$\n(?:^|\\.)postimg\\.org$\n(?:^|\\.)potato\\.im$\n(?:^|\\.)potvpn\\.com$\n(?:^|\\.)power\\.com$\n(?:^|\\.)powerapple\\.com$\n(?:^|\\.)powercx\\.com$\n(?:^|\\.)powerphoto\\.org$\n(?:^|\\.)prayforchina\\.net$\n(?:^|\\.)premeforwindows7\\.com$\n(?:^|\\.)premproxy\\.com$\n(?:^|\\.)presentationzen\\.com$\n(?:^|\\.)presidentlee\\.tw$\n(?:^|\\.)prestige-av\\.com$\n(?:^|\\.)pride\\.google$\n(?:^|\\.)prism-break\\.org$\n(?:^|\\.)prisoner-state-secret-journal-premier$\n(?:^|\\.)prisoneralert\\.com$\n(?:^|\\.)pritunl\\.com$\n(?:^|\\.)privacybox\\.de$\n(?:^|\\.)private\\.com$\n(?:^|\\.)privateinternetaccess\\.com$\n(?:^|\\.)privatepaste\\.com$\n(?:^|\\.)privatetunnel\\.com$\n(?:^|\\.)privatevpn\\.com$\n(?:^|\\.)procopytips\\.com$\n(?:^|\\.)prosiben\\.de$\n(?:^|\\.)protonvpn\\.com$\n(?:^|\\.)provideocoalition\\.com$\n(?:^|\\.)provpnaccounts\\.com$\n(?:^|\\.)proxfree\\.com$\n(?:^|\\.)proxifier\\.com$\n(?:^|\\.)proxomitron\\.info$\n(?:^|\\.)proxpn\\.com$\n(?:^|\\.)proxyanonimo\\.es$\n(?:^|\\.)proxydns\\.com$\n(?:^|\\.)proxylist\\.org\\.uk$\n(?:^|\\.)proxynetwork\\.org\\.uk$\n(?:^|\\.)proxypy\\.net$\n(?:^|\\.)proxyroad\\.com$\n(?:^|\\.)proxytunnel\\.net$\n(?:^|\\.)proyectoclubes\\.com$\n(?:^|\\.)prozz\\.net$\n(?:^|\\.)psblog\\.name$\n(?:^|\\.)pscp\\.tv$\n(?:^|\\.)psiphon\\.ca$\n(?:^|\\.)psiphon\\.civisec\\.org$\n(?:^|\\.)psiphon3\\.com$\n(?:^|\\.)psiphontoday\\.com$\n(?:^|\\.)pts\\.org\\.tw$\n(?:^|\\.)ptt\\.cc$\n(?:^|\\.)pttvan\\.org$\n(?:^|\\.)pubu\\.com\\.tw$\n(?:^|\\.)puffinbrowser\\.com$\n(?:^|\\.)puffstore\\.com$\n(?:^|\\.)pullfolio\\.com$\n(?:^|\\.)pulse\\.yahoo\\.com$\n(?:^|\\.)punyu\\.com$\n(?:^|\\.)pure18\\.com$\n(?:^|\\.)pureconcepts\\.net$\n(?:^|\\.)pureinsight\\.org$\n(?:^|\\.)purepdf\\.com$\n(?:^|\\.)purevpn\\.com$\n(?:^|\\.)purplelotus\\.org$\n(?:^|\\.)pursuestar\\.com$\n(?:^|\\.)pushchinawall\\.com$\n(?:^|\\.)pussyspace\\.com$\n(?:^|\\.)putihome\\.org$\n(?:^|\\.)putlocker\\.com$\n(?:^|\\.)putty\\.org$\n(?:^|\\.)puuko\\.com$\n(?:^|\\.)pwned\\.com$\n(?:^|\\.)python\\.com$\n(?:^|\\.)python\\.com\\.tw$\n(?:^|\\.)pythonhackers\\.com$\n(?:^|\\.)pytorch\\.org$\n(?:^|\\.)q%3dfreedom$\n(?:^|\\.)q%3dtriangle$\n(?:^|\\.)q=freedom$\n(?:^|\\.)q=triangle$\n(?:^|\\.)qanote\\.com$\n(?:^|\\.)qgirl\\.com\\.tw$\n(?:^|\\.)qhigh\\.com$\n(?:^|\\.)qi-gong\\.me$\n(?:^|\\.)qiandao\\.today$\n(?:^|\\.)qiangyou\\.org$\n(?:^|\\.)qidian\\.ca$\n(?:^|\\.)qienkuen\\.org$\n(?:^|\\.)qiwen\\.lu$\n(?:^|\\.)qixianglu\\.cn$\n(?:^|\\.)qkshare\\.com$\n(?:^|\\.)qoos\\.com$\n(?:^|\\.)qpoe\\.com$\n(?:^|\\.)qq\\.co\\.za$\n(?:^|\\.)qstatus\\.com$\n(?:^|\\.)qtrac\\.eu$\n(?:^|\\.)qtweeter\\.com$\n(?:^|\\.)quannengshen\\.org$\n(?:^|\\.)quantumbooter\\.net$\n(?:^|\\.)questvisual\\.com$\n(?:^|\\.)quitccp\\.net$\n(?:^|\\.)quitccp\\.org$\n(?:^|\\.)quora\\.com$\n(?:^|\\.)quoracdn\\.net$\n(?:^|\\.)quran\\.com$\n(?:^|\\.)quranexplorer\\.com$\n(?:^|\\.)qusi8\\.net$\n(?:^|\\.)qvodzy\\.org$\n(?:^|\\.)qxbbs\\.org$\n(?:^|\\.)r18\\.com$\n(?:^|\\.)ra\\.gg$\n(?:^|\\.)radicalparty\\.org$\n(?:^|\\.)radiko\\.jp$\n(?:^|\\.)radioaustralia\\.net\\.au$\n(?:^|\\.)radiohilight\\.net$\n(?:^|\\.)radiovaticana\\.org$\n(?:^|\\.)radiovncr\\.com$\n(?:^|\\.)rael\\.org$\n(?:^|\\.)raggedbanner\\.com$\n(?:^|\\.)raidcall\\.com\\.tw$\n(?:^|\\.)raidtalk\\.com\\.tw$\n(?:^|\\.)rainbowplan\\.org$\n(?:^|\\.)raizoji\\.or\\.jp$\n(?:^|\\.)ramcity\\.com\\.au$\n(?:^|\\.)rangwang\\.biz$\n(?:^|\\.)rangzen\\.com$\n(?:^|\\.)rangzen\\.net$\n(?:^|\\.)rangzen\\.org$\n(?:^|\\.)ranyunfei\\.com$\n(?:^|\\.)rapbull\\.net$\n(?:^|\\.)rapidgator\\.net$\n(?:^|\\.)rapidmoviez\\.com$\n(?:^|\\.)rapidvpn\\.com$\n(?:^|\\.)raremovie\\.cc$\n(?:^|\\.)raremovie\\.net$\n(?:^|\\.)rawgit\\.com$\n(?:^|\\.)rawgithub\\.com$\n(?:^|\\.)razyboard\\.com$\n(?:^|\\.)rcam\\.target\\.com$\n(?:^|\\.)rcinet\\.ca$\n(?:^|\\.)rconversation\\.blogs\\.com$\n(?:^|\\.)rd\\.com$\n(?:^|\\.)rdio\\.com$\n(?:^|\\.)read01\\.com$\n(?:^|\\.)read100\\.com$\n(?:^|\\.)readingtimes\\.com\\.tw$\n(?:^|\\.)readmoo\\.com$\n(?:^|\\.)readydown\\.com$\n(?:^|\\.)realcourage\\.org$\n(?:^|\\.)realforum\\.zkiz\\.com$\n(?:^|\\.)realitykings\\.com$\n(?:^|\\.)realraptalk\\.com$\n(?:^|\\.)realsexpass\\.com$\n(?:^|\\.)rebatesrule\\.net$\n(?:^|\\.)recordhistory\\.org$\n(?:^|\\.)recovery\\.org\\.tw$\n(?:^|\\.)recoveryversion\\.com\\.tw$\n(?:^|\\.)red-lang\\.org$\n(?:^|\\.)redballoonsolidarity\\.org$\n(?:^|\\.)redchinacn\\.net$\n(?:^|\\.)redchinacn\\.org$\n(?:^|\\.)redd\\.it$\n(?:^|\\.)reddit\\.com$\n(?:^|\\.)redditlist\\.com$\n(?:^|\\.)redditmedia\\.com$\n(?:^|\\.)redditstatic\\.com$\n(?:^|\\.)redhotlabs\\.com$\n(?:^|\\.)redtube\\.com$\n(?:^|\\.)referer\\.us$\n(?:^|\\.)reflectivecode\\.com$\n(?:^|\\.)registry\\.google$\n(?:^|\\.)relaxbbs\\.com$\n(?:^|\\.)relay\\.com\\.tw$\n(?:^|\\.)releaseinternational\\.org$\n(?:^|\\.)religioustolerance\\.org$\n(?:^|\\.)remembering_tiananmen_20_years$\n(?:^|\\.)renminbao\\.com$\n(?:^|\\.)renyurenquan\\.org$\n(?:^|\\.)research\\.jmsc\\.hku\\.hk$\n(?:^|\\.)resilio\\.com$\n(?:^|\\.)retweeteffect\\.com$\n(?:^|\\.)retweetist\\.com$\n(?:^|\\.)retweetrank\\.com$\n(?:^|\\.)reuters\\.com$\n(?:^|\\.)reutersmedia\\.net$\n(?:^|\\.)revleft\\.com$\n(?:^|\\.)revver\\.com$\n(?:^|\\.)rfa\\.org$\n(?:^|\\.)rfachina\\.com$\n(?:^|\\.)rfalive1\\.akacast\\.akamaistream\\.net$\n(?:^|\\.)rfamobile\\.org$\n(?:^|\\.)rfaweb\\.org$\n(?:^|\\.)rferl\\.org$\n(?:^|\\.)rfi\\.fr$\n(?:^|\\.)rfi\\.my$\n(?:^|\\.)rg3\\.github\\.io$\n(?:^|\\.)rightbtc\\.com$\n(?:^|\\.)rigpa\\.org$\n(?:^|\\.)riku\\.me$\n(?:^|\\.)rileyguide\\.com$\n(?:^|\\.)ritouki\\.jp$\n(?:^|\\.)ritter\\.vg$\n(?:^|\\.)rixcloud\\.com$\n(?:^|\\.)rixcloud\\.us$\n(?:^|\\.)rlwlw\\.com$\n(?:^|\\.)rmjdw\\.com$\n(?:^|\\.)rmjdw132\\.info$\n(?:^|\\.)roadshow\\.hk$\n(?:^|\\.)roboforex\\.com$\n(?:^|\\.)robustnessiskey\\.com$\n(?:^|\\.)rocket-inc\\.net$\n(?:^|\\.)rocksdb\\.org$\n(?:^|\\.)rojo\\.com$\n(?:^|\\.)rolia\\.net$\n(?:^|\\.)ronjoneswriter\\.com$\n(?:^|\\.)roodo\\.com$\n(?:^|\\.)rosechina\\.net$\n(?:^|\\.)rotten\\.com$\n(?:^|\\.)rsdlmonitor\\.com$\n(?:^|\\.)rsf-chinese\\.org$\n(?:^|\\.)rsf\\.org$\n(?:^|\\.)rsgamen\\.org$\n(?:^|\\.)rssmeme\\.com$\n(?:^|\\.)rtalabel\\.org$\n(?:^|\\.)rthk\\.hk$\n(?:^|\\.)rthk\\.org\\.hk$\n(?:^|\\.)rthklive2-lh\\.akamaihd\\.net$\n(?:^|\\.)rti\\.org\\.tw$\n(?:^|\\.)rtycminnesota\\.org$\n(?:^|\\.)ruanyifeng\\.com$\n(?:^|\\.)rukor\\.org$\n(?:^|\\.)runbtx\\.com$\n(?:^|\\.)rushbee\\.com$\n(?:^|\\.)ruten\\.com\\.tw$\n(?:^|\\.)rutube\\.ru$\n(?:^|\\.)ruyiseek\\.com$\n(?:^|\\.)rxhj\\.net$\n(?:^|\\.)s-cute\\.com$\n(?:^|\\.)s-dragon\\.org$\n(?:^|\\.)s1\\.nudezz\\.com$\n(?:^|\\.)s1heng\\.com$\n(?:^|\\.)s1s1s1\\.com$\n(?:^|\\.)s3-ap-northeast-1\\.amazonaws\\.com$\n(?:^|\\.)s3-ap-southeast-2\\.amazonaws\\.com$\n(?:^|\\.)s8forum\\.com$\n(?:^|\\.)sa\\.hao123\\.com$\n(?:^|\\.)sacks\\.com$\n(?:^|\\.)sacom\\.hk$\n(?:^|\\.)sadistic-v\\.com$\n(?:^|\\.)sadpanda\\.us$\n(?:^|\\.)safervpn\\.com$\n(?:^|\\.)safety\\.google$\n(?:^|\\.)saintyculture\\.com$\n(?:^|\\.)saiq\\.me$\n(?:^|\\.)sakuralive\\.com$\n(?:^|\\.)sakya\\.org$\n(?:^|\\.)salvation\\.org\\.hk$\n(?:^|\\.)samair\\.ru$\n(?:^|\\.)sambhota\\.org$\n(?:^|\\.)sanmin\\.com\\.tw$\n(?:^|\\.)sapikachu\\.net$\n(?:^|\\.)saveliuxiaobo\\.com$\n(?:^|\\.)savemedia\\.com$\n(?:^|\\.)savethedate\\.foo$\n(?:^|\\.)savethesounds\\.info$\n(?:^|\\.)savetibet\\.de$\n(?:^|\\.)savetibet\\.fr$\n(?:^|\\.)savetibet\\.nl$\n(?:^|\\.)savetibet\\.org$\n(?:^|\\.)savetibet\\.ru$\n(?:^|\\.)savetibetstore\\.org$\n(?:^|\\.)savevid\\.com$\n(?:^|\\.)say2\\.info$\n(?:^|\\.)sbme\\.me$\n(?:^|\\.)sbs\\.com\\.au$\n(?:^|\\.)scache\\.vzw\\.com$\n(?:^|\\.)scache1\\.vzw\\.com$\n(?:^|\\.)scache2\\.vzw\\.com$\n(?:^|\\.)scasino\\.com$\n(?:^|\\.)schema\\.org$\n(?:^|\\.)sciencenets\\.com$\n(?:^|\\.)scieron\\.com$\n(?:^|\\.)scmp\\.com$\n(?:^|\\.)scmpchinese\\.com$\n(?:^|\\.)scramble\\.io$\n(?:^|\\.)scribd\\.com$\n(?:^|\\.)scriptspot\\.com$\n(?:^|\\.)seapuff\\.com$\n(?:^|\\.)search$\n(?:^|\\.)search\\.aol\\.com$\n(?:^|\\.)search\\.yahoo\\.co\\.jp$\n(?:^|\\.)search\\.yahoo\\.com$\n(?:^|\\.)searchtruth\\.com$\n(?:^|\\.)secretchina\\.com$\n(?:^|\\.)secretgarden\\.no$\n(?:^|\\.)secretsline\\.biz$\n(?:^|\\.)secure\\.hustler\\.com$\n(?:^|\\.)secure\\.logmein\\.com$\n(?:^|\\.)secure\\.raxcdn\\.com$\n(?:^|\\.)securetunnel\\.com$\n(?:^|\\.)securityinabox\\.org$\n(?:^|\\.)securitykiss\\.com$\n(?:^|\\.)seed4\\.me$\n(?:^|\\.)seesmic\\.com$\n(?:^|\\.)seevpn\\.com$\n(?:^|\\.)seezone\\.net$\n(?:^|\\.)sejie\\.com$\n(?:^|\\.)sellclassics\\.com$\n(?:^|\\.)sendsmtp\\.com$\n(?:^|\\.)sendspace\\.com$\n(?:^|\\.)servehttp\\.com$\n(?:^|\\.)serveuser\\.com$\n(?:^|\\.)serveusers\\.com$\n(?:^|\\.)sesawe\\.net$\n(?:^|\\.)sesawe\\.org$\n(?:^|\\.)sethwklein\\.net$\n(?:^|\\.)setn\\.com$\n(?:^|\\.)settv\\.com\\.tw$\n(?:^|\\.)sevenload\\.com$\n(?:^|\\.)sex-11\\.com$\n(?:^|\\.)sex\\.com$\n(?:^|\\.)sex3\\.com$\n(?:^|\\.)sex8\\.cc$\n(?:^|\\.)sexandsubmission\\.com$\n(?:^|\\.)sexbot\\.com$\n(?:^|\\.)sexhu\\.com$\n(?:^|\\.)sexhuang\\.com$\n(?:^|\\.)sexidude\\.com$\n(?:^|\\.)sexinsex\\.net$\n(?:^|\\.)sextvx\\.com$\n(?:^|\\.)sexxxy\\.biz$\n(?:^|\\.)sfileydy\\.com$\n(?:^|\\.)sfshibao\\.com$\n(?:^|\\.)sftindia\\.org$\n(?:^|\\.)sftuk\\.org$\n(?:^|\\.)shadeyouvpn\\.com$\n(?:^|\\.)shadow\\.ma$\n(?:^|\\.)shadowsky\\.xyz$\n(?:^|\\.)shadowsocks-r\\.com$\n(?:^|\\.)shadowsocks\\.asia$\n(?:^|\\.)shadowsocks\\.be$\n(?:^|\\.)shadowsocks\\.com$\n(?:^|\\.)shadowsocks\\.com\\.hk$\n(?:^|\\.)shadowsocks\\.org$\n(?:^|\\.)shadowsocks9\\.com$\n(?:^|\\.)shambalapost\\.com$\n(?:^|\\.)shambhalasun\\.com$\n(?:^|\\.)shangfang\\.org$\n(?:^|\\.)shapeservices\\.com$\n(?:^|\\.)share\\.america\\.gov$\n(?:^|\\.)share\\.dmhy\\.org$\n(?:^|\\.)share\\.ovi\\.com$\n(?:^|\\.)share\\.youthwant\\.com\\.tw$\n(?:^|\\.)sharebee\\.com$\n(?:^|\\.)sharecool\\.org$\n(?:^|\\.)sharpdaily\\.com\\.hk$\n(?:^|\\.)sharpdaily\\.hk$\n(?:^|\\.)sharpdaily\\.tw$\n(?:^|\\.)shat-tibet\\.com$\n(?:^|\\.)shattered\\.io$\n(?:^|\\.)sheikyermami\\.com$\n(?:^|\\.)shellfire\\.de$\n(?:^|\\.)shenshou\\.org$\n(?:^|\\.)shenyun\\.com$\n(?:^|\\.)shenyunperformingarts\\.org$\n(?:^|\\.)shenzhoufilm\\.com$\n(?:^|\\.)sherabgyaltsen\\.com$\n(?:^|\\.)shiatv\\.net$\n(?:^|\\.)shicheng\\.org$\n(?:^|\\.)shiksha\\.com$\n(?:^|\\.)shinychan\\.com$\n(?:^|\\.)shipcamouflage\\.com$\n(?:^|\\.)shireyishunjian\\.com$\n(?:^|\\.)shitaotv\\.org$\n(?:^|\\.)shixiao\\.org$\n(?:^|\\.)shizhao\\.org$\n(?:^|\\.)shkspr\\.mobi$\n(?:^|\\.)shodanhq\\.com$\n(?:^|\\.)shooshtime\\.com$\n(?:^|\\.)shop2000\\.com\\.tw$\n(?:^|\\.)shopping\\.com$\n(?:^|\\.)showbiz\\.omy\\.sg$\n(?:^|\\.)showhaotu\\.com$\n(?:^|\\.)showtime\\.jp$\n(?:^|\\.)shutterstock\\.com$\n(?:^|\\.)shwchurch\\.org$\n(?:^|\\.)shwchurch3\\.com$\n(?:^|\\.)siddharthasintent\\.org$\n(?:^|\\.)sidelinesnews\\.com$\n(?:^|\\.)sidelinessportseatery\\.com$\n(?:^|\\.)sierrafriendsoftibet\\.org$\n(?:^|\\.)sijihuisuo\\.club$\n(?:^|\\.)sijihuisuo\\.com$\n(?:^|\\.)sikaozhe1997\\.github\\.io$\n(?:^|\\.)silkbook\\.com$\n(?:^|\\.)simbolostwitter\\.com$\n(?:^|\\.)simplecd\\.org$\n(?:^|\\.)simpleproductivityblog\\.com$\n(?:^|\\.)sinchew\\.com\\.my$\n(?:^|\\.)singaporepools\\.com\\.sg$\n(?:^|\\.)singfortibet\\.com$\n(?:^|\\.)singpao\\.com\\.hk$\n(?:^|\\.)singtao\\.com$\n(?:^|\\.)singtaousa\\.com$\n(?:^|\\.)sino-monthly\\.com$\n(?:^|\\.)sinoants\\.com$\n(?:^|\\.)sinocast\\.com$\n(?:^|\\.)sinocism\\.com$\n(?:^|\\.)sinomontreal\\.ca$\n(?:^|\\.)sinonet\\.ca$\n(?:^|\\.)sinopitt\\.info$\n(?:^|\\.)sinoquebec\\.com$\n(?:^|\\.)sipml5\\.org$\n(?:^|\\.)sis\\.xxx$\n(?:^|\\.)sis001\\.com$\n(?:^|\\.)sis001\\.us$\n(?:^|\\.)site2unblock\\.com$\n(?:^|\\.)site90\\.net$\n(?:^|\\.)sitebro\\.tw$\n(?:^|\\.)sitekreator\\.com$\n(?:^|\\.)siteks\\.uk\\.to$\n(?:^|\\.)sitemaps\\.org$\n(?:^|\\.)six-degrees\\.io$\n(?:^|\\.)sixth\\.biz$\n(?:^|\\.)sjrt\\.org$\n(?:^|\\.)sjum\\.cn$\n(?:^|\\.)sketchappsources\\.com$\n(?:^|\\.)skimtube\\.com$\n(?:^|\\.)skybet\\.com$\n(?:^|\\.)skyking\\.com\\.tw$\n(?:^|\\.)skyvegas\\.com$\n(?:^|\\.)skyxvpn\\.com$\n(?:^|\\.)slacker\\.com$\n(?:^|\\.)slaytizle\\.com$\n(?:^|\\.)sleazydream\\.com$\n(?:^|\\.)slheng\\.com$\n(?:^|\\.)slickvpn\\.com$\n(?:^|\\.)slideshare\\.net$\n(?:^|\\.)slinkset\\.com$\n(?:^|\\.)slutload\\.com$\n(?:^|\\.)slutmoonbeam\\.com$\n(?:^|\\.)slyip\\.com$\n(?:^|\\.)slyip\\.net$\n(?:^|\\.)sm-miracle\\.com$\n(?:^|\\.)smartdnsproxy\\.com$\n(?:^|\\.)smarthide\\.com$\n(?:^|\\.)smchbooks\\.com$\n(?:^|\\.)smh\\.com\\.au$\n(?:^|\\.)smhric\\.org$\n(?:^|\\.)smith\\.edu$\n(?:^|\\.)smyxy\\.org$\n(?:^|\\.)snapchat\\.com$\n(?:^|\\.)snaptu\\.com$\n(?:^|\\.)sndcdn\\.com$\n(?:^|\\.)sneakme\\.net$\n(?:^|\\.)snowlionpub\\.com$\n(?:^|\\.)sobees\\.com$\n(?:^|\\.)soc\\.mil$\n(?:^|\\.)socialwhale\\.com$\n(?:^|\\.)socks-proxy\\.net$\n(?:^|\\.)sockscap64\\.com$\n(?:^|\\.)sockslist\\.net$\n(?:^|\\.)socrec\\.org$\n(?:^|\\.)sod\\.co\\.jp$\n(?:^|\\.)sodatea\\.github\\.io$\n(?:^|\\.)softether-download\\.com$\n(?:^|\\.)softether\\.co\\.jp$\n(?:^|\\.)softether\\.org$\n(?:^|\\.)softfamous\\.com$\n(?:^|\\.)softsmirror\\.cf$\n(?:^|\\.)softwarebychuck\\.com$\n(?:^|\\.)softwaredownload\\.gitbooks\\.io$\n(?:^|\\.)sogclub\\.com$\n(?:^|\\.)sogrady\\.me$\n(?:^|\\.)soh\\.tw$\n(?:^|\\.)sohcradio\\.com$\n(?:^|\\.)sohfrance\\.org$\n(?:^|\\.)sokamonline\\.com$\n(?:^|\\.)sokmil\\.com$\n(?:^|\\.)solarsystem\\.nasa\\.gov$\n(?:^|\\.)solidaritetibet\\.org$\n(?:^|\\.)solidfiles\\.com$\n(?:^|\\.)somee\\.com$\n(?:^|\\.)songjianjun\\.com$\n(?:^|\\.)sonicbbs\\.cc$\n(?:^|\\.)sonidodelaesperanza\\.org$\n(?:^|\\.)sopcast\\.com$\n(?:^|\\.)sopcast\\.org$\n(?:^|\\.)sorazone\\.net$\n(?:^|\\.)sorting-algorithms\\.com$\n(?:^|\\.)sos\\.org$\n(?:^|\\.)sosreader\\.com$\n(?:^|\\.)sostibet\\.org$\n(?:^|\\.)soubory\\.com$\n(?:^|\\.)soul-plus\\.net$\n(?:^|\\.)soulcaliburhentai\\.net$\n(?:^|\\.)soumo\\.info$\n(?:^|\\.)soundcloud\\.com$\n(?:^|\\.)soundofhope\\.kr$\n(?:^|\\.)soundofhope\\.org$\n(?:^|\\.)soup\\.io$\n(?:^|\\.)soupofmedia\\.com$\n(?:^|\\.)sourceforge\\.net$\n(?:^|\\.)sourcewadio\\.com$\n(?:^|\\.)southnews\\.com\\.tw$\n(?:^|\\.)sowers\\.org\\.hk$\n(?:^|\\.)soylentnews\\.org$\n(?:^|\\.)spaces\\.hightail\\.com$\n(?:^|\\.)spankbang\\.com$\n(?:^|\\.)spankingtube\\.com$\n(?:^|\\.)spankwire\\.com$\n(?:^|\\.)spb\\.com$\n(?:^|\\.)speakerdeck\\.com$\n(?:^|\\.)specxinzl\\.jigsy\\.com$\n(?:^|\\.)speedify\\.com$\n(?:^|\\.)spem\\.at$\n(?:^|\\.)spencertipping\\.com$\n(?:^|\\.)spendee\\.com$\n(?:^|\\.)spicevpn\\.com$\n(?:^|\\.)spideroak\\.com$\n(?:^|\\.)spike\\.com$\n(?:^|\\.)sports\\.williamhill\\.com$\n(?:^|\\.)spotflux\\.com$\n(?:^|\\.)spotify\\.com$\n(?:^|\\.)spreadshirt\\.es$\n(?:^|\\.)spring4u\\.info$\n(?:^|\\.)springboardplatform\\.com$\n(?:^|\\.)sprite\\.org$\n(?:^|\\.)sproutcore\\.com$\n(?:^|\\.)sproxy\\.info$\n(?:^|\\.)squirly\\.info$\n(?:^|\\.)srcf\\.ucam\\.org$\n(?:^|\\.)srocket\\.us$\n(?:^|\\.)ss-link\\.com$\n(?:^|\\.)ss\\.carryzhou\\.com$\n(?:^|\\.)ss\\.levyhsu\\.com$\n(?:^|\\.)ss\\.pythonic\\.life$\n(?:^|\\.)ss7\\.vzw\\.com$\n(?:^|\\.)ssglobal\\.co$\n(?:^|\\.)ssglobal\\.me$\n(?:^|\\.)ssh91\\.com$\n(?:^|\\.)ssl\\.webpack\\.de$\n(?:^|\\.)ssl443\\.org$\n(?:^|\\.)sspanel\\.net$\n(?:^|\\.)sspro\\.ml$\n(?:^|\\.)ssr\\.tools$\n(?:^|\\.)ssrshare\\.com$\n(?:^|\\.)sss\\.camp$\n(?:^|\\.)sstmlt\\.moe$\n(?:^|\\.)sstmlt\\.net$\n(?:^|\\.)stackoverflow\\.com$\n(?:^|\\.)stage64\\.hk$\n(?:^|\\.)standupfortibet\\.org$\n(?:^|\\.)stanford\\.edu$\n(?:^|\\.)starfishfx\\.com$\n(?:^|\\.)starp2p\\.com$\n(?:^|\\.)startpage\\.com$\n(?:^|\\.)startuplivingchina\\.com$\n(?:^|\\.)stat\\.gov\\.tw$\n(?:^|\\.)static-economist\\.com$\n(?:^|\\.)static\\.comico\\.tw$\n(?:^|\\.)static\\.shemalez\\.com$\n(?:^|\\.)static01\\.nyt\\.com$\n(?:^|\\.)staticflickr\\.com$\n(?:^|\\.)statueofdemocracy\\.org$\n(?:^|\\.)stc\\.com\\.sa$\n(?:^|\\.)steamcommunity\\.com$\n(?:^|\\.)steel-storm\\.com$\n(?:^|\\.)steemit\\.com$\n(?:^|\\.)steganos\\.com$\n(?:^|\\.)steganos\\.net$\n(?:^|\\.)stepchina\\.com$\n(?:^|\\.)stephaniered\\.com$\n(?:^|\\.)sthoo\\.com$\n(?:^|\\.)stickam\\.com$\n(?:^|\\.)stickeraction\\.com$\n(?:^|\\.)stileproject\\.com$\n(?:^|\\.)sto\\.cc$\n(?:^|\\.)stoporganharvesting\\.org$\n(?:^|\\.)stoptibetcrisis\\.net$\n(?:^|\\.)storagenewsletter\\.com$\n(?:^|\\.)store\\.steampowered\\.com$\n(?:^|\\.)stories\\.google$\n(?:^|\\.)storify\\.com$\n(?:^|\\.)storm\\.mg$\n(?:^|\\.)stormmediagroup\\.com$\n(?:^|\\.)stoweboyd\\.com$\n(?:^|\\.)stranabg\\.com$\n(?:^|\\.)straplessdildo\\.com$\n(?:^|\\.)streamingthe\\.net$\n(?:^|\\.)streema\\.com$\n(?:^|\\.)strikingly\\.com$\n(?:^|\\.)strongvpn\\.com$\n(?:^|\\.)strongwindpress\\.com$\n(?:^|\\.)student\\.tw$\n(?:^|\\.)studentsforafreetibet\\.org$\n(?:^|\\.)stumbleupon\\.com$\n(?:^|\\.)stupidvideos\\.com$\n(?:^|\\.)subacme\\.rerouted\\.org$\n(?:^|\\.)successfn\\.com$\n(?:^|\\.)sugarsync\\.com$\n(?:^|\\.)sugobbs\\.com$\n(?:^|\\.)sugumiru18\\.com$\n(?:^|\\.)suissl\\.com$\n(?:^|\\.)sujiatun\\.wordpress\\.com$\n(?:^|\\.)sukebei\\.nyaa\\.si$\n(?:^|\\.)sulian\\.me$\n(?:^|\\.)summify\\.com$\n(?:^|\\.)sumrando\\.com$\n(?:^|\\.)sun1911\\.com$\n(?:^|\\.)sunmedia\\.ca$\n(?:^|\\.)sunporno\\.com$\n(?:^|\\.)sunskyforum\\.com$\n(?:^|\\.)sunta\\.com\\.tw$\n(?:^|\\.)sunvpn\\.net$\n(?:^|\\.)sunwinism\\.joinbbs\\.net$\n(?:^|\\.)suoluo\\.org$\n(?:^|\\.)supchina\\.com$\n(?:^|\\.)superfreevpn\\.com$\n(?:^|\\.)superokayama\\.com$\n(?:^|\\.)superpages\\.com$\n(?:^|\\.)supervpn\\.net$\n(?:^|\\.)superzooi\\.com$\n(?:^|\\.)suppig\\.net$\n(?:^|\\.)suprememastertv\\.com$\n(?:^|\\.)surfeasy\\.com$\n(?:^|\\.)surfeasy\\.com\\.au$\n(?:^|\\.)suroot\\.com$\n(?:^|\\.)surrenderat20\\.net$\n(?:^|\\.)sustainability\\.google$\n(?:^|\\.)suyangg\\.com$\n(?:^|\\.)svsfx\\.com$\n(?:^|\\.)swagbucks\\.com$\n(?:^|\\.)swissinfo\\.ch$\n(?:^|\\.)swissvpn\\.net$\n(?:^|\\.)switch1\\.jp$\n(?:^|\\.)switchvpn\\.net$\n(?:^|\\.)sydneytoday\\.com$\n(?:^|\\.)sylfoundation\\.org$\n(?:^|\\.)syncback\\.com$\n(?:^|\\.)synergyse\\.com$\n(?:^|\\.)sysresccd\\.org$\n(?:^|\\.)sytes\\.net$\n(?:^|\\.)szbbs\\.net$\n(?:^|\\.)szetowah\\.org\\.hk$\n(?:^|\\.)t-g\\.com$\n(?:^|\\.)t\\.co$\n(?:^|\\.)t\\.me$\n(?:^|\\.)t\\.orzdream\\.com$\n(?:^|\\.)t35\\.com$\n(?:^|\\.)t66y\\.com$\n(?:^|\\.)taa-usa\\.org$\n(?:^|\\.)taaze\\.tw$\n(?:^|\\.)tabtter\\.jp$\n(?:^|\\.)tacc\\.cwb\\.gov\\.tw$\n(?:^|\\.)tacem\\.org$\n(?:^|\\.)taconet\\.com\\.tw$\n(?:^|\\.)taedp\\.org\\.tw$\n(?:^|\\.)tafm\\.org$\n(?:^|\\.)tagwa\\.org\\.au$\n(?:^|\\.)tagwalk\\.com$\n(?:^|\\.)tahr\\.org\\.tw$\n(?:^|\\.)taipei\\.gov\\.tw$\n(?:^|\\.)taipeisociety\\.org$\n(?:^|\\.)taiwan-sex\\.com$\n(?:^|\\.)taiwanbible\\.com$\n(?:^|\\.)taiwancon\\.com$\n(?:^|\\.)taiwandaily\\.net$\n(?:^|\\.)taiwandc\\.org$\n(?:^|\\.)taiwanjobs\\.gov\\.tw$\n(?:^|\\.)taiwanjustice\\.com$\n(?:^|\\.)taiwanjustice\\.net$\n(?:^|\\.)taiwankiss\\.com$\n(?:^|\\.)taiwannation\\.50webs\\.com$\n(?:^|\\.)taiwannation\\.com$\n(?:^|\\.)taiwannation\\.com\\.tw$\n(?:^|\\.)taiwanncf\\.org\\.tw$\n(?:^|\\.)taiwannews\\.com\\.tw$\n(?:^|\\.)taiwantp\\.net$\n(?:^|\\.)taiwantt\\.org\\.tw$\n(?:^|\\.)taiwanus\\.net$\n(?:^|\\.)taiwanyes\\.com$\n(?:^|\\.)taiwanyes\\.ning\\.com$\n(?:^|\\.)talk853\\.com$\n(?:^|\\.)talkboxapp\\.com$\n(?:^|\\.)talkcc\\.com$\n(?:^|\\.)talkonly\\.net$\n(?:^|\\.)tamiaode\\.tk$\n(?:^|\\.)tanc\\.org$\n(?:^|\\.)tangben\\.com$\n(?:^|\\.)tangren\\.us$\n(?:^|\\.)taoism\\.net$\n(?:^|\\.)taolun\\.info$\n(?:^|\\.)tapanwap\\.com$\n(?:^|\\.)tapatalk\\.com$\n(?:^|\\.)tarr\\.uspto\\.gov$\n(?:^|\\.)tascn\\.com\\.au$\n(?:^|\\.)taup\\.net$\n(?:^|\\.)taweet\\.com$\n(?:^|\\.)tbcollege\\.org$\n(?:^|\\.)tbi\\.org\\.hk$\n(?:^|\\.)tbicn\\.org$\n(?:^|\\.)tbjyt\\.org$\n(?:^|\\.)tbpic\\.info$\n(?:^|\\.)tbrc\\.org$\n(?:^|\\.)tbs-rainbow\\.org$\n(?:^|\\.)tbsec\\.org$\n(?:^|\\.)tbskkinabalu\\.page\\.tl$\n(?:^|\\.)tbsmalaysia\\.org$\n(?:^|\\.)tbsn\\.org$\n(?:^|\\.)tbsseattle\\.org$\n(?:^|\\.)tbssqh\\.org$\n(?:^|\\.)tbswd\\.org$\n(?:^|\\.)tbtemple\\.org\\.uk$\n(?:^|\\.)tbthouston\\.org$\n(?:^|\\.)tccwonline\\.org$\n(?:^|\\.)tcewf\\.org$\n(?:^|\\.)tchrd\\.org$\n(?:^|\\.)tcnynj\\.org$\n(?:^|\\.)tcpspeed\\.co$\n(?:^|\\.)tcpspeed\\.com$\n(?:^|\\.)tcsofbc\\.org$\n(?:^|\\.)tcsovi\\.org$\n(?:^|\\.)tdm\\.com\\.mo$\n(?:^|\\.)teachparentstech\\.org$\n(?:^|\\.)teamamericany\\.com$\n(?:^|\\.)tech2\\.in\\.com$\n(?:^|\\.)techviz\\.net$\n(?:^|\\.)teck\\.in$\n(?:^|\\.)teco-hk\\.org$\n(?:^|\\.)teco-mo\\.org$\n(?:^|\\.)teddysun\\.com$\n(?:^|\\.)teeniefuck\\.net$\n(?:^|\\.)teensinasia\\.com$\n(?:^|\\.)telecomspace\\.com$\n(?:^|\\.)telegram\\.dog$\n(?:^|\\.)telegram\\.me$\n(?:^|\\.)telegram\\.org$\n(?:^|\\.)telegramdownload\\.com$\n(?:^|\\.)telegraph\\.co\\.uk$\n(?:^|\\.)telesco\\.pe$\n(?:^|\\.)tellme\\.pw$\n(?:^|\\.)tenacy\\.com$\n(?:^|\\.)tensorflow\\.org$\n(?:^|\\.)tenzinpalmo\\.com$\n(?:^|\\.)terminus2049\\.github\\.io$\n(?:^|\\.)tew\\.org$\n(?:^|\\.)textnow\\.me$\n(?:^|\\.)tfhub\\.dev$\n(?:^|\\.)th\\.hao123\\.com$\n(?:^|\\.)thaicn\\.com$\n(?:^|\\.)thb\\.gov\\.tw$\n(?:^|\\.)theatrum-belli\\.com$\n(?:^|\\.)thebcomplex\\.com$\n(?:^|\\.)theblemish\\.com$\n(?:^|\\.)thebobs\\.com$\n(?:^|\\.)thebodyshop-usa\\.com$\n(?:^|\\.)thecenter\\.mit\\.edu$\n(?:^|\\.)thechinabeat\\.org$\n(?:^|\\.)thedalailamamovie\\.com$\n(?:^|\\.)thedw\\.us$\n(?:^|\\.)thefacebook\\.com$\n(?:^|\\.)thefrontier\\.hk$\n(?:^|\\.)thegioitinhoc\\.vn$\n(?:^|\\.)thegly\\.com$\n(?:^|\\.)thehots\\.info$\n(?:^|\\.)thehousenews\\.com$\n(?:^|\\.)thehun\\.net$\n(?:^|\\.)theinitium\\.com$\n(?:^|\\.)thenewslens\\.com$\n(?:^|\\.)thepiratebay\\.org$\n(?:^|\\.)theporndude\\.com$\n(?:^|\\.)theportalwiki\\.com$\n(?:^|\\.)thereallove\\.kr$\n(?:^|\\.)therock\\.net\\.nz$\n(?:^|\\.)thespeeder\\.com$\n(?:^|\\.)thestandnews\\.com$\n(?:^|\\.)thetibetcenter\\.org$\n(?:^|\\.)thetibetconnection\\.org$\n(?:^|\\.)thetibetmuseum\\.org$\n(?:^|\\.)thetibetpost\\.com$\n(?:^|\\.)thetinhat\\.com$\n(?:^|\\.)thetrotskymovie\\.com$\n(?:^|\\.)thevivekspot\\.com$\n(?:^|\\.)thewgo\\.org$\n(?:^|\\.)theync\\.com$\n(?:^|\\.)thinkgeek\\.com$\n(?:^|\\.)thinkingtaiwan\\.com$\n(?:^|\\.)thinkwithgoogle\\.com$\n(?:^|\\.)thisav\\.com$\n(?:^|\\.)thlib\\.org$\n(?:^|\\.)thomasbernhard\\.org$\n(?:^|\\.)thongdreams\\.com$\n(?:^|\\.)threatchaos\\.com$\n(?:^|\\.)throughnightsfire\\.com$\n(?:^|\\.)thumbzilla\\.com$\n(?:^|\\.)thywords\\.com$\n(?:^|\\.)thywords\\.com\\.tw$\n(?:^|\\.)tiananmenduizhi\\.com$\n(?:^|\\.)tiananmenmother\\.org$\n(?:^|\\.)tiananmenuniv\\.com$\n(?:^|\\.)tiananmenuniv\\.net$\n(?:^|\\.)tiandixing\\.org$\n(?:^|\\.)tianhuayuan\\.com$\n(?:^|\\.)tianlawoffice\\.com$\n(?:^|\\.)tianti\\.io$\n(?:^|\\.)tiantibooks\\.org$\n(?:^|\\.)tianyantong\\.org\\.cn$\n(?:^|\\.)tianzhu\\.org$\n(?:^|\\.)tibet-envoy\\.eu$\n(?:^|\\.)tibet-foundation\\.org$\n(?:^|\\.)tibet-house-trust\\.co\\.uk$\n(?:^|\\.)tibet-info\\.net$\n(?:^|\\.)tibet-initiative\\.de$\n(?:^|\\.)tibet-munich\\.de$\n(?:^|\\.)tibet\\.a\\.se$\n(?:^|\\.)tibet\\.at$\n(?:^|\\.)tibet\\.ca$\n(?:^|\\.)tibet\\.com$\n(?:^|\\.)tibet\\.fr$\n(?:^|\\.)tibet\\.net$\n(?:^|\\.)tibet\\.nu$\n(?:^|\\.)tibet\\.org$\n(?:^|\\.)tibet\\.org\\.tw$\n(?:^|\\.)tibet\\.sk$\n(?:^|\\.)tibet\\.to$\n(?:^|\\.)tibet3rdpole\\.org$\n(?:^|\\.)tibetaction\\.net$\n(?:^|\\.)tibetaid\\.org$\n(?:^|\\.)tibetalk\\.com$\n(?:^|\\.)tibetan-alliance\\.org$\n(?:^|\\.)tibetan\\.fr$\n(?:^|\\.)tibetanaidproject\\.org$\n(?:^|\\.)tibetanarts\\.org$\n(?:^|\\.)tibetanbuddhistinstitute\\.org$\n(?:^|\\.)tibetancommunity\\.org$\n(?:^|\\.)tibetancommunityuk\\.net$\n(?:^|\\.)tibetanculture\\.org$\n(?:^|\\.)tibetanfeministcollective\\.org$\n(?:^|\\.)tibetanjournal\\.com$\n(?:^|\\.)tibetanlanguage\\.org$\n(?:^|\\.)tibetanliberation\\.org$\n(?:^|\\.)tibetanpaintings\\.com$\n(?:^|\\.)tibetanphotoproject\\.com$\n(?:^|\\.)tibetanpoliticalreview\\.org$\n(?:^|\\.)tibetanreview\\.net$\n(?:^|\\.)tibetansports\\.org$\n(?:^|\\.)tibetanwomen\\.org$\n(?:^|\\.)tibetanyouth\\.org$\n(?:^|\\.)tibetanyouthcongress\\.org$\n(?:^|\\.)tibetcharity\\.dk$\n(?:^|\\.)tibetcharity\\.in$\n(?:^|\\.)tibetchild\\.org$\n(?:^|\\.)tibetcity\\.com$\n(?:^|\\.)tibetcollection\\.com$\n(?:^|\\.)tibetcorps\\.org$\n(?:^|\\.)tibetexpress\\.net$\n(?:^|\\.)tibetfocus\\.com$\n(?:^|\\.)tibetfund\\.org$\n(?:^|\\.)tibetgermany\\.com$\n(?:^|\\.)tibetgermany\\.de$\n(?:^|\\.)tibethaus\\.com$\n(?:^|\\.)tibetheritagefund\\.org$\n(?:^|\\.)tibethouse\\.jp$\n(?:^|\\.)tibethouse\\.org$\n(?:^|\\.)tibethouse\\.us$\n(?:^|\\.)tibetinfonet\\.net$\n(?:^|\\.)tibetjustice\\.org$\n(?:^|\\.)tibetkomite\\.dk$\n(?:^|\\.)tibetlibre\\.free\\.fr$\n(?:^|\\.)tibetmuseum\\.org$\n(?:^|\\.)tibetnetwork\\.org$\n(?:^|\\.)tibetoffice\\.ch$\n(?:^|\\.)tibetoffice\\.com\\.au$\n(?:^|\\.)tibetoffice\\.eu$\n(?:^|\\.)tibetoffice\\.org$\n(?:^|\\.)tibetonline\\.com$\n(?:^|\\.)tibetonline\\.tv$\n(?:^|\\.)tibetoralhistory\\.org$\n(?:^|\\.)tibetpolicy\\.eu$\n(?:^|\\.)tibetrelieffund\\.co\\.uk$\n(?:^|\\.)tibetsites\\.com$\n(?:^|\\.)tibetsociety\\.com$\n(?:^|\\.)tibetsun\\.com$\n(?:^|\\.)tibetsupportgroup\\.org$\n(?:^|\\.)tibetswiss\\.ch$\n(?:^|\\.)tibettelegraph\\.com$\n(?:^|\\.)tibettimes\\.net$\n(?:^|\\.)tibetwrites\\.org$\n(?:^|\\.)ticket\\.com\\.tw$\n(?:^|\\.)tigervpn\\.com$\n(?:^|\\.)tiltbrush\\.com$\n(?:^|\\.)timdir\\.com$\n(?:^|\\.)time\\.com$\n(?:^|\\.)times\\.hinet\\.net$\n(?:^|\\.)timesofindia\\.indiatimes\\.com$\n(?:^|\\.)timsah\\.com$\n(?:^|\\.)tinc-vpn\\.org$\n(?:^|\\.)tineye\\.com$\n(?:^|\\.)tintuc101\\.com$\n(?:^|\\.)tiny\\.cc$\n(?:^|\\.)tinychat\\.com$\n(?:^|\\.)tinypaste\\.com$\n(?:^|\\.)tipo\\.gov\\.tw$\n(?:^|\\.)tistory\\.com$\n(?:^|\\.)tkcs-collins\\.com$\n(?:^|\\.)tl\\.gd$\n(?:^|\\.)tma\\.co\\.jp$\n(?:^|\\.)tmagazine\\.com$\n(?:^|\\.)tmdfish\\.com$\n(?:^|\\.)tmi\\.me$\n(?:^|\\.)tmpp\\.org$\n(?:^|\\.)tn1\\.shemalez\\.com$\n(?:^|\\.)tn2\\.shemalez\\.com$\n(?:^|\\.)tn3\\.shemalez\\.com$\n(?:^|\\.)tnaflix\\.com$\n(?:^|\\.)tngrnow\\.com$\n(?:^|\\.)tngrnow\\.net$\n(?:^|\\.)tnp\\.org$\n(?:^|\\.)to-porno\\.com$\n(?:^|\\.)togetter\\.com$\n(?:^|\\.)toh\\.info$\n(?:^|\\.)tokyo-247\\.com$\n(?:^|\\.)tokyo-hot\\.com$\n(?:^|\\.)tokyo-porn-tube\\.com$\n(?:^|\\.)tokyocn\\.com$\n(?:^|\\.)tongil\\.or\\.kr$\n(?:^|\\.)tono-oka\\.jp$\n(?:^|\\.)tonyyan\\.net$\n(?:^|\\.)toodoc\\.com$\n(?:^|\\.)toonel\\.net$\n(?:^|\\.)top\\.tv$\n(?:^|\\.)top10vpn\\.com$\n(?:^|\\.)top81\\.ws$\n(?:^|\\.)topbtc\\.com$\n(?:^|\\.)topic\\.youthwant\\.com\\.tw$\n(?:^|\\.)topnews\\.in$\n(?:^|\\.)toppornsites\\.com$\n(?:^|\\.)topshareware\\.com$\n(?:^|\\.)topsy\\.com$\n(?:^|\\.)toptip\\.ca$\n(?:^|\\.)tor\\.blingblingsquad\\.net$\n(?:^|\\.)tor\\.cn\\.uptodown\\.com$\n(?:^|\\.)tor\\.updatestar\\.com$\n(?:^|\\.)tora\\.to$\n(?:^|\\.)torcn\\.com$\n(?:^|\\.)torguard\\.net$\n(?:^|\\.)torproject\\.org$\n(?:^|\\.)torrentprivacy\\.com$\n(?:^|\\.)torrentproject\\.se$\n(?:^|\\.)torrenty\\.org$\n(?:^|\\.)torrentz\\.eu$\n(?:^|\\.)torvpn\\.com$\n(?:^|\\.)tosh\\.comedycentral\\.com$\n(?:^|\\.)totalvpn\\.com$\n(?:^|\\.)toutiaoabc\\.com$\n(?:^|\\.)toutyrater\\.github\\.io$\n(?:^|\\.)towngain\\.com$\n(?:^|\\.)toypark\\.in$\n(?:^|\\.)toythieves\\.com$\n(?:^|\\.)toytractorshow\\.com$\n(?:^|\\.)tparents\\.org$\n(?:^|\\.)tpi\\.org\\.tw$\n(?:^|\\.)tracfone\\.com$\n(?:^|\\.)traffichaus\\.com$\n(?:^|\\.)trans\\.wenweipo\\.com$\n(?:^|\\.)transparency\\.org$\n(?:^|\\.)treemall\\.com\\.tw$\n(?:^|\\.)trendsmap\\.com$\n(?:^|\\.)trialofccp\\.org$\n(?:^|\\.)trickip\\.net$\n(?:^|\\.)trickip\\.org$\n(?:^|\\.)trimondi\\.de$\n(?:^|\\.)trouw\\.nl$\n(?:^|\\.)trt\\.net\\.tr$\n(?:^|\\.)trtc\\.com\\.tw$\n(?:^|\\.)truebuddha-md\\.org$\n(?:^|\\.)trulyergonomic\\.com$\n(?:^|\\.)truth101\\.co\\.tv$\n(?:^|\\.)truthontour\\.org$\n(?:^|\\.)truveo\\.com$\n(?:^|\\.)tryheart\\.jp$\n(?:^|\\.)tsctv\\.net$\n(?:^|\\.)tsdr\\.uspto\\.gov$\n(?:^|\\.)tsemtulku\\.com$\n(?:^|\\.)tsquare\\.tv$\n(?:^|\\.)tsu\\.org\\.tw$\n(?:^|\\.)tsunagarumon\\.com$\n(?:^|\\.)tt1069\\.com$\n(?:^|\\.)tttan\\.com$\n(?:^|\\.)ttvnw\\.net$\n(?:^|\\.)tu8964\\.com$\n(?:^|\\.)tubaholic\\.com$\n(?:^|\\.)tube\\.com$\n(?:^|\\.)tube8\\.com$\n(?:^|\\.)tube911\\.com$\n(?:^|\\.)tubecup\\.com$\n(?:^|\\.)tubegals\\.com$\n(?:^|\\.)tubeislam\\.com$\n(?:^|\\.)tubepornclassic\\.com$\n(?:^|\\.)tubestack\\.com$\n(?:^|\\.)tubewolf\\.com$\n(?:^|\\.)tui\\.orzdream\\.com$\n(?:^|\\.)tuibeitu\\.net$\n(?:^|\\.)tuidang\\.net$\n(?:^|\\.)tuidang\\.org$\n(?:^|\\.)tuidang\\.se$\n(?:^|\\.)tuitwit\\.com$\n(?:^|\\.)tumblr\\.com$\n(?:^|\\.)tumutanzi\\.com$\n(?:^|\\.)tumview\\.com$\n(?:^|\\.)tunein\\.com$\n(?:^|\\.)tunnelbear\\.com$\n(?:^|\\.)tunnelr\\.com$\n(?:^|\\.)tuo8\\.blue$\n(?:^|\\.)tuo8\\.cc$\n(?:^|\\.)tuo8\\.club$\n(?:^|\\.)tuo8\\.fit$\n(?:^|\\.)tuo8\\.hk$\n(?:^|\\.)tuo8\\.in$\n(?:^|\\.)tuo8\\.ninja$\n(?:^|\\.)tuo8\\.org$\n(?:^|\\.)tuo8\\.pw$\n(?:^|\\.)tuo8\\.red$\n(?:^|\\.)tuo8\\.space$\n(?:^|\\.)turansam\\.org$\n(?:^|\\.)turbobit\\.net$\n(?:^|\\.)turbohide\\.com$\n(?:^|\\.)turbotwitter\\.com$\n(?:^|\\.)turntable\\.fm$\n(?:^|\\.)tushycash\\.com$\n(?:^|\\.)tuvpn\\.com$\n(?:^|\\.)tuzaijidi\\.com$\n(?:^|\\.)tv\\.com$\n(?:^|\\.)tvants\\.com$\n(?:^|\\.)tvboxnow\\.com$\n(?:^|\\.)tvider\\.com$\n(?:^|\\.)tvmost\\.com\\.hk$\n(?:^|\\.)tvplayvideos\\.com$\n(?:^|\\.)tvunetworks\\.com$\n(?:^|\\.)tw-blog\\.com$\n(?:^|\\.)tw-npo\\.org$\n(?:^|\\.)tw\\.answers\\.yahoo\\.com$\n(?:^|\\.)tw\\.bid\\.yahoo\\.com$\n(?:^|\\.)tw\\.gigacircle\\.com$\n(?:^|\\.)tw\\.hao123\\.com$\n(?:^|\\.)tw\\.iqiyi\\.com$\n(?:^|\\.)tw\\.jiepang\\.com$\n(?:^|\\.)tw\\.knowledge\\.yahoo\\.com$\n(?:^|\\.)tw\\.mall\\.yahoo\\.com$\n(?:^|\\.)tw\\.mobi\\.yahoo\\.com$\n(?:^|\\.)tw\\.money\\.yahoo\\.com$\n(?:^|\\.)tw\\.myblog\\.yahoo\\.com$\n(?:^|\\.)tw\\.news\\.yahoo\\.com$\n(?:^|\\.)tw\\.streetvoice\\.com$\n(?:^|\\.)tw\\.tomonews\\.net$\n(?:^|\\.)tw\\.voa\\.mobi$\n(?:^|\\.)tw\\.yahoo\\.com$\n(?:^|\\.)tw01\\.org$\n(?:^|\\.)twaitter\\.com$\n(?:^|\\.)twapperkeeper\\.com$\n(?:^|\\.)twaud\\.io$\n(?:^|\\.)twavi\\.com$\n(?:^|\\.)twbbs\\.net\\.tw$\n(?:^|\\.)twbbs\\.org$\n(?:^|\\.)twbbs\\.tw$\n(?:^|\\.)twblogger\\.com$\n(?:^|\\.)tweepguide\\.com$\n(?:^|\\.)tweeplike\\.me$\n(?:^|\\.)tweepmag\\.com$\n(?:^|\\.)tweepml\\.org$\n(?:^|\\.)tweetbackup\\.com$\n(?:^|\\.)tweetboard\\.com$\n(?:^|\\.)tweetboner\\.biz$\n(?:^|\\.)tweetcs\\.com$\n(?:^|\\.)tweetdeck\\.com$\n(?:^|\\.)tweetedtimes\\.com$\n(?:^|\\.)tweetmylast\\.fm$\n(?:^|\\.)tweetphoto\\.com$\n(?:^|\\.)tweetrans\\.com$\n(?:^|\\.)tweetree\\.com$\n(?:^|\\.)tweets\\.seraph\\.me$\n(?:^|\\.)tweettunnel\\.com$\n(?:^|\\.)tweetwally\\.com$\n(?:^|\\.)tweetymail\\.com$\n(?:^|\\.)tweez\\.net$\n(?:^|\\.)twelve\\.today$\n(?:^|\\.)twerkingbutt\\.com$\n(?:^|\\.)twftp\\.org$\n(?:^|\\.)twgreatdaily\\.com$\n(?:^|\\.)twibase\\.com$\n(?:^|\\.)twibble\\.de$\n(?:^|\\.)twibbon\\.com$\n(?:^|\\.)twibs\\.com$\n(?:^|\\.)twicountry\\.org$\n(?:^|\\.)twicsy\\.com$\n(?:^|\\.)twiends\\.com$\n(?:^|\\.)twifan\\.com$\n(?:^|\\.)twiffo\\.com$\n(?:^|\\.)twiggit\\.org$\n(?:^|\\.)twilightsex\\.com$\n(?:^|\\.)twilog\\.org$\n(?:^|\\.)twimbow\\.com$\n(?:^|\\.)twimg\\.com$\n(?:^|\\.)twindexx\\.com$\n(?:^|\\.)twip\\.me$\n(?:^|\\.)twipple\\.jp$\n(?:^|\\.)twishort\\.com$\n(?:^|\\.)twistar\\.cc$\n(?:^|\\.)twister\\.net\\.co$\n(?:^|\\.)twisterio\\.com$\n(?:^|\\.)twisternow\\.com$\n(?:^|\\.)twistory\\.net$\n(?:^|\\.)twit2d\\.com$\n(?:^|\\.)twitbrowser\\.net$\n(?:^|\\.)twitcause\\.com$\n(?:^|\\.)twitch\\.tv$\n(?:^|\\.)twitchcdn\\.net$\n(?:^|\\.)twitgether\\.com$\n(?:^|\\.)twitgoo\\.com$\n(?:^|\\.)twitiq\\.com$\n(?:^|\\.)twitlonger\\.com$\n(?:^|\\.)twitmania\\.com$\n(?:^|\\.)twitoaster\\.com$\n(?:^|\\.)twitonmsn\\.com$\n(?:^|\\.)twitpic\\.com$\n(?:^|\\.)twitstat\\.com$\n(?:^|\\.)twittbot\\.net$\n(?:^|\\.)twitter\\.com$\n(?:^|\\.)twitter\\.jp$\n(?:^|\\.)twitter4j\\.org$\n(?:^|\\.)twittercounter\\.com$\n(?:^|\\.)twitterfeed\\.com$\n(?:^|\\.)twittergadget\\.com$\n(?:^|\\.)twitterkr\\.com$\n(?:^|\\.)twittermail\\.com$\n(?:^|\\.)twitterrific\\.com$\n(?:^|\\.)twittertim\\.es$\n(?:^|\\.)twitthat\\.com$\n(?:^|\\.)twitturk\\.com$\n(?:^|\\.)twitturly\\.com$\n(?:^|\\.)twitvid\\.com$\n(?:^|\\.)twitzap\\.com$\n(?:^|\\.)twiyia\\.com$\n(?:^|\\.)twnorth\\.org\\.tw$\n(?:^|\\.)twskype\\.com$\n(?:^|\\.)twstar\\.net$\n(?:^|\\.)twt\\.tl$\n(?:^|\\.)twtkr\\.com$\n(?:^|\\.)twtr2src\\.ogaoga\\.org$\n(?:^|\\.)twtrland\\.com$\n(?:^|\\.)twttr\\.com$\n(?:^|\\.)twurl\\.nl$\n(?:^|\\.)twyac\\.org$\n(?:^|\\.)txxx\\.com$\n(?:^|\\.)tycool\\.com$\n(?:^|\\.)typepad\\.com$\n(?:^|\\.)u9un\\.com$\n(?:^|\\.)ub0\\.cc$\n(?:^|\\.)ubddns\\.org$\n(?:^|\\.)uberproxy\\.net$\n(?:^|\\.)uc-japan\\.org$\n(?:^|\\.)ucdc1998\\.org$\n(?:^|\\.)uderzo\\.it$\n(?:^|\\.)udn\\.com$\n(?:^|\\.)udn\\.com\\.tw$\n(?:^|\\.)udnbkk\\.com$\n(?:^|\\.)uforadio\\.com\\.tw$\n(?:^|\\.)ufreevpn\\.com$\n(?:^|\\.)ugo\\.com$\n(?:^|\\.)uhdwallpapers\\.org$\n(?:^|\\.)uhrp\\.org$\n(?:^|\\.)uighur\\.narod\\.ru$\n(?:^|\\.)uighur\\.nl$\n(?:^|\\.)uighurbiz\\.net$\n(?:^|\\.)ukcdp\\.co\\.uk$\n(?:^|\\.)ukliferadio\\.co\\.uk$\n(?:^|\\.)uku\\.im$\n(?:^|\\.)ulike\\.net$\n(?:^|\\.)ulop\\.net$\n(?:^|\\.)ultrareach$\n(?:^|\\.)ultrasurf$\n(?:^|\\.)ultravpn\\.fr$\n(?:^|\\.)ultraxs\\.com$\n(?:^|\\.)umich\\.edu$\n(?:^|\\.)unblock-us\\.com$\n(?:^|\\.)unblock\\.cn\\.com$\n(?:^|\\.)unblockdmm\\.com$\n(?:^|\\.)unblocker\\.yt$\n(?:^|\\.)unblocksit\\.es$\n(?:^|\\.)uncyclomedia\\.org$\n(?:^|\\.)uncyclopedia\\.hk$\n(?:^|\\.)uncyclopedia\\.tw$\n(?:^|\\.)underwoodammo\\.com$\n(?:^|\\.)unholyknight\\.com$\n(?:^|\\.)uni\\.cc$\n(?:^|\\.)unification\\.net$\n(?:^|\\.)unification\\.org\\.tw$\n(?:^|\\.)unirule\\.cloud$\n(?:^|\\.)unitedsocialpress\\.com$\n(?:^|\\.)unix100\\.com$\n(?:^|\\.)unknownspace\\.org$\n(?:^|\\.)unodedos\\.com$\n(?:^|\\.)unpo\\.org$\n(?:^|\\.)unseen\\.is$\n(?:^|\\.)untraceable\\.us$\n(?:^|\\.)uocn\\.org$\n(?:^|\\.)upcoming\\.yahoo\\.com$\n(?:^|\\.)updates\\.tdesktop\\.com$\n(?:^|\\.)upholdjustice\\.org$\n(?:^|\\.)upload4u\\.info$\n(?:^|\\.)uploaded\\.net$\n(?:^|\\.)uploaded\\.to$\n(?:^|\\.)uploadstation\\.com$\n(?:^|\\.)upmedia\\.mg$\n(?:^|\\.)upornia\\.com$\n(?:^|\\.)uproxy\\.org$\n(?:^|\\.)upwill\\.org$\n(?:^|\\.)ur7s\\.com$\n(?:^|\\.)uraban\\.me$\n(?:^|\\.)urbansurvival\\.com$\n(?:^|\\.)urchin\\.com$\n(?:^|\\.)urlborg\\.com$\n(?:^|\\.)urlparser\\.com$\n(?:^|\\.)us\\.to$\n(?:^|\\.)usacn\\.com$\n(?:^|\\.)usaip\\.eu$\n(?:^|\\.)userapi\\.nytlog\\.com$\n(?:^|\\.)users\\.skynet\\.be$\n(?:^|\\.)usfk\\.mil$\n(?:^|\\.)ushuarencity\\.echainhost\\.com$\n(?:^|\\.)usinfo\\.state\\.gov$\n(?:^|\\.)usma\\.edu$\n(?:^|\\.)usmc\\.mil$\n(?:^|\\.)usmgtcg\\.ning\\.com$\n(?:^|\\.)usno\\.navy\\.mil$\n(?:^|\\.)usocctn\\.com$\n(?:^|\\.)ustream\\.tv$\n(?:^|\\.)usunitednews\\.com$\n(?:^|\\.)usus\\.cc$\n(?:^|\\.)utopianpal\\.com$\n(?:^|\\.)uu-gg\\.com$\n(?:^|\\.)uukanshu\\.com$\n(?:^|\\.)uvwxyz\\.xyz$\n(?:^|\\.)uwants\\.com$\n(?:^|\\.)uwants\\.net$\n(?:^|\\.)uyghur-j\\.org$\n(?:^|\\.)uyghur\\.co\\.uk$\n(?:^|\\.)uyghuramerican\\.org$\n(?:^|\\.)uyghurcanadiansociety\\.org$\n(?:^|\\.)uyghurcongress\\.org$\n(?:^|\\.)uyghurensemble\\.co\\.uk$\n(?:^|\\.)uyghurpen\\.org$\n(?:^|\\.)uyghurpress\\.com$\n(?:^|\\.)uyghurstudies\\.org$\n(?:^|\\.)uygur\\.fc2web\\.com$\n(?:^|\\.)uygur\\.org$\n(?:^|\\.)uymaarip\\.com$\n(?:^|\\.)v2ex\\.com$\n(?:^|\\.)v2ray\\.com$\n(?:^|\\.)van001\\.com$\n(?:^|\\.)van698\\.com$\n(?:^|\\.)vanemu\\.cn$\n(?:^|\\.)vanilla-jp\\.com$\n(?:^|\\.)vanpeople\\.com$\n(?:^|\\.)vansky\\.com$\n(?:^|\\.)vaticannews\\.va$\n(?:^|\\.)vatn\\.org$\n(?:^|\\.)vcf-online\\.org$\n(?:^|\\.)vcfbuilder\\.org$\n(?:^|\\.)vds\\.rightster\\.com$\n(?:^|\\.)vegas\\.williamhill\\.com$\n(?:^|\\.)vegasred\\.com$\n(?:^|\\.)velkaepocha\\.sk$\n(?:^|\\.)venbbs\\.com$\n(?:^|\\.)venchina\\.com$\n(?:^|\\.)venetianmacao\\.com$\n(?:^|\\.)ventureswell\\.com$\n(?:^|\\.)veoh\\.com$\n(?:^|\\.)vermonttibet\\.org$\n(?:^|\\.)versavpn\\.com$\n(?:^|\\.)verybs\\.com$\n(?:^|\\.)vevo\\.com$\n(?:^|\\.)vft\\.com\\.tw$\n(?:^|\\.)viber\\.com$\n(?:^|\\.)vica\\.info$\n(?:^|\\.)victimsofcommunism\\.org$\n(?:^|\\.)vid\\.me$\n(?:^|\\.)vidble\\.com$\n(?:^|\\.)video\\.aol\\.ca$\n(?:^|\\.)video\\.aol\\.co\\.uk$\n(?:^|\\.)video\\.aol\\.com$\n(?:^|\\.)video\\.ap\\.org$\n(?:^|\\.)video\\.fdbox\\.com$\n(?:^|\\.)video\\.foxbusiness\\.com$\n(?:^|\\.)video\\.pbs\\.org$\n(?:^|\\.)video\\.yahoo\\.com$\n(?:^|\\.)videobam\\.com$\n(?:^|\\.)videodetective\\.com$\n(?:^|\\.)videomega\\.tv$\n(?:^|\\.)videomo\\.com$\n(?:^|\\.)videopediaworld\\.com$\n(?:^|\\.)videopress\\.com$\n(?:^|\\.)vidinfo\\.org$\n(?:^|\\.)vietdaikynguyen\\.com$\n(?:^|\\.)vijayatemple\\.org$\n(?:^|\\.)vimeo\\.com$\n(?:^|\\.)vimperator\\.org$\n(?:^|\\.)vincnd\\.com$\n(?:^|\\.)vine\\.co$\n(?:^|\\.)vinniev\\.com$\n(?:^|\\.)vip-enterprise\\.com$\n(?:^|\\.)virtualrealporn\\.com$\n(?:^|\\.)visibletweets\\.com$\n(?:^|\\.)vital247\\.org$\n(?:^|\\.)viu\\.com$\n(?:^|\\.)viu\\.tv$\n(?:^|\\.)vivahentai4u\\.net$\n(?:^|\\.)vivatube\\.com$\n(?:^|\\.)vivthomas\\.com$\n(?:^|\\.)vizvaz\\.com$\n(?:^|\\.)vjav\\.com$\n(?:^|\\.)vjmedia\\.com\\.hk$\n(?:^|\\.)vllcs\\.org$\n(?:^|\\.)vlog\\.xuite\\.net$\n(?:^|\\.)vmixcore\\.com$\n(?:^|\\.)vmpsoft\\.com$\n(?:^|\\.)vn\\.hao123\\.com$\n(?:^|\\.)vnet\\.link$\n(?:^|\\.)voa-11\\.akacast\\.akamaistream\\.net$\n(?:^|\\.)voacantonese\\.com$\n(?:^|\\.)voachinese\\.com$\n(?:^|\\.)voachineseblog\\.com$\n(?:^|\\.)voagd\\.com$\n(?:^|\\.)voanews\\.com$\n(?:^|\\.)voatibetan\\.com$\n(?:^|\\.)voatibetanenglish\\.com$\n(?:^|\\.)vocativ\\.com$\n(?:^|\\.)vocn\\.tv$\n(?:^|\\.)vod-abematv\\.akamaized\\.net$\n(?:^|\\.)vod\\.wwe\\.com$\n(?:^|\\.)vot\\.org$\n(?:^|\\.)vovo2000\\.com$\n(?:^|\\.)voxer\\.com$\n(?:^|\\.)voy\\.com$\n(?:^|\\.)vpn\\.ac$\n(?:^|\\.)vpn\\.cjb\\.net$\n(?:^|\\.)vpn\\.cmu\\.edu$\n(?:^|\\.)vpn\\.sv\\.cmu\\.edu$\n(?:^|\\.)vpn4all\\.com$\n(?:^|\\.)vpnaccount\\.org$\n(?:^|\\.)vpnaccounts\\.com$\n(?:^|\\.)vpnbook\\.com$\n(?:^|\\.)vpncomparison\\.org$\n(?:^|\\.)vpncoupons\\.com$\n(?:^|\\.)vpncup\\.com$\n(?:^|\\.)vpndada\\.com$\n(?:^|\\.)vpnfan\\.com$\n(?:^|\\.)vpnfire\\.com$\n(?:^|\\.)vpnfires\\.biz$\n(?:^|\\.)vpnforgame\\.net$\n(?:^|\\.)vpngate\\.jp$\n(?:^|\\.)vpngate\\.net$\n(?:^|\\.)vpngratis\\.net$\n(?:^|\\.)vpnhq\\.com$\n(?:^|\\.)vpninja\\.net$\n(?:^|\\.)vpnintouch\\.com$\n(?:^|\\.)vpnintouch\\.net$\n(?:^|\\.)vpnjack\\.com$\n(?:^|\\.)vpnmaster\\.com$\n(?:^|\\.)vpnmentor\\.com$\n(?:^|\\.)vpnpick\\.com$\n(?:^|\\.)vpnpop\\.com$\n(?:^|\\.)vpnpronet\\.com$\n(?:^|\\.)vpnreactor\\.com$\n(?:^|\\.)vpnreviewz\\.com$\n(?:^|\\.)vpnsecure\\.me$\n(?:^|\\.)vpnshazam\\.com$\n(?:^|\\.)vpnshieldapp\\.com$\n(?:^|\\.)vpnsp\\.com$\n(?:^|\\.)vpntraffic\\.com$\n(?:^|\\.)vpntunnel\\.com$\n(?:^|\\.)vpnuk\\.info$\n(?:^|\\.)vpnunlimitedapp\\.com$\n(?:^|\\.)vpnvip\\.com$\n(?:^|\\.)vpnworldwide\\.com$\n(?:^|\\.)vporn\\.com$\n(?:^|\\.)vpser\\.net$\n(?:^|\\.)vraiesagesse\\.net$\n(?:^|\\.)vrmtr\\.com$\n(?:^|\\.)vrsmash\\.com$\n(?:^|\\.)vtunnel\\.com$\n(?:^|\\.)vuku\\.cc$\n(?:^|\\.)vultryhw\\.com$\n(?:^|\\.)w\\.idaiwan\\.com$\n(?:^|\\.)w3schools\\.com$\n(?:^|\\.)waffle1999\\.com$\n(?:^|\\.)wahas\\.com$\n(?:^|\\.)waigaobu\\.com$\n(?:^|\\.)waikeung\\.org$\n(?:^|\\.)wailaike\\.net$\n(?:^|\\.)waiwaier\\.com$\n(?:^|\\.)wallmama\\.com$\n(?:^|\\.)wallornot\\.org$\n(?:^|\\.)wallpapercasa\\.com$\n(?:^|\\.)wallproxy\\.com$\n(?:^|\\.)waltermartin\\.com$\n(?:^|\\.)waltermartin\\.org$\n(?:^|\\.)wanderinghorse\\.net$\n(?:^|\\.)wangafu\\.net$\n(?:^|\\.)wangjinbo\\.org$\n(?:^|\\.)wanglixiong\\.com$\n(?:^|\\.)wango\\.org$\n(?:^|\\.)wangruoshui\\.net$\n(?:^|\\.)want-daily\\.com$\n(?:^|\\.)wanz-factory\\.com$\n(?:^|\\.)wapedia\\.mobi$\n(?:^|\\.)warbler\\.iconfactory\\.net$\n(?:^|\\.)waselpro\\.com$\n(?:^|\\.)washeng\\.net$\n(?:^|\\.)watch8x\\.com$\n(?:^|\\.)watchinese\\.com$\n(?:^|\\.)watchmygf\\.net$\n(?:^|\\.)wattpad\\.com$\n(?:^|\\.)wav\\.tv$\n(?:^|\\.)waveprotocol\\.org$\n(?:^|\\.)waymo\\.com$\n(?:^|\\.)wda\\.gov\\.tw$\n(?:^|\\.)wdf5\\.com$\n(?:^|\\.)wearehairy\\.com$\n(?:^|\\.)wearn\\.com$\n(?:^|\\.)web\\.dev$\n(?:^|\\.)web2project\\.net$\n(?:^|\\.)webbang\\.net$\n(?:^|\\.)webevader\\.org$\n(?:^|\\.)webfreer\\.com$\n(?:^|\\.)webjb\\.org$\n(?:^|\\.)weblagu\\.com$\n(?:^|\\.)webmproject\\.org$\n(?:^|\\.)webrtc\\.org$\n(?:^|\\.)webrush\\.net$\n(?:^|\\.)webs-tv\\.net$\n(?:^|\\.)website\\.informer\\.com$\n(?:^|\\.)websitepulse\\.com$\n(?:^|\\.)webwarper\\.net$\n(?:^|\\.)webworkerdaily\\.com$\n(?:^|\\.)weekmag\\.info$\n(?:^|\\.)wefightcensorship\\.org$\n(?:^|\\.)wefong\\.com$\n(?:^|\\.)wego\\.here\\.com$\n(?:^|\\.)weiboleak\\.com$\n(?:^|\\.)weiboscope\\.jmsc\\.hku\\.hk$\n(?:^|\\.)weihuo\\.org$\n(?:^|\\.)weijingsheng\\.org$\n(?:^|\\.)weiming\\.info$\n(?:^|\\.)weiquanwang\\.org$\n(?:^|\\.)weisuo\\.ws$\n(?:^|\\.)welovecock\\.com$\n(?:^|\\.)wemigrate\\.org$\n(?:^|\\.)wengewang\\.com$\n(?:^|\\.)wengewang\\.org$\n(?:^|\\.)wenhui\\.ch$\n(?:^|\\.)wenxuecity\\.com$\n(?:^|\\.)wenyunchao\\.com$\n(?:^|\\.)wenzhao\\.ca$\n(?:^|\\.)westca\\.com$\n(?:^|\\.)westernshugdensociety\\.org$\n(?:^|\\.)westernwolves\\.com$\n(?:^|\\.)westkit\\.net$\n(?:^|\\.)westpoint\\.edu$\n(?:^|\\.)wetplace\\.com$\n(?:^|\\.)wetpussygames\\.com$\n(?:^|\\.)wexiaobo\\.org$\n(?:^|\\.)wezhiyong\\.org$\n(?:^|\\.)wezone\\.net$\n(?:^|\\.)wforum\\.com$\n(?:^|\\.)wha\\.la$\n(?:^|\\.)whatblocked\\.com$\n(?:^|\\.)whatbrowser\\.org$\n(?:^|\\.)whatsapp\\.com$\n(?:^|\\.)whatsapp\\.net$\n(?:^|\\.)whatsonweibo\\.com$\n(?:^|\\.)wheatseeds\\.org$\n(?:^|\\.)wheelockslatin\\.com$\n(?:^|\\.)whereiswerner\\.com$\n(?:^|\\.)wheretowatch\\.com$\n(?:^|\\.)whippedass\\.com$\n(?:^|\\.)whitebear\\.freebearblog\\.org$\n(?:^|\\.)whodns\\.xyz$\n(?:^|\\.)whoer\\.net$\n(?:^|\\.)whotalking\\.com$\n(?:^|\\.)whylover\\.com$\n(?:^|\\.)whyx\\.org$\n(?:^|\\.)widevine\\.com$\n(?:^|\\.)wikaba\\.com$\n(?:^|\\.)wiki\\.cnitter\\.com$\n(?:^|\\.)wiki\\.esu\\.im$\n(?:^|\\.)wiki\\.gamerp\\.jp$\n(?:^|\\.)wiki\\.jqueryui\\.com$\n(?:^|\\.)wiki\\.keso\\.cn$\n(?:^|\\.)wiki\\.moegirl\\.org$\n(?:^|\\.)wiki\\.oauth\\.net$\n(?:^|\\.)wiki\\.phonegap\\.com$\n(?:^|\\.)wikileaks-forum\\.com$\n(?:^|\\.)wikileaks\\.ch$\n(?:^|\\.)wikileaks\\.com$\n(?:^|\\.)wikileaks\\.de$\n(?:^|\\.)wikileaks\\.eu$\n(?:^|\\.)wikileaks\\.lu$\n(?:^|\\.)wikileaks\\.org$\n(?:^|\\.)wikileaks\\.pl$\n(?:^|\\.)wikilivres\\.info$\n(?:^|\\.)wikimapia\\.org$\n(?:^|\\.)wikipedia\\.org$\n(?:^|\\.)wikiwiki\\.jp$\n(?:^|\\.)wildammo\\.com$\n(?:^|\\.)williamhill\\.com$\n(?:^|\\.)willw\\.net$\n(?:^|\\.)windowsphoneme\\.com$\n(?:^|\\.)windscribe\\.com$\n(?:^|\\.)wingamestore\\.com$\n(?:^|\\.)wingy\\.site$\n(?:^|\\.)winning11\\.com$\n(?:^|\\.)winwhispers\\.info$\n(?:^|\\.)wire\\.com$\n(?:^|\\.)wiredbytes\\.com$\n(?:^|\\.)wiredpen\\.com$\n(?:^|\\.)wisdompubs\\.org$\n(?:^|\\.)wisevid\\.com$\n(?:^|\\.)withgoogle\\.com$\n(?:^|\\.)withyoutube\\.com$\n(?:^|\\.)witnessleeteaching\\.com$\n(?:^|\\.)witopia\\.net$\n(?:^|\\.)wizcrafts\\.net$\n(?:^|\\.)wjbk\\.org$\n(?:^|\\.)wlcnew\\.jigsy\\.com$\n(?:^|\\.)wlx\\.sowiki\\.net$\n(?:^|\\.)wn\\.com$\n(?:^|\\.)wnacg\\.com$\n(?:^|\\.)wnacg\\.org$\n(?:^|\\.)wo\\.tc$\n(?:^|\\.)wo3ttt\\.wordpress\\.com$\n(?:^|\\.)woeser\\.com$\n(?:^|\\.)woesermiddle-way\\.net$\n(?:^|\\.)wokar\\.org$\n(?:^|\\.)wolfax\\.com$\n(?:^|\\.)woolyss\\.com$\n(?:^|\\.)woopie\\.jp$\n(?:^|\\.)woopie\\.tv$\n(?:^|\\.)wordpress\\.com$\n(?:^|\\.)workatruna\\.com$\n(?:^|\\.)workerdemo\\.org\\.hk$\n(?:^|\\.)workerempowerment\\.org$\n(?:^|\\.)workersthebig\\.net$\n(?:^|\\.)worldcat\\.org$\n(?:^|\\.)worldjournal\\.com$\n(?:^|\\.)worldvpn\\.net$\n(?:^|\\.)wow-life\\.net$\n(?:^|\\.)wow\\.com$\n(?:^|\\.)wowgirls\\.com$\n(?:^|\\.)wowlegacy\\.ml$\n(?:^|\\.)wowporn\\.com$\n(?:^|\\.)wowrk\\.com$\n(?:^|\\.)woxinghuiguo\\.com$\n(?:^|\\.)woyaolian\\.org$\n(?:^|\\.)wozy\\.in$\n(?:^|\\.)wp\\.com$\n(?:^|\\.)wpoforum\\.com$\n(?:^|\\.)wqyd\\.org$\n(?:^|\\.)wrchina\\.org$\n(?:^|\\.)wretch\\.cc$\n(?:^|\\.)writer\\.zoho\\.com$\n(?:^|\\.)wsgzao\\.github\\.io$\n(?:^|\\.)wsj\\.com$\n(?:^|\\.)wsj\\.net$\n(?:^|\\.)wsjhk\\.com$\n(?:^|\\.)wtbn\\.org$\n(?:^|\\.)wtfpeople\\.com$\n(?:^|\\.)wuerkaixi\\.com$\n(?:^|\\.)wufafangwen\\.com$\n(?:^|\\.)wufi\\.org\\.tw$\n(?:^|\\.)wuguoguang\\.com$\n(?:^|\\.)wujie\\.net$\n(?:^|\\.)wujieliulan\\.com$\n(?:^|\\.)wukangrui\\.net$\n(?:^|\\.)wuw\\.red$\n(?:^|\\.)wuyanblog\\.com$\n(?:^|\\.)wwitv\\.com$\n(?:^|\\.)www\\.ajsands\\.com$\n(?:^|\\.)www\\.americorps\\.gov$\n(?:^|\\.)www\\.antd\\.org$\n(?:^|\\.)www\\.aolnews\\.com$\n(?:^|\\.)www\\.businessinsider\\.com\\.au$\n(?:^|\\.)www\\.citizenlab\\.org$\n(?:^|\\.)www\\.cmoinc\\.org$\n(?:^|\\.)www\\.cool18\\.com$\n(?:^|\\.)www\\.dmm\\.com$\n(?:^|\\.)www\\.dwheeler\\.com$\n(?:^|\\.)www\\.eastturkistan\\.net$\n(?:^|\\.)www\\.gmiddle\\.com$\n(?:^|\\.)www\\.gmiddle\\.net$\n(?:^|\\.)www\\.hustlercash\\.com$\n(?:^|\\.)www\\.idlcoyote\\.com$\n(?:^|\\.)www\\.imdb\\.com$\n(?:^|\\.)www\\.kindleren\\.com$\n(?:^|\\.)www\\.klip\\.me$\n(?:^|\\.)www\\.lamenhu\\.com$\n(?:^|\\.)www\\.lib\\.virginia\\.edu$\n(?:^|\\.)www\\.linksalpha\\.com$\n(?:^|\\.)www\\.m-sport\\.co\\.uk$\n(?:^|\\.)www\\.metro\\.taipei$\n(?:^|\\.)www\\.monlamit\\.org$\n(?:^|\\.)www\\.moztw\\.org$\n(?:^|\\.)www\\.nbc\\.com$\n(?:^|\\.)www\\.orchidbbs\\.com$\n(?:^|\\.)www\\.owind\\.com$\n(?:^|\\.)www\\.oxid\\.it$\n(?:^|\\.)www\\.powerpointninja\\.com$\n(?:^|\\.)www\\.s4miniarchive\\.com$\n(?:^|\\.)www\\.sciencemag\\.org$\n(?:^|\\.)www\\.shadowsocks\\.com$\n(?:^|\\.)www\\.shwchurch\\.org$\n(?:^|\\.)www\\.skype\\.com$\n(?:^|\\.)www\\.tablesgenerator\\.com$\n(?:^|\\.)www\\.taiwanonline\\.cc$\n(?:^|\\.)www\\.taup\\.org\\.tw$\n(?:^|\\.)www\\.thechinastory\\.org$\n(?:^|\\.)www\\.wan-press\\.org$\n(?:^|\\.)www\\.wangruowang\\.org$\n(?:^|\\.)www\\.websnapr\\.com$\n(?:^|\\.)www\\.zensur\\.freerk\\.com$\n(?:^|\\.)www1\\.american\\.edu$\n(?:^|\\.)www1\\.biz$\n(?:^|\\.)www2\\.ohchr\\.org$\n(?:^|\\.)www2\\.rocketbbs\\.com$\n(?:^|\\.)wwwhost\\.biz$\n(?:^|\\.)wzyboy\\.im$\n(?:^|\\.)x-art\\.com$\n(?:^|\\.)x-berry\\.com$\n(?:^|\\.)x-wall\\.org$\n(?:^|\\.)x\\.company$\n(?:^|\\.)x1949x\\.com$\n(?:^|\\.)x24hr\\.com$\n(?:^|\\.)x365x\\.com$\n(?:^|\\.)xa\\.yimg\\.com$\n(?:^|\\.)xanga\\.com$\n(?:^|\\.)xbabe\\.com$\n(?:^|\\.)xbookcn\\.com$\n(?:^|\\.)xbtce\\.com$\n(?:^|\\.)xcafe\\.in$\n(?:^|\\.)xcity\\.jp$\n(?:^|\\.)xcritic\\.com$\n(?:^|\\.)xerotica\\.com$\n(?:^|\\.)xfinity\\.com$\n(?:^|\\.)xfm\\.pp\\.ru$\n(?:^|\\.)xgmyd\\.com$\n(?:^|\\.)xhamster\\.com$\n(?:^|\\.)xianba\\.net$\n(?:^|\\.)xianchawang\\.net$\n(?:^|\\.)xianjian\\.tw$\n(?:^|\\.)xianqiao\\.net$\n(?:^|\\.)xiaobaiwu\\.com$\n(?:^|\\.)xiaochuncnjp\\.com$\n(?:^|\\.)xiaod\\.in$\n(?:^|\\.)xiaohexie\\.com$\n(?:^|\\.)xiaolan\\.me$\n(?:^|\\.)xiaoma\\.org$\n(?:^|\\.)xiezhua\\.com$\n(?:^|\\.)xihua\\.es$\n(?:^|\\.)xijie\\.wordpress\\.com$\n(?:^|\\.)xing\\.com$\n(?:^|\\.)xinhuanet\\.org$\n(?:^|\\.)xinmiao\\.com\\.hk$\n(?:^|\\.)xinqimeng\\.over-blog\\.com$\n(?:^|\\.)xinsheng\\.net$\n(?:^|\\.)xinshijue\\.com$\n(?:^|\\.)xinyubbs\\.net$\n(?:^|\\.)xiongpian\\.com$\n(?:^|\\.)xiuren\\.org$\n(?:^|\\.)xizang-zhiye\\.org$\n(?:^|\\.)xjp\\.cc$\n(?:^|\\.)xjtravelguide\\.com$\n(?:^|\\.)xkiwi\\.tk$\n(?:^|\\.)xlfmtalk\\.com$\n(?:^|\\.)xlfmwz\\.info$\n(?:^|\\.)xm\\.com$\n(?:^|\\.)xml-training-guide\\.com$\n(?:^|\\.)xmovies\\.com$\n(?:^|\\.)xn--4gq171p\\.com$\n(?:^|\\.)xn--czq75pvv1aj5c\\.org$\n(?:^|\\.)xn--i2ru8q2qg\\.com$\n(?:^|\\.)xn--ngstr-lra8j\\.com$\n(?:^|\\.)xn--oiq\\.cc$\n(?:^|\\.)xn--p8j9a0d9c9a\\.xn--q9jyb4c$\n(?:^|\\.)xnxx\\.com$\n(?:^|\\.)xpdo\\.net$\n(?:^|\\.)xpud\\.org$\n(?:^|\\.)xrentdvd\\.com$\n(?:^|\\.)xskywalker\\.com$\n(?:^|\\.)xskywalker\\.net$\n(?:^|\\.)xtube\\.com$\n(?:^|\\.)xuchao\\.net$\n(?:^|\\.)xuchao\\.org$\n(?:^|\\.)xuehua\\.us$\n(?:^|\\.)xuzhiyong\\.net$\n(?:^|\\.)xvideo\\.cc$\n(?:^|\\.)xvideos\\.com$\n(?:^|\\.)xvideos\\.es$\n(?:^|\\.)xxbbx\\.com$\n(?:^|\\.)xxlmovies\\.com$\n(?:^|\\.)xxuz\\.com$\n(?:^|\\.)xxx\\.com$\n(?:^|\\.)xxx\\.xxx$\n(?:^|\\.)xxxfuckmom\\.com$\n(?:^|\\.)xxxx\\.com\\.au$\n(?:^|\\.)xxxy\\.biz$\n(?:^|\\.)xxxy\\.info$\n(?:^|\\.)xxxymovies\\.com$\n(?:^|\\.)xys\\.dxiong\\.com$\n(?:^|\\.)xys\\.org$\n(?:^|\\.)xysblogs\\.org$\n(?:^|\\.)xyy69\\.com$\n(?:^|\\.)xyy69\\.info$\n(?:^|\\.)yahoo\\.com\\.hk$\n(?:^|\\.)yakbutterblues\\.com$\n(?:^|\\.)yam\\.com$\n(?:^|\\.)yam\\.org\\.tw$\n(?:^|\\.)yanghengjun\\.com$\n(?:^|\\.)yangjianli\\.com$\n(?:^|\\.)yasni\\.co\\.uk$\n(?:^|\\.)yayabay\\.com$\n(?:^|\\.)ydy\\.com$\n(?:^|\\.)yeahteentube\\.com$\n(?:^|\\.)yecl\\.net$\n(?:^|\\.)yeelou\\.com$\n(?:^|\\.)yeeyi\\.com$\n(?:^|\\.)yegle\\.net$\n(?:^|\\.)yes-news\\.com$\n(?:^|\\.)yes\\.xxx$\n(?:^|\\.)yes123\\.com\\.tw$\n(?:^|\\.)yesasia\\.com$\n(?:^|\\.)yesasia\\.com\\.hk$\n(?:^|\\.)yespornplease\\.com$\n(?:^|\\.)yeyeclub\\.com$\n(?:^|\\.)ygto\\.com$\n(?:^|\\.)yhcw\\.net$\n(?:^|\\.)yibada\\.com$\n(?:^|\\.)yibaochina\\.com$\n(?:^|\\.)yidio\\.com$\n(?:^|\\.)yilubbs\\.com$\n(?:^|\\.)yingsuoss\\.com$\n(?:^|\\.)yinlei\\.org$\n(?:^|\\.)yipub\\.com$\n(?:^|\\.)yizhihongxing\\.com$\n(?:^|\\.)yobit\\.net$\n(?:^|\\.)yobt\\.com$\n(?:^|\\.)yobt\\.tv$\n(?:^|\\.)yogichen\\.org$\n(?:^|\\.)yolasite\\.com$\n(?:^|\\.)yomiuri\\.co\\.jp$\n(?:^|\\.)yong\\.hu$\n(?:^|\\.)yorkbbs\\.ca$\n(?:^|\\.)you-get\\.org$\n(?:^|\\.)youdontcare\\.com$\n(?:^|\\.)youjizz\\.com$\n(?:^|\\.)youmaker\\.com$\n(?:^|\\.)youngpornvideos\\.com$\n(?:^|\\.)youngspiration\\.hk$\n(?:^|\\.)youpai\\.org$\n(?:^|\\.)youporn\\.com$\n(?:^|\\.)youporngay\\.com$\n(?:^|\\.)your-freedom\\.net$\n(?:^|\\.)yourepeat\\.com$\n(?:^|\\.)yourlisten\\.com$\n(?:^|\\.)yourlust\\.com$\n(?:^|\\.)yourprivatevpn\\.com$\n(?:^|\\.)yourtrap\\.com$\n(?:^|\\.)yousendit\\.com$\n(?:^|\\.)youshun12\\.com$\n(?:^|\\.)youthnetradio\\.org$\n(?:^|\\.)youtu\\.be$\n(?:^|\\.)youtube-nocookie\\.com$\n(?:^|\\.)youtube\\.com$\n(?:^|\\.)youtubecn\\.com$\n(?:^|\\.)youtubeeducation\\.com$\n(?:^|\\.)youtubegaming\\.com$\n(?:^|\\.)youversion\\.com$\n(?:^|\\.)youwin\\.com$\n(?:^|\\.)youxu\\.info$\n(?:^|\\.)yt\\.be$\n(?:^|\\.)ytht\\.net$\n(?:^|\\.)ytimg\\.com$\n(?:^|\\.)ytn\\.co\\.kr$\n(?:^|\\.)yuanming\\.net$\n(?:^|\\.)yuanzhengtang\\.org$\n(?:^|\\.)yulghun\\.com$\n(?:^|\\.)yunchao\\.net$\n(?:^|\\.)yuntipub\\.com$\n(?:^|\\.)yuvutu\\.com$\n(?:^|\\.)yvesgeleyn\\.com$\n(?:^|\\.)ywpw\\.com$\n(?:^|\\.)yx51\\.net$\n(?:^|\\.)yyii\\.org$\n(?:^|\\.)yzzk\\.com$\n(?:^|\\.)zacebook\\.com$\n(?:^|\\.)zalmos\\.com$\n(?:^|\\.)zannel\\.com$\n(?:^|\\.)zaobao\\.com$\n(?:^|\\.)zaobao\\.com\\.sg$\n(?:^|\\.)zaozon\\.com$\n(?:^|\\.)zapto\\.org$\n(?:^|\\.)zattoo\\.com$\n(?:^|\\.)zb\\.com$\n(?:^|\\.)zdnet\\.com\\.tw$\n(?:^|\\.)zello\\.com$\n(?:^|\\.)zengjinyan\\.org$\n(?:^|\\.)zenmate\\.com$\n(?:^|\\.)zenmate\\.com\\.ru$\n(?:^|\\.)zeronet\\.io$\n(?:^|\\.)zeutch\\.com$\n(?:^|\\.)zfreet\\.com$\n(?:^|\\.)zgsddh\\.com$\n(?:^|\\.)zgzcjj\\.net$\n(?:^|\\.)zh\\.bitterwinter\\.org$\n(?:^|\\.)zh\\.ecdm\\.wikia\\.com$\n(?:^|\\.)zh\\.pokerstrategy\\.com$\n(?:^|\\.)zh\\.pttpedia\\.wikia\\.com$\n(?:^|\\.)zh\\.uncyclopedia\\.wikia\\.com$\n(?:^|\\.)zh\\.wikinews\\.org$\n(?:^|\\.)zh\\.wikisource\\.org$\n(?:^|\\.)zhanbin\\.net$\n(?:^|\\.)zhangboli\\.net$\n(?:^|\\.)zhangtianliang\\.com$\n(?:^|\\.)zhanlve\\.org$\n(?:^|\\.)zhao\\.1984\\.city$\n(?:^|\\.)zhao\\.jinhai\\.de$\n(?:^|\\.)zhenghui\\.org$\n(?:^|\\.)zhengjian\\.org$\n(?:^|\\.)zhengwunet\\.org$\n(?:^|\\.)zhenlibu\\.info$\n(?:^|\\.)zhenlibu1984\\.com$\n(?:^|\\.)zhenxiang\\.biz$\n(?:^|\\.)zhinengluyou\\.com$\n(?:^|\\.)zhongguo\\.ca$\n(?:^|\\.)zhongguorenquan\\.org$\n(?:^|\\.)zhongguotese\\.net$\n(?:^|\\.)zhongmeng\\.org$\n(?:^|\\.)zhoushuguang\\.com$\n(?:^|\\.)zhreader\\.com$\n(?:^|\\.)zhuangbi\\.me$\n(?:^|\\.)zhuanxing\\.cn$\n(?:^|\\.)zhuatieba\\.com$\n(?:^|\\.)zhuichaguoji\\.org$\n(?:^|\\.)ziddu\\.com$\n(?:^|\\.)zillionk\\.com$\n(?:^|\\.)zim\\.vn$\n(?:^|\\.)zinio\\.com$\n(?:^|\\.)ziporn\\.com$\n(?:^|\\.)zippyshare\\.com$\n(?:^|\\.)zkaip\\.com$\n(?:^|\\.)zmw\\.cn$\n(?:^|\\.)zodgame\\.us$\n(?:^|\\.)zomobo\\.net$\n(?:^|\\.)zonaeuropa\\.com$\n(?:^|\\.)zonghexinwen\\.com$\n(?:^|\\.)zonghexinwen\\.net$\n(?:^|\\.)zoogvpn\\.com$\n(?:^|\\.)zootool\\.com$\n(?:^|\\.)zoozle\\.net$\n(?:^|\\.)zorrovpn\\.com$\n(?:^|\\.)zozotown\\.com$\n(?:^|\\.)zpn\\.im$\n(?:^|\\.)zspeeder\\.me$\n(?:^|\\.)zsrhao\\.com$\n(?:^|\\.)zuo\\.la$\n(?:^|\\.)zuobiao\\.me$\n(?:^|\\.)zuola\\.com$\n(?:^|\\.)zvereff\\.com$\n(?:^|\\.)zynaima\\.com$\n(?:^|\\.)zynamics\\.com$\n(?:^|\\.)zyns\\.com$\n(?:^|\\.)zyzc9\\.com$\n(?:^|\\.)zzcartoon\\.com$\n(?:^|\\.)zzcloud\\.me$\n(?:^|\\.)zzux\\.com$\n"
  },
  {
    "path": "core/src/main/assets/acl/bypass-lan-china.acl",
    "content": "[proxy_all]\n\n[bypass_list]\n0.0.0.0/8\n10.0.0.0/8\n100.64.0.0/10\n127.0.0.0/8\n169.254.0.0/16\n172.16.0.0/12\n192.0.0.0/24\n192.0.2.0/24\n192.31.196.0/24\n192.52.193.0/24\n192.88.99.0/24\n192.168.0.0/16\n192.175.48.0/24\n198.18.0.0/15\n198.51.100.0/24\n203.0.113.0/24\n224.0.0.0/3\n1.0.1.0/24\n1.0.2.0/23\n1.0.8.0/21\n1.0.32.0/19\n1.1.0.0/24\n1.1.2.0/23\n1.1.4.0/22\n1.1.8.0/21\n1.1.16.0/20\n1.1.32.0/19\n1.2.0.0/23\n1.2.2.0/24\n1.2.4.0/22\n1.2.8.0/21\n1.2.16.0/20\n1.2.32.0/19\n1.2.64.0/18\n1.3.0.0/16\n1.4.1.0/24\n1.4.2.0/23\n1.4.4.0/22\n1.4.8.0/21\n1.4.16.0/20\n1.4.32.0/19\n1.4.64.0/18\n1.8.0.0/16\n1.10.0.0/21\n1.10.8.0/23\n1.10.11.0/24\n1.10.12.0/22\n1.10.16.0/20\n1.10.32.0/19\n1.10.64.0/18\n1.12.0.0/14\n1.24.0.0/13\n1.45.0.0/16\n1.48.0.0/14\n1.56.0.0/13\n1.68.0.0/14\n1.80.0.0/12\n1.116.0.0/14\n1.180.0.0/14\n1.184.0.0/15\n1.188.0.0/14\n1.192.0.0/13\n1.202.0.0/15\n1.204.0.0/14\n14.0.0.0/21\n14.0.12.0/22\n14.1.0.0/22\n14.1.24.0/22\n14.1.96.0/22\n14.1.108.0/22\n14.16.0.0/12\n14.102.128.0/22\n14.102.156.0/22\n14.102.180.0/22\n14.103.0.0/16\n14.104.0.0/13\n14.112.0.0/12\n14.130.0.0/15\n14.134.0.0/15\n14.144.0.0/12\n14.192.60.0/22\n14.192.76.0/22\n14.196.0.0/15\n14.204.0.0/15\n14.208.0.0/12\n27.0.128.0/21\n27.0.160.0/21\n27.0.188.0/22\n27.0.204.0/22\n27.0.208.0/21\n27.8.0.0/13\n27.16.0.0/12\n27.34.232.0/21\n27.36.0.0/14\n27.40.0.0/13\n27.50.40.0/21\n27.50.128.0/17\n27.54.72.0/21\n27.54.152.0/21\n27.54.192.0/18\n27.98.208.0/20\n27.98.224.0/19\n27.99.128.0/17\n27.103.0.0/16\n27.106.128.0/18\n27.106.204.0/22\n27.109.32.0/19\n27.109.124.0/22\n27.112.0.0/18\n27.112.80.0/20\n27.112.112.0/21\n27.113.128.0/18\n27.115.0.0/17\n27.116.44.0/22\n27.121.72.0/21\n27.121.120.0/21\n27.128.0.0/15\n27.131.220.0/22\n27.144.0.0/16\n27.148.0.0/14\n27.152.0.0/13\n27.184.0.0/13\n27.192.0.0/11\n27.224.0.0/14\n36.0.0.0/22\n36.0.8.0/21\n36.0.16.0/20\n36.0.32.0/19\n36.0.64.0/18\n36.0.128.0/17\n36.1.0.0/16\n36.4.0.0/14\n36.16.0.0/12\n36.32.0.0/14\n36.36.0.0/16\n36.37.0.0/19\n36.37.36.0/23\n36.37.39.0/24\n36.37.40.0/21\n36.37.48.0/20\n36.40.0.0/13\n36.48.0.0/15\n36.51.0.0/16\n36.56.0.0/13\n36.96.0.0/11\n36.128.0.0/10\n36.192.0.0/11\n36.248.0.0/14\n36.254.0.0/16\n36.255.116.0/22\n36.255.128.0/22\n36.255.164.0/22\n36.255.172.0/22\n36.255.176.0/22\n39.0.0.0/24\n39.0.2.0/23\n39.0.4.0/22\n39.0.8.0/21\n39.0.16.0/20\n39.0.32.0/19\n39.0.64.0/18\n39.0.128.0/17\n39.64.0.0/11\n39.96.0.0/13\n39.104.0.0/14\n39.108.0.0/16\n39.128.0.0/10\n40.72.0.0/15\n40.125.128.0/17\n40.126.64.0/18\n42.0.0.0/22\n42.0.8.0/21\n42.0.16.0/21\n42.0.24.0/22\n42.0.32.0/19\n42.0.128.0/17\n42.1.0.0/19\n42.1.32.0/20\n42.1.48.0/21\n42.1.56.0/22\n42.1.128.0/17\n42.4.0.0/14\n42.48.0.0/13\n42.56.0.0/14\n42.62.0.0/17\n42.62.128.0/19\n42.62.160.0/20\n42.62.180.0/22\n42.62.184.0/21\n42.63.0.0/16\n42.80.0.0/15\n42.83.64.0/20\n42.83.80.0/22\n42.83.88.0/21\n42.83.96.0/19\n42.83.128.0/17\n42.84.0.0/14\n42.88.0.0/13\n42.96.64.0/19\n42.96.96.0/21\n42.96.108.0/22\n42.96.112.0/20\n42.96.128.0/17\n42.97.0.0/16\n42.99.0.0/18\n42.99.64.0/19\n42.99.96.0/20\n42.99.112.0/22\n42.99.120.0/21\n42.100.0.0/14\n42.120.0.0/15\n42.122.0.0/16\n42.123.0.0/19\n42.123.36.0/22\n42.123.40.0/21\n42.123.48.0/20\n42.123.64.0/18\n42.123.128.0/17\n42.128.0.0/12\n42.156.0.0/19\n42.156.36.0/22\n42.156.40.0/21\n42.156.48.0/20\n42.156.64.0/18\n42.156.128.0/17\n42.157.0.0/16\n42.158.0.0/15\n42.160.0.0/12\n42.176.0.0/13\n42.184.0.0/15\n42.186.0.0/16\n42.187.0.0/18\n42.187.64.0/19\n42.187.96.0/20\n42.187.112.0/21\n42.187.120.0/22\n42.187.128.0/17\n42.192.0.0/13\n42.201.0.0/17\n42.202.0.0/15\n42.204.0.0/14\n42.208.0.0/12\n42.224.0.0/12\n42.240.0.0/16\n42.242.0.0/15\n42.244.0.0/14\n42.248.0.0/13\n43.224.12.0/22\n43.224.24.0/22\n43.224.44.0/22\n43.224.52.0/22\n43.224.56.0/22\n43.224.64.0/21\n43.224.72.0/22\n43.224.80.0/22\n43.224.100.0/22\n43.224.144.0/22\n43.224.160.0/22\n43.224.176.0/22\n43.224.184.0/22\n43.224.200.0/21\n43.224.208.0/21\n43.224.216.0/22\n43.224.240.0/22\n43.225.76.0/22\n43.225.84.0/22\n43.225.120.0/21\n43.225.140.0/22\n43.225.172.0/22\n43.225.180.0/22\n43.225.208.0/22\n43.225.216.0/21\n43.225.224.0/20\n43.225.240.0/21\n43.225.252.0/22\n43.226.32.0/19\n43.226.64.0/19\n43.226.96.0/20\n43.226.112.0/21\n43.226.120.0/22\n43.226.128.0/18\n43.226.192.0/20\n43.226.208.0/21\n43.226.236.0/22\n43.226.240.0/20\n43.227.0.0/21\n43.227.8.0/22\n43.227.32.0/19\n43.227.64.0/19\n43.227.96.0/21\n43.227.104.0/22\n43.227.136.0/21\n43.227.144.0/22\n43.227.152.0/21\n43.227.160.0/20\n43.227.176.0/21\n43.227.188.0/22\n43.227.192.0/19\n43.227.232.0/22\n43.227.248.0/21\n43.228.0.0/18\n43.228.64.0/21\n43.228.76.0/22\n43.228.100.0/22\n43.228.116.0/22\n43.228.120.0/22\n43.228.132.0/22\n43.228.136.0/22\n43.228.148.0/22\n43.228.152.0/22\n43.228.188.0/22\n43.229.40.0/22\n43.229.48.0/22\n43.229.56.0/22\n43.229.96.0/22\n43.229.120.0/22\n43.229.136.0/21\n43.229.144.0/22\n43.229.168.0/21\n43.229.176.0/20\n43.229.192.0/21\n43.229.216.0/21\n43.229.232.0/21\n43.230.20.0/22\n43.230.32.0/22\n43.230.68.0/22\n43.230.72.0/22\n43.230.84.0/22\n43.230.124.0/22\n43.230.136.0/22\n43.230.168.0/22\n43.230.220.0/22\n43.230.224.0/19\n43.231.32.0/20\n43.231.80.0/20\n43.231.96.0/20\n43.231.136.0/21\n43.231.144.0/20\n43.231.160.0/20\n43.231.176.0/21\n43.236.0.0/15\n43.238.0.0/16\n43.239.0.0/19\n43.239.32.0/20\n43.239.48.0/22\n43.239.116.0/22\n43.239.120.0/22\n43.239.172.0/22\n43.239.176.0/22\n43.240.0.0/22\n43.240.56.0/21\n43.240.68.0/22\n43.240.72.0/21\n43.240.84.0/22\n43.240.124.0/22\n43.240.128.0/21\n43.240.136.0/22\n43.240.144.0/22\n43.240.156.0/22\n43.240.160.0/19\n43.240.192.0/19\n43.240.236.0/22\n43.240.240.0/20\n43.241.0.0/20\n43.241.16.0/21\n43.241.48.0/22\n43.241.76.0/22\n43.241.80.0/20\n43.241.112.0/22\n43.241.168.0/21\n43.241.176.0/21\n43.241.184.0/22\n43.241.196.0/22\n43.241.208.0/20\n43.241.224.0/20\n43.241.240.0/22\n43.241.248.0/21\n43.242.8.0/21\n43.242.16.0/20\n43.242.44.0/22\n43.242.48.0/20\n43.242.64.0/22\n43.242.72.0/21\n43.242.80.0/20\n43.242.96.0/22\n43.242.144.0/20\n43.242.160.0/21\n43.242.168.0/22\n43.242.180.0/22\n43.242.188.0/22\n43.242.192.0/21\n43.242.204.0/22\n43.242.216.0/21\n43.242.252.0/22\n43.243.4.0/22\n43.243.8.0/21\n43.243.16.0/22\n43.243.24.0/22\n43.243.88.0/22\n43.243.128.0/22\n43.243.136.0/22\n43.243.144.0/21\n43.243.156.0/22\n43.243.168.0/22\n43.243.180.0/22\n43.243.188.0/22\n43.243.228.0/22\n43.243.232.0/22\n43.243.244.0/22\n43.246.0.0/18\n43.246.64.0/19\n43.246.96.0/22\n43.246.112.0/22\n43.246.212.0/22\n43.246.228.0/22\n43.247.4.0/22\n43.247.8.0/22\n43.247.44.0/22\n43.247.48.0/22\n43.247.68.0/22\n43.247.76.0/22\n43.247.84.0/22\n43.247.88.0/21\n43.247.96.0/21\n43.247.108.0/22\n43.247.112.0/22\n43.247.148.0/22\n43.247.152.0/22\n43.247.176.0/20\n43.247.196.0/22\n43.247.200.0/21\n43.247.208.0/20\n43.247.224.0/19\n43.248.0.0/21\n43.248.20.0/22\n43.248.28.0/22\n43.248.48.0/22\n43.248.76.0/22\n43.248.80.0/20\n43.248.96.0/19\n43.248.128.0/20\n43.248.144.0/21\n43.248.176.0/20\n43.248.192.0/20\n43.248.208.0/22\n43.248.228.0/22\n43.248.232.0/22\n43.248.244.0/22\n43.249.4.0/22\n43.249.8.0/22\n43.249.120.0/22\n43.249.132.0/22\n43.249.136.0/22\n43.249.144.0/20\n43.249.160.0/21\n43.249.168.0/22\n43.249.192.0/22\n43.249.236.0/22\n43.250.4.0/22\n43.250.12.0/22\n43.250.16.0/21\n43.250.28.0/22\n43.250.32.0/21\n43.250.72.0/22\n43.250.96.0/20\n43.250.112.0/21\n43.250.128.0/22\n43.250.144.0/21\n43.250.160.0/22\n43.250.168.0/21\n43.250.176.0/22\n43.250.200.0/22\n43.250.212.0/22\n43.250.216.0/21\n43.250.236.0/22\n43.250.244.0/22\n43.251.4.0/22\n43.251.8.0/21\n43.251.36.0/22\n43.251.100.0/22\n43.251.116.0/22\n43.251.192.0/22\n43.251.232.0/21\n43.251.244.0/22\n43.252.40.0/22\n43.252.48.0/22\n43.252.56.0/22\n43.252.224.0/22\n43.254.0.0/21\n43.254.8.0/22\n43.254.24.0/22\n43.254.36.0/22\n43.254.44.0/22\n43.254.52.0/22\n43.254.64.0/22\n43.254.72.0/22\n43.254.84.0/22\n43.254.88.0/21\n43.254.100.0/22\n43.254.104.0/22\n43.254.112.0/21\n43.254.128.0/22\n43.254.136.0/21\n43.254.144.0/20\n43.254.168.0/21\n43.254.180.0/22\n43.254.184.0/21\n43.254.192.0/21\n43.254.200.0/22\n43.254.208.0/22\n43.254.220.0/22\n43.254.224.0/20\n43.254.240.0/22\n43.254.248.0/21\n43.255.0.0/21\n43.255.8.0/22\n43.255.16.0/22\n43.255.48.0/22\n43.255.64.0/20\n43.255.84.0/22\n43.255.96.0/22\n43.255.108.0/22\n43.255.144.0/22\n43.255.168.0/22\n43.255.176.0/22\n43.255.184.0/22\n43.255.192.0/22\n43.255.200.0/21\n43.255.208.0/21\n43.255.224.0/21\n43.255.232.0/22\n43.255.244.0/22\n45.40.192.0/18\n45.65.16.0/20\n45.112.132.0/22\n45.112.188.0/22\n45.112.208.0/20\n45.112.228.0/22\n45.112.232.0/21\n45.113.12.0/22\n45.113.16.0/20\n45.113.40.0/22\n45.113.52.0/22\n45.113.56.0/22\n45.113.72.0/22\n45.113.144.0/21\n45.113.168.0/22\n45.113.176.0/22\n45.113.184.0/22\n45.113.200.0/21\n45.113.208.0/20\n45.113.240.0/22\n45.113.252.0/22\n45.114.0.0/22\n45.114.12.0/22\n45.114.32.0/22\n45.114.40.0/22\n45.114.52.0/22\n45.114.96.0/22\n45.114.104.0/21\n45.114.124.0/22\n45.114.136.0/22\n45.114.196.0/22\n45.114.200.0/22\n45.114.228.0/22\n45.114.252.0/22\n45.115.44.0/22\n45.115.100.0/22\n45.115.120.0/22\n45.115.132.0/22\n45.115.144.0/22\n45.115.156.0/22\n45.115.164.0/22\n45.115.200.0/22\n45.115.212.0/22\n45.115.228.0/22\n45.115.236.0/22\n45.115.244.0/22\n45.115.248.0/22\n45.116.12.0/22\n45.116.16.0/22\n45.116.24.0/22\n45.116.32.0/21\n45.116.52.0/22\n45.116.96.0/21\n45.116.140.0/22\n45.116.152.0/22\n45.116.208.0/22\n45.117.8.0/22\n45.117.20.0/22\n45.117.68.0/22\n45.117.124.0/22\n45.117.252.0/22\n45.119.52.0/22\n45.119.60.0/22\n45.119.64.0/21\n45.119.72.0/22\n45.119.104.0/22\n45.119.116.0/22\n45.119.232.0/22\n45.120.100.0/22\n45.120.140.0/22\n45.120.164.0/22\n45.120.220.0/22\n45.120.240.0/22\n45.121.20.0/22\n45.121.52.0/22\n45.121.64.0/21\n45.121.72.0/22\n45.121.92.0/22\n45.121.96.0/22\n45.121.172.0/22\n45.121.176.0/22\n45.121.212.0/22\n45.121.240.0/20\n45.122.0.0/19\n45.122.32.0/21\n45.122.40.0/22\n45.122.60.0/22\n45.122.64.0/19\n45.122.96.0/20\n45.122.112.0/21\n45.122.160.0/19\n45.122.192.0/20\n45.122.208.0/21\n45.122.216.0/22\n45.123.28.0/22\n45.123.32.0/21\n45.123.44.0/22\n45.123.48.0/20\n45.123.64.0/20\n45.123.80.0/21\n45.123.88.0/22\n45.123.120.0/22\n45.123.128.0/21\n45.123.136.0/22\n45.123.148.0/22\n45.123.152.0/21\n45.123.164.0/22\n45.123.168.0/21\n45.123.176.0/21\n45.123.184.0/22\n45.123.204.0/22\n45.123.212.0/22\n45.123.224.0/19\n45.124.0.0/22\n45.124.20.0/22\n45.124.28.0/22\n45.124.32.0/21\n45.124.44.0/22\n45.124.68.0/22\n45.124.76.0/22\n45.124.80.0/22\n45.124.100.0/22\n45.124.124.0/22\n45.124.172.0/22\n45.124.176.0/22\n45.124.208.0/22\n45.124.248.0/22\n45.125.12.0/22\n45.125.16.0/22\n45.125.24.0/21\n45.125.32.0/22\n45.125.44.0/22\n45.125.52.0/22\n45.125.56.0/22\n45.125.76.0/22\n45.125.80.0/20\n45.125.96.0/21\n45.125.104.0/22\n45.125.136.0/22\n45.126.48.0/21\n45.126.100.0/22\n45.126.108.0/22\n45.126.112.0/21\n45.126.120.0/22\n45.126.212.0/22\n45.126.220.0/22\n45.127.8.0/21\n45.127.96.0/22\n45.127.116.0/22\n45.127.124.0/22\n45.127.128.0/22\n45.127.144.0/21\n45.127.156.0/22\n45.127.216.0/22\n45.248.8.0/22\n45.248.80.0/21\n45.248.88.0/22\n45.248.96.0/20\n45.248.128.0/21\n45.248.204.0/22\n45.248.208.0/20\n45.248.224.0/19\n45.249.0.0/21\n45.249.12.0/22\n45.249.16.0/20\n45.249.32.0/21\n45.249.92.0/22\n45.249.112.0/22\n45.249.180.0/22\n45.249.188.0/22\n45.249.192.0/20\n45.249.208.0/21\n45.250.12.0/22\n45.250.16.0/22\n45.250.28.0/22\n45.250.32.0/21\n45.250.40.0/22\n45.250.76.0/22\n45.250.80.0/20\n45.250.96.0/22\n45.250.104.0/21\n45.250.112.0/20\n45.250.128.0/20\n45.250.144.0/21\n45.250.152.0/22\n45.250.164.0/22\n45.250.180.0/22\n45.250.184.0/21\n45.250.192.0/22\n45.251.0.0/22\n45.251.8.0/22\n45.251.16.0/21\n45.251.52.0/22\n45.251.84.0/22\n45.251.88.0/21\n45.251.96.0/21\n45.251.120.0/21\n45.251.136.0/21\n45.251.144.0/20\n45.251.160.0/19\n45.251.192.0/19\n45.251.224.0/22\n45.251.240.0/22\n45.252.0.0/19\n45.252.32.0/20\n45.252.48.0/22\n45.252.60.0/22\n45.252.84.0/22\n45.252.88.0/21\n45.252.96.0/19\n45.252.128.0/19\n45.252.160.0/20\n45.252.176.0/22\n45.252.192.0/19\n45.252.224.0/21\n45.252.232.0/22\n45.253.0.0/18\n45.253.64.0/20\n45.253.80.0/21\n45.253.92.0/22\n45.253.96.0/20\n45.253.112.0/21\n45.253.120.0/22\n45.253.132.0/22\n45.253.136.0/21\n45.253.144.0/20\n45.253.160.0/19\n45.253.192.0/19\n45.253.224.0/20\n45.253.240.0/22\n45.254.0.0/19\n45.254.40.0/22\n45.254.48.0/20\n45.254.64.0/18\n45.254.128.0/18\n45.254.192.0/19\n45.254.224.0/21\n45.254.236.0/22\n45.254.240.0/22\n45.254.248.0/22\n45.255.0.0/17\n45.255.132.0/22\n45.255.136.0/21\n45.255.144.0/20\n45.255.160.0/19\n45.255.192.0/19\n45.255.224.0/20\n45.255.240.0/21\n45.255.248.0/22\n47.92.0.0/14\n47.96.0.0/11\n49.4.0.0/14\n49.51.0.0/16\n49.52.0.0/14\n49.64.0.0/11\n49.112.0.0/13\n49.120.0.0/14\n49.128.0.0/24\n49.128.2.0/23\n49.128.4.0/22\n49.140.0.0/15\n49.152.0.0/14\n49.208.0.0/14\n49.220.0.0/14\n49.232.0.0/14\n49.239.0.0/18\n49.239.192.0/18\n49.246.224.0/19\n52.80.0.0/14\n52.130.0.0/15\n54.222.0.0/15\n58.14.0.0/15\n58.16.0.0/13\n58.24.0.0/15\n58.30.0.0/15\n58.32.0.0/11\n58.65.232.0/21\n58.66.0.0/15\n58.68.128.0/17\n58.82.0.0/17\n58.83.0.0/16\n58.87.64.0/18\n58.99.128.0/17\n58.100.0.0/15\n58.116.0.0/14\n58.128.0.0/13\n58.144.0.0/16\n58.154.0.0/15\n58.192.0.0/11\n58.240.0.0/12\n59.32.0.0/11\n59.64.0.0/12\n59.80.0.0/14\n59.107.0.0/16\n59.108.0.0/14\n59.151.0.0/17\n59.152.16.0/20\n59.152.32.0/21\n59.152.64.0/20\n59.152.112.0/21\n59.153.4.0/22\n59.153.32.0/22\n59.153.60.0/22\n59.153.64.0/21\n59.153.72.0/22\n59.153.92.0/22\n59.153.116.0/22\n59.153.136.0/22\n59.153.152.0/21\n59.153.164.0/22\n59.153.168.0/21\n59.153.176.0/20\n59.153.192.0/22\n59.155.0.0/16\n59.172.0.0/14\n59.191.0.0/17\n59.191.240.0/20\n59.192.0.0/10\n60.0.0.0/11\n60.55.0.0/16\n60.63.0.0/16\n60.160.0.0/11\n60.194.0.0/15\n60.200.0.0/13\n60.208.0.0/12\n60.232.0.0/15\n60.235.0.0/16\n60.245.128.0/17\n60.247.0.0/16\n60.252.0.0/16\n60.253.128.0/17\n60.255.0.0/16\n61.4.80.0/20\n61.4.176.0/20\n61.8.160.0/20\n61.14.212.0/22\n61.14.216.0/21\n61.14.240.0/21\n61.28.0.0/17\n61.29.128.0/18\n61.29.192.0/19\n61.29.224.0/20\n61.45.128.0/18\n61.45.224.0/20\n61.47.128.0/18\n61.48.0.0/13\n61.87.192.0/18\n61.128.0.0/10\n61.232.0.0/14\n61.236.0.0/15\n61.240.0.0/14\n62.234.0.0/16\n68.79.0.0/18\n69.230.192.0/18\n69.231.128.0/18\n69.234.192.0/18\n69.235.128.0/18\n71.131.192.0/18\n71.132.0.0/18\n71.136.64.0/18\n71.137.0.0/18\n81.68.0.0/14\n82.156.0.0/15\n91.234.36.0/24\n94.191.0.0/17\n101.0.0.0/22\n101.1.0.0/22\n101.2.172.0/22\n101.4.0.0/14\n101.16.0.0/12\n101.33.128.0/17\n101.34.0.0/15\n101.36.0.0/14\n101.40.0.0/13\n101.48.0.0/15\n101.50.8.0/21\n101.50.56.0/22\n101.52.0.0/16\n101.53.100.0/22\n101.54.0.0/16\n101.55.224.0/21\n101.64.0.0/13\n101.72.0.0/14\n101.76.0.0/15\n101.78.0.0/22\n101.78.32.0/19\n101.80.0.0/12\n101.96.0.0/21\n101.96.8.0/22\n101.96.16.0/20\n101.96.128.0/17\n101.99.96.0/19\n101.101.64.0/19\n101.101.100.0/24\n101.101.102.0/23\n101.101.104.0/21\n101.101.112.0/20\n101.102.64.0/19\n101.102.100.0/23\n101.102.102.0/24\n101.102.104.0/21\n101.102.112.0/20\n101.104.0.0/14\n101.110.64.0/19\n101.110.96.0/20\n101.110.116.0/22\n101.110.120.0/21\n101.120.0.0/14\n101.124.0.0/15\n101.126.0.0/16\n101.128.0.0/22\n101.128.8.0/21\n101.128.16.0/20\n101.128.32.0/19\n101.129.0.0/16\n101.130.0.0/15\n101.132.0.0/14\n101.144.0.0/12\n101.192.0.0/13\n101.200.0.0/15\n101.203.128.0/19\n101.203.160.0/21\n101.203.172.0/22\n101.203.176.0/20\n101.204.0.0/14\n101.224.0.0/13\n101.232.0.0/15\n101.234.64.0/21\n101.234.76.0/22\n101.234.80.0/20\n101.234.96.0/19\n101.236.0.0/14\n101.240.0.0/13\n101.248.0.0/15\n101.251.0.0/22\n101.251.8.0/21\n101.251.16.0/20\n101.251.32.0/19\n101.251.64.0/18\n101.251.128.0/17\n101.252.0.0/15\n101.254.0.0/16\n103.1.8.0/22\n103.1.20.0/22\n103.1.24.0/22\n103.1.72.0/22\n103.1.88.0/22\n103.1.168.0/22\n103.2.108.0/22\n103.2.156.0/22\n103.2.164.0/22\n103.2.200.0/21\n103.2.208.0/21\n103.3.84.0/22\n103.3.88.0/21\n103.3.96.0/19\n103.3.128.0/20\n103.3.148.0/22\n103.3.152.0/21\n103.4.56.0/22\n103.4.168.0/22\n103.4.184.0/22\n103.4.224.0/22\n103.5.36.0/22\n103.5.52.0/22\n103.5.56.0/22\n103.5.152.0/22\n103.5.168.0/22\n103.5.192.0/22\n103.5.252.0/22\n103.6.76.0/22\n103.6.108.0/22\n103.6.220.0/22\n103.6.228.0/22\n103.7.4.0/22\n103.7.28.0/22\n103.7.140.0/22\n103.7.212.0/22\n103.7.216.0/21\n103.8.0.0/21\n103.8.8.0/22\n103.8.32.0/22\n103.8.52.0/22\n103.8.68.0/22\n103.8.108.0/22\n103.8.156.0/22\n103.8.200.0/21\n103.8.220.0/22\n103.9.8.0/22\n103.9.24.0/22\n103.9.108.0/22\n103.9.152.0/22\n103.9.192.0/22\n103.9.248.0/21\n103.10.0.0/22\n103.10.16.0/22\n103.10.84.0/22\n103.10.140.0/22\n103.11.16.0/22\n103.11.168.0/22\n103.11.180.0/22\n103.12.32.0/22\n103.12.68.0/22\n103.12.92.0/22\n103.12.136.0/22\n103.12.184.0/22\n103.12.232.0/22\n103.13.12.0/22\n103.13.124.0/22\n103.13.144.0/22\n103.13.196.0/22\n103.13.220.0/22\n103.13.244.0/22\n103.14.32.0/22\n103.14.84.0/22\n103.14.100.0/22\n103.14.132.0/22\n103.14.136.0/22\n103.14.156.0/22\n103.14.240.0/22\n103.15.4.0/22\n103.15.8.0/22\n103.15.16.0/22\n103.15.96.0/22\n103.15.200.0/22\n103.16.52.0/22\n103.16.80.0/21\n103.16.88.0/22\n103.16.108.0/22\n103.16.124.0/22\n103.17.40.0/22\n103.17.64.0/22\n103.17.120.0/22\n103.17.136.0/22\n103.17.160.0/22\n103.17.204.0/22\n103.17.228.0/22\n103.18.192.0/22\n103.18.208.0/21\n103.18.224.0/22\n103.19.0.0/22\n103.19.12.0/22\n103.19.40.0/21\n103.19.64.0/21\n103.19.72.0/22\n103.19.232.0/22\n103.20.12.0/22\n103.20.32.0/22\n103.20.44.0/22\n103.20.68.0/22\n103.20.112.0/22\n103.20.128.0/22\n103.20.160.0/22\n103.20.248.0/22\n103.21.112.0/21\n103.21.136.0/21\n103.21.176.0/22\n103.21.208.0/22\n103.21.240.0/22\n103.22.0.0/18\n103.22.64.0/19\n103.22.100.0/22\n103.22.104.0/21\n103.22.112.0/20\n103.22.188.0/22\n103.22.228.0/22\n103.22.252.0/22\n103.23.8.0/22\n103.23.56.0/22\n103.23.160.0/21\n103.23.176.0/22\n103.23.228.0/22\n103.24.24.0/22\n103.24.116.0/22\n103.24.128.0/22\n103.24.144.0/22\n103.24.176.0/22\n103.24.184.0/22\n103.24.220.0/22\n103.24.228.0/22\n103.24.248.0/21\n103.25.8.0/23\n103.25.20.0/22\n103.25.24.0/21\n103.25.32.0/21\n103.25.40.0/22\n103.25.48.0/22\n103.25.64.0/21\n103.25.148.0/22\n103.25.156.0/22\n103.25.216.0/22\n103.26.0.0/22\n103.26.64.0/22\n103.26.76.0/22\n103.26.132.0/22\n103.26.156.0/22\n103.26.160.0/22\n103.26.228.0/22\n103.26.240.0/22\n103.27.4.0/22\n103.27.12.0/22\n103.27.24.0/22\n103.27.56.0/22\n103.27.96.0/22\n103.27.184.0/22\n103.27.208.0/21\n103.27.240.0/22\n103.28.4.0/22\n103.28.8.0/22\n103.28.184.0/22\n103.28.204.0/22\n103.28.212.0/22\n103.29.16.0/22\n103.29.128.0/21\n103.29.136.0/22\n103.30.20.0/22\n103.30.96.0/22\n103.30.148.0/22\n103.30.200.0/22\n103.30.228.0/22\n103.30.236.0/22\n103.31.0.0/22\n103.31.48.0/20\n103.31.64.0/21\n103.31.148.0/22\n103.31.160.0/22\n103.31.168.0/22\n103.31.200.0/22\n103.31.236.0/22\n103.32.0.0/15\n103.34.0.0/16\n103.35.0.0/19\n103.35.32.0/20\n103.35.48.0/22\n103.35.104.0/22\n103.35.116.0/22\n103.35.180.0/22\n103.35.200.0/22\n103.35.220.0/22\n103.36.28.0/22\n103.36.36.0/22\n103.36.56.0/21\n103.36.64.0/22\n103.36.72.0/22\n103.36.96.0/22\n103.36.132.0/22\n103.36.136.0/22\n103.36.160.0/19\n103.36.192.0/19\n103.36.224.0/20\n103.36.240.0/21\n103.37.0.0/22\n103.37.12.0/22\n103.37.16.0/22\n103.37.24.0/22\n103.37.44.0/22\n103.37.52.0/22\n103.37.56.0/22\n103.37.72.0/22\n103.37.100.0/22\n103.37.104.0/22\n103.37.124.0/22\n103.37.136.0/21\n103.37.144.0/20\n103.37.160.0/21\n103.37.172.0/22\n103.37.176.0/22\n103.37.188.0/22\n103.37.208.0/20\n103.37.248.0/21\n103.38.0.0/22\n103.38.32.0/22\n103.38.40.0/21\n103.38.56.0/22\n103.38.76.0/22\n103.38.84.0/22\n103.38.92.0/22\n103.38.96.0/22\n103.38.116.0/22\n103.38.132.0/22\n103.38.140.0/22\n103.38.224.0/21\n103.38.232.0/22\n103.38.252.0/22\n103.39.16.0/22\n103.39.64.0/22\n103.39.88.0/22\n103.39.100.0/22\n103.39.104.0/21\n103.39.160.0/19\n103.39.200.0/21\n103.39.208.0/20\n103.39.224.0/21\n103.39.232.0/22\n103.40.12.0/22\n103.40.16.0/20\n103.40.32.0/20\n103.40.88.0/22\n103.40.100.0/22\n103.40.192.0/22\n103.40.212.0/22\n103.40.220.0/22\n103.40.228.0/22\n103.40.232.0/21\n103.40.240.0/20\n103.41.0.0/22\n103.41.16.0/22\n103.41.52.0/22\n103.41.140.0/22\n103.41.148.0/22\n103.41.152.0/22\n103.41.160.0/21\n103.41.220.0/22\n103.41.224.0/21\n103.41.232.0/22\n103.42.8.0/22\n103.42.24.0/21\n103.42.32.0/22\n103.42.64.0/21\n103.42.76.0/22\n103.42.104.0/22\n103.42.180.0/22\n103.42.232.0/22\n103.43.16.0/22\n103.43.84.0/22\n103.43.96.0/21\n103.43.104.0/22\n103.43.124.0/22\n103.43.184.0/22\n103.43.192.0/21\n103.43.208.0/22\n103.43.220.0/22\n103.43.224.0/22\n103.43.232.0/22\n103.43.240.0/22\n103.44.56.0/22\n103.44.80.0/22\n103.44.88.0/22\n103.44.120.0/21\n103.44.132.0/22\n103.44.144.0/22\n103.44.168.0/22\n103.44.176.0/20\n103.44.192.0/20\n103.44.224.0/22\n103.44.236.0/22\n103.44.240.0/20\n103.45.0.0/18\n103.45.72.0/21\n103.45.80.0/20\n103.45.96.0/19\n103.45.128.0/18\n103.45.192.0/19\n103.45.224.0/22\n103.45.248.0/22\n103.46.0.0/22\n103.46.12.0/22\n103.46.16.0/20\n103.46.32.0/19\n103.46.64.0/18\n103.46.128.0/21\n103.46.136.0/22\n103.46.152.0/21\n103.46.160.0/20\n103.46.176.0/21\n103.46.244.0/22\n103.46.248.0/22\n103.47.4.0/22\n103.47.20.0/22\n103.47.36.0/22\n103.47.40.0/22\n103.47.48.0/22\n103.47.80.0/22\n103.47.96.0/22\n103.47.108.0/22\n103.47.116.0/22\n103.47.120.0/22\n103.47.136.0/21\n103.47.212.0/22\n103.48.52.0/22\n103.48.92.0/22\n103.48.144.0/20\n103.48.202.0/23\n103.48.216.0/21\n103.48.224.0/20\n103.48.240.0/21\n103.49.12.0/22\n103.49.20.0/22\n103.49.72.0/21\n103.49.92.0/22\n103.49.96.0/22\n103.49.108.0/22\n103.49.128.0/22\n103.49.176.0/21\n103.49.196.0/22\n103.49.248.0/22\n103.50.36.0/22\n103.50.44.0/22\n103.50.48.0/20\n103.50.64.0/21\n103.50.72.0/22\n103.50.108.0/22\n103.50.112.0/20\n103.50.132.0/22\n103.50.136.0/21\n103.50.172.0/22\n103.50.176.0/20\n103.50.192.0/21\n103.50.200.0/22\n103.50.220.0/22\n103.50.224.0/20\n103.50.240.0/21\n103.50.248.0/22\n103.52.40.0/22\n103.52.72.0/21\n103.52.80.0/21\n103.52.96.0/21\n103.52.104.0/22\n103.52.160.0/21\n103.52.172.0/22\n103.52.176.0/22\n103.52.184.0/22\n103.52.196.0/22\n103.53.4.0/22\n103.53.64.0/21\n103.53.92.0/22\n103.53.100.0/22\n103.53.124.0/22\n103.53.128.0/20\n103.53.144.0/22\n103.53.180.0/22\n103.53.204.0/22\n103.53.208.0/21\n103.53.216.0/22\n103.53.236.0/22\n103.53.248.0/22\n103.54.8.0/22\n103.54.48.0/22\n103.54.60.0/22\n103.54.160.0/21\n103.54.212.0/22\n103.54.240.0/22\n103.55.24.0/22\n103.55.80.0/22\n103.55.120.0/22\n103.55.152.0/22\n103.55.172.0/22\n103.55.204.0/22\n103.55.208.0/22\n103.55.228.0/22\n103.55.236.0/22\n103.56.8.0/22\n103.56.16.0/21\n103.56.32.0/22\n103.56.52.0/22\n103.56.56.0/21\n103.56.72.0/21\n103.56.140.0/22\n103.56.152.0/22\n103.56.184.0/22\n103.56.200.0/22\n103.57.12.0/22\n103.57.52.0/22\n103.57.56.0/22\n103.57.76.0/22\n103.57.136.0/22\n103.57.196.0/22\n103.58.24.0/22\n103.59.76.0/22\n103.59.100.0/22\n103.59.112.0/20\n103.59.128.0/22\n103.59.148.0/22\n103.59.164.0/22\n103.60.32.0/22\n103.60.44.0/22\n103.60.164.0/22\n103.60.228.0/22\n103.60.236.0/22\n103.61.60.0/22\n103.61.104.0/22\n103.61.140.0/22\n103.61.152.0/21\n103.61.160.0/22\n103.61.172.0/22\n103.61.176.0/22\n103.61.184.0/21\n103.62.24.0/22\n103.62.52.0/22\n103.62.72.0/21\n103.62.80.0/21\n103.62.88.0/22\n103.62.96.0/19\n103.62.128.0/21\n103.62.156.0/22\n103.62.160.0/19\n103.62.192.0/22\n103.62.204.0/22\n103.62.208.0/20\n103.62.224.0/22\n103.63.32.0/19\n103.63.64.0/20\n103.63.80.0/21\n103.63.88.0/22\n103.63.140.0/22\n103.63.144.0/22\n103.63.152.0/22\n103.63.160.0/20\n103.63.176.0/21\n103.63.184.0/22\n103.63.192.0/20\n103.63.208.0/22\n103.63.240.0/20\n103.64.0.0/21\n103.64.24.0/21\n103.64.32.0/19\n103.64.64.0/18\n103.64.140.0/22\n103.64.144.0/22\n103.64.152.0/21\n103.64.160.0/19\n103.64.192.0/18\n103.65.0.0/20\n103.65.16.0/22\n103.65.36.0/22\n103.65.40.0/22\n103.65.48.0/20\n103.65.64.0/19\n103.65.100.0/22\n103.65.104.0/21\n103.65.112.0/22\n103.65.144.0/20\n103.65.160.0/20\n103.66.32.0/22\n103.66.40.0/22\n103.66.92.0/22\n103.66.108.0/22\n103.66.200.0/22\n103.66.216.0/22\n103.66.240.0/20\n103.67.0.0/21\n103.67.8.0/22\n103.67.100.0/22\n103.67.104.0/21\n103.67.112.0/20\n103.67.128.0/20\n103.67.144.0/21\n103.67.172.0/22\n103.67.192.0/22\n103.67.212.0/22\n103.67.252.0/22\n103.68.64.0/22\n103.68.88.0/22\n103.68.100.0/22\n103.68.128.0/22\n103.68.192.0/22\n103.69.16.0/22\n103.69.116.0/22\n103.69.132.0/22\n103.69.152.0/22\n103.69.212.0/22\n103.70.8.0/22\n103.70.148.0/22\n103.70.184.0/22\n103.70.220.0/22\n103.70.224.0/22\n103.70.236.0/22\n103.70.252.0/22\n103.71.0.0/22\n103.71.32.0/22\n103.71.48.0/22\n103.71.68.0/22\n103.71.72.0/22\n103.71.80.0/21\n103.71.88.0/22\n103.71.120.0/21\n103.71.128.0/22\n103.71.144.0/22\n103.71.196.0/22\n103.71.200.0/22\n103.71.232.0/22\n103.72.12.0/22\n103.72.16.0/20\n103.72.32.0/20\n103.72.48.0/21\n103.72.112.0/20\n103.72.128.0/21\n103.72.144.0/21\n103.72.172.0/22\n103.72.180.0/22\n103.72.224.0/19\n103.73.0.0/19\n103.73.48.0/22\n103.73.88.0/22\n103.73.96.0/22\n103.73.116.0/22\n103.73.120.0/22\n103.73.128.0/20\n103.73.144.0/22\n103.73.168.0/22\n103.73.176.0/22\n103.73.204.0/22\n103.73.208.0/22\n103.73.240.0/21\n103.73.248.0/22\n103.74.24.0/21\n103.74.32.0/20\n103.74.48.0/22\n103.74.56.0/21\n103.74.80.0/22\n103.74.124.0/22\n103.74.148.0/22\n103.74.152.0/21\n103.74.204.0/22\n103.74.232.0/22\n103.75.16.0/22\n103.75.88.0/21\n103.75.104.0/21\n103.75.112.0/22\n103.75.120.0/22\n103.75.128.0/22\n103.75.144.0/22\n103.75.152.0/22\n103.75.236.0/24\n103.76.60.0/22\n103.76.64.0/21\n103.76.72.0/22\n103.76.84.0/22\n103.76.92.0/22\n103.76.216.0/21\n103.76.224.0/22\n103.77.28.0/22\n103.77.52.0/22\n103.77.56.0/22\n103.77.72.0/22\n103.77.88.0/21\n103.77.132.0/22\n103.77.148.0/22\n103.77.220.0/22\n103.78.56.0/21\n103.78.64.0/21\n103.78.124.0/22\n103.78.172.0/22\n103.78.176.0/22\n103.78.196.0/22\n103.78.228.0/22\n103.79.24.0/21\n103.79.36.0/22\n103.79.40.0/21\n103.79.52.0/22\n103.79.56.0/21\n103.79.64.0/21\n103.79.80.0/21\n103.79.120.0/22\n103.79.136.0/22\n103.79.188.0/22\n103.79.192.0/20\n103.79.208.0/21\n103.79.240.0/22\n103.80.24.0/21\n103.80.44.0/22\n103.80.72.0/22\n103.80.176.0/21\n103.80.184.0/22\n103.80.192.0/22\n103.80.200.0/22\n103.80.232.0/22\n103.81.4.0/22\n103.81.8.0/22\n103.81.16.0/21\n103.81.44.0/22\n103.81.48.0/22\n103.81.96.0/22\n103.81.120.0/22\n103.81.148.0/22\n103.81.164.0/22\n103.81.168.0/22\n103.81.183.0/24\n103.81.184.0/22\n103.81.200.0/22\n103.81.232.0/22\n103.82.52.0/22\n103.82.60.0/22\n103.82.68.0/22\n103.82.84.0/22\n103.82.104.0/22\n103.82.224.0/22\n103.82.236.0/22\n103.83.44.0/22\n103.83.52.0/22\n103.83.60.0/22\n103.83.64.0/22\n103.83.72.0/22\n103.83.112.0/22\n103.83.120.0/22\n103.83.180.0/22\n103.84.0.0/22\n103.84.12.0/22\n103.84.16.0/20\n103.84.48.0/22\n103.84.64.0/22\n103.84.72.0/22\n103.84.92.0/22\n103.84.108.0/22\n103.84.136.0/22\n103.85.20.0/22\n103.85.24.0/22\n103.85.44.0/22\n103.85.48.0/22\n103.85.84.0/22\n103.85.136.0/22\n103.85.144.0/22\n103.85.164.0/22\n103.85.168.0/21\n103.85.176.0/22\n103.85.224.0/22\n103.86.28.0/22\n103.86.32.0/22\n103.86.44.0/22\n103.86.60.0/22\n103.86.68.0/22\n103.86.80.0/21\n103.86.88.0/22\n103.86.204.0/22\n103.86.208.0/20\n103.86.224.0/19\n103.87.0.0/21\n103.87.20.0/22\n103.87.32.0/22\n103.87.72.0/22\n103.87.96.0/22\n103.87.132.0/22\n103.87.180.0/22\n103.87.224.0/22\n103.88.4.0/22\n103.88.8.0/21\n103.88.16.0/21\n103.88.32.0/21\n103.88.60.0/22\n103.88.64.0/22\n103.88.72.0/22\n103.88.96.0/21\n103.88.164.0/22\n103.88.176.0/22\n103.88.184.0/21\n103.88.212.0/22\n103.89.28.0/22\n103.89.96.0/20\n103.89.112.0/21\n103.89.148.0/22\n103.89.172.0/22\n103.89.184.0/21\n103.89.192.0/19\n103.89.224.0/21\n103.90.52.0/22\n103.90.92.0/22\n103.90.100.0/22\n103.90.104.0/21\n103.90.112.0/20\n103.90.128.0/21\n103.90.152.0/22\n103.90.168.0/22\n103.90.173.0/24\n103.90.176.0/22\n103.90.188.0/22\n103.90.192.0/22\n103.91.36.0/22\n103.91.40.0/22\n103.91.108.0/22\n103.91.152.0/22\n103.91.176.0/22\n103.91.200.0/22\n103.91.208.0/21\n103.91.219.0/24\n103.91.236.0/22\n103.91.252.0/22\n103.92.0.0/20\n103.92.48.0/20\n103.92.64.0/20\n103.92.80.0/22\n103.92.86.0/24\n103.92.88.0/22\n103.92.108.0/22\n103.92.124.0/22\n103.92.128.0/24\n103.92.132.0/22\n103.92.156.0/22\n103.92.164.0/22\n103.92.168.0/21\n103.92.176.0/20\n103.92.192.0/22\n103.92.236.0/22\n103.92.240.0/20\n103.93.0.0/21\n103.93.28.0/22\n103.93.76.0/22\n103.93.84.0/22\n103.93.121.0/24\n103.93.152.0/22\n103.93.180.0/22\n103.93.204.0/22\n103.94.12.0/22\n103.94.20.0/22\n103.94.28.0/22\n103.94.32.0/20\n103.94.72.0/22\n103.94.88.0/22\n103.94.116.0/22\n103.94.160.0/22\n103.94.180.0/22\n103.94.200.0/22\n103.95.28.0/22\n103.95.52.0/22\n103.95.64.0/21\n103.95.88.0/21\n103.95.116.0/22\n103.95.128.0/22\n103.95.136.0/21\n103.95.144.0/22\n103.95.152.0/22\n103.95.207.0/24\n103.95.216.0/21\n103.95.224.0/22\n103.95.236.0/22\n103.95.240.0/20\n103.96.0.0/22\n103.96.8.0/22\n103.96.80.0/22\n103.96.124.0/22\n103.96.136.0/22\n103.96.140.0/24\n103.96.148.0/22\n103.96.152.0/21\n103.96.160.0/19\n103.96.192.0/20\n103.96.208.0/21\n103.96.216.0/22\n103.97.8.0/21\n103.97.16.0/20\n103.97.32.0/21\n103.97.40.0/22\n103.97.56.0/21\n103.97.64.0/21\n103.97.72.0/22\n103.97.80.0/22\n103.97.112.0/21\n103.97.128.0/22\n103.97.144.0/21\n103.97.188.0/22\n103.97.192.0/22\n103.97.224.0/22\n103.97.228.0/23\n103.98.28.0/23\n103.98.40.0/21\n103.98.48.0/22\n103.98.56.0/22\n103.98.80.0/22\n103.98.88.0/21\n103.98.96.0/21\n103.98.124.0/22\n103.98.136.0/21\n103.98.144.0/22\n103.98.164.0/22\n103.98.168.0/22\n103.98.180.0/22\n103.98.196.0/22\n103.98.216.0/21\n103.98.224.0/21\n103.98.232.0/22\n103.98.240.0/20\n103.99.40.0/23\n103.99.52.0/22\n103.99.56.0/21\n103.99.76.0/22\n103.99.104.0/22\n103.99.116.0/22\n103.99.120.0/22\n103.99.152.0/22\n103.99.220.0/22\n103.99.232.0/21\n103.100.0.0/22\n103.100.32.0/22\n103.100.40.0/22\n103.100.48.0/20\n103.100.64.0/21\n103.100.88.0/22\n103.100.116.0/22\n103.100.140.0/22\n103.100.144.0/22\n103.100.236.0/22\n103.100.240.0/22\n103.100.248.0/21\n103.101.4.0/22\n103.101.8.0/21\n103.101.28.0/22\n103.101.60.0/22\n103.101.120.0/21\n103.101.144.0/21\n103.101.153.0/24\n103.101.180.0/22\n103.101.184.0/22\n103.102.76.0/22\n103.102.80.0/22\n103.102.168.0/21\n103.102.180.0/22\n103.102.184.0/21\n103.102.192.0/21\n103.102.200.0/22\n103.102.208.0/21\n103.103.12.0/22\n103.103.16.0/22\n103.103.36.0/22\n103.103.68.0/22\n103.103.72.0/22\n103.103.176.0/22\n103.103.188.0/22\n103.103.200.0/21\n103.103.220.0/22\n103.103.224.0/21\n103.103.232.0/22\n103.103.248.0/21\n103.104.0.0/21\n103.104.36.0/22\n103.104.40.0/22\n103.104.64.0/22\n103.104.104.0/22\n103.104.152.0/22\n103.104.168.0/21\n103.104.188.0/22\n103.104.198.0/23\n103.104.252.0/22\n103.105.0.0/21\n103.105.12.0/22\n103.105.16.0/22\n103.105.23.0/24\n103.105.56.0/21\n103.105.116.0/22\n103.105.132.0/22\n103.105.180.0/22\n103.105.184.0/22\n103.105.200.0/21\n103.105.220.0/22\n103.106.36.0/22\n103.106.40.0/21\n103.106.60.0/22\n103.106.68.0/22\n103.106.96.0/22\n103.106.120.0/22\n103.106.128.0/21\n103.106.160.0/22\n103.106.188.0/22\n103.106.196.0/22\n103.106.202.0/23\n103.106.212.0/22\n103.106.244.0/22\n103.106.252.0/22\n103.107.0.0/22\n103.107.8.0/24\n103.107.28.0/22\n103.107.32.0/22\n103.107.44.0/22\n103.107.72.0/22\n103.107.108.0/22\n103.107.164.0/22\n103.107.168.0/22\n103.107.188.0/22\n103.107.192.0/22\n103.107.208.0/20\n103.108.52.0/22\n103.108.64.0/22\n103.108.160.0/21\n103.108.184.0/23\n103.108.188.0/23\n103.108.192.0/21\n103.108.208.0/21\n103.108.224.0/22\n103.108.244.0/22\n103.108.251.0/24\n103.109.20.0/22\n103.109.48.0/22\n103.109.88.0/22\n103.109.106.0/23\n103.109.248.0/22\n103.110.32.0/22\n103.110.80.0/23\n103.110.92.0/22\n103.110.100.0/22\n103.110.116.0/22\n103.110.127.0/24\n103.110.128.0/23\n103.110.131.0/24\n103.110.132.0/22\n103.110.136.0/22\n103.110.152.0/21\n103.110.188.0/22\n103.110.204.0/22\n103.111.38.0/23\n103.111.64.0/22\n103.111.172.0/22\n103.111.252.0/22\n103.112.28.0/22\n103.112.68.0/22\n103.112.72.0/22\n103.112.88.0/21\n103.112.96.0/22\n103.112.108.0/22\n103.112.112.0/21\n103.112.140.0/22\n103.112.172.0/22\n103.112.184.0/22\n103.112.208.0/22\n103.113.4.0/22\n103.113.92.0/22\n103.113.144.0/22\n103.113.220.0/22\n103.113.232.0/21\n103.114.4.0/22\n103.114.28.0/22\n103.114.68.0/22\n103.114.72.0/22\n103.114.100.0/22\n103.114.132.0/22\n103.114.148.0/22\n103.114.156.0/22\n103.114.176.0/22\n103.114.212.0/22\n103.114.236.0/22\n103.114.240.0/22\n103.115.16.0/22\n103.115.40.0/21\n103.115.48.0/20\n103.115.64.0/21\n103.115.92.0/22\n103.115.120.0/22\n103.115.148.0/22\n103.115.204.0/23\n103.115.248.0/22\n103.116.20.0/22\n103.116.40.0/22\n103.116.64.0/22\n103.116.72.0/21\n103.116.92.0/22\n103.116.120.0/22\n103.116.128.0/22\n103.116.132.0/23\n103.116.148.0/22\n103.116.184.0/22\n103.116.206.0/23\n103.116.220.0/22\n103.116.224.0/21\n103.117.16.0/22\n103.117.72.0/22\n103.117.88.0/22\n103.117.132.0/22\n103.117.136.0/22\n103.117.188.0/22\n103.117.220.0/22\n103.118.19.0/24\n103.118.36.0/22\n103.118.52.0/22\n103.118.56.0/21\n103.118.64.0/21\n103.118.72.0/22\n103.118.88.0/22\n103.118.173.0/24\n103.118.192.0/19\n103.118.240.0/20\n103.119.0.0/22\n103.119.12.0/22\n103.119.16.0/22\n103.119.28.0/22\n103.119.44.0/22\n103.119.104.0/22\n103.119.115.0/24\n103.119.156.0/22\n103.119.180.0/22\n103.119.200.0/22\n103.119.224.0/22\n103.120.52.0/22\n103.120.72.0/22\n103.120.76.0/24\n103.120.88.0/22\n103.120.96.0/21\n103.120.140.0/22\n103.120.196.0/22\n103.120.224.0/22\n103.121.52.0/22\n103.121.92.0/22\n103.121.160.0/21\n103.121.250.0/24\n103.121.252.0/22\n103.122.48.0/22\n103.122.176.0/22\n103.122.192.0/22\n103.122.240.0/22\n103.123.4.0/22\n103.123.56.0/22\n103.123.88.0/21\n103.123.116.0/22\n103.123.160.0/22\n103.123.176.0/22\n103.123.200.0/21\n103.123.208.0/21\n103.124.24.0/22\n103.124.48.0/22\n103.124.64.0/22\n103.124.212.0/22\n103.124.216.0/22\n103.125.20.0/22\n103.125.44.0/22\n103.125.132.0/22\n103.125.164.0/22\n103.125.196.0/22\n103.125.236.0/22\n103.125.248.0/22\n103.126.0.0/22\n103.126.16.0/22\n103.126.44.0/22\n103.126.100.0/22\n103.126.124.0/22\n103.126.128.0/21\n103.126.208.0/22\n103.126.241.0/24\n103.129.52.0/22\n103.130.132.0/22\n103.130.152.0/24\n103.130.160.0/22\n103.130.228.0/22\n103.131.20.0/22\n103.131.36.0/22\n103.131.152.0/22\n103.131.168.0/22\n103.131.176.0/22\n103.131.224.0/21\n103.131.240.0/22\n103.132.60.0/22\n103.132.64.0/20\n103.132.80.0/22\n103.132.104.0/21\n103.132.112.0/21\n103.132.120.0/22\n103.132.160.0/21\n103.132.188.0/22\n103.132.208.0/21\n103.132.234.0/23\n103.133.12.0/22\n103.133.40.0/22\n103.133.128.0/22\n103.133.136.0/22\n103.133.176.0/22\n103.133.232.0/22\n103.134.12.0/24\n103.134.196.0/22\n103.135.80.0/22\n103.135.124.0/22\n103.135.148.0/22\n103.135.156.0/22\n103.135.160.0/21\n103.135.176.0/22\n103.135.184.0/22\n103.135.192.0/21\n103.135.236.0/22\n103.136.128.0/22\n103.136.232.0/22\n103.137.58.0/23\n103.137.60.0/24\n103.137.76.0/22\n103.137.136.0/23\n103.137.149.0/24\n103.137.180.0/22\n103.137.236.0/22\n103.138.2.0/23\n103.138.12.0/23\n103.138.80.0/22\n103.138.134.0/23\n103.138.156.0/23\n103.138.208.0/23\n103.138.220.0/23\n103.138.246.0/23\n103.138.248.0/23\n103.139.0.0/22\n103.139.22.0/23\n103.139.113.0/24\n103.139.134.0/23\n103.139.136.0/23\n103.139.172.0/23\n103.139.200.0/23\n103.139.204.0/23\n103.139.212.0/23\n103.140.8.0/23\n103.140.14.0/23\n103.140.46.0/23\n103.140.70.0/23\n103.140.126.0/23\n103.140.140.0/23\n103.140.144.0/23\n103.140.152.0/23\n103.140.192.0/22\n103.140.228.0/23\n103.141.10.0/23\n103.141.36.0/23\n103.141.58.0/23\n103.141.128.0/23\n103.141.186.0/23\n103.141.190.0/23\n103.141.242.0/23\n103.142.0.0/23\n103.142.28.0/23\n103.142.58.0/23\n103.142.82.0/23\n103.142.96.0/23\n103.142.102.0/23\n103.142.122.0/23\n103.142.126.0/24\n103.142.128.0/23\n103.142.140.0/23\n103.142.154.0/23\n103.142.156.0/23\n103.142.172.0/23\n103.142.180.0/23\n103.142.186.0/23\n103.142.190.0/23\n103.142.220.0/23\n103.142.230.0/24\n103.142.234.0/23\n103.142.238.0/23\n103.142.248.0/23\n103.143.16.0/22\n103.143.31.0/24\n103.143.74.0/23\n103.143.120.0/23\n103.143.124.0/23\n103.143.132.0/22\n103.143.174.0/23\n103.143.228.0/23\n103.144.40.0/23\n103.144.52.0/23\n103.144.66.0/23\n103.144.70.0/23\n103.144.72.0/23\n103.144.88.0/24\n103.144.108.0/23\n103.144.136.0/23\n103.144.148.0/23\n103.144.158.0/23\n103.144.240.0/23\n103.145.38.0/23\n103.145.40.0/22\n103.145.60.0/23\n103.145.72.0/23\n103.145.80.0/23\n103.145.86.0/23\n103.145.92.0/22\n103.145.98.0/23\n103.145.106.0/23\n103.145.122.0/23\n103.145.188.0/22\n103.146.6.0/23\n103.146.72.0/23\n103.146.88.0/22\n103.146.124.0/23\n103.192.0.0/19\n103.192.48.0/21\n103.192.56.0/22\n103.192.84.0/22\n103.192.88.0/21\n103.192.96.0/20\n103.192.112.0/22\n103.192.128.0/20\n103.192.144.0/22\n103.192.164.0/22\n103.192.188.0/22\n103.192.208.0/21\n103.192.216.0/22\n103.192.252.0/22\n103.193.40.0/21\n103.193.120.0/21\n103.193.140.0/22\n103.193.144.0/21\n103.193.160.0/22\n103.193.188.0/22\n103.193.192.0/22\n103.193.212.0/22\n103.193.216.0/21\n103.193.224.0/20\n103.193.240.0/22\n103.194.16.0/22\n103.195.104.0/22\n103.195.112.0/22\n103.195.136.0/22\n103.195.148.0/22\n103.195.152.0/22\n103.195.160.0/22\n103.195.192.0/22\n103.196.60.0/22\n103.196.64.0/22\n103.196.72.0/22\n103.196.88.0/21\n103.196.96.0/22\n103.196.168.0/22\n103.196.204.0/22\n103.197.180.0/22\n103.197.228.0/22\n103.198.20.0/22\n103.198.60.0/22\n103.198.64.0/22\n103.198.72.0/22\n103.198.124.0/22\n103.198.156.0/22\n103.198.180.0/22\n103.198.196.0/22\n103.198.200.0/22\n103.198.216.0/21\n103.198.224.0/20\n103.198.240.0/21\n103.199.164.0/22\n103.199.196.0/22\n103.199.228.0/22\n103.199.248.0/21\n103.200.28.0/22\n103.200.32.0/22\n103.200.52.0/22\n103.200.64.0/21\n103.200.136.0/21\n103.200.144.0/20\n103.200.160.0/19\n103.200.192.0/22\n103.200.220.0/22\n103.200.224.0/19\n103.201.0.0/20\n103.201.16.0/21\n103.201.28.0/22\n103.201.32.0/19\n103.201.64.0/22\n103.201.76.0/22\n103.201.80.0/20\n103.201.96.0/20\n103.201.112.0/21\n103.201.120.0/22\n103.201.152.0/21\n103.201.160.0/19\n103.201.192.0/18\n103.202.0.0/19\n103.202.32.0/20\n103.202.56.0/21\n103.202.64.0/18\n103.202.128.0/20\n103.202.144.0/22\n103.202.152.0/21\n103.202.160.0/19\n103.202.192.0/20\n103.202.212.0/22\n103.202.228.0/22\n103.202.236.0/22\n103.202.240.0/20\n103.203.0.0/19\n103.203.32.0/22\n103.203.52.0/22\n103.203.56.0/22\n103.203.96.0/19\n103.203.128.0/22\n103.203.140.0/22\n103.203.164.0/22\n103.203.168.0/22\n103.203.192.0/22\n103.203.200.0/22\n103.203.212.0/22\n103.203.216.0/22\n103.204.24.0/22\n103.204.72.0/22\n103.204.88.0/22\n103.204.112.0/22\n103.204.136.0/21\n103.204.144.0/21\n103.204.152.0/22\n103.204.196.0/22\n103.204.232.0/21\n103.205.4.0/22\n103.205.8.0/22\n103.205.40.0/21\n103.205.52.0/22\n103.205.108.0/22\n103.205.116.0/22\n103.205.120.0/22\n103.205.136.0/22\n103.205.162.0/24\n103.205.188.0/22\n103.205.192.0/21\n103.205.200.0/22\n103.205.236.0/22\n103.205.248.0/21\n103.206.0.0/22\n103.206.44.0/22\n103.206.108.0/22\n103.206.148.0/22\n103.207.48.0/22\n103.207.104.0/22\n103.207.164.0/22\n103.207.184.0/21\n103.207.192.0/20\n103.207.208.0/21\n103.207.220.0/22\n103.207.228.0/22\n103.207.232.0/22\n103.208.12.0/22\n103.208.16.0/22\n103.208.28.0/22\n103.208.40.0/21\n103.208.48.0/22\n103.208.148.0/22\n103.209.112.0/22\n103.209.136.0/22\n103.209.200.0/22\n103.209.208.0/22\n103.209.216.0/22\n103.210.0.0/22\n103.210.20.0/22\n103.210.96.0/22\n103.210.156.0/22\n103.210.160.0/19\n103.210.216.0/22\n103.211.44.0/22\n103.211.96.0/21\n103.211.156.0/22\n103.211.164.0/22\n103.211.192.0/22\n103.211.220.0/22\n103.211.224.0/22\n103.211.248.0/22\n103.212.0.0/20\n103.212.32.0/22\n103.212.44.0/22\n103.212.48.0/22\n103.212.84.0/22\n103.212.100.0/22\n103.212.104.0/21\n103.212.148.0/22\n103.212.164.0/22\n103.212.196.0/22\n103.212.200.0/22\n103.212.228.0/22\n103.212.252.0/22\n103.213.40.0/21\n103.213.48.0/20\n103.213.64.0/19\n103.213.96.0/22\n103.213.132.0/22\n103.213.136.0/21\n103.213.144.0/20\n103.213.160.0/19\n103.213.248.0/22\n103.214.32.0/22\n103.214.48.0/22\n103.214.84.0/22\n103.214.168.0/22\n103.214.212.0/22\n103.214.240.0/21\n103.215.28.0/22\n103.215.32.0/21\n103.215.44.0/22\n103.215.48.0/22\n103.215.100.0/22\n103.215.104.0/21\n103.215.116.0/22\n103.215.120.0/22\n103.215.140.0/22\n103.215.184.0/22\n103.215.228.0/22\n103.216.4.0/22\n103.216.8.0/21\n103.216.16.0/20\n103.216.32.0/20\n103.216.64.0/22\n103.216.108.0/22\n103.216.136.0/22\n103.216.152.0/22\n103.216.224.0/21\n103.216.240.0/20\n103.217.0.0/18\n103.217.168.0/22\n103.217.180.0/22\n103.217.184.0/21\n103.217.192.0/20\n103.218.0.0/22\n103.218.8.0/21\n103.218.16.0/21\n103.218.28.0/22\n103.218.32.0/19\n103.218.64.0/19\n103.218.184.0/22\n103.218.192.0/20\n103.218.208.0/21\n103.218.216.0/22\n103.219.24.0/21\n103.219.32.0/21\n103.219.64.0/22\n103.219.84.0/22\n103.219.88.0/21\n103.219.96.0/21\n103.219.176.0/22\n103.219.184.0/22\n103.220.48.0/20\n103.220.64.0/22\n103.220.92.0/22\n103.220.96.0/20\n103.220.116.0/22\n103.220.120.0/21\n103.220.128.0/20\n103.220.144.0/21\n103.220.152.0/22\n103.220.160.0/19\n103.220.192.0/21\n103.220.200.0/22\n103.220.240.0/20\n103.221.0.0/19\n103.221.32.0/20\n103.221.48.0/22\n103.221.88.0/21\n103.221.96.0/19\n103.221.128.0/18\n103.221.192.0/20\n103.222.0.0/20\n103.222.16.0/22\n103.222.24.0/21\n103.222.32.0/19\n103.222.64.0/18\n103.222.128.0/18\n103.222.192.0/19\n103.222.224.0/21\n103.222.232.0/22\n103.222.240.0/21\n103.223.16.0/20\n103.223.32.0/19\n103.223.64.0/18\n103.223.128.0/21\n103.223.140.0/22\n103.223.144.0/20\n103.223.160.0/20\n103.223.176.0/21\n103.223.188.0/22\n103.223.192.0/18\n103.224.0.0/22\n103.224.40.0/21\n103.224.60.0/22\n103.224.80.0/22\n103.224.220.0/22\n103.224.224.0/21\n103.224.232.0/22\n103.225.84.0/22\n103.226.16.0/22\n103.226.40.0/22\n103.226.56.0/21\n103.226.80.0/22\n103.226.132.0/22\n103.226.156.0/22\n103.226.180.0/22\n103.226.196.0/22\n103.227.48.0/22\n103.227.72.0/21\n103.227.80.0/22\n103.227.100.0/22\n103.227.120.0/22\n103.227.132.0/22\n103.227.136.0/22\n103.227.196.0/22\n103.227.204.0/22\n103.227.212.0/22\n103.227.228.0/22\n103.228.12.0/22\n103.228.28.0/22\n103.228.68.0/22\n103.228.88.0/22\n103.228.128.0/22\n103.228.136.0/22\n103.228.160.0/22\n103.228.176.0/22\n103.228.204.0/22\n103.228.208.0/22\n103.228.228.0/22\n103.228.232.0/22\n103.229.20.0/22\n103.229.60.0/22\n103.229.136.0/22\n103.229.148.0/22\n103.229.172.0/22\n103.229.212.0/22\n103.229.216.0/21\n103.229.228.0/22\n103.229.236.0/22\n103.229.240.0/22\n103.230.0.0/22\n103.230.28.0/22\n103.230.44.0/22\n103.230.96.0/22\n103.230.196.0/22\n103.230.200.0/21\n103.230.212.0/22\n103.230.236.0/22\n103.231.16.0/21\n103.231.64.0/21\n103.231.144.0/22\n103.231.180.0/22\n103.231.184.0/22\n103.231.244.0/22\n103.232.4.0/22\n103.232.144.0/22\n103.232.188.0/22\n103.232.212.0/22\n103.233.4.0/22\n103.233.44.0/22\n103.233.52.0/22\n103.233.104.0/22\n103.233.128.0/22\n103.233.136.0/22\n103.233.228.0/22\n103.234.0.0/22\n103.234.20.0/22\n103.234.56.0/22\n103.234.128.0/22\n103.234.172.0/22\n103.234.180.0/22\n103.234.244.0/22\n103.235.16.0/22\n103.235.48.0/22\n103.235.56.0/21\n103.235.80.0/21\n103.235.128.0/20\n103.235.144.0/21\n103.235.184.0/22\n103.235.192.0/22\n103.235.200.0/22\n103.235.220.0/22\n103.235.224.0/19\n103.236.0.0/18\n103.236.64.0/19\n103.236.96.0/22\n103.236.120.0/22\n103.236.184.0/22\n103.236.220.0/22\n103.236.232.0/22\n103.236.240.0/20\n103.237.0.0/20\n103.237.24.0/21\n103.237.68.0/22\n103.237.88.0/22\n103.237.152.0/22\n103.237.176.0/20\n103.237.192.0/18\n103.238.0.0/21\n103.238.16.0/20\n103.238.32.0/20\n103.238.48.0/21\n103.238.56.0/22\n103.238.88.0/21\n103.238.96.0/22\n103.238.132.0/22\n103.238.140.0/22\n103.238.144.0/22\n103.238.160.0/19\n103.238.196.0/22\n103.238.204.0/22\n103.238.252.0/22\n103.239.0.0/22\n103.239.44.0/22\n103.239.68.0/22\n103.239.96.0/22\n103.239.152.0/21\n103.239.176.0/21\n103.239.184.0/22\n103.239.192.0/21\n103.239.204.0/22\n103.239.208.0/22\n103.239.224.0/22\n103.239.244.0/22\n103.240.16.0/22\n103.240.36.0/22\n103.240.72.0/22\n103.240.84.0/22\n103.240.124.0/22\n103.240.156.0/22\n103.240.172.0/22\n103.240.188.0/22\n103.240.244.0/22\n103.241.12.0/22\n103.241.72.0/22\n103.241.92.0/22\n103.241.96.0/22\n103.241.160.0/22\n103.241.184.0/21\n103.241.220.0/22\n103.242.64.0/22\n103.242.128.0/21\n103.242.160.0/22\n103.242.168.0/21\n103.242.176.0/22\n103.242.200.0/22\n103.242.212.0/22\n103.242.220.0/22\n103.242.240.0/22\n103.243.136.0/22\n103.243.252.0/22\n103.244.16.0/22\n103.244.58.0/23\n103.244.60.0/22\n103.244.64.0/20\n103.244.80.0/21\n103.244.116.0/22\n103.244.164.0/22\n103.244.232.0/22\n103.244.252.0/22\n103.245.23.0/24\n103.245.52.0/22\n103.245.60.0/22\n103.245.80.0/22\n103.245.124.0/22\n103.245.128.0/22\n103.246.8.0/21\n103.246.120.0/21\n103.246.132.0/22\n103.246.152.0/21\n103.247.168.0/21\n103.247.176.0/22\n103.247.200.0/22\n103.247.212.0/22\n103.248.0.0/23\n103.248.64.0/22\n103.248.100.0/22\n103.248.124.0/22\n103.248.152.0/22\n103.248.168.0/22\n103.248.192.0/22\n103.248.212.0/22\n103.248.220.0/22\n103.248.224.0/22\n103.249.8.0/21\n103.249.52.0/22\n103.249.104.0/22\n103.249.128.0/22\n103.249.136.0/22\n103.249.144.0/22\n103.249.164.0/22\n103.249.168.0/21\n103.249.176.0/22\n103.249.188.0/22\n103.249.192.0/22\n103.249.244.0/22\n103.249.252.0/22\n103.250.32.0/22\n103.250.104.0/22\n103.250.124.0/22\n103.250.180.0/22\n103.250.192.0/22\n103.250.216.0/22\n103.250.224.0/22\n103.250.236.0/22\n103.250.248.0/21\n103.251.32.0/21\n103.251.84.0/22\n103.251.96.0/22\n103.251.124.0/22\n103.251.128.0/22\n103.251.160.0/22\n103.251.192.0/22\n103.251.204.0/22\n103.251.236.0/22\n103.251.240.0/22\n103.252.28.0/22\n103.252.36.0/22\n103.252.64.0/22\n103.252.96.0/22\n103.252.104.0/22\n103.252.172.0/22\n103.252.204.0/22\n103.252.208.0/22\n103.252.232.0/22\n103.252.248.0/22\n103.253.4.0/22\n103.253.60.0/22\n103.253.204.0/22\n103.253.220.0/22\n103.253.224.0/22\n103.253.232.0/22\n103.254.8.0/22\n103.254.20.0/22\n103.254.64.0/20\n103.254.112.0/22\n103.254.176.0/22\n103.254.188.0/22\n103.254.196.0/24\n103.254.220.0/22\n103.255.56.0/22\n103.255.68.0/22\n103.255.88.0/21\n103.255.136.0/21\n103.255.184.0/22\n103.255.200.0/22\n103.255.212.0/22\n103.255.228.0/22\n106.0.0.0/24\n106.0.2.0/23\n106.0.4.0/22\n106.0.8.0/21\n106.0.16.0/20\n106.0.44.0/22\n106.0.64.0/18\n106.2.0.0/15\n106.4.0.0/14\n106.8.0.0/15\n106.11.0.0/16\n106.12.0.0/14\n106.16.0.0/12\n106.32.0.0/12\n106.48.0.0/15\n106.50.0.0/16\n106.52.0.0/14\n106.56.0.0/13\n106.74.0.0/15\n106.80.0.0/12\n106.108.0.0/14\n106.112.0.0/12\n106.224.0.0/12\n109.244.0.0/16\n110.6.0.0/15\n110.16.0.0/14\n110.34.40.0/21\n110.40.0.0/14\n110.44.12.0/22\n110.44.144.0/20\n110.48.0.0/16\n110.51.0.0/16\n110.52.0.0/15\n110.56.0.0/13\n110.64.0.0/15\n110.72.0.0/15\n110.75.0.0/16\n110.76.0.0/18\n110.76.132.0/22\n110.76.156.0/22\n110.76.184.0/22\n110.76.192.0/18\n110.77.0.0/17\n110.80.0.0/13\n110.88.0.0/14\n110.92.68.0/22\n110.93.32.0/19\n110.94.0.0/15\n110.96.0.0/11\n110.152.0.0/14\n110.156.0.0/15\n110.165.32.0/19\n110.166.0.0/15\n110.172.192.0/18\n110.173.0.0/19\n110.173.32.0/20\n110.173.64.0/18\n110.173.192.0/19\n110.176.0.0/12\n110.192.0.0/11\n110.228.0.0/14\n110.232.32.0/19\n110.236.0.0/15\n110.240.0.0/12\n111.0.0.0/10\n111.66.0.0/16\n111.67.192.0/20\n111.68.64.0/19\n111.72.0.0/13\n111.85.0.0/16\n111.91.192.0/19\n111.92.248.0/21\n111.112.0.0/14\n111.116.0.0/15\n111.118.200.0/21\n111.119.64.0/18\n111.119.128.0/19\n111.120.0.0/14\n111.124.0.0/16\n111.126.0.0/15\n111.128.0.0/11\n111.160.0.0/13\n111.170.0.0/16\n111.172.0.0/14\n111.176.0.0/13\n111.186.0.0/15\n111.192.0.0/12\n111.208.0.0/13\n111.221.28.0/24\n111.221.128.0/17\n111.222.0.0/16\n111.223.4.0/22\n111.223.8.0/21\n111.223.16.0/22\n111.223.240.0/22\n111.223.248.0/22\n111.224.0.0/13\n111.235.96.0/19\n111.235.156.0/22\n111.235.160.0/19\n112.0.0.0/10\n112.64.0.0/14\n112.73.0.0/16\n112.74.0.0/15\n112.80.0.0/12\n112.96.0.0/13\n112.109.128.0/17\n112.111.0.0/16\n112.112.0.0/14\n112.116.0.0/15\n112.122.0.0/15\n112.124.0.0/14\n112.128.0.0/14\n112.132.0.0/16\n112.137.48.0/21\n112.192.0.0/14\n112.224.0.0/11\n113.0.0.0/13\n113.8.0.0/15\n113.11.192.0/19\n113.12.0.0/14\n113.16.0.0/15\n113.18.0.0/16\n113.21.232.0/21\n113.24.0.0/14\n113.31.0.0/16\n113.44.0.0/14\n113.48.0.0/14\n113.52.160.0/19\n113.52.228.0/22\n113.54.0.0/15\n113.56.0.0/15\n113.58.0.0/16\n113.59.0.0/17\n113.59.224.0/22\n113.62.0.0/15\n113.64.0.0/10\n113.128.0.0/15\n113.130.96.0/20\n113.130.112.0/21\n113.132.0.0/14\n113.136.0.0/13\n113.194.0.0/15\n113.197.100.0/22\n113.200.0.0/15\n113.202.0.0/16\n113.204.0.0/14\n113.208.96.0/19\n113.208.128.0/17\n113.209.0.0/16\n113.212.0.0/18\n113.212.64.0/22\n113.212.88.0/22\n113.212.100.0/22\n113.212.184.0/21\n113.213.0.0/17\n113.214.0.0/15\n113.218.0.0/15\n113.220.0.0/14\n113.224.0.0/12\n113.240.0.0/13\n113.248.0.0/14\n114.28.0.0/16\n114.31.64.0/21\n114.54.0.0/15\n114.60.0.0/14\n114.64.0.0/14\n114.68.0.0/16\n114.79.64.0/18\n114.80.0.0/12\n114.96.0.0/13\n114.104.0.0/14\n114.110.0.0/20\n114.110.64.0/18\n114.111.0.0/19\n114.111.160.0/19\n114.112.0.0/14\n114.116.0.0/15\n114.118.0.0/16\n114.119.0.0/17\n114.119.192.0/18\n114.132.0.0/16\n114.135.0.0/16\n114.138.0.0/15\n114.141.64.0/21\n114.141.80.0/21\n114.141.128.0/18\n114.196.0.0/15\n114.198.248.0/21\n114.208.0.0/12\n114.224.0.0/11\n115.24.0.0/14\n115.28.0.0/15\n115.31.64.0/20\n115.32.0.0/14\n115.42.56.0/22\n115.44.0.0/14\n115.48.0.0/12\n115.69.64.0/20\n115.84.0.0/18\n115.84.192.0/19\n115.85.192.0/18\n115.100.0.0/14\n115.104.0.0/14\n115.120.0.0/14\n115.124.16.0/20\n115.148.0.0/14\n115.152.0.0/13\n115.166.64.0/19\n115.168.0.0/13\n115.180.0.0/14\n115.187.0.0/20\n115.190.0.0/15\n115.192.0.0/11\n115.224.0.0/12\n116.0.8.0/21\n116.0.24.0/21\n116.1.0.0/16\n116.2.0.0/15\n116.4.0.0/14\n116.8.0.0/14\n116.13.0.0/16\n116.16.0.0/12\n116.50.0.0/20\n116.52.0.0/14\n116.56.0.0/15\n116.58.128.0/20\n116.58.208.0/20\n116.60.0.0/14\n116.66.0.0/17\n116.66.176.0/22\n116.68.136.0/21\n116.68.176.0/21\n116.69.0.0/16\n116.70.0.0/17\n116.76.0.0/14\n116.85.0.0/16\n116.89.144.0/20\n116.89.240.0/22\n116.90.80.0/20\n116.90.184.0/21\n116.95.0.0/16\n116.112.0.0/14\n116.116.0.0/15\n116.128.0.0/10\n116.192.0.0/16\n116.193.16.0/20\n116.193.32.0/19\n116.193.152.0/22\n116.193.164.0/22\n116.193.176.0/21\n116.194.0.0/15\n116.196.0.0/16\n116.197.160.0/21\n116.198.0.0/16\n116.199.0.0/17\n116.199.128.0/19\n116.204.0.0/17\n116.204.132.0/22\n116.204.168.0/22\n116.204.216.0/22\n116.204.232.0/21\n116.204.244.0/22\n116.205.0.0/16\n116.206.92.0/22\n116.206.176.0/22\n116.207.0.0/16\n116.208.0.0/14\n116.212.160.0/20\n116.213.44.0/22\n116.213.64.0/18\n116.213.128.0/17\n116.214.32.0/19\n116.214.64.0/20\n116.214.128.0/17\n116.215.0.0/16\n116.216.0.0/14\n116.224.0.0/12\n116.242.0.0/15\n116.244.0.0/14\n116.248.0.0/15\n116.251.64.0/18\n116.252.0.0/15\n116.254.104.0/21\n116.254.128.0/17\n116.255.128.0/17\n117.8.0.0/13\n117.21.0.0/16\n117.22.0.0/15\n117.24.0.0/13\n117.32.0.0/13\n117.40.0.0/14\n117.44.0.0/15\n117.48.0.0/14\n117.53.48.0/20\n117.53.176.0/20\n117.57.0.0/16\n117.58.0.0/17\n117.59.0.0/16\n117.60.0.0/14\n117.64.0.0/13\n117.72.0.0/15\n117.74.64.0/19\n117.74.128.0/17\n117.75.0.0/16\n117.76.0.0/14\n117.80.0.0/12\n117.100.0.0/15\n117.103.16.0/20\n117.103.40.0/21\n117.103.72.0/21\n117.103.128.0/20\n117.104.168.0/21\n117.106.0.0/15\n117.112.0.0/13\n117.120.64.0/18\n117.120.128.0/17\n117.121.0.0/17\n117.121.128.0/18\n117.121.192.0/21\n117.122.128.0/17\n117.124.0.0/14\n117.128.0.0/10\n118.24.0.0/15\n118.26.0.0/16\n118.28.0.0/14\n118.64.0.0/15\n118.66.0.0/16\n118.67.112.0/20\n118.72.0.0/13\n118.80.0.0/15\n118.84.0.0/15\n118.88.32.0/19\n118.88.64.0/18\n118.88.128.0/17\n118.89.0.0/16\n118.91.240.0/20\n118.102.16.0/20\n118.102.32.0/21\n118.103.164.0/22\n118.103.168.0/21\n118.103.176.0/22\n118.107.180.0/22\n118.112.0.0/13\n118.120.0.0/14\n118.124.0.0/15\n118.126.0.0/16\n118.127.128.0/19\n118.132.0.0/14\n118.144.0.0/14\n118.178.0.0/16\n118.180.0.0/14\n118.184.0.0/16\n118.186.0.0/15\n118.188.0.0/16\n118.190.0.0/15\n118.192.0.0/16\n118.193.0.0/20\n118.193.32.0/19\n118.193.64.0/20\n118.193.96.0/19\n118.193.128.0/17\n118.194.0.0/15\n118.196.0.0/14\n118.202.0.0/15\n118.204.0.0/14\n118.212.0.0/15\n118.215.192.0/18\n118.224.0.0/14\n118.228.0.0/15\n118.230.0.0/16\n118.239.0.0/16\n118.242.0.0/16\n118.244.0.0/14\n118.248.0.0/13\n119.0.0.0/15\n119.2.0.0/19\n119.2.128.0/17\n119.3.0.0/16\n119.4.0.0/14\n119.10.0.0/17\n119.15.136.0/21\n119.16.0.0/16\n119.18.192.0/20\n119.18.208.0/21\n119.18.224.0/19\n119.19.0.0/16\n119.20.0.0/14\n119.27.64.0/18\n119.27.128.0/17\n119.28.0.0/15\n119.30.48.0/20\n119.31.192.0/19\n119.32.0.0/13\n119.40.0.0/18\n119.40.64.0/20\n119.40.128.0/17\n119.41.0.0/16\n119.42.0.0/19\n119.42.52.0/22\n119.42.128.0/20\n119.42.224.0/19\n119.44.0.0/15\n119.48.0.0/13\n119.57.0.0/16\n119.58.0.0/16\n119.59.128.0/17\n119.60.0.0/15\n119.62.0.0/16\n119.63.32.0/19\n119.75.208.0/20\n119.78.0.0/15\n119.80.0.0/16\n119.82.208.0/20\n119.84.0.0/14\n119.88.0.0/14\n119.96.0.0/13\n119.108.0.0/15\n119.112.0.0/12\n119.128.0.0/12\n119.144.0.0/14\n119.148.160.0/19\n119.151.192.0/18\n119.160.200.0/21\n119.161.120.0/21\n119.161.128.0/17\n119.162.0.0/15\n119.164.0.0/14\n119.176.0.0/12\n119.232.0.0/15\n119.235.128.0/18\n119.248.0.0/14\n119.252.96.0/21\n119.252.240.0/20\n119.253.0.0/16\n119.254.0.0/15\n120.0.0.0/12\n120.24.0.0/14\n120.30.0.0/15\n120.32.0.0/12\n120.48.0.0/15\n120.52.0.0/14\n120.64.0.0/13\n120.72.32.0/19\n120.72.128.0/17\n120.76.0.0/14\n120.80.0.0/13\n120.88.8.0/21\n120.90.0.0/15\n120.92.0.0/16\n120.94.0.0/15\n120.128.0.0/13\n120.136.16.0/21\n120.136.128.0/18\n120.137.0.0/17\n120.143.128.0/19\n120.192.0.0/10\n121.0.8.0/21\n121.0.16.0/20\n121.4.0.0/15\n121.8.0.0/13\n121.16.0.0/12\n121.32.0.0/13\n121.40.0.0/14\n121.46.0.0/18\n121.46.76.0/22\n121.46.128.0/17\n121.47.0.0/16\n121.48.0.0/15\n121.50.8.0/21\n121.51.0.0/16\n121.52.160.0/19\n121.52.208.0/20\n121.52.224.0/19\n121.54.176.0/21\n121.54.188.0/22\n121.55.0.0/18\n121.56.0.0/15\n121.58.0.0/17\n121.58.136.0/21\n121.58.144.0/20\n121.58.160.0/21\n121.59.0.0/16\n121.60.0.0/14\n121.68.0.0/14\n121.76.0.0/15\n121.79.128.0/18\n121.89.0.0/16\n121.100.128.0/17\n121.101.0.0/18\n121.101.208.0/20\n121.192.0.0/13\n121.200.192.0/21\n121.201.0.0/16\n121.204.0.0/14\n121.224.0.0/12\n121.248.0.0/14\n121.255.0.0/16\n122.0.64.0/18\n122.0.128.0/17\n122.4.0.0/14\n122.8.0.0/15\n122.10.128.0/22\n122.10.132.0/23\n122.10.136.0/23\n122.10.164.0/22\n122.10.168.0/21\n122.10.176.0/20\n122.10.192.0/22\n122.10.200.0/21\n122.10.208.0/21\n122.10.216.0/22\n122.10.228.0/22\n122.10.232.0/21\n122.10.240.0/22\n122.11.0.0/17\n122.12.0.0/15\n122.14.0.0/16\n122.48.0.0/16\n122.49.0.0/18\n122.51.0.0/16\n122.64.0.0/11\n122.96.0.0/15\n122.102.0.0/20\n122.102.64.0/19\n122.112.0.0/14\n122.119.0.0/16\n122.128.100.0/22\n122.128.120.0/21\n122.136.0.0/13\n122.144.128.0/17\n122.152.192.0/18\n122.156.0.0/14\n122.188.0.0/14\n122.192.0.0/14\n122.198.0.0/16\n122.200.40.0/21\n122.200.64.0/18\n122.201.48.0/20\n122.204.0.0/14\n122.224.0.0/12\n122.240.0.0/13\n122.248.24.0/21\n122.248.48.0/20\n122.255.64.0/21\n123.0.128.0/18\n123.4.0.0/14\n123.8.0.0/13\n123.49.128.0/17\n123.50.160.0/19\n123.52.0.0/14\n123.56.0.0/14\n123.60.0.0/15\n123.62.0.0/16\n123.64.0.0/11\n123.96.0.0/15\n123.98.0.0/17\n123.99.128.0/17\n123.100.0.0/19\n123.101.0.0/16\n123.103.0.0/17\n123.108.128.0/20\n123.108.208.0/20\n123.112.0.0/12\n123.128.0.0/13\n123.136.80.0/20\n123.137.0.0/16\n123.138.0.0/15\n123.144.0.0/12\n123.160.0.0/12\n123.176.60.0/22\n123.176.80.0/20\n123.177.0.0/16\n123.178.0.0/15\n123.180.0.0/14\n123.184.0.0/13\n123.196.0.0/15\n123.199.128.0/17\n123.206.0.0/15\n123.232.0.0/14\n123.242.0.0/17\n123.242.192.0/21\n123.244.0.0/14\n123.249.0.0/16\n123.253.108.0/22\n123.253.240.0/22\n123.254.96.0/21\n124.6.64.0/18\n124.14.0.0/15\n124.16.0.0/15\n124.20.0.0/14\n124.28.192.0/18\n124.29.0.0/17\n124.31.0.0/16\n124.40.112.0/20\n124.40.128.0/18\n124.40.192.0/19\n124.40.240.0/22\n124.42.0.0/16\n124.47.0.0/18\n124.64.0.0/15\n124.66.0.0/17\n124.67.0.0/16\n124.68.0.0/14\n124.72.0.0/13\n124.88.0.0/13\n124.108.8.0/21\n124.108.40.0/21\n124.109.96.0/21\n124.112.0.0/13\n124.126.0.0/15\n124.128.0.0/13\n124.147.128.0/17\n124.150.137.0/24\n124.151.0.0/16\n124.152.0.0/16\n124.160.0.0/13\n124.172.0.0/14\n124.192.0.0/15\n124.196.0.0/16\n124.200.0.0/13\n124.220.0.0/14\n124.224.0.0/12\n124.240.0.0/17\n124.240.128.0/18\n124.242.0.0/16\n124.243.192.0/18\n124.248.0.0/17\n124.249.0.0/16\n124.250.0.0/15\n124.254.0.0/18\n125.31.192.0/18\n125.32.0.0/12\n125.58.128.0/17\n125.61.128.0/17\n125.62.0.0/18\n125.64.0.0/11\n125.96.0.0/15\n125.98.0.0/16\n125.104.0.0/13\n125.112.0.0/12\n125.169.0.0/16\n125.171.0.0/16\n125.208.0.0/18\n125.210.0.0/15\n125.213.0.0/17\n125.214.96.0/19\n125.215.0.0/18\n125.216.0.0/13\n125.254.128.0/17\n128.108.0.0/16\n129.28.0.0/16\n129.204.0.0/16\n129.211.0.0/16\n132.232.0.0/16\n134.175.0.0/16\n137.59.59.0/24\n137.59.88.0/22\n139.5.56.0/21\n139.5.80.0/22\n139.5.92.0/22\n139.5.108.0/22\n139.5.128.0/22\n139.5.160.0/22\n139.5.192.0/22\n139.5.204.0/22\n139.5.208.0/21\n139.5.244.0/22\n139.9.0.0/16\n139.129.0.0/16\n139.148.0.0/16\n139.155.0.0/16\n139.159.0.0/16\n139.170.0.0/16\n139.176.0.0/16\n139.183.0.0/16\n139.186.0.0/16\n139.189.0.0/16\n139.196.0.0/14\n139.200.0.0/13\n139.208.0.0/13\n139.217.0.0/16\n139.219.0.0/16\n139.220.0.0/15\n139.224.0.0/16\n139.226.0.0/15\n140.75.0.0/16\n140.143.0.0/16\n140.179.0.0/16\n140.205.0.0/16\n140.206.0.0/15\n140.210.0.0/16\n140.224.0.0/16\n140.237.0.0/16\n140.240.0.0/16\n140.243.0.0/16\n140.246.0.0/16\n140.249.0.0/16\n140.250.0.0/16\n140.255.0.0/16\n144.0.0.0/16\n144.7.0.0/16\n144.12.0.0/16\n144.48.8.0/22\n144.48.64.0/22\n144.48.88.0/22\n144.48.156.0/22\n144.48.180.0/22\n144.48.184.0/22\n144.48.204.0/22\n144.48.208.0/21\n144.48.220.0/22\n144.48.252.0/22\n144.52.0.0/16\n144.123.0.0/16\n144.255.0.0/16\n146.56.192.0/18\n146.196.56.0/22\n146.196.68.0/22\n146.196.72.0/22\n146.196.92.0/22\n146.196.112.0/21\n146.196.124.0/22\n148.70.0.0/16\n150.0.0.0/16\n150.115.0.0/16\n150.121.0.0/16\n150.122.0.0/16\n150.129.136.0/22\n150.129.192.0/22\n150.129.216.0/22\n150.129.252.0/22\n150.138.0.0/15\n150.158.0.0/16\n150.223.0.0/16\n150.242.0.0/21\n150.242.8.0/22\n150.242.28.0/22\n150.242.44.0/22\n150.242.48.0/21\n150.242.56.0/22\n150.242.76.0/22\n150.242.80.0/22\n150.242.92.0/22\n150.242.96.0/22\n150.242.112.0/21\n150.242.120.0/22\n150.242.152.0/21\n150.242.160.0/21\n150.242.168.0/22\n150.242.184.0/21\n150.242.192.0/22\n150.242.212.0/22\n150.242.224.0/20\n150.242.240.0/21\n150.242.248.0/22\n150.255.0.0/16\n152.104.128.0/17\n152.136.0.0/16\n153.0.0.0/16\n153.3.0.0/16\n153.34.0.0/15\n153.36.0.0/15\n153.99.0.0/16\n153.101.0.0/16\n153.118.0.0/15\n154.8.128.0/17\n157.0.0.0/16\n157.18.0.0/16\n157.61.0.0/16\n157.119.0.0/22\n157.119.8.0/21\n157.119.16.0/22\n157.119.28.0/22\n157.119.68.0/22\n157.119.112.0/22\n157.119.132.0/22\n157.119.136.0/21\n157.119.144.0/20\n157.119.160.0/21\n157.119.172.0/22\n157.119.192.0/21\n157.119.240.0/22\n157.119.252.0/22\n157.122.0.0/16\n157.148.0.0/16\n157.156.0.0/16\n157.255.0.0/16\n159.75.0.0/16\n159.226.0.0/16\n160.19.208.0/21\n160.19.216.0/22\n160.20.48.0/22\n160.202.60.0/22\n160.202.148.0/22\n160.202.152.0/22\n160.202.168.0/22\n160.202.212.0/22\n160.202.216.0/21\n160.202.224.0/19\n160.238.64.0/22\n161.189.0.0/16\n161.207.0.0/16\n162.14.0.0/16\n162.105.0.0/16\n163.0.0.0/16\n163.47.4.0/22\n163.53.0.0/20\n163.53.36.0/22\n163.53.40.0/21\n163.53.48.0/20\n163.53.64.0/22\n163.53.88.0/21\n163.53.96.0/19\n163.53.128.0/21\n163.53.136.0/22\n163.53.160.0/20\n163.53.188.0/22\n163.53.220.0/22\n163.53.240.0/22\n163.125.0.0/16\n163.142.0.0/16\n163.177.0.0/16\n163.179.0.0/16\n163.204.0.0/16\n164.52.0.0/17\n166.111.0.0/16\n167.139.0.0/16\n167.189.0.0/16\n167.220.244.0/22\n168.160.0.0/16\n170.179.0.0/16\n171.8.0.0/13\n171.34.0.0/15\n171.36.0.0/14\n171.40.0.0/13\n171.80.0.0/12\n171.104.0.0/13\n171.112.0.0/12\n171.208.0.0/12\n172.81.192.0/18\n175.0.0.0/12\n175.16.0.0/13\n175.24.0.0/14\n175.30.0.0/15\n175.42.0.0/15\n175.44.0.0/16\n175.46.0.0/15\n175.48.0.0/12\n175.64.0.0/11\n175.102.0.0/16\n175.106.128.0/17\n175.111.144.0/20\n175.111.160.0/20\n175.111.184.0/22\n175.146.0.0/15\n175.148.0.0/14\n175.152.0.0/14\n175.158.96.0/22\n175.160.0.0/12\n175.176.156.0/22\n175.176.176.0/22\n175.176.188.0/22\n175.176.192.0/22\n175.178.0.0/16\n175.184.128.0/18\n175.185.0.0/16\n175.186.0.0/15\n175.188.0.0/14\n180.76.0.0/14\n180.84.0.0/15\n180.86.0.0/16\n180.88.0.0/14\n180.94.56.0/21\n180.94.96.0/20\n180.94.120.0/21\n180.95.128.0/17\n180.96.0.0/11\n180.129.128.0/17\n180.130.0.0/16\n180.136.0.0/13\n180.148.16.0/21\n180.148.152.0/21\n180.148.216.0/21\n180.148.224.0/19\n180.149.128.0/19\n180.149.236.0/22\n180.150.160.0/19\n180.152.0.0/13\n180.160.0.0/12\n180.178.112.0/21\n180.178.192.0/18\n180.184.0.0/14\n180.188.0.0/17\n180.189.148.0/22\n180.200.252.0/22\n180.201.0.0/16\n180.202.0.0/15\n180.208.0.0/15\n180.210.212.0/22\n180.210.224.0/19\n180.212.0.0/15\n180.222.224.0/19\n180.223.0.0/16\n180.233.0.0/18\n180.233.64.0/19\n180.233.144.0/22\n180.235.64.0/19\n180.235.112.0/22\n180.235.136.0/22\n182.16.144.0/21\n182.16.192.0/19\n182.18.0.0/17\n182.23.184.0/21\n182.23.200.0/21\n182.32.0.0/12\n182.48.96.0/19\n182.49.0.0/16\n182.50.0.0/20\n182.50.112.0/20\n182.51.0.0/16\n182.54.0.0/17\n182.54.244.0/22\n182.61.0.0/16\n182.80.0.0/13\n182.88.0.0/14\n182.92.0.0/16\n182.96.0.0/11\n182.128.0.0/12\n182.144.0.0/13\n182.157.0.0/16\n182.160.64.0/19\n182.174.0.0/15\n182.200.0.0/13\n182.236.128.0/17\n182.237.24.0/21\n182.238.0.0/16\n182.239.0.0/19\n182.240.0.0/13\n182.254.0.0/16\n182.255.32.0/21\n182.255.60.0/22\n183.0.0.0/10\n183.64.0.0/13\n183.78.160.0/21\n183.78.180.0/22\n183.81.172.0/22\n183.81.180.0/22\n183.84.0.0/15\n183.91.128.0/22\n183.91.136.0/21\n183.91.144.0/20\n183.92.0.0/14\n183.128.0.0/11\n183.160.0.0/13\n183.168.0.0/15\n183.170.0.0/16\n183.172.0.0/14\n183.182.0.0/19\n183.184.0.0/13\n183.192.0.0/10\n185.203.36.0/22\n188.131.128.0/17\n192.51.188.0/24\n192.55.46.0/24\n192.55.68.0/22\n192.102.204.0/23\n192.124.154.0/24\n192.140.128.0/21\n192.140.136.0/22\n192.140.156.0/22\n192.140.160.0/19\n192.140.192.0/20\n192.140.208.0/21\n192.144.128.0/17\n192.197.113.0/24\n193.112.0.0/16\n198.175.100.0/22\n199.212.57.0/24\n202.0.100.0/23\n202.0.122.0/23\n202.0.176.0/22\n202.3.128.0/23\n202.3.134.0/24\n202.4.128.0/19\n202.4.252.0/22\n202.5.208.0/21\n202.5.216.0/22\n202.6.6.0/23\n202.6.66.0/23\n202.6.72.0/23\n202.6.87.0/24\n202.6.88.0/23\n202.6.92.0/23\n202.6.103.0/24\n202.6.108.0/24\n202.6.110.0/23\n202.6.114.0/24\n202.6.176.0/20\n202.8.0.0/24\n202.8.2.0/23\n202.8.4.0/23\n202.8.12.0/24\n202.8.24.0/24\n202.8.77.0/24\n202.8.120.0/22\n202.8.128.0/19\n202.8.192.0/20\n202.9.32.0/24\n202.9.34.0/23\n202.9.48.0/23\n202.9.51.0/24\n202.9.52.0/23\n202.9.54.0/24\n202.9.57.0/24\n202.9.58.0/23\n202.10.64.0/20\n202.10.112.0/20\n202.12.1.0/24\n202.12.2.0/24\n202.12.17.0/24\n202.12.18.0/23\n202.12.72.0/24\n202.12.84.0/23\n202.12.96.0/24\n202.12.98.0/23\n202.12.106.0/24\n202.12.111.0/24\n202.12.116.0/24\n202.14.64.0/23\n202.14.69.0/24\n202.14.73.0/24\n202.14.74.0/23\n202.14.76.0/24\n202.14.78.0/23\n202.14.88.0/24\n202.14.97.0/24\n202.14.104.0/23\n202.14.108.0/23\n202.14.111.0/24\n202.14.114.0/23\n202.14.118.0/23\n202.14.124.0/23\n202.14.127.0/24\n202.14.129.0/24\n202.14.135.0/24\n202.14.136.0/24\n202.14.149.0/24\n202.14.151.0/24\n202.14.157.0/24\n202.14.158.0/23\n202.14.169.0/24\n202.14.170.0/23\n202.14.172.0/22\n202.14.176.0/24\n202.14.184.0/23\n202.14.208.0/23\n202.14.213.0/24\n202.14.219.0/24\n202.14.220.0/24\n202.14.222.0/23\n202.14.225.0/24\n202.14.226.0/23\n202.14.231.0/24\n202.14.235.0/24\n202.14.236.0/22\n202.14.246.0/24\n202.14.251.0/24\n202.20.66.0/24\n202.20.79.0/24\n202.20.87.0/24\n202.20.88.0/23\n202.20.90.0/24\n202.20.94.0/23\n202.20.114.0/24\n202.20.117.0/24\n202.20.120.0/24\n202.20.125.0/24\n202.20.126.0/23\n202.21.48.0/20\n202.21.131.0/24\n202.21.132.0/24\n202.21.141.0/24\n202.21.142.0/24\n202.21.147.0/24\n202.21.148.0/24\n202.21.150.0/23\n202.21.152.0/23\n202.21.154.0/24\n202.21.156.0/24\n202.22.248.0/21\n202.27.12.0/24\n202.27.14.0/24\n202.27.136.0/23\n202.36.226.0/24\n202.38.0.0/22\n202.38.8.0/21\n202.38.48.0/20\n202.38.64.0/18\n202.38.128.0/21\n202.38.136.0/23\n202.38.138.0/24\n202.38.140.0/22\n202.38.146.0/23\n202.38.149.0/24\n202.38.150.0/23\n202.38.152.0/22\n202.38.156.0/24\n202.38.158.0/23\n202.38.160.0/23\n202.38.164.0/22\n202.38.168.0/22\n202.38.176.0/23\n202.38.184.0/21\n202.38.192.0/18\n202.40.4.0/23\n202.40.7.0/24\n202.40.15.0/24\n202.40.135.0/24\n202.40.136.0/24\n202.40.140.0/24\n202.40.143.0/24\n202.40.144.0/23\n202.40.150.0/24\n202.40.155.0/24\n202.40.156.0/24\n202.40.158.0/23\n202.40.162.0/24\n202.41.8.0/23\n202.41.11.0/24\n202.41.12.0/23\n202.41.128.0/24\n202.41.130.0/23\n202.41.152.0/21\n202.41.192.0/24\n202.41.196.0/22\n202.41.200.0/22\n202.41.240.0/20\n202.43.76.0/22\n202.43.144.0/20\n202.44.16.0/20\n202.44.48.0/22\n202.44.67.0/24\n202.44.74.0/24\n202.44.97.0/24\n202.44.129.0/24\n202.44.132.0/23\n202.44.146.0/23\n202.45.0.0/23\n202.45.2.0/24\n202.45.15.0/24\n202.45.16.0/20\n202.46.16.0/23\n202.46.18.0/24\n202.46.20.0/23\n202.46.32.0/19\n202.46.128.0/24\n202.46.224.0/20\n202.47.82.0/23\n202.47.96.0/20\n202.47.126.0/24\n202.47.128.0/24\n202.47.130.0/23\n202.52.33.0/24\n202.52.34.0/24\n202.52.47.0/24\n202.52.143.0/24\n202.52.144.0/24\n202.53.140.0/24\n202.53.143.0/24\n202.57.192.0/20\n202.57.212.0/22\n202.57.216.0/22\n202.57.240.0/20\n202.58.0.0/24\n202.58.101.0/24\n202.58.104.0/22\n202.58.112.0/22\n202.59.0.0/23\n202.59.212.0/22\n202.59.236.0/24\n202.59.240.0/24\n202.60.48.0/21\n202.60.96.0/21\n202.60.112.0/20\n202.60.132.0/22\n202.60.136.0/21\n202.60.144.0/20\n202.61.68.0/22\n202.61.76.0/22\n202.61.88.0/22\n202.61.123.0/24\n202.61.127.0/24\n202.62.112.0/22\n202.62.248.0/22\n202.62.252.0/24\n202.62.255.0/24\n202.63.80.0/20\n202.63.160.0/19\n202.63.248.0/22\n202.63.253.0/24\n202.65.0.0/21\n202.65.8.0/23\n202.65.96.0/20\n202.66.168.0/22\n202.67.0.0/22\n202.69.4.0/22\n202.69.16.0/20\n202.70.0.0/19\n202.70.96.0/20\n202.70.192.0/20\n202.71.32.0/20\n202.72.40.0/21\n202.72.80.0/20\n202.72.112.0/20\n202.73.128.0/22\n202.73.240.0/20\n202.74.8.0/21\n202.74.36.0/24\n202.74.42.0/24\n202.74.52.0/24\n202.74.80.0/20\n202.74.232.0/22\n202.74.254.0/23\n202.75.208.0/20\n202.75.252.0/22\n202.76.252.0/22\n202.77.80.0/21\n202.77.92.0/22\n202.78.8.0/21\n202.79.224.0/21\n202.79.248.0/22\n202.80.192.0/20\n202.81.0.0/22\n202.81.176.0/20\n202.83.252.0/22\n202.84.0.0/20\n202.84.16.0/23\n202.84.22.0/24\n202.84.24.0/21\n202.85.208.0/20\n202.86.249.0/24\n202.86.252.0/22\n202.87.80.0/20\n202.88.32.0/22\n202.89.8.0/21\n202.89.96.0/22\n202.89.108.0/22\n202.89.119.0/24\n202.89.232.0/21\n202.90.0.0/22\n202.90.16.0/20\n202.90.37.0/24\n202.90.96.0/19\n202.90.193.0/24\n202.90.196.0/24\n202.90.205.0/24\n202.90.224.0/20\n202.91.0.0/22\n202.91.36.0/22\n202.91.96.0/20\n202.91.128.0/22\n202.91.176.0/20\n202.91.224.0/19\n202.92.0.0/22\n202.92.8.0/21\n202.92.48.0/20\n202.92.252.0/22\n202.93.0.0/22\n202.93.252.0/22\n202.94.68.0/24\n202.94.74.0/24\n202.94.81.0/24\n202.94.92.0/22\n202.95.240.0/21\n202.95.252.0/22\n202.96.0.0/12\n202.112.0.0/13\n202.120.0.0/15\n202.122.0.0/21\n202.122.32.0/21\n202.122.64.0/19\n202.122.112.0/20\n202.122.128.0/24\n202.122.132.0/24\n202.123.96.0/20\n202.123.116.0/22\n202.123.120.0/22\n202.124.16.0/21\n202.124.24.0/22\n202.125.107.0/24\n202.125.109.0/24\n202.125.112.0/20\n202.125.176.0/20\n202.127.0.0/21\n202.127.12.0/22\n202.127.16.0/20\n202.127.40.0/21\n202.127.48.0/20\n202.127.112.0/20\n202.127.128.0/19\n202.127.160.0/21\n202.127.192.0/20\n202.127.208.0/23\n202.127.212.0/22\n202.127.216.0/21\n202.127.224.0/19\n202.129.208.0/24\n202.130.0.0/19\n202.130.39.0/24\n202.130.224.0/19\n202.131.16.0/21\n202.131.48.0/20\n202.131.208.0/20\n202.133.32.0/20\n202.134.58.0/24\n202.134.128.0/20\n202.134.208.0/20\n202.136.48.0/20\n202.136.208.0/20\n202.136.224.0/20\n202.136.248.0/22\n202.137.231.0/24\n202.140.140.0/22\n202.140.144.0/20\n202.141.160.0/19\n202.142.16.0/20\n202.143.4.0/22\n202.143.16.0/20\n202.143.32.0/20\n202.143.56.0/21\n202.143.100.0/22\n202.143.104.0/22\n202.144.196.0/22\n202.146.160.0/20\n202.146.186.0/24\n202.146.188.0/22\n202.146.196.0/22\n202.146.200.0/21\n202.147.144.0/20\n202.148.32.0/20\n202.148.64.0/18\n202.149.32.0/19\n202.149.160.0/19\n202.149.224.0/19\n202.150.16.0/20\n202.150.32.0/20\n202.150.56.0/22\n202.150.192.0/20\n202.150.224.0/19\n202.151.0.0/22\n202.151.33.0/24\n202.151.128.0/19\n202.152.176.0/20\n202.153.0.0/22\n202.153.7.0/24\n202.153.48.0/20\n202.157.192.0/19\n202.158.160.0/19\n202.158.242.0/24\n202.160.140.0/22\n202.160.156.0/22\n202.160.176.0/20\n202.162.67.0/24\n202.162.75.0/24\n202.164.0.0/20\n202.164.96.0/19\n202.165.176.0/20\n202.165.208.0/20\n202.165.239.0/24\n202.165.240.0/23\n202.165.243.0/24\n202.165.245.0/24\n202.165.251.0/24\n202.165.252.0/22\n202.166.224.0/19\n202.168.80.0/22\n202.168.128.0/20\n202.168.160.0/19\n202.170.128.0/19\n202.170.216.0/21\n202.170.224.0/19\n202.171.216.0/21\n202.171.232.0/24\n202.171.235.0/24\n202.172.0.0/22\n202.172.7.0/24\n202.173.0.0/22\n202.173.6.0/24\n202.173.8.0/21\n202.173.112.0/22\n202.173.224.0/19\n202.174.64.0/20\n202.174.124.0/22\n202.176.224.0/19\n202.179.160.0/20\n202.179.240.0/20\n202.180.128.0/19\n202.180.208.0/21\n202.181.8.0/22\n202.181.28.0/22\n202.181.112.0/20\n202.182.32.0/20\n202.182.192.0/19\n202.189.0.0/18\n202.189.80.0/20\n202.189.184.0/21\n202.191.0.0/24\n202.191.68.0/22\n202.191.72.0/21\n202.191.80.0/20\n202.192.0.0/12\n203.0.4.0/22\n203.0.10.0/23\n203.0.18.0/24\n203.0.24.0/24\n203.0.42.0/23\n203.0.45.0/24\n203.0.46.0/23\n203.0.81.0/24\n203.0.82.0/23\n203.0.90.0/23\n203.0.96.0/23\n203.0.104.0/21\n203.0.114.0/23\n203.0.122.0/24\n203.0.128.0/24\n203.0.130.0/23\n203.0.132.0/22\n203.0.137.0/24\n203.0.142.0/24\n203.0.144.0/24\n203.0.146.0/24\n203.0.148.0/24\n203.0.150.0/23\n203.0.152.0/24\n203.0.177.0/24\n203.0.224.0/24\n203.1.4.0/22\n203.1.18.0/24\n203.1.26.0/23\n203.1.65.0/24\n203.1.66.0/23\n203.1.70.0/23\n203.1.76.0/23\n203.1.90.0/24\n203.1.97.0/24\n203.1.98.0/23\n203.1.100.0/22\n203.1.108.0/24\n203.1.253.0/24\n203.1.254.0/24\n203.2.64.0/21\n203.2.73.0/24\n203.2.112.0/21\n203.2.126.0/23\n203.2.140.0/24\n203.2.150.0/24\n203.2.152.0/22\n203.2.156.0/23\n203.2.160.0/21\n203.2.180.0/23\n203.2.196.0/23\n203.2.209.0/24\n203.2.214.0/23\n203.2.226.0/23\n203.2.229.0/24\n203.2.236.0/23\n203.3.68.0/24\n203.3.72.0/23\n203.3.75.0/24\n203.3.80.0/21\n203.3.96.0/22\n203.3.105.0/24\n203.3.112.0/21\n203.3.120.0/24\n203.3.123.0/24\n203.3.135.0/24\n203.3.139.0/24\n203.3.143.0/24\n203.4.132.0/23\n203.4.134.0/24\n203.4.151.0/24\n203.4.152.0/22\n203.4.174.0/23\n203.4.180.0/24\n203.4.186.0/24\n203.4.205.0/24\n203.4.208.0/22\n203.4.227.0/24\n203.4.230.0/23\n203.5.4.0/23\n203.5.7.0/24\n203.5.8.0/23\n203.5.11.0/24\n203.5.21.0/24\n203.5.22.0/24\n203.5.44.0/24\n203.5.46.0/23\n203.5.52.0/22\n203.5.56.0/23\n203.5.60.0/23\n203.5.114.0/23\n203.5.118.0/24\n203.5.120.0/24\n203.5.172.0/24\n203.5.180.0/23\n203.5.182.0/24\n203.5.185.0/24\n203.5.186.0/24\n203.5.188.0/23\n203.5.190.0/24\n203.5.195.0/24\n203.5.214.0/23\n203.5.218.0/23\n203.6.131.0/24\n203.6.136.0/24\n203.6.138.0/23\n203.6.142.0/24\n203.6.150.0/23\n203.6.157.0/24\n203.6.159.0/24\n203.6.224.0/20\n203.6.248.0/23\n203.7.129.0/24\n203.7.138.0/23\n203.7.147.0/24\n203.7.150.0/23\n203.7.158.0/24\n203.7.192.0/23\n203.7.200.0/24\n203.8.0.0/24\n203.8.8.0/24\n203.8.23.0/24\n203.8.70.0/24\n203.8.82.0/24\n203.8.86.0/23\n203.8.91.0/24\n203.8.110.0/23\n203.8.115.0/24\n203.8.166.0/23\n203.8.169.0/24\n203.8.173.0/24\n203.8.184.0/24\n203.8.186.0/23\n203.8.190.0/23\n203.8.192.0/24\n203.8.197.0/24\n203.8.198.0/23\n203.8.203.0/24\n203.8.209.0/24\n203.8.210.0/23\n203.8.212.0/22\n203.8.217.0/24\n203.8.220.0/24\n203.9.32.0/24\n203.9.36.0/23\n203.9.57.0/24\n203.9.63.0/24\n203.9.65.0/24\n203.9.70.0/23\n203.9.72.0/24\n203.9.75.0/24\n203.9.76.0/23\n203.9.96.0/22\n203.9.100.0/23\n203.9.108.0/24\n203.9.158.0/24\n203.10.34.0/24\n203.10.56.0/24\n203.10.74.0/23\n203.10.84.0/22\n203.10.88.0/24\n203.10.95.0/24\n203.10.125.0/24\n203.11.70.0/24\n203.11.76.0/22\n203.11.82.0/24\n203.11.84.0/22\n203.11.100.0/22\n203.11.109.0/24\n203.11.117.0/24\n203.11.122.0/24\n203.11.126.0/24\n203.11.136.0/22\n203.11.141.0/24\n203.11.142.0/23\n203.11.180.0/22\n203.11.208.0/22\n203.12.16.0/24\n203.12.19.0/24\n203.12.24.0/24\n203.12.57.0/24\n203.12.65.0/24\n203.12.66.0/24\n203.12.70.0/23\n203.12.87.0/24\n203.12.100.0/23\n203.12.103.0/24\n203.12.114.0/24\n203.12.118.0/24\n203.12.130.0/24\n203.12.137.0/24\n203.12.196.0/22\n203.12.211.0/24\n203.12.219.0/24\n203.12.226.0/24\n203.12.240.0/22\n203.13.18.0/24\n203.13.24.0/24\n203.13.44.0/23\n203.13.88.0/23\n203.13.92.0/22\n203.13.173.0/24\n203.13.224.0/23\n203.13.227.0/24\n203.13.233.0/24\n203.14.24.0/22\n203.14.33.0/24\n203.14.56.0/24\n203.14.61.0/24\n203.14.62.0/24\n203.14.104.0/24\n203.14.114.0/23\n203.14.118.0/24\n203.14.162.0/24\n203.14.192.0/24\n203.14.194.0/23\n203.14.214.0/24\n203.14.231.0/24\n203.14.246.0/24\n203.15.0.0/20\n203.15.20.0/23\n203.15.22.0/24\n203.15.87.0/24\n203.15.88.0/23\n203.15.105.0/24\n203.15.112.0/21\n203.15.130.0/23\n203.15.149.0/24\n203.15.151.0/24\n203.15.156.0/22\n203.15.174.0/24\n203.15.227.0/24\n203.15.232.0/21\n203.15.240.0/23\n203.15.246.0/24\n203.16.10.0/24\n203.16.12.0/23\n203.16.16.0/21\n203.16.27.0/24\n203.16.38.0/24\n203.16.49.0/24\n203.16.50.0/23\n203.16.58.0/24\n203.16.63.0/24\n203.16.133.0/24\n203.16.161.0/24\n203.16.162.0/24\n203.16.186.0/23\n203.16.228.0/24\n203.16.238.0/24\n203.16.240.0/24\n203.16.245.0/24\n203.17.2.0/24\n203.17.18.0/24\n203.17.28.0/24\n203.17.39.0/24\n203.17.56.0/24\n203.17.74.0/23\n203.17.88.0/23\n203.17.136.0/24\n203.17.164.0/24\n203.17.187.0/24\n203.17.190.0/23\n203.17.231.0/24\n203.17.233.0/24\n203.17.248.0/23\n203.17.255.0/24\n203.18.2.0/23\n203.18.4.0/24\n203.18.7.0/24\n203.18.31.0/24\n203.18.37.0/24\n203.18.48.0/23\n203.18.52.0/24\n203.18.72.0/22\n203.18.80.0/23\n203.18.87.0/24\n203.18.100.0/23\n203.18.105.0/24\n203.18.107.0/24\n203.18.110.0/24\n203.18.129.0/24\n203.18.131.0/24\n203.18.132.0/23\n203.18.144.0/24\n203.18.153.0/24\n203.18.199.0/24\n203.18.208.0/24\n203.18.211.0/24\n203.18.215.0/24\n203.19.1.0/24\n203.19.18.0/24\n203.19.24.0/24\n203.19.30.0/24\n203.19.32.0/21\n203.19.41.0/24\n203.19.44.0/23\n203.19.46.0/24\n203.19.58.0/24\n203.19.60.0/23\n203.19.64.0/24\n203.19.68.0/24\n203.19.72.0/24\n203.19.101.0/24\n203.19.111.0/24\n203.19.131.0/24\n203.19.133.0/24\n203.19.144.0/24\n203.19.147.0/24\n203.19.149.0/24\n203.19.156.0/24\n203.19.176.0/24\n203.19.178.0/23\n203.19.208.0/24\n203.19.228.0/22\n203.19.233.0/24\n203.19.242.0/24\n203.19.248.0/23\n203.19.255.0/24\n203.20.17.0/24\n203.20.40.0/23\n203.20.44.0/24\n203.20.48.0/24\n203.20.61.0/24\n203.20.65.0/24\n203.20.84.0/23\n203.20.89.0/24\n203.20.106.0/23\n203.20.115.0/24\n203.20.117.0/24\n203.20.118.0/23\n203.20.122.0/24\n203.20.126.0/23\n203.20.135.0/24\n203.20.136.0/21\n203.20.150.0/24\n203.20.230.0/24\n203.20.232.0/24\n203.20.236.0/24\n203.21.0.0/23\n203.21.2.0/24\n203.21.8.0/24\n203.21.10.0/24\n203.21.18.0/24\n203.21.33.0/24\n203.21.34.0/24\n203.21.41.0/24\n203.21.44.0/24\n203.21.68.0/24\n203.21.82.0/24\n203.21.96.0/22\n203.21.124.0/24\n203.21.136.0/23\n203.21.145.0/24\n203.21.206.0/24\n203.22.24.0/24\n203.22.28.0/23\n203.22.31.0/24\n203.22.68.0/24\n203.22.76.0/24\n203.22.78.0/24\n203.22.84.0/24\n203.22.87.0/24\n203.22.92.0/22\n203.22.99.0/24\n203.22.106.0/24\n203.22.122.0/23\n203.22.131.0/24\n203.22.163.0/24\n203.22.166.0/24\n203.22.170.0/24\n203.22.176.0/21\n203.22.194.0/24\n203.22.242.0/23\n203.22.245.0/24\n203.22.246.0/24\n203.22.252.0/23\n203.23.0.0/24\n203.23.47.0/24\n203.23.61.0/24\n203.23.62.0/23\n203.23.73.0/24\n203.23.85.0/24\n203.23.92.0/22\n203.23.98.0/24\n203.23.107.0/24\n203.23.112.0/24\n203.23.130.0/24\n203.23.140.0/23\n203.23.172.0/24\n203.23.182.0/24\n203.23.186.0/23\n203.23.192.0/24\n203.23.197.0/24\n203.23.198.0/24\n203.23.204.0/22\n203.23.224.0/24\n203.23.226.0/23\n203.23.228.0/22\n203.23.249.0/24\n203.23.251.0/24\n203.24.13.0/24\n203.24.18.0/24\n203.24.27.0/24\n203.24.43.0/24\n203.24.56.0/24\n203.24.58.0/24\n203.24.67.0/24\n203.24.74.0/24\n203.24.79.0/24\n203.24.80.0/23\n203.24.84.0/23\n203.24.86.0/24\n203.24.90.0/24\n203.24.111.0/24\n203.24.112.0/24\n203.24.116.0/24\n203.24.122.0/23\n203.24.145.0/24\n203.24.152.0/23\n203.24.157.0/24\n203.24.161.0/24\n203.24.167.0/24\n203.24.186.0/23\n203.24.199.0/24\n203.24.202.0/24\n203.24.212.0/23\n203.24.217.0/24\n203.24.219.0/24\n203.24.244.0/24\n203.25.19.0/24\n203.25.20.0/23\n203.25.46.0/24\n203.25.48.0/21\n203.25.64.0/23\n203.25.91.0/24\n203.25.99.0/24\n203.25.100.0/24\n203.25.106.0/24\n203.25.131.0/24\n203.25.135.0/24\n203.25.138.0/24\n203.25.147.0/24\n203.25.153.0/24\n203.25.154.0/23\n203.25.164.0/24\n203.25.166.0/24\n203.25.174.0/23\n203.25.180.0/24\n203.25.182.0/24\n203.25.191.0/24\n203.25.199.0/24\n203.25.200.0/24\n203.25.202.0/23\n203.25.208.0/20\n203.25.229.0/24\n203.25.235.0/24\n203.25.236.0/24\n203.25.242.0/24\n203.26.12.0/24\n203.26.34.0/24\n203.26.49.0/24\n203.26.50.0/24\n203.26.55.0/24\n203.26.56.0/23\n203.26.60.0/24\n203.26.65.0/24\n203.26.68.0/24\n203.26.76.0/24\n203.26.80.0/24\n203.26.84.0/24\n203.26.97.0/24\n203.26.102.0/23\n203.26.115.0/24\n203.26.116.0/24\n203.26.129.0/24\n203.26.143.0/24\n203.26.144.0/24\n203.26.148.0/23\n203.26.154.0/24\n203.26.158.0/23\n203.26.170.0/24\n203.26.173.0/24\n203.26.176.0/24\n203.26.185.0/24\n203.26.202.0/23\n203.26.210.0/24\n203.26.214.0/24\n203.26.222.0/24\n203.26.224.0/24\n203.26.228.0/24\n203.26.232.0/24\n203.27.0.0/24\n203.27.10.0/24\n203.27.15.0/24\n203.27.16.0/24\n203.27.20.0/24\n203.27.22.0/23\n203.27.40.0/24\n203.27.45.0/24\n203.27.53.0/24\n203.27.65.0/24\n203.27.66.0/24\n203.27.81.0/24\n203.27.88.0/24\n203.27.102.0/24\n203.27.109.0/24\n203.27.117.0/24\n203.27.121.0/24\n203.27.122.0/23\n203.27.125.0/24\n203.27.200.0/24\n203.27.202.0/24\n203.27.233.0/24\n203.27.241.0/24\n203.27.250.0/24\n203.28.10.0/24\n203.28.12.0/24\n203.28.33.0/24\n203.28.34.0/23\n203.28.43.0/24\n203.28.44.0/24\n203.28.54.0/24\n203.28.56.0/24\n203.28.73.0/24\n203.28.74.0/24\n203.28.76.0/24\n203.28.86.0/24\n203.28.88.0/24\n203.28.112.0/24\n203.28.131.0/24\n203.28.136.0/24\n203.28.140.0/24\n203.28.145.0/24\n203.28.165.0/24\n203.28.169.0/24\n203.28.170.0/24\n203.28.178.0/23\n203.28.185.0/24\n203.28.187.0/24\n203.28.196.0/24\n203.28.226.0/23\n203.28.239.0/24\n203.29.2.0/24\n203.29.8.0/23\n203.29.13.0/24\n203.29.14.0/24\n203.29.28.0/24\n203.29.46.0/24\n203.29.57.0/24\n203.29.61.0/24\n203.29.63.0/24\n203.29.69.0/24\n203.29.73.0/24\n203.29.81.0/24\n203.29.90.0/24\n203.29.95.0/24\n203.29.100.0/24\n203.29.103.0/24\n203.29.112.0/24\n203.29.120.0/22\n203.29.182.0/23\n203.29.187.0/24\n203.29.189.0/24\n203.29.190.0/24\n203.29.205.0/24\n203.29.210.0/24\n203.29.217.0/24\n203.29.227.0/24\n203.29.231.0/24\n203.29.233.0/24\n203.29.234.0/24\n203.29.248.0/24\n203.29.254.0/23\n203.30.16.0/23\n203.30.25.0/24\n203.30.27.0/24\n203.30.29.0/24\n203.30.66.0/24\n203.30.81.0/24\n203.30.87.0/24\n203.30.111.0/24\n203.30.121.0/24\n203.30.123.0/24\n203.30.152.0/24\n203.30.156.0/24\n203.30.162.0/24\n203.30.173.0/24\n203.30.175.0/24\n203.30.187.0/24\n203.30.194.0/24\n203.30.217.0/24\n203.30.220.0/24\n203.30.222.0/24\n203.30.232.0/23\n203.30.235.0/24\n203.30.240.0/23\n203.30.246.0/24\n203.30.250.0/23\n203.31.45.0/24\n203.31.46.0/24\n203.31.49.0/24\n203.31.51.0/24\n203.31.54.0/23\n203.31.69.0/24\n203.31.72.0/24\n203.31.80.0/24\n203.31.85.0/24\n203.31.97.0/24\n203.31.105.0/24\n203.31.106.0/24\n203.31.108.0/23\n203.31.124.0/24\n203.31.162.0/24\n203.31.174.0/24\n203.31.177.0/24\n203.31.181.0/24\n203.31.187.0/24\n203.31.189.0/24\n203.31.204.0/24\n203.31.220.0/24\n203.31.222.0/23\n203.31.225.0/24\n203.31.229.0/24\n203.31.248.0/23\n203.31.253.0/24\n203.32.20.0/24\n203.32.48.0/23\n203.32.56.0/24\n203.32.60.0/24\n203.32.62.0/24\n203.32.68.0/23\n203.32.76.0/24\n203.32.81.0/24\n203.32.84.0/23\n203.32.95.0/24\n203.32.102.0/24\n203.32.105.0/24\n203.32.130.0/24\n203.32.133.0/24\n203.32.140.0/24\n203.32.152.0/24\n203.32.186.0/23\n203.32.192.0/24\n203.32.196.0/24\n203.32.203.0/24\n203.32.204.0/23\n203.32.212.0/24\n203.33.4.0/24\n203.33.7.0/24\n203.33.8.0/21\n203.33.21.0/24\n203.33.26.0/24\n203.33.32.0/24\n203.33.63.0/24\n203.33.64.0/24\n203.33.67.0/24\n203.33.68.0/24\n203.33.73.0/24\n203.33.79.0/24\n203.33.100.0/24\n203.33.122.0/24\n203.33.129.0/24\n203.33.131.0/24\n203.33.145.0/24\n203.33.156.0/24\n203.33.158.0/23\n203.33.174.0/24\n203.33.185.0/24\n203.33.200.0/24\n203.33.202.0/23\n203.33.204.0/24\n203.33.206.0/23\n203.33.214.0/23\n203.33.224.0/23\n203.33.226.0/24\n203.33.233.0/24\n203.33.243.0/24\n203.33.250.0/24\n203.34.4.0/24\n203.34.21.0/24\n203.34.27.0/24\n203.34.39.0/24\n203.34.48.0/23\n203.34.54.0/24\n203.34.56.0/23\n203.34.67.0/24\n203.34.69.0/24\n203.34.76.0/24\n203.34.92.0/24\n203.34.106.0/24\n203.34.113.0/24\n203.34.147.0/24\n203.34.150.0/24\n203.34.152.0/23\n203.34.161.0/24\n203.34.162.0/24\n203.34.187.0/24\n203.34.192.0/21\n203.34.204.0/22\n203.34.232.0/24\n203.34.240.0/24\n203.34.242.0/24\n203.34.245.0/24\n203.34.251.0/24\n203.55.2.0/23\n203.55.4.0/24\n203.55.10.0/24\n203.55.13.0/24\n203.55.22.0/24\n203.55.30.0/24\n203.55.93.0/24\n203.55.101.0/24\n203.55.109.0/24\n203.55.110.0/24\n203.55.116.0/23\n203.55.119.0/24\n203.55.128.0/23\n203.55.146.0/23\n203.55.192.0/24\n203.55.196.0/24\n203.55.218.0/23\n203.55.221.0/24\n203.55.224.0/24\n203.56.1.0/24\n203.56.4.0/24\n203.56.12.0/24\n203.56.24.0/24\n203.56.38.0/24\n203.56.40.0/24\n203.56.46.0/24\n203.56.48.0/21\n203.56.68.0/23\n203.56.82.0/23\n203.56.84.0/23\n203.56.95.0/24\n203.56.110.0/24\n203.56.121.0/24\n203.56.161.0/24\n203.56.169.0/24\n203.56.172.0/23\n203.56.175.0/24\n203.56.183.0/24\n203.56.185.0/24\n203.56.187.0/24\n203.56.192.0/24\n203.56.198.0/24\n203.56.201.0/24\n203.56.208.0/23\n203.56.210.0/24\n203.56.214.0/24\n203.56.216.0/24\n203.56.227.0/24\n203.56.228.0/24\n203.56.231.0/24\n203.56.232.0/24\n203.56.240.0/24\n203.56.252.0/24\n203.56.254.0/24\n203.57.5.0/24\n203.57.6.0/24\n203.57.12.0/23\n203.57.28.0/24\n203.57.39.0/24\n203.57.46.0/24\n203.57.58.0/24\n203.57.61.0/24\n203.57.66.0/24\n203.57.69.0/24\n203.57.70.0/23\n203.57.73.0/24\n203.57.90.0/24\n203.57.101.0/24\n203.57.109.0/24\n203.57.123.0/24\n203.57.157.0/24\n203.57.200.0/24\n203.57.202.0/24\n203.57.206.0/24\n203.57.222.0/24\n203.57.224.0/20\n203.57.246.0/23\n203.57.249.0/24\n203.57.253.0/24\n203.57.254.0/23\n203.62.2.0/24\n203.62.131.0/24\n203.62.139.0/24\n203.62.161.0/24\n203.62.197.0/24\n203.62.228.0/22\n203.62.234.0/24\n203.62.246.0/24\n203.76.160.0/22\n203.76.168.0/22\n203.76.208.0/21\n203.76.216.0/22\n203.76.240.0/21\n203.77.180.0/22\n203.78.48.0/20\n203.78.156.0/22\n203.79.0.0/20\n203.79.32.0/20\n203.80.4.0/23\n203.80.32.0/20\n203.80.57.0/24\n203.80.129.0/24\n203.80.132.0/22\n203.80.136.0/21\n203.80.144.0/20\n203.81.0.0/21\n203.81.16.0/20\n203.81.244.0/22\n203.82.0.0/23\n203.82.16.0/21\n203.82.112.0/20\n203.82.224.0/20\n203.83.0.0/22\n203.83.8.0/21\n203.83.56.0/21\n203.83.224.0/20\n203.86.0.0/17\n203.86.250.0/24\n203.86.254.0/23\n203.88.32.0/19\n203.88.100.0/22\n203.88.192.0/19\n203.89.0.0/22\n203.89.8.0/21\n203.89.100.0/22\n203.89.133.0/24\n203.89.136.0/22\n203.89.144.0/24\n203.90.0.0/22\n203.90.8.0/21\n203.90.128.0/18\n203.90.192.0/19\n203.91.32.0/19\n203.91.96.0/20\n203.91.120.0/21\n203.92.0.0/22\n203.92.6.0/24\n203.92.160.0/19\n203.93.0.0/16\n203.94.0.0/19\n203.95.0.0/21\n203.95.96.0/19\n203.95.128.0/18\n203.95.200.0/21\n203.95.208.0/22\n203.95.224.0/19\n203.99.8.0/21\n203.99.16.0/20\n203.99.80.0/20\n203.100.32.0/20\n203.100.48.0/21\n203.100.58.0/24\n203.100.60.0/24\n203.100.63.0/24\n203.100.80.0/20\n203.100.96.0/19\n203.100.192.0/20\n203.104.32.0/20\n203.105.96.0/19\n203.105.128.0/19\n203.107.0.0/17\n203.110.160.0/19\n203.110.208.0/20\n203.110.232.0/23\n203.110.234.0/24\n203.114.80.0/20\n203.114.244.0/22\n203.118.192.0/19\n203.118.241.0/24\n203.118.248.0/22\n203.119.24.0/21\n203.119.32.0/22\n203.119.80.0/22\n203.119.85.0/24\n203.119.113.0/24\n203.119.114.0/23\n203.119.116.0/22\n203.119.120.0/21\n203.119.128.0/17\n203.123.58.0/24\n203.128.32.0/19\n203.128.96.0/19\n203.128.224.0/21\n203.129.8.0/21\n203.130.32.0/19\n203.132.32.0/19\n203.134.240.0/21\n203.135.96.0/19\n203.135.160.0/20\n203.142.219.0/24\n203.142.224.0/19\n203.144.96.0/19\n203.145.0.0/19\n203.148.0.0/18\n203.148.64.0/20\n203.148.80.0/22\n203.148.86.0/23\n203.149.92.0/22\n203.152.64.0/19\n203.152.128.0/19\n203.153.0.0/22\n203.156.192.0/18\n203.158.16.0/21\n203.160.52.0/22\n203.160.104.0/21\n203.160.129.0/24\n203.160.192.0/19\n203.161.0.0/22\n203.161.180.0/24\n203.161.183.0/24\n203.161.192.0/19\n203.166.160.0/19\n203.167.28.0/22\n203.168.0.0/19\n203.170.58.0/23\n203.171.0.0/22\n203.171.208.0/24\n203.171.224.0/20\n203.174.4.0/24\n203.174.6.0/23\n203.174.96.0/19\n203.175.128.0/19\n203.175.192.0/18\n203.176.0.0/18\n203.176.64.0/19\n203.176.168.0/21\n203.184.80.0/20\n203.185.189.0/24\n203.187.160.0/19\n203.189.0.0/23\n203.189.6.0/23\n203.189.112.0/22\n203.189.192.0/19\n203.189.232.0/22\n203.189.240.0/22\n203.190.96.0/20\n203.190.249.0/24\n203.191.0.0/23\n203.191.2.0/24\n203.191.5.0/24\n203.191.7.0/24\n203.191.16.0/20\n203.191.64.0/18\n203.191.133.0/24\n203.191.144.0/20\n203.192.0.0/19\n203.193.224.0/19\n203.194.120.0/21\n203.195.64.0/19\n203.195.112.0/21\n203.195.128.0/17\n203.196.0.0/20\n203.196.28.0/22\n203.201.181.0/24\n203.201.182.0/24\n203.202.236.0/22\n203.205.64.0/19\n203.205.128.0/17\n203.207.64.0/18\n203.207.128.0/17\n203.208.0.0/20\n203.208.16.0/22\n203.208.32.0/19\n203.209.224.0/19\n203.212.0.0/20\n203.212.80.0/20\n203.215.232.0/21\n203.217.164.0/22\n203.223.0.0/20\n203.223.16.0/21\n204.52.191.0/24\n210.2.0.0/19\n210.5.0.0/19\n210.5.56.0/21\n210.5.128.0/19\n210.7.56.0/21\n210.12.0.0/15\n210.14.64.0/19\n210.14.112.0/20\n210.14.128.0/17\n210.15.0.0/17\n210.15.128.0/18\n210.16.104.0/22\n210.16.128.0/18\n210.21.0.0/16\n210.22.0.0/16\n210.23.32.0/19\n210.25.0.0/16\n210.26.0.0/15\n210.28.0.0/14\n210.32.0.0/12\n210.51.0.0/16\n210.52.0.0/15\n210.56.192.0/19\n210.72.0.0/14\n210.76.0.0/15\n210.78.0.0/16\n210.79.64.0/18\n210.79.224.0/19\n210.82.0.0/15\n210.87.128.0/18\n210.185.192.0/18\n210.192.96.0/19\n211.64.0.0/13\n211.80.0.0/12\n211.96.0.0/13\n211.136.0.0/13\n211.144.0.0/12\n211.160.0.0/13\n212.64.0.0/17\n212.129.128.0/17\n218.0.0.0/11\n218.56.0.0/13\n218.64.0.0/11\n218.96.0.0/14\n218.100.88.0/21\n218.100.96.0/19\n218.100.128.0/17\n218.104.0.0/14\n218.108.0.0/15\n218.185.192.0/19\n218.185.240.0/21\n218.192.0.0/12\n218.240.0.0/13\n218.249.0.0/16\n219.72.0.0/16\n219.82.0.0/16\n219.83.128.0/17\n219.90.68.0/22\n219.90.72.0/21\n219.128.0.0/11\n219.216.0.0/13\n219.224.0.0/12\n219.242.0.0/15\n219.244.0.0/14\n220.101.192.0/18\n220.112.0.0/14\n220.152.128.0/17\n220.154.0.0/15\n220.158.240.0/22\n220.160.0.0/11\n220.192.0.0/12\n220.231.0.0/18\n220.231.128.0/17\n220.232.64.0/18\n220.234.0.0/16\n220.242.0.0/15\n220.247.136.0/21\n220.248.0.0/14\n220.252.0.0/16\n221.0.0.0/13\n221.8.0.0/14\n221.12.0.0/17\n221.12.128.0/18\n221.13.0.0/16\n221.14.0.0/15\n221.122.0.0/15\n221.128.128.0/17\n221.129.0.0/16\n221.130.0.0/15\n221.133.224.0/19\n221.136.0.0/15\n221.172.0.0/14\n221.176.0.0/13\n221.192.0.0/14\n221.196.0.0/15\n221.198.0.0/16\n221.199.0.0/17\n221.199.128.0/18\n221.199.192.0/20\n221.199.224.0/19\n221.200.0.0/13\n221.208.0.0/12\n221.224.0.0/12\n222.16.0.0/12\n222.32.0.0/11\n222.64.0.0/11\n222.125.0.0/16\n222.126.128.0/17\n222.128.0.0/12\n222.160.0.0/14\n222.168.0.0/13\n222.176.0.0/12\n222.192.0.0/11\n222.240.0.0/13\n222.248.0.0/15\n223.0.0.0/12\n223.20.0.0/15\n223.27.184.0/22\n223.29.208.0/22\n223.29.252.0/22\n223.64.0.0/11\n223.96.0.0/12\n223.112.0.0/14\n223.116.0.0/15\n223.120.128.0/17\n223.121.128.0/17\n223.122.0.0/15\n223.124.0.0/14\n223.128.0.0/15\n223.144.0.0/12\n223.160.0.0/14\n223.166.0.0/15\n223.192.0.0/15\n223.198.0.0/15\n223.201.0.0/16\n223.202.0.0/15\n223.208.0.0/13\n223.220.0.0/15\n223.223.176.0/20\n223.223.192.0/20\n223.240.0.0/13\n223.248.0.0/14\n223.252.128.0/17\n223.254.0.0/16\n223.255.0.0/17\n223.255.236.0/22\n223.255.252.0/23\n2001:250::/31\n2001:252::/32\n2001:254::/32\n2001:256::/32\n2001:7fa:5::/48\n2001:7fa:10::/48\n2001:c68::/32\n2001:cc0::/32\n2001:da8::/31\n2001:daa::/32\n2001:dc7::/32\n2001:dd8:1::/48\n2001:dd8:5::/48\n2001:dd8:1a::/48\n2001:dd9::/48\n2001:df0:27e::/48\n2001:df0:423::/48\n2001:df0:2180::/48\n2001:df0:2d80::/48\n2001:df0:2e00::/48\n2001:df0:2e80::/48\n2001:df0:4500::/48\n2001:df0:4580::/48\n2001:df0:5d00::/47\n2001:df0:5d80::/48\n2001:df0:9a00::/48\n2001:df0:b180::/48\n2001:df0:bf80::/48\n2001:df0:d180::/48\n2001:df0:d880::/48\n2001:df1:680::/48\n2001:df1:c80::/48\n2001:df1:2080::/48\n2001:df1:3d00::/48\n2001:df1:4180::/48\n2001:df1:4580::/48\n2001:df1:5280::/48\n2001:df1:5b80::/48\n2001:df1:6180::/48\n2001:df1:6b80::/48\n2001:df1:8b00::/48\n2001:df1:a100::/48\n2001:df1:b980::/48\n2001:df1:bd80::/48\n2001:df1:c900::/48\n2001:df1:d100::/48\n2001:df1:d180::/48\n2001:df1:da00::/48\n2001:df1:e600::/48\n2001:df1:f480::/48\n2001:df1:f580::/48\n2001:df1:fd80::/48\n2001:df2:80::/48\n2001:df2:180::/47\n2001:df2:5200::/48\n2001:df2:5780::/48\n2001:df2:5a80::/48\n2001:df3:b100::/48\n2001:df4:1500::/48\n2001:df4:2f00::/48\n2001:df4:5900::/48\n2001:df4:cf00::/48\n2001:df5:7800::/48\n2001:df6:100::/48\n2001:df6:f00::/48\n2001:df6:1c00::/48\n2001:df6:3d00::/48\n2001:df6:5d00::/48\n2001:df6:6800::/48\n2001:df6:df00::/48\n2001:df6:f400::/48\n2001:df7:5900::/48\n2001:df7:6600::/48\n2001:df7:ab00::/48\n2001:e08::/32\n2001:e18::/32\n2001:e80::/32\n2001:e88::/32\n2001:f38::/32\n2001:f88::/32\n2001:4438::/32\n2001:4510::/29\n2400:1040::/32\n2400:12c0::/32\n2400:1340::/32\n2400:1380::/32\n2400:15c0::/32\n2400:1640::/32\n2400:16c0::/32\n2400:1740::/32\n2400:17c0::/32\n2400:1840::/32\n2400:18c0::/32\n2400:1940::/32\n2400:19c0::/32\n2400:1a40::/32\n2400:1ac0::/32\n2400:1b40::/32\n2400:1cc0::/32\n2400:1d40::/32\n2400:1dc0::/32\n2400:1e40::/32\n2400:1ec0::/32\n2400:1f40::/32\n2400:1fc0::/32\n2400:3040::/32\n2400:3140::/32\n2400:31c0::/32\n2400:3200::/32\n2400:3280::/32\n2400:32c0::/32\n2400:3340::/32\n2400:33c0::/32\n2400:3440::/32\n2400:34c0::/32\n2400:3540::/32\n2400:35c0::/32\n2400:3600::/32\n2400:3640::/32\n2400:36c0::/32\n2400:38c0::/32\n2400:39c0::/32\n2400:3a00::/32\n2400:3a40::/32\n2400:3b40::/32\n2400:3bc0::/32\n2400:3c40::/32\n2400:3cc0::/32\n2400:3e00::/32\n2400:3f40::/32\n2400:3fc0::/32\n2400:4440::/32\n2400:44c0::/32\n2400:4540::/32\n2400:4600::/32\n2400:4640::/32\n2400:46c0::/32\n2400:4740::/32\n2400:4bc0::/32\n2400:4e00::/32\n2400:4e40::/32\n2400:5080::/32\n2400:5280::/32\n2400:5400::/32\n2400:5580::/32\n2400:55c0::/32\n2400:5600::/32\n2400:5640::/32\n2400:56c0::/32\n2400:57c0::/32\n2400:5840::/32\n2400:5a00::/32\n2400:5a40::/32\n2400:5ac0::/32\n2400:5b40::/32\n2400:5bc0::/32\n2400:5c40::/32\n2400:5c80::/32\n2400:5cc0::/32\n2400:5e80::/32\n2400:5fc0::/32\n2400:6000::/32\n2400:6040::/32\n2400:60c0::/32\n2400:61c0::/32\n2400:6200::/32\n2400:6600::/32\n2400:6640::/32\n2400:66c0::/32\n2400:6740::/32\n2400:67c0::/32\n2400:6840::/32\n2400:68c0::/32\n2400:6940::/32\n2400:69c0::/32\n2400:6a00::/32\n2400:6a40::/32\n2400:6ac0::/32\n2400:6b40::/32\n2400:6bc0::/32\n2400:6c40::/32\n2400:6cc0::/32\n2400:6d40::/32\n2400:6dc0::/32\n2400:6e00::/32\n2400:6e40::/32\n2400:6ec0::/32\n2400:6f40::/32\n2400:6f80::/32\n2400:6fc0::/32\n2400:7040::/32\n2400:7100::/32\n2400:7140::/32\n2400:71c0::/32\n2400:7200::/32\n2400:7240::/32\n2400:72c0::/32\n2400:7340::/32\n2400:73c0::/32\n2400:7440::/32\n2400:74c0::/32\n2400:7540::/32\n2400:75c0::/32\n2400:7640::/32\n2400:7680::/32\n2400:76c0::/32\n2400:7740::/32\n2400:77c0::/32\n2400:79c0::/32\n2400:7ac0::/32\n2400:7bc0::/32\n2400:7f80::/32\n2400:7fc0::/32\n2400:8080::/32\n2400:8200::/32\n2400:82c0::/32\n2400:8580::/32\n2400:8600::/32\n2400:8780::/32\n2400:87c0::/32\n2400:8840::/32\n2400:8980::/32\n2400:89c0::/32\n2400:8e00::/32\n2400:8f00::/32\n2400:8fc0::/32\n2400:9040::/32\n2400:9340::/32\n2400:9580::/32\n2400:95c0::/32\n2400:9600::/32\n2400:98c0::/32\n2400:9a00::/32\n2400:9dc0::/32\n2400:9e00::/32\n2400:a040::/32\n2400:a380::/32\n2400:a480::/32\n2400:a6c0::/32\n2400:a780::/32\n2400:a8c0::/32\n2400:a900::/32\n2400:a980::/29\n2400:abc0::/32\n2400:ae00::/32\n2400:b200::/32\n2400:b2c0::/32\n2400:b500::/32\n2400:b600::/32\n2400:b6c0::/32\n2400:b700::/32\n2400:b7c0::/32\n2400:b8c0::/32\n2400:b9c0::/32\n2400:ba00::/32\n2400:ba40::/31\n2400:bac0::/32\n2400:bc40::/32\n2400:be00::/32\n2400:bf00::/32\n2400:c200::/32\n2400:c380::/32\n2400:c840::/32\n2400:c8c0::/32\n2400:c940::/32\n2400:c9c0::/32\n2400:ca40::/32\n2400:cac0::/32\n2400:cb40::/32\n2400:cb80::/32\n2400:cbc0::/32\n2400:cc40::/32\n2400:cc80::/32\n2400:ccc0::/32\n2400:cd40::/32\n2400:cdc0::/32\n2400:ce00::/32\n2400:ce40::/32\n2400:cf40::/32\n2400:cf80::/32\n2400:cfc0::/32\n2400:d0c0::/32\n2400:d100::/32\n2400:d1c0::/32\n2400:d200::/32\n2400:d300::/32\n2400:d380::/32\n2400:d440::/32\n2400:d600::/32\n2400:d6c0::/32\n2400:d780::/32\n2400:da00::/32\n2400:dd00::/28\n2400:dd40::/32\n2400:de00::/32\n2400:de80::/32\n2400:e0c0::/32\n2400:e140::/32\n2400:e5c0::/32\n2400:e680::/32\n2400:e880::/32\n2400:ebc0::/32\n2400:edc0::/32\n2400:ee00::/32\n2400:eec0::/32\n2400:ef40::/32\n2400:f480::/32\n2400:f540::/32\n2400:f5c0::/32\n2400:f7c0::/32\n2400:f840::/32\n2400:f980::/32\n2400:fac0::/32\n2400:fb40::/32\n2400:fbc0::/32\n2400:fc40::/32\n2400:fcc0::/32\n2400:fe00::/32\n2401:80::/32\n2401:140::/32\n2401:1c0::/32\n2401:540::/32\n2401:780::/32\n2401:7c0::/32\n2401:9c0::/32\n2401:a00::/32\n2401:a40::/32\n2401:ac0::/32\n2401:b40::/32\n2401:bc0::/32\n2401:c40::/32\n2401:cc0::/32\n2401:d40::/32\n2401:e00::/32\n2401:1000::/32\n2401:11c0::/32\n2401:1200::/32\n2401:12c0::/32\n2401:15c0::/32\n2401:1740::/32\n2401:18c0::/32\n2401:1940::/32\n2401:19c0::/32\n2401:1a40::/32\n2401:1ac0::/32\n2401:1d40::/32\n2401:1dc0::/32\n2401:1e00::/32\n2401:1ec0::/32\n2401:1f40::/32\n2401:2040::/32\n2401:2080::/32\n2401:23c0::/32\n2401:2600::/32\n2401:2780::/32\n2401:2980::/32\n2401:2a00::/32\n2401:2b40::/32\n2401:2e00::/32\n2401:3100::/32\n2401:3380::/32\n2401:33c0::/32\n2401:3440::/32\n2401:3480::/32\n2401:34c0::/32\n2401:3640::/32\n2401:3780::/32\n2401:3800::/32\n2401:3880::/32\n2401:3980::/32\n2401:3a00::/32\n2401:3a80::/32\n2401:3b80::/32\n2401:3c80::/32\n2401:3d80::/32\n2401:3e80::/32\n2401:3f80::/32\n2401:4080::/32\n2401:4180::/32\n2401:4280::/32\n2401:4380::/32\n2401:4480::/32\n2401:4580::/32\n2401:4680::/32\n2401:4780::/32\n2401:4880::/32\n2401:4a80::/32\n2401:4b00::/32\n2401:4f80::/32\n2401:5180::/32\n2401:5680::/32\n2401:56c0::/32\n2401:59c0::/32\n2401:5b40::/32\n2401:5c80::/32\n2401:7180::/32\n2401:71c0::/32\n2401:7240::/32\n2401:7340::/32\n2401:7580::/32\n2401:7680::/32\n2401:7700::/32\n2401:7780::/32\n2401:7880::/32\n2401:7980::/32\n2401:7a00::/32\n2401:7a80::/32\n2401:7b80::/32\n2401:7bc0::/32\n2401:7c80::/32\n2401:7cc0::/32\n2401:7d40::/32\n2401:7d80::/32\n2401:7e00::/32\n2401:7f80::/32\n2401:8200::/32\n2401:82c0::/32\n2401:8380::/32\n2401:8540::/32\n2401:8600::/32\n2401:8680::/32\n2401:8840::/32\n2401:8d00::/32\n2401:8e40::/32\n2401:8f40::/32\n2401:8fc0::/32\n2401:9340::/32\n2401:9380::/32\n2401:9600::/32\n2401:96c0::/32\n2401:9740::/32\n2401:98c0::/32\n2401:9a00::/32\n2401:9ac0::/32\n2401:9b40::/32\n2401:9bc0::/32\n2401:9dc0::/32\n2401:9e40::/32\n2401:9f80::/32\n2401:a140::/32\n2401:a180::/32\n2401:a340::/32\n2401:a3c0::/32\n2401:a4c0::/32\n2401:a540::/32\n2401:a5c0::/32\n2401:a640::/32\n2401:a940::/32\n2401:a980::/32\n2401:aa00::/32\n2401:aa40::/32\n2401:acc0::/32\n2401:ad40::/32\n2401:adc0::/32\n2401:b040::/32\n2401:b180::/32\n2401:b340::/32\n2401:b400::/32\n2401:b480::/32\n2401:b4c0::/32\n2401:b540::/32\n2401:b580::/32\n2401:b600::/32\n2401:b680::/32\n2401:b6c0::/32\n2401:b7c0::/32\n2401:b940::/32\n2401:ba00::/32\n2401:ba40::/32\n2401:bb80::/32\n2401:be00::/32\n2401:c200::/32\n2401:c540::/32\n2401:c600::/32\n2401:c640::/32\n2401:c6c0::/32\n2401:c840::/32\n2401:c8c0::/32\n2401:ca00::/32\n2401:ca80::/32\n2401:cb80::/32\n2401:cc00::/32\n2401:ce00::/32\n2401:cf40::/32\n2401:cfc0::/32\n2401:d0c0::/32\n2401:d140::/32\n2401:d180::/32\n2401:d2c0::/32\n2401:d340::/32\n2401:d780::/32\n2401:da00::/32\n2401:de00::/32\n2401:e080::/32\n2401:e0c0::/32\n2401:e140::/32\n2401:e240::/32\n2401:e2c0::/32\n2401:e340::/32\n2401:e6c0::/32\n2401:e840::/32\n2401:e8c0::/32\n2401:e940::/32\n2401:e9c0::/32\n2401:ec00::/32\n2401:ec40::/32\n2401:f300::/32\n2401:f7c0::/32\n2401:fa80::/32\n2401:fac0::/32\n2401:fb80::/32\n2401:fc80::/32\n2401:fe80::/32\n2401:ffc0::/32\n2402:440::/32\n2402:5c0::/32\n2402:840::/32\n2402:880::/32\n2402:ac0::/32\n2402:e00::/32\n2402:fc0::/32\n2402:1000::/32\n2402:1440::/32\n2402:14c0::/32\n2402:1540::/32\n2402:1600::/32\n2402:1740::/32\n2402:19c0::/32\n2402:1ec0::/32\n2402:1f40::/32\n2402:1f80::/32\n2402:2000::/32\n2402:2280::/32\n2402:22c0::/32\n2402:2440::/32\n2402:24c0::/32\n2402:2540::/32\n2402:2640::/32\n2402:2780::/32\n2402:27c0::/32\n2402:2a00::/32\n2402:2b80::/32\n2402:2bc0::/32\n2402:2d00::/32\n2402:2d80::/32\n2402:2e80::/32\n2402:2f40::/32\n2402:3040::/32\n2402:3080::/32\n2402:3140::/32\n2402:3180::/32\n2402:31c0::/32\n2402:3240::/32\n2402:33c0::/32\n2402:39c0::/32\n2402:3a40::/32\n2402:3ac0::/32\n2402:3c00::/32\n2402:3e00::/32\n2402:3ec0::/32\n2402:3f40::/32\n2402:3f80::/32\n2402:4140::/32\n2402:42c0::/32\n2402:4340::/32\n2402:43c0::/32\n2402:4440::/32\n2402:4500::/32\n2402:4540::/32\n2402:4a00::/32\n2402:4a40::/32\n2402:4a80::/32\n2402:4ac0::/32\n2402:4b80::/32\n2402:4bc0::/32\n2402:4c40::/32\n2402:4d80::/32\n2402:4e00::/32\n2402:4ec0::/32\n2402:4f80::/32\n2402:50c0::/32\n2402:5140::/32\n2402:5180::/32\n2402:51c0::/32\n2402:5240::/32\n2402:52c0::/32\n2402:5340::/32\n2402:5880::/32\n2402:5940::/32\n2402:59c0::/32\n2402:5a40::/32\n2402:5b40::/32\n2402:5bc0::/32\n2402:5d00::/32\n2402:5e00::/32\n2402:5e40::/32\n2402:5ec0::/32\n2402:5f40::/32\n2402:6280::/32\n2402:62c0::/32\n2402:64c0::/32\n2402:65c0::/32\n2402:66c0::/32\n2402:6740::/32\n2402:67c0::/32\n2402:6a00::/32\n2402:6b40::/32\n2402:6bc0::/32\n2402:6dc0::/32\n2402:6e00::/32\n2402:6e80::/32\n2402:6ec0::/32\n2402:6f40::/32\n2402:6fc0::/32\n2402:7040::/32\n2402:7080::/32\n2402:70c0::/32\n2402:7140::/32\n2402:71c0::/32\n2402:7240::/32\n2402:72c0::/32\n2402:7540::/32\n2402:75c0::/32\n2402:7740::/32\n2402:7d00::/32\n2402:7d80::/32\n2402:8180::/32\n2402:8280::/32\n2402:8300::/32\n2402:8380::/32\n2402:85c0::/32\n2402:87c0::/32\n2402:8800::/32\n2402:8840::/32\n2402:8900::/32\n2402:8940::/32\n2402:89c0::/32\n2402:8b40::/32\n2402:8bc0::/32\n2402:8cc0::/32\n2402:8d40::/32\n2402:8f40::/32\n2402:8f80::/32\n2402:9240::/32\n2402:92c0::/32\n2402:93c0::/32\n2402:9440::/32\n2402:9480::/32\n2402:94c0::/32\n2402:9580::/32\n2402:95c0::/32\n2402:9680::/32\n2402:96c0::/32\n2402:9840::/32\n2402:98c0::/32\n2402:9940::/32\n2402:9a80::/32\n2402:9b80::/32\n2402:9f80::/32\n2402:9fc0::/32\n2402:a080::/32\n2402:a180::/32\n2402:a200::/32\n2402:a240::/32\n2402:a280::/32\n2402:a380::/32\n2402:a3c0::/32\n2402:a640::/32\n2402:a680::/32\n2402:a6c0::/32\n2402:a840::/32\n2402:a880::/32\n2402:a9c0::/32\n2402:aa80::/32\n2402:ab80::/32\n2402:ae00::/32\n2402:ae40::/32\n2402:aec0::/32\n2402:af80::/32\n2402:afc0::/32\n2402:b080::/32\n2402:b200::/32\n2402:b380::/32\n2402:b3c0::/32\n2402:b440::/32\n2402:b6c0::/32\n2402:b880::/32\n2402:b8c0::/32\n2402:b940::/32\n2402:b980::/32\n2402:ba80::/32\n2402:bac0::/32\n2402:bbc0::/32\n2402:bec0::/32\n2402:bf80::/32\n2402:c280::/32\n2402:c3c0::/32\n2402:c5c0::/32\n2402:c9c0::/32\n2402:cbc0::/32\n2402:cc40::/32\n2402:cc80::/32\n2402:cf00::/32\n2402:cf40::/32\n2402:d040::/32\n2402:d140::/32\n2402:d2c0::/32\n2402:d300::/32\n2402:d340::/32\n2402:d380::/32\n2402:d5c0::/32\n2402:d6c0::/32\n2402:d740::/32\n2402:d780::/32\n2402:d880::/32\n2402:d980::/32\n2402:da40::/32\n2402:db40::/32\n2402:dcc0::/32\n2402:de40::/32\n2402:dec0::/32\n2402:df40::/32\n2402:dfc0::/32\n2402:e040::/32\n2402:e0c0::/32\n2402:e140::/32\n2402:e2c0::/32\n2402:e3c0::/32\n2402:e480::/32\n2402:e540::/32\n2402:e680::/32\n2402:e740::/32\n2402:e780::/32\n2402:e7c0::/32\n2402:e880::/32\n2402:e980::/32\n2402:eb80::/32\n2402:ec80::/32\n2402:ed80::/32\n2402:ef40::/32\n2402:ef80::/32\n2402:f000::/32\n2402:f140::/32\n2402:f340::/32\n2402:f3c0::/32\n2402:f480::/32\n2402:f540::/32\n2402:f580::/32\n2402:f740::/32\n2402:f780::/32\n2402:f8c0::/32\n2402:f980::/32\n2402:f9c0::/32\n2402:fac0::/32\n2402:fcc0::/32\n2402:ff40::/32\n2402:ffc0::/32\n2403:600::/32\n2403:700::/32\n2403:7c0::/32\n2403:800::/31\n2403:980::/32\n2403:a80::/32\n2403:b80::/32\n2403:c80::/32\n2403:d40::/32\n2403:d80::/32\n2403:e80::/32\n2403:f00::/32\n2403:f40::/32\n2403:f80::/32\n2403:fc0::/32\n2403:1180::/32\n2403:1340::/32\n2403:1440::/32\n2403:1580::/32\n2403:16c0::/32\n2403:17c0::/32\n2403:1980::/32\n2403:1a40::/32\n2403:1b80::/32\n2403:1c80::/32\n2403:1d80::/32\n2403:1dc0::/32\n2403:1e80::/32\n2403:1ec0::/32\n2403:1f80::/32\n2403:2040::/32\n2403:2080::/32\n2403:2180::/32\n2403:2240::/32\n2403:2280::/32\n2403:2380::/32\n2403:2440::/32\n2403:24c0::/32\n2403:2580::/32\n2403:25c0::/32\n2403:2680::/32\n2403:26c0::/32\n2403:2740::/32\n2403:2780::/32\n2403:28c0::/32\n2403:2940::/32\n2403:2a00::/32\n2403:2a40::/32\n2403:2ac0::/32\n2403:2b40::/32\n2403:2bc0::/32\n2403:2cc0::/32\n2403:2d80::/32\n2403:2f40::/32\n2403:2fc0::/32\n2403:3040::/32\n2403:30c0::/32\n2403:3140::/32\n2403:3280::/32\n2403:32c0::/32\n2403:3380::/32\n2403:3480::/32\n2403:3580::/32\n2403:3640::/32\n2403:3680::/32\n2403:36c0::/32\n2403:3740::/32\n2403:3780::/32\n2403:37c0::/32\n2403:3840::/32\n2403:3880::/32\n2403:38c0::/32\n2403:3940::/32\n2403:3980::/32\n2403:39c0::/32\n2403:3a40::/32\n2403:3b40::/32\n2403:3b80::/32\n2403:3bc0::/32\n2403:3c40::/32\n2403:3c80::/32\n2403:3cc0::/32\n2403:3d40::/32\n2403:3d80::/32\n2403:3dc0::/32\n2403:3e80::/32\n2403:3ec0::/32\n2403:3f40::/32\n2403:3f80::/32\n2403:4080::/32\n2403:4180::/32\n2403:4240::/32\n2403:4280::/32\n2403:4300::/32\n2403:4380::/32\n2403:4580::/32\n2403:4680::/32\n2403:4840::/32\n2403:4880::/32\n2403:4980::/32\n2403:4a40::/32\n2403:4a80::/32\n2403:4b40::/32\n2403:4b80::/32\n2403:4c80::/32\n2403:4cc0::/32\n2403:4d40::/32\n2403:4d80::/32\n2403:4ec0::/32\n2403:5040::/32\n2403:5080::/32\n2403:50c0::/32\n2403:5280::/32\n2403:5380::/32\n2403:54c0::/32\n2403:5540::/32\n2403:5580::/32\n2403:5640::/32\n2403:5780::/32\n2403:58c0::/32\n2403:5980::/32\n2403:5a80::/32\n2403:5b40::/32\n2403:5b80::/32\n2403:5c80::/32\n2403:5d80::/32\n2403:5e40::/32\n2403:5e80::/32\n2403:5ec0::/32\n2403:5f80::/32\n2403:5fc0::/32\n2403:6080::/32\n2403:6180::/32\n2403:6280::/32\n2403:62c0::/32\n2403:6380::/32\n2403:6580::/32\n2403:6680::/32\n2403:6740::/32\n2403:6780::/32\n2403:6880::/32\n2403:6980::/32\n2403:6a00::/32\n2403:6c80::/32\n2403:6d40::/32\n2403:6d80::/32\n2403:6e80::/32\n2403:6f40::/32\n2403:6fc0::/32\n2403:7040::/32\n2403:7080::/32\n2403:7180::/32\n2403:7280::/32\n2403:7380::/32\n2403:7480::/32\n2403:7540::/32\n2403:7580::/32\n2403:76c0::/32\n2403:7700::/32\n2403:7840::/32\n2403:78c0::/32\n2403:7a80::/32\n2403:7b00::/32\n2403:7d80::/32\n2403:7e80::/32\n2403:7f80::/32\n2403:8080::/32\n2403:8180::/32\n2403:8280::/32\n2403:8380::/32\n2403:83c0::/32\n2403:8480::/32\n2403:8580::/32\n2403:8880::/32\n2403:8900::/32\n2403:8980::/32\n2403:8a40::/32\n2403:8a80::/32\n2403:8b00::/32\n2403:8b80::/32\n2403:8c00::/32\n2403:8c80::/32\n2403:8d00::/32\n2403:8d80::/32\n2403:8f80::/32\n2403:9080::/32\n2403:9180::/32\n2403:9280::/32\n2403:9380::/32\n2403:9480::/32\n2403:9580::/32\n2403:9680::/32\n2403:9780::/32\n2403:9880::/32\n2403:9a80::/32\n2403:9ac0::/32\n2403:9b00::/32\n2403:9b40::/32\n2403:9b80::/32\n2403:9c80::/32\n2403:9d00::/32\n2403:9d80::/32\n2403:9e40::/32\n2403:9e80::/32\n2403:9ec0::/32\n2403:9f80::/32\n2403:a100::/32\n2403:a140::/32\n2403:a200::/32\n2403:a300::/32\n2403:a480::/32\n2403:a580::/32\n2403:a680::/32\n2403:a6c0::/32\n2403:a780::/32\n2403:a880::/32\n2403:a940::/32\n2403:a980::/32\n2403:a9c0::/32\n2403:aa40::/32\n2403:aa80::/32\n2403:ab80::/32\n2403:ac00::/32\n2403:af80::/32\n2403:b080::/32\n2403:b180::/32\n2403:b280::/32\n2403:b380::/32\n2403:b400::/32\n2403:b480::/32\n2403:b580::/32\n2403:b680::/32\n2403:b780::/32\n2403:b880::/32\n2403:b980::/32\n2403:ba40::/32\n2403:c040::/32\n2403:c080::/32\n2403:c100::/32\n2403:c140::/32\n2403:c180::/32\n2403:c3c0::/32\n2403:c440::/32\n2403:c480::/32\n2403:c4c0::/32\n2403:c980::/32\n2403:cdc0::/32\n2403:cec0::/32\n2403:cf80::/32\n2403:d080::/32\n2403:d180::/32\n2403:d280::/32\n2403:d2c0::/32\n2403:d380::/32\n2403:d400::/32\n2403:d440::/32\n2403:d480::/32\n2403:d580::/32\n2403:d680::/32\n2403:d780::/32\n2403:d7c0::/32\n2403:d880::/32\n2403:d980::/32\n2403:d9c0::/32\n2403:da80::/32\n2403:dac0::/32\n2403:db00::/32\n2403:db80::/32\n2403:dc80::/32\n2403:dd80::/32\n2403:de80::/32\n2403:df80::/32\n2403:e080::/32\n2403:e180::/32\n2403:e280::/32\n2403:e300::/32\n2403:e480::/32\n2403:e500::/32\n2403:e580::/32\n2403:e640::/32\n2403:e680::/32\n2403:e700::/32\n2403:e780::/32\n2403:e7c0::/32\n2403:e880::/32\n2403:e980::/32\n2403:ea80::/32\n2403:eac0::/32\n2403:eb80::/32\n2403:ec80::/32\n2403:ed00::/32\n2403:ed40::/32\n2403:ed80::/32\n2403:ee80::/32\n2403:ef80::/32\n2403:f080::/32\n2403:f100::/32\n2403:f180::/32\n2403:f240::/32\n2403:f280::/32\n2403:f300::/32\n2403:f380::/32\n2403:f4c0::/32\n2403:f580::/32\n2403:f740::/32\n2403:f8c0::/32\n2403:f980::/32\n2403:fb00::/32\n2403:fb80::/32\n2403:fc40::/32\n2403:fe40::/32\n2403:fe80::/32\n2403:fec0::/32\n2403:ff80::/32\n2403:ffc0::/32\n2404:100::/32\n2404:158::/32\n2404:240::/32\n2404:280::/32\n2404:440::/32\n2404:480::/32\n2404:680::/32\n2404:a80::/32\n2404:b80::/32\n2404:bc0::/32\n2404:c40::/32\n2404:d80::/32\n2404:f00::/32\n2404:f80::/32\n2404:1080::/32\n2404:10c0::/32\n2404:1180::/32\n2404:14c0::/32\n2404:1880::/32\n2404:1c80::/32\n2404:1cc0::/32\n2404:1d80::/32\n2404:1e80::/32\n2404:1f40::/32\n2404:21c0::/32\n2404:30c0::/32\n2404:3140::/32\n2404:31c0::/32\n2404:3240::/32\n2404:32c0::/32\n2404:3300::/32\n2404:3340::/32\n2404:3480::/32\n2404:35c0::/32\n2404:3640::/32\n2404:36c0::/32\n2404:3700::/32\n2404:3740::/32\n2404:37c0::/32\n2404:3840::/32\n2404:3940::/32\n2404:3b00::/32\n2404:3bc0::/32\n2404:3c40::/32\n2404:3f40::/32\n2404:4080::/32\n2404:41c0::/32\n2404:4540::/32\n2404:4740::/32\n2404:4bc0::/32\n2404:4d00::/32\n2404:4dc0::/32\n2404:51c0::/32\n2404:5640::/32\n2404:5a80::/32\n2404:5b00::/32\n2404:5d00::/32\n2404:5e80::/32\n2404:6000::/32\n2404:6100::/32\n2404:6380::/32\n2404:6500::/32\n2404:65c0::/32\n2404:6a40::/32\n2404:6f80::/32\n2404:7100::/32\n2404:7180::/32\n2404:71c0::/32\n2404:7240::/32\n2404:74c0::/32\n2404:7600::/32\n2404:7740::/32\n2404:7940::/32\n2404:7d00::/32\n2404:8040::/32\n2404:80c0::/32\n2404:8140::/32\n2404:81c0::/32\n2404:8480::/32\n2404:8580::/32\n2404:8700::/32\n2404:8880::/32\n2404:8a80::/32\n2404:8b00::/32\n2404:8dc0::/32\n2404:9340::/32\n2404:9880::/32\n2404:9b80::/32\n2404:9c80::/32\n2404:a000::/32\n2404:a080::/32\n2404:a0c0::/32\n2404:a180::/32\n2404:a240::/32\n2404:a740::/32\n2404:b100::/32\n2404:b340::/32\n2404:b3c0::/32\n2404:b440::/32\n2404:b4c0::/32\n2404:b900::/32\n2404:bbc0::/32\n2404:bc40::/32\n2404:c1c0::/32\n2404:c240::/32\n2404:c2c0::/32\n2404:c300::/32\n2404:c3c0::/32\n2404:c440::/32\n2404:c4c0::/32\n2404:c540::/32\n2404:c5c0::/32\n2404:c640::/32\n2404:c940::/32\n2404:c9c0::/32\n2404:cd00::/32\n2404:d040::/32\n2404:d080::/32\n2404:d140::/32\n2404:d280::/32\n2404:d3c0::/32\n2404:d480::/32\n2404:d640::/32\n2404:d6c0::/32\n2404:d780::/32\n2404:d7c0::/32\n2404:d840::/32\n2404:dd80::/32\n2404:df00::/32\n2404:e180::/32\n2404:e280::/32\n2404:e540::/32\n2404:e5c0::/32\n2404:e780::/32\n2404:e880::/32\n2404:e8c0::/32\n2404:eb40::/32\n2404:eb80::/32\n2404:ec40::/32\n2404:ecc0::/32\n2404:edc0::/32\n2404:f040::/32\n2404:f4c0::/32\n2404:f7c0::/32\n2405:80::/32\n2405:480::/32\n2405:580::/32\n2405:680::/32\n2405:6c0::/32\n2405:780::/32\n2405:880::/32\n2405:940::/32\n2405:980::/32\n2405:9c0::/32\n2405:a80::/32\n2405:b80::/32\n2405:c80::/32\n2405:d80::/32\n2405:e80::/32\n2405:f40::/32\n2405:f80::/32\n2405:1080::/32\n2405:1180::/32\n2405:1280::/32\n2405:1380::/32\n2405:1480::/32\n2405:1580::/32\n2405:1680::/32\n2405:18c0::/32\n2405:1c80::/32\n2405:1d80::/32\n2405:1e80::/32\n2405:1f80::/32\n2405:1fc0::/32\n2405:2080::/32\n2405:2180::/32\n2405:2280::/32\n2405:2340::/32\n2405:2380::/32\n2405:2480::/32\n2405:24c0::/32\n2405:2580::/32\n2405:2680::/32\n2405:2780::/32\n2405:2880::/32\n2405:2980::/32\n2405:2a80::/32\n2405:2b80::/32\n2405:2bc0::/32\n2405:2c80::/32\n2405:2d80::/32\n2405:2e80::/32\n2405:2ec0::/32\n2405:2f40::/32\n2405:2f80::/32\n2405:3140::/32\n2405:31c0::/32\n2405:37c0::/32\n2405:3880::/32\n2405:3980::/32\n2405:39c0::/32\n2405:3a80::/32\n2405:3ac0::/32\n2405:3b00::/32\n2405:3b80::/32\n2405:3bc0::/32\n2405:3c40::/32\n2405:3c80::/32\n2405:3d80::/32\n2405:3e80::/32\n2405:3f40::/32\n2405:3f80::/32\n2405:4080::/32\n2405:4140::/32\n2405:4180::/32\n2405:41c0::/32\n2405:4280::/32\n2405:4380::/32\n2405:4480::/32\n2405:44c0::/32\n2405:4540::/32\n2405:4580::/32\n2405:4680::/32\n2405:4780::/32\n2405:4880::/32\n2405:4980::/32\n2405:4a80::/32\n2405:4b80::/32\n2405:4d40::/32\n2405:4e80::/32\n2405:4f80::/32\n2405:5080::/32\n2405:5180::/32\n2405:5240::/32\n2405:5280::/32\n2405:52c0::/32\n2405:5380::/32\n2405:5480::/32\n2405:5580::/32\n2405:5680::/32\n2405:5780::/32\n2405:57c0::/32\n2405:5880::/32\n2405:5980::/32\n2405:5a80::/32\n2405:5b00::/32\n2405:5b80::/32\n2405:5c80::/32\n2405:5cc0::/32\n2405:5d40::/32\n2405:5d80::/32\n2405:5dc0::/32\n2405:5e80::/32\n2405:5f80::/32\n2405:6080::/32\n2405:6180::/32\n2405:6200::/32\n2405:66c0::/32\n2405:6880::/32\n2405:68c0::/32\n2405:6940::/32\n2405:69c0::/32\n2405:6a80::/32\n2405:6b80::/32\n2405:6c80::/32\n2405:6d80::/32\n2405:6e80::/32\n2405:6f00::/32\n2405:6f80::/32\n2405:7040::/32\n2405:7080::/32\n2405:7180::/32\n2405:7240::/32\n2405:7280::/32\n2405:7380::/32\n2405:7480::/32\n2405:7580::/32\n2405:7680::/32\n2405:7780::/32\n2405:7880::/32\n2405:78c0::/32\n2405:7980::/32\n2405:79c0::/32\n2405:7a80::/32\n2405:7b80::/32\n2405:7c80::/32\n2405:7d40::/32\n2405:7f40::/32\n2405:7fc0::/32\n2405:8280::/32\n2405:83c0::/32\n2405:8480::/32\n2405:84c0::/32\n2405:8580::/32\n2405:8680::/32\n2405:8780::/32\n2405:8880::/32\n2405:8980::/32\n2405:8a40::/32\n2405:8a80::/32\n2405:8ac0::/32\n2405:8b40::/32\n2405:8b80::/32\n2405:8c80::/32\n2405:8d80::/32\n2405:8e80::/32\n2405:8f40::/32\n2405:8f80::/32\n2405:9080::/32\n2405:9180::/32\n2405:9280::/32\n2405:9300::/32\n2405:9340::/32\n2405:9380::/32\n2405:93c0::/32\n2405:9480::/32\n2405:94c0::/32\n2405:9580::/32\n2405:9680::/32\n2405:9700::/32\n2405:9780::/32\n2405:9880::/32\n2405:9900::/32\n2405:9980::/32\n2405:9a80::/32\n2405:9b00::/32\n2405:9b80::/32\n2405:9e00::/32\n2405:a500::/32\n2405:a680::/32\n2405:a900::/32\n2405:a980::/32\n2405:aa80::/32\n2405:ab00::/32\n2405:ad00::/32\n2405:af00::/32\n2405:b100::/32\n2405:b300::/32\n2405:b880::/32\n2405:b980::/32\n2405:bb00::/32\n2405:bd00::/32\n2405:bd80::/32\n2405:be80::/32\n2405:bf00::/32\n2405:c280::/32\n2405:c380::/32\n2405:c480::/32\n2405:c500::/32\n2405:c580::/32\n2405:c680::/32\n2405:c780::/32\n2405:c880::/32\n2405:c980::/32\n2405:ca80::/32\n2405:cb80::/32\n2405:cc80::/32\n2405:cd80::/32\n2405:ce80::/32\n2405:d280::/32\n2405:d700::/32\n2405:d900::/32\n2405:e000::/32\n2405:e600::/32\n2405:ee80::/32\n2405:f380::/32\n2405:f580::/32\n2405:fe80::/32\n2405:ff80::/32\n2406:80::/32\n2406:280::/32\n2406:880::/32\n2406:d80::/32\n2406:e80::/32\n2406:f80::/32\n2406:1080::/32\n2406:1100::/32\n2406:1180::/32\n2406:1280::/32\n2406:1380::/32\n2406:1480::/32\n2406:1580::/32\n2406:1680::/32\n2406:1780::/32\n2406:1880::/32\n2406:1980::/32\n2406:1a80::/32\n2406:1b80::/32\n2406:1c80::/32\n2406:1d80::/32\n2406:1e80::/32\n2406:1f80::/32\n2406:2080::/32\n2406:2580::/32\n2406:2700::/32\n2406:2780::/32\n2406:2880::/32\n2406:2980::/32\n2406:2a80::/32\n2406:2b80::/32\n2406:2c80::/32\n2406:2d80::/32\n2406:2e80::/32\n2406:2f80::/32\n2406:3080::/32\n2406:3180::/32\n2406:3280::/32\n2406:3300::/32\n2406:3380::/32\n2406:3480::/32\n2406:3580::/32\n2406:3680::/32\n2406:3700::/32\n2406:3780::/32\n2406:3880::/32\n2406:3980::/32\n2406:3d80::/32\n2406:3e80::/32\n2406:3f80::/32\n2406:4080::/32\n2406:4180::/32\n2406:4280::/32\n2406:4380::/32\n2406:4480::/32\n2406:4500::/32\n2406:4680::/32\n2406:4980::/32\n2406:4b80::/32\n2406:4c80::/32\n2406:4d00::/32\n2406:4d80::/32\n2406:4e80::/32\n2406:4f00::/32\n2406:4f80::/32\n2406:5080::/32\n2406:5180::/32\n2406:5280::/32\n2406:5380::/32\n2406:5480::/32\n2406:5580::/32\n2406:5680::/32\n2406:5780::/32\n2406:5880::/32\n2406:5980::/32\n2406:5d80::/32\n2406:5e80::/32\n2406:5f80::/32\n2406:6080::/32\n2406:6100::/32\n2406:6180::/32\n2406:6280::/32\n2406:6300::/32\n2406:6380::/32\n2406:6480::/32\n2406:6500::/32\n2406:6580::/32\n2406:6680::/32\n2406:6780::/32\n2406:6880::/32\n2406:6980::/32\n2406:6a80::/32\n2406:6b80::/32\n2406:6c80::/32\n2406:6d80::/32\n2406:6e80::/32\n2406:6f80::/32\n2406:7080::/32\n2406:7280::/32\n2406:7380::/32\n2406:7480::/32\n2406:7580::/32\n2406:7680::/32\n2406:7780::/32\n2406:7880::/32\n2406:7980::/32\n2406:7a80::/32\n2406:7b80::/32\n2406:7c80::/32\n2406:7d00::/32\n2406:7d80::/32\n2406:7e80::/32\n2406:7f80::/32\n2406:8080::/32\n2406:8180::/32\n2406:8280::/32\n2406:8380::/32\n2406:8480::/32\n2406:8500::/32\n2406:8580::/32\n2406:8780::/32\n2406:8880::/32\n2406:8980::/32\n2406:8a80::/32\n2406:8b80::/32\n2406:8c80::/32\n2406:8d80::/32\n2406:8e80::/32\n2406:8f80::/32\n2406:9180::/32\n2406:9200::/32\n2406:9280::/32\n2406:9380::/32\n2406:9480::/32\n2406:9780::/32\n2406:9d80::/32\n2406:9e80::/32\n2406:9f80::/32\n2406:a080::/32\n2406:a180::/32\n2406:a280::/32\n2406:a380::/32\n2406:a480::/32\n2406:a580::/32\n2406:a680::/32\n2406:a780::/32\n2406:a880::/32\n2406:a980::/32\n2406:aa80::/32\n2406:ab80::/32\n2406:ac80::/32\n2406:ad80::/32\n2406:ae80::/32\n2406:af80::/32\n2406:b080::/32\n2406:b880::/32\n2406:b980::/32\n2406:ba80::/32\n2406:bb80::/32\n2406:bc80::/32\n2406:bd80::/32\n2406:be80::/32\n2406:bf80::/32\n2406:c080::/32\n2406:c180::/32\n2406:c280::/32\n2406:c480::/32\n2406:c580::/32\n2406:c680::/32\n2406:c780::/32\n2406:c880::/32\n2406:c900::/32\n2406:c980::/32\n2406:ca80::/32\n2406:cb80::/32\n2406:cc80::/32\n2406:cd80::/32\n2406:ce80::/32\n2406:cf00::/30\n2406:cf80::/32\n2406:d080::/32\n2406:d180::/32\n2406:d280::/32\n2406:d380::/32\n2406:d480::/32\n2406:d580::/32\n2406:d680::/32\n2406:d780::/32\n2406:d880::/32\n2406:d980::/32\n2406:db80::/32\n2406:dc80::/32\n2406:dd00::/32\n2406:dd80::/32\n2406:de80::/32\n2406:df80::/32\n2406:e080::/32\n2406:e180::/32\n2406:e280::/32\n2406:e380::/32\n2406:e500::/32\n2406:e580::/32\n2406:e680::/32\n2406:e780::/32\n2406:f280::/32\n2406:f300::/32\n2406:f980::/32\n2406:fc80::/32\n2406:fd80::/32\n2406:fe80::/32\n2406:ff00::/32\n2407:480::/32\n2407:580::/32\n2407:1180::/32\n2407:1900::/32\n2407:1d00::/32\n2407:1e80::/32\n2407:2280::/32\n2407:2380::/32\n2407:2780::/32\n2407:3700::/32\n2407:3900::/32\n2407:4580::/32\n2407:4680::/32\n2407:4880::/32\n2407:4980::/32\n2407:4a80::/32\n2407:4c80::/32\n2407:4d80::/32\n2407:4e80::/32\n2407:4f00::/32\n2407:5380::/32\n2407:5500::/32\n2407:5780::/32\n2407:6580::/32\n2407:6a80::/32\n2407:7680::/32\n2407:7780::/32\n2407:7880::/32\n2407:7980::/32\n2407:7c80::/32\n2407:7d00::/32\n2407:7d80::/32\n2407:7e80::/32\n2407:8880::/32\n2407:8b80::/32\n2407:9080::/32\n2407:9180::/32\n2407:9680::/32\n2407:9980::/32\n2407:9f00::/32\n2407:9f80::/32\n2407:a480::/32\n2407:a880::/32\n2407:ad80::/32\n2407:ae80::/32\n2407:af80::/32\n2407:b080::/32\n2407:b180::/32\n2407:b280::/32\n2407:b380::/32\n2407:b580::/32\n2407:b680::/32\n2407:b780::/32\n2407:b880::/32\n2407:b980::/32\n2407:ba00::/32\n2407:ba80::/32\n2407:bb80::/32\n2407:bc00::/32\n2407:bc80::/32\n2407:bd80::/32\n2407:be80::/32\n2407:bf80::/32\n2407:c080::/32\n2407:c380::/32\n2407:c400::/32\n2407:c480::/32\n2407:c580::/32\n2407:c680::/32\n2407:c780::/32\n2407:c880::/32\n2407:c900::/32\n2407:c980::/32\n2407:cb80::/32\n2407:cc80::/32\n2407:cd80::/32\n2407:ce80::/32\n2407:cf00::/32\n2407:cf80::/32\n2407:d480::/32\n2407:d580::/32\n2407:d680::/32\n2407:d780::/32\n2407:d880::/32\n2407:d980::/32\n2407:da80::/32\n2407:db80::/32\n2407:dc80::/32\n2407:dd80::/32\n2407:de80::/32\n2407:df80::/32\n2407:e080::/32\n2407:e180::/32\n2407:e280::/32\n2407:e380::/32\n2407:e480::/32\n2407:e580::/32\n2407:e680::/32\n2407:e780::/32\n2407:e800::/32\n2407:ea80::/32\n2407:eb80::/32\n2407:ec80::/32\n2407:ed80::/32\n2407:ee80::/32\n2407:ef80::/32\n2407:f080::/32\n2407:f180::/32\n2407:f280::/32\n2407:f380::/32\n2407:f480::/32\n2407:f580::/32\n2407:f680::/32\n2407:f780::/32\n2407:f880::/32\n2407:f980::/32\n2407:fa80::/32\n2407:fb80::/32\n2407:fc80::/32\n2407:fd80::/32\n2408:4000::/22\n2408:8000::/20\n2409:8000::/20\n240a:4000::/21\n240a:8000::/21\n240a:c000::/20\n240b:8000::/21\n240c::/28\n240c:4000::/22\n240c:8000::/21\n240c:c000::/20\n240d:4000::/21\n240d:8000::/24\n240e::/18\n240f:4000::/24\n240f:8000::/24\n240f:c000::/24\n\n[proxy_list]\n# Telegram IPs$\n91.108.4.0/22\n91.108.8.0/21\n91.108.16.0/21\n91.108.36.0/22\n91.108.56.0/22\n109.239.140.0/24\n149.154.160.0/20\n14.102.250.18\n14.102.250.19\n174.142.105.153\n50.7.31.230\n67.220.91.15\n67.220.91.18\n67.220.91.23\n69.65.19.160\n72.52.81.22\n85.17.73.31\n(?:^|\\.)030buy\\.com$\n(?:^|\\.)0rz\\.tw$\n(?:^|\\.)1-apple\\.com\\.tw$\n(?:^|\\.)10\\.tt$\n(?:^|\\.)1000giri\\.net$\n(?:^|\\.)100ke\\.org$\n(?:^|\\.)10conditionsoflove\\.com$\n(?:^|\\.)10musume\\.com$\n(?:^|\\.)123rf\\.com$\n(?:^|\\.)12bet\\.com$\n(?:^|\\.)12vpn\\.com$\n(?:^|\\.)12vpn\\.net$\n(?:^|\\.)138\\.com$\n(?:^|\\.)141hongkong\\.com$\n(?:^|\\.)141jj\\.com$\n(?:^|\\.)141tube\\.com$\n(?:^|\\.)1688\\.com\\.au$\n(?:^|\\.)173ng\\.com$\n(?:^|\\.)177pic\\.info$\n(?:^|\\.)17t17p\\.com$\n(?:^|\\.)18board\\.com$\n(?:^|\\.)18board\\.info$\n(?:^|\\.)18onlygirls\\.com$\n(?:^|\\.)18p2p\\.com$\n(?:^|\\.)18virginsex\\.com$\n(?:^|\\.)1949er\\.org$\n(?:^|\\.)1984bbs\\.com$\n(?:^|\\.)1984bbs\\.org$\n(?:^|\\.)1989report\\.hkja\\.org\\.hk$\n(?:^|\\.)1991way\\.com$\n(?:^|\\.)1998cdp\\.org$\n(?:^|\\.)1bao\\.org$\n(?:^|\\.)1dumb\\.com$\n(?:^|\\.)1e100\\.net$\n(?:^|\\.)1eew\\.com$\n(?:^|\\.)1mobile\\.com$\n(?:^|\\.)1pondo\\.tv$\n(?:^|\\.)2-hand\\.info$\n(?:^|\\.)2000fun\\.com$\n(?:^|\\.)2008xianzhang\\.info$\n(?:^|\\.)2017\\.hk$\n(?:^|\\.)21andy\\.com$\n(?:^|\\.)21pron\\.com$\n(?:^|\\.)21sextury\\.com$\n(?:^|\\.)228\\.net\\.tw$\n(?:^|\\.)233abc\\.com$\n(?:^|\\.)24hrs\\.ca$\n(?:^|\\.)24smile\\.org$\n(?:^|\\.)25u\\.com$\n(?:^|\\.)2lipstube\\.com$\n(?:^|\\.)2shared\\.com$\n(?:^|\\.)2waky\\.com$\n(?:^|\\.)3-a\\.net$\n(?:^|\\.)30boxes\\.com$\n(?:^|\\.)315lz\\.com$\n(?:^|\\.)32red\\.com$\n(?:^|\\.)36rain\\.com$\n(?:^|\\.)3a5a\\.com$\n(?:^|\\.)3arabtv\\.com$\n(?:^|\\.)3boys2girls\\.com$\n(?:^|\\.)3d-game\\.com$\n(?:^|\\.)3proxy\\.ru$\n(?:^|\\.)3ren\\.ca$\n(?:^|\\.)3tui\\.net$\n(?:^|\\.)43110\\.cf$\n(?:^|\\.)466453\\.com$\n(?:^|\\.)4bluestones\\.biz$\n(?:^|\\.)4chan\\.com$\n(?:^|\\.)4dq\\.com$\n(?:^|\\.)4everproxy\\.com$\n(?:^|\\.)4irc\\.com$\n(?:^|\\.)4mydomain\\.com$\n(?:^|\\.)4pu\\.com$\n(?:^|\\.)4rbtv\\.com$\n(?:^|\\.)4shared\\.com$\n(?:^|\\.)51\\.ca$\n(?:^|\\.)51jav\\.org$\n(?:^|\\.)51luoben\\.com$\n(?:^|\\.)5278\\.cc$\n(?:^|\\.)5299\\.tv$\n(?:^|\\.)56cun04\\.jigsy\\.com$\n(?:^|\\.)5aimiku\\.com$\n(?:^|\\.)5i01\\.com$\n(?:^|\\.)5isotoi5\\.org$\n(?:^|\\.)5maodang\\.com$\n(?:^|\\.)63i\\.com$\n(?:^|\\.)64memo$\n(?:^|\\.)64museum\\.org$\n(?:^|\\.)64tianwang\\.com$\n(?:^|\\.)64wiki\\.com$\n(?:^|\\.)66\\.ca$\n(?:^|\\.)666kb\\.com$\n(?:^|\\.)6park\\.com$\n(?:^|\\.)6parker\\.com$\n(?:^|\\.)7capture\\.com$\n(?:^|\\.)7cow\\.com$\n(?:^|\\.)8-d\\.com$\n(?:^|\\.)85cc\\.net$\n(?:^|\\.)85cc\\.us$\n(?:^|\\.)85st\\.com$\n(?:^|\\.)881903\\.com$\n(?:^|\\.)888\\.com$\n(?:^|\\.)888poker\\.com$\n(?:^|\\.)89-64\\.org$\n(?:^|\\.)89\\.64\\.charter\\.constitutionalism\\.solutions$\n(?:^|\\.)8news\\.com\\.tw$\n(?:^|\\.)8z1\\.net$\n(?:^|\\.)9001700\\.com$\n(?:^|\\.)908taiwan\\.org$\n(?:^|\\.)91porn\\.com$\n(?:^|\\.)91vps\\.club$\n(?:^|\\.)92ccav\\.com$\n(?:^|\\.)991\\.com$\n(?:^|\\.)99btgc01\\.com$\n(?:^|\\.)99cn\\.info$\n(?:^|\\.)9bis\\.com$\n(?:^|\\.)9bis\\.net$\n(?:^|\\.)9gag\\.com$\n(?:^|\\.)a-normal-day\\.com$\n(?:^|\\.)a248\\.e\\.akamai\\.net$\n(?:^|\\.)a5\\.com\\.ru$\n(?:^|\\.)aamacau\\.com$\n(?:^|\\.)abc\\.com$\n(?:^|\\.)abc\\.net\\.au$\n(?:^|\\.)abc\\.pp\\.ru$\n(?:^|\\.)abc\\.xyz$\n(?:^|\\.)abchinese\\.com$\n(?:^|\\.)abclite\\.net$\n(?:^|\\.)abebooks\\.com$\n(?:^|\\.)abematv\\.akamaized\\.net$\n(?:^|\\.)abitno\\.linpie\\.com$\n(?:^|\\.)ablwang\\.com$\n(?:^|\\.)aboluowang\\.com$\n(?:^|\\.)about\\.google$\n(?:^|\\.)aboutgfw\\.com$\n(?:^|\\.)abs\\.edu$\n(?:^|\\.)ac\\.jiruan\\.net$\n(?:^|\\.)accim\\.org$\n(?:^|\\.)aceros-de-hispania\\.com$\n(?:^|\\.)acevpn\\.com$\n(?:^|\\.)acg18\\.me$\n(?:^|\\.)acgkj\\.com$\n(?:^|\\.)acmedia365\\.com$\n(?:^|\\.)acmetoy\\.com$\n(?:^|\\.)acnw\\.com\\.au$\n(?:^|\\.)actfortibet\\.org$\n(?:^|\\.)actimes\\.com\\.au$\n(?:^|\\.)activpn\\.com$\n(?:^|\\.)aculo\\.us$\n(?:^|\\.)adcex\\.com$\n(?:^|\\.)addictedtocoffee\\.de$\n(?:^|\\.)adelaidebbs\\.com$\n(?:^|\\.)admin\\.recaptcha\\.net$\n(?:^|\\.)admob\\.com$\n(?:^|\\.)adpl\\.org\\.hk$\n(?:^|\\.)ads-twitter\\.com$\n(?:^|\\.)adsense\\.com$\n(?:^|\\.)adult-sex-games\\.com$\n(?:^|\\.)adult\\.friendfinder\\.com$\n(?:^|\\.)adultfriendfinder\\.com$\n(?:^|\\.)adultkeep\\.net$\n(?:^|\\.)advanscene\\.com$\n(?:^|\\.)advertfan\\.com$\n(?:^|\\.)ae\\.hao123\\.com$\n(?:^|\\.)ae\\.org$\n(?:^|\\.)aenhancers\\.com$\n(?:^|\\.)aex\\.com$\n(?:^|\\.)af\\.mil$\n(?:^|\\.)afantibbs\\.com$\n(?:^|\\.)agnesb\\.fr$\n(?:^|\\.)agoogleaday\\.com$\n(?:^|\\.)agro\\.hk$\n(?:^|\\.)ahr0chm6ly95zwnslm5lda$\n(?:^|\\.)ai-kan\\.net$\n(?:^|\\.)ai-wen\\.net$\n(?:^|\\.)ai\\.binwang\\.me$\n(?:^|\\.)ai\\.google$\n(?:^|\\.)aiph\\.net$\n(?:^|\\.)airasia\\.com$\n(?:^|\\.)airconsole\\.com$\n(?:^|\\.)airvpn\\.org$\n(?:^|\\.)aisex\\.com$\n(?:^|\\.)ait\\.org\\.tw$\n(?:^|\\.)aiweiwei\\.com$\n(?:^|\\.)aiweiweiblog\\.com$\n(?:^|\\.)akademiye\\.org$\n(?:^|\\.)akiba-online\\.com$\n(?:^|\\.)akiba-web\\.com$\n(?:^|\\.)akow\\.org$\n(?:^|\\.)al-islam\\.com$\n(?:^|\\.)al-qimmah\\.net$\n(?:^|\\.)alabout\\.com$\n(?:^|\\.)alanhou\\.com$\n(?:^|\\.)alarab\\.qa$\n(?:^|\\.)alasbarricadas\\.org$\n(?:^|\\.)alexlur\\.org$\n(?:^|\\.)alforattv\\.net$\n(?:^|\\.)alhayat\\.com$\n(?:^|\\.)alicejapan\\.co\\.jp$\n(?:^|\\.)aliengu\\.com$\n(?:^|\\.)alkasir\\.com$\n(?:^|\\.)allcoin\\.com$\n(?:^|\\.)allconnected\\.co$\n(?:^|\\.)alldrawnsex\\.com$\n(?:^|\\.)allervpn\\.com$\n(?:^|\\.)allfinegirls\\.com$\n(?:^|\\.)allgirlmassage\\.com$\n(?:^|\\.)allgirlsallowed\\.org$\n(?:^|\\.)allgravure\\.com$\n(?:^|\\.)alliance\\.org\\.hk$\n(?:^|\\.)allinfa\\.com$\n(?:^|\\.)alljackpotscasino\\.com$\n(?:^|\\.)allmovie\\.com$\n(?:^|\\.)allowed\\.org$\n(?:^|\\.)almasdarnews\\.com$\n(?:^|\\.)almostmy\\.com$\n(?:^|\\.)alphaporno\\.com$\n(?:^|\\.)alternate-tools\\.com$\n(?:^|\\.)alternativeto\\.net$\n(?:^|\\.)altrec\\.com$\n(?:^|\\.)alvinalexander\\.com$\n(?:^|\\.)alwaysdata\\.com$\n(?:^|\\.)alwaysdata\\.net$\n(?:^|\\.)alwaysvpn\\.com$\n(?:^|\\.)am730\\.com\\.hk$\n(?:^|\\.)amazon\\.co\\.jp$\n(?:^|\\.)amazon\\.com$\n(?:^|\\.)ameblo\\.jp$\n(?:^|\\.)americangreencard\\.com$\n(?:^|\\.)americanunfinished\\.com$\n(?:^|\\.)amiblockedornot\\.com$\n(?:^|\\.)amigobbs\\.net$\n(?:^|\\.)amitabhafoundation\\.us$\n(?:^|\\.)amnesty\\.org$\n(?:^|\\.)amnesty\\.org\\.hk$\n(?:^|\\.)amnesty\\.tw$\n(?:^|\\.)amnestyusa\\.org$\n(?:^|\\.)amnyemachen\\.org$\n(?:^|\\.)amoiist\\.com$\n(?:^|\\.)ampproject\\.org$\n(?:^|\\.)amtb-taipei\\.org$\n(?:^|\\.)anchorfree\\.com$\n(?:^|\\.)ancsconf\\.org$\n(?:^|\\.)andfaraway\\.net$\n(?:^|\\.)android-x86\\.org$\n(?:^|\\.)android\\.com$\n(?:^|\\.)androidify\\.com$\n(?:^|\\.)androidplus\\.co$\n(?:^|\\.)androidtv\\.com$\n(?:^|\\.)andygod\\.com$\n(?:^|\\.)angela-merkel\\.de$\n(?:^|\\.)angelfire\\.com$\n(?:^|\\.)angola\\.org$\n(?:^|\\.)angularjs\\.org$\n(?:^|\\.)animecrazy\\.net$\n(?:^|\\.)animeshippuuden\\.com$\n(?:^|\\.)aniscartujo\\.com$\n(?:^|\\.)annatam\\.com$\n(?:^|\\.)anobii\\.com$\n(?:^|\\.)anontext\\.com$\n(?:^|\\.)anonymise\\.us$\n(?:^|\\.)anonymitynetwork\\.com$\n(?:^|\\.)anonymizer\\.com$\n(?:^|\\.)anonymouse\\.org$\n(?:^|\\.)anpopo\\.com$\n(?:^|\\.)answering-islam\\.org$\n(?:^|\\.)anthonycalzadilla\\.com$\n(?:^|\\.)anti1984\\.com$\n(?:^|\\.)antichristendom\\.com$\n(?:^|\\.)antiwave\\.net$\n(?:^|\\.)anyporn\\.com$\n(?:^|\\.)anysex\\.com$\n(?:^|\\.)aobo\\.com\\.au$\n(?:^|\\.)aofriend\\.com$\n(?:^|\\.)aofriend\\.com\\.au$\n(?:^|\\.)aojiao\\.org$\n(?:^|\\.)aolchannels\\.aol\\.com$\n(?:^|\\.)aomiwang\\.com$\n(?:^|\\.)apartmentratings\\.com$\n(?:^|\\.)apartments\\.com$\n(?:^|\\.)apetube\\.com$\n(?:^|\\.)api-secure\\.recaptcha\\.net$\n(?:^|\\.)api-verify\\.recaptcha\\.net$\n(?:^|\\.)api\\.ai$\n(?:^|\\.)api\\.dropboxapi\\.com$\n(?:^|\\.)api\\.linksalpha\\.com$\n(?:^|\\.)api\\.proxlet\\.com$\n(?:^|\\.)api\\.pureapk\\.com$\n(?:^|\\.)api\\.recaptcha\\.net$\n(?:^|\\.)apiary\\.io$\n(?:^|\\.)apidocs\\.linksalpha\\.com$\n(?:^|\\.)apigee\\.com$\n(?:^|\\.)apk-dl\\.com$\n(?:^|\\.)apkdler\\.com$\n(?:^|\\.)apkmirror\\.com$\n(?:^|\\.)apkmonk\\.com$\n(?:^|\\.)apkplz\\.com$\n(?:^|\\.)apkpure\\.com$\n(?:^|\\.)aplusvpn\\.com$\n(?:^|\\.)app\\.box\\.com$\n(?:^|\\.)app\\.heywire\\.com$\n(?:^|\\.)app\\.smartmailcloud\\.com$\n(?:^|\\.)app\\.tutanota\\.com$\n(?:^|\\.)appdownloader\\.net$\n(?:^|\\.)appledaily\\.com$\n(?:^|\\.)appledaily\\.com\\.hk$\n(?:^|\\.)appledaily\\.com\\.tw$\n(?:^|\\.)appshopper\\.com$\n(?:^|\\.)appsocks\\.net$\n(?:^|\\.)appspot\\.com$\n(?:^|\\.)appsto\\.re$\n(?:^|\\.)aptoide\\.com$\n(?:^|\\.)ar\\.hao123\\.com$\n(?:^|\\.)archive\\.fo$\n(?:^|\\.)archive\\.is$\n(?:^|\\.)archive\\.li$\n(?:^|\\.)archive\\.org$\n(?:^|\\.)archive\\.today$\n(?:^|\\.)archives\\.gov$\n(?:^|\\.)archives\\.gov\\.tw$\n(?:^|\\.)arctosia\\.com$\n(?:^|\\.)areca-backup\\.org$\n(?:^|\\.)arena\\.taipei$\n(?:^|\\.)arethusa\\.su$\n(?:^|\\.)arlingtoncemetery\\.mil$\n(?:^|\\.)army\\.mil$\n(?:^|\\.)art4tibet1998\\.org$\n(?:^|\\.)arte\\.tv$\n(?:^|\\.)artofpeacefoundation\\.org$\n(?:^|\\.)artstation\\.com$\n(?:^|\\.)artsy\\.net$\n(?:^|\\.)asacp\\.org$\n(?:^|\\.)asdfg\\.jp$\n(?:^|\\.)asg\\.to$\n(?:^|\\.)asia-gaming\\.com$\n(?:^|\\.)asiaharvest\\.org$\n(?:^|\\.)asianews\\.it$\n(?:^|\\.)asiansexdiary\\.com$\n(?:^|\\.)asianspiss\\.com$\n(?:^|\\.)asianwomensfilm\\.de$\n(?:^|\\.)asiatgp\\.com$\n(?:^|\\.)asiatoday\\.us$\n(?:^|\\.)askstudent\\.com$\n(?:^|\\.)askynz\\.net$\n(?:^|\\.)assembla\\.com$\n(?:^|\\.)assets\\.bwbx\\.io$\n(?:^|\\.)assimp\\.org$\n(?:^|\\.)astrill\\.com$\n(?:^|\\.)atc\\.org\\.au$\n(?:^|\\.)atchinese\\.com$\n(?:^|\\.)atdmt\\.com$\n(?:^|\\.)atgfw\\.org$\n(?:^|\\.)athenaeizou\\.com$\n(?:^|\\.)atlanta168\\.com$\n(?:^|\\.)atlaspost\\.com$\n(?:^|\\.)atnext\\.com$\n(?:^|\\.)authorizeddns\\.net$\n(?:^|\\.)authorizeddns\\.org$\n(?:^|\\.)authorizeddns\\.us$\n(?:^|\\.)autodraw\\.com$\n(?:^|\\.)av-e-body\\.com$\n(?:^|\\.)av\\.com$\n(?:^|\\.)av\\.movie$\n(?:^|\\.)av\\.nightlife141\\.com$\n(?:^|\\.)avaaz\\.org$\n(?:^|\\.)avbody\\.tv$\n(?:^|\\.)avcity\\.tv$\n(?:^|\\.)avcool\\.com$\n(?:^|\\.)avdb\\.in$\n(?:^|\\.)avdb\\.tv$\n(?:^|\\.)avfantasy\\.com$\n(?:^|\\.)avgle\\.com$\n(?:^|\\.)avidemux\\.org$\n(?:^|\\.)avmo\\.pw$\n(?:^|\\.)avmoo\\.com$\n(?:^|\\.)avmoo\\.net$\n(?:^|\\.)avmoo\\.pw$\n(?:^|\\.)avoision\\.com$\n(?:^|\\.)avyahoo\\.com$\n(?:^|\\.)axureformac\\.com$\n(?:^|\\.)azerbaycan\\.tv$\n(?:^|\\.)azerimix\\.com$\n(?:^|\\.)azubu\\.tv$\n(?:^|\\.)b0ne\\.com$\n(?:^|\\.)babynet\\.com\\.hk$\n(?:^|\\.)backchina\\.com$\n(?:^|\\.)backpackers\\.com\\.tw$\n(?:^|\\.)backtotiananmen\\.com$\n(?:^|\\.)badiucao\\.com$\n(?:^|\\.)badjojo\\.com$\n(?:^|\\.)badoo\\.com$\n(?:^|\\.)baidu\\.jp$\n(?:^|\\.)baijie\\.org$\n(?:^|\\.)bailandaily\\.com$\n(?:^|\\.)baixing\\.me$\n(?:^|\\.)bakgeekhome\\.tk$\n(?:^|\\.)banana-vpn\\.com$\n(?:^|\\.)band\\.us$\n(?:^|\\.)bandwagonhost\\.com$\n(?:^|\\.)bangbrosnetwork\\.com$\n(?:^|\\.)bangchen\\.net$\n(?:^|\\.)bangdream\\.space$\n(?:^|\\.)bangyoulater\\.com$\n(?:^|\\.)bankmobilevibe\\.com$\n(?:^|\\.)bannedbook\\.org$\n(?:^|\\.)bannednews\\.org$\n(?:^|\\.)banorte\\.com$\n(?:^|\\.)baramangaonline\\.com$\n(?:^|\\.)barenakedislam\\.com$\n(?:^|\\.)barnabu\\.co\\.uk$\n(?:^|\\.)barton\\.de$\n(?:^|\\.)bartvpn\\.com$\n(?:^|\\.)bash-hackers\\.org$\n(?:^|\\.)bastillepost\\.com$\n(?:^|\\.)bayvoice\\.net$\n(?:^|\\.)bb-chat\\.tv$\n(?:^|\\.)bb\\.ttv\\.com\\.tw$\n(?:^|\\.)bbc\\.co\\.uk$\n(?:^|\\.)bbc\\.com$\n(?:^|\\.)bbc\\.in$\n(?:^|\\.)bbcchinese\\.com$\n(?:^|\\.)bbchat\\.tv$\n(?:^|\\.)bbci\\.co\\.uk$\n(?:^|\\.)bbg\\.gov$\n(?:^|\\.)bbkz\\.com$\n(?:^|\\.)bbnradio\\.org$\n(?:^|\\.)bbs-tw\\.com$\n(?:^|\\.)bbs\\.brockbbs\\.com$\n(?:^|\\.)bbs\\.cantonese\\.asia$\n(?:^|\\.)bbs\\.ecstart\\.com$\n(?:^|\\.)bbs\\.hanminzu\\.org$\n(?:^|\\.)bbs\\.hasi\\.wang$\n(?:^|\\.)bbs\\.huasing\\.org$\n(?:^|\\.)bbs\\.junglobal\\.net$\n(?:^|\\.)bbs\\.kimy\\.com\\.tw$\n(?:^|\\.)bbs\\.mikocon\\.com$\n(?:^|\\.)bbs\\.morbell\\.com$\n(?:^|\\.)bbs\\.mychat\\.to$\n(?:^|\\.)bbs\\.netbig\\.com$\n(?:^|\\.)bbs\\.ozchinese\\.com$\n(?:^|\\.)bbs\\.qmzdd\\.com$\n(?:^|\\.)bbs\\.sina\\.com$\n(?:^|\\.)bbs\\.sina\\.com%2f$\n(?:^|\\.)bbs\\.skykiwi\\.com$\n(?:^|\\.)bbs\\.sou-tong\\.org$\n(?:^|\\.)bbs\\.tuitui\\.info$\n(?:^|\\.)bbsdigest\\.com$\n(?:^|\\.)bbsfeed\\.com$\n(?:^|\\.)bbsland\\.com$\n(?:^|\\.)bbsmo\\.com$\n(?:^|\\.)bbsone\\.com$\n(?:^|\\.)bbtoystore\\.com$\n(?:^|\\.)bcast\\.co\\.nz$\n(?:^|\\.)bcc\\.com\\.tw$\n(?:^|\\.)bcchinese\\.net$\n(?:^|\\.)bcex\\.ca$\n(?:^|\\.)bcmorning\\.com$\n(?:^|\\.)bdsmvideos\\.net$\n(?:^|\\.)beaconevents\\.com$\n(?:^|\\.)bebo\\.com$\n(?:^|\\.)beeg\\.com$\n(?:^|\\.)beevpn\\.com$\n(?:^|\\.)behance\\.net$\n(?:^|\\.)behindkink\\.com$\n(?:^|\\.)beijing1989\\.com$\n(?:^|\\.)beijingspring\\.com$\n(?:^|\\.)beijingzx\\.org$\n(?:^|\\.)belamionline\\.com$\n(?:^|\\.)bell\\.wiki$\n(?:^|\\.)bemywife\\.cc$\n(?:^|\\.)beric\\.me$\n(?:^|\\.)berlintwitterwall\\.com$\n(?:^|\\.)berm\\.co\\.nz$\n(?:^|\\.)bestforchina\\.org$\n(?:^|\\.)bestgore\\.com$\n(?:^|\\.)bestpornstardb\\.com$\n(?:^|\\.)bestvpn\\.com$\n(?:^|\\.)bestvpnanalysis\\.com$\n(?:^|\\.)bestvpnserver\\.com$\n(?:^|\\.)bestvpnservice\\.com$\n(?:^|\\.)bestvpnusa\\.com$\n(?:^|\\.)bet365\\.com$\n(?:^|\\.)betfair\\.com$\n(?:^|\\.)betternet\\.co$\n(?:^|\\.)bettervpn\\.com$\n(?:^|\\.)bettween\\.com$\n(?:^|\\.)betvictor\\.com$\n(?:^|\\.)bewww\\.net$\n(?:^|\\.)beyondfirewall\\.com$\n(?:^|\\.)bfnn\\.org$\n(?:^|\\.)bfsh\\.hk$\n(?:^|\\.)bgvpn\\.com$\n(?:^|\\.)bianlei\\.com$\n(?:^|\\.)biantailajiao\\.com$\n(?:^|\\.)biantailajiao\\.in$\n(?:^|\\.)biblesforamerica\\.org$\n(?:^|\\.)bibox\\.com$\n(?:^|\\.)bic2011\\.org$\n(?:^|\\.)big\\.one$\n(?:^|\\.)bigfools\\.com$\n(?:^|\\.)bigjapanesesex\\.com$\n(?:^|\\.)bigmoney\\.biz$\n(?:^|\\.)bignews\\.org$\n(?:^|\\.)bigsound\\.org$\n(?:^|\\.)biliworld\\.com$\n(?:^|\\.)billypan\\.com$\n(?:^|\\.)binance\\.com$\n(?:^|\\.)binux\\.me$\n(?:^|\\.)bipic\\.net$\n(?:^|\\.)bird\\.so$\n(?:^|\\.)bit-z\\.com$\n(?:^|\\.)bit\\.do$\n(?:^|\\.)bit\\.ly$\n(?:^|\\.)bitc\\.bme\\.emory\\.edu$\n(?:^|\\.)bitcointalk\\.org$\n(?:^|\\.)bitcoinworld\\.com$\n(?:^|\\.)bitfinex\\.com$\n(?:^|\\.)bithumb\\.com$\n(?:^|\\.)bitinka\\.com\\.ar$\n(?:^|\\.)bitmex\\.com$\n(?:^|\\.)bitshare\\.com$\n(?:^|\\.)bitsnoop\\.com$\n(?:^|\\.)bitvise\\.com$\n(?:^|\\.)bizhat\\.com$\n(?:^|\\.)bjnewlife\\.org$\n(?:^|\\.)bjs\\.org$\n(?:^|\\.)bjzc\\.org$\n(?:^|\\.)bl-doujinsouko\\.com$\n(?:^|\\.)blacklogic\\.com$\n(?:^|\\.)blackvpn\\.com$\n(?:^|\\.)blewpass\\.com$\n(?:^|\\.)blinkx\\.com$\n(?:^|\\.)blinw\\.com$\n(?:^|\\.)blip\\.tv$\n(?:^|\\.)blockcn\\.com$\n(?:^|\\.)blockless\\.com$\n(?:^|\\.)blog\\.calibre-ebook\\.com$\n(?:^|\\.)blog\\.cnyes\\.com$\n(?:^|\\.)blog\\.daum\\.net$\n(?:^|\\.)blog\\.de$\n(?:^|\\.)blog\\.exblog\\.co\\.jp$\n(?:^|\\.)blog\\.excite\\.co\\.jp$\n(?:^|\\.)blog\\.expofutures\\.com$\n(?:^|\\.)blog\\.fizzik\\.com$\n(?:^|\\.)blog\\.foolsmountain\\.com$\n(?:^|\\.)blog\\.fuckgfw233\\.org$\n(?:^|\\.)blog\\.goo\\.ne\\.jp$\n(?:^|\\.)blog\\.google$\n(?:^|\\.)blog\\.inoreader\\.com$\n(?:^|\\.)blog\\.istef\\.info$\n(?:^|\\.)blog\\.jackjia\\.com$\n(?:^|\\.)blog\\.jp$\n(?:^|\\.)blog\\.kangye\\.org$\n(?:^|\\.)blog\\.lester850\\.info$\n(?:^|\\.)blog\\.martinoei\\.com$\n(?:^|\\.)blog\\.pathtosharepoint\\.com$\n(?:^|\\.)blog\\.pentalogic\\.net$\n(?:^|\\.)blog\\.qooza\\.hk$\n(?:^|\\.)blog\\.ranxiang\\.com$\n(?:^|\\.)blog\\.sina\\.com\\.tw$\n(?:^|\\.)blog\\.sogoo\\.org$\n(?:^|\\.)blog\\.soylent\\.com$\n(?:^|\\.)blog\\.syx86\\.cn$\n(?:^|\\.)blog\\.syx86\\.com$\n(?:^|\\.)blog\\.taragana\\.com$\n(?:^|\\.)blog\\.tiney\\.com$\n(?:^|\\.)blog\\.workflow\\.is$\n(?:^|\\.)blog\\.xuite\\.net$\n(?:^|\\.)blog\\.youthwant\\.com\\.tw$\n(?:^|\\.)blog\\.youxu\\.info$\n(?:^|\\.)blogblog\\.com$\n(?:^|\\.)blogcatalog\\.com$\n(?:^|\\.)blogcity\\.me$\n(?:^|\\.)blogdns\\.org$\n(?:^|\\.)blogger\\.com$\n(?:^|\\.)blogimg\\.jp$\n(?:^|\\.)bloglines\\.com$\n(?:^|\\.)bloglovin\\.com$\n(?:^|\\.)blogs\\.icerocket\\.com$\n(?:^|\\.)blogs\\.libraryinformationtechnology\\.com$\n(?:^|\\.)blogs\\.tampabay\\.com$\n(?:^|\\.)blogs\\.yahoo\\.co\\.jp$\n(?:^|\\.)blogspot(\\.[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?){1,2}$\n(?:^|\\.)blogtd\\.net$\n(?:^|\\.)blogtd\\.org$\n(?:^|\\.)bloodshed\\.net$\n(?:^|\\.)bloomberg\\.cn$\n(?:^|\\.)bloomberg\\.com$\n(?:^|\\.)bloomberg\\.de$\n(?:^|\\.)bloombergview\\.com$\n(?:^|\\.)bloomfortune\\.com$\n(?:^|\\.)blueangellive\\.com$\n(?:^|\\.)bmfinn\\.com$\n(?:^|\\.)bnews\\.co$\n(?:^|\\.)bnn\\.co$\n(?:^|\\.)bnrmetal\\.com$\n(?:^|\\.)boardreader\\.com$\n(?:^|\\.)bod\\.asia$\n(?:^|\\.)bodog88\\.com$\n(?:^|\\.)bolehvpn\\.net$\n(?:^|\\.)bolin\\.netfirms\\.com$\n(?:^|\\.)bonbonme\\.com$\n(?:^|\\.)bonbonsex\\.com$\n(?:^|\\.)bonfoundation\\.org$\n(?:^|\\.)bongacams\\.com$\n(?:^|\\.)boobstagram\\.com$\n(?:^|\\.)book\\.com\\.tw$\n(?:^|\\.)book\\.zi5\\.me$\n(?:^|\\.)bookepub\\.com$\n(?:^|\\.)books\\.com\\.tw$\n(?:^|\\.)booktopia\\.com\\.au$\n(?:^|\\.)boomssr\\.com$\n(?:^|\\.)bot\\.nu$\n(?:^|\\.)botanwang\\.com$\n(?:^|\\.)bowenpress\\.com$\n(?:^|\\.)boxpn\\.com$\n(?:^|\\.)boxun$\n(?:^|\\.)boxun\\.com$\n(?:^|\\.)boxun\\.tv$\n(?:^|\\.)boxunblog\\.com$\n(?:^|\\.)boxunclub\\.com$\n(?:^|\\.)boyangu\\.com$\n(?:^|\\.)boyfriendtv\\.com$\n(?:^|\\.)boysfood\\.com$\n(?:^|\\.)boysmaster\\.com$\n(?:^|\\.)br\\.hao123\\.com$\n(?:^|\\.)br\\.st$\n(?:^|\\.)brainyquote\\.com$\n(?:^|\\.)brandonhutchinson\\.com$\n(?:^|\\.)braumeister\\.org$\n(?:^|\\.)bravotube\\.net$\n(?:^|\\.)brazzers\\.com$\n(?:^|\\.)break\\.com$\n(?:^|\\.)breakgfw\\.com$\n(?:^|\\.)breaking911\\.com$\n(?:^|\\.)breakingtweets\\.com$\n(?:^|\\.)breakwall\\.net$\n(?:^|\\.)briefdream\\.com$\n(?:^|\\.)briian\\.com$\n(?:^|\\.)brizzly\\.com$\n(?:^|\\.)brkmd\\.com$\n(?:^|\\.)broadbook\\.com$\n(?:^|\\.)broadpressinc\\.com$\n(?:^|\\.)brucewang\\.net$\n(?:^|\\.)brutaltgp\\.com$\n(?:^|\\.)bt2mag\\.com$\n(?:^|\\.)bt95\\.com$\n(?:^|\\.)btaia\\.com$\n(?:^|\\.)btbtav\\.com$\n(?:^|\\.)btc98\\.com$\n(?:^|\\.)btcbank\\.bank$\n(?:^|\\.)btctrade\\.im$\n(?:^|\\.)btdigg\\.org$\n(?:^|\\.)btku\\.me$\n(?:^|\\.)btku\\.org$\n(?:^|\\.)btspread\\.com$\n(?:^|\\.)btsynckeys\\.com$\n(?:^|\\.)budaedu\\.org$\n(?:^|\\.)buddhanet\\.com\\.tw$\n(?:^|\\.)buddhistchannel\\.tv$\n(?:^|\\.)buffered\\.com$\n(?:^|\\.)bullog\\.org$\n(?:^|\\.)bullogger\\.com$\n(?:^|\\.)bunbunhk\\.com$\n(?:^|\\.)busayari\\.com$\n(?:^|\\.)businessinsider\\.com$\n(?:^|\\.)businesstoday\\.com\\.tw$\n(?:^|\\.)businessweek\\.com$\n(?:^|\\.)busu\\.org$\n(?:^|\\.)busytrade\\.com$\n(?:^|\\.)buugaa\\.com$\n(?:^|\\.)buy\\.yahoo\\.com\\.tw$\n(?:^|\\.)buzzhand\\.com$\n(?:^|\\.)buzzhand\\.net$\n(?:^|\\.)buzzorange\\.com$\n(?:^|\\.)bvpn\\.com$\n(?:^|\\.)bwgyhw\\.com$\n(?:^|\\.)bwh1\\.net$\n(?:^|\\.)bwsj\\.hk$\n(?:^|\\.)bx\\.in\\.th$\n(?:^|\\.)bx\\.tl$\n(?:^|\\.)bynet\\.co\\.il$\n(?:^|\\.)c-est-simple\\.com$\n(?:^|\\.)c-spanvideo\\.org$\n(?:^|\\.)c100tibet\\.org$\n(?:^|\\.)c1522\\.mooo\\.com$\n(?:^|\\.)c2cx\\.com$\n(?:^|\\.)cablegatesearch\\.net$\n(?:^|\\.)cachinese\\.com$\n(?:^|\\.)cacnw\\.com$\n(?:^|\\.)cactusvpn\\.com$\n(?:^|\\.)cafepress\\.com$\n(?:^|\\.)cahr\\.org\\.tw$\n(?:^|\\.)calameo\\.com$\n(?:^|\\.)calebelston\\.com$\n(?:^|\\.)calgarychinese\\.ca$\n(?:^|\\.)calgarychinese\\.com$\n(?:^|\\.)calgarychinese\\.net$\n(?:^|\\.)cam4\\.com$\n(?:^|\\.)cam4\\.jp$\n(?:^|\\.)cam4\\.sg$\n(?:^|\\.)camfrog\\.com$\n(?:^|\\.)cams\\.com$\n(?:^|\\.)cams\\.org\\.sg$\n(?:^|\\.)canadameet\\.com$\n(?:^|\\.)canalporno\\.com$\n(?:^|\\.)canyu\\.org$\n(?:^|\\.)cao\\.im$\n(?:^|\\.)caobian\\.info$\n(?:^|\\.)caochangqing\\.com$\n(?:^|\\.)cap\\.org\\.hk$\n(?:^|\\.)carabinasypistolas\\.com$\n(?:^|\\.)cardinalkungfoundation\\.org$\n(?:^|\\.)carfax\\.com$\n(?:^|\\.)cari\\.com\\.my$\n(?:^|\\.)caribbeancom\\.com$\n(?:^|\\.)carmotorshow\\.com$\n(?:^|\\.)cartoonmovement\\.com$\n(?:^|\\.)casadeltibetbcn\\.org$\n(?:^|\\.)casatibet\\.org\\.mx$\n(?:^|\\.)casino\\.williamhill\\.com$\n(?:^|\\.)casinobellini\\.com$\n(?:^|\\.)casinoking\\.com$\n(?:^|\\.)casinoriva\\.com$\n(?:^|\\.)castbox\\.fm$\n(?:^|\\.)catch22\\.net$\n(?:^|\\.)catchgod\\.com$\n(?:^|\\.)catfightpayperview\\.xxx$\n(?:^|\\.)catholic\\.org\\.hk$\n(?:^|\\.)catholic\\.org\\.tw$\n(?:^|\\.)cathvoice\\.org\\.tw$\n(?:^|\\.)cattt\\.com$\n(?:^|\\.)cbc\\.ca$\n(?:^|\\.)cbs\\.ntu\\.edu\\.tw$\n(?:^|\\.)cbsnews\\.com$\n(?:^|\\.)cbtc\\.org\\.hk$\n(?:^|\\.)cccat\\.cc$\n(?:^|\\.)cccat\\.co$\n(?:^|\\.)ccdtr\\.org$\n(?:^|\\.)cchere\\.com$\n(?:^|\\.)ccim\\.org$\n(?:^|\\.)cclife\\.ca$\n(?:^|\\.)cclife\\.org$\n(?:^|\\.)cclifefl\\.org$\n(?:^|\\.)ccthere\\.com$\n(?:^|\\.)ccthere\\.net$\n(?:^|\\.)cctmweb\\.net$\n(?:^|\\.)cctongbao\\.com$\n(?:^|\\.)ccue\\.ca$\n(?:^|\\.)ccue\\.com$\n(?:^|\\.)ccvoice\\.ca$\n(?:^|\\.)ccw\\.org\\.tw$\n(?:^|\\.)cdbook\\.org$\n(?:^|\\.)cdcparty\\.com$\n(?:^|\\.)cdef\\.org$\n(?:^|\\.)cdig\\.info$\n(?:^|\\.)cdjp\\.org$\n(?:^|\\.)cdn$\n(?:^|\\.)cdn-apple\\.com$\n(?:^|\\.)cdn-images\\.mailchimp\\.com$\n(?:^|\\.)cdn\\.assets\\.lfpcontent\\.com$\n(?:^|\\.)cdn\\.helixstudios\\.net$\n(?:^|\\.)cdn\\.printfriendly\\.com$\n(?:^|\\.)cdn\\.seatguru\\.com$\n(?:^|\\.)cdn\\.softlayer\\.net$\n(?:^|\\.)cdn1\\.lp\\.saboom\\.com$\n(?:^|\\.)cdnews\\.com\\.tw$\n(?:^|\\.)cdninstagram\\.com$\n(?:^|\\.)cdp1989\\.org$\n(?:^|\\.)cdp1998\\.org$\n(?:^|\\.)cdp2006\\.org$\n(?:^|\\.)cdpa\\.url\\.tw$\n(?:^|\\.)cdpeu\\.org$\n(?:^|\\.)cdpusa\\.org$\n(?:^|\\.)cdpweb\\.org$\n(?:^|\\.)cdpwu\\.org$\n(?:^|\\.)cdw\\.com$\n(?:^|\\.)cecc\\.gov$\n(?:^|\\.)cellulo\\.info$\n(?:^|\\.)cenews\\.eu$\n(?:^|\\.)centauro\\.com\\.br$\n(?:^|\\.)centerforhumanreprod\\.com$\n(?:^|\\.)centralnation\\.com$\n(?:^|\\.)centurys\\.net$\n(?:^|\\.)certificate-transparency\\.org$\n(?:^|\\.)certificate\\.revocationcheck\\.com$\n(?:^|\\.)cfhks\\.org\\.hk$\n(?:^|\\.)cfos\\.de$\n(?:^|\\.)cftfc\\.com$\n(?:^|\\.)cgdepot\\.org$\n(?:^|\\.)cgst\\.edu$\n(?:^|\\.)ch\\.shvoong\\.com$\n(?:^|\\.)change\\.org$\n(?:^|\\.)changeip\\.name$\n(?:^|\\.)changeip\\.net$\n(?:^|\\.)changeip\\.org$\n(?:^|\\.)changp\\.com$\n(?:^|\\.)changsa\\.net$\n(?:^|\\.)channel8news\\.sg$\n(?:^|\\.)chaoex\\.com$\n(?:^|\\.)chapm25\\.com$\n(?:^|\\.)chatnook\\.com$\n(?:^|\\.)chaturbate\\.com$\n(?:^|\\.)chengmingmag\\.com$\n(?:^|\\.)chenguangcheng\\.com$\n(?:^|\\.)chenpokong\\.com$\n(?:^|\\.)chenpokong\\.net$\n(?:^|\\.)chenshan20042005\\.wordpress\\.com$\n(?:^|\\.)cherrysave\\.com$\n(?:^|\\.)chhongbi\\.org$\n(?:^|\\.)chicagoncmtv\\.com$\n(?:^|\\.)china-mmm\\.jp\\.net$\n(?:^|\\.)china-mmm\\.net$\n(?:^|\\.)china-mmm\\.sa\\.com$\n(?:^|\\.)china-review\\.com\\.ua$\n(?:^|\\.)china-week\\.com$\n(?:^|\\.)china\\.hket\\.com$\n(?:^|\\.)china\\.ucanews\\.com$\n(?:^|\\.)china101\\.com$\n(?:^|\\.)china18\\.org$\n(?:^|\\.)china21\\.com$\n(?:^|\\.)china21\\.org$\n(?:^|\\.)china5000\\.us$\n(?:^|\\.)chinaaffairs\\.org$\n(?:^|\\.)chinaaid\\.me$\n(?:^|\\.)chinaaid\\.net$\n(?:^|\\.)chinaaid\\.org$\n(?:^|\\.)chinaaid\\.us$\n(?:^|\\.)chinachange\\.org$\n(?:^|\\.)chinachannel\\.hk$\n(?:^|\\.)chinacitynews\\.be$\n(?:^|\\.)chinacomments\\.org$\n(?:^|\\.)chinadialogue\\.net$\n(?:^|\\.)chinadigitaltimes\\.net$\n(?:^|\\.)chinaelections\\.org$\n(?:^|\\.)chinaeweekly\\.com$\n(?:^|\\.)chinafreepress\\.org$\n(?:^|\\.)chinagate\\.com$\n(?:^|\\.)chinageeks\\.org$\n(?:^|\\.)chinagfw\\.org$\n(?:^|\\.)chinagonet\\.com$\n(?:^|\\.)chinagreenparty\\.org$\n(?:^|\\.)chinahorizon\\.org$\n(?:^|\\.)chinahush\\.com$\n(?:^|\\.)chinainperspective\\.com$\n(?:^|\\.)chinainterimgov\\.org$\n(?:^|\\.)chinalaborwatch\\.org$\n(?:^|\\.)chinalawandpolicy\\.com$\n(?:^|\\.)chinalawtranslate\\.com$\n(?:^|\\.)chinamule\\.com$\n(?:^|\\.)chinamz\\.org$\n(?:^|\\.)chinanewscenter\\.com$\n(?:^|\\.)chinapost\\.com\\.tw$\n(?:^|\\.)chinapress\\.com\\.my$\n(?:^|\\.)chinarightsia\\.org$\n(?:^|\\.)chinasmile\\.net$\n(?:^|\\.)chinasocialdemocraticparty\\.com$\n(?:^|\\.)chinasoul\\.org$\n(?:^|\\.)chinasucks\\.net$\n(?:^|\\.)chinatimes\\.com$\n(?:^|\\.)chinatopsex\\.com$\n(?:^|\\.)chinatown\\.com\\.au$\n(?:^|\\.)chinatweeps\\.com$\n(?:^|\\.)chinaview\\.wordpress\\.com$\n(?:^|\\.)chinaway\\.org$\n(?:^|\\.)chinaworker\\.info$\n(?:^|\\.)chinaxchina\\.com$\n(?:^|\\.)chinayouth\\.org\\.hk$\n(?:^|\\.)chinayuanmin\\.org$\n(?:^|\\.)chinese-hermit\\.net$\n(?:^|\\.)chinese-leaders\\.org$\n(?:^|\\.)chinese-memorial\\.org$\n(?:^|\\.)chinese\\.donga\\.com$\n(?:^|\\.)chinese\\.engadget\\.com$\n(?:^|\\.)chinese\\.irib\\.ir$\n(?:^|\\.)chinese\\.soifind\\.com$\n(?:^|\\.)chinesedaily\\.com$\n(?:^|\\.)chinesedailynews\\.com$\n(?:^|\\.)chinesedemocracy\\.com$\n(?:^|\\.)chinesegay\\.org$\n(?:^|\\.)chinesen\\.de$\n(?:^|\\.)chinesenews\\.net\\.au$\n(?:^|\\.)chinesepen\\.org$\n(?:^|\\.)chinesetalks\\.net$\n(?:^|\\.)chineseupress\\.com$\n(?:^|\\.)chingcheong\\.com$\n(?:^|\\.)chinman\\.net$\n(?:^|\\.)chithu\\.org$\n(?:^|\\.)chn\\.chosun\\.com$\n(?:^|\\.)chobit\\.cc$\n(?:^|\\.)chrdnet\\.com$\n(?:^|\\.)christianfreedom\\.org$\n(?:^|\\.)christianstudy\\.com$\n(?:^|\\.)christiantimes\\.org\\.hk$\n(?:^|\\.)christusrex\\.org$\n(?:^|\\.)chrlawyers\\.hk$\n(?:^|\\.)chrome\\.com$\n(?:^|\\.)chromecast\\.com$\n(?:^|\\.)chromeexperiments\\.com$\n(?:^|\\.)chromercise\\.com$\n(?:^|\\.)chromestatus\\.com$\n(?:^|\\.)chromium\\.org$\n(?:^|\\.)chuang-yen\\.org$\n(?:^|\\.)chubold\\.com$\n(?:^|\\.)chubun\\.com$\n(?:^|\\.)chuizi\\.net$\n(?:^|\\.)churchinhongkong\\.org$\n(?:^|\\.)chushigangdrug\\.ch$\n(?:^|\\.)cienen\\.com$\n(?:^|\\.)cineastentreff\\.de$\n(?:^|\\.)cipfg\\.org$\n(?:^|\\.)circlethebayfortibet\\.org$\n(?:^|\\.)cirosantilli\\.com$\n(?:^|\\.)citizencn\\.com$\n(?:^|\\.)citizenlab\\.org$\n(?:^|\\.)citizenscommission\\.hk$\n(?:^|\\.)citizensradio\\.org$\n(?:^|\\.)city365\\.ca$\n(?:^|\\.)city9x\\.com$\n(?:^|\\.)citypopulation\\.de$\n(?:^|\\.)citytalk\\.tw$\n(?:^|\\.)civicparty\\.hk$\n(?:^|\\.)civildisobediencemovement\\.org$\n(?:^|\\.)civilhrfront\\.org$\n(?:^|\\.)civiliangunner\\.com$\n(?:^|\\.)civilmedia\\.tw$\n(?:^|\\.)ck101\\.com$\n(?:^|\\.)cl\\.d0z\\.net$\n(?:^|\\.)clarionproject\\.org$\n(?:^|\\.)classicalguitarblog\\.net$\n(?:^|\\.)clb\\.org\\.hk$\n(?:^|\\.)cldr\\.unicode\\.org$\n(?:^|\\.)cleansite\\.biz$\n(?:^|\\.)cleansite\\.info$\n(?:^|\\.)cleansite\\.us$\n(?:^|\\.)clearharmony\\.net$\n(?:^|\\.)clearsurance\\.com$\n(?:^|\\.)clearwisdom\\.net$\n(?:^|\\.)clementine-player\\.org$\n(?:^|\\.)cling\\.omy\\.sg$\n(?:^|\\.)clinica-tibet\\.ru$\n(?:^|\\.)clipfish\\.de$\n(?:^|\\.)cloakpoint\\.com$\n(?:^|\\.)cloud\\.feedly\\.com$\n(?:^|\\.)cloud\\.mail\\.ru$\n(?:^|\\.)club1069\\.com$\n(?:^|\\.)clyp\\.it$\n(?:^|\\.)cmcn\\.org$\n(?:^|\\.)cmi\\.org\\.tw$\n(?:^|\\.)cmp\\.hku\\.hk$\n(?:^|\\.)cms\\.gov$\n(?:^|\\.)cmule\\.com$\n(?:^|\\.)cmule\\.org$\n(?:^|\\.)cmx\\.im$\n(?:^|\\.)cn-proxy\\.com$\n(?:^|\\.)cn\\.calameo\\.com$\n(?:^|\\.)cn\\.dayabook\\.com$\n(?:^|\\.)cn\\.fmnnow\\.com$\n(?:^|\\.)cn\\.freeones\\.com$\n(?:^|\\.)cn\\.giganews\\.com$\n(?:^|\\.)cn\\.ibtimes\\.com$\n(?:^|\\.)cn\\.nytstyle\\.com$\n(?:^|\\.)cn\\.sandscotaicentral\\.com$\n(?:^|\\.)cn\\.shafaqna\\.com$\n(?:^|\\.)cn\\.streetvoice\\.com$\n(?:^|\\.)cn\\.thegay\\.com$\n(?:^|\\.)cn\\.uncyclopedia\\.wikia\\.com$\n(?:^|\\.)cn\\.uptodown\\.com$\n(?:^|\\.)cn\\.voa\\.mobi$\n(?:^|\\.)cn2\\.streetvoice\\.com$\n(?:^|\\.)cn6\\.eu$\n(?:^|\\.)cna\\.com\\.tw$\n(?:^|\\.)cnabc\\.com$\n(?:^|\\.)cnbbnews\\.wordpress\\.com$\n(?:^|\\.)cnd\\.org$\n(?:^|\\.)cnex\\.org\\.cn$\n(?:^|\\.)cnineu\\.com$\n(?:^|\\.)cnn\\.com$\n(?:^|\\.)cnnews\\.chosun\\.com$\n(?:^|\\.)cnpolitics\\.org$\n(?:^|\\.)cnproxy\\.com$\n(?:^|\\.)co\\.ng\\.mil$\n(?:^|\\.)coat\\.co\\.jp$\n(?:^|\\.)cobinhood\\.com$\n(?:^|\\.)cochina\\.co$\n(?:^|\\.)cochina\\.org$\n(?:^|\\.)code1984\\.com$\n(?:^|\\.)codeshare\\.io$\n(?:^|\\.)codeskulptor\\.org$\n(?:^|\\.)coin2co\\.in$\n(?:^|\\.)coinbene\\.com$\n(?:^|\\.)coinegg\\.com$\n(?:^|\\.)coinex\\.com$\n(?:^|\\.)coingi\\.com$\n(?:^|\\.)coinrail\\.co\\.kr$\n(?:^|\\.)cointiger\\.com$\n(?:^|\\.)cointobe\\.com$\n(?:^|\\.)coinut\\.com$\n(?:^|\\.)collateralmurder\\.com$\n(?:^|\\.)collateralmurder\\.org$\n(?:^|\\.)com\\.google$\n(?:^|\\.)comefromchina\\.com$\n(?:^|\\.)comic-mega\\.me$\n(?:^|\\.)commandarms\\.com$\n(?:^|\\.)commentshk\\.com$\n(?:^|\\.)communistcrimes\\.org$\n(?:^|\\.)community\\.windy\\.com$\n(?:^|\\.)communitychoicecu\\.com$\n(?:^|\\.)compileheart\\.com$\n(?:^|\\.)compress\\.to$\n(?:^|\\.)connect\\.facebook\\.net$\n(?:^|\\.)conoha\\.jp$\n(?:^|\\.)contactmagazine\\.net$\n(?:^|\\.)contests\\.twilio\\.com$\n(?:^|\\.)convio\\.net$\n(?:^|\\.)coobay\\.com$\n(?:^|\\.)coolaler\\.com$\n(?:^|\\.)coolder\\.com$\n(?:^|\\.)coolloud\\.org\\.tw$\n(?:^|\\.)coolncute\\.com$\n(?:^|\\.)coolstuffinc\\.com$\n(?:^|\\.)corumcollege\\.com$\n(?:^|\\.)cos-moe\\.com$\n(?:^|\\.)cosmic\\.monar\\.ch$\n(?:^|\\.)cosplayjav\\.pl$\n(?:^|\\.)costco\\.com$\n(?:^|\\.)cotweet\\.com$\n(?:^|\\.)counter\\.social$\n(?:^|\\.)coursehero\\.com$\n(?:^|\\.)cpj\\.org$\n(?:^|\\.)cq99\\.us$\n(?:^|\\.)crackle\\.com$\n(?:^|\\.)crazys\\.cc$\n(?:^|\\.)crazyshit\\.com$\n(?:^|\\.)crbug\\.com$\n(?:^|\\.)crchina\\.org$\n(?:^|\\.)crd-net\\.org$\n(?:^|\\.)creaders\\.net$\n(?:^|\\.)creadersnet\\.com$\n(?:^|\\.)creativelab5\\.com$\n(?:^|\\.)crisisresponse\\.google$\n(?:^|\\.)cristyli\\.com$\n(?:^|\\.)crocotube\\.com$\n(?:^|\\.)crossfire\\.co\\.kr$\n(?:^|\\.)crossthewall\\.net$\n(?:^|\\.)crossvpn\\.net$\n(?:^|\\.)crrev\\.com$\n(?:^|\\.)crucial\\.com$\n(?:^|\\.)csdparty\\.com$\n(?:^|\\.)css\\.pixnet\\.in$\n(?:^|\\.)csuchen\\.de$\n(?:^|\\.)csw\\.org\\.uk$\n(?:^|\\.)ct\\.org\\.tw$\n(?:^|\\.)ctao\\.org$\n(?:^|\\.)ctfriend\\.net$\n(?:^|\\.)cthlo\\.github\\.io$\n(?:^|\\.)ctitv\\.com\\.tw$\n(?:^|\\.)cts\\.com\\.tw$\n(?:^|\\.)cuhkacs\\.org$\n(?:^|\\.)cuihua\\.org$\n(?:^|\\.)cuiweiping\\.net$\n(?:^|\\.)culture\\.tw$\n(?:^|\\.)cumlouder\\.com$\n(?:^|\\.)curvefish\\.com$\n(?:^|\\.)cusu\\.hk$\n(?:^|\\.)cutscenes\\.net$\n(?:^|\\.)cw\\.com\\.tw$\n(?:^|\\.)cyberghost\\.natado\\.com$\n(?:^|\\.)cyberghostvpn\\.com$\n(?:^|\\.)cynscribe\\.com$\n(?:^|\\.)cytode\\.us$\n(?:^|\\.)d-fukyu\\.com$\n(?:^|\\.)d100\\.net$\n(?:^|\\.)d1b183sg0nvnuh\\.cloudfront\\.net$\n(?:^|\\.)d1c37gjwa26taa\\.cloudfront\\.net$\n(?:^|\\.)d2bay\\.com$\n(?:^|\\.)d2pass\\.com$\n(?:^|\\.)d3c33hcgiwev3\\.cloudfront\\.net$\n(?:^|\\.)d3rhr7kgmtrq1v\\.cloudfront\\.net$\n(?:^|\\.)dabr\\.co\\.uk$\n(?:^|\\.)dabr\\.eu$\n(?:^|\\.)dabr\\.me$\n(?:^|\\.)dabr\\.mobi$\n(?:^|\\.)dadazim\\.com$\n(?:^|\\.)dadi360\\.com$\n(?:^|\\.)dafabet\\.com$\n(?:^|\\.)dafagood\\.com$\n(?:^|\\.)dafahao\\.com$\n(?:^|\\.)dafoh\\.org$\n(?:^|\\.)daftporn\\.com$\n(?:^|\\.)dagelijksestandaard\\.nl$\n(?:^|\\.)daidostup\\.ru$\n(?:^|\\.)dailidaili\\.com$\n(?:^|\\.)dailymotion\\.com$\n(?:^|\\.)dailynews\\.sina\\.com$\n(?:^|\\.)dailynews\\.sina\\.com%2f$\n(?:^|\\.)dailyview\\.tw$\n(?:^|\\.)daiphapinfo\\.net$\n(?:^|\\.)dajiyuan\\.com$\n(?:^|\\.)dajiyuan\\.de$\n(?:^|\\.)dajiyuan\\.eu$\n(?:^|\\.)dajusha\\.baywords\\.com$\n(?:^|\\.)dalailama-archives\\.org$\n(?:^|\\.)dalailama\\.com$\n(?:^|\\.)dalailama\\.mn$\n(?:^|\\.)dalailama\\.ru$\n(?:^|\\.)dalailama\\.usc\\.edu$\n(?:^|\\.)dalailama80\\.org$\n(?:^|\\.)dalailamacenter\\.org$\n(?:^|\\.)dalailamafellows\\.org$\n(?:^|\\.)dalailamafilm\\.com$\n(?:^|\\.)dalailamafoundation\\.org$\n(?:^|\\.)dalailamahindi\\.com$\n(?:^|\\.)dalailamainaustralia\\.org$\n(?:^|\\.)dalailamajapanese\\.com$\n(?:^|\\.)dalailamaprotesters\\.info$\n(?:^|\\.)dalailamaquotes\\.org$\n(?:^|\\.)dalailamatrust\\.org$\n(?:^|\\.)dalailamavisit\\.org\\.nz$\n(?:^|\\.)dalailamaworld\\.com$\n(?:^|\\.)dalianmeng\\.org$\n(?:^|\\.)daliulian\\.org$\n(?:^|\\.)danbooru\\.donmai\\.us$\n(?:^|\\.)danke4china\\.net$\n(?:^|\\.)danwei\\.org$\n(?:^|\\.)daodu14\\.jigsy\\.com$\n(?:^|\\.)daolan\\.net$\n(?:^|\\.)daozhongxing\\.org$\n(?:^|\\.)darktech\\.org$\n(?:^|\\.)darktoy\\.net$\n(?:^|\\.)darpa\\.mil$\n(?:^|\\.)dastrassi\\.org$\n(?:^|\\.)data-vocabulary\\.org$\n(?:^|\\.)data\\.flurry\\.com$\n(?:^|\\.)data\\.gov\\.tw$\n(?:^|\\.)daum\\.net$\n(?:^|\\.)david-kilgour\\.com$\n(?:^|\\.)dawangidc\\.com$\n(?:^|\\.)daxa\\.cn$\n(?:^|\\.)daylife\\.com$\n(?:^|\\.)db\\.tt$\n(?:^|\\.)dbc\\.hk$\n(?:^|\\.)dcard\\.tw$\n(?:^|\\.)dcmilitary\\.com$\n(?:^|\\.)ddc\\.com\\.tw$\n(?:^|\\.)ddhw\\.info$\n(?:^|\\.)ddns\\.info$\n(?:^|\\.)ddns\\.me\\.uk$\n(?:^|\\.)ddns\\.mobi$\n(?:^|\\.)ddns\\.ms$\n(?:^|\\.)ddns\\.name$\n(?:^|\\.)ddns\\.net$\n(?:^|\\.)ddns\\.us$\n(?:^|\\.)de-sci\\.org$\n(?:^|\\.)deaftone\\.com$\n(?:^|\\.)debug\\.com$\n(?:^|\\.)deck\\.ly$\n(?:^|\\.)decodet\\.co$\n(?:^|\\.)deepmind\\.com$\n(?:^|\\.)deezer\\.com$\n(?:^|\\.)definebabe\\.com$\n(?:^|\\.)deja\\.com$\n(?:^|\\.)delcamp\\.net$\n(?:^|\\.)delicious\\.com$\n(?:^|\\.)demo\\.opera-mini\\.net$\n(?:^|\\.)democrats\\.org$\n(?:^|\\.)depositphotos\\.com$\n(?:^|\\.)derekhsu\\.homeip\\.net$\n(?:^|\\.)desc\\.se$\n(?:^|\\.)design\\.google$\n(?:^|\\.)desipro\\.de$\n(?:^|\\.)dessci\\.com$\n(?:^|\\.)destiny\\.xfiles\\.to$\n(?:^|\\.)destroy-china\\.jp$\n(?:^|\\.)deutsche-welle\\.de$\n(?:^|\\.)developers\\.box\\.net$\n(?:^|\\.)devio\\.us$\n(?:^|\\.)devpn\\.com$\n(?:^|\\.)dfas\\.mil$\n(?:^|\\.)dfn\\.org$\n(?:^|\\.)dharamsalanet\\.com$\n(?:^|\\.)dharmakara\\.net$\n(?:^|\\.)dhcp\\.biz$\n(?:^|\\.)diaoyuislands\\.org$\n(?:^|\\.)dictionary\\.goo\\.ne\\.jp$\n(?:^|\\.)difangwenge\\.org$\n(?:^|\\.)digiland\\.tw$\n(?:^|\\.)digisfera\\.com$\n(?:^|\\.)digitalnomadsproject\\.org$\n(?:^|\\.)diigo\\.com$\n(?:^|\\.)dilber\\.se$\n(?:^|\\.)dingchin\\.com\\.tw$\n(?:^|\\.)dipity\\.com$\n(?:^|\\.)directcreative\\.com$\n(?:^|\\.)discoins\\.com$\n(?:^|\\.)disconnect\\.me$\n(?:^|\\.)discordapp\\.com$\n(?:^|\\.)discordapp\\.net$\n(?:^|\\.)discuss\\.com\\.hk$\n(?:^|\\.)discuss4u\\.com$\n(?:^|\\.)dish\\.com$\n(?:^|\\.)disp\\.cc$\n(?:^|\\.)disqus\\.com$\n(?:^|\\.)dit-inc\\.us$\n(?:^|\\.)dizhidizhi\\.com$\n(?:^|\\.)dizhuzhishang\\.com$\n(?:^|\\.)djangosnippets\\.org$\n(?:^|\\.)djorz\\.com$\n(?:^|\\.)dl-laby\\.jp$\n(?:^|\\.)dl\\.box\\.net$\n(?:^|\\.)dlsite\\.com$\n(?:^|\\.)dlyoutube\\.com$\n(?:^|\\.)dm530\\.net$\n(?:^|\\.)dmcdn\\.net$\n(?:^|\\.)dmm\\.co\\.jp$\n(?:^|\\.)dns-dns\\.com$\n(?:^|\\.)dns-stuff\\.com$\n(?:^|\\.)dns\\.google$\n(?:^|\\.)dns04\\.com$\n(?:^|\\.)dns05\\.com$\n(?:^|\\.)dns1\\.us$\n(?:^|\\.)dns2\\.us$\n(?:^|\\.)dns2go\\.com$\n(?:^|\\.)dnscrypt\\.org$\n(?:^|\\.)dnset\\.com$\n(?:^|\\.)dnsrd\\.com$\n(?:^|\\.)dnssec\\.net$\n(?:^|\\.)dnvod\\.tv$\n(?:^|\\.)doctorvoice\\.org$\n(?:^|\\.)dogfartnetwork\\.com$\n(?:^|\\.)dojin\\.com$\n(?:^|\\.)dok-forum\\.net$\n(?:^|\\.)dolc\\.de$\n(?:^|\\.)dolf\\.org\\.hk$\n(?:^|\\.)dollf\\.com$\n(?:^|\\.)domain\\.club\\.tw$\n(?:^|\\.)domainhelp\\.search\\.com$\n(?:^|\\.)domains\\.google$\n(?:^|\\.)domaintoday\\.com\\.au$\n(?:^|\\.)dongtaiwang\\.com$\n(?:^|\\.)dongtaiwang\\.net$\n(?:^|\\.)dongyangjing\\.com$\n(?:^|\\.)dontfilter\\.us$\n(?:^|\\.)dontmovetochina\\.com$\n(?:^|\\.)dorjeshugden\\.com$\n(?:^|\\.)dotplane\\.com$\n(?:^|\\.)dotsub\\.com$\n(?:^|\\.)dotvpn\\.com$\n(?:^|\\.)doub\\.io$\n(?:^|\\.)doubibackup\\.com$\n(?:^|\\.)doubmirror\\.cf$\n(?:^|\\.)dougscripts\\.com$\n(?:^|\\.)douhokanko\\.net$\n(?:^|\\.)doujincafe\\.com$\n(?:^|\\.)dowei\\.org$\n(?:^|\\.)download\\.aircrack-ng\\.org$\n(?:^|\\.)download\\.cnet\\.com$\n(?:^|\\.)download\\.ithome\\.com\\.tw$\n(?:^|\\.)dphk\\.org$\n(?:^|\\.)dpp\\.org\\.tw$\n(?:^|\\.)dpr\\.info$\n(?:^|\\.)dragonex\\.io$\n(?:^|\\.)dragonsprings\\.org$\n(?:^|\\.)dreamamateurs\\.com$\n(?:^|\\.)drepung\\.org$\n(?:^|\\.)drgan\\.net$\n(?:^|\\.)drmingxia\\.org$\n(?:^|\\.)dropbooks\\.tv$\n(?:^|\\.)dropbox\\.com$\n(?:^|\\.)dropboxusercontent\\.com$\n(?:^|\\.)drsunacademy\\.com$\n(?:^|\\.)drtuber\\.com$\n(?:^|\\.)dscn\\.info$\n(?:^|\\.)dsmtp\\.com$\n(?:^|\\.)dstk\\.dk$\n(?:^|\\.)dtdns\\.net$\n(?:^|\\.)dtiblog\\.com$\n(?:^|\\.)dtic\\.mil$\n(?:^|\\.)dtwang\\.org$\n(?:^|\\.)duanzhihu\\.com$\n(?:^|\\.)duck\\.com$\n(?:^|\\.)duckdns\\.org$\n(?:^|\\.)duckduckgo-owned-server\\.yahoo\\.net$\n(?:^|\\.)duckduckgo\\.com$\n(?:^|\\.)duckload\\.com$\n(?:^|\\.)duckmylife\\.com$\n(?:^|\\.)duga\\.jp$\n(?:^|\\.)duihua\\.org$\n(?:^|\\.)duihuahrjournal\\.org$\n(?:^|\\.)dumb1\\.com$\n(?:^|\\.)dunyabulteni\\.net$\n(?:^|\\.)duoweitimes\\.com$\n(?:^|\\.)duping\\.net$\n(?:^|\\.)duplicati\\.com$\n(?:^|\\.)dupola\\.com$\n(?:^|\\.)dupola\\.net$\n(?:^|\\.)dushi\\.ca$\n(?:^|\\.)dvdpac\\.com$\n(?:^|\\.)dvorak\\.org$\n(?:^|\\.)dw-world\\.com$\n(?:^|\\.)dw-world\\.de$\n(?:^|\\.)dw\\.com$\n(?:^|\\.)dw\\.de$\n(?:^|\\.)dwnews\\.com$\n(?:^|\\.)dwnews\\.net$\n(?:^|\\.)dynamic-dns\\.net$\n(?:^|\\.)dynamicdns\\.biz$\n(?:^|\\.)dynamicdns\\.co\\.uk$\n(?:^|\\.)dynamicdns\\.me\\.uk$\n(?:^|\\.)dynamicdns\\.org\\.uk$\n(?:^|\\.)dynawebinc\\.com$\n(?:^|\\.)dyndns-ip\\.com$\n(?:^|\\.)dyndns-pics\\.com$\n(?:^|\\.)dyndns\\.org$\n(?:^|\\.)dyndns\\.pro$\n(?:^|\\.)dynssl\\.com$\n(?:^|\\.)dynu\\.com$\n(?:^|\\.)dynu\\.net$\n(?:^|\\.)dynupdate\\.no-ip\\.com$\n(?:^|\\.)dysfz\\.cc$\n(?:^|\\.)dzze\\.com$\n(?:^|\\.)e-classical\\.com\\.tw$\n(?:^|\\.)e-gold\\.com$\n(?:^|\\.)e-hentai\\.org$\n(?:^|\\.)e-hentaidb\\.com$\n(?:^|\\.)e-info\\.org\\.tw$\n(?:^|\\.)e-traderland\\.net$\n(?:^|\\.)e-zone\\.com\\.hk$\n(?:^|\\.)e123\\.hk$\n(?:^|\\.)earlytibet\\.com$\n(?:^|\\.)earthcam\\.com$\n(?:^|\\.)earthvpn\\.com$\n(?:^|\\.)eastern-ark\\.com$\n(?:^|\\.)easternlightning\\.org$\n(?:^|\\.)eastturkestan\\.com$\n(?:^|\\.)eastturkistan-gov\\.org$\n(?:^|\\.)eastturkistancc\\.org$\n(?:^|\\.)eastturkistangovernmentinexile\\.us$\n(?:^|\\.)easyca\\.ca$\n(?:^|\\.)easypic\\.com$\n(?:^|\\.)ebony-beauty\\.com$\n(?:^|\\.)ebook\\.hyread\\.com\\.tw$\n(?:^|\\.)ebookbrowse\\.com$\n(?:^|\\.)ebookee\\.com$\n(?:^|\\.)ebtcbank\\.com$\n(?:^|\\.)ecfa\\.org\\.tw$\n(?:^|\\.)echofon\\.com$\n(?:^|\\.)ecimg\\.tw$\n(?:^|\\.)ecministry\\.net$\n(?:^|\\.)economist\\.com$\n(?:^|\\.)ecsm\\.vs\\.com$\n(?:^|\\.)edgecastcdn\\.net$\n(?:^|\\.)edicypages\\.com$\n(?:^|\\.)edmontonchina\\.cn$\n(?:^|\\.)edmontonservice\\.com$\n(?:^|\\.)edns\\.biz$\n(?:^|\\.)edoors\\.com$\n(?:^|\\.)edubridge\\.com$\n(?:^|\\.)edupro\\.org$\n(?:^|\\.)eeas\\.europa\\.eu$\n(?:^|\\.)eesti\\.ee$\n(?:^|\\.)eevpn\\.com$\n(?:^|\\.)efcc\\.org\\.hk$\n(?:^|\\.)effers\\.com$\n(?:^|\\.)efksoft\\.com$\n(?:^|\\.)efukt\\.com$\n(?:^|\\.)eic-av\\.com$\n(?:^|\\.)eireinikotaerukai\\.com$\n(?:^|\\.)eisbb\\.com$\n(?:^|\\.)eksisozluk\\.com$\n(?:^|\\.)electionsmeter\\.com$\n(?:^|\\.)elgoog\\.im$\n(?:^|\\.)ellawine\\.org$\n(?:^|\\.)elpais\\.com$\n(?:^|\\.)eltondisney\\.com$\n(?:^|\\.)emaga\\.com$\n(?:^|\\.)emanna\\.com$\n(?:^|\\.)embr\\.in$\n(?:^|\\.)emilylau\\.org\\.hk$\n(?:^|\\.)empfil\\.com$\n(?:^|\\.)emule-ed2k\\.com$\n(?:^|\\.)emulefans\\.com$\n(?:^|\\.)emuparadise\\.me$\n(?:^|\\.)en\\.favotter\\.net$\n(?:^|\\.)en\\.hao123\\.com$\n(?:^|\\.)enanyang\\.my$\n(?:^|\\.)encyclopedia\\.com$\n(?:^|\\.)enewstree\\.com$\n(?:^|\\.)enfal\\.de$\n(?:^|\\.)engagedaily\\.org$\n(?:^|\\.)englishforeveryone\\.org$\n(?:^|\\.)englishfromengland\\.co\\.uk$\n(?:^|\\.)englishpen\\.org$\n(?:^|\\.)enlighten\\.org\\.tw$\n(?:^|\\.)entermap\\.com$\n(?:^|\\.)entnt\\.com$\n(?:^|\\.)environment\\.google$\n(?:^|\\.)epa\\.gov\\.tw$\n(?:^|\\.)epac\\.to$\n(?:^|\\.)episcopalchurch\\.org$\n(?:^|\\.)epochhk\\.com$\n(?:^|\\.)epochtimes-bg\\.com$\n(?:^|\\.)epochtimes-romania\\.com$\n(?:^|\\.)epochtimes\\.co\\.il$\n(?:^|\\.)epochtimes\\.co\\.kr$\n(?:^|\\.)epochtimes\\.com$\n(?:^|\\.)epochtimes\\.cz$\n(?:^|\\.)epochtimes\\.de$\n(?:^|\\.)epochtimes\\.fr$\n(?:^|\\.)epochtimes\\.ie$\n(?:^|\\.)epochtimes\\.it$\n(?:^|\\.)epochtimes\\.jp$\n(?:^|\\.)epochtimes\\.ru$\n(?:^|\\.)epochtimes\\.se$\n(?:^|\\.)epochtimestr\\.com$\n(?:^|\\.)epochweek\\.com$\n(?:^|\\.)epochweekly\\.com$\n(?:^|\\.)eporner\\.com$\n(?:^|\\.)equinenow\\.com$\n(?:^|\\.)erabaru\\.net$\n(?:^|\\.)eracom\\.com\\.tw$\n(?:^|\\.)eraysoft\\.com\\.tr$\n(?:^|\\.)erepublik\\.com$\n(?:^|\\.)erights\\.net$\n(?:^|\\.)eriversoft\\.com$\n(?:^|\\.)erktv\\.com$\n(?:^|\\.)ernestmandel\\.org$\n(?:^|\\.)erodaizensyu\\.com$\n(?:^|\\.)erodoujinlog\\.com$\n(?:^|\\.)erodoujinworld\\.com$\n(?:^|\\.)eromanga-kingdom\\.com$\n(?:^|\\.)eromangadouzin\\.com$\n(?:^|\\.)eromon\\.net$\n(?:^|\\.)eroprofile\\.com$\n(?:^|\\.)eroticsaloon\\.net$\n(?:^|\\.)eslite\\.com$\n(?:^|\\.)esmtp\\.biz$\n(?:^|\\.)esurance\\.com$\n(?:^|\\.)etaa\\.org\\.au$\n(?:^|\\.)etadult\\.com$\n(?:^|\\.)etaiwannews\\.com$\n(?:^|\\.)etherdelta\\.com$\n(?:^|\\.)etizer\\.org$\n(?:^|\\.)etokki\\.com$\n(?:^|\\.)etools\\.ncol\\.com$\n(?:^|\\.)etowns\\.net$\n(?:^|\\.)etowns\\.org$\n(?:^|\\.)ettoday\\.net$\n(?:^|\\.)etvonline\\.hk$\n(?:^|\\.)eu\\.org$\n(?:^|\\.)eucasino\\.com$\n(?:^|\\.)eulam\\.com$\n(?:^|\\.)eurekavpt\\.com$\n(?:^|\\.)euronews\\.com$\n(?:^|\\.)evchk\\.wikia\\.com$\n(?:^|\\.)evschool\\.net$\n(?:^|\\.)exblog\\.jp$\n(?:^|\\.)exchristian\\.hk$\n(?:^|\\.)exmo\\.com$\n(?:^|\\.)exmormon\\.org$\n(?:^|\\.)expatshield\\.com$\n(?:^|\\.)expecthim\\.com$\n(?:^|\\.)expekt\\.com$\n(?:^|\\.)experts-univers\\.com$\n(?:^|\\.)exploader\\.net$\n(?:^|\\.)expressvpn\\.com$\n(?:^|\\.)exrates\\.me$\n(?:^|\\.)extmatrix\\.com$\n(?:^|\\.)extremetube\\.com$\n(?:^|\\.)exx\\.com$\n(?:^|\\.)eyevio\\.jp$\n(?:^|\\.)eyny\\.com$\n(?:^|\\.)ezpc\\.tk$\n(?:^|\\.)ezpeer\\.com$\n(?:^|\\.)ezua\\.com$\n(?:^|\\.)fa\\.gov\\.tw$\n(?:^|\\.)facebook\\.br$\n(?:^|\\.)facebook\\.com$\n(?:^|\\.)facebook\\.design$\n(?:^|\\.)facebook\\.hu$\n(?:^|\\.)facebook\\.in$\n(?:^|\\.)facebook\\.nl$\n(?:^|\\.)facebook\\.se$\n(?:^|\\.)facebookmail\\.com$\n(?:^|\\.)facebookquotes4u\\.com$\n(?:^|\\.)faceless\\.me$\n(?:^|\\.)facesofnyfw\\.com$\n(?:^|\\.)facesoftibetanselfimmolators\\.info$\n(?:^|\\.)fail\\.hk$\n(?:^|\\.)faith100\\.org$\n(?:^|\\.)faithfuleye\\.com$\n(?:^|\\.)faiththedog\\.info$\n(?:^|\\.)fakku\\.net$\n(?:^|\\.)falsefire\\.com$\n(?:^|\\.)falun-co\\.org$\n(?:^|\\.)falun-ny\\.net$\n(?:^|\\.)falun\\.caltech\\.edu$\n(?:^|\\.)falunart\\.org$\n(?:^|\\.)falunasia\\.info$\n(?:^|\\.)falunau\\.org$\n(?:^|\\.)falunaz\\.net$\n(?:^|\\.)falundafa-dc\\.org$\n(?:^|\\.)falundafa-florida\\.org$\n(?:^|\\.)falundafa-nc\\.org$\n(?:^|\\.)falundafa-pa\\.net$\n(?:^|\\.)falundafa-sacramento\\.org$\n(?:^|\\.)falundafa\\.org$\n(?:^|\\.)falundafaindia\\.org$\n(?:^|\\.)falundafamuseum\\.org$\n(?:^|\\.)falungong\\.club$\n(?:^|\\.)falungong\\.de$\n(?:^|\\.)falungong\\.org\\.uk$\n(?:^|\\.)falunhr\\.org$\n(?:^|\\.)faluninfo\\.de$\n(?:^|\\.)faluninfo\\.net$\n(?:^|\\.)falunpilipinas\\.net$\n(?:^|\\.)falunworld\\.net$\n(?:^|\\.)familyfed\\.org$\n(?:^|\\.)famunion\\.com$\n(?:^|\\.)fan-qiang\\.com$\n(?:^|\\.)fangbinxing\\.com$\n(?:^|\\.)fangeming\\.com$\n(?:^|\\.)fangeqiang\\.com$\n(?:^|\\.)fanglizhi\\.info$\n(?:^|\\.)fangmincn\\.org$\n(?:^|\\.)fangong\\.forums-free\\.com$\n(?:^|\\.)fangong\\.org$\n(?:^|\\.)fangongheike\\.com$\n(?:^|\\.)fanhaodang\\.com$\n(?:^|\\.)fanqiang\\.tk$\n(?:^|\\.)fanqianghou\\.com$\n(?:^|\\.)fanqiangyakexi\\.net$\n(?:^|\\.)fanqiangzhe\\.com$\n(?:^|\\.)fanswong\\.com$\n(?:^|\\.)fanyue\\.info$\n(?:^|\\.)fapdu\\.com$\n(?:^|\\.)faproxy\\.com$\n(?:^|\\.)faqserv\\.com$\n(?:^|\\.)fartit\\.com$\n(?:^|\\.)farwestchina\\.com$\n(?:^|\\.)fast\\.wistia\\.com$\n(?:^|\\.)fastpic\\.ru$\n(?:^|\\.)fastssh\\.com$\n(?:^|\\.)faststone\\.org$\n(?:^|\\.)fatbtc\\.com$\n(?:^|\\.)favstar\\.fm$\n(?:^|\\.)fawanghuihui\\.org$\n(?:^|\\.)faydao\\.com$\n(?:^|\\.)fb\\.com$\n(?:^|\\.)fb\\.me$\n(?:^|\\.)fbaddins\\.com$\n(?:^|\\.)fbcdn\\.net$\n(?:^|\\.)fbsbx\\.com$\n(?:^|\\.)fbworkmail\\.com$\n(?:^|\\.)fc2\\.com$\n(?:^|\\.)fc2blog\\.net$\n(?:^|\\.)fc2china\\.com$\n(?:^|\\.)fc2cn\\.com$\n(?:^|\\.)fda\\.gov\\.tw$\n(?:^|\\.)fdc64\\.de$\n(?:^|\\.)fdc64\\.org$\n(?:^|\\.)fdc89\\.jp$\n(?:^|\\.)feedburner\\.com$\n(?:^|\\.)feeds\\.fileforum\\.com$\n(?:^|\\.)feelssh\\.com$\n(?:^|\\.)feer\\.com$\n(?:^|\\.)feifeiss\\.com$\n(?:^|\\.)feitian-california\\.org$\n(?:^|\\.)feitianacademy\\.org$\n(?:^|\\.)feministteacher\\.com$\n(?:^|\\.)fengzhenghu\\.com$\n(?:^|\\.)fengzhenghu\\.net$\n(?:^|\\.)fevernet\\.com$\n(?:^|\\.)ff\\.im$\n(?:^|\\.)fffff\\.at$\n(?:^|\\.)fflick\\.com$\n(?:^|\\.)ffvpn\\.com$\n(?:^|\\.)fgmtv\\.net$\n(?:^|\\.)fgmtv\\.org$\n(?:^|\\.)fhreports\\.net$\n(?:^|\\.)fiddle\\.jshell\\.net$\n(?:^|\\.)figprayer\\.com$\n(?:^|\\.)fileflyer\\.com$\n(?:^|\\.)files2me\\.com$\n(?:^|\\.)fileserve\\.com$\n(?:^|\\.)filesor\\.com$\n(?:^|\\.)fillthesquare\\.org$\n(?:^|\\.)filmingfortibet\\.org$\n(?:^|\\.)filmy\\.olabloga\\.pl$\n(?:^|\\.)filthdump\\.com$\n(?:^|\\.)financetwitter\\.com$\n(?:^|\\.)finchvpn\\.com$\n(?:^|\\.)findmespot\\.com$\n(?:^|\\.)findyoutube\\.com$\n(?:^|\\.)findyoutube\\.net$\n(?:^|\\.)fingerdaily\\.com$\n(?:^|\\.)finler\\.net$\n(?:^|\\.)firearmsworld\\.net$\n(?:^|\\.)firebaseio\\.com$\n(?:^|\\.)fireofliberty\\.org$\n(?:^|\\.)firetweet\\.io$\n(?:^|\\.)firstfivefollowers\\.com$\n(?:^|\\.)flagsonline\\.it$\n(?:^|\\.)flecheinthepeche\\.fr$\n(?:^|\\.)fleshbot\\.com$\n(?:^|\\.)fleursdeslettres\\.com$\n(?:^|\\.)flgg\\.us$\n(?:^|\\.)flgjustice\\.org$\n(?:^|\\.)flickr\\.com$\n(?:^|\\.)flickrhivemind\\.net$\n(?:^|\\.)flickriver\\.com$\n(?:^|\\.)fling\\.com$\n(?:^|\\.)flipboard\\.com$\n(?:^|\\.)flipkart\\.com$\n(?:^|\\.)flitto\\.com$\n(?:^|\\.)flnet\\.org$\n(?:^|\\.)flog\\.tw$\n(?:^|\\.)flyvpn\\.com$\n(?:^|\\.)flyzy2005\\.com$\n(?:^|\\.)fnac\\.be$\n(?:^|\\.)fnac\\.com$\n(?:^|\\.)fochk\\.org$\n(?:^|\\.)focustaiwan\\.tw$\n(?:^|\\.)focusvpn\\.com$\n(?:^|\\.)fofg-europe\\.net$\n(?:^|\\.)fofg\\.org$\n(?:^|\\.)fofldfradio\\.org$\n(?:^|\\.)fooooo\\.com$\n(?:^|\\.)footwiball\\.com$\n(?:^|\\.)foreignpolicy\\.com$\n(?:^|\\.)forum\\.baby-kingdom\\.com$\n(?:^|\\.)forum\\.cyberctm\\.com$\n(?:^|\\.)forum\\.idsam\\.com$\n(?:^|\\.)forum\\.my903\\.com$\n(?:^|\\.)forum\\.mymaji\\.com$\n(?:^|\\.)forum\\.omy\\.sg$\n(?:^|\\.)forum\\.palmislife\\.com$\n(?:^|\\.)forum\\.setty\\.com\\.tw$\n(?:^|\\.)forum\\.sina\\.com\\.hk$\n(?:^|\\.)forum\\.slime\\.com\\.tw$\n(?:^|\\.)forum\\.tvb\\.com$\n(?:^|\\.)forum\\.xinbao\\.de$\n(?:^|\\.)forum4hk\\.com$\n(?:^|\\.)fotile\\.me$\n(?:^|\\.)fourface\\.nodesnoop\\.com$\n(?:^|\\.)fourthinternational\\.org$\n(?:^|\\.)foxdie\\.us$\n(?:^|\\.)foxgay\\.com$\n(?:^|\\.)foxsub\\.com$\n(?:^|\\.)foxtang\\.com$\n(?:^|\\.)fpmt-osel\\.org$\n(?:^|\\.)fpmt\\.org$\n(?:^|\\.)fpmt\\.tw$\n(?:^|\\.)fpmtmexico\\.org$\n(?:^|\\.)fq\\.wikia\\.com$\n(?:^|\\.)fqok\\.org$\n(?:^|\\.)fqrouter\\.com$\n(?:^|\\.)franklc\\.com$\n(?:^|\\.)freakshare\\.com$\n(?:^|\\.)free-gate\\.org$\n(?:^|\\.)free-hada-now\\.org$\n(?:^|\\.)free-proxy\\.cz$\n(?:^|\\.)free-ss\\.site$\n(?:^|\\.)free-ssh\\.com$\n(?:^|\\.)free\\.fr$\n(?:^|\\.)free4u\\.com\\.ar$\n(?:^|\\.)freealim\\.com$\n(?:^|\\.)freebrowser\\.org$\n(?:^|\\.)freechal\\.com$\n(?:^|\\.)freechina\\.net$\n(?:^|\\.)freechina\\.news$\n(?:^|\\.)freechinaforum\\.org$\n(?:^|\\.)freechinaweibo\\.com$\n(?:^|\\.)freeddns\\.com$\n(?:^|\\.)freeddns\\.org$\n(?:^|\\.)freedomchina\\.info$\n(?:^|\\.)freedomcollection\\.org$\n(?:^|\\.)freedomhouse\\.org$\n(?:^|\\.)freedominfonetweb\\.wordpress\\.com$\n(?:^|\\.)freedomsherald\\.org$\n(?:^|\\.)freeforums\\.org$\n(?:^|\\.)freefq\\.com$\n(?:^|\\.)freefuckvids\\.com$\n(?:^|\\.)freegao\\.com$\n(?:^|\\.)freeilhamtohti\\.org$\n(?:^|\\.)freekwonpyong\\.org$\n(?:^|\\.)freelotto\\.com$\n(?:^|\\.)freeman2\\.com$\n(?:^|\\.)freemoren\\.com$\n(?:^|\\.)freemorenews\\.com$\n(?:^|\\.)freemuse\\.org$\n(?:^|\\.)freenet$\n(?:^|\\.)freenet-china\\.org$\n(?:^|\\.)freenetproject\\.org$\n(?:^|\\.)freenewscn\\.com$\n(?:^|\\.)freeopenvpn\\.com$\n(?:^|\\.)freeoz\\.org$\n(?:^|\\.)freessh\\.us$\n(?:^|\\.)freetcp\\.com$\n(?:^|\\.)freetibet\\.net$\n(?:^|\\.)freetibet\\.org$\n(?:^|\\.)freetibetanheroes\\.org$\n(?:^|\\.)freeviewmovies\\.com$\n(?:^|\\.)freevpn\\.me$\n(?:^|\\.)freevpn\\.nl$\n(?:^|\\.)freewallpaper4\\.me$\n(?:^|\\.)freewebs\\.com$\n(?:^|\\.)freewechat\\.com$\n(?:^|\\.)freeweibo\\.com$\n(?:^|\\.)freewww\\.biz$\n(?:^|\\.)freewww\\.info$\n(?:^|\\.)freexinwen\\.com$\n(?:^|\\.)freeyellow\\.com$\n(?:^|\\.)freeyoutubeproxy\\.net$\n(?:^|\\.)friendfeed-media\\.com$\n(?:^|\\.)friendfeed\\.com$\n(?:^|\\.)friends-of-tibet\\.org$\n(?:^|\\.)friendsoftibet\\.org$\n(?:^|\\.)fring\\.com$\n(?:^|\\.)fringenetwork\\.com$\n(?:^|\\.)from-pr\\.com$\n(?:^|\\.)from-sd\\.com$\n(?:^|\\.)fromchinatousa\\.net$\n(?:^|\\.)frommel\\.net$\n(?:^|\\.)frontlinedefenders\\.org$\n(?:^|\\.)frootvpn\\.com$\n(?:^|\\.)fscked\\.org$\n(?:^|\\.)fsurf\\.com$\n(?:^|\\.)ftchinese\\.com$\n(?:^|\\.)ftp1\\.biz$\n(?:^|\\.)ftpserver\\.biz$\n(?:^|\\.)ftv\\.com\\.tw$\n(?:^|\\.)fucd\\.com$\n(?:^|\\.)fuckcnnic\\.net$\n(?:^|\\.)fuckgfw\\.org$\n(?:^|\\.)fulione\\.com$\n(?:^|\\.)fullerconsideration\\.com$\n(?:^|\\.)fulue\\.com$\n(?:^|\\.)funf\\.tw$\n(?:^|\\.)funkyimg\\.com$\n(?:^|\\.)funp\\.com$\n(?:^|\\.)fuq\\.com$\n(?:^|\\.)furbo\\.org$\n(?:^|\\.)furhhdl\\.org$\n(?:^|\\.)furinkan\\.com$\n(?:^|\\.)furl\\.net$\n(?:^|\\.)futurechinaforum\\.org$\n(?:^|\\.)futuremessage\\.org$\n(?:^|\\.)fux\\.com$\n(?:^|\\.)fuyin\\.net$\n(?:^|\\.)fuyindiantai\\.org$\n(?:^|\\.)fuyu\\.org\\.tw$\n(?:^|\\.)fw\\.cm$\n(?:^|\\.)fxcm-chinese\\.com$\n(?:^|\\.)fxnetworks\\.com$\n(?:^|\\.)fzh999\\.com$\n(?:^|\\.)fzh999\\.net$\n(?:^|\\.)fzlm\\.com$\n(?:^|\\.)g-area\\.org$\n(?:^|\\.)g-queen\\.com$\n(?:^|\\.)g\\.co$\n(?:^|\\.)g0v\\.social$\n(?:^|\\.)g6hentai\\.com$\n(?:^|\\.)gabocorp\\.com$\n(?:^|\\.)gaeproxy\\.com$\n(?:^|\\.)gaforum\\.org$\n(?:^|\\.)galaxymacau\\.com$\n(?:^|\\.)galenwu\\.com$\n(?:^|\\.)galstars\\.net$\n(?:^|\\.)game735\\.com$\n(?:^|\\.)gamebase\\.com\\.tw$\n(?:^|\\.)gamejolt\\.com$\n(?:^|\\.)gamer-cds\\.cdn\\.hinet\\.net$\n(?:^|\\.)gamer\\.com\\.tw$\n(?:^|\\.)gamer2-cds\\.cdn\\.hinet\\.net$\n(?:^|\\.)gamez\\.com\\.tw$\n(?:^|\\.)gamousa\\.com$\n(?:^|\\.)ganges\\.com$\n(?:^|\\.)gaoming\\.net$\n(?:^|\\.)gaopi\\.net$\n(?:^|\\.)gaozhisheng\\.net$\n(?:^|\\.)gaozhisheng\\.org$\n(?:^|\\.)gardennetworks\\.com$\n(?:^|\\.)gardennetworks\\.org$\n(?:^|\\.)gartlive\\.com$\n(?:^|\\.)gate-project\\.com$\n(?:^|\\.)gate\\.io$\n(?:^|\\.)gatecoin\\.com$\n(?:^|\\.)gather\\.com$\n(?:^|\\.)gatherproxy\\.com$\n(?:^|\\.)gati\\.org\\.tw$\n(?:^|\\.)gaybubble\\.com$\n(?:^|\\.)gaycn\\.net$\n(?:^|\\.)gayhub\\.com$\n(?:^|\\.)gaymap\\.cc$\n(?:^|\\.)gaymenring\\.com$\n(?:^|\\.)gaytube\\.com$\n(?:^|\\.)gaywatch\\.com$\n(?:^|\\.)gazotube\\.com$\n(?:^|\\.)gcc\\.org\\.hk$\n(?:^|\\.)gclooney\\.com$\n(?:^|\\.)gcmasia\\.com$\n(?:^|\\.)gcpnews\\.com$\n(?:^|\\.)gcr\\.io$\n(?:^|\\.)gdbt\\.net$\n(?:^|\\.)gdzf\\.org$\n(?:^|\\.)geek-art\\.net$\n(?:^|\\.)geekerhome\\.com$\n(?:^|\\.)geekheart\\.info$\n(?:^|\\.)gekikame\\.com$\n(?:^|\\.)gelbooru\\.com$\n(?:^|\\.)geocities\\.co\\.jp$\n(?:^|\\.)geocities\\.com$\n(?:^|\\.)geocities\\.jp$\n(?:^|\\.)gerefoundation\\.org$\n(?:^|\\.)get\\.app$\n(?:^|\\.)get\\.dev$\n(?:^|\\.)get\\.how$\n(?:^|\\.)get\\.page$\n(?:^|\\.)getastrill\\.com$\n(?:^|\\.)getchu\\.com$\n(?:^|\\.)getcloak\\.com$\n(?:^|\\.)getfoxyproxy\\.org$\n(?:^|\\.)getfreedur\\.com$\n(?:^|\\.)getgom\\.com$\n(?:^|\\.)geti2p\\.net$\n(?:^|\\.)getiton\\.com$\n(?:^|\\.)getjetso\\.com$\n(?:^|\\.)getlantern\\.org$\n(?:^|\\.)getmdl\\.io$\n(?:^|\\.)getoutline\\.org$\n(?:^|\\.)getsocialscope\\.com$\n(?:^|\\.)getsync\\.com$\n(?:^|\\.)gettrials\\.com$\n(?:^|\\.)gettyimages\\.com$\n(?:^|\\.)getuploader\\.com$\n(?:^|\\.)gfbv\\.de$\n(?:^|\\.)gfgold\\.com\\.hk$\n(?:^|\\.)gfsale\\.com$\n(?:^|\\.)gfw\\.org\\.ua$\n(?:^|\\.)gfw\\.press$\n(?:^|\\.)ggpht\\.com$\n(?:^|\\.)ggssl\\.com$\n(?:^|\\.)ghostpath\\.com$\n(?:^|\\.)ghut\\.org$\n(?:^|\\.)giantessnight\\.com$\n(?:^|\\.)gifree\\.com$\n(?:^|\\.)giga-web\\.jp$\n(?:^|\\.)gigporno\\.ru$\n(?:^|\\.)girlbanker\\.com$\n(?:^|\\.)git\\.io$\n(?:^|\\.)github\\.com$\n(?:^|\\.)githubusercontent\\.com$\n(?:^|\\.)gizlen\\.net$\n(?:^|\\.)gjczz\\.com$\n(?:^|\\.)glass8\\.eu$\n(?:^|\\.)global\\.bing\\.com$\n(?:^|\\.)globaljihad\\.net$\n(?:^|\\.)globalmediaoutreach\\.com$\n(?:^|\\.)globalmuseumoncommunism\\.org$\n(?:^|\\.)globalrescue\\.net$\n(?:^|\\.)globaltm\\.org$\n(?:^|\\.)globalvoices\\.org$\n(?:^|\\.)globalvoicesonline\\.org$\n(?:^|\\.)globalvpn\\.net$\n(?:^|\\.)glock\\.com$\n(?:^|\\.)gloryhole\\.com$\n(?:^|\\.)glorystar\\.me$\n(?:^|\\.)gluckman\\.com$\n(?:^|\\.)glype\\.com$\n(?:^|\\.)gmail\\.com$\n(?:^|\\.)gmbd\\.cn$\n(?:^|\\.)gmhz\\.org$\n(?:^|\\.)gmll\\.org$\n(?:^|\\.)gmodules\\.com$\n(?:^|\\.)gmozomg\\.izihost\\.org$\n(?:^|\\.)gnci\\.org\\.hk$\n(?:^|\\.)go-pki\\.com$\n(?:^|\\.)go\\.nesnode\\.com$\n(?:^|\\.)go141\\.com$\n(?:^|\\.)goagent\\.biz$\n(?:^|\\.)goagent\\.codeplex\\.com$\n(?:^|\\.)goagentplus\\.com$\n(?:^|\\.)gobet\\.cc$\n(?:^|\\.)godfootsteps\\.org$\n(?:^|\\.)godns\\.work$\n(?:^|\\.)godoc\\.org$\n(?:^|\\.)godsdirectcontact\\.co\\.uk$\n(?:^|\\.)godsdirectcontact\\.org$\n(?:^|\\.)godsdirectcontact\\.org\\.tw$\n(?:^|\\.)godsimmediatecontact\\.com$\n(?:^|\\.)gogotunnel\\.com$\n(?:^|\\.)gohappy\\.com\\.tw$\n(?:^|\\.)gojet\\.krtco\\.com\\.tw$\n(?:^|\\.)gokbayrak\\.com$\n(?:^|\\.)golang\\.org$\n(?:^|\\.)goldbet\\.com$\n(?:^|\\.)goldbetsports\\.com$\n(?:^|\\.)goldeneyevault\\.com$\n(?:^|\\.)goldenfrog\\.com$\n(?:^|\\.)goldjizz\\.com$\n(?:^|\\.)goldstep\\.net$\n(?:^|\\.)goldwave\\.com$\n(?:^|\\.)gongm\\.in$\n(?:^|\\.)gongmeng\\.info$\n(?:^|\\.)gongminliliang\\.com$\n(?:^|\\.)gongwt\\.com$\n(?:^|\\.)goo\\.gl$\n(?:^|\\.)gooday\\.xyz$\n(?:^|\\.)gooddns\\.info$\n(?:^|\\.)goodreaders\\.com$\n(?:^|\\.)goodreads\\.com$\n(?:^|\\.)goodtv\\.com\\.tw$\n(?:^|\\.)goodtv\\.tv$\n(?:^|\\.)goofind\\.com$\n(?:^|\\.)google(\\.[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?){1,2}$\n(?:^|\\.)googleapis(\\.[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?){1,2}$\n(?:^|\\.)googleapps\\.com$\n(?:^|\\.)googlearth\\.com$\n(?:^|\\.)googleartproject\\.com$\n(?:^|\\.)googleblog\\.com$\n(?:^|\\.)googlebot\\.com$\n(?:^|\\.)googlechinawebmaster\\.com$\n(?:^|\\.)googlecode\\.com$\n(?:^|\\.)googlecommerce\\.com$\n(?:^|\\.)googledomains\\.com$\n(?:^|\\.)googledrive\\.com$\n(?:^|\\.)googleearth\\.com$\n(?:^|\\.)googlegroups\\.com$\n(?:^|\\.)googlehosted\\.com$\n(?:^|\\.)googleideas\\.com$\n(?:^|\\.)googleinsidesearch\\.com$\n(?:^|\\.)googlelabs\\.com$\n(?:^|\\.)googlemail\\.com$\n(?:^|\\.)googlemashups\\.com$\n(?:^|\\.)googlepagecreator\\.com$\n(?:^|\\.)googleplay\\.com$\n(?:^|\\.)googleplus\\.com$\n(?:^|\\.)googlescholar\\.com$\n(?:^|\\.)googlesile\\.com$\n(?:^|\\.)googlesource\\.com$\n(?:^|\\.)googleusercontent\\.com$\n(?:^|\\.)googlevideo\\.com$\n(?:^|\\.)googleweblight\\.com$\n(?:^|\\.)googlezip\\.net$\n(?:^|\\.)gopetition\\.com$\n(?:^|\\.)goproxing\\.net$\n(?:^|\\.)goregrish\\.com$\n(?:^|\\.)gospelherald\\.com$\n(?:^|\\.)got-game\\.org$\n(?:^|\\.)gotdns\\.ch$\n(?:^|\\.)gotgeeks\\.com$\n(?:^|\\.)gotrusted\\.com$\n(?:^|\\.)gotw\\.ca$\n(?:^|\\.)gov\\.taipei$\n(?:^|\\.)gov\\.tw$\n(?:^|\\.)gr8domain\\.biz$\n(?:^|\\.)gr8name\\.biz$\n(?:^|\\.)grammaly\\.com$\n(?:^|\\.)grandtrial\\.org$\n(?:^|\\.)grangorz\\.org$\n(?:^|\\.)graphis\\.ne\\.jp$\n(?:^|\\.)graphql\\.org$\n(?:^|\\.)greasespot\\.net$\n(?:^|\\.)great-firewall\\.com$\n(?:^|\\.)great-roc\\.org$\n(?:^|\\.)greatfire\\.org$\n(?:^|\\.)greatfire\\.us7\\.list-manage\\.com$\n(?:^|\\.)greatfirewall\\.biz$\n(?:^|\\.)greatfirewallofchina\\.net$\n(?:^|\\.)greatfirewallofchina\\.org$\n(?:^|\\.)greatroc\\.org$\n(?:^|\\.)greatroc\\.tw$\n(?:^|\\.)greatzhonghua\\.org$\n(?:^|\\.)greenfieldbookstore\\.com\\.hk$\n(?:^|\\.)greenparty\\.org\\.tw$\n(?:^|\\.)greenpeace\\.com\\.tw$\n(?:^|\\.)greenpeace\\.org$\n(?:^|\\.)greenreadings\\.com$\n(?:^|\\.)greenvpn\\.net$\n(?:^|\\.)greenvpn\\.org$\n(?:^|\\.)grotty-monday\\.com$\n(?:^|\\.)groups\\.google\\.cn$\n(?:^|\\.)grow\\.google$\n(?:^|\\.)gs-discuss\\.com$\n(?:^|\\.)gsp\\.target\\.com$\n(?:^|\\.)gstatic\\.com$\n(?:^|\\.)gtricks\\.com$\n(?:^|\\.)gts-vpn\\.com$\n(?:^|\\.)gu-chu-sum\\.org$\n(?:^|\\.)guaguass\\.com$\n(?:^|\\.)guaguass\\.org$\n(?:^|\\.)guancha\\.org$\n(?:^|\\.)guaneryu\\.com$\n(?:^|\\.)guangming\\.com\\.my$\n(?:^|\\.)guardster\\.com$\n(?:^|\\.)guishan\\.org$\n(?:^|\\.)gumroad\\.com$\n(?:^|\\.)gun-world\\.net$\n(?:^|\\.)gunsamerica\\.com$\n(?:^|\\.)gunsandammo\\.com$\n(?:^|\\.)guo\\.media$\n(?:^|\\.)guruonline\\.hk$\n(?:^|\\.)gutteruncensored\\.com$\n(?:^|\\.)gvlib\\.com$\n(?:^|\\.)gvm\\.com\\.tw$\n(?:^|\\.)gvt0\\.com$\n(?:^|\\.)gvt1\\.com$\n(?:^|\\.)gvt3\\.com$\n(?:^|\\.)gwtproject\\.org$\n(?:^|\\.)gyalwarinpoche\\.com$\n(?:^|\\.)gyatsostudio\\.com$\n(?:^|\\.)gzm\\.tv$\n(?:^|\\.)gzone-anime\\.info$\n(?:^|\\.)h-china\\.org$\n(?:^|\\.)h-moe\\.com$\n(?:^|\\.)h1n1china\\.org$\n(?:^|\\.)h528\\.com$\n(?:^|\\.)h5dm\\.com$\n(?:^|\\.)h5galgame\\.me$\n(?:^|\\.)hacg\\.club$\n(?:^|\\.)hacg\\.in$\n(?:^|\\.)hacg\\.li$\n(?:^|\\.)hacg\\.me$\n(?:^|\\.)hacg\\.red$\n(?:^|\\.)hacken\\.cc$\n(?:^|\\.)hacker\\.org$\n(?:^|\\.)hackthatphone\\.net$\n(?:^|\\.)hahaxixi\\.github\\.io$\n(?:^|\\.)hahlo\\.com$\n(?:^|\\.)hakkatv\\.org\\.tw$\n(?:^|\\.)handcraftedsoftware\\.org$\n(?:^|\\.)hanunyi\\.com$\n(?:^|\\.)hao\\.news$\n(?:^|\\.)haoel\\.github\\.io$\n(?:^|\\.)happy-vpn\\.com$\n(?:^|\\.)haproxy\\.org$\n(?:^|\\.)hardsextube\\.com$\n(?:^|\\.)harunyahya\\.com$\n(?:^|\\.)hautelook\\.com$\n(?:^|\\.)hautelookcdn\\.com$\n(?:^|\\.)have8\\.com$\n(?:^|\\.)hbg\\.com$\n(?:^|\\.)hbo\\.com$\n(?:^|\\.)hclips\\.com$\n(?:^|\\.)hd\\.stheadline\\.com$\n(?:^|\\.)hdlt\\.me$\n(?:^|\\.)hdtvb\\.net$\n(?:^|\\.)hdzog\\.com$\n(?:^|\\.)heartyit\\.com$\n(?:^|\\.)heavy-r\\.com$\n(?:^|\\.)hec\\.su$\n(?:^|\\.)hecaitou\\.net$\n(?:^|\\.)hechaji\\.com$\n(?:^|\\.)heeact\\.edu\\.tw$\n(?:^|\\.)hegre-art\\.com$\n(?:^|\\.)heix\\.pp\\.ru$\n(?:^|\\.)helloandroid\\.com$\n(?:^|\\.)helloqueer\\.com$\n(?:^|\\.)helloss\\.pw$\n(?:^|\\.)hellotxt\\.com$\n(?:^|\\.)hellouk\\.org$\n(?:^|\\.)help\\.linksalpha\\.com$\n(?:^|\\.)helpeachpeople\\.com$\n(?:^|\\.)helplinfen\\.com$\n(?:^|\\.)helpster\\.de$\n(?:^|\\.)helpzhuling\\.org$\n(?:^|\\.)hentai\\.to$\n(?:^|\\.)hentaitube\\.tv$\n(?:^|\\.)hentaivideoworld\\.com$\n(?:^|\\.)heqinglian\\.net$\n(?:^|\\.)heungkongdiscuss\\.com$\n(?:^|\\.)hexieshe\\.com$\n(?:^|\\.)hexieshe\\.xyz$\n(?:^|\\.)hexxeh\\.net$\n(?:^|\\.)heyzo\\.com$\n(?:^|\\.)hgseav\\.com$\n(?:^|\\.)hhdcb3office\\.org$\n(?:^|\\.)hhthesakyatrizin\\.org$\n(?:^|\\.)hi-on\\.org\\.tw$\n(?:^|\\.)hidden-advent\\.org$\n(?:^|\\.)hide\\.me$\n(?:^|\\.)hidecloud\\.com$\n(?:^|\\.)hidein\\.net$\n(?:^|\\.)hideipvpn\\.com$\n(?:^|\\.)hideman\\.net$\n(?:^|\\.)hideme\\.nl$\n(?:^|\\.)hidemy\\.name$\n(?:^|\\.)hidemyass\\.com$\n(?:^|\\.)hidemycomp\\.com$\n(?:^|\\.)higfw\\.com$\n(?:^|\\.)highpeakspureearth\\.com$\n(?:^|\\.)highrockmedia\\.com$\n(?:^|\\.)hihiforum\\.com$\n(?:^|\\.)hihistory\\.net$\n(?:^|\\.)hiitch\\.com$\n(?:^|\\.)hikinggfw\\.org$\n(?:^|\\.)hilive\\.tv$\n(?:^|\\.)himalayan-foundation\\.org$\n(?:^|\\.)himalayanglacier\\.com$\n(?:^|\\.)himemix\\.com$\n(?:^|\\.)himemix\\.net$\n(?:^|\\.)hitbtc\\.com$\n(?:^|\\.)hitomi\\.la$\n(?:^|\\.)hiwifi\\.com$\n(?:^|\\.)hizb-ut-tahrir\\.info$\n(?:^|\\.)hizb-ut-tahrir\\.org$\n(?:^|\\.)hizbuttahrir\\.org$\n(?:^|\\.)hjclub\\.info$\n(?:^|\\.)hk-pub\\.com$\n(?:^|\\.)hk\\.frienddy\\.com$\n(?:^|\\.)hk\\.geocities\\.com$\n(?:^|\\.)hk\\.gradconnection\\.com$\n(?:^|\\.)hk\\.hao123img\\.com$\n(?:^|\\.)hk\\.jiepang\\.com$\n(?:^|\\.)hk\\.knowledge\\.yahoo\\.com$\n(?:^|\\.)hk\\.myblog\\.yahoo\\.com$\n(?:^|\\.)hk\\.news\\.yahoo\\.com$\n(?:^|\\.)hk\\.rd\\.yahoo\\.com$\n(?:^|\\.)hk\\.search\\.yahoo\\.com$\n(?:^|\\.)hk\\.video\\.news\\.yahoo\\.com$\n(?:^|\\.)hk\\.yahoo\\.com$\n(?:^|\\.)hk01\\.com$\n(?:^|\\.)hk32168\\.com$\n(?:^|\\.)hka8964\\.wordpress\\.com$\n(?:^|\\.)hkacg\\.com$\n(?:^|\\.)hkacg\\.net$\n(?:^|\\.)hkanews\\.wordpress\\.com$\n(?:^|\\.)hkatvnews\\.com$\n(?:^|\\.)hkbc\\.net$\n(?:^|\\.)hkbf\\.org$\n(?:^|\\.)hkbookcity\\.com$\n(?:^|\\.)hkchurch\\.org$\n(?:^|\\.)hkci\\.org\\.hk$\n(?:^|\\.)hkcmi\\.edu$\n(?:^|\\.)hkcnews\\.com$\n(?:^|\\.)hkcoc\\.com$\n(?:^|\\.)hkcoc\\.weather\\.com\\.hk$\n(?:^|\\.)hkdailynews\\.com\\.hk$\n(?:^|\\.)hkday\\.net$\n(?:^|\\.)hkdf\\.org$\n(?:^|\\.)hkej\\.com$\n(?:^|\\.)hkepc\\.com$\n(?:^|\\.)hkfaa\\.com$\n(?:^|\\.)hkfreezone\\.com$\n(?:^|\\.)hkfront\\.org$\n(?:^|\\.)hkgalden\\.com$\n(?:^|\\.)hkgolden\\.com$\n(?:^|\\.)hkgreenradio\\.org$\n(?:^|\\.)hkheadline\\.com$\n(?:^|\\.)hkhkhk\\.com$\n(?:^|\\.)hkhrc\\.org\\.hk$\n(?:^|\\.)hkhrm\\.org\\.hk$\n(?:^|\\.)hkip\\.org\\.uk$\n(?:^|\\.)hkjc\\.com$\n(?:^|\\.)hkjp\\.org$\n(?:^|\\.)hklft\\.com$\n(?:^|\\.)hklts\\.org\\.hk$\n(?:^|\\.)hkptu\\.org$\n(?:^|\\.)hkreporter\\.com$\n(?:^|\\.)hkreporter\\.loved\\.hk$\n(?:^|\\.)hkupop\\.hku\\.hk$\n(?:^|\\.)hkusu\\.net$\n(?:^|\\.)hkvwet\\.com$\n(?:^|\\.)hkwcc\\.org\\.hk$\n(?:^|\\.)hkzone\\.org$\n(?:^|\\.)hmonghot\\.com$\n(?:^|\\.)hmv\\.co\\.jp$\n(?:^|\\.)hmvdigital\\.ca$\n(?:^|\\.)hmvdigital\\.com$\n(?:^|\\.)hnjhj\\.com$\n(?:^|\\.)hnntube\\.com$\n(?:^|\\.)hola\\.com$\n(?:^|\\.)hola\\.org$\n(?:^|\\.)holymountaincn\\.com$\n(?:^|\\.)holyspiritspeaks\\.org$\n(?:^|\\.)home\\.sina\\.com$\n(?:^|\\.)home\\.so-net\\.net\\.tw$\n(?:^|\\.)homedepot\\.com$\n(?:^|\\.)homeperversion\\.com$\n(?:^|\\.)homeservershow\\.com$\n(?:^|\\.)hongkongfp\\.com$\n(?:^|\\.)hongmeimei\\.com$\n(?:^|\\.)hongzhi\\.li$\n(?:^|\\.)hootsuite\\.com$\n(?:^|\\.)hoovers\\.com$\n(?:^|\\.)hopedialogue\\.org$\n(?:^|\\.)hopto\\.org$\n(?:^|\\.)hornygamer\\.com$\n(?:^|\\.)hornytrip\\.com$\n(?:^|\\.)hotav\\.tv$\n(?:^|\\.)hotels\\.cn$\n(?:^|\\.)hotfrog\\.com\\.tw$\n(?:^|\\.)hotgoo\\.com$\n(?:^|\\.)hotpornshow\\.com$\n(?:^|\\.)hotpot\\.hk$\n(?:^|\\.)hotshame\\.com$\n(?:^|\\.)hotspotshield\\.com$\n(?:^|\\.)hotvpn\\.com$\n(?:^|\\.)hougaige\\.com$\n(?:^|\\.)howtoforge\\.com$\n(?:^|\\.)hoxx\\.com$\n(?:^|\\.)hpa\\.gov\\.tw$\n(?:^|\\.)hqcdp\\.org$\n(?:^|\\.)hqjapanesesex\\.com$\n(?:^|\\.)hqmovies\\.com$\n(?:^|\\.)hqsbnet\\.wordpress\\.com$\n(?:^|\\.)hqsbonline\\.wordpress\\.com$\n(?:^|\\.)hrcchina\\.org$\n(?:^|\\.)hrcir\\.com$\n(?:^|\\.)hrea\\.org$\n(?:^|\\.)hrichina\\.org$\n(?:^|\\.)hrtsea\\.com$\n(?:^|\\.)hrw\\.org$\n(?:^|\\.)hrweb\\.org$\n(?:^|\\.)hsjp\\.net$\n(?:^|\\.)hsselite\\.com$\n(?:^|\\.)hst\\.net\\.tw$\n(?:^|\\.)hstern\\.net$\n(?:^|\\.)hstt\\.net$\n(?:^|\\.)ht\\.ly$\n(?:^|\\.)htkou\\.net$\n(?:^|\\.)htl\\.li$\n(?:^|\\.)html5rocks\\.com$\n(?:^|\\.)https$\n(?:^|\\.)https443\\.net$\n(?:^|\\.)https443\\.org$\n(?:^|\\.)hua-yue\\.net$\n(?:^|\\.)huaglad\\.com$\n(?:^|\\.)huanghuagang\\.org$\n(?:^|\\.)huangyiyu\\.com$\n(?:^|\\.)huaren\\.us$\n(?:^|\\.)huaren4us\\.com$\n(?:^|\\.)huashangnews\\.com$\n(?:^|\\.)huaxia-news\\.com$\n(?:^|\\.)huaxiabao\\.org$\n(?:^|\\.)huaxin\\.ph$\n(?:^|\\.)huayuworld\\.org$\n(?:^|\\.)hudatoriq\\.web\\.id$\n(?:^|\\.)hudson\\.org$\n(?:^|\\.)huffingtonpost\\.com$\n(?:^|\\.)hugoroy\\.eu$\n(?:^|\\.)huhaitai\\.com$\n(?:^|\\.)huhamhire\\.com$\n(?:^|\\.)huiyi\\.in$\n(?:^|\\.)hulkshare\\.com$\n(?:^|\\.)hulu\\.com$\n(?:^|\\.)huluim\\.com$\n(?:^|\\.)hum$\n(?:^|\\.)humanrightsbriefing\\.org$\n(?:^|\\.)hung-ya\\.com$\n(?:^|\\.)hungerstrikeforaids\\.org$\n(?:^|\\.)huobi\\.com$\n(?:^|\\.)huobi\\.pro$\n(?:^|\\.)huobipro\\.com$\n(?:^|\\.)huping\\.net$\n(?:^|\\.)hurgokbayrak\\.com$\n(?:^|\\.)hurriyet\\.com\\.tr$\n(?:^|\\.)hustlercash\\.com$\n(?:^|\\.)hut2\\.ru$\n(?:^|\\.)hutianyi\\.net$\n(?:^|\\.)hutong9\\.net$\n(?:^|\\.)huyandex\\.com$\n(?:^|\\.)hwadzan\\.tw$\n(?:^|\\.)hwayue\\.org\\.tw$\n(?:^|\\.)hwinfo\\.com$\n(?:^|\\.)hxwk\\.org$\n(?:^|\\.)hxwq\\.org$\n(?:^|\\.)hybrid-analysis\\.com$\n(?:^|\\.)hyperrate\\.com$\n(?:^|\\.)i-cable\\.com$\n(?:^|\\.)i-part\\.com\\.tw$\n(?:^|\\.)i\\.lithium\\.com$\n(?:^|\\.)i1\\.hk$\n(?:^|\\.)i2p2\\.de$\n(?:^|\\.)i2runner\\.com$\n(?:^|\\.)i818hk\\.com$\n(?:^|\\.)iam\\.soy$\n(?:^|\\.)iamtopone\\.com$\n(?:^|\\.)iask\\.bz$\n(?:^|\\.)iask\\.ca$\n(?:^|\\.)iav19\\.com$\n(?:^|\\.)ibiblio\\.org$\n(?:^|\\.)iblist\\.com$\n(?:^|\\.)iblogserv-f\\.net$\n(?:^|\\.)ibros\\.org$\n(?:^|\\.)ibvpn\\.com$\n(?:^|\\.)icams\\.com$\n(?:^|\\.)ice\\.audionow\\.com$\n(?:^|\\.)icij\\.org$\n(?:^|\\.)icl-fi\\.org$\n(?:^|\\.)icoco\\.com$\n(?:^|\\.)iconpaper\\.org$\n(?:^|\\.)icu-project\\.org$\n(?:^|\\.)id\\.hao123\\.com$\n(?:^|\\.)id\\.heroku\\.com$\n(?:^|\\.)iddddg\\.com$\n(?:^|\\.)idemocracy\\.asia$\n(?:^|\\.)identi\\.ca$\n(?:^|\\.)idiomconnection\\.com$\n(?:^|\\.)idouga\\.com$\n(?:^|\\.)idreamx\\.com$\n(?:^|\\.)idv\\.tw$\n(?:^|\\.)ieasy5\\.com$\n(?:^|\\.)ied2k\\.net$\n(?:^|\\.)ienergy1\\.com$\n(?:^|\\.)if\\.ttt$\n(?:^|\\.)ifan\\.cz\\.cc$\n(?:^|\\.)ifanqiang\\.com$\n(?:^|\\.)ifcss\\.org$\n(?:^|\\.)ifjc\\.org$\n(?:^|\\.)ifreewares\\.com$\n(?:^|\\.)ift\\.tt$\n(?:^|\\.)igcd\\.net$\n(?:^|\\.)igfw\\.net$\n(?:^|\\.)igfw\\.tech$\n(?:^|\\.)igmg\\.de$\n(?:^|\\.)ignitedetroit\\.net$\n(?:^|\\.)igoogle\\.com$\n(?:^|\\.)igotmail\\.com\\.tw$\n(?:^|\\.)igvita\\.com$\n(?:^|\\.)ihakka\\.net$\n(?:^|\\.)ihao\\.org$\n(?:^|\\.)iicns\\.com$\n(?:^|\\.)iipdigital\\.usembassy\\.gov$\n(?:^|\\.)ikstar\\.com$\n(?:^|\\.)ikwb\\.com$\n(?:^|\\.)illusionfactory\\.com$\n(?:^|\\.)ilove80\\.be$\n(?:^|\\.)ilovelongtoes\\.com$\n(?:^|\\.)im\\.tv$\n(?:^|\\.)im88\\.tw$\n(?:^|\\.)imageab\\.com$\n(?:^|\\.)imagefap\\.com$\n(?:^|\\.)imageflea\\.com$\n(?:^|\\.)images-gaytube\\.com$\n(?:^|\\.)images\\.comico\\.tw$\n(?:^|\\.)imageshack\\.us$\n(?:^|\\.)imagevenue\\.com$\n(?:^|\\.)imagezilla\\.net$\n(?:^|\\.)imb\\.org$\n(?:^|\\.)imdb\\.com$\n(?:^|\\.)img$\n(?:^|\\.)img\\.dlsite\\.jp$\n(?:^|\\.)img\\.ly$\n(?:^|\\.)imgchili\\.net$\n(?:^|\\.)imgmega\\.com$\n(?:^|\\.)imgur\\.com$\n(?:^|\\.)imkev\\.com$\n(?:^|\\.)imlive\\.com$\n(?:^|\\.)immigration\\.gov\\.tw$\n(?:^|\\.)immoral\\.jp$\n(?:^|\\.)impact\\.org\\.au$\n(?:^|\\.)impp\\.mn$\n(?:^|\\.)in-disguise\\.com$\n(?:^|\\.)in99\\.org$\n(?:^|\\.)incapdns\\.net$\n(?:^|\\.)incloak\\.com$\n(?:^|\\.)incredibox\\.fr$\n(?:^|\\.)indiandefensenews\\.in$\n(?:^|\\.)indiemerch\\.com$\n(?:^|\\.)info-graf\\.fr$\n(?:^|\\.)initiativesforchina\\.org$\n(?:^|\\.)inkui\\.com$\n(?:^|\\.)inmediahk\\.net$\n(?:^|\\.)innermongolia\\.org$\n(?:^|\\.)inote\\.tw$\n(?:^|\\.)insecam\\.org$\n(?:^|\\.)insidevoa\\.com$\n(?:^|\\.)instagram\\.com$\n(?:^|\\.)instanthq\\.com$\n(?:^|\\.)institut-tibetain\\.org$\n(?:^|\\.)international-news\\.newsmagazine\\.asia$\n(?:^|\\.)internet\\.org$\n(?:^|\\.)internetdefenseleague\\.org$\n(?:^|\\.)internetfreedom\\.org$\n(?:^|\\.)internetpopculture\\.com$\n(?:^|\\.)inthenameofconfuciusmovie\\.com$\n(?:^|\\.)investigating\\.wordpress\\.com$\n(?:^|\\.)inxian\\.com$\n(?:^|\\.)iownyour\\.biz$\n(?:^|\\.)iownyour\\.org$\n(?:^|\\.)ipalter\\.com$\n(?:^|\\.)ipfire\\.org$\n(?:^|\\.)ipfs\\.io$\n(?:^|\\.)iphone4hongkong\\.com$\n(?:^|\\.)iphonehacks\\.com$\n(?:^|\\.)iphonetaiwan\\.org$\n(?:^|\\.)iphonix\\.fr$\n(?:^|\\.)ipicture\\.ru$\n(?:^|\\.)ipjetable\\.net$\n(?:^|\\.)ipobar\\.com$\n(?:^|\\.)ipoock\\.com$\n(?:^|\\.)iportal\\.me$\n(?:^|\\.)ippotv\\.com$\n(?:^|\\.)ipredator\\.se$\n(?:^|\\.)iptv\\.com\\.tw$\n(?:^|\\.)iptvbin\\.com$\n(?:^|\\.)ipvanish\\.com$\n(?:^|\\.)iredmail\\.org$\n(?:^|\\.)ironbigfools\\.compython\\.net$\n(?:^|\\.)ironpython\\.net$\n(?:^|\\.)ironsocket\\.com$\n(?:^|\\.)is-a-hunter\\.com$\n(?:^|\\.)is\\.gd$\n(?:^|\\.)isaacmao\\.com$\n(?:^|\\.)isasecret\\.com$\n(?:^|\\.)isc\\.sans\\.edu$\n(?:^|\\.)isgreat\\.org$\n(?:^|\\.)islahhaber\\.net$\n(?:^|\\.)islam\\.org\\.hk$\n(?:^|\\.)islamawareness\\.net$\n(?:^|\\.)islamhouse\\.com$\n(?:^|\\.)islamicity\\.com$\n(?:^|\\.)islamicpluralism\\.org$\n(?:^|\\.)islamtoday\\.net$\n(?:^|\\.)ismaelan\\.com$\n(?:^|\\.)ismalltits\\.com$\n(?:^|\\.)ismprofessional\\.net$\n(?:^|\\.)isohunt\\.com$\n(?:^|\\.)israbox\\.com$\n(?:^|\\.)issuu\\.com$\n(?:^|\\.)istars\\.co\\.nz$\n(?:^|\\.)istiqlalhewer\\.com$\n(?:^|\\.)istockphoto\\.com$\n(?:^|\\.)isunaffairs\\.com$\n(?:^|\\.)isuntv\\.com$\n(?:^|\\.)itaboo\\.info$\n(?:^|\\.)itaiwan\\.gov\\.tw$\n(?:^|\\.)italiatibet\\.org$\n(?:^|\\.)itasoftware\\.com$\n(?:^|\\.)itemdb\\.com$\n(?:^|\\.)ithelp\\.ithome\\.com\\.tw$\n(?:^|\\.)its\\.caltech\\.edu$\n(?:^|\\.)itsaol\\.com$\n(?:^|\\.)itshidden\\.com$\n(?:^|\\.)itsky\\.it$\n(?:^|\\.)itweet\\.net$\n(?:^|\\.)iu45\\.com$\n(?:^|\\.)iuhrdf\\.org$\n(?:^|\\.)iuksky\\.com$\n(?:^|\\.)ivacy\\.com$\n(?:^|\\.)iverycd\\.com$\n(?:^|\\.)ivpn\\.net$\n(?:^|\\.)ixquick\\.com$\n(?:^|\\.)ixxx\\.com$\n(?:^|\\.)iyouport\\.com$\n(?:^|\\.)izaobao\\.us$\n(?:^|\\.)izles\\.net$\n(?:^|\\.)izlesem\\.org$\n(?:^|\\.)j\\.mp$\n(?:^|\\.)ja\\.wikipedia\\.org$\n(?:^|\\.)jamaat\\.org$\n(?:^|\\.)jamyangnorbu\\.com$\n(?:^|\\.)jandyx\\.com$\n(?:^|\\.)janwongphoto\\.com$\n(?:^|\\.)japan-whores\\.com$\n(?:^|\\.)japanfirst\\.asianfreeforum\\.com$\n(?:^|\\.)japantimes\\.co\\.jp$\n(?:^|\\.)jav\\.com$\n(?:^|\\.)jav101\\.com$\n(?:^|\\.)jav2be\\.com$\n(?:^|\\.)jav68\\.tv$\n(?:^|\\.)javakiba\\.org$\n(?:^|\\.)javbus\\.com$\n(?:^|\\.)javfor\\.me$\n(?:^|\\.)javhd\\.com$\n(?:^|\\.)javhip\\.com$\n(?:^|\\.)javhub\\.net$\n(?:^|\\.)javhuge\\.com$\n(?:^|\\.)javlibrary\\.com$\n(?:^|\\.)javmobile\\.net$\n(?:^|\\.)javmoo\\.com$\n(?:^|\\.)javmoo\\.xyz$\n(?:^|\\.)javseen\\.com$\n(?:^|\\.)javtag\\.com$\n(?:^|\\.)javzoo\\.com$\n(?:^|\\.)jbtalks\\.cc$\n(?:^|\\.)jbtalks\\.com$\n(?:^|\\.)jbtalks\\.my$\n(?:^|\\.)jcpenney\\.com$\n(?:^|\\.)jdwsy\\.com$\n(?:^|\\.)jeanyim\\.com$\n(?:^|\\.)jetos\\.com$\n(?:^|\\.)jex\\.com$\n(?:^|\\.)jfqu36\\.club$\n(?:^|\\.)jfqu37\\.xyz$\n(?:^|\\.)jgoodies\\.com$\n(?:^|\\.)jiangweiping\\.com$\n(?:^|\\.)jiaoyou8\\.com$\n(?:^|\\.)jiehua\\.cz$\n(?:^|\\.)jieshibaobao\\.com$\n(?:^|\\.)jigglegifs\\.com$\n(?:^|\\.)jigong1024\\.com$\n(?:^|\\.)jihadintel\\.meforum\\.org$\n(?:^|\\.)jihadology\\.net$\n(?:^|\\.)jiji\\.com$\n(?:^|\\.)jims\\.net$\n(?:^|\\.)jinbushe\\.org$\n(?:^|\\.)jingpin\\.org$\n(?:^|\\.)jingsim\\.org$\n(?:^|\\.)jinpianwang\\.com$\n(?:^|\\.)jinroukong\\.com$\n(?:^|\\.)jintian\\.net$\n(?:^|\\.)jinx\\.com$\n(?:^|\\.)jitouch\\.com$\n(?:^|\\.)jizzthis\\.com$\n(?:^|\\.)jjgirls\\.com$\n(?:^|\\.)jkb\\.cc$\n(?:^|\\.)jkforum\\.net$\n(?:^|\\.)jkub\\.com$\n(?:^|\\.)jma\\.go\\.jp$\n(?:^|\\.)jmscult\\.com$\n(?:^|\\.)joachims\\.org$\n(?:^|\\.)jobnewera\\.wordpress\\.com$\n(?:^|\\.)jobso\\.tv$\n(?:^|\\.)joinmastodon\\.org$\n(?:^|\\.)journalchretien\\.net$\n(?:^|\\.)journalofdemocracy\\.org$\n(?:^|\\.)joymiihub\\.com$\n(?:^|\\.)joyourself\\.com$\n(?:^|\\.)jp\\.hao123\\.com$\n(?:^|\\.)jpl\\.nasa\\.gov$\n(?:^|\\.)jpopforum\\.net$\n(?:^|\\.)jtvnw\\.net$\n(?:^|\\.)jubushoushen\\.com$\n(?:^|\\.)juhuaren\\.com$\n(?:^|\\.)jukujo-club\\.com$\n(?:^|\\.)juliepost\\.com$\n(?:^|\\.)juliereyc\\.com$\n(?:^|\\.)junauza\\.com$\n(?:^|\\.)june4commemoration\\.org$\n(?:^|\\.)junefourth-20\\.net$\n(?:^|\\.)jungleheart\\.com$\n(?:^|\\.)juoaa\\.com$\n(?:^|\\.)justdied\\.com$\n(?:^|\\.)justfreevpn\\.com$\n(?:^|\\.)justicefortenzin\\.org$\n(?:^|\\.)justpaste\\.it$\n(?:^|\\.)justtristan\\.com$\n(?:^|\\.)juyuange\\.org$\n(?:^|\\.)juziyue\\.com$\n(?:^|\\.)jwmusic\\.org$\n(?:^|\\.)jyxf\\.net$\n(?:^|\\.)k-doujin\\.net$\n(?:^|\\.)ka-wai\\.com$\n(?:^|\\.)kagyu\\.org$\n(?:^|\\.)kagyu\\.org\\.za$\n(?:^|\\.)kagyumonlam\\.org$\n(?:^|\\.)kagyunews\\.com\\.hk$\n(?:^|\\.)kagyuoffice\\.org$\n(?:^|\\.)kagyuoffice\\.org\\.tw$\n(?:^|\\.)kaiyuan\\.de$\n(?:^|\\.)kakao\\.com$\n(?:^|\\.)kalachakralugano\\.org$\n(?:^|\\.)kankan\\.today$\n(?:^|\\.)kannewyork\\.com$\n(?:^|\\.)kanshifang\\.com$\n(?:^|\\.)kantie\\.org$\n(?:^|\\.)kanzhongguo\\.com$\n(?:^|\\.)kanzhongguo\\.eu$\n(?:^|\\.)kaotic\\.com$\n(?:^|\\.)karayou\\.com$\n(?:^|\\.)karkhung\\.com$\n(?:^|\\.)karmapa-teachings\\.org$\n(?:^|\\.)karmapa\\.org$\n(?:^|\\.)kawaiikawaii\\.jp$\n(?:^|\\.)kawase\\.com$\n(?:^|\\.)kb\\.monitorware\\.com$\n(?:^|\\.)kba-tx\\.org$\n(?:^|\\.)kcoolonline\\.com$\n(?:^|\\.)kebrum\\.com$\n(?:^|\\.)kechara\\.com$\n(?:^|\\.)keepandshare\\.com$\n(?:^|\\.)keezmovies\\.com$\n(?:^|\\.)kendatire\\.com$\n(?:^|\\.)kendincos\\.net$\n(?:^|\\.)kenengba\\.com$\n(?:^|\\.)keontech\\.net$\n(?:^|\\.)kepard\\.com$\n(?:^|\\.)kex\\.com$\n(?:^|\\.)keycdn\\.com$\n(?:^|\\.)khabdha\\.org$\n(?:^|\\.)khatrimaza\\.org$\n(?:^|\\.)khmusic\\.com\\.tw$\n(?:^|\\.)kichiku-doujinko\\.com$\n(?:^|\\.)kik\\.com$\n(?:^|\\.)killwall\\.com$\n(?:^|\\.)kindleren\\.com$\n(?:^|\\.)kineox\\.free\\.fr$\n(?:^|\\.)kingdomsalvation\\.org$\n(?:^|\\.)kinghost\\.com$\n(?:^|\\.)kingstone\\.com\\.tw$\n(?:^|\\.)kink\\.com$\n(?:^|\\.)kinmen\\.org\\.tw$\n(?:^|\\.)kinmen\\.travel$\n(?:^|\\.)kinokuniya\\.com$\n(?:^|\\.)kir\\.jp$\n(?:^|\\.)kissbbao\\.cn$\n(?:^|\\.)kiwi\\.kz$\n(?:^|\\.)kk-whys\\.co\\.jp$\n(?:^|\\.)kkbox\\.com$\n(?:^|\\.)kknews\\.cc$\n(?:^|\\.)kmuh\\.org\\.tw$\n(?:^|\\.)knowledgerush\\.com$\n(?:^|\\.)kobo\\.com$\n(?:^|\\.)kobobooks\\.com$\n(?:^|\\.)kodingen\\.com$\n(?:^|\\.)kompozer\\.net$\n(?:^|\\.)konachan\\.com$\n(?:^|\\.)kone\\.com$\n(?:^|\\.)koolsolutions\\.com$\n(?:^|\\.)koornk\\.com$\n(?:^|\\.)koranmandarin\\.com$\n(?:^|\\.)korenan2\\.com$\n(?:^|\\.)ksdl\\.org$\n(?:^|\\.)ksnews\\.com\\.tw$\n(?:^|\\.)kspcoin\\.com$\n(?:^|\\.)ktzhk\\.com$\n(?:^|\\.)kucoin\\.com$\n(?:^|\\.)kui\\.name$\n(?:^|\\.)kun\\.im$\n(?:^|\\.)kurashsultan\\.com$\n(?:^|\\.)kurtmunger\\.com$\n(?:^|\\.)kusocity\\.com$\n(?:^|\\.)kwcg\\.ca$\n(?:^|\\.)kwongwah\\.com\\.my$\n(?:^|\\.)kxsw\\.life$\n(?:^|\\.)kyofun\\.com$\n(?:^|\\.)kyohk\\.net$\n(?:^|\\.)kyoyue\\.com$\n(?:^|\\.)kyzyhello\\.com$\n(?:^|\\.)kzeng\\.info$\n(?:^|\\.)la-forum\\.org$\n(?:^|\\.)labiennale\\.org$\n(?:^|\\.)ladbrokes\\.com$\n(?:^|\\.)lagranepoca\\.com$\n(?:^|\\.)lalulalu\\.com$\n(?:^|\\.)lama\\.com\\.tw$\n(?:^|\\.)lamayeshe\\.com$\n(?:^|\\.)lamnia\\.co\\.uk$\n(?:^|\\.)lamrim\\.com$\n(?:^|\\.)lanterncn\\.cn$\n(?:^|\\.)lantosfoundation\\.org$\n(?:^|\\.)laod\\.cn$\n(?:^|\\.)laogai\\.org$\n(?:^|\\.)laomiu\\.com$\n(?:^|\\.)laoyang\\.info$\n(?:^|\\.)laptoplockdown\\.com$\n(?:^|\\.)laqingdan\\.net$\n(?:^|\\.)larsgeorge\\.com$\n(?:^|\\.)lastcombat\\.com$\n(?:^|\\.)lastfm\\.es$\n(?:^|\\.)latelinenews\\.com$\n(?:^|\\.)latibet\\.org$\n(?:^|\\.)lbank\\.info$\n(?:^|\\.)ld\\.hao123img\\.com$\n(?:^|\\.)le-vpn\\.com$\n(?:^|\\.)leafyvpn\\.net$\n(?:^|\\.)lecloud\\.net$\n(?:^|\\.)leeao\\.com\\.cn$\n(?:^|\\.)lefora\\.com$\n(?:^|\\.)left21\\.hk$\n(?:^|\\.)legalporno\\.com$\n(?:^|\\.)legaltech\\.law\\.com$\n(?:^|\\.)legsjapan\\.com$\n(?:^|\\.)leirentv\\.ca$\n(?:^|\\.)leisurecafe\\.ca$\n(?:^|\\.)leisurepro\\.com$\n(?:^|\\.)lematin\\.ch$\n(?:^|\\.)lemonde\\.fr$\n(?:^|\\.)lenwhite\\.com$\n(?:^|\\.)lerosua\\.org$\n(?:^|\\.)lers\\.google$\n(?:^|\\.)lesoir\\.be$\n(?:^|\\.)letou\\.com$\n(?:^|\\.)letscorp\\.net$\n(?:^|\\.)lflink\\.com$\n(?:^|\\.)lflinkup\\.com$\n(?:^|\\.)lflinkup\\.net$\n(?:^|\\.)lflinkup\\.org$\n(?:^|\\.)lhakar\\.org$\n(?:^|\\.)lhasocialwork\\.org$\n(?:^|\\.)liangyou\\.net$\n(?:^|\\.)liangzhichuanmei\\.com$\n(?:^|\\.)lianyue\\.net$\n(?:^|\\.)liaowangxizang\\.net$\n(?:^|\\.)liberal\\.org\\.hk$\n(?:^|\\.)libertytimes\\.com\\.tw$\n(?:^|\\.)library\\.usc\\.cuhk\\.edu\\.hk$\n(?:^|\\.)lidecheng\\.com$\n(?:^|\\.)lifemiles\\.com$\n(?:^|\\.)lighten\\.org\\.tw$\n(?:^|\\.)lighti\\.me$\n(?:^|\\.)lightnovel\\.cn$\n(?:^|\\.)lihkg\\.com$\n(?:^|\\.)like\\.com$\n(?:^|\\.)limiao\\.net$\n(?:^|\\.)line-apps\\.com$\n(?:^|\\.)line-scdn\\.net$\n(?:^|\\.)line\\.me$\n(?:^|\\.)line\\.naver\\.jp$\n(?:^|\\.)linear-abematv\\.akamaized\\.net$\n(?:^|\\.)linglingfa\\.com$\n(?:^|\\.)lingvodics\\.com$\n(?:^|\\.)link-o-rama\\.com$\n(?:^|\\.)linkedin\\.com$\n(?:^|\\.)linkideo\\.com$\n(?:^|\\.)linkuswell\\.com$\n(?:^|\\.)linux\\.org\\.hk$\n(?:^|\\.)linuxtoy\\.org$\n(?:^|\\.)lionsroar\\.com$\n(?:^|\\.)lipuman\\.com$\n(?:^|\\.)liquidvpn\\.com$\n(?:^|\\.)listentoyoutube\\.com$\n(?:^|\\.)listorious\\.com$\n(?:^|\\.)lists\\.w3\\.org$\n(?:^|\\.)liu-xiaobo\\.org$\n(?:^|\\.)liudejun\\.com$\n(?:^|\\.)liuhanyu\\.com$\n(?:^|\\.)liujianshu\\.com$\n(?:^|\\.)liuxiaobo\\.net$\n(?:^|\\.)liuxiaotong\\.com$\n(?:^|\\.)livecoin\\.net$\n(?:^|\\.)livedoor\\.jp$\n(?:^|\\.)liveleak\\.com$\n(?:^|\\.)livestation\\.com$\n(?:^|\\.)livestream\\.com$\n(?:^|\\.)livevideo\\.com$\n(?:^|\\.)livingonline\\.us$\n(?:^|\\.)livingstream\\.com$\n(?:^|\\.)liwangyang\\.com$\n(?:^|\\.)lizhizhuangbi\\.com$\n(?:^|\\.)lkcn\\.net$\n(?:^|\\.)llss\\.me$\n(?:^|\\.)load\\.to$\n(?:^|\\.)lobsangwangyal\\.com$\n(?:^|\\.)localbitcoins\\.com$\n(?:^|\\.)localdomain\\.ws$\n(?:^|\\.)localpresshk\\.com$\n(?:^|\\.)lockestek\\.com$\n(?:^|\\.)logbot\\.net$\n(?:^|\\.)login\\.target\\.com$\n(?:^|\\.)logiqx\\.com$\n(?:^|\\.)londonchinese\\.ca$\n(?:^|\\.)longhair\\.hk$\n(?:^|\\.)longmusic\\.com$\n(?:^|\\.)longtermly\\.net$\n(?:^|\\.)longtoes\\.com$\n(?:^|\\.)lookpic\\.com$\n(?:^|\\.)looktoronto\\.com$\n(?:^|\\.)lotsawahouse\\.org$\n(?:^|\\.)lotuslight\\.org\\.hk$\n(?:^|\\.)lotuslight\\.org\\.tw$\n(?:^|\\.)lovetvshow\\.com$\n(?:^|\\.)lpsg\\.com$\n(?:^|\\.)lrfz\\.com$\n(?:^|\\.)lrip\\.org$\n(?:^|\\.)lsd\\.org\\.hk$\n(?:^|\\.)lsforum\\.net$\n(?:^|\\.)lsm\\.org$\n(?:^|\\.)lsmchinese\\.org$\n(?:^|\\.)lsmkorean\\.org$\n(?:^|\\.)lsmradio\\.com$\n(?:^|\\.)lsmwebcast\\.com$\n(?:^|\\.)lsxszzg\\.com$\n(?:^|\\.)ltn\\.com\\.tw$\n(?:^|\\.)luke54\\.com$\n(?:^|\\.)luke54\\.org$\n(?:^|\\.)lupm\\.org$\n(?:^|\\.)lushstories\\.com$\n(?:^|\\.)luxebc\\.com$\n(?:^|\\.)lvhai\\.org$\n(?:^|\\.)lvv2\\.com$\n(?:^|\\.)lyfhk\\.net$\n(?:^|\\.)lzmtnews\\.org$\n(?:^|\\.)m\\.hkgalden\\.com$\n(?:^|\\.)m\\.me$\n(?:^|\\.)m\\.plixi\\.com$\n(?:^|\\.)m\\.slandr\\.net$\n(?:^|\\.)ma\\.hao123\\.com$\n(?:^|\\.)macgamestore\\.com$\n(?:^|\\.)macrovpn\\.com$\n(?:^|\\.)macts\\.com\\.tw$\n(?:^|\\.)mad-ar\\.ch$\n(?:^|\\.)madewithcode\\.com$\n(?:^|\\.)madonna-av\\.com$\n(?:^|\\.)madrau\\.com$\n(?:^|\\.)madthumbs\\.com$\n(?:^|\\.)magazines\\.sina\\.com\\.tw$\n(?:^|\\.)magic-net\\.info$\n(?:^|\\.)mahabodhi\\.org$\n(?:^|\\.)maiio\\.net$\n(?:^|\\.)mail-archive\\.com$\n(?:^|\\.)maildns\\.xyz$\n(?:^|\\.)maiplus\\.com$\n(?:^|\\.)maizhong\\.org$\n(?:^|\\.)makemymood\\.com$\n(?:^|\\.)makkahnewspaper\\.com$\n(?:^|\\.)makzhou\\.warehouse333\\.com$\n(?:^|\\.)malaysiakini\\.com$\n(?:^|\\.)mamingzhe\\.com$\n(?:^|\\.)manchukuo\\.net$\n(?:^|\\.)mangafox\\.com$\n(?:^|\\.)mangafox\\.me$\n(?:^|\\.)maniash\\.com$\n(?:^|\\.)manicur4ik\\.ru$\n(?:^|\\.)mansion\\.com$\n(?:^|\\.)mansionpoker\\.com$\n(?:^|\\.)manta\\.com$\n(?:^|\\.)maplew\\.com$\n(?:^|\\.)marc\\.info$\n(?:^|\\.)marguerite\\.su$\n(?:^|\\.)martau\\.com$\n(?:^|\\.)martincartoons\\.com$\n(?:^|\\.)martsangkagyuofficial\\.org$\n(?:^|\\.)maruta\\.be$\n(?:^|\\.)marxist\\.com$\n(?:^|\\.)marxist\\.net$\n(?:^|\\.)marxists\\.org$\n(?:^|\\.)mash\\.to$\n(?:^|\\.)maskedip\\.com$\n(?:^|\\.)mastodon\\.cloud$\n(?:^|\\.)mastodon\\.host$\n(?:^|\\.)mastodon\\.social$\n(?:^|\\.)matainja\\.com$\n(?:^|\\.)material\\.io$\n(?:^|\\.)mathable\\.io$\n(?:^|\\.)mathiew-badimon\\.com$\n(?:^|\\.)matome-plus\\.com$\n(?:^|\\.)matome-plus\\.net$\n(?:^|\\.)matsushimakaede\\.com$\n(?:^|\\.)matters\\.news$\n(?:^|\\.)mattwilcox\\.net$\n(?:^|\\.)maturejp\\.com$\n(?:^|\\.)maxing\\.jp$\n(?:^|\\.)mayimayi\\.com$\n(?:^|\\.)mcadforums\\.com$\n(?:^|\\.)mcaf\\.ee$\n(?:^|\\.)mcfog\\.com$\n(?:^|\\.)mcreasite\\.com$\n(?:^|\\.)md-t\\.org$\n(?:^|\\.)me\\.me$\n(?:^|\\.)me\\.youthwant\\.com\\.tw$\n(?:^|\\.)meansys\\.com$\n(?:^|\\.)media\\.nu\\.nl$\n(?:^|\\.)media\\.org\\.hk$\n(?:^|\\.)mediachinese\\.com$\n(?:^|\\.)mediafire\\.com$\n(?:^|\\.)mediafreakcity\\.com$\n(?:^|\\.)medium\\.com$\n(?:^|\\.)meetav\\.com$\n(?:^|\\.)meetup\\.com$\n(?:^|\\.)mefeedia\\.com$\n(?:^|\\.)mefound\\.com$\n(?:^|\\.)mega\\.nz$\n(?:^|\\.)megaproxy\\.com$\n(?:^|\\.)megarotic\\.com$\n(?:^|\\.)megavideo\\.com$\n(?:^|\\.)megurineluka\\.com$\n(?:^|\\.)meirixiaochao\\.com$\n(?:^|\\.)meltoday\\.com$\n(?:^|\\.)meme\\.yahoo\\.com$\n(?:^|\\.)memehk\\.com$\n(?:^|\\.)memorybbs\\.com$\n(?:^|\\.)memri\\.org$\n(?:^|\\.)memrijttm\\.org$\n(?:^|\\.)mercatox\\.com$\n(?:^|\\.)mercyprophet\\.org$\n(?:^|\\.)mergersandinquisitions\\.org$\n(?:^|\\.)meridian-trust\\.org$\n(?:^|\\.)meripet\\.biz$\n(?:^|\\.)meripet\\.com$\n(?:^|\\.)merit-times\\.com\\.tw$\n(?:^|\\.)meshrep\\.com$\n(?:^|\\.)mesotw\\.com$\n(?:^|\\.)messenger\\.com$\n(?:^|\\.)metacafe\\.com$\n(?:^|\\.)metart\\.com$\n(?:^|\\.)metarthunter\\.com$\n(?:^|\\.)meteorshowersonline\\.com$\n(?:^|\\.)metrohk\\.com\\.hk$\n(?:^|\\.)metrolife\\.ca$\n(?:^|\\.)metroradio\\.com\\.hk$\n(?:^|\\.)meyou\\.jp$\n(?:^|\\.)meyul\\.com$\n(?:^|\\.)mfxmedia\\.com$\n(?:^|\\.)mgoon\\.com$\n(?:^|\\.)mgstage\\.com$\n(?:^|\\.)mh4u\\.org$\n(?:^|\\.)mhradio\\.org$\n(?:^|\\.)michaelanti\\.com$\n(?:^|\\.)michaelmarketl\\.com$\n(?:^|\\.)microvpn\\.com$\n(?:^|\\.)middle-way\\.net$\n(?:^|\\.)mihk\\.hk$\n(?:^|\\.)mihr\\.com$\n(?:^|\\.)mihua\\.org$\n(?:^|\\.)mike\\.cz\\.cc$\n(?:^|\\.)mikesoltys\\.com$\n(?:^|\\.)milph\\.net$\n(?:^|\\.)milsurps\\.com$\n(?:^|\\.)mimiai\\.net$\n(?:^|\\.)mimivip\\.com$\n(?:^|\\.)mimivv\\.com$\n(?:^|\\.)mindrolling\\.org$\n(?:^|\\.)minghui-a\\.org$\n(?:^|\\.)minghui-b\\.org$\n(?:^|\\.)minghui-school\\.org$\n(?:^|\\.)minghui\\.or\\.kr$\n(?:^|\\.)minghui\\.org$\n(?:^|\\.)minghuiyw\\.wordpress\\.com$\n(?:^|\\.)mingjinglishi\\.com$\n(?:^|\\.)mingjingnews\\.com$\n(?:^|\\.)mingjingtimes\\.com$\n(?:^|\\.)mingpao\\.com$\n(?:^|\\.)mingpaocanada\\.com$\n(?:^|\\.)mingpaomonthly\\.com$\n(?:^|\\.)mingpaonews\\.com$\n(?:^|\\.)mingpaony\\.com$\n(?:^|\\.)mingpaosf\\.com$\n(?:^|\\.)mingpaotor\\.com$\n(?:^|\\.)mingpaovan\\.com$\n(?:^|\\.)mingshengbao\\.com$\n(?:^|\\.)minhhue\\.net$\n(?:^|\\.)miniforum\\.org$\n(?:^|\\.)ministrybooks\\.org$\n(?:^|\\.)minzhuhua\\.net$\n(?:^|\\.)minzhuzhanxian\\.com$\n(?:^|\\.)minzhuzhongguo\\.org$\n(?:^|\\.)miroguide\\.com$\n(?:^|\\.)mirrorbooks\\.com$\n(?:^|\\.)mist\\.vip$\n(?:^|\\.)mitao\\.com\\.tw$\n(?:^|\\.)mitbbs\\.com$\n(?:^|\\.)mitbbsau\\.com$\n(?:^|\\.)mixero\\.com$\n(?:^|\\.)mixpod\\.com$\n(?:^|\\.)mixx\\.com$\n(?:^|\\.)mizzmona\\.com$\n(?:^|\\.)mjib\\.gov\\.tw$\n(?:^|\\.)mjlsh\\.usc\\.cuhk\\.edu\\.hk$\n(?:^|\\.)mk5000\\.com$\n(?:^|\\.)mlcool\\.com$\n(?:^|\\.)mlzs\\.work$\n(?:^|\\.)mm-cg\\.com$\n(?:^|\\.)mmaaxx\\.com$\n(?:^|\\.)mmmca\\.com$\n(?:^|\\.)mnewstv\\.com$\n(?:^|\\.)mo\\.nightlife141\\.com$\n(?:^|\\.)mobatek\\.net$\n(?:^|\\.)mobile01\\.com$\n(?:^|\\.)mobileways\\.de$\n(?:^|\\.)moby\\.to$\n(?:^|\\.)mobypicture\\.com$\n(?:^|\\.)moeaic\\.gov\\.tw$\n(?:^|\\.)moeerolibrary\\.com$\n(?:^|\\.)mofa\\.gov\\.tw$\n(?:^|\\.)mofaxiehui\\.com$\n(?:^|\\.)mofos\\.com$\n(?:^|\\.)mog\\.com$\n(?:^|\\.)mohu\\.club$\n(?:^|\\.)mohu\\.ml$\n(?:^|\\.)mojim\\.com$\n(?:^|\\.)mol\\.gov\\.tw$\n(?:^|\\.)molihua\\.org$\n(?:^|\\.)mondex\\.org$\n(?:^|\\.)money-link\\.com\\.tw$\n(?:^|\\.)moneyhome\\.biz$\n(?:^|\\.)monitorchina\\.org$\n(?:^|\\.)monster\\.com$\n(?:^|\\.)moodyz\\.com$\n(?:^|\\.)moonbbs\\.com$\n(?:^|\\.)moonbingo\\.com$\n(?:^|\\.)morningsun\\.org$\n(?:^|\\.)moroneta\\.com$\n(?:^|\\.)mos\\.ru$\n(?:^|\\.)motherless\\.com$\n(?:^|\\.)motiyun\\.com$\n(?:^|\\.)motor4ik\\.ru$\n(?:^|\\.)mousebreaker\\.com$\n(?:^|\\.)movements\\.org$\n(?:^|\\.)moviefap\\.com$\n(?:^|\\.)mp3buscador\\.com$\n(?:^|\\.)mp3ye\\.eu$\n(?:^|\\.)mpettis\\.com$\n(?:^|\\.)mpfinance\\.com$\n(?:^|\\.)mpinews\\.com$\n(?:^|\\.)mponline\\.hk$\n(?:^|\\.)mqxd\\.org$\n(?:^|\\.)mrbasic\\.com$\n(?:^|\\.)mrbonus\\.com$\n(?:^|\\.)mrface\\.com$\n(?:^|\\.)mrslove\\.com$\n(?:^|\\.)mrtweet\\.com$\n(?:^|\\.)msa-it\\.org$\n(?:^|\\.)msguancha\\.com$\n(?:^|\\.)msha\\.gov$\n(?:^|\\.)mswe1\\.org$\n(?:^|\\.)mthruf\\.com$\n(?:^|\\.)mtw\\.tl$\n(?:^|\\.)muchosucko\\.com$\n(?:^|\\.)mullvad\\.net$\n(?:^|\\.)multiply\\.com$\n(?:^|\\.)multiproxy\\.org$\n(?:^|\\.)multiupload\\.com$\n(?:^|\\.)mummysgold\\.com$\n(?:^|\\.)murmur\\.tw$\n(?:^|\\.)musicade\\.net$\n(?:^|\\.)muslimvideo\\.com$\n(?:^|\\.)muzi\\.com$\n(?:^|\\.)muzi\\.net$\n(?:^|\\.)muzu\\.tv$\n(?:^|\\.)mvdis\\.gov\\.tw$\n(?:^|\\.)mvg\\.jp$\n(?:^|\\.)mx\\.hao123\\.com$\n(?:^|\\.)mx981\\.com$\n(?:^|\\.)my-formosa\\.com$\n(?:^|\\.)my-private-network\\.co\\.uk$\n(?:^|\\.)my-proxy\\.com$\n(?:^|\\.)my\\.mail\\.ru$\n(?:^|\\.)my\\.opera\\.com$\n(?:^|\\.)my\\.pcloud\\.com$\n(?:^|\\.)my03\\.com$\n(?:^|\\.)myactimes\\.com$\n(?:^|\\.)myanniu\\.com$\n(?:^|\\.)myaudiocast\\.com$\n(?:^|\\.)myav\\.com\\.tw$\n(?:^|\\.)mybbs\\.us$\n(?:^|\\.)mybet\\.com$\n(?:^|\\.)myca168\\.com$\n(?:^|\\.)mycanadanow\\.com$\n(?:^|\\.)mychinamyhome\\.com$\n(?:^|\\.)mychinanet\\.com$\n(?:^|\\.)mychinanews\\.com$\n(?:^|\\.)mychinese\\.news$\n(?:^|\\.)mycnnews\\.com$\n(?:^|\\.)mycould\\.com$\n(?:^|\\.)mydad\\.info$\n(?:^|\\.)myddns\\.com$\n(?:^|\\.)myeasytv\\.com$\n(?:^|\\.)myeclipseide\\.com$\n(?:^|\\.)myforum\\.com\\.hk$\n(?:^|\\.)myforum\\.com\\.uk$\n(?:^|\\.)myfreecams\\.com$\n(?:^|\\.)myfreepaysite\\.com$\n(?:^|\\.)myfreshnet\\.com$\n(?:^|\\.)myftp\\.info$\n(?:^|\\.)myftp\\.name$\n(?:^|\\.)myiphide\\.com$\n(?:^|\\.)mykomica\\.org$\n(?:^|\\.)mylftv\\.com$\n(?:^|\\.)mymediarom\\.com$\n(?:^|\\.)mymoe\\.moe$\n(?:^|\\.)mymom\\.info$\n(?:^|\\.)mymusic\\.net\\.tw$\n(?:^|\\.)mynetav\\.net$\n(?:^|\\.)mynetav\\.org$\n(?:^|\\.)mynumber\\.org$\n(?:^|\\.)myparagliding\\.com$\n(?:^|\\.)mypicture\\.info$\n(?:^|\\.)mypop3\\.net$\n(?:^|\\.)mypop3\\.org$\n(?:^|\\.)mypopescu\\.com$\n(?:^|\\.)myradio\\.hk$\n(?:^|\\.)myreadingmanga\\.info$\n(?:^|\\.)mysecondarydns\\.com$\n(?:^|\\.)myshare\\.url\\.com\\.tw$\n(?:^|\\.)mysinablog\\.com$\n(?:^|\\.)mysite\\.verizon\\.net$\n(?:^|\\.)myspace\\.com$\n(?:^|\\.)myspacecdn\\.com$\n(?:^|\\.)mytalkbox\\.com$\n(?:^|\\.)mytizi\\.com$\n(?:^|\\.)mywww\\.biz$\n(?:^|\\.)myz\\.info$\n(?:^|\\.)naacoalition\\.org$\n(?:^|\\.)naitik\\.net$\n(?:^|\\.)nakido\\.com$\n(?:^|\\.)nakuz\\.com$\n(?:^|\\.)nalandabodhi\\.org$\n(?:^|\\.)nalandawest\\.org$\n(?:^|\\.)namgyal\\.org$\n(?:^|\\.)namgyalmonastery\\.org$\n(?:^|\\.)namsisi\\.com$\n(?:^|\\.)nanyang\\.com$\n(?:^|\\.)nanyangpost\\.com$\n(?:^|\\.)nanzao\\.com$\n(?:^|\\.)naol\\.ca$\n(?:^|\\.)naol\\.cc$\n(?:^|\\.)nat\\.gov\\.tw$\n(?:^|\\.)nat\\.moe$\n(?:^|\\.)national-lottery\\.co\\.uk$\n(?:^|\\.)nationsonline\\.org$\n(?:^|\\.)nationwide\\.com$\n(?:^|\\.)naughtyamerica\\.com$\n(?:^|\\.)navyfamily\\.navy\\.mil$\n(?:^|\\.)navyreserve\\.navy\\.mil$\n(?:^|\\.)naweeklytimes\\.com$\n(?:^|\\.)nbtvpn\\.com$\n(?:^|\\.)nccwatch\\.org\\.tw$\n(?:^|\\.)nch\\.com\\.tw$\n(?:^|\\.)ncn\\.org$\n(?:^|\\.)nde\\.de$\n(?:^|\\.)ndr\\.de$\n(?:^|\\.)ned\\.org$\n(?:^|\\.)nekoslovakia\\.net$\n(?:^|\\.)nemesis2\\.qx\\.net$\n(?:^|\\.)neo-miracle\\.com$\n(?:^|\\.)nepusoku\\.com$\n(?:^|\\.)net-fits\\.pro$\n(?:^|\\.)netbirds\\.com$\n(?:^|\\.)netcolony\\.com$\n(?:^|\\.)netflix\\.com$\n(?:^|\\.)netme\\.cc$\n(?:^|\\.)netsneak\\.com$\n(?:^|\\.)network54\\.com$\n(?:^|\\.)networkedblogs\\.com$\n(?:^|\\.)networktunnel\\.net$\n(?:^|\\.)neverforget8964\\.org$\n(?:^|\\.)new-3lunch\\.net$\n(?:^|\\.)new-akiba\\.com$\n(?:^|\\.)new96\\.ca$\n(?:^|\\.)newcenturymc\\.com$\n(?:^|\\.)newcenturynews\\.com$\n(?:^|\\.)newchen\\.com$\n(?:^|\\.)newgrounds\\.com$\n(?:^|\\.)newipnow\\.com$\n(?:^|\\.)newlandmagazine\\.com\\.au$\n(?:^|\\.)newnews\\.ca$\n(?:^|\\.)news\\.cnyes\\.com$\n(?:^|\\.)news\\.hk\\.msn\\.com$\n(?:^|\\.)news\\.hkpeanut\\.com$\n(?:^|\\.)news\\.msn\\.com\\.tw$\n(?:^|\\.)news\\.nationalgeographic\\.com$\n(?:^|\\.)news\\.now\\.com$\n(?:^|\\.)news\\.now\\.com%2fhome$\n(?:^|\\.)news\\.omy\\.sg$\n(?:^|\\.)news\\.seehua\\.com$\n(?:^|\\.)news\\.sina\\.com\\.hk$\n(?:^|\\.)news\\.sina\\.com\\.tw$\n(?:^|\\.)news\\.sinchew\\.com\\.my$\n(?:^|\\.)news\\.singtao\\.ca$\n(?:^|\\.)news\\.tvb\\.com$\n(?:^|\\.)news\\.tvbs\\.com\\.tw$\n(?:^|\\.)news\\.yahoo\\.com$\n(?:^|\\.)news100\\.com\\.tw$\n(?:^|\\.)newsancai\\.com$\n(?:^|\\.)newschinacomment\\.org$\n(?:^|\\.)newscn\\.org$\n(?:^|\\.)newsdetox\\.ca$\n(?:^|\\.)newsdh\\.com$\n(?:^|\\.)newspeak\\.cc$\n(?:^|\\.)newstamago\\.com$\n(?:^|\\.)newstapa\\.org$\n(?:^|\\.)newstarnet\\.com$\n(?:^|\\.)newtaiwan\\.com\\.tw$\n(?:^|\\.)newtalk\\.tw$\n(?:^|\\.)newyorktimes\\.com$\n(?:^|\\.)nexon\\.com$\n(?:^|\\.)next11\\.co\\.jp$\n(?:^|\\.)nextmag\\.com\\.tw$\n(?:^|\\.)nextmedia\\.com$\n(?:^|\\.)nexton-net\\.jp$\n(?:^|\\.)nexttv\\.com\\.tw$\n(?:^|\\.)nf\\.id\\.au$\n(?:^|\\.)nfjtyd\\.com$\n(?:^|\\.)nflxext\\.com$\n(?:^|\\.)nflximg\\.com$\n(?:^|\\.)nflximg\\.net$\n(?:^|\\.)nflxso\\.net$\n(?:^|\\.)nflxvideo\\.net$\n(?:^|\\.)nga\\.mil$\n(?:^|\\.)ngensis\\.com$\n(?:^|\\.)nhentai\\.net$\n(?:^|\\.)nhi\\.gov\\.tw$\n(?:^|\\.)nhk-ondemand\\.jp$\n(?:^|\\.)nic\\.cz\\.cc$\n(?:^|\\.)nic\\.google$\n(?:^|\\.)nic\\.gov$\n(?:^|\\.)nicovideo\\.jp$\n(?:^|\\.)nighost\\.org$\n(?:^|\\.)nikkei\\.com$\n(?:^|\\.)ninecommentaries\\.com$\n(?:^|\\.)ninjacloak\\.com$\n(?:^|\\.)ninjaproxy\\.ninja$\n(?:^|\\.)nintendium\\.com$\n(?:^|\\.)ninth\\.biz$\n(?:^|\\.)niu\\.moe$\n(?:^|\\.)niusnews\\.com$\n(?:^|\\.)njactb\\.org$\n(?:^|\\.)njuice\\.com$\n(?:^|\\.)nko\\.navy\\.mil$\n(?:^|\\.)nlfreevpn\\.com$\n(?:^|\\.)no-ip\\.org$\n(?:^|\\.)nobel\\.se$\n(?:^|\\.)nobelprize\\.org$\n(?:^|\\.)nobodycanstop\\.us$\n(?:^|\\.)nofile\\.io$\n(?:^|\\.)nokogiri\\.org$\n(?:^|\\.)nokola\\.com$\n(?:^|\\.)noodlevpn\\.com$\n(?:^|\\.)norbulingka\\.org$\n(?:^|\\.)nordstrom\\.com$\n(?:^|\\.)nordstromimage\\.com$\n(?:^|\\.)nordstromrack\\.com$\n(?:^|\\.)nordvpn\\.com$\n(?:^|\\.)notify\\.dropboxapi\\.com$\n(?:^|\\.)nottinghampost\\.com$\n(?:^|\\.)novelasia\\.com$\n(?:^|\\.)now\\.com$\n(?:^|\\.)now\\.im$\n(?:^|\\.)nownews\\.com$\n(?:^|\\.)nowtorrents\\.com$\n(?:^|\\.)noypf\\.com$\n(?:^|\\.)npa\\.go\\.jp$\n(?:^|\\.)npa\\.gov\\.tw$\n(?:^|\\.)npnt\\.me$\n(?:^|\\.)nps\\.gov$\n(?:^|\\.)npsboost\\.com$\n(?:^|\\.)nradio\\.me$\n(?:^|\\.)nrk\\.no$\n(?:^|\\.)ns01\\.biz$\n(?:^|\\.)ns01\\.info$\n(?:^|\\.)ns01\\.us$\n(?:^|\\.)ns02\\.biz$\n(?:^|\\.)ns02\\.info$\n(?:^|\\.)ns02\\.us$\n(?:^|\\.)ns1\\.name$\n(?:^|\\.)ns2\\.name$\n(?:^|\\.)ns3\\.name$\n(?:^|\\.)nsc\\.gov\\.tw$\n(?:^|\\.)ntbk\\.gov\\.tw$\n(?:^|\\.)ntbna\\.gov\\.tw$\n(?:^|\\.)ntbt\\.gov\\.tw$\n(?:^|\\.)ntd\\.tv$\n(?:^|\\.)ntdtv\\.ca$\n(?:^|\\.)ntdtv\\.co\\.kr$\n(?:^|\\.)ntdtv\\.com$\n(?:^|\\.)ntdtv\\.cz$\n(?:^|\\.)ntdtv\\.org$\n(?:^|\\.)ntdtv\\.ru$\n(?:^|\\.)ntdtvla\\.com$\n(?:^|\\.)ntrfun\\.com$\n(?:^|\\.)ntsna\\.gov\\.tw$\n(?:^|\\.)nubiles\\.net$\n(?:^|\\.)nuexpo\\.com$\n(?:^|\\.)nukistream\\.com$\n(?:^|\\.)nurgo-software\\.com$\n(?:^|\\.)nusatrip\\.com$\n(?:^|\\.)nutaku\\.net$\n(?:^|\\.)nuuvem\\.com$\n(?:^|\\.)nuvid\\.com$\n(?:^|\\.)nuzcom\\.com$\n(?:^|\\.)nvdst\\.com$\n(?:^|\\.)nvquan\\.org$\n(?:^|\\.)nvtongzhisheng\\.org$\n(?:^|\\.)nwtca\\.org$\n(?:^|\\.)ny\\.stgloballink\\.com$\n(?:^|\\.)ny\\.visiontimes\\.com$\n(?:^|\\.)nyaa\\.eu$\n(?:^|\\.)nydus\\.ca$\n(?:^|\\.)nylon-angel\\.com$\n(?:^|\\.)nylonstockingsonline\\.com$\n(?:^|\\.)nyt\\.com$\n(?:^|\\.)nytchina\\.com$\n(?:^|\\.)nytcn\\.me$\n(?:^|\\.)nytco\\.com$\n(?:^|\\.)nyti\\.ms$\n(?:^|\\.)nytimes\\.com$\n(?:^|\\.)nytimes\\.map\\.fastly\\.net$\n(?:^|\\.)nytimg\\.com$\n(?:^|\\.)nytstyle\\.com$\n(?:^|\\.)nzchinese\\.com$\n(?:^|\\.)nzchinese\\.net\\.nz$\n(?:^|\\.)observechina\\.net$\n(?:^|\\.)obutu\\.com$\n(?:^|\\.)ocaspro\\.com$\n(?:^|\\.)occupytiananmen\\.com$\n(?:^|\\.)oclp\\.hk$\n(?:^|\\.)ocreampies\\.com$\n(?:^|\\.)ocry\\.com$\n(?:^|\\.)october-review\\.org$\n(?:^|\\.)oculus\\.com$\n(?:^|\\.)oculuscdn\\.com$\n(?:^|\\.)oex\\.com$\n(?:^|\\.)offbeatchina\\.com$\n(?:^|\\.)officeoftibet\\.com$\n(?:^|\\.)ofile\\.org$\n(?:^|\\.)ogaoga\\.org$\n(?:^|\\.)ogate\\.org$\n(?:^|\\.)oikos\\.com\\.tw$\n(?:^|\\.)oiktv\\.com$\n(?:^|\\.)oizoblog\\.com$\n(?:^|\\.)ok\\.ru$\n(?:^|\\.)okayfreedom\\.com$\n(?:^|\\.)okex\\.com$\n(?:^|\\.)okk\\.tw$\n(?:^|\\.)old-cat\\.net$\n(?:^|\\.)old\\.honeynet\\.org$\n(?:^|\\.)old\\.nabble\\.com$\n(?:^|\\.)olumpo\\.com$\n(?:^|\\.)olympicwatch\\.org$\n(?:^|\\.)omgili\\.com$\n(?:^|\\.)omni7\\.jp$\n(?:^|\\.)omnitalk\\.com$\n(?:^|\\.)omnitalk\\.org$\n(?:^|\\.)on\\.cc$\n(?:^|\\.)on2\\.com$\n(?:^|\\.)onapp\\.com$\n(?:^|\\.)onedrive\\.live\\.com$\n(?:^|\\.)onedumb\\.com$\n(?:^|\\.)onejav\\.com$\n(?:^|\\.)onion\\.city$\n(?:^|\\.)online\\.recoveryversion\\.org$\n(?:^|\\.)onlinecha\\.com$\n(?:^|\\.)onlineyoutube\\.com$\n(?:^|\\.)onlytweets\\.com$\n(?:^|\\.)onmoon\\.com$\n(?:^|\\.)onmoon\\.net$\n(?:^|\\.)onmypc\\.biz$\n(?:^|\\.)onmypc\\.info$\n(?:^|\\.)onmypc\\.net$\n(?:^|\\.)onmypc\\.org$\n(?:^|\\.)onmypc\\.us$\n(?:^|\\.)onthehunt\\.com$\n(?:^|\\.)ontrac\\.com$\n(?:^|\\.)oopsforum\\.com$\n(?:^|\\.)open\\.com\\.hk$\n(?:^|\\.)openallweb\\.com$\n(?:^|\\.)opendemocracy\\.net$\n(?:^|\\.)opendn\\.xyz$\n(?:^|\\.)openervpn\\.in$\n(?:^|\\.)openid\\.net$\n(?:^|\\.)openleaks\\.org$\n(?:^|\\.)openvpn\\.net$\n(?:^|\\.)openvpn\\.org$\n(?:^|\\.)openwebster\\.com$\n(?:^|\\.)openwrt\\.org\\.cn$\n(?:^|\\.)opml\\.radiotime\\.com$\n(?:^|\\.)opus-gaming\\.com$\n(?:^|\\.)organcare\\.org\\.tw$\n(?:^|\\.)organharvestinvestigation\\.net$\n(?:^|\\.)organiccrap\\.com$\n(?:^|\\.)orgasm\\.com$\n(?:^|\\.)orgfree\\.com$\n(?:^|\\.)orient-doll\\.com$\n(?:^|\\.)orientaldaily\\.com\\.my$\n(?:^|\\.)orn\\.jp$\n(?:^|\\.)orzistic\\.org$\n(?:^|\\.)osfoora\\.com$\n(?:^|\\.)otcbtc\\.com$\n(?:^|\\.)otnd\\.org$\n(?:^|\\.)otto\\.de$\n(?:^|\\.)otzo\\.com$\n(?:^|\\.)ourdearamy\\.com$\n(?:^|\\.)ourhobby\\.com$\n(?:^|\\.)oursogo\\.com$\n(?:^|\\.)oursteps\\.com\\.au$\n(?:^|\\.)oursweb\\.net$\n(?:^|\\.)ourtv\\.hk$\n(?:^|\\.)overplay\\.net$\n(?:^|\\.)oversea\\.istarshine\\.com$\n(?:^|\\.)ow\\.ly$\n(?:^|\\.)owl\\.li$\n(?:^|\\.)oyax\\.com$\n(?:^|\\.)oyghan\\.com$\n(?:^|\\.)ozchinese\\.com$\n(?:^|\\.)ozvoice\\.org$\n(?:^|\\.)ozxw\\.com$\n(?:^|\\.)ozyoyo\\.com$\n(?:^|\\.)pachosting\\.com$\n(?:^|\\.)pacificpoker\\.com$\n(?:^|\\.)packages\\.debian\\.org$\n(?:^|\\.)packetix\\.net$\n(?:^|\\.)pacopacomama\\.com$\n(?:^|\\.)padmanet\\.com$\n(?:^|\\.)page\\.bid\\.yahoo\\.com$\n(?:^|\\.)page2rss\\.com$\n(?:^|\\.)pagodabox\\.com$\n(?:^|\\.)palacemoon\\.com$\n(?:^|\\.)paldengyal\\.com$\n(?:^|\\.)paljorpublications\\.com$\n(?:^|\\.)paltalk\\.com$\n(?:^|\\.)panamapapers\\.sueddeutsche\\.de$\n(?:^|\\.)pandapow\\.co$\n(?:^|\\.)pandapow\\.net$\n(?:^|\\.)pandavpn-jp\\.com$\n(?:^|\\.)pandora\\.com$\n(?:^|\\.)pandora\\.tv$\n(?:^|\\.)panluan\\.net$\n(?:^|\\.)panoramio\\.com$\n(?:^|\\.)pao-pao\\.net$\n(?:^|\\.)paper\\.li$\n(?:^|\\.)paperb\\.us$\n(?:^|\\.)paradisehill\\.cc$\n(?:^|\\.)paradisepoker\\.com$\n(?:^|\\.)parkansky\\.com$\n(?:^|\\.)partycasino\\.com$\n(?:^|\\.)partypoker\\.com$\n(?:^|\\.)passion\\.com$\n(?:^|\\.)passiontimes\\.hk$\n(?:^|\\.)paste\\.ee$\n(?:^|\\.)pastebin\\.com$\n(?:^|\\.)pastie\\.org$\n(?:^|\\.)pbs\\.org$\n(?:^|\\.)pbwiki\\.com$\n(?:^|\\.)pbworks\\.com$\n(?:^|\\.)pbxes\\.com$\n(?:^|\\.)pbxes\\.org$\n(?:^|\\.)pcanywhere\\.net$\n(?:^|\\.)pcc\\.gov\\.tw$\n(?:^|\\.)pcdvd\\.com\\.tw$\n(?:^|\\.)pchome\\.com\\.tw$\n(?:^|\\.)pcij\\.org$\n(?:^|\\.)pcstore\\.com\\.tw$\n(?:^|\\.)pct\\.org\\.tw$\n(?:^|\\.)pdetails\\.com$\n(?:^|\\.)pdproxy\\.com$\n(?:^|\\.)pds\\.nasa\\.gov$\n(?:^|\\.)peace\\.ca$\n(?:^|\\.)peacefire\\.org$\n(?:^|\\.)peacehall\\.com$\n(?:^|\\.)pearlher\\.org$\n(?:^|\\.)peeasian\\.com$\n(?:^|\\.)pekingduck\\.org$\n(?:^|\\.)pemulihan\\.or\\.id$\n(?:^|\\.)pen\\.io$\n(?:^|\\.)penchinese\\.com$\n(?:^|\\.)penchinese\\.net$\n(?:^|\\.)pengyulong\\.com$\n(?:^|\\.)penisbot\\.com$\n(?:^|\\.)penthouse\\.com$\n(?:^|\\.)pentoy\\.hk$\n(?:^|\\.)peoplebookcafe\\.com$\n(?:^|\\.)peoplenews\\.tw$\n(?:^|\\.)peopo\\.org$\n(?:^|\\.)percy\\.in$\n(?:^|\\.)perfectgirls\\.net$\n(?:^|\\.)perfectvpn\\.net$\n(?:^|\\.)periscope\\.tv$\n(?:^|\\.)persecutionblog\\.com$\n(?:^|\\.)persiankitty\\.com$\n(?:^|\\.)pfd\\.org\\.hk$\n(?:^|\\.)phapluan\\.org$\n(?:^|\\.)phayul\\.com$\n(?:^|\\.)philborges\\.com$\n(?:^|\\.)philly\\.com$\n(?:^|\\.)phmsociety\\.org$\n(?:^|\\.)phncdn\\.com$\n(?:^|\\.)phobos\\.apple\\.com$\n(?:^|\\.)phosphation13\\.rssing\\.com$\n(?:^|\\.)photodharma\\.net$\n(?:^|\\.)photofocus\\.com$\n(?:^|\\.)phuquocservices\\.com$\n(?:^|\\.)picacomic\\.com$\n(?:^|\\.)picacomiccn\\.com$\n(?:^|\\.)picasaweb\\.com$\n(?:^|\\.)picidae\\.net$\n(?:^|\\.)pictures\\.playboy\\.com$\n(?:^|\\.)picturesocial\\.com$\n(?:^|\\.)pin-cong\\.com$\n(?:^|\\.)pin6\\.com$\n(?:^|\\.)pincong\\.rocks$\n(?:^|\\.)ping\\.fm$\n(?:^|\\.)pinimg\\.com$\n(?:^|\\.)pinkrod\\.com$\n(?:^|\\.)pinoy-n\\.com$\n(?:^|\\.)pinterest\\.at$\n(?:^|\\.)pinterest\\.ca$\n(?:^|\\.)pinterest\\.co\\.kr$\n(?:^|\\.)pinterest\\.co\\.uk$\n(?:^|\\.)pinterest\\.com$\n(?:^|\\.)pinterest\\.de$\n(?:^|\\.)pinterest\\.dk$\n(?:^|\\.)pinterest\\.fr$\n(?:^|\\.)pinterest\\.jp$\n(?:^|\\.)pinterest\\.nl$\n(?:^|\\.)pinterest\\.se$\n(?:^|\\.)pioneer-worker\\.forums-free\\.com$\n(?:^|\\.)pipii\\.tv$\n(?:^|\\.)piposay\\.com$\n(?:^|\\.)piraattilahti\\.org$\n(?:^|\\.)piring\\.com$\n(?:^|\\.)pixelqi\\.com$\n(?:^|\\.)pixiv\\.net$\n(?:^|\\.)pixnet\\.net$\n(?:^|\\.)pk\\.com$\n(?:^|\\.)pki\\.goog$\n(?:^|\\.)placemix\\.com$\n(?:^|\\.)playboy\\.com$\n(?:^|\\.)playboyplus\\.com$\n(?:^|\\.)player\\.fm$\n(?:^|\\.)playno1\\.com$\n(?:^|\\.)playpcesor\\.com$\n(?:^|\\.)plays\\.com\\.tw$\n(?:^|\\.)plm\\.org\\.hk$\n(?:^|\\.)plunder\\.com$\n(?:^|\\.)plurk\\.com$\n(?:^|\\.)plus\\.codes$\n(?:^|\\.)plus28\\.com$\n(?:^|\\.)plusbb\\.com$\n(?:^|\\.)pmatehunter\\.com$\n(?:^|\\.)pmates\\.com$\n(?:^|\\.)po2b\\.com$\n(?:^|\\.)pobieramy\\.top$\n(?:^|\\.)podictionary\\.com$\n(?:^|\\.)pokerstars\\.com$\n(?:^|\\.)pokerstars\\.net$\n(?:^|\\.)politicalchina\\.org$\n(?:^|\\.)politicalconsultation\\.org$\n(?:^|\\.)politiscales\\.net$\n(?:^|\\.)poloniex\\.com$\n(?:^|\\.)polymer-project\\.org$\n(?:^|\\.)polymerhk\\.com$\n(?:^|\\.)popo\\.tw$\n(?:^|\\.)popvote\\.hk$\n(?:^|\\.)popyard\\.com$\n(?:^|\\.)popyard\\.org$\n(?:^|\\.)porn\\.com$\n(?:^|\\.)porn2\\.com$\n(?:^|\\.)porn5\\.com$\n(?:^|\\.)pornbase\\.org$\n(?:^|\\.)pornerbros\\.com$\n(?:^|\\.)pornhd\\.com$\n(?:^|\\.)pornhost\\.com$\n(?:^|\\.)pornhub\\.com$\n(?:^|\\.)pornhubdeutsch\\.net$\n(?:^|\\.)pornmm\\.net$\n(?:^|\\.)pornoxo\\.com$\n(?:^|\\.)pornrapidshare\\.com$\n(?:^|\\.)pornsharing\\.com$\n(?:^|\\.)pornsocket\\.com$\n(?:^|\\.)pornstarclub\\.com$\n(?:^|\\.)porntube\\.com$\n(?:^|\\.)porntubenews\\.com$\n(?:^|\\.)porntvblog\\.com$\n(?:^|\\.)pornvisit\\.com$\n(?:^|\\.)port25\\.biz$\n(?:^|\\.)portablevpn\\.nl$\n(?:^|\\.)poskotanews\\.com$\n(?:^|\\.)post01\\.com$\n(?:^|\\.)post76\\.com$\n(?:^|\\.)post852\\.com$\n(?:^|\\.)postadult\\.com$\n(?:^|\\.)postimg\\.org$\n(?:^|\\.)potato\\.im$\n(?:^|\\.)potvpn\\.com$\n(?:^|\\.)power\\.com$\n(?:^|\\.)powerapple\\.com$\n(?:^|\\.)powercx\\.com$\n(?:^|\\.)powerphoto\\.org$\n(?:^|\\.)prayforchina\\.net$\n(?:^|\\.)premeforwindows7\\.com$\n(?:^|\\.)premproxy\\.com$\n(?:^|\\.)presentationzen\\.com$\n(?:^|\\.)presidentlee\\.tw$\n(?:^|\\.)prestige-av\\.com$\n(?:^|\\.)pride\\.google$\n(?:^|\\.)prism-break\\.org$\n(?:^|\\.)prisoner-state-secret-journal-premier$\n(?:^|\\.)prisoneralert\\.com$\n(?:^|\\.)pritunl\\.com$\n(?:^|\\.)privacybox\\.de$\n(?:^|\\.)private\\.com$\n(?:^|\\.)privateinternetaccess\\.com$\n(?:^|\\.)privatepaste\\.com$\n(?:^|\\.)privatetunnel\\.com$\n(?:^|\\.)privatevpn\\.com$\n(?:^|\\.)procopytips\\.com$\n(?:^|\\.)prosiben\\.de$\n(?:^|\\.)protonvpn\\.com$\n(?:^|\\.)provideocoalition\\.com$\n(?:^|\\.)provpnaccounts\\.com$\n(?:^|\\.)proxfree\\.com$\n(?:^|\\.)proxifier\\.com$\n(?:^|\\.)proxomitron\\.info$\n(?:^|\\.)proxpn\\.com$\n(?:^|\\.)proxyanonimo\\.es$\n(?:^|\\.)proxydns\\.com$\n(?:^|\\.)proxylist\\.org\\.uk$\n(?:^|\\.)proxynetwork\\.org\\.uk$\n(?:^|\\.)proxypy\\.net$\n(?:^|\\.)proxyroad\\.com$\n(?:^|\\.)proxytunnel\\.net$\n(?:^|\\.)proyectoclubes\\.com$\n(?:^|\\.)prozz\\.net$\n(?:^|\\.)psblog\\.name$\n(?:^|\\.)pscp\\.tv$\n(?:^|\\.)psiphon\\.ca$\n(?:^|\\.)psiphon\\.civisec\\.org$\n(?:^|\\.)psiphon3\\.com$\n(?:^|\\.)psiphontoday\\.com$\n(?:^|\\.)pts\\.org\\.tw$\n(?:^|\\.)ptt\\.cc$\n(?:^|\\.)pttvan\\.org$\n(?:^|\\.)pubu\\.com\\.tw$\n(?:^|\\.)puffinbrowser\\.com$\n(?:^|\\.)puffstore\\.com$\n(?:^|\\.)pullfolio\\.com$\n(?:^|\\.)pulse\\.yahoo\\.com$\n(?:^|\\.)punyu\\.com$\n(?:^|\\.)pure18\\.com$\n(?:^|\\.)pureconcepts\\.net$\n(?:^|\\.)pureinsight\\.org$\n(?:^|\\.)purepdf\\.com$\n(?:^|\\.)purevpn\\.com$\n(?:^|\\.)purplelotus\\.org$\n(?:^|\\.)pursuestar\\.com$\n(?:^|\\.)pushchinawall\\.com$\n(?:^|\\.)pussyspace\\.com$\n(?:^|\\.)putihome\\.org$\n(?:^|\\.)putlocker\\.com$\n(?:^|\\.)putty\\.org$\n(?:^|\\.)puuko\\.com$\n(?:^|\\.)pwned\\.com$\n(?:^|\\.)python\\.com$\n(?:^|\\.)python\\.com\\.tw$\n(?:^|\\.)pythonhackers\\.com$\n(?:^|\\.)pytorch\\.org$\n(?:^|\\.)q%3dfreedom$\n(?:^|\\.)q%3dtriangle$\n(?:^|\\.)q=freedom$\n(?:^|\\.)q=triangle$\n(?:^|\\.)qanote\\.com$\n(?:^|\\.)qgirl\\.com\\.tw$\n(?:^|\\.)qhigh\\.com$\n(?:^|\\.)qi-gong\\.me$\n(?:^|\\.)qiandao\\.today$\n(?:^|\\.)qiangyou\\.org$\n(?:^|\\.)qidian\\.ca$\n(?:^|\\.)qienkuen\\.org$\n(?:^|\\.)qiwen\\.lu$\n(?:^|\\.)qixianglu\\.cn$\n(?:^|\\.)qkshare\\.com$\n(?:^|\\.)qoos\\.com$\n(?:^|\\.)qpoe\\.com$\n(?:^|\\.)qq\\.co\\.za$\n(?:^|\\.)qstatus\\.com$\n(?:^|\\.)qtrac\\.eu$\n(?:^|\\.)qtweeter\\.com$\n(?:^|\\.)quannengshen\\.org$\n(?:^|\\.)quantumbooter\\.net$\n(?:^|\\.)questvisual\\.com$\n(?:^|\\.)quitccp\\.net$\n(?:^|\\.)quitccp\\.org$\n(?:^|\\.)quora\\.com$\n(?:^|\\.)quoracdn\\.net$\n(?:^|\\.)quran\\.com$\n(?:^|\\.)quranexplorer\\.com$\n(?:^|\\.)qusi8\\.net$\n(?:^|\\.)qvodzy\\.org$\n(?:^|\\.)qxbbs\\.org$\n(?:^|\\.)r18\\.com$\n(?:^|\\.)ra\\.gg$\n(?:^|\\.)radicalparty\\.org$\n(?:^|\\.)radiko\\.jp$\n(?:^|\\.)radioaustralia\\.net\\.au$\n(?:^|\\.)radiohilight\\.net$\n(?:^|\\.)radiovaticana\\.org$\n(?:^|\\.)radiovncr\\.com$\n(?:^|\\.)rael\\.org$\n(?:^|\\.)raggedbanner\\.com$\n(?:^|\\.)raidcall\\.com\\.tw$\n(?:^|\\.)raidtalk\\.com\\.tw$\n(?:^|\\.)rainbowplan\\.org$\n(?:^|\\.)raizoji\\.or\\.jp$\n(?:^|\\.)ramcity\\.com\\.au$\n(?:^|\\.)rangwang\\.biz$\n(?:^|\\.)rangzen\\.com$\n(?:^|\\.)rangzen\\.net$\n(?:^|\\.)rangzen\\.org$\n(?:^|\\.)ranyunfei\\.com$\n(?:^|\\.)rapbull\\.net$\n(?:^|\\.)rapidgator\\.net$\n(?:^|\\.)rapidmoviez\\.com$\n(?:^|\\.)rapidvpn\\.com$\n(?:^|\\.)raremovie\\.cc$\n(?:^|\\.)raremovie\\.net$\n(?:^|\\.)rawgit\\.com$\n(?:^|\\.)rawgithub\\.com$\n(?:^|\\.)razyboard\\.com$\n(?:^|\\.)rcam\\.target\\.com$\n(?:^|\\.)rcinet\\.ca$\n(?:^|\\.)rconversation\\.blogs\\.com$\n(?:^|\\.)rd\\.com$\n(?:^|\\.)rdio\\.com$\n(?:^|\\.)read01\\.com$\n(?:^|\\.)read100\\.com$\n(?:^|\\.)readingtimes\\.com\\.tw$\n(?:^|\\.)readmoo\\.com$\n(?:^|\\.)readydown\\.com$\n(?:^|\\.)realcourage\\.org$\n(?:^|\\.)realforum\\.zkiz\\.com$\n(?:^|\\.)realitykings\\.com$\n(?:^|\\.)realraptalk\\.com$\n(?:^|\\.)realsexpass\\.com$\n(?:^|\\.)rebatesrule\\.net$\n(?:^|\\.)recordhistory\\.org$\n(?:^|\\.)recovery\\.org\\.tw$\n(?:^|\\.)recoveryversion\\.com\\.tw$\n(?:^|\\.)red-lang\\.org$\n(?:^|\\.)redballoonsolidarity\\.org$\n(?:^|\\.)redchinacn\\.net$\n(?:^|\\.)redchinacn\\.org$\n(?:^|\\.)redd\\.it$\n(?:^|\\.)reddit\\.com$\n(?:^|\\.)redditlist\\.com$\n(?:^|\\.)redditmedia\\.com$\n(?:^|\\.)redditstatic\\.com$\n(?:^|\\.)redhotlabs\\.com$\n(?:^|\\.)redtube\\.com$\n(?:^|\\.)referer\\.us$\n(?:^|\\.)reflectivecode\\.com$\n(?:^|\\.)registry\\.google$\n(?:^|\\.)relaxbbs\\.com$\n(?:^|\\.)relay\\.com\\.tw$\n(?:^|\\.)releaseinternational\\.org$\n(?:^|\\.)religioustolerance\\.org$\n(?:^|\\.)remembering_tiananmen_20_years$\n(?:^|\\.)renminbao\\.com$\n(?:^|\\.)renyurenquan\\.org$\n(?:^|\\.)research\\.jmsc\\.hku\\.hk$\n(?:^|\\.)resilio\\.com$\n(?:^|\\.)retweeteffect\\.com$\n(?:^|\\.)retweetist\\.com$\n(?:^|\\.)retweetrank\\.com$\n(?:^|\\.)reuters\\.com$\n(?:^|\\.)reutersmedia\\.net$\n(?:^|\\.)revleft\\.com$\n(?:^|\\.)revver\\.com$\n(?:^|\\.)rfa\\.org$\n(?:^|\\.)rfachina\\.com$\n(?:^|\\.)rfalive1\\.akacast\\.akamaistream\\.net$\n(?:^|\\.)rfamobile\\.org$\n(?:^|\\.)rfaweb\\.org$\n(?:^|\\.)rferl\\.org$\n(?:^|\\.)rfi\\.fr$\n(?:^|\\.)rfi\\.my$\n(?:^|\\.)rg3\\.github\\.io$\n(?:^|\\.)rightbtc\\.com$\n(?:^|\\.)rigpa\\.org$\n(?:^|\\.)riku\\.me$\n(?:^|\\.)rileyguide\\.com$\n(?:^|\\.)ritouki\\.jp$\n(?:^|\\.)ritter\\.vg$\n(?:^|\\.)rixcloud\\.com$\n(?:^|\\.)rixcloud\\.us$\n(?:^|\\.)rlwlw\\.com$\n(?:^|\\.)rmjdw\\.com$\n(?:^|\\.)rmjdw132\\.info$\n(?:^|\\.)roadshow\\.hk$\n(?:^|\\.)roboforex\\.com$\n(?:^|\\.)robustnessiskey\\.com$\n(?:^|\\.)rocket-inc\\.net$\n(?:^|\\.)rocksdb\\.org$\n(?:^|\\.)rojo\\.com$\n(?:^|\\.)rolia\\.net$\n(?:^|\\.)ronjoneswriter\\.com$\n(?:^|\\.)roodo\\.com$\n(?:^|\\.)rosechina\\.net$\n(?:^|\\.)rotten\\.com$\n(?:^|\\.)rsdlmonitor\\.com$\n(?:^|\\.)rsf-chinese\\.org$\n(?:^|\\.)rsf\\.org$\n(?:^|\\.)rsgamen\\.org$\n(?:^|\\.)rssmeme\\.com$\n(?:^|\\.)rtalabel\\.org$\n(?:^|\\.)rthk\\.hk$\n(?:^|\\.)rthk\\.org\\.hk$\n(?:^|\\.)rthklive2-lh\\.akamaihd\\.net$\n(?:^|\\.)rti\\.org\\.tw$\n(?:^|\\.)rtycminnesota\\.org$\n(?:^|\\.)ruanyifeng\\.com$\n(?:^|\\.)rukor\\.org$\n(?:^|\\.)runbtx\\.com$\n(?:^|\\.)rushbee\\.com$\n(?:^|\\.)ruten\\.com\\.tw$\n(?:^|\\.)rutube\\.ru$\n(?:^|\\.)ruyiseek\\.com$\n(?:^|\\.)rxhj\\.net$\n(?:^|\\.)s-cute\\.com$\n(?:^|\\.)s-dragon\\.org$\n(?:^|\\.)s1\\.nudezz\\.com$\n(?:^|\\.)s1heng\\.com$\n(?:^|\\.)s1s1s1\\.com$\n(?:^|\\.)s3-ap-northeast-1\\.amazonaws\\.com$\n(?:^|\\.)s3-ap-southeast-2\\.amazonaws\\.com$\n(?:^|\\.)s8forum\\.com$\n(?:^|\\.)sa\\.hao123\\.com$\n(?:^|\\.)sacks\\.com$\n(?:^|\\.)sacom\\.hk$\n(?:^|\\.)sadistic-v\\.com$\n(?:^|\\.)sadpanda\\.us$\n(?:^|\\.)safervpn\\.com$\n(?:^|\\.)safety\\.google$\n(?:^|\\.)saintyculture\\.com$\n(?:^|\\.)saiq\\.me$\n(?:^|\\.)sakuralive\\.com$\n(?:^|\\.)sakya\\.org$\n(?:^|\\.)salvation\\.org\\.hk$\n(?:^|\\.)samair\\.ru$\n(?:^|\\.)sambhota\\.org$\n(?:^|\\.)sanmin\\.com\\.tw$\n(?:^|\\.)sapikachu\\.net$\n(?:^|\\.)saveliuxiaobo\\.com$\n(?:^|\\.)savemedia\\.com$\n(?:^|\\.)savethedate\\.foo$\n(?:^|\\.)savethesounds\\.info$\n(?:^|\\.)savetibet\\.de$\n(?:^|\\.)savetibet\\.fr$\n(?:^|\\.)savetibet\\.nl$\n(?:^|\\.)savetibet\\.org$\n(?:^|\\.)savetibet\\.ru$\n(?:^|\\.)savetibetstore\\.org$\n(?:^|\\.)savevid\\.com$\n(?:^|\\.)say2\\.info$\n(?:^|\\.)sbme\\.me$\n(?:^|\\.)sbs\\.com\\.au$\n(?:^|\\.)scache\\.vzw\\.com$\n(?:^|\\.)scache1\\.vzw\\.com$\n(?:^|\\.)scache2\\.vzw\\.com$\n(?:^|\\.)scasino\\.com$\n(?:^|\\.)schema\\.org$\n(?:^|\\.)sciencenets\\.com$\n(?:^|\\.)scieron\\.com$\n(?:^|\\.)scmp\\.com$\n(?:^|\\.)scmpchinese\\.com$\n(?:^|\\.)scramble\\.io$\n(?:^|\\.)scribd\\.com$\n(?:^|\\.)scriptspot\\.com$\n(?:^|\\.)seapuff\\.com$\n(?:^|\\.)search$\n(?:^|\\.)search\\.aol\\.com$\n(?:^|\\.)search\\.yahoo\\.co\\.jp$\n(?:^|\\.)search\\.yahoo\\.com$\n(?:^|\\.)searchtruth\\.com$\n(?:^|\\.)secretchina\\.com$\n(?:^|\\.)secretgarden\\.no$\n(?:^|\\.)secretsline\\.biz$\n(?:^|\\.)secure\\.hustler\\.com$\n(?:^|\\.)secure\\.logmein\\.com$\n(?:^|\\.)secure\\.raxcdn\\.com$\n(?:^|\\.)securetunnel\\.com$\n(?:^|\\.)securityinabox\\.org$\n(?:^|\\.)securitykiss\\.com$\n(?:^|\\.)seed4\\.me$\n(?:^|\\.)seesmic\\.com$\n(?:^|\\.)seevpn\\.com$\n(?:^|\\.)seezone\\.net$\n(?:^|\\.)sejie\\.com$\n(?:^|\\.)sellclassics\\.com$\n(?:^|\\.)sendsmtp\\.com$\n(?:^|\\.)sendspace\\.com$\n(?:^|\\.)servehttp\\.com$\n(?:^|\\.)serveuser\\.com$\n(?:^|\\.)serveusers\\.com$\n(?:^|\\.)sesawe\\.net$\n(?:^|\\.)sesawe\\.org$\n(?:^|\\.)sethwklein\\.net$\n(?:^|\\.)setn\\.com$\n(?:^|\\.)settv\\.com\\.tw$\n(?:^|\\.)sevenload\\.com$\n(?:^|\\.)sex-11\\.com$\n(?:^|\\.)sex\\.com$\n(?:^|\\.)sex3\\.com$\n(?:^|\\.)sex8\\.cc$\n(?:^|\\.)sexandsubmission\\.com$\n(?:^|\\.)sexbot\\.com$\n(?:^|\\.)sexhu\\.com$\n(?:^|\\.)sexhuang\\.com$\n(?:^|\\.)sexidude\\.com$\n(?:^|\\.)sexinsex\\.net$\n(?:^|\\.)sextvx\\.com$\n(?:^|\\.)sexxxy\\.biz$\n(?:^|\\.)sfileydy\\.com$\n(?:^|\\.)sfshibao\\.com$\n(?:^|\\.)sftindia\\.org$\n(?:^|\\.)sftuk\\.org$\n(?:^|\\.)shadeyouvpn\\.com$\n(?:^|\\.)shadow\\.ma$\n(?:^|\\.)shadowsky\\.xyz$\n(?:^|\\.)shadowsocks-r\\.com$\n(?:^|\\.)shadowsocks\\.asia$\n(?:^|\\.)shadowsocks\\.be$\n(?:^|\\.)shadowsocks\\.com$\n(?:^|\\.)shadowsocks\\.com\\.hk$\n(?:^|\\.)shadowsocks\\.org$\n(?:^|\\.)shadowsocks9\\.com$\n(?:^|\\.)shambalapost\\.com$\n(?:^|\\.)shambhalasun\\.com$\n(?:^|\\.)shangfang\\.org$\n(?:^|\\.)shapeservices\\.com$\n(?:^|\\.)share\\.america\\.gov$\n(?:^|\\.)share\\.dmhy\\.org$\n(?:^|\\.)share\\.ovi\\.com$\n(?:^|\\.)share\\.youthwant\\.com\\.tw$\n(?:^|\\.)sharebee\\.com$\n(?:^|\\.)sharecool\\.org$\n(?:^|\\.)sharpdaily\\.com\\.hk$\n(?:^|\\.)sharpdaily\\.hk$\n(?:^|\\.)sharpdaily\\.tw$\n(?:^|\\.)shat-tibet\\.com$\n(?:^|\\.)shattered\\.io$\n(?:^|\\.)sheikyermami\\.com$\n(?:^|\\.)shellfire\\.de$\n(?:^|\\.)shenshou\\.org$\n(?:^|\\.)shenyun\\.com$\n(?:^|\\.)shenyunperformingarts\\.org$\n(?:^|\\.)shenzhoufilm\\.com$\n(?:^|\\.)sherabgyaltsen\\.com$\n(?:^|\\.)shiatv\\.net$\n(?:^|\\.)shicheng\\.org$\n(?:^|\\.)shiksha\\.com$\n(?:^|\\.)shinychan\\.com$\n(?:^|\\.)shipcamouflage\\.com$\n(?:^|\\.)shireyishunjian\\.com$\n(?:^|\\.)shitaotv\\.org$\n(?:^|\\.)shixiao\\.org$\n(?:^|\\.)shizhao\\.org$\n(?:^|\\.)shkspr\\.mobi$\n(?:^|\\.)shodanhq\\.com$\n(?:^|\\.)shooshtime\\.com$\n(?:^|\\.)shop2000\\.com\\.tw$\n(?:^|\\.)shopping\\.com$\n(?:^|\\.)showbiz\\.omy\\.sg$\n(?:^|\\.)showhaotu\\.com$\n(?:^|\\.)showtime\\.jp$\n(?:^|\\.)shutterstock\\.com$\n(?:^|\\.)shwchurch\\.org$\n(?:^|\\.)shwchurch3\\.com$\n(?:^|\\.)siddharthasintent\\.org$\n(?:^|\\.)sidelinesnews\\.com$\n(?:^|\\.)sidelinessportseatery\\.com$\n(?:^|\\.)sierrafriendsoftibet\\.org$\n(?:^|\\.)sijihuisuo\\.club$\n(?:^|\\.)sijihuisuo\\.com$\n(?:^|\\.)sikaozhe1997\\.github\\.io$\n(?:^|\\.)silkbook\\.com$\n(?:^|\\.)simbolostwitter\\.com$\n(?:^|\\.)simplecd\\.org$\n(?:^|\\.)simpleproductivityblog\\.com$\n(?:^|\\.)sinchew\\.com\\.my$\n(?:^|\\.)singaporepools\\.com\\.sg$\n(?:^|\\.)singfortibet\\.com$\n(?:^|\\.)singpao\\.com\\.hk$\n(?:^|\\.)singtao\\.com$\n(?:^|\\.)singtaousa\\.com$\n(?:^|\\.)sino-monthly\\.com$\n(?:^|\\.)sinoants\\.com$\n(?:^|\\.)sinocast\\.com$\n(?:^|\\.)sinocism\\.com$\n(?:^|\\.)sinomontreal\\.ca$\n(?:^|\\.)sinonet\\.ca$\n(?:^|\\.)sinopitt\\.info$\n(?:^|\\.)sinoquebec\\.com$\n(?:^|\\.)sipml5\\.org$\n(?:^|\\.)sis\\.xxx$\n(?:^|\\.)sis001\\.com$\n(?:^|\\.)sis001\\.us$\n(?:^|\\.)site2unblock\\.com$\n(?:^|\\.)site90\\.net$\n(?:^|\\.)sitebro\\.tw$\n(?:^|\\.)sitekreator\\.com$\n(?:^|\\.)siteks\\.uk\\.to$\n(?:^|\\.)sitemaps\\.org$\n(?:^|\\.)six-degrees\\.io$\n(?:^|\\.)sixth\\.biz$\n(?:^|\\.)sjrt\\.org$\n(?:^|\\.)sjum\\.cn$\n(?:^|\\.)sketchappsources\\.com$\n(?:^|\\.)skimtube\\.com$\n(?:^|\\.)skybet\\.com$\n(?:^|\\.)skyking\\.com\\.tw$\n(?:^|\\.)skyvegas\\.com$\n(?:^|\\.)skyxvpn\\.com$\n(?:^|\\.)slacker\\.com$\n(?:^|\\.)slaytizle\\.com$\n(?:^|\\.)sleazydream\\.com$\n(?:^|\\.)slheng\\.com$\n(?:^|\\.)slickvpn\\.com$\n(?:^|\\.)slideshare\\.net$\n(?:^|\\.)slinkset\\.com$\n(?:^|\\.)slutload\\.com$\n(?:^|\\.)slutmoonbeam\\.com$\n(?:^|\\.)slyip\\.com$\n(?:^|\\.)slyip\\.net$\n(?:^|\\.)sm-miracle\\.com$\n(?:^|\\.)smartdnsproxy\\.com$\n(?:^|\\.)smarthide\\.com$\n(?:^|\\.)smchbooks\\.com$\n(?:^|\\.)smh\\.com\\.au$\n(?:^|\\.)smhric\\.org$\n(?:^|\\.)smith\\.edu$\n(?:^|\\.)smyxy\\.org$\n(?:^|\\.)snapchat\\.com$\n(?:^|\\.)snaptu\\.com$\n(?:^|\\.)sndcdn\\.com$\n(?:^|\\.)sneakme\\.net$\n(?:^|\\.)snowlionpub\\.com$\n(?:^|\\.)sobees\\.com$\n(?:^|\\.)soc\\.mil$\n(?:^|\\.)socialwhale\\.com$\n(?:^|\\.)socks-proxy\\.net$\n(?:^|\\.)sockscap64\\.com$\n(?:^|\\.)sockslist\\.net$\n(?:^|\\.)socrec\\.org$\n(?:^|\\.)sod\\.co\\.jp$\n(?:^|\\.)sodatea\\.github\\.io$\n(?:^|\\.)softether-download\\.com$\n(?:^|\\.)softether\\.co\\.jp$\n(?:^|\\.)softether\\.org$\n(?:^|\\.)softfamous\\.com$\n(?:^|\\.)softsmirror\\.cf$\n(?:^|\\.)softwarebychuck\\.com$\n(?:^|\\.)softwaredownload\\.gitbooks\\.io$\n(?:^|\\.)sogclub\\.com$\n(?:^|\\.)sogrady\\.me$\n(?:^|\\.)soh\\.tw$\n(?:^|\\.)sohcradio\\.com$\n(?:^|\\.)sohfrance\\.org$\n(?:^|\\.)sokamonline\\.com$\n(?:^|\\.)sokmil\\.com$\n(?:^|\\.)solarsystem\\.nasa\\.gov$\n(?:^|\\.)solidaritetibet\\.org$\n(?:^|\\.)solidfiles\\.com$\n(?:^|\\.)somee\\.com$\n(?:^|\\.)songjianjun\\.com$\n(?:^|\\.)sonicbbs\\.cc$\n(?:^|\\.)sonidodelaesperanza\\.org$\n(?:^|\\.)sopcast\\.com$\n(?:^|\\.)sopcast\\.org$\n(?:^|\\.)sorazone\\.net$\n(?:^|\\.)sorting-algorithms\\.com$\n(?:^|\\.)sos\\.org$\n(?:^|\\.)sosreader\\.com$\n(?:^|\\.)sostibet\\.org$\n(?:^|\\.)soubory\\.com$\n(?:^|\\.)soul-plus\\.net$\n(?:^|\\.)soulcaliburhentai\\.net$\n(?:^|\\.)soumo\\.info$\n(?:^|\\.)soundcloud\\.com$\n(?:^|\\.)soundofhope\\.kr$\n(?:^|\\.)soundofhope\\.org$\n(?:^|\\.)soup\\.io$\n(?:^|\\.)soupofmedia\\.com$\n(?:^|\\.)sourceforge\\.net$\n(?:^|\\.)sourcewadio\\.com$\n(?:^|\\.)southnews\\.com\\.tw$\n(?:^|\\.)sowers\\.org\\.hk$\n(?:^|\\.)soylentnews\\.org$\n(?:^|\\.)spaces\\.hightail\\.com$\n(?:^|\\.)spankbang\\.com$\n(?:^|\\.)spankingtube\\.com$\n(?:^|\\.)spankwire\\.com$\n(?:^|\\.)spb\\.com$\n(?:^|\\.)speakerdeck\\.com$\n(?:^|\\.)specxinzl\\.jigsy\\.com$\n(?:^|\\.)speedify\\.com$\n(?:^|\\.)spem\\.at$\n(?:^|\\.)spencertipping\\.com$\n(?:^|\\.)spendee\\.com$\n(?:^|\\.)spicevpn\\.com$\n(?:^|\\.)spideroak\\.com$\n(?:^|\\.)spike\\.com$\n(?:^|\\.)sports\\.williamhill\\.com$\n(?:^|\\.)spotflux\\.com$\n(?:^|\\.)spotify\\.com$\n(?:^|\\.)spreadshirt\\.es$\n(?:^|\\.)spring4u\\.info$\n(?:^|\\.)springboardplatform\\.com$\n(?:^|\\.)sprite\\.org$\n(?:^|\\.)sproutcore\\.com$\n(?:^|\\.)sproxy\\.info$\n(?:^|\\.)squirly\\.info$\n(?:^|\\.)srcf\\.ucam\\.org$\n(?:^|\\.)srocket\\.us$\n(?:^|\\.)ss-link\\.com$\n(?:^|\\.)ss\\.carryzhou\\.com$\n(?:^|\\.)ss\\.levyhsu\\.com$\n(?:^|\\.)ss\\.pythonic\\.life$\n(?:^|\\.)ss7\\.vzw\\.com$\n(?:^|\\.)ssglobal\\.co$\n(?:^|\\.)ssglobal\\.me$\n(?:^|\\.)ssh91\\.com$\n(?:^|\\.)ssl\\.webpack\\.de$\n(?:^|\\.)ssl443\\.org$\n(?:^|\\.)sspanel\\.net$\n(?:^|\\.)sspro\\.ml$\n(?:^|\\.)ssr\\.tools$\n(?:^|\\.)ssrshare\\.com$\n(?:^|\\.)sss\\.camp$\n(?:^|\\.)sstmlt\\.moe$\n(?:^|\\.)sstmlt\\.net$\n(?:^|\\.)stackoverflow\\.com$\n(?:^|\\.)stage64\\.hk$\n(?:^|\\.)standupfortibet\\.org$\n(?:^|\\.)stanford\\.edu$\n(?:^|\\.)starfishfx\\.com$\n(?:^|\\.)starp2p\\.com$\n(?:^|\\.)startpage\\.com$\n(?:^|\\.)startuplivingchina\\.com$\n(?:^|\\.)stat\\.gov\\.tw$\n(?:^|\\.)static-economist\\.com$\n(?:^|\\.)static\\.comico\\.tw$\n(?:^|\\.)static\\.shemalez\\.com$\n(?:^|\\.)static01\\.nyt\\.com$\n(?:^|\\.)staticflickr\\.com$\n(?:^|\\.)statueofdemocracy\\.org$\n(?:^|\\.)stc\\.com\\.sa$\n(?:^|\\.)steamcommunity\\.com$\n(?:^|\\.)steel-storm\\.com$\n(?:^|\\.)steemit\\.com$\n(?:^|\\.)steganos\\.com$\n(?:^|\\.)steganos\\.net$\n(?:^|\\.)stepchina\\.com$\n(?:^|\\.)stephaniered\\.com$\n(?:^|\\.)sthoo\\.com$\n(?:^|\\.)stickam\\.com$\n(?:^|\\.)stickeraction\\.com$\n(?:^|\\.)stileproject\\.com$\n(?:^|\\.)sto\\.cc$\n(?:^|\\.)stoporganharvesting\\.org$\n(?:^|\\.)stoptibetcrisis\\.net$\n(?:^|\\.)storagenewsletter\\.com$\n(?:^|\\.)store\\.steampowered\\.com$\n(?:^|\\.)stories\\.google$\n(?:^|\\.)storify\\.com$\n(?:^|\\.)storm\\.mg$\n(?:^|\\.)stormmediagroup\\.com$\n(?:^|\\.)stoweboyd\\.com$\n(?:^|\\.)stranabg\\.com$\n(?:^|\\.)straplessdildo\\.com$\n(?:^|\\.)streamingthe\\.net$\n(?:^|\\.)streema\\.com$\n(?:^|\\.)strikingly\\.com$\n(?:^|\\.)strongvpn\\.com$\n(?:^|\\.)strongwindpress\\.com$\n(?:^|\\.)student\\.tw$\n(?:^|\\.)studentsforafreetibet\\.org$\n(?:^|\\.)stumbleupon\\.com$\n(?:^|\\.)stupidvideos\\.com$\n(?:^|\\.)subacme\\.rerouted\\.org$\n(?:^|\\.)successfn\\.com$\n(?:^|\\.)sugarsync\\.com$\n(?:^|\\.)sugobbs\\.com$\n(?:^|\\.)sugumiru18\\.com$\n(?:^|\\.)suissl\\.com$\n(?:^|\\.)sujiatun\\.wordpress\\.com$\n(?:^|\\.)sukebei\\.nyaa\\.si$\n(?:^|\\.)sulian\\.me$\n(?:^|\\.)summify\\.com$\n(?:^|\\.)sumrando\\.com$\n(?:^|\\.)sun1911\\.com$\n(?:^|\\.)sunmedia\\.ca$\n(?:^|\\.)sunporno\\.com$\n(?:^|\\.)sunskyforum\\.com$\n(?:^|\\.)sunta\\.com\\.tw$\n(?:^|\\.)sunvpn\\.net$\n(?:^|\\.)sunwinism\\.joinbbs\\.net$\n(?:^|\\.)suoluo\\.org$\n(?:^|\\.)supchina\\.com$\n(?:^|\\.)superfreevpn\\.com$\n(?:^|\\.)superokayama\\.com$\n(?:^|\\.)superpages\\.com$\n(?:^|\\.)supervpn\\.net$\n(?:^|\\.)superzooi\\.com$\n(?:^|\\.)suppig\\.net$\n(?:^|\\.)suprememastertv\\.com$\n(?:^|\\.)surfeasy\\.com$\n(?:^|\\.)surfeasy\\.com\\.au$\n(?:^|\\.)suroot\\.com$\n(?:^|\\.)surrenderat20\\.net$\n(?:^|\\.)sustainability\\.google$\n(?:^|\\.)suyangg\\.com$\n(?:^|\\.)svsfx\\.com$\n(?:^|\\.)swagbucks\\.com$\n(?:^|\\.)swissinfo\\.ch$\n(?:^|\\.)swissvpn\\.net$\n(?:^|\\.)switch1\\.jp$\n(?:^|\\.)switchvpn\\.net$\n(?:^|\\.)sydneytoday\\.com$\n(?:^|\\.)sylfoundation\\.org$\n(?:^|\\.)syncback\\.com$\n(?:^|\\.)synergyse\\.com$\n(?:^|\\.)sysresccd\\.org$\n(?:^|\\.)sytes\\.net$\n(?:^|\\.)szbbs\\.net$\n(?:^|\\.)szetowah\\.org\\.hk$\n(?:^|\\.)t-g\\.com$\n(?:^|\\.)t\\.co$\n(?:^|\\.)t\\.me$\n(?:^|\\.)t\\.orzdream\\.com$\n(?:^|\\.)t35\\.com$\n(?:^|\\.)t66y\\.com$\n(?:^|\\.)taa-usa\\.org$\n(?:^|\\.)taaze\\.tw$\n(?:^|\\.)tabtter\\.jp$\n(?:^|\\.)tacc\\.cwb\\.gov\\.tw$\n(?:^|\\.)tacem\\.org$\n(?:^|\\.)taconet\\.com\\.tw$\n(?:^|\\.)taedp\\.org\\.tw$\n(?:^|\\.)tafm\\.org$\n(?:^|\\.)tagwa\\.org\\.au$\n(?:^|\\.)tagwalk\\.com$\n(?:^|\\.)tahr\\.org\\.tw$\n(?:^|\\.)taipei\\.gov\\.tw$\n(?:^|\\.)taipeisociety\\.org$\n(?:^|\\.)taiwan-sex\\.com$\n(?:^|\\.)taiwanbible\\.com$\n(?:^|\\.)taiwancon\\.com$\n(?:^|\\.)taiwandaily\\.net$\n(?:^|\\.)taiwandc\\.org$\n(?:^|\\.)taiwanjobs\\.gov\\.tw$\n(?:^|\\.)taiwanjustice\\.com$\n(?:^|\\.)taiwanjustice\\.net$\n(?:^|\\.)taiwankiss\\.com$\n(?:^|\\.)taiwannation\\.50webs\\.com$\n(?:^|\\.)taiwannation\\.com$\n(?:^|\\.)taiwannation\\.com\\.tw$\n(?:^|\\.)taiwanncf\\.org\\.tw$\n(?:^|\\.)taiwannews\\.com\\.tw$\n(?:^|\\.)taiwantp\\.net$\n(?:^|\\.)taiwantt\\.org\\.tw$\n(?:^|\\.)taiwanus\\.net$\n(?:^|\\.)taiwanyes\\.com$\n(?:^|\\.)taiwanyes\\.ning\\.com$\n(?:^|\\.)talk853\\.com$\n(?:^|\\.)talkboxapp\\.com$\n(?:^|\\.)talkcc\\.com$\n(?:^|\\.)talkonly\\.net$\n(?:^|\\.)tamiaode\\.tk$\n(?:^|\\.)tanc\\.org$\n(?:^|\\.)tangben\\.com$\n(?:^|\\.)tangren\\.us$\n(?:^|\\.)taoism\\.net$\n(?:^|\\.)taolun\\.info$\n(?:^|\\.)tapanwap\\.com$\n(?:^|\\.)tapatalk\\.com$\n(?:^|\\.)tarr\\.uspto\\.gov$\n(?:^|\\.)tascn\\.com\\.au$\n(?:^|\\.)taup\\.net$\n(?:^|\\.)taweet\\.com$\n(?:^|\\.)tbcollege\\.org$\n(?:^|\\.)tbi\\.org\\.hk$\n(?:^|\\.)tbicn\\.org$\n(?:^|\\.)tbjyt\\.org$\n(?:^|\\.)tbpic\\.info$\n(?:^|\\.)tbrc\\.org$\n(?:^|\\.)tbs-rainbow\\.org$\n(?:^|\\.)tbsec\\.org$\n(?:^|\\.)tbskkinabalu\\.page\\.tl$\n(?:^|\\.)tbsmalaysia\\.org$\n(?:^|\\.)tbsn\\.org$\n(?:^|\\.)tbsseattle\\.org$\n(?:^|\\.)tbssqh\\.org$\n(?:^|\\.)tbswd\\.org$\n(?:^|\\.)tbtemple\\.org\\.uk$\n(?:^|\\.)tbthouston\\.org$\n(?:^|\\.)tccwonline\\.org$\n(?:^|\\.)tcewf\\.org$\n(?:^|\\.)tchrd\\.org$\n(?:^|\\.)tcnynj\\.org$\n(?:^|\\.)tcpspeed\\.co$\n(?:^|\\.)tcpspeed\\.com$\n(?:^|\\.)tcsofbc\\.org$\n(?:^|\\.)tcsovi\\.org$\n(?:^|\\.)tdm\\.com\\.mo$\n(?:^|\\.)teachparentstech\\.org$\n(?:^|\\.)teamamericany\\.com$\n(?:^|\\.)tech2\\.in\\.com$\n(?:^|\\.)techviz\\.net$\n(?:^|\\.)teck\\.in$\n(?:^|\\.)teco-hk\\.org$\n(?:^|\\.)teco-mo\\.org$\n(?:^|\\.)teddysun\\.com$\n(?:^|\\.)teeniefuck\\.net$\n(?:^|\\.)teensinasia\\.com$\n(?:^|\\.)telecomspace\\.com$\n(?:^|\\.)telegram\\.dog$\n(?:^|\\.)telegram\\.me$\n(?:^|\\.)telegram\\.org$\n(?:^|\\.)telegramdownload\\.com$\n(?:^|\\.)telegraph\\.co\\.uk$\n(?:^|\\.)telesco\\.pe$\n(?:^|\\.)tellme\\.pw$\n(?:^|\\.)tenacy\\.com$\n(?:^|\\.)tensorflow\\.org$\n(?:^|\\.)tenzinpalmo\\.com$\n(?:^|\\.)terminus2049\\.github\\.io$\n(?:^|\\.)tew\\.org$\n(?:^|\\.)textnow\\.me$\n(?:^|\\.)tfhub\\.dev$\n(?:^|\\.)th\\.hao123\\.com$\n(?:^|\\.)thaicn\\.com$\n(?:^|\\.)thb\\.gov\\.tw$\n(?:^|\\.)theatrum-belli\\.com$\n(?:^|\\.)thebcomplex\\.com$\n(?:^|\\.)theblemish\\.com$\n(?:^|\\.)thebobs\\.com$\n(?:^|\\.)thebodyshop-usa\\.com$\n(?:^|\\.)thecenter\\.mit\\.edu$\n(?:^|\\.)thechinabeat\\.org$\n(?:^|\\.)thedalailamamovie\\.com$\n(?:^|\\.)thedw\\.us$\n(?:^|\\.)thefacebook\\.com$\n(?:^|\\.)thefrontier\\.hk$\n(?:^|\\.)thegioitinhoc\\.vn$\n(?:^|\\.)thegly\\.com$\n(?:^|\\.)thehots\\.info$\n(?:^|\\.)thehousenews\\.com$\n(?:^|\\.)thehun\\.net$\n(?:^|\\.)theinitium\\.com$\n(?:^|\\.)thenewslens\\.com$\n(?:^|\\.)thepiratebay\\.org$\n(?:^|\\.)theporndude\\.com$\n(?:^|\\.)theportalwiki\\.com$\n(?:^|\\.)thereallove\\.kr$\n(?:^|\\.)therock\\.net\\.nz$\n(?:^|\\.)thespeeder\\.com$\n(?:^|\\.)thestandnews\\.com$\n(?:^|\\.)thetibetcenter\\.org$\n(?:^|\\.)thetibetconnection\\.org$\n(?:^|\\.)thetibetmuseum\\.org$\n(?:^|\\.)thetibetpost\\.com$\n(?:^|\\.)thetinhat\\.com$\n(?:^|\\.)thetrotskymovie\\.com$\n(?:^|\\.)thevivekspot\\.com$\n(?:^|\\.)thewgo\\.org$\n(?:^|\\.)theync\\.com$\n(?:^|\\.)thinkgeek\\.com$\n(?:^|\\.)thinkingtaiwan\\.com$\n(?:^|\\.)thinkwithgoogle\\.com$\n(?:^|\\.)thisav\\.com$\n(?:^|\\.)thlib\\.org$\n(?:^|\\.)thomasbernhard\\.org$\n(?:^|\\.)thongdreams\\.com$\n(?:^|\\.)threatchaos\\.com$\n(?:^|\\.)throughnightsfire\\.com$\n(?:^|\\.)thumbzilla\\.com$\n(?:^|\\.)thywords\\.com$\n(?:^|\\.)thywords\\.com\\.tw$\n(?:^|\\.)tiananmenduizhi\\.com$\n(?:^|\\.)tiananmenmother\\.org$\n(?:^|\\.)tiananmenuniv\\.com$\n(?:^|\\.)tiananmenuniv\\.net$\n(?:^|\\.)tiandixing\\.org$\n(?:^|\\.)tianhuayuan\\.com$\n(?:^|\\.)tianlawoffice\\.com$\n(?:^|\\.)tianti\\.io$\n(?:^|\\.)tiantibooks\\.org$\n(?:^|\\.)tianyantong\\.org\\.cn$\n(?:^|\\.)tianzhu\\.org$\n(?:^|\\.)tibet-envoy\\.eu$\n(?:^|\\.)tibet-foundation\\.org$\n(?:^|\\.)tibet-house-trust\\.co\\.uk$\n(?:^|\\.)tibet-info\\.net$\n(?:^|\\.)tibet-initiative\\.de$\n(?:^|\\.)tibet-munich\\.de$\n(?:^|\\.)tibet\\.a\\.se$\n(?:^|\\.)tibet\\.at$\n(?:^|\\.)tibet\\.ca$\n(?:^|\\.)tibet\\.com$\n(?:^|\\.)tibet\\.fr$\n(?:^|\\.)tibet\\.net$\n(?:^|\\.)tibet\\.nu$\n(?:^|\\.)tibet\\.org$\n(?:^|\\.)tibet\\.org\\.tw$\n(?:^|\\.)tibet\\.sk$\n(?:^|\\.)tibet\\.to$\n(?:^|\\.)tibet3rdpole\\.org$\n(?:^|\\.)tibetaction\\.net$\n(?:^|\\.)tibetaid\\.org$\n(?:^|\\.)tibetalk\\.com$\n(?:^|\\.)tibetan-alliance\\.org$\n(?:^|\\.)tibetan\\.fr$\n(?:^|\\.)tibetanaidproject\\.org$\n(?:^|\\.)tibetanarts\\.org$\n(?:^|\\.)tibetanbuddhistinstitute\\.org$\n(?:^|\\.)tibetancommunity\\.org$\n(?:^|\\.)tibetancommunityuk\\.net$\n(?:^|\\.)tibetanculture\\.org$\n(?:^|\\.)tibetanfeministcollective\\.org$\n(?:^|\\.)tibetanjournal\\.com$\n(?:^|\\.)tibetanlanguage\\.org$\n(?:^|\\.)tibetanliberation\\.org$\n(?:^|\\.)tibetanpaintings\\.com$\n(?:^|\\.)tibetanphotoproject\\.com$\n(?:^|\\.)tibetanpoliticalreview\\.org$\n(?:^|\\.)tibetanreview\\.net$\n(?:^|\\.)tibetansports\\.org$\n(?:^|\\.)tibetanwomen\\.org$\n(?:^|\\.)tibetanyouth\\.org$\n(?:^|\\.)tibetanyouthcongress\\.org$\n(?:^|\\.)tibetcharity\\.dk$\n(?:^|\\.)tibetcharity\\.in$\n(?:^|\\.)tibetchild\\.org$\n(?:^|\\.)tibetcity\\.com$\n(?:^|\\.)tibetcollection\\.com$\n(?:^|\\.)tibetcorps\\.org$\n(?:^|\\.)tibetexpress\\.net$\n(?:^|\\.)tibetfocus\\.com$\n(?:^|\\.)tibetfund\\.org$\n(?:^|\\.)tibetgermany\\.com$\n(?:^|\\.)tibetgermany\\.de$\n(?:^|\\.)tibethaus\\.com$\n(?:^|\\.)tibetheritagefund\\.org$\n(?:^|\\.)tibethouse\\.jp$\n(?:^|\\.)tibethouse\\.org$\n(?:^|\\.)tibethouse\\.us$\n(?:^|\\.)tibetinfonet\\.net$\n(?:^|\\.)tibetjustice\\.org$\n(?:^|\\.)tibetkomite\\.dk$\n(?:^|\\.)tibetlibre\\.free\\.fr$\n(?:^|\\.)tibetmuseum\\.org$\n(?:^|\\.)tibetnetwork\\.org$\n(?:^|\\.)tibetoffice\\.ch$\n(?:^|\\.)tibetoffice\\.com\\.au$\n(?:^|\\.)tibetoffice\\.eu$\n(?:^|\\.)tibetoffice\\.org$\n(?:^|\\.)tibetonline\\.com$\n(?:^|\\.)tibetonline\\.tv$\n(?:^|\\.)tibetoralhistory\\.org$\n(?:^|\\.)tibetpolicy\\.eu$\n(?:^|\\.)tibetrelieffund\\.co\\.uk$\n(?:^|\\.)tibetsites\\.com$\n(?:^|\\.)tibetsociety\\.com$\n(?:^|\\.)tibetsun\\.com$\n(?:^|\\.)tibetsupportgroup\\.org$\n(?:^|\\.)tibetswiss\\.ch$\n(?:^|\\.)tibettelegraph\\.com$\n(?:^|\\.)tibettimes\\.net$\n(?:^|\\.)tibetwrites\\.org$\n(?:^|\\.)ticket\\.com\\.tw$\n(?:^|\\.)tigervpn\\.com$\n(?:^|\\.)tiltbrush\\.com$\n(?:^|\\.)timdir\\.com$\n(?:^|\\.)time\\.com$\n(?:^|\\.)times\\.hinet\\.net$\n(?:^|\\.)timesofindia\\.indiatimes\\.com$\n(?:^|\\.)timsah\\.com$\n(?:^|\\.)tinc-vpn\\.org$\n(?:^|\\.)tineye\\.com$\n(?:^|\\.)tintuc101\\.com$\n(?:^|\\.)tiny\\.cc$\n(?:^|\\.)tinychat\\.com$\n(?:^|\\.)tinypaste\\.com$\n(?:^|\\.)tipo\\.gov\\.tw$\n(?:^|\\.)tistory\\.com$\n(?:^|\\.)tkcs-collins\\.com$\n(?:^|\\.)tl\\.gd$\n(?:^|\\.)tma\\.co\\.jp$\n(?:^|\\.)tmagazine\\.com$\n(?:^|\\.)tmdfish\\.com$\n(?:^|\\.)tmi\\.me$\n(?:^|\\.)tmpp\\.org$\n(?:^|\\.)tn1\\.shemalez\\.com$\n(?:^|\\.)tn2\\.shemalez\\.com$\n(?:^|\\.)tn3\\.shemalez\\.com$\n(?:^|\\.)tnaflix\\.com$\n(?:^|\\.)tngrnow\\.com$\n(?:^|\\.)tngrnow\\.net$\n(?:^|\\.)tnp\\.org$\n(?:^|\\.)to-porno\\.com$\n(?:^|\\.)togetter\\.com$\n(?:^|\\.)toh\\.info$\n(?:^|\\.)tokyo-247\\.com$\n(?:^|\\.)tokyo-hot\\.com$\n(?:^|\\.)tokyo-porn-tube\\.com$\n(?:^|\\.)tokyocn\\.com$\n(?:^|\\.)tongil\\.or\\.kr$\n(?:^|\\.)tono-oka\\.jp$\n(?:^|\\.)tonyyan\\.net$\n(?:^|\\.)toodoc\\.com$\n(?:^|\\.)toonel\\.net$\n(?:^|\\.)top\\.tv$\n(?:^|\\.)top10vpn\\.com$\n(?:^|\\.)top81\\.ws$\n(?:^|\\.)topbtc\\.com$\n(?:^|\\.)topic\\.youthwant\\.com\\.tw$\n(?:^|\\.)topnews\\.in$\n(?:^|\\.)toppornsites\\.com$\n(?:^|\\.)topshareware\\.com$\n(?:^|\\.)topsy\\.com$\n(?:^|\\.)toptip\\.ca$\n(?:^|\\.)tor\\.blingblingsquad\\.net$\n(?:^|\\.)tor\\.cn\\.uptodown\\.com$\n(?:^|\\.)tor\\.updatestar\\.com$\n(?:^|\\.)tora\\.to$\n(?:^|\\.)torcn\\.com$\n(?:^|\\.)torguard\\.net$\n(?:^|\\.)torproject\\.org$\n(?:^|\\.)torrentprivacy\\.com$\n(?:^|\\.)torrentproject\\.se$\n(?:^|\\.)torrenty\\.org$\n(?:^|\\.)torrentz\\.eu$\n(?:^|\\.)torvpn\\.com$\n(?:^|\\.)tosh\\.comedycentral\\.com$\n(?:^|\\.)totalvpn\\.com$\n(?:^|\\.)toutiaoabc\\.com$\n(?:^|\\.)toutyrater\\.github\\.io$\n(?:^|\\.)towngain\\.com$\n(?:^|\\.)toypark\\.in$\n(?:^|\\.)toythieves\\.com$\n(?:^|\\.)toytractorshow\\.com$\n(?:^|\\.)tparents\\.org$\n(?:^|\\.)tpi\\.org\\.tw$\n(?:^|\\.)tracfone\\.com$\n(?:^|\\.)traffichaus\\.com$\n(?:^|\\.)trans\\.wenweipo\\.com$\n(?:^|\\.)transparency\\.org$\n(?:^|\\.)treemall\\.com\\.tw$\n(?:^|\\.)trendsmap\\.com$\n(?:^|\\.)trialofccp\\.org$\n(?:^|\\.)trickip\\.net$\n(?:^|\\.)trickip\\.org$\n(?:^|\\.)trimondi\\.de$\n(?:^|\\.)trouw\\.nl$\n(?:^|\\.)trt\\.net\\.tr$\n(?:^|\\.)trtc\\.com\\.tw$\n(?:^|\\.)truebuddha-md\\.org$\n(?:^|\\.)trulyergonomic\\.com$\n(?:^|\\.)truth101\\.co\\.tv$\n(?:^|\\.)truthontour\\.org$\n(?:^|\\.)truveo\\.com$\n(?:^|\\.)tryheart\\.jp$\n(?:^|\\.)tsctv\\.net$\n(?:^|\\.)tsdr\\.uspto\\.gov$\n(?:^|\\.)tsemtulku\\.com$\n(?:^|\\.)tsquare\\.tv$\n(?:^|\\.)tsu\\.org\\.tw$\n(?:^|\\.)tsunagarumon\\.com$\n(?:^|\\.)tt1069\\.com$\n(?:^|\\.)tttan\\.com$\n(?:^|\\.)ttvnw\\.net$\n(?:^|\\.)tu8964\\.com$\n(?:^|\\.)tubaholic\\.com$\n(?:^|\\.)tube\\.com$\n(?:^|\\.)tube8\\.com$\n(?:^|\\.)tube911\\.com$\n(?:^|\\.)tubecup\\.com$\n(?:^|\\.)tubegals\\.com$\n(?:^|\\.)tubeislam\\.com$\n(?:^|\\.)tubepornclassic\\.com$\n(?:^|\\.)tubestack\\.com$\n(?:^|\\.)tubewolf\\.com$\n(?:^|\\.)tui\\.orzdream\\.com$\n(?:^|\\.)tuibeitu\\.net$\n(?:^|\\.)tuidang\\.net$\n(?:^|\\.)tuidang\\.org$\n(?:^|\\.)tuidang\\.se$\n(?:^|\\.)tuitwit\\.com$\n(?:^|\\.)tumblr\\.com$\n(?:^|\\.)tumutanzi\\.com$\n(?:^|\\.)tumview\\.com$\n(?:^|\\.)tunein\\.com$\n(?:^|\\.)tunnelbear\\.com$\n(?:^|\\.)tunnelr\\.com$\n(?:^|\\.)tuo8\\.blue$\n(?:^|\\.)tuo8\\.cc$\n(?:^|\\.)tuo8\\.club$\n(?:^|\\.)tuo8\\.fit$\n(?:^|\\.)tuo8\\.hk$\n(?:^|\\.)tuo8\\.in$\n(?:^|\\.)tuo8\\.ninja$\n(?:^|\\.)tuo8\\.org$\n(?:^|\\.)tuo8\\.pw$\n(?:^|\\.)tuo8\\.red$\n(?:^|\\.)tuo8\\.space$\n(?:^|\\.)turansam\\.org$\n(?:^|\\.)turbobit\\.net$\n(?:^|\\.)turbohide\\.com$\n(?:^|\\.)turbotwitter\\.com$\n(?:^|\\.)turntable\\.fm$\n(?:^|\\.)tushycash\\.com$\n(?:^|\\.)tuvpn\\.com$\n(?:^|\\.)tuzaijidi\\.com$\n(?:^|\\.)tv\\.com$\n(?:^|\\.)tvants\\.com$\n(?:^|\\.)tvboxnow\\.com$\n(?:^|\\.)tvider\\.com$\n(?:^|\\.)tvmost\\.com\\.hk$\n(?:^|\\.)tvplayvideos\\.com$\n(?:^|\\.)tvunetworks\\.com$\n(?:^|\\.)tw-blog\\.com$\n(?:^|\\.)tw-npo\\.org$\n(?:^|\\.)tw\\.answers\\.yahoo\\.com$\n(?:^|\\.)tw\\.bid\\.yahoo\\.com$\n(?:^|\\.)tw\\.gigacircle\\.com$\n(?:^|\\.)tw\\.hao123\\.com$\n(?:^|\\.)tw\\.iqiyi\\.com$\n(?:^|\\.)tw\\.jiepang\\.com$\n(?:^|\\.)tw\\.knowledge\\.yahoo\\.com$\n(?:^|\\.)tw\\.mall\\.yahoo\\.com$\n(?:^|\\.)tw\\.mobi\\.yahoo\\.com$\n(?:^|\\.)tw\\.money\\.yahoo\\.com$\n(?:^|\\.)tw\\.myblog\\.yahoo\\.com$\n(?:^|\\.)tw\\.news\\.yahoo\\.com$\n(?:^|\\.)tw\\.streetvoice\\.com$\n(?:^|\\.)tw\\.tomonews\\.net$\n(?:^|\\.)tw\\.voa\\.mobi$\n(?:^|\\.)tw\\.yahoo\\.com$\n(?:^|\\.)tw01\\.org$\n(?:^|\\.)twaitter\\.com$\n(?:^|\\.)twapperkeeper\\.com$\n(?:^|\\.)twaud\\.io$\n(?:^|\\.)twavi\\.com$\n(?:^|\\.)twbbs\\.net\\.tw$\n(?:^|\\.)twbbs\\.org$\n(?:^|\\.)twbbs\\.tw$\n(?:^|\\.)twblogger\\.com$\n(?:^|\\.)tweepguide\\.com$\n(?:^|\\.)tweeplike\\.me$\n(?:^|\\.)tweepmag\\.com$\n(?:^|\\.)tweepml\\.org$\n(?:^|\\.)tweetbackup\\.com$\n(?:^|\\.)tweetboard\\.com$\n(?:^|\\.)tweetboner\\.biz$\n(?:^|\\.)tweetcs\\.com$\n(?:^|\\.)tweetdeck\\.com$\n(?:^|\\.)tweetedtimes\\.com$\n(?:^|\\.)tweetmylast\\.fm$\n(?:^|\\.)tweetphoto\\.com$\n(?:^|\\.)tweetrans\\.com$\n(?:^|\\.)tweetree\\.com$\n(?:^|\\.)tweets\\.seraph\\.me$\n(?:^|\\.)tweettunnel\\.com$\n(?:^|\\.)tweetwally\\.com$\n(?:^|\\.)tweetymail\\.com$\n(?:^|\\.)tweez\\.net$\n(?:^|\\.)twelve\\.today$\n(?:^|\\.)twerkingbutt\\.com$\n(?:^|\\.)twftp\\.org$\n(?:^|\\.)twgreatdaily\\.com$\n(?:^|\\.)twibase\\.com$\n(?:^|\\.)twibble\\.de$\n(?:^|\\.)twibbon\\.com$\n(?:^|\\.)twibs\\.com$\n(?:^|\\.)twicountry\\.org$\n(?:^|\\.)twicsy\\.com$\n(?:^|\\.)twiends\\.com$\n(?:^|\\.)twifan\\.com$\n(?:^|\\.)twiffo\\.com$\n(?:^|\\.)twiggit\\.org$\n(?:^|\\.)twilightsex\\.com$\n(?:^|\\.)twilog\\.org$\n(?:^|\\.)twimbow\\.com$\n(?:^|\\.)twimg\\.com$\n(?:^|\\.)twindexx\\.com$\n(?:^|\\.)twip\\.me$\n(?:^|\\.)twipple\\.jp$\n(?:^|\\.)twishort\\.com$\n(?:^|\\.)twistar\\.cc$\n(?:^|\\.)twister\\.net\\.co$\n(?:^|\\.)twisterio\\.com$\n(?:^|\\.)twisternow\\.com$\n(?:^|\\.)twistory\\.net$\n(?:^|\\.)twit2d\\.com$\n(?:^|\\.)twitbrowser\\.net$\n(?:^|\\.)twitcause\\.com$\n(?:^|\\.)twitch\\.tv$\n(?:^|\\.)twitchcdn\\.net$\n(?:^|\\.)twitgether\\.com$\n(?:^|\\.)twitgoo\\.com$\n(?:^|\\.)twitiq\\.com$\n(?:^|\\.)twitlonger\\.com$\n(?:^|\\.)twitmania\\.com$\n(?:^|\\.)twitoaster\\.com$\n(?:^|\\.)twitonmsn\\.com$\n(?:^|\\.)twitpic\\.com$\n(?:^|\\.)twitstat\\.com$\n(?:^|\\.)twittbot\\.net$\n(?:^|\\.)twitter\\.com$\n(?:^|\\.)twitter\\.jp$\n(?:^|\\.)twitter4j\\.org$\n(?:^|\\.)twittercounter\\.com$\n(?:^|\\.)twitterfeed\\.com$\n(?:^|\\.)twittergadget\\.com$\n(?:^|\\.)twitterkr\\.com$\n(?:^|\\.)twittermail\\.com$\n(?:^|\\.)twitterrific\\.com$\n(?:^|\\.)twittertim\\.es$\n(?:^|\\.)twitthat\\.com$\n(?:^|\\.)twitturk\\.com$\n(?:^|\\.)twitturly\\.com$\n(?:^|\\.)twitvid\\.com$\n(?:^|\\.)twitzap\\.com$\n(?:^|\\.)twiyia\\.com$\n(?:^|\\.)twnorth\\.org\\.tw$\n(?:^|\\.)twskype\\.com$\n(?:^|\\.)twstar\\.net$\n(?:^|\\.)twt\\.tl$\n(?:^|\\.)twtkr\\.com$\n(?:^|\\.)twtr2src\\.ogaoga\\.org$\n(?:^|\\.)twtrland\\.com$\n(?:^|\\.)twttr\\.com$\n(?:^|\\.)twurl\\.nl$\n(?:^|\\.)twyac\\.org$\n(?:^|\\.)txxx\\.com$\n(?:^|\\.)tycool\\.com$\n(?:^|\\.)typepad\\.com$\n(?:^|\\.)u9un\\.com$\n(?:^|\\.)ub0\\.cc$\n(?:^|\\.)ubddns\\.org$\n(?:^|\\.)uberproxy\\.net$\n(?:^|\\.)uc-japan\\.org$\n(?:^|\\.)ucdc1998\\.org$\n(?:^|\\.)uderzo\\.it$\n(?:^|\\.)udn\\.com$\n(?:^|\\.)udn\\.com\\.tw$\n(?:^|\\.)udnbkk\\.com$\n(?:^|\\.)uforadio\\.com\\.tw$\n(?:^|\\.)ufreevpn\\.com$\n(?:^|\\.)ugo\\.com$\n(?:^|\\.)uhdwallpapers\\.org$\n(?:^|\\.)uhrp\\.org$\n(?:^|\\.)uighur\\.narod\\.ru$\n(?:^|\\.)uighur\\.nl$\n(?:^|\\.)uighurbiz\\.net$\n(?:^|\\.)ukcdp\\.co\\.uk$\n(?:^|\\.)ukliferadio\\.co\\.uk$\n(?:^|\\.)uku\\.im$\n(?:^|\\.)ulike\\.net$\n(?:^|\\.)ulop\\.net$\n(?:^|\\.)ultrareach$\n(?:^|\\.)ultrasurf$\n(?:^|\\.)ultravpn\\.fr$\n(?:^|\\.)ultraxs\\.com$\n(?:^|\\.)umich\\.edu$\n(?:^|\\.)unblock-us\\.com$\n(?:^|\\.)unblock\\.cn\\.com$\n(?:^|\\.)unblockdmm\\.com$\n(?:^|\\.)unblocker\\.yt$\n(?:^|\\.)unblocksit\\.es$\n(?:^|\\.)uncyclomedia\\.org$\n(?:^|\\.)uncyclopedia\\.hk$\n(?:^|\\.)uncyclopedia\\.tw$\n(?:^|\\.)underwoodammo\\.com$\n(?:^|\\.)unholyknight\\.com$\n(?:^|\\.)uni\\.cc$\n(?:^|\\.)unification\\.net$\n(?:^|\\.)unification\\.org\\.tw$\n(?:^|\\.)unirule\\.cloud$\n(?:^|\\.)unitedsocialpress\\.com$\n(?:^|\\.)unix100\\.com$\n(?:^|\\.)unknownspace\\.org$\n(?:^|\\.)unodedos\\.com$\n(?:^|\\.)unpo\\.org$\n(?:^|\\.)unseen\\.is$\n(?:^|\\.)untraceable\\.us$\n(?:^|\\.)uocn\\.org$\n(?:^|\\.)upcoming\\.yahoo\\.com$\n(?:^|\\.)updates\\.tdesktop\\.com$\n(?:^|\\.)upholdjustice\\.org$\n(?:^|\\.)upload4u\\.info$\n(?:^|\\.)uploaded\\.net$\n(?:^|\\.)uploaded\\.to$\n(?:^|\\.)uploadstation\\.com$\n(?:^|\\.)upmedia\\.mg$\n(?:^|\\.)upornia\\.com$\n(?:^|\\.)uproxy\\.org$\n(?:^|\\.)upwill\\.org$\n(?:^|\\.)ur7s\\.com$\n(?:^|\\.)uraban\\.me$\n(?:^|\\.)urbansurvival\\.com$\n(?:^|\\.)urchin\\.com$\n(?:^|\\.)urlborg\\.com$\n(?:^|\\.)urlparser\\.com$\n(?:^|\\.)us\\.to$\n(?:^|\\.)usacn\\.com$\n(?:^|\\.)usaip\\.eu$\n(?:^|\\.)userapi\\.nytlog\\.com$\n(?:^|\\.)users\\.skynet\\.be$\n(?:^|\\.)usfk\\.mil$\n(?:^|\\.)ushuarencity\\.echainhost\\.com$\n(?:^|\\.)usinfo\\.state\\.gov$\n(?:^|\\.)usma\\.edu$\n(?:^|\\.)usmc\\.mil$\n(?:^|\\.)usmgtcg\\.ning\\.com$\n(?:^|\\.)usno\\.navy\\.mil$\n(?:^|\\.)usocctn\\.com$\n(?:^|\\.)ustream\\.tv$\n(?:^|\\.)usunitednews\\.com$\n(?:^|\\.)usus\\.cc$\n(?:^|\\.)utopianpal\\.com$\n(?:^|\\.)uu-gg\\.com$\n(?:^|\\.)uukanshu\\.com$\n(?:^|\\.)uvwxyz\\.xyz$\n(?:^|\\.)uwants\\.com$\n(?:^|\\.)uwants\\.net$\n(?:^|\\.)uyghur-j\\.org$\n(?:^|\\.)uyghur\\.co\\.uk$\n(?:^|\\.)uyghuramerican\\.org$\n(?:^|\\.)uyghurcanadiansociety\\.org$\n(?:^|\\.)uyghurcongress\\.org$\n(?:^|\\.)uyghurensemble\\.co\\.uk$\n(?:^|\\.)uyghurpen\\.org$\n(?:^|\\.)uyghurpress\\.com$\n(?:^|\\.)uyghurstudies\\.org$\n(?:^|\\.)uygur\\.fc2web\\.com$\n(?:^|\\.)uygur\\.org$\n(?:^|\\.)uymaarip\\.com$\n(?:^|\\.)v2ex\\.com$\n(?:^|\\.)v2ray\\.com$\n(?:^|\\.)van001\\.com$\n(?:^|\\.)van698\\.com$\n(?:^|\\.)vanemu\\.cn$\n(?:^|\\.)vanilla-jp\\.com$\n(?:^|\\.)vanpeople\\.com$\n(?:^|\\.)vansky\\.com$\n(?:^|\\.)vaticannews\\.va$\n(?:^|\\.)vatn\\.org$\n(?:^|\\.)vcf-online\\.org$\n(?:^|\\.)vcfbuilder\\.org$\n(?:^|\\.)vds\\.rightster\\.com$\n(?:^|\\.)vegas\\.williamhill\\.com$\n(?:^|\\.)vegasred\\.com$\n(?:^|\\.)velkaepocha\\.sk$\n(?:^|\\.)venbbs\\.com$\n(?:^|\\.)venchina\\.com$\n(?:^|\\.)venetianmacao\\.com$\n(?:^|\\.)ventureswell\\.com$\n(?:^|\\.)veoh\\.com$\n(?:^|\\.)vermonttibet\\.org$\n(?:^|\\.)versavpn\\.com$\n(?:^|\\.)verybs\\.com$\n(?:^|\\.)vevo\\.com$\n(?:^|\\.)vft\\.com\\.tw$\n(?:^|\\.)viber\\.com$\n(?:^|\\.)vica\\.info$\n(?:^|\\.)victimsofcommunism\\.org$\n(?:^|\\.)vid\\.me$\n(?:^|\\.)vidble\\.com$\n(?:^|\\.)video\\.aol\\.ca$\n(?:^|\\.)video\\.aol\\.co\\.uk$\n(?:^|\\.)video\\.aol\\.com$\n(?:^|\\.)video\\.ap\\.org$\n(?:^|\\.)video\\.fdbox\\.com$\n(?:^|\\.)video\\.foxbusiness\\.com$\n(?:^|\\.)video\\.pbs\\.org$\n(?:^|\\.)video\\.yahoo\\.com$\n(?:^|\\.)videobam\\.com$\n(?:^|\\.)videodetective\\.com$\n(?:^|\\.)videomega\\.tv$\n(?:^|\\.)videomo\\.com$\n(?:^|\\.)videopediaworld\\.com$\n(?:^|\\.)videopress\\.com$\n(?:^|\\.)vidinfo\\.org$\n(?:^|\\.)vietdaikynguyen\\.com$\n(?:^|\\.)vijayatemple\\.org$\n(?:^|\\.)vimeo\\.com$\n(?:^|\\.)vimperator\\.org$\n(?:^|\\.)vincnd\\.com$\n(?:^|\\.)vine\\.co$\n(?:^|\\.)vinniev\\.com$\n(?:^|\\.)vip-enterprise\\.com$\n(?:^|\\.)virtualrealporn\\.com$\n(?:^|\\.)visibletweets\\.com$\n(?:^|\\.)vital247\\.org$\n(?:^|\\.)viu\\.com$\n(?:^|\\.)viu\\.tv$\n(?:^|\\.)vivahentai4u\\.net$\n(?:^|\\.)vivatube\\.com$\n(?:^|\\.)vivthomas\\.com$\n(?:^|\\.)vizvaz\\.com$\n(?:^|\\.)vjav\\.com$\n(?:^|\\.)vjmedia\\.com\\.hk$\n(?:^|\\.)vllcs\\.org$\n(?:^|\\.)vlog\\.xuite\\.net$\n(?:^|\\.)vmixcore\\.com$\n(?:^|\\.)vmpsoft\\.com$\n(?:^|\\.)vn\\.hao123\\.com$\n(?:^|\\.)vnet\\.link$\n(?:^|\\.)voa-11\\.akacast\\.akamaistream\\.net$\n(?:^|\\.)voacantonese\\.com$\n(?:^|\\.)voachinese\\.com$\n(?:^|\\.)voachineseblog\\.com$\n(?:^|\\.)voagd\\.com$\n(?:^|\\.)voanews\\.com$\n(?:^|\\.)voatibetan\\.com$\n(?:^|\\.)voatibetanenglish\\.com$\n(?:^|\\.)vocativ\\.com$\n(?:^|\\.)vocn\\.tv$\n(?:^|\\.)vod-abematv\\.akamaized\\.net$\n(?:^|\\.)vod\\.wwe\\.com$\n(?:^|\\.)vot\\.org$\n(?:^|\\.)vovo2000\\.com$\n(?:^|\\.)voxer\\.com$\n(?:^|\\.)voy\\.com$\n(?:^|\\.)vpn\\.ac$\n(?:^|\\.)vpn\\.cjb\\.net$\n(?:^|\\.)vpn\\.cmu\\.edu$\n(?:^|\\.)vpn\\.sv\\.cmu\\.edu$\n(?:^|\\.)vpn4all\\.com$\n(?:^|\\.)vpnaccount\\.org$\n(?:^|\\.)vpnaccounts\\.com$\n(?:^|\\.)vpnbook\\.com$\n(?:^|\\.)vpncomparison\\.org$\n(?:^|\\.)vpncoupons\\.com$\n(?:^|\\.)vpncup\\.com$\n(?:^|\\.)vpndada\\.com$\n(?:^|\\.)vpnfan\\.com$\n(?:^|\\.)vpnfire\\.com$\n(?:^|\\.)vpnfires\\.biz$\n(?:^|\\.)vpnforgame\\.net$\n(?:^|\\.)vpngate\\.jp$\n(?:^|\\.)vpngate\\.net$\n(?:^|\\.)vpngratis\\.net$\n(?:^|\\.)vpnhq\\.com$\n(?:^|\\.)vpninja\\.net$\n(?:^|\\.)vpnintouch\\.com$\n(?:^|\\.)vpnintouch\\.net$\n(?:^|\\.)vpnjack\\.com$\n(?:^|\\.)vpnmaster\\.com$\n(?:^|\\.)vpnmentor\\.com$\n(?:^|\\.)vpnpick\\.com$\n(?:^|\\.)vpnpop\\.com$\n(?:^|\\.)vpnpronet\\.com$\n(?:^|\\.)vpnreactor\\.com$\n(?:^|\\.)vpnreviewz\\.com$\n(?:^|\\.)vpnsecure\\.me$\n(?:^|\\.)vpnshazam\\.com$\n(?:^|\\.)vpnshieldapp\\.com$\n(?:^|\\.)vpnsp\\.com$\n(?:^|\\.)vpntraffic\\.com$\n(?:^|\\.)vpntunnel\\.com$\n(?:^|\\.)vpnuk\\.info$\n(?:^|\\.)vpnunlimitedapp\\.com$\n(?:^|\\.)vpnvip\\.com$\n(?:^|\\.)vpnworldwide\\.com$\n(?:^|\\.)vporn\\.com$\n(?:^|\\.)vpser\\.net$\n(?:^|\\.)vraiesagesse\\.net$\n(?:^|\\.)vrmtr\\.com$\n(?:^|\\.)vrsmash\\.com$\n(?:^|\\.)vtunnel\\.com$\n(?:^|\\.)vuku\\.cc$\n(?:^|\\.)vultryhw\\.com$\n(?:^|\\.)w\\.idaiwan\\.com$\n(?:^|\\.)w3schools\\.com$\n(?:^|\\.)waffle1999\\.com$\n(?:^|\\.)wahas\\.com$\n(?:^|\\.)waigaobu\\.com$\n(?:^|\\.)waikeung\\.org$\n(?:^|\\.)wailaike\\.net$\n(?:^|\\.)waiwaier\\.com$\n(?:^|\\.)wallmama\\.com$\n(?:^|\\.)wallornot\\.org$\n(?:^|\\.)wallpapercasa\\.com$\n(?:^|\\.)wallproxy\\.com$\n(?:^|\\.)waltermartin\\.com$\n(?:^|\\.)waltermartin\\.org$\n(?:^|\\.)wanderinghorse\\.net$\n(?:^|\\.)wangafu\\.net$\n(?:^|\\.)wangjinbo\\.org$\n(?:^|\\.)wanglixiong\\.com$\n(?:^|\\.)wango\\.org$\n(?:^|\\.)wangruoshui\\.net$\n(?:^|\\.)want-daily\\.com$\n(?:^|\\.)wanz-factory\\.com$\n(?:^|\\.)wapedia\\.mobi$\n(?:^|\\.)warbler\\.iconfactory\\.net$\n(?:^|\\.)waselpro\\.com$\n(?:^|\\.)washeng\\.net$\n(?:^|\\.)watch8x\\.com$\n(?:^|\\.)watchinese\\.com$\n(?:^|\\.)watchmygf\\.net$\n(?:^|\\.)wattpad\\.com$\n(?:^|\\.)wav\\.tv$\n(?:^|\\.)waveprotocol\\.org$\n(?:^|\\.)waymo\\.com$\n(?:^|\\.)wda\\.gov\\.tw$\n(?:^|\\.)wdf5\\.com$\n(?:^|\\.)wearehairy\\.com$\n(?:^|\\.)wearn\\.com$\n(?:^|\\.)web\\.dev$\n(?:^|\\.)web2project\\.net$\n(?:^|\\.)webbang\\.net$\n(?:^|\\.)webevader\\.org$\n(?:^|\\.)webfreer\\.com$\n(?:^|\\.)webjb\\.org$\n(?:^|\\.)weblagu\\.com$\n(?:^|\\.)webmproject\\.org$\n(?:^|\\.)webrtc\\.org$\n(?:^|\\.)webrush\\.net$\n(?:^|\\.)webs-tv\\.net$\n(?:^|\\.)website\\.informer\\.com$\n(?:^|\\.)websitepulse\\.com$\n(?:^|\\.)webwarper\\.net$\n(?:^|\\.)webworkerdaily\\.com$\n(?:^|\\.)weekmag\\.info$\n(?:^|\\.)wefightcensorship\\.org$\n(?:^|\\.)wefong\\.com$\n(?:^|\\.)wego\\.here\\.com$\n(?:^|\\.)weiboleak\\.com$\n(?:^|\\.)weiboscope\\.jmsc\\.hku\\.hk$\n(?:^|\\.)weihuo\\.org$\n(?:^|\\.)weijingsheng\\.org$\n(?:^|\\.)weiming\\.info$\n(?:^|\\.)weiquanwang\\.org$\n(?:^|\\.)weisuo\\.ws$\n(?:^|\\.)welovecock\\.com$\n(?:^|\\.)wemigrate\\.org$\n(?:^|\\.)wengewang\\.com$\n(?:^|\\.)wengewang\\.org$\n(?:^|\\.)wenhui\\.ch$\n(?:^|\\.)wenxuecity\\.com$\n(?:^|\\.)wenyunchao\\.com$\n(?:^|\\.)wenzhao\\.ca$\n(?:^|\\.)westca\\.com$\n(?:^|\\.)westernshugdensociety\\.org$\n(?:^|\\.)westernwolves\\.com$\n(?:^|\\.)westkit\\.net$\n(?:^|\\.)westpoint\\.edu$\n(?:^|\\.)wetplace\\.com$\n(?:^|\\.)wetpussygames\\.com$\n(?:^|\\.)wexiaobo\\.org$\n(?:^|\\.)wezhiyong\\.org$\n(?:^|\\.)wezone\\.net$\n(?:^|\\.)wforum\\.com$\n(?:^|\\.)wha\\.la$\n(?:^|\\.)whatblocked\\.com$\n(?:^|\\.)whatbrowser\\.org$\n(?:^|\\.)whatsapp\\.com$\n(?:^|\\.)whatsapp\\.net$\n(?:^|\\.)whatsonweibo\\.com$\n(?:^|\\.)wheatseeds\\.org$\n(?:^|\\.)wheelockslatin\\.com$\n(?:^|\\.)whereiswerner\\.com$\n(?:^|\\.)wheretowatch\\.com$\n(?:^|\\.)whippedass\\.com$\n(?:^|\\.)whitebear\\.freebearblog\\.org$\n(?:^|\\.)whodns\\.xyz$\n(?:^|\\.)whoer\\.net$\n(?:^|\\.)whotalking\\.com$\n(?:^|\\.)whylover\\.com$\n(?:^|\\.)whyx\\.org$\n(?:^|\\.)widevine\\.com$\n(?:^|\\.)wikaba\\.com$\n(?:^|\\.)wiki\\.cnitter\\.com$\n(?:^|\\.)wiki\\.esu\\.im$\n(?:^|\\.)wiki\\.gamerp\\.jp$\n(?:^|\\.)wiki\\.jqueryui\\.com$\n(?:^|\\.)wiki\\.keso\\.cn$\n(?:^|\\.)wiki\\.moegirl\\.org$\n(?:^|\\.)wiki\\.oauth\\.net$\n(?:^|\\.)wiki\\.phonegap\\.com$\n(?:^|\\.)wikileaks-forum\\.com$\n(?:^|\\.)wikileaks\\.ch$\n(?:^|\\.)wikileaks\\.com$\n(?:^|\\.)wikileaks\\.de$\n(?:^|\\.)wikileaks\\.eu$\n(?:^|\\.)wikileaks\\.lu$\n(?:^|\\.)wikileaks\\.org$\n(?:^|\\.)wikileaks\\.pl$\n(?:^|\\.)wikilivres\\.info$\n(?:^|\\.)wikimapia\\.org$\n(?:^|\\.)wikipedia\\.org$\n(?:^|\\.)wikiwiki\\.jp$\n(?:^|\\.)wildammo\\.com$\n(?:^|\\.)williamhill\\.com$\n(?:^|\\.)willw\\.net$\n(?:^|\\.)windowsphoneme\\.com$\n(?:^|\\.)windscribe\\.com$\n(?:^|\\.)wingamestore\\.com$\n(?:^|\\.)wingy\\.site$\n(?:^|\\.)winning11\\.com$\n(?:^|\\.)winwhispers\\.info$\n(?:^|\\.)wire\\.com$\n(?:^|\\.)wiredbytes\\.com$\n(?:^|\\.)wiredpen\\.com$\n(?:^|\\.)wisdompubs\\.org$\n(?:^|\\.)wisevid\\.com$\n(?:^|\\.)withgoogle\\.com$\n(?:^|\\.)withyoutube\\.com$\n(?:^|\\.)witnessleeteaching\\.com$\n(?:^|\\.)witopia\\.net$\n(?:^|\\.)wizcrafts\\.net$\n(?:^|\\.)wjbk\\.org$\n(?:^|\\.)wlcnew\\.jigsy\\.com$\n(?:^|\\.)wlx\\.sowiki\\.net$\n(?:^|\\.)wn\\.com$\n(?:^|\\.)wnacg\\.com$\n(?:^|\\.)wnacg\\.org$\n(?:^|\\.)wo\\.tc$\n(?:^|\\.)wo3ttt\\.wordpress\\.com$\n(?:^|\\.)woeser\\.com$\n(?:^|\\.)woesermiddle-way\\.net$\n(?:^|\\.)wokar\\.org$\n(?:^|\\.)wolfax\\.com$\n(?:^|\\.)woolyss\\.com$\n(?:^|\\.)woopie\\.jp$\n(?:^|\\.)woopie\\.tv$\n(?:^|\\.)wordpress\\.com$\n(?:^|\\.)workatruna\\.com$\n(?:^|\\.)workerdemo\\.org\\.hk$\n(?:^|\\.)workerempowerment\\.org$\n(?:^|\\.)workersthebig\\.net$\n(?:^|\\.)worldcat\\.org$\n(?:^|\\.)worldjournal\\.com$\n(?:^|\\.)worldvpn\\.net$\n(?:^|\\.)wow-life\\.net$\n(?:^|\\.)wow\\.com$\n(?:^|\\.)wowgirls\\.com$\n(?:^|\\.)wowlegacy\\.ml$\n(?:^|\\.)wowporn\\.com$\n(?:^|\\.)wowrk\\.com$\n(?:^|\\.)woxinghuiguo\\.com$\n(?:^|\\.)woyaolian\\.org$\n(?:^|\\.)wozy\\.in$\n(?:^|\\.)wp\\.com$\n(?:^|\\.)wpoforum\\.com$\n(?:^|\\.)wqyd\\.org$\n(?:^|\\.)wrchina\\.org$\n(?:^|\\.)wretch\\.cc$\n(?:^|\\.)writer\\.zoho\\.com$\n(?:^|\\.)wsgzao\\.github\\.io$\n(?:^|\\.)wsj\\.com$\n(?:^|\\.)wsj\\.net$\n(?:^|\\.)wsjhk\\.com$\n(?:^|\\.)wtbn\\.org$\n(?:^|\\.)wtfpeople\\.com$\n(?:^|\\.)wuerkaixi\\.com$\n(?:^|\\.)wufafangwen\\.com$\n(?:^|\\.)wufi\\.org\\.tw$\n(?:^|\\.)wuguoguang\\.com$\n(?:^|\\.)wujie\\.net$\n(?:^|\\.)wujieliulan\\.com$\n(?:^|\\.)wukangrui\\.net$\n(?:^|\\.)wuw\\.red$\n(?:^|\\.)wuyanblog\\.com$\n(?:^|\\.)wwitv\\.com$\n(?:^|\\.)www\\.ajsands\\.com$\n(?:^|\\.)www\\.americorps\\.gov$\n(?:^|\\.)www\\.antd\\.org$\n(?:^|\\.)www\\.aolnews\\.com$\n(?:^|\\.)www\\.businessinsider\\.com\\.au$\n(?:^|\\.)www\\.citizenlab\\.org$\n(?:^|\\.)www\\.cmoinc\\.org$\n(?:^|\\.)www\\.cool18\\.com$\n(?:^|\\.)www\\.dmm\\.com$\n(?:^|\\.)www\\.dwheeler\\.com$\n(?:^|\\.)www\\.eastturkistan\\.net$\n(?:^|\\.)www\\.gmiddle\\.com$\n(?:^|\\.)www\\.gmiddle\\.net$\n(?:^|\\.)www\\.hustlercash\\.com$\n(?:^|\\.)www\\.idlcoyote\\.com$\n(?:^|\\.)www\\.imdb\\.com$\n(?:^|\\.)www\\.kindleren\\.com$\n(?:^|\\.)www\\.klip\\.me$\n(?:^|\\.)www\\.lamenhu\\.com$\n(?:^|\\.)www\\.lib\\.virginia\\.edu$\n(?:^|\\.)www\\.linksalpha\\.com$\n(?:^|\\.)www\\.m-sport\\.co\\.uk$\n(?:^|\\.)www\\.metro\\.taipei$\n(?:^|\\.)www\\.monlamit\\.org$\n(?:^|\\.)www\\.moztw\\.org$\n(?:^|\\.)www\\.nbc\\.com$\n(?:^|\\.)www\\.orchidbbs\\.com$\n(?:^|\\.)www\\.owind\\.com$\n(?:^|\\.)www\\.oxid\\.it$\n(?:^|\\.)www\\.powerpointninja\\.com$\n(?:^|\\.)www\\.s4miniarchive\\.com$\n(?:^|\\.)www\\.sciencemag\\.org$\n(?:^|\\.)www\\.shadowsocks\\.com$\n(?:^|\\.)www\\.shwchurch\\.org$\n(?:^|\\.)www\\.skype\\.com$\n(?:^|\\.)www\\.tablesgenerator\\.com$\n(?:^|\\.)www\\.taiwanonline\\.cc$\n(?:^|\\.)www\\.taup\\.org\\.tw$\n(?:^|\\.)www\\.thechinastory\\.org$\n(?:^|\\.)www\\.wan-press\\.org$\n(?:^|\\.)www\\.wangruowang\\.org$\n(?:^|\\.)www\\.websnapr\\.com$\n(?:^|\\.)www\\.zensur\\.freerk\\.com$\n(?:^|\\.)www1\\.american\\.edu$\n(?:^|\\.)www1\\.biz$\n(?:^|\\.)www2\\.ohchr\\.org$\n(?:^|\\.)www2\\.rocketbbs\\.com$\n(?:^|\\.)wwwhost\\.biz$\n(?:^|\\.)wzyboy\\.im$\n(?:^|\\.)x-art\\.com$\n(?:^|\\.)x-berry\\.com$\n(?:^|\\.)x-wall\\.org$\n(?:^|\\.)x\\.company$\n(?:^|\\.)x1949x\\.com$\n(?:^|\\.)x24hr\\.com$\n(?:^|\\.)x365x\\.com$\n(?:^|\\.)xa\\.yimg\\.com$\n(?:^|\\.)xanga\\.com$\n(?:^|\\.)xbabe\\.com$\n(?:^|\\.)xbookcn\\.com$\n(?:^|\\.)xbtce\\.com$\n(?:^|\\.)xcafe\\.in$\n(?:^|\\.)xcity\\.jp$\n(?:^|\\.)xcritic\\.com$\n(?:^|\\.)xerotica\\.com$\n(?:^|\\.)xfinity\\.com$\n(?:^|\\.)xfm\\.pp\\.ru$\n(?:^|\\.)xgmyd\\.com$\n(?:^|\\.)xhamster\\.com$\n(?:^|\\.)xianba\\.net$\n(?:^|\\.)xianchawang\\.net$\n(?:^|\\.)xianjian\\.tw$\n(?:^|\\.)xianqiao\\.net$\n(?:^|\\.)xiaobaiwu\\.com$\n(?:^|\\.)xiaochuncnjp\\.com$\n(?:^|\\.)xiaod\\.in$\n(?:^|\\.)xiaohexie\\.com$\n(?:^|\\.)xiaolan\\.me$\n(?:^|\\.)xiaoma\\.org$\n(?:^|\\.)xiezhua\\.com$\n(?:^|\\.)xihua\\.es$\n(?:^|\\.)xijie\\.wordpress\\.com$\n(?:^|\\.)xing\\.com$\n(?:^|\\.)xinhuanet\\.org$\n(?:^|\\.)xinmiao\\.com\\.hk$\n(?:^|\\.)xinqimeng\\.over-blog\\.com$\n(?:^|\\.)xinsheng\\.net$\n(?:^|\\.)xinshijue\\.com$\n(?:^|\\.)xinyubbs\\.net$\n(?:^|\\.)xiongpian\\.com$\n(?:^|\\.)xiuren\\.org$\n(?:^|\\.)xizang-zhiye\\.org$\n(?:^|\\.)xjp\\.cc$\n(?:^|\\.)xjtravelguide\\.com$\n(?:^|\\.)xkiwi\\.tk$\n(?:^|\\.)xlfmtalk\\.com$\n(?:^|\\.)xlfmwz\\.info$\n(?:^|\\.)xm\\.com$\n(?:^|\\.)xml-training-guide\\.com$\n(?:^|\\.)xmovies\\.com$\n(?:^|\\.)xn--4gq171p\\.com$\n(?:^|\\.)xn--czq75pvv1aj5c\\.org$\n(?:^|\\.)xn--i2ru8q2qg\\.com$\n(?:^|\\.)xn--ngstr-lra8j\\.com$\n(?:^|\\.)xn--oiq\\.cc$\n(?:^|\\.)xn--p8j9a0d9c9a\\.xn--q9jyb4c$\n(?:^|\\.)xnxx\\.com$\n(?:^|\\.)xpdo\\.net$\n(?:^|\\.)xpud\\.org$\n(?:^|\\.)xrentdvd\\.com$\n(?:^|\\.)xskywalker\\.com$\n(?:^|\\.)xskywalker\\.net$\n(?:^|\\.)xtube\\.com$\n(?:^|\\.)xuchao\\.net$\n(?:^|\\.)xuchao\\.org$\n(?:^|\\.)xuehua\\.us$\n(?:^|\\.)xuzhiyong\\.net$\n(?:^|\\.)xvideo\\.cc$\n(?:^|\\.)xvideos\\.com$\n(?:^|\\.)xvideos\\.es$\n(?:^|\\.)xxbbx\\.com$\n(?:^|\\.)xxlmovies\\.com$\n(?:^|\\.)xxuz\\.com$\n(?:^|\\.)xxx\\.com$\n(?:^|\\.)xxx\\.xxx$\n(?:^|\\.)xxxfuckmom\\.com$\n(?:^|\\.)xxxx\\.com\\.au$\n(?:^|\\.)xxxy\\.biz$\n(?:^|\\.)xxxy\\.info$\n(?:^|\\.)xxxymovies\\.com$\n(?:^|\\.)xys\\.dxiong\\.com$\n(?:^|\\.)xys\\.org$\n(?:^|\\.)xysblogs\\.org$\n(?:^|\\.)xyy69\\.com$\n(?:^|\\.)xyy69\\.info$\n(?:^|\\.)yahoo\\.com\\.hk$\n(?:^|\\.)yakbutterblues\\.com$\n(?:^|\\.)yam\\.com$\n(?:^|\\.)yam\\.org\\.tw$\n(?:^|\\.)yanghengjun\\.com$\n(?:^|\\.)yangjianli\\.com$\n(?:^|\\.)yasni\\.co\\.uk$\n(?:^|\\.)yayabay\\.com$\n(?:^|\\.)ydy\\.com$\n(?:^|\\.)yeahteentube\\.com$\n(?:^|\\.)yecl\\.net$\n(?:^|\\.)yeelou\\.com$\n(?:^|\\.)yeeyi\\.com$\n(?:^|\\.)yegle\\.net$\n(?:^|\\.)yes-news\\.com$\n(?:^|\\.)yes\\.xxx$\n(?:^|\\.)yes123\\.com\\.tw$\n(?:^|\\.)yesasia\\.com$\n(?:^|\\.)yesasia\\.com\\.hk$\n(?:^|\\.)yespornplease\\.com$\n(?:^|\\.)yeyeclub\\.com$\n(?:^|\\.)ygto\\.com$\n(?:^|\\.)yhcw\\.net$\n(?:^|\\.)yibada\\.com$\n(?:^|\\.)yibaochina\\.com$\n(?:^|\\.)yidio\\.com$\n(?:^|\\.)yilubbs\\.com$\n(?:^|\\.)yingsuoss\\.com$\n(?:^|\\.)yinlei\\.org$\n(?:^|\\.)yipub\\.com$\n(?:^|\\.)yizhihongxing\\.com$\n(?:^|\\.)yobit\\.net$\n(?:^|\\.)yobt\\.com$\n(?:^|\\.)yobt\\.tv$\n(?:^|\\.)yogichen\\.org$\n(?:^|\\.)yolasite\\.com$\n(?:^|\\.)yomiuri\\.co\\.jp$\n(?:^|\\.)yong\\.hu$\n(?:^|\\.)yorkbbs\\.ca$\n(?:^|\\.)you-get\\.org$\n(?:^|\\.)youdontcare\\.com$\n(?:^|\\.)youjizz\\.com$\n(?:^|\\.)youmaker\\.com$\n(?:^|\\.)youngpornvideos\\.com$\n(?:^|\\.)youngspiration\\.hk$\n(?:^|\\.)youpai\\.org$\n(?:^|\\.)youporn\\.com$\n(?:^|\\.)youporngay\\.com$\n(?:^|\\.)your-freedom\\.net$\n(?:^|\\.)yourepeat\\.com$\n(?:^|\\.)yourlisten\\.com$\n(?:^|\\.)yourlust\\.com$\n(?:^|\\.)yourprivatevpn\\.com$\n(?:^|\\.)yourtrap\\.com$\n(?:^|\\.)yousendit\\.com$\n(?:^|\\.)youshun12\\.com$\n(?:^|\\.)youthnetradio\\.org$\n(?:^|\\.)youtu\\.be$\n(?:^|\\.)youtube-nocookie\\.com$\n(?:^|\\.)youtube\\.com$\n(?:^|\\.)youtubecn\\.com$\n(?:^|\\.)youtubeeducation\\.com$\n(?:^|\\.)youtubegaming\\.com$\n(?:^|\\.)youversion\\.com$\n(?:^|\\.)youwin\\.com$\n(?:^|\\.)youxu\\.info$\n(?:^|\\.)yt\\.be$\n(?:^|\\.)ytht\\.net$\n(?:^|\\.)ytimg\\.com$\n(?:^|\\.)ytn\\.co\\.kr$\n(?:^|\\.)yuanming\\.net$\n(?:^|\\.)yuanzhengtang\\.org$\n(?:^|\\.)yulghun\\.com$\n(?:^|\\.)yunchao\\.net$\n(?:^|\\.)yuntipub\\.com$\n(?:^|\\.)yuvutu\\.com$\n(?:^|\\.)yvesgeleyn\\.com$\n(?:^|\\.)ywpw\\.com$\n(?:^|\\.)yx51\\.net$\n(?:^|\\.)yyii\\.org$\n(?:^|\\.)yzzk\\.com$\n(?:^|\\.)zacebook\\.com$\n(?:^|\\.)zalmos\\.com$\n(?:^|\\.)zannel\\.com$\n(?:^|\\.)zaobao\\.com$\n(?:^|\\.)zaobao\\.com\\.sg$\n(?:^|\\.)zaozon\\.com$\n(?:^|\\.)zapto\\.org$\n(?:^|\\.)zattoo\\.com$\n(?:^|\\.)zb\\.com$\n(?:^|\\.)zdnet\\.com\\.tw$\n(?:^|\\.)zello\\.com$\n(?:^|\\.)zengjinyan\\.org$\n(?:^|\\.)zenmate\\.com$\n(?:^|\\.)zenmate\\.com\\.ru$\n(?:^|\\.)zeronet\\.io$\n(?:^|\\.)zeutch\\.com$\n(?:^|\\.)zfreet\\.com$\n(?:^|\\.)zgsddh\\.com$\n(?:^|\\.)zgzcjj\\.net$\n(?:^|\\.)zh\\.bitterwinter\\.org$\n(?:^|\\.)zh\\.ecdm\\.wikia\\.com$\n(?:^|\\.)zh\\.pokerstrategy\\.com$\n(?:^|\\.)zh\\.pttpedia\\.wikia\\.com$\n(?:^|\\.)zh\\.uncyclopedia\\.wikia\\.com$\n(?:^|\\.)zh\\.wikinews\\.org$\n(?:^|\\.)zh\\.wikisource\\.org$\n(?:^|\\.)zhanbin\\.net$\n(?:^|\\.)zhangboli\\.net$\n(?:^|\\.)zhangtianliang\\.com$\n(?:^|\\.)zhanlve\\.org$\n(?:^|\\.)zhao\\.1984\\.city$\n(?:^|\\.)zhao\\.jinhai\\.de$\n(?:^|\\.)zhenghui\\.org$\n(?:^|\\.)zhengjian\\.org$\n(?:^|\\.)zhengwunet\\.org$\n(?:^|\\.)zhenlibu\\.info$\n(?:^|\\.)zhenlibu1984\\.com$\n(?:^|\\.)zhenxiang\\.biz$\n(?:^|\\.)zhinengluyou\\.com$\n(?:^|\\.)zhongguo\\.ca$\n(?:^|\\.)zhongguorenquan\\.org$\n(?:^|\\.)zhongguotese\\.net$\n(?:^|\\.)zhongmeng\\.org$\n(?:^|\\.)zhoushuguang\\.com$\n(?:^|\\.)zhreader\\.com$\n(?:^|\\.)zhuangbi\\.me$\n(?:^|\\.)zhuanxing\\.cn$\n(?:^|\\.)zhuatieba\\.com$\n(?:^|\\.)zhuichaguoji\\.org$\n(?:^|\\.)ziddu\\.com$\n(?:^|\\.)zillionk\\.com$\n(?:^|\\.)zim\\.vn$\n(?:^|\\.)zinio\\.com$\n(?:^|\\.)ziporn\\.com$\n(?:^|\\.)zippyshare\\.com$\n(?:^|\\.)zkaip\\.com$\n(?:^|\\.)zmw\\.cn$\n(?:^|\\.)zodgame\\.us$\n(?:^|\\.)zomobo\\.net$\n(?:^|\\.)zonaeuropa\\.com$\n(?:^|\\.)zonghexinwen\\.com$\n(?:^|\\.)zonghexinwen\\.net$\n(?:^|\\.)zoogvpn\\.com$\n(?:^|\\.)zootool\\.com$\n(?:^|\\.)zoozle\\.net$\n(?:^|\\.)zorrovpn\\.com$\n(?:^|\\.)zozotown\\.com$\n(?:^|\\.)zpn\\.im$\n(?:^|\\.)zspeeder\\.me$\n(?:^|\\.)zsrhao\\.com$\n(?:^|\\.)zuo\\.la$\n(?:^|\\.)zuobiao\\.me$\n(?:^|\\.)zuola\\.com$\n(?:^|\\.)zvereff\\.com$\n(?:^|\\.)zynaima\\.com$\n(?:^|\\.)zynamics\\.com$\n(?:^|\\.)zyns\\.com$\n(?:^|\\.)zyzc9\\.com$\n(?:^|\\.)zzcartoon\\.com$\n(?:^|\\.)zzcloud\\.me$\n(?:^|\\.)zzux\\.com$\n"
  },
  {
    "path": "core/src/main/assets/acl/bypass-lan.acl",
    "content": "[proxy_all]\n\n[bypass_list]\n0.0.0.0/8\n10.0.0.0/8\n100.64.0.0/10\n127.0.0.0/8\n169.254.0.0/16\n172.16.0.0/12\n192.0.0.0/24\n192.0.2.0/24\n192.31.196.0/24\n192.52.193.0/24\n192.88.99.0/24\n192.168.0.0/16\n192.175.48.0/24\n198.18.0.0/15\n198.51.100.0/24\n203.0.113.0/24\n224.0.0.0/3\n"
  },
  {
    "path": "core/src/main/assets/acl/china-list.acl",
    "content": "[bypass_all]\n\n[proxy_list]\n1.0.1.0/24\n1.0.2.0/23\n1.0.8.0/21\n1.0.32.0/19\n1.1.0.0/24\n1.1.2.0/23\n1.1.4.0/22\n1.1.8.0/21\n1.1.16.0/20\n1.1.32.0/19\n1.2.0.0/23\n1.2.2.0/24\n1.2.4.0/22\n1.2.8.0/21\n1.2.16.0/20\n1.2.32.0/19\n1.2.64.0/18\n1.3.0.0/16\n1.4.1.0/24\n1.4.2.0/23\n1.4.4.0/22\n1.4.8.0/21\n1.4.16.0/20\n1.4.32.0/19\n1.4.64.0/18\n1.8.0.0/16\n1.10.0.0/21\n1.10.8.0/23\n1.10.11.0/24\n1.10.12.0/22\n1.10.16.0/20\n1.10.32.0/19\n1.10.64.0/18\n1.12.0.0/14\n1.18.128.0/24\n1.24.0.0/13\n1.45.0.0/16\n1.48.0.0/14\n1.56.0.0/13\n1.68.0.0/14\n1.80.0.0/12\n1.116.0.0/14\n1.180.0.0/14\n1.184.0.0/15\n1.188.0.0/14\n1.192.0.0/13\n1.202.0.0/15\n1.204.0.0/14\n8.128.0.0/10\n8.208.64.0/18\n8.209.0.0/21\n8.209.8.0/23\n8.209.12.0/22\n8.209.16.0/20\n8.209.32.0/19\n8.209.128.0/17\n8.210.0.0/15\n8.212.0.0/14\n8.216.0.0/13\n14.0.0.0/21\n14.0.12.0/22\n14.1.0.0/22\n14.1.24.0/22\n14.1.96.0/22\n14.1.108.0/22\n14.16.0.0/12\n14.102.128.0/22\n14.102.156.0/22\n14.102.180.0/22\n14.103.0.0/16\n14.104.0.0/13\n14.112.0.0/12\n14.130.0.0/15\n14.134.0.0/15\n14.144.0.0/12\n14.192.60.0/22\n14.192.76.0/22\n14.196.0.0/15\n14.204.0.0/15\n14.208.0.0/12\n20.134.160.0/20\n20.139.160.0/20\n23.48.214.0/24\n27.0.128.0/21\n27.0.160.0/21\n27.0.188.0/22\n27.0.204.0/22\n27.0.208.0/21\n27.8.0.0/13\n27.16.0.0/12\n27.34.232.0/21\n27.36.0.0/14\n27.40.0.0/13\n27.50.40.0/21\n27.50.128.0/17\n27.54.72.0/21\n27.54.152.0/21\n27.54.192.0/18\n27.98.208.0/20\n27.98.224.0/19\n27.99.128.0/17\n27.103.0.0/16\n27.106.128.0/18\n27.106.204.0/22\n27.109.32.0/19\n27.109.124.0/22\n27.112.0.0/18\n27.112.80.0/20\n27.112.112.0/21\n27.113.128.0/18\n27.115.0.0/17\n27.116.44.0/22\n27.121.72.0/21\n27.121.120.0/21\n27.128.0.0/15\n27.131.220.0/22\n27.144.0.0/16\n27.148.0.0/14\n27.152.0.0/13\n27.184.0.0/13\n27.192.0.0/11\n27.224.0.0/14\n36.0.0.0/22\n36.0.8.0/21\n36.0.16.0/20\n36.0.32.0/19\n36.0.64.0/18\n36.0.128.0/17\n36.1.0.0/16\n36.4.0.0/14\n36.16.0.0/12\n36.32.0.0/14\n36.36.0.0/16\n36.37.0.0/19\n36.37.36.0/23\n36.37.39.0/24\n36.37.40.0/21\n36.37.48.0/20\n36.40.0.0/13\n36.48.0.0/15\n36.51.0.0/16\n36.56.0.0/13\n36.96.0.0/11\n36.128.0.0/10\n36.192.0.0/11\n36.248.0.0/14\n36.254.0.0/16\n36.255.116.0/22\n36.255.128.0/22\n36.255.164.0/22\n36.255.172.0/22\n36.255.176.0/22\n39.0.0.0/24\n39.0.2.0/23\n39.0.4.0/22\n39.0.8.0/21\n39.0.16.0/20\n39.0.32.0/19\n39.0.64.0/18\n39.0.128.0/17\n39.64.0.0/11\n39.96.0.0/13\n39.104.0.0/14\n39.108.0.0/16\n39.109.120.0/23\n39.128.0.0/10\n40.0.176.0/20\n40.0.247.0/24\n40.0.248.0/22\n40.0.252.0/23\n40.0.255.0/24\n40.72.0.0/15\n40.77.136.112/28\n40.77.236.224/27\n40.77.254.64/27\n40.125.128.0/17\n40.126.64.0/18\n40.198.10.0/24\n40.198.16.0/21\n40.198.24.0/23\n40.251.225.0/24\n40.251.227.0/24\n42.0.0.0/22\n42.0.8.0/21\n42.0.16.0/21\n42.0.24.0/22\n42.0.32.0/19\n42.0.128.0/17\n42.1.0.0/19\n42.1.32.0/20\n42.1.48.0/21\n42.1.56.0/22\n42.1.128.0/17\n42.4.0.0/14\n42.48.0.0/13\n42.56.0.0/14\n42.62.0.0/17\n42.62.128.0/19\n42.62.160.0/20\n42.62.180.0/22\n42.62.184.0/21\n42.63.0.0/16\n42.80.0.0/15\n42.83.64.0/20\n42.83.80.0/22\n42.83.88.0/21\n42.83.96.0/19\n42.83.128.0/17\n42.84.0.0/14\n42.88.0.0/13\n42.96.64.0/19\n42.96.96.0/21\n42.96.108.0/22\n42.96.112.0/20\n42.96.128.0/17\n42.97.0.0/16\n42.99.0.0/18\n42.99.64.0/19\n42.99.96.0/20\n42.99.112.0/22\n42.99.120.0/21\n42.100.0.0/14\n42.120.0.0/15\n42.122.0.0/16\n42.123.0.0/19\n42.123.36.0/22\n42.123.40.0/21\n42.123.48.0/20\n42.123.64.0/18\n42.123.128.0/17\n42.128.0.0/12\n42.156.0.0/19\n42.156.36.0/22\n42.156.40.0/21\n42.156.48.0/20\n42.156.64.0/18\n42.156.128.0/17\n42.157.0.0/16\n42.158.0.0/15\n42.160.0.0/12\n42.176.0.0/13\n42.184.0.0/15\n42.186.0.0/16\n42.187.0.0/18\n42.187.64.0/19\n42.187.96.0/20\n42.187.112.0/21\n42.187.120.0/22\n42.187.128.0/17\n42.192.0.0/13\n42.201.0.0/17\n42.202.0.0/15\n42.204.0.0/14\n42.208.0.0/12\n42.224.0.0/12\n42.240.0.0/16\n42.242.0.0/15\n42.244.0.0/14\n42.248.0.0/13\n43.224.12.0/22\n43.224.24.0/22\n43.224.44.0/22\n43.224.52.0/22\n43.224.56.0/22\n43.224.64.0/21\n43.224.72.0/22\n43.224.80.0/22\n43.224.100.0/22\n43.224.144.0/22\n43.224.160.0/22\n43.224.176.0/22\n43.224.184.0/22\n43.224.200.0/21\n43.224.208.0/21\n43.224.216.0/22\n43.224.240.0/22\n43.225.76.0/22\n43.225.84.0/22\n43.225.120.0/21\n43.225.140.0/22\n43.225.172.0/22\n43.225.180.0/22\n43.225.208.0/22\n43.225.216.0/21\n43.225.224.0/20\n43.225.240.0/21\n43.225.252.0/22\n43.226.32.0/19\n43.226.64.0/19\n43.226.96.0/20\n43.226.112.0/21\n43.226.120.0/22\n43.226.128.0/18\n43.226.192.0/20\n43.226.208.0/21\n43.226.236.0/22\n43.226.240.0/20\n43.227.0.0/21\n43.227.8.0/22\n43.227.32.0/19\n43.227.64.0/19\n43.227.96.0/21\n43.227.104.0/22\n43.227.136.0/21\n43.227.144.0/22\n43.227.152.0/21\n43.227.160.0/20\n43.227.176.0/21\n43.227.188.0/22\n43.227.192.0/19\n43.227.232.0/22\n43.227.248.0/21\n43.228.0.0/18\n43.228.64.0/21\n43.228.76.0/22\n43.228.100.0/22\n43.228.116.0/22\n43.228.120.0/22\n43.228.132.0/22\n43.228.136.0/22\n43.228.148.0/22\n43.228.152.0/22\n43.228.188.0/22\n43.229.40.0/22\n43.229.48.0/22\n43.229.56.0/22\n43.229.96.0/22\n43.229.120.0/22\n43.229.136.0/21\n43.229.144.0/22\n43.229.168.0/21\n43.229.176.0/20\n43.229.192.0/21\n43.229.216.0/21\n43.229.232.0/21\n43.230.20.0/22\n43.230.32.0/22\n43.230.68.0/22\n43.230.72.0/22\n43.230.84.0/22\n43.230.124.0/22\n43.230.136.0/22\n43.230.168.0/22\n43.230.220.0/22\n43.230.224.0/19\n43.231.12.0/22\n43.231.32.0/20\n43.231.80.0/20\n43.231.96.0/20\n43.231.136.0/21\n43.231.144.0/20\n43.231.160.0/20\n43.231.176.0/21\n43.236.0.0/15\n43.238.0.0/16\n43.239.0.0/19\n43.239.32.0/20\n43.239.48.0/22\n43.239.116.0/22\n43.239.120.0/22\n43.239.172.0/22\n43.239.176.0/22\n43.240.0.0/22\n43.240.56.0/21\n43.240.68.0/22\n43.240.72.0/21\n43.240.84.0/22\n43.240.124.0/22\n43.240.128.0/21\n43.240.136.0/22\n43.240.144.0/22\n43.240.156.0/22\n43.240.160.0/19\n43.240.192.0/19\n43.240.236.0/22\n43.240.240.0/20\n43.241.0.0/20\n43.241.16.0/21\n43.241.48.0/22\n43.241.76.0/22\n43.241.80.0/20\n43.241.112.0/22\n43.241.168.0/21\n43.241.176.0/21\n43.241.184.0/22\n43.241.196.0/22\n43.241.208.0/20\n43.241.224.0/20\n43.241.240.0/22\n43.241.248.0/21\n43.242.8.0/21\n43.242.16.0/20\n43.242.44.0/22\n43.242.48.0/20\n43.242.64.0/22\n43.242.72.0/21\n43.242.80.0/20\n43.242.96.0/22\n43.242.144.0/20\n43.242.160.0/21\n43.242.168.0/22\n43.242.180.0/22\n43.242.188.0/22\n43.242.192.0/21\n43.242.204.0/22\n43.242.216.0/21\n43.242.252.0/22\n43.243.4.0/22\n43.243.8.0/21\n43.243.16.0/22\n43.243.24.0/22\n43.243.88.0/22\n43.243.128.0/22\n43.243.136.0/22\n43.243.144.0/21\n43.243.156.0/22\n43.243.168.0/22\n43.243.180.0/22\n43.243.188.0/22\n43.243.228.0/22\n43.243.232.0/22\n43.243.244.0/22\n43.246.0.0/18\n43.246.64.0/19\n43.246.96.0/22\n43.246.112.0/22\n43.246.212.0/22\n43.246.228.0/22\n43.247.4.0/22\n43.247.8.0/22\n43.247.44.0/22\n43.247.48.0/22\n43.247.68.0/22\n43.247.76.0/22\n43.247.84.0/22\n43.247.88.0/21\n43.247.96.0/21\n43.247.108.0/22\n43.247.112.0/22\n43.247.148.0/22\n43.247.152.0/22\n43.247.176.0/20\n43.247.196.0/22\n43.247.200.0/21\n43.247.208.0/20\n43.247.224.0/19\n43.248.0.0/21\n43.248.20.0/22\n43.248.28.0/22\n43.248.48.0/22\n43.248.76.0/22\n43.248.80.0/20\n43.248.96.0/19\n43.248.128.0/20\n43.248.144.0/21\n43.248.176.0/20\n43.248.192.0/20\n43.248.208.0/22\n43.248.228.0/22\n43.248.232.0/22\n43.248.244.0/22\n43.249.4.0/22\n43.249.8.0/22\n43.249.24.0/22\n43.249.120.0/22\n43.249.132.0/22\n43.249.136.0/22\n43.249.144.0/20\n43.249.160.0/21\n43.249.168.0/22\n43.249.192.0/22\n43.249.236.0/22\n43.250.4.0/22\n43.250.12.0/22\n43.250.16.0/21\n43.250.28.0/22\n43.250.32.0/21\n43.250.72.0/22\n43.250.96.0/20\n43.250.112.0/21\n43.250.128.0/22\n43.250.144.0/21\n43.250.160.0/22\n43.250.168.0/21\n43.250.176.0/22\n43.250.200.0/22\n43.250.212.0/22\n43.250.216.0/21\n43.250.236.0/22\n43.250.244.0/22\n43.251.4.0/22\n43.251.8.0/21\n43.251.36.0/22\n43.251.100.0/22\n43.251.116.0/22\n43.251.192.0/22\n43.251.232.0/21\n43.251.244.0/22\n43.252.40.0/22\n43.252.48.0/22\n43.252.56.0/22\n43.252.224.0/22\n43.254.0.0/21\n43.254.8.0/22\n43.254.24.0/22\n43.254.36.0/22\n43.254.44.0/22\n43.254.52.0/22\n43.254.64.0/22\n43.254.72.0/22\n43.254.84.0/22\n43.254.88.0/21\n43.254.100.0/22\n43.254.104.0/22\n43.254.112.0/21\n43.254.128.0/22\n43.254.136.0/21\n43.254.144.0/20\n43.254.168.0/21\n43.254.180.0/22\n43.254.184.0/21\n43.254.192.0/21\n43.254.200.0/22\n43.254.208.0/22\n43.254.220.0/22\n43.254.224.0/20\n43.254.240.0/22\n43.254.248.0/21\n43.255.0.0/21\n43.255.8.0/22\n43.255.16.0/22\n43.255.48.0/22\n43.255.64.0/20\n43.255.84.0/22\n43.255.96.0/22\n43.255.108.0/22\n43.255.144.0/22\n43.255.168.0/22\n43.255.176.0/22\n43.255.184.0/22\n43.255.192.0/22\n43.255.200.0/21\n43.255.208.0/21\n43.255.224.0/21\n43.255.232.0/22\n43.255.244.0/22\n45.12.227.0/24\n45.40.192.0/18\n45.65.16.0/20\n45.94.120.0/22\n45.112.132.0/22\n45.112.188.0/22\n45.112.208.0/20\n45.112.228.0/22\n45.112.232.0/21\n45.113.12.0/22\n45.113.16.0/20\n45.113.40.0/22\n45.113.52.0/22\n45.113.56.0/22\n45.113.72.0/22\n45.113.144.0/21\n45.113.168.0/22\n45.113.176.0/22\n45.113.184.0/22\n45.113.200.0/21\n45.113.208.0/20\n45.113.228.0/22\n45.113.240.0/22\n45.113.252.0/22\n45.114.0.0/22\n45.114.12.0/22\n45.114.32.0/22\n45.114.40.0/22\n45.114.52.0/22\n45.114.96.0/22\n45.114.104.0/21\n45.114.124.0/22\n45.114.136.0/22\n45.114.196.0/22\n45.114.200.0/22\n45.114.228.0/22\n45.114.237.0/24\n45.114.238.0/23\n45.114.252.0/22\n45.115.44.0/22\n45.115.100.0/22\n45.115.120.0/22\n45.115.132.0/22\n45.115.144.0/22\n45.115.156.0/22\n45.115.164.0/22\n45.115.200.0/22\n45.115.212.0/22\n45.115.228.0/22\n45.115.236.0/22\n45.115.244.0/22\n45.115.248.0/22\n45.116.12.0/22\n45.116.16.0/22\n45.116.24.0/22\n45.116.32.0/21\n45.116.52.0/22\n45.116.96.0/21\n45.116.140.0/22\n45.116.152.0/22\n45.116.208.0/22\n45.117.8.0/22\n45.117.20.0/22\n45.117.68.0/22\n45.117.124.0/22\n45.117.252.0/22\n45.119.52.0/22\n45.119.60.0/22\n45.119.64.0/21\n45.119.72.0/22\n45.119.104.0/22\n45.119.116.0/22\n45.119.232.0/22\n45.120.100.0/22\n45.120.140.0/22\n45.120.164.0/22\n45.120.180.128/27\n45.120.220.0/22\n45.120.240.0/22\n45.121.20.0/22\n45.121.52.0/22\n45.121.64.0/21\n45.121.72.0/22\n45.121.92.0/22\n45.121.96.0/22\n45.121.104.0/22\n45.121.172.0/22\n45.121.176.0/22\n45.121.212.0/22\n45.121.240.0/20\n45.122.0.0/19\n45.122.32.0/21\n45.122.40.0/22\n45.122.60.0/22\n45.122.64.0/19\n45.122.96.0/20\n45.122.112.0/21\n45.122.160.0/19\n45.122.192.0/20\n45.122.208.0/21\n45.122.216.0/22\n45.123.28.0/22\n45.123.32.0/21\n45.123.44.0/22\n45.123.48.0/20\n45.123.64.0/20\n45.123.80.0/21\n45.123.88.0/22\n45.123.120.0/22\n45.123.128.0/21\n45.123.136.0/22\n45.123.148.0/22\n45.123.152.0/21\n45.123.164.0/22\n45.123.168.0/21\n45.123.176.0/21\n45.123.184.0/22\n45.123.204.0/22\n45.123.212.0/22\n45.123.224.0/19\n45.124.0.0/22\n45.124.20.0/22\n45.124.28.0/22\n45.124.32.0/21\n45.124.44.0/22\n45.124.68.0/22\n45.124.76.0/22\n45.124.80.0/22\n45.124.100.0/22\n45.124.124.0/22\n45.124.172.0/22\n45.124.176.0/22\n45.124.208.0/22\n45.124.248.0/21\n45.125.12.0/22\n45.125.16.0/22\n45.125.24.0/21\n45.125.32.0/22\n45.125.44.0/22\n45.125.52.0/22\n45.125.56.0/22\n45.125.76.0/22\n45.125.80.0/20\n45.125.96.0/21\n45.125.104.0/22\n45.125.136.0/22\n45.126.48.0/21\n45.126.100.0/22\n45.126.108.0/22\n45.126.112.0/21\n45.126.120.0/22\n45.126.212.0/22\n45.126.220.0/22\n45.127.8.0/21\n45.127.96.0/22\n45.127.116.0/22\n45.127.124.0/22\n45.127.128.0/22\n45.127.144.0/21\n45.127.156.0/22\n45.127.216.0/22\n45.136.44.0/24\n45.248.8.0/22\n45.248.80.0/21\n45.248.88.0/22\n45.248.96.0/20\n45.248.128.0/21\n45.248.204.0/22\n45.248.208.0/20\n45.248.224.0/19\n45.249.0.0/21\n45.249.12.0/22\n45.249.16.0/20\n45.249.32.0/21\n45.249.92.0/22\n45.249.112.0/22\n45.249.180.0/22\n45.249.188.0/22\n45.249.192.0/20\n45.249.208.0/21\n45.250.12.0/22\n45.250.16.0/22\n45.250.28.0/22\n45.250.32.0/21\n45.250.40.0/22\n45.250.76.0/22\n45.250.80.0/20\n45.250.96.0/22\n45.250.104.0/21\n45.250.112.0/20\n45.250.128.0/20\n45.250.144.0/21\n45.250.152.0/22\n45.250.164.0/22\n45.250.180.0/22\n45.250.184.0/21\n45.250.192.0/22\n45.251.0.0/22\n45.251.8.0/22\n45.251.16.0/21\n45.251.52.0/22\n45.251.84.0/22\n45.251.88.0/21\n45.251.96.0/21\n45.251.120.0/21\n45.251.136.0/21\n45.251.144.0/20\n45.251.160.0/19\n45.251.192.0/19\n45.251.224.0/22\n45.251.240.0/22\n45.252.0.0/19\n45.252.32.0/20\n45.252.48.0/22\n45.252.60.0/22\n45.252.84.0/22\n45.252.88.0/21\n45.252.96.0/19\n45.252.128.0/19\n45.252.160.0/20\n45.252.176.0/22\n45.252.192.0/19\n45.252.224.0/21\n45.252.232.0/22\n45.253.0.0/18\n45.253.64.0/20\n45.253.80.0/21\n45.253.92.0/22\n45.253.96.0/20\n45.253.112.0/21\n45.253.120.0/22\n45.253.130.0/23\n45.253.132.0/22\n45.253.136.0/21\n45.253.144.0/20\n45.253.160.0/19\n45.253.192.0/18\n45.254.0.0/19\n45.254.40.0/22\n45.254.48.0/20\n45.254.64.0/18\n45.254.128.0/18\n45.254.192.0/19\n45.254.224.0/21\n45.254.236.0/22\n45.254.240.0/22\n45.254.248.0/22\n45.255.0.0/17\n45.255.132.0/22\n45.255.136.0/21\n45.255.144.0/20\n45.255.160.0/19\n45.255.192.0/19\n45.255.224.0/20\n45.255.240.0/21\n45.255.248.0/22\n46.248.24.0/23\n47.92.0.0/14\n47.96.0.0/11\n49.4.0.0/14\n49.51.0.0/16\n49.52.0.0/14\n49.64.0.0/11\n49.112.0.0/13\n49.120.0.0/14\n49.128.0.0/24\n49.128.2.0/23\n49.128.4.0/22\n49.140.0.0/15\n49.152.0.0/14\n49.208.0.0/14\n49.220.0.0/14\n49.232.0.0/14\n49.239.0.0/18\n49.239.192.0/18\n49.246.224.0/19\n52.80.0.0/14\n52.94.249.0/27\n52.130.0.0/15\n54.222.0.0/15\n54.231.208.0/20\n54.240.224.0/24\n57.92.96.0/20\n58.14.0.0/15\n58.16.0.0/13\n58.24.0.0/15\n58.30.0.0/15\n58.32.0.0/11\n58.65.232.0/21\n58.66.0.0/15\n58.68.128.0/17\n58.82.0.0/17\n58.83.0.0/16\n58.87.64.0/18\n58.99.128.0/17\n58.100.0.0/15\n58.116.0.0/14\n58.128.0.0/13\n58.144.0.0/16\n58.154.0.0/15\n58.192.0.0/11\n58.240.0.0/12\n59.32.0.0/11\n59.64.0.0/12\n59.80.0.0/14\n59.107.0.0/16\n59.108.0.0/14\n59.151.0.0/17\n59.152.16.0/20\n59.152.32.0/21\n59.152.64.0/20\n59.152.112.0/21\n59.153.4.0/22\n59.153.32.0/22\n59.153.60.0/22\n59.153.64.0/21\n59.153.72.0/22\n59.153.92.0/22\n59.153.116.0/22\n59.153.136.0/22\n59.153.152.0/21\n59.153.164.0/22\n59.153.168.0/21\n59.153.176.0/20\n59.153.192.0/22\n59.155.0.0/16\n59.172.0.0/14\n59.191.0.0/17\n59.191.240.0/20\n59.192.0.0/10\n60.0.0.0/11\n60.55.0.0/16\n60.63.0.0/16\n60.160.0.0/11\n60.194.0.0/15\n60.200.0.0/13\n60.208.0.0/12\n60.232.0.0/15\n60.235.0.0/16\n60.245.128.0/17\n60.247.0.0/16\n60.252.0.0/16\n60.253.128.0/17\n60.255.0.0/16\n61.4.80.0/20\n61.4.176.0/20\n61.8.160.0/20\n61.14.212.0/22\n61.14.216.0/21\n61.14.240.0/21\n61.28.0.0/17\n61.29.128.0/18\n61.29.192.0/19\n61.29.224.0/20\n61.45.128.0/18\n61.45.224.0/20\n61.47.128.0/18\n61.48.0.0/13\n61.87.192.0/18\n61.128.0.0/10\n61.232.0.0/14\n61.236.0.0/15\n61.240.0.0/14\n62.234.0.0/16\n64.85.27.0/24\n68.79.0.0/18\n69.230.192.0/18\n69.231.128.0/18\n69.234.192.0/18\n69.235.128.0/18\n71.131.192.0/18\n71.132.0.0/18\n71.136.64.0/18\n71.137.0.0/18\n72.163.240.0/23\n72.163.248.0/22\n81.68.0.0/14\n82.156.0.0/15\n87.254.207.0/24\n93.183.14.0/24\n93.183.18.0/24\n94.191.0.0/17\n101.0.0.0/22\n101.1.0.0/22\n101.2.172.0/22\n101.4.0.0/14\n101.16.0.0/12\n101.32.0.0/12\n101.48.0.0/15\n101.50.8.0/21\n101.50.56.0/22\n101.52.0.0/16\n101.53.100.0/22\n101.54.0.0/16\n101.55.224.0/21\n101.64.0.0/13\n101.72.0.0/14\n101.76.0.0/15\n101.78.0.0/22\n101.78.32.0/19\n101.80.0.0/12\n101.96.0.0/21\n101.96.8.0/22\n101.96.16.0/20\n101.96.128.0/17\n101.99.96.0/19\n101.101.64.0/19\n101.101.100.0/24\n101.101.102.0/23\n101.101.104.0/21\n101.101.112.0/20\n101.102.64.0/19\n101.102.100.0/23\n101.102.102.0/24\n101.102.104.0/21\n101.102.112.0/20\n101.104.0.0/14\n101.110.64.0/19\n101.110.96.0/20\n101.110.116.0/22\n101.110.120.0/21\n101.120.0.0/14\n101.124.0.0/15\n101.126.0.0/16\n101.128.0.0/22\n101.128.8.0/21\n101.128.16.0/20\n101.128.32.0/19\n101.129.0.0/16\n101.130.0.0/15\n101.132.0.0/14\n101.144.0.0/12\n101.192.0.0/13\n101.200.0.0/15\n101.203.128.0/19\n101.203.160.0/21\n101.203.172.0/22\n101.203.176.0/20\n101.204.0.0/14\n101.224.0.0/13\n101.232.0.0/15\n101.234.64.0/21\n101.234.76.0/22\n101.234.80.0/20\n101.234.96.0/19\n101.236.0.0/14\n101.240.0.0/13\n101.248.0.0/15\n101.251.0.0/22\n101.251.8.0/21\n101.251.16.0/20\n101.251.32.0/19\n101.251.64.0/18\n101.251.128.0/17\n101.252.0.0/15\n101.254.0.0/16\n102.176.130.0/24\n103.1.8.0/22\n103.1.20.0/22\n103.1.24.0/22\n103.1.72.0/22\n103.1.88.0/22\n103.1.168.0/22\n103.2.108.0/22\n103.2.156.0/22\n103.2.164.0/22\n103.2.200.0/21\n103.2.208.0/21\n103.3.84.0/22\n103.3.88.0/21\n103.3.96.0/19\n103.3.128.0/20\n103.3.148.0/22\n103.3.152.0/21\n103.4.56.0/22\n103.4.168.0/22\n103.4.184.0/22\n103.4.224.0/22\n103.5.36.0/22\n103.5.52.0/22\n103.5.56.0/22\n103.5.152.0/22\n103.5.168.0/22\n103.5.192.0/22\n103.5.252.0/22\n103.6.76.0/22\n103.6.108.0/22\n103.6.120.0/22\n103.6.220.0/22\n103.6.228.0/22\n103.7.4.0/22\n103.7.28.0/22\n103.7.140.0/22\n103.7.212.0/22\n103.7.216.0/21\n103.8.0.0/21\n103.8.8.0/22\n103.8.32.0/22\n103.8.52.0/22\n103.8.68.0/22\n103.8.108.0/22\n103.8.156.0/22\n103.8.200.0/21\n103.8.220.0/22\n103.9.8.0/22\n103.9.24.0/22\n103.9.108.0/22\n103.9.152.0/22\n103.9.192.0/22\n103.9.248.0/21\n103.10.0.0/22\n103.10.16.0/22\n103.10.84.0/22\n103.10.111.0/24\n103.10.140.0/22\n103.11.16.0/22\n103.11.168.0/22\n103.11.180.0/22\n103.12.32.0/22\n103.12.68.0/22\n103.12.92.0/22\n103.12.136.0/22\n103.12.184.0/22\n103.12.232.0/22\n103.13.12.0/22\n103.13.124.0/22\n103.13.144.0/22\n103.13.196.0/22\n103.13.220.0/22\n103.13.244.0/22\n103.14.32.0/22\n103.14.84.0/22\n103.14.100.0/22\n103.14.132.0/22\n103.14.136.0/22\n103.14.156.0/22\n103.14.240.0/22\n103.15.4.0/22\n103.15.8.0/22\n103.15.16.0/22\n103.15.96.0/22\n103.15.200.0/22\n103.16.52.0/22\n103.16.80.0/21\n103.16.88.0/22\n103.16.108.0/22\n103.16.124.0/22\n103.17.40.0/22\n103.17.64.0/22\n103.17.120.0/22\n103.17.136.0/22\n103.17.160.0/22\n103.17.204.0/22\n103.17.228.0/22\n103.18.192.0/22\n103.18.208.0/21\n103.18.224.0/22\n103.19.0.0/22\n103.19.12.0/22\n103.19.40.0/21\n103.19.64.0/21\n103.19.72.0/22\n103.19.232.0/22\n103.20.12.0/22\n103.20.32.0/22\n103.20.44.0/22\n103.20.68.0/22\n103.20.112.0/22\n103.20.128.0/22\n103.20.160.0/22\n103.20.248.0/22\n103.21.112.0/21\n103.21.136.0/21\n103.21.176.0/22\n103.21.208.0/22\n103.21.240.0/22\n103.22.0.0/18\n103.22.64.0/19\n103.22.100.0/22\n103.22.104.0/21\n103.22.112.0/20\n103.22.188.0/22\n103.22.228.0/22\n103.22.252.0/22\n103.23.8.0/22\n103.23.56.0/22\n103.23.160.0/21\n103.23.176.0/22\n103.23.228.0/22\n103.24.24.0/22\n103.24.116.0/22\n103.24.128.0/22\n103.24.144.0/22\n103.24.176.0/22\n103.24.184.0/22\n103.24.220.0/22\n103.24.228.0/22\n103.24.248.0/21\n103.25.8.0/23\n103.25.20.0/22\n103.25.24.0/21\n103.25.32.0/21\n103.25.40.0/22\n103.25.48.0/22\n103.25.64.0/21\n103.25.148.0/22\n103.25.156.0/22\n103.25.216.0/22\n103.26.0.0/22\n103.26.64.0/22\n103.26.76.0/22\n103.26.116.0/22\n103.26.132.0/22\n103.26.156.0/22\n103.26.160.0/22\n103.26.228.0/22\n103.26.240.0/22\n103.27.4.0/22\n103.27.12.0/22\n103.27.24.0/22\n103.27.56.0/22\n103.27.96.0/22\n103.27.184.0/22\n103.27.208.0/21\n103.27.240.0/22\n103.28.4.0/22\n103.28.8.0/22\n103.28.184.0/22\n103.28.204.0/22\n103.28.212.0/22\n103.29.16.0/22\n103.29.128.0/21\n103.29.136.0/22\n103.30.20.0/22\n103.30.96.0/22\n103.30.148.0/22\n103.30.200.0/22\n103.30.228.0/22\n103.30.236.0/22\n103.31.0.0/22\n103.31.48.0/20\n103.31.64.0/21\n103.31.72.0/24\n103.31.148.0/22\n103.31.160.0/22\n103.31.168.0/22\n103.31.200.0/22\n103.31.236.0/22\n103.32.0.0/15\n103.34.0.0/16\n103.35.0.0/19\n103.35.32.0/20\n103.35.48.0/22\n103.35.104.0/22\n103.35.116.0/22\n103.35.180.0/22\n103.35.200.0/22\n103.35.220.0/22\n103.36.28.0/22\n103.36.36.0/22\n103.36.56.0/21\n103.36.64.0/22\n103.36.72.0/22\n103.36.96.0/22\n103.36.132.0/22\n103.36.136.0/22\n103.36.160.0/19\n103.36.192.0/19\n103.36.224.0/20\n103.36.240.0/21\n103.37.0.0/22\n103.37.12.0/22\n103.37.16.0/22\n103.37.24.0/22\n103.37.44.0/22\n103.37.52.0/22\n103.37.56.0/22\n103.37.72.0/22\n103.37.100.0/22\n103.37.104.0/22\n103.37.124.0/22\n103.37.136.0/21\n103.37.144.0/20\n103.37.160.0/21\n103.37.172.0/22\n103.37.176.0/22\n103.37.188.0/22\n103.37.208.0/20\n103.37.248.0/21\n103.38.0.0/22\n103.38.32.0/22\n103.38.40.0/21\n103.38.56.0/22\n103.38.76.0/22\n103.38.84.0/22\n103.38.92.0/22\n103.38.96.0/22\n103.38.116.0/22\n103.38.132.0/22\n103.38.140.0/22\n103.38.220.0/22\n103.38.224.0/21\n103.38.232.0/22\n103.38.252.0/22\n103.39.16.0/22\n103.39.64.0/22\n103.39.88.0/22\n103.39.100.0/22\n103.39.104.0/21\n103.39.160.0/19\n103.39.200.0/21\n103.39.208.0/20\n103.39.224.0/21\n103.39.232.0/22\n103.40.12.0/22\n103.40.16.0/20\n103.40.32.0/20\n103.40.88.0/22\n103.40.100.0/22\n103.40.112.0/22\n103.40.192.0/22\n103.40.212.0/22\n103.40.220.0/22\n103.40.228.0/22\n103.40.232.0/21\n103.40.240.0/20\n103.41.0.0/22\n103.41.16.0/22\n103.41.52.0/22\n103.41.140.0/22\n103.41.148.0/22\n103.41.152.0/22\n103.41.160.0/21\n103.41.220.0/22\n103.41.224.0/21\n103.41.232.0/22\n103.42.8.0/22\n103.42.24.0/21\n103.42.32.0/22\n103.42.64.0/21\n103.42.76.0/22\n103.42.104.0/22\n103.42.180.0/22\n103.42.232.0/22\n103.43.16.0/22\n103.43.26.0/23\n103.43.84.0/22\n103.43.96.0/21\n103.43.104.0/22\n103.43.124.0/22\n103.43.184.0/22\n103.43.192.0/21\n103.43.208.0/22\n103.43.220.0/22\n103.43.224.0/22\n103.43.232.0/22\n103.43.240.0/22\n103.44.56.0/22\n103.44.80.0/22\n103.44.88.0/22\n103.44.120.0/21\n103.44.132.0/22\n103.44.144.0/22\n103.44.152.0/22\n103.44.168.0/22\n103.44.176.0/20\n103.44.192.0/20\n103.44.224.0/22\n103.44.236.0/22\n103.44.240.0/20\n103.45.0.0/18\n103.45.72.0/21\n103.45.80.0/20\n103.45.96.0/19\n103.45.128.0/18\n103.45.192.0/19\n103.45.224.0/22\n103.45.248.0/22\n103.46.0.0/22\n103.46.12.0/22\n103.46.16.0/20\n103.46.32.0/19\n103.46.64.0/18\n103.46.128.0/21\n103.46.136.0/22\n103.46.152.0/21\n103.46.160.0/20\n103.46.176.0/21\n103.46.244.0/22\n103.46.248.0/22\n103.47.4.0/22\n103.47.20.0/22\n103.47.36.0/22\n103.47.40.0/22\n103.47.48.0/22\n103.47.80.0/22\n103.47.96.0/22\n103.47.108.0/22\n103.47.116.0/22\n103.47.120.0/22\n103.47.136.0/21\n103.47.212.0/22\n103.48.52.0/22\n103.48.92.0/22\n103.48.144.0/20\n103.48.202.0/23\n103.48.216.0/21\n103.48.224.0/20\n103.48.240.0/21\n103.49.12.0/22\n103.49.20.0/22\n103.49.72.0/21\n103.49.92.0/22\n103.49.96.0/22\n103.49.108.0/22\n103.49.128.0/22\n103.49.176.0/21\n103.49.196.0/22\n103.49.248.0/22\n103.50.36.0/22\n103.50.44.0/22\n103.50.48.0/20\n103.50.64.0/21\n103.50.72.0/22\n103.50.92.0/22\n103.50.108.0/22\n103.50.112.0/20\n103.50.132.0/22\n103.50.136.0/21\n103.50.172.0/22\n103.50.176.0/20\n103.50.192.0/21\n103.50.200.0/22\n103.50.220.0/22\n103.50.224.0/20\n103.50.240.0/21\n103.50.248.0/22\n103.52.40.0/22\n103.52.72.0/21\n103.52.80.0/21\n103.52.96.0/21\n103.52.104.0/22\n103.52.160.0/21\n103.52.172.0/22\n103.52.176.0/22\n103.52.184.0/22\n103.52.196.0/22\n103.53.4.0/22\n103.53.64.0/21\n103.53.92.0/22\n103.53.100.0/22\n103.53.124.0/22\n103.53.128.0/20\n103.53.144.0/22\n103.53.160.0/22\n103.53.180.0/22\n103.53.204.0/22\n103.53.208.0/21\n103.53.216.0/22\n103.53.236.0/22\n103.53.248.0/22\n103.54.8.0/22\n103.54.48.0/22\n103.54.60.0/22\n103.54.160.0/21\n103.54.212.0/22\n103.54.228.0/22\n103.54.240.0/22\n103.55.24.0/22\n103.55.80.0/22\n103.55.120.0/22\n103.55.152.0/22\n103.55.172.0/22\n103.55.204.0/22\n103.55.208.0/22\n103.55.228.0/22\n103.55.236.0/22\n103.55.240.0/22\n103.56.8.0/22\n103.56.16.0/21\n103.56.32.0/22\n103.56.52.0/22\n103.56.56.0/21\n103.56.72.0/21\n103.56.140.0/22\n103.56.152.0/22\n103.56.184.0/22\n103.56.200.0/22\n103.57.12.0/22\n103.57.52.0/22\n103.57.56.0/22\n103.57.76.0/22\n103.57.136.0/22\n103.57.196.0/22\n103.58.24.0/22\n103.59.76.0/22\n103.59.100.0/22\n103.59.112.0/20\n103.59.128.0/22\n103.59.148.0/22\n103.59.164.0/22\n103.60.32.0/22\n103.60.44.0/22\n103.60.164.0/22\n103.60.228.0/22\n103.60.236.0/22\n103.61.60.0/22\n103.61.104.0/22\n103.61.140.0/22\n103.61.152.0/21\n103.61.160.0/22\n103.61.172.0/22\n103.61.176.0/22\n103.61.184.0/21\n103.62.24.0/22\n103.62.52.0/22\n103.62.72.0/21\n103.62.80.0/21\n103.62.88.0/22\n103.62.96.0/19\n103.62.128.0/21\n103.62.156.0/22\n103.62.160.0/19\n103.62.192.0/22\n103.62.204.0/22\n103.62.208.0/20\n103.62.224.0/22\n103.63.32.0/19\n103.63.64.0/20\n103.63.80.0/21\n103.63.88.0/22\n103.63.140.0/22\n103.63.144.0/22\n103.63.152.0/22\n103.63.160.0/20\n103.63.176.0/21\n103.63.184.0/22\n103.63.192.0/20\n103.63.208.0/22\n103.63.240.0/20\n103.64.0.0/21\n103.64.24.0/21\n103.64.32.0/19\n103.64.64.0/18\n103.64.140.0/22\n103.64.144.0/22\n103.64.152.0/21\n103.64.160.0/19\n103.64.192.0/18\n103.65.0.0/20\n103.65.16.0/22\n103.65.36.0/22\n103.65.40.0/22\n103.65.48.0/20\n103.65.64.0/19\n103.65.100.0/22\n103.65.104.0/21\n103.65.112.0/20\n103.65.128.0/21\n103.65.136.0/22\n103.65.144.0/20\n103.65.160.0/20\n103.66.32.0/22\n103.66.40.0/22\n103.66.92.0/22\n103.66.108.0/22\n103.66.200.0/22\n103.66.216.0/22\n103.66.240.0/20\n103.67.0.0/21\n103.67.8.0/22\n103.67.40.0/21\n103.67.48.0/20\n103.67.64.0/18\n103.67.128.0/20\n103.67.144.0/21\n103.67.172.0/22\n103.67.192.0/22\n103.67.212.0/22\n103.67.252.0/22\n103.68.64.0/22\n103.68.88.0/22\n103.68.100.0/22\n103.68.128.0/22\n103.68.192.0/22\n103.69.16.0/22\n103.69.116.0/22\n103.69.132.0/22\n103.69.152.0/22\n103.69.212.0/22\n103.70.8.0/22\n103.70.148.0/22\n103.70.184.0/22\n103.70.220.0/22\n103.70.224.0/22\n103.70.236.0/22\n103.70.252.0/22\n103.71.0.0/22\n103.71.32.0/22\n103.71.48.0/22\n103.71.68.0/22\n103.71.72.0/22\n103.71.80.0/21\n103.71.88.0/22\n103.71.120.0/21\n103.71.128.0/22\n103.71.144.0/22\n103.71.196.0/22\n103.71.200.0/22\n103.71.232.0/22\n103.72.12.0/22\n103.72.16.0/20\n103.72.32.0/20\n103.72.48.0/21\n103.72.112.0/20\n103.72.128.0/21\n103.72.144.0/21\n103.72.172.0/22\n103.72.180.0/22\n103.72.224.0/19\n103.73.0.0/19\n103.73.48.0/22\n103.73.88.0/22\n103.73.96.0/22\n103.73.116.0/22\n103.73.120.0/22\n103.73.128.0/20\n103.73.144.0/22\n103.73.168.0/22\n103.73.176.0/22\n103.73.204.0/22\n103.73.208.0/22\n103.73.240.0/21\n103.73.248.0/22\n103.74.24.0/21\n103.74.32.0/20\n103.74.48.0/22\n103.74.56.0/21\n103.74.80.0/22\n103.74.124.0/22\n103.74.148.0/22\n103.74.152.0/21\n103.74.204.0/22\n103.74.232.0/22\n103.75.16.0/22\n103.75.87.0/24\n103.75.88.0/21\n103.75.104.0/21\n103.75.112.0/22\n103.75.120.0/22\n103.75.128.0/22\n103.75.144.0/22\n103.75.152.0/22\n103.75.236.0/24\n103.76.60.0/22\n103.76.64.0/21\n103.76.72.0/22\n103.76.84.0/22\n103.76.92.0/22\n103.76.216.0/21\n103.76.224.0/22\n103.77.28.0/22\n103.77.52.0/22\n103.77.56.0/22\n103.77.72.0/22\n103.77.88.0/21\n103.77.132.0/22\n103.77.148.0/22\n103.77.220.0/22\n103.78.56.0/21\n103.78.64.0/21\n103.78.124.0/22\n103.78.172.0/22\n103.78.176.0/22\n103.78.196.0/22\n103.78.228.0/22\n103.79.24.0/21\n103.79.36.0/22\n103.79.40.0/21\n103.79.52.0/22\n103.79.56.0/21\n103.79.64.0/21\n103.79.80.0/21\n103.79.120.0/22\n103.79.136.0/22\n103.79.188.0/22\n103.79.192.0/20\n103.79.208.0/21\n103.79.240.0/22\n103.80.24.0/21\n103.80.44.0/22\n103.80.72.0/22\n103.80.176.0/21\n103.80.184.0/22\n103.80.192.0/22\n103.80.200.0/22\n103.80.232.0/22\n103.81.4.0/22\n103.81.8.0/22\n103.81.16.0/21\n103.81.44.0/22\n103.81.48.0/22\n103.81.96.0/22\n103.81.120.0/22\n103.81.148.0/22\n103.81.164.0/22\n103.81.168.0/22\n103.81.183.0/24\n103.81.184.0/22\n103.81.200.0/22\n103.81.232.0/22\n103.82.52.0/22\n103.82.60.0/22\n103.82.68.0/22\n103.82.84.0/22\n103.82.104.0/22\n103.82.224.0/22\n103.82.236.0/22\n103.83.44.0/22\n103.83.52.0/22\n103.83.60.0/22\n103.83.64.0/22\n103.83.72.0/22\n103.83.112.0/22\n103.83.120.0/22\n103.83.132.0/22\n103.83.180.0/22\n103.84.0.0/22\n103.84.12.0/22\n103.84.16.0/20\n103.84.48.0/22\n103.84.56.0/22\n103.84.64.0/22\n103.84.72.0/22\n103.84.92.0/22\n103.84.108.0/22\n103.84.136.0/22\n103.85.20.0/22\n103.85.24.0/22\n103.85.44.0/22\n103.85.48.0/21\n103.85.56.0/22\n103.85.84.0/22\n103.85.136.0/22\n103.85.144.0/22\n103.85.164.0/22\n103.85.168.0/21\n103.85.176.0/22\n103.85.224.0/22\n103.86.28.0/22\n103.86.32.0/22\n103.86.44.0/22\n103.86.60.0/22\n103.86.68.0/22\n103.86.80.0/21\n103.86.88.0/22\n103.86.129.0/24\n103.86.204.0/22\n103.86.208.0/20\n103.86.224.0/19\n103.87.0.0/21\n103.87.20.0/22\n103.87.32.0/22\n103.87.72.0/22\n103.87.96.0/22\n103.87.132.0/22\n103.87.180.0/22\n103.87.224.0/22\n103.88.4.0/22\n103.88.8.0/21\n103.88.16.0/21\n103.88.32.0/21\n103.88.60.0/22\n103.88.64.0/22\n103.88.72.0/22\n103.88.96.0/21\n103.88.152.0/23\n103.88.164.0/22\n103.88.176.0/22\n103.88.184.0/21\n103.88.212.0/22\n103.89.28.0/22\n103.89.96.0/20\n103.89.112.0/21\n103.89.148.0/22\n103.89.172.0/22\n103.89.184.0/21\n103.89.192.0/19\n103.89.224.0/21\n103.90.52.0/22\n103.90.92.0/22\n103.90.100.0/22\n103.90.104.0/21\n103.90.112.0/20\n103.90.128.0/21\n103.90.152.0/22\n103.90.168.0/22\n103.90.173.0/24\n103.90.176.0/22\n103.90.188.0/22\n103.90.192.0/22\n103.91.36.0/22\n103.91.40.0/22\n103.91.108.0/22\n103.91.152.0/22\n103.91.176.0/22\n103.91.200.0/22\n103.91.208.0/21\n103.91.219.0/24\n103.91.236.0/22\n103.91.252.0/22\n103.92.0.0/20\n103.92.48.0/20\n103.92.64.0/20\n103.92.80.0/22\n103.92.86.0/24\n103.92.88.0/22\n103.92.108.0/22\n103.92.124.0/22\n103.92.128.0/24\n103.92.132.0/22\n103.92.156.0/22\n103.92.164.0/22\n103.92.168.0/21\n103.92.176.0/20\n103.92.192.0/22\n103.92.236.0/22\n103.92.240.0/20\n103.93.0.0/21\n103.93.28.0/22\n103.93.76.0/22\n103.93.84.0/22\n103.93.121.0/24\n103.93.152.0/22\n103.93.180.0/22\n103.93.204.0/22\n103.94.12.0/22\n103.94.20.0/22\n103.94.28.0/22\n103.94.32.0/20\n103.94.72.0/22\n103.94.88.0/22\n103.94.116.0/22\n103.94.160.0/22\n103.94.180.0/22\n103.94.200.0/22\n103.95.28.0/22\n103.95.52.0/22\n103.95.64.0/21\n103.95.88.0/21\n103.95.116.0/22\n103.95.128.0/22\n103.95.136.0/21\n103.95.144.0/22\n103.95.152.0/22\n103.95.207.0/24\n103.95.216.0/21\n103.95.224.0/22\n103.95.236.0/22\n103.95.240.0/20\n103.96.0.0/22\n103.96.8.0/22\n103.96.80.0/22\n103.96.124.0/22\n103.96.136.0/22\n103.96.140.0/24\n103.96.148.0/22\n103.96.152.0/21\n103.96.160.0/19\n103.96.192.0/20\n103.96.208.0/21\n103.96.216.0/22\n103.97.8.0/21\n103.97.16.0/20\n103.97.32.0/21\n103.97.40.0/22\n103.97.56.0/21\n103.97.64.0/21\n103.97.72.0/22\n103.97.80.0/22\n103.97.112.0/21\n103.97.128.0/22\n103.97.144.0/21\n103.97.188.0/22\n103.97.192.0/22\n103.97.224.0/22\n103.97.228.0/23\n103.98.28.0/23\n103.98.40.0/21\n103.98.48.0/22\n103.98.56.0/22\n103.98.80.0/22\n103.98.88.0/21\n103.98.96.0/21\n103.98.124.0/22\n103.98.136.0/21\n103.98.144.0/22\n103.98.164.0/22\n103.98.168.0/22\n103.98.180.0/22\n103.98.196.0/22\n103.98.216.0/21\n103.98.224.0/21\n103.98.232.0/22\n103.98.240.0/20\n103.99.40.0/23\n103.99.52.0/22\n103.99.56.0/21\n103.99.76.0/22\n103.99.104.0/22\n103.99.116.0/22\n103.99.120.0/22\n103.99.132.0/22\n103.99.136.0/21\n103.99.144.0/22\n103.99.152.0/22\n103.99.220.0/22\n103.99.232.0/21\n103.100.0.0/22\n103.100.32.0/22\n103.100.40.0/22\n103.100.48.0/20\n103.100.64.0/21\n103.100.88.0/22\n103.100.116.0/22\n103.100.140.0/22\n103.100.144.0/22\n103.100.236.0/22\n103.100.240.0/22\n103.100.248.0/21\n103.101.4.0/22\n103.101.8.0/21\n103.101.28.0/22\n103.101.60.0/22\n103.101.120.0/21\n103.101.144.0/21\n103.101.153.0/24\n103.101.180.0/22\n103.101.184.0/22\n103.102.76.0/22\n103.102.80.0/22\n103.102.168.0/21\n103.102.180.0/22\n103.102.184.0/21\n103.102.192.0/21\n103.102.200.0/22\n103.102.208.0/21\n103.103.12.0/22\n103.103.16.0/22\n103.103.36.0/22\n103.103.68.0/22\n103.103.72.0/22\n103.103.176.0/22\n103.103.188.0/22\n103.103.200.0/21\n103.103.220.0/22\n103.103.224.0/21\n103.103.232.0/22\n103.103.248.0/21\n103.104.0.0/21\n103.104.36.0/22\n103.104.40.0/22\n103.104.64.0/22\n103.104.104.0/22\n103.104.152.0/22\n103.104.168.0/21\n103.104.188.0/22\n103.104.198.0/23\n103.104.252.0/22\n103.105.0.0/21\n103.105.12.0/22\n103.105.16.0/22\n103.105.23.0/24\n103.105.56.0/21\n103.105.116.0/22\n103.105.132.0/22\n103.105.180.0/22\n103.105.184.0/22\n103.105.200.0/21\n103.105.220.0/22\n103.106.36.0/22\n103.106.40.0/21\n103.106.60.0/22\n103.106.68.0/22\n103.106.96.0/22\n103.106.120.0/22\n103.106.128.0/21\n103.106.160.0/22\n103.106.188.0/22\n103.106.196.0/22\n103.106.202.0/23\n103.106.212.0/22\n103.106.244.0/22\n103.106.252.0/22\n103.107.0.0/22\n103.107.8.0/24\n103.107.28.0/22\n103.107.32.0/22\n103.107.44.0/22\n103.107.72.0/22\n103.107.108.0/22\n103.107.164.0/22\n103.107.168.0/22\n103.107.188.0/22\n103.107.192.0/22\n103.107.208.0/20\n103.108.52.0/22\n103.108.64.0/22\n103.108.160.0/21\n103.108.184.0/23\n103.108.188.0/23\n103.108.192.0/21\n103.108.208.0/21\n103.108.224.0/22\n103.108.244.0/22\n103.108.251.0/24\n103.109.20.0/22\n103.109.48.0/22\n103.109.88.0/22\n103.109.106.0/23\n103.109.248.0/22\n103.110.32.0/22\n103.110.80.0/23\n103.110.92.0/22\n103.110.100.0/22\n103.110.116.0/22\n103.110.127.0/24\n103.110.128.0/23\n103.110.131.0/24\n103.110.132.0/22\n103.110.136.0/22\n103.110.152.0/21\n103.110.188.0/22\n103.110.204.0/22\n103.111.38.0/23\n103.111.64.0/22\n103.111.172.0/22\n103.111.252.0/22\n103.112.28.0/22\n103.112.68.0/22\n103.112.72.0/22\n103.112.88.0/21\n103.112.96.0/22\n103.112.108.0/22\n103.112.112.0/21\n103.112.140.0/22\n103.112.172.0/22\n103.112.184.0/22\n103.112.208.0/22\n103.113.4.0/22\n103.113.92.0/22\n103.113.144.0/22\n103.113.220.0/22\n103.113.232.0/21\n103.114.4.0/22\n103.114.28.0/22\n103.114.68.0/22\n103.114.72.0/22\n103.114.100.0/22\n103.114.132.0/22\n103.114.148.0/22\n103.114.156.0/22\n103.114.176.0/22\n103.114.212.0/22\n103.114.236.0/22\n103.114.240.0/22\n103.115.16.0/22\n103.115.40.0/21\n103.115.48.0/20\n103.115.64.0/21\n103.115.92.0/22\n103.115.120.0/22\n103.115.148.0/22\n103.115.204.0/23\n103.115.248.0/22\n103.116.20.0/22\n103.116.40.0/22\n103.116.64.0/22\n103.116.72.0/21\n103.116.92.0/22\n103.116.120.0/22\n103.116.128.0/22\n103.116.132.0/23\n103.116.148.0/22\n103.116.184.0/22\n103.116.206.0/23\n103.116.220.0/22\n103.116.224.0/21\n103.117.16.0/22\n103.117.72.0/22\n103.117.88.0/22\n103.117.132.0/22\n103.117.136.0/22\n103.117.188.0/22\n103.117.220.0/22\n103.118.19.0/24\n103.118.36.0/22\n103.118.52.0/22\n103.118.56.0/21\n103.118.64.0/21\n103.118.72.0/22\n103.118.88.0/22\n103.118.173.0/24\n103.118.192.0/19\n103.118.240.0/20\n103.119.0.0/22\n103.119.12.0/22\n103.119.16.0/22\n103.119.28.0/22\n103.119.44.0/22\n103.119.104.0/22\n103.119.115.0/24\n103.119.156.0/22\n103.119.180.0/22\n103.119.200.0/22\n103.119.224.0/22\n103.120.52.0/22\n103.120.72.0/22\n103.120.76.0/24\n103.120.88.0/22\n103.120.96.0/21\n103.120.140.0/22\n103.120.196.0/22\n103.120.224.0/22\n103.121.52.0/22\n103.121.92.0/22\n103.121.160.0/21\n103.121.250.0/24\n103.121.252.0/22\n103.122.48.0/22\n103.122.176.0/22\n103.122.192.0/22\n103.122.240.0/22\n103.123.4.0/22\n103.123.56.0/22\n103.123.88.0/21\n103.123.116.0/22\n103.123.160.0/22\n103.123.176.0/22\n103.123.200.0/21\n103.123.208.0/21\n103.124.24.0/22\n103.124.48.0/22\n103.124.64.0/22\n103.124.212.0/22\n103.124.216.0/22\n103.125.20.0/22\n103.125.44.0/22\n103.125.132.0/22\n103.125.164.0/22\n103.125.196.0/22\n103.125.236.0/22\n103.125.248.0/22\n103.126.0.0/22\n103.126.16.0/22\n103.126.44.0/22\n103.126.100.0/22\n103.126.124.0/22\n103.126.128.0/21\n103.126.208.0/22\n103.126.241.0/24\n103.129.52.0/22\n103.129.148.0/22\n103.130.132.0/22\n103.130.152.0/24\n103.130.160.0/22\n103.130.228.0/22\n103.131.20.0/22\n103.131.36.0/22\n103.131.152.0/22\n103.131.168.0/22\n103.131.176.0/22\n103.131.224.0/21\n103.131.240.0/22\n103.132.60.0/22\n103.132.64.0/20\n103.132.80.0/22\n103.132.104.0/21\n103.132.112.0/21\n103.132.120.0/22\n103.132.160.0/21\n103.132.188.0/22\n103.132.208.0/21\n103.132.234.0/23\n103.133.12.0/22\n103.133.40.0/22\n103.133.128.0/22\n103.133.136.0/22\n103.133.176.0/22\n103.133.232.0/22\n103.134.12.0/24\n103.134.196.0/22\n103.135.80.0/22\n103.135.124.0/22\n103.135.148.0/22\n103.135.156.0/22\n103.135.160.0/21\n103.135.176.0/22\n103.135.184.0/22\n103.135.192.0/21\n103.135.236.0/22\n103.136.128.0/22\n103.136.232.0/22\n103.137.57.0/24\n103.137.58.0/23\n103.137.60.0/24\n103.137.76.0/22\n103.137.136.0/23\n103.137.149.0/24\n103.137.180.0/22\n103.137.236.0/22\n103.138.2.0/23\n103.138.12.0/23\n103.138.80.0/22\n103.138.134.0/23\n103.138.156.0/23\n103.138.208.0/23\n103.138.220.0/23\n103.138.246.0/23\n103.138.248.0/23\n103.139.0.0/22\n103.139.22.0/23\n103.139.113.0/24\n103.139.134.0/23\n103.139.136.0/23\n103.139.172.0/23\n103.139.200.0/23\n103.139.204.0/23\n103.139.212.0/23\n103.140.8.0/23\n103.140.14.0/23\n103.140.46.0/23\n103.140.70.0/23\n103.140.126.0/23\n103.140.140.0/23\n103.140.144.0/23\n103.140.152.0/23\n103.140.192.0/22\n103.140.228.0/23\n103.141.10.0/23\n103.141.36.0/23\n103.141.58.0/23\n103.141.128.0/23\n103.141.186.0/23\n103.141.190.0/23\n103.141.242.0/23\n103.142.0.0/23\n103.142.28.0/23\n103.192.0.0/19\n103.192.48.0/21\n103.192.56.0/22\n103.192.84.0/22\n103.192.88.0/21\n103.192.96.0/20\n103.192.112.0/22\n103.192.128.0/20\n103.192.144.0/22\n103.192.164.0/22\n103.192.188.0/22\n103.192.208.0/21\n103.192.216.0/22\n103.192.252.0/22\n103.193.40.0/21\n103.193.120.0/21\n103.193.140.0/22\n103.193.144.0/21\n103.193.160.0/22\n103.193.188.0/22\n103.193.192.0/22\n103.193.212.0/22\n103.193.216.0/21\n103.193.224.0/20\n103.193.240.0/22\n103.194.16.0/22\n103.194.230.0/23\n103.195.104.0/22\n103.195.112.0/22\n103.195.136.0/22\n103.195.148.0/22\n103.195.152.0/22\n103.195.160.0/22\n103.195.192.0/22\n103.196.60.0/22\n103.196.64.0/22\n103.196.72.0/22\n103.196.88.0/21\n103.196.96.0/22\n103.196.168.0/22\n103.196.185.0/24\n103.196.186.0/23\n103.196.204.0/22\n103.197.180.0/22\n103.197.228.0/22\n103.197.253.0/24\n103.197.254.0/23\n103.198.20.0/22\n103.198.60.0/22\n103.198.64.0/22\n103.198.72.0/22\n103.198.124.0/22\n103.198.156.0/22\n103.198.180.0/22\n103.198.196.0/22\n103.198.200.0/22\n103.198.216.0/21\n103.198.224.0/20\n103.198.240.0/21\n103.199.164.0/22\n103.199.196.0/22\n103.199.228.0/22\n103.199.248.0/21\n103.200.28.0/22\n103.200.32.0/22\n103.200.52.0/22\n103.200.64.0/21\n103.200.136.0/21\n103.200.144.0/20\n103.200.160.0/19\n103.200.192.0/22\n103.200.220.0/22\n103.200.224.0/19\n103.201.0.0/20\n103.201.16.0/21\n103.201.28.0/22\n103.201.32.0/19\n103.201.64.0/22\n103.201.76.0/22\n103.201.80.0/20\n103.201.96.0/20\n103.201.112.0/21\n103.201.120.0/22\n103.201.152.0/21\n103.201.160.0/19\n103.201.192.0/18\n103.202.0.0/19\n103.202.32.0/20\n103.202.56.0/21\n103.202.64.0/18\n103.202.128.0/20\n103.202.144.0/22\n103.202.152.0/21\n103.202.160.0/19\n103.202.192.0/20\n103.202.212.0/22\n103.202.228.0/22\n103.202.236.0/22\n103.202.240.0/20\n103.203.0.0/19\n103.203.32.0/22\n103.203.52.0/22\n103.203.56.0/22\n103.203.96.0/19\n103.203.128.0/22\n103.203.140.0/22\n103.203.164.0/22\n103.203.168.0/22\n103.203.192.0/22\n103.203.200.0/22\n103.203.212.0/22\n103.203.216.0/22\n103.204.24.0/22\n103.204.72.0/22\n103.204.88.0/22\n103.204.112.0/22\n103.204.136.0/21\n103.204.144.0/21\n103.204.152.0/22\n103.204.196.0/22\n103.204.232.0/21\n103.205.4.0/22\n103.205.8.0/22\n103.205.40.0/21\n103.205.52.0/22\n103.205.108.0/22\n103.205.116.0/22\n103.205.120.0/22\n103.205.136.0/22\n103.205.162.0/24\n103.205.188.0/22\n103.205.192.0/21\n103.205.200.0/22\n103.205.236.0/22\n103.205.248.0/21\n103.206.0.0/22\n103.206.44.0/22\n103.206.108.0/22\n103.206.148.0/22\n103.207.48.0/22\n103.207.104.0/22\n103.207.164.0/22\n103.207.184.0/21\n103.207.192.0/20\n103.207.208.0/21\n103.207.220.0/22\n103.207.228.0/22\n103.207.232.0/22\n103.208.12.0/22\n103.208.16.0/22\n103.208.28.0/22\n103.208.40.0/21\n103.208.48.0/22\n103.208.148.0/22\n103.209.112.0/22\n103.209.136.0/22\n103.209.200.0/22\n103.209.208.0/22\n103.209.216.0/22\n103.210.0.0/22\n103.210.20.0/22\n103.210.96.0/22\n103.210.156.0/22\n103.210.160.0/19\n103.210.216.0/22\n103.211.44.0/22\n103.211.96.0/21\n103.211.156.0/22\n103.211.164.0/22\n103.211.168.0/22\n103.211.192.0/22\n103.211.220.0/22\n103.211.224.0/22\n103.211.248.0/22\n103.212.0.0/20\n103.212.32.0/22\n103.212.44.0/22\n103.212.48.0/22\n103.212.84.0/22\n103.212.100.0/22\n103.212.104.0/21\n103.212.148.0/22\n103.212.164.0/22\n103.212.196.0/22\n103.212.200.0/22\n103.212.228.0/22\n103.212.252.0/22\n103.213.40.0/21\n103.213.48.0/20\n103.213.64.0/19\n103.213.96.0/22\n103.213.132.0/22\n103.213.136.0/21\n103.213.144.0/20\n103.213.160.0/19\n103.213.248.0/21\n103.214.32.0/22\n103.214.48.0/22\n103.214.84.0/22\n103.214.168.0/22\n103.214.212.0/22\n103.214.240.0/21\n103.215.28.0/22\n103.215.32.0/21\n103.215.44.0/22\n103.215.48.0/22\n103.215.100.0/22\n103.215.104.0/21\n103.215.116.0/22\n103.215.120.0/22\n103.215.140.0/22\n103.215.184.0/22\n103.215.228.0/22\n103.216.4.0/22\n103.216.8.0/21\n103.216.16.0/20\n103.216.32.0/20\n103.216.64.0/22\n103.216.108.0/22\n103.216.136.0/22\n103.216.152.0/22\n103.216.224.0/21\n103.216.240.0/20\n103.217.0.0/18\n103.217.168.0/22\n103.217.180.0/22\n103.217.184.0/21\n103.217.192.0/20\n103.218.0.0/22\n103.218.8.0/21\n103.218.16.0/21\n103.218.28.0/22\n103.218.32.0/19\n103.218.64.0/19\n103.218.184.0/22\n103.218.192.0/20\n103.218.208.0/21\n103.218.216.0/22\n103.219.24.0/21\n103.219.32.0/21\n103.219.64.0/22\n103.219.84.0/22\n103.219.88.0/21\n103.219.96.0/21\n103.219.176.0/22\n103.219.184.0/22\n103.220.48.0/20\n103.220.64.0/22\n103.220.92.0/22\n103.220.96.0/20\n103.220.116.0/22\n103.220.120.0/21\n103.220.128.0/20\n103.220.144.0/21\n103.220.152.0/22\n103.220.160.0/19\n103.220.192.0/21\n103.220.200.0/22\n103.220.240.0/20\n103.221.0.0/19\n103.221.32.0/20\n103.221.48.0/22\n103.221.88.0/21\n103.221.96.0/19\n103.221.128.0/18\n103.221.192.0/20\n103.222.0.0/20\n103.222.16.0/22\n103.222.24.0/21\n103.222.32.0/19\n103.222.64.0/18\n103.222.128.0/18\n103.222.192.0/19\n103.222.224.0/21\n103.222.232.0/22\n103.222.240.0/21\n103.223.16.0/20\n103.223.32.0/19\n103.223.64.0/18\n103.223.128.0/21\n103.223.140.0/22\n103.223.144.0/20\n103.223.160.0/20\n103.223.176.0/21\n103.223.188.0/22\n103.223.192.0/18\n103.224.0.0/22\n103.224.40.0/21\n103.224.60.0/22\n103.224.80.0/22\n103.224.220.0/22\n103.224.224.0/21\n103.224.232.0/22\n103.225.84.0/22\n103.226.16.0/22\n103.226.40.0/22\n103.226.56.0/21\n103.226.80.0/22\n103.226.116.0/22\n103.226.132.0/22\n103.226.156.0/22\n103.226.180.0/22\n103.226.196.0/22\n103.227.48.0/22\n103.227.72.0/21\n103.227.80.0/22\n103.227.100.0/22\n103.227.120.0/22\n103.227.132.0/22\n103.227.136.0/22\n103.227.196.0/22\n103.227.204.0/22\n103.227.212.0/22\n103.227.228.0/22\n103.228.12.0/22\n103.228.28.0/22\n103.228.68.0/22\n103.228.88.0/22\n103.228.128.0/22\n103.228.136.0/22\n103.228.160.0/22\n103.228.176.0/22\n103.228.204.0/22\n103.228.208.0/22\n103.228.228.0/22\n103.228.232.0/22\n103.229.20.0/22\n103.229.60.0/22\n103.229.136.0/22\n103.229.148.0/22\n103.229.172.0/22\n103.229.212.0/22\n103.229.216.0/21\n103.229.228.0/22\n103.229.236.0/22\n103.229.240.0/22\n103.230.0.0/22\n103.230.28.0/22\n103.230.40.0/21\n103.230.96.0/22\n103.230.196.0/22\n103.230.200.0/21\n103.230.212.0/22\n103.230.236.0/22\n103.231.16.0/21\n103.231.64.0/21\n103.231.144.0/22\n103.231.180.0/22\n103.231.184.0/22\n103.231.244.0/22\n103.232.4.0/22\n103.232.144.0/22\n103.232.188.0/22\n103.232.212.0/22\n103.233.4.0/22\n103.233.44.0/22\n103.233.52.0/22\n103.233.104.0/22\n103.233.128.0/22\n103.233.136.0/22\n103.233.228.0/22\n103.234.0.0/22\n103.234.20.0/22\n103.234.56.0/22\n103.234.124.0/22\n103.234.128.0/22\n103.234.172.0/22\n103.234.180.0/22\n103.234.244.0/22\n103.235.16.0/22\n103.235.48.0/22\n103.235.56.0/21\n103.235.80.0/21\n103.235.128.0/20\n103.235.144.0/21\n103.235.184.0/22\n103.235.192.0/22\n103.235.200.0/22\n103.235.220.0/22\n103.235.224.0/19\n103.236.0.0/18\n103.236.64.0/19\n103.236.96.0/22\n103.236.120.0/22\n103.236.184.0/22\n103.236.220.0/22\n103.236.232.0/22\n103.236.240.0/20\n103.237.0.0/20\n103.237.24.0/21\n103.237.68.0/22\n103.237.88.0/22\n103.237.152.0/22\n103.237.176.0/20\n103.237.192.0/18\n103.238.0.0/21\n103.238.16.0/20\n103.238.32.0/20\n103.238.48.0/21\n103.238.56.0/22\n103.238.88.0/21\n103.238.96.0/22\n103.238.132.0/22\n103.238.140.0/22\n103.238.144.0/22\n103.238.160.0/19\n103.238.196.0/22\n103.238.204.0/22\n103.238.252.0/22\n103.239.0.0/22\n103.239.44.0/22\n103.239.68.0/22\n103.239.96.0/22\n103.239.152.0/21\n103.239.176.0/21\n103.239.184.0/22\n103.239.192.0/21\n103.239.204.0/22\n103.239.208.0/22\n103.239.224.0/22\n103.239.244.0/22\n103.240.16.0/22\n103.240.36.0/22\n103.240.72.0/22\n103.240.84.0/22\n103.240.124.0/22\n103.240.156.0/22\n103.240.172.0/22\n103.240.188.0/22\n103.240.244.0/22\n103.241.12.0/22\n103.241.72.0/22\n103.241.92.0/22\n103.241.96.0/22\n103.241.160.0/22\n103.241.184.0/21\n103.241.220.0/22\n103.242.64.0/22\n103.242.128.0/21\n103.242.160.0/22\n103.242.168.0/21\n103.242.176.0/22\n103.242.200.0/22\n103.242.212.0/22\n103.242.220.0/22\n103.242.240.0/22\n103.243.136.0/22\n103.243.252.0/22\n103.244.16.0/22\n103.244.58.0/23\n103.244.60.0/22\n103.244.64.0/20\n103.244.80.0/21\n103.244.116.0/22\n103.244.164.0/22\n103.244.232.0/22\n103.244.252.0/22\n103.245.23.0/24\n103.245.52.0/22\n103.245.60.0/22\n103.245.80.0/22\n103.245.124.0/22\n103.245.128.0/22\n103.246.8.0/21\n103.246.120.0/21\n103.246.132.0/22\n103.246.152.0/21\n103.247.168.0/21\n103.247.176.0/22\n103.247.200.0/22\n103.247.212.0/22\n103.248.0.0/23\n103.248.64.0/22\n103.248.100.0/22\n103.248.124.0/22\n103.248.152.0/22\n103.248.168.0/22\n103.248.192.0/22\n103.248.212.0/22\n103.248.220.0/22\n103.248.224.0/21\n103.249.8.0/21\n103.249.52.0/22\n103.249.104.0/22\n103.249.128.0/22\n103.249.136.0/22\n103.249.144.0/22\n103.249.164.0/22\n103.249.168.0/21\n103.249.176.0/22\n103.249.188.0/22\n103.249.192.0/22\n103.249.244.0/22\n103.249.252.0/22\n103.250.32.0/22\n103.250.104.0/22\n103.250.124.0/22\n103.250.180.0/22\n103.250.192.0/22\n103.250.216.0/22\n103.250.224.0/22\n103.250.236.0/22\n103.250.248.0/21\n103.251.32.0/21\n103.251.84.0/22\n103.251.96.0/22\n103.251.124.0/22\n103.251.128.0/22\n103.251.160.0/22\n103.251.192.0/22\n103.251.204.0/22\n103.251.236.0/22\n103.251.240.0/22\n103.252.28.0/22\n103.252.36.0/22\n103.252.64.0/22\n103.252.96.0/22\n103.252.104.0/22\n103.252.172.0/22\n103.252.204.0/22\n103.252.208.0/22\n103.252.232.0/22\n103.252.248.0/22\n103.253.4.0/22\n103.253.60.0/22\n103.253.204.0/22\n103.253.220.0/22\n103.253.224.0/22\n103.253.232.0/22\n103.254.8.0/22\n103.254.20.0/22\n103.254.64.0/20\n103.254.112.0/22\n103.254.176.0/22\n103.254.188.0/22\n103.254.196.0/24\n103.254.220.0/22\n103.255.56.0/22\n103.255.68.0/22\n103.255.88.0/21\n103.255.136.0/21\n103.255.184.0/22\n103.255.200.0/22\n103.255.208.0/21\n103.255.228.0/22\n104.222.196.0/24\n106.0.0.0/24\n106.0.2.0/23\n106.0.4.0/22\n106.0.8.0/21\n106.0.16.0/20\n106.0.44.0/22\n106.0.64.0/18\n106.2.0.0/15\n106.4.0.0/14\n106.8.0.0/15\n106.11.0.0/16\n106.12.0.0/14\n106.16.0.0/12\n106.32.0.0/12\n106.48.0.0/15\n106.50.0.0/16\n106.52.0.0/14\n106.56.0.0/13\n106.74.0.0/15\n106.80.0.0/12\n106.108.0.0/14\n106.112.0.0/12\n106.224.0.0/12\n109.71.4.0/24\n109.244.0.0/16\n110.6.0.0/15\n110.16.0.0/14\n110.34.40.0/21\n110.40.0.0/14\n110.44.12.0/22\n110.44.144.0/20\n110.48.0.0/16\n110.51.0.0/16\n110.52.0.0/15\n110.56.0.0/13\n110.64.0.0/15\n110.72.0.0/15\n110.75.0.0/16\n110.76.0.0/18\n110.76.132.0/22\n110.76.156.0/22\n110.76.184.0/22\n110.76.192.0/18\n110.77.0.0/17\n110.80.0.0/13\n110.88.0.0/14\n110.92.68.0/22\n110.93.32.0/19\n110.94.0.0/15\n110.96.0.0/11\n110.152.0.0/14\n110.156.0.0/15\n110.165.32.0/19\n110.166.0.0/15\n110.172.192.0/18\n110.173.0.0/19\n110.173.32.0/20\n110.173.64.0/18\n110.173.192.0/19\n110.176.0.0/12\n110.192.0.0/11\n110.228.0.0/14\n110.232.32.0/19\n110.236.0.0/15\n110.240.0.0/12\n111.0.0.0/10\n111.66.0.0/16\n111.67.192.0/20\n111.68.64.0/19\n111.72.0.0/13\n111.85.0.0/16\n111.91.192.0/19\n111.92.248.0/21\n111.112.0.0/14\n111.116.0.0/15\n111.118.200.0/21\n111.119.64.0/18\n111.119.128.0/19\n111.120.0.0/14\n111.124.0.0/16\n111.126.0.0/15\n111.128.0.0/11\n111.160.0.0/13\n111.170.0.0/16\n111.172.0.0/14\n111.176.0.0/13\n111.186.0.0/15\n111.192.0.0/12\n111.208.0.0/13\n111.221.28.0/24\n111.221.128.0/17\n111.222.0.0/16\n111.223.4.0/22\n111.223.8.0/21\n111.223.16.0/22\n111.223.240.0/22\n111.223.248.0/22\n111.224.0.0/13\n111.235.96.0/19\n111.235.156.0/22\n111.235.160.0/19\n112.0.0.0/10\n112.64.0.0/14\n112.73.0.0/16\n112.74.0.0/15\n112.80.0.0/12\n112.96.0.0/13\n112.109.128.0/17\n112.111.0.0/16\n112.112.0.0/14\n112.116.0.0/15\n112.122.0.0/15\n112.124.0.0/14\n112.128.0.0/14\n112.132.0.0/16\n112.137.48.0/21\n112.192.0.0/14\n112.224.0.0/11\n113.0.0.0/13\n113.8.0.0/15\n113.11.192.0/19\n113.12.0.0/14\n113.16.0.0/15\n113.18.0.0/16\n113.21.232.0/21\n113.24.0.0/14\n113.31.0.0/16\n113.44.0.0/14\n113.48.0.0/14\n113.52.160.0/19\n113.52.228.0/22\n113.54.0.0/15\n113.56.0.0/15\n113.58.0.0/16\n113.59.0.0/17\n113.59.224.0/22\n113.62.0.0/15\n113.64.0.0/10\n113.128.0.0/15\n113.130.96.0/20\n113.130.112.0/21\n113.132.0.0/14\n113.136.0.0/13\n113.194.0.0/15\n113.197.100.0/22\n113.197.104.0/22\n113.200.0.0/15\n113.202.0.0/16\n113.204.0.0/14\n113.208.96.0/19\n113.208.128.0/17\n113.209.0.0/16\n113.212.0.0/18\n113.212.64.0/22\n113.212.88.0/22\n113.212.100.0/22\n113.212.184.0/21\n113.213.0.0/17\n113.214.0.0/15\n113.218.0.0/15\n113.220.0.0/14\n113.224.0.0/12\n113.240.0.0/13\n113.248.0.0/14\n114.28.0.0/16\n114.31.64.0/21\n114.54.0.0/15\n114.60.0.0/14\n114.64.0.0/14\n114.68.0.0/16\n114.79.64.0/18\n114.80.0.0/12\n114.96.0.0/13\n114.104.0.0/14\n114.110.0.0/20\n114.110.64.0/18\n114.111.0.0/19\n114.111.160.0/19\n114.112.0.0/13\n114.132.0.0/16\n114.135.0.0/16\n114.138.0.0/15\n114.141.64.0/21\n114.141.80.0/21\n114.141.128.0/18\n114.196.0.0/15\n114.198.248.0/21\n114.208.0.0/12\n114.224.0.0/11\n115.24.0.0/14\n115.28.0.0/15\n115.31.64.0/20\n115.32.0.0/14\n115.42.56.0/22\n115.44.0.0/14\n115.48.0.0/12\n115.69.64.0/20\n115.84.0.0/18\n115.84.192.0/19\n115.85.192.0/18\n115.100.0.0/14\n115.104.0.0/14\n115.120.0.0/14\n115.124.16.0/20\n115.148.0.0/14\n115.152.0.0/13\n115.166.64.0/19\n115.168.0.0/13\n115.180.0.0/14\n115.187.0.0/20\n115.190.0.0/15\n115.192.0.0/11\n115.224.0.0/12\n116.0.8.0/21\n116.0.24.0/21\n116.1.0.0/16\n116.2.0.0/15\n116.4.0.0/14\n116.8.0.0/14\n116.13.0.0/16\n116.16.0.0/12\n116.50.0.0/20\n116.52.0.0/14\n116.56.0.0/15\n116.58.128.0/20\n116.58.208.0/20\n116.60.0.0/14\n116.66.0.0/17\n116.66.176.0/22\n116.68.136.0/21\n116.68.176.0/21\n116.69.0.0/16\n116.70.0.0/17\n116.76.0.0/14\n116.85.0.0/16\n116.89.144.0/20\n116.89.240.0/22\n116.90.80.0/20\n116.90.184.0/21\n116.95.0.0/16\n116.112.0.0/14\n116.116.0.0/15\n116.128.0.0/10\n116.192.0.0/16\n116.193.16.0/20\n116.193.32.0/19\n116.193.152.0/22\n116.193.164.0/22\n116.193.176.0/21\n116.194.0.0/15\n116.196.0.0/16\n116.197.160.0/21\n116.197.180.0/23\n116.198.0.0/16\n116.199.0.0/17\n116.199.128.0/19\n116.204.0.0/17\n116.204.132.0/22\n116.204.168.0/22\n116.204.216.0/22\n116.204.232.0/21\n116.204.244.0/22\n116.205.0.0/16\n116.206.92.0/22\n116.206.176.0/22\n116.207.0.0/16\n116.208.0.0/14\n116.212.160.0/20\n116.213.44.0/22\n116.213.64.0/18\n116.213.128.0/17\n116.214.32.0/19\n116.214.64.0/20\n116.214.128.0/17\n116.215.0.0/16\n116.216.0.0/14\n116.224.0.0/12\n116.242.0.0/15\n116.244.0.0/14\n116.248.0.0/15\n116.251.64.0/18\n116.252.0.0/15\n116.254.104.0/21\n116.254.128.0/17\n116.255.128.0/17\n117.8.0.0/13\n117.21.0.0/16\n117.22.0.0/15\n117.24.0.0/13\n117.32.0.0/13\n117.40.0.0/14\n117.44.0.0/15\n117.48.0.0/14\n117.53.48.0/20\n117.53.176.0/20\n117.57.0.0/16\n117.58.0.0/17\n117.59.0.0/16\n117.60.0.0/14\n117.64.0.0/13\n117.72.0.0/15\n117.74.64.0/19\n117.74.128.0/17\n117.75.0.0/16\n117.76.0.0/14\n117.80.0.0/12\n117.100.0.0/15\n117.103.16.0/20\n117.103.40.0/21\n117.103.72.0/21\n117.103.128.0/20\n117.104.168.0/21\n117.106.0.0/15\n117.112.0.0/13\n117.120.64.0/18\n117.120.128.0/17\n117.121.0.0/17\n117.121.128.0/18\n117.121.192.0/21\n117.122.128.0/17\n117.124.0.0/14\n117.128.0.0/10\n118.24.0.0/15\n118.26.0.0/16\n118.28.0.0/14\n118.64.0.0/15\n118.66.0.0/16\n118.67.112.0/20\n118.72.0.0/13\n118.80.0.0/15\n118.84.0.0/15\n118.88.32.0/19\n118.88.64.0/18\n118.88.128.0/17\n118.89.0.0/16\n118.91.240.0/20\n118.102.16.0/20\n118.102.32.0/21\n118.103.164.0/22\n118.103.168.0/21\n118.103.176.0/22\n118.103.245.0/24\n118.103.246.0/23\n118.107.180.0/22\n118.112.0.0/13\n118.120.0.0/14\n118.124.0.0/15\n118.126.0.0/16\n118.127.128.0/19\n118.132.0.0/14\n118.144.0.0/14\n118.178.0.0/16\n118.180.0.0/14\n118.184.0.0/16\n118.186.0.0/15\n118.188.0.0/16\n118.190.0.0/15\n118.192.0.0/16\n118.193.0.0/20\n118.193.32.0/19\n118.193.64.0/20\n118.193.96.0/19\n118.193.128.0/17\n118.194.0.0/15\n118.196.0.0/14\n118.202.0.0/15\n118.204.0.0/14\n118.212.0.0/15\n118.215.192.0/18\n118.224.0.0/14\n118.228.0.0/15\n118.230.0.0/16\n118.239.0.0/16\n118.242.0.0/16\n118.244.0.0/14\n118.248.0.0/13\n119.0.0.0/15\n119.2.0.0/19\n119.2.128.0/17\n119.3.0.0/16\n119.4.0.0/14\n119.8.0.0/16\n119.10.0.0/17\n119.15.136.0/21\n119.16.0.0/16\n119.18.192.0/20\n119.18.208.0/21\n119.18.224.0/19\n119.19.0.0/16\n119.20.0.0/14\n119.27.64.0/18\n119.27.128.0/17\n119.28.0.0/15\n119.30.48.0/20\n119.31.192.0/19\n119.32.0.0/13\n119.40.0.0/18\n119.40.64.0/20\n119.40.128.0/17\n119.41.0.0/16\n119.42.0.0/19\n119.42.52.0/22\n119.42.128.0/20\n119.42.224.0/19\n119.44.0.0/15\n119.48.0.0/13\n119.57.0.0/16\n119.58.0.0/16\n119.59.128.0/17\n119.60.0.0/15\n119.62.0.0/16\n119.63.32.0/19\n119.75.208.0/20\n119.78.0.0/15\n119.80.0.0/16\n119.82.208.0/20\n119.84.0.0/14\n119.88.0.0/14\n119.96.0.0/13\n119.108.0.0/15\n119.112.0.0/12\n119.128.0.0/12\n119.144.0.0/14\n119.148.160.0/19\n119.151.192.0/18\n119.160.200.0/21\n119.161.120.0/21\n119.161.128.0/17\n119.162.0.0/15\n119.164.0.0/14\n119.176.0.0/12\n119.232.0.0/15\n119.235.128.0/18\n119.248.0.0/14\n119.252.96.0/21\n119.252.240.0/20\n119.253.0.0/16\n119.254.0.0/15\n120.0.0.0/12\n120.24.0.0/14\n120.30.0.0/15\n120.32.0.0/12\n120.48.0.0/15\n120.52.0.0/14\n120.64.0.0/13\n120.72.32.0/19\n120.72.128.0/17\n120.76.0.0/14\n120.80.0.0/13\n120.88.8.0/21\n120.90.0.0/15\n120.92.0.0/16\n120.94.0.0/15\n120.128.0.0/13\n120.136.16.0/21\n120.136.128.0/18\n120.137.0.0/17\n120.143.128.0/19\n120.192.0.0/10\n121.0.8.0/21\n121.0.16.0/20\n121.4.0.0/15\n121.8.0.0/13\n121.16.0.0/12\n121.32.0.0/13\n121.40.0.0/14\n121.46.0.0/18\n121.46.76.0/22\n121.46.128.0/17\n121.47.0.0/16\n121.48.0.0/15\n121.50.8.0/21\n121.51.0.0/16\n121.52.160.0/19\n121.52.208.0/20\n121.52.224.0/19\n121.54.176.0/21\n121.54.188.0/22\n121.55.0.0/18\n121.56.0.0/15\n121.58.0.0/17\n121.58.136.0/21\n121.58.144.0/20\n121.58.160.0/21\n121.59.0.0/16\n121.60.0.0/14\n121.68.0.0/14\n121.76.0.0/15\n121.79.128.0/18\n121.89.0.0/16\n121.100.128.0/17\n121.101.0.0/18\n121.101.208.0/20\n121.192.0.0/13\n121.200.192.0/21\n121.201.0.0/16\n121.204.0.0/14\n121.224.0.0/12\n121.248.0.0/14\n121.255.0.0/16\n122.0.64.0/18\n122.0.128.0/17\n122.4.0.0/14\n122.8.0.0/15\n122.10.128.0/17\n122.11.0.0/17\n122.12.0.0/15\n122.14.0.0/16\n122.48.0.0/16\n122.49.0.0/18\n122.51.0.0/16\n122.64.0.0/11\n122.96.0.0/15\n122.98.144.0/20\n122.98.160.0/21\n122.98.172.0/22\n122.98.176.0/20\n122.98.192.0/21\n122.98.232.0/21\n122.98.240.0/20\n122.102.0.0/20\n122.102.64.0/19\n122.112.0.0/14\n122.119.0.0/16\n122.128.100.0/22\n122.128.120.0/21\n122.136.0.0/13\n122.144.128.0/17\n122.152.192.0/18\n122.156.0.0/14\n122.188.0.0/14\n122.192.0.0/14\n122.198.0.0/16\n122.200.40.0/21\n122.200.64.0/18\n122.201.48.0/20\n122.204.0.0/14\n122.224.0.0/12\n122.240.0.0/13\n122.248.24.0/21\n122.248.48.0/20\n122.255.64.0/21\n123.0.128.0/18\n123.4.0.0/14\n123.8.0.0/13\n123.49.128.0/17\n123.50.160.0/19\n123.52.0.0/14\n123.56.0.0/14\n123.60.0.0/15\n123.62.0.0/16\n123.64.0.0/11\n123.96.0.0/15\n123.98.0.0/17\n123.99.128.0/17\n123.100.0.0/19\n123.100.232.0/24\n123.101.0.0/16\n123.103.0.0/17\n123.108.128.0/20\n123.108.208.0/20\n123.112.0.0/12\n123.128.0.0/13\n123.136.80.0/20\n123.137.0.0/16\n123.138.0.0/15\n123.144.0.0/12\n123.160.0.0/12\n123.176.60.0/22\n123.176.80.0/20\n123.177.0.0/16\n123.178.0.0/15\n123.180.0.0/14\n123.184.0.0/13\n123.196.0.0/15\n123.199.128.0/17\n123.206.0.0/15\n123.232.0.0/14\n123.242.0.0/17\n123.242.192.0/21\n123.244.0.0/14\n123.249.0.0/16\n123.253.108.0/22\n123.253.240.0/22\n123.254.96.0/21\n124.6.64.0/18\n124.14.0.0/15\n124.16.0.0/15\n124.20.0.0/14\n124.28.192.0/18\n124.29.0.0/17\n124.31.0.0/16\n124.40.112.0/20\n124.40.128.0/18\n124.40.192.0/19\n124.40.240.0/22\n124.42.0.0/16\n124.47.0.0/18\n124.64.0.0/15\n124.66.0.0/17\n124.67.0.0/16\n124.68.0.0/14\n124.72.0.0/13\n124.88.0.0/13\n124.108.8.0/21\n124.108.40.0/21\n124.109.96.0/21\n124.112.0.0/13\n124.126.0.0/15\n124.128.0.0/13\n124.147.128.0/17\n124.150.137.0/24\n124.151.0.0/16\n124.152.0.0/16\n124.160.0.0/13\n124.172.0.0/14\n124.192.0.0/15\n124.196.0.0/16\n124.200.0.0/13\n124.220.0.0/14\n124.224.0.0/12\n124.240.0.0/17\n124.240.128.0/18\n124.242.0.0/16\n124.243.192.0/18\n124.248.0.0/17\n124.249.0.0/16\n124.250.0.0/15\n124.254.0.0/18\n125.31.192.0/18\n125.32.0.0/12\n125.58.128.0/17\n125.61.128.0/17\n125.62.0.0/18\n125.64.0.0/11\n125.96.0.0/15\n125.98.0.0/16\n125.104.0.0/13\n125.112.0.0/12\n125.169.0.0/16\n125.171.0.0/16\n125.208.0.0/18\n125.210.0.0/15\n125.213.0.0/17\n125.214.96.0/19\n125.215.0.0/18\n125.216.0.0/13\n125.254.128.0/17\n128.108.0.0/16\n129.28.0.0/16\n129.204.0.0/16\n129.211.0.0/16\n129.223.254.0/24\n129.227.0.0/20\n129.227.32.0/19\n129.227.64.0/18\n129.227.128.0/23\n129.227.132.0/22\n129.227.136.0/21\n129.227.144.0/20\n129.227.160.0/19\n129.227.192.0/18\n130.214.218.0/23\n131.228.96.0/24\n131.253.12.0/29\n131.253.12.80/28\n131.253.12.240/29\n132.232.0.0/16\n132.237.134.0/24\n132.237.150.0/24\n134.175.0.0/16\n135.159.208.0/20\n135.244.80.0/20\n137.59.59.0/24\n137.59.88.0/22\n138.32.244.0/22\n139.5.56.0/21\n139.5.80.0/22\n139.5.92.0/22\n139.5.108.0/22\n139.5.128.0/22\n139.5.160.0/22\n139.5.192.0/22\n139.5.204.0/22\n139.5.208.0/21\n139.5.244.0/22\n139.9.0.0/16\n139.129.0.0/16\n139.148.0.0/16\n139.155.0.0/16\n139.159.0.0/16\n139.170.0.0/16\n139.176.0.0/16\n139.183.0.0/16\n139.186.0.0/16\n139.189.0.0/16\n139.196.0.0/14\n139.200.0.0/13\n139.208.0.0/13\n139.217.0.0/16\n139.219.0.0/16\n139.220.0.0/15\n139.224.0.0/16\n139.226.0.0/15\n140.75.0.0/16\n140.101.208.0/24\n140.143.0.0/16\n140.179.0.0/16\n140.205.0.0/16\n140.206.0.0/15\n140.210.0.0/16\n140.224.0.0/16\n140.237.0.0/16\n140.240.0.0/16\n140.242.223.0/24\n140.242.224.0/24\n140.243.0.0/16\n140.246.0.0/16\n140.249.0.0/16\n140.250.0.0/16\n140.255.0.0/16\n144.0.0.0/16\n144.7.0.0/16\n144.12.0.0/16\n144.36.146.0/23\n144.48.8.0/21\n144.48.64.0/22\n144.48.88.0/22\n144.48.156.0/22\n144.48.180.0/22\n144.48.184.0/22\n144.48.204.0/22\n144.48.208.0/21\n144.48.220.0/22\n144.48.252.0/22\n144.52.0.0/16\n144.123.0.0/16\n144.211.80.0/24\n144.211.138.0/24\n144.255.0.0/16\n146.56.192.0/18\n146.196.56.0/22\n146.196.68.0/22\n146.196.72.0/22\n146.196.92.0/22\n146.196.112.0/21\n146.196.124.0/22\n146.217.137.0/24\n146.222.79.0/24\n146.222.81.0/24\n146.222.94.0/24\n147.243.13.32/27\n147.243.13.64/27\n147.243.14.32/27\n148.70.0.0/16\n150.0.0.0/16\n150.115.0.0/16\n150.121.0.0/16\n150.122.0.0/16\n150.129.136.0/22\n150.129.192.0/22\n150.129.216.0/22\n150.129.252.0/22\n150.138.0.0/15\n150.158.0.0/16\n150.222.88.0/23\n150.223.0.0/16\n150.242.0.0/21\n150.242.8.0/22\n150.242.28.0/22\n150.242.44.0/22\n150.242.48.0/21\n150.242.56.0/22\n150.242.76.0/22\n150.242.80.0/22\n150.242.92.0/22\n150.242.96.0/22\n150.242.112.0/21\n150.242.120.0/22\n150.242.152.0/21\n150.242.160.0/21\n150.242.168.0/22\n150.242.184.0/21\n150.242.192.0/22\n150.242.212.0/22\n150.242.224.0/20\n150.242.240.0/21\n150.242.248.0/22\n150.255.0.0/16\n152.32.178.0/23\n152.32.205.0/24\n152.32.206.0/23\n152.32.208.0/20\n152.32.224.0/19\n152.104.128.0/17\n152.136.0.0/16\n153.0.0.0/16\n153.3.0.0/16\n153.34.0.0/15\n153.36.0.0/15\n153.99.0.0/16\n153.101.0.0/16\n153.118.0.0/15\n154.8.128.0/17\n156.107.160.0/24\n156.107.170.0/24\n156.154.62.0/23\n157.0.0.0/16\n157.18.0.0/16\n157.61.0.0/16\n157.119.0.0/22\n157.119.8.0/21\n157.119.16.0/22\n157.119.28.0/22\n157.119.68.0/22\n157.119.112.0/22\n157.119.132.0/22\n157.119.136.0/21\n157.119.144.0/20\n157.119.160.0/21\n157.119.172.0/22\n157.119.192.0/21\n157.119.240.0/22\n157.119.252.0/22\n157.122.0.0/16\n157.133.186.0/23\n157.133.192.0/21\n157.133.212.0/24\n157.133.236.0/24\n157.148.0.0/16\n157.156.0.0/16\n157.255.0.0/16\n159.75.0.0/16\n159.221.232.0/22\n159.226.0.0/16\n160.19.208.0/21\n160.19.216.0/22\n160.20.48.0/22\n160.62.10.0/24\n160.83.109.0/24\n160.83.110.0/23\n160.202.60.0/22\n160.202.148.0/22\n160.202.152.0/22\n160.202.168.0/22\n160.202.212.0/22\n160.202.216.0/21\n160.202.224.0/19\n160.238.64.0/22\n161.163.0.0/21\n161.163.28.0/23\n161.163.176.0/24\n161.163.178.0/23\n161.163.180.0/22\n161.189.0.0/16\n161.207.0.0/16\n162.14.0.0/16\n162.105.0.0/16\n163.0.0.0/16\n163.47.4.0/22\n163.53.0.0/20\n163.53.36.0/22\n163.53.40.0/21\n163.53.48.0/20\n163.53.64.0/22\n163.53.88.0/21\n163.53.96.0/19\n163.53.128.0/21\n163.53.136.0/22\n163.53.160.0/20\n163.53.188.0/22\n163.53.220.0/22\n163.53.236.0/22\n163.53.240.0/22\n163.116.202.0/23\n163.125.0.0/16\n163.142.0.0/16\n163.177.0.0/16\n163.179.0.0/16\n163.204.0.0/16\n163.244.246.0/24\n164.52.0.0/17\n165.156.30.0/24\n166.111.0.0/16\n167.139.0.0/16\n167.189.0.0/16\n167.220.244.0/22\n168.159.144.0/21\n168.159.152.0/22\n168.159.156.0/23\n168.159.158.0/24\n168.160.0.0/16\n168.230.0.0/24\n170.179.0.0/16\n170.225.224.0/23\n170.252.152.0/21\n171.8.0.0/13\n171.34.0.0/15\n171.36.0.0/14\n171.40.0.0/13\n171.80.0.0/12\n171.104.0.0/13\n171.112.0.0/12\n171.208.0.0/12\n172.81.192.0/18\n175.0.0.0/12\n175.16.0.0/13\n175.24.0.0/14\n175.30.0.0/15\n175.42.0.0/15\n175.44.0.0/16\n175.46.0.0/15\n175.48.0.0/12\n175.64.0.0/11\n175.102.0.0/16\n175.106.128.0/17\n175.111.144.0/20\n175.111.160.0/20\n175.111.184.0/22\n175.146.0.0/15\n175.148.0.0/14\n175.152.0.0/14\n175.158.96.0/22\n175.160.0.0/12\n175.176.156.0/22\n175.176.176.0/22\n175.176.188.0/22\n175.176.192.0/22\n175.178.0.0/16\n175.184.128.0/18\n175.185.0.0/16\n175.186.0.0/15\n175.188.0.0/14\n180.76.0.0/14\n180.84.0.0/15\n180.86.0.0/16\n180.88.0.0/14\n180.94.56.0/21\n180.94.96.0/20\n180.94.120.0/21\n180.95.128.0/17\n180.96.0.0/11\n180.129.128.0/17\n180.130.0.0/16\n180.136.0.0/13\n180.148.16.0/21\n180.148.152.0/21\n180.148.216.0/21\n180.148.224.0/19\n180.149.128.0/19\n180.149.236.0/22\n180.150.160.0/19\n180.152.0.0/13\n180.160.0.0/12\n180.178.112.0/21\n180.178.192.0/18\n180.184.0.0/14\n180.188.0.0/17\n180.189.148.0/22\n180.200.252.0/22\n180.201.0.0/16\n180.202.0.0/15\n180.208.0.0/15\n180.210.212.0/22\n180.210.224.0/19\n180.212.0.0/15\n180.222.224.0/19\n180.223.0.0/16\n180.233.0.0/18\n180.233.64.0/19\n180.233.144.0/22\n180.235.64.0/19\n180.235.112.0/22\n180.235.136.0/22\n182.16.144.0/21\n182.16.192.0/19\n182.18.0.0/17\n182.23.184.0/21\n182.23.200.0/21\n182.32.0.0/12\n182.48.96.0/19\n182.49.0.0/16\n182.50.0.0/20\n182.50.112.0/20\n182.51.0.0/16\n182.54.0.0/17\n182.54.244.0/22\n182.61.0.0/16\n182.80.0.0/13\n182.88.0.0/14\n182.92.0.0/16\n182.96.0.0/11\n182.128.0.0/12\n182.144.0.0/13\n182.157.0.0/16\n182.160.64.0/19\n182.174.0.0/15\n182.200.0.0/13\n182.236.128.0/17\n182.237.24.0/21\n182.238.0.0/16\n182.239.0.0/19\n182.240.0.0/13\n182.254.0.0/16\n182.255.32.0/21\n182.255.60.0/22\n183.0.0.0/10\n183.64.0.0/13\n183.78.160.0/21\n183.78.180.0/22\n183.81.172.0/22\n183.81.180.0/22\n183.84.0.0/15\n183.91.128.0/22\n183.91.136.0/21\n183.91.144.0/20\n183.92.0.0/14\n183.128.0.0/11\n183.160.0.0/13\n183.168.0.0/15\n183.170.0.0/16\n183.172.0.0/14\n183.182.0.0/19\n183.184.0.0/13\n183.192.0.0/10\n185.109.236.0/24\n188.131.128.0/17\n192.11.23.0/24\n192.11.26.0/24\n192.11.39.0/24\n192.11.236.0/24\n192.23.191.0/24\n192.51.188.0/24\n192.55.10.0/23\n192.55.40.0/24\n192.55.46.0/24\n192.55.68.0/22\n192.102.204.0/22\n192.124.154.0/24\n192.137.31.0/24\n192.139.136.0/24\n192.140.128.0/21\n192.140.136.0/22\n192.140.156.0/22\n192.140.160.0/19\n192.140.192.0/20\n192.140.208.0/21\n192.144.128.0/17\n192.163.11.0/24\n192.197.113.0/24\n192.232.97.0/24\n193.20.64.0/22\n193.112.0.0/16\n194.138.136.0/24\n194.138.202.0/23\n194.138.245.0/24\n198.175.100.0/22\n198.208.17.0/24\n198.208.19.0/24\n199.7.72.0/24\n199.65.192.0/21\n199.212.57.0/24\n199.244.144.0/24\n202.0.100.0/23\n202.0.122.0/23\n202.0.176.0/22\n202.1.105.0/24\n202.1.106.0/24\n202.3.128.0/23\n202.3.134.0/24\n202.4.128.0/19\n202.4.252.0/22\n202.5.208.0/21\n202.5.216.0/22\n202.6.6.0/23\n202.6.66.0/23\n202.6.72.0/23\n202.6.87.0/24\n202.6.88.0/23\n202.6.92.0/23\n202.6.103.0/24\n202.6.108.0/24\n202.6.110.0/23\n202.6.114.0/24\n202.6.176.0/20\n202.8.0.0/24\n202.8.2.0/23\n202.8.4.0/23\n202.8.12.0/24\n202.8.24.0/24\n202.8.77.0/24\n202.8.120.0/22\n202.8.128.0/19\n202.8.192.0/20\n202.9.32.0/24\n202.9.34.0/23\n202.9.48.0/23\n202.9.51.0/24\n202.9.52.0/23\n202.9.54.0/24\n202.9.57.0/24\n202.9.58.0/23\n202.10.64.0/20\n202.10.112.0/20\n202.12.1.0/24\n202.12.2.0/24\n202.12.17.0/24\n202.12.18.0/23\n202.12.72.0/24\n202.12.84.0/23\n202.12.96.0/24\n202.12.98.0/23\n202.12.106.0/24\n202.12.111.0/24\n202.12.116.0/24\n202.14.64.0/23\n202.14.69.0/24\n202.14.73.0/24\n202.14.74.0/23\n202.14.76.0/24\n202.14.78.0/23\n202.14.88.0/24\n202.14.97.0/24\n202.14.104.0/23\n202.14.108.0/23\n202.14.111.0/24\n202.14.114.0/23\n202.14.118.0/23\n202.14.124.0/23\n202.14.127.0/24\n202.14.129.0/24\n202.14.135.0/24\n202.14.136.0/24\n202.14.149.0/24\n202.14.151.0/24\n202.14.157.0/24\n202.14.158.0/23\n202.14.169.0/24\n202.14.170.0/23\n202.14.172.0/22\n202.14.176.0/24\n202.14.184.0/23\n202.14.208.0/23\n202.14.213.0/24\n202.14.219.0/24\n202.14.220.0/24\n202.14.222.0/23\n202.14.225.0/24\n202.14.226.0/23\n202.14.231.0/24\n202.14.235.0/24\n202.14.236.0/22\n202.14.246.0/24\n202.14.251.0/24\n202.20.66.0/24\n202.20.79.0/24\n202.20.87.0/24\n202.20.88.0/23\n202.20.90.0/24\n202.20.94.0/23\n202.20.114.0/24\n202.20.117.0/24\n202.20.120.0/24\n202.20.125.0/24\n202.20.126.0/23\n202.21.48.0/20\n202.21.131.0/24\n202.21.132.0/24\n202.21.141.0/24\n202.21.142.0/24\n202.21.147.0/24\n202.21.148.0/24\n202.21.150.0/23\n202.21.152.0/23\n202.21.154.0/24\n202.21.156.0/24\n202.21.208.0/24\n202.22.248.0/21\n202.27.12.0/24\n202.27.14.0/24\n202.27.136.0/23\n202.36.226.0/24\n202.38.0.0/22\n202.38.8.0/21\n202.38.48.0/20\n202.38.64.0/18\n202.38.128.0/21\n202.38.136.0/23\n202.38.138.0/24\n202.38.140.0/22\n202.38.146.0/23\n202.38.149.0/24\n202.38.150.0/23\n202.38.152.0/22\n202.38.156.0/24\n202.38.158.0/23\n202.38.160.0/23\n202.38.164.0/22\n202.38.168.0/22\n202.38.176.0/23\n202.38.184.0/21\n202.38.192.0/18\n202.40.4.0/23\n202.40.7.0/24\n202.40.15.0/24\n202.40.135.0/24\n202.40.136.0/24\n202.40.140.0/24\n202.40.143.0/24\n202.40.144.0/23\n202.40.150.0/24\n202.40.155.0/24\n202.40.156.0/24\n202.40.158.0/23\n202.40.162.0/24\n202.41.8.0/23\n202.41.11.0/24\n202.41.12.0/23\n202.41.128.0/24\n202.41.130.0/23\n202.41.142.0/24\n202.41.152.0/21\n202.41.192.0/24\n202.41.196.0/22\n202.41.200.0/22\n202.41.240.0/20\n202.43.76.0/22\n202.43.144.0/20\n202.44.16.0/20\n202.44.48.0/22\n202.44.67.0/24\n202.44.74.0/24\n202.44.97.0/24\n202.44.129.0/24\n202.44.132.0/23\n202.44.146.0/23\n202.45.0.0/23\n202.45.2.0/24\n202.45.15.0/24\n202.45.16.0/20\n202.46.16.0/23\n202.46.18.0/24\n202.46.20.0/23\n202.46.32.0/19\n202.46.128.0/24\n202.46.224.0/20\n202.47.82.0/23\n202.47.96.0/20\n202.47.126.0/24\n202.47.128.0/24\n202.47.130.0/23\n202.52.33.0/24\n202.52.34.0/24\n202.52.47.0/24\n202.52.143.0/24\n202.52.144.0/24\n202.53.140.0/24\n202.53.143.0/24\n202.57.192.0/20\n202.57.212.0/22\n202.57.216.0/22\n202.57.240.0/20\n202.58.0.0/24\n202.58.101.0/24\n202.58.104.0/22\n202.58.112.0/22\n202.59.0.0/23\n202.59.212.0/22\n202.59.236.0/24\n202.59.240.0/24\n202.60.48.0/21\n202.60.96.0/21\n202.60.112.0/20\n202.60.132.0/22\n202.60.136.0/21\n202.60.144.0/20\n202.61.68.0/22\n202.61.76.0/22\n202.61.88.0/22\n202.61.123.0/24\n202.61.127.0/24\n202.62.112.0/22\n202.62.248.0/22\n202.62.252.0/24\n202.62.255.0/24\n202.63.80.0/20\n202.63.160.0/19\n202.63.248.0/22\n202.63.253.0/24\n202.65.0.0/21\n202.65.8.0/23\n202.65.96.0/20\n202.66.168.0/22\n202.67.0.0/22\n202.69.4.0/22\n202.69.16.0/20\n202.70.0.0/19\n202.70.96.0/20\n202.70.192.0/20\n202.71.32.0/20\n202.72.40.0/21\n202.72.80.0/20\n202.72.112.0/20\n202.73.128.0/22\n202.73.240.0/20\n202.74.8.0/21\n202.74.36.0/24\n202.74.42.0/24\n202.74.52.0/24\n202.74.80.0/20\n202.74.232.0/22\n202.74.254.0/23\n202.75.208.0/20\n202.75.252.0/22\n202.76.247.0/24\n202.76.252.0/22\n202.77.80.0/21\n202.77.92.0/22\n202.78.8.0/21\n202.79.224.0/21\n202.79.248.0/22\n202.80.192.0/20\n202.81.0.0/22\n202.81.176.0/20\n202.83.252.0/22\n202.84.0.0/20\n202.84.16.0/23\n202.84.22.0/24\n202.84.24.0/21\n202.85.208.0/20\n202.86.249.0/24\n202.86.252.0/22\n202.87.80.0/20\n202.88.32.0/22\n202.89.8.0/21\n202.89.96.0/22\n202.89.108.0/22\n202.89.119.0/24\n202.89.232.0/21\n202.90.0.0/22\n202.90.16.0/20\n202.90.37.0/24\n202.90.96.0/19\n202.90.193.0/24\n202.90.196.0/24\n202.90.205.0/24\n202.90.224.0/20\n202.91.0.0/22\n202.91.36.0/22\n202.91.96.0/20\n202.91.128.0/22\n202.91.176.0/20\n202.91.224.0/19\n202.92.0.0/22\n202.92.8.0/21\n202.92.48.0/20\n202.92.252.0/22\n202.93.0.0/22\n202.93.252.0/22\n202.94.0.0/19\n202.94.68.0/24\n202.94.74.0/24\n202.94.81.0/24\n202.94.92.0/22\n202.95.4.0/22\n202.95.240.0/21\n202.95.252.0/22\n202.96.0.0/12\n202.112.0.0/13\n202.120.0.0/15\n202.122.0.0/21\n202.122.32.0/21\n202.122.64.0/19\n202.122.112.0/20\n202.122.128.0/24\n202.122.132.0/24\n202.123.96.0/20\n202.123.116.0/22\n202.123.120.0/22\n202.124.16.0/21\n202.124.24.0/22\n202.125.107.0/24\n202.125.109.0/24\n202.125.112.0/20\n202.125.176.0/20\n202.127.0.0/21\n202.127.12.0/22\n202.127.16.0/20\n202.127.40.0/21\n202.127.48.0/20\n202.127.112.0/20\n202.127.128.0/19\n202.127.160.0/21\n202.127.192.0/20\n202.127.208.0/23\n202.127.212.0/22\n202.127.216.0/21\n202.127.224.0/19\n202.129.208.0/24\n202.130.0.0/19\n202.130.39.0/24\n202.130.224.0/19\n202.131.16.0/21\n202.131.48.0/20\n202.131.208.0/20\n202.133.32.0/20\n202.134.58.0/24\n202.134.128.0/20\n202.134.208.0/20\n202.136.48.0/20\n202.136.208.0/20\n202.136.224.0/20\n202.136.248.0/22\n202.136.254.0/23\n202.137.231.0/24\n202.140.140.0/22\n202.140.144.0/20\n202.141.160.0/19\n202.142.16.0/20\n202.143.4.0/22\n202.143.16.0/20\n202.143.32.0/20\n202.143.56.0/21\n202.143.100.0/22\n202.143.104.0/22\n202.144.196.0/22\n202.146.160.0/20\n202.146.186.0/24\n202.146.188.0/22\n202.146.196.0/22\n202.146.200.0/21\n202.147.144.0/20\n202.148.32.0/20\n202.148.64.0/18\n202.149.32.0/19\n202.149.160.0/19\n202.149.224.0/19\n202.150.16.0/20\n202.150.32.0/20\n202.150.56.0/22\n202.150.192.0/20\n202.150.224.0/19\n202.151.0.0/22\n202.151.33.0/24\n202.151.128.0/19\n202.152.176.0/20\n202.153.0.0/22\n202.153.7.0/24\n202.153.48.0/20\n202.157.192.0/19\n202.158.160.0/19\n202.158.242.0/24\n202.160.140.0/22\n202.160.156.0/22\n202.160.176.0/20\n202.162.67.0/24\n202.162.75.0/24\n202.164.0.0/20\n202.164.96.0/19\n202.165.96.0/21\n202.165.104.0/22\n202.165.176.0/20\n202.165.208.0/20\n202.165.239.0/24\n202.165.240.0/23\n202.165.243.0/24\n202.165.245.0/24\n202.165.251.0/24\n202.165.252.0/22\n202.166.224.0/19\n202.168.80.0/22\n202.168.128.0/20\n202.168.160.0/19\n202.170.128.0/19\n202.170.216.0/21\n202.170.224.0/19\n202.171.216.0/21\n202.171.232.0/24\n202.171.235.0/24\n202.172.0.0/22\n202.172.7.0/24\n202.173.0.0/22\n202.173.6.0/24\n202.173.8.0/21\n202.173.112.0/22\n202.173.224.0/19\n202.174.64.0/20\n202.174.124.0/22\n202.176.224.0/19\n202.179.160.0/20\n202.179.240.0/20\n202.180.128.0/19\n202.180.208.0/21\n202.181.8.0/22\n202.181.28.0/22\n202.181.112.0/20\n202.182.32.0/20\n202.182.192.0/19\n202.189.0.0/18\n202.189.80.0/20\n202.189.184.0/21\n202.191.0.0/24\n202.191.68.0/22\n202.191.72.0/21\n202.191.80.0/20\n202.192.0.0/12\n203.0.4.0/22\n203.0.10.0/23\n203.0.18.0/24\n203.0.24.0/24\n203.0.42.0/23\n203.0.45.0/24\n203.0.46.0/23\n203.0.81.0/24\n203.0.82.0/23\n203.0.90.0/23\n203.0.96.0/23\n203.0.104.0/21\n203.0.114.0/23\n203.0.122.0/24\n203.0.128.0/24\n203.0.130.0/23\n203.0.132.0/22\n203.0.137.0/24\n203.0.142.0/24\n203.0.144.0/24\n203.0.146.0/24\n203.0.148.0/24\n203.0.150.0/23\n203.0.152.0/24\n203.0.177.0/24\n203.0.224.0/24\n203.1.4.0/22\n203.1.18.0/24\n203.1.26.0/23\n203.1.65.0/24\n203.1.66.0/23\n203.1.70.0/23\n203.1.76.0/23\n203.1.90.0/24\n203.1.97.0/24\n203.1.98.0/23\n203.1.100.0/22\n203.1.108.0/24\n203.1.253.0/24\n203.1.254.0/24\n203.2.64.0/21\n203.2.73.0/24\n203.2.112.0/21\n203.2.126.0/23\n203.2.140.0/24\n203.2.150.0/24\n203.2.152.0/22\n203.2.156.0/23\n203.2.160.0/21\n203.2.180.0/23\n203.2.196.0/23\n203.2.209.0/24\n203.2.214.0/23\n203.2.226.0/23\n203.2.229.0/24\n203.2.236.0/23\n203.3.68.0/24\n203.3.72.0/23\n203.3.75.0/24\n203.3.80.0/21\n203.3.96.0/22\n203.3.105.0/24\n203.3.112.0/21\n203.3.120.0/24\n203.3.123.0/24\n203.3.135.0/24\n203.3.139.0/24\n203.3.143.0/24\n203.4.132.0/23\n203.4.134.0/24\n203.4.151.0/24\n203.4.152.0/22\n203.4.174.0/23\n203.4.180.0/24\n203.4.186.0/24\n203.4.205.0/24\n203.4.208.0/22\n203.4.227.0/24\n203.4.230.0/23\n203.5.4.0/23\n203.5.7.0/24\n203.5.8.0/23\n203.5.11.0/24\n203.5.21.0/24\n203.5.22.0/24\n203.5.44.0/24\n203.5.46.0/23\n203.5.52.0/22\n203.5.56.0/23\n203.5.60.0/23\n203.5.114.0/23\n203.5.118.0/24\n203.5.120.0/24\n203.5.172.0/24\n203.5.180.0/23\n203.5.182.0/24\n203.5.185.0/24\n203.5.186.0/24\n203.5.188.0/23\n203.5.190.0/24\n203.5.195.0/24\n203.5.214.0/23\n203.5.218.0/23\n203.6.131.0/24\n203.6.136.0/24\n203.6.138.0/23\n203.6.142.0/24\n203.6.150.0/23\n203.6.157.0/24\n203.6.159.0/24\n203.6.224.0/20\n203.6.248.0/23\n203.7.129.0/24\n203.7.138.0/23\n203.7.147.0/24\n203.7.150.0/23\n203.7.158.0/24\n203.7.192.0/23\n203.7.200.0/24\n203.8.0.0/24\n203.8.8.0/24\n203.8.23.0/24\n203.8.70.0/24\n203.8.82.0/24\n203.8.86.0/23\n203.8.91.0/24\n203.8.110.0/23\n203.8.115.0/24\n203.8.166.0/23\n203.8.169.0/24\n203.8.173.0/24\n203.8.184.0/24\n203.8.186.0/23\n203.8.190.0/23\n203.8.192.0/24\n203.8.197.0/24\n203.8.198.0/23\n203.8.203.0/24\n203.8.209.0/24\n203.8.210.0/23\n203.8.212.0/22\n203.8.217.0/24\n203.8.220.0/24\n203.9.32.0/24\n203.9.36.0/23\n203.9.57.0/24\n203.9.63.0/24\n203.9.65.0/24\n203.9.70.0/23\n203.9.72.0/24\n203.9.75.0/24\n203.9.76.0/23\n203.9.96.0/22\n203.9.100.0/23\n203.9.108.0/24\n203.9.158.0/24\n203.10.34.0/24\n203.10.56.0/24\n203.10.74.0/23\n203.10.84.0/22\n203.10.88.0/24\n203.10.95.0/24\n203.10.125.0/24\n203.11.70.0/24\n203.11.76.0/22\n203.11.82.0/24\n203.11.84.0/22\n203.11.100.0/22\n203.11.109.0/24\n203.11.117.0/24\n203.11.122.0/24\n203.11.126.0/24\n203.11.136.0/22\n203.11.141.0/24\n203.11.142.0/23\n203.11.180.0/22\n203.11.208.0/22\n203.12.16.0/24\n203.12.19.0/24\n203.12.24.0/24\n203.12.57.0/24\n203.12.65.0/24\n203.12.66.0/24\n203.12.70.0/23\n203.12.87.0/24\n203.12.90.0/24\n203.12.92.0/22\n203.12.100.0/23\n203.12.103.0/24\n203.12.114.0/24\n203.12.118.0/24\n203.12.130.0/24\n203.12.137.0/24\n203.12.196.0/22\n203.12.211.0/24\n203.12.219.0/24\n203.12.226.0/24\n203.12.240.0/22\n203.13.18.0/24\n203.13.24.0/24\n203.13.44.0/23\n203.13.88.0/23\n203.13.92.0/22\n203.13.173.0/24\n203.13.224.0/23\n203.13.227.0/24\n203.13.233.0/24\n203.14.24.0/22\n203.14.33.0/24\n203.14.56.0/24\n203.14.61.0/24\n203.14.62.0/24\n203.14.104.0/24\n203.14.114.0/23\n203.14.118.0/24\n203.14.162.0/24\n203.14.184.0/21\n203.14.192.0/24\n203.14.194.0/23\n203.14.214.0/24\n203.14.231.0/24\n203.14.246.0/24\n203.15.0.0/20\n203.15.20.0/23\n203.15.22.0/24\n203.15.87.0/24\n203.15.88.0/23\n203.15.105.0/24\n203.15.112.0/21\n203.15.130.0/23\n203.15.149.0/24\n203.15.151.0/24\n203.15.156.0/22\n203.15.174.0/24\n203.15.227.0/24\n203.15.232.0/21\n203.15.240.0/23\n203.15.246.0/24\n203.16.10.0/24\n203.16.12.0/23\n203.16.16.0/21\n203.16.27.0/24\n203.16.38.0/24\n203.16.49.0/24\n203.16.50.0/23\n203.16.58.0/24\n203.16.63.0/24\n203.16.133.0/24\n203.16.161.0/24\n203.16.162.0/24\n203.16.186.0/23\n203.16.228.0/24\n203.16.238.0/24\n203.16.240.0/24\n203.16.245.0/24\n203.17.2.0/24\n203.17.18.0/24\n203.17.28.0/24\n203.17.39.0/24\n203.17.56.0/24\n203.17.74.0/23\n203.17.88.0/23\n203.17.136.0/24\n203.17.164.0/24\n203.17.187.0/24\n203.17.190.0/23\n203.17.231.0/24\n203.17.233.0/24\n203.17.248.0/23\n203.17.255.0/24\n203.18.2.0/23\n203.18.4.0/24\n203.18.7.0/24\n203.18.31.0/24\n203.18.37.0/24\n203.18.48.0/23\n203.18.52.0/24\n203.18.72.0/22\n203.18.80.0/23\n203.18.87.0/24\n203.18.100.0/23\n203.18.105.0/24\n203.18.107.0/24\n203.18.110.0/24\n203.18.129.0/24\n203.18.131.0/24\n203.18.132.0/23\n203.18.144.0/24\n203.18.153.0/24\n203.18.199.0/24\n203.18.208.0/24\n203.18.211.0/24\n203.18.215.0/24\n203.19.1.0/24\n203.19.18.0/24\n203.19.24.0/24\n203.19.30.0/24\n203.19.32.0/21\n203.19.41.0/24\n203.19.44.0/23\n203.19.46.0/24\n203.19.58.0/24\n203.19.60.0/23\n203.19.64.0/24\n203.19.68.0/24\n203.19.72.0/24\n203.19.101.0/24\n203.19.111.0/24\n203.19.131.0/24\n203.19.133.0/24\n203.19.144.0/24\n203.19.147.0/24\n203.19.149.0/24\n203.19.156.0/24\n203.19.176.0/24\n203.19.178.0/23\n203.19.208.0/24\n203.19.228.0/22\n203.19.233.0/24\n203.19.242.0/24\n203.19.248.0/23\n203.19.255.0/24\n203.20.17.0/24\n203.20.40.0/23\n203.20.44.0/24\n203.20.48.0/24\n203.20.61.0/24\n203.20.65.0/24\n203.20.84.0/23\n203.20.89.0/24\n203.20.106.0/23\n203.20.115.0/24\n203.20.117.0/24\n203.20.118.0/23\n203.20.122.0/24\n203.20.126.0/23\n203.20.135.0/24\n203.20.136.0/21\n203.20.150.0/24\n203.20.230.0/24\n203.20.232.0/24\n203.20.236.0/24\n203.21.0.0/23\n203.21.2.0/24\n203.21.8.0/24\n203.21.10.0/24\n203.21.18.0/24\n203.21.33.0/24\n203.21.34.0/24\n203.21.41.0/24\n203.21.44.0/24\n203.21.68.0/24\n203.21.82.0/24\n203.21.96.0/22\n203.21.124.0/24\n203.21.136.0/23\n203.21.145.0/24\n203.21.206.0/24\n203.22.24.0/24\n203.22.28.0/23\n203.22.31.0/24\n203.22.68.0/24\n203.22.76.0/24\n203.22.78.0/24\n203.22.84.0/24\n203.22.87.0/24\n203.22.92.0/22\n203.22.99.0/24\n203.22.106.0/24\n203.22.122.0/23\n203.22.131.0/24\n203.22.163.0/24\n203.22.166.0/24\n203.22.170.0/24\n203.22.176.0/21\n203.22.194.0/24\n203.22.242.0/23\n203.22.245.0/24\n203.22.246.0/24\n203.22.252.0/23\n203.23.0.0/24\n203.23.47.0/24\n203.23.61.0/24\n203.23.62.0/23\n203.23.73.0/24\n203.23.85.0/24\n203.23.92.0/22\n203.23.98.0/24\n203.23.107.0/24\n203.23.112.0/24\n203.23.130.0/24\n203.23.140.0/23\n203.23.172.0/24\n203.23.182.0/24\n203.23.186.0/23\n203.23.192.0/24\n203.23.197.0/24\n203.23.198.0/24\n203.23.204.0/22\n203.23.224.0/24\n203.23.226.0/23\n203.23.228.0/22\n203.23.249.0/24\n203.23.251.0/24\n203.24.13.0/24\n203.24.18.0/24\n203.24.27.0/24\n203.24.43.0/24\n203.24.56.0/24\n203.24.58.0/24\n203.24.67.0/24\n203.24.74.0/24\n203.24.79.0/24\n203.24.80.0/23\n203.24.84.0/23\n203.24.86.0/24\n203.24.90.0/24\n203.24.111.0/24\n203.24.112.0/24\n203.24.116.0/24\n203.24.122.0/23\n203.24.145.0/24\n203.24.152.0/23\n203.24.157.0/24\n203.24.161.0/24\n203.24.167.0/24\n203.24.186.0/23\n203.24.199.0/24\n203.24.202.0/24\n203.24.212.0/23\n203.24.217.0/24\n203.24.219.0/24\n203.24.244.0/24\n203.25.19.0/24\n203.25.20.0/23\n203.25.46.0/24\n203.25.48.0/21\n203.25.64.0/23\n203.25.91.0/24\n203.25.99.0/24\n203.25.100.0/24\n203.25.106.0/24\n203.25.131.0/24\n203.25.135.0/24\n203.25.138.0/24\n203.25.147.0/24\n203.25.153.0/24\n203.25.154.0/23\n203.25.164.0/24\n203.25.166.0/24\n203.25.174.0/23\n203.25.180.0/24\n203.25.182.0/24\n203.25.191.0/24\n203.25.199.0/24\n203.25.200.0/24\n203.25.202.0/23\n203.25.208.0/20\n203.25.229.0/24\n203.25.235.0/24\n203.25.236.0/24\n203.25.242.0/24\n203.26.12.0/24\n203.26.34.0/24\n203.26.49.0/24\n203.26.50.0/24\n203.26.55.0/24\n203.26.56.0/23\n203.26.60.0/24\n203.26.65.0/24\n203.26.68.0/24\n203.26.76.0/24\n203.26.80.0/24\n203.26.84.0/24\n203.26.97.0/24\n203.26.102.0/23\n203.26.115.0/24\n203.26.116.0/24\n203.26.129.0/24\n203.26.143.0/24\n203.26.144.0/24\n203.26.148.0/23\n203.26.154.0/24\n203.26.158.0/23\n203.26.161.0/24\n203.26.170.0/24\n203.26.173.0/24\n203.26.176.0/24\n203.26.185.0/24\n203.26.202.0/23\n203.26.210.0/24\n203.26.214.0/24\n203.26.222.0/24\n203.26.224.0/24\n203.26.228.0/24\n203.26.232.0/24\n203.27.0.0/24\n203.27.10.0/24\n203.27.15.0/24\n203.27.16.0/24\n203.27.20.0/24\n203.27.22.0/23\n203.27.40.0/24\n203.27.45.0/24\n203.27.53.0/24\n203.27.65.0/24\n203.27.66.0/24\n203.27.81.0/24\n203.27.88.0/24\n203.27.102.0/24\n203.27.109.0/24\n203.27.117.0/24\n203.27.121.0/24\n203.27.122.0/23\n203.27.125.0/24\n203.27.200.0/24\n203.27.202.0/24\n203.27.233.0/24\n203.27.241.0/24\n203.27.250.0/24\n203.28.10.0/24\n203.28.12.0/24\n203.28.33.0/24\n203.28.34.0/23\n203.28.43.0/24\n203.28.44.0/24\n203.28.54.0/24\n203.28.56.0/24\n203.28.73.0/24\n203.28.74.0/24\n203.28.76.0/24\n203.28.86.0/24\n203.28.88.0/24\n203.28.112.0/24\n203.28.131.0/24\n203.28.136.0/24\n203.28.140.0/24\n203.28.145.0/24\n203.28.165.0/24\n203.28.169.0/24\n203.28.170.0/24\n203.28.178.0/23\n203.28.185.0/24\n203.28.187.0/24\n203.28.196.0/24\n203.28.226.0/23\n203.28.239.0/24\n203.29.2.0/24\n203.29.8.0/23\n203.29.13.0/24\n203.29.14.0/24\n203.29.28.0/24\n203.29.46.0/24\n203.29.57.0/24\n203.29.61.0/24\n203.29.63.0/24\n203.29.69.0/24\n203.29.73.0/24\n203.29.81.0/24\n203.29.90.0/24\n203.29.95.0/24\n203.29.100.0/24\n203.29.103.0/24\n203.29.112.0/24\n203.29.120.0/22\n203.29.182.0/23\n203.29.187.0/24\n203.29.189.0/24\n203.29.190.0/24\n203.29.205.0/24\n203.29.210.0/24\n203.29.217.0/24\n203.29.227.0/24\n203.29.231.0/24\n203.29.233.0/24\n203.29.234.0/24\n203.29.248.0/24\n203.29.254.0/23\n203.30.16.0/23\n203.30.25.0/24\n203.30.27.0/24\n203.30.29.0/24\n203.30.66.0/24\n203.30.81.0/24\n203.30.87.0/24\n203.30.111.0/24\n203.30.121.0/24\n203.30.123.0/24\n203.30.152.0/24\n203.30.156.0/24\n203.30.162.0/24\n203.30.173.0/24\n203.30.175.0/24\n203.30.187.0/24\n203.30.194.0/24\n203.30.217.0/24\n203.30.220.0/24\n203.30.222.0/24\n203.30.232.0/23\n203.30.235.0/24\n203.30.240.0/23\n203.30.246.0/24\n203.30.250.0/23\n203.31.45.0/24\n203.31.46.0/24\n203.31.49.0/24\n203.31.51.0/24\n203.31.54.0/23\n203.31.69.0/24\n203.31.72.0/24\n203.31.80.0/24\n203.31.85.0/24\n203.31.97.0/24\n203.31.105.0/24\n203.31.106.0/24\n203.31.108.0/23\n203.31.124.0/24\n203.31.162.0/24\n203.31.174.0/24\n203.31.177.0/24\n203.31.181.0/24\n203.31.187.0/24\n203.31.189.0/24\n203.31.204.0/24\n203.31.220.0/24\n203.31.222.0/23\n203.31.225.0/24\n203.31.229.0/24\n203.31.248.0/23\n203.31.253.0/24\n203.32.20.0/24\n203.32.48.0/23\n203.32.56.0/24\n203.32.60.0/24\n203.32.62.0/24\n203.32.68.0/23\n203.32.76.0/24\n203.32.81.0/24\n203.32.84.0/23\n203.32.95.0/24\n203.32.102.0/24\n203.32.105.0/24\n203.32.130.0/24\n203.32.133.0/24\n203.32.140.0/24\n203.32.152.0/24\n203.32.186.0/23\n203.32.192.0/24\n203.32.196.0/24\n203.32.203.0/24\n203.32.204.0/23\n203.32.212.0/24\n203.33.4.0/24\n203.33.7.0/24\n203.33.8.0/21\n203.33.21.0/24\n203.33.26.0/24\n203.33.32.0/24\n203.33.63.0/24\n203.33.64.0/24\n203.33.67.0/24\n203.33.68.0/24\n203.33.73.0/24\n203.33.79.0/24\n203.33.100.0/24\n203.33.122.0/24\n203.33.129.0/24\n203.33.131.0/24\n203.33.145.0/24\n203.33.156.0/24\n203.33.158.0/23\n203.33.174.0/24\n203.33.185.0/24\n203.33.200.0/24\n203.33.202.0/23\n203.33.204.0/24\n203.33.206.0/23\n203.33.214.0/23\n203.33.224.0/23\n203.33.226.0/24\n203.33.233.0/24\n203.33.243.0/24\n203.33.250.0/24\n203.34.4.0/24\n203.34.21.0/24\n203.34.27.0/24\n203.34.39.0/24\n203.34.48.0/23\n203.34.54.0/24\n203.34.56.0/23\n203.34.67.0/24\n203.34.69.0/24\n203.34.76.0/24\n203.34.92.0/24\n203.34.106.0/24\n203.34.113.0/24\n203.34.147.0/24\n203.34.150.0/24\n203.34.152.0/23\n203.34.161.0/24\n203.34.162.0/24\n203.34.187.0/24\n203.34.192.0/21\n203.34.204.0/22\n203.34.232.0/24\n203.34.240.0/24\n203.34.242.0/24\n203.34.245.0/24\n203.34.251.0/24\n203.55.2.0/23\n203.55.4.0/24\n203.55.10.0/24\n203.55.13.0/24\n203.55.22.0/24\n203.55.30.0/24\n203.55.93.0/24\n203.55.101.0/24\n203.55.109.0/24\n203.55.110.0/24\n203.55.116.0/23\n203.55.119.0/24\n203.55.128.0/23\n203.55.146.0/23\n203.55.192.0/24\n203.55.196.0/24\n203.55.218.0/23\n203.55.221.0/24\n203.55.224.0/24\n203.56.1.0/24\n203.56.4.0/24\n203.56.12.0/24\n203.56.24.0/24\n203.56.38.0/24\n203.56.40.0/24\n203.56.46.0/24\n203.56.48.0/21\n203.56.68.0/23\n203.56.82.0/23\n203.56.84.0/23\n203.56.95.0/24\n203.56.110.0/24\n203.56.121.0/24\n203.56.161.0/24\n203.56.169.0/24\n203.56.172.0/23\n203.56.175.0/24\n203.56.183.0/24\n203.56.185.0/24\n203.56.187.0/24\n203.56.192.0/24\n203.56.198.0/24\n203.56.201.0/24\n203.56.208.0/23\n203.56.210.0/24\n203.56.214.0/24\n203.56.216.0/24\n203.56.227.0/24\n203.56.228.0/24\n203.56.231.0/24\n203.56.232.0/24\n203.56.240.0/24\n203.56.252.0/24\n203.56.254.0/24\n203.57.5.0/24\n203.57.6.0/24\n203.57.12.0/23\n203.57.28.0/24\n203.57.39.0/24\n203.57.46.0/24\n203.57.58.0/24\n203.57.61.0/24\n203.57.66.0/24\n203.57.69.0/24\n203.57.70.0/23\n203.57.73.0/24\n203.57.90.0/24\n203.57.101.0/24\n203.57.109.0/24\n203.57.123.0/24\n203.57.157.0/24\n203.57.200.0/24\n203.57.202.0/24\n203.57.206.0/24\n203.57.222.0/24\n203.57.224.0/20\n203.57.246.0/23\n203.57.249.0/24\n203.57.253.0/24\n203.57.254.0/23\n203.62.2.0/24\n203.62.131.0/24\n203.62.139.0/24\n203.62.161.0/24\n203.62.197.0/24\n203.62.228.0/22\n203.62.234.0/24\n203.62.246.0/24\n203.65.240.0/22\n203.76.160.0/22\n203.76.168.0/22\n203.76.208.0/21\n203.76.216.0/22\n203.76.240.0/21\n203.77.180.0/22\n203.78.48.0/20\n203.78.156.0/22\n203.79.0.0/20\n203.79.32.0/20\n203.80.4.0/23\n203.80.32.0/20\n203.80.57.0/24\n203.80.129.0/24\n203.80.132.0/22\n203.80.136.0/21\n203.80.144.0/20\n203.81.0.0/21\n203.81.16.0/20\n203.81.244.0/22\n203.82.0.0/23\n203.82.16.0/21\n203.82.112.0/20\n203.82.224.0/20\n203.83.0.0/22\n203.83.8.0/21\n203.83.56.0/21\n203.83.224.0/20\n203.86.0.0/17\n203.86.250.0/24\n203.86.254.0/23\n203.88.32.0/19\n203.88.100.0/22\n203.88.192.0/19\n203.89.0.0/22\n203.89.8.0/21\n203.89.100.0/22\n203.89.133.0/24\n203.89.136.0/22\n203.89.144.0/24\n203.90.0.0/22\n203.90.8.0/21\n203.90.128.0/18\n203.90.192.0/19\n203.91.32.0/19\n203.91.96.0/20\n203.91.120.0/21\n203.92.0.0/22\n203.92.6.0/24\n203.92.160.0/19\n203.93.0.0/16\n203.94.0.0/19\n203.95.0.0/21\n203.95.96.0/19\n203.95.128.0/18\n203.95.200.0/21\n203.95.208.0/22\n203.95.224.0/19\n203.99.8.0/21\n203.99.16.0/20\n203.99.80.0/20\n203.100.32.0/20\n203.100.48.0/21\n203.100.58.0/24\n203.100.60.0/24\n203.100.63.0/24\n203.100.80.0/20\n203.100.96.0/19\n203.100.192.0/20\n203.104.32.0/20\n203.105.96.0/19\n203.105.128.0/19\n203.107.0.0/17\n203.110.160.0/19\n203.110.208.0/20\n203.110.232.0/23\n203.110.234.0/24\n203.114.80.0/20\n203.114.244.0/22\n203.118.192.0/19\n203.118.241.0/24\n203.118.248.0/22\n203.119.24.0/21\n203.119.32.0/22\n203.119.80.0/22\n203.119.85.0/24\n203.119.113.0/24\n203.119.114.0/23\n203.119.116.0/22\n203.119.120.0/21\n203.119.128.0/17\n203.123.58.0/24\n203.128.32.0/19\n203.128.96.0/19\n203.128.128.0/24\n203.128.224.0/21\n203.129.8.0/21\n203.130.32.0/19\n203.132.32.0/19\n203.134.240.0/21\n203.135.96.0/19\n203.135.160.0/20\n203.142.12.0/23\n203.142.219.0/24\n203.142.224.0/19\n203.144.96.0/19\n203.145.0.0/19\n203.148.0.0/18\n203.148.64.0/20\n203.148.80.0/22\n203.148.86.0/23\n203.149.92.0/22\n203.152.64.0/19\n203.152.128.0/19\n203.153.0.0/22\n203.156.192.0/18\n203.158.16.0/21\n203.160.52.0/22\n203.160.104.0/21\n203.160.129.0/24\n203.160.192.0/19\n203.161.0.0/22\n203.161.180.0/24\n203.161.183.0/24\n203.161.192.0/19\n203.166.160.0/19\n203.167.28.0/22\n203.168.0.0/19\n203.170.58.0/23\n203.171.0.0/22\n203.171.208.0/24\n203.171.224.0/20\n203.174.4.0/24\n203.174.6.0/23\n203.174.96.0/19\n203.175.128.0/19\n203.175.192.0/18\n203.176.0.0/18\n203.176.64.0/19\n203.176.168.0/21\n203.184.80.0/20\n203.185.189.0/24\n203.187.160.0/19\n203.189.0.0/23\n203.189.6.0/23\n203.189.112.0/22\n203.189.192.0/19\n203.189.232.0/22\n203.189.240.0/22\n203.190.96.0/20\n203.190.249.0/24\n203.191.0.0/23\n203.191.2.0/24\n203.191.5.0/24\n203.191.7.0/24\n203.191.16.0/20\n203.191.64.0/18\n203.191.133.0/24\n203.191.144.0/20\n203.192.0.0/19\n203.193.224.0/19\n203.194.120.0/21\n203.195.64.0/19\n203.195.112.0/21\n203.195.128.0/17\n203.196.0.0/20\n203.196.28.0/22\n203.201.181.0/24\n203.201.182.0/24\n203.202.236.0/22\n203.205.64.0/19\n203.205.128.0/17\n203.207.64.0/18\n203.207.128.0/17\n203.208.0.0/20\n203.208.16.0/22\n203.208.32.0/19\n203.209.224.0/19\n203.212.0.0/20\n203.212.80.0/20\n203.215.232.0/21\n203.217.164.0/22\n203.222.192.0/20\n203.223.0.0/20\n203.223.16.0/21\n204.52.191.0/24\n204.55.160.0/24\n204.74.96.0/24\n204.114.176.0/23\n206.219.44.0/23\n206.219.50.0/23\n206.219.52.0/23\n207.89.20.0/24\n210.2.0.0/19\n210.5.0.0/19\n210.5.56.0/21\n210.5.128.0/19\n210.7.56.0/21\n210.12.0.0/15\n210.14.64.0/19\n210.14.112.0/20\n210.14.128.0/17\n210.15.0.0/17\n210.15.128.0/18\n210.16.104.0/22\n210.16.128.0/18\n210.21.0.0/16\n210.22.0.0/16\n210.23.32.0/19\n210.25.0.0/16\n210.26.0.0/15\n210.28.0.0/14\n210.32.0.0/12\n210.51.0.0/16\n210.52.0.0/15\n210.56.192.0/19\n210.72.0.0/14\n210.76.0.0/15\n210.78.0.0/16\n210.79.64.0/18\n210.79.224.0/19\n210.82.0.0/15\n210.87.128.0/18\n210.185.192.0/18\n210.192.96.0/19\n211.64.0.0/13\n211.80.0.0/12\n211.96.0.0/13\n211.136.0.0/13\n211.144.0.0/12\n211.160.0.0/13\n212.64.0.0/17\n212.129.128.0/17\n218.0.0.0/11\n218.56.0.0/13\n218.64.0.0/11\n218.96.0.0/14\n218.100.88.0/21\n218.100.96.0/19\n218.100.128.0/17\n218.104.0.0/14\n218.108.0.0/15\n218.185.192.0/19\n218.185.240.0/21\n218.192.0.0/12\n218.240.0.0/13\n218.249.0.0/16\n219.72.0.0/16\n219.82.0.0/16\n219.83.128.0/17\n219.90.68.0/22\n219.90.72.0/21\n219.128.0.0/11\n219.216.0.0/13\n219.224.0.0/12\n219.242.0.0/15\n219.244.0.0/14\n220.101.192.0/18\n220.112.0.0/14\n220.152.128.0/17\n220.154.0.0/15\n220.158.240.0/22\n220.160.0.0/11\n220.192.0.0/12\n220.231.0.0/18\n220.231.128.0/17\n220.232.64.0/18\n220.234.0.0/16\n220.242.0.0/15\n220.247.136.0/21\n220.248.0.0/14\n220.252.0.0/16\n221.0.0.0/13\n221.8.0.0/14\n221.12.0.0/17\n221.12.128.0/18\n221.13.0.0/16\n221.14.0.0/15\n221.122.0.0/15\n221.128.128.0/17\n221.129.0.0/16\n221.130.0.0/15\n221.133.224.0/19\n221.136.0.0/15\n221.172.0.0/14\n221.176.0.0/13\n221.192.0.0/14\n221.196.0.0/15\n221.198.0.0/16\n221.199.0.0/17\n221.199.128.0/18\n221.199.192.0/20\n221.199.224.0/19\n221.200.0.0/13\n221.208.0.0/12\n221.224.0.0/12\n222.16.0.0/12\n222.32.0.0/11\n222.64.0.0/11\n222.125.0.0/16\n222.126.128.0/17\n222.128.0.0/12\n222.160.0.0/14\n222.168.0.0/13\n222.176.0.0/12\n222.192.0.0/11\n222.240.0.0/13\n222.248.0.0/15\n223.0.0.0/12\n223.20.0.0/15\n223.27.184.0/22\n223.29.208.0/22\n223.29.252.0/22\n223.64.0.0/11\n223.96.0.0/12\n223.112.0.0/14\n223.116.0.0/15\n223.120.0.0/13\n223.128.0.0/15\n223.144.0.0/12\n223.160.0.0/14\n223.166.0.0/15\n223.192.0.0/15\n223.198.0.0/15\n223.201.0.0/16\n223.202.0.0/15\n223.208.0.0/13\n223.220.0.0/15\n223.223.176.0/20\n223.223.192.0/20\n223.240.0.0/13\n223.248.0.0/14\n223.252.128.0/17\n223.254.0.0/16\n223.255.0.0/17\n223.255.236.0/22\n223.255.252.0/23\n"
  },
  {
    "path": "core/src/main/assets/acl/gfwlist.acl",
    "content": "#\n# GFW list from https://github.com/gfwlist/gfwlist/blob/master/gfwlist.txt\n#\n\n[bypass_all]\n\n[proxy_list]\n# Telegram IPs$\n91.108.4.0/22\n91.108.8.0/21\n91.108.16.0/21\n91.108.36.0/22\n91.108.56.0/22\n109.239.140.0/24\n149.154.160.0/20\n14.102.250.18\n14.102.250.19\n174.142.105.153\n50.7.31.230\n67.220.91.15\n67.220.91.18\n67.220.91.23\n69.65.19.160\n72.52.81.22\n85.17.73.31\n(?:^|\\.)030buy\\.com$\n(?:^|\\.)0rz\\.tw$\n(?:^|\\.)1-apple\\.com\\.tw$\n(?:^|\\.)10\\.tt$\n(?:^|\\.)1000giri\\.net$\n(?:^|\\.)100ke\\.org$\n(?:^|\\.)10conditionsoflove\\.com$\n(?:^|\\.)10musume\\.com$\n(?:^|\\.)123rf\\.com$\n(?:^|\\.)12bet\\.com$\n(?:^|\\.)12vpn\\.com$\n(?:^|\\.)12vpn\\.net$\n(?:^|\\.)138\\.com$\n(?:^|\\.)141hongkong\\.com$\n(?:^|\\.)141jj\\.com$\n(?:^|\\.)141tube\\.com$\n(?:^|\\.)1688\\.com\\.au$\n(?:^|\\.)173ng\\.com$\n(?:^|\\.)177pic\\.info$\n(?:^|\\.)17t17p\\.com$\n(?:^|\\.)18board\\.com$\n(?:^|\\.)18board\\.info$\n(?:^|\\.)18onlygirls\\.com$\n(?:^|\\.)18p2p\\.com$\n(?:^|\\.)18virginsex\\.com$\n(?:^|\\.)1949er\\.org$\n(?:^|\\.)1984bbs\\.com$\n(?:^|\\.)1984bbs\\.org$\n(?:^|\\.)1989report\\.hkja\\.org\\.hk$\n(?:^|\\.)1991way\\.com$\n(?:^|\\.)1998cdp\\.org$\n(?:^|\\.)1bao\\.org$\n(?:^|\\.)1dumb\\.com$\n(?:^|\\.)1e100\\.net$\n(?:^|\\.)1eew\\.com$\n(?:^|\\.)1mobile\\.com$\n(?:^|\\.)1pondo\\.tv$\n(?:^|\\.)2-hand\\.info$\n(?:^|\\.)2000fun\\.com$\n(?:^|\\.)2008xianzhang\\.info$\n(?:^|\\.)2017\\.hk$\n(?:^|\\.)21andy\\.com$\n(?:^|\\.)21pron\\.com$\n(?:^|\\.)21sextury\\.com$\n(?:^|\\.)228\\.net\\.tw$\n(?:^|\\.)233abc\\.com$\n(?:^|\\.)24hrs\\.ca$\n(?:^|\\.)24smile\\.org$\n(?:^|\\.)25u\\.com$\n(?:^|\\.)2lipstube\\.com$\n(?:^|\\.)2shared\\.com$\n(?:^|\\.)2waky\\.com$\n(?:^|\\.)3-a\\.net$\n(?:^|\\.)30boxes\\.com$\n(?:^|\\.)315lz\\.com$\n(?:^|\\.)32red\\.com$\n(?:^|\\.)36rain\\.com$\n(?:^|\\.)3a5a\\.com$\n(?:^|\\.)3arabtv\\.com$\n(?:^|\\.)3boys2girls\\.com$\n(?:^|\\.)3d-game\\.com$\n(?:^|\\.)3proxy\\.ru$\n(?:^|\\.)3ren\\.ca$\n(?:^|\\.)3tui\\.net$\n(?:^|\\.)43110\\.cf$\n(?:^|\\.)466453\\.com$\n(?:^|\\.)4bluestones\\.biz$\n(?:^|\\.)4chan\\.com$\n(?:^|\\.)4dq\\.com$\n(?:^|\\.)4everproxy\\.com$\n(?:^|\\.)4irc\\.com$\n(?:^|\\.)4mydomain\\.com$\n(?:^|\\.)4pu\\.com$\n(?:^|\\.)4rbtv\\.com$\n(?:^|\\.)4shared\\.com$\n(?:^|\\.)51\\.ca$\n(?:^|\\.)51jav\\.org$\n(?:^|\\.)51luoben\\.com$\n(?:^|\\.)5278\\.cc$\n(?:^|\\.)5299\\.tv$\n(?:^|\\.)56cun04\\.jigsy\\.com$\n(?:^|\\.)5aimiku\\.com$\n(?:^|\\.)5i01\\.com$\n(?:^|\\.)5isotoi5\\.org$\n(?:^|\\.)5maodang\\.com$\n(?:^|\\.)63i\\.com$\n(?:^|\\.)64memo$\n(?:^|\\.)64museum\\.org$\n(?:^|\\.)64tianwang\\.com$\n(?:^|\\.)64wiki\\.com$\n(?:^|\\.)66\\.ca$\n(?:^|\\.)666kb\\.com$\n(?:^|\\.)6park\\.com$\n(?:^|\\.)6parker\\.com$\n(?:^|\\.)7capture\\.com$\n(?:^|\\.)7cow\\.com$\n(?:^|\\.)8-d\\.com$\n(?:^|\\.)85cc\\.net$\n(?:^|\\.)85cc\\.us$\n(?:^|\\.)85st\\.com$\n(?:^|\\.)881903\\.com$\n(?:^|\\.)888\\.com$\n(?:^|\\.)888poker\\.com$\n(?:^|\\.)89-64\\.org$\n(?:^|\\.)89\\.64\\.charter\\.constitutionalism\\.solutions$\n(?:^|\\.)8news\\.com\\.tw$\n(?:^|\\.)8z1\\.net$\n(?:^|\\.)9001700\\.com$\n(?:^|\\.)908taiwan\\.org$\n(?:^|\\.)91porn\\.com$\n(?:^|\\.)91vps\\.club$\n(?:^|\\.)92ccav\\.com$\n(?:^|\\.)991\\.com$\n(?:^|\\.)99btgc01\\.com$\n(?:^|\\.)99cn\\.info$\n(?:^|\\.)9bis\\.com$\n(?:^|\\.)9bis\\.net$\n(?:^|\\.)9gag\\.com$\n(?:^|\\.)a-normal-day\\.com$\n(?:^|\\.)a248\\.e\\.akamai\\.net$\n(?:^|\\.)a5\\.com\\.ru$\n(?:^|\\.)aamacau\\.com$\n(?:^|\\.)abc\\.com$\n(?:^|\\.)abc\\.net\\.au$\n(?:^|\\.)abc\\.pp\\.ru$\n(?:^|\\.)abc\\.xyz$\n(?:^|\\.)abchinese\\.com$\n(?:^|\\.)abclite\\.net$\n(?:^|\\.)abebooks\\.com$\n(?:^|\\.)abematv\\.akamaized\\.net$\n(?:^|\\.)abitno\\.linpie\\.com$\n(?:^|\\.)ablwang\\.com$\n(?:^|\\.)aboluowang\\.com$\n(?:^|\\.)about\\.google$\n(?:^|\\.)aboutgfw\\.com$\n(?:^|\\.)abs\\.edu$\n(?:^|\\.)ac\\.jiruan\\.net$\n(?:^|\\.)accim\\.org$\n(?:^|\\.)aceros-de-hispania\\.com$\n(?:^|\\.)acevpn\\.com$\n(?:^|\\.)acg18\\.me$\n(?:^|\\.)acgkj\\.com$\n(?:^|\\.)acmedia365\\.com$\n(?:^|\\.)acmetoy\\.com$\n(?:^|\\.)acnw\\.com\\.au$\n(?:^|\\.)actfortibet\\.org$\n(?:^|\\.)actimes\\.com\\.au$\n(?:^|\\.)activpn\\.com$\n(?:^|\\.)aculo\\.us$\n(?:^|\\.)adcex\\.com$\n(?:^|\\.)addictedtocoffee\\.de$\n(?:^|\\.)adelaidebbs\\.com$\n(?:^|\\.)admin\\.recaptcha\\.net$\n(?:^|\\.)admob\\.com$\n(?:^|\\.)adpl\\.org\\.hk$\n(?:^|\\.)ads-twitter\\.com$\n(?:^|\\.)adsense\\.com$\n(?:^|\\.)adult-sex-games\\.com$\n(?:^|\\.)adult\\.friendfinder\\.com$\n(?:^|\\.)adultfriendfinder\\.com$\n(?:^|\\.)adultkeep\\.net$\n(?:^|\\.)advanscene\\.com$\n(?:^|\\.)advertfan\\.com$\n(?:^|\\.)ae\\.hao123\\.com$\n(?:^|\\.)ae\\.org$\n(?:^|\\.)aenhancers\\.com$\n(?:^|\\.)aex\\.com$\n(?:^|\\.)af\\.mil$\n(?:^|\\.)afantibbs\\.com$\n(?:^|\\.)agnesb\\.fr$\n(?:^|\\.)agoogleaday\\.com$\n(?:^|\\.)agro\\.hk$\n(?:^|\\.)ahr0chm6ly95zwnslm5lda$\n(?:^|\\.)ai-kan\\.net$\n(?:^|\\.)ai-wen\\.net$\n(?:^|\\.)ai\\.binwang\\.me$\n(?:^|\\.)ai\\.google$\n(?:^|\\.)aiph\\.net$\n(?:^|\\.)airasia\\.com$\n(?:^|\\.)airconsole\\.com$\n(?:^|\\.)airvpn\\.org$\n(?:^|\\.)aisex\\.com$\n(?:^|\\.)ait\\.org\\.tw$\n(?:^|\\.)aiweiwei\\.com$\n(?:^|\\.)aiweiweiblog\\.com$\n(?:^|\\.)akademiye\\.org$\n(?:^|\\.)akiba-online\\.com$\n(?:^|\\.)akiba-web\\.com$\n(?:^|\\.)akow\\.org$\n(?:^|\\.)al-islam\\.com$\n(?:^|\\.)al-qimmah\\.net$\n(?:^|\\.)alabout\\.com$\n(?:^|\\.)alanhou\\.com$\n(?:^|\\.)alarab\\.qa$\n(?:^|\\.)alasbarricadas\\.org$\n(?:^|\\.)alexlur\\.org$\n(?:^|\\.)alforattv\\.net$\n(?:^|\\.)alhayat\\.com$\n(?:^|\\.)alicejapan\\.co\\.jp$\n(?:^|\\.)aliengu\\.com$\n(?:^|\\.)alkasir\\.com$\n(?:^|\\.)allcoin\\.com$\n(?:^|\\.)allconnected\\.co$\n(?:^|\\.)alldrawnsex\\.com$\n(?:^|\\.)allervpn\\.com$\n(?:^|\\.)allfinegirls\\.com$\n(?:^|\\.)allgirlmassage\\.com$\n(?:^|\\.)allgirlsallowed\\.org$\n(?:^|\\.)allgravure\\.com$\n(?:^|\\.)alliance\\.org\\.hk$\n(?:^|\\.)allinfa\\.com$\n(?:^|\\.)alljackpotscasino\\.com$\n(?:^|\\.)allmovie\\.com$\n(?:^|\\.)allowed\\.org$\n(?:^|\\.)almasdarnews\\.com$\n(?:^|\\.)almostmy\\.com$\n(?:^|\\.)alphaporno\\.com$\n(?:^|\\.)alternate-tools\\.com$\n(?:^|\\.)alternativeto\\.net$\n(?:^|\\.)altrec\\.com$\n(?:^|\\.)alvinalexander\\.com$\n(?:^|\\.)alwaysdata\\.com$\n(?:^|\\.)alwaysdata\\.net$\n(?:^|\\.)alwaysvpn\\.com$\n(?:^|\\.)am730\\.com\\.hk$\n(?:^|\\.)amazon\\.co\\.jp$\n(?:^|\\.)amazon\\.com$\n(?:^|\\.)ameblo\\.jp$\n(?:^|\\.)americangreencard\\.com$\n(?:^|\\.)americanunfinished\\.com$\n(?:^|\\.)amiblockedornot\\.com$\n(?:^|\\.)amigobbs\\.net$\n(?:^|\\.)amitabhafoundation\\.us$\n(?:^|\\.)amnesty\\.org$\n(?:^|\\.)amnesty\\.org\\.hk$\n(?:^|\\.)amnesty\\.tw$\n(?:^|\\.)amnestyusa\\.org$\n(?:^|\\.)amnyemachen\\.org$\n(?:^|\\.)amoiist\\.com$\n(?:^|\\.)ampproject\\.org$\n(?:^|\\.)amtb-taipei\\.org$\n(?:^|\\.)anchorfree\\.com$\n(?:^|\\.)ancsconf\\.org$\n(?:^|\\.)andfaraway\\.net$\n(?:^|\\.)android-x86\\.org$\n(?:^|\\.)android\\.com$\n(?:^|\\.)androidify\\.com$\n(?:^|\\.)androidplus\\.co$\n(?:^|\\.)androidtv\\.com$\n(?:^|\\.)andygod\\.com$\n(?:^|\\.)angela-merkel\\.de$\n(?:^|\\.)angelfire\\.com$\n(?:^|\\.)angola\\.org$\n(?:^|\\.)angularjs\\.org$\n(?:^|\\.)animecrazy\\.net$\n(?:^|\\.)animeshippuuden\\.com$\n(?:^|\\.)aniscartujo\\.com$\n(?:^|\\.)annatam\\.com$\n(?:^|\\.)anobii\\.com$\n(?:^|\\.)anontext\\.com$\n(?:^|\\.)anonymise\\.us$\n(?:^|\\.)anonymitynetwork\\.com$\n(?:^|\\.)anonymizer\\.com$\n(?:^|\\.)anonymouse\\.org$\n(?:^|\\.)anpopo\\.com$\n(?:^|\\.)answering-islam\\.org$\n(?:^|\\.)anthonycalzadilla\\.com$\n(?:^|\\.)anti1984\\.com$\n(?:^|\\.)antichristendom\\.com$\n(?:^|\\.)antiwave\\.net$\n(?:^|\\.)anyporn\\.com$\n(?:^|\\.)anysex\\.com$\n(?:^|\\.)aobo\\.com\\.au$\n(?:^|\\.)aofriend\\.com$\n(?:^|\\.)aofriend\\.com\\.au$\n(?:^|\\.)aojiao\\.org$\n(?:^|\\.)aolchannels\\.aol\\.com$\n(?:^|\\.)aomiwang\\.com$\n(?:^|\\.)apartmentratings\\.com$\n(?:^|\\.)apartments\\.com$\n(?:^|\\.)apetube\\.com$\n(?:^|\\.)api-secure\\.recaptcha\\.net$\n(?:^|\\.)api-verify\\.recaptcha\\.net$\n(?:^|\\.)api\\.ai$\n(?:^|\\.)api\\.dropboxapi\\.com$\n(?:^|\\.)api\\.linksalpha\\.com$\n(?:^|\\.)api\\.proxlet\\.com$\n(?:^|\\.)api\\.pureapk\\.com$\n(?:^|\\.)api\\.recaptcha\\.net$\n(?:^|\\.)apiary\\.io$\n(?:^|\\.)apidocs\\.linksalpha\\.com$\n(?:^|\\.)apigee\\.com$\n(?:^|\\.)apk-dl\\.com$\n(?:^|\\.)apkdler\\.com$\n(?:^|\\.)apkmirror\\.com$\n(?:^|\\.)apkmonk\\.com$\n(?:^|\\.)apkplz\\.com$\n(?:^|\\.)apkpure\\.com$\n(?:^|\\.)aplusvpn\\.com$\n(?:^|\\.)app\\.box\\.com$\n(?:^|\\.)app\\.heywire\\.com$\n(?:^|\\.)app\\.smartmailcloud\\.com$\n(?:^|\\.)app\\.tutanota\\.com$\n(?:^|\\.)appdownloader\\.net$\n(?:^|\\.)appledaily\\.com$\n(?:^|\\.)appledaily\\.com\\.hk$\n(?:^|\\.)appledaily\\.com\\.tw$\n(?:^|\\.)appshopper\\.com$\n(?:^|\\.)appsocks\\.net$\n(?:^|\\.)appspot\\.com$\n(?:^|\\.)appsto\\.re$\n(?:^|\\.)aptoide\\.com$\n(?:^|\\.)ar\\.hao123\\.com$\n(?:^|\\.)archive\\.fo$\n(?:^|\\.)archive\\.is$\n(?:^|\\.)archive\\.li$\n(?:^|\\.)archive\\.org$\n(?:^|\\.)archive\\.today$\n(?:^|\\.)archives\\.gov$\n(?:^|\\.)archives\\.gov\\.tw$\n(?:^|\\.)arctosia\\.com$\n(?:^|\\.)areca-backup\\.org$\n(?:^|\\.)arena\\.taipei$\n(?:^|\\.)arethusa\\.su$\n(?:^|\\.)arlingtoncemetery\\.mil$\n(?:^|\\.)army\\.mil$\n(?:^|\\.)art4tibet1998\\.org$\n(?:^|\\.)arte\\.tv$\n(?:^|\\.)artofpeacefoundation\\.org$\n(?:^|\\.)artstation\\.com$\n(?:^|\\.)artsy\\.net$\n(?:^|\\.)asacp\\.org$\n(?:^|\\.)asdfg\\.jp$\n(?:^|\\.)asg\\.to$\n(?:^|\\.)asia-gaming\\.com$\n(?:^|\\.)asiaharvest\\.org$\n(?:^|\\.)asianews\\.it$\n(?:^|\\.)asiansexdiary\\.com$\n(?:^|\\.)asianspiss\\.com$\n(?:^|\\.)asianwomensfilm\\.de$\n(?:^|\\.)asiatgp\\.com$\n(?:^|\\.)asiatoday\\.us$\n(?:^|\\.)askstudent\\.com$\n(?:^|\\.)askynz\\.net$\n(?:^|\\.)assembla\\.com$\n(?:^|\\.)assets\\.bwbx\\.io$\n(?:^|\\.)assimp\\.org$\n(?:^|\\.)astrill\\.com$\n(?:^|\\.)atc\\.org\\.au$\n(?:^|\\.)atchinese\\.com$\n(?:^|\\.)atdmt\\.com$\n(?:^|\\.)atgfw\\.org$\n(?:^|\\.)athenaeizou\\.com$\n(?:^|\\.)atlanta168\\.com$\n(?:^|\\.)atlaspost\\.com$\n(?:^|\\.)atnext\\.com$\n(?:^|\\.)authorizeddns\\.net$\n(?:^|\\.)authorizeddns\\.org$\n(?:^|\\.)authorizeddns\\.us$\n(?:^|\\.)autodraw\\.com$\n(?:^|\\.)av-e-body\\.com$\n(?:^|\\.)av\\.com$\n(?:^|\\.)av\\.movie$\n(?:^|\\.)av\\.nightlife141\\.com$\n(?:^|\\.)avaaz\\.org$\n(?:^|\\.)avbody\\.tv$\n(?:^|\\.)avcity\\.tv$\n(?:^|\\.)avcool\\.com$\n(?:^|\\.)avdb\\.in$\n(?:^|\\.)avdb\\.tv$\n(?:^|\\.)avfantasy\\.com$\n(?:^|\\.)avgle\\.com$\n(?:^|\\.)avidemux\\.org$\n(?:^|\\.)avmo\\.pw$\n(?:^|\\.)avmoo\\.com$\n(?:^|\\.)avmoo\\.net$\n(?:^|\\.)avmoo\\.pw$\n(?:^|\\.)avoision\\.com$\n(?:^|\\.)avyahoo\\.com$\n(?:^|\\.)axureformac\\.com$\n(?:^|\\.)azerbaycan\\.tv$\n(?:^|\\.)azerimix\\.com$\n(?:^|\\.)azubu\\.tv$\n(?:^|\\.)b0ne\\.com$\n(?:^|\\.)babynet\\.com\\.hk$\n(?:^|\\.)backchina\\.com$\n(?:^|\\.)backpackers\\.com\\.tw$\n(?:^|\\.)backtotiananmen\\.com$\n(?:^|\\.)badiucao\\.com$\n(?:^|\\.)badjojo\\.com$\n(?:^|\\.)badoo\\.com$\n(?:^|\\.)baidu\\.jp$\n(?:^|\\.)baijie\\.org$\n(?:^|\\.)bailandaily\\.com$\n(?:^|\\.)baixing\\.me$\n(?:^|\\.)bakgeekhome\\.tk$\n(?:^|\\.)banana-vpn\\.com$\n(?:^|\\.)band\\.us$\n(?:^|\\.)bandwagonhost\\.com$\n(?:^|\\.)bangbrosnetwork\\.com$\n(?:^|\\.)bangchen\\.net$\n(?:^|\\.)bangdream\\.space$\n(?:^|\\.)bangyoulater\\.com$\n(?:^|\\.)bankmobilevibe\\.com$\n(?:^|\\.)bannedbook\\.org$\n(?:^|\\.)bannednews\\.org$\n(?:^|\\.)banorte\\.com$\n(?:^|\\.)baramangaonline\\.com$\n(?:^|\\.)barenakedislam\\.com$\n(?:^|\\.)barnabu\\.co\\.uk$\n(?:^|\\.)barton\\.de$\n(?:^|\\.)bartvpn\\.com$\n(?:^|\\.)bash-hackers\\.org$\n(?:^|\\.)bastillepost\\.com$\n(?:^|\\.)bayvoice\\.net$\n(?:^|\\.)bb-chat\\.tv$\n(?:^|\\.)bb\\.ttv\\.com\\.tw$\n(?:^|\\.)bbc\\.co\\.uk$\n(?:^|\\.)bbc\\.com$\n(?:^|\\.)bbc\\.in$\n(?:^|\\.)bbcchinese\\.com$\n(?:^|\\.)bbchat\\.tv$\n(?:^|\\.)bbci\\.co\\.uk$\n(?:^|\\.)bbg\\.gov$\n(?:^|\\.)bbkz\\.com$\n(?:^|\\.)bbnradio\\.org$\n(?:^|\\.)bbs-tw\\.com$\n(?:^|\\.)bbs\\.brockbbs\\.com$\n(?:^|\\.)bbs\\.cantonese\\.asia$\n(?:^|\\.)bbs\\.ecstart\\.com$\n(?:^|\\.)bbs\\.hanminzu\\.org$\n(?:^|\\.)bbs\\.hasi\\.wang$\n(?:^|\\.)bbs\\.huasing\\.org$\n(?:^|\\.)bbs\\.junglobal\\.net$\n(?:^|\\.)bbs\\.kimy\\.com\\.tw$\n(?:^|\\.)bbs\\.mikocon\\.com$\n(?:^|\\.)bbs\\.morbell\\.com$\n(?:^|\\.)bbs\\.mychat\\.to$\n(?:^|\\.)bbs\\.netbig\\.com$\n(?:^|\\.)bbs\\.ozchinese\\.com$\n(?:^|\\.)bbs\\.qmzdd\\.com$\n(?:^|\\.)bbs\\.sina\\.com$\n(?:^|\\.)bbs\\.sina\\.com%2f$\n(?:^|\\.)bbs\\.skykiwi\\.com$\n(?:^|\\.)bbs\\.sou-tong\\.org$\n(?:^|\\.)bbs\\.tuitui\\.info$\n(?:^|\\.)bbsdigest\\.com$\n(?:^|\\.)bbsfeed\\.com$\n(?:^|\\.)bbsland\\.com$\n(?:^|\\.)bbsmo\\.com$\n(?:^|\\.)bbsone\\.com$\n(?:^|\\.)bbtoystore\\.com$\n(?:^|\\.)bcast\\.co\\.nz$\n(?:^|\\.)bcc\\.com\\.tw$\n(?:^|\\.)bcchinese\\.net$\n(?:^|\\.)bcex\\.ca$\n(?:^|\\.)bcmorning\\.com$\n(?:^|\\.)bdsmvideos\\.net$\n(?:^|\\.)beaconevents\\.com$\n(?:^|\\.)bebo\\.com$\n(?:^|\\.)beeg\\.com$\n(?:^|\\.)beevpn\\.com$\n(?:^|\\.)behance\\.net$\n(?:^|\\.)behindkink\\.com$\n(?:^|\\.)beijing1989\\.com$\n(?:^|\\.)beijingspring\\.com$\n(?:^|\\.)beijingzx\\.org$\n(?:^|\\.)belamionline\\.com$\n(?:^|\\.)bell\\.wiki$\n(?:^|\\.)bemywife\\.cc$\n(?:^|\\.)beric\\.me$\n(?:^|\\.)berlintwitterwall\\.com$\n(?:^|\\.)berm\\.co\\.nz$\n(?:^|\\.)bestforchina\\.org$\n(?:^|\\.)bestgore\\.com$\n(?:^|\\.)bestpornstardb\\.com$\n(?:^|\\.)bestvpn\\.com$\n(?:^|\\.)bestvpnanalysis\\.com$\n(?:^|\\.)bestvpnserver\\.com$\n(?:^|\\.)bestvpnservice\\.com$\n(?:^|\\.)bestvpnusa\\.com$\n(?:^|\\.)bet365\\.com$\n(?:^|\\.)betfair\\.com$\n(?:^|\\.)betternet\\.co$\n(?:^|\\.)bettervpn\\.com$\n(?:^|\\.)bettween\\.com$\n(?:^|\\.)betvictor\\.com$\n(?:^|\\.)bewww\\.net$\n(?:^|\\.)beyondfirewall\\.com$\n(?:^|\\.)bfnn\\.org$\n(?:^|\\.)bfsh\\.hk$\n(?:^|\\.)bgvpn\\.com$\n(?:^|\\.)bianlei\\.com$\n(?:^|\\.)biantailajiao\\.com$\n(?:^|\\.)biantailajiao\\.in$\n(?:^|\\.)biblesforamerica\\.org$\n(?:^|\\.)bibox\\.com$\n(?:^|\\.)bic2011\\.org$\n(?:^|\\.)big\\.one$\n(?:^|\\.)bigfools\\.com$\n(?:^|\\.)bigjapanesesex\\.com$\n(?:^|\\.)bigmoney\\.biz$\n(?:^|\\.)bignews\\.org$\n(?:^|\\.)bigsound\\.org$\n(?:^|\\.)biliworld\\.com$\n(?:^|\\.)billypan\\.com$\n(?:^|\\.)binance\\.com$\n(?:^|\\.)binux\\.me$\n(?:^|\\.)bipic\\.net$\n(?:^|\\.)bird\\.so$\n(?:^|\\.)bit-z\\.com$\n(?:^|\\.)bit\\.do$\n(?:^|\\.)bit\\.ly$\n(?:^|\\.)bitc\\.bme\\.emory\\.edu$\n(?:^|\\.)bitcointalk\\.org$\n(?:^|\\.)bitcoinworld\\.com$\n(?:^|\\.)bitfinex\\.com$\n(?:^|\\.)bithumb\\.com$\n(?:^|\\.)bitinka\\.com\\.ar$\n(?:^|\\.)bitmex\\.com$\n(?:^|\\.)bitshare\\.com$\n(?:^|\\.)bitsnoop\\.com$\n(?:^|\\.)bitvise\\.com$\n(?:^|\\.)bizhat\\.com$\n(?:^|\\.)bjnewlife\\.org$\n(?:^|\\.)bjs\\.org$\n(?:^|\\.)bjzc\\.org$\n(?:^|\\.)bl-doujinsouko\\.com$\n(?:^|\\.)blacklogic\\.com$\n(?:^|\\.)blackvpn\\.com$\n(?:^|\\.)blewpass\\.com$\n(?:^|\\.)blinkx\\.com$\n(?:^|\\.)blinw\\.com$\n(?:^|\\.)blip\\.tv$\n(?:^|\\.)blockcn\\.com$\n(?:^|\\.)blockless\\.com$\n(?:^|\\.)blog\\.calibre-ebook\\.com$\n(?:^|\\.)blog\\.cnyes\\.com$\n(?:^|\\.)blog\\.daum\\.net$\n(?:^|\\.)blog\\.de$\n(?:^|\\.)blog\\.exblog\\.co\\.jp$\n(?:^|\\.)blog\\.excite\\.co\\.jp$\n(?:^|\\.)blog\\.expofutures\\.com$\n(?:^|\\.)blog\\.fizzik\\.com$\n(?:^|\\.)blog\\.foolsmountain\\.com$\n(?:^|\\.)blog\\.fuckgfw233\\.org$\n(?:^|\\.)blog\\.goo\\.ne\\.jp$\n(?:^|\\.)blog\\.google$\n(?:^|\\.)blog\\.inoreader\\.com$\n(?:^|\\.)blog\\.istef\\.info$\n(?:^|\\.)blog\\.jackjia\\.com$\n(?:^|\\.)blog\\.jp$\n(?:^|\\.)blog\\.kangye\\.org$\n(?:^|\\.)blog\\.lester850\\.info$\n(?:^|\\.)blog\\.martinoei\\.com$\n(?:^|\\.)blog\\.pathtosharepoint\\.com$\n(?:^|\\.)blog\\.pentalogic\\.net$\n(?:^|\\.)blog\\.qooza\\.hk$\n(?:^|\\.)blog\\.ranxiang\\.com$\n(?:^|\\.)blog\\.sina\\.com\\.tw$\n(?:^|\\.)blog\\.sogoo\\.org$\n(?:^|\\.)blog\\.soylent\\.com$\n(?:^|\\.)blog\\.syx86\\.cn$\n(?:^|\\.)blog\\.syx86\\.com$\n(?:^|\\.)blog\\.taragana\\.com$\n(?:^|\\.)blog\\.tiney\\.com$\n(?:^|\\.)blog\\.workflow\\.is$\n(?:^|\\.)blog\\.xuite\\.net$\n(?:^|\\.)blog\\.youthwant\\.com\\.tw$\n(?:^|\\.)blog\\.youxu\\.info$\n(?:^|\\.)blogblog\\.com$\n(?:^|\\.)blogcatalog\\.com$\n(?:^|\\.)blogcity\\.me$\n(?:^|\\.)blogdns\\.org$\n(?:^|\\.)blogger\\.com$\n(?:^|\\.)blogimg\\.jp$\n(?:^|\\.)bloglines\\.com$\n(?:^|\\.)bloglovin\\.com$\n(?:^|\\.)blogs\\.icerocket\\.com$\n(?:^|\\.)blogs\\.libraryinformationtechnology\\.com$\n(?:^|\\.)blogs\\.tampabay\\.com$\n(?:^|\\.)blogs\\.yahoo\\.co\\.jp$\n(?:^|\\.)blogspot(\\.[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?){1,2}$\n(?:^|\\.)blogtd\\.net$\n(?:^|\\.)blogtd\\.org$\n(?:^|\\.)bloodshed\\.net$\n(?:^|\\.)bloomberg\\.cn$\n(?:^|\\.)bloomberg\\.com$\n(?:^|\\.)bloomberg\\.de$\n(?:^|\\.)bloombergview\\.com$\n(?:^|\\.)bloomfortune\\.com$\n(?:^|\\.)blueangellive\\.com$\n(?:^|\\.)bmfinn\\.com$\n(?:^|\\.)bnews\\.co$\n(?:^|\\.)bnn\\.co$\n(?:^|\\.)bnrmetal\\.com$\n(?:^|\\.)boardreader\\.com$\n(?:^|\\.)bod\\.asia$\n(?:^|\\.)bodog88\\.com$\n(?:^|\\.)bolehvpn\\.net$\n(?:^|\\.)bolin\\.netfirms\\.com$\n(?:^|\\.)bonbonme\\.com$\n(?:^|\\.)bonbonsex\\.com$\n(?:^|\\.)bonfoundation\\.org$\n(?:^|\\.)bongacams\\.com$\n(?:^|\\.)boobstagram\\.com$\n(?:^|\\.)book\\.com\\.tw$\n(?:^|\\.)book\\.zi5\\.me$\n(?:^|\\.)bookepub\\.com$\n(?:^|\\.)books\\.com\\.tw$\n(?:^|\\.)booktopia\\.com\\.au$\n(?:^|\\.)boomssr\\.com$\n(?:^|\\.)bot\\.nu$\n(?:^|\\.)botanwang\\.com$\n(?:^|\\.)bowenpress\\.com$\n(?:^|\\.)boxpn\\.com$\n(?:^|\\.)boxun$\n(?:^|\\.)boxun\\.com$\n(?:^|\\.)boxun\\.tv$\n(?:^|\\.)boxunblog\\.com$\n(?:^|\\.)boxunclub\\.com$\n(?:^|\\.)boyangu\\.com$\n(?:^|\\.)boyfriendtv\\.com$\n(?:^|\\.)boysfood\\.com$\n(?:^|\\.)boysmaster\\.com$\n(?:^|\\.)br\\.hao123\\.com$\n(?:^|\\.)br\\.st$\n(?:^|\\.)brainyquote\\.com$\n(?:^|\\.)brandonhutchinson\\.com$\n(?:^|\\.)braumeister\\.org$\n(?:^|\\.)bravotube\\.net$\n(?:^|\\.)brazzers\\.com$\n(?:^|\\.)break\\.com$\n(?:^|\\.)breakgfw\\.com$\n(?:^|\\.)breaking911\\.com$\n(?:^|\\.)breakingtweets\\.com$\n(?:^|\\.)breakwall\\.net$\n(?:^|\\.)briefdream\\.com$\n(?:^|\\.)briian\\.com$\n(?:^|\\.)brizzly\\.com$\n(?:^|\\.)brkmd\\.com$\n(?:^|\\.)broadbook\\.com$\n(?:^|\\.)broadpressinc\\.com$\n(?:^|\\.)brucewang\\.net$\n(?:^|\\.)brutaltgp\\.com$\n(?:^|\\.)bt2mag\\.com$\n(?:^|\\.)bt95\\.com$\n(?:^|\\.)btaia\\.com$\n(?:^|\\.)btbtav\\.com$\n(?:^|\\.)btc98\\.com$\n(?:^|\\.)btcbank\\.bank$\n(?:^|\\.)btctrade\\.im$\n(?:^|\\.)btdigg\\.org$\n(?:^|\\.)btku\\.me$\n(?:^|\\.)btku\\.org$\n(?:^|\\.)btspread\\.com$\n(?:^|\\.)btsynckeys\\.com$\n(?:^|\\.)budaedu\\.org$\n(?:^|\\.)buddhanet\\.com\\.tw$\n(?:^|\\.)buddhistchannel\\.tv$\n(?:^|\\.)buffered\\.com$\n(?:^|\\.)bullog\\.org$\n(?:^|\\.)bullogger\\.com$\n(?:^|\\.)bunbunhk\\.com$\n(?:^|\\.)busayari\\.com$\n(?:^|\\.)businessinsider\\.com$\n(?:^|\\.)businesstoday\\.com\\.tw$\n(?:^|\\.)businessweek\\.com$\n(?:^|\\.)busu\\.org$\n(?:^|\\.)busytrade\\.com$\n(?:^|\\.)buugaa\\.com$\n(?:^|\\.)buy\\.yahoo\\.com\\.tw$\n(?:^|\\.)buzzhand\\.com$\n(?:^|\\.)buzzhand\\.net$\n(?:^|\\.)buzzorange\\.com$\n(?:^|\\.)bvpn\\.com$\n(?:^|\\.)bwgyhw\\.com$\n(?:^|\\.)bwh1\\.net$\n(?:^|\\.)bwsj\\.hk$\n(?:^|\\.)bx\\.in\\.th$\n(?:^|\\.)bx\\.tl$\n(?:^|\\.)bynet\\.co\\.il$\n(?:^|\\.)c-est-simple\\.com$\n(?:^|\\.)c-spanvideo\\.org$\n(?:^|\\.)c100tibet\\.org$\n(?:^|\\.)c1522\\.mooo\\.com$\n(?:^|\\.)c2cx\\.com$\n(?:^|\\.)cablegatesearch\\.net$\n(?:^|\\.)cachinese\\.com$\n(?:^|\\.)cacnw\\.com$\n(?:^|\\.)cactusvpn\\.com$\n(?:^|\\.)cafepress\\.com$\n(?:^|\\.)cahr\\.org\\.tw$\n(?:^|\\.)calameo\\.com$\n(?:^|\\.)calebelston\\.com$\n(?:^|\\.)calgarychinese\\.ca$\n(?:^|\\.)calgarychinese\\.com$\n(?:^|\\.)calgarychinese\\.net$\n(?:^|\\.)cam4\\.com$\n(?:^|\\.)cam4\\.jp$\n(?:^|\\.)cam4\\.sg$\n(?:^|\\.)camfrog\\.com$\n(?:^|\\.)cams\\.com$\n(?:^|\\.)cams\\.org\\.sg$\n(?:^|\\.)canadameet\\.com$\n(?:^|\\.)canalporno\\.com$\n(?:^|\\.)canyu\\.org$\n(?:^|\\.)cao\\.im$\n(?:^|\\.)caobian\\.info$\n(?:^|\\.)caochangqing\\.com$\n(?:^|\\.)cap\\.org\\.hk$\n(?:^|\\.)carabinasypistolas\\.com$\n(?:^|\\.)cardinalkungfoundation\\.org$\n(?:^|\\.)carfax\\.com$\n(?:^|\\.)cari\\.com\\.my$\n(?:^|\\.)caribbeancom\\.com$\n(?:^|\\.)carmotorshow\\.com$\n(?:^|\\.)cartoonmovement\\.com$\n(?:^|\\.)casadeltibetbcn\\.org$\n(?:^|\\.)casatibet\\.org\\.mx$\n(?:^|\\.)casino\\.williamhill\\.com$\n(?:^|\\.)casinobellini\\.com$\n(?:^|\\.)casinoking\\.com$\n(?:^|\\.)casinoriva\\.com$\n(?:^|\\.)castbox\\.fm$\n(?:^|\\.)catch22\\.net$\n(?:^|\\.)catchgod\\.com$\n(?:^|\\.)catfightpayperview\\.xxx$\n(?:^|\\.)catholic\\.org\\.hk$\n(?:^|\\.)catholic\\.org\\.tw$\n(?:^|\\.)cathvoice\\.org\\.tw$\n(?:^|\\.)cattt\\.com$\n(?:^|\\.)cbc\\.ca$\n(?:^|\\.)cbs\\.ntu\\.edu\\.tw$\n(?:^|\\.)cbsnews\\.com$\n(?:^|\\.)cbtc\\.org\\.hk$\n(?:^|\\.)cccat\\.cc$\n(?:^|\\.)cccat\\.co$\n(?:^|\\.)ccdtr\\.org$\n(?:^|\\.)cchere\\.com$\n(?:^|\\.)ccim\\.org$\n(?:^|\\.)cclife\\.ca$\n(?:^|\\.)cclife\\.org$\n(?:^|\\.)cclifefl\\.org$\n(?:^|\\.)ccthere\\.com$\n(?:^|\\.)ccthere\\.net$\n(?:^|\\.)cctmweb\\.net$\n(?:^|\\.)cctongbao\\.com$\n(?:^|\\.)ccue\\.ca$\n(?:^|\\.)ccue\\.com$\n(?:^|\\.)ccvoice\\.ca$\n(?:^|\\.)ccw\\.org\\.tw$\n(?:^|\\.)cdbook\\.org$\n(?:^|\\.)cdcparty\\.com$\n(?:^|\\.)cdef\\.org$\n(?:^|\\.)cdig\\.info$\n(?:^|\\.)cdjp\\.org$\n(?:^|\\.)cdn$\n(?:^|\\.)cdn-apple\\.com$\n(?:^|\\.)cdn-images\\.mailchimp\\.com$\n(?:^|\\.)cdn\\.assets\\.lfpcontent\\.com$\n(?:^|\\.)cdn\\.helixstudios\\.net$\n(?:^|\\.)cdn\\.printfriendly\\.com$\n(?:^|\\.)cdn\\.seatguru\\.com$\n(?:^|\\.)cdn\\.softlayer\\.net$\n(?:^|\\.)cdn1\\.lp\\.saboom\\.com$\n(?:^|\\.)cdnews\\.com\\.tw$\n(?:^|\\.)cdninstagram\\.com$\n(?:^|\\.)cdp1989\\.org$\n(?:^|\\.)cdp1998\\.org$\n(?:^|\\.)cdp2006\\.org$\n(?:^|\\.)cdpa\\.url\\.tw$\n(?:^|\\.)cdpeu\\.org$\n(?:^|\\.)cdpusa\\.org$\n(?:^|\\.)cdpweb\\.org$\n(?:^|\\.)cdpwu\\.org$\n(?:^|\\.)cdw\\.com$\n(?:^|\\.)cecc\\.gov$\n(?:^|\\.)cellulo\\.info$\n(?:^|\\.)cenews\\.eu$\n(?:^|\\.)centauro\\.com\\.br$\n(?:^|\\.)centerforhumanreprod\\.com$\n(?:^|\\.)centralnation\\.com$\n(?:^|\\.)centurys\\.net$\n(?:^|\\.)certificate-transparency\\.org$\n(?:^|\\.)certificate\\.revocationcheck\\.com$\n(?:^|\\.)cfhks\\.org\\.hk$\n(?:^|\\.)cfos\\.de$\n(?:^|\\.)cftfc\\.com$\n(?:^|\\.)cgdepot\\.org$\n(?:^|\\.)cgst\\.edu$\n(?:^|\\.)ch\\.shvoong\\.com$\n(?:^|\\.)change\\.org$\n(?:^|\\.)changeip\\.name$\n(?:^|\\.)changeip\\.net$\n(?:^|\\.)changeip\\.org$\n(?:^|\\.)changp\\.com$\n(?:^|\\.)changsa\\.net$\n(?:^|\\.)channel8news\\.sg$\n(?:^|\\.)chaoex\\.com$\n(?:^|\\.)chapm25\\.com$\n(?:^|\\.)chatnook\\.com$\n(?:^|\\.)chaturbate\\.com$\n(?:^|\\.)chengmingmag\\.com$\n(?:^|\\.)chenguangcheng\\.com$\n(?:^|\\.)chenpokong\\.com$\n(?:^|\\.)chenpokong\\.net$\n(?:^|\\.)chenshan20042005\\.wordpress\\.com$\n(?:^|\\.)cherrysave\\.com$\n(?:^|\\.)chhongbi\\.org$\n(?:^|\\.)chicagoncmtv\\.com$\n(?:^|\\.)china-mmm\\.jp\\.net$\n(?:^|\\.)china-mmm\\.net$\n(?:^|\\.)china-mmm\\.sa\\.com$\n(?:^|\\.)china-review\\.com\\.ua$\n(?:^|\\.)china-week\\.com$\n(?:^|\\.)china\\.hket\\.com$\n(?:^|\\.)china\\.ucanews\\.com$\n(?:^|\\.)china101\\.com$\n(?:^|\\.)china18\\.org$\n(?:^|\\.)china21\\.com$\n(?:^|\\.)china21\\.org$\n(?:^|\\.)china5000\\.us$\n(?:^|\\.)chinaaffairs\\.org$\n(?:^|\\.)chinaaid\\.me$\n(?:^|\\.)chinaaid\\.net$\n(?:^|\\.)chinaaid\\.org$\n(?:^|\\.)chinaaid\\.us$\n(?:^|\\.)chinachange\\.org$\n(?:^|\\.)chinachannel\\.hk$\n(?:^|\\.)chinacitynews\\.be$\n(?:^|\\.)chinacomments\\.org$\n(?:^|\\.)chinadialogue\\.net$\n(?:^|\\.)chinadigitaltimes\\.net$\n(?:^|\\.)chinaelections\\.org$\n(?:^|\\.)chinaeweekly\\.com$\n(?:^|\\.)chinafreepress\\.org$\n(?:^|\\.)chinagate\\.com$\n(?:^|\\.)chinageeks\\.org$\n(?:^|\\.)chinagfw\\.org$\n(?:^|\\.)chinagonet\\.com$\n(?:^|\\.)chinagreenparty\\.org$\n(?:^|\\.)chinahorizon\\.org$\n(?:^|\\.)chinahush\\.com$\n(?:^|\\.)chinainperspective\\.com$\n(?:^|\\.)chinainterimgov\\.org$\n(?:^|\\.)chinalaborwatch\\.org$\n(?:^|\\.)chinalawandpolicy\\.com$\n(?:^|\\.)chinalawtranslate\\.com$\n(?:^|\\.)chinamule\\.com$\n(?:^|\\.)chinamz\\.org$\n(?:^|\\.)chinanewscenter\\.com$\n(?:^|\\.)chinapost\\.com\\.tw$\n(?:^|\\.)chinapress\\.com\\.my$\n(?:^|\\.)chinarightsia\\.org$\n(?:^|\\.)chinasmile\\.net$\n(?:^|\\.)chinasocialdemocraticparty\\.com$\n(?:^|\\.)chinasoul\\.org$\n(?:^|\\.)chinasucks\\.net$\n(?:^|\\.)chinatimes\\.com$\n(?:^|\\.)chinatopsex\\.com$\n(?:^|\\.)chinatown\\.com\\.au$\n(?:^|\\.)chinatweeps\\.com$\n(?:^|\\.)chinaview\\.wordpress\\.com$\n(?:^|\\.)chinaway\\.org$\n(?:^|\\.)chinaworker\\.info$\n(?:^|\\.)chinaxchina\\.com$\n(?:^|\\.)chinayouth\\.org\\.hk$\n(?:^|\\.)chinayuanmin\\.org$\n(?:^|\\.)chinese-hermit\\.net$\n(?:^|\\.)chinese-leaders\\.org$\n(?:^|\\.)chinese-memorial\\.org$\n(?:^|\\.)chinese\\.donga\\.com$\n(?:^|\\.)chinese\\.engadget\\.com$\n(?:^|\\.)chinese\\.irib\\.ir$\n(?:^|\\.)chinese\\.soifind\\.com$\n(?:^|\\.)chinesedaily\\.com$\n(?:^|\\.)chinesedailynews\\.com$\n(?:^|\\.)chinesedemocracy\\.com$\n(?:^|\\.)chinesegay\\.org$\n(?:^|\\.)chinesen\\.de$\n(?:^|\\.)chinesenews\\.net\\.au$\n(?:^|\\.)chinesepen\\.org$\n(?:^|\\.)chinesetalks\\.net$\n(?:^|\\.)chineseupress\\.com$\n(?:^|\\.)chingcheong\\.com$\n(?:^|\\.)chinman\\.net$\n(?:^|\\.)chithu\\.org$\n(?:^|\\.)chn\\.chosun\\.com$\n(?:^|\\.)chobit\\.cc$\n(?:^|\\.)chrdnet\\.com$\n(?:^|\\.)christianfreedom\\.org$\n(?:^|\\.)christianstudy\\.com$\n(?:^|\\.)christiantimes\\.org\\.hk$\n(?:^|\\.)christusrex\\.org$\n(?:^|\\.)chrlawyers\\.hk$\n(?:^|\\.)chrome\\.com$\n(?:^|\\.)chromecast\\.com$\n(?:^|\\.)chromeexperiments\\.com$\n(?:^|\\.)chromercise\\.com$\n(?:^|\\.)chromestatus\\.com$\n(?:^|\\.)chromium\\.org$\n(?:^|\\.)chuang-yen\\.org$\n(?:^|\\.)chubold\\.com$\n(?:^|\\.)chubun\\.com$\n(?:^|\\.)chuizi\\.net$\n(?:^|\\.)churchinhongkong\\.org$\n(?:^|\\.)chushigangdrug\\.ch$\n(?:^|\\.)cienen\\.com$\n(?:^|\\.)cineastentreff\\.de$\n(?:^|\\.)cipfg\\.org$\n(?:^|\\.)circlethebayfortibet\\.org$\n(?:^|\\.)cirosantilli\\.com$\n(?:^|\\.)citizencn\\.com$\n(?:^|\\.)citizenlab\\.org$\n(?:^|\\.)citizenscommission\\.hk$\n(?:^|\\.)citizensradio\\.org$\n(?:^|\\.)city365\\.ca$\n(?:^|\\.)city9x\\.com$\n(?:^|\\.)citypopulation\\.de$\n(?:^|\\.)citytalk\\.tw$\n(?:^|\\.)civicparty\\.hk$\n(?:^|\\.)civildisobediencemovement\\.org$\n(?:^|\\.)civilhrfront\\.org$\n(?:^|\\.)civiliangunner\\.com$\n(?:^|\\.)civilmedia\\.tw$\n(?:^|\\.)ck101\\.com$\n(?:^|\\.)cl\\.d0z\\.net$\n(?:^|\\.)clarionproject\\.org$\n(?:^|\\.)classicalguitarblog\\.net$\n(?:^|\\.)clb\\.org\\.hk$\n(?:^|\\.)cldr\\.unicode\\.org$\n(?:^|\\.)cleansite\\.biz$\n(?:^|\\.)cleansite\\.info$\n(?:^|\\.)cleansite\\.us$\n(?:^|\\.)clearharmony\\.net$\n(?:^|\\.)clearsurance\\.com$\n(?:^|\\.)clearwisdom\\.net$\n(?:^|\\.)clementine-player\\.org$\n(?:^|\\.)cling\\.omy\\.sg$\n(?:^|\\.)clinica-tibet\\.ru$\n(?:^|\\.)clipfish\\.de$\n(?:^|\\.)cloakpoint\\.com$\n(?:^|\\.)cloud\\.feedly\\.com$\n(?:^|\\.)cloud\\.mail\\.ru$\n(?:^|\\.)club1069\\.com$\n(?:^|\\.)clyp\\.it$\n(?:^|\\.)cmcn\\.org$\n(?:^|\\.)cmi\\.org\\.tw$\n(?:^|\\.)cmp\\.hku\\.hk$\n(?:^|\\.)cms\\.gov$\n(?:^|\\.)cmule\\.com$\n(?:^|\\.)cmule\\.org$\n(?:^|\\.)cmx\\.im$\n(?:^|\\.)cn-proxy\\.com$\n(?:^|\\.)cn\\.calameo\\.com$\n(?:^|\\.)cn\\.dayabook\\.com$\n(?:^|\\.)cn\\.fmnnow\\.com$\n(?:^|\\.)cn\\.freeones\\.com$\n(?:^|\\.)cn\\.giganews\\.com$\n(?:^|\\.)cn\\.ibtimes\\.com$\n(?:^|\\.)cn\\.nytstyle\\.com$\n(?:^|\\.)cn\\.sandscotaicentral\\.com$\n(?:^|\\.)cn\\.shafaqna\\.com$\n(?:^|\\.)cn\\.streetvoice\\.com$\n(?:^|\\.)cn\\.thegay\\.com$\n(?:^|\\.)cn\\.uncyclopedia\\.wikia\\.com$\n(?:^|\\.)cn\\.uptodown\\.com$\n(?:^|\\.)cn\\.voa\\.mobi$\n(?:^|\\.)cn2\\.streetvoice\\.com$\n(?:^|\\.)cn6\\.eu$\n(?:^|\\.)cna\\.com\\.tw$\n(?:^|\\.)cnabc\\.com$\n(?:^|\\.)cnbbnews\\.wordpress\\.com$\n(?:^|\\.)cnd\\.org$\n(?:^|\\.)cnex\\.org\\.cn$\n(?:^|\\.)cnineu\\.com$\n(?:^|\\.)cnn\\.com$\n(?:^|\\.)cnnews\\.chosun\\.com$\n(?:^|\\.)cnpolitics\\.org$\n(?:^|\\.)cnproxy\\.com$\n(?:^|\\.)co\\.ng\\.mil$\n(?:^|\\.)coat\\.co\\.jp$\n(?:^|\\.)cobinhood\\.com$\n(?:^|\\.)cochina\\.co$\n(?:^|\\.)cochina\\.org$\n(?:^|\\.)code1984\\.com$\n(?:^|\\.)codeshare\\.io$\n(?:^|\\.)codeskulptor\\.org$\n(?:^|\\.)coin2co\\.in$\n(?:^|\\.)coinbene\\.com$\n(?:^|\\.)coinegg\\.com$\n(?:^|\\.)coinex\\.com$\n(?:^|\\.)coingi\\.com$\n(?:^|\\.)coinrail\\.co\\.kr$\n(?:^|\\.)cointiger\\.com$\n(?:^|\\.)cointobe\\.com$\n(?:^|\\.)coinut\\.com$\n(?:^|\\.)collateralmurder\\.com$\n(?:^|\\.)collateralmurder\\.org$\n(?:^|\\.)com\\.google$\n(?:^|\\.)comefromchina\\.com$\n(?:^|\\.)comic-mega\\.me$\n(?:^|\\.)commandarms\\.com$\n(?:^|\\.)commentshk\\.com$\n(?:^|\\.)communistcrimes\\.org$\n(?:^|\\.)community\\.windy\\.com$\n(?:^|\\.)communitychoicecu\\.com$\n(?:^|\\.)compileheart\\.com$\n(?:^|\\.)compress\\.to$\n(?:^|\\.)connect\\.facebook\\.net$\n(?:^|\\.)conoha\\.jp$\n(?:^|\\.)contactmagazine\\.net$\n(?:^|\\.)contests\\.twilio\\.com$\n(?:^|\\.)convio\\.net$\n(?:^|\\.)coobay\\.com$\n(?:^|\\.)coolaler\\.com$\n(?:^|\\.)coolder\\.com$\n(?:^|\\.)coolloud\\.org\\.tw$\n(?:^|\\.)coolncute\\.com$\n(?:^|\\.)coolstuffinc\\.com$\n(?:^|\\.)corumcollege\\.com$\n(?:^|\\.)cos-moe\\.com$\n(?:^|\\.)cosmic\\.monar\\.ch$\n(?:^|\\.)cosplayjav\\.pl$\n(?:^|\\.)costco\\.com$\n(?:^|\\.)cotweet\\.com$\n(?:^|\\.)counter\\.social$\n(?:^|\\.)coursehero\\.com$\n(?:^|\\.)cpj\\.org$\n(?:^|\\.)cq99\\.us$\n(?:^|\\.)crackle\\.com$\n(?:^|\\.)crazys\\.cc$\n(?:^|\\.)crazyshit\\.com$\n(?:^|\\.)crbug\\.com$\n(?:^|\\.)crchina\\.org$\n(?:^|\\.)crd-net\\.org$\n(?:^|\\.)creaders\\.net$\n(?:^|\\.)creadersnet\\.com$\n(?:^|\\.)creativelab5\\.com$\n(?:^|\\.)crisisresponse\\.google$\n(?:^|\\.)cristyli\\.com$\n(?:^|\\.)crocotube\\.com$\n(?:^|\\.)crossfire\\.co\\.kr$\n(?:^|\\.)crossthewall\\.net$\n(?:^|\\.)crossvpn\\.net$\n(?:^|\\.)crrev\\.com$\n(?:^|\\.)crucial\\.com$\n(?:^|\\.)csdparty\\.com$\n(?:^|\\.)css\\.pixnet\\.in$\n(?:^|\\.)csuchen\\.de$\n(?:^|\\.)csw\\.org\\.uk$\n(?:^|\\.)ct\\.org\\.tw$\n(?:^|\\.)ctao\\.org$\n(?:^|\\.)ctfriend\\.net$\n(?:^|\\.)cthlo\\.github\\.io$\n(?:^|\\.)ctitv\\.com\\.tw$\n(?:^|\\.)cts\\.com\\.tw$\n(?:^|\\.)cuhkacs\\.org$\n(?:^|\\.)cuihua\\.org$\n(?:^|\\.)cuiweiping\\.net$\n(?:^|\\.)culture\\.tw$\n(?:^|\\.)cumlouder\\.com$\n(?:^|\\.)curvefish\\.com$\n(?:^|\\.)cusu\\.hk$\n(?:^|\\.)cutscenes\\.net$\n(?:^|\\.)cw\\.com\\.tw$\n(?:^|\\.)cyberghost\\.natado\\.com$\n(?:^|\\.)cyberghostvpn\\.com$\n(?:^|\\.)cynscribe\\.com$\n(?:^|\\.)cytode\\.us$\n(?:^|\\.)d-fukyu\\.com$\n(?:^|\\.)d100\\.net$\n(?:^|\\.)d1b183sg0nvnuh\\.cloudfront\\.net$\n(?:^|\\.)d1c37gjwa26taa\\.cloudfront\\.net$\n(?:^|\\.)d2bay\\.com$\n(?:^|\\.)d2pass\\.com$\n(?:^|\\.)d3c33hcgiwev3\\.cloudfront\\.net$\n(?:^|\\.)d3rhr7kgmtrq1v\\.cloudfront\\.net$\n(?:^|\\.)dabr\\.co\\.uk$\n(?:^|\\.)dabr\\.eu$\n(?:^|\\.)dabr\\.me$\n(?:^|\\.)dabr\\.mobi$\n(?:^|\\.)dadazim\\.com$\n(?:^|\\.)dadi360\\.com$\n(?:^|\\.)dafabet\\.com$\n(?:^|\\.)dafagood\\.com$\n(?:^|\\.)dafahao\\.com$\n(?:^|\\.)dafoh\\.org$\n(?:^|\\.)daftporn\\.com$\n(?:^|\\.)dagelijksestandaard\\.nl$\n(?:^|\\.)daidostup\\.ru$\n(?:^|\\.)dailidaili\\.com$\n(?:^|\\.)dailymotion\\.com$\n(?:^|\\.)dailynews\\.sina\\.com$\n(?:^|\\.)dailynews\\.sina\\.com%2f$\n(?:^|\\.)dailyview\\.tw$\n(?:^|\\.)daiphapinfo\\.net$\n(?:^|\\.)dajiyuan\\.com$\n(?:^|\\.)dajiyuan\\.de$\n(?:^|\\.)dajiyuan\\.eu$\n(?:^|\\.)dajusha\\.baywords\\.com$\n(?:^|\\.)dalailama-archives\\.org$\n(?:^|\\.)dalailama\\.com$\n(?:^|\\.)dalailama\\.mn$\n(?:^|\\.)dalailama\\.ru$\n(?:^|\\.)dalailama\\.usc\\.edu$\n(?:^|\\.)dalailama80\\.org$\n(?:^|\\.)dalailamacenter\\.org$\n(?:^|\\.)dalailamafellows\\.org$\n(?:^|\\.)dalailamafilm\\.com$\n(?:^|\\.)dalailamafoundation\\.org$\n(?:^|\\.)dalailamahindi\\.com$\n(?:^|\\.)dalailamainaustralia\\.org$\n(?:^|\\.)dalailamajapanese\\.com$\n(?:^|\\.)dalailamaprotesters\\.info$\n(?:^|\\.)dalailamaquotes\\.org$\n(?:^|\\.)dalailamatrust\\.org$\n(?:^|\\.)dalailamavisit\\.org\\.nz$\n(?:^|\\.)dalailamaworld\\.com$\n(?:^|\\.)dalianmeng\\.org$\n(?:^|\\.)daliulian\\.org$\n(?:^|\\.)danbooru\\.donmai\\.us$\n(?:^|\\.)danke4china\\.net$\n(?:^|\\.)danwei\\.org$\n(?:^|\\.)daodu14\\.jigsy\\.com$\n(?:^|\\.)daolan\\.net$\n(?:^|\\.)daozhongxing\\.org$\n(?:^|\\.)darktech\\.org$\n(?:^|\\.)darktoy\\.net$\n(?:^|\\.)darpa\\.mil$\n(?:^|\\.)dastrassi\\.org$\n(?:^|\\.)data-vocabulary\\.org$\n(?:^|\\.)data\\.flurry\\.com$\n(?:^|\\.)data\\.gov\\.tw$\n(?:^|\\.)daum\\.net$\n(?:^|\\.)david-kilgour\\.com$\n(?:^|\\.)dawangidc\\.com$\n(?:^|\\.)daxa\\.cn$\n(?:^|\\.)daylife\\.com$\n(?:^|\\.)db\\.tt$\n(?:^|\\.)dbc\\.hk$\n(?:^|\\.)dcard\\.tw$\n(?:^|\\.)dcmilitary\\.com$\n(?:^|\\.)ddc\\.com\\.tw$\n(?:^|\\.)ddhw\\.info$\n(?:^|\\.)ddns\\.info$\n(?:^|\\.)ddns\\.me\\.uk$\n(?:^|\\.)ddns\\.mobi$\n(?:^|\\.)ddns\\.ms$\n(?:^|\\.)ddns\\.name$\n(?:^|\\.)ddns\\.net$\n(?:^|\\.)ddns\\.us$\n(?:^|\\.)de-sci\\.org$\n(?:^|\\.)deaftone\\.com$\n(?:^|\\.)debug\\.com$\n(?:^|\\.)deck\\.ly$\n(?:^|\\.)decodet\\.co$\n(?:^|\\.)deepmind\\.com$\n(?:^|\\.)deezer\\.com$\n(?:^|\\.)definebabe\\.com$\n(?:^|\\.)deja\\.com$\n(?:^|\\.)delcamp\\.net$\n(?:^|\\.)delicious\\.com$\n(?:^|\\.)demo\\.opera-mini\\.net$\n(?:^|\\.)democrats\\.org$\n(?:^|\\.)depositphotos\\.com$\n(?:^|\\.)derekhsu\\.homeip\\.net$\n(?:^|\\.)desc\\.se$\n(?:^|\\.)design\\.google$\n(?:^|\\.)desipro\\.de$\n(?:^|\\.)dessci\\.com$\n(?:^|\\.)destiny\\.xfiles\\.to$\n(?:^|\\.)destroy-china\\.jp$\n(?:^|\\.)deutsche-welle\\.de$\n(?:^|\\.)developers\\.box\\.net$\n(?:^|\\.)devio\\.us$\n(?:^|\\.)devpn\\.com$\n(?:^|\\.)dfas\\.mil$\n(?:^|\\.)dfn\\.org$\n(?:^|\\.)dharamsalanet\\.com$\n(?:^|\\.)dharmakara\\.net$\n(?:^|\\.)dhcp\\.biz$\n(?:^|\\.)diaoyuislands\\.org$\n(?:^|\\.)dictionary\\.goo\\.ne\\.jp$\n(?:^|\\.)difangwenge\\.org$\n(?:^|\\.)digiland\\.tw$\n(?:^|\\.)digisfera\\.com$\n(?:^|\\.)digitalnomadsproject\\.org$\n(?:^|\\.)diigo\\.com$\n(?:^|\\.)dilber\\.se$\n(?:^|\\.)dingchin\\.com\\.tw$\n(?:^|\\.)dipity\\.com$\n(?:^|\\.)directcreative\\.com$\n(?:^|\\.)discoins\\.com$\n(?:^|\\.)disconnect\\.me$\n(?:^|\\.)discordapp\\.com$\n(?:^|\\.)discordapp\\.net$\n(?:^|\\.)discuss\\.com\\.hk$\n(?:^|\\.)discuss4u\\.com$\n(?:^|\\.)dish\\.com$\n(?:^|\\.)disp\\.cc$\n(?:^|\\.)disqus\\.com$\n(?:^|\\.)dit-inc\\.us$\n(?:^|\\.)dizhidizhi\\.com$\n(?:^|\\.)dizhuzhishang\\.com$\n(?:^|\\.)djangosnippets\\.org$\n(?:^|\\.)djorz\\.com$\n(?:^|\\.)dl-laby\\.jp$\n(?:^|\\.)dl\\.box\\.net$\n(?:^|\\.)dlsite\\.com$\n(?:^|\\.)dlyoutube\\.com$\n(?:^|\\.)dm530\\.net$\n(?:^|\\.)dmcdn\\.net$\n(?:^|\\.)dmm\\.co\\.jp$\n(?:^|\\.)dns-dns\\.com$\n(?:^|\\.)dns-stuff\\.com$\n(?:^|\\.)dns\\.google$\n(?:^|\\.)dns04\\.com$\n(?:^|\\.)dns05\\.com$\n(?:^|\\.)dns1\\.us$\n(?:^|\\.)dns2\\.us$\n(?:^|\\.)dns2go\\.com$\n(?:^|\\.)dnscrypt\\.org$\n(?:^|\\.)dnset\\.com$\n(?:^|\\.)dnsrd\\.com$\n(?:^|\\.)dnssec\\.net$\n(?:^|\\.)dnvod\\.tv$\n(?:^|\\.)doctorvoice\\.org$\n(?:^|\\.)dogfartnetwork\\.com$\n(?:^|\\.)dojin\\.com$\n(?:^|\\.)dok-forum\\.net$\n(?:^|\\.)dolc\\.de$\n(?:^|\\.)dolf\\.org\\.hk$\n(?:^|\\.)dollf\\.com$\n(?:^|\\.)domain\\.club\\.tw$\n(?:^|\\.)domainhelp\\.search\\.com$\n(?:^|\\.)domains\\.google$\n(?:^|\\.)domaintoday\\.com\\.au$\n(?:^|\\.)dongtaiwang\\.com$\n(?:^|\\.)dongtaiwang\\.net$\n(?:^|\\.)dongyangjing\\.com$\n(?:^|\\.)dontfilter\\.us$\n(?:^|\\.)dontmovetochina\\.com$\n(?:^|\\.)dorjeshugden\\.com$\n(?:^|\\.)dotplane\\.com$\n(?:^|\\.)dotsub\\.com$\n(?:^|\\.)dotvpn\\.com$\n(?:^|\\.)doub\\.io$\n(?:^|\\.)doubibackup\\.com$\n(?:^|\\.)doubmirror\\.cf$\n(?:^|\\.)dougscripts\\.com$\n(?:^|\\.)douhokanko\\.net$\n(?:^|\\.)doujincafe\\.com$\n(?:^|\\.)dowei\\.org$\n(?:^|\\.)download\\.aircrack-ng\\.org$\n(?:^|\\.)download\\.cnet\\.com$\n(?:^|\\.)download\\.ithome\\.com\\.tw$\n(?:^|\\.)dphk\\.org$\n(?:^|\\.)dpp\\.org\\.tw$\n(?:^|\\.)dpr\\.info$\n(?:^|\\.)dragonex\\.io$\n(?:^|\\.)dragonsprings\\.org$\n(?:^|\\.)dreamamateurs\\.com$\n(?:^|\\.)drepung\\.org$\n(?:^|\\.)drgan\\.net$\n(?:^|\\.)drmingxia\\.org$\n(?:^|\\.)dropbooks\\.tv$\n(?:^|\\.)dropbox\\.com$\n(?:^|\\.)dropboxusercontent\\.com$\n(?:^|\\.)drsunacademy\\.com$\n(?:^|\\.)drtuber\\.com$\n(?:^|\\.)dscn\\.info$\n(?:^|\\.)dsmtp\\.com$\n(?:^|\\.)dstk\\.dk$\n(?:^|\\.)dtdns\\.net$\n(?:^|\\.)dtiblog\\.com$\n(?:^|\\.)dtic\\.mil$\n(?:^|\\.)dtwang\\.org$\n(?:^|\\.)duanzhihu\\.com$\n(?:^|\\.)duck\\.com$\n(?:^|\\.)duckdns\\.org$\n(?:^|\\.)duckduckgo-owned-server\\.yahoo\\.net$\n(?:^|\\.)duckduckgo\\.com$\n(?:^|\\.)duckload\\.com$\n(?:^|\\.)duckmylife\\.com$\n(?:^|\\.)duga\\.jp$\n(?:^|\\.)duihua\\.org$\n(?:^|\\.)duihuahrjournal\\.org$\n(?:^|\\.)dumb1\\.com$\n(?:^|\\.)dunyabulteni\\.net$\n(?:^|\\.)duoweitimes\\.com$\n(?:^|\\.)duping\\.net$\n(?:^|\\.)duplicati\\.com$\n(?:^|\\.)dupola\\.com$\n(?:^|\\.)dupola\\.net$\n(?:^|\\.)dushi\\.ca$\n(?:^|\\.)dvdpac\\.com$\n(?:^|\\.)dvorak\\.org$\n(?:^|\\.)dw-world\\.com$\n(?:^|\\.)dw-world\\.de$\n(?:^|\\.)dw\\.com$\n(?:^|\\.)dw\\.de$\n(?:^|\\.)dwnews\\.com$\n(?:^|\\.)dwnews\\.net$\n(?:^|\\.)dynamic-dns\\.net$\n(?:^|\\.)dynamicdns\\.biz$\n(?:^|\\.)dynamicdns\\.co\\.uk$\n(?:^|\\.)dynamicdns\\.me\\.uk$\n(?:^|\\.)dynamicdns\\.org\\.uk$\n(?:^|\\.)dynawebinc\\.com$\n(?:^|\\.)dyndns-ip\\.com$\n(?:^|\\.)dyndns-pics\\.com$\n(?:^|\\.)dyndns\\.org$\n(?:^|\\.)dyndns\\.pro$\n(?:^|\\.)dynssl\\.com$\n(?:^|\\.)dynu\\.com$\n(?:^|\\.)dynu\\.net$\n(?:^|\\.)dynupdate\\.no-ip\\.com$\n(?:^|\\.)dysfz\\.cc$\n(?:^|\\.)dzze\\.com$\n(?:^|\\.)e-classical\\.com\\.tw$\n(?:^|\\.)e-gold\\.com$\n(?:^|\\.)e-hentai\\.org$\n(?:^|\\.)e-hentaidb\\.com$\n(?:^|\\.)e-info\\.org\\.tw$\n(?:^|\\.)e-traderland\\.net$\n(?:^|\\.)e-zone\\.com\\.hk$\n(?:^|\\.)e123\\.hk$\n(?:^|\\.)earlytibet\\.com$\n(?:^|\\.)earthcam\\.com$\n(?:^|\\.)earthvpn\\.com$\n(?:^|\\.)eastern-ark\\.com$\n(?:^|\\.)easternlightning\\.org$\n(?:^|\\.)eastturkestan\\.com$\n(?:^|\\.)eastturkistan-gov\\.org$\n(?:^|\\.)eastturkistancc\\.org$\n(?:^|\\.)eastturkistangovernmentinexile\\.us$\n(?:^|\\.)easyca\\.ca$\n(?:^|\\.)easypic\\.com$\n(?:^|\\.)ebony-beauty\\.com$\n(?:^|\\.)ebook\\.hyread\\.com\\.tw$\n(?:^|\\.)ebookbrowse\\.com$\n(?:^|\\.)ebookee\\.com$\n(?:^|\\.)ebtcbank\\.com$\n(?:^|\\.)ecfa\\.org\\.tw$\n(?:^|\\.)echofon\\.com$\n(?:^|\\.)ecimg\\.tw$\n(?:^|\\.)ecministry\\.net$\n(?:^|\\.)economist\\.com$\n(?:^|\\.)ecsm\\.vs\\.com$\n(?:^|\\.)edgecastcdn\\.net$\n(?:^|\\.)edicypages\\.com$\n(?:^|\\.)edmontonchina\\.cn$\n(?:^|\\.)edmontonservice\\.com$\n(?:^|\\.)edns\\.biz$\n(?:^|\\.)edoors\\.com$\n(?:^|\\.)edubridge\\.com$\n(?:^|\\.)edupro\\.org$\n(?:^|\\.)eeas\\.europa\\.eu$\n(?:^|\\.)eesti\\.ee$\n(?:^|\\.)eevpn\\.com$\n(?:^|\\.)efcc\\.org\\.hk$\n(?:^|\\.)effers\\.com$\n(?:^|\\.)efksoft\\.com$\n(?:^|\\.)efukt\\.com$\n(?:^|\\.)eic-av\\.com$\n(?:^|\\.)eireinikotaerukai\\.com$\n(?:^|\\.)eisbb\\.com$\n(?:^|\\.)eksisozluk\\.com$\n(?:^|\\.)electionsmeter\\.com$\n(?:^|\\.)elgoog\\.im$\n(?:^|\\.)ellawine\\.org$\n(?:^|\\.)elpais\\.com$\n(?:^|\\.)eltondisney\\.com$\n(?:^|\\.)emaga\\.com$\n(?:^|\\.)emanna\\.com$\n(?:^|\\.)embr\\.in$\n(?:^|\\.)emilylau\\.org\\.hk$\n(?:^|\\.)empfil\\.com$\n(?:^|\\.)emule-ed2k\\.com$\n(?:^|\\.)emulefans\\.com$\n(?:^|\\.)emuparadise\\.me$\n(?:^|\\.)en\\.favotter\\.net$\n(?:^|\\.)en\\.hao123\\.com$\n(?:^|\\.)enanyang\\.my$\n(?:^|\\.)encyclopedia\\.com$\n(?:^|\\.)enewstree\\.com$\n(?:^|\\.)enfal\\.de$\n(?:^|\\.)engagedaily\\.org$\n(?:^|\\.)englishforeveryone\\.org$\n(?:^|\\.)englishfromengland\\.co\\.uk$\n(?:^|\\.)englishpen\\.org$\n(?:^|\\.)enlighten\\.org\\.tw$\n(?:^|\\.)entermap\\.com$\n(?:^|\\.)entnt\\.com$\n(?:^|\\.)environment\\.google$\n(?:^|\\.)epa\\.gov\\.tw$\n(?:^|\\.)epac\\.to$\n(?:^|\\.)episcopalchurch\\.org$\n(?:^|\\.)epochhk\\.com$\n(?:^|\\.)epochtimes-bg\\.com$\n(?:^|\\.)epochtimes-romania\\.com$\n(?:^|\\.)epochtimes\\.co\\.il$\n(?:^|\\.)epochtimes\\.co\\.kr$\n(?:^|\\.)epochtimes\\.com$\n(?:^|\\.)epochtimes\\.cz$\n(?:^|\\.)epochtimes\\.de$\n(?:^|\\.)epochtimes\\.fr$\n(?:^|\\.)epochtimes\\.ie$\n(?:^|\\.)epochtimes\\.it$\n(?:^|\\.)epochtimes\\.jp$\n(?:^|\\.)epochtimes\\.ru$\n(?:^|\\.)epochtimes\\.se$\n(?:^|\\.)epochtimestr\\.com$\n(?:^|\\.)epochweek\\.com$\n(?:^|\\.)epochweekly\\.com$\n(?:^|\\.)eporner\\.com$\n(?:^|\\.)equinenow\\.com$\n(?:^|\\.)erabaru\\.net$\n(?:^|\\.)eracom\\.com\\.tw$\n(?:^|\\.)eraysoft\\.com\\.tr$\n(?:^|\\.)erepublik\\.com$\n(?:^|\\.)erights\\.net$\n(?:^|\\.)eriversoft\\.com$\n(?:^|\\.)erktv\\.com$\n(?:^|\\.)ernestmandel\\.org$\n(?:^|\\.)erodaizensyu\\.com$\n(?:^|\\.)erodoujinlog\\.com$\n(?:^|\\.)erodoujinworld\\.com$\n(?:^|\\.)eromanga-kingdom\\.com$\n(?:^|\\.)eromangadouzin\\.com$\n(?:^|\\.)eromon\\.net$\n(?:^|\\.)eroprofile\\.com$\n(?:^|\\.)eroticsaloon\\.net$\n(?:^|\\.)eslite\\.com$\n(?:^|\\.)esmtp\\.biz$\n(?:^|\\.)esurance\\.com$\n(?:^|\\.)etaa\\.org\\.au$\n(?:^|\\.)etadult\\.com$\n(?:^|\\.)etaiwannews\\.com$\n(?:^|\\.)etherdelta\\.com$\n(?:^|\\.)etizer\\.org$\n(?:^|\\.)etokki\\.com$\n(?:^|\\.)etools\\.ncol\\.com$\n(?:^|\\.)etowns\\.net$\n(?:^|\\.)etowns\\.org$\n(?:^|\\.)ettoday\\.net$\n(?:^|\\.)etvonline\\.hk$\n(?:^|\\.)eu\\.org$\n(?:^|\\.)eucasino\\.com$\n(?:^|\\.)eulam\\.com$\n(?:^|\\.)eurekavpt\\.com$\n(?:^|\\.)euronews\\.com$\n(?:^|\\.)evchk\\.wikia\\.com$\n(?:^|\\.)evschool\\.net$\n(?:^|\\.)exblog\\.jp$\n(?:^|\\.)exchristian\\.hk$\n(?:^|\\.)exmo\\.com$\n(?:^|\\.)exmormon\\.org$\n(?:^|\\.)expatshield\\.com$\n(?:^|\\.)expecthim\\.com$\n(?:^|\\.)expekt\\.com$\n(?:^|\\.)experts-univers\\.com$\n(?:^|\\.)exploader\\.net$\n(?:^|\\.)expressvpn\\.com$\n(?:^|\\.)exrates\\.me$\n(?:^|\\.)extmatrix\\.com$\n(?:^|\\.)extremetube\\.com$\n(?:^|\\.)exx\\.com$\n(?:^|\\.)eyevio\\.jp$\n(?:^|\\.)eyny\\.com$\n(?:^|\\.)ezpc\\.tk$\n(?:^|\\.)ezpeer\\.com$\n(?:^|\\.)ezua\\.com$\n(?:^|\\.)fa\\.gov\\.tw$\n(?:^|\\.)facebook\\.br$\n(?:^|\\.)facebook\\.com$\n(?:^|\\.)facebook\\.design$\n(?:^|\\.)facebook\\.hu$\n(?:^|\\.)facebook\\.in$\n(?:^|\\.)facebook\\.nl$\n(?:^|\\.)facebook\\.se$\n(?:^|\\.)facebookmail\\.com$\n(?:^|\\.)facebookquotes4u\\.com$\n(?:^|\\.)faceless\\.me$\n(?:^|\\.)facesofnyfw\\.com$\n(?:^|\\.)facesoftibetanselfimmolators\\.info$\n(?:^|\\.)fail\\.hk$\n(?:^|\\.)faith100\\.org$\n(?:^|\\.)faithfuleye\\.com$\n(?:^|\\.)faiththedog\\.info$\n(?:^|\\.)fakku\\.net$\n(?:^|\\.)falsefire\\.com$\n(?:^|\\.)falun-co\\.org$\n(?:^|\\.)falun-ny\\.net$\n(?:^|\\.)falun\\.caltech\\.edu$\n(?:^|\\.)falunart\\.org$\n(?:^|\\.)falunasia\\.info$\n(?:^|\\.)falunau\\.org$\n(?:^|\\.)falunaz\\.net$\n(?:^|\\.)falundafa-dc\\.org$\n(?:^|\\.)falundafa-florida\\.org$\n(?:^|\\.)falundafa-nc\\.org$\n(?:^|\\.)falundafa-pa\\.net$\n(?:^|\\.)falundafa-sacramento\\.org$\n(?:^|\\.)falundafa\\.org$\n(?:^|\\.)falundafaindia\\.org$\n(?:^|\\.)falundafamuseum\\.org$\n(?:^|\\.)falungong\\.club$\n(?:^|\\.)falungong\\.de$\n(?:^|\\.)falungong\\.org\\.uk$\n(?:^|\\.)falunhr\\.org$\n(?:^|\\.)faluninfo\\.de$\n(?:^|\\.)faluninfo\\.net$\n(?:^|\\.)falunpilipinas\\.net$\n(?:^|\\.)falunworld\\.net$\n(?:^|\\.)familyfed\\.org$\n(?:^|\\.)famunion\\.com$\n(?:^|\\.)fan-qiang\\.com$\n(?:^|\\.)fangbinxing\\.com$\n(?:^|\\.)fangeming\\.com$\n(?:^|\\.)fangeqiang\\.com$\n(?:^|\\.)fanglizhi\\.info$\n(?:^|\\.)fangmincn\\.org$\n(?:^|\\.)fangong\\.forums-free\\.com$\n(?:^|\\.)fangong\\.org$\n(?:^|\\.)fangongheike\\.com$\n(?:^|\\.)fanhaodang\\.com$\n(?:^|\\.)fanqiang\\.tk$\n(?:^|\\.)fanqianghou\\.com$\n(?:^|\\.)fanqiangyakexi\\.net$\n(?:^|\\.)fanqiangzhe\\.com$\n(?:^|\\.)fanswong\\.com$\n(?:^|\\.)fanyue\\.info$\n(?:^|\\.)fapdu\\.com$\n(?:^|\\.)faproxy\\.com$\n(?:^|\\.)faqserv\\.com$\n(?:^|\\.)fartit\\.com$\n(?:^|\\.)farwestchina\\.com$\n(?:^|\\.)fast\\.wistia\\.com$\n(?:^|\\.)fastpic\\.ru$\n(?:^|\\.)fastssh\\.com$\n(?:^|\\.)faststone\\.org$\n(?:^|\\.)fatbtc\\.com$\n(?:^|\\.)favstar\\.fm$\n(?:^|\\.)fawanghuihui\\.org$\n(?:^|\\.)faydao\\.com$\n(?:^|\\.)fb\\.com$\n(?:^|\\.)fb\\.me$\n(?:^|\\.)fbaddins\\.com$\n(?:^|\\.)fbcdn\\.net$\n(?:^|\\.)fbsbx\\.com$\n(?:^|\\.)fbworkmail\\.com$\n(?:^|\\.)fc2\\.com$\n(?:^|\\.)fc2blog\\.net$\n(?:^|\\.)fc2china\\.com$\n(?:^|\\.)fc2cn\\.com$\n(?:^|\\.)fda\\.gov\\.tw$\n(?:^|\\.)fdc64\\.de$\n(?:^|\\.)fdc64\\.org$\n(?:^|\\.)fdc89\\.jp$\n(?:^|\\.)feedburner\\.com$\n(?:^|\\.)feeds\\.fileforum\\.com$\n(?:^|\\.)feelssh\\.com$\n(?:^|\\.)feer\\.com$\n(?:^|\\.)feifeiss\\.com$\n(?:^|\\.)feitian-california\\.org$\n(?:^|\\.)feitianacademy\\.org$\n(?:^|\\.)feministteacher\\.com$\n(?:^|\\.)fengzhenghu\\.com$\n(?:^|\\.)fengzhenghu\\.net$\n(?:^|\\.)fevernet\\.com$\n(?:^|\\.)ff\\.im$\n(?:^|\\.)fffff\\.at$\n(?:^|\\.)fflick\\.com$\n(?:^|\\.)ffvpn\\.com$\n(?:^|\\.)fgmtv\\.net$\n(?:^|\\.)fgmtv\\.org$\n(?:^|\\.)fhreports\\.net$\n(?:^|\\.)fiddle\\.jshell\\.net$\n(?:^|\\.)figprayer\\.com$\n(?:^|\\.)fileflyer\\.com$\n(?:^|\\.)files2me\\.com$\n(?:^|\\.)fileserve\\.com$\n(?:^|\\.)filesor\\.com$\n(?:^|\\.)fillthesquare\\.org$\n(?:^|\\.)filmingfortibet\\.org$\n(?:^|\\.)filmy\\.olabloga\\.pl$\n(?:^|\\.)filthdump\\.com$\n(?:^|\\.)financetwitter\\.com$\n(?:^|\\.)finchvpn\\.com$\n(?:^|\\.)findmespot\\.com$\n(?:^|\\.)findyoutube\\.com$\n(?:^|\\.)findyoutube\\.net$\n(?:^|\\.)fingerdaily\\.com$\n(?:^|\\.)finler\\.net$\n(?:^|\\.)firearmsworld\\.net$\n(?:^|\\.)firebaseio\\.com$\n(?:^|\\.)fireofliberty\\.org$\n(?:^|\\.)firetweet\\.io$\n(?:^|\\.)firstfivefollowers\\.com$\n(?:^|\\.)flagsonline\\.it$\n(?:^|\\.)flecheinthepeche\\.fr$\n(?:^|\\.)fleshbot\\.com$\n(?:^|\\.)fleursdeslettres\\.com$\n(?:^|\\.)flgg\\.us$\n(?:^|\\.)flgjustice\\.org$\n(?:^|\\.)flickr\\.com$\n(?:^|\\.)flickrhivemind\\.net$\n(?:^|\\.)flickriver\\.com$\n(?:^|\\.)fling\\.com$\n(?:^|\\.)flipboard\\.com$\n(?:^|\\.)flipkart\\.com$\n(?:^|\\.)flitto\\.com$\n(?:^|\\.)flnet\\.org$\n(?:^|\\.)flog\\.tw$\n(?:^|\\.)flyvpn\\.com$\n(?:^|\\.)flyzy2005\\.com$\n(?:^|\\.)fnac\\.be$\n(?:^|\\.)fnac\\.com$\n(?:^|\\.)fochk\\.org$\n(?:^|\\.)focustaiwan\\.tw$\n(?:^|\\.)focusvpn\\.com$\n(?:^|\\.)fofg-europe\\.net$\n(?:^|\\.)fofg\\.org$\n(?:^|\\.)fofldfradio\\.org$\n(?:^|\\.)fooooo\\.com$\n(?:^|\\.)footwiball\\.com$\n(?:^|\\.)foreignpolicy\\.com$\n(?:^|\\.)forum\\.baby-kingdom\\.com$\n(?:^|\\.)forum\\.cyberctm\\.com$\n(?:^|\\.)forum\\.idsam\\.com$\n(?:^|\\.)forum\\.my903\\.com$\n(?:^|\\.)forum\\.mymaji\\.com$\n(?:^|\\.)forum\\.omy\\.sg$\n(?:^|\\.)forum\\.palmislife\\.com$\n(?:^|\\.)forum\\.setty\\.com\\.tw$\n(?:^|\\.)forum\\.sina\\.com\\.hk$\n(?:^|\\.)forum\\.slime\\.com\\.tw$\n(?:^|\\.)forum\\.tvb\\.com$\n(?:^|\\.)forum\\.xinbao\\.de$\n(?:^|\\.)forum4hk\\.com$\n(?:^|\\.)fotile\\.me$\n(?:^|\\.)fourface\\.nodesnoop\\.com$\n(?:^|\\.)fourthinternational\\.org$\n(?:^|\\.)foxdie\\.us$\n(?:^|\\.)foxgay\\.com$\n(?:^|\\.)foxsub\\.com$\n(?:^|\\.)foxtang\\.com$\n(?:^|\\.)fpmt-osel\\.org$\n(?:^|\\.)fpmt\\.org$\n(?:^|\\.)fpmt\\.tw$\n(?:^|\\.)fpmtmexico\\.org$\n(?:^|\\.)fq\\.wikia\\.com$\n(?:^|\\.)fqok\\.org$\n(?:^|\\.)fqrouter\\.com$\n(?:^|\\.)franklc\\.com$\n(?:^|\\.)freakshare\\.com$\n(?:^|\\.)free-gate\\.org$\n(?:^|\\.)free-hada-now\\.org$\n(?:^|\\.)free-proxy\\.cz$\n(?:^|\\.)free-ss\\.site$\n(?:^|\\.)free-ssh\\.com$\n(?:^|\\.)free\\.fr$\n(?:^|\\.)free4u\\.com\\.ar$\n(?:^|\\.)freealim\\.com$\n(?:^|\\.)freebrowser\\.org$\n(?:^|\\.)freechal\\.com$\n(?:^|\\.)freechina\\.net$\n(?:^|\\.)freechina\\.news$\n(?:^|\\.)freechinaforum\\.org$\n(?:^|\\.)freechinaweibo\\.com$\n(?:^|\\.)freeddns\\.com$\n(?:^|\\.)freeddns\\.org$\n(?:^|\\.)freedomchina\\.info$\n(?:^|\\.)freedomcollection\\.org$\n(?:^|\\.)freedomhouse\\.org$\n(?:^|\\.)freedominfonetweb\\.wordpress\\.com$\n(?:^|\\.)freedomsherald\\.org$\n(?:^|\\.)freeforums\\.org$\n(?:^|\\.)freefq\\.com$\n(?:^|\\.)freefuckvids\\.com$\n(?:^|\\.)freegao\\.com$\n(?:^|\\.)freeilhamtohti\\.org$\n(?:^|\\.)freekwonpyong\\.org$\n(?:^|\\.)freelotto\\.com$\n(?:^|\\.)freeman2\\.com$\n(?:^|\\.)freemoren\\.com$\n(?:^|\\.)freemorenews\\.com$\n(?:^|\\.)freemuse\\.org$\n(?:^|\\.)freenet$\n(?:^|\\.)freenet-china\\.org$\n(?:^|\\.)freenetproject\\.org$\n(?:^|\\.)freenewscn\\.com$\n(?:^|\\.)freeopenvpn\\.com$\n(?:^|\\.)freeoz\\.org$\n(?:^|\\.)freessh\\.us$\n(?:^|\\.)freetcp\\.com$\n(?:^|\\.)freetibet\\.net$\n(?:^|\\.)freetibet\\.org$\n(?:^|\\.)freetibetanheroes\\.org$\n(?:^|\\.)freeviewmovies\\.com$\n(?:^|\\.)freevpn\\.me$\n(?:^|\\.)freevpn\\.nl$\n(?:^|\\.)freewallpaper4\\.me$\n(?:^|\\.)freewebs\\.com$\n(?:^|\\.)freewechat\\.com$\n(?:^|\\.)freeweibo\\.com$\n(?:^|\\.)freewww\\.biz$\n(?:^|\\.)freewww\\.info$\n(?:^|\\.)freexinwen\\.com$\n(?:^|\\.)freeyellow\\.com$\n(?:^|\\.)freeyoutubeproxy\\.net$\n(?:^|\\.)friendfeed-media\\.com$\n(?:^|\\.)friendfeed\\.com$\n(?:^|\\.)friends-of-tibet\\.org$\n(?:^|\\.)friendsoftibet\\.org$\n(?:^|\\.)fring\\.com$\n(?:^|\\.)fringenetwork\\.com$\n(?:^|\\.)from-pr\\.com$\n(?:^|\\.)from-sd\\.com$\n(?:^|\\.)fromchinatousa\\.net$\n(?:^|\\.)frommel\\.net$\n(?:^|\\.)frontlinedefenders\\.org$\n(?:^|\\.)frootvpn\\.com$\n(?:^|\\.)fscked\\.org$\n(?:^|\\.)fsurf\\.com$\n(?:^|\\.)ftchinese\\.com$\n(?:^|\\.)ftp1\\.biz$\n(?:^|\\.)ftpserver\\.biz$\n(?:^|\\.)ftv\\.com\\.tw$\n(?:^|\\.)fucd\\.com$\n(?:^|\\.)fuckcnnic\\.net$\n(?:^|\\.)fuckgfw\\.org$\n(?:^|\\.)fulione\\.com$\n(?:^|\\.)fullerconsideration\\.com$\n(?:^|\\.)fulue\\.com$\n(?:^|\\.)funf\\.tw$\n(?:^|\\.)funkyimg\\.com$\n(?:^|\\.)funp\\.com$\n(?:^|\\.)fuq\\.com$\n(?:^|\\.)furbo\\.org$\n(?:^|\\.)furhhdl\\.org$\n(?:^|\\.)furinkan\\.com$\n(?:^|\\.)furl\\.net$\n(?:^|\\.)futurechinaforum\\.org$\n(?:^|\\.)futuremessage\\.org$\n(?:^|\\.)fux\\.com$\n(?:^|\\.)fuyin\\.net$\n(?:^|\\.)fuyindiantai\\.org$\n(?:^|\\.)fuyu\\.org\\.tw$\n(?:^|\\.)fw\\.cm$\n(?:^|\\.)fxcm-chinese\\.com$\n(?:^|\\.)fxnetworks\\.com$\n(?:^|\\.)fzh999\\.com$\n(?:^|\\.)fzh999\\.net$\n(?:^|\\.)fzlm\\.com$\n(?:^|\\.)g-area\\.org$\n(?:^|\\.)g-queen\\.com$\n(?:^|\\.)g\\.co$\n(?:^|\\.)g0v\\.social$\n(?:^|\\.)g6hentai\\.com$\n(?:^|\\.)gabocorp\\.com$\n(?:^|\\.)gaeproxy\\.com$\n(?:^|\\.)gaforum\\.org$\n(?:^|\\.)galaxymacau\\.com$\n(?:^|\\.)galenwu\\.com$\n(?:^|\\.)galstars\\.net$\n(?:^|\\.)game735\\.com$\n(?:^|\\.)gamebase\\.com\\.tw$\n(?:^|\\.)gamejolt\\.com$\n(?:^|\\.)gamer-cds\\.cdn\\.hinet\\.net$\n(?:^|\\.)gamer\\.com\\.tw$\n(?:^|\\.)gamer2-cds\\.cdn\\.hinet\\.net$\n(?:^|\\.)gamez\\.com\\.tw$\n(?:^|\\.)gamousa\\.com$\n(?:^|\\.)ganges\\.com$\n(?:^|\\.)gaoming\\.net$\n(?:^|\\.)gaopi\\.net$\n(?:^|\\.)gaozhisheng\\.net$\n(?:^|\\.)gaozhisheng\\.org$\n(?:^|\\.)gardennetworks\\.com$\n(?:^|\\.)gardennetworks\\.org$\n(?:^|\\.)gartlive\\.com$\n(?:^|\\.)gate-project\\.com$\n(?:^|\\.)gate\\.io$\n(?:^|\\.)gatecoin\\.com$\n(?:^|\\.)gather\\.com$\n(?:^|\\.)gatherproxy\\.com$\n(?:^|\\.)gati\\.org\\.tw$\n(?:^|\\.)gaybubble\\.com$\n(?:^|\\.)gaycn\\.net$\n(?:^|\\.)gayhub\\.com$\n(?:^|\\.)gaymap\\.cc$\n(?:^|\\.)gaymenring\\.com$\n(?:^|\\.)gaytube\\.com$\n(?:^|\\.)gaywatch\\.com$\n(?:^|\\.)gazotube\\.com$\n(?:^|\\.)gcc\\.org\\.hk$\n(?:^|\\.)gclooney\\.com$\n(?:^|\\.)gcmasia\\.com$\n(?:^|\\.)gcpnews\\.com$\n(?:^|\\.)gcr\\.io$\n(?:^|\\.)gdbt\\.net$\n(?:^|\\.)gdzf\\.org$\n(?:^|\\.)geek-art\\.net$\n(?:^|\\.)geekerhome\\.com$\n(?:^|\\.)geekheart\\.info$\n(?:^|\\.)gekikame\\.com$\n(?:^|\\.)gelbooru\\.com$\n(?:^|\\.)geocities\\.co\\.jp$\n(?:^|\\.)geocities\\.com$\n(?:^|\\.)geocities\\.jp$\n(?:^|\\.)gerefoundation\\.org$\n(?:^|\\.)get\\.app$\n(?:^|\\.)get\\.dev$\n(?:^|\\.)get\\.how$\n(?:^|\\.)get\\.page$\n(?:^|\\.)getastrill\\.com$\n(?:^|\\.)getchu\\.com$\n(?:^|\\.)getcloak\\.com$\n(?:^|\\.)getfoxyproxy\\.org$\n(?:^|\\.)getfreedur\\.com$\n(?:^|\\.)getgom\\.com$\n(?:^|\\.)geti2p\\.net$\n(?:^|\\.)getiton\\.com$\n(?:^|\\.)getjetso\\.com$\n(?:^|\\.)getlantern\\.org$\n(?:^|\\.)getmdl\\.io$\n(?:^|\\.)getoutline\\.org$\n(?:^|\\.)getsocialscope\\.com$\n(?:^|\\.)getsync\\.com$\n(?:^|\\.)gettrials\\.com$\n(?:^|\\.)gettyimages\\.com$\n(?:^|\\.)getuploader\\.com$\n(?:^|\\.)gfbv\\.de$\n(?:^|\\.)gfgold\\.com\\.hk$\n(?:^|\\.)gfsale\\.com$\n(?:^|\\.)gfw\\.org\\.ua$\n(?:^|\\.)gfw\\.press$\n(?:^|\\.)ggpht\\.com$\n(?:^|\\.)ggssl\\.com$\n(?:^|\\.)ghostpath\\.com$\n(?:^|\\.)ghut\\.org$\n(?:^|\\.)giantessnight\\.com$\n(?:^|\\.)gifree\\.com$\n(?:^|\\.)giga-web\\.jp$\n(?:^|\\.)gigporno\\.ru$\n(?:^|\\.)girlbanker\\.com$\n(?:^|\\.)git\\.io$\n(?:^|\\.)github\\.com$\n(?:^|\\.)githubusercontent\\.com$\n(?:^|\\.)gizlen\\.net$\n(?:^|\\.)gjczz\\.com$\n(?:^|\\.)glass8\\.eu$\n(?:^|\\.)global\\.bing\\.com$\n(?:^|\\.)globaljihad\\.net$\n(?:^|\\.)globalmediaoutreach\\.com$\n(?:^|\\.)globalmuseumoncommunism\\.org$\n(?:^|\\.)globalrescue\\.net$\n(?:^|\\.)globaltm\\.org$\n(?:^|\\.)globalvoices\\.org$\n(?:^|\\.)globalvoicesonline\\.org$\n(?:^|\\.)globalvpn\\.net$\n(?:^|\\.)glock\\.com$\n(?:^|\\.)gloryhole\\.com$\n(?:^|\\.)glorystar\\.me$\n(?:^|\\.)gluckman\\.com$\n(?:^|\\.)glype\\.com$\n(?:^|\\.)gmail\\.com$\n(?:^|\\.)gmbd\\.cn$\n(?:^|\\.)gmhz\\.org$\n(?:^|\\.)gmll\\.org$\n(?:^|\\.)gmodules\\.com$\n(?:^|\\.)gmozomg\\.izihost\\.org$\n(?:^|\\.)gnci\\.org\\.hk$\n(?:^|\\.)go-pki\\.com$\n(?:^|\\.)go\\.nesnode\\.com$\n(?:^|\\.)go141\\.com$\n(?:^|\\.)goagent\\.biz$\n(?:^|\\.)goagent\\.codeplex\\.com$\n(?:^|\\.)goagentplus\\.com$\n(?:^|\\.)gobet\\.cc$\n(?:^|\\.)godfootsteps\\.org$\n(?:^|\\.)godns\\.work$\n(?:^|\\.)godoc\\.org$\n(?:^|\\.)godsdirectcontact\\.co\\.uk$\n(?:^|\\.)godsdirectcontact\\.org$\n(?:^|\\.)godsdirectcontact\\.org\\.tw$\n(?:^|\\.)godsimmediatecontact\\.com$\n(?:^|\\.)gogotunnel\\.com$\n(?:^|\\.)gohappy\\.com\\.tw$\n(?:^|\\.)gojet\\.krtco\\.com\\.tw$\n(?:^|\\.)gokbayrak\\.com$\n(?:^|\\.)golang\\.org$\n(?:^|\\.)goldbet\\.com$\n(?:^|\\.)goldbetsports\\.com$\n(?:^|\\.)goldeneyevault\\.com$\n(?:^|\\.)goldenfrog\\.com$\n(?:^|\\.)goldjizz\\.com$\n(?:^|\\.)goldstep\\.net$\n(?:^|\\.)goldwave\\.com$\n(?:^|\\.)gongm\\.in$\n(?:^|\\.)gongmeng\\.info$\n(?:^|\\.)gongminliliang\\.com$\n(?:^|\\.)gongwt\\.com$\n(?:^|\\.)goo\\.gl$\n(?:^|\\.)gooday\\.xyz$\n(?:^|\\.)gooddns\\.info$\n(?:^|\\.)goodreaders\\.com$\n(?:^|\\.)goodreads\\.com$\n(?:^|\\.)goodtv\\.com\\.tw$\n(?:^|\\.)goodtv\\.tv$\n(?:^|\\.)goofind\\.com$\n(?:^|\\.)google(\\.[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?){1,2}$\n(?:^|\\.)googleapis(\\.[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?){1,2}$\n(?:^|\\.)googleapps\\.com$\n(?:^|\\.)googlearth\\.com$\n(?:^|\\.)googleartproject\\.com$\n(?:^|\\.)googleblog\\.com$\n(?:^|\\.)googlebot\\.com$\n(?:^|\\.)googlechinawebmaster\\.com$\n(?:^|\\.)googlecode\\.com$\n(?:^|\\.)googlecommerce\\.com$\n(?:^|\\.)googledomains\\.com$\n(?:^|\\.)googledrive\\.com$\n(?:^|\\.)googleearth\\.com$\n(?:^|\\.)googlegroups\\.com$\n(?:^|\\.)googlehosted\\.com$\n(?:^|\\.)googleideas\\.com$\n(?:^|\\.)googleinsidesearch\\.com$\n(?:^|\\.)googlelabs\\.com$\n(?:^|\\.)googlemail\\.com$\n(?:^|\\.)googlemashups\\.com$\n(?:^|\\.)googlepagecreator\\.com$\n(?:^|\\.)googleplay\\.com$\n(?:^|\\.)googleplus\\.com$\n(?:^|\\.)googlescholar\\.com$\n(?:^|\\.)googlesile\\.com$\n(?:^|\\.)googlesource\\.com$\n(?:^|\\.)googleusercontent\\.com$\n(?:^|\\.)googlevideo\\.com$\n(?:^|\\.)googleweblight\\.com$\n(?:^|\\.)googlezip\\.net$\n(?:^|\\.)gopetition\\.com$\n(?:^|\\.)goproxing\\.net$\n(?:^|\\.)goregrish\\.com$\n(?:^|\\.)gospelherald\\.com$\n(?:^|\\.)got-game\\.org$\n(?:^|\\.)gotdns\\.ch$\n(?:^|\\.)gotgeeks\\.com$\n(?:^|\\.)gotrusted\\.com$\n(?:^|\\.)gotw\\.ca$\n(?:^|\\.)gov\\.taipei$\n(?:^|\\.)gov\\.tw$\n(?:^|\\.)gr8domain\\.biz$\n(?:^|\\.)gr8name\\.biz$\n(?:^|\\.)grammaly\\.com$\n(?:^|\\.)grandtrial\\.org$\n(?:^|\\.)grangorz\\.org$\n(?:^|\\.)graphis\\.ne\\.jp$\n(?:^|\\.)graphql\\.org$\n(?:^|\\.)greasespot\\.net$\n(?:^|\\.)great-firewall\\.com$\n(?:^|\\.)great-roc\\.org$\n(?:^|\\.)greatfire\\.org$\n(?:^|\\.)greatfire\\.us7\\.list-manage\\.com$\n(?:^|\\.)greatfirewall\\.biz$\n(?:^|\\.)greatfirewallofchina\\.net$\n(?:^|\\.)greatfirewallofchina\\.org$\n(?:^|\\.)greatroc\\.org$\n(?:^|\\.)greatroc\\.tw$\n(?:^|\\.)greatzhonghua\\.org$\n(?:^|\\.)greenfieldbookstore\\.com\\.hk$\n(?:^|\\.)greenparty\\.org\\.tw$\n(?:^|\\.)greenpeace\\.com\\.tw$\n(?:^|\\.)greenpeace\\.org$\n(?:^|\\.)greenreadings\\.com$\n(?:^|\\.)greenvpn\\.net$\n(?:^|\\.)greenvpn\\.org$\n(?:^|\\.)grotty-monday\\.com$\n(?:^|\\.)groups\\.google\\.cn$\n(?:^|\\.)grow\\.google$\n(?:^|\\.)gs-discuss\\.com$\n(?:^|\\.)gsp\\.target\\.com$\n(?:^|\\.)gstatic\\.com$\n(?:^|\\.)gtricks\\.com$\n(?:^|\\.)gts-vpn\\.com$\n(?:^|\\.)gu-chu-sum\\.org$\n(?:^|\\.)guaguass\\.com$\n(?:^|\\.)guaguass\\.org$\n(?:^|\\.)guancha\\.org$\n(?:^|\\.)guaneryu\\.com$\n(?:^|\\.)guangming\\.com\\.my$\n(?:^|\\.)guardster\\.com$\n(?:^|\\.)guishan\\.org$\n(?:^|\\.)gumroad\\.com$\n(?:^|\\.)gun-world\\.net$\n(?:^|\\.)gunsamerica\\.com$\n(?:^|\\.)gunsandammo\\.com$\n(?:^|\\.)guo\\.media$\n(?:^|\\.)guruonline\\.hk$\n(?:^|\\.)gutteruncensored\\.com$\n(?:^|\\.)gvlib\\.com$\n(?:^|\\.)gvm\\.com\\.tw$\n(?:^|\\.)gvt0\\.com$\n(?:^|\\.)gvt1\\.com$\n(?:^|\\.)gvt3\\.com$\n(?:^|\\.)gwtproject\\.org$\n(?:^|\\.)gyalwarinpoche\\.com$\n(?:^|\\.)gyatsostudio\\.com$\n(?:^|\\.)gzm\\.tv$\n(?:^|\\.)gzone-anime\\.info$\n(?:^|\\.)h-china\\.org$\n(?:^|\\.)h-moe\\.com$\n(?:^|\\.)h1n1china\\.org$\n(?:^|\\.)h528\\.com$\n(?:^|\\.)h5dm\\.com$\n(?:^|\\.)h5galgame\\.me$\n(?:^|\\.)hacg\\.club$\n(?:^|\\.)hacg\\.in$\n(?:^|\\.)hacg\\.li$\n(?:^|\\.)hacg\\.me$\n(?:^|\\.)hacg\\.red$\n(?:^|\\.)hacken\\.cc$\n(?:^|\\.)hacker\\.org$\n(?:^|\\.)hackthatphone\\.net$\n(?:^|\\.)hahaxixi\\.github\\.io$\n(?:^|\\.)hahlo\\.com$\n(?:^|\\.)hakkatv\\.org\\.tw$\n(?:^|\\.)handcraftedsoftware\\.org$\n(?:^|\\.)hanunyi\\.com$\n(?:^|\\.)hao\\.news$\n(?:^|\\.)haoel\\.github\\.io$\n(?:^|\\.)happy-vpn\\.com$\n(?:^|\\.)haproxy\\.org$\n(?:^|\\.)hardsextube\\.com$\n(?:^|\\.)harunyahya\\.com$\n(?:^|\\.)hautelook\\.com$\n(?:^|\\.)hautelookcdn\\.com$\n(?:^|\\.)have8\\.com$\n(?:^|\\.)hbg\\.com$\n(?:^|\\.)hbo\\.com$\n(?:^|\\.)hclips\\.com$\n(?:^|\\.)hd\\.stheadline\\.com$\n(?:^|\\.)hdlt\\.me$\n(?:^|\\.)hdtvb\\.net$\n(?:^|\\.)hdzog\\.com$\n(?:^|\\.)heartyit\\.com$\n(?:^|\\.)heavy-r\\.com$\n(?:^|\\.)hec\\.su$\n(?:^|\\.)hecaitou\\.net$\n(?:^|\\.)hechaji\\.com$\n(?:^|\\.)heeact\\.edu\\.tw$\n(?:^|\\.)hegre-art\\.com$\n(?:^|\\.)heix\\.pp\\.ru$\n(?:^|\\.)helloandroid\\.com$\n(?:^|\\.)helloqueer\\.com$\n(?:^|\\.)helloss\\.pw$\n(?:^|\\.)hellotxt\\.com$\n(?:^|\\.)hellouk\\.org$\n(?:^|\\.)help\\.linksalpha\\.com$\n(?:^|\\.)helpeachpeople\\.com$\n(?:^|\\.)helplinfen\\.com$\n(?:^|\\.)helpster\\.de$\n(?:^|\\.)helpzhuling\\.org$\n(?:^|\\.)hentai\\.to$\n(?:^|\\.)hentaitube\\.tv$\n(?:^|\\.)hentaivideoworld\\.com$\n(?:^|\\.)heqinglian\\.net$\n(?:^|\\.)heungkongdiscuss\\.com$\n(?:^|\\.)hexieshe\\.com$\n(?:^|\\.)hexieshe\\.xyz$\n(?:^|\\.)hexxeh\\.net$\n(?:^|\\.)heyzo\\.com$\n(?:^|\\.)hgseav\\.com$\n(?:^|\\.)hhdcb3office\\.org$\n(?:^|\\.)hhthesakyatrizin\\.org$\n(?:^|\\.)hi-on\\.org\\.tw$\n(?:^|\\.)hidden-advent\\.org$\n(?:^|\\.)hide\\.me$\n(?:^|\\.)hidecloud\\.com$\n(?:^|\\.)hidein\\.net$\n(?:^|\\.)hideipvpn\\.com$\n(?:^|\\.)hideman\\.net$\n(?:^|\\.)hideme\\.nl$\n(?:^|\\.)hidemy\\.name$\n(?:^|\\.)hidemyass\\.com$\n(?:^|\\.)hidemycomp\\.com$\n(?:^|\\.)higfw\\.com$\n(?:^|\\.)highpeakspureearth\\.com$\n(?:^|\\.)highrockmedia\\.com$\n(?:^|\\.)hihiforum\\.com$\n(?:^|\\.)hihistory\\.net$\n(?:^|\\.)hiitch\\.com$\n(?:^|\\.)hikinggfw\\.org$\n(?:^|\\.)hilive\\.tv$\n(?:^|\\.)himalayan-foundation\\.org$\n(?:^|\\.)himalayanglacier\\.com$\n(?:^|\\.)himemix\\.com$\n(?:^|\\.)himemix\\.net$\n(?:^|\\.)hitbtc\\.com$\n(?:^|\\.)hitomi\\.la$\n(?:^|\\.)hiwifi\\.com$\n(?:^|\\.)hizb-ut-tahrir\\.info$\n(?:^|\\.)hizb-ut-tahrir\\.org$\n(?:^|\\.)hizbuttahrir\\.org$\n(?:^|\\.)hjclub\\.info$\n(?:^|\\.)hk-pub\\.com$\n(?:^|\\.)hk\\.frienddy\\.com$\n(?:^|\\.)hk\\.geocities\\.com$\n(?:^|\\.)hk\\.gradconnection\\.com$\n(?:^|\\.)hk\\.hao123img\\.com$\n(?:^|\\.)hk\\.jiepang\\.com$\n(?:^|\\.)hk\\.knowledge\\.yahoo\\.com$\n(?:^|\\.)hk\\.myblog\\.yahoo\\.com$\n(?:^|\\.)hk\\.news\\.yahoo\\.com$\n(?:^|\\.)hk\\.rd\\.yahoo\\.com$\n(?:^|\\.)hk\\.search\\.yahoo\\.com$\n(?:^|\\.)hk\\.video\\.news\\.yahoo\\.com$\n(?:^|\\.)hk\\.yahoo\\.com$\n(?:^|\\.)hk01\\.com$\n(?:^|\\.)hk32168\\.com$\n(?:^|\\.)hka8964\\.wordpress\\.com$\n(?:^|\\.)hkacg\\.com$\n(?:^|\\.)hkacg\\.net$\n(?:^|\\.)hkanews\\.wordpress\\.com$\n(?:^|\\.)hkatvnews\\.com$\n(?:^|\\.)hkbc\\.net$\n(?:^|\\.)hkbf\\.org$\n(?:^|\\.)hkbookcity\\.com$\n(?:^|\\.)hkchurch\\.org$\n(?:^|\\.)hkci\\.org\\.hk$\n(?:^|\\.)hkcmi\\.edu$\n(?:^|\\.)hkcnews\\.com$\n(?:^|\\.)hkcoc\\.com$\n(?:^|\\.)hkcoc\\.weather\\.com\\.hk$\n(?:^|\\.)hkdailynews\\.com\\.hk$\n(?:^|\\.)hkday\\.net$\n(?:^|\\.)hkdf\\.org$\n(?:^|\\.)hkej\\.com$\n(?:^|\\.)hkepc\\.com$\n(?:^|\\.)hkfaa\\.com$\n(?:^|\\.)hkfreezone\\.com$\n(?:^|\\.)hkfront\\.org$\n(?:^|\\.)hkgalden\\.com$\n(?:^|\\.)hkgolden\\.com$\n(?:^|\\.)hkgreenradio\\.org$\n(?:^|\\.)hkheadline\\.com$\n(?:^|\\.)hkhkhk\\.com$\n(?:^|\\.)hkhrc\\.org\\.hk$\n(?:^|\\.)hkhrm\\.org\\.hk$\n(?:^|\\.)hkip\\.org\\.uk$\n(?:^|\\.)hkjc\\.com$\n(?:^|\\.)hkjp\\.org$\n(?:^|\\.)hklft\\.com$\n(?:^|\\.)hklts\\.org\\.hk$\n(?:^|\\.)hkptu\\.org$\n(?:^|\\.)hkreporter\\.com$\n(?:^|\\.)hkreporter\\.loved\\.hk$\n(?:^|\\.)hkupop\\.hku\\.hk$\n(?:^|\\.)hkusu\\.net$\n(?:^|\\.)hkvwet\\.com$\n(?:^|\\.)hkwcc\\.org\\.hk$\n(?:^|\\.)hkzone\\.org$\n(?:^|\\.)hmonghot\\.com$\n(?:^|\\.)hmv\\.co\\.jp$\n(?:^|\\.)hmvdigital\\.ca$\n(?:^|\\.)hmvdigital\\.com$\n(?:^|\\.)hnjhj\\.com$\n(?:^|\\.)hnntube\\.com$\n(?:^|\\.)hola\\.com$\n(?:^|\\.)hola\\.org$\n(?:^|\\.)holymountaincn\\.com$\n(?:^|\\.)holyspiritspeaks\\.org$\n(?:^|\\.)home\\.sina\\.com$\n(?:^|\\.)home\\.so-net\\.net\\.tw$\n(?:^|\\.)homedepot\\.com$\n(?:^|\\.)homeperversion\\.com$\n(?:^|\\.)homeservershow\\.com$\n(?:^|\\.)hongkongfp\\.com$\n(?:^|\\.)hongmeimei\\.com$\n(?:^|\\.)hongzhi\\.li$\n(?:^|\\.)hootsuite\\.com$\n(?:^|\\.)hoovers\\.com$\n(?:^|\\.)hopedialogue\\.org$\n(?:^|\\.)hopto\\.org$\n(?:^|\\.)hornygamer\\.com$\n(?:^|\\.)hornytrip\\.com$\n(?:^|\\.)hotav\\.tv$\n(?:^|\\.)hotels\\.cn$\n(?:^|\\.)hotfrog\\.com\\.tw$\n(?:^|\\.)hotgoo\\.com$\n(?:^|\\.)hotpornshow\\.com$\n(?:^|\\.)hotpot\\.hk$\n(?:^|\\.)hotshame\\.com$\n(?:^|\\.)hotspotshield\\.com$\n(?:^|\\.)hotvpn\\.com$\n(?:^|\\.)hougaige\\.com$\n(?:^|\\.)howtoforge\\.com$\n(?:^|\\.)hoxx\\.com$\n(?:^|\\.)hpa\\.gov\\.tw$\n(?:^|\\.)hqcdp\\.org$\n(?:^|\\.)hqjapanesesex\\.com$\n(?:^|\\.)hqmovies\\.com$\n(?:^|\\.)hqsbnet\\.wordpress\\.com$\n(?:^|\\.)hqsbonline\\.wordpress\\.com$\n(?:^|\\.)hrcchina\\.org$\n(?:^|\\.)hrcir\\.com$\n(?:^|\\.)hrea\\.org$\n(?:^|\\.)hrichina\\.org$\n(?:^|\\.)hrtsea\\.com$\n(?:^|\\.)hrw\\.org$\n(?:^|\\.)hrweb\\.org$\n(?:^|\\.)hsjp\\.net$\n(?:^|\\.)hsselite\\.com$\n(?:^|\\.)hst\\.net\\.tw$\n(?:^|\\.)hstern\\.net$\n(?:^|\\.)hstt\\.net$\n(?:^|\\.)ht\\.ly$\n(?:^|\\.)htkou\\.net$\n(?:^|\\.)htl\\.li$\n(?:^|\\.)html5rocks\\.com$\n(?:^|\\.)https$\n(?:^|\\.)https443\\.net$\n(?:^|\\.)https443\\.org$\n(?:^|\\.)hua-yue\\.net$\n(?:^|\\.)huaglad\\.com$\n(?:^|\\.)huanghuagang\\.org$\n(?:^|\\.)huangyiyu\\.com$\n(?:^|\\.)huaren\\.us$\n(?:^|\\.)huaren4us\\.com$\n(?:^|\\.)huashangnews\\.com$\n(?:^|\\.)huaxia-news\\.com$\n(?:^|\\.)huaxiabao\\.org$\n(?:^|\\.)huaxin\\.ph$\n(?:^|\\.)huayuworld\\.org$\n(?:^|\\.)hudatoriq\\.web\\.id$\n(?:^|\\.)hudson\\.org$\n(?:^|\\.)huffingtonpost\\.com$\n(?:^|\\.)hugoroy\\.eu$\n(?:^|\\.)huhaitai\\.com$\n(?:^|\\.)huhamhire\\.com$\n(?:^|\\.)huiyi\\.in$\n(?:^|\\.)hulkshare\\.com$\n(?:^|\\.)hulu\\.com$\n(?:^|\\.)huluim\\.com$\n(?:^|\\.)hum$\n(?:^|\\.)humanrightsbriefing\\.org$\n(?:^|\\.)hung-ya\\.com$\n(?:^|\\.)hungerstrikeforaids\\.org$\n(?:^|\\.)huobi\\.com$\n(?:^|\\.)huobi\\.pro$\n(?:^|\\.)huobipro\\.com$\n(?:^|\\.)huping\\.net$\n(?:^|\\.)hurgokbayrak\\.com$\n(?:^|\\.)hurriyet\\.com\\.tr$\n(?:^|\\.)hustlercash\\.com$\n(?:^|\\.)hut2\\.ru$\n(?:^|\\.)hutianyi\\.net$\n(?:^|\\.)hutong9\\.net$\n(?:^|\\.)huyandex\\.com$\n(?:^|\\.)hwadzan\\.tw$\n(?:^|\\.)hwayue\\.org\\.tw$\n(?:^|\\.)hwinfo\\.com$\n(?:^|\\.)hxwk\\.org$\n(?:^|\\.)hxwq\\.org$\n(?:^|\\.)hybrid-analysis\\.com$\n(?:^|\\.)hyperrate\\.com$\n(?:^|\\.)i-cable\\.com$\n(?:^|\\.)i-part\\.com\\.tw$\n(?:^|\\.)i\\.lithium\\.com$\n(?:^|\\.)i1\\.hk$\n(?:^|\\.)i2p2\\.de$\n(?:^|\\.)i2runner\\.com$\n(?:^|\\.)i818hk\\.com$\n(?:^|\\.)iam\\.soy$\n(?:^|\\.)iamtopone\\.com$\n(?:^|\\.)iask\\.bz$\n(?:^|\\.)iask\\.ca$\n(?:^|\\.)iav19\\.com$\n(?:^|\\.)ibiblio\\.org$\n(?:^|\\.)iblist\\.com$\n(?:^|\\.)iblogserv-f\\.net$\n(?:^|\\.)ibros\\.org$\n(?:^|\\.)ibvpn\\.com$\n(?:^|\\.)icams\\.com$\n(?:^|\\.)ice\\.audionow\\.com$\n(?:^|\\.)icij\\.org$\n(?:^|\\.)icl-fi\\.org$\n(?:^|\\.)icoco\\.com$\n(?:^|\\.)iconpaper\\.org$\n(?:^|\\.)icu-project\\.org$\n(?:^|\\.)id\\.hao123\\.com$\n(?:^|\\.)id\\.heroku\\.com$\n(?:^|\\.)iddddg\\.com$\n(?:^|\\.)idemocracy\\.asia$\n(?:^|\\.)identi\\.ca$\n(?:^|\\.)idiomconnection\\.com$\n(?:^|\\.)idouga\\.com$\n(?:^|\\.)idreamx\\.com$\n(?:^|\\.)idv\\.tw$\n(?:^|\\.)ieasy5\\.com$\n(?:^|\\.)ied2k\\.net$\n(?:^|\\.)ienergy1\\.com$\n(?:^|\\.)if\\.ttt$\n(?:^|\\.)ifan\\.cz\\.cc$\n(?:^|\\.)ifanqiang\\.com$\n(?:^|\\.)ifcss\\.org$\n(?:^|\\.)ifjc\\.org$\n(?:^|\\.)ifreewares\\.com$\n(?:^|\\.)ift\\.tt$\n(?:^|\\.)igcd\\.net$\n(?:^|\\.)igfw\\.net$\n(?:^|\\.)igfw\\.tech$\n(?:^|\\.)igmg\\.de$\n(?:^|\\.)ignitedetroit\\.net$\n(?:^|\\.)igoogle\\.com$\n(?:^|\\.)igotmail\\.com\\.tw$\n(?:^|\\.)igvita\\.com$\n(?:^|\\.)ihakka\\.net$\n(?:^|\\.)ihao\\.org$\n(?:^|\\.)iicns\\.com$\n(?:^|\\.)iipdigital\\.usembassy\\.gov$\n(?:^|\\.)ikstar\\.com$\n(?:^|\\.)ikwb\\.com$\n(?:^|\\.)illusionfactory\\.com$\n(?:^|\\.)ilove80\\.be$\n(?:^|\\.)ilovelongtoes\\.com$\n(?:^|\\.)im\\.tv$\n(?:^|\\.)im88\\.tw$\n(?:^|\\.)imageab\\.com$\n(?:^|\\.)imagefap\\.com$\n(?:^|\\.)imageflea\\.com$\n(?:^|\\.)images-gaytube\\.com$\n(?:^|\\.)images\\.comico\\.tw$\n(?:^|\\.)imageshack\\.us$\n(?:^|\\.)imagevenue\\.com$\n(?:^|\\.)imagezilla\\.net$\n(?:^|\\.)imb\\.org$\n(?:^|\\.)imdb\\.com$\n(?:^|\\.)img$\n(?:^|\\.)img\\.dlsite\\.jp$\n(?:^|\\.)img\\.ly$\n(?:^|\\.)imgchili\\.net$\n(?:^|\\.)imgmega\\.com$\n(?:^|\\.)imgur\\.com$\n(?:^|\\.)imkev\\.com$\n(?:^|\\.)imlive\\.com$\n(?:^|\\.)immigration\\.gov\\.tw$\n(?:^|\\.)immoral\\.jp$\n(?:^|\\.)impact\\.org\\.au$\n(?:^|\\.)impp\\.mn$\n(?:^|\\.)in-disguise\\.com$\n(?:^|\\.)in99\\.org$\n(?:^|\\.)incapdns\\.net$\n(?:^|\\.)incloak\\.com$\n(?:^|\\.)incredibox\\.fr$\n(?:^|\\.)indiandefensenews\\.in$\n(?:^|\\.)indiemerch\\.com$\n(?:^|\\.)info-graf\\.fr$\n(?:^|\\.)initiativesforchina\\.org$\n(?:^|\\.)inkui\\.com$\n(?:^|\\.)inmediahk\\.net$\n(?:^|\\.)innermongolia\\.org$\n(?:^|\\.)inote\\.tw$\n(?:^|\\.)insecam\\.org$\n(?:^|\\.)insidevoa\\.com$\n(?:^|\\.)instagram\\.com$\n(?:^|\\.)instanthq\\.com$\n(?:^|\\.)institut-tibetain\\.org$\n(?:^|\\.)international-news\\.newsmagazine\\.asia$\n(?:^|\\.)internet\\.org$\n(?:^|\\.)internetdefenseleague\\.org$\n(?:^|\\.)internetfreedom\\.org$\n(?:^|\\.)internetpopculture\\.com$\n(?:^|\\.)inthenameofconfuciusmovie\\.com$\n(?:^|\\.)investigating\\.wordpress\\.com$\n(?:^|\\.)inxian\\.com$\n(?:^|\\.)iownyour\\.biz$\n(?:^|\\.)iownyour\\.org$\n(?:^|\\.)ipalter\\.com$\n(?:^|\\.)ipfire\\.org$\n(?:^|\\.)ipfs\\.io$\n(?:^|\\.)iphone4hongkong\\.com$\n(?:^|\\.)iphonehacks\\.com$\n(?:^|\\.)iphonetaiwan\\.org$\n(?:^|\\.)iphonix\\.fr$\n(?:^|\\.)ipicture\\.ru$\n(?:^|\\.)ipjetable\\.net$\n(?:^|\\.)ipobar\\.com$\n(?:^|\\.)ipoock\\.com$\n(?:^|\\.)iportal\\.me$\n(?:^|\\.)ippotv\\.com$\n(?:^|\\.)ipredator\\.se$\n(?:^|\\.)iptv\\.com\\.tw$\n(?:^|\\.)iptvbin\\.com$\n(?:^|\\.)ipvanish\\.com$\n(?:^|\\.)iredmail\\.org$\n(?:^|\\.)ironbigfools\\.compython\\.net$\n(?:^|\\.)ironpython\\.net$\n(?:^|\\.)ironsocket\\.com$\n(?:^|\\.)is-a-hunter\\.com$\n(?:^|\\.)is\\.gd$\n(?:^|\\.)isaacmao\\.com$\n(?:^|\\.)isasecret\\.com$\n(?:^|\\.)isc\\.sans\\.edu$\n(?:^|\\.)isgreat\\.org$\n(?:^|\\.)islahhaber\\.net$\n(?:^|\\.)islam\\.org\\.hk$\n(?:^|\\.)islamawareness\\.net$\n(?:^|\\.)islamhouse\\.com$\n(?:^|\\.)islamicity\\.com$\n(?:^|\\.)islamicpluralism\\.org$\n(?:^|\\.)islamtoday\\.net$\n(?:^|\\.)ismaelan\\.com$\n(?:^|\\.)ismalltits\\.com$\n(?:^|\\.)ismprofessional\\.net$\n(?:^|\\.)isohunt\\.com$\n(?:^|\\.)israbox\\.com$\n(?:^|\\.)issuu\\.com$\n(?:^|\\.)istars\\.co\\.nz$\n(?:^|\\.)istiqlalhewer\\.com$\n(?:^|\\.)istockphoto\\.com$\n(?:^|\\.)isunaffairs\\.com$\n(?:^|\\.)isuntv\\.com$\n(?:^|\\.)itaboo\\.info$\n(?:^|\\.)itaiwan\\.gov\\.tw$\n(?:^|\\.)italiatibet\\.org$\n(?:^|\\.)itasoftware\\.com$\n(?:^|\\.)itemdb\\.com$\n(?:^|\\.)ithelp\\.ithome\\.com\\.tw$\n(?:^|\\.)its\\.caltech\\.edu$\n(?:^|\\.)itsaol\\.com$\n(?:^|\\.)itshidden\\.com$\n(?:^|\\.)itsky\\.it$\n(?:^|\\.)itweet\\.net$\n(?:^|\\.)iu45\\.com$\n(?:^|\\.)iuhrdf\\.org$\n(?:^|\\.)iuksky\\.com$\n(?:^|\\.)ivacy\\.com$\n(?:^|\\.)iverycd\\.com$\n(?:^|\\.)ivpn\\.net$\n(?:^|\\.)ixquick\\.com$\n(?:^|\\.)ixxx\\.com$\n(?:^|\\.)iyouport\\.com$\n(?:^|\\.)izaobao\\.us$\n(?:^|\\.)izles\\.net$\n(?:^|\\.)izlesem\\.org$\n(?:^|\\.)j\\.mp$\n(?:^|\\.)ja\\.wikipedia\\.org$\n(?:^|\\.)jamaat\\.org$\n(?:^|\\.)jamyangnorbu\\.com$\n(?:^|\\.)jandyx\\.com$\n(?:^|\\.)janwongphoto\\.com$\n(?:^|\\.)japan-whores\\.com$\n(?:^|\\.)japanfirst\\.asianfreeforum\\.com$\n(?:^|\\.)japantimes\\.co\\.jp$\n(?:^|\\.)jav\\.com$\n(?:^|\\.)jav101\\.com$\n(?:^|\\.)jav2be\\.com$\n(?:^|\\.)jav68\\.tv$\n(?:^|\\.)javakiba\\.org$\n(?:^|\\.)javbus\\.com$\n(?:^|\\.)javfor\\.me$\n(?:^|\\.)javhd\\.com$\n(?:^|\\.)javhip\\.com$\n(?:^|\\.)javhub\\.net$\n(?:^|\\.)javhuge\\.com$\n(?:^|\\.)javlibrary\\.com$\n(?:^|\\.)javmobile\\.net$\n(?:^|\\.)javmoo\\.com$\n(?:^|\\.)javmoo\\.xyz$\n(?:^|\\.)javseen\\.com$\n(?:^|\\.)javtag\\.com$\n(?:^|\\.)javzoo\\.com$\n(?:^|\\.)jbtalks\\.cc$\n(?:^|\\.)jbtalks\\.com$\n(?:^|\\.)jbtalks\\.my$\n(?:^|\\.)jcpenney\\.com$\n(?:^|\\.)jdwsy\\.com$\n(?:^|\\.)jeanyim\\.com$\n(?:^|\\.)jetos\\.com$\n(?:^|\\.)jex\\.com$\n(?:^|\\.)jfqu36\\.club$\n(?:^|\\.)jfqu37\\.xyz$\n(?:^|\\.)jgoodies\\.com$\n(?:^|\\.)jiangweiping\\.com$\n(?:^|\\.)jiaoyou8\\.com$\n(?:^|\\.)jiehua\\.cz$\n(?:^|\\.)jieshibaobao\\.com$\n(?:^|\\.)jigglegifs\\.com$\n(?:^|\\.)jigong1024\\.com$\n(?:^|\\.)jihadintel\\.meforum\\.org$\n(?:^|\\.)jihadology\\.net$\n(?:^|\\.)jiji\\.com$\n(?:^|\\.)jims\\.net$\n(?:^|\\.)jinbushe\\.org$\n(?:^|\\.)jingpin\\.org$\n(?:^|\\.)jingsim\\.org$\n(?:^|\\.)jinpianwang\\.com$\n(?:^|\\.)jinroukong\\.com$\n(?:^|\\.)jintian\\.net$\n(?:^|\\.)jinx\\.com$\n(?:^|\\.)jitouch\\.com$\n(?:^|\\.)jizzthis\\.com$\n(?:^|\\.)jjgirls\\.com$\n(?:^|\\.)jkb\\.cc$\n(?:^|\\.)jkforum\\.net$\n(?:^|\\.)jkub\\.com$\n(?:^|\\.)jma\\.go\\.jp$\n(?:^|\\.)jmscult\\.com$\n(?:^|\\.)joachims\\.org$\n(?:^|\\.)jobnewera\\.wordpress\\.com$\n(?:^|\\.)jobso\\.tv$\n(?:^|\\.)joinmastodon\\.org$\n(?:^|\\.)journalchretien\\.net$\n(?:^|\\.)journalofdemocracy\\.org$\n(?:^|\\.)joymiihub\\.com$\n(?:^|\\.)joyourself\\.com$\n(?:^|\\.)jp\\.hao123\\.com$\n(?:^|\\.)jpl\\.nasa\\.gov$\n(?:^|\\.)jpopforum\\.net$\n(?:^|\\.)jtvnw\\.net$\n(?:^|\\.)jubushoushen\\.com$\n(?:^|\\.)juhuaren\\.com$\n(?:^|\\.)jukujo-club\\.com$\n(?:^|\\.)juliepost\\.com$\n(?:^|\\.)juliereyc\\.com$\n(?:^|\\.)junauza\\.com$\n(?:^|\\.)june4commemoration\\.org$\n(?:^|\\.)junefourth-20\\.net$\n(?:^|\\.)jungleheart\\.com$\n(?:^|\\.)juoaa\\.com$\n(?:^|\\.)justdied\\.com$\n(?:^|\\.)justfreevpn\\.com$\n(?:^|\\.)justicefortenzin\\.org$\n(?:^|\\.)justpaste\\.it$\n(?:^|\\.)justtristan\\.com$\n(?:^|\\.)juyuange\\.org$\n(?:^|\\.)juziyue\\.com$\n(?:^|\\.)jwmusic\\.org$\n(?:^|\\.)jyxf\\.net$\n(?:^|\\.)k-doujin\\.net$\n(?:^|\\.)ka-wai\\.com$\n(?:^|\\.)kagyu\\.org$\n(?:^|\\.)kagyu\\.org\\.za$\n(?:^|\\.)kagyumonlam\\.org$\n(?:^|\\.)kagyunews\\.com\\.hk$\n(?:^|\\.)kagyuoffice\\.org$\n(?:^|\\.)kagyuoffice\\.org\\.tw$\n(?:^|\\.)kaiyuan\\.de$\n(?:^|\\.)kakao\\.com$\n(?:^|\\.)kalachakralugano\\.org$\n(?:^|\\.)kankan\\.today$\n(?:^|\\.)kannewyork\\.com$\n(?:^|\\.)kanshifang\\.com$\n(?:^|\\.)kantie\\.org$\n(?:^|\\.)kanzhongguo\\.com$\n(?:^|\\.)kanzhongguo\\.eu$\n(?:^|\\.)kaotic\\.com$\n(?:^|\\.)karayou\\.com$\n(?:^|\\.)karkhung\\.com$\n(?:^|\\.)karmapa-teachings\\.org$\n(?:^|\\.)karmapa\\.org$\n(?:^|\\.)kawaiikawaii\\.jp$\n(?:^|\\.)kawase\\.com$\n(?:^|\\.)kb\\.monitorware\\.com$\n(?:^|\\.)kba-tx\\.org$\n(?:^|\\.)kcoolonline\\.com$\n(?:^|\\.)kebrum\\.com$\n(?:^|\\.)kechara\\.com$\n(?:^|\\.)keepandshare\\.com$\n(?:^|\\.)keezmovies\\.com$\n(?:^|\\.)kendatire\\.com$\n(?:^|\\.)kendincos\\.net$\n(?:^|\\.)kenengba\\.com$\n(?:^|\\.)keontech\\.net$\n(?:^|\\.)kepard\\.com$\n(?:^|\\.)kex\\.com$\n(?:^|\\.)keycdn\\.com$\n(?:^|\\.)khabdha\\.org$\n(?:^|\\.)khatrimaza\\.org$\n(?:^|\\.)khmusic\\.com\\.tw$\n(?:^|\\.)kichiku-doujinko\\.com$\n(?:^|\\.)kik\\.com$\n(?:^|\\.)killwall\\.com$\n(?:^|\\.)kindleren\\.com$\n(?:^|\\.)kineox\\.free\\.fr$\n(?:^|\\.)kingdomsalvation\\.org$\n(?:^|\\.)kinghost\\.com$\n(?:^|\\.)kingstone\\.com\\.tw$\n(?:^|\\.)kink\\.com$\n(?:^|\\.)kinmen\\.org\\.tw$\n(?:^|\\.)kinmen\\.travel$\n(?:^|\\.)kinokuniya\\.com$\n(?:^|\\.)kir\\.jp$\n(?:^|\\.)kissbbao\\.cn$\n(?:^|\\.)kiwi\\.kz$\n(?:^|\\.)kk-whys\\.co\\.jp$\n(?:^|\\.)kkbox\\.com$\n(?:^|\\.)kknews\\.cc$\n(?:^|\\.)kmuh\\.org\\.tw$\n(?:^|\\.)knowledgerush\\.com$\n(?:^|\\.)kobo\\.com$\n(?:^|\\.)kobobooks\\.com$\n(?:^|\\.)kodingen\\.com$\n(?:^|\\.)kompozer\\.net$\n(?:^|\\.)konachan\\.com$\n(?:^|\\.)kone\\.com$\n(?:^|\\.)koolsolutions\\.com$\n(?:^|\\.)koornk\\.com$\n(?:^|\\.)koranmandarin\\.com$\n(?:^|\\.)korenan2\\.com$\n(?:^|\\.)ksdl\\.org$\n(?:^|\\.)ksnews\\.com\\.tw$\n(?:^|\\.)kspcoin\\.com$\n(?:^|\\.)ktzhk\\.com$\n(?:^|\\.)kucoin\\.com$\n(?:^|\\.)kui\\.name$\n(?:^|\\.)kun\\.im$\n(?:^|\\.)kurashsultan\\.com$\n(?:^|\\.)kurtmunger\\.com$\n(?:^|\\.)kusocity\\.com$\n(?:^|\\.)kwcg\\.ca$\n(?:^|\\.)kwongwah\\.com\\.my$\n(?:^|\\.)kxsw\\.life$\n(?:^|\\.)kyofun\\.com$\n(?:^|\\.)kyohk\\.net$\n(?:^|\\.)kyoyue\\.com$\n(?:^|\\.)kyzyhello\\.com$\n(?:^|\\.)kzeng\\.info$\n(?:^|\\.)la-forum\\.org$\n(?:^|\\.)labiennale\\.org$\n(?:^|\\.)ladbrokes\\.com$\n(?:^|\\.)lagranepoca\\.com$\n(?:^|\\.)lalulalu\\.com$\n(?:^|\\.)lama\\.com\\.tw$\n(?:^|\\.)lamayeshe\\.com$\n(?:^|\\.)lamnia\\.co\\.uk$\n(?:^|\\.)lamrim\\.com$\n(?:^|\\.)lanterncn\\.cn$\n(?:^|\\.)lantosfoundation\\.org$\n(?:^|\\.)laod\\.cn$\n(?:^|\\.)laogai\\.org$\n(?:^|\\.)laomiu\\.com$\n(?:^|\\.)laoyang\\.info$\n(?:^|\\.)laptoplockdown\\.com$\n(?:^|\\.)laqingdan\\.net$\n(?:^|\\.)larsgeorge\\.com$\n(?:^|\\.)lastcombat\\.com$\n(?:^|\\.)lastfm\\.es$\n(?:^|\\.)latelinenews\\.com$\n(?:^|\\.)latibet\\.org$\n(?:^|\\.)lbank\\.info$\n(?:^|\\.)ld\\.hao123img\\.com$\n(?:^|\\.)le-vpn\\.com$\n(?:^|\\.)leafyvpn\\.net$\n(?:^|\\.)lecloud\\.net$\n(?:^|\\.)leeao\\.com\\.cn$\n(?:^|\\.)lefora\\.com$\n(?:^|\\.)left21\\.hk$\n(?:^|\\.)legalporno\\.com$\n(?:^|\\.)legaltech\\.law\\.com$\n(?:^|\\.)legsjapan\\.com$\n(?:^|\\.)leirentv\\.ca$\n(?:^|\\.)leisurecafe\\.ca$\n(?:^|\\.)leisurepro\\.com$\n(?:^|\\.)lematin\\.ch$\n(?:^|\\.)lemonde\\.fr$\n(?:^|\\.)lenwhite\\.com$\n(?:^|\\.)lerosua\\.org$\n(?:^|\\.)lers\\.google$\n(?:^|\\.)lesoir\\.be$\n(?:^|\\.)letou\\.com$\n(?:^|\\.)letscorp\\.net$\n(?:^|\\.)lflink\\.com$\n(?:^|\\.)lflinkup\\.com$\n(?:^|\\.)lflinkup\\.net$\n(?:^|\\.)lflinkup\\.org$\n(?:^|\\.)lhakar\\.org$\n(?:^|\\.)lhasocialwork\\.org$\n(?:^|\\.)liangyou\\.net$\n(?:^|\\.)liangzhichuanmei\\.com$\n(?:^|\\.)lianyue\\.net$\n(?:^|\\.)liaowangxizang\\.net$\n(?:^|\\.)liberal\\.org\\.hk$\n(?:^|\\.)libertytimes\\.com\\.tw$\n(?:^|\\.)library\\.usc\\.cuhk\\.edu\\.hk$\n(?:^|\\.)lidecheng\\.com$\n(?:^|\\.)lifemiles\\.com$\n(?:^|\\.)lighten\\.org\\.tw$\n(?:^|\\.)lighti\\.me$\n(?:^|\\.)lightnovel\\.cn$\n(?:^|\\.)lihkg\\.com$\n(?:^|\\.)like\\.com$\n(?:^|\\.)limiao\\.net$\n(?:^|\\.)line-apps\\.com$\n(?:^|\\.)line-scdn\\.net$\n(?:^|\\.)line\\.me$\n(?:^|\\.)line\\.naver\\.jp$\n(?:^|\\.)linear-abematv\\.akamaized\\.net$\n(?:^|\\.)linglingfa\\.com$\n(?:^|\\.)lingvodics\\.com$\n(?:^|\\.)linkedin\\.com$\n(?:^|\\.)link-o-rama\\.com$\n(?:^|\\.)linkideo\\.com$\n(?:^|\\.)linkuswell\\.com$\n(?:^|\\.)linux\\.org\\.hk$\n(?:^|\\.)linuxtoy\\.org$\n(?:^|\\.)lionsroar\\.com$\n(?:^|\\.)lipuman\\.com$\n(?:^|\\.)liquidvpn\\.com$\n(?:^|\\.)listentoyoutube\\.com$\n(?:^|\\.)listorious\\.com$\n(?:^|\\.)lists\\.w3\\.org$\n(?:^|\\.)liu-xiaobo\\.org$\n(?:^|\\.)liudejun\\.com$\n(?:^|\\.)liuhanyu\\.com$\n(?:^|\\.)liujianshu\\.com$\n(?:^|\\.)liuxiaobo\\.net$\n(?:^|\\.)liuxiaotong\\.com$\n(?:^|\\.)livecoin\\.net$\n(?:^|\\.)livedoor\\.jp$\n(?:^|\\.)liveleak\\.com$\n(?:^|\\.)livestation\\.com$\n(?:^|\\.)livestream\\.com$\n(?:^|\\.)livevideo\\.com$\n(?:^|\\.)livingonline\\.us$\n(?:^|\\.)livingstream\\.com$\n(?:^|\\.)liwangyang\\.com$\n(?:^|\\.)lizhizhuangbi\\.com$\n(?:^|\\.)lkcn\\.net$\n(?:^|\\.)llss\\.me$\n(?:^|\\.)load\\.to$\n(?:^|\\.)lobsangwangyal\\.com$\n(?:^|\\.)localbitcoins\\.com$\n(?:^|\\.)localdomain\\.ws$\n(?:^|\\.)localpresshk\\.com$\n(?:^|\\.)lockestek\\.com$\n(?:^|\\.)logbot\\.net$\n(?:^|\\.)login\\.target\\.com$\n(?:^|\\.)logiqx\\.com$\n(?:^|\\.)londonchinese\\.ca$\n(?:^|\\.)longhair\\.hk$\n(?:^|\\.)longmusic\\.com$\n(?:^|\\.)longtermly\\.net$\n(?:^|\\.)longtoes\\.com$\n(?:^|\\.)lookpic\\.com$\n(?:^|\\.)looktoronto\\.com$\n(?:^|\\.)lotsawahouse\\.org$\n(?:^|\\.)lotuslight\\.org\\.hk$\n(?:^|\\.)lotuslight\\.org\\.tw$\n(?:^|\\.)lovetvshow\\.com$\n(?:^|\\.)lpsg\\.com$\n(?:^|\\.)lrfz\\.com$\n(?:^|\\.)lrip\\.org$\n(?:^|\\.)lsd\\.org\\.hk$\n(?:^|\\.)lsforum\\.net$\n(?:^|\\.)lsm\\.org$\n(?:^|\\.)lsmchinese\\.org$\n(?:^|\\.)lsmkorean\\.org$\n(?:^|\\.)lsmradio\\.com$\n(?:^|\\.)lsmwebcast\\.com$\n(?:^|\\.)lsxszzg\\.com$\n(?:^|\\.)ltn\\.com\\.tw$\n(?:^|\\.)luke54\\.com$\n(?:^|\\.)luke54\\.org$\n(?:^|\\.)lupm\\.org$\n(?:^|\\.)lushstories\\.com$\n(?:^|\\.)luxebc\\.com$\n(?:^|\\.)lvhai\\.org$\n(?:^|\\.)lvv2\\.com$\n(?:^|\\.)lyfhk\\.net$\n(?:^|\\.)lzmtnews\\.org$\n(?:^|\\.)m\\.hkgalden\\.com$\n(?:^|\\.)m\\.me$\n(?:^|\\.)m\\.plixi\\.com$\n(?:^|\\.)m\\.slandr\\.net$\n(?:^|\\.)ma\\.hao123\\.com$\n(?:^|\\.)macgamestore\\.com$\n(?:^|\\.)macrovpn\\.com$\n(?:^|\\.)macts\\.com\\.tw$\n(?:^|\\.)mad-ar\\.ch$\n(?:^|\\.)madewithcode\\.com$\n(?:^|\\.)madonna-av\\.com$\n(?:^|\\.)madrau\\.com$\n(?:^|\\.)madthumbs\\.com$\n(?:^|\\.)magazines\\.sina\\.com\\.tw$\n(?:^|\\.)magic-net\\.info$\n(?:^|\\.)mahabodhi\\.org$\n(?:^|\\.)maiio\\.net$\n(?:^|\\.)mail-archive\\.com$\n(?:^|\\.)maildns\\.xyz$\n(?:^|\\.)maiplus\\.com$\n(?:^|\\.)maizhong\\.org$\n(?:^|\\.)makemymood\\.com$\n(?:^|\\.)makkahnewspaper\\.com$\n(?:^|\\.)makzhou\\.warehouse333\\.com$\n(?:^|\\.)malaysiakini\\.com$\n(?:^|\\.)mamingzhe\\.com$\n(?:^|\\.)manchukuo\\.net$\n(?:^|\\.)mangafox\\.com$\n(?:^|\\.)mangafox\\.me$\n(?:^|\\.)maniash\\.com$\n(?:^|\\.)manicur4ik\\.ru$\n(?:^|\\.)mansion\\.com$\n(?:^|\\.)mansionpoker\\.com$\n(?:^|\\.)manta\\.com$\n(?:^|\\.)maplew\\.com$\n(?:^|\\.)marc\\.info$\n(?:^|\\.)marguerite\\.su$\n(?:^|\\.)martau\\.com$\n(?:^|\\.)martincartoons\\.com$\n(?:^|\\.)martsangkagyuofficial\\.org$\n(?:^|\\.)maruta\\.be$\n(?:^|\\.)marxist\\.com$\n(?:^|\\.)marxist\\.net$\n(?:^|\\.)marxists\\.org$\n(?:^|\\.)mash\\.to$\n(?:^|\\.)maskedip\\.com$\n(?:^|\\.)mastodon\\.cloud$\n(?:^|\\.)mastodon\\.host$\n(?:^|\\.)mastodon\\.social$\n(?:^|\\.)matainja\\.com$\n(?:^|\\.)material\\.io$\n(?:^|\\.)mathable\\.io$\n(?:^|\\.)mathiew-badimon\\.com$\n(?:^|\\.)matome-plus\\.com$\n(?:^|\\.)matome-plus\\.net$\n(?:^|\\.)matsushimakaede\\.com$\n(?:^|\\.)matters\\.news$\n(?:^|\\.)mattwilcox\\.net$\n(?:^|\\.)maturejp\\.com$\n(?:^|\\.)maxing\\.jp$\n(?:^|\\.)mayimayi\\.com$\n(?:^|\\.)mcadforums\\.com$\n(?:^|\\.)mcaf\\.ee$\n(?:^|\\.)mcfog\\.com$\n(?:^|\\.)mcreasite\\.com$\n(?:^|\\.)md-t\\.org$\n(?:^|\\.)me\\.me$\n(?:^|\\.)me\\.youthwant\\.com\\.tw$\n(?:^|\\.)meansys\\.com$\n(?:^|\\.)media\\.nu\\.nl$\n(?:^|\\.)media\\.org\\.hk$\n(?:^|\\.)mediachinese\\.com$\n(?:^|\\.)mediafire\\.com$\n(?:^|\\.)mediafreakcity\\.com$\n(?:^|\\.)medium\\.com$\n(?:^|\\.)meetav\\.com$\n(?:^|\\.)meetup\\.com$\n(?:^|\\.)mefeedia\\.com$\n(?:^|\\.)mefound\\.com$\n(?:^|\\.)mega\\.nz$\n(?:^|\\.)megaproxy\\.com$\n(?:^|\\.)megarotic\\.com$\n(?:^|\\.)megavideo\\.com$\n(?:^|\\.)megurineluka\\.com$\n(?:^|\\.)meirixiaochao\\.com$\n(?:^|\\.)meltoday\\.com$\n(?:^|\\.)meme\\.yahoo\\.com$\n(?:^|\\.)memehk\\.com$\n(?:^|\\.)memorybbs\\.com$\n(?:^|\\.)memri\\.org$\n(?:^|\\.)memrijttm\\.org$\n(?:^|\\.)mercatox\\.com$\n(?:^|\\.)mercyprophet\\.org$\n(?:^|\\.)mergersandinquisitions\\.org$\n(?:^|\\.)meridian-trust\\.org$\n(?:^|\\.)meripet\\.biz$\n(?:^|\\.)meripet\\.com$\n(?:^|\\.)merit-times\\.com\\.tw$\n(?:^|\\.)meshrep\\.com$\n(?:^|\\.)mesotw\\.com$\n(?:^|\\.)messenger\\.com$\n(?:^|\\.)metacafe\\.com$\n(?:^|\\.)metart\\.com$\n(?:^|\\.)metarthunter\\.com$\n(?:^|\\.)meteorshowersonline\\.com$\n(?:^|\\.)metrohk\\.com\\.hk$\n(?:^|\\.)metrolife\\.ca$\n(?:^|\\.)metroradio\\.com\\.hk$\n(?:^|\\.)meyou\\.jp$\n(?:^|\\.)meyul\\.com$\n(?:^|\\.)mfxmedia\\.com$\n(?:^|\\.)mgoon\\.com$\n(?:^|\\.)mgstage\\.com$\n(?:^|\\.)mh4u\\.org$\n(?:^|\\.)mhradio\\.org$\n(?:^|\\.)michaelanti\\.com$\n(?:^|\\.)michaelmarketl\\.com$\n(?:^|\\.)microvpn\\.com$\n(?:^|\\.)middle-way\\.net$\n(?:^|\\.)mihk\\.hk$\n(?:^|\\.)mihr\\.com$\n(?:^|\\.)mihua\\.org$\n(?:^|\\.)mike\\.cz\\.cc$\n(?:^|\\.)mikesoltys\\.com$\n(?:^|\\.)milph\\.net$\n(?:^|\\.)milsurps\\.com$\n(?:^|\\.)mimiai\\.net$\n(?:^|\\.)mimivip\\.com$\n(?:^|\\.)mimivv\\.com$\n(?:^|\\.)mindrolling\\.org$\n(?:^|\\.)minghui-a\\.org$\n(?:^|\\.)minghui-b\\.org$\n(?:^|\\.)minghui-school\\.org$\n(?:^|\\.)minghui\\.or\\.kr$\n(?:^|\\.)minghui\\.org$\n(?:^|\\.)minghuiyw\\.wordpress\\.com$\n(?:^|\\.)mingjinglishi\\.com$\n(?:^|\\.)mingjingnews\\.com$\n(?:^|\\.)mingjingtimes\\.com$\n(?:^|\\.)mingpao\\.com$\n(?:^|\\.)mingpaocanada\\.com$\n(?:^|\\.)mingpaomonthly\\.com$\n(?:^|\\.)mingpaonews\\.com$\n(?:^|\\.)mingpaony\\.com$\n(?:^|\\.)mingpaosf\\.com$\n(?:^|\\.)mingpaotor\\.com$\n(?:^|\\.)mingpaovan\\.com$\n(?:^|\\.)mingshengbao\\.com$\n(?:^|\\.)minhhue\\.net$\n(?:^|\\.)miniforum\\.org$\n(?:^|\\.)ministrybooks\\.org$\n(?:^|\\.)minzhuhua\\.net$\n(?:^|\\.)minzhuzhanxian\\.com$\n(?:^|\\.)minzhuzhongguo\\.org$\n(?:^|\\.)miroguide\\.com$\n(?:^|\\.)mirrorbooks\\.com$\n(?:^|\\.)mist\\.vip$\n(?:^|\\.)mitao\\.com\\.tw$\n(?:^|\\.)mitbbs\\.com$\n(?:^|\\.)mitbbsau\\.com$\n(?:^|\\.)mixero\\.com$\n(?:^|\\.)mixpod\\.com$\n(?:^|\\.)mixx\\.com$\n(?:^|\\.)mizzmona\\.com$\n(?:^|\\.)mjib\\.gov\\.tw$\n(?:^|\\.)mjlsh\\.usc\\.cuhk\\.edu\\.hk$\n(?:^|\\.)mk5000\\.com$\n(?:^|\\.)mlcool\\.com$\n(?:^|\\.)mlzs\\.work$\n(?:^|\\.)mm-cg\\.com$\n(?:^|\\.)mmaaxx\\.com$\n(?:^|\\.)mmmca\\.com$\n(?:^|\\.)mnewstv\\.com$\n(?:^|\\.)mo\\.nightlife141\\.com$\n(?:^|\\.)mobatek\\.net$\n(?:^|\\.)mobile01\\.com$\n(?:^|\\.)mobileways\\.de$\n(?:^|\\.)moby\\.to$\n(?:^|\\.)mobypicture\\.com$\n(?:^|\\.)moeaic\\.gov\\.tw$\n(?:^|\\.)moeerolibrary\\.com$\n(?:^|\\.)mofa\\.gov\\.tw$\n(?:^|\\.)mofaxiehui\\.com$\n(?:^|\\.)mofos\\.com$\n(?:^|\\.)mog\\.com$\n(?:^|\\.)mohu\\.club$\n(?:^|\\.)mohu\\.ml$\n(?:^|\\.)mojim\\.com$\n(?:^|\\.)mol\\.gov\\.tw$\n(?:^|\\.)molihua\\.org$\n(?:^|\\.)mondex\\.org$\n(?:^|\\.)money-link\\.com\\.tw$\n(?:^|\\.)moneyhome\\.biz$\n(?:^|\\.)monitorchina\\.org$\n(?:^|\\.)monster\\.com$\n(?:^|\\.)moodyz\\.com$\n(?:^|\\.)moonbbs\\.com$\n(?:^|\\.)moonbingo\\.com$\n(?:^|\\.)morningsun\\.org$\n(?:^|\\.)moroneta\\.com$\n(?:^|\\.)mos\\.ru$\n(?:^|\\.)motherless\\.com$\n(?:^|\\.)motiyun\\.com$\n(?:^|\\.)motor4ik\\.ru$\n(?:^|\\.)mousebreaker\\.com$\n(?:^|\\.)movements\\.org$\n(?:^|\\.)moviefap\\.com$\n(?:^|\\.)mp3buscador\\.com$\n(?:^|\\.)mp3ye\\.eu$\n(?:^|\\.)mpettis\\.com$\n(?:^|\\.)mpfinance\\.com$\n(?:^|\\.)mpinews\\.com$\n(?:^|\\.)mponline\\.hk$\n(?:^|\\.)mqxd\\.org$\n(?:^|\\.)mrbasic\\.com$\n(?:^|\\.)mrbonus\\.com$\n(?:^|\\.)mrface\\.com$\n(?:^|\\.)mrslove\\.com$\n(?:^|\\.)mrtweet\\.com$\n(?:^|\\.)msa-it\\.org$\n(?:^|\\.)msguancha\\.com$\n(?:^|\\.)msha\\.gov$\n(?:^|\\.)mswe1\\.org$\n(?:^|\\.)mthruf\\.com$\n(?:^|\\.)mtw\\.tl$\n(?:^|\\.)muchosucko\\.com$\n(?:^|\\.)mullvad\\.net$\n(?:^|\\.)multiply\\.com$\n(?:^|\\.)multiproxy\\.org$\n(?:^|\\.)multiupload\\.com$\n(?:^|\\.)mummysgold\\.com$\n(?:^|\\.)murmur\\.tw$\n(?:^|\\.)musicade\\.net$\n(?:^|\\.)muslimvideo\\.com$\n(?:^|\\.)muzi\\.com$\n(?:^|\\.)muzi\\.net$\n(?:^|\\.)muzu\\.tv$\n(?:^|\\.)mvdis\\.gov\\.tw$\n(?:^|\\.)mvg\\.jp$\n(?:^|\\.)mx\\.hao123\\.com$\n(?:^|\\.)mx981\\.com$\n(?:^|\\.)my-formosa\\.com$\n(?:^|\\.)my-private-network\\.co\\.uk$\n(?:^|\\.)my-proxy\\.com$\n(?:^|\\.)my\\.mail\\.ru$\n(?:^|\\.)my\\.opera\\.com$\n(?:^|\\.)my\\.pcloud\\.com$\n(?:^|\\.)my03\\.com$\n(?:^|\\.)myactimes\\.com$\n(?:^|\\.)myanniu\\.com$\n(?:^|\\.)myaudiocast\\.com$\n(?:^|\\.)myav\\.com\\.tw$\n(?:^|\\.)mybbs\\.us$\n(?:^|\\.)mybet\\.com$\n(?:^|\\.)myca168\\.com$\n(?:^|\\.)mycanadanow\\.com$\n(?:^|\\.)mychinamyhome\\.com$\n(?:^|\\.)mychinanet\\.com$\n(?:^|\\.)mychinanews\\.com$\n(?:^|\\.)mychinese\\.news$\n(?:^|\\.)mycnnews\\.com$\n(?:^|\\.)mycould\\.com$\n(?:^|\\.)mydad\\.info$\n(?:^|\\.)myddns\\.com$\n(?:^|\\.)myeasytv\\.com$\n(?:^|\\.)myeclipseide\\.com$\n(?:^|\\.)myforum\\.com\\.hk$\n(?:^|\\.)myforum\\.com\\.uk$\n(?:^|\\.)myfreecams\\.com$\n(?:^|\\.)myfreepaysite\\.com$\n(?:^|\\.)myfreshnet\\.com$\n(?:^|\\.)myftp\\.info$\n(?:^|\\.)myftp\\.name$\n(?:^|\\.)myiphide\\.com$\n(?:^|\\.)mykomica\\.org$\n(?:^|\\.)mylftv\\.com$\n(?:^|\\.)mymediarom\\.com$\n(?:^|\\.)mymoe\\.moe$\n(?:^|\\.)mymom\\.info$\n(?:^|\\.)mymusic\\.net\\.tw$\n(?:^|\\.)mynetav\\.net$\n(?:^|\\.)mynetav\\.org$\n(?:^|\\.)mynumber\\.org$\n(?:^|\\.)myparagliding\\.com$\n(?:^|\\.)mypicture\\.info$\n(?:^|\\.)mypop3\\.net$\n(?:^|\\.)mypop3\\.org$\n(?:^|\\.)mypopescu\\.com$\n(?:^|\\.)myradio\\.hk$\n(?:^|\\.)myreadingmanga\\.info$\n(?:^|\\.)mysecondarydns\\.com$\n(?:^|\\.)myshare\\.url\\.com\\.tw$\n(?:^|\\.)mysinablog\\.com$\n(?:^|\\.)mysite\\.verizon\\.net$\n(?:^|\\.)myspace\\.com$\n(?:^|\\.)myspacecdn\\.com$\n(?:^|\\.)mytalkbox\\.com$\n(?:^|\\.)mytizi\\.com$\n(?:^|\\.)mywww\\.biz$\n(?:^|\\.)myz\\.info$\n(?:^|\\.)naacoalition\\.org$\n(?:^|\\.)naitik\\.net$\n(?:^|\\.)nakido\\.com$\n(?:^|\\.)nakuz\\.com$\n(?:^|\\.)nalandabodhi\\.org$\n(?:^|\\.)nalandawest\\.org$\n(?:^|\\.)namgyal\\.org$\n(?:^|\\.)namgyalmonastery\\.org$\n(?:^|\\.)namsisi\\.com$\n(?:^|\\.)nanyang\\.com$\n(?:^|\\.)nanyangpost\\.com$\n(?:^|\\.)nanzao\\.com$\n(?:^|\\.)naol\\.ca$\n(?:^|\\.)naol\\.cc$\n(?:^|\\.)nat\\.gov\\.tw$\n(?:^|\\.)nat\\.moe$\n(?:^|\\.)national-lottery\\.co\\.uk$\n(?:^|\\.)nationsonline\\.org$\n(?:^|\\.)nationwide\\.com$\n(?:^|\\.)naughtyamerica\\.com$\n(?:^|\\.)navyfamily\\.navy\\.mil$\n(?:^|\\.)navyreserve\\.navy\\.mil$\n(?:^|\\.)naweeklytimes\\.com$\n(?:^|\\.)nbtvpn\\.com$\n(?:^|\\.)nccwatch\\.org\\.tw$\n(?:^|\\.)nch\\.com\\.tw$\n(?:^|\\.)ncn\\.org$\n(?:^|\\.)nde\\.de$\n(?:^|\\.)ndr\\.de$\n(?:^|\\.)ned\\.org$\n(?:^|\\.)nekoslovakia\\.net$\n(?:^|\\.)nemesis2\\.qx\\.net$\n(?:^|\\.)neo-miracle\\.com$\n(?:^|\\.)nepusoku\\.com$\n(?:^|\\.)net-fits\\.pro$\n(?:^|\\.)netbirds\\.com$\n(?:^|\\.)netcolony\\.com$\n(?:^|\\.)netflix\\.com$\n(?:^|\\.)netme\\.cc$\n(?:^|\\.)netsneak\\.com$\n(?:^|\\.)network54\\.com$\n(?:^|\\.)networkedblogs\\.com$\n(?:^|\\.)networktunnel\\.net$\n(?:^|\\.)neverforget8964\\.org$\n(?:^|\\.)new-3lunch\\.net$\n(?:^|\\.)new-akiba\\.com$\n(?:^|\\.)new96\\.ca$\n(?:^|\\.)newcenturymc\\.com$\n(?:^|\\.)newcenturynews\\.com$\n(?:^|\\.)newchen\\.com$\n(?:^|\\.)newgrounds\\.com$\n(?:^|\\.)newipnow\\.com$\n(?:^|\\.)newlandmagazine\\.com\\.au$\n(?:^|\\.)newnews\\.ca$\n(?:^|\\.)news\\.cnyes\\.com$\n(?:^|\\.)news\\.hk\\.msn\\.com$\n(?:^|\\.)news\\.hkpeanut\\.com$\n(?:^|\\.)news\\.msn\\.com\\.tw$\n(?:^|\\.)news\\.nationalgeographic\\.com$\n(?:^|\\.)news\\.now\\.com$\n(?:^|\\.)news\\.now\\.com%2fhome$\n(?:^|\\.)news\\.omy\\.sg$\n(?:^|\\.)news\\.seehua\\.com$\n(?:^|\\.)news\\.sina\\.com\\.hk$\n(?:^|\\.)news\\.sina\\.com\\.tw$\n(?:^|\\.)news\\.sinchew\\.com\\.my$\n(?:^|\\.)news\\.singtao\\.ca$\n(?:^|\\.)news\\.tvb\\.com$\n(?:^|\\.)news\\.tvbs\\.com\\.tw$\n(?:^|\\.)news\\.yahoo\\.com$\n(?:^|\\.)news100\\.com\\.tw$\n(?:^|\\.)newsancai\\.com$\n(?:^|\\.)newschinacomment\\.org$\n(?:^|\\.)newscn\\.org$\n(?:^|\\.)newsdetox\\.ca$\n(?:^|\\.)newsdh\\.com$\n(?:^|\\.)newspeak\\.cc$\n(?:^|\\.)newstamago\\.com$\n(?:^|\\.)newstapa\\.org$\n(?:^|\\.)newstarnet\\.com$\n(?:^|\\.)newtaiwan\\.com\\.tw$\n(?:^|\\.)newtalk\\.tw$\n(?:^|\\.)newyorktimes\\.com$\n(?:^|\\.)nexon\\.com$\n(?:^|\\.)next11\\.co\\.jp$\n(?:^|\\.)nextmag\\.com\\.tw$\n(?:^|\\.)nextmedia\\.com$\n(?:^|\\.)nexton-net\\.jp$\n(?:^|\\.)nexttv\\.com\\.tw$\n(?:^|\\.)nf\\.id\\.au$\n(?:^|\\.)nfjtyd\\.com$\n(?:^|\\.)nflxext\\.com$\n(?:^|\\.)nflximg\\.com$\n(?:^|\\.)nflximg\\.net$\n(?:^|\\.)nflxso\\.net$\n(?:^|\\.)nflxvideo\\.net$\n(?:^|\\.)nga\\.mil$\n(?:^|\\.)ngensis\\.com$\n(?:^|\\.)nhentai\\.net$\n(?:^|\\.)nhi\\.gov\\.tw$\n(?:^|\\.)nhk-ondemand\\.jp$\n(?:^|\\.)nic\\.cz\\.cc$\n(?:^|\\.)nic\\.google$\n(?:^|\\.)nic\\.gov$\n(?:^|\\.)nicovideo\\.jp$\n(?:^|\\.)nighost\\.org$\n(?:^|\\.)nikkei\\.com$\n(?:^|\\.)ninecommentaries\\.com$\n(?:^|\\.)ninjacloak\\.com$\n(?:^|\\.)ninjaproxy\\.ninja$\n(?:^|\\.)nintendium\\.com$\n(?:^|\\.)ninth\\.biz$\n(?:^|\\.)niu\\.moe$\n(?:^|\\.)niusnews\\.com$\n(?:^|\\.)njactb\\.org$\n(?:^|\\.)njuice\\.com$\n(?:^|\\.)nko\\.navy\\.mil$\n(?:^|\\.)nlfreevpn\\.com$\n(?:^|\\.)no-ip\\.org$\n(?:^|\\.)nobel\\.se$\n(?:^|\\.)nobelprize\\.org$\n(?:^|\\.)nobodycanstop\\.us$\n(?:^|\\.)nofile\\.io$\n(?:^|\\.)nokogiri\\.org$\n(?:^|\\.)nokola\\.com$\n(?:^|\\.)noodlevpn\\.com$\n(?:^|\\.)norbulingka\\.org$\n(?:^|\\.)nordstrom\\.com$\n(?:^|\\.)nordstromimage\\.com$\n(?:^|\\.)nordstromrack\\.com$\n(?:^|\\.)nordvpn\\.com$\n(?:^|\\.)notify\\.dropboxapi\\.com$\n(?:^|\\.)nottinghampost\\.com$\n(?:^|\\.)novelasia\\.com$\n(?:^|\\.)now\\.com$\n(?:^|\\.)now\\.im$\n(?:^|\\.)nownews\\.com$\n(?:^|\\.)nowtorrents\\.com$\n(?:^|\\.)noypf\\.com$\n(?:^|\\.)npa\\.go\\.jp$\n(?:^|\\.)npa\\.gov\\.tw$\n(?:^|\\.)npnt\\.me$\n(?:^|\\.)nps\\.gov$\n(?:^|\\.)npsboost\\.com$\n(?:^|\\.)nradio\\.me$\n(?:^|\\.)nrk\\.no$\n(?:^|\\.)ns01\\.biz$\n(?:^|\\.)ns01\\.info$\n(?:^|\\.)ns01\\.us$\n(?:^|\\.)ns02\\.biz$\n(?:^|\\.)ns02\\.info$\n(?:^|\\.)ns02\\.us$\n(?:^|\\.)ns1\\.name$\n(?:^|\\.)ns2\\.name$\n(?:^|\\.)ns3\\.name$\n(?:^|\\.)nsc\\.gov\\.tw$\n(?:^|\\.)ntbk\\.gov\\.tw$\n(?:^|\\.)ntbna\\.gov\\.tw$\n(?:^|\\.)ntbt\\.gov\\.tw$\n(?:^|\\.)ntd\\.tv$\n(?:^|\\.)ntdtv\\.ca$\n(?:^|\\.)ntdtv\\.co\\.kr$\n(?:^|\\.)ntdtv\\.com$\n(?:^|\\.)ntdtv\\.cz$\n(?:^|\\.)ntdtv\\.org$\n(?:^|\\.)ntdtv\\.ru$\n(?:^|\\.)ntdtvla\\.com$\n(?:^|\\.)ntrfun\\.com$\n(?:^|\\.)ntsna\\.gov\\.tw$\n(?:^|\\.)nubiles\\.net$\n(?:^|\\.)nuexpo\\.com$\n(?:^|\\.)nukistream\\.com$\n(?:^|\\.)nurgo-software\\.com$\n(?:^|\\.)nusatrip\\.com$\n(?:^|\\.)nutaku\\.net$\n(?:^|\\.)nuuvem\\.com$\n(?:^|\\.)nuvid\\.com$\n(?:^|\\.)nuzcom\\.com$\n(?:^|\\.)nvdst\\.com$\n(?:^|\\.)nvquan\\.org$\n(?:^|\\.)nvtongzhisheng\\.org$\n(?:^|\\.)nwtca\\.org$\n(?:^|\\.)ny\\.stgloballink\\.com$\n(?:^|\\.)ny\\.visiontimes\\.com$\n(?:^|\\.)nyaa\\.eu$\n(?:^|\\.)nydus\\.ca$\n(?:^|\\.)nylon-angel\\.com$\n(?:^|\\.)nylonstockingsonline\\.com$\n(?:^|\\.)nyt\\.com$\n(?:^|\\.)nytchina\\.com$\n(?:^|\\.)nytcn\\.me$\n(?:^|\\.)nytco\\.com$\n(?:^|\\.)nyti\\.ms$\n(?:^|\\.)nytimes\\.com$\n(?:^|\\.)nytimes\\.map\\.fastly\\.net$\n(?:^|\\.)nytimg\\.com$\n(?:^|\\.)nytstyle\\.com$\n(?:^|\\.)nzchinese\\.com$\n(?:^|\\.)nzchinese\\.net\\.nz$\n(?:^|\\.)observechina\\.net$\n(?:^|\\.)obutu\\.com$\n(?:^|\\.)ocaspro\\.com$\n(?:^|\\.)occupytiananmen\\.com$\n(?:^|\\.)oclp\\.hk$\n(?:^|\\.)ocreampies\\.com$\n(?:^|\\.)ocry\\.com$\n(?:^|\\.)october-review\\.org$\n(?:^|\\.)oculus\\.com$\n(?:^|\\.)oculuscdn\\.com$\n(?:^|\\.)oex\\.com$\n(?:^|\\.)offbeatchina\\.com$\n(?:^|\\.)officeoftibet\\.com$\n(?:^|\\.)ofile\\.org$\n(?:^|\\.)ogaoga\\.org$\n(?:^|\\.)ogate\\.org$\n(?:^|\\.)oikos\\.com\\.tw$\n(?:^|\\.)oiktv\\.com$\n(?:^|\\.)oizoblog\\.com$\n(?:^|\\.)ok\\.ru$\n(?:^|\\.)okayfreedom\\.com$\n(?:^|\\.)okex\\.com$\n(?:^|\\.)okk\\.tw$\n(?:^|\\.)old-cat\\.net$\n(?:^|\\.)old\\.honeynet\\.org$\n(?:^|\\.)old\\.nabble\\.com$\n(?:^|\\.)olumpo\\.com$\n(?:^|\\.)olympicwatch\\.org$\n(?:^|\\.)omgili\\.com$\n(?:^|\\.)omni7\\.jp$\n(?:^|\\.)omnitalk\\.com$\n(?:^|\\.)omnitalk\\.org$\n(?:^|\\.)on\\.cc$\n(?:^|\\.)on2\\.com$\n(?:^|\\.)onapp\\.com$\n(?:^|\\.)onedrive\\.live\\.com$\n(?:^|\\.)onedumb\\.com$\n(?:^|\\.)onejav\\.com$\n(?:^|\\.)onion\\.city$\n(?:^|\\.)online\\.recoveryversion\\.org$\n(?:^|\\.)onlinecha\\.com$\n(?:^|\\.)onlineyoutube\\.com$\n(?:^|\\.)onlytweets\\.com$\n(?:^|\\.)onmoon\\.com$\n(?:^|\\.)onmoon\\.net$\n(?:^|\\.)onmypc\\.biz$\n(?:^|\\.)onmypc\\.info$\n(?:^|\\.)onmypc\\.net$\n(?:^|\\.)onmypc\\.org$\n(?:^|\\.)onmypc\\.us$\n(?:^|\\.)onthehunt\\.com$\n(?:^|\\.)ontrac\\.com$\n(?:^|\\.)oopsforum\\.com$\n(?:^|\\.)open\\.com\\.hk$\n(?:^|\\.)openallweb\\.com$\n(?:^|\\.)opendemocracy\\.net$\n(?:^|\\.)opendn\\.xyz$\n(?:^|\\.)openervpn\\.in$\n(?:^|\\.)openid\\.net$\n(?:^|\\.)openleaks\\.org$\n(?:^|\\.)openvpn\\.net$\n(?:^|\\.)openvpn\\.org$\n(?:^|\\.)openwebster\\.com$\n(?:^|\\.)openwrt\\.org\\.cn$\n(?:^|\\.)opml\\.radiotime\\.com$\n(?:^|\\.)opus-gaming\\.com$\n(?:^|\\.)organcare\\.org\\.tw$\n(?:^|\\.)organharvestinvestigation\\.net$\n(?:^|\\.)organiccrap\\.com$\n(?:^|\\.)orgasm\\.com$\n(?:^|\\.)orgfree\\.com$\n(?:^|\\.)orient-doll\\.com$\n(?:^|\\.)orientaldaily\\.com\\.my$\n(?:^|\\.)orn\\.jp$\n(?:^|\\.)orzistic\\.org$\n(?:^|\\.)osfoora\\.com$\n(?:^|\\.)otcbtc\\.com$\n(?:^|\\.)otnd\\.org$\n(?:^|\\.)otto\\.de$\n(?:^|\\.)otzo\\.com$\n(?:^|\\.)ourdearamy\\.com$\n(?:^|\\.)ourhobby\\.com$\n(?:^|\\.)oursogo\\.com$\n(?:^|\\.)oursteps\\.com\\.au$\n(?:^|\\.)oursweb\\.net$\n(?:^|\\.)ourtv\\.hk$\n(?:^|\\.)overplay\\.net$\n(?:^|\\.)oversea\\.istarshine\\.com$\n(?:^|\\.)ow\\.ly$\n(?:^|\\.)owl\\.li$\n(?:^|\\.)oyax\\.com$\n(?:^|\\.)oyghan\\.com$\n(?:^|\\.)ozchinese\\.com$\n(?:^|\\.)ozvoice\\.org$\n(?:^|\\.)ozxw\\.com$\n(?:^|\\.)ozyoyo\\.com$\n(?:^|\\.)pachosting\\.com$\n(?:^|\\.)pacificpoker\\.com$\n(?:^|\\.)packages\\.debian\\.org$\n(?:^|\\.)packetix\\.net$\n(?:^|\\.)pacopacomama\\.com$\n(?:^|\\.)padmanet\\.com$\n(?:^|\\.)page\\.bid\\.yahoo\\.com$\n(?:^|\\.)page2rss\\.com$\n(?:^|\\.)pagodabox\\.com$\n(?:^|\\.)palacemoon\\.com$\n(?:^|\\.)paldengyal\\.com$\n(?:^|\\.)paljorpublications\\.com$\n(?:^|\\.)paltalk\\.com$\n(?:^|\\.)panamapapers\\.sueddeutsche\\.de$\n(?:^|\\.)pandapow\\.co$\n(?:^|\\.)pandapow\\.net$\n(?:^|\\.)pandavpn-jp\\.com$\n(?:^|\\.)pandora\\.com$\n(?:^|\\.)pandora\\.tv$\n(?:^|\\.)panluan\\.net$\n(?:^|\\.)panoramio\\.com$\n(?:^|\\.)pao-pao\\.net$\n(?:^|\\.)paper\\.li$\n(?:^|\\.)paperb\\.us$\n(?:^|\\.)paradisehill\\.cc$\n(?:^|\\.)paradisepoker\\.com$\n(?:^|\\.)parkansky\\.com$\n(?:^|\\.)partycasino\\.com$\n(?:^|\\.)partypoker\\.com$\n(?:^|\\.)passion\\.com$\n(?:^|\\.)passiontimes\\.hk$\n(?:^|\\.)paste\\.ee$\n(?:^|\\.)pastebin\\.com$\n(?:^|\\.)pastie\\.org$\n(?:^|\\.)pbs\\.org$\n(?:^|\\.)pbwiki\\.com$\n(?:^|\\.)pbworks\\.com$\n(?:^|\\.)pbxes\\.com$\n(?:^|\\.)pbxes\\.org$\n(?:^|\\.)pcanywhere\\.net$\n(?:^|\\.)pcc\\.gov\\.tw$\n(?:^|\\.)pcdvd\\.com\\.tw$\n(?:^|\\.)pchome\\.com\\.tw$\n(?:^|\\.)pcij\\.org$\n(?:^|\\.)pcstore\\.com\\.tw$\n(?:^|\\.)pct\\.org\\.tw$\n(?:^|\\.)pdetails\\.com$\n(?:^|\\.)pdproxy\\.com$\n(?:^|\\.)pds\\.nasa\\.gov$\n(?:^|\\.)peace\\.ca$\n(?:^|\\.)peacefire\\.org$\n(?:^|\\.)peacehall\\.com$\n(?:^|\\.)pearlher\\.org$\n(?:^|\\.)peeasian\\.com$\n(?:^|\\.)pekingduck\\.org$\n(?:^|\\.)pemulihan\\.or\\.id$\n(?:^|\\.)pen\\.io$\n(?:^|\\.)penchinese\\.com$\n(?:^|\\.)penchinese\\.net$\n(?:^|\\.)pengyulong\\.com$\n(?:^|\\.)penisbot\\.com$\n(?:^|\\.)penthouse\\.com$\n(?:^|\\.)pentoy\\.hk$\n(?:^|\\.)peoplebookcafe\\.com$\n(?:^|\\.)peoplenews\\.tw$\n(?:^|\\.)peopo\\.org$\n(?:^|\\.)percy\\.in$\n(?:^|\\.)perfectgirls\\.net$\n(?:^|\\.)perfectvpn\\.net$\n(?:^|\\.)periscope\\.tv$\n(?:^|\\.)persecutionblog\\.com$\n(?:^|\\.)persiankitty\\.com$\n(?:^|\\.)pfd\\.org\\.hk$\n(?:^|\\.)phapluan\\.org$\n(?:^|\\.)phayul\\.com$\n(?:^|\\.)philborges\\.com$\n(?:^|\\.)philly\\.com$\n(?:^|\\.)phmsociety\\.org$\n(?:^|\\.)phncdn\\.com$\n(?:^|\\.)phobos\\.apple\\.com$\n(?:^|\\.)phosphation13\\.rssing\\.com$\n(?:^|\\.)photodharma\\.net$\n(?:^|\\.)photofocus\\.com$\n(?:^|\\.)phuquocservices\\.com$\n(?:^|\\.)picacomic\\.com$\n(?:^|\\.)picacomiccn\\.com$\n(?:^|\\.)picasaweb\\.com$\n(?:^|\\.)picidae\\.net$\n(?:^|\\.)pictures\\.playboy\\.com$\n(?:^|\\.)picturesocial\\.com$\n(?:^|\\.)pin-cong\\.com$\n(?:^|\\.)pin6\\.com$\n(?:^|\\.)pincong\\.rocks$\n(?:^|\\.)ping\\.fm$\n(?:^|\\.)pinimg\\.com$\n(?:^|\\.)pinkrod\\.com$\n(?:^|\\.)pinoy-n\\.com$\n(?:^|\\.)pinterest\\.at$\n(?:^|\\.)pinterest\\.ca$\n(?:^|\\.)pinterest\\.co\\.kr$\n(?:^|\\.)pinterest\\.co\\.uk$\n(?:^|\\.)pinterest\\.com$\n(?:^|\\.)pinterest\\.de$\n(?:^|\\.)pinterest\\.dk$\n(?:^|\\.)pinterest\\.fr$\n(?:^|\\.)pinterest\\.jp$\n(?:^|\\.)pinterest\\.nl$\n(?:^|\\.)pinterest\\.se$\n(?:^|\\.)pioneer-worker\\.forums-free\\.com$\n(?:^|\\.)pipii\\.tv$\n(?:^|\\.)piposay\\.com$\n(?:^|\\.)piraattilahti\\.org$\n(?:^|\\.)piring\\.com$\n(?:^|\\.)pixelqi\\.com$\n(?:^|\\.)pixiv\\.net$\n(?:^|\\.)pixnet\\.net$\n(?:^|\\.)pk\\.com$\n(?:^|\\.)pki\\.goog$\n(?:^|\\.)placemix\\.com$\n(?:^|\\.)playboy\\.com$\n(?:^|\\.)playboyplus\\.com$\n(?:^|\\.)player\\.fm$\n(?:^|\\.)playno1\\.com$\n(?:^|\\.)playpcesor\\.com$\n(?:^|\\.)plays\\.com\\.tw$\n(?:^|\\.)plm\\.org\\.hk$\n(?:^|\\.)plunder\\.com$\n(?:^|\\.)plurk\\.com$\n(?:^|\\.)plus\\.codes$\n(?:^|\\.)plus28\\.com$\n(?:^|\\.)plusbb\\.com$\n(?:^|\\.)pmatehunter\\.com$\n(?:^|\\.)pmates\\.com$\n(?:^|\\.)po2b\\.com$\n(?:^|\\.)pobieramy\\.top$\n(?:^|\\.)podictionary\\.com$\n(?:^|\\.)pokerstars\\.com$\n(?:^|\\.)pokerstars\\.net$\n(?:^|\\.)politicalchina\\.org$\n(?:^|\\.)politicalconsultation\\.org$\n(?:^|\\.)politiscales\\.net$\n(?:^|\\.)poloniex\\.com$\n(?:^|\\.)polymer-project\\.org$\n(?:^|\\.)polymerhk\\.com$\n(?:^|\\.)popo\\.tw$\n(?:^|\\.)popvote\\.hk$\n(?:^|\\.)popyard\\.com$\n(?:^|\\.)popyard\\.org$\n(?:^|\\.)porn\\.com$\n(?:^|\\.)porn2\\.com$\n(?:^|\\.)porn5\\.com$\n(?:^|\\.)pornbase\\.org$\n(?:^|\\.)pornerbros\\.com$\n(?:^|\\.)pornhd\\.com$\n(?:^|\\.)pornhost\\.com$\n(?:^|\\.)pornhub\\.com$\n(?:^|\\.)pornhubdeutsch\\.net$\n(?:^|\\.)pornmm\\.net$\n(?:^|\\.)pornoxo\\.com$\n(?:^|\\.)pornrapidshare\\.com$\n(?:^|\\.)pornsharing\\.com$\n(?:^|\\.)pornsocket\\.com$\n(?:^|\\.)pornstarclub\\.com$\n(?:^|\\.)porntube\\.com$\n(?:^|\\.)porntubenews\\.com$\n(?:^|\\.)porntvblog\\.com$\n(?:^|\\.)pornvisit\\.com$\n(?:^|\\.)port25\\.biz$\n(?:^|\\.)portablevpn\\.nl$\n(?:^|\\.)poskotanews\\.com$\n(?:^|\\.)post01\\.com$\n(?:^|\\.)post76\\.com$\n(?:^|\\.)post852\\.com$\n(?:^|\\.)postadult\\.com$\n(?:^|\\.)postimg\\.org$\n(?:^|\\.)potato\\.im$\n(?:^|\\.)potvpn\\.com$\n(?:^|\\.)power\\.com$\n(?:^|\\.)powerapple\\.com$\n(?:^|\\.)powercx\\.com$\n(?:^|\\.)powerphoto\\.org$\n(?:^|\\.)prayforchina\\.net$\n(?:^|\\.)premeforwindows7\\.com$\n(?:^|\\.)premproxy\\.com$\n(?:^|\\.)presentationzen\\.com$\n(?:^|\\.)presidentlee\\.tw$\n(?:^|\\.)prestige-av\\.com$\n(?:^|\\.)pride\\.google$\n(?:^|\\.)prism-break\\.org$\n(?:^|\\.)prisoner-state-secret-journal-premier$\n(?:^|\\.)prisoneralert\\.com$\n(?:^|\\.)pritunl\\.com$\n(?:^|\\.)privacybox\\.de$\n(?:^|\\.)private\\.com$\n(?:^|\\.)privateinternetaccess\\.com$\n(?:^|\\.)privatepaste\\.com$\n(?:^|\\.)privatetunnel\\.com$\n(?:^|\\.)privatevpn\\.com$\n(?:^|\\.)procopytips\\.com$\n(?:^|\\.)prosiben\\.de$\n(?:^|\\.)protonvpn\\.com$\n(?:^|\\.)provideocoalition\\.com$\n(?:^|\\.)provpnaccounts\\.com$\n(?:^|\\.)proxfree\\.com$\n(?:^|\\.)proxifier\\.com$\n(?:^|\\.)proxomitron\\.info$\n(?:^|\\.)proxpn\\.com$\n(?:^|\\.)proxyanonimo\\.es$\n(?:^|\\.)proxydns\\.com$\n(?:^|\\.)proxylist\\.org\\.uk$\n(?:^|\\.)proxynetwork\\.org\\.uk$\n(?:^|\\.)proxypy\\.net$\n(?:^|\\.)proxyroad\\.com$\n(?:^|\\.)proxytunnel\\.net$\n(?:^|\\.)proyectoclubes\\.com$\n(?:^|\\.)prozz\\.net$\n(?:^|\\.)psblog\\.name$\n(?:^|\\.)pscp\\.tv$\n(?:^|\\.)psiphon\\.ca$\n(?:^|\\.)psiphon\\.civisec\\.org$\n(?:^|\\.)psiphon3\\.com$\n(?:^|\\.)psiphontoday\\.com$\n(?:^|\\.)pts\\.org\\.tw$\n(?:^|\\.)ptt\\.cc$\n(?:^|\\.)pttvan\\.org$\n(?:^|\\.)pubu\\.com\\.tw$\n(?:^|\\.)puffinbrowser\\.com$\n(?:^|\\.)puffstore\\.com$\n(?:^|\\.)pullfolio\\.com$\n(?:^|\\.)pulse\\.yahoo\\.com$\n(?:^|\\.)punyu\\.com$\n(?:^|\\.)pure18\\.com$\n(?:^|\\.)pureconcepts\\.net$\n(?:^|\\.)pureinsight\\.org$\n(?:^|\\.)purepdf\\.com$\n(?:^|\\.)purevpn\\.com$\n(?:^|\\.)purplelotus\\.org$\n(?:^|\\.)pursuestar\\.com$\n(?:^|\\.)pushchinawall\\.com$\n(?:^|\\.)pussyspace\\.com$\n(?:^|\\.)putihome\\.org$\n(?:^|\\.)putlocker\\.com$\n(?:^|\\.)putty\\.org$\n(?:^|\\.)puuko\\.com$\n(?:^|\\.)pwned\\.com$\n(?:^|\\.)python\\.com$\n(?:^|\\.)python\\.com\\.tw$\n(?:^|\\.)pythonhackers\\.com$\n(?:^|\\.)pytorch\\.org$\n(?:^|\\.)q%3dfreedom$\n(?:^|\\.)q%3dtriangle$\n(?:^|\\.)q=freedom$\n(?:^|\\.)q=triangle$\n(?:^|\\.)qanote\\.com$\n(?:^|\\.)qgirl\\.com\\.tw$\n(?:^|\\.)qhigh\\.com$\n(?:^|\\.)qi-gong\\.me$\n(?:^|\\.)qiandao\\.today$\n(?:^|\\.)qiangyou\\.org$\n(?:^|\\.)qidian\\.ca$\n(?:^|\\.)qienkuen\\.org$\n(?:^|\\.)qiwen\\.lu$\n(?:^|\\.)qixianglu\\.cn$\n(?:^|\\.)qkshare\\.com$\n(?:^|\\.)qoos\\.com$\n(?:^|\\.)qpoe\\.com$\n(?:^|\\.)qq\\.co\\.za$\n(?:^|\\.)qstatus\\.com$\n(?:^|\\.)qtrac\\.eu$\n(?:^|\\.)qtweeter\\.com$\n(?:^|\\.)quannengshen\\.org$\n(?:^|\\.)quantumbooter\\.net$\n(?:^|\\.)questvisual\\.com$\n(?:^|\\.)quitccp\\.net$\n(?:^|\\.)quitccp\\.org$\n(?:^|\\.)quora\\.com$\n(?:^|\\.)quoracdn\\.net$\n(?:^|\\.)quran\\.com$\n(?:^|\\.)quranexplorer\\.com$\n(?:^|\\.)qusi8\\.net$\n(?:^|\\.)qvodzy\\.org$\n(?:^|\\.)qxbbs\\.org$\n(?:^|\\.)r18\\.com$\n(?:^|\\.)ra\\.gg$\n(?:^|\\.)radicalparty\\.org$\n(?:^|\\.)radiko\\.jp$\n(?:^|\\.)radioaustralia\\.net\\.au$\n(?:^|\\.)radiohilight\\.net$\n(?:^|\\.)radiovaticana\\.org$\n(?:^|\\.)radiovncr\\.com$\n(?:^|\\.)rael\\.org$\n(?:^|\\.)raggedbanner\\.com$\n(?:^|\\.)raidcall\\.com\\.tw$\n(?:^|\\.)raidtalk\\.com\\.tw$\n(?:^|\\.)rainbowplan\\.org$\n(?:^|\\.)raizoji\\.or\\.jp$\n(?:^|\\.)ramcity\\.com\\.au$\n(?:^|\\.)rangwang\\.biz$\n(?:^|\\.)rangzen\\.com$\n(?:^|\\.)rangzen\\.net$\n(?:^|\\.)rangzen\\.org$\n(?:^|\\.)ranyunfei\\.com$\n(?:^|\\.)rapbull\\.net$\n(?:^|\\.)rapidgator\\.net$\n(?:^|\\.)rapidmoviez\\.com$\n(?:^|\\.)rapidvpn\\.com$\n(?:^|\\.)raremovie\\.cc$\n(?:^|\\.)raremovie\\.net$\n(?:^|\\.)rawgit\\.com$\n(?:^|\\.)rawgithub\\.com$\n(?:^|\\.)razyboard\\.com$\n(?:^|\\.)rcam\\.target\\.com$\n(?:^|\\.)rcinet\\.ca$\n(?:^|\\.)rconversation\\.blogs\\.com$\n(?:^|\\.)rd\\.com$\n(?:^|\\.)rdio\\.com$\n(?:^|\\.)read01\\.com$\n(?:^|\\.)read100\\.com$\n(?:^|\\.)readingtimes\\.com\\.tw$\n(?:^|\\.)readmoo\\.com$\n(?:^|\\.)readydown\\.com$\n(?:^|\\.)realcourage\\.org$\n(?:^|\\.)realforum\\.zkiz\\.com$\n(?:^|\\.)realitykings\\.com$\n(?:^|\\.)realraptalk\\.com$\n(?:^|\\.)realsexpass\\.com$\n(?:^|\\.)rebatesrule\\.net$\n(?:^|\\.)recordhistory\\.org$\n(?:^|\\.)recovery\\.org\\.tw$\n(?:^|\\.)recoveryversion\\.com\\.tw$\n(?:^|\\.)red-lang\\.org$\n(?:^|\\.)redballoonsolidarity\\.org$\n(?:^|\\.)redchinacn\\.net$\n(?:^|\\.)redchinacn\\.org$\n(?:^|\\.)redd\\.it$\n(?:^|\\.)reddit\\.com$\n(?:^|\\.)redditlist\\.com$\n(?:^|\\.)redditmedia\\.com$\n(?:^|\\.)redditstatic\\.com$\n(?:^|\\.)redhotlabs\\.com$\n(?:^|\\.)redtube\\.com$\n(?:^|\\.)referer\\.us$\n(?:^|\\.)reflectivecode\\.com$\n(?:^|\\.)registry\\.google$\n(?:^|\\.)relaxbbs\\.com$\n(?:^|\\.)relay\\.com\\.tw$\n(?:^|\\.)releaseinternational\\.org$\n(?:^|\\.)religioustolerance\\.org$\n(?:^|\\.)remembering_tiananmen_20_years$\n(?:^|\\.)renminbao\\.com$\n(?:^|\\.)renyurenquan\\.org$\n(?:^|\\.)research\\.jmsc\\.hku\\.hk$\n(?:^|\\.)resilio\\.com$\n(?:^|\\.)retweeteffect\\.com$\n(?:^|\\.)retweetist\\.com$\n(?:^|\\.)retweetrank\\.com$\n(?:^|\\.)reuters\\.com$\n(?:^|\\.)reutersmedia\\.net$\n(?:^|\\.)revleft\\.com$\n(?:^|\\.)revver\\.com$\n(?:^|\\.)rfa\\.org$\n(?:^|\\.)rfachina\\.com$\n(?:^|\\.)rfalive1\\.akacast\\.akamaistream\\.net$\n(?:^|\\.)rfamobile\\.org$\n(?:^|\\.)rfaweb\\.org$\n(?:^|\\.)rferl\\.org$\n(?:^|\\.)rfi\\.fr$\n(?:^|\\.)rfi\\.my$\n(?:^|\\.)rg3\\.github\\.io$\n(?:^|\\.)rightbtc\\.com$\n(?:^|\\.)rigpa\\.org$\n(?:^|\\.)riku\\.me$\n(?:^|\\.)rileyguide\\.com$\n(?:^|\\.)ritouki\\.jp$\n(?:^|\\.)ritter\\.vg$\n(?:^|\\.)rixcloud\\.com$\n(?:^|\\.)rixcloud\\.us$\n(?:^|\\.)rlwlw\\.com$\n(?:^|\\.)rmjdw\\.com$\n(?:^|\\.)rmjdw132\\.info$\n(?:^|\\.)roadshow\\.hk$\n(?:^|\\.)roboforex\\.com$\n(?:^|\\.)robustnessiskey\\.com$\n(?:^|\\.)rocket-inc\\.net$\n(?:^|\\.)rocksdb\\.org$\n(?:^|\\.)rojo\\.com$\n(?:^|\\.)rolia\\.net$\n(?:^|\\.)ronjoneswriter\\.com$\n(?:^|\\.)roodo\\.com$\n(?:^|\\.)rosechina\\.net$\n(?:^|\\.)rotten\\.com$\n(?:^|\\.)rsdlmonitor\\.com$\n(?:^|\\.)rsf-chinese\\.org$\n(?:^|\\.)rsf\\.org$\n(?:^|\\.)rsgamen\\.org$\n(?:^|\\.)rssmeme\\.com$\n(?:^|\\.)rtalabel\\.org$\n(?:^|\\.)rthk\\.hk$\n(?:^|\\.)rthk\\.org\\.hk$\n(?:^|\\.)rthklive2-lh\\.akamaihd\\.net$\n(?:^|\\.)rti\\.org\\.tw$\n(?:^|\\.)rtycminnesota\\.org$\n(?:^|\\.)ruanyifeng\\.com$\n(?:^|\\.)rukor\\.org$\n(?:^|\\.)runbtx\\.com$\n(?:^|\\.)rushbee\\.com$\n(?:^|\\.)ruten\\.com\\.tw$\n(?:^|\\.)rutube\\.ru$\n(?:^|\\.)ruyiseek\\.com$\n(?:^|\\.)rxhj\\.net$\n(?:^|\\.)s-cute\\.com$\n(?:^|\\.)s-dragon\\.org$\n(?:^|\\.)s1\\.nudezz\\.com$\n(?:^|\\.)s1heng\\.com$\n(?:^|\\.)s1s1s1\\.com$\n(?:^|\\.)s3-ap-northeast-1\\.amazonaws\\.com$\n(?:^|\\.)s3-ap-southeast-2\\.amazonaws\\.com$\n(?:^|\\.)s8forum\\.com$\n(?:^|\\.)sa\\.hao123\\.com$\n(?:^|\\.)sacks\\.com$\n(?:^|\\.)sacom\\.hk$\n(?:^|\\.)sadistic-v\\.com$\n(?:^|\\.)sadpanda\\.us$\n(?:^|\\.)safervpn\\.com$\n(?:^|\\.)safety\\.google$\n(?:^|\\.)saintyculture\\.com$\n(?:^|\\.)saiq\\.me$\n(?:^|\\.)sakuralive\\.com$\n(?:^|\\.)sakya\\.org$\n(?:^|\\.)salvation\\.org\\.hk$\n(?:^|\\.)samair\\.ru$\n(?:^|\\.)sambhota\\.org$\n(?:^|\\.)sanmin\\.com\\.tw$\n(?:^|\\.)sapikachu\\.net$\n(?:^|\\.)saveliuxiaobo\\.com$\n(?:^|\\.)savemedia\\.com$\n(?:^|\\.)savethedate\\.foo$\n(?:^|\\.)savethesounds\\.info$\n(?:^|\\.)savetibet\\.de$\n(?:^|\\.)savetibet\\.fr$\n(?:^|\\.)savetibet\\.nl$\n(?:^|\\.)savetibet\\.org$\n(?:^|\\.)savetibet\\.ru$\n(?:^|\\.)savetibetstore\\.org$\n(?:^|\\.)savevid\\.com$\n(?:^|\\.)say2\\.info$\n(?:^|\\.)sbme\\.me$\n(?:^|\\.)sbs\\.com\\.au$\n(?:^|\\.)scache\\.vzw\\.com$\n(?:^|\\.)scache1\\.vzw\\.com$\n(?:^|\\.)scache2\\.vzw\\.com$\n(?:^|\\.)scasino\\.com$\n(?:^|\\.)schema\\.org$\n(?:^|\\.)sciencenets\\.com$\n(?:^|\\.)scieron\\.com$\n(?:^|\\.)scmp\\.com$\n(?:^|\\.)scmpchinese\\.com$\n(?:^|\\.)scramble\\.io$\n(?:^|\\.)scribd\\.com$\n(?:^|\\.)scriptspot\\.com$\n(?:^|\\.)seapuff\\.com$\n(?:^|\\.)search$\n(?:^|\\.)search\\.aol\\.com$\n(?:^|\\.)search\\.yahoo\\.co\\.jp$\n(?:^|\\.)search\\.yahoo\\.com$\n(?:^|\\.)searchtruth\\.com$\n(?:^|\\.)secretchina\\.com$\n(?:^|\\.)secretgarden\\.no$\n(?:^|\\.)secretsline\\.biz$\n(?:^|\\.)secure\\.hustler\\.com$\n(?:^|\\.)secure\\.logmein\\.com$\n(?:^|\\.)secure\\.raxcdn\\.com$\n(?:^|\\.)securetunnel\\.com$\n(?:^|\\.)securityinabox\\.org$\n(?:^|\\.)securitykiss\\.com$\n(?:^|\\.)seed4\\.me$\n(?:^|\\.)seesmic\\.com$\n(?:^|\\.)seevpn\\.com$\n(?:^|\\.)seezone\\.net$\n(?:^|\\.)sejie\\.com$\n(?:^|\\.)sellclassics\\.com$\n(?:^|\\.)sendsmtp\\.com$\n(?:^|\\.)sendspace\\.com$\n(?:^|\\.)servehttp\\.com$\n(?:^|\\.)serveuser\\.com$\n(?:^|\\.)serveusers\\.com$\n(?:^|\\.)sesawe\\.net$\n(?:^|\\.)sesawe\\.org$\n(?:^|\\.)sethwklein\\.net$\n(?:^|\\.)setn\\.com$\n(?:^|\\.)settv\\.com\\.tw$\n(?:^|\\.)sevenload\\.com$\n(?:^|\\.)sex-11\\.com$\n(?:^|\\.)sex\\.com$\n(?:^|\\.)sex3\\.com$\n(?:^|\\.)sex8\\.cc$\n(?:^|\\.)sexandsubmission\\.com$\n(?:^|\\.)sexbot\\.com$\n(?:^|\\.)sexhu\\.com$\n(?:^|\\.)sexhuang\\.com$\n(?:^|\\.)sexidude\\.com$\n(?:^|\\.)sexinsex\\.net$\n(?:^|\\.)sextvx\\.com$\n(?:^|\\.)sexxxy\\.biz$\n(?:^|\\.)sfileydy\\.com$\n(?:^|\\.)sfshibao\\.com$\n(?:^|\\.)sftindia\\.org$\n(?:^|\\.)sftuk\\.org$\n(?:^|\\.)shadeyouvpn\\.com$\n(?:^|\\.)shadow\\.ma$\n(?:^|\\.)shadowsky\\.xyz$\n(?:^|\\.)shadowsocks-r\\.com$\n(?:^|\\.)shadowsocks\\.asia$\n(?:^|\\.)shadowsocks\\.be$\n(?:^|\\.)shadowsocks\\.com$\n(?:^|\\.)shadowsocks\\.com\\.hk$\n(?:^|\\.)shadowsocks\\.org$\n(?:^|\\.)shadowsocks9\\.com$\n(?:^|\\.)shambalapost\\.com$\n(?:^|\\.)shambhalasun\\.com$\n(?:^|\\.)shangfang\\.org$\n(?:^|\\.)shapeservices\\.com$\n(?:^|\\.)share\\.america\\.gov$\n(?:^|\\.)share\\.dmhy\\.org$\n(?:^|\\.)share\\.ovi\\.com$\n(?:^|\\.)share\\.youthwant\\.com\\.tw$\n(?:^|\\.)sharebee\\.com$\n(?:^|\\.)sharecool\\.org$\n(?:^|\\.)sharpdaily\\.com\\.hk$\n(?:^|\\.)sharpdaily\\.hk$\n(?:^|\\.)sharpdaily\\.tw$\n(?:^|\\.)shat-tibet\\.com$\n(?:^|\\.)shattered\\.io$\n(?:^|\\.)sheikyermami\\.com$\n(?:^|\\.)shellfire\\.de$\n(?:^|\\.)shenshou\\.org$\n(?:^|\\.)shenyun\\.com$\n(?:^|\\.)shenyunperformingarts\\.org$\n(?:^|\\.)shenzhoufilm\\.com$\n(?:^|\\.)sherabgyaltsen\\.com$\n(?:^|\\.)shiatv\\.net$\n(?:^|\\.)shicheng\\.org$\n(?:^|\\.)shiksha\\.com$\n(?:^|\\.)shinychan\\.com$\n(?:^|\\.)shipcamouflage\\.com$\n(?:^|\\.)shireyishunjian\\.com$\n(?:^|\\.)shitaotv\\.org$\n(?:^|\\.)shixiao\\.org$\n(?:^|\\.)shizhao\\.org$\n(?:^|\\.)shkspr\\.mobi$\n(?:^|\\.)shodanhq\\.com$\n(?:^|\\.)shooshtime\\.com$\n(?:^|\\.)shop2000\\.com\\.tw$\n(?:^|\\.)shopping\\.com$\n(?:^|\\.)showbiz\\.omy\\.sg$\n(?:^|\\.)showhaotu\\.com$\n(?:^|\\.)showtime\\.jp$\n(?:^|\\.)shutterstock\\.com$\n(?:^|\\.)shwchurch\\.org$\n(?:^|\\.)shwchurch3\\.com$\n(?:^|\\.)siddharthasintent\\.org$\n(?:^|\\.)sidelinesnews\\.com$\n(?:^|\\.)sidelinessportseatery\\.com$\n(?:^|\\.)sierrafriendsoftibet\\.org$\n(?:^|\\.)sijihuisuo\\.club$\n(?:^|\\.)sijihuisuo\\.com$\n(?:^|\\.)sikaozhe1997\\.github\\.io$\n(?:^|\\.)silkbook\\.com$\n(?:^|\\.)simbolostwitter\\.com$\n(?:^|\\.)simplecd\\.org$\n(?:^|\\.)simpleproductivityblog\\.com$\n(?:^|\\.)sinchew\\.com\\.my$\n(?:^|\\.)singaporepools\\.com\\.sg$\n(?:^|\\.)singfortibet\\.com$\n(?:^|\\.)singpao\\.com\\.hk$\n(?:^|\\.)singtao\\.com$\n(?:^|\\.)singtaousa\\.com$\n(?:^|\\.)sino-monthly\\.com$\n(?:^|\\.)sinoants\\.com$\n(?:^|\\.)sinocast\\.com$\n(?:^|\\.)sinocism\\.com$\n(?:^|\\.)sinomontreal\\.ca$\n(?:^|\\.)sinonet\\.ca$\n(?:^|\\.)sinopitt\\.info$\n(?:^|\\.)sinoquebec\\.com$\n(?:^|\\.)sipml5\\.org$\n(?:^|\\.)sis\\.xxx$\n(?:^|\\.)sis001\\.com$\n(?:^|\\.)sis001\\.us$\n(?:^|\\.)site2unblock\\.com$\n(?:^|\\.)site90\\.net$\n(?:^|\\.)sitebro\\.tw$\n(?:^|\\.)sitekreator\\.com$\n(?:^|\\.)siteks\\.uk\\.to$\n(?:^|\\.)sitemaps\\.org$\n(?:^|\\.)six-degrees\\.io$\n(?:^|\\.)sixth\\.biz$\n(?:^|\\.)sjrt\\.org$\n(?:^|\\.)sjum\\.cn$\n(?:^|\\.)sketchappsources\\.com$\n(?:^|\\.)skimtube\\.com$\n(?:^|\\.)skybet\\.com$\n(?:^|\\.)skyking\\.com\\.tw$\n(?:^|\\.)skyvegas\\.com$\n(?:^|\\.)skyxvpn\\.com$\n(?:^|\\.)slacker\\.com$\n(?:^|\\.)slaytizle\\.com$\n(?:^|\\.)sleazydream\\.com$\n(?:^|\\.)slheng\\.com$\n(?:^|\\.)slickvpn\\.com$\n(?:^|\\.)slideshare\\.net$\n(?:^|\\.)slinkset\\.com$\n(?:^|\\.)slutload\\.com$\n(?:^|\\.)slutmoonbeam\\.com$\n(?:^|\\.)slyip\\.com$\n(?:^|\\.)slyip\\.net$\n(?:^|\\.)sm-miracle\\.com$\n(?:^|\\.)smartdnsproxy\\.com$\n(?:^|\\.)smarthide\\.com$\n(?:^|\\.)smchbooks\\.com$\n(?:^|\\.)smh\\.com\\.au$\n(?:^|\\.)smhric\\.org$\n(?:^|\\.)smith\\.edu$\n(?:^|\\.)smyxy\\.org$\n(?:^|\\.)snapchat\\.com$\n(?:^|\\.)snaptu\\.com$\n(?:^|\\.)sndcdn\\.com$\n(?:^|\\.)sneakme\\.net$\n(?:^|\\.)snowlionpub\\.com$\n(?:^|\\.)sobees\\.com$\n(?:^|\\.)soc\\.mil$\n(?:^|\\.)socialwhale\\.com$\n(?:^|\\.)socks-proxy\\.net$\n(?:^|\\.)sockscap64\\.com$\n(?:^|\\.)sockslist\\.net$\n(?:^|\\.)socrec\\.org$\n(?:^|\\.)sod\\.co\\.jp$\n(?:^|\\.)sodatea\\.github\\.io$\n(?:^|\\.)softether-download\\.com$\n(?:^|\\.)softether\\.co\\.jp$\n(?:^|\\.)softether\\.org$\n(?:^|\\.)softfamous\\.com$\n(?:^|\\.)softsmirror\\.cf$\n(?:^|\\.)softwarebychuck\\.com$\n(?:^|\\.)softwaredownload\\.gitbooks\\.io$\n(?:^|\\.)sogclub\\.com$\n(?:^|\\.)sogrady\\.me$\n(?:^|\\.)soh\\.tw$\n(?:^|\\.)sohcradio\\.com$\n(?:^|\\.)sohfrance\\.org$\n(?:^|\\.)sokamonline\\.com$\n(?:^|\\.)sokmil\\.com$\n(?:^|\\.)solarsystem\\.nasa\\.gov$\n(?:^|\\.)solidaritetibet\\.org$\n(?:^|\\.)solidfiles\\.com$\n(?:^|\\.)somee\\.com$\n(?:^|\\.)songjianjun\\.com$\n(?:^|\\.)sonicbbs\\.cc$\n(?:^|\\.)sonidodelaesperanza\\.org$\n(?:^|\\.)sopcast\\.com$\n(?:^|\\.)sopcast\\.org$\n(?:^|\\.)sorazone\\.net$\n(?:^|\\.)sorting-algorithms\\.com$\n(?:^|\\.)sos\\.org$\n(?:^|\\.)sosreader\\.com$\n(?:^|\\.)sostibet\\.org$\n(?:^|\\.)soubory\\.com$\n(?:^|\\.)soul-plus\\.net$\n(?:^|\\.)soulcaliburhentai\\.net$\n(?:^|\\.)soumo\\.info$\n(?:^|\\.)soundcloud\\.com$\n(?:^|\\.)soundofhope\\.kr$\n(?:^|\\.)soundofhope\\.org$\n(?:^|\\.)soup\\.io$\n(?:^|\\.)soupofmedia\\.com$\n(?:^|\\.)sourceforge\\.net$\n(?:^|\\.)sourcewadio\\.com$\n(?:^|\\.)southnews\\.com\\.tw$\n(?:^|\\.)sowers\\.org\\.hk$\n(?:^|\\.)soylentnews\\.org$\n(?:^|\\.)spaces\\.hightail\\.com$\n(?:^|\\.)spankbang\\.com$\n(?:^|\\.)spankingtube\\.com$\n(?:^|\\.)spankwire\\.com$\n(?:^|\\.)spb\\.com$\n(?:^|\\.)speakerdeck\\.com$\n(?:^|\\.)specxinzl\\.jigsy\\.com$\n(?:^|\\.)speedify\\.com$\n(?:^|\\.)spem\\.at$\n(?:^|\\.)spencertipping\\.com$\n(?:^|\\.)spendee\\.com$\n(?:^|\\.)spicevpn\\.com$\n(?:^|\\.)spideroak\\.com$\n(?:^|\\.)spike\\.com$\n(?:^|\\.)sports\\.williamhill\\.com$\n(?:^|\\.)spotflux\\.com$\n(?:^|\\.)spotify\\.com$\n(?:^|\\.)spreadshirt\\.es$\n(?:^|\\.)spring4u\\.info$\n(?:^|\\.)springboardplatform\\.com$\n(?:^|\\.)sprite\\.org$\n(?:^|\\.)sproutcore\\.com$\n(?:^|\\.)sproxy\\.info$\n(?:^|\\.)squirly\\.info$\n(?:^|\\.)srcf\\.ucam\\.org$\n(?:^|\\.)srocket\\.us$\n(?:^|\\.)ss-link\\.com$\n(?:^|\\.)ss\\.carryzhou\\.com$\n(?:^|\\.)ss\\.levyhsu\\.com$\n(?:^|\\.)ss\\.pythonic\\.life$\n(?:^|\\.)ss7\\.vzw\\.com$\n(?:^|\\.)ssglobal\\.co$\n(?:^|\\.)ssglobal\\.me$\n(?:^|\\.)ssh91\\.com$\n(?:^|\\.)ssl\\.webpack\\.de$\n(?:^|\\.)ssl443\\.org$\n(?:^|\\.)sspanel\\.net$\n(?:^|\\.)sspro\\.ml$\n(?:^|\\.)ssr\\.tools$\n(?:^|\\.)ssrshare\\.com$\n(?:^|\\.)sss\\.camp$\n(?:^|\\.)sstmlt\\.moe$\n(?:^|\\.)sstmlt\\.net$\n(?:^|\\.)stackoverflow\\.com$\n(?:^|\\.)stage64\\.hk$\n(?:^|\\.)standupfortibet\\.org$\n(?:^|\\.)stanford\\.edu$\n(?:^|\\.)starfishfx\\.com$\n(?:^|\\.)starp2p\\.com$\n(?:^|\\.)startpage\\.com$\n(?:^|\\.)startuplivingchina\\.com$\n(?:^|\\.)stat\\.gov\\.tw$\n(?:^|\\.)static-economist\\.com$\n(?:^|\\.)static\\.comico\\.tw$\n(?:^|\\.)static\\.shemalez\\.com$\n(?:^|\\.)static01\\.nyt\\.com$\n(?:^|\\.)staticflickr\\.com$\n(?:^|\\.)statueofdemocracy\\.org$\n(?:^|\\.)stc\\.com\\.sa$\n(?:^|\\.)steamcommunity\\.com$\n(?:^|\\.)steel-storm\\.com$\n(?:^|\\.)steemit\\.com$\n(?:^|\\.)steganos\\.com$\n(?:^|\\.)steganos\\.net$\n(?:^|\\.)stepchina\\.com$\n(?:^|\\.)stephaniered\\.com$\n(?:^|\\.)sthoo\\.com$\n(?:^|\\.)stickam\\.com$\n(?:^|\\.)stickeraction\\.com$\n(?:^|\\.)stileproject\\.com$\n(?:^|\\.)sto\\.cc$\n(?:^|\\.)stoporganharvesting\\.org$\n(?:^|\\.)stoptibetcrisis\\.net$\n(?:^|\\.)storagenewsletter\\.com$\n(?:^|\\.)store\\.steampowered\\.com$\n(?:^|\\.)stories\\.google$\n(?:^|\\.)storify\\.com$\n(?:^|\\.)storm\\.mg$\n(?:^|\\.)stormmediagroup\\.com$\n(?:^|\\.)stoweboyd\\.com$\n(?:^|\\.)stranabg\\.com$\n(?:^|\\.)straplessdildo\\.com$\n(?:^|\\.)streamingthe\\.net$\n(?:^|\\.)streema\\.com$\n(?:^|\\.)strikingly\\.com$\n(?:^|\\.)strongvpn\\.com$\n(?:^|\\.)strongwindpress\\.com$\n(?:^|\\.)student\\.tw$\n(?:^|\\.)studentsforafreetibet\\.org$\n(?:^|\\.)stumbleupon\\.com$\n(?:^|\\.)stupidvideos\\.com$\n(?:^|\\.)subacme\\.rerouted\\.org$\n(?:^|\\.)successfn\\.com$\n(?:^|\\.)sugarsync\\.com$\n(?:^|\\.)sugobbs\\.com$\n(?:^|\\.)sugumiru18\\.com$\n(?:^|\\.)suissl\\.com$\n(?:^|\\.)sujiatun\\.wordpress\\.com$\n(?:^|\\.)sukebei\\.nyaa\\.si$\n(?:^|\\.)sulian\\.me$\n(?:^|\\.)summify\\.com$\n(?:^|\\.)sumrando\\.com$\n(?:^|\\.)sun1911\\.com$\n(?:^|\\.)sunmedia\\.ca$\n(?:^|\\.)sunporno\\.com$\n(?:^|\\.)sunskyforum\\.com$\n(?:^|\\.)sunta\\.com\\.tw$\n(?:^|\\.)sunvpn\\.net$\n(?:^|\\.)sunwinism\\.joinbbs\\.net$\n(?:^|\\.)suoluo\\.org$\n(?:^|\\.)supchina\\.com$\n(?:^|\\.)superfreevpn\\.com$\n(?:^|\\.)superokayama\\.com$\n(?:^|\\.)superpages\\.com$\n(?:^|\\.)supervpn\\.net$\n(?:^|\\.)superzooi\\.com$\n(?:^|\\.)suppig\\.net$\n(?:^|\\.)suprememastertv\\.com$\n(?:^|\\.)surfeasy\\.com$\n(?:^|\\.)surfeasy\\.com\\.au$\n(?:^|\\.)suroot\\.com$\n(?:^|\\.)surrenderat20\\.net$\n(?:^|\\.)sustainability\\.google$\n(?:^|\\.)suyangg\\.com$\n(?:^|\\.)svsfx\\.com$\n(?:^|\\.)swagbucks\\.com$\n(?:^|\\.)swissinfo\\.ch$\n(?:^|\\.)swissvpn\\.net$\n(?:^|\\.)switch1\\.jp$\n(?:^|\\.)switchvpn\\.net$\n(?:^|\\.)sydneytoday\\.com$\n(?:^|\\.)sylfoundation\\.org$\n(?:^|\\.)syncback\\.com$\n(?:^|\\.)synergyse\\.com$\n(?:^|\\.)sysresccd\\.org$\n(?:^|\\.)sytes\\.net$\n(?:^|\\.)szbbs\\.net$\n(?:^|\\.)szetowah\\.org\\.hk$\n(?:^|\\.)t-g\\.com$\n(?:^|\\.)t\\.co$\n(?:^|\\.)t\\.me$\n(?:^|\\.)t\\.orzdream\\.com$\n(?:^|\\.)t35\\.com$\n(?:^|\\.)t66y\\.com$\n(?:^|\\.)taa-usa\\.org$\n(?:^|\\.)taaze\\.tw$\n(?:^|\\.)tabtter\\.jp$\n(?:^|\\.)tacc\\.cwb\\.gov\\.tw$\n(?:^|\\.)tacem\\.org$\n(?:^|\\.)taconet\\.com\\.tw$\n(?:^|\\.)taedp\\.org\\.tw$\n(?:^|\\.)tafm\\.org$\n(?:^|\\.)tagwa\\.org\\.au$\n(?:^|\\.)tagwalk\\.com$\n(?:^|\\.)tahr\\.org\\.tw$\n(?:^|\\.)taipei\\.gov\\.tw$\n(?:^|\\.)taipeisociety\\.org$\n(?:^|\\.)taiwan-sex\\.com$\n(?:^|\\.)taiwanbible\\.com$\n(?:^|\\.)taiwancon\\.com$\n(?:^|\\.)taiwandaily\\.net$\n(?:^|\\.)taiwandc\\.org$\n(?:^|\\.)taiwanjobs\\.gov\\.tw$\n(?:^|\\.)taiwanjustice\\.com$\n(?:^|\\.)taiwanjustice\\.net$\n(?:^|\\.)taiwankiss\\.com$\n(?:^|\\.)taiwannation\\.50webs\\.com$\n(?:^|\\.)taiwannation\\.com$\n(?:^|\\.)taiwannation\\.com\\.tw$\n(?:^|\\.)taiwanncf\\.org\\.tw$\n(?:^|\\.)taiwannews\\.com\\.tw$\n(?:^|\\.)taiwantp\\.net$\n(?:^|\\.)taiwantt\\.org\\.tw$\n(?:^|\\.)taiwanus\\.net$\n(?:^|\\.)taiwanyes\\.com$\n(?:^|\\.)taiwanyes\\.ning\\.com$\n(?:^|\\.)talk853\\.com$\n(?:^|\\.)talkboxapp\\.com$\n(?:^|\\.)talkcc\\.com$\n(?:^|\\.)talkonly\\.net$\n(?:^|\\.)tamiaode\\.tk$\n(?:^|\\.)tanc\\.org$\n(?:^|\\.)tangben\\.com$\n(?:^|\\.)tangren\\.us$\n(?:^|\\.)taoism\\.net$\n(?:^|\\.)taolun\\.info$\n(?:^|\\.)tapanwap\\.com$\n(?:^|\\.)tapatalk\\.com$\n(?:^|\\.)tarr\\.uspto\\.gov$\n(?:^|\\.)tascn\\.com\\.au$\n(?:^|\\.)taup\\.net$\n(?:^|\\.)taweet\\.com$\n(?:^|\\.)tbcollege\\.org$\n(?:^|\\.)tbi\\.org\\.hk$\n(?:^|\\.)tbicn\\.org$\n(?:^|\\.)tbjyt\\.org$\n(?:^|\\.)tbpic\\.info$\n(?:^|\\.)tbrc\\.org$\n(?:^|\\.)tbs-rainbow\\.org$\n(?:^|\\.)tbsec\\.org$\n(?:^|\\.)tbskkinabalu\\.page\\.tl$\n(?:^|\\.)tbsmalaysia\\.org$\n(?:^|\\.)tbsn\\.org$\n(?:^|\\.)tbsseattle\\.org$\n(?:^|\\.)tbssqh\\.org$\n(?:^|\\.)tbswd\\.org$\n(?:^|\\.)tbtemple\\.org\\.uk$\n(?:^|\\.)tbthouston\\.org$\n(?:^|\\.)tccwonline\\.org$\n(?:^|\\.)tcewf\\.org$\n(?:^|\\.)tchrd\\.org$\n(?:^|\\.)tcnynj\\.org$\n(?:^|\\.)tcpspeed\\.co$\n(?:^|\\.)tcpspeed\\.com$\n(?:^|\\.)tcsofbc\\.org$\n(?:^|\\.)tcsovi\\.org$\n(?:^|\\.)tdm\\.com\\.mo$\n(?:^|\\.)teachparentstech\\.org$\n(?:^|\\.)teamamericany\\.com$\n(?:^|\\.)tech2\\.in\\.com$\n(?:^|\\.)techviz\\.net$\n(?:^|\\.)teck\\.in$\n(?:^|\\.)teco-hk\\.org$\n(?:^|\\.)teco-mo\\.org$\n(?:^|\\.)teddysun\\.com$\n(?:^|\\.)teeniefuck\\.net$\n(?:^|\\.)teensinasia\\.com$\n(?:^|\\.)telecomspace\\.com$\n(?:^|\\.)telegram\\.dog$\n(?:^|\\.)telegram\\.me$\n(?:^|\\.)telegram\\.org$\n(?:^|\\.)telegramdownload\\.com$\n(?:^|\\.)telegraph\\.co\\.uk$\n(?:^|\\.)telesco\\.pe$\n(?:^|\\.)tellme\\.pw$\n(?:^|\\.)tenacy\\.com$\n(?:^|\\.)tensorflow\\.org$\n(?:^|\\.)tenzinpalmo\\.com$\n(?:^|\\.)terminus2049\\.github\\.io$\n(?:^|\\.)tew\\.org$\n(?:^|\\.)textnow\\.me$\n(?:^|\\.)tfhub\\.dev$\n(?:^|\\.)th\\.hao123\\.com$\n(?:^|\\.)thaicn\\.com$\n(?:^|\\.)thb\\.gov\\.tw$\n(?:^|\\.)theatrum-belli\\.com$\n(?:^|\\.)thebcomplex\\.com$\n(?:^|\\.)theblemish\\.com$\n(?:^|\\.)thebobs\\.com$\n(?:^|\\.)thebodyshop-usa\\.com$\n(?:^|\\.)thecenter\\.mit\\.edu$\n(?:^|\\.)thechinabeat\\.org$\n(?:^|\\.)thedalailamamovie\\.com$\n(?:^|\\.)thedw\\.us$\n(?:^|\\.)thefacebook\\.com$\n(?:^|\\.)thefrontier\\.hk$\n(?:^|\\.)thegioitinhoc\\.vn$\n(?:^|\\.)thegly\\.com$\n(?:^|\\.)thehots\\.info$\n(?:^|\\.)thehousenews\\.com$\n(?:^|\\.)thehun\\.net$\n(?:^|\\.)theinitium\\.com$\n(?:^|\\.)thenewslens\\.com$\n(?:^|\\.)thepiratebay\\.org$\n(?:^|\\.)theporndude\\.com$\n(?:^|\\.)theportalwiki\\.com$\n(?:^|\\.)thereallove\\.kr$\n(?:^|\\.)therock\\.net\\.nz$\n(?:^|\\.)thespeeder\\.com$\n(?:^|\\.)thestandnews\\.com$\n(?:^|\\.)thetibetcenter\\.org$\n(?:^|\\.)thetibetconnection\\.org$\n(?:^|\\.)thetibetmuseum\\.org$\n(?:^|\\.)thetibetpost\\.com$\n(?:^|\\.)thetinhat\\.com$\n(?:^|\\.)thetrotskymovie\\.com$\n(?:^|\\.)thevivekspot\\.com$\n(?:^|\\.)thewgo\\.org$\n(?:^|\\.)theync\\.com$\n(?:^|\\.)thinkgeek\\.com$\n(?:^|\\.)thinkingtaiwan\\.com$\n(?:^|\\.)thinkwithgoogle\\.com$\n(?:^|\\.)thisav\\.com$\n(?:^|\\.)thlib\\.org$\n(?:^|\\.)thomasbernhard\\.org$\n(?:^|\\.)thongdreams\\.com$\n(?:^|\\.)threatchaos\\.com$\n(?:^|\\.)throughnightsfire\\.com$\n(?:^|\\.)thumbzilla\\.com$\n(?:^|\\.)thywords\\.com$\n(?:^|\\.)thywords\\.com\\.tw$\n(?:^|\\.)tiananmenduizhi\\.com$\n(?:^|\\.)tiananmenmother\\.org$\n(?:^|\\.)tiananmenuniv\\.com$\n(?:^|\\.)tiananmenuniv\\.net$\n(?:^|\\.)tiandixing\\.org$\n(?:^|\\.)tianhuayuan\\.com$\n(?:^|\\.)tianlawoffice\\.com$\n(?:^|\\.)tianti\\.io$\n(?:^|\\.)tiantibooks\\.org$\n(?:^|\\.)tianyantong\\.org\\.cn$\n(?:^|\\.)tianzhu\\.org$\n(?:^|\\.)tibet-envoy\\.eu$\n(?:^|\\.)tibet-foundation\\.org$\n(?:^|\\.)tibet-house-trust\\.co\\.uk$\n(?:^|\\.)tibet-info\\.net$\n(?:^|\\.)tibet-initiative\\.de$\n(?:^|\\.)tibet-munich\\.de$\n(?:^|\\.)tibet\\.a\\.se$\n(?:^|\\.)tibet\\.at$\n(?:^|\\.)tibet\\.ca$\n(?:^|\\.)tibet\\.com$\n(?:^|\\.)tibet\\.fr$\n(?:^|\\.)tibet\\.net$\n(?:^|\\.)tibet\\.nu$\n(?:^|\\.)tibet\\.org$\n(?:^|\\.)tibet\\.org\\.tw$\n(?:^|\\.)tibet\\.sk$\n(?:^|\\.)tibet\\.to$\n(?:^|\\.)tibet3rdpole\\.org$\n(?:^|\\.)tibetaction\\.net$\n(?:^|\\.)tibetaid\\.org$\n(?:^|\\.)tibetalk\\.com$\n(?:^|\\.)tibetan-alliance\\.org$\n(?:^|\\.)tibetan\\.fr$\n(?:^|\\.)tibetanaidproject\\.org$\n(?:^|\\.)tibetanarts\\.org$\n(?:^|\\.)tibetanbuddhistinstitute\\.org$\n(?:^|\\.)tibetancommunity\\.org$\n(?:^|\\.)tibetancommunityuk\\.net$\n(?:^|\\.)tibetanculture\\.org$\n(?:^|\\.)tibetanfeministcollective\\.org$\n(?:^|\\.)tibetanjournal\\.com$\n(?:^|\\.)tibetanlanguage\\.org$\n(?:^|\\.)tibetanliberation\\.org$\n(?:^|\\.)tibetanpaintings\\.com$\n(?:^|\\.)tibetanphotoproject\\.com$\n(?:^|\\.)tibetanpoliticalreview\\.org$\n(?:^|\\.)tibetanreview\\.net$\n(?:^|\\.)tibetansports\\.org$\n(?:^|\\.)tibetanwomen\\.org$\n(?:^|\\.)tibetanyouth\\.org$\n(?:^|\\.)tibetanyouthcongress\\.org$\n(?:^|\\.)tibetcharity\\.dk$\n(?:^|\\.)tibetcharity\\.in$\n(?:^|\\.)tibetchild\\.org$\n(?:^|\\.)tibetcity\\.com$\n(?:^|\\.)tibetcollection\\.com$\n(?:^|\\.)tibetcorps\\.org$\n(?:^|\\.)tibetexpress\\.net$\n(?:^|\\.)tibetfocus\\.com$\n(?:^|\\.)tibetfund\\.org$\n(?:^|\\.)tibetgermany\\.com$\n(?:^|\\.)tibetgermany\\.de$\n(?:^|\\.)tibethaus\\.com$\n(?:^|\\.)tibetheritagefund\\.org$\n(?:^|\\.)tibethouse\\.jp$\n(?:^|\\.)tibethouse\\.org$\n(?:^|\\.)tibethouse\\.us$\n(?:^|\\.)tibetinfonet\\.net$\n(?:^|\\.)tibetjustice\\.org$\n(?:^|\\.)tibetkomite\\.dk$\n(?:^|\\.)tibetlibre\\.free\\.fr$\n(?:^|\\.)tibetmuseum\\.org$\n(?:^|\\.)tibetnetwork\\.org$\n(?:^|\\.)tibetoffice\\.ch$\n(?:^|\\.)tibetoffice\\.com\\.au$\n(?:^|\\.)tibetoffice\\.eu$\n(?:^|\\.)tibetoffice\\.org$\n(?:^|\\.)tibetonline\\.com$\n(?:^|\\.)tibetonline\\.tv$\n(?:^|\\.)tibetoralhistory\\.org$\n(?:^|\\.)tibetpolicy\\.eu$\n(?:^|\\.)tibetrelieffund\\.co\\.uk$\n(?:^|\\.)tibetsites\\.com$\n(?:^|\\.)tibetsociety\\.com$\n(?:^|\\.)tibetsun\\.com$\n(?:^|\\.)tibetsupportgroup\\.org$\n(?:^|\\.)tibetswiss\\.ch$\n(?:^|\\.)tibettelegraph\\.com$\n(?:^|\\.)tibettimes\\.net$\n(?:^|\\.)tibetwrites\\.org$\n(?:^|\\.)ticket\\.com\\.tw$\n(?:^|\\.)tigervpn\\.com$\n(?:^|\\.)tiltbrush\\.com$\n(?:^|\\.)timdir\\.com$\n(?:^|\\.)time\\.com$\n(?:^|\\.)times\\.hinet\\.net$\n(?:^|\\.)timesofindia\\.indiatimes\\.com$\n(?:^|\\.)timsah\\.com$\n(?:^|\\.)tinc-vpn\\.org$\n(?:^|\\.)tineye\\.com$\n(?:^|\\.)tintuc101\\.com$\n(?:^|\\.)tiny\\.cc$\n(?:^|\\.)tinychat\\.com$\n(?:^|\\.)tinypaste\\.com$\n(?:^|\\.)tipo\\.gov\\.tw$\n(?:^|\\.)tistory\\.com$\n(?:^|\\.)tkcs-collins\\.com$\n(?:^|\\.)tl\\.gd$\n(?:^|\\.)tma\\.co\\.jp$\n(?:^|\\.)tmagazine\\.com$\n(?:^|\\.)tmdfish\\.com$\n(?:^|\\.)tmi\\.me$\n(?:^|\\.)tmpp\\.org$\n(?:^|\\.)tn1\\.shemalez\\.com$\n(?:^|\\.)tn2\\.shemalez\\.com$\n(?:^|\\.)tn3\\.shemalez\\.com$\n(?:^|\\.)tnaflix\\.com$\n(?:^|\\.)tngrnow\\.com$\n(?:^|\\.)tngrnow\\.net$\n(?:^|\\.)tnp\\.org$\n(?:^|\\.)to-porno\\.com$\n(?:^|\\.)togetter\\.com$\n(?:^|\\.)toh\\.info$\n(?:^|\\.)tokyo-247\\.com$\n(?:^|\\.)tokyo-hot\\.com$\n(?:^|\\.)tokyo-porn-tube\\.com$\n(?:^|\\.)tokyocn\\.com$\n(?:^|\\.)tongil\\.or\\.kr$\n(?:^|\\.)tono-oka\\.jp$\n(?:^|\\.)tonyyan\\.net$\n(?:^|\\.)toodoc\\.com$\n(?:^|\\.)toonel\\.net$\n(?:^|\\.)top\\.tv$\n(?:^|\\.)top10vpn\\.com$\n(?:^|\\.)top81\\.ws$\n(?:^|\\.)topbtc\\.com$\n(?:^|\\.)topic\\.youthwant\\.com\\.tw$\n(?:^|\\.)topnews\\.in$\n(?:^|\\.)toppornsites\\.com$\n(?:^|\\.)topshareware\\.com$\n(?:^|\\.)topsy\\.com$\n(?:^|\\.)toptip\\.ca$\n(?:^|\\.)tor\\.blingblingsquad\\.net$\n(?:^|\\.)tor\\.cn\\.uptodown\\.com$\n(?:^|\\.)tor\\.updatestar\\.com$\n(?:^|\\.)tora\\.to$\n(?:^|\\.)torcn\\.com$\n(?:^|\\.)torguard\\.net$\n(?:^|\\.)torproject\\.org$\n(?:^|\\.)torrentprivacy\\.com$\n(?:^|\\.)torrentproject\\.se$\n(?:^|\\.)torrenty\\.org$\n(?:^|\\.)torrentz\\.eu$\n(?:^|\\.)torvpn\\.com$\n(?:^|\\.)tosh\\.comedycentral\\.com$\n(?:^|\\.)totalvpn\\.com$\n(?:^|\\.)toutiaoabc\\.com$\n(?:^|\\.)toutyrater\\.github\\.io$\n(?:^|\\.)towngain\\.com$\n(?:^|\\.)toypark\\.in$\n(?:^|\\.)toythieves\\.com$\n(?:^|\\.)toytractorshow\\.com$\n(?:^|\\.)tparents\\.org$\n(?:^|\\.)tpi\\.org\\.tw$\n(?:^|\\.)tracfone\\.com$\n(?:^|\\.)traffichaus\\.com$\n(?:^|\\.)trans\\.wenweipo\\.com$\n(?:^|\\.)transparency\\.org$\n(?:^|\\.)treemall\\.com\\.tw$\n(?:^|\\.)trendsmap\\.com$\n(?:^|\\.)trialofccp\\.org$\n(?:^|\\.)trickip\\.net$\n(?:^|\\.)trickip\\.org$\n(?:^|\\.)trimondi\\.de$\n(?:^|\\.)trouw\\.nl$\n(?:^|\\.)trt\\.net\\.tr$\n(?:^|\\.)trtc\\.com\\.tw$\n(?:^|\\.)truebuddha-md\\.org$\n(?:^|\\.)trulyergonomic\\.com$\n(?:^|\\.)truth101\\.co\\.tv$\n(?:^|\\.)truthontour\\.org$\n(?:^|\\.)truveo\\.com$\n(?:^|\\.)tryheart\\.jp$\n(?:^|\\.)tsctv\\.net$\n(?:^|\\.)tsdr\\.uspto\\.gov$\n(?:^|\\.)tsemtulku\\.com$\n(?:^|\\.)tsquare\\.tv$\n(?:^|\\.)tsu\\.org\\.tw$\n(?:^|\\.)tsunagarumon\\.com$\n(?:^|\\.)tt1069\\.com$\n(?:^|\\.)tttan\\.com$\n(?:^|\\.)ttvnw\\.net$\n(?:^|\\.)tu8964\\.com$\n(?:^|\\.)tubaholic\\.com$\n(?:^|\\.)tube\\.com$\n(?:^|\\.)tube8\\.com$\n(?:^|\\.)tube911\\.com$\n(?:^|\\.)tubecup\\.com$\n(?:^|\\.)tubegals\\.com$\n(?:^|\\.)tubeislam\\.com$\n(?:^|\\.)tubepornclassic\\.com$\n(?:^|\\.)tubestack\\.com$\n(?:^|\\.)tubewolf\\.com$\n(?:^|\\.)tui\\.orzdream\\.com$\n(?:^|\\.)tuibeitu\\.net$\n(?:^|\\.)tuidang\\.net$\n(?:^|\\.)tuidang\\.org$\n(?:^|\\.)tuidang\\.se$\n(?:^|\\.)tuitwit\\.com$\n(?:^|\\.)tumblr\\.com$\n(?:^|\\.)tumutanzi\\.com$\n(?:^|\\.)tumview\\.com$\n(?:^|\\.)tunein\\.com$\n(?:^|\\.)tunnelbear\\.com$\n(?:^|\\.)tunnelr\\.com$\n(?:^|\\.)tuo8\\.blue$\n(?:^|\\.)tuo8\\.cc$\n(?:^|\\.)tuo8\\.club$\n(?:^|\\.)tuo8\\.fit$\n(?:^|\\.)tuo8\\.hk$\n(?:^|\\.)tuo8\\.in$\n(?:^|\\.)tuo8\\.ninja$\n(?:^|\\.)tuo8\\.org$\n(?:^|\\.)tuo8\\.pw$\n(?:^|\\.)tuo8\\.red$\n(?:^|\\.)tuo8\\.space$\n(?:^|\\.)turansam\\.org$\n(?:^|\\.)turbobit\\.net$\n(?:^|\\.)turbohide\\.com$\n(?:^|\\.)turbotwitter\\.com$\n(?:^|\\.)turntable\\.fm$\n(?:^|\\.)tushycash\\.com$\n(?:^|\\.)tuvpn\\.com$\n(?:^|\\.)tuzaijidi\\.com$\n(?:^|\\.)tv\\.com$\n(?:^|\\.)tvants\\.com$\n(?:^|\\.)tvboxnow\\.com$\n(?:^|\\.)tvider\\.com$\n(?:^|\\.)tvmost\\.com\\.hk$\n(?:^|\\.)tvplayvideos\\.com$\n(?:^|\\.)tvunetworks\\.com$\n(?:^|\\.)tw-blog\\.com$\n(?:^|\\.)tw-npo\\.org$\n(?:^|\\.)tw\\.answers\\.yahoo\\.com$\n(?:^|\\.)tw\\.bid\\.yahoo\\.com$\n(?:^|\\.)tw\\.gigacircle\\.com$\n(?:^|\\.)tw\\.hao123\\.com$\n(?:^|\\.)tw\\.iqiyi\\.com$\n(?:^|\\.)tw\\.jiepang\\.com$\n(?:^|\\.)tw\\.knowledge\\.yahoo\\.com$\n(?:^|\\.)tw\\.mall\\.yahoo\\.com$\n(?:^|\\.)tw\\.mobi\\.yahoo\\.com$\n(?:^|\\.)tw\\.money\\.yahoo\\.com$\n(?:^|\\.)tw\\.myblog\\.yahoo\\.com$\n(?:^|\\.)tw\\.news\\.yahoo\\.com$\n(?:^|\\.)tw\\.streetvoice\\.com$\n(?:^|\\.)tw\\.tomonews\\.net$\n(?:^|\\.)tw\\.voa\\.mobi$\n(?:^|\\.)tw\\.yahoo\\.com$\n(?:^|\\.)tw01\\.org$\n(?:^|\\.)twaitter\\.com$\n(?:^|\\.)twapperkeeper\\.com$\n(?:^|\\.)twaud\\.io$\n(?:^|\\.)twavi\\.com$\n(?:^|\\.)twbbs\\.net\\.tw$\n(?:^|\\.)twbbs\\.org$\n(?:^|\\.)twbbs\\.tw$\n(?:^|\\.)twblogger\\.com$\n(?:^|\\.)tweepguide\\.com$\n(?:^|\\.)tweeplike\\.me$\n(?:^|\\.)tweepmag\\.com$\n(?:^|\\.)tweepml\\.org$\n(?:^|\\.)tweetbackup\\.com$\n(?:^|\\.)tweetboard\\.com$\n(?:^|\\.)tweetboner\\.biz$\n(?:^|\\.)tweetcs\\.com$\n(?:^|\\.)tweetdeck\\.com$\n(?:^|\\.)tweetedtimes\\.com$\n(?:^|\\.)tweetmylast\\.fm$\n(?:^|\\.)tweetphoto\\.com$\n(?:^|\\.)tweetrans\\.com$\n(?:^|\\.)tweetree\\.com$\n(?:^|\\.)tweets\\.seraph\\.me$\n(?:^|\\.)tweettunnel\\.com$\n(?:^|\\.)tweetwally\\.com$\n(?:^|\\.)tweetymail\\.com$\n(?:^|\\.)tweez\\.net$\n(?:^|\\.)twelve\\.today$\n(?:^|\\.)twerkingbutt\\.com$\n(?:^|\\.)twftp\\.org$\n(?:^|\\.)twgreatdaily\\.com$\n(?:^|\\.)twibase\\.com$\n(?:^|\\.)twibble\\.de$\n(?:^|\\.)twibbon\\.com$\n(?:^|\\.)twibs\\.com$\n(?:^|\\.)twicountry\\.org$\n(?:^|\\.)twicsy\\.com$\n(?:^|\\.)twiends\\.com$\n(?:^|\\.)twifan\\.com$\n(?:^|\\.)twiffo\\.com$\n(?:^|\\.)twiggit\\.org$\n(?:^|\\.)twilightsex\\.com$\n(?:^|\\.)twilog\\.org$\n(?:^|\\.)twimbow\\.com$\n(?:^|\\.)twimg\\.com$\n(?:^|\\.)twindexx\\.com$\n(?:^|\\.)twip\\.me$\n(?:^|\\.)twipple\\.jp$\n(?:^|\\.)twishort\\.com$\n(?:^|\\.)twistar\\.cc$\n(?:^|\\.)twister\\.net\\.co$\n(?:^|\\.)twisterio\\.com$\n(?:^|\\.)twisternow\\.com$\n(?:^|\\.)twistory\\.net$\n(?:^|\\.)twit2d\\.com$\n(?:^|\\.)twitbrowser\\.net$\n(?:^|\\.)twitcause\\.com$\n(?:^|\\.)twitch\\.tv$\n(?:^|\\.)twitchcdn\\.net$\n(?:^|\\.)twitgether\\.com$\n(?:^|\\.)twitgoo\\.com$\n(?:^|\\.)twitiq\\.com$\n(?:^|\\.)twitlonger\\.com$\n(?:^|\\.)twitmania\\.com$\n(?:^|\\.)twitoaster\\.com$\n(?:^|\\.)twitonmsn\\.com$\n(?:^|\\.)twitpic\\.com$\n(?:^|\\.)twitstat\\.com$\n(?:^|\\.)twittbot\\.net$\n(?:^|\\.)twitter\\.com$\n(?:^|\\.)twitter\\.jp$\n(?:^|\\.)twitter4j\\.org$\n(?:^|\\.)twittercounter\\.com$\n(?:^|\\.)twitterfeed\\.com$\n(?:^|\\.)twittergadget\\.com$\n(?:^|\\.)twitterkr\\.com$\n(?:^|\\.)twittermail\\.com$\n(?:^|\\.)twitterrific\\.com$\n(?:^|\\.)twittertim\\.es$\n(?:^|\\.)twitthat\\.com$\n(?:^|\\.)twitturk\\.com$\n(?:^|\\.)twitturly\\.com$\n(?:^|\\.)twitvid\\.com$\n(?:^|\\.)twitzap\\.com$\n(?:^|\\.)twiyia\\.com$\n(?:^|\\.)twnorth\\.org\\.tw$\n(?:^|\\.)twskype\\.com$\n(?:^|\\.)twstar\\.net$\n(?:^|\\.)twt\\.tl$\n(?:^|\\.)twtkr\\.com$\n(?:^|\\.)twtr2src\\.ogaoga\\.org$\n(?:^|\\.)twtrland\\.com$\n(?:^|\\.)twttr\\.com$\n(?:^|\\.)twurl\\.nl$\n(?:^|\\.)twyac\\.org$\n(?:^|\\.)txxx\\.com$\n(?:^|\\.)tycool\\.com$\n(?:^|\\.)typepad\\.com$\n(?:^|\\.)u9un\\.com$\n(?:^|\\.)ub0\\.cc$\n(?:^|\\.)ubddns\\.org$\n(?:^|\\.)uberproxy\\.net$\n(?:^|\\.)uc-japan\\.org$\n(?:^|\\.)ucdc1998\\.org$\n(?:^|\\.)uderzo\\.it$\n(?:^|\\.)udn\\.com$\n(?:^|\\.)udn\\.com\\.tw$\n(?:^|\\.)udnbkk\\.com$\n(?:^|\\.)uforadio\\.com\\.tw$\n(?:^|\\.)ufreevpn\\.com$\n(?:^|\\.)ugo\\.com$\n(?:^|\\.)uhdwallpapers\\.org$\n(?:^|\\.)uhrp\\.org$\n(?:^|\\.)uighur\\.narod\\.ru$\n(?:^|\\.)uighur\\.nl$\n(?:^|\\.)uighurbiz\\.net$\n(?:^|\\.)ukcdp\\.co\\.uk$\n(?:^|\\.)ukliferadio\\.co\\.uk$\n(?:^|\\.)uku\\.im$\n(?:^|\\.)ulike\\.net$\n(?:^|\\.)ulop\\.net$\n(?:^|\\.)ultrareach$\n(?:^|\\.)ultrasurf$\n(?:^|\\.)ultravpn\\.fr$\n(?:^|\\.)ultraxs\\.com$\n(?:^|\\.)umich\\.edu$\n(?:^|\\.)unblock-us\\.com$\n(?:^|\\.)unblock\\.cn\\.com$\n(?:^|\\.)unblockdmm\\.com$\n(?:^|\\.)unblocker\\.yt$\n(?:^|\\.)unblocksit\\.es$\n(?:^|\\.)uncyclomedia\\.org$\n(?:^|\\.)uncyclopedia\\.hk$\n(?:^|\\.)uncyclopedia\\.tw$\n(?:^|\\.)underwoodammo\\.com$\n(?:^|\\.)unholyknight\\.com$\n(?:^|\\.)uni\\.cc$\n(?:^|\\.)unification\\.net$\n(?:^|\\.)unification\\.org\\.tw$\n(?:^|\\.)unirule\\.cloud$\n(?:^|\\.)unitedsocialpress\\.com$\n(?:^|\\.)unix100\\.com$\n(?:^|\\.)unknownspace\\.org$\n(?:^|\\.)unodedos\\.com$\n(?:^|\\.)unpo\\.org$\n(?:^|\\.)unseen\\.is$\n(?:^|\\.)untraceable\\.us$\n(?:^|\\.)uocn\\.org$\n(?:^|\\.)upcoming\\.yahoo\\.com$\n(?:^|\\.)updates\\.tdesktop\\.com$\n(?:^|\\.)upholdjustice\\.org$\n(?:^|\\.)upload4u\\.info$\n(?:^|\\.)uploaded\\.net$\n(?:^|\\.)uploaded\\.to$\n(?:^|\\.)uploadstation\\.com$\n(?:^|\\.)upmedia\\.mg$\n(?:^|\\.)upornia\\.com$\n(?:^|\\.)uproxy\\.org$\n(?:^|\\.)upwill\\.org$\n(?:^|\\.)ur7s\\.com$\n(?:^|\\.)uraban\\.me$\n(?:^|\\.)urbansurvival\\.com$\n(?:^|\\.)urchin\\.com$\n(?:^|\\.)urlborg\\.com$\n(?:^|\\.)urlparser\\.com$\n(?:^|\\.)us\\.to$\n(?:^|\\.)usacn\\.com$\n(?:^|\\.)usaip\\.eu$\n(?:^|\\.)userapi\\.nytlog\\.com$\n(?:^|\\.)users\\.skynet\\.be$\n(?:^|\\.)usfk\\.mil$\n(?:^|\\.)ushuarencity\\.echainhost\\.com$\n(?:^|\\.)usinfo\\.state\\.gov$\n(?:^|\\.)usma\\.edu$\n(?:^|\\.)usmc\\.mil$\n(?:^|\\.)usmgtcg\\.ning\\.com$\n(?:^|\\.)usno\\.navy\\.mil$\n(?:^|\\.)usocctn\\.com$\n(?:^|\\.)ustream\\.tv$\n(?:^|\\.)usunitednews\\.com$\n(?:^|\\.)usus\\.cc$\n(?:^|\\.)utopianpal\\.com$\n(?:^|\\.)uu-gg\\.com$\n(?:^|\\.)uukanshu\\.com$\n(?:^|\\.)uvwxyz\\.xyz$\n(?:^|\\.)uwants\\.com$\n(?:^|\\.)uwants\\.net$\n(?:^|\\.)uyghur-j\\.org$\n(?:^|\\.)uyghur\\.co\\.uk$\n(?:^|\\.)uyghuramerican\\.org$\n(?:^|\\.)uyghurcanadiansociety\\.org$\n(?:^|\\.)uyghurcongress\\.org$\n(?:^|\\.)uyghurensemble\\.co\\.uk$\n(?:^|\\.)uyghurpen\\.org$\n(?:^|\\.)uyghurpress\\.com$\n(?:^|\\.)uyghurstudies\\.org$\n(?:^|\\.)uygur\\.fc2web\\.com$\n(?:^|\\.)uygur\\.org$\n(?:^|\\.)uymaarip\\.com$\n(?:^|\\.)v2ex\\.com$\n(?:^|\\.)v2ray\\.com$\n(?:^|\\.)van001\\.com$\n(?:^|\\.)van698\\.com$\n(?:^|\\.)vanemu\\.cn$\n(?:^|\\.)vanilla-jp\\.com$\n(?:^|\\.)vanpeople\\.com$\n(?:^|\\.)vansky\\.com$\n(?:^|\\.)vaticannews\\.va$\n(?:^|\\.)vatn\\.org$\n(?:^|\\.)vcf-online\\.org$\n(?:^|\\.)vcfbuilder\\.org$\n(?:^|\\.)vds\\.rightster\\.com$\n(?:^|\\.)vegas\\.williamhill\\.com$\n(?:^|\\.)vegasred\\.com$\n(?:^|\\.)velkaepocha\\.sk$\n(?:^|\\.)venbbs\\.com$\n(?:^|\\.)venchina\\.com$\n(?:^|\\.)venetianmacao\\.com$\n(?:^|\\.)ventureswell\\.com$\n(?:^|\\.)veoh\\.com$\n(?:^|\\.)vermonttibet\\.org$\n(?:^|\\.)versavpn\\.com$\n(?:^|\\.)verybs\\.com$\n(?:^|\\.)vevo\\.com$\n(?:^|\\.)vft\\.com\\.tw$\n(?:^|\\.)viber\\.com$\n(?:^|\\.)vica\\.info$\n(?:^|\\.)victimsofcommunism\\.org$\n(?:^|\\.)vid\\.me$\n(?:^|\\.)vidble\\.com$\n(?:^|\\.)video\\.aol\\.ca$\n(?:^|\\.)video\\.aol\\.co\\.uk$\n(?:^|\\.)video\\.aol\\.com$\n(?:^|\\.)video\\.ap\\.org$\n(?:^|\\.)video\\.fdbox\\.com$\n(?:^|\\.)video\\.foxbusiness\\.com$\n(?:^|\\.)video\\.pbs\\.org$\n(?:^|\\.)video\\.yahoo\\.com$\n(?:^|\\.)videobam\\.com$\n(?:^|\\.)videodetective\\.com$\n(?:^|\\.)videomega\\.tv$\n(?:^|\\.)videomo\\.com$\n(?:^|\\.)videopediaworld\\.com$\n(?:^|\\.)videopress\\.com$\n(?:^|\\.)vidinfo\\.org$\n(?:^|\\.)vietdaikynguyen\\.com$\n(?:^|\\.)vijayatemple\\.org$\n(?:^|\\.)vimeo\\.com$\n(?:^|\\.)vimperator\\.org$\n(?:^|\\.)vincnd\\.com$\n(?:^|\\.)vine\\.co$\n(?:^|\\.)vinniev\\.com$\n(?:^|\\.)vip-enterprise\\.com$\n(?:^|\\.)virtualrealporn\\.com$\n(?:^|\\.)visibletweets\\.com$\n(?:^|\\.)vital247\\.org$\n(?:^|\\.)viu\\.com$\n(?:^|\\.)viu\\.tv$\n(?:^|\\.)vivahentai4u\\.net$\n(?:^|\\.)vivatube\\.com$\n(?:^|\\.)vivthomas\\.com$\n(?:^|\\.)vizvaz\\.com$\n(?:^|\\.)vjav\\.com$\n(?:^|\\.)vjmedia\\.com\\.hk$\n(?:^|\\.)vllcs\\.org$\n(?:^|\\.)vlog\\.xuite\\.net$\n(?:^|\\.)vmixcore\\.com$\n(?:^|\\.)vmpsoft\\.com$\n(?:^|\\.)vn\\.hao123\\.com$\n(?:^|\\.)vnet\\.link$\n(?:^|\\.)voa-11\\.akacast\\.akamaistream\\.net$\n(?:^|\\.)voacantonese\\.com$\n(?:^|\\.)voachinese\\.com$\n(?:^|\\.)voachineseblog\\.com$\n(?:^|\\.)voagd\\.com$\n(?:^|\\.)voanews\\.com$\n(?:^|\\.)voatibetan\\.com$\n(?:^|\\.)voatibetanenglish\\.com$\n(?:^|\\.)vocativ\\.com$\n(?:^|\\.)vocn\\.tv$\n(?:^|\\.)vod-abematv\\.akamaized\\.net$\n(?:^|\\.)vod\\.wwe\\.com$\n(?:^|\\.)vot\\.org$\n(?:^|\\.)vovo2000\\.com$\n(?:^|\\.)voxer\\.com$\n(?:^|\\.)voy\\.com$\n(?:^|\\.)vpn\\.ac$\n(?:^|\\.)vpn\\.cjb\\.net$\n(?:^|\\.)vpn\\.cmu\\.edu$\n(?:^|\\.)vpn\\.sv\\.cmu\\.edu$\n(?:^|\\.)vpn4all\\.com$\n(?:^|\\.)vpnaccount\\.org$\n(?:^|\\.)vpnaccounts\\.com$\n(?:^|\\.)vpnbook\\.com$\n(?:^|\\.)vpncomparison\\.org$\n(?:^|\\.)vpncoupons\\.com$\n(?:^|\\.)vpncup\\.com$\n(?:^|\\.)vpndada\\.com$\n(?:^|\\.)vpnfan\\.com$\n(?:^|\\.)vpnfire\\.com$\n(?:^|\\.)vpnfires\\.biz$\n(?:^|\\.)vpnforgame\\.net$\n(?:^|\\.)vpngate\\.jp$\n(?:^|\\.)vpngate\\.net$\n(?:^|\\.)vpngratis\\.net$\n(?:^|\\.)vpnhq\\.com$\n(?:^|\\.)vpninja\\.net$\n(?:^|\\.)vpnintouch\\.com$\n(?:^|\\.)vpnintouch\\.net$\n(?:^|\\.)vpnjack\\.com$\n(?:^|\\.)vpnmaster\\.com$\n(?:^|\\.)vpnmentor\\.com$\n(?:^|\\.)vpnpick\\.com$\n(?:^|\\.)vpnpop\\.com$\n(?:^|\\.)vpnpronet\\.com$\n(?:^|\\.)vpnreactor\\.com$\n(?:^|\\.)vpnreviewz\\.com$\n(?:^|\\.)vpnsecure\\.me$\n(?:^|\\.)vpnshazam\\.com$\n(?:^|\\.)vpnshieldapp\\.com$\n(?:^|\\.)vpnsp\\.com$\n(?:^|\\.)vpntraffic\\.com$\n(?:^|\\.)vpntunnel\\.com$\n(?:^|\\.)vpnuk\\.info$\n(?:^|\\.)vpnunlimitedapp\\.com$\n(?:^|\\.)vpnvip\\.com$\n(?:^|\\.)vpnworldwide\\.com$\n(?:^|\\.)vporn\\.com$\n(?:^|\\.)vpser\\.net$\n(?:^|\\.)vraiesagesse\\.net$\n(?:^|\\.)vrmtr\\.com$\n(?:^|\\.)vrsmash\\.com$\n(?:^|\\.)vtunnel\\.com$\n(?:^|\\.)vuku\\.cc$\n(?:^|\\.)vultryhw\\.com$\n(?:^|\\.)w\\.idaiwan\\.com$\n(?:^|\\.)w3schools\\.com$\n(?:^|\\.)waffle1999\\.com$\n(?:^|\\.)wahas\\.com$\n(?:^|\\.)waigaobu\\.com$\n(?:^|\\.)waikeung\\.org$\n(?:^|\\.)wailaike\\.net$\n(?:^|\\.)waiwaier\\.com$\n(?:^|\\.)wallmama\\.com$\n(?:^|\\.)wallornot\\.org$\n(?:^|\\.)wallpapercasa\\.com$\n(?:^|\\.)wallproxy\\.com$\n(?:^|\\.)waltermartin\\.com$\n(?:^|\\.)waltermartin\\.org$\n(?:^|\\.)wanderinghorse\\.net$\n(?:^|\\.)wangafu\\.net$\n(?:^|\\.)wangjinbo\\.org$\n(?:^|\\.)wanglixiong\\.com$\n(?:^|\\.)wango\\.org$\n(?:^|\\.)wangruoshui\\.net$\n(?:^|\\.)want-daily\\.com$\n(?:^|\\.)wanz-factory\\.com$\n(?:^|\\.)wapedia\\.mobi$\n(?:^|\\.)warbler\\.iconfactory\\.net$\n(?:^|\\.)waselpro\\.com$\n(?:^|\\.)washeng\\.net$\n(?:^|\\.)watch8x\\.com$\n(?:^|\\.)watchinese\\.com$\n(?:^|\\.)watchmygf\\.net$\n(?:^|\\.)wattpad\\.com$\n(?:^|\\.)wav\\.tv$\n(?:^|\\.)waveprotocol\\.org$\n(?:^|\\.)waymo\\.com$\n(?:^|\\.)wda\\.gov\\.tw$\n(?:^|\\.)wdf5\\.com$\n(?:^|\\.)wearehairy\\.com$\n(?:^|\\.)wearn\\.com$\n(?:^|\\.)web\\.dev$\n(?:^|\\.)web2project\\.net$\n(?:^|\\.)webbang\\.net$\n(?:^|\\.)webevader\\.org$\n(?:^|\\.)webfreer\\.com$\n(?:^|\\.)webjb\\.org$\n(?:^|\\.)weblagu\\.com$\n(?:^|\\.)webmproject\\.org$\n(?:^|\\.)webrtc\\.org$\n(?:^|\\.)webrush\\.net$\n(?:^|\\.)webs-tv\\.net$\n(?:^|\\.)website\\.informer\\.com$\n(?:^|\\.)websitepulse\\.com$\n(?:^|\\.)webwarper\\.net$\n(?:^|\\.)webworkerdaily\\.com$\n(?:^|\\.)weekmag\\.info$\n(?:^|\\.)wefightcensorship\\.org$\n(?:^|\\.)wefong\\.com$\n(?:^|\\.)wego\\.here\\.com$\n(?:^|\\.)weiboleak\\.com$\n(?:^|\\.)weiboscope\\.jmsc\\.hku\\.hk$\n(?:^|\\.)weihuo\\.org$\n(?:^|\\.)weijingsheng\\.org$\n(?:^|\\.)weiming\\.info$\n(?:^|\\.)weiquanwang\\.org$\n(?:^|\\.)weisuo\\.ws$\n(?:^|\\.)welovecock\\.com$\n(?:^|\\.)wemigrate\\.org$\n(?:^|\\.)wengewang\\.com$\n(?:^|\\.)wengewang\\.org$\n(?:^|\\.)wenhui\\.ch$\n(?:^|\\.)wenxuecity\\.com$\n(?:^|\\.)wenyunchao\\.com$\n(?:^|\\.)wenzhao\\.ca$\n(?:^|\\.)westca\\.com$\n(?:^|\\.)westernshugdensociety\\.org$\n(?:^|\\.)westernwolves\\.com$\n(?:^|\\.)westkit\\.net$\n(?:^|\\.)westpoint\\.edu$\n(?:^|\\.)wetplace\\.com$\n(?:^|\\.)wetpussygames\\.com$\n(?:^|\\.)wexiaobo\\.org$\n(?:^|\\.)wezhiyong\\.org$\n(?:^|\\.)wezone\\.net$\n(?:^|\\.)wforum\\.com$\n(?:^|\\.)wha\\.la$\n(?:^|\\.)whatblocked\\.com$\n(?:^|\\.)whatbrowser\\.org$\n(?:^|\\.)whatsapp\\.com$\n(?:^|\\.)whatsapp\\.net$\n(?:^|\\.)whatsonweibo\\.com$\n(?:^|\\.)wheatseeds\\.org$\n(?:^|\\.)wheelockslatin\\.com$\n(?:^|\\.)whereiswerner\\.com$\n(?:^|\\.)wheretowatch\\.com$\n(?:^|\\.)whippedass\\.com$\n(?:^|\\.)whitebear\\.freebearblog\\.org$\n(?:^|\\.)whodns\\.xyz$\n(?:^|\\.)whoer\\.net$\n(?:^|\\.)whotalking\\.com$\n(?:^|\\.)whylover\\.com$\n(?:^|\\.)whyx\\.org$\n(?:^|\\.)widevine\\.com$\n(?:^|\\.)wikaba\\.com$\n(?:^|\\.)wiki\\.cnitter\\.com$\n(?:^|\\.)wiki\\.esu\\.im$\n(?:^|\\.)wiki\\.gamerp\\.jp$\n(?:^|\\.)wiki\\.jqueryui\\.com$\n(?:^|\\.)wiki\\.keso\\.cn$\n(?:^|\\.)wiki\\.moegirl\\.org$\n(?:^|\\.)wiki\\.oauth\\.net$\n(?:^|\\.)wiki\\.phonegap\\.com$\n(?:^|\\.)wikileaks-forum\\.com$\n(?:^|\\.)wikileaks\\.ch$\n(?:^|\\.)wikileaks\\.com$\n(?:^|\\.)wikileaks\\.de$\n(?:^|\\.)wikileaks\\.eu$\n(?:^|\\.)wikileaks\\.lu$\n(?:^|\\.)wikileaks\\.org$\n(?:^|\\.)wikileaks\\.pl$\n(?:^|\\.)wikilivres\\.info$\n(?:^|\\.)wikimapia\\.org$\n(?:^|\\.)wikipedia\\.org$\n(?:^|\\.)wikiwiki\\.jp$\n(?:^|\\.)wildammo\\.com$\n(?:^|\\.)williamhill\\.com$\n(?:^|\\.)willw\\.net$\n(?:^|\\.)windowsphoneme\\.com$\n(?:^|\\.)windscribe\\.com$\n(?:^|\\.)wingamestore\\.com$\n(?:^|\\.)wingy\\.site$\n(?:^|\\.)winning11\\.com$\n(?:^|\\.)winwhispers\\.info$\n(?:^|\\.)wire\\.com$\n(?:^|\\.)wiredbytes\\.com$\n(?:^|\\.)wiredpen\\.com$\n(?:^|\\.)wisdompubs\\.org$\n(?:^|\\.)wisevid\\.com$\n(?:^|\\.)withgoogle\\.com$\n(?:^|\\.)withyoutube\\.com$\n(?:^|\\.)witnessleeteaching\\.com$\n(?:^|\\.)witopia\\.net$\n(?:^|\\.)wizcrafts\\.net$\n(?:^|\\.)wjbk\\.org$\n(?:^|\\.)wlcnew\\.jigsy\\.com$\n(?:^|\\.)wlx\\.sowiki\\.net$\n(?:^|\\.)wn\\.com$\n(?:^|\\.)wnacg\\.com$\n(?:^|\\.)wnacg\\.org$\n(?:^|\\.)wo\\.tc$\n(?:^|\\.)wo3ttt\\.wordpress\\.com$\n(?:^|\\.)woeser\\.com$\n(?:^|\\.)woesermiddle-way\\.net$\n(?:^|\\.)wokar\\.org$\n(?:^|\\.)wolfax\\.com$\n(?:^|\\.)woolyss\\.com$\n(?:^|\\.)woopie\\.jp$\n(?:^|\\.)woopie\\.tv$\n(?:^|\\.)wordpress\\.com$\n(?:^|\\.)workatruna\\.com$\n(?:^|\\.)workerdemo\\.org\\.hk$\n(?:^|\\.)workerempowerment\\.org$\n(?:^|\\.)workersthebig\\.net$\n(?:^|\\.)worldcat\\.org$\n(?:^|\\.)worldjournal\\.com$\n(?:^|\\.)worldvpn\\.net$\n(?:^|\\.)wow-life\\.net$\n(?:^|\\.)wow\\.com$\n(?:^|\\.)wowgirls\\.com$\n(?:^|\\.)wowlegacy\\.ml$\n(?:^|\\.)wowporn\\.com$\n(?:^|\\.)wowrk\\.com$\n(?:^|\\.)woxinghuiguo\\.com$\n(?:^|\\.)woyaolian\\.org$\n(?:^|\\.)wozy\\.in$\n(?:^|\\.)wp\\.com$\n(?:^|\\.)wpoforum\\.com$\n(?:^|\\.)wqyd\\.org$\n(?:^|\\.)wrchina\\.org$\n(?:^|\\.)wretch\\.cc$\n(?:^|\\.)writer\\.zoho\\.com$\n(?:^|\\.)wsgzao\\.github\\.io$\n(?:^|\\.)wsj\\.com$\n(?:^|\\.)wsj\\.net$\n(?:^|\\.)wsjhk\\.com$\n(?:^|\\.)wtbn\\.org$\n(?:^|\\.)wtfpeople\\.com$\n(?:^|\\.)wuerkaixi\\.com$\n(?:^|\\.)wufafangwen\\.com$\n(?:^|\\.)wufi\\.org\\.tw$\n(?:^|\\.)wuguoguang\\.com$\n(?:^|\\.)wujie\\.net$\n(?:^|\\.)wujieliulan\\.com$\n(?:^|\\.)wukangrui\\.net$\n(?:^|\\.)wuw\\.red$\n(?:^|\\.)wuyanblog\\.com$\n(?:^|\\.)wwitv\\.com$\n(?:^|\\.)www\\.ajsands\\.com$\n(?:^|\\.)www\\.americorps\\.gov$\n(?:^|\\.)www\\.antd\\.org$\n(?:^|\\.)www\\.aolnews\\.com$\n(?:^|\\.)www\\.businessinsider\\.com\\.au$\n(?:^|\\.)www\\.citizenlab\\.org$\n(?:^|\\.)www\\.cmoinc\\.org$\n(?:^|\\.)www\\.cool18\\.com$\n(?:^|\\.)www\\.dmm\\.com$\n(?:^|\\.)www\\.dwheeler\\.com$\n(?:^|\\.)www\\.eastturkistan\\.net$\n(?:^|\\.)www\\.gmiddle\\.com$\n(?:^|\\.)www\\.gmiddle\\.net$\n(?:^|\\.)www\\.hustlercash\\.com$\n(?:^|\\.)www\\.idlcoyote\\.com$\n(?:^|\\.)www\\.imdb\\.com$\n(?:^|\\.)www\\.kindleren\\.com$\n(?:^|\\.)www\\.klip\\.me$\n(?:^|\\.)www\\.lamenhu\\.com$\n(?:^|\\.)www\\.lib\\.virginia\\.edu$\n(?:^|\\.)www\\.linksalpha\\.com$\n(?:^|\\.)www\\.m-sport\\.co\\.uk$\n(?:^|\\.)www\\.metro\\.taipei$\n(?:^|\\.)www\\.monlamit\\.org$\n(?:^|\\.)www\\.moztw\\.org$\n(?:^|\\.)www\\.nbc\\.com$\n(?:^|\\.)www\\.orchidbbs\\.com$\n(?:^|\\.)www\\.owind\\.com$\n(?:^|\\.)www\\.oxid\\.it$\n(?:^|\\.)www\\.powerpointninja\\.com$\n(?:^|\\.)www\\.s4miniarchive\\.com$\n(?:^|\\.)www\\.sciencemag\\.org$\n(?:^|\\.)www\\.shadowsocks\\.com$\n(?:^|\\.)www\\.shwchurch\\.org$\n(?:^|\\.)www\\.skype\\.com$\n(?:^|\\.)www\\.tablesgenerator\\.com$\n(?:^|\\.)www\\.taiwanonline\\.cc$\n(?:^|\\.)www\\.taup\\.org\\.tw$\n(?:^|\\.)www\\.thechinastory\\.org$\n(?:^|\\.)www\\.wan-press\\.org$\n(?:^|\\.)www\\.wangruowang\\.org$\n(?:^|\\.)www\\.websnapr\\.com$\n(?:^|\\.)www\\.zensur\\.freerk\\.com$\n(?:^|\\.)www1\\.american\\.edu$\n(?:^|\\.)www1\\.biz$\n(?:^|\\.)www2\\.ohchr\\.org$\n(?:^|\\.)www2\\.rocketbbs\\.com$\n(?:^|\\.)wwwhost\\.biz$\n(?:^|\\.)wzyboy\\.im$\n(?:^|\\.)x-art\\.com$\n(?:^|\\.)x-berry\\.com$\n(?:^|\\.)x-wall\\.org$\n(?:^|\\.)x\\.company$\n(?:^|\\.)x1949x\\.com$\n(?:^|\\.)x24hr\\.com$\n(?:^|\\.)x365x\\.com$\n(?:^|\\.)xa\\.yimg\\.com$\n(?:^|\\.)xanga\\.com$\n(?:^|\\.)xbabe\\.com$\n(?:^|\\.)xbookcn\\.com$\n(?:^|\\.)xbtce\\.com$\n(?:^|\\.)xcafe\\.in$\n(?:^|\\.)xcity\\.jp$\n(?:^|\\.)xcritic\\.com$\n(?:^|\\.)xerotica\\.com$\n(?:^|\\.)xfinity\\.com$\n(?:^|\\.)xfm\\.pp\\.ru$\n(?:^|\\.)xgmyd\\.com$\n(?:^|\\.)xhamster\\.com$\n(?:^|\\.)xianba\\.net$\n(?:^|\\.)xianchawang\\.net$\n(?:^|\\.)xianjian\\.tw$\n(?:^|\\.)xianqiao\\.net$\n(?:^|\\.)xiaobaiwu\\.com$\n(?:^|\\.)xiaochuncnjp\\.com$\n(?:^|\\.)xiaod\\.in$\n(?:^|\\.)xiaohexie\\.com$\n(?:^|\\.)xiaolan\\.me$\n(?:^|\\.)xiaoma\\.org$\n(?:^|\\.)xiezhua\\.com$\n(?:^|\\.)xihua\\.es$\n(?:^|\\.)xijie\\.wordpress\\.com$\n(?:^|\\.)xing\\.com$\n(?:^|\\.)xinhuanet\\.org$\n(?:^|\\.)xinmiao\\.com\\.hk$\n(?:^|\\.)xinqimeng\\.over-blog\\.com$\n(?:^|\\.)xinsheng\\.net$\n(?:^|\\.)xinshijue\\.com$\n(?:^|\\.)xinyubbs\\.net$\n(?:^|\\.)xiongpian\\.com$\n(?:^|\\.)xiuren\\.org$\n(?:^|\\.)xizang-zhiye\\.org$\n(?:^|\\.)xjp\\.cc$\n(?:^|\\.)xjtravelguide\\.com$\n(?:^|\\.)xkiwi\\.tk$\n(?:^|\\.)xlfmtalk\\.com$\n(?:^|\\.)xlfmwz\\.info$\n(?:^|\\.)xm\\.com$\n(?:^|\\.)xml-training-guide\\.com$\n(?:^|\\.)xmovies\\.com$\n(?:^|\\.)xn--4gq171p\\.com$\n(?:^|\\.)xn--czq75pvv1aj5c\\.org$\n(?:^|\\.)xn--i2ru8q2qg\\.com$\n(?:^|\\.)xn--ngstr-lra8j\\.com$\n(?:^|\\.)xn--oiq\\.cc$\n(?:^|\\.)xn--p8j9a0d9c9a\\.xn--q9jyb4c$\n(?:^|\\.)xnxx\\.com$\n(?:^|\\.)xpdo\\.net$\n(?:^|\\.)xpud\\.org$\n(?:^|\\.)xrentdvd\\.com$\n(?:^|\\.)xskywalker\\.com$\n(?:^|\\.)xskywalker\\.net$\n(?:^|\\.)xtube\\.com$\n(?:^|\\.)xuchao\\.net$\n(?:^|\\.)xuchao\\.org$\n(?:^|\\.)xuehua\\.us$\n(?:^|\\.)xuzhiyong\\.net$\n(?:^|\\.)xvideo\\.cc$\n(?:^|\\.)xvideos\\.com$\n(?:^|\\.)xvideos\\.es$\n(?:^|\\.)xxbbx\\.com$\n(?:^|\\.)xxlmovies\\.com$\n(?:^|\\.)xxuz\\.com$\n(?:^|\\.)xxx\\.com$\n(?:^|\\.)xxx\\.xxx$\n(?:^|\\.)xxxfuckmom\\.com$\n(?:^|\\.)xxxx\\.com\\.au$\n(?:^|\\.)xxxy\\.biz$\n(?:^|\\.)xxxy\\.info$\n(?:^|\\.)xxxymovies\\.com$\n(?:^|\\.)xys\\.dxiong\\.com$\n(?:^|\\.)xys\\.org$\n(?:^|\\.)xysblogs\\.org$\n(?:^|\\.)xyy69\\.com$\n(?:^|\\.)xyy69\\.info$\n(?:^|\\.)yahoo\\.com\\.hk$\n(?:^|\\.)yakbutterblues\\.com$\n(?:^|\\.)yam\\.com$\n(?:^|\\.)yam\\.org\\.tw$\n(?:^|\\.)yanghengjun\\.com$\n(?:^|\\.)yangjianli\\.com$\n(?:^|\\.)yasni\\.co\\.uk$\n(?:^|\\.)yayabay\\.com$\n(?:^|\\.)ydy\\.com$\n(?:^|\\.)yeahteentube\\.com$\n(?:^|\\.)yecl\\.net$\n(?:^|\\.)yeelou\\.com$\n(?:^|\\.)yeeyi\\.com$\n(?:^|\\.)yegle\\.net$\n(?:^|\\.)yes-news\\.com$\n(?:^|\\.)yes\\.xxx$\n(?:^|\\.)yes123\\.com\\.tw$\n(?:^|\\.)yesasia\\.com$\n(?:^|\\.)yesasia\\.com\\.hk$\n(?:^|\\.)yespornplease\\.com$\n(?:^|\\.)yeyeclub\\.com$\n(?:^|\\.)ygto\\.com$\n(?:^|\\.)yhcw\\.net$\n(?:^|\\.)yibada\\.com$\n(?:^|\\.)yibaochina\\.com$\n(?:^|\\.)yidio\\.com$\n(?:^|\\.)yilubbs\\.com$\n(?:^|\\.)yingsuoss\\.com$\n(?:^|\\.)yinlei\\.org$\n(?:^|\\.)yipub\\.com$\n(?:^|\\.)yizhihongxing\\.com$\n(?:^|\\.)yobit\\.net$\n(?:^|\\.)yobt\\.com$\n(?:^|\\.)yobt\\.tv$\n(?:^|\\.)yogichen\\.org$\n(?:^|\\.)yolasite\\.com$\n(?:^|\\.)yomiuri\\.co\\.jp$\n(?:^|\\.)yong\\.hu$\n(?:^|\\.)yorkbbs\\.ca$\n(?:^|\\.)you-get\\.org$\n(?:^|\\.)youdontcare\\.com$\n(?:^|\\.)youjizz\\.com$\n(?:^|\\.)youmaker\\.com$\n(?:^|\\.)youngpornvideos\\.com$\n(?:^|\\.)youngspiration\\.hk$\n(?:^|\\.)youpai\\.org$\n(?:^|\\.)youporn\\.com$\n(?:^|\\.)youporngay\\.com$\n(?:^|\\.)your-freedom\\.net$\n(?:^|\\.)yourepeat\\.com$\n(?:^|\\.)yourlisten\\.com$\n(?:^|\\.)yourlust\\.com$\n(?:^|\\.)yourprivatevpn\\.com$\n(?:^|\\.)yourtrap\\.com$\n(?:^|\\.)yousendit\\.com$\n(?:^|\\.)youshun12\\.com$\n(?:^|\\.)youthnetradio\\.org$\n(?:^|\\.)youtu\\.be$\n(?:^|\\.)youtube-nocookie\\.com$\n(?:^|\\.)youtube\\.com$\n(?:^|\\.)youtubecn\\.com$\n(?:^|\\.)youtubeeducation\\.com$\n(?:^|\\.)youtubegaming\\.com$\n(?:^|\\.)youversion\\.com$\n(?:^|\\.)youwin\\.com$\n(?:^|\\.)youxu\\.info$\n(?:^|\\.)yt\\.be$\n(?:^|\\.)ytht\\.net$\n(?:^|\\.)ytimg\\.com$\n(?:^|\\.)ytn\\.co\\.kr$\n(?:^|\\.)yuanming\\.net$\n(?:^|\\.)yuanzhengtang\\.org$\n(?:^|\\.)yulghun\\.com$\n(?:^|\\.)yunchao\\.net$\n(?:^|\\.)yuntipub\\.com$\n(?:^|\\.)yuvutu\\.com$\n(?:^|\\.)yvesgeleyn\\.com$\n(?:^|\\.)ywpw\\.com$\n(?:^|\\.)yx51\\.net$\n(?:^|\\.)yyii\\.org$\n(?:^|\\.)yzzk\\.com$\n(?:^|\\.)zacebook\\.com$\n(?:^|\\.)zalmos\\.com$\n(?:^|\\.)zannel\\.com$\n(?:^|\\.)zaobao\\.com$\n(?:^|\\.)zaobao\\.com\\.sg$\n(?:^|\\.)zaozon\\.com$\n(?:^|\\.)zapto\\.org$\n(?:^|\\.)zattoo\\.com$\n(?:^|\\.)zb\\.com$\n(?:^|\\.)zdnet\\.com\\.tw$\n(?:^|\\.)zello\\.com$\n(?:^|\\.)zengjinyan\\.org$\n(?:^|\\.)zenmate\\.com$\n(?:^|\\.)zenmate\\.com\\.ru$\n(?:^|\\.)zeronet\\.io$\n(?:^|\\.)zeutch\\.com$\n(?:^|\\.)zfreet\\.com$\n(?:^|\\.)zgsddh\\.com$\n(?:^|\\.)zgzcjj\\.net$\n(?:^|\\.)zh\\.bitterwinter\\.org$\n(?:^|\\.)zh\\.ecdm\\.wikia\\.com$\n(?:^|\\.)zh\\.pokerstrategy\\.com$\n(?:^|\\.)zh\\.pttpedia\\.wikia\\.com$\n(?:^|\\.)zh\\.uncyclopedia\\.wikia\\.com$\n(?:^|\\.)zh\\.wikinews\\.org$\n(?:^|\\.)zh\\.wikisource\\.org$\n(?:^|\\.)zhanbin\\.net$\n(?:^|\\.)zhangboli\\.net$\n(?:^|\\.)zhangtianliang\\.com$\n(?:^|\\.)zhanlve\\.org$\n(?:^|\\.)zhao\\.1984\\.city$\n(?:^|\\.)zhao\\.jinhai\\.de$\n(?:^|\\.)zhenghui\\.org$\n(?:^|\\.)zhengjian\\.org$\n(?:^|\\.)zhengwunet\\.org$\n(?:^|\\.)zhenlibu\\.info$\n(?:^|\\.)zhenlibu1984\\.com$\n(?:^|\\.)zhenxiang\\.biz$\n(?:^|\\.)zhinengluyou\\.com$\n(?:^|\\.)zhongguo\\.ca$\n(?:^|\\.)zhongguorenquan\\.org$\n(?:^|\\.)zhongguotese\\.net$\n(?:^|\\.)zhongmeng\\.org$\n(?:^|\\.)zhoushuguang\\.com$\n(?:^|\\.)zhreader\\.com$\n(?:^|\\.)zhuangbi\\.me$\n(?:^|\\.)zhuanxing\\.cn$\n(?:^|\\.)zhuatieba\\.com$\n(?:^|\\.)zhuichaguoji\\.org$\n(?:^|\\.)ziddu\\.com$\n(?:^|\\.)zillionk\\.com$\n(?:^|\\.)zim\\.vn$\n(?:^|\\.)zinio\\.com$\n(?:^|\\.)ziporn\\.com$\n(?:^|\\.)zippyshare\\.com$\n(?:^|\\.)zkaip\\.com$\n(?:^|\\.)zmw\\.cn$\n(?:^|\\.)zodgame\\.us$\n(?:^|\\.)zomobo\\.net$\n(?:^|\\.)zonaeuropa\\.com$\n(?:^|\\.)zonghexinwen\\.com$\n(?:^|\\.)zonghexinwen\\.net$\n(?:^|\\.)zoogvpn\\.com$\n(?:^|\\.)zootool\\.com$\n(?:^|\\.)zoozle\\.net$\n(?:^|\\.)zorrovpn\\.com$\n(?:^|\\.)zozotown\\.com$\n(?:^|\\.)zpn\\.im$\n(?:^|\\.)zspeeder\\.me$\n(?:^|\\.)zsrhao\\.com$\n(?:^|\\.)zuo\\.la$\n(?:^|\\.)zuobiao\\.me$\n(?:^|\\.)zuola\\.com$\n(?:^|\\.)zvereff\\.com$\n(?:^|\\.)zynaima\\.com$\n(?:^|\\.)zynamics\\.com$\n(?:^|\\.)zyns\\.com$\n(?:^|\\.)zyzc9\\.com$\n(?:^|\\.)zzcartoon\\.com$\n(?:^|\\.)zzcloud\\.me$\n(?:^|\\.)zzux\\.com$\n"
  },
  {
    "path": "core/src/main/java/com/github/shadowsocks/BootReceiver.kt",
    "content": "/*******************************************************************************\n *                                                                             *\n *  Copyright (C) 2017 by Max Lv <max.c.lv@gmail.com>                          *\n *  Copyright (C) 2017 by Mygod Studio <contact-shadowsocks-android@mygod.be>  *\n *                                                                             *\n *  This program is free software: you can redistribute it and/or modify       *\n *  it under the terms of the GNU General Public License as published by       *\n *  the Free Software Foundation, either version 3 of the License, or          *\n *  (at your option) any later version.                                        *\n *                                                                             *\n *  This program is distributed in the hope that it will be useful,            *\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of             *\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the              *\n *  GNU General Public License for more details.                               *\n *                                                                             *\n *  You should have received a copy of the GNU General Public License          *\n *  along with this program. If not, see <http://www.gnu.org/licenses/>.       *\n *                                                                             *\n *******************************************************************************/\n\npackage com.github.shadowsocks\n\nimport android.content.BroadcastReceiver\nimport android.content.ComponentName\nimport android.content.Context\nimport android.content.Intent\nimport android.content.pm.PackageManager\nimport android.os.Build\nimport com.github.shadowsocks.Core.app\nimport com.github.shadowsocks.preference.DataStore\n\nclass BootReceiver : BroadcastReceiver() {\n    companion object {\n        private val componentName by lazy { ComponentName(app, BootReceiver::class.java) }\n        var enabled: Boolean\n            get() = app.packageManager.getComponentEnabledSetting(componentName) ==\n                    PackageManager.COMPONENT_ENABLED_STATE_ENABLED\n            set(value) = app.packageManager.setComponentEnabledSetting(componentName,\n                    if (value) PackageManager.COMPONENT_ENABLED_STATE_ENABLED\n                    else PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP)\n    }\n\n    override fun onReceive(context: Context, intent: Intent) {\n        if (!DataStore.persistAcrossReboot) {   // sanity check\n            enabled = false\n            return\n        }\n        val doStart = when (intent.action) {\n            Intent.ACTION_BOOT_COMPLETED -> !DataStore.directBootAware\n            Intent.ACTION_LOCKED_BOOT_COMPLETED -> DataStore.directBootAware\n            else -> DataStore.directBootAware || Build.VERSION.SDK_INT >= 24 && Core.user.isUserUnlocked\n        }\n        if (doStart) Core.startService()\n    }\n}\n"
  },
  {
    "path": "core/src/main/java/com/github/shadowsocks/Core.kt",
    "content": "/*******************************************************************************\n *                                                                             *\n *  Copyright (C) 2018 by Max Lv <max.c.lv@gmail.com>                          *\n *  Copyright (C) 2018 by Mygod Studio <contact-shadowsocks-android@mygod.be>  *\n *                                                                             *\n *  This program is free software: you can redistribute it and/or modify       *\n *  it under the terms of the GNU General Public License as published by       *\n *  the Free Software Foundation, either version 3 of the License, or          *\n *  (at your option) any later version.                                        *\n *                                                                             *\n *  This program is distributed in the hope that it will be useful,            *\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of             *\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the              *\n *  GNU General Public License for more details.                               *\n *                                                                             *\n *  You should have received a copy of the GNU General Public License          *\n *  along with this program. If not, see <http://www.gnu.org/licenses/>.       *\n *                                                                             *\n *******************************************************************************/\n\npackage com.github.shadowsocks\n\nimport android.app.ActivityManager\nimport android.app.Application\nimport android.app.NotificationChannel\nimport android.app.NotificationManager\nimport android.app.PendingIntent\nimport android.app.admin.DevicePolicyManager\nimport android.content.ClipData\nimport android.content.ClipDescription\nimport android.content.ClipboardManager\nimport android.content.Context\nimport android.content.Intent\nimport android.content.pm.PackageInfo\nimport android.content.pm.PackageManager\nimport android.net.ConnectivityManager\nimport android.os.Build\nimport android.os.UserManager\nimport android.util.Log\nimport androidx.annotation.RequiresApi\nimport androidx.annotation.VisibleForTesting\nimport androidx.core.content.ContextCompat\nimport androidx.core.content.getSystemService\nimport androidx.core.os.persistableBundleOf\nimport com.github.shadowsocks.acl.Acl\nimport com.github.shadowsocks.aidl.ShadowsocksConnection\nimport com.github.shadowsocks.core.BuildConfig\nimport com.github.shadowsocks.core.R\nimport com.github.shadowsocks.database.Profile\nimport com.github.shadowsocks.database.ProfileManager\nimport com.github.shadowsocks.preference.DataStore\nimport com.github.shadowsocks.subscription.SubscriptionService\nimport com.github.shadowsocks.utils.Action\nimport com.github.shadowsocks.utils.DeviceStorageApp\nimport com.github.shadowsocks.utils.DirectBoot\nimport com.github.shadowsocks.utils.Key\nimport com.google.firebase.FirebaseApp\nimport com.google.firebase.crashlytics.FirebaseCrashlytics\nimport kotlinx.coroutines.DEBUG_PROPERTY_NAME\nimport kotlinx.coroutines.DEBUG_PROPERTY_VALUE_ON\nimport timber.log.Timber\nimport java.io.File\nimport java.io.IOException\nimport kotlin.reflect.KClass\n\nobject Core {\n    lateinit var app: Application\n        @VisibleForTesting set\n    lateinit var configureIntent: (Context) -> PendingIntent\n    val activity by lazy { app.getSystemService<ActivityManager>()!! }\n    val clipboard by lazy { app.getSystemService<ClipboardManager>()!! }\n    val connectivity by lazy { app.getSystemService<ConnectivityManager>()!! }\n    val notification by lazy { app.getSystemService<NotificationManager>()!! }\n    val user by lazy { app.getSystemService<UserManager>()!! }\n    val packageInfo: PackageInfo by lazy { getPackageInfo(app.packageName) }\n    val deviceStorage by lazy { if (Build.VERSION.SDK_INT < 24) app else DeviceStorageApp(app) }\n    val directBootSupported by lazy {\n        Build.VERSION.SDK_INT >= 24 && try {\n            app.getSystemService<DevicePolicyManager>()?.storageEncryptionStatus ==\n                    DevicePolicyManager.ENCRYPTION_STATUS_ACTIVE_PER_USER\n        } catch (_: RuntimeException) {\n            false\n        }\n    }\n\n    val activeProfileIds get() = ProfileManager.getProfile(DataStore.profileId).let {\n        if (it == null) emptyList() else listOfNotNull(it.id, it.udpFallback)\n    }\n    val currentProfile: ProfileManager.ExpandedProfile? get() {\n        if (DataStore.directBootAware) DirectBoot.getDeviceProfile()?.apply { return this }\n        return ProfileManager.expand(ProfileManager.getProfile(DataStore.profileId) ?: return null)\n    }\n\n    fun switchProfile(id: Long): Profile {\n        val result = ProfileManager.getProfile(id) ?: ProfileManager.createProfile()\n        DataStore.profileId = result.id\n        return result\n    }\n\n    fun init(app: Application, configureClass: KClass<out Any>) {\n        this.app = app\n        this.configureIntent = {\n            PendingIntent.getActivity(it, 0, Intent(it, configureClass.java)\n                    .setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT), PendingIntent.FLAG_IMMUTABLE)\n        }\n\n        if (Build.VERSION.SDK_INT >= 24) {  // migrate old files\n            deviceStorage.moveDatabaseFrom(app, Key.DB_PUBLIC)\n            val old = Acl.getFile(Acl.CUSTOM_RULES_USER, app)\n            if (old.canRead()) {\n                Acl.getFile(Acl.CUSTOM_RULES_USER).writeText(old.readText())\n                old.delete()\n            }\n        }\n\n        // overhead of debug mode is minimal: https://github.com/Kotlin/kotlinx.coroutines/blob/f528898/docs/debugging.md#debug-mode\n        System.setProperty(DEBUG_PROPERTY_NAME, DEBUG_PROPERTY_VALUE_ON)\n        FirebaseApp.initializeApp(deviceStorage)  // multiple processes needs manual set-up\n        FirebaseCrashlytics.getInstance().setCustomKey(\"build\", Build.DISPLAY)\n        Timber.plant(object : Timber.DebugTree() {\n            override fun log(priority: Int, tag: String?, message: String, t: Throwable?) {\n                if (t == null) {\n                    if (priority != Log.DEBUG || BuildConfig.DEBUG) Log.println(priority, tag, message)\n                    FirebaseCrashlytics.getInstance().log(\"${\"XXVDIWEF\".getOrElse(priority) { 'X' }}/$tag: $message\")\n                } else {\n                    if (priority >= Log.WARN || priority == Log.DEBUG) Log.println(priority, tag, message)\n                    if (priority >= Log.INFO) FirebaseCrashlytics.getInstance().recordException(t)\n                }\n            }\n        })\n\n        // handle data restored/crash\n        if (Build.VERSION.SDK_INT >= 24 && DataStore.directBootAware && user.isUserUnlocked) {\n            DirectBoot.flushTrafficStats()\n        }\n        if (DataStore.publicStore.getLong(Key.assetUpdateTime, -1) != packageInfo.lastUpdateTime) {\n            val assetManager = app.assets\n            try {\n                for (file in assetManager.list(\"acl\")!!) assetManager.open(\"acl/$file\").use { input ->\n                    File(deviceStorage.noBackupFilesDir, file).outputStream().use { output -> input.copyTo(output) }\n                }\n            } catch (e: IOException) {\n                Timber.w(e)\n            }\n            DataStore.publicStore.putLong(Key.assetUpdateTime, packageInfo.lastUpdateTime)\n        }\n        updateNotificationChannels()\n    }\n\n    fun updateNotificationChannels() {\n        if (Build.VERSION.SDK_INT >= 26) @RequiresApi(26) {\n            notification.createNotificationChannels(listOf(\n                    NotificationChannel(\"service-vpn\", app.getText(R.string.service_vpn),\n                            if (Build.VERSION.SDK_INT >= 28) NotificationManager.IMPORTANCE_MIN\n                            else NotificationManager.IMPORTANCE_LOW),   // #1355\n                    NotificationChannel(\"service-proxy\", app.getText(R.string.service_proxy),\n                            NotificationManager.IMPORTANCE_LOW),\n                    NotificationChannel(\"service-transproxy\", app.getText(R.string.service_transproxy),\n                            NotificationManager.IMPORTANCE_LOW),\n                    SubscriptionService.notificationChannel))\n            notification.deleteNotificationChannel(\"service-nat\")   // NAT mode is gone for good\n        }\n    }\n\n    fun getPackageInfo(packageName: String) = app.packageManager.getPackageInfo(packageName,\n            if (Build.VERSION.SDK_INT >= 28) PackageManager.GET_SIGNING_CERTIFICATES\n            else @Suppress(\"DEPRECATION\") PackageManager.GET_SIGNATURES)!!\n\n    fun trySetPrimaryClip(clip: String, isSensitive: Boolean = false) = try {\n        clipboard.setPrimaryClip(ClipData.newPlainText(null, clip).apply {\n            if (isSensitive && Build.VERSION.SDK_INT >= 24) {\n                description.extras = persistableBundleOf(ClipDescription.EXTRA_IS_SENSITIVE to true)\n            }\n        })\n        true\n    } catch (e: RuntimeException) {\n        Timber.d(e)\n        false\n    }\n\n    fun startService() = ContextCompat.startForegroundService(app, Intent(app, ShadowsocksConnection.serviceClass))\n    fun reloadService() = app.sendBroadcast(Intent(Action.RELOAD).setPackage(app.packageName))\n    fun stopService() = app.sendBroadcast(Intent(Action.CLOSE).setPackage(app.packageName))\n}\n"
  },
  {
    "path": "core/src/main/java/com/github/shadowsocks/UrlImportActivity.kt",
    "content": "/*******************************************************************************\n *                                                                             *\n *  Copyright (C) 2019 by Max Lv <max.c.lv@gmail.com>                          *\n *  Copyright (C) 2019 by Mygod Studio <contact-shadowsocks-android@mygod.be>  *\n *                                                                             *\n *  This program is free software: you can redistribute it and/or modify       *\n *  it under the terms of the GNU General Public License as published by       *\n *  the Free Software Foundation, either version 3 of the License, or          *\n *  (at your option) any later version.                                        *\n *                                                                             *\n *  This program is distributed in the hope that it will be useful,            *\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of             *\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the              *\n *  GNU General Public License for more details.                               *\n *                                                                             *\n *  You should have received a copy of the GNU General Public License          *\n *  along with this program. If not, see <http://www.gnu.org/licenses/>.       *\n *                                                                             *\n *******************************************************************************/\n\npackage com.github.shadowsocks\n\nimport android.content.DialogInterface\nimport android.os.Bundle\nimport android.os.Parcelable\nimport android.widget.Toast\nimport androidx.appcompat.app.AlertDialog\nimport androidx.appcompat.app.AppCompatActivity\nimport com.github.shadowsocks.core.R\nimport com.github.shadowsocks.database.Profile\nimport com.github.shadowsocks.database.ProfileManager\nimport com.github.shadowsocks.plugin.fragment.AlertDialogFragment\nimport com.github.shadowsocks.plugin.fragment.Empty\nimport com.github.shadowsocks.plugin.fragment.showAllowingStateLoss\nimport kotlinx.parcelize.Parcelize\n\nclass UrlImportActivity : AppCompatActivity() {\n    @Parcelize\n    data class ProfilesArg(val profiles: List<Profile>) : Parcelable\n    class ImportProfilesDialogFragment : AlertDialogFragment<ProfilesArg, Empty>() {\n        override fun AlertDialog.Builder.prepare(listener: DialogInterface.OnClickListener) {\n            setTitle(R.string.add_profile_dialog)\n            setPositiveButton(R.string.yes, listener)\n            setNegativeButton(R.string.no, listener)\n            setMessage(arg.profiles.joinToString(\"\\n\"))\n        }\n\n        override fun onClick(dialog: DialogInterface?, which: Int) {\n            if (which == DialogInterface.BUTTON_POSITIVE) arg.profiles.forEach { ProfileManager.createProfile(it) }\n            requireActivity().finish()\n        }\n\n        override fun onDismiss(dialog: DialogInterface) {\n            super.onDismiss(dialog)\n            requireActivity().finish()\n        }\n    }\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        when (val dialog = handleShareIntent()) {\n            null -> {\n                Toast.makeText(this, R.string.profile_invalid_input, Toast.LENGTH_SHORT).show()\n                finish()\n            }\n            else -> dialog.showAllowingStateLoss(supportFragmentManager)\n        }\n    }\n\n    private fun handleShareIntent() = intent.data?.toString()?.let { sharedStr ->\n        val profiles = Profile.findAllUrls(sharedStr, Core.currentProfile?.main).toList()\n        if (profiles.isEmpty()) null else ImportProfilesDialogFragment().apply {\n            arg(ProfilesArg(profiles))\n            key()\n        }\n    }\n}\n"
  },
  {
    "path": "core/src/main/java/com/github/shadowsocks/VpnRequestActivity.kt",
    "content": "/*******************************************************************************\n *                                                                             *\n *  Copyright (C) 2017 by Max Lv <max.c.lv@gmail.com>                          *\n *  Copyright (C) 2017 by Mygod Studio <contact-shadowsocks-android@mygod.be>  *\n *                                                                             *\n *  This program is free software: you can redistribute it and/or modify       *\n *  it under the terms of the GNU General Public License as published by       *\n *  the Free Software Foundation, either version 3 of the License, or          *\n *  (at your option) any later version.                                        *\n *                                                                             *\n *  This program is distributed in the hope that it will be useful,            *\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of             *\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the              *\n *  GNU General Public License for more details.                               *\n *                                                                             *\n *  You should have received a copy of the GNU General Public License          *\n *  along with this program. If not, see <http://www.gnu.org/licenses/>.       *\n *                                                                             *\n *******************************************************************************/\n\npackage com.github.shadowsocks\n\nimport android.app.KeyguardManager\nimport android.content.BroadcastReceiver\nimport android.content.Intent\nimport android.content.IntentFilter\nimport android.os.Bundle\nimport android.widget.Toast\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.core.content.getSystemService\nimport com.github.shadowsocks.core.R\nimport com.github.shadowsocks.preference.DataStore\nimport com.github.shadowsocks.utils.Key\nimport com.github.shadowsocks.utils.StartService\nimport com.github.shadowsocks.utils.broadcastReceiver\n\nclass VpnRequestActivity : AppCompatActivity() {\n    private var receiver: BroadcastReceiver? = null\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        if (DataStore.serviceMode != Key.modeVpn) {\n            finish()\n            return\n        }\n        if (getSystemService<KeyguardManager>()!!.isKeyguardLocked) {\n            receiver = broadcastReceiver { _, _ -> connect.launch(null) }\n            registerReceiver(receiver, IntentFilter(Intent.ACTION_USER_PRESENT))\n        } else connect.launch(null)\n    }\n\n    private val connect = registerForActivityResult(StartService()) {\n        if (it) Toast.makeText(this, R.string.vpn_permission_denied, Toast.LENGTH_LONG).show()\n        finish()\n    }\n\n    override fun onDestroy() {\n        super.onDestroy()\n        if (receiver != null) unregisterReceiver(receiver)\n    }\n}\n"
  },
  {
    "path": "core/src/main/java/com/github/shadowsocks/acl/Acl.kt",
    "content": "/*******************************************************************************\n *                                                                             *\n *  Copyright (C) 2017 by Max Lv <max.c.lv@gmail.com>                          *\n *  Copyright (C) 2017 by Mygod Studio <contact-shadowsocks-android@mygod.be>  *\n *                                                                             *\n *  This program is free software: you can redistribute it and/or modify       *\n *  it under the terms of the GNU General Public License as published by       *\n *  the Free Software Foundation, either version 3 of the License, or          *\n *  (at your option) any later version.                                        *\n *                                                                             *\n *  This program is distributed in the hope that it will be useful,            *\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of             *\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the              *\n *  GNU General Public License for more details.                               *\n *                                                                             *\n *  You should have received a copy of the GNU General Public License          *\n *  along with this program. If not, see <http://www.gnu.org/licenses/>.       *\n *                                                                             *\n *******************************************************************************/\n\npackage com.github.shadowsocks.acl\n\nimport android.content.Context\nimport androidx.recyclerview.widget.SortedList\nimport com.github.shadowsocks.Core\nimport com.github.shadowsocks.net.Subnet\nimport com.github.shadowsocks.utils.BaseSorter\nimport com.github.shadowsocks.utils.URLSorter\nimport com.github.shadowsocks.utils.asIterable\nimport kotlinx.coroutines.Job\nimport kotlinx.coroutines.ensureActive\nimport kotlinx.coroutines.runBlocking\nimport timber.log.Timber\nimport java.io.File\nimport java.io.IOException\nimport java.io.Reader\nimport java.net.HttpURLConnection\nimport java.net.URL\nimport java.net.URLConnection\nimport kotlin.coroutines.coroutineContext\n\nclass Acl {\n    companion object {\n        const val ALL = \"all\"\n        const val BYPASS_LAN = \"bypass-lan\"\n        const val BYPASS_CHN = \"bypass-china\"\n        const val BYPASS_LAN_CHN = \"bypass-lan-china\"\n        const val GFWLIST = \"gfwlist\"\n        const val CHINALIST = \"china-list\"\n        const val CUSTOM_RULES = \"custom-rules\"\n        const val CUSTOM_RULES_USER = \"custom-rules-user\"\n\n        private val networkAclParser = \"^IMPORT_URL\\\\s*<(.+)>\\\\s*$\".toRegex()\n\n        fun getFile(id: String, context: Context = Core.deviceStorage) = File(context.noBackupFilesDir, \"$id.acl\")\n\n        var customRules: Acl\n            get() {\n                val acl = Acl()\n                val file = getFile(CUSTOM_RULES_USER)\n                if (file.canRead()) acl.fromReader(file.reader(), true)\n                if (!acl.bypass) {\n                    acl.bypass = true\n                    acl.subnets.clear()\n                }\n                return acl\n            }\n            set(value) = getFile(CUSTOM_RULES_USER).writeText(value.toString())\n        fun save(id: String, acl: Acl) = getFile(id).writeText(acl.toString())\n\n        suspend fun <T> parse(reader: Reader, bypassHostnames: (String) -> T, proxyHostnames: (String) -> T,\n                              urls: ((URL) -> T)? = null, defaultBypass: Boolean = false): Pair<Boolean, List<Subnet>> {\n            var bypass = defaultBypass\n            val bypassSubnets = mutableListOf<Subnet>()\n            val proxySubnets = mutableListOf<Subnet>()\n            var hostnames: ((String) -> T)? = if (defaultBypass) proxyHostnames else bypassHostnames\n            var subnets: MutableList<Subnet>? = if (defaultBypass) proxySubnets else bypassSubnets\n            reader.useLines {\n                for (line in it) {\n                    coroutineContext[Job]!!.ensureActive()\n                    val input = (if (urls == null) line else {\n                        val blocks = line.split('#', limit = 2)\n                        val url = networkAclParser.matchEntire(blocks.getOrElse(1) { \"\" })?.groupValues?.getOrNull(1)\n                        if (url != null) urls(URL(url))\n                        blocks[0]\n                    }).trim()\n                    if (input.getOrNull(0) == '[') when (input) {\n                        \"[outbound_block_list]\" -> {\n                            hostnames = null\n                            subnets = null\n                        }\n                        \"[black_list]\", \"[bypass_list]\" -> {\n                            hostnames = bypassHostnames\n                            subnets = bypassSubnets\n                        }\n                        \"[white_list]\", \"[proxy_list]\" -> {\n                            hostnames = proxyHostnames\n                            subnets = proxySubnets\n                        }\n                        \"[reject_all]\", \"[bypass_all]\" -> bypass = true\n                        \"[accept_all]\", \"[proxy_all]\" -> bypass = false\n                        else -> error(\"Unrecognized block: $input\")\n                    } else if (subnets != null && input.isNotEmpty()) {\n                        val subnet = Subnet.fromString(input)\n                        if (subnet == null) hostnames!!(input) else subnets!!.add(subnet)\n                    }\n                }\n            }\n            return bypass to if (bypass) proxySubnets else bypassSubnets\n        }\n    }\n\n    private open class DefaultSorter<T : Comparable<T>> : BaseSorter<T>() {\n        override fun compareNonNull(o1: T, o2: T): Int = o1.compareTo(o2)\n    }\n    private object StringSorter : DefaultSorter<String>()\n    private object SubnetSorter : DefaultSorter<Subnet>()\n\n    val bypassHostnames = SortedList(String::class.java, StringSorter)\n    val proxyHostnames = SortedList(String::class.java, StringSorter)\n    val subnets = SortedList(Subnet::class.java, SubnetSorter)\n    val urls = SortedList(URL::class.java, URLSorter)\n    var bypass = false\n\n    fun fromAcl(other: Acl): Acl {\n        bypassHostnames.clear()\n        for (item in other.bypassHostnames.asIterable()) bypassHostnames.add(item)\n        proxyHostnames.clear()\n        for (item in other.proxyHostnames.asIterable()) proxyHostnames.add(item)\n        subnets.clear()\n        for (item in other.subnets.asIterable()) subnets.add(item)\n        urls.clear()\n        for (item in other.urls.asIterable()) urls.add(item)\n        bypass = other.bypass\n        return this\n    }\n    fun fromReader(reader: Reader, defaultBypass: Boolean = false): Acl {\n        bypassHostnames.clear()\n        proxyHostnames.clear()\n        subnets.clear()\n        urls.clear()\n        val (bypass, subnets) = runBlocking {\n            parse(reader, bypassHostnames::add, proxyHostnames::add, urls::add, defaultBypass)\n        }\n        this.bypass = bypass\n        for (item in subnets) this.subnets.add(item)\n        return this\n    }\n\n    fun fromId(id: String): Acl = try {\n        fromReader(getFile(id).bufferedReader())\n    } catch (_: IOException) { this }\n\n    suspend fun flatten(depth: Int, connect: suspend (URL) -> URLConnection): Acl {\n        if (depth > 0) for (url in urls.asIterable()) {\n            val child = Acl().fromReader(connect(url).also {\n                (it as? HttpURLConnection)?.instanceFollowRedirects = true\n            }.getInputStream().bufferedReader(), bypass)\n            child.flatten(depth - 1, connect)\n            if (bypass != child.bypass) {\n                Timber.w(\"Imported network ACL has a conflicting mode set. \" +\n                        \"This will probably not work as intended. URL: $url\")\n                child.subnets.clear() // subnets for the different mode are discarded\n                child.bypass = bypass\n            }\n            for (item in child.bypassHostnames.asIterable()) bypassHostnames.add(item)\n            for (item in child.proxyHostnames.asIterable()) proxyHostnames.add(item)\n            for (item in child.subnets.asIterable()) subnets.add(item)\n        }\n        urls.clear()\n        return this\n    }\n\n    override fun toString(): String {\n        val result = StringBuilder()\n        result.append(if (bypass) \"[bypass_all]\\n\" else \"[proxy_all]\\n\")\n        val bypassList = (if (bypass) {\n            bypassHostnames.asIterable().asSequence()\n        } else {\n            subnets.asIterable().asSequence().map(Subnet::toString) + bypassHostnames.asIterable().asSequence()\n        }).toList()\n        val proxyList = (if (bypass) {\n            subnets.asIterable().asSequence().map(Subnet::toString) + proxyHostnames.asIterable().asSequence()\n        } else {\n            proxyHostnames.asIterable().asSequence()\n        }).toList()\n        if (bypassList.isNotEmpty()) {\n            result.append(\"[bypass_list]\\n\")\n            result.append(bypassList.joinToString(\"\\n\"))\n            result.append('\\n')\n        }\n        if (proxyList.isNotEmpty()) {\n            result.append(\"[proxy_list]\\n\")\n            result.append(proxyList.joinToString(\"\\n\"))\n            result.append('\\n')\n        }\n        result.append(urls.asIterable().joinToString(\"\") { \"#IMPORT_URL <$it>\\n\" })\n        return result.toString()\n    }\n}\n"
  },
  {
    "path": "core/src/main/java/com/github/shadowsocks/acl/AclSyncer.kt",
    "content": "/*******************************************************************************\n *                                                                             *\n *  Copyright (C) 2017 by Max Lv <max.c.lv@gmail.com>                          *\n *  Copyright (C) 2017 by Mygod Studio <contact-shadowsocks-android@mygod.be>  *\n *                                                                             *\n *  This program is free software: you can redistribute it and/or modify       *\n *  it under the terms of the GNU General Public License as published by       *\n *  the Free Software Foundation, either version 3 of the License, or          *\n *  (at your option) any later version.                                        *\n *                                                                             *\n *  This program is distributed in the hope that it will be useful,            *\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of             *\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the              *\n *  GNU General Public License for more details.                               *\n *                                                                             *\n *  You should have received a copy of the GNU General Public License          *\n *  along with this program. If not, see <http://www.gnu.org/licenses/>.       *\n *                                                                             *\n *******************************************************************************/\n\npackage com.github.shadowsocks.acl\n\nimport android.content.Context\nimport android.os.Build\nimport android.util.Log\nimport androidx.work.Configuration\nimport androidx.work.Constraints\nimport androidx.work.CoroutineWorker\nimport androidx.work.Data\nimport androidx.work.ExistingWorkPolicy\nimport androidx.work.NetworkType\nimport androidx.work.OneTimeWorkRequestBuilder\nimport androidx.work.WorkManager\nimport androidx.work.WorkerParameters\nimport com.github.shadowsocks.Core\nimport com.github.shadowsocks.Core.app\nimport com.github.shadowsocks.core.BuildConfig\nimport com.github.shadowsocks.preference.DataStore\nimport com.github.shadowsocks.utils.useCancellable\nimport kotlinx.coroutines.Dispatchers\nimport timber.log.Timber\nimport java.io.IOException\nimport java.net.HttpURLConnection\nimport java.net.URL\nimport java.util.concurrent.TimeUnit\n\nclass AclSyncer(context: Context, workerParams: WorkerParameters) : CoroutineWorker(context, workerParams) {\n    companion object {\n        private const val KEY_ROUTE = \"route\"\n\n        fun schedule(route: String) {\n            if (Build.VERSION.SDK_INT >= 24 && !Core.user.isUserUnlocked) return    // work does not support this\n            if (!WorkManager.isInitialized()) WorkManager.initialize(app, Configuration.Builder().apply {\n                setDefaultProcessName(app.packageName + \":bg\")\n                setMinimumLoggingLevel(if (BuildConfig.DEBUG) Log.VERBOSE else Log.INFO)\n                setWorkerCoroutineContext(Dispatchers.IO)\n            }.build())\n            WorkManager.getInstance(app).enqueueUniqueWork(\n                    route, ExistingWorkPolicy.REPLACE, OneTimeWorkRequestBuilder<AclSyncer>().apply {\n                setInputData(Data.Builder().putString(KEY_ROUTE, route).build())\n                setConstraints(Constraints.Builder().apply {\n                    setRequiredNetworkType(NetworkType.UNMETERED)\n                    setRequiresCharging(true)\n                }.build())\n                setInitialDelay(10, TimeUnit.SECONDS)\n            }.build())\n        }\n    }\n\n    override suspend fun doWork(): Result = try {\n        val route = inputData.getString(KEY_ROUTE)!!\n        val connection = URL(\"https://shadowsocks.org/acl/android/v1/$route.acl\")\n            .openConnection(DataStore.proxy) as HttpURLConnection\n        val acl = connection.useCancellable { inputStream.bufferedReader().use { it.readText() } }\n        Acl.getFile(route).printWriter().use { it.write(acl) }\n        Result.success()\n    } catch (e: IOException) {\n        Timber.d(e)\n        if (runAttemptCount > 5) Result.failure() else Result.retry()\n    }\n}\n"
  },
  {
    "path": "core/src/main/java/com/github/shadowsocks/aidl/ShadowsocksConnection.kt",
    "content": "/*******************************************************************************\n *                                                                             *\n *  Copyright (C) 2017 by Max Lv <max.c.lv@gmail.com>                          *\n *  Copyright (C) 2017 by Mygod Studio <contact-shadowsocks-android@mygod.be>  *\n *                                                                             *\n *  This program is free software: you can redistribute it and/or modify       *\n *  it under the terms of the GNU General Public License as published by       *\n *  the Free Software Foundation, either version 3 of the License, or          *\n *  (at your option) any later version.                                        *\n *                                                                             *\n *  This program is distributed in the hope that it will be useful,            *\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of             *\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the              *\n *  GNU General Public License for more details.                               *\n *                                                                             *\n *  You should have received a copy of the GNU General Public License          *\n *  along with this program. If not, see <http://www.gnu.org/licenses/>.       *\n *                                                                             *\n *******************************************************************************/\n\npackage com.github.shadowsocks.aidl\n\nimport android.content.ComponentName\nimport android.content.Context\nimport android.content.Intent\nimport android.content.ServiceConnection\nimport android.os.IBinder\nimport android.os.RemoteException\nimport com.github.shadowsocks.bg.BaseService\nimport com.github.shadowsocks.bg.ProxyService\nimport com.github.shadowsocks.bg.TransproxyService\nimport com.github.shadowsocks.bg.VpnService\nimport com.github.shadowsocks.preference.DataStore\nimport com.github.shadowsocks.utils.Action\nimport com.github.shadowsocks.utils.Key\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.GlobalScope\nimport kotlinx.coroutines.launch\n\n/**\n * This object should be compact as it will not get GC-ed.\n */\nclass ShadowsocksConnection(private var listenForDeath: Boolean = false) : ServiceConnection, IBinder.DeathRecipient {\n    companion object {\n        val serviceClass get() = when (DataStore.serviceMode) {\n            Key.modeProxy -> ProxyService::class\n            Key.modeVpn -> VpnService::class\n            Key.modeTransproxy -> TransproxyService::class\n            else -> throw UnknownError()\n        }.java\n    }\n\n    interface Callback {\n        fun stateChanged(state: BaseService.State, profileName: String?, msg: String?)\n        fun trafficUpdated(profileId: Long, stats: TrafficStats) { }\n        fun trafficPersisted(profileId: Long) { }\n\n        fun onServiceConnected(service: IShadowsocksService)\n        /**\n         * Different from Android framework, this method will be called even when you call `detachService`.\n         */\n        fun onServiceDisconnected() { }\n        fun onBinderDied() { }\n    }\n\n    private var connectionActive = false\n    private var callbackRegistered = false\n    private var callback: Callback? = null\n    private val serviceCallback = object : IShadowsocksServiceCallback.Stub() {\n        override fun stateChanged(state: Int, profileName: String?, msg: String?) {\n            val callback = callback ?: return\n            GlobalScope.launch(Dispatchers.Main.immediate) {\n                callback.stateChanged(BaseService.State.entries[state], profileName, msg)\n            }\n        }\n        override fun trafficUpdated(profileId: Long, stats: TrafficStats) {\n            val callback = callback ?: return\n            GlobalScope.launch(Dispatchers.Main.immediate) { callback.trafficUpdated(profileId, stats) }\n        }\n        override fun trafficPersisted(profileId: Long) {\n            val callback = callback ?: return\n            GlobalScope.launch(Dispatchers.Main.immediate) { callback.trafficPersisted(profileId) }\n        }\n    }\n    private var binder: IBinder? = null\n\n    var bandwidthTimeout = 0L\n        set(value) {\n            try {\n                if (value > 0) service?.startListeningForBandwidth(serviceCallback, value)\n                else service?.stopListeningForBandwidth(serviceCallback)\n            } catch (_: RemoteException) { }\n            field = value\n        }\n    var service: IShadowsocksService? = null\n\n    override fun onServiceConnected(name: ComponentName?, binder: IBinder) {\n        this.binder = binder\n        val service = IShadowsocksService.Stub.asInterface(binder)!!\n        this.service = service\n        try {\n            if (listenForDeath) binder.linkToDeath(this, 0)\n            check(!callbackRegistered)\n            service.registerCallback(serviceCallback)\n            callbackRegistered = true\n            if (bandwidthTimeout > 0) service.startListeningForBandwidth(serviceCallback, bandwidthTimeout)\n        } catch (_: RemoteException) { }\n        callback!!.onServiceConnected(service)\n    }\n\n    override fun onServiceDisconnected(name: ComponentName?) {\n        unregisterCallback()\n        callback?.onServiceDisconnected()\n        service = null\n        binder = null\n    }\n\n    override fun binderDied() {\n        service = null\n        callbackRegistered = false\n        callback?.also { GlobalScope.launch(Dispatchers.Main.immediate) { it.onBinderDied() } }\n    }\n\n    private fun unregisterCallback() {\n        val service = service\n        if (service != null && callbackRegistered) try {\n            service.unregisterCallback(serviceCallback)\n        } catch (_: RemoteException) { }\n        callbackRegistered = false\n    }\n\n    fun connect(context: Context, callback: Callback) {\n        if (connectionActive) return\n        connectionActive = true\n        check(this.callback == null)\n        this.callback = callback\n        val intent = Intent(context, serviceClass).setAction(Action.SERVICE)\n        context.bindService(intent, this, Context.BIND_AUTO_CREATE)\n    }\n\n    fun disconnect(context: Context) {\n        unregisterCallback()\n        if (connectionActive) try {\n            context.unbindService(this)\n        } catch (_: IllegalArgumentException) { }   // ignore\n        connectionActive = false\n        if (listenForDeath) try {\n            binder?.unlinkToDeath(this, 0)\n        } catch (_: NoSuchElementException) { }\n        binder = null\n        try {\n            service?.stopListeningForBandwidth(serviceCallback)\n        } catch (_: RemoteException) { }\n        service = null\n        callback = null\n    }\n}\n"
  },
  {
    "path": "core/src/main/java/com/github/shadowsocks/aidl/TrafficStats.kt",
    "content": "/*******************************************************************************\n *                                                                             *\n *  Copyright (C) 2019 by Max Lv <max.c.lv@gmail.com>                          *\n *  Copyright (C) 2019 by Mygod Studio <contact-shadowsocks-android@mygod.be>  *\n *                                                                             *\n *  This program is free software: you can redistribute it and/or modify       *\n *  it under the terms of the GNU General Public License as published by       *\n *  the Free Software Foundation, either version 3 of the License, or          *\n *  (at your option) any later version.                                        *\n *                                                                             *\n *  This program is distributed in the hope that it will be useful,            *\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of             *\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the              *\n *  GNU General Public License for more details.                               *\n *                                                                             *\n *  You should have received a copy of the GNU General Public License          *\n *  along with this program. If not, see <http://www.gnu.org/licenses/>.       *\n *                                                                             *\n *******************************************************************************/\n\npackage com.github.shadowsocks.aidl\n\nimport android.os.Parcelable\nimport kotlinx.parcelize.Parcelize\n\n@Parcelize\ndata class TrafficStats(\n        // Bytes per second\n        var txRate: Long = 0L,\n        var rxRate: Long = 0L,\n\n        // Bytes for the current session\n        var txTotal: Long = 0L,\n        var rxTotal: Long = 0L\n) : Parcelable {\n    operator fun plus(other: TrafficStats) = TrafficStats(\n            txRate + other.txRate, rxRate + other.rxRate,\n            txTotal + other.txTotal, rxTotal + other.rxTotal)\n}\n"
  },
  {
    "path": "core/src/main/java/com/github/shadowsocks/bg/BaseService.kt",
    "content": "/*******************************************************************************\n *                                                                             *\n *  Copyright (C) 2017 by Max Lv <max.c.lv@gmail.com>                          *\n *  Copyright (C) 2017 by Mygod Studio <contact-shadowsocks-android@mygod.be>  *\n *                                                                             *\n *  This program is free software: you can redistribute it and/or modify       *\n *  it under the terms of the GNU General Public License as published by       *\n *  the Free Software Foundation, either version 3 of the License, or          *\n *  (at your option) any later version.                                        *\n *                                                                             *\n *  This program is distributed in the hope that it will be useful,            *\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of             *\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the              *\n *  GNU General Public License for more details.                               *\n *                                                                             *\n *  You should have received a copy of the GNU General Public License          *\n *  along with this program. If not, see <http://www.gnu.org/licenses/>.       *\n *                                                                             *\n *******************************************************************************/\n\npackage com.github.shadowsocks.bg\n\nimport android.app.Service\nimport android.content.Context\nimport android.content.Intent\nimport android.content.IntentFilter\nimport android.os.Build\nimport android.os.IBinder\nimport android.os.RemoteCallbackList\nimport android.os.RemoteException\nimport androidx.core.content.ContextCompat\nimport androidx.core.os.bundleOf\nimport com.github.shadowsocks.BootReceiver\nimport com.github.shadowsocks.Core\nimport com.github.shadowsocks.Core.app\nimport com.github.shadowsocks.acl.Acl\nimport com.github.shadowsocks.aidl.IShadowsocksService\nimport com.github.shadowsocks.aidl.IShadowsocksServiceCallback\nimport com.github.shadowsocks.aidl.TrafficStats\nimport com.github.shadowsocks.core.R\nimport com.github.shadowsocks.net.DnsResolverCompat\nimport com.github.shadowsocks.preference.DataStore\nimport com.github.shadowsocks.utils.Action\nimport com.github.shadowsocks.utils.broadcastReceiver\nimport com.github.shadowsocks.utils.readableMessage\nimport com.google.firebase.analytics.FirebaseAnalytics\nimport kotlinx.coroutines.CancellationException\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.GlobalScope\nimport kotlinx.coroutines.Job\nimport kotlinx.coroutines.cancel\nimport kotlinx.coroutines.cancelAndJoin\nimport kotlinx.coroutines.coroutineScope\nimport kotlinx.coroutines.delay\nimport kotlinx.coroutines.launch\nimport kotlinx.coroutines.withContext\nimport timber.log.Timber\nimport java.io.File\nimport java.io.IOException\nimport java.net.URL\n\n/**\n * This object uses WeakMap to simulate the effects of multi-inheritance.\n */\nobject BaseService {\n    enum class State(val canStop: Boolean = false) {\n        /**\n         * Idle state is only used by UI and will never be returned by BaseService.\n         */\n        Idle,\n        Connecting(true),\n        Connected(true),\n        Stopping,\n        Stopped,\n    }\n\n    const val CONFIG_FILE = \"shadowsocks.conf\"\n    const val CONFIG_FILE_UDP = \"shadowsocks-udp.conf\"\n\n    interface ExpectedException\n    class ExpectedExceptionWrapper(e: Exception) : Exception(e.localizedMessage, e), ExpectedException\n\n    class Data internal constructor(private val service: Interface) {\n        var state = State.Stopped\n        var processes: GuardedProcessPool? = null\n        var proxy: ProxyInstance? = null\n        var udpFallback: ProxyInstance? = null\n        var localDns: LocalDnsWorker? = null\n\n        var notification: ServiceNotification? = null\n        val closeReceiver = broadcastReceiver { _, intent ->\n            when (intent.action) {\n                Intent.ACTION_SHUTDOWN -> service.persistStats()\n                Action.RELOAD -> service.forceLoad()\n                else -> service.stopRunner()\n            }\n        }\n        var closeReceiverRegistered = false\n\n        val binder = Binder(this)\n        var connectingJob: Job? = null\n\n        fun changeState(s: State, msg: String? = null) {\n            if (state == s && msg == null) return\n            binder.stateChanged(s, msg)\n            state = s\n        }\n    }\n\n    class Binder(private var data: Data? = null) : IShadowsocksService.Stub(), CoroutineScope, AutoCloseable {\n        private val callbacks = object : RemoteCallbackList<IShadowsocksServiceCallback>() {\n            override fun onCallbackDied(callback: IShadowsocksServiceCallback?, cookie: Any?) {\n                super.onCallbackDied(callback, cookie)\n                stopListeningForBandwidth(callback ?: return)\n            }\n        }\n        private val bandwidthListeners = mutableMapOf<IBinder, Long>()  // the binder is the real identifier\n        override val coroutineContext = Dispatchers.Main.immediate + Job()\n        private var looper: Job? = null\n\n        override fun getState(): Int = (data?.state ?: State.Idle).ordinal\n        override fun getProfileName(): String = data?.proxy?.profile?.formattedName ?: \"Idle\"\n\n        override fun registerCallback(cb: IShadowsocksServiceCallback) {\n            callbacks.register(cb)\n        }\n\n        private fun broadcast(work: (IShadowsocksServiceCallback) -> Unit) {\n            val count = callbacks.beginBroadcast()\n            try {\n                repeat(count) {\n                    try {\n                        work(callbacks.getBroadcastItem(it))\n                    } catch (_: RemoteException) {\n                    } catch (e: Exception) {\n                        Timber.w(e)\n                    }\n                }\n            } finally {\n                callbacks.finishBroadcast()\n            }\n        }\n\n        private suspend fun loop() {\n            while (true) {\n                delay(bandwidthListeners.values.minOrNull() ?: return)\n                val proxies = listOfNotNull(data?.proxy, data?.udpFallback)\n                val stats = proxies\n                        .map { Pair(it.profile.id, it.trafficMonitor?.requestUpdate()) }\n                        .filter { it.second != null }\n                        .map { Triple(it.first, it.second!!.first, it.second!!.second) }\n                if (stats.any { it.third } && data?.state == State.Connected && bandwidthListeners.isNotEmpty()) {\n                    val sum = stats.fold(TrafficStats()) { a, b -> a + b.second }\n                    broadcast { item ->\n                        if (bandwidthListeners.contains(item.asBinder())) {\n                            stats.forEach { (id, stats) -> item.trafficUpdated(id, stats) }\n                            item.trafficUpdated(0, sum)\n                        }\n                    }\n                }\n            }\n        }\n\n        override fun startListeningForBandwidth(cb: IShadowsocksServiceCallback, timeout: Long) {\n            launch {\n                if (bandwidthListeners.isEmpty() and (bandwidthListeners.put(cb.asBinder(), timeout) == null)) {\n                    check(looper == null)\n                    looper = launch { loop() }\n                }\n                if (data?.state != State.Connected) return@launch\n                var sum = TrafficStats()\n                val data = data\n                val proxy = data?.proxy ?: return@launch\n                proxy.trafficMonitor?.out.also { stats ->\n                    cb.trafficUpdated(proxy.profile.id, if (stats == null) sum else {\n                        sum += stats\n                        stats\n                    })\n                }\n                data.udpFallback?.also { udpFallback ->\n                    udpFallback.trafficMonitor?.out.also { stats ->\n                        cb.trafficUpdated(udpFallback.profile.id, if (stats == null) TrafficStats() else {\n                            sum += stats\n                            stats\n                        })\n                    }\n                }\n                cb.trafficUpdated(0, sum)\n            }\n        }\n\n        override fun stopListeningForBandwidth(cb: IShadowsocksServiceCallback) {\n            launch {\n                if (bandwidthListeners.remove(cb.asBinder()) != null && bandwidthListeners.isEmpty()) {\n                    looper!!.cancel()\n                    looper = null\n                }\n            }\n        }\n\n        override fun unregisterCallback(cb: IShadowsocksServiceCallback) {\n            stopListeningForBandwidth(cb)   // saves an RPC, and safer\n            callbacks.unregister(cb)\n        }\n\n        fun stateChanged(s: State, msg: String?) = launch {\n            val profileName = profileName\n            broadcast { it.stateChanged(s.ordinal, profileName, msg) }\n        }\n\n        fun trafficPersisted(ids: List<Long>) = launch {\n            if (bandwidthListeners.isNotEmpty() && ids.isNotEmpty()) broadcast { item ->\n                if (bandwidthListeners.contains(item.asBinder())) ids.forEach(item::trafficPersisted)\n            }\n        }\n\n        override fun close() {\n            callbacks.kill()\n            cancel()\n            data = null\n        }\n    }\n\n    interface Interface {\n        val data: Data\n        val tag: String\n        fun createNotification(profileName: String): ServiceNotification\n\n        fun onBind(intent: Intent): IBinder? = if (intent.action == Action.SERVICE) data.binder else null\n\n        fun forceLoad() {\n            val s = data.state\n            when {\n                s == State.Stopped -> startRunner()\n                s.canStop -> stopRunner(true)\n                else -> Timber.w(\"Illegal state $s when invoking use\")\n            }\n        }\n\n        val isVpnService get() = false\n\n        suspend fun startProcesses() {\n            val context = if (Build.VERSION.SDK_INT < 24 || Core.user.isUserUnlocked) app else Core.deviceStorage\n            val configRoot = context.noBackupFilesDir\n            val udpFallback = data.udpFallback\n            data.proxy!!.start(this,\n                    File(Core.deviceStorage.noBackupFilesDir, \"stat_main\"),\n                    File(configRoot, CONFIG_FILE),\n                    if (udpFallback == null && data.proxy?.plugin == null) \"tcp_and_udp\" else \"tcp_only\")\n            if (udpFallback?.plugin != null) throw ExpectedExceptionWrapper(IllegalStateException(\n                    \"UDP fallback cannot have plugins\"))\n            udpFallback?.start(this,\n                    File(Core.deviceStorage.noBackupFilesDir, \"stat_udp\"),\n                    File(configRoot, CONFIG_FILE_UDP),\n                    \"udp_only\", false)\n            data.localDns = LocalDnsWorker(this::rawResolver).apply { start() }\n        }\n\n        fun startRunner() {\n            this as Context\n            if (Build.VERSION.SDK_INT >= 26) startForegroundService(Intent(this, javaClass))\n            else startService(Intent(this, javaClass))\n        }\n\n        fun killProcesses(scope: CoroutineScope) {\n            data.processes?.run {\n                close(scope)\n                data.processes = null\n            }\n            data.localDns?.shutdown(scope)\n            data.localDns = null\n        }\n\n        fun stopRunner(restart: Boolean = false, msg: String? = null) {\n            if (data.state == State.Stopping) return\n            // channge the state\n            data.changeState(State.Stopping)\n            GlobalScope.launch(Dispatchers.Main.immediate) {\n                FirebaseAnalytics.getInstance(this@Interface as Service).logEvent(\"stop\",\n                    bundleOf(FirebaseAnalytics.Param.METHOD to tag))\n                data.connectingJob?.cancelAndJoin() // ensure stop connecting first\n                this@Interface as Service\n                // we use a coroutineScope here to allow clean-up in parallel\n                coroutineScope {\n                    killProcesses(this)\n                    // clean up receivers\n                    val data = data\n                    if (data.closeReceiverRegistered) {\n                        unregisterReceiver(data.closeReceiver)\n                        data.closeReceiverRegistered = false\n                    }\n\n                    data.notification?.destroy()\n                    data.notification = null\n\n                    val ids = listOfNotNull(data.proxy, data.udpFallback).map {\n                        it.shutdown(this)\n                        it.profile.id\n                    }\n                    data.proxy = null\n                    data.udpFallback = null\n                    data.binder.trafficPersisted(ids)\n                }\n\n                // change the state\n                data.changeState(State.Stopped, msg)\n\n                // stop the service if nothing has bound to it\n                if (restart) startRunner() else {\n                    BootReceiver.enabled = false\n                    stopSelf()\n                }\n            }\n        }\n\n        fun persistStats() =\n                listOfNotNull(data.proxy, data.udpFallback).forEach { it.trafficMonitor?.persistStats(it.profile.id) }\n\n        suspend fun preInit() { }\n        suspend fun rawResolver(query: ByteArray) = DnsResolverCompat.resolveRawOnActiveNetwork(query)\n        suspend fun openConnection(url: URL) = url.openConnection()\n\n        fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {\n            val data = data\n            if (data.state != State.Stopped) return Service.START_NOT_STICKY\n            val expanded = Core.currentProfile\n            this as Context\n            if (expanded == null) {\n                // gracefully shutdown: https://stackoverflow.com/q/47337857/2245107\n                data.notification = createNotification(\"\")\n                stopRunner(false, getString(R.string.profile_empty))\n                return Service.START_NOT_STICKY\n            }\n            val (profile, fallback) = expanded\n            try {\n                data.proxy = ProxyInstance(profile)\n                data.udpFallback = if (fallback == null) null else ProxyInstance(fallback, profile.route)\n            } catch (e: IllegalArgumentException) {\n                data.notification = createNotification(\"\")\n                stopRunner(false, e.message)\n                return Service.START_NOT_STICKY\n            }\n\n            BootReceiver.enabled = DataStore.persistAcrossReboot\n            if (!data.closeReceiverRegistered) {\n                ContextCompat.registerReceiver(this, data.closeReceiver, IntentFilter().apply {\n                    addAction(Action.RELOAD)\n                    addAction(Intent.ACTION_SHUTDOWN)\n                    addAction(Action.CLOSE)\n                }, ContextCompat.RECEIVER_NOT_EXPORTED)\n                data.closeReceiverRegistered = true\n            }\n\n            data.notification = createNotification(profile.formattedName)\n            FirebaseAnalytics.getInstance(this).logEvent(\"start\",\n                bundleOf(FirebaseAnalytics.Param.METHOD to tag))\n\n            data.changeState(State.Connecting)\n            data.connectingJob = GlobalScope.launch(Dispatchers.Main.immediate) {\n                try {\n                    Executable.killAll()    // clean up old processes\n                    preInit()\n                    if (profile.route == Acl.CUSTOM_RULES) try {\n                        withContext(Dispatchers.IO) {\n                            Acl.customRules.flatten(10, this@Interface::openConnection).also {\n                                Acl.save(Acl.CUSTOM_RULES, it)\n                            }\n                        }\n                    } catch (e: IOException) {\n                        throw ExpectedExceptionWrapper(e)\n                    }\n\n                    data.processes = GuardedProcessPool {\n                        Timber.w(it)\n                        stopRunner(false, it.readableMessage)\n                    }\n                    startProcesses()\n\n                    data.proxy!!.scheduleUpdate()\n                    data.udpFallback?.scheduleUpdate()\n\n                    data.changeState(State.Connected)\n                } catch (_: CancellationException) {\n                    // if the job was cancelled, it is canceller's responsibility to call stopRunner\n                } catch (exc: Throwable) {\n                    if (exc is ExpectedException) Timber.d(exc) else Timber.w(exc)\n                    stopRunner(false, \"${getString(R.string.service_failed)}: ${exc.readableMessage}\")\n                } finally {\n                    data.connectingJob = null\n                }\n            }\n            return Service.START_NOT_STICKY\n        }\n    }\n}\n"
  },
  {
    "path": "core/src/main/java/com/github/shadowsocks/bg/Executable.kt",
    "content": "/*******************************************************************************\n *                                                                             *\n *  Copyright (C) 2017 by Max Lv <max.c.lv@gmail.com>                          *\n *  Copyright (C) 2017 by Mygod Studio <contact-shadowsocks-android@mygod.be>  *\n *                                                                             *\n *  This program is free software: you can redistribute it and/or modify       *\n *  it under the terms of the GNU General Public License as published by       *\n *  the Free Software Foundation, either version 3 of the License, or          *\n *  (at your option) any later version.                                        *\n *                                                                             *\n *  This program is distributed in the hope that it will be useful,            *\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of             *\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the              *\n *  GNU General Public License for more details.                               *\n *                                                                             *\n *  You should have received a copy of the GNU General Public License          *\n *  along with this program. If not, see <http://www.gnu.org/licenses/>.       *\n *                                                                             *\n *******************************************************************************/\n\npackage com.github.shadowsocks.bg\n\nimport android.system.ErrnoException\nimport android.system.Os\nimport android.system.OsConstants\nimport android.text.TextUtils\nimport timber.log.Timber\nimport java.io.File\nimport java.io.IOException\n\nobject Executable {\n    const val REDSOCKS = \"libredsocks.so\"\n    const val SS_LOCAL = \"libsslocal.so\"\n    const val TUN2SOCKS = \"libtun2socks.so\"\n\n    private val EXECUTABLES = setOf(SS_LOCAL, REDSOCKS, TUN2SOCKS)\n\n    fun killAll() {\n        for (process in File(\"/proc\").listFiles { _, name -> TextUtils.isDigitsOnly(name) } ?: return) {\n            val exe = File(try {\n                File(process, \"cmdline\").inputStream().bufferedReader().readText()\n            } catch (_: IOException) {\n                continue\n            }.split(Character.MIN_VALUE, limit = 2).first())\n            if (EXECUTABLES.contains(exe.name)) try {\n                Os.kill(process.name.toInt(), OsConstants.SIGKILL)\n            } catch (e: ErrnoException) {\n                if (e.errno != OsConstants.ESRCH) {\n                    Timber.w(\"SIGKILL ${exe.absolutePath} (${process.name}) failed\")\n                    Timber.w(e)\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "core/src/main/java/com/github/shadowsocks/bg/GuardedProcessPool.kt",
    "content": "/*******************************************************************************\n *                                                                             *\n *  Copyright (C) 2017 by Max Lv <max.c.lv@gmail.com>                          *\n *  Copyright (C) 2017 by Mygod Studio <contact-shadowsocks-android@mygod.be>  *\n *                                                                             *\n *  This program is free software: you can redistribute it and/or modify       *\n *  it under the terms of the GNU General Public License as published by       *\n *  the Free Software Foundation, either version 3 of the License, or          *\n *  (at your option) any later version.                                        *\n *                                                                             *\n *  This program is distributed in the hope that it will be useful,            *\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of             *\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the              *\n *  GNU General Public License for more details.                               *\n *                                                                             *\n *  You should have received a copy of the GNU General Public License          *\n *  along with this program. If not, see <http://www.gnu.org/licenses/>.       *\n *                                                                             *\n *******************************************************************************/\n\npackage com.github.shadowsocks.bg\n\nimport android.os.Build\nimport android.os.SystemClock\nimport android.system.ErrnoException\nimport android.system.Os\nimport android.system.OsConstants\nimport androidx.annotation.MainThread\nimport com.github.shadowsocks.Core\nimport com.github.shadowsocks.utils.Commandline\nimport kotlinx.coroutines.*\nimport kotlinx.coroutines.channels.Channel\nimport timber.log.Timber\nimport java.io.File\nimport java.io.IOException\nimport java.io.InputStream\nimport kotlin.concurrent.thread\n\nclass GuardedProcessPool(private val onFatal: suspend (IOException) -> Unit) : CoroutineScope {\n    companion object {\n        private val pid by lazy {\n            Class.forName(\"java.lang.ProcessManager\\$ProcessImpl\").getDeclaredField(\"pid\").apply { isAccessible = true }\n        }\n    }\n\n    private inner class Guard(private val cmd: List<String>) {\n        private lateinit var process: Process\n\n        private fun streamLogger(input: InputStream, logger: (String) -> Unit) = try {\n            input.bufferedReader().forEachLine(logger)\n        } catch (_: IOException) { }    // ignore\n\n        fun start() {\n            process = ProcessBuilder(cmd).directory(Core.deviceStorage.noBackupFilesDir).start()\n        }\n\n        suspend fun looper(onRestartCallback: (suspend () -> Unit)?) {\n            var running = true\n            val cmdName = File(cmd.first()).nameWithoutExtension\n            val exitChannel = Channel<Int>()\n            try {\n                while (true) {\n                    thread(name = \"stderr-$cmdName\") {\n                        streamLogger(process.errorStream) { Timber.tag(cmdName).e(it) }\n                    }\n                    thread(name = \"stdout-$cmdName\") {\n                        streamLogger(process.inputStream) { Timber.tag(cmdName).v(it) }\n                        // this thread also acts as a daemon thread for waitFor\n                        runBlocking { exitChannel.send(process.waitFor()) }\n                    }\n                    val startTime = SystemClock.elapsedRealtime()\n                    val exitCode = exitChannel.receive()\n                    running = false\n                    when {\n                        SystemClock.elapsedRealtime() - startTime < 1000 -> throw IOException(\n                                \"$cmdName exits too fast (exit code: $exitCode)\")\n                        exitCode == 128 + OsConstants.SIGKILL -> Timber.w(\"$cmdName was killed\")\n                        else -> Timber.w(IOException(\"$cmdName unexpectedly exits with code $exitCode\"))\n                    }\n                    Timber.i(\"restart process: ${Commandline.toString(cmd)} (last exit code: $exitCode)\")\n                    start()\n                    running = true\n                    onRestartCallback?.invoke()\n                }\n            } catch (e: IOException) {\n                Timber.w(\"error occurred. stop guard: ${Commandline.toString(cmd)}\")\n                GlobalScope.launch(Dispatchers.Main) { onFatal(e) }\n            } finally {\n                if (running) withContext(NonCancellable) {  // clean-up cannot be cancelled\n                    if (Build.VERSION.SDK_INT < 24) {\n                        try {\n                            Os.kill(pid.get(process) as Int, OsConstants.SIGTERM)\n                        } catch (e: ErrnoException) {\n                            if (e.errno != OsConstants.ESRCH) Timber.w(e)\n                        } catch (e: ReflectiveOperationException) {\n                            Timber.w(e)\n                        }\n                        if (withTimeoutOrNull(500) { exitChannel.receive() } != null) return@withContext\n                    }\n                    process.destroy()                       // kill the process\n                    if (Build.VERSION.SDK_INT >= 26) {\n                        if (withTimeoutOrNull(1000) { exitChannel.receive() } != null) return@withContext\n                        process.destroyForcibly()           // Force to kill the process if it's still alive\n                    }\n                    exitChannel.receive()\n                }                                           // otherwise process already exited, nothing to be done\n            }\n        }\n    }\n\n    override val coroutineContext = Dispatchers.Main.immediate + Job()\n\n    @MainThread\n    fun start(cmd: List<String>, onRestartCallback: (suspend () -> Unit)? = null) {\n        Timber.i(\"start process: ${Commandline.toString(cmd)}\")\n        Guard(cmd).apply {\n            start() // if start fails, IOException will be thrown directly\n            launch { looper(onRestartCallback) }\n        }\n    }\n\n    @MainThread\n    fun close(scope: CoroutineScope) {\n        cancel()\n        coroutineContext[Job]!!.also { job -> scope.launch { job.join() } }\n    }\n}\n"
  },
  {
    "path": "core/src/main/java/com/github/shadowsocks/bg/LocalDnsWorker.kt",
    "content": "package com.github.shadowsocks.bg\n\nimport android.net.LocalSocket\nimport com.github.shadowsocks.Core\nimport com.github.shadowsocks.net.ConcurrentLocalSocketListener\nimport com.github.shadowsocks.net.DnsResolverCompat\nimport com.github.shadowsocks.utils.readableMessage\nimport kotlinx.coroutines.CancellationException\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.TimeoutCancellationException\nimport kotlinx.coroutines.launch\nimport org.xbill.DNS.Message\nimport org.xbill.DNS.Rcode\nimport timber.log.Timber\nimport java.io.DataInputStream\nimport java.io.DataOutputStream\nimport java.io.File\nimport java.io.IOException\n\nclass LocalDnsWorker(private val resolver: suspend (ByteArray) -> ByteArray) : ConcurrentLocalSocketListener(\n        \"LocalDnsThread\", File(Core.deviceStorage.noBackupFilesDir, \"local_dns_path\")), CoroutineScope {\n    override fun acceptInternal(socket: LocalSocket) = error(\"big no no\")\n    override fun accept(socket: LocalSocket) {\n        launch {\n            socket.use {\n                val input = DataInputStream(socket.inputStream)\n                val query = try {\n                    ByteArray(input.readUnsignedShort()).also { input.read(it) }\n                } catch (e: IOException) {  // connection early close possibly due to resolving timeout\n                    return@use Timber.d(e)\n                }\n                try {\n                    resolver(query)\n                } catch (e: Exception) {\n                    when (e) {\n                        is TimeoutCancellationException -> Timber.w(\"Resolving timed out\")\n                        is CancellationException -> { } // ignore\n                        is IOException -> Timber.d(e)\n                        is UnsupportedOperationException -> Timber.w(e.message)\n                        else -> Timber.w(e)\n                    }\n                    try {\n                        DnsResolverCompat.prepareDnsResponse(Message(query)).apply {\n                            header.rcode = Rcode.SERVFAIL\n                        }.toWire()\n                    } catch (_: IOException) {\n                        byteArrayOf()   // return empty if cannot parse packet\n                    }\n                }?.let { response ->\n                    try {\n                        val output = DataOutputStream(socket.outputStream)\n                        output.writeShort(response.size)\n                        output.write(response)\n                    } catch (e: IOException) {\n                        Timber.d(e.readableMessage)\n                    }\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "core/src/main/java/com/github/shadowsocks/bg/ProxyInstance.kt",
    "content": "/*******************************************************************************\n *                                                                             *\n *  Copyright (C) 2019 by Max Lv <max.c.lv@gmail.com>                          *\n *  Copyright (C) 2019 by Mygod Studio <contact-shadowsocks-android@mygod.be>  *\n *                                                                             *\n *  This program is free software: you can redistribute it and/or modify       *\n *  it under the terms of the GNU General Public License as published by       *\n *  the Free Software Foundation, either version 3 of the License, or          *\n *  (at your option) any later version.                                        *\n *                                                                             *\n *  This program is distributed in the hope that it will be useful,            *\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of             *\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the              *\n *  GNU General Public License for more details.                               *\n *                                                                             *\n *  You should have received a copy of the GNU General Public License          *\n *  along with this program. If not, see <http://www.gnu.org/licenses/>.       *\n *                                                                             *\n *******************************************************************************/\n\npackage com.github.shadowsocks.bg\n\nimport android.content.Context\nimport android.util.Base64\nimport com.github.shadowsocks.Core.app\nimport com.github.shadowsocks.acl.Acl\nimport com.github.shadowsocks.acl.AclSyncer\nimport com.github.shadowsocks.core.R\nimport com.github.shadowsocks.database.Profile\nimport com.github.shadowsocks.plugin.PluginConfiguration\nimport com.github.shadowsocks.plugin.PluginManager\nimport com.github.shadowsocks.preference.DataStore\nimport kotlinx.coroutines.CoroutineScope\nimport org.json.JSONArray\nimport org.json.JSONObject\nimport java.io.File\nimport java.net.URI\nimport java.net.URISyntaxException\n\n/**\n * This class sets up environment for ss-local.\n */\nclass ProxyInstance(val profile: Profile, private val route: String = profile.route) {\n    init {\n        require(profile.host.isNotEmpty() && (profile.method == \"none\" || profile.password.isNotEmpty())) {\n            app.getString(R.string.proxy_empty)\n        }\n        // check the crypto\n        require(profile.method !in arrayOf(\"aes-192-gcm\", \"chacha20\", \"salsa20\")) {\n            \"cipher ${profile.method} is deprecated.\"\n        }\n        // check the key format for aead-2022-cipher\n        if (profile.method in setOf(\n                \"2022-blake3-aes-128-gcm\",\n                \"2022-blake3-aes-256-gcm\",\n                \"2022-blake3-chacha20-poly1305\",\n            )) {\n            for (pwd in profile.password.split(\":\")) {\n                require(Base64.decode(pwd, Base64.DEFAULT).size in arrayOf(16, 32)) {\n                    \"The Base64 Key is invalid.\"\n                }\n            }\n        }\n    }\n\n    private var configFile: File? = null\n    var trafficMonitor: TrafficMonitor? = null\n    val plugin by lazy { PluginManager.init(PluginConfiguration(profile.plugin ?: \"\")) }\n\n    /**\n     * Sensitive shadowsocks configuration file requires extra protection. It may be stored in encrypted storage or\n     * device storage, depending on which is currently available.\n     */\n    fun start(service: BaseService.Interface, stat: File, configFile: File, mode: String, dnsRelay: Boolean = true) {\n        // setup traffic monitor path\n        trafficMonitor = TrafficMonitor(stat)\n\n        // init JSON config\n        this.configFile = configFile\n        val config = profile.toJson()\n        plugin?.let { (path, opts, isV2) ->\n            if (service.isVpnService) {\n                if (isV2) opts[\"__android_vpn\"] = \"\" else config.put(\"plugin_args\", JSONArray(arrayOf(\"-V\")))\n            }\n            config.put(\"plugin\", path).put(\"plugin_opts\", opts.toString())\n        }\n        config.put(\"dns\", \"unix://local_dns_path\")\n        config.put(\"mode\", mode)\n        config.put(\"locals\", JSONArray().apply {\n            // local SOCKS5 proxy\n            put(JSONObject().apply {\n                put(\"local_address\", DataStore.listenAddress)\n                put(\"local_port\", DataStore.portProxy)\n                put(\"local_udp_address\", DataStore.listenAddress)\n                put(\"local_udp_port\", DataStore.portProxy)\n                put(\"mode\", mode)\n            })\n\n            // local DNS proxy\n            if (dnsRelay) try {\n                URI(\"dns://${profile.remoteDns}\")\n            } catch (e: URISyntaxException) {\n                throw BaseService.ExpectedExceptionWrapper(e)\n            }.let { dns ->\n                put(JSONObject().apply {\n                    put(\"local_address\", DataStore.listenAddress)\n                    put(\"local_port\", DataStore.portLocalDns)\n                    put(\"local_dns_address\", \"local_dns_path\")\n                    put(\"remote_dns_address\", dns.host ?: \"0.0.0.0\")\n                    put(\"remote_dns_port\", if (dns.port < 0) 53 else dns.port)\n                    put(\"protocol\", \"dns\")\n                })\n            }\n        })\n        configFile.writeText(config.toString())\n\n        // build the command line\n        val cmd = arrayListOf(\n                File((service as Context).applicationInfo.nativeLibraryDir, Executable.SS_LOCAL).absolutePath,\n                \"--stat-path\", stat.absolutePath,\n                \"-c\", configFile.absolutePath,\n        )\n\n        if (service.isVpnService) cmd += \"--vpn\"\n\n        if (route != Acl.ALL) {\n            cmd += \"--acl\"\n            cmd += Acl.getFile(route).absolutePath\n        }\n\n        service.data.processes!!.start(cmd)\n    }\n\n    fun scheduleUpdate() {\n        if (route !in arrayOf(Acl.ALL, Acl.CUSTOM_RULES)) AclSyncer.schedule(route)\n    }\n\n    fun shutdown(scope: CoroutineScope) {\n        trafficMonitor?.apply {\n            thread.shutdown(scope)\n            persistStats(profile.id)    // Make sure update total traffic when stopping the runner\n        }\n        trafficMonitor = null\n        configFile?.delete()    // remove old config possibly in device storage\n        configFile = null\n    }\n}\n"
  },
  {
    "path": "core/src/main/java/com/github/shadowsocks/bg/ProxyService.kt",
    "content": "/*******************************************************************************\n *                                                                             *\n *  Copyright (C) 2017 by Max Lv <max.c.lv@gmail.com>                          *\n *  Copyright (C) 2017 by Mygod Studio <contact-shadowsocks-android@mygod.be>  *\n *                                                                             *\n *  This program is free software: you can redistribute it and/or modify       *\n *  it under the terms of the GNU General Public License as published by       *\n *  the Free Software Foundation, either version 3 of the License, or          *\n *  (at your option) any later version.                                        *\n *                                                                             *\n *  This program is distributed in the hope that it will be useful,            *\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of             *\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the              *\n *  GNU General Public License for more details.                               *\n *                                                                             *\n *  You should have received a copy of the GNU General Public License          *\n *  along with this program. If not, see <http://www.gnu.org/licenses/>.       *\n *                                                                             *\n *******************************************************************************/\n\npackage com.github.shadowsocks.bg\n\nimport android.app.Service\nimport android.content.Intent\n\n/**\n * Shadowsocks service at its minimum.\n */\nclass ProxyService : Service(), BaseService.Interface {\n    override val data = BaseService.Data(this)\n    override val tag: String get() = \"ShadowsocksProxyService\"\n    override fun createNotification(profileName: String): ServiceNotification =\n            ServiceNotification(this, profileName, \"service-proxy\", true)\n\n    override fun onBind(intent: Intent) = super.onBind(intent)\n    override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int =\n            super<BaseService.Interface>.onStartCommand(intent, flags, startId)\n    override fun onDestroy() {\n        super.onDestroy()\n        data.binder.close()\n    }\n}\n"
  },
  {
    "path": "core/src/main/java/com/github/shadowsocks/bg/ServiceNotification.kt",
    "content": "/*******************************************************************************\n *                                                                             *\n *  Copyright (C) 2017 by Max Lv <max.c.lv@gmail.com>                          *\n *  Copyright (C) 2017 by Mygod Studio <contact-shadowsocks-android@mygod.be>  *\n *                                                                             *\n *  This program is free software: you can redistribute it and/or modify       *\n *  it under the terms of the GNU General Public License as published by       *\n *  the Free Software Foundation, either version 3 of the License, or          *\n *  (at your option) any later version.                                        *\n *                                                                             *\n *  This program is distributed in the hope that it will be useful,            *\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of             *\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the              *\n *  GNU General Public License for more details.                               *\n *                                                                             *\n *  You should have received a copy of the GNU General Public License          *\n *  along with this program. If not, see <http://www.gnu.org/licenses/>.       *\n *                                                                             *\n *******************************************************************************/\n\npackage com.github.shadowsocks.bg\n\nimport android.app.PendingIntent\nimport android.app.Service\nimport android.content.BroadcastReceiver\nimport android.content.Context\nimport android.content.Intent\nimport android.content.IntentFilter\nimport android.os.Build\nimport android.os.PowerManager\nimport android.text.format.Formatter\nimport androidx.core.app.NotificationCompat\nimport androidx.core.app.ServiceCompat\nimport androidx.core.content.ContextCompat\nimport androidx.core.content.getSystemService\nimport com.github.shadowsocks.Core\nimport com.github.shadowsocks.aidl.IShadowsocksServiceCallback\nimport com.github.shadowsocks.aidl.TrafficStats\nimport com.github.shadowsocks.core.R\nimport com.github.shadowsocks.utils.Action\n\n/**\n  * User can customize visibility of notification since Android 8.\n  * The default visibility:\n  *\n  * Android 8.x: always visible due to system limitations\n  * VPN:         always invisible because of VPN notification/icon\n  * Other:       always visible\n  *\n  * See also: https://github.com/aosp-mirror/platform_frameworks_base/commit/070d142993403cc2c42eca808ff3fafcee220ac4\n */\nclass ServiceNotification(private val service: BaseService.Interface, profileName: String,\n                          channel: String, visible: Boolean = false) : BroadcastReceiver() {\n    private val callback: IShadowsocksServiceCallback by lazy {\n        object : IShadowsocksServiceCallback.Stub() {\n            override fun stateChanged(state: Int, profileName: String?, msg: String?) { }   // ignore\n            override fun trafficUpdated(profileId: Long, stats: TrafficStats) {\n                if (profileId != 0L) return\n                builder.apply {\n                    setContentText((service as Context).getString(R.string.traffic,\n                            service.getString(R.string.speed, Formatter.formatFileSize(service, stats.txRate)),\n                            service.getString(R.string.speed, Formatter.formatFileSize(service, stats.rxRate))))\n                    setSubText(service.getString(R.string.traffic,\n                            Formatter.formatFileSize(service, stats.txTotal),\n                            Formatter.formatFileSize(service, stats.rxTotal)))\n                }\n                show()\n            }\n            override fun trafficPersisted(profileId: Long) { }\n        }\n    }\n    private var callbackRegistered = false\n\n    private val builder = NotificationCompat.Builder(service as Context, channel)\n            .setWhen(0)\n            .setColor(ContextCompat.getColor(service, R.color.material_primary_500))\n            .setTicker(service.getString(R.string.forward_success))\n            .setContentTitle(profileName)\n            .setContentIntent(Core.configureIntent(service))\n            .setSmallIcon(R.drawable.ic_service_active)\n            .setCategory(NotificationCompat.CATEGORY_SERVICE)\n            .setPriority(if (visible) NotificationCompat.PRIORITY_LOW else NotificationCompat.PRIORITY_MIN)\n\n    init {\n        service as Context\n        val closeAction = NotificationCompat.Action.Builder(\n                R.drawable.ic_navigation_close,\n                service.getText(R.string.stop),\n                PendingIntent.getBroadcast(service, 0, Intent(Action.CLOSE).setPackage(service.packageName),\n                    PendingIntent.FLAG_IMMUTABLE)).apply {\n            setAuthenticationRequired(true)\n            setShowsUserInterface(false)\n        }.build()\n        if (Build.VERSION.SDK_INT < 24) builder.addAction(closeAction) else builder.addInvisibleAction(closeAction)\n        updateCallback(service.getSystemService<PowerManager>()?.isInteractive != false)\n        service.registerReceiver(this, IntentFilter().apply {\n            addAction(Intent.ACTION_SCREEN_ON)\n            addAction(Intent.ACTION_SCREEN_OFF)\n        })\n        show()\n    }\n\n    override fun onReceive(context: Context, intent: Intent) {\n        if (service.data.state == BaseService.State.Connected) updateCallback(intent.action == Intent.ACTION_SCREEN_ON)\n    }\n\n    private fun updateCallback(screenOn: Boolean) {\n        if (screenOn) {\n            service.data.binder.registerCallback(callback)\n            service.data.binder.startListeningForBandwidth(callback, 1000)\n            callbackRegistered = true\n        } else if (callbackRegistered) {    // unregister callback to save battery\n            service.data.binder.unregisterCallback(callback)\n            callbackRegistered = false\n        }\n    }\n\n    private fun show() = (service as Service).startForeground(1, builder.build())\n\n    fun destroy() {\n        (service as Service).unregisterReceiver(this)\n        updateCallback(false)\n        ServiceCompat.stopForeground(service, ServiceCompat.STOP_FOREGROUND_REMOVE)\n    }\n}\n"
  },
  {
    "path": "core/src/main/java/com/github/shadowsocks/bg/TrafficMonitor.kt",
    "content": "/*******************************************************************************\n *                                                                             *\n *  Copyright (C) 2017 by Max Lv <max.c.lv@gmail.com>                          *\n *  Copyright (C) 2017 by Mygod Studio <contact-shadowsocks-android@mygod.be>  *\n *                                                                             *\n *  This program is free software: you can redistribute it and/or modify       *\n *  it under the terms of the GNU General Public License as published by       *\n *  the Free Software Foundation, either version 3 of the License, or          *\n *  (at your option) any later version.                                        *\n *                                                                             *\n *  This program is distributed in the hope that it will be useful,            *\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of             *\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the              *\n *  GNU General Public License for more details.                               *\n *                                                                             *\n *  You should have received a copy of the GNU General Public License          *\n *  along with this program. If not, see <http://www.gnu.org/licenses/>.       *\n *                                                                             *\n *******************************************************************************/\n\npackage com.github.shadowsocks.bg\n\nimport android.net.LocalSocket\nimport android.os.SystemClock\nimport com.github.shadowsocks.aidl.TrafficStats\nimport com.github.shadowsocks.database.ProfileManager\nimport com.github.shadowsocks.net.LocalSocketListener\nimport com.github.shadowsocks.preference.DataStore\nimport com.github.shadowsocks.utils.DirectBoot\nimport java.io.File\nimport java.io.IOException\nimport java.nio.ByteBuffer\nimport java.nio.ByteOrder\n\nclass TrafficMonitor(statFile: File) {\n    val thread = object : LocalSocketListener(\"TrafficMonitor-\" + statFile.name, statFile) {\n        private val buffer = ByteArray(16)\n        private val stat = ByteBuffer.wrap(buffer).order(ByteOrder.LITTLE_ENDIAN)\n        override fun acceptInternal(socket: LocalSocket) {\n            when (val read = socket.inputStream.read(buffer)) {\n                -1 -> return\n                16 -> { }\n                else -> throw IOException(\"Unexpected traffic stat length $read\")\n            }\n            val tx = stat.getLong(0)\n            val rx = stat.getLong(8)\n            if (current.txTotal != tx) {\n                current.txTotal = tx\n                dirty = true\n            }\n            if (current.rxTotal != rx) {\n                current.rxTotal = rx\n                dirty = true\n            }\n        }\n    }.apply { start() }\n\n    val current = TrafficStats()\n    var out = TrafficStats()\n    private var timestampLast = 0L\n    private var dirty = false\n    private var persisted: TrafficStats? = null\n\n    fun requestUpdate(): Pair<TrafficStats, Boolean> {\n        val now = SystemClock.elapsedRealtime()\n        val delta = now - timestampLast\n        timestampLast = now\n        var updated = false\n        if (delta != 0L) {\n            if (dirty) {\n                out = current.copy().apply {\n                    txRate = (txTotal - out.txTotal) * 1000 / delta\n                    rxRate = (rxTotal - out.rxTotal) * 1000 / delta\n                }\n                dirty = false\n                updated = true\n            } else {\n                if (out.txRate != 0L) {\n                    out.txRate = 0\n                    updated = true\n                }\n                if (out.rxRate != 0L) {\n                    out.rxRate = 0\n                    updated = true\n                }\n            }\n        }\n        return Pair(out, updated)\n    }\n\n    fun persistStats(id: Long) {\n        val current = current\n        check(persisted == null || persisted == current) { \"Data loss occurred\" }\n        persisted = current\n        try {\n            // profile may have host, etc. modified and thus a re-fetch is necessary (possible race condition)\n            val profile = ProfileManager.getProfile(id) ?: return\n            profile.tx += current.txTotal\n            profile.rx += current.rxTotal\n            ProfileManager.updateProfile(profile)\n        } catch (e: IOException) {\n            if (!DataStore.directBootAware) throw e // we should only reach here because we're in direct boot\n            val profile = DirectBoot.getDeviceProfile()!!.toList().single { it.id == id }\n            profile.tx += current.txTotal\n            profile.rx += current.rxTotal\n            profile.dirty = true\n            DirectBoot.update(profile)\n            DirectBoot.listenForUnlock()\n        }\n    }\n}\n"
  },
  {
    "path": "core/src/main/java/com/github/shadowsocks/bg/TransproxyService.kt",
    "content": "/*******************************************************************************\n *                                                                             *\n *  Copyright (C) 2017 by Max Lv <max.c.lv@gmail.com>                          *\n *  Copyright (C) 2017 by Mygod Studio <contact-shadowsocks-android@mygod.be>  *\n *                                                                             *\n *  This program is free software: you can redistribute it and/or modify       *\n *  it under the terms of the GNU General Public License as published by       *\n *  the Free Software Foundation, either version 3 of the License, or          *\n *  (at your option) any later version.                                        *\n *                                                                             *\n *  This program is distributed in the hope that it will be useful,            *\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of             *\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the              *\n *  GNU General Public License for more details.                               *\n *                                                                             *\n *  You should have received a copy of the GNU General Public License          *\n *  along with this program. If not, see <http://www.gnu.org/licenses/>.       *\n *                                                                             *\n *******************************************************************************/\n\npackage com.github.shadowsocks.bg\n\nimport android.app.Service\nimport android.content.Intent\nimport com.github.shadowsocks.Core\nimport com.github.shadowsocks.preference.DataStore\nimport java.io.File\n\nclass TransproxyService : Service(), BaseService.Interface {\n    override val data = BaseService.Data(this)\n    override val tag: String get() = \"ShadowsocksTransproxyService\"\n    override fun createNotification(profileName: String): ServiceNotification =\n            ServiceNotification(this, profileName, \"service-transproxy\", true)\n\n    override fun onBind(intent: Intent) = super.onBind(intent)\n    override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int =\n            super<BaseService.Interface>.onStartCommand(intent, flags, startId)\n\n    private fun startRedsocksDaemon() {\n        File(Core.deviceStorage.noBackupFilesDir, \"redsocks.conf\").writeText(\"\"\"base {\n log_debug = off;\n log_info = off;\n log = stderr;\n daemon = off;\n redirector = iptables;\n}\nredsocks {\n local_ip = ${DataStore.listenAddress};\n local_port = ${DataStore.portTransproxy};\n ip = 127.0.0.1;\n port = ${DataStore.portProxy};\n type = socks5;\n}\n\"\"\")\n        data.processes!!.start(listOf(\n                File(applicationInfo.nativeLibraryDir, Executable.REDSOCKS).absolutePath, \"-c\", \"redsocks.conf\"))\n    }\n\n    override suspend fun startProcesses() {\n        startRedsocksDaemon()\n        super.startProcesses()\n    }\n\n    override fun onDestroy() {\n        super.onDestroy()\n        data.binder.close()\n    }\n}\n"
  },
  {
    "path": "core/src/main/java/com/github/shadowsocks/bg/VpnService.kt",
    "content": "/*******************************************************************************\n *                                                                             *\n *  Copyright (C) 2017 by Max Lv <max.c.lv@gmail.com>                          *\n *  Copyright (C) 2017 by Mygod Studio <contact-shadowsocks-android@mygod.be>  *\n *                                                                             *\n *  This program is free software: you can redistribute it and/or modify       *\n *  it under the terms of the GNU General Public License as published by       *\n *  the Free Software Foundation, either version 3 of the License, or          *\n *  (at your option) any later version.                                        *\n *                                                                             *\n *  This program is distributed in the hope that it will be useful,            *\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of             *\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the              *\n *  GNU General Public License for more details.                               *\n *                                                                             *\n *  You should have received a copy of the GNU General Public License          *\n *  along with this program. If not, see <http://www.gnu.org/licenses/>.       *\n *                                                                             *\n *******************************************************************************/\n\npackage com.github.shadowsocks.bg\n\nimport android.annotation.SuppressLint\nimport android.content.Intent\nimport android.content.pm.PackageManager\nimport android.net.LocalSocket\nimport android.net.LocalSocketAddress\nimport android.net.Network\nimport android.os.Build\nimport android.os.ParcelFileDescriptor\nimport android.system.ErrnoException\nimport android.system.Os\nimport android.system.OsConstants\nimport com.github.shadowsocks.Core\nimport com.github.shadowsocks.acl.Acl\nimport com.github.shadowsocks.core.R\nimport com.github.shadowsocks.net.ConcurrentLocalSocketListener\nimport com.github.shadowsocks.net.DefaultNetworkListener\nimport com.github.shadowsocks.net.DnsResolverCompat\nimport com.github.shadowsocks.net.Subnet\nimport com.github.shadowsocks.preference.DataStore\nimport com.github.shadowsocks.utils.int\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.delay\nimport kotlinx.coroutines.launch\nimport timber.log.Timber\nimport java.io.File\nimport java.io.FileDescriptor\nimport java.io.IOException\nimport java.net.URL\nimport android.net.VpnService as BaseVpnService\n\nclass VpnService : BaseVpnService(), BaseService.Interface {\n    companion object {\n        private const val VPN_MTU = 1500\n        private const val PRIVATE_VLAN4_CLIENT = \"172.19.0.1\"\n        private const val PRIVATE_VLAN4_ROUTER = \"172.19.0.2\"\n        private const val PRIVATE_VLAN6_CLIENT = \"fdfe:dcba:9876::1\"\n        private const val PRIVATE_VLAN6_ROUTER = \"fdfe:dcba:9876::2\"\n\n        private fun <T> FileDescriptor.use(block: (FileDescriptor) -> T) = try {\n            block(this)\n        } finally {\n            try {\n                Os.close(this)\n            } catch (_: ErrnoException) { }\n        }\n    }\n\n    private inner class ProtectWorker : ConcurrentLocalSocketListener(\"ShadowsocksVpnThread\",\n            File(Core.deviceStorage.noBackupFilesDir, \"protect_path\")) {\n        override fun acceptInternal(socket: LocalSocket) {\n            if (socket.inputStream.read() == -1) return\n            val success = socket.ancillaryFileDescriptors!!.single()!!.use { fd ->\n                underlyingNetwork.let { network ->\n                    if (network != null) try {\n                        network.bindSocket(fd)\n                        return@let true\n                    } catch (e: IOException) {\n                        @SuppressLint(\"NewApi\")\n                        when ((e.cause as? ErrnoException)?.errno) {\n                            OsConstants.EPERM, OsConstants.EACCES, OsConstants.ENONET -> Timber.d(e)\n                            else -> Timber.w(e)\n                        }\n                        return@let false\n                    }\n                    protect(fd.int)\n                }\n            }\n            try {\n                socket.outputStream.write(if (success) 0 else 1)\n            } catch (_: IOException) { }        // ignore connection early close\n        }\n    }\n\n    inner class NullConnectionException : NullPointerException(), BaseService.ExpectedException {\n        override fun getLocalizedMessage() = getString(R.string.reboot_required)\n    }\n\n    override val data = BaseService.Data(this)\n    override val tag: String get() = \"ShadowsocksVpnService\"\n    override fun createNotification(profileName: String): ServiceNotification =\n            ServiceNotification(this, profileName, \"service-vpn\")\n\n    private var conn: ParcelFileDescriptor? = null\n    private var worker: ProtectWorker? = null\n    private var active = false\n    private var metered = false\n    @Volatile\n    private var underlyingNetwork: Network? = null\n        set(value) {\n            field = value\n            if (active) setUnderlyingNetworks(underlyingNetworks)\n        }\n    private val underlyingNetworks get() =\n        // clearing underlyingNetworks makes Android 9 consider the network to be metered\n        if (Build.VERSION.SDK_INT == 28 && metered) null else underlyingNetwork?.let { arrayOf(it) }\n\n    override fun onBind(intent: Intent) = when (intent.action) {\n        SERVICE_INTERFACE -> super<BaseVpnService>.onBind(intent)\n        else -> super<BaseService.Interface>.onBind(intent)\n    }\n\n    override fun onRevoke() = stopRunner()\n\n    override fun killProcesses(scope: CoroutineScope) {\n        super.killProcesses(scope)\n        active = false\n        scope.launch { DefaultNetworkListener.stop(this) }\n        worker?.shutdown(scope)\n        worker = null\n        conn?.close()\n        conn = null\n    }\n\n    override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int =\n        super<BaseService.Interface>.onStartCommand(intent, flags, startId)\n\n    override suspend fun preInit() {\n        // double check prepare to workaround bugs in certain OS\n        if (prepare(this) != null) throw NullConnectionException()\n        DefaultNetworkListener.start(this) { underlyingNetwork = it }\n    }\n    override suspend fun rawResolver(query: ByteArray) =\n            // no need to listen for network here as this is only used for forwarding local DNS queries.\n            // retries should be attempted by client.\n            DnsResolverCompat.resolveRaw(underlyingNetwork ?: throw IOException(\"no network\"), query)\n    override suspend fun openConnection(url: URL) = DefaultNetworkListener.get().openConnection(url)\n\n    override suspend fun startProcesses() {\n        worker = ProtectWorker().apply { start() }\n        super.startProcesses()\n        sendFd(startVpn())\n    }\n\n    override val isVpnService get() = true\n\n    private fun startVpn(): FileDescriptor {\n        val profile = data.proxy!!.profile\n        val builder = Builder()\n                .setConfigureIntent(Core.configureIntent(this))\n                .setSession(profile.formattedName)\n                .setMtu(VPN_MTU)\n                .addAddress(PRIVATE_VLAN4_CLIENT, 30)\n                .addDnsServer(PRIVATE_VLAN4_ROUTER)\n\n        if (profile.ipv6) builder.addAddress(PRIVATE_VLAN6_CLIENT, 126)\n\n        val me = packageName\n        if (profile.proxyApps) {\n            profile.individual.split('\\n')\n                    .filter { it != me }\n                    .forEach {\n                        try {\n                            if (profile.bypass) builder.addDisallowedApplication(it)\n                            else builder.addAllowedApplication(it)\n                        } catch (ex: PackageManager.NameNotFoundException) {\n                            Timber.w(ex)\n                        }\n                    }\n            if (profile.bypass) builder.addDisallowedApplication(me)\n        } else {\n            builder.addDisallowedApplication(me)\n        }\n\n        when (profile.route) {\n            Acl.ALL, Acl.BYPASS_CHN, Acl.CUSTOM_RULES -> {\n                builder.addRoute(\"0.0.0.0\", 0)\n                if (profile.ipv6) builder.addRoute(\"::\", 0)\n            }\n            else -> {\n                resources.getStringArray(R.array.bypass_private_route).forEach {\n                    val subnet = Subnet.fromString(it)!!\n                    builder.addRoute(subnet.address.hostAddress!!, subnet.prefixSize)\n                }\n                builder.addRoute(PRIVATE_VLAN4_ROUTER, 32)\n                // https://issuetracker.google.com/issues/149636790\n                if (profile.ipv6) builder.addRoute(\"2000::\", 3)\n            }\n        }\n\n        metered = profile.metered\n        active = true   // possible race condition here?\n        builder.setUnderlyingNetworks(underlyingNetworks)\n        if (Build.VERSION.SDK_INT >= 29) builder.setMetered(metered)\n\n        val conn = builder.establish() ?: throw NullConnectionException()\n        this.conn = conn\n\n        val cmd = arrayListOf(File(applicationInfo.nativeLibraryDir, Executable.TUN2SOCKS).absolutePath,\n                \"--netif-ipaddr\", PRIVATE_VLAN4_ROUTER,\n                \"--socks-server-addr\", \"${DataStore.listenAddress}:${DataStore.portProxy}\",\n                \"--tunmtu\", VPN_MTU.toString(),\n                \"--sock-path\", \"sock_path\",\n                \"--dnsgw\", \"127.0.0.1:${DataStore.portLocalDns}\",\n                \"--loglevel\", \"warning\")\n        if (profile.ipv6) {\n            cmd += \"--netif-ip6addr\"\n            cmd += PRIVATE_VLAN6_ROUTER\n        }\n        cmd += \"--enable-udprelay\"\n        data.processes!!.start(cmd, onRestartCallback = {\n            try {\n                sendFd(conn.fileDescriptor)\n            } catch (e: ErrnoException) {\n                stopRunner(false, e.message)\n            }\n        })\n        return conn.fileDescriptor\n    }\n\n    private suspend fun sendFd(fd: FileDescriptor) {\n        var tries = 0\n        val path = File(Core.deviceStorage.noBackupFilesDir, \"sock_path\").absolutePath\n        while (true) try {\n            delay(50L shl tries)\n            LocalSocket().use { localSocket ->\n                localSocket.connect(LocalSocketAddress(path, LocalSocketAddress.Namespace.FILESYSTEM))\n                localSocket.setFileDescriptorsForSend(arrayOf(fd))\n                localSocket.outputStream.write(42)\n            }\n            return\n        } catch (e: IOException) {\n            if (tries > 5) throw e\n            tries += 1\n        }\n    }\n\n    override fun onDestroy() {\n        super.onDestroy()\n        data.binder.close()\n    }\n}\n"
  },
  {
    "path": "core/src/main/java/com/github/shadowsocks/database/KeyValuePair.kt",
    "content": "/*******************************************************************************\n *                                                                             *\n *  Copyright (C) 2017 by Max Lv <max.c.lv@gmail.com>                          *\n *  Copyright (C) 2017 by Mygod Studio <contact-shadowsocks-android@mygod.be>  *\n *                                                                             *\n *  This program is free software: you can redistribute it and/or modify       *\n *  it under the terms of the GNU General Public License as published by       *\n *  the Free Software Foundation, either version 3 of the License, or          *\n *  (at your option) any later version.                                        *\n *                                                                             *\n *  This program is distributed in the hope that it will be useful,            *\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of             *\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the              *\n *  GNU General Public License for more details.                               *\n *                                                                             *\n *  You should have received a copy of the GNU General Public License          *\n *  along with this program. If not, see <http://www.gnu.org/licenses/>.       *\n *                                                                             *\n *******************************************************************************/\n\npackage com.github.shadowsocks.database\n\nimport androidx.room.*\nimport java.io.ByteArrayOutputStream\nimport java.nio.ByteBuffer\n\n@Entity\nclass KeyValuePair() {\n    companion object {\n        const val TYPE_UNINITIALIZED = 0\n        const val TYPE_BOOLEAN = 1\n        const val TYPE_FLOAT = 2\n        @Deprecated(\"Use TYPE_LONG.\")\n        const val TYPE_INT = 3\n        const val TYPE_LONG = 4\n        const val TYPE_STRING = 5\n        const val TYPE_STRING_SET = 6\n    }\n\n    @androidx.room.Dao\n    interface Dao {\n        @Query(\"SELECT * FROM `KeyValuePair` WHERE `key` = :key\")\n        operator fun get(key: String): KeyValuePair?\n\n        @Insert(onConflict = OnConflictStrategy.REPLACE)\n        fun put(value: KeyValuePair): Long\n\n        @Query(\"DELETE FROM `KeyValuePair` WHERE `key` = :key\")\n        fun delete(key: String): Int\n    }\n\n    @PrimaryKey\n    var key: String = \"\"\n    var valueType: Int = TYPE_UNINITIALIZED\n    var value: ByteArray = ByteArray(0)\n\n    val boolean: Boolean?\n        get() = if (valueType == TYPE_BOOLEAN) ByteBuffer.wrap(value).get() != 0.toByte() else null\n    val float: Float?\n        get() = if (valueType == TYPE_FLOAT) ByteBuffer.wrap(value).float else null\n    @Suppress(\"DEPRECATION\")\n    @Deprecated(\"Use long.\", ReplaceWith(\"long\"))\n    val int: Int?\n        get() = if (valueType == TYPE_INT) ByteBuffer.wrap(value).int else null\n    val long: Long? get() = when (valueType) {\n        @Suppress(\"DEPRECATION\")\n        TYPE_INT -> ByteBuffer.wrap(value).int.toLong()\n        TYPE_LONG -> ByteBuffer.wrap(value).long\n        else -> null\n    }\n    val string: String?\n        get() = if (valueType == TYPE_STRING) String(value) else null\n    val stringSet: Set<String>?\n        get() = if (valueType == TYPE_STRING_SET) {\n            val buffer = ByteBuffer.wrap(value)\n            val result = HashSet<String>()\n            while (buffer.hasRemaining()) {\n                val chArr = ByteArray(buffer.int)\n                buffer.get(chArr)\n                result.add(String(chArr))\n            }\n            result\n        } else null\n\n    @Ignore\n    constructor(key: String) : this() {\n        this.key = key\n    }\n\n    // putting null requires using DataStore\n    fun put(value: Boolean): KeyValuePair {\n        valueType = TYPE_BOOLEAN\n        this.value = ByteBuffer.allocate(1).put((if (value) 1 else 0).toByte()).array()\n        return this\n    }\n    fun put(value: Float): KeyValuePair {\n        valueType = TYPE_FLOAT\n        this.value = ByteBuffer.allocate(4).putFloat(value).array()\n        return this\n    }\n    @Suppress(\"DEPRECATION\")\n    @Deprecated(\"Use long.\")\n    fun put(value: Int): KeyValuePair {\n        valueType = TYPE_INT\n        this.value = ByteBuffer.allocate(4).putInt(value).array()\n        return this\n    }\n    fun put(value: Long): KeyValuePair {\n        valueType = TYPE_LONG\n        this.value = ByteBuffer.allocate(8).putLong(value).array()\n        return this\n    }\n    fun put(value: String): KeyValuePair {\n        valueType = TYPE_STRING\n        this.value = value.toByteArray()\n        return this\n    }\n    fun put(value: Set<String>): KeyValuePair {\n        valueType = TYPE_STRING_SET\n        val stream = ByteArrayOutputStream()\n        val intBuffer = ByteBuffer.allocate(4)\n        for (v in value) {\n            intBuffer.rewind()\n            stream.write(intBuffer.putInt(v.length).array())\n            stream.write(v.toByteArray())\n        }\n        this.value = stream.toByteArray()\n        return this\n    }\n}\n"
  },
  {
    "path": "core/src/main/java/com/github/shadowsocks/database/PrivateDatabase.kt",
    "content": "/*******************************************************************************\n *                                                                             *\n *  Copyright (C) 2017 by Max Lv <max.c.lv@gmail.com>                          *\n *  Copyright (C) 2017 by Mygod Studio <contact-shadowsocks-android@mygod.be>  *\n *                                                                             *\n *  This program is free software: you can redistribute it and/or modify       *\n *  it under the terms of the GNU General Public License as published by       *\n *  the Free Software Foundation, either version 3 of the License, or          *\n *  (at your option) any later version.                                        *\n *                                                                             *\n *  This program is distributed in the hope that it will be useful,            *\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of             *\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the              *\n *  GNU General Public License for more details.                               *\n *                                                                             *\n *  You should have received a copy of the GNU General Public License          *\n *  along with this program. If not, see <http://www.gnu.org/licenses/>.       *\n *                                                                             *\n *******************************************************************************/\n\npackage com.github.shadowsocks.database\n\nimport androidx.room.Database\nimport androidx.room.Room\nimport androidx.room.RoomDatabase\nimport androidx.room.TypeConverters\nimport androidx.room.migration.Migration\nimport androidx.sqlite.db.SupportSQLiteDatabase\nimport com.github.shadowsocks.Core.app\nimport com.github.shadowsocks.database.migration.RecreateSchemaMigration\nimport com.github.shadowsocks.utils.Key\nimport kotlinx.coroutines.GlobalScope\nimport kotlinx.coroutines.launch\n\n@Database(entities = [Profile::class, KeyValuePair::class], version = 29)\n@TypeConverters(Profile.SubscriptionStatus::class)\nabstract class PrivateDatabase : RoomDatabase() {\n    companion object {\n        private val instance by lazy {\n            Room.databaseBuilder(app, PrivateDatabase::class.java, Key.DB_PROFILE).apply {\n                addMigrations(\n                        Migration26,\n                        Migration27,\n                        Migration28,\n                        Migration29\n                )\n                allowMainThreadQueries()\n                enableMultiInstanceInvalidation()\n                fallbackToDestructiveMigration()\n                setQueryExecutor { GlobalScope.launch { it.run() } }\n            }.build()\n        }\n\n        val profileDao get() = instance.profileDao()\n        val kvPairDao get() = instance.keyValuePairDao()\n    }\n    abstract fun profileDao(): Profile.Dao\n    abstract fun keyValuePairDao(): KeyValuePair.Dao\n\n    object Migration26 : RecreateSchemaMigration(25, 26, \"Profile\",\n            \"(`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `name` TEXT, `host` TEXT NOT NULL, `remotePort` INTEGER NOT NULL, `password` TEXT NOT NULL, `method` TEXT NOT NULL, `route` TEXT NOT NULL, `remoteDns` TEXT NOT NULL, `proxyApps` INTEGER NOT NULL, `bypass` INTEGER NOT NULL, `udpdns` INTEGER NOT NULL, `ipv6` INTEGER NOT NULL, `individual` TEXT NOT NULL, `tx` INTEGER NOT NULL, `rx` INTEGER NOT NULL, `userOrder` INTEGER NOT NULL, `plugin` TEXT)\",\n            \"`id`, `name`, `host`, `remotePort`, `password`, `method`, `route`, `remoteDns`, `proxyApps`, `bypass`, `udpdns`, `ipv6`, `individual`, `tx`, `rx`, `userOrder`, `plugin`\") {\n        override fun migrate(database: SupportSQLiteDatabase) {\n            super.migrate(database)\n            PublicDatabase.Migration3.migrate(database)\n        }\n    }\n    object Migration27 : Migration(26, 27) {\n        override fun migrate(database: SupportSQLiteDatabase) =\n                database.execSQL(\"ALTER TABLE `Profile` ADD COLUMN `udpFallback` INTEGER\")\n    }\n    object Migration28 : Migration(27, 28) {\n        override fun migrate(database: SupportSQLiteDatabase) =\n                database.execSQL(\"ALTER TABLE `Profile` ADD COLUMN `metered` INTEGER NOT NULL DEFAULT 0\")\n    }\n    object Migration29 : Migration(28, 29) {\n        override fun migrate(database: SupportSQLiteDatabase) =\n                database.execSQL(\"ALTER TABLE `Profile` ADD COLUMN `subscription` INTEGER NOT NULL DEFAULT \" +\n                        Profile.SubscriptionStatus.UserConfigured.persistedValue)\n    }\n}\n"
  },
  {
    "path": "core/src/main/java/com/github/shadowsocks/database/Profile.kt",
    "content": "/*******************************************************************************\n *                                                                             *\n *  Copyright (C) 2017 by Max Lv <max.c.lv@gmail.com>                          *\n *  Copyright (C) 2017 by Mygod Studio <contact-shadowsocks-android@mygod.be>  *\n *                                                                             *\n *  This program is free software: you can redistribute it and/or modify       *\n *  it under the terms of the GNU General Public License as published by       *\n *  the Free Software Foundation, either version 3 of the License, or          *\n *  (at your option) any later version.                                        *\n *                                                                             *\n *  This program is distributed in the hope that it will be useful,            *\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of             *\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the              *\n *  GNU General Public License for more details.                               *\n *                                                                             *\n *  You should have received a copy of the GNU General Public License          *\n *  along with this program. If not, see <http://www.gnu.org/licenses/>.       *\n *                                                                             *\n *******************************************************************************/\n\npackage com.github.shadowsocks.database\n\nimport android.annotation.TargetApi\nimport android.net.Uri\nimport android.os.Parcelable\nimport android.util.Base64\nimport android.util.LongSparseArray\nimport androidx.core.net.toUri\nimport androidx.room.Entity\nimport androidx.room.Ignore\nimport androidx.room.Insert\nimport androidx.room.PrimaryKey\nimport androidx.room.Query\nimport androidx.room.TypeConverter\nimport androidx.room.Update\nimport com.github.shadowsocks.plugin.PluginConfiguration\nimport com.github.shadowsocks.plugin.PluginOptions\nimport com.github.shadowsocks.preference.DataStore\nimport com.github.shadowsocks.utils.Key\nimport com.github.shadowsocks.utils.parsePort\nimport kotlinx.parcelize.Parcelize\nimport org.json.JSONArray\nimport org.json.JSONObject\nimport org.json.JSONTokener\nimport timber.log.Timber\nimport java.io.Serializable\nimport java.net.URI\nimport java.net.URISyntaxException\nimport java.util.Locale\n\n@Entity\n@Parcelize\ndata class Profile(\n        @PrimaryKey(autoGenerate = true)\n        var id: Long = 0,\n\n        // user configurable fields\n        var name: String? = \"\",\n\n        var host: String = \"example.shadowsocks.org\",\n        var remotePort: Int = 8388,\n        var password: String = \"u1rRWTssNv0p\",\n        var method: String = \"aes-256-cfb\",\n\n        var route: String = \"all\",\n        var remoteDns: String = \"dns.google\",\n        var proxyApps: Boolean = false,\n        var bypass: Boolean = false,\n        var udpdns: Boolean = false,\n        var ipv6: Boolean = false,\n        @TargetApi(28)\n        var metered: Boolean = false,\n        var individual: String = \"\",\n        var plugin: String? = null,\n        var udpFallback: Long? = null,\n\n        // managed fields\n        var subscription: SubscriptionStatus = SubscriptionStatus.UserConfigured,\n        var tx: Long = 0,\n        var rx: Long = 0,\n        var userOrder: Long = 0,\n\n        @Ignore // not persisted in db, only used by direct boot\n        var dirty: Boolean = false\n) : Parcelable, Serializable {\n    enum class SubscriptionStatus(val persistedValue: Int) {\n        UserConfigured(0),\n        Active(1),\n        /**\n         * This profile is no longer present in subscriptions.\n         */\n        Obsolete(2),\n        ;\n\n        companion object {\n            @JvmStatic\n            @TypeConverter\n            fun of(value: Int) = entries.single { it.persistedValue == value }\n            @JvmStatic\n            @TypeConverter\n            fun toInt(status: SubscriptionStatus) = status.persistedValue\n        }\n    }\n\n    companion object {\n        private const val serialVersionUID = 1L\n        private val pattern =\n                \"\"\"(?i)ss://[-a-zA-Z0-9+&@#/%?=.~*'()|!:,;_\\[\\]]*[-a-zA-Z0-9+&@#/%=.~*'()|\\[\\]]\"\"\".toRegex()\n        private val userInfoPattern = \"^(.+?):(.*)$\".toRegex()\n        private val legacyPattern = \"^(.+?):(.*)@(.+?):(\\\\d+?)$\".toRegex()\n\n        fun findAllUrls(data: CharSequence?, feature: Profile? = null) = pattern.findAll(data ?: \"\").map {\n            val uri = it.value.toUri()\n            try {\n                if (uri.userInfo == null) {\n                    val match = legacyPattern.matchEntire(String(Base64.decode(uri.host, Base64.NO_PADDING)))\n                    if (match != null) {\n                        val profile = Profile()\n                        feature?.copyFeatureSettingsTo(profile)\n                        profile.method = match.groupValues[1].lowercase(Locale.ENGLISH)\n                        profile.password = match.groupValues[2]\n                        profile.host = match.groupValues[3]\n                        profile.remotePort = match.groupValues[4].toInt()\n                        profile.plugin = uri.getQueryParameter(Key.plugin)\n                        profile.name = uri.fragment\n                        profile\n                    } else {\n                        Timber.e(\"Unrecognized URI: ${it.value}\")\n                        null\n                    }\n                } else {\n                    val match = userInfoPattern.matchEntire(String(Base64.decode(uri.userInfo,\n                            Base64.NO_PADDING or Base64.NO_WRAP or Base64.URL_SAFE)))\n                    if (match != null) {\n                        val profile = Profile()\n                        feature?.copyFeatureSettingsTo(profile)\n                        profile.method = match.groupValues[1]\n                        profile.password = match.groupValues[2]\n                        // bug in Android: https://code.google.com/p/android/issues/detail?id=192855\n                        try {\n                            val javaURI = URI(it.value)\n                            profile.host = javaURI.host ?: \"\"\n                            if (profile.host.firstOrNull() == '[' && profile.host.lastOrNull() == ']') {\n                                profile.host = profile.host.substring(1, profile.host.length - 1)\n                            }\n                            profile.remotePort = javaURI.port\n                            profile.plugin = uri.getQueryParameter(Key.plugin)\n                            profile.name = uri.fragment ?: \"\"\n                            profile\n                        } catch (e: URISyntaxException) {\n                            Timber.e(\"Invalid URI: ${it.value}\")\n                            null\n                        }\n                    } else {\n                        Timber.e(\"Unknown user info: ${it.value}\")\n                        null\n                    }\n                }\n            } catch (e: IllegalArgumentException) {\n                Timber.e(\"Invalid base64 detected: ${it.value}\")\n                null\n            }\n        }.filterNotNull()\n\n        private class JsonParser(private val feature: Profile? = null) : ArrayList<Profile>() {\n            val fallbackMap = mutableMapOf<Profile, Profile>()\n\n            private fun tryParse(json: JSONObject, fallback: Boolean = false): Profile? {\n                val host = json.optString(\"server\")\n                if (host.isNullOrEmpty()) return null\n                val remotePort = json.optInt(\"server_port\")\n                if (remotePort <= 0) return null\n                val password = json.optString(\"password\")\n                if (password.isNullOrEmpty()) return null\n                val method = json.optString(\"method\")\n                if (method.isNullOrEmpty()) return null\n                return Profile().also {\n                    it.host = host\n                    it.remotePort = remotePort\n                    it.password = password\n                    it.method = method\n                }.apply {\n                    feature?.copyFeatureSettingsTo(this)\n                    val id = json.optString(\"plugin\")\n                    if (!id.isNullOrEmpty()) {\n                        plugin = PluginOptions(id, json.optString(\"plugin_opts\")).toString(false)\n                    }\n                    name = json.optString(\"remarks\")\n                    route = json.optString(\"route\", route)\n                    if (fallback) return@apply\n                    remoteDns = json.optString(\"remote_dns\", remoteDns)\n                    ipv6 = json.optBoolean(\"ipv6\", ipv6)\n                    metered = json.optBoolean(\"metered\", metered)\n                    json.optJSONObject(\"proxy_apps\")?.also { obj ->\n                        proxyApps = obj.optBoolean(\"enabled\", proxyApps)\n                        bypass = obj.optBoolean(\"bypass\", bypass)\n                        individual = obj.optJSONArray(\"android_list\")?.let {\n                            0.until(it.length()).joinToString(\"\\n\", transform = it::optString)\n                        } ?: individual\n                    }\n                    udpdns = json.optBoolean(\"udpdns\", udpdns)\n                    json.optJSONObject(\"udp_fallback\")?.let { tryParse(it, true) }?.also { fallbackMap[this] = it }\n                }\n            }\n\n            fun process(json: Any?) {\n                when (json) {\n                    is JSONObject -> {\n                        val profile = tryParse(json)\n                        if (profile != null) add(profile) else json.keys().forEach { process(json.opt(it)) }\n                    }\n                    is JSONArray -> 0.until(json.length()).forEach { process(json.opt(it)) }\n                    // ignore other types\n                }\n            }\n\n            fun finalize(create: (Profile) -> Profile) {\n                val profiles = ProfileManager.getAllProfiles() ?: emptyList()\n                for ((profile, fallback) in fallbackMap) {\n                    val match = profiles.firstOrNull {\n                        fallback.host == it.host && fallback.remotePort == it.remotePort &&\n                                fallback.password == it.password && fallback.method == it.method &&\n                                it.plugin.isNullOrEmpty()\n                    }\n                    profile.udpFallback = (match ?: create(fallback)).id\n                    ProfileManager.updateProfile(profile)\n                }\n            }\n        }\n\n        fun parseJson(json: String, feature: Profile? = null, create: (Profile) -> Profile) {\n            JsonParser(feature).run {\n                JSONTokener(json).apply { while (more()) process(nextValue()) }\n                for (i in indices) {\n                    val fallback = fallbackMap.remove(this[i])\n                    this[i] = create(this[i])\n                    fallback?.also { fallbackMap[this[i]] = it }\n                }\n                finalize(create)\n            }\n        }\n    }\n\n    @androidx.room.Dao\n    interface Dao {\n        @Query(\"SELECT * FROM `Profile` WHERE `id` = :id\")\n        operator fun get(id: Long): Profile?\n\n        @Query(\"SELECT * FROM `Profile` WHERE `Subscription` != 2 ORDER BY `userOrder`\")\n        fun listActive(): List<Profile>\n\n        @Query(\"SELECT * FROM `Profile`\")\n        fun listAll(): List<Profile>\n\n        @Query(\"SELECT MAX(`userOrder`) + 1 FROM `Profile`\")\n        fun nextOrder(): Long?\n\n        @Query(\"SELECT 1 FROM `Profile` LIMIT 1\")\n        fun isNotEmpty(): Boolean\n\n        @Insert\n        fun create(value: Profile): Long\n\n        @Update\n        fun update(value: Profile): Int\n\n        @Query(\"DELETE FROM `Profile` WHERE `id` = :id\")\n        fun delete(id: Long): Int\n\n        @Query(\"DELETE FROM `Profile`\")\n        fun deleteAll(): Int\n    }\n\n    val formattedAddress get() = (if (host.contains(\":\")) \"[%s]:%d\" else \"%s:%d\").format(host, remotePort)\n    val formattedName get() = if (name.isNullOrEmpty()) formattedAddress else name!!\n\n    fun copyFeatureSettingsTo(profile: Profile) {\n        profile.route = route\n        profile.ipv6 = ipv6\n        profile.metered = metered\n        profile.proxyApps = proxyApps\n        profile.bypass = bypass\n        profile.individual = individual\n        profile.udpdns = udpdns\n    }\n\n    fun toUri(): Uri {\n        val auth = Base64.encodeToString(\"$method:$password\".toByteArray(),\n                Base64.NO_PADDING or Base64.NO_WRAP or Base64.URL_SAFE)\n        val wrappedHost = if (host.contains(':')) \"[$host]\" else host\n        val builder = Uri.Builder()\n                .scheme(\"ss\")\n                .encodedAuthority(\"$auth@$wrappedHost:$remotePort\")\n        val configuration = PluginConfiguration(plugin ?: \"\")\n        if (configuration.selected.isNotEmpty()) {\n            builder.appendQueryParameter(Key.plugin, configuration.getOptions().toString(false))\n        }\n        if (!name.isNullOrEmpty()) builder.fragment(name)\n        return builder.build()\n    }\n\n    override fun toString() = toUri().toString()\n\n    fun toJson(profiles: LongSparseArray<Profile>? = null): JSONObject = JSONObject().apply {\n        put(\"server\", host)\n        put(\"server_port\", remotePort)\n        put(\"password\", password)\n        put(\"method\", method)\n        if (profiles == null) return@apply\n        PluginConfiguration(plugin ?: \"\").getOptions().also {\n            if (it.id.isNotEmpty()) {\n                put(\"plugin\", it.id)\n                put(\"plugin_opts\", it.toString())\n            }\n        }\n        put(\"remarks\", name)\n        put(\"route\", route)\n        put(\"remote_dns\", remoteDns)\n        put(\"ipv6\", ipv6)\n        put(\"metered\", metered)\n        put(\"proxy_apps\", JSONObject().apply {\n            put(\"enabled\", proxyApps)\n            if (proxyApps) {\n                put(\"bypass\", bypass)\n                // android_ prefix is used because package names are Android specific\n                put(\"android_list\", JSONArray(individual.split(\"\\n\")))\n            }\n        })\n        put(\"udpdns\", udpdns)\n        val fallback = profiles.get(udpFallback ?: return@apply)\n        if (fallback != null && fallback.plugin.isNullOrEmpty()) fallback.toJson().also { put(\"udp_fallback\", it) }\n    }\n\n    fun serialize() {\n        DataStore.editingId = id\n        DataStore.privateStore.putString(Key.name, name)\n        DataStore.privateStore.putString(Key.host, host)\n        DataStore.privateStore.putString(Key.remotePort, remotePort.toString())\n        DataStore.privateStore.putString(Key.password, password)\n        DataStore.privateStore.putString(Key.route, route)\n        DataStore.privateStore.putString(Key.remoteDns, remoteDns)\n        DataStore.privateStore.putString(Key.method, method)\n        DataStore.proxyApps = proxyApps\n        DataStore.bypass = bypass\n        DataStore.privateStore.putBoolean(Key.udpdns, udpdns)\n        DataStore.privateStore.putBoolean(Key.ipv6, ipv6)\n        DataStore.privateStore.putBoolean(Key.metered, metered)\n        DataStore.individual = individual\n        DataStore.plugin = plugin ?: \"\"\n        DataStore.udpFallback = udpFallback\n        DataStore.privateStore.remove(Key.dirty)\n    }\n\n    fun deserialize() {\n        check(id == 0L || DataStore.editingId == id)\n        DataStore.editingId = null\n        // It's assumed that default values are never used, so 0/false/null is always used even if that isn't the case\n        name = DataStore.privateStore.getString(Key.name) ?: \"\"\n        // It's safe to trim the hostname, as we expect no leading or trailing whitespaces here\n        host = (DataStore.privateStore.getString(Key.host) ?: \"\").trim()\n        remotePort = parsePort(DataStore.privateStore.getString(Key.remotePort), 8388, 1)\n        password = DataStore.privateStore.getString(Key.password) ?: \"\"\n        method = DataStore.privateStore.getString(Key.method) ?: \"\"\n        route = DataStore.privateStore.getString(Key.route) ?: \"\"\n        remoteDns = DataStore.privateStore.getString(Key.remoteDns) ?: \"\"\n        proxyApps = DataStore.proxyApps\n        bypass = DataStore.bypass\n        udpdns = DataStore.privateStore.getBoolean(Key.udpdns, false)\n        ipv6 = DataStore.privateStore.getBoolean(Key.ipv6, false)\n        metered = DataStore.privateStore.getBoolean(Key.metered, false)\n        individual = DataStore.individual\n        plugin = DataStore.plugin\n        udpFallback = DataStore.udpFallback\n    }\n}\n"
  },
  {
    "path": "core/src/main/java/com/github/shadowsocks/database/ProfileManager.kt",
    "content": "/*******************************************************************************\n *                                                                             *\n *  Copyright (C) 2017 by Max Lv <max.c.lv@gmail.com>                          *\n *  Copyright (C) 2017 by Mygod Studio <contact-shadowsocks-android@mygod.be>  *\n *                                                                             *\n *  This program is free software: you can redistribute it and/or modify       *\n *  it under the terms of the GNU General Public License as published by       *\n *  the Free Software Foundation, either version 3 of the License, or          *\n *  (at your option) any later version.                                        *\n *                                                                             *\n *  This program is distributed in the hope that it will be useful,            *\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of             *\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the              *\n *  GNU General Public License for more details.                               *\n *                                                                             *\n *  You should have received a copy of the GNU General Public License          *\n *  along with this program. If not, see <http://www.gnu.org/licenses/>.       *\n *                                                                             *\n *******************************************************************************/\n\npackage com.github.shadowsocks.database\n\nimport android.database.sqlite.SQLiteCantOpenDatabaseException\nimport android.util.LongSparseArray\nimport com.github.shadowsocks.Core\nimport com.github.shadowsocks.preference.DataStore\nimport com.github.shadowsocks.utils.DirectBoot\nimport com.github.shadowsocks.utils.forEachTry\nimport org.json.JSONArray\nimport timber.log.Timber\nimport java.io.IOException\nimport java.io.InputStream\nimport java.io.Serializable\nimport java.sql.SQLException\n\n/**\n * SQLExceptions are not caught (and therefore will cause crash) for insert/update transactions\n * to ensure we are in a consistent state.\n */\nobject ProfileManager {\n    interface Listener {\n        fun onAdd(profile: Profile)\n        fun onRemove(profileId: Long)\n        fun onCleared()\n        fun reloadProfiles()\n    }\n    var listener: Listener? = null\n\n    data class ExpandedProfile(val main: Profile, val udpFallback: Profile?) : Serializable {\n        companion object {\n            private const val serialVersionUID = 1L\n        }\n\n        fun toList() = listOfNotNull(main, udpFallback)\n    }\n\n    @Throws(SQLException::class)\n    fun createProfile(profile: Profile = Profile()): Profile {\n        profile.id = 0\n        profile.userOrder = PrivateDatabase.profileDao.nextOrder() ?: 0\n        profile.id = PrivateDatabase.profileDao.create(profile)\n        listener?.onAdd(profile)\n        return profile\n    }\n\n    fun createProfilesFromJson(jsons: Sequence<InputStream>, replace: Boolean = false) {\n        val profiles = if (replace) getAllProfiles()?.associateBy { it.formattedAddress } else null\n        val feature = if (replace) {\n            profiles?.values?.singleOrNull { it.id == DataStore.profileId }\n        } else Core.currentProfile?.main\n        val lazyClear = lazy { clear() }\n        jsons.asIterable().forEachTry { json ->\n            Profile.parseJson(json.bufferedReader().readText(), feature) {\n                if (replace) {\n                    lazyClear.value\n                    // if two profiles has the same address, treat them as the same profile and copy stats over\n                    profiles?.get(it.formattedAddress)?.apply {\n                        it.tx = tx\n                        it.rx = rx\n                    }\n                }\n                createProfile(it)\n            }\n        }\n    }\n\n    fun serializeToJson(profiles: List<Profile>? = getActiveProfiles()): JSONArray? {\n        if (profiles == null) return null\n        val lookup = LongSparseArray<Profile>(profiles.size).apply { profiles.forEach { put(it.id, it) } }\n        return JSONArray(profiles.map { it.toJson(lookup) }.toTypedArray())\n    }\n\n    /**\n     * Note: It's caller's responsibility to update DirectBoot profile if necessary.\n     */\n    @Throws(SQLException::class)\n    fun updateProfile(profile: Profile) = check(PrivateDatabase.profileDao.update(profile) == 1)\n\n    @Throws(IOException::class)\n    fun getProfile(id: Long): Profile? = try {\n        PrivateDatabase.profileDao[id]\n    } catch (ex: SQLiteCantOpenDatabaseException) {\n        throw IOException(ex)\n    } catch (ex: SQLException) {\n        Timber.w(ex)\n        null\n    }\n\n    @Throws(IOException::class)\n    fun expand(profile: Profile) = ExpandedProfile(profile, profile.udpFallback?.let { getProfile(it) })\n\n    @Throws(SQLException::class)\n    fun delProfile(id: Long) {\n        check(PrivateDatabase.profileDao.delete(id) == 1)\n        listener?.onRemove(id)\n        if (id in Core.activeProfileIds && DataStore.directBootAware) DirectBoot.clean()\n    }\n\n    @Throws(SQLException::class)\n    fun clear() = PrivateDatabase.profileDao.deleteAll().also {\n        // listener is not called since this won't be used in mobile submodule\n        DirectBoot.clean()\n        listener?.onCleared()\n    }\n\n    @Throws(IOException::class)\n    fun ensureNotEmpty() {\n        val nonEmpty = try {\n            PrivateDatabase.profileDao.isNotEmpty()\n        } catch (ex: SQLiteCantOpenDatabaseException) {\n            throw IOException(ex)\n        } catch (ex: SQLException) {\n            Timber.w(ex)\n            false\n        }\n        if (!nonEmpty) DataStore.profileId = createProfile().id\n    }\n\n    @Throws(IOException::class)\n    fun getActiveProfiles(): List<Profile>? = try {\n        PrivateDatabase.profileDao.listActive()\n    } catch (ex: SQLiteCantOpenDatabaseException) {\n        throw IOException(ex)\n    } catch (ex: SQLException) {\n        Timber.w(ex)\n        null\n    }\n\n    @Throws(IOException::class)\n    fun getAllProfiles(): List<Profile>? = try {\n        PrivateDatabase.profileDao.listAll()\n    } catch (ex: SQLiteCantOpenDatabaseException) {\n        throw IOException(ex)\n    } catch (ex: SQLException) {\n        Timber.w(ex)\n        null\n    }\n}\n"
  },
  {
    "path": "core/src/main/java/com/github/shadowsocks/database/PublicDatabase.kt",
    "content": "/*******************************************************************************\n *                                                                             *\n *  Copyright (C) 2017 by Max Lv <max.c.lv@gmail.com>                          *\n *  Copyright (C) 2017 by Mygod Studio <contact-shadowsocks-android@mygod.be>  *\n *                                                                             *\n *  This program is free software: you can redistribute it and/or modify       *\n *  it under the terms of the GNU General Public License as published by       *\n *  the Free Software Foundation, either version 3 of the License, or          *\n *  (at your option) any later version.                                        *\n *                                                                             *\n *  This program is distributed in the hope that it will be useful,            *\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of             *\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the              *\n *  GNU General Public License for more details.                               *\n *                                                                             *\n *  You should have received a copy of the GNU General Public License          *\n *  along with this program. If not, see <http://www.gnu.org/licenses/>.       *\n *                                                                             *\n *******************************************************************************/\n\npackage com.github.shadowsocks.database\n\nimport androidx.room.Database\nimport androidx.room.Room\nimport androidx.room.RoomDatabase\nimport com.github.shadowsocks.Core\nimport com.github.shadowsocks.database.migration.RecreateSchemaMigration\nimport com.github.shadowsocks.utils.Key\nimport kotlinx.coroutines.GlobalScope\nimport kotlinx.coroutines.launch\n\n@Database(entities = [KeyValuePair::class], version = 3)\nabstract class PublicDatabase : RoomDatabase() {\n    companion object {\n        private val instance by lazy {\n            Room.databaseBuilder(Core.deviceStorage, PublicDatabase::class.java, Key.DB_PUBLIC).apply {\n                addMigrations(\n                        Migration3\n                )\n                allowMainThreadQueries()\n                enableMultiInstanceInvalidation()\n                fallbackToDestructiveMigration()\n                setQueryExecutor { GlobalScope.launch { it.run() } }\n            }.build()\n        }\n\n        val kvPairDao get() = instance.keyValuePairDao()\n    }\n    abstract fun keyValuePairDao(): KeyValuePair.Dao\n\n    internal object Migration3 : RecreateSchemaMigration(2, 3, \"KeyValuePair\",\n            \"(`key` TEXT NOT NULL, `valueType` INTEGER NOT NULL, `value` BLOB NOT NULL, PRIMARY KEY(`key`))\",\n            \"`key`, `valueType`, `value`\")\n}\n"
  },
  {
    "path": "core/src/main/java/com/github/shadowsocks/database/migration/RecreateSchemaMigration.kt",
    "content": "/*******************************************************************************\n *                                                                             *\n *  Copyright (C) 2018 by Max Lv <max.c.lv@gmail.com>                          *\n *  Copyright (C) 2018 by Mygod Studio <contact-shadowsocks-android@mygod.be>  *\n *                                                                             *\n *  This program is free software: you can redistribute it and/or modify       *\n *  it under the terms of the GNU General Public License as published by       *\n *  the Free Software Foundation, either version 3 of the License, or          *\n *  (at your option) any later version.                                        *\n *                                                                             *\n *  This program is distributed in the hope that it will be useful,            *\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of             *\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the              *\n *  GNU General Public License for more details.                               *\n *                                                                             *\n *  You should have received a copy of the GNU General Public License          *\n *  along with this program. If not, see <http://www.gnu.org/licenses/>.       *\n *                                                                             *\n *******************************************************************************/\n\npackage com.github.shadowsocks.database.migration\n\nimport androidx.room.migration.Migration\nimport androidx.sqlite.db.SupportSQLiteDatabase\n\nopen class RecreateSchemaMigration(oldVersion: Int, newVersion: Int, private val table: String,\n                                   private val schema: String, private val keys: String) :\n        Migration(oldVersion, newVersion) {\n    override fun migrate(database: SupportSQLiteDatabase) {\n        database.execSQL(\"CREATE TABLE `tmp` $schema\")\n        database.execSQL(\"INSERT INTO `tmp` ($keys) SELECT $keys FROM `$table`\")\n        database.execSQL(\"DROP TABLE `$table`\")\n        database.execSQL(\"ALTER TABLE `tmp` RENAME TO `$table`\")\n    }\n}\n"
  },
  {
    "path": "core/src/main/java/com/github/shadowsocks/net/ConcurrentLocalSocketListener.kt",
    "content": "/*******************************************************************************\n *                                                                             *\n *  Copyright (C) 2019 by Max Lv <max.c.lv@gmail.com>                          *\n *  Copyright (C) 2019 by Mygod Studio <contact-shadowsocks-android@mygod.be>  *\n *                                                                             *\n *  This program is free software: you can redistribute it and/or modify       *\n *  it under the terms of the GNU General Public License as published by       *\n *  the Free Software Foundation, either version 3 of the License, or          *\n *  (at your option) any later version.                                        *\n *                                                                             *\n *  This program is distributed in the hope that it will be useful,            *\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of             *\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the              *\n *  GNU General Public License for more details.                               *\n *                                                                             *\n *  You should have received a copy of the GNU General Public License          *\n *  along with this program. If not, see <http://www.gnu.org/licenses/>.       *\n *                                                                             *\n *******************************************************************************/\n\npackage com.github.shadowsocks.net\n\nimport android.net.LocalSocket\nimport kotlinx.coroutines.*\nimport timber.log.Timber\nimport java.io.File\n\nabstract class ConcurrentLocalSocketListener(name: String, socketFile: File) : LocalSocketListener(name, socketFile),\n        CoroutineScope {\n    override val coroutineContext = Dispatchers.IO + SupervisorJob() + CoroutineExceptionHandler { _, t -> Timber.w(t) }\n\n    override fun accept(socket: LocalSocket) {\n        launch { super.accept(socket) }\n    }\n\n    override fun shutdown(scope: CoroutineScope) {\n        running = false\n        cancel()\n        super.shutdown(scope)\n        coroutineContext[Job]!!.also { job -> scope.launch { job.join() } }\n    }\n}\n"
  },
  {
    "path": "core/src/main/java/com/github/shadowsocks/net/DefaultNetworkListener.kt",
    "content": "/*******************************************************************************\n *                                                                             *\n *  Copyright (C) 2019 by Max Lv <max.c.lv@gmail.com>                          *\n *  Copyright (C) 2019 by Mygod Studio <contact-shadowsocks-android@mygod.be>  *\n *                                                                             *\n *  This program is free software: you can redistribute it and/or modify       *\n *  it under the terms of the GNU General Public License as published by       *\n *  the Free Software Foundation, either version 3 of the License, or          *\n *  (at your option) any later version.                                        *\n *                                                                             *\n *  This program is distributed in the hope that it will be useful,            *\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of             *\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the              *\n *  GNU General Public License for more details.                               *\n *                                                                             *\n *  You should have received a copy of the GNU General Public License          *\n *  along with this program. If not, see <http://www.gnu.org/licenses/>.       *\n *                                                                             *\n *******************************************************************************/\n\npackage com.github.shadowsocks.net\n\nimport android.annotation.TargetApi\nimport android.net.ConnectivityManager\nimport android.net.Network\nimport android.net.NetworkCapabilities\nimport android.net.NetworkRequest\nimport android.os.Build\nimport android.os.Handler\nimport android.os.Looper\nimport com.github.shadowsocks.Core\nimport kotlinx.coroutines.CompletableDeferred\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.GlobalScope\nimport kotlinx.coroutines.channels.actor\nimport kotlinx.coroutines.runBlocking\nimport java.net.UnknownHostException\n\nobject DefaultNetworkListener {\n    private sealed class NetworkMessage {\n        class Start(val key: Any, val listener: (Network?) -> Unit) : NetworkMessage()\n        class Get : NetworkMessage() {\n            val response = CompletableDeferred<Network>()\n        }\n        class Stop(val key: Any) : NetworkMessage()\n\n        class Put(val network: Network) : NetworkMessage()\n        class Update(val network: Network) : NetworkMessage()\n        class Lost(val network: Network) : NetworkMessage()\n    }\n    private val networkActor = GlobalScope.actor<NetworkMessage>(Dispatchers.Unconfined) {\n        val listeners = mutableMapOf<Any, (Network?) -> Unit>()\n        var network: Network? = null\n        val pendingRequests = arrayListOf<NetworkMessage.Get>()\n        for (message in channel) when (message) {\n            is NetworkMessage.Start -> {\n                if (listeners.isEmpty()) register()\n                listeners[message.key] = message.listener\n                if (network != null) message.listener(network)\n            }\n            is NetworkMessage.Get -> {\n                check(listeners.isNotEmpty()) { \"Getting network without any listeners is not supported\" }\n                if (network == null) pendingRequests += message else message.response.complete(network)\n            }\n            is NetworkMessage.Stop -> if (listeners.isNotEmpty() && // was not empty\n                    listeners.remove(message.key) != null && listeners.isEmpty()) {\n                network = null\n                unregister()\n            }\n\n            is NetworkMessage.Put -> {\n                network = message.network\n                pendingRequests.forEach { it.response.complete(message.network) }\n                pendingRequests.clear()\n                listeners.values.forEach { it(network) }\n            }\n            is NetworkMessage.Update -> if (network == message.network) listeners.values.forEach { it(network) }\n            is NetworkMessage.Lost -> if (network == message.network) {\n                network = null\n                listeners.values.forEach { it(null) }\n            }\n        }\n    }\n\n    suspend fun start(key: Any, listener: (Network?) -> Unit) = networkActor.send(NetworkMessage.Start(key, listener))\n    suspend fun get() = if (fallback) {\n        Core.connectivity.activeNetwork ?: throw UnknownHostException() // failed to listen, return current if available\n    } else NetworkMessage.Get().run {\n        networkActor.send(this)\n        response.await()\n    }\n    suspend fun stop(key: Any) = networkActor.send(NetworkMessage.Stop(key))\n\n    // NB: this runs in ConnectivityThread, and this behavior cannot be changed until API 26\n    private object Callback : ConnectivityManager.NetworkCallback() {\n        override fun onAvailable(network: Network) = runBlocking { networkActor.send(NetworkMessage.Put(network)) }\n        override fun onCapabilitiesChanged(network: Network, networkCapabilities: NetworkCapabilities) {\n            // it's a good idea to refresh capabilities\n            runBlocking { networkActor.send(NetworkMessage.Update(network)) }\n        }\n        override fun onLost(network: Network) = runBlocking { networkActor.send(NetworkMessage.Lost(network)) }\n    }\n\n    private var fallback = false\n    private val request = NetworkRequest.Builder().apply {\n        addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)\n        addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED)\n        if (Build.VERSION.SDK_INT == 23) {  // workarounds for OEM bugs\n            removeCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED)\n            removeCapability(NetworkCapabilities.NET_CAPABILITY_CAPTIVE_PORTAL)\n        }\n    }.build()\n    private val mainHandler = Handler(Looper.getMainLooper())\n    /**\n     * Unfortunately registerDefaultNetworkCallback is going to return VPN interface since Android P DP1:\n     * https://android.googlesource.com/platform/frameworks/base/+/dda156ab0c5d66ad82bdcf76cda07cbc0a9c8a2e\n     *\n     * This makes doing a requestNetwork with REQUEST necessary so that we don't get ALL possible networks that\n     * satisfies default network capabilities but only THE default network. Unfortunately, we need to have\n     * android.permission.CHANGE_NETWORK_STATE to be able to call requestNetwork.\n     *\n     * Source: https://android.googlesource.com/platform/frameworks/base/+/2df4c7d/services/core/java/com/android/server/ConnectivityService.java#887\n     */\n    private fun register() {\n        when (Build.VERSION.SDK_INT) {\n            in 31..Int.MAX_VALUE -> @TargetApi(31) {\n                Core.connectivity.registerBestMatchingNetworkCallback(request, Callback, mainHandler)\n            }\n            in 28 until 31 -> @TargetApi(28) {  // we want REQUEST here instead of LISTEN\n                Core.connectivity.requestNetwork(request, Callback, mainHandler)\n            }\n            in 26 until 28 -> @TargetApi(26) {\n                Core.connectivity.registerDefaultNetworkCallback(Callback, mainHandler)\n            }\n            in 24 until 26 -> @TargetApi(24) {\n                Core.connectivity.registerDefaultNetworkCallback(Callback)\n            }\n            else -> try {\n                fallback = false\n                Core.connectivity.requestNetwork(request, Callback)\n            } catch (e: RuntimeException) {\n                fallback = true     // known bug on API 23: https://stackoverflow.com/a/33509180/2245107\n            }\n        }\n    }\n    private fun unregister() = Core.connectivity.unregisterNetworkCallback(Callback)\n}\n"
  },
  {
    "path": "core/src/main/java/com/github/shadowsocks/net/DnsResolverCompat.kt",
    "content": "/*******************************************************************************\n *                                                                             *\n *  Copyright (C) 2019 by Max Lv <max.c.lv@gmail.com>                          *\n *  Copyright (C) 2019 by Mygod Studio <contact-shadowsocks-android@mygod.be>  *\n *                                                                             *\n *  This program is free software: you can redistribute it and/or modify       *\n *  it under the terms of the GNU General Public License as published by       *\n *  the Free Software Foundation, either version 3 of the License, or          *\n *  (at your option) any later version.                                        *\n *                                                                             *\n *  This program is distributed in the hope that it will be useful,            *\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of             *\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the              *\n *  GNU General Public License for more details.                               *\n *                                                                             *\n *  You should have received a copy of the GNU General Public License          *\n *  along with this program. If not, see <http://www.gnu.org/licenses/>.       *\n *                                                                             *\n *******************************************************************************/\n\npackage com.github.shadowsocks.net\n\nimport android.annotation.TargetApi\nimport android.net.DnsResolver\nimport android.net.Network\nimport android.os.Build\nimport android.os.CancellationSignal\nimport com.github.shadowsocks.Core\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.Runnable\nimport kotlinx.coroutines.suspendCancellableCoroutine\nimport kotlinx.coroutines.withContext\nimport org.xbill.DNS.AAAARecord\nimport org.xbill.DNS.ARecord\nimport org.xbill.DNS.DClass\nimport org.xbill.DNS.Flags\nimport org.xbill.DNS.Message\nimport org.xbill.DNS.Name\nimport org.xbill.DNS.Opcode\nimport org.xbill.DNS.PTRRecord\nimport org.xbill.DNS.ReverseMap\nimport org.xbill.DNS.Section\nimport org.xbill.DNS.Type\nimport java.io.IOException\nimport java.net.Inet4Address\nimport java.net.Inet6Address\nimport java.net.InetAddress\nimport java.util.concurrent.Executor\nimport kotlin.coroutines.resume\nimport kotlin.coroutines.resumeWithException\n\nsealed class DnsResolverCompat {\n    companion object : DnsResolverCompat() {\n        private val instance by lazy {\n            when (Build.VERSION.SDK_INT) {\n                in 29..Int.MAX_VALUE -> DnsResolverCompat29\n                in 23 until 29 -> DnsResolverCompat23\n                else -> error(\"Unsupported API level\")\n            }\n        }\n\n        override suspend fun resolve(network: Network, host: String) = instance.resolve(network, host)\n        override suspend fun resolveOnActiveNetwork(host: String) = instance.resolveOnActiveNetwork(host)\n        override suspend fun resolveRaw(network: Network, query: ByteArray) = instance.resolveRaw(network, query)\n        override suspend fun resolveRawOnActiveNetwork(query: ByteArray) = instance.resolveRawOnActiveNetwork(query)\n\n        // additional platform-independent DNS helpers\n\n        /**\n         * TTL returned from localResolver is set to 120. Android API does not provide TTL,\n         * so we suppose Android apps should not care about TTL either.\n         */\n        private const val TTL = 120L\n\n        fun prepareDnsResponse(request: Message) = Message(request.header.id).apply {\n            header.setFlag(Flags.QR.toInt())    // this is a response\n            header.setFlag(Flags.RA.toInt())    // recursion available\n            if (request.header.getFlag(Flags.RD.toInt())) header.setFlag(Flags.RD.toInt())\n            request.question?.also { addRecord(it, Section.QUESTION) }\n        }\n    }\n\n    abstract suspend fun resolve(network: Network, host: String): Array<InetAddress>\n    abstract suspend fun resolveOnActiveNetwork(host: String): Array<InetAddress>\n    abstract suspend fun resolveRaw(network: Network, query: ByteArray): ByteArray\n    abstract suspend fun resolveRawOnActiveNetwork(query: ByteArray): ByteArray\n\n    private data object DnsResolverCompat23 : DnsResolverCompat() {\n        /**\n         * This dispatcher is used for noncancellable possibly-forever-blocking operations in network IO.\n         *\n         * See also: https://issuetracker.google.com/issues/133874590\n         */\n        private val unboundedIO by lazy {\n            if (Core.activity.isLowRamDevice) Dispatchers.IO\n            else Dispatchers.IO.limitedParallelism(Int.MAX_VALUE, \"unboundedIO\")\n        }\n\n        override suspend fun resolve(network: Network, host: String) =\n                withContext(unboundedIO) { network.getAllByName(host) }\n        override suspend fun resolveOnActiveNetwork(host: String) =\n                withContext(unboundedIO) { InetAddress.getAllByName(host) }\n\n        private suspend fun resolveRaw(query: ByteArray, networkSpecified: Boolean = true,\n                                       hostResolver: suspend (String) -> Array<InetAddress>): ByteArray {\n            val request = try {\n                Message(query)\n            } catch (e: IOException) {\n                throw UnsupportedOperationException(e)  // unrecognized packet\n            }\n            when (val opcode = request.header.opcode) {\n                Opcode.QUERY -> { }\n                else -> throw UnsupportedOperationException(\"Unsupported opcode $opcode\")\n            }\n            val question = request.question\n            val isIpv6 = when (val type = question?.type) {\n                Type.A -> false\n                Type.AAAA -> true\n                Type.PTR -> {\n                    /* Android does not provide a PTR lookup API for Network prior to Android 10 */\n                    if (networkSpecified) throw IOException(UnsupportedOperationException(\"Network unspecified\"))\n                    val ip = try {\n                        ReverseMap.fromName(question.name)\n                    } catch (e: IOException) {\n                        throw UnsupportedOperationException(e)  // unrecognized PTR name\n                    }\n                    val hostname = withContext(unboundedIO) { ip.hostName }.let { hostname ->\n                        if (hostname == ip.hostAddress) null else Name.fromString(\"$hostname.\")\n                    }\n                    return prepareDnsResponse(request).apply {\n                        hostname?.let { addRecord(PTRRecord(question.name, DClass.IN, TTL, it), Section.ANSWER) }\n                    }.toWire()\n                }\n                else -> throw UnsupportedOperationException(\"Unsupported query type $type\")\n            }\n            val host = question.name.canonicalize().toString(true)\n            return prepareDnsResponse(request).apply {\n                for (address in hostResolver(host).asIterable().run {\n                    if (isIpv6) filterIsInstance<Inet6Address>() else filterIsInstance<Inet4Address>()\n                }) addRecord(when (address) {\n                    is Inet4Address -> ARecord(question.name, DClass.IN, TTL, address)\n                    is Inet6Address -> AAAARecord(question.name, DClass.IN, TTL, address)\n                    else -> error(\"Unsupported address $address\")\n                }, Section.ANSWER)\n            }.toWire()\n        }\n        override suspend fun resolveRaw(network: Network, query: ByteArray) =\n                resolveRaw(query) { resolve(network, it) }\n        override suspend fun resolveRawOnActiveNetwork(query: ByteArray) =\n                resolveRaw(query, false, this::resolveOnActiveNetwork)\n    }\n\n    @TargetApi(29)\n    private object DnsResolverCompat29 : DnsResolverCompat(), Executor {\n        /**\n         * This executor will run on its caller directly. On Q beta 3 thru 4, this results in calling in main thread.\n         */\n        override fun execute(command: Runnable) = command.run()\n\n        private val activeNetwork get() = Core.connectivity.activeNetwork ?: throw IOException(\"no network\")\n\n        override suspend fun resolve(network: Network, host: String): Array<InetAddress> {\n            return suspendCancellableCoroutine { cont ->\n                val signal = CancellationSignal()\n                cont.invokeOnCancellation { signal.cancel() }\n                // retry should be handled by client instead\n                DnsResolver.getInstance().query(network, host, DnsResolver.FLAG_NO_RETRY, this,\n                        signal, object : DnsResolver.Callback<Collection<InetAddress>> {\n                    override fun onAnswer(answer: Collection<InetAddress>, rcode: Int) =\n                            cont.resume(answer.toTypedArray())\n                    override fun onError(error: DnsResolver.DnsException) = cont.resumeWithException(IOException(error))\n                })\n            }\n        }\n        override suspend fun resolveOnActiveNetwork(host: String) = resolve(activeNetwork, host)\n\n        override suspend fun resolveRaw(network: Network, query: ByteArray): ByteArray {\n            return suspendCancellableCoroutine { cont ->\n                val signal = CancellationSignal()\n                cont.invokeOnCancellation { signal.cancel() }\n                DnsResolver.getInstance().rawQuery(network, query, DnsResolver.FLAG_NO_RETRY, this,\n                        signal, object : DnsResolver.Callback<ByteArray> {\n                    override fun onAnswer(answer: ByteArray, rcode: Int) = cont.resume(answer)\n                    override fun onError(error: DnsResolver.DnsException) = cont.resumeWithException(IOException(error))\n                })\n            }\n        }\n        override suspend fun resolveRawOnActiveNetwork(query: ByteArray) = resolveRaw(activeNetwork, query)\n    }\n}\n"
  },
  {
    "path": "core/src/main/java/com/github/shadowsocks/net/HttpsTest.kt",
    "content": "/*******************************************************************************\n *                                                                             *\n *  Copyright (C) 2018 by Max Lv <max.c.lv@gmail.com>                          *\n *  Copyright (C) 2018 by Mygod Studio <contact-shadowsocks-android@mygod.be>  *\n *                                                                             *\n *  This program is free software: you can redistribute it and/or modify       *\n *  it under the terms of the GNU General Public License as published by       *\n *  the Free Software Foundation, either version 3 of the License, or          *\n *  (at your option) any later version.                                        *\n *                                                                             *\n *  This program is distributed in the hope that it will be useful,            *\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of             *\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the              *\n *  GNU General Public License for more details.                               *\n *                                                                             *\n *  You should have received a copy of the GNU General Public License          *\n *  along with this program. If not, see <http://www.gnu.org/licenses/>.       *\n *                                                                             *\n *******************************************************************************/\n\npackage com.github.shadowsocks.net\n\nimport android.os.Build\nimport android.os.SystemClock\nimport androidx.lifecycle.MutableLiveData\nimport androidx.lifecycle.ViewModel\nimport com.github.shadowsocks.Core.app\nimport com.github.shadowsocks.core.R\nimport com.github.shadowsocks.preference.DataStore\nimport com.github.shadowsocks.utils.useCancellable\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.GlobalScope\nimport kotlinx.coroutines.Job\nimport kotlinx.coroutines.launch\nimport java.io.IOException\nimport java.net.HttpURLConnection\nimport java.net.URL\nimport java.net.URLConnection\n\n/**\n * Based on: https://android.googlesource.com/platform/frameworks/base/+/b19a838/services/core/java/com/android/server/connectivity/NetworkMonitor.java#1071\n */\nclass HttpsTest : ViewModel() {\n    sealed class Status {\n        protected abstract val status: CharSequence\n        open fun retrieve(setStatus: (CharSequence) -> Unit, errorCallback: (String) -> Unit) = setStatus(status)\n\n        data object Idle : Status() {\n            override val status get() = app.getText(R.string.vpn_connected)\n        }\n        data object Testing : Status() {\n            override val status get() = app.getText(R.string.connection_test_testing)\n        }\n        class Success(private val elapsed: Long) : Status() {\n            override val status get() = app.getString(R.string.connection_test_available, elapsed)\n        }\n        sealed class Error : Status() {\n            override val status get() = app.getText(R.string.connection_test_fail)\n            protected abstract val error: String\n            private var shown = false\n            override fun retrieve(setStatus: (CharSequence) -> Unit, errorCallback: (String) -> Unit) {\n                super.retrieve(setStatus, errorCallback)\n                if (shown) return\n                shown = true\n                errorCallback(error)\n            }\n\n            class UnexpectedResponseCode(private val code: Int) : Error() {\n                override val error get() = app.getString(R.string.connection_test_error_status_code, code)\n            }\n            class IOFailure(private val e: IOException) : Error() {\n                override val error get() = app.getString(R.string.connection_test_error, e.message)\n            }\n        }\n    }\n\n    private var running: Job? = null\n    val status = MutableLiveData<Status>(Status.Idle)\n\n    fun testConnection() {\n        cancelTest()\n        status.value = Status.Testing\n        val url = URL(\"https://cp.cloudflare.com\")\n        val conn = url.openConnection(DataStore.proxy) as HttpURLConnection\n        conn.setRequestProperty(\"Connection\", \"close\")\n        conn.instanceFollowRedirects = false\n        conn.useCaches = false\n        running = GlobalScope.launch(Dispatchers.Main.immediate) {\n            status.value = conn.useCancellable {\n                try {\n                    val start = SystemClock.elapsedRealtime()\n                    val code = responseCode\n                    val elapsed = SystemClock.elapsedRealtime() - start\n                    if (code == 204 || code == 200 && responseLength == 0L) Status.Success(elapsed)\n                    else Status.Error.UnexpectedResponseCode(code)\n                } catch (e: IOException) {\n                    Status.Error.IOFailure(e)\n                } finally {\n                    disconnect()\n                }\n            }\n        }\n    }\n\n    private fun cancelTest() {\n        running?.cancel()\n        running = null\n    }\n\n    fun invalidate() {\n        cancelTest()\n        status.value = Status.Idle\n    }\n\n    private val URLConnection.responseLength: Long\n        get() = if (Build.VERSION.SDK_INT >= 24) contentLengthLong else contentLength.toLong()\n}\n"
  },
  {
    "path": "core/src/main/java/com/github/shadowsocks/net/LocalSocketListener.kt",
    "content": "/*******************************************************************************\n *                                                                             *\n *  Copyright (C) 2017 by Max Lv <max.c.lv@gmail.com>                          *\n *  Copyright (C) 2017 by Mygod Studio <contact-shadowsocks-android@mygod.be>  *\n *                                                                             *\n *  This program is free software: you can redistribute it and/or modify       *\n *  it under the terms of the GNU General Public License as published by       *\n *  the Free Software Foundation, either version 3 of the License, or          *\n *  (at your option) any later version.                                        *\n *                                                                             *\n *  This program is distributed in the hope that it will be useful,            *\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of             *\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the              *\n *  GNU General Public License for more details.                               *\n *                                                                             *\n *  You should have received a copy of the GNU General Public License          *\n *  along with this program. If not, see <http://www.gnu.org/licenses/>.       *\n *                                                                             *\n *******************************************************************************/\n\npackage com.github.shadowsocks.net\n\nimport android.annotation.SuppressLint\nimport android.net.LocalServerSocket\nimport android.net.LocalSocket\nimport android.net.LocalSocketAddress\nimport android.system.ErrnoException\nimport android.system.Os\nimport android.system.OsConstants\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.channels.Channel\nimport kotlinx.coroutines.channels.onFailure\nimport kotlinx.coroutines.channels.trySendBlocking\nimport kotlinx.coroutines.launch\nimport timber.log.Timber\nimport java.io.File\nimport java.io.IOException\n\nabstract class LocalSocketListener(name: String, socketFile: File) : Thread(name) {\n    private val localSocket = LocalSocket().apply {\n        socketFile.delete() // It's a must-have to close and reuse previous local socket.\n        bind(LocalSocketAddress(socketFile.absolutePath, LocalSocketAddress.Namespace.FILESYSTEM))\n    }\n    private val serverSocket = LocalServerSocket(localSocket.fileDescriptor)\n    private val closeChannel = Channel<Unit>(1)\n    @Volatile\n    protected var running = true\n\n    /**\n     * Inherited class do not need to close input/output streams as they will be closed automatically.\n     */\n    protected open fun accept(socket: LocalSocket) = socket.use { acceptInternal(socket) }\n    protected abstract fun acceptInternal(socket: LocalSocket)\n    final override fun run() {\n        localSocket.use {\n            while (running) {\n                try {\n                    accept(serverSocket.accept())\n                } catch (e: IOException) {\n                    if (running) Timber.w(e)\n                    continue\n                }\n            }\n        }\n        closeChannel.trySendBlocking(Unit).onFailure { throw it!! }\n    }\n\n    @SuppressLint(\"NewApi\")\n    open fun shutdown(scope: CoroutineScope) {\n        running = false\n        localSocket.fileDescriptor?.apply {\n            // see also: https://issuetracker.google.com/issues/36945762#comment15\n            if (valid()) try {\n                Os.shutdown(this, OsConstants.SHUT_RDWR)\n            } catch (e: ErrnoException) {\n                // suppress fd inactive or already closed\n                if (e.errno != OsConstants.EBADF && e.errno != OsConstants.ENOTCONN) throw e.rethrowAsSocketException()\n            }\n        }\n        scope.launch { closeChannel.receive() }\n    }\n}\n"
  },
  {
    "path": "core/src/main/java/com/github/shadowsocks/net/Subnet.kt",
    "content": "/*******************************************************************************\n *                                                                             *\n *  Copyright (C) 2017 by Max Lv <max.c.lv@gmail.com>                          *\n *  Copyright (C) 2017 by Mygod Studio <contact-shadowsocks-android@mygod.be>  *\n *                                                                             *\n *  This program is free software: you can redistribute it and/or modify       *\n *  it under the terms of the GNU General Public License as published by       *\n *  the Free Software Foundation, either version 3 of the License, or          *\n *  (at your option) any later version.                                        *\n *                                                                             *\n *  This program is distributed in the hope that it will be useful,            *\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of             *\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the              *\n *  GNU General Public License for more details.                               *\n *                                                                             *\n *  You should have received a copy of the GNU General Public License          *\n *  along with this program. If not, see <http://www.gnu.org/licenses/>.       *\n *                                                                             *\n *******************************************************************************/\n\npackage com.github.shadowsocks.net\n\nimport com.github.shadowsocks.utils.parseNumericAddress\nimport java.net.InetAddress\nimport java.util.*\n\nclass Subnet(val address: InetAddress, val prefixSize: Int) : Comparable<Subnet> {\n    companion object {\n        fun fromString(value: String, lengthCheck: Int = -1): Subnet? {\n            val parts = value.split('/', limit = 2)\n            val addr = parts[0].parseNumericAddress() ?: return null\n            check(lengthCheck < 0 || addr.address.size == lengthCheck)\n            return if (parts.size == 2) try {\n                val prefixSize = parts[1].toInt()\n                if (prefixSize < 0 || prefixSize > addr.address.size shl 3) null else Subnet(addr, prefixSize)\n            } catch (_: NumberFormatException) {\n                null\n            } else Subnet(addr, addr.address.size shl 3)\n        }\n    }\n\n    private val addressLength get() = address.address.size shl 3\n\n    init {\n        require(prefixSize in 0..addressLength) { \"prefixSize $prefixSize not in 0..$addressLength\" }\n    }\n\n    class Immutable(private val a: ByteArray, private val prefixSize: Int = 0) {\n        companion object : Comparator<Immutable> {\n            override fun compare(a: Immutable, b: Immutable): Int {\n                check(a.a.size == b.a.size)\n                for (i in a.a.indices) {\n                    val result = a.a[i].compareTo(b.a[i])\n                    if (result != 0) return result\n                }\n                return 0\n            }\n        }\n\n        fun matches(b: Immutable) = matches(b.a)\n        fun matches(b: ByteArray): Boolean {\n            if (a.size != b.size) return false\n            var i = 0\n            while (i * 8 < prefixSize && i * 8 + 8 <= prefixSize) {\n                if (a[i] != b[i]) return false\n                ++i\n            }\n            return i * 8 == prefixSize || a[i] == (b[i].toInt() and -(1 shl i * 8 + 8 - prefixSize)).toByte()\n        }\n    }\n    fun toImmutable() = Immutable(address.address.also {\n        var i = prefixSize / 8\n        if (prefixSize % 8 > 0) {\n            it[i] = (it[i].toInt() and -(1 shl i * 8 + 8 - prefixSize)).toByte()\n            ++i\n        }\n        while (i < it.size) it[i++] = 0\n    }, prefixSize)\n\n    override fun toString(): String =\n            if (prefixSize == addressLength) address.hostAddress!! else address.hostAddress!! + '/' + prefixSize\n\n    private fun Byte.unsigned() = toInt() and 0xFF\n    override fun compareTo(other: Subnet): Int {\n        val addrThis = address.address\n        val addrThat = other.address.address\n        var result = addrThis.size.compareTo(addrThat.size)                 // IPv4 address goes first\n        if (result != 0) return result\n        for (i in addrThis.indices) {\n            result = addrThis[i].unsigned().compareTo(addrThat[i].unsigned())   // undo sign extension of signed byte\n            if (result != 0) return result\n        }\n        return prefixSize.compareTo(other.prefixSize)\n    }\n\n    override fun equals(other: Any?): Boolean {\n        val that = other as? Subnet\n        return address == that?.address && prefixSize == that.prefixSize\n    }\n    override fun hashCode(): Int = Objects.hash(address, prefixSize)\n}\n"
  },
  {
    "path": "core/src/main/java/com/github/shadowsocks/plugin/NativePlugin.kt",
    "content": "/*******************************************************************************\n *                                                                             *\n *  Copyright (C) 2017 by Max Lv <max.c.lv@gmail.com>                          *\n *  Copyright (C) 2017 by Mygod Studio <contact-shadowsocks-android@mygod.be>  *\n *                                                                             *\n *  This program is free software: you can redistribute it and/or modify       *\n *  it under the terms of the GNU General Public License as published by       *\n *  the Free Software Foundation, either version 3 of the License, or          *\n *  (at your option) any later version.                                        *\n *                                                                             *\n *  This program is distributed in the hope that it will be useful,            *\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of             *\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the              *\n *  GNU General Public License for more details.                               *\n *                                                                             *\n *  You should have received a copy of the GNU General Public License          *\n *  along with this program. If not, see <http://www.gnu.org/licenses/>.       *\n *                                                                             *\n *******************************************************************************/\n\npackage com.github.shadowsocks.plugin\n\nimport android.content.pm.ResolveInfo\n\nclass NativePlugin(resolveInfo: ResolveInfo) : ResolvedPlugin(resolveInfo) {\n    init {\n        check(resolveInfo.providerInfo != null)\n    }\n\n    override val componentInfo get() = resolveInfo.providerInfo!!\n}\n"
  },
  {
    "path": "core/src/main/java/com/github/shadowsocks/plugin/NoPlugin.kt",
    "content": "package com.github.shadowsocks.plugin\n\nimport com.github.shadowsocks.Core.app\n\nobject NoPlugin : Plugin() {\n    override val id: String get() = \"\"\n    override val label: CharSequence get() = app.getText(com.github.shadowsocks.core.R.string.plugin_disabled)\n}\n"
  },
  {
    "path": "core/src/main/java/com/github/shadowsocks/plugin/Plugin.kt",
    "content": "/*******************************************************************************\n *                                                                             *\n *  Copyright (C) 2017 by Max Lv <max.c.lv@gmail.com>                          *\n *  Copyright (C) 2017 by Mygod Studio <contact-shadowsocks-android@mygod.be>  *\n *                                                                             *\n *  This program is free software: you can redistribute it and/or modify       *\n *  it under the terms of the GNU General Public License as published by       *\n *  the Free Software Foundation, either version 3 of the License, or          *\n *  (at your option) any later version.                                        *\n *                                                                             *\n *  This program is distributed in the hope that it will be useful,            *\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of             *\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the              *\n *  GNU General Public License for more details.                               *\n *                                                                             *\n *  You should have received a copy of the GNU General Public License          *\n *  along with this program. If not, see <http://www.gnu.org/licenses/>.       *\n *                                                                             *\n *******************************************************************************/\n\npackage com.github.shadowsocks.plugin\n\nimport android.graphics.drawable.Drawable\n\nabstract class Plugin {\n    abstract val id: String\n    open val idAliases get() = emptyArray<String>()\n    abstract val label: CharSequence\n    open val icon: Drawable? get() = null\n    open val defaultConfig: String? get() = null\n    open val packageName: String get() = \"\"\n    open val trusted: Boolean get() = true\n    open val directBootAware: Boolean get() = true\n\n    override fun equals(other: Any?): Boolean {\n        if (this === other) return true\n        if (javaClass != other?.javaClass) return false\n        return id == (other as Plugin).id\n    }\n    override fun hashCode() = id.hashCode()\n}\n"
  },
  {
    "path": "core/src/main/java/com/github/shadowsocks/plugin/PluginConfiguration.kt",
    "content": "/*******************************************************************************\n *                                                                             *\n *  Copyright (C) 2017 by Max Lv <max.c.lv@gmail.com>                          *\n *  Copyright (C) 2017 by Mygod Studio <contact-shadowsocks-android@mygod.be>  *\n *                                                                             *\n *  This program is free software: you can redistribute it and/or modify       *\n *  it under the terms of the GNU General Public License as published by       *\n *  the Free Software Foundation, either version 3 of the License, or          *\n *  (at your option) any later version.                                        *\n *                                                                             *\n *  This program is distributed in the hope that it will be useful,            *\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of             *\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the              *\n *  GNU General Public License for more details.                               *\n *                                                                             *\n *  You should have received a copy of the GNU General Public License          *\n *  along with this program. If not, see <http://www.gnu.org/licenses/>.       *\n *                                                                             *\n *******************************************************************************/\n\npackage com.github.shadowsocks.plugin\n\nimport com.github.shadowsocks.utils.Commandline\nimport timber.log.Timber\nimport java.util.*\n\nclass PluginConfiguration(val pluginsOptions: Map<String, PluginOptions>, val selected: String) {\n    private constructor(plugins: List<PluginOptions>) : this(\n            plugins.filter { it.id.isNotEmpty() }.associateBy { it.id },\n            if (plugins.isEmpty()) \"\" else plugins[0].id)\n    constructor(plugin: String) : this(plugin.split('\\n').map { line ->\n        if (line.startsWith(\"kcptun \")) {\n            val opt = PluginOptions()\n            opt.id = \"kcptun\"\n            try {\n                val iterator = Commandline.translateCommandline(line).drop(1).iterator()\n                while (iterator.hasNext()) {\n                    val option = iterator.next()\n                    when {\n                        option == \"--nocomp\" -> opt[\"nocomp\"] = null\n                        option.startsWith(\"--\") -> opt[option.substring(2)] = iterator.next()\n                        else -> throw IllegalArgumentException(\"Unknown kcptun parameter: $option\")\n                    }\n                }\n            } catch (exc: Exception) {\n                Timber.w(exc)\n            }\n            opt\n        } else PluginOptions(line)\n    })\n\n    fun getOptions(\n            id: String = selected,\n            defaultConfig: () -> String? = { PluginManager.fetchPlugins().lookup[id]?.defaultConfig }\n    ) = if (id.isEmpty()) PluginOptions() else pluginsOptions[id] ?: PluginOptions(id, defaultConfig())\n\n    override fun toString(): String {\n        val result = LinkedList<PluginOptions>()\n        for ((id, opt) in pluginsOptions) if (id == this.selected) result.addFirst(opt) else result.addLast(opt)\n        if (!pluginsOptions.contains(selected)) result.addFirst(getOptions())\n        return result.joinToString(\"\\n\") { it.toString(false) }\n    }\n}\n"
  },
  {
    "path": "core/src/main/java/com/github/shadowsocks/plugin/PluginList.kt",
    "content": "/*******************************************************************************\n *                                                                             *\n *  Copyright (C) 2020 by Max Lv <max.c.lv@gmail.com>                          *\n *  Copyright (C) 2020 by Mygod Studio <contact-shadowsocks-android@mygod.be>  *\n *                                                                             *\n *  This program is free software: you can redistribute it and/or modify       *\n *  it under the terms of the GNU General Public License as published by       *\n *  the Free Software Foundation, either version 3 of the License, or          *\n *  (at your option) any later version.                                        *\n *                                                                             *\n *  This program is distributed in the hope that it will be useful,            *\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of             *\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the              *\n *  GNU General Public License for more details.                               *\n *                                                                             *\n *  You should have received a copy of the GNU General Public License          *\n *  along with this program. If not, see <http://www.gnu.org/licenses/>.       *\n *                                                                             *\n *******************************************************************************/\n\npackage com.github.shadowsocks.plugin\n\nimport android.content.Intent\nimport android.content.pm.PackageManager\nimport android.widget.Toast\nimport com.github.shadowsocks.Core.app\n\nclass PluginList : ArrayList<Plugin>() {\n    init {\n        add(NoPlugin)\n        addAll(app.packageManager.queryIntentContentProviders(\n                Intent(PluginContract.ACTION_NATIVE_PLUGIN), PackageManager.GET_META_DATA)\n                .filter { it.providerInfo.exported }.map { NativePlugin(it) })\n    }\n\n    val lookup = mutableMapOf<String, Plugin>().apply {\n        for (plugin in this@PluginList) {\n            fun check(old: Plugin?) {\n                if (old != null && old !== plugin) {\n                    val packages = this@PluginList.filter { it.id == plugin.id }.joinToString { it.packageName }\n                    val message = \"Conflicting plugins found from: $packages\"\n                    Toast.makeText(app, message, Toast.LENGTH_LONG).show()\n                    throw IllegalStateException(message)\n                }\n            }\n            check(put(plugin.id, plugin))\n            for (alias in plugin.idAliases) check(put(alias, plugin))\n        }\n    }\n}\n"
  },
  {
    "path": "core/src/main/java/com/github/shadowsocks/plugin/PluginManager.kt",
    "content": "/*******************************************************************************\n *                                                                             *\n *  Copyright (C) 2017 by Max Lv <max.c.lv@gmail.com>                          *\n *  Copyright (C) 2017 by Mygod Studio <contact-shadowsocks-android@mygod.be>  *\n *                                                                             *\n *  This program is free software: you can redistribute it and/or modify       *\n *  it under the terms of the GNU General Public License as published by       *\n *  the Free Software Foundation, either version 3 of the License, or          *\n *  (at your option) any later version.                                        *\n *                                                                             *\n *  This program is distributed in the hope that it will be useful,            *\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of             *\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the              *\n *  GNU General Public License for more details.                               *\n *                                                                             *\n *  You should have received a copy of the GNU General Public License          *\n *  along with this program. If not, see <http://www.gnu.org/licenses/>.       *\n *                                                                             *\n *******************************************************************************/\n\npackage com.github.shadowsocks.plugin\n\nimport android.annotation.SuppressLint\nimport android.content.BroadcastReceiver\nimport android.content.ContentResolver\nimport android.content.Intent\nimport android.content.pm.ComponentInfo\nimport android.content.pm.PackageManager\nimport android.content.pm.ProviderInfo\nimport android.content.pm.Signature\nimport android.database.Cursor\nimport android.net.Uri\nimport android.os.Build\nimport android.system.Os\nimport android.util.Base64\nimport android.widget.Toast\nimport androidx.core.os.bundleOf\nimport com.github.shadowsocks.Core\nimport com.github.shadowsocks.Core.app\nimport com.github.shadowsocks.bg.BaseService\nimport com.github.shadowsocks.utils.listenForPackageChanges\nimport com.github.shadowsocks.utils.signaturesCompat\nimport timber.log.Timber\nimport java.io.File\nimport java.io.FileNotFoundException\n\nobject PluginManager {\n    class PluginNotFoundException(private val plugin: String) : FileNotFoundException(plugin),\n            BaseService.ExpectedException {\n        override fun getLocalizedMessage() = app.getString(com.github.shadowsocks.core.R.string.plugin_unknown, plugin)\n    }\n\n    /**\n     * Trusted signatures by the app. Third-party fork should add their public key to their fork if the developer wishes\n     * to publish or has published plugins for this app. You can obtain your public key by executing:\n     *\n     * $ keytool -export -alias key-alias -keystore /path/to/keystore.jks -rfc\n     *\n     * If you don't plan to publish any plugin but is developing/has developed some, it's not necessary to add your\n     * public key yet since it will also automatically trust packages signed by the same signatures, e.g. debug keys.\n     */\n    val trustedSignatures by lazy {\n        (Core.packageInfo.signaturesCompat?.toSet() ?: emptySet()) +\n                Signature(Base64.decode(  // @Mygod\n                \"\"\"\n                    |MIIDWzCCAkOgAwIBAgIEUzfv8DANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJD\n                    |TjEOMAwGA1UECBMFTXlnb2QxDjAMBgNVBAcTBU15Z29kMQ4wDAYDVQQKEwVNeWdv\n                    |ZDEOMAwGA1UECxMFTXlnb2QxDjAMBgNVBAMTBU15Z29kMCAXDTE0MDUwMjA5MjQx\n                    |OVoYDzMwMTMwOTAyMDkyNDE5WjBdMQswCQYDVQQGEwJDTjEOMAwGA1UECBMFTXln\n                    |b2QxDjAMBgNVBAcTBU15Z29kMQ4wDAYDVQQKEwVNeWdvZDEOMAwGA1UECxMFTXln\n                    |b2QxDjAMBgNVBAMTBU15Z29kMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC\n                    |AQEAjm5ikHoP3w6zavvZU5bRo6Birz41JL/nZidpdww21q/G9APA+IiJMUeeocy0\n                    |L7/QY8MQZABVwNq79LXYWJBcmmFXM9xBPgDqQP4uh9JsvazCI9bvDiMn92mz9HiS\n                    |Sg9V4KGg0AcY0r230KIFo7hz+2QBp1gwAAE97myBfA3pi3IzJM2kWsh4LWkKQMfL\n                    |M6KDhpb4mdDQnHlgi4JWe3SYbLtpB6whnTqjHaOzvyiLspx1tmrb0KVxssry9KoX\n                    |YQzl56scfE/QJX0jJ5qYmNAYRCb4PibMuNSGB2NObDabSOMAdT4JLueOcHZ/x9tw\n                    |agGQ9UdymVZYzf8uqc+29ppKdQIDAQABoyEwHzAdBgNVHQ4EFgQUBK4uJ0cqmnho\n                    |6I72VmOVQMvVCXowDQYJKoZIhvcNAQELBQADggEBABZQ3yNESQdgNJg+NRIcpF9l\n                    |YSKZvrBZ51gyrC7/2ZKMpRIyXruUOIrjuTR5eaONs1E4HI/uA3xG1eeW2pjPxDnO\n                    |zgM4t7EPH6QbzibihoHw1MAB/mzECzY8r11PBhDQlst0a2hp+zUNR8CLbpmPPqTY\n                    |RSo6EooQ7+NBejOXysqIF1q0BJs8Y5s/CaTOmgbL7uPCkzArB6SS/hzXgDk5gw6v\n                    |wkGeOtzcj1DlbUTvt1s5GlnwBTGUmkbLx+YUje+n+IBgMbohLUDYBtUHylRVgMsc\n                    |1WS67kDqeJiiQZvrxvyW6CZZ/MIGI+uAkkj3DqJpaZirkwPgvpcOIrjZy0uFvQM=\n                  \"\"\", Base64.DEFAULT)) +\n                Signature(Base64.decode( // @madeye\n                \"\"\"\n                    |MIICQzCCAaygAwIBAgIETV9OhjANBgkqhkiG9w0BAQUFADBmMQswCQYDVQQGEwJjbjERMA8GA1UE\n                    |CBMIU2hhbmdoYWkxDzANBgNVBAcTBlB1ZG9uZzEUMBIGA1UEChMLRnVkYW4gVW5pdi4xDDAKBgNV\n                    |BAsTA1BQSTEPMA0GA1UEAxMGTWF4IEx2MB4XDTExMDIxOTA1MDA1NFoXDTM2MDIxMzA1MDA1NFow\n                    |ZjELMAkGA1UEBhMCY24xETAPBgNVBAgTCFNoYW5naGFpMQ8wDQYDVQQHEwZQdWRvbmcxFDASBgNV\n                    |BAoTC0Z1ZGFuIFVuaXYuMQwwCgYDVQQLEwNQUEkxDzANBgNVBAMTBk1heCBMdjCBnzANBgkqhkiG\n                    |9w0BAQEFAAOBjQAwgYkCgYEAq6lA8LqdeEI+es9SDX85aIcx8LoL3cc//iRRi+2mFIWvzvZ+bLKr\n                    |4Wd0rhu/iU7OeMm2GvySFyw/GdMh1bqh5nNPLiRxAlZxpaZxLOdRcxuvh5Nc5yzjM+QBv8ECmuvu\n                    |AOvvT3UDmA0AMQjZqSCmxWIxc/cClZ/0DubreBo2st0CAwEAATANBgkqhkiG9w0BAQUFAAOBgQAQ\n                    |Iqonxpwk2ay+Dm5RhFfZyG9SatM/JNFx2OdErU16WzuK1ItotXGVJaxCZv3u/tTwM5aaMACGED5n\n                    |AvHaDGCWynY74oDAopM4liF/yLe1wmZDu6Zo/7fXrH+T03LBgj2fcIkUfN1AA4dvnBo8XWAm9VrI\n                    |1iNuLIssdhDz3IL9Yg==\n                  \"\"\", Base64.DEFAULT))\n    }\n\n    private var receiver: BroadcastReceiver? = null\n    private var cachedPlugins: PluginList? = null\n    fun fetchPlugins() = synchronized(this) {\n        if (receiver == null) receiver = app.listenForPackageChanges {\n            synchronized(this) {\n                receiver = null\n                cachedPlugins = null\n            }\n        }\n        if (cachedPlugins == null) cachedPlugins = PluginList()\n        cachedPlugins!!\n    }\n\n    private fun buildUri(id: String) = Uri.Builder()\n            .scheme(PluginContract.SCHEME)\n            .authority(PluginContract.AUTHORITY)\n            .path(\"/$id\")\n            .build()\n    fun buildIntent(id: String, action: String): Intent = Intent(action, buildUri(id))\n\n    data class InitResult(\n            val path: String,\n            val options: PluginOptions,\n            val isV2: Boolean = false,\n    )\n\n    // the following parts are meant to be used by :bg\n    @Throws(Throwable::class)\n    fun init(configuration: PluginConfiguration): InitResult? {\n        if (configuration.selected.isEmpty()) return null\n        var throwable: Throwable? = null\n\n        try {\n            val result = initNative(configuration)\n            if (result != null) return result\n        } catch (t: Throwable) {\n            if (throwable == null) throwable = t else Timber.w(t)\n        }\n\n        // add other plugin types here\n\n        throw throwable ?: PluginNotFoundException(configuration.selected)\n    }\n\n    private fun initNative(configuration: PluginConfiguration): InitResult? {\n        var flags = PackageManager.GET_META_DATA\n        if (Build.VERSION.SDK_INT >= 24) {\n            flags = flags or PackageManager.MATCH_DIRECT_BOOT_UNAWARE or PackageManager.MATCH_DIRECT_BOOT_AWARE\n        }\n        val providers = app.packageManager.queryIntentContentProviders(\n                Intent(PluginContract.ACTION_NATIVE_PLUGIN, buildUri(configuration.selected)), flags)\n                .filter { it.providerInfo.exported }\n        if (providers.isEmpty()) return null\n        if (providers.size > 1) {\n            val message = \"Conflicting plugins found from: ${providers.joinToString { it.providerInfo.packageName }}\"\n            Toast.makeText(app, message, Toast.LENGTH_LONG).show()\n            throw IllegalStateException(message)\n        }\n        val provider = providers.single().providerInfo\n        val options = configuration.getOptions { provider.loadString(PluginContract.METADATA_KEY_DEFAULT_CONFIG) }\n        val isV2 = (provider.applicationInfo.metaData?.getString(PluginContract.METADATA_KEY_VERSION)\n            ?.substringBefore('.')?.toIntOrNull() ?: 0) >= 2\n        var failure: Throwable? = null\n        try {\n            initNativeFaster(provider)?.also { return InitResult(it, options, isV2) }\n        } catch (t: Throwable) {\n            Timber.w(\"Initializing native plugin faster mode failed\")\n            failure = t\n        }\n\n        val uri = Uri.Builder().apply {\n            scheme(ContentResolver.SCHEME_CONTENT)\n            authority(provider.authority)\n        }.build()\n        try {\n            return initNativeFast(app.contentResolver, options, uri)?.let { InitResult(it, options, isV2) }\n        } catch (t: Throwable) {\n            Timber.w(\"Initializing native plugin fast mode failed\")\n            failure?.also { t.addSuppressed(it) }\n            failure = t\n        }\n\n        try {\n            return initNativeSlow(app.contentResolver, options, uri)?.let { InitResult(it, options, isV2) }\n        } catch (t: Throwable) {\n            failure?.also { t.addSuppressed(it) }\n            throw t\n        }\n    }\n\n    private fun initNativeFaster(provider: ProviderInfo): String? {\n        return provider.loadString(PluginContract.METADATA_KEY_EXECUTABLE_PATH)?.let { relativePath ->\n            File(provider.applicationInfo.nativeLibraryDir).resolve(relativePath).apply {\n                check(canExecute())\n            }.absolutePath\n        }\n    }\n\n    private fun initNativeFast(cr: ContentResolver, options: PluginOptions, uri: Uri): String? {\n        return cr.call(uri, PluginContract.METHOD_GET_EXECUTABLE, null,\n                bundleOf(PluginContract.EXTRA_OPTIONS to options.id))?.getString(PluginContract.EXTRA_ENTRY)?.also {\n            check(File(it).canExecute())\n        }\n    }\n\n    @SuppressLint(\"Recycle\")\n    private fun initNativeSlow(cr: ContentResolver, options: PluginOptions, uri: Uri): String? {\n        var initialized = false\n        fun entryNotFound(): Nothing = throw IndexOutOfBoundsException(\"Plugin entry binary not found\")\n        val pluginDir = File(Core.deviceStorage.noBackupFilesDir, \"plugin\")\n        (cr.query(uri, arrayOf(PluginContract.COLUMN_PATH, PluginContract.COLUMN_MODE), null, null, null)\n                ?: return null).use { cursor ->\n            if (!cursor.moveToFirst()) entryNotFound()\n            pluginDir.deleteRecursively()\n            if (!pluginDir.mkdirs()) throw FileNotFoundException(\"Unable to create plugin directory\")\n            val pluginDirPath = pluginDir.absolutePath + '/'\n            do {\n                val path = cursor.getString(0)\n                val file = File(pluginDir, path)\n                check(file.absolutePath.startsWith(pluginDirPath))\n                cr.openInputStream(uri.buildUpon().path(path).build())!!.use { inStream ->\n                    file.outputStream().use { outStream -> inStream.copyTo(outStream) }\n                }\n                Os.chmod(file.absolutePath, when (cursor.getType(1)) {\n                    Cursor.FIELD_TYPE_INTEGER -> cursor.getInt(1)\n                    Cursor.FIELD_TYPE_STRING -> cursor.getString(1).toInt(8)\n                    else -> throw IllegalArgumentException(\"File mode should be of type int\")\n                })\n                if (path == options.id) initialized = true\n            } while (cursor.moveToNext())\n        }\n        if (!initialized) entryNotFound()\n        return File(pluginDir, options.id).absolutePath\n    }\n\n    fun ComponentInfo.loadString(key: String) = when (val value = metaData.get(key)) {\n        is String -> value\n        is Int -> app.packageManager.getResourcesForApplication(applicationInfo).getString(value)\n        null -> null\n        else -> error(\"meta-data $key has invalid type ${value.javaClass}\")\n    }\n}\n"
  },
  {
    "path": "core/src/main/java/com/github/shadowsocks/plugin/ResolvedPlugin.kt",
    "content": "/*******************************************************************************\n *                                                                             *\n *  Copyright (C) 2017 by Max Lv <max.c.lv@gmail.com>                          *\n *  Copyright (C) 2017 by Mygod Studio <contact-shadowsocks-android@mygod.be>  *\n *                                                                             *\n *  This program is free software: you can redistribute it and/or modify       *\n *  it under the terms of the GNU General Public License as published by       *\n *  the Free Software Foundation, either version 3 of the License, or          *\n *  (at your option) any later version.                                        *\n *                                                                             *\n *  This program is distributed in the hope that it will be useful,            *\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of             *\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the              *\n *  GNU General Public License for more details.                               *\n *                                                                             *\n *  You should have received a copy of the GNU General Public License          *\n *  along with this program. If not, see <http://www.gnu.org/licenses/>.       *\n *                                                                             *\n *******************************************************************************/\n\npackage com.github.shadowsocks.plugin\n\nimport android.content.pm.ComponentInfo\nimport android.content.pm.ResolveInfo\nimport android.graphics.drawable.Drawable\nimport android.os.Build\nimport com.github.shadowsocks.Core\nimport com.github.shadowsocks.Core.app\nimport com.github.shadowsocks.plugin.PluginManager.loadString\nimport com.github.shadowsocks.utils.signaturesCompat\n\nabstract class ResolvedPlugin(protected val resolveInfo: ResolveInfo) : Plugin() {\n    protected abstract val componentInfo: ComponentInfo\n\n    override val id by lazy { componentInfo.loadString(PluginContract.METADATA_KEY_ID)!! }\n    override val idAliases: Array<String> by lazy {\n        when (val value = componentInfo.metaData.get(PluginContract.METADATA_KEY_ID_ALIASES)) {\n            is String -> arrayOf(value)\n            is Int -> app.packageManager.getResourcesForApplication(componentInfo.applicationInfo).run {\n                when (getResourceTypeName(value)) {\n                    \"string\" -> arrayOf(getString(value))\n                    else -> getStringArray(value)\n                }\n            }\n            null -> emptyArray()\n            else -> error(\"unknown type for plugin meta-data idAliases\")\n        }\n    }\n    override val label: CharSequence get() = resolveInfo.loadLabel(app.packageManager)\n    override val icon: Drawable get() = resolveInfo.loadIcon(app.packageManager)\n    override val defaultConfig by lazy { componentInfo.loadString(PluginContract.METADATA_KEY_DEFAULT_CONFIG) }\n    override val packageName: String get() = componentInfo.packageName\n    override val trusted by lazy {\n        Core.getPackageInfo(packageName).signaturesCompat?.any(PluginManager.trustedSignatures::contains) == true\n    }\n    override val directBootAware get() = Build.VERSION.SDK_INT < 24 || componentInfo.directBootAware\n}\n"
  },
  {
    "path": "core/src/main/java/com/github/shadowsocks/preference/DataStore.kt",
    "content": "/*******************************************************************************\n *                                                                             *\n *  Copyright (C) 2017 by Max Lv <max.c.lv@gmail.com>                          *\n *  Copyright (C) 2017 by Mygod Studio <contact-shadowsocks-android@mygod.be>  *\n *                                                                             *\n *  This program is free software: you can redistribute it and/or modify       *\n *  it under the terms of the GNU General Public License as published by       *\n *  the Free Software Foundation, either version 3 of the License, or          *\n *  (at your option) any later version.                                        *\n *                                                                             *\n *  This program is distributed in the hope that it will be useful,            *\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of             *\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the              *\n *  GNU General Public License for more details.                               *\n *                                                                             *\n *  You should have received a copy of the GNU General Public License          *\n *  along with this program. If not, see <http://www.gnu.org/licenses/>.       *\n *                                                                             *\n *******************************************************************************/\n\npackage com.github.shadowsocks.preference\n\nimport android.os.Binder\nimport androidx.preference.PreferenceDataStore\nimport com.github.shadowsocks.BootReceiver\nimport com.github.shadowsocks.Core\nimport com.github.shadowsocks.database.PrivateDatabase\nimport com.github.shadowsocks.database.PublicDatabase\nimport com.github.shadowsocks.utils.DirectBoot\nimport com.github.shadowsocks.utils.Key\nimport com.github.shadowsocks.utils.parsePort\nimport java.net.InetSocketAddress\nimport java.net.Proxy\n\nobject DataStore : OnPreferenceDataStoreChangeListener {\n    val publicStore = RoomPreferenceDataStore(PublicDatabase.kvPairDao)\n    // privateStore will only be used as temp storage for ProfileConfigFragment\n    val privateStore = RoomPreferenceDataStore(PrivateDatabase.kvPairDao)\n\n    init {\n        publicStore.registerChangeListener(this)\n    }\n\n    override fun onPreferenceDataStoreChanged(store: PreferenceDataStore, key: String) {\n        when (key) {\n            Key.id -> if (directBootAware) DirectBoot.update()\n        }\n    }\n\n    // hopefully hashCode = mHandle doesn't change, currently this is true from KitKat to Nougat\n    private val userIndex by lazy { Binder.getCallingUserHandle().hashCode() }\n    private fun getLocalPort(key: String, default: Int): Int {\n        val value = publicStore.getInt(key)\n        return if (value != null) {\n            publicStore.putString(key, value.toString())\n            value\n        } else parsePort(publicStore.getString(key), default + userIndex)\n    }\n\n    var profileId: Long\n        get() = publicStore.getLong(Key.id) ?: 0\n        set(value) = publicStore.putLong(Key.id, value)\n    val persistAcrossReboot get() = publicStore.getBoolean(Key.persistAcrossReboot)\n            ?: BootReceiver.enabled.also { publicStore.putBoolean(Key.persistAcrossReboot, it) }\n    val canToggleLocked: Boolean get() = publicStore.getBoolean(Key.directBootAware) == true\n    val directBootAware: Boolean get() = Core.directBootSupported && canToggleLocked\n    val serviceMode get() = publicStore.getString(Key.serviceMode) ?: Key.modeVpn\n    val listenAddress get() = if (publicStore.getBoolean(Key.shareOverLan, false)) \"0.0.0.0\" else \"127.0.0.1\"\n    var portProxy: Int\n        get() = getLocalPort(Key.portProxy, 1080)\n        set(value) = publicStore.putString(Key.portProxy, value.toString())\n    val proxy get() = Proxy(Proxy.Type.SOCKS, InetSocketAddress(\"127.0.0.1\", portProxy))\n    var portLocalDns: Int\n        get() = getLocalPort(Key.portLocalDns, 5450)\n        set(value) = publicStore.putString(Key.portLocalDns, value.toString())\n    var portTransproxy: Int\n        get() = getLocalPort(Key.portTransproxy, 8200)\n        set(value) = publicStore.putString(Key.portTransproxy, value.toString())\n\n    /**\n     * Initialize settings that have complicated default values.\n     */\n    fun initGlobal() {\n        persistAcrossReboot\n        if (publicStore.getString(Key.portProxy) == null) portProxy = portProxy\n        if (publicStore.getString(Key.portLocalDns) == null) portLocalDns = portLocalDns\n        if (publicStore.getString(Key.portTransproxy) == null) portTransproxy = portTransproxy\n    }\n\n    var editingId: Long?\n        get() = privateStore.getLong(Key.id)\n        set(value) = privateStore.putLong(Key.id, value)\n    var proxyApps: Boolean\n        get() = privateStore.getBoolean(Key.proxyApps) ?: false\n        set(value) = privateStore.putBoolean(Key.proxyApps, value)\n    var bypass: Boolean\n        get() = privateStore.getBoolean(Key.bypass) ?: false\n        set(value) = privateStore.putBoolean(Key.bypass, value)\n    var individual: String\n        get() = privateStore.getString(Key.individual) ?: \"\"\n        set(value) = privateStore.putString(Key.individual, value)\n    var plugin: String\n        get() = privateStore.getString(Key.plugin) ?: \"\"\n        set(value) = privateStore.putString(Key.plugin, value)\n    var udpFallback: Long?\n        get() = privateStore.getLong(Key.udpFallback)\n        set(value) = privateStore.putLong(Key.udpFallback, value)\n    var dirty: Boolean\n        get() = privateStore.getBoolean(Key.dirty) ?: false\n        set(value) = privateStore.putBoolean(Key.dirty, value)\n}\n"
  },
  {
    "path": "core/src/main/java/com/github/shadowsocks/preference/EditTextPreferenceModifiers.kt",
    "content": "/*******************************************************************************\n *                                                                             *\n *  Copyright (C) 2019 by Max Lv <max.c.lv@gmail.com>                          *\n *  Copyright (C) 2019 by Mygod Studio <contact-shadowsocks-android@mygod.be>  *\n *                                                                             *\n *  This program is free software: you can redistribute it and/or modify       *\n *  it under the terms of the GNU General Public License as published by       *\n *  the Free Software Foundation, either version 3 of the License, or          *\n *  (at your option) any later version.                                        *\n *                                                                             *\n *  This program is distributed in the hope that it will be useful,            *\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of             *\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the              *\n *  GNU General Public License for more details.                               *\n *                                                                             *\n *  You should have received a copy of the GNU General Public License          *\n *  along with this program. If not, see <http://www.gnu.org/licenses/>.       *\n *                                                                             *\n *******************************************************************************/\n\npackage com.github.shadowsocks.preference\n\nimport android.graphics.Typeface\nimport android.text.InputFilter\nimport android.view.inputmethod.EditorInfo\nimport android.widget.EditText\nimport androidx.preference.EditTextPreference\n\nobject EditTextPreferenceModifiers {\n    object Monospace : EditTextPreference.OnBindEditTextListener {\n        override fun onBindEditText(editText: EditText) {\n            editText.typeface = Typeface.MONOSPACE\n        }\n    }\n\n    object Port : EditTextPreference.OnBindEditTextListener {\n        private val portLengthFilter = arrayOf(InputFilter.LengthFilter(5))\n\n        override fun onBindEditText(editText: EditText) {\n            editText.inputType = EditorInfo.TYPE_CLASS_NUMBER\n            editText.filters = portLengthFilter\n            editText.setSingleLine()\n            editText.setSelection(editText.text.length)\n        }\n    }\n}\n"
  },
  {
    "path": "core/src/main/java/com/github/shadowsocks/preference/OnPreferenceDataStoreChangeListener.kt",
    "content": "/*******************************************************************************\n *                                                                             *\n *  Copyright (C) 2017 by Max Lv <max.c.lv@gmail.com>                          *\n *  Copyright (C) 2017 by Mygod Studio <contact-shadowsocks-android@mygod.be>  *\n *                                                                             *\n *  This program is free software: you can redistribute it and/or modify       *\n *  it under the terms of the GNU General Public License as published by       *\n *  the Free Software Foundation, either version 3 of the License, or          *\n *  (at your option) any later version.                                        *\n *                                                                             *\n *  This program is distributed in the hope that it will be useful,            *\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of             *\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the              *\n *  GNU General Public License for more details.                               *\n *                                                                             *\n *  You should have received a copy of the GNU General Public License          *\n *  along with this program. If not, see <http://www.gnu.org/licenses/>.       *\n *                                                                             *\n *******************************************************************************/\n\npackage com.github.shadowsocks.preference\n\nimport androidx.preference.PreferenceDataStore\n\ninterface OnPreferenceDataStoreChangeListener {\n    fun onPreferenceDataStoreChanged(store: PreferenceDataStore, key: String)\n}\n"
  },
  {
    "path": "core/src/main/java/com/github/shadowsocks/preference/RoomPreferenceDataStore.kt",
    "content": "/*******************************************************************************\n *                                                                             *\n *  Copyright (C) 2017 by Max Lv <max.c.lv@gmail.com>                          *\n *  Copyright (C) 2017 by Mygod Studio <contact-shadowsocks-android@mygod.be>  *\n *                                                                             *\n *  This program is free software: you can redistribute it and/or modify       *\n *  it under the terms of the GNU General Public License as published by       *\n *  the Free Software Foundation, either version 3 of the License, or          *\n *  (at your option) any later version.                                        *\n *                                                                             *\n *  This program is distributed in the hope that it will be useful,            *\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of             *\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the              *\n *  GNU General Public License for more details.                               *\n *                                                                             *\n *  You should have received a copy of the GNU General Public License          *\n *  along with this program. If not, see <http://www.gnu.org/licenses/>.       *\n *                                                                             *\n *******************************************************************************/\n\npackage com.github.shadowsocks.preference\n\nimport androidx.preference.PreferenceDataStore\nimport com.github.shadowsocks.database.KeyValuePair\nimport java.util.HashSet\n\n@Suppress(\"MemberVisibilityCanBePrivate\", \"unused\")\nopen class RoomPreferenceDataStore(private val kvPairDao: KeyValuePair.Dao) : PreferenceDataStore() {\n    fun getBoolean(key: String) = kvPairDao[key]?.boolean\n    fun getFloat(key: String) = kvPairDao[key]?.float\n    fun getInt(key: String) = kvPairDao[key]?.long?.toInt()\n    fun getLong(key: String) = kvPairDao[key]?.long\n    fun getString(key: String) = kvPairDao[key]?.string\n    fun getStringSet(key: String) = kvPairDao[key]?.stringSet\n\n    override fun getBoolean(key: String, defValue: Boolean) = getBoolean(key) ?: defValue\n    override fun getFloat(key: String, defValue: Float) = getFloat(key) ?: defValue\n    override fun getInt(key: String, defValue: Int) = getInt(key) ?: defValue\n    override fun getLong(key: String, defValue: Long) = getLong(key) ?: defValue\n    override fun getString(key: String, defValue: String?) = getString(key) ?: defValue\n    override fun getStringSet(key: String, defValue: MutableSet<String>?) = getStringSet(key) ?: defValue\n\n    fun putBoolean(key: String, value: Boolean?) = if (value == null) remove(key) else putBoolean(key, value)\n    fun putFloat(key: String, value: Float?) = if (value == null) remove(key) else putFloat(key, value)\n    fun putInt(key: String, value: Int?) = if (value == null) remove(key) else putLong(key, value.toLong())\n    fun putLong(key: String, value: Long?) = if (value == null) remove(key) else putLong(key, value)\n    override fun putBoolean(key: String, value: Boolean) {\n        kvPairDao.put(KeyValuePair(key).put(value))\n        fireChangeListener(key)\n    }\n    override fun putFloat(key: String, value: Float) {\n        kvPairDao.put(KeyValuePair(key).put(value))\n        fireChangeListener(key)\n    }\n    override fun putInt(key: String, value: Int) {\n        kvPairDao.put(KeyValuePair(key).put(value.toLong()))\n        fireChangeListener(key)\n    }\n    override fun putLong(key: String, value: Long) {\n        kvPairDao.put(KeyValuePair(key).put(value))\n        fireChangeListener(key)\n    }\n    override fun putString(key: String, value: String?) = if (value == null) remove(key) else {\n        kvPairDao.put(KeyValuePair(key).put(value))\n        fireChangeListener(key)\n    }\n    override fun putStringSet(key: String, values: MutableSet<String>?) = if (values == null) remove(key) else {\n        kvPairDao.put(KeyValuePair(key).put(values))\n        fireChangeListener(key)\n    }\n\n    fun remove(key: String) {\n        kvPairDao.delete(key)\n        fireChangeListener(key)\n    }\n\n    private val listeners = HashSet<OnPreferenceDataStoreChangeListener>()\n    private fun fireChangeListener(key: String) = listeners.forEach { it.onPreferenceDataStoreChanged(this, key) }\n    fun registerChangeListener(listener: OnPreferenceDataStoreChangeListener) = listeners.add(listener)\n    fun unregisterChangeListener(listener: OnPreferenceDataStoreChangeListener) = listeners.remove(listener)\n}\n"
  },
  {
    "path": "core/src/main/java/com/github/shadowsocks/subscription/Subscription.kt",
    "content": "/*******************************************************************************\n *                                                                             *\n *  Copyright (C) 2020 by Max Lv <max.c.lv@gmail.com>                          *\n *  Copyright (C) 2020 by Mygod Studio <contact-shadowsocks-android@mygod.be>  *\n *                                                                             *\n *  This program is free software: you can redistribute it and/or modify       *\n *  it under the terms of the GNU General Public License as published by       *\n *  the Free Software Foundation, either version 3 of the License, or          *\n *  (at your option) any later version.                                        *\n *                                                                             *\n *  This program is distributed in the hope that it will be useful,            *\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of             *\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the              *\n *  GNU General Public License for more details.                               *\n *                                                                             *\n *  You should have received a copy of the GNU General Public License          *\n *  along with this program. If not, see <http://www.gnu.org/licenses/>.       *\n *                                                                             *\n *******************************************************************************/\n\npackage com.github.shadowsocks.subscription\n\nimport androidx.recyclerview.widget.SortedList\nimport com.github.shadowsocks.preference.DataStore\nimport com.github.shadowsocks.utils.URLSorter\nimport com.github.shadowsocks.utils.asIterable\nimport java.io.Reader\nimport java.net.URL\n\nclass Subscription {\n    companion object {\n        private const val SUBSCRIPTION = \"subscription\"\n\n        var instance: Subscription\n            get() {\n                val sub = Subscription()\n                val str = DataStore.publicStore.getString(SUBSCRIPTION)\n                if (str != null) sub.fromReader(str.reader())\n                return sub\n            }\n            set(value) = DataStore.publicStore.putString(SUBSCRIPTION, value.toString())\n    }\n\n    val urls = SortedList(URL::class.java, URLSorter)\n\n    fun fromReader(reader: Reader): Subscription {\n        urls.clear()\n        reader.useLines {\n            for (line in it) try {\n                urls.add(URL(line))\n            } catch (_: Exception) { }\n        }\n        return this\n    }\n\n    override fun toString(): String {\n        val result = StringBuilder()\n        result.append(urls.asIterable().joinToString(\"\\n\"))\n        return result.toString()\n    }\n}\n"
  },
  {
    "path": "core/src/main/java/com/github/shadowsocks/subscription/SubscriptionService.kt",
    "content": "/*******************************************************************************\n *                                                                             *\n *  Copyright (C) 2020 by Max Lv <max.c.lv@gmail.com>                          *\n *  Copyright (C) 2020 by Mygod Studio <contact-shadowsocks-android@mygod.be>  *\n *                                                                             *\n *  This program is free software: you can redistribute it and/or modify       *\n *  it under the terms of the GNU General Public License as published by       *\n *  the Free Software Foundation, either version 3 of the License, or          *\n *  (at your option) any later version.                                        *\n *                                                                             *\n *  This program is distributed in the hope that it will be useful,            *\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of             *\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the              *\n *  GNU General Public License for more details.                               *\n *                                                                             *\n *  You should have received a copy of the GNU General Public License          *\n *  along with this program. If not, see <http://www.gnu.org/licenses/>.       *\n *                                                                             *\n *******************************************************************************/\n\npackage com.github.shadowsocks.subscription\n\nimport android.app.NotificationChannel\nimport android.app.NotificationManager\nimport android.app.PendingIntent\nimport android.app.Service\nimport android.content.Intent\nimport android.content.IntentFilter\nimport android.os.IBinder\nimport android.widget.Toast\nimport androidx.annotation.RequiresApi\nimport androidx.core.app.NotificationCompat\nimport androidx.core.content.ContextCompat\nimport androidx.lifecycle.MutableLiveData\nimport com.github.shadowsocks.Core\nimport com.github.shadowsocks.Core.app\nimport com.github.shadowsocks.core.R\nimport com.github.shadowsocks.database.Profile\nimport com.github.shadowsocks.database.ProfileManager\nimport com.github.shadowsocks.preference.DataStore\nimport com.github.shadowsocks.utils.Action\nimport com.github.shadowsocks.utils.asIterable\nimport com.github.shadowsocks.utils.broadcastReceiver\nimport com.github.shadowsocks.utils.readableMessage\nimport com.github.shadowsocks.utils.useCancellable\nimport kotlinx.coroutines.CoroutineExceptionHandler\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.GlobalScope\nimport kotlinx.coroutines.Job\nimport kotlinx.coroutines.SupervisorJob\nimport kotlinx.coroutines.async\nimport kotlinx.coroutines.awaitAll\nimport kotlinx.coroutines.cancel\nimport kotlinx.coroutines.launch\nimport kotlinx.coroutines.withContext\nimport timber.log.Timber\nimport java.io.File\nimport java.io.InputStream\nimport java.net.HttpURLConnection\nimport java.net.URL\n\nclass SubscriptionService : Service(), CoroutineScope {\n    companion object {\n        private const val NOTIFICATION_CHANNEL = \"service-subscription\"\n        private const val NOTIFICATION_ID = 2\n\n        val idle = MutableLiveData(true)\n\n        val notificationChannel @RequiresApi(26) get() = NotificationChannel(NOTIFICATION_CHANNEL,\n                app.getText(R.string.service_subscription), NotificationManager.IMPORTANCE_LOW)\n    }\n\n    override val coroutineContext = SupervisorJob() + CoroutineExceptionHandler { _, t -> Timber.w(t) }\n    private var worker: Job? = null\n    private val cancelReceiver = broadcastReceiver { _, _ -> worker?.cancel() }\n    private var counter = 0\n    private var receiverRegistered = false\n\n    override fun onBind(intent: Intent?): IBinder? = null\n\n    override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {\n        if (worker == null) {\n            idle.value = false\n            if (!receiverRegistered) {\n                ContextCompat.registerReceiver(this, cancelReceiver, IntentFilter(Action.ABORT),\n                    ContextCompat.RECEIVER_NOT_EXPORTED)\n                receiverRegistered = true\n            }\n            worker = launch {\n                val urls = Subscription.instance.urls\n                val notification = NotificationCompat.Builder(this@SubscriptionService, NOTIFICATION_CHANNEL).apply {\n                    color = ContextCompat.getColor(this@SubscriptionService, R.color.material_primary_500)\n                    priority = NotificationCompat.PRIORITY_LOW\n                    addAction(NotificationCompat.Action.Builder(\n                            R.drawable.ic_navigation_close,\n                            getText(R.string.stop),\n                            PendingIntent.getBroadcast(this@SubscriptionService, 0,\n                                    Intent(Action.ABORT).setPackage(packageName), PendingIntent.FLAG_IMMUTABLE)).apply {\n                        setShowsUserInterface(false)\n                    }.build())\n                    setCategory(NotificationCompat.CATEGORY_PROGRESS)\n                    setContentTitle(getString(R.string.service_subscription_working, 0, urls.size()))\n                    setOngoing(true)\n                    setProgress(urls.size(), 0, false)\n                    setSmallIcon(R.drawable.ic_file_cloud_download)\n                    setWhen(0)\n                }\n                Core.notification.notify(NOTIFICATION_ID, notification.build())\n                counter = 0\n                val workers = urls.asIterable().map { url -> fetchJsonAsync(url, urls.size(), notification) }\n                try {\n                    val localJsons = workers.awaitAll()\n                    withContext(Dispatchers.Main) {\n                        Core.notification.notify(NOTIFICATION_ID, notification.apply {\n                            setContentTitle(getText(R.string.service_subscription_finishing))\n                            setProgress(0, 0, true)\n                        }.build())\n                        createProfilesFromSubscription(localJsons.asSequence().filterNotNull().map { it.inputStream() })\n                    }\n                } finally {\n                    for (worker in workers) {\n                        worker.cancel()\n                        try {\n                            worker.getCompleted()?.apply { if (!delete()) deleteOnExit() }\n                        } catch (_: Exception) { }\n                    }\n                    GlobalScope.launch(Dispatchers.Main) {\n                        Core.notification.cancel(NOTIFICATION_ID)\n                        idle.value = true\n                    }\n                    check(worker != null)\n                    worker = null\n                    stopSelf(startId)\n                }\n            }\n        } else stopSelf(startId)\n        return START_NOT_STICKY\n    }\n\n    private fun fetchJsonAsync(url: URL, max: Int, notification: NotificationCompat.Builder) = async(Dispatchers.IO) {\n        val tempFile = File.createTempFile(\"subscription-\", \".json\", cacheDir)\n        try {\n            (url.openConnection() as HttpURLConnection).useCancellable {\n                tempFile.outputStream().use { out -> inputStream.copyTo(out) }\n            }\n            tempFile\n        } catch (e: Exception) {\n            Timber.d(e)\n            launch(Dispatchers.Main) {\n                Toast.makeText(this@SubscriptionService, e.readableMessage, Toast.LENGTH_LONG).show()\n            }\n            if (!tempFile.delete()) tempFile.deleteOnExit()\n            null\n        } finally {\n            withContext(Dispatchers.Main) {\n                counter += 1\n                Core.notification.notify(NOTIFICATION_ID, notification.apply {\n                    setContentTitle(getString(R.string.service_subscription_working, counter, max))\n                    setProgress(max, counter, false)\n                }.build())\n            }\n        }\n    }\n\n    private fun createProfilesFromSubscription(jsons: Sequence<InputStream>) {\n        val currentId = DataStore.profileId\n        val profiles = ProfileManager.getAllProfiles()\n        val subscriptions = mutableMapOf<Pair<String?, String>, Profile>()\n        val toUpdate = mutableSetOf<Long>()\n        var feature: Profile? = null\n        profiles?.forEach { profile ->  // preprocessing phase\n            if (currentId == profile.id) feature = profile\n            if (profile.subscription == Profile.SubscriptionStatus.UserConfigured) return@forEach\n            if (subscriptions.putIfAbsent(profile.name to profile.formattedAddress, profile) != null) {\n                ProfileManager.delProfile(profile.id)\n                if (currentId == profile.id) DataStore.profileId = 0\n            } else if (profile.subscription == Profile.SubscriptionStatus.Active) {\n                toUpdate.add(profile.id)\n                profile.subscription = Profile.SubscriptionStatus.Obsolete\n            }\n        }\n\n        for (json in jsons.asIterable()) try {\n            Profile.parseJson(json.bufferedReader().readText(), feature) {\n                subscriptions.compute(it.name to it.formattedAddress) { _, oldProfile ->\n                    when (oldProfile?.subscription) {\n                        Profile.SubscriptionStatus.Active -> {\n                            Timber.w(\"Duplicate profiles detected. Please use different profile names and/or \" +\n                                    \"address:port for better subscription support.\")\n                            oldProfile\n                        }\n                        Profile.SubscriptionStatus.Obsolete -> {\n                            toUpdate.add(oldProfile.id)\n                            oldProfile.password = it.password\n                            oldProfile.method = it.method\n                            oldProfile.plugin = it.plugin\n                            oldProfile.udpFallback = it.udpFallback\n                            oldProfile.subscription = Profile.SubscriptionStatus.Active\n                            oldProfile\n                        }\n                        else -> ProfileManager.createProfile(it.apply {\n                            subscription = Profile.SubscriptionStatus.Active\n                        })\n                    }\n                }!!\n            }\n        } catch (e: Exception) {\n            Timber.d(e)\n            Toast.makeText(this, e.readableMessage, Toast.LENGTH_LONG).show()\n        }\n\n        profiles?.forEach { profile -> if (toUpdate.contains(profile.id)) ProfileManager.updateProfile(profile) }\n        ProfileManager.listener?.reloadProfiles()\n    }\n\n    override fun onDestroy() {\n        cancel()\n        if (receiverRegistered) unregisterReceiver(cancelReceiver)\n        super.onDestroy()\n    }\n}\n"
  },
  {
    "path": "core/src/main/java/com/github/shadowsocks/utils/ActivityResultContracts.kt",
    "content": "/*******************************************************************************\n *                                                                             *\n *  Copyright (C) 2020 by Max Lv <max.c.lv@gmail.com>                          *\n *  Copyright (C) 2020 by Mygod Studio <contact-shadowsocks-android@mygod.be>  *\n *                                                                             *\n *  This program is free software: you can redistribute it and/or modify       *\n *  it under the terms of the GNU General Public License as published by       *\n *  the Free Software Foundation, either version 3 of the License, or          *\n *  (at your option) any later version.                                        *\n *                                                                             *\n *  This program is distributed in the hope that it will be useful,            *\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of             *\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the              *\n *  GNU General Public License for more details.                               *\n *                                                                             *\n *  You should have received a copy of the GNU General Public License          *\n *  along with this program. If not, see <http://www.gnu.org/licenses/>.       *\n *                                                                             *\n *******************************************************************************/\n\npackage com.github.shadowsocks.utils\n\nimport android.app.Activity\nimport android.content.Context\nimport android.content.Intent\nimport android.net.VpnService\nimport androidx.activity.result.contract.ActivityResultContract\nimport androidx.activity.result.contract.ActivityResultContracts\nimport com.github.shadowsocks.Core\nimport com.github.shadowsocks.preference.DataStore\nimport timber.log.Timber\n\nprivate val jsonMimeTypes = arrayOf(\"application/*\", \"text/*\")\n\nobject OpenJson : ActivityResultContracts.GetMultipleContents() {\n    override fun createIntent(context: Context, input: String) = super.createIntent(context,\n            jsonMimeTypes.first()).apply { putExtra(Intent.EXTRA_MIME_TYPES, jsonMimeTypes) }\n}\n\nobject SaveJson : ActivityResultContracts.CreateDocument(\"application/json\") {\n    override fun createIntent(context: Context, input: String) =\n            super.createIntent(context, \"profiles.json\")\n}\n\nclass StartService : ActivityResultContract<Void?, Boolean>() {\n    private var cachedIntent: Intent? = null\n\n    override fun getSynchronousResult(context: Context, input: Void?): SynchronousResult<Boolean>? {\n        if (DataStore.serviceMode == Key.modeVpn) VpnService.prepare(context)?.let { intent ->\n            cachedIntent = intent\n            return null\n        }\n        Core.startService()\n        return SynchronousResult(false)\n    }\n\n    override fun createIntent(context: Context, input: Void?) = cachedIntent!!.also { cachedIntent = null }\n\n    override fun parseResult(resultCode: Int, intent: Intent?) = if (resultCode == Activity.RESULT_OK) {\n        Core.startService()\n        false\n    } else {\n        Timber.e(\"Failed to start VpnService: $intent\")\n        true\n    }\n}\n"
  },
  {
    "path": "core/src/main/java/com/github/shadowsocks/utils/ArrayIterator.kt",
    "content": "/*******************************************************************************\n *                                                                             *\n *  Copyright (C) 2018 by Max Lv <max.c.lv@gmail.com>                          *\n *  Copyright (C) 2018 by Mygod Studio <contact-shadowsocks-android@mygod.be>  *\n *                                                                             *\n *  This program is free software: you can redistribute it and/or modify       *\n *  it under the terms of the GNU General Public License as published by       *\n *  the Free Software Foundation, either version 3 of the License, or          *\n *  (at your option) any later version.                                        *\n *                                                                             *\n *  This program is distributed in the hope that it will be useful,            *\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of             *\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the              *\n *  GNU General Public License for more details.                               *\n *                                                                             *\n *  You should have received a copy of the GNU General Public License          *\n *  along with this program. If not, see <http://www.gnu.org/licenses/>.       *\n *                                                                             *\n *******************************************************************************/\n\npackage com.github.shadowsocks.utils\n\nimport androidx.recyclerview.widget.SortedList\n\nprivate sealed class ArrayIterator<out T> : Iterator<T> {\n    abstract val size: Int\n    abstract operator fun get(index: Int): T\n    private var count = 0\n    override fun hasNext() = count < size\n    override fun next(): T = if (hasNext()) this[count++] else throw NoSuchElementException()\n}\n\nprivate class SortedListIterator<out T>(private val list: SortedList<T>) : ArrayIterator<T>() {\n    override val size get() = list.size()\n    override fun get(index: Int) = list[index]\n}\nfun <T> SortedList<T>.asIterable() = Iterable { SortedListIterator(this) }\n"
  },
  {
    "path": "core/src/main/java/com/github/shadowsocks/utils/Commandline.kt",
    "content": "/*******************************************************************************\n *                                                                             *\n *  Copyright (C) 2017 by Max Lv <max.c.lv@gmail.com>                          *\n *  Copyright (C) 2017 by Mygod Studio <contact-shadowsocks-android@mygod.be>  *\n *                                                                             *\n *  This program is free software: you can redistribute it and/or modify       *\n *  it under the terms of the GNU General Public License as published by       *\n *  the Free Software Foundation, either version 3 of the License, or          *\n *  (at your option) any later version.                                        *\n *                                                                             *\n *  This program is distributed in the hope that it will be useful,            *\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of             *\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the              *\n *  GNU General Public License for more details.                               *\n *                                                                             *\n *  You should have received a copy of the GNU General Public License          *\n *  along with this program. If not, see <http://www.gnu.org/licenses/>.       *\n *                                                                             *\n *******************************************************************************/\n\npackage com.github.shadowsocks.utils\n\nimport java.util.*\n\n/**\n * Commandline objects help handling command lines specifying processes to\n * execute.\n *\n * The class can be used to define a command line as nested elements or as a\n * helper to define a command line by an application.\n *\n *\n * `\n * <someelement><br></br>\n * &nbsp;&nbsp;<acommandline executable=\"/executable/to/run\"><br></br>\n * &nbsp;&nbsp;&nbsp;&nbsp;<argument value=\"argument 1\" /><br></br>\n * &nbsp;&nbsp;&nbsp;&nbsp;<argument line=\"argument_1 argument_2 argument_3\" /><br></br>\n * &nbsp;&nbsp;&nbsp;&nbsp;<argument value=\"argument 4\" /><br></br>\n * &nbsp;&nbsp;</acommandline><br></br>\n * </someelement><br></br>\n` *\n *\n * Based on: https://github.com/apache/ant/blob/588ce1f/src/main/org/apache/tools/ant/types/Commandline.java\n *\n * Adds support for escape character '\\'.\n */\nobject Commandline {\n\n    /**\n     * Quote the parts of the given array in way that makes them\n     * usable as command line arguments.\n     * @param args the list of arguments to quote.\n     * @return empty string for null or no command, else every argument split\n     * by spaces and quoted by quoting rules.\n     */\n    fun toString(args: Iterable<String>?): String {\n        // empty path return empty string\n        args ?: return \"\"\n        // path containing one or more elements\n        val result = StringBuilder()\n        for (arg in args) {\n            if (result.isNotEmpty()) result.append(' ')\n            arg.indices.map { arg[it] }.forEach {\n                when (it) {\n                    ' ', '\\\\', '\"', '\\'' -> {\n                        result.append('\\\\')  // intentionally no break\n                        result.append(it)\n                    }\n                    else -> result.append(it)\n                }\n            }\n        }\n        return result.toString()\n    }\n\n    /**\n     * Quote the parts of the given array in way that makes them\n     * usable as command line arguments.\n     * @param args the list of arguments to quote.\n     * @return empty string for null or no command, else every argument split\n     * by spaces and quoted by quoting rules.\n     */\n    fun toString(args: Array<String>) = toString(args.asIterable()) // thanks to Java, arrays aren't iterable\n\n    /**\n     * Crack a command line.\n     * @param toProcess the command line to process.\n     * @return the command line broken into strings.\n     * An empty or null toProcess parameter results in a zero sized array.\n     */\n    fun translateCommandline(toProcess: String?): Array<String> {\n        if (toProcess.isNullOrEmpty()) {\n            //no command? no string\n            return arrayOf()\n        }\n        // parse with a simple finite state machine\n\n        val normal = 0\n        val inQuote = 1\n        val inDoubleQuote = 2\n        var state = normal\n        val tok = StringTokenizer(toProcess, \"\\\\\\\"\\' \", true)\n        val result = ArrayList<String>()\n        val current = StringBuilder()\n        var lastTokenHasBeenQuoted = false\n        var lastTokenIsSlash = false\n\n        while (tok.hasMoreTokens()) {\n            val nextTok = tok.nextToken()\n            when (state) {\n                inQuote -> if (\"\\'\" == nextTok) {\n                    lastTokenHasBeenQuoted = true\n                    state = normal\n                } else current.append(nextTok)\n                inDoubleQuote -> when (nextTok) {\n                    \"\\\"\" -> if (lastTokenIsSlash) {\n                        current.append(nextTok)\n                        lastTokenIsSlash = false\n                    } else {\n                        lastTokenHasBeenQuoted = true\n                        state = normal\n                    }\n                    \"\\\\\" -> lastTokenIsSlash = if (lastTokenIsSlash) {\n                        current.append(nextTok)\n                        false\n                    } else true\n                    else -> {\n                        if (lastTokenIsSlash) {\n                            current.append(\"\\\\\")   // unescaped\n                            lastTokenIsSlash = false\n                        }\n                        current.append(nextTok)\n                    }\n                }\n                else -> {\n                    when {\n                        lastTokenIsSlash -> {\n                            current.append(nextTok)\n                            lastTokenIsSlash = false\n                        }\n                        \"\\\\\" == nextTok -> lastTokenIsSlash = true\n                        \"\\'\" == nextTok -> state = inQuote\n                        \"\\\"\" == nextTok -> state = inDoubleQuote\n                        \" \" == nextTok -> if (lastTokenHasBeenQuoted || current.isNotEmpty()) {\n                            result.add(current.toString())\n                            current.setLength(0)\n                        }\n                        else -> current.append(nextTok)\n                    }\n                    lastTokenHasBeenQuoted = false\n                }\n            }\n        }\n        if (lastTokenHasBeenQuoted || current.isNotEmpty()) result.add(current.toString())\n        require(state != inQuote && state != inDoubleQuote) { \"unbalanced quotes in $toProcess\" }\n        require(!lastTokenIsSlash) { \"escape character following nothing in $toProcess\" }\n        return result.toTypedArray()\n    }\n}\n"
  },
  {
    "path": "core/src/main/java/com/github/shadowsocks/utils/Constants.kt",
    "content": "/*******************************************************************************\n *                                                                             *\n *  Copyright (C) 2017 by Max Lv <max.c.lv@gmail.com>                          *\n *  Copyright (C) 2017 by Mygod Studio <contact-shadowsocks-android@mygod.be>  *\n *                                                                             *\n *  This program is free software: you can redistribute it and/or modify       *\n *  it under the terms of the GNU General Public License as published by       *\n *  the Free Software Foundation, either version 3 of the License, or          *\n *  (at your option) any later version.                                        *\n *                                                                             *\n *  This program is distributed in the hope that it will be useful,            *\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of             *\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the              *\n *  GNU General Public License for more details.                               *\n *                                                                             *\n *  You should have received a copy of the GNU General Public License          *\n *  along with this program. If not, see <http://www.gnu.org/licenses/>.       *\n *                                                                             *\n *******************************************************************************/\n\npackage com.github.shadowsocks.utils\n\nobject Key {\n    /**\n     * Public config that doesn't need to be kept secret.\n     */\n    const val DB_PUBLIC = \"config.db\"\n    const val DB_PROFILE = \"profile.db\"\n\n    const val id = \"profileId\"\n    const val name = \"profileName\"\n\n    const val individual = \"Proxyed\"\n\n    const val serviceMode = \"serviceMode\"\n    const val modeProxy = \"proxy\"\n    const val modeVpn = \"vpn\"\n    const val modeTransproxy = \"transproxy\"\n    const val shareOverLan = \"shareOverLan\"\n    const val portProxy = \"portProxy\"\n    const val portLocalDns = \"portLocalDns\"\n    const val portTransproxy = \"portTransproxy\"\n\n    const val route = \"route\"\n\n    const val persistAcrossReboot = \"isAutoConnect\"\n    const val directBootAware = \"directBootAware\"\n\n    const val proxyApps = \"isProxyApps\"\n    const val bypass = \"isBypassApps\"\n    const val udpdns = \"isUdpDns\"\n    const val ipv6 = \"isIpv6\"\n    const val metered = \"metered\"\n\n    const val host = \"proxy\"\n    const val password = \"sitekey\"\n    const val method = \"encMethod\"\n    const val remotePort = \"remotePortNum\"\n    const val remoteDns = \"remoteDns\"\n\n    const val plugin = \"plugin\"\n    const val pluginConfigure = \"plugin.configure\"\n    const val udpFallback = \"udpFallback\"\n\n    const val dirty = \"profileDirty\"\n\n    const val assetUpdateTime = \"assetUpdateTime\"\n\n    // TV specific values\n    const val controlStats = \"control.stats\"\n    const val controlImport = \"control.import\"\n    const val controlExport = \"control.export\"\n    const val about = \"about\"\n    const val aboutOss = \"about.ossLicenses\"\n}\n\nobject Action {\n    const val SERVICE = \"com.github.shadowsocks.SERVICE\"\n    const val CLOSE = \"com.github.shadowsocks.CLOSE\"\n    const val RELOAD = \"com.github.shadowsocks.RELOAD\"\n    const val ABORT = \"com.github.shadowsocks.ABORT\"\n\n    const val EXTRA_PROFILE_ID = \"com.github.shadowsocks.EXTRA_PROFILE_ID\"\n}\n"
  },
  {
    "path": "core/src/main/java/com/github/shadowsocks/utils/DeviceStorageApp.kt",
    "content": "/*******************************************************************************\n *                                                                             *\n *  Copyright (C) 2017 by Max Lv <max.c.lv@gmail.com>                          *\n *  Copyright (C) 2017 by Mygod Studio <contact-shadowsocks-android@mygod.be>  *\n *                                                                             *\n *  This program is free software: you can redistribute it and/or modify       *\n *  it under the terms of the GNU General Public License as published by       *\n *  the Free Software Foundation, either version 3 of the License, or          *\n *  (at your option) any later version.                                        *\n *                                                                             *\n *  This program is distributed in the hope that it will be useful,            *\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of             *\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the              *\n *  GNU General Public License for more details.                               *\n *                                                                             *\n *  You should have received a copy of the GNU General Public License          *\n *  along with this program. If not, see <http://www.gnu.org/licenses/>.       *\n *                                                                             *\n *******************************************************************************/\n\npackage com.github.shadowsocks.utils\n\nimport android.annotation.SuppressLint\nimport android.annotation.TargetApi\nimport android.app.Application\nimport android.content.ComponentCallbacks\nimport android.content.Context\nimport android.content.res.Configuration\n\n@SuppressLint(\"MissingSuperCall\", \"Registered\")\n@TargetApi(24)\nclass DeviceStorageApp(private val app: Application) : Application() {\n    init {\n        attachBaseContext(app.createDeviceProtectedStorageContext())\n    }\n\n    /**\n     * Thou shalt not get the REAL underlying application context which would no longer be operating under device\n     * protected storage.\n     */\n    override fun getApplicationContext(): Context = this\n\n    override fun onCreate() = app.onCreate()\n    override fun onTerminate() = app.onTerminate()\n    override fun onConfigurationChanged(newConfig: Configuration) = app.onConfigurationChanged(newConfig)\n    override fun onLowMemory() = app.onLowMemory()\n    override fun onTrimMemory(level: Int) = app.onTrimMemory(level)\n    override fun registerComponentCallbacks(callback: ComponentCallbacks?) = app.registerComponentCallbacks(callback)\n    override fun unregisterComponentCallbacks(callback: ComponentCallbacks?) =\n        app.unregisterComponentCallbacks(callback)\n    override fun registerActivityLifecycleCallbacks(callback: ActivityLifecycleCallbacks?) =\n        app.registerActivityLifecycleCallbacks(callback)\n    override fun unregisterActivityLifecycleCallbacks(callback: ActivityLifecycleCallbacks?) =\n        app.unregisterActivityLifecycleCallbacks(callback)\n    override fun registerOnProvideAssistDataListener(callback: OnProvideAssistDataListener?) =\n        app.registerOnProvideAssistDataListener(callback)\n    override fun unregisterOnProvideAssistDataListener(callback: OnProvideAssistDataListener?) =\n        app.unregisterOnProvideAssistDataListener(callback)\n}\n"
  },
  {
    "path": "core/src/main/java/com/github/shadowsocks/utils/DirectBoot.kt",
    "content": "package com.github.shadowsocks.utils\n\nimport android.annotation.TargetApi\nimport android.content.BroadcastReceiver\nimport android.content.Context\nimport android.content.Intent\nimport android.content.IntentFilter\nimport com.github.shadowsocks.Core\nimport com.github.shadowsocks.Core.app\nimport com.github.shadowsocks.bg.BaseService\nimport com.github.shadowsocks.database.Profile\nimport com.github.shadowsocks.database.ProfileManager\nimport com.github.shadowsocks.preference.DataStore\nimport java.io.File\nimport java.io.IOException\nimport java.io.ObjectInputStream\nimport java.io.ObjectOutputStream\n\n@TargetApi(24)\nobject DirectBoot : BroadcastReceiver() {\n    private val file = File(Core.deviceStorage.noBackupFilesDir, \"directBootProfile\")\n    private var registered = false\n\n    fun getDeviceProfile(): ProfileManager.ExpandedProfile? = try {\n        ObjectInputStream(file.inputStream()).use { it.readObject() as? ProfileManager.ExpandedProfile }\n    } catch (_: IOException) { null }\n\n    fun clean() {\n        file.delete()\n        File(Core.deviceStorage.noBackupFilesDir, BaseService.CONFIG_FILE).delete()\n        File(Core.deviceStorage.noBackupFilesDir, BaseService.CONFIG_FILE_UDP).delete()\n    }\n\n    /**\n     * app.currentProfile will call this.\n     */\n    fun update(profile: Profile? = ProfileManager.getProfile(DataStore.profileId)) =\n            if (profile == null) clean()\n            else ObjectOutputStream(file.outputStream()).use { it.writeObject(ProfileManager.expand(profile)) }\n\n    fun flushTrafficStats() {\n        getDeviceProfile()?.also { (profile, fallback) ->\n            if (profile.dirty) ProfileManager.updateProfile(profile)\n            if (fallback?.dirty == true) ProfileManager.updateProfile(fallback)\n        }\n        update()\n    }\n\n    fun listenForUnlock() {\n        if (registered) return\n        app.registerReceiver(this, IntentFilter(Intent.ACTION_BOOT_COMPLETED))\n        registered = true\n    }\n    override fun onReceive(context: Context, intent: Intent) {\n        flushTrafficStats()\n        app.unregisterReceiver(this)\n        registered = false\n    }\n}\n"
  },
  {
    "path": "core/src/main/java/com/github/shadowsocks/utils/Sorters.kt",
    "content": "/*******************************************************************************\n *                                                                             *\n *  Copyright (C) 2020 by Max Lv <max.c.lv@gmail.com>                          *\n *  Copyright (C) 2020 by Mygod Studio <contact-shadowsocks-android@mygod.be>  *\n *                                                                             *\n *  This program is free software: you can redistribute it and/or modify       *\n *  it under the terms of the GNU General Public License as published by       *\n *  the Free Software Foundation, either version 3 of the License, or          *\n *  (at your option) any later version.                                        *\n *                                                                             *\n *  This program is distributed in the hope that it will be useful,            *\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of             *\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the              *\n *  GNU General Public License for more details.                               *\n *                                                                             *\n *  You should have received a copy of the GNU General Public License          *\n *  along with this program. If not, see <http://www.gnu.org/licenses/>.       *\n *                                                                             *\n *******************************************************************************/\n\npackage com.github.shadowsocks.utils\n\nimport androidx.recyclerview.widget.SortedList\nimport java.net.URL\n\nabstract class BaseSorter<T> : SortedList.Callback<T>() {\n    override fun onInserted(position: Int, count: Int) { }\n    override fun areContentsTheSame(oldItem: T?, newItem: T?): Boolean = oldItem == newItem\n    override fun onMoved(fromPosition: Int, toPosition: Int) { }\n    override fun onChanged(position: Int, count: Int) { }\n    override fun onRemoved(position: Int, count: Int) { }\n    override fun areItemsTheSame(item1: T?, item2: T?): Boolean = item1 == item2\n    override fun compare(o1: T?, o2: T?): Int =\n            if (o1 == null) if (o2 == null) 0 else 1 else if (o2 == null) -1 else compareNonNull(o1, o2)\n    abstract fun compareNonNull(o1: T, o2: T): Int\n}\n\nobject URLSorter : BaseSorter<URL>() {\n    private val ordering = compareBy<URL>({ it.host }, { it.port }, { it.file }, { it.protocol })\n    override fun compareNonNull(o1: URL, o2: URL): Int = ordering.compare(o1, o2)\n}\n"
  },
  {
    "path": "core/src/main/java/com/github/shadowsocks/utils/Utils.kt",
    "content": "/*******************************************************************************\n *                                                                             *\n *  Copyright (C) 2018 by Max Lv <max.c.lv@gmail.com>                          *\n *  Copyright (C) 2018 by Mygod Studio <contact-shadowsocks-android@mygod.be>  *\n *                                                                             *\n *  This program is free software: you can redistribute it and/or modify       *\n *  it under the terms of the GNU General Public License as published by       *\n *  the Free Software Foundation, either version 3 of the License, or          *\n *  (at your option) any later version.                                        *\n *                                                                             *\n *  This program is distributed in the hope that it will be useful,            *\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of             *\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the              *\n *  GNU General Public License for more details.                               *\n *                                                                             *\n *  You should have received a copy of the GNU General Public License          *\n *  along with this program. If not, see <http://www.gnu.org/licenses/>.       *\n *                                                                             *\n *******************************************************************************/\n\npackage com.github.shadowsocks.utils\n\nimport android.annotation.SuppressLint\nimport android.content.BroadcastReceiver\nimport android.content.Context\nimport android.content.Intent\nimport android.content.IntentFilter\nimport android.content.pm.PackageInfo\nimport android.content.res.Resources\nimport android.os.Build\nimport android.system.Os\nimport android.system.OsConstants\nimport android.util.TypedValue\nimport androidx.annotation.AttrRes\nimport androidx.preference.Preference\nimport kotlinx.coroutines.CancellationException\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.GlobalScope\nimport kotlinx.coroutines.InternalCoroutinesApi\nimport kotlinx.coroutines.coroutineScope\nimport kotlinx.coroutines.job\nimport kotlinx.coroutines.launch\nimport kotlinx.coroutines.suspendCancellableCoroutine\nimport kotlinx.coroutines.withContext\nimport timber.log.Timber\nimport java.io.FileDescriptor\nimport java.net.HttpURLConnection\nimport java.net.InetAddress\nimport kotlin.coroutines.resume\nimport kotlin.coroutines.resumeWithException\n\ninline fun <T> Iterable<T>.forEachTry(action: (T) -> Unit) {\n    var result: Exception? = null\n    for (element in this) try {\n        action(element)\n    } catch (e: Exception) {\n        if (result == null) result = e else result.addSuppressed(e)\n    }\n    if (result != null) {\n        Timber.d(result)\n        throw result\n    }\n}\n\nval Throwable.readableMessage get() = localizedMessage ?: javaClass.name\n\n/**\n * https://android.googlesource.com/platform/prebuilts/runtime/+/94fec32/appcompat/hiddenapi-light-greylist.txt#9466\n */\nprivate val getInt = FileDescriptor::class.java.getDeclaredMethod(\"getInt$\")\nval FileDescriptor.int get() = getInt.invoke(this) as Int\n\nprivate val parseNumericAddress by lazy @SuppressLint(\"SoonBlockedPrivateApi\") {\n    InetAddress::class.java.getDeclaredMethod(\"parseNumericAddress\", String::class.java).apply {\n        isAccessible = true\n    }\n}\n/**\n * A slightly more performant variant of parseNumericAddress.\n *\n * Bug in Android 9.0 and lower: https://issuetracker.google.com/issues/123456213\n */\nfun String?.parseNumericAddress(): InetAddress? = Os.inet_pton(OsConstants.AF_INET, this)\n        ?: Os.inet_pton(OsConstants.AF_INET6, this)?.let {\n            if (Build.VERSION.SDK_INT >= 29) it else parseNumericAddress.invoke(null, this) as InetAddress\n        }\n\nsuspend fun <T> HttpURLConnection.useCancellable(block: suspend HttpURLConnection.() -> T) = coroutineScope {\n    @OptIn(InternalCoroutinesApi::class)    // https://github.com/Kotlin/kotlinx.coroutines/issues/4117\n    coroutineContext.job.invokeOnCompletion(true) {\n        if (Build.VERSION.SDK_INT >= 26) disconnect() else GlobalScope.launch(Dispatchers.IO) { disconnect() }\n    }\n    try {\n        withContext(Dispatchers.IO) { block() }\n    } finally {\n        if (Build.VERSION.SDK_INT >= 26) disconnect() else GlobalScope.launch(Dispatchers.IO) { disconnect() }\n    }\n}\n\nfun parsePort(str: String?, default: Int, min: Int = 1025): Int {\n    val value = str?.toIntOrNull() ?: default\n    return if (value < min || value > 65535) default else value\n}\n\nfun broadcastReceiver(callback: (Context, Intent) -> Unit): BroadcastReceiver = object : BroadcastReceiver() {\n    override fun onReceive(context: Context, intent: Intent) = callback(context, intent)\n}\n\nfun Context.listenForPackageChanges(onetime: Boolean = true, callback: () -> Unit) = object : BroadcastReceiver() {\n    override fun onReceive(context: Context, intent: Intent) {\n        callback()\n        if (onetime) context.unregisterReceiver(this)\n    }\n}.apply {\n    registerReceiver(this, IntentFilter().apply {\n        addAction(Intent.ACTION_PACKAGE_ADDED)\n        addAction(Intent.ACTION_PACKAGE_REMOVED)\n        addDataScheme(\"package\")\n    })\n}\n\nval PackageInfo.signaturesCompat get() =\n    if (Build.VERSION.SDK_INT >= 28) signingInfo?.apkContentsSigners else @Suppress(\"DEPRECATION\") signatures\n\n/**\n * Based on: https://stackoverflow.com/a/26348729/2245107\n */\nfun Resources.Theme.resolveResourceId(@AttrRes resId: Int): Int {\n    val typedValue = TypedValue()\n    if (!resolveAttribute(resId, typedValue, true)) throw Resources.NotFoundException()\n    return typedValue.resourceId\n}\n\nfun Preference.remove() = parent!!.removePreference(this)\n"
  },
  {
    "path": "core/src/main/java/com/github/shadowsocks/widget/AutoCollapseTextView.kt",
    "content": "/*******************************************************************************\n *                                                                             *\n *  Copyright (C) 2018 by Max Lv <max.c.lv@gmail.com>                          *\n *  Copyright (C) 2018 by Mygod Studio <contact-shadowsocks-android@mygod.be>  *\n *                                                                             *\n *  This program is free software: you can redistribute it and/or modify       *\n *  it under the terms of the GNU General Public License as published by       *\n *  the Free Software Foundation, either version 3 of the License, or          *\n *  (at your option) any later version.                                        *\n *                                                                             *\n *  This program is distributed in the hope that it will be useful,            *\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of             *\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the              *\n *  GNU General Public License for more details.                               *\n *                                                                             *\n *  You should have received a copy of the GNU General Public License          *\n *  along with this program. If not, see <http://www.gnu.org/licenses/>.       *\n *                                                                             *\n *******************************************************************************/\n\npackage com.github.shadowsocks.widget\n\nimport android.content.Context\nimport android.graphics.Rect\nimport android.util.AttributeSet\nimport android.view.MotionEvent\nimport androidx.appcompat.widget.AppCompatTextView\nimport androidx.core.view.isGone\nimport timber.log.Timber\n\nclass AutoCollapseTextView @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null,\n                                                     defStyleAttr: Int = 0) :\n        AppCompatTextView(context, attrs, defStyleAttr) {\n    override fun onTextChanged(text: CharSequence?, start: Int, lengthBefore: Int, lengthAfter: Int) {\n        super.onTextChanged(text, start, lengthBefore, lengthAfter)\n        isGone = text.isNullOrEmpty()\n    }\n\n    // #1874\n    override fun onFocusChanged(focused: Boolean, direction: Int, previouslyFocusedRect: Rect?) = try {\n        super.onFocusChanged(focused, direction, previouslyFocusedRect)\n    } catch (e: IndexOutOfBoundsException) {\n        Timber.w(e)\n    }\n\n    override fun onTouchEvent(event: MotionEvent?) = try {\n        super.onTouchEvent(event)\n    } catch (e: IndexOutOfBoundsException) {\n        Timber.w(e)\n        false\n    }\n}\n"
  },
  {
    "path": "core/src/main/jni/Android.mk",
    "content": "# Copyright (C) 2009 The Android Open Source Project\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n#\n#\nLOCAL_PATH := $(call my-dir)\nROOT_PATH := $(LOCAL_PATH)\n\nBUILD_SHARED_EXECUTABLE := $(LOCAL_PATH)/build-shared-executable.mk\n\n########################################################\n## libevent\n########################################################\n\ninclude $(CLEAR_VARS)\n\nLIBEVENT_SOURCES := \\\n\tbuffer.c bufferevent.c event.c \\\n\tbufferevent_pair.c bufferevent_filter.c \\\n\tbufferevent_sock.c bufferevent_ratelim.c \\\n\tevthread.c log.c evutil.c evutil_rand.c evutil_time.c evmap.c epoll.c poll.c signal.c select.c\n\nLOCAL_MODULE := event\nLOCAL_SRC_FILES := $(addprefix libevent/, $(LIBEVENT_SOURCES))\nLOCAL_CFLAGS := -I$(LOCAL_PATH)/libevent \\\n\t-I$(LOCAL_PATH)/libevent/include \\\n\t-Wno-error=implicit-function-declaration\n\ninclude $(BUILD_STATIC_LIBRARY)\n\n########################################################\n## libancillary\n########################################################\n\ninclude $(CLEAR_VARS)\n\nANCILLARY_SOURCE := fd_recv.c fd_send.c\n\nLOCAL_MODULE := libancillary\nLOCAL_CFLAGS += -I$(LOCAL_PATH)/libancillary\n\nLOCAL_SRC_FILES := $(addprefix libancillary/, $(ANCILLARY_SOURCE))\n\ninclude $(BUILD_STATIC_LIBRARY)\n\n########################################################\n## redsocks\n########################################################\n\ninclude $(CLEAR_VARS)\n\nREDSOCKS_SOURCES := base.c http-connect.c \\\n\tlog.c md5.c socks5.c \\\n\tbase64.c http-auth.c http-relay.c main.c \\\n\tparser.c redsocks.c socks4.c utils.c\n\nLOCAL_STATIC_LIBRARIES := libevent\n\nLOCAL_MODULE := redsocks\nLOCAL_SRC_FILES := $(addprefix redsocks/, $(REDSOCKS_SOURCES))\nLOCAL_CFLAGS := -std=gnu99 -DUSE_IPTABLES -D_GNU_SOURCE \\\n\t-I$(LOCAL_PATH)/redsocks \\\n\t-I$(LOCAL_PATH)/libevent/include \\\n\t-I$(LOCAL_PATH)/libevent\n\ninclude $(BUILD_SHARED_EXECUTABLE)\n\n########################################################\n## tun2socks\n########################################################\n\ninclude $(CLEAR_VARS)\n\nLOCAL_CFLAGS := -std=gnu99\nLOCAL_CFLAGS += -DBADVPN_THREADWORK_USE_PTHREAD -DBADVPN_LINUX -DBADVPN_BREACTOR_BADVPN -D_GNU_SOURCE\nLOCAL_CFLAGS += -DBADVPN_USE_SIGNALFD -DBADVPN_USE_EPOLL\nLOCAL_CFLAGS += -DBADVPN_LITTLE_ENDIAN -DBADVPN_THREAD_SAFE\nLOCAL_CFLAGS += -DNDEBUG -DANDROID\nLOCAL_CFLAGS += -Wno-parentheses -Wno-unused-value\n# LOCAL_CFLAGS += -DTUN2SOCKS_JNI\n\nLOCAL_STATIC_LIBRARIES := libancillary\n\nLOCAL_C_INCLUDES:= \\\n\t\t$(LOCAL_PATH)/libancillary \\\n        $(LOCAL_PATH)/badvpn/lwip/src/include \\\n        $(LOCAL_PATH)/badvpn/lwip/custom \\\n        $(LOCAL_PATH)/badvpn/\n\nTUN2SOCKS_SOURCES := \\\n        base/BLog_syslog.c \\\n        system/BReactor_badvpn.c \\\n        system/BSignal.c \\\n        system/BConnection_common.c \\\n        system/BConnection_unix.c \\\n        system/BTime.c \\\n        system/BUnixSignal.c \\\n        system/BNetwork.c \\\n        flow/StreamRecvInterface.c \\\n        flow/PacketRecvInterface.c \\\n        flow/PacketPassInterface.c \\\n        flow/StreamPassInterface.c \\\n        flow/SinglePacketBuffer.c \\\n        flow/BufferWriter.c \\\n        flow/PacketBuffer.c \\\n        flow/PacketStreamSender.c \\\n        flow/PacketPassConnector.c \\\n        flow/PacketProtoFlow.c \\\n        flow/PacketPassFairQueue.c \\\n        flow/PacketProtoEncoder.c \\\n        flow/PacketProtoDecoder.c \\\n        socksclient/BSocksClient.c \\\n        tuntap/BTap.c \\\n        lwip/src/core/udp.c \\\n        lwip/src/core/memp.c \\\n        lwip/src/core/init.c \\\n        lwip/src/core/pbuf.c \\\n        lwip/src/core/tcp.c \\\n        lwip/src/core/tcp_out.c \\\n        lwip/src/core/netif.c \\\n        lwip/src/core/def.c \\\n        lwip/src/core/ip.c \\\n        lwip/src/core/mem.c \\\n        lwip/src/core/tcp_in.c \\\n        lwip/src/core/stats.c \\\n        lwip/src/core/inet_chksum.c \\\n        lwip/src/core/timeouts.c \\\n        lwip/src/core/ipv4/icmp.c \\\n        lwip/src/core/ipv4/igmp.c \\\n        lwip/src/core/ipv4/ip4_addr.c \\\n        lwip/src/core/ipv4/ip4_frag.c \\\n        lwip/src/core/ipv4/ip4.c \\\n        lwip/src/core/ipv4/autoip.c \\\n        lwip/src/core/ipv6/ethip6.c \\\n        lwip/src/core/ipv6/inet6.c \\\n        lwip/src/core/ipv6/ip6_addr.c \\\n        lwip/src/core/ipv6/mld6.c \\\n        lwip/src/core/ipv6/dhcp6.c \\\n        lwip/src/core/ipv6/icmp6.c \\\n        lwip/src/core/ipv6/ip6.c \\\n        lwip/src/core/ipv6/ip6_frag.c \\\n        lwip/src/core/ipv6/nd6.c \\\n        lwip/custom/sys.c \\\n        tun2socks/tun2socks.c \\\n        base/DebugObject.c \\\n        base/BLog.c \\\n        base/BPending.c \\\n\t\tsystem/BDatagram_unix.c \\\n        flowextra/PacketPassInactivityMonitor.c \\\n        socks_udp_client/SocksUdpClient.c \\\n        tun2socks/SocksUdpGwClient.c \\\n        udpgw_client/UdpGwClient.c\n\nLOCAL_MODULE := tun2socks\n\nLOCAL_LDLIBS := -ldl -llog\n\nLOCAL_SRC_FILES := $(addprefix badvpn/, $(TUN2SOCKS_SOURCES))\n\ninclude $(BUILD_SHARED_EXECUTABLE)\n"
  },
  {
    "path": "core/src/main/jni/Application.mk",
    "content": "APP_STL := c++_static\nAPP_SUPPORT_FLEXIBLE_PAGE_SIZES := true\n"
  },
  {
    "path": "core/src/main/jni/build-shared-executable.mk",
    "content": "# Copyright (C) 2009 The Android Open Source Project\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n#\n# this file is included from Android.mk files to build a target-specific\n# executable program\n#\n# Modified by @Mygod, based on:\n#   https://android.googlesource.com/platform/ndk/+/a355a4e/build/core/build-shared-library.mk\n#   https://android.googlesource.com/platform/ndk/+/a355a4e/build/core/build-executable.mk\nLOCAL_BUILD_SCRIPT := BUILD_EXECUTABLE\nLOCAL_MAKEFILE     := $(local-makefile)\n$(call check-defined-LOCAL_MODULE,$(LOCAL_BUILD_SCRIPT))\n$(call check-LOCAL_MODULE,$(LOCAL_MAKEFILE))\n$(call check-LOCAL_MODULE_FILENAME)\n# we are building target objects\nmy := TARGET_\n$(call handle-module-filename,lib,$(TARGET_SONAME_EXTENSION))\n$(call handle-module-built)\nLOCAL_MODULE_CLASS := EXECUTABLE\ninclude $(BUILD_SYSTEM)/build-module.mk\n"
  },
  {
    "path": "core/src/main/res/color-v24/ic_launcher_foreground_shadow.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<gradient xmlns:android=\"http://schemas.android.com/apk/res/android\"\n          android:startColor=\"#19000000\"\n          android:endColor=\"#00000000\"\n          android:startX=\"46.15\"\n          android:endX=\"108\"\n          android:startY=\"40.34\"\n          android:endY=\"102.18\"\n          android:type=\"linear\"/>\n"
  },
  {
    "path": "core/src/main/res/drawable/ic_file_cloud_download.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\"\n        android:tint=\"?attr/colorControlNormal\">\n    <path\n        android:fillColor=\"#FFFFFFFF\"\n        android:pathData=\"M19.35,10.04C18.67,6.59 15.64,4 12,4 9.11,4 6.6,5.64 5.35,8.04 2.34,8.36 0,10.91 0,14c0,3.31 2.69,6 6,6h13c2.76,0 5,-2.24 5,-5 0,-2.64 -2.05,-4.78 -4.65,-4.96zM17,13l-5,5 -5,-5h3V9h4v4h3z\"/>\n</vector>\n"
  },
  {
    "path": "core/src/main/res/drawable/ic_launcher_monochrome.xml",
    "content": "<vector android:height=\"108dp\" android:viewportHeight=\"108.0\"\n    android:viewportWidth=\"108.0\" android:width=\"108dp\" xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <path android:fillAlpha=\"0.79\" android:fillColor=\"#000\"\n        android:pathData=\"M70.94,35.7l-6.94,30.53l-15.56,-5l13.74,-16.38l-18.31,15.4l-12.81,-4.82l39.88,-19.73z\"/>\n    <path android:fillAlpha=\"0.79\" android:fillColor=\"#000\"\n        android:pathData=\"M48.79,64.37l4.96,1.6l-4.94,6.73l-0.02,-8.33z\"/>\n    <path android:fillAlpha=\"0.79\" android:fillColor=\"#000\"\n        android:pathData=\"M70.94,35.7l-6.94,30.53l-15.56,-5l13.74,-16.38l-18.31,15.4l-12.81,-4.82l39.88,-19.73z\"/>\n    <path android:fillAlpha=\"0.79\" android:fillColor=\"#000\"\n        android:pathData=\"M48.79,64.37l4.96,1.6l-4.94,6.73l-0.02,-8.33z\"/>\n</vector>\n"
  },
  {
    "path": "core/src/main/res/drawable/ic_service_active.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n\n    <path\n        android:name=\"path\"\n        android:fillColor=\"#fff\"\n        android:pathData=\"M 21.25 2.28 L 17.55 18.55 L 9.26 15.89 L 16.58 7.16 L 6.83 15.37 L 0 12.8 L 21.25 2.28 ZM 9.45 17.56 L 12.09 18.41 L 9.46 22 L 9.45 17.56 Z\" />\n</vector>\n"
  },
  {
    "path": "core/src/main/res/drawable-anydpi-v24/ic_launcher_foreground.xml",
    "content": "<vector android:height=\"108dp\" android:viewportHeight=\"108.0\"\n        android:viewportWidth=\"108.0\" android:width=\"108dp\" xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <path android:fillColor=\"@color/ic_launcher_foreground_shadow\"\n          android:pathData=\"M70.94,35.7l37.06,36.3l0,36l-23.92,0l-53.02,-52.57l39.88,-19.73l0,0\"/>\n    <path android:fillAlpha=\"0.79\" android:fillColor=\"#fff\"\n          android:pathData=\"M70.94,35.7l-6.94,30.53l-15.56,-5l13.74,-16.38l-18.31,15.4l-12.81,-4.82l39.88,-19.73z\"/>\n    <path android:fillAlpha=\"0.79\" android:fillColor=\"#fff\"\n          android:pathData=\"M48.79,64.37l4.96,1.6l-4.94,6.73l-0.02,-8.33z\"/>\n    <path android:fillAlpha=\"0.79\" android:fillColor=\"#fff\"\n          android:pathData=\"M70.94,35.7l-6.94,30.53l-15.56,-5l13.74,-16.38l-18.31,15.4l-12.81,-4.82l39.88,-19.73z\"/>\n    <path android:fillAlpha=\"0.79\" android:fillColor=\"#fff\"\n          android:pathData=\"M48.79,64.37l4.96,1.6l-4.94,6.73l-0.02,-8.33z\"/>\n</vector>\n"
  },
  {
    "path": "core/src/main/res/mipmap-anydpi-v24/banner.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:aapt=\"http://schemas.android.com/aapt\"\n    android:width=\"160dp\"\n    android:height=\"90dp\"\n    android:viewportWidth=\"160\"\n    android:viewportHeight=\"90\">\n  <path\n      android:pathData=\"M0,0h160v90h-160z\"\n      android:fillColor=\"#7488a1\"/>\n  <path\n      android:pathData=\"M46.94,26.7l54.64,53.88l-29.2,30.71l-65.32,-64.86l39.88,-19.73l0,0\">\n    <aapt:attr name=\"android:fillColor\">\n      <gradient \n          android:startY=\"31.34\"\n          android:startX=\"22.15\"\n          android:endY=\"96.43\"\n          android:endX=\"87.24\"\n          android:type=\"linear\">\n        <item android:offset=\"0\" android:color=\"#19000000\"/>\n        <item android:offset=\"0.7\" android:color=\"#00000000\"/>\n      </gradient>\n    </aapt:attr>\n  </path>\n  <path\n      android:pathData=\"M46.94,26.7l-6.94,30.53l-15.56,-5l13.74,-16.38l-18.3,15.4l-12.82,-4.82l39.88,-19.73z\"\n      android:strokeAlpha=\"0.79\"\n      android:fillColor=\"#fff\"\n      android:fillAlpha=\"0.79\"/>\n  <path\n      android:pathData=\"M24.79,55.37l4.96,1.6l-4.94,6.73l-0.02,-8.33z\"\n      android:strokeAlpha=\"0.79\"\n      android:fillColor=\"#fff\"\n      android:fillAlpha=\"0.79\"/>\n  <path\n      android:pathData=\"M46.94,26.7l-6.94,30.53l-15.56,-5l13.74,-16.38l-18.3,15.4l-12.82,-4.82l39.88,-19.73z\"\n      android:strokeAlpha=\"0.79\"\n      android:fillColor=\"#fff\"\n      android:fillAlpha=\"0.79\"/>\n  <path\n      android:pathData=\"M24.79,55.37l4.96,1.6l-4.94,6.73l-0.02,-8.33z\"\n      android:strokeAlpha=\"0.79\"\n      android:fillColor=\"#fff\"\n      android:fillAlpha=\"0.79\"/>\n  <path\n      android:pathData=\"M60.54,43.43l-1.1,1.08h-3V46h2.52a1.25,1.25 0,0 1,0.89 0.36,1.26 1.26,0 0,1 0.37,0.9v1.26a1.26,1.26 0,0 1,-1.26 1.26H55.14V48.65h3.78V47H56.4a1.26,1.26 0,0 1,-0.9 -0.37,1.25 1.25,0 0,1 -0.36,-0.89V44.69a1.23,1.23 0,0 1,1.26 -1.26Z\"\n      android:fillColor=\"#fff\"/>\n  <path\n      android:pathData=\"M68.91,49.73H67.65V44.51H63.87v5.22H62.61V40.54l1.26,-1.25v5l0.9,-0.9h2.88a1.25,1.25 0,0 1,0.89 0.36,1.26 1.26,0 0,1 0.37,0.9Z\"\n      android:fillColor=\"#fff\"/>\n  <path\n      android:pathData=\"M77.46,49.73H76.2v-0.92l-1.08,0.92h-2.7a1.26,1.26 0,0 1,-0.9 -0.37,1.25 1.25,0 0,1 -0.36,-0.89V47.21A1.23,1.23 0,0 1,72.42 46H76L74.94,47H72.42v1.64H76.2V44.51h-5l1.08,-1.08h4a1.25,1.25 0,0 1,0.89 0.36,1.26 1.26,0 0,1 0.37,0.9Z\"\n      android:fillColor=\"#fff\"/>\n  <path\n      android:pathData=\"M86.27,49.73H85v-0.9l-0.9,0.9H81.23A1.25,1.25 0,0 1,80 48.47V44.69a1.23,1.23 0,0 1,1.25 -1.26H85V40.54l1.25,-1.25ZM85,48.65v-5l-0.9,0.9H81.23v4.14Z\"\n      android:fillColor=\"#fff\"/>\n  <path\n      android:pathData=\"M95.28,48.47A1.26,1.26 0,0 1,94 49.73H90.23A1.25,1.25 0,0 1,89 48.47V44.69a1.23,1.23 0,0 1,1.25 -1.26H94a1.25,1.25 0,0 1,0.89 0.36,1.26 1.26,0 0,1 0.37,0.9ZM94,48.65V44.51H90.23v4.14Z\"\n      android:fillColor=\"#fff\"/>\n  <path\n      android:pathData=\"M106.8,43.43l-1.73,6.3h-2l-1,-4.31h-0.18l-1,4.31H99l-1.69,-6.3h1.35l1.17,5.25h0.36l1.29,-5.25h1.26l1.23,5.25h0.36l1.17,-5.25Z\"\n      android:fillColor=\"#fff\"/>\n  <path\n      android:pathData=\"M113.91,43.43l-1.1,1.08h-3V46h2.52a1.25,1.25 0,0 1,0.89 0.36,1.26 1.26,0 0,1 0.37,0.9v1.26a1.26,1.26 0,0 1,-1.26 1.26h-3.78V48.65h3.78V47h-2.52a1.26,1.26 0,0 1,-1.26 -1.26V44.69a1.25,1.25 0,0 1,1.26 -1.26Z\"\n      android:fillColor=\"#fff\"/>\n  <path\n      android:pathData=\"M122.09,48.47a1.25,1.25 0,0 1,-0.36 0.89,1.26 1.26,0 0,1 -0.9,0.37h-3.78a1.26,1.26 0,0 1,-1.26 -1.26L115.79,44.69a1.26,1.26 0,0 1,0.37 -0.9,1.25 1.25,0 0,1 0.89,-0.36h3.78a1.23,1.23 0,0 1,1.26 1.26ZM120.83,48.65L120.83,44.51h-3.78v4.14Z\"\n      android:fillColor=\"#fff\"/>\n  <path\n      android:pathData=\"M130,43.43l-1.1,1.08h-3v4.14h3.78v1.08h-3.78a1.26,1.26 0,0 1,-0.9 -0.37,1.25 1.25,0 0,1 -0.36,-0.89V44.69a1.23,1.23 0,0 1,1.26 -1.26Z\"\n      android:fillColor=\"#fff\"/>\n  <path\n      android:pathData=\"M138.11,43.43l-2.86,2.5v0.18h1.25a1.25,1.25 0,0 1,1.25 1.26v2.36H136.5V47h-3.79v2.7h-1.25V40.54l1.25,-1.25v7.57l3.87,-3.43Z\"\n      android:fillColor=\"#fff\"/>\n  <path\n      android:pathData=\"M145.22,43.43l-1.09,1.08h-3V46h2.52a1.25,1.25 0,0 1,1.27 1.26v1.26a1.26,1.26 0,0 1,-1.27 1.26h-3.77V48.65h3.77V47h-2.52a1.25,1.25 0,0 1,-1.25 -1.26V44.69a1.23,1.23 0,0 1,1.25 -1.26Z\"\n      android:fillColor=\"#fff\"/>\n</vector>\n"
  },
  {
    "path": "core/src/main/res/mipmap-anydpi-v26/ic_launcher.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<adaptive-icon xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <background android:drawable=\"@color/ic_launcher_background\"/>\n    <foreground android:drawable=\"@drawable/ic_launcher_foreground\"/>\n    <monochrome android:drawable=\"@drawable/ic_launcher_monochrome\"/>\n</adaptive-icon>\n"
  },
  {
    "path": "core/src/main/res/values/arrays.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string-array name=\"enc_method_entry\" translatable=\"false\">\n        <item>NONE</item>\n        <item>CHACHA20-IETF</item>\n        <item>AES-128-GCM</item>\n        <item>AES_128_GCM_SIV</item>\n        <item>AES-256-GCM</item>\n        <item>AES_256_GCM_SIV</item>\n        <item>CHACHA20-IETF-POLY1305</item>\n        <item>XCHACHA20-IETF-POLY1305</item>\n        <item>2022-BLAKE3-AES-128-GCM</item>\n        <item>2022-BLAKE3-AES-256-GCM</item>\n        <item>2022-BLAKE3-CHACHA20-POLY1305</item>\n        <item>RC4-MD5</item>\n        <item>AES-128-CFB</item>\n        <item>AES-192-CFB</item>\n        <item>AES-256-CFB</item>\n        <item>AES-128-CTR</item>\n        <item>AES-192-CTR</item>\n        <item>AES-256-CTR</item>\n        <item>BF-CFB</item>\n        <item>CAMELLIA-128-CFB</item>\n        <item>CAMELLIA-192-CFB</item>\n        <item>CAMELLIA-256-CFB</item>\n    </string-array>\n\n    <string-array name=\"enc_method_value\" translatable=\"false\">\n        <item>none</item>\n        <item>chacha20-ietf</item>\n        <item>aes-128-gcm</item>\n        <item>aes-128-gcm-siv</item>\n        <item>aes-256-gcm</item>\n        <item>aes-256-gcm-siv</item>\n        <item>chacha20-ietf-poly1305</item>\n        <item>xchacha20-ietf-poly1305</item>\n        <item>2022-blake3-aes-128-gcm</item>\n        <item>2022-blake3-aes-256-gcm</item>\n        <item>2022-blake3-chacha20-poly1305</item>\n        <item>rc4-md5</item>\n        <item>aes-128-cfb</item>\n        <item>aes-192-cfb</item>\n        <item>aes-256-cfb</item>\n        <item>aes-128-ctr</item>\n        <item>aes-192-ctr</item>\n        <item>aes-256-ctr</item>\n        <item>bf-cfb</item>\n        <item>camellia-128-cfb</item>\n        <item>camellia-192-cfb</item>\n        <item>camellia-256-cfb</item>\n    </string-array>\n\n    <string-array name=\"bypass_private_route\" translatable=\"false\">\n        <item>1.0.0.0/8</item>\n        <item>2.0.0.0/7</item>\n        <item>4.0.0.0/6</item>\n        <item>8.0.0.0/7</item>\n        <item>11.0.0.0/8</item>\n        <item>12.0.0.0/6</item>\n        <item>16.0.0.0/4</item>\n        <item>32.0.0.0/3</item>\n        <item>64.0.0.0/3</item>\n        <item>96.0.0.0/6</item>\n        <item>100.0.0.0/10</item>\n        <item>100.128.0.0/9</item>\n        <item>101.0.0.0/8</item>\n        <item>102.0.0.0/7</item>\n        <item>104.0.0.0/5</item>\n        <item>112.0.0.0/10</item>\n        <item>112.64.0.0/11</item>\n        <item>112.96.0.0/12</item>\n        <item>112.112.0.0/13</item>\n        <item>112.120.0.0/14</item>\n        <item>112.124.0.0/19</item>\n        <item>112.124.32.0/21</item>\n        <item>112.124.40.0/22</item>\n        <item>112.124.44.0/23</item>\n        <item>112.124.46.0/24</item>\n        <item>112.124.48.0/20</item>\n        <item>112.124.64.0/18</item>\n        <item>112.124.128.0/17</item>\n        <item>112.125.0.0/16</item>\n        <item>112.126.0.0/15</item>\n        <item>112.128.0.0/9</item>\n        <item>113.0.0.0/8</item>\n        <item>114.0.0.0/10</item>\n        <item>114.64.0.0/11</item>\n        <item>114.96.0.0/12</item>\n        <item>114.112.0.0/15</item>\n        <item>114.114.0.0/18</item>\n        <item>114.114.64.0/19</item>\n        <item>114.114.96.0/20</item>\n        <item>114.114.112.0/23</item>\n        <item>114.114.115.0/24</item>\n        <item>114.114.116.0/22</item>\n        <item>114.114.120.0/21</item>\n        <item>114.114.128.0/17</item>\n        <item>114.115.0.0/16</item>\n        <item>114.116.0.0/14</item>\n        <item>114.120.0.0/13</item>\n        <item>114.128.0.0/9</item>\n        <item>115.0.0.0/8</item>\n        <item>116.0.0.0/6</item>\n        <item>120.0.0.0/6</item>\n        <item>124.0.0.0/7</item>\n        <item>126.0.0.0/8</item>\n        <item>128.0.0.0/3</item>\n        <item>160.0.0.0/5</item>\n        <item>168.0.0.0/8</item>\n        <item>169.0.0.0/9</item>\n        <item>169.128.0.0/10</item>\n        <item>169.192.0.0/11</item>\n        <item>169.224.0.0/12</item>\n        <item>169.240.0.0/13</item>\n        <item>169.248.0.0/14</item>\n        <item>169.252.0.0/15</item>\n        <item>169.255.0.0/16</item>\n        <item>170.0.0.0/7</item>\n        <item>172.0.0.0/12</item>\n        <item>172.32.0.0/11</item>\n        <item>172.64.0.0/10</item>\n        <item>172.128.0.0/9</item>\n        <item>173.0.0.0/8</item>\n        <item>174.0.0.0/7</item>\n        <item>176.0.0.0/4</item>\n        <item>192.0.0.8/29</item>\n        <item>192.0.0.16/28</item>\n        <item>192.0.0.32/27</item>\n        <item>192.0.0.64/26</item>\n        <item>192.0.0.128/25</item>\n        <item>192.0.1.0/24</item>\n        <item>192.0.3.0/24</item>\n        <item>192.0.4.0/22</item>\n        <item>192.0.8.0/21</item>\n        <item>192.0.16.0/20</item>\n        <item>192.0.32.0/19</item>\n        <item>192.0.64.0/18</item>\n        <item>192.0.128.0/17</item>\n        <item>192.1.0.0/16</item>\n        <item>192.2.0.0/15</item>\n        <item>192.4.0.0/14</item>\n        <item>192.8.0.0/13</item>\n        <item>192.16.0.0/12</item>\n        <item>192.32.0.0/11</item>\n        <item>192.64.0.0/12</item>\n        <item>192.80.0.0/13</item>\n        <item>192.88.0.0/18</item>\n        <item>192.88.64.0/19</item>\n        <item>192.88.96.0/23</item>\n        <item>192.88.98.0/24</item>\n        <item>192.88.100.0/22</item>\n        <item>192.88.104.0/21</item>\n        <item>192.88.112.0/20</item>\n        <item>192.88.128.0/17</item>\n        <item>192.89.0.0/16</item>\n        <item>192.90.0.0/15</item>\n        <item>192.92.0.0/14</item>\n        <item>192.96.0.0/11</item>\n        <item>192.128.0.0/11</item>\n        <item>192.160.0.0/13</item>\n        <item>192.169.0.0/16</item>\n        <item>192.170.0.0/15</item>\n        <item>192.172.0.0/14</item>\n        <item>192.176.0.0/12</item>\n        <item>192.192.0.0/10</item>\n        <item>193.0.0.0/8</item>\n        <item>194.0.0.0/7</item>\n        <item>196.0.0.0/7</item>\n        <item>198.0.0.0/12</item>\n        <item>198.16.0.0/15</item>\n        <item>198.20.0.0/14</item>\n        <item>198.24.0.0/13</item>\n        <item>198.32.0.0/12</item>\n        <item>198.48.0.0/15</item>\n        <item>198.50.0.0/16</item>\n        <item>198.51.0.0/18</item>\n        <item>198.51.64.0/19</item>\n        <item>198.51.96.0/22</item>\n        <item>198.51.101.0/24</item>\n        <item>198.51.102.0/23</item>\n        <item>198.51.104.0/21</item>\n        <item>198.51.112.0/20</item>\n        <item>198.51.128.0/17</item>\n        <item>198.52.0.0/14</item>\n        <item>198.56.0.0/13</item>\n        <item>198.64.0.0/10</item>\n        <item>198.128.0.0/9</item>\n        <item>199.0.0.0/8</item>\n        <item>200.0.0.0/7</item>\n        <item>202.0.0.0/8</item>\n        <item>203.0.0.0/18</item>\n        <item>203.0.64.0/19</item>\n        <item>203.0.96.0/20</item>\n        <item>203.0.112.0/24</item>\n        <item>203.0.114.0/23</item>\n        <item>203.0.116.0/22</item>\n        <item>203.0.120.0/21</item>\n        <item>203.0.128.0/17</item>\n        <item>203.1.0.0/16</item>\n        <item>203.2.0.0/15</item>\n        <item>203.4.0.0/14</item>\n        <item>203.8.0.0/13</item>\n        <item>203.16.0.0/12</item>\n        <item>203.32.0.0/11</item>\n        <item>203.64.0.0/10</item>\n        <item>203.128.0.0/9</item>\n        <item>204.0.0.0/6</item>\n        <item>208.0.0.0/4</item>\n    </string-array>\n\n    <string-array name=\"service_modes\">\n        <item>@string/service_mode_proxy</item>\n        <item>@string/service_mode_vpn</item>\n        <item>@string/service_mode_transproxy</item>\n    </string-array>\n    <string-array name=\"service_mode_values\" translatable=\"false\">\n        <item>proxy</item>\n        <item>vpn</item>\n        <item>transproxy</item>\n    </string-array>\n</resources>\n"
  },
  {
    "path": "core/src/main/res/values/colors.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <color name=\"ic_launcher_background\">#7488A1</color>\n</resources>\n"
  },
  {
    "path": "core/src/main/res/values/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n  <string name=\"app_name\">Shadowsocks</string>\n  <string name=\"quick_toggle\">Toggle</string>\n  <string name=\"send_email\">Send email</string>\n\n  <!-- misc -->\n  <string name=\"service_mode\">Service mode</string>\n  <string name=\"service_mode_proxy\">Proxy only</string>\n  <string name=\"service_mode_vpn\">VPN</string>\n  <string name=\"service_mode_transproxy\">Transproxy</string>\n  <string name=\"share_over_lan\">Share over LAN</string>\n  <string name=\"port_proxy\">SOCKS5 proxy port</string>\n  <string name=\"port_local_dns\">Local DNS port</string>\n  <string name=\"port_transproxy\">Transproxy port</string>\n\n  <string name=\"remote_dns\">Remote DNS</string>\n  <string name=\"traffic\">%1$s↑\\t%2$s↓</string>\n  <string name=\"stat_summary\">Sent: \\t\\t\\t\\t\\t%3$s\\t↑\\t%1$s\\nReceived: \\t%4$s\\t↓\\t%2$s</string>\n  <string name=\"speed\">%s/s</string>\n  <string name=\"connection_test_pending\">Check Connectivity</string>\n  <string name=\"connection_test_testing\">Testing…</string>\n  <string name=\"connection_test_available\">Success: HTTPS handshake took %dms</string>\n  <string name=\"connection_test_error\">Fail to detect internet connection: %s</string>\n  <string name=\"connection_test_fail\">Internet Unavailable</string>\n  <string name=\"connection_test_error_status_code\">Error code: #%d</string>\n\n  <!-- proxy category -->\n  <string name=\"profile_name\">Profile Name</string>\n  <string name=\"proxy\">Server</string>\n  <string name=\"remote_port\">Remote Port</string>\n  <string name=\"sitekey\">Password</string>\n  <string name=\"enc_method\">Encrypt Method</string>\n\n  <!-- feature category -->\n  <string name=\"ipv6\">IPv6 Route</string>\n  <string name=\"ipv6_summary\">Redirect IPv6 traffic to remote</string>\n  <string name=\"metered\">Metered Hint</string>\n  <string name=\"metered_summary\">Hint system to treat VPN as metered</string>\n  <string name=\"route_list\">Route</string>\n  <string name=\"route_entry_all\">All</string>\n  <string name=\"route_entry_bypass_lan\">Bypass LAN</string>\n  <string name=\"route_entry_bypass_chn\">Bypass mainland China</string>\n  <string name=\"route_entry_bypass_lan_chn\">Bypass LAN &amp; mainland China</string>\n  <string name=\"route_entry_gfwlist\">GFW List</string>\n  <string name=\"route_entry_chinalist\">China List</string>\n  <string name=\"proxied_apps\">Apps VPN mode</string>\n  <string name=\"proxied_apps_summary\">Configure VPN mode for selected apps</string>\n  <string name=\"on\">On</string>\n  <string name=\"off\">Off</string>\n  <string name=\"proxied_apps_mode\">Mode</string>\n  <string name=\"bypass_apps\">Bypass</string>\n  <string name=\"bypass_apps_summary\">Enable this option to bypass selected apps</string>\n  <string name=\"auto_connect\">Auto Connect</string>\n  <string name=\"auto_connect_summary\">Enable Shadowsocks on startup/app update if it was running before</string>\n  <string name=\"direct_boot_aware\">Allow Toggling in Lock Screen</string>\n  <string name=\"direct_boot_aware_summary\">Your selected profile information will be less protected</string>\n  <plurals name=\"hosts_summary\">\n    <item quantity=\"one\">1 hostname configured</item>\n    <item quantity=\"other\">%d hostnames configured</item>\n  </plurals>\n  <string name=\"udp_dns\">Send DNS over UDP</string>\n  <string name=\"udp_dns_summary\">Requires UDP forwarding on server side</string>\n  <string name=\"udp_fallback\">UDP Fallback</string>\n\n  <!-- notification category -->\n  <string name=\"service_vpn\">VPN Service</string>\n  <string name=\"service_proxy\">Proxy Service</string>\n  <string name=\"service_transproxy\">Transproxy Service</string>\n  <string name=\"forward_success\">Shadowsocks started.</string>\n  <string name=\"service_failed\">Failed to connect the remote server</string>\n  <string name=\"stop\">Stop</string>\n  <string name=\"stopping\">Shutting down…</string>\n  <string name=\"vpn_error\">%s</string>\n  <string name=\"vpn_permission_denied\">Permission denied to create a VPN service</string>\n  <string name=\"reboot_required\">Failed to start VPN service. You might need to reboot your device.</string>\n  <string name=\"profile_invalid_input\">No valid profile data found.</string>\n\n  <!-- alert category -->\n  <string name=\"profile_empty\">Please select a profile</string>\n  <string name=\"proxy_empty\">Proxy/Password should not be empty</string>\n  <string name=\"connect\">Connect</string>\n\n  <!-- menu category -->\n  <string name=\"profiles\">Profiles</string>\n  <string name=\"settings\">Settings</string>\n  <string name=\"faq\">FAQ</string>\n  <string name=\"faq_url\">https://github.com/shadowsocks/shadowsocks-android/blob/master/.github/faq.md</string>\n  <string name=\"about\">About</string>\n  <string name=\"about_title\">Shadowsocks %s</string>\n  <string name=\"edit\">Edit</string>\n  <string name=\"share\">Share</string>\n  <string name=\"add_profile\">Add Profile</string>\n  <string name=\"action_apply_all\">Apply Settings to All Profiles</string>\n  <string name=\"action_export_more\">Export…</string>\n  <string name=\"action_export_file\">Export to file…</string>\n  <string name=\"action_export\">Export to Clipboard</string>\n  <string name=\"action_import\">Import from Clipboard</string>\n  <string name=\"action_import_file\">Import from file…</string>\n  <string name=\"action_replace_file\">Replace from file…</string>\n  <string name=\"action_export_msg\">Successfully export!</string>\n  <string name=\"action_export_err\">Failed to export.</string>\n  <string name=\"action_import_msg\">Successfully import!</string>\n  <string name=\"action_import_err\">Failed to import.</string>\n\n  <!-- profile -->\n  <string name=\"profile_config\">Profile config</string>\n  <string name=\"delete\">Remove</string>\n  <string name=\"delete_confirm_prompt\">Are you sure you want to remove this profile?</string>\n  <string name=\"share_qr_nfc\">QR code</string>\n  <string name=\"add_profile_dialog\">Add this Shadowsocks Profile?</string>\n  <string name=\"add_profile_methods_scan_qr_code\">Scan QR code</string>\n  <string name=\"add_profile_methods_manual_settings\">Manual Settings</string>\n  <string name=\"add_profile_scanner_permission_required\">Camera permission is required for scanning QR code.</string>\n  <plurals name=\"removed\">\n    <item quantity=\"one\">Removed</item>\n    <item quantity=\"other\">%d items removed</item>\n  </plurals>\n  <string name=\"undo\">Undo</string>\n\n  <!-- tasker -->\n  <string name=\"toggle_service_state\">Start the service</string>\n  <string name=\"start_service_default\">Connect to the current server</string>\n  <string name=\"start_service\">Connect to %s</string>\n  <string name=\"stop_service\">Switch to %s</string>\n  <string name=\"profile_default\">Use the current profile</string>\n\n  <!-- status -->\n  <string name=\"connecting\">Connecting…</string>\n  <string name=\"vpn_connected\">Connected, tap to check connection</string>\n  <string name=\"not_connected\">Not connected</string>\n\n  <!-- subscriptions -->\n  <string name=\"subscriptions\">Subscriptions</string>\n  <string name=\"add_subscription\">Add a subscription</string>\n  <string name=\"edit_subscription\">Edit subscription</string>\n  <string name=\"update_subscription\">Refresh servers from subscription</string>\n  <string name=\"service_subscription\">Subscription Service</string>\n  <string name=\"service_subscription_working\">Syncing subscriptions… (%d of %d)</string>\n  <string name=\"service_subscription_finishing\">Finishing up…</string>\n\n  <!-- acl -->\n  <string name=\"custom_rules\">Custom rules</string>\n  <string name=\"action_add_rule\">Add rule(s)…</string>\n  <string name=\"acl_rule_templates_generic\">Subnet or Hostname PCRE pattern</string>\n  <string name=\"acl_rule_templates_domain\">Domain name and all its subdomain names</string>\n  <string name=\"acl_rule_online_config\">URL to online config</string>\n  <string name=\"edit_rule\">Edit rule</string>\n  <string name=\"cleartext_http_warning\">Cleartext HTTP traffic is insecure</string>\n\n  <!-- plugin -->\n  <string name=\"plugin\">Plugin</string>\n  <string name=\"plugin_configure\">Configure…</string>\n  <string name=\"plugin_disabled\">Disabled</string>\n  <string name=\"plugin_unknown\">Unknown plugin %s</string>\n  <string name=\"plugin_untrusted\">Warning: This plugin does not seem to come from a known trusted source.</string>\n  <string name=\"profile_plugin\">Plugin: %s</string>\n  <string name=\"plugin_auto_connect_unlock_only\">This plugin might not work with Auto Connect</string>\n</resources>\n"
  },
  {
    "path": "core/src/main/res/values-ar/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n    Copyright (C) 2019 by Max Lv <max.c.lv@gmail.com>\n    Copyright (C) 2019 by Mygod Studio <contact-shadowsocks-android@mygod.be>\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n    DO NOT EDIT: This file was automagically generated by script.\n    If you are looking for contributing a translation, read this:\n    https://discourse.shadowsocks.org/t/poeditor-translation-main-thread/30\n-->\n\n<resources>\n    <string name=\"quick_toggle\">\"تغيير\"</string>\n    <string name=\"remote_dns\">\"سيرفر ال DNS\"</string>\n    <string name=\"stat_summary\">\"ارسل: \\t%3$s\\t↑\\t%1$s\nاستقبل: \\t%4$s\\t↓\\t%2$s\"</string>\n    <string name=\"connection_test_testing\">\"اختبار الاتصال…\"</string>\n    <string name=\"connection_test_error\">\"فشل فحص اتصال الانترنت: %s\"</string>\n    <string name=\"connection_test_fail\">\"لا يوجد اتصال بالانترنت\"</string>\n    <string name=\"connection_test_error_status_code\">\"خطآ رقم: #%d\"</string>\n    <string name=\"proxy\">\"السيرفر\"</string>\n    <string name=\"remote_port\">\"المنفذ\"</string>\n    <string name=\"sitekey\">\"كلمة المرور\"</string>\n    <string name=\"enc_method\">\"طريقة التشفير\"</string>\n</resources>"
  },
  {
    "path": "core/src/main/res/values-de/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n    Copyright (C) 2019 by Max Lv <max.c.lv@gmail.com>\n    Copyright (C) 2019 by Mygod Studio <contact-shadowsocks-android@mygod.be>\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n    DO NOT EDIT: This file was automagically generated by script.\n    If you are looking for contributing a translation, read this:\n    https://discourse.shadowsocks.org/t/poeditor-translation-main-thread/30\n-->\n\n<resources>\n    <string name=\"quick_toggle\">\"Umschalten\"</string>\n    <string name=\"remote_dns\">\"Remote-DNS\"</string>\n    <string name=\"stat_summary\">\"Gesendet: \\t\\t\\t\\t\\t%3$s\\t↑\\t%1$s\nEmpfangen: \\t%4$s\\t↓\\t%2$s\"</string>\n    <string name=\"connection_test_testing\">\"Prüfe Verbindung…\"</string>\n    <string name=\"connection_test_available\">\"Erfolg: HTTPS-Handshake benötigte %dms\"</string>\n    <string name=\"connection_test_error\">\"Scheinbar keine Internetverbindung: %s\"</string>\n    <string name=\"connection_test_fail\">\"Keine Internetverbindung\"</string>\n    <string name=\"connection_test_error_status_code\">\"Fehlercode: #%d\"</string>\n\n    <!-- proxy category -->\n    <string name=\"profile_name\">\"Profilname\"</string>\n    <string name=\"remote_port\">\"Remote-Port\"</string>\n    <string name=\"sitekey\">\"Passwort\"</string>\n    <string name=\"enc_method\">\"Verschlüsselungsmethode\"</string>\n\n    <!-- feature category -->\n    <string name=\"ipv6\">\"IPv6-Route\"</string>\n    <string name=\"ipv6_summary\">\"Leite IPv6-Traffic zu Remote um\"</string>\n    <string name=\"route_entry_gfwlist\">\"GFW-Liste\"</string>\n    <string name=\"proxied_apps\">\"VPN-Modus je App\"</string>\n    <string name=\"proxied_apps_summary\">\"Konfiguriere VPN-Modus für einzelne Apps\"</string>\n    <string name=\"on\">\"Ein\"</string>\n    <string name=\"bypass_apps\">\"Umgehen\"</string>\n    <string name=\"bypass_apps_summary\">\"Aktiviere um ausgewählte Apps zu umgehen\"</string>\n    <string name=\"auto_connect\">\"Automatisch verbinden\"</string>\n    <string name=\"auto_connect_summary\">\"Starte Shadowsocks bei Systemstart/nach App-Update automatisch, falls es zuvor aktiv war\"</string>\n    <string name=\"tcp_fastopen_summary\">\"Umschalten benötigt eventuell ROOT-Zugriff\"</string>\n    <string name=\"tcp_fastopen_summary_unsupported\">\"Nicht unterstützte Kernel-Version: %s &lt; 3.7.1\"</string>\n    <string name=\"udp_dns\">\"Sende DNS über UDP\"</string>\n    <string name=\"udp_dns_summary\">\"Benötigt serverseitiges UDP-Forwarding\"</string>\n\n    <!-- notification category -->\n    <string name=\"forward_success\">\"Shadowsocks wurde gestartet.\"</string>\n    <string name=\"invalid_server\">\"Ungültiger Servername\"</string>\n    <string name=\"service_failed\">\"Verbindung zum Remote-Server fehlgeschlagen\"</string>\n    <string name=\"stop\">\"Stopp\"</string>\n    <string name=\"stopping\">\"Fahre herunter…\"</string>\n    <string name=\"reboot_required\">\"VPN-Dienst konnte nicht gestartet werden. Eventuell musst du dein Gerät neu starten.\"</string>\n    <string name=\"profile_invalid_input\">\"Kein gültiges Profil gefunden.\"</string>\n\n    <!-- alert category -->\n    <string name=\"profile_empty\">\"Bitte wähle ein Profil\"</string>\n    <string name=\"proxy_empty\">\"Proxy/Passwort sollte nicht leer sein\"</string>\n    <string name=\"connect\">\"Verbinden\"</string>\n\n    <!-- menu category -->\n    <string name=\"profiles\">\"Profile\"</string>\n    <string name=\"settings\">\"Einstellungen\"</string>\n    <string name=\"about\">\"Über diese App\"</string>\n    <string name=\"edit\">\"Bearbeiten\"</string>\n    <string name=\"share\">\"Teilen\"</string>\n    <string name=\"add_profile\">\"Profil hinzufügen\"</string>\n    <string name=\"action_apply_all\">\"Einstellungen für alle Profile übernehmen\"</string>\n    <string name=\"action_export\">\"In Zwischenablage exportieren\"</string>\n    <string name=\"action_import\">\"Aus Zwischenablage importieren\"</string>\n    <string name=\"action_export_msg\">\"Erfolgreich exportiert!\"</string>\n    <string name=\"action_export_err\">\"Export fehlgeschlagen.\"</string>\n    <string name=\"action_import_msg\">\"Erfolgreich importiert!\"</string>\n    <string name=\"action_import_err\">\"Import fehlgeschlagen.\"</string>\n\n    <!-- profile -->\n    <string name=\"profile_config\">\"Profil-Config\"</string>\n    <string name=\"delete\">\"Entfernen\"</string>\n    <string name=\"delete_confirm_prompt\">\"Bist du sicher, dass du dieses Profil entfernen möchtest?\"</string>\n    <string name=\"share_qr_nfc\">\"QR-Code\"</string>\n    <string name=\"add_profile_dialog\">\"Möchtest du dieses Shadowsocks-Profil hinzufügen?\"</string>\n    <string name=\"add_profile_methods_scan_qr_code\">\"QR-Code scannen\"</string>\n    <plurals name=\"removed\">\n        <item quantity=\"one\">\"Entfernt\"</item>\n        <item quantity=\"other\">\"%d Einträge entfernt\"</item>\n    </plurals>\n    <string name=\"undo\">\"Rückgängig\"</string>\n\n    <!-- tasker -->\n    <string name=\"toggle_service_state\">\"Dienst starten\"</string>\n    <string name=\"start_service_default\">\"Mit aktuellem Server verbinden\"</string>\n    <string name=\"start_service\">\"Mit %s verbinden\"</string>\n    <string name=\"stop_service\">\"Auf %s wechseln\"</string>\n    <string name=\"profile_default\">\"Aktuelles Profil verwenden\"</string>\n\n    <!-- status -->\n    <string name=\"sent\">\"Gesendet:\"</string>\n    <string name=\"received\">\"Empfangen:\"</string>\n\n    <!-- status -->\n    <string name=\"connecting\">\"Verbinde…\"</string>\n    <string name=\"vpn_connected\">\"Verbunden, tippe um Verbindung zu prüfen\"</string>\n    <string name=\"not_connected\">\"Nicht verbunden\"</string>\n\n    <!-- acl -->\n    <string name=\"custom_rules\">\"Benutzerdefinierte Regeln\"</string>\n    <string name=\"action_add_rule\">\"Regel(n) hinzufügen…\"</string>\n    <string name=\"edit_rule\">\"Regel bearbeiten\"</string>\n    <string name=\"route_entry_all\">\"Alle\"</string>\n    <string name=\"route_entry_bypass_lan\">\"LAN umgehen\"</string>\n    <string name=\"route_entry_bypass_chn\">\"Festlandchina umgehen\"</string>\n    <string name=\"route_entry_bypass_lan_chn\">\"LAN und Festlandchina umgehen\"</string>\n    <string name=\"route_entry_chinalist\">\"China-Liste\"</string>\n    <string name=\"acl_rule_templates_generic\">\"PCRE-Ausdruck für Subnets oder Hostnamen\"</string>\n    <string name=\"acl_rule_templates_domain\">\"Domain-Name und alle Subdomains\"</string>\n    <string name=\"plugin_configure\">\"Konfigurieren…\"</string>\n    <string name=\"plugin_disabled\">\"Deaktiviert\"</string>\n    <string name=\"plugin_unknown\">\"Unbekanntes Plugin %s\"</string>\n    <string name=\"plugin_untrusted\">\"Warnung: Das Plugin scheint aus einer nicht vertrauenswürdigen Quelle zu stammen.\"</string>\n    <string name=\"add_profile_scanner_permission_required\">\"Zum Einscannen des QR-Codes wird Kamerazugriff benötigt.\"</string>\n\n    <!-- notification category -->\n    <string name=\"service_vpn\">\"VPN-Dienst\"</string>\n    <string name=\"add_profile_methods_manual_settings\">\"Manuelle Einstellungen\"</string>\n\n    <!-- misc -->\n    <string name=\"advanced\">\"Fortgeschritten\"</string>\n\n    <!-- misc -->\n    <string name=\"service_mode\">\"Service-Modus\"</string>\n    <string name=\"service_mode_proxy\">\"Nur Proxy\"</string>\n    <string name=\"port_proxy\">\"SOCKS5 Proxy-Port\"</string>\n    <string name=\"port_local_dns\">\"Lokaler DNS-Port\"</string>\n    <string name=\"port_transproxy\">\"Transproxy-Port\"</string>\n    <string name=\"service_proxy\">\"Proxy-Dienst\"</string>\n    <string name=\"service_transproxy\">\"Transproxy-Dienst\"</string>\n    <string name=\"vpn_permission_denied\">\"Keine Berechtigung zum Einrichten eines VPN-Dienstes\"</string>\n    <string name=\"auto_connect_summary_v24\">\"Shadowsocks bei Systemstart aktivieren. Stattdessen wird always-on VPN empfohlen.\"</string>\n    <string name=\"direct_boot_aware\">\"Erlaube Umschalten während Gerät gesperrt ist\"</string>\n    <string name=\"direct_boot_aware_summary\">\"Das ausgewählte Profil wird so schlechter geschützt\"</string>\n    <string name=\"acl_rule_online_config\">\"URL zur Online-Konfiguration\"</string>\n    <string name=\"action_import_file\">\"Aus Datei importieren…\"</string>\n    <string name=\"night_mode\">\"Dark-Modus\"</string>\n    <string name=\"night_mode_system\">\"Nach Betriebssystem richten\"</string>\n    <string name=\"night_mode_auto\">\"Automatisch umschalten\"</string>\n    <string name=\"night_mode_on\">\"Ein\"</string>\n    <string name=\"night_mode_off\">\"Aus\"</string>\n    <string name=\"send_email\">\"E-Mail senden\"</string>\n    <string name=\"action_export_more\">\"Exportieren…\"</string>\n    <string name=\"action_export_file\">\"Als Datei exportieren…\"</string>\n    <string name=\"cleartext_http_warning\">\"Klartext HTTP-Traffic ist unsicher\"</string>\n    <string name=\"share_over_lan\">\"Über LAN teilen\"</string>\n    <string name=\"connection_test_pending\">\"Verbindung prüfen\"</string>\n    <string name=\"file_manager_missing\">\"Bitte installiere einen Dateimanager, z.B. MiXplorer\"</string>\n    <string name=\"tcp_fastopen_failure\">\"Umschalten fehlgeschlagen\"</string>\n    <string name=\"udp_fallback\">\"UDP-Fallback\"</string>\n    <string name=\"action_replace_file\">\"Aus Datei ersetzen…\"</string>\n    <string name=\"off\">\"Aus\"</string>\n    <string name=\"proxied_apps_mode\">\"Modus\"</string>\n    <string name=\"metered\">\"Datenlimit-Mitteilung\"</string>\n    <string name=\"metered_summary\">\"Teile Betriebssystem mit, dass VPN-Verbindung Datenlimit besitzt\"</string>\n    <plurals name=\"hosts_summary\">\n        <item quantity=\"one\">\"1 Hostname konfiguriert\"</item>\n        <item quantity=\"other\">\"%d Hostnamen konfiguriert\"</item>\n    </plurals>\n    <string name=\"add_subscription\">\"Subscription hinzufügen\"</string>\n    <string name=\"edit_subscription\">\"Subscription bearbeiten\"</string>\n    <string name=\"update_subscription\">\"Serverliste mithilfe Subscription aktualisieren\"</string>\n    <string name=\"service_subscription\">\"Subscription-Dienst\"</string>\n    <string name=\"service_subscription_working\">\"Synchronisiere Subscriptions… (%d von %d)\"</string>\n    <string name=\"service_subscription_finishing\">\"Gleich fertig...\"</string>\n    <string name=\"plugin_auto_connect_unlock_only\">\"Dieses Plugin funktioniert eventuell nicht mit \\\"Automatisch verbinden\\\"\"</string>\n</resources>"
  },
  {
    "path": "core/src/main/res/values-es/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n    Copyright (C) 2019 by Max Lv <max.c.lv@gmail.com>\n    Copyright (C) 2019 by Mygod Studio <contact-shadowsocks-android@mygod.be>\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n    DO NOT EDIT: This file was automagically generated by script.\n    If you are looking for contributing a translation, read this:\n    https://discourse.shadowsocks.org/t/poeditor-translation-main-thread/30\n-->\n\n<resources>\n    <string name=\"quick_toggle\">\"Alternar\"</string>\n    <string name=\"remote_dns\">\"DNS Remoto\"</string>\n    <string name=\"stat_summary\">\"Enviado: \\t\\t\\t\\t\\t%3$s\\t↑\\t%1$s\nRecibido: \\t%4$s\\t↓\\t%2$s\"</string>\n    <string name=\"connection_test_testing\">\"Probando…\"</string>\n    <string name=\"connection_test_available\">\"Éxito: El establecimiento de la comunicación HTTPS tomó %dms\"</string>\n    <string name=\"connection_test_error\">\"Fallo al detectar conexión a Internet: %s\"</string>\n    <string name=\"connection_test_fail\">\"Internet no disponible\"</string>\n    <string name=\"connection_test_error_status_code\">\"Código de error: #%d\"</string>\n\n    <!-- proxy category -->\n    <string name=\"profile_name\">\"Nombre de Perfil\"</string>\n    <string name=\"proxy\">\"Servidor\"</string>\n    <string name=\"remote_port\">\"Puerto Remoto\"</string>\n    <string name=\"sitekey\">\"Contraseña\"</string>\n    <string name=\"enc_method\">\"Método de Cifrado\"</string>\n\n    <!-- feature category -->\n    <string name=\"ipv6\">\"Ruta IPv6\"</string>\n    <string name=\"ipv6_summary\">\"Redireccionar tráfico IPv6 a ruta\"</string>\n    <string name=\"route_list\">\"Ruta\"</string>\n    <string name=\"route_entry_gfwlist\">\"Lista GFW\"</string>\n    <string name=\"proxied_apps\">\"Apps en modo VPN\"</string>\n    <string name=\"proxied_apps_summary\">\"Configurar modo VPN para las apps seleccionadas\"</string>\n    <string name=\"on\">\"Encendido\"</string>\n\n    <!-- Fuzzy -->\n    <string name=\"bypass_apps\">\"Modo Bypass\"</string>\n    <string name=\"auto_connect\">\"Conexión Automática\"</string>\n\n    <!-- Fuzzy -->\n    <string name=\"auto_connect_summary\">\"Activar Shadowsocks al iniciar\"</string>\n    <string name=\"tcp_fastopen_summary_unsupported\">\"Versión del Núcleo sin soporte: %s &lt; 3.7.1\"</string>\n    <string name=\"udp_dns\">\"Enviar DNS sobre UDP\"</string>\n\n    <!-- notification category -->\n    <string name=\"forward_success\">\"Shadowsocks inició.\"</string>\n    <string name=\"invalid_server\">\"Nombre de servidor inválido\"</string>\n    <string name=\"service_failed\">\"Fallo al conectar al servidor remoto\"</string>\n    <string name=\"stop\">\"Detener\"</string>\n    <string name=\"stopping\">\"Apagando…\"</string>\n    <string name=\"reboot_required\">\"Fallo al iniciar servicio VPN. Puede que tengas que reiniciar tu dispositivo.\"</string>\n    <string name=\"profile_invalid_input\">\"No se ha encontrado datos de perfil válidos.\"</string>\n\n    <!-- alert category -->\n    <string name=\"profile_empty\">\"Por favor selecciona un perfil\"</string>\n    <string name=\"proxy_empty\">\"Proxy/Contraseña no deberían estar vacíos\"</string>\n    <string name=\"connect\">\"Conectar\"</string>\n\n    <!-- menu category -->\n    <string name=\"profiles\">\"Perfiles\"</string>\n    <string name=\"settings\">\"Preferencias\"</string>\n    <string name=\"faq\">\"FAQ\"</string>\n    <string name=\"about\">\"Acerca de\"</string>\n    <string name=\"edit\">\"Editar\"</string>\n    <string name=\"share\">\"Compartir\"</string>\n    <string name=\"add_profile\">\"Agregar Perfil\"</string>\n    <string name=\"action_apply_all\">\"Aplicar preferencias a todos los Perfiles\"</string>\n    <string name=\"action_export\">\"Exportar a portapapeles\"</string>\n    <string name=\"action_import\">\"Importar desde portapapeles\"</string>\n    <string name=\"action_export_msg\">\"¡Exportado satisfactoriamente!\"</string>\n    <string name=\"action_export_err\">\"Fallo al exportar.\"</string>\n    <string name=\"action_import_msg\">\"¡Importado satisfactoriamente!\"</string>\n    <string name=\"action_import_err\">\"Fallo al importar.\"</string>\n\n    <!-- profile -->\n    <string name=\"profile_config\">\"Configuración de Perfil\"</string>\n    <string name=\"delete\">\"Remover\"</string>\n    <string name=\"delete_confirm_prompt\">\"¿Estás seguro de querer remover este perfil?\"</string>\n\n    <!-- Fuzzy -->\n    <string name=\"share_qr_nfc\">\"Código QR/NFC\"</string>\n    <string name=\"add_profile_dialog\">\"Agregar este Perfil Shadowsocks?\"</string>\n    <string name=\"add_profile_methods_scan_qr_code\">\"Escanear código QR\"</string>\n    <plurals name=\"removed\">\n        <item quantity=\"one\">\"Removido\"</item>\n        <item quantity=\"other\">\"%d elementos removidos\"</item>\n    </plurals>\n    <string name=\"undo\">\"Deshacer\"</string>\n\n    <!-- tasker -->\n    <string name=\"toggle_service_state\">\"Iniciar el servicio\"</string>\n    <string name=\"start_service_default\">\"Conectar al servidor actual\"</string>\n    <string name=\"start_service\">\"Conectar a %s\"</string>\n    <string name=\"stop_service\">\"Cambiar a %s\"</string>\n    <string name=\"profile_default\">\"Usar el perfil actual\"</string>\n\n    <!-- status -->\n    <string name=\"sent\">\"Enviado:\"</string>\n    <string name=\"received\">\"Recibido:\"</string>\n\n    <!-- status -->\n    <string name=\"connecting\">\"Conectando…\"</string>\n    <string name=\"vpn_connected\">\"Conectado, presiona para verificar la conexión\"</string>\n    <string name=\"not_connected\">\"No conectado\"</string>\n\n    <!-- acl -->\n    <string name=\"custom_rules\">\"Reglas personalizadas\"</string>\n    <string name=\"action_add_rule\">\"Agregar regla(s)…\"</string>\n    <string name=\"edit_rule\">\"Editar regla\"</string>\n    <string name=\"route_entry_all\">\"Todo\"</string>\n\n    <!-- plugin -->\n    <string name=\"plugin\">\"Complemento\"</string>\n    <string name=\"plugin_configure\">\"Configurar…\"</string>\n    <string name=\"plugin_disabled\">\"Deshabilitado\"</string>\n    <string name=\"plugin_unknown\">\"Complemento desconocido %s\"</string>\n    <string name=\"plugin_untrusted\">\"Precaución: Este complemento no parece venir de una fuente confiable.\"</string>\n    <string name=\"profile_plugin\">\"Complemento: %s\"</string>\n    <string name=\"add_profile_scanner_permission_required\">\"Se requiere permiso de cámara para escanear códigos QR.\"</string>\n\n    <!-- notification category -->\n    <string name=\"service_vpn\">\"Servicio VPN\"</string>\n    <string name=\"add_profile_methods_manual_settings\">\"Configuración manual\"</string>\n\n    <!-- misc -->\n    <string name=\"advanced\">\"Avanzado\"</string>\n\n    <!-- misc -->\n    <string name=\"service_mode\">\"Modo de servicio\"</string>\n    <string name=\"service_mode_proxy\">\"Sólo Proxy\"</string>\n    <string name=\"service_mode_vpn\">\"VPN\"</string>\n    <string name=\"port_proxy\">\"Puerto proxy SOCKS5\"</string>\n    <string name=\"port_local_dns\">\"Puerto DNS local\"</string>\n    <string name=\"service_proxy\">\"Servicio Proxy\"</string>\n    <string name=\"service_transproxy\">\"Servicio Transproxy\"</string>\n    <string name=\"vpn_permission_denied\">\"Permiso denegado al crear servicio VPN\"</string>\n    <string name=\"direct_boot_aware_summary\">\"La información del perfil seleccionado será menos protegida\"</string>\n    <string name=\"action_import_file\">\"Importar desde archivo…\"</string>\n    <string name=\"night_mode\">\"Modo nocturno\"</string>\n    <string name=\"night_mode_system\">\"Seguir sistema\"</string>\n    <string name=\"night_mode_auto\">\"Auto\"</string>\n    <string name=\"night_mode_on\">\"Encendido\"</string>\n    <string name=\"night_mode_off\">\"Apagado\"</string>\n    <string name=\"send_email\">\"Enviar email\"</string>\n    <string name=\"action_export_more\">\"Exportar…\"</string>\n    <string name=\"action_export_file\">\"Exportar a archivo…\"</string>\n    <string name=\"share_over_lan\">\"Compartir por LAN\"</string>\n    <string name=\"connection_test_pending\">\"Verificar conectividad\"</string>\n    <string name=\"file_manager_missing\">\"Por favor, instala un explorador de archivos como MiXplorer\"</string>\n    <string name=\"action_replace_file\">\"Reemplazar desde archivo…\"</string>\n</resources>"
  },
  {
    "path": "core/src/main/res/values-fa/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n    Copyright (C) 2019 by Max Lv <max.c.lv@gmail.com>\n    Copyright (C) 2019 by Mygod Studio <contact-shadowsocks-android@mygod.be>\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n    DO NOT EDIT: This file was automagically generated by script.\n    If you are looking for contributing a translation, read this:\n    https://discourse.shadowsocks.org/t/poeditor-translation-main-thread/30\n-->\n\n<resources>\n    <string name=\"app_name\">\"شدوساکس\"</string>\n    <string name=\"quick_toggle\">\"تغییر وضعیت\"</string>\n    <string name=\"remote_dns\">\"DNS از راه دور\"</string>\n    <string name=\"stat_summary\">\"ارسال: \\t\\t\\t\\t\\t%3$s\\t↑\\t%1$s\nدریافت: \\t%4$s\\t↓\\t%2$s\"</string>\n    <string name=\"connection_test_testing\">\"در حال آزمایش…\"</string>\n    <string name=\"connection_test_available\">\"موفقیت: دستیابی به HTTPS انجام شد. %d میلی‌ثانیه\"</string>\n    <string name=\"connection_test_error\">\"اتصال اینترنت شناسایی نشد: %s\"</string>\n    <string name=\"connection_test_fail\">\"ارتباط با اینترنت فراهم نیست\"</string>\n    <string name=\"connection_test_error_status_code\">\"کد خطا: #%d\"</string>\n\n    <!-- proxy category -->\n    <string name=\"profile_name\">\"نام پروفایل\"</string>\n    <string name=\"proxy\">\"سرور\"</string>\n    <string name=\"remote_port\">\"پورت سرور\"</string>\n    <string name=\"sitekey\">\"کلمه عبور\"</string>\n    <string name=\"enc_method\">\"روش رمزگذاری\"</string>\n\n    <!-- feature category -->\n    <string name=\"ipv6\">\"مسیر IPv6\"</string>\n    <string name=\"ipv6_summary\">\"ترافیک IPv6 را به سرور هدایت کن\"</string>\n    <string name=\"route_list\">\"مسیر\"</string>\n    <string name=\"route_entry_gfwlist\">\"لیست فیلترینگ\"</string>\n    <string name=\"proxied_apps\">\"برنامه های حالت VPN\"</string>\n    <string name=\"proxied_apps_summary\">\"تنظیم حالت VPN برای اپلیکیشن‌های انتخاب شده\"</string>\n    <string name=\"on\">\"روشن\"</string>\n    <string name=\"bypass_apps\">\"کنار گذاشتن\"</string>\n    <string name=\"bypass_apps_summary\">\"این گزینه را فعال کنید تا اپلیکیشن‌های انتخاب شده از VPN استفاده نکنند\"</string>\n    <string name=\"auto_connect\">\"وصل‌شدن اتوماتیک\"</string>\n    <string name=\"auto_connect_summary\">\"فعال‌شدن شدوساکس لحظه روشن‌شدن گوشی بروزرسانی شود اگر از قبل درحال اجرا بوده است\"</string>\n    <string name=\"tcp_fastopen_summary\">\"تغییر وضعیت ممکن است به مجوز ROOT نیاز داشته باشد\"</string>\n    <string name=\"tcp_fastopen_summary_unsupported\">\"نسخه هسته پشتیبانی نشده: %s &lt;3.7.1\"</string>\n    <string name=\"udp_dns\">\"ارسال DNS از طریق UDP\"</string>\n    <string name=\"udp_dns_summary\">\"نیاز به جابجایی UDP در سمت سرور دارد\"</string>\n\n    <!-- notification category -->\n    <string name=\"forward_success\">\"شدوساکس فعال شد.\"</string>\n    <string name=\"invalid_server\">\"آدرس سرور نامعتبر است\"</string>\n    <string name=\"service_failed\">\"اتصال به سرور ناموفق بود!\"</string>\n    <string name=\"stop\">\"متوقف کردن\"</string>\n    <string name=\"stopping\">\"خاموش شدن…\"</string>\n    <string name=\"reboot_required\">\"سرویس VPN شروع نشد. شاید لازم باشد دستگاه خود را Restart کنید.\"</string>\n    <string name=\"profile_invalid_input\">\"هیچ پروفایل معتبری یافت نشد!\"</string>\n\n    <!-- alert category -->\n    <string name=\"profile_empty\">\"لطفا یک پروفایل انتخاب کنید.\"</string>\n    <string name=\"proxy_empty\">\"پروکسی یا کلمه‌عبور نباید خالی باشند!\"</string>\n    <string name=\"connect\">\"اتصال\"</string>\n\n    <!-- menu category -->\n    <string name=\"profiles\">\"پروفایل‌ها\"</string>\n    <string name=\"settings\">\"تنظیمات\"</string>\n    <string name=\"faq\">\"سوالات متداول\"</string>\n    <string name=\"about\">\"درباره ما\"</string>\n    <string name=\"about_title\">\"شدوساکس %s\"</string>\n    <string name=\"edit\">\"ویرایش\"</string>\n    <string name=\"share\">\"به اشتراک گذاری\"</string>\n    <string name=\"add_profile\">\"افزودن پروفایل\"</string>\n    <string name=\"action_apply_all\">\"اعمال تنظیمات برای همه پروفایل‌ها\"</string>\n    <string name=\"action_export\">\"صدور به کلیپ‌بورد\"</string>\n    <string name=\"action_import\">\"ورود از کلیپ‌بورد\"</string>\n    <string name=\"action_export_msg\">\"صدور موفقیت‌آمیز!\"</string>\n    <string name=\"action_export_err\">\"صدور ناموفق!\"</string>\n    <string name=\"action_import_msg\">\"وارد کردن با موفقیت انجام شد!\"</string>\n    <string name=\"action_import_err\">\"خطا در هنگام وارد کردن!\"</string>\n\n    <!-- profile -->\n    <string name=\"profile_config\">\"تنظیمات پروفایل\"</string>\n    <string name=\"delete\">\"حذف\"</string>\n    <string name=\"delete_confirm_prompt\">\"آیا مطمئن هستید که می‌خواهید این پروفایل را حذف کنید؟\"</string>\n    <string name=\"share_qr_nfc\">\"کد QR\"</string>\n    <string name=\"add_profile_dialog\">\"این پروفایل شدوساکس اضافه شود؟\"</string>\n    <string name=\"add_profile_methods_scan_qr_code\">\"اسکن‌کردن کد QR\"</string>\n    <plurals name=\"removed\">\n        <item quantity=\"other\">\"%d مورد حذف شد\"</item>\n    </plurals>\n    <string name=\"undo\">\"بازگرداندن\"</string>\n\n    <!-- tasker -->\n    <string name=\"toggle_service_state\">\"فعال‌کردن سرویس\"</string>\n    <string name=\"start_service_default\">\"وصل‌شدن به سرور فعلی\"</string>\n    <string name=\"start_service\">\"وصل شدن به\"</string>\n    <string name=\"stop_service\">\"تغییر به\"</string>\n    <string name=\"profile_default\">\"استفاده از پروفایل فعلی\"</string>\n\n    <!-- status -->\n    <string name=\"sent\">\"ارسال:\"</string>\n    <string name=\"received\">\"دریافت شده:\"</string>\n\n    <!-- status -->\n    <string name=\"connecting\">\"در حال اتصال…\"</string>\n    <string name=\"vpn_connected\">\"وصل شد، برای بررسی اتصال ضربه (Tap) بزنید.\"</string>\n    <string name=\"not_connected\">\"اتصال برقرار نیست!\"</string>\n\n    <!-- acl -->\n    <string name=\"custom_rules\">\"قوانین سفارشی\"</string>\n    <string name=\"action_add_rule\">\"اضافه کردن قوانین\"</string>\n    <string name=\"edit_rule\">\"ویرایش قانون\"</string>\n    <string name=\"route_entry_all\">\"همه\"</string>\n    <string name=\"route_entry_bypass_lan\">\"صرف‌نظر کردن از شبکه داخلی\"</string>\n    <string name=\"route_entry_bypass_chn\">\"صرفه‌نظر کردن از سایت‌های سرزمین چین\"</string>\n    <string name=\"route_entry_bypass_lan_chn\">\"صرف‌نظر کردن از شبکه داخلی و سایت‌های سرزمین چین\"</string>\n    <string name=\"route_entry_chinalist\">\"فهرست سرزمین چین\"</string>\n    <string name=\"acl_rule_templates_generic\">\"زیر شبکه یا نام میزبان الگوی PCRE\"</string>\n    <string name=\"acl_rule_templates_domain\">\"نام دامنه و تمام نامهای زیر دامنه آن\"</string>\n\n    <!-- plugin -->\n    <string name=\"plugin\">\"پلاگین\"</string>\n    <string name=\"plugin_configure\">\"تنظیم...\"</string>\n    <string name=\"plugin_disabled\">\"غیر فعال\"</string>\n    <string name=\"plugin_unknown\">\"پلاگین ناشناخته %s\"</string>\n    <string name=\"plugin_untrusted\">\"هشدار: به نظر نمی رسد که این افزونه از یک منبع معتبر شناخته شده باشد.\"</string>\n    <string name=\"profile_plugin\">\"پلاگین %s\"</string>\n    <string name=\"add_profile_scanner_permission_required\">\"مجوز دسترسی به دوربین برای اسکن کردن کد QR مورد نیاز است.\"</string>\n\n    <!-- notification category -->\n    <string name=\"service_vpn\">\"سرویس VPN\"</string>\n    <string name=\"add_profile_methods_manual_settings\">\"تنظیمات دستی\"</string>\n\n    <!-- misc -->\n    <string name=\"advanced\">\"پیشرفته\"</string>\n\n    <!-- misc -->\n    <string name=\"service_mode\">\"حالت سرویس\"</string>\n    <string name=\"service_mode_proxy\">\"فقط پروکسی\"</string>\n    <string name=\"service_mode_transproxy\">\"ترانس‌پروکسی\"</string>\n    <string name=\"port_proxy\">\"پورت پروکسی SOCKS5\"</string>\n    <string name=\"port_local_dns\">\"پورت DNS محلی\"</string>\n    <string name=\"port_transproxy\">\"پورت ترانس‌پروکسی\"</string>\n    <string name=\"service_proxy\">\"سرویس پروکسی\"</string>\n    <string name=\"service_transproxy\">\"سرویس ترانس‌پروکسی\"</string>\n    <string name=\"vpn_permission_denied\">\"مجوز برای ساخت VPN فراهم نیست\"</string>\n    <string name=\"auto_connect_summary_v24\">\"شدوساکس را از ابتدا فعال کن. توصیه می‌شود که به جای این گزینه از گزینه Always-ON VPN استفاده شود\"</string>\n    <string name=\"direct_boot_aware\">\"مجاز به تغییر در صفحه‌ی قفل\"</string>\n    <string name=\"direct_boot_aware_summary\">\"اطلاعات پروفایل انتخابی شما کمتر محافظت می شود\"</string>\n    <string name=\"acl_rule_online_config\">\"URL به پیکربندی آنلاین\"</string>\n    <string name=\"action_import_file\">\"وارد کردن فایل‌ از...\"</string>\n    <string name=\"night_mode\">\"حالت شب\"</string>\n    <string name=\"night_mode_system\">\"سیستم را دنبال کنید\"</string>\n    <string name=\"night_mode_auto\">\"خودکار\"</string>\n    <string name=\"night_mode_on\">\"روشن\"</string>\n    <string name=\"night_mode_off\">\"خاموش\"</string>\n    <string name=\"send_email\">\"ارسال ایمیل\"</string>\n    <string name=\"action_export_more\">\"صادر کردن...\"</string>\n    <string name=\"action_export_file\">\"صادر کردن به پرونده...\"</string>\n    <string name=\"cleartext_http_warning\">\"Cleartext ترافیک HTTP ناامن است\"</string>\n    <string name=\"share_over_lan\">\"اشتراک‌گذاری از طریق LAN\"</string>\n    <string name=\"connection_test_pending\">\"بررسی اتصال\"</string>\n    <string name=\"file_manager_missing\">\"لطفاً یک فایل منیجر مانند MiXplorer نصب کنید\"</string>\n    <string name=\"tcp_fastopen_failure\">\"خطا در تغییر وضعیت\"</string>\n    <string name=\"action_replace_file\">\"جایگزین کردن با فایل...\"</string>\n    <string name=\"off\">\"خاموش\"</string>\n    <string name=\"proxied_apps_mode\">\"حالت\"</string>\n    <string name=\"metered\">\"اشاره شده\"</string>\n    <string name=\"metered_summary\">\"سیستم اشاره برای درمان VPN به عنوان اندازه گیری شده\"</string>\n    <plurals name=\"hosts_summary\">\n        <item quantity=\"other\">\"نام میزبان پیکربندی شده است\"</item>\n    </plurals>\n\n    <!-- subscriptions -->\n    <string name=\"subscriptions\">\"اشتراک\"</string>\n    <string name=\"add_subscription\">\"ایجاد اشتراک\"</string>\n    <string name=\"edit_subscription\">\"ویرایش اشتراک\"</string>\n    <string name=\"update_subscription\">\"سرورها را از اشتراک تازه کنید\"</string>\n    <string name=\"service_subscription\">\"خدمات اشتراک\"</string>\n    <string name=\"service_subscription_working\">\"همگام سازی اشتراک ها… (%d از%d)\"</string>\n    <string name=\"service_subscription_finishing\">\"درحال پایان دادن...\"</string>\n    <string name=\"plugin_auto_connect_unlock_only\">\"این پلاگین ممکن است با اتصال خودکار کار نکند\"</string>\n</resources>"
  },
  {
    "path": "core/src/main/res/values-fr/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n    Copyright (C) 2019 by Max Lv <max.c.lv@gmail.com>\n    Copyright (C) 2019 by Mygod Studio <contact-shadowsocks-android@mygod.be>\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n    DO NOT EDIT: This file was automagically generated by script.\n    If you are looking for contributing a translation, read this:\n    https://discourse.shadowsocks.org/t/poeditor-translation-main-thread/30\n-->\n\n<resources>\n    <string name=\"quick_toggle\">\"Basculer\"</string>\n    <string name=\"remote_dns\">\"DNS Distant\"</string>\n    <string name=\"stat_summary\">\"Envoyé : \\t%3$s\\t↑\\t%1$s\nReçu : \\t\\t\\t%4$s\\t↓\\t%2$s\"</string>\n    <string name=\"connection_test_testing\">\"Essai…\"</string>\n    <string name=\"connection_test_available\">\"Succès : le handshake HTTPS a pris %dms\"</string>\n    <string name=\"connection_test_error\">\"Impossible de détecter la connexion Internet :%s\"</string>\n    <string name=\"connection_test_fail\">\"Internet Indisponible\"</string>\n    <string name=\"connection_test_error_status_code\">\"Code de l'Erreur : #%d\"</string>\n\n    <!-- proxy category -->\n    <string name=\"profile_name\">\"Nom du Profil\"</string>\n    <string name=\"proxy\">\"Serveur\"</string>\n    <string name=\"remote_port\">\"Port Distant\"</string>\n    <string name=\"sitekey\">\"Mot de passe\"</string>\n    <string name=\"enc_method\">\"Méthode d'Encryption\"</string>\n\n    <!-- feature category -->\n    <string name=\"ipv6\">\"Route IPv6\"</string>\n    <string name=\"ipv6_summary\">\"Rediriger le trafic IPv6 vers le serveur distant\"</string>\n    <string name=\"route_list\">\"Route\"</string>\n    <string name=\"route_entry_gfwlist\">\"Liste GFW\"</string>\n    <string name=\"proxied_apps\">\"Mode VPN Apps\"</string>\n    <string name=\"proxied_apps_summary\">\"Configurer le mode VPN pour les applications sélectionnées\"</string>\n    <string name=\"on\">\"Activé\"</string>\n\n    <!-- Fuzzy -->\n    <string name=\"bypass_apps\">\"Mode exclusion\"</string>\n    <string name=\"bypass_apps_summary\">\"Activer cette option pour exclure les applications sélectionnées\"</string>\n    <string name=\"auto_connect\">\"Connection auto\"</string>\n\n    <!-- Fuzzy -->\n    <string name=\"auto_connect_summary\">\"Activer Shadowsocks au démarrage\"</string>\n\n    <!-- Fuzzy -->\n    <string name=\"tcp_fastopen_summary\">\"Activer nécessite la permission ROOT\"</string>\n    <string name=\"tcp_fastopen_summary_unsupported\">\"Version du noyau non supportée : %s &lt;3.7.1\"</string>\n\n    <!-- Fuzzy -->\n    <string name=\"udp_dns_summary\">\"Faire suivre toutes les requêtes DNS au serveur distant\"</string>\n\n    <!-- notification category -->\n    <string name=\"forward_success\">\"Shadowsocks a démarré\"</string>\n    <string name=\"invalid_server\">\"Nom de serveur invalide\"</string>\n    <string name=\"service_failed\">\"Échec de la connexion au serveur distant\"</string>\n    <string name=\"stop\">\"Stopper\"</string>\n    <string name=\"stopping\">\"Arrêt en cours…\"</string>\n    <string name=\"reboot_required\">\"Impossible de démarrer le service VPN. Vous devrez peut-être redémarrer votre appareil.\"</string>\n    <string name=\"profile_invalid_input\">\"Pas de donnée de profil valide trouvée.\"</string>\n\n    <!-- alert category -->\n    <string name=\"profile_empty\">\"Veuillez sélectionner un profil\"</string>\n    <string name=\"proxy_empty\">\"Le mot de passe/proxy ne doit pas être vide\"</string>\n    <string name=\"connect\">\"Connexion\"</string>\n\n    <!-- menu category -->\n    <string name=\"profiles\">\"Profils\"</string>\n    <string name=\"settings\">\"Paramètres\"</string>\n    <string name=\"about\">\"À propos\"</string>\n    <string name=\"edit\">\"Éditer\"</string>\n    <string name=\"share\">\"Partager\"</string>\n    <string name=\"add_profile\">\"Ajouter un Profil\"</string>\n    <string name=\"action_apply_all\">\"Appliquer les Paramètres à tous les Profils\"</string>\n    <string name=\"action_export\">\"Exporter vers le presse-papiers\"</string>\n    <string name=\"action_import\">\"Importer depuis le presse-papiers\"</string>\n    <string name=\"action_export_msg\">\"Exporté avec succès !\"</string>\n    <string name=\"action_export_err\">\"Échec de l'exportation\"</string>\n    <string name=\"action_import_msg\">\"Importé avec succès !\"</string>\n    <string name=\"action_import_err\">\"Échec de l’importation.\"</string>\n\n    <!-- profile -->\n    <string name=\"profile_config\">\"Config profil\"</string>\n    <string name=\"delete\">\"Supprimer\"</string>\n    <string name=\"delete_confirm_prompt\">\"Êtes-vous sûr de vouloir supprimer ce profil?\"</string>\n\n    <!-- Fuzzy -->\n    <string name=\"share_qr_nfc\">\"QR Code/NFC\"</string>\n    <string name=\"add_profile_dialog\">\"Ajouter ce profil Shadowsocks?\"</string>\n    <string name=\"add_profile_methods_scan_qr_code\">\"Scanner le QR Code\"</string>\n    <plurals name=\"removed\">\n        <item quantity=\"one\">\"Supprimé\"</item>\n        <item quantity=\"other\">\"%d éléments supprimés\"</item>\n    </plurals>\n    <string name=\"undo\">\"Annuler\"</string>\n\n    <!-- tasker -->\n    <string name=\"toggle_service_state\">\"Démarrer le service\"</string>\n    <string name=\"start_service_default\">\"Se connecter au serveur courant\"</string>\n    <string name=\"start_service\">\"Se connecter à %s\"</string>\n    <string name=\"stop_service\">\"Basculer sur %s\"</string>\n    <string name=\"profile_default\">\"Utiliser le profil actuel\"</string>\n\n    <!-- status -->\n    <string name=\"sent\">\"Envoyé :\"</string>\n    <string name=\"received\">\"Reçu :\"</string>\n\n    <!-- status -->\n    <string name=\"connecting\">\"Connexion…\"</string>\n    <string name=\"vpn_connected\">\"Connecté, toucher pour vérifier la connexion\"</string>\n    <string name=\"not_connected\">\"Non connecté\"</string>\n\n    <!-- acl -->\n    <string name=\"custom_rules\">\"Règles personnalisées\"</string>\n    <string name=\"action_add_rule\">\"Ajouter une/des règle(s)\"</string>\n    <string name=\"edit_rule\">\"Modifier une règle\"</string>\n    <string name=\"route_entry_all\">\"Toutes\"</string>\n    <string name=\"route_entry_bypass_lan\">\"Exclure le LAN\"</string>\n    <string name=\"route_entry_bypass_chn\">\"Exclure la Chine continentale\"</string>\n    <string name=\"route_entry_bypass_lan_chn\">\"Exclure LAN et Chine continentale\"</string>\n    <string name=\"acl_rule_templates_generic\">\"Pattern PCRE sous-réseau ou hôte\"</string>\n    <string name=\"acl_rule_templates_domain\">\"Nom de domaine et tous ses noms de sous-domaines\"</string>\n    <string name=\"plugin_configure\">\"Configurer…\"</string>\n    <string name=\"plugin_disabled\">\"Désactivé\"</string>\n    <string name=\"plugin_unknown\">\"Plugin inconnu %s\"</string>\n    <string name=\"plugin_untrusted\">\"Attention : ce plugin ne semble pas provenir d'une source fiable reconnue.\"</string>\n    <string name=\"profile_plugin\">\"Plugin : %s\"</string>\n    <string name=\"add_profile_scanner_permission_required\">\"La permission Appareil photo est nécessaire pour scanner le QR code.\"</string>\n\n    <!-- notification category -->\n    <string name=\"service_vpn\">\"Service VPN\"</string>\n    <string name=\"add_profile_methods_manual_settings\">\"Paramètres manuels\"</string>\n\n    <!-- misc -->\n    <string name=\"advanced\">\"Avancé\"</string>\n\n    <!-- misc -->\n    <string name=\"service_mode\">\"Mode Service\"</string>\n    <string name=\"service_mode_proxy\">\"Proxy seul\"</string>\n    <string name=\"port_proxy\">\"Port proxy SOCKS5\"</string>\n    <string name=\"port_local_dns\">\"Port DNS local\"</string>\n    <string name=\"port_transproxy\">\"Port Transproxy\"</string>\n    <string name=\"service_proxy\">\"Service Proxy\"</string>\n    <string name=\"service_transproxy\">\"Service Transproxy\"</string>\n    <string name=\"vpn_permission_denied\">\"Permission de créer un service VPN refusée\"</string>\n    <string name=\"auto_connect_summary_v24\">\"Activer Shadowsocks au démarrage. Plutôt recommandé d'utiliser le VPN permanent\"</string>\n    <string name=\"direct_boot_aware\">\"Activation-Désactivation sur écran verrouillé\"</string>\n    <string name=\"direct_boot_aware_summary\">\"Vos informations de profil sélectionnées seront moins protégées\"</string>\n    <string name=\"acl_rule_online_config\">\"URL de config en ligne\"</string>\n    <string name=\"action_import_file\">\"Importer depuis un fichier…\"</string>\n    <string name=\"night_mode\">\"Mode nuit\"</string>\n    <string name=\"night_mode_system\">\"Suivre la config système\"</string>\n    <string name=\"send_email\">\"Envoyer un email\"</string>\n    <string name=\"action_export_more\">\"Exporter…\"</string>\n    <string name=\"action_export_file\">\"Exporter dans un fichier…\"</string>\n    <string name=\"cleartext_http_warning\">\"Le trafic HTTP en clair n'est pas sécurisé\"</string>\n    <string name=\"share_over_lan\">\"Partager sur le réseau local\"</string>\n    <string name=\"connection_test_pending\">\"Vérifier la connectivité\"</string>\n    <string name=\"file_manager_missing\">\"Veuillez installer un gestionnaire de fichier tel que MiXplorer\"</string>\n</resources>"
  },
  {
    "path": "core/src/main/res/values-ja/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n    Copyright (C) 2019 by Max Lv <max.c.lv@gmail.com>\n    Copyright (C) 2019 by Mygod Studio <contact-shadowsocks-android@mygod.be>\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n    DO NOT EDIT: This file was automagically generated by script.\n    If you are looking for contributing a translation, read this:\n    https://discourse.shadowsocks.org/t/poeditor-translation-main-thread/30\n-->\n\n<resources>\n    <string name=\"quick_toggle\">\"ON/OFF\"</string>\n    <string name=\"remote_dns\">\"リモートDNS\"</string>\n    <string name=\"stat_summary\">\"送信済み: \\t%3$s\\t↑\\t%1$s/s\n受信済み: \\t%4$s\\t↓\\t%2$s/s\"</string>\n    <string name=\"connection_test_testing\">\"テスト中…\"</string>\n\n    <!-- Fuzzy -->\n    <string name=\"connection_test_available\">\"成功: %dmsの遅延\"</string>\n    <string name=\"connection_test_error\">\"失敗しました：%s\"</string>\n    <string name=\"connection_test_fail\">\"インターネット利用不可\"</string>\n    <string name=\"connection_test_error_status_code\">\"ステータスコード無効: #%d\"</string>\n\n    <!-- proxy category -->\n    <string name=\"profile_name\">\"サーバー名\"</string>\n    <string name=\"proxy\">\"サーバーアドレス\"</string>\n    <string name=\"remote_port\">\"リモートポート\"</string>\n    <string name=\"sitekey\">\"パスワード\"</string>\n    <string name=\"enc_method\">\"暗号化方式\"</string>\n\n    <!-- feature category -->\n    <string name=\"ipv6\">\"IPv6 プロキシ\"</string>\n    <string name=\"ipv6_summary\">\"リモートサーバーに IPv6 パケットを転送\"</string>\n    <string name=\"route_list\">\"プロキシ方式\"</string>\n    <string name=\"route_entry_gfwlist\">\"中国本土からアクセス不可なアドレス以外を迂回する\"</string>\n    <string name=\"proxied_apps\">\"アプリ別のVPNモードを使用\"</string>\n    <string name=\"proxied_apps_summary\">\"アプリ別のVPNモードを設定\"</string>\n    <string name=\"on\">\"ON\"</string>\n\n    <!-- Fuzzy -->\n    <string name=\"bypass_apps\">\"バイパスモード（迂回モード）\"</string>\n    <string name=\"bypass_apps_summary\">\"このモードを選択した場合、指定したアプリのパケットはプロキシを経由しない\"</string>\n    <string name=\"auto_connect\">\"自動接続\"</string>\n\n    <!-- Fuzzy -->\n    <string name=\"auto_connect_summary\">\"システム起動時にバックグラウンドで本サービスを開始\"</string>\n\n    <!-- Fuzzy -->\n    <string name=\"tcp_fastopen_summary\">\"使用するには ROOT 権限が必要\"</string>\n    <string name=\"tcp_fastopen_summary_unsupported\">\"ご利用のカーネルバージョンはサポートしておりません：%s &lt; 3.7.1\"</string>\n\n    <!-- Fuzzy -->\n    <string name=\"udp_dns\">\"DNS 転送\"</string>\n\n    <!-- Fuzzy -->\n    <string name=\"udp_dns_summary\">\"DNS プロトコルでリモードサーバーにパケットを転送\"</string>\n\n    <!-- notification category -->\n    <string name=\"forward_success\">\"バックグラウンドでサービスを開始しました\"</string>\n    <string name=\"invalid_server\">\"サーバーが無効です\"</string>\n    <string name=\"service_failed\">\"リモートサーバーに接続できません\"</string>\n    <string name=\"stop\">\"中止\"</string>\n    <string name=\"stopping\">\"停止中……\"</string>\n    <string name=\"vpn_error\">\"バックグランドサービスの起動に失敗しました：%s\"</string>\n    <string name=\"reboot_required\">\"VPN サービスの起動に失敗しました、デバイスの再起動を試みて下さい\"</string>\n    <string name=\"profile_invalid_input\">\"有効なプロファイルが見つかりません\"</string>\n\n    <!-- alert category -->\n    <string name=\"profile_empty\">\"プロファイルを選択して下さい\"</string>\n    <string name=\"proxy_empty\">\"サーバアドレスやパスワードの入力が必要です\"</string>\n    <string name=\"connect\">\"接続\"</string>\n\n    <!-- menu category -->\n    <string name=\"profiles\">\"プロファイル\"</string>\n    <string name=\"settings\">\"オプション設定\"</string>\n    <string name=\"faq\">\"よくある質問\"</string>\n    <string name=\"about\">\"本アプリについて\"</string>\n    <string name=\"edit\">\"編集\"</string>\n    <string name=\"share\">\"共有\"</string>\n    <string name=\"add_profile\">\"プロファイルを追加\"</string>\n    <string name=\"action_apply_all\">\"設定をすべてのプロファイルに適応する\"</string>\n    <string name=\"action_export\">\"クリップボードに出力\"</string>\n    <string name=\"action_import\">\"クリップボードからインポート\"</string>\n    <string name=\"action_export_msg\">\"クリップボードの出力に成功しました\"</string>\n    <string name=\"action_export_err\">\"クリップボードの出力に失敗しました\"</string>\n    <string name=\"action_import_msg\">\"インポートに成功しました\"</string>\n    <string name=\"action_import_err\">\"インポートに失敗しました\"</string>\n\n    <!-- profile -->\n    <string name=\"profile_config\">\"プロファイル編集\"</string>\n    <string name=\"delete\">\"削除\"</string>\n    <string name=\"delete_confirm_prompt\">\"このプロファイルを削除しますか\"</string>\n\n    <!-- Fuzzy -->\n    <string name=\"share_qr_nfc\">\"QR コード / NFC\"</string>\n    <string name=\"add_profile_dialog\">\"Shadowsocks用プロファイルを追加しますか\"</string>\n    <string name=\"add_profile_methods_scan_qr_code\">\"QR コードを読み取る\"</string>\n    <plurals name=\"removed\">\n        <item quantity=\"other\">\"削除しました\n%d 個のアイテムを削除しました\"</item>\n    </plurals>\n    <string name=\"undo\">\"元に戻す\"</string>\n\n    <!-- tasker -->\n    <string name=\"toggle_service_state\">\"サービスを開始\"</string>\n    <string name=\"start_service_default\">\"現在のサーバーに接続する\"</string>\n    <string name=\"start_service\">\"%s に接続\"</string>\n    <string name=\"stop_service\">\"%s に切り替え\"</string>\n    <string name=\"profile_default\">\"現在のプロファイルを使用する\"</string>\n\n    <!-- status -->\n    <string name=\"sent\">\"送信済み:\"</string>\n    <string name=\"received\">\"受信済み:\"</string>\n\n    <!-- status -->\n    <string name=\"connecting\">\"接続中…\"</string>\n    <string name=\"vpn_connected\">\"接続済み、タップして接続状況をチェック\"</string>\n    <string name=\"not_connected\">\"未接続\"</string>\n\n    <!-- acl -->\n    <string name=\"custom_rules\">\"カスタムルール\"</string>\n    <string name=\"action_add_rule\">\"ルールを追加…\"</string>\n    <string name=\"edit_rule\">\"ルールを編集\"</string>\n    <string name=\"route_entry_all\">\"すべて\"</string>\n    <string name=\"route_entry_bypass_lan\">\"LAN アドレスを迂回する\"</string>\n    <string name=\"route_entry_bypass_chn\">\"中国本土のアドレスを迂回する\"</string>\n    <string name=\"route_entry_bypass_lan_chn\">\"LAN 及び中国本土のアドレスを迂回する\"</string>\n    <string name=\"route_entry_chinalist\">\"中国本土のアドレス以外を迂回する\"</string>\n    <string name=\"acl_rule_templates_generic\">\"サブネットまたはホスト名のPCREパターン\"</string>\n    <string name=\"acl_rule_templates_domain\">\"ドメイン及び全てのサブドメイン\"</string>\n\n    <!-- plugin -->\n    <string name=\"plugin\">\"プラグイン\"</string>\n    <string name=\"plugin_configure\">\"設定…\"</string>\n    <string name=\"plugin_disabled\">\"無効\"</string>\n    <string name=\"plugin_unknown\">\"不明なプラグイン %s\"</string>\n    <string name=\"plugin_untrusted\">\"警告：このプラグインは信頼されていないソースからの可能性があります\"</string>\n    <string name=\"profile_plugin\">\"プラグイン: %s\"</string>\n    <string name=\"add_profile_scanner_permission_required\">\"QRコードをスキャンするにはカメラ権限が必要です。\"</string>\n\n    <!-- notification category -->\n    <string name=\"service_vpn\">\"VPNサービス\"</string>\n    <string name=\"add_profile_methods_manual_settings\">\"手動設定\"</string>\n\n    <!-- misc -->\n    <string name=\"advanced\">\"アドバンス\"</string>\n\n    <!-- misc -->\n    <string name=\"service_mode\">\"サービスモード\"</string>\n    <string name=\"service_mode_proxy\">\"プロキシのみ\"</string>\n    <string name=\"service_mode_transproxy\">\"トランスプロキシ\"</string>\n    <string name=\"port_proxy\">\"SOCKS5プロキシポート\"</string>\n    <string name=\"port_local_dns\">\"ローカルDNSポート\"</string>\n    <string name=\"port_transproxy\">\"トランスプロキシポート\"</string>\n    <string name=\"service_proxy\">\"プロキシサービス\"</string>\n    <string name=\"service_transproxy\">\"トランスプロキシサービス\"</string>\n    <string name=\"vpn_permission_denied\">\"VPNサービス作成のアクセス許可が拒否されました\"</string>\n    <string name=\"auto_connect_summary_v24\">\"起動時にShadowsockを有効。 VPN常時接続の使用をお勧めします\"</string>\n    <string name=\"direct_boot_aware\">\"ロック画面の切り替えを許可する\"</string>\n    <string name=\"direct_boot_aware_summary\">\"選択されたプロファイル情報はより少ない保護を受けることになります\"</string>\n    <string name=\"acl_rule_online_config\">\"オンライン設定のURL\"</string>\n    <string name=\"action_import_file\">\"ファイルからのインポート\"</string>\n    <string name=\"night_mode\">\"夜間モード\"</string>\n    <string name=\"night_mode_system\">\"システムに基づく\"</string>\n    <string name=\"night_mode_auto\">\"オート\"</string>\n    <string name=\"night_mode_on\">\"開く\"</string>\n    <string name=\"night_mode_off\">\"閉じる\"</string>\n    <string name=\"send_email\">\"電子メール送信\"</string>\n    <string name=\"action_export_more\">\"エクスポート\"</string>\n    <string name=\"action_export_file\">\"ファイルへエクスポート\"</string>\n    <string name=\"cleartext_http_warning\">\"クリアテキスト（平文）通信は安全ではありません\"</string>\n    <string name=\"share_over_lan\">\"LAN経由でシェア\"</string>\n    <string name=\"connection_test_pending\">\"接続チェック中\"</string>\n    <string name=\"file_manager_missing\">\"ファイルマネージャーをインストールしてください（MiXplorerなど）\"</string>\n    <string name=\"tcp_fastopen_failure\">\"切り替え失敗\"</string>\n    <string name=\"udp_fallback\">\"UDPフォールバック\"</string>\n    <string name=\"action_replace_file\">\"ファイルから置き換え\"</string>\n    <string name=\"off\">\"オフ\"</string>\n    <string name=\"proxied_apps_mode\">\"モード\"</string>\n    <string name=\"metered\">\"従量制提示\"</string>\n    <string name=\"metered_summary\">\"VPNは従量制であることをシステムに知らせる\"</string>\n    <plurals name=\"hosts_summary\">\n        <item quantity=\"other\">\"設定された%dホスト名\"</item>\n    </plurals>\n\n    <!-- subscriptions -->\n    <string name=\"subscriptions\">\"購読する\"</string>\n    <string name=\"add_subscription\">\"サブスクリプションを追加\"</string>\n    <string name=\"edit_subscription\">\"サブスクリプションを編集\"</string>\n    <string name=\"update_subscription\">\"サブスクリプションを更新\"</string>\n    <string name=\"service_subscription\">\"サブスクリプションサービス\"</string>\n    <string name=\"service_subscription_working\">\"サブスクリプションの更新（%d / %d）\"</string>\n    <string name=\"service_subscription_finishing\">\"サブスクリプション更新\"</string>\n</resources>"
  },
  {
    "path": "core/src/main/res/values-ko/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n    Copyright (C) 2019 by Max Lv <max.c.lv@gmail.com>\n    Copyright (C) 2019 by Mygod Studio <contact-shadowsocks-android@mygod.be>\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n    DO NOT EDIT: This file was automagically generated by script.\n    If you are looking for contributing a translation, read this:\n    https://discourse.shadowsocks.org/t/poeditor-translation-main-thread/30\n-->\n\n<resources>\n    <string name=\"quick_toggle\">\"켜기/끄기\"</string>\n    <string name=\"remote_dns\">\"원격 DNS\"</string>\n    <string name=\"stat_summary\">\"송신: \\t%3$s\\t↑\\t%1$s/s\n수신: \\t%4$s\\t↓\\t%2$s/s\"</string>\n    <string name=\"connection_test_testing\">\"검사 중…\"</string>\n    <string name=\"connection_test_error\">\"인터넷 연결을 찾을 수 없습니다: %s\"</string>\n    <string name=\"connection_test_fail\">\"인터넷에 연결할 수 없습니다\"</string>\n    <string name=\"connection_test_error_status_code\">\"오류 코드: #%d\"</string>\n\n    <!-- proxy category -->\n    <string name=\"profile_name\">\"프로필 이름\"</string>\n    <string name=\"proxy\">\"서버 주소\"</string>\n    <string name=\"remote_port\">\"원격 포트\"</string>\n    <string name=\"sitekey\">\"비밀번호\"</string>\n    <string name=\"enc_method\">\"암호화 방법\"</string>\n\n    <!-- feature category -->\n    <string name=\"ipv6\">\"IPv6 라우팅\"</string>\n    <string name=\"ipv6_summary\">\"IPv6 트래픽도 원격으로 리다이렉트 합니다\"</string>\n    <string name=\"route_list\">\"라우팅 대상\"</string>\n    <string name=\"route_entry_gfwlist\">\"GFW 리스트\"</string>\n\n    <!-- Fuzzy -->\n    <string name=\"proxied_apps\">\"원하는 앱만 프락시 적용하기\"</string>\n    <string name=\"proxied_apps_summary\">\"선택한 앱에만 프락시를 적용합니다\"</string>\n    <string name=\"on\">\"활성화\"</string>\n\n    <!-- Fuzzy -->\n    <string name=\"bypass_apps\">\"선택된 앱들만 프록시 적용 제외하기\"</string>\n    <string name=\"bypass_apps_summary\">\"이 옵션을 활성화하면 선택된 앱들은 프락시를 사용하지 않습니다\"</string>\n    <string name=\"auto_connect\">\"자동 접속\"</string>\n\n    <!-- Fuzzy -->\n    <string name=\"auto_connect_summary\">\"장치가 켜질 때 Shadowsocks를 자동으로 활성화합니다\"</string>\n\n    <!-- Fuzzy -->\n    <string name=\"tcp_fastopen_summary\">\"루트 권한이 필요합니다\"</string>\n    <string name=\"tcp_fastopen_summary_unsupported\">\"지원하지 않는 버전의 커널입니다: %s &lt; 3.7.1\"</string>\n\n    <!-- Fuzzy -->\n    <string name=\"udp_dns\">\"DNS 포워딩\"</string>\n\n    <!-- Fuzzy -->\n    <string name=\"udp_dns_summary\">\"모든 DNS 요청을 외부로 포워딩 합니다\"</string>\n\n    <!-- notification category -->\n    <string name=\"forward_success\">\"Shadowsocks가 시작되었습니다\"</string>\n    <string name=\"invalid_server\">\"잘못된 서버 이름입니다\"</string>\n    <string name=\"service_failed\">\"원격 서버에 접속하는 데 실패했습니다\"</string>\n    <string name=\"stop\">\"중지\"</string>\n    <string name=\"stopping\">\"종료 중…\"</string>\n    <string name=\"reboot_required\">\"VPN 서비스를 시작하는 데 실패했습니다. 장치를 재시작해 보세요.\"</string>\n    <string name=\"profile_invalid_input\">\"올바른 프로필 데이터를 찾을 수 없습니다\"</string>\n\n    <!-- alert category -->\n    <string name=\"profile_empty\">\"프로필을 선택해 주세요\"</string>\n    <string name=\"proxy_empty\">\"서버 주소와 비밀번호는 반드시 입력해야 합니다\"</string>\n    <string name=\"connect\">\"접속\"</string>\n\n    <!-- menu category -->\n    <string name=\"profiles\">\"프로필\"</string>\n    <string name=\"settings\">\"설정\"</string>\n    <string name=\"faq\">\"자주 묻는 질문\"</string>\n    <string name=\"about\">\"이 앱에 대하여\"</string>\n    <string name=\"edit\">\"수정\"</string>\n    <string name=\"share\">\"공유\"</string>\n    <string name=\"add_profile\">\"프로필 추가\"</string>\n    <string name=\"action_apply_all\">\"설정을 모든 프로필에 적용\"</string>\n    <string name=\"action_export\">\"클립보드로 내보내기\"</string>\n    <string name=\"action_import\">\"클립보드에서 불러오기\"</string>\n    <string name=\"action_export_msg\">\"성공적으로 내보냈습니다\"</string>\n    <string name=\"action_export_err\">\"내보내기에 실패했습니다\"</string>\n    <string name=\"action_import_msg\">\"성공적으로 불러왔습니다\"</string>\n    <string name=\"action_import_err\">\"불러오는 데 실패했습니다\"</string>\n\n    <!-- profile -->\n    <string name=\"profile_config\">\"프로필 설정\"</string>\n    <string name=\"delete\">\"삭제\"</string>\n    <string name=\"delete_confirm_prompt\">\"정말 이 프로필을 삭제하시겠습니까?\"</string>\n\n    <!-- Fuzzy -->\n    <string name=\"share_qr_nfc\">\"QR 코드/NFC\"</string>\n    <string name=\"add_profile_dialog\">\"이 Shadowsocks 프로필을 추가하시겠습니까?\"</string>\n    <string name=\"add_profile_methods_scan_qr_code\">\"QR 코드 읽기\"</string>\n    <plurals name=\"removed\">\n        <item quantity=\"other\">\"삭제했습니다\"</item>\n    </plurals>\n    <string name=\"undo\">\"실행 취소\"</string>\n\n    <!-- tasker -->\n    <string name=\"toggle_service_state\">\"서비스 시작\"</string>\n    <string name=\"start_service_default\">\"현재 서버에 연결\"</string>\n    <string name=\"start_service\">\"%s로 연결\"</string>\n    <string name=\"stop_service\">\"%s로 바꾸기\"</string>\n    <string name=\"profile_default\">\"현재 프로필 사용\"</string>\n\n    <!-- status -->\n    <string name=\"sent\">\"송신:\"</string>\n    <string name=\"received\">\"수신:\"</string>\n\n    <!-- status -->\n    <string name=\"connecting\">\"연결 중…\"</string>\n    <string name=\"vpn_connected\">\"연결 완료. 탭 하면 연결 상태를 검사합니다.\"</string>\n    <string name=\"not_connected\">\"연결되지 않음\"</string>\n\n    <!-- acl -->\n    <string name=\"custom_rules\">\"사용자 정의 규칙\"</string>\n    <string name=\"acl_rule_templates_generic\">\"서브넷 혹은 호스트 이름 PCRE 패턴\"</string>\n\n    <!-- plugin -->\n    <string name=\"plugin\">\"플러그인\"</string>\n    <string name=\"plugin_configure\">\"플러그인 설정…\"</string>\n    <string name=\"plugin_disabled\">\"비활성화 됨\"</string>\n    <string name=\"plugin_unknown\">\"알 수 없는 플러그인: %s\"</string>\n    <string name=\"plugin_untrusted\">\"경고: 이 플러그인은 신뢰할 수 있는 출처에서 온 것이 아닌 것 같습니다\"</string>\n    <string name=\"profile_plugin\">\"플러그인: %s\"</string>\n    <string name=\"add_profile_scanner_permission_required\">\"QR 코드를 읽어 들이려면 카메라 권한이 필요합니다\"</string>\n</resources>"
  },
  {
    "path": "core/src/main/res/values-ru/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n    Copyright (C) 2019 by Max Lv <max.c.lv@gmail.com>\n    Copyright (C) 2019 by Mygod Studio <contact-shadowsocks-android@mygod.be>\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n    DO NOT EDIT: This file was automagically generated by script.\n    If you are looking for contributing a translation, read this:\n    https://discourse.shadowsocks.org/t/poeditor-translation-main-thread/30\n-->\n\n<resources>\n    <string name=\"quick_toggle\">\"Подключение\"</string>\n    <string name=\"remote_dns\">\"Удалённая DNS\"</string>\n    <string name=\"stat_summary\">\"Отправлено: \\t%3$s\\t↑\\t%1$s\nПолучено: \\t\\t\\t%4$s\\t↓\\t%2$s\"</string>\n    <string name=\"connection_test_testing\">\"Проверка…\"</string>\n    <string name=\"connection_test_available\">\"Успешно: рукопожатие HTTPS заняло %d мс\"</string>\n    <string name=\"connection_test_error\">\"Сбой проверки интернет-соединения: %s\"</string>\n    <string name=\"connection_test_fail\">\"Нет доступа к Интернету\"</string>\n    <string name=\"connection_test_error_status_code\">\"Код ошибки: #%d\"</string>\n\n    <!-- proxy category -->\n    <string name=\"profile_name\">\"Имя профиля\"</string>\n    <string name=\"proxy\">\"Сервер\"</string>\n    <string name=\"remote_port\">\"Удалённый порт\"</string>\n    <string name=\"sitekey\">\"Пароль\"</string>\n    <string name=\"enc_method\">\"Метод шифрования\"</string>\n\n    <!-- feature category -->\n    <string name=\"ipv6\">\"Маршрутизация IPv6\"</string>\n    <string name=\"ipv6_summary\">\"Перенаправлять трафик IPv6 на удалённый сервер\"</string>\n    <string name=\"route_list\">\"Маршрут\"</string>\n    <string name=\"route_entry_gfwlist\">\"Список GFW\"</string>\n    <string name=\"proxied_apps\">\"Работа VPN\nв конкретных приложениях\"</string>\n    <string name=\"proxied_apps_summary\">\"Настроить работу VPN только в нужных приложениях\"</string>\n    <string name=\"on\">\"Вкл.\"</string>\n    <string name=\"bypass_apps\">\"Чёрный список\"</string>\n    <string name=\"bypass_apps_summary\">\"Включите эту функцию для работы выбранных приложений в обход прокси\"</string>\n    <string name=\"auto_connect\">\"Автоподключение\"</string>\n    <string name=\"auto_connect_summary\">\"Запускать Shadowsocks при включении/после обновления приложения, если оно было запущено до этого\"</string>\n    <string name=\"tcp_fastopen_summary\">\"Переключение может запрашивать Root (права суперпользователя)\"</string>\n    <string name=\"tcp_fastopen_summary_unsupported\">\"Неподдерживаемая версия ядра: %s &lt; 3.7.1\"</string>\n    <string name=\"udp_dns\">\"Посылать DNS-запросы через UDP\"</string>\n    <string name=\"udp_dns_summary\">\"Требовать перенаправление UDP на удалённом сервере\"</string>\n\n    <!-- notification category -->\n    <string name=\"forward_success\">\"Shadowsocks запущен.\"</string>\n    <string name=\"invalid_server\">\"Неправильное имя сервера\"</string>\n    <string name=\"service_failed\">\"Ошибка при подключении к удалённому серверу\"</string>\n    <string name=\"stop\">\"Остановить\"</string>\n    <string name=\"stopping\">\"Остановка…\"</string>\n    <string name=\"reboot_required\">\"Не удалось запустить службу VPN. Возможно, следует перезагрузить устройство.\"</string>\n    <string name=\"profile_invalid_input\">\"Не найдено действительных данных профиля.\"</string>\n\n    <!-- alert category -->\n    <string name=\"profile_empty\">\"Выберите профиль\"</string>\n    <string name=\"proxy_empty\">\"Прокси/пароль не должны быть пустыми\"</string>\n    <string name=\"connect\">\"Подключить\"</string>\n\n    <!-- menu category -->\n    <string name=\"profiles\">\"Профили\"</string>\n    <string name=\"settings\">\"Настройки\"</string>\n    <string name=\"faq\">\"ЧаВо/FAQ\"</string>\n    <string name=\"faq_url\">\"https://github.com/shadowsocks/shadowsocks-android/blob/master/.github/faq.ru.md\"</string>\n    <string name=\"about\">\"О приложении\"</string>\n    <string name=\"edit\">\"Изменить\"</string>\n    <string name=\"share\">\"Поделиться\"</string>\n    <string name=\"add_profile\">\"Добавить профиль\"</string>\n    <string name=\"action_apply_all\">\"Применить ко всем профилям\"</string>\n    <string name=\"action_export\">\"В буфер обмена\"</string>\n    <string name=\"action_import\">\"Взять из буфера обмена\"</string>\n    <string name=\"action_export_msg\">\"Экспортировано успешно!\"</string>\n    <string name=\"action_export_err\">\"Не удалось экспортировать.\"</string>\n    <string name=\"action_import_msg\">\"Импортировано успешно!\"</string>\n    <string name=\"action_import_err\">\"Не удалось импортировать.\"</string>\n\n    <!-- profile -->\n    <string name=\"profile_config\">\"Настройка профиля\"</string>\n    <string name=\"delete\">\"Удалить\"</string>\n    <string name=\"delete_confirm_prompt\">\"Удалить этот профиль?\"</string>\n    <string name=\"share_qr_nfc\">\"QR-код\"</string>\n    <string name=\"add_profile_dialog\">\"Добавить этот профиль Shadowsocks?\"</string>\n    <string name=\"add_profile_methods_scan_qr_code\">\"Сканировать QR-код\"</string>\n    <plurals name=\"removed\">\n        <item quantity=\"one\">\"Удалён %d элемент\"</item>\n        <item quantity=\"few\">\"Удалено элементов: %d\"</item>\n        <item quantity=\"many\">\"Удалено элементов: %d\"</item>\n        <item quantity=\"other\">\"Удалено элементов: %d\"</item>\n    </plurals>\n    <string name=\"undo\">\"Вернуть\"</string>\n\n    <!-- tasker -->\n    <string name=\"toggle_service_state\">\"Запустить службу\"</string>\n    <string name=\"start_service_default\">\"Подключиться к текущему серверу\"</string>\n    <string name=\"start_service\">\"Подключиться к %s\"</string>\n    <string name=\"stop_service\">\"Переключиться на %s\"</string>\n    <string name=\"profile_default\">\"Использовать текущий профиль\"</string>\n\n    <!-- status -->\n    <string name=\"sent\">\"Отправлено:\"</string>\n    <string name=\"received\">\"Получено:\"</string>\n\n    <!-- status -->\n    <string name=\"connecting\">\"Соединение…\"</string>\n    <string name=\"vpn_connected\">\"Подключено, нажмите для проверки соединения\"</string>\n    <string name=\"not_connected\">\"Не подключено\"</string>\n\n    <!-- acl -->\n    <string name=\"custom_rules\">\"Свои правила\"</string>\n    <string name=\"action_add_rule\">\"Добавить правило…\"</string>\n    <string name=\"edit_rule\">\"Изменить правило\"</string>\n    <string name=\"route_entry_all\">\"Все\"</string>\n    <string name=\"route_entry_bypass_lan\">\"Все, кроме LAN\"</string>\n    <string name=\"route_entry_bypass_chn\">\"Все, кроме Китая\"</string>\n    <string name=\"route_entry_bypass_lan_chn\">\"Все, кроме LAN и Китая\"</string>\n    <string name=\"route_entry_chinalist\">\"Список Китая\"</string>\n    <string name=\"acl_rule_templates_generic\">\"Подсеть или имя хоста, записанное регулярным выражением (PCRE)\"</string>\n    <string name=\"acl_rule_templates_domain\">\"Доменное имя и все его поддомены\"</string>\n\n    <!-- plugin -->\n    <string name=\"plugin\">\"Плагин\"</string>\n    <string name=\"plugin_configure\">\"Настроить…\"</string>\n    <string name=\"plugin_disabled\">\"Нет\"</string>\n    <string name=\"plugin_unknown\">\"Неизвестный плагин %s\"</string>\n    <string name=\"plugin_untrusted\">\"Внимание: этот плагин появился из непроверенного источника.\"</string>\n    <string name=\"profile_plugin\">\"Плагин: %s\"</string>\n    <string name=\"add_profile_scanner_permission_required\">\"Разрешение камеры требуется для сканирования QR-кодов.\"</string>\n\n    <!-- notification category -->\n    <string name=\"service_vpn\">\"Служба VPN\"</string>\n    <string name=\"add_profile_methods_manual_settings\">\"Заполнить вручную\"</string>\n\n    <!-- misc -->\n    <string name=\"advanced\">\"Дополнительные\"</string>\n\n    <!-- misc -->\n    <string name=\"service_mode\">\"Режим работы\"</string>\n    <string name=\"service_mode_proxy\">\"Только прокси\"</string>\n    <string name=\"service_mode_transproxy\">\"Прозрачный прокси\"</string>\n    <string name=\"port_proxy\">\"Порт SOCKS5-прокси\"</string>\n    <string name=\"port_local_dns\">\"Локальный порт DNS\"</string>\n    <string name=\"port_transproxy\">\"Порт прозрачного прокси\"</string>\n    <string name=\"service_proxy\">\"Служба прокси\"</string>\n    <string name=\"service_transproxy\">\"Служба прозрачного прокси\"</string>\n    <string name=\"vpn_permission_denied\">\"Нет разрешения на создание VPN-соединения\"</string>\n    <string name=\"auto_connect_summary_v24\">\"Запускать Shadowsocks при включении устройства. Лучше использовать режим Always-on VPN (Постоянная VPN).\"</string>\n    <string name=\"speed\">\"%s/с\"</string>\n    <string name=\"direct_boot_aware\">\"Разрешить переключение на экране блокировки\"</string>\n    <string name=\"direct_boot_aware_summary\">\"Данные в выбранном профиле будут хуже защищены\"</string>\n    <string name=\"acl_rule_online_config\">\"URL конфигурации\"</string>\n    <string name=\"action_import_file\">\"Взять из файла…\"</string>\n    <string name=\"night_mode\">\"Тёмная тема\"</string>\n    <string name=\"night_mode_system\">\"Как в системе\"</string>\n    <string name=\"night_mode_auto\">\"Авто\"</string>\n    <string name=\"night_mode_on\">\"Вкл.\"</string>\n    <string name=\"night_mode_off\">\"Откл.\"</string>\n    <string name=\"send_email\">\"Отправить письмо\"</string>\n    <string name=\"action_export_more\">\"Экспорт…\"</string>\n    <string name=\"action_export_file\">\"Сохранить в файл…\"</string>\n    <string name=\"cleartext_http_warning\">\"Текстовый трафик HTTP не защищён\"</string>\n    <string name=\"share_over_lan\">\"Поделиться через LAN\"</string>\n    <string name=\"connection_test_pending\">\"Проверить подключение\"</string>\n    <string name=\"file_manager_missing\">\"Установите файловый менеджер (например, MiXplorer)\"</string>\n    <string name=\"tcp_fastopen_failure\">\"Не удалось переключить\"</string>\n    <string name=\"udp_fallback\">\"Возврат к UDP\"</string>\n    <string name=\"action_replace_file\">\"Заменить файлом…\"</string>\n    <string name=\"off\">\"Откл.\"</string>\n    <string name=\"proxied_apps_mode\">\"Режим\"</string>\n    <string name=\"metered\">\"Лимитное подключение\"</string>\n    <string name=\"metered_summary\">\"Сообщить системе, что VPN с тарификацией трафика\"</string>\n    <plurals name=\"hosts_summary\">\n        <item quantity=\"one\">\"Настроено 1 имя хоста\"</item>\n        <item quantity=\"few\">\"Настроено имён хостов: %d\"</item>\n        <item quantity=\"many\">\"Настроено имён хостов: %d\"</item>\n        <item quantity=\"other\">\"Настроено имён хостов: %d\"</item>\n    </plurals>\n\n    <!-- subscriptions -->\n    <string name=\"subscriptions\">\"Подписки\"</string>\n    <string name=\"add_subscription\">\"Добавить подписку\"</string>\n    <string name=\"edit_subscription\">\"Изменить подписку\"</string>\n    <string name=\"update_subscription\">\"Обновить серверы из подписки\"</string>\n    <string name=\"service_subscription\">\"Служба подписки\"</string>\n    <string name=\"service_subscription_working\">\"Синхронизация подписок… (%d из %d)\"</string>\n    <string name=\"service_subscription_finishing\">\"Завершение…\"</string>\n    <string name=\"plugin_auto_connect_unlock_only\">\"Этот плагин может не работать с «Автоподключением»\"</string>\n</resources>"
  },
  {
    "path": "core/src/main/res/values-tr/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n    Copyright (C) 2019 by Max Lv <max.c.lv@gmail.com>\n    Copyright (C) 2019 by Mygod Studio <contact-shadowsocks-android@mygod.be>\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n    DO NOT EDIT: This file was automagically generated by script.\n    If you are looking for contributing a translation, read this:\n    https://discourse.shadowsocks.org/t/poeditor-translation-main-thread/30\n-->\n\n<resources>\n    <string name=\"quick_toggle\">\"Aç/Kapa\"</string>\n    <string name=\"remote_dns\">\"Uzaktan DNS\"</string>\n    <string name=\"stat_summary\">\"Yüklendi: \\t\\t\\t\\t\\t%3$s\\t↑\\t%1$s\nİndirildi: \\t%4$s\\t↓\\t%2$s\"</string>\n    <string name=\"connection_test_testing\">\"Test ediliyor…\"</string>\n    <string name=\"connection_test_error\">\"İnternet bağlantısı bulunamadı: %s\"</string>\n    <string name=\"connection_test_fail\">\"İnternet Bağlantısı Bulunamadı\"</string>\n    <string name=\"connection_test_error_status_code\">\"Hata kodu: #%d\"</string>\n\n    <!-- proxy category -->\n    <string name=\"profile_name\">\"Profil İsmi\"</string>\n    <string name=\"proxy\">\"Sunucu\"</string>\n    <string name=\"remote_port\">\"Uzaktan Port\"</string>\n    <string name=\"sitekey\">\"Şifre\"</string>\n    <string name=\"enc_method\">\"Şifreleme Methodu\"</string>\n    <string name=\"ipv6_summary\">\"IPv6 trafiğini remote'a yönlendir\"</string>\n    <string name=\"route_list\">\"Rota\"</string>\n    <string name=\"route_entry_gfwlist\">\"GFW Listesi\"</string>\n    <string name=\"proxied_apps\">\"Uygulamalar VPN modu\"</string>\n    <string name=\"proxied_apps_summary\">\"Seçili uygulamalar için VPN'i yapılandır\"</string>\n    <string name=\"on\">\"Açık\"</string>\n\n    <!-- Fuzzy -->\n    <string name=\"bypass_apps\">\"Bypass Modu\"</string>\n    <string name=\"bypass_apps_summary\">\"Seçili uygulamaları bypass etmek için bu seçeneği açın\"</string>\n    <string name=\"auto_connect\">\"Otomatik Bağlan\"</string>\n\n    <!-- Fuzzy -->\n    <string name=\"auto_connect_summary\">\"Shadowsocks'ı cihazı başlatırken aç\"</string>\n\n    <!-- Fuzzy -->\n    <string name=\"tcp_fastopen_summary\">\"Açıp kapamak için ROOT yetkisi gerekiyor\"</string>\n    <string name=\"tcp_fastopen_summary_unsupported\">\"Desteklenmeyen kernel sürümü: %s &lt; 3.7.1\"</string>\n\n    <!-- Fuzzy -->\n    <string name=\"udp_dns\">\"DNS yönlendirme\"</string>\n\n    <!-- Fuzzy -->\n    <string name=\"udp_dns_summary\">\"Tüm DNS isteklerini remote'a yönlendir\"</string>\n\n    <!-- notification category -->\n    <string name=\"forward_success\">\"Shadowsocks başlatıldı.\"</string>\n    <string name=\"invalid_server\">\"Geçersiz sunucu ismi\"</string>\n    <string name=\"service_failed\">\"Remote sunucuya bağlanma hatası\"</string>\n    <string name=\"stop\">\"Dur\"</string>\n    <string name=\"stopping\">\"Kapatılıyor…\"</string>\n    <string name=\"reboot_required\">\"VPN servisi başlatılırken hata. Cihazınızı yeniden başlatmanız gerekebilir.\"</string>\n    <string name=\"profile_invalid_input\">\"Geçerli profil verisi bulunamadı.\"</string>\n\n    <!-- alert category -->\n    <string name=\"profile_empty\">\"Lütfen profil seçiniz\"</string>\n    <string name=\"proxy_empty\">\"Proxy/Şifre alanları boş olmamalı\"</string>\n    <string name=\"connect\">\"Bağlan\"</string>\n\n    <!-- menu category -->\n    <string name=\"profiles\">\"Profiller\"</string>\n    <string name=\"settings\">\"Ayarlar\"</string>\n    <string name=\"faq\">\"SSS\"</string>\n    <string name=\"about\">\"Hakkında\"</string>\n    <string name=\"edit\">\"Düzenle\"</string>\n    <string name=\"share\">\"Paylaş\"</string>\n    <string name=\"add_profile\">\"Profil Ekle\"</string>\n    <string name=\"action_apply_all\">\"Ayarları tüm profillere uygula\"</string>\n    <string name=\"action_export\">\"Clipboarda ekle\"</string>\n    <string name=\"action_import\">\"Clipboarddan al\"</string>\n    <string name=\"action_export_msg\">\"Ekleme başarılı!\"</string>\n    <string name=\"action_export_err\">\"Ekleme başarısız.\"</string>\n    <string name=\"action_import_msg\">\"Alım başarılı!\"</string>\n    <string name=\"action_import_err\">\"Alım başarısız.\"</string>\n\n    <!-- profile -->\n    <string name=\"profile_config\">\"Profil ayarları\"</string>\n    <string name=\"delete\">\"Kaldır\"</string>\n    <string name=\"delete_confirm_prompt\">\"Bu profili kaldırmak istediğinize emin misiniz?\"</string>\n\n    <!-- Fuzzy -->\n    <string name=\"share_qr_nfc\">\"QR kodu/NFC\"</string>\n    <string name=\"add_profile_dialog\">\"Bu Shadowsocks Profilini ekle?\"</string>\n    <string name=\"add_profile_methods_scan_qr_code\">\"QR kodu tarat\"</string>\n    <plurals name=\"removed\">\n        <item quantity=\"one\">\"Kaldırıldı\"</item>\n        <item quantity=\"other\">\"%d nesne kaldırıldı\"</item>\n    </plurals>\n    <string name=\"undo\">\"Geri al\"</string>\n\n    <!-- tasker -->\n    <string name=\"toggle_service_state\">\"Servisi başlat\"</string>\n    <string name=\"start_service_default\">\"Şu anki sunucuya bağlan\"</string>\n    <string name=\"start_service\">\"%s 'a bağlan\"</string>\n    <string name=\"stop_service\">\"%s 'a çevir\"</string>\n    <string name=\"profile_default\">\"Şu anki profili kullan\"</string>\n\n    <!-- status -->\n    <string name=\"sent\">\"Gönderildi:\"</string>\n    <string name=\"received\">\"Alındı:\"</string>\n\n    <!-- status -->\n    <string name=\"connecting\">\"Bağlanılıyor…\"</string>\n    <string name=\"vpn_connected\">\"Bağlandı, test etmek için tıklayın\"</string>\n    <string name=\"not_connected\">\"Bağlı değil\"</string>\n\n    <!-- acl -->\n    <string name=\"custom_rules\">\"Kişisel kurallar\"</string>\n    <string name=\"action_add_rule\">\"Kural(lar) ekle…\"</string>\n    <string name=\"edit_rule\">\"Kuralları düzenle\"</string>\n    <string name=\"route_entry_all\">\"Hepsi\"</string>\n    <string name=\"route_entry_bypass_lan\">\"LAN bypassla\"</string>\n    <string name=\"route_entry_bypass_chn\">\"Çin Anakara'sını bypassla\"</string>\n    <string name=\"route_entry_bypass_lan_chn\">\"Lan ve Çin Anakarası'nı bypassla\"</string>\n    <string name=\"route_entry_chinalist\">\"Çin lıstesı\"</string>\n    <string name=\"acl_rule_templates_generic\">\"Subnet veya Sunucu Adı PCRE düzeni\"</string>\n    <string name=\"acl_rule_templates_domain\">\"Domain ve alt domain isimleri\"</string>\n\n    <!-- plugin -->\n    <string name=\"plugin\">\"Eklenti\"</string>\n    <string name=\"plugin_configure\">\"Ayarla…\"</string>\n    <string name=\"plugin_disabled\">\"Kapalı\"</string>\n    <string name=\"plugin_unknown\">\"Bilinmeyen eklenti %s\"</string>\n    <string name=\"plugin_untrusted\">\"Dikkat: Bu eklenti bilinen bir kaynaktan değil.\"</string>\n    <string name=\"profile_plugin\">\"Eklenti: %s\"</string>\n    <string name=\"add_profile_scanner_permission_required\">\"QR kodu okumak için kamera izni gerekli.\"</string>\n\n    <!-- notification category -->\n    <string name=\"service_vpn\">\"VPN Servisi\"</string>\n    <string name=\"add_profile_methods_manual_settings\">\"Manuel Ayarlar\"</string>\n\n    <!-- misc -->\n    <string name=\"advanced\">\"Gelişmiş\"</string>\n\n    <!-- misc -->\n    <string name=\"service_mode\">\"Servis modu\"</string>\n    <string name=\"service_mode_proxy\">\"Sadece proxy\"</string>\n    <string name=\"port_proxy\">\"SOCKS5 proxy portu\"</string>\n    <string name=\"port_local_dns\">\"Yerel DNS portu\"</string>\n    <string name=\"port_transproxy\">\"Transproxy portu\"</string>\n    <string name=\"service_proxy\">\"Proxy Servisi\"</string>\n    <string name=\"service_transproxy\">\"Transproxy Servisi\"</string>\n    <string name=\"vpn_permission_denied\">\"VPN servisi yaratma isteği reddedildi\"</string>\n    <string name=\"auto_connect_summary_v24\">\"Shadowsockı cihazla beraber başlat. Bunun yerine her zaman açık VPN kullanılması tavsiye edilirö\"</string>\n    <string name=\"direct_boot_aware\">\"Ekran kitliyken açıp kapamaya izin ver.\"</string>\n    <string name=\"direct_boot_aware_summary\">\"Seçili profil bilginiz daha az korunacak.\"</string>\n    <string name=\"acl_rule_online_config\">\"Online ayarlar URL'i\"</string>\n    <string name=\"action_import_file\">\"Dosyadan al…\"</string>\n    <string name=\"night_mode\">\"Gece modu\"</string>\n    <string name=\"night_mode_system\">\"Takip sistemi\"</string>\n    <string name=\"night_mode_auto\">\"Oto\"</string>\n    <string name=\"night_mode_on\">\"Açık\"</string>\n    <string name=\"night_mode_off\">\"Kapalı\"</string>\n</resources>"
  },
  {
    "path": "core/src/main/res/values-uk/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n    Copyright (C) 2019 by Max Lv <max.c.lv@gmail.com>\n    Copyright (C) 2019 by Mygod Studio <contact-shadowsocks-android@mygod.be>\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n    DO NOT EDIT: This file was automagically generated by script.\n    If you are looking for contributing a translation, read this:\n    https://discourse.shadowsocks.org/t/poeditor-translation-main-thread/30\n-->\n\n<resources>\n    <string name=\"connection_test_fail\">\"Інтернет недоступний\"</string>\n\n    <!-- proxy category -->\n    <string name=\"profile_name\">\"Назва профілю\"</string>\n    <string name=\"proxy\">\"Сервер\"</string>\n    <string name=\"sitekey\">\"Пароль\"</string>\n    <string name=\"enc_method\">\"Метод шифрування\"</string>\n    <string name=\"on\">\"Ввімк\"</string>\n    <string name=\"auto_connect\">\"Автоматичне підключення\"</string>\n    <string name=\"auto_connect_summary\">\"Дозволити запуск Shadowsocks при ввімкнені пристрою чи оновленні застосунку, якщо він був запущений до того\"</string>\n    <string name=\"stop\">\"Зупинити\"</string>\n    <string name=\"stopping\">\"Вимкнення…\"</string>\n    <string name=\"reboot_required\">\"Не вдалося запустити службу VPN. Може знадобитися перезавантаження пристрою.\"</string>\n    <string name=\"profile_invalid_input\">\"Не знайдено дійсних даних профілю.\"</string>\n\n    <!-- alert category -->\n    <string name=\"profile_empty\">\"Оберіть профіль\"</string>\n    <string name=\"connect\">\"Під'єднатися\"</string>\n\n    <!-- menu category -->\n    <string name=\"profiles\">\"Профілі\"</string>\n    <string name=\"settings\">\"Налаштування\"</string>\n    <string name=\"faq\">\"ЧаПи\"</string>\n    <string name=\"about\">\"Про застосунок\"</string>\n    <string name=\"edit\">\"Редагувати\"</string>\n    <string name=\"share\">\"Поділитися\"</string>\n    <string name=\"add_profile\">\"Додати профіль\"</string>\n    <string name=\"action_apply_all\">\"Застосувати налаштування до всіх профілів\"</string>\n    <string name=\"action_export\">\"Експортувати в буфер обміну\"</string>\n    <string name=\"action_import\">\"Імпортувати з буферу обміну\"</string>\n    <string name=\"action_export_msg\">\"Експортовано успішно!\"</string>\n    <string name=\"action_export_err\">\"Не вдалося експортувати.\"</string>\n    <string name=\"action_import_msg\">\"Імпортовано успішно!\"</string>\n    <string name=\"action_import_err\">\"Не вдалося імпортувати.\"</string>\n\n    <!-- profile -->\n    <string name=\"profile_config\">\"Налаштування профілю\"</string>\n    <string name=\"delete\">\"Видалити\"</string>\n    <string name=\"delete_confirm_prompt\">\"Ви дійсно хочете видалити цей профіль?\"</string>\n    <string name=\"share_qr_nfc\">\"QR-код\"</string>\n    <string name=\"add_profile_dialog\">\"Додати цей профіль Shadowsocks?\"</string>\n    <string name=\"add_profile_methods_scan_qr_code\">\"Зчитати QR-код\"</string>\n    <plurals name=\"removed\">\n        <item quantity=\"one\">\"Видалено\"</item>\n        <item quantity=\"few\">\"Видалено\"</item>\n        <item quantity=\"many\">\"Видалено\"</item>\n        <item quantity=\"other\">\"Видалено: %d\"</item>\n    </plurals>\n    <string name=\"undo\">\"Скасувати дію\"</string>\n\n    <!-- tasker -->\n    <string name=\"toggle_service_state\">\"Запустити службу\"</string>\n    <string name=\"start_service_default\">\"Під'єднатися до поточного сервера\"</string>\n    <string name=\"start_service\">\"Під'єднатися до %s\"</string>\n    <string name=\"stop_service\">\"Перемкнутися на %s\"</string>\n    <string name=\"profile_default\">\"Використовувати поточний профіль\"</string>\n\n    <!-- status -->\n    <string name=\"sent\">\"Надіслано:\"</string>\n    <string name=\"received\">\"Отримано:\"</string>\n\n    <!-- status -->\n    <string name=\"connecting\">\"Під'єднання…\"</string>\n    <string name=\"vpn_connected\">\"Під'єднано. Торкніться, щоб перевірити з'єднання.\"</string>\n    <string name=\"not_connected\">\"Не під'єднано\"</string>\n\n    <!-- acl -->\n    <string name=\"custom_rules\">\"Власні правила\"</string>\n    <string name=\"action_add_rule\">\"Додати правило…\"</string>\n    <string name=\"edit_rule\">\"Редагувати правило\"</string>\n    <string name=\"route_entry_all\">\"Всі\"</string>\n    <string name=\"route_entry_bypass_lan\">\"Оминати локальні мережі\"</string>\n    <string name=\"route_entry_bypass_chn\">\"Оминати Китай\"</string>\n    <string name=\"route_entry_bypass_lan_chn\">\"Оминати локальні мережі та Китай\"</string>\n    <string name=\"acl_rule_templates_domain\">\"Ім'я домену та всі імена піддоменів\"</string>\n\n    <!-- plugin -->\n    <string name=\"plugin\">\"Плагін\"</string>\n    <string name=\"plugin_configure\">\"Налаштувати…\"</string>\n    <string name=\"plugin_disabled\">\"Вимкнено\"</string>\n    <string name=\"plugin_unknown\">\"Невідомий плагін: %s\"</string>\n    <string name=\"plugin_untrusted\">\"Увага: схоже, цей плагін не походить з надійного джерела.\"</string>\n    <string name=\"profile_plugin\">\"Плагін: %s\"</string>\n    <string name=\"add_profile_scanner_permission_required\">\"Для зчитування QR-коду необхідно дозволити використання камери.\"</string>\n\n    <!-- notification category -->\n    <string name=\"service_vpn\">\"Служба VPN\"</string>\n    <string name=\"add_profile_methods_manual_settings\">\"Ручне налаштування\"</string>\n\n    <!-- misc -->\n    <string name=\"advanced\">\"Розширені\"</string>\n    <string name=\"service_mode_proxy\">\"Лише проксі\"</string>\n    <string name=\"auto_connect_summary_v24\">\"Вмикати Shadowsocks при ввімкнені пристрою. Рекомендовано натомість використовувати постійно ввімкнену VPN.\"</string>\n    <string name=\"speed\">\"%s/с\"</string>\n    <string name=\"direct_boot_aware\">\"Дозволити перемикання на екрані блокування\"</string>\n    <string name=\"action_import_file\">\"Іморт з файлу…\"</string>\n    <string name=\"night_mode\">\"Нічний режим\"</string>\n    <string name=\"night_mode_system\">\"Згідно з налаштуваннями системи\"</string>\n    <string name=\"night_mode_auto\">\"Автоматично\"</string>\n    <string name=\"night_mode_on\">\"Ввімк\"</string>\n    <string name=\"night_mode_off\">\"Вимк\"</string>\n    <string name=\"send_email\">\"Надіслати лист\"</string>\n    <string name=\"action_export_more\">\"Експорт…\"</string>\n    <string name=\"action_export_file\">\"Експорт до файлу…\"</string>\n    <string name=\"share_over_lan\">\"Поділитися через локальну мережу\"</string>\n    <string name=\"file_manager_missing\">\"Будь ласка, встановіть менеджер файлів, наприклад, MiXplorer\"</string>\n    <string name=\"tcp_fastopen_failure\">\"Не вдалося перемкнути\"</string>\n    <string name=\"action_replace_file\">\"Замінити з файлу…\"</string>\n    <string name=\"off\">\"Вимк\"</string>\n    <string name=\"proxied_apps_mode\">\"Режим\"</string>\n    <string name=\"plugin_auto_connect_unlock_only\">\"Цей плагін може не працювати з автоматичним під'єднанням\"</string>\n</resources>"
  },
  {
    "path": "core/src/main/res/values-zh-rCN/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n    Copyright (C) 2019 by Max Lv <max.c.lv@gmail.com>\n    Copyright (C) 2019 by Mygod Studio <contact-shadowsocks-android@mygod.be>\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n    DO NOT EDIT: This file was automagically generated by script.\n    If you are looking for contributing a translation, read this:\n    https://discourse.shadowsocks.org/t/poeditor-translation-main-thread/30\n-->\n\n<resources>\n    <string name=\"quick_toggle\">\"开关\"</string>\n    <string name=\"remote_dns\">\"远程 DNS\"</string>\n    <string name=\"stat_summary\">\"上传: \\t%3$s\\t↑\\t%1$s\n下载: \\t%4$s\\t↓\\t%2$s\"</string>\n    <string name=\"connection_test_testing\">\"测试中…\"</string>\n    <string name=\"connection_test_available\">\"连接成功：HTTPS 握手延时 %d 毫秒\"</string>\n    <string name=\"connection_test_error\">\"失败：%s\"</string>\n    <string name=\"connection_test_fail\">\"无互联网连接\"</string>\n    <string name=\"connection_test_error_status_code\">\"状态码无效（#%d）\"</string>\n\n    <!-- proxy category -->\n    <string name=\"profile_name\">\"配置名称\"</string>\n    <string name=\"proxy\">\"服务器\"</string>\n    <string name=\"remote_port\">\"远程端口\"</string>\n    <string name=\"sitekey\">\"密码\"</string>\n    <string name=\"enc_method\">\"加密方式\"</string>\n\n    <!-- feature category -->\n    <string name=\"ipv6\">\"IPv6 路由\"</string>\n    <string name=\"ipv6_summary\">\"转发 IPv6 流量到远程服务器\"</string>\n    <string name=\"route_list\">\"路由\"</string>\n    <string name=\"route_entry_gfwlist\">\"GFW 列表\"</string>\n    <string name=\"proxied_apps\">\"分应用 VPN\"</string>\n    <string name=\"proxied_apps_summary\">\"允许部分应用绕过 VPN\"</string>\n    <string name=\"on\">\"启用\"</string>\n    <string name=\"bypass_apps\">\"绕行\"</string>\n    <string name=\"bypass_apps_summary\">\"绕过选择的应用\"</string>\n    <string name=\"auto_connect\">\"自动连接\"</string>\n    <string name=\"auto_connect_summary\">\"系统启动或应用更新后自动恢复运行\"</string>\n    <string name=\"tcp_fastopen_summary\">\"切换可能需要 ROOT 权限\"</string>\n    <string name=\"tcp_fastopen_summary_unsupported\">\"不支持的内核版本: %s &lt; 3.7.1\"</string>\n    <string name=\"udp_dns\">\"使用 UDP DNS\"</string>\n    <string name=\"udp_dns_summary\">\"需要远程服务器支持 UDP 转发\"</string>\n\n    <!-- notification category -->\n    <string name=\"forward_success\">\"后台服务已开始运行。\"</string>\n    <string name=\"invalid_server\">\"服务器名无效\"</string>\n    <string name=\"service_failed\">\"无法连接远程服务器\"</string>\n    <string name=\"stop\">\"停止\"</string>\n    <string name=\"stopping\">\"正在关闭…\"</string>\n    <string name=\"vpn_error\">\"后台服务启动失败：%s\"</string>\n    <string name=\"reboot_required\">\"VPN 服务启动失败。你可能需要重启设备。\"</string>\n    <string name=\"profile_invalid_input\">\"未找到有效的配置文件。\"</string>\n\n    <!-- alert category -->\n    <string name=\"profile_empty\">\"请选择配置文件\"</string>\n    <string name=\"proxy_empty\">\"代理服务器地址及密码不能为空\"</string>\n    <string name=\"connect\">\"连接\"</string>\n\n    <!-- menu category -->\n    <string name=\"profiles\">\"配置文件\"</string>\n    <string name=\"settings\">\"设置选项\"</string>\n    <string name=\"faq\">\"常见问题\"</string>\n    <string name=\"about\">\"关于\"</string>\n    <string name=\"about_title\">\"影梭 (Shadowsocks) %s\"</string>\n    <string name=\"edit\">\"编辑\"</string>\n    <string name=\"share\">\"分享\"</string>\n    <string name=\"add_profile\">\"添加配置文件\"</string>\n    <string name=\"action_apply_all\">\"应用设置到所有配置文件\"</string>\n    <string name=\"action_export\">\"导出至剪贴板\"</string>\n    <string name=\"action_import\">\"从剪贴板导入\"</string>\n    <string name=\"action_export_msg\">\"导出至剪贴板成功\"</string>\n    <string name=\"action_export_err\">\"导出至剪贴板失败\"</string>\n    <string name=\"action_import_msg\">\"导入成功\"</string>\n    <string name=\"action_import_err\">\"导入失败\"</string>\n\n    <!-- profile -->\n    <string name=\"profile_config\">\"配置文件设置\"</string>\n    <string name=\"delete\">\"删除\"</string>\n    <string name=\"delete_confirm_prompt\">\"您确定要删除此配置文件？\"</string>\n    <string name=\"share_qr_nfc\">\"二维码\"</string>\n    <string name=\"add_profile_dialog\">\"为影梭添加此配置文件？\"</string>\n    <string name=\"add_profile_methods_scan_qr_code\">\"扫描二维码\"</string>\n    <plurals name=\"removed\">\n        <item quantity=\"other\">\"已删除 %d 项\"</item>\n    </plurals>\n    <string name=\"undo\">\"撤销\"</string>\n\n    <!-- tasker -->\n    <string name=\"toggle_service_state\">\"启动服务\"</string>\n    <string name=\"start_service_default\">\"连接到当前服务器\"</string>\n    <string name=\"start_service\">\"连接到 %s\"</string>\n    <string name=\"stop_service\">\"切换到 %s\"</string>\n    <string name=\"profile_default\">\"使用当前配置\"</string>\n\n    <!-- status -->\n    <string name=\"sent\">\"发送：\"</string>\n    <string name=\"received\">\"接收：\"</string>\n\n    <!-- status -->\n    <string name=\"connecting\">\"连接中…\"</string>\n    <string name=\"vpn_connected\">\"已连接，点击测试连接\"</string>\n    <string name=\"not_connected\">\"未连接\"</string>\n\n    <!-- acl -->\n    <string name=\"custom_rules\">\"自定义规则\"</string>\n    <string name=\"action_add_rule\">\"添加规则…\"</string>\n    <string name=\"edit_rule\">\"编辑规则\"</string>\n    <string name=\"route_entry_all\">\"全局\"</string>\n    <string name=\"route_entry_bypass_lan\">\"绕过局域网地址\"</string>\n    <string name=\"route_entry_bypass_chn\">\"绕过中国大陆地址\"</string>\n    <string name=\"route_entry_bypass_lan_chn\">\"绕过局域网及中国大陆地址\"</string>\n    <string name=\"route_entry_chinalist\">\"仅代理中国大陆地址\"</string>\n    <string name=\"acl_rule_templates_generic\">\"子网/域名 PCRE 正则表达式\"</string>\n    <string name=\"acl_rule_templates_domain\">\"域名及其子域名\"</string>\n\n    <!-- plugin -->\n    <string name=\"plugin\">\"插件\"</string>\n    <string name=\"plugin_configure\">\"配置…\"</string>\n    <string name=\"plugin_disabled\">\"禁用\"</string>\n    <string name=\"plugin_unknown\">\"未知插件 %s\"</string>\n    <string name=\"plugin_untrusted\">\"警告：该插件似乎并非来自已知的可信源。\"</string>\n    <string name=\"profile_plugin\">\"插件：%s\"</string>\n    <string name=\"add_profile_scanner_permission_required\">\"扫描二维码需要获得使用相机的权限。\"</string>\n\n    <!-- notification category -->\n    <string name=\"service_vpn\">\"VPN 服务\"</string>\n    <string name=\"add_profile_methods_manual_settings\">\"手动设置\"</string>\n\n    <!-- misc -->\n    <string name=\"advanced\">\"高级选项\"</string>\n\n    <!-- misc -->\n    <string name=\"service_mode\">\"服务模式\"</string>\n    <string name=\"service_mode_proxy\">\"仅代理\"</string>\n    <string name=\"service_mode_transproxy\">\"透明代理\"</string>\n    <string name=\"port_proxy\">\"SOCKS5 代理端口\"</string>\n    <string name=\"port_local_dns\">\"本地 DNS 端口\"</string>\n    <string name=\"port_transproxy\">\"透明代理端口\"</string>\n    <string name=\"service_proxy\">\"代理模式\"</string>\n    <string name=\"service_transproxy\">\"透明代理模式\"</string>\n    <string name=\"vpn_permission_denied\">\"创建 VPN 服务权限不足\"</string>\n    <string name=\"auto_connect_summary_v24\">\"允许 Shadowsocks 随系统启动，建议使用始终开启的 VPN\"</string>\n    <string name=\"direct_boot_aware\">\"允许锁屏时切换\"</string>\n    <string name=\"direct_boot_aware_summary\">\"选中的配置信息会不那么安全\"</string>\n    <string name=\"acl_rule_online_config\">\"在线规则文件 URL\"</string>\n    <string name=\"action_import_file\">\"从文件导入…\"</string>\n    <string name=\"night_mode\">\"夜间模式\"</string>\n    <string name=\"night_mode_system\">\"跟随系统\"</string>\n    <string name=\"night_mode_auto\">\"自动\"</string>\n    <string name=\"night_mode_on\">\"开启\"</string>\n    <string name=\"night_mode_off\">\"关闭\"</string>\n    <string name=\"send_email\">\"发送电子邮件\"</string>\n    <string name=\"action_export_more\">\"导出…\"</string>\n    <string name=\"action_export_file\">\"导出至文件…\"</string>\n    <string name=\"cleartext_http_warning\">\"HTTP 明文流量不安全\"</string>\n    <string name=\"share_over_lan\">\"通过局域网分享\"</string>\n    <string name=\"connection_test_pending\">\"检查连接\"</string>\n    <string name=\"file_manager_missing\">\"请安装文件管理器，如 MiXplorer\"</string>\n    <string name=\"tcp_fastopen_failure\">\"切换失败\"</string>\n    <string name=\"udp_fallback\">\"UDP 配置\"</string>\n    <string name=\"action_replace_file\">\"从文件替换…\"</string>\n    <string name=\"off\">\"关\"</string>\n    <string name=\"proxied_apps_mode\">\"模式\"</string>\n    <string name=\"metered\">\"网络限制\"</string>\n    <string name=\"metered_summary\">\"使系统视此 VPN 为按流量计费\"</string>\n    <plurals name=\"hosts_summary\">\n        <item quantity=\"other\">\"配置了 %d 个主机名\"</item>\n    </plurals>\n\n    <!-- subscriptions -->\n    <string name=\"subscriptions\">\"订阅\"</string>\n    <string name=\"add_subscription\">\"添加订阅\"</string>\n    <string name=\"edit_subscription\">\"编辑订阅\"</string>\n    <string name=\"update_subscription\">\"更新订阅\"</string>\n    <string name=\"service_subscription\">\"订阅服务\"</string>\n    <string name=\"service_subscription_working\">\"正在更新订阅 (%d / %d)\"</string>\n    <string name=\"service_subscription_finishing\">\"订阅更新中\"</string>\n</resources>"
  },
  {
    "path": "core/src/main/res/values-zh-rTW/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n    Copyright (C) 2019 by Max Lv <max.c.lv@gmail.com>\n    Copyright (C) 2019 by Mygod Studio <contact-shadowsocks-android@mygod.be>\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n    DO NOT EDIT: This file was automagically generated by script.\n    If you are looking for contributing a translation, read this:\n    https://discourse.shadowsocks.org/t/poeditor-translation-main-thread/30\n-->\n\n<resources>\n    <string name=\"app_name\">\"影梭\"</string>\n    <string name=\"quick_toggle\">\"切換\"</string>\n    <string name=\"remote_dns\">\"遠程 DNS\"</string>\n    <string name=\"stat_summary\">\"傳送: \\t%3$s\\t↑\\t%1$s/s\n接收: \\t%4$s\\t↓\\t%2$s/s\"</string>\n    <string name=\"connection_test_testing\">\"測試中……\"</string>\n    <string name=\"connection_test_available\">\"成功: HTTPS 握手延遲 %d 毫秒\"</string>\n    <string name=\"connection_test_error\">\"偵測出網際網路連線失敗: %s\"</string>\n    <string name=\"connection_test_fail\">\"無法使用網際網路\"</string>\n    <string name=\"connection_test_error_status_code\">\"錯誤碼: （#%d）\"</string>\n\n    <!-- proxy category -->\n    <string name=\"profile_name\">\"設定檔名稱\"</string>\n    <string name=\"proxy\">\"伺服器\"</string>\n    <string name=\"remote_port\">\"遠端連接埠\"</string>\n    <string name=\"sitekey\">\"密碼\"</string>\n    <string name=\"enc_method\">\"加密方法\"</string>\n\n    <!-- feature category -->\n    <string name=\"ipv6\">\"IPv6 路由\"</string>\n    <string name=\"ipv6_summary\">\"向遠端重新導向 IPv6 流量\"</string>\n    <string name=\"route_list\">\"路由\"</string>\n    <string name=\"route_entry_gfwlist\">\"GFW List\"</string>\n    <string name=\"proxied_apps\">\"個別應用程式的 VPN\"</string>\n    <string name=\"proxied_apps_summary\">\"為已選擇的應用程式設定 VPN\"</string>\n    <string name=\"on\">\"開\"</string>\n\n    <!-- Fuzzy -->\n    <string name=\"bypass_apps\">\"略過模式\"</string>\n    <string name=\"bypass_apps_summary\">\"啟用此選項，會略過已選擇的應用程式\"</string>\n    <string name=\"auto_connect\">\"自動連線\"</string>\n\n    <!-- Fuzzy -->\n    <string name=\"auto_connect_summary\">\"在裝置啟動時啟用 Shadowsocks\"</string>\n\n    <!-- Fuzzy -->\n    <string name=\"tcp_fastopen_summary\">\"切換需要 ROOT 權限\"</string>\n    <string name=\"tcp_fastopen_summary_unsupported\">\"不支援的核心版本：%s &lt; 3.7.1\"</string>\n\n    <!-- Fuzzy -->\n    <string name=\"udp_dns\">\"DNS 轉送\"</string>\n\n    <!-- Fuzzy -->\n    <string name=\"udp_dns_summary\">\"使用 UDP 向遠端轉送 DNS 封包\"</string>\n\n    <!-- notification category -->\n    <string name=\"forward_success\">\"Shadowsocks 已啟動。\"</string>\n    <string name=\"invalid_server\">\"伺服器名稱無效\"</string>\n    <string name=\"service_failed\">\"連線至遠端伺服器失敗\"</string>\n    <string name=\"stop\">\"停止\"</string>\n    <string name=\"stopping\">\"關閉中…\"</string>\n    <string name=\"vpn_error\">\"後台服務啟動失敗：%s\"</string>\n    <string name=\"reboot_required\">\"VPN 服務啟動失敗。您或許需要重新啟動您的裝置。\"</string>\n    <string name=\"profile_invalid_input\">\"未找到有效的設定檔資料。\"</string>\n\n    <!-- alert category -->\n    <string name=\"profile_empty\">\"請選擇設定檔\"</string>\n    <string name=\"proxy_empty\">\"Proxy 或密碼不可以空白\"</string>\n    <string name=\"connect\">\"連線\"</string>\n\n    <!-- menu category -->\n    <string name=\"profiles\">\"設定檔\"</string>\n    <string name=\"settings\">\"設定\"</string>\n    <string name=\"faq\">\"常見問題\"</string>\n    <string name=\"about\">\"關於\"</string>\n    <string name=\"about_title\">\"Shadowsocks %s\"</string>\n    <string name=\"edit\">\"編輯\"</string>\n    <string name=\"share\">\"分享\"</string>\n    <string name=\"add_profile\">\"新增設定檔\"</string>\n    <string name=\"action_apply_all\">\"套用設定至所有設定檔\"</string>\n    <string name=\"action_export\">\"匯出至剪貼簿\"</string>\n    <string name=\"action_import\">\"從剪貼簿匯入\"</string>\n    <string name=\"action_export_msg\">\"成功匯出！\"</string>\n    <string name=\"action_export_err\">\"匯出失敗。\"</string>\n    <string name=\"action_import_msg\">\"成功匯入！\"</string>\n    <string name=\"action_import_err\">\"匯入失敗。\"</string>\n\n    <!-- profile -->\n    <string name=\"profile_config\">\"設定檔設定\"</string>\n    <string name=\"delete\">\"刪除\"</string>\n    <string name=\"delete_confirm_prompt\">\"您確定要移除這個設定檔嗎？\"</string>\n\n    <!-- Fuzzy -->\n    <string name=\"share_qr_nfc\">\"QR 碼 / NFC\"</string>\n    <string name=\"add_profile_dialog\">\"為 Shadowsocks 新增此設定檔？\"</string>\n    <string name=\"add_profile_methods_scan_qr_code\">\"掃描 QR 碼\"</string>\n    <plurals name=\"removed\">\n        <item quantity=\"other\">\"已移除 %d 項\"</item>\n    </plurals>\n    <string name=\"undo\">\"復原\"</string>\n\n    <!-- tasker -->\n    <string name=\"toggle_service_state\">\"啟動服務\"</string>\n    <string name=\"start_service_default\">\"連線至目前的伺服器\"</string>\n    <string name=\"start_service\">\"連線至 %s\"</string>\n    <string name=\"stop_service\">\"切換至 %s\"</string>\n    <string name=\"profile_default\">\"使用目前的設定檔\"</string>\n\n    <!-- status -->\n    <string name=\"sent\">\"傳送:\"</string>\n    <string name=\"received\">\"接收:\"</string>\n\n    <!-- status -->\n    <string name=\"connecting\">\"連線中…\"</string>\n    <string name=\"vpn_connected\">\"已連線，輕觸以檢查連線能力\"</string>\n    <string name=\"not_connected\">\"未連線\"</string>\n\n    <!-- acl -->\n    <string name=\"custom_rules\">\"自訂規則\"</string>\n    <string name=\"action_add_rule\">\"新增規則…\"</string>\n    <string name=\"edit_rule\">\"編輯規則\"</string>\n    <string name=\"route_entry_all\">\"全部\"</string>\n    <string name=\"route_entry_bypass_lan\">\"略過區域網路\"</string>\n    <string name=\"route_entry_bypass_chn\">\"略過中國大陸\"</string>\n    <string name=\"route_entry_bypass_lan_chn\">\"略過區域網路及中國大陸\"</string>\n    <string name=\"route_entry_chinalist\">\"China List\"</string>\n    <string name=\"acl_rule_templates_generic\">\"子網路/主機名稱 PCRE 模式\"</string>\n    <string name=\"acl_rule_templates_domain\">\"網域及其所有子網域\"</string>\n\n    <!-- plugin -->\n    <string name=\"plugin\">\"外掛程式\"</string>\n    <string name=\"plugin_configure\">\"設定…\"</string>\n    <string name=\"plugin_disabled\">\"停用\"</string>\n    <string name=\"plugin_unknown\">\"未知插件 %s\"</string>\n    <string name=\"plugin_untrusted\">\"警告：此外掛程式似乎不是來自一個已知的受信任來源。\"</string>\n    <string name=\"profile_plugin\">\"外掛程式： %s\"</string>\n    <string name=\"add_profile_scanner_permission_required\">\"掃描 QR 碼需要相機權限。\"</string>\n\n    <!-- notification category -->\n    <string name=\"service_vpn\">\"VPN 服務\"</string>\n    <string name=\"add_profile_methods_manual_settings\">\"手動設置\"</string>\n\n    <!-- misc -->\n    <string name=\"advanced\">\"高級\"</string>\n\n    <!-- misc -->\n    <string name=\"service_mode\">\"服務模式\"</string>\n    <string name=\"service_mode_proxy\">\"仅代理\"</string>\n    <string name=\"service_mode_transproxy\">\"透明代理\"</string>\n    <string name=\"port_proxy\">\"SOCKS5 代理連接埠\"</string>\n    <string name=\"port_local_dns\">\"本地 DNS 連接埠\"</string>\n    <string name=\"port_transproxy\">\"透明代理連接埠\"</string>\n    <string name=\"service_proxy\">\"代理服務\"</string>\n    <string name=\"service_transproxy\">\"透明代理服務\"</string>\n    <string name=\"vpn_permission_denied\">\"没有權限創建 VPN 服務\"</string>\n    <string name=\"auto_connect_summary_v24\">\"允許 Shadowsocks 隨系統啟動，建議使用始終開啟的 VPN\"</string>\n    <string name=\"direct_boot_aware\">\"允許鎖屏時切換\"</string>\n    <string name=\"direct_boot_aware_summary\">\"選中的配置信息會不那麼安全\"</string>\n    <string name=\"acl_rule_online_config\">\"在線規則文件 URL\"</string>\n    <string name=\"action_import_file\">\"從文件導入…\"</string>\n    <string name=\"night_mode\">\"夜間模式\"</string>\n    <string name=\"night_mode_system\">\"跟隨系統\"</string>\n    <string name=\"night_mode_auto\">\"自動\"</string>\n    <string name=\"night_mode_on\">\"開啟\"</string>\n    <string name=\"night_mode_off\">\"關閉\"</string>\n    <string name=\"send_email\">\"發送電子郵件\"</string>\n    <string name=\"action_export_more\">\"導出…\"</string>\n    <string name=\"action_export_file\">\"導出至文件…\"</string>\n    <string name=\"cleartext_http_warning\">\"HTTP 明文流量不安全\"</string>\n    <string name=\"share_over_lan\">\"通過局域網分享\"</string>\n    <string name=\"connection_test_pending\">\"檢查連接\"</string>\n    <string name=\"file_manager_missing\">\"請安裝文件管理器，如 MiXplorer\"</string>\n    <string name=\"tcp_fastopen_failure\">\"切換失敗\"</string>\n    <string name=\"udp_fallback\">\"UDP 配置\"</string>\n    <string name=\"action_replace_file\">\"從文件替換…\"</string>\n    <string name=\"off\">\"關\"</string>\n    <string name=\"proxied_apps_mode\">\"模式\"</string>\n    <string name=\"metered\">\"網絡限制\"</string>\n    <string name=\"metered_summary\">\"使系統視此 VPN 為按流量計費\"</string>\n    <plurals name=\"hosts_summary\">\n        <item quantity=\"other\">\"配置了 %d 個主機名\"</item>\n    </plurals>\n\n    <!-- subscriptions -->\n    <string name=\"subscriptions\">\"訂閱\"</string>\n    <string name=\"add_subscription\">\"添加訂閱\"</string>\n    <string name=\"edit_subscription\">\"編輯訂閱\"</string>\n    <string name=\"update_subscription\">\"更新訂閱\"</string>\n    <string name=\"service_subscription\">\"訂閱服務\"</string>\n    <string name=\"service_subscription_working\">\"正在更新訂閱 (%d / %d)\"</string>\n    <string name=\"service_subscription_finishing\">\"訂閱更新中\"</string>\n</resources>"
  },
  {
    "path": "core/src/main/res/xml/backup_descriptor.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<full-backup-content xmlns:tools=\"http://schemas.android.com/tools\"\n                     tools:ignore=\"FullBackupContent\">\n    <include domain=\"database\" path=\"profile.db\"/>\n    <!-- No device storage yet in Android 6.0 -->\n    <include domain=\"database\" path=\"config.db\"/>\n    <include domain=\"device_database\" path=\"config.db\"/>\n</full-backup-content>\n"
  },
  {
    "path": "core/src/main/res/xml/default_configs.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<defaultsMap>\n    <entry>\n        <key>proxy_url</key>\n        <value>https://socks123.azureedge.net/get.php</value>\n    </entry>\n</defaultsMap>\n"
  },
  {
    "path": "core/src/main/res/xml/locales_config.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<locale-config xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <locale android:name=\"ar\"/>\n    <locale android:name=\"de\"/>\n    <locale android:name=\"en\"/>\n    <locale android:name=\"es\"/>\n    <locale android:name=\"fa\"/>\n    <locale android:name=\"fr\"/>\n    <locale android:name=\"ja\"/>\n    <locale android:name=\"ko\"/>\n    <locale android:name=\"ru\"/>\n    <locale android:name=\"tr\"/>\n    <locale android:name=\"uk\"/>\n    <locale android:name=\"zh-CN\"/>\n    <locale android:name=\"zh-TW\"/>\n</locale-config>\n"
  },
  {
    "path": "core/src/main/res/xml/network_security_config.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<network-security-config>\n    <base-config cleartextTrafficPermitted=\"false\"/>\n</network-security-config>\n"
  },
  {
    "path": "core/src/main/rust/linker-wrapper.py",
    "content": "from __future__ import absolute_import, print_function, unicode_literals\n\nimport os\nimport shlex\nimport shutil\nimport subprocess\nimport sys\n\nrustcc = os.environ['RUST_ANDROID_GRADLE_CC']\n\nif sys.platform == 'msys' or sys.platform == 'cygwin':\n    import ctypes\n\n    cygdll = 'cygwin1.dll' if sys.platform == 'cygwin' else 'msys-2.0.dll'\n    cygwin = ctypes.cdll.LoadLibrary(cygdll)\n\n    def win2posix(path):\n        CCP_WIN_W_TO_POSIX = 3\n        size = cygwin.cygwin_conv_path(CCP_WIN_W_TO_POSIX, path, 0, 0)\n        retval = ctypes.create_string_buffer(size)\n        cygwin.cygwin_conv_path(CCP_WIN_W_TO_POSIX, path, retval, size)\n        return retval.value.decode()\n\n    rustcc = win2posix(rustcc)\n\nargs = [rustcc, os.environ['RUST_ANDROID_GRADLE_CC_LINK_ARG']] + sys.argv[1:]\n\ndef update_in_place(arglist):\n    # The `gcc` library is not included starting from NDK version 23.\n    # Work around by using `unwind` replacement.\n    ndk_major_version = os.environ[\"CARGO_NDK_MAJOR_VERSION\"]\n    if ndk_major_version.isdigit():\n        if 23 <= int(ndk_major_version):\n            for i, arg in enumerate(arglist):\n                if arg.startswith(\"-lgcc\"):\n                    # This is one way to preserve line endings.\n                    arglist[i] = \"-lunwind\" + arg[len(\"-lgcc\") :]\n\n\nupdate_in_place(args)\n\nfor arg in args:\n    if arg.startswith(\"@\"):\n        fileargs = open(arg[1:], \"r\").read().splitlines(keepends=True)\n        update_in_place(fileargs)\n        open(arg[1:], \"w\").write(\"\".join(fileargs))\n\nlinkargfileName = ''\nif (sys.platform == 'msys' or sys.platform == 'cygwin') and len(''.join(args)) > 8191:\n    import codecs\n    import tempfile\n\n    def posix2win(path):\n        CCP_POSIX_TO_WIN_W = 1\n        size = cygwin.cygwin_conv_path(CCP_POSIX_TO_WIN_W, str(path).encode(), 0, 0)\n        retval = ctypes.create_unicode_buffer(size)\n        cygwin.cygwin_conv_path(CCP_POSIX_TO_WIN_W, str(path).encode(), retval, size)\n        return retval.value\n\n    # response file should be use UTF-16 with BOM\n    linkargfile = tempfile.NamedTemporaryFile(delete=False)\n    linkargfile.write(codecs.BOM_UTF16_LE)\n    linkargfile.write('\\n'.join(sys.argv[1:]).encode('utf-16-le'))\n    linkargfile.close()\n    linkargfileName = linkargfile.name\n    linkargfileNameW = posix2win(linkargfileName)\n    args = [rustcc, os.environ['RUST_ANDROID_GRADLE_CC_LINK_ARG'], '@' + linkargfileNameW]\n\n\n# This only appears when the subprocess call fails, but it's helpful then.\nprintable_cmd = \" \".join(shlex.quote(arg) for arg in args)\nprint(printable_cmd)\n\ncode = subprocess.call(args)\nif code == 0:\n    sys_argv = sys.argv\n    if sys.platform == 'msys' or sys.platform == 'cygwin' or sys.platform == 'win32':\n        linkargs = list(filter(lambda s: s.startswith('@') and s.find('linker-arguments') != -1, sys.argv[1:]))\n        if linkargs != []:\n            with open(linkargs[0][1:]) as f:\n                sys_argv = f.read().splitlines()\n    shutil.copyfile(sys_argv[sys_argv.index('-o') + 1], os.environ['RUST_ANDROID_GRADLE_TARGET'])\nif linkargfileName != '':\n    os.unlink(linkargfileName)\nsys.exit(code)\n"
  },
  {
    "path": "core/src/test/java/com/github/shadowsocks/database/KeyValuePairTest.kt",
    "content": "/*******************************************************************************\n *                                                                             *\n *  Copyright (C) 2017 by Max Lv <max.c.lv@gmail.com>                          *\n *  Copyright (C) 2017 by Mygod Studio <contact-shadowsocks-android@mygod.be>  *\n *                                                                             *\n *  This program is free software: you can redistribute it and/or modify       *\n *  it under the terms of the GNU General Public License as published by       *\n *  the Free Software Foundation, either version 3 of the License, or          *\n *  (at your option) any later version.                                        *\n *                                                                             *\n *  This program is distributed in the hope that it will be useful,            *\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of             *\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the              *\n *  GNU General Public License for more details.                               *\n *                                                                             *\n *  You should have received a copy of the GNU General Public License          *\n *  along with this program. If not, see <http://www.gnu.org/licenses/>.       *\n *                                                                             *\n *******************************************************************************/\n\npackage com.github.shadowsocks.database\n\nimport org.junit.Assert\nimport org.junit.Test\n\nclass KeyValuePairTest {\n    @Test\n    fun putAndGet() {\n        val kvp = KeyValuePair()\n        Assert.assertEquals(true, kvp.put(true).boolean)\n        Assert.assertEquals(3f, kvp.put(3f).float)\n        @Suppress(\"DEPRECATION\")\n        Assert.assertEquals(3L, kvp.put(3).long)\n        Assert.assertEquals(3L, kvp.put(3L).long)\n        Assert.assertEquals(\"3\", kvp.put(\"3\").string)\n        val set = (0 until 3).map(Int::toString).toSet()\n        Assert.assertEquals(set, kvp.put(set).stringSet)\n        Assert.assertEquals(null, kvp.boolean)\n    }\n}\n"
  },
  {
    "path": "detekt.yml",
    "content": "comments:\n  active: false\n\ncomplexity:\n  LabeledExpression:\n    active: false\n  TooManyFunctions:\n    ignoreDeprecated: true\n    ignoreOverridden: true\n\nexceptions:\n  TooGenericExceptionCaught:\n    active: false\n\nformatting:\n  CommentSpacing:\n    active: false\n  Indentation:\n    active: false\n\nnaming:\n  MemberNameEqualsClassName:\n    active: false\n\nstyle:\n  MagicNumber:\n    active: false\n"
  },
  {
    "path": "gradle/gradle-daemon-jvm.properties",
    "content": "#This file is generated by updateDaemonJvm\ntoolchainUrl.FREE_BSD.AARCH64=https\\://api.foojay.io/disco/v3.0/ids/ff1d4fc92bcfc9d3799beabb4e70cfa3/redirect\ntoolchainUrl.FREE_BSD.X86_64=https\\://api.foojay.io/disco/v3.0/ids/08ce182188ada0b93565cd9ca4a4ab32/redirect\ntoolchainUrl.LINUX.AARCH64=https\\://api.foojay.io/disco/v3.0/ids/c5760d82d08e6c26884debb23736ea57/redirect\ntoolchainUrl.LINUX.X86_64=https\\://api.foojay.io/disco/v3.0/ids/08ce182188ada0b93565cd9ca4a4ab32/redirect\ntoolchainUrl.MAC_OS.AARCH64=https\\://api.foojay.io/disco/v3.0/ids/021e528cbed860c875a9016f29ee13c1/redirect\ntoolchainUrl.MAC_OS.X86_64=https\\://api.foojay.io/disco/v3.0/ids/6141bf023dcc7a96c47cad75c59b054e/redirect\ntoolchainUrl.UNIX.AARCH64=https\\://api.foojay.io/disco/v3.0/ids/ff1d4fc92bcfc9d3799beabb4e70cfa3/redirect\ntoolchainUrl.UNIX.X86_64=https\\://api.foojay.io/disco/v3.0/ids/08ce182188ada0b93565cd9ca4a4ab32/redirect\ntoolchainUrl.WINDOWS.AARCH64=https\\://api.foojay.io/disco/v3.0/ids/22860963aebba7217b72b98c4f9a5cfb/redirect\ntoolchainUrl.WINDOWS.X86_64=https\\://api.foojay.io/disco/v3.0/ids/a6eb06d81d82a782734ef3b616ba2684/redirect\ntoolchainVendor=JETBRAINS\ntoolchainVersion=21\n"
  },
  {
    "path": "gradle/libs.versions.toml",
    "content": "[versions]\ncamera = \"1.5.2\"\ncoroutines = \"1.10.2\"\nlifecycle = \"2.10.0\"\nroom = \"2.8.4\"\nwork = \"2.11.0\"\n\n[libraries]\nandroid-gradle = \"com.android.tools.build:gradle:8.13.2\"\nandroidx-browser = \"androidx.browser:browser:1.9.0\"\nandroidx-camera-camera2 = { module = \"androidx.camera:camera-camera2\", version.ref = \"camera\" }\nandroidx-camera-lifecycle = { module = \"androidx.camera:camera-lifecycle\", version.ref = \"camera\" }\nandroidx-camera-view = { module = \"androidx.camera:camera-view\", version.ref = \"camera\" }\nandroidx-concurrent-futures-ktx = \"androidx.concurrent:concurrent-futures-ktx:1.3.0\"\nandroidx-constraintlayout = \"androidx.constraintlayout:constraintlayout:2.2.1\"\nandroidx-core-ktx = \"androidx.core:core-ktx:1.17.0\"\nandroidx-espresso-core = \"androidx.test.espresso:espresso-core:3.7.0\"\nandroidx-fragment-ktx = \"androidx.fragment:fragment-ktx:1.8.9\"\nandroidx-junit-ktx = \"androidx.test.ext:junit-ktx:1.3.0\"\nandroidx-leanback-preference = \"androidx.leanback:leanback-preference:1.2.0\"\nandroidx-lifecycle-livedata-core-ktx = { module = \"androidx.lifecycle:lifecycle-livedata-core-ktx\", version.ref = \"lifecycle\" }\nandroidx-lifecycle-runtime-ktx = { module = \"androidx.lifecycle:lifecycle-runtime-ktx\", version.ref = \"lifecycle\" }\nandroidx-preference = \"androidx.preference:preference:1.2.1\"\nandroidx-room-compiler = { module = \"androidx.room:room-compiler\", version.ref = \"room\" }\nandroidx-room-runtime = { module = \"androidx.room:room-runtime\", version.ref = \"room\" }\nandroidx-room-testing = { module = \"androidx.room:room-testing\", version.ref = \"room\" }\nandroidx-test-runner = \"androidx.test:runner:1.7.0\"\nandroidx-work-multiprocess = { module = \"androidx.work:work-multiprocess\", version.ref = \"work\" }\nandroidx-work-runtime-ktx = { module = \"androidx.work:work-runtime-ktx\", version.ref = \"work\" }\nbarcode-scanning = \"com.google.mlkit:barcode-scanning:17.3.0\"\ndesugar = \"com.android.tools:desugar_jdk_libs:2.1.5\"\ndnsjava = \"dnsjava:dnsjava:3.6.4\"\ndokka = \"org.jetbrains.dokka:dokka-gradle-plugin:2.1.0\"\nfastscroll = \"me.zhanghai.android.fastscroll:library:1.3.0\"\nfirebase-analytics = \"com.google.firebase:firebase-analytics:23.0.0\"\nfirebase-crashlytics = \"com.google.firebase:firebase-crashlytics:20.0.4\"\nfirebase-crashlytics-gradle = \"com.google.firebase:firebase-crashlytics-gradle:3.0.6\"\ngoogle-oss-licenses = \"com.google.android.gms:oss-licenses-plugin:0.10.10\"\ngoogle-services = \"com.google.gms:google-services:4.4.4\"\ngradle-maven-publish = \"com.vanniktech:gradle-maven-publish-plugin:0.36.0\"\njunit = \"junit:junit:4.13.2\"\nkotlin-gradle = \"org.jetbrains.kotlin:kotlin-gradle-plugin:2.2.0\"\nkotlinx-coroutines-android = { module = \"org.jetbrains.kotlinx:kotlinx-coroutines-android\", version.ref = \"coroutines\" }\nkotlinx-coroutines-play-services = { module = \"org.jetbrains.kotlinx:kotlinx-coroutines-play-services\", version.ref = \"coroutines\" }\nlocale-api = \"com.twofortyfouram:android-plugin-api-for-locale:1.0.4\"\nmaterial = \"com.google.android.material:material:1.13.0\"\nplay-services-oss-licenses = \"com.google.android.gms:play-services-oss-licenses:17.3.0\"\npreferencex-simplemenu = \"com.takisoft.preferencex:preferencex-simplemenu:1.1.0\"\nrust-android = \"org.mozilla.rust-android-gradle:plugin:0.9.6\"\ntimber = \"com.jakewharton.timber:timber:5.0.1\"\nzxing = \"com.google.zxing:core:3.5.4\"\n\n[plugins]\nksp = \"com.google.devtools.ksp:2.3.4\"\nversions = \"com.github.ben-manes.versions:0.53.0\"\n"
  },
  {
    "path": "gradle/wrapper/gradle-wrapper.properties",
    "content": "distributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\ndistributionUrl=https\\://services.gradle.org/distributions/gradle-8.14.3-bin.zip\nnetworkTimeout=10000\nvalidateDistributionUrl=true\nzipStoreBase=GRADLE_USER_HOME\nzipStorePath=wrapper/dists\n"
  },
  {
    "path": "gradle.properties",
    "content": "# Project-wide Gradle settings.\n\n# IDE (e.g. Android Studio) users:\n# Gradle settings configured through the IDE *will override*\n# any settings specified in this file.\n\n# For more details on how to configure your build environment visit\n# http://www.gradle.org/docs/current/userguide/build_environment.html\n\n# Specifies the JVM arguments used for the daemon process.\n# The setting is particularly useful for tweaking memory settings.\nandroid.enableJetifier=true\nandroid.enableR8.fullMode=true\nandroid.enableResourceOptimizations=false\nandroid.nonTransitiveRClass=false\nandroid.useAndroidX=true\n\n# When configured, Gradle will run in incubating parallel mode.\n# This option should only be used with decoupled projects. More details, visit\n# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects\n# org.gradle.parallel=true\norg.gradle.jvmargs=-Xmx1536m -XX:+UseParallelGC\n\n# systemProp.http.proxyHost=127.0.0.1\n# systemProp.http.proxyPort=1080"
  },
  {
    "path": "gradlew",
    "content": "#!/bin/sh\n\n#\n# Copyright © 2015-2021 the original authors.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      https://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n#\n# SPDX-License-Identifier: Apache-2.0\n#\n\n##############################################################################\n#\n#   Gradle start up script for POSIX generated by Gradle.\n#\n#   Important for running:\n#\n#   (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is\n#       noncompliant, but you have some other compliant shell such as ksh or\n#       bash, then to run this script, type that shell name before the whole\n#       command line, like:\n#\n#           ksh Gradle\n#\n#       Busybox and similar reduced shells will NOT work, because this script\n#       requires all of these POSIX shell features:\n#         * functions;\n#         * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,\n#           «${var#prefix}», «${var%suffix}», and «$( cmd )»;\n#         * compound commands having a testable exit status, especially «case»;\n#         * various built-in commands including «command», «set», and «ulimit».\n#\n#   Important for patching:\n#\n#   (2) This script targets any POSIX shell, so it avoids extensions provided\n#       by Bash, Ksh, etc; in particular arrays are avoided.\n#\n#       The \"traditional\" practice of packing multiple parameters into a\n#       space-separated string is a well documented source of bugs and security\n#       problems, so this is (mostly) avoided, by progressively accumulating\n#       options in \"$@\", and eventually passing that to Java.\n#\n#       Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,\n#       and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;\n#       see the in-line comments for details.\n#\n#       There are tweaks for specific operating systems such as AIX, CygWin,\n#       Darwin, MinGW, and NonStop.\n#\n#   (3) This script is generated from the Groovy template\n#       https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt\n#       within the Gradle project.\n#\n#       You can find Gradle at https://github.com/gradle/gradle/.\n#\n##############################################################################\n\n# Attempt to set APP_HOME\n\n# Resolve links: $0 may be a link\napp_path=$0\n\n# Need this for daisy-chained symlinks.\nwhile\n    APP_HOME=${app_path%\"${app_path##*/}\"}  # leaves a trailing /; empty if no leading path\n    [ -h \"$app_path\" ]\ndo\n    ls=$( ls -ld \"$app_path\" )\n    link=${ls#*' -> '}\n    case $link in             #(\n      /*)   app_path=$link ;; #(\n      *)    app_path=$APP_HOME$link ;;\n    esac\ndone\n\n# This is normally unused\n# shellcheck disable=SC2034\nAPP_BASE_NAME=${0##*/}\n# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036)\nAPP_HOME=$( cd -P \"${APP_HOME:-./}\" > /dev/null && printf '%s\\n' \"$PWD\" ) || exit\n\n# Use the maximum available, or set MAX_FD != -1 to use that value.\nMAX_FD=maximum\n\nwarn () {\n    echo \"$*\"\n} >&2\n\ndie () {\n    echo\n    echo \"$*\"\n    echo\n    exit 1\n} >&2\n\n# OS specific support (must be 'true' or 'false').\ncygwin=false\nmsys=false\ndarwin=false\nnonstop=false\ncase \"$( uname )\" in                #(\n  CYGWIN* )         cygwin=true  ;; #(\n  Darwin* )         darwin=true  ;; #(\n  MSYS* | MINGW* )  msys=true    ;; #(\n  NONSTOP* )        nonstop=true ;;\nesac\n\nCLASSPATH=\"\\\\\\\"\\\\\\\"\"\n\n\n# Determine the Java command to use to start the JVM.\nif [ -n \"$JAVA_HOME\" ] ; then\n    if [ -x \"$JAVA_HOME/jre/sh/java\" ] ; then\n        # IBM's JDK on AIX uses strange locations for the executables\n        JAVACMD=$JAVA_HOME/jre/sh/java\n    else\n        JAVACMD=$JAVA_HOME/bin/java\n    fi\n    if [ ! -x \"$JAVACMD\" ] ; then\n        die \"ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\n    fi\nelse\n    JAVACMD=java\n    if ! command -v java >/dev/null 2>&1\n    then\n        die \"ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\n    fi\nfi\n\n# Increase the maximum file descriptors if we can.\nif ! \"$cygwin\" && ! \"$darwin\" && ! \"$nonstop\" ; then\n    case $MAX_FD in #(\n      max*)\n        # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.\n        # shellcheck disable=SC2039,SC3045\n        MAX_FD=$( ulimit -H -n ) ||\n            warn \"Could not query maximum file descriptor limit\"\n    esac\n    case $MAX_FD in  #(\n      '' | soft) :;; #(\n      *)\n        # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.\n        # shellcheck disable=SC2039,SC3045\n        ulimit -n \"$MAX_FD\" ||\n            warn \"Could not set maximum file descriptor limit to $MAX_FD\"\n    esac\nfi\n\n# Collect all arguments for the java command, stacking in reverse order:\n#   * args from the command line\n#   * the main class name\n#   * -classpath\n#   * -D...appname settings\n#   * --module-path (only if needed)\n#   * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.\n\n# For Cygwin or MSYS, switch paths to Windows format before running java\nif \"$cygwin\" || \"$msys\" ; then\n    APP_HOME=$( cygpath --path --mixed \"$APP_HOME\" )\n    CLASSPATH=$( cygpath --path --mixed \"$CLASSPATH\" )\n\n    JAVACMD=$( cygpath --unix \"$JAVACMD\" )\n\n    # Now convert the arguments - kludge to limit ourselves to /bin/sh\n    for arg do\n        if\n            case $arg in                                #(\n              -*)   false ;;                            # don't mess with options #(\n              /?*)  t=${arg#/} t=/${t%%/*}              # looks like a POSIX filepath\n                    [ -e \"$t\" ] ;;                      #(\n              *)    false ;;\n            esac\n        then\n            arg=$( cygpath --path --ignore --mixed \"$arg\" )\n        fi\n        # Roll the args list around exactly as many times as the number of\n        # args, so each arg winds up back in the position where it started, but\n        # possibly modified.\n        #\n        # NB: a `for` loop captures its iteration list before it begins, so\n        # changing the positional parameters here affects neither the number of\n        # iterations, nor the values presented in `arg`.\n        shift                   # remove old arg\n        set -- \"$@\" \"$arg\"      # push replacement arg\n    done\nfi\n\n\n# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\nDEFAULT_JVM_OPTS='\"-Xmx64m\" \"-Xms64m\"'\n\n# Collect all arguments for the java command:\n#   * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments,\n#     and any embedded shellness will be escaped.\n#   * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be\n#     treated as '${Hostname}' itself on the command line.\n\nset -- \\\n        \"-Dorg.gradle.appname=$APP_BASE_NAME\" \\\n        -classpath \"$CLASSPATH\" \\\n        -jar \"$APP_HOME/gradle/wrapper/gradle-wrapper.jar\" \\\n        \"$@\"\n\n# Stop when \"xargs\" is not available.\nif ! command -v xargs >/dev/null 2>&1\nthen\n    die \"xargs is not available\"\nfi\n\n# Use \"xargs\" to parse quoted args.\n#\n# With -n1 it outputs one arg per line, with the quotes and backslashes removed.\n#\n# In Bash we could simply go:\n#\n#   readarray ARGS < <( xargs -n1 <<<\"$var\" ) &&\n#   set -- \"${ARGS[@]}\" \"$@\"\n#\n# but POSIX shell has neither arrays nor command substitution, so instead we\n# post-process each arg (as a line of input to sed) to backslash-escape any\n# character that might be a shell metacharacter, then use eval to reverse\n# that process (while maintaining the separation between arguments), and wrap\n# the whole thing up as a single \"set\" statement.\n#\n# This will of course break if any of these variables contains a newline or\n# an unmatched quote.\n#\n\neval \"set -- $(\n        printf '%s\\n' \"$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS\" |\n        xargs -n1 |\n        sed ' s~[^-[:alnum:]+,./:=@_]~\\\\&~g; ' |\n        tr '\\n' ' '\n    )\" '\"$@\"'\n\nexec \"$JAVACMD\" \"$@\"\n"
  },
  {
    "path": "gradlew.bat",
    "content": "@rem\r\n@rem Copyright 2015 the original author or authors.\r\n@rem\r\n@rem Licensed under the Apache License, Version 2.0 (the \"License\");\r\n@rem you may not use this file except in compliance with the License.\r\n@rem You may obtain a copy of the License at\r\n@rem\r\n@rem      https://www.apache.org/licenses/LICENSE-2.0\r\n@rem\r\n@rem Unless required by applicable law or agreed to in writing, software\r\n@rem distributed under the License is distributed on an \"AS IS\" BASIS,\r\n@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n@rem See the License for the specific language governing permissions and\r\n@rem limitations under the License.\r\n@rem\r\n@rem SPDX-License-Identifier: Apache-2.0\r\n@rem\r\n\r\n@if \"%DEBUG%\"==\"\" @echo off\r\n@rem ##########################################################################\r\n@rem\r\n@rem  Gradle startup script for Windows\r\n@rem\r\n@rem ##########################################################################\r\n\r\n@rem Set local scope for the variables with windows NT shell\r\nif \"%OS%\"==\"Windows_NT\" setlocal\r\n\r\nset DIRNAME=%~dp0\r\nif \"%DIRNAME%\"==\"\" set DIRNAME=.\r\n@rem This is normally unused\r\nset APP_BASE_NAME=%~n0\r\nset APP_HOME=%DIRNAME%\r\n\r\n@rem Resolve any \".\" and \"..\" in APP_HOME to make it shorter.\r\nfor %%i in (\"%APP_HOME%\") do set APP_HOME=%%~fi\r\n\r\n@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\r\nset DEFAULT_JVM_OPTS=\"-Xmx64m\" \"-Xms64m\"\r\n\r\n@rem Find java.exe\r\nif defined JAVA_HOME goto findJavaFromJavaHome\r\n\r\nset JAVA_EXE=java.exe\r\n%JAVA_EXE% -version >NUL 2>&1\r\nif %ERRORLEVEL% equ 0 goto execute\r\n\r\necho. 1>&2\r\necho ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2\r\necho. 1>&2\r\necho Please set the JAVA_HOME variable in your environment to match the 1>&2\r\necho location of your Java installation. 1>&2\r\n\r\ngoto fail\r\n\r\n:findJavaFromJavaHome\r\nset JAVA_HOME=%JAVA_HOME:\"=%\r\nset JAVA_EXE=%JAVA_HOME%/bin/java.exe\r\n\r\nif exist \"%JAVA_EXE%\" goto execute\r\n\r\necho. 1>&2\r\necho ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2\r\necho. 1>&2\r\necho Please set the JAVA_HOME variable in your environment to match the 1>&2\r\necho location of your Java installation. 1>&2\r\n\r\ngoto fail\r\n\r\n:execute\r\n@rem Setup the command line\r\n\r\nset CLASSPATH=\r\n\r\n\r\n@rem Execute Gradle\r\n\"%JAVA_EXE%\" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% \"-Dorg.gradle.appname=%APP_BASE_NAME%\" -classpath \"%CLASSPATH%\" -jar \"%APP_HOME%\\gradle\\wrapper\\gradle-wrapper.jar\" %*\r\n\r\n:end\r\n@rem End local scope for the variables with windows NT shell\r\nif %ERRORLEVEL% equ 0 goto mainEnd\r\n\r\n:fail\r\nrem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of\r\nrem the _cmd.exe /c_ return code!\r\nset EXIT_CODE=%ERRORLEVEL%\r\nif %EXIT_CODE% equ 0 set EXIT_CODE=1\r\nif not \"\"==\"%GRADLE_EXIT_CONSOLE%\" exit %EXIT_CODE%\r\nexit /b %EXIT_CODE%\r\n\r\n:mainEnd\r\nif \"%OS%\"==\"Windows_NT\" endlocal\r\n\r\n:omega\r\n"
  },
  {
    "path": "mobile/.gitignore",
    "content": "/build\n"
  },
  {
    "path": "mobile/build.gradle.kts",
    "content": "plugins {\n    id(\"com.android.application\")\n    id(\"com.google.android.gms.oss-licenses-plugin\")\n    id(\"com.google.gms.google-services\")\n    id(\"com.google.firebase.crashlytics\")\n    kotlin(\"android\")\n    id(\"kotlin-parcelize\")\n}\n\nsetupApp()\n\nandroid {\n    namespace = \"com.github.shadowsocks\"\n    defaultConfig.applicationId = \"com.github.shadowsocks\"\n}\n\ndependencies {\n    coreLibraryDesugaring(libs.desugar)\n    implementation(libs.androidx.browser)\n    implementation(libs.androidx.camera.camera2)\n    implementation(libs.androidx.camera.lifecycle)\n    implementation(libs.androidx.camera.view)\n    implementation(libs.androidx.concurrent.futures.ktx)\n    implementation(libs.androidx.constraintlayout)\n    implementation(libs.androidx.lifecycle.runtime.ktx)\n    implementation(libs.barcode.scanning)\n    implementation(libs.fastscroll)\n    implementation(libs.locale.api)\n    implementation(libs.preferencex.simplemenu)\n    implementation(libs.zxing)\n    testImplementation(libs.junit)\n    androidTestImplementation(libs.androidx.espresso.core)\n    androidTestImplementation(libs.androidx.test.runner)\n}\n"
  },
  {
    "path": "mobile/google-services.json",
    "content": "{\n  \"project_info\": {\n    \"project_number\": \"261400168171\",\n    \"firebase_url\": \"https://admob-app-id-3330146721.firebaseio.com\",\n    \"project_id\": \"admob-app-id-3330146721\",\n    \"storage_bucket\": \"admob-app-id-3330146721.appspot.com\"\n  },\n  \"client\": [\n    {\n      \"client_info\": {\n        \"mobilesdk_app_id\": \"1:261400168171:android:dbdd6331c434162f\",\n        \"android_client_info\": {\n          \"package_name\": \"com.github.shadowsocks\"\n        }\n      },\n      \"oauth_client\": [\n        {\n          \"client_id\": \"261400168171-pcgrp7aprh210vvfc6vut3am2n3chopq.apps.googleusercontent.com\",\n          \"client_type\": 1,\n          \"android_info\": {\n            \"package_name\": \"com.github.shadowsocks\",\n            \"certificate_hash\": \"7309a97ff2680788113c6d0ce53898b911885ff5\"\n          }\n        },\n        {\n          \"client_id\": \"261400168171-sfik8o3pj7e243583olorh7s5974vab1.apps.googleusercontent.com\",\n          \"client_type\": 1,\n          \"android_info\": {\n            \"package_name\": \"com.github.shadowsocks\",\n            \"certificate_hash\": \"58a90f84cfe99d4280aec677c9a1292fae131677\"\n          }\n        },\n        {\n          \"client_id\": \"261400168171-g7aelv5bu012ojr7dod7lq09c9anjimh.apps.googleusercontent.com\",\n          \"client_type\": 3\n        }\n      ],\n      \"api_key\": [\n        {\n          \"current_key\": \"AIzaSyCee3fAad7nb3YsxeUO9mqqHFfAvsSCbVs\"\n        }\n      ],\n      \"services\": {\n        \"appinvite_service\": {\n          \"other_platform_oauth_client\": [\n            {\n              \"client_id\": \"261400168171-g7aelv5bu012ojr7dod7lq09c9anjimh.apps.googleusercontent.com\",\n              \"client_type\": 3\n            }\n          ]\n        }\n      },\n      \"admob_app_id\": \"ca-app-pub-3283768469187309~3571758745\"\n    },\n    {\n      \"client_info\": {\n        \"mobilesdk_app_id\": \"1:261400168171:android:0dbac07695d93817\",\n        \"android_client_info\": {\n          \"package_name\": \"com.github.shadowsocks.tv\"\n        }\n      },\n      \"oauth_client\": [\n        {\n          \"client_id\": \"261400168171-g7aelv5bu012ojr7dod7lq09c9anjimh.apps.googleusercontent.com\",\n          \"client_type\": 3\n        }\n      ],\n      \"api_key\": [\n        {\n          \"current_key\": \"AIzaSyCee3fAad7nb3YsxeUO9mqqHFfAvsSCbVs\"\n        }\n      ],\n      \"services\": {\n        \"appinvite_service\": {\n          \"other_platform_oauth_client\": [\n            {\n              \"client_id\": \"261400168171-g7aelv5bu012ojr7dod7lq09c9anjimh.apps.googleusercontent.com\",\n              \"client_type\": 3\n            }\n          ]\n        }\n      }\n    }\n  ],\n  \"configuration_version\": \"1\"\n}\n"
  },
  {
    "path": "mobile/src/main/AndroidManifest.xml",
    "content": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n          xmlns:tools=\"http://schemas.android.com/tools\"\n          tools:ignore=\"MissingLeanbackSupport\">\n\n    <uses-permission android:name=\"android.permission.QUERY_ALL_PACKAGES\"\n                     tools:ignore=\"QueryAllPackagesPermission\" />\n    <uses-permission android:name=\"android.permission.CAMERA\" />\n\n    <uses-feature android:name=\"android.hardware.touchscreen\"\n                  android:required=\"false\"/>\n    <uses-feature android:name=\"android.hardware.camera\"\n                  android:required=\"false\"/>\n    <uses-feature android:name=\"android.software.leanback\"\n                  android:required=\"false\"/>\n\n    <application\n        android:name=\".App\"\n        android:localeConfig=\"@xml/locales_config\"\n        tools:ignore=\"MissingTvBanner\">\n\n        <activity\n            android:name=\".MainActivity\"\n            android:label=\"@string/app_name\"\n            android:exported=\"true\"\n            android:theme=\"@style/Theme.Shadowsocks.Immersive.Navigation\"\n            android:launchMode=\"singleTask\">\n            <intent-filter>\n                <action android:name=\"android.intent.action.MAIN\"/>\n                <category android:name=\"android.intent.category.LAUNCHER\"/>\n                <category android:name=\"android.intent.category.LEANBACK_LAUNCHER\"/>\n            </intent-filter>\n            <intent-filter>\n                <action android:name=\"android.service.quicksettings.action.QS_TILE_PREFERENCES\" />\n            </intent-filter>\n            <meta-data android:name=\"android.app.shortcuts\"\n                       android:resource=\"@xml/shortcuts\"/>\n        </activity>\n\n        <activity\n            android:name=\".ProfileConfigActivity\"\n            android:exported=\"false\"\n            android:theme=\"@style/Theme.Shadowsocks.Immersive\"\n            android:excludeFromRecents=\"true\"\n            android:label=\"@string/profile_config\"\n            android:launchMode=\"singleTask\"/>\n\n        <activity\n            android:name=\".AppManager\"\n            android:exported=\"false\"\n            android:label=\"@string/proxied_apps\"\n            android:parentActivityName=\".ProfileConfigActivity\"\n            android:theme=\"@style/Theme.Shadowsocks.Immersive\"\n            android:launchMode=\"singleTask\"\n            android:excludeFromRecents=\"true\"/>\n\n        <activity\n            android:name=\".UdpFallbackProfileActivity\"\n            android:exported=\"false\"\n            android:label=\"@string/udp_fallback\"\n            android:theme=\"@style/Theme.Shadowsocks.Immersive\"\n            android:launchMode=\"singleTask\"\n            android:excludeFromRecents=\"true\"/>\n\n        <activity\n            android:name=\".ScannerActivity\"\n            android:exported=\"true\"\n            android:label=\"@string/add_profile_methods_scan_qr_code\"\n            android:parentActivityName=\".MainActivity\"\n            android:theme=\"@style/Theme.Shadowsocks.Immersive.Navigation\"\n            android:launchMode=\"singleTask\"\n            android:screenOrientation=\"locked\"\n            android:excludeFromRecents=\"true\"/>\n\n        <activity\n            android:name=\".tasker.ConfigActivity\"\n            android:exported=\"true\"\n            android:theme=\"@style/Theme.Shadowsocks.Immersive\">\n            <intent-filter>\n                <action android:name=\"com.twofortyfouram.locale.intent.action.EDIT_SETTING\" />\n            </intent-filter>\n        </activity>\n\n        <activity\n            android:name=\".QuickToggleShortcut\"\n            android:label=\"@string/quick_toggle\"\n            android:theme=\"@android:style/Theme.Translucent.NoTitleBar\"\n            android:exported=\"true\"\n            android:launchMode=\"singleTask\"\n            android:excludeFromRecents=\"true\"\n            android:taskAffinity=\"\"\n            android:process=\":bg\">\n            <intent-filter>\n                <action android:name=\"android.intent.action.CREATE_SHORTCUT\" />\n            </intent-filter>\n        </activity>\n\n        <service android:name=\".bg.TileService\"\n                 android:label=\"@string/quick_toggle\"\n                 android:process=\":bg\"\n                 android:exported=\"true\"\n                 android:directBootAware=\"true\"\n                 android:icon=\"@drawable/ic_service_active\"\n                 android:permission=\"android.permission.BIND_QUICK_SETTINGS_TILE\"\n                 tools:targetApi=\"n\">\n            <intent-filter>\n                <action android:name=\"android.service.quicksettings.action.QS_TILE\" />\n            </intent-filter>\n            <meta-data\n                android:name=\"android.service.quicksettings.TOGGLEABLE_TILE\"\n                android:value=\"true\" />\n        </service>\n\n        <receiver android:name=\".tasker.ActionListener\"\n                  android:process=\":bg\"\n                  android:directBootAware=\"true\"\n                  android:exported=\"true\"\n                  tools:ignore=\"ExportedReceiver\">\n            <intent-filter>\n                <action android:name=\"com.twofortyfouram.locale.intent.action.FIRE_SETTING\"/>\n            </intent-filter>\n        </receiver>\n\n        <meta-data\n            android:name=\"com.google.android.gms.ads.APPLICATION_ID\"\n            android:value=\"ca-app-pub-3283768469187309~3571758745\"/>\n    </application>\n</manifest>\n"
  },
  {
    "path": "mobile/src/main/java/com/github/shadowsocks/AboutFragment.kt",
    "content": "/*******************************************************************************\n *                                                                             *\n *  Copyright (C) 2017 by Max Lv <max.c.lv@gmail.com>                          *\n *  Copyright (C) 2017 by Mygod Studio <contact-shadowsocks-android@mygod.be>  *\n *                                                                             *\n *  This program is free software: you can redistribute it and/or modify       *\n *  it under the terms of the GNU General Public License as published by       *\n *  the Free Software Foundation, either version 3 of the License, or          *\n *  (at your option) any later version.                                        *\n *                                                                             *\n *  This program is distributed in the hope that it will be useful,            *\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of             *\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the              *\n *  GNU General Public License for more details.                               *\n *                                                                             *\n *  You should have received a copy of the GNU General Public License          *\n *  along with this program. If not, see <http://www.gnu.org/licenses/>.       *\n *                                                                             *\n *******************************************************************************/\n\npackage com.github.shadowsocks\n\nimport android.content.Intent\nimport android.os.Bundle\nimport android.text.SpannableStringBuilder\nimport android.text.method.LinkMovementMethod\nimport android.text.style.ClickableSpan\nimport android.text.style.URLSpan\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport android.widget.TextView\nimport androidx.core.net.toUri\nimport androidx.core.text.HtmlCompat\nimport androidx.core.text.parseAsHtml\nimport androidx.core.view.ViewCompat\nimport com.github.shadowsocks.widget.ListHolderListener\nimport com.github.shadowsocks.widget.MainListListener\nimport com.google.android.gms.oss.licenses.OssLicensesMenuActivity\n\nclass AboutFragment : ToolbarFragment() {\n    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? =\n            inflater.inflate(R.layout.layout_about, container, false)\n\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        super.onViewCreated(view, savedInstanceState)\n        ViewCompat.setOnApplyWindowInsetsListener(view, ListHolderListener)\n        toolbar.title = getString(R.string.about_title, BuildConfig.VERSION_NAME)\n        view.findViewById<TextView>(R.id.tv_about).apply {\n            ViewCompat.setOnApplyWindowInsetsListener(this, MainListListener)\n            text = SpannableStringBuilder(resources.openRawResource(R.raw.about).bufferedReader().readText()\n                    .parseAsHtml(HtmlCompat.FROM_HTML_SEPARATOR_LINE_BREAK_LIST_ITEM)).apply {\n                for (span in getSpans(0, length, URLSpan::class.java)) {\n                    setSpan(object : ClickableSpan() {\n                        override fun onClick(view: View) = when {\n                            span.url.startsWith(\"#\") -> {\n                                startActivity(Intent(context, OssLicensesMenuActivity::class.java))\n                            }\n                            span.url.startsWith(\"mailto:\") -> {\n                                startActivity(Intent.createChooser(Intent().apply {\n                                    action = Intent.ACTION_SENDTO\n                                    data = span.url.toUri()\n                                }, getString(R.string.send_email)))\n                            }\n                            else -> (activity as MainActivity).launchUrl(span.url)\n                        }\n                    }, getSpanStart(span), getSpanEnd(span), getSpanFlags(span))\n                    removeSpan(span)\n                }\n            }\n            movementMethod = LinkMovementMethod.getInstance()\n        }\n    }\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/github/shadowsocks/App.kt",
    "content": "/*******************************************************************************\n *                                                                             *\n *  Copyright (C) 2017 by Max Lv <max.c.lv@gmail.com>                          *\n *  Copyright (C) 2017 by Mygod Studio <contact-shadowsocks-android@mygod.be>  *\n *                                                                             *\n *  This program is free software: you can redistribute it and/or modify       *\n *  it under the terms of the GNU General Public License as published by       *\n *  the Free Software Foundation, either version 3 of the License, or          *\n *  (at your option) any later version.                                        *\n *                                                                             *\n *  This program is distributed in the hope that it will be useful,            *\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of             *\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the              *\n *  GNU General Public License for more details.                               *\n *                                                                             *\n *  You should have received a copy of the GNU General Public License          *\n *  along with this program. If not, see <http://www.gnu.org/licenses/>.       *\n *                                                                             *\n *******************************************************************************/\n\npackage com.github.shadowsocks\n\nimport android.app.Application\nimport android.content.res.Configuration\nimport androidx.appcompat.app.AppCompatDelegate\n\nclass App : Application() {\n    override fun onCreate() {\n        super.onCreate()\n        Core.init(this, MainActivity::class)\n        AppCompatDelegate.setCompatVectorFromResourcesEnabled(true)\n    }\n\n    override fun onConfigurationChanged(newConfig: Configuration) {\n        super.onConfigurationChanged(newConfig)\n        Core.updateNotificationChannels()\n    }\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/github/shadowsocks/AppManager.kt",
    "content": "/*******************************************************************************\n *                                                                             *\n *  Copyright (C) 2017 by Max Lv <max.c.lv@gmail.com>                          *\n *  Copyright (C) 2017 by Mygod Studio <contact-shadowsocks-android@mygod.be>  *\n *                                                                             *\n *  This program is free software: you can redistribute it and/or modify       *\n *  it under the terms of the GNU General Public License as published by       *\n *  the Free Software Foundation, either version 3 of the License, or          *\n *  (at your option) any later version.                                        *\n *                                                                             *\n *  This program is distributed in the hope that it will be useful,            *\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of             *\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the              *\n *  GNU General Public License for more details.                               *\n *                                                                             *\n *  You should have received a copy of the GNU General Public License          *\n *  along with this program. If not, see <http://www.gnu.org/licenses/>.       *\n *                                                                             *\n *******************************************************************************/\n\npackage com.github.shadowsocks\n\nimport android.Manifest\nimport android.animation.Animator\nimport android.animation.AnimatorListenerAdapter\nimport android.annotation.SuppressLint\nimport android.content.BroadcastReceiver\nimport android.content.Intent\nimport android.content.pm.ApplicationInfo\nimport android.content.pm.PackageInfo\nimport android.content.pm.PackageManager\nimport android.graphics.drawable.Drawable\nimport android.os.Bundle\nimport android.util.SparseBooleanArray\nimport android.view.*\nimport android.widget.Filter\nimport android.widget.Filterable\nimport android.widget.ImageView\nimport android.widget.RadioGroup\nimport android.widget.SearchView\nimport android.widget.Switch\nimport android.widget.TextView\nimport androidx.annotation.UiThread\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.appcompat.widget.Toolbar\nimport androidx.core.util.set\nimport androidx.core.view.ViewCompat\nimport androidx.lifecycle.lifecycleScope\nimport androidx.recyclerview.widget.DefaultItemAnimator\nimport androidx.recyclerview.widget.LinearLayoutManager\nimport androidx.recyclerview.widget.RecyclerView\nimport com.github.shadowsocks.Core.app\nimport com.github.shadowsocks.database.ProfileManager\nimport com.github.shadowsocks.preference.DataStore\nimport com.github.shadowsocks.utils.DirectBoot\nimport com.github.shadowsocks.utils.listenForPackageChanges\nimport com.github.shadowsocks.widget.ListHolderListener\nimport com.github.shadowsocks.widget.ListListener\nimport com.google.android.material.snackbar.Snackbar\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.Job\nimport kotlinx.coroutines.ensureActive\nimport kotlinx.coroutines.launch\nimport kotlinx.coroutines.withContext\nimport me.zhanghai.android.fastscroll.FastScrollerBuilder\nimport me.zhanghai.android.fastscroll.PopupTextProvider\nimport kotlin.coroutines.coroutineContext\n\nclass AppManager : AppCompatActivity() {\n    companion object {\n        @SuppressLint(\"StaticFieldLeak\")\n        private var instance: AppManager? = null\n        private const val SWITCH = \"switch\"\n\n        private var receiver: BroadcastReceiver? = null\n        private var cachedApps: Map<String, PackageInfo>? = null\n        private fun getCachedApps(pm: PackageManager) = synchronized(AppManager) {\n            if (receiver == null) receiver = app.listenForPackageChanges {\n                synchronized(AppManager) {\n                    receiver = null\n                    cachedApps = null\n                }\n                instance?.loadApps()\n            }\n            // Labels and icons can change on configuration (locale, etc.) changes, therefore they are not cached.\n            val cachedApps = cachedApps ?: pm.getInstalledPackages(\n                    PackageManager.GET_PERMISSIONS or PackageManager.MATCH_UNINSTALLED_PACKAGES)\n                    .filter {\n                        when (it.packageName) {\n                            app.packageName -> false\n                            \"android\" -> true\n                            else -> it.requestedPermissions?.contains(Manifest.permission.INTERNET) == true\n                        }\n                    }\n                    .associateBy { it.packageName }\n            this.cachedApps = cachedApps\n            cachedApps\n        }\n    }\n\n    private class ProxiedApp(private val pm: PackageManager, private val appInfo: ApplicationInfo,\n                             val packageName: String) {\n        val name: CharSequence = appInfo.loadLabel(pm)    // cached for sorting\n        val icon: Drawable get() = appInfo.loadIcon(pm)\n        val uid get() = appInfo.uid\n    }\n\n    private inner class AppViewHolder(view: View) : RecyclerView.ViewHolder(view), View.OnClickListener {\n        private lateinit var item: ProxiedApp\n\n        init {\n            view.setOnClickListener(this)\n        }\n\n        fun bind(app: ProxiedApp) {\n            item = app\n            itemView.findViewById<ImageView>(R.id.itemicon).setImageDrawable(app.icon)\n            itemView.findViewById<TextView>(R.id.title).text = app.name\n            itemView.findViewById<TextView>(R.id.desc).text = \"${app.packageName} (${app.uid})\"\n            itemView.findViewById<Switch>(R.id.itemcheck).isChecked = isProxiedApp(app)\n        }\n\n        fun handlePayload(payloads: List<String>) {\n            if (payloads.contains(SWITCH)) itemView.findViewById<Switch>(R.id.itemcheck).isChecked = isProxiedApp(item)\n        }\n\n        override fun onClick(v: View?) {\n            if (isProxiedApp(item)) proxiedUids.delete(item.uid) else proxiedUids[item.uid] = true\n            DataStore.individual = apps.filter { isProxiedApp(it) }.joinToString(\"\\n\") { it.packageName }\n            DataStore.dirty = true\n\n            appsAdapter.notifyItemRangeChanged(0, appsAdapter.itemCount, SWITCH)\n        }\n    }\n\n    private inner class AppsAdapter : RecyclerView.Adapter<AppViewHolder>(), Filterable, PopupTextProvider {\n        private var filteredApps = apps\n\n        suspend fun reload() {\n            apps = getCachedApps(packageManager).map { (packageName, packageInfo) ->\n                coroutineContext[Job]!!.ensureActive()\n                ProxiedApp(packageManager, packageInfo.applicationInfo!!, packageName)\n            }.sortedWith(compareBy({ !isProxiedApp(it) }, { it.name.toString() }))\n        }\n\n        override fun onBindViewHolder(holder: AppViewHolder, position: Int) = holder.bind(filteredApps[position])\n        override fun onBindViewHolder(holder: AppViewHolder, position: Int, payloads: List<Any>) {\n            if (payloads.isNotEmpty()) {\n                @Suppress(\"UNCHECKED_CAST\")\n                holder.handlePayload(payloads as List<String>)\n                return\n            }\n\n            onBindViewHolder(holder, position)\n        }\n        override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): AppViewHolder =\n                AppViewHolder(LayoutInflater.from(parent.context).inflate(R.layout.layout_apps_item, parent, false))\n        override fun getItemCount(): Int = filteredApps.size\n\n        private val filterImpl = object : Filter() {\n            override fun performFiltering(constraint: CharSequence) = FilterResults().apply {\n                val filteredApps = if (constraint.isEmpty()) apps else apps.filter {\n                    it.name.contains(constraint, true) ||\n                            it.packageName.contains(constraint, true) ||\n                            it.uid.toString().contains(constraint)\n                }\n                count = filteredApps.size\n                values = filteredApps\n            }\n\n            override fun publishResults(constraint: CharSequence, results: FilterResults) {\n                @Suppress(\"UNCHECKED_CAST\")\n                filteredApps = results.values as List<ProxiedApp>\n                notifyDataSetChanged()\n            }\n        }\n        override fun getFilter(): Filter = filterImpl\n\n        override fun getPopupText(view: View, position: Int) = filteredApps[position].name.firstOrNull()?.toString() ?: \"\"\n    }\n\n    private val loading by lazy { findViewById<View>(R.id.loading) }\n    private lateinit var toolbar: Toolbar\n    private lateinit var bypassGroup: RadioGroup\n    private lateinit var list: RecyclerView\n    private lateinit var search: SearchView\n    private val proxiedUids = SparseBooleanArray()\n    private var loader: Job? = null\n    private var apps = emptyList<ProxiedApp>()\n    private val appsAdapter = AppsAdapter()\n\n    private val shortAnimTime by lazy { resources.getInteger(android.R.integer.config_shortAnimTime).toLong() }\n    private fun View.crossFadeFrom(other: View) {\n        clearAnimation()\n        other.clearAnimation()\n        if (visibility == View.VISIBLE && other.visibility == View.GONE) return\n        alpha = 0F\n        visibility = View.VISIBLE\n        animate().alpha(1F).duration = shortAnimTime\n        other.animate().alpha(0F).setListener(object : AnimatorListenerAdapter() {\n            override fun onAnimationEnd(animation: Animator) {\n                other.visibility = View.GONE\n            }\n        }).duration = shortAnimTime\n    }\n\n    private fun initProxiedUids(str: String = DataStore.individual) {\n        proxiedUids.clear()\n        val apps = getCachedApps(packageManager)\n        for (line in str.lineSequence()) proxiedUids[(apps[line] ?: continue).applicationInfo!!.uid] = true\n    }\n\n    private fun isProxiedApp(app: ProxiedApp) = proxiedUids[app.uid]\n\n    @UiThread\n    private fun loadApps() {\n        loader?.cancel()\n        loader = lifecycleScope.launch {\n            loading.crossFadeFrom(list)\n            val adapter = list.adapter as AppsAdapter\n            withContext(Dispatchers.IO) { adapter.reload() }\n            adapter.filter.filter(search.query)\n            list.crossFadeFrom(loading)\n        }\n    }\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        setContentView(R.layout.layout_apps)\n        ListHolderListener.setup(this)\n        toolbar = findViewById(R.id.toolbar)\n        setSupportActionBar(toolbar)\n        supportActionBar!!.setDisplayHomeAsUpEnabled(true)\n\n        if (!DataStore.proxyApps) {\n            DataStore.proxyApps = true\n            DataStore.dirty = true\n        }\n\n        bypassGroup = findViewById(R.id.bypassGroup)\n        bypassGroup.check(if (DataStore.bypass) R.id.btn_bypass else R.id.btn_on)\n        bypassGroup.setOnCheckedChangeListener { _, checkedId ->\n            DataStore.dirty = true\n            when (checkedId) {\n                R.id.btn_off -> {\n                    DataStore.proxyApps = false\n                    finish()\n                }\n                R.id.btn_on -> DataStore.bypass = false\n                R.id.btn_bypass -> DataStore.bypass = true\n            }\n        }\n\n        initProxiedUids()\n        list = findViewById(R.id.list)\n        ViewCompat.setOnApplyWindowInsetsListener(list, ListListener)\n        list.layoutManager = LinearLayoutManager(this, RecyclerView.VERTICAL, false)\n        list.itemAnimator = DefaultItemAnimator()\n        list.adapter = appsAdapter\n        FastScrollerBuilder(list).useMd2Style().build()\n\n        search = findViewById(R.id.search)\n        search.setOnQueryTextListener(object : SearchView.OnQueryTextListener {\n            override fun onQueryTextSubmit(query: String?) = false\n            override fun onQueryTextChange(newText: String?) = true.also { appsAdapter.filter.filter(newText) }\n        })\n\n        instance = this\n        loadApps()\n    }\n\n    override fun onCreateOptionsMenu(menu: Menu): Boolean {\n        menuInflater.inflate(R.menu.app_manager_menu, menu)\n        return true\n    }\n    override fun onOptionsItemSelected(item: MenuItem): Boolean {\n        when (item.itemId) {\n            R.id.action_apply_all -> {\n                val profiles = ProfileManager.getAllProfiles()\n                if (profiles != null) {\n                    val proxiedAppString = DataStore.individual\n                    profiles.forEach {\n                        it.individual = proxiedAppString\n                        it.bypass = DataStore.bypass\n                        ProfileManager.updateProfile(it)\n                    }\n                    if (DataStore.directBootAware) DirectBoot.update()\n                    Snackbar.make(list, R.string.action_apply_all, Snackbar.LENGTH_LONG).show()\n                } else Snackbar.make(list, R.string.action_export_err, Snackbar.LENGTH_LONG).show()\n                return true\n            }\n            R.id.action_export_clipboard -> {\n                val success = Core.trySetPrimaryClip(\"${DataStore.bypass}\\n${DataStore.individual}\")\n                Snackbar.make(list,\n                        if (success) R.string.action_export_msg else R.string.action_export_err,\n                        Snackbar.LENGTH_LONG).show()\n                return true\n            }\n            R.id.action_import_clipboard -> {\n                val proxiedAppString = Core.clipboard.primaryClip?.getItemAt(0)?.text?.toString()\n                if (!proxiedAppString.isNullOrEmpty()) {\n                    val i = proxiedAppString.indexOf('\\n')\n                    try {\n                        val (enabled, apps) = if (i < 0) {\n                            proxiedAppString to \"\"\n                        } else proxiedAppString.substring(0, i) to proxiedAppString.substring(i + 1)\n                        bypassGroup.check(if (enabled.toBoolean()) R.id.btn_bypass else R.id.btn_on)\n                        DataStore.individual = apps\n                        DataStore.dirty = true\n                        Snackbar.make(list, R.string.action_import_msg, Snackbar.LENGTH_LONG).show()\n                        initProxiedUids(apps)\n                        appsAdapter.notifyItemRangeChanged(0, appsAdapter.itemCount, SWITCH)\n                        return true\n                    } catch (_: IllegalArgumentException) { }\n                }\n                Snackbar.make(list, R.string.action_import_err, Snackbar.LENGTH_LONG).show()\n            }\n        }\n        return super.onOptionsItemSelected(item)\n    }\n\n    override fun supportNavigateUpTo(upIntent: Intent) =\n            super.supportNavigateUpTo(upIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP))\n\n    override fun onKeyUp(keyCode: Int, event: KeyEvent?) = if (keyCode == KeyEvent.KEYCODE_MENU) {\n        if (toolbar.isOverflowMenuShowing) toolbar.hideOverflowMenu() else toolbar.showOverflowMenu()\n    } else super.onKeyUp(keyCode, event)\n\n    override fun onDestroy() {\n        instance = null\n        loader?.cancel()\n        super.onDestroy()\n    }\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/github/shadowsocks/GlobalSettingsFragment.kt",
    "content": "/*******************************************************************************\n *                                                                             *\n *  Copyright (C) 2017 by Max Lv <max.c.lv@gmail.com>                          *\n *  Copyright (C) 2017 by Mygod Studio <contact-shadowsocks-android@mygod.be>  *\n *                                                                             *\n *  This program is free software: you can redistribute it and/or modify       *\n *  it under the terms of the GNU General Public License as published by       *\n *  the Free Software Foundation, either version 3 of the License, or          *\n *  (at your option) any later version.                                        *\n *                                                                             *\n *  This program is distributed in the hope that it will be useful,            *\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of             *\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the              *\n *  GNU General Public License for more details.                               *\n *                                                                             *\n *  You should have received a copy of the GNU General Public License          *\n *  along with this program. If not, see <http://www.gnu.org/licenses/>.       *\n *                                                                             *\n *******************************************************************************/\n\npackage com.github.shadowsocks\n\nimport android.os.Bundle\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport androidx.core.view.ViewCompat\nimport com.github.shadowsocks.widget.ListHolderListener\n\nclass GlobalSettingsFragment : ToolbarFragment() {\n    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? =\n            inflater.inflate(R.layout.layout_global_settings, container, false)\n\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        super.onViewCreated(view, savedInstanceState)\n        ViewCompat.setOnApplyWindowInsetsListener(view, ListHolderListener)\n        toolbar.setTitle(R.string.settings)\n    }\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/github/shadowsocks/GlobalSettingsPreferenceFragment.kt",
    "content": "/*******************************************************************************\n *                                                                             *\n *  Copyright (C) 2017 by Max Lv <max.c.lv@gmail.com>                          *\n *  Copyright (C) 2017 by Mygod Studio <contact-shadowsocks-android@mygod.be>  *\n *                                                                             *\n *  This program is free software: you can redistribute it and/or modify       *\n *  it under the terms of the GNU General Public License as published by       *\n *  the Free Software Foundation, either version 3 of the License, or          *\n *  (at your option) any later version.                                        *\n *                                                                             *\n *  This program is distributed in the hope that it will be useful,            *\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of             *\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the              *\n *  GNU General Public License for more details.                               *\n *                                                                             *\n *  You should have received a copy of the GNU General Public License          *\n *  along with this program. If not, see <http://www.gnu.org/licenses/>.       *\n *                                                                             *\n *******************************************************************************/\n\npackage com.github.shadowsocks\n\nimport android.os.Build\nimport android.os.Bundle\nimport android.view.View\nimport androidx.core.view.ViewCompat\nimport androidx.preference.EditTextPreference\nimport androidx.preference.Preference\nimport androidx.preference.PreferenceFragmentCompat\nimport androidx.preference.SwitchPreference\nimport com.github.shadowsocks.bg.BaseService\nimport com.github.shadowsocks.preference.DataStore\nimport com.github.shadowsocks.preference.EditTextPreferenceModifiers\nimport com.github.shadowsocks.utils.DirectBoot\nimport com.github.shadowsocks.utils.Key\nimport com.github.shadowsocks.utils.remove\nimport com.github.shadowsocks.widget.MainListListener\n\nclass GlobalSettingsPreferenceFragment : PreferenceFragmentCompat() {\n    override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {\n        preferenceManager.preferenceDataStore = DataStore.publicStore\n        DataStore.initGlobal()\n        addPreferencesFromResource(R.xml.pref_global)\n        findPreference<SwitchPreference>(Key.persistAcrossReboot)!!.setOnPreferenceChangeListener { _, value ->\n            BootReceiver.enabled = value as Boolean\n            true\n        }\n\n        val canToggleLocked = findPreference<Preference>(Key.directBootAware)!!\n        if (Build.VERSION.SDK_INT >= 24) canToggleLocked.setOnPreferenceChangeListener { _, newValue ->\n            if (Core.directBootSupported && newValue as Boolean) DirectBoot.update() else DirectBoot.clean()\n            true\n        } else canToggleLocked.remove()\n\n        val serviceMode = findPreference<Preference>(Key.serviceMode)!!\n        val portProxy = findPreference<EditTextPreference>(Key.portProxy)!!\n        portProxy.setOnBindEditTextListener(EditTextPreferenceModifiers.Port)\n        val portLocalDns = findPreference<EditTextPreference>(Key.portLocalDns)!!\n        portLocalDns.setOnBindEditTextListener(EditTextPreferenceModifiers.Port)\n        val portTransproxy = findPreference<EditTextPreference>(Key.portTransproxy)!!\n        portTransproxy.setOnBindEditTextListener(EditTextPreferenceModifiers.Port)\n        val onServiceModeChange = Preference.OnPreferenceChangeListener { _, newValue ->\n            portTransproxy.isEnabled = newValue as String? == Key.modeTransproxy\n            true\n        }\n        val listener: (BaseService.State) -> Unit = {\n            val stopped = it == BaseService.State.Stopped\n            serviceMode.isEnabled = stopped\n            portProxy.isEnabled = stopped\n            portLocalDns.isEnabled = stopped\n            if (stopped) onServiceModeChange.onPreferenceChange(serviceMode, DataStore.serviceMode) else {\n                portTransproxy.isEnabled = false\n            }\n        }\n        listener((activity as MainActivity).state)\n        MainActivity.stateListener = listener\n        serviceMode.onPreferenceChangeListener = onServiceModeChange\n    }\n\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        super.onViewCreated(view, savedInstanceState)\n        ViewCompat.setOnApplyWindowInsetsListener(listView, MainListListener)\n    }\n\n    override fun onDestroy() {\n        MainActivity.stateListener = null\n        super.onDestroy()\n    }\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/github/shadowsocks/MainActivity.kt",
    "content": "/*******************************************************************************\n *                                                                             *\n *  Copyright (C) 2017 by Max Lv <max.c.lv@gmail.com>                          *\n *  Copyright (C) 2017 by Mygod Studio <contact-shadowsocks-android@mygod.be>  *\n *                                                                             *\n *  This program is free software: you can redistribute it and/or modify       *\n *  it under the terms of the GNU General Public License as published by       *\n *  the Free Software Foundation, either version 3 of the License, or          *\n *  (at your option) any later version.                                        *\n *                                                                             *\n *  This program is distributed in the hope that it will be useful,            *\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of             *\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the              *\n *  GNU General Public License for more details.                               *\n *                                                                             *\n *  You should have received a copy of the GNU General Public License          *\n *  along with this program. If not, see <http://www.gnu.org/licenses/>.       *\n *                                                                             *\n *******************************************************************************/\n\npackage com.github.shadowsocks\n\nimport android.content.ActivityNotFoundException\nimport android.os.Bundle\nimport android.os.RemoteException\nimport android.view.KeyCharacterMap\nimport android.view.KeyEvent\nimport android.view.MenuItem\nimport android.view.View\nimport android.view.ViewGroup\nimport androidx.activity.OnBackPressedCallback\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.browser.customtabs.CustomTabColorSchemeParams\nimport androidx.browser.customtabs.CustomTabsIntent\nimport androidx.coordinatorlayout.widget.CoordinatorLayout\nimport androidx.core.content.ContextCompat\nimport androidx.core.net.toUri\nimport androidx.core.view.*\nimport androidx.drawerlayout.widget.DrawerLayout\nimport androidx.preference.PreferenceDataStore\nimport com.github.shadowsocks.acl.CustomRulesFragment\nimport com.github.shadowsocks.aidl.IShadowsocksService\nimport com.github.shadowsocks.aidl.ShadowsocksConnection\nimport com.github.shadowsocks.aidl.TrafficStats\nimport com.github.shadowsocks.bg.BaseService\nimport com.github.shadowsocks.preference.DataStore\nimport com.github.shadowsocks.preference.OnPreferenceDataStoreChangeListener\nimport com.github.shadowsocks.subscription.SubscriptionFragment\nimport com.github.shadowsocks.utils.Key\nimport com.github.shadowsocks.utils.StartService\nimport com.github.shadowsocks.widget.ListHolderListener\nimport com.github.shadowsocks.widget.ServiceButton\nimport com.github.shadowsocks.widget.StatsBar\nimport com.google.android.material.navigation.NavigationView\nimport com.google.android.material.snackbar.Snackbar\nimport com.google.firebase.analytics.FirebaseAnalytics\n\nclass MainActivity : AppCompatActivity(), ShadowsocksConnection.Callback, OnPreferenceDataStoreChangeListener,\n        NavigationView.OnNavigationItemSelectedListener {\n    companion object {\n        var stateListener: ((BaseService.State) -> Unit)? = null\n    }\n\n    // UI\n    private lateinit var fab: ServiceButton\n    private lateinit var stats: StatsBar\n    internal lateinit var drawer: DrawerLayout\n    private lateinit var navigation: NavigationView\n\n    lateinit var snackbar: CoordinatorLayout private set\n    fun snackbar(text: CharSequence = \"\") = Snackbar.make(snackbar, text, Snackbar.LENGTH_LONG).apply {\n        anchorView = fab\n    }\n\n    private val customTabsIntent by lazy {\n        CustomTabsIntent.Builder().apply {\n            setColorScheme(CustomTabsIntent.COLOR_SCHEME_SYSTEM)\n            setColorSchemeParams(CustomTabsIntent.COLOR_SCHEME_LIGHT, CustomTabColorSchemeParams.Builder().apply {\n                setToolbarColor(ContextCompat.getColor(this@MainActivity, R.color.light_color_primary))\n            }.build())\n            setColorSchemeParams(CustomTabsIntent.COLOR_SCHEME_DARK, CustomTabColorSchemeParams.Builder().apply {\n                setToolbarColor(ContextCompat.getColor(this@MainActivity, R.color.dark_color_primary))\n            }.build())\n        }.build()\n    }\n    fun launchUrl(uri: String) = try {\n        customTabsIntent.launchUrl(this, uri.toUri())\n    } catch (_: ActivityNotFoundException) {\n        snackbar(uri).show()\n    }\n\n    // service\n    var state = BaseService.State.Idle\n    override fun stateChanged(state: BaseService.State, profileName: String?, msg: String?) =\n            changeState(state, msg)\n    override fun trafficUpdated(profileId: Long, stats: TrafficStats) {\n        if (profileId == 0L) this@MainActivity.stats.updateTraffic(\n                stats.txRate, stats.rxRate, stats.txTotal, stats.rxTotal)\n        if (state != BaseService.State.Stopping) {\n            (supportFragmentManager.findFragmentById(R.id.fragment_holder) as? ProfilesFragment)\n                    ?.onTrafficUpdated(profileId, stats)\n        }\n    }\n    override fun trafficPersisted(profileId: Long) {\n        ProfilesFragment.instance?.onTrafficPersisted(profileId)\n    }\n\n    private fun changeState(state: BaseService.State, msg: String? = null, animate: Boolean = true) {\n        fab.changeState(state, this.state, animate)\n        stats.changeState(state, animate)\n        if (msg != null) snackbar(getString(R.string.vpn_error, msg)).show()\n        this.state = state\n        ProfilesFragment.instance?.profilesAdapter?.notifyDataSetChanged()  // refresh button enabled state\n        stateListener?.invoke(state)\n    }\n\n    private fun toggle() = if (state.canStop) Core.stopService() else connect.launch(null)\n\n    private val connection = ShadowsocksConnection(true)\n    override fun onServiceConnected(service: IShadowsocksService) = changeState(try {\n        BaseService.State.entries[service.state]\n    } catch (_: RemoteException) {\n        BaseService.State.Idle\n    })\n    override fun onServiceDisconnected() = changeState(BaseService.State.Idle)\n    override fun onBinderDied() {\n        connection.disconnect(this)\n        connection.connect(this, this)\n    }\n\n    private val connect = registerForActivityResult(StartService()) {\n        if (it) snackbar().setText(R.string.vpn_permission_denied).show()\n    }\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        WindowCompat.setDecorFitsSystemWindows(window, false)\n        setContentView(R.layout.layout_main)\n        snackbar = findViewById(R.id.snackbar)\n        ViewCompat.setOnApplyWindowInsetsListener(snackbar, ListHolderListener)\n        stats = findViewById(R.id.stats)\n        stats.setOnClickListener { if (state == BaseService.State.Connected) stats.testConnection() }\n        drawer = findViewById(R.id.drawer)\n        val drawerHandler = object : OnBackPressedCallback(drawer.isOpen), DrawerLayout.DrawerListener {\n            override fun handleOnBackPressed() = drawer.closeDrawers()\n            override fun onDrawerSlide(drawerView: View, slideOffset: Float) { }\n            override fun onDrawerOpened(drawerView: View) {\n                isEnabled = true\n            }\n            override fun onDrawerClosed(drawerView: View) {\n                isEnabled = false\n            }\n            override fun onDrawerStateChanged(newState: Int) {\n                isEnabled = newState == DrawerLayout.STATE_IDLE == drawer.isOpen\n            }\n        }\n        onBackPressedDispatcher.addCallback(drawerHandler)\n        drawer.addDrawerListener(drawerHandler)\n        navigation = findViewById(R.id.navigation)\n        navigation.setNavigationItemSelectedListener(this)\n        if (savedInstanceState == null) {\n            navigation.menu.findItem(R.id.profiles).isChecked = true\n            displayFragment(ProfilesFragment())\n        }\n\n        fab = findViewById(R.id.fab)\n        fab.initProgress(findViewById(R.id.fabProgress))\n        fab.setOnClickListener { toggle() }\n        ViewCompat.setOnApplyWindowInsetsListener(fab) { view, insets ->\n            view.updateLayoutParams<ViewGroup.MarginLayoutParams> {\n                bottomMargin = insets.getInsets(WindowInsetsCompat.Type.navigationBars()).bottom +\n                        resources.getDimensionPixelOffset(R.dimen.mtrl_bottomappbar_fab_bottom_margin)\n            }\n            insets\n        }\n\n        changeState(BaseService.State.Idle, animate = false)    // reset everything to init state\n        connection.connect(this, this)\n        DataStore.publicStore.registerChangeListener(this)\n    }\n\n    override fun onPreferenceDataStoreChanged(store: PreferenceDataStore, key: String) {\n        when (key) {\n            Key.serviceMode -> {\n                connection.disconnect(this)\n                connection.connect(this, this)\n            }\n        }\n    }\n\n    private fun displayFragment(fragment: ToolbarFragment) {\n        supportFragmentManager.beginTransaction().replace(R.id.fragment_holder, fragment).commitAllowingStateLoss()\n        drawer.closeDrawers()\n    }\n\n    override fun onNavigationItemSelected(item: MenuItem): Boolean {\n        if (item.isChecked) drawer.closeDrawers() else {\n            when (item.itemId) {\n                R.id.profiles -> {\n                    displayFragment(ProfilesFragment())\n                    connection.bandwidthTimeout = connection.bandwidthTimeout   // request stats update\n                }\n                R.id.globalSettings -> displayFragment(GlobalSettingsFragment())\n                R.id.about -> {\n                    FirebaseAnalytics.getInstance(this).logEvent(\"about\", null)\n                    displayFragment(AboutFragment())\n                }\n                R.id.faq -> {\n                    launchUrl(getString(R.string.faq_url))\n                    return true\n                }\n                R.id.customRules -> displayFragment(CustomRulesFragment())\n                R.id.subscriptions -> displayFragment(SubscriptionFragment())\n                else -> return false\n            }\n            item.isChecked = true\n        }\n        return true\n    }\n\n    override fun onStart() {\n        super.onStart()\n        connection.bandwidthTimeout = 500\n    }\n\n    override fun onKeyShortcut(keyCode: Int, event: KeyEvent) = when {\n        keyCode == KeyEvent.KEYCODE_G && event.hasModifiers(KeyEvent.META_CTRL_ON) -> {\n            toggle()\n            true\n        }\n        keyCode == KeyEvent.KEYCODE_T && event.hasModifiers(KeyEvent.META_CTRL_ON) -> {\n            stats.testConnection()\n            true\n        }\n        else -> (supportFragmentManager.findFragmentById(R.id.fragment_holder) as ToolbarFragment).toolbar.menu.let {\n            it.setQwertyMode(KeyCharacterMap.load(event.deviceId).keyboardType != KeyCharacterMap.NUMERIC)\n            it.performShortcut(keyCode, event, 0)\n        }\n    }\n\n    override fun onStop() {\n        connection.bandwidthTimeout = 0\n        super.onStop()\n    }\n\n    override fun onDestroy() {\n        super.onDestroy()\n        DataStore.publicStore.unregisterChangeListener(this)\n        connection.disconnect(this)\n    }\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/github/shadowsocks/ProfileConfigActivity.kt",
    "content": "/*******************************************************************************\n *                                                                             *\n *  Copyright (C) 2017 by Max Lv <max.c.lv@gmail.com>                          *\n *  Copyright (C) 2017 by Mygod Studio <contact-shadowsocks-android@mygod.be>  *\n *                                                                             *\n *  This program is free software: you can redistribute it and/or modify       *\n *  it under the terms of the GNU General Public License as published by       *\n *  the Free Software Foundation, either version 3 of the License, or          *\n *  (at your option) any later version.                                        *\n *                                                                             *\n *  This program is distributed in the hope that it will be useful,            *\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of             *\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the              *\n *  GNU General Public License for more details.                               *\n *                                                                             *\n *  You should have received a copy of the GNU General Public License          *\n *  along with this program. If not, see <http://www.gnu.org/licenses/>.       *\n *                                                                             *\n *******************************************************************************/\n\npackage com.github.shadowsocks\n\nimport android.app.Activity\nimport android.content.DialogInterface\nimport android.os.Bundle\nimport androidx.activity.OnBackPressedCallback\nimport androidx.activity.result.component1\nimport androidx.activity.result.component2\nimport androidx.activity.result.contract.ActivityResultContracts\nimport androidx.appcompat.app.AlertDialog\nimport androidx.appcompat.app.AppCompatActivity\nimport com.github.shadowsocks.plugin.PluginContract\nimport com.github.shadowsocks.plugin.fragment.AlertDialogFragment\nimport com.github.shadowsocks.plugin.fragment.Empty\nimport com.github.shadowsocks.preference.DataStore\nimport com.github.shadowsocks.widget.ListHolderListener\n\nclass ProfileConfigActivity : AppCompatActivity() {\n    class UnsavedChangesDialogFragment : AlertDialogFragment<Empty, Empty>() {\n        override fun AlertDialog.Builder.prepare(listener: DialogInterface.OnClickListener) {\n            setTitle(R.string.unsaved_changes_prompt)\n            setPositiveButton(R.string.yes, listener)\n            setNegativeButton(R.string.no, listener)\n            setNeutralButton(android.R.string.cancel, null)\n        }\n    }\n\n    val unsavedChangesHandler = object : OnBackPressedCallback(DataStore.dirty) {\n        override fun handleOnBackPressed() = UnsavedChangesDialogFragment().apply {\n            key()\n        }.show(supportFragmentManager, null)\n    }\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        setContentView(R.layout.layout_profile_config)\n        ListHolderListener.setup(this)\n        setSupportActionBar(findViewById(R.id.toolbar))\n        supportActionBar!!.apply {\n            setDisplayHomeAsUpEnabled(true)\n            setHomeAsUpIndicator(R.drawable.ic_navigation_close)\n        }\n        onBackPressedDispatcher.addCallback(unsavedChangesHandler)\n    }\n\n    override fun onResume() {\n        super.onResume()\n        unsavedChangesHandler.isEnabled = DataStore.dirty\n    }\n\n    override fun onSupportNavigateUp(): Boolean {\n        if (!super.onSupportNavigateUp()) finish()\n        return true\n    }\n\n    val pluginHelp = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {\n        (resultCode, data) ->\n        if (resultCode == Activity.RESULT_OK) AlertDialog.Builder(this)\n                .setTitle(\"?\")\n                .setMessage(data?.getCharSequenceExtra(PluginContract.EXTRA_HELP_MESSAGE))\n                .show()\n    }\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/github/shadowsocks/ProfileConfigFragment.kt",
    "content": "/*******************************************************************************\n *                                                                             *\n *  Copyright (C) 2017 by Max Lv <max.c.lv@gmail.com>                          *\n *  Copyright (C) 2017 by Mygod Studio <contact-shadowsocks-android@mygod.be>  *\n *                                                                             *\n *  This program is free software: you can redistribute it and/or modify       *\n *  it under the terms of the GNU General Public License as published by       *\n *  the Free Software Foundation, either version 3 of the License, or          *\n *  (at your option) any later version.                                        *\n *                                                                             *\n *  This program is distributed in the hope that it will be useful,            *\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of             *\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the              *\n *  GNU General Public License for more details.                               *\n *                                                                             *\n *  You should have received a copy of the GNU General Public License          *\n *  along with this program. If not, see <http://www.gnu.org/licenses/>.       *\n *                                                                             *\n *******************************************************************************/\n\npackage com.github.shadowsocks\n\nimport android.app.Activity\nimport android.content.BroadcastReceiver\nimport android.content.Context\nimport android.content.DialogInterface\nimport android.content.Intent\nimport android.os.Build\nimport android.os.Bundle\nimport android.os.Parcelable\nimport android.view.Menu\nimport android.view.MenuInflater\nimport android.view.MenuItem\nimport android.view.View\nimport androidx.activity.result.component1\nimport androidx.activity.result.component2\nimport androidx.activity.result.contract.ActivityResultContracts\nimport androidx.appcompat.app.AlertDialog\nimport androidx.core.view.MenuProvider\nimport androidx.core.view.ViewCompat\nimport androidx.fragment.app.setFragmentResultListener\nimport androidx.lifecycle.lifecycleScope\nimport androidx.preference.EditTextPreference\nimport androidx.preference.Preference\nimport androidx.preference.PreferenceDataStore\nimport androidx.preference.PreferenceFragmentCompat\nimport androidx.preference.SwitchPreference\nimport com.github.shadowsocks.database.Profile\nimport com.github.shadowsocks.database.ProfileManager\nimport com.github.shadowsocks.plugin.NoPlugin\nimport com.github.shadowsocks.plugin.PluginConfiguration\nimport com.github.shadowsocks.plugin.PluginContract\nimport com.github.shadowsocks.plugin.PluginManager\nimport com.github.shadowsocks.plugin.PluginOptions\nimport com.github.shadowsocks.plugin.fragment.AlertDialogFragment\nimport com.github.shadowsocks.plugin.fragment.Empty\nimport com.github.shadowsocks.plugin.fragment.showAllowingStateLoss\nimport com.github.shadowsocks.preference.DataStore\nimport com.github.shadowsocks.preference.EditTextPreferenceModifiers\nimport com.github.shadowsocks.preference.OnPreferenceDataStoreChangeListener\nimport com.github.shadowsocks.preference.PluginConfigurationDialogFragment\nimport com.github.shadowsocks.preference.PluginPreference\nimport com.github.shadowsocks.preference.PluginPreferenceDialogFragment\nimport com.github.shadowsocks.utils.Action\nimport com.github.shadowsocks.utils.DirectBoot\nimport com.github.shadowsocks.utils.Key\nimport com.github.shadowsocks.utils.listenForPackageChanges\nimport com.github.shadowsocks.utils.readableMessage\nimport com.github.shadowsocks.utils.remove\nimport com.github.shadowsocks.widget.ListListener\nimport com.google.android.material.snackbar.Snackbar\nimport kotlinx.coroutines.launch\nimport kotlinx.parcelize.Parcelize\n\nclass ProfileConfigFragment : PreferenceFragmentCompat(),\n        Preference.OnPreferenceChangeListener, OnPreferenceDataStoreChangeListener {\n    companion object PasswordSummaryProvider : Preference.SummaryProvider<EditTextPreference> {\n        override fun provideSummary(preference: EditTextPreference) = \"\\u2022\".repeat(preference.text?.length ?: 0)\n    }\n\n    @Parcelize\n    data class ProfileIdArg(val profileId: Long) : Parcelable\n    class DeleteConfirmationDialogFragment : AlertDialogFragment<ProfileIdArg, Empty>() {\n        override fun AlertDialog.Builder.prepare(listener: DialogInterface.OnClickListener) {\n            setTitle(R.string.delete_confirm_prompt)\n            setPositiveButton(R.string.yes) { _, _ ->\n                ProfileManager.delProfile(arg.profileId)\n                requireActivity().finish()\n            }\n            setNegativeButton(R.string.no, null)\n        }\n    }\n\n    private var profileId = -1L\n    private lateinit var isProxyApps: SwitchPreference\n    private lateinit var plugin: PluginPreference\n    private lateinit var pluginConfigure: EditTextPreference\n    private lateinit var pluginConfiguration: PluginConfiguration\n    private lateinit var receiver: BroadcastReceiver\n    private lateinit var udpFallback: Preference\n\n    private fun makeDirt() {\n        DataStore.dirty = true\n        (activity as ProfileConfigActivity).unsavedChangesHandler.isEnabled = true\n    }\n\n    override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {\n        preferenceManager.preferenceDataStore = DataStore.privateStore\n        val activity = requireActivity()\n        profileId = activity.intent.getLongExtra(Action.EXTRA_PROFILE_ID, -1L)\n        if (profileId != -1L && profileId != DataStore.editingId) {\n            activity.finish()\n            return\n        }\n        activity.addMenuProvider(object : MenuProvider {\n            override fun onCreateMenu(menu: Menu, menuInflater: MenuInflater) =\n                menuInflater.inflate(R.menu.profile_config_menu, menu)\n            override fun onMenuItemSelected(item: MenuItem) = when (item.itemId) {\n                R.id.action_delete -> {\n                    DeleteConfirmationDialogFragment().apply {\n                        arg(ProfileIdArg(profileId))\n                        key()\n                    }.show(parentFragmentManager, null)\n                    true\n                }\n                R.id.action_apply -> {\n                    saveAndExit()\n                    true\n                }\n                else -> false\n            }\n        }, this)\n        addPreferencesFromResource(R.xml.pref_profile)\n        findPreference<EditTextPreference>(Key.remotePort)!!.setOnBindEditTextListener(EditTextPreferenceModifiers.Port)\n        findPreference<EditTextPreference>(Key.password)!!.summaryProvider = PasswordSummaryProvider\n        val serviceMode = DataStore.serviceMode\n        findPreference<Preference>(Key.ipv6)!!.isEnabled = serviceMode == Key.modeVpn\n        isProxyApps = findPreference(Key.proxyApps)!!\n        isProxyApps.isEnabled = serviceMode == Key.modeVpn\n        isProxyApps.setOnPreferenceChangeListener { _, newValue ->\n            startActivity(Intent(activity, AppManager::class.java))\n            if (newValue as Boolean) makeDirt()\n            newValue\n        }\n        findPreference<Preference>(Key.metered)!!.apply {\n            if (Build.VERSION.SDK_INT >= 28) isEnabled = serviceMode == Key.modeVpn else remove()\n        }\n        plugin = findPreference(Key.plugin)!!\n        pluginConfigure = findPreference(Key.pluginConfigure)!!\n        pluginConfigure.setOnBindEditTextListener(EditTextPreferenceModifiers.Monospace)\n        pluginConfigure.onPreferenceChangeListener = this\n        pluginConfiguration = PluginConfiguration(DataStore.plugin)\n        initPlugins()\n        udpFallback = findPreference(Key.udpFallback)!!\n        DataStore.privateStore.registerChangeListener(this)\n\n        val profile = ProfileManager.getProfile(profileId) ?: Profile()\n        if (profile.subscription == Profile.SubscriptionStatus.Active) {\n            findPreference<Preference>(Key.name)!!.isEnabled = false\n            findPreference<Preference>(Key.host)!!.isEnabled = false\n            findPreference<Preference>(Key.password)!!.isEnabled = false\n            findPreference<Preference>(Key.method)!!.isEnabled = false\n            findPreference<Preference>(Key.remotePort)!!.isEnabled = false\n            plugin.isEnabled = false\n            pluginConfigure.isEnabled = false\n            udpFallback.isEnabled = false\n        }\n    }\n\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        super.onViewCreated(view, savedInstanceState)\n        ViewCompat.setOnApplyWindowInsetsListener(listView, ListListener)\n        setFragmentResultListener(PluginPreferenceDialogFragment::class.java.name) { _, bundle ->\n            val selected = plugin.plugins.lookup.getValue(\n                bundle.getString(PluginPreferenceDialogFragment.KEY_SELECTED_ID)!!)\n            val override = pluginConfiguration.pluginsOptions.keys.firstOrNull {\n                plugin.plugins.lookup[it] == selected\n            }\n            pluginConfiguration = PluginConfiguration(pluginConfiguration.pluginsOptions, override ?: selected.id)\n            DataStore.plugin = pluginConfiguration.toString()\n            makeDirt()\n            plugin.value = pluginConfiguration.selected\n            pluginConfigure.isEnabled = selected !is NoPlugin\n            pluginConfigure.text = pluginConfiguration.getOptions().toString()\n            if (!selected.trusted) {\n                Snackbar.make(requireView(), R.string.plugin_untrusted, Snackbar.LENGTH_LONG).show()\n            }\n        }\n        AlertDialogFragment.setResultListener<ProfileConfigActivity.UnsavedChangesDialogFragment, Empty>(this) {\n                which, _ ->\n            when (which) {\n                DialogInterface.BUTTON_POSITIVE -> saveAndExit()\n                DialogInterface.BUTTON_NEGATIVE -> requireActivity().finish()\n            }\n        }\n    }\n\n    private fun initPlugins() {\n        plugin.value = pluginConfiguration.selected\n        plugin.init()\n        pluginConfigure.isEnabled = plugin.selectedEntry?.let { it is NoPlugin } == false\n        pluginConfigure.text = pluginConfiguration.getOptions().toString()\n    }\n\n    private fun showPluginEditor() {\n        PluginConfigurationDialogFragment().apply {\n            setArg(Key.pluginConfigure, pluginConfiguration.selected)\n            setTargetFragment(this@ProfileConfigFragment, 0)\n        }.showAllowingStateLoss(parentFragmentManager, Key.pluginConfigure)\n    }\n\n    private fun saveAndExit() {\n        val profile = ProfileManager.getProfile(profileId) ?: Profile()\n        profile.id = profileId\n        profile.deserialize()\n        ProfileManager.updateProfile(profile)\n        ProfilesFragment.instance?.profilesAdapter?.deepRefreshId(profileId)\n        if (profileId in Core.activeProfileIds && DataStore.directBootAware) DirectBoot.update()\n        requireActivity().finish()\n    }\n\n    override fun onAttach(context: Context) {\n        super.onAttach(context)\n        receiver = context.listenForPackageChanges(false) {\n            // wait until changes were flushed\n            lifecycleScope.launch { initPlugins() }\n        }\n    }\n\n    override fun onResume() {\n        super.onResume()\n        isProxyApps.isChecked = DataStore.proxyApps // fetch proxyApps updated by AppManager\n        val fallbackProfile = DataStore.udpFallback?.let { ProfileManager.getProfile(it) }\n        if (fallbackProfile == null) udpFallback.setSummary(R.string.plugin_disabled)\n        else udpFallback.summary = fallbackProfile.formattedName\n    }\n\n    override fun onPreferenceChange(preference: Preference, newValue: Any?): Boolean = try {\n        val selected = pluginConfiguration.selected\n        pluginConfiguration = PluginConfiguration(pluginConfiguration.pluginsOptions +\n                (pluginConfiguration.selected to PluginOptions(selected, newValue as? String?)), selected)\n        DataStore.plugin = pluginConfiguration.toString()\n        makeDirt()\n        true\n    } catch (exc: RuntimeException) {\n        Snackbar.make(requireView(), exc.readableMessage, Snackbar.LENGTH_LONG).show()\n        false\n    }\n\n    override fun onPreferenceDataStoreChanged(store: PreferenceDataStore, key: String) {\n        if (key != Key.proxyApps && findPreference<Preference>(key) != null) makeDirt()\n    }\n\n    override fun onDisplayPreferenceDialog(preference: Preference) {\n        when (preference.key) {\n            Key.plugin -> PluginPreferenceDialogFragment().apply {\n                setArg(Key.plugin)\n                setTargetFragment(this@ProfileConfigFragment, 0)\n            }.showAllowingStateLoss(parentFragmentManager, Key.plugin)\n            Key.pluginConfigure -> {\n                val intent = PluginManager.buildIntent(plugin.selectedEntry!!.id, PluginContract.ACTION_CONFIGURE)\n                if (intent.resolveActivity(requireContext().packageManager) == null) showPluginEditor() else {\n                    configurePlugin.launch(intent\n                            .putExtra(PluginContract.EXTRA_OPTIONS, pluginConfiguration.getOptions().toString()))\n                }\n            }\n            else -> super.onDisplayPreferenceDialog(preference)\n        }\n    }\n\n    private val configurePlugin = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {\n        (resultCode, data) ->\n        when (resultCode) {\n            Activity.RESULT_OK -> {\n                val options = data?.getStringExtra(PluginContract.EXTRA_OPTIONS)\n                pluginConfigure.text = options\n                onPreferenceChange(pluginConfigure, options)\n            }\n            PluginContract.RESULT_FALLBACK -> showPluginEditor()\n        }\n    }\n\n    override fun onDetach() {\n        requireContext().unregisterReceiver(receiver)\n        super.onDetach()\n    }\n\n    override fun onDestroy() {\n        DataStore.privateStore.unregisterChangeListener(this)\n        super.onDestroy()\n    }\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/github/shadowsocks/ProfilesFragment.kt",
    "content": "/*******************************************************************************\n *                                                                             *\n *  Copyright (C) 2017 by Max Lv <max.c.lv@gmail.com>                          *\n *  Copyright (C) 2017 by Mygod Studio <contact-shadowsocks-android@mygod.be>  *\n *                                                                             *\n *  This program is free software: you can redistribute it and/or modify       *\n *  it under the terms of the GNU General Public License as published by       *\n *  the Free Software Foundation, either version 3 of the License, or          *\n *  (at your option) any later version.                                        *\n *                                                                             *\n *  This program is distributed in the hope that it will be useful,            *\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of             *\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the              *\n *  GNU General Public License for more details.                               *\n *                                                                             *\n *  You should have received a copy of the GNU General Public License          *\n *  along with this program. If not, see <http://www.gnu.org/licenses/>.       *\n *                                                                             *\n *******************************************************************************/\n\npackage com.github.shadowsocks\n\nimport android.content.ActivityNotFoundException\nimport android.content.Intent\nimport android.graphics.Bitmap\nimport android.graphics.Color\nimport android.net.Uri\nimport android.os.Bundle\nimport android.text.format.Formatter\nimport android.util.LongSparseArray\nimport android.view.LayoutInflater\nimport android.view.MenuItem\nimport android.view.View\nimport android.view.ViewGroup\nimport android.widget.ImageView\nimport android.widget.TextView\nimport androidx.activity.result.ActivityResultLauncher\nimport androidx.appcompat.widget.PopupMenu\nimport androidx.appcompat.widget.SearchView\nimport androidx.appcompat.widget.Toolbar\nimport androidx.appcompat.widget.TooltipCompat\nimport androidx.core.os.bundleOf\nimport androidx.core.view.ViewCompat\nimport androidx.fragment.app.DialogFragment\nimport androidx.recyclerview.widget.*\nimport com.github.shadowsocks.aidl.TrafficStats\nimport com.github.shadowsocks.bg.BaseService\nimport com.github.shadowsocks.database.Profile\nimport com.github.shadowsocks.database.ProfileManager\nimport com.github.shadowsocks.plugin.PluginConfiguration\nimport com.github.shadowsocks.plugin.fragment.showAllowingStateLoss\nimport com.github.shadowsocks.preference.DataStore\nimport com.github.shadowsocks.utils.Action\nimport com.github.shadowsocks.utils.OpenJson\nimport com.github.shadowsocks.utils.SaveJson\nimport com.github.shadowsocks.utils.readableMessage\nimport com.github.shadowsocks.widget.ListHolderListener\nimport com.github.shadowsocks.widget.MainListListener\nimport com.github.shadowsocks.widget.UndoSnackbarManager\nimport com.google.zxing.BarcodeFormat\nimport com.google.zxing.EncodeHintType\nimport com.google.zxing.MultiFormatWriter\nimport com.google.zxing.WriterException\nimport timber.log.Timber\nimport java.nio.charset.StandardCharsets\n\nclass ProfilesFragment : ToolbarFragment(), Toolbar.OnMenuItemClickListener, SearchView.OnQueryTextListener {\n    companion object {\n        /**\n         * used for callback from stateChanged from MainActivity\n         */\n        var instance: ProfilesFragment? = null\n\n        private const val KEY_URL = \"com.github.shadowsocks.QRCodeDialog.KEY_URL\"\n\n        private val iso88591 = StandardCharsets.ISO_8859_1.newEncoder()\n    }\n\n    /**\n     * Is ProfilesFragment editable at all.\n     */\n    private val isEnabled get() = (activity as MainActivity).state.let { it.canStop || it == BaseService.State.Stopped }\n\n    private fun isProfileEditable(id: Long) =\n            (activity as MainActivity).state == BaseService.State.Stopped || id !in Core.activeProfileIds\n\n    class QRCodeDialog() : DialogFragment() {\n        constructor(url: String) : this() {\n            arguments = bundleOf(Pair(KEY_URL, url))\n        }\n\n        /**\n         * Based on:\n         * https://android.googlesource.com/platform/packages/apps/Settings/+/0d706f0/src/com/android/settings/wifi/qrcode/QrCodeGenerator.java\n         * https://android.googlesource.com/platform/packages/apps/Settings/+/8a9ccfd/src/com/android/settings/wifi/dpp/WifiDppQrCodeGeneratorFragment.java#153\n         */\n        override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?) = try {\n            val url = arguments?.getString(KEY_URL)!!\n            val size = resources.getDimensionPixelSize(R.dimen.qrcode_size)\n            val hints = mutableMapOf<EncodeHintType, Any>()\n            if (!iso88591.canEncode(url)) hints[EncodeHintType.CHARACTER_SET] = StandardCharsets.UTF_8.name()\n            val qrBits = MultiFormatWriter().encode(url, BarcodeFormat.QR_CODE, size, size, hints)\n            ImageView(context).apply {\n                layoutParams = ViewGroup.LayoutParams(size, size)\n                setImageBitmap(Bitmap.createBitmap(size, size, Bitmap.Config.RGB_565).apply {\n                    for (x in 0 until size) for (y in 0 until size) {\n                        setPixel(x, y, if (qrBits.get(x, y)) Color.BLACK else Color.WHITE)\n                    }\n                })\n            }\n        } catch (e: WriterException) {\n            Timber.w(e)\n            (activity as MainActivity).snackbar().setText(e.readableMessage).show()\n            dismiss()\n            null\n        }\n    }\n\n    inner class ProfileViewHolder(view: View) : RecyclerView.ViewHolder(view),\n            View.OnClickListener, PopupMenu.OnMenuItemClickListener {\n        internal lateinit var item: Profile\n\n        private val text1 = itemView.findViewById<TextView>(android.R.id.text1)\n        private val text2 = itemView.findViewById<TextView>(android.R.id.text2)\n        private val traffic = itemView.findViewById<TextView>(R.id.traffic)\n        private val edit = itemView.findViewById<View>(R.id.edit)\n        private val subscription = itemView.findViewById<View>(R.id.subscription)\n\n        init {\n            edit.setOnClickListener {\n                item = ProfileManager.getProfile(item.id)!!\n                startConfig(item)\n            }\n            subscription.setOnClickListener {\n                item = ProfileManager.getProfile(item.id) ?: return@setOnClickListener\n                startConfig(item)\n            }\n            TooltipCompat.setTooltipText(edit, edit.contentDescription)\n            TooltipCompat.setTooltipText(subscription, subscription.contentDescription)\n            itemView.setOnClickListener(this)\n            val share = itemView.findViewById<View>(R.id.share)\n            share.setOnClickListener {\n                val popup = PopupMenu(requireContext(), share)\n                popup.menuInflater.inflate(R.menu.profile_share_popup, popup.menu)\n                popup.setOnMenuItemClickListener(this)\n                popup.show()\n            }\n            TooltipCompat.setTooltipText(share, share.contentDescription)\n        }\n\n        fun bind(item: Profile) {\n            this.item = item\n            val editable = isProfileEditable(item.id)\n            edit.isEnabled = editable\n            edit.alpha = if (editable) 1F else .5F\n            subscription.isEnabled = editable\n            subscription.alpha = if (editable) 1F else .5F\n            var tx = item.tx\n            var rx = item.rx\n            statsCache[item.id]?.apply {\n                tx += txTotal\n                rx += rxTotal\n            }\n            text1.text = item.formattedName\n            text2.text = ArrayList<String>().apply {\n                if (!item.name.isNullOrEmpty()) this += item.formattedAddress\n                val id = PluginConfiguration(item.plugin ?: \"\").selected\n                if (id.isNotEmpty()) this += getString(R.string.profile_plugin, id)\n            }.joinToString(\"\\n\")\n            val context = requireContext()\n            traffic.text = if (tx <= 0 && rx <= 0) null else getString(R.string.traffic,\n                    Formatter.formatFileSize(context, tx), Formatter.formatFileSize(context, rx))\n\n            if (item.id == DataStore.profileId) {\n                itemView.isSelected = true\n                selectedItem = this\n            } else {\n                itemView.isSelected = false\n                if (selectedItem === this) selectedItem = null\n            }\n\n            if (item.subscription == Profile.SubscriptionStatus.Active) {\n                edit.visibility = View.GONE\n                subscription.visibility = View.VISIBLE\n            } else {\n                edit.visibility = View.VISIBLE\n                subscription.visibility = View.GONE\n            }\n        }\n\n        override fun onClick(v: View?) {\n            if (isEnabled) {\n                val activity = activity as MainActivity\n                val old = DataStore.profileId\n                Core.switchProfile(item.id)\n                profilesAdapter.refreshId(old)\n                itemView.isSelected = true\n                if (activity.state.canStop) Core.reloadService()\n            }\n        }\n\n        override fun onMenuItemClick(item: MenuItem): Boolean = when (item.itemId) {\n            R.id.action_qr_code -> {\n                QRCodeDialog(this.item.toString()).showAllowingStateLoss(parentFragmentManager)\n                true\n            }\n            R.id.action_export_clipboard -> {\n                val success = Core.trySetPrimaryClip(this.item.toString(), true)\n                (activity as MainActivity).snackbar().setText(\n                        if (success) R.string.action_export_msg else R.string.action_export_err).show()\n                true\n            }\n            else -> false\n        }\n    }\n\n    inner class ProfilesAdapter : RecyclerView.Adapter<ProfileViewHolder>(), ProfileManager.Listener {\n        internal val profiles = ProfileManager.getActiveProfiles()?.toMutableList() ?: mutableListOf()\n        private val updated = HashSet<Profile>()\n\n        init {\n            setHasStableIds(true)   // see: http://stackoverflow.com/a/32488059/2245107\n        }\n\n        override fun onBindViewHolder(holder: ProfileViewHolder, position: Int) = holder.bind(profiles[position])\n        override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ProfileViewHolder = ProfileViewHolder(\n                LayoutInflater.from(parent.context).inflate(R.layout.layout_profile, parent, false))\n\n        override fun getItemCount(): Int = profiles.size\n        override fun getItemId(position: Int): Long = profiles[position].id\n\n        override fun onAdd(profile: Profile) {\n            undoManager.flush()\n            val pos = itemCount\n            profiles += profile\n            notifyItemInserted(pos)\n        }\n\n        fun filter(name: String) {\n            val active = ProfileManager.getActiveProfiles()?.toMutableList() ?: mutableListOf()\n            profiles.clear()\n            val locale = resources.configuration.locale\n            val lower = name.lowercase(locale)\n            profiles.addAll(active.filter {\n                it.name?.lowercase(locale)?.contains(lower) == true || it.host.lowercase(locale).contains(lower)\n            })\n            notifyDataSetChanged()\n        }\n\n        fun move(from: Int, to: Int) {\n            undoManager.flush()\n            val first = profiles[from]\n            var previousOrder = first.userOrder\n            val (step, range) = if (from < to) Pair(1, from until to) else Pair(-1, from downTo to + 1)\n            for (i in range) {\n                val next = profiles[i + step]\n                val order = next.userOrder\n                next.userOrder = previousOrder\n                previousOrder = order\n                profiles[i] = next\n                updated.add(next)\n            }\n            first.userOrder = previousOrder\n            profiles[to] = first\n            updated.add(first)\n            notifyItemMoved(from, to)\n        }\n\n        fun commitMove() {\n            updated.forEach { ProfileManager.updateProfile(it) }\n            updated.clear()\n        }\n\n        fun remove(pos: Int) {\n            profiles.removeAt(pos)\n            notifyItemRemoved(pos)\n        }\n\n        fun undo(actions: List<Pair<Int, Profile>>) {\n            for ((index, item) in actions) {\n                profiles.add(index, item)\n                notifyItemInserted(index)\n            }\n        }\n\n        fun commit(actions: List<Pair<Int, Profile>>) {\n            for ((_, item) in actions) ProfileManager.delProfile(item.id)\n        }\n\n        fun refreshId(id: Long) {\n            val index = profiles.indexOfFirst { it.id == id }\n            if (index >= 0) notifyItemChanged(index)\n        }\n\n        fun deepRefreshId(id: Long) {\n            val index = profiles.indexOfFirst { it.id == id }\n            if (index < 0) return\n            profiles[index] = ProfileManager.getProfile(id)!!\n            notifyItemChanged(index)\n        }\n\n        override fun onRemove(profileId: Long) {\n            val index = profiles.indexOfFirst { it.id == profileId }\n            if (index < 0) return\n            profiles.removeAt(index)\n            notifyItemRemoved(index)\n            if (profileId == DataStore.profileId) DataStore.profileId = 0   // switch to null profile\n        }\n\n        override fun onCleared() {\n            profiles.clear()\n            notifyDataSetChanged()\n        }\n\n        override fun reloadProfiles() {\n            profiles.clear()\n            ProfileManager.getActiveProfiles()?.let { profiles.addAll(it) }\n            notifyDataSetChanged()\n        }\n    }\n\n    private var selectedItem: ProfileViewHolder? = null\n\n    val profilesAdapter by lazy { ProfilesAdapter() }\n    private lateinit var profilesList: RecyclerView\n    private val layoutManager by lazy { LinearLayoutManager(context, RecyclerView.VERTICAL, false) }\n    private lateinit var undoManager: UndoSnackbarManager<Profile>\n    private val statsCache = LongSparseArray<TrafficStats>()\n\n    private fun startConfig(profile: Profile) {\n        profile.serialize()\n        startActivity(Intent(context, ProfileConfigActivity::class.java).putExtra(Action.EXTRA_PROFILE_ID, profile.id))\n    }\n\n    override fun onQueryTextChange(query: String): Boolean {\n        profilesAdapter.filter(query)\n        return false\n    }\n\n    override fun onQueryTextSubmit(query: String): Boolean = false\n\n    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? =\n            inflater.inflate(R.layout.layout_list, container, false)\n\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        super.onViewCreated(view, savedInstanceState)\n        ViewCompat.setOnApplyWindowInsetsListener(view, ListHolderListener)\n        toolbar.setTitle(R.string.profiles)\n        toolbar.inflateMenu(R.menu.profile_manager_menu)\n        toolbar.setOnMenuItemClickListener(this)\n        val searchView = toolbar.findViewById<SearchView>(R.id.action_search)\n        searchView.setOnQueryTextListener(this)\n        searchView.queryHint = getString(android.R.string.search_go)\n\n        ProfileManager.ensureNotEmpty()\n        profilesList = view.findViewById(R.id.list)\n        ViewCompat.setOnApplyWindowInsetsListener(profilesList, MainListListener)\n        profilesList.layoutManager = layoutManager\n        profilesList.addItemDecoration(DividerItemDecoration(context, layoutManager.orientation))\n        layoutManager.scrollToPosition(profilesAdapter.profiles.indexOfFirst { it.id == DataStore.profileId })\n        val animator = DefaultItemAnimator()\n        animator.supportsChangeAnimations = false // prevent fading-in/out when rebinding\n        profilesList.itemAnimator = animator\n        profilesList.adapter = profilesAdapter\n        instance = this\n        ProfileManager.listener = profilesAdapter\n        undoManager = UndoSnackbarManager(activity as MainActivity, profilesAdapter::undo, profilesAdapter::commit)\n        ItemTouchHelper(object : ItemTouchHelper.SimpleCallback(ItemTouchHelper.UP or ItemTouchHelper.DOWN,\n                ItemTouchHelper.START) {\n            override fun getSwipeDirs(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder): Int =\n                    if (isProfileEditable((viewHolder as ProfileViewHolder).item.id)) {\n                        super.getSwipeDirs(recyclerView, viewHolder)\n                    } else 0\n\n            override fun getDragDirs(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder): Int =\n                    if (isEnabled) super.getDragDirs(recyclerView, viewHolder) else 0\n\n            override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {\n                val index = viewHolder.bindingAdapterPosition\n                profilesAdapter.remove(index)\n                undoManager.remove(Pair(index, (viewHolder as ProfileViewHolder).item))\n            }\n\n            override fun onMove(recyclerView: RecyclerView,\n                                viewHolder: RecyclerView.ViewHolder, target: RecyclerView.ViewHolder): Boolean {\n                profilesAdapter.move(viewHolder.bindingAdapterPosition, target.bindingAdapterPosition)\n                return true\n            }\n\n            override fun clearView(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder) {\n                super.clearView(recyclerView, viewHolder)\n                profilesAdapter.commitMove()\n            }\n        }).attachToRecyclerView(profilesList)\n    }\n\n    override fun onMenuItemClick(item: MenuItem): Boolean {\n        return when (item.itemId) {\n            R.id.action_scan_qr_code -> {\n                startActivity(Intent(context, ScannerActivity::class.java))\n                true\n            }\n            R.id.action_import_clipboard -> {\n                try {\n                    val profiles = Profile.findAllUrls(\n                            Core.clipboard.primaryClip!!.getItemAt(0).text,\n                            Core.currentProfile?.main\n                    ).toList()\n                    if (profiles.isNotEmpty()) {\n                        profiles.forEach { ProfileManager.createProfile(it) }\n                        (activity as MainActivity).snackbar().setText(R.string.action_import_msg).show()\n                        return true\n                    }\n                } catch (exc: Exception) {\n                    Timber.d(exc)\n                }\n                (activity as MainActivity).snackbar().setText(R.string.action_import_err).show()\n                true\n            }\n            R.id.action_import_file -> {\n                startFilesForResult(importProfiles)\n                true\n            }\n            R.id.action_replace_file -> {\n                startFilesForResult(replaceProfiles)\n                true\n            }\n            R.id.action_manual_settings -> {\n                startConfig(ProfileManager.createProfile(\n                        Profile().also { Core.currentProfile?.main?.copyFeatureSettingsTo(it) }))\n                true\n            }\n            R.id.action_export_clipboard -> {\n                val profiles = ProfileManager.getActiveProfiles()\n                val success = profiles != null && Core.trySetPrimaryClip(profiles.joinToString(\"\\n\"), true)\n                (activity as MainActivity).snackbar().setText(\n                        if (success) R.string.action_export_msg else R.string.action_export_err).show()\n                true\n            }\n            R.id.action_export_file -> {\n                startFilesForResult(exportProfiles)\n                true\n            }\n            else -> false\n        }\n    }\n\n    private fun startFilesForResult(launcher: ActivityResultLauncher<String>) {\n        try {\n            return launcher.launch(\"\")\n        } catch (_: ActivityNotFoundException) {\n        } catch (_: SecurityException) {\n        }\n        (activity as MainActivity).snackbar(getString(R.string.file_manager_missing)).show()\n    }\n\n    private fun importOrReplaceProfiles(dataUris: List<Uri>, replace: Boolean = false) {\n        if (dataUris.isEmpty()) return\n        val activity = activity as MainActivity\n        try {\n            ProfileManager.createProfilesFromJson(dataUris.asSequence().map {\n                activity.contentResolver.openInputStream(it)\n            }.filterNotNull(), replace)\n        } catch (e: Exception) {\n            activity.snackbar(e.readableMessage).show()\n        }\n    }\n    private val importProfiles = registerForActivityResult(OpenJson) { importOrReplaceProfiles(it) }\n    private val replaceProfiles = registerForActivityResult(OpenJson) { importOrReplaceProfiles(it, true) }\n    private val exportProfiles = registerForActivityResult(SaveJson) { data ->\n        if (data != null) ProfileManager.serializeToJson()?.let { profiles ->\n            val activity = activity as MainActivity\n            try {\n                activity.contentResolver.openOutputStream(data)!!.bufferedWriter().use {\n                    it.write(profiles.toString(2))\n                }\n            } catch (e: Exception) {\n                Timber.w(e)\n                activity.snackbar(e.readableMessage).show()\n            }\n        }\n    }\n\n    fun onTrafficUpdated(profileId: Long, stats: TrafficStats) {\n        if (profileId != 0L) {  // ignore aggregate stats\n            statsCache.put(profileId, stats)\n            profilesAdapter.refreshId(profileId)\n        }\n    }\n\n    fun onTrafficPersisted(profileId: Long) {\n        statsCache.remove(profileId)\n        profilesAdapter.deepRefreshId(profileId)\n    }\n\n    override fun onDestroyView() {\n        undoManager.flush()\n        super.onDestroyView()\n    }\n\n    override fun onDestroy() {\n        instance = null\n        ProfileManager.listener = null\n        super.onDestroy()\n    }\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/github/shadowsocks/QuickToggleShortcut.kt",
    "content": "/*******************************************************************************\n *                                                                             *\n *  Copyright (C) 2017 by Max Lv <max.c.lv@gmail.com>                          *\n *  Copyright (C) 2017 by Mygod Studio <contact-shadowsocks-android@mygod.be>  *\n *                                                                             *\n *  This program is free software: you can redistribute it and/or modify       *\n *  it under the terms of the GNU General Public License as published by       *\n *  the Free Software Foundation, either version 3 of the License, or          *\n *  (at your option) any later version.                                        *\n *                                                                             *\n *  This program is distributed in the hope that it will be useful,            *\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of             *\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the              *\n *  GNU General Public License for more details.                               *\n *                                                                             *\n *  You should have received a copy of the GNU General Public License          *\n *  along with this program. If not, see <http://www.gnu.org/licenses/>.       *\n *                                                                             *\n *******************************************************************************/\n\npackage com.github.shadowsocks\n\nimport android.app.Activity\nimport android.content.Intent\nimport android.content.pm.ShortcutManager\nimport android.os.Build\nimport android.os.Bundle\nimport androidx.core.content.getSystemService\nimport androidx.core.content.pm.ShortcutInfoCompat\nimport androidx.core.content.pm.ShortcutManagerCompat\nimport androidx.core.graphics.drawable.IconCompat\nimport com.github.shadowsocks.aidl.IShadowsocksService\nimport com.github.shadowsocks.aidl.ShadowsocksConnection\nimport com.github.shadowsocks.bg.BaseService\n\n@Suppress(\"DEPRECATION\")\n@Deprecated(\"This shortcut is inefficient and should be superseded by TileService for API 24+.\")\nclass QuickToggleShortcut : Activity(), ShadowsocksConnection.Callback {\n    private val connection = ShadowsocksConnection()\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        if (intent.action == Intent.ACTION_CREATE_SHORTCUT) {\n            setResult(RESULT_OK, ShortcutManagerCompat.createShortcutResultIntent(this,\n                    ShortcutInfoCompat.Builder(this, \"toggle\")\n                            .setIntent(Intent(this, QuickToggleShortcut::class.java).setAction(Intent.ACTION_MAIN))\n                            .setIcon(IconCompat.createWithResource(this, R.drawable.ic_qu_shadowsocks_launcher))\n                            .setShortLabel(getString(R.string.quick_toggle))\n                            .build()))\n            finish()\n        } else {\n            connection.connect(this, this)\n            if (Build.VERSION.SDK_INT >= 25) getSystemService<ShortcutManager>()!!.reportShortcutUsed(\"toggle\")\n        }\n    }\n\n    override fun onServiceConnected(service: IShadowsocksService) {\n        val state = BaseService.State.entries[service.state]\n        when {\n            state.canStop -> Core.stopService()\n            state == BaseService.State.Stopped -> Core.startService()\n        }\n        finish()\n    }\n\n    override fun stateChanged(state: BaseService.State, profileName: String?, msg: String?) { }\n\n    override fun onDestroy() {\n        connection.disconnect(this)\n        super.onDestroy()\n    }\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/github/shadowsocks/ScannerActivity.kt",
    "content": "/*******************************************************************************\n *                                                                             *\n *  Copyright (C) 2017 by Max Lv <max.c.lv@gmail.com>                          *\n *  Copyright (C) 2017 by Mygod Studio <contact-shadowsocks-android@mygod.be>  *\n *                                                                             *\n *  This program is free software: you can redistribute it and/or modify       *\n *  it under the terms of the GNU General Public License as published by       *\n *  the Free Software Foundation, either version 3 of the License, or          *\n *  (at your option) any later version.                                        *\n *                                                                             *\n *  This program is distributed in the hope that it will be useful,            *\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of             *\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the              *\n *  GNU General Public License for more details.                               *\n *                                                                             *\n *  You should have received a copy of the GNU General Public License          *\n *  along with this program. If not, see <http://www.gnu.org/licenses/>.       *\n *                                                                             *\n *******************************************************************************/\n\npackage com.github.shadowsocks\n\nimport android.Manifest\nimport android.content.Intent\nimport android.content.pm.ShortcutManager\nimport android.net.Uri\nimport android.os.Build\nimport android.os.Bundle\nimport android.view.Menu\nimport android.view.MenuItem\nimport android.widget.Toast\nimport androidx.activity.result.contract.ActivityResultContracts\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.camera.core.Camera\nimport androidx.camera.core.CameraSelector\nimport androidx.camera.core.ExperimentalGetImage\nimport androidx.camera.core.ImageAnalysis\nimport androidx.camera.core.ImageProxy\nimport androidx.camera.core.Preview\nimport androidx.camera.core.resolutionselector.ResolutionSelector\nimport androidx.camera.core.resolutionselector.ResolutionStrategy\nimport androidx.camera.lifecycle.ProcessCameraProvider\nimport androidx.camera.view.PreviewView\nimport androidx.concurrent.futures.await\nimport androidx.core.content.getSystemService\nimport androidx.lifecycle.lifecycleScope\nimport com.github.shadowsocks.Core.app\nimport com.github.shadowsocks.database.Profile\nimport com.github.shadowsocks.database.ProfileManager\nimport com.github.shadowsocks.utils.forEachTry\nimport com.github.shadowsocks.utils.readableMessage\nimport com.github.shadowsocks.widget.ListHolderListener\nimport com.google.mlkit.vision.barcode.BarcodeScannerOptions\nimport com.google.mlkit.vision.barcode.BarcodeScanning\nimport com.google.mlkit.vision.barcode.ZoomSuggestionOptions\nimport com.google.mlkit.vision.barcode.common.Barcode\nimport com.google.mlkit.vision.common.InputImage\nimport kotlinx.coroutines.CancellationException\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.asExecutor\nimport kotlinx.coroutines.launch\nimport kotlinx.coroutines.tasks.await\nimport kotlinx.coroutines.withContext\nimport timber.log.Timber\n\nclass ScannerActivity : AppCompatActivity(), ImageAnalysis.Analyzer, ZoomSuggestionOptions.ZoomCallback {\n    private val scanner = BarcodeScanning.getClient(BarcodeScannerOptions.Builder().apply {\n        setBarcodeFormats(Barcode.FORMAT_QR_CODE)\n        setZoomSuggestionOptions(ZoomSuggestionOptions.Builder(this@ScannerActivity).build())\n    }.build())\n    private val imageAnalysis by lazy {\n        ImageAnalysis.Builder().apply {\n            setBackpressureStrategy(ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST)\n            setBackgroundExecutor(Dispatchers.Default.asExecutor())\n        }.build().also { it.setAnalyzer(Dispatchers.Main.immediate.asExecutor(), this) }\n    }\n    private var camera: Camera? = null\n\n    @ExperimentalGetImage\n    override fun analyze(image: ImageProxy) {\n        val mediaImage = image.image ?: return\n        lifecycleScope.launch {\n            val result = try {\n                process { InputImage.fromMediaImage(mediaImage, image.imageInfo.rotationDegrees) }.also {\n                    if (it) imageAnalysis.clearAnalyzer()\n                }\n            } catch (_: CancellationException) {\n                return@launch\n            } catch (e: Exception) {\n                return@launch Timber.w(e)\n            } finally {\n                image.close()\n            }\n            if (result) onSupportNavigateUp()\n        }\n    }\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        if (Build.VERSION.SDK_INT >= 25) getSystemService<ShortcutManager>()!!.reportShortcutUsed(\"scan\")\n        setContentView(R.layout.layout_scanner)\n        ListHolderListener.setup(this)\n        setSupportActionBar(findViewById(R.id.toolbar))\n        supportActionBar!!.setDisplayHomeAsUpEnabled(true)\n        lifecycle.addObserver(scanner)\n        requestCamera.launch(Manifest.permission.CAMERA)\n    }\n    private val requestCamera = registerForActivityResult(ActivityResultContracts.RequestPermission()) { granted ->\n        if (granted) lifecycleScope.launch {\n            val cameraProvider = ProcessCameraProvider.getInstance(this@ScannerActivity).await()\n            val selector = if (cameraProvider.hasCamera(CameraSelector.DEFAULT_BACK_CAMERA)) {\n                CameraSelector.DEFAULT_BACK_CAMERA\n            } else CameraSelector.DEFAULT_FRONT_CAMERA\n            val preview = Preview.Builder().apply {\n                setResolutionSelector(ResolutionSelector.Builder().apply {\n                    setResolutionStrategy(ResolutionStrategy.HIGHEST_AVAILABLE_STRATEGY)\n                }.build())\n            }.build()\n            preview.setSurfaceProvider(findViewById<PreviewView>(R.id.barcode).surfaceProvider)\n            try {\n                camera = cameraProvider.bindToLifecycle(this@ScannerActivity, selector, preview, imageAnalysis)\n            } catch (e: IllegalArgumentException) {\n                Timber.d(e)\n                startImport()\n            }\n        } else permissionMissing()\n    }\n\n    override fun setZoom(ratio: Float): Boolean {\n        val camera = camera ?: return false\n        camera.cameraControl.setZoomRatio(ratio)\n        return true\n    }\n\n    private suspend inline fun process(feature: Profile? = Core.currentProfile?.main,\n                                       crossinline image: () -> InputImage): Boolean {\n        val barcodes = withContext(Dispatchers.Default) { scanner.process(image()).await() }\n        var result = false\n        for (profile in Profile.findAllUrls(barcodes.mapNotNull { it.rawValue }.joinToString(\"\\n\"), feature)) {\n            ProfileManager.createProfile(profile)\n            result = true\n        }\n        return result\n    }\n\n    private fun permissionMissing() {\n        Toast.makeText(this, R.string.add_profile_scanner_permission_required, Toast.LENGTH_SHORT).show()\n        startImport()\n    }\n\n    override fun onCreateOptionsMenu(menu: Menu): Boolean {\n        menuInflater.inflate(R.menu.scanner_menu, menu)\n        return true\n    }\n    override fun onOptionsItemSelected(item: MenuItem) = when (item.itemId) {\n        R.id.action_import_clipboard -> {\n            startImport(true)\n            true\n        }\n        else -> false\n    }\n\n    /**\n     * See also: https://stackoverflow.com/a/31350642/2245107\n     */\n    override fun shouldUpRecreateTask(targetIntent: Intent?) = super.shouldUpRecreateTask(targetIntent) || isTaskRoot\n\n    private var finished = false\n    override fun onSupportNavigateUp(): Boolean {\n        if (finished) return false\n        finished = true\n        return super.onSupportNavigateUp()\n    }\n\n    private fun startImport(manual: Boolean = false) = (if (manual) import else importFinish).launch(\"image/*\")\n    private val import = registerForActivityResult(ActivityResultContracts.GetMultipleContents()) { importOrFinish(it) }\n    private val importFinish = registerForActivityResult(ActivityResultContracts.GetMultipleContents()) {\n        importOrFinish(it, true)\n    }\n    private fun importOrFinish(dataUris: List<Uri>, finish: Boolean = false) {\n        if (dataUris.isNotEmpty()) lifecycleScope.launch(Dispatchers.Main.immediate) {\n            onSupportNavigateUp()\n            val feature = Core.currentProfile?.main\n            try {\n                var success = false\n                dataUris.forEachTry { uri ->\n                    if (process(feature) { InputImage.fromFilePath(app, uri) }) success = true\n                }\n                Toast.makeText(app, if (success) R.string.action_import_msg else R.string.action_import_err,\n                        Toast.LENGTH_SHORT).show()\n            } catch (e: Exception) {\n                Toast.makeText(app, e.readableMessage, Toast.LENGTH_LONG).show()\n            }\n        } else if (finish) onSupportNavigateUp()\n    }\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/github/shadowsocks/ToolbarFragment.kt",
    "content": "/*******************************************************************************\n *                                                                             *\n *  Copyright (C) 2017 by Max Lv <max.c.lv@gmail.com>                          *\n *  Copyright (C) 2017 by Mygod Studio <contact-shadowsocks-android@mygod.be>  *\n *                                                                             *\n *  This program is free software: you can redistribute it and/or modify       *\n *  it under the terms of the GNU General Public License as published by       *\n *  the Free Software Foundation, either version 3 of the License, or          *\n *  (at your option) any later version.                                        *\n *                                                                             *\n *  This program is distributed in the hope that it will be useful,            *\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of             *\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the              *\n *  GNU General Public License for more details.                               *\n *                                                                             *\n *  You should have received a copy of the GNU General Public License          *\n *  along with this program. If not, see <http://www.gnu.org/licenses/>.       *\n *                                                                             *\n *******************************************************************************/\n\npackage com.github.shadowsocks\n\nimport android.os.Bundle\nimport android.view.View\nimport androidx.appcompat.widget.Toolbar\nimport androidx.core.view.GravityCompat\nimport androidx.fragment.app.Fragment\n\nopen class ToolbarFragment : Fragment() {\n    lateinit var toolbar: Toolbar\n\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        super.onViewCreated(view, savedInstanceState)\n        toolbar = view.findViewById(R.id.toolbar)\n        toolbar.setNavigationIcon(R.drawable.ic_navigation_menu)\n        toolbar.setNavigationOnClickListener { (activity as MainActivity).drawer.openDrawer(GravityCompat.START) }\n    }\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/github/shadowsocks/UdpFallbackProfileActivity.kt",
    "content": "/*******************************************************************************\n *                                                                             *\n *  Copyright (C) 2019 by Max Lv <max.c.lv@gmail.com>                          *\n *  Copyright (C) 2019 by Mygod Studio <contact-shadowsocks-android@mygod.be>  *\n *                                                                             *\n *  This program is free software: you can redistribute it and/or modify       *\n *  it under the terms of the GNU General Public License as published by       *\n *  the Free Software Foundation, either version 3 of the License, or          *\n *  (at your option) any later version.                                        *\n *                                                                             *\n *  This program is distributed in the hope that it will be useful,            *\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of             *\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the              *\n *  GNU General Public License for more details.                               *\n *                                                                             *\n *  You should have received a copy of the GNU General Public License          *\n *  along with this program. If not, see <http://www.gnu.org/licenses/>.       *\n *                                                                             *\n *******************************************************************************/\n\npackage com.github.shadowsocks\n\nimport android.content.res.Resources\nimport android.os.Bundle\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport android.widget.CheckedTextView\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.appcompat.widget.Toolbar\nimport androidx.core.view.ViewCompat\nimport androidx.recyclerview.widget.DefaultItemAnimator\nimport androidx.recyclerview.widget.LinearLayoutManager\nimport androidx.recyclerview.widget.RecyclerView\nimport com.github.shadowsocks.database.Profile\nimport com.github.shadowsocks.database.ProfileManager\nimport com.github.shadowsocks.plugin.PluginConfiguration\nimport com.github.shadowsocks.preference.DataStore\nimport com.github.shadowsocks.utils.resolveResourceId\nimport com.github.shadowsocks.widget.ListHolderListener\nimport com.github.shadowsocks.widget.ListListener\n\nclass UdpFallbackProfileActivity : AppCompatActivity() {\n    inner class ProfileViewHolder(view: View) : RecyclerView.ViewHolder(view), View.OnClickListener {\n        private var item: Profile? = null\n        private val text = itemView.findViewById<CheckedTextView>(android.R.id.text1)\n\n        init {\n            view.setBackgroundResource(theme.resolveResourceId(android.R.attr.selectableItemBackground))\n            itemView.setOnClickListener(this)\n        }\n\n        fun bind(item: Profile?) {\n            this.item = item\n            if (item == null) text.setText(R.string.plugin_disabled) else text.text = item.formattedName\n            text.isChecked = udpFallback == item?.id\n        }\n\n        override fun onClick(v: View?) {\n            DataStore.udpFallback = item?.id\n            DataStore.dirty = true\n            finish()\n        }\n    }\n\n    inner class ProfilesAdapter : RecyclerView.Adapter<ProfileViewHolder>() {\n        internal val profiles = (ProfileManager.getActiveProfiles()?.toMutableList() ?: mutableListOf())\n                .filter { it.id != editingId && PluginConfiguration(it.plugin ?: \"\").selected.isEmpty() }\n\n        override fun onBindViewHolder(holder: ProfileViewHolder, position: Int) =\n                holder.bind(if (position == 0) null else profiles[position - 1])\n        override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ProfileViewHolder = ProfileViewHolder(\n                LayoutInflater.from(parent.context).inflate(Resources.getSystem()\n                        .getIdentifier(\"select_dialog_singlechoice_material\", \"layout\", \"android\"), parent, false))\n        override fun getItemCount(): Int = 1 + profiles.size\n    }\n\n    private var editingId = DataStore.editingId\n    private var udpFallback = DataStore.udpFallback\n    private val profilesAdapter = ProfilesAdapter()\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        if (editingId == null) {\n            finish()\n            return\n        }\n        setContentView(R.layout.layout_udp_fallback)\n        ListHolderListener.setup(this)\n\n        val toolbar = findViewById<Toolbar>(R.id.toolbar)\n        toolbar.setTitle(R.string.udp_fallback)\n        toolbar.setNavigationIcon(R.drawable.ic_navigation_close)\n        toolbar.setNavigationOnClickListener { finish() }\n\n        findViewById<RecyclerView>(R.id.list).apply {\n            ViewCompat.setOnApplyWindowInsetsListener(this, ListListener)\n            itemAnimator = DefaultItemAnimator()\n            adapter = profilesAdapter\n            layoutManager = LinearLayoutManager(this@UdpFallbackProfileActivity, RecyclerView.VERTICAL, false).apply {\n                if (DataStore.udpFallback != null) {\n                    scrollToPosition(profilesAdapter.profiles.indexOfFirst { it.id == DataStore.udpFallback } + 1)\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/github/shadowsocks/acl/CustomRulesFragment.kt",
    "content": "/*******************************************************************************\n *                                                                             *\n *  Copyright (C) 2017 by Max Lv <max.c.lv@gmail.com>                          *\n *  Copyright (C) 2017 by Mygod Studio <contact-shadowsocks-android@mygod.be>  *\n *                                                                             *\n *  This program is free software: you can redistribute it and/or modify       *\n *  it under the terms of the GNU General Public License as published by       *\n *  the Free Software Foundation, either version 3 of the License, or          *\n *  (at your option) any later version.                                        *\n *                                                                             *\n *  This program is distributed in the hope that it will be useful,            *\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of             *\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the              *\n *  GNU General Public License for more details.                               *\n *                                                                             *\n *  You should have received a copy of the GNU General Public License          *\n *  along with this program. If not, see <http://www.gnu.org/licenses/>.       *\n *                                                                             *\n *******************************************************************************/\n\npackage com.github.shadowsocks.acl\n\nimport android.annotation.SuppressLint\nimport android.content.Context\nimport android.content.DialogInterface\nimport android.os.Bundle\nimport android.os.Parcelable\nimport android.text.Editable\nimport android.text.TextWatcher\nimport android.view.*\nimport android.widget.AdapterView\nimport android.widget.EditText\nimport android.widget.Spinner\nimport android.widget.TextView\nimport androidx.activity.OnBackPressedCallback\nimport androidx.appcompat.app.AlertDialog\nimport androidx.appcompat.widget.Toolbar\nimport androidx.core.content.ContextCompat\nimport androidx.core.view.ViewCompat\nimport androidx.recyclerview.widget.DefaultItemAnimator\nimport androidx.recyclerview.widget.ItemTouchHelper\nimport androidx.recyclerview.widget.LinearLayoutManager\nimport androidx.recyclerview.widget.RecyclerView\nimport com.github.shadowsocks.Core\nimport com.github.shadowsocks.MainActivity\nimport com.github.shadowsocks.R\nimport com.github.shadowsocks.ToolbarFragment\nimport com.github.shadowsocks.bg.BaseService\nimport com.github.shadowsocks.net.Subnet\nimport com.github.shadowsocks.plugin.fragment.AlertDialogFragment\nimport com.github.shadowsocks.utils.asIterable\nimport com.github.shadowsocks.utils.readableMessage\nimport com.github.shadowsocks.utils.resolveResourceId\nimport com.github.shadowsocks.widget.ListHolderListener\nimport com.github.shadowsocks.widget.MainListListener\nimport com.github.shadowsocks.widget.UndoSnackbarManager\nimport com.google.android.material.textfield.TextInputLayout\nimport kotlinx.parcelize.Parcelize\nimport me.zhanghai.android.fastscroll.FastScrollerBuilder\nimport timber.log.Timber\nimport java.net.IDN\nimport java.net.MalformedURLException\nimport java.net.URL\nimport java.util.regex.PatternSyntaxException\n\nclass CustomRulesFragment : ToolbarFragment(), Toolbar.OnMenuItemClickListener, ActionMode.Callback {\n    companion object {\n        private const val SELECTED_SUBNETS = \"com.github.shadowsocks.acl.CustomRulesFragment.SELECTED_SUBNETS\"\n        private const val SELECTED_HOSTNAMES = \"com.github.shadowsocks.acl.CustomRulesFragment.SELECTED_HOSTNAMES\"\n        private const val SELECTED_URLS = \"com.github.shadowsocks.acl.CustomRulesFragment.SELECTED_URLS\"\n\n        // unescaped lol: (?<=^(?:\\(\\^\\|\\\\\\.\\)|\\^\\(\\.\\*\\\\\\.\\)\\?|\\(\\?:\\^\\|\\\\\\.\\))).*(?=\\$$)\n        private val domainPattern =\n                \"(?<=^(?:\\\\(\\\\^\\\\|\\\\\\\\\\\\.\\\\)|\\\\^\\\\(\\\\.\\\\*\\\\\\\\\\\\.\\\\)\\\\?|\\\\(\\\\?:\\\\^\\\\|\\\\\\\\\\\\.\\\\))).*(?=\\\\\\$\\$)\".toRegex()\n\n        private fun AclItem(item: Any) = when (item) {\n            is String -> AclItem(item, false)\n            is Subnet -> AclItem(item.toString(), false)\n            is URL -> AclItem(item.toString(), true)\n            else -> throw IllegalArgumentException(\"item\")\n        }\n    }\n\n    private enum class Template {\n        Generic,\n        Domain,\n        Url;\n    }\n    @Parcelize\n    data class AclItem(val item: String = \"\", val isUrl: Boolean = false) : Parcelable {\n        fun toAny() = if (isUrl) URL(item) else Subnet.fromString(item) ?: item\n    }\n    @Parcelize\n    data class AclArg(val item: AclItem? = null) : Parcelable\n    @Parcelize\n    data class AclEditResult(val edited: AclItem?, val replacing: AclItem?) : Parcelable\n    class AclRuleDialogFragment : AlertDialogFragment<AclArg, AclEditResult>(),\n            TextWatcher, AdapterView.OnItemSelectedListener {\n        private lateinit var templateSelector: Spinner\n        private lateinit var editText: EditText\n        private lateinit var inputLayout: TextInputLayout\n        private val positive by lazy { (dialog as AlertDialog).getButton(AlertDialog.BUTTON_POSITIVE) }\n\n        override fun AlertDialog.Builder.prepare(listener: DialogInterface.OnClickListener) {\n            val activity = requireActivity()\n            @SuppressLint(\"InflateParams\")\n            val view = activity.layoutInflater.inflate(R.layout.dialog_acl_rule, null)\n            templateSelector = view.findViewById(R.id.template_selector)\n            editText = view.findViewById(R.id.content)\n            inputLayout = view.findViewById(R.id.content_layout)\n            templateSelector.setSelection(Template.Generic.ordinal)\n            val arg = arg.item\n            editText.setText(arg?.item)\n            when {\n                arg == null -> { }\n                arg.isUrl -> templateSelector.setSelection(Template.Url.ordinal)\n                Subnet.fromString(arg.item) == null -> {\n                    val match = domainPattern.find(arg.item)\n                    if (match != null) {\n                        templateSelector.setSelection(Template.Domain.ordinal)\n                        editText.setText(IDN.toUnicode(match.value.replace(\"\\\\.\", \".\"),\n                                IDN.ALLOW_UNASSIGNED or IDN.USE_STD3_ASCII_RULES))\n                    }\n                }\n            }\n            templateSelector.onItemSelectedListener = this@AclRuleDialogFragment\n            editText.addTextChangedListener(this@AclRuleDialogFragment)\n            setTitle(R.string.edit_rule)\n            setPositiveButton(android.R.string.ok, listener)\n            setNegativeButton(android.R.string.cancel, null)\n            if (!arg?.item.isNullOrEmpty()) setNeutralButton(R.string.delete, listener)\n            setView(view)\n        }\n\n        override fun onStart() {\n            super.onStart()\n            validate()\n        }\n\n        override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) { }\n        override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) { }\n        override fun afterTextChanged(s: Editable) = validate(value = s)\n        override fun onNothingSelected(parent: AdapterView<*>?) = check(false)\n        override fun onItemSelected(parent: AdapterView<*>?, view: View?, position: Int, id: Long) = validate(position)\n\n        private fun validate(template: Int = templateSelector.selectedItemPosition, value: Editable = editText.text) {\n            var message = \"\"\n            positive.isEnabled = when (Template.entries[template]) {\n                Template.Generic -> value.toString().run {\n                    try {\n                        if (Subnet.fromString(this) == null) toPattern()\n                        true\n                    } catch (e: PatternSyntaxException) {\n                        message = e.readableMessage\n                        false\n                    }\n                }\n                Template.Domain -> try {\n                    IDN.toASCII(value.toString(), IDN.ALLOW_UNASSIGNED or IDN.USE_STD3_ASCII_RULES)\n                    true\n                } catch (e: IllegalArgumentException) {\n                    message = e.cause?.readableMessage ?: e.readableMessage\n                    false\n                }\n                Template.Url -> try {\n                    val url = URL(value.toString())\n                    if (\"http\".equals(url.protocol, true)) message = getString(R.string.cleartext_http_warning)\n                    true\n                } catch (e: MalformedURLException) {\n                    message = e.readableMessage\n                    false\n                }\n            }\n            inputLayout.error = message\n        }\n\n        override fun ret(which: Int) = when (which) {\n            DialogInterface.BUTTON_POSITIVE -> {\n                AclEditResult(editText.text.toString().let { text ->\n                    when (Template.entries[templateSelector.selectedItemPosition]) {\n                        Template.Generic -> AclItem(text)\n                        Template.Domain -> AclItem(IDN.toASCII(text, IDN.ALLOW_UNASSIGNED or IDN.USE_STD3_ASCII_RULES)\n                                .replace(\".\", \"\\\\.\").let { \"(?:^|\\\\.)$it\\$\" })\n                        Template.Url -> AclItem(text, true)\n                    }\n                }, arg.item)\n            }\n            DialogInterface.BUTTON_NEUTRAL -> AclEditResult(null, arg.item)\n            else -> null\n        }\n\n        override fun onClick(dialog: DialogInterface?, which: Int) {\n            if (which != DialogInterface.BUTTON_NEGATIVE) super.onClick(dialog, which)\n        }\n    }\n\n    private inner class AclRuleViewHolder(view: View) : RecyclerView.ViewHolder(view),\n            View.OnClickListener, View.OnLongClickListener {\n        lateinit var item: Any\n        private val text = view.findViewById<TextView>(android.R.id.text1)\n\n        init {\n            view.isFocusable = true\n            view.setOnClickListener(this)\n            view.setOnLongClickListener(this)\n            view.setBackgroundResource(R.drawable.background_selectable)\n        }\n\n        fun bind(hostname: String) {\n            item = hostname\n            text.text = hostname\n            itemView.isSelected = selectedItems.contains(hostname)\n        }\n        fun bind(subnet: Subnet) {\n            item = subnet\n            text.text = subnet.toString()\n            itemView.isSelected = selectedItems.contains(subnet)\n        }\n        fun bind(url: URL) {\n            item = url\n            text.text = url.toString()\n            itemView.isSelected = selectedItems.contains(url)\n        }\n\n        override fun onClick(v: View?) {\n            if (selectedItems.isNotEmpty()) onLongClick(v) else AclRuleDialogFragment().apply {\n                arg(AclArg(AclItem(item)))\n                key()\n            }.show(parentFragmentManager, null)\n        }\n        override fun onLongClick(v: View?): Boolean {\n            if (!selectedItems.add(item)) selectedItems.remove(item)    // toggle\n            onSelectedItemsUpdated()\n            itemView.isSelected = !itemView.isSelected\n            return true\n        }\n    }\n\n    private inner class AclRulesAdapter : RecyclerView.Adapter<AclRuleViewHolder>() {\n        private val acl = Acl.customRules\n        private var savePending = false\n\n        override fun onBindViewHolder(holder: AclRuleViewHolder, i: Int) {\n            val j = i - acl.subnets.size()\n            if (j < 0) holder.bind(acl.subnets[i]) else {\n                val k = j - acl.proxyHostnames.size()\n                if (k < 0) holder.bind(acl.proxyHostnames[j]) else holder.bind(acl.urls[k])\n            }\n        }\n        override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = AclRuleViewHolder(LayoutInflater\n                .from(parent.context).inflate(android.R.layout.simple_list_item_1, parent, false))\n        override fun getItemCount(): Int = acl.subnets.size() + acl.proxyHostnames.size() + acl.urls.size()\n\n        private fun apply() {\n            if (!savePending) {\n                savePending = true\n                list.post {\n                    Acl.customRules = acl\n                    savePending = false\n                }\n            }\n        }\n\n        fun add(item: Any): Int? = when (item) {\n            is Subnet -> addSubnet(item)\n            is String -> addHostname(item)\n            is URL -> addURL(item)\n            else -> null\n        }\n        fun addSubnet(subnet: Subnet): Int {\n            val old = acl.subnets.size()\n            val index = acl.subnets.add(subnet)\n            if (old != acl.subnets.size()) {\n                notifyItemInserted(index)\n                apply()\n            }\n            return index\n        }\n        fun addHostname(hostname: String): Int {\n            val old = acl.proxyHostnames.size()\n            val index = acl.subnets.size() + acl.proxyHostnames.add(hostname)\n            if (old != acl.proxyHostnames.size()) {\n                notifyItemInserted(index)\n                apply()\n            }\n            return index\n        }\n        fun addURL(url: URL): Int {\n            val old = acl.urls.size()\n            val index = acl.subnets.size() + acl.proxyHostnames.size() + acl.urls.add(url)\n            if (old != acl.urls.size()) {\n                notifyItemInserted(index)\n                apply()\n            }\n            return index\n        }\n        fun addToProxy(input: String): Int? {\n            val acl = Acl().fromReader(input.reader(), true)\n            var result: Int? = null\n            if (acl.bypass) acl.subnets.asIterable().asSequence().map { addSubnet(it) }\n                    .forEach { if (result == null) result = it }\n            (acl.proxyHostnames.asIterable().asSequence().map { addHostname(it) } +\n                    acl.urls.asIterable().asSequence().map { addURL(it) })\n                    .forEach { if (result == null) result = it }\n            return result\n        }\n\n        fun remove(i: Int) {\n            val j = i - acl.subnets.size()\n            if (j < 0) {\n                undoManager.remove(Pair(i, acl.subnets[i]))\n                acl.subnets.removeItemAt(i)\n            } else {\n                val k = j - acl.proxyHostnames.size()\n                if (k < 0) {\n                    undoManager.remove(Pair(j, acl.proxyHostnames[j]))\n                    acl.proxyHostnames.removeItemAt(j)\n                } else {\n                    undoManager.remove(Pair(k, acl.urls[k]))\n                    acl.urls.removeItemAt(k)\n                }\n            }\n            notifyItemRemoved(i)\n            apply()\n        }\n        fun remove(item: Any) {\n            when (item) {\n                is Subnet -> {\n                    notifyItemRemoved(acl.subnets.indexOf(item))\n                    acl.subnets.remove(item)\n                    apply()\n                }\n                is String -> {\n                    notifyItemRemoved(acl.subnets.size() + acl.proxyHostnames.indexOf(item))\n                    acl.proxyHostnames.remove(item)\n                    apply()\n                }\n                is URL -> {\n                    notifyItemRemoved(acl.subnets.size() + acl.proxyHostnames.size() + acl.urls.indexOf(item))\n                    acl.urls.remove(item)\n                    apply()\n                }\n            }\n        }\n        fun removeSelected() {\n            undoManager.remove(selectedItems.map { Pair(0, it) })\n            selectedItems.forEach { remove(it) }\n            selectedItems.clear()\n            onSelectedItemsUpdated()\n        }\n        fun undo(actions: List<Pair<Int, Any>>) {\n            for ((_, item) in actions) add(item)\n        }\n\n        fun selectAll() {\n            selectedItems.clear()\n            selectedItems.addAll(acl.subnets.asIterable())\n            selectedItems.addAll(acl.proxyHostnames.asIterable())\n            selectedItems.addAll(acl.urls.asIterable())\n            onSelectedItemsUpdated()\n            notifyDataSetChanged()\n        }\n    }\n\n    private val isEnabled get() = (activity as? MainActivity)?.state == BaseService.State.Stopped ||\n            Core.currentProfile?.main?.route != Acl.CUSTOM_RULES\n\n    private val selectedItems = HashSet<Any>()\n    private val adapter by lazy { AclRulesAdapter() }\n    private lateinit var list: RecyclerView\n    private var mode: ActionMode? = null\n    private lateinit var undoManager: UndoSnackbarManager<Any>\n\n    private fun onSelectedItemsUpdated() {\n        if (selectedItems.isEmpty()) mode?.finish() else if (mode == null) {\n            mode = toolbar.startActionMode(this)\n            backHandler.isEnabled = true\n        }\n    }\n\n    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? =\n            inflater.inflate(R.layout.layout_custom_rules, container, false)\n\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        super.onViewCreated(view, savedInstanceState)\n        ViewCompat.setOnApplyWindowInsetsListener(view, ListHolderListener)\n        AlertDialogFragment.setResultListener<AclRuleDialogFragment, AclEditResult>(this) { which, ret ->\n            val (edited, replacing) = ret ?: return@setResultListener\n            replacing?.toAny()?.let { item ->\n                adapter.remove(item)\n                if (which == DialogInterface.BUTTON_NEUTRAL) undoManager.remove(Pair(-1, item))\n            }\n            if (edited != null) adapter.add(edited.toAny())?.also { list.post { list.scrollToPosition(it) } }\n        }\n        if (savedInstanceState != null) {\n            selectedItems.addAll(savedInstanceState.getStringArray(SELECTED_SUBNETS)\n                    ?.mapNotNull { Subnet.fromString(it) } ?: listOf())\n            selectedItems.addAll(savedInstanceState.getStringArray(SELECTED_HOSTNAMES)\n                    ?: arrayOf())\n            selectedItems.addAll(savedInstanceState.getStringArray(SELECTED_URLS)?.map { URL(it) }\n                    ?: listOf())\n            onSelectedItemsUpdated()\n        }\n        toolbar.setTitle(R.string.custom_rules)\n        toolbar.inflateMenu(R.menu.custom_rules_menu)\n        toolbar.setOnMenuItemClickListener(this)\n        val activity = activity as MainActivity\n        list = view.findViewById(R.id.list)\n        ViewCompat.setOnApplyWindowInsetsListener(list, MainListListener)\n        list.layoutManager = LinearLayoutManager(activity, RecyclerView.VERTICAL, false)\n        list.itemAnimator = DefaultItemAnimator()\n        list.adapter = adapter\n        FastScrollerBuilder(list).useMd2Style().build()\n        undoManager = UndoSnackbarManager(activity, adapter::undo)\n        ItemTouchHelper(object : ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.START) {\n            override fun getSwipeDirs(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder): Int =\n                    if (isEnabled && selectedItems.isEmpty()) super.getSwipeDirs(recyclerView, viewHolder) else 0\n            override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) =\n                    adapter.remove(viewHolder.bindingAdapterPosition)\n            override fun onMove(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder,\n                                target: RecyclerView.ViewHolder): Boolean = false\n        }).attachToRecyclerView(list)\n    }\n\n    private val backHandler = object : OnBackPressedCallback(false) {\n        override fun handleOnBackPressed() {\n            mode?.finish()\n        }\n    }\n\n    override fun onAttach(context: Context) {\n        super.onAttach(context)\n        requireActivity().onBackPressedDispatcher.addCallback(backHandler)\n    }\n\n    override fun onSaveInstanceState(outState: Bundle) {\n        super.onSaveInstanceState(outState)\n        outState.putStringArray(SELECTED_SUBNETS, selectedItems.filterIsInstance<Subnet>().map(Subnet::toString)\n                .toTypedArray())\n        outState.putStringArray(SELECTED_HOSTNAMES, selectedItems.filterIsInstance<String>().toTypedArray())\n        outState.putStringArray(SELECTED_URLS, selectedItems.filterIsInstance<URL>().map(URL::toString).toTypedArray())\n    }\n\n    private fun copySelected() {\n        val acl = Acl()\n        acl.bypass = true\n        selectedItems.forEach {\n            when (it) {\n                is Subnet -> acl.subnets.add(it)\n                is String -> acl.proxyHostnames.add(it)\n                is URL -> acl.urls.add(it)\n            }\n        }\n        val success = Core.trySetPrimaryClip(acl.toString())\n        (activity as MainActivity).snackbar().setText(\n                if (success) R.string.action_export_msg else R.string.action_export_err).show()\n    }\n\n    override fun onMenuItemClick(item: MenuItem): Boolean = when (item.itemId) {\n        R.id.action_manual_settings -> {\n            AclRuleDialogFragment().apply {\n                arg(AclArg(AclItem()))\n                key()\n            }.show(parentFragmentManager, null)\n            true\n        }\n        R.id.action_import_clipboard -> {\n            try {\n                check(adapter.addToProxy(Core.clipboard.primaryClip!!.getItemAt(0).text.toString()) != null)\n            } catch (exc: Exception) {\n                (activity as MainActivity).snackbar().setText(R.string.action_import_err).show()\n                Timber.d(exc)\n            }\n            true\n        }\n        R.id.action_import_gfwlist -> {\n            val acl = Acl().fromId(Acl.GFWLIST)\n            if (acl.bypass) acl.subnets.asIterable().forEach { adapter.addSubnet(it) }\n            acl.proxyHostnames.asIterable().forEach { adapter.addHostname(it) }\n            acl.urls.asIterable().forEach { adapter.addURL(it) }\n            true\n        }\n        else -> false\n    }\n\n    override fun onDetach() {\n        backHandler.remove()\n        undoManager.flush()\n        mode?.finish()\n        super.onDetach()\n    }\n\n    override fun onCreateActionMode(mode: ActionMode, menu: Menu): Boolean {\n        val activity = requireActivity()\n        activity.window.statusBarColor = ContextCompat.getColor(activity, android.R.color.black)\n        activity.menuInflater.inflate(R.menu.custom_rules_selection, menu)\n        toolbar.touchscreenBlocksFocus = true\n        return true\n    }\n    override fun onPrepareActionMode(mode: ActionMode, menu: Menu): Boolean = false\n    override fun onActionItemClicked(mode: ActionMode, item: MenuItem): Boolean = when (item.itemId) {\n        R.id.action_select_all -> {\n            adapter.selectAll()\n            true\n        }\n        R.id.action_cut -> {\n            copySelected()\n            adapter.removeSelected()\n            true\n        }\n        R.id.action_copy -> {\n            copySelected()\n            true\n        }\n        R.id.action_delete -> {\n            adapter.removeSelected()\n            true\n        }\n        else -> false\n    }\n    override fun onDestroyActionMode(mode: ActionMode) {\n        val activity = requireActivity()\n        activity.window.statusBarColor = ContextCompat.getColor(activity,\n                activity.theme.resolveResourceId(android.R.attr.statusBarColor))\n        toolbar.touchscreenBlocksFocus = false\n        selectedItems.clear()\n        onSelectedItemsUpdated()\n        adapter.notifyDataSetChanged()\n        backHandler.isEnabled = false\n        this.mode = null\n    }\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/github/shadowsocks/bg/TileService.kt",
    "content": "/*******************************************************************************\n *                                                                             *\n *  Copyright (C) 2017 by Max Lv <max.c.lv@gmail.com>                          *\n *  Copyright (C) 2017 by Mygod Studio <contact-shadowsocks-android@mygod.be>  *\n *                                                                             *\n *  This program is free software: you can redistribute it and/or modify       *\n *  it under the terms of the GNU General Public License as published by       *\n *  the Free Software Foundation, either version 3 of the License, or          *\n *  (at your option) any later version.                                        *\n *                                                                             *\n *  This program is distributed in the hope that it will be useful,            *\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of             *\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the              *\n *  GNU General Public License for more details.                               *\n *                                                                             *\n *  You should have received a copy of the GNU General Public License          *\n *  along with this program. If not, see <http://www.gnu.org/licenses/>.       *\n *                                                                             *\n *******************************************************************************/\n\npackage com.github.shadowsocks.bg\n\nimport android.app.KeyguardManager\nimport android.graphics.drawable.Icon\nimport android.service.quicksettings.Tile\nimport androidx.annotation.RequiresApi\nimport androidx.core.content.getSystemService\nimport com.github.shadowsocks.Core\nimport com.github.shadowsocks.R\nimport com.github.shadowsocks.aidl.IShadowsocksService\nimport com.github.shadowsocks.aidl.ShadowsocksConnection\nimport com.github.shadowsocks.preference.DataStore\nimport android.service.quicksettings.TileService as BaseTileService\n\n@RequiresApi(24)\nclass TileService : BaseTileService(), ShadowsocksConnection.Callback {\n    private val iconIdle by lazy { Icon.createWithResource(this, R.drawable.ic_service_idle) }\n    private val iconBusy by lazy { Icon.createWithResource(this, R.drawable.ic_service_busy) }\n    private val iconConnected by lazy { Icon.createWithResource(this, R.drawable.ic_service_active) }\n    private val keyguard by lazy { getSystemService<KeyguardManager>()!! }\n    private var tapPending = false\n\n    private val connection = ShadowsocksConnection()\n    override fun stateChanged(state: BaseService.State, profileName: String?, msg: String?) =\n            updateTile(state) { profileName }\n    override fun onServiceConnected(service: IShadowsocksService) {\n        updateTile(BaseService.State.entries[service.state]) { service.profileName }\n        if (tapPending) {\n            tapPending = false\n            toggle()\n        }\n    }\n\n    override fun onStartListening() {\n        super.onStartListening()\n        connection.connect(this, this)\n    }\n    override fun onStopListening() {\n        connection.disconnect(this)\n        super.onStopListening()\n    }\n\n    override fun onClick() {\n        if (isLocked && !DataStore.canToggleLocked) unlockAndRun(this::toggle) else toggle()\n    }\n\n    private fun updateTile(serviceState: BaseService.State, profileName: () -> String?) {\n        qsTile?.apply {\n            label = null\n            when (serviceState) {\n                BaseService.State.Idle -> error(\"serviceState\")\n                BaseService.State.Connecting -> {\n                    icon = iconBusy\n                    state = Tile.STATE_ACTIVE\n                }\n                BaseService.State.Connected -> {\n                    icon = iconConnected\n                    if (!keyguard.isDeviceLocked) label = profileName()\n                    state = Tile.STATE_ACTIVE\n                }\n                BaseService.State.Stopping -> {\n                    icon = iconBusy\n                    state = Tile.STATE_UNAVAILABLE\n                }\n                BaseService.State.Stopped -> {\n                    icon = iconIdle\n                    state = Tile.STATE_INACTIVE\n                }\n            }\n            label = label ?: getString(R.string.app_name)\n            updateTile()\n        }\n    }\n\n    private fun toggle() {\n        val service = connection.service\n        if (service == null) tapPending = true else BaseService.State.entries[service.state].let { state ->\n            when {\n                state.canStop -> Core.stopService()\n                state == BaseService.State.Stopped -> Core.startService()\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/github/shadowsocks/preference/PluginConfigurationDialogFragment.kt",
    "content": "/*******************************************************************************\n *                                                                             *\n *  Copyright (C) 2017 by Max Lv <max.c.lv@gmail.com>                          *\n *  Copyright (C) 2017 by Mygod Studio <contact-shadowsocks-android@mygod.be>  *\n *                                                                             *\n *  This program is free software: you can redistribute it and/or modify       *\n *  it under the terms of the GNU General Public License as published by       *\n *  the Free Software Foundation, either version 3 of the License, or          *\n *  (at your option) any later version.                                        *\n *                                                                             *\n *  This program is distributed in the hope that it will be useful,            *\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of             *\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the              *\n *  GNU General Public License for more details.                               *\n *                                                                             *\n *  You should have received a copy of the GNU General Public License          *\n *  along with this program. If not, see <http://www.gnu.org/licenses/>.       *\n *                                                                             *\n *******************************************************************************/\n\npackage com.github.shadowsocks.preference\n\nimport android.view.View\nimport android.widget.EditText\nimport androidx.appcompat.app.AlertDialog\nimport androidx.core.os.bundleOf\nimport androidx.preference.EditTextPreferenceDialogFragmentCompat\nimport androidx.preference.PreferenceDialogFragmentCompat\nimport com.github.shadowsocks.ProfileConfigActivity\nimport com.github.shadowsocks.plugin.PluginContract\nimport com.github.shadowsocks.plugin.PluginManager\n\nclass PluginConfigurationDialogFragment : EditTextPreferenceDialogFragmentCompat() {\n    companion object {\n        private const val PLUGIN_ID_FRAGMENT_TAG =\n                \"com.github.shadowsocks.preference.PluginConfigurationDialogFragment.PLUGIN_ID\"\n    }\n\n    fun setArg(key: String, plugin: String) {\n        arguments = bundleOf(PreferenceDialogFragmentCompat.ARG_KEY to key, PLUGIN_ID_FRAGMENT_TAG to plugin)\n    }\n\n    private lateinit var editText: EditText\n\n    override fun onPrepareDialogBuilder(builder: AlertDialog.Builder) {\n        super.onPrepareDialogBuilder(builder)\n        val intent = PluginManager.buildIntent(arguments?.getString(PLUGIN_ID_FRAGMENT_TAG)!!,\n                PluginContract.ACTION_HELP)\n        val activity = activity as ProfileConfigActivity\n        if (intent.resolveActivity(activity.packageManager) != null) builder.setNeutralButton(\"?\") { _, _ ->\n            activity.pluginHelp.launch(intent.putExtra(PluginContract.EXTRA_OPTIONS, editText.text.toString()))\n        }\n    }\n\n    override fun onBindDialogView(view: View) {\n        super.onBindDialogView(view)\n        editText = view.findViewById(android.R.id.edit)\n    }\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/github/shadowsocks/preference/PluginPreference.kt",
    "content": "/*******************************************************************************\n *                                                                             *\n *  Copyright (C) 2017 by Max Lv <max.c.lv@gmail.com>                          *\n *  Copyright (C) 2017 by Mygod Studio <contact-shadowsocks-android@mygod.be>  *\n *                                                                             *\n *  This program is free software: you can redistribute it and/or modify       *\n *  it under the terms of the GNU General Public License as published by       *\n *  the Free Software Foundation, either version 3 of the License, or          *\n *  (at your option) any later version.                                        *\n *                                                                             *\n *  This program is distributed in the hope that it will be useful,            *\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of             *\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the              *\n *  GNU General Public License for more details.                               *\n *                                                                             *\n *  You should have received a copy of the GNU General Public License          *\n *  along with this program. If not, see <http://www.gnu.org/licenses/>.       *\n *                                                                             *\n *******************************************************************************/\n\npackage com.github.shadowsocks.preference\n\nimport android.content.Context\nimport android.graphics.drawable.Drawable\nimport android.util.AttributeSet\nimport androidx.preference.ListPreference\nimport com.github.shadowsocks.R\nimport com.github.shadowsocks.plugin.PluginList\nimport com.github.shadowsocks.plugin.PluginManager\n\nclass PluginPreference(context: Context, attrs: AttributeSet? = null) : ListPreference(context, attrs) {\n    companion object FallbackProvider : SummaryProvider<PluginPreference> {\n        override fun provideSummary(preference: PluginPreference) =\n                preference.selectedEntry?.label ?: preference.unknownValueSummary.format(preference.value)\n    }\n\n    lateinit var plugins: PluginList\n    val selectedEntry get() = plugins.lookup[value]\n    private val entryIcon: Drawable? get() = selectedEntry?.icon\n    private val unknownValueSummary = context.getString(R.string.plugin_unknown)\n\n    private var listener: OnPreferenceChangeListener? = null\n    override fun getOnPreferenceChangeListener(): OnPreferenceChangeListener? = listener\n    override fun setOnPreferenceChangeListener(listener: OnPreferenceChangeListener?) {\n        this.listener = listener\n    }\n\n    init {\n        super.setOnPreferenceChangeListener { preference, newValue ->\n            val listener = listener\n            if (listener == null || listener.onPreferenceChange(preference, newValue)) {\n                value = newValue.toString()\n                icon = entryIcon\n                true\n            } else false\n        }\n    }\n\n    fun init() {\n        plugins = PluginManager.fetchPlugins()\n        entryValues = plugins.lookup.map { it.key }.toTypedArray()\n        icon = entryIcon\n        summaryProvider = FallbackProvider\n    }\n    override fun onSetInitialValue(defaultValue: Any?) {\n        super.onSetInitialValue(defaultValue)\n        init()\n    }\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/github/shadowsocks/preference/PluginPreferenceDialogFragment.kt",
    "content": "/*******************************************************************************\n *                                                                             *\n *  Copyright (C) 2017 by Max Lv <max.c.lv@gmail.com>                          *\n *  Copyright (C) 2017 by Mygod Studio <contact-shadowsocks-android@mygod.be>  *\n *                                                                             *\n *  This program is free software: you can redistribute it and/or modify       *\n *  it under the terms of the GNU General Public License as published by       *\n *  the Free Software Foundation, either version 3 of the License, or          *\n *  (at your option) any later version.                                        *\n *                                                                             *\n *  This program is distributed in the hope that it will be useful,            *\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of             *\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the              *\n *  GNU General Public License for more details.                               *\n *                                                                             *\n *  You should have received a copy of the GNU General Public License          *\n *  along with this program. If not, see <http://www.gnu.org/licenses/>.       *\n *                                                                             *\n *******************************************************************************/\n\npackage com.github.shadowsocks.preference\n\nimport android.app.Dialog\nimport android.content.ActivityNotFoundException\nimport android.content.Intent\nimport android.graphics.Typeface\nimport android.net.Uri\nimport android.os.Bundle\nimport android.provider.Settings\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport android.widget.ImageView\nimport android.widget.TextView\nimport androidx.appcompat.widget.TooltipCompat\nimport androidx.core.os.bundleOf\nimport androidx.core.view.isGone\nimport androidx.core.view.isVisible\nimport androidx.fragment.app.setFragmentResult\nimport androidx.preference.PreferenceDialogFragmentCompat\nimport androidx.recyclerview.widget.DefaultItemAnimator\nimport androidx.recyclerview.widget.LinearLayoutManager\nimport androidx.recyclerview.widget.RecyclerView\nimport com.github.shadowsocks.R\nimport com.github.shadowsocks.plugin.Plugin\nimport com.google.android.material.bottomsheet.BottomSheetDialog\n\nclass PluginPreferenceDialogFragment : PreferenceDialogFragmentCompat() {\n    companion object {\n        const val KEY_SELECTED_ID = \"id\"\n    }\n\n    private inner class IconListViewHolder(val dialog: BottomSheetDialog, view: View) : RecyclerView.ViewHolder(view),\n            View.OnClickListener, View.OnLongClickListener {\n        private lateinit var plugin: Plugin\n        private val text1 = view.findViewById<TextView>(android.R.id.text1)\n        private val text2 = view.findViewById<TextView>(android.R.id.text2)\n        private val icon = view.findViewById<ImageView>(android.R.id.icon)\n        private val unlock = view.findViewById<View>(R.id.unlock).apply {\n            TooltipCompat.setTooltipText(this, getText(R.string.plugin_auto_connect_unlock_only))\n        }\n\n        init {\n            view.setOnClickListener(this)\n            view.setOnLongClickListener(this)\n        }\n\n        fun bind(plugin: Plugin, selected: Boolean = false) {\n            this.plugin = plugin\n            val label = plugin.label\n            text1.text = label\n            text2.text = plugin.id\n            val typeface = if (selected) Typeface.BOLD else Typeface.NORMAL\n            text1.setTypeface(null, typeface)\n            text2.setTypeface(null, typeface)\n            text2.isVisible = plugin.id.isNotEmpty() && label != plugin.id\n            icon.setImageDrawable(plugin.icon)\n            unlock.isGone = plugin.directBootAware || !DataStore.persistAcrossReboot\n        }\n\n        override fun onClick(v: View?) {\n            clicked = plugin\n            dialog.dismiss()\n        }\n\n        override fun onLongClick(v: View?) = try {\n            startActivity(Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS, Uri.Builder()\n                    .scheme(\"package\")\n                    .opaquePart(plugin.packageName)\n                    .build()))\n            true\n        } catch (_: ActivityNotFoundException) {\n            false\n        }\n    }\n    private inner class IconListAdapter(private val dialog: BottomSheetDialog) :\n            RecyclerView.Adapter<IconListViewHolder>() {\n        override fun getItemCount(): Int = preference.plugins.size\n        override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = IconListViewHolder(dialog,\n                LayoutInflater.from(parent.context).inflate(R.layout.icon_list_item_2, parent, false))\n        override fun onBindViewHolder(holder: IconListViewHolder, position: Int) {\n            if (selected < 0) holder.bind(preference.plugins[position]) else when (position) {\n                0 -> holder.bind(preference.selectedEntry!!, true)\n                in selected + 1..Int.MAX_VALUE -> holder.bind(preference.plugins[position])\n                else -> holder.bind(preference.plugins[position - 1])\n            }\n        }\n    }\n\n    fun setArg(key: String) {\n        arguments = bundleOf(ARG_KEY to key)\n    }\n\n    private val preference by lazy { getPreference() as PluginPreference }\n    private val selected by lazy { preference.plugins.indexOf(preference.selectedEntry) }\n    private var clicked: Plugin? = null\n\n    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {\n        val activity = requireActivity()\n        val dialog = BottomSheetDialog(activity, theme)\n        val recycler = RecyclerView(activity)\n        val padding = resources.getDimensionPixelOffset(R.dimen.bottom_sheet_padding)\n        recycler.setPadding(0, padding, 0, padding)\n        recycler.setHasFixedSize(true)\n        recycler.layoutManager = LinearLayoutManager(activity)\n        recycler.itemAnimator = DefaultItemAnimator()\n        recycler.adapter = IconListAdapter(dialog)\n        recycler.layoutParams = ViewGroup.LayoutParams(\n                ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)\n        dialog.setContentView(recycler)\n        return dialog\n    }\n\n    override fun onDialogClosed(positiveResult: Boolean) {\n        val clicked = clicked\n        if (clicked != null && clicked != preference.selectedEntry) {\n            setFragmentResult(javaClass.name, bundleOf(KEY_SELECTED_ID to clicked.id))\n        }\n    }\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/github/shadowsocks/subscription/SubscriptionFragment.kt",
    "content": "/*******************************************************************************\n *                                                                             *\n *  Copyright (C) 2020 by Max Lv <max.c.lv@gmail.com>                          *\n *  Copyright (C) 2020 by Mygod Studio <contact-shadowsocks-android@mygod.be>  *\n *                                                                             *\n *  This program is free software: you can redistribute it and/or modify       *\n *  it under the terms of the GNU General Public License as published by       *\n *  the Free Software Foundation, either version 3 of the License, or          *\n *  (at your option) any later version.                                        *\n *                                                                             *\n *  This program is distributed in the hope that it will be useful,            *\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of             *\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the              *\n *  GNU General Public License for more details.                               *\n *                                                                             *\n *  You should have received a copy of the GNU General Public License          *\n *  along with this program. If not, see <http://www.gnu.org/licenses/>.       *\n *                                                                             *\n *******************************************************************************/\n\npackage com.github.shadowsocks.subscription\n\nimport android.annotation.SuppressLint\nimport android.content.DialogInterface\nimport android.content.Intent\nimport android.os.Bundle\nimport android.os.Parcelable\nimport android.text.Editable\nimport android.text.TextWatcher\nimport android.view.LayoutInflater\nimport android.view.MenuItem\nimport android.view.View\nimport android.view.ViewGroup\nimport android.widget.AdapterView\nimport android.widget.EditText\nimport android.widget.TextView\nimport androidx.appcompat.app.AlertDialog\nimport androidx.appcompat.widget.Toolbar\nimport androidx.core.view.ViewCompat\nimport androidx.recyclerview.widget.DefaultItemAnimator\nimport androidx.recyclerview.widget.ItemTouchHelper\nimport androidx.recyclerview.widget.LinearLayoutManager\nimport androidx.recyclerview.widget.RecyclerView\nimport com.github.shadowsocks.MainActivity\nimport com.github.shadowsocks.R\nimport com.github.shadowsocks.ToolbarFragment\nimport com.github.shadowsocks.plugin.fragment.AlertDialogFragment\nimport com.github.shadowsocks.utils.readableMessage\nimport com.github.shadowsocks.widget.ListHolderListener\nimport com.github.shadowsocks.widget.MainListListener\nimport com.github.shadowsocks.widget.UndoSnackbarManager\nimport com.google.android.material.textfield.TextInputLayout\nimport kotlinx.parcelize.Parcelize\nimport me.zhanghai.android.fastscroll.FastScrollerBuilder\nimport java.net.MalformedURLException\nimport java.net.URL\n\nclass SubscriptionFragment : ToolbarFragment(), Toolbar.OnMenuItemClickListener {\n    @Parcelize\n    data class SubItem(val item: String? = null) : Parcelable\n\n    @Parcelize\n    data class SubEditResult(val edited: String?, val replacing: String?) : Parcelable\n\n    class SubDialogFragment : AlertDialogFragment<SubItem, SubEditResult>(),\n            TextWatcher, AdapterView.OnItemSelectedListener {\n        private lateinit var editText: EditText\n        private lateinit var inputLayout: TextInputLayout\n        private val positive by lazy { (dialog as AlertDialog).getButton(AlertDialog.BUTTON_POSITIVE) }\n\n        override fun AlertDialog.Builder.prepare(listener: DialogInterface.OnClickListener) {\n            val activity = requireActivity()\n            @SuppressLint(\"InflateParams\")\n            val view = activity.layoutInflater.inflate(R.layout.dialog_subscription, null)\n            editText = view.findViewById(R.id.content)\n            inputLayout = view.findViewById(R.id.content_layout)\n            editText.setText(arg.item)\n            editText.addTextChangedListener(this@SubDialogFragment)\n            setTitle(R.string.edit_subscription)\n            setPositiveButton(android.R.string.ok, listener)\n            setNegativeButton(android.R.string.cancel, null)\n            if (!arg.item.isNullOrEmpty()) setNeutralButton(R.string.delete, listener)\n            setView(view)\n        }\n\n        override fun onStart() {\n            super.onStart()\n            validate()\n        }\n\n        override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {}\n        override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {}\n        override fun afterTextChanged(s: Editable) = validate(value = s)\n        override fun onNothingSelected(parent: AdapterView<*>?) = check(false)\n        override fun onItemSelected(parent: AdapterView<*>?, view: View?, position: Int, id: Long) = validate()\n\n        private fun validate(value: Editable = editText.text) {\n            var message = \"\"\n            positive.isEnabled = try {\n                val url = URL(value.toString())\n                if (\"http\".equals(url.protocol, true)) message = getString(R.string.cleartext_http_warning)\n                true\n            } catch (e: MalformedURLException) {\n                message = e.readableMessage\n                false\n            }\n            inputLayout.error = message\n        }\n\n        override fun ret(which: Int) = when (which) {\n            DialogInterface.BUTTON_POSITIVE -> SubEditResult(editText.text.toString(), arg.item)\n            DialogInterface.BUTTON_NEUTRAL -> SubEditResult(null, arg.item)\n            else -> null\n        }\n\n        override fun onClick(dialog: DialogInterface?, which: Int) {\n            if (which != DialogInterface.BUTTON_NEGATIVE) super.onClick(dialog, which)\n        }\n    }\n\n    private inner class SubViewHolder(view: View) : RecyclerView.ViewHolder(view), View.OnClickListener {\n        lateinit var item: URL\n        private val text = view.findViewById<TextView>(android.R.id.text1)\n\n        init {\n            view.isFocusable = true\n            view.setOnClickListener(this)\n            view.setBackgroundResource(R.drawable.background_selectable)\n        }\n\n        fun bind(url: URL) {\n            item = url\n            text.text = url.toString()\n        }\n\n        override fun onClick(v: View?) {\n            SubDialogFragment().apply {\n                arg(SubItem(item.toString()))\n                key()\n            }.show(parentFragmentManager, null)\n        }\n    }\n\n    private inner class SubscriptionAdapter : RecyclerView.Adapter<SubViewHolder>() {\n        private val subscription = Subscription.instance\n        private var savePending = false\n\n        override fun onBindViewHolder(holder: SubViewHolder, i: Int) {\n            holder.bind(subscription.urls[i])\n        }\n\n        override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = SubViewHolder(LayoutInflater\n                .from(parent.context).inflate(android.R.layout.simple_list_item_1, parent, false))\n\n        override fun getItemCount(): Int = subscription.urls.size()\n\n        private fun apply() {\n            if (!savePending) {\n                savePending = true\n                list.post {\n                    Subscription.instance = subscription\n                    savePending = false\n                }\n            }\n        }\n\n        fun add(url: URL): Int {\n            val old = subscription.urls.size()\n            val index = subscription.urls.add(url)\n            if (old != subscription.urls.size()) {\n                notifyItemInserted(index)\n                apply()\n            }\n            return index\n        }\n\n        fun remove(i: Int) {\n            undoManager.remove(Pair(i, subscription.urls[i]))\n            subscription.urls.removeItemAt(i)\n            notifyItemRemoved(i)\n            apply()\n        }\n\n        fun remove(item: URL) {\n            notifyItemRemoved(subscription.urls.indexOf(item))\n            subscription.urls.remove(item)\n            apply()\n        }\n\n        fun undo(actions: List<Pair<Int, Any>>) {\n            for ((_, item) in actions)\n                when (item) {\n                    is URL -> {\n                        add(item)\n                    }\n                }\n        }\n    }\n\n    private val adapter by lazy { SubscriptionAdapter() }\n    private lateinit var list: RecyclerView\n    private lateinit var undoManager: UndoSnackbarManager<URL>\n\n    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? =\n            inflater.inflate(R.layout.layout_subscriptions, container, false)\n\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        super.onViewCreated(view, savedInstanceState)\n        ViewCompat.setOnApplyWindowInsetsListener(view, ListHolderListener)\n        AlertDialogFragment.setResultListener<SubDialogFragment, SubEditResult>(this) { which, ret ->\n            val (edited, replacing) = ret ?: return@setResultListener\n            replacing?.let { item ->\n                val url = URL(item)\n                adapter.remove(url)\n                if (which == DialogInterface.BUTTON_NEUTRAL) undoManager.remove(-1 to url)\n            }\n            if (edited != null) adapter.add(URL(edited)).also { list.post { list.scrollToPosition(it) } }\n        }\n        toolbar.setTitle(R.string.subscriptions)\n        toolbar.inflateMenu(R.menu.subscription_menu)\n        toolbar.setOnMenuItemClickListener(this)\n        SubscriptionService.idle.observe(viewLifecycleOwner) {\n            toolbar.menu.findItem(R.id.action_update_subscription).isEnabled = it\n        }\n        val activity = activity as MainActivity\n        list = view.findViewById(R.id.list)\n        ViewCompat.setOnApplyWindowInsetsListener(list, MainListListener)\n        list.layoutManager = LinearLayoutManager(activity, RecyclerView.VERTICAL, false)\n        list.itemAnimator = DefaultItemAnimator()\n        list.adapter = adapter\n        FastScrollerBuilder(list).useMd2Style().build()\n        undoManager = UndoSnackbarManager(activity, adapter::undo)\n        ItemTouchHelper(object : ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.START) {\n            override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) =\n                    adapter.remove(viewHolder.bindingAdapterPosition)\n\n            override fun onMove(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder,\n                                target: RecyclerView.ViewHolder): Boolean = false\n        }).attachToRecyclerView(list)\n    }\n\n    override fun onMenuItemClick(item: MenuItem): Boolean = when (item.itemId) {\n        R.id.action_manual_settings -> {\n            SubDialogFragment().apply {\n                arg(SubItem())\n                key()\n            }.show(parentFragmentManager, null)\n            true\n        }\n        R.id.action_update_subscription -> {\n            val context = requireContext()\n            context.startService(Intent(context, SubscriptionService::class.java))\n            true\n        }\n        else -> false\n    }\n\n    override fun onDetach() {\n        undoManager.flush()\n        super.onDetach()\n    }\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/github/shadowsocks/tasker/ActionListener.kt",
    "content": "/*******************************************************************************\n *                                                                             *\n *  Copyright (C) 2017 by Max Lv <max.c.lv@gmail.com>                          *\n *  Copyright (C) 2017 by Mygod Studio <contact-shadowsocks-android@mygod.be>  *\n *                                                                             *\n *  This program is free software: you can redistribute it and/or modify       *\n *  it under the terms of the GNU General Public License as published by       *\n *  the Free Software Foundation, either version 3 of the License, or          *\n *  (at your option) any later version.                                        *\n *                                                                             *\n *  This program is distributed in the hope that it will be useful,            *\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of             *\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the              *\n *  GNU General Public License for more details.                               *\n *                                                                             *\n *  You should have received a copy of the GNU General Public License          *\n *  along with this program. If not, see <http://www.gnu.org/licenses/>.       *\n *                                                                             *\n *******************************************************************************/\n\npackage com.github.shadowsocks.tasker\n\nimport android.content.BroadcastReceiver\nimport android.content.Context\nimport android.content.Intent\nimport com.github.shadowsocks.Core\nimport com.github.shadowsocks.database.ProfileManager\n\nclass ActionListener : BroadcastReceiver() {\n    override fun onReceive(context: Context, intent: Intent) {\n        val settings = Settings.fromIntent(intent)\n        var changed = false\n        if (ProfileManager.getProfile(settings.profileId) != null) {\n            Core.switchProfile(settings.profileId)\n            changed = true\n        }\n        if (settings.switchOn) {\n            Core.startService()\n            if (changed) Core.reloadService()\n        } else Core.stopService()\n    }\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/github/shadowsocks/tasker/ConfigActivity.kt",
    "content": "/*******************************************************************************\n *                                                                             *\n *  Copyright (C) 2017 by Max Lv <max.c.lv@gmail.com>                          *\n *  Copyright (C) 2017 by Mygod Studio <contact-shadowsocks-android@mygod.be>  *\n *                                                                             *\n *  This program is free software: you can redistribute it and/or modify       *\n *  it under the terms of the GNU General Public License as published by       *\n *  the Free Software Foundation, either version 3 of the License, or          *\n *  (at your option) any later version.                                        *\n *                                                                             *\n *  This program is distributed in the hope that it will be useful,            *\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of             *\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the              *\n *  GNU General Public License for more details.                               *\n *                                                                             *\n *  You should have received a copy of the GNU General Public License          *\n *  along with this program. If not, see <http://www.gnu.org/licenses/>.       *\n *                                                                             *\n *******************************************************************************/\n\npackage com.github.shadowsocks.tasker\n\nimport android.app.Activity\nimport android.content.res.Resources\nimport android.os.Bundle\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport android.widget.CheckedTextView\nimport android.widget.Switch\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.appcompat.widget.Toolbar\nimport androidx.core.view.ViewCompat\nimport androidx.recyclerview.widget.DefaultItemAnimator\nimport androidx.recyclerview.widget.LinearLayoutManager\nimport androidx.recyclerview.widget.RecyclerView\nimport com.github.shadowsocks.R\nimport com.github.shadowsocks.database.Profile\nimport com.github.shadowsocks.database.ProfileManager\nimport com.github.shadowsocks.utils.resolveResourceId\nimport com.github.shadowsocks.widget.ListHolderListener\nimport com.github.shadowsocks.widget.ListListener\n\nclass ConfigActivity : AppCompatActivity() {\n    inner class ProfileViewHolder(view: View) : RecyclerView.ViewHolder(view), View.OnClickListener {\n        private var item: Profile? = null\n        private val text = itemView.findViewById<CheckedTextView>(android.R.id.text1)\n\n        init {\n            view.setBackgroundResource(theme.resolveResourceId(android.R.attr.selectableItemBackground))\n            itemView.setOnClickListener(this)\n        }\n\n        fun bindDefault() {\n            item = null\n            text.setText(R.string.profile_default)\n            text.isChecked = taskerOption.profileId < 0\n        }\n        fun bind(item: Profile) {\n            this.item = item\n            text.text = item.formattedName\n            text.isChecked = taskerOption.profileId == item.id\n        }\n\n        override fun onClick(v: View?) {\n            taskerOption.switchOn = switch.isChecked\n            val item = item\n            taskerOption.profileId = item?.id ?: -1\n            setResult(Activity.RESULT_OK, taskerOption.toIntent(this@ConfigActivity))\n            finish()\n        }\n    }\n\n    inner class ProfilesAdapter : RecyclerView.Adapter<ProfileViewHolder>() {\n        internal val profiles = ProfileManager.getActiveProfiles()?.toMutableList() ?: mutableListOf()\n\n        override fun onBindViewHolder(holder: ProfileViewHolder, position: Int) =\n                if (position == 0) holder.bindDefault() else holder.bind(profiles[position - 1])\n        override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ProfileViewHolder = ProfileViewHolder(\n                LayoutInflater.from(parent.context).inflate(Resources.getSystem()\n                        .getIdentifier(\"select_dialog_singlechoice_material\", \"layout\", \"android\"), parent, false))\n        override fun getItemCount(): Int = 1 + profiles.size\n    }\n\n    private lateinit var taskerOption: Settings\n    private lateinit var switch: Switch\n    private val profilesAdapter = ProfilesAdapter()\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        val intent = intent\n        if (intent == null) {\n            finish()\n            return\n        }\n        taskerOption = Settings.fromIntent(intent)\n        setContentView(R.layout.layout_tasker)\n        ListHolderListener.setup(this)\n\n        val toolbar = findViewById<Toolbar>(R.id.toolbar)\n        toolbar.setTitle(R.string.app_name)\n        toolbar.setNavigationIcon(R.drawable.ic_navigation_close)\n        toolbar.setNavigationOnClickListener { finish() }\n\n        switch = findViewById(R.id.serviceSwitch)\n        switch.isChecked = taskerOption.switchOn\n        findViewById<RecyclerView>(R.id.list).apply {\n            ViewCompat.setOnApplyWindowInsetsListener(this, ListListener)\n            itemAnimator = DefaultItemAnimator()\n            adapter = profilesAdapter\n            layoutManager = LinearLayoutManager(this@ConfigActivity, RecyclerView.VERTICAL, false).apply {\n                if (taskerOption.profileId >= 0) {\n                    scrollToPosition(profilesAdapter.profiles.indexOfFirst { it.id == taskerOption.profileId } + 1)\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/github/shadowsocks/tasker/Settings.kt",
    "content": "/*******************************************************************************\n *                                                                             *\n *  Copyright (C) 2017 by Max Lv <max.c.lv@gmail.com>                          *\n *  Copyright (C) 2017 by Mygod Studio <contact-shadowsocks-android@mygod.be>  *\n *                                                                             *\n *  This program is free software: you can redistribute it and/or modify       *\n *  it under the terms of the GNU General Public License as published by       *\n *  the Free Software Foundation, either version 3 of the License, or          *\n *  (at your option) any later version.                                        *\n *                                                                             *\n *  This program is distributed in the hope that it will be useful,            *\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of             *\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the              *\n *  GNU General Public License for more details.                               *\n *                                                                             *\n *  You should have received a copy of the GNU General Public License          *\n *  along with this program. If not, see <http://www.gnu.org/licenses/>.       *\n *                                                                             *\n *******************************************************************************/\n\npackage com.github.shadowsocks.tasker\n\nimport android.content.Context\nimport android.content.Intent\nimport android.os.Bundle\nimport androidx.core.os.bundleOf\nimport com.github.shadowsocks.R\nimport com.github.shadowsocks.database.ProfileManager\nimport com.twofortyfouram.locale.api.Intent as ApiIntent\n\nclass Settings(bundle: Bundle?) {\n    companion object {\n        private const val KEY_SWITCH_ON = \"switch_on\"\n        private const val KEY_PROFILE_ID = \"profile_id\"\n\n        fun fromIntent(intent: Intent) = Settings(intent.getBundleExtra(ApiIntent.EXTRA_BUNDLE))\n    }\n\n    var switchOn: Boolean = bundle?.getBoolean(KEY_SWITCH_ON, true) ?: true\n    var profileId: Long\n\n    init {\n        profileId = bundle?.getLong(KEY_PROFILE_ID, -1L) ?: -1L\n        if (profileId < 0) profileId = (bundle?.getInt(KEY_PROFILE_ID, -1) ?: -1).toLong()\n    }\n\n    fun toIntent(context: Context): Intent {\n        val profile = ProfileManager.getProfile(profileId)\n        return Intent()\n                .putExtra(ApiIntent.EXTRA_BUNDLE, bundleOf(Pair(KEY_SWITCH_ON, switchOn),\n                        Pair(KEY_PROFILE_ID, profileId)))\n                .putExtra(ApiIntent.EXTRA_STRING_BLURB,\n                        if (profile != null) context.getString(\n                                if (switchOn) R.string.start_service else R.string.stop_service, profile.formattedName)\n                        else context.getString(if (switchOn) R.string.start_service_default else R.string.stop))\n    }\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/github/shadowsocks/widget/FabProgressBehavior.kt",
    "content": "/*******************************************************************************\n *                                                                             *\n *  Copyright (C) 2021 by Max Lv <max.c.lv@gmail.com>                          *\n *  Copyright (C) 2021 by Mygod Studio <contact-shadowsocks-android@mygod.be>  *\n *                                                                             *\n *  This program is free software: you can redistribute it and/or modify       *\n *  it under the terms of the GNU General Public License as published by       *\n *  the Free Software Foundation, either version 3 of the License, or          *\n *  (at your option) any later version.                                        *\n *                                                                             *\n *  This program is distributed in the hope that it will be useful,            *\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of             *\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the              *\n *  GNU General Public License for more details.                               *\n *                                                                             *\n *  You should have received a copy of the GNU General Public License          *\n *  along with this program. If not, see <http://www.gnu.org/licenses/>.       *\n *                                                                             *\n *******************************************************************************/\n\npackage com.github.shadowsocks.widget\n\nimport android.content.Context\nimport android.util.AttributeSet\nimport android.view.View\nimport androidx.coordinatorlayout.widget.CoordinatorLayout\nimport com.google.android.material.progressindicator.CircularProgressIndicator\n\nclass FabProgressBehavior(context: Context, attrs: AttributeSet?) :\n    CoordinatorLayout.Behavior<CircularProgressIndicator>(context, attrs) {\n    override fun layoutDependsOn(parent: CoordinatorLayout, child: CircularProgressIndicator, dependency: View) =\n        dependency.id == (child.layoutParams as CoordinatorLayout.LayoutParams).anchorId\n\n    override fun onLayoutChild(parent: CoordinatorLayout, child: CircularProgressIndicator,\n                               layoutDirection: Int): Boolean {\n        val size = parent.getDependencies(child).single().measuredHeight + child.trackThickness\n        return if (child.indicatorSize != size) {\n            child.indicatorSize = size\n            true\n        } else false\n    }\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/github/shadowsocks/widget/ServiceButton.kt",
    "content": "/*******************************************************************************\n *                                                                             *\n *  Copyright (C) 2017 by Max Lv <max.c.lv@gmail.com>                          *\n *  Copyright (C) 2017 by Mygod Studio <contact-shadowsocks-android@mygod.be>  *\n *                                                                             *\n *  This program is free software: you can redistribute it and/or modify       *\n *  it under the terms of the GNU General Public License as published by       *\n *  the Free Software Foundation, either version 3 of the License, or          *\n *  (at your option) any later version.                                        *\n *                                                                             *\n *  This program is distributed in the hope that it will be useful,            *\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of             *\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the              *\n *  GNU General Public License for more details.                               *\n *                                                                             *\n *  You should have received a copy of the GNU General Public License          *\n *  along with this program. If not, see <http://www.gnu.org/licenses/>.       *\n *                                                                             *\n *******************************************************************************/\n\npackage com.github.shadowsocks.widget\n\nimport android.content.Context\nimport android.graphics.drawable.Drawable\nimport android.os.Build\nimport android.util.AttributeSet\nimport android.view.PointerIcon\nimport android.view.View\nimport androidx.annotation.DrawableRes\nimport androidx.appcompat.widget.TooltipCompat\nimport androidx.dynamicanimation.animation.DynamicAnimation\nimport androidx.lifecycle.LifecycleOwner\nimport androidx.lifecycle.lifecycleScope\nimport androidx.lifecycle.withStarted\nimport androidx.vectordrawable.graphics.drawable.Animatable2Compat\nimport androidx.vectordrawable.graphics.drawable.AnimatedVectorDrawableCompat\nimport com.github.shadowsocks.R\nimport com.github.shadowsocks.bg.BaseService\nimport com.google.android.material.floatingactionbutton.FloatingActionButton\nimport com.google.android.material.progressindicator.BaseProgressIndicator\nimport kotlinx.coroutines.Job\nimport kotlinx.coroutines.delay\nimport kotlinx.coroutines.launch\nimport java.util.ArrayDeque\n\nclass ServiceButton @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0) :\n        FloatingActionButton(context, attrs, defStyleAttr), DynamicAnimation.OnAnimationEndListener {\n\n    private val callback = object : Animatable2Compat.AnimationCallback() {\n        override fun onAnimationEnd(drawable: Drawable) {\n            super.onAnimationEnd(drawable)\n            var next = animationQueue.peek() ?: return\n            if (next.icon.current == drawable) {\n                animationQueue.pop()\n                next = animationQueue.peek() ?: return\n            }\n            next.start()\n        }\n    }\n\n    private inner class AnimatedState(@DrawableRes resId: Int,\n                                      private val onStart: BaseProgressIndicator<*>.() -> Unit = { hideProgress() }) {\n        val icon: AnimatedVectorDrawableCompat = AnimatedVectorDrawableCompat.create(context, resId)!!.apply {\n            registerAnimationCallback(this@ServiceButton.callback)\n        }\n        fun start() {\n            setImageDrawable(icon)\n            icon.start()\n            progress.onStart()\n        }\n        fun stop() = icon.stop()\n    }\n\n    private val iconStopped by lazy { AnimatedState(R.drawable.ic_service_stopped) }\n    private val iconConnecting by lazy {\n        AnimatedState(R.drawable.ic_service_connecting) {\n            hideProgress()\n            delayedAnimation = (context as LifecycleOwner).lifecycleScope.launch {\n                delay(context.resources.getInteger(android.R.integer.config_mediumAnimTime) + 1000L)\n                context.lifecycle.withStarted {\n                    isIndeterminate = true\n                    show()\n                }\n            }\n        }\n    }\n    private val iconConnected by lazy {\n        AnimatedState(R.drawable.ic_service_connected) {\n            delayedAnimation?.cancel()\n            setProgressCompat(1, true)\n        }\n    }\n    private val iconStopping by lazy { AnimatedState(R.drawable.ic_service_stopping) }\n    private val animationQueue = ArrayDeque<AnimatedState>()\n\n    private var checked = false\n    private var delayedAnimation: Job? = null\n    private lateinit var progress: BaseProgressIndicator<*>\n    fun initProgress(progress: BaseProgressIndicator<*>) {\n        this.progress = progress\n        progress.progressDrawable?.addSpringAnimationEndListener(this)\n    }\n    override fun onAnimationEnd(animation: DynamicAnimation<out DynamicAnimation<*>>?, canceled: Boolean, value: Float,\n                                velocity: Float) {\n        if (!canceled) progress.hide()\n    }\n\n    private fun hideProgress() {\n        delayedAnimation?.cancel()\n        progress.hide()\n    }\n\n    override fun onCreateDrawableState(extraSpace: Int): IntArray {\n        val drawableState = super.onCreateDrawableState(extraSpace + 1)\n        if (checked) View.mergeDrawableStates(drawableState, intArrayOf(android.R.attr.state_checked))\n        return drawableState\n    }\n\n    fun changeState(state: BaseService.State, previousState: BaseService.State, animate: Boolean) {\n        when (state) {\n            BaseService.State.Connecting -> changeState(iconConnecting, animate)\n            BaseService.State.Connected -> changeState(iconConnected, animate)\n            BaseService.State.Stopping -> {\n                changeState(iconStopping, animate && previousState == BaseService.State.Connected)\n            }\n            else -> changeState(iconStopped, animate)\n        }\n        checked = state == BaseService.State.Connected\n        refreshDrawableState()\n        val description = context.getText(if (state.canStop) R.string.stop else R.string.connect)\n        contentDescription = description\n        TooltipCompat.setTooltipText(this, description)\n        val enabled = state.canStop || state == BaseService.State.Stopped\n        isEnabled = enabled\n        if (Build.VERSION.SDK_INT >= 24) pointerIcon = PointerIcon.getSystemIcon(context,\n                if (enabled) PointerIcon.TYPE_HAND else PointerIcon.TYPE_WAIT)\n    }\n\n    private fun changeState(icon: AnimatedState, animate: Boolean) {\n        fun counters(a: AnimatedState, b: AnimatedState): Boolean =\n                a == iconStopped && b == iconConnecting ||\n                a == iconConnecting && b == iconStopped ||\n                a == iconConnected && b == iconStopping ||\n                a == iconStopping && b == iconConnected\n        if (animate) {\n            if (animationQueue.size < 2 || !counters(animationQueue.last, icon)) {\n                animationQueue.add(icon)\n                if (animationQueue.size == 1) icon.start()\n            } else animationQueue.removeLast()\n        } else {\n            animationQueue.peekFirst()?.stop()\n            animationQueue.clear()\n            icon.start()    // force ensureAnimatorSet to be called so that stop() will work\n            icon.stop()\n        }\n    }\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/github/shadowsocks/widget/StatsBar.kt",
    "content": "/*******************************************************************************\n *                                                                             *\n *  Copyright (C) 2018 by Max Lv <max.c.lv@gmail.com>                          *\n *  Copyright (C) 2018 by Mygod Studio <contact-shadowsocks-android@mygod.be>  *\n *                                                                             *\n *  This program is free software: you can redistribute it and/or modify       *\n *  it under the terms of the GNU General Public License as published by       *\n *  the Free Software Foundation, either version 3 of the License, or          *\n *  (at your option) any later version.                                        *\n *                                                                             *\n *  This program is distributed in the hope that it will be useful,            *\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of             *\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the              *\n *  GNU General Public License for more details.                               *\n *                                                                             *\n *  You should have received a copy of the GNU General Public License          *\n *  along with this program. If not, see <http://www.gnu.org/licenses/>.       *\n *                                                                             *\n *******************************************************************************/\n\npackage com.github.shadowsocks.widget\n\nimport android.content.Context\nimport android.text.format.Formatter\nimport android.util.AttributeSet\nimport android.view.View\nimport android.widget.TextView\nimport androidx.activity.viewModels\nimport androidx.appcompat.widget.TooltipCompat\nimport androidx.coordinatorlayout.widget.CoordinatorLayout\nimport androidx.core.view.doOnPreDraw\nimport com.github.shadowsocks.MainActivity\nimport com.github.shadowsocks.R\nimport com.github.shadowsocks.bg.BaseService\nimport com.github.shadowsocks.net.HttpsTest\nimport com.google.android.material.bottomappbar.BottomAppBar\n\nclass StatsBar @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null,\n                                         defStyleAttr: Int = R.attr.bottomAppBarStyle) :\n        BottomAppBar(context, attrs, defStyleAttr) {\n    private lateinit var statusText: TextView\n    private lateinit var txText: TextView\n    private lateinit var rxText: TextView\n    private lateinit var txRateText: TextView\n    private lateinit var rxRateText: TextView\n    private val tester by (context as MainActivity).viewModels<HttpsTest>()\n    private lateinit var behavior: Behavior\n    override fun getBehavior(): Behavior {\n        if (!this::behavior.isInitialized) behavior = object : Behavior() {\n            override fun onNestedScroll(coordinatorLayout: CoordinatorLayout, child: BottomAppBar, target: View,\n                                        dxConsumed: Int, dyConsumed: Int, dxUnconsumed: Int, dyUnconsumed: Int,\n                                        type: Int, consumed: IntArray) {\n                super.onNestedScroll(coordinatorLayout, child, target, dxConsumed, dyConsumed + dyUnconsumed,\n                        dxUnconsumed, 0, type, consumed)\n            }\n        }\n        return behavior\n    }\n\n    override fun setOnClickListener(l: OnClickListener?) {\n        statusText = findViewById(R.id.status)\n        txText = findViewById(R.id.tx)\n        txRateText = findViewById(R.id.txRate)\n        rxText = findViewById(R.id.rx)\n        rxRateText = findViewById(R.id.rxRate)\n        super.setOnClickListener(l)\n    }\n\n    private fun setStatus(text: CharSequence) {\n        statusText.text = text\n        TooltipCompat.setTooltipText(this, text)\n    }\n\n    fun changeState(state: BaseService.State, animate: Boolean) {\n        val activity = context as MainActivity\n        if ((state == BaseService.State.Connected).also { hideOnScroll = it }) {\n            doOnPreDraw { performShow(animate) }\n            tester.status.observe(activity) { it.retrieve(this::setStatus) { msg -> activity.snackbar(msg).show() } }\n        } else {\n            doOnPreDraw { performHide(animate) }\n            updateTraffic(0, 0, 0, 0)\n            tester.status.removeObservers(activity)\n            if (state != BaseService.State.Idle) tester.invalidate()\n            setStatus(context.getText(when (state) {\n                BaseService.State.Connecting -> R.string.connecting\n                BaseService.State.Stopping -> R.string.stopping\n                else -> R.string.not_connected\n            }))\n        }\n    }\n\n    fun updateTraffic(txRate: Long, rxRate: Long, txTotal: Long, rxTotal: Long) {\n        txText.text = \"▲ ${Formatter.formatFileSize(context, txTotal)}\"\n        rxText.text = \"▼ ${Formatter.formatFileSize(context, rxTotal)}\"\n        txRateText.text = context.getString(R.string.speed, Formatter.formatFileSize(context, txRate))\n        rxRateText.text = context.getString(R.string.speed, Formatter.formatFileSize(context, rxRate))\n    }\n\n    fun testConnection() = tester.testConnection()\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/github/shadowsocks/widget/UndoSnackbarManager.kt",
    "content": "/*******************************************************************************\n *                                                                             *\n *  Copyright (C) 2017 by Max Lv <max.c.lv@gmail.com>                          *\n *  Copyright (C) 2017 by Mygod Studio <contact-shadowsocks-android@mygod.be>  *\n *                                                                             *\n *  This program is free software: you can redistribute it and/or modify       *\n *  it under the terms of the GNU General Public License as published by       *\n *  the Free Software Foundation, either version 3 of the License, or          *\n *  (at your option) any later version.                                        *\n *                                                                             *\n *  This program is distributed in the hope that it will be useful,            *\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of             *\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the              *\n *  GNU General Public License for more details.                               *\n *                                                                             *\n *  You should have received a copy of the GNU General Public License          *\n *  along with this program. If not, see <http://www.gnu.org/licenses/>.       *\n *                                                                             *\n *******************************************************************************/\n\npackage com.github.shadowsocks.widget\n\nimport com.github.shadowsocks.MainActivity\nimport com.github.shadowsocks.R\nimport com.google.android.material.snackbar.Snackbar\n\n/**\n * @param activity MainActivity.\n * //@param view The view to find a parent from.\n * @param undo Callback for undoing removals.\n * @param commit Callback for committing removals.\n * @tparam T Item type.\n */\nclass UndoSnackbarManager<in T>(private val activity: MainActivity, private val undo: (List<Pair<Int, T>>) -> Unit,\n                                commit: ((List<Pair<Int, T>>) -> Unit)? = null) {\n    private val recycleBin = ArrayList<Pair<Int, T>>()\n    private val removedCallback = object : Snackbar.Callback() {\n        override fun onDismissed(transientBottomBar: Snackbar?, event: Int) {\n            if (last === transientBottomBar && event != DISMISS_EVENT_ACTION) {\n                commit?.invoke(recycleBin)\n                recycleBin.clear()\n                last = null\n            }\n        }\n    }\n\n    private var last: Snackbar? = null\n\n    fun remove(items: Collection<Pair<Int, T>>) {\n        recycleBin.addAll(items)\n        val count = recycleBin.size\n        activity.snackbar(activity.resources.getQuantityString(R.plurals.removed, count, count)).apply {\n            addCallback(removedCallback)\n            setAction(R.string.undo) {\n                undo(recycleBin.reversed())\n                recycleBin.clear()\n            }\n            last = this\n            show()\n        }\n    }\n\n    fun remove(vararg items: Pair<Int, T>) = remove(items.toList())\n\n    fun flush() = last?.dismiss()\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/github/shadowsocks/widget/WindowInsetsListeners.kt",
    "content": "/*******************************************************************************\n *                                                                             *\n *  Copyright (C) 2019 by Max Lv <max.c.lv@gmail.com>                          *\n *  Copyright (C) 2019 by Mygod Studio <contact-shadowsocks-android@mygod.be>  *\n *                                                                             *\n *  This program is free software: you can redistribute it and/or modify       *\n *  it under the terms of the GNU General Public License as published by       *\n *  the Free Software Foundation, either version 3 of the License, or          *\n *  (at your option) any later version.                                        *\n *                                                                             *\n *  This program is distributed in the hope that it will be useful,            *\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of             *\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the              *\n *  GNU General Public License for more details.                               *\n *                                                                             *\n *  You should have received a copy of the GNU General Public License          *\n *  along with this program. If not, see <http://www.gnu.org/licenses/>.       *\n *                                                                             *\n *******************************************************************************/\n\npackage com.github.shadowsocks.widget\n\nimport android.view.View\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.core.graphics.Insets\nimport androidx.core.view.*\nimport com.github.shadowsocks.R\n\nobject ListHolderListener : OnApplyWindowInsetsListener {\n    override fun onApplyWindowInsets(view: View, insets: WindowInsetsCompat): WindowInsetsCompat {\n        val statusBarInsets = insets.getInsets(WindowInsetsCompat.Type.statusBars())\n        view.setPadding(statusBarInsets.left, statusBarInsets.top, statusBarInsets.right, statusBarInsets.bottom)\n        return WindowInsetsCompat.Builder(insets).apply {\n            setInsets(WindowInsetsCompat.Type.statusBars(), Insets.NONE)\n        }.build()\n    }\n\n    fun setup(activity: AppCompatActivity) = activity.findViewById<View>(android.R.id.content).let {\n        ViewCompat.setOnApplyWindowInsetsListener(it, ListHolderListener)\n        WindowCompat.setDecorFitsSystemWindows(activity.window, false)\n    }\n}\n\nobject MainListListener : OnApplyWindowInsetsListener {\n    override fun onApplyWindowInsets(view: View, insets: WindowInsetsCompat) = insets.apply {\n        view.updatePadding(bottom = view.resources.getDimensionPixelOffset(R.dimen.main_list_padding_bottom) +\n                insets.getInsets(WindowInsetsCompat.Type.navigationBars()).bottom)\n    }\n}\n\nobject ListListener : OnApplyWindowInsetsListener {\n    override fun onApplyWindowInsets(view: View, insets: WindowInsetsCompat) = insets.apply {\n        view.updatePadding(bottom = insets.getInsets(WindowInsetsCompat.Type.navigationBars()).bottom)\n    }\n}\n"
  },
  {
    "path": "mobile/src/main/res/color/background_service.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item android:color=\"@color/material_green_700\" android:state_checked=\"true\"/>\n    <item android:color=\"@color/material_primary_500\"/>\n</selector>\n"
  },
  {
    "path": "mobile/src/main/res/color/nav_item_tint.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item android:color=\"@color/color_primary_text\" android:state_checked=\"true\"/>\n    <item android:color=\"?android:attr/textColorPrimary\"/>\n</selector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/background_profile.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layer-list xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item>\n        <shape android:shape=\"rectangle\">\n            <solid android:color=\"@color/background_stat\" />\n        </shape>\n    </item>\n    <item>\n        <selector android:enterFadeDuration=\"@android:integer/config_mediumAnimTime\"\n                  android:exitFadeDuration=\"@android:integer/config_mediumAnimTime\">\n            <item android:state_selected=\"true\">\n                <shape android:shape=\"rectangle\">\n                    <solid android:color=\"@color/material_green_700\" />\n                </shape>\n            </item>\n        </selector>\n    </item>\n    <!-- android:start not available until API 23 -->\n    <item android:left=\"8dp\">\n        <shape android:shape=\"rectangle\">\n            <solid android:color=\"?android:colorBackground\" />\n        </shape>\n    </item>\n    <item android:drawable=\"?android:attr/selectableItemBackground\"/>\n</layer-list>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/background_selectable.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layer-list xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item>\n        <selector android:enterFadeDuration=\"@android:integer/config_mediumAnimTime\"\n                  android:exitFadeDuration=\"@android:integer/config_mediumAnimTime\">\n            <item android:state_selected=\"true\">\n                <color android:color=\"@color/background_selected\"/>\n            </item>\n        </selector>\n    </item>\n    <item android:drawable=\"?android:attr/selectableItemBackground\"/>\n</layer-list>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/ic_action_assignment.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:autoMirrored=\"true\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M19,3h-4.18C14.4,1.84 13.3,1 12,1c-1.3,0 -2.4,0.84 -2.82,2L5,3c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2L21,5c0,-1.1 -0.9,-2 -2,-2zM12,3c0.55,0 1,0.45 1,1s-0.45,1 -1,1 -1,-0.45 -1,-1 0.45,-1 1,-1zM14,17L7,17v-2h7v2zM17,13L7,13v-2h10v2zM17,9L7,9L7,7h10v2z\"/>\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/ic_action_copyright.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M10.08,10.86c0.05,-0.33 0.16,-0.62 0.3,-0.87s0.34,-0.46 0.59,-0.62c0.24,-0.15 0.54,-0.22 0.91,-0.23 0.23,0.01 0.44,0.05 0.63,0.13 0.2,0.09 0.38,0.21 0.52,0.36s0.25,0.33 0.34,0.53 0.13,0.42 0.14,0.64h1.79c-0.02,-0.47 -0.11,-0.9 -0.28,-1.29s-0.4,-0.73 -0.7,-1.01 -0.66,-0.5 -1.08,-0.66 -0.88,-0.23 -1.39,-0.23c-0.65,0 -1.22,0.11 -1.7,0.34s-0.88,0.53 -1.2,0.92 -0.56,0.84 -0.71,1.36S8,11.29 8,11.87v0.27c0,0.58 0.08,1.12 0.23,1.64s0.39,0.97 0.71,1.35 0.72,0.69 1.2,0.91 1.05,0.34 1.7,0.34c0.47,0 0.91,-0.08 1.32,-0.23s0.77,-0.36 1.08,-0.63 0.56,-0.58 0.74,-0.94 0.29,-0.74 0.3,-1.15h-1.79c-0.01,0.21 -0.06,0.4 -0.15,0.58s-0.21,0.33 -0.36,0.46 -0.32,0.23 -0.52,0.3c-0.19,0.07 -0.39,0.09 -0.6,0.1 -0.36,-0.01 -0.66,-0.08 -0.89,-0.23 -0.25,-0.16 -0.45,-0.37 -0.59,-0.62s-0.25,-0.55 -0.3,-0.88 -0.08,-0.67 -0.08,-1v-0.27c0,-0.35 0.03,-0.68 0.08,-1.01zM12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM12,20c-4.41,0 -8,-3.59 -8,-8s3.59,-8 8,-8 8,3.59 8,8 -3.59,8 -8,8z\"/>\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/ic_action_delete.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\"\n        android:tint=\"?attr/colorControlNormal\">\n    <path\n            android:fillColor=\"#FFFFFFFF\"\n            android:pathData=\"M6,19c0,1.1 0.9,2 2,2h8c1.1,0 2,-0.9 2,-2V7H6v12zM19,4h-3.5l-1,-1h-5l-1,1H5v2h14V4z\"/>\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/ic_action_description.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:autoMirrored=\"true\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M14,2L6,2c-1.1,0 -1.99,0.9 -1.99,2L4,20c0,1.1 0.89,2 1.99,2L18,22c1.1,0 2,-0.9 2,-2L20,8l-6,-6zM16,18L8,18v-2h8v2zM16,14L8,14v-2h8v2zM13,9L13,3.5L18.5,9L13,9z\"/>\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/ic_action_dns.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\"\n        android:tint=\"?attr/colorControlNormal\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M20,13H4c-0.55,0 -1,0.45 -1,1v6c0,0.55 0.45,1 1,1h16c0.55,0 1,-0.45 1,-1v-6c0,-0.55 -0.45,-1 -1,-1zM7,19c-1.1,0 -2,-0.9 -2,-2s0.9,-2 2,-2 2,0.9 2,2 -0.9,2 -2,2zM20,3H4c-0.55,0 -1,0.45 -1,1v6c0,0.55 0.45,1 1,1h16c0.55,0 1,-0.45 1,-1V4c0,-0.55 -0.45,-1 -1,-1zM7,9c-1.1,0 -2,-0.9 -2,-2s0.9,-2 2,-2 2,0.9 2,2 -0.9,2 -2,2z\"/>\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/ic_action_done.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\"\n        android:tint=\"?attr/colorControlNormal\">\n    <path\n            android:fillColor=\"#FF000000\"\n            android:pathData=\"M9,16.2L4.8,12l-1.4,1.4L9,19 21,7l-1.4,-1.4L9,16.2z\"/>\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/ic_action_help_outline.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M11,18h2v-2h-2v2zM12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM12,20c-4.41,0 -8,-3.59 -8,-8s3.59,-8 8,-8 8,3.59 8,8 -3.59,8 -8,8zM12,6c-2.21,0 -4,1.79 -4,4h2c0,-1.1 0.9,-2 2,-2s2,0.9 2,2c0,2 -3,1.75 -3,5h2c0,-2.25 3,-2.5 3,-5 0,-2.21 -1.79,-4 -4,-4z\"/>\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/ic_action_lock.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\"\n        android:tint=\"?attr/colorControlNormal\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M18,8h-1L17,6c0,-2.76 -2.24,-5 -5,-5S7,3.24 7,6v2L6,8c-1.1,0 -2,0.9 -2,2v10c0,1.1 0.9,2 2,2h12c1.1,0 2,-0.9 2,-2L20,10c0,-1.1 -0.9,-2 -2,-2zM12,17c-1.1,0 -2,-0.9 -2,-2s0.9,-2 2,-2 2,0.9 2,2 -0.9,2 -2,2zM15.1,8L8.9,8L8.9,6c0,-1.71 1.39,-3.1 3.1,-3.1 1.71,0 3.1,1.39 3.1,3.1v2z\"/>\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/ic_action_lock_open.xml",
    "content": "<vector android:autoMirrored=\"true\" android:height=\"24dp\"\n    android:tint=\"?attr/colorControlNormal\"\n    android:viewportHeight=\"24.0\" android:viewportWidth=\"24.0\"\n    android:width=\"24dp\" xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <path android:fillColor=\"@android:color/white\" android:pathData=\"M12,17c1.1,0 2,-0.9 2,-2s-0.9,-2 -2,-2 -2,0.9 -2,2 0.9,2 2,2zM18,8h-1L17,6c0,-2.76 -2.24,-5 -5,-5S7,3.24 7,6h1.9c0,-1.71 1.39,-3.1 3.1,-3.1 1.71,0 3.1,1.39 3.1,3.1v2L6,8c-1.1,0 -2,0.9 -2,2v10c0,1.1 0.9,2 2,2h12c1.1,0 2,-0.9 2,-2L20,10c0,-1.1 -0.9,-2 -2,-2zM18,20L6,20L6,10h12v10z\"/>\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/ic_action_note_add.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:autoMirrored=\"true\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\"\n        android:tint=\"?attr/colorControlNormal\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M14,2L6,2c-1.1,0 -1.99,0.9 -1.99,2L4,20c0,1.1 0.89,2 1.99,2L18,22c1.1,0 2,-0.9 2,-2L20,8l-6,-6zM16,16h-3v3h-2v-3L8,16v-2h3v-3h2v3h3v2zM13,9L13,3.5L18.5,9L13,9z\"/>\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/ic_action_settings.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\"\n        android:tint=\"?attr/colorControlNormal\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M19.43,12.98c0.04,-0.32 0.07,-0.64 0.07,-0.98s-0.03,-0.66 -0.07,-0.98l2.11,-1.65c0.19,-0.15 0.24,-0.42 0.12,-0.64l-2,-3.46c-0.12,-0.22 -0.39,-0.3 -0.61,-0.22l-2.49,1c-0.52,-0.4 -1.08,-0.73 -1.69,-0.98l-0.38,-2.65C14.46,2.18 14.25,2 14,2h-4c-0.25,0 -0.46,0.18 -0.49,0.42l-0.38,2.65c-0.61,0.25 -1.17,0.59 -1.69,0.98l-2.49,-1c-0.23,-0.09 -0.49,0 -0.61,0.22l-2,3.46c-0.13,0.22 -0.07,0.49 0.12,0.64l2.11,1.65c-0.04,0.32 -0.07,0.65 -0.07,0.98s0.03,0.66 0.07,0.98l-2.11,1.65c-0.19,0.15 -0.24,0.42 -0.12,0.64l2,3.46c0.12,0.22 0.39,0.3 0.61,0.22l2.49,-1c0.52,0.4 1.08,0.73 1.69,0.98l0.38,2.65c0.03,0.24 0.24,0.42 0.49,0.42h4c0.25,0 0.46,-0.18 0.49,-0.42l0.38,-2.65c0.61,-0.25 1.17,-0.59 1.69,-0.98l2.49,1c0.23,0.09 0.49,0 0.61,-0.22l2,-3.46c0.12,-0.22 0.07,-0.49 -0.12,-0.64l-2.11,-1.65zM12,15.5c-1.93,0 -3.5,-1.57 -3.5,-3.5s1.57,-3.5 3.5,-3.5 3.5,1.57 3.5,3.5 -1.57,3.5 -3.5,3.5z\"/>\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/ic_app_shortcut_background.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  Copyright 2017 Google Inc.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this file except\n  in compliance with the License. You may obtain a copy of the License at\n\n  http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software distributed under the License\n  is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express\n  or implied. See the License for the specific language governing permissions and limitations under\n  the License.\n  -->\n\n<shape\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:shape=\"oval\">\n    <solid android:color=\"@color/material_grey_100\" />\n    <size android:width=\"44dp\" android:height=\"44dp\" />\n</shape>"
  },
  {
    "path": "mobile/src/main/res/drawable/ic_av_playlist_add.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:autoMirrored=\"true\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\"\n        android:tint=\"?attr/colorControlNormal\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M14,10L2,10v2h12v-2zM14,6L2,6v2h12L14,6zM18,14v-4h-2v4h-4v2h4v4h2v-4h4v-2h-4zM2,16h8v-2L2,14v2z\"/>\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/ic_communication_phonelink_ring.xml",
    "content": "<vector android:autoMirrored=\"true\" android:height=\"24dp\"\n    android:viewportHeight=\"24.0\" android:viewportWidth=\"24.0\"\n    android:width=\"24dp\" xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:tint=\"?attr/colorControlNormal\">\n    <path android:fillColor=\"#FF000000\" android:pathData=\"M20.1,7.7l-1,1c1.8,1.8 1.8,4.6 0,6.5l1,1c2.5,-2.3 2.5,-6.1 0,-8.5zM18,9.8l-1,1c0.5,0.7 0.5,1.6 0,2.3l1,1c1.2,-1.2 1.2,-3 0,-4.3zM14,1L4,1c-1.1,0 -2,0.9 -2,2v18c0,1.1 0.9,2 2,2h10c1.1,0 2,-0.9 2,-2L16,3c0,-1.1 -0.9,-2 -2,-2zM14,20L4,20L4,4h10v16z\"/>\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/ic_device_data_usage.xml",
    "content": "<vector android:autoMirrored=\"true\" android:height=\"24dp\"\n    android:viewportHeight=\"24.0\" android:viewportWidth=\"24.0\"\n    android:width=\"24dp\" xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:tint=\"?attr/colorControlNormal\">\n    <path android:fillColor=\"#FF000000\" android:pathData=\"M13,2.05v3.03c3.39,0.49 6,3.39 6,6.92 0,0.9 -0.18,1.75 -0.48,2.54l2.6,1.53c0.56,-1.24 0.88,-2.62 0.88,-4.07 0,-5.18 -3.95,-9.45 -9,-9.95zM12,19c-3.87,0 -7,-3.13 -7,-7 0,-3.53 2.61,-6.43 6,-6.92V2.05c-5.06,0.5 -9,4.76 -9,9.95 0,5.52 4.47,10 9.99,10 3.31,0 6.24,-1.61 8.06,-4.09l-2.6,-1.53C16.17,17.98 14.21,19 12,19z\"/>\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/ic_device_developer_mode.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\"\n        android:tint=\"?attr/colorControlNormal\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M7,5h10v2h2L19,3c0,-1.1 -0.9,-1.99 -2,-1.99L7,1c-1.1,0 -2,0.9 -2,2v4h2L7,5zM15.41,16.59L20,12l-4.59,-4.59L14,8.83 17.17,12 14,15.17l1.41,1.42zM10,15.17L6.83,12 10,8.83 8.59,7.41 4,12l4.59,4.59L10,15.17zM17,19L7,19v-2L5,17v4c0,1.1 0.9,2 2,2h10c1.1,0 2,-0.9 2,-2v-4h-2v2z\"/>\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/ic_file_cloud_queue.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:tint=\"?attr/colorControlNormal\"\n    android:viewportWidth=\"24.0\"\n    android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M19.35,10.04C18.67,6.59 15.64,4 12,4 9.11,4 6.6,5.64 5.35,8.04 2.34,8.36 0,10.91 0,14c0,3.31 2.69,6 6,6h13c2.76,0 5,-2.24 5,-5 0,-2.64 -2.05,-4.78 -4.65,-4.96zM19,18H6c-2.21,0 -4,-1.79 -4,-4s1.79,-4 4,-4h0.71C7.37,7.69 9.48,6 12,6c3.04,0 5.5,2.46 5.5,5.5v0.5H19c1.66,0 3,1.34 3,3s-1.34,3 -3,3z\" />\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/ic_file_file_upload.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\"\n        android:tint=\"?attr/colorControlNormal\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M9,16h6v-6h4l-7,-7 -7,7h4zM5,18h14v2L5,20z\"/>\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/ic_hardware_router.xml",
    "content": "<vector android:autoMirrored=\"true\" android:height=\"24dp\"\n    android:viewportHeight=\"24.0\" android:viewportWidth=\"24.0\"\n    android:width=\"24dp\" xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:tint=\"?attr/colorControlNormal\">\n    <path android:fillColor=\"#FF000000\" android:pathData=\"M20.2,5.9l0.8,-0.8C19.6,3.7 17.8,3 16,3s-3.6,0.7 -5,2.1l0.8,0.8C13,4.8 14.5,4.2 16,4.2s3,0.6 4.2,1.7zM19.3,6.7c-0.9,-0.9 -2.1,-1.4 -3.3,-1.4s-2.4,0.5 -3.3,1.4l0.8,0.8c0.7,-0.7 1.6,-1 2.5,-1 0.9,0 1.8,0.3 2.5,1l0.8,-0.8zM19,13h-2L17,9h-2v4L5,13c-1.1,0 -2,0.9 -2,2v4c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2v-4c0,-1.1 -0.9,-2 -2,-2zM8,18L6,18v-2h2v2zM11.5,18h-2v-2h2v2zM15,18h-2v-2h2v2z\"/>\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/ic_image_camera_alt.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"@color/material_primary_600\"\n        android:pathData=\"M12,12m-3.2,0a3.2,3.2 0,1 1,6.4 0a3.2,3.2 0,1 1,-6.4 0\"/>\n    <path\n        android:fillColor=\"@color/material_primary_600\"\n        android:pathData=\"M9,2L7.17,4L4,4c-1.1,0 -2,0.9 -2,2v12c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2L22,6c0,-1.1 -0.9,-2 -2,-2h-3.17L15,2L9,2zM12,17c-2.76,0 -5,-2.24 -5,-5s2.24,-5 5,-5 5,2.24 5,5 -2.24,5 -5,5z\"/>\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/ic_image_edit.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\"\n        android:tint=\"?attr/colorControlNormal\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M3,17.25V21h3.75L17.81,9.94l-3.75,-3.75L3,17.25zM20.71,7.04c0.39,-0.39 0.39,-1.02 0,-1.41l-2.34,-2.34c-0.39,-0.39 -1.02,-0.39 -1.41,0l-1.83,1.83 3.75,3.75 1.83,-1.83z\"/>\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/ic_image_looks_6.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\"\n        android:tint=\"?attr/colorControlNormal\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M11,15h2v-2h-2v2zM19,3L5,3c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2L21,5c0,-1.1 -0.9,-2 -2,-2zM15,9h-4v2h2c1.1,0 2,0.89 2,2v2c0,1.11 -0.9,2 -2,2h-2c-1.1,0 -2,-0.89 -2,-2L9,9c0,-1.11 0.9,-2 2,-2h4v2z\"/>\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/ic_image_photo.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\"\n        android:tint=\"?attr/colorControlNormal\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M21,19V5c0,-1.1 -0.9,-2 -2,-2H5c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2zM8.5,13.5l2.5,3.01L14.5,12l4.5,6H5l3.5,-4.5z\"/>\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/ic_maps_360.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24.0\"\n    android:viewportHeight=\"24.0\"\n    android:autoMirrored=\"true\"\n    android:tint=\"?attr/colorControlNormal\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M12,7C6.48,7 2,9.24 2,12c0,2.24 2.94,4.13 7,4.77V20l4,-4 -4,-4v2.73c-3.15,-0.56 -5,-1.9 -5,-2.73 0,-1.06 3.04,-3 8,-3s8,1.94 8,3c0,0.73 -1.46,1.89 -4,2.53v2.05c3.53,-0.77 6,-2.53 6,-4.58 0,-2.76 -4.48,-5 -10,-5z\"/>\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/ic_maps_directions.xml",
    "content": "<vector android:autoMirrored=\"true\" android:height=\"24dp\"\n    android:viewportHeight=\"24.0\" android:viewportWidth=\"24.0\"\n    android:width=\"24dp\" xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:tint=\"?attr/colorControlNormal\">\n    <path android:fillColor=\"#FF000000\" android:pathData=\"M21.71,11.29l-9,-9c-0.39,-0.39 -1.02,-0.39 -1.41,0l-9,9c-0.39,0.39 -0.39,1.02 0,1.41l9,9c0.39,0.39 1.02,0.39 1.41,0l9,-9c0.39,-0.38 0.39,-1.01 0,-1.41zM14,14.5V12h-4v3H8v-4c0,-0.55 0.45,-1 1,-1h5V7.5l3.5,3.5 -3.5,3.5z\"/>\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/ic_maps_directions_boat.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\"\n        android:tint=\"?attr/colorControlNormal\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M20,21c-1.39,0 -2.78,-0.47 -4,-1.32 -2.44,1.71 -5.56,1.71 -8,0C6.78,20.53 5.39,21 4,21H2v2h2c1.38,0 2.74,-0.35 4,-0.99 2.52,1.29 5.48,1.29 8,0 1.26,0.65 2.62,0.99 4,0.99h2v-2h-2zM3.95,19H4c1.6,0 3.02,-0.88 4,-2 0.98,1.12 2.4,2 4,2s3.02,-0.88 4,-2c0.98,1.12 2.4,2 4,2h0.05l1.89,-6.68c0.08,-0.26 0.06,-0.54 -0.06,-0.78s-0.34,-0.42 -0.6,-0.5L20,10.62V6c0,-1.1 -0.9,-2 -2,-2h-3V1H9v3H6c-1.1,0 -2,0.9 -2,2v4.62l-1.29,0.42c-0.26,0.08 -0.48,0.26 -0.6,0.5s-0.15,0.52 -0.06,0.78L3.95,19zM6,6h12v3.97L12,8 6,9.97V6z\"/>\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/ic_navigation_apps.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\"\n    android:tint=\"?attr/colorControlNormal\">\n  <path\n      android:fillColor=\"#FF000000\"\n      android:pathData=\"M4,8h4L8,4L4,4v4zM10,20h4v-4h-4v4zM4,20h4v-4L4,16v4zM4,14h4v-4L4,10v4zM10,14h4v-4h-4v4zM16,4v4h4L20,4h-4zM10,8h4L14,4h-4v4zM16,14h4v-4h-4v4zM16,20h4v-4h-4v4z\"/>\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/ic_navigation_menu.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\"\n        android:tint=\"?attr/colorControlNormal\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M3,18h18v-2L3,16v2zM3,13h18v-2L3,11v2zM3,6v2h18L21,6L3,6z\"/>\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/ic_notification_enhanced_encryption.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\"\n        android:tint=\"?attr/colorControlNormal\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M18,8h-1V6c0,-2.76 -2.24,-5 -5,-5S7,3.24 7,6v2H6c-1.1,0 -2,0.9 -2,2v10c0,1.1 0.9,2 2,2h12c1.1,0 2,-0.9 2,-2V10c0,-1.1 -0.9,-2 -2,-2zM8.9,6c0,-1.71 1.39,-3.1 3.1,-3.1s3.1,1.39 3.1,3.1v2H8.9V6zM16,16h-3v3h-2v-3H8v-2h3v-3h2v3h3v2z\"/>\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/ic_qu_camera_launcher.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layer-list xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n    <item\n        android:drawable=\"@drawable/ic_app_shortcut_background\"\n        android:left=\"2dp\"\n        android:top=\"2dp\"\n        android:right=\"2dp\"\n        android:bottom=\"2dp\" />\n\n    <item\n        android:drawable=\"@drawable/ic_image_camera_alt\"\n        android:left=\"12dp\"\n        android:top=\"12dp\"\n        android:right=\"12dp\"\n        android:bottom=\"12dp\" />\n\n</layer-list>"
  },
  {
    "path": "mobile/src/main/res/drawable/ic_qu_shadowsocks_foreground.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24\"\n        android:viewportHeight=\"24\">\n\n    <path\n        android:name=\"path\"\n        android:fillColor=\"@color/material_blue_grey_600\"\n        android:pathData=\"M 21.25 2.28 L 17.55 18.55 L 9.26 15.89 L 16.58 7.16 L 6.83 15.37 L 0 12.8 L 21.25 2.28 ZM 9.45 17.56 L 12.09 18.41 L 9.46 22 L 9.45 17.56 Z\" />\n</vector>"
  },
  {
    "path": "mobile/src/main/res/drawable/ic_qu_shadowsocks_launcher.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layer-list xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n    <item\n        android:drawable=\"@drawable/ic_app_shortcut_background\"\n        android:left=\"2dp\"\n        android:top=\"2dp\"\n        android:right=\"2dp\"\n        android:bottom=\"2dp\" />\n\n    <item\n        android:drawable=\"@drawable/ic_qu_shadowsocks_foreground\"\n        android:left=\"12dp\"\n        android:top=\"12dp\"\n        android:right=\"12dp\"\n        android:bottom=\"12dp\" />\n\n</layer-list>"
  },
  {
    "path": "mobile/src/main/res/drawable/ic_service_busy.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24\"\n        android:viewportHeight=\"24\">\n\n    <path\n        android:name=\"path\"\n        android:fillColor=\"#fff\"\n        android:pathData=\"M17.68,9l-1.59,7L12.7,14.89l5-5.93M10,10.08l-3.57,3L5,12.55l5-2.47M21.25,2.28L0,12.8l6.83,2.57,9.76-8.21L9.26,15.89l8.29,2.67,3.7-16.27h0ZM 9.45 17.56 L 9.46 22 L 12.09 18.41 L 9.45 17.56 L 9.45 17.56 Z\" />\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/ic_service_connected.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<animated-vector\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:aapt=\"http://schemas.android.com/aapt\"\n    android:drawable=\"@drawable/ic_service_busy\">\n    <target android:name=\"path\">\n        <aapt:attr name=\"android:animation\">\n            <objectAnimator\n                android:propertyName=\"pathData\"\n                android:duration=\"@android:integer/config_mediumAnimTime\"\n                android:valueFrom=\"M 17.68 9 L 16.09 16 L 12.7 14.89 L 17.7 8.96 M 10 10.08 L 6.43 13.08 L 5 12.55 L 10 10.08 M 21.25 2.28 L 0 12.8 L 6.83 15.37 L 16.59 7.16 L 9.26 15.89 L 17.55 18.56 L 21.25 2.29 L 21.25 2.29 Z M 9.45 17.56 L 9.46 22 L 12.09 18.41 L 9.45 17.56 L 9.45 17.56 Z\"\n                android:valueTo=\"M 15.5 13.28 L 15.5 13.28 L 15.5 13.28 L 15.5 13.28 M 7.14 11.9 L 7.14 11.9 L 7.14 11.9 L 7.14 11.9 M 21.25 2.28 L 0 12.8 L 6.83 15.37 L 16.59 7.16 L 9.26 15.89 L 17.55 18.56 L 21.25 2.29 L 21.25 2.29 Z M 9.45 17.56 L 9.46 22 L 12.09 18.41 L 9.45 17.56 L 9.45 17.56 Z\"\n                android:valueType=\"pathType\"\n                android:interpolator=\"@android:interpolator/fast_out_slow_in\"/>\n        </aapt:attr>\n    </target>\n</animated-vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/ic_service_connecting.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<animated-vector\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:aapt=\"http://schemas.android.com/aapt\"\n    android:drawable=\"@drawable/ic_service_idle\">\n    <target android:name=\"strike_thru_path\">\n        <aapt:attr name=\"android:animation\">\n            <objectAnimator\n                android:propertyName=\"pathData\"\n                android:duration=\"@android:integer/config_mediumAnimTime\"\n                android:valueFrom=\"M 19.73 22 L 21 20.73 L 3.27 3 L 2 4.27 Z\"\n                android:valueTo=\"M 2 4.27 L 3.27 3 L 3.27 3 L 2 4.27 Z\"\n                android:valueType=\"pathType\"\n                android:interpolator=\"@android:interpolator/fast_out_slow_in\"/>\n        </aapt:attr>\n    </target>\n    <target android:name=\"strike_thru_mask\">\n        <aapt:attr name=\"android:animation\">\n            <objectAnimator\n                android:propertyName=\"pathData\"\n                android:duration=\"@android:integer/config_mediumAnimTime\"\n                android:valueFrom=\"M 0 0 L 24 0 L 24 24 L 0 24 L 0 0 Z M 4.54 1.73 L 3.27 3 L 21 20.73 L 22.27 19.46 Z\"\n                android:valueTo=\"M 0 0 L 24 0 L 24 24 L 0 24 L 0 0 Z M 4.54 1.73 L 3.27 3 L 3.27 3 L 4.54 1.73 Z\"\n                android:valueType=\"pathType\"\n                android:interpolator=\"@android:interpolator/fast_out_slow_in\"/>\n        </aapt:attr>\n    </target>\n</animated-vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/ic_service_idle.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24\"\n        android:viewportHeight=\"24\">\n    <path\n        android:name=\"strike_thru_path\"\n        android:pathData=\"M 19.73 22 L 21 20.73 L 3.27 3 L 2 4.27 Z\"\n        android:fillColor=\"#fff\"\n        android:strokeWidth=\"1\"/>\n    <clip-path\n        android:name=\"strike_thru_mask\"\n        android:pathData=\"M 0 0 L 24 0 L 24 24 L 0 24 L 0 0 Z M 4.54 1.73 L 3.27 3 L 21 20.73 L 22.27 19.46 Z\"/>\n    <path\n        android:name=\"holey_icon\"\n        android:pathData=\"M17.68,9l-1.59,7L12.7,14.89l5-5.93M10,10.08l-3.57,3L5,12.55l5-2.47M21.25,2.28L0,12.8l6.83,2.57,9.76-8.21L9.26,15.89l8.29,2.67,3.7-16.27h0ZM 9.45 17.56 L 9.46 22 L 12.09 18.41 L 9.45 17.56 L 9.45 17.56 Z\"\n        android:fillColor=\"#fff\"/>\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/ic_service_stopped.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<animated-vector\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:aapt=\"http://schemas.android.com/aapt\"\n    android:drawable=\"@drawable/ic_service_idle\">\n    <target android:name=\"strike_thru_path\">\n        <aapt:attr name=\"android:animation\">\n            <objectAnimator\n                android:propertyName=\"pathData\"\n                android:duration=\"@android:integer/config_mediumAnimTime\"\n                android:valueFrom=\"M 2 4.27 L 3.27 3 L 3.27 3 L 2 4.27 Z\"\n                android:valueTo=\"M 19.73 22 L 21 20.73 L 3.27 3 L 2 4.27 Z\"\n                android:valueType=\"pathType\"\n                android:interpolator=\"@android:interpolator/fast_out_slow_in\"/>\n        </aapt:attr>\n    </target>\n    <target android:name=\"strike_thru_mask\">\n        <aapt:attr name=\"android:animation\">\n            <objectAnimator\n                android:propertyName=\"pathData\"\n                android:duration=\"@android:integer/config_mediumAnimTime\"\n                android:valueFrom=\"M 0 0 L 24 0 L 24 24 L 0 24 L 0 0 Z M 4.54 1.73 L 3.27 3 L 3.27 3 L 4.54 1.73 Z\"\n                android:valueTo=\"M 0 0 L 24 0 L 24 24 L 0 24 L 0 0 Z M 4.54 1.73 L 3.27 3 L 21 20.73 L 22.27 19.46 Z\"\n                android:valueType=\"pathType\"\n                android:interpolator=\"@android:interpolator/fast_out_slow_in\"/>\n        </aapt:attr>\n    </target>\n</animated-vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/ic_service_stopping.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<animated-vector\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:aapt=\"http://schemas.android.com/aapt\"\n    android:drawable=\"@drawable/ic_service_busy\">\n    <target android:name=\"path\">\n        <aapt:attr name=\"android:animation\">\n            <objectAnimator\n                android:propertyName=\"pathData\"\n                android:duration=\"@android:integer/config_mediumAnimTime\"\n                android:valueFrom=\"M 15.5 13.28 L 15.5 13.28 L 15.5 13.28 L 15.5 13.28 M 7.14 11.9 L 7.14 11.9 L 7.14 11.9 L 7.14 11.9 M 21.25 2.28 L 0 12.8 L 6.83 15.37 L 16.59 7.16 L 9.26 15.89 L 17.55 18.56 L 21.25 2.29 L 21.25 2.29 Z M 9.45 17.56 L 9.46 22 L 12.09 18.41 L 9.45 17.56 L 9.45 17.56 Z\"\n                android:valueTo=\"M 17.68 9 L 16.09 16 L 12.7 14.89 L 17.7 8.96 M 10 10.08 L 6.43 13.08 L 5 12.55 L 10 10.08 M 21.25 2.28 L 0 12.8 L 6.83 15.37 L 16.59 7.16 L 9.26 15.89 L 17.55 18.56 L 21.25 2.29 L 21.25 2.29 Z M 9.45 17.56 L 9.46 22 L 12.09 18.41 L 9.45 17.56 L 9.45 17.56 Z\"\n                android:valueType=\"pathType\"\n                android:interpolator=\"@android:interpolator/fast_out_slow_in\"/>\n        </aapt:attr>\n    </target>\n</animated-vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/ic_settings_password.xml",
    "content": "<!-- https://android.googlesource.com/platform/packages/apps/Settings/+/7961482/res/drawable/ic_password.xml -->\n<!--\n    Copyright (C) 2017 The Android Open Source Project\n    Licensed under the Apache License, Version 2.0 (the \"License\");\n    you may not use this file except in compliance with the License.\n    You may obtain a copy of the License at\n         http://www.apache.org/licenses/LICENSE-2.0\n    Unless required by applicable law or agreed to in writing, software\n    distributed under the License is distributed on an \"AS IS\" BASIS,\n    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n    See the License for the specific language governing permissions and\n    limitations under the License.\n-->\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportHeight=\"24.0\"\n    android:viewportWidth=\"24.0\">\n    <path\n        android:fillColor=\"?attr/colorControlNormal\"\n        android:pathData=\"M21.5,9.39l-1.63,0l0.81,-1.42l-0.86,-0.5l-0.82,1.42l-0.82,-1.42l-0.86,0.5l0.81,1.42l-1.63,0l0,1l1.63,0l-0.81,1.41l0.86,0.5l0.82,-1.41l0.82,1.41l0.86,-0.5l-0.81,-1.41l1.63,0z\" />\n    <path\n        android:fillColor=\"?attr/colorControlNormal\"\n        android:pathData=\"M13.68,7.97l-0.86,-0.5l-0.82,1.42l-0.82,-1.42l-0.86,0.5l0.81,1.42l-1.63,0l0,1l1.63,0l-0.81,1.41l0.86,0.5l0.82,-1.41l0.82,1.41l0.86,-0.5l-0.81,-1.41l1.63,0l0,-1l-1.63,0z\" />\n    <path\n        android:fillColor=\"?attr/colorControlNormal\"\n        android:pathData=\"M6.68,7.97l-0.86,-0.5l-0.82,1.42l-0.82,-1.42l-0.86,0.5l0.81,1.42l-1.63,0l0,1l1.63,0l-0.81,1.41l0.86,0.5l0.82,-1.41l0.82,1.41l0.86,-0.5l-0.81,-1.41l1.63,0l0,-1l-1.63,0z\" />\n    <path\n        android:fillColor=\"?attr/colorControlNormal\"\n        android:pathData=\"M21,17.89H3c-0.28,0 -0.5,-0.22 -0.5,-0.5v-1c0,-0.28 0.22,-0.5 0.5,-0.5h18c0.28,0 0.5,0.22 0.5,0.5v1C21.5,17.66 21.28,17.89 21,17.89z\" />\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/ic_social_emoji_symbols.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\"\n    android:tint=\"?attr/colorControlNormal\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M3,2h8v2h-8z\"/>\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M6,11l2,0l0,-4l3,0l0,-2l-8,0l0,2l3,0z\"/>\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M12.4036,20.1819l7.7781,-7.7781l1.4142,1.4142l-7.7781,7.7781z\"/>\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M14.5,14.5m-1.5,0a1.5,1.5 0,1 1,3 0a1.5,1.5 0,1 1,-3 0\"/>\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M19.5,19.5m-1.5,0a1.5,1.5 0,1 1,3 0a1.5,1.5 0,1 1,-3 0\"/>\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M15.5,11c1.38,0 2.5,-1.12 2.5,-2.5V4h3V2h-4v4.51C16.58,6.19 16.07,6 15.5,6C14.12,6 13,7.12 13,8.5C13,9.88 14.12,11 15.5,11z\"/>\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M9.74,15.96l-1.41,1.41l-0.71,-0.71l0.35,-0.35c0.98,-0.98 0.98,-2.56 0,-3.54c-0.49,-0.49 -1.13,-0.73 -1.77,-0.73c-0.64,0 -1.28,0.24 -1.77,0.73c-0.98,0.98 -0.98,2.56 0,3.54l0.35,0.35l-1.06,1.06c-0.98,0.98 -0.98,2.56 0,3.54C4.22,21.76 4.86,22 5.5,22s1.28,-0.24 1.77,-0.73l1.06,-1.06l1.41,1.41l1.41,-1.41l-1.41,-1.41l1.41,-1.41L9.74,15.96zM5.85,14.2c0.12,-0.12 0.26,-0.15 0.35,-0.15s0.23,0.03 0.35,0.15c0.19,0.2 0.19,0.51 0,0.71l-0.35,0.35L5.85,14.9C5.66,14.71 5.66,14.39 5.85,14.2zM5.85,19.85C5.73,19.97 5.59,20 5.5,20s-0.23,-0.03 -0.35,-0.15c-0.19,-0.19 -0.19,-0.51 0,-0.71l1.06,-1.06l0.71,0.71L5.85,19.85z\"/>\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/ic_social_share.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:autoMirrored=\"true\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\"\n        android:tint=\"?attr/colorControlNormal\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M18,16.08c-0.76,0 -1.44,0.3 -1.96,0.77L8.91,12.7c0.05,-0.23 0.09,-0.46 0.09,-0.7s-0.04,-0.47 -0.09,-0.7l7.05,-4.11c0.54,0.5 1.25,0.81 2.04,0.81 1.66,0 3,-1.34 3,-3s-1.34,-3 -3,-3 -3,1.34 -3,3c0,0.24 0.04,0.47 0.09,0.7L8.04,9.81C7.5,9.31 6.79,9 6,9c-1.66,0 -3,1.34 -3,3s1.34,3 3,3c0.79,0 1.5,-0.31 2.04,-0.81l7.12,4.16c-0.05,0.21 -0.08,0.43 -0.08,0.65 0,1.61 1.31,2.92 2.92,2.92 1.61,0 2.92,-1.31 2.92,-2.92s-1.31,-2.92 -2.92,-2.92z\"/>\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable-v26/ic_qu_camera_launcher.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<adaptive-icon xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <background android:drawable=\"@color/material_grey_100\"/>\n    <foreground>\n        <!-- 44dp icon scaled to 52dp in 72dp, padding = (1-52/44*24/72)/2 -->\n        <inset\n            android:drawable=\"@drawable/ic_image_camera_alt\"\n            android:inset=\"30.303%\"/>\n    </foreground>\n</adaptive-icon>"
  },
  {
    "path": "mobile/src/main/res/drawable-v26/ic_qu_shadowsocks_launcher.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<adaptive-icon xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <background android:drawable=\"@color/material_grey_100\"/>\n    <foreground>\n        <!-- 44dp icon scaled to 52dp in 72dp, padding = (1-52/44*24/72)/2 -->\n        <inset\n            android:drawable=\"@drawable/ic_qu_shadowsocks_foreground\"\n            android:inset=\"30.303%\"/>\n    </foreground>\n</adaptive-icon>"
  },
  {
    "path": "mobile/src/main/res/layout/dialog_acl_rule.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n              xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n              android:orientation=\"vertical\"\n              android:layout_width=\"match_parent\"\n              android:layout_height=\"match_parent\"\n              android:padding=\"16dp\">\n    <Spinner android:id=\"@+id/template_selector\"\n             android:layout_width=\"match_parent\"\n             android:layout_height=\"wrap_content\"\n             android:labelFor=\"@+id/content\"\n             android:entries=\"@array/acl_rule_templates\"/>\n    <Space\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"16dp\"/>\n    <com.google.android.material.textfield.TextInputLayout\n        android:id=\"@+id/content_layout\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        app:errorEnabled=\"true\">\n        <com.google.android.material.textfield.TextInputEditText\n            android:id=\"@+id/content\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:paddingTop=\"12dp\"\n            android:inputType=\"textNoSuggestions|textMultiLine\"/>\n    </com.google.android.material.textfield.TextInputLayout>\n</LinearLayout>\n"
  },
  {
    "path": "mobile/src/main/res/layout/dialog_subscription.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n              xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n              android:orientation=\"vertical\"\n              android:layout_width=\"match_parent\"\n              android:layout_height=\"match_parent\"\n              android:padding=\"16dp\">\n    <com.google.android.material.textfield.TextInputLayout\n        android:id=\"@+id/content_layout\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        app:errorEnabled=\"true\">\n        <com.google.android.material.textfield.TextInputEditText\n            android:id=\"@+id/content\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:paddingTop=\"12dp\"\n            android:inputType=\"textNoSuggestions|textMultiLine\"/>\n    </com.google.android.material.textfield.TextInputLayout>\n</LinearLayout>\n"
  },
  {
    "path": "mobile/src/main/res/layout/icon_list_item_2.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n              xmlns:tools=\"http://schemas.android.com/tools\"\n              android:layout_width=\"match_parent\"\n              android:layout_height=\"wrap_content\"\n              android:background=\"?android:attr/selectableItemBackground\"\n              android:paddingStart=\"12dp\"\n              android:paddingEnd=\"12dp\"\n              android:focusable=\"true\">\n    <ImageView android:id=\"@android:id/icon\"\n               android:layout_width=\"52dp\"\n               android:layout_height=\"52dp\"\n               android:importantForAccessibility=\"no\"/>\n    <Space android:layout_width=\"4dp\"\n           android:layout_height=\"wrap_content\"/>\n    <LinearLayout android:orientation=\"vertical\"\n                  android:layout_width=\"0dp\"\n                  android:layout_height=\"wrap_content\"\n                  android:layout_weight=\"1\"\n                  android:layout_gravity=\"center_vertical\">\n        <TextView android:id=\"@android:id/text1\"\n                  android:textAppearance=\"?android:attr/textAppearance\"\n                  android:layout_width=\"match_parent\"\n                  android:layout_height=\"wrap_content\"\n                  android:maxLines=\"2\"\n                  android:ellipsize=\"end\"/>\n        <TextView android:id=\"@android:id/text2\"\n                  android:textAppearance=\"?android:attr/textAppearanceSmall\"\n                  android:layout_width=\"match_parent\"\n                  android:layout_height=\"wrap_content\"\n                  android:maxLines=\"2\"\n                  android:ellipsize=\"end\"/>\n    </LinearLayout>\n    <ImageView\n        android:id=\"@+id/unlock\"\n        android:layout_width=\"36dp\"\n        android:layout_height=\"36dp\"\n        android:layout_gravity=\"center\"\n        android:paddingStart=\"12dp\"\n        android:src=\"@drawable/ic_action_lock_open\"\n        android:tint=\"@color/material_amber_a700\"\n        android:importantForAccessibility=\"no\"\n        tools:ignore=\"RtlSymmetry\" />\n</LinearLayout>\n"
  },
  {
    "path": "mobile/src/main/res/layout/layout_about.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:orientation=\"vertical\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:id=\"@+id/about_container\"\n    android:fitsSystemWindows=\"true\">\n    <include layout=\"@layout/toolbar_light_dark\"/>\n    <androidx.core.widget.NestedScrollView\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        app:layout_behavior=\"@string/appbar_scrolling_view_behavior\"\n        android:scrollbars=\"vertical\">\n        <com.github.shadowsocks.widget.AutoCollapseTextView\n            android:id=\"@+id/tv_about\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:padding=\"16dp\"\n            android:textIsSelectable=\"true\"\n            android:textAppearance=\"@style/TextAppearance.AppCompat.Body1\"/>\n    </androidx.core.widget.NestedScrollView>\n</LinearLayout>\n"
  },
  {
    "path": "mobile/src/main/res/layout/layout_apps.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:orientation=\"vertical\"\n    android:duplicateParentState=\"false\">\n  <com.google.android.material.appbar.MaterialToolbar\n      android:layout_height=\"?attr/actionBarSize\"\n      android:layout_width=\"match_parent\"\n      android:background=\"?attr/colorPrimary\"\n      android:elevation=\"4dp\"\n      android:touchscreenBlocksFocus=\"false\"\n      android:theme=\"@style/ThemeOverlay.AppCompat.Dark.ActionBar\"\n      app:popupTheme=\"@style/ThemeOverlay.AppCompat.DayNight\"\n      android:id=\"@+id/toolbar\">\n\n    <SearchView\n        android:id=\"@+id/search\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_centerHorizontal=\"true\"\n        android:iconifiedByDefault=\"false\"\n        android:queryHint=\"@android:string/search_go\"/>\n\n  </com.google.android.material.appbar.MaterialToolbar>\n\n  <androidx.constraintlayout.widget.ConstraintLayout\n      android:layout_width=\"fill_parent\"\n      android:layout_height=\"wrap_content\"\n      android:background=\"?android:colorBackground\"\n      android:elevation=\"1dp\">\n\n    <TextView\n        android:id=\"@+id/tv_mode\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginStart=\"16dp\"\n        android:minWidth=\"42dp\"\n        android:text=\"@string/proxied_apps_mode\"\n        app:layout_constraintBottom_toBottomOf=\"@+id/bypassGroup\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"@+id/bypassGroup\" />\n\n    <RadioGroup\n        android:id=\"@+id/bypassGroup\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginStart=\"8dp\"\n        android:layout_marginEnd=\"8dp\"\n        android:orientation=\"horizontal\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toEndOf=\"@+id/tv_mode\"\n        app:layout_constraintTop_toTopOf=\"parent\">\n\n      <androidx.appcompat.widget.AppCompatRadioButton\n          android:id=\"@+id/btn_off\"\n          android:layout_width=\"0dp\"\n          android:layout_height=\"wrap_content\"\n          android:layout_weight=\"1\"\n          android:text=\"@string/off\" />\n\n      <androidx.appcompat.widget.AppCompatRadioButton\n          android:id=\"@+id/btn_on\"\n          android:layout_width=\"0dp\"\n          android:layout_height=\"wrap_content\"\n          android:layout_weight=\"1\"\n          android:text=\"@string/on\" />\n\n      <androidx.appcompat.widget.AppCompatRadioButton\n          android:id=\"@+id/btn_bypass\"\n          android:layout_width=\"0dp\"\n          android:layout_height=\"wrap_content\"\n          android:layout_weight=\"1\"\n          android:text=\"@string/bypass_apps\"\n          tools:checked=\"true\"\n          app:tooltipText=\"@string/bypass_apps_summary\" />\n    </RadioGroup>\n\n  </androidx.constraintlayout.widget.ConstraintLayout>\n\n  <androidx.coordinatorlayout.widget.CoordinatorLayout\n      android:id=\"@+id/snackbar\"\n      android:layout_width=\"match_parent\"\n      android:layout_height=\"0dp\"\n      android:layout_weight=\"1\">\n    <ProgressBar android:id=\"@+id/loading\"\n                 android:layout_width=\"wrap_content\"\n                 android:layout_height=\"wrap_content\"\n                 android:layout_gravity=\"center\" />\n    <androidx.recyclerview.widget.RecyclerView\n            android:layout_width=\"fill_parent\"\n            android:layout_height=\"fill_parent\"\n            android:id=\"@+id/list\"\n            android:clipToPadding=\"false\"\n            android:visibility=\"gone\"\n            tools:listitem=\"@layout/layout_apps_item\"\n            tools:visibility=\"visible\"/>\n  </androidx.coordinatorlayout.widget.CoordinatorLayout>\n</LinearLayout>\n"
  },
  {
    "path": "mobile/src/main/res/layout/layout_apps_item.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:id=\"@+id/linearLayout\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:background=\"?android:attr/selectableItemBackground\"\n    android:focusable=\"true\">\n\n    <ImageView\n        android:id=\"@+id/itemicon\"\n        android:layout_width=\"40dp\"\n        android:layout_height=\"40dp\"\n        android:layout_marginStart=\"16dp\"\n        android:layout_marginTop=\"8dp\"\n        android:layout_marginBottom=\"8dp\"\n        android:importantForAccessibility=\"no\"\n        android:scaleType=\"fitCenter\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\"\n        tools:src=\"@android:drawable/sym_def_app_icon\" />\n\n    <TextView\n        android:id=\"@+id/title\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginStart=\"16dp\"\n        android:layout_marginTop=\"4dp\"\n        android:layout_marginEnd=\"8dp\"\n        android:ellipsize=\"end\"\n        android:textColor=\"?android:attr/textColorSecondary\"\n        android:textSize=\"18sp\"\n        app:layout_constraintEnd_toStartOf=\"@+id/itemcheck\"\n        app:layout_constraintStart_toEndOf=\"@+id/itemicon\"\n        app:layout_constraintTop_toTopOf=\"parent\"\n        tools:text=\"Package label\" />\n\n    <TextView\n        android:id=\"@+id/desc\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"4dp\"\n        android:layout_marginBottom=\"4dp\"\n        android:ellipsize=\"end\"\n        android:textColor=\"?android:attr/textColorTertiary\"\n        android:textSize=\"12sp\"\n        android:breakStrategy=\"high_quality\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintEnd_toEndOf=\"@+id/title\"\n        app:layout_constraintStart_toStartOf=\"@+id/title\"\n        app:layout_constraintTop_toBottomOf=\"@+id/title\"\n        tools:text=\"com.package.name (10000)\" />\n\n    <Switch\n        android:id=\"@+id/itemcheck\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginEnd=\"16dp\"\n        android:clickable=\"false\"\n        android:focusable=\"false\"\n        android:focusableInTouchMode=\"false\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\" />\n\n</androidx.constraintlayout.widget.ConstraintLayout>\n"
  },
  {
    "path": "mobile/src/main/res/layout/layout_custom_rules.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:fitsSystemWindows=\"true\"\n    android:orientation=\"vertical\">\n    <include layout=\"@layout/toolbar_light_dark\"/>\n    <FrameLayout android:layout_width=\"match_parent\"\n                 android:layout_height=\"0dp\"\n                 android:layout_weight=\"1\">\n        <androidx.recyclerview.widget.RecyclerView\n            android:id=\"@+id/list\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            android:clipToPadding=\"false\"\n            tools:listitem=\"@android:layout/simple_list_item_1\"/>\n    </FrameLayout>\n</LinearLayout>\n"
  },
  {
    "path": "mobile/src/main/res/layout/layout_global_settings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n              android:orientation=\"vertical\"\n              android:layout_width=\"match_parent\"\n              android:layout_height=\"match_parent\"\n              android:fitsSystemWindows=\"true\">\n    <include layout=\"@layout/toolbar_light_dark\" />\n    <androidx.fragment.app.FragmentContainerView\n        android:id=\"@+id/content\"\n        android:name=\"com.github.shadowsocks.GlobalSettingsPreferenceFragment\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"0dp\"\n        android:layout_weight=\"1\"/>\n</LinearLayout>\n"
  },
  {
    "path": "mobile/src/main/res/layout/layout_list.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n              xmlns:tools=\"http://schemas.android.com/tools\"\n              android:layout_width=\"match_parent\"\n              android:layout_height=\"match_parent\"\n              android:orientation=\"vertical\"\n              android:fitsSystemWindows=\"true\">\n    <include layout=\"@layout/toolbar_light_dark\"/>\n    <androidx.recyclerview.widget.RecyclerView android:id=\"@+id/list\"\n                                            tools:listitem=\"@layout/layout_profile\"\n                                            android:layout_width=\"match_parent\"\n                                            android:layout_height=\"0dp\"\n                                            android:layout_weight=\"1\"\n                                            android:scrollbars=\"vertical\"\n                                            android:clipChildren=\"false\"\n                                            android:clipToPadding=\"false\"/>\n</LinearLayout>\n"
  },
  {
    "path": "mobile/src/main/res/layout/layout_main.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.drawerlayout.widget.DrawerLayout\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:id=\"@+id/drawer\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:fitsSystemWindows=\"true\">\n    <androidx.coordinatorlayout.widget.CoordinatorLayout\n        android:id=\"@+id/snackbar\"\n        android:clipChildren=\"false\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:fitsSystemWindows=\"true\">\n\n        <androidx.coordinatorlayout.widget.CoordinatorLayout\n            android:id=\"@+id/fragment_holder\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            android:fitsSystemWindows=\"true\"/>\n\n        <!-- We double trackThickness as half of it will be invisible -->\n        <com.google.android.material.progressindicator.CircularProgressIndicator\n            android:id=\"@+id/fabProgress\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:max=\"1\"\n            android:visibility=\"invisible\"\n            app:layout_anchor=\"@+id/fab\"\n            app:layout_anchorGravity=\"center\"\n            app:layout_behavior=\".widget.FabProgressBehavior\"\n            app:indicatorColor=\"@color/material_accent_200\"\n            app:trackThickness=\"8dp\"\n            app:trackCornerRadius=\"@dimen/mtrl_progress_track_thickness\"/>\n        <com.github.shadowsocks.widget.ServiceButton\n            android:id=\"@+id/fab\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:elevation=\"6dp\"\n            android:nextFocusDown=\"@+id/stats\"\n            app:layout_anchor=\"@id/stats\"\n            app:backgroundTint=\"@color/background_service\"\n            app:fabSize=\"normal\"\n            app:pressedTranslationZ=\"6dp\"\n            app:srcCompat=\"@drawable/ic_service_idle\"/>\n\n        <com.github.shadowsocks.widget.StatsBar\n            android:id=\"@+id/stats\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_gravity=\"bottom\"\n            android:fitsSystemWindows=\"true\"\n            android:nextFocusUp=\"@+id/fab\"\n            app:backgroundTint=\"@color/background_stat\"\n            app:contentInsetStart=\"0dp\"\n            app:layout_scrollFlags=\"enterAlways|scroll\"\n            app:hideOnScroll=\"true\">\n\n            <GridLayout\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:background=\"?android:attr/selectableItemBackground\"\n                android:orientation=\"vertical\"\n                android:padding=\"16dip\">\n\n                <TextView\n                    android:id=\"@+id/tx\"\n                    android:layout_width=\"0dp\"\n                    android:layout_height=\"wrap_content\"\n                    android:ellipsize=\"marquee\"\n                    android:singleLine=\"true\"\n                    android:textColor=\"?android:attr/textColorSecondary\"\n                    android:textSize=\"14sp\"\n                    android:layout_gravity=\"fill_horizontal\"\n                    android:layout_columnWeight=\"1\"/>\n\n                <TextView\n                    android:id=\"@+id/txRate\"\n                    android:layout_width=\"0dp\"\n                    android:layout_height=\"wrap_content\"\n                    android:ellipsize=\"marquee\"\n                    android:singleLine=\"true\"\n                    android:gravity=\"end\"\n                    android:textColor=\"?android:attr/textColorSecondary\"\n                    android:textSize=\"14sp\"\n                    android:layout_gravity=\"fill_horizontal\"\n                    android:layout_row=\"0\"\n                    android:layout_column=\"2\"\n                    android:layout_columnWeight=\"1\"/>\n\n                <TextView\n                    android:id=\"@+id/rx\"\n                    android:layout_width=\"0dp\"\n                    android:layout_height=\"wrap_content\"\n                    android:ellipsize=\"marquee\"\n                    android:singleLine=\"true\"\n                    android:textColor=\"?android:attr/textColorSecondary\"\n                    android:textSize=\"14sp\"\n                    android:layout_gravity=\"fill_horizontal\"\n                    android:layout_column=\"0\"\n                    android:layout_columnWeight=\"1\"\n                    android:layout_row=\"1\"/>\n\n                <TextView\n                    android:id=\"@+id/rxRate\"\n                    android:layout_width=\"0dp\"\n                    android:layout_height=\"wrap_content\"\n                    android:ellipsize=\"marquee\"\n                    android:singleLine=\"true\"\n                    android:gravity=\"end\"\n                    android:textColor=\"?android:attr/textColorSecondary\"\n                    android:textSize=\"14sp\"\n                    android:layout_gravity=\"fill_horizontal\"\n                    android:layout_column=\"2\"\n                    android:layout_columnWeight=\"1\"\n                    android:layout_row=\"1\"/>\n\n                <TextView\n                    android:id=\"@+id/status\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:maxLines=\"1\"\n                    android:textColor=\"?android:attr/textColorPrimary\"\n                    android:textSize=\"16sp\"\n                    android:layout_gravity=\"fill_horizontal\"\n                    android:layout_row=\"2\"\n                    android:layout_column=\"0\"\n                    android:layout_columnSpan=\"3\"\n                    android:ellipsize=\"end\"\n                    tools:text=\"@string/connection_test_available\"/>\n\n            </GridLayout>\n\n        </com.github.shadowsocks.widget.StatsBar>\n\n    </androidx.coordinatorlayout.widget.CoordinatorLayout>\n\n    <com.google.android.material.navigation.NavigationView\n        android:id=\"@+id/navigation\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"match_parent\"\n        android:layout_gravity=\"start\"\n        app:insetForeground=\"@null\"\n        app:itemIconTint=\"@color/nav_item_tint\"\n        app:itemTextColor=\"@color/nav_item_tint\"\n        app:headerLayout=\"@layout/navigation_header\"\n        app:menu=\"@menu/navigation_main\" />\n</androidx.drawerlayout.widget.DrawerLayout>\n"
  },
  {
    "path": "mobile/src/main/res/layout/layout_profile.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!-- Based on: https://github.com/android/platform_frameworks_base/blob/505e3ab/core/res/res/layout/simple_list_item_2.xml -->\n<LinearLayout\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:id=\"@+id/content\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:background=\"@drawable/background_profile\"\n    android:focusable=\"true\"\n    android:nextFocusRight=\"@+id/edit\"\n    android:orientation=\"vertical\">\n\n    <LinearLayout\n        android:id=\"@+id/container\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginLeft=\"16dp\"\n        >\n\n        <TextView\n            android:id=\"@android:id/text1\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"wrap_content\"\n            android:layout_gravity=\"center_vertical\"\n            android:layout_weight=\"1\"\n            android:ellipsize=\"end\"\n            android:gravity=\"center_vertical\"\n            android:maxLines=\"2\"\n            android:textAppearance=\"?android:attr/textAppearanceMedium\"\n            android:textColor=\"?android:attr/textColorPrimary\"\n            android:textStyle=\"bold\"\n            tools:text=\"@string/profile_name\"/>\n\n        <androidx.appcompat.widget.AppCompatImageView\n            android:id=\"@+id/subscription\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_gravity=\"top\"\n            android:background=\"?attr/selectableItemBackgroundBorderless\"\n            android:contentDescription=\"@string/subscriptions\"\n            android:focusable=\"true\"\n            android:padding=\"12dp\"\n            android:visibility=\"gone\"\n            app:srcCompat=\"@drawable/ic_file_cloud_queue\"/>\n\n        <androidx.appcompat.widget.AppCompatImageView\n            android:id=\"@+id/edit\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_gravity=\"top\"\n            android:background=\"?attr/selectableItemBackgroundBorderless\"\n            android:contentDescription=\"@string/edit\"\n            android:focusable=\"true\"\n            android:padding=\"12dp\"\n            app:srcCompat=\"@drawable/ic_image_edit\"/>\n\n        <androidx.appcompat.widget.AppCompatImageView\n            android:id=\"@+id/share\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_gravity=\"top\"\n            android:background=\"?attr/selectableItemBackgroundBorderless\"\n            android:contentDescription=\"@string/share\"\n            android:focusable=\"true\"\n            android:nextFocusLeft=\"@+id/container\"\n            android:padding=\"12dp\"\n            app:srcCompat=\"@drawable/ic_social_share\"/>\n    </LinearLayout>\n\n    <RelativeLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginLeft=\"16dp\"\n        >\n\n        <com.github.shadowsocks.widget.AutoCollapseTextView\n            android:id=\"@android:id/text2\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_alignParentStart=\"true\"\n            android:layout_marginBottom=\"@dimen/profile_padding\"\n            android:layout_marginEnd=\"12dp\"\n            android:layout_toStartOf=\"@+id/traffic\"\n            android:ellipsize=\"end\"\n            android:maxLines=\"2\"\n            android:textAppearance=\"?android:attr/textAppearanceSmall\"\n            android:textColor=\"?android:attr/textColorSecondary\"\n            tools:text=\"@string/profile_plugin\"/>\n\n        <com.github.shadowsocks.widget.AutoCollapseTextView\n            android:id=\"@+id/traffic\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_alignParentEnd=\"true\"\n            android:layout_gravity=\"bottom\"\n            android:layout_marginBottom=\"@dimen/profile_padding\"\n            android:layout_marginEnd=\"12dp\"\n            android:ellipsize=\"end\"\n            android:textAppearance=\"?android:attr/textAppearanceSmall\"\n            android:textColor=\"?android:attr/textColorSecondary\"\n            tools:text=\"@string/traffic\"/>\n    </RelativeLayout>\n\n</LinearLayout>\n"
  },
  {
    "path": "mobile/src/main/res/layout/layout_profile_config.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n              android:orientation=\"vertical\"\n              android:layout_width=\"match_parent\"\n              android:layout_height=\"match_parent\">\n    <include layout=\"@layout/toolbar_light_dark\" />\n    <androidx.fragment.app.FragmentContainerView\n        android:id=\"@+id/content\"\n        android:name=\"com.github.shadowsocks.ProfileConfigFragment\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"0dp\"\n        android:layout_weight=\"1\"/>\n</LinearLayout>\n"
  },
  {
    "path": "mobile/src/main/res/layout/layout_scanner.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:orientation=\"vertical\">\n    <include layout=\"@layout/toolbar_light_dark\" />\n    <androidx.camera.view.PreviewView\n        android:id=\"@+id/barcode\"\n        android:layout_width=\"fill_parent\"\n        android:layout_height=\"fill_parent\"/>\n</LinearLayout>\n"
  },
  {
    "path": "mobile/src/main/res/layout/layout_subscriptions.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:fitsSystemWindows=\"true\"\n    android:orientation=\"vertical\">\n\n    <include layout=\"@layout/toolbar_light_dark\" />\n\n    <FrameLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"0dp\"\n        android:layout_weight=\"1\">\n\n        <androidx.recyclerview.widget.RecyclerView\n            android:id=\"@+id/list\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            android:clipToPadding=\"false\"\n            tools:listitem=\"@android:layout/simple_list_item_1\" />\n    </FrameLayout>\n</LinearLayout>\n"
  },
  {
    "path": "mobile/src/main/res/layout/layout_tasker.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n              xmlns:tools=\"http://schemas.android.com/tools\"\n              android:orientation=\"vertical\"\n              android:layout_width=\"match_parent\"\n              android:layout_height=\"match_parent\">\n    <include layout=\"@layout/toolbar_light_dark\" />\n    <FrameLayout android:layout_width=\"match_parent\"\n                 android:layout_height=\"wrap_content\"\n                 android:elevation=\"1dp\"\n                 android:background=\"@android:color/white\">\n        <Switch android:id=\"@+id/serviceSwitch\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:text=\"@string/toggle_service_state\"\n                android:textSize=\"18sp\"\n                android:padding=\"16dp\"/>\n    </FrameLayout>\n    <androidx.recyclerview.widget.RecyclerView\n        android:id=\"@+id/list\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:clipToPadding=\"false\"\n        android:scrollbars=\"vertical\"\n        tools:itemview=\"@android:layout/select_dialog_singlechoice_material\"/>\n</LinearLayout>\n"
  },
  {
    "path": "mobile/src/main/res/layout/layout_udp_fallback.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n              xmlns:tools=\"http://schemas.android.com/tools\"\n              android:orientation=\"vertical\"\n              android:layout_width=\"match_parent\"\n              android:layout_height=\"match_parent\">\n    <include layout=\"@layout/toolbar_light_dark\" />\n    <androidx.recyclerview.widget.RecyclerView android:id=\"@+id/list\"\n                                               android:layout_width=\"match_parent\"\n                                               android:layout_height=\"match_parent\"\n                                               android:clipToPadding=\"false\"\n                                               tools:itemview=\"@android:layout/select_dialog_singlechoice_material\"\n                                               android:scrollbars=\"vertical\"/>\n</LinearLayout>\n"
  },
  {
    "path": "mobile/src/main/res/layout/navigation_header.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n                xmlns:tools=\"http://schemas.android.com/tools\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\">\n    <ImageView android:layout_width=\"match_parent\"\n               android:layout_height=\"wrap_content\"\n               android:orientation=\"vertical\"\n               android:adjustViewBounds=\"true\"\n               android:importantForAccessibility=\"no\"\n               android:scaleType=\"centerCrop\"\n               android:src=\"@drawable/background_header\"/>\n\n    <TextView android:id=\"@+id/drawer_title\"\n              android:layout_width=\"match_parent\"\n              android:layout_height=\"wrap_content\"\n              android:layout_centerVertical=\"true\"\n              android:fontFamily=\"@font/iceland\"\n              android:gravity=\"center\"\n              android:text=\"shadowsocks\"\n              android:textColor=\"@android:color/white\"\n              android:textSize=\"32sp\"\n              tools:ignore=\"HardcodedText\"/>\n</RelativeLayout>\n"
  },
  {
    "path": "mobile/src/main/res/layout/preference_dialog_password.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!-- Based on: https://android.googlesource.com/platform/frameworks/support/+/b4cd329/preference/preference/res/layout/preference_dialog_edittext.xml -->\n<ScrollView\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:layout_marginTop=\"48dp\"\n    android:layout_marginBottom=\"48dp\"\n    android:overScrollMode=\"ifContentScrolls\">\n    <LinearLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:orientation=\"vertical\">\n        <TextView\n            android:id=\"@android:id/message\"\n            style=\"?android:attr/textAppearanceSmall\"\n            android:layout_marginLeft=\"24dp\"\n            android:layout_marginRight=\"24dp\"\n            android:layout_marginStart=\"24dp\"\n            android:layout_marginEnd=\"24dp\"\n            android:layout_marginBottom=\"48dp\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:textColor=\"?android:attr/textColorSecondary\"/>\n        <com.google.android.material.textfield.TextInputLayout\n            android:orientation=\"vertical\"\n            android:layout_marginLeft=\"20dp\"\n            android:layout_marginRight=\"20dp\"\n            android:layout_marginStart=\"20dp\"\n            android:layout_marginEnd=\"20dp\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            app:passwordToggleEnabled=\"true\">\n            <com.google.android.material.textfield.TextInputEditText\n                android:id=\"@android:id/edit\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:minHeight=\"48dp\"\n                android:paddingTop=\"12dp\"\n                android:singleLine=\"true\"\n                android:inputType=\"textPassword\"\n                android:typeface=\"monospace\"/>\n        </com.google.android.material.textfield.TextInputLayout>\n    </LinearLayout>\n</ScrollView>\n"
  },
  {
    "path": "mobile/src/main/res/menu/app_manager_menu.xml",
    "content": "<menu\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\">\n    <item android:id=\"@+id/action_apply_all\"\n          android:title=\"@string/action_apply_all\"\n          android:alphabeticShortcut=\"a\"\n          app:alphabeticModifiers=\"CTRL|SHIFT\"\n          app:showAsAction=\"never\"/>\n    <item\n        android:id=\"@+id/action_export_clipboard\"\n        android:alphabeticShortcut=\"c\"\n        android:icon=\"?attr/actionModeCopyDrawable\"\n        android:title=\"@string/action_export\"\n        app:showAsAction=\"ifRoom\"/>\n    <item\n        android:id=\"@+id/action_import_clipboard\"\n        android:alphabeticShortcut=\"v\"\n        android:icon=\"?attr/actionModePasteDrawable\"\n        android:title=\"@string/action_import\"\n        app:showAsAction=\"ifRoom\"/>\n</menu>\n"
  },
  {
    "path": "mobile/src/main/res/menu/custom_rules_menu.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<menu xmlns:android=\"http://schemas.android.com/apk/res/android\"\n      xmlns:app=\"http://schemas.android.com/apk/res-auto\">\n    <item android:title=\"@string/action_add_rule\"\n          android:icon=\"@drawable/ic_av_playlist_add\"\n          android:alphabeticShortcut=\"n\"\n          app:showAsAction=\"always\">\n        <menu>\n            <item android:id=\"@+id/action_manual_settings\"\n                  android:title=\"@string/add_profile_methods_manual_settings\"\n                  android:alphabeticShortcut=\"n\"\n                  app:alphabeticModifiers=\"CTRL|SHIFT\"/>\n            <item android:id=\"@+id/action_import_clipboard\"\n                  android:title=\"@string/action_import\"\n                  android:alphabeticShortcut=\"v\"/>\n            <item android:id=\"@+id/action_import_gfwlist\"\n                  android:title=\"@string/route_entry_gfwlist\"/>\n        </menu>\n    </item>\n</menu>\n"
  },
  {
    "path": "mobile/src/main/res/menu/custom_rules_selection.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<menu xmlns:android=\"http://schemas.android.com/apk/res/android\"\n      xmlns:tools=\"http://schemas.android.com/tools\"\n      tools:ignore=\"AppCompatResource\">\n    <item\n        android:id=\"@+id/action_select_all\"\n        android:alphabeticShortcut=\"a\"\n        android:icon=\"?attr/actionModeSelectAllDrawable\"\n        android:title=\"@android:string/selectAll\"\n        android:showAsAction=\"always\"/>\n    <item\n        android:id=\"@+id/action_cut\"\n        android:alphabeticShortcut=\"x\"\n        android:icon=\"?attr/actionModeCutDrawable\"\n        android:title=\"@android:string/cut\"\n        android:showAsAction=\"always\"/>\n    <item\n        android:id=\"@+id/action_copy\"\n        android:alphabeticShortcut=\"c\"\n        android:icon=\"?attr/actionModeCopyDrawable\"\n        android:title=\"@android:string/copy\"\n        android:showAsAction=\"always\"/>\n    <item\n        android:id=\"@+id/action_delete\"\n        android:alphabeticShortcut=\"d\"\n        android:icon=\"@drawable/ic_action_delete\"\n        android:title=\"@string/delete\"\n        android:showAsAction=\"always\"/>\n</menu>\n"
  },
  {
    "path": "mobile/src/main/res/menu/navigation_main.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<menu xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <group android:id=\"@+id/main\"\n           android:checkableBehavior=\"single\">\n        <item android:id=\"@+id/profiles\"\n              android:title=\"@string/profiles\"\n              android:icon=\"@drawable/ic_action_description\"/>\n        <item android:id=\"@+id/subscriptions\"\n            android:title=\"@string/subscriptions\"\n            android:icon=\"@drawable/ic_file_cloud_download\"/>\n        <item android:id=\"@+id/customRules\"\n              android:title=\"@string/custom_rules\"\n              android:icon=\"@drawable/ic_action_assignment\"/>\n        <item android:id=\"@+id/globalSettings\"\n              android:title=\"@string/settings\"\n              android:icon=\"@drawable/ic_action_settings\"/>\n    </group>\n    <group android:id=\"@+id/misc\"\n           android:checkableBehavior=\"single\">\n        <item android:id=\"@+id/faq\"\n              android:checkable=\"false\"\n              android:title=\"@string/faq\"\n              android:icon=\"@drawable/ic_action_help_outline\"/>\n        <item android:id=\"@+id/about\"\n              android:title=\"@string/about\"\n              android:icon=\"@drawable/ic_action_copyright\"/>\n    </group>\n</menu>\n"
  },
  {
    "path": "mobile/src/main/res/menu/profile_config_menu.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<menu xmlns:android=\"http://schemas.android.com/apk/res/android\"\n      xmlns:app=\"http://schemas.android.com/apk/res-auto\">\n    <item android:id=\"@+id/action_delete\"\n          android:title=\"@string/delete\"\n          android:icon=\"@drawable/ic_action_delete\"\n          android:alphabeticShortcut=\"d\"\n          app:showAsAction=\"always\"/>\n    <item android:id=\"@+id/action_apply\"\n          android:title=\"@string/apply\"\n          android:icon=\"@drawable/ic_action_done\"\n          android:alphabeticShortcut=\"s\"\n          app:showAsAction=\"always\"/>\n</menu>\n"
  },
  {
    "path": "mobile/src/main/res/menu/profile_manager_menu.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<menu xmlns:android=\"http://schemas.android.com/apk/res/android\"\n      xmlns:app=\"http://schemas.android.com/apk/res-auto\">\n    <item\n        android:alphabeticShortcut=\"n\"\n        android:icon=\"@drawable/ic_action_note_add\"\n        android:title=\"@string/add_profile\"\n        app:showAsAction=\"always\">\n        <menu>\n            <item\n                android:id=\"@+id/action_scan_qr_code\"\n                android:title=\"@string/add_profile_methods_scan_qr_code\"/>\n            <item\n                android:id=\"@+id/action_import_clipboard\"\n                android:alphabeticShortcut=\"v\"\n                android:title=\"@string/action_import\"/>\n            <item\n                android:id=\"@+id/action_import_file\"\n                android:alphabeticShortcut=\"o\"\n                android:title=\"@string/action_import_file\"/>\n            <item\n                android:id=\"@+id/action_replace_file\"\n                android:alphabeticShortcut=\"o\"\n                android:title=\"@string/action_replace_file\"\n                app:alphabeticModifiers=\"CTRL|SHIFT\"/>\n            <item\n                android:id=\"@+id/action_manual_settings\"\n                android:title=\"@string/add_profile_methods_manual_settings\"\n                android:alphabeticShortcut=\"n\"\n                app:alphabeticModifiers=\"CTRL|SHIFT\"/>\n        </menu>\n    </item>\n    <item\n        android:alphabeticShortcut=\"s\"\n        android:icon=\"@drawable/ic_file_file_upload\"\n        android:title=\"@string/action_export_more\"\n        app:showAsAction=\"always\">\n        <menu>\n            <item\n                android:id=\"@+id/action_export_clipboard\"\n                android:alphabeticShortcut=\"c\"\n                android:title=\"@string/action_export\"/>\n            <item\n                android:id=\"@+id/action_export_file\"\n                android:title=\"@string/action_export_file\"\n                android:alphabeticShortcut=\"s\"\n                app:alphabeticModifiers=\"CTRL|SHIFT\"/>\n        </menu>\n    </item>\n    <item android:id=\"@+id/action_search\"\n        android:title=\"@android:string/search_go\"\n        app:actionViewClass=\"androidx.appcompat.widget.SearchView\"\n        app:showAsAction=\"always\"/>\n</menu>\n"
  },
  {
    "path": "mobile/src/main/res/menu/profile_share_popup.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<menu xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item android:id=\"@+id/action_qr_code\"\n          android:title=\"@string/share_qr_nfc\"/>\n    <item android:id=\"@+id/action_export_clipboard\"\n          android:title=\"@string/action_export\"/>\n</menu>\n"
  },
  {
    "path": "mobile/src/main/res/menu/scanner_menu.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<menu xmlns:android=\"http://schemas.android.com/apk/res/android\"\n      xmlns:app=\"http://schemas.android.com/apk/res-auto\">\n    <item android:id=\"@+id/action_import_clipboard\"\n          android:title=\"@string/action_import_file\"\n          android:icon=\"@drawable/ic_image_photo\"\n          android:alphabeticShortcut=\"o\"\n          app:showAsAction=\"always\"/>\n</menu>"
  },
  {
    "path": "mobile/src/main/res/menu/subscription_menu.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<menu xmlns:android=\"http://schemas.android.com/apk/res/android\"\n      xmlns:app=\"http://schemas.android.com/apk/res-auto\">\n    <item android:title=\"@string/add_subscription\"\n        android:id=\"@+id/action_manual_settings\"\n          android:icon=\"@drawable/ic_av_playlist_add\"\n          android:alphabeticShortcut=\"n\"\n          app:showAsAction=\"always\"/>\n    <item android:title=\"@string/update_subscription\"\n        android:id=\"@+id/action_update_subscription\"\n        android:icon=\"@drawable/ic_file_cloud_download\"\n        android:alphabeticShortcut=\"r\"\n        app:showAsAction=\"ifRoom\"/>\n</menu>\n"
  },
  {
    "path": "mobile/src/main/res/raw/about.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"en\" lang=\"en\">\n    <head>\n        <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n    </head>\n    <body>\n        <p>A <a href=\"http://shadowsocks.org\">Shadowsocks</a> client for Android, written in Kotlin.</p>\n        <p>Copyright (C) 2017 by Max Lv <a href=\"&#x6d;&#97;&#x69;&#108;&#116;&#111;&#x3a;&#x6d;&#97;x&#46;&#99;.&#108;&#118;&#x40;&#103;&#109;&#97;&#x69;&#108;&#46;&#x63;&#x6f;&#109;\">&#x6d;&#97;&#x78;.&#x63;&#x2e;&#108;v&#64;&#x67;&#109;&#x61;&#x69;&#108;&#x2e;&#99;&#111;&#109;</a></p>\n        <p>Copyright (C) 2017 by Mygod Studio <a href=\"mailto:contact-shadowsocks-android@mygod.be\">contact-shadowsocks-android@mygod.be</a></p>\n        <p>This program is free software: you can redistribute it and/or modify\n            it under the terms of the GNU General Public License as published by\n            the Free Software Foundation, either version 3 of the License, or\n            (at your option) any later version.</p>\n        <p>This program is distributed in the hope that it will be useful,\n            but WITHOUT ANY WARRANTY; without even the implied warranty of\n            MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n            GNU General Public License for more details.</p>\n        <p>You should have received a copy of the GNU General Public License\n            along with this program. If not, see <a href=\"http://www.gnu.org/licenses/\">http://www.gnu.org/licenses/</a>.</p>\n        <h3>Open Source Licenses</h3>\n        <ul>\n            <li>redsocks: <a href=\"https://github.com/shadowsocks/redsocks/blob/shadowsocks-android/README\">APL 2.0</a>&nbsp;</li>\n            <li>libevent: <a href=\"https://github.com/shadowsocks/libevent/blob/master/LICENSE\">BSD</a>&nbsp;</li>\n            <li>tun2socks: <a href=\"https://github.com/shadowsocks/badvpn/blob/shadowsocks-android/COPYING\">BSD</a>&nbsp;</li>\n            <li>shadowsocks-rust: <a href=\"https://github.com/shadowsocks/shadowsocks-rust/blob/master/LICENSE\">MIT</a>&nbsp;</li>\n            <li>libsodium: <a href=\"https://github.com/jedisct1/libsodium/blob/master/LICENSE\">ISC</a>&nbsp;</li>\n            <li>OpenSSL: <a href=\"https://www.openssl.org/source/license-openssl-ssleay.txt\">OpenSSL License</a>&nbsp;</li>\n            <li><a href=\"#other-licenses\">Other licenses</a></li>\n        </ul>\n    </body>\n</html>\n"
  },
  {
    "path": "mobile/src/main/res/values/arrays.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string-array name=\"route_entry\">\n        <item>@string/route_entry_all</item>\n        <item>@string/route_entry_bypass_lan</item>\n        <item>@string/route_entry_bypass_chn</item>\n        <item>@string/route_entry_bypass_lan_chn</item>\n        <item>@string/route_entry_gfwlist</item>\n        <item>@string/route_entry_chinalist</item>\n        <item>@string/custom_rules</item>\n    </string-array>\n    <string-array name=\"route_value\" translatable=\"false\">\n        <item>all</item>\n        <item>bypass-lan</item>\n        <item>bypass-china</item>\n        <item>bypass-lan-china</item>\n        <item>gfwlist</item>\n        <item>china-list</item>\n        <item>custom-rules</item>\n    </string-array>\n\n    <string-array name=\"acl_rule_templates\" translatable=\"false\">\n        <item>@string/acl_rule_templates_generic</item>\n        <item>@string/acl_rule_templates_domain</item>\n        <item>@string/acl_rule_online_config</item>\n    </string-array>\n\n    <string-array name=\"service_modes\">\n        <item>@string/service_mode_proxy</item>\n        <item>@string/service_mode_vpn</item>\n        <item>@string/service_mode_transproxy</item>\n    </string-array>\n    <string-array name=\"service_mode_values\" translatable=\"false\">\n        <item>proxy</item>\n        <item>vpn</item>\n        <item>transproxy</item>\n    </string-array>\n</resources>\n"
  },
  {
    "path": "mobile/src/main/res/values/colors.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <color name=\"background_selected\">@color/material_primary_100</color>\n    <color name=\"background_stat\">@color/material_primary_300</color>\n    <color name=\"material_amber_a700\">#ffab00</color>\n</resources>\n"
  },
  {
    "path": "mobile/src/main/res/values/dimen.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <dimen name=\"qrcode_size\">264dp</dimen>\n    <dimen name=\"profile_padding\">8dp</dimen>\n    <dimen name=\"main_list_padding_bottom\">88dp</dimen>\n    <dimen name=\"bottom_sheet_padding\">8dp</dimen>\n</resources>\n"
  },
  {
    "path": "mobile/src/main/res/values/styles.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <style name=\"Theme.Shadowsocks.Immersive.Navigation\">\n        <item name=\"android:statusBarColor\">@android:color/transparent</item>\n    </style>\n</resources>\n"
  },
  {
    "path": "mobile/src/main/res/values-night/colors.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <color name=\"background_selected\">@color/material_primary_800</color>\n    <color name=\"background_stat\">@color/material_primary_600</color>\n</resources>"
  },
  {
    "path": "mobile/src/main/res/xml/pref_global.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<PreferenceScreen xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n                  app:initialExpandedChildrenCount=\"2\">\n    <SwitchPreference\n        app:key=\"isAutoConnect\"\n        app:icon=\"@drawable/ic_communication_phonelink_ring\"\n        app:summary=\"@string/auto_connect_summary\"\n        app:title=\"@string/auto_connect\"/>\n    <SwitchPreference\n        app:key=\"directBootAware\"\n        app:icon=\"@drawable/ic_action_lock\"\n        app:summary=\"@string/direct_boot_aware_summary\"\n        app:title=\"@string/direct_boot_aware\"/>\n\n    <com.takisoft.preferencex.SimpleMenuPreference\n        app:key=\"serviceMode\"\n        app:icon=\"@drawable/ic_device_developer_mode\"\n        app:entries=\"@array/service_modes\"\n        app:entryValues=\"@array/service_mode_values\"\n        app:defaultValue=\"vpn\"\n        app:title=\"@string/service_mode\"\n        app:useSimpleSummaryProvider=\"true\"/>\n    <EditTextPreference\n        app:key=\"portProxy\"\n        app:icon=\"@drawable/ic_maps_directions_boat\"\n        app:title=\"@string/port_proxy\"\n        app:useSimpleSummaryProvider=\"true\"/>\n    <EditTextPreference\n        app:key=\"portLocalDns\"\n        app:icon=\"@drawable/ic_action_dns\"\n        app:title=\"@string/port_local_dns\"\n        app:useSimpleSummaryProvider=\"true\"/>\n    <EditTextPreference\n        app:key=\"portTransproxy\"\n        app:title=\"@string/port_transproxy\"\n        app:useSimpleSummaryProvider=\"true\"/>\n</PreferenceScreen>\n"
  },
  {
    "path": "mobile/src/main/res/xml/pref_profile.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<PreferenceScreen xmlns:android=\"http://schemas.android.com/apk/res/android\"\n                  xmlns:app=\"http://schemas.android.com/apk/res-auto\">\n\n    <EditTextPreference\n            app:key=\"profileName\"\n            app:icon=\"@drawable/ic_social_emoji_symbols\"\n            app:title=\"@string/profile_name\"\n            app:useSimpleSummaryProvider=\"true\"/>\n\n    <PreferenceCategory\n            app:title=\"@string/proxy_cat\">\n\n        <EditTextPreference\n                app:key=\"proxy\"\n                app:icon=\"@drawable/ic_hardware_router\"\n                app:title=\"@string/proxy\"\n                app:useSimpleSummaryProvider=\"true\"/>\n        <EditTextPreference\n                app:key=\"remotePortNum\"\n                app:icon=\"@drawable/ic_maps_directions_boat\"\n                app:title=\"@string/remote_port\"\n                app:useSimpleSummaryProvider=\"true\"/>\n        <EditTextPreference\n                app:dialogLayout=\"@layout/preference_dialog_password\"\n                app:key=\"sitekey\"\n                app:icon=\"@drawable/ic_settings_password\"\n                app:title=\"@string/sitekey\"/>\n        <com.takisoft.preferencex.SimpleMenuPreference\n                app:key=\"encMethod\"\n                app:icon=\"@drawable/ic_notification_enhanced_encryption\"\n                app:entries=\"@array/enc_method_entry\"\n                app:entryValues=\"@array/enc_method_value\"\n                app:title=\"@string/enc_method\"\n                app:useSimpleSummaryProvider=\"true\"/>\n\n    </PreferenceCategory>\n\n    <PreferenceCategory\n            app:title=\"@string/feature_cat\">\n\n        <com.takisoft.preferencex.SimpleMenuPreference\n                app:key=\"route\"\n                app:icon=\"@drawable/ic_maps_directions\"\n                app:entries=\"@array/route_entry\"\n                app:entryValues=\"@array/route_value\"\n                app:title=\"@string/route_list\"\n                app:useSimpleSummaryProvider=\"true\"/>\n        <SwitchPreference\n                app:key=\"isIpv6\"\n                app:icon=\"@drawable/ic_image_looks_6\"\n                app:summary=\"@string/ipv6_summary\"\n                app:title=\"@string/ipv6\"/>\n        <SwitchPreference\n                app:key=\"isProxyApps\"\n                app:icon=\"@drawable/ic_navigation_apps\"\n                app:summary=\"@string/proxied_apps_summary\"\n                app:title=\"@string/proxied_apps\"/>\n        <SwitchPreference\n                app:key=\"metered\"\n                app:icon=\"@drawable/ic_device_data_usage\"\n                app:summary=\"@string/metered_summary\"\n                app:title=\"@string/metered\"/>\n        <EditTextPreference\n                app:key=\"remoteDns\"\n                app:icon=\"@drawable/ic_action_dns\"\n                app:title=\"@string/remote_dns\"\n                app:useSimpleSummaryProvider=\"true\"/>\n\n    </PreferenceCategory>\n\n    <PreferenceCategory\n            app:title=\"@string/plugin\">\n\n        <com.github.shadowsocks.preference.PluginPreference\n                app:key=\"plugin\"\n                app:persistent=\"false\"\n                app:title=\"@string/plugin\"\n                app:useSimpleSummaryProvider=\"true\"/>\n        <EditTextPreference\n                app:key=\"plugin.configure\"\n                app:icon=\"@drawable/ic_action_settings\"\n                app:persistent=\"false\"\n                app:title=\"@string/plugin_configure\"\n                app:useSimpleSummaryProvider=\"true\"/>\n        <Preference\n                app:key=\"udpFallback\"\n                app:icon=\"@drawable/ic_maps_360\"\n                app:title=\"@string/udp_fallback\"\n                app:summary=\"@string/plugin_disabled\">\n            <intent android:targetPackage=\"com.github.shadowsocks\"\n                    android:targetClass=\"com.github.shadowsocks.UdpFallbackProfileActivity\"/>\n        </Preference>\n\n    </PreferenceCategory>\n\n</PreferenceScreen>\n"
  },
  {
    "path": "mobile/src/main/res/xml/shortcuts.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shortcuts xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <shortcut android:shortcutId=\"toggle\"\n              android:icon=\"@drawable/ic_qu_shadowsocks_launcher\"\n              android:shortcutShortLabel=\"@string/quick_toggle\"\n              android:shortcutLongLabel=\"@string/quick_toggle\">\n        <intent android:action=\"android.intent.action.MAIN\"\n                android:targetPackage=\"com.github.shadowsocks\"\n                android:targetClass=\"com.github.shadowsocks.QuickToggleShortcut\" />\n    </shortcut>\n    <shortcut android:shortcutId=\"scan\"\n              android:icon=\"@drawable/ic_qu_camera_launcher\"\n              android:shortcutShortLabel=\"@string/add_profile_methods_scan_qr_code\"\n              android:shortcutLongLabel=\"@string/add_profile_methods_scan_qr_code\">\n        <intent android:action=\"android.intent.action.MAIN\"\n                android:targetPackage=\"com.github.shadowsocks\"\n                android:targetClass=\"com.github.shadowsocks.ScannerActivity\" />\n    </shortcut>\n</shortcuts>\n"
  },
  {
    "path": "plugin/.gitignore",
    "content": "/build\n"
  },
  {
    "path": "plugin/CHANGES.md",
    "content": "* 2.0.1:\n  * Moved `AlertDialogFragment` and related utilities to `fragment` package, with support for Fragment Result API from AndroidX Fragment 1.3.\n  * Dependency updates:\n    - `androidx.fragment:fragment-ktx:1.3.3`;\n    - `com.google.android.material:material:1.3.0`;\n    - `org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.4.32`.\n* 2.0.0:\n  * Deprecated passing `-V` and `--fast-open` to plugin.\n    Please find `__android_vpn` option passed via plugin options.\n  * Dependency updates:\n    - `androidx.core:core-ktx:1.3.2`;\n    - `androidx.drawerlayout:drawerlayout:1.1.1`;\n    - `com.google.android.material:material:1.2.1`;\n    - `org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.4.10`.\n* 1.3.4:\n  * Optional new metadata `com.github.shadowsocks.plugin.id.aliases` for plugin ID aliases;\n    (see doc for `PluginContract.METADATA_KEY_ID_ALIASES` and main documentation \"Plugin ID Aliasing\" for more information)\n  * Please use `android:path` instead of `android:pathPrefix`, sample code in documentations have been updated to reflect this recommendation.\n  * Added missing documentation regarding direct boot support.\n    Please add `android:directBootAware=\"true\"` with proper support for your `provider` if possible.\n  * You can now use `android:resources` on `meta-data` tags. (main/host app update required, however, you should never use dynamic resources)\n  * Fix occasional crash in `AlertDialogFragment`.\n  * Translation updates.\n  * Dependency updates:\n    - `androidx.core:core-ktx:1.2.0`;\n    - `com.google.android.material:material:1.1.0`.\n* 1.3.3:\n  * Fix a build script issue.\n* 1.3.2:\n  * Fix first key-value pair disappearing with null value. (#2391)\n  * Dependency updates:\n    - `androidx.core:core-ktx:1.1.0`;\n    - `com.google.android.material:material:1.1.0-rc01`;\n    - `org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.3.61`.\n* 1.3.1:\n  * New theme resource `Theme.Shadowsocks.Immersive` for better Android Q-esque translucent navigation bars.\n    This is an opt-in feature.\n    Please add `android:theme=\"@style/Theme.Shadowsocks.Immersive\"` to your `<activity>` to enable this theme.\n  * New color resources `light_*` and `dark_*` for passing to custom tabs;\n  * Dependency updates:\n    - `androidx.core:core-ktx:1.1.0-rc03`;\n    - `androidx.drawerlayout:drawerlayout:1.1.0-alpha03`;\n    - `com.google.android.material:material:1.1.0-alpha09`;\n    - `org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.3.41`.\n* 1.3.0:\n  * Optional new metadata `com.github.shadowsocks.plugin.executable_path` for even faster initialization;\n    (see doc for `PluginContract.METADATA_KEY_EXECUTABLE_PATH` for more information)\n  * Breaking API change: `val AlertDialogFragment.ret: Ret?` => `fun AlertDialogFragment.ret(which: Int): Ret?`;\n    (nothing needs to be done if you are not using this API)\n  * Dependency updates:\n    - Now targeting API 29;\n    - `androidx.core:core-ktx:1.1.0-rc01`;\n    - `com.google.android.material:material:1.1.0-alpha07`;\n    - `org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.3.40`.\n* 1.2.0:\n  * New helper class `AlertDialogFragment` for creating `AlertDialog` that persists through configuration changes;\n  * Dependency update: `com.google.android.material:material:1.1.0-alpha03`.\n* 1.1.0:\n  * Having control characters in plugin options is no longer allowed.\n    If this breaks your plugin, you are doing it wrong.\n  * New helper method: `PluginOptions.putWithDefault`.\n* 1.0.0:\n  * BREAKING CHANGE: Plugins developed using this version and forward require shadowsocks-android 4.6.5 or higher.\n  * `PathProvider` now takes `Int` instead of `String` for file modes;\n  * Refactor to AndroidX;\n  * No longer depends on preference libraries.\n* 0.1.1:\n  * Rewritten in Kotlin;\n  * Fix assert not working;\n  * Min API 21;\n  * Update support library version to 27.1.1.\n* 0.0.4:\n  * Enlarge text size of number pickers;\n  * Update support library version to 26.0.0.\n* 0.0.3:\n  * Update support library version to 25.2.0.\n* 0.0.2:\n  * Add `getOrDefault` to `PluginOptions`;\n  * Update support library version to 25.1.1.\n* 0.0.1: Initial release.\n"
  },
  {
    "path": "plugin/README.md",
    "content": "# shadowsocks-android plugin framework\n\n[Documentation](doc.md) | [Change log](CHANGES.md)\n\nSupport library for easier development on [shadowsocks\n plugin](https://github.com/shadowsocks/shadowsocks-org/issues/28) for Android. Also includes some\n useful resources to easily get consistent styling with the main app.\n\n## Official plugins\n\nThese are some plugins ready to use on shadowsocks-android.\n\n* [v2ray](https://github.com/shadowsocks/v2ray-plugin-android)\n* [kcptun](https://github.com/shadowsocks/kcptun-android/releases)\n* [simple-obfs](https://github.com/shadowsocks/simple-obfs-android/releases)\n\n## Developer's guide\n\nThis library is designed with Java interoperability in mind so theoretically you can use this\n library with other languages and/or build tools but there isn't documentation for that yet. This\n guide is written for Scala + SBT. Contributions are welcome.\n\n### Package name\n\nThere are no arbitrary restrictions/requirements on package name, component name and content\n provider authority, but you're suggested to follow the format in this documentations. For package\n name, use `com.github.shadowsocks.plugin.$PLUGIN_ID` if it only contains a single plugin to\n prevent duplicated plugins. In some places hyphens are not accepted, for example package name. In\n that case, hyphens `-` should be changed into underscores `_`. For example, the package name for\n `obfs-local` would probably be `com.github.shadowsocks.plugin.obfs_local`.\n\n### Add dependency\n\nFirst you need to add this library to your dependencies.\nThis library is written mostly in Kotlin but can also work with Java-only projects:\n\n```gradle\nimplementation 'com.github.shadowsocks:plugin:$LATEST_VERSION'\n```\n\n### Native binary configuration\n\nFirst you need to get your native binary compiling on Android platform.\n\n* [Sample project for C](https://github.com/shadowsocks/simple-obfs-android/tree/4f82c4a4e415d666e70a7e2e60955cb0d85c1615);\n* [Sample project for Go](https://github.com/shadowsocks/v2ray-plugin-android/tree/172bd4cec0276112828614482fb646b79dbf1540).\n\nIn addition to functionalities of a normal plugin, it has to support these additional options:\n\n* `__android_vpn`: VPN mode.\n  In this case, the plugin should pass all file descriptors that needs protecting from VPN connections (i.e. its traffic will not be forwarded through the VPN) through an ancillary message to `./protect_path`.\n\n### Implement a binary provider\n\nYou just need to implement two or three methods. For example for `v2ray`:\n\n```kotlin\nclass BinaryProvider : NativePluginProvider() {\n    override fun populateFiles(provider: PathProvider) {\n        provider.addPath(\"v2ray\", 0b111101101)\n        // add additional files here\n    }\n\n  // remove this method to disable fast mode, read more in the documentation\n    override fun getExecutable() = context!!.applicationInfo.nativeLibraryDir + \"/libv2ray.so\"\n\n    override fun openFile(uri: Uri): ParcelFileDescriptor = when (uri.path) {\n        \"/v2ray\" -> ParcelFileDescriptor.open(File(getExecutable()), ParcelFileDescriptor.MODE_READ_ONLY)\n        // handle additional files here\n        else -> throw FileNotFoundException()\n    }\n}\n```\n\nThen add it to your manifest:\n\n```xml\n<manifest>\n    ...\n    <application>\n        ...\n        <provider android:name=\".BinaryProvider\"\n                  android:exported=\"true\"\n                  android:directBootAware=\"true\"\n                  android:authorities=\"$FULLY_QUALIFIED_NAME_OF_YOUR_CONTENTPROVIDER\">\n            <intent-filter>\n                <action android:name=\"com.github.shadowsocks.plugin.ACTION_NATIVE_PLUGIN\"/>\n            </intent-filter>\n            <intent-filter>\n                <action android:name=\"com.github.shadowsocks.plugin.ACTION_NATIVE_PLUGIN\"/>\n                <data android:scheme=\"plugin\"\n                      android:host=\"com.github.shadowsocks\"\n                      android:path=\"/$PLUGIN_ID\"/>\n            </intent-filter>\n            <meta-data android:name=\"com.github.shadowsocks.plugin.id\"\n                       android:value=\"$PLUGIN_ID\"/>\n            <!-- Optional: default is empty -->\n            <meta-data android:name=\"com.github.shadowsocks.plugin.default_config\"\n                       android:value=\"dummy=default;plugin=options\"/>\n            <!-- Optional: remove to disable faster mode, read more in the documentation -->\n            <meta-data android:name=\"com.github.shadowsocks.plugin.executable_path\"\n                       android:value=\"$PATH_TO_EXECUTABLE_RELATIVE_TO_NATIVE_LIB_DIR\"/>\n        </provider>\n        ...\n    </application>\n</manifest>\n```\n\n### Add user interfaces\n\nYou should add to your plugin app a configuration activity or a help activity or both if you're\n going to use `ConfigurationActivity.fallbackToManualEditor`.\n\n#### Configuration activity\n\nThis is used if found instead of a manual input dialog when user clicks \"Configure...\" in the main\n app. This gives you maximum freedom of the user interface. To implement this, you need to extend\n `ConfigurationActivity` and you will get current options via\n `onInitializePluginOptions(PluginOptions)` and you can invoke `saveChanges(PluginOptions)` or\n `discardChanges()` before `finish()` or `fallbackToManualEditor()`. Then add it to your manifest:\n\n```xml\n<manifest>\n    ...\n    <application>\n        ...\n        <activity android:name=\".ConfigActivity\">\n            <intent-filter>\n                <action android:name=\"com.github.shadowsocks.plugin.ACTION_CONFIGURE\"/>\n                <category android:name=\"android.intent.category.DEFAULT\"/>\n                <data android:scheme=\"plugin\"\n                      android:host=\"com.github.shadowsocks\"\n                      android:path=\"/$PLUGIN_ID\"/>\n            </intent-filter>\n        </activity>\n        ...\n    </application>\n</manifest>\n```\n\n#### Help activity/callback\n\nThis is started when user taps \"?\" in manual editor. To implement this, you need to extend\n `HelpCallback` if you want a simple dialog with help message as `CharSequence` or `HelpActivity`\n if you want to provide custom user interface, implement the required methods, then add it to your\n manifest:\n\n```xml\n<manifest>\n    ...\n    <application>\n        ...\n        <activity android:name=\".HelpActivity\">\n            <intent-filter>\n                <action android:name=\"com.github.shadowsocks.plugin.ACTION_HELP\"/>\n                <category android:name=\"android.intent.category.DEFAULT\"/>\n                <data android:scheme=\"plugin\"\n                      android:host=\"com.github.shadowsocks\"\n                      android:path=\"/$PLUGIN_ID\"/>\n            </intent-filter>\n        </activity>\n        ...\n    </application>\n</manifest>\n```\n\nGreat. Now your plugin is ready to use.\n"
  },
  {
    "path": "plugin/build.gradle.kts",
    "content": "plugins {\n    id(\"com.android.library\")\n    id(\"com.vanniktech.maven.publish\")\n    kotlin(\"android\")\n    id(\"kotlin-parcelize\")\n}\n\nsetupCommon()\n\nandroid {\n    namespace = \"com.github.shadowsocks.plugin\"\n    lint.informational += \"GradleDependency\"\n}\n\ndependencies {\n    coreLibraryDesugaring(libs.desugar)\n    api(libs.androidx.core.ktx)\n    api(libs.androidx.fragment.ktx)\n    api(libs.material)\n    testImplementation(libs.junit)\n    androidTestImplementation(libs.androidx.test.runner)\n    androidTestImplementation(libs.androidx.espresso.core)\n}\n"
  },
  {
    "path": "plugin/doc.md",
    "content": "# Overview\n\nPlugin should be bundled as an apk. `$PLUGIN_ID` in this documentation corresponds to the\n executable name for the plugin in order to be cross-platform, e.g. `obfs-local`. An apk can have\n more than one plugins bundled. We don't care as long as they have different `$PLUGIN_ID`. For\n duplicated plugin ID, host should refuse to start.\n\nThere are no arbitrary restrictions/requirements on package name, component name and content\n provider authority, but you're suggested to follow the format in this documentations. For package\n name, use `com.github.shadowsocks.plugin.$PLUGIN_ID` if it only contains a single plugin to prevent\n duplicated plugins. In some places hyphens are not accepted, for example package name. In that\n case, hyphens `-` should be changed into underscores `_`. For example, the package name for\n `obfs-local` would probably be `com.github.shadowsocks.plugin.obfs_local`.\n\nIt's advised to use this library for easier development, but you're free to start from scratch following this\n documentation.\n\n# Plugin configuration\n\nPlugins get their args configured via one of the following two options:\n\n* A configuration activity;\n  ([example](https://github.com/shadowsocks/simple-obfs-android/tree/4f82c4a4e415d666e70a7e2e60955cb0d85c1615))\n* If no configuration activity is found or the activity requests the fallback mode, the fallback\n  mode will be used: user manual input and optional help message.\n  ([example](https://github.com/shadowsocks/kcptun-android/tree/41f42077e177618553417c16559784a51e9d8c4c))\n\nYour user interface need not be consistent with shadowsocks-android styling - you don't need to use\n preferences UI at all if you don't feel like it - however it's recommended to use Material Design\n at minimum.\n\n## Configuration activity\n\nIf the plugin provides a configuration activity, it will be started when user picks your plugin and\n taps configure. It:\n\n* MUST have action: `com.github.shadowsocks.plugin.ACTION_CONFIGURE`;\n* MUST have category: `android.intent.category.DEFAULT`;\n* MUST be able to receive data URI `plugin://com.github.shadowsocks/$PLUGIN_ID`;\n* SHOULD parse string extra `com.github.shadowsocks.plugin.EXTRA_OPTIONS` (all options as a single\n  string) and display the current options;\n* SHOULD distinguish between server settings and feature settings in some way, e.g. for\n  `obfs-local`, `obfs` is a server setting and `obfs_host` is a feature setting;\n* On finish, it SHOULD return one of the following results:\n  - `RESULT_OK = 0`: In this case it MUST return the data Intent with the new\n    `com.github.shadowsocks.plugin.EXTRA_OPTIONS`;\n  - `RESULT_CANCELED = -1`: Nothing will be changed;\n  - `RESULT_FALLBACK = 1`: Fallback mode is requested and the host should display the fallback\n    editor.\n\nThis corresponds to `com.github.shadowsocks.plugin.ConfigurationActivity` in the plugin library.\n Here's what a proper configuration activity usually should look like in `AndroidManifest.xml`:\n\n```xml\n<manifest>\n    ...\n    <application>\n        ...\n        <activity android:name=\".ConfigActivity\">\n            <intent-filter>\n                <action android:name=\"com.github.shadowsocks.plugin.ACTION_CONFIGURE\"/>\n                <category android:name=\"android.intent.category.DEFAULT\"/>\n                <data android:scheme=\"plugin\"\n                      android:host=\"com.github.shadowsocks\"\n                      android:path=\"/$PLUGIN_ID\"/>\n            </intent-filter>\n        </activity>\n        ...\n    </application>\n</manifest>\n```\n\n## Help activity/callback\n\nIf the plugin doesn't provide a configuration activity, it's highly recommended to provide a help\n message in the form of an Activity. It:\n\n* MUST have action: `com.github.shadowsocks.plugin.ACTION_HELP`;\n* MUST have category: `android.intent.category.DEFAULT`;\n* MUST be able to receive data URI `plugin://com.github.shadowsocks/$PLUGIN_ID`;\n* CAN parse string extra `com.github.shadowsocks.plugin.EXTRA_OPTIONS` and display some more\n  relevant information;\n* SHOULD parse `@NightMode` int extra `com.github.shadowsocks.plugin.EXTRA_NIGHT_MODE` and act\n  accordingly;\n* SHOULD either:\n  - Be invisible and return help message with CharSequence extra\n    `com.github.shadowsocks.plugin.EXTRA_HELP_MESSAGE` in the data intent with `RESULT_OK`; (in this\n    case, a simple dialog will be shown containing the message)\n  - Be visible and return `RESULT_CANCELED`.\n* SHOULD distinguish between server settings and feature settings in some way, e.g. for\n  `simple_obfs`, `obfs` is a server setting and `obfs_host` is a feature setting.\n\nThis corresponds to `com.github.shadowsocks.plugin.HelpActivity` or\n `com.github.shadowsocks.plugin.HelpCallback` in the plugin library. Here's what a proper help\n activity/callback usually should look like in `AndroidManifest.xml`:\n\n```xml\n<manifest>\n    ...\n    <application>\n        ...\n        <activity android:name=\".HelpActivity\">\n            <intent-filter>\n                <action android:name=\"com.github.shadowsocks.plugin.ACTION_HELP\"/>\n                <category android:name=\"android.intent.category.DEFAULT\"/>\n                <data android:scheme=\"plugin\"\n                      android:host=\"com.github.shadowsocks\"\n                      android:path=\"/$PLUGIN_ID\"/>\n            </intent-filter>\n        </activity>\n        ...\n    </application>\n</manifest>\n```\n\n# Plugin implementation\n\nEvery plugin can be either in native mode or JVM mode.\n\n## Native mode\n\nIn native mode, plugins are provided as native executables and `shadowsocks-libev`'s plugin mode\n will be used.\n\nEvery native mode plugin MUST have a content provider to provide the native executables (since they\n can exceed 1M which is the limit of Intent size) that:\n\n* MUST have `android:label` and `android:icon`; (may be inherited from parent `application`)\n* SHOULD have `android:directBootAware=\"true\"` with proper support if possible;\n* MUST have an intent filter with action `com.github.shadowsocks.plugin.ACTION_NATIVE_PLUGIN`;\n  (used for discovering plugins)\n* MUST have meta-data `com.github.shadowsocks.plugin.id` with string value `$PLUGIN_ID` or a string resource;\n* MUST have an intent filter with action `com.github.shadowsocks.plugin.ACTION_NATIVE_PLUGIN` and\n  data `plugin://com.github.shadowsocks/$PLUGIN_ID`; (used for configuring plugin)\n* CAN have meta-data `com.github.shadowsocks.plugin.default_config` with string value or a string resource, default is empty;\n* MUST implement `query` that returns the file list which MUST include `$PLUGIN_ID` when having\n  these as arguments:\n  - `uri = \"content://$authority_of_your_provider`;\n  - `projection = [\"path\", \"mode\"]`; (relative path, for example `obfs-local`; file mode as integer, for\n    example `0b110100100`)\n  - `selection = null`;\n  - `selectionArgs = null`;\n  - `sortOrder = null`;\n* MUST implement `openFile` that for files returned in `query`, `openFile` with `mode = \"r\"` returns\n  a valid `ParcelFileDescriptor` for reading. For example, `uri` can be\n  `content://com.github.shadowsocks.plugin.kcptun/kcptun`.\n\nThis corresponds to `com.github.shadowsocks.plugin.NativePluginProvider` in the plugin library.\n Here's what a proper native plugin provider usually should look like in `AndroidManifest.xml`:\n\n```xml\n<manifest>\n    ...\n    <application>\n        ...\n        <provider android:name=\".BinaryProvider\"\n                  android:exported=\"true\"\n                  android:directBootAware=\"true\"\n                  android:authorities=\"$FULLY_QUALIFIED_NAME_OF_YOUR_CONTENTPROVIDER\"\n                  tools:ignore=\"ExportedContentProvider\">\n            <intent-filter>\n                <action android:name=\"com.github.shadowsocks.plugin.ACTION_NATIVE_PLUGIN\"/>\n            </intent-filter>\n            <intent-filter>\n                <action android:name=\"com.github.shadowsocks.plugin.ACTION_NATIVE_PLUGIN\"/>\n                <data android:scheme=\"plugin\"\n                      android:host=\"com.github.shadowsocks\"\n                      android:path=\"/$PLUGIN_ID\"/>\n            </intent-filter>\n            <meta-data android:name=\"com.github.shadowsocks.plugin.id\"\n                       android:value=\"$PLUGIN_ID\"/>\n            <meta-data android:name=\"com.github.shadowsocks.plugin.default_config\"\n                       android:value=\"dummy=default;plugin=options\"/>\n        </provider>\n        ...\n    </application>\n</manifest>\n```\n\n## Native mode without binary copying\n\nIf your plugin binary executable can run in place, you can support native mode without binary\n copying. To support this mode, your `ContentProvider` must first support native mode with binary\n copying (this will be used if the fast routine fails) and:\n\n* MUST implement `call` that returns absolute path to the entry executable as\n  `com.github.shadowsocks.plugin.EXTRA_ENTRY` when having `method = \"shadowsocks:getExecutable\"`;\n  (`com.github.shadowsocks.plugin.EXTRA_OPTIONS` is provided in extras as well just in case you\n  need them)\n* SHOULD define `android:installLocation=\"internalOnly\"` for `<manifest>` in AndroidManifest.xml;\n* SHOULD define `android:extractNativeLibs=\"true\"` for `<application>` in AndroidManifest.xml;\n\nIf you don't plan to support this mode, you can just throw `UnsupportedOperationException` when\n being invoked. It will fallback to the slow routine automatically.\n\n### Native mode without binary copying and setup\n\nAdditionally, if your plugin only needs to supply the path of your executable without doing any extra setup work,\n you can use an additional `meta-data` with name `com.github.shadowsocks.plugin.executable_path`\n to supply executable path to your native binary.\nThis allows the host app to launch your plugin without ever launching your app.\n\n## JVM mode\n\nThis feature hasn't been implemented yet.\nPlease open an issue if you need this.\n\n# Plugin security\n\nPlugins are certified using package signatures and shadowsocks-android will consider these\n signatures as trusted:\n\n* Signatures by [trusted sources](/mobile/src/main/java/com/github/shadowsocks/plugin/PluginManager.kt#L39)\n  which includes:\n  - @madeye, i.e. the signer of the main repo;\n  - The main repo doesn't contain any other trusted signatures. Third-party forks should add their\n    signatures to this trusted sources if they have plugins signed by them before publishing their\n    source code.\n* Current package signature, which means:\n  - If you get apk from shadowsocks-android releases or Google Play, this means only apk signed by\n    @madeye will be recognized as trusted.\n  - If you get apk from a third-party fork, all plugins from that developer will get recognized as\n    trusted automatically even if its source code isn't available anywhere online.\n\nA warning will be shown for untrusted plugins. No arbitrary restrictions will be applied.\n\n# Plugin platform versioning\n\nIn order to be able to identify compatible and incompatible plugins, [Semantic\n Versioning](http://semver.org/) will be used.\n\n>Given a version number MAJOR.MINOR.PATCH, increment the:\n>\n>1. MAJOR version when you make incompatible API changes,\n>2. MINOR version when you add functionality in a backwards-compatible manner, and\n>3. PATCH version when you make backwards-compatible bug fixes.\n\nPlugin app must include this in their application tag: (which should be automatically included if\n you are using our library)\n\n```\n<meta-data android:name=\"com.github.shadowsocks.plugin.version\"\n           android:value=\"1.0.0\"/>\n```\n\n# Plugin ID Aliasing\n\nTo implement plugin ID aliasing, you:\n\n* MUST define meta-data `com.github.shadowsocks.plugin.id.aliases` in your plugin content provider with `android:value=\"alias\"`,\n  or use `android:resources` to specify a string resource or string array resource for multiple aliases.\n* MUST be able to be matched by `com.github.shadowsocks.plugin.ACTION_NATIVE_PLUGIN` when invoked on alias.\n  To do this, you SHOULD use multiple `intent-filter` and use a different `android:path` for each alias.\n  Alternatively, you MAY also use a single `intent-filter` and use `android:pathPattern` to match all your aliases at once.\n  You MUST NOT use `android:pathPrefix` or allow `android:pathPattern` to match undeclared plugin ID/alias as it might create a conflict with other plugins.\n* SHOULD NOT add or change `intent-filter` for activities to include your aliases -- your plugin ID will always be used.\n\nFor example:\n```xml\n<manifest>\n    ...\n    <application>\n        ...\n        <provider>\n            ...\n            <intent-filter>\n                <action android:name=\"com.github.shadowsocks.plugin.ACTION_NATIVE_PLUGIN\"/>\n                <data android:scheme=\"plugin\"\n                      android:host=\"com.github.shadowsocks\"\n                      android:path=\"/$PLUGIN_ID\"/>\n            </intent-filter>\n            <intent-filter>\n                <action android:name=\"com.github.shadowsocks.plugin.ACTION_NATIVE_PLUGIN\"/>\n                <data android:scheme=\"plugin\"\n                      android:host=\"com.github.shadowsocks\"\n                      android:path=\"/$PLUGIN_ALIAS\"/>\n            </intent-filter>\n            <meta-data android:name=\"com.github.shadowsocks.plugin.id\"\n                       android:value=\"$PLUGIN_ID\"/>\n            <meta-data android:name=\"com.github.shadowsocks.plugin.aliases\"\n                       android:value=\"$PLUGIN_ALIAS\"/>\n            ...\n        </provider>\n        ...\n    </application>\n</manifest>\n```\n\n# Android TV\n\nAndroid TV client does not invoke configuration activities. Therefore your plugins should automatically work with them.\n"
  },
  {
    "path": "plugin/gradle.properties",
    "content": "GROUP=com.github.shadowsocks\nVERSION_NAME=2.0.1\n\nPOM_ARTIFACT_ID=plugin\nPOM_NAME=Shadowsocks Plugin\nPOM_PACKAGING=aar\n\nPOM_DESCRIPTION=SIP003 plugin for Shadowsocks\nPOM_INCEPTION_YEAR=2018\n\nPOM_URL=https://github.com/shadowsocks/shadowsocks-android\nPOM_SCM_URL=https://github.com/shadowsocks/shadowsocks-android\nPOM_SCM_CONNECTION=scm:git:git://github.com/shadowsocks/shadowsocks-android.git\nPOM_SCM_DEV_CONNECTION=scm:git:ssh://git@github.com/shadowsocks/shadowsocks-android.git\n\nPOM_LICENCE_NAME=The GNU General Public License v3.0\nPOM_LICENCE_URL=https://www.gnu.org/licenses/gpl-3.0.html\nPOM_LICENCE_DIST=repo\n\nPOM_DEVELOPER_ID=Mygod\nPOM_DEVELOPER_NAME=Mygod Studio\n"
  },
  {
    "path": "plugin/src/main/AndroidManifest.xml",
    "content": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <application\n        android:theme=\"@style/Theme.Shadowsocks\">\n        <meta-data android:name=\"com.github.shadowsocks.plugin.version\"\n                   android:value=\"2.0.1\"/>\n    </application>\n</manifest>\n"
  },
  {
    "path": "plugin/src/main/java/com/github/shadowsocks/plugin/AlertDialogFragment.kt",
    "content": "/*******************************************************************************\n *                                                                             *\n *  Copyright (C) 2019 by Max Lv <max.c.lv@gmail.com>                          *\n *  Copyright (C) 2019 by Mygod Studio <contact-shadowsocks-android@mygod.be>  *\n *                                                                             *\n *  This program is free software: you can redistribute it and/or modify       *\n *  it under the terms of the GNU General Public License as published by       *\n *  the Free Software Foundation, either version 3 of the License, or          *\n *  (at your option) any later version.                                        *\n *                                                                             *\n *  This program is distributed in the hope that it will be useful,            *\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of             *\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the              *\n *  GNU General Public License for more details.                               *\n *                                                                             *\n *  You should have received a copy of the GNU General Public License          *\n *  along with this program. If not, see <http://www.gnu.org/licenses/>.       *\n *                                                                             *\n *******************************************************************************/\n\npackage com.github.shadowsocks.plugin\n\nimport android.app.Activity\nimport android.content.DialogInterface\nimport android.content.Intent\nimport android.os.Bundle\nimport android.os.Parcelable\nimport androidx.appcompat.app.AlertDialog\nimport androidx.appcompat.app.AppCompatDialogFragment\nimport androidx.fragment.app.Fragment\n\n/**\n * Based on: https://android.googlesource.com/platform/packages/apps/ExactCalculator/+/8c43f06/src/com/android/calculator2/AlertDialogFragment.java\n */\n@Suppress(\"DEPRECATION\")\n@Deprecated(\"Related APIs are deprecated in AndroidX\", ReplaceWith(\"fragment.AlertDialogFragment\"))\nabstract class AlertDialogFragment<Arg : Parcelable, Ret : Parcelable> :\n        AppCompatDialogFragment(), DialogInterface.OnClickListener {\n    companion object {\n        private const val KEY_ARG = \"arg\"\n        private const val KEY_RET = \"ret\"\n        fun <T : Parcelable> getRet(data: Intent) = data.extras!!.getParcelable<T>(KEY_RET)!!\n    }\n    protected abstract fun AlertDialog.Builder.prepare(listener: DialogInterface.OnClickListener)\n\n    protected val arg by lazy { requireArguments().getParcelable<Arg>(KEY_ARG)!! }\n    protected open fun ret(which: Int): Ret? = null\n    fun withArg(arg: Arg) = apply { arguments = Bundle().apply { putParcelable(KEY_ARG, arg) } }\n\n    override fun onCreateDialog(savedInstanceState: Bundle?): AlertDialog =\n            AlertDialog.Builder(requireContext()).also { it.prepare(this) }.create()\n\n    override fun onClick(dialog: DialogInterface?, which: Int) {\n        targetFragment?.onActivityResult(targetRequestCode, which, ret(which)?.let {\n            Intent().replaceExtras(Bundle().apply { putParcelable(KEY_RET, it) })\n        })\n    }\n\n    override fun onDismiss(dialog: DialogInterface) {\n        super.onDismiss(dialog)\n        onClick(dialog, Activity.RESULT_CANCELED)\n    }\n\n    fun show(target: Fragment, requestCode: Int = 0, tag: String = javaClass.simpleName) {\n        setTargetFragment(target, requestCode)\n        showAllowingStateLoss(target.fragmentManager ?: return, tag)\n    }\n}\n"
  },
  {
    "path": "plugin/src/main/java/com/github/shadowsocks/plugin/ConfigurationActivity.kt",
    "content": "/*******************************************************************************\n *                                                                             *\n *  Copyright (C) 2017 by Max Lv <max.c.lv@gmail.com>                          *\n *  Copyright (C) 2017 by Mygod Studio <contact-shadowsocks-android@mygod.be>  *\n *                                                                             *\n *  This program is free software: you can redistribute it and/or modify       *\n *  it under the terms of the GNU General Public License as published by       *\n *  the Free Software Foundation, either version 3 of the License, or          *\n *  (at your option) any later version.                                        *\n *                                                                             *\n *  This program is distributed in the hope that it will be useful,            *\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of             *\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the              *\n *  GNU General Public License for more details.                               *\n *                                                                             *\n *  You should have received a copy of the GNU General Public License          *\n *  along with this program. If not, see <http://www.gnu.org/licenses/>.       *\n *                                                                             *\n *******************************************************************************/\n\npackage com.github.shadowsocks.plugin\n\nimport android.app.Activity\nimport android.content.Intent\n\n/**\n * Base class for configuration activity. A configuration activity is started when user wishes to configure the\n * selected plugin. To create a configuration activity, extend this class, implement abstract methods, invoke\n * `saveChanges(options)` and `discardChanges()` when appropriate, and add it to your manifest like this:\n *\n * <pre class=\"prettyprint\">&lt;manifest&gt;\n *    ...\n *    &lt;application&gt;\n *        ...\n *        &lt;activity android:name=\".ConfigureActivity\"&gt;\n *            &lt;intent-filter&gt;\n *                &lt;action android:name=\"com.github.shadowsocks.plugin.ACTION_CONFIGURE\"/&gt;\n *                &lt;category android:name=\"android.intent.category.DEFAULT\"/&gt;\n *                &lt;data android:scheme=\"plugin\"\n *                         android:host=\"com.github.shadowsocks\"\n *                         android:path=\"/$PLUGIN_ID\"/&gt;\n *            &lt;/intent-filter&gt;\n *        &lt;/activity&gt;\n *        ...\n *    &lt;/application&gt;\n *&lt;/manifest&gt;</pre>\n */\nabstract class ConfigurationActivity : OptionsCapableActivity() {\n    /**\n     * Equivalent to setResult(RESULT_CANCELED).\n     */\n    fun discardChanges() = setResult(Activity.RESULT_CANCELED)\n\n    /**\n     * Equivalent to setResult(RESULT_OK, args_with_correct_format).\n     *\n     * @param options PluginOptions to save.\n     */\n    fun saveChanges(options: PluginOptions) =\n            setResult(Activity.RESULT_OK, Intent().putExtra(PluginContract.EXTRA_OPTIONS, options.toString()))\n\n    /**\n     * Finish this activity and request manual editor to pop up instead.\n     */\n    fun fallbackToManualEditor() {\n        setResult(PluginContract.RESULT_FALLBACK)\n        finish()\n    }\n}\n"
  },
  {
    "path": "plugin/src/main/java/com/github/shadowsocks/plugin/HelpActivity.kt",
    "content": "/*******************************************************************************\n *                                                                             *\n *  Copyright (C) 2017 by Max Lv <max.c.lv@gmail.com>                          *\n *  Copyright (C) 2017 by Mygod Studio <contact-shadowsocks-android@mygod.be>  *\n *                                                                             *\n *  This program is free software: you can redistribute it and/or modify       *\n *  it under the terms of the GNU General Public License as published by       *\n *  the Free Software Foundation, either version 3 of the License, or          *\n *  (at your option) any later version.                                        *\n *                                                                             *\n *  This program is distributed in the hope that it will be useful,            *\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of             *\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the              *\n *  GNU General Public License for more details.                               *\n *                                                                             *\n *  You should have received a copy of the GNU General Public License          *\n *  along with this program. If not, see <http://www.gnu.org/licenses/>.       *\n *                                                                             *\n *******************************************************************************/\n\npackage com.github.shadowsocks.plugin\n\n/**\n * Base class for a help activity. A help activity is started when user taps help when configuring options for your\n * plugin. To create a help activity, just extend this class, and add it to your manifest like this:\n *\n * <pre class=\"prettyprint\">&lt;manifest&gt;\n *    ...\n *    &lt;application&gt;\n *        ...\n *        &lt;activity android:name=\".HelpActivity\"&gt;\n *            &lt;intent-filter&gt;\n *                &lt;action android:name=\"com.github.shadowsocks.plugin.ACTION_HELP\"/&gt;\n *                &lt;category android:name=\"android.intent.category.DEFAULT\"/&gt;\n *                &lt;data android:scheme=\"plugin\"\n *                         android:host=\"com.github.shadowsocks\"\n *                         android:path=\"/$PLUGIN_ID\"/&gt;\n *            &lt;/intent-filter&gt;\n *        &lt;/activity&gt;\n *        ...\n *    &lt;/application&gt;\n *&lt;/manifest&gt;</pre>\n */\nabstract class HelpActivity : OptionsCapableActivity() {\n    override fun onInitializePluginOptions(options: PluginOptions) { }\n}\n"
  },
  {
    "path": "plugin/src/main/java/com/github/shadowsocks/plugin/HelpCallback.kt",
    "content": "/*******************************************************************************\n *                                                                             *\n *  Copyright (C) 2017 by Max Lv <max.c.lv@gmail.com>                          *\n *  Copyright (C) 2017 by Mygod Studio <contact-shadowsocks-android@mygod.be>  *\n *                                                                             *\n *  This program is free software: you can redistribute it and/or modify       *\n *  it under the terms of the GNU General Public License as published by       *\n *  the Free Software Foundation, either version 3 of the License, or          *\n *  (at your option) any later version.                                        *\n *                                                                             *\n *  This program is distributed in the hope that it will be useful,            *\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of             *\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the              *\n *  GNU General Public License for more details.                               *\n *                                                                             *\n *  You should have received a copy of the GNU General Public License          *\n *  along with this program. If not, see <http://www.gnu.org/licenses/>.       *\n *                                                                             *\n *******************************************************************************/\n\npackage com.github.shadowsocks.plugin\n\nimport android.content.Intent\n\n/**\n * HelpCallback is an HelpActivity but you just need to produce a CharSequence help message instead of having to\n * provide UI. To create a help callback, just extend this class, implement abstract methods, and add it to your\n * manifest following the same procedure as adding a HelpActivity.\n */\nabstract class HelpCallback : HelpActivity() {\n    abstract fun produceHelpMessage(options: PluginOptions): CharSequence\n\n    override fun onInitializePluginOptions(options: PluginOptions) {\n        setResult(RESULT_OK, Intent().putExtra(PluginContract.EXTRA_HELP_MESSAGE, produceHelpMessage(options)))\n        finish()\n    }\n}\n"
  },
  {
    "path": "plugin/src/main/java/com/github/shadowsocks/plugin/NativePluginProvider.kt",
    "content": "/*******************************************************************************\n *                                                                             *\n *  Copyright (C) 2017 by Max Lv <max.c.lv@gmail.com>                          *\n *  Copyright (C) 2017 by Mygod Studio <contact-shadowsocks-android@mygod.be>  *\n *                                                                             *\n *  This program is free software: you can redistribute it and/or modify       *\n *  it under the terms of the GNU General Public License as published by       *\n *  the Free Software Foundation, either version 3 of the License, or          *\n *  (at your option) any later version.                                        *\n *                                                                             *\n *  This program is distributed in the hope that it will be useful,            *\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of             *\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the              *\n *  GNU General Public License for more details.                               *\n *                                                                             *\n *  You should have received a copy of the GNU General Public License          *\n *  along with this program. If not, see <http://www.gnu.org/licenses/>.       *\n *                                                                             *\n *******************************************************************************/\n\npackage com.github.shadowsocks.plugin\n\nimport android.content.ContentProvider\nimport android.content.ContentValues\nimport android.database.Cursor\nimport android.database.MatrixCursor\nimport android.net.Uri\nimport android.os.Bundle\nimport android.os.ParcelFileDescriptor\nimport androidx.core.os.bundleOf\n\n/**\n * Base class for a native plugin provider. A native plugin provider offers read-only access to files that are required\n * to run a plugin, such as binary files and other configuration files. To create a native plugin provider, extend this\n * class, implement the abstract methods, and add it to your manifest like this:\n *\n * <pre class=\"prettyprint\">&lt;manifest&gt;\n *    ...\n *    &lt;application&gt;\n *        ...\n *        &lt;provider android:name=\"com.github.shadowsocks.$PLUGIN_ID.BinaryProvider\"\n *                     android:authorities=\"com.github.shadowsocks.plugin.$PLUGIN_ID.BinaryProvider\"&gt;\n *            &lt;intent-filter&gt;\n *                &lt;category android:name=\"com.github.shadowsocks.plugin.ACTION_NATIVE_PLUGIN\" /&gt;\n *            &lt;/intent-filter&gt;\n *        &lt;/provider&gt;\n *        ...\n *    &lt;/application&gt;\n *&lt;/manifest&gt;</pre>\n */\nabstract class NativePluginProvider : ContentProvider() {\n    override fun getType(uri: Uri): String? = \"application/x-elf\"\n\n    override fun onCreate(): Boolean = true\n\n    /**\n     * Provide all files needed for native plugin.\n     *\n     * @param provider A helper object to use to add files.\n     */\n    protected abstract fun populateFiles(provider: PathProvider)\n\n    override fun query(uri: Uri, projection: Array<out String>?, selection: String?, selectionArgs: Array<out String>?,\n                       sortOrder: String?): Cursor? {\n        check(selection == null && selectionArgs == null && sortOrder == null)\n        val result = MatrixCursor(projection)\n        populateFiles(PathProvider(uri, result))\n        return result\n    }\n\n    /**\n     * Returns executable entry absolute path.\n     * This is used for fast mode initialization where ss-local launches your native binary at the path given directly.\n     * In order for this to work, plugin app is encouraged to have the following in its AndroidManifest.xml:\n     *  - android:installLocation=\"internalOnly\" for <manifest>\n     *  - android:extractNativeLibs=\"true\" for <application>\n     *\n     * Default behavior is throwing UnsupportedOperationException. If you don't wish to use this feature, use the\n     * default behavior.\n     *\n     * @return Absolute path for executable entry.\n     */\n    open fun getExecutable(): String = throw UnsupportedOperationException()\n\n    abstract fun openFile(uri: Uri): ParcelFileDescriptor\n    override fun openFile(uri: Uri, mode: String): ParcelFileDescriptor {\n        check(mode == \"r\")\n        return openFile(uri)\n    }\n\n    override fun call(method: String, arg: String?, extras: Bundle?): Bundle? = when (method) {\n        PluginContract.METHOD_GET_EXECUTABLE -> bundleOf(Pair(PluginContract.EXTRA_ENTRY, getExecutable()))\n        else -> super.call(method, arg, extras)\n    }\n\n    // Methods that should not be used\n    override fun insert(uri: Uri, values: ContentValues?): Uri? = throw UnsupportedOperationException()\n    override fun update(uri: Uri, values: ContentValues?, selection: String?, selectionArgs: Array<out String>?): Int =\n            throw UnsupportedOperationException()\n    override fun delete(uri: Uri, selection: String?, selectionArgs: Array<out String>?): Int =\n            throw UnsupportedOperationException()\n}\n"
  },
  {
    "path": "plugin/src/main/java/com/github/shadowsocks/plugin/OptionsCapableActivity.kt",
    "content": "/*******************************************************************************\n *                                                                             *\n *  Copyright (C) 2017 by Max Lv <max.c.lv@gmail.com>                          *\n *  Copyright (C) 2017 by Mygod Studio <contact-shadowsocks-android@mygod.be>  *\n *                                                                             *\n *  This program is free software: you can redistribute it and/or modify       *\n *  it under the terms of the GNU General Public License as published by       *\n *  the Free Software Foundation, either version 3 of the License, or          *\n *  (at your option) any later version.                                        *\n *                                                                             *\n *  This program is distributed in the hope that it will be useful,            *\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of             *\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the              *\n *  GNU General Public License for more details.                               *\n *                                                                             *\n *  You should have received a copy of the GNU General Public License          *\n *  along with this program. If not, see <http://www.gnu.org/licenses/>.       *\n *                                                                             *\n *******************************************************************************/\n\npackage com.github.shadowsocks.plugin\n\nimport android.content.Intent\nimport android.os.Bundle\nimport android.widget.Toast\nimport androidx.appcompat.app.AppCompatActivity\n\n/**\n * Activity that's capable of getting EXTRA_OPTIONS input.\n */\nabstract class OptionsCapableActivity : AppCompatActivity() {\n    protected fun pluginOptions(intent: Intent = this.intent) = try {\n        PluginOptions(\"\", intent.getStringExtra(PluginContract.EXTRA_OPTIONS))\n    } catch (exc: IllegalArgumentException) {\n        Toast.makeText(this, exc.message, Toast.LENGTH_SHORT).show()\n        PluginOptions()\n    }\n\n    /**\n     * Populate args to your user interface.\n     *\n     * @param options PluginOptions parsed.\n     */\n    protected abstract fun onInitializePluginOptions(options: PluginOptions = pluginOptions())\n\n    override fun onPostCreate(savedInstanceState: Bundle?) {\n        super.onPostCreate(savedInstanceState)\n        if (savedInstanceState == null) onInitializePluginOptions()\n    }\n}\n"
  },
  {
    "path": "plugin/src/main/java/com/github/shadowsocks/plugin/PathProvider.kt",
    "content": "/*******************************************************************************\n *                                                                             *\n *  Copyright (C) 2017 by Max Lv <max.c.lv@gmail.com>                          *\n *  Copyright (C) 2017 by Mygod Studio <contact-shadowsocks-android@mygod.be>  *\n *                                                                             *\n *  This program is free software: you can redistribute it and/or modify       *\n *  it under the terms of the GNU General Public License as published by       *\n *  the Free Software Foundation, either version 3 of the License, or          *\n *  (at your option) any later version.                                        *\n *                                                                             *\n *  This program is distributed in the hope that it will be useful,            *\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of             *\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the              *\n *  GNU General Public License for more details.                               *\n *                                                                             *\n *  You should have received a copy of the GNU General Public License          *\n *  along with this program. If not, see <http://www.gnu.org/licenses/>.       *\n *                                                                             *\n *******************************************************************************/\n\npackage com.github.shadowsocks.plugin\n\nimport android.database.MatrixCursor\nimport android.net.Uri\nimport java.io.File\n\n/**\n * Helper class to provide relative paths of files to copy.\n */\nclass PathProvider internal constructor(baseUri: Uri, private val cursor: MatrixCursor) {\n    private val basePath = baseUri.path?.trim('/') ?: \"\"\n\n    fun addPath(path: String, mode: Int = 0b110100100): PathProvider {\n        val trimmed = path.trim('/')\n        if (trimmed.startsWith(basePath)) cursor.newRow()\n                .add(PluginContract.COLUMN_PATH, trimmed)\n                .add(PluginContract.COLUMN_MODE, mode)\n        return this\n    }\n    fun addTo(file: File, to: String = \"\", mode: Int = 0b110100100): PathProvider {\n        var sub = to + file.name\n        if (basePath.startsWith(sub)) if (file.isDirectory) {\n            sub += '/'\n            file.listFiles()!!.forEach { addTo(it, sub, mode) }\n        } else addPath(sub, mode)\n        return this\n    }\n    fun addAt(file: File, at: String = \"\", mode: Int = 0b110100100): PathProvider {\n        if (basePath.startsWith(at)) {\n            if (file.isDirectory) file.listFiles()!!.forEach { addTo(it, at, mode) } else addPath(at, mode)\n        }\n        return this\n    }\n}\n"
  },
  {
    "path": "plugin/src/main/java/com/github/shadowsocks/plugin/PluginContract.kt",
    "content": "/*******************************************************************************\n *                                                                             *\n *  Copyright (C) 2017 by Max Lv <max.c.lv@gmail.com>                          *\n *  Copyright (C) 2017 by Mygod Studio <contact-shadowsocks-android@mygod.be>  *\n *                                                                             *\n *  This program is free software: you can redistribute it and/or modify       *\n *  it under the terms of the GNU General Public License as published by       *\n *  the Free Software Foundation, either version 3 of the License, or          *\n *  (at your option) any later version.                                        *\n *                                                                             *\n *  This program is distributed in the hope that it will be useful,            *\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of             *\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the              *\n *  GNU General Public License for more details.                               *\n *                                                                             *\n *  You should have received a copy of the GNU General Public License          *\n *  along with this program. If not, see <http://www.gnu.org/licenses/>.       *\n *                                                                             *\n *******************************************************************************/\n\npackage com.github.shadowsocks.plugin\n\n/**\n * The contract between the plugin provider and host. Contains definitions for the supported actions, extras, etc.\n *\n * This class is written in Java to keep Java interoperability.\n */\nobject PluginContract {\n    /**\n     * ContentProvider Action: Used for NativePluginProvider.\n     *\n     * Constant Value: \"com.github.shadowsocks.plugin.ACTION_NATIVE_PLUGIN\"\n     */\n    const val ACTION_NATIVE_PLUGIN = \"com.github.shadowsocks.plugin.ACTION_NATIVE_PLUGIN\"\n\n    /**\n     * Activity Action: Used for ConfigurationActivity.\n     *\n     * Constant Value: \"com.github.shadowsocks.plugin.ACTION_CONFIGURE\"\n     */\n    const val ACTION_CONFIGURE = \"com.github.shadowsocks.plugin.ACTION_CONFIGURE\"\n    /**\n     * Activity Action: Used for HelpActivity or HelpCallback.\n     *\n     * Constant Value: \"com.github.shadowsocks.plugin.ACTION_HELP\"\n     */\n    const val ACTION_HELP = \"com.github.shadowsocks.plugin.ACTION_HELP\"\n\n    /**\n     * The lookup key for a string that provides the plugin entry binary.\n     *\n     * Example: \"/data/data/com.github.shadowsocks.plugin.obfs_local/lib/libobfs-local.so\"\n     *\n     * Constant Value: \"com.github.shadowsocks.plugin.EXTRA_ENTRY\"\n     */\n    const val EXTRA_ENTRY = \"com.github.shadowsocks.plugin.EXTRA_ENTRY\"\n    /**\n     * The lookup key for a string that provides the options as a string.\n     *\n     * Example: \"obfs=http;obfs-host=www.baidu.com\"\n     *\n     * Constant Value: \"com.github.shadowsocks.plugin.EXTRA_OPTIONS\"\n     */\n    const val EXTRA_OPTIONS = \"com.github.shadowsocks.plugin.EXTRA_OPTIONS\"\n    /**\n     * The lookup key for a CharSequence that provides user relevant help message.\n     *\n     * Example: \"obfs=<http></http>|tls>            Enable obfuscating: HTTP or TLS (Experimental).\n     * obfs-host=<host_name>      Hostname for obfuscating (Experimental).\"\n     *\n     * Constant Value: \"com.github.shadowsocks.plugin.EXTRA_HELP_MESSAGE\"\n    </host_name> */\n    const val EXTRA_HELP_MESSAGE = \"com.github.shadowsocks.plugin.EXTRA_HELP_MESSAGE\"\n\n    /**\n     * The metadata key to retrieve plugin version. Required for plugin applications.\n     *\n     * Constant Value: \"com.github.shadowsocks.plugin.version\"\n     */\n    const val METADATA_KEY_VERSION = \"com.github.shadowsocks.plugin.version\"\n\n    /**\n     * The metadata key to retrieve plugin id. Required for plugins.\n     *\n     * Constant Value: \"com.github.shadowsocks.plugin.id\"\n     */\n    const val METADATA_KEY_ID = \"com.github.shadowsocks.plugin.id\"\n    /**\n     * The metadata key to retrieve plugin id aliases.\n     * Can be a string (representing one alias) or a resource to a string or string array.\n     *\n     * Constant Value: \"com.github.shadowsocks.plugin.id.aliases\"\n     */\n    const val METADATA_KEY_ID_ALIASES = \"com.github.shadowsocks.plugin.id.aliases\"\n    /**\n     * The metadata key to retrieve default configuration. Default value is empty.\n     *\n     * Constant Value: \"com.github.shadowsocks.plugin.default_config\"\n     */\n    const val METADATA_KEY_DEFAULT_CONFIG = \"com.github.shadowsocks.plugin.default_config\"\n    /**\n     * The metadata key to retrieve executable path to your native binary.\n     * This path should be relative to your application's nativeLibraryDir.\n     *\n     * If this is set, the host app will prefer this value and (probably) not launch your app at all (aka faster mode).\n     * In order for this to work, plugin app is encouraged to have the following in its AndroidManifest.xml:\n     *  - android:installLocation=\"internalOnly\" for <manifest>\n     *  - android:extractNativeLibs=\"true\" for <application>\n     *\n     * Do not use this if you plan to do some setup work before giving away your binary path,\n     *  or your native binary is not at a fixed location relative to your application's nativeLibraryDir.\n     *\n     * Since plugin lib: 1.3.0\n     *\n     * Constant Value: \"com.github.shadowsocks.plugin.executable_path\"\n     */\n    const val METADATA_KEY_EXECUTABLE_PATH = \"com.github.shadowsocks.plugin.executable_path\"\n\n    const val METHOD_GET_EXECUTABLE = \"shadowsocks:getExecutable\"\n\n    /** ConfigurationActivity result: fallback to manual edit mode.  */\n    const val RESULT_FALLBACK = 1\n\n    /**\n     * Relative to the file to be copied. This column is required.\n     *\n     * Example: \"kcptun\", \"doc/help.txt\"\n     *\n     * Type: String\n     */\n    const val COLUMN_PATH = \"path\"\n    /**\n     * File mode bits. Default value is 644 in octal.\n     *\n     * Example: 0b110100100 (for 755 in octal)\n     *\n     * Type: Int or String (deprecated)\n     */\n    const val COLUMN_MODE = \"mode\"\n\n    /**\n     * The scheme for general plugin actions.\n     */\n    const val SCHEME = \"plugin\"\n    /**\n     * The authority for general plugin actions.\n     */\n    const val AUTHORITY = \"com.github.shadowsocks\"\n}\n"
  },
  {
    "path": "plugin/src/main/java/com/github/shadowsocks/plugin/PluginOptions.kt",
    "content": "/*******************************************************************************\n *                                                                             *\n *  Copyright (C) 2017 by Max Lv <max.c.lv@gmail.com>                          *\n *  Copyright (C) 2017 by Mygod Studio <contact-shadowsocks-android@mygod.be>  *\n *                                                                             *\n *  This program is free software: you can redistribute it and/or modify       *\n *  it under the terms of the GNU General Public License as published by       *\n *  the Free Software Foundation, either version 3 of the License, or          *\n *  (at your option) any later version.                                        *\n *                                                                             *\n *  This program is distributed in the hope that it will be useful,            *\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of             *\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the              *\n *  GNU General Public License for more details.                               *\n *                                                                             *\n *  You should have received a copy of the GNU General Public License          *\n *  along with this program. If not, see <http://www.gnu.org/licenses/>.       *\n *                                                                             *\n *******************************************************************************/\n\npackage com.github.shadowsocks.plugin\n\nimport java.util.*\n\n/**\n * Helper class for processing plugin options.\n *\n * Based on: https://github.com/apache/ant/blob/588ce1f/src/main/org/apache/tools/ant/types/Commandline.java\n */\nclass PluginOptions : HashMap<String, String?> {\n    var id = \"\"\n\n    constructor() : super()\n    constructor(initialCapacity: Int) : super(initialCapacity)\n    constructor(initialCapacity: Int, loadFactor: Float) : super(initialCapacity, loadFactor)\n\n    private constructor(options: String?, parseId: Boolean) : this() {\n        @Suppress(\"NAME_SHADOWING\")\n        var parseId = parseId\n        if (options.isNullOrEmpty()) return\n        check(options.all { !it.isISOControl() }) { \"No control characters allowed.\" }\n        val tokenizer = StringTokenizer(\"$options;\", \"\\\\=;\", true)\n        val current = StringBuilder()\n        var key: String? = null\n        while (tokenizer.hasMoreTokens()) when (val nextToken = tokenizer.nextToken()) {\n            \"\\\\\" -> current.append(tokenizer.nextToken())\n            \"=\" -> if (key == null) {\n                key = current.toString()\n                current.setLength(0)\n            } else current.append(nextToken)\n            \";\" -> {\n                if (key != null) {\n                    put(key, current.toString())\n                    key = null\n                } else if (current.isNotEmpty()) {\n                    if (parseId) id = current.toString() else put(current.toString(), null)\n                }\n                current.setLength(0)\n                parseId = false\n            }\n            else -> current.append(nextToken)\n        }\n    }\n\n    constructor(options: String?) : this(options, true)\n    constructor(id: String, options: String?) : this(options, false) {\n        this.id = id\n    }\n\n    /**\n     * Put but if value is null or default, the entry is deleted.\n     *\n     * @return Old value before put.\n     */\n    fun putWithDefault(key: String, value: String?, default: String? = null) =\n            if (value == null || value == default) remove(key) else put(key, value)\n\n    private fun append(result: StringBuilder, str: String) = str.indices.map { str[it] }.forEach {\n        when (it) {\n            '\\\\', '=', ';' -> {\n                result.append('\\\\') // intentionally no break\n                result.append(it)\n            }\n            else -> result.append(it)\n        }\n    }\n\n    fun toString(trimId: Boolean): String {\n        val result = StringBuilder()\n        if (!trimId) if (id.isEmpty()) return \"\" else append(result, id)\n        for ((key, value) in entries) {\n            if (result.isNotEmpty()) result.append(';')\n            append(result, key)\n            if (value != null) {\n                result.append('=')\n                append(result, value)\n            }\n        }\n        return result.toString()\n    }\n\n    override fun toString(): String = toString(true)\n\n    override fun equals(other: Any?): Boolean {\n        if (this === other) return true\n        return javaClass == other?.javaClass && super.equals(other) && id == (other as PluginOptions).id\n    }\n    override fun hashCode(): Int = Objects.hash(super.hashCode(), id)\n}\n"
  },
  {
    "path": "plugin/src/main/java/com/github/shadowsocks/plugin/Utils.kt",
    "content": "/*******************************************************************************\n *                                                                             *\n *  Copyright (C) 2020 by Max Lv <max.c.lv@gmail.com>                          *\n *  Copyright (C) 2020 by Mygod Studio <contact-shadowsocks-android@mygod.be>  *\n *                                                                             *\n *  This program is free software: you can redistribute it and/or modify       *\n *  it under the terms of the GNU General Public License as published by       *\n *  the Free Software Foundation, either version 3 of the License, or          *\n *  (at your option) any later version.                                        *\n *                                                                             *\n *  This program is distributed in the hope that it will be useful,            *\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of             *\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the              *\n *  GNU General Public License for more details.                               *\n *                                                                             *\n *  You should have received a copy of the GNU General Public License          *\n *  along with this program. If not, see <http://www.gnu.org/licenses/>.       *\n *                                                                             *\n *******************************************************************************/\n\n@file:JvmName(\"Utils\")\n\npackage com.github.shadowsocks.plugin\n\nimport android.os.Parcelable\nimport androidx.fragment.app.DialogFragment\nimport androidx.fragment.app.FragmentManager\nimport kotlinx.parcelize.Parcelize\n\n@Parcelize\nclass Empty : Parcelable\n\n@JvmOverloads\n@Deprecated(\"Moved to fragment package\", ReplaceWith(\"fragment.showAllowingStateLoss\"))\nfun DialogFragment.showAllowingStateLoss(fragmentManager: FragmentManager, tag: String? = null) {\n    if (!fragmentManager.isStateSaved) show(fragmentManager, tag)\n}\n"
  },
  {
    "path": "plugin/src/main/java/com/github/shadowsocks/plugin/fragment/AlertDialogFragment.kt",
    "content": "/*******************************************************************************\n *                                                                             *\n *  Copyright (C) 2020 by Max Lv <max.c.lv@gmail.com>                          *\n *  Copyright (C) 2020 by Mygod Studio <contact-shadowsocks-android@mygod.be>  *\n *                                                                             *\n *  This program is free software: you can redistribute it and/or modify       *\n *  it under the terms of the GNU General Public License as published by       *\n *  the Free Software Foundation, either version 3 of the License, or          *\n *  (at your option) any later version.                                        *\n *                                                                             *\n *  This program is distributed in the hope that it will be useful,            *\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of             *\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the              *\n *  GNU General Public License for more details.                               *\n *                                                                             *\n *  You should have received a copy of the GNU General Public License          *\n *  along with this program. If not, see <http://www.gnu.org/licenses/>.       *\n *                                                                             *\n *******************************************************************************/\n\npackage com.github.shadowsocks.plugin.fragment\n\nimport android.app.Activity\nimport android.content.DialogInterface\nimport android.os.Bundle\nimport android.os.Parcelable\nimport androidx.appcompat.app.AlertDialog\nimport androidx.appcompat.app.AppCompatDialogFragment\nimport androidx.fragment.app.Fragment\nimport androidx.fragment.app.setFragmentResult\nimport androidx.fragment.app.setFragmentResultListener\nimport com.google.android.material.dialog.MaterialAlertDialogBuilder\n\n/**\n * Based on: https://android.googlesource.com/platform/packages/apps/ExactCalculator/+/8c43f06/src/com/android/calculator2/AlertDialogFragment.java\n */\nabstract class AlertDialogFragment<Arg : Parcelable, Ret : Parcelable?> :\n    AppCompatDialogFragment(), DialogInterface.OnClickListener {\n    companion object {\n        private const val KEY_RESULT = \"result\"\n        private const val KEY_ARG = \"arg\"\n        private const val KEY_RET = \"ret\"\n        private const val KEY_WHICH = \"which\"\n\n        fun <Ret : Parcelable> setResultListener(fragment: Fragment, requestKey: String,\n                                                 listener: (Int, Ret?) -> Unit) {\n            fragment.setFragmentResultListener(requestKey) { _, bundle ->\n                listener(bundle.getInt(KEY_WHICH, Activity.RESULT_CANCELED), bundle.getParcelable(KEY_RET))\n            }\n        }\n        inline fun <reified T : AlertDialogFragment<*, Ret>, Ret : Parcelable?> setResultListener(\n            fragment: Fragment, noinline listener: (Int, Ret?) -> Unit) =\n            setResultListener(fragment, T::class.java.name, listener)\n    }\n    protected abstract fun AlertDialog.Builder.prepare(listener: DialogInterface.OnClickListener)\n\n    private val resultKey get() = requireArguments().getString(KEY_RESULT)\n    protected val arg by lazy { requireArguments().getParcelable<Arg>(KEY_ARG)!! }\n    protected open fun ret(which: Int): Ret? = null\n\n    private fun args() = arguments ?: Bundle().also { arguments = it }\n    fun arg(arg: Arg) = args().putParcelable(KEY_ARG, arg)\n    fun key(resultKey: String = javaClass.name) = args().putString(KEY_RESULT, resultKey)\n\n    override fun onCreateDialog(savedInstanceState: Bundle?): AlertDialog =\n        MaterialAlertDialogBuilder(requireContext()).also { it.prepare(this) }.create()\n\n    override fun onClick(dialog: DialogInterface?, which: Int) {\n        setFragmentResult(resultKey ?: return, Bundle().apply {\n            putInt(KEY_WHICH, which)\n            putParcelable(KEY_RET, ret(which) ?: return@apply)\n        })\n    }\n\n    override fun onDismiss(dialog: DialogInterface) {\n        super.onDismiss(dialog)\n        onClick(null, Activity.RESULT_CANCELED)\n    }\n}\n"
  },
  {
    "path": "plugin/src/main/java/com/github/shadowsocks/plugin/fragment/Utils.kt",
    "content": "/*******************************************************************************\n *                                                                             *\n *  Copyright (C) 2020 by Max Lv <max.c.lv@gmail.com>                          *\n *  Copyright (C) 2020 by Mygod Studio <contact-shadowsocks-android@mygod.be>  *\n *                                                                             *\n *  This program is free software: you can redistribute it and/or modify       *\n *  it under the terms of the GNU General Public License as published by       *\n *  the Free Software Foundation, either version 3 of the License, or          *\n *  (at your option) any later version.                                        *\n *                                                                             *\n *  This program is distributed in the hope that it will be useful,            *\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of             *\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the              *\n *  GNU General Public License for more details.                               *\n *                                                                             *\n *  You should have received a copy of the GNU General Public License          *\n *  along with this program. If not, see <http://www.gnu.org/licenses/>.       *\n *                                                                             *\n *******************************************************************************/\n\n@file:JvmName(\"Utils\")\n\npackage com.github.shadowsocks.plugin.fragment\n\nimport androidx.fragment.app.DialogFragment\nimport androidx.fragment.app.FragmentManager\n\ntypealias Empty = com.github.shadowsocks.plugin.Empty\n\n@JvmOverloads\nfun DialogFragment.showAllowingStateLoss(fragmentManager: FragmentManager, tag: String? = null) {\n    if (!fragmentManager.isStateSaved) show(fragmentManager, tag)\n}\n"
  },
  {
    "path": "plugin/src/main/res/color/mtrl_text_btn_text_color_selector.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n    Source: https://github.com/material-components/material-components-android/blob/2de39fafe0285aab7e6e101549c4bc93f184a7e5/lib/java/com/google/android/material/button/res/color/mtrl_text_btn_text_color_selector.xml\n    Copyright 2017 The Android Open Source Project\n    Licensed under the Apache License, Version 2.0 (the \"License\");\n    you may not use this file except in compliance with the License.\n    You may obtain a copy of the License at\n        http://www.apache.org/licenses/LICENSE-2.0\n    Unless required by applicable law or agreed to in writing, software\n    distributed under the License is distributed on an \"AS IS\" BASIS,\n    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n    See the License for the specific language governing permissions and\n    limitations under the License.\n-->\n\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    tools:override=\"true\">\n    <item android:alpha=\"1.00\" android:color=\"@color/color_primary_text\" android:state_checkable=\"true\" android:state_checked=\"true\" android:state_enabled=\"true\"/>\n    <item android:alpha=\"0.60\" android:color=\"?attr/colorOnSurface\" android:state_checkable=\"true\" android:state_checked=\"false\" android:state_enabled=\"true\"/>\n    <item android:alpha=\"1.00\" android:color=\"@color/color_primary_text\" android:state_enabled=\"true\"/>\n    <item android:alpha=\"0.38\" android:color=\"?attr/colorOnSurface\"/>\n</selector>\n"
  },
  {
    "path": "plugin/src/main/res/drawable/ic_navigation_close.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\"\n        android:tint=\"?attr/colorControlNormal\">\n    <path\n        android:fillColor=\"#FFFFFFFF\"\n        android:pathData=\"M19,6.41L17.59,5 12,10.59 6.41,5 5,6.41 10.59,12 5,17.59 6.41,19 12,13.41 17.59,19 19,17.59 13.41,12z\"/>\n</vector>\n"
  },
  {
    "path": "plugin/src/main/res/layout/toolbar_light_dark.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<com.google.android.material.appbar.MaterialToolbar\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:layout_height=\"?attr/actionBarSize\"\n    android:layout_width=\"match_parent\"\n    android:background=\"?attr/colorPrimary\"\n    android:elevation=\"4dp\"\n    android:touchscreenBlocksFocus=\"false\"\n    android:theme=\"@style/ThemeOverlay.AppCompat.Dark.ActionBar\"\n    app:popupTheme=\"@style/ThemeOverlay.AppCompat.DayNight\"\n    android:id=\"@+id/toolbar\" />\n"
  },
  {
    "path": "plugin/src/main/res/values/colors.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<resources>\n\n  <color name=\"material_green_700\">#388E3C</color>\n  <color name=\"material_green_a700\">#00C853</color>\n  <color name=\"material_blue_grey_100\">#CFD8DC</color>\n  <color name=\"material_blue_grey_300\">#90A4AE</color>\n  <color name=\"material_blue_grey_500\">#607D8B</color>\n  <color name=\"material_blue_grey_600\">#546E7A</color>\n  <color name=\"material_blue_grey_700\">#455A64</color>\n  <color name=\"material_primary_100\">@color/material_blue_grey_100</color>\n  <color name=\"material_primary_300\">@color/material_blue_grey_300</color>\n  <color name=\"material_primary_500\">@color/material_blue_grey_500</color>\n  <color name=\"material_primary_600\">@color/material_blue_grey_600</color>\n  <color name=\"material_primary_700\">@color/material_blue_grey_700</color>\n  <color name=\"material_primary_800\">@color/material_blue_grey_800</color>\n  <color name=\"material_primary_900\">@color/material_blue_grey_900</color>\n  <color name=\"material_accent_200\">@color/material_green_a700</color>\n\n  <color name=\"light_color_primary\">@color/material_primary_500</color>\n  <color name=\"light_color_primary_dark\">@color/material_primary_700</color>\n  <color name=\"light_color_primary_text\">@color/material_primary_500</color>\n  <color name=\"dark_color_primary\">@color/material_primary_800</color>\n  <color name=\"dark_color_primary_dark\">@color/material_primary_900</color>\n  <color name=\"dark_color_primary_text\">@color/material_primary_300</color>\n\n  <color name=\"color_primary\">@color/light_color_primary</color>\n  <color name=\"color_primary_dark\">@color/light_color_primary_dark</color>\n  <color name=\"color_primary_text\">@color/light_color_primary_text</color>\n  \n</resources>\n"
  },
  {
    "path": "plugin/src/main/res/values/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"proxy_cat\">Server Settings</string>\n    <string name=\"feature_cat\">Feature Settings</string>\n    <string name=\"unsaved_changes_prompt\">Changes not saved. Do you want to save?</string>\n    <string name=\"yes\">Yes</string>\n    <string name=\"no\">No</string>\n    <string name=\"apply\">Apply</string>\n    <string name=\"browse\">Browse…</string>\n    <string name=\"file_manager_missing\">Please install a file manager like MiXplorer</string>\n</resources>\n"
  },
  {
    "path": "plugin/src/main/res/values/styles.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources xmlns:tools=\"http://schemas.android.com/tools\">\n    <style name=\"Theme.Shadowsocks\" parent=\"Theme.MaterialComponents.DayNight.DarkActionBar\">\n        <item name=\"android:navigationBarColor\">@color/color_primary_dark</item>\n        <!-- https://github.com/google/play-services-plugins/issues/296 -->\n        <item name=\"android:windowOptOutEdgeToEdgeEnforcement\" tools:targetApi=\"35\">true</item>\n        <item name=\"actionBarStyle\">@style/Widget.MaterialComponents.Light.ActionBar.Solid</item>\n        <item name=\"actionModeCloseDrawable\">@drawable/ic_navigation_close</item>\n        <item name=\"colorAccent\">@color/material_accent_200</item>\n        <item name=\"colorButtonNormal\">@color/material_accent_200</item>\n        <item name=\"colorPrimary\">@color/color_primary</item>\n        <item name=\"colorPrimaryDark\">@color/color_primary_dark</item>\n        <item name=\"windowActionModeOverlay\">true</item>\n\n        <!-- Remove ActionBar but keep styles and themes -->\n        <item name=\"windowActionBar\">false</item>\n        <item name=\"windowNoTitle\">true</item>\n    </style>\n    <style name=\"Theme.Shadowsocks.ActionBar\">\n        <item name=\"windowActionBar\">true</item>\n        <item name=\"windowNoTitle\">false</item>\n    </style>\n    <style name=\"Theme.Shadowsocks.Immersive\">\n        <item name=\"android:navigationBarColor\">#6000</item>\n    </style>\n    <style name=\"Theme.Shadowsocks.Translucent\" parent=\"Theme.MaterialComponents.Dialog\">\n        <item name=\"android:windowBackground\">@android:color/transparent</item>\n        <item name=\"android:windowFrame\">@null</item>\n        <item name=\"android:windowContentOverlay\">@null</item>\n        <item name=\"android:windowAnimationStyle\">@null</item>\n        <item name=\"android:backgroundDimEnabled\">false</item>\n        <item name=\"android:windowIsTranslucent\">true</item>\n        <item name=\"android:windowNoTitle\">true</item>\n        <item name=\"android:windowCloseOnTouchOutside\">false</item>\n        <item name=\"colorAccent\">@color/material_accent_200</item>\n        <item name=\"colorButtonNormal\">@color/material_accent_200</item>\n        <item name=\"colorPrimary\">@color/color_primary</item>\n        <item name=\"colorPrimaryDark\">@color/color_primary_dark</item>\n        <item name=\"windowNoTitle\">true</item>\n    </style>\n    <style name=\"Theme.AppCompat.Translucent\" parent=\"Theme.AppCompat.Dialog\">\n        <item name=\"android:windowBackground\">@android:color/transparent</item>\n        <item name=\"android:windowFrame\">@null</item>\n        <item name=\"android:windowContentOverlay\">@null</item>\n        <item name=\"android:windowAnimationStyle\">@null</item>\n        <item name=\"android:backgroundDimEnabled\">false</item>\n        <item name=\"android:windowIsTranslucent\">true</item>\n        <item name=\"android:windowNoTitle\">true</item>\n        <item name=\"android:windowCloseOnTouchOutside\">false</item>\n        <item name=\"windowNoTitle\">true</item>\n    </style>\n</resources>\n"
  },
  {
    "path": "plugin/src/main/res/values-de/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n    Copyright (C) 2019 by Max Lv <max.c.lv@gmail.com>\n    Copyright (C) 2019 by Mygod Studio <contact-shadowsocks-android@mygod.be>\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n    DO NOT EDIT: This file was automagically generated by script.\n    If you are looking for contributing a translation, read this:\n    https://discourse.shadowsocks.org/t/poeditor-translation-main-thread/30\n-->\n\n<resources>\n    <string name=\"proxy_cat\">\"Servereinstellungen\"</string>\n    <string name=\"feature_cat\">\"Funktionseinstellungen\"</string>\n    <string name=\"unsaved_changes_prompt\">\"Änderungen nicht gespeichert. Speichern?\"</string>\n    <string name=\"yes\">\"Ja\"</string>\n    <string name=\"no\">\"Nein\"</string>\n    <string name=\"apply\">\"Anwenden\"</string>\n    <string name=\"file_manager_missing\">\"Bitte installiere einen Dateimanager, z.B. MiXplorer\"</string>\n    <string name=\"browse\">\"Durchsuchen...\"</string>\n</resources>"
  },
  {
    "path": "plugin/src/main/res/values-es/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n    Copyright (C) 2019 by Max Lv <max.c.lv@gmail.com>\n    Copyright (C) 2019 by Mygod Studio <contact-shadowsocks-android@mygod.be>\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n    DO NOT EDIT: This file was automagically generated by script.\n    If you are looking for contributing a translation, read this:\n    https://discourse.shadowsocks.org/t/poeditor-translation-main-thread/30\n-->\n\n<resources>\n    <string name=\"proxy_cat\">\"Propiedades del Servidor\"</string>\n    <string name=\"yes\">\"Sí\"</string>\n    <string name=\"no\">\"No\"</string>\n    <string name=\"apply\">\"Aplicar\"</string>\n    <string name=\"file_manager_missing\">\"Por favor, instala un explorador de archivos como MiXplorer\"</string>\n</resources>"
  },
  {
    "path": "plugin/src/main/res/values-fa/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n    Copyright (C) 2019 by Max Lv <max.c.lv@gmail.com>\n    Copyright (C) 2019 by Mygod Studio <contact-shadowsocks-android@mygod.be>\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n    DO NOT EDIT: This file was automagically generated by script.\n    If you are looking for contributing a translation, read this:\n    https://discourse.shadowsocks.org/t/poeditor-translation-main-thread/30\n-->\n\n<resources>\n    <string name=\"proxy_cat\">\"تنظیمات سرور\"</string>\n    <string name=\"feature_cat\">\"تنظیمات ویژگی‌ها\"</string>\n    <string name=\"unsaved_changes_prompt\">\"تغییرات ذخیره نشده‌اند. ذخیره شوند؟\"</string>\n    <string name=\"yes\">\"بله\"</string>\n    <string name=\"no\">\"خیر\"</string>\n    <string name=\"apply\">\"تایید\"</string>\n    <string name=\"file_manager_missing\">\"لطفاً یک فایل منیجر مانند MiXplorer نصب کنید\"</string>\n    <string name=\"browse\">\"مرور کردن...\"</string>\n</resources>"
  },
  {
    "path": "plugin/src/main/res/values-fr/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n    Copyright (C) 2019 by Max Lv <max.c.lv@gmail.com>\n    Copyright (C) 2019 by Mygod Studio <contact-shadowsocks-android@mygod.be>\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n    DO NOT EDIT: This file was automagically generated by script.\n    If you are looking for contributing a translation, read this:\n    https://discourse.shadowsocks.org/t/poeditor-translation-main-thread/30\n-->\n\n<resources>\n    <string name=\"proxy_cat\">\"Paramètres du Serveur\"</string>\n    <string name=\"feature_cat\">\"Paramètres des Fonctionnalités\"</string>\n    <string name=\"unsaved_changes_prompt\">\"Changements non enregistrés. Voulez-vous enregistrer ?\"</string>\n    <string name=\"yes\">\"Oui\"</string>\n    <string name=\"no\">\"Non\"</string>\n    <string name=\"apply\">\"Appliquer\"</string>\n    <string name=\"file_manager_missing\">\"Veuillez installer un gestionnaire de fichier tel que MiXplorer\"</string>\n</resources>"
  },
  {
    "path": "plugin/src/main/res/values-ja/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n    Copyright (C) 2019 by Max Lv <max.c.lv@gmail.com>\n    Copyright (C) 2019 by Mygod Studio <contact-shadowsocks-android@mygod.be>\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n    DO NOT EDIT: This file was automagically generated by script.\n    If you are looking for contributing a translation, read this:\n    https://discourse.shadowsocks.org/t/poeditor-translation-main-thread/30\n-->\n\n<resources>\n    <string name=\"proxy_cat\">\"サーバー設定\"</string>\n    <string name=\"feature_cat\">\"機能設定\"</string>\n    <string name=\"unsaved_changes_prompt\">\"変更は保存されておりません、保存しますか？\"</string>\n    <string name=\"yes\">\"はい\"</string>\n    <string name=\"no\">\"いいえ\"</string>\n    <string name=\"apply\">\"適応\"</string>\n    <string name=\"file_manager_missing\">\"ファイルマネージャーをインストールしてください（MiXplorerなど）\"</string>\n    <string name=\"browse\">\"参照…\"</string>\n</resources>"
  },
  {
    "path": "plugin/src/main/res/values-ko/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n    Copyright (C) 2019 by Max Lv <max.c.lv@gmail.com>\n    Copyright (C) 2019 by Mygod Studio <contact-shadowsocks-android@mygod.be>\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n    DO NOT EDIT: This file was automagically generated by script.\n    If you are looking for contributing a translation, read this:\n    https://discourse.shadowsocks.org/t/poeditor-translation-main-thread/30\n-->\n\n<resources>\n    <string name=\"proxy_cat\">\"서버 설정\"</string>\n    <string name=\"feature_cat\">\"기능 설정\"</string>\n    <string name=\"unsaved_changes_prompt\">\"변경 사항이 저장되지 않았습니다. 저장하시겠습니까?\"</string>\n    <string name=\"yes\">\"예\"</string>\n    <string name=\"no\">\"아니오\"</string>\n    <string name=\"apply\">\"적용\"</string>\n</resources>"
  },
  {
    "path": "plugin/src/main/res/values-night/colors.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <color name=\"color_primary\">@color/dark_color_primary</color>\n    <color name=\"color_primary_dark\">@color/dark_color_primary_dark</color>\n    <color name=\"color_primary_text\">@color/dark_color_primary_text</color>\n</resources>\n"
  },
  {
    "path": "plugin/src/main/res/values-ru/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n    Copyright (C) 2019 by Max Lv <max.c.lv@gmail.com>\n    Copyright (C) 2019 by Mygod Studio <contact-shadowsocks-android@mygod.be>\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n    DO NOT EDIT: This file was automagically generated by script.\n    If you are looking for contributing a translation, read this:\n    https://discourse.shadowsocks.org/t/poeditor-translation-main-thread/30\n-->\n\n<resources>\n    <string name=\"proxy_cat\">\"Настройки сервера\"</string>\n    <string name=\"feature_cat\">\"Функции\"</string>\n    <string name=\"unsaved_changes_prompt\">\"Сохранить изменения?\"</string>\n    <string name=\"yes\">\"Да\"</string>\n    <string name=\"no\">\"Нет\"</string>\n    <string name=\"apply\">\"Применить\"</string>\n    <string name=\"file_manager_missing\">\"Установите файловый менеджер (например, MiXplorer)\"</string>\n    <string name=\"browse\">\"Открыть…\"</string>\n</resources>"
  },
  {
    "path": "plugin/src/main/res/values-tr/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n    Copyright (C) 2019 by Max Lv <max.c.lv@gmail.com>\n    Copyright (C) 2019 by Mygod Studio <contact-shadowsocks-android@mygod.be>\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n    DO NOT EDIT: This file was automagically generated by script.\n    If you are looking for contributing a translation, read this:\n    https://discourse.shadowsocks.org/t/poeditor-translation-main-thread/30\n-->\n\n<resources>\n    <string name=\"proxy_cat\">\"Sunucu Ayarları\"</string>\n    <string name=\"feature_cat\">\"Özellik Ayarları\"</string>\n    <string name=\"unsaved_changes_prompt\">\"Değişiklikler kaydedilmedi. Kaydetmek ister misiniz?\"</string>\n    <string name=\"yes\">\"Evet\"</string>\n    <string name=\"no\">\"Hayır\"</string>\n    <string name=\"apply\">\"Uygula\"</string>\n</resources>"
  },
  {
    "path": "plugin/src/main/res/values-uk/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n    Copyright (C) 2019 by Max Lv <max.c.lv@gmail.com>\n    Copyright (C) 2019 by Mygod Studio <contact-shadowsocks-android@mygod.be>\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n    DO NOT EDIT: This file was automagically generated by script.\n    If you are looking for contributing a translation, read this:\n    https://discourse.shadowsocks.org/t/poeditor-translation-main-thread/30\n-->\n\n<resources>\n    <string name=\"proxy_cat\">\"Налаштування сервера\"</string>\n    <string name=\"feature_cat\">\"Налаштування функцій\"</string>\n    <string name=\"unsaved_changes_prompt\">\"Зміни не збережено. Зберегти?\"</string>\n    <string name=\"yes\">\"Так\"</string>\n    <string name=\"no\">\"Ні\"</string>\n    <string name=\"apply\">\"Застосувати\"</string>\n    <string name=\"file_manager_missing\">\"Будь ласка, встановіть менеджер файлів, наприклад, MiXplorer\"</string>\n</resources>"
  },
  {
    "path": "plugin/src/main/res/values-v29/styles.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <style name=\"Theme.Shadowsocks.Immersive\">\n        <item name=\"android:navigationBarColor\">@android:color/transparent</item>\n    </style>\n</resources>\n"
  },
  {
    "path": "plugin/src/main/res/values-zh-rCN/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n    Copyright (C) 2019 by Max Lv <max.c.lv@gmail.com>\n    Copyright (C) 2019 by Mygod Studio <contact-shadowsocks-android@mygod.be>\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n    DO NOT EDIT: This file was automagically generated by script.\n    If you are looking for contributing a translation, read this:\n    https://discourse.shadowsocks.org/t/poeditor-translation-main-thread/30\n-->\n\n<resources>\n    <string name=\"proxy_cat\">\"服务器设置\"</string>\n    <string name=\"feature_cat\">\"功能设置\"</string>\n    <string name=\"unsaved_changes_prompt\">\"是否要保存修改？\"</string>\n    <string name=\"yes\">\"是\"</string>\n    <string name=\"no\">\"否\"</string>\n    <string name=\"apply\">\"应用\"</string>\n    <string name=\"file_manager_missing\">\"请安装文件管理器，如 MiXplorer\"</string>\n    <string name=\"browse\">\"浏览…\"</string>\n</resources>"
  },
  {
    "path": "plugin/src/main/res/values-zh-rTW/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n    Copyright (C) 2019 by Max Lv <max.c.lv@gmail.com>\n    Copyright (C) 2019 by Mygod Studio <contact-shadowsocks-android@mygod.be>\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n    DO NOT EDIT: This file was automagically generated by script.\n    If you are looking for contributing a translation, read this:\n    https://discourse.shadowsocks.org/t/poeditor-translation-main-thread/30\n-->\n\n<resources>\n    <string name=\"proxy_cat\">\"伺服器設定\"</string>\n    <string name=\"feature_cat\">\"功能設定\"</string>\n    <string name=\"unsaved_changes_prompt\">\"要儲存變更嗎？\"</string>\n    <string name=\"yes\">\"是\"</string>\n    <string name=\"no\">\"否\"</string>\n    <string name=\"apply\">\"套用\"</string>\n    <string name=\"file_manager_missing\">\"請安裝文件管理器，如 MiXplorer\"</string>\n    <string name=\"browse\">\"瀏覽…\"</string>\n</resources>"
  },
  {
    "path": "plugin/src/test/java/com/github/shadowsocks/plugin/PluginOptionsTest.kt",
    "content": "/*******************************************************************************\n *                                                                             *\n *  Copyright (C) 2017 by Max Lv <max.c.lv@gmail.com>                          *\n *  Copyright (C) 2017 by Mygod Studio <contact-shadowsocks-android@mygod.be>  *\n *                                                                             *\n *  This program is free software: you can redistribute it and/or modify       *\n *  it under the terms of the GNU General Public License as published by       *\n *  the Free Software Foundation, either version 3 of the License, or          *\n *  (at your option) any later version.                                        *\n *                                                                             *\n *  This program is distributed in the hope that it will be useful,            *\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of             *\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the              *\n *  GNU General Public License for more details.                               *\n *                                                                             *\n *  You should have received a copy of the GNU General Public License          *\n *  along with this program. If not, see <http://www.gnu.org/licenses/>.       *\n *                                                                             *\n *******************************************************************************/\n\npackage com.github.shadowsocks.plugin\n\nimport org.junit.Assert\nimport org.junit.Test\n\nclass PluginOptionsTest {\n    @Test\n    fun basic() {\n        val o1 = PluginOptions(\"obfs-local;obfs=http;obfs-host=localhost\")\n        val o2 = PluginOptions(\"obfs-local\", \"obfs-host=localhost;obfs=http\")\n        Assert.assertEquals(o1.hashCode(), o2.hashCode())\n        Assert.assertEquals(true, o1 == o2)\n        val o3 = PluginOptions(o1.toString(false))\n        Assert.assertEquals(true, o2 == o3)\n        val o4 = PluginOptions(o2.id, o2.toString())\n        Assert.assertEquals(true, o3 == o4)\n    }\n\n    @Test\n    fun nullValues() {\n        val o = PluginOptions(\"\", \"a;b;c;d=3\")\n        Assert.assertEquals(true, o == PluginOptions(\"\", o.toString()))\n    }\n\n    @Test\n    fun escape() {\n        val options = PluginOptions(\"escapeTest\")\n        options[\"subject\"] = \"value;semicolon\"\n        Assert.assertEquals(true, options == PluginOptions(options.toString(false)))\n        options[\"key;semicolon\"] = \"object\"\n        Assert.assertEquals(true, options == PluginOptions(options.toString(false)))\n        options[\"subject\"] = \"value=equals\"\n        Assert.assertEquals(true, options == PluginOptions(options.toString(false)))\n        options[\"key=equals\"] = \"object\"\n        Assert.assertEquals(true, options == PluginOptions(options.toString(false)))\n        options[\"advanced\\\\=;test\"] = \"in;=\\\\progress\"\n        Assert.assertEquals(true, options == PluginOptions(options.toString(false)))\n    }\n}\n"
  },
  {
    "path": "privacy_policy.md",
    "content": "## Privacy Policy\n\nThe shadowsocks-android  is built as an Open Source software. This app is provided by Shadowsocks Team at no cost and is intended for use as is.\n\nThis page is used to inform visitors regarding our policies with the collection, use, and disclosure of Personal Information if anyone decided to use our app.\n\nIf you choose to use our app, then you agree to the collection and use of information in relation to this policy. The Personal Information that we collect is used for providing and improving the app. We will not use or share your information with anyone except as described in this Privacy Policy.\n\nThe terms used in this Privacy Policy have the same meanings as in our Terms and Conditions, which is accessible at Shadowsocks-android unless otherwise defined in this Privacy Policy.\n\n**Information Collection and Use**\n\nFor a better experience, while using our app, we may require you to provide us with certain personally identifiable information. The information that we request will be retained by us and used as described in this privacy policy.\n\nThe app does use third party services that may collect information used to identify you.\n\nLink to privacy policy of third party service providers used by the app\n\n*   [Google Play Services](https://www.google.com/policies/privacy/)\n*   [AdMob](https://support.google.com/admob/answer/6128543?hl=en)\n*   [Firebase Analytics](https://firebase.google.com/policies/analytics)\n\n**Log Data**\n\nWe want to inform you that whenever you use our app, in a case of an error in the app we collect data and information (through third party products) on your phone called Log Data. This Log Data may include information such as your device Internet Protocol (“IP”) address, device name, operating system version, the configuration of the app when utilizing our App, the time and date of your use of the app, and other statistics.\n\n**Cookies**\n\nCookies are files with a small amount of data that are commonly used as anonymous unique identifiers. These are sent to your browser from the websites that you visit and are stored on your device's internal memory.\n\nThis app does not use these “cookies” explicitly. However, the app may use third party code and libraries that use “cookies” to collect information and improve their services. You have the option to either accept or refuse these cookies and know when a cookie is being sent to your device. If you choose to refuse our cookies, you may not be able to use some portions of this app.\n\n**Security**\n\nWe value your trust in providing us your Personal Information, thus we are striving to use commercially acceptable means of protecting it. But remember that no method of transmission over the internet, or method of electronic storage is 100% secure and reliable, and we cannot guarantee its absolute security.\n\n**Links to Other Sites**\n\nThis app may contain links to other sites. If you click on a third-party link, you will be directed to that site. Note that these external sites are not operated by us. Therefore, we strongly advise you to review the Privacy Policy of these websites. We have no control over and assume no responsibility for the content, privacy policies, or practices of any third-party sites or services.\n\n**Children’s Privacy**\n\nThese Services do not address anyone under the age of 13\\. We do not knowingly collect personally identifiable information from children under 13\\. In the case we discover that a child under 13 has provided us with personal information, we immediately delete this from our servers. If you are a parent or guardian and you are aware that your child has provided us with personal information, please contact us so that we will be able to do necessary actions.\n\n**Changes to This Privacy Policy**\n\nWe may update our Privacy Policy from time to time. Thus, you are advised to review this page periodically for any changes. We will notify you of any changes by posting the new Privacy Policy on this page. These changes are effective immediately after they are posted on this page.\n\n**Contact Us**\n\nIf you have any questions or suggestions about our Privacy Policy, do not hesitate to contact us.\n"
  },
  {
    "path": "release.sh",
    "content": "#!/bin/bash\n\nrelease=$1\ncp mobile/build/outputs/apk/release/mobile-armeabi-v7a-release.apk         shadowsocks-armeabi-v7a-\"${release}\".apk\ncp mobile/build/outputs/apk/release/mobile-arm64-v8a-release.apk           shadowsocks-arm64-v8a-\"${release}\".apk\ncp mobile/build/outputs/apk/release/mobile-x86-release.apk                 shadowsocks-x86-\"${release}\".apk\ncp mobile/build/outputs/apk/release/mobile-x86_64-release.apk              shadowsocks-x86_64-\"${release}\".apk\ncp mobile/build/outputs/apk/release/mobile-universal-release.apk           shadowsocks--universal-\"${release}\".apk\ncp tv/build/outputs/apk/freedom/release/tv-freedom-armeabi-v7a-release.apk shadowsocks-tv-armeabi-v7a-\"${release}\".apk\ncp tv/build/outputs/apk/freedom/release/tv-freedom-arm64-v8a-release.apk   shadowsocks-tv-arm64-v8a-\"${release}\".apk\ncp tv/build/outputs/apk/freedom/release/tv-freedom-x86-release.apk         shadowsocks-tv-x86-\"${release}\".apk\ncp tv/build/outputs/apk/freedom/release/tv-freedom-x86_64-release.apk      shadowsocks-tv-x86_64-\"${release}\".apk\ncp tv/build/outputs/apk/freedom/release/tv-freedom-universal-release.apk   shadowsocks-tv-universal-\"${release}\".apk\n"
  },
  {
    "path": "repositories.gradle.kts",
    "content": "repositories {\n    google()\n    mavenCentral()\n}\n"
  },
  {
    "path": "settings.gradle.kts",
    "content": "plugins {\n    id(\"org.gradle.toolchains.foojay-resolver-convention\") version \"1.0.0\"\n}\ninclude(\":core\", \":plugin\", \":mobile\", \":tv\")\n"
  },
  {
    "path": "test-e2e.sh",
    "content": "#!/usr/bin/env bash\n#\n# End-to-end test: shadowsocks-android on Android emulator\n#\n# Boots an emulator, starts ssserver on the host, installs the debug APK,\n# modifies the default profile via run-as + sqlite3 to point to our server,\n# taps the FAB to connect VPN, then verifies connectivity.\n#\nset -euo pipefail\n\n# ── Paths ───────────────────────────────────────────────────────────────────\nSCRIPT_DIR=\"$(cd \"$(dirname \"$0\")\" && pwd)\"\nEMULATOR=\"${EMULATOR:-/Volumes/Data/workspace/android/emulator/emulator}\"\nADB=\"${ADB:-/Volumes/Data/workspace/android/platform-tools/adb}\"\nAVD=\"${AVD:-Medium_Phone_API_36.1}\"\nAPK=\"${APK:-$SCRIPT_DIR/mobile/build/outputs/apk/debug/mobile-arm64-v8a-debug.apk}\"\nSSSERVER=\"${SSSERVER:-$SCRIPT_DIR/core/src/main/rust/shadowsocks-rust/target/release/ssserver}\"\nPKG=\"com.github.shadowsocks\"\n\n# ── SS config ───────────────────────────────────────────────────────────────\nSS_ADDR=\"0.0.0.0:8388\"\nSS_PASSWORD=\"testpassword123\"\nSS_METHOD=\"aes-256-gcm\"\nSS_HOST_FROM_EMU=\"10.0.2.2\"\nSS_PORT=8388\n\n# ── Cleanup trap ────────────────────────────────────────────────────────────\nSSSERVER_PID=\"\"\ncleanup() {\n    echo \"\"\n    echo \"=== Cleanup ===\"\n    if [[ -n \"$SSSERVER_PID\" ]] && kill -0 \"$SSSERVER_PID\" 2>/dev/null; then\n        echo \"Killing ssserver (PID $SSSERVER_PID)\"\n        kill \"$SSSERVER_PID\" 2>/dev/null || true\n        wait \"$SSSERVER_PID\" 2>/dev/null || true\n    fi\n    if [[ \"${SKIP_EMULATOR_BOOT:-}\" != \"true\" ]] && \"$ADB\" get-state &>/dev/null; then\n        echo \"Shutting down emulator...\"\n        \"$ADB\" emu kill 2>/dev/null || true\n    fi\n    echo \"Cleanup done.\"\n}\ntrap cleanup EXIT\n\n# ── Helpers ─────────────────────────────────────────────────────────────────\nfail() { echo \"FAIL: $*\" >&2; exit 1; }\ninfo() { echo \"--- $*\"; }\n\nwait_for_boot() {\n    info \"Waiting for emulator to boot...\"\n    \"$ADB\" wait-for-device\n    local n=0\n    while [[ $n -lt 120 ]]; do\n        local val\n        val=$(\"$ADB\" shell getprop sys.boot_completed 2>/dev/null | tr -d '\\r\\n')\n        if [[ \"$val\" == \"1\" ]]; then\n            info \"Emulator booted.\"\n            return 0\n        fi\n        sleep 2\n        n=$((n + 2))\n    done\n    fail \"Emulator did not boot within 120s\"\n}\n\nscreenshot() {\n    local name=\"$1\"\n    \"$ADB\" shell screencap -p /sdcard/screen_${name}.png 2>/dev/null || true\n    \"$ADB\" pull /sdcard/screen_${name}.png \"$SCRIPT_DIR/screen_${name}.png\" 2>/dev/null || true\n    info \"  Screenshot saved: screen_${name}.png\"\n}\n\n# ────────────────────────────────────────────────────────────────────────────\n# Step 1: Verify prerequisites\n# ────────────────────────────────────────────────────────────────────────────\ninfo \"Step 1: Verify prerequisites\"\n[[ -f \"$SSSERVER\" ]] || command -v \"$SSSERVER\" &>/dev/null || fail \"ssserver not found at $SSSERVER\"\n[[ -f \"$APK\" ]]      || fail \"APK not found at $APK\"\n[[ \"${SKIP_EMULATOR_BOOT:-}\" == \"true\" ]] || [[ -x \"$EMULATOR\" ]] || command -v \"$EMULATOR\" &>/dev/null || fail \"Emulator not found at $EMULATOR\"\n[[ -x \"$ADB\" ]]      || command -v \"$ADB\" &>/dev/null      || fail \"adb not found at $ADB\"\ninfo \"All prerequisites OK.\"\n\n# ────────────────────────────────────────────────────────────────────────────\n# Step 2: Start ssserver\n# ────────────────────────────────────────────────────────────────────────────\ninfo \"Step 2: Starting ssserver on $SS_ADDR ...\"\n\"$SSSERVER\" -s \"$SS_ADDR\" -k \"$SS_PASSWORD\" -m \"$SS_METHOD\" -U &\nSSSERVER_PID=$!\nsleep 1\nkill -0 \"$SSSERVER_PID\" 2>/dev/null || fail \"ssserver failed to start\"\ninfo \"ssserver running (PID $SSSERVER_PID)\"\n\n# ────────────────────────────────────────────────────────────────────────────\n# Step 3: Boot emulator\n# ────────────────────────────────────────────────────────────────────────────\nif [[ \"${SKIP_EMULATOR_BOOT:-}\" == \"true\" ]]; then\n    info \"Step 3: Skipping emulator boot (SKIP_EMULATOR_BOOT=true)\"\n    \"$ADB\" wait-for-device\n    info \"  Emulator already running.\"\nelse\n    info \"Step 3: Booting emulator ($AVD) ...\"\n    \"$EMULATOR\" -avd \"$AVD\" -no-snapshot-load -no-audio -gpu auto &\n    wait_for_boot\n    sleep 5\n    \"$ADB\" shell input keyevent KEYCODE_HOME\n    sleep 2\nfi\n\n# Disable animations for reliable UI automation\n\"$ADB\" shell settings put global window_animation_scale 0\n\"$ADB\" shell settings put global transition_animation_scale 0\n\"$ADB\" shell settings put global animator_duration_scale 0\n\n# ────────────────────────────────────────────────────────────────────────────\n# Step 4: Install APK\n# ────────────────────────────────────────────────────────────────────────────\ninfo \"Step 4: Installing debug APK ...\"\n# Uninstall any existing version first (release vs debug signatures differ)\n\"$ADB\" uninstall \"$PKG\" 2>/dev/null || true\n\"$ADB\" install -g \"$APK\" || fail \"APK install failed\"\ninfo \"APK installed.\"\n\n# ────────────────────────────────────────────────────────────────────────────\n# Step 5: Configure server profile via run-as + sqlite3\n# ────────────────────────────────────────────────────────────────────────────\ninfo \"Step 5: Configuring profile...\"\n\n# 5a. Launch app once to initialize databases.\n# ensureNotEmpty() creates a default profile (id=1) and sets profileId=1.\n# serviceMode defaults to \"vpn\".\ninfo \"  Launching app to initialize databases...\"\n\"$ADB\" shell am start -W -n \"$PKG/.MainActivity\"\nsleep 8\nscreenshot \"01_init\"\n# Force a checkpoint to flush WAL into main database file\n\"$ADB\" shell am force-stop \"$PKG\"\nsleep 2\n\n# 5b. Update the default profile (id=1) to point to our test server.\n# Profile table columns: id, name, host, remotePort, password, method, ...\n# With debug build, we can use run-as to copy the database out, modify it, and copy it back.\ninfo \"  Updating default profile via sqlite3...\"\n\n# Extract profile.db and WAL/SHM files using exec-out (binary-safe)\n\"$ADB\" exec-out run-as \"$PKG\" cat databases/profile.db > /tmp/profile.db\n\"$ADB\" exec-out run-as \"$PKG\" cat databases/profile.db-wal > /tmp/profile.db-wal 2>/dev/null || true\n\"$ADB\" exec-out run-as \"$PKG\" cat databases/profile.db-shm > /tmp/profile.db-shm 2>/dev/null || true\n\n# Verify and checkpoint WAL into main DB\nfile /tmp/profile.db\nsqlite3 /tmp/profile.db \"PRAGMA wal_checkpoint(TRUNCATE);\" 2>/dev/null || true\n\n# Check tables\ninfo \"  Tables in profile.db:\"\nsqlite3 /tmp/profile.db \".tables\" | while IFS= read -r line; do\n    info \"    $line\"\ndone\n\nif ! sqlite3 /tmp/profile.db \"SELECT count(*) FROM Profile;\" >/dev/null 2>&1; then\n    fail \"Profile table not found — database may not have been initialized\"\nfi\n\n# Modify the profile using host sqlite3\nsqlite3 /tmp/profile.db \"UPDATE Profile SET host='$SS_HOST_FROM_EMU', remotePort=$SS_PORT, password='$SS_PASSWORD', method='$SS_METHOD', name='Test Server' WHERE id=1;\"\n\n# Verify update\ninfo \"  Verifying profile update...\"\nsqlite3 /tmp/profile.db \"SELECT id, name, host, remotePort, method FROM Profile;\" | while IFS= read -r line; do\n    info \"    Profile: $line\"\ndone\n\n# Push modified database back (without WAL — clean state)\nrm -f /tmp/profile.db-wal /tmp/profile.db-shm\n\"$ADB\" push /tmp/profile.db /data/local/tmp/profile.db\n\"$ADB\" shell \"cat /data/local/tmp/profile.db | run-as $PKG sh -c 'cat > databases/profile.db'\"\n# Remove old WAL/SHM so Room starts fresh\n\"$ADB\" shell \"run-as $PKG rm -f databases/profile.db-wal databases/profile.db-shm\"\n\"$ADB\" shell rm /data/local/tmp/profile.db\n\ninfo \"  Profile configuration done.\"\n\n# ────────────────────────────────────────────────────────────────────────────\n# Step 6: Enable VPN\n# ────────────────────────────────────────────────────────────────────────────\ninfo \"Step 6: Enabling VPN...\"\n\n# Launch the app\n\"$ADB\" shell am start -W -n \"$PKG/.MainActivity\"\nsleep 3\nscreenshot \"02_app_launched\"\n\n# Get screen dimensions\nSCREEN_SIZE=$(\"$ADB\" shell wm size | grep -oE '[0-9]+x[0-9]+' | tail -1)\nSCREEN_W=$(echo \"$SCREEN_SIZE\" | cut -dx -f1)\nSCREEN_H=$(echo \"$SCREEN_SIZE\" | cut -dx -f2)\ninfo \"  Screen: ${SCREEN_W}x${SCREEN_H}\"\n\n# Tap the FAB (connect button) — centered horizontally, near bottom.\n# On 1080x2400 @420dpi the FAB center is at ~93.5% of screen height.\nFAB_X=$((SCREEN_W / 2))\nFAB_Y=$((SCREEN_H * 93 / 100))\ninfo \"  Tapping FAB at ($FAB_X, $FAB_Y)...\"\n\"$ADB\" shell input tap \"$FAB_X\" \"$FAB_Y\"\nsleep 2\nscreenshot \"03_after_fab_tap\"\n\n# Handle VPN consent dialog\ninfo \"  Checking for VPN consent dialog...\"\nVPN_ACCEPTED=false\nfor i in $(seq 1 15); do\n    ACTIVITIES=$(\"$ADB\" shell dumpsys activity activities 2>/dev/null || true)\n    if echo \"$ACTIVITIES\" | grep -qi \"vpndialogs\\|com.android.vpndialogs\"; then\n        info \"  VPN consent dialog detected, accepting...\"\n        screenshot \"04_vpn_dialog\"\n        sleep 1\n\n        # Use uiautomator dump to find the exact OK button coordinates\n        \"$ADB\" shell uiautomator dump /sdcard/ui_dump.xml 2>/dev/null || true\n        \"$ADB\" pull /sdcard/ui_dump.xml /tmp/ui_dump.xml 2>/dev/null || true\n        UI_XML=$(cat /tmp/ui_dump.xml 2>/dev/null || true)\n        info \"  UI dump obtained (${#UI_XML} chars)\"\n\n        # Log all button texts found for debugging\n        BUTTONS=$(echo \"$UI_XML\" | tr '>' '\\n' | grep -o 'text=\"[^\"]*\".*bounds=\"[^\"]*\"' || true)\n        info \"  Buttons found:\"\n        echo \"$BUTTONS\" | while IFS= read -r line; do\n            [[ -n \"$line\" ]] && info \"    $line\"\n        done\n\n        # Extract OK button bounds from XML: text=\"OK\" ... bounds=\"[x1,y1][x2,y2]\"\n        # Search for text=\"OK\" or text=\"Allow\" or text=\"확인\" (various system locales)\n        OK_LINE=$(echo \"$UI_XML\" | tr '>' '\\n' | grep -E 'text=\"OK\"|text=\"Allow\"' | head -1 || true)\n        if [[ -n \"$OK_LINE\" ]]; then\n            OK_BOUNDS=$(echo \"$OK_LINE\" | grep -o 'bounds=\"\\[[0-9]*,[0-9]*\\]\\[[0-9]*,[0-9]*\\]\"' || true)\n            info \"  OK button bounds: $OK_BOUNDS\"\n            if [[ -n \"$OK_BOUNDS\" ]]; then\n                # Parse [x1,y1][x2,y2]\n                NUMS=$(echo \"$OK_BOUNDS\" | grep -o '[0-9]*')\n                X1=$(echo \"$NUMS\" | sed -n '1p')\n                Y1=$(echo \"$NUMS\" | sed -n '2p')\n                X2=$(echo \"$NUMS\" | sed -n '3p')\n                Y2=$(echo \"$NUMS\" | sed -n '4p')\n                TAP_X=$(( (X1 + X2) / 2 ))\n                TAP_Y=$(( (Y1 + Y2) / 2 ))\n                info \"  Tapping OK at ($TAP_X, $TAP_Y)...\"\n                \"$ADB\" shell input tap \"$TAP_X\" \"$TAP_Y\"\n                sleep 2\n            fi\n        else\n            info \"  OK button not found in UI dump, trying coordinate-based tap...\"\n            # From screenshot analysis: OK button is at ~82% x, ~59% y on 1080x2400\n            OK_TAP_X=$((SCREEN_W * 82 / 100))\n            OK_TAP_Y=$((SCREEN_H * 59 / 100))\n            info \"  Tapping estimated OK at ($OK_TAP_X, $OK_TAP_Y)...\"\n            \"$ADB\" shell input tap \"$OK_TAP_X\" \"$OK_TAP_Y\"\n            sleep 2\n        fi\n\n        # Fallback: if dialog still showing, try keyboard approach\n        if \"$ADB\" shell dumpsys activity activities 2>/dev/null | grep -qi \"vpndialogs\"; then\n            info \"  Dialog still showing, trying DPAD_RIGHT + ENTER...\"\n            \"$ADB\" shell input keyevent KEYCODE_DPAD_RIGHT\n            sleep 0.3\n            \"$ADB\" shell input keyevent KEYCODE_ENTER\n            sleep 2\n        fi\n\n        # Second fallback: try TAB + ENTER\n        if \"$ADB\" shell dumpsys activity activities 2>/dev/null | grep -qi \"vpndialogs\"; then\n            info \"  Dialog still showing, trying TAB + ENTER...\"\n            \"$ADB\" shell input keyevent KEYCODE_TAB\n            sleep 0.3\n            \"$ADB\" shell input keyevent KEYCODE_TAB\n            sleep 0.3\n            \"$ADB\" shell input keyevent KEYCODE_ENTER\n            sleep 2\n        fi\n\n        VPN_ACCEPTED=true\n        screenshot \"05_after_vpn_accept\"\n        break\n    fi\n    sleep 1\ndone\n\nif [[ \"$VPN_ACCEPTED\" != \"true\" ]]; then\n    info \"  No VPN consent dialog detected\"\n    screenshot \"04_no_vpn_dialog\"\nfi\n\n# ────────────────────────────────────────────────────────────────────────────\n# Step 7: Verify VPN is connected\n# ────────────────────────────────────────────────────────────────────────────\ninfo \"Step 7: Verifying VPN connection...\"\nsleep 8\nscreenshot \"06_vpn_status\"\n\nVPN_UP=false\n\n# Check tun0 interface (must exist for VPN to be working)\ninfo \"  Checking tun0 interface...\"\nTUN_CHECK=$(\"$ADB\" shell ip addr show tun0 2>&1 || true)\nif echo \"$TUN_CHECK\" | grep -q \"inet \"; then\n    info \"  tun0 interface exists with IP address.\"\n    echo \"$TUN_CHECK\"\n    VPN_UP=true\nelse\n    echo \"$TUN_CHECK\"\n    info \"  tun0 not found — VPN is NOT connected.\"\n    info \"  Dumping relevant logcat...\"\n    \"$ADB\" logcat -d 2>/dev/null | grep -iE \"shadowsocks|vpn|sslocal|tun|StartService\" | tail -40 || true\nfi\n\n# Check service\ninfo \"  Checking shadowsocks service...\"\nSVC_CHECK=$(\"$ADB\" shell dumpsys activity services \"$PKG\" 2>&1 || true)\nif echo \"$SVC_CHECK\" | grep -qi \"shadowsocks\\|VpnService\"; then\n    info \"  Shadowsocks service is running.\"\nelse\n    info \"  WARNING: Could not confirm service state\"\nfi\n\n# Dump sslocal-related logcat for debugging\ninfo \"  Recent sslocal/VPN logcat:\"\n\"$ADB\" logcat -d 2>/dev/null | grep -iE \"shadowsocks|sslocal|ssservice|vpn|tun\" | tail -20 || true\n\n# ────────────────────────────────────────────────────────────────────────────\n# Step 8: Test connectivity from inside the emulator\n# ────────────────────────────────────────────────────────────────────────────\ninfo \"Step 8: Testing connectivity through VPN...\"\n\nPASS=0\nTOTAL=4\n\n# Test 1: VPN tunnel must be up\ninfo \"  Test 1: VPN tunnel (tun0) is active...\"\nif [[ \"$VPN_UP\" == \"true\" ]]; then\n    info \"  PASS: tun0 exists\"\n    PASS=$((PASS + 1))\nelse\n    echo \"  FAIL: tun0 does not exist — VPN never connected\"\nfi\n\n# Test 2: DNS resolution via ping (ping resolves hostname even if ICMP is dropped)\ninfo \"  Test 2: DNS resolution (ping -c1 google.com)...\"\nDNS_OUT=$(\"$ADB\" shell \"ping -c 1 -W 5 google.com 2>&1\" || true)\nif echo \"$DNS_OUT\" | grep -qE \"PING google\\.com \\([0-9]+\\.[0-9]+\"; then\n    info \"  PASS: DNS resolution succeeded (hostname resolved)\"\n    echo \"$DNS_OUT\" | head -1\n    PASS=$((PASS + 1))\nelse\n    echo \"  FAIL: DNS resolution failed\"\n    echo \"$DNS_OUT\"\nfi\n\n# Test 3: TCP connect to 1.1.1.1:80 (proves TCP tunneling works)\n# Note: toybox nc on some Android versions lacks -z; use \"echo | nc\" instead.\ninfo \"  Test 3: TCP connect to 1.1.1.1:80...\"\nNC1_EXIT=$(\"$ADB\" shell \"echo '' | nc -w 5 1.1.1.1 80 >/dev/null 2>&1; echo \\$?\" | tr -d '\\r' | tail -1)\nif [[ \"$NC1_EXIT\" == \"0\" ]]; then\n    info \"  PASS: TCP connect to 1.1.1.1:80 succeeded\"\n    PASS=$((PASS + 1))\nelse\n    echo \"  FAIL: TCP connect to 1.1.1.1:80 failed (exit=$NC1_EXIT)\"\nfi\n\n# Test 4: TCP connect to a different host (confirms full routing)\ninfo \"  Test 4: TCP connect to 8.8.8.8:443...\"\nNC2_EXIT=$(\"$ADB\" shell \"echo '' | nc -w 5 8.8.8.8 443 >/dev/null 2>&1; echo \\$?\" | tr -d '\\r' | tail -1)\nif [[ \"$NC2_EXIT\" == \"0\" ]]; then\n    info \"  PASS: TCP connect to 8.8.8.8:443 succeeded\"\n    PASS=$((PASS + 1))\nelse\n    echo \"  FAIL: TCP connect to 8.8.8.8:443 failed (exit=$NC2_EXIT)\"\nfi\n\n# ────────────────────────────────────────────────────────────────────────────\n# Summary\n# ────────────────────────────────────────────────────────────────────────────\necho \"\"\necho \"========================================\"\necho \"  E2E Test Results: $PASS/$TOTAL passed\"\necho \"========================================\"\nif [[ $PASS -eq $TOTAL ]]; then\n    echo \"  ALL TESTS PASSED\"\n    exit 0\nelse\n    echo \"  SOME TESTS FAILED\"\n    exit 1\nfi\n"
  },
  {
    "path": "translate.py",
    "content": "#!/usr/bin/env python3\n\"\"\"\nCopyright (C) 2019 by Max Lv <max.c.lv@gmail.com>\nCopyright (C) 2019 by Mygod Studio <contact-shadowsocks-android@mygod.be>\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU General Public License as published by\nthe Free Software Foundation, either version 3 of the License, or\n(at your option) any later version.\n\nThis program is distributed in the hope that it will be useful,\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\nGNU General Public License for more details.\n\nYou should have received a copy of the GNU General Public License\nalong with this program. If not, see <http://www.gnu.org/licenses/>.\n\nUsage: ./translate.py <API token>\nPrerequisite: pip install poeditor\nSee also: https://poeditor.com/docs/languages\n\"\"\"\nimport itertools\nimport multiprocessing\nimport os\nimport sys\nimport threading\nfrom multiprocessing.pool import ThreadPool\n\nfrom poeditor import POEditorAPI\n\n\ndef main(api_token, project_id, languages, tags, file_path, header_comment):\n    client = POEditorAPI(api_token)\n    # See also: https://github.com/sporteasy/python-poeditor/pull/15\n    client.FILTER_BY += 'proofread'\n    done = 0\n    lock = threading.Lock()\n\n    def export_worker(params):\n        ((language_code, language_id), (tag, module)) = params\n        output = file_path.format(language_id, module)\n        (_, temp) = client.export(project_id, language_code, 'android_strings', 'proofread', tag)\n        try:\n            if os.path.getsize(temp) > 0:\n                try:\n                    os.makedirs(os.path.dirname(output))\n                except FileExistsError:\n                    pass\n                with open(output, 'w') as writer:\n                    with open(temp) as reader:\n                        head = reader.readline()\n                        assert head.startswith('<?xml')\n                        writer.write(head)\n                        writer.write(header_comment)\n                        for line in reader:\n                            writer.write(line)\n        finally:\n            os.remove(temp)\n        with lock:\n            nonlocal done\n            done += 1\n            print(\"{}/{}: {}\".format(done, len(languages) * len(tags), output))\n\n    pool = ThreadPool(max(64, multiprocessing.cpu_count()))\n    pool.map(export_worker, itertools.product(languages.items(), tags.items()))\n\n\nif __name__ == \"__main__\":\n    sys.exit(main(\n        api_token=sys.argv[1],\n        project_id='89595',\n        languages={\n            # Arabic\n            'ar': 'ar',\n            # Chinese (simplified)\n            'zh-CN': 'zh-rCN',\n            # Chinese (traditional)\n            'zh-TW': 'zh-rTW',\n            # French\n            'fr': 'fr',\n            # German\n            'de': 'de',\n            # Japanese\n            'ja': 'ja',\n            # Korean\n            'ko': 'ko',\n            # Persian\n            'fa': 'fa',\n            # Russian\n            'ru': 'ru',\n            # Spanish\n            'es': 'es',\n            # Turkish\n            'tr': 'tr',\n            # Ukrainian\n            'uk': 'uk',\n        },\n        tags={\n            'mobile': 'core',\n            'plugin': 'plugin',\n        },\n        file_path='{1}/src/main/res/values-{0}/strings.xml',\n        header_comment='''<!--\n    Copyright (C) 2019 by Max Lv <max.c.lv@gmail.com>\n    Copyright (C) 2019 by Mygod Studio <contact-shadowsocks-android@mygod.be>\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n    DO NOT EDIT: This file was automagically generated by script.\n    If you are looking for contributing a translation, read this:\n    https://discourse.shadowsocks.org/t/poeditor-translation-main-thread/30\n-->\n\n''',\n    ))\n"
  },
  {
    "path": "tv/.gitignore",
    "content": "/build\n"
  },
  {
    "path": "tv/build.gradle.kts",
    "content": "plugins {\n    id(\"com.android.application\")\n    id(\"com.google.android.gms.oss-licenses-plugin\")\n    id(\"com.google.gms.google-services\")\n    id(\"com.google.firebase.crashlytics\")\n    kotlin(\"android\")\n}\n\nsetupApp()\n\nandroid {\n    namespace = \"com.github.shadowsocks.tv\"\n    defaultConfig {\n        applicationId = \"com.github.shadowsocks.tv\"\n        buildConfigField(\"boolean\", \"FULLSCREEN\", \"false\")\n    }\n    flavorDimensions.add(\"market\")\n    productFlavors {\n        create(\"freedom\") {\n            dimension = \"market\"\n        }\n        create(\"google\") {\n            dimension = \"market\"\n            buildConfigField(\"boolean\", \"FULLSCREEN\", \"true\")\n        }\n    }\n}\n\ndependencies {\n    coreLibraryDesugaring(libs.desugar)\n    implementation(libs.androidx.leanback.preference)\n    testImplementation(libs.junit)\n    androidTestImplementation(libs.androidx.espresso.core)\n    androidTestImplementation(libs.androidx.test.runner)\n}\n"
  },
  {
    "path": "tv/google-services.json",
    "content": "{\n  \"project_info\": {\n    \"project_number\": \"261400168171\",\n    \"firebase_url\": \"https://admob-app-id-3330146721.firebaseio.com\",\n    \"project_id\": \"admob-app-id-3330146721\",\n    \"storage_bucket\": \"admob-app-id-3330146721.appspot.com\"\n  },\n  \"client\": [\n    {\n      \"client_info\": {\n        \"mobilesdk_app_id\": \"1:261400168171:android:dbdd6331c434162f\",\n        \"android_client_info\": {\n          \"package_name\": \"com.github.shadowsocks\"\n        }\n      },\n      \"oauth_client\": [\n        {\n          \"client_id\": \"261400168171-sfik8o3pj7e243583olorh7s5974vab1.apps.googleusercontent.com\",\n          \"client_type\": 1,\n          \"android_info\": {\n            \"package_name\": \"com.github.shadowsocks\",\n            \"certificate_hash\": \"58a90f84cfe99d4280aec677c9a1292fae131677\"\n          }\n        },\n        {\n          \"client_id\": \"261400168171-g7aelv5bu012ojr7dod7lq09c9anjimh.apps.googleusercontent.com\",\n          \"client_type\": 3\n        }\n      ],\n      \"api_key\": [\n        {\n          \"current_key\": \"AIzaSyCee3fAad7nb3YsxeUO9mqqHFfAvsSCbVs\"\n        }\n      ],\n      \"services\": {\n        \"analytics_service\": {\n          \"status\": 1\n        },\n        \"appinvite_service\": {\n          \"status\": 1,\n          \"other_platform_oauth_client\": []\n        },\n        \"ads_service\": {\n          \"status\": 2\n        }\n      },\n      \"admob_app_id\": \"ca-app-pub-9097031975646651~3330146721\"\n    },\n    {\n      \"client_info\": {\n        \"mobilesdk_app_id\": \"1:261400168171:android:0dbac07695d93817\",\n        \"android_client_info\": {\n          \"package_name\": \"com.github.shadowsocks.tv\"\n        }\n      },\n      \"oauth_client\": [\n        {\n          \"client_id\": \"261400168171-g7aelv5bu012ojr7dod7lq09c9anjimh.apps.googleusercontent.com\",\n          \"client_type\": 3\n        }\n      ],\n      \"api_key\": [\n        {\n          \"current_key\": \"AIzaSyCee3fAad7nb3YsxeUO9mqqHFfAvsSCbVs\"\n        }\n      ],\n      \"services\": {\n        \"analytics_service\": {\n          \"status\": 1\n        },\n        \"appinvite_service\": {\n          \"status\": 1,\n          \"other_platform_oauth_client\": []\n        },\n        \"ads_service\": {\n          \"status\": 2\n        }\n      }\n    }\n  ],\n  \"configuration_version\": \"1\"\n}"
  },
  {
    "path": "tv/src/freedom/res/values/styles.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <style name=\"Theme.Shadowsocks.TV\" parent=\"@style/Theme.Shadowsocks.TVBase\">\n        <item name=\"android:backgroundDimEnabled\">true</item>\n        <item name=\"android:windowIsTranslucent\">true</item>\n        <item name=\"android:windowBackground\">@android:color/transparent</item>\n    </style>\n</resources>\n"
  },
  {
    "path": "tv/src/main/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n          xmlns:tools=\"http://schemas.android.com/tools\">\n\n    <uses-feature\n        android:name=\"android.hardware.touchscreen\"\n        android:required=\"false\"/>\n    <uses-feature\n        android:name=\"android.software.leanback\"\n        android:required=\"true\"/>\n\n    <application\n        android:name=\".App\"\n        android:localeConfig=\"@xml/locales_config\"\n        android:theme=\"@style/Theme.Shadowsocks.TV\"\n        tools:ignore=\"MissingTvBanner\"\n        tools:replace=\"theme\">\n        <activity\n            android:name=\".MainActivity\"\n            android:label=\"@string/app_name\"\n            android:exported=\"true\"\n            android:launchMode=\"singleTask\">\n            <intent-filter>\n                <action android:name=\"android.intent.action.MAIN\"/>\n\n                <category android:name=\"android.intent.category.LEANBACK_LAUNCHER\"/>\n            </intent-filter>\n        </activity>\n    </application>\n\n</manifest>\n"
  },
  {
    "path": "tv/src/main/java/com/github/shadowsocks/tv/App.kt",
    "content": "/*******************************************************************************\n *                                                                             *\n *  Copyright (C) 2018 by Max Lv <max.c.lv@gmail.com>                          *\n *  Copyright (C) 2018 by Mygod Studio <contact-shadowsocks-android@mygod.be>  *\n *                                                                             *\n *  This program is free software: you can redistribute it and/or modify       *\n *  it under the terms of the GNU General Public License as published by       *\n *  the Free Software Foundation, either version 3 of the License, or          *\n *  (at your option) any later version.                                        *\n *                                                                             *\n *  This program is distributed in the hope that it will be useful,            *\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of             *\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the              *\n *  GNU General Public License for more details.                               *\n *                                                                             *\n *  You should have received a copy of the GNU General Public License          *\n *  along with this program. If not, see <http://www.gnu.org/licenses/>.       *\n *                                                                             *\n *******************************************************************************/\n\npackage com.github.shadowsocks.tv\n\nimport android.app.Application\nimport android.content.res.Configuration\nimport com.github.shadowsocks.Core\n\nclass App : Application() {\n    override fun onCreate() {\n        super.onCreate()\n        Core.init(this, MainActivity::class)\n    }\n\n    override fun onConfigurationChanged(newConfig: Configuration) {\n        super.onConfigurationChanged(newConfig)\n        Core.updateNotificationChannels()\n    }\n}\n"
  },
  {
    "path": "tv/src/main/java/com/github/shadowsocks/tv/MainActivity.kt",
    "content": "/*******************************************************************************\n *                                                                             *\n *  Copyright (C) 2018 by Max Lv <max.c.lv@gmail.com>                          *\n *  Copyright (C) 2018 by Mygod Studio <contact-shadowsocks-android@mygod.be>  *\n *                                                                             *\n *  This program is free software: you can redistribute it and/or modify       *\n *  it under the terms of the GNU General Public License as published by       *\n *  the Free Software Foundation, either version 3 of the License, or          *\n *  (at your option) any later version.                                        *\n *                                                                             *\n *  This program is distributed in the hope that it will be useful,            *\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of             *\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the              *\n *  GNU General Public License for more details.                               *\n *                                                                             *\n *  You should have received a copy of the GNU General Public License          *\n *  along with this program. If not, see <http://www.gnu.org/licenses/>.       *\n *                                                                             *\n *******************************************************************************/\n\npackage com.github.shadowsocks.tv\n\nimport android.os.Bundle\nimport androidx.appcompat.app.AppCompatActivity\n\nclass MainActivity : AppCompatActivity() {\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        setContentView(R.layout.activity_main)\n    }\n}\n"
  },
  {
    "path": "tv/src/main/java/com/github/shadowsocks/tv/MainFragment.kt",
    "content": "/*******************************************************************************\n *                                                                             *\n *  Copyright (C) 2018 by Max Lv <max.c.lv@gmail.com>                          *\n *  Copyright (C) 2018 by Mygod Studio <contact-shadowsocks-android@mygod.be>  *\n *                                                                             *\n *  This program is free software: you can redistribute it and/or modify       *\n *  it under the terms of the GNU General Public License as published by       *\n *  the Free Software Foundation, either version 3 of the License, or          *\n *  (at your option) any later version.                                        *\n *                                                                             *\n *  This program is distributed in the hope that it will be useful,            *\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of             *\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the              *\n *  GNU General Public License for more details.                               *\n *                                                                             *\n *  You should have received a copy of the GNU General Public License          *\n *  along with this program. If not, see <http://www.gnu.org/licenses/>.       *\n *                                                                             *\n *******************************************************************************/\n\npackage com.github.shadowsocks.tv\n\nimport android.os.Bundle\nimport android.view.View\nimport android.view.ViewGroup\nimport androidx.core.os.bundleOf\nimport androidx.core.view.updateLayoutParams\nimport androidx.leanback.preference.LeanbackPreferenceDialogFragmentCompat\nimport androidx.leanback.preference.LeanbackSettingsFragmentCompat\nimport androidx.preference.*\nimport com.github.shadowsocks.bg.BaseService\nimport com.github.shadowsocks.tv.preference.LeanbackSingleListPreferenceDialogFragment\nimport com.github.shadowsocks.utils.Key\n\nclass MainFragment : LeanbackSettingsFragmentCompat() {\n    override fun onPreferenceStartInitialScreen() = startPreferenceFragment(MainPreferenceFragment())\n    override fun onPreferenceStartScreen(caller: PreferenceFragmentCompat, pref: PreferenceScreen): Boolean {\n        onPreferenceStartInitialScreen()\n        return true\n    }\n    override fun onPreferenceStartFragment(caller: PreferenceFragmentCompat, pref: Preference): Boolean = false\n    override fun onPreferenceDisplayDialog(caller: PreferenceFragmentCompat, pref: Preference): Boolean {\n        if (pref.key == Key.id) {\n            if ((childFragmentManager.findFragmentById(R.id.settings_preference_fragment_container)\n                            as MainPreferenceFragment).state == BaseService.State.Stopped) {\n                startPreferenceFragment(ProfilesDialogFragment().apply {\n                    arguments = bundleOf(Pair(LeanbackPreferenceDialogFragmentCompat.ARG_KEY, Key.id))\n                    setTargetFragment(caller, 0)\n                })\n            }\n            return true\n        }\n        if (pref is ListPreference) {\n            startPreferenceFragment(LeanbackSingleListPreferenceDialogFragment().apply {\n                arguments = bundleOf(Pair(LeanbackPreferenceDialogFragmentCompat.ARG_KEY, pref.key))\n                setTargetFragment(caller, 0)\n            })\n            return true\n        }\n        return super.onPreferenceDisplayDialog(caller, pref)\n    }\n\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        super.onViewCreated(view, savedInstanceState)\n        if (BuildConfig.FULLSCREEN) {\n            view.findViewById<View>(R.id.settings_preference_fragment_container).updateLayoutParams {\n                width = ViewGroup.LayoutParams.MATCH_PARENT\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "tv/src/main/java/com/github/shadowsocks/tv/MainPreferenceFragment.kt",
    "content": "/*******************************************************************************\n *                                                                             *\n *  Copyright (C) 2018 by Max Lv <max.c.lv@gmail.com>                          *\n *  Copyright (C) 2018 by Mygod Studio <contact-shadowsocks-android@mygod.be>  *\n *                                                                             *\n *  This program is free software: you can redistribute it and/or modify       *\n *  it under the terms of the GNU General Public License as published by       *\n *  the Free Software Foundation, either version 3 of the License, or          *\n *  (at your option) any later version.                                        *\n *                                                                             *\n *  This program is distributed in the hope that it will be useful,            *\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of             *\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the              *\n *  GNU General Public License for more details.                               *\n *                                                                             *\n *  You should have received a copy of the GNU General Public License          *\n *  along with this program. If not, see <http://www.gnu.org/licenses/>.       *\n *                                                                             *\n *******************************************************************************/\n\npackage com.github.shadowsocks.tv\n\nimport android.content.ActivityNotFoundException\nimport android.content.Intent\nimport android.os.Bundle\nimport android.os.RemoteException\nimport android.text.format.Formatter\nimport android.widget.Toast\nimport androidx.activity.result.ActivityResultLauncher\nimport androidx.fragment.app.setFragmentResultListener\nimport androidx.fragment.app.viewModels\nimport androidx.leanback.preference.LeanbackPreferenceFragmentCompat\nimport androidx.preference.*\nimport com.github.shadowsocks.BootReceiver\nimport com.github.shadowsocks.Core\nimport com.github.shadowsocks.aidl.IShadowsocksService\nimport com.github.shadowsocks.aidl.ShadowsocksConnection\nimport com.github.shadowsocks.aidl.TrafficStats\nimport com.github.shadowsocks.bg.BaseService\nimport com.github.shadowsocks.database.ProfileManager\nimport com.github.shadowsocks.net.HttpsTest\nimport com.github.shadowsocks.preference.DataStore\nimport com.github.shadowsocks.preference.EditTextPreferenceModifiers\nimport com.github.shadowsocks.preference.OnPreferenceDataStoreChangeListener\nimport com.github.shadowsocks.utils.*\nimport com.google.android.gms.oss.licenses.OssLicensesMenuActivity\nimport timber.log.Timber\n\nclass MainPreferenceFragment : LeanbackPreferenceFragmentCompat(), ShadowsocksConnection.Callback,\n        OnPreferenceDataStoreChangeListener {\n    private lateinit var fab: ListPreference\n    private lateinit var stats: Preference\n    private lateinit var controlImport: Preference\n    private lateinit var serviceMode: Preference\n    private lateinit var shareOverLan: Preference\n    private lateinit var portProxy: EditTextPreference\n    private lateinit var portLocalDns: EditTextPreference\n    private lateinit var portTransproxy: EditTextPreference\n    private val onServiceModeChange = Preference.OnPreferenceChangeListener { _, newValue ->\n        portTransproxy.isEnabled = newValue as String? == Key.modeTransproxy\n        true\n    }\n    private val tester by viewModels<HttpsTest>()\n\n    // service\n    var state = BaseService.State.Idle\n        private set\n    override fun stateChanged(state: BaseService.State, profileName: String?, msg: String?) = changeState(state, msg)\n    override fun trafficUpdated(profileId: Long, stats: TrafficStats) {\n        if (profileId == 0L) context?.let { context ->\n            this.stats.summary = getString(R.string.stat_summary,\n                    getString(R.string.speed, Formatter.formatFileSize(context, stats.txRate)),\n                    getString(R.string.speed, Formatter.formatFileSize(context, stats.rxRate)),\n                    Formatter.formatFileSize(context, stats.txTotal),\n                    Formatter.formatFileSize(context, stats.rxTotal))\n        }\n    }\n\n    private fun changeState(state: BaseService.State, msg: String? = null) {\n        val context = context ?: return\n        fab.isEnabled = state.canStop || state == BaseService.State.Stopped\n        fab.setTitle(when (state) {\n            BaseService.State.Connecting -> R.string.connecting\n            BaseService.State.Connected -> R.string.stop\n            BaseService.State.Stopping -> R.string.stopping\n            else -> R.string.connect\n        })\n        stats.setTitle(R.string.connection_test_pending)\n        if ((state == BaseService.State.Connected).also { stats.isVisible = it }) tester.status.observe(this) {\n            it.retrieve(stats::setTitle) { msg -> Toast.makeText(context, msg, Toast.LENGTH_LONG).show() }\n        } else {\n            trafficUpdated(0, TrafficStats())\n            tester.status.removeObservers(this)\n            if (state != BaseService.State.Idle) tester.invalidate()\n        }\n        if (msg != null) Toast.makeText(context, getString(R.string.vpn_error, msg), Toast.LENGTH_SHORT).show()\n        this.state = state\n        val stopped = state == BaseService.State.Stopped\n        controlImport.isEnabled = stopped\n        serviceMode.isEnabled = stopped\n        shareOverLan.isEnabled = stopped\n        portProxy.isEnabled = stopped\n        portLocalDns.isEnabled = stopped\n        if (stopped) onServiceModeChange.onPreferenceChange(serviceMode, DataStore.serviceMode) else {\n            portTransproxy.isEnabled = false\n        }\n    }\n\n    private val connection = ShadowsocksConnection(true)\n    override fun onServiceConnected(service: IShadowsocksService) = changeState(try {\n        BaseService.State.entries[service.state]\n    } catch (_: RemoteException) {\n        BaseService.State.Idle\n    })\n    override fun onServiceDisconnected() = changeState(BaseService.State.Idle)\n    override fun onBinderDied() {\n        connection.disconnect(requireContext())\n        connection.connect(requireContext(), this)\n    }\n\n    override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {\n        preferenceManager.preferenceDataStore = DataStore.publicStore\n        DataStore.initGlobal()\n        addPreferencesFromResource(R.xml.pref_main)\n        setFragmentResultListener(ProfilesDialogFragment::class.java.name) { _, _ -> startService() }\n        fab = findPreference(Key.id)!!\n        populateProfiles()\n        stats = findPreference(Key.controlStats)!!\n        controlImport = findPreference(Key.controlImport)!!\n\n        findPreference<SwitchPreference>(Key.persistAcrossReboot)!!.setOnPreferenceChangeListener { _, value ->\n            BootReceiver.enabled = value as Boolean\n            true\n        }\n\n        serviceMode = findPreference(Key.serviceMode)!!\n        shareOverLan = findPreference(Key.shareOverLan)!!\n        portProxy = findPreference(Key.portProxy)!!\n        portProxy.setOnBindEditTextListener(EditTextPreferenceModifiers.Port)\n        portLocalDns = findPreference(Key.portLocalDns)!!\n        portLocalDns.setOnBindEditTextListener(EditTextPreferenceModifiers.Port)\n        portTransproxy = findPreference(Key.portTransproxy)!!\n        portTransproxy.setOnBindEditTextListener(EditTextPreferenceModifiers.Port)\n        serviceMode.onPreferenceChangeListener = onServiceModeChange\n        findPreference<Preference>(Key.about)!!.summary = getString(R.string.about_title, BuildConfig.VERSION_NAME)\n\n        changeState(BaseService.State.Idle) // reset everything to init state\n        connection.connect(requireContext(), this)\n        DataStore.publicStore.registerChangeListener(this)\n    }\n\n    override fun onStart() {\n        super.onStart()\n        connection.bandwidthTimeout = 500\n    }\n\n    override fun onResume() {\n        super.onResume()\n        fab.value = DataStore.profileId.toString()\n    }\n\n    private fun populateProfiles() {\n        ProfileManager.ensureNotEmpty()\n        val profiles = ProfileManager.getActiveProfiles()!!\n        fab.value = null\n        fab.entries = profiles.map { it.formattedName }.toTypedArray()\n        fab.entryValues = profiles.map { it.id.toString() }.toTypedArray()\n    }\n\n    fun startService() {\n        if (state == BaseService.State.Stopped) connect.launch(null)\n    }\n\n    override fun onPreferenceDataStoreChanged(store: PreferenceDataStore, key: String) {\n        when (key) {\n            Key.serviceMode -> {\n                connection.disconnect(requireContext())\n                connection.connect(requireContext(), this)\n            }\n        }\n    }\n\n    override fun onStop() {\n        connection.bandwidthTimeout = 0\n        super.onStop()\n    }\n\n    override fun onPreferenceTreeClick(preference: Preference): Boolean = when (preference.key) {\n        Key.id -> {\n            if (state == BaseService.State.Connected) Core.stopService()\n            true\n        }\n        Key.controlStats -> {\n            tester.testConnection()\n            true\n        }\n        Key.controlImport -> {\n            startFilesForResult(replaceProfiles)\n            true\n        }\n        Key.controlExport -> {\n            startFilesForResult(exportProfiles)\n            true\n        }\n        Key.about -> {\n            Toast.makeText(requireContext(), \"https://shadowsocks.org/android\", Toast.LENGTH_SHORT).show()\n            true\n        }\n        Key.aboutOss -> {\n            startActivity(Intent(context, OssLicensesMenuActivity::class.java))\n            true\n        }\n        else -> super.onPreferenceTreeClick(preference)\n    }\n\n    private fun startFilesForResult(launcher: ActivityResultLauncher<String>) {\n        try {\n            return launcher.launch(\"\")\n        } catch (_: ActivityNotFoundException) {\n        } catch (_: SecurityException) {\n        }\n        Toast.makeText(requireContext(), R.string.file_manager_missing, Toast.LENGTH_SHORT).show()\n    }\n\n    private val connect = registerForActivityResult(StartService()) {\n        if (it) Toast.makeText(requireContext(), R.string.vpn_permission_denied, Toast.LENGTH_SHORT).show()\n    }\n    private val replaceProfiles = registerForActivityResult(OpenJson) { dataUris ->\n        if (dataUris.isEmpty()) return@registerForActivityResult\n        val context = requireContext()\n        try {\n            ProfileManager.createProfilesFromJson(dataUris.asSequence().map {\n                context.contentResolver.openInputStream(it)\n            }.filterNotNull(), true)\n        } catch (e: Exception) {\n            Timber.w(e)\n            Toast.makeText(context, e.readableMessage, Toast.LENGTH_SHORT).show()\n        }\n        populateProfiles()\n    }\n    private val exportProfiles = registerForActivityResult(SaveJson) { data ->\n        if (data != null) ProfileManager.serializeToJson()?.let { profiles ->\n            val context = requireContext()\n            try {\n                context.contentResolver.openOutputStream(data)!!.bufferedWriter().use {\n                    it.write(profiles.toString(2))\n                }\n            } catch (e: Exception) {\n                Timber.w(e)\n                Toast.makeText(context, e.readableMessage, Toast.LENGTH_SHORT).show()\n            }\n        }\n    }\n\n    override fun onDestroy() {\n        super.onDestroy()\n        DataStore.publicStore.unregisterChangeListener(this)\n        val context = requireContext()\n        connection.disconnect(context)\n    }\n}\n"
  },
  {
    "path": "tv/src/main/java/com/github/shadowsocks/tv/ProfilesDialogFragment.kt",
    "content": "/*******************************************************************************\n *                                                                             *\n *  Copyright (C) 2018 by Max Lv <max.c.lv@gmail.com>                          *\n *  Copyright (C) 2018 by Mygod Studio <contact-shadowsocks-android@mygod.be>  *\n *                                                                             *\n *  This program is free software: you can redistribute it and/or modify       *\n *  it under the terms of the GNU General Public License as published by       *\n *  the Free Software Foundation, either version 3 of the License, or          *\n *  (at your option) any later version.                                        *\n *                                                                             *\n *  This program is distributed in the hope that it will be useful,            *\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of             *\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the              *\n *  GNU General Public License for more details.                               *\n *                                                                             *\n *  You should have received a copy of the GNU General Public License          *\n *  along with this program. If not, see <http://www.gnu.org/licenses/>.       *\n *                                                                             *\n *******************************************************************************/\n\npackage com.github.shadowsocks.tv\n\nimport android.os.Bundle\nimport android.text.format.Formatter\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport android.widget.CompoundButton\nimport android.widget.TextView\nimport androidx.fragment.app.setFragmentResult\nimport androidx.leanback.preference.LeanbackListPreferenceDialogFragmentCompat\nimport androidx.recyclerview.widget.RecyclerView\nimport com.github.shadowsocks.Core\nimport com.github.shadowsocks.database.ProfileManager\nimport com.github.shadowsocks.plugin.PluginConfiguration\nimport com.github.shadowsocks.preference.DataStore\n\nclass ProfilesDialogFragment : LeanbackListPreferenceDialogFragmentCompat() {\n    private inner class ProfileViewHolder(view: View) : RecyclerView.ViewHolder(view), View.OnClickListener {\n        val widgetView = view.findViewById<CompoundButton>(R.id.button)\n        val titleView = view.findViewById<TextView>(android.R.id.title)\n        init {\n            view.findViewById<ViewGroup>(R.id.container).setOnClickListener(this)\n        }\n\n        override fun onClick(v: View) {\n            val index = bindingAdapterPosition\n            if (index == RecyclerView.NO_POSITION) return\n            Core.switchProfile(adapter.profiles[index].id)\n            setFragmentResult(ProfilesDialogFragment::class.java.name, Bundle.EMPTY)\n            parentFragmentManager.popBackStack()\n            adapter.notifyDataSetChanged()\n        }\n    }\n    private inner class ProfilesAdapter : RecyclerView.Adapter<ProfileViewHolder>() {\n        val profiles = ProfileManager.getActiveProfiles()!!\n\n        override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ProfileViewHolder(\n                LayoutInflater.from(parent.context).inflate(R.layout.leanback_list_preference_item_single_2,\n                        parent, false))\n\n        override fun onBindViewHolder(holder: ProfileViewHolder, position: Int) {\n            val profile = profiles[position]\n            holder.widgetView.isChecked = profile.id == DataStore.profileId\n            holder.titleView.text = profile.formattedName\n            holder.itemView.findViewById<TextView>(android.R.id.summary).text = ArrayList<String>().apply {\n                if (!profile.name.isNullOrEmpty()) this += profile.formattedAddress\n                val id = PluginConfiguration(profile.plugin ?: \"\").selected\n                if (id.isNotEmpty()) this += getString(R.string.profile_plugin, id)\n                if (profile.tx > 0 || profile.rx > 0) this += getString(R.string.traffic,\n                        Formatter.formatFileSize(activity, profile.tx), Formatter.formatFileSize(activity, profile.rx))\n            }.joinToString(\"\\n\")\n        }\n\n        override fun getItemCount() = profiles.size\n    }\n\n    private val adapter = ProfilesAdapter()\n\n    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {\n        return super.onCreateView(inflater, container, savedInstanceState)!!.apply {\n            val list = findViewById<RecyclerView>(android.R.id.list)\n            list.adapter = adapter\n            list.layoutManager!!.scrollToPosition(adapter.profiles.indexOfFirst { it.id == DataStore.profileId })\n        }\n    }\n}\n"
  },
  {
    "path": "tv/src/main/java/com/github/shadowsocks/tv/preference/LeanbackSingleListPreferenceDialogFragment.kt",
    "content": "/*******************************************************************************\n *                                                                             *\n *  Copyright (C) 2018 by Max Lv <max.c.lv@gmail.com>                          *\n *  Copyright (C) 2018 by Mygod Studio <contact-shadowsocks-android@mygod.be>  *\n *                                                                             *\n *  This program is free software: you can redistribute it and/or modify       *\n *  it under the terms of the GNU General Public License as published by       *\n *  the Free Software Foundation, either version 3 of the License, or          *\n *  (at your option) any later version.                                        *\n *                                                                             *\n *  This program is distributed in the hope that it will be useful,            *\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of             *\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the              *\n *  GNU General Public License for more details.                               *\n *                                                                             *\n *  You should have received a copy of the GNU General Public License          *\n *  along with this program. If not, see <http://www.gnu.org/licenses/>.       *\n *                                                                             *\n *******************************************************************************/\n\npackage com.github.shadowsocks.tv.preference\n\nimport android.os.Bundle\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport androidx.leanback.preference.LeanbackListPreferenceDialogFragmentCompat\nimport androidx.recyclerview.widget.RecyclerView\n\n/**\n * Fix: scroll to selected item.\n */\nopen class LeanbackSingleListPreferenceDialogFragment : LeanbackListPreferenceDialogFragmentCompat() {\n    companion object {\n        private val mEntryValues = LeanbackListPreferenceDialogFragmentCompat::class.java\n                .getDeclaredField(\"mEntryValues\").apply { isAccessible = true }\n        private val mInitialSelection = LeanbackListPreferenceDialogFragmentCompat::class.java\n                .getDeclaredField(\"mInitialSelection\").apply { isAccessible = true }\n    }\n\n    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {\n        val selected = mInitialSelection.get(this) as? String\n        val index = (mEntryValues.get(this) as? Array<*>)?.indexOfFirst { selected == it }\n        return super.onCreateView(inflater, container, savedInstanceState)!!.also {\n            if (index != null) it.findViewById<RecyclerView>(android.R.id.list).layoutManager!!.scrollToPosition(index)\n        }\n    }\n}\n"
  },
  {
    "path": "tv/src/main/res/layout/activity_main.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.fragment.app.FragmentContainerView\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:id=\"@+id/main_browse_fragment\"\n    android:name=\"com.github.shadowsocks.tv.MainFragment\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    tools:context=\".MainActivity\"\n    tools:deviceIds=\"tv\"\n    tools:ignore=\"MergeRootFrame\"/>\n"
  },
  {
    "path": "tv/src/main/res/layout/leanback_list_preference_item_single_2.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!-- Source: https://android.googlesource.com/platform/frameworks/support/+/b80f425/leanback-preference/src/main/res/layout/leanback_list_preference_item_single.xml -->\n<!--\n  ~ Copyright (C) 2015 The Android Open Source Project\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~      http://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License\n  -->\n\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n              android:id=\"@+id/container\"\n              android:layout_width=\"match_parent\"\n              android:layout_height=\"wrap_content\"\n              android:background=\"?android:attr/selectableItemBackground\"\n              android:clickable=\"true\"\n              android:focusable=\"true\"\n              android:descendantFocusability=\"blocksDescendants\"\n              android:orientation=\"horizontal\"\n              android:paddingStart=\"?android:attr/listPreferredItemPaddingStart\"\n              android:paddingEnd=\"?android:attr/listPreferredItemPaddingEnd\" >\n\n    <RadioButton\n        android:id=\"@+id/button\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"match_parent\"\n        style=\"?android:attr/radioButtonStyle\"\n        android:background=\"@null\"\n        android:focusable=\"false\"\n        android:clickable=\"false\"\n        android:layout_marginEnd=\"@dimen/lb_preference_item_icon_margin_end\"\n        android:layout_gravity=\"center_vertical\" />\n\n    <LinearLayout android:layout_width=\"wrap_content\"\n                  android:layout_height=\"wrap_content\"\n                  android:duplicateParentState=\"true\"\n                  android:orientation=\"vertical\">\n        <Space android:layout_width=\"0dp\" android:layout_height=\"@dimen/lb_preference_item_text_space_top\" />\n        <TextView\n            android:id=\"@android:id/title\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginBottom=\"@dimen/lb_preference_item_primary_text_margin_bottom\"\n            android:duplicateParentState=\"true\"\n            android:textAppearance=\"?android:attr/textAppearanceListItem\"/>\n        <com.github.shadowsocks.widget.AutoCollapseTextView\n            android:id=\"@android:id/summary\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:duplicateParentState=\"true\"\n            android:textAppearance=\"?android:attr/textAppearanceListItemSecondary\"\n            android:textSize=\"@dimen/lb_preference_item_secondary_text_size\"/>\n        <Space android:layout_width=\"0dp\" android:layout_height=\"@dimen/lb_preference_item_text_space_bottom\" />\n    </LinearLayout>\n\n</LinearLayout>\n"
  },
  {
    "path": "tv/src/main/res/values/styles.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <style name=\"Theme.Shadowsocks.TVBase\" parent=\"@style/Theme.AppCompat.Leanback\">\n        <item name=\"android:colorAccent\">@color/material_accent_200</item>\n        <item name=\"android:colorButtonNormal\">@color/material_accent_200</item>\n        <item name=\"android:colorPrimary\">@color/color_primary</item>\n        <item name=\"android:colorPrimaryDark\">@color/color_primary_dark</item>\n        <item name=\"preferenceTheme\">@style/PreferenceThemeOverlay.Shadowsocks.TV</item>\n    </style>\n    <style name=\"Theme.Shadowsocks.TV\" parent=\"@style/Theme.Shadowsocks.TVBase\" />\n    <style name=\"PreferenceThemeOverlay.Shadowsocks.TV\" parent=\"@style/PreferenceThemeOverlay.v14.Leanback\">\n        <item name=\"android:colorAccent\">@color/material_accent_200</item>\n        <item name=\"android:colorButtonNormal\">@color/material_accent_200</item>\n        <item name=\"android:colorPrimary\">@color/color_primary</item>\n        <item name=\"android:colorPrimaryDark\">@color/color_primary_dark</item>\n    </style>\n</resources>\n"
  },
  {
    "path": "tv/src/main/res/xml/pref_main.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<PreferenceScreen xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n                  app:title=\"@string/app_name\">\n    <!-- profileId is stored in privateStore so its value needs to be populated manually -->\n    <ListPreference\n        app:key=\"profileId\"\n        app:title=\"@string/connect\"\n        app:persistent=\"false\"\n        app:useSimpleSummaryProvider=\"true\"/>\n    <Preference\n        app:key=\"control.stats\"\n        app:title=\"@string/connection_test_pending\"\n        app:summary=\"@string/stat_summary\"/>\n    <Preference\n        app:key=\"control.import\"\n        app:title=\"@string/action_replace_file\"/>\n    <Preference\n        app:key=\"control.export\"\n        app:title=\"@string/action_export_file\"/>\n    <PreferenceCategory\n        app:key=\"settings\"\n        app:title=\"@string/settings\"\n        app:initialExpandedChildrenCount=\"1\">\n        <SwitchPreference\n            app:key=\"isAutoConnect\"\n            app:summary=\"@string/auto_connect_summary\"\n            app:title=\"@string/auto_connect\"/>\n\n        <ListPreference\n            app:key=\"serviceMode\"\n            app:entries=\"@array/service_modes\"\n            app:entryValues=\"@array/service_mode_values\"\n            app:defaultValue=\"vpn\"\n            app:title=\"@string/service_mode\"\n            app:useSimpleSummaryProvider=\"true\"/>\n        <SwitchPreference\n            app:key=\"shareOverLan\"\n            app:title=\"@string/share_over_lan\"/>\n        <EditTextPreference\n            app:key=\"portProxy\"\n            app:title=\"@string/port_proxy\"\n            app:useSimpleSummaryProvider=\"true\"/>\n        <EditTextPreference\n            app:key=\"portLocalDns\"\n            app:title=\"@string/port_local_dns\"\n            app:useSimpleSummaryProvider=\"true\"/>\n        <EditTextPreference\n            app:key=\"portTransproxy\"\n            app:title=\"@string/port_transproxy\"\n            app:useSimpleSummaryProvider=\"true\"/>\n    </PreferenceCategory>\n\n    <Preference\n        app:key=\"about\"\n        app:title=\"@string/about\"/>\n    <Preference\n        app:key=\"about.ossLicenses\"\n        app:title=\"@string/oss_license_title\"\n        app:summary=\"@string/preferences_license_summary\"/>\n\n</PreferenceScreen>\n"
  }
]