diff --git a/.github/workflows/create-a-new-release.yml b/.github/workflows/create-a-new-release.yml new file mode 100644 index 000000000..d6503cd04 --- /dev/null +++ b/.github/workflows/create-a-new-release.yml @@ -0,0 +1,154 @@ +name: create a new release + +on: + push: + branches: + - master + +permissions: + contents: write + +jobs: + create_release: + runs-on: ubuntu-22.04 + + steps: + - name: Checkout repository + uses: actions/checkout@v5 + with: + fetch-depth: 0 + + - name: Fetch tags + run: git fetch --tags --force + + - name: Prepare release metadata + id: prepare_release + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + python3 <<'PY' + import os + import pathlib + import re + import subprocess + + github_output = pathlib.Path(os.environ["GITHUB_OUTPUT"]) + release_notes_path = pathlib.Path("release_notes.md") + + def write_output(name, value): + with github_output.open("a", encoding="utf-8") as output_file: + print(f"{name}={value}", file=output_file) + + def capitalize_sentences(text): + """Capitalize the first alphabetical character of each sentence.""" + result = [] + capitalize_next = True + for character in text: + if capitalize_next and character.isalpha(): + result.append(character.upper()) + capitalize_next = False + else: + result.append(character) + + if character in ".!?": + capitalize_next = True + return "".join(result) + + version = pathlib.Path("VERSION").read_text(encoding="utf-8").strip() + if not re.fullmatch(r"\d+\.\d+\.\d+", version): + raise SystemExit(f"VERSION must contain x.y.z, found: {version}") + + tag_name = f"v{version}" + + changelog_lines = pathlib.Path("CHANGELOG.md").read_text( + encoding="utf-8" + ).splitlines() + + latest_section = [] + started = False + version_heading = re.compile(r"^\d+\.\d+\.\d+\b") + + for line in changelog_lines: + if not started: + if line.strip(): + started = True + latest_section.append(line) + continue + + if version_heading.match(line.strip()): + break + + latest_section.append(line) + + while latest_section and not latest_section[-1].strip(): + latest_section.pop() + + if not latest_section: + raise SystemExit("Could not extract the latest release notes from CHANGELOG.md") + + latest_heading = latest_section[0].strip() + if not latest_heading.startswith(version): + raise SystemExit( + "The top section in CHANGELOG.md does not match the version in VERSION" + ) + + normalized_lines = [latest_section[0].strip(), ""] + for line in latest_section[1:]: + stripped = line.strip() + if not stripped: + normalized_lines.append("") + continue + + bullet_match = re.match(r"^([*-]\s+)(.*)$", stripped) + if bullet_match: + prefix, content = bullet_match.groups() + normalized_lines.append(f"{prefix}{capitalize_sentences(content.strip())}") + continue + + normalized_lines.append(capitalize_sentences(stripped)) + + release_notes_path.write_text( + "\n".join(normalized_lines).strip() + "\n", + encoding="utf-8", + ) + + existing_tag = subprocess.run( + ["git", "tag", "--list", tag_name], + check=True, + capture_output=True, + text=True, + ).stdout.strip() + + release_exists = subprocess.run( + ["gh", "release", "view", tag_name], + capture_output=True, + text=True, + ).returncode == 0 + + write_output("tag_name", tag_name) + write_output("tag_exists", "true" if existing_tag else "false") + write_output("release_exists", "true" if release_exists else "false") + PY + + - name: Create and push tag + if: steps.prepare_release.outputs.tag_exists == 'false' + run: | + git config user.name "github-actions[bot]" + git config user.email "41898282+github-actions[bot]@users.noreply.github.com" + git tag "${{ steps.prepare_release.outputs.tag_name }}" + git push origin "${{ steps.prepare_release.outputs.tag_name }}" + + - name: Create GitHub release + if: steps.prepare_release.outputs.release_exists == 'false' + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + gh release create "${{ steps.prepare_release.outputs.tag_name }}" \ + --title "${{ steps.prepare_release.outputs.tag_name }}" \ + --notes-file release_notes.md \ + --latest + + - name: Skip existing tag and release + if: steps.prepare_release.outputs.tag_exists == 'true' && steps.prepare_release.outputs.release_exists == 'true' + run: | + echo "Tag ${{ steps.prepare_release.outputs.tag_name }} and its release already exist. Skipping." diff --git a/.github/workflows/integration-tests.yml b/.github/workflows/integration-tests.yml index 538ab87ed..35a19d816 100644 --- a/.github/workflows/integration-tests.yml +++ b/.github/workflows/integration-tests.yml @@ -53,11 +53,18 @@ jobs: run: | python3 -m pytest tests/${{ matrix.test_file }} -p no:warnings -vv -s -n 3 + - name: Build Artifact Name + # otherwise we get numeric names for the artifacts and we dont know which is which + id: artifact-name + run: | + sanitized_test_file="${{ matrix.test_file }}" + sanitized_test_file=$(printf '%s\n' "$sanitized_test_file" | tr '/' '_') + echo "name=${sanitized_test_file}-integration-output" >> "$GITHUB_OUTPUT" + - name: Upload Artifacts if: always() uses: actions/upload-artifact@v6 with: - # Replaces slashes with underscores for valid artifact naming - name: ${{ github.run_id }}-${{ strategy.job-index }}-integration-output + name: ${{ steps.artifact-name.outputs.name }} path: | - output/integration + output/integration_tests diff --git a/.gitignore b/.gitignore index fab190b3b..5d7184c71 100644 --- a/.gitignore +++ b/.gitignore @@ -18,6 +18,10 @@ slack_bot_token_secret # Ignore daemon output files daemon/ +# Ignore private AGENTS.md, may contain private paths +private/AGENTS.md + + # Ignore the results folders 2019- 2020- @@ -29,7 +33,7 @@ daemon/ *.swp *.swo -# apple shit +# apple-related *.bst # pcap diff --git a/.gitmodules b/.gitmodules index 7862ffef4..b0e235b56 100644 --- a/.gitmodules +++ b/.gitmodules @@ -19,3 +19,7 @@ path = SlipsWeb url = https://github.com/stratosphereips/SlipsWeb.git branch = master +[submodule "modules/kalipso"] + path = modules/kalipso + url = https://github.com/stratosphereips/Kalipso + branch = main diff --git a/.secrets.baseline b/.secrets.baseline index 86c4471ba..78f90d921 100644 --- a/.secrets.baseline +++ b/.secrets.baseline @@ -149,7 +149,7 @@ "filename": "config/slips.yaml", "hashed_secret": "4cac50cee3ad8e462728e711eac3e670753d5016", "is_verified": false, - "line_number": 278 + "line_number": 304 } ], "dataset/test14-malicious-zeek-dir/http.log": [ @@ -7174,16 +7174,7 @@ "is_verified": false, "line_number": 791 } - ], - "webinterface/templates/app.html": [ - { - "type": "Base64 High Entropy String", - "filename": "webinterface/templates/app.html", - "hashed_secret": "4541da42e4bee42db18b73a671a93eee3fe5caf9", - "is_verified": false, - "line_number": 139 - } ] }, - "generated_at": "2026-03-27T14:25:16Z" + "generated_at": "2026-04-27T14:39:21Z" } diff --git a/AGENTS.md b/AGENTS.md index 48cb9d39e..db3770c38 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -1,42 +1,136 @@ # AGENTS.md -## Project overview -- Entry point: `slips.py` (starts the main process, spawns modules, runs in interactive/daemon modes). -- Core framework code lives in `slips/`, `slips_files/`, and `managers/`. -- Detection/analysis modules are in `modules/` (implement the `IModule` interface). -- Configuration is in `config/` (main config: `config/slips.yaml`). -- Tests live under `tests/` (unit + integration suites). -- Documentation is in `docs/` (see `docs/contributing.md` for contribution workflow, branching, and PR expectations). -- UIs/tools: `SlipsWeb/`, `webinterface/`, `webinterface.sh`, and `kalipso.sh`. - -## Build and test commands -- Run locally (no build step): - - `./slips.py -e 1 -f dataset/test7-malicious.pcap -o output_dir` -- Build the Docker image (from `docs/installation.md`): - - `docker build --no-cache -t slips -f docker/Dockerfile .` - - If build networking fails: `docker build --network=host --no-cache -t slips -f docker/Dockerfile .` -- Run the Docker image: - - `docker run -it --rm --net=host slips` - -## Code style guidelines -- Python formatting is enforced via pre-commit: - - Black with `--line-length 79` (see `.pre-commit-config.yaml`). - - Ruff is used for linting and autofixes. -- Keep docstrings at the top of files where present (pre-commit `check-docstring-first`). -- Maintain clean whitespace (no trailing whitespace, final newline). -- Follow existing module patterns (`IModule` in `slips_files/common/abstracts/module.py`). - -## Testing instructions -- The canonical test runner is `tests/run_all_tests.sh` (runs unit tests then integration tests). -- Equivalent manual sequence (from `tests/run_all_tests.sh`): - - `./slips.py -cc` - - `printf "0" | ./slips.py -k` - - `python3 -m pytest tests/ --ignore="tests/integration_tests" -n 7 -p no:warnings -vvvv -s` - - `python3 tests/destrctor.py` - - `./slips.py -cc` - - `printf "0" | ./slips.py -k` - - `python3 -m pytest -s tests/integration_tests/test_portscans.py -p no:warnings -vv` - - `python3 -m pytest -s tests/integration_tests/test_dataset.py -p no:warnings -vv` - - `python3 -m pytest -s tests/integration_tests/test_config_files.py -p no:warnings -vv` - - `printf "0" | ./slips.py -k` - - `./slips.py -cc` +## 1. Project Overview + +- Entry point: `slips.py` + - Starts the main process + - Spawns modules + - Supports interactive and daemon modes + +- Core code directories: + - `slips/` + - `slips_files/` + - `managers/` + +- Detection modules: + - Located in `modules/` + - Must implement `IModule` from: + `slips_files/common/abstracts/module.py` + +- Configuration: + - Main file: `config/slips.yaml` + +- Tests: + - Located in `tests/` + - Includes unit and integration tests + +- Documentation: + - Located in `docs/` + - Contribution guide: `docs/contributing.md` + +- UI / tools: + - `SlipsWeb/` + - `webinterface/` + - `webinterface.sh` + - `kalipso.sh` + +- Repository root: + - All commands MUST be executed from `StratosphereLinuxIPS/` + +--- + +## 2. Build and Run + +### to run slips locally +./slips.py -e 1 -f dataset/test7-malicious.pcap -o output_dir + +### Build Docker image +docker build --no-cache -t slips -f docker/Dockerfile . + +- If networking fails: + +docker build --network=host --no-cache -t slips -f docker/Dockerfile . + +### Run Docker container +docker run -it --rm --net=host slips + +## 3. Code Style Rules + +These rules MUST be followed: + +- No trailing whitespace +- File must end with a newline +- Docstring must be the first statement in a file (if present) +- Avoid using environment variables, use variables from slips/config.yaml instead. + +### Paths: +- NEVER use absolute paths +- ALWAYS use relative paths +### Files: +- If a non-debug file is created → MUST be added with git add +### Documentation: +If a feature is added → MUST update relevant docs in docs/ +### Functions: +- Every new function MUST include a docstring +Docstrings MUST include: +- Short description +- Parameters (if applicable) +- Return value (if applicable) + +## 4. Testing +- Canonical test runner +tests/run_all_tests.sh +## 5. Unit Test Update Workflow + +When instructed to "update unit tests", follow EXACTLY: + +Step 1 — Run tests +python3 -m pytest tests/unit/ \ + --ignore="tests/integration_tests" \ + -n 7 -p no:warnings -vvvv -s + +Step 2 — Identify failures +Collect ALL failing tests + +Step 3 — Fix tests +Update failing tests ONE BY ONE +Do NOT batch fixes + +Step 4 — Add missing tests for new files +For every new source file in the branch: + +- Mirror its directory under tests/unit/ + +- C/reate file: +test_.py +- Add unit tests for that file + +Step 5 — Add tests for new functions +- Identify functions added in this branch (not in origin/develop) +- Add unit tests for each new function + +Step 6 — Test structure rules +- MUST use @pytest.mark.parametrize when applicable + +EACH test MUST: +Start with object creation using module_factory + +Step 7 — Re-run tests +Run the same pytest command again +Ensure ALL tests pass + +Step 8 — Git tracking +If new test files were created → run: +git add + +Step 9 — Failure fallback +If tests are still failing and cannot be fixed: +STOP +Report the issue + +## 6. Custom Instructions +ALSO apply rules from: +private/AGENTS.md + +If conflicts occur: +Prefer private/AGENTS.md diff --git a/CHANGELOG.md b/CHANGELOG.md index 1347ce71b..cc52be292 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,8 +1,22 @@ +1.1.20 (Apr 30th, 2026) + +* Add optional live Slips auto-update feature. +* Fix daemon shutdown with `-S`. +* Fix web interface startup, along with flow view and profile refresh handling. +* Move Kalipso to a submodule. +* Add DoS protection for high-throughput Zeek input, with configurable sampling windows and skip thresholds. +* Reorganize Slips output directory so alerts, databases, and persistent artifacts are stored in dedicated directories. +* Improve bloom filters. +* Update the organizations IPs, domains and ASNs lists. +* Improve Whitelists. +* Improve ASN lookups. + + 1.1.19 (Mar 31st, 2026) * Add SSH bruteforce detection based on Zeek SSH, software, and notice logs. * Improve performance under high-throughput traffic with parallel evidence handling, profiler/input optimizations. -* Fix issues while slips is shutting down. +* Fix issues while Slips is shutting down. * Add optional performance plots and CSV metrics for latency, throughput, and resource usage. * Fix skipped first-flow processing and reduce shutdown race conditions on small files and PCAPs. @@ -44,7 +58,7 @@ 1.1.15 (Oct 31st, 2025) - Fix FP connection to port 0 for IGMP flows. - Support monitoring two interfaces when Slips is running as an access point. -- Improve running slips on a growing zeek directory (using -g): Slips can now detect the interface, host IP and gateway IP. +- Improve running Slips on a growing zeek directory (using -g): Slips can now detect the interface, host IP and gateway IP. 1.1.14 (Oct 14th, 2025) - Security Patch for CVE-2025-49844: Force use of Redis version 8.2.2 @@ -65,14 +79,14 @@ 1.1.11 (July 3rd, 2025) - Fix local P2P trust model. - Fix SQLite cursor errors. -- Avoid reporting own self or other slips peers when arp poisoning attackers. +- Avoid reporting own self or other Slips peers when arp poisoning attackers. 1.1.10 (May 26, 2025) - Add support for unblocking attackers using IP tables after a probation period. - Add support for blocking attackers using ARP poisoning. - Improve how the gateway IP and MAC are detected. -- Support running slips as an AP to block attackers in the RPI. +- Support running Slips as an AP to block attackers in the RPI. 1.1.9 (April 30, 2025) - Add bootstrapping node mode for the global P2P. Thanks to @d-strat @@ -95,7 +109,7 @@ 1.1.7 (Feb 28th, 2025) - Add global P2P support. Thanks to @d-strat - Add new "GRE tunnel scan" detections. -- Add the option to enable/disable local and online whitelists from slips.yaml. +- Add the option to enable/disable local and online whitelists from Slips.yaml. - Fix false positive "Connection to a private IP outside of local network" detection. Slips now doesn't alert on DNS servers outside of local network. - Fix false positive "Connection to a private IP" detection when the connection is DHCP. - Fix false positive "Device changing IP" detection alerting about special IPs. @@ -128,7 +142,7 @@ - Add a threat level and confidence to each alert. - Add evidence for CN and hostname mismatch in SSL flows. - Add multiple telnet reconnection attempts detection. -- Add support to IP ranges as the client_ip in slips.yaml +- Add support to IP ranges as the client_ip in Slips.yaml - Alert "invalid DNS answer" on all private DNS answers. - Don't alert "high entropy TXT answers" for flows from multicast IPs. - Fix multiple reconnection attempts detection. @@ -140,7 +154,7 @@ 1.1.4.1 (Dec 3rd, 2024) - Fix abstract class starting with the rest of the modules. -- Fix the updating of the MAC vendors database used in slips. +- Fix the updating of the MAC vendors database used in Slips. - Improve MAC vendor offline lookups. 1.1.4 (Nov 29th, 2024) @@ -167,7 +181,7 @@ 1.1.2 (September 30th, 2024) - Add a relation between related evidence in alerts.json - Better unit tests. Thanks to @Sekhar-Kumar-Dash -- Discontinued MacOS m1 docker images, P2p images, and slips dependencies image. +- Discontinued MacOS m1 docker images, P2p images, and Slips dependencies image. - Fix the problem of the progress bar stopping before analysis is done, causing Slips to freeze when analyzing large PCAPs. - Improve how Slips recognizes the current host IP. - Increase the speed of the Flowalerts module by changing how Slips checks for DNS servers. @@ -212,7 +226,7 @@ - Improve some threat levels of evidence to reduce false positives. - Improve whitelists. Better matching, more domains added, reduced false positives. - More minimal Slips notifications, now Slips displays the alert description instead of all evidence in the alert. -- The port of the web interface is now configurable in slips.conf +- The port of the web interface is now configurable in Slips.conf 1.0.14 (May 2024) @@ -236,9 +250,9 @@ - Fix problems stopping the daemon. 1.0.12 (March 2024) -- Add an option to specify the current client IP in slips.conf to help avoid false positives. +- Add an option to specify the current client IP in Slips.conf to help avoid false positives. - Better handling of URLhaus threat intelligence. -- Change how slips determines the local network of the current client IP. +- Change how Slips determines the local network of the current client IP. - Fix issues with the progress bar. - Fix problem logging alerts and errors to alerts.log and erros.log. - Fix problem reporting evidence to other peers. @@ -287,10 +301,10 @@ - Use All-ID hash to fingerprint flows stored in the flows database - Increase the weight of port scan alerts by increasing its threat level - Fix False positive port scan alerts -- Add an option in slips.conf to wait for the update manager to update all TI feeds before starting the rest of Slips to avoid missing any blacklisted IPs. +- Add an option in Slips.conf to wait for the update manager to update all TI feeds before starting the rest of Slips to avoid missing any blacklisted IPs. - Fix error detecting password guessing. - Fix issues reading all flows when running on a low-spec device. -- Improved the stopping of slips and termination of processes. +- Improved the stopping of Slips and termination of processes. - Improved progress bar. - Fix reading flows from stdin. - Better code, logs, and unit tests. @@ -355,7 +369,7 @@ -1.0.3 (March 2023) - Add HTTP unencrypted traffic detection by @haleelsada - use termcolor by @haleelsada -- Instead of dos detection. slips is now detecting all executables thanks to @Onyx2406 +- Instead of dos detection. Slips is now detecting all executables thanks to @Onyx2406 - Updated the docs for contributing - Fix Leak detector errors when a different version of yara is used. - fix problem with counting the number of flows to be processed in the progress bar @@ -366,14 +380,14 @@ - Add a zeek script to recognize the gateway IP and add it to notice.log - Don't alert "Connection to Private IP" when there's a DNS connection on port 53 UDP to the gateway - Faster reading of netflow and suricata files -- Add a progress bar to slips showing the number of processed flows +- Add a progress bar to Slips showing the number of processed flows - Fix having duplicate alerts - Fix vertical and horizontal portscan errors - Add the uids that caused an evidence to the evidence description in alerts.json - Add a blocking indicator in alerts.json - Fix wrong Source/Target type in alerts.json - Fix error parsing AIP TI list. -- Update slips default whitelist +- Update Slips default whitelist - Kill web interface on ctrl+c - Use the current user's timezone in alerts.log and alets.json - Fix problem displaying data from the db in the web interface @@ -391,7 +405,7 @@ - Fix md5 urlhaus lookups - add support for sha256 hashes in files.log generated by zeek - Add detection of weird HTTP methods -- Fix race condition trying to update TI files when running multiple slips instances +- Fix race condition trying to update TI files when running multiple Slips instances - Fix having multiple port scan alerts with the same timestamp - Add detection for non-SSL connections on port 443 - Add detection for non-HTTP connections on port 80 @@ -402,13 +416,13 @@ - Add detection for DHCP scans - Add detection for devices changing IPs. - Support having IP ranges in your own local TI file own_malicious_iocs.csv -- Remove rstcloud TI file from slips.conf -- Add the option to change pastebin download detection threshold in slips.conf -- Add the option to change shannon entropy threshold detection threshold in slips.conf +- Remove rstcloud TI file from Slips.conf +- Add the option to change pastebin download detection threshold in Slips.conf +- Add the option to change shannon entropy threshold detection threshold in Slips.conf - Store zeek files in the output directory by default - Portscan detector is now called network service discovery - Move all TI feeds to their separate files in the config/ directory for easier use -- Add the option to start slips web interface automatically using -w +- Add the option to start Slips web interface automatically using -w - Fix multiple SSH client versions detection - Add detection of IPs using multiple SSH server versions - Wait 30 mins before the first connection without DNS evidence @@ -421,11 +435,11 @@ - Keep track of old peer reports about the same ip - Add a new log file p2p_reports.log, for logging peer reports only - Don't force kill all modules when using -P -- Add -g option for running slips on growing zeek dirs. (for example dirs generated by zeek running on an interface) +- Add -g option for running Slips on growing zeek dirs. (for example dirs generated by zeek running on an interface) - Add support for hosts outside of the network in zeek generated software.log - Make sure the domains that are part of DGA alerts are not whitelisted -- Don't stop slips when p2p is enabled but slips is given a file, not an interface. -- Add Detection of SSH password guessing by slips in addition to zeek. +- Don't stop Slips when p2p is enabled but Slips is given a file, not an interface. +- Add Detection of SSH password guessing by Slips in addition to zeek. - Blacklist IP used by blackmatter for exfiltration in config/own_malicious_iocs - Detect empty connections to duckduckgo used by blackmatter for checking internet connection - Fix pastebin downloads detection to include HTTPs too @@ -444,7 +458,7 @@ - Detect DNS answers that have a blacklisted IP or CNAME - Fix problem detecting SSH logins by zeek - Make rotating zeek files configurable. how many days you want to keep the rotated files and how often to rotate -- Support running slips on a growing zeek dir. for example a zeek dir of an interface. +- Support running Slips on a growing zeek dir. for example a zeek dir of an interface. - Support looking up hashes and domains in URLhaus - Support looking up IPs in Spamhaus - Support looking up hashes in Circl.lu @@ -460,7 +474,7 @@ - Detect ICMP scans in netflow files - Fix P2P - Fix zeek rotating files on ctrl+c -- Kill slips on when redis ConnectionError occurs +- Kill Slips on when redis ConnectionError occurs - Kill all modules after 15 mins to trying to stop them - Keep track of profiles' past threat levels - Don't alert ARP scans from the gateway @@ -475,23 +489,23 @@ - Detect downloads from pastebin with size > 0.012 MBs - Detect DOS executable downloads from http websites - Update the mac database automatically -- Support using multiple home network parameters in slips.conf -- Add redis.conf for special redis configurations when running slips +- Support using multiple home network parameters in Slips.conf +- Add redis.conf for special redis configurations when running Slips - Improve portscan or ARP scan alerts - Improve ARPA scan alerts to alert on unique domains - Add new methods to detect data upload -- Add the option to close all redis servers when slips can't start because all port are unavailable -- Remove support for whitelisting an unsupported org by slips +- Add the option to close all redis servers when Slips can't start because all port are unavailable +- Remove support for whitelisting an unsupported org by Slips - Better description of alerts exported to Slack - Faster Whitelists -- Whitelist connections made by slips causing false positives +- Whitelist connections made by Slips causing false positives - Change the unknown ports detections to detect only established connections - Change -killall argument behaviour. now supports closing a specific redis port or all of them at once - Fix exporting module - Fix false positive resolution without connection alerts - Fix disabling alerts - Fix saving and loading the database -- Fix running several slips instances +- Fix running several Slips instances - Fix stopping the daemon with -S - Fix how packets are calculated in portscan detections - Fix 'multiple reconnections attempts' detection to detect 5 or more rejected reconnection attempts to the same IP on the same destination port @@ -499,7 +513,7 @@ -0.9.3 (July 2022) * Slips -- Run multiple slips instances on demand using (-m), and use redis port 6379 by default. +- Run multiple Slips instances on demand using (-m), and use redis port 6379 by default. - Fix false positive 'DNS resolution without connection' alerts - Faster Slips and reduced memory and CPU consumption - Better 'unknown ports' detections @@ -508,11 +522,11 @@ - Fix problem generating the data upload alerts - Improve contributing guidelines - Update microsoft whitelisted IP ranges -- Fix problem stopping input process when slips stops +- Fix problem stopping input process when Slips stops - Update the locations of GeoIP database in zeek for better zeek detections -- Fix P2P output dir, now it's the same as alerts.log and slips.log +- Fix P2P output dir, now it's the same as alerts.log and Slips.log - Update our usage of macvendors.com API -- Whitelist the connections made by slips, so now you won't be alerted when Slips is using virustotal.com or macvendors.com +- Whitelist the connections made by Slips, so now you won't be alerted when Slips is using virustotal.com or macvendors.com -0.9.2 (June 2022) @@ -522,20 +536,20 @@ - Fix problem updating TI files - Fix problem starting and stopping the Daemon - Fix false positive ARP MITM attacks -- Fix problem stopping slips when using whitelists +- Fix problem stopping Slips when using whitelists - Fix problem opening unused redis ports -0.9.1 (May 2022) * Slips - Drop root privileges in modules that don't need them -- Added support for running slips in the background as a daemon +- Added support for running Slips in the background as a daemon - Fix the issue of growing zeek logs by deleting old zeek logs every 1 day. (optional but enabled by default) -- Added support for running several instances of slips at the same time. +- Added support for running several instances of Slips at the same time. - Saving and loading the db in macos - Fix reading flows from stdin, now it supports zeek, argus and suricata -- Faster Startup of slips, now slips updates the TI files in the background -- Added slips.log where all Slips logs goes. in daemon and interactive mode +- Faster Startup of Slips, now Slips updates the TI files in the background +- Added Slips.log where all Slips logs goes. in daemon and interactive mode - Automatic starting of redis servers (cache and main databases). - Added a new TI file https://hole.cert.pl/domains/domains.json - Update the docs and added instructions for contributing and creating a new module @@ -544,7 +558,7 @@ * Slips - P2P module: Added the support for sharing and receiving IPs' info with other peers. Can be run using docker or locally. - Parse zeek software.log and extract software type, version and user agent from it - - Detect multiple SSH client versions. slips will now alert if an IP is detected using OpenSSH_8.1 then OpenSSH_7.1 for example + - Detect multiple SSH client versions. Slips will now alert if an IP is detected using OpenSSH_8.1 then OpenSSH_7.1 for example - Detect DoH flows in ssl.log - Fix connection rest by peer error by changing the buffer limit in redis - Fix reading flows from stdin @@ -553,7 +567,7 @@ - Fix DGA detections - Reduce p2p.log file size - Rotate p2p.log every 1 day and keep only the last day by default - - Don't create p2p.log by default, unless create_p2p_log is set to yes in slips.conf + - Don't create p2p.log by default, unless create_p2p_log is set to yes in Slips.conf -0.8.5 (March 2022) * Slips - Detect young domains that was registered less than 60 days ago. @@ -567,17 +581,17 @@ - The default time to wait to alert on DNS without resolution now is 30 mins - The time to wait for DNS without resolution now works in interface capture mode and in reading any file - detect ICMP timestamp scan, Address scan and address mask scan - - Support deleting of large log files (arp.log) in case the user doesn't want a copy of the log files after slips is done + - Support deleting of large log files (arp.log) in case the user doesn't want a copy of the log files after Slips is done - Update our offline MAC vendor database and add support for getting unknown vendors from an online database - Fix FP Multiple reconnection attempts - - Added a zeek script to recognize DoH flows for more real-time experience while using slips - - Change the structure of slips files by splitting large modules into smaller files. + - Added a zeek script to recognize DoH flows for more real-time experience while using Slips + - Change the structure of Slips files by splitting large modules into smaller files. - Reduce false positives by disabling 'connections without DNS' to a well known org - Fix 'multiple reconnection attemps' alerts - Update the list of our special organization ports - - Document all the internet connections made by slips + - Document all the internet connections made by Slips - Fix install.sh - - Add errors.log to output/ dir to log errors encountered by slips. + - Add errors.log to output/ dir to log errors encountered by Slips. -0.8.4 (Feb 2022) * Slips - Add support for local JA3 feeds @@ -585,16 +599,16 @@ - Update and improve whitelists - Improve alerts by adding hostname to alerts printed in the CLI and in alerts.log - Faster startup of Slips, now TI files are updated concurrently. - - Add a logstash configuration file to allow exporting slips alerts. + - Add a logstash configuration file to allow exporting Slips alerts. - Add support for malicious SSL feeds. - Support blacklisting IP ranges taken from TI feeds. - profilerProcess optimizations. - Get device type, browser and OS info from user agents found in HTTP traffic. - - Add "Blocked by Slips" comment to all iptables rules added by slips + - Add "Blocked by Slips" comment to all iptables rules added by Slips - Improve whitelisting by updating organizations' domains. - Update documentation - Fix invalid JSON alerts in alerts.json - - Fix problem stopping slips. + - Fix problem stopping Slips. - Fix problem with redis stopping on error writing to disk. - Fix false positive 'not valid yet' SSL alerts - Descrease the amount of false positive C&C alerts @@ -622,17 +636,17 @@ - Detect unsolicited ARP - Detect MITM ARP attack - Detect DGA - - Support popup notifications in Linux and mac. disabled by default. enable it by changing popup_alerts to yes in slips.conf + - Support popup notifications in Linux and mac. disabled by default. enable it by changing popup_alerts to yes in Slips.conf - Add 5 new TI feeds (AmnestyTech domains) - The Threat Intelligence feeds are now assigned a threat level instead of confidence value by default (user can change), so you can establish how each list impact your detection. - Improve unknown ports detections. Now we don't alert for ports that appear in an FTP connection. - Improve threat levels and confidence of all alerts. - Add support for storing a copy of zeek files in the output directory. - - Add support for enabling and disabling detections in slips.conf + - Add support for enabling and disabling detections in Slips.conf - Read RiskIQ email and API key from modules/RiskIQ/credentials instead of the configuration file. - - Now log files are disabled by default, use -l or set create_log_files to yes in slips.conf for enabling them. - - Support commenting TI files in slips.conf: when TI files are commented using ; in slips.conf, they are completely removed from our database. - - Now slips generates alerts in IDEA format by default in alerts.json + - Now log files are disabled by default, use -l or set create_log_files to yes in Slips.conf for enabling them. + - Support commenting TI files in Slips.conf: when TI files are commented using ; in Slips.conf, they are completely removed from our database. + - Now Slips generates alerts in IDEA format by default in alerts.json - Support importing and exporting alerts to warden servers. (CESNET sharing module) - Fix redis closing connection errors - Optimize our docker image @@ -669,7 +683,7 @@ - New export alerts in suricata-style format. - Check suspicious user agents in HTTP (for now only 'httpsend', 'chm_msdn', 'pb'). - New ARP-scan detector module. - - Be able to run multiple independent instances of slips in the same machine. + - Be able to run multiple independent instances of Slips in the same machine. - Save and load redis databases to disk as backup for later analysis. - Add unit tests in tests/ folder. - Use our own Zeek configuration file, so Slips does not collide with the local installation. @@ -770,7 +784,7 @@ - add zeek tcp-inactivity-timeout=1hs - add module flowalert and alert when a long connection happens (more than 20 minutes) - add colors to the detection shown in the console - - add 3 new TI feeds to slips conf by default + - add 3 new TI feeds to Slips conf by default - make longconnection feature in flowalert to ignore multicast - fix some TI files not being updated - check TI data in the host field of HTTP @@ -795,7 +809,7 @@ - Added a field to the flow to put labels from modules - Fixed the display of DNS resolutions up to 3 for the IP in the timeline - Added functions to mark timewindow as finished - - Default label of the flow in the slips.conf is changed to 'unknown' + - Default label of the flow in the Slips.conf is changed to 'unknown' - Added a module to block IPs when running Slips on interface in Linux machine - Added a parameter '-b' to enable blocking module on the interface in Linux machine - Store DomainsInfo in cache database @@ -809,7 +823,7 @@ - Added cache for IPs Info - Added new module UpdateManager to update Threat Intelligence files - Changed the structure of VirusTotal Module - - Added parameters in slips.conf for updating VirusTotal and Threat Intelligence + - Added parameters in Slips.conf for updating VirusTotal and Threat Intelligence - Added new channel 'core_messages', UpdateManager is subscribed to that - Added manager to search host IP, if Slips is running on interface and networks are changing - Flows in the timeline are sorted @@ -858,4 +872,4 @@ - 0.3.4 - This is a mayor version change. Implementing new algorithms for analyzing the results, management of IPs, connections, whois database and more features. - A new parameter to specify the file (-r). This is as fast as reading the file from stdin. - - Now we have a configuration file slips.conf. In there you can specify from fixed parameters, the time formats, to the columns in the flow file. + - Now we have a configuration file Slips.conf. In there you can specify from fixed parameters, the time formats, to the columns in the flow file. diff --git a/README.md b/README.md index 300e2c629..9cc2e54bc 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@

-Slips v1.1.19 +Slips v1.1.20

@@ -110,8 +110,9 @@ cat output_dir/alerts.log # Graphical User Interface -To check Slips output using a GUI you can use the web interface -or our command-line based interface Kalipso +To check Slips output using a GUI you can use the web interface. An optional +Kalipso checkout is also available as the `modules/kalipso` submodule for the +terminal interface. ##### Web interface @@ -123,17 +124,16 @@ Then navigate to ```http://localhost:55000/``` from your browser. For more info about the web interface, check the docs: https://stratospherelinuxips.readthedocs.io/en/develop/usage.html#the-web-interface +##### Kalipso submodule -##### Kalipso (CLI-Interface) +Kalipso is maintained in a separate repository and included here as an optional +submodule: - ./kalipso.sh - - - - -For more info about the Kalipso interface, check the docs: https://stratospherelinuxips.readthedocs.io/en/develop/usage.html#kalipso +```bash +git submodule update --init --recursive modules/kalipso +``` ---- +See the installation docs for native setup details. # Requirements @@ -186,7 +186,7 @@ Slips key features are: * **Threat Intelligence Updates**: Slips continuously updates threat intelligence files and databases, providing relevant detections as updates occur. * **HTTPS Anomaly Detection**: Adaptive TLS/HTTPS anomaly detection with drift handling and a local HTML report generator for deep dives. * **Integration with External Platforms**: Modules in Slips can look up IP addresses on external platforms such as VirusTotal and RiskIQ. -* **Graphical User Interface**: Slips provides a console graphical user interface (Kalipso) and a web interface for displaying detection with graphs and tables. +* **Graphical User Interface**: Slips provides a web interface and an optional Kalipso terminal interface through the `modules/kalipso` submodule. * **Peer-to-Peer (P2P) Module**: Slips includes a complex automatic system to find other peers in the network and share IoC data automatically in a balanced, trusted manner. The P2P module can be enabled as needed. * **Docker Implementation**: Running Slips through Docker on Linux systems is simplified, allowing real-time traffic analysis. * **Detailed Documentation**: Slips provides detailed documentation guiding users through usage instructions for efficient utilization of its features. diff --git a/VERSION b/VERSION index 4e036596e..be5b4c7bb 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.1.19 +1.1.20 diff --git a/config/TI_feeds.csv b/config/TI_feeds.csv index 8a5dfc70a..d8e44b65d 100644 --- a/config/TI_feeds.csv +++ b/config/TI_feeds.csv @@ -11,7 +11,7 @@ https://mcfp.felk.cvut.cz/publicDatasets/CTU-AIPP-BlackList/Todays-Blacklists/AI https://mcfp.felk.cvut.cz/publicDatasets/CTU-AIPP-BlackList/Todays-Blacklists/AIP_historical_blacklist_prioritized_by_newest_attackers.csv,medium, ['phishing','honeypot'] https://raw.githubusercontent.com/stratosphereips/Civilsphere/main/threatintel/strangereallintel-cyberthreatintel.csv,medium, ['phishing'] https://raw.githubusercontent.com/AssoEchap/stalkerware-indicators/master/generated/network.csv,medium, ['stalkerware'] -https://raw.githubusercontent.com/stratosphereips/Civilsphere/main/threatintel/adserversandtrackers.csv,medium, ['adtrackers'] +https://raw.githubusercontent.com/stratosphereips/Civilsphere/main/threatintel/adserversandtrackers.csv,info, ['adtrackers'] https://raw.githubusercontent.com/stratosphereips/Civilsphere/main/threatintel/civilsphereindicators.csv,medium, ['apt'] https://raw.githubusercontent.com/botherder/targetedthreats/master/targetedthreats.csv,medium, ['apt'] https://osint.digitalside.it/Threat-Intel/lists/latestdomains.txt,medium, ['honeypot'] @@ -26,10 +26,10 @@ https://lists.blocklist.de/lists/mail.txt,medium, ['honeypot'] https://lists.blocklist.de/lists/bruteforcelogin.txt,medium, ['honeypot'] https://feodotracker.abuse.ch/downloads/ipblocklist.csv,medium, ['honeypot'] https://reputation.alienvault.com/reputation.generic,medium, ['honeypot'] -https://raw.githubusercontent.com/anudeepND/blacklist/master/adservers.txt,medium, ['adtrackers'] +https://raw.githubusercontent.com/anudeepND/blacklist/master/adservers.txt,info, ['adtrackers'] # bigdargon: Hosts block ads of Vietnamese -https://raw.githubusercontent.com/bigdargon/hostsVN/master/option/domain.txt,medium, ['adtrackers'] -https://raw.githubusercontent.com/SweetSophia/mifitxiaomipiholelist/master/mifitblocklist.txt,medium, ['xiaomi-trackers'] +https://raw.githubusercontent.com/bigdargon/hostsVN/master/option/domain.txt,info, ['adtrackers'] +https://raw.githubusercontent.com/SweetSophia/mifitxiaomipiholelist/master/mifitblocklist.txt,info, ['xiaomi-trackers'] https://raw.githubusercontent.com/CriticalPathSecurity/Zeek-Intelligence-Feeds/master/abuse-ch-ipblocklist.intel,medium, ['honeypot'] https://raw.githubusercontent.com/CriticalPathSecurity/Zeek-Intelligence-Feeds/master/alienvault.intel,medium, ['honeypot'] https://raw.githubusercontent.com/CriticalPathSecurity/Zeek-Intelligence-Feeds/master/cobaltstrike_ips.intel,medium, ['honeypot'] diff --git a/config/iris_config.yaml b/config/iris_config.yaml index 76625208f..2e5e1b611 100644 --- a/config/iris_config.yaml +++ b/config/iris_config.yaml @@ -2,11 +2,11 @@ Identity: GenerateNewKey: true Server: Port: 9010 - Host: 0.0.0.0 + Host: null DhtServerMode: 'true' Redis: Host: 127.0.0.1 - Port: 6379 + Port: 6644 Tl2NlChannel: iris_internal PeerDiscovery: DisableBootstrappingNodes: false diff --git a/config/slips.yaml b/config/slips.yaml index d5a2e4f87..ef22d6f1f 100644 --- a/config/slips.yaml +++ b/config/slips.yaml @@ -1,14 +1,22 @@ # This configuration file controls several aspects of the working of Slips. --- -modes: +update: + # Enable automatic live updates of the installed Slips version. + # This setting is separate from the feeds_update_manager module, which only + # updates TI feeds and related files during runtime. + # Automatic Slips updates may overwrite the default config files shipped + # with Slips. If you want to keep your local configuration changes intact, avoid editing the default config files. + # Instead, create separate config files with different names and use those. + auto_update_slips: false + +output: # Define the file names for the default output. stdout: slips.log stderr: errors.log - logsfile: slips.log + logs: slips.log ############################# -# Parameters that can be also specified with modifiers in the command line parameters: # The verbosity is related to how much data you want to see about the @@ -77,6 +85,11 @@ parameters: # whitelist file, current commit and date metadata_dir: true + # This directory stores databases and runtime-generated files that must + # persist across different slips runs and should not be overwritten. + # this dir is inside slips root dir. + permanent_dir: permanent + # Default pcap packet filter. Used with zeek pcapfilter : 'ip or not ip' # If you want more important traffic and forget the multicast and broadcast # traffic, you can use @@ -112,7 +125,7 @@ parameters: # label: malicious # label: unknown label: normal - # If Zeek files are rotated or not to avoid running out of disk. + # determines if Zeek files are rotated or not to avoid running out of disk. # Zeek rotation is enabled by default when using an interface, # which means Slips will delete all Zeek log files after 1 day # of running @@ -126,17 +139,16 @@ parameters: # Whitespace between the numeric constant and time unit is optional. # Appending the letter s to the time unit in order to # pluralize it is also optional - # rotation_period = 30min - # rotation_period = 2hr - # rotation_period = 30sec - rotation_period: 1day + # default_rotation_interval: 30min + # default_rotation_interval: 2hr + #default_rotation_interval: 30sec + default_rotation_interval: 1day # How many days Slips keeps the rotated Zeek files before deleting them. # Value should be in days # set it to 0 day if you want to delete them immediately - # keep_rotated_files_for : 1 day + # keep_rotated_files_for : 0 day # keep_rotated_files_for : 2 day - # keep_rotated_files_for : 3 day keep_rotated_files_for: 1 day # How many minutes to wait for all modules to finish before killing them @@ -201,9 +213,9 @@ modules: # List of modules to ignore. By default we always ignore the template, # do not remove it from the list # Add the names of other modules that you want to disable - # (they all should be lowercase with no special characters). Example, - # threatintelligence, blocking, networkdiscovery, timeline, virustotal, - # rnnccdetection, flowmldetection, updatemanager + # (use module snake_case names). Example, + # threat_intelligence, blocking, network_discovery, timeline, virustotal, + # rnn_cc_detection, flow_ml_detection, feeds_update_manager disable: [template] # For each line in timeline file there is a timestamp. @@ -212,10 +224,10 @@ modules: timeline_human_timestamp: true ############################# -flowmldetection: +flow_ml_detection: # This is a module that uses machine learning for detection. # It can be used in train mode or test mode. - # The mode 'train' should be used to tell the flowmldetection module + # The mode 'train' should be used to tell the flow_ml_detection module # that the flows received are all for training. # A label should be provided in the [Parameters] section # mode : train @@ -226,7 +238,7 @@ flowmldetection: mode: test ############################# -bruteforcing: +brute_force_detector: # Minimum number of SSH attempts from one source to one destination # before Slips considers it brute forcing. ssh_attempt_threshold: 9 @@ -299,7 +311,7 @@ virustotal: ############################# threatintelligence: - # By default, slips starts without the TI files, and runs the Update Manager + # By default, slips starts without the TI files, and runs the feeds_update_manager # in the background. If this option is set to true, slips will not start # analyzing the flows until the update manager finished and all TI files are # loaded successfully. @@ -325,7 +337,7 @@ threatintelligence: # The remote TI files will be temporaly stored in this directory download_path_for_remote_threat_intelligence: modules/threat_intelligence/remote_data_files/ - # Update period of Threat Intelligence files. How often should Slips update + # Update period of threat_intelligence files. How often should Slips update # the IoCs. # The expected value is in seconds. # 1 day = 86400 seconds @@ -389,8 +401,8 @@ whitelists: local_whitelist_path: config/whitelist.conf ############################# -flowalerts: - # For the flowalerts module +flow_alerts: + # For the flow_alerts module # We need a thrshold to determine a long connection in seconds. # In Slips by default is 25 minutes long_connection_threshold: 1500 @@ -487,7 +499,7 @@ exporting_alerts: taxii_timeout: 10 ############################# -CESNET: +cesnet: # Slips also supports exporting and importing evidence in the IDEA format to/from # warden servers of CESNET organization in Czech Republic. send_alerts: false @@ -597,7 +609,7 @@ global_p2p: use_global_p2p: False iris_conf: config/iris_config.yaml bootstrapping_node: False - bootstrapping_modules: ["fidesModule", "irisModule"] + bootstrapping_modules: ["fides", "iris"] ############################# local_p2p: diff --git a/conftest.py b/conftest.py index d4aeb1c03..889a70b33 100644 --- a/conftest.py +++ b/conftest.py @@ -23,7 +23,6 @@ parent_dir = os.path.dirname(current_dir) sys.path.insert(0, parent_dir) - # Suppress TensorFlow logs from C++ backend os.environ["TF_CPP_MIN_LOG_LEVEL"] = "3" # 3 = ERROR # TensorFlow logs oneDNN messages even with TF_CPP_MIN_LOG_LEVEL=3. diff --git a/dataset/test1-normal.nfdump b/dataset/test1-malicious.nfdump similarity index 100% rename from dataset/test1-normal.nfdump rename to dataset/test1-malicious.nfdump diff --git a/docker/Dockerfile b/docker/Dockerfile index 91be0116c..9f629ed81 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -23,9 +23,6 @@ ENV IS_IN_A_DOCKER_CONTAINER=True # destionation dir for slips inside the container ENV SLIPS_DIR=/StratosphereLinuxIPS -ENV NODE_VERSION=22.5.0 -ENV NVM_DIR=/root/.nvm - # use bash instead of sh SHELL ["/bin/bash", "-c"] @@ -50,14 +47,9 @@ RUN apt-get update -o Acquire::Retries=5 -o Acquire::https::No-Cache=True \ && apt update \ && apt-get install -y --no-install-recommends --fix-missing \ zeek-8.0 \ - npm \ && ln -s /opt/zeek/bin/zeek /usr/local/bin/bro \ && apt clean \ - && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* \ - && curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash - \ - && export NVM_DIR="$HOME/.nvm" \ - && [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" \ - && nvm install 22 + && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* WORKDIR ${SLIPS_DIR} @@ -70,8 +62,6 @@ RUN pip3 install --no-cache-dir --upgrade pip \ && chmod 774 slips.py \ && git init \ && git remote add origin https://github.com/stratosphereips/StratosphereLinuxIPS.git \ - && cd modules/kalipso \ - && npm install \ && cd ../../p2p4slips \ && go build diff --git a/docker/dependency_image_for_CI/Dockerfile b/docker/dependency_image_for_CI/Dockerfile index dfe72fb02..10e6fe44c 100644 --- a/docker/dependency_image_for_CI/Dockerfile +++ b/docker/dependency_image_for_CI/Dockerfile @@ -7,9 +7,6 @@ ENV DEBIAN_FRONTEND=noninteractive # Blocking module requirement to avoid using ENV IS_IN_A_DOCKER_CONTAINER=True -ENV NODE_VERSION=22.5.0 -ENV NVM_DIR=/root/.nvm - # use bash instead of sh SHELL ["/bin/bash", "-c"] diff --git a/docker/light/Dockerfile b/docker/light/Dockerfile index aa0bad92f..38f72e998 100644 --- a/docker/light/Dockerfile +++ b/docker/light/Dockerfile @@ -42,7 +42,6 @@ RUN cd modules \ && rm -rf \ rnn_cc_detection/ \ timeline/ \ - kalipso/ \ p2ptrust/ \ flowmldetection/ \ cyst/ \ @@ -54,8 +53,7 @@ RUN cd modules \ virustotal/ \ && cd .. \ && rm -rf dataset/ docs/ tests/ \ - && rm kalipso.sh \ - package.json \ + && rm package.json \ pytest.ini \ webinterface.sh \ CITATION.cff \ diff --git a/docs/FAQ.md b/docs/FAQ.md index 3619ac1b6..78468c8e1 100644 --- a/docs/FAQ.md +++ b/docs/FAQ.md @@ -12,7 +12,7 @@ If the tensorflow version you're using isn't compatible with your architecture, you will get the "Illegal instruction" error and slips will terminate. To fix this you can disable the modules that use tensorflow by adding -```rnn-cc-detection, flowmldetection``` to the ```disable``` key in ```config/slips.yaml``` +```rnn-cc-detection, flow_ml_detection``` to the ```disable``` key in ```config/slips.yaml``` ## Docker time is not in sync with that of the host diff --git a/docs/P2P.md b/docs/P2P.md index 699ecdb6a..e22daf9fb 100644 --- a/docs/P2P.md +++ b/docs/P2P.md @@ -112,7 +112,7 @@ development of new trust models and modelling behavior of the P2P network. To use the experiments, clone the https://github.com/stratosphereips/p2p4slips-experiments repository into -`modules/p2ptrust/testing/experiments`. +`modules/p2p_trust/testing/experiments`. The experiments run independently (outside of Slips) and start all processes that are needed, including relevant parts of Slips. @@ -148,6 +148,8 @@ The network then replies with a score and confidence for the IP. The higher the Once we get the score of the IP, we store it in the database, and we alert if the score of this IP is more than 0 (threat level=info). +The persistent local P2P runtime directory is stored under the directory configured by ```parameters.permanent_dir``` in ```config/slips.yaml```. By default, this is ```permanent/p2p_trust_runtime/```. + ### Answering the network's request about an IP diff --git a/docs/architecture.md b/docs/architecture.md index 999c4c01d..17513bc0c 100644 --- a/docs/architecture.md +++ b/docs/architecture.md @@ -87,7 +87,7 @@ This is what slips stores for each IP/Profile it creates: ### Alerts vs Evidence -When running Slips, the alerts you see in red in the CLI or at the very bottom in kalispo, are a bunch of evidence. Evidence in slips are detections caused by a specific IP in a specific timeframe. Slips doesn't alert on every evidence/detection. it accumulates evidence and only generates and alert when the amount of gathered evidence crosses a threshold. After this threshold Slips generates an alert, marks the timewindow as malicious(displays it in red in kalipso and the web interface) and blocks the IP causing the alert if iptables is enabled. +When running Slips, the alerts you see in red in the CLI or the web interface are a bunch of evidence. Evidence in slips are detections caused by a specific IP in a specific timeframe. Slips doesn't alert on every evidence/detection. it accumulates evidence and only generates and alert when the amount of gathered evidence crosses a threshold. After this threshold Slips generates an alert, marks the timewindow as malicious in the web interface and blocks the IP causing the alert if iptables is enabled. Each alert has a threat level and confidence; the Threat level of each alert is Critical by default, and the confidence is the accumulated threat level of all the evidence of the alert normalized to a value diff --git a/docs/bruteforcing.md b/docs/brute_force_detector.md similarity index 77% rename from docs/bruteforcing.md rename to docs/brute_force_detector.md index 5bc23a0d9..1ebd0356d 100644 --- a/docs/bruteforcing.md +++ b/docs/brute_force_detector.md @@ -1,6 +1,6 @@ -# Bruteforcing Module +# Brute force detector Module -The `Bruteforcing` module detects SSH bruteforcing by combining repeated SSH sessions, Zeek SSH metadata, client software banners, and Zeek notice confirmations. +The `brute_force_detector` module detects SSH brute forcing by combining repeated SSH sessions, Zeek SSH metadata, client software banners, and Zeek notice confirmations. This module is loaded automatically by Slips like the rest of the modules in `modules/`, unless it is explicitly disabled in `config/slips.yaml`. @@ -35,7 +35,7 @@ It uses the following inputs: For each SSH flow, the module first checks the Zeek SSH authentication outcome: -- If `auth_success` is `true` or `T`, the flow is ignored for bruteforcing. +- If `auth_success` is `true` or `T`, the flow is ignored for `brute_force_detector`. - If `auth_attempts` is greater than `0`, that value is added to the bruteforce campaign counter. - If `auth_attempts` is `0` or missing, but the SSH session is not marked successful, the module counts the session as one suspected password attempt. @@ -43,7 +43,7 @@ The last rule is important for datasets where Zeek records repeated SSH handshak ### Threshold and Reporting -The default SSH bruteforcing threshold is `9` attempts. +The default SSH brute force detector threshold is `9` attempts. After the threshold is reached, the module does not alert on every new attempt. Instead, it uses sparse bucketed reporting so alerts become less frequent over time but never completely stop. With the default threshold, the alert points are: @@ -61,7 +61,7 @@ The evidence threat level is `medium`. Confidence grows with the number of attempted passwords: -- first bruteforcing evidence starts at the configured threshold +- first brute force detector evidence starts at the configured threshold - full confidence is reached at `30` attempts - suspicious SSH client banners add a small confidence bonus - a Zeek `SSH::Password_Guessing` notice acts as confirmation and promotes confidence using Zeek's confirmed connection count @@ -81,7 +81,7 @@ The module emits `PASSWORD_GUESSING` evidence with: Example description: ```text -SSH bruteforcing from 147.32.80.40 to 147.32.80.37 on SSH 902/tcp. Attempts observed: 24. Client banner: libssh libssh2_1.11.0 from software.log. Confidence: 0.89. by Slips +SSH brute force detector from 147.32.80.40 to 147.32.80.37 on SSH 902/tcp. Attempts observed: 24. Client banner: libssh libssh2_1.11.0 from software.log. Confidence: 0.89. by Slips ``` ## Zeek Confirmation @@ -89,17 +89,17 @@ SSH bruteforcing from 147.32.80.40 to 147.32.80.37 on SSH 902/tcp. Attempts obse If Zeek raises `SSH::Password_Guessing` in `notice.log`, the module: - emits an evidence immediately based on the notice -- stores the notice as confirmation for later bruteforcing evidence +- stores the notice as confirmation for later `brute_force_detector` evidence - uses the confirmed connection count from the Zeek notice to increase confidence -If Zeek does not generate `notice.log` for SSH password guessing, the module still detects bruteforcing from `ssh.log` and `software.log`. +If Zeek does not generate `notice.log` for SSH password guessing, the module still detects `brute_force_detector` events from `ssh.log` and `software.log`. ## Configuration The module currently exposes: ```yaml -bruteforcing: +brute_force_detector: ssh_attempt_threshold: 9 ``` @@ -107,9 +107,9 @@ This value is read from `config/slips.yaml`. ## Relationship With Flow Alerts -SSH bruteforcing is now handled by the `Bruteforcing` module. +SSH brute force detector is now handled by the `brute_force_detector` module. -The `Flow Alerts` module still handles: +The `flow_alerts` module still handles: - successful SSH detections - Zeek port-scan notices diff --git a/docs/contributing.md b/docs/contributing.md index 320e775ca..93086233e 100644 --- a/docs/contributing.md +++ b/docs/contributing.md @@ -97,7 +97,7 @@ That's it, now you have a ready-to-merge PR! * Profiler process gives each flow to the appropriate module to deal with it. for example flows from http.log will be sent to http_analyzer.py to analyze them. -* Profiler process stores the flows, profiles, etc. in slips databases for later processing. the info stored in the dbs will be used by all modules later. Slips has 2 databases, Redis and SQLite. it uses the sqlite db to store all the flows read and labeled. and uses redis for all other operations. the sqlite db is created in the output directory, meanwhite the redis database is in-memory. 7-8. using the flows stored in the db in step 6 and with the help of the timeline module, slips puts the given flows in a human-readable form which is then used by the web UI and kalipso UI. +* Profiler process stores the flows, profiles, etc. in slips databases for later processing. the info stored in the dbs will be used by all modules later. Slips has 2 databases, Redis and SQLite. it uses the sqlite db to store all the flows read and labeled. and uses redis for all other operations. the sqlite db is created in the output directory, meanwhite the redis database is in-memory. 7-8. using the flows stored in the db in step 6 and with the help of the timeline module, slips puts the given flows in a human-readable form which is then used by the web UI. * when a module finds a detection, it sends the detection to the evidence process to deal with it (step 10) but first, this evidence is checked by the whitelist to see if it’s whitelisted in our config/whitelist.conf or not. if the evidence is whitelisted, it will be discarded and won’t go through the next steps @@ -141,6 +141,9 @@ The goal of suppressing errors by default is the most errors should be handled b ### How are the modules loaded? - All modules in the modules/ directory that implement the IModule interface are automatically imported by slips, for more technical details check the load_modules() function in managers/process_manager.py +- Module names must use snake_case and follow the `x_y_doer` style used by names such as `http_analyzer`. +- Set the module class `name` to the same snake_case identifier as the module directory and main file. +- Keep the module directory name, the main module file, the config section name, and any module references in docs aligned with that same snake_case name. ### There's some missing code in all modules, what's happening? @@ -187,8 +190,8 @@ Using one of these 3 ways Variables used in the trust evaluation and its accompanied processes, such as database-backup in persistent SQLite storage and memory persistent Redis database of Slips, are strings, integers and floats grouped into custom dataclasses. Aforementioned data classes can -be found in modules/fidesModule/model. The reader may find that all of the floating variables are in the interval <-1; 1> -and some of them are between <0; 1>, please refer to the modules/fidesModule/model directory. +be found in modules/fides/model. The reader may find that all of the floating variables are in the interval <-1; 1> +and some of them are between <0; 1>, please refer to the modules/fides/model directory. The Fides Module is designed to cooperate with a global-peer-to-peer module. The communication is done using Slips' Redis channel, for more information please refer to communication and messages sections above. @@ -248,8 +251,8 @@ redis_client.publish(channel, message) print(f"Message published to channel '{channel}'.") ``` -For more information about message handling, please also refer to modules/fidesModule/messaging/message_handler.py -and to modules/fidesModule/messaging/dacite/core.py for message parsing. +For more information about message handling, please also refer to modules/fides/messaging/message_handler.py +and to modules/fides/messaging/dacite/core.py for message parsing. ### **Communication** @@ -257,7 +260,7 @@ The module uses Slips' Redis to receive and send messages related to trust intel evaluation of trust in peers and alert message dispatch. **Used Channels** -modules/fidesModule/messaging/message_handler.py +modules/fides/messaging/message_handler.py | **Slips Channel Name** | **Purpose** | |-----------------|-------------------------------------------------------------------------| | `slips2fides` | Provides communication channel from Slips to Fides | @@ -282,4 +285,4 @@ For more details, the code [here](https://github.com/stratosphereips/fides/tree/ | `tl2nl_peers_reliability` | `fides2network` | NetworkBridge.send_peers_reliability(...) | Sends peer reliability, this message is only for network layer and is not dispatched to the network. | -Implementations of Fides_Module-network-communication can be found in ```modules/fidesModule/messaging/network_bridge.py```. +Implementations of Fides_Module-network-communication can be found in ```modules/fides/messaging/network_bridge.py```. diff --git a/docs/create_new_module.md b/docs/create_new_module.md index 62b1fc282..b8bbda9e4 100644 --- a/docs/create_new_module.md +++ b/docs/create_new_module.md @@ -61,6 +61,7 @@ cp -a modules/template modules/local_connection_detector ### Changing the Name of the Module Each module in Slips should have a name, author and description. +Use a snake_case module package and main file name in the `x_y_doer` style already used in the repository, for example `http_analyzer` or `local_connection_detector`. We should change the name inside the python file by finding the lines with the name and description in the class 'Module' and changing them: diff --git a/docs/exporting.md b/docs/exporting.md index 323721895..a0b3ac1ea 100644 --- a/docs/exporting.md +++ b/docs/exporting.md @@ -1,6 +1,6 @@ # Exporting Slips Alerts -Slips supports exporting alerts to other systems using different modules (ExportingAlerts, CESNET sharing etc.) +Slips supports exporting alerts to other systems using different modules (`exporting_alerts`, `cesnet`, etc.) For now the supported systems are: diff --git a/docs/fides_module.md b/docs/fides.md similarity index 87% rename from docs/fides_module.md rename to docs/fides.md index a8c92b4ed..b752165b3 100644 --- a/docs/fides_module.md +++ b/docs/fides.md @@ -25,7 +25,11 @@ To be able to use the fides module, you should use ```--cap-add=NET_ADMIN``` If you plan on using the Fides Module, please be aware that it is used only if Slips is running on an interface OR on a growing Zeek directory. The `--use_fides=True` is ignored when Slips is run on a file. ## Configuration -The evaluation model used, the evaluation thresholds, and other configurations are located in ```fides.conf.yml``` file +The evaluation model used, the evaluation thresholds, and other configurations are located in ```modules/fides/config/fides.conf.yml```. + +If you need a Slips run to use a different Fides configuration file, set +```global_p2p.fides_conf``` in Slips config to the relative path +of that alternate YAML file. **Possible threat intelligence evaluation models** @@ -43,6 +47,8 @@ To enable it, change ```use_fides=False``` to ```use_fides=True``` in ```config/ And start Slips on your interface. +The Fides shared SQLite cache is stored under the directory configured by ```parameters.permanent_dir```. By default, it is created in ```permanent/databases/```, so it persists across different Slips runs. + ## How it works: Slips interacts with other slips peers for the following purposes: @@ -62,7 +68,7 @@ If a peer generates an alert based on evidence of an attack, it can alert other ## Logs Slips contains a minimal log file for reports received by other peers and peer updates in the ```output``` directory if not manually specified using the appropriate slips parameter upon start. -The custom logger ```modules/fidesModule/utils/logger.py``` code is used by the Fides Module for internal logging. +The custom logger ```modules/fides/utils/logger.py``` code is used by the Fides Module for internal logging. ## Implementation notes and credit The mathematical models for the trust evaluation were written by Lukáš Forst as part of his [Master Thesis](https://dspace.cvut.cz/handle/10467/101312). diff --git a/docs/flowalerts.md b/docs/flow_alerts.md similarity index 98% rename from docs/flowalerts.md rename to docs/flow_alerts.md index bf6ea5806..0b56591bd 100644 --- a/docs/flowalerts.md +++ b/docs/flow_alerts.md @@ -1,4 +1,4 @@ -# Flow Alerts Module +# `flow_alerts` Module The module of flow alerts has several behavioral techniques to detect attacks by analyzing the content of each flow alone. @@ -195,13 +195,13 @@ section for more info Slips alerts when 3+ invalid SMTP login attempts occurs within 10s -## SSH Bruteforcing +## SSH brute_force_detector -SSH bruteforcing is documented in the dedicated `Bruteforcing` module page: +SSH brute force detector is documented in the dedicated `brute_force_detector` module page: -- [Bruteforcing Module](bruteforcing.md) +- [brute_force_detector Module](brute_force_detector.md) -The `Flow Alerts` module still detects successful SSH sessions, but SSH password guessing is no longer owned by `Flow Alerts`. +The `flow_alerts` module still detects successful SSH sessions, but SSH password guessing is no longer owned by `flow_alerts`. ## DGA diff --git a/docs/immune/DATASET_RISK_REPORT.md b/docs/immune/DATASET_RISK_REPORT.md index 2a615018d..c0b47d059 100644 --- a/docs/immune/DATASET_RISK_REPORT.md +++ b/docs/immune/DATASET_RISK_REPORT.md @@ -22,7 +22,7 @@ The workflow used by this task focuses on structured security analysis rather th Same hardware constraints as [summarization workflow](DATASET_REPORT.md#2-limitations) (Raspberry Pi 5, 1.5B-3B parameter models) are considered. -The current version of the dataset for finetuning LLM for cause and risk analysis can be found [here](https://github.com/stratosphereips/Slips-tools/raw/refs/heads/main/alert_summary/datasets/risk_dataset.json.gz) +The current version of the dataset for finetuning LLM for cause and risk analysis can be found [here](https://github.com/stratosphereips/Slips-tools/raw/refs/heads/harpo_datasets/alert_summary/datasets/risk_dataset_v2.json.gz) ## 2. Relationship to Summarization Workflow diff --git a/docs/immune/Immune.md b/docs/immune/Immune.md index 621b5f6f4..ff00f4f6e 100644 --- a/docs/immune/Immune.md +++ b/docs/immune/Immune.md @@ -17,6 +17,10 @@ This is the main guide to the documentation related to the changes done to Slips - [LLM RPI Performance](https://stratospherelinuxips.readthedocs.io/en/develop/immune/research_rpi_llm_performance.html) - [Stress Testing](https://stratospherelinuxips.readthedocs.io/en/develop/immune/stress_testing.html) +### Updating Slips +- [Updating Slips](https://stratospherelinuxips.readthedocs.io/en/develop/immune/auto_update.html) + + ### Security & Network Configuration - [ARP Poisoning](https://stratospherelinuxips.readthedocs.io/en/develop/immune/arp_poisoning.html) @@ -39,8 +43,20 @@ This is the main guide to the documentation related to the changes done to Slips **Datasets Evaluation (LLM-as-a-judge):** - [LLM Evaluation Guide](https://stratospherelinuxips.readthedocs.io/en/develop/immune/LLM_EVALUATION_GUIDE.html) - How to evaluate and compare LLM models -- [Summarization Evaluation Results](https://harpomaxx.github.io/gh-web-host/slips-immune-llm-results/summary_dashboard.html) - Performance metrics for summarization models. -- [Risk Analysis Evaluation Results](https://harpomaxx.github.io/gh-web-host/slips-immune-llm-results/risk_dashboard.html) - Performance metrics for risk assessment models +- [LLM-as-Judge Rubric](https://stratospherelinuxips.readthedocs.io/en/develop/immune/LLM_JUDGE_RUBRIC.html) - Scoring criteria for cause analysis and risk assessment evaluation (two-stage rubric, max 60 pts) +- [Summarization Dataset Evaluation Results](https://harpomaxx.github.io/gh-web-host/slips-immune-llm-results/summary_dashboard.html) - Performance metrics for summarization models. +- [Risk Analysis Dataset Evaluation Results](https://harpomaxx.github.io/gh-web-host/slips-immune-llm-results/risk_dashboard.html) - Performance metrics for risk assessment models **LLM finetuning** -- [LLM RPI Finetuning Frameworks](https://stratospherelinuxips.readthedocs.io/en/develop/immune/finetuning_frameworks_rpi_5.html) +- [LLM RPI Finetuning Frameworks](https://stratospherelinuxips.readthedocs.io/en/develop/immune/finetuning_frameworks_rpi_5.html) - Framework selection rationale (Unsloth vs alternatives) +- [Fine-Tuning Approach](https://stratospherelinuxips.readthedocs.io/en/develop/immune/finetuning_procedure.html) - General pipeline: LoRA, GGUF export, hardware setup +- [Fine-Tuning Evaluation Methodology](https://stratospherelinuxips.readthedocs.io/en/develop/immune/finetuning_evaluation.html) - LLM-as-judge pipeline, metrics, and breakdown dimensions +- [Quantization and Deployment](https://stratospherelinuxips.readthedocs.io/en/develop/immune/finetuning_quantization.html) - GGUF conversion, Ollama publication, and quantization performance analysis + + *Incident Summarization task:* + - [Summarization Training Procedure](https://stratospherelinuxips.readthedocs.io/en/develop/immune/finetuning_summarization_procedure.html) - Dataset filtering, ground truth selection, system prompt + - [Summarization Fine-Tuned Model: Evaluation Results](https://stratospherelinuxips.readthedocs.io/en/develop/immune/finetuning_results.html) - Benchmark results for the finetuned Qwen2.5-1.5B + + *Risk Assessment & Cause Analysis task:* + - [Risk Assessment Training Procedure](https://stratospherelinuxips.readthedocs.io/en/develop/immune/finetuning_risk_procedure.html) - Dataset filtering, best-of-N selection, combined adapter training + - [Risk Fine-Tuned Model: Evaluation Results](https://stratospherelinuxips.readthedocs.io/en/develop/immune/finetuning_risk_results.html) - Benchmark results for the finetuned Qwen2.5-1.5B risk model diff --git a/docs/immune/LLM_JUDGE_RUBRIC.md b/docs/immune/LLM_JUDGE_RUBRIC.md new file mode 100644 index 000000000..163a505ec --- /dev/null +++ b/docs/immune/LLM_JUDGE_RUBRIC.md @@ -0,0 +1,103 @@ +# LLM-as-Judge Rubric for Slips IDS Risk Evaluation + +## Overview + +The evaluation system uses an LLM judge to assess AI-generated analyses of network security incidents from Slips IDS. Each incident is evaluated **twice** — once for cause analysis and once for risk assessment — using separate rubrics. Model outputs are presented to the judge in **randomized order** (labeled A, B, C…) to prevent position bias, with model identities revealed only after scoring. + +The final ranking per incident is derived from the **sum of cause + risk total scores** (max 60 points combined). + +This rubric applies to the risk assessment pipeline. The summarization pipeline uses a single 1–10 quality score evaluated holistically. + +--- + +## Cause Analysis Rubric + +Evaluates how well the model explains *why* the incident occurred. + +Each dimension is scored **1–10**. Maximum total: **30 points**. + +### Evidence Grounding (1–10) +Does the analysis cite specific events from the DAG (IPs, ports, counts, timestamps)? + +| Score | Meaning | +|-------|---------| +| 1–3 | Pure generalities, no specific data referenced | +| 4–6 | Some specifics but incomplete or cherry-picked | +| 7–9 | Systematically references key evidence (scan targets, blacklisted IPs, event counts) | +| 10 | Covers all significant evidence with precise detail | + +### Cause Specificity (1–10) +Does the analysis name the specific attack behavior or stay vague? + +| Score | Meaning | +|-------|---------| +| 1–3 | "Possible malicious activity" — could apply to any incident | +| 4–6 | Names the attack class but not the specific behavior | +| 7–9 | Identifies specific TTP (e.g. horizontal scan pattern, C2 callback behavior) | +| 10 | Precise TTP with supporting evidence chain | + +### Alternative Hypotheses (1–10) +Does the analysis meaningfully consider legitimate or misconfiguration causes? + +| Score | Meaning | +|-------|---------| +| 1–3 | Ignores or dismisses alternatives without reasoning | +| 4–6 | Mentions alternatives but without supporting logic | +| 7–9 | Evaluates alternatives against the evidence | +| 10 | Well-reasoned evaluation of all plausible hypotheses | + +--- + +## Risk Assessment Rubric + +Evaluates how well the model characterizes *how dangerous* the incident is and what to do about it. + +Each dimension is scored **1–10**. Maximum total: **30 points**. + +### Risk Calibration (1–10) +Is the risk level proportionate to the actual evidence weight? + +| Score | Meaning | +|-------|---------| +| 1–3 | Flat assessment ignoring evidence distribution (e.g. always "High") | +| 4–6 | Correct level but reasoning not tied to evidence | +| 7–9 | Risk level explicitly derived from evidence severity and volume | +| 10 | Nuanced calibration distinguishing between event types and their relative weight | + +### Actionability (1–10) +Are recommended actions concrete and scoped to this incident? + +| Score | Meaning | +|-------|---------| +| 1–3 | Generic boilerplate ("investigate the IP", "update firewall rules") | +| 4–6 | Incident-specific but vague or unprioritized | +| 7–9 | Concrete actions with priority order tied to specific findings | +| 10 | Scoped response plan with clear sequencing and ownership | + +### Business Impact Relevance (1–10) +Is the impact assessment realistic and specific? + +| Score | Meaning | +|-------|---------| +| 1–3 | Generic ("data breach risk") — could apply to any incident | +| 4–6 | Relevant but not tied to the specific evidence | +| 7–9 | Impact explicitly derived from the observed behavior | +| 10 | Precise impact with scope and affected assets identified | + +--- + +## Scoring & Ranking + +- Each model receives a **cause total** (max 30) and a **risk total** (max 30) +- The **combined score** (cause + risk, max 60) determines the final per-incident ranking +- Rankings are 1 (best) through N (worst) across all evaluated models +- **Win rate** = fraction of incidents where a model ranks 1st + +--- + +## Anti-bias Measures + +- Model outputs are presented to the judge in **random order** per incident, relabeled A/B/C/D +- The same randomized order is used for both the cause and risk judge calls within an incident +- The judge is instructed to respond with structured JSON only, preventing narrative drift +- Temperature is set to **0.3** for consistency across calls diff --git a/docs/immune/finetuning_evaluation.md b/docs/immune/finetuning_evaluation.md new file mode 100644 index 000000000..5313026c1 --- /dev/null +++ b/docs/immune/finetuning_evaluation.md @@ -0,0 +1,129 @@ +### Fine-Tuning Evaluation Methodology + +**Summary:** Fine-tuned models are evaluated using the same LLM-as-judge framework used for baseline comparison, extended to include the finetuned model as a fifth competitor. The methodology — blind comparative ranking, three metrics, two breakdown dimensions — is identical across tasks. + +--- + +### Index +- [Overview](#overview) +- [Evaluation Pipeline](#evaluation-pipeline) +- [Baselines and Success Criteria](#baselines-and-success-criteria) +- [Metrics](#metrics) +- [Breakdown Dimensions](#breakdown-dimensions) +- [Running the Evaluation](#running-the-evaluation) +- [Task-Specific Results](#task-specific-results) + +--- + +### Overview +After fine-tuning, the model is evaluated against a fixed set of competitors using LLM-as-judge methodology. A strong external judge model (default: `gpt-oss-120b`) acts as an experienced security analyst and scores all model outputs for each incident. Model labels are randomized per incident to prevent position bias. + +This extends the [LLM Evaluation Guide](LLM_EVALUATION_GUIDE.md) used for baseline model comparison — the judge criteria, scoring format, and analysis scripts are identical; the only change is adding the finetuned model as a fifth competitor. + +Scoring differs by task: +- **Summarization:** single 1–10 quality score per incident +- **Risk assessment:** separate cause analysis score (max 30) and risk assessment score (max 30), summed for ranking (max 60). See [LLM-as-Judge Rubric](LLM_JUDGE_RUBRIC.md) for the full scoring criteria. + +--- + +### Evaluation Pipeline +Four sequential steps, applied identically for any task: + +**Step 1 — Inference on the eval split** + +The fine-tuned model is served locally via [`serve_model.py`](https://github.com/stratosphereips/Slips-tools/blob/main/unsloth-scripts/serve_model.py) (OpenAI-compatible API on `localhost:8000`) and queried on each incident in the held-out eval split, using the same system prompt and input format as training. + +```bash +cd unsloth-scripts/ +python3 serve_model.py /path/to/finetuned_model --device cuda --quant 4bit +python3 run_finetuned_inference.py \ + --input filtered_eval.json \ + --output finetuned_eval_results.json \ + --url http://localhost:8000/v1 +``` + +**Step 2 — LLM-as-judge scoring** + +The judge receives all five model responses simultaneously and ranks them. The task-specific judge script is used (e.g. `evaluate_summaries.py` for summarization, `evaluate_risk.py` for cause & risk assessment). + +```bash +cd alert_summary/ +python3 evaluate_summaries.py \ + --input ../unsloth-scripts/finetuned_eval_results.json \ + --output results/finetuned_results.json \ + --judge gpt-oss-120b \ + --base-url http://YOUR_LOCAL_ENDPOINT/v1 +``` + +**Step 3 — Statistical analysis** + +```bash +python3 analyze_results.py \ + --results results/finetuned_results.json \ + --summary results/finetuned_report.md \ + --csv results/finetuned_data.csv +``` + +**Step 4 — Improvement report** + +Reads the report and CSV, computes deltas vs. both baselines, identifies the weakest complexity tier and category, and outputs concrete suggestions for data composition and training config. + +--- + +### Baselines and Success Criteria + +Two baselines are tracked for any finetuned model: + +| Baseline | Role | Success criterion | +|---|---|---| +| Qwen2.5 1B (untuned) | Lower bound — same family, smaller | Finetuned must beat this | +| Qwen2.5 3B (untuned) | Stretch goal — larger, slower on RPi | Finetuned should match or exceed | + +The stretch goal tests whether task-specific fine-tuning compensates for parameter count, which determines whether the smaller model can replace the larger one on the Raspberry Pi 5. + +--- + +### Metrics +Three metrics are computed per model: + +| Metric | Description | +|---|---| +| **Avg Score** | Mean quality score from the judge (1–10 scale) | +| **Win Rate** | Fraction of incidents where the model ranks 1st | +| **Avg Position** | Mean rank position (lower = better, 1–5 scale) | + +--- + +### Breakdown Dimensions +Results are broken down along two dimensions for every task: + +**By incident category:** +- Malware incidents +- Normal traffic incidents + +**By incident complexity** (based on event count): +- Simple: < 500 events +- Medium: 500–1999 events +- Complex: ≥ 2000 events + +The complexity dimension is particularly relevant for RPi deployment: complex incidents stress the input token budget and expose truncation behavior. A model that performs well on simple/medium but fails on complex incidents has a known, addressable limitation. + +--- + +### Running the Evaluation +The full pipeline (dataset prep → training → inference → eval → report) can be run end-to-end: + +```bash +/finetune-eval + +# Or jump to evaluation if the model is already trained: +/finetune-eval --skip-to 5 +``` + +--- + +### Task-Specific Results +| Task | Results Document | +|---|---| +| Incident Summarization | [Summarization Fine-Tuned Model: Evaluation Results](finetuning_results.md) | +| Risk Assessment & Cause Analysis | [Risk Fine-Tuned Model: Evaluation Results](finetuning_risk_results.md) | diff --git a/docs/immune/finetuning_frameworks_rpi_5.md b/docs/immune/finetuning_frameworks_rpi_5.md index 11ee1682c..e8a722655 100644 --- a/docs/immune/finetuning_frameworks_rpi_5.md +++ b/docs/immune/finetuning_frameworks_rpi_5.md @@ -1,8 +1,7 @@ ### Fine-Tuning Frameworks for GGUF Deployment on Raspberry Pi 5 -**Keywords:** Local Inference, GGUF Format, Raspberry Pi 5 -**TL;DR:** Among the evaluated frameworks, Unsloth stands out as the best fit due to its integrated GGUF export capabilities, minimal workflow complexity, and hardware-optimized quantization support, aligning perfectly with the IMMUNE project's goals and the Raspberry Pi 5’s limitations. +**Summary:** Among the evaluated frameworks, Unsloth stands out as the best fit due to its integrated GGUF export capabilities, minimal workflow complexity, and hardware-optimized quantization support, aligning perfectly with the IMMUNE project's goals and the Raspberry Pi 5’s limitations. ### Index diff --git a/docs/immune/finetuning_procedure.md b/docs/immune/finetuning_procedure.md new file mode 100644 index 000000000..cfcb49867 --- /dev/null +++ b/docs/immune/finetuning_procedure.md @@ -0,0 +1,78 @@ +### Fine-Tuning Approach for Slips Immune + +**Summary:** Task-specific fine-tuning of compact models (1.5B parameters) using LoRA + Unsloth, exported to GGUF for CPU inference on the Raspberry Pi 5. The same training pipeline applies across tasks; only the dataset and system prompt are task-specific. + +--- + +### Index +- [Motivation](#motivation) +- [General Pipeline](#general-pipeline) +- [Framework and Hardware](#framework-and-hardware) +- [Output Format](#output-format) +- [Task-Specific Procedures](#task-specific-procedures) + +--- + +### Motivation +The Raspberry Pi 5 can run small quantized models (1.5B–3B parameters) via Ollama/llama.cpp, but untuned models at this scale perform poorly on domain-specific tasks like security incident summarization or decision making. Fine-tuning on task-specific data allows a 1.5B model to match or exceed the quality of a larger untuned 3B model — a meaningful gain on constrained hardware. + +Fine-tuning is performed off-device on GPU hardware, and the resulting model is exported to GGUF for direct deployment on the RPi5. + +--- + +### General Pipeline +Every fine-tuning run follows the same four-stage pipeline regardless of task: + +``` +Raw dataset + │ + ▼ +1. Quality filtering filter low-quality examples, produce 90/10 train/eval split + │ + ▼ +2. Ground truth selection pick best response per incident, format as SFT conversations + │ + ▼ +3. SFT training LoRA fine-tuning via Unsloth, config driven by config.yaml + │ + ▼ +4. Export merge adapters → 16-bit weights + GGUF (q4_k_m) for RPi +``` + +What varies per task: the dataset source, the filtering criteria, and the system prompt used to format conversations. + +--- + +### Framework and Hardware +Fine-tuning uses [Unsloth](https://github.com/unslothai/unsloth) for its integrated GGUF export, memory-efficient LoRA training, and direct Hugging Face model compatibility. See [Fine-Tuning Frameworks](finetuning_frameworks_rpi_5.md) for the full framework comparison rationale. + +**Fixed training setup across tasks:** + +| Parameter | Value | +|---|---| +| Base model family | Qwen2.5-Instruct (1.5B) | +| Training mode | SFT (Supervised Fine-Tuning) | +| Adapter method | LoRA (rank 16, alpha 16) | +| LoRA targets | q/k/v/o projections, MLP gate/up/down | +| Optimizer | AdamW 8-bit | +| Precision | FP16 | +| Hardware | NVIDIA TITAN V, 12 GB VRAM | + +Task-specific parameters (learning rate, epochs, sequence length, batch size) are configured in [`config.yaml`](https://github.com/stratosphereips/Slips-tools/blob/main/unsloth-scripts/config.yaml). + +--- + +### Output Format +After training, the pipeline produces: +- **Merged 16-bit weights** — for GPU inference and evaluation +- **GGUF (q4_k_m)** — for direct deployment on Raspberry Pi 5 via Ollama or llama.cpp + +The core training script is [`train_qwen.py`](https://github.com/stratosphereips/Slips-tools/blob/main/unsloth-scripts/train_qwen.py). Both outputs are generated automatically based on `config.yaml` settings. + +--- + +### Task-Specific Procedures +| Task | Dataset | Procedure | Model | +|---|---|---|---| +| Incident Summarization | [summarization_dataset_v3](https://github.com/stratosphereips/Slips-tools/raw/refs/heads/main/alert_summary/datasets/summarization_dataset_v3.json.gz) | [Summarization Procedure](finetuning_summarization_procedure.md) | [stratosphere/qwen2.5-1.5b-slips-immune](https://huggingface.co/stratosphere/qwen2.5-1.5b-slips-immune) | +| Decision Making | *(planned)* | *(planned)* | *(planned)* | diff --git a/docs/immune/finetuning_quantization.md b/docs/immune/finetuning_quantization.md new file mode 100644 index 000000000..83a691e7a --- /dev/null +++ b/docs/immune/finetuning_quantization.md @@ -0,0 +1,175 @@ +### Quantization and Deployment for Finetuned Models + +**Summary:** Finetuned models are converted to GGUF and published to Ollama in three quantization variants (q4_k_m, q5_k_m, q8_0). Quality degrades with quantization: ~2% loss at q8_0, ~12% at q5_k_m, ~9% at q4_k_m. q8_0 is the best quantized variant; q5_k_m offers the best quality/size trade-off for CPU/RPi deployment; 16-bit is recommended when a GPU is available. + +> **Evaluation basis:** performance numbers in this document were measured on the [finetuned summarization model](finetuning_results.md) (47 held-out incidents, judge: gpt-oss-120b). The conversion and publication methodology applies to any finetuned model in this pipeline. + +--- + +### Index +- [GGUF Conversion](#gguf-conversion) +- [Ollama Publication](#ollama-publication) +- [Performance by Quantization](#performance-by-quantization) +- [Deployment Recommendation](#deployment-recommendation) + +--- + +### GGUF Conversion +Script: [`convert_to_gguf.py`](https://github.com/stratosphereips/Slips-tools/blob/main/unsloth-scripts/convert_to_gguf.py) + +GGUF (GPT-Unified Format) is the binary format used by llama.cpp and Ollama to store quantized model weights for efficient CPU and GPU inference. The conversion script takes the merged 16-bit PyTorch model produced by training and converts it to a self-contained GGUF file at a target quantization level. + +#### Standard path + +Used for q8_0 and f16 (already near-lossless or lossless — no benefit from importance weighting): + +1. **Load at full precision** — the model is loaded via `FastLanguageModel.from_pretrained()` with `load_in_4bit=False`, ensuring no precision is lost before conversion +2. **Convert and quantize** — `model.save_pretrained_gguf()` is called with the target quantization method; Unsloth delegates to its bundled llama.cpp binaries to perform tensor-level quantization and write the GGUF file +3. **Relocate output** — Unsloth always writes to `_gguf/`; the script optionally moves the result to a user-specified `--output` directory + +#### Imatrix-guided path + +Standard quantization maps all weights to lower precision uniformly, which can degrade quality on the layers that matter most. The imatrix (importance matrix) path addresses this by using calibration data to identify which weights have the highest activation impact, then allocating more precision to those weights during quantization. + +Used when a `calibration.txt` is present and the target quant is one of `q2_k, q3_k_m, q4_0, q4_k_m, q5_0, q5_k_m`: + +1. **Produce an intermediate F16 GGUF** — a lossless 16-bit GGUF is generated first as the input for imatrix computation +2. **Compute activation statistics** — `llama-imatrix` runs inference on the calibration text using the F16 GGUF, recording how much each weight matrix contributes to the model's outputs across the calibration corpus; the result is a `.imatrix.dat` file +3. **Re-quantize with importance guidance** — `llama-quantize --imatrix` performs non-uniform quantization: weights more important to the model's predictions are preserved at higher precision, while less critical weights are compressed more aggressively +4. **Cleanup** — the intermediate F16 GGUF and `.imatrix.dat` files are deleted; only the final quantized GGUF is kept + +The number of calibration chunks (default: 128) controls how much calibration text is processed — more chunks produce more accurate importance estimates at the cost of longer computation. + +#### Modelfile generation + +After the GGUF is produced, the script auto-detects the chat template by inspecting `tokenizer_config.json`: +- `<|im_start|>` → **ChatML** format (Qwen2.5) +- `<|start_header_id|>` → **Llama-3** format +- Falls back to ChatML if detection is inconclusive + +An Ollama-compatible `Modelfile` is written alongside the GGUF, embedding the correct template with `{{ .System }}`, `{{ .Prompt }}`, and `{{ .Response }}` variables, plus appropriate stop tokens (`<|im_end|>` and `<|endoftext|>` for ChatML). If an `OLLAMA_README.md` exists next to the script, it is copied into the output directory as `README.md` to populate the model card on Ollama.com. + +```bash +cd unsloth-scripts/ +python3 convert_to_gguf.py \ + --model /path/to/qwen_finetuned_merged_16bit \ + --quant q5_k_m \ + --output ./gguf_q5_k_m/ +``` + +--- + +### Ollama Publication +Script: [`publish_to_ollama.sh`](https://github.com/stratosphereips/Slips-tools/blob/main/unsloth-scripts/publish_to_ollama.sh) + +Automates the complete pipeline from raw 16-bit weights to a publicly accessible model on Ollama. For each quantization variant (default: q4_k_m, q5_k_m, q8_0), the following steps run sequentially: + +**Step 1 — Convert to GGUF** +Calls `convert_to_gguf.py` with the model path and target quant, writing the GGUF file, Modelfile, and README to `./gguf_/`. + +**Step 2 — Register locally with Ollama** +Runs `ollama create : -f Modelfile` from within the output directory. This registers the model in the local Ollama registry, making it immediately usable via `ollama run` without a network round-trip. + +**Step 3 — Tag `:latest`** +After all quants are built, the first quant in the list (q4_k_m) is copied to the `:latest` tag. This ensures a bare `ollama pull` without an explicit tag fetches the most portable variant. + +**Step 4 — Push to Ollama.com** +Each tag is pushed with `ollama push`. Requires prior `ollama login` with the `stratosphere` organization credentials. + +```bash +# Publish all quants +./publish_to_ollama.sh + +# Publish a single quant +./publish_to_ollama.sh --quant q5_k_m +``` + +| Tag | Quantization | Notes | +|---|---|---| +| `:q4_k_m` | 4-bit K-means | Most portable, smallest size | +| `:q5_k_m` | 5-bit K-means | Recommended for CPU/low-VRAM | +| `:q8_0` | 8-bit integer | Best quality among quantized variants | +| `:latest` | = q4_k_m | Default tag for bare pulls | + +Published model: [stratosphere/qwen2.5-1.5b-slips-immune-summarization](https://ollama.com/stratosphere/qwen2.5-1.5b-slips-immune-summarization) + +--- + +### Performance by Quantization +The 16-bit model serves as the reference; all GGUF variants are compared against it. + +#### Overall + +| Quantization | Avg Score | Win Rate | Score Loss | Size | +|---|---|---|---|---| +| **16bit (reference)** | **4.70** | **19.1%** | — | ~3.0 GB | +| q8_0 | 4.59 | 17.4% | −0.11 (−2%) | ~1.6 GB | +| q4_k_m | 4.28 | 14.9% | −0.42 (−9%) | ~0.9 GB | +| q5_k_m | 4.14 | 8.5% | −0.56 (−12%) | ~1.1 GB | + +#### By Complexity + +| Tier | 16bit | q8_0 | q5_k_m | q4_k_m | +|---|---|---|---|---| +| Simple (<500 events) | 5.45 | 5.24 | 4.67 | 4.93 | +| Medium (500–1999 events) | 4.00 | 4.25 | 3.00 | 3.60 | +| Complex (≥2000 events) | 3.11 | 3.00 | 3.12 | 3.22 | +| Normal traffic | 2.00 | 3.00 | 2.00 | 2.00 | + +**Key observations:** + +- q8_0 quality loss is negligible (−0.11) — the best quantized variant by a clear margin +- q5_k_m and q4_k_m both show meaningful score drops; q4_k_m surprisingly recovers slightly vs q5_k_m on simple incidents +- All variants struggle on Normal incidents — this is a training data imbalance issue, not a quantization artifact +- Complex incident scores are consistent across all quants (~3.0–3.2), tied to input truncation at 4096 tokens rather than quantization effects + + +--- + +### Deployment Recommendation +| Scenario | Recommended variant | Rationale | +|---|---|---| +| Raspberry Pi 5 (CPU-only) | **q5_k_m** | Best quality/size balance at 1.1 GB; fits RPi RAM with headroom | +| Low-VRAM GPU (≤4 GB) | **q8_0** | Only 2% score loss at half the size of 16-bit | +| GPU with ≥6 GB VRAM | **16-bit** | Reference quality: 4.70 avg score, 19.1% win rate | +| Edge / minimal storage | **q4_k_m** | Smallest footprint (0.9 GB); 9% score loss acceptable for triage-only use | + +--- + +## Risk Assessment Model Quantization + +> **Evaluation basis:** performance numbers below were measured on the [finetuned risk model](finetuning_risk_results.md) (67 held-out incidents, judge: qwen3.5, date: 2026-04-24). Scores are cause score (max 30) and risk score (max 30); win rate is fraction of incidents ranked 1st among 5 models. + +### Overall Performance + +| Variant | Avg Position | Cause Score | Risk Score | Win Rate | +|---------|-------------|-------------|------------|----------| +| **fp16 (reference)** | **1.99** | **20.21** | 13.33 | **35.8%** | +| q8_0 | 2.25 | 17.66 | **14.15** | 34.3% | +| q4_k_m | 2.34 | 18.03 | 14.46 | 26.9% | +| q5_k_m | 2.57 | 16.46 | 14.45 | 23.9% | + +### By Complexity + +| Tier | fp16 cause/risk/wr | q8_0 cause/risk/wr | q4_k_m cause/risk/wr | q5_k_m cause/risk/wr | +|------|-------------------|-------------------|----------------------|----------------------| +| Simple (<500 events) | 21.05 / 12.39 / 38.6% | 19.27 / 14.45 / 45.5% | 19.68 / 15.05 / 34.1% | 17.95 / 15.48 / 29.5% | +| Medium (500–1999 events) | 21.38 / 15.62 / 50.0% | 16.25 / 16.62 / 37.5% | 18.25 / 15.00 / 37.5% | 15.62 / 15.38 / 37.5% | +| Complex (≥2000 events) | 17.13 / 14.87 / 20.0% | 13.67 / 11.93 / 0.0% | 13.07 / 12.47 / 0.0% | 12.53 / 10.93 / 0.0% | + +**Key observations:** + +- **fp16 is the only variant competitive on complex incidents** (20% win rate). All quantized variants collapse to 0% wins on complex incidents — quantization significantly degrades performance on long, evidence-heavy DAGs. +- **Quantization degrades cause analysis more than risk assessment.** Cause scores drop 2–4 points with quantization while risk scores remain roughly stable or improve slightly. Cause analysis requires precise evidence grounding from the DAG and is more sensitive to precision loss. +- **q8_0 is the best quantized variant.** Smallest gap vs fp16: cause 17.66 (vs 20.21), win rate 34.3% (vs 35.8%). It even outperforms fp16 on risk score and simple incident win rate (45.5% vs 38.6%). +- **q4_k_m outperforms q5_k_m** (cause 18.03 vs 16.46, win rate 26.9% vs 23.9%). q5_k_m is not a reliable quality/size middle ground for this task. + +### Deployment Recommendation + +| Use Case | Recommended Variant | +|----------|-------------------| +| Best accuracy (research/offline) | **fp16** | +| Production deployment (GPU server) | **q8_0** — near-fp16 quality on simple/medium, ~2× memory saving | +| Edge / constrained deployment | **q4_k_m** — outperforms q5_k_m on this task | + +For complex incident analysis specifically, only fp16 is competitive. If complex incidents are a priority deployment target, do not use quantized variants without further fine-tuning on longer DAGs. diff --git a/docs/immune/finetuning_results.md b/docs/immune/finetuning_results.md new file mode 100644 index 000000000..7b2e4cbd9 --- /dev/null +++ b/docs/immune/finetuning_results.md @@ -0,0 +1,95 @@ +### Summarization Fine-Tuned Model: Evaluation Results + +**Summary:** The Qwen2.5-1.5B model fine-tuned for Slips incident summarization ranks 3rd overall with a 4.70 avg score and 19.1% win rate — above both Qwen2.5 baselines. The model performs best on simple incidents (<500 events) and produces highly abstracted summaries. The primary weakness is performance on medium and complex incidents (≥500 events), caused by context length limitations. + +**Model:** [stratosphere/qwen2.5-1.5b-slips-immune](https://huggingface.co/stratosphere/qwen2.5-1.5b-slips-immune) +**Judge:** gpt-oss-120b | **Incidents evaluated:** 47 | **Date:** 2026-04-12 + +--- + +### Index +- [Overall Rankings](#overall-rankings) +- [Performance by Category](#performance-by-category) +- [Performance by Complexity](#performance-by-complexity) +- [Readability](#readability) +- [Key Findings](#key-findings) +- [Known Limitations](#known-limitations) + +--- + +### Overall Rankings +| Rank | Model | Avg Position | Avg Score | Win Rate | +|------|-------|--------------|-----------|----------| +| 1 | GPT-4o-mini | 1.81 | 6.89/10 | 42.6% | +| 2 | GPT-4o | 2.38 | 5.87/10 | 29.8% | +| 3 | **Finetuned 1.5B** | **3.21** | **4.70/10** | **19.1%** | +| 4 | Qwen2.5 3B | 3.40 | 4.57/10 | 8.5% | +| 5 | Qwen2.5 1B | 4.19 | 3.36/10 | 0.0% | + +The finetuned 1.5B model scores above both Qwen2.5 baselines (1B: 3.36, 3B: 4.57) with a win rate of 19.1% vs 8.5% for the 3B model. + +--- + +### Performance by Category +| Category | Finetuned Score | Finetuned Win Rate | vs GPT-4o-mini | +|---|---|---|---| +| Malware (45 incidents) | 4.82/10 | 20.0% | −2.09 | +| Normal (2 incidents) | 2.00/10 | 0.0% | −4.50 | + +Malware incidents are handled competitively. Normal incident performance is poor (2 incidents only — too few for robust conclusions). + +--- + +### Performance by Complexity +| Complexity | Events | Finetuned Score | Win Rate | vs GPT-4o-mini | +|---|---|---|---|---| +| Simple | <500 (31 incidents) | 5.45/10 | 29.0% | −1.29 | +| Medium | 500–1999 (7 incidents) | 3.43/10 | 0.0% | −3.28 | +| Complex | ≥2000 (9 incidents) | 3.11/10 | 0.0% | −4.45 | + +Simple incidents are where the model performs best — scoring 5.45, above Qwen2.5 3B (4.77) and GPT-4o (5.61). Medium and complex incidents are the weak tiers: 0 wins and scores below all GPT baselines, consistent with large DAGs exceeding the 4096-token input budget. + +--- + +### Readability + +An automated readability analysis measured compression ratio, abstraction, and verbatim copying across all models (FP16 results): + +| Model | Avg Compression | Abstracted Bullets | Verbatim Lines | Fences | +|-------|-----------------|--------------------|----------------|--------| +| GPT-4o | 0.19 | 245 | 236 | 34 | +| GPT-4o-mini | 0.21 | 286 | 282 | 0 | +| Qwen2.5 3B | 0.43 | 233 | 261 | 0 | +| Qwen2.5 1B | 0.21 | 131 | 208 | 4 | +| **Finetuned (fp16)** | **0.26** | **373** | **256** | **44** | + +- **Compression 0.26** — more concise than Qwen2.5 3B (0.43), close to GPT-4o-mini (0.21) +- **373 abstracted bullets** — highest of all models, indicating strong paraphrasing behavior +- **256 verbatim lines** — comparable to other models +- **44 markdown fences** — formatting regression present in a subset of responses; not present in GPT-4o-mini + +The readability metrics reveal an important nuance: the judge scoring rewards completeness and penalizes omissions, which means concise summaries can score lower even when they are more useful in practice. The finetuned model's lower judge score relative to verbatim-copying variants partly reflects this judge bias rather than a true quality regression. + +--- + +### Key Findings +1. **Above both Qwen2.5 baselines.** The finetuned 1.5B model scores 4.70, above both Qwen2.5 1B (3.36) and Qwen2.5 3B (4.57), validating that task-specific fine-tuning compensates for parameter count on this domain. + +2. **Strong abstraction.** With 373 abstracted bullets and compression 0.26, the model produces well-paraphrased output — more so than GPT-4o-mini (286). This is a strong operational advantage for security analysts even where judge scores are lower. + +3. **Competitive on simple incidents.** On the most common incident type (<500 events), the model scores 5.45 — above Qwen2.5 3B (4.77) and approaching GPT-4o (5.61). + +4. **Medium and complex incidents are the weak point.** Performance drops to 3.43 (medium) and 3.11 (complex). This is an engineering problem (input truncation at 4096 tokens), not a model quality problem. + +--- + +### Known Limitations +- **Context length ceiling:** Incidents with large DAGs exceed the 4096-token input budget. The model produces errors or degraded summaries on the largest inputs (typically >2000 events). Mitigation: smarter DAG pre-summarization before the LLM step, or training at higher sequence length. +- **Judge bias vs. readability:** The LLM-as-judge rewards completeness and penalizes omissions. This creates a scoring disadvantage for concise models relative to verbatim-copying models. Judge criteria should be updated to explicitly reward compression and abstraction. +- **Small eval set:** 47 incidents is sufficient for directional conclusions but too small for robust statistical significance on Normal (2 incidents) and Complex (9 incidents) subsets. + +--- + +For evaluation methodology, see [Fine-Tuning Evaluation Methodology](finetuning_evaluation.md). +For training details, see [Summarization Fine-Tuning Procedure](finetuning_summarization_procedure.md). +For quantization impact and deployment options, see [Quantization and Deployment](finetuning_quantization.md). diff --git a/docs/immune/finetuning_risk_procedure.md b/docs/immune/finetuning_risk_procedure.md new file mode 100644 index 000000000..311041d9c --- /dev/null +++ b/docs/immune/finetuning_risk_procedure.md @@ -0,0 +1,99 @@ +### Risk Assessment & Cause Analysis Fine-Tuning: Dataset and Training Procedure + +**Summary:** The risk model is trained on a quality-filtered subset of the Slips cause & risk dataset, using the highest-scoring model response per task per incident as the training target. A single LoRA adapter handles both cause analysis and risk assessment, trained on an interleaved combined dataset. This document covers the risk-specific dataset preparation and training configuration. + +--- + +### Index +- [Dataset](#dataset) +- [Step 1 — Quality Filtering](#step-1--quality-filtering) +- [Step 2 — Ground Truth Selection](#step-2--ground-truth-selection) +- [Training](#training) +- [Published Model](#published-model) + +--- + +### Dataset +**Source:** [risk_dataset_v2.json](https://github.com/stratosphereips/Slips-tools/raw/refs/heads/main/alert_summary/datasets/risk_dataset_v2.json.gz) +826 security incidents from Slips, each with four LLM-generated cause analyses and risk assessments (GPT-4o, GPT-4o-mini, Qwen2.5 3B, Qwen2.5 1.5B) and associated LLM-as-judge quality scores. + +For how this dataset was generated, see [Risk Analysis Dataset Report](DATASET_RISK_REPORT.md). + +--- + +### Step 1 — Quality Filtering +[`filter_dataset_risk.py`](https://github.com/stratosphereips/Slips-tools/blob/main/unsloth-scripts/filter_dataset_risk.py) applies five filters per incident: + +- **Cause score threshold:** reject if best model cause score < 14 (bottom quality quartile) +- **Risk score threshold:** reject if best model risk score < 10 +- **Cause token length:** reject if best cause response is < 50 or > 600 tokens +- **Risk token length:** reject if best risk response is < 30 or > 300 tokens +- **Risk level keyword:** reject if risk assessment does not contain a valid level keyword (Critical / High / Medium / Low) + +Surviving incidents are split 90/10 into train and eval sets (`random_state=42`). + +```bash +cd unsloth-scripts/ +python3 filter_dataset_risk.py +# Outputs: risk_filtered_train.json, risk_filtered_eval.json +``` + +--- + +### Step 2 — Ground Truth Selection +[`select_best_responses_risk.py`](https://github.com/stratosphereips/Slips-tools/blob/main/unsloth-scripts/select_best_responses_risk.py) selects the highest-scoring model response per task per incident and formats records as two-turn SFT conversations: + +- `user` — single message containing the instructions (security analyst persona, task description, output format rules) and the DAG analysis text +- `assistant` — best-scoring cause analysis or risk assessment (ground truth) + +No system prompt is used. Cause and risk records are interleaved into a single combined dataset so the model sees both task types throughout training. This single combined dataset trains one adapter that handles both tasks. + +DAG inputs exceeding the token budget are truncated at 3500 tokens with an explicit truncation marker. + +```bash +python3 select_best_responses_risk.py +# Outputs: risk_combined_train_dataset.json (1328 records), risk_combined_eval_dataset.json (148 records) +``` + +The final combined dataset contains 1328 train / 148 eval records (90/10 split from 826 source incidents × 2 tasks, after filtering). + +--- + +### Training +Training follows the general procedure in [Fine-Tuning Approach](finetuning_procedure.md). Risk-specific config values: + +| Parameter | Value | +|---|---| +| Max sequence length | 4096 | +| LoRA rank (`r`) | 64 | +| LoRA alpha | 64 | +| LoRA dropout | 0.0 | +| RSLoRA | enabled (required at r=64) | +| LoRA targets | q_proj, k_proj, v_proj, o_proj, gate_proj, up_proj, down_proj | +| Epochs | 3 | +| Learning rate | 2e-5 | +| LR scheduler | cosine | +| Warmup steps | 20 | +| Weight decay | 0.01 | +| Batch size (effective) | 16 (1 × grad accum 16) | +| Optimizer | adamw_8bit | +| Precision | BF16 | +| Quantization (training) | 4bit (QLoRA) | +| Hardware | A100 80GB MiG 20GB slice (e-infra.cz cloud) | + +```bash +python3 train_qwen.py --config config_risk_4096_20gb.yaml +# Reads config, outputs merged 16-bit weights + GGUF (q4_k_m, q5_k_m, q8_0) +``` + +A key difference from the summarization model: the higher LoRA rank (r=64 vs r=16) with RSLoRA enabled is required to handle the dual-task objective. The combined interleaved dataset ensures the adapter learns both cause analysis and risk assessment without task interference. + +--- + +### Published Model +The trained model is published on HuggingFace: + +> **[stratosphere/qwen2.5-1.5b-slips-immune-risk](https://huggingface.co/stratosphere/qwen2.5-1.5b-slips-immune-risk)** + +For evaluation results, see [Risk Fine-Tuned Model: Evaluation Results](finetuning_risk_results.md). +For GGUF conversion and Ollama deployment, see [Quantization and Deployment](finetuning_quantization.md). diff --git a/docs/immune/finetuning_risk_results.md b/docs/immune/finetuning_risk_results.md new file mode 100644 index 000000000..2e3867a62 --- /dev/null +++ b/docs/immune/finetuning_risk_results.md @@ -0,0 +1,76 @@ +### Risk Fine-Tuned Model: Evaluation Results + +**Summary:** The Qwen2.5-1.5B model fine-tuned for Slips cause analysis and risk assessment ranks 2nd overall with avg position 1.73 and 37.3% win rate — nearly tied with GPT-4o (1.70) and ahead of GPT-4o-mini (2.11). The model beats GPT-4o on cause analysis score (15.58 vs 15.33). Primary weakness is risk score calibration (10.27 vs cause score 15.58), reflecting a task imbalance in the training data. + +**Model:** [stratosphere/qwen2.5-1.5b-slips-immune-risk](https://huggingface.co/stratosphere/qwen2.5-1.5b-slips-immune-risk) +**Judge:** qwen3.5 | **Incidents evaluated:** 67 | **Date:** 2026-04-22 + +--- + +### Index +- [Overall Rankings](#overall-rankings) +- [Performance by Category](#performance-by-category) +- [Performance by Complexity](#performance-by-complexity) +- [Key Findings](#key-findings) +- [Known Limitations](#known-limitations) + +--- + +### Overall Rankings +| Rank | Model | Avg Position | Avg Cause Score | Avg Risk Score | Win Rate | Wins | +|------|-------|--------------|-----------------|----------------|----------|------| +| 1 | GPT-4o | 1.70 | 15.33 | 11.99 | 40.3% | 27 | +| 2 | **Finetuned 1.5B** | **1.73** | **15.58** | **10.27** | **37.3%** | **25** | +| 3 | GPT-4o-mini | 2.11 | 15.31 | 11.63 | 19.4% | 13 | +| 4 | Qwen2.5 1.5B (baseline) | 3.48 | 9.15 | 8.79 | 3.0% | 2 | +| 5 | Qwen2.5 3B (baseline) | 3.53 | 7.40 | 9.61 | 0.0% | 0 | + +Scores are out of 30 for cause and 30 for risk (see [LLM-as-Judge Rubric](LLM_JUDGE_RUBRIC.md)). Rankings are determined by the combined cause + risk total (max 60). + +The finetuned 1.5B model is essentially tied with GPT-4o on average position (1.73 vs 1.70) and **outscores GPT-4o on cause analysis** (15.58 vs 15.33). Its 37.3% win rate is nearly double GPT-4o-mini's 19.4% and far above both untuned baselines (3.0% and 0.0%). + +--- + +### Performance by Category +| Category | Count | Cause Score | Risk Score | Win Rate | +|----------|-------|-------------|------------|----------| +| Malware | 47 | 15.52 | 10.08 | 51.1% | +| Normal | 5 | 16.40 | 12.60 | 20.0% | + +Malware incidents — the dominant category — show strong performance with >50% win rate. The Normal category result (5 incidents) is not statistically reliable. + +--- + +### Performance by Complexity +| Complexity | Events | Cause Score | Risk Score | Win Rate | +|------------|--------|-------------|------------|----------| +| Simple | < 500 (33 incidents) | 15.70 | 9.32 | 54.5% | +| Medium | 500–1999 (8 incidents) | 19.38 | 12.62 | 50.0% | +| Complex | ≥ 2000 (11 incidents) | 13.20 | 11.80 | 27.3% | + +Simple and medium incidents are handled competitively, with win rates above 50%. Complex incidents (≥ 2000 events) are the weak tier, consistent with large DAGs approaching the 4096-token input budget. + +--- + +### Key Findings + +1. **Competitive with GPT-4o.** The finetuned 1.5B model nearly matches GPT-4o on overall ranking (avg position 1.73 vs 1.70) and actually beats it on cause analysis score (15.58 vs 15.33). This demonstrates that task-specific fine-tuning can bridge the gap between a 1.5B local model and a large frontier model. + +2. **Strong improvement over baselines.** Win rate improves from 0.0% (Qwen2.5 3B baseline) to 37.3%. Cause score improves by +8.18 over the 3B baseline; risk score improves by +0.66. The asymmetry indicates the model learned cause analysis more effectively than risk calibration. + +3. **Best on simple and medium incidents.** Win rates of 54.5% (simple) and 50.0% (medium) are well above baseline. These two tiers cover the majority of real Slips incidents, so this is operationally the most important result. + +4. **Single adapter, dual task.** Both cause analysis and risk assessment are handled by one LoRA adapter trained on an interleaved combined dataset. This design choice avoids model management overhead — one quantized GGUF file serves both task types at inference time. + +--- + +### Known Limitations +- **Risk scores lag cause scores:** cause avg 15.58 vs risk avg 10.27 — the model is stronger at identifying causes than calibrating risk levels. This reflects task imbalance in the training data (cause examples were higher quality / more consistent). Mitigation: upsample risk training examples 2× in the next training run. +- **Context length ceiling:** incidents with large DAGs exceed the 4096-token input budget. Performance drops on the largest inputs (≥ 2000 events). Mitigation: smarter DAG pre-summarization before the LLM step, or training at higher sequence length. +- **Small eval set for Normal traffic:** 5 Normal incidents is too few for statistically reliable conclusions. The 20.0% Normal win rate should not be compared directly to the 51.1% Malware win rate. + +--- + +For evaluation methodology, see [Fine-Tuning Evaluation Methodology](finetuning_evaluation.md). +For training details, see [Risk Assessment Training Procedure](finetuning_risk_procedure.md). +For quantization impact and deployment options, see [Quantization and Deployment](finetuning_quantization.md). diff --git a/docs/immune/finetuning_summarization_procedure.md b/docs/immune/finetuning_summarization_procedure.md new file mode 100644 index 000000000..f44852665 --- /dev/null +++ b/docs/immune/finetuning_summarization_procedure.md @@ -0,0 +1,86 @@ +### Summarization Fine-Tuning: Dataset and Training Procedure + +**Summary:** The summarization model is trained on a quality-filtered subset of the Slips summarization dataset, using the highest-scoring model response per incident as the training target. The same general LoRA+Unsloth pipeline applies; this document covers the summarization-specific dataset preparation and system prompt. + +--- + +### Index +- [Dataset](#dataset) +- [Step 1 — Quality Filtering](#step-1--quality-filtering) +- [Step 2 — Ground Truth Selection](#step-2--ground-truth-selection) +- [Training](#training) +- [Published Model](#published-model) + +--- + +### Dataset +**Source:** [summarization_dataset_v3.json](https://github.com/stratosphereips/Slips-tools/raw/refs/heads/main/alert_summary/datasets/summarization_dataset_v3.json.gz) +532 security incidents from Slips, each with four LLM-generated summaries (GPT-4o, GPT-4o-mini, Qwen2.5 1B, Qwen2.5 3B) and associated LLM-as-judge quality scores. + +For how this dataset was generated, see [Summarization Dataset Report](DATASET_REPORT.md). + +--- + +### Step 1 — Quality Filtering +[`filter_dataset.py`](https://github.com/stratosphereips/Slips-tools/blob/main/unsloth-scripts/filter_dataset.py) applies two filters per incident: + +- **Score threshold:** reject if best model score < 4 (bottom quality quartile) +- **Token length:** reject if best response summary is < 50 or > 400 tokens (too short = trivial; too long = likely template failure or prompt echo) + +Surviving incidents are split 90/10 into train and eval sets (`random_state=42`). + +```bash +cd unsloth-scripts/ +python3 filter_dataset.py +# Outputs: filtered_train.json, filtered_eval.json +``` + +--- + +### Step 2 — Ground Truth Selection +[`select_best_responses.py`](https://github.com/stratosphereips/Slips-tools/blob/main/unsloth-scripts/select_best_responses.py) selects the highest-scoring model response per incident and formats each record as a two-turn SFT conversation using a **merged prompt format**: + +- `user` — a single message containing both the instructions (security analyst persona, task description, output format rules) and the DAG analysis text +- `assistant` — best-scoring summary (ground truth) + +No system prompt is used. Instructions and DAG are concatenated into one user message so the model learns to handle both in the same context. + +DAG inputs exceeding the token budget are truncated at clean line boundaries with an explicit truncation marker, so the model learns to handle partial inputs gracefully. + +```bash +python3 select_best_responses.py +# Outputs: train_dataset.json, eval_dataset.json +``` + +The user message instructs the model to group identical events, assign severity labels (CRITICAL / HIGH / MEDIUM / LOW / INFO), and produce a fixed structured output format. This format is what the judge and downstream Slips components expect. + +--- + +### Training +Training follows the general procedure in [Fine-Tuning Approach](finetuning_procedure.md). Summarization-specific config values: + +| Parameter | Value | +|---|---| +| Max sequence length | 4096 | +| Epochs | 3 | +| Learning rate | 1e-5 | +| LoRA dropout | 0.05 | +| Batch size (effective) | 8 (1 × grad accum 8) | +| Precision | FP16 | +| Quantization (training) | 4bit | +| Hardware | A100 80GB MiG 20GB slice (e-infra.cz cloud) | + +```bash +python3 train_qwen.py +# Reads config.yaml, outputs merged 16-bit weights + GGUF (q4_k_m) +``` + +--- + +### Published Model +The trained model is published on HuggingFace: + +> **[stratosphere/qwen2.5-1.5b-slips-immune](https://huggingface.co/stratosphere/qwen2.5-1.5b-slips-immune)** + +For evaluation results, see [Summarization Fine-Tuned Model: Evaluation Results](finetuning_results.md). +For GGUF conversion and Ollama deployment, see [Quantization and Deployment](finetuning_quantization.md). diff --git a/docs/immune/immune_architecture.md b/docs/immune/immune_architecture.md index 8b7851dd2..b8860bb4c 100644 --- a/docs/immune/immune_architecture.md +++ b/docs/immune/immune_architecture.md @@ -1,4 +1,4 @@ -# Architecture Design of Slips Immune +# Architecture Design of Slips Immune ## Introduction @@ -49,7 +49,7 @@ The human innate system is composed of a large group of cells and activities, bu The non-self detection theory of the human immune system says that there is no such thing as detecting the concept of self in cells. The only concept of self is trained during weak matching in the training of new T-cells and B-cells, to ensure they only receive pathogen parts from MHC Class II molecules. Apart from this, the human immune system does not have a concept of self. What it has is a concept of non-self, achieved by explicitly detecting the PAMPs of known pathogens. ### Detection of Non-self with PAMPs in Slips -Most of the current modules in Slips version <= 1.1.12 play the role of the innate system. These include: Input, Output, mlflowdetection, arp, cesnet, cyst, ensembling, exporting_alerts, http_analyzer, ip_info, irisModule, kalipso, leak_detector, network_discovery, p2ptrust, riskiq, rnn_cc_detection, threat_intelligence, virustotal, and update_manager. Some core parts of Slips are also part of the immune system, such as output. +Most of the current modules in Slips version <= 1.1.12 play the role of the innate system. These include: Input, Output, mlflowdetection, arp, cesnet, cyst, ensembling, exporting_alerts, http_analyzer, ip_info, iris_module, leak_detector, network_discovery, p2p_trust, risk_iq, rnn_cc_detection, threat_intelligence, virustotal, and update_manager. Some core parts of Slips are also part of the immune system, such as output. These modules are part of the innate system because they are very generic (e.g., port scan detector, unknown HTTP User-Agent, etc.), which makes them easy to create and train but also prone to false positives. Therefore, detections like unknown HTTP User-Agent are considered PAMPs by Slips since they are attack-associated patterns. @@ -116,17 +116,17 @@ The human adaptive immune system has many characteristics described, but for the ### Guided-random new detectors For the adaptive immune system, Slips implements the creation of many Zeek detection scripts that are guided-randomly adapted (not evolved and not a genetic algorithm) to get very precise fast rule-based detectors with context information. -The negative selection will be done using a local offline database of benign traffic (described later). +The negative selection will be done using a local offline database of benign traffic (described later). The idea of the guided-random creation is to: 1. Create many guided-random detection scripts for Zeek using the new local LLM module. It is random only for certain parts of the Zeek script. - 1. A basic template of the detector is given + 1. A basic template of the detector is given 2. An LLM choses each part of the template according to what it is expected. If it is a URL then a URL, if it is a domain, then a domain. 2. __Positive Selection__. Each script should: 1. Recognize some traffic 2. Be syntactically correct 3. Compile and load - 4. Compile + 4. Compile 3. __Negative Selection__. Each script should: 1. Be tested against a large DB of benign traffic. 2. If any match happens the script is discarded. @@ -162,7 +162,7 @@ The two pathway activation works like this 5. The second activation comes from the DAMPs. DAMPs can be generated by the local Slips or received from the P2P network. 6. Only when both signals are received then the stronger defense is used and Slips isolates or blocks the attacker using ARP cache poisoning techniques. - + ### Evolution of Pattern Matching Detectors Upon Search When the adaptive system receives a PAMP detection together with some context flows, it will try to determine whether it has stored Zeek detector scripts that can match the context. @@ -218,78 +218,77 @@ In a sense, Slips already performs a form of Anergy when its designers detect a ## Immunoregulation -Immunoregulation refers to all the actions taken by the immune system to: +Immunoregulation refers to all the actions taken by the immune system to: -1. **Amplification** — Ensure the entire system is aware of the threat so it is not overlooked. -2. **Control the Power of the Response** — Avoid overreacting to a threat. -3. **Ensure the Response Is Timely** — Act quickly enough to counter the threat. -4. **Slow Down After the Threat Is Gone** — Stop actions once the threat has been removed. +1. **Amplification** — Ensure the entire system is aware of the threat so it is not overlooked. +2. **Control the Power of the Response** — Avoid overreacting to a threat. +3. **Ensure the Response Is Timely** — Act quickly enough to counter the threat. +4. **Slow Down After the Threat Is Gone** — Stop actions once the threat has been removed. -In Slips, immunoregulation will be implemented in two ways: +In Slips, immunoregulation will be implemented in two ways: -1. Inside the local Slips host. -2. Through communication with other peers in the P2P network. +1. Inside the local Slips host. +2. Through communication with other peers in the P2P network. ### Slips Host #### Amplification -There is no need for amplification inside a single Slips host, since the whole system already has the information. +There is no need for amplification inside a single Slips host, since the whole system already has the information. #### Control Power of Answer -- The innate system blocks via the firewall. -- The adaptive system blocks via an ARP poisoning attack. +- The innate system blocks via the firewall. +- The adaptive system blocks via an ARP poisoning attack. #### Be Sure the Answer Is on Time -- Firewall rules are added to the local firewall for fast response. -- Zeek scripts are injected into the Zeek process. -- The ARP poisoning attack is executed as soon as it is approved by the adaptive system. +- Firewall rules are added to the local firewall for fast response. +- Zeek scripts are injected into the Zeek process. +- The ARP poisoning attack is executed as soon as it is approved by the adaptive system. #### Slowdown After the Threat Is Gone -The slowdown depends on the number of evidences and alerts generated in the current time window. +The slowdown depends on the number of evidences and alerts generated in the current time window. -Currently, Slips implements the following behaviour: -- After the attacker is blocked, all new alerts from that attacker are still stored. -- When the attacker stops attacking, it enters a probation period of one time window. During this period, the attacker host is expected not to generate any alerts. -- If no alerts are generated in that probation period, then in the second time window after the last block, the attacker is unblocked. +Currently, Slips implements the following behaviour: +- After the attacker is blocked, all new alerts from that attacker are still stored. +- When the attacker stops attacking, it enters a probation period of one time window. During this period, the attacker host is expected not to generate any alerts. +- If no alerts are generated in that probation period, then in the second time window after the last block, the attacker is unblocked. - If the attacker continues to attack and generate evidences and alerts, it remains blocked. ### P2P Network #### Amplification -For alerts generated from PAMPs and profile violations (DAMPs): -- Every time the local Slips generates an alert, send it into the P2P network. -- Every time the local Slips receives an alert in the P2P network from another peer, and that alert originated in that peer, resend it to the P2P network. - - (This ensures alerts generated by peer A and sent by peer A are amplified, but ignores alerts that peer A forwards on behalf of peer B.) +For alerts generated from PAMPs and profile violations (DAMPs): +- Every time the local Slips generates an alert, send it into the P2P network. +- Every time the local Slips receives an alert in the P2P network from another peer, and that alert originated in that peer, resend it to the P2P network. + - (This ensures alerts generated by peer A and sent by peer A are amplified, but ignores alerts that peer A forwards on behalf of peer B.) #### Control Power of Answer -- The innate system blocks via the firewall. -- The adaptive system blocks via an ARP poisoning attack. +- The innate system blocks via the firewall. +- The adaptive system blocks via an ARP poisoning attack. #### Be Sure the Answer Is on Time -- Firewall rules are added to the local firewall for fast response. -- Zeek scripts are injected into the Zeek process. -- The ARP poisoning attack is executed as soon as it is approved by the adaptive system. +- Firewall rules are added to the local firewall for fast response. +- Zeek scripts are injected into the Zeek process. +- The ARP poisoning attack is executed as soon as it is approved by the adaptive system. #### Slowdown After the Threat Is Gone -The slowdown of the response depends on the number of PAMPs and DAMPs still received by peers in the network. +The slowdown of the response depends on the number of PAMPs and DAMPs still received by peers in the network. -- When the attack stops, no more evidences are generated by peers and no further alerts should be sent or amplified. -- When PAMPs stop, the firewall block and ARP poisoning should also stop. (The firewall only requires PAMPs to be activated, but the ARP poisoning attack requires both PAMPs and DAMPs.) -- When the attack stops, the host’s behaviour should also return to normal, which will eventually stop DAMPs. This typically takes more time. +- When the attack stops, no more evidences are generated by peers and no further alerts should be sent or amplified. +- When PAMPs stop, the firewall block and ARP poisoning should also stop. (The firewall only requires PAMPs to be activated, but the ARP poisoning attack requires both PAMPs and DAMPs.) +- When the attack stops, the host’s behaviour should also return to normal, which will eventually stop DAMPs. This typically takes more time. -A waiting function, based on the time window, will be applied so these changes do not happen immediately after flows stop being received. +A waiting function, based on the time window, will be applied so these changes do not happen immediately after flows stop being received. # Stopping the Threats -The main goal of the human immune system is to protect us by killing pathogens, neutralising them, or expelling them. Slips needs to do the same in order to be effective. - -To stop threats, Slips implements two actions: +The main goal of the human immune system is to protect us by killing pathogens, neutralising them, or expelling them. Slips needs to do the same in order to be effective. -1. **Block in the local firewall** - - When an alert is generated for a host (PAMPs are detected by the innate system only), the host is blocked in the firewall of the local machine. +To stop threats, Slips implements two actions: -2. **ARP Cache Poison Attack** - - When both PAMPs and DAMPs are detected, the attacker host is isolated through an ARP cache poisoning attack. +1. **Block in the local firewall** + - When an alert is generated for a host (PAMPs are detected by the innate system only), the host is blocked in the firewall of the local machine. +2. **ARP Cache Poison Attack** + - When both PAMPs and DAMPs are detected, the attacker host is isolated through an ARP cache poisoning attack. diff --git a/docs/immune/stress_testing.md b/docs/immune/stress_testing.md index f02d3c887..3877ffd26 100644 --- a/docs/immune/stress_testing.md +++ b/docs/immune/stress_testing.md @@ -51,10 +51,6 @@ The latency we're interested in here means "how long did Slips take to detect a Please check [how Slips works](https://stratospherelinuxips.readthedocs.io/en/develop/immune/performance_evaluation.html#how-slips-works) for context on what profilers/input process are. -All throughput and latency plots in this document were generated with -`Debug.generate_performance_plots: true` in config/slips.yaml. -That flag makes Slips record extra performance CSVs during the run and render -the plots during shutdown. ## Baseline diff --git a/docs/immune/updating_slips.md b/docs/immune/updating_slips.md new file mode 100644 index 000000000..c861d8ad7 --- /dev/null +++ b/docs/immune/updating_slips.md @@ -0,0 +1,204 @@ +# Updating Slips + +## Table of Contents + +- [Overview](#overview) +- [How Auto-Update Works](#how-auto-update-works) + * [New version checks](#new-version-checks) + * [Updating Logic](#updating-logic) + + [Redis handling](#redis-handling) + + [Zeek log handling](#zeek-log-handling) + * [Draining and Shutdown of the old Slips](#draining-and-shutdown-of-the-old-slips) +- [How to use it](#how-to-use-it) +- [Manual update](#manual-update) + * [Running Slips in Docker](#running-slips-in-docker) + * [Running Slips natively](#running-slips-natively) +- [PR](#pr) + +## Overview + +Slips auto update functionality was designed to allow a running instance of +Slips to update itself with no downtime during the transition between versions. + +Updates usually consist of: + +A full application stop -> update -> restart sequence. +rather than simple restart. + +That sequence would lead to downtime and temporarily missing of flows during the upgrade. + +The implemented update mechanism was designed around "handover" instead of "restarts". +Where slips checks periodically for new compatible versions, pulls the update, +starts the new version, and orchestrates a controlled handover from the old +version to the new one. + + +## How Auto-Update Works + +```text +Old Slips running + ↓ +Check for compatible update + ↓ +git pull origin master + ↓ +Start new Slips with -u + ↓ +New Slips restores state and starts processing + ↓ +Old Slips drains + ↓ +Old Slips graceful shutdown + ↓ +New Slips continues normally +``` + + +### New version checks + +Slips checks for updates once per day. + +This is handled by the UpdateManager, which: + +- checks whether auto-update is enabled in the config file +- checks whether a new version exists +- checks compatibility before attempting update. + +Compatibility is determined using an `update.json` file hosted with the +deployed version. + +This file includes metadata about the new version such as: + +- latest version, +- backwards compatibility, +- whether new dependencies are needed. + + +The compatibility parser was added so we avoid updating to incompatible new releases. + + +**The update is aborted if:** + +- `auto_update_slips` is disabled in slips config. +- Slips is running on offline input instead of interface +- no newer version exists +- update is incompatible according to `update.json` +- local uncommitted changes are detected during `git pull` +- startup of the new version fails + + +### Updating Logic + + +When designing this, our main goal was zero downtime and zero missed flows during the update. This has the cost of maybe reading a very few duplicate flows, and this was done by +Starting the new Slips before stopping the old one. + +How this is done is: +- The old version starts the new one with the undocumented `-u` flag. +- The `-u` flag tells the new Slips instance that: 1. this is not a fresh run and 2. Slips should continue existing analysis and handle database migrations. +- do not overwrite: output dir, log files, and previous analysis artifacts/metrics. + + +#### Redis handling + +The new Slips does not flush Redis on startup. + +Instead, it appends to the existing Redis state as if the old process never +stopped. + +Without this, ongoing detections, states, and evidence state would be lost. + + +Now what happen when in the very few seconds during handover, a msg from the old slips' pub/sub is published, and the new updated slips receives it? + +To avoid this we added Pub/Sub message versioning, now each pub/sub message includes +the Slips version and consumers ignore messages that belong to the updated version and only read msgs intended +for them. + + +#### Zeek log handling + +The new Slips starts a new zeek process that uses new zeek log files in ```output/zeek_files/slips_vx.y.z```. +This ensures that the old zeek logs are not modified, re-read or overwritten during the update + +This was a major simplification because sharing Zeek logs between versions +introduced complexity and race conditions. + + +### Draining and Shutdown of the old Slips + +Once the updated Slips is confirmed to be running: + +the old Slips begins draining. + +Draining means: + +- stop ingesting new flows. +- finish processing pending flows. + + +PS: the new updated slips version starts reading flows before the old one starts draining to ensure 0 downtime. + +## How to use it + +enable ```auto_update_slips``` in ```config/slips.yaml``` and run slips on your interface. + +now whenever a new version of Slips is available, it will update itself and the new slips will use the same CLI as the old one. + +## Manual update + +If you do not use `auto_update_slips`, update Slips manually using the method +that matches your installation. + +### Running Slips in Docker + +If you run Slips from the published Docker image, pull the new image and start a +new container from it: + +```bash +docker pull stratosphereips/slips:latest +docker run -it --rm --net=host --cap-add=NET_ADMIN --name slips stratosphereips/slips:latest +``` + + +If you build Slips locally from `docker/Dockerfile`, first update the +repository, then rebuild the image so the new code and dependencies are available +into the container: + +```bash +git pull --recurse-submodules && git submodule update --init --recursive +docker build --target amd --no-cache -t slips -f docker/Dockerfile . +``` + +If Docker cannot access the network during the build, use: + +```bash +docker build --target amd --network=host --no-cache -t slips -f docker/Dockerfile . +``` + +Then start a new container from the rebuilt image. + +### Running Slips natively + +For native installations, first update the repository and all submodules: + +```bash +git pull --recurse-submodules && git submodule update --init --recursive +``` + +Then run the installer script: + +```bash +sudo ./install/install.sh +``` + +Re-running `install.sh` is important because a new Slips version may require new +apt packages, pip packages or rebuilt components such as Redis and `p2p4slips`. + +After the update finishes, start Slips again normally. As with a fresh install, +the first run may spend some time updating threat intelligence files in the +background. + +## PR + +https://github.com/stratosphereips/StratosphereLinuxIPS/pull/1915 diff --git a/docs/index.rst b/docs/index.rst index 51eb2d462..58e437877 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -13,11 +13,11 @@ This documentation gives an overview how Slips works, how to use it and how to h - **Installation**. Instructions to install Slips in a Docker and in a computer. See :doc:`Installation `. -- **Usage**. Instructions and examples how to run Slips with different type of files and analyze the traffic using Slips and its GUI Kalipso. See :doc:`Usage `. +- **Usage**. Instructions and examples how to run Slips with different type of files and analyze the traffic using Slips and its web interface or the optional Kalipso submodule. See :doc:`Usage `. - **Detection modules**. Explanation of detection modules in Slips, types of input and output. See :doc:`Detection modules `. -- **Bruteforcing**. Dedicated documentation for the SSH bruteforcing detection module. See :doc:`Bruteforcing `. +- **brute_force_detector**. Dedicated documentation for the SSH brute force detector module. See :doc:`brute_force_detector `. - **HTTPS anomaly detection**. Detailed design and behavior of the HTTPS anomaly detector. See :doc:`HTTPS anomaly detection `. @@ -25,7 +25,7 @@ This documentation gives an overview how Slips works, how to use it and how to h - **Training with your own data**. Explanation on how to re-train the machine learning system of Slips with your own traffic (normal or malicious).See :doc:`Training `. -- **Detections per Flow**. Explanation on how Slips works to make detections on each flow with different techniques. See :doc:`Flow Alerts `. +- **Detections per Flow**. Explanation on how Slips works to make detections on each flow with different techniques. See :doc:`flow_alerts `. - **Exporting**. The exporting module allows Slips to export to Slack and STIX servers. See :doc:`Exporting `. @@ -53,14 +53,14 @@ This documentation gives an overview how Slips works, how to use it and how to h usage architecture detection_modules - bruteforcing + brute_force_detector https_anomaly_detection - flowalerts + flow_alerts features training exporting P2P - fides_module + fides create_new_module datasets immune/Immune diff --git a/docs/installation.md b/docs/installation.md index 55bdc1150..2fdd22831 100644 --- a/docs/installation.md +++ b/docs/installation.md @@ -80,13 +80,12 @@ In addition to the full stratosphereips/slips:latest image, there is now a minim * rnn_cc_detection/ * timeline/ -* kalipso/ -* p2ptrust/ -* flowmldetection/ +* p2p_trust/ +* flow_ml_detection/ * cyst/ * cesnet/ * exporting_alerts/ -* riskiq/ +* risk_iq/ * template/ * blocking/ * virustotal/ @@ -210,7 +209,7 @@ Slips depends on three major elements: - Redis database v8 -To install these elements, the script will use the APT package manager. After that, it will install python packages required for Slips to run and its modules to work. Also, Slips' interface Kalipso depend on Node JS and several npm packages. +To install these elements, the script will use the APT package manager. After that, it will install python packages required for Slips to run and its modules to work. **Instructions to download everything for Slips are below.** @@ -222,8 +221,11 @@ You can install it using [install.sh](https://github.com/stratosphereips/Stratos sudo chmod +x install.sh sudo ./install.sh +The script installs Slips core dependencies and builds `p2p4slips`. It does +not install Kalipso. + ### Installing Slips manually -#### Installing Python, Redis, NodeJs, and required python and npm libraries. +#### Installing Python, Redis, and required python libraries. Update the repository of packages so you see the latest versions: @@ -243,11 +245,28 @@ Now that pip3 is upgraded, we can proceed to install all required packages via p _Note: for those using a different base image, you need to also install tensorflow==2.16.1r via pip3._ +#### Optional Kalipso submodule + +Kalipso is maintained in a separate repository and checked out as the +`modules/kalipso` submodule. + +If you cloned Slips without submodules, initialize it with: + +```bash +git submodule update --init --recursive modules/kalipso +``` + +If you are cloning Slips for the first time and want all optional components, +use: + +```bash +git clone --recurse-submodules --remote-submodules https://github.com/stratosphereips/StratosphereLinuxIPS -j4 +``` -As we mentioned before, the GUI of Slips known as Kalipso relies on NodeJs v19. Make sure to use NodeJs greater than version 12. For Kalipso to work, we will install the following npm packages: +Kalipso has its own installation instructions in +`modules/kalipso/README.md`. It is optional and not required for Docker, CI, or +core Slips execution. - curl -fsSL https://deb.nodesource.com/setup_21.x | sudo -E bash - && sudo apt install -y --no-install-recommends nodejs - cd modules/kalipso && npm install #### Installing Zeek @@ -327,7 +346,9 @@ You can kill this redis database by running: ``` then choosing 1. -After these steps, if you need the submodules, you will need to clone them as done in the `install.sh` script. +After these steps, if you need optional submodules, initialize them with +`git submodule update --init --recursive` and then follow the instructions in +their own READMEs. ## Installing Slips on a Raspberry PI diff --git a/docs/iris_module.md b/docs/iris_module.md index dc15dd30d..ab2308f16 100644 --- a/docs/iris_module.md +++ b/docs/iris_module.md @@ -98,7 +98,7 @@ will be left upon the future developers. * ```go test ./...``` ### Integration Testing -Integration tests are located in ```tests/integration/test_iris.py```. +Integration tests are located in ```tests/integration/test_iris/test_iris.py```. ### Test Messaging The scenario that was modeled in this test refers to a common use case. diff --git a/docs/slips_in_action.md b/docs/slips_in_action.md index 2df49498f..fa84cb3aa 100644 --- a/docs/slips_in_action.md +++ b/docs/slips_in_action.md @@ -31,7 +31,7 @@ First, Slips will start by updating all the remote TI feeds added in slips.yaml To make sure Slips is up to date with the most recent IoCs in all feeds, all feeds are loaded, parsed and updated periodically and automatically by -Slips every 24 hours by our [Update Manager](https://stratospherelinuxips.readthedocs.io/en/develop/detection_modules.html#update-manager-module), which requires no user interaction. +Slips every 24 hours by our [update_manager](https://stratospherelinuxips.readthedocs.io/en/develop/detection_modules.html#update-manager-module), which requires no user interaction. Afetr updating, slips modules start and print the PID of every successfully started module. @@ -48,22 +48,22 @@ Slips splits does detections in timewindows, each time window is 1 hour long by So if an IP behaves maliciously at 4 PM, it will be marked as infected only during that hour, the next hour if no malicious behaviour occurs, slips will treat the traffic as normal. This explains the start and stop timestamps in the alert `start 2021-04-10T16:44:43.285478+02:00, stop 2021-04-10T17:44:43.285478+0200`. This is the period (timewindow) in which this IP was behaving maliciously. -The difference between infected and normal timewindows is shown better in [kalispo](https://stratospherelinuxips.readthedocs.io/en/develop/usage.html#reading-the-output), our user interface. +The difference between infected and normal timewindows is shown better in the web interface. -You can start it in another terminal using `./kalipso.sh` +You can inspect the results in another terminal using `./webinterface.sh` - +

Figure 3

We can see that IP 2001:718:2:903:b877:48ae:9531:fbfc is infected only in timewindow1 as it's marked in red and is behaving normally in timewindow0 as it's colored in green. -We can see all the flows done by this IP in the infected timewindow in kalipso by pressing enter on timewindow1. +We can see all the flows done by this IP in the infected timewindow in the web interface by opening timewindow1. - + -At the bottom box in kalipso we can scroll though the evidence and se what slips detected, this is the same evidence printed in Figure 3. +In the interface evidence view we can inspect what slips detected, this is the same evidence printed in Figure 3. We can see the following detections in the evidence: diff --git a/docs/training.md b/docs/training.md index e2a86674b..7edf73c5a 100644 --- a/docs/training.md +++ b/docs/training.md @@ -2,14 +2,14 @@ Slips has one machine learning module that can be retrained by users. This is done by puttin slips in training mode so you can re-train the machine learning models with your own traffic. By default Slips includes an already trained model with our data, but it is sometimes necessary to adapt it to your own circumstances. -Until Slips 0.7.3, there is only one module for now that can do this, the one called 'flowmldetection'. This module analyzes flows one by one, as formatted similarly as in a conn.log Zeek file. This module is enabled by default in testing mode. This module uses by default the SGDClassifier with a linear support vector machine (SVM). The decision to use SVM was done because is one of the few algorithms that can be used for online learning and that can extend a current model with new data. +Until Slips 0.7.3, there is only one module for now that can do this, the one called 'flow_ml_detection'. This module analyzes flows one by one, as formatted similarly as in a conn.log Zeek file. This module is enabled by default in testing mode. This module uses by default the SGDClassifier with a linear support vector machine (SVM). The decision to use SVM was done because is one of the few algorithms that can be used for online learning and that can extend a current model with new data. To re-train this machine learning algorithm, you need to do the following: -1- Edit the config/slips.yaml file to put Slips in train mode. Search the word __train__ in the section __[flowmldetection]__ and uncomment the __mode = train__ and comment __mode = test__. It should look like +1- Edit the config/slips.yaml file to put Slips in train mode. Search the word __train__ in the section __[flow_ml_detection]__ and uncomment the __mode = train__ and comment __mode = test__. It should look like - [flowmldetection] - # The mode 'train' should be used to tell the flowmldetection module that the flows received are all for training. + [flow_ml_detection] + # The mode 'train' should be used to tell the flow_ml_detection module that the flows received are all for training. # A label should be provided in the [Parameters] section mode = train @@ -51,8 +51,8 @@ You can also run slips in an interface and train it directly with your data 4- Finally to use the model, put back the __test__ mode in the configuration config/slips.yaml - [flowmldetection] - # The mode 'train' should be used to tell the flowmldetection module that the flows received are all for training. + [flow_ml_detection] + # The mode 'train' should be used to tell the flow_ml_detection module that the flows received are all for training. # A label should be provided in the [Parameters] section #mode = train diff --git a/docs/usage.md b/docs/usage.md index d4cd642f4..2c1ec0c22 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -14,7 +14,7 @@ It's recommended to use PCAPs. All the input flows are converted to an internal format. So once read, Slips works the same with all of them. -After Slips runs on the given traffic, the output can be analyzed with Kalipso GUI interface. +After Slips runs on the given traffic, the output can be analyzed with the web interface. If the `modules/kalipso` submodule is checked out and installed separately, you can also use the Kalipso terminal interface. In this section, we will explain how to execute each type of file in Slips. @@ -165,14 +165,14 @@ However, all instance share 1 cached redis database on redis://localhost:6379 DB Both redis servers, the main sever (DB 0) and the cache server (DB 1) are opened automatically by Slips. -When running ./kalipso.sh, you will be prompted with the following +When using the web interface, you can select among the active Redis-backed analyses: To close all unused redis servers, run slips with --killall You have 3 open redis servers, Choose which one to use [1,2,3 etc..] [1] wlp3s0 - port 55879 [2] dataset/test7-malicious.pcap - port 59324 -You can type 1 or 2 to view the corresponding file or interface in kalipso. +You can choose the corresponding file or interface from the web interface. Once you're done, you can run slips with ```--killall``` to close all the redis servers using the following command @@ -239,54 +239,9 @@ NOTE: When using -g, it is mandatory to give Slips the same interface zeek is ru The output process collects output from the modules and handles the display of information on screen. Currently, Slips' analysis and detected malicious behaviour can be analyzed as following: -- **Kalipso** - Node.JS based graphical user interface in the terminal. Kalipso displays Slips detection and analysis in colorful table and graphs, highlighting important detections. See section Kalipso for more explanation. - **alerts.json and alerts.txt in the output folder** - collects all evidences and detections generated by Slips in a .txt and .json formats. - **log files in a folder _current-date-time_** - separates the traffic into files according to a profile and timewindow and summarize the traffic according to each profile and timewindow. -- **Web interface** - Node.JS browser based GUI for vewing slips detections, Incoming and ongoing traffic and an organized timeline of flows. - - -There are two options how to run Kalipso Locally: - -### Kalipso - -You can run Kalipso as a shell script in another terminal using the command: - - ./kalipso.sh - - -In docker, you can open a new terminal inside the slips container and execute ```./kalipso.sh``` - -To open a new terminal inside Slips container first [run](https://stratospherelinuxips.readthedocs.io/en/develop/installation.html#running-slips-inside-a-docker-from-the-dockerhub) Slips in one terminal - -Now in a new local terminal get the Slips container ID: - -```docker ps``` - -Create another terminal of the Slips container using - -```docker exec -it bash``` - -Now you can run - -```./kalipso.sh``` - - -and choose the port Slips started on. Slips uses port 6379 by default. - -On the right column, you can see a list of all the IPs seen in your traffic. - -The traffic of IP is splitted into time windows. each time window is 1h long of traffic. - -You can press Enter of any of them to view the list of flows in the timewindow. - - - -You can switch to the flows view in kalipso by pressing TAB, now you can scroll on flows using arrows - - -On the very top you can see the ASN, the GEO location, and the virustotal score of each IP if available - -Check how to setup virustotal in Slips [here](https://stratospherelinuxips.readthedocs.io/en/develop/usage.html#popup-notifications). +- **Web interface** - browser based GUI for viewing slips detections, incoming and outgoing traffic, and an organized timeline of flows. ### The Web Interface @@ -300,7 +255,7 @@ Then navigate to ```http://localhost:55000/``` from your browser. -Just like kalipso, On the right column, you can see a list of all the IPs seen in your traffic. +On the right column, you can see a list of all the IPs seen in your traffic. The traffic of IP is splitted into time windows. each time window is 1h long of traffic. @@ -346,7 +301,7 @@ You can load it again using ```-d```, For example: ```sudo ./slips.py -d redis_backups/hide-and-seek-short.rdb ``` -And then use ```./kalipso``` or ```./webinterface.sh``` and select the entry on port 32850 to view the loaded database. +And then use ```./webinterface.sh``` and select the entry on port 32850 to view the loaded database. Note: saving and loading the database requires **root privileges** and is only supported in linux. @@ -523,6 +478,25 @@ In ```out``` mode, SLIPS still creates profiles for internal (A) and external (B This parameter allows you to tailor SLIPS's analysis focus based on your specific monitoring requirements, such as detecting potential data exfiltration attempts (```out``` mode) or performing comprehensive network monitoring in both directions (```all``` mode). +**Persistent runtime data** + +Use ```permanent_dir``` to choose where Slips stores databases and runtime-generated files that must persist across different Slips runs and should not be overwritten. + +This includes persistent artifacts such as ```p2p_trust_runtime/``` and shared module databases like the Fides cache. + +**Live Slips auto update** + +Use ```update.auto_update_slips``` to enable or disable automatic live updates of the installed Slips version. + +```yaml +update: + auto_update_slips: false +``` + +This setting is separate from the runtime ```feeds_update_manager``` module, which only updates TI feeds and related files. + +Automatic Slips updates may overwrite the default config files shipped with Slips. If you want to keep local config changes safe, do not modify the default config files. Create and use your own config files with different names instead. +
diff --git a/install/apt_dependencies.txt b/install/apt_dependencies.txt index 3dd695dee..c793e1603 100644 --- a/install/apt_dependencies.txt +++ b/install/apt_dependencies.txt @@ -8,7 +8,6 @@ python3-dev python3-watchdog python3-tzlocal wget -npm iw build-essential file @@ -21,7 +20,6 @@ tshark git whois golang -nodejs notify-osd yara libnotify-bin diff --git a/install/install.sh b/install/install.sh index 5227ab404..9177baf25 100755 --- a/install/install.sh +++ b/install/install.sh @@ -188,18 +188,6 @@ python3 -m pip install --upgrade pip \ exit_on_cmd_failure -# For Kalipso -print_green "Installing nodejs and npm dependencies" -curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | sudo bash - \ - && export NVM_DIR="$HOME/.nvm" \ - && [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" \ - && nvm install 22 \ - && cd modules/kalipso && npm install \ - && cd ../.. - -exit_on_cmd_failure - - print_green "Installing p2p4slips" # build the pigeon and Add pigeon to path git submodule init && git submodule update && cd p2p4slips && go build && export PATH=$PATH:$(pwd) >> ~/.bashrc && cd .. diff --git a/install/requirements.txt b/install/requirements.txt index 98410b37c..3f64dd316 100644 --- a/install/requirements.txt +++ b/install/requirements.txt @@ -1,5 +1,6 @@ maxminddb==3.0.0 setuptools<81 +# do NOT build river from source. Only install it if a wheel exists. --only-binary=river river numpy==1.26.4 @@ -21,7 +22,7 @@ scikit_learn slackclient==2.9.4 psutil==7.1.3 six==1.17.0 -pytest==8.4.2 +pytest==9.0.3 pytest-mock==3.15.1 pytest-xdist==3.8.0 scipy==1.15.1 @@ -50,4 +51,3 @@ pytest-asyncio vulture detect-secrets git+https://github.com/SECEF/python-idmefv2.git -river diff --git a/kalipso.sh b/kalipso.sh deleted file mode 100755 index 530ec97d8..000000000 --- a/kalipso.sh +++ /dev/null @@ -1,51 +0,0 @@ -#!/bin/bash -cd modules/kalipso -echo "To close all unused redis servers, run slips with --killall" -file="../../running_slips_info.txt" -# Declare a string array -declare -a open_redis_servers=() -declare -a ports=() - -while IFS= read -r line # read file line by line -do - # ignore line if it starts with # or has Date in it - if [[ ${line} =~ "Date" ]] || [[ ${line} =~ "#" ]]; then - continue - fi - - # set , as delimiter - IFS=',' - read -ra splitted_line <<< "$line" # line is read into an array as tokens separated by , - - # add the used file to open_redis_servers array - open_redis_servers[${#open_redis_servers[@]}]=${splitted_line[1]} - # append the used port to ports arr - ports[${#ports[@]}]=${splitted_line[2]} -done < "$file" - - - -if [[ ${#open_redis_servers[@]} -eq 0 ]]; then - echo "You have 0 open redis-servers to use. Make sure you run slips first" - exit 1 -# if we have only 1 server open, use it -elif [[ ${#open_redis_servers[@]} -eq 1 ]]; then - port_to_use=${ports[0]} -# if we have more than 1 open redis server in the arr, prompt which one to use -elif [[ ${#open_redis_servers[@]} -gt 0 ]]; then - echo "You have ${#open_redis_servers[@]} open redis servers, Choose which one to use [1,2,3 etc..] " - # ctr to print next to each server - ctr=1 - for value in "${open_redis_servers[@]}" - do - echo "[$ctr] $value - port ${ports[ctr-1]}" - let ctr=ctr+1 - done - # the user will choose 1,2,3 etc - read index - let index=index-1 - # get the pid in this index - port_to_use=${ports[index]} -fi -# run kalipso -node kalipso -l 2000 -p ${port_to_use} diff --git a/managers/ap_manager.py b/managers/ap_manager.py index e5a7d6f60..4b7597796 100644 --- a/managers/ap_manager.py +++ b/managers/ap_manager.py @@ -14,7 +14,7 @@ def store_ap_interfaces(self, input_information): """ stores the interfaces given with -ap to slips in the db """ - self.wifi_interface, self.eth_interface = input_information.split("_") + self.wifi_interface, self.eth_interface = input_information.split(",") interfaces = { "wifi_interface": self.wifi_interface, "ethernet_interface": self.eth_interface, diff --git a/managers/metadata_manager.py b/managers/metadata_manager.py index a8e02d8ce..7a6a631a8 100644 --- a/managers/metadata_manager.py +++ b/managers/metadata_manager.py @@ -1,7 +1,6 @@ # SPDX-FileCopyrightText: 2021 Sebastian Garcia -import subprocess - # SPDX-License-Identifier: GPL-2.0-only +import subprocess import psutil import sys import os @@ -121,8 +120,9 @@ def set_input_metadata(self): if self.main.args.interface: info.update({"interface": self.main.args.interface}) - if hasattr(self.main, "zeek_dir"): - info.update({"zeek_dir": self.main.zeek_dir}) + zeek_dir = self.main.db.get_zeek_output_dir() + if isinstance(zeek_dir, str) and zeek_dir: + info.update({"zeek_dir": zeek_dir}) if hasattr(self.main, "zeek_bro") and self.main.zeek_bro: info.update({"zeek_version": self.get_zeek_version()}) diff --git a/managers/process_manager.py b/managers/process_manager.py index 13e295f94..3d82c7eed 100644 --- a/managers/process_manager.py +++ b/managers/process_manager.py @@ -9,7 +9,6 @@ import sys import time import traceback -import threading from collections import OrderedDict from datetime import datetime from multiprocessing import ( @@ -32,7 +31,10 @@ import modules -from modules.update_manager.update_manager import UpdateManager +from managers.update_manager import UpdateManager +from modules.feeds_update_manager.feeds_update_manager import ( + FeedsUpdateManager, +) from slips_files.common.slips_utils import utils from slips_files.common.abstracts.imodule import ( IModule, @@ -41,9 +43,6 @@ from slips_files.common.style import green from slips_files.common.input_type import InputType -from slips_files.core.database.redis_db.timewindow_updater_thread.tw_updater import ( - timewindow_updater, -) from slips_files.core.evidence_handler import EvidenceHandler from slips_files.core.helpers.bloom_filters_manager import BFManager from slips_files.core.input import Input @@ -88,6 +87,7 @@ def __init__(self, main): # is set by the input process to indicate no more flows are coming # so profiler can safely begin shutdown/joins. self.is_input_done_event = Event() + self.is_slips_live_updating_event = Event() self.read_config() def read_config(self): @@ -99,6 +99,13 @@ def read_config(self): # self.bootstrap_p2p, self.boootstrapping_modules = self.main.conf. # get_bootstrapping_setting() + def start_slips_update_manager(self): + return UpdateManager( + database=self.main.db, + is_slips_live_updating_event=self.is_slips_live_updating_event, + print_func=self.main.print, + ) + def start_output_process(self, stderr, slips_logfile, stdout=""): output_process = Output( stdout=stdout, @@ -108,6 +115,7 @@ def start_output_process(self, stderr, slips_logfile, stdout=""): debug=self.main.args.debug, input_type=self.main.input_type, create_logfiles=False if self.main.args.stopdaemon else True, + slips_args=self.main.args, ) self.slips_logfile = output_process.slips_logfile return output_process @@ -155,7 +163,7 @@ def start_evidence_process(self): 1, 0, ) - self.main.db.store_pid("EvidenceHandler", int(evidence_process.pid)) + self.main.db.store_pid("evidence_handler", int(evidence_process.pid)) return evidence_process def start_input_process(self): @@ -174,10 +182,10 @@ def start_input_process(self): input_information=self.main.input_information, cli_packet_filter=self.main.args.pcapfilter, zeek_or_bro=self.main.zeek_bro, - zeek_dir=self.main.zeek_dir, line_type=self.main.line_type, is_profiler_done_event=self.is_profiler_done_event, is_input_done_event=self.is_input_done_event, + is_slips_live_updating_event=self.is_slips_live_updating_event, ) input_process.start() self.main.print( @@ -266,7 +274,7 @@ def is_bootstrapping_module(self, module_name: str) -> bool: return False def is_abstract_module(self, obj) -> bool: - return obj.name in ("IModule", "AsyncModule") + return obj.name in ("imodule", "iasync_module") def get_modules(self): """ @@ -356,11 +364,11 @@ def _load_valid_classes_from_module(self, module, plugins): def _prioritize_blocking_modules(self, plugins): """ - Changes the order of the blocking modules (ARP poisoner and - Blocking) to load them before the rest of the modules + Changes the order of the blocking modules (`arp_poisoner` and + `blocking`) to load them before the rest of the modules so they can receive msgs sent from other modules """ - blocking_modules = ("Blocking", "ARP Poisoner") + blocking_modules = ("blocking", "arp_poisoner") at_least_one_blocking_module_is_loaded = False for module in blocking_modules: @@ -428,7 +436,7 @@ def print_started_module( self, module_name: str, module_pid: int, module_description: str ) -> None: self.main.print( - f"\t\tStarting the module {green(module_name)} " + f"\t\tStarting {green(module_name)} module " f"({module_description}) " f"[PID {green(module_pid)}]", 1, @@ -458,26 +466,6 @@ def init_bloom_filters_manager(self): self.main.pid, ) - def start_timewindow_updater(self): - """ - Starts a thread that keeps track of the current timewindow if - running on an interface - - why is this not started in the redis db? because each module - has a db insteance, and we don't want a thread per module, - so starrting this thread once in main is enough - """ - if not self.main.args.interface: - return - tw_width: float = self.main.conf.get_tw_width_in_seconds() - t = threading.Thread( - target=timewindow_updater, - name="timewindow_updater", - args=(self.main.db, tw_width, self.termination_event), - daemon=True, - ) - utils.start_thread(t, self.main.db) - def start_update_manager(self, local_files=False, ti_feeds=False): """ starts the update manager process @@ -497,7 +485,7 @@ def start_update_manager(self, local_files=False, ti_feeds=False): with Lock(name="slips_ports_and_orgs"): # pass a dummy termination event for update manager to # update orgs and ports info - update_manager = UpdateManager( + update_manager = FeedsUpdateManager( self.main.logger, self.main.args.output, self.main.redis_port, @@ -541,9 +529,9 @@ def warn_about_pending_modules(self, pending_modules: List[Process]): ) # check if update manager is still alive - if "Update Manager" in pending_module_names: + if "feeds_update_manager" in pending_module_names: self.main.print( - "Update Manager may take several minutes " + "feeds_update_manager may take several minutes " "to finish updating 45+ TI files." ) @@ -563,16 +551,16 @@ def get_hitlist_in_order(self) -> Tuple[List[Process], List[Process]]: # slips won't reach this function unless they are done already. # so no need to kill them last pids_to_kill_last = [ - self.main.db.get_pid_of("EvidenceHandler"), + self.main.db.get_pid_of("evidence_handler"), ] if self.main.args.blocking: - pids_to_kill_last.append(self.main.db.get_pid_of("Blocking")) - pids_to_kill_last.append(self.main.db.get_pid_of("ARP Poisoner")) + pids_to_kill_last.append(self.main.db.get_pid_of("blocking")) + pids_to_kill_last.append(self.main.db.get_pid_of("arp_poisoner")) if "exporting_alerts" not in self.main.db.get_disabled_modules(): pids_to_kill_last.append( - self.main.db.get_pid_of("Exporting Alerts") + self.main.db.get_pid_of("exporting_alerts") ) # remove all None PIDs. this happens when a module in that list # isnt started in the current run. e.g. virustotal module starts then @@ -638,6 +626,11 @@ def should_stop_slips(self) -> bool: This function NEVER returns True if the input and profiler are still processing. """ + if self.is_slips_live_updating_event.is_set(): + # slips is auto updating this version of slips should stop and + # the updated one will start + return True + if self.should_run_non_stop(): return False @@ -658,7 +651,7 @@ def is_stop_msg_received(self) -> bool: return ( utils.is_msg_intended_for(message, "control_channel") - and message["data"] == "stop_slips" + and utils.get_msg_payload(message) == "stop_slips" ) def is_debugger_active(self) -> bool: @@ -780,6 +773,21 @@ def get_print_function(self): else: return self.main.print + def _generate_plots(self): + if self.is_slips_live_updating_event: + # slips is updating and will start a new instance, plots + # should be done when slips is actually shutting down at the + # very end of the analysis. + return + + if self.main.conf.generate_performance_plots() is True: + self.plotter = Plotter(self.main.args.output, print) + self.plotter.plot_latency_csv() + self.plotter.plot_profiler_latency_csvs() + self.plotter.plot_throughput_csv() + self.plotter.write_throughput_metrics() + self.plotter.plot_flows_from_conn_log() + def shutdown_gracefully(self): """ Waits for all modules to confirm that they're done processing @@ -787,13 +795,8 @@ def shutdown_gracefully(self): """ try: print = self.get_print_function() - if self.main.conf.generate_performance_plots() is True: - self.plotter = Plotter(self.main.args.output, print) - self.plotter.plot_latency_csv() - self.plotter.plot_profiler_latency_csvs() - self.plotter.plot_throughput_csv() - self.plotter.write_throughput_metrics() - self.plotter.plot_flows_from_conn_log() + + self._generate_plots() if not self.main.args.stopdaemon: print("\n" + "-" * 27) @@ -802,17 +805,19 @@ def shutdown_gracefully(self): self.children: List[BaseProcess] = ( multiprocessing.active_children() ) - # by default, max 15 mins (taken from wait_for_modules_to_finish) - # from this time, all modules should be killed method_start_time = time.time() - # how long to wait for modules to finish in minutes + # how long to wait for modules to finish in minutes before + # killing them timeout: float = self.main.conf.wait_for_modules_to_finish() # convert to seconds timeout *= 60 - # close all tws - self.main.db.check_tw_to_close(close_all=True) + # dont close tws if we're updating, the next slips will continue + # from where this slips left off. + if not self.is_slips_live_updating_event.is_set(): + # close all tws + self.main.db.check_tw_to_close(close_all=True) graceful_shutdown = True if self.main.mode == "daemonized": @@ -868,20 +873,19 @@ def shutdown_gracefully(self): self.kill_all_children() - if self.main.args.save: - self.main.save_the_db() - - if self.main.conf.export_labeled_flows(): - format_ = self.main.conf.export_labeled_flows_to().lower() - self.main.db.export_labeled_flows(format_) - - # if store_a_copy_of_zeek_files is set to yes in slips.yaml - # copy the whole zeek_files dir to the output dir - self.main.store_zeek_dir_copy() + if not self.is_slips_live_updating_event.is_set(): + if self.main.args.save: + self.main.save_the_db() + if self.main.conf.export_labeled_flows(): + format_ = self.main.conf.export_labeled_flows_to().lower() + self.main.db.export_labeled_flows(format_) - # if delete_zeek_files is set to yes in slips.yaml, - # delete zeek_files/ dir - self.main.delete_zeek_files() + # if store_a_copy_of_zeek_files is set to yes in slips.yaml + # copy the whole zeek_files dir to the output dir + self.main.store_zeek_dir_copy() + # if delete_zeek_files is set to yes in slips.yaml, + # delete zeek_files/ dir + self.main.delete_zeek_files() analysis_time, end_date = self.get_analysis_time() self.main.metadata_man.set_analysis_end_date(end_date) @@ -896,6 +900,14 @@ def shutdown_gracefully(self): self.main.db.close_all_dbs() if graceful_shutdown: + if self.is_slips_live_updating_event.is_set(): + print( + "[Process Manager] Slips is live updating, " + "Stopping this instance and starting the new " + "instance now.\n", + log_to_logfiles_only=True, + ) + print( "[Process Manager] Slips shutdown gracefully\n", log_to_logfiles_only=True, diff --git a/managers/redis_manager.py b/managers/redis_manager.py index 989493d1a..36c1b653e 100644 --- a/managers/redis_manager.py +++ b/managers/redis_manager.py @@ -66,9 +66,11 @@ def log_redis_server_pid(self, redis_port: int, redis_pid: int): "Save the DB\n" ) + zeek_dir = self.main.db.get_zeek_output_dir() + f.write( f"{now},{self.main.input_information},{redis_port}," - f"{redis_pid},{self.main.zeek_dir},{self.main.args.output}," + f"{redis_pid},{zeek_dir},{self.main.args.output}," f"{os.getpid()}," f"{bool(self.main.args.daemon)},{self.main.args.save}\n" ) @@ -94,7 +96,7 @@ def load_redis_db(self, redis_port): print( f"{self.main.args.db} loaded successfully.\n" - f"Run ./kalipso.sh and choose port {redis_port}" + f"Run ./webinterface.sh and choose port {redis_port}" ) def load_db(self): @@ -380,6 +382,14 @@ def get_redis_port(self) -> int: -m or the default port if all ports are unavailable, this function terminates slips """ + # when slips is started by another slips during an update + # handover, make sure the new slips + # continues using the same old redis db and port. + if self.main.args.is_slips_started_by_an_update: + if self.main.args.port: + return int(self.main.args.port) + return DEFAULT_REDIS_PORT + if self.main.args.port: redis_port = int(self.main.args.port) # if the default port is already in use, slips should override it diff --git a/managers/ui_manager.py b/managers/ui_manager.py index c3e8bf5d4..3373d0b24 100644 --- a/managers/ui_manager.py +++ b/managers/ui_manager.py @@ -5,6 +5,7 @@ import subprocess import os +import sys import threading from multiprocessing import Queue @@ -60,7 +61,7 @@ def run_webinterface(): # in slips not being able to # get the PID of the python proc started by the .sh script # so we'll start it with python instead - command = ["python3", "-m", "webinterface.app"] + command = [sys.executable, "-m", "webinterface.app"] webinterface = subprocess.Popen( command, diff --git a/managers/update_manager.py b/managers/update_manager.py new file mode 100644 index 000000000..5a526b244 --- /dev/null +++ b/managers/update_manager.py @@ -0,0 +1,365 @@ +# SPDX-FileCopyrightText: 2021 Sebastian Garcia +# SPDX-License-Identifier: GPL-2.0-only + + +""" +Handles updating of slips version +""" + +import json +import re +import subprocess +import sys +import time +from typing import Any, Dict, List, Optional +from urllib import error, request + +import psutil +from git import ( + GitCommandError, + GitError, + InvalidGitRepositoryError, + NoSuchPathError, + Repo, +) +from slips_files.common.parsers.config_parser import ConfigParser +from slips_files.common.slips_utils import utils +from slips_files.core.database.database_manager import DBManager + + +class UpdateManager: + def __init__( + self, + database: DBManager = None, + is_slips_live_updating_event=None, + print_func=None, + ): + self.db = database + self.is_slips_live_updating_event = is_slips_live_updating_event + self.is_running_non_stop: bool = self.db.is_running_non_stop() + self.cached_update_info: Optional[Dict[str, Any]] = None + self.conf = ConfigParser() + self.args = self.conf.get_args() + # The very first time, slips is started by the user via CLI. then + # for each new update, it's started by this update manager. + # this func returns true if the user just started slips from cli. + self.is_first_run: bool = ( + True if not self.args.is_slips_started_by_an_update else False + ) + self._read_configuration() + self.last_update_time = 0 + self.print = print_func + + def _read_configuration(self): + self.auto_update_slips_enabled = self.conf.auto_update_slips() + + def _get_master_update_json_link(self) -> Optional[str]: + """ + Build the raw GitHub URL for update.json on the master branch. + + Returns: + The raw update.json URL if the origin remote is supported, + otherwise None. + """ + try: + remote_url = Repo(".").remote("origin").url + except (ValueError, InvalidGitRepositoryError, NoSuchPathError): + return None + + remote_url = remote_url.strip().removesuffix(".git").rstrip("/") + github_prefixes = ( + "https://github.com/", + "http://github.com/", + "ssh://git@github.com/", + ) + + repo_path = None + if remote_url.startswith("git@github.com:"): + repo_path = remote_url.split(":", maxsplit=1)[1] + else: + for prefix in github_prefixes: + if remote_url.startswith(prefix): + repo_path = remote_url.removeprefix(prefix) + break + + if not repo_path: + return None + + return ( + f"https://raw.githubusercontent.com/{repo_path}/master/update.json" + ) + + def _read_master_update_json(self) -> Dict[str, Any]: + """ + Read the update.json file from the origin/master branch of slips repo. + + Returns: + Parsed update metadata if it can be fetched and decoded, + otherwise an empty dictionary. + """ + if self.cached_update_info is not None: + return self.cached_update_info + + update_json_link = self._get_master_update_json_link() + if not update_json_link: + self.cached_update_info = {} + return self.cached_update_info + + try: + with request.urlopen(update_json_link, timeout=5) as response: + update_text = response.read().decode("utf-8") + except (OSError, UnicodeDecodeError, error.URLError): + self.cached_update_info = {} + return self.cached_update_info + + sanitized_update_text = re.sub(r",(\s*[}\]])", r"\1", update_text) + try: + update_data = json.loads(sanitized_update_text) + except json.JSONDecodeError: + self.cached_update_info = {} + return self.cached_update_info + + self.cached_update_info = ( + update_data if isinstance(update_data, dict) else {} + ) + return self.cached_update_info + + def _new_version_has_new_dependencies(self) -> bool: + """ + Check whether the version on master introduces new dependencies. + + Returns: + True if update.json reports new dependencies or the metadata + cannot be read safely, otherwise False. + """ + update_data = self._read_master_update_json() + return bool(update_data.get("has_new_dependencies", True)) + + def _is_new_version_backwards_compatible(self) -> bool: + """ + Check whether the version on master is backwards compatible. + + Returns: + True if update.json marks the update as backwards compatible, + otherwise False. + """ + update_data = self._read_master_update_json() + return bool(update_data.get("backwards_compatible", False)) + + def _is_new_version_available(self) -> bool: + update_data = self._read_master_update_json() + latest_version = update_data.get("version", False) + + if not latest_version: + return False + + return utils.get_current_version() != latest_version + + def git_pull_master(self): + """ + Pull the latest origin/master changes and check them out. + + Returns: + The checked out origin/master commit. + """ + repo = Repo(".") + repo.remote("origin").fetch("master") + repo.git.checkout("origin/master") + self.print( + "Done pulling new version and checking out master " "branch." + ) + + def _get_checkout_overwritten_files( + self, git_error: GitCommandError + ) -> List[str]: + """ + Extract files Git says would be overwritten by checkout. + we'll just print them to the user. + + Parameters: + git_error: The GitPython checkout failure. + + Returns: + The local paths reported by Git, or an empty list if this is not + a local-change checkout conflict. + """ + stderr = getattr(git_error, "stderr", "") or str(git_error) + if ( + "Your local changes to the following files would be " + "overwritten by checkout" not in stderr + ): + return [] + + files = [] + is_file_list = False + for line in stderr.splitlines(): + stripped_line = line.strip().strip("'") + if ( + "Your local changes to the following files would be " + "overwritten by checkout" in stripped_line + ): + is_file_list = True + continue + + if not is_file_list: + continue + + if stripped_line.startswith(("Please commit", "Aborting")): + break + + if stripped_line: + files.append(stripped_line) + + return files + + def _get_target_update_version(self) -> Optional[str]: + """ + Get the target Slips version from cached update metadata. + + Returns: + The update version if known, otherwise None. + """ + update_data = ( + self.cached_update_info or self._read_master_update_json() + ) + version = update_data.get("version") + return version if isinstance(version, str) and version else None + + def _get_updated_slips_command(self) -> List[str]: + """ + Build the command used to start the updated Slips process. + + Returns: + The current Slips cmd plus (-u). If the current Slips was + started with -m, pass the current Redis port explicitly so the + updated process reuses it. + """ + try: + cmd = psutil.Process().cmdline() + except psutil.Error: + cmd = [] + + if not cmd: + cmd = [sys.executable, *sys.argv] + + cmd = [*cmd, "-u"] + + if self.args.multiinstance: + cmd.remove("-m") + redis_port = self.db.get_used_redis_port() + cmd.extend(["-P", str(redis_port)]) + + return cmd + + def start_updated_slips_version(self) -> subprocess.Popen: + """ + Starts the updated Slips as an independent process. + + Returns: + The detached process handle for the updated Slips process. + """ + cmd: List[str] = self._get_updated_slips_command() + + str_cmd = " ".join(cmd) + self.print(f"Starting updated Slips version using command: {str_cmd}") + + # without dev/null redirection, the new updated slips will use the + # same cli as the old slips. so this is intentional. + process = subprocess.Popen( + cmd, + close_fds=True, + ) + + self.print("Done starting the updated Slips version.") + return process + + def _warn_about_aborted_update( + self, git_error: Optional[GitCommandError] = None + ): + overwritten_files = self._get_checkout_overwritten_files(git_error) + if not overwritten_files: + self.print( + "Warning: Aborting Slips update because a git error " + f"occurred: {git_error}" + ) + return + + target_version = self._get_target_update_version() + update_target = ( + f"Slips v{target_version}" + if target_version + else "the new Slips version" + ) + self.print( + f"Warning: Uncommitted changes to {overwritten_files} detected. " + f"Aborting update to {update_target}, please update Slips " + "manually." + ) + + def update_slips(self): + try: + self.git_pull_master() + except GitError as git_error: + self._warn_about_aborted_update(git_error) + return + + self.start_updated_slips_version() + # this event + # - signals input.py to stop recving input and start draining flows + # - and signals the process_manager() to call shutdown_gracefully() + self.is_slips_live_updating_event.set() + + def _did_1d_pass_since_last_update(self) -> bool: + """ + returns true once every 1 day. + """ + update_interval = 60 * 60 * 24 + if time.time() >= self.last_update_time + update_interval: + self.last_update_time = time.time() + return True + return False + + def check_for_update_every_1_day(self) -> bool: + """ + return sTrue if a new compatible version is available and slips + should update itself + """ + if self._did_1d_pass_since_last_update(): + should_update: bool = self.should_update_slips() + + if should_update: + self.print( + "A new version of Slips is available. " + "Updating slips now." + ) + else: + self.print( + "No new version of Slips is available. " + "Slips will check again after 1 day." + ) + return should_update + return False + + def should_update_slips(self) -> bool: + """ + returns true if the auto_update param in the config file is set to + true, and we're running on an interface, and there is a new + compatible version of slips. + """ + if not self.auto_update_slips_enabled: + return False + + if not self.is_running_non_stop: + # only update slips when running on an interface. + return False + + if not self._is_new_version_available(): + return False + + if ( + self._is_new_version_backwards_compatible() + and not self._new_version_has_new_dependencies() + ): + return True + + return False diff --git a/modules/anomaly_detection_https/anomaly_detection_https.py b/modules/anomaly_detection_https/anomaly_detection_https.py index 88e7fe12b..726143f7f 100644 --- a/modules/anomaly_detection_https/anomaly_detection_https.py +++ b/modules/anomaly_detection_https/anomaly_detection_https.py @@ -2,7 +2,6 @@ # SPDX-License-Identifier: GPL-2.0-only import json import math -import os import time from dataclasses import dataclass, field from datetime import datetime, timezone @@ -124,7 +123,9 @@ def update_min_std_floor(self): candidate = self.floor_scale * max(q10, sigma_mad, self.floor_min) candidate = min(self.floor_max, max(self.floor_min, candidate)) beta = min(1.0, max(0.0, self.floor_update_beta)) - self.min_std_floor = (1.0 - beta) * self.min_std_floor + beta * candidate + self.min_std_floor = ( + 1.0 - beta + ) * self.min_std_floor + beta * candidate def zscore(self, value: float) -> float: std = math.sqrt(max(self.var, self.min_std_floor * self.min_std_floor)) @@ -203,7 +204,7 @@ class HostState: class AnomalyDetectionHTTPS(IModule): - name = "Anomaly Detection HTTPS" + name = "anomaly_detection_https" description = ( "HTTPS anomaly detector with hourly adaptive baselines and " "flow-level checks." @@ -213,8 +214,8 @@ class AnomalyDetectionHTTPS(IModule): def init(self): self.classifier = FlowClassifier() self.read_configuration() - self.operational_log_path = os.path.join( - self.output_dir, "anomaly_detection_https.log" + self.operational_log_path = self.get_module_specific_output_path( + "anomaly_detection_https.log" ) self.host_states: Dict[str, HostState] = {} @@ -262,9 +263,7 @@ def subscribe_to_channels(self): def read_configuration(self): conf = ConfigParser() self.training_hours = conf.https_anomaly_training_hours() - self.training_fit_method = ( - conf.https_anomaly_training_fit_method() - ) + self.training_fit_method = conf.https_anomaly_training_fit_method() self.training_alpha = conf.https_anomaly_training_alpha() self.hourly_zscore_threshold = conf.https_anomaly_hourly_zscore_thr() self.flow_zscore_threshold = conf.https_anomaly_flow_zscore_thr() @@ -279,9 +278,7 @@ def read_configuration(self): self.ja3_min_variants_per_server = ( conf.https_anomaly_ja3_min_variants_per_server() ) - self.requested_use_adwin_drift = ( - conf.https_anomaly_use_adwin_drift() - ) + self.requested_use_adwin_drift = conf.https_anomaly_use_adwin_drift() self.adwin_delta = conf.https_anomaly_adwin_delta() self.adwin_clock = conf.https_anomaly_adwin_clock() self.adwin_grace_period = conf.https_anomaly_adwin_grace_period() @@ -379,9 +376,7 @@ def log_event( reset = "\033[0m" if self.log_colors else "" wall_clock = self._ts_to_iso() traffic_clock = ( - self._ts_to_iso(traffic_ts) - if traffic_ts is not None - else "n/a" + self._ts_to_iso(traffic_ts) if traffic_ts is not None else "n/a" ) metrics_json = json.dumps(metrics, sort_keys=True) line = ( @@ -390,7 +385,9 @@ def log_event( ) if color: line = f"{color}{line}{reset}" - with open(self.operational_log_path, "a", encoding="utf-8") as log_file: + with open( + self.operational_log_path, "a", encoding="utf-8" + ) as log_file: log_file.write(f"{line}\n") @staticmethod @@ -405,7 +402,9 @@ def to_float(value, default=0.0) -> float: except (TypeError, ValueError): return float(default) - def get_traffic_ts(self, flow, fallback_ts: Optional[float] = None) -> float: + def get_traffic_ts( + self, flow, fallback_ts: Optional[float] = None + ) -> float: """ Returns traffic timestamp from flow.starttime. Detection windows must use traffic time, not host wall-clock time. @@ -621,7 +620,9 @@ def evidence_ts_from_traffic_ts(ts: float) -> str: ) @staticmethod - def threat_level_from_confidence_level(confidence_level: str) -> ThreatLevel: + def threat_level_from_confidence_level( + confidence_level: str, + ) -> ThreatLevel: # Requested policy: # - confidence low/medium -> threat level low # - confidence high -> threat level medium @@ -694,9 +695,9 @@ def emit_anomaly_evidence( threshold = reason.get( "threshold", ( - self.flow_zscore_threshold - if feature == "bytes_to_known_server" - else self.hourly_zscore_threshold + self.flow_zscore_threshold + if feature == "bytes_to_known_server" + else self.hourly_zscore_threshold ), ) @@ -729,7 +730,11 @@ def emit_anomaly_evidence( f"reason={reason_name}; value={value}; why={why}" ) - reasons_text = " | ".join(reason_parts) if reason_parts else "reason=Unknown; value=; why=not provided" + reasons_text = ( + " | ".join(reason_parts) + if reason_parts + else "reason=Unknown; value=; why=not provided" + ) description = ( f"HTTPS anomaly: type={kind}; confidence={confidence.get('level')} " f"({confidence_score:.3f}); {reasons_text}." @@ -883,9 +888,8 @@ def finalize_hour_bucket(self, profileid: str, state: HostState): ssl_flows = float(bucket.ssl_flows) known_server_avg_bytes = 0.0 if bucket.known_servers_flow_count > 0: - known_server_avg_bytes = ( - bucket.known_servers_total_bytes - / float(bucket.known_servers_flow_count) + known_server_avg_bytes = bucket.known_servers_total_bytes / float( + bucket.known_servers_flow_count ) features = { @@ -1210,7 +1214,8 @@ def process_ssl_event( twid_number: int, ): ts = self.get_traffic_ts( - ssl_flow, fallback_ts=self.to_float(conn_info.get("starttime"), 0.0) + ssl_flow, + fallback_ts=self.to_float(conn_info.get("starttime"), 0.0), ) state = self.ensure_hour_bucket(profileid, ts) state.last_twid = twid_number @@ -1478,9 +1483,7 @@ def process_ssl_event( "flow_raw_signals": flow_raw_signals, "alpha": alpha, "fit_method": ( - flow_training_fit_method - if alpha is None - else "ewma" + flow_training_fit_method if alpha is None else "ewma" ), }, ) diff --git a/modules/arp/arp.py b/modules/arp/arp.py index f83bf9484..a6848a679 100644 --- a/modules/arp/arp.py +++ b/modules/arp/arp.py @@ -29,7 +29,7 @@ class ARP(IModule): - name = "ARP" + name = "arp" description = "Detect ARP attacks" authors = ["Alya Gomaa"] @@ -566,7 +566,7 @@ def main(self): # if the tw is closed, remove all its entries from the cache dict if msg := self.get_msg("tw_closed"): - profileid_tw = msg["data"] + profileid_tw = utils.get_msg_payload(msg) # when a tw is closed, this means that it's too # old so we don't check for arp scan in this time # range anymore diff --git a/modules/arp/filter.py b/modules/arp/filter.py index fa3a8449f..51ae0bb18 100644 --- a/modules/arp/filter.py +++ b/modules/arp/filter.py @@ -37,7 +37,7 @@ def is_self_defense(self, ip: str): return ( ip in self.our_ips and self.args.blocking - and "ARP Poisoner" in loaded_modules + and "arp_poisoner" in loaded_modules ) def is_slips_peer(self, ip: str) -> bool: diff --git a/modules/arp_poisoner/arp_poisoner.py b/modules/arp_poisoner/arp_poisoner.py index ed43242c3..44124af08 100644 --- a/modules/arp_poisoner/arp_poisoner.py +++ b/modules/arp_poisoner/arp_poisoner.py @@ -1,7 +1,7 @@ # SPDX-FileCopyrightText: 2021 Sebastian Garcia # SPDX-License-Identifier: GPL-2.0-only import logging -import os +import shutil import subprocess import time from threading import Lock @@ -26,20 +26,24 @@ def generate_fake_mac(): class ARPPoisoner(IModule): - name = "ARP Poisoner" + name = "arp_poisoner" description = "ARP poisons attackers to isolate them from the network." authors = ["Alya Gomaa"] def init(self): + self.arp_scan_path = shutil.which("arp-scan") + self.arp_scan_bin_available = self.arp_scan_path is not None self._time_since_last_repoison = {} self._time_since_last_internet_cut = {} - self.log_file_path = os.path.join(self.output_dir, "arp_poisoning.log") + self.log_file_path = self.get_module_specific_output_path( + "arp_poisoning.log" + ) self.blocking_logfile_lock = Lock() # clear it - try: - open(self.log_file_path, "w").close() - except FileNotFoundError: - pass + utils.initialize_logfile( + self.log_file_path, + getattr(self.args, "is_slips_started_by_an_update", False), + ) self.unblocker = ARPUnblocker( self.db, self.should_stop, self.logger, self.log ) @@ -55,6 +59,9 @@ def init(self): self.ip_interface_map = {} def subscribe_to_channels(self): + if not self.arp_scan_bin_available: + self.channels = {} + return self.c1 = self.db.subscribe("new_blocking") self.c2 = self.db.subscribe("tw_closed") self.channels = { @@ -62,6 +69,22 @@ def subscribe_to_channels(self): "tw_closed": self.c2, } + def pre_main(self) -> bool: + """ + Stop the module before entering the main loop when arp-scan is + unavailable. + + :return: True when the module should shut down, otherwise False. + """ + if self.arp_scan_bin_available: + return False + + self.print( + "The arp-scan tool is not installed. ARP poisoner module is " + "stopping.", + ) + return True + def log(self, text): """Logs the given text to the blocking log file""" with self.blocking_logfile_lock: @@ -413,7 +436,7 @@ def main(self): # if slips saw 3 ips, this channel will receive 3 msgs with tw1 # as closed. we're not interested in the ips, we just wanna # know when slips advances to the next tw. - profileid_tw = msg["data"].split("_") + profileid_tw = utils.get_msg_payload(msg).split("_") twid = profileid_tw[-1] if self.last_closed_tw != twid: self.last_closed_tw = twid diff --git a/modules/blocking/blocking.py b/modules/blocking/blocking.py index 02658c68e..9093952e0 100644 --- a/modules/blocking/blocking.py +++ b/modules/blocking/blocking.py @@ -24,7 +24,7 @@ class Blocking(IModule): by default this module flushes all slipsBlocking chains before it starts""" # Name: short name of the module. Do not use spaces - name = "Blocking" + name = "blocking" description = "Block malicious IPs connecting to this device" authors = ["Sebastian Garcia, Alya Gomaa"] @@ -36,13 +36,15 @@ def init(self): self.firewall = self._determine_linux_firewall() self.sudo = utils.get_sudo_according_to_env() self._init_chains_in_firewall() - self.blocking_log_path = os.path.join(self.output_dir, "blocking.log") + self.blocking_log_path = self.get_module_specific_output_path( + "blocking.log" + ) self.blocking_logfile_lock = Lock() # clear it - try: - open(self.blocking_log_path, "w").close() - except FileNotFoundError: - pass + utils.initialize_logfile( + self.blocking_log_path, + getattr(self.args, "is_slips_started_by_an_update", False), + ) self.last_closed_tw = None self.ap_info: None | Dict[str, str] = self.db.get_ap_info() @@ -272,7 +274,7 @@ def main(self): # if slips saw 3 ips, this channel will receive 3 msgs with tw1 # as closed. we're not interested in the ips, we just wanna # know when slips advances to the next tw. - profileid_tw = msg["data"].split("_") + profileid_tw = utils.get_msg_payload(msg).split("_") twid = profileid_tw[-1] if self.last_closed_tw != twid: self.last_closed_tw = twid diff --git a/modules/fidesModule/evaluation/__init__.py b/modules/brute_force_detector/__init__.py similarity index 100% rename from modules/fidesModule/evaluation/__init__.py rename to modules/brute_force_detector/__init__.py diff --git a/modules/bruteforcing/bruteforcing.py b/modules/brute_force_detector/brute_force_detector.py similarity index 91% rename from modules/bruteforcing/bruteforcing.py rename to modules/brute_force_detector/brute_force_detector.py index 017026ef2..cae097f27 100644 --- a/modules/bruteforcing/bruteforcing.py +++ b/modules/brute_force_detector/brute_force_detector.py @@ -61,12 +61,13 @@ class SSHBruteforceCampaign: reported_bucket: int = -1 -class Bruteforcing(IModule): - name = "Bruteforcing" +class BruteforceDetector(IModule): + name = "brute_force_detector" description = ( - "Detect SSH bruteforcing using ssh.log, software.log, and Zeek notices." + "Detect SSH brute forcing using ssh.log, software.log, and Zeek " + "notices." ) - authors = ["Sebastian Garcia", "OpenAI"] + authors = ["Sebastian Garcia"] ssh_full_confidence_attempts = 30 def init(self): @@ -93,10 +94,12 @@ def pre_main(self): def read_configuration(self): conf = ConfigParser() - self.ssh_attempt_threshold = conf.ssh_bruteforcing_threshold() + self.ssh_attempt_threshold = conf.ssh_brute_force_detector_threshold() @staticmethod - def _campaign_key(profileid: str, twid: str, daddr: str, dport: str) -> str: + def _campaign_key( + profileid: str, twid: str, daddr: str, dport: str + ) -> str: return f"{profileid}_{twid}:dst:{daddr}:dport:{dport}" @staticmethod @@ -150,7 +153,9 @@ def _get_reporting_bucket(self, attempts: int) -> int: if attempts < self.ssh_attempt_threshold: return -1 # Emit frequently near the threshold, then increasingly sparsely. - return int(math.log2(max(1, attempts - self.ssh_attempt_threshold + 1))) + return int( + math.log2(max(1, attempts - self.ssh_attempt_threshold + 1)) + ) def _get_banner_bonus(self, banner: str, source: str) -> float: if not banner: @@ -161,7 +166,9 @@ def _get_banner_bonus(self, banner: str, source: str) -> float: bonus += 0.03 normalized_banner = banner.lower() - if any(token in normalized_banner for token in AUTOMATION_BANNER_TOKENS): + if any( + token in normalized_banner for token in AUTOMATION_BANNER_TOKENS + ): bonus += 0.07 elif any( token in normalized_banner for token in KNOWN_CLIENT_BANNER_TOKENS @@ -239,11 +246,9 @@ def _build_campaign_description( ) -> str: port_label = self._get_port_label(campaign.dport) target = campaign.daddr or "an SSH server" - destination = ( - f"{target} on {port_label}" if port_label else target - ) + destination = f"{target} on {port_label}" if port_label else target description = ( - f"SSH bruteforcing from {campaign.saddr} to {destination}. " + f"SSH brute force detector from {campaign.saddr} to {destination}. " f"Attempts observed: {campaign.attempts}." ) if banner: @@ -285,13 +290,15 @@ def _set_campaign_evidence( ioc_type=IoCType.IP, value=campaign.saddr, ), - victim=Victim( - direction=Direction.DST, - ioc_type=IoCType.IP, - value=campaign.daddr, - ) - if utils.is_valid_ip(campaign.daddr) - else False, + victim=( + Victim( + direction=Direction.DST, + ioc_type=IoCType.IP, + value=campaign.daddr, + ) + if utils.is_valid_ip(campaign.daddr) + else False + ), threat_level=ThreatLevel.MEDIUM, confidence=confidence, description=description, @@ -307,7 +314,7 @@ def _set_campaign_evidence( def _set_notice_evidence(self, profileid: str, twid: str, flow): srcip = flow.saddr description = ( - f"SSH bruteforcing. {flow.msg}. " + f"SSH brute force detector. {flow.msg}. " f"Confirmed by Zeek notice.log. Confidence: 1.0. by Zeek" ) evidence = Evidence( @@ -378,7 +385,10 @@ def _handle_notice(self, profileid: str, twid: str, flow): ) confirmation["msg"] = flow.msg confirmation["attempts"] = str( - max(int(confirmation["attempts"]), self._parse_notice_attempts(flow.msg)) + max( + int(confirmation["attempts"]), + self._parse_notice_attempts(flow.msg), + ) ) if confirmation["reported"] != "true": @@ -463,4 +473,4 @@ def main(self): self._handle_ssh(profileid, twid, flow) if msg := self.get_msg("tw_closed"): - self.cleanup_cache_dicts(msg["data"].split("_")) + self.cleanup_cache_dicts(utils.get_msg_payload(msg).split("_")) diff --git a/modules/bruteforcing/__init__.py b/modules/bruteforcing/__init__.py deleted file mode 100644 index 8b1378917..000000000 --- a/modules/bruteforcing/__init__.py +++ /dev/null @@ -1 +0,0 @@ - diff --git a/modules/cesnet/cesnet.py b/modules/cesnet/cesnet.py index 78ac5233d..01fbb3561 100644 --- a/modules/cesnet/cesnet.py +++ b/modules/cesnet/cesnet.py @@ -23,7 +23,7 @@ class CESNET(IModule): - name = "CESNET" + name = "cesnet" description = "Send and receive alerts from warden servers." authors = ["Alya Gomaa"] @@ -255,7 +255,12 @@ def pre_main(self): return 1 # create the warden client - self.wclient = Client(**read_cfg(self.configuration_file)) + self.wclient = Client( + **read_cfg(self.configuration_file), + is_slips_started_by_an_update=getattr( + self.args, "is_slips_started_by_an_update", False + ), + ) # All methods return something. # If you want to catch possible errors (for example implement some diff --git a/modules/cesnet/warden_client.py b/modules/cesnet/warden_client.py index 83bacbaa7..bcd021b61 100644 --- a/modules/cesnet/warden_client.py +++ b/modules/cesnet/warden_client.py @@ -17,6 +17,8 @@ from operator import itemgetter from pathlib import Path +from slips_files.common.slips_utils import utils + VERSION = "3.0-beta2" @@ -181,11 +183,13 @@ def __init__( idstore=None, name="org.example.warden.test", secret=None, + is_slips_started_by_an_update: bool = False, ): if errlog is None: errlog = {} self.name = name self.secret = secret + self.is_slips_started_by_an_update = is_slips_started_by_an_update # Init logging as soon as possible and make sure we don't # spit out exceptions but just log or return Error objects self.init_log(errlog, syslog, filelog) @@ -221,7 +225,11 @@ def create_file(self, filepath): # filename = path.basename(filepath) p = Path(dir) p.mkdir(parents=True, exist_ok=True) - open(filepath, "w").close() + utils.initialize_logfile( + filepath, + self.is_slips_started_by_an_update, + create_parent_dirs=False, + ) def init_log(self, errlog: dict, syslog: dict, filelog: dict): def loglevel(lev): @@ -650,6 +658,6 @@ def format_time( def read_cfg(cfgfile): with open(cfgfile, "r") as f: stripcomments = "\n".join( - (l for l in f if not l.lstrip().startswith(("#", "//"))) + (line for line in f if not line.lstrip().startswith(("#", "//"))) ) return json.loads(stripcomments) diff --git a/modules/cyst/cyst.py b/modules/cyst/cyst.py index 76e5b0fff..254d2ac1e 100644 --- a/modules/cyst/cyst.py +++ b/modules/cyst/cyst.py @@ -17,7 +17,7 @@ class Module(IModule): # Name: short name of the module. Do not use spaces - name = "CYST" + name = "cyst" description = "Communicates with CYST simulation framework" authors = ["Alya Gomaa"] diff --git a/modules/exporting_alerts/exporting_alerts.py b/modules/exporting_alerts/exporting_alerts.py index d3fe47fa2..de28c1943 100644 --- a/modules/exporting_alerts/exporting_alerts.py +++ b/modules/exporting_alerts/exporting_alerts.py @@ -1,7 +1,6 @@ # SPDX-FileCopyrightText: 2021 Sebastian Garcia # SPDX-License-Identifier: GPL-2.0-only import json -import os import sqlite3 import threading import time @@ -20,7 +19,7 @@ class ExportingAlerts(IModule): variables to use this module """ - name = "Exporting Alerts" + name = "exporting_alerts" description = "Export alerts to slack or STIX format" authors = ["Alya Gomaa"] @@ -42,9 +41,7 @@ def subscribe_to_channels(self): def _init_direct_export_queue(self): if self.queue_db: return - self.queue_db_path = os.path.join( - self.output_dir, "stix_export_queue.sqlite" - ) + self.queue_db_path = self.get_database_path("stix_export_queue.sqlite") self.queue_db = sqlite3.connect( self.queue_db_path, check_same_thread=False ) @@ -336,7 +333,7 @@ def pre_main(self): if not export_to_slack and not export_to_stix: self.print( - "Exporting Alerts module disabled (no export targets configured).", + "exporting_alerts module disabled (no export targets configured).", 0, 2, ) diff --git a/modules/exporting_alerts/stix_exporter.py b/modules/exporting_alerts/stix_exporter.py index 8998c2575..875f0b585 100644 --- a/modules/exporting_alerts/stix_exporter.py +++ b/modules/exporting_alerts/stix_exporter.py @@ -89,9 +89,7 @@ def init(self): name="stix_exporter_to_taxii_thread", ) else: - self._log_export( - f"Export disabled export_to={self.export_to}" - ) + self._log_export(f"Export disabled export_to={self.export_to}") def start_exporting_thread(self): # This thread is responsible for waiting n seconds before @@ -126,11 +124,7 @@ def _build_url(self, path: str) -> str: return urljoin(self._base_url(), adjusted) def _log_export(self, message: str) -> None: - timestamp = ( - datetime.utcnow() - .replace(tzinfo=timezone.utc) - .isoformat() - ) + timestamp = datetime.utcnow().replace(tzinfo=timezone.utc).isoformat() line = f"{timestamp} {message}\n" try: with open(self.export_log_path, "a", encoding="utf-8") as log_file: @@ -148,11 +142,7 @@ def _resolve_output_dir(self) -> str: Falls back to the current working directory if the DB does not have an output directory set yet. """ - output_dir = getattr(self.db, "output_dir", None) - if not output_dir: - output_dir = self.db.get_output_dir() - if isinstance(output_dir, bytes): - output_dir = output_dir.decode("utf-8") + output_dir = self.get_output_path(module_name="exporting_alerts") if not output_dir: output_dir = os.getcwd() output_dir = os.path.abspath(output_dir) @@ -312,9 +302,7 @@ def _resolve_objects_url(self) -> Optional[str]: timeout=self.taxii_timeout, ) except Exception as err: - self._log_export( - f"Direct export failed: discovery error {err}" - ) + self._log_export(f"Direct export failed: discovery error {err}") return None if not response.ok: self._log_export( @@ -341,7 +329,9 @@ def _resolve_objects_url(self) -> Optional[str]: root_url = ( root if str(root).startswith("http") else self._build_url(root) ) - collections_url = urljoin(root_url.rstrip("/") + "/", "collections/") + collections_url = urljoin( + root_url.rstrip("/") + "/", "collections/" + ) try: resp = requests.get( collections_url, @@ -412,9 +402,7 @@ def export(self) -> bool: STIX_data.json bundle as a TAXII envelope. """ if self.taxii_version == 1: - self._log_export( - "Export skipped: TAXII 1 requires direct_export." - ) + self._log_export("Export skipped: TAXII 1 requires direct_export.") return False if not self.should_export(): self._log_export("Export skipped: stix not enabled.") @@ -472,7 +460,9 @@ def export(self) -> bool: try: status = collection.add_objects(envelope) except Exception as err: - self.print(f"Failed to push bundle to TAXII collection: {err}", 0, 3) + self.print( + f"Failed to push bundle to TAXII collection: {err}", 0, 3 + ) response = getattr(err, "response", None) if response is not None: self._log_export( @@ -527,7 +517,6 @@ def should_export(self) -> bool: return "stix" in self.export_to def read_configuration(self) -> bool: - """Reads configuration""" conf = ConfigParser() # Available options ['slack','stix'] self.export_to = conf.export_to() @@ -544,20 +533,22 @@ def read_configuration(self) -> bool: self.collection_name = conf.collection_name() self.taxii_username = conf.taxii_username() self.taxii_password = conf.taxii_password() - self.taxii_version = self._normalize_taxii_version(conf.taxii_version()) + self.taxii_version = self._normalize_taxii_version( + conf.taxii_version() + ) self.taxii_timeout = conf.taxii_timeout() self.direct_export = bool(conf.taxii_direct_export()) self.direct_export_workers = conf.taxii_direct_export_workers() self.direct_export_max_workers = conf.taxii_direct_export_max_workers() self.direct_export_retry_max = conf.taxii_direct_export_retry_max() - self.direct_export_retry_backoff = conf.taxii_direct_export_retry_backoff() + self.direct_export_retry_backoff = ( + conf.taxii_direct_export_retry_backoff() + ) self.direct_export_retry_max_delay = ( conf.taxii_direct_export_retry_max_delay() ) if self.taxii_version == 1 and not self.direct_export: - self._log_export( - "TAXII 1 selected; forcing direct_export=true." - ) + self._log_export("TAXII 1 selected; forcing direct_export=true.") self.direct_export = True # push delay exists -> create a thread that waits # push delay doesn't exist -> running using file not interface @@ -772,7 +763,9 @@ def _build_taxii1_cybox_properties( def _build_taxii1_package( self, evidence: dict, attacker: str, ioc_type: str ) -> Optional[str]: - properties_xml = self._build_taxii1_cybox_properties(attacker, ioc_type) + properties_xml = self._build_taxii1_cybox_properties( + attacker, ioc_type + ) if not properties_xml: return None @@ -927,11 +920,11 @@ def _export_taxii1( ) except Exception as err: self.direct_export_fail += 1 - self._log_export(f"Direct export failed: TAXII 1 request error {err}") - duration = time.time() - start_ts self._log_export( - f"Direct export duration_seconds={duration:.3f}" + f"Direct export failed: TAXII 1 request error {err}" ) + duration = time.time() - start_ts + self._log_export(f"Direct export duration_seconds={duration:.3f}") return False if not response.ok or 'status_type="FAILURE"' in response.text: @@ -941,9 +934,7 @@ def _export_taxii1( f"response={response.text[:2000]}" ) duration = time.time() - start_ts - self._log_export( - f"Direct export duration_seconds={duration:.3f}" - ) + self._log_export(f"Direct export duration_seconds={duration:.3f}") return False self.direct_export_success += 1 @@ -1042,9 +1033,7 @@ def export_evidence_direct(self, evidence: dict) -> bool: self.direct_export_fail += 1 self._log_export(f"Direct export failed: request error {err}") duration = time.time() - start - self._log_export( - f"Direct export duration_seconds={duration:.3f}" - ) + self._log_export(f"Direct export duration_seconds={duration:.3f}") return False if not response.ok: @@ -1054,9 +1043,7 @@ def export_evidence_direct(self, evidence: dict) -> bool: f"response={response.text[:2000]}" ) duration = time.time() - start - self._log_export( - f"Direct export duration_seconds={duration:.3f}" - ) + self._log_export(f"Direct export duration_seconds={duration:.3f}") return False success_count = None @@ -1074,9 +1061,7 @@ def export_evidence_direct(self, evidence: dict) -> bool: f"Direct export failed: status failures={failure_count}" ) duration = time.time() - start - self._log_export( - f"Direct export duration_seconds={duration:.3f}" - ) + self._log_export(f"Direct export duration_seconds={duration:.3f}") return False self.direct_export_success += 1 @@ -1098,9 +1083,7 @@ def schedule_sending_to_taxii_server(self): self.push_delay seconds when running on an interface only """ if self.direct_export: - self._log_export( - "Scheduler disabled: direct_export enabled." - ) + self._log_export("Scheduler disabled: direct_export enabled.") return while True: # on an interface, we use the push delay from slips.yaml diff --git a/modules/flowalerts/__init__.py b/modules/feeds_update_manager/__init__.py similarity index 100% rename from modules/flowalerts/__init__.py rename to modules/feeds_update_manager/__init__.py diff --git a/modules/update_manager/update_manager.py b/modules/feeds_update_manager/feeds_update_manager.py similarity index 99% rename from modules/update_manager/update_manager.py rename to modules/feeds_update_manager/feeds_update_manager.py index 1ebe3b270..083acc1ab 100644 --- a/modules/update_manager/update_manager.py +++ b/modules/feeds_update_manager/feeds_update_manager.py @@ -22,15 +22,15 @@ CannotAcquireLock, ) -from modules.update_manager.timer_manager import InfiniteTimer +from modules.feeds_update_manager.timer_manager import InfiniteTimer from slips_files.common.parsers.config_parser import ConfigParser from slips_files.common.abstracts.imodule import IModule from slips_files.common.slips_utils import utils from slips_files.core.helpers.whitelist.whitelist import Whitelist -class UpdateManager(IModule): - name = "Update Manager" +class FeedsUpdateManager(IModule): + name = "feeds_update_manager" description = "Update Threat Intelligence files" authors = ["Kamila Babayeva", "Alya Gomaa"] @@ -426,7 +426,7 @@ def should_update(self, file_to_download: str, update_period) -> bool: # update period passed if "risk" in file_to_download: - # updating riskiq TI data does not depend on an e-tag + # updating risk_iq TI data does not depend on an e-tag return True # Update only if the e-tag is different @@ -1480,6 +1480,7 @@ def update_local_whitelist(self): """ parses the local whitelist using the whitelist parser and stores it in the db + is only called when slips starts. """ if self.enable_local_whitelist: self.whitelist.update() @@ -1491,7 +1492,7 @@ def update_org_files(self): and initializes the bloom filters """ for org in utils.supported_orgs: - org_ips = os.path.join(self.org_info_path, org) + org_ips = os.path.join(self.org_info_path, f"{org}_ip_ranges") org_asn = os.path.join(self.org_info_path, f"{org}_asn") org_domains = os.path.join(self.org_info_path, f"{org}_domains") @@ -1729,7 +1730,7 @@ async def update(self) -> bool: ) task.add_done_callback(self.handle_task_exception) ####################################################### - # in case of riskiq files, we don't have a link for them in ti_files, We update these files using their API + # in case of risk_iq files, we don't have a link for them in ti_files, We update these files using their API # check if we have a username and api key and a week has passed since we last updated if self.should_update("riskiq_domains", self.riskiq_update_period): self.update_riskiq_feed() diff --git a/modules/update_manager/timer_manager.py b/modules/feeds_update_manager/timer_manager.py similarity index 100% rename from modules/update_manager/timer_manager.py rename to modules/feeds_update_manager/timer_manager.py diff --git a/modules/fidesModule/__init__.py b/modules/fides/__init__.py similarity index 100% rename from modules/fidesModule/__init__.py rename to modules/fides/__init__.py diff --git a/modules/fidesModule/config/fides.conf.yml b/modules/fides/config/fides.conf.yml similarity index 99% rename from modules/fidesModule/config/fides.conf.yml rename to modules/fides/config/fides.conf.yml index a83336ff5..27e1c7f05 100644 --- a/modules/fidesModule/config/fides.conf.yml +++ b/modules/fides/config/fides.conf.yml @@ -148,4 +148,3 @@ trust: # Threat Intelligence aggregation strategy # valid values - ['average', 'weightedAverage', 'stdevFromScore'] tiAggregationStrategy: 'average' - diff --git a/modules/fides/evaluation/README.md b/modules/fides/evaluation/README.md new file mode 100644 index 000000000..459d186c0 --- /dev/null +++ b/modules/fides/evaluation/README.md @@ -0,0 +1 @@ +All algorithms in this package are based on SORT - see paper. diff --git a/modules/fidesModule/evaluation/recommendation/__init__.py b/modules/fides/evaluation/__init__.py similarity index 100% rename from modules/fidesModule/evaluation/recommendation/__init__.py rename to modules/fides/evaluation/__init__.py diff --git a/modules/fidesModule/evaluation/discount_factor.py b/modules/fides/evaluation/discount_factor.py similarity index 100% rename from modules/fidesModule/evaluation/discount_factor.py rename to modules/fides/evaluation/discount_factor.py diff --git a/modules/fidesModule/evaluation/service/__init__.py b/modules/fides/evaluation/recommendation/__init__.py similarity index 100% rename from modules/fidesModule/evaluation/service/__init__.py rename to modules/fides/evaluation/recommendation/__init__.py diff --git a/modules/fidesModule/evaluation/recommendation/new_history.py b/modules/fides/evaluation/recommendation/new_history.py similarity index 53% rename from modules/fidesModule/evaluation/recommendation/new_history.py rename to modules/fides/evaluation/recommendation/new_history.py index 387e70e0e..37fad3dba 100644 --- a/modules/fidesModule/evaluation/recommendation/new_history.py +++ b/modules/fides/evaluation/recommendation/new_history.py @@ -1,18 +1,21 @@ from ...model.configuration import TrustModelConfiguration from ...model.peer_trust_data import PeerTrustData from ...model.recommendation import Recommendation -from ...model.recommendation_history import RecommendationHistoryRecord, RecommendationHistory +from ...model.recommendation_history import ( + RecommendationHistoryRecord, + RecommendationHistory, +) from ...utils.time import now def create_recommendation_history_for_peer( - configuration: TrustModelConfiguration, - peer: PeerTrustData, - recommendation: Recommendation, - history_factor: float, - er_ij: float, - ecb_ij: float, - eib_ij: float + configuration: TrustModelConfiguration, + peer: PeerTrustData, + recommendation: Recommendation, + history_factor: float, + er_ij: float, + ecb_ij: float, + eib_ij: float, ) -> RecommendationHistory: """ Creates new recommendation_history for given peer and its recommendations. @@ -26,25 +29,31 @@ def create_recommendation_history_for_peer( :param eib_ij: estimation about integrity belief :return: """ - rs_ik = __compute_recommendation_satisfaction_parameter(recommendation, er_ij, ecb_ij, eib_ij) - rw_ik = __compute_weight_of_recommendation(configuration, recommendation, history_factor) + rs_ik = __compute_recommendation_satisfaction_parameter( + recommendation, er_ij, ecb_ij, eib_ij + ) + rw_ik = __compute_weight_of_recommendation( + configuration, recommendation, history_factor + ) - updated_history = peer.recommendation_history + [RecommendationHistoryRecord(satisfaction=rs_ik, - weight=rw_ik, - timestamp=now())] + updated_history = peer.recommendation_history + [ + RecommendationHistoryRecord( + satisfaction=rs_ik, weight=rw_ik, timestamp=now() + ) + ] # fix history len if we reached max size if len(updated_history) > configuration.recommendations.history_max_size: last_idx = len(updated_history) - updated_history = updated_history[last_idx - configuration.recommendations.history_max_size: last_idx] + updated_history = updated_history[ + last_idx + - configuration.recommendations.history_max_size : last_idx + ] return updated_history def __compute_recommendation_satisfaction_parameter( - recommendation: Recommendation, - er_ij: float, - ecb_ij: float, - eib_ij: float + recommendation: Recommendation, er_ij: float, ecb_ij: float, eib_ij: float ) -> float: """ Computes satisfaction parameter - how much was peer satisfied with provided data. @@ -55,16 +64,28 @@ def __compute_recommendation_satisfaction_parameter( :param eib_ij: estimation about integrity belief :return: recommendation satisfaction rs_ik """ - r_diff = (1 - abs(recommendation.recommendation - er_ij) / er_ij) if er_ij > 0 else 0 - cb_diff = (1 - abs(recommendation.competence_belief - ecb_ij) / ecb_ij) if ecb_ij > 0 else 0 - ib_diff = (1 - abs(recommendation.integrity_belief - eib_ij) / eib_ij) if eib_ij > 0 else 0 + r_diff = ( + (1 - abs(recommendation.recommendation - er_ij) / er_ij) + if er_ij > 0 + else 0 + ) + cb_diff = ( + (1 - abs(recommendation.competence_belief - ecb_ij) / ecb_ij) + if ecb_ij > 0 + else 0 + ) + ib_diff = ( + (1 - abs(recommendation.integrity_belief - eib_ij) / eib_ij) + if eib_ij > 0 + else 0 + ) return (r_diff + cb_diff + ib_diff) / 3 def __compute_weight_of_recommendation( - configuration: TrustModelConfiguration, - recommendation: Recommendation, - history_factor: float + configuration: TrustModelConfiguration, + recommendation: Recommendation, + history_factor: float, ) -> float: """ Computes weight of recommendation - in model's notation rw^z_ik. @@ -73,6 +94,12 @@ def __compute_weight_of_recommendation( :param history_factor: int(mean(size of history) / maximal history size) :return: recommendation weight rw^z_ik """ - service_history = recommendation.service_history_size / configuration.service_history_max_size - used_peers = recommendation.initial_reputation_provided_by_count / configuration.recommendations.peers_max_count + service_history = ( + recommendation.service_history_size + / configuration.service_history_max_size + ) + used_peers = ( + recommendation.initial_reputation_provided_by_count + / configuration.recommendations.peers_max_count + ) return history_factor * service_history + (1 - history_factor) * used_peers diff --git a/modules/fidesModule/evaluation/recommendation/peer_update.py b/modules/fides/evaluation/recommendation/peer_update.py similarity index 58% rename from modules/fidesModule/evaluation/recommendation/peer_update.py rename to modules/fides/evaluation/recommendation/peer_update.py index 9e6a7efac..1a61135ab 100644 --- a/modules/fidesModule/evaluation/recommendation/peer_update.py +++ b/modules/fides/evaluation/recommendation/peer_update.py @@ -11,9 +11,9 @@ # noinspection DuplicatedCode # TODO: [+] try to abstract this def update_recommendation_data_for_peer( - configuration: TrustModelConfiguration, - peer: PeerTrustData, - new_history: RecommendationHistory + configuration: TrustModelConfiguration, + peer: PeerTrustData, + new_history: RecommendationHistory, ) -> PeerTrustData: """ Computes and updates all recommendation data for given peer with new_history. @@ -28,28 +28,39 @@ def update_recommendation_data_for_peer( """ fading_factor = __compute_fading_factor(configuration, new_history) competence_belief = __compute_competence_belief(new_history, fading_factor) - integrity_belief = __compute_integrity_belief(new_history, fading_factor, competence_belief) + integrity_belief = __compute_integrity_belief( + new_history, fading_factor, competence_belief + ) integrity_discount = compute_discount_factor() - history_factor = len(new_history) / configuration.recommendations.history_max_size + history_factor = ( + len(new_history) / configuration.recommendations.history_max_size + ) # (rh_ik / rh_max) * (rcb_ik -0.5 * rib_ik) -> where -0.5 is discount factor - reputation_trust_own_experience = history_factor * (competence_belief + integrity_discount * integrity_belief) + reputation_trust_own_experience = history_factor * ( + competence_belief + integrity_discount * integrity_belief + ) # (1 - (rh_ik / rh_max)) * r_ik reputation_experience = (1 - history_factor) * peer.reputation # and now add both parts together - recommendation_trust = reputation_trust_own_experience + reputation_experience + recommendation_trust = ( + reputation_trust_own_experience + reputation_experience + ) - updated_trust = dataclasses.replace(peer, - recommendation_trust=recommendation_trust, - recommendation_history=new_history - ) + updated_trust = dataclasses.replace( + peer, + recommendation_trust=recommendation_trust, + recommendation_history=new_history, + ) return updated_trust -def __compute_fading_factor(configuration: TrustModelConfiguration, - recommendation_history: RecommendationHistory) -> List[float]: +def __compute_fading_factor( + configuration: TrustModelConfiguration, + recommendation_history: RecommendationHistory, +) -> List[float]: """ Computes fading factor for each record in recommendation history. @@ -70,7 +81,9 @@ def __compute_fading_factor(configuration: TrustModelConfiguration, return [1] * len(recommendation_history) -def __compute_competence_belief(recommendation_history: RecommendationHistory, fading_factor: List[float]) -> float: +def __compute_competence_belief( + recommendation_history: RecommendationHistory, fading_factor: List[float] +) -> float: """ Computes competence belief - rcb_ik. @@ -78,22 +91,34 @@ def __compute_competence_belief(recommendation_history: RecommendationHistory, f :param fading_factor: fading factors for given history :return: reputation competence belief for given data """ - assert len(recommendation_history) == len(fading_factor), \ - "Recommendation history must have same length as fading factors." + assert len(recommendation_history) == len( + fading_factor + ), "Recommendation history must have same length as fading factors." normalisation = sum( - [recommendation.weight * fading for recommendation, fading in zip(recommendation_history, fading_factor)]) - - belief = sum([service.satisfaction * service.weight * fading - for service, fading - in zip(recommendation_history, fading_factor)]) + [ + recommendation.weight * fading + for recommendation, fading in zip( + recommendation_history, fading_factor + ) + ] + ) + + belief = sum( + [ + service.satisfaction * service.weight * fading + for service, fading in zip(recommendation_history, fading_factor) + ] + ) return belief / normalisation if normalisation > 0 else 0 -def __compute_integrity_belief(recommendation_history: RecommendationHistory, - fading_factor: List[float], - recommendation_competence_belief: float) -> float: +def __compute_integrity_belief( + recommendation_history: RecommendationHistory, + fading_factor: List[float], + recommendation_competence_belief: float, +) -> float: """ Computes integrity belief - rib_ik. @@ -102,15 +127,24 @@ def __compute_integrity_belief(recommendation_history: RecommendationHistory, :param fading_factor: fading factors for given history :return: integrity belief for given data """ - assert len(recommendation_history) == len(fading_factor), \ - "Recommendation history must have same length as fading factors." + assert len(recommendation_history) == len( + fading_factor + ), "Recommendation history must have same length as fading factors." history_size = len(recommendation_history) - weight_mean = sum(service.weight for service in recommendation_history) / history_size + weight_mean = ( + sum(service.weight for service in recommendation_history) + / history_size + ) fading_mean = sum(fading_factor) / history_size - sat = sum((recommendation.satisfaction * weight_mean * fading_mean - recommendation_competence_belief) ** 2 - for recommendation - in recommendation_history) + sat = sum( + ( + recommendation.satisfaction * weight_mean * fading_mean + - recommendation_competence_belief + ) + ** 2 + for recommendation in recommendation_history + ) return sqrt(sat / history_size) diff --git a/modules/fidesModule/evaluation/recommendation/process.py b/modules/fides/evaluation/recommendation/process.py similarity index 67% rename from modules/fidesModule/evaluation/recommendation/process.py rename to modules/fides/evaluation/recommendation/process.py index d0368e2e8..ceedf91e8 100644 --- a/modules/fidesModule/evaluation/recommendation/process.py +++ b/modules/fides/evaluation/recommendation/process.py @@ -2,8 +2,12 @@ from typing import Dict from ...evaluation.discount_factor import compute_discount_factor -from ...evaluation.recommendation.new_history import create_recommendation_history_for_peer -from ...evaluation.recommendation.peer_update import update_recommendation_data_for_peer +from ...evaluation.recommendation.new_history import ( + create_recommendation_history_for_peer, +) +from ...evaluation.recommendation.peer_update import ( + update_recommendation_data_for_peer, +) from ...model.aliases import PeerId from ...model.configuration import TrustModelConfiguration from ...model.peer_trust_data import TrustMatrix, PeerTrustData @@ -11,10 +15,10 @@ def process_new_recommendations( - configuration: TrustModelConfiguration, - subject: PeerTrustData, - matrix: TrustMatrix, - recommendations: Dict[PeerId, Recommendation] + configuration: TrustModelConfiguration, + subject: PeerTrustData, + matrix: TrustMatrix, + recommendations: Dict[PeerId, Recommendation], ) -> TrustMatrix: """ Evaluates received recommendation, computing recommendations and recommendation @@ -35,10 +39,14 @@ def process_new_recommendations( """ # verify that peers with responses are in trust matrix for peer in recommendations.keys(): - assert matrix[peer] is not None, f"Peer {peer} is not present in peer matrix." + assert ( + matrix[peer] is not None + ), f"Peer {peer} is not present in peer matrix." er_ij = __estimate_recommendation(matrix, recommendations) - ecb_ij, eib_ij = __estimate_competence_integrity_belief(matrix, recommendations) + ecb_ij, eib_ij = __estimate_competence_integrity_belief( + matrix, recommendations + ) history_sizes = [r.service_history_size for r in recommendations.values()] history_mean = int(sum(history_sizes) / len(history_sizes)) @@ -54,35 +62,41 @@ def process_new_recommendations( # now update final trust for the subject with new reputation # we also trust the subject same with service as well as with recommendations # we also set service_trust if it is not set, because for the first interaction it is equal to reputation - updated_subject_trust = dataclasses \ - .replace(subject, - service_trust=max(subject.service_trust, reputation), - reputation=reputation, - recommendation_trust=reputation, - initial_reputation_provided_by_count=len(recommendations) - ) - peers_updated_matrix = {updated_subject_trust.peer_id: updated_subject_trust} + updated_subject_trust = dataclasses.replace( + subject, + service_trust=max(subject.service_trust, reputation), + reputation=reputation, + recommendation_trust=reputation, + initial_reputation_provided_by_count=len(recommendations), + ) + peers_updated_matrix = { + updated_subject_trust.peer_id: updated_subject_trust + } # now we need to reflect performed reputation query and update how much we trust other peers for peer_id, recommendation in recommendations.items(): peer = matrix[peer_id] # build new history new_history = create_recommendation_history_for_peer( - configuration=configuration, peer=peer, recommendation=recommendation, - history_factor=history_factor, er_ij=er_ij, ecb_ij=ecb_ij, eib_ij=eib_ij + configuration=configuration, + peer=peer, + recommendation=recommendation, + history_factor=history_factor, + er_ij=er_ij, + ecb_ij=ecb_ij, + eib_ij=eib_ij, ) # and update peer and its recommendation data - updated_peer = update_recommendation_data_for_peer(configuration=configuration, - peer=peer, - new_history=new_history) + updated_peer = update_recommendation_data_for_peer( + configuration=configuration, peer=peer, new_history=new_history + ) peers_updated_matrix[updated_peer.peer_id] = updated_peer return peers_updated_matrix def __estimate_recommendation( - matrix: TrustMatrix, - recommendations: Dict[PeerId, Recommendation] + matrix: TrustMatrix, recommendations: Dict[PeerId, Recommendation] ) -> float: """ Computes estimation about recommendation. @@ -93,23 +107,28 @@ def __estimate_recommendation( :param recommendations: responses from the peers :return: estimation about recommendation er_ij """ - normalisation = sum([ - matrix[peer].recommendation_trust * response.initial_reputation_provided_by_count - for peer, response - in recommendations.items()] + normalisation = sum( + [ + matrix[peer].recommendation_trust + * response.initial_reputation_provided_by_count + for peer, response in recommendations.items() + ] ) recommendations = sum( - [matrix[peer].recommendation_trust * response.initial_reputation_provided_by_count * response.recommendation - for peer, response - in recommendations.items()]) + [ + matrix[peer].recommendation_trust + * response.initial_reputation_provided_by_count + * response.recommendation + for peer, response in recommendations.items() + ] + ) return recommendations / normalisation if normalisation > 0 else 0 def __estimate_competence_integrity_belief( - matrix: TrustMatrix, - recommendations: Dict[PeerId, Recommendation] + matrix: TrustMatrix, recommendations: Dict[PeerId, Recommendation] ) -> [float, float]: """ Estimates about competence and integrity beliefs. @@ -126,7 +145,9 @@ def __estimate_competence_integrity_belief( # as we would need to iterate three times, it's just better to make for cycle for peer, response in recommendations.items(): - trust_history_size = matrix[peer].recommendation_trust * response.service_history_size + trust_history_size = ( + matrix[peer].recommendation_trust * response.service_history_size + ) # rt_ik * sh_kj normalisation += trust_history_size # rt_ik * sh_kj * cb_kj diff --git a/modules/fidesModule/evaluation/recommendation/selection.py b/modules/fides/evaluation/recommendation/selection.py similarity index 67% rename from modules/fidesModule/evaluation/recommendation/selection.py rename to modules/fides/evaluation/recommendation/selection.py index b38c789d2..d07aa731b 100644 --- a/modules/fidesModule/evaluation/recommendation/selection.py +++ b/modules/fides/evaluation/recommendation/selection.py @@ -5,8 +5,7 @@ def select_trustworthy_peers_for_recommendations( - data: Dict[PeerId, float], - max_peers: int + data: Dict[PeerId, float], max_peers: int ) -> List[PeerId]: """ Selects peers that can be asked for recommendation. @@ -18,8 +17,14 @@ def select_trustworthy_peers_for_recommendations( var = sqrt(sum((rt - mean) ** 2 for rt in data.values())) lowest_rt = mean - var # select only peers that have recommendation_trust higher than mean - variance - candidates = sorted([ - {'id': peer_id, 'rt': rt} for peer_id, rt in data.items() if rt >= lowest_rt - ], key=lambda x: x['rt'], reverse=True) + candidates = sorted( + [ + {"id": peer_id, "rt": rt} + for peer_id, rt in data.items() + if rt >= lowest_rt + ], + key=lambda x: x["rt"], + reverse=True, + ) # and now cut them at max - return [p['id'] for p in candidates[: max_peers]] + return [p["id"] for p in candidates[:max_peers]] diff --git a/modules/fidesModule/persistence/__init__.py b/modules/fides/evaluation/service/__init__.py similarity index 100% rename from modules/fidesModule/persistence/__init__.py rename to modules/fides/evaluation/service/__init__.py diff --git a/modules/fidesModule/evaluation/service/interaction.py b/modules/fides/evaluation/service/interaction.py similarity index 58% rename from modules/fidesModule/evaluation/service/interaction.py rename to modules/fides/evaluation/service/interaction.py index cec4b5ec2..d9548ee98 100644 --- a/modules/fidesModule/evaluation/service/interaction.py +++ b/modules/fides/evaluation/service/interaction.py @@ -1,9 +1,8 @@ from enum import Enum Satisfaction = float -"""Represents value how much was client satisfied with the interaction -0 <= satisfaction <= 1 where 0 is NOT satisfied and 1 is satisfied. -""" +# Represents value how much was client satisfied with the interaction. +# 0 <= satisfaction <= 1 where 0 is NOT satisfied and 1 is satisfied. class SatisfactionLevels: @@ -12,10 +11,10 @@ class SatisfactionLevels: class Weight(Enum): - """How much was the interaction important. - 0 <= weight <= 1 - where 0 is unimportant and 1 is important - """ + # How much was the interaction important. + # 0 <= weight <= 1 + # where 0 is unimportant and 1 is important + FIRST_ENCOUNTER = 0.1 PING = 0.2 INTELLIGENCE_NO_DATA_REPORT = 0.3 diff --git a/modules/fidesModule/evaluation/service/peer_update.py b/modules/fides/evaluation/service/peer_update.py similarity index 63% rename from modules/fidesModule/evaluation/service/peer_update.py rename to modules/fides/evaluation/service/peer_update.py index 732584a93..0f49a0205 100644 --- a/modules/fidesModule/evaluation/service/peer_update.py +++ b/modules/fides/evaluation/service/peer_update.py @@ -12,10 +12,11 @@ # noinspection DuplicatedCode # TODO: [+] try to abstract this + def update_service_data_for_peer( - configuration: TrustModelConfiguration, - peer: PeerTrustData, - new_history: ServiceHistory + configuration: TrustModelConfiguration, + peer: PeerTrustData, + new_history: ServiceHistory, ) -> PeerTrustData: """ Computes and updates PeerTrustData.service_trust - st_ij - for peer j - based on the given data. @@ -32,13 +33,17 @@ def update_service_data_for_peer( fading_factor = __compute_fading_factor(configuration, new_history) competence_belief = __compute_competence_belief(new_history, fading_factor) - integrity_belief = __compute_integrity_belief(new_history, fading_factor, competence_belief) + integrity_belief = __compute_integrity_belief( + new_history, fading_factor, competence_belief + ) integrity_discount = compute_discount_factor() history_factor = len(new_history) / configuration.service_history_max_size # (sh_ij / sh_max) * (cb_ij -0.5 * ib_ij) -> where -0.5 is discount factor - service_trust_own_experience = history_factor * (competence_belief + integrity_discount * integrity_belief) + service_trust_own_experience = history_factor * ( + competence_belief + integrity_discount * integrity_belief + ) # (1 - (sh_ij / sh_max)) * r_ij service_trust_reputation = (1 - history_factor) * peer.reputation # and now add both parts together @@ -47,17 +52,20 @@ def update_service_data_for_peer( # (case when the data do not follow normal distribution and ib is higher then mean) service_trust = bound(service_trust, 0, 1) - updated_trust = dataclasses.replace(peer, - service_trust=service_trust, - competence_belief=competence_belief, - integrity_belief=integrity_belief, - service_history=new_history - ) + updated_trust = dataclasses.replace( + peer, + service_trust=service_trust, + competence_belief=competence_belief, + integrity_belief=integrity_belief, + service_history=new_history, + ) return updated_trust -def __compute_fading_factor(configuration: TrustModelConfiguration, service_history: ServiceHistory) -> List[float]: +def __compute_fading_factor( + configuration: TrustModelConfiguration, service_history: ServiceHistory +) -> List[float]: """ Computes fading factor for each record in service history. @@ -79,7 +87,9 @@ def __compute_fading_factor(configuration: TrustModelConfiguration, service_hist return [1] * len(service_history) -def __compute_competence_belief(service_history: ServiceHistory, fading_factor: List[float]) -> float: +def __compute_competence_belief( + service_history: ServiceHistory, fading_factor: List[float] +) -> float: """ Computes competence belief - cb_ij. @@ -87,19 +97,31 @@ def __compute_competence_belief(service_history: ServiceHistory, fading_factor: :param fading_factor: fading factors for given history :return: competence belief for given data """ - assert len(service_history) == len(fading_factor), "Service history must have same length as fading factors." - - normalisation = sum([service.weight * fading for service, fading in zip(service_history, fading_factor)]) - belief = sum([service.satisfaction * service.weight * fading - for service, fading - in zip(service_history, fading_factor)]) + assert len(service_history) == len( + fading_factor + ), "Service history must have same length as fading factors." + + normalisation = sum( + [ + service.weight * fading + for service, fading in zip(service_history, fading_factor) + ] + ) + belief = sum( + [ + service.satisfaction * service.weight * fading + for service, fading in zip(service_history, fading_factor) + ] + ) return belief / normalisation -def __compute_integrity_belief(service_history: ServiceHistory, - fading_factor: List[float], - competence_belief: float) -> float: +def __compute_integrity_belief( + service_history: ServiceHistory, + fading_factor: List[float], + competence_belief: float, +) -> float: """ Computes integrity belief - ib_ij. @@ -108,15 +130,26 @@ def __compute_integrity_belief(service_history: ServiceHistory, :param fading_factor: fading factors for given history :return: integrity belief for given data """ - assert len(service_history) == len(fading_factor), "Service history must have same length as fading factors." + assert len(service_history) == len( + fading_factor + ), "Service history must have same length as fading factors." history_size = len(service_history) - weight_mean = sum([service.weight for service in service_history]) / history_size + weight_mean = ( + sum([service.weight for service in service_history]) / history_size + ) fading_mean = sum(fading_factor) / history_size - sat = sum([(service.satisfaction * weight_mean * fading_mean - competence_belief) ** 2 - for service - in service_history]) + sat = sum( + [ + ( + service.satisfaction * weight_mean * fading_mean + - competence_belief + ) + ** 2 + for service in service_history + ] + ) ib = sqrt(sat / history_size) return ib diff --git a/modules/fidesModule/evaluation/service/process.py b/modules/fides/evaluation/service/process.py similarity index 66% rename from modules/fidesModule/evaluation/service/process.py rename to modules/fides/evaluation/service/process.py index 159c382cf..49ce97fb5 100644 --- a/modules/fidesModule/evaluation/service/process.py +++ b/modules/fides/evaluation/service/process.py @@ -12,21 +12,23 @@ def process_service_interaction( - configuration: TrustModelConfiguration, - peer: PeerTrustData, - satisfaction: Satisfaction, - weight: Weight + configuration: TrustModelConfiguration, + peer: PeerTrustData, + satisfaction: Satisfaction, + weight: Weight, ) -> PeerTrustData: """Processes given interaction and updates trust data.""" - new_history = peer.service_history + [ServiceHistoryRecord( - satisfaction=satisfaction, - weight=weight.value, - timestamp=now() - )] + new_history = peer.service_history + [ + ServiceHistoryRecord( + satisfaction=satisfaction, weight=weight.value, timestamp=now() + ) + ] # now restrict new history to max length if len(new_history) > configuration.service_history_max_size: last = len(new_history) - new_history = new_history[last - configuration.service_history_max_size: last] + new_history = new_history[ + last - configuration.service_history_max_size : last + ] # we don't update service trust for fixed trust peers if peer.has_fixed_trust: @@ -34,7 +36,5 @@ def process_service_interaction( return dataclasses.replace(peer, service_history=new_history) else: return update_service_data_for_peer( - configuration=configuration, - peer=peer, - new_history=new_history + configuration=configuration, peer=peer, new_history=new_history ) diff --git a/modules/fides/evaluation/ti_aggregation.py b/modules/fides/evaluation/ti_aggregation.py new file mode 100644 index 000000000..5419e26dc --- /dev/null +++ b/modules/fides/evaluation/ti_aggregation.py @@ -0,0 +1,118 @@ +from dataclasses import dataclass +from typing import List + +import numpy as np + +from ..model.peer_trust_data import PeerTrustData +from ..model.threat_intelligence import ThreatIntelligence +from ..utils import bound + + +@dataclass +class PeerReport: + report_ti: ThreatIntelligence + """Threat intelligence report.""" + + reporter_trust: PeerTrustData + """How much does Slips trust the reporter.""" + + +class TIAggregation: + + def assemble_peer_opinion( + self, data: List[PeerReport] + ) -> ThreatIntelligence: + """ + Assemble reports given by all peers and compute the overall network opinion. + + :param data: a list of peers and their reports, in the format given by TrustDB.get_opinion_on_ip() + :return: final score and final confidence + """ + raise NotImplementedError("") + + +class AverageConfidenceTIAggregation(TIAggregation): + + def assemble_peer_opinion( + self, data: List[PeerReport] + ) -> ThreatIntelligence: + """ + Uses average when computing final confidence. + """ + reports_ti = [d.report_ti for d in data] + reporters_trust = [d.reporter_trust.service_trust for d in data] + + normalize_net_trust_sum = sum(reporters_trust) + weighted_reporters = ( + [trust / normalize_net_trust_sum for trust in reporters_trust] + if normalize_net_trust_sum > 0 + else [0] * len(reporters_trust) + ) + + combined_score = sum( + r.score * w for r, w, in zip(reports_ti, weighted_reporters) + ) + combined_confidence = sum( + r.confidence * w for r, w, in zip(reports_ti, reporters_trust) + ) / len(reporters_trust) + + return ThreatIntelligence( + score=combined_score, confidence=combined_confidence + ) + + +class WeightedAverageConfidenceTIAggregation(TIAggregation): + + def assemble_peer_opinion( + self, data: List[PeerReport] + ) -> ThreatIntelligence: + reports_ti = [d.report_ti for d in data] + reporters_trust = [d.reporter_trust.service_trust for d in data] + + normalize_net_trust_sum = sum(reporters_trust) + weighted_reporters = [ + trust / normalize_net_trust_sum for trust in reporters_trust + ] + + combined_score = sum( + r.score * w for r, w, in zip(reports_ti, weighted_reporters) + ) + combined_confidence = sum( + r.confidence * w for r, w, in zip(reports_ti, weighted_reporters) + ) + + return ThreatIntelligence( + score=combined_score, confidence=combined_confidence + ) + + +class StdevFromScoreTIAggregation(TIAggregation): + + def assemble_peer_opinion( + self, data: List[PeerReport] + ) -> ThreatIntelligence: + reports_ti = [d.report_ti for d in data] + reporters_trust = [d.reporter_trust.service_trust for d in data] + + normalize_net_trust_sum = sum(reporters_trust) + weighted_reporters = [ + trust / normalize_net_trust_sum for trust in reporters_trust + ] + + merged_score = [ + r.score * r.confidence * w + for r, w, in zip(reports_ti, weighted_reporters) + ] + combined_score = sum(merged_score) + combined_confidence = bound(1 - np.std(merged_score), 0, 1) + + return ThreatIntelligence( + score=combined_score, confidence=combined_confidence + ) + + +TIAggregationStrategy = { + "average": AverageConfidenceTIAggregation, + "weightedAverage": WeightedAverageConfidenceTIAggregation, + "stdevFromScore": StdevFromScoreTIAggregation, +} diff --git a/modules/fides/evaluation/ti_evaluation.py b/modules/fides/evaluation/ti_evaluation.py new file mode 100644 index 000000000..fd0b62ad7 --- /dev/null +++ b/modules/fides/evaluation/ti_evaluation.py @@ -0,0 +1,309 @@ +from collections import defaultdict +from typing import Dict, Tuple, Optional + +from ..evaluation.service.interaction import ( + Satisfaction, + Weight, + SatisfactionLevels, +) +from ..messaging.model import PeerIntelligenceResponse +from ..model.aliases import PeerId, Target +from ..model.peer_trust_data import PeerTrustData, TrustMatrix +from ..model.threat_intelligence import SlipsThreatIntelligence +from ..utils.logger import Logger + +logger = Logger(__name__) + + +class TIEvaluation: + def evaluate( + self, + aggregated_ti: SlipsThreatIntelligence, + responses: Dict[PeerId, PeerIntelligenceResponse], + trust_matrix: TrustMatrix, + **kwargs, + ) -> Dict[PeerId, Tuple[PeerTrustData, Satisfaction, Weight]]: + """Evaluate interaction with all peers that gave intelligence responses.""" + raise NotImplementedError("Use implementation rather then interface!") + + @staticmethod + def _weight() -> Weight: + return Weight.INTELLIGENCE_DATA_REPORT + + @staticmethod + def _assert_keys( + responses: Dict[PeerId, PeerIntelligenceResponse], + trust_matrix: TrustMatrix, + ): + assert trust_matrix.keys() == responses.keys() + + +class EvenTIEvaluation(TIEvaluation): + """Basic implementation for the TI evaluation, all responses are evaluated the same. + This implementation corresponds with Salinity botnet. + """ + + def __init__(self, **kwargs): + self.__kwargs = kwargs + self.__satisfaction = kwargs.get("satisfaction", SatisfactionLevels.Ok) + + def evaluate( + self, + aggregated_ti: SlipsThreatIntelligence, + responses: Dict[PeerId, PeerIntelligenceResponse], + trust_matrix: TrustMatrix, + **kwargs, + ) -> Dict[PeerId, Tuple[PeerTrustData, Satisfaction, Weight]]: + super()._assert_keys(responses, trust_matrix) + + return { + p.peer_id: (p, self.__satisfaction, self._weight()) + for p in trust_matrix.values() + } + + +class DistanceBasedTIEvaluation(TIEvaluation): + """Implementation that takes distance from the aggregated result and uses it as a penalisation.""" + + def __init__(self, **kwargs): + self.__kwargs = kwargs + + def evaluate( + self, + aggregated_ti: SlipsThreatIntelligence, + responses: Dict[PeerId, PeerIntelligenceResponse], + trust_matrix: TrustMatrix, + **kwargs, + ) -> Dict[PeerId, Tuple[PeerTrustData, Satisfaction, Weight]]: + super()._assert_keys(responses, trust_matrix) + return self._build_evaluation( + baseline_score=aggregated_ti.score, + baseline_confidence=aggregated_ti.confidence, + responses=responses, + trust_matrix=trust_matrix, + ) + + def _build_evaluation( + self, + baseline_score: float, + baseline_confidence: float, + responses: Dict[PeerId, PeerIntelligenceResponse], + trust_matrix: TrustMatrix, + ) -> Dict[PeerId, Tuple[PeerTrustData, Satisfaction, Weight]]: + satisfactions = { + peer_id: self._satisfaction( + baseline_score=baseline_score, + baseline_confidence=baseline_confidence, + report_score=ti.intelligence.score, + report_confidence=ti.intelligence.confidence, + ) + for peer_id, ti in responses.items() + } + + return { + p.peer_id: (p, satisfactions[p.peer_id], self._weight()) + for p in trust_matrix.values() + } + + @staticmethod + def _satisfaction( + baseline_score: float, + baseline_confidence: float, + report_score: float, + report_confidence: float, + ) -> Satisfaction: + return ( + 1 - (abs(baseline_score - report_score) / 2) * report_confidence + ) * baseline_confidence + + +class LocalCompareTIEvaluation(DistanceBasedTIEvaluation): + """This strategy compares received threat intelligence with the threat intelligence from local database. + + Uses the same penalisation system as DistanceBasedTIEvaluation with the difference that as a baseline, + it does not use aggregated value, but rather local intelligence. + + If it does not find threat intelligence for the target, it falls backs to DistanceBasedTIEvaluation. + """ + + def __init__(self, **kwargs): + super().__init__(**kwargs) + self.__default_ti_getter = kwargs.get("default_ti_getter", None) + + def get_local_ti( + self, + target: Target, + local_ti: Optional[SlipsThreatIntelligence] = None, + ) -> Optional[SlipsThreatIntelligence]: + if local_ti: + return local_ti + elif self.__default_ti_getter: + return self.__default_ti_getter(target) + else: + return None + + def evaluate( + self, + aggregated_ti: SlipsThreatIntelligence, + responses: Dict[PeerId, PeerIntelligenceResponse], + trust_matrix: TrustMatrix, + local_ti: Optional[SlipsThreatIntelligence] = None, + **kwargs, + ) -> Dict[PeerId, Tuple[PeerTrustData, Satisfaction, Weight]]: + super()._assert_keys(responses, trust_matrix) + + ti = self.get_local_ti(aggregated_ti.target, local_ti) + if not ti: + ti = aggregated_ti + logger.warn( + f"No local threat intelligence available for target {ti.target}! " + + "Falling back to DistanceBasedTIEvaluation." + ) + + return self._build_evaluation( + baseline_score=ti.score, + baseline_confidence=ti.confidence, + responses=responses, + trust_matrix=trust_matrix, + ) + + +class WeighedDistanceToLocalTIEvaluation(TIEvaluation): + """Strategy combines DistanceBasedTIEvaluation and LocalCompareTIEvaluation with the local weight parameter.""" + + def __init__(self, **kwargs): + super().__init__() + self.__distance = kwargs.get("distance", DistanceBasedTIEvaluation()) + self.__local = kwargs.get("localDistance", LocalCompareTIEvaluation()) + self.__local_weight = kwargs.get("localWeight", 0.5) + + def evaluate( + self, + aggregated_ti: SlipsThreatIntelligence, + responses: Dict[PeerId, PeerIntelligenceResponse], + trust_matrix: TrustMatrix, + **kwargs, + ) -> Dict[PeerId, Tuple[PeerTrustData, Satisfaction, Weight]]: + super()._assert_keys(responses, trust_matrix) + + distance_data = self.__distance.evaluate( + aggregated_ti, responses, trust_matrix, **kwargs + ) + local_data = self.__local.evaluate( + aggregated_ti, responses, trust_matrix, **kwargs + ) + + return { + p.peer_id: ( + p, + self.__local_weight * local_data[p.peer_id][1] + + (1 - self.__local_weight) * distance_data[p.peer_id][1], + self._weight(), + ) + for p in trust_matrix.values() + } + + +class MaxConfidenceTIEvaluation(TIEvaluation): + """Strategy combines DistanceBasedTIEvaluation, LocalCompareTIEvaluation and EvenTIEvaluation + in order to achieve maximal confidence when producing decision. + """ + + def __init__(self, **kwargs): + super().__init__() + self.__distance = kwargs.get("distance", DistanceBasedTIEvaluation()) + self.__local = kwargs.get("localDistance", LocalCompareTIEvaluation()) + self.__even = kwargs.get("even", EvenTIEvaluation()) + + def evaluate( + self, + aggregated_ti: SlipsThreatIntelligence, + responses: Dict[PeerId, PeerIntelligenceResponse], + trust_matrix: TrustMatrix, + **kwargs, + ) -> Dict[PeerId, Tuple[PeerTrustData, Satisfaction, Weight]]: + super()._assert_keys(responses, trust_matrix) + zero_dict = defaultdict(lambda: (None, 0, None)) + + # weight of the distance based evaluation + distance_weight = aggregated_ti.confidence + distance_data = ( + self.__distance.evaluate( + aggregated_ti, responses, trust_matrix, **kwargs + ) + if distance_weight > 0 + else zero_dict + ) + + # now we need to check if we even have some threat intelligence data + local_ti = self.__local.get_local_ti(aggregated_ti.target, **kwargs) + # weight of the local evaluation + local_weight = ( + min(1 - distance_weight, local_ti.confidence) if local_ti else 0 + ) + local_data = ( + self.__local.evaluate( + aggregated_ti, responses, trust_matrix, **kwargs + ) + if local_weight > 0 + else zero_dict + ) + + # weight of the same eval + even_weight = 1 - distance_weight - local_weight + even_data = ( + self.__even.evaluate( + aggregated_ti, responses, trust_matrix, **kwargs + ) + if even_weight > 0 + else zero_dict + ) + + def aggregate(peer: PeerId): + return ( + distance_weight * distance_data[peer][1] + + local_weight * local_data[peer][1] + + even_weight * even_data[peer][1] + ) + + return { + p.peer_id: (p, aggregate(p.peer_id), self._weight()) + for p in trust_matrix.values() + } + + +class ThresholdTIEvaluation(TIEvaluation): + """Employs DistanceBasedTIEvaluation when the confidence of the decision + is higher than given threshold. Otherwise, it uses even evaluation. + """ + + def __init__(self, **kwargs): + self.__kwargs = kwargs + self.__threshold = kwargs.get("threshold", 0.5) + self.__lower = kwargs.get("lower", EvenTIEvaluation()) + self.__higher = kwargs.get("higher", DistanceBasedTIEvaluation()) + + def evaluate( + self, + aggregated_ti: SlipsThreatIntelligence, + responses: Dict[PeerId, PeerIntelligenceResponse], + trust_matrix: TrustMatrix, + **kwargs, + ) -> Dict[PeerId, Tuple[PeerTrustData, Satisfaction, Weight]]: + super()._assert_keys(responses, trust_matrix) + + return ( + self.__higher.evaluate(aggregated_ti, responses, trust_matrix) + if self.__threshold <= aggregated_ti.confidence + else self.__lower.evaluate(aggregated_ti, responses, trust_matrix) + ) + + +EvaluationStrategy = { + "even": EvenTIEvaluation, + "distance": DistanceBasedTIEvaluation, + "localDistance": LocalCompareTIEvaluation, + "threshold": ThresholdTIEvaluation, + "maxConfidence": MaxConfidenceTIEvaluation, + "weighedDistance": WeighedDistanceToLocalTIEvaluation, +} diff --git a/modules/fidesModule/fidesModule.py b/modules/fides/fides.py similarity index 83% rename from modules/fidesModule/fidesModule.py rename to modules/fides/fides.py index 64e24df0b..2c582269d 100644 --- a/modules/fidesModule/fidesModule.py +++ b/modules/fides/fides.py @@ -2,6 +2,9 @@ import json from pathlib import Path +from slips_files.common.output_paths import ( + get_this_filepath_inside_permanent_dir, +) from slips_files.common.slips_utils import utils from slips_files.common.abstracts.imodule import IModule from slips_files.common.parsers.config_parser import ( @@ -12,24 +15,24 @@ Alert, ) from .persistence.fides_sqlite_db import FidesSQLiteDB -from ..fidesModule.messaging.message_handler import MessageHandler -from ..fidesModule.messaging.network_bridge import NetworkBridge -from ..fidesModule.model.configuration import load_configuration -from ..fidesModule.model.threat_intelligence import SlipsThreatIntelligence -from ..fidesModule.protocols.alert import AlertProtocol -from ..fidesModule.protocols.initial_trusl import InitialTrustProtocol -from ..fidesModule.protocols.opinion import OpinionAggregator -from ..fidesModule.protocols.peer_list import PeerListUpdateProtocol -from ..fidesModule.protocols.recommendation import RecommendationProtocol -from ..fidesModule.protocols.threat_intelligence import ( +from .messaging.message_handler import MessageHandler +from .messaging.network_bridge import NetworkBridge +from .model.configuration import load_configuration +from .model.threat_intelligence import SlipsThreatIntelligence +from .protocols.alert import AlertProtocol +from .protocols.initial_trusl import InitialTrustProtocol +from .protocols.opinion import OpinionAggregator +from .protocols.peer_list import PeerListUpdateProtocol +from .protocols.recommendation import RecommendationProtocol +from .protocols.threat_intelligence import ( ThreatIntelligenceProtocol, ) -from ..fidesModule.utils.logger import LoggerPrintCallbacks -from ..fidesModule.messaging.redis_simplex_queue import RedisSimplexQueue -from ..fidesModule.persistence.threat_intelligence_db import ( +from .utils.logger import LoggerPrintCallbacks +from .messaging.redis_simplex_queue import RedisSimplexQueue +from .persistence.threat_intelligence_db import ( SlipsThreatIntelligenceDatabase, ) -from ..fidesModule.persistence.trust_db import SlipsTrustDatabase +from .persistence.trust_db import SlipsTrustDatabase class FidesModule(IModule): @@ -37,7 +40,7 @@ class FidesModule(IModule): This module ony runs when slips is running on an interface """ - name = "Fides" + name = "fides" description = "Trust computation module for P2P interactions." authors = ["David Otta", "Lukáš Forst"] @@ -50,20 +53,23 @@ def init(self): # load trust model configuration current_dir = Path(__file__).resolve().parent - config_path = current_dir / "config" / "fides.conf.yml" - self.__trust_model_config = load_configuration(config_path.__str__()) + default_config_path = current_dir / "config" / "fides.conf.yml" + config_path = self.conf.read_configuration( + "global_p2p", "fides_conf", str(default_config_path) + ) + self.__trust_model_config = load_configuration(config_path) # prepare variables for global protocols self.__bridge: NetworkBridge self.__intelligence: ThreatIntelligenceProtocol self.__alerts: AlertProtocol + db_name = os.path.basename(self.__trust_model_config.database) # this sqlite is shared between all runs, like a cache, - # so it shouldnt be stored in the current output dir, it should be - # in the main slips dir + # so it should not be stored in the current output dir. self.sqlite = FidesSQLiteDB( self.logger, - os.path.join(os.getcwd(), self.__trust_model_config.database), + get_this_filepath_inside_permanent_dir(db_name), ) def subscribe_to_channels(self): @@ -218,7 +224,7 @@ def main(self): if not msg["data"]: return - ip = msg["data"] + ip = utils.get_msg_payload(msg) if utils.detect_ioc_type(ip) != "ip": return @@ -228,6 +234,6 @@ def main(self): self.__intelligence.request_data(ip) # TODO: the code below exists for testing purposes for - # tests/integration_tests/test_fides.py + # tests/integration/test_fides/test_fides.py if msg := self.get_msg("fides2network"): pass diff --git a/modules/fidesModule/messaging/__init__.py b/modules/fides/messaging/__init__.py similarity index 100% rename from modules/fidesModule/messaging/__init__.py rename to modules/fides/messaging/__init__.py diff --git a/modules/fidesModule/messaging/dacite/__init__.py b/modules/fides/messaging/dacite/__init__.py similarity index 100% rename from modules/fidesModule/messaging/dacite/__init__.py rename to modules/fides/messaging/dacite/__init__.py diff --git a/modules/fidesModule/messaging/dacite/cache.py b/modules/fides/messaging/dacite/cache.py similarity index 100% rename from modules/fidesModule/messaging/dacite/cache.py rename to modules/fides/messaging/dacite/cache.py diff --git a/modules/fidesModule/messaging/dacite/config.py b/modules/fides/messaging/dacite/config.py similarity index 85% rename from modules/fidesModule/messaging/dacite/config.py rename to modules/fides/messaging/dacite/config.py index 4832b84bf..e33c4977f 100644 --- a/modules/fidesModule/messaging/dacite/config.py +++ b/modules/fides/messaging/dacite/config.py @@ -22,4 +22,8 @@ class Config: @cached_property def hashable_forward_references(self) -> Optional[FrozenDict]: - return FrozenDict(self.forward_references) if self.forward_references else None + return ( + FrozenDict(self.forward_references) + if self.forward_references + else None + ) diff --git a/modules/fidesModule/messaging/dacite/core.py b/modules/fides/messaging/dacite/core.py similarity index 76% rename from modules/fidesModule/messaging/dacite/core.py rename to modules/fides/messaging/dacite/core.py index 71697aebc..c56f2216c 100644 --- a/modules/fidesModule/messaging/dacite/core.py +++ b/modules/fides/messaging/dacite/core.py @@ -1,6 +1,15 @@ from dataclasses import is_dataclass from itertools import zip_longest -from typing import TypeVar, Type, Optional, get_type_hints, Mapping, Any, Collection, MutableMapping +from typing import ( + TypeVar, + Type, + Optional, + get_type_hints, + Mapping, + Any, + Collection, + MutableMapping, +) from ..dacite.cache import cache from ..dacite.config import Config @@ -33,13 +42,13 @@ is_subclass, ) -from dataclasses import dataclass -from typing import List, Optional T = TypeVar("T") -def from_dict(data_class: Type[T], data: Data, config: Optional[Config] = None) -> T: +def from_dict( + data_class: Type[T], data: Data, config: Optional[Config] = None +) -> T: """Create a data class instance from a dictionary. :param data_class: a data class type @@ -51,7 +60,9 @@ def from_dict(data_class: Type[T], data: Data, config: Optional[Config] = None) post_init_values: MutableMapping[str, Any] = {} config = config or Config() try: - data_class_hints = cache(get_type_hints)(data_class, localns=config.hashable_forward_references) + data_class_hints = cache(get_type_hints)( + data_class, localns=config.hashable_forward_references + ) except NameError as error: raise ForwardReferenceError(str(error)) data_class_fields = cache(get_fields)(data_class) @@ -64,12 +75,16 @@ def from_dict(data_class: Type[T], data: Data, config: Optional[Config] = None) if field.name in data: try: field_data = data[field.name] - value = _build_value(type_=field_type, data=field_data, config=config) + value = _build_value( + type_=field_type, data=field_data, config=config + ) except DaciteFieldError as error: error.update_path(field.name) raise if config.check_types and not is_instance(value, field_type): - raise WrongTypeError(field_path=field.name, field_type=field_type, value=value) + raise WrongTypeError( + field_path=field.name, field_type=field_type, value=value + ) else: try: value = get_default_value_for_field(field, field_type) @@ -97,7 +112,9 @@ def _build_value(type_: Type, data: Any, config: Config) -> Any: if is_union(type_): data = _build_value_for_union(union=type_, data=data, config=config) elif is_generic_collection(type_): - data = _build_value_for_collection(collection=type_, data=data, config=config) + data = _build_value_for_collection( + collection=type_, data=data, config=config + ) elif cache(is_dataclass)(type_) and isinstance(data, Mapping): data = from_dict(data_class=type_, data=data, config=config) for cast_type in config.cast: @@ -119,7 +136,9 @@ def _build_value_for_union(union: Type, data: Any, config: Config) -> Any: try: # noinspection PyBroadException try: - value = _build_value(type_=inner_type, data=data, config=config) + value = _build_value( + type_=inner_type, data=data, config=config + ) except Exception: # pylint: disable=broad-except continue if is_instance(value, inner_type): @@ -138,21 +157,33 @@ def _build_value_for_union(union: Type, data: Any, config: Config) -> Any: raise UnionMatchError(field_type=union, value=data) -def _build_value_for_collection(collection: Type, data: Any, config: Config) -> Any: +def _build_value_for_collection( + collection: Type, data: Any, config: Config +) -> Any: data_type = data.__class__ if isinstance(data, Mapping) and is_subclass(collection, Mapping): item_type = extract_generic(collection, defaults=(Any, Any))[1] - return data_type((key, _build_value(type_=item_type, data=value, config=config)) for key, value in data.items()) + return data_type( + (key, _build_value(type_=item_type, data=value, config=config)) + for key, value in data.items() + ) elif isinstance(data, tuple) and is_subclass(collection, tuple): if not data: return data_type() types = extract_generic(collection) if len(types) == 2 and types[1] == Ellipsis: - return data_type(_build_value(type_=types[0], data=item, config=config) for item in data) + return data_type( + _build_value(type_=types[0], data=item, config=config) + for item in data + ) return data_type( - _build_value(type_=type_, data=item, config=config) for item, type_ in zip_longest(data, types) + _build_value(type_=type_, data=item, config=config) + for item, type_ in zip_longest(data, types) ) elif isinstance(data, Collection) and is_subclass(collection, Collection): item_type = extract_generic(collection, defaults=(Any,))[0] - return data_type(_build_value(type_=item_type, data=item, config=config) for item in data) + return data_type( + _build_value(type_=item_type, data=item, config=config) + for item in data + ) return data diff --git a/modules/fidesModule/messaging/dacite/data.py b/modules/fides/messaging/dacite/data.py similarity index 100% rename from modules/fidesModule/messaging/dacite/data.py rename to modules/fides/messaging/dacite/data.py diff --git a/modules/fidesModule/messaging/dacite/dataclasses.py b/modules/fides/messaging/dacite/dataclasses.py similarity index 86% rename from modules/fidesModule/messaging/dacite/dataclasses.py rename to modules/fides/messaging/dacite/dataclasses.py index 8f976d8fe..1debc38d3 100644 --- a/modules/fidesModule/messaging/dacite/dataclasses.py +++ b/modules/fides/messaging/dacite/dataclasses.py @@ -24,7 +24,11 @@ def get_default_value_for_field(field: Field, type_: Type) -> Any: @cache def get_fields(data_class: Type[T]) -> List[Field]: fields = getattr(data_class, _FIELDS) - return [f for f in fields.values() if f._field_type is _FIELD or f._field_type is _FIELD_INITVAR] + return [ + f + for f in fields.values() + if f._field_type is _FIELD or f._field_type is _FIELD_INITVAR + ] @cache diff --git a/modules/fidesModule/messaging/dacite/exceptions.py b/modules/fides/messaging/dacite/exceptions.py similarity index 83% rename from modules/fidesModule/messaging/dacite/exceptions.py rename to modules/fides/messaging/dacite/exceptions.py index de96d0bd7..2b5e1fc7b 100644 --- a/modules/fidesModule/messaging/dacite/exceptions.py +++ b/modules/fides/messaging/dacite/exceptions.py @@ -3,7 +3,11 @@ def _name(type_: Type) -> str: - return type_.__name__ if hasattr(type_, "__name__") and not is_union(type_) else str(type_) + return ( + type_.__name__ + if hasattr(type_, "__name__") and not is_union(type_) + else str(type_) + ) class DaciteError(Exception): @@ -23,7 +27,9 @@ def update_path(self, parent_field_path: str) -> None: class WrongTypeError(DaciteFieldError): - def __init__(self, field_type: Type, value: Any, field_path: Optional[str] = None) -> None: + def __init__( + self, field_type: Type, value: Any, field_path: Optional[str] = None + ) -> None: super().__init__(field_path=field_path) self.field_type = field_type self.value = value @@ -52,12 +58,16 @@ def __str__(self) -> str: class StrictUnionMatchError(DaciteFieldError): - def __init__(self, union_matches: Dict[Type, Any], field_path: Optional[str] = None) -> None: + def __init__( + self, union_matches: Dict[Type, Any], field_path: Optional[str] = None + ) -> None: super().__init__(field_path=field_path) self.union_matches = union_matches def __str__(self) -> str: - conflicting_types = ", ".join(_name(type_) for type_ in self.union_matches) + conflicting_types = ", ".join( + _name(type_) for type_ in self.union_matches + ) return f'can not choose between possible Union matches for field "{self.field_path}": {conflicting_types}' diff --git a/modules/fidesModule/messaging/dacite/frozen_dict.py b/modules/fides/messaging/dacite/frozen_dict.py similarity index 100% rename from modules/fidesModule/messaging/dacite/frozen_dict.py rename to modules/fides/messaging/dacite/frozen_dict.py diff --git a/modules/fidesModule/messaging/dacite/py.typed b/modules/fides/messaging/dacite/py.typed similarity index 100% rename from modules/fidesModule/messaging/dacite/py.typed rename to modules/fides/messaging/dacite/py.typed diff --git a/modules/fidesModule/messaging/dacite/types.py b/modules/fides/messaging/dacite/types.py similarity index 88% rename from modules/fidesModule/messaging/dacite/types.py rename to modules/fides/messaging/dacite/types.py index 4a96fa43f..fa49773c4 100644 --- a/modules/fidesModule/messaging/dacite/types.py +++ b/modules/fides/messaging/dacite/types.py @@ -31,7 +31,11 @@ def is_optional(type_: Type) -> bool: @cache def extract_optional(optional: Type[Optional[T]]) -> T: - other_members = [member for member in extract_generic(optional) if member is not type(None)] + other_members = [ + member + for member in extract_generic(optional) + if member is not type(None) + ] if other_members: return typing_cast(T, Union[tuple(other_members)]) else: @@ -97,7 +101,9 @@ def extract_init_var(type_: Type) -> Union[Type, Any]: def is_instance(value: Any, type_: Type) -> bool: try: # As described in PEP 484 - section: "The numeric tower" - if (type_ in [float, complex] and isinstance(value, (int, float))) or isinstance(value, type_): + if ( + type_ in [float, complex] and isinstance(value, (int, float)) + ) or isinstance(value, type_): return True except TypeError: pass @@ -120,14 +126,22 @@ def is_instance(value: Any, type_: Type) -> bool: else: if len(tuple_types) != len(value): return False - return all(is_instance(item, item_type) for item, item_type in zip(value, tuple_types)) + return all( + is_instance(item, item_type) + for item, item_type in zip(value, tuple_types) + ) if isinstance(value, Mapping): key_type, val_type = extract_generic(type_, defaults=(Any, Any)) for key, val in value.items(): - if not is_instance(key, key_type) or not is_instance(val, val_type): + if not is_instance(key, key_type) or not is_instance( + val, val_type + ): return False return True - return all(is_instance(item, extract_generic(type_, defaults=(Any,))[0]) for item in value) + return all( + is_instance(item, extract_generic(type_, defaults=(Any,))[0]) + for item in value + ) elif is_new_type(type_): return is_instance(value, extract_new_type(type_)) elif is_literal(type_): diff --git a/modules/fides/messaging/message_handler.py b/modules/fides/messaging/message_handler.py new file mode 100644 index 000000000..1b6c917c8 --- /dev/null +++ b/modules/fides/messaging/message_handler.py @@ -0,0 +1,225 @@ +from typing import Dict, List, Callable, Optional, Union + +from slips_files.common.slips_utils import utils +from ..messaging.dacite import from_dict + +from ..messaging.model import ( + NetworkMessage, + PeerInfo, + PeerIntelligenceResponse, + PeerRecommendationResponse, +) +from ..model.alert import Alert +from ..model.aliases import PeerId, Target +from ..model.recommendation import Recommendation +from ..model.threat_intelligence import ThreatIntelligence +from ..utils.logger import Logger + +logger = Logger(__name__) + + +class MessageHandler: + """ + Class responsible for parsing messages and handling requests coming from the queue. + + The entrypoint is on_message. + """ + + # def print(self, *args, **kwargs): + # return self.printer.print(*args, **kwargs) + + version = utils.get_current_version() + + def __init__( + self, + on_peer_list_update: Callable[[List[PeerInfo]], None], + on_recommendation_request: Callable[[str, PeerInfo, PeerId], None], + on_recommendation_response: Callable[ + [List[PeerRecommendationResponse]], None + ], + on_alert: Callable[[PeerInfo, Alert], None], + on_intelligence_request: Callable[[str, PeerInfo, Target], None], + on_intelligence_response: Callable[ + [List[PeerIntelligenceResponse]], None + ], + on_unknown: Optional[Callable[[NetworkMessage], None]] = None, + on_error: Optional[ + Callable[[Union[str, NetworkMessage], Exception], None] + ] = None, + ): + # self.logger = None + self.__on_peer_list_update_callback = on_peer_list_update + self.__on_recommendation_request_callback = on_recommendation_request + self.__on_recommendation_response_callback = on_recommendation_response + self.__on_alert_callback = on_alert + self.__on_intelligence_request_callback = on_intelligence_request + self.__on_intelligence_response_callback = on_intelligence_response + self.__on_unknown_callback = on_unknown + self.__on_error = on_error + # self.printer = Printer(self.logger, self.name) + + def on_message(self, message: NetworkMessage): + """ + Entry point for generic messages coming from the queue. + This method parses the message and then executes correct procedure from event. + :param message: message from the queue + :return: value from the underlining function from the constructor + """ + if message.version != self.version: + logger.warn( + f"Unknown message version! This handler supports {self.version}.", + message, + ) + return self.__on_unknown_message(message) + + execution_map = { + "nl2tl_peers_list": self.__on_nl2tl_peer_list, + "nl2tl_recommendation_request": self.__on_nl2tl_recommendation_request, + "nl2tl_recommendation_response": self.__on_nl2tl_recommendation_response, + "nl2tl_alert": self.__on_nl2tl_alert, + "nl2tl_intelligence_request": self.__on_nl2tl_intelligence_request, + "nl2tl_intelligence_response": self.__on_nl2tl_intelligence_response, + } + func = execution_map.get( + message.type, lambda data: self.__on_unknown_message(message) + ) + # we want to handle everything + # noinspection PyBroadException + try: + # we know that the functions can handle that, and if not, there's always error handling + # noinspection PyArgumentList + return func(message.data) + except Exception as ex: + logger.error( + f"Error when executing handler for message: {message.type}.", + ex, + ) + if self.__on_error: + return self.__on_error(message, ex) + + def on_error( + self, original_data: str, exception: Optional[Exception] = None + ): + """ + Should be executed when it was not possible to parse the message. + :param original_data: string received from the queue + :param exception: exception that occurred during handling + :return: + """ + logger.error(f"Unknown data received: {original_data}.") + if self.__on_error: + self.__on_error( + original_data, + exception if exception else Exception("Unknown data type!"), + ) + + def __on_unknown_message(self, message: NetworkMessage): + logger.warn("Unknown message handler executed!") + logger.debug("Message:", message) + + if self.__on_unknown_callback is not None: + self.__on_unknown_callback(message) + + def __on_nl2tl_peer_list(self, data: Dict): + logger.debug("nl2tl_peer_list message") + + peers = [ + from_dict(data_class=PeerInfo, data=peer) for peer in data["peers"] + ] + return self.__on_peer_list_update(peers) + + def __on_peer_list_update(self, peers: List[PeerInfo]): + return self.__on_peer_list_update_callback(peers) + + def __on_nl2tl_recommendation_request(self, data: Dict): + logger.debug("nl2tl_recommendation_request message") + + request_id = data["request_id"] + sender = from_dict(data_class=PeerInfo, data=data["sender"]) + subject = data["payload"] + return self.__on_recommendation_request(request_id, sender, subject) + + def __on_recommendation_request( + self, request_id: str, sender: PeerInfo, subject: PeerId + ): + return self.__on_recommendation_request_callback( + request_id, sender, subject + ) + + def __on_nl2tl_recommendation_response(self, data: List[Dict]): + logger.debug("nl2tl_recommendation_response message") + + responses = [ + PeerRecommendationResponse( + sender=from_dict(data_class=PeerInfo, data=single["sender"]), + subject=single["payload"]["subject"], + recommendation=from_dict( + data_class=Recommendation, + data=single["payload"]["recommendation"], + ), + ) + for single in data + ] + return self.__on_recommendation_response(responses) + + def __on_recommendation_response( + self, recommendations: List[PeerRecommendationResponse] + ): + return self.__on_recommendation_response_callback(recommendations) + + def __on_nl2tl_alert(self, data: Dict): + logger.debug("nl2tl_alert message") + + sender = from_dict(data_class=PeerInfo, data=data["sender"]) + alert = from_dict(data_class=Alert, data=data["payload"]) + return self.__on_alert(sender, alert) + + def __on_alert(self, sender: PeerInfo, alert: Alert): + return self.__on_alert_callback(sender, alert) + + def __on_nl2tl_intelligence_request(self, data: Dict): + logger.debug("nl2tl_intelligence_request message") + + request_id = data["request_id"] + sender = from_dict(data_class=PeerInfo, data=data["sender"]) + target = data["payload"] + return self.__on_intelligence_request(request_id, sender, target) + + def __on_intelligence_request( + self, request_id: str, sender: PeerInfo, target: Target + ): + return self.__on_intelligence_request_callback( + request_id, sender, target + ) + + def __on_nl2tl_intelligence_response(self, data: Dict): + logger.debug("nl2tl_intelligence_response message") + + responses = [] + + try: + responses = [ + PeerIntelligenceResponse( + sender=from_dict( + data_class=PeerInfo, data=single["sender"] + ), + intelligence=from_dict( + data_class=ThreatIntelligence, + data=single["payload"]["intelligence"], + ), + target=single["payload"]["target"], + ) + for single in data + ] + except Exception as e: + print( + "Error in Fides message_handler.py __on_nl2tl_intelligence_response(): ", + e.__str__(), + ) + # self.print("Error in Fides message_handler.py __on_nl2tl_intelligence_response(): ") + return self.__on_intelligence_response(responses) + + def __on_intelligence_response( + self, responses: List[PeerIntelligenceResponse] + ): + return self.__on_intelligence_response_callback(responses) diff --git a/modules/fidesModule/messaging/model.py b/modules/fides/messaging/model.py similarity index 82% rename from modules/fidesModule/messaging/model.py rename to modules/fides/messaging/model.py index e36b6c0a0..0ebf25ef0 100644 --- a/modules/fidesModule/messaging/model.py +++ b/modules/fides/messaging/model.py @@ -6,16 +6,14 @@ from ..model.recommendation import Recommendation from ..model.threat_intelligence import ThreatIntelligence -""" -Model data coming from the Redis queue - -communication layer between network and trust layer. -""" +# Model data coming from the Redis queue - +# communication layer between network and trust layer. @dataclass class NetworkMessage: type: str - version: int + version: str data: Any diff --git a/modules/fidesModule/messaging/network_bridge.py b/modules/fides/messaging/network_bridge.py similarity index 96% rename from modules/fidesModule/messaging/network_bridge.py rename to modules/fides/messaging/network_bridge.py index e6495271d..c5b8c2a00 100644 --- a/modules/fidesModule/messaging/network_bridge.py +++ b/modules/fides/messaging/network_bridge.py @@ -2,6 +2,7 @@ from dataclasses import asdict from typing import Dict, List +from slips_files.common.slips_utils import utils from .dacite import from_dict from .message_handler import MessageHandler @@ -24,7 +25,7 @@ class NetworkBridge: execute "listen" method. """ - version = 1 + version = utils.get_current_version() def __init__(self, queue: Queue): self.__queue = queue @@ -36,14 +37,15 @@ def listen(self, handler: MessageHandler, block: bool = False): """ def message_received(message: str): + """this is the callback that executes every new msg""" try: - # with open("fides_nb.txt", "a") as f: - # f.write(message) + logger.debug("New message received! Trying to parse.") parsed = json.loads(message) network_message = from_dict( data_class=NetworkMessage, data=parsed ) + logger.debug("Message parsed. Executing handler.") handler.on_message(network_message) except Exception as e: diff --git a/modules/fidesModule/messaging/queue.py b/modules/fides/messaging/queue.py similarity index 77% rename from modules/fidesModule/messaging/queue.py rename to modules/fides/messaging/queue.py index 1ea8728f7..b21d3b26e 100644 --- a/modules/fidesModule/messaging/queue.py +++ b/modules/fides/messaging/queue.py @@ -10,11 +10,11 @@ class Queue: def send(self, serialized_data: str, **argv): """Sends serialized data to the queue.""" - raise NotImplemented('This is interface. Use implementation.') + raise NotImplementedError("This is interface. Use implementation.") def listen(self, on_message: Callable[[str], None], **argv): """Starts listening, executes :param: on_message when new message arrives. Depending on the implementation, this method might be blocking. """ - raise NotImplemented('This is interface. Use implementation.') + raise NotImplementedError("This is interface. Use implementation.") diff --git a/modules/fidesModule/messaging/queue_in_memory.py b/modules/fides/messaging/queue_in_memory.py similarity index 66% rename from modules/fidesModule/messaging/queue_in_memory.py rename to modules/fides/messaging/queue_in_memory.py index ae08db2f8..06c2e2724 100644 --- a/modules/fidesModule/messaging/queue_in_memory.py +++ b/modules/fides/messaging/queue_in_memory.py @@ -17,15 +17,21 @@ def __init__(self, on_message: Optional[Callable[[str], None]] = None): def default_on_message(data: str): InMemoryQueue.__exception(data) - self.__on_message: Callable[[str], None] = on_message if on_message else default_on_message + self.__on_message: Callable[[str], None] = ( + on_message if on_message else default_on_message + ) - def send(self, serialized_data: str, should_wait_for_join: bool = False, **argv): + def send( + self, serialized_data: str, should_wait_for_join: bool = False, **argv + ): """Sends serialized data to the queue.""" - logger.debug('New data received for send.') + logger.debug("New data received for send.") if self.__on_message is None: self.__exception(serialized_data) - th = threading.Thread(target=lambda: self.__on_message(serialized_data)) + th = threading.Thread( + target=lambda: self.__on_message(serialized_data) + ) th.start() if should_wait_for_join: th.join() @@ -40,4 +46,6 @@ def listen(self, on_message: Callable[[str], None], **argv): @staticmethod def __exception(data: str): - raise Exception(f'No on_message set! Call listen before calling send! Data: {data}') + raise Exception( + f"No on_message set! Call listen before calling send! Data: {data}" + ) diff --git a/modules/fidesModule/messaging/redis_simplex_queue.py b/modules/fides/messaging/redis_simplex_queue.py similarity index 98% rename from modules/fidesModule/messaging/redis_simplex_queue.py rename to modules/fides/messaging/redis_simplex_queue.py index 4fd152416..a1c449f0f 100644 --- a/modules/fidesModule/messaging/redis_simplex_queue.py +++ b/modules/fides/messaging/redis_simplex_queue.py @@ -5,8 +5,6 @@ from slips_files.core.database.database_manager import DBManager from ..messaging.queue import Queue from ..utils.logger import Logger -from dataclasses import dataclass -from typing import List, Optional logger = Logger(__name__) diff --git a/modules/fidesModule/model/__init__.py b/modules/fides/model/__init__.py similarity index 100% rename from modules/fidesModule/model/__init__.py rename to modules/fides/model/__init__.py diff --git a/modules/fidesModule/model/alert.py b/modules/fides/model/alert.py similarity index 100% rename from modules/fidesModule/model/alert.py rename to modules/fides/model/alert.py diff --git a/modules/fides/model/aliases.py b/modules/fides/model/aliases.py new file mode 100644 index 000000000..3c9762d33 --- /dev/null +++ b/modules/fides/model/aliases.py @@ -0,0 +1,26 @@ +IP = str +# IPv4, IPv6 in string representation. + +Domain = str +# Host Name, Domain. + +PeerId = str +# String representation of peer's public key. + +OrganisationId = str +# String representation of organisation ID. + +Target = str +# Intelligence Target - domain or IP. + +ConfidentialityLevel = float +# Confidentiality level for threat intelligence. +# If an entity needs to have access to any data, it must mean +# entity.confidentiality_level >= data.confidentiality_level +# thus level 0 means accessible for everybody + +Score = float +# Score for the target, -1 <= score <= 1 + +Confidence = float +# Confidence in score, 0 <= confidence <= 1 diff --git a/modules/fidesModule/model/configuration.py b/modules/fides/model/configuration.py similarity index 57% rename from modules/fidesModule/model/configuration.py rename to modules/fides/model/configuration.py index 99bfe71e0..685e91db4 100644 --- a/modules/fidesModule/model/configuration.py +++ b/modules/fides/model/configuration.py @@ -13,9 +13,9 @@ class PrivacyLevel: """Name of the level.""" value: float """Value used for comparison. - + 0 <= value <= 1 - + (there can be a case where value > 1 but that means the data won't be ever send) """ @@ -43,8 +43,8 @@ class TrustedEntity: """Initial trust for the entity. If, "enforce_trust = false" this value will change during time as the instance has more interactions with - organisation nodes. If "enforce_trust = true", the trust for all peers from this entity will remain - the same. + organisation nodes. If "enforce_trust = true", the trust for all peers from this entity will remain + the same. """ enforce_trust: bool @@ -100,7 +100,7 @@ class TrustModelConfiguration: service_history_max_size: int """Maximal size of Service History. - + In model's notation sh_max. """ @@ -135,70 +135,102 @@ def load_configuration(file_path: str) -> TrustModelConfiguration: with open(file_path, "r") as stream: try: import yaml + return __parse_config(yaml.safe_load(stream)) except Exception as exc: - Logger('config_loader').error(f"It was not possible to load file! {exc}.") + Logger("config_loader").error( + f"It was not possible to load file! {exc}." + ) raise exc def __parse_config(data: dict) -> TrustModelConfiguration: return TrustModelConfiguration( - privacy_levels=[PrivacyLevel(name=level['name'], - value=level['value']) - for level in data['confidentiality']['levels']], - confidentiality_thresholds=[ConfidentialityThreshold(level=threshold['level'], - required_trust=threshold['requiredTrust']) - for threshold in data['confidentiality']['thresholds']], - data_default_level=data['confidentiality']['defaultLevel'], - initial_reputation=data['trust']['service']['initialReputation'], - service_history_max_size=data['trust']['service']['historyMaxSize'], + privacy_levels=[ + PrivacyLevel(name=level["name"], value=level["value"]) + for level in data["confidentiality"]["levels"] + ], + confidentiality_thresholds=[ + ConfidentialityThreshold( + level=threshold["level"], + required_trust=threshold["requiredTrust"], + ) + for threshold in data["confidentiality"]["thresholds"] + ], + data_default_level=data["confidentiality"]["defaultLevel"], + initial_reputation=data["trust"]["service"]["initialReputation"], + service_history_max_size=data["trust"]["service"]["historyMaxSize"], recommendations=RecommendationsConfiguration( - enabled=data['trust']['recommendations']['enabled'], - only_connected=data['trust']['recommendations']['useOnlyConnected'], - only_preconfigured=data['trust']['recommendations']['useOnlyPreconfigured'], - required_trusted_peers_count=data['trust']['recommendations']['requiredTrustedPeersCount'], - trusted_peer_threshold=data['trust']['recommendations']['trustedPeerThreshold'], - peers_max_count=data['trust']['recommendations']['peersMaxCount'], - history_max_size=data['trust']['recommendations']['historyMaxSize'] + enabled=data["trust"]["recommendations"]["enabled"], + only_connected=data["trust"]["recommendations"][ + "useOnlyConnected" + ], + only_preconfigured=data["trust"]["recommendations"][ + "useOnlyPreconfigured" + ], + required_trusted_peers_count=data["trust"]["recommendations"][ + "requiredTrustedPeersCount" + ], + trusted_peer_threshold=data["trust"]["recommendations"][ + "trustedPeerThreshold" + ], + peers_max_count=data["trust"]["recommendations"]["peersMaxCount"], + history_max_size=data["trust"]["recommendations"][ + "historyMaxSize" + ], ), - alert_trust_from_unknown=data['trust']['alert']['defaultTrust'], - trusted_peers=[TrustedEntity(id=e['id'], - name=e['name'], - trust=e['trust'], - enforce_trust=e['enforceTrust'], - confidentiality_level=e['confidentialityLevel']) - for e in data['trust']['peers']], - trusted_organisations=[TrustedEntity(id=e['id'], - name=e['name'], - trust=e['trust'], - enforce_trust=e['enforceTrust'], - confidentiality_level=e['confidentialityLevel']) - for e in data['trust']['organisations']], - network_opinion_cache_valid_seconds=data['trust']['networkOpinionCacheValidSeconds'], + alert_trust_from_unknown=data["trust"]["alert"]["defaultTrust"], + trusted_peers=[ + TrustedEntity( + id=e["id"], + name=e["name"], + trust=e["trust"], + enforce_trust=e["enforceTrust"], + confidentiality_level=e["confidentialityLevel"], + ) + for e in data["trust"]["peers"] + ], + trusted_organisations=[ + TrustedEntity( + id=e["id"], + name=e["name"], + trust=e["trust"], + enforce_trust=e["enforceTrust"], + confidentiality_level=e["confidentialityLevel"], + ) + for e in data["trust"]["organisations"] + ], + network_opinion_cache_valid_seconds=data["trust"][ + "networkOpinionCacheValidSeconds" + ], interaction_evaluation_strategy=__parse_evaluation_strategy(data), - ti_aggregation_strategy=TIAggregationStrategy[data['trust']['tiAggregationStrategy']](), - database=data['database'] if 'database' in data else "fides_p2p_db.sqlite", + ti_aggregation_strategy=TIAggregationStrategy[ + data["trust"]["tiAggregationStrategy"] + ](), + database=( + data["database"] if "database" in data else "fides_p2p_db.sqlite" + ), ) def __parse_evaluation_strategy(data: dict) -> TIEvaluation: - strategies = data['trust']['interactionEvaluationStrategies'] + strategies = data["trust"]["interactionEvaluationStrategies"] def get_strategy_for_key(key: str) -> TIEvaluation: kwargs = strategies[key] kwargs = kwargs if kwargs else {} # there's special handling as this one combines multiple of them - if key == 'threshold': - kwargs['lower'] = get_strategy_for_key(kwargs['lower']) - kwargs['higher'] = get_strategy_for_key(kwargs['higher']) - elif key == 'maxConfidence': - kwargs['distance'] = get_strategy_for_key('distance') - kwargs['localDistance'] = get_strategy_for_key('localDistance') - kwargs['even'] = get_strategy_for_key('even') - elif key == 'weighedDistance': - kwargs['distance'] = get_strategy_for_key('distance') - kwargs['localDistance'] = get_strategy_for_key('localDistance') + if key == "threshold": + kwargs["lower"] = get_strategy_for_key(kwargs["lower"]) + kwargs["higher"] = get_strategy_for_key(kwargs["higher"]) + elif key == "maxConfidence": + kwargs["distance"] = get_strategy_for_key("distance") + kwargs["localDistance"] = get_strategy_for_key("localDistance") + kwargs["even"] = get_strategy_for_key("even") + elif key == "weighedDistance": + kwargs["distance"] = get_strategy_for_key("distance") + kwargs["localDistance"] = get_strategy_for_key("localDistance") return EvaluationStrategy[key](**kwargs) - return get_strategy_for_key(strategies['used']) + return get_strategy_for_key(strategies["used"]) diff --git a/modules/fidesModule/model/peer.py b/modules/fides/model/peer.py similarity index 86% rename from modules/fidesModule/model/peer.py rename to modules/fides/model/peer.py index bb7dcb337..58cd4e10f 100644 --- a/modules/fidesModule/model/peer.py +++ b/modules/fides/model/peer.py @@ -18,16 +18,16 @@ class PeerInfo: ip: Optional[IP] = None """Ip address of the peer, if we know it. - There are cases when we don't know the IP of the peer - when running behind NAT + There are cases when we don't know the IP of the peer - when running behind NAT or when the peers used TURN server to connect to each other. """ def to_dict(self): """Convert to dictionary for serialization.""" return { - 'id': self.id, - 'organisations': [org for org in self.organisations], - 'ip': self.ip, + "id": self.id, + "organisations": [org for org in self.organisations], + "ip": self.ip, } @classmethod diff --git a/modules/fidesModule/model/peer_trust_data.py b/modules/fides/model/peer_trust_data.py similarity index 74% rename from modules/fidesModule/model/peer_trust_data.py rename to modules/fides/model/peer_trust_data.py index c2032826e..4ffc25795 100644 --- a/modules/fidesModule/model/peer_trust_data.py +++ b/modules/fides/model/peer_trust_data.py @@ -3,8 +3,11 @@ from ..model.aliases import PeerId, OrganisationId from ..model.peer import PeerInfo -from ..model.recommendation_history import RecommendationHistory -from ..model.service_history import ServiceHistory +from ..model.recommendation_history import ( + RecommendationHistory, + RecommendationHistoryRecord, +) +from ..model.service_history import ServiceHistory, ServiceHistoryRecord @dataclass @@ -19,28 +22,28 @@ class PeerTrustData: service_trust: float """Service Trust Metric. - + Semantic meaning is basically "trust" - how much does current peer trust peer "j" about quality of service. In model's notation st_ij. - + 0 <= service_trust <= 1 """ reputation: float """Reputation Metric. - + The reputation metric measures a stranger’s trustworthiness based on recommendations. In model's notation r_ij. - + 0 <= reputation <= 1 """ recommendation_trust: float """Recommendation Trust Metric. - + How much does the peer trust that any recommendation received from this peer is correct. In model's notation rt_ij. - + 0 <= recommendation_trust <= 1 """ @@ -64,7 +67,7 @@ class PeerTrustData: initial_reputation_provided_by_count: int """How many peers provided recommendation during initial calculation of reputation. - + In model's notation η_ij. """ @@ -104,8 +107,12 @@ def to_dict(self, remove_histories: bool = False): "competence_belief": self.competence_belief, "integrity_belief": self.integrity_belief, "initial_reputation_provided_by_count": self.initial_reputation_provided_by_count, - "service_history": [sh.to_dict() for sh in self.service_history], # Assuming ServiceHistory has to_dict - "recommendation_history": [rh.to_dict() for rh in self.recommendation_history] # Assuming RecommendationHistory has to_dict + "service_history": [ + sh.to_dict() for sh in self.service_history + ], # Assuming ServiceHistory has to_dict + "recommendation_history": [ + rh.to_dict() for rh in self.recommendation_history + ], # Assuming RecommendationHistory has to_dict } if remove_histories: @@ -117,28 +124,39 @@ def to_dict(self, remove_histories: bool = False): # Method to create an object from a dictionary @classmethod def from_dict(cls, data): + """Create a PeerTrustData instance from a dictionary payload.""" return cls( - info=PeerInfo.from_dict(data["info"]), # Assuming PeerInfo has from_dict method + info=PeerInfo.from_dict( + data["info"] + ), # Assuming PeerInfo has from_dict method has_fixed_trust=data["has_fixed_trust"], service_trust=data["service_trust"], reputation=data["reputation"], recommendation_trust=data["recommendation_trust"], competence_belief=data["competence_belief"], integrity_belief=data["integrity_belief"], - initial_reputation_provided_by_count=data["initial_reputation_provided_by_count"], - service_history=[ServiceHistory.from_dict(sh) for sh in data["service_history"]], - # Assuming ServiceHistory has from_dict - recommendation_history=[RecommendationHistory.from_dict(rh) for rh in data["recommendation_history"]] - # Assuming RecommendationHistory has from_dict + initial_reputation_provided_by_count=data[ + "initial_reputation_provided_by_count" + ], + service_history=[ + ServiceHistoryRecord.from_dict(sh) + for sh in data["service_history"] + ], + recommendation_history=[ + RecommendationHistoryRecord.from_dict(rh) + for rh in data["recommendation_history"] + ], ) TrustMatrix = Dict[PeerId, PeerTrustData] -"""Matrix that have PeerId as a key and then value is data about trust we have.""" +# Matrix that have PeerId as a key and then value is data about trust we have. -def trust_data_prototype(peer: PeerInfo, has_fixed_trust: bool = False) -> PeerTrustData: - """Creates clear trust object with 0 values and given peer info.""" +def trust_data_prototype( + peer: PeerInfo, has_fixed_trust: bool = False +) -> PeerTrustData: + # Creates clear trust object with 0 values and given peer info. return PeerTrustData( info=peer, has_fixed_trust=has_fixed_trust, @@ -149,5 +167,5 @@ def trust_data_prototype(peer: PeerInfo, has_fixed_trust: bool = False) -> PeerT integrity_belief=0, initial_reputation_provided_by_count=0, service_history=[], - recommendation_history=[] + recommendation_history=[], ) diff --git a/modules/fidesModule/model/recommendation.py b/modules/fides/model/recommendation.py similarity index 96% rename from modules/fidesModule/model/recommendation.py rename to modules/fides/model/recommendation.py index 6b6c9d937..9a7d64d24 100644 --- a/modules/fidesModule/model/recommendation.py +++ b/modules/fides/model/recommendation.py @@ -7,38 +7,38 @@ class Recommendation: competence_belief: float """How much is peer satisfied with historical service interactions. - + In general, this is expected mean behavior of the peer. In model's notation cb_kj. - + 0 <= competence_belief <= 1 """ integrity_belief: float """How much is peer consistent in its behavior. - + In general, this is standard deviation from the mean behavior. In model's notation ib_kj. - + 0 <= integrity_belief <= 1 """ service_history_size: int """Size of service interaction history. - + In model's notation sh_kj. """ recommendation: float """Recommendation about reputation. - + In model's notation r_kj. - + 0 <= recommendation <= 1 """ initial_reputation_provided_by_count: int """How many peers which provided recommendation during the initial calculation of r_kj. - + In model's notation η_kj. """ diff --git a/modules/fides/model/recommendation_history.py b/modules/fides/model/recommendation_history.py new file mode 100644 index 000000000..6ee1b02f1 --- /dev/null +++ b/modules/fides/model/recommendation_history.py @@ -0,0 +1,42 @@ +from dataclasses import dataclass +from typing import List + +from ..utils.time import Time + + +@dataclass +class RecommendationHistoryRecord: + # Represents an evaluation of a single recommendation interaction between peer i and peer j. + + satisfaction: float + # Peer's satisfaction with the recommendation. In model's notation rs_ij. + # 0 <= satisfaction <= 1 + + weight: float + # Weight of the recommendation. In model's notation rw_ij. + # 0 <= weight <= 1 + + timestamp: Time + # Date time when this recommendation happened. + + def to_dict(self): + # Convert the instance to a dictionary. + return { + "satisfaction": self.satisfaction, + "weight": self.weight, + "timestamp": self.timestamp, # Keep as float + } + + @classmethod + def from_dict(cls, dict_obj): + # Create an instance of RecommendationHistoryRecord from a dictionary. + return cls( + satisfaction=dict_obj["satisfaction"], + weight=dict_obj["weight"], + timestamp=dict_obj["timestamp"], # Keep as float + ) + + +RecommendationHistory = List[RecommendationHistoryRecord] +# Ordered list with history of recommendation interactions. +# First element in the list is the oldest one. diff --git a/modules/fides/model/service_history.py b/modules/fides/model/service_history.py new file mode 100644 index 000000000..190674e9c --- /dev/null +++ b/modules/fides/model/service_history.py @@ -0,0 +1,44 @@ +from dataclasses import dataclass +from typing import List + +from ..utils.time import Time + + +@dataclass +class ServiceHistoryRecord: + # Represents an evaluation of a single service interaction between peer i and peer j. + + satisfaction: float + # Peer's satisfaction with the service. In model's notation s_ij. + # 0 <= satisfaction <= 1 + + weight: float + # Weight of the service interaction. In model's notation w_ij. + # 0 <= weight <= 1 + + timestamp: Time + # Date time when this interaction happened. + + def to_dict(self): + # Convert the instance to a dictionary. + return { + "satisfaction": self.satisfaction, + "weight": self.weight, + "timestamp": self.timestamp, + } + + @classmethod + def from_dict(cls, dict_obj): + # Create an instance of ServiceHistoryRecord from a dictionary. + return cls( + satisfaction=dict_obj["satisfaction"], + weight=dict_obj["weight"], + timestamp=dict_obj[ + "timestamp" + ], # Convert ISO format back to datetime + ) + + +ServiceHistory = List[ServiceHistoryRecord] +# Ordered list with history of service interactions. +# First element in the list is the oldest one. diff --git a/modules/fidesModule/model/threat_intelligence.py b/modules/fides/model/threat_intelligence.py similarity index 81% rename from modules/fidesModule/model/threat_intelligence.py rename to modules/fides/model/threat_intelligence.py index 3f439c054..511c96783 100644 --- a/modules/fidesModule/model/threat_intelligence.py +++ b/modules/fides/model/threat_intelligence.py @@ -10,13 +10,13 @@ class ThreatIntelligence: score: Score """How much is subject malicious or benign. - + -1 <= score <= 1 """ confidence: Confidence """How much does peer trust, that score is correct. - + 0 <= confidence <= 1 """ @@ -44,7 +44,13 @@ def to_dict(self): def from_dict(cls, data: dict): return cls( target=data["target"], - confidentiality=float(data["confidentiality"]) if data.get("confidentiality") else None, + confidentiality=( + float(data["confidentiality"]) + if data.get("confidentiality") + else None + ), score=float(data["score"]) if data.get("score") else None, - confidence=float(data["confidence"]) if data.get("confidence") else None + confidence=( + float(data["confidence"]) if data.get("confidence") else None + ), ) diff --git a/modules/fidesModule/originals/__init__.py b/modules/fides/originals/__init__.py similarity index 100% rename from modules/fidesModule/originals/__init__.py rename to modules/fides/originals/__init__.py diff --git a/modules/fidesModule/originals/abstracts.py b/modules/fides/originals/abstracts.py similarity index 72% rename from modules/fidesModule/originals/abstracts.py rename to modules/fides/originals/abstracts.py index 699575d32..2c43188af 100644 --- a/modules/fidesModule/originals/abstracts.py +++ b/modules/fides/originals/abstracts.py @@ -8,22 +8,22 @@ # This is the abstract Module class to check against. Do not modify class Module(object): - name = '' - description = 'Template abstract originals' - authors = ['Template abstract Author'] + name = "" + description = "Template abstract originals" + authors = ["Template abstract Author"] output = [] def __init__(self): pass def usage(self): - print('Usage') + print("Usage") def help(self): - print('Help') + print("Help") def run(self): try: - print('test') - except Exception as e: - print('error') + print("test") + except Exception: + print("error") diff --git a/modules/fidesModule/originals/database.py b/modules/fides/originals/database.py similarity index 82% rename from modules/fidesModule/originals/database.py rename to modules/fides/originals/database.py index fab26689c..f7bddc3e4 100644 --- a/modules/fidesModule/originals/database.py +++ b/modules/fides/originals/database.py @@ -6,13 +6,13 @@ class Database(object): - """ Database object management """ + """Database object management""" def __init__(self): self.r: Redis def start(self, slip_conf): - raise NotImplemented('Use real implementation for Slips!') + raise NotImplementedError("Use real implementation for Slips!") __database__ = Database() diff --git a/modules/fidesModule/protocols/__init__.py b/modules/fides/persistence/__init__.py similarity index 100% rename from modules/fidesModule/protocols/__init__.py rename to modules/fides/persistence/__init__.py diff --git a/modules/fidesModule/persistence/fides_sqlite_db.py b/modules/fides/persistence/fides_sqlite_db.py similarity index 91% rename from modules/fidesModule/persistence/fides_sqlite_db.py rename to modules/fides/persistence/fides_sqlite_db.py index 590674101..48c86337e 100644 --- a/modules/fidesModule/persistence/fides_sqlite_db.py +++ b/modules/fides/persistence/fides_sqlite_db.py @@ -6,6 +6,7 @@ import os import sqlite3 +from pathlib import Path from typing import List, Any, Optional from slips_files.core.output import Output @@ -20,7 +21,7 @@ class FidesSQLiteDB: _lock = threading.RLock() - name = "Fides SQLiteDB" + name = "fides_sqlite_db" def __init__(self, logger: Output, db_path: str) -> None: """ @@ -31,13 +32,23 @@ def __init__(self, logger: Output, db_path: str) -> None: """ self.logger = logger self.db_path = db_path - with open(self.db_path, "a") as f: - f.close() - sqlite3.connect(self.db_path).close() + if not self.__is_in_memory_database(): + Path(self.db_path).parent.mkdir(parents=True, exist_ok=True) + with open(self.db_path, "a") as f: + f.close() + sqlite3.connect(self.db_path).close() self.connection: Optional[sqlite3.Connection] = None self.__connect() self.__create_tables() + def __is_in_memory_database(self) -> bool: + """ + Determines whether the configured database path targets SQLite memory storage. + + :return: True when the database should live only in memory, otherwise False. + """ + return self.db_path == ":memory:" + def __slips_log(self, txt: str) -> None: self.logger.output_line_to_cli_and_logfiles( {"verbose": 2, "debug": 0, "from": self.name, "txt": txt} @@ -104,6 +115,37 @@ def store_slips_threat_intelligence( def store_peer_trust_data(self, peer_trust_data: PeerTrustData) -> None: with FidesSQLiteDB._lock: + self.__execute_query( + """ + DELETE FROM PeerTrustServiceHistory + WHERE peer_trust_data_id IN ( + SELECT id FROM PeerTrustData WHERE peerID = ? + ); + """, + [peer_trust_data.info.id], + ) + self.__execute_query( + """ + DELETE FROM PeerTrustRecommendationHistory + WHERE peer_trust_data_id IN ( + SELECT id FROM PeerTrustData WHERE peerID = ? + ); + """, + [peer_trust_data.info.id], + ) + self.__execute_query( + "DELETE FROM ServiceHistory WHERE peerID = ?;", + [peer_trust_data.info.id], + ) + self.__execute_query( + "DELETE FROM RecommendationHistory WHERE peerID = ?;", + [peer_trust_data.info.id], + ) + self.__execute_query( + "DELETE FROM PeerTrustData WHERE peerID = ?;", + [peer_trust_data.info.id], + ) + # Insert PeerInfo first to ensure the peer exists self.__execute_query( """ @@ -143,6 +185,9 @@ def store_peer_trust_data(self, peer_trust_data: PeerTrustData) -> None: peer_trust_data.initial_reputation_provided_by_count, ), ) + peer_trust_data_id = self.__execute_query( + "SELECT last_insert_rowid();" + )[0][0] # Prepare to insert service history and link to PeerTrustData for sh in peer_trust_data.service_history: @@ -163,8 +208,14 @@ def store_peer_trust_data(self, peer_trust_data: PeerTrustData) -> None: self.__execute_query( """ INSERT INTO PeerTrustServiceHistory (peer_trust_data_id, service_history_id) - VALUES (last_insert_rowid(), last_insert_rowid()); - """ + VALUES (?, ?); + """, + ( + peer_trust_data_id, + self.__execute_query("SELECT last_insert_rowid();")[0][ + 0 + ], + ), ) # Prepare to insert recommendation history and link to PeerTrustData @@ -186,8 +237,14 @@ def store_peer_trust_data(self, peer_trust_data: PeerTrustData) -> None: self.__execute_query( """ INSERT INTO PeerTrustRecommendationHistory (peer_trust_data_id, recommendation_history_id) - VALUES (last_insert_rowid(), last_insert_rowid()); - """ + VALUES (?, ?); + """, + ( + peer_trust_data_id, + self.__execute_query("SELECT last_insert_rowid();")[0][ + 0 + ], + ), ) def get_peers_by_minimal_recommendation_trust( diff --git a/modules/fidesModule/persistence/threat_intelligence.py b/modules/fides/persistence/threat_intelligence.py similarity index 63% rename from modules/fidesModule/persistence/threat_intelligence.py rename to modules/fides/persistence/threat_intelligence.py index f8ce520e2..51ea99f25 100644 --- a/modules/fidesModule/persistence/threat_intelligence.py +++ b/modules/fides/persistence/threat_intelligence.py @@ -1,7 +1,9 @@ from typing import Optional -from modules.fidesModule.model.aliases import Target -from modules.fidesModule.model.threat_intelligence import SlipsThreatIntelligence +from modules.fides.model.aliases import Target +from modules.fides.model.threat_intelligence import ( + SlipsThreatIntelligence, +) class ThreatIntelligenceDatabase: @@ -9,4 +11,4 @@ class ThreatIntelligenceDatabase: def get_for(self, target: Target) -> Optional[SlipsThreatIntelligence]: """Returns threat intelligence for given target or None if there are no data.""" - raise NotImplemented() + raise NotImplementedError() diff --git a/modules/fidesModule/persistence/threat_intelligence_db.py b/modules/fides/persistence/threat_intelligence_db.py similarity index 82% rename from modules/fidesModule/persistence/threat_intelligence_db.py rename to modules/fides/persistence/threat_intelligence_db.py index 6b450f46e..2b3d868a6 100644 --- a/modules/fidesModule/persistence/threat_intelligence_db.py +++ b/modules/fides/persistence/threat_intelligence_db.py @@ -4,7 +4,7 @@ from ..model.aliases import Target from ..model.configuration import TrustModelConfiguration from ..model.threat_intelligence import SlipsThreatIntelligence -from modules.fidesModule.persistence.threat_intelligence import ( +from modules.fides.persistence.threat_intelligence import ( ThreatIntelligenceDatabase, ) @@ -33,7 +33,12 @@ def get_for(self, target: Target) -> Optional[SlipsThreatIntelligence]: out = self.db.get_fides_ti(target) # returns str containing dumped # dict of STI or None if out: - out = SlipsThreatIntelligence(**json.loads(out)) + try: + out = SlipsThreatIntelligence(**json.loads(out)) + except (TypeError, ValueError, json.JSONDecodeError): + out = self.sqldb.get_slips_threat_intelligence_by_target( + target + ) else: out = self.sqldb.get_slips_threat_intelligence_by_target(target) return out diff --git a/modules/fidesModule/persistence/trust.py b/modules/fides/persistence/trust.py similarity index 57% rename from modules/fidesModule/persistence/trust.py rename to modules/fides/persistence/trust.py index d9efe379e..26625b7e1 100644 --- a/modules/fidesModule/persistence/trust.py +++ b/modules/fides/persistence/trust.py @@ -1,10 +1,15 @@ from typing import List, Optional, Union -from modules.fidesModule.messaging.model import PeerInfo -from modules.fidesModule.model.aliases import PeerId, Target, OrganisationId -from modules.fidesModule.model.configuration import TrustModelConfiguration -from modules.fidesModule.model.peer_trust_data import PeerTrustData, TrustMatrix -from modules.fidesModule.model.threat_intelligence import SlipsThreatIntelligence +from modules.fides.messaging.model import PeerInfo +from modules.fides.model.aliases import PeerId, Target, OrganisationId +from modules.fides.model.configuration import TrustModelConfiguration +from modules.fides.model.peer_trust_data import ( + PeerTrustData, + TrustMatrix, +) +from modules.fides.model.threat_intelligence import ( + SlipsThreatIntelligence, +) class TrustDatabase: @@ -19,50 +24,62 @@ def get_model_configuration(self) -> TrustModelConfiguration: def store_connected_peers_list(self, current_peers: List[PeerInfo]): """Stores list of peers that are directly connected to the Slips.""" - raise NotImplemented() + raise NotImplementedError() def get_connected_peers(self) -> List[PeerInfo]: """Returns list of peers that are directly connected to the Slips.""" - raise NotImplemented() + raise NotImplementedError() def get_peers_info(self, peer_ids: List[PeerId]) -> List[PeerInfo]: """Returns list of peer infos for given ids.""" - raise NotImplemented() + raise NotImplementedError() - def get_peers_with_organisations(self, organisations: List[OrganisationId]) -> List[PeerInfo]: + def get_peers_with_organisations( + self, organisations: List[OrganisationId] + ) -> List[PeerInfo]: """Returns list of peers that have one of given organisations.""" - raise NotImplemented() + raise NotImplementedError() - def get_peers_with_geq_recommendation_trust(self, minimal_recommendation_trust: float) -> List[PeerInfo]: + def get_peers_with_geq_recommendation_trust( + self, minimal_recommendation_trust: float + ) -> List[PeerInfo]: """Returns peers that have >= recommendation_trust then the minimal.""" - raise NotImplemented() + raise NotImplementedError() - def get_peers_with_geq_service_trust(self, minimal_service_trust: float) -> List[PeerInfo]: + def get_peers_with_geq_service_trust( + self, minimal_service_trust: float + ) -> List[PeerInfo]: """Returns peers that have >= service_trust then the minimal.""" - raise NotImplemented() + raise NotImplementedError() def store_peer_trust_data(self, trust_data: PeerTrustData): """Stores trust data for given peer - overwrites any data if existed.""" - raise NotImplemented() + raise NotImplementedError() def store_peer_trust_matrix(self, trust_matrix: TrustMatrix): """Stores trust matrix.""" for peer in trust_matrix.values(): self.store_peer_trust_data(peer) - def get_peer_trust_data(self, peer: Union[PeerId, PeerInfo]) -> Optional[PeerTrustData]: + def get_peer_trust_data( + self, peer: Union[PeerId, PeerInfo] + ) -> Optional[PeerTrustData]: """Returns trust data for given peer ID, if no data are found, returns None.""" - raise NotImplemented() + raise NotImplementedError() - def get_peers_trust_data(self, peer_ids: List[Union[PeerId, PeerInfo]]) -> TrustMatrix: + def get_peers_trust_data( + self, peer_ids: List[Union[PeerId, PeerInfo]] + ) -> TrustMatrix: """Return trust data for each peer from peer_ids.""" data = [self.get_peer_trust_data(peer_id) for peer_id in peer_ids] return {peer.peer_id: peer for peer in data if peer} def cache_network_opinion(self, ti: SlipsThreatIntelligence): """Caches aggregated opinion on given target.""" - raise NotImplemented() + raise NotImplementedError() - def get_cached_network_opinion(self, target: Target) -> Optional[SlipsThreatIntelligence]: + def get_cached_network_opinion( + self, target: Target + ) -> Optional[SlipsThreatIntelligence]: """Returns cached network opinion. Checks cache time and returns None if data expired.""" - raise NotImplemented() + raise NotImplementedError() diff --git a/modules/fidesModule/persistence/trust_db.py b/modules/fides/persistence/trust_db.py similarity index 94% rename from modules/fidesModule/persistence/trust_db.py rename to modules/fides/persistence/trust_db.py index b11974fb7..64f8350b5 100644 --- a/modules/fidesModule/persistence/trust_db.py +++ b/modules/fides/persistence/trust_db.py @@ -5,7 +5,7 @@ from ..model.configuration import TrustModelConfiguration from ..model.peer_trust_data import PeerTrustData, TrustMatrix from ..model.threat_intelligence import SlipsThreatIntelligence -from modules.fidesModule.persistence.trust import TrustDatabase +from modules.fides.persistence.trust import TrustDatabase from .fides_sqlite_db import FidesSQLiteDB from slips_files.core.database.database_manager import DBManager @@ -120,7 +120,7 @@ def get_peer_trust_data( td_json = self.db.get_peer_trust_data(peer_id) if td_json: # Redis has available data - out = PeerTrustData(**json.loads(td_json)) + out = PeerTrustData.from_dict(json.loads(td_json)) else: # if redis is empty, try SQLite out = self.sqldb.get_peer_trust_data(peer_id) return out @@ -130,7 +130,6 @@ def get_peers_trust_data( ) -> TrustMatrix: """Return trust data for each peer from peer_ids.""" out = {} - peer_id = None for peer in peer_ids: # get PeerID to properly create TrustMatrix @@ -138,9 +137,13 @@ def get_peers_trust_data( peer_id = peer elif isinstance(peer, PeerInfo): peer_id = peer.id + else: + continue # TrustMatrix = Dict[PeerId, PeerTrustData]; here - peer_id: PeerId - out[peer_id] = self.get_peer_trust_data(peer_id) + trust_data = self.get_peer_trust_data(peer_id) + if trust_data is not None: + out[peer_id] = trust_data return out def cache_network_opinion(self, ti: SlipsThreatIntelligence): diff --git a/modules/fides/protocols/__init__.py b/modules/fides/protocols/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/modules/fidesModule/protocols/alert.py b/modules/fides/protocols/alert.py similarity index 100% rename from modules/fidesModule/protocols/alert.py rename to modules/fides/protocols/alert.py diff --git a/modules/fidesModule/protocols/initial_trusl.py b/modules/fides/protocols/initial_trusl.py similarity index 69% rename from modules/fidesModule/protocols/initial_trusl.py rename to modules/fides/protocols/initial_trusl.py index 5e088ba00..1a497cd21 100644 --- a/modules/fidesModule/protocols/initial_trusl.py +++ b/modules/fides/protocols/initial_trusl.py @@ -11,16 +11,19 @@ class InitialTrustProtocol: - def __init__(self, - trust_db: SlipsTrustDatabase, - configuration: TrustModelConfiguration, - recommendation_protocol: RecommendationProtocol - ): + def __init__( + self, + trust_db: SlipsTrustDatabase, + configuration: TrustModelConfiguration, + recommendation_protocol: RecommendationProtocol, + ): self.__trust_db = trust_db self.__configuration = configuration self.__recommendation_protocol = recommendation_protocol - def determine_and_store_initial_trust(self, peer: PeerInfo, get_recommendations: bool = False) -> PeerTrustData: + def determine_and_store_initial_trust( + self, peer: PeerInfo, get_recommendations: bool = False + ) -> PeerTrustData: """Determines initial trust and stores that value in database. Returns trust data before the recommendation protocol is executed. @@ -29,7 +32,9 @@ def determine_and_store_initial_trust(self, peer: PeerInfo, get_recommendations: existing_trust = self.__trust_db.get_peer_trust_data(peer.id) if existing_trust is not None: - logger.debug(f"There's an existing trust for peer {peer.id}: ST: {existing_trust.service_trust}") + logger.debug( + f"There's an existing trust for peer {peer.id}: ST: {existing_trust.service_trust}" + ) return existing_trust # now we know that this is a new peer @@ -40,29 +45,43 @@ def determine_and_store_initial_trust(self, peer: PeerInfo, get_recommendations: trust.initial_reputation_provided_by_count = 1 # check if this is pre-trusted peer - pre_trusted_peer = [p for p in self.__configuration.trusted_peers if trust.peer_id == p.id] + pre_trusted_peer = [ + p + for p in self.__configuration.trusted_peers + if trust.peer_id == p.id + ] if len(pre_trusted_peer) == 1: configured_peer = pre_trusted_peer[0] self.__inherit_trust(trust, configured_peer) trust.initial_reputation_provided_by_count += 1 # add values that are inherited from the organisations - peers_orgs = [org for org in self.__configuration.trusted_organisations if org.id in peer.organisations] + peers_orgs = [ + org + for org in self.__configuration.trusted_organisations + if org.id in peer.organisations + ] if peers_orgs: - logger.debug(f"Peer {peer.id} has known organisations.", peers_orgs) + logger.debug( + f"Peer {peer.id} has known organisations.", peers_orgs + ) trust.initial_reputation_provided_by_count += len(peers_orgs) # select organisation that has the highest trust leading_organisation = max(peers_orgs, key=lambda org: org.trust) - logger.debug(f"Main organisation selected, computing trust", leading_organisation) + logger.debug( + "Main organisation selected, computing trust", + leading_organisation, + ) # now set all other stuff from the organisation self.__inherit_trust(trust, leading_organisation) # process interaction and assign all others values - trust = process_service_interaction(configuration=self.__configuration, - peer=trust, - satisfaction=SatisfactionLevels.Ok, - weight=Weight.FIRST_ENCOUNTER - ) + trust = process_service_interaction( + configuration=self.__configuration, + peer=trust, + satisfaction=SatisfactionLevels.Ok, + weight=Weight.FIRST_ENCOUNTER, + ) logger.debug(f"New trust for peer: {trust.peer_id}", trust) # determine if it is necessary to get recommendations from the network @@ -76,7 +95,9 @@ def determine_and_store_initial_trust(self, peer: PeerInfo, get_recommendations: return trust @staticmethod - def __inherit_trust(trust: PeerTrustData, parent: TrustedEntity) -> PeerTrustData: + def __inherit_trust( + trust: PeerTrustData, parent: TrustedEntity + ) -> PeerTrustData: # TODO [?] check which believes / trust metrics can we set as well trust.reputation = max(trust.reputation, parent.trust) trust.recommendation_trust = trust.reputation @@ -88,6 +109,8 @@ def __inherit_trust(trust: PeerTrustData, parent: TrustedEntity) -> PeerTrustDat # and we will be satisfied with all interactions equally trust.integrity_belief = 1 trust.competence_belief = 1 - logger.debug(f"Enforced trust, leaving service trust to: {trust.service_trust}.") + logger.debug( + f"Enforced trust, leaving service trust to: {trust.service_trust}." + ) return trust diff --git a/modules/fides/protocols/opinion.py b/modules/fides/protocols/opinion.py new file mode 100644 index 000000000..81d8d81de --- /dev/null +++ b/modules/fides/protocols/opinion.py @@ -0,0 +1,61 @@ +from typing import Dict + +from ..evaluation.ti_aggregation import TIAggregation, PeerReport +from ..messaging.model import PeerIntelligenceResponse +from ..model.alert import Alert +from ..model.aliases import PeerId, Target +from ..model.configuration import TrustModelConfiguration +from ..model.peer_trust_data import PeerTrustData, TrustMatrix +from ..model.threat_intelligence import SlipsThreatIntelligence +from ..persistence.threat_intelligence_db import ( + SlipsThreatIntelligenceDatabase, +) + + +class OpinionAggregator: + """ + Class responsible for evaluation of the intelligence received from the network. + """ + + def __init__( + self, + configuration: TrustModelConfiguration, + ti_db: SlipsThreatIntelligenceDatabase, + ti_aggregation: TIAggregation, + ): + self.__configuration = configuration + self.__ti_db = ti_db + self.__ti_aggregation = ti_aggregation + + def evaluate_alert( + self, peer_trust: PeerTrustData, alert: Alert + ) -> SlipsThreatIntelligence: + """Evaluates given data about alert and produces aggregated intelligence for Slips.""" + + alert_trust = max( + self.__configuration.alert_trust_from_unknown, + peer_trust.service_trust, + ) + score = alert.score + confidence = alert.confidence * alert_trust + return SlipsThreatIntelligence( + score=score, confidence=confidence, target=alert.target + ) + + def evaluate_intelligence_response( + self, + target: Target, + data: Dict[PeerId, PeerIntelligenceResponse], + trust_matrix: TrustMatrix, + ) -> SlipsThreatIntelligence: + """Evaluates given threat intelligence report from the network.""" + reports = [ + PeerReport( + report_ti=ti.intelligence, reporter_trust=trust_matrix[peer_id] + ) + for peer_id, ti in data.items() + ] + ti = self.__ti_aggregation.assemble_peer_opinion(data=reports) + return SlipsThreatIntelligence( + score=ti.score, confidence=ti.confidence, target=target + ) diff --git a/modules/fidesModule/protocols/peer_list.py b/modules/fides/protocols/peer_list.py similarity index 65% rename from modules/fidesModule/protocols/peer_list.py rename to modules/fides/protocols/peer_list.py index 6e6fcc554..2f0f48047 100644 --- a/modules/fidesModule/protocols/peer_list.py +++ b/modules/fides/protocols/peer_list.py @@ -10,12 +10,13 @@ class PeerListUpdateProtocol: """Protocol handling situations when peer list was updated.""" - def __init__(self, - trust_db: SlipsTrustDatabase, - bridge: NetworkBridge, - recommendation_protocol: RecommendationProtocol, - trust_protocol: InitialTrustProtocol - ): + def __init__( + self, + trust_db: SlipsTrustDatabase, + bridge: NetworkBridge, + recommendation_protocol: RecommendationProtocol, + trust_protocol: InitialTrustProtocol, + ): self.__trust_db = trust_db self.__bridge = bridge self.__recommendation_protocol = recommendation_protocol @@ -26,8 +27,14 @@ def handle_peer_list_updated(self, peers: List[PeerInfo]): # first store them in the database self.__trust_db.store_connected_peers_list(peers) # and now find their trust metrics to send it to the network module - trust_data = self.__trust_db.get_peers_trust_data([p.id for p in peers]) - known_peers = {peer_id for peer_id, trust in trust_data.items() if trust is not None} + trust_data = self.__trust_db.get_peers_trust_data( + [p.id for p in peers] + ) + known_peers = { + peer_id + for peer_id, trust in trust_data.items() + if trust is not None + } # if we don't have data for all peers that means that there are some new peers # we need to establish initial trust for them if len(known_peers) != len(peers): @@ -35,11 +42,19 @@ def handle_peer_list_updated(self, peers: List[PeerInfo]): for peer in [p for p in peers if p.id not in known_peers]: # this stores trust in database as well, do not get recommendations because at this point # we don't have correct peer list in database - peer_trust = self.__trust_protocol.determine_and_store_initial_trust(peer, get_recommendations=False) + peer_trust = ( + self.__trust_protocol.determine_and_store_initial_trust( + peer, get_recommendations=False + ) + ) new_trusts.append(peer_trust) # get recommendations for this peer - self.__recommendation_protocol.get_recommendation_for(peer, connected_peers=list(known_peers)) + self.__recommendation_protocol.get_recommendation_for( + peer, connected_peers=list(known_peers) + ) # send only updated trusts to the network layer - self.__bridge.send_peers_reliability({p.peer_id: p.service_trust for p in new_trusts}) + self.__bridge.send_peers_reliability( + {p.peer_id: p.service_trust for p in new_trusts} + ) # now set update peer list in database self.__trust_db.store_connected_peers_list(peers) diff --git a/modules/fidesModule/protocols/protocol.py b/modules/fides/protocols/protocol.py similarity index 52% rename from modules/fidesModule/protocols/protocol.py rename to modules/fides/protocols/protocol.py index b9ec4b614..b484eb9c7 100644 --- a/modules/fidesModule/protocols/protocol.py +++ b/modules/fides/protocols/protocol.py @@ -6,37 +6,44 @@ from ..model.aliases import PeerId from ..model.configuration import TrustModelConfiguration from ..model.peer_trust_data import PeerTrustData, TrustMatrix -from modules.fidesModule.persistence.trust import TrustDatabase +from modules.fides.persistence.trust import TrustDatabase class Protocol: - def __init__(self, - configuration: TrustModelConfiguration, - trust_db: TrustDatabase, - bridge: NetworkBridge): + def __init__( + self, + configuration: TrustModelConfiguration, + trust_db: TrustDatabase, + bridge: NetworkBridge, + ): self._configuration = configuration self._trust_db = trust_db self._bridge = bridge - def _evaluate_interaction(self, - peer: PeerTrustData, - satisfaction: Satisfaction, - weight: Weight - ) -> PeerTrustData: + def _evaluate_interaction( + self, peer: PeerTrustData, satisfaction: Satisfaction, weight: Weight + ) -> PeerTrustData: """Callback to evaluate and save new trust data for given peer.""" - return self._evaluate_interactions({peer.peer_id: (peer, satisfaction, weight)})[peer.peer_id] + return self._evaluate_interactions( + {peer.peer_id: (peer, satisfaction, weight)} + )[peer.peer_id] - def _evaluate_interactions(self, - data: Dict[PeerId, Tuple[PeerTrustData, Satisfaction, Weight]]) -> TrustMatrix: + def _evaluate_interactions( + self, data: Dict[PeerId, Tuple[PeerTrustData, Satisfaction, Weight]] + ) -> TrustMatrix: """Callback to evaluate and save new trust data for given peer matrix.""" trust_matrix: TrustMatrix = {} # first process all interactions for _, (peer_trust, satisfaction, weight) in data.items(): - updated_trust = process_service_interaction(self._configuration, peer_trust, satisfaction, weight) + updated_trust = process_service_interaction( + self._configuration, peer_trust, satisfaction, weight + ) trust_matrix[updated_trust.peer_id] = updated_trust # then store matrix self._trust_db.store_peer_trust_matrix(trust_matrix) # and dispatch this update to the network layer - self._bridge.send_peers_reliability({p.peer_id: p.service_trust for p in trust_matrix.values()}) + self._bridge.send_peers_reliability( + {p.peer_id: p.service_trust for p in trust_matrix.values()} + ) return trust_matrix diff --git a/modules/fidesModule/protocols/recommendation.py b/modules/fides/protocols/recommendation.py similarity index 53% rename from modules/fidesModule/protocols/recommendation.py rename to modules/fides/protocols/recommendation.py index a9b732fdc..367218392 100644 --- a/modules/fidesModule/protocols/recommendation.py +++ b/modules/fides/protocols/recommendation.py @@ -19,29 +19,50 @@ class RecommendationProtocol(Protocol): """Protocol that is responsible for getting and updating recommendation data.""" - def __init__(self, configuration: TrustModelConfiguration, trust_db: SlipsTrustDatabase, bridge: NetworkBridge): + def __init__( + self, + configuration: TrustModelConfiguration, + trust_db: SlipsTrustDatabase, + bridge: NetworkBridge, + ): super().__init__(configuration, trust_db, bridge) self.__rec_conf = configuration.recommendations self.__trust_db = trust_db self.__bridge = bridge - def get_recommendation_for(self, peer: PeerInfo, connected_peers: Optional[List[PeerId]] = None): + def get_recommendation_for( + self, peer: PeerInfo, connected_peers: Optional[List[PeerId]] = None + ): """Dispatches recommendation request from the network. connected_peers - new peer list if the one from database is not accurate """ if not self.__rec_conf.enabled: - logger.debug(f"Recommendation protocol is disabled. NOT getting recommendations for Peer {peer.id}.") + logger.debug( + f"Recommendation protocol is disabled. NOT getting recommendations for Peer {peer.id}." + ) return - connected_peers = connected_peers if connected_peers is not None else self.__trust_db.get_connected_peers() - recipients = self.__get_recommendation_request_recipients(peer, connected_peers) + connected_peers = ( + connected_peers + if connected_peers is not None + else self.__trust_db.get_connected_peers() + ) + recipients = self.__get_recommendation_request_recipients( + peer, connected_peers + ) if recipients: - self.__bridge.send_recommendation_request(recipients=recipients, peer=peer.id) + self.__bridge.send_recommendation_request( + recipients=recipients, peer=peer.id + ) else: - logger.debug(f"No peers are trusted enough to ask them for recommendation!") + logger.debug( + "No peers are trusted enough to ask them for recommendation!" + ) - def handle_recommendation_request(self, request_id: str, sender: PeerInfo, subject: PeerId): + def handle_recommendation_request( + self, request_id: str, sender: PeerInfo, subject: PeerId + ): """Handle request for recommendation on given subject.""" sender_trust = self.__trust_db.get_peer_trust_data(sender) # TODO: [+] implement data filtering based on the sender @@ -53,7 +74,7 @@ def handle_recommendation_request(self, request_id: str, sender: PeerInfo, subje integrity_belief=trust.integrity_belief, service_history_size=trust.service_history_size, recommendation=trust.reputation, - initial_reputation_provided_by_count=trust.initial_reputation_provided_by_count + initial_reputation_provided_by_count=trust.initial_reputation_provided_by_count, ) else: recommendation = Recommendation( @@ -61,106 +82,160 @@ def handle_recommendation_request(self, request_id: str, sender: PeerInfo, subje integrity_belief=0, service_history_size=0, recommendation=0, - initial_reputation_provided_by_count=0 + initial_reputation_provided_by_count=0, ) - self.__bridge.send_recommendation_response(request_id, sender.id, subject, recommendation) + self.__bridge.send_recommendation_response( + request_id, sender.id, subject, recommendation + ) # it is possible that we saw sender for the first time # TODO: [+] initialise peer if we saw it for the first time if sender_trust: - self._evaluate_interaction(sender_trust, SatisfactionLevels.Ok, Weight.INTELLIGENCE_REQUEST) + self._evaluate_interaction( + sender_trust, + SatisfactionLevels.Ok, + Weight.INTELLIGENCE_REQUEST, + ) - def handle_recommendation_response(self, responses: List[PeerRecommendationResponse]): + def handle_recommendation_response( + self, responses: List[PeerRecommendationResponse] + ): """Handles response from peers with recommendations. Updates all necessary values in db.""" if len(responses) == 0: return # TODO: [+] handle cases with multiple subjects - assert all(responses[0].subject == r.subject for r in responses), \ - "Responses are not for the same subject!" + assert all( + responses[0].subject == r.subject for r in responses + ), "Responses are not for the same subject!" subject = self.__trust_db.get_peer_trust_data(responses[0].subject) if subject is None: - logger.warn(f'Received recommendation for subject {responses[0].subject} that does not exist!') + logger.warn( + f"Received recommendation for subject {responses[0].subject} that does not exist!" + ) return recommendations = {r.sender.id: r.recommendation for r in responses} - trust_matrix = self.__trust_db.get_peers_trust_data(list(recommendations.keys())) + trust_matrix = self.__trust_db.get_peers_trust_data( + list(recommendations.keys()) + ) # check that the data are consistent - assert len(trust_matrix) == len(responses) == len(recommendations), \ - f'Data are not consistent: TM: {len(trust_matrix)}, RES: {len(responses)}, REC: {len(recommendations)}!' + assert ( + len(trust_matrix) == len(responses) == len(recommendations) + ), f"Data are not consistent: TM: {len(trust_matrix)}, RES: {len(responses)}, REC: {len(recommendations)}!" # update all recommendations updated_matrix = process_new_recommendations( configuration=self._configuration, subject=subject, matrix=trust_matrix, - recommendations=recommendations + recommendations=recommendations, ) # now store updated matrix self.__trust_db.store_peer_trust_matrix(updated_matrix) # and dispatch event - self.__bridge.send_peers_reliability({p.peer_id: p.service_trust for p in updated_matrix.values()}) + self.__bridge.send_peers_reliability( + {p.peer_id: p.service_trust for p in updated_matrix.values()} + ) # TODO: [+] optionally employ same thing as when receiving TI - interaction_matrix = {p.peer_id: (p, SatisfactionLevels.Ok, Weight.RECOMMENDATION_RESPONSE) - for p in trust_matrix.values()} + interaction_matrix = { + p.peer_id: ( + p, + SatisfactionLevels.Ok, + Weight.RECOMMENDATION_RESPONSE, + ) + for p in trust_matrix.values() + } self._evaluate_interactions(interaction_matrix) @staticmethod def __is_zero_recommendation(recommendation: Recommendation) -> bool: - return recommendation.competence_belief == 0 and \ - recommendation.integrity_belief == 0 and \ - recommendation.service_history_size == 0 and \ - recommendation.recommendation == 0 and \ - recommendation.initial_reputation_provided_by_count == 0 - - def __get_recommendation_request_recipients(self, - subject: PeerInfo, - connected_peers: List[PeerInfo]) -> List[PeerId]: + return ( + recommendation.competence_belief == 0 + and recommendation.integrity_belief == 0 + and recommendation.service_history_size == 0 + and recommendation.recommendation == 0 + and recommendation.initial_reputation_provided_by_count == 0 + ) + + def __get_recommendation_request_recipients( + self, subject: PeerInfo, connected_peers: List[PeerInfo] + ) -> List[PeerId]: recommenders: List[PeerInfo] = [] - require_trusted_peer_count = self.__rec_conf.required_trusted_peers_count + require_trusted_peer_count = ( + self.__rec_conf.required_trusted_peers_count + ) trusted_peer_threshold = self.__rec_conf.trusted_peer_threshold if self.__rec_conf.only_connected: recommenders = connected_peers if self.__rec_conf.only_preconfigured: - preconfigured_peers = set(p.id for p in self._configuration.trusted_peers) - preconfigured_organisations = set(p.id for p in self._configuration.trusted_organisations) + preconfigured_peers = set( + p.id for p in self._configuration.trusted_peers + ) + preconfigured_organisations = set( + p.id for p in self._configuration.trusted_organisations + ) if len(recommenders) > 0: # if there are already some recommenders it means that only_connected filter is enabled # in that case we need to filter those peers and see if they either are on preconfigured # list or if they have any organisation - recommenders = [p for p in recommenders - if p.id in preconfigured_peers - or preconfigured_organisations.intersection(p.organisations)] + recommenders = [ + p + for p in recommenders + if p.id in preconfigured_peers + or preconfigured_organisations.intersection( + p.organisations + ) + ] else: # if there are no recommenders, only_preconfigured is disabled, so we select all preconfigured # peers and all peers from database that have the organisation - recommenders = self.__trust_db.get_peers_info(list(preconfigured_peers)) \ - + self.__trust_db.get_peers_with_organisations(list(preconfigured_organisations)) + recommenders = self.__trust_db.get_peers_info( + list(preconfigured_peers) + ) + self.__trust_db.get_peers_with_organisations( + list(preconfigured_organisations) + ) # if we have only_preconfigured, we do not need to care about minimal trust because we're safe enough require_trusted_peer_count = -math.inf elif not self.__rec_conf.only_connected: # in this case there's no restriction, and we can freely select any peers # select peers that hev at least trusted_peer_threshold recommendation trust - recommenders = self.__trust_db.get_peers_with_geq_recommendation_trust(trusted_peer_threshold) + recommenders = ( + self.__trust_db.get_peers_with_geq_recommendation_trust( + trusted_peer_threshold + ) + ) # if there's not enough peers like that, select some more with this service trust if len(recommenders) <= self.__rec_conf.peers_max_count: # TODO: [+] maybe add higher trusted_peer_threshold for this one - recommenders += self.__trust_db.get_peers_with_geq_service_trust(trusted_peer_threshold) + recommenders += ( + self.__trust_db.get_peers_with_geq_service_trust( + trusted_peer_threshold + ) + ) # now we need to get all trust data and sort them by recommendation trust - candidates = list(self.__trust_db.get_peers_trust_data(recommenders).values()) + candidates = list( + self.__trust_db.get_peers_trust_data(recommenders).values() + ) candidates = [c for c in candidates if c.peer_id != subject.id] # check if we can proceed - if len(candidates) == 0 or len(candidates) < require_trusted_peer_count: + if ( + len(candidates) == 0 + or len(candidates) < require_trusted_peer_count + ): logger.debug( - f"Not enough trusted peers! Candidates: {len(candidates)}, requirement: {require_trusted_peer_count}.") + f"Not enough trusted peers! Candidates: {len(candidates)}, requirement: {require_trusted_peer_count}." + ) return [] # now sort them candidates.sort(key=lambda c: c.service_trust, reverse=True) # and take only top __rec_conf.peers_max_count peers to ask for recommendations - return [p.peer_id for p in candidates][:self.__rec_conf.peers_max_count] + return [p.peer_id for p in candidates][ + : self.__rec_conf.peers_max_count + ] diff --git a/modules/fidesModule/protocols/threat_intelligence.py b/modules/fides/protocols/threat_intelligence.py similarity index 52% rename from modules/fidesModule/protocols/threat_intelligence.py rename to modules/fides/protocols/threat_intelligence.py index 6ae9234d9..48129b745 100644 --- a/modules/fidesModule/protocols/threat_intelligence.py +++ b/modules/fides/protocols/threat_intelligence.py @@ -8,8 +8,13 @@ from ..model.configuration import TrustModelConfiguration from ..model.peer import PeerInfo from ..model.peer_trust_data import PeerTrustData -from ..model.threat_intelligence import ThreatIntelligence, SlipsThreatIntelligence -from ..persistence.threat_intelligence_db import SlipsThreatIntelligenceDatabase +from ..model.threat_intelligence import ( + ThreatIntelligence, + SlipsThreatIntelligence, +) +from ..persistence.threat_intelligence_db import ( + SlipsThreatIntelligenceDatabase, +) from ..persistence.trust_db import SlipsTrustDatabase from ..protocols.initial_trusl import InitialTrustProtocol from ..protocols.opinion import OpinionAggregator @@ -22,16 +27,17 @@ class ThreatIntelligenceProtocol(Protocol): """Class handling threat intelligence requests and responses.""" - def __init__(self, - trust_db: SlipsTrustDatabase, - ti_db: SlipsThreatIntelligenceDatabase, - bridge: NetworkBridge, - configuration: TrustModelConfiguration, - aggregator: OpinionAggregator, - trust_protocol: InitialTrustProtocol, - ti_evaluation_strategy: TIEvaluation, - network_opinion_callback: Callable[[SlipsThreatIntelligence], None] - ): + def __init__( + self, + trust_db: SlipsTrustDatabase, + ti_db: SlipsThreatIntelligenceDatabase, + bridge: NetworkBridge, + configuration: TrustModelConfiguration, + aggregator: OpinionAggregator, + trust_protocol: InitialTrustProtocol, + ti_evaluation_strategy: TIEvaluation, + network_opinion_callback: Callable[[SlipsThreatIntelligence], None], + ): super().__init__(configuration, trust_db, bridge) self.__ti_db = ti_db self.__aggregator = aggregator @@ -43,18 +49,22 @@ def request_data(self, target: Target): """Requests network opinion on given target.""" cached = self._trust_db.get_cached_network_opinion(target) if cached: - logger.debug(f'TI for target {target} found in cache.') + logger.debug(f"TI for target {target} found in cache.") return self.__network_opinion_callback(cached) else: - logger.debug(f'Requesting data for target {target} from network.') + logger.debug(f"Requesting data for target {target} from network.") self._bridge.send_intelligence_request(target) - def handle_intelligence_request(self, request_id: str, sender: PeerInfo, target: Target): + def handle_intelligence_request( + self, request_id: str, sender: PeerInfo, target: Target + ): """Handles intelligence request.""" peer_trust = self._trust_db.get_peer_trust_data(sender.id) if not peer_trust: - logger.debug(f'We don\'t have any trust data for peer {sender.id}!') - peer_trust = self.__trust_protocol.determine_and_store_initial_trust(sender) + logger.debug(f"We don't have any trust data for peer {sender.id}!") + peer_trust = ( + self.__trust_protocol.determine_and_store_initial_trust(sender) + ) ti = self.__filter_ti(self.__ti_db.get_for(target), peer_trust) if ti is None: @@ -63,50 +73,72 @@ def handle_intelligence_request(self, request_id: str, sender: PeerInfo, target: # and respond with data we have self._bridge.send_intelligence_response(request_id, target, ti) - self._evaluate_interaction(peer_trust, - SatisfactionLevels.Ok, - Weight.INTELLIGENCE_REQUEST) + self._evaluate_interaction( + peer_trust, SatisfactionLevels.Ok, Weight.INTELLIGENCE_REQUEST + ) - def handle_intelligence_response(self, responses: List[PeerIntelligenceResponse]): + def handle_intelligence_response( + self, responses: List[PeerIntelligenceResponse] + ): """Handles intelligence responses.""" - trust_matrix = self._trust_db.get_peers_trust_data([r.sender.id for r in responses]) - assert len(trust_matrix) == len(responses), 'We need to have trust data for all peers that sent the response.' + trust_matrix = {} + for response in responses: + peer_trust = self._trust_db.get_peer_trust_data(response.sender.id) + if peer_trust is None: + peer_trust = ( + self.__trust_protocol.determine_and_store_initial_trust( + response.sender + ) + ) + trust_matrix[response.sender.id] = peer_trust + + assert len(trust_matrix) == len( + responses + ), "We need to have trust data for all peers that sent the response." target = {r.target for r in responses} - assert len(target) == 1, 'Responses should be for a single target.' + assert len(target) == 1, "Responses should be for a single target." target = target.pop() # now everything is checked, so we aggregate it and get the threat intelligence r = {r.sender.id: r for r in responses} - ti = self.__aggregator.evaluate_intelligence_response(target, r, trust_matrix) + ti = self.__aggregator.evaluate_intelligence_response( + target, r, trust_matrix + ) # cache data for further retrieval self._trust_db.cache_network_opinion(ti) - #test = self._trust_db.get_cached_network_opinion(target) + # test = self._trust_db.get_cached_network_opinion(target) interaction_matrix = self.__ti_evaluation_strategy.evaluate( aggregated_ti=ti, responses=r, trust_matrix=trust_matrix, - local_ti=self.__ti_db.get_for(target) + local_ti=self.__ti_db.get_for(target), ) self._evaluate_interactions(interaction_matrix) return self.__network_opinion_callback(ti) - def __filter_ti(self, - ti: Optional[SlipsThreatIntelligence], - peer_trust: PeerTrustData) -> Optional[SlipsThreatIntelligence]: + def __filter_ti( + self, ti: Optional[SlipsThreatIntelligence], peer_trust: PeerTrustData + ) -> Optional[SlipsThreatIntelligence]: if ti is None: return None - peers_allowed_levels = [p.confidentiality_level - for p in self._configuration.trusted_organisations if - p.id in peer_trust.organisations] + peers_allowed_levels = [ + p.confidentiality_level + for p in self._configuration.trusted_organisations + if p.id in peer_trust.organisations + ] peers_allowed_levels.append(peer_trust.service_trust) # select maximum allowed level allowed_level = max(peers_allowed_levels) # set correct confidentiality - ti.confidentiality = ti.confidentiality if ti.confidentiality else self._configuration.data_default_level + ti.confidentiality = ( + ti.confidentiality + if ti.confidentiality + else self._configuration.data_default_level + ) # check if data confidentiality is lower than allowed level for the peer return ti if ti.confidentiality <= allowed_level else None diff --git a/modules/fidesModule/utils/__init__.py b/modules/fides/utils/__init__.py similarity index 100% rename from modules/fidesModule/utils/__init__.py rename to modules/fides/utils/__init__.py diff --git a/modules/fidesModule/utils/logger.py b/modules/fides/utils/logger.py similarity index 56% rename from modules/fidesModule/utils/logger.py rename to modules/fides/utils/logger.py index 9fbb14e83..1fcce4796 100644 --- a/modules/fidesModule/utils/logger.py +++ b/modules/fides/utils/logger.py @@ -1,18 +1,20 @@ import json -import threading from dataclasses import is_dataclass, asdict -from tabnanny import verbose from typing import Optional, List, Callable -LoggerPrintCallbacks: List[Callable[[str, Optional[str], Optional[int], Optional[int], Optional[bool]], None]] = [ +LoggerPrintCallbacks: List[ + Callable[ + [str, Optional[str], Optional[int], Optional[int], Optional[bool]], + None, + ] +] = [ lambda msg, level=None, verbose=1, debug=0, log_to_logfiles_only=False: print( - f'{level}: {msg}' if level is not None else f'UNSPECIFIED_LEVEL: {msg}' + f"{level}: {msg}" if level is not None else f"UNSPECIFIED_LEVEL: {msg}" ) ] -"""Set this to custom callback that should be executed when there's new log message. -First parameter is level ('DEBUG', 'INFO', 'WARN', 'ERROR'), second is message to be logged. -""" +# Set this to custom callback that should be executed when there's new log message. +# First parameter is message, second is level ('DEBUG', 'INFO', 'WARN', 'ERROR') class Logger: @@ -27,12 +29,7 @@ def __init__(self, name: Optional[str] = None): if name is None: name = self.__try_to_guess_name() self.__name = name - self.log_levels = log_levels = { - 'INFO': 1, - 'WARN': 2, - 'ERROR': 3 - } - + self.log_levels = {"INFO": 1, "WARN": 2, "ERROR": 3} # this whole method is a hack # noinspection PyBroadException @@ -41,43 +38,53 @@ def __try_to_guess_name() -> str: # noinspection PyPep8 try: import sys + # noinspection PyUnresolvedReferences,PyProtectedMember name = sys._getframe().f_back.f_code.co_name if name is None: import inspect + inspect.currentframe() frame = inspect.currentframe() frame = inspect.getouterframes(frame, 2) name = frame[1][3] - except: + except Exception: name = "logger" return name def debug(self, message: str, params=None): - return self.__print('DEBUG', message) + return self.__print("DEBUG", message, params) def info(self, message: str, params=None): - return self.__print('INFO', message) + return self.__print("INFO", message, params) + def warning(self, message: str, params=None): + return self.__print("WARN", message, params) + + # keep for backward compatibility def warn(self, message: str, params=None): - return self.__print('WARN', message) + return self.warning(message, params) def error(self, message: str, params=None): - return self.__print('ERROR', message) + return self.__print("ERROR", message, params) def __format(self, message: str, params=None): - thread = threading.get_ident() - formatted_message = f"T{thread}: {self.__name} - {message}" + formatted_message = f"{self.__name} - {message}" if params: params = asdict(params) if is_dataclass(params) else params - formatted_message = f"{formatted_message} {json.dumps(params)}" + try: + serialized_params = json.dumps(params) + except TypeError: + serialized_params = json.dumps(str(params)) + formatted_message = f"{formatted_message} {serialized_params}" return formatted_message def __print(self, level: str, message: str, params=None): formatted_message = self.__format(message, params) for print_callback in LoggerPrintCallbacks: - if level == 'DEBUG': - print_callback(formatted_message, verbose=0) # automatically verbose = 1 - print, debug = 0 - do not print + if level == "DEBUG": + print_callback( + formatted_message, verbose=0 + ) # automatically verbose = 1 - print, debug = 0 - do not print else: - print_callback(formatted_message, verbose=self.log_levels[level]) - + print_callback(formatted_message, debug=1) diff --git a/modules/fides/utils/time.py b/modules/fides/utils/time.py new file mode 100644 index 000000000..ad51861f3 --- /dev/null +++ b/modules/fides/utils/time.py @@ -0,0 +1,11 @@ +import time + +Time = float +# Type for time used across the whole module. +# Represents the current time in seconds since the Epoch. Can have frictions of seconds. +# We have it as alias so we can easily change that in the future. + + +def now() -> Time: + # Returns current Time. + return time.time() diff --git a/modules/fidesModule/evaluation/README.md b/modules/fidesModule/evaluation/README.md deleted file mode 100644 index ee22d1029..000000000 --- a/modules/fidesModule/evaluation/README.md +++ /dev/null @@ -1 +0,0 @@ -All algorithms in this package are based on SORT - see paper. \ No newline at end of file diff --git a/modules/fidesModule/evaluation/ti_aggregation.py b/modules/fidesModule/evaluation/ti_aggregation.py deleted file mode 100644 index 14aae9be7..000000000 --- a/modules/fidesModule/evaluation/ti_aggregation.py +++ /dev/null @@ -1,86 +0,0 @@ -from dataclasses import dataclass -from typing import List - -import numpy as np - -from ..model.peer_trust_data import PeerTrustData -from ..model.threat_intelligence import ThreatIntelligence -from ..utils import bound - - -@dataclass -class PeerReport: - report_ti: ThreatIntelligence - """Threat intelligence report.""" - - reporter_trust: PeerTrustData - """How much does Slips trust the reporter.""" - - -class TIAggregation: - - def assemble_peer_opinion(self, data: List[PeerReport]) -> ThreatIntelligence: - """ - Assemble reports given by all peers and compute the overall network opinion. - - :param data: a list of peers and their reports, in the format given by TrustDB.get_opinion_on_ip() - :return: final score and final confidence - """ - raise NotImplemented('') - - -class AverageConfidenceTIAggregation(TIAggregation): - - def assemble_peer_opinion(self, data: List[PeerReport]) -> ThreatIntelligence: - """ - Uses average when computing final confidence. - """ - reports_ti = [d.report_ti for d in data] - reporters_trust = [d.reporter_trust.service_trust for d in data] - - normalize_net_trust_sum = sum(reporters_trust) - weighted_reporters = [trust / normalize_net_trust_sum for trust in reporters_trust] \ - if normalize_net_trust_sum > 0 else [0] * len(reporters_trust) - - combined_score = sum(r.score * w for r, w, in zip(reports_ti, weighted_reporters)) - combined_confidence = sum(r.confidence * w for r, w, in zip(reports_ti, reporters_trust)) / len(reporters_trust) - - return ThreatIntelligence(score=combined_score, confidence=combined_confidence) - - -class WeightedAverageConfidenceTIAggregation(TIAggregation): - - def assemble_peer_opinion(self, data: List[PeerReport]) -> ThreatIntelligence: - reports_ti = [d.report_ti for d in data] - reporters_trust = [d.reporter_trust.service_trust for d in data] - - normalize_net_trust_sum = sum(reporters_trust) - weighted_reporters = [trust / normalize_net_trust_sum for trust in reporters_trust] - - combined_score = sum(r.score * w for r, w, in zip(reports_ti, weighted_reporters)) - combined_confidence = sum(r.confidence * w for r, w, in zip(reports_ti, weighted_reporters)) - - return ThreatIntelligence(score=combined_score, confidence=combined_confidence) - - -class StdevFromScoreTIAggregation(TIAggregation): - - def assemble_peer_opinion(self, data: List[PeerReport]) -> ThreatIntelligence: - reports_ti = [d.report_ti for d in data] - reporters_trust = [d.reporter_trust.service_trust for d in data] - - normalize_net_trust_sum = sum(reporters_trust) - weighted_reporters = [trust / normalize_net_trust_sum for trust in reporters_trust] - - merged_score = [r.score * r.confidence * w for r, w, in zip(reports_ti, weighted_reporters)] - combined_score = sum(merged_score) - combined_confidence = bound(1 - np.std(merged_score), 0, 1) - - return ThreatIntelligence(score=combined_score, confidence=combined_confidence) - - -TIAggregationStrategy = { - 'average': AverageConfidenceTIAggregation, - 'weightedAverage': WeightedAverageConfidenceTIAggregation, - 'stdevFromScore': StdevFromScoreTIAggregation, -} diff --git a/modules/fidesModule/evaluation/ti_evaluation.py b/modules/fidesModule/evaluation/ti_evaluation.py deleted file mode 100644 index a2bf0f00d..000000000 --- a/modules/fidesModule/evaluation/ti_evaluation.py +++ /dev/null @@ -1,255 +0,0 @@ -from collections import defaultdict -from typing import Dict, Tuple, Optional - -from ..evaluation.service.interaction import Satisfaction, Weight, SatisfactionLevels -from ..messaging.model import PeerIntelligenceResponse -from ..model.aliases import PeerId, Target -from ..model.peer_trust_data import PeerTrustData, TrustMatrix -from ..model.threat_intelligence import SlipsThreatIntelligence -from ..utils.logger import Logger - -logger = Logger(__name__) - - -class TIEvaluation: - def evaluate(self, - aggregated_ti: SlipsThreatIntelligence, - responses: Dict[PeerId, PeerIntelligenceResponse], - trust_matrix: TrustMatrix, - **kwargs, - ) -> Dict[PeerId, Tuple[PeerTrustData, Satisfaction, Weight]]: - """Evaluate interaction with all peers that gave intelligence responses.""" - raise NotImplemented('Use implementation rather then interface!') - - @staticmethod - def _weight() -> Weight: - return Weight.INTELLIGENCE_DATA_REPORT - - @staticmethod - def _assert_keys(responses: Dict[PeerId, PeerIntelligenceResponse], trust_matrix: TrustMatrix): - assert trust_matrix.keys() == responses.keys() - - -class EvenTIEvaluation(TIEvaluation): - """Basic implementation for the TI evaluation, all responses are evaluated the same. - This implementation corresponds with Salinity botnet. - """ - - def __init__(self, **kwargs): - self.__kwargs = kwargs - self.__satisfaction = kwargs.get('satisfaction', SatisfactionLevels.Ok) - - def evaluate(self, - aggregated_ti: SlipsThreatIntelligence, - responses: Dict[PeerId, PeerIntelligenceResponse], - trust_matrix: TrustMatrix, - **kwargs, - ) -> Dict[PeerId, Tuple[PeerTrustData, Satisfaction, Weight]]: - super()._assert_keys(responses, trust_matrix) - - return {p.peer_id: (p, self.__satisfaction, self._weight()) for p in - trust_matrix.values()} - - -class DistanceBasedTIEvaluation(TIEvaluation): - """Implementation that takes distance from the aggregated result and uses it as a penalisation.""" - - def __init__(self, **kwargs): - self.__kwargs = kwargs - - def evaluate(self, - aggregated_ti: SlipsThreatIntelligence, - responses: Dict[PeerId, PeerIntelligenceResponse], - trust_matrix: TrustMatrix, - **kwargs, - ) -> Dict[PeerId, Tuple[PeerTrustData, Satisfaction, Weight]]: - super()._assert_keys(responses, trust_matrix) - return self._build_evaluation( - baseline_score=aggregated_ti.score, - baseline_confidence=aggregated_ti.confidence, - responses=responses, - trust_matrix=trust_matrix - ) - - def _build_evaluation( - self, - baseline_score: float, - baseline_confidence: float, - responses: Dict[PeerId, PeerIntelligenceResponse], - trust_matrix: TrustMatrix, - ) -> Dict[PeerId, Tuple[PeerTrustData, Satisfaction, Weight]]: - satisfactions = { - peer_id: self._satisfaction( - baseline_score=baseline_score, - baseline_confidence=baseline_confidence, - report_score=ti.intelligence.score, - report_confidence=ti.intelligence.confidence - ) - for peer_id, ti in responses.items() - } - - return {p.peer_id: (p, satisfactions[p.peer_id], self._weight()) for p in - trust_matrix.values()} - - @staticmethod - def _satisfaction(baseline_score: float, - baseline_confidence: float, - report_score: float, - report_confidence: float) -> Satisfaction: - return (1 - (abs(baseline_score - report_score) / 2) * report_confidence) * baseline_confidence - - -class LocalCompareTIEvaluation(DistanceBasedTIEvaluation): - """This strategy compares received threat intelligence with the threat intelligence from local database. - - Uses the same penalisation system as DistanceBasedTIEvaluation with the difference that as a baseline, - it does not use aggregated value, but rather local intelligence. - - If it does not find threat intelligence for the target, it falls backs to DistanceBasedTIEvaluation. - """ - - def __init__(self, **kwargs): - super().__init__(**kwargs) - self.__default_ti_getter = kwargs.get('default_ti_getter', None) - - def get_local_ti(self, - target: Target, - local_ti: Optional[SlipsThreatIntelligence] = None) -> Optional[SlipsThreatIntelligence]: - if local_ti: - return local_ti - elif self.__default_ti_getter: - return self.__default_ti_getter(target) - else: - return None - - def evaluate(self, - aggregated_ti: SlipsThreatIntelligence, - responses: Dict[PeerId, PeerIntelligenceResponse], - trust_matrix: TrustMatrix, - local_ti: Optional[SlipsThreatIntelligence] = None, - **kwargs, - ) -> Dict[PeerId, Tuple[PeerTrustData, Satisfaction, Weight]]: - super()._assert_keys(responses, trust_matrix) - - ti = self.get_local_ti(aggregated_ti.target, local_ti) - if not ti: - ti = aggregated_ti - logger.warn(f'No local threat intelligence available for target {ti.target}! ' + - 'Falling back to DistanceBasedTIEvaluation.') - - return self._build_evaluation( - baseline_score=ti.score, - baseline_confidence=ti.confidence, - responses=responses, - trust_matrix=trust_matrix - ) - - -class WeighedDistanceToLocalTIEvaluation(TIEvaluation): - """Strategy combines DistanceBasedTIEvaluation and LocalCompareTIEvaluation with the local weight parameter.""" - - def __init__(self, **kwargs): - super().__init__() - self.__distance = kwargs.get('distance', DistanceBasedTIEvaluation()) - self.__local = kwargs.get('localDistance', LocalCompareTIEvaluation()) - self.__local_weight = kwargs.get('localWeight', 0.5) - - def evaluate(self, - aggregated_ti: SlipsThreatIntelligence, - responses: Dict[PeerId, PeerIntelligenceResponse], - trust_matrix: TrustMatrix, - **kwargs, - ) -> Dict[PeerId, Tuple[PeerTrustData, Satisfaction, Weight]]: - super()._assert_keys(responses, trust_matrix) - - distance_data = self.__distance.evaluate(aggregated_ti, responses, trust_matrix, **kwargs) - local_data = self.__local.evaluate(aggregated_ti, responses, trust_matrix, **kwargs) - - return {p.peer_id: (p, - self.__local_weight * local_data[p.peer_id][1] + - (1 - self.__local_weight) * distance_data[p.peer_id][1], - self._weight() - ) for p in trust_matrix.values()} - - -class MaxConfidenceTIEvaluation(TIEvaluation): - """Strategy combines DistanceBasedTIEvaluation, LocalCompareTIEvaluation and EvenTIEvaluation - in order to achieve maximal confidence when producing decision. - """ - - def __init__(self, **kwargs): - super().__init__() - self.__distance = kwargs.get('distance', DistanceBasedTIEvaluation()) - self.__local = kwargs.get('localDistance', LocalCompareTIEvaluation()) - self.__even = kwargs.get('even', EvenTIEvaluation()) - - def evaluate(self, - aggregated_ti: SlipsThreatIntelligence, - responses: Dict[PeerId, PeerIntelligenceResponse], - trust_matrix: TrustMatrix, - **kwargs, - ) -> Dict[PeerId, Tuple[PeerTrustData, Satisfaction, Weight]]: - super()._assert_keys(responses, trust_matrix) - zero_dict = defaultdict(lambda: (None, 0, None)) - - # weight of the distance based evaluation - distance_weight = aggregated_ti.confidence - distance_data = self.__distance.evaluate(aggregated_ti, responses, trust_matrix, **kwargs) \ - if distance_weight > 0 \ - else zero_dict - - # now we need to check if we even have some threat intelligence data - local_ti = self.__local.get_local_ti(aggregated_ti.target, **kwargs) - # weight of the local evaluation - local_weight = min(1 - distance_weight, local_ti.confidence) if local_ti else 0 - local_data = self.__local.evaluate(aggregated_ti, responses, trust_matrix, **kwargs) \ - if local_weight > 0 \ - else zero_dict - - # weight of the same eval - even_weight = 1 - distance_weight - local_weight - even_data = self.__even.evaluate(aggregated_ti, responses, trust_matrix, **kwargs) \ - if even_weight > 0 \ - else zero_dict - - def aggregate(peer: PeerId): - return distance_weight * distance_data[peer][1] + \ - local_weight * local_data[peer][1] + \ - even_weight * even_data[peer][1] - - return {p.peer_id: (p, aggregate(p.peer_id), self._weight()) for p in - trust_matrix.values()} - - -class ThresholdTIEvaluation(TIEvaluation): - """Employs DistanceBasedTIEvaluation when the confidence of the decision - is higher than given threshold. Otherwise, it uses even evaluation. - """ - - def __init__(self, **kwargs): - self.__kwargs = kwargs - self.__threshold = kwargs.get('threshold', 0.5) - self.__lower = kwargs.get('lower', EvenTIEvaluation()) - self.__higher = kwargs.get('higher', DistanceBasedTIEvaluation()) - - def evaluate(self, - aggregated_ti: SlipsThreatIntelligence, - responses: Dict[PeerId, PeerIntelligenceResponse], - trust_matrix: TrustMatrix, - **kwargs, - ) -> Dict[PeerId, Tuple[PeerTrustData, Satisfaction, Weight]]: - super()._assert_keys(responses, trust_matrix) - - return self.__higher.evaluate(aggregated_ti, responses, trust_matrix) \ - if self.__threshold <= aggregated_ti.confidence \ - else self.__lower.evaluate(aggregated_ti, responses, trust_matrix) - - -EvaluationStrategy = { - 'even': EvenTIEvaluation, - 'distance': DistanceBasedTIEvaluation, - 'localDistance': LocalCompareTIEvaluation, - 'threshold': ThresholdTIEvaluation, - 'maxConfidence': MaxConfidenceTIEvaluation, - 'weighedDistance': WeighedDistanceToLocalTIEvaluation -} diff --git a/modules/fidesModule/messaging/message_handler.py b/modules/fidesModule/messaging/message_handler.py deleted file mode 100644 index 41f235e3c..000000000 --- a/modules/fidesModule/messaging/message_handler.py +++ /dev/null @@ -1,176 +0,0 @@ -from http.client import responses -from typing import Dict, List, Callable, Optional, Union, Any - -from absl.logging import debug - -from slips_files.common.printer import Printer -from ..messaging.dacite import from_dict - -from ..messaging.model import NetworkMessage, PeerInfo, \ - PeerIntelligenceResponse, PeerRecommendationResponse -from ..model.alert import Alert -from ..model.aliases import PeerId, Target -from ..model.recommendation import Recommendation -from ..model.threat_intelligence import ThreatIntelligence -from ..utils.logger import Logger - -logger = Logger(__name__) - - - -class MessageHandler: - """ - Class responsible for parsing messages and handling requests coming from the queue. - - The entrypoint is on_message. - """ - - - - #def print(self, *args, **kwargs): - # return self.printer.print(*args, **kwargs) - - version = 1 - - def __init__(self, - on_peer_list_update: Callable[[List[PeerInfo]], None], - on_recommendation_request: Callable[[str, PeerInfo, PeerId], None], - on_recommendation_response: Callable[[List[PeerRecommendationResponse]], None], - on_alert: Callable[[PeerInfo, Alert], None], - on_intelligence_request: Callable[[str, PeerInfo, Target], None], - on_intelligence_response: Callable[[List[PeerIntelligenceResponse]], None], - on_unknown: Optional[Callable[[NetworkMessage], None]] = None, - on_error: Optional[Callable[[Union[str, NetworkMessage], Exception], None]] = None - ): - #self.logger = None - self.__on_peer_list_update_callback = on_peer_list_update - self.__on_recommendation_request_callback = on_recommendation_request - self.__on_recommendation_response_callback = on_recommendation_response - self.__on_alert_callback = on_alert - self.__on_intelligence_request_callback = on_intelligence_request - self.__on_intelligence_response_callback = on_intelligence_response - self.__on_unknown_callback = on_unknown - self.__on_error = on_error - #self.printer = Printer(self.logger, self.name) - - def on_message(self, message: NetworkMessage): - """ - Entry point for generic messages coming from the queue. - This method parses the message and then executes correct procedure from event. - :param message: message from the queue - :return: value from the underlining function from the constructor - """ - if message.version != self.version: - logger.warn(f'Unknown message version! This handler supports {self.version}.', message) - return self.__on_unknown_message(message) - - execution_map = { - 'nl2tl_peers_list': self.__on_nl2tl_peer_list, - 'nl2tl_recommendation_request': self.__on_nl2tl_recommendation_request, - 'nl2tl_recommendation_response': self.__on_nl2tl_recommendation_response, - 'nl2tl_alert': self.__on_nl2tl_alert, - 'nl2tl_intelligence_request': self.__on_nl2tl_intelligence_request, - 'nl2tl_intelligence_response': self.__on_nl2tl_intelligence_response - } - func = execution_map.get(message.type, lambda data: self.__on_unknown_message(message)) - # we want to handle everything - # noinspection PyBroadException - try: - # we know that the functions can handle that, and if not, there's always error handling - # noinspection PyArgumentList - return func(message.data) - except Exception as ex: - logger.error(f"Error when executing handler for message: {message.type}.", ex) - if self.__on_error: - return self.__on_error(message, ex) - - def on_error(self, original_data: str, exception: Optional[Exception] = None): - """ - Should be executed when it was not possible to parse the message. - :param original_data: string received from the queue - :param exception: exception that occurred during handling - :return: - """ - logger.error(f'Unknown data received: {original_data}.') - if self.__on_error: - self.__on_error(original_data, exception if exception else Exception('Unknown data type!')) - - def __on_unknown_message(self, message: NetworkMessage): - logger.warn(f'Unknown message handler executed!') - logger.debug(f'Message:', message) - - if self.__on_unknown_callback is not None: - self.__on_unknown_callback(message) - - def __on_nl2tl_peer_list(self, data: Dict): - logger.debug('nl2tl_peer_list message') - - peers = [from_dict(data_class=PeerInfo, data=peer) for peer in data['peers']] - return self.__on_peer_list_update(peers) - - def __on_peer_list_update(self, peers: List[PeerInfo]): - return self.__on_peer_list_update_callback(peers) - - def __on_nl2tl_recommendation_request(self, data: Dict): - logger.debug('nl2tl_recommendation_request message') - - request_id = data['request_id'] - sender = from_dict(data_class=PeerInfo, data=data['sender']) - subject = data['payload'] - return self.__on_recommendation_request(request_id, sender, subject) - - def __on_recommendation_request(self, request_id: str, sender: PeerInfo, subject: PeerId): - return self.__on_recommendation_request_callback(request_id, sender, subject) - - def __on_nl2tl_recommendation_response(self, data: List[Dict]): - logger.debug('nl2tl_recommendation_response message') - - responses = [PeerRecommendationResponse( - sender=from_dict(data_class=PeerInfo, data=single['sender']), - subject=single['payload']['subject'], - recommendation=from_dict(data_class=Recommendation, data=single['payload']['recommendation']) - ) for single in data] - return self.__on_recommendation_response(responses) - - def __on_recommendation_response(self, recommendations: List[PeerRecommendationResponse]): - return self.__on_recommendation_response_callback(recommendations) - - def __on_nl2tl_alert(self, data: Dict): - logger.debug('nl2tl_alert message') - - sender = from_dict(data_class=PeerInfo, data=data['sender']) - alert = from_dict(data_class=Alert, data=data['payload']) - return self.__on_alert(sender, alert) - - def __on_alert(self, sender: PeerInfo, alert: Alert): - return self.__on_alert_callback(sender, alert) - - def __on_nl2tl_intelligence_request(self, data: Dict): - logger.debug('nl2tl_intelligence_request message') - - request_id = data['request_id'] - sender = from_dict(data_class=PeerInfo, data=data['sender']) - target = data['payload'] - return self.__on_intelligence_request(request_id, sender, target) - - def __on_intelligence_request(self, request_id: str, sender: PeerInfo, target: Target): - return self.__on_intelligence_request_callback(request_id, sender, target) - - def __on_nl2tl_intelligence_response(self, data: Dict): - logger.debug('nl2tl_intelligence_response message') - - responses = [] - - try: - responses = [PeerIntelligenceResponse( - sender=from_dict(data_class=PeerInfo, data=single['sender']), - intelligence=from_dict(data_class=ThreatIntelligence, data=single['payload']['intelligence']), - target=single['payload']['target'] - ) for single in data] - except Exception as e: - print("Error in Fides message_handler.py __on_nl2tl_intelligence_response(): ", e.__str__()) - #self.print("Error in Fides message_handler.py __on_nl2tl_intelligence_response(): ") - return self.__on_intelligence_response(responses) - - def __on_intelligence_response(self, responses: List[PeerIntelligenceResponse]): - return self.__on_intelligence_response_callback(responses) diff --git a/modules/fidesModule/model/aliases.py b/modules/fidesModule/model/aliases.py deleted file mode 100644 index fed80418e..000000000 --- a/modules/fidesModule/model/aliases.py +++ /dev/null @@ -1,30 +0,0 @@ -IP = str -"""IPv4, IPv6 in string representation.""" - -Domain = str -"""Host Name, Domain.""" - -PeerId = str -"""String representation of peer's public key. """ - -OrganisationId = str -"""String representation of organisation ID.""" - -Target = str -"""Intelligence Target - domain or IP.""" - -ConfidentialityLevel = float -"""Confidentiality level for threat intelligence. - -If an entity needs to have access to any data, it must mean - -entity.confidentiality_level >= data.confidentiality_level - -thus level 0 means accessible for everybody -""" - -Score = float -"""Score for the target, -1 <= score <= 1""" - -Confidence = float -"""Confidence in score, 0 <= confidence <= 1""" diff --git a/modules/fidesModule/model/recommendation_history.py b/modules/fidesModule/model/recommendation_history.py deleted file mode 100644 index 340d82aa0..000000000 --- a/modules/fidesModule/model/recommendation_history.py +++ /dev/null @@ -1,49 +0,0 @@ -from dataclasses import dataclass -from typing import List - -from ..utils.time import Time - - -@dataclass -class RecommendationHistoryRecord: - """Represents an evaluation of a single recommendation interaction between peer i and peer j.""" - - satisfaction: float - """Peer's satisfaction with the recommendation. In model's notation rs_ij. - - 0 <= satisfaction <= 1 - """ - - weight: float - """Weight of the recommendation. In model's notation rw_ij. - - 0 <= weight <= 1 - """ - - timestamp: Time - """Date time when this recommendation happened.""" - - - def to_dict(self): - """Convert the instance to a dictionary.""" - return { - 'satisfaction': self.satisfaction, - 'weight': self.weight, - 'timestamp': self.timestamp # Keep as float - } - - @classmethod - def from_dict(cls, dict_obj): - """Create an instance of RecommendationHistoryRecord from a dictionary.""" - return cls( - satisfaction=dict_obj['satisfaction'], - weight=dict_obj['weight'], - timestamp=dict_obj['timestamp'] # Keep as float - ) - - -RecommendationHistory = List[RecommendationHistoryRecord] -"""Ordered list with history of recommendation interactions. - -First element in the list is the oldest one. -""" diff --git a/modules/fidesModule/model/service_history.py b/modules/fidesModule/model/service_history.py deleted file mode 100644 index d9526a63a..000000000 --- a/modules/fidesModule/model/service_history.py +++ /dev/null @@ -1,48 +0,0 @@ -from dataclasses import dataclass -from typing import List - -from ..utils.time import Time - - -@dataclass -class ServiceHistoryRecord: - """Represents an evaluation of a single service interaction between peer i and peer j.""" - - satisfaction: float - """Peer's satisfaction with the service. In model's notation s_ij. - - 0 <= satisfaction <= 1 - """ - - weight: float - """Weight of the service interaction. In model's notation w_ij. - - 0 <= weight <= 1 - """ - - timestamp: Time - """Date time when this interaction happened.""" - - def to_dict(self): - """Convert the instance to a dictionary.""" - return { - 'satisfaction': self.satisfaction, - 'weight': self.weight, - 'timestamp': self.timestamp - } - - @classmethod - def from_dict(cls, dict_obj): - """Create an instance of ServiceHistoryRecord from a dictionary.""" - return cls( - satisfaction=dict_obj['satisfaction'], - weight=dict_obj['weight'], - timestamp=dict_obj['timestamp'] # Convert ISO format back to datetime - ) - - -ServiceHistory = List[ServiceHistoryRecord] -"""Ordered list with history of service interactions. - -First element in the list is the oldest one. -""" diff --git a/modules/fidesModule/protocols/opinion.py b/modules/fidesModule/protocols/opinion.py deleted file mode 100644 index 79cb89b30..000000000 --- a/modules/fidesModule/protocols/opinion.py +++ /dev/null @@ -1,43 +0,0 @@ -from typing import Dict - -from ..evaluation.ti_aggregation import TIAggregation, PeerReport -from ..messaging.model import PeerIntelligenceResponse -from ..model.alert import Alert -from ..model.aliases import PeerId, Target -from ..model.configuration import TrustModelConfiguration -from ..model.peer_trust_data import PeerTrustData, TrustMatrix -from ..model.threat_intelligence import SlipsThreatIntelligence -from ..persistence.threat_intelligence_db import SlipsThreatIntelligenceDatabase - - -class OpinionAggregator: - """ - Class responsible for evaluation of the intelligence received from the network. - """ - - def __init__(self, - configuration: TrustModelConfiguration, - ti_db: SlipsThreatIntelligenceDatabase, - ti_aggregation: TIAggregation): - self.__configuration = configuration - self.__ti_db = ti_db - self.__ti_aggregation = ti_aggregation - - def evaluate_alert(self, peer_trust: PeerTrustData, alert: Alert) -> SlipsThreatIntelligence: - """Evaluates given data about alert and produces aggregated intelligence for Slips.""" - - alert_trust = max(self.__configuration.alert_trust_from_unknown, peer_trust.service_trust) - score = alert.score - confidence = alert.confidence * alert_trust - return SlipsThreatIntelligence(score=score, confidence=confidence, target=alert.target) - - def evaluate_intelligence_response(self, - target: Target, - data: Dict[PeerId, PeerIntelligenceResponse], - trust_matrix: TrustMatrix) -> SlipsThreatIntelligence: - """Evaluates given threat intelligence report from the network.""" - reports = [PeerReport(report_ti=ti.intelligence, - reporter_trust=trust_matrix[peer_id] - ) for peer_id, ti in data.items()] - ti = self.__ti_aggregation.assemble_peer_opinion(data=reports) - return SlipsThreatIntelligence(score=ti.score, confidence=ti.confidence, target=target) diff --git a/modules/fidesModule/utils/time.py b/modules/fidesModule/utils/time.py deleted file mode 100644 index e802070f6..000000000 --- a/modules/fidesModule/utils/time.py +++ /dev/null @@ -1,14 +0,0 @@ -import time - -Time = float -"""Type for time used across the whole module. - -Represents the current time in seconds since the Epoch. Can have frictions of seconds. - -We have it as alias so we can easily change that in the future. -""" - - -def now() -> Time: - """Returns current Time.""" - return time.time() diff --git a/modules/flowmldetection/__init__.py b/modules/flow_alerts/__init__.py similarity index 100% rename from modules/flowmldetection/__init__.py rename to modules/flow_alerts/__init__.py diff --git a/modules/flowalerts/conn.py b/modules/flow_alerts/conn.py similarity index 94% rename from modules/flowalerts/conn.py rename to modules/flow_alerts/conn.py index ba021112e..f4d9590b9 100644 --- a/modules/flowalerts/conn.py +++ b/modules/flow_alerts/conn.py @@ -8,7 +8,7 @@ from typing import Tuple, List, Dict import validators -from modules.flowalerts.dns import DNS +from modules.flow_alerts.dns import DNS from slips_files.common.abstracts.iflowalerts_analyzer import ( IFlowalertsAnalyzer, ) @@ -369,6 +369,46 @@ def detect_data_upload_in_twid(self, profileid, twid): ip, mbs_uploaded, profileid, twid, uids, ts ) + def _parse_closed_tw_message(self, msg: dict) -> Tuple[str, str] | None: + """ + Extract the profileid and twid from a tw_closed pub/sub message. + + Parameters: + msg: Redis pub/sub message for the tw_closed channel. + + Return: + Tuple[str, str] | None: Normalized (profileid, twid) or None if the + payload is invalid. + """ + payload = utils.get_msg_payload(msg) + + if isinstance(payload, dict): + payload = payload.get("text") + + if isinstance(payload, str): + payload = payload.strip() + + # Some callers may accidentally pass the serialized pub/sub + # envelope instead of its text payload. + if payload.startswith("{"): + with contextlib.suppress( + json.decoder.JSONDecodeError, TypeError + ): + decoded_payload = json.loads(payload) + if isinstance(decoded_payload, dict): + payload = decoded_payload.get("text", payload) + + if not isinstance(payload, str): + return None + + profileid, _, twid = payload.rpartition("_") + if not profileid.startswith("profile_") or not twid.startswith( + "timewindow" + ): + return None + + return profileid, twid + @staticmethod def _is_it_ok_for_ip_to_change(ip) -> bool: """Devices send flow as/to these ips all the time, the're not @@ -840,8 +880,12 @@ async def analyze(self, msg): self.check_device_changing_ips(twid, flow) elif utils.is_msg_intended_for(msg, "tw_closed"): - profileid_tw: List[str] = msg["data"].split("_") - profileid = f"{profileid_tw[0]}_{profileid_tw[1]}" - twid = profileid_tw[-1] + closed_tw = self._parse_closed_tw_message(msg) + if not closed_tw: + return + + profileid, twid = closed_tw self.detect_data_upload_in_twid(profileid, twid) - self.cleanup_conn_to_multiple_ports_tracker(profileid_tw) + self.cleanup_conn_to_multiple_ports_tracker( + [*profileid.split("_"), twid] + ) diff --git a/modules/flowalerts/dns.py b/modules/flow_alerts/dns.py similarity index 99% rename from modules/flowalerts/dns.py rename to modules/flow_alerts/dns.py index 297d3512a..8bfd523f5 100644 --- a/modules/flowalerts/dns.py +++ b/modules/flow_alerts/dns.py @@ -61,7 +61,7 @@ def init(self): # the reason why we can just use .get_msg() there is because once # the msg is handled here, it wont be passed to other analyzers the # should analyze it anymore. - # meaning, only flowalerts.py is allowed to do a get_msg because it + # meaning, only flow_alerts.py is allowed to do a get_msg because it # manages all the analyzers the msg should be passed to self.dns_msgs = Queue() self.priv_ips_doing_dns_outside_of_localnet = {} @@ -752,7 +752,7 @@ def pre_analyze(self): async def analyze(self, msg): """ - is only used by flowalerts.py + is only used by flow_alerts.py runs whenever we get a new_dns message """ if not utils.is_msg_intended_for(msg, "new_dns"): diff --git a/modules/flowalerts/downloaded_file.py b/modules/flow_alerts/downloaded_file.py similarity index 100% rename from modules/flowalerts/downloaded_file.py rename to modules/flow_alerts/downloaded_file.py diff --git a/modules/flowalerts/flowalerts.py b/modules/flow_alerts/flow_alerts.py similarity index 95% rename from modules/flowalerts/flowalerts.py rename to modules/flow_alerts/flow_alerts.py index abf4cf5a8..f41dc9608 100644 --- a/modules/flowalerts/flowalerts.py +++ b/modules/flow_alerts/flow_alerts.py @@ -20,7 +20,7 @@ class FlowAlerts(AsyncModule): - name = "Flow Alerts" + name = "flow_alerts" description = ( "Alerts about flows: long connection, successful ssh, " "password guessing, self-signed certificate, data exfiltration, etc." @@ -41,7 +41,7 @@ def init(self): self.downloaded_file = DownloadedFile(self.db, flowalerts=self) self.tunnel = Tunnel(self.db, flowalerts=self) self.conn = Conn(self.db, flowalerts=self) - # list of async functions to await before flowalerts shuts down + # list of async functions to await before flow_alerts shuts down self.tasks: List[Task] = [] def subscribe_to_channels(self): @@ -100,7 +100,7 @@ async def main(self): task = loop.create_task(analyzer.analyze(msg)) # because Async Tasks swallow exceptions. task.add_done_callback(self.handle_task_exception) - # to wait for these functions before flowalerts shuts down + # to wait for these functions before flow_alerts shuts down self.tasks.append(task) # Allow the event loop to run the scheduled task await asyncio.sleep(0) diff --git a/modules/flowalerts/notice.py b/modules/flow_alerts/notice.py similarity index 100% rename from modules/flowalerts/notice.py rename to modules/flow_alerts/notice.py diff --git a/modules/flowalerts/set_evidence.py b/modules/flow_alerts/set_evidence.py similarity index 99% rename from modules/flowalerts/set_evidence.py rename to modules/flow_alerts/set_evidence.py index 6576ec219..aceadfc34 100644 --- a/modules/flowalerts/set_evidence.py +++ b/modules/flow_alerts/set_evidence.py @@ -497,7 +497,8 @@ def conn_without_dns(self, twid, flow) -> None: confidence = 0.1 description: str = ( - f"A connection without DNS resolution to IP: " f"{flow.daddr}" + f"A connection without DNS resolution to Destination IP: " + f"{flow.daddr}" ) twid_number: int = int(twid.replace("timewindow", "")) diff --git a/modules/flowalerts/smtp.py b/modules/flow_alerts/smtp.py similarity index 100% rename from modules/flowalerts/smtp.py rename to modules/flow_alerts/smtp.py diff --git a/modules/flowalerts/software.py b/modules/flow_alerts/software.py similarity index 100% rename from modules/flowalerts/software.py rename to modules/flow_alerts/software.py diff --git a/modules/flowalerts/ssh.py b/modules/flow_alerts/ssh.py similarity index 100% rename from modules/flowalerts/ssh.py rename to modules/flow_alerts/ssh.py diff --git a/modules/flowalerts/ssl.py b/modules/flow_alerts/ssl.py similarity index 100% rename from modules/flowalerts/ssl.py rename to modules/flow_alerts/ssl.py diff --git a/modules/flowalerts/timer_thread.py b/modules/flow_alerts/timer_thread.py similarity index 100% rename from modules/flowalerts/timer_thread.py rename to modules/flow_alerts/timer_thread.py diff --git a/modules/flowalerts/tunnel.py b/modules/flow_alerts/tunnel.py similarity index 100% rename from modules/flowalerts/tunnel.py rename to modules/flow_alerts/tunnel.py diff --git a/modules/riskiq/__init__.py b/modules/flow_ml_detection/__init__.py similarity index 100% rename from modules/riskiq/__init__.py rename to modules/flow_ml_detection/__init__.py diff --git a/modules/flowmldetection/flowmldetection.py b/modules/flow_ml_detection/flow_ml_detection.py similarity index 98% rename from modules/flowmldetection/flowmldetection.py rename to modules/flow_ml_detection/flow_ml_detection.py index 21fd7d403..bdda4e0ab 100644 --- a/modules/flowmldetection/flowmldetection.py +++ b/modules/flow_ml_detection/flow_ml_detection.py @@ -41,7 +41,7 @@ def warn(*args, **kwargs): class FlowMLDetection(IModule): # Name: short name of the module. Do not use spaces - name = "Flow ML Detection" + name = "flow_ml_detection" description = ( "Train or test a Machine Learning model to detect malicious flows" ) @@ -58,8 +58,8 @@ def init(self): # self.scores = [] # The scaler trained during training and to use during testing self.scaler = StandardScaler() - self.model_path = "./modules/flowmldetection/model.bin" - self.scaler_path = "./modules/flowmldetection/scaler.bin" + self.model_path = "./modules/flow_ml_detection/model.bin" + self.scaler_path = "./modules/flow_ml_detection/scaler.bin" def subscribe_to_channels(self): # Subscribe to the channel @@ -250,7 +250,7 @@ def process_flows(self): "appproto": "ssl", "label": "Malware", "module_labels": { - "flowalerts-long-connection": "Malware" + "flow_alerts-long-connection": "Malware" }, } ) @@ -270,7 +270,7 @@ def process_flows(self): "appproto": "http", "label": "Normal", "module_labels": { - "flowalerts-long-connection": "Normal" + "flow_alerts-long-connection": "Normal" }, } ) diff --git a/modules/flowmldetection/model.bin b/modules/flow_ml_detection/model.bin similarity index 100% rename from modules/flowmldetection/model.bin rename to modules/flow_ml_detection/model.bin diff --git a/modules/flowmldetection/model.license b/modules/flow_ml_detection/model.license similarity index 100% rename from modules/flowmldetection/model.license rename to modules/flow_ml_detection/model.license diff --git a/modules/flowmldetection/scaler.bin b/modules/flow_ml_detection/scaler.bin similarity index 100% rename from modules/flowmldetection/scaler.bin rename to modules/flow_ml_detection/scaler.bin diff --git a/modules/flowmldetection/scaler.license b/modules/flow_ml_detection/scaler.license similarity index 100% rename from modules/flowmldetection/scaler.license rename to modules/flow_ml_detection/scaler.license diff --git a/modules/http_analyzer/http_analyzer.py b/modules/http_analyzer/http_analyzer.py index 8f1e29bd2..c5df15aa9 100644 --- a/modules/http_analyzer/http_analyzer.py +++ b/modules/http_analyzer/http_analyzer.py @@ -21,7 +21,7 @@ class HTTPAnalyzer(AsyncModule): # Name: short name of the module. Do not use spaces - name = "HTTP Analyzer" + name = "http_analyzer" description = "Analyze HTTP flows" authors = ["Alya Gomaa"] diff --git a/modules/ip_info/asn_info.py b/modules/ip_info/asn_info.py index 9af199d62..8470cadcb 100644 --- a/modules/ip_info/asn_info.py +++ b/modules/ip_info/asn_info.py @@ -4,6 +4,7 @@ import ipaddress from typing import Dict +import dns.resolver import ipwhois import json import requests @@ -127,6 +128,7 @@ def cache_ip_range(self, ip: str) -> Dict[str, Dict[str, str]]: ipwhois.exceptions.ASNRegistryError, ipwhois.exceptions.ASNParseError, ipwhois.exceptions.HTTPRateLimitError, + dns.resolver.NoResolverConfiguration, ): # private ip or RDAP lookup failed. don't cache # or ASN lookup failed with no more methods to try diff --git a/modules/ip_info/ip_info.py b/modules/ip_info/ip_info.py index fe50b2cbd..fb31ab7a1 100644 --- a/modules/ip_info/ip_info.py +++ b/modules/ip_info/ip_info.py @@ -44,7 +44,7 @@ class IPInfo(AsyncModule): # Name: short name of the module. Do not use spaces - name = "IP Info" + name = "ip_info" description = "Get different info about an IP/MAC address" authors = ["Alya Gomaa", "Sebastian Garcia"] @@ -596,7 +596,7 @@ async def main(self): self.get_domain_info(domain) if msg := self.get_msg("new_ip"): - ip = msg["data"] + ip = utils.get_msg_payload(msg) self.handle_new_ip(ip) if msg := self.get_msg("check_jarm_hash"): diff --git a/modules/irisModule/__init__.py b/modules/iris/__init__.py similarity index 100% rename from modules/irisModule/__init__.py rename to modules/iris/__init__.py diff --git a/modules/irisModule/iris b/modules/iris/iris similarity index 100% rename from modules/irisModule/iris rename to modules/iris/iris diff --git a/modules/irisModule/irisModule.py b/modules/iris/iris.py similarity index 97% rename from modules/irisModule/irisModule.py rename to modules/iris/iris.py index d393df4cb..40bce9268 100644 --- a/modules/irisModule/irisModule.py +++ b/modules/iris/iris.py @@ -11,9 +11,9 @@ import yaml -class IrisModule(IModule): +class Iris(IModule): # Name: short name of the module. Do not use spaces - name = "Iris" + name = "iris" description = "Global P2P module cooperating with Fides" authors = ["David Otta"] process = None @@ -127,14 +127,14 @@ def pre_main(self): self.print(f"Running Iris using command: {command_str}") - log_dir = os.path.join(self.output_dir, "iris") - os.makedirs(log_dir, exist_ok=True) # Open the log file - self.log_file_path = os.path.join(log_dir, "iris_logs.txt") + self.log_file_path = self.get_module_specific_output_path( + "iris_logs.txt" + ) self.log_file = open(self.log_file_path, "w") self.log_file.write(f"Running Iris using command: {command_str}") - full_cwd = Path.cwd() / "modules" / "irisModule" + full_cwd = Path.cwd() / "modules" / "iris" try: # Start the subprocess, redirecting stdout and stderr to the same file diff --git a/modules/kalipso b/modules/kalipso new file mode 160000 index 000000000..fb91e8cb8 --- /dev/null +++ b/modules/kalipso @@ -0,0 +1 @@ +Subproject commit fb91e8cb8c35e5ef8941c067088d31809efe3deb diff --git a/modules/kalipso/README.md b/modules/kalipso/README.md deleted file mode 100644 index b7a6f9248..000000000 --- a/modules/kalipso/README.md +++ /dev/null @@ -1,55 +0,0 @@ -Kalipso is a graphical user interface based on Nodejs. To create a colorful interface -in the command-line, Kalipso uses two javascript libraries: blessed and blessed-contrib. - -#Kalipso architecture -There is so-called 'screen' is created every time Kalipso is run. Kalipso fills the screen with -widgets (box, table, bar, tree, etc.) where all necessary information is displayed. - -For each type of the widget, there is a file in the folder 'kalipso_widgets'. Each widget has 4 basic functionalities: -(i) show - display the widget on the screen, -(ii) hide - hide the widget on the screen, -(iii) focus - focus on the widget on the screen, -(iv) setData - put data inside the widget. - -Other functions shown in the files of 'kalipos_widgets' are mostly responsible for retrieving data from the -Redis database and formatting the data to be put in the widget. - -All widgets needed in Kalipso are initialized in *kalipso_screen.js*, and all the keypresses are captured there as well. -The main execution file is *kalipso.js*: libraries are imported and main screen is initialized. -Kalipso consists of a main page and hotkeys. - -## Kalipso main page -Kalipso main page consists of: - -- tree widget (*kalipso_tree.js*) - a widget that displays all profiles and - their timewindows. -- timeline info box (*kalipso_table.js*) - a table that displays information about selected IP in the timeline. -- evidence box (*kalipso_box.js*) - a box that diplays all the evidences presented in the timewindow. -- listbar with shortcuts (*kalipso_listbar.js*)- a listbar with all the shortcuts for the hotkeys. - -## Kalipso hotkeys -Kalipso has a lot of hotkeys: -- h (*kalipso_listtable.js*) - help for hotkeys -- e (*kalipso_connect_listtable_gauge.js*) - src ports when the IP of the profile acts as client. - Total flows, packets and bytes going IN a specific source port. -- d (*kalipso_connect_listtable_gauge.js*) - dst IPs when the IP of the profile acts as client. -Total flows, packets and bytes going TO a specific dst IP. -- r (*kalipso_connect_listtable_gauge.js*) - dst ports when the IP of the profile as server. -Total flows, packets and bytes going TO a specific dst IP. -- f (*kalipso_connect_listtable_gauge.js*) - dst ports when the IP of the profile acted as client. - Total flows, packets and bytes going TO a specific dst port. -- t (*kalipso_connect_listtable_gauge.js*) - dst ports when the IP of the profile acted as client. -The amount of connections to a dst IP on a specific port -- i (*kalipso_listtable.js*) - outTuples ‘IP-port-protocol’combined together with outTuples - Behavioral letters, DNS resolution of the IP, ASN, geo country and - Virus Total summary. -- y (*kalipso_listtable.js*) - inTuples ‘IP-port-protocol’combined together with inTuples -Behavioral letters, DNS resolution of the IP, ASN, -geo country and Virus Total summary. -- z (*kalipso_table.js*) - evidences from all timewindows in the selected profile. -- o (*kalipso_screen.js*) - manually update the tree with profiles and timewindows. Default is 2 minutes. -- q (*kalipso_screen.js*) - exit the hotkey -- ESC (*kalipso_screen.js*) - exit Kalipso - -## Setup -Install required NPM packages `npm install` and then start it up `npm run start`. \ No newline at end of file diff --git a/modules/kalipso/countries.json b/modules/kalipso/countries.json deleted file mode 100644 index cd92a8e16..000000000 --- a/modules/kalipso/countries.json +++ /dev/null @@ -1,245 +0,0 @@ -{ -"Afghanistan": "AF", -"Åland Islands": "AX", -"Albania": "AL", -"Algeria": "DZ", -"American Samoa": "AS", -"AndorrA": "AD", -"Angola": "AO", -"Anguilla": "AI", -"Antarctica": "AQ", -"Antigua and Barbuda": "AG", -"Argentina": "AR", -"Armenia": "AM", -"Aruba": "AW", -"Australia": "AU", -"Austria": "AT", -"Azerbaijan": "AZ", -"Bahamas": "BS", -"Bahrain": "BH", -"Bangladesh": "BD", -"Barbados": "BB", -"Belarus": "BY", -"Belgium": "BE", -"Belize": "BZ", -"Benin": "BJ", -"Bermuda": "BM", -"Bhutan": "BT", -"Bolivia": "BO", -"Bosnia and Herzegovina": "BA", -"Botswana": "BW", -"Bouvet Island": "BV", -"Brazil": "BR", -"British Indian Ocean Territory": "IO", -"Brunei Darussalam": "BN", -"Bulgaria": "BG", -"Burkina Faso": "BF", -"Burundi": "BI", -"Cambodia": "KH", -"Cameroon": "CM", -"Canada": "CA", -"Cape Verde": "CV", -"Cayman Islands": "KY", -"Central African Republic": "CF", -"Chad": "TD", -"Chile": "CL", -"China": "CN", -"Christmas Island": "CX", -"Cocos (Keeling) Islands": "CC", -"Colombia": "CO", -"Comoros": "KM", -"Congo": "CG", -"Congo, The Democratic Republic of the": "CD", -"Cook Islands": "CK", -"Costa Rica": "CR", -"Cote D'Ivoire": "CI", -"Croatia": "HR", -"Cuba": "CU", -"Cyprus": "CY", -"Czechia": "CZ", -"Denmark": "DK", -"Djibouti": "DJ", -"Dominica": "DM", -"Dominican Republic": "DO", -"Ecuador": "EC", -"Egypt": "EG", -"El Salvador": "SV", -"Equatorial Guinea": "GQ", -"Eritrea": "ER", -"Estonia": "EE", -"Ethiopia": "ET", -"Falkland Islands (Malvinas)": "FK", -"Faroe Islands": "FO", -"Fiji": "FJ", -"Finland": "FI", -"France": "FR", -"French Guiana": "GF", -"French Polynesia": "PF", -"French Southern Territories": "TF", -"Gabon": "GA", -"Gambia": "GM", -"Georgia": "GE", -"Germany": "DE", -"Ghana": "GH", -"Gibraltar": "GI", -"Greece": "GR", -"Greenland": "GL", -"Grenada": "GD", -"Guadeloupe": "GP", -"Guam": "GU", -"Guatemala": "GT", -"Guernsey": "GG", -"Guinea": "GN", -"Guinea-Bissau": "GW", -"Guyana": "GY", -"Haiti": "HT", -"Heard Island and Mcdonald Islands": "HM", -"Holy See (Vatican City State)": "VA", -"Honduras": "HN", -"Hong Kong": "HK", -"Hungary": "HU", -"Iceland": "IS", -"India": "IN", -"Indonesia": "ID", -"Iran, Islamic Republic Of": "IR", -"Iraq": "IQ", -"Ireland": "IE", -"Isle of Man": "IM", -"Israel": "IL", -"Italy": "IT", -"Jamaica": "JM", -"Japan": "JP", -"Jersey": "JE", -"Jordan": "JO", -"Kazakhstan": "KZ", -"Kenya": "KE", -"Kiribati": "KI", -"Korea, Democratic People'S Republic of": "KP", -"Korea, Republic of": "KR", -"Kuwait": "KW", -"Kyrgyzstan": "KG", -"Lao People'S Democratic Republic": "LA", -"Latvia": "LV", -"Lebanon": "LB", -"Lesotho": "LS", -"Liberia": "LR", -"Libyan Arab Jamahiriya": "LY", -"Liechtenstein": "LI", -"Lithuania": "LT", -"Luxembourg": "LU", -"Macao": "MO", -"Macedonia, The Former Yugoslav Republic of": "MK", -"Madagascar": "MG", -"Malawi": "MW", -"Malaysia": "MY", -"Maldives": "MV", -"Mali": "ML", -"Malta": "MT", -"Marshall Islands": "MH", -"Martinique": "MQ", -"Mauritania": "MR", -"Mauritius": "MU", -"Mayotte": "YT", -"Mexico": "MX", -"Micronesia, Federated States of": "FM", -"Moldova, Republic of": "MD", -"Monaco": "MC", -"Mongolia": "MN", -"Montserrat": "MS", -"Morocco": "MA", -"Mozambique": "MZ", -"Myanmar": "MM", -"Namibia": "NA", -"Nauru": "NR", -"Nepal": "NP", -"Netherlands": "NL", -"Netherlands Antilles": "AN", -"New Caledonia": "NC", -"New Zealand": "NZ", -"Nicaragua": "NI", -"Niger": "NE", -"Nigeria": "NG", -"Niue": "NU", -"Norfolk Island": "NF", -"Northern Mariana Islands": "MP", -"Norway": "NO", -"Oman": "OM", -"Pakistan": "PK", -"Palau": "PW", -"Palestinian Territory, Occupied": "PS", -"Panama": "PA", -"Papua New Guinea": "PG", -"Paraguay": "PY", -"Peru": "PE", -"Philippines": "PH", -"Pitcairn": "PN", -"Poland": "PL", -"Portugal": "PT", -"Puerto Rico": "PR", -"Qatar": "QA", -"Reunion": "RE", -"Romania": "RO", -"Russian Federation": "RU", -"RWANDA": "RW", -"Saint Helena": "SH", -"Saint Kitts and Nevis": "KN", -"Saint Lucia": "LC", -"Saint Pierre and Miquelon": "PM", -"Saint Vincent and the Grenadines": "VC", -"Samoa": "WS", -"San Marino": "SM", -"Sao Tome and Principe": "ST", -"Saudi Arabia": "SA", -"Senegal": "SN", -"Serbia and Montenegro": "CS", -"Seychelles": "SC", -"Sierra Leone": "SL", -"Singapore": "SG", -"Slovakia": "SK", -"Slovenia": "SI", -"Solomon Islands": "SB", -"Somalia": "SO", -"South Africa": "ZA", -"South Georgia and the South Sandwich Islands": "GS", -"Spain": "ES", -"Sri Lanka": "LK", -"Sudan": "SD", -"Suriname": "SR", -"Svalbard and Jan Mayen": "SJ", -"Swaziland": "SZ", -"Sweden": "SE", -"Switzerland": "CH", -"Syrian Arab Republic": "SY", -"Taiwan, Province of China": "TW", -"Tajikistan": "TJ", -"Tanzania, United Republic of": "TZ", -"Thailand": "TH", -"Timor-Leste": "TL", -"Togo": "TG", -"Tokelau": "TK", -"Tonga": "TO", -"Trinidad and Tobago": "TT", -"Tunisia": "TN", -"Turkey": "TR", -"Turkmenistan": "TM", -"Turks and Caicos Islands": "TC", -"Tuvalu": "TV", -"Uganda": "UG", -"Ukraine": "UA", -"United Arab Emirates": "AE", -"United Kingdom": "GB", -"United States": "US", -"United States Minor Outlying Islands": "UM", -"Uruguay": "UY", -"Uzbekistan": "UZ", -"Vanuatu": "VU", -"Venezuela": "VE", -"Viet Nam": "VN", -"Virgin Islands, British": "VG", -"Virgin Islands, U.S.": "VI", -"Wallis and Futuna": "WF", -"Western Sahara": "EH", -"Yemen": "YE", -"Zambia": "ZM", -"Zimbabwe": "ZW" -} diff --git a/modules/kalipso/kalipso.js b/modules/kalipso/kalipso.js deleted file mode 100755 index 6bdac5c55..000000000 --- a/modules/kalipso/kalipso.js +++ /dev/null @@ -1,39 +0,0 @@ -// SPDX-FileCopyrightText: 2021 Sebastian Garcia -//SPDX-License-Identifier: GPL-2.0-only - -const { redis } = require("./kalipso_widgets/libraries.js"); - -/*Import all the widgets.*/ -var screen_class = require('./kalipso_widgets/screen') -var redis_database_class = require('./kalipso_widgets/database') - -var {argv} = require('yargs').option('l',{ - - alias: 'limit_letter_outtuple', - default: 200, - describe: 'Include something', - type: 'number', - nargs: 1 - - }).option('p',{ - - alias: 'redis_port', - describe: 'port to use for redis database', - type: 'number', - nargs: 1 - - }); - -const {limit_letter_outtuple, redis_port } = argv - - -// Initialize all channels in Redis database. -const redis_database = new redis_database_class(redis, redis_port) -redis_database.createClient() - -// Initialize screen with all necessary widgets. -const screen = new screen_class(redis_database,limit_letter_outtuple) - -// Register all keypresses in the screen. -screen.registerEvents() -screen.update_interface() diff --git a/modules/kalipso/kalipso_widgets/database.js b/modules/kalipso/kalipso_widgets/database.js deleted file mode 100755 index 09183736e..000000000 --- a/modules/kalipso/kalipso_widgets/database.js +++ /dev/null @@ -1,196 +0,0 @@ -// SPDX-FileCopyrightText: 2021 Sebastian Garcia -//SPDX-License-Identifier: GPL-2.0-only -class Redis{ - constructor(redis, redis_port){ - this.redis = redis - this.tree_redisClient = undefined - this.BlockedIPsTWs = undefined - this.redis_port = redis_port - } - - - getAllProfiles(){ - return new Promise((resolve, reject)=>{this.db.smembers("profiles",(err, reply) =>{ - if(err){console.log("Error in getAllProfiles() in database.js to retrieve all profiles from the database. Error: ", err); reject(err);} - else{resolve(reply);} - }) - }) - } - - getProfileTWs(key){ - return new Promise((resolve, reject) => {this.db.zrange(key, 0, -1, (err, reply)=>{ - if(err){console.log("Error in getProfileTWs in database.js to retrieve tws of the profile. Error: ",err); reject(err);} - else{ - let d = {} - d[key] = reply; - resolve(reply);} - }) - }) - } - - /*Get all the keys from the database.*/ - getAllKeys(){ - return new Promise((resolve,reject)=>{this.db.keys('*',(err, reply)=>{ - if(err){console.log('Error in getAllKeys() in kalipso_redis.js to retrieve all keys from the database. Error: ',err); reject(err)} - else{resolve(reply)} - });}) - } - - /*Get blocked IPs and timewindows.*/ - getBlockedIPsTWs(){ - return new Promise((resolve,reject)=>{this.db.hgetall("BlockedProfTW",(err,reply)=>{ - if(err){console.log("Error in the retrieving blocked IPs and timewindows. Error: ",err);reject(err)} - else{resolve(reply)} - });}) - } - - /*Get host IP*/ - getHostIP(){ - return new Promise((resolve,reject)=>{this.db.smembers('hostIP',(err,value)=>{ - if(err){ console.log(err); reject(err);} - else{resolve(value) ;} - });}) - } - - /*Get hostname of IP*/ - getHostnameOfIP(profileid){ - return new Promise((resolve,reject)=>{this.db.hmget(profileid, 'host_name',(err,value)=>{ - if(err){ console.log(err); reject(err);} - else{ - resolve(value[0]) ;} - });}) - } - - /*Get timeline data for specific profile and timewindow*/ - getTimeline(ip, timewindow){ - return new Promise((resolve, reject)=>{ this.db.zrange("profile_"+ip+"_"+timewindow+'_timeline',0,-1, (err,reply)=>{ - if(err){console.log('Error in getTimeline in kalipso_redis.js. Error: ',err); reject(err);} - else{resolve(reply);} - });}) - } - - /*Get evidence for specific profile and timewindow*/ - getEvidence(ip, timewindow){ - return new Promise ((resolve, reject)=>{this.db.hget("profile_"+ip+"_"+timewindow,'Evidence',(err,reply)=>{ - if(err){console.log("Error in getEvidence() in kalipso_redis.js. Error: ",err); reject(err);} - else{resolve(reply);} - });}) - } - - /*Get DND resolution for specific IP*/ - getDNSResolution(ip){ - return new Promise((resolve,reject)=>{ - var resolved_dns = ''; - this.db.hget('DNSresolution',ip,(err,value)=> { - if(err){console.log('Error in getDNSResolution() in kalipso_redis.js. Error: ',err); - reject(resolved_dns)} - else{ - if(value == null){value = ''} - resolved_dns = value - resolve(resolved_dns) - } - }) - }) - } - - /*Get information about the specific IP*/ - getIpInfo(ip){ - return new Promise((resolve, reject)=>{this.cache.hget("IPsInfo",ip,(err,reply)=>{ - if(err){console.log("Error in getIpInfo in kalipso_redis.js. Error: ",err); reject(err);} - else{resolve(reply);} - });}) - } - - /*Get outtuples for specific profile and timewindow.*/ - getOutTuples(ip,timewindow){ - return new Promise ((resolve, reject)=>{this.db.hget("profile_"+ip+"_"+timewindow,'OutTuples',(err,reply)=>{ - if(err){console.log("Error in getOutTuples in kalipso_redis.js. Error: ",err); reject(err);} - else{resolve(reply);} - });}) - } - - /*Get intuples for specific profile and timewindow*/ - getInTuples(ip,timewindow){ - return new Promise ((resolve, reject)=>{this.db.hget("profile_"+ip+"_"+timewindow,'InTuples',(err,reply)=>{ - if(err){console.log("Error in getInTuples in kalipso_redis.js. Error: ",err); reject(err);} - else{resolve(reply);} - });}) - } - - /*Get data for UDP established connections (dst/src ports/ips client/server) for specific profile and timewindow*/ - getUDPest(ip, timewindow,udp_key){ - return new Promise ((resolve, reject)=>{this.db.hget("profile_"+ip+"_"+timewindow, udp_key,(err,reply)=>{ - if(err){console.log("Error in getUDPest in kalipso_redis.js. Error: ",err); reject(err);} - else{resolve(reply);} - });}) - } - - /*Get data for TCP established (dst/src ports/IPs client/server) for specific profile and timewindow.*/ - getTCPest(ip, timewindow,tcp_key){ - return new Promise ((resolve, reject)=>{this.db.hget("profile_"+ip+"_"+timewindow,tcp_key,(err,reply)=>{ - if(err){console.log("Error in getTCPest in kalipso_redis.js. Error: ",err); reject(err);} - else{resolve(reply);} - });}) - } - - /*Get data for UDP notestablished (dst/src ports/IPs client/server) for specific profile and timewindow*/ - getUDPnotest(ip, timewindow,udp_key){ - return new Promise ((resolve, reject)=>{this.db.hget("profile_"+ip+"_"+timewindow, udp_key,(err,reply)=>{ - if(err){console.log("Error in getUDPnotest in kalipso_redis.js. Error: ",err); reject(err);} - else{resolve(reply);} - });}) - } - - /*Get data for TCP notestablished (dst/src port/ips client/server) for specific profile and timewindow*/ - getTCPnotest(ip, timewindow,tcp_key){ - return new Promise ((resolve, reject)=>{this.db.hget("profile_"+ip+"_"+timewindow,tcp_key,(err,reply)=>{ - if(err){console.log("Error in getTCPnotest in kalipso_redis.js. Error: ",err); reject(err);} - else{resolve(reply);} - });}) - } - - /*Get all evidence for specific profile.*/ - getAllProfileEvidences(ip){ - return new Promise( - (resolve,reject)=>{this.db.hgetall("evidenceprofile_"+ip, (err,reply)=>{ - if(err){console.log("Error in getAllProfileEvidences in kalipso_redis.js. Error: ",err); reject(err);} - else{resolve(reply);} - })} - ) - } - - /*Get all slips processes PIDs.*/ - getPIDs(){ - return new Promise( - (resolve,reject)=>{this.db.hgetall("PIDs", (err,reply)=>{ - if(err){console.log("Error in getPIDs in kalipso_redis.js. Error: ",err); reject(err);} - else{resolve(reply);} - })} - ) - } - - /*Get starttime for the timewindow in the profile*/ - getStarttimeForTW(ip, timewindow){ - return new Promise ((resolve, reject)=>{this.db.zscore("twsprofile_"+ip,timewindow,(err,reply)=>{ - if(err){console.log("Error in getStarttimeForTW in kalipso_redis.js. Error: ",err); reject(err);} - else{resolve(reply);} - });}) - } - - /*Create all the client to the Redis database.*/ - createClient(){ - let redis_config = { - host: "127.0.0.1", - port: this.redis_port - }; - - let redis_cache_config = { - host: "127.0.0.1", - port: 6379 } - this.db = this.redis.createClient(redis_config) - this.cache = this.redis.createClient(redis_cache_config) - this.cache.select(1) - } -} - -module.exports = Redis diff --git a/modules/kalipso/kalipso_widgets/evidence.js b/modules/kalipso/kalipso_widgets/evidence.js deleted file mode 100644 index 80196d105..000000000 --- a/modules/kalipso/kalipso_widgets/evidence.js +++ /dev/null @@ -1,93 +0,0 @@ -// SPDX-FileCopyrightText: 2021 Sebastian Garcia -//SPDX-License-Identifier: GPL-2.0-only -const box = require('../lib_widgets/box.js') -const async = require('async') -const color = require('chalk') - -class Evidence extends box.BoxClass{ - - constructor(grid, redis_database, screen, gridParameters){ - const widgetParameters = { - top: 'center', - left: 'center', - width: '50%', - height: '50%', - label:gridParameters[4], - tags: true, - keys: true, - style:{ - border:{ fg:'blue',type: 'line'}, - focus: {border:{ fg:'magenta'}} - }, - vi:true, - scrollable: true, - alwaysScroll: true, - scrollbar: { - ch: ' ', - inverse: true - } - } - - super(grid, gridParameters, widgetParameters) - - this.redis_database = redis_database - this.screen = screen - } - - /*Widget 'Box' is used to display the evidences in the main screen of Kalipso. - This function generate the evidence data to be put in the box. - It retrieves the data from the Redis database and put it in the necessary format for the widget. - */ - setEvidence(ip, timewindow){ - try{ - var evidence_data = '' - this.redis_database.getEvidence(ip, timewindow).then(redis_evidence_data=>{ - - if (redis_evidence_data==null){ - return this.setData(evidence_data) - } - - var evidence_json = JSON.parse(redis_evidence_data); - var evidence_keys = Object.keys(evidence_json); - - async.each(evidence_keys, (key,callback)=>{ - var evidence_details = JSON.parse(evidence_json[key]) - // var key_dict = JSON.parse(key) - // var key_values = Object.values(key_dict).join(':') - if ((evidence_details['type_evidence'] == 'ThreatIntelligenceBlacklistIP') - || (evidence_details['type_evidence'] == 'ThreatIntelligenceBlacklistDomain')) - { - evidence_data = - evidence_data + - '{bold}' + - color.green('Detected '+evidence_details['type_detection'] + ' ' + evidence_details['detection_info']) + - '{/bold}' + - ". Blacklisted in " + evidence_details["description"] + '\n' - // evidence_data = evidence_data + '{bold}' + key + '\n' - } - - else{ - evidence_data = evidence_data + - '{bold}'+ - color.green('Detected '+evidence_details['type_detection'] + ' ' +evidence_details['detection_info']) + - '{/bold}' + - ". " + evidence_details["description"] + '\n' - } - - callback(); - }, (err)=>{ - if(err){console.log('Error to iterate through the evidences in the timewindow, check setEvidence() in kalipso_box.js. Error: ', err)} - else{ - return this.setData(evidence_data)} - } - ); - }); - } - - catch (err){ - console.log('Error in the setEvidence() in kalipso_box.js: ' ,err) - } - } -} - -module.exports = {EvidenceClass: Evidence}; diff --git a/modules/kalipso/kalipso_widgets/help.js b/modules/kalipso/kalipso_widgets/help.js deleted file mode 100644 index 8a7503cb6..000000000 --- a/modules/kalipso/kalipso_widgets/help.js +++ /dev/null @@ -1,35 +0,0 @@ -// SPDX-FileCopyrightText: 2021 Sebastian Garcia -//SPDX-License-Identifier: GPL-2.0-only -const { redis, blessed, blessed_contrib } = require("./libraries.js"); -const listTable = require("../lib_widgets/listtable.js") -var async = require('async') -var color = require('chalk') -var stripAnsi = require('strip-ansi') - -class Help extends listTable.ListTableClass{ - - constructor(grid, redis_database, characteristics){ - super(grid, redis_database, characteristics) - } - - - /*Set data for the help*/ - setHelp(){ - var data = [['hotkey', 'description'], - ['-h','help for hotkeys.'], - ['-e','src ports when the IP of the profile acts as clien. Total flows, packets and bytes going IN a specific source port.'], - ['-d','dst IPs when the IP of the profile acts as client. Total flows, packets and bytes going TO a specific dst IP.'], - ['-r','dst ports when the IP of the profile as server. Total flows, packets and bytes going TO a specific dst IP.'], - ['-f','dst ports when the IP of the profile acted as client. Total flows, packets and bytes going TO a specific dst port.'], - ['-t','dst ports when the IP of the profile acted as client. The amount of connections to a dst IP on a specific port .'], - ['-i','outTuples "IP-port-protocol" combined together with outTuples Behavioral letters, DNS resolution of the IP, ASN, geo country and Virus Total summary.'], - ['-y','inTuples "IP-port-protocol" combined together with inTuples Behavioral letters, DNS resolution of the IP, ASN, geo country and Virus Total summary.'], - ['-z', 'evidences from all timewindows in the selected profile.' ], - ['-o','manually update the tree with profiles and timewindows. Default is 2 minutes. '], - ['-q','exit the hotkey'], - ['-ESC','exit Kalipso']] - this.setData(data) - } -} - -module.exports = {HelpClass:Help} diff --git a/modules/kalipso/kalipso_widgets/intuples.js b/modules/kalipso/kalipso_widgets/intuples.js deleted file mode 100644 index 8800f9f3c..000000000 --- a/modules/kalipso/kalipso_widgets/intuples.js +++ /dev/null @@ -1,85 +0,0 @@ -// SPDX-FileCopyrightText: 2021 Sebastian Garcia -//SPDX-License-Identifier: GPL-2.0-only -const { redis, blessed, blessed_contrib, async } = require("./libraries.js"); -const listTable = require("../lib_widgets/listtable.js") - -class InTuples extends listTable.ListTableClass{ - - constructor(grid, redis_database,screen, characteristics, limit_letter_intuple){ - super(grid, redis_database, characteristics) - this.screen = screen - this.limit_letter_intuple = limit_letter_intuple - } - - /*Combine data for InTuples*/ - setInTuples(ip, timewindow){ - try{ - - this.redis_database.getInTuples(ip, timewindow).then(redis_inTuples=>{ - var data = [['key','string','dns_resolution','SNI','RDNS','asn','geo','url','down','ref','com']] - if(redis_inTuples==null){this.setData(data);this.screen.render(); return;} - var json_inTuples = JSON.parse(redis_inTuples) - var keys = Object.keys(json_inTuples) - async.each(keys,(key, callback)=>{ - let tuple_info = json_inTuples[key]; - let split_tuple = key.split('-') - let inTuple_ip = split_tuple[0] - let inTuple_port = split_tuple[1] - let inTuple_protocol = split_tuple[2] - var letters_string = tuple_info[0].substr(0, this.limit_letter_intuple) - this.getIPInfo_dict(inTuple_ip).then(ip_info_dict =>{ - this.redis_database.getDNSResolution(inTuple_ip).then(dns_resolution=>{ - var letter_string_chunks = this.chunkString(letters_string.trim(),40); - var length_letter = letter_string_chunks.length - if(dns_resolution){dns_resolution = JSON.parse(dns_resolution)} - var length_dns_resolution = dns_resolution.length - var all_sni = ip_info_dict['SNI'] - var sni = all_sni.slice(Math.max(all_sni.length - 3, 0)) - var length_sni = sni.length - var max_length = Math.max(length_dns_resolution, length_letter, length_sni) - var indexes_array = Array.from(Array(max_length).keys()) - - async.forEach(indexes_array, (ind, callback)=>{ - var row = []; - var temp_dns_resolution = '' - var temp_str ='' - var temp_sni =''; - - if(dns_resolution[ind] != undefined){temp_dns_resolution = dns_resolution[ind]}; - - if(sni[ind] != undefined && - inTuple_port.localeCompare(sni[ind]["dport"]) ==0 && - inTuple_protocol.localeCompare("tcp") == 0){ - temp_sni = sni[ind]["server_name"];} - - if(letter_string_chunks[ind] != undefined){temp_str = letter_string_chunks[ind]} - - if(ind ==0){ - row.push(key, temp_str, temp_dns_resolution, - temp_sni,ip_info_dict['reverse_dns'], ip_info_dict['asn'].slice(0,20), ip_info_dict['geo'], - ip_info_dict['url'], ip_info_dict['down'], ip_info_dict['ref'], - ip_info_dict['com'])} - else{ - row.push('', temp_str, temp_dns_resolution, - temp_sni, '','','','','','','')} - data.push(row) - callback(null) - }, (err)=>{if(err){console.log('Error in setInTuples in kalipso_listtable.js. Error:', err);}}) - callback(null) - })}) - },(err)=>{if(err){console.log('Error in setInTuples in kalipso_listtable.js. Error:',err)} - else{ - this.setData(data); - this.screen.render()}} - ) - }) - } - catch(err){ - console.log('Check setInTuples in kalipso_listtable.js. Error: ', err) - reject(err) - } - - } -} - -module.exports = {InTuplesClass:InTuples} diff --git a/modules/kalipso/kalipso_widgets/ipinfo.js b/modules/kalipso/kalipso_widgets/ipinfo.js deleted file mode 100644 index 03dd912db..000000000 --- a/modules/kalipso/kalipso_widgets/ipinfo.js +++ /dev/null @@ -1,19 +0,0 @@ -// SPDX-FileCopyrightText: 2021 Sebastian Garcia -//SPDX-License-Identifier: GPL-2.0-only -const { redis, blessed, blessed_contrib } = require("./libraries.js"); -const listTable = require("../lib_widgets/listtable.js") -var async = require('async') -var color = require('chalk') -var stripAnsi = require('strip-ansi') - -class IpInfo extends listTable.ListTableClass{ - - constructor(grid, redis_database,screen, characteristics){ - super(grid, redis_database, characteristics) - this.screen = screen - - } - -} - -module.exports = {IpInfoClass:IpInfo} diff --git a/modules/kalipso/kalipso_widgets/kalipso_connect_listtable_gauge.js b/modules/kalipso/kalipso_widgets/kalipso_connect_listtable_gauge.js deleted file mode 100644 index 5ee164f00..000000000 --- a/modules/kalipso/kalipso_widgets/kalipso_connect_listtable_gauge.js +++ /dev/null @@ -1,317 +0,0 @@ -// SPDX-FileCopyrightText: 2021 Sebastian Garcia -//SPDX-License-Identifier: GPL-2.0-only -const { redis, blessed, blessed_contrib, async, sortedArray } = require("./libraries.js"); - -class combine_Listtable_Gauge{ - constructor(grid, redis_database,screen, listtable1, listtable2, gauge1, gauge2){ - this.screen = screen - this.grid = grid - this.redis_database = redis_database - this.listtable1 = listtable1 - this.listtable2 = listtable2 - this.gauge1 = gauge1 - this.gauge2 = gauge2 - this.gauge1_counter = 0 - this.gauge2_counter = 0 - this.total_data1 = 0 - this.total_data2 = 0 - this.listtable1_counter = 0 - this.listtable2_counter = 0 - this.listtable1_data = [] - this.listtable2_data = [] - this.gauge1_data = [] - this.gauge2_data = [] - this.gauge_number = 9 - this.listtable1_column_names = [] - this.listtable2_column_names = [] - this.focus = this.gauge1 - } - - /*Round numbers by specific decimals*/ - round(value, decimals) { - return Number(Math.round(value+'e'+decimals)+'e-'+decimals); - }; - - changeFocus(){ - if(this.focus == this.gauge1){ - this.focus = this.gauge2 - this.gauge2.focus()} - else{ - this.focus = this.gauge1 - this.gauge1.focus()} - } - - format_tcp_udp_data_with_IPs(redis_data, tcp_or_udp){ - /* - This data includes IP as a column value - Function to refactor tcp and udp data from profile's timewindow for specific widgets listtables and gauges. - Format of data for listtable: [[column1,column2,column3],[column1,column2,column3],[column1,column2,column3]] - Format of data for stack: [{stack:[percent%,percent2%,percent3%]},{stack:[percent%,percent2%,percent3%]},{stack:[percent%,percent2%,percent3%]}] - */ - return new Promise((resolve, reject)=>{ - var data_listtable = []; - var data_gaugeList = []; - if(redis_data == null){resolve([data_listtable, data_gaugeList])} - else{ - try{ - var obj= JSON.parse(redis_data); - var keys = Object.keys(obj); - async.each(keys, (key, callback)=>{ - var key_info = obj[key]; - var dst_ips = Object.keys(key_info['dstips']) - var dst_ips_connections = Object.values(key_info['dstips']) - async.forEachOf(dst_ips,(dst_ip_counter, dst_ip_index,callback)=>{ - var row = [] - data_listtable.push([tcp_or_udp+'/'+key,String(dst_ip_counter),String(dst_ips_connections[dst_ip_index]['pkts'])]) - data_listtable.push([]) - data_gaugeList.push({stack:[this.round(Math.log(dst_ips_connections[dst_ip_index]['pkts']),0)]}) - callback() - },(err)=>{ - if(err){console.log('Check format_tcp_udp_data_with_IPs in kalipso_connect_listtable_gauge.js. Error: ',err)} - }) - callback() - },(err)=>{ - if(err){console.log('Check format_tcp_udp_data_with_IPs in kalipso_connect_listtable_gauge.js. Error: ',err)} - else{ resolve([data_listtable,data_gaugeList])} - }) - } - catch(err){ - if(err){console.log('Check format_tcp_udp_data_with_IPs in kalipso_connect_listtable_gauge.js. Error: ',err)}} - } - }) - } - - - format_tcp_udp_data(redis_data,tcp_or_udp){ - /* - Function to refactor tcp and udp data from profile's timewindow for specific widgets listtables and gauges. - Format of data for listtable: [[column1,column2,column3],[column1,column2,column3],[column1,column2,column3]] - Format of data for stack: [{stack:[percent%,percent2%,percent3%]},{stack:[percent%,percent2%,percent3%]},{stack:[percent%,percent2%,percent3%]}] - */ - return new Promise((resolve, reject)=>{ - let data_listtable = []; - let data_gaugeList = []; - if(redis_data == null){resolve([data_listtable, data_gaugeList])} - else{ - try{ - let obj= JSON.parse(redis_data); - var instance = new sortedArray(Object.keys(obj), function(a, b){ - return obj[b]['totalbytes'] - obj[a]['totalbytes']; - }); - instance.getArray().then(keys=>{async.each(keys, (key, callback)=>{ - let key_info = obj[key]; - data_listtable.push([tcp_or_udp+'/'+key,String(key_info['totalflows']), String(key_info['totalpkt']), String(key_info['totalbytes'])]) - data_listtable.push([]) - data_gaugeList.push({stack:[this.round(Math.log(key_info['totalflows']),0), - this.round(Math.log(key_info['totalpkt']),0), - this.round(Math.log(key_info['totalbytes']),0)]}) - callback(); - }, (err)=>{ - if(err){console.log('Check format_tcp_udp_data in kalipso_connect_listtable_gauge.js. Error: ',err);reject(err)} - else{resolve([data_listtable,data_gaugeList])} - })}) - } - catch(err){if(err){console.log('Check format_tcp_udp_data in kalipso_connect_listtable_gauge.js. Error: ',err)}} - }}) - } - - /*Function to refactor in series tcp and udp data from profile's timewindow for specific widgets listtables and gauges.*/ - format_redis_tcp_udp_data(redis_tcp_data, redis_udp_data){ - return Promise.all([this.format_tcp_udp_data(redis_tcp_data, 'TCP'), this.format_tcp_udp_data(redis_udp_data, 'UDP')]).then(values=>{return values}) - } - - /*Function to refactor in series tcp and udp data from profile's timewindow for specific widgets listtables and gauges.*/ - format_redis_tcp_udp_data_with_IPs(redis_tcp_data, redis_udp_data){ - return Promise.all([this.format_tcp_udp_data_with_IPs(redis_tcp_data, 'TCP'), this.format_tcp_udp_data_with_IPs(redis_udp_data, 'UDP')]).then(values=>{return values}) - } - - /*Function to get the data from redis database for established TCP and UDP connections*/ - set_tcp_udp_data_est(ip, timewindow, TCPkey, UDPkey){ - return Promise.all([this.redis_database.getTCPest(ip, timewindow, TCPkey), this.redis_database.getUDPest(ip, timewindow, UDPkey)]).then(values=>{return values;}) - } - - /*Function to get the data from redis database for notestablished TCP and UDP connections*/ - set_tcp_udp_data_notest(ip, timewindow, TCPkey, UDPkey){ - return Promise.all([this.redis_database.getTCPnotest(ip, timewindow, TCPkey), this.redis_database.getUDPnotest(ip, timewindow, UDPkey)]).then(values=>{return values;}) - } - - /*Function to combine TCP and UDP data in one list separately for listtable and gauge widgets*/ - combine_tcp_udp(tcp_data, udp_data){ - return new Promise((resolve, reject)=>{ - let tcp_data_listtable = tcp_data[0] - let tcp_data_gauge = tcp_data[1] - let udp_data_listtable = udp_data[0] - let udp_data_gauge = udp_data[1] - let final_listtable = tcp_data_listtable.concat(udp_data_listtable) - let final_gauge = tcp_data_gauge.concat(udp_data_gauge) - resolve([final_listtable, final_gauge]) - }) - } - - /*Function to format TCP and UDP data for lsttable and gauges*/ - operate(ip, timewindow, TCP_key_established, UDP_key_established, TCP_key_notestablished, UDP_key_notEstablished,listtable1_column_names,listtable2_column_names){ - return Promise.all( - [ - - this.set_tcp_udp_data_est(ip, timewindow, TCP_key_established, UDP_key_established), - this.set_tcp_udp_data_notest(ip, timewindow, TCP_key_notestablished, UDP_key_notEstablished) - ] - ) - .then( - values=>{ - Promise.all( - [ - this.format_redis_tcp_udp_data(values[0][0],values[0][1]), - this.format_redis_tcp_udp_data(values[1][0],values[1][1]) - ] - ) - .then( - data=>{ - Promise.all( - [ - this.combine_tcp_udp(data[0][0],data[0][1]), - this.combine_tcp_udp(data[1][0], data[1][1]) - ] - ) - .then( - val=>{ - this.fake_control(val[0],val[1],listtable1_column_names,listtable2_column_names) - } - ) - } - ) - } - ) - } - - /*Function to format TCP and UDP data for lsttable and gauges when it has IP as a column value*/ - operate_IPs(ip, timewindow, TCP_key_established, UDP_key_established, TCP_key_notestablished, UDP_key_notEstablished, listtable1_column_names, listtable2_column_names){ - - return Promise.all( - [ - this.set_tcp_udp_data_est(ip, timewindow, TCP_key_established, UDP_key_established), - this.set_tcp_udp_data_notest(ip, timewindow, TCP_key_notestablished, UDP_key_notEstablished) - ] - ) - .then( - values=>{ - Promise.all( - [ - this.format_redis_tcp_udp_data_with_IPs(values[0][0],values[0][1]), - this.format_redis_tcp_udp_data_with_IPs(values[1][0],values[1][1]) - ] - ) - .then( - data=>{ - Promise.all( - [ - this.combine_tcp_udp(data[0][0],data[0][1]), - this.combine_tcp_udp(data[1][0], data[1][1]) - ] - ) - .then( - val=>{ - this.fake_control(val[0],val[1],listtable1_column_names,listtable2_column_names) - } - ) - } - ) - } - ) - } - - /*Function to fake scroll listtable and gauge down simultaneously*/ - down(){ - if(this.gauge1.widget.focused == true){ - if(this.gauge1_counter >= (this.total_data1-1)*this.gauge_number); - else{ - this.listtable1_counter += this.gauge_number*2 - this.gauge1_counter += this.gauge_number - let listtable1_data_sliced = [this.listtable1_column_names,[],...this.listtable1_data.slice(this.listtable1_counter, this.listtable1_counter + this.gauge_number*2)] - let gauge1_data_sliced = this.gauge1_data.slice(this.gauge1_counter, this.gauge1_counter + this.gauge_number) - this.listtable1.setData([['']]) - this.listtable1.setData(listtable1_data_sliced) - this.gauge1.setData(gauge1_data_sliced) - this.screen.render() - } - } - else{ - if(this.gauge2_counter >= (this.total_data2-1)*this.gauge_number); - else{ - this.listtable2_counter += this.gauge_number*2 - this.gauge2_counter += this.gauge_number - let listtable2_data_sliced = [this.listtable2_column_names,[],...this.listtable2_data.slice(this.listtable2_counter, this.listtable2_counter + this.gauge_number*2)] - let gauge2_data_sliced = this.gauge2_data.slice(this.gauge2_counter, this.gauge2_counter + this.gauge_number) - this.listtable2.setData(listtable2_data_sliced) - this.gauge2.setData(gauge2_data_sliced) - this.screen.render() - } - } - return; - } - - /*Function to fake scroll listtable and gauge up simultaneously*/ - up(){ - if(this.gauge1.widget.focused==true){ - this.listtable1_counter -= this.gauge_number*2 - this.gauge1_counter -= this.gauge_number - if(this.listtable1_counter <= 0){this.listtable1_counter = 0; this.gauge1_counter = 0;} - let listtable1_data_sliced = [this.listtable1_column_names,[],...this.listtable1_data.slice(this.listtable1_counter, this.listtable1_counter + this.gauge_number*2)] - let gauge1_data_sliced = this.gauge1_data.slice(this.gauge1_counter, this.gauge1_counter + this.gauge_number) - this.listtable1.setData(listtable1_data_sliced) - this.gauge1.setData(gauge1_data_sliced) - this.screen.render() - } - else{ - this.listtable2_counter -= this.gauge_number*2 - this.gauge2_counter -= this.gauge_number - if(this.listtable2_counter <= 0){this.listtable2_counter = 0; this.gauge2_counter = 0;} - let listtable2_data_sliced = [this.listtable2_column_names,[],...this.listtable2_data.slice(this.listtable2_counter, this.listtable2_counter + this.gauge_number*2)] - let gauge2_data_sliced = this.gauge2_data.slice(this.gauge2_counter, this.gauge2_counter + this.gauge_number) - this.listtable2.setData(listtable2_data_sliced) - this.gauge2.setData(gauge2_data_sliced) - this.screen.render() - } - return; - } - - - /*Initialize first page in widgets listtable and gauge*/ - fake_control(data_est, data_notest, listtable1_column_names, listtable2_column_names){ - this.listtable1_data = data_est[0] - this.gauge1_data = data_est[1] - - this.listtable2_data = data_notest[0] - this.gauge2_data = data_notest[1] - - this.listtable1_column_names = listtable1_column_names - this.listtable2_column_names = listtable2_column_names - this.listtable1_counter = 0 - this.listtable2_counter = 0 - this.gauge1_counter = 0 - this.gauge2_counter = 0 - this.gauge_number = 9 - this.total_data1 = Math.ceil(this.gauge1_data.length / this.gauge_number); - this.total_data2 = Math.ceil(this.gauge2_data.length / this.gauge_number); - let gauge1_data_sliced = this.gauge1_data.slice(0,this.gauge_number) - this.gauge1.setData(gauge1_data_sliced) - let gauge2_data_sliced = this.gauge2_data.slice(0,this.gauge_number) - this.gauge2.setData(gauge2_data_sliced) - let listtable1_data_sliced = [this.listtable1_column_names,[],...this.listtable1_data.slice(0,this.gauge_number*2)] - this.listtable1.setData(listtable1_data_sliced) - let listtable2_data_sliced = [this.listtable2_column_names,[],...this.listtable2_data.slice(0,this.gauge_number*2)] - this.listtable2.setData(listtable2_data_sliced) - - this.listtable1.show() - this.listtable2.show() - this.gauge1.show() - this.gauge2.show() - this.gauge1.focus() - - this.screen.render() - return; - } - -} - -module.exports = {combineClass: combine_Listtable_Gauge} diff --git a/modules/kalipso/kalipso_widgets/libraries.js b/modules/kalipso/kalipso_widgets/libraries.js deleted file mode 100644 index 99b9d1494..000000000 --- a/modules/kalipso/kalipso_widgets/libraries.js +++ /dev/null @@ -1,20 +0,0 @@ -// SPDX-FileCopyrightText: 2021 Sebastian Garcia -//SPDX-License-Identifier: GPL-2.0-only -const blessed = require('blessed') -const blessed_contrib = require('blessed-contrib') -const redis = require('redis') -const async = require('async') -const color = require('chalk') -const stripAnsi = require('strip-ansi') -const sortedArray = require('sorted-array-async'); - - -module.exports = { - blessed, - blessed_contrib, - redis, - async, - color, - stripAnsi, - sortedArray -}; diff --git a/modules/kalipso/kalipso_widgets/outtuples.js b/modules/kalipso/kalipso_widgets/outtuples.js deleted file mode 100644 index 012fe5331..000000000 --- a/modules/kalipso/kalipso_widgets/outtuples.js +++ /dev/null @@ -1,80 +0,0 @@ -// SPDX-FileCopyrightText: 2021 Sebastian Garcia -//SPDX-License-Identifier: GPL-2.0-only -const { redis, blessed, blessed_contrib, async } = require("./libraries.js"); -const listTable = require("../lib_widgets/listtable.js") - -class OutTuples extends listTable.ListTableClass{ - - constructor(grid, redis_database,screen, characteristics, limit_letter_outtuple){ - super(grid, redis_database, characteristics) - this.screen = screen - this.limit_letter_outtuple = limit_letter_outtuple - } - - /*Combine data for the outtuple hotkey - key, behavioral letters, asn, geo VT*/ - setOutTuples(ip, timewindow){ - this.redis_database.getOutTuples(ip, timewindow).then(redis_outTuples=>{ - var data = [['Out Tuple','Flow Behavior','DNS Resolution','SNI','RDNS','AS','CN','Url','Down','Ref','Com']] - if(redis_outTuples==null){this.setData(data);this.screen.render(); return;} - var json_outTuples = JSON.parse(redis_outTuples) - var keys = Object.keys(json_outTuples) - async.each(keys,(key, callback)=>{ - var tuple_info = json_outTuples[key]; - var split_tuple = key.split('-') - let outTuple_ip = split_tuple[0] - let outTuple_port = split_tuple[1] - let outTuple_protocol = split_tuple[2] - var letters_string = tuple_info[0].substr(0, this.limit_letter_outtuple) - this.getIPInfo_dict(outTuple_ip).then(ip_info_dict =>{ - this.redis_database.getDNSResolution(outTuple_ip).then(all_dns_resolution=>{ - var letter_string_chunks = this.chunkString(letters_string.trim(),40); - var length_letter = letter_string_chunks.length - if(all_dns_resolution){all_dns_resolution = JSON.parse(all_dns_resolution)['domains']} - var dns_resolution = all_dns_resolution - var length_dns_resolution = dns_resolution.length - var all_sni = ip_info_dict['SNI'] - var sni = all_sni.slice(Math.max(all_sni.length - 3, 0)) - var length_sni = sni.length - // If dns resolution is not defined, use 0 - if (length_dns_resolution == null) { length_dns_resolution = 0 } - var max_length = Math.max(length_dns_resolution, length_letter, length_sni) - var indexes_array = Array.from(Array(max_length).keys()) - - async.forEach(indexes_array, (ind, callback)=>{ - var row = []; - var temp_dns_resolution = '' - var temp_str ='' - var temp_sni =''; - - if(dns_resolution[ind] != undefined){temp_dns_resolution = dns_resolution[ind]}; - - if(sni[ind] != undefined && - outTuple_port.localeCompare(sni[ind]["dport"]) ==0 && - outTuple_protocol.localeCompare("tcp") == 0){ - temp_sni = sni[ind]["server_name"];} - - if(letter_string_chunks[ind] != undefined){temp_str = letter_string_chunks[ind]} - - if(ind ==0){ - row.push(key, temp_str, temp_dns_resolution, - temp_sni,ip_info_dict['reverse_dns'], ip_info_dict['asn'].slice(0,20), ip_info_dict['geo'], - ip_info_dict['url'], ip_info_dict['down'], ip_info_dict['ref'], - ip_info_dict['com'])} - else{ - row.push('', temp_str, temp_dns_resolution, - temp_sni, '', '','','','','','')} - data.push(row) - callback(null) - }, (err)=>{if(err){console.log('Check setOutTuple in kalipso_listtable.js. Error: ', err);}}) - callback(null) - })}) - },(err)=>{if(err){console.log('Check setOutTuple in kalipso_listtable.js. Error: ',err)} - else{ - this.setData(data); - this.screen.render()}} - ) - }) - } -} - -module.exports = {OutTuplesClass:OutTuples} diff --git a/modules/kalipso/kalipso_widgets/profile_evidences.js b/modules/kalipso/kalipso_widgets/profile_evidences.js deleted file mode 100644 index db4df4e3f..000000000 --- a/modules/kalipso/kalipso_widgets/profile_evidences.js +++ /dev/null @@ -1,64 +0,0 @@ -// SPDX-FileCopyrightText: 2021 Sebastian Garcia -//SPDX-License-Identifier: GPL-2.0-only -const { redis, blessed, blessed_contrib, async } = require("./libraries.js"); -const table = require("../lib_widgets/table.js") - -class ProfileEvidences extends table.TableClass{ - - constructor(grid, redis_database,screen, characteristics){ - const widgetParameters = { - keys: true - , vi:true - , style:{border:{ fg:'blue'}} - , interactive:characteristics[6] - , scrollbar: true - , label: characteristics[4] - , columnWidth: characteristics[5] - } - super(grid, characteristics, widgetParameters) - this.redis_database = redis_database - this.screen = screen - } - - /*Set evidence for all the timewindows in profile.*/ - setEvidencesInProfile(ip){ - try{ - this.widget.setLabel('profile_'+ip+' Evidences') - this.redis_database.getAllProfileEvidences(ip).then(all_profile_evidences=>{ - var evidence_data = []; - if(all_profile_evidences==null){this.setData(['twid','evidences'], evidence_data); this.screen.render()} - else{ - var temp_dict = Object.keys(all_profile_evidences) - temp_dict.sort(function(a,b){return(Number(a.match(/(\d+)/g)[0]) - Number((b.match(/(\d+)/g)[0])))}); - - async.forEach(temp_dict,(twid, callback)=>{ - var tw_evidences_json = JSON.parse(all_profile_evidences[twid]); - async.forEachOf(Object.entries(tw_evidences_json),([key, evidence], index)=>{ - var row = [] - if(index==0){row.push(twid)} - else{row.push('')} - var evidence_dict = JSON.parse(evidence) - var evidence_final = evidence_dict["description"]+'\n' - - row.push(evidence_final); - evidence_data.push(row) - }) - callback() - },(err)=>{ - if(err){console.log('Cannot set evidence in "z" hotkey, check setEvidenceInProfile() in kalipso_table.js. Error: ',err)} - else{ - this.setData(['timewindow','evidence'],evidence_data); - this.screen.render(); - } - }); - } - }) - } - catch(err){console.log('Check setEvidenceInProfile() in kalipso_table.js. Error: ',err)} - } - -} - - - -module.exports = {ProfileEvidencesClass: ProfileEvidences}; diff --git a/modules/kalipso/kalipso_widgets/profile_tws.js b/modules/kalipso/kalipso_widgets/profile_tws.js deleted file mode 100644 index 63f07f384..000000000 --- a/modules/kalipso/kalipso_widgets/profile_tws.js +++ /dev/null @@ -1,164 +0,0 @@ -// SPDX-FileCopyrightText: 2021 Sebastian Garcia -//SPDX-License-Identifier: GPL-2.0-only -const { redis, blessed, blessed_contrib, async, stripAnsi } = require("./libraries.js"); -const tree = require("../lib_widgets/tree.js") - -class ProfileTWs extends tree.TreeClass{ - constructor(grid, screen, redis_database, timeline_widget, evidence_widget,ipinfo_widget){ - super(grid) - this.screen = screen - this.redis_database = redis_database - this.timeline = timeline_widget - this.evidence = evidence_widget - this.ipinfo = ipinfo_widget - this.tree_data = {} - this.current_ip = '' - this.current_tw = '' - } - - /*Function to sort timewindows in ascending order*/ - sortTWs(tws, blocked_tws){ - tws.sort(function(a,b){return(Number(a.match(/(\d+)/g)[0]) - Number((b.match(/(\d+)/g)[0])))}); - let temp_tws_dict = {}; - - for (let i=0; i < tws.length; i++){ - let key = tws[i]; - - if(blocked_tws != undefined && blocked_tws.includes(key)){ - temp_tws_dict[color.red(key)] = {} - } - else{ - temp_tws_dict[key] = {} - } - - } - - return temp_tws_dict; - } - - /*Reprocess the necessary data for the tree*/ - fillTreeData(values){ - const p = values[0].map(key => - this.redis_database.getProfileTWs("tws"+key) - .then(res => { - let s = key.split("_") - return {key: s[1], val: res}; - }) - ) - - return Promise.all(p) - .then(items => { - let result = {}; - items.forEach(item => result[item.key] = item.val); - this.setTree(result, values[1], values[2]) - }) - } - - /*Prepare needed data from Redis to fill the tree and call the next function to format data*/ - getTreeDataFromDatabase(){ - return Promise.all([this.redis_database.getAllProfiles(), this.redis_database.getBlockedIPsTWs(), this.redis_database.getHostIP()]).then(values=>{this.fillTreeData(values)}) - } - - /*Get profiles and timewindows that are blocked*/ - getBlockedIPsTWs(reply_blockedIPsTWs){ - return new Promise((resolve, reject)=>{ - let blockedIPsTWs = {}; - async.each(reply_blockedIPsTWs,(blockedIPTW_line,callback)=>{ - let blockedIPTW_list = blockedIPTW_line.split('_'); - if(!Object.keys(blockedIPsTWs).includes(blockedIPTW_list[1])) - { - blockedIPsTWs[blockedIPTW_list[1]] = []; - blockedIPsTWs[blockedIPTW_list[1]].push(blockedIPTW_list[2]) - } - else{blockedIPsTWs[blockedIPTW_list[1]].push(blockedIPTW_list[2])} - callback() - },(err)=>{ - if(err){console.log('Check getBlockedIPsTWs in kalipso_tree.js. Error: ', err); reject(err);} - else{ resolve(blockedIPsTWs)} - }) - }) - } - - - /*Fill tree with Profile IPs and their timewindows, highlight blocked timewindows and the host*/ - setTree(values, blockedIPsTWs, hostIP){ - if(blockedIPsTWs == null){ blockedIPsTWs = {}} - let ips_tws = values - let result = {}; - let ips_with_profiles = Object.keys(values) - ips_with_profiles.forEach((ip)=>{ - // get the twids of each ip - let tw = values[ip]; - let sorted_tws = this.sortTWs(tw, blockedIPsTWs[ip]) - let decorated_ip = ip - - // get the length of the hostIP list - let length_hostIP = hostIP.length - - this.redis_database.getHostnameOfIP("profile_" + ip).then(res => { - if(res){decorated_ip += " " +res;} - }) - - if(hostIP.includes(ip) && hostIP.indexOf(ip) == (length_hostIP - 1 )) - { - decorated_ip += ' (me)' - } - else if(hostIP.includes(ip)){ - decorated_ip += ' (old me)' - } - - if(Object.keys(blockedIPsTWs).includes(ip)){ - result[ip] = { name:color.red(decorated_ip), extended:false, children: sorted_tws} - } - else{ - result[ip] = { name:ip, extended:false, children: sorted_tws} - } - - }) - - this.setData(result); - this.screen.render(); - - } - - - - - - - /*Function to manipulate tree, timeline, evidence*/ - on(){ - // node is the widget name - - this.widget.on('select',node=>{ - - // comes here when you press enter on an IP in the leftmost widget(the one that has iPs and tws) - if(!node.name.includes('timewindow')){ - // get the ip of the host - let ip = node.name.replace(' (me)','') - ip = ip.replace(' (old me)','') - ip = stripAnsi(ip) - this.current_ip = ip - // fill the widget at the top right of the screen with this IP info - this.ipinfo.setIPInfo(ip) - } - else{ - // comes here when you press enter on a tw in the leftmost widget(the one that has iPs and tws) - let ip = stripAnsi(node.parent.name); - // remove '(me)', '(old me)' and host name from the profile - ip = ip.split(' ')[0] - let timewindow = stripAnsi(node.name); - this.current_ip = ip - this.current_tw = timewindow - // prepare what to show when pressing z - this.evidence.setEvidence(ip, timewindow) - // prepare timeline for this ip,tw - this.timeline.setTimeline(ip, timewindow) - } - this.screen.render() - }); - } - -} - -module.exports = {ProfileTWsClass:ProfileTWs} diff --git a/modules/kalipso/kalipso_widgets/screen.js b/modules/kalipso/kalipso_widgets/screen.js deleted file mode 100755 index b7abbdd37..000000000 --- a/modules/kalipso/kalipso_widgets/screen.js +++ /dev/null @@ -1,354 +0,0 @@ -// SPDX-FileCopyrightText: 2021 Sebastian Garcia -//SPDX-License-Identifier: GPL-2.0-only -const { redis, blessed, blessed_contrib } = require("./libraries.js"); -const evidence = require('./evidence.js') -const timeline = require('./timeline.js') -const outtuples = require('./outtuples.js') -const intuples = require('./intuples.js') -const ipinfo = require('./ipinfo.js') -const profile_tws = require('./profile_tws.js') - -const listtable = require('../lib_widgets/listtable.js') -const gauge = require('../lib_widgets/gauge.js') -const combine = require('./kalipso_connect_listtable_gauge.js') -const listbar = require('../lib_widgets/listbar.js') -const help_lib = require('./help.js') -const profile_evidences = require('./profile_evidences.js') - -class screen { - constructor(redis_database, limit_letter_outtuple) { - - this.redis_database = redis_database - this.limit_letter_outtuple = limit_letter_outtuple - - this.screen = this.initScreen() - this.grid = this.initGrid() - - this.tree_widget = undefined - this.timeline_widget = undefined - this.evidence_box_widget = undefined - this.focus_widget = undefined - this.focus_hotkey = false - this.combine_listtable_gauge = undefined - - this.mainPage = this.initMain() - this.ihotkey = this.initIHotkey() - this.yhotkey = this.initYHotkey() - this.zhotkey = this.initZHotkey() - this.edprthotkey = this.initEDRPTHotkey() - this.helpbar = this.initListBar() - this.helptable = this.initHelpTable() - - this.activePage = this.mainPage - this.render() - } - - /*Initialize the screen*/ - initScreen(){ - return new blessed.screen() - } - - /*Initialize grid*/ - initGrid(){ - return new blessed_contrib.grid({ - rows: 6, - cols: 6, - screen: this.screen - }); - } - - /*Initialize help bar on the screen*/ - initHelpTable(){ - const helptable = new help_lib.HelpClass(this.grid, this.redis_database, [0, 0, 5.7, 6,'help']) - helptable.setHelp() - helptable.hide() - return [helptable] - } - - /*initialize Listbar with hotkeys on the screen*/ - initListBar(){ - return new listbar.ListBarClass(this.grid) - } - - initEDRPTHotkey(){ - let listtable1 = new listtable.ListTableClass(this.grid, this.redis_database, [0,0,2.8,2]) - listtable1.hide() - let listtable2 = new listtable.ListTableClass(this.grid, this.redis_database, [2.8,0,2.8,2]) - listtable2.hide() - let gauge1 = new gauge.GaugeClass(this.grid, [0.3, 2, 2.6, 4]) - gauge1.hide() - let gauge2 = new gauge.GaugeClass(this.grid, [3.1, 2, 2.6, 4]) - gauge2.hide() - - this.combine_listtable_gauge = new combine.combineClass(this.grid, this.redis_database, this.screen, listtable1, listtable2, gauge1, gauge2) - - return [listtable1, listtable2, gauge1, gauge2] - } - - - initZHotkey(){ - let profile_evidences_widget = new profile_evidences.ProfileEvidencesClass(this.grid, this.redis_database,this.screen, [0, 0, 5.7, 6,'ProfileEvidence',[30,200], true]) - profile_evidences_widget.widget.hide() - return [profile_evidences_widget] - } - - initIHotkey(){ - let outtuples_widget = new outtuples.OutTuplesClass(this.grid, this.redis_database, this.screen, [0,0,5.7,6], this.limit_letter_outtuple) - outtuples_widget.hide() - return [outtuples_widget] - } - - initYHotkey(){ - let intuples_widget = new intuples.InTuplesClass(this.grid, this.redis_database, this.screen, [0,0,5.7,6], this.limit_letter_outtuple) - intuples_widget.hide() - return [intuples_widget] - } - - /* Separate all main page widgets*/ - initMain(){ - this.evidence_box_widget = new evidence.EvidenceClass(this.grid, this.redis_database, this.screen, [4.8,1, 0.9, 5,'Evidence']) - let ipinfo_widget = new ipinfo.IpInfoClass(this.grid, this.redis_database, this.screen, [0, 1, 0.6, 5,'IPInfo',[30,30,10,10,10,10], false]) - this.timeline_widget = new timeline.TimelineClass(this.grid, this.screen, this.redis_database, [0.6, 1, 4.3, 5,'Timeline',[200], true]) - this.tree_widget = new profile_tws.ProfileTWsClass(this.grid, this.screen, this.redis_database, this.timeline_widget, this.evidence_box_widget, ipinfo_widget) - - this.timeline_widget.on(ipinfo_widget) - this.tree_widget.getTreeDataFromDatabase() - this.tree_widget.focus() - this.tree_widget.on() - this.tree_widget.widget.style.border.fg = 'magenta' - this.focus_widget = this.tree_widget - return [this.tree_widget.widget, ipinfo_widget, this.evidence_box_widget.widget, this.timeline_widget.widget] - } - - -// /*Display data for SrcPortsClient established and not established*/ - e_hotkey_routine(){ - this.activePage.forEach(item => item.hide()); - this.edprthotkey.forEach(item => item.show()); - - this.combine_listtable_gauge.operate( - this.tree_widget.current_ip, - this.tree_widget.current_tw, - 'SrcPortsClientTCPEstablished','SrcPortsClientUDPEstablished', - 'SrcPortsClientTCPNotEstablished', 'SrcPortsClientUDPNotEstablished', - ['estSrcPortClient', 'totalflows', 'totalpkts','totalbytes'], - ['NotEstSrcPortClient', 'totalflows', 'totalpkts','totalbytes'] - ) - } - - /*Display data for dstIPsClient established and not established*/ - d_hotkey_routine(){ - this.activePage.forEach(item => item.hide()); - this.edprthotkey.forEach(item => item.show()); - - this.combine_listtable_gauge.operate( - this.tree_widget.current_ip, - this.tree_widget.current_tw, - 'DstIPsClientTCPEstablished','DstIPsClientUDPEstablished', - 'DstIPsClientTCPNotEstablished', 'DstIPsClientUDPNotEstablished', - ['estDstIPsClient', 'totalflows', 'totalpkts','totalbytes'], - ['NotEstDstIPsClient', 'totalflows', 'totalpkts','totalbytes'] - ) - } - - /*Display data for dstPortsClient established and not established*/ - t_hotkey_routine(){ - this.activePage.forEach(item => item.hide()); - this.edprthotkey.forEach(item => item.show()); - - this.combine_listtable_gauge.operate_IPs( - this.tree_widget.current_ip, - this.tree_widget.current_tw, - 'DstPortsClientTCPEstablished','DstPortsClientUDPEstablished', - 'DstPortsClientTCPNotEstablished', 'DstPortsClientUDPNotEstablished', - ['estDstPortClient', 'IP','Number of connections'], - ['NotEstDstPortClient', 'IP','Number of packets'] - ) - } - - /*Display data for dstPortsServer established and not established*/ - r_hotkey_routine(){ - - this.activePage.forEach(item => item.hide()); - this.edprthotkey.forEach(item => item.show()); - - this.combine_listtable_gauge.operate( - this.tree_widget.current_ip, - this.tree_widget.current_tw, - 'DstPortsServerTCPEstablished','DstPortsServerUDPEstablished', - 'DstPortsServerTCPNotEstablished', 'DstPortsServerUDPNotEstablished', - ['estDstPortServer', 'totalflows', 'totalpkts','totalbytes'], - ['NotEstDstPortServer', 'totalflows', 'totalpkts','totalbytes']) - } - - /*Display data for DstPortsClient established and not established*/ - p_hotkey_routine(){ - this.activePage.forEach(item => item.hide()); - this.edprthotkey.forEach(item => item.show()); - - this.combine_listtable_gauge.operate( - this.tree_widget.current_ip, - this.tree_widget.current_tw, - 'DstPortsClientTCPEstablished','DstPortsClientUDPEstablished', - 'DstPortsClientTCPNotEstablished', 'DstPortsClientUDPNotEstablished', - ['estDstPortClient', 'totalflows','totalpkts','totalbytes'], - ['NotEstDstPortClient', 'totalflows','totalpkts','totalbytes'] - ) - } - - /*Function to fill and prepare the widget with out tuples*/ - z_hotkey_routine(){ - this.activePage.forEach(item => item.hide()); - this.zhotkey.forEach(item => item.show()); - - this.zhotkey[0].setEvidencesInProfile(this.tree_widget.current_ip) - this.zhotkey[0].focus() - this.render() - } - - i_hotkey_routine(){ - this.activePage.forEach(item => item.hide()); - this.ihotkey.forEach(item => item.show()); - - this.ihotkey[0].setOutTuples(this.tree_widget.current_ip, this.tree_widget.current_tw) - this.ihotkey[0].focus() - this.render() - } - - /*Function to fill and prepare the widget with in tuples*/ - y_hotkey_routine(){ - this.activePage.forEach(item => item.hide()); - this.yhotkey.forEach(item => item.show()); - - this.yhotkey[0].setInTuples(this.tree_widget.current_ip, this.tree_widget.current_tw) - this.yhotkey[0].focus() - this.render() - } - - - /*Function to update tree widget, i.e profiles and timewindows*/ - o_hotkey_routine(){ - this.tree_widget.getTreeDataFromDatabase() - this.render() - } - - /*Function to display help hotkey*/ - h_hotkey_routine(){ - this.activePage.forEach(item => item.hide()); - this.helptable[0].show() - this.render() - } - - - /*Function to go back from the hotkeys to main page of the interface*/ - main_page_routine(){ - this.activePage.forEach(item => item.hide()); - this.mainPage.forEach(item => item.show()); - this.focus_widget.focus() - this.render() - } - - /*Function to update interface every two minutes*/ - update_interface(){ - setInterval(this.o_hotkey_routine.bind(this), 120000) - } - - /*Function to monitor all keypresses happening on the screen*/ - registerEvents(){ - this.screen.on('keypress', (ch, key)=>{ - if(key.name == 'tab' && this.activePage == this.mainPage){ - if(this.focus_widget == this.tree_widget){ - this.focus_widget = this.timeline_widget - this.tree_widget.widget.style.border.fg = 'blue' - this.timeline_widget.widget.style.border.fg='magenta' - this.timeline_widget.widget.focus();} - else if(this.focus_widget == this.timeline_widget){ - this.timeline_widget.widget.style.border.fg='blue' - this.focus_widget = this.evidence_box_widget - this.evidence_box_widget.widget.focus()} - else if (this.focus_widget == this.evidence_box_widget){ - this.focus_widget = this.tree_widget - this.tree_widget.widget.style.border.fg = 'magenta' - this.tree_widget.focus();} - this.render(); - } - else if(key.name == 'q' || key.name == "C-c"){ - return process.exit(0) - } - else if(key.name == 'escape'){ - this.helpbar.selectTab(0) - this.main_page_routine() - this.activePage = this.mainPage - } - else if(key.name == 'p'){ - this.helpbar.selectTab(4) - this.p_hotkey_routine() - this.activePage = this.edprthotkey - } - else if(key.name == 'r'){ - this.helpbar.selectTab(3) - this.r_hotkey_routine() - this.activePage = this.edprthotkey - } - else if(key.name == 'd'){ - this.helpbar.selectTab(2) - this.d_hotkey_routine() - this.activePage = this.edprthotkey - } - else if(key.name == 't'){ - this.helpbar.selectTab(5) - this.t_hotkey_routine() - this.activePage = this.edprthotkey - } - else if(key.name == 'e'){ - this.helpbar.selectTab(1) - this.e_hotkey_routine() - this.activePage = this.edprthotkey - } - else if(key.name == 'i'){ - this.helpbar.selectTab(6) - this.i_hotkey_routine() - this.activePage = this.ihotkey - } - else if(key.name == 'z'){ - this.helpbar.selectTab(8) - this.z_hotkey_routine() - this.activePage = this.zhotkey - } - else if(key.name == 'y'){ - this.helpbar.selectTab(7) - this.y_hotkey_routine() - this.activePage = this.yhotkey - } - else if(key.name == 'o'){ - this.helpbar.selectTab(0) - this.o_hotkey_routine() - } - else if(key.name == 'h'){ - this.helpbar.selectTab(12) - this.h_hotkey_routine() - this.activePage = this.helptable - } - else if(this.activePage == this.edprthotkey && (key.name == 'down' || key.name == 'j')){ - this.combine_listtable_gauge.down() - } - else if(this.activePage == this.edprthotkey && (key.name == 'up' || key.name == 'k')){ - this.combine_listtable_gauge.up() - } - else if(key.name == 'tab' && this.activePage == this.edprthotkey){ - this.combine_listtable_gauge.changeFocus() - } - - this.render() - }) - - } - - /*Render the screen*/ - render(){ - this.screen.render() - } - -} - -module.exports = screen; diff --git a/modules/kalipso/kalipso_widgets/timeline.js b/modules/kalipso/kalipso_widgets/timeline.js deleted file mode 100644 index d618f1bba..000000000 --- a/modules/kalipso/kalipso_widgets/timeline.js +++ /dev/null @@ -1,160 +0,0 @@ -// SPDX-FileCopyrightText: 2021 Sebastian Garcia -//SPDX-License-Identifier: GPL-2.0-only -const { redis, blessed, blessed_contrib, async, color, stripAnsi } = require("./libraries.js"); -const table = require("../lib_widgets/table.js") - -class Timeline extends table.TableClass{ - - constructor(grid, screen, redis_database, characteristics){ - const widgetParameters = { - keys: true - , vi:true - , style:{border:{ fg:'blue'}} - , interactive:characteristics[6] - , scrollbar: true - , label: characteristics[4] - , columnWidth: characteristics[5] - } - super(grid, characteristics, widgetParameters) - this.screen = screen - this.redis_database = redis_database - } - - capitalizeFirstLetter(data){ - return data.charAt(0).toUpperCase() + data.slice(1); - } - - - timeConverter(UNIX_timestamp){ - let a = new Date(UNIX_timestamp * 1000); - let months = ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec']; - let year = a.getFullYear(); - let month = a.getMonth() + 1 < 10 ? '0' + (a.getMonth() + 1) : (a.getMonth() + 1) ; - let date = a.getDate() < 10 ? '0' + a.getDate() : a.getDate() ; - let hour = a.getHours() < 10 ? '0' + a.getHours() : a.getHours() ; - let min = a.getMinutes() < 10 ? '0' + a.getMinutes() : a.getMinutes(); - let sec = a.getSeconds() < 10 ? '0' + a.getSeconds() : a.getSeconds() ; - // let time = date + ' ' + month + ' ' + year + ' ' + hour + ':' + min + ':' + sec ; - let time = year + '/' + month + '/' + date + ' ' + hour + ':' + min + ':' + sec; - return time; - } - - /*Round the number to specific number of decimals*/ - round(value, decimals) { - return Number(Math.round(value+'e'+decimals)+'e-'+decimals); - } - - /*Set IP info of the IP selected in the timeline to the widget 'Table'*/ - on(ip_info_widget){ - this.widget.rows.on('select', (item, index) => { - try{ - let timeline_line = stripAnsi(item.content) - let ip = timeline_line.substring( - timeline_line.lastIndexOf("[") + 1, - timeline_line.lastIndexOf("]") - ) - if(ip && !ip.includes("'")){ - ip_info_widget.setIPInfo(ip)} - } - catch(err){console.log('Error in the function on() in kalipso_table.js. Error: ')} - }) - } - - /*Set timeline data in the widget "Table".*/ - setTimeline(ip, timewindow){ - try{ - // get the timeline of thi ip and tw from the db for example "profile_ip_timewindow_timeline" - this.redis_database.getTimeline(ip, timewindow).then(redis_timeline_data=>{ - let timeline_data = []; - // handle no timeline data found - if(redis_timeline_data.length < 1){this.setData([ip+" "+timewindow], timeline_data); this.screen.render();} - else{ - // found timeline data, parse it - redis_timeline_data.forEach((timeline)=>{ - let row = []; - let timeline_json = JSON.parse(timeline) - // this one is coming from database.py: get_dns_resolution - let pink_keywords_parameter = ['dns_resolution'] - let red_keywords = ['critical warning' ] - let orange_keywords = ['sent','recv','tot','size','type','duration'] - let blue_keywords = ['dport_name', 'dport_name/proto'] - let cyan_keywords = [] - - // display ip (source or dst) based on the direction - let direction = timeline_json['preposition']; - if (direction === "to" ){ - cyan_keywords.push('daddr') - timeline_json['saddr'] = '' - - } else if(direction === "from"){ - cyan_keywords.push('saddr') - timeline_json['daddr'] = '' - } - - // we will be appending each row value to this final_timeline - // each value has it's own color - let final_timeline = '' - let info = '' - - for (let [key, value] of Object.entries(timeline_json)) { - let flow_value = '' - - if(key.includes('critical warning')){ - flow_value = color.red(value) - } - else if(key.includes('warning')){ - flow_value = color.rgb(255,165,0)(value) - } - else if(key.includes('timestamp')){ - flow_value = color.bold(value); - } - else if(key.includes('dport/proto')){ - flow_value = color.bold.yellow(value) - } - else if(key.includes('info')){ - info = value - } - else if (blue_keywords.some(element => key.includes(element))){ - flow_value = color.rgb(51, 153, 255)(value); - } - else if(cyan_keywords.some(element => key.includes(element))){ - flow_value = color.rgb(112, 168, 154)('[' + value+']') - } - else if (orange_keywords.some(element => key.includes(element))){ - flow_value = this.capitalizeFirstLetter(key) + ':' + color.rgb(255, 153, 51)(value); - } - else if (red_keywords .some(element => key.includes(element))){ - flow_value = color.red(value); - } - else if (pink_keywords_parameter .some(element => key.includes(element))){ - flow_value = color.rgb(219,112,147)(value); - } - - if(flow_value){ - final_timeline += flow_value +' ';} - } - - row.push(final_timeline); - timeline_data.push(row); - if(info){ - for (let [key, value] of Object.entries(info)) { - row = [] - let info_format = color.bold(this.capitalizeFirstLetter(key).padStart(20 + key.length)) + ':' + color.rgb(219,112,147)(value) + ' '; - row.push(info_format); - timeline_data.push(row); - } - } - }) - - this.redis_database.getStarttimeForTW(ip,timewindow).then(timewindow_starttime=>{ - this.setData([ip+" "+timewindow + " " + this.timeConverter(timewindow_starttime)], timeline_data); - this.screen.render(); - }) - } - }) - } - catch(err){console.log("Error in setTimeline() in kalipso_table.js. Error: ",err)} - } -} - -module.exports = {TimelineClass: Timeline}; diff --git a/modules/kalipso/lib_widgets/box.js b/modules/kalipso/lib_widgets/box.js deleted file mode 100644 index 90afebac8..000000000 --- a/modules/kalipso/lib_widgets/box.js +++ /dev/null @@ -1,39 +0,0 @@ -// SPDX-FileCopyrightText: 2021 Sebastian Garcia -//SPDX-License-Identifier: GPL-2.0-only -const { redis, blessed, blessed_contrib } = require("../kalipso_widgets/libraries.js"); - -class Box{ - constructor(grid, gridParameters, widgetParameters){ - this.grid = grid - this.widget = this.initBox(gridParameters, widgetParameters); - } - - /*Initialize the parameters for the widgets 'Box'.*/ - initBox(gridParameters, widgetParameters){ - return this.grid.set(gridParameters[0], gridParameters[1], gridParameters[2], gridParameters[3], - blessed.box, - widgetParameters) - } - - /*Set data in the widget*/ - setData(data){ - this.widget.setContent(data) - } - - /*Hide the widget from the screen*/ - hide(){ - this.widget.hide() - } - - /*Show the widget on the screen*/ - show(){ - this.widget.show() - } - - /*Focus on the widget in the screen*/ - focus(){ - this.widget.focus() - } -} - -module.exports = { BoxClass: Box } diff --git a/modules/kalipso/lib_widgets/gauge.js b/modules/kalipso/lib_widgets/gauge.js deleted file mode 100644 index e5c4286cf..000000000 --- a/modules/kalipso/lib_widgets/gauge.js +++ /dev/null @@ -1,43 +0,0 @@ -// SPDX-FileCopyrightText: 2021 Sebastian Garcia -//SPDX-License-Identifier: GPL-2.0-only -const { redis, blessed, blessed_contrib, async, color, stripAnsi } = require("../kalipso_widgets/libraries.js"); - - -class Gauge{ - constructor(grid, gridParameters ){ - this.grid = grid - const widgetParameters = {style:{ - border:{ fg:'blue'}, - focus: {border:{ fg:'magenta'}}}, - keys:true, - gaugeSpacing: 1, - gaugeHeight: 1, - gauges:[] - } - this.widget = this.grid.set(gridParameters[0],gridParameters[1],gridParameters[2], gridParameters[3], - blessed_contrib.gaugeList, - widgetParameters); - } - - /*Hide the widget on the screen*/ - hide(){ - this.widget.hide() - } - - /*Show the widget on the screen*/ - show(){ - this.widget.show() - } - - /*Focus on the widget on the screen*/ - focus(){ - this.widget.focus() - } - - /*Set data in the widget*/ - setData(data){ - this.widget.setGauges(data) - } -} - -module.exports = {GaugeClass:Gauge} diff --git a/modules/kalipso/lib_widgets/listbar.js b/modules/kalipso/lib_widgets/listbar.js deleted file mode 100644 index 27559c756..000000000 --- a/modules/kalipso/lib_widgets/listbar.js +++ /dev/null @@ -1,75 +0,0 @@ -// SPDX-FileCopyrightText: 2021 Sebastian Garcia -//SPDX-License-Identifier: GPL-2.0-only -const { redis, blessed, blessed_contrib, async, color, stripAnsi } = require("../kalipso_widgets/libraries.js"); - -class ListBar{ - - constructor(grid){ - this.grid = grid - this.widget = this.initWidget() - } - - /*Hide the widget on the screen*/ - hide(){ - this.widget.hide() - } - - /*Show the widget on the screen*/ - show(){ - this.widget.show() - } - - /*Focus on the widget on the screen*/ - focus(){ - this.widget.focus() - } - - /*Initialize widget on the screen with its parameters*/ - initWidget(){ - return this.grid.set(5.7,0,0.4,6, blessed.listbar,{ - keys: false, - style: - { - prefix: {fg: 'yellow'}, - item: {}, - selected:{fg:'red'} - }, - autoCommandKeys: true, - commands: - { - 'main':{ keys : ' '}, - - 'srcPortClient': { keys: ['e'] }, - - 'dstIPsClient': { keys: ['d'] }, - - 'dstPortServer': { keys: ['r'] }, - - 'dstPortsClient': { keys: ['p'] }, - - 'dstPortsClientIPs': { keys: ['t'] }, - - 'OutTuples': { keys: ['i'] }, - - 'InTuples': { keys: ['y'] }, - - 'ProfileEvidences':{ keys : ['z'] }, - - 'reload':{ keys : ['o'] }, - - 'quit hotkey':{ keys : ['ESC'] }, - - 'quit kalipso':{ keys : ['q'] }, - - 'help':{ keys: ['h'] } - } - }) - } - - /*Select key in the widget 'Listbar'*/ - selectTab(key){ - this.widget.selectTab(key) - } -} - -module.exports = {ListBarClass:ListBar} diff --git a/modules/kalipso/lib_widgets/listtable.js b/modules/kalipso/lib_widgets/listtable.js deleted file mode 100644 index 73977fe31..000000000 --- a/modules/kalipso/lib_widgets/listtable.js +++ /dev/null @@ -1,162 +0,0 @@ -// SPDX-FileCopyrightText: 2021 Sebastian Garcia -//SPDX-License-Identifier: GPL-2.0-only -var fs = require('fs') -const { redis, blessed, blessed_contrib, async } = require("../kalipso_widgets/libraries.js"); - -class ListTable{ - constructor(grid, redis_database, characteristics, limit_letter_outtuple=0){ - this.grid = grid - this.redis_database = redis_database - this.widget = this.initListTable(characteristics); - this.limit_letter_outtuple = limit_letter_outtuple - this.country_code = {} - this.read_file().then(data=>{this.country_code = data}) -} - /*Initialise the widget ListTable and its parameters*/ - initListTable(characteristics){ - return this.grid.set(characteristics[0],characteristics[1],characteristics[2],characteristics[3], blessed.listtable, { - keys: true, - mouse: true, - vi:true, - tags: true, - border: 'line', - style: { - header: { - fg: 'blue', - bold: true - }, - cell: { - selected: { - bg: 'magenta' - } - } - }, - align: 'left' - }) - } - - /*Set data in the widget ListTable*/ - setData(data){ - this.widget.setData(data) - } - - /*Read the file with countries and there shortenings.*/ - read_file(){ - let code = {} - return new Promise((resolve, reject)=>{ fs.readFile('countries.json', 'utf8', (err,data)=>{ - if(err){console.log('Check read_file() in kalipso_listtable.js. Error: ', err); reject(err);} - else{resolve(JSON.parse(data))} - })}) - } - - /*Hide the widget on the screen*/ - hide(){ - this.widget.hide() - } - - /*Show the widget on the screen*/ - show(){ - this.widget.show() - } - - /*Focus on the widget on the screen*/ - focus(){ - this.widget.focus() - } - - /*Round the numbers by specific decimals*/ - round(value, decimals) { - return Number(Math.round(value+'e'+decimals)+'e-'+decimals); - } - - /*Function to split the string in several lines.*/ - chunkString(str, len) { - const size = Math.ceil(str.length/len) - const r = Array(size) - let offset = 0 - - for (let i = 0; i < size; i++) { - r[i] = str.substr(offset, len) - offset += len - } - return r - } - /*Set information about the selected IP in the timeline.*/ - setIPInfo(ip){ - try{ - this.getIPInfo_dict(ip).then(ip_info_dict =>{ - // fill the widget at the top right of the screen - var ipInfo_data = [['asn','geo','url','down','ref','com']] - this.widget.setLabel(ip_info_dict['reverse_dns']) - ipInfo_data.push([ip_info_dict['asn'], ip_info_dict['geo'], ip_info_dict['url'], ip_info_dict['down'],ip_info_dict['ref'],ip_info_dict['com']]) - this.setData(ipInfo_data) - }) - } - catch (err){ - console.log('Check setIPInfo in kalipso_listtable.js. Error: ',err)} - } - - - getIPInfo_dict(ip){ - return new Promise ((resolve, reject)=>{this.redis_database.getIpInfo(ip).then(redis_IpInfo_data=>{ - try{ - var ip_info_dict = {'asn':'', 'geo':'', 'SNI':'', 'reverse_dns':'', 'url':'', 'down':'','ref':'','com':''} - if(redis_IpInfo_data==null){resolve(ip_info_dict)} - else{ - var ipInfo_json = JSON.parse(redis_IpInfo_data); - - if (ipInfo_json.hasOwnProperty('VirusTotal')){ - ip_info_dict['url'] = String(this.round(ipInfo_json['VirusTotal']['URL'],5)) - ip_info_dict['down'] = String(this.round(ipInfo_json['VirusTotal']['down_file'],5)) - ip_info_dict['ref'] = String(this.round(ipInfo_json['VirusTotal']['ref_file'],5)) - ip_info_dict['com'] = String(this.round(ipInfo_json['VirusTotal']['com_file'],5)) - } - else{ - ip_info_dict['url'] = '-'; - ip_info_dict['down'] = '-'; - ip_info_dict['ref'] = '-'; - ip_info_dict['com'] = '-'; - } - - if(ipInfo_json.hasOwnProperty('asn')){ - ip_info_dict['asn'] = ipInfo_json['asn']['asnorg'] - } - else{ - ip_info_dict['asn'] = '-' - } - - if(ipInfo_json.hasOwnProperty('geocountry')){ - ip_info_dict['geo'] = this.country_code[ipInfo_json['geocountry']]} - - if(typeof ip_info_dict['geo'] == 'undefined'){ - ip_info_dict['geo'] = '-' - } - - if(ipInfo_json.hasOwnProperty('SNI')){ - ip_info_dict['SNI'] = ipInfo_json['SNI'] - } - else{ - ip_info_dict['SNI'] = '-' - } - - if(ipInfo_json.hasOwnProperty('reverse_dns')){ - ip_info_dict['reverse_dns'] = ipInfo_json['reverse_dns']} - else{ip_info_dict['reverse_dns'] = '-'} - - resolve(ip_info_dict) - } - - } - catch(err){ - console.log('Check getIPInfo in kalipso_listtable.js. Error: ', err) - reject(err) - } - - }) - }) - } - - -} - -module.exports = {ListTableClass:ListTable} diff --git a/modules/kalipso/lib_widgets/table.js b/modules/kalipso/lib_widgets/table.js deleted file mode 100644 index e029077a3..000000000 --- a/modules/kalipso/lib_widgets/table.js +++ /dev/null @@ -1,34 +0,0 @@ -// SPDX-FileCopyrightText: 2021 Sebastian Garcia -//SPDX-License-Identifier: GPL-2.0-only -const { redis, blessed, blessed_contrib } = require("../kalipso_widgets/libraries.js"); - -class Table{ - - constructor(grid, gridParameters, widgetParameters){ - this.widget = grid.set(gridParameters[0],gridParameters[1],gridParameters[2],gridParameters[3], - blessed_contrib.table, - widgetParameters - ) - } - - /*Set data in the widget 'Table'*/ - setData(widget_headers, widget_data){ - this.widget.setData({headers:widget_headers, data:widget_data}) - } - /*Hide the widget on the screen*/ - hide(){ - this.widget.hide() - } - - /*Show the widget on the screen*/ - show(){ - this.widget.show() - } - - /*Focus on the widget on the screen*/ - focus(){ - this.widget.focus() - } -} - -module.exports = {TableClass: Table}; diff --git a/modules/kalipso/lib_widgets/tree.js b/modules/kalipso/lib_widgets/tree.js deleted file mode 100755 index 983406d15..000000000 --- a/modules/kalipso/lib_widgets/tree.js +++ /dev/null @@ -1,36 +0,0 @@ -// SPDX-FileCopyrightText: 2021 Sebastian Garcia -//SPDX-License-Identifier: GPL-2.0-only -const { redis, blessed, blessed_contrib, async, color, stripAnsi } = require("../kalipso_widgets/libraries.js"); - -class Tree{ - constructor(grid){ - this.grid = grid - this.widget =this.grid.set(0,0,5.7,1, blessed_contrib.tree, - { vi:true - , style: {fg:'green',border: {fg:'blue'}} - , template: { lines: true } - , label: 'IPs'}) - } - - /*Focus on the widget in the screen*/ - focus(){ - this.widget.focus() - } - - /*Hide widget in the screen.*/ - hide(){ - this.widget.hide() - } - - /*Show widget in the screen*/ - show(){ - this.widget.show() - } - - /*Set data in the widget*/ - setData(data){ - this.widget.setData({extended:true, children:data}) - } -} - -module.exports = {TreeClass:Tree} diff --git a/modules/kalipso/package-lock.json b/modules/kalipso/package-lock.json deleted file mode 100644 index 248e87f02..000000000 --- a/modules/kalipso/package-lock.json +++ /dev/null @@ -1,1761 +0,0 @@ -{ - "name": "kalipso", - "version": "1.0.0", - "lockfileVersion": 2, - "requires": true, - "packages": { - "": { - "name": "kalipso", - "version": "1.0.0", - "license": "GPL-2.0-only", - "dependencies": { - "ansi-colors": "^4.1.1", - "async": "^3.2.0", - "blessed": "^0.1.81", - "blessed-contrib": "^4.10.0", - "chalk": "^4.1.2", - "clipboardy": "^2.3.0", - "fs": "^0.0.1-security", - "redis": "^3.1.2", - "sorted-array-async": "^0.0.7", - "strip-ansi": "^6.0.0", - "yargs": "^17.0.1" - }, - "devDependencies": {} - }, - "node_modules/@colors/colors": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", - "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", - "optional": true, - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" - }, - "node_modules/ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "engines": { - "node": ">=6" - } - }, - "node_modules/ansi-escapes": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-5.0.0.tgz", - "integrity": "sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA==", - "dependencies": { - "type-fest": "^1.0.2" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/ansi-term": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/ansi-term/-/ansi-term-0.0.2.tgz", - "integrity": "sha1-/XU++kvq2g6smZgbxSo/b/AZ3rc=", - "dependencies": { - "x256": ">=0.0.1" - } - }, - "node_modules/ansicolors": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/ansicolors/-/ansicolors-0.3.2.tgz", - "integrity": "sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg==" - }, - "node_modules/arch": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz", - "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/async": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.2.tgz", - "integrity": "sha512-H0E+qZaDEfx/FY4t7iLRv1W2fFI6+pyCeTw1uN20AQPiwqwM6ojPxHxdLv4z8hi2DtnW9BOckSspLucW7pIE5g==" - }, - "node_modules/blessed": { - "version": "0.1.81", - "resolved": "https://registry.npmjs.org/blessed/-/blessed-0.1.81.tgz", - "integrity": "sha1-+WLWh+wsNpVwrnGvhDJW5tDKESk=", - "bin": { - "blessed": "bin/tput.js" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/blessed-contrib": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/blessed-contrib/-/blessed-contrib-4.11.0.tgz", - "integrity": "sha512-P00Xji3xPp53+FdU9f74WpvnOAn/SS0CKLy4vLAf5Ps7FGDOTY711ruJPZb3/7dpFuP+4i7f4a/ZTZdLlKG9WA==", - "dependencies": { - "ansi-term": ">=0.0.2", - "chalk": "^1.1.0", - "drawille-canvas-blessed-contrib": ">=0.1.3", - "lodash": "~>=4.17.21", - "map-canvas": ">=0.1.5", - "marked": "^4.0.12", - "marked-terminal": "^5.1.1", - "memory-streams": "^0.1.0", - "memorystream": "^0.3.1", - "picture-tuber": "^1.0.1", - "sparkline": "^0.1.1", - "strip-ansi": "^3.0.0", - "term-canvas": "0.0.5", - "x256": ">=0.0.1" - } - }, - "node_modules/blessed-contrib/node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/blessed-contrib/node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dependencies": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/blessed-contrib/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/blessed-contrib/node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/bresenham": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/bresenham/-/bresenham-0.0.3.tgz", - "integrity": "sha1-q9q55bGU4nx1fNMU2ERDFPKZh3o=" - }, - "node_modules/buffers": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", - "integrity": "sha1-skV5w77U1tOWru5tmorn9Ugqt7s=", - "engines": { - "node": ">=0.2.0" - } - }, - "node_modules/cardinal": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/cardinal/-/cardinal-2.1.1.tgz", - "integrity": "sha512-JSr5eOgoEymtYHBjNWyjrMqet9Am2miJhlfKNdqLp6zoeAh0KN5dRAcxlecj5mAJrmQomgiOBj35xHLrFjqBpw==", - "dependencies": { - "ansicolors": "~0.3.2", - "redeyed": "~2.1.0" - }, - "bin": { - "cdl": "bin/cdl.js" - } - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/charm": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/charm/-/charm-0.1.2.tgz", - "integrity": "sha1-BsIe7RobBq62dVPNxT4jJ0usIpY=" - }, - "node_modules/cli-table3": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz", - "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==", - "dependencies": { - "string-width": "^4.2.0" - }, - "engines": { - "node": "10.* || >= 12.*" - }, - "optionalDependencies": { - "@colors/colors": "1.5.0" - } - }, - "node_modules/clipboardy": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/clipboardy/-/clipboardy-2.3.0.tgz", - "integrity": "sha512-mKhiIL2DrQIsuXMgBgnfEHOZOryC7kY7YO//TN6c63wlEm3NG5tz+YgY5rVi29KCmq/QQjKYvM7a19+MDOTHOQ==", - "dependencies": { - "arch": "^2.1.1", - "execa": "^1.0.0", - "is-wsl": "^2.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" - }, - "node_modules/cross-spawn": { - "version": "6.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.6.tgz", - "integrity": "sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==", - "dependencies": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "engines": { - "node": ">=4.8" - } - }, - "node_modules/denque": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/denque/-/denque-1.5.1.tgz", - "integrity": "sha512-XwE+iZ4D6ZUB7mfYRMb5wByE8L74HCn30FBN7sWnXksWc1LO1bPDl67pBR9o/kC4z/xSNAwkMYcGgqDV3BE3Hw==", - "engines": { - "node": ">=0.10" - } - }, - "node_modules/drawille-blessed-contrib": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/drawille-blessed-contrib/-/drawille-blessed-contrib-1.0.0.tgz", - "integrity": "sha1-FcJ5NPV6AFatE1luFWFje8lB8Lc=" - }, - "node_modules/drawille-canvas-blessed-contrib": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/drawille-canvas-blessed-contrib/-/drawille-canvas-blessed-contrib-0.1.3.tgz", - "integrity": "sha1-IS8HinIr/S7MJn6oarbd3BCB/Ug=", - "dependencies": { - "ansi-term": ">=0.0.2", - "bresenham": "0.0.3", - "drawille-blessed-contrib": ">=0.0.1", - "gl-matrix": "^2.1.0", - "x256": ">=0.0.1" - } - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/end-of-stream": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", - "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/es6-promise": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz", - "integrity": "sha1-oIzd6EzNvzTQJ6FFG8kdS80ophM=" - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/event-stream": { - "version": "0.9.8", - "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-0.9.8.tgz", - "integrity": "sha1-XanPPHkAl1mJ21powo5bPJjr4Do=", - "dependencies": { - "optimist": "0.2" - }, - "engines": { - "node": "*" - } - }, - "node_modules/event-stream/node_modules/optimist": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.2.8.tgz", - "integrity": "sha1-6YGrfiaLRXlIWTtVZ0wJmoFcrDE=", - "dependencies": { - "wordwrap": ">=0.0.1 <0.1.0" - }, - "engines": { - "node": "*" - } - }, - "node_modules/execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "dependencies": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/fs": { - "version": "0.0.1-security", - "resolved": "https://registry.npmjs.org/fs/-/fs-0.0.1-security.tgz", - "integrity": "sha1-invTcYa23d84E/I4WLV+yq9eQdQ=" - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/gl-matrix": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/gl-matrix/-/gl-matrix-2.8.1.tgz", - "integrity": "sha512-0YCjVpE3pS5XWlN3J4X7AiAx65+nqAI54LndtVFnQZB6G/FVLkZH8y8V6R3cIoOQR4pUdfwQGd1iwyoXHJ4Qfw==" - }, - "node_modules/has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/here": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/here/-/here-0.0.2.tgz", - "integrity": "sha1-acGvPwISHz2HiOAuhNyLOQXXEZU=" - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dependencies": { - "is-docker": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" - }, - "node_modules/lodash": { - "version": "4.17.23", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz", - "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==" - }, - "node_modules/map-canvas": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/map-canvas/-/map-canvas-0.1.5.tgz", - "integrity": "sha1-i+a63gvz6fmotW6INqHR0TPKsYY=", - "dependencies": { - "drawille-canvas-blessed-contrib": ">=0.0.1", - "xml2js": "^0.4.5" - } - }, - "node_modules/marked": { - "version": "4.2.12", - "resolved": "https://registry.npmjs.org/marked/-/marked-4.2.12.tgz", - "integrity": "sha512-yr8hSKa3Fv4D3jdZmtMMPghgVt6TWbk86WQaWhDloQjRSQhMMYCAro7jP7VDJrjjdV8pxVxMssXS8B8Y5DZ5aw==", - "bin": { - "marked": "bin/marked.js" - }, - "engines": { - "node": ">= 12" - } - }, - "node_modules/marked-terminal": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/marked-terminal/-/marked-terminal-5.1.1.tgz", - "integrity": "sha512-+cKTOx9P4l7HwINYhzbrBSyzgxO2HaHKGZGuB1orZsMIgXYaJyfidT81VXRdpelW/PcHEWxywscePVgI/oUF6g==", - "dependencies": { - "ansi-escapes": "^5.0.0", - "cardinal": "^2.1.1", - "chalk": "^5.0.0", - "cli-table3": "^0.6.1", - "node-emoji": "^1.11.0", - "supports-hyperlinks": "^2.2.0" - }, - "engines": { - "node": ">=14.13.1 || >=16.0.0" - }, - "peerDependencies": { - "marked": "^1.0.0 || ^2.0.0 || ^3.0.0 || ^4.0.0" - } - }, - "node_modules/marked-terminal/node_modules/chalk": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz", - "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/memory-streams": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/memory-streams/-/memory-streams-0.1.3.tgz", - "integrity": "sha512-qVQ/CjkMyMInPaaRMrwWNDvf6boRZXaT/DbQeMYcCWuXPEBf1v8qChOc9OlEVQp2uOvRXa1Qu30fLmKhY6NipA==", - "dependencies": { - "readable-stream": "~1.0.2" - } - }, - "node_modules/memorystream": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", - "integrity": "sha1-htcJCzDORV1j+64S3aUaR93K+bI=", - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" - }, - "node_modules/node-emoji": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz", - "integrity": "sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==", - "dependencies": { - "lodash": "^4.17.21" - } - }, - "node_modules/nopt": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-2.1.2.tgz", - "integrity": "sha1-bMzZd7gBMqB3MdbozljCyDA8+a8=", - "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" - } - }, - "node_modules/npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", - "dependencies": { - "path-key": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/optimist": { - "version": "0.3.7", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.3.7.tgz", - "integrity": "sha1-yQlBrVnkJzMokjB00s8ufLxuwNk=", - "dependencies": { - "wordwrap": "~0.0.2" - } - }, - "node_modules/p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", - "engines": { - "node": ">=4" - } - }, - "node_modules/path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", - "engines": { - "node": ">=4" - } - }, - "node_modules/picture-tuber": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/picture-tuber/-/picture-tuber-1.0.2.tgz", - "integrity": "sha512-49/xq+wzbwDeI32aPvwQJldM8pr7dKDRuR76IjztrkmiCkAQDaWFJzkmfVqCHmt/iFoPFhHmI9L0oKhthrTOQw==", - "dependencies": { - "buffers": "~0.1.1", - "charm": "~0.1.0", - "event-stream": "~0.9.8", - "optimist": "~0.3.4", - "png-js": "~0.1.0", - "x256": "~0.0.1" - }, - "bin": { - "picture-tube": "bin/tube.js" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/png-js": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/png-js/-/png-js-0.1.1.tgz", - "integrity": "sha1-HMfCEjA6yr50Jj7DrHgAlYAkLZM=" - }, - "node_modules/pump": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz", - "integrity": "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==", - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "node_modules/redeyed": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/redeyed/-/redeyed-2.1.1.tgz", - "integrity": "sha512-FNpGGo1DycYAdnrKFxCMmKYgo/mILAqtRYbkdQD8Ep/Hk2PQ5+aEAEx+IU713RTDmuBaH0c8P5ZozurNu5ObRQ==", - "dependencies": { - "esprima": "~4.0.0" - } - }, - "node_modules/redis": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/redis/-/redis-3.1.2.tgz", - "integrity": "sha512-grn5KoZLr/qrRQVwoSkmzdbw6pwF+/rwODtrOr6vuBRiR/f3rjSTGupbF90Zpqm2oenix8Do6RV7pYEkGwlKkw==", - "dependencies": { - "denque": "^1.5.0", - "redis-commands": "^1.7.0", - "redis-errors": "^1.2.0", - "redis-parser": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/node-redis" - } - }, - "node_modules/redis-commands": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/redis-commands/-/redis-commands-1.7.0.tgz", - "integrity": "sha512-nJWqw3bTFy21hX/CPKHth6sfhZbdiHP6bTawSgQBlKOVRG7EZkfHbbHwQJnrE4vsQf0CMNE+3gJ4Fmm16vdVlQ==" - }, - "node_modules/redis-errors": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz", - "integrity": "sha1-62LSrbFeTq9GEMBK/hUpOEJQq60=", - "engines": { - "node": ">=4" - } - }, - "node_modules/redis-parser": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-3.0.0.tgz", - "integrity": "sha1-tm2CjNyv5rS4pCin3vTGvKwxyLQ=", - "dependencies": { - "redis-errors": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" - }, - "node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", - "dependencies": { - "shebang-regex": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" - }, - "node_modules/sorted-array-async": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/sorted-array-async/-/sorted-array-async-0.0.7.tgz", - "integrity": "sha1-kNnWKyb6AxXDu8YjvUc1WbYps0k=", - "dependencies": { - "es6-promise": "^3.1.2" - } - }, - "node_modules/sparkline": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/sparkline/-/sparkline-0.1.2.tgz", - "integrity": "sha1-w73kYlKxNU5xDEsgDVSBa9nwejI=", - "dependencies": { - "here": "0.0.2", - "nopt": "~2.1.2" - }, - "bin": { - "sparkline": "bin/sparkline" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-hyperlinks": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", - "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", - "dependencies": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/term-canvas": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/term-canvas/-/term-canvas-0.0.5.tgz", - "integrity": "sha1-WXr6wvpjaabxeGC86cX2bW6gypY=" - }, - "node_modules/type-fest": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", - "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/wordwrap": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", - "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" - }, - "node_modules/x256": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/x256/-/x256-0.0.2.tgz", - "integrity": "sha1-ya8Yh296F1gB1WT+cK2egxd4STQ=", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/xml2js": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", - "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", - "dependencies": { - "sax": ">=0.6.0", - "xmlbuilder": "~11.0.0" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/xmlbuilder": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", - "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs": { - "version": "17.2.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.2.1.tgz", - "integrity": "sha512-XfR8du6ua4K6uLGm5S6fA+FIJom/MdJcFNVY8geLlp2v8GYbOXD4EB1tPNZsRn4vBzKGMgb5DRZMeWuFc2GO8Q==", - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "engines": { - "node": ">=10" - } - } - }, - "dependencies": { - "@colors/colors": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", - "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", - "optional": true - }, - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" - }, - "ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==" - }, - "ansi-escapes": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-5.0.0.tgz", - "integrity": "sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA==", - "requires": { - "type-fest": "^1.0.2" - } - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "ansi-term": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/ansi-term/-/ansi-term-0.0.2.tgz", - "integrity": "sha1-/XU++kvq2g6smZgbxSo/b/AZ3rc=", - "requires": { - "x256": ">=0.0.1" - } - }, - "ansicolors": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/ansicolors/-/ansicolors-0.3.2.tgz", - "integrity": "sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg==" - }, - "arch": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz", - "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==" - }, - "async": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.2.tgz", - "integrity": "sha512-H0E+qZaDEfx/FY4t7iLRv1W2fFI6+pyCeTw1uN20AQPiwqwM6ojPxHxdLv4z8hi2DtnW9BOckSspLucW7pIE5g==" - }, - "blessed": { - "version": "0.1.81", - "resolved": "https://registry.npmjs.org/blessed/-/blessed-0.1.81.tgz", - "integrity": "sha1-+WLWh+wsNpVwrnGvhDJW5tDKESk=" - }, - "blessed-contrib": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/blessed-contrib/-/blessed-contrib-4.11.0.tgz", - "integrity": "sha512-P00Xji3xPp53+FdU9f74WpvnOAn/SS0CKLy4vLAf5Ps7FGDOTY711ruJPZb3/7dpFuP+4i7f4a/ZTZdLlKG9WA==", - "requires": { - "ansi-term": ">=0.0.2", - "chalk": "^1.1.0", - "drawille-canvas-blessed-contrib": ">=0.1.3", - "lodash": "~>=4.17.21", - "map-canvas": ">=0.1.5", - "marked": "^4.0.12", - "marked-terminal": "^5.1.1", - "memory-streams": "^0.1.0", - "memorystream": "^0.3.1", - "picture-tuber": "^1.0.1", - "sparkline": "^0.1.1", - "strip-ansi": "^3.0.0", - "term-canvas": "0.0.5", - "x256": ">=0.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - } - } - }, - "bresenham": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/bresenham/-/bresenham-0.0.3.tgz", - "integrity": "sha1-q9q55bGU4nx1fNMU2ERDFPKZh3o=" - }, - "buffers": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", - "integrity": "sha1-skV5w77U1tOWru5tmorn9Ugqt7s=" - }, - "cardinal": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/cardinal/-/cardinal-2.1.1.tgz", - "integrity": "sha512-JSr5eOgoEymtYHBjNWyjrMqet9Am2miJhlfKNdqLp6zoeAh0KN5dRAcxlecj5mAJrmQomgiOBj35xHLrFjqBpw==", - "requires": { - "ansicolors": "~0.3.2", - "redeyed": "~2.1.0" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "charm": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/charm/-/charm-0.1.2.tgz", - "integrity": "sha1-BsIe7RobBq62dVPNxT4jJ0usIpY=" - }, - "cli-table3": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz", - "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==", - "requires": { - "@colors/colors": "1.5.0", - "string-width": "^4.2.0" - } - }, - "clipboardy": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/clipboardy/-/clipboardy-2.3.0.tgz", - "integrity": "sha512-mKhiIL2DrQIsuXMgBgnfEHOZOryC7kY7YO//TN6c63wlEm3NG5tz+YgY5rVi29KCmq/QQjKYvM7a19+MDOTHOQ==", - "requires": { - "arch": "^2.1.1", - "execa": "^1.0.0", - "is-wsl": "^2.1.1" - } - }, - "cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" - }, - "cross-spawn": { - "version": "6.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.6.tgz", - "integrity": "sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==", - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "denque": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/denque/-/denque-1.5.1.tgz", - "integrity": "sha512-XwE+iZ4D6ZUB7mfYRMb5wByE8L74HCn30FBN7sWnXksWc1LO1bPDl67pBR9o/kC4z/xSNAwkMYcGgqDV3BE3Hw==" - }, - "drawille-blessed-contrib": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/drawille-blessed-contrib/-/drawille-blessed-contrib-1.0.0.tgz", - "integrity": "sha1-FcJ5NPV6AFatE1luFWFje8lB8Lc=" - }, - "drawille-canvas-blessed-contrib": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/drawille-canvas-blessed-contrib/-/drawille-canvas-blessed-contrib-0.1.3.tgz", - "integrity": "sha1-IS8HinIr/S7MJn6oarbd3BCB/Ug=", - "requires": { - "ansi-term": ">=0.0.2", - "bresenham": "0.0.3", - "drawille-blessed-contrib": ">=0.0.1", - "gl-matrix": "^2.1.0", - "x256": ">=0.0.1" - } - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "end-of-stream": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", - "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", - "requires": { - "once": "^1.4.0" - } - }, - "es6-promise": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz", - "integrity": "sha1-oIzd6EzNvzTQJ6FFG8kdS80ophM=" - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" - }, - "event-stream": { - "version": "0.9.8", - "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-0.9.8.tgz", - "integrity": "sha1-XanPPHkAl1mJ21powo5bPJjr4Do=", - "requires": { - "optimist": "0.2" - }, - "dependencies": { - "optimist": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.2.8.tgz", - "integrity": "sha1-6YGrfiaLRXlIWTtVZ0wJmoFcrDE=", - "requires": { - "wordwrap": ">=0.0.1 <0.1.0" - } - } - } - }, - "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - }, - "fs": { - "version": "0.0.1-security", - "resolved": "https://registry.npmjs.org/fs/-/fs-0.0.1-security.tgz", - "integrity": "sha1-invTcYa23d84E/I4WLV+yq9eQdQ=" - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" - }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "requires": { - "pump": "^3.0.0" - } - }, - "gl-matrix": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/gl-matrix/-/gl-matrix-2.8.1.tgz", - "integrity": "sha512-0YCjVpE3pS5XWlN3J4X7AiAx65+nqAI54LndtVFnQZB6G/FVLkZH8y8V6R3cIoOQR4pUdfwQGd1iwyoXHJ4Qfw==" - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "here": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/here/-/here-0.0.2.tgz", - "integrity": "sha1-acGvPwISHz2HiOAuhNyLOQXXEZU=" - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==" - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==" - }, - "is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "requires": { - "is-docker": "^2.0.0" - } - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" - }, - "lodash": { - "version": "4.17.23", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz", - "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==" - }, - "map-canvas": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/map-canvas/-/map-canvas-0.1.5.tgz", - "integrity": "sha1-i+a63gvz6fmotW6INqHR0TPKsYY=", - "requires": { - "drawille-canvas-blessed-contrib": ">=0.0.1", - "xml2js": "^0.4.5" - } - }, - "marked": { - "version": "4.2.12", - "resolved": "https://registry.npmjs.org/marked/-/marked-4.2.12.tgz", - "integrity": "sha512-yr8hSKa3Fv4D3jdZmtMMPghgVt6TWbk86WQaWhDloQjRSQhMMYCAro7jP7VDJrjjdV8pxVxMssXS8B8Y5DZ5aw==" - }, - "marked-terminal": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/marked-terminal/-/marked-terminal-5.1.1.tgz", - "integrity": "sha512-+cKTOx9P4l7HwINYhzbrBSyzgxO2HaHKGZGuB1orZsMIgXYaJyfidT81VXRdpelW/PcHEWxywscePVgI/oUF6g==", - "requires": { - "ansi-escapes": "^5.0.0", - "cardinal": "^2.1.1", - "chalk": "^5.0.0", - "cli-table3": "^0.6.1", - "node-emoji": "^1.11.0", - "supports-hyperlinks": "^2.2.0" - }, - "dependencies": { - "chalk": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz", - "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==" - } - } - }, - "memory-streams": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/memory-streams/-/memory-streams-0.1.3.tgz", - "integrity": "sha512-qVQ/CjkMyMInPaaRMrwWNDvf6boRZXaT/DbQeMYcCWuXPEBf1v8qChOc9OlEVQp2uOvRXa1Qu30fLmKhY6NipA==", - "requires": { - "readable-stream": "~1.0.2" - } - }, - "memorystream": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", - "integrity": "sha1-htcJCzDORV1j+64S3aUaR93K+bI=" - }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" - }, - "node-emoji": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz", - "integrity": "sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==", - "requires": { - "lodash": "^4.17.21" - } - }, - "nopt": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-2.1.2.tgz", - "integrity": "sha1-bMzZd7gBMqB3MdbozljCyDA8+a8=", - "requires": { - "abbrev": "1" - } - }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", - "requires": { - "path-key": "^2.0.0" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "requires": { - "wrappy": "1" - } - }, - "optimist": { - "version": "0.3.7", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.3.7.tgz", - "integrity": "sha1-yQlBrVnkJzMokjB00s8ufLxuwNk=", - "requires": { - "wordwrap": "~0.0.2" - } - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==" - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==" - }, - "picture-tuber": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/picture-tuber/-/picture-tuber-1.0.2.tgz", - "integrity": "sha512-49/xq+wzbwDeI32aPvwQJldM8pr7dKDRuR76IjztrkmiCkAQDaWFJzkmfVqCHmt/iFoPFhHmI9L0oKhthrTOQw==", - "requires": { - "buffers": "~0.1.1", - "charm": "~0.1.0", - "event-stream": "~0.9.8", - "optimist": "~0.3.4", - "png-js": "~0.1.0", - "x256": "~0.0.1" - } - }, - "png-js": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/png-js/-/png-js-0.1.1.tgz", - "integrity": "sha1-HMfCEjA6yr50Jj7DrHgAlYAkLZM=" - }, - "pump": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz", - "integrity": "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==", - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "redeyed": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/redeyed/-/redeyed-2.1.1.tgz", - "integrity": "sha512-FNpGGo1DycYAdnrKFxCMmKYgo/mILAqtRYbkdQD8Ep/Hk2PQ5+aEAEx+IU713RTDmuBaH0c8P5ZozurNu5ObRQ==", - "requires": { - "esprima": "~4.0.0" - } - }, - "redis": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/redis/-/redis-3.1.2.tgz", - "integrity": "sha512-grn5KoZLr/qrRQVwoSkmzdbw6pwF+/rwODtrOr6vuBRiR/f3rjSTGupbF90Zpqm2oenix8Do6RV7pYEkGwlKkw==", - "requires": { - "denque": "^1.5.0", - "redis-commands": "^1.7.0", - "redis-errors": "^1.2.0", - "redis-parser": "^3.0.0" - } - }, - "redis-commands": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/redis-commands/-/redis-commands-1.7.0.tgz", - "integrity": "sha512-nJWqw3bTFy21hX/CPKHth6sfhZbdiHP6bTawSgQBlKOVRG7EZkfHbbHwQJnrE4vsQf0CMNE+3gJ4Fmm16vdVlQ==" - }, - "redis-errors": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz", - "integrity": "sha1-62LSrbFeTq9GEMBK/hUpOEJQq60=" - }, - "redis-parser": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-3.0.0.tgz", - "integrity": "sha1-tm2CjNyv5rS4pCin3vTGvKwxyLQ=", - "requires": { - "redis-errors": "^1.0.0" - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" - }, - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" - }, - "semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==" - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==" - }, - "signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" - }, - "sorted-array-async": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/sorted-array-async/-/sorted-array-async-0.0.7.tgz", - "integrity": "sha1-kNnWKyb6AxXDu8YjvUc1WbYps0k=", - "requires": { - "es6-promise": "^3.1.2" - } - }, - "sparkline": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/sparkline/-/sparkline-0.1.2.tgz", - "integrity": "sha1-w73kYlKxNU5xDEsgDVSBa9nwejI=", - "requires": { - "here": "0.0.2", - "nopt": "~2.1.2" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - } - } - }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==" - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - }, - "supports-hyperlinks": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", - "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", - "requires": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" - } - }, - "term-canvas": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/term-canvas/-/term-canvas-0.0.5.tgz", - "integrity": "sha1-WXr6wvpjaabxeGC86cX2bW6gypY=" - }, - "type-fest": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", - "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==" - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "requires": { - "isexe": "^2.0.0" - } - }, - "wordwrap": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", - "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=" - }, - "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" - }, - "x256": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/x256/-/x256-0.0.2.tgz", - "integrity": "sha1-ya8Yh296F1gB1WT+cK2egxd4STQ=" - }, - "xml2js": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", - "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", - "requires": { - "sax": ">=0.6.0", - "xmlbuilder": "~11.0.0" - } - }, - "xmlbuilder": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", - "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==" - }, - "y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" - }, - "yargs": { - "version": "17.2.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.2.1.tgz", - "integrity": "sha512-XfR8du6ua4K6uLGm5S6fA+FIJom/MdJcFNVY8geLlp2v8GYbOXD4EB1tPNZsRn4vBzKGMgb5DRZMeWuFc2GO8Q==", - "requires": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - } - }, - "yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==" - } - } -} diff --git a/modules/kalipso/package.json b/modules/kalipso/package.json deleted file mode 100644 index cf87165af..000000000 --- a/modules/kalipso/package.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "name": "kalipso", - "version": "1.0.0", - "description": "Kalipso is a graphical user interface for Slips IPS based on Nodejs.", - "main": "kalipso.js", - "scripts": { - "start": "node kalipso.js" - }, - "author": "Stratosphere IPS", - "license": "GPL-2.0-only", - "dependencies": { - "ansi-colors": "^4.1.1", - "async": "^3.2.0", - "blessed": "^0.1.81", - "blessed-contrib": "^4.10.0", - "chalk": "^4.1.2", - "clipboardy": "^2.3.0", - "fs": "^0.0.1-security", - "redis": "^3.1.2", - "sorted-array-async": "^0.0.7", - "strip-ansi": "^6.0.0", - "yargs": "^17.0.1" - }, - "devDependencies": {}, - "repository": { - "type": "git", - "url": "git+https://github.com/stratosphereips/StratosphereLinuxIPS.git" - }, - "bugs": { - "url": "https://github.com/stratosphereips/StratosphereLinuxIPS/issues" - }, - "homepage": "https://github.com/stratosphereips/StratosphereLinuxIPS#readme" -} - - diff --git a/modules/leak_detector/leak_detector.py b/modules/leak_detector/leak_detector.py index 1a99c84a8..c610387bb 100644 --- a/modules/leak_detector/leak_detector.py +++ b/modules/leak_detector/leak_detector.py @@ -31,7 +31,7 @@ class LeakDetector(IModule): # Name: short name of the module. Do not use spaces - name = "Leak Detector" + name = "leak_detector" description = "Detect leaks of data in the traffic" authors = ["Alya Gomaa"] diff --git a/modules/network_discovery/network_discovery.py b/modules/network_discovery/network_discovery.py index 7931b44a5..12173765c 100644 --- a/modules/network_discovery/network_discovery.py +++ b/modules/network_discovery/network_discovery.py @@ -26,7 +26,7 @@ class NetworkDiscovery(IModule): This should be converted into a module that wakesup alone when a new alert arrives """ - name = "Network Discovery" + name = "network_discovery" description = "Detect Horizonal, Vertical, and DHCP Scans." authors = ["Sebastian Garcia", "Alya Gomaa"] @@ -244,5 +244,5 @@ def main(self): self.check_dhcp_scan(profileid, twid, flow) if msg := self.get_msg("tw_closed"): - profileid_tw: List[str] = msg["data"].split("_") + profileid_tw: List[str] = utils.get_msg_payload(msg).split("_") self.cleanup_cache_dicts(profileid_tw) diff --git a/modules/p2ptrust/__init__.py b/modules/p2p_trust/__init__.py similarity index 100% rename from modules/p2ptrust/__init__.py rename to modules/p2p_trust/__init__.py diff --git a/modules/p2ptrust/data_format.md b/modules/p2p_trust/data_format.md similarity index 96% rename from modules/p2ptrust/data_format.md rename to modules/p2p_trust/data_format.md index 66cddab51..ba0ae9eff 100644 --- a/modules/p2ptrust/data_format.md +++ b/modules/p2p_trust/data_format.md @@ -1,6 +1,6 @@ # Data saved to Slips -Slips database expects a dictionary of data. The data from this module (for a given IP) has the following format: +Slips database expects a dictionary of data. The data from this module (for a given IP) has the following format: ```json { @@ -14,18 +14,18 @@ Slips database expects a dictionary of data. The data from this module (for a gi ``` The `p2p4slips` field in the database will the report from the network. The report will have the IP address that is -reported, the computed score and confidence, and an additional value with score of all the peers that gave the opinion. +reported, the computed score and confidence, and an additional value with score of all the peers that gave the opinion. # Communication between python and go parts of the implementation The core of each peer is implemented in python. The python code collects data, shares this data with other peers (report), asks other peers for data (request) etc. Python code doesn't communicate with other peers directly - it relies on the go part of the node to do that work. The two parts of the node exchange information and instructions using redis -channels. +channels. ## The channel from Slips to Go `p2p_pygo` -Slips sends data to go in json. The Json object has two fields: `message` and `recipient`. +Slips sends data to go in json. The Json object has two fields: `message` and `recipient`. ```json {"message": "ewogICAgImtleV90eXBlIjogImlwIiwKICAgICJrZXkiOiAiMS4yLjMuNDAiLAogICAgImV........jYKfQ==", "recipient": "QmYyQSo1c1Ym7orWxLYvCrM2EmxFTANf8wXmmE7DWjhx5N"} @@ -53,7 +53,7 @@ more reports at the same time. ```json { "message_type": "go_data", - "message_contents": + "message_contents": { "reporter": "abcsakughroiauqrghaui", // the peer that sent the data "report_time": 154900000, // time of receiving the data diff --git a/modules/p2ptrust/p2ptrust.py b/modules/p2p_trust/p2p_trust.py similarity index 95% rename from modules/p2ptrust/p2ptrust.py rename to modules/p2p_trust/p2p_trust.py index 0f2af2907..bdebcaff6 100644 --- a/modules/p2ptrust/p2ptrust.py +++ b/modules/p2p_trust/p2p_trust.py @@ -9,12 +9,13 @@ import json import socket +from slips_files.common.style import green from slips_files.common.parsers.config_parser import ConfigParser from slips_files.common.slips_utils import utils from slips_files.common.abstracts.imodule import IModule -import modules.p2ptrust.trust.base_model as reputation_model -import modules.p2ptrust.utils.utils as p2p_utils -from modules.p2ptrust.utils.go_director import GoDirector +import modules.p2p_trust.trust.base_model as reputation_model +import modules.p2p_trust.utils.utils as p2p_utils +from modules.p2p_trust.utils.go_director import GoDirector from slips_files.core.structures.evidence import ( dict_to_evidence, Evidence, @@ -68,7 +69,7 @@ def validate_slips_data(message_data: str) -> (str, int): class Trust(IModule): - name = "P2P Trust" + name = "p2p_trust" description = "Enables sharing detection data with other Slips instances" authors = ["Dita", "Alya Gomaa"] pigeon_port = 6668 @@ -92,8 +93,8 @@ def init(self, *args, **kwargs): # output dir! so it wont find them and will # generate new keys, and therefore new peerid! # store the keys in slips main dir so they don't change every run - self.p2ptrust_runtime_dir = self.db.get_p2ptrust_dir() - self.sql_db_name = self.db.get_p2ptrust_db_path() + self.p2p_trust_runtime_dir = self.db.get_p2p_trust_dir() + self.sql_db_name = self.db.get_p2p_trust_db_path() self.port = self.get_available_port() self.host = self.get_local_IP() @@ -137,9 +138,11 @@ def subscribe_to_channels(self): def _init_log_files(self): # should be called after reading configs - self.pigeon_logfile_raw = os.path.join(self.output_dir, "p2p.log") - self.p2p_reports_logfile = os.path.join( - self.output_dir, "p2p_reports.log" + self.pigeon_logfile_raw = self.get_module_specific_output_path( + "p2p.log" + ) + self.p2p_reports_logfile = self.get_module_specific_output_path( + "p2p_reports.log" ) if self.create_p2p_logfile: self.setup_pigeon_logfile_rotation() @@ -178,8 +181,7 @@ def _configure(self): self.reputation_model = reputation_model.BaseModel( self.logger, self.trust_db, self.db ) - # print(f"[DEBUGGING] Starting godirector with - # pygo_channel: {self.pygo_channel}") + self.go_director = GoDirector( self.logger, self.trust_db, @@ -191,13 +193,17 @@ def _configure(self): gopy_channel=self.gopy_channel, pygo_channel=self.pygo_channel, p2p_reports_logfile=self.p2p_reports_logfile, + is_slips_started_by_an_update=getattr( + self.args, "is_slips_started_by_an_update", False + ), ) self.pigeon = None if self.start_pigeon: if not shutil.which(self.pigeon_binary): self.print( - f'P2p4slips binary not found in "{self.pigeon_binary}". ' + f"Warning: P2p4slips binary not found in " + f'"{self.pigeon_binary}". ' f"Did you include it in PATH?. Exiting process." ) return @@ -210,10 +216,7 @@ def _configure(self): "-redis-channel-pygo": self.pygo_channel_raw, "-redis-channel-gopy": self.gopy_channel_raw, } - self.print( - f"P2P is listening on {self.host} port {self.port} " - f"(determined by p2p module)" - ) + self.print(f"P2P is listening on {self.host} port {self.port}.") executable = [self.pigeon_binary] + [ item for pair in params.items() for item in pair ] @@ -224,7 +227,7 @@ def _configure(self): outfile = open(os.devnull, "+w") self.pigeon = subprocess.Popen( - executable, cwd=self.p2ptrust_runtime_dir, stdout=outfile + executable, cwd=self.p2p_trust_runtime_dir, stdout=outfile ) def extract_confidence(self, evidence: Evidence) -> Optional[float]: @@ -594,7 +597,7 @@ def process_message_report( self.db.publish("new_blame", data) def shutdown_gracefully(self): - if hasattr(self, "pigeon"): + if hasattr(self, "pigeon") and self.pigeon is not None: self.pigeon.send_signal(signal.SIGINT) if hasattr(self, "trust_db"): self.trust_db.__del__() @@ -646,7 +649,7 @@ def main(self): # give the pigeon time to put the multiaddr in the db time.sleep(2) multiaddr = self.db.get_multiaddr() - self.print(f"You Multiaddress is: {multiaddr}\n") + self.print(f"You Multiaddress is: {green(multiaddr)}\n") self.mutliaddress_printed = True except Exception: diff --git a/modules/p2ptrust/testing/__init__.py b/modules/p2p_trust/testing/__init__.py similarity index 100% rename from modules/p2ptrust/testing/__init__.py rename to modules/p2p_trust/testing/__init__.py diff --git a/modules/p2ptrust/testing/json_data.py b/modules/p2p_trust/testing/json_data.py similarity index 100% rename from modules/p2ptrust/testing/json_data.py rename to modules/p2p_trust/testing/json_data.py diff --git a/modules/p2ptrust/trust/__init__.py b/modules/p2p_trust/trust/__init__.py similarity index 100% rename from modules/p2ptrust/trust/__init__.py rename to modules/p2p_trust/trust/__init__.py diff --git a/modules/p2ptrust/trust/base_model.py b/modules/p2p_trust/trust/base_model.py similarity index 99% rename from modules/p2ptrust/trust/base_model.py rename to modules/p2p_trust/trust/base_model.py index e7c62595d..090dbc4d9 100644 --- a/modules/p2ptrust/trust/base_model.py +++ b/modules/p2p_trust/trust/base_model.py @@ -18,7 +18,7 @@ class BaseModel: doesn't issue any requests to other peers. """ - name = "P2P Base Model" + name = "p2p_base_model" def __init__(self, logger: Output, trustdb, main_slips_db: DBManager): self.trustdb = trustdb diff --git a/modules/p2ptrust/trust/model.py b/modules/p2p_trust/trust/model.py similarity index 90% rename from modules/p2ptrust/trust/model.py rename to modules/p2p_trust/trust/model.py index 7b6ee3b76..905a8451a 100644 --- a/modules/p2ptrust/trust/model.py +++ b/modules/p2p_trust/trust/model.py @@ -1,6 +1,6 @@ # SPDX-FileCopyrightText: 2021 Sebastian Garcia # SPDX-License-Identifier: GPL-2.0-only -from modules.p2ptrust.trust.trustdb import TrustDB +from modules.p2p_trust.trust.trustdb import TrustDB class Model: @@ -10,7 +10,7 @@ class Model: This class defines a method that trust model is expected to have. """ - name = "P2P Model" + name = "p2p_model" def __init__( self, diff --git a/modules/p2ptrust/trust/trustdb.py b/modules/p2p_trust/trust/trustdb.py similarity index 99% rename from modules/p2ptrust/trust/trustdb.py rename to modules/p2p_trust/trust/trustdb.py index 906d6c782..b2f904214 100644 --- a/modules/p2ptrust/trust/trustdb.py +++ b/modules/p2p_trust/trust/trustdb.py @@ -9,7 +9,7 @@ class TrustDB(ISQLite): - name = "P2P Trust DB" + name = "p2p_trust_db" def __init__( self, diff --git a/modules/p2ptrust/utils/__init__.py b/modules/p2p_trust/utils/__init__.py similarity index 100% rename from modules/p2ptrust/utils/__init__.py rename to modules/p2p_trust/utils/__init__.py diff --git a/modules/p2ptrust/utils/go_director.py b/modules/p2p_trust/utils/go_director.py similarity index 97% rename from modules/p2ptrust/utils/go_director.py rename to modules/p2p_trust/utils/go_director.py index 374f5535e..43abc8115 100644 --- a/modules/p2ptrust/utils/go_director.py +++ b/modules/p2p_trust/utils/go_director.py @@ -9,13 +9,13 @@ from slips_files.common.printer import Printer from slips_files.core.output import Output -from modules.p2ptrust.utils.utils import ( +from modules.p2p_trust.utils.utils import ( validate_ip_address, validate_timestamp, get_ip_info_from_slips, send_evaluation_to_go, ) -from modules.p2ptrust.trust.trustdb import TrustDB +from modules.p2p_trust.trust.trustdb import TrustDB from slips_files.common.parsers.config_parser import ConfigParser from slips_files.common.slips_utils import utils from slips_files.core.structures.evidence import ( @@ -30,7 +30,7 @@ class GoDirector: - """Class that deals with requests and reports from the go part of p2ptrust + """Class that deals with requests and reports from the go part of p2p_trust The reports from other peers are processed and inserted into the database directly. Requests from other peers are validated, data is read from the database @@ -38,7 +38,7 @@ class GoDirector: If peer sends invalid data, his reputation is lowered. """ - name = "P2P Go Director" + name = "p2p_go_director" def __init__( self, @@ -52,6 +52,7 @@ def __init__( gopy_channel: str = "p2p_gopy", pygo_channel: str = "p2p_pygo", p2p_reports_logfile: str = "p2p_reports.log", + is_slips_started_by_an_update: bool = False, ): self.printer = Printer(logger, self.name) @@ -67,7 +68,9 @@ def __init__( self.report_func = report_func self.request_func = request_func # clear the logfile - open(p2p_reports_logfile, "w").close() + utils.initialize_logfile( + p2p_reports_logfile, is_slips_started_by_an_update + ) self.reports_logfile = open(p2p_reports_logfile, "a") self.print(f"Storing peer reports in {p2p_reports_logfile}") # TODO: there should be some better mechanism to add new processing @@ -181,7 +184,7 @@ def process_go_data(self, report: dict) -> None: elif message_type == "blame": # TODO SLIPS doesn't getthis kind of msgs at all. all reports are treated as one # self.print("blame is not implemented yet", 0, 2) - # calls process_message_report in p2ptrust.py + # calls process_message_report in p2p_trust.py # which gives the report to evidenceProcess to decide whether to block or not self.report_func(reporter, report_time, data) @@ -288,7 +291,7 @@ def process_message_request( # override_p2p is false by default if self.override_p2p: # print("Overriding p2p") - # calls respond_to_message_request in p2ptrust.py + # calls respond_to_message_request in p2p_trust.py self.request_func(key, reporter) else: # self.print("Not overriding p2p") @@ -361,10 +364,10 @@ def process_message_report( return # after making sure that the data received from peers is valid, - # pass the report to p2ptrust module + # pass the report to p2p_trust module # to decide what to do with it if self.override_p2p: - # calls process_message_report in p2ptrust.py + # calls process_message_report in p2p_trust.py self.report_func(reporter, report_time, data) return diff --git a/modules/p2ptrust/utils/utils.py b/modules/p2p_trust/utils/utils.py similarity index 100% rename from modules/p2ptrust/utils/utils.py rename to modules/p2p_trust/utils/utils.py diff --git a/modules/p2ptrust/testing/test_p2p.py b/modules/p2ptrust/testing/test_p2p.py deleted file mode 100644 index d8d6a686f..000000000 --- a/modules/p2ptrust/testing/test_p2p.py +++ /dev/null @@ -1,317 +0,0 @@ -import configparser -import time -import modules.p2ptrust.testing.json_data as json_data -from modules.p2ptrust.utils.utils import save_ip_report_to_db -from modules.p2ptrust.p2ptrust import Trust -from modules.p2ptrust.trust.trustdb import TrustDB -from multiprocessing import Queue -from outputProcess import OutputProcess -import json - -# TODO -# base_dir = "/home/dita/ownCloud/stratosphere/SLIPS/modules/p2ptrust/testing/" -# data_dir = base_dir + "data/experiments-" + str(time.time()) + "/" -# os.mkdir(data_dir) - - -def init_tests(pigeon_port=6669): - config = get_default_config() - output_process_queue = Queue() - output_process_thread = OutputProcess(output_process_queue, 1, 1, config) - output_process_thread.start() - - # Start the DB - __database__.start() - __database__.set_output_queue(output_process_queue) - module_process = Trust( - output_process_queue, - config, - data_dir, - rename_with_port=False, - pigeon_port=pigeon_port, - rename_sql_db_file=False, - ) - - module_process.start() - - time.sleep(1) - print("Initialization complete") - - return module_process - - -def set_ip_data(ip: str, data: dict): - # TODO: remove the first call after database is fixed - __database__.set_new_ip(ip) - __database__.setInfoForIPs(ip, data) - - -def test_slips_integration(): - print("Add new peer on IP 192.168.0.4") - # add a new peer abcsakughroiauqrghaui on IP 192.168.0.4 - __database__.publish( - "p2p_gopy", - '{"message_type":"peer_update","message_contents":{"peerid":"abcsakughroiauqrghaui","ip":"192.168.0.4","reliability":1,"timestamp":0}}', - ) - time.sleep(0.5) - print() - - print("Set evaluation for IP 192.168.0.4") - # module_process.sqlite_db.insert_go_score("abcsakughroiauqrghaui", 1, 0) - # module_process.sqlite_db.insert_go_ip_pairing("abcsakughroiauqrghaui", "192.168.0.4", 1) #B - set_ip_data("192.168.0.4", {"score": -0.1, "confidence": 1}) - time.sleep(0.5) - print() - - print("Add a new peer on IP 192.168.0.5") - # add a new peer anotherreporterspeerid on IP 192.168.0.5 - __database__.publish( - "p2p_gopy", - '{"message_type":"peer_update","message_contents":{"peerid":"anotherreporterspeerid","ip":"192.168.0.5","timestamp":0}}', - ) - time.sleep(0.5) - print() - __database__.publish( - "p2p_gopy", - '{"message_type":"peer_update","message_contents":{"peerid":"anotherreporterspeerid","reliability": 0.8,"timestamp":0}}', - ) - time.sleep(0.5) - print() - - print("Set evaluation for IP 192.168.0.5") - # module_process.sqlite_db.insert_go_score("anotherreporterspeerid", 0.8, 0) - # module_process.sqlite_db.insert_go_ip_pairing("anotherreporterspeerid", "192.168.0.5", 1) #C - set_ip_data("192.168.0.5", {"score": 0.1, "confidence": 1}) - time.sleep(0.5) - print() - - # network asks for data about 1.2.3.4 - print("Network asks about IP 1.2.3.4 (we know nothing about it)") - data = json_data.ok_request - __database__.publish( - "p2p_gopy", '{"message_type":"go_data","message_contents":%s}' % data - ) - time.sleep(0.5) - print() - - # slips makes some detections - print("Slips makes a detection of IP 1.2.3.4") - set_ip_data("1.2.3.4", {"score": 0.3, "confidence": 1}) - time.sleep(0.5) - print() - - print("Slips makes a detection of IP 1.2.3.6") - set_ip_data("1.2.3.6", {"score": -1, "confidence": 0.7}) - time.sleep(0.5) - time.sleep(1) - print() - - print("Network shares detections about IP 1.2.3.40 and 1.2.3.5") - # network shares some detections - # {"key_type": "ip", "key": "1.2.3.40", "evaluation_type": "score_confidence", "evaluation": { "score": 0.9, "confidence": 0.6 }} - # {"key_type": "ip", "key": "1.2.3.5", "evaluation_type": "score_confidence", "evaluation": { "score": 0.9, "confidence": 0.7 }} - data = json_data.two_correctA - published_data = '{"message_type":"go_data","message_contents":%s}' % data - __database__.publish("p2p_gopy", published_data) - data = json_data.two_correctB - published_data = '{"message_type":"go_data","message_contents":%s}' % data - __database__.publish("p2p_gopy", published_data) - time.sleep(1) - print() - - print("Network shares empty detection about IP 1.2.3.7") - data = json_data.ok_empty_report - __database__.publish( - "p2p_gopy", '{"message_type":"go_data","message_contents":%s}' % data - ) - time.sleep(1) - print() - - print("Slips asks about data for 1.2.3.5") - # slips asks for data about 1.2.3.5 - data_to_send = { - "ip": "tst", - "profileid": "profileid_192.168.1.1", - "twid": "timewindow1", - "proto": "TCP", - "ip_state": "dstip", - "stime": time.time(), - "uid": "123", - "cache_age": 1000, - } - data_to_send = json.dumps(data_to_send) - __database__.publish("p2p_data_request", data_to_send) - time.sleep(1) - print() - - # network asks for data about 1.2.3.4 - print("Network asks about IP 1.2.3.4 (we know something now)") - data = json_data.ok_request - __database__.publish( - "p2p_gopy", '{"message_type":"go_data","message_contents":%s}' % data - ) - time.sleep(1) - print() - - # shutdown - __database__.publish("p2p_data_request", "stop_process") - print() - - -def test_ip_info_changed(): - # TODO: wait until __database__.setInfoForIPs is fixed and then test if my module reacts correctly - print( - "Slips makes 5 repeating detections, but module is stupid and shares them all" - ) - set_ip_data("1.2.3.6", {"score": 0.71, "confidence": 0.7}) - set_ip_data("1.2.3.6", {"score": 0.7, "confidence": 0.7}) - set_ip_data("1.2.3.6", {"score": 0.71, "confidence": 0.7}) - set_ip_data("1.2.3.6", {"score": 0.7, "confidence": 0.7}) - set_ip_data("1.2.3.6", {"score": 0.71, "confidence": 0.7}) - time.sleep(1) - - -def test_ip_data_save_to_redis(): - print("Data in slips for ip 1.2.3.4") - print(__database__.get_ip_info("1.2.3.4")) - - print("Update data") - save_ip_report_to_db("1.2.3.4", 1, 0.4, 0.4) - - print("Data in slips for ip 1.2.3.4") - print(__database__.get_ip_info("1.2.3.4")) - - -def test_inputs(): - for test_case_name, test_case in json_data.__dict__.items(): - if test_case_name.startswith("_"): - continue - print() - print("#########################") - print("Running test case:", test_case_name) - print("-------------------------") - __database__.publish("p2p_gopy", f"go_data {test_case}") - # the sleep is not needed, but it makes the log more readable - time.sleep(1) - - print("Tests done.") - - -def get_default_config(): - cfg = configparser.ConfigParser() - cfg.read_file(open("slips.yaml")) - return cfg - - -def make_data(): - # the data is a list of reports from multiple peers. Each report contains information about the remote peer (his IP - # and his credibility), and the data the peer sent. From slips, we know that the data sent contains the IP address - # the peer is reporting (attacker), the score the peer assigned to that ip (how malicious does he find him) and the - # confidence he has in his score evaluation. - pass - - -def slips_listener_test(): - """ - A function to test if the retry queue is working as intended. Needs human interaction (disable network when asked) - Test overview: - - check ip A (will be cached successfully) - - disable network - - check ips B and C (they should be queued) - - check ip from the same network as A (this should load from cache without errors, but not trigger retrying) - - enable network - - check ip from the same network as B (this will run and be cached, and trigger retrying. While retrying is in - progress, it should check ip B and return cached result and then run a new query for C) - :return: None - """ - print("Running slips listener test") - - # invalid command - __database__.publish("p2p_gopy", "foooooooooo") - __database__.publish("p2p_gopy", "") - - # invalid command with parameters - __database__.publish("p2p_gopy", "foooooooooo bar 3") - - # valid command, no parameters - __database__.publish("p2p_gopy", "UPDATE") - - # valid update - __database__.publish("p2p_gopy", "UPDATE ipaddress 1 1") - __database__.publish("p2p_gopy", "UPDATE ipaddress 1.999999999999999 3") - - # update with unparsable parameters - __database__.publish("p2p_gopy", "UPDATE ipaddress 1 five") - __database__.publish("p2p_gopy", "UPDATE ipaddress 3") - - data = make_data() - __database__.publish("p2p_gopy", f"GO_DATA {data}") - - # stop instruction - __database__.publish("p2p_gopy", "stop_process") - - -def test_handle_slips_update(): - print("Slips asks about data for 1.2.3.5") - # slips asks for data about 1.2.3.5 and cache age 1000 - data_to_send = { - "ip": "tst", - "profileid": "profileid_192.168.1.1", - "twid": "timewindow1", - "proto": "TCP", - "ip_state": "dstip", - "stime": time.time(), - "uid": "123", - "cache_age": 1000, - } - data_to_send = json.dumps(data_to_send) - __database__.publish("p2p_data_request", data_to_send) - - time.sleep(1) - - -def test_evaluation_error(): - __database__.publish( - "p2p_gopy", f"go_data {json_data.wrong_message_eval_structure}" - ) - # __database__.publish("p2p_gopy", "go_data " + json_data.wrong_message_type) - - -def test_pigeon(): - # one pigeon is already running at port 6669, we start a second one on 6670 - init_tests(6670) - - # one of the peers makes a detection about IP 1.2.3.4 - # (both peers can read the same data from db, but only one is notified about it, so the other doesn't check it) - __database__.r.hset( - "IPsInfo", "1.2.3.4", '{"score":0.5, "confidence":0.8}' - ) - __database__.publish("ip_info_change6669", "1.2.3.4") - - # peer 6669 should read the database, then notify the other peer. - # The other peer should save the data in the reports table - - -def test_trustdb(): - trustdb = TrustDB(f"{data_dir}trustdb.db6660", None) - print(trustdb.get_opinion_on_ip("1.1.1.3")) - - -if __name__ == "__main__": - t = time.time() - # test_trustdb() - test_pigeon() - - # init_tests() - - # test_evaluation_error() - - # test_ip_info_changed() - # test_inputs() - # test_slips_integration() - # test_ip_data_save_to_redis() - # test_handle_slips_update() - # test_pigeon() - - print(time.time() - t) - time.sleep(10000000) diff --git a/modules/update_manager/__init__.py b/modules/risk_iq/__init__.py similarity index 100% rename from modules/update_manager/__init__.py rename to modules/risk_iq/__init__.py diff --git a/modules/riskiq/riskiq.py b/modules/risk_iq/risk_iq.py similarity index 98% rename from modules/riskiq/riskiq.py rename to modules/risk_iq/risk_iq.py index 4e4cf1532..7f8f125a1 100644 --- a/modules/riskiq/riskiq.py +++ b/modules/risk_iq/risk_iq.py @@ -12,7 +12,7 @@ class RiskIQ(IModule): # Name: short name of the module. Do not use spaces - name = "Risk IQ" + name = "risk_iq" description = "Module to get passive DNS info about IPs from RiskIQ" authors = ["Alya Gomaa"] @@ -93,7 +93,7 @@ def pre_main(self): def main(self): if msg := self.get_msg("new_ip"): - ip = msg["data"] + ip = utils.get_msg_payload(msg) if utils.is_ignored_ip(ip): # return here means keep looping return diff --git a/modules/rnn_cc_detection/rnn_cc_detection.py b/modules/rnn_cc_detection/rnn_cc_detection.py index d4d16929a..b5bece382 100644 --- a/modules/rnn_cc_detection/rnn_cc_detection.py +++ b/modules/rnn_cc_detection/rnn_cc_detection.py @@ -33,7 +33,7 @@ class CCDetection(IModule): # Name: short name of the module. Do not use spaces - name = "RNN C&C Detection" + name = "rnn_cc_detection" description = "Detect C&C channels based on behavioral letters" authors = ["Sebastian Garcia", "Kamila Babayeva", "Ondrej Lukas"] @@ -245,7 +245,7 @@ def handle_new_letters(self, msg: Dict): def handle_tw_closed(self, msg: Dict): """handles msgs from the tw_closed channel""" - profileid_tw = msg["data"].split("_") + profileid_tw = utils.get_msg_payload(msg).split("_") profileid = f"{profileid_tw[0]}_{profileid_tw[1]}" twid = profileid_tw[-1] self.letters_exporter.export(profileid, twid) diff --git a/modules/template/template.py b/modules/template/template.py index 43115c7f7..97c26f3a3 100644 --- a/modules/template/template.py +++ b/modules/template/template.py @@ -20,7 +20,7 @@ class Template(IModule): # Name: short name of the module. Do not use spaces - name = "Template" + name = "template" description = "Template module" authors = ["Template Author"] diff --git a/modules/threat_intelligence/circl_lu.py b/modules/threat_intelligence/circl_lu.py index 4b80d3891..0635f3683 100644 --- a/modules/threat_intelligence/circl_lu.py +++ b/modules/threat_intelligence/circl_lu.py @@ -6,7 +6,7 @@ class Circllu: - name = "Circl.lu" + name = "circl_lu" description = "Circl.lu lookups of IPs" authors = ["Alya Gomaa"] diff --git a/modules/threat_intelligence/spamhaus.py b/modules/threat_intelligence/spamhaus.py index 11e6e3570..296665d9b 100644 --- a/modules/threat_intelligence/spamhaus.py +++ b/modules/threat_intelligence/spamhaus.py @@ -12,7 +12,7 @@ class Spamhaus: - name = "Spamhaus" + name = "spamhaus" description = "Spamhaus lookups of IPs" authors = ["Alya Gomaa"] diff --git a/modules/threat_intelligence/threat_intelligence.py b/modules/threat_intelligence/threat_intelligence.py index 007442f2f..f824f67a0 100644 --- a/modules/threat_intelligence/threat_intelligence.py +++ b/modules/threat_intelligence/threat_intelligence.py @@ -37,7 +37,7 @@ class ThreatIntel(IModule, URLhaus, Spamhaus): - name = "Threat Intelligence" + name = "threat_intelligence" description = ( "Check if the source IP or destination IP" " are in a malicious list of IPs" @@ -1891,7 +1891,7 @@ def pre_main(self): utils.drop_root_privs_permanently() # Load the local Threat Intelligence files that are # stored in the local folder self.path_to_local_ti_files - # The remote files are being loaded by the update_manager + # The remote files are being loaded by the feeds_update_manager local_files = ( "own_malicious_iocs.csv", "own_malicious_JA3.csv", diff --git a/modules/threat_intelligence/urlhaus.py b/modules/threat_intelligence/urlhaus.py index 31a12b2b6..893b331a1 100644 --- a/modules/threat_intelligence/urlhaus.py +++ b/modules/threat_intelligence/urlhaus.py @@ -20,7 +20,7 @@ class URLhaus: - name = "URLhaus" + name = "urlhaus" description = "URLhaus lookups of URLs and hashes" authors = ["Alya Gomaa"] diff --git a/modules/timeline/timeline.py b/modules/timeline/timeline.py index 210e44c1d..ed7dcca62 100644 --- a/modules/timeline/timeline.py +++ b/modules/timeline/timeline.py @@ -17,9 +17,9 @@ class Timeline(IModule): # Name: short name of the module. Do not use spaces - name = "Timeline" + name = "timeline" description = ( - "Creates kalipso timeline of what happened in the" + "Creates a timeline of what happened in the" " network based on flows and available data" ) authors = ["Sebastian Garcia", "Alya Gomaa"] diff --git a/modules/virustotal/virustotal.py b/modules/virustotal/virustotal.py index 794874863..8b7a539c5 100644 --- a/modules/virustotal/virustotal.py +++ b/modules/virustotal/virustotal.py @@ -17,7 +17,7 @@ class VT(IModule): - name = "Virustotal" + name = "virustotal" description = "IP, domain and file hash lookup on Virustotal" authors = [ "Dita Hollmannova", diff --git a/package.json b/package.json deleted file mode 100644 index 83fbc5b11..000000000 --- a/package.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "name": "kalipso", - "version": "1.0.0", - "description": "Kalipso is a graphical user interface based on Nodejs. To create a colorful interface in the command-line, Kalipso uses two javascript libraries: blessed and blessed-contrib.", - "main": "kalipso.js", - "scripts": { - "start": "node kalipso.js" - }, - "author": "Stratosphere IPS", - "license": "GPL-2.0-only", - "dependencies": { - "ansi-colors": "^4.1.1", - "async": "^3.2.0", - "blessed": "^0.1.81", - "blessed-contrib": "^4.10.0", - "chalk": "^4.1.2", - "clipboardy": "^2.3.0", - "fs": "^0.0.1-security", - "redis": "^3.1.2", - "sorted-array-async": "^0.0.7", - "strip-ansi": "^6.0.0", - "yargs": "^17.0.1" - }, - "devDependencies": {}, - "repository": { - "type": "git", - "url": "git+https://github.com/stratosphereips/StratosphereLinuxIPS.git" - }, - "bugs": { - "url": "https://github.com/stratosphereips/StratosphereLinuxIPS/issues" - }, - "homepage": "https://github.com/stratosphereips/StratosphereLinuxIPS#readme" -} \ No newline at end of file diff --git a/slips/daemon.py b/slips/daemon.py index 659d983ff..24fccd3ad 100644 --- a/slips/daemon.py +++ b/slips/daemon.py @@ -2,7 +2,8 @@ # SPDX-License-Identifier: GPL-2.0-only import os import sys -from signal import SIGTERM +import time +from signal import SIGKILL, SIGTERM from typing import Tuple, Optional from exclusiveprocess import ( Lock, @@ -16,7 +17,7 @@ class Daemon: description = "This module runs when slips is in daemonized mode" - name = "Daemon" + name = "daemon" def __init__(self, slips): # to use read_configurations defined in Main @@ -42,6 +43,28 @@ def read_pidfile(self) -> Optional[int]: except (IOError, FileNotFoundError): return None + def is_pid_running(self, pid: Optional[int] = None) -> bool: + """ + Check whether a daemon PID is still running. + + Parameters: + pid: PID to validate. Uses the current daemon PID when omitted. + + Returns: + True when the PID exists, otherwise False. + """ + pid = self.pid if pid is None else pid + if pid is None: + return False + + try: + os.kill(int(pid), 0) + except (ProcessLookupError, TypeError, ValueError): + return False + except PermissionError: + return True + return True + def print(self, text, **kwargs): """Prints output to logsfile specified in slips.yaml""" with open(self.logsfile, "a") as f: @@ -49,6 +72,8 @@ def print(self, text, **kwargs): def create_std_streams(self): """Create standard steam files and dirs and clear them""" + if self.slips.args.is_slips_started_by_an_update: + return std_streams = [self.stderr, self.stdout, self.logsfile] for file in std_streams: @@ -73,7 +98,7 @@ def prepare_std_streams(self, output_dir): def read_configuration(self): conf = ConfigParser() - self.logsfile = conf.logsfile() + self.logsfile = conf.logs_file() self.stdout = conf.stdout() self.stderr = conf.stderr() # we don't use it anyway @@ -203,18 +228,23 @@ def start(self): try: with Lock(name=self.daemon_start_lock): if self.pid is not None: - to_print = ( - f"pidfile {self.pidfile} already exists. " - f"Daemon already running?" - ) - # to cli and to log file - self.print(to_print) - print(to_print) - return + if not self.is_pid_running(): + self.delete_pidfile() + self.pid = None + else: + to_print = ( + f"pidfile {self.pidfile} already exists. " + f"Daemon already running?" + ) + # to cli and to log file + self.print(to_print) + print(to_print) + return self.print("Daemon starting...") # Starts the daemon self.daemonize() + self.slips.pid = os.getpid() # any code run after daemonizing will be run inside # the daemon and have the same PID as slips.py @@ -273,10 +303,16 @@ def _is_running(self) -> bool: returns true if the daemon lock is released and the daemon pidfile is deleted """ + if not self.pid: + return False + + if not self.is_pid_running(): + self.delete_pidfile() + return False + try: with Lock(name=self.daemon_start_lock): - if not self.pid: - return False + pass except CannotAcquireLock: # another instance of slips daemon is running pass @@ -336,9 +372,47 @@ def stop(self): self.slips.db = self.db self.slips.proc_man.slips_logfile = self.logsfile + deadline = time.time() + 15 + while time.time() < deadline: + remaining_children = [ + pid + for module_name, pid in self.db.get_pids().items() + if "thread" not in module_name.lower() + and self.is_pid_running(pid) + ] + if ( + not self.is_pid_running(self.pid) + and not remaining_children + ): + break + time.sleep(1) + + remaining_children = [ + pid + for module_name, pid in self.db.get_pids().items() + if "thread" not in module_name.lower() + and self.is_pid_running(pid) + ] + if remaining_children: + self.slips.proc_man.kill_daemon_children() + + if self.is_pid_running(self.pid): + try: + os.kill(int(self.pid), SIGKILL) + except ProcessLookupError: + pass + + if os.path.exists(self.pidfile): + self.delete_pidfile() + + stopped = not self.is_pid_running(self.pid) and not any( + self.is_pid_running(pid) + for module_name, pid in self.db.get_pids().items() + if "thread" not in module_name.lower() + ) return { - "stopped": True, - "error": None, + "stopped": stopped, + "error": None if stopped else "Daemon shutdown timed out.", } except CannotAcquireLock: # another instance of slips daemon is running diff --git a/slips/main.py b/slips/main.py index 4bd237695..de0697d59 100644 --- a/slips/main.py +++ b/slips/main.py @@ -39,8 +39,8 @@ class Main: def __init__(self, testing=False): - self.name = "Main" - self.alerts_default_path = "output/" + self.name = "main" + self.parent_output_dir = "output/" self.mode = "interactive" self.sigterm_received = False # objects to manage various functionality @@ -73,12 +73,17 @@ def __init__(self, testing=False): self.input_information, self.line_type, ) = self.checker.get_input_type() + self.input_information = os.path.normpath( + self.input_information + ) + self.input_information = self.input_information.replace( + ",", "_" + ) + # If we need zeek (bro), test if we can run it. self.check_zeek_or_bro() self.prepare_output_dir() self.redis_man.start_redis_cache_if_not_running() - # this is the zeek dir slips will be using - self.prepare_zeek_output_dir() self.twid_width = self.conf.get_tw_width() # should be initialised after self.input_type is set self.host_ip_man = HostIPManager(self) @@ -103,15 +108,6 @@ def check_zeek_or_bro(self): return self.zeek_bro - def prepare_zeek_output_dir(self): - from pathlib import Path - - without_ext = Path(self.input_information).stem - if self.conf.store_zeek_files_in_the_output_dir(): - self.zeek_dir = os.path.join(self.args.output, "zeek_files") - else: - self.zeek_dir = f"zeek_files_{without_ext}/" - def terminate_slips(self): """ Shutdown slips, is called when stopping slips before @@ -162,14 +158,44 @@ def store_zeek_dir_copy(self): store_a_copy_of_zeek_files = self.conf.store_a_copy_of_zeek_files() was_running_zeek = self.was_running_zeek() if store_a_copy_of_zeek_files and was_running_zeek: + zeek_dir = self.db.get_zeek_output_dir() + if not isinstance(zeek_dir, str) or not zeek_dir: + return # this is where the copy will be stored dest_zeek_dir = os.path.join(self.args.output, "zeek_files") - copy_tree(self.zeek_dir, dest_zeek_dir) + copy_tree(zeek_dir, dest_zeek_dir) print(f"[Main] Stored a copy of zeek files to {dest_zeek_dir}") def delete_zeek_files(self): - if self.conf.delete_zeek_files(): - shutil.rmtree(self.zeek_dir) + zeek_dir = self.db.get_zeek_output_dir() + if ( + self.conf.delete_zeek_files() + and isinstance(zeek_dir, str) + and zeek_dir + ): + shutil.rmtree(zeek_dir) + + def del_file_or_dir(self, file): + """deletes a file or dir inside the output dir""" + file_path = os.path.join(self.args.output, file) + with contextlib.suppress(Exception): + if os.path.isfile(file_path): + os.remove(file_path) + elif os.path.isdir(file_path): + shutil.rmtree(file_path) + + def construct_output_dir_name(self) -> str: + dir_name = os.path.join( + self.parent_output_dir, + os.path.basename( + self.input_information + ), # get pcap name from path + ) + + # add timestamp to avoid conflicts e.g wlp3s0_2022-03-1_03:55 + ts = utils.convert_ts_format(datetime.now(), "%Y-%m-%d_%H:%M:%S") + dir_name += f"_{ts}/" + return dir_name def prepare_output_dir(self): """ @@ -178,47 +204,33 @@ def prepare_output_dir(self): Log dirs are stored in output/_%Y-%m-%d_%H:%M:%S @return: None """ - # default output/ - if "-o" in sys.argv: - # -o is given - # delete all old files in the output dir - if os.path.exists(self.args.output): - for file in os.listdir(self.args.output): - # in integration tests, slips redirects its - # output to slips_output.txt, - # don't delete that file - if self.args.testing and "slips_output.txt" in file: - continue - - file_path = os.path.join(self.args.output, file) - with contextlib.suppress(Exception): - if os.path.isfile(file_path): - os.remove(file_path) - elif os.path.isdir(file_path): - shutil.rmtree(file_path) - else: - os.makedirs(self.args.output) + if self.args.is_slips_started_by_an_update: + # we should append to existing files in the output dir, + # and never overwrite them. + return + + if not self.args.output: + # the user didnt give slips an output dir to use, construct one + self.args.output = self.construct_output_dir_name() + os.makedirs(self.args.output) + os.chmod(self.args.output, 0o777) return - # self.args.output is the same as self.alerts_default_path - self.input_information = os.path.normpath(self.input_information) - self.input_information = self.input_information.replace(",", "_") - # now that slips can run several instances, - # each created dir will be named after the instance - # that created it - # it should be output/wlp3s0 - self.args.output = os.path.join( - self.alerts_default_path, - os.path.basename( - self.input_information - ), # get pcap name from path - ) - # add timestamp to avoid conflicts wlp3s0_2022-03-1_03:55 - ts = utils.convert_ts_format(datetime.now(), "%Y-%m-%d_%H:%M:%S") - self.args.output += f"_{ts}/" + # -o is given + # delete all old files in the output dir + if os.path.exists(self.args.output): + for file in os.listdir(self.args.output): + # in integration tests, slips redirects its + # output to slips_output.txt, + # don't delete that file + if self.args.testing and "slips_output.txt" in file: + continue + self.del_file_or_dir(file) + + else: + os.makedirs(self.args.output) - os.makedirs(self.args.output) os.chmod(self.args.output, 0o777) def set_mode(self, mode, daemon=""): @@ -519,6 +531,7 @@ def start(self): self.print_version() print("https://stratosphereips.org") print("-" * 27) + self.setup_print_levels() stderr: str = self.get_slips_error_file() slips_logfile: str = self.get_slips_logfile() @@ -528,10 +541,22 @@ def start(self): stderr, slips_logfile ) self.printer = Printer(self.logger, self.name) + self.print(f"Storing Slips logs in {self.args.output}") + self.redis_port: int = self.redis_man.get_redis_port() - # dont start the redis server if it's already started - start_redis_server = not utils.is_port_in_use(self.redis_port) + if self.args.is_slips_started_by_an_update: + # -u means slips is started by slips after it auto-updated, + # the redis server should already be up, this slips should + # just connect to it + start_redis_server = False + self.print( + f"Slips is done auto updating. Currently running " + f"version: {green(utils.get_current_version())}" + ) + else: + # dont start the redis server if it's already started + start_redis_server = not utils.is_port_in_use(self.redis_port) try: self.db = DBManager( @@ -541,6 +566,10 @@ def start(self): self.conf, int(self.pid), start_redis_server=start_redis_server, + # if auto update is enabled, slips starts itself with + # -u, and continues using the same db as the old + # version without overwriting the keys there + flush_db=not self.args.is_slips_started_by_an_update, ) except RuntimeError as e: @@ -576,6 +605,8 @@ def start(self): } ) + self.update_man = self.proc_man.start_slips_update_manager() + # this func should be called as soon as we start the db, # before evdience proc starts. # to be able to use the host IP as analyzer IP in alerts.json @@ -588,9 +619,7 @@ def start(self): 0, ) self.print( - f'Started {green("Main")} process ' - f"[PID" - f" {green(self.pid)}]", + f'Started {green("Main")} process [PID {green(self.pid)}]', 1, 0, ) @@ -660,7 +689,7 @@ def sig_handler(sig, frame): self.print("SIGTERM received, shutting down slips.") self.print( "SIGTERM received, likely due to " - "out of memory errors. Slips is stopping " + "OOM kill. Slips is stopping " "without completing the analysis.", 0, 1, @@ -678,7 +707,6 @@ def sig_handler(sig, frame): self.c1 = self.db.subscribe("control_channel") self.metadata_man.add_metadata_if_enabled() - self.proc_man.start_timewindow_updater() self.input_process = self.proc_man.start_input_process() self.db.store_pid("main", int(self.pid)) @@ -728,6 +756,8 @@ def sig_handler(sig, frame): ) self.host_ip_man.update_host_ip(host_ips, modified_profiles) + if self.update_man.check_for_update_every_1_day(): + self.update_man.update_slips() except KeyboardInterrupt: # the EINTR error code happens if a signal occurred while diff --git a/slips_files/common/abstracts/iasync_module.py b/slips_files/common/abstracts/iasync_module.py index e41f3f6b4..46df07c58 100644 --- a/slips_files/common/abstracts/iasync_module.py +++ b/slips_files/common/abstracts/iasync_module.py @@ -15,11 +15,11 @@ class AsyncModule(IModule): An abstract class for asynchronous slips modules """ - name = "AsyncModule" + name = "iasync_module" def __init__(self, *args, **kwargs): IModule.__init__(self, *args, **kwargs) - # list of async functions to await before flowalerts shuts down + # list of async functions to await before flow_alerts shuts down self.tasks: List[Task] = [] def init(self, **kwargs): ... diff --git a/slips_files/common/abstracts/icore.py b/slips_files/common/abstracts/icore.py index fc13588e6..0b2486198 100644 --- a/slips_files/common/abstracts/icore.py +++ b/slips_files/common/abstracts/icore.py @@ -7,7 +7,7 @@ from slips_files.common.abstracts.imodule import IModule # in seconds -FIVE_MINS = 300 +ONE_MIN = 60 class ICore(IModule, Process): @@ -32,21 +32,22 @@ def __init__(self, *args, **kwargs): # used to keep track of the FPs of this module now = time.monotonic() self.last_fps_check_time = now - # 300s = 5 mins - self.next_fps_check_time = now + FIVE_MINS + self.next_fps_check_time = now + ONE_MIN def pre_main(self): ... def store_flows_read_per_second(self): """ - updates the db about the flows read per second + updates the db about the flows read per second. + this func estimates the flows processed per second by observing flows + over 1 min span. """ if not hasattr(self, "next_fps_check_time"): # Defensive init for cases where ICore.__init__ wasn't invoked. now = time.monotonic() self.last_flows_count = getattr(self, "last_flows_count", 0) self.last_fps_check_time = now - self.next_fps_check_time = now + FIVE_MINS + self.next_fps_check_time = now + ONE_MIN now = time.monotonic() if now < self.next_fps_check_time: @@ -59,11 +60,10 @@ def store_flows_read_per_second(self): time_delta = now - self.last_fps_check_time flows_per_sec = int(flows_delta / time_delta) - - self.db.store_module_flows_per_second(self.name, flows_per_sec) + self.db.store_core_module_flows_per_second(self.name, flows_per_sec) self.last_fps_check_time = now - self.next_fps_check_time = now + FIVE_MINS + self.next_fps_check_time = now + ONE_MIN self.last_flows_count = flows_now def run(self): diff --git a/slips_files/common/abstracts/iexporter.py b/slips_files/common/abstracts/iexporter.py index 673c918d0..dcb2457ac 100644 --- a/slips_files/common/abstracts/iexporter.py +++ b/slips_files/common/abstracts/iexporter.py @@ -5,8 +5,13 @@ warden etc. """ +import os + from abc import ABC, abstractmethod +from slips_files.common.output_paths import ( + get_databases_dir_path_inside_output_dir, +) from slips_files.common.printer import Printer from slips_files.core.database.database_manager import DBManager from slips_files.core.output import Output @@ -21,6 +26,30 @@ def __init__(self, logger: Output, db: DBManager, **kwargs): def print(self, *args, **kwargs): return self.printer.print(*args, **kwargs) + def get_output_path( + self, *relative_path_parts: str, module_name: str | None = None + ) -> str: + output_dir = ( + getattr(self.db, "output_dir", None) or self.db.get_output_dir() + ) + if isinstance(output_dir, bytes): + output_dir = output_dir.decode("utf-8") + if not output_dir: + output_dir = "." + module_output_dir = os.path.join(output_dir, module_name or self.name) + os.makedirs(module_output_dir, exist_ok=True) + return os.path.join(module_output_dir, *relative_path_parts) + + def get_database_path(self, filename: str) -> str: + output_dir = ( + getattr(self.db, "output_dir", None) or self.db.get_output_dir() + ) + if isinstance(output_dir, bytes): + output_dir = output_dir.decode("utf-8") + if not output_dir: + output_dir = "." + return get_databases_dir_path_inside_output_dir(output_dir, filename) + @property @abstractmethod def name(self) -> str: diff --git a/slips_files/common/abstracts/iflowalerts_analyzer.py b/slips_files/common/abstracts/iflowalerts_analyzer.py index f644357de..d48f2a960 100644 --- a/slips_files/common/abstracts/iflowalerts_analyzer.py +++ b/slips_files/common/abstracts/iflowalerts_analyzer.py @@ -2,16 +2,16 @@ # SPDX-License-Identifier: GPL-2.0-only from abc import ABC, abstractmethod -from modules.flowalerts.set_evidence import SetEvidenceHelper +from modules.flow_alerts.set_evidence import SetEvidenceHelper from slips_files.core.database.database_manager import DBManager class IFlowalertsAnalyzer(ABC): """ keep in mind that every class that implements this interface MUST be - registered in flowalerts.py + registered in flow_alerts.py must by started, controlled, and terminated by it. msgs from the - appropriate channels should be passed to that class using flowalerts too. + appropriate channels should be passed to that class using flow_alerts too. """ def __init__(self, db: DBManager, flowalerts=None, **kwargs): @@ -37,7 +37,7 @@ def read_configuration(self): def init(self): """ the goal of this is to have one common __init__() above for all - flowalerts helpers, which is the one in this file, and a different + flow_alerts helpers, which is the one in this file, and a different init() per helper this init will have access to all keyword args passes when initializing the module diff --git a/slips_files/common/abstracts/imodule.py b/slips_files/common/abstracts/imodule.py index 63dc1d322..34b4502cd 100644 --- a/slips_files/common/abstracts/imodule.py +++ b/slips_files/common/abstracts/imodule.py @@ -1,5 +1,7 @@ # SPDX-FileCopyrightText: 2021 Sebastian Garcia # SPDX-License-Identifier: GPL-2.0-only +import json +import os import sys import traceback import warnings @@ -11,6 +13,7 @@ Optional, ) from slips_files.common.printer import Printer +from slips_files.common.output_paths import get_this_db_path_inside_output_dir from slips_files.core.helpers.bloom_filters_manager import BFManager from slips_files.core.output import Output from slips_files.common.slips_utils import utils @@ -24,7 +27,7 @@ class IModule(ABC, Process): An interface for all slips modules """ - name = "IModule" + name = "imodule" description = "Template module" authors = ["Template Author"] # should be filled with the channels each module subscribes to @@ -44,7 +47,8 @@ def __init__( ): Process.__init__(self) self.redis_port = redis_port - self.output_dir = output_dir + self.parent_output_dir = output_dir + self.output_dir = os.path.join(output_dir, self.name) self.msg_received = False # as parsed by arg_parser, these are the cli args self.args: Namespace = slips_args @@ -58,10 +62,15 @@ def __init__( self.bloom_filters: BFManager = bloom_filters_manager self.printer = Printer(self.logger, self.name) self.db = DBManager( - self.logger, self.output_dir, self.redis_port, self.conf, self.ppid + self.logger, + self.parent_output_dir, + self.redis_port, + self.conf, + self.ppid, ) self.db.client_setname(self.name) self.keyboard_int_ctr = 0 + self.slips_version: str = utils.get_slips_version() self.init(**kwargs) # should after the module's init() so the module has a chance to # set its own channels @@ -73,6 +82,25 @@ def __init__( def print(self, *args, **kwargs): return self.printer.print(*args, **kwargs) + def get_module_specific_output_path(self, logfile_name: str) -> str: + """returns the full path of the given file inside this + module-specific output dir inside the parent_output_dir + so if the output dir is slips1, and this module is flow_alerts, + and the filename is detection_log.csv + this functions returns slips1/flow_alerts/detection_log.csv + """ + os.makedirs(self.output_dir, exist_ok=True) + return os.path.join(self.output_dir, logfile_name) + + def get_database_path(self, filename: str) -> str: + """ + this is where any .sqlite database generated by this module + should be stored + """ + return get_this_db_path_inside_output_dir( + self.parent_output_dir, filename + ) + def init_channel_tracker(self) -> Dict[str, Dict[str, bool]]: """ tracks if in the last loop, a msg was received in any of the @@ -172,6 +200,28 @@ def _pre_main(self): self.channel_tracker = self.init_channel_tracker() return self.pre_main() + def is_msg_version_compatible(self, message: dict) -> bool: + """ + Check whether the incoming pub/sub message matches this module's + Slips version. + """ + if not message or "data" not in message: + return False + + data = message["data"] + if not isinstance(data, str): + return False + + try: + payload = json.loads(data) + except (json.decoder.JSONDecodeError, TypeError): + return False + + if not isinstance(payload, dict): + return False + + return payload.get("version") == self.slips_version + def get_msg(self, channel: str) -> Optional[dict]: try: if channel not in self.channels: @@ -183,6 +233,12 @@ def get_msg(self, channel: str) -> Optional[dict]: message = self.db.get_message(self.channels[channel]) if utils.is_msg_intended_for(message, channel): + # discard msgs if sent be a newer/older version of slips. + # may happen temporarily during handover, where the new + # version starts before the old version stops. + if not self.is_msg_version_compatible(message): + self.channel_tracker[channel]["msg_received"] = False + return None self.channel_tracker[channel]["msg_received"] = True self.db.incr_msgs_received_in_channel(self.name, channel) return message @@ -198,7 +254,7 @@ def print_traceback(self): def run(self): """ - some modules use async functions like flowalerts, + some modules use async functions like flow_alerts, the goals of this function is to make sure that async and normal shutdown_gracefully() functions run until completion """ diff --git a/slips_files/common/idmefv2.py b/slips_files/common/idmefv2.py index aa74aa3e3..c946a6936 100644 --- a/slips_files/common/idmefv2.py +++ b/slips_files/common/idmefv2.py @@ -45,7 +45,7 @@ class IDMEFv2: https://www.ietf.org/id/draft-lehmann-idmefv2-03.html#name-the-alert-class """ - name = "IDMEFv2" + name = "idmefv2" def __init__(self, logger: Output, db): self.printer = Printer(logger, self.name) diff --git a/slips_files/common/output_paths.py b/slips_files/common/output_paths.py new file mode 100644 index 000000000..1e00597d0 --- /dev/null +++ b/slips_files/common/output_paths.py @@ -0,0 +1,73 @@ +import os +from pathlib import Path + +from slips_files.common.parsers.config_parser import ConfigParser + +DATABASES_DIRNAME = "databases" +ALERTS_DIRNAME = "alerts" +REDIS_DIRNAME = "redis" + + +def get_databases_dir_path_inside_output_dir(parent_dir: str) -> str: + """ + any db generated by slips and should be overwritten per run, + goes in this dir + return the databses/ path inside the parent output dir + e.g output_123/databses/ + :param parent_dir: parent output dir. the main one given to slips with -o + """ + databases_dir = os.path.join(parent_dir or ".", DATABASES_DIRNAME) + os.makedirs(databases_dir, exist_ok=True) + return databases_dir + + +def get_redis_dir_path_inside_output_dir(parent_dir: str) -> str: + """ + any redis logs generated by slips and should be overwritten per run, + goes in this dir + :param parent_dir: parent output dir. the main one given to slips with -o + """ + redis_dir = os.path.join(parent_dir or ".", REDIS_DIRNAME) + os.makedirs(redis_dir, exist_ok=True) + return redis_dir + + +def get_this_db_path_inside_output_dir(parent_dir: str, filename: str) -> str: + return os.path.join( + get_databases_dir_path_inside_output_dir(parent_dir), filename + ) + + +def get_permanent_dir() -> str: + """ + Return the root directory for persistent runtime data. + + Returns: + Relative path where runtime-generated data that must persist + across different Slips runs is stored. + """ + conf = ConfigParser() + permanent_dir = conf.permanent_dir() + + # make sure it's inside slips root dir + permanent_dir = os.path.join(os.getcwd(), permanent_dir) + Path(permanent_dir).mkdir(parents=True, exist_ok=True) + + return permanent_dir + + +def get_this_filepath_inside_permanent_dir(filename: str) -> str: + """use this func if you plan to persist your filename across runs.""" + return os.path.join(get_permanent_dir(), filename) + + +def get_alerts_path_inside_output_dir(parent_dir: str) -> str: + return os.path.join(parent_dir, ALERTS_DIRNAME) + + +def get_redis_logs_path_inside_output_dir( + parent_dir: str, logfile: str +) -> str: + return os.path.join( + get_redis_dir_path_inside_output_dir(parent_dir), logfile + ) diff --git a/slips_files/common/parsers/arg_parser.py b/slips_files/common/parsers/arg_parser.py index cfa725285..e3043238a 100644 --- a/slips_files/common/parsers/arg_parser.py +++ b/slips_files/common/parsers/arg_parser.py @@ -14,10 +14,10 @@ def __init__(self, *args, **kwargs): super(ArgumentParser, self).__init__(*args, **kwargs) self.program = {key: kwargs[key] for key in kwargs} - self.alerts_default_path = "output/" - def add_argument(self, *args, **kwargs): super(ArgumentParser, self).add_argument(*args, **kwargs) + if kwargs.get("help") == argparse.SUPPRESS: + return option = {"flags": list(args)} for key in kwargs: option[key] = kwargs[key] @@ -170,8 +170,7 @@ def parse_arguments(self): action="store", required=False, help="Read packets from two interfaces when Slips is running as " - "an access point. the wifi interface should come first (" - "e.g -ap wlan0, eth0).", + "an access point. the wifi interface should come first (e.g -ap wlan0, eth0).", ) self.add_argument( "-F", @@ -210,8 +209,7 @@ def parse_arguments(self): action="store", metavar="", required=False, - default=self.alerts_default_path, - help="Store alerts.json and alerts.txt in the given folder.", + help="Store Slips logs in the given folder.", ) self.add_argument( "-s", @@ -256,7 +254,9 @@ def parse_arguments(self): "--multiinstance", action="store_true", required=False, - help="Run multiple instances of slips, don't overwrite the old one", + help="Run multiple instances of slips, don't overwrite the old " + "one. This option run redis using a random unused port " + "instead of the default one (6379).", ) self.add_argument( "-P", @@ -309,6 +309,14 @@ def parse_arguments(self): action="store_true", help="Internal use only, prevents infinite recursion for cpu profiler dev mode multiprocess tracking", ) + # Internal flag used when Slips starts a newer version of itself. + self.add_argument( + "-u", + dest="is_slips_started_by_an_update", + action="store_true", + default=False, + help=argparse.SUPPRESS, + ) try: self.add_argument( "-h", diff --git a/slips_files/common/parsers/config_parser.py b/slips_files/common/parsers/config_parser.py index 60cdf63d0..c7eba4682 100644 --- a/slips_files/common/parsers/config_parser.py +++ b/slips_files/common/parsers/config_parser.py @@ -1,6 +1,7 @@ # SPDX-FileCopyrightText: 2021 Sebastian Garcia # SPDX-License-Identifier: GPL-2.0-only from datetime import timedelta +import os import sys from slips_files.common.input_type import InputType import ipaddress @@ -74,6 +75,26 @@ def read_configuration(self, section, name, default_value): # or no section or no configuration file specified return default_value + def read_module_configuration( + self, section: str, legacy_section: str, name: str, default_value + ): + """ + Read a module configuration value with support for a legacy section. + + Parameters: + section: Preferred module section name. + legacy_section: Backward-compatible section name. + name: Configuration key to read. + default_value: Value returned when neither section defines the key. + + Returns: + The configured value from the preferred or legacy section. + """ + value = self.read_configuration(section, name, default_value) + if value != default_value: + return value + return self.read_configuration(legacy_section, name, default_value) + @property def web_interface_port(self) -> int: port = self.read_configuration("web_interface", "port", 55000) @@ -86,8 +107,8 @@ def get_entropy_threshold(self): """ gets the shannon entropy used in detecting C&C over DNS TXT records from slips.conf/slips.yaml """ - threshold = self.read_configuration( - "flowalerts", "entropy_threshold", 5 + threshold = self.read_module_configuration( + "flow_alerts", "flowalerts", "entropy_threshold", 5 ) try: @@ -96,8 +117,8 @@ def get_entropy_threshold(self): return 5 def get_pastebin_download_threshold(self): - threshold = self.read_configuration( - "flowalerts", "pastebin_download_threshold", 700 + threshold = self.read_module_configuration( + "flow_alerts", "flowalerts", "pastebin_download_threshold", 700 ) try: @@ -122,6 +143,15 @@ def evidence_detection_threshold(self): def packet_filter(self): return self.read_configuration("parameters", "pcapfilter", False) + def auto_update_slips(self) -> bool: + """ + Read whether live Slips version auto-updates are enabled. + + Returns: + True when automatic live updates are enabled, otherwise False. + """ + return self.read_configuration("update", "auto_update_slips", False) + def online_whitelist(self): return self.read_configuration("whitelists", "online_whitelist", False) @@ -186,14 +216,26 @@ def enable_local_whitelist(self): "whitelists", "enable_local_whitelist", True ) - def logsfile(self): - return self.read_configuration("modes", "logsfile", "slips.log") + def logs_file(self): + return self.read_configuration( + "output", + "logs", + self.read_configuration("modes", "logs", "slips.log"), + ) def stdout(self): - return self.read_configuration("modes", "stdout", "slips.log") + return self.read_configuration( + "output", + "stdout", + self.read_configuration("modes", "stdout", "slips.log"), + ) def stderr(self): - return self.read_configuration("modes", "stderr", "errors.log") + return self.read_configuration( + "output", + "stderr", + self.read_configuration("modes", "stderr", "errors.log"), + ) def create_p2p_logfile(self): return self.read_configuration( @@ -260,6 +302,21 @@ def get_tw_width(self) -> str: def enable_metadata(self): return self.read_configuration("parameters", "metadata_dir", False) + def permanent_dir(self) -> str: + """ + Return the directory used for persistent runtime data. + + Returns: + Relative path where databases and runtime-generated files that + must persist across different Slips runs are stored. + """ + permanent_dir = self.read_configuration( + "parameters", "permanent_dir", "permanent" + ) + if not permanent_dir: + permanent_dir = "permanent" + return os.path.normpath(permanent_dir) + def use_local_p2p(self): return self.read_configuration("local_p2p", "use_p2p", False) @@ -267,10 +324,10 @@ def use_global_p2p(self): return self.read_configuration("global_p2p", "use_global_p2p", False) def cesnet_conf_file(self): - return self.read_configuration("CESNET", "configuration_file", False) + return self.read_configuration("cesnet", "configuration_file", False) def poll_delay(self): - poll_delay = self.read_configuration("CESNET", "receive_delay", 86400) + poll_delay = self.read_configuration("cesnet", "receive_delay", 86400) try: poll_delay = int(poll_delay) except ValueError: @@ -280,10 +337,10 @@ def poll_delay(self): return poll_delay def send_to_warden(self): - return self.read_configuration("CESNET", "send_alerts", False) + return self.read_configuration("cesnet", "send_alerts", False) def receive_from_warden(self): - return self.read_configuration("CESNET", "receive_alerts", False) + return self.read_configuration("cesnet", "receive_alerts", False) def verbose(self): verbose = self.read_configuration("parameters", "verbose", 1) @@ -444,8 +501,8 @@ def long_connection_threshold(self): returns threshold in seconds """ # 1500 is in seconds, =25 mins - threshold = self.read_configuration( - "flowalerts", "long_connection_threshold", 1500 + threshold = self.read_module_configuration( + "flow_alerts", "flowalerts", "long_connection_threshold", 1500 ) try: threshold = int(threshold) @@ -457,8 +514,11 @@ def ssh_succesful_detection_threshold(self): """ returns threshold in seconds """ - threshold = self.read_configuration( - "flowalerts", "ssh_succesful_detection_threshold", 4290 + threshold = self.read_module_configuration( + "flow_alerts", + "flowalerts", + "ssh_succesful_detection_threshold", + 4290, ) try: threshold = int(threshold) @@ -467,9 +527,9 @@ def ssh_succesful_detection_threshold(self): return threshold - def ssh_bruteforcing_threshold(self): + def ssh_brute_force_detector_threshold(self): threshold = self.read_configuration( - "bruteforcing", "ssh_attempt_threshold", 9 + "brute_force_detector", "ssh_attempt_threshold", 9 ) try: threshold = int(threshold) @@ -482,8 +542,8 @@ def data_exfiltration_threshold(self): returns threshold in MBs """ # threshold in MBs - threshold = self.read_configuration( - "flowalerts", "data_exfiltration_threshold", 500 + threshold = self.read_module_configuration( + "flow_alerts", "flowalerts", "data_exfiltration_threshold", 500 ) try: threshold = int(threshold) @@ -492,7 +552,9 @@ def data_exfiltration_threshold(self): return threshold def get_ml_mode(self): - return self.read_configuration("flowmldetection", "mode", "test") + return self.read_module_configuration( + "flow_ml_detection", "flowmldetection", "mode", "test" + ) def https_anomaly_training_hours(self) -> int: training_hours = self.read_configuration( @@ -801,11 +863,11 @@ def mac_db_update_period(self): def delete_prev_db(self): return self.read_configuration("parameters", "deletePrevdb", True) - def rotation_period(self): - rotation_period = self.read_configuration( - "parameters", "rotation_period", "1 day" + def default_rotation_interval(self): + default_rotation_interval = self.read_configuration( + "parameters", "default_rotation_interval", "1 day" ) - return utils.sanitize(rotation_period) + return utils.sanitize(default_rotation_interval) def parse_ip(self, ip: str): """converts the given IP address or CIDR to an obj""" @@ -920,12 +982,12 @@ def get_disabled_modules(self, input_type: str) -> list: use_p2p = self.use_local_p2p() if not (use_p2p and "-i" in sys.argv): - to_ignore.append("p2ptrust") + to_ignore.append("p2p_trust") use_global_p2p = self.use_global_p2p() if not (use_global_p2p and ("-i" in sys.argv)): - to_ignore.append("fidesModule") - to_ignore.append("irisModule") + to_ignore.append("fides") + to_ignore.append("iris") # ignore CESNET sharing module if send and receive are # disabled in slips.yaml @@ -1008,7 +1070,7 @@ def get_bootstrapping_setting(self) -> (bool, list): self.read_configuration("global_p2p", "bootstrapping_node", False) and self.read_configuration("global_p2p", "use_global_p2p", False) and ("-i" in sys.argv or "-g" in sys.argv), - ["fidesModule", "irisModule"], + ["fides", "iris"], ) def is_bootstrapping_node(self) -> bool: @@ -1022,5 +1084,5 @@ def get_bootstrapping_modules(self) -> list: return self.read_configuration( "global_p2p", "bootstrapping_modules", - ["fidesModule", "irisModule"], + ["fides", "iris"], ) diff --git a/slips_files/common/performance_profilers/memory_profiler.py b/slips_files/common/performance_profilers/memory_profiler.py index 30d1b3978..7952ec795 100644 --- a/slips_files/common/performance_profilers/memory_profiler.py +++ b/slips_files/common/performance_profilers/memory_profiler.py @@ -19,6 +19,8 @@ import random from abc import ABCMeta +from slips_files.common.slips_utils import utils + class MemoryProfiler(IPerformanceProfiler): profiler = None @@ -214,7 +216,7 @@ def _handle_signal(self): # print(f"Msg {msg}") pid: int = None try: - pid = int(msg["data"]) + pid = int(utils.get_msg_payload(msg)) except ValueError: msg = self.pid_channel.get_message(timeout=timeout) continue diff --git a/slips_files/common/slips_utils.py b/slips_files/common/slips_utils.py index 000d4bd4b..291cb0b96 100644 --- a/slips_files/common/slips_utils.py +++ b/slips_files/common/slips_utils.py @@ -133,6 +133,20 @@ def threat_level_to_string(self, threat_level: float) -> str: if threat_level <= int_value: return str_lvl + @staticmethod + def evidence_confidence_to_string(score: float) -> str: + """ + Convert an evidence confidence score to a string label. + + :param score: Evidence confidence score between 0 and 1. + :return: "high", "medium", or "low" based on the score. + """ + if score >= 0.80: + return "High" + if score >= 0.55: + return "Medium" + return "low" + @staticmethod def log10(n: int) -> int: if n <= 0: @@ -784,6 +798,36 @@ def is_msg_intended_for(self, message, channel): and message["channel"] == channel ) + def get_msg_payload(self, message: dict) -> Any: + """ + Return the actual payload stored in the given message. discards + metadata like "version" and returns the text only. + + Parameters: + message: Pub/sub message returned by Redis. + + Return: + The decoded payload. Wrapped plain-string messages return their text. + """ + data = message["data"] + if not isinstance(data, str): + return data + + try: + decoded = json.loads(data) + except (json.decoder.JSONDecodeError, TypeError): + return data + + if ( + isinstance(decoded, dict) + and "text" in decoded + and "version" in decoded + and len(decoded) == 2 + ): + return decoded["text"] + + return decoded + def get_slips_version(self) -> str: version_file = "VERSION" with open(version_file, "r") as f: @@ -805,6 +849,34 @@ def change_logfiles_ownership(self, file: str, UID, GID): os.system(f"chown {UID}:{GID} {file}") + def initialize_logfile( + self, + logfile_path: str, + started_by_update: bool, + mode: str = "w", + create_parent_dirs: bool = True, + ) -> bool: + """ + Initialize a log file unless Slips was started by an update. + when slips is being updated , we dont want the new version to clear + the used logfiles, instead it will append to them + + :param logfile_path: path to the log file to initialize. + :param started_by_update: whether Slips was started by an update. + :param mode: file mode used to initialize the log file. + :param create_parent_dirs: whether to create missing parent dirs. + :return: True if the file was initialized, False otherwise. + """ + if started_by_update: + return False + + logfile_dir = os.path.dirname(logfile_path) + if create_parent_dirs and logfile_dir: + os.makedirs(logfile_dir, exist_ok=True) + # clear the logfile + open(logfile_path, mode).close() + return True + def get_ip_identification_as_str(self, ip_identification: dict) -> str: id = "" if "DNS_resolution" in ip_identification: @@ -814,6 +886,9 @@ def get_ip_identification_as_str(self, ip_identification: dict) -> str: ip_identification.pop("DNS_resolution") for key, piece_of_info in ip_identification.items(): + if key == "timestamp": + continue + if not piece_of_info: continue @@ -920,6 +995,11 @@ def assert_microseconds(self, ts: str): ts = ts + "0" * (6 - len(ts.split(".")[-1])) return ts + def get_current_version(self) -> str: + with open("VERSION", "r") as version_file: + current_version = version_file.read().strip() + return current_version + def _convert_str_port_to_int(self, port) -> int: if isinstance(port, str): try: diff --git a/slips_files/core/aid_manager.py b/slips_files/core/aid_manager.py index 5842c17d4..b06ae5d88 100644 --- a/slips_files/core/aid_manager.py +++ b/slips_files/core/aid_manager.py @@ -24,7 +24,7 @@ def __init__( self._process = Process( target=self._worker_loop, args=(self._aid_queue, self.db), - name="AIDManager", + name="aid_manager", daemon=True, ) utils.start_process(self._process, self.db) diff --git a/slips_files/core/database/database_manager.py b/slips_files/core/database/database_manager.py index bbf6602db..1c927a676 100644 --- a/slips_files/core/database/database_manager.py +++ b/slips_files/core/database/database_manager.py @@ -20,6 +20,9 @@ from slips_files.core.database.redis_db.database import RedisDB from slips_files.core.database.sqlite_db.database import SQLiteDB from slips_files.common.parsers.config_parser import ConfigParser +from slips_files.common.output_paths import ( + get_this_filepath_inside_permanent_dir, +) from slips_files.common.performance_paths import get_performance_csv_path from slips_files.core.structures.evidence import Evidence from slips_files.core.structures.alerts import Alert @@ -33,7 +36,7 @@ class DBManager: handler in here. """ - name = "DBManager" + name = "db_manager" def __init__( self, @@ -46,11 +49,27 @@ def __init__( start_redis_server=True, **kwargs, ): + """ + Initialize Redis and SQLite database handlers. + + :param logger: output logger used by database handlers. + :param output_dir: directory where database files and logs are stored. + :param redis_port: port used to connect to Redis. + :param conf: loaded Slips configuration parser. + :param main_pid: PID of the main Slips process. + :param start_sqlite: whether to initialize the SQLite handler. + :param start_redis_server: whether to start Redis before connecting. + + :param kwargs: additional RedisDB options. Supported keys are: + flush_db: whether this manager may flush Redis on startup when + the configuration also allows deleting previous DB contents. + """ self.conf = conf self.output_dir = output_dir self.redis_port = redis_port self.logger = logger self.printer = Printer(self.logger, self.name) + # only the main process should ever flush the Redis DB. to avoid # children overwriting values set at the very start of slips if os.getpid() != main_pid: @@ -66,9 +85,9 @@ def __init__( if self.conf.use_local_p2p(): # import this on demand because slips light version doesn't # include the P2P dir - from modules.p2ptrust.trust.trustdb import TrustDB + from modules.p2p_trust.trust.trustdb import TrustDB - self.trust_db_path: str = self.init_p2ptrust_db() + self.trust_db_path: str = self.init_p2p_trust_db() self.trust_db = TrustDB( self.logger, self.trust_db_path, @@ -123,12 +142,21 @@ def backup_db(self, db_path: str): f"restart Slips." ) - def init_p2ptrust_db(self) -> str: - """Initializes and returns the path to a valid trustdb inside p2ptrust_runtime_dir.""" - p2ptrust_runtime_dir = os.path.join(os.getcwd(), "p2ptrust_runtime/") - Path(p2ptrust_runtime_dir).mkdir(parents=True, exist_ok=True) - db_path = os.path.join(p2ptrust_runtime_dir, "trustdb.db") - self.p2ptrust_runtime_dir = p2ptrust_runtime_dir + def init_p2p_trust_db(self) -> str: + """ + Initialize and return the path to the persistent local P2P trust DB. + + Returns: + Path to the local P2P trust SQLite database. + """ + p2p_trust_runtime_dir = get_this_filepath_inside_permanent_dir( + "p2p_trust_runtime" + ) + + Path(p2p_trust_runtime_dir).mkdir(parents=True, exist_ok=True) + + db_path = os.path.join(p2p_trust_runtime_dir, "trustdb.db") + self.p2p_trust_runtime_dir = p2p_trust_runtime_dir if os.path.exists(db_path): if self.is_db_malformed(db_path): @@ -181,10 +209,10 @@ def has_write_access_to_sqlite(self, db_path: str) -> bool: ): return False - def get_p2ptrust_dir(self) -> str: - return self.p2ptrust_runtime_dir + def get_p2p_trust_dir(self) -> str: + return self.p2p_trust_runtime_dir - def get_p2ptrust_db_path(self) -> str: + def get_p2p_trust_db_path(self) -> str: return self.trust_db_path def print(self, *args, **kwargs): @@ -300,11 +328,11 @@ def get_output_dir(self, *args, **kwargs): def get_input_file(self, *args, **kwargs): return self.rdb.get_input_file(*args, **kwargs) - def store_module_flows_per_second(self, *args, **kwargs): - return self.rdb.store_module_flows_per_second(*args, **kwargs) + def store_core_module_flows_per_second(self, *args, **kwargs): + return self.rdb.store_core_module_flows_per_second(*args, **kwargs) - def get_module_flows_per_second(self, *args, **kwargs): - return self.rdb.get_module_flows_per_second(*args, **kwargs) + def get_core_module_flows_per_second(self, *args, **kwargs): + return self.rdb.get_core_module_flows_per_second(*args, **kwargs) def record_flow_per_minute(self, module: str, now: Optional[float] = None): if not self.conf.generate_performance_plots(): diff --git a/slips_files/core/database/redis_db/alert_handler.py b/slips_files/core/database/redis_db/alert_handler.py index d39986749..bca7e43b1 100644 --- a/slips_files/core/database/redis_db/alert_handler.py +++ b/slips_files/core/database/redis_db/alert_handler.py @@ -50,7 +50,7 @@ class AlertHandler: set_profileid_field: Callable[..., Any] add_profile: Callable[..., Any] - name = "DB" + name = "alert_handler_db" def set_evidence_causing_alert(self, alert: Alert): """ diff --git a/slips_files/core/database/redis_db/cleanup_mixin.py b/slips_files/core/database/redis_db/cleanup_mixin.py index 31285c776..55a2da2c5 100644 --- a/slips_files/core/database/redis_db/cleanup_mixin.py +++ b/slips_files/core/database/redis_db/cleanup_mixin.py @@ -16,7 +16,7 @@ class CleanupMixin: get_blocked_timewindows_of_profile: Callable[..., Any] print: Callable[..., Any] - name = "CleanupMixin" + name = "cleanup_mixin" def _del_all_profile_tw_keys(self, profileid: str, twid: str, pipe): """ diff --git a/slips_files/core/database/redis_db/constants.py b/slips_files/core/database/redis_db/constants.py index 79af2894e..b04b2e867 100644 --- a/slips_files/core/database/redis_db/constants.py +++ b/slips_files/core/database/redis_db/constants.py @@ -3,7 +3,6 @@ class Constants: LOADED_TI_FILES = "loaded_TI_files_number" TI_FILES_INFO = "TI_files_info" - CURRENT_TIMEWINDOW = "current_timewindow" # all keys starting with IoC_* are used for storing IoCs read from # online and offline TI feeds IOC_IPS = "IoC_ips" @@ -16,7 +15,7 @@ class Constants: LABELED_AS_MALICIOUS = "labeled_as_malicious" # used to cache url info by the virustotal module only VT_CACHED_URL_INFO = "virustotal_cached_url_info" - # used for Kalipso + # used by the UI DOMAINS_INFO = "DomainsInfo" IPS_INFO = "IPsInfo" PROCESSED_FLOWS_BY_PROFILER = "processed_flows_by_profiler_so_far" @@ -27,7 +26,7 @@ class Constants: WHITELISTED_EVIDENCE = "whitelisted_evidence" SRCIPS_SEEN_IN_CONN_LOG = "srcips_seen_in_connlog" PASSIVE_DNS = "passiveDNS" - # called for every ip in kalipso timeline + # called for every IP in the timeline view DNS_RESOLUTION = "DNSresolution" DOMAINS_RESOLVED = "DomainsResolved" CACHED_ASN = "cached_asn" @@ -70,8 +69,12 @@ class Constants: KNOWN_FP_MD5_HASHES = "known_fps" WILL_SLIPS_HAVE_MORE_FLOWS = "will_slips_have_more_flows" SUBS_WHO_PROCESSED_MSG = "number_of_subscribers_who_processed_this_msg" - FLOWS_ANALYZED_BY_ALL_MODULES_PER_MIN = "flows_analyzed_per_minute" - MODULES_FLOWS_PER_SECOND = "modules_processed_flows_per_second" + FLOWS_ANALYZED_BY_ALL_MODULES_PER_MIN = ( + "flows_analyzed_by_all_modules_per_minute" + ) + CORE_MODULE_NUMBER_OF_PROCESSED_FLOWS_PER_SECOND = ( + "core_module_number_of_processed_flows_per_second" + ) LINE_PROCESSORS = "line_processors" ALERTS = "alerts" MAX_THREAT_LEVEL = "max_threat_level" diff --git a/slips_files/core/database/redis_db/database.py b/slips_files/core/database/redis_db/database.py index f31fff37c..2713ebecb 100644 --- a/slips_files/core/database/redis_db/database.py +++ b/slips_files/core/database/redis_db/database.py @@ -3,6 +3,9 @@ import shutil import socket +from slips_files.common.output_paths import ( + get_redis_logs_path_inside_output_dir, +) from slips_files.common.printer import Printer from slips_files.common.slips_utils import utils from slips_files.common.parsers.config_parser import ConfigParser @@ -40,6 +43,7 @@ RUNNING_IN_DOCKER = os.environ.get("IS_IN_A_DOCKER_CONTAINER", False) LOCALHOST = "127.0.0.1" +VERSION = utils.get_current_version() class RedisDB( @@ -151,6 +155,7 @@ def __new__( cls.flush_db = flush_db # start the redis server using cli if it's not started? cls.start_server = start_redis_server + cls.logger = logger cls.printer = Printer(logger, cls.name) cls.conf = ConfigParser() cls.args = cls.conf.get_args() @@ -191,15 +196,26 @@ def __init__(self, *args, **kwargs): self.call_mixins_setup() self._init_ttls() self.set_new_incoming_flows(True) + if ( + self.logger + and not self.flush_db + and self.args.is_slips_started_by_an_update + ): + self.print( + "Continuing on previous data stored in redis.", + log_to_logfiles_only=True, + ) @classmethod def _get_conf_file_path(cls, redis_port: Optional[int] = None) -> str: - """Return a per-run redis config path to avoid parallel overwrite.""" + """ + Return a per-run redis config path to avoid parallel overwrite. + """ redis_port = redis_port or cls.redis_port output_dir = os.fspath(cls.output_dir or "output") os.makedirs(output_dir, exist_ok=True) - return os.path.join( - output_dir, f"redis-server-port-{redis_port}-{os.getpid()}.conf" + return get_redis_logs_path_inside_output_dir( + cls.output_dir, f"redis-server-port-{redis_port}.conf" ) def _init_ttls(self): @@ -256,7 +272,7 @@ def _setup_config_file(cls): # because slips may use different redis ports at the same time, # logs should be port specific - logfile = os.path.join( + logfile = get_redis_logs_path_inside_output_dir( cls.output_dir, f"redis-server-port-{cls.redis_port}.log" ) cls._options.update({"logfile": logfile}) @@ -502,10 +518,28 @@ def ping(self): self.r.ping() self.rcache.ping() + def _add_version_to_msg(self, msg): + if isinstance(msg, str): + try: + msg = json.loads(msg) + msg.update({"version": VERSION}) + msg = json.dumps(msg) + except json.decoder.JSONDecodeError: + # the msg is 1 str + msg = { + "text": msg, + "version": VERSION, + } + msg = json.dumps(msg) + elif isinstance(msg, dict): + msg.update({"version": VERSION}) + return msg + def publish(self, channel, msg, pipeline=None): """Publish a msg in the given channel. adds the instructions to the given pipeline if given and returns the pipeline""" + msg = self._add_version_to_msg(msg) # keeps track of how many msgs were published in the given channel if pipeline is not None: @@ -812,7 +846,7 @@ def get_dns_resolution(self, ip: str): 'uid':..., 'resolved-by':.. } If not resolved, returns {} - this function is called for every IP in the timeline of kalipso + this function is called for every IP in the timeline view checks for the reolution in self.constants.DNS_RESOLUTION """ if ip_info := self.r.hget(self.constants.DNS_RESOLUTION, ip): @@ -965,7 +999,7 @@ def set_dns_resolution( ips_to_add.append(answer) # For each CNAME in the answer - # store it in DomainsInfo in the cache db (used for kalipso) + # store it in DomainsInfo in the cache db for the UI # and in CNAMEsInfo in the main db (used for detecting dns # without resolution) if ips_to_add: @@ -1494,11 +1528,18 @@ def get_pid_of(self, module_name: str): pid = self.r.hget(self.constants.PIDS, module_name) return int(pid) if pid else None - def store_module_flows_per_second(self, module, fps): - self.r.hset(self.constants.MODULES_FLOWS_PER_SECOND, module, fps) + def store_core_module_flows_per_second(self, module, fps): + self.r.hset( + self.constants.CORE_MODULE_NUMBER_OF_PROCESSED_FLOWS_PER_SECOND, + module, + fps, + ) - def get_module_flows_per_second(self, module): - return self.r.hget(self.constants.MODULES_FLOWS_PER_SECOND, module) + def get_core_module_flows_per_second(self, module): + return self.r.hget( + self.constants.CORE_MODULE_NUMBER_OF_PROCESSED_FLOWS_PER_SECOND, + module, + ) def increment_flows_per_minute(self, module: str, minute_ts: int) -> int: key = f"{self.constants.FLOWS_PER_MINUTE}:{module}" diff --git a/slips_files/core/database/redis_db/flow_tracker_db.py b/slips_files/core/database/redis_db/flow_tracker_db.py index d2fa4372b..6fd3ede14 100644 --- a/slips_files/core/database/redis_db/flow_tracker_db.py +++ b/slips_files/core/database/redis_db/flow_tracker_db.py @@ -13,7 +13,7 @@ class FlowTracker: r: Any constants: Any - name = "FlowTrackerDB" + name = "flow_tracker_db" # channels that recv actual flows, not msgs that we need to pass between # modules. subscribers_of_channels_that_recv_flows = { diff --git a/slips_files/core/database/redis_db/ioc_handler.py b/slips_files/core/database/redis_db/ioc_handler.py index 343bc90dd..bc1cadecc 100644 --- a/slips_files/core/database/redis_db/ioc_handler.py +++ b/slips_files/core/database/redis_db/ioc_handler.py @@ -39,7 +39,7 @@ class IoCHandler: is_trie_cached: bool twid_width: int - name = "DB" + name = "ioc_handler_db" def setup(self, *args, **kwargs): # used for faster domain lookups diff --git a/slips_files/core/database/redis_db/p2p_handler.py b/slips_files/core/database/redis_db/p2p_handler.py index 77029f9e7..28097b49a 100644 --- a/slips_files/core/database/redis_db/p2p_handler.py +++ b/slips_files/core/database/redis_db/p2p_handler.py @@ -20,7 +20,7 @@ class P2PHandler: extended_ttl: int zadd_but_keep_n_entries: Callable[..., Any] - name = "P2PHandlerDB" + name = "p2p_handler_db" def get_fides_ti(self, target: str): """ diff --git a/slips_files/core/database/redis_db/profile_handler.py b/slips_files/core/database/redis_db/profile_handler.py index e6ac375b8..f3267fc4b 100644 --- a/slips_files/core/database/redis_db/profile_handler.py +++ b/slips_files/core/database/redis_db/profile_handler.py @@ -53,7 +53,7 @@ class ProfileHandler: _is_gw_mac: Callable[..., Any] _last_sit: Callable[..., Any] - name = "DB" + name = "profile_handler_db" def set_profileid_field(self, profileid, field, value, pipe=None): """Set a single field in the profileid hash.""" @@ -1147,17 +1147,6 @@ def check_tw_to_close(self, close_all=False): pipe = self.delete_past_timewindows(profile_tw_to_close, pipe) pipe.execute() - def get_current_timewindow(self) -> Optional[str]: - """returns the current timewindow if slips is running real-time ( - not pcap/log files)""" - if not self.args.interface: - return - - return self.r.get(self.constants.CURRENT_TIMEWINDOW) - - def set_current_timewindow(self, timewindow: str) -> Optional[str]: - self.r.set(self.constants.CURRENT_TIMEWINDOW, timewindow) - def mark_profile_tw_as_modified(self, modified_tw_details: dict): """ PS: this function should be as optimized as possible, it's the main diff --git a/slips_files/core/database/redis_db/scan_detections_db.py b/slips_files/core/database/redis_db/scan_detections_db.py index a1a403bae..6d9d4c0ac 100644 --- a/slips_files/core/database/redis_db/scan_detections_db.py +++ b/slips_files/core/database/redis_db/scan_detections_db.py @@ -69,7 +69,7 @@ class ScanDetectionsHandler: get_port_info: Callable[..., Any] mark_profile_tw_as_modified: Callable[..., Any] - name = "DB" + name = "scan_detections_handler_db" def setup(self, *args, **kwargs): self.use_local_p2p: bool = self.conf.use_local_p2p() diff --git a/slips_files/core/database/redis_db/timewindow_updater_thread/tw_updater.py b/slips_files/core/database/redis_db/timewindow_updater_thread/tw_updater.py deleted file mode 100644 index f5f0666e3..000000000 --- a/slips_files/core/database/redis_db/timewindow_updater_thread/tw_updater.py +++ /dev/null @@ -1,18 +0,0 @@ -# SPDX-FileCopyrightText: 2021 Sebastian Garcia -# SPDX-License-Identifier: GPL-2.0-only - -import time -from threading import Event - - -def timewindow_updater(db, tw_width: float, stop_event: Event): - """ - runs in a thread, wakes up only to update the current timewindow - number in the db and sleeps again for the whole tw width - """ - while not stop_event.is_set(): - now = time.time() - cur_tw = db.get_timewindow(now, "", add_to_db=False) - db.set_current_timewindow(cur_tw) - # to avoid busy waiting - stop_event.wait(tw_width) diff --git a/slips_files/core/database/sqlite_db/database.py b/slips_files/core/database/sqlite_db/database.py index 3638acd8c..db502b296 100644 --- a/slips_files/core/database/sqlite_db/database.py +++ b/slips_files/core/database/sqlite_db/database.py @@ -9,6 +9,7 @@ from dataclasses import asdict from slips_files.common.abstracts.isqlite import ISQLite +from slips_files.common.output_paths import get_this_db_path_inside_output_dir from slips_files.common.printer import Printer from slips_files.common.slips_utils import utils from slips_files.core.structures.alerts import Alert @@ -21,11 +22,13 @@ class SQLiteDB(ISQLite): Creates a new db and connects to it if there's none in the given output_dir """ - name = "SQLiteDB" + name = "sqlite_db" def __init__(self, logger: Output, output_dir: str, main_pid: int): self.printer = Printer(logger, self.name) - self._flows_db = os.path.join(output_dir, "flows.sqlite") + self._flows_db = get_this_db_path_inside_output_dir( + output_dir, "flows.sqlite" + ) db_newly_created = False if not os.path.exists(self._flows_db): diff --git a/slips_files/core/evidence_handler.py b/slips_files/core/evidence_handler.py index 44003610a..bd79dff76 100644 --- a/slips_files/core/evidence_handler.py +++ b/slips_files/core/evidence_handler.py @@ -26,6 +26,8 @@ import time from multiprocessing import Process + +from slips_files.common.output_paths import get_alerts_path_inside_output_dir from slips_files.common.style import ( green, ) @@ -41,7 +43,7 @@ # Evidence Process class EvidenceHandler(ICore): - name = "EvidenceHandler" + name = "evidence_handler" def init(self): self.read_configuration() @@ -63,7 +65,10 @@ def init(self): self.evidence_logger = EvidenceLogger( logger_stop_signal=self.logger_stop_signal, evidence_logger_q=self.evidence_logger_q, - output_dir=self.output_dir, + output_dir=get_alerts_path_inside_output_dir( + self.parent_output_dir + ), + slips_args=self.args, ) self.logger_thread = threading.Thread( target=self.evidence_logger.run_logger_thread, @@ -121,10 +126,10 @@ def stop_evidence_workers(self): pass def start_evidence_worker(self, worker_id: int = None): - worker_name = f"EvidenceHandlerWorker_Process_{worker_id}" + worker_name = f"evidence_handler_worker_process_{worker_id}" worker = EvidenceHandlerWorker( logger=self.logger, - output_dir=self.output_dir, + output_dir=self.parent_output_dir, redis_port=self.redis_port, termination_event=self.termination_event, conf=self.conf, diff --git a/slips_files/core/evidence_handler_worker.py b/slips_files/core/evidence_handler_worker.py index 5ffa395b4..cf5cd51e7 100644 --- a/slips_files/core/evidence_handler_worker.py +++ b/slips_files/core/evidence_handler_worker.py @@ -32,7 +32,7 @@ class EvidenceHandlerWorker(IModule): - name = "EvidenceHandlerWorker" + name = "evidence_handler_worker" def init( self, @@ -125,6 +125,9 @@ def add_evidence_to_json_log_file( "uids": evidence.uid, "accumulated_threat_level": accumulated_threat_level, "threat_level": str(evidence.threat_level), + "confidence": utils.evidence_confidence_to_string( + evidence.confidence + ), "timewindow": evidence.timewindow.number, } ) @@ -477,7 +480,7 @@ def handle_new_blame_message(self, msg: dict): try: data = json.loads(data) except json.decoder.JSONDecodeError: - self.print("Error in the report received from p2ptrust module") + self.print("Error in the report received from p2p_trust module") return key = data["key"] diff --git a/slips_files/core/evidence_logger.py b/slips_files/core/evidence_logger.py index e1308aa78..a4f6e5356 100644 --- a/slips_files/core/evidence_logger.py +++ b/slips_files/core/evidence_logger.py @@ -17,10 +17,12 @@ def __init__( logger_stop_signal: threading.Event, evidence_logger_q: multiprocessing.Queue, output_dir: str, + slips_args=None, ): self.logger_stop_signal = logger_stop_signal self.evidence_logger_q = evidence_logger_q self.output_dir = output_dir + self.args = slips_args self.read_configuration() # clear output/alerts.log @@ -66,8 +68,13 @@ def clean_file(self, output_dir, file_to_clean): logfile_dir = os.path.dirname(logfile_path) if logfile_dir: os.makedirs(logfile_dir, exist_ok=True) + if os.path.exists(logfile_path): - open(logfile_path, "w").close() + utils.initialize_logfile( + logfile_path, + getattr(self.args, "is_slips_started_by_an_update", False), + create_parent_dirs=False, + ) return open(logfile_path, "a") def print_to_alerts_logfile(self, data: str): diff --git a/slips_files/core/helpers/bloom_filters_manager.py b/slips_files/core/helpers/bloom_filters_manager.py index a44840a6e..9450117cc 100644 --- a/slips_files/core/helpers/bloom_filters_manager.py +++ b/slips_files/core/helpers/bloom_filters_manager.py @@ -37,6 +37,25 @@ def initialize_filter(self): self._init_whitelisted_iocs_bf() self._init_whitelisted_orgs_bf() + def _create_bloom_filter(self, items, error_rate: float) -> BloomFilter: + """ + Create a bloom filter sized for the provided items. + + Parameters: + items: Iterable of values to store in the bloom filter. + error_rate: Desired bloom filter false-positive rate. + + Returns: + BloomFilter populated with the given items. + """ + unique_items = tuple(dict.fromkeys(items)) + bloom = BloomFilter( + capacity=max(len(unique_items), 1), error_rate=error_rate + ) + for item in unique_items: + bloom.add(item) + return bloom + def _init_whitelisted_iocs_bf(self): self.domains = BloomFilter(capacity=10000, error_rate=0.001) self.ips = BloomFilter(capacity=10000, error_rate=0.001) @@ -60,31 +79,21 @@ def _init_whitelisted_orgs_bf(self): Updates the bloom filters with the whitelisted organization domains, asns, and ips fills the self.org_filters dict - is called from update_manager whether slips did update its local + is called from feeds_update_manager whether slips did update its local org files or not. this goal of calling this is to make sure slips has the bloom filters in mem at all times. """ err_rate = 0.01 for org in utils.supported_orgs: - domains_bloom = BloomFilter(capacity=10000, error_rate=err_rate) - asns_bloom = BloomFilter(capacity=10000, error_rate=err_rate) - cidrs_bloom = BloomFilter(capacity=100, error_rate=err_rate) - domains: List[str] = self.db.get_org_info(org, "domains") - _ = [domains_bloom.add(domain) for domain in domains] - asns: List[str] = self.db.get_org_info(org, "asn") - _ = [asns_bloom.add(asn) for asn in asns] - org_subnets: Dict[str, str] = self.db.get_org_ips(org) - _ = [ - cidrs_bloom.add(first_octet) - for first_octet in org_subnets.keys() - ] self.org_filters[org] = { - "domains": domains_bloom, - "asns": asns_bloom, - "first_octets": cidrs_bloom, + "domains": self._create_bloom_filter(domains, err_rate), + "asns": self._create_bloom_filter(asns, err_rate), + "first_octets": self._create_bloom_filter( + org_subnets.keys(), err_rate + ), } diff --git a/slips_files/core/helpers/checker.py b/slips_files/core/helpers/checker.py index c34169217..16ba8b438 100644 --- a/slips_files/core/helpers/checker.py +++ b/slips_files/core/helpers/checker.py @@ -18,7 +18,7 @@ def get_input_type(self) -> tuple: supported input_type values are: interface, argus, suricata, zeek, nfdump, db supported input_information: - given filepath, interface or type of line given in stdin, + given filepath, interface, or type of line given in stdin, comma separated access point interfaces like wlan0,eth0 """ # only defined in stdin lines @@ -259,7 +259,6 @@ def clear_redis_cache(self): print("Deleting Cache DB in Redis.") self.main.redis_man.clear_redis_cache_database() self.main.input_information = "" - self.main.zeek_dir = "" self.main.redis_man.log_redis_server_pid( redis_cache_default_server_port, redis_cache_server_pid ) diff --git a/slips_files/core/helpers/filemonitor.py b/slips_files/core/helpers/filemonitor.py index 3b4130cb6..2a54b59a3 100644 --- a/slips_files/core/helpers/filemonitor.py +++ b/slips_files/core/helpers/filemonitor.py @@ -44,7 +44,7 @@ def on_moved(self, event): """ this will be triggered everytime zeek renames all log files """ - # tell inputProcess to change open handles + # tell input.py to change open handles if event.dest_path != "True": to_send = {"old_file": event.dest_path, "new_file": event.src_path} to_send = json.dumps(to_send) diff --git a/slips_files/core/helpers/symbols_handler.py b/slips_files/core/helpers/symbols_handler.py index 81ccca208..9235343c6 100644 --- a/slips_files/core/helpers/symbols_handler.py +++ b/slips_files/core/helpers/symbols_handler.py @@ -8,7 +8,7 @@ class SymbolHandler: - name = "SymbolHandler" + name = "symbol_handler" def __init__(self, logger: Output, db): self.printer = Printer(logger, self.name) diff --git a/slips_files/core/helpers/whitelist/whitelist.py b/slips_files/core/helpers/whitelist/whitelist.py index 7d80c8b6c..b5579990d 100644 --- a/slips_files/core/helpers/whitelist/whitelist.py +++ b/slips_files/core/helpers/whitelist/whitelist.py @@ -29,7 +29,7 @@ class Whitelist: - name = "Whitelist" + name = "whitelist" def __init__(self, logger: Output, db, bloom_filter_manager: BFManager): self.printer = Printer(logger, self.name) diff --git a/slips_files/core/helpers/whitelist/whitelist_parser.py b/slips_files/core/helpers/whitelist/whitelist_parser.py index ea94d3891..49de09291 100644 --- a/slips_files/core/helpers/whitelist/whitelist_parser.py +++ b/slips_files/core/helpers/whitelist/whitelist_parser.py @@ -221,12 +221,12 @@ def load_org_ips(self, org) -> Optional[Dict[str, List[str]]]: if org not in utils.supported_orgs: return - # Each file is named after the organization's name - org_info_file = os.path.join(self.org_info_path, org) + org_info_file = os.path.join(self.org_info_path, f"{org}_ip_ranges") try: org_info = open(org_info_file) except (FileNotFoundError, IOError): - # there's no slips_files/organizations_info/{org} for this org + # there's no slips_files/organizations_info/{org}_ip_ranges + # for this org return org_subnets = {} diff --git a/slips_files/core/input/cyst/cyst_input.py b/slips_files/core/input/cyst/cyst_input.py index 959482eae..a823a98c7 100644 --- a/slips_files/core/input/cyst/cyst_input.py +++ b/slips_files/core/input/cyst/cyst_input.py @@ -4,6 +4,7 @@ import json from slips_files.common.abstracts.iinput_handler import IInputHandler +from slips_files.common.slips_utils import utils class CystInput(IInputHandler): @@ -30,13 +31,14 @@ def run(self): # todo when to break? cyst should send something like stop? msg = self.input.get_msg("new_module_flow") - if msg and msg["data"] == "stop_process": + if msg and utils.get_msg_payload(msg) == "stop_process": self.input.shutdown_gracefully() return True if msg := self.input.get_msg("new_module_flow"): - msg: str = msg["data"] - msg = json.loads(msg) + msg = utils.get_msg_payload(msg) + if isinstance(msg, str): + msg = json.loads(msg) flow = msg["flow"] src_module = msg["module"] line_info = { diff --git a/slips_files/core/input/input.py b/slips_files/core/input/input.py index 7d2589326..6d923bd64 100644 --- a/slips_files/core/input/input.py +++ b/slips_files/core/input/input.py @@ -24,7 +24,6 @@ from slips_files.common.abstracts.icore import ICore from slips_files.common.input_type import InputType -# common imports for all modules from slips_files.common.parsers.config_parser import ConfigParser import multiprocessing @@ -46,7 +45,7 @@ class Input(ICore): """A class process to run the process of the flows""" - name = "Input" + name = "input" def init( self, @@ -56,10 +55,10 @@ def init( input_information=None, cli_packet_filter=None, zeek_or_bro=None, - zeek_dir=None, line_type=None, is_profiler_done_event: multiprocessing.Event = None, is_input_done_event: multiprocessing.Event = None, + is_slips_live_updating_event: multiprocessing.Event = None, ): self.input_type = input_type self.profiler_queue = profiler_queue @@ -68,7 +67,6 @@ def init( self.line_type: str = line_type # entire path self.given_path: str = input_information - self.zeek_dir: str = zeek_dir self.zeek_or_bro: str = zeek_or_bro self.read_lines_delay = 0 # when input is done processing, it reeleases this semaphore, that's h @@ -92,6 +90,7 @@ def init( self.is_profiler_done_event = is_profiler_done_event # is set by this proc to indicate no more flows are coming self.is_input_done_event = is_input_done_event + self.is_slips_live_updating_event = is_slips_live_updating_event self.is_running_non_stop: bool = self.db.is_running_non_stop() self.input_handlers = self._build_input_handlers() self.active_handler = None @@ -177,7 +176,7 @@ def read_configuration(self): self.packet_filter = self.packet_filter or conf.packet_filter() self.tcp_inactivity_timeout = conf.tcp_inactivity_timeout() self.enable_rotation = conf.rotation() - self.rotation_period = conf.rotation_period() + self.default_rotation_interval = conf.default_rotation_interval() self.keep_rotated_files_for = conf.keep_rotated_files_for() def stop_queues(self): diff --git a/slips_files/core/input/zeek/interface_input.py b/slips_files/core/input/zeek/interface_input.py index 071fb8ffd..dedb5cfa1 100644 --- a/slips_files/core/input/zeek/interface_input.py +++ b/slips_files/core/input/zeek/interface_input.py @@ -21,8 +21,8 @@ def run(self): """ runs when slips is given an interface with -i or 2 interfaces with -ap """ - self.input.zeek_utils.ensure_zeek_dir() - self.input.print(f"Storing zeek log files in {self.input.zeek_dir}") + zeek_dir: str = self.input.zeek_utils.create_zeek_output_dir() + self.input.print(f"Storing zeek log files in {zeek_dir}") if self.input.is_running_non_stop: self.file_remover.start() @@ -35,7 +35,7 @@ def run(self): interfaces_to_monitor.update( { self.input.args.interface: { - "dir": self.input.zeek_dir, + "dir": zeek_dir, "type": "main_interface", } } @@ -46,9 +46,7 @@ def run(self): # interfaces, wifi and eth. for _type, interface in self.db.get_ap_info().items(): # _type can be 'wifi_interface' or "ethernet_interface" - dir_to_store_interface_logs = os.path.join( - self.input.zeek_dir, interface - ) + dir_to_store_interface_logs = os.path.join(zeek_dir, interface) interfaces_to_monitor.update( { interface: { @@ -57,6 +55,7 @@ def run(self): } } ) + for interface, interface_info in interfaces_to_monitor.items(): interface_dir = interface_info["dir"] if not os.path.exists(interface_dir): diff --git a/slips_files/core/input/zeek/pcap_input.py b/slips_files/core/input/zeek/pcap_input.py index 9e1e1833a..b66ae29f3 100644 --- a/slips_files/core/input/zeek/pcap_input.py +++ b/slips_files/core/input/zeek/pcap_input.py @@ -17,8 +17,8 @@ def run(self): """ runs when slips is given a pcap with -f """ - self.input.zeek_utils.ensure_zeek_dir() - self.input.print(f"Storing zeek log files in {self.input.zeek_dir}") + zeek_dir: str = self.input.zeek_utils.create_zeek_output_dir() + self.input.print(f"Storing zeek log files in {zeek_dir}") if self.input.is_running_non_stop: self.file_remover.start() @@ -26,7 +26,7 @@ def run(self): # if bro does not receive any new line while reading a pcap self.input.bro_timeout = 30 self.input.zeek_utils.init_zeek( - self.observer, self.input.zeek_dir, self.input.given_path + self.observer, zeek_dir, self.input.given_path ) self.input.lines = self.input.zeek_utils.read_zeek_files() diff --git a/slips_files/core/input/zeek/utils/dos_protector.py b/slips_files/core/input/zeek/utils/dos_protector.py new file mode 100644 index 000000000..7bb802c23 --- /dev/null +++ b/slips_files/core/input/zeek/utils/dos_protector.py @@ -0,0 +1,144 @@ +import time + +from slips_files.common.slips_utils import utils +from slips_files.common.style import green + + +class DoSProtector: + def __init__(self, input): + self.input = input + self.db = self.input.db + self.is_running_non_stop: bool = self.db.is_running_non_stop() + # is slips (input.py) is given > this number of flow per min, + # this protector runs + self.flows_per_min_threshold = 20000 + self.flow_sampling_stop_time = 0 + # number of seconds slips is going to be skipping flows for before + # returning to normal (aka before going back to reading all flows) + self.sampling_time_window = 60 + self._is_now_sampling = False + + def _get_input_flows_per_min(self) -> int: + input_flows_per_s = ( + self.db.get_core_module_flows_per_second("Input") or 0 + ) + input_flows_per_min = int(input_flows_per_s) * 60 + return input_flows_per_min + + def _get_sampling_ratio(self) -> int: + """ + sr = flow_per_min² / 20000 + this sr is the number of flows we're gonna skip to protect slips + from DoS (or high traffic in general) + """ + input_flows_per_min = self._get_input_flows_per_min() + if not input_flows_per_min: + return 1 + + return input_flows_per_min**2 / 20000 + + def _should_run(self) -> bool: + """ + Returns true if slips is under high traffic and the DoS protector + should run. + Runs only when analysing an interface or a growing zeek dir. + return True if: + 1. if high traffic is detected + 2. we're in the 1 min window after slips has detected a high + traffic. this is the 1 min of skipping flows before rechecking if + the read number of flows has decreased. + """ + if not self.is_running_non_stop: + return False + + if time.time() < self.flow_sampling_stop_time: + # we should still be sampling. + return True + + input_flows_per_min = self._get_input_flows_per_min() + should_skip_flows = input_flows_per_min > self.flows_per_min_threshold + + if self._is_now_sampling and input_flows_per_min == 0: + # this means we justtt stopped sampling, now we want slips to + # keep thinking thta it's in a sampling state until we get a + # input_flows_per_min = something, once we have a number we can + # decide whether to stop sampling or not, but until then we want to keep the sampling state + pass + elif ( + not should_skip_flows + and self._is_now_sampling + and input_flows_per_min + ): + # slips was sampling and now stopped officially stopped, + # we have a input_flows_per_min that's less than the threshold. + self._is_now_sampling = False + self.input.print( + f"Throughput is back to normal. Input " + f"flows/min = {green(input_flows_per_min)}. " + f"Slips stopped skipping flows." + ) + + return should_skip_flows + + def _update_flow_sampling_stop_time_if_needed(self) -> bool: + """ + sets the next stop time to + now + sampling_time_window + if the time now exceeded the last registered flow_sampling_stop_time + """ + if time.time() > self.flow_sampling_stop_time: + # flow sampling is going to take place for the next 1 min + self.flow_sampling_stop_time = ( + time.time() + self.sampling_time_window + ) + return True + return False + + def get_number_of_flows_to_skip(self) -> int: + if not self._should_run(): + return 0 + + sampling_time_updated = ( + self._update_flow_sampling_stop_time_if_needed() + ) + + # -1 means read 1 flow every sampling_ratio flows. + # at 2000 flows/min → sr = 200, read 1 flow every 200 flows + # at 3000 flows/min → sr = 450, read 1 flow every 450 flows + # at 4000 flows/min → sr = 800, etc. + sampling_ratio = int(self._get_sampling_ratio() - 1) + self.print_skipping_flows_warning( + sampling_ratio, sampling_time_updated + ) + + return sampling_ratio + + def print_skipping_flows_warning( + self, sampling_ratio: int, sampling_time_updated: bool + ): + """Prints a warning every time slips decides to start sampling + again""" + if sampling_time_updated and sampling_ratio: + sr = green(f"1/{sampling_ratio}") + human_readable_time_to_stop_sampling = utils.convert_ts_format( + self.flow_sampling_stop_time, utils.alerts_format + ) + green_time_to_stop_sampling = green( + human_readable_time_to_stop_sampling + ) + if self._is_now_sampling: + # slips decided to extend the sampling period + self.input.print( + f"Slips is still under high " + f"traffic. The time to stop sampling has been extended to " + f"{green_time_to_stop_sampling} " + ) + else: + # reaching here means slips decided again to start sampling flows + self.input.print( + f"Slips started skipping flows due to high " + f"traffic for DoS protection. " + f"Sampling ratio: {sr} flows. " + f"Time to stop sampling: {green_time_to_stop_sampling} " + ) + self._is_now_sampling = True diff --git a/slips_files/core/input/zeek/utils/zeek_file_remover.py b/slips_files/core/input/zeek/utils/zeek_file_remover.py index 3a65cddaf..41f7a31da 100644 --- a/slips_files/core/input/zeek/utils/zeek_file_remover.py +++ b/slips_files/core/input/zeek/utils/zeek_file_remover.py @@ -1,17 +1,20 @@ # SPDX-FileCopyrightText: 2021 Sebastian Garcia # SPDX-License-Identifier: GPL-2.0-only -import datetime import json import os import threading +import time -from slips_files.common.slips_utils import utils from slips_files.core.supported_logfiles import SUPPORTED_LOGFILES class ZeekFileRemover: def __init__(self, input_process, zeek_utils): + """ + Handles deleting rotated zeek files. + :param input_process: Input.py instance that owns the channels. + """ self.input = input_process self.zeek_utils = zeek_utils self.thread = threading.Thread( @@ -22,6 +25,11 @@ def __init__(self, input_process, zeek_utils): self._started = False def start(self): + """ + Start the remover thread once and ensure the rotation channel exists. + + :return: None + """ if self._started: return self._started = True @@ -30,12 +38,46 @@ def start(self): self.thread.start() def shutdown_gracefully(self): + """ + Wait briefly for the remover thread to exit. + + :return: True + """ try: self.thread.join(3) except Exception: pass return True + def process_rotation_message(self, changed_files: dict): + """ + Close any stale handle for a rotated Zeek file and schedule cleanup. + + :param changed_files: a dict with old_file and new_file paths. + """ + # for example the old log file should be ./zeek_files/dns.2022-05-11-14-43-20.log + # new log file should be dns.log without the ts + old_log_file = changed_files["old_file"] + new_log_file = changed_files["new_file"] + new_logfile_without_path = new_log_file.split("/")[-1].split(".")[0] + + # ignored files have no open handle, so we should only delete them from disk + if new_logfile_without_path not in SUPPORTED_LOGFILES: + try: + # just delete the old file + os.remove(old_log_file) + except FileNotFoundError: + pass + return + + self.zeek_utils.close_rotated_file_handle(new_log_file) + # this file was just rotated. + rotated_at = time.time() + # zeek utils decides when to delete it. + self.zeek_utils.schedule_rotated_file_deletion( + old_log_file, rotated_at + ) + def remove_old_zeek_files(self): """ This thread waits for filemonitor.py to tell it that zeek changed the log files, @@ -47,39 +89,4 @@ def remove_old_zeek_files(self): # this channel receives renamed zeek log files, # we can safely delete them and close their handle changed_files = json.loads(msg["data"]) - - # for example the old log file should be ./zeek_files/dns.2022-05-11-14-43-20.log - # new log file should be dns.log without the ts - old_log_file = changed_files["old_file"] - new_log_file = changed_files["new_file"] - new_logfile_without_path = new_log_file.split("/")[-1].split( - "." - )[0] - # ignored files have no open handle, so we should only delete them from disk - if new_logfile_without_path not in SUPPORTED_LOGFILES: - # just delete the old file - os.remove(old_log_file) - continue - - # don't allow inputprocess to access the - # open_file_handlers dict until this thread sleeps again - lock = threading.Lock() - lock.acquire() - try: - # close slips' open handles - self.zeek_utils.open_file_handlers[new_log_file].close() - # delete cached filename - del self.zeek_utils.open_file_handlers[new_log_file] - except KeyError: - # we don't have a handle for that file, - # we probably don't need it in slips - # ex: loaded_scripts.log, stats.log etc.. - pass - # delete the old log file (the one with the ts) - self.zeek_utils.to_be_deleted.append(old_log_file) - self.zeek_utils.time_rotated = float( - utils.convert_ts_format( - datetime.datetime.now(), "unixtimestamp" - ) - ) - lock.release() + self.process_rotation_message(changed_files) diff --git a/slips_files/core/input/zeek/utils/zeek_input_utils.py b/slips_files/core/input/zeek/utils/zeek_input_utils.py index 63ed40653..5b77c3f86 100644 --- a/slips_files/core/input/zeek/utils/zeek_input_utils.py +++ b/slips_files/core/input/zeek/utils/zeek_input_utils.py @@ -8,70 +8,103 @@ import subprocess import threading import time - +from pathlib import Path +from typing import List, Tuple from re import split from slips_files.common.slips_utils import utils +from slips_files.core.input.zeek.utils.dos_protector import DoSProtector from slips_files.core.zeek_cmd_builder import ZeekCommandBuilder class ZeekInputUtils: def __init__(self, input_process): self.input = input_process - self.open_file_handlers = {} + self.open_file_handles = {} + self.open_file_handlers_lock = threading.RLock() self.cache_lines = {} self.file_time = {} self.last_updated_file_time = None - self.to_be_deleted = [] - self.time_rotated = None + self.rotated_files_to_delete: List[Tuple[str, float]] = [] self.zeek_files = {} self.zeek_threads = [] self.zeek_pids = [] + self.dos_protector = DoSProtector(self.input) + self.args = self.input.args + self.print = self.input.print + self.update_msg_printed = False + self.is_running_non_stop = self.input.db.is_running_non_stop() def check_if_time_to_del_rotated_files(self): """ After a specific period (keep_rotated_files_for), slips deletes all rotated files Check if it's time to do so """ - if not self.time_rotated: + if not self.rotated_files_to_delete: return False - now = float( - utils.convert_ts_format(datetime.datetime.now(), "unixtimestamp") - ) - time_to_delete = ( - now >= self.time_rotated + self.input.keep_rotated_files_for - ) - if time_to_delete: - # getting here means that the rotated - # files are kept enough ( keep_rotated_files_for seconds) - # and it's time to delete them - for file in self.to_be_deleted: - try: - os.remove(file) - except FileNotFoundError: - pass - self.to_be_deleted = [] - - def get_file_handle(self, filename): - # Update which files we know about - try: - # We already opened this file - file_handler = self.open_file_handlers[filename] - except KeyError: - # First time opening this file. + now = time.time() + while self.rotated_files_to_delete: + file, delete_after = self.rotated_files_to_delete.pop() + if now < delete_after: + # not time to del it yet + break + + try: + os.remove(file) + self.input.print( + f"Done deleting rotated zeek file:" f" {file}.", + log_to_logfiles_only=True, + ) + except FileNotFoundError: + pass + + def schedule_rotated_file_deletion( + self, file_path: str, rotated_at: float = None + ): + """ + Schedule a rotated Zeek logfile for deletion after the configured delay. + + :param file_path: Full path to the rotated logfile. + :param rotated_at: Rotation timestamp as a unix timestamp. + :return: None + """ + if rotated_at is None: + rotated_at = time.time() + + delete_after = rotated_at + self.input.keep_rotated_files_for + self.rotated_files_to_delete.append((file_path, delete_after)) + + def close_rotated_file_handle(self, filename: str): + """ + closes the given file's handle and removes it from + self.open_file_handlers + + :param filename: Full path to the active logfile name. + """ + with self.open_file_handlers_lock: + file_handler = self.open_file_handles.pop(filename, None) + + if file_handler is not None: + file_handler.close() + + def get_file_handle(self, filename: str): + with self.open_file_handlers_lock: + file_handle = self.open_file_handles.get(filename) + + if file_handle: + return file_handle + try: - file_handler = open(filename, "r") - lock = threading.Lock() - lock.acquire() - self.open_file_handlers[filename] = file_handler - lock.release() + # First time opening this file. + file_handle = open(filename, "r") + self.open_file_handles[filename] = file_handle # now that we replaced the old handle with the newly created file handle # delete the old .log file, that has a timestamp in its name. except FileNotFoundError: # for example dns.log # zeek changes the dns.log file name every 1d, it adds a - # timestamp to it it doesn't create the new dns.log until a + # timestamp to it, it doesn't create the new dns.log until a # new dns request # occurs # if slips tries to read from the old dns.log now it won't @@ -79,7 +112,7 @@ def get_file_handle(self, filename): # created yet simply continue until the new log file is # created and added to the zeek_files list return False - return file_handler + return file_handle def get_ts_from_line(self, zeek_line: str): """ @@ -111,8 +144,12 @@ def get_ts_from_line(self, zeek_line: str): def cache_nxt_line_in_file(self, filename: str, interface: str): """ - reads 1 line of the given file and stores in queue for sending to the profiler - :param: full path to the file. includes the .log extension + reads 1 line of the given file and stores in queue for sending to the + profiler + + :param filename: full path to the file. includes the .log extension + :param interface: interface that generated the Zeek file + :return: True if a line was cached, False otherwise """ file_handle = self.get_file_handle(filename) if not file_handle: @@ -127,30 +164,42 @@ def cache_nxt_line_in_file(self, filename: str, interface: str): # We don't have any waiting line for this file, so proceed try: - zeek_line = file_handle.readline() + flows_to_skip_reading_if_under_heavy_load: int = ( + self.dos_protector.get_number_of_flows_to_skip() + ) + + # skips flows + for _ in range(flows_to_skip_reading_if_under_heavy_load): + file_handle.readline() + + while zeek_line := file_handle.readline(): + if zeek_line.startswith("#close"): + # We reached the end of one of the files that we were + # reading. + return False + + if zeek_line.startswith("#fields"): + # this line contains the zeek fields, we want to cache it + # and send it to the profiler normally + nline = zeek_line + # to send the line as early as possible + timestamp = -1 + break + + timestamp, nline = self.get_ts_from_line(zeek_line) + if timestamp: + break + else: + # We reached the end of one of the files that we were reading. + # Wait for more lines to come from another file. + return False + except ValueError: # remover thread just finished closing all old handles. # comes here if I/O operation failed due to a closed file. # to get the new dict of open handles. return False - # Did the file end? - if not zeek_line or zeek_line.startswith("#close"): - # We reached the end of one of the files that we were reading. - # Wait for more lines to come from another file - return False - - if zeek_line.startswith("#fields"): - # this line contains the zeek fields, we want to cache it and - # send it to the profiler normally - nline = zeek_line - # to send the line as early as possible - timestamp = -1 - else: - timestamp, nline = self.get_ts_from_line(zeek_line) - if not timestamp: - return False - self.file_time[filename] = timestamp # Store the line in the cache self.cache_lines[filename] = { @@ -179,12 +228,16 @@ def reached_timeout(self) -> bool: return False def close_all_handles(self): - # We reach here after the break produced + # We reach here after the break that happens # if no zeek files are being updated. # No more files to read. Close the files - for file, handle in self.open_file_handlers.items(): - self.input.print(f"Closing file {file}", 2, 0) - handle.close() + with self.open_file_handlers_lock: + handles = list(self.open_file_handles.items()) + self.open_file_handles = {} + + for file, handle in handles: + self.input.print(f"Closing file {file}", 2, 0) + handle.close() def get_earliest_line(self): """ @@ -210,6 +263,15 @@ def get_earliest_line(self): earliest_line = self.cache_lines[file_with_earliest_flow] return earliest_line, file_with_earliest_flow + def _print_update_msg(self): + if not self.update_msg_printed: + self.print( + "Slips is live updating. Slips will stop receiving new " + "flows in this instance and start receiving new flows using " + "the updated version. " + ) + self.update_msg_printed = True + def read_zeek_files(self) -> int: """ Runs when slips is analyzing pcaps, interface, zeek dirs, and zeek @@ -217,7 +279,7 @@ def read_zeek_files(self) -> int: """ try: self.zeek_files = self.input.db.get_all_zeek_files() - self.open_file_handlers = {} + self.open_file_handles = {} # stores zeek_log_file_name: timestamp of the last flow read from # that file self.file_time = {} @@ -225,20 +287,56 @@ def read_zeek_files(self) -> int: # Try to keep track of when was the last update so we stop this # reading self.last_updated_file_time = datetime.datetime.now() - while not self.input.should_stop(): + is_draining = False + while True: + is_live_updating = ( + self.input.is_slips_live_updating_event is not None + and self.input.is_slips_live_updating_event.is_set() + ) + if is_live_updating and not is_draining: + # Stop Zeek first so this instance has a finite set of + # generated logs to drain before the updated instance + # continues. + self._print_update_msg() + self.shutdown_zeek_runtime() + self.zeek_files = self.input.db.get_all_zeek_files() + is_draining = True + + if self.input.should_stop() and not is_draining: + break + self.check_if_time_to_del_rotated_files() + # implemented in icore.py self.input.store_flows_read_per_second() # Go to all the files generated by Zeek and read 1 # line from each of them + + # PS: self.zeek_files ties each zeek file to its interface ( + # beacause slips supports reading multiple interfaces) + + if is_draining: + self.zeek_files = self.input.db.get_all_zeek_files() + + cached_new_line = False for filename, interface in self.zeek_files.items(): if utils.is_ignored_zeek_log_file(filename): continue # reads 1 line from the given file and cache it # from in self.cache_lines - self.cache_nxt_line_in_file(filename, interface) + if self.cache_nxt_line_in_file(filename, interface): + self.last_updated_file_time = datetime.datetime.now() + cached_new_line = True + + if ( + is_draining + and not cached_new_line + and not self.cache_lines + ): + # done draining the flows left + break if self.reached_timeout(): break @@ -250,29 +348,58 @@ def read_zeek_files(self) -> int: continue # self.print('\t> Sent Line: {}'.format(earliest_line), 0, 3) - self.input.give_profiler(earliest_line) self.input.lines += 1 - # when testing, no need to read the whole file! + + # when testing, no need to read the whole file! #TODO this + # is bad practice, fix it if self.input.lines == 10 and self.input.testing: break + # Delete this line from the cache and the time list del self.cache_lines[file_with_earliest_flow] del self.file_time[file_with_earliest_flow] - # Get the new list of files. Since new files may have been created by - # Zeek while we were processing them. + # Get the new list of files. Since new files may have been + # created by Zeek while we were processing them. self.zeek_files = self.input.db.get_all_zeek_files() - self.close_all_handles() except KeyboardInterrupt: pass return self.input.lines - def ensure_zeek_dir(self): - if not os.path.exists(self.input.zeek_dir): - os.makedirs(self.input.zeek_dir) + def _is_auto_update_enabled(self) -> bool: + """ + returns true if slips is analyzing an interface (-i , -ap or -g) + and auto_update is enabled in slips.yaml + """ + return self.is_running_non_stop and self.input.conf.auto_update_slips() + + def create_zeek_output_dir(self) -> str: + """ + Return the Zeek output directory, create it if needed, + and store its path in the DB. + + :return: Directory where Zeek should write log files. + """ + + without_ext = Path(self.input.given_path).stem + if self.input.conf.store_zeek_files_in_the_output_dir(): + zeek_dir = Path(self.input.args.output) / "zeek_files" + else: + zeek_dir = Path(f"zeek_files_{without_ext}") + + if self._is_auto_update_enabled(): + # slips is gonna be auto updating for each new version, we need + # 1 zeek dir for each started version + zeek_dir = Path(zeek_dir) / f"slips_v{utils.get_current_version()}" + + zeek_dir = str(zeek_dir) + + Path(zeek_dir).mkdir(parents=True, exist_ok=True) + self.input.db.set_input_metadata({"zeek_dir": zeek_dir}) + return zeek_dir def init_zeek( self, @@ -291,7 +418,7 @@ def init_zeek( observer.start(zeek_dir, pcap_or_interface) zeek_files = os.listdir(zeek_dir) - if len(zeek_files) > 0: + if len(zeek_files) > 0 and not self.args.is_slips_started_by_an_update: # First clear the zeek folder of old .log files for file_name in zeek_files: os.remove(os.path.join(zeek_dir, file_name)) @@ -323,7 +450,7 @@ def _construct_zeek_cmd(self, pcap_or_interface: str, tcpdump_filter=None): builder = ZeekCommandBuilder( zeek_or_bro=self.input.zeek_or_bro, input_type=self.input.input_type, - rotation_period=self.input.rotation_period, + default_rotation_interval=self.input.default_rotation_interval, enable_rotation=self.input.enable_rotation, tcp_inactivity_timeout=self.input.tcp_inactivity_timeout, packet_filter=self.input.packet_filter, @@ -358,7 +485,8 @@ def run_zeek(self, zeek_logs_dir, pcap_or_interface, tcpdump_filter=None): print(f"Zeek: {out}") if error: self.input.print( - f"Zeek error. return code: {zeek.returncode} error:{error.strip()}" + f"Zeek error. return code: {zeek.returncode} " + f"error:{error.strip()}" ) def shutdown_zeek_runtime(self): diff --git a/slips_files/core/input/zeek/zeek_dir_input.py b/slips_files/core/input/zeek/zeek_dir_input.py index 5efa851b0..b8acea1c2 100644 --- a/slips_files/core/input/zeek/zeek_dir_input.py +++ b/slips_files/core/input/zeek/zeek_dir_input.py @@ -38,9 +38,7 @@ def run(self): # know the interface, hence the "default" interface = "default" - self.input.zeek_dir = self.input.given_path - - self.observer.start(self.input.zeek_dir, interface) + self.observer.start(self.input.given_path, interface) if self.input.is_running_non_stop: self.file_remover.start() diff --git a/slips_files/core/output.py b/slips_files/core/output.py index c3e448d7f..01a863b82 100644 --- a/slips_files/core/output.py +++ b/slips_files/core/output.py @@ -34,7 +34,7 @@ class Output(IObserver): or logs, it should use The printer that uses this process. """ - name = "Output" + name = "output" slips_logfile_lock = Lock() errors_logfile_lock = Lock() cli_lock = Lock() @@ -43,11 +43,12 @@ def __init__( self, verbose=1, debug=0, - stderr="output/errors.log", - slips_logfile="output/slips.log", + stderr="errors.log", + slips_logfile="slips.log", input_type=False, create_logfiles: bool = True, stdout="", + slips_args=None, ): super().__init__() # when running slips using -e , this var is set and we only @@ -58,6 +59,7 @@ def __init__( self.input_type = input_type self.errors_logfile = stderr self.slips_logfile = slips_logfile + self.args = slips_args if self.verbose > 2: print(f"Verbosity: {self.verbose}. Debugging: {self.debug}") @@ -71,10 +73,10 @@ def __init__( # root (if slips was started by root) os.umask(0) self._read_configuration() - self.create_logfile(self.errors_logfile) - self.log_branch_info(self.errors_logfile) - self.create_logfile(self.slips_logfile) - self.log_branch_info(self.slips_logfile) + if self.create_logfile(self.errors_logfile): + self.log_branch_info(self.errors_logfile) + if self.create_logfile(self.slips_logfile): + self.log_branch_info(self.slips_logfile) utils.change_logfiles_ownership( self.errors_logfile, self.UID, self.GID @@ -112,13 +114,20 @@ def log_branch_info(self, logfile: str): def create_logfile(self, path): """ creates slips.log and errors.log if they don't exist + :return: True if the file was initialized, False otherwise. """ + if getattr(self.args, "is_slips_started_by_an_update", False) is True: + return False + try: open(path, "a").close() + return True except FileNotFoundError: p = Path(os.path.dirname(path)) p.mkdir(parents=True, exist_ok=True) - open(path, "w").close() + return utils.initialize_logfile( + path, False, create_parent_dirs=False + ) def log_line(self, msg: dict): """ diff --git a/slips_files/core/profiler.py b/slips_files/core/profiler.py index a87b7f23d..c23c0ac22 100644 --- a/slips_files/core/profiler.py +++ b/slips_files/core/profiler.py @@ -63,7 +63,7 @@ class Profiler(ICore, IObservable): """A class to create the profiles for IPs""" - name = "Profiler" + name = "profiler" def init( self, @@ -213,10 +213,10 @@ def get_msg_from_queue(self, q: multiprocessing.Queue): def start_profiler_worker(self, worker_id: int = None): """starts A profiler worker for faster processing of the flows""" - worker_name = f"ProfilerWorker_Process_{worker_id}" + worker_name = f"profiler_worker_process_{worker_id}" worker = ProfilerWorker( logger=self.logger, - output_dir=self.output_dir, + output_dir=self.parent_output_dir, redis_port=self.redis_port, termination_event=self.termination_event, conf=self.conf, @@ -330,8 +330,8 @@ def _check_if_high_throughput_and_add_workers(self): if not self.did_5min_pass_since_last_throughput_check(): return - profiler_fps = self.db.get_module_flows_per_second(self.name) or 0 - input_fps = self.db.get_module_flows_per_second("Input") or 0 + profiler_fps = self.db.get_core_module_flows_per_second(self.name) or 0 + input_fps = self.db.get_core_module_flows_per_second("Input") or 0 if float(input_fps) > ( float(profiler_fps) * 1.1 ): # 10% more input fps than profiler fps @@ -341,7 +341,7 @@ def _check_if_high_throughput_and_add_workers(self): self.print( f"Warning: High throughput detected. Started " f"additional worker: " - f"ProfilerWorker_{worker_id} to handle the flows." + f"profiler_worker_{worker_id} to handle the flows." ) if self.last_worker_id == self.max_workers - 1: diff --git a/slips_files/core/profiler_worker.py b/slips_files/core/profiler_worker.py index c43cf3f1c..23d416542 100644 --- a/slips_files/core/profiler_worker.py +++ b/slips_files/core/profiler_worker.py @@ -33,7 +33,7 @@ class ProfilerWorker(IModule): - name = "ProfilerWorker" + name = "profiler_worker" def init( self, @@ -147,7 +147,7 @@ def _get_slips_start_time(self) -> float: return time.time() def _get_latency_filename_prefix(self) -> str: - if self.name.startswith("ProfilerWorker_Process_"): + if self.name.startswith("profiler_worker_process_"): worker_id = self.name.split("_")[-1] return f"profiler_worker_{worker_id}" return self.name.lower() @@ -555,7 +555,7 @@ def pre_main(self): """ worker_number = self.name.split("_")[-1] self.print( - f"Started Profiler Worker {green(worker_number)} [PID" + f"Started {green('Profiler Worker')} {green(worker_number)} [PID" f" {green(os.getpid())}]" ) diff --git a/slips_files/core/text_formatters/evidence_formatter.py b/slips_files/core/text_formatters/evidence_formatter.py index bdbe7e5d3..b22d32a27 100644 --- a/slips_files/core/text_formatters/evidence_formatter.py +++ b/slips_files/core/text_formatters/evidence_formatter.py @@ -132,7 +132,7 @@ def add_threat_level_to_evidence_description( self, evidence: Evidence ) -> Evidence: evidence.description += ( - f" threat level: " f"{evidence.threat_level.name.lower()}." + f" Threat level: " f"{evidence.threat_level.name.lower()}." ) return evidence diff --git a/slips_files/core/zeek_cmd_builder.py b/slips_files/core/zeek_cmd_builder.py index 39d52c217..4ffd6cd4d 100644 --- a/slips_files/core/zeek_cmd_builder.py +++ b/slips_files/core/zeek_cmd_builder.py @@ -13,14 +13,15 @@ def __init__( self, zeek_or_bro: str, input_type: InputType, - rotation_period: str, + default_rotation_interval: str, enable_rotation: bool, tcp_inactivity_timeout: int, packet_filter: Optional[str] = None, ): self.zeek_or_bro = zeek_or_bro self.input_type = input_type - self.rotation_period = rotation_period + # this represents the zeek default_rotation_interval parameter + self.default_rotation_interval = default_rotation_interval self.enable_rotation = enable_rotation self.tcp_inactivity_timeout = tcp_inactivity_timeout self.packet_filter = packet_filter @@ -40,11 +41,11 @@ def _get_input_parameter(self, pcap_or_interface: str) -> List[str]: def _get_rotation_args(self) -> List[str]: # rotation is disabled unless it's an interface if self.input_type == InputType.INTERFACE and self.enable_rotation: - # how often to rotate zeek files? taken from slips.yaml + # default_rotation_interval is how often to rotate zeek files? + # taken from slips.yaml return [ "-e", - f'"redef Log::default_rotation_interval =' - f' {self.rotation_period} ;"', + f"redef Log::default_rotation_interval={self.default_rotation_interval};", ] return [] @@ -106,8 +107,6 @@ def build( f"redef tcp_inactivity_timeout={self.tcp_inactivity_timeout}mins;", *rotation, zeek_scripts_dir, - # putting -f last is best practice *packet_filter, ] - return command diff --git a/slips_files/organizations_info/apple b/slips_files/organizations_info/apple deleted file mode 100644 index 2bf150029..000000000 --- a/slips_files/organizations_info/apple +++ /dev/null @@ -1,2400 +0,0 @@ -17.108.0.0/16 -17.102.0.0/16 -17.207.0.0/16 -17.250.48.0/24 -17.252.65.0/24 -17.250.248.0/23 -17.250.48.0/23 -17.64.0.0/16 -17.65.0.0/16 -17.66.0.0/17 -17.67.232.0/22 -17.67.236.0/22 -17.70.0.0/16 -17.71.0.0/16 -17.72.0.0/16 -17.74.0.0/16 -17.76.0.0/16 -17.78.0.0/16 -17.79.0.0/16 -17.232.0.0/16 -17.240.0.0/16 -17.241.0.0/16 -17.152.0.0/16 -17.153.0.0/16 -17.113.0.0/16 -17.27.0.0/16 -17.116.0.0/16 -17.109.0.0/16 -17.219.100.0/22 -17.31.0.0/16 -17.78.224.0/20 -17.45.22.0/23 -17.45.132.0/23 -17.45.20.0/23 -17.45.24.0/23 -17.45.26.0/23 -17.45.28.0/23 -17.45.30.0/23 -17.45.32.0/23 -17.45.48.0/21 -17.45.56.0/21 -17.45.128.0/23 -17.45.130.0/23 -17.45.134.0/23 -17.45.136.0/23 -17.45.138.0/23 -17.45.144.0/22 -17.45.160.0/21 -17.45.168.0/21 -17.45.176.0/21 -17.45.184.0/21 -17.45.200.0/21 -17.45.240.0/20 -17.45.36.0/22 -17.77.133.0/24 -17.78.32.0/21 -17.130.0.0/17 -17.132.0.0/17 -17.132.32.0/19 -17.112.0.0/16 -17.254.0.0/24 -17.254.1.0/24 -17.254.2.0/24 -17.254.4.0/22 -17.254.3.0/24 -17.254.4.0/24 -17.112.128.0/17 -17.254.8.0/22 -17.254.8.0/24 -17.250.128.0/17 -17.252.128.0/17 -17.249.128.0/17 -198.183.16.0/24 -17.200.0.0/14 -17.200.0.0/16 -17.201.0.0/16 -17.202.0.0/16 -205.180.175.0/24 -17.203.0.0/16 -17.250.0.0/16 -17.126.0.0/15 -17.126.0.0/16 -17.103.0.0/16 -17.104.0.0/16 -17.126.0.0/22 -17.112.140.0/24 -17.112.140.0/22 -17.64.0.0/12 -17.87.0.0/16 -17.81.0.0/16 -17.86.0.0/16 -17.254.48.0/23 -17.254.248.0/23 -17.254.32.0/24 -17.239.0.0/16 -17.64.0.0/15 -17.67.240.0/22 -17.67.248.0/22 -17.69.4.0/22 -17.69.8.0/22 -17.69.10.0/23 -17.69.16.0/22 -17.69.20.0/22 -17.69.32.0/22 -17.69.36.0/22 -17.69.40.0/22 -17.69.44.0/22 -17.69.60.0/22 -17.69.100.0/22 -17.69.104.0/22 -17.69.112.0/22 -17.69.116.0/22 -17.69.156.0/22 -17.69.160.0/22 -17.69.164.0/22 -17.69.232.0/21 -17.70.100.0/22 -17.72.0.0/13 -17.73.0.0/17 -17.73.128.0/17 -17.76.20.0/22 -17.76.24.0/22 -17.77.32.0/22 -17.78.124.0/22 -17.154.0.0/16 -17.66.0.0/16 -17.66.116.0/22 -17.69.56.0/22 -17.74.220.0/22 -17.74.224.0/22 -17.76.48.0/22 -17.79.8.0/22 -17.90.0.0/15 -17.134.0.0/17 -17.78.128.0/21 -17.78.144.0/21 -17.78.140.0/22 -17.88.0.0/16 -17.78.138.0/23 -17.78.138.0/24 -17.78.139.0/24 -17.254.252.0/24 -17.254.254.0/24 -17.254.253.0/24 -17.254.255.0/24 -17.67.212.0/22 -17.67.216.0/21 -17.232.0.0/15 -17.240.0.0/15 -17.44.0.0/15 -17.132.128.0/17 -17.132.128.0/18 -17.132.192.0/18 -17.46.0.0/16 -17.85.0.0/16 -17.193.12.0/22 -17.195.12.0/22 -17.195.96.0/21 -17.254.20.0/22 -17.185.0.0/16 -17.235.224.0/20 -17.235.240.0/20 -17.69.34.0/24 -17.69.35.0/24 -17.255.248.0/23 -17.255.250.0/23 -144.178.0.0/18 -17.0.0.0/8 -17.0.0.0/9 -17.0.0.0/21 -17.0.64.0/18 -17.0.128.0/18 -17.0.225.0/24 -17.1.0.0/19 -17.1.64.0/18 -17.1.64.0/24 -17.1.74.0/24 -17.1.78.0/24 -17.1.86.0/24 -17.1.100.0/24 -17.1.102.0/24 -17.1.111.0/24 -17.1.128.0/18 -17.1.128.0/24 -17.1.134.0/24 -17.1.144.0/24 -17.1.146.0/24 -17.1.148.0/24 -17.1.150.0/24 -17.1.152.0/24 -17.1.154.0/24 -17.1.158.0/24 -17.1.160.0/24 -17.1.162.0/24 -17.1.164.0/24 -17.1.166.0/24 -17.1.168.0/24 -17.1.172.0/24 -17.1.176.0/24 -17.1.178.0/24 -17.1.180.0/24 -17.1.182.0/24 -17.1.186.0/24 -17.1.190.0/24 -17.1.193.0/24 -17.1.197.0/24 -17.1.250.0/23 -17.16.0.0/12 -17.16.48.0/21 -17.16.64.0/21 -17.16.72.0/21 -17.16.80.0/21 -17.16.88.0/21 -17.16.96.0/21 -17.16.104.0/21 -17.16.112.0/21 -17.16.120.0/21 -17.16.128.0/21 -17.16.136.0/21 -17.16.144.0/21 -17.16.152.0/21 -17.16.160.0/21 -17.16.168.0/21 -17.16.176.0/21 -17.16.184.0/21 -17.16.192.0/21 -17.16.200.0/21 -17.16.208.0/21 -17.16.216.0/21 -17.16.216.0/23 -17.16.224.0/21 -17.16.232.0/21 -17.16.240.0/21 -17.16.248.0/21 -17.17.0.0/21 -17.17.8.0/21 -17.17.24.0/21 -17.17.32.0/21 -17.17.40.0/21 -17.17.48.0/21 -17.17.56.0/21 -17.17.64.0/21 -17.17.72.0/21 -17.17.80.0/21 -17.17.88.0/21 -17.17.96.0/21 -17.17.104.0/21 -17.17.112.0/21 -17.17.120.0/21 -17.17.128.0/21 -17.17.136.0/21 -17.17.144.0/21 -17.17.152.0/21 -17.17.152.0/23 -17.17.160.0/21 -17.17.168.0/21 -17.17.176.0/21 -17.17.184.0/21 -17.17.192.0/21 -17.17.200.0/21 -17.17.208.0/21 -17.17.216.0/21 -17.17.224.0/21 -17.17.232.0/21 -17.17.240.0/21 -17.17.248.0/21 -17.18.0.0/21 -17.18.0.0/24 -17.18.8.0/21 -17.18.16.0/21 -17.18.24.0/21 -17.18.32.0/21 -17.18.40.0/21 -17.18.56.0/21 -17.18.64.0/21 -17.18.72.0/21 -17.18.80.0/21 -17.18.88.0/21 -17.18.96.0/21 -17.18.104.0/21 -17.18.112.0/21 -17.18.120.0/21 -17.18.128.0/21 -17.18.136.0/21 -17.18.144.0/21 -17.18.160.0/21 -17.18.168.0/21 -17.18.176.0/21 -17.18.184.0/21 -17.18.192.0/21 -17.18.200.0/21 -17.18.208.0/21 -17.18.208.0/24 -17.18.216.0/21 -17.18.224.0/21 -17.18.232.0/21 -17.18.240.0/21 -17.18.248.0/21 -17.19.0.0/21 -17.19.8.0/21 -17.19.16.0/21 -17.19.24.0/21 -17.19.32.0/21 -17.19.40.0/21 -17.19.48.0/21 -17.19.56.0/21 -17.19.64.0/21 -17.19.72.0/21 -17.19.80.0/21 -17.19.88.0/21 -17.19.96.0/21 -17.19.104.0/21 -17.19.112.0/21 -17.19.120.0/21 -17.19.128.0/21 -17.19.136.0/21 -17.19.144.0/21 -17.19.152.0/21 -17.19.160.0/21 -17.19.168.0/21 -17.19.176.0/21 -17.19.184.0/21 -17.19.192.0/21 -17.19.200.0/21 -17.19.208.0/21 -17.19.216.0/21 -17.19.224.0/21 -17.19.232.0/21 -17.19.240.0/21 -17.19.248.0/21 -17.20.0.0/21 -17.20.8.0/21 -17.20.16.0/21 -17.20.24.0/21 -17.20.32.0/21 -17.20.40.0/21 -17.20.48.0/21 -17.20.56.0/21 -17.20.64.0/21 -17.20.72.0/21 -17.20.80.0/21 -17.20.88.0/21 -17.20.96.0/21 -17.20.104.0/21 -17.20.112.0/21 -17.20.120.0/21 -17.20.128.0/21 -17.20.136.0/21 -17.20.152.0/21 -17.20.160.0/21 -17.20.168.0/21 -17.20.176.0/21 -17.20.192.0/21 -17.20.200.0/21 -17.20.208.0/21 -17.20.216.0/21 -17.20.224.0/21 -17.20.232.0/21 -17.20.240.0/21 -17.20.248.0/21 -17.21.8.0/21 -17.21.16.0/21 -17.21.24.0/21 -17.21.32.0/21 -17.21.40.0/21 -17.21.48.0/21 -17.21.56.0/21 -17.21.64.0/21 -17.21.72.0/21 -17.21.80.0/21 -17.21.88.0/21 -17.21.96.0/21 -17.21.104.0/21 -17.21.112.0/21 -17.21.120.0/21 -17.21.128.0/21 -17.21.136.0/21 -17.21.152.0/21 -17.21.160.0/21 -17.21.168.0/21 -17.24.0.0/13 -17.24.64.0/21 -17.24.80.0/21 -17.24.104.0/21 -17.24.112.0/21 -17.24.120.0/21 -17.24.136.0/21 -17.24.144.0/21 -17.24.160.0/21 -17.24.176.0/21 -17.24.184.0/21 -17.24.200.0/21 -17.24.216.0/21 -17.24.224.0/21 -17.24.240.0/21 -17.24.248.0/21 -17.25.0.0/21 -17.25.8.0/21 -17.25.24.0/21 -17.25.32.0/21 -17.25.40.0/21 -17.25.112.0/21 -17.25.120.0/21 -17.25.136.0/21 -17.25.144.0/21 -17.25.192.0/21 -17.25.200.0/21 -17.25.208.0/21 -17.25.216.0/21 -17.25.224.0/21 -17.25.232.0/21 -17.25.248.0/21 -17.26.16.0/21 -17.26.24.0/21 -17.26.32.0/21 -17.26.56.0/21 -17.26.64.0/21 -17.26.72.0/21 -17.26.88.0/21 -17.26.96.0/21 -17.26.104.0/21 -17.26.168.0/21 -17.26.200.0/21 -17.26.216.0/21 -17.26.224.0/21 -17.26.240.0/21 -17.26.248.0/21 -17.27.16.0/21 -17.27.32.0/21 -17.27.56.0/21 -17.27.80.0/21 -17.27.88.0/21 -17.27.96.0/21 -17.27.112.0/21 -17.27.136.0/21 -17.27.152.0/21 -17.27.168.0/21 -17.27.192.0/21 -17.27.200.0/21 -17.27.224.0/21 -17.27.240.0/21 -17.28.56.0/21 -17.28.88.0/21 -17.28.96.0/21 -17.28.104.0/21 -17.28.112.0/21 -17.28.128.0/21 -17.28.152.0/21 -17.32.0.0/16 -17.34.0.0/16 -17.35.240.0/20 -17.36.0.0/15 -17.38.0.0/15 -17.40.0.0/15 -17.42.0.0/16 -17.43.0.0/16 -17.43.0.0/17 -17.43.0.0/19 -17.43.128.0/17 -17.44.0.0/16 -17.44.0.0/17 -17.44.88.0/21 -17.44.128.0/17 -17.44.160.0/22 -17.44.176.0/21 -17.44.216.0/21 -17.45.0.0/16 -17.45.0.0/17 -17.45.44.0/22 -17.45.112.0/20 -17.45.128.0/17 -17.45.152.0/22 -17.45.156.0/22 -17.45.192.0/21 -17.45.224.0/20 -17.45.252.0/22 -17.47.0.0/20 -17.47.1.0/24 -17.47.2.0/24 -17.47.3.0/24 -17.47.48.0/24 -17.47.49.0/24 -17.47.126.0/23 -17.47.128.0/17 -17.50.0.0/16 -17.50.16.0/21 -17.50.24.0/21 -17.50.48.0/21 -17.56.0.0/22 -17.56.8.0/24 -17.56.10.0/23 -17.56.12.0/23 -17.56.16.0/24 -17.56.48.0/21 -17.56.128.0/22 -17.56.136.0/24 -17.56.138.0/23 -17.56.140.0/23 -17.56.144.0/24 -17.56.160.0/23 -17.57.0.0/22 -17.57.8.0/24 -17.57.12.0/23 -17.57.16.0/24 -17.57.32.0/21 -17.58.0.0/20 -17.58.16.0/20 -17.58.32.0/20 -17.58.64.0/21 -17.58.72.0/22 -17.58.76.0/22 -17.58.80.0/20 -17.58.96.0/21 -17.58.128.0/18 -17.67.0.0/16 -17.67.32.0/20 -17.67.48.0/20 -17.67.80.0/20 -17.67.104.0/21 -17.67.120.0/22 -17.67.128.0/18 -17.67.192.0/22 -17.67.196.0/23 -17.67.198.0/23 -17.67.200.0/22 -17.67.204.0/22 -17.67.208.0/22 -17.67.224.0/20 -17.67.244.0/22 -17.68.0.0/16 -17.69.0.0/16 -17.69.32.0/24 -17.69.33.0/24 -17.69.192.0/20 -17.69.208.0/21 -17.69.224.0/21 -17.69.232.0/22 -17.69.236.0/22 -17.69.240.0/21 -17.70.0.0/15 -17.72.64.0/18 -17.72.64.0/19 -17.72.96.0/19 -17.73.0.0/16 -17.74.0.0/15 -17.77.0.0/16 -17.77.0.0/17 -17.77.128.0/17 -17.78.192.0/20 -17.78.200.0/23 -17.78.208.0/21 -17.78.224.0/19 -17.78.232.0/23 -17.82.0.0/16 -17.83.0.0/16 -17.83.0.0/17 -17.83.55.0/24 -17.83.128.0/17 -17.84.0.0/16 -17.84.128.0/23 -17.84.143.0/24 -17.84.192.0/22 -17.84.196.0/23 -17.84.198.0/24 -17.84.199.0/24 -17.84.200.0/21 -17.84.208.0/24 -17.85.128.0/17 -17.87.0.0/17 -17.87.128.0/17 -17.88.0.0/17 -17.88.128.0/17 -17.91.16.0/21 -17.91.24.0/21 -17.91.32.0/21 -17.91.40.0/21 -17.91.48.0/21 -17.91.56.0/21 -17.91.72.0/21 -17.91.80.0/21 -17.91.88.0/21 -17.91.96.0/21 -17.91.104.0/21 -17.91.136.0/21 -17.91.144.0/21 -17.91.160.0/21 -17.91.168.0/21 -17.91.176.0/21 -17.91.200.0/21 -17.92.0.0/17 -17.92.128.0/17 -17.93.0.0/16 -17.94.0.0/16 -17.96.0.0/16 -17.97.0.0/16 -17.97.128.0/19 -17.97.176.0/20 -17.98.0.0/16 -17.99.0.0/16 -17.106.0.0/15 -17.108.0.0/15 -17.110.0.0/15 -17.110.112.0/20 -17.111.2.0/23 -17.112.0.0/15 -17.113.128.0/17 -17.114.0.0/15 -17.120.0.0/16 -17.121.0.0/18 -17.121.128.0/17 -17.122.0.0/18 -17.122.0.0/20 -17.122.16.0/20 -17.122.33.0/24 -17.122.64.0/18 -17.122.192.0/20 -17.122.248.0/21 -17.123.0.0/18 -17.123.0.0/20 -17.123.16.0/24 -17.123.64.0/18 -17.124.0.0/16 -17.125.0.0/16 -17.127.64.0/20 -17.128.0.0/9 -17.128.100.0/22 -17.128.106.0/23 -17.128.108.0/22 -17.128.112.0/22 -17.128.124.0/23 -17.128.126.0/24 -17.129.0.0/16 -17.130.0.0/16 -17.131.0.0/16 -17.132.4.0/22 -17.132.4.0/24 -17.132.5.0/24 -17.132.6.0/24 -17.132.18.0/24 -17.132.19.0/24 -17.132.20.0/23 -17.132.22.0/23 -17.132.24.0/24 -17.132.25.0/24 -17.132.26.0/24 -17.132.27.0/24 -17.132.28.0/22 -17.132.28.0/24 -17.132.29.0/24 -17.132.30.0/24 -17.132.31.0/24 -17.132.64.0/18 -17.132.91.0/24 -17.132.96.0/20 -17.133.0.0/16 -17.134.0.0/16 -17.135.0.0/16 -17.136.0.0/16 -17.137.0.0/16 -17.138.0.0/15 -17.139.32.0/20 -17.140.0.0/19 -17.140.32.0/21 -17.140.34.0/23 -17.140.40.0/21 -17.140.42.0/24 -17.140.44.0/24 -17.140.48.0/20 -17.140.64.0/19 -17.140.80.0/20 -17.140.96.0/19 -17.140.128.0/17 -17.141.0.0/16 -17.142.0.0/15 -17.144.0.0/16 -17.146.0.0/16 -17.147.0.0/16 -17.148.0.0/14 -17.152.0.0/14 -17.158.0.0/15 -17.160.0.0/12 -17.164.0.0/14 -17.168.0.0/13 -17.171.63.0/24 -17.173.232.0/21 -17.176.0.0/15 -17.178.0.0/15 -17.179.78.0/24 -17.180.0.0/14 -17.184.0.0/16 -17.186.0.0/16 -17.187.0.0/24 -17.187.48.0/20 -17.187.128.0/18 -17.187.192.0/18 -17.188.66.0/24 -17.188.67.0/24 -17.188.68.0/23 -17.188.70.0/23 -17.188.128.0/20 -17.188.144.0/20 -17.188.160.0/20 -17.188.192.0/22 -17.188.192.0/24 -17.188.193.0/24 -17.188.194.0/24 -17.188.195.0/24 -17.188.196.0/22 -17.188.196.0/24 -17.188.197.0/24 -17.188.198.0/24 -17.188.199.0/24 -17.188.200.0/21 -17.188.208.0/21 -17.193.0.0/18 -17.197.0.0/16 -17.197.165.0/24 -17.197.166.0/24 -17.198.0.0/15 -17.198.180.0/24 -17.198.181.0/24 -17.199.166.0/24 -17.200.0.0/13 -17.200.64.0/20 -17.200.112.0/21 -17.200.120.0/21 -17.207.48.0/24 -17.207.49.0/24 -17.208.0.0/15 -17.209.75.0/24 -17.209.77.0/24 -17.209.156.0/22 -17.209.176.0/22 -17.209.202.0/24 -17.211.0.0/19 -17.211.128.0/20 -17.212.0.0/14 -17.216.0.0/13 -17.216.0.0/16 -17.218.20.0/24 -17.218.21.0/24 -17.220.176.0/24 -17.220.177.0/24 -17.224.0.0/14 -17.225.16.0/24 -17.225.17.0/24 -17.226.7.0/24 -17.228.0.0/15 -17.229.102.0/24 -17.229.103.0/24 -17.231.64.0/18 -17.233.0.0/16 -17.233.112.0/21 -17.233.120.0/21 -17.233.240.0/24 -17.233.241.0/24 -17.233.242.0/24 -17.233.243.0/24 -17.234.0.0/17 -17.234.0.0/20 -17.234.16.0/20 -17.234.32.0/20 -17.234.48.0/20 -17.234.64.0/20 -17.234.80.0/20 -17.234.96.0/20 -17.234.112.0/20 -17.234.128.0/20 -17.234.144.0/20 -17.234.160.0/20 -17.234.176.0/20 -17.234.192.0/20 -17.234.208.0/20 -17.234.224.0/20 -17.234.240.0/20 -17.235.0.0/18 -17.235.0.0/20 -17.235.16.0/20 -17.235.32.0/20 -17.235.48.0/20 -17.235.128.0/20 -17.235.144.0/20 -17.235.192.0/20 -17.235.208.0/20 -17.236.0.0/15 -17.238.0.0/15 -17.242.16.0/20 -17.242.32.0/20 -17.242.48.0/20 -17.242.120.0/21 -17.244.0.0/14 -17.248.128.0/17 -17.248.128.0/19 -17.248.142.0/24 -17.248.143.0/24 -17.248.144.0/21 -17.248.148.0/24 -17.248.150.0/24 -17.248.160.0/24 -17.248.161.0/24 -17.248.184.0/24 -17.248.185.0/24 -17.248.192.0/24 -17.249.0.0/16 -17.249.0.0/20 -17.249.13.0/24 -17.249.16.0/20 -17.249.32.0/20 -17.249.48.0/20 -17.249.64.0/20 -17.249.80.0/20 -17.249.96.0/20 -17.249.112.0/20 -17.249.125.0/24 -17.249.128.0/20 -17.249.144.0/20 -17.249.160.0/20 -17.249.176.0/20 -17.249.192.0/20 -17.249.208.0/20 -17.249.224.0/21 -17.250.0.0/24 -17.250.4.0/24 -17.250.8.0/24 -17.250.9.0/24 -17.250.10.0/23 -17.250.12.0/23 -17.250.14.0/23 -17.250.16.0/20 -17.250.32.0/20 -17.251.0.0/16 -17.252.0.0/16 -17.252.0.0/20 -17.252.16.0/20 -17.252.32.0/20 -17.252.48.0/20 -17.252.64.0/20 -17.252.80.0/20 -17.252.96.0/20 -17.252.128.0/20 -17.252.144.0/20 -17.252.160.0/19 -17.252.192.0/20 -17.252.208.0/20 -17.252.224.0/20 -17.253.0.0/16 -17.253.128.0/21 -17.253.144.0/21 -17.253.200.0/24 -17.253.201.0/24 -17.253.206.0/24 -17.253.207.0/24 -17.253.216.0/23 -17.254.0.0/22 -17.254.6.0/24 -17.254.13.0/24 -17.254.16.0/24 -17.254.19.0/24 -17.254.32.0/22 -17.255.0.0/16 -17.255.232.0/22 -17.255.236.0/22 -17.255.243.0/24 -17.255.244.0/22 -17.255.252.0/22 -17.255.254.0/24 -17.255.255.0/24 -144.178.0.0/19 -192.35.50.0/24 -198.183.17.0/24 -17.0.224.0/24 -17.0.71.0/24 -17.0.99.0/24 -17.0.109.0/24 -17.0.120.0/24 -17.0.153.0/24 -17.0.176.0/20 -17.1.71.0/24 -17.1.98.0/24 -17.1.106.0/24 -17.1.114.0/24 -17.1.170.0/24 -17.1.184.0/24 -17.16.0.0/13 -17.29.0.0/20 -17.29.16.0/20 -17.29.112.0/23 -17.29.120.0/24 -17.29.121.0/24 -17.29.122.0/24 -17.29.224.0/24 -17.29.225.0/24 -17.29.226.0/24 -17.29.227.0/24 -17.29.228.0/24 -17.29.229.0/24 -17.29.230.0/24 -17.29.233.0/24 -17.29.234.0/24 -17.29.237.0/24 -17.29.239.0/24 -17.33.1.0/24 -17.33.6.0/24 -17.43.64.0/19 -17.43.76.0/24 -17.43.112.0/21 -17.43.132.0/22 -17.43.176.0/21 -17.44.8.0/22 -17.44.19.0/24 -17.44.24.0/22 -17.44.80.0/20 -17.44.156.0/22 -17.44.224.0/20 -17.45.157.0/24 -17.45.159.0/24 -17.45.186.0/23 -17.47.5.0/24 -17.47.6.0/24 -17.47.7.0/24 -17.47.8.0/24 -17.47.12.0/24 -17.47.50.0/24 -17.48.3.0/24 -17.48.16.0/21 -17.48.30.0/24 -17.56.128.0/19 -17.57.8.0/23 -17.57.10.0/23 -17.57.18.0/24 -17.57.19.0/24 -17.57.128.0/21 -17.57.136.0/21 -17.58.48.0/23 -17.58.57.0/24 -17.58.58.0/24 -17.58.59.0/24 -17.58.61.0/24 -17.58.62.0/24 -17.58.63.0/24 -17.58.104.0/23 -17.58.106.0/24 -17.58.108.0/23 -17.67.124.0/22 -17.67.252.0/22 -17.69.176.0/20 -17.76.0.0/23 -17.76.2.0/23 -17.76.16.0/20 -17.76.32.0/19 -17.76.64.0/23 -17.76.70.0/23 -17.76.72.0/21 -17.76.80.0/21 -17.76.88.0/21 -17.76.96.0/21 -17.76.120.0/21 -17.76.120.0/24 -17.76.122.0/24 -17.78.64.0/18 -17.78.128.0/23 -17.78.152.0/21 -17.78.159.0/24 -17.78.160.0/21 -17.78.160.0/24 -17.78.168.0/22 -17.78.172.0/24 -17.78.173.0/24 -17.78.176.0/24 -17.78.177.0/24 -17.78.178.0/24 -17.78.179.0/24 -17.78.180.0/22 -17.78.187.0/24 -17.79.0.0/20 -17.80.143.0/24 -17.80.151.0/24 -17.91.112.0/21 -17.91.232.0/21 -17.97.192.0/21 -17.121.64.0/23 -17.122.128.0/21 -17.122.136.0/22 -17.122.160.0/19 -17.122.243.0/24 -17.122.244.0/22 -17.123.128.0/21 -17.132.9.0/24 -17.132.12.0/24 -17.132.13.0/24 -17.132.14.0/24 -17.132.15.0/24 -17.132.20.0/24 -17.132.32.0/22 -17.132.36.0/24 -17.132.37.0/24 -17.132.40.0/22 -17.132.44.0/23 -17.132.46.0/24 -17.132.48.0/22 -17.132.148.0/24 -17.132.149.0/24 -17.132.176.0/20 -17.132.209.0/24 -17.132.224.0/23 -17.132.226.0/24 -17.140.45.0/24 -17.168.120.0/24 -17.168.192.0/21 -17.168.200.0/24 -17.168.204.0/22 -17.168.224.0/23 -17.188.8.0/22 -17.188.12.0/23 -17.188.16.0/23 -17.188.18.0/23 -17.188.72.0/23 -17.188.74.0/24 -17.190.0.0/15 -17.192.0.0/15 -17.194.0.0/16 -17.211.32.0/19 -17.211.64.0/19 -17.230.0.0/15 -17.233.80.0/20 -17.233.96.0/20 -17.233.160.0/21 -17.233.168.0/21 -17.233.210.0/23 -17.235.176.0/20 -17.242.0.0/20 -17.242.64.0/20 -17.242.80.0/20 -17.242.96.0/21 -17.242.112.0/21 -17.242.128.0/21 -17.242.136.0/21 -17.248.128.0/20 -17.248.152.0/21 -17.248.155.0/24 -17.248.158.0/24 -17.248.159.0/24 -17.248.162.0/24 -17.248.189.0/24 -17.248.206.0/24 -17.248.219.0/24 -17.249.232.0/21 -17.249.240.0/21 -17.250.118.0/23 -17.250.118.0/24 -17.250.119.0/24 -17.250.120.0/21 -17.250.122.0/23 -17.252.112.0/20 -17.252.240.0/20 -17.253.142.0/24 -144.178.48.0/21 -144.178.56.0/21 -144.178.2.0/24 -17.0.117.0/24 -17.15.16.0/22 -17.27.72.0/21 -17.29.39.0/24 -17.29.48.0/24 -17.29.52.0/24 -17.29.53.0/24 -17.29.55.0/24 -17.29.59.0/24 -17.29.60.0/24 -17.29.61.0/24 -17.29.62.0/24 -17.29.63.0/24 -17.29.64.0/20 -17.29.80.0/20 -17.29.96.0/20 -17.29.114.0/24 -17.29.115.0/24 -17.29.116.0/22 -17.29.123.0/24 -17.29.128.0/20 -17.29.226.0/23 -17.29.240.0/24 -17.29.241.0/24 -17.29.242.0/24 -17.29.243.0/24 -17.29.244.0/24 -17.29.245.0/24 -17.29.246.0/24 -17.29.247.0/24 -17.29.248.0/24 -17.29.251.0/24 -17.29.252.0/24 -17.33.5.0/24 -17.33.9.0/24 -17.33.13.0/24 -17.33.14.0/23 -17.33.15.0/24 -17.33.16.0/24 -17.33.17.0/24 -17.33.18.0/24 -17.33.20.0/24 -17.33.31.0/24 -17.33.32.0/20 -17.33.64.0/20 -17.33.132.0/22 -17.40.32.0/20 -17.40.240.0/23 -17.43.104.0/21 -17.44.28.0/22 -17.44.32.0/22 -17.44.132.0/22 -17.44.164.0/22 -17.44.168.0/22 -17.44.172.0/22 -17.45.72.0/22 -17.45.140.0/22 -17.57.0.0/18 -17.57.144.0/22 -17.58.52.0/24 -17.58.56.0/24 -17.58.252.0/24 -17.58.253.0/24 -17.58.254.0/24 -17.58.255.0/24 -17.67.116.0/22 -17.69.80.0/22 -17.76.104.0/21 -17.78.174.0/23 -17.91.184.0/21 -17.91.192.0/21 -17.97.0.0/17 -17.97.160.0/20 -17.97.200.0/21 -17.97.208.0/20 -17.97.224.0/19 -17.99.0.0/17 -17.99.128.0/21 -17.99.192.0/18 -17.100.0.0/16 -17.102.0.0/15 -17.104.0.0/15 -17.121.128.0/22 -17.121.132.0/24 -17.121.133.0/24 -17.121.136.0/21 -17.121.144.0/20 -17.121.160.0/19 -17.121.192.0/18 -17.122.240.0/23 -17.122.242.0/24 -17.129.80.0/20 -17.129.96.0/24 -17.130.128.0/22 -17.130.132.0/24 -17.130.144.0/20 -17.130.160.0/20 -17.130.176.0/22 -17.130.180.0/24 -17.130.208.0/22 -17.130.240.0/20 -17.132.8.0/22 -17.132.18.0/23 -17.150.172.0/24 -17.157.0.0/22 -17.157.0.0/24 -17.157.4.0/24 -17.157.5.0/24 -17.157.8.0/21 -17.157.16.0/22 -17.160.0.0/16 -17.160.171.0/24 -17.161.0.0/17 -17.161.48.0/21 -17.161.64.0/19 -17.161.128.0/18 -17.161.192.0/18 -17.162.0.0/15 -17.168.0.0/14 -17.168.2.0/24 -17.170.36.0/24 -17.171.11.0/24 -17.171.78.0/23 -17.172.0.0/16 -17.173.0.0/16 -17.174.0.0/16 -17.175.0.0/18 -17.175.64.0/19 -17.175.128.0/18 -17.175.192.0/19 -17.178.2.0/23 -17.178.8.0/21 -17.178.10.0/23 -17.178.34.0/24 -17.188.19.0/24 -17.188.176.0/24 -17.188.177.0/24 -17.188.216.0/21 -17.188.224.0/22 -17.188.228.0/24 -17.188.229.0/24 -17.189.128.0/17 -17.196.0.0/16 -17.200.192.0/22 -17.200.222.0/24 -17.200.223.0/24 -17.210.6.0/24 -17.235.64.0/18 -17.242.144.0/21 -17.242.152.0/21 -17.242.168.0/21 -17.248.151.0/24 -17.248.215.0/24 -17.250.128.0/20 -17.250.144.0/20 -17.250.160.0/22 -17.250.192.0/24 -17.250.193.0/24 -17.253.18.0/23 -17.253.74.0/24 -17.253.110.0/24 -63.92.224.0/19 -63.92.224.0/20 -63.92.240.0/20 -65.199.22.0/23 -17.33.19.0/24 -17.14.0.0/18 -17.14.64.0/19 -17.24.96.0/21 -17.26.8.0/21 -17.26.8.0/24 -17.27.176.0/21 -17.28.80.0/21 -17.29.57.0/24 -17.33.48.0/23 -17.39.72.0/21 -17.39.80.0/21 -17.39.88.0/22 -17.39.112.0/22 -17.39.116.0/22 -17.39.144.0/22 -17.44.20.0/22 -17.56.9.0/24 -17.58.202.0/23 -17.67.64.0/22 -17.110.64.0/21 -17.110.72.0/21 -17.110.80.0/21 -17.110.88.0/21 -17.110.96.0/20 -17.110.128.0/21 -17.110.150.0/23 -17.110.152.0/22 -17.110.156.0/22 -17.110.160.0/20 -17.110.192.0/21 -17.110.200.0/21 -17.110.208.0/20 -17.110.232.0/22 -17.110.240.0/20 -17.111.64.0/19 -17.111.128.0/17 -17.157.8.0/22 -17.157.12.0/24 -17.171.58.0/23 -17.171.193.0/24 -17.171.194.0/24 -17.174.0.0/20 -17.174.16.0/21 -17.174.24.0/22 -17.174.28.0/24 -17.174.29.0/24 -17.174.30.0/23 -17.174.32.0/19 -17.174.64.0/18 -17.174.128.0/17 -17.178.48.0/22 -17.178.52.0/22 -17.178.56.0/23 -17.178.58.0/23 -17.178.64.0/20 -17.178.80.0/20 -17.178.96.0/24 -17.178.98.0/24 -17.178.99.0/24 -17.178.100.0/22 -17.178.104.0/23 -17.178.106.0/23 -17.178.108.0/24 -17.178.109.0/24 -17.178.110.0/23 -17.178.112.0/21 -17.178.120.0/24 -17.178.126.0/23 -17.178.128.0/17 -17.200.220.0/24 -17.200.221.0/24 -17.13.0.0/18 -17.13.64.0/20 -17.25.160.0/21 -17.27.64.0/21 -17.27.160.0/21 -17.28.16.0/21 -17.28.136.0/21 -17.33.112.0/22 -17.39.64.0/21 -17.39.96.0/20 -17.39.128.0/20 -17.44.72.0/21 -17.45.80.0/21 -17.91.120.0/21 -17.91.240.0/21 -17.110.64.0/18 -17.110.128.0/17 -17.157.1.0/24 -17.160.74.0/23 -17.169.249.0/24 -17.169.254.0/23 -17.171.120.0/24 -17.178.40.0/21 -17.178.48.0/20 -17.178.64.0/19 -17.178.96.0/20 -17.178.120.0/22 -17.242.176.0/23 -17.248.176.0/23 -17.0.118.0/24 -17.1.185.0/24 -17.80.0.0/16 -17.25.72.0/21 -17.140.24.0/21 -92.118.32.0/22 -194.126.240.0/24 -17.7.64.0/24 -17.7.68.0/24 -17.7.72.0/24 -17.13.128.0/17 -17.25.96.0/21 -17.25.96.0/24 -17.25.128.0/21 -17.25.184.0/21 -17.26.176.0/21 -17.27.232.0/21 -17.28.0.0/21 -17.40.184.0/24 -17.45.76.0/22 -17.45.88.0/22 -17.69.104.0/23 -17.77.224.0/20 -17.138.0.0/17 -17.139.128.0/17 -17.156.0.0/16 -17.160.22.0/24 -17.160.82.0/23 -17.242.179.0/24 -17.249.248.0/22 -144.178.55.0/24 -17.0.181.0/24 -17.28.32.0/21 -17.28.40.0/21 -17.28.72.0/21 -17.29.33.0/24 -17.44.68.0/22 -17.69.106.0/24 -17.91.208.0/21 -17.130.184.0/22 -17.171.88.0/24 -17.242.178.0/24 -17.33.96.0/23 -17.41.0.0/16 -17.45.64.0/21 -17.45.66.0/24 -17.45.67.0/24 -17.45.70.0/23 -17.50.72.0/21 -17.58.51.0/24 -17.58.194.0/23 -17.58.200.0/23 -17.78.130.0/24 -17.78.188.0/24 -17.99.136.0/22 -17.130.181.0/24 -17.130.188.0/22 -17.248.160.0/20 -17.248.176.0/21 -17.248.184.0/21 -17.249.252.0/24 -17.29.34.0/24 -17.29.56.0/24 -17.33.98.0/23 -17.33.140.0/23 -17.43.96.0/21 -17.44.60.0/22 -17.57.152.0/23 -17.58.112.0/20 -17.76.112.0/21 -17.91.224.0/21 -17.171.89.0/24 -17.240.16.0/20 -139.178.128.0/17 -17.7.74.0/23 -17.29.58.0/24 -17.40.128.0/20 -17.40.148.0/24 -17.43.120.0/21 -17.44.48.0/22 -17.44.48.0/23 -17.44.50.0/23 -17.44.104.0/21 -17.47.128.0/24 -17.57.154.0/24 -17.66.64.0/18 -17.66.128.0/18 -17.67.8.0/22 -17.77.220.0/22 -17.78.168.0/24 -17.78.169.0/24 -17.78.171.0/24 -17.79.32.0/20 -17.91.152.0/21 -17.91.216.0/21 -17.157.2.0/24 -17.157.224.0/19 -17.157.224.0/24 -17.157.225.0/24 -17.161.104.0/24 -17.250.176.0/20 -17.250.194.0/24 -144.178.36.0/23 -144.178.38.0/23 -17.1.108.0/24 -17.14.96.0/19 -17.15.48.0/23 -17.27.24.0/21 -17.29.49.0/24 -17.29.144.0/21 -17.29.152.0/22 -17.29.156.0/22 -17.29.160.0/21 -17.32.214.0/23 -17.33.101.0/24 -17.33.102.0/23 -17.33.108.0/23 -17.33.112.0/20 -17.33.138.0/23 -17.33.144.0/24 -17.33.145.0/24 -17.33.146.0/24 -17.44.40.0/22 -17.44.44.0/22 -17.44.48.0/21 -17.44.52.0/22 -17.44.56.0/22 -17.44.96.0/21 -17.44.152.0/22 -17.44.152.0/23 -17.44.154.0/23 -17.45.96.0/21 -17.45.104.0/22 -17.45.104.0/23 -17.45.106.0/23 -17.45.188.0/22 -17.45.188.0/23 -17.45.190.0/23 -17.56.0.0/19 -17.58.204.0/24 -17.58.206.0/24 -17.76.128.0/21 -17.84.216.0/23 -17.111.32.0/19 -17.111.96.0/19 -17.129.104.0/22 -17.130.133.0/24 -17.138.128.0/20 -17.138.144.0/20 -17.138.160.0/22 -17.138.176.0/20 -17.139.0.0/20 -17.139.48.0/20 -17.139.64.0/20 -17.157.20.0/22 -17.157.24.0/24 -17.170.175.0/24 -17.178.12.0/24 -17.178.26.0/23 -17.178.32.0/24 -17.178.33.0/24 -17.178.35.0/24 -17.178.36.0/23 -17.179.16.0/20 -17.179.32.0/21 -17.179.40.0/21 -17.179.48.0/20 -17.179.80.0/20 -17.179.96.0/19 -17.179.128.0/17 -17.188.230.0/24 -17.188.231.0/24 -17.188.232.0/22 -17.188.236.0/22 -17.232.128.0/21 -17.232.128.0/22 -17.232.132.0/22 -17.232.136.0/21 -17.232.136.0/22 -17.232.140.0/22 -17.233.212.0/24 -17.233.213.0/24 -17.235.176.0/22 -17.235.180.0/22 -17.235.184.0/22 -17.235.188.0/22 -17.242.164.0/22 -17.248.179.0/24 -17.253.132.0/24 -17.253.133.0/24 -139.178.128.0/18 -139.178.128.0/23 -139.178.130.0/23 -17.44.192.0/20 -17.33.81.0/24 -17.33.104.0/23 -17.33.106.0/23 -17.44.144.0/22 -17.44.144.0/23 -17.44.146.0/23 -17.45.92.0/22 -17.58.207.0/24 -17.129.48.0/20 -17.248.229.0/24 -17.8.64.0/23 -17.15.50.0/23 -17.15.52.0/22 -17.40.112.0/23 -17.43.50.0/24 -17.44.112.0/23 -17.44.124.0/24 -17.44.125.0/24 -17.45.176.0/22 -17.58.205.0/24 -17.76.140.0/22 -17.198.224.0/19 -17.15.61.0/24 -17.29.54.0/24 -17.33.32.0/19 -17.36.196.0/22 -17.44.116.0/22 -17.69.64.0/21 -17.121.80.0/20 -17.138.160.0/20 -17.139.17.0/24 -17.139.24.0/21 -17.157.25.0/24 -17.157.28.0/22 -17.157.64.0/20 -17.157.96.0/20 -17.157.112.0/20 -17.188.180.0/22 -17.232.144.0/21 -17.232.144.0/22 -17.232.148.0/22 -17.232.152.0/21 -17.232.152.0/22 -17.232.156.0/22 -17.240.0.0/20 -17.240.32.0/20 -17.248.164.0/24 -17.248.165.0/24 -17.248.166.0/23 -17.248.230.0/24 -17.248.231.0/24 -17.248.236.0/24 -17.248.243.0/24 -17.33.151.0/24 -17.8.66.0/23 -17.8.80.0/23 -17.15.59.0/24 -17.15.62.0/24 -17.15.63.0/24 -17.15.128.0/20 -17.32.32.0/20 -17.32.128.0/17 -17.33.23.0/24 -17.33.216.0/22 -17.37.0.0/20 -17.37.16.0/20 -17.43.160.0/20 -17.43.192.0/18 -17.44.36.0/22 -17.44.36.0/23 -17.44.38.0/23 -17.56.32.0/24 -17.58.192.0/23 -17.58.224.0/24 -17.126.5.0/24 -17.126.6.0/24 -17.138.208.0/20 -17.138.224.0/20 -17.139.16.0/24 -17.139.21.0/24 -17.139.22.0/23 -17.139.80.0/20 -17.139.98.0/23 -17.139.100.0/22 -17.139.104.0/21 -17.187.128.0/19 -17.86.148.0/22 -17.86.74.0/23 -17.86.152.0/22 -17.86.76.0/23 -17.86.156.0/22 -17.86.78.0/23 -17.86.160.0/22 -17.86.80.0/23 -17.86.164.0/22 -17.86.82.0/23 -17.86.168.0/22 -17.86.84.0/23 -17.86.140.0/22 -17.86.70.0/23 -17.86.144.0/22 -17.86.72.0/23 -17.86.94.0/23 -17.86.192.0/22 -17.86.96.0/23 -17.86.196.0/22 -17.86.98.0/23 -17.86.200.0/22 -17.86.100.0/23 -17.86.204.0/22 -17.86.102.0/23 -17.86.208.0/22 -17.86.104.0/23 -17.86.212.0/22 -17.86.106.0/23 -17.86.216.0/22 -17.86.108.0/23 -17.86.220.0/22 -17.86.200.0/23 -17.86.36.0/24 -17.86.202.0/23 -17.86.37.0/24 -17.86.204.0/23 -17.86.38.0/24 -17.86.206.0/23 -17.86.39.0/24 -17.86.208.0/23 -17.86.40.0/24 -17.86.210.0/23 -17.86.41.0/24 -17.86.212.0/23 -17.86.110.0/23 -17.86.224.0/22 -17.86.112.0/23 -17.86.228.0/22 -17.86.42.0/24 -17.86.214.0/23 -17.86.43.0/24 -17.86.216.0/23 -17.86.44.0/24 -17.86.218.0/23 -17.86.45.0/24 -17.86.220.0/23 -17.86.46.0/24 -17.86.222.0/23 -17.86.135.0/24 -17.86.71.0/24 -17.86.136.0/24 -17.86.114.0/23 -17.86.232.0/22 -17.86.116.0/23 -17.86.236.0/22 -17.86.118.0/23 -17.86.240.0/22 -17.86.120.0/23 -17.86.244.0/22 -17.86.122.0/23 -17.86.248.0/22 -17.86.124.0/23 -17.86.252.0/22 -17.86.126.0/23 -17.86.128.0/23 -17.86.0.0/24 -17.86.130.0/23 -17.86.1.0/24 -17.86.132.0/23 -17.86.2.0/24 -17.86.134.0/23 -17.86.3.0/24 -17.86.136.0/23 -17.86.4.0/24 -17.86.138.0/23 -17.86.5.0/24 -17.86.140.0/23 -17.86.6.0/24 -17.86.142.0/23 -17.86.7.0/24 -17.86.144.0/23 -17.86.8.0/24 -17.86.146.0/23 -17.86.9.0/24 -17.86.72.0/24 -17.86.137.0/24 -17.86.73.0/24 -17.86.138.0/24 -17.86.74.0/24 -17.86.139.0/24 -17.86.75.0/24 -17.86.140.0/24 -17.86.76.0/24 -17.86.141.0/24 -17.86.77.0/24 -17.86.142.0/24 -17.86.148.0/23 -17.86.10.0/24 -17.86.150.0/23 -17.86.11.0/24 -17.86.152.0/23 -17.86.12.0/24 -17.86.154.0/23 -17.86.13.0/24 -17.86.156.0/23 -17.86.14.0/24 -17.86.158.0/23 -17.86.15.0/24 -17.86.160.0/23 -17.86.78.0/24 -17.86.143.0/24 -17.86.79.0/24 -17.86.144.0/24 -17.86.80.0/24 -17.86.145.0/24 -17.86.81.0/24 -17.86.146.0/24 -17.86.82.0/24 -17.86.147.0/24 -17.86.83.0/24 -17.86.148.0/24 -17.86.84.0/24 -17.86.149.0/24 -17.86.85.0/24 -17.86.150.0/24 -17.86.86.0/24 -17.86.151.0/24 -17.86.16.0/24 -17.86.162.0/23 -17.86.17.0/24 -17.86.164.0/23 -17.86.18.0/24 -17.86.166.0/23 -17.86.19.0/24 -17.86.168.0/23 -17.86.20.0/24 -17.86.170.0/23 -17.86.21.0/24 -17.86.172.0/23 -17.86.22.0/24 -17.86.174.0/23 -17.86.23.0/24 -17.86.176.0/23 -17.86.24.0/24 -17.86.178.0/23 -17.86.87.0/24 -17.86.152.0/24 -17.86.88.0/24 -17.86.153.0/24 -17.86.89.0/24 -17.86.154.0/24 -17.86.90.0/24 -17.86.155.0/24 -17.86.91.0/24 -17.86.156.0/24 -17.86.92.0/24 -17.86.157.0/24 -17.86.93.0/24 -17.86.158.0/24 -17.86.94.0/24 -17.86.159.0/24 -17.86.95.0/24 -17.86.160.0/24 -17.86.25.0/24 -17.86.180.0/23 -17.86.26.0/24 -17.86.182.0/23 -17.86.27.0/24 -17.86.184.0/23 -17.86.28.0/24 -17.86.186.0/23 -17.86.29.0/24 -17.86.188.0/23 -17.86.96.0/24 -17.86.161.0/24 -17.86.97.0/24 -17.86.162.0/24 -17.86.98.0/24 -17.86.163.0/24 -17.86.99.0/24 -17.86.164.0/24 -17.86.100.0/24 -17.86.165.0/24 -17.86.101.0/24 -17.86.166.0/24 -17.86.102.0/24 -17.86.167.0/24 -17.86.103.0/24 -17.86.168.0/24 -17.86.104.0/24 -17.86.169.0/24 -17.86.105.0/24 -17.86.170.0/24 -17.86.106.0/24 -17.86.171.0/24 -17.86.107.0/24 -17.86.172.0/24 -17.86.108.0/24 -17.86.173.0/24 -17.86.224.0/23 -17.86.48.0/24 -17.86.226.0/23 -17.86.49.0/24 -17.86.228.0/23 -17.86.50.0/24 -17.86.230.0/23 -17.86.51.0/24 -17.86.232.0/23 -17.86.52.0/24 -17.86.234.0/23 -17.86.47.0/24 -17.86.53.0/24 -17.86.54.0/24 -17.86.238.0/23 -17.86.55.0/24 -17.86.240.0/23 -17.86.56.0/24 -17.86.242.0/23 -17.86.57.0/24 -17.86.244.0/23 -17.86.58.0/24 -17.86.246.0/23 -17.86.59.0/24 -17.86.248.0/23 -17.86.60.0/24 -17.86.250.0/23 -17.86.61.0/24 -17.86.252.0/23 -17.86.62.0/24 -17.86.236.0/23 -17.86.63.0/24 -17.86.128.0/24 -17.86.64.0/24 -17.86.129.0/24 -17.86.65.0/24 -17.86.130.0/24 -17.86.66.0/24 -17.86.131.0/24 -17.86.67.0/24 -17.86.132.0/24 -17.86.68.0/24 -17.86.133.0/24 -17.86.69.0/24 -17.86.134.0/24 -17.86.70.0/24 -17.86.254.0/23 -17.86.109.0/24 -17.86.174.0/24 -17.86.110.0/24 -17.86.175.0/24 -17.86.111.0/24 -17.86.176.0/24 -17.86.112.0/24 -17.86.177.0/24 -17.86.30.0/24 -17.86.190.0/23 -17.86.31.0/24 -17.86.192.0/23 -17.86.32.0/24 -17.86.194.0/23 -17.86.33.0/24 -17.86.196.0/23 -17.86.34.0/24 -17.86.198.0/23 -17.86.35.0/24 -17.86.113.0/24 -17.86.178.0/24 -17.86.114.0/24 -17.86.179.0/24 -17.86.115.0/24 -17.86.180.0/24 -17.86.116.0/24 -17.86.181.0/24 -17.86.117.0/24 -17.86.182.0/24 -17.86.118.0/24 -17.86.172.0/22 -17.86.86.0/23 -17.86.176.0/22 -17.86.88.0/23 -17.86.180.0/22 -17.86.90.0/23 -17.86.184.0/22 -17.86.92.0/23 -17.86.188.0/22 -17.86.64.0/23 -17.86.128.0/22 -17.86.66.0/23 -17.86.136.0/22 -17.86.68.0/23 -17.86.16.0/23 -17.86.128.0/20 -17.86.18.0/23 -17.86.144.0/20 -17.86.20.0/23 -17.86.160.0/20 -17.86.0.0/17 -17.86.0.0/18 -17.86.64.0/18 -17.86.0.0/19 -17.86.32.0/19 -17.86.64.0/19 -17.86.96.0/19 -17.86.0.0/20 -17.86.16.0/20 -17.86.22.0/23 -17.86.176.0/20 -17.86.24.0/23 -17.86.192.0/20 -17.86.26.0/23 -17.86.208.0/20 -17.86.28.0/23 -17.86.224.0/20 -17.86.30.0/23 -17.86.32.0/23 -17.86.128.0/21 -17.86.240.0/20 -17.86.32.0/20 -17.86.48.0/20 -17.86.64.0/20 -17.86.80.0/20 -17.86.96.0/20 -17.86.112.0/20 -17.86.0.0/21 -17.86.8.0/21 -17.86.16.0/21 -17.86.24.0/21 -17.86.32.0/21 -17.86.40.0/21 -17.86.48.0/21 -17.86.34.0/23 -17.86.136.0/21 -17.86.36.0/23 -17.86.144.0/21 -17.86.38.0/23 -17.86.56.0/21 -17.86.64.0/21 -17.86.72.0/21 -17.86.80.0/21 -17.86.88.0/21 -17.86.96.0/21 -17.86.104.0/21 -17.86.112.0/21 -17.86.120.0/21 -17.86.0.0/22 -17.86.4.0/22 -17.86.186.0/24 -17.86.8.0/22 -17.86.122.0/24 -17.86.12.0/22 -17.86.187.0/24 -17.86.152.0/21 -17.86.123.0/24 -17.86.40.0/23 -17.86.188.0/24 -17.86.160.0/21 -17.86.124.0/24 -17.86.42.0/23 -17.86.189.0/24 -17.86.168.0/21 -17.86.125.0/24 -17.86.190.0/24 -17.86.16.0/22 -17.86.20.0/22 -17.86.126.0/24 -17.86.191.0/24 -17.86.24.0/22 -17.86.28.0/22 -17.86.32.0/22 -17.86.36.0/22 -17.86.40.0/22 -17.86.44.0/22 -17.86.48.0/22 -17.86.52.0/22 -17.86.56.0/22 -17.86.60.0/22 -17.86.64.0/22 -17.86.68.0/22 -17.86.44.0/23 -17.86.176.0/21 -17.86.46.0/23 -17.86.184.0/21 -17.86.48.0/23 -17.86.192.0/21 -17.86.50.0/23 -17.86.200.0/21 -17.86.52.0/23 -17.86.208.0/21 -17.86.54.0/23 -17.86.216.0/21 -17.86.56.0/23 -17.86.224.0/21 -17.86.58.0/23 -17.86.232.0/21 -17.86.60.0/23 -17.86.240.0/21 -17.86.62.0/23 -17.86.248.0/21 -17.86.127.0/24 -17.86.192.0/24 -17.86.193.0/24 -17.86.194.0/24 -17.86.195.0/24 -17.86.196.0/24 -17.86.197.0/24 -17.86.198.0/24 -17.86.199.0/24 -17.86.200.0/24 -17.86.201.0/24 -17.86.202.0/24 -17.86.203.0/24 -17.86.204.0/24 -17.86.205.0/24 -17.86.255.0/24 -17.86.72.0/22 -17.86.76.0/22 -17.86.80.0/22 -17.86.84.0/22 -17.86.88.0/22 -17.86.92.0/22 -17.86.96.0/22 -17.86.100.0/22 -17.86.104.0/22 -17.86.108.0/22 -17.86.112.0/22 -17.86.239.0/24 -17.86.240.0/24 -17.86.241.0/24 -17.86.242.0/24 -17.86.116.0/22 -17.86.120.0/22 -17.86.243.0/24 -17.86.124.0/22 -17.86.244.0/24 -17.86.0.0/23 -17.86.2.0/23 -17.86.128.0/17 -17.86.4.0/23 -17.86.128.0/18 -17.86.6.0/23 -17.86.192.0/18 -17.86.8.0/23 -17.86.128.0/19 -17.86.10.0/23 -17.86.160.0/19 -17.86.12.0/23 -17.86.14.0/23 -17.86.224.0/19 -17.86.192.0/19 -17.86.245.0/24 -17.86.246.0/24 -17.86.247.0/24 -17.86.248.0/24 -17.86.249.0/24 -17.86.250.0/24 -17.86.251.0/24 -17.86.252.0/24 -17.86.253.0/24 -17.86.254.0/24 -17.86.206.0/24 -17.86.207.0/24 -17.86.208.0/24 -17.86.209.0/24 -17.86.210.0/24 -17.86.211.0/24 -17.86.212.0/24 -17.86.213.0/24 -17.86.214.0/24 -17.86.215.0/24 -17.86.216.0/24 -17.86.217.0/24 -17.86.218.0/24 -17.86.219.0/24 -17.86.220.0/24 -17.86.221.0/24 -17.86.222.0/24 -17.86.223.0/24 -17.86.224.0/24 -17.86.225.0/24 -17.86.226.0/24 -17.86.227.0/24 -17.86.228.0/24 -17.86.229.0/24 -17.86.230.0/24 -17.86.231.0/24 -17.86.232.0/24 -17.86.233.0/24 -17.86.234.0/24 -17.86.235.0/24 -17.86.236.0/24 -17.86.237.0/24 -17.86.238.0/24 -17.86.183.0/24 -17.86.119.0/24 -17.86.184.0/24 -17.86.120.0/24 -17.86.185.0/24 -17.86.121.0/24 -57.102.0.0/15 -17.255.252.0/24 -17.130.0.0/17 -17.130.0.0/18 -17.130.0.0/19 -17.130.0.0/20 -17.130.0.0/21 -17.130.0.0/22 -17.130.0.0/23 -17.130.0.0/24 -17.78.224.0/20 -17.77.0.0/17 -17.77.128.0/17 -17.77.32.0/21 -17.77.140.0/23 -17.77.168.0/22 -17.77.142.0/23 -17.77.208.0/21 -17.77.136.0/23 -17.77.128.0/23 -17.77.132.0/23 -17.77.152.0/22 -17.77.80.0/21 -17.77.88.0/21 -17.77.64.0/21 -17.77.192.0/21 -17.77.160.0/22 -17.77.144.0/22 -17.77.176.0/21 -17.77.56.0/22 -17.77.240.0/20 -17.77.20.0/23 -17.77.48.0/22 -17.67.128.0/18 -17.70.0.0/15 -17.74.0.0/15 -17.78.128.0/21 -17.78.140.0/22 -17.78.144.0/21 -17.78.192.0/20 -17.64.0.0/16 -17.65.0.0/16 -17.66.0.0/16 -17.67.192.0/22 -17.67.200.0/22 -17.72.0.0/16 -17.72.64.0/19 -17.72.96.0/19 -17.79.0.0/16 -17.130.0.0/16 -17.78.32.0/21 -17.78.224.0/19 -17.78.208.0/21 -17.69.0.0/16 -17.67.0.0/16 -17.67.244.0/22 -17.67.212.0/22 -17.77.0.0/16 -17.72.64.0/18 -17.67.224.0/20 -17.68.0.0/16 -17.67.252.0/22 -17.67.208.0/22 -17.67.198.0/23 -17.69.240.0/21 -17.67.196.0/23 -17.73.0.0/16 -17.67.204.0/22 -17.69.232.0/22 -17.69.192.0/20 -17.69.236.0/22 -17.69.33.0/24 -17.235.208.0/20 -17.69.32.0/24 -17.69.224.0/21 -17.235.192.0/20 -17.69.208.0/21 -17.67.104.0/21 -17.67.80.0/20 -17.67.48.0/20 -17.67.32.0/20 -17.0.0.0/8 -204.179.120.0/24 -17.0.0.0/9 -17.0.0.0/8 -17.128.0.0/9 -192.35.50.0/24 -17.83.128.0/17 -17.83.0.0/17 -17.80.0.0/16 -17.85.0.0/16 -2620:0:1b00::/48 -2620:0:1b01::/48 -2620:0:1b02::/48 -2620:0:1b04::/48 -2620:0:1b05::/48 -2620:0149::/44 -2620:0149:0100::/44 -2620:0149:0f05::/48 -2620:0149:0280::/48 -2403:0300:2010::/44 -2a01:b740:300::/48 -2620:149:bb::/48 -2620:149:ff::/48 -2620:149:140::/44 -2620:149:ac0::/48 -2620:149:ac2::/48 -2a01:b740:1::/48 -2a01:b740:a09::/48 -2a01:b740:a05::/48 -2403:300::/32 -2620:149::/36 -2a01:b740::/32 -2a01:b740:a11::/48 -2620:149:ae0::/48 -2620:149:ae7::/48 -2620:149:a40::/46 -2620:149:a44::/48 -2a01:b740:a41::/48 -2a01:b740:a42::/48 -2403:300:a41::/48 -2403:300:a42::/48 -2403:300:a50::/48 -2403:300:a51::/48 -2A01:B740:A01::/48 -2A01:B740:A1B::/48 -2403:300:A19::/48 -2620:149:5E1::/48 -2A01:B740:A03::/48 -2620:149:A15::/48 -2620:149:A1D::/48 -2A01:B740:A07::/48 -2620:149:1000::/44 -2620:149::/32 -2620:149:5C1::/48 -2620:149:5C3::/48 -2403:300:A18::/48 -2620:149:218::/46 -2403:300:A0D::/48 -2620:149:1100::/44 -2A01:B740:A25::/48 -2403:300:A26::/48 -2620:149:A1F::/48 -2620:149:A19::/48 -2620:149:229::/48 -2403:300:A29::/48 -2403:300:A0F::/48 -2620:149:A01::/48 -2620:149:521::/48 -2620:149:A11::/48 -2620:149:A27::/48 -2620:149:64::/48 -2620:149:5C0::/48 -2403:300:A0B::/48 -2620:149:FC::/46 -2620:149:1080::/48 -2620:149:A1B::/48 -2A01:B740:A29::/48 -2620:149:148::/46 -2620:149:A25::/48 -2620:149:F01::/48 -2A01:B740:A15::/48 -2620:149:A13::/48 -2A01:B740:A12::/48 -2A01:B740:A70::/44 -2403:300:A15::/48 -2403:300:A25::/48 -2620:149:F8::/46 -2620:149:11::/48 -2620:149:A17::/48 -2403:300:A12::/48 -2403:300:A20::/48 -2620:149:A0B::/48 -2620:149:1::/48 -2403:300:A17::/48 -2620:149:40::/44 -2620:149:5B0::/48 -2620:149:1020::/44 -2620:149:45::/48 -2620:149:A2B::/48 -2A01:B740:A13::/48 -2403:300::/48 -2403:300:A10::/48 -2620:149:A2A::/48 -2403:300:A07::/48 -2403:300:A09::/48 -2620:149:A07::/48 -2620:149:1060::/48 -2620:149:5E0::/48 -2620:149:F9::/48 -2620:149:5D3::/48 -2620:149:1160::/44 -2620:149:534::/48 -2a01:b747::/32 -2620:149:5D2::/48 -2620:149:228::/46 -2620:149:220::/46 -2620:149:FD::/48 -2620:149:1140::/44 -2403:300:402::/48 -2620:149:1081::/48 -2620:149:149::/48 -2620:149:550::/48 -2A01:B747:9E::/48 -2403:300:1200::/48 -2A01:B747:F0::/48 -2620:149:574::/48 -2A01:B747:129::/48 -2A01:B740:1200::/48 -2A01:B747:2F::/48 -2620:149:1200::/48 -2A01:B747:900::/40 -2A01:B747:6F0::/48 -2620:149:100C::/48 -2A01:B747:8011::/48 -2620:149:AA8::/48 -2620:149:5C2::/48 -2620:149:100D::/48 -2A01:B740:1C00::/40 -2A01:B747:613::/48 -2A01:B747:800::/40 -2620:149:1061::/48 -2620:149:A80::/42 -2620:149:561::/48 -2620:149:FB::/48 -2620:149:1040::/44 -2620:149:560::/48 -2A01:B747:8010::/48 -2620:149:AF0::/48 -2A01:B740:1D00::/40 -2620:149:1062::/48 -2620:149:AA9::/48 -2A01:B747:61A::/48 -2403:300:1D00::/40 -2403:300:1C00::/40 -2A01:B747:400::/40 -2A01:B747:500::/40 -2620:149:980::/48 -2620:149:921::/48 -2620:149:9C1::/48 -2620:149:981::/48 -2620:149:922::/48 -2620:149:230::/48 -2620:149:9C0::/48 -2A01:B747:621::/48 -2A01:B747:614::/48 -2A01:B747:61B::/48 -2A01:B747:625::/48 -2A01:B747:617::/48 -2A01:B747:612::/48 -2A01:B747:610::/48 -2A01:B747:61E::/48 -2A01:B747:61C::/48 -2A01:B747:623::/48 -2A01:B747:618::/48 -2A01:B747:619::/48 -2A01:B747:61F::/48 -2A01:B747:620::/48 -2A01:B747:616::/48 -2A01:B747:611::/48 -2620:149:5B3::/48 -2A01:B747:622::/48 -2A01:B747:624::/48 -2A01:B747:61D::/48 -2A01:B747:615::/48 -2620:149:5FB::/48 -2620:149:230::/46 -2620:149:1063::/48 -2620:149:240::/48 -2620:149:73::/48 -2620:149:231::/48 -2620:149:72::/48 -2403:300:710::/44 -2620:149:232::/48 -2620:149:1304::/48 -2A01:B740:9C1::/48 -2620:149:71::/48 -2403:300:401::/48 -2620:149:1A00::/44 -2403:300:700::/48 -2620:149:1B00::/48 -2620:149:1082::/47 -2403:300:410::/44 -2620:149:1084::/48 -2403:300:420::/44 -2620:149:1305::/48 \ No newline at end of file diff --git a/slips_files/organizations_info/apple_domains b/slips_files/organizations_info/apple_domains index 79109d31c..ebdfa0496 100644 --- a/slips_files/organizations_info/apple_domains +++ b/slips_files/organizations_info/apple_domains @@ -1,354 +1,8 @@ -apple.com -a1.phobos.apple.com -access.apple.com -advertising.apple.com -albert.apple.com -ali.apple.com -ams.apple.com -apple.apple.com -appleconnect.apple.com -appleid-it.apple.com -appleid.apple.com -appleseed.apple.com -appleseed3.apple.com -appleseedtest.apple.com -aps.info.apple.com -ara.apple.com -arait.apple.com -asia.apple.com -asw.apple.com -atlaslms.apple.com -av.apple.com -benefits.apple.com -beta.apple.com -bugreport.apple.com -bugreporter.apple.com -c.apple.com -calendar.apple.com -certifications-test.apple.com -certifications.apple.com -certifications2.apple.com -checkcoverage.apple.com -checkrepair.apple.com -concierge-mobile.apple.com -concierge.apple.com -consultants.apple.com -cooljobs.apple.com -deimos.apple.com -deimos2.apple.com -deimos3.apple.com -deploy.apple.com -developer.apple.com -developer2.apple.com -developertest.apple.com -devforums.apple.com -devimages.apple.com -diagnostics.apple.com -discussions.apple.com -documentation.apple.com -downloads.apple.com -ecommerce.apple.com -employment.apple.com -enterprise.apple.com -ep.sap.apple.com -erp.apple.com -esp-test.apple.com -esp.apple.com -euro.apple.com -events.apple.com -ext.apple.com -ext1.apple.com -extensions.apple.com -files.apple.com -gspa21.ls.apple.com -gsx-it.apple.com -gsx.apple.com -gsxit.apple.com -guide.apple.com -help.apple.com -hrweb.apple.com -iad.apple.com -iadworkbench.apple.com -id.apple.com -identity.apple.com -iforgot.apple.com -images.apple.com -index.apple.com -init.apple.com -investor.apple.com -iphone.apple.com -itunes.apple.com -itunespartner.apple.com -jobs.apple.com -k.apple.com -lists.apple.com -locate.apple.com -macos.apple.com -manuals.info.apple.com -manuals01.info.apple.com -manuals02.info.apple.com -manuals03.info.apple.com -manuals04.info.apple.com -maps.apple.com -mapsconnect.apple.com -meetingroom.apple.com -mfi.apple.com -mobile.apple.com -mobileaccess.apple.com -movies.apple.com -movietrailers.apple.com -myaccess-it.apple.com -myaccess.apple.com -mynews.apple.com -mystore.apple.com -news.apple.com -nr.apple.com -ocsp.apple.com -opensource.apple.com -podcastsconnect.apple.com -portal.apple.com -quicktime.apple.com -radar.apple.com -register.apple.com -relay.apple.com -relay1.apple.com -relay11.apple.com -relay12.apple.com -relay13.apple.com -relay14.apple.com -relay15.apple.com -relay2.apple.com -relay3.apple.com -relay4.apple.com -relay5.apple.com -remoteadvisor.apple.com -remoteadvisor1.apple.com -remoteadvisor2.apple.com -reportaproblem.apple.com -s.apple.com -safari-extensions.apple.com -sales.apple.com -salesresources.apple.com -school.apple.com -selfsolve.apple.com -servers.apple.com -service.apple.com -sift.apple.com -signin.apple.com -signin.info.apple.com -source.apple.com -ssl.apple.com -sso.apple.com -store.apple.com -support.apple.com -support01.apple.com -support02.apple.com -support03.apple.com -support04.apple.com -support05.apple.com -supportprofile.apple.com -supporttest.apple.com -survey.apple.com -survey2.apple.com -swdlp.apple.com -time.apple.com -time1.apple.com -time2.apple.com -time3.apple.com -time4.apple.com -time5.apple.com -tips.apple.com -trailers.apple.com -training.apple.com -trainingevents.apple.com -uptodate.apple.com -volume.apple.com -war.apple.com -www.apple.com -www1.apple.com -wwwtest.apple.com -xml.apple.com -xp.apple.com -xp2.apple.com -icloud.com -prod0-files.acompli.net -usqas.icloud-content.com -query.ess.apple.com -time-ios.g.aaplimg.com -origin.guzzoni-apple.com.akadns.net -isrg.trustid.ocsp.identrust.com -ocsp.apple.com -iosapps.itunes.g.aaplimg.com -se-edge.itunes-apple.com.akadns.net -caldav.icloud.com -fe.apple-dns.net -is-ssl.mzstatic.com.itunes-apple.com.akadns.net -xp.itunes-apple.com.akadns.net -gsp-ssl.ls-apple.com.akadns.net -apptrailers.itunes.g.aaplimg.com -pancake.cdn-apple.com.akadns.net -apptrailers.itunes.apple.com -iosapps.itunes.apple.com -se-edge.itunes.apple.com -edge.itunes.apple.com -itunes.apple.com -client-api.itunes.apple.com -pd-cdn.itunes-apple.com.akadns.net -apps-mzstatic-cdn.itunes-apple.com.akadns.net -play.itunes.apple.com -init-cdn.itunes-apple.com.akadns.net -init.itunes.apple.com -api-glb-ash.smoot.apple.com -time-ios.apple.com -guzzoni.apple.com -gsa.apple.com.akadns.net -configuration.apple.com.akadns.net -smp-device-content.apple.com -daypass.api-glb-ash.smoot.apple.com -api.smoot.apple.com -aod.itunes.g.aaplimg.com -mesu.g.aaplimg.com -s.mzstatic.com -ocsp.digicert.com -sr.symcd.com -query.ess-apple.com.akadns.net -configuration.apple.com -setup.icloud.com -radio-activity.itunes.apple.com -aod.itunes.apple.com -is1-ssl.mzstatic.com -mt-ingestion-service-st11.itunes-apple.com.akadns.net -sync-cdn.itunes-apple.com.akadns.net -search.itunes.apple.com -upp.itunes.apple.com -pd.itunes.apple.com -sync.itunes.apple.com -radio-services.itunes.apple.com -apps.mzstatic.com -iadsdk.apple.com -gdmf.apple.com -xp.apple.com -usnyc-edge.icloud-content.com -lcdn-locator.apple.com -keyvalueservice.icloud.com -identity.ess.apple.com -bag.itunes.apple.com -init.ess.apple.com -pancake.apple.com -gateway.icloud.com -appldnld.apple.com -mesu.apple.com -static.ess.apple.com -gsa.apple.com -gs-loc.apple.com -aidc.apple.com -appldnld.apple.com.akadns.net -appldnld.g.aaplimg.com -basejumper.apple.com -buy.itunes.apple.com -gspe21-ssl.ls.apple.com -gs-loc-new.ls-apple.com.akadns.net -app-measurement.com -init-p01md.apple.com.edgesuite.net -partiality.itunes.apple.com -configuration.apple.com.edgekey.net -images.apple.com -iphonesubmissions.apple.com -su.itunes.apple.com -itunes.apple.com.edgekey.net -gs.apple.com -captive.apple.com -st14p01sa.guzzoni-apple.com.akadns.net -gs.apple.com.akadns.net -pop-namer-ne-courier.push-apple.com.akadns.net -s2.symcb.com -pop-namer-ne-courier.push-apple.com.akadns.net -st14p01sa.guzzoni-apple.com.akadns.net -captive.apple.com -time.apple.com -e.ns.apple.com -a.gtld-servers.net -c.ns.apple.com -f.gtld-servers.net -l.root-servers.net -a1441.dscg.akamai.net -www.icloud.com -gspe1-ssl.ls.apple.com -courier.push.apple.com -captive.g.aaplimg.com -commnat-cohort.ess.apple.com -commnat-main.ess.apple.com -init-p01md.apple.com -profile.ess.apple.com -iphone-ld.apple.com -valid.apple.com -usqas-edge.icloud-content.com -wu-calculator.apple.com -gsas.apple.com -ds-aksb-a.akamaihd.net -valid.origin-apple.com.akadns.net -c.us1.dyntrk.com -captive.apple.com -gsp-ssl.ls.apple.com -time.asis.apple.com -time.pool.aliyun.com -e7542.dsce9.akamaiedge.net -st14p02sa.guzzoni-apple.com.akadns.net -gsp64-ssl.ls-apple.com.akadns.net -e673.dsce9.akamaiedge.net -p44-buy.itunes-apple.com.akadns.net -p54-calendars.icloud.com -e905.dsce9.akamaiedge.net -a5.mzstatic.com -p44-buy.itunes.apple.com -gsp64-ssl.ls.apple.com -gspe19-ssl.ls.apple.com -gspe35-ssl.ls.apple.com -se2-cdn.itunes-apple.com.akadns.net -edge-127.usnyc.ce.apple-dns.net -e924.dsce9.akamaiedge.net -gsp51-ssl.ls.apple.com -gspe35-ssl.ls-apple.com.akadns.net -p61-caldav.icloud.com -e5153.dsce9.akamaiedge.net -p61-quota.icloud.com -p61-fmip.icloud.com -p61-fmf.icloud.com -p61-availability.icloud.com -p61-content.icloud.com -us-east-1.blobstore.apple.com -p13-content.icloud.com -p61-fmfmobile.icloud.com -genius-download-2.itunes.apple.com -genius-2.itunes.apple.com -genius-upload-2.itunes.apple.com -ld-7.itunes.apple.com -is2-ssl.mzstatic.com -is3-ssl.mzstatic.com -is4-ssl.mzstatic.com -is5-ssl.mzstatic.com -se2.itunes.apple.com -usnyc-edge-094.icloud-content.com -cl3.apple.com -p61-bookmarks.icloud.com -p61-contacts.icloud.com -p61-keyvalueservice.icloud.com -21-courier.push.apple.com -cl1.apple.com +mzstatic.com icloud.com -gspe1-ssl.ls.apple.com -1.courier-sandbox-push-apple.com.akadns.net -1-courier.sandbox.push.apple.com -1-courier.push.apple.com -a1.mzstatic.com -c1-cdn.origin-apple.com.akadns.net -init-p04st.push.apple.com -.icloud.com -store-01.blobstore.apple.com -store-1.blobstore.apple.com -a1.da1.akamai.net -gs.apple.com -ls.apple.com -cl1.apple.com -itunes.apple.com -gs-locus.ls.apple.co +aaplimg.com +apple.com +apple-dns.net +cdn-xp-ingest.edge.apple +cstat.cdn-apple.com +marketing.services.apple diff --git a/slips_files/organizations_info/apple_ip_ranges b/slips_files/organizations_info/apple_ip_ranges new file mode 100644 index 000000000..fa85abbf6 --- /dev/null +++ b/slips_files/organizations_info/apple_ip_ranges @@ -0,0 +1,13600 @@ +17.0.0.0/8 +57.102.0.0/15 +63.92.224.0/19 +65.199.22.0/23 +92.118.32.0/22 +104.28.28.0/26 +104.28.28.64/29 +104.28.28.72/30 +104.28.28.76/32 +104.28.28.79/32 +104.28.28.80/32 +104.28.28.83/32 +104.28.28.84/30 +104.28.28.88/32 +104.28.28.91/32 +104.28.28.92/32 +104.28.28.95/32 +104.28.28.96/30 +104.28.28.100/32 +104.28.29.0/27 +104.28.29.32/28 +104.28.29.48/31 +104.28.29.50/32 +104.28.29.53/32 +104.28.29.54/32 +104.28.29.59/32 +104.28.29.60/32 +104.28.29.63/32 +104.28.29.64/30 +104.28.29.68/32 +104.28.29.71/32 +104.28.29.72/30 +104.28.29.76/32 +104.28.29.79/32 +104.28.29.80/30 +104.28.29.84/32 +104.28.29.87/32 +104.28.29.88/32 +104.28.30.0/25 +104.28.30.128/27 +104.28.30.160/29 +104.28.31.0/30 +104.28.31.4/31 +104.28.31.6/32 +104.28.31.9/32 +104.28.31.10/31 +104.28.31.12/30 +104.28.31.16/30 +104.28.31.20/32 +104.28.31.23/32 +104.28.31.24/29 +104.28.31.32/30 +104.28.31.36/31 +104.28.31.38/32 +104.28.31.41/32 +104.28.31.42/31 +104.28.31.44/30 +104.28.31.48/28 +104.28.31.64/31 +104.28.31.66/32 +104.28.32.0/27 +104.28.32.32/28 +104.28.32.48/31 +104.28.32.57/32 +104.28.32.58/31 +104.28.32.60/30 +104.28.32.64/28 +104.28.32.80/29 +104.28.32.88/31 +104.28.32.90/32 +104.28.32.92/30 +104.28.32.96/27 +104.28.32.128/27 +104.28.32.160/29 +104.28.32.168/30 +104.28.32.172/31 +104.28.32.176/28 +104.28.32.192/27 +104.28.32.224/28 +104.28.32.240/29 +104.28.32.248/30 +104.28.32.252/31 +104.28.32.254/32 +104.28.33.0/29 +104.28.33.10/31 +104.28.33.12/30 +104.28.33.16/28 +104.28.33.32/27 +104.28.33.64/26 +104.28.33.128/30 +104.28.33.132/31 +104.28.33.136/29 +104.28.33.144/28 +104.28.34.0/27 +104.28.34.32/28 +104.28.34.48/31 +104.28.34.52/30 +104.28.34.56/29 +104.28.34.64/28 +104.28.34.80/31 +104.28.34.82/32 +104.28.34.85/32 +104.28.34.86/31 +104.28.34.88/29 +104.28.34.96/28 +104.28.34.112/30 +104.28.34.118/31 +104.28.34.120/29 +104.28.34.128/30 +104.28.34.132/32 +104.28.34.135/32 +104.28.34.136/32 +104.28.34.139/32 +104.28.34.140/30 +104.28.34.144/28 +104.28.34.160/28 +104.28.34.178/31 +104.28.34.180/30 +104.28.34.184/30 +104.28.35.0/27 +104.28.35.32/28 +104.28.35.48/30 +104.28.35.54/31 +104.28.35.58/31 +104.28.35.60/31 +104.28.35.66/31 +104.28.35.70/31 +104.28.35.72/30 +104.28.35.78/31 +104.28.35.80/31 +104.28.35.84/31 +104.28.35.88/31 +104.28.35.92/30 +104.28.35.96/30 +104.28.35.102/31 +104.28.36.2/31 +104.28.36.4/30 +104.28.36.8/29 +104.28.36.16/28 +104.28.36.32/27 +104.28.36.68/30 +104.28.36.72/32 +104.28.36.75/32 +104.28.36.76/30 +104.28.36.80/28 +104.28.36.96/29 +104.28.36.104/31 +104.28.36.108/30 +104.28.36.112/28 +104.28.36.128/29 +104.28.36.136/30 +104.28.36.140/31 +104.28.36.144/31 +104.28.36.148/30 +104.28.36.152/31 +104.28.36.158/31 +104.28.36.160/28 +104.28.36.176/29 +104.28.36.184/30 +104.28.37.0/30 +104.28.37.6/31 +104.28.37.8/29 +104.28.37.16/29 +104.28.37.24/32 +104.28.37.27/32 +104.28.37.28/32 +104.28.37.39/32 +104.28.37.40/29 +104.28.37.48/28 +104.28.37.64/26 +104.28.37.128/27 +104.28.37.160/31 +104.28.37.164/30 +104.28.37.168/29 +104.28.37.176/29 +104.28.37.184/31 +104.28.37.186/32 +104.28.37.189/32 +104.28.37.190/31 +104.28.37.192/27 +104.28.37.224/29 +104.28.37.232/31 +104.28.37.234/32 +104.28.37.246/31 +104.28.37.248/30 +104.28.37.252/31 +104.28.37.254/32 +104.28.38.0/27 +104.28.38.32/28 +104.28.38.48/29 +104.28.38.56/31 +104.28.38.60/30 +104.28.38.64/29 +104.28.38.72/32 +104.28.38.75/32 +104.28.38.76/30 +104.28.38.80/28 +104.28.38.96/32 +104.28.38.105/32 +104.28.38.106/31 +104.28.38.108/31 +104.28.38.110/32 +104.28.38.115/32 +104.28.38.116/30 +104.28.38.120/29 +104.28.38.128/27 +104.28.38.160/28 +104.28.38.176/30 +104.28.38.180/32 +104.28.38.183/32 +104.28.38.184/30 +104.28.38.190/31 +104.28.38.192/29 +104.28.38.200/32 +104.28.38.203/32 +104.28.38.204/32 +104.28.38.207/32 +104.28.38.208/29 +104.28.38.216/31 +104.28.39.0/25 +104.28.39.128/27 +104.28.39.160/28 +104.28.40.0/25 +104.28.40.128/27 +104.28.40.160/29 +104.28.40.168/30 +104.28.40.172/31 +104.28.40.174/32 +104.28.42.0/25 +104.28.42.128/27 +104.28.43.0/29 +104.28.43.8/30 +104.28.43.12/31 +104.28.43.14/32 +104.28.43.17/32 +104.28.43.18/31 +104.28.43.20/32 +104.28.43.31/32 +104.28.43.32/27 +104.28.43.64/26 +104.28.43.128/29 +104.28.43.136/30 +104.28.43.140/31 +104.28.43.144/29 +104.28.43.152/31 +104.28.43.156/30 +104.28.43.160/27 +104.28.43.192/27 +104.28.43.224/28 +104.28.43.240/29 +104.28.43.248/30 +104.28.43.252/31 +104.28.43.254/32 +104.28.44.0/26 +104.28.44.64/27 +104.28.44.98/31 +104.28.44.100/30 +104.28.44.104/30 +104.28.44.110/31 +104.28.44.112/30 +104.28.44.116/31 +104.28.44.120/29 +104.28.44.128/26 +104.28.44.192/27 +104.28.44.224/31 +104.28.44.228/30 +104.28.44.232/31 +104.28.45.0/28 +104.28.45.16/29 +104.28.45.24/31 +104.28.45.28/30 +104.28.45.32/30 +104.28.45.36/31 +104.28.45.42/31 +104.28.45.48/29 +104.28.46.0/28 +104.28.46.16/29 +104.28.46.24/31 +104.28.46.28/31 +104.28.46.32/27 +104.28.46.64/27 +104.28.46.96/30 +104.28.46.100/32 +104.28.47.0/26 +104.28.47.64/29 +104.28.47.72/30 +104.28.47.76/31 +104.28.47.80/28 +104.28.47.96/27 +104.28.47.128/26 +104.28.47.192/27 +104.28.47.224/28 +104.28.47.240/30 +104.28.48.0/25 +104.28.48.128/26 +104.28.48.192/27 +104.28.48.224/28 +104.28.48.240/29 +104.28.48.248/30 +104.28.48.252/31 +104.28.48.254/32 +104.28.49.0/26 +104.28.49.64/28 +104.28.49.80/32 +104.28.50.0/31 +104.28.50.5/32 +104.28.50.6/31 +104.28.50.8/29 +104.28.50.16/28 +104.28.50.32/27 +104.28.50.64/26 +104.28.50.128/26 +104.28.50.192/27 +104.28.50.224/29 +104.28.50.232/31 +104.28.51.0/30 +104.28.51.6/31 +104.28.51.8/29 +104.28.51.16/30 +104.28.51.20/31 +104.28.51.26/31 +104.28.51.28/30 +104.28.51.32/27 +104.28.51.64/28 +104.28.51.80/32 +104.28.51.88/31 +104.28.51.92/31 +104.28.51.96/28 +104.28.51.114/31 +104.28.51.116/30 +104.28.51.120/29 +104.28.51.128/28 +104.28.51.144/30 +104.28.51.148/32 +104.28.51.151/32 +104.28.51.152/29 +104.28.51.160/29 +104.28.51.168/30 +104.28.51.172/32 +104.28.51.175/32 +104.28.51.176/28 +104.28.51.192/31 +104.28.51.194/32 +104.28.51.197/32 +104.28.51.198/32 +104.28.51.207/32 +104.28.51.208/30 +104.28.51.212/31 +104.28.51.218/31 +104.28.51.220/30 +104.28.51.226/31 +104.28.51.228/31 +104.28.51.230/32 +104.28.51.233/32 +104.28.51.234/31 +104.28.51.236/30 +104.28.51.240/31 +104.28.51.244/30 +104.28.51.248/30 +104.28.51.254/32 +104.28.52.0/29 +104.28.52.10/31 +104.28.53.0/30 +104.28.53.4/31 +104.28.53.8/31 +104.28.53.12/30 +104.28.53.16/29 +104.28.53.27/32 +104.28.53.28/30 +104.28.53.32/27 +104.28.53.64/29 +104.28.53.72/30 +104.28.53.76/32 +104.28.53.79/32 +104.28.53.80/31 +104.28.53.82/32 +104.28.54.0/26 +104.28.54.64/27 +104.28.54.96/31 +104.28.55.0/25 +104.28.55.128/26 +104.28.55.192/27 +104.28.55.224/28 +104.28.55.240/29 +104.28.55.248/30 +104.28.55.252/31 +104.28.55.254/32 +104.28.56.0/28 +104.28.56.16/31 +104.28.56.18/32 +104.28.57.0/25 +104.28.57.128/26 +104.28.57.192/27 +104.28.57.224/28 +104.28.57.240/29 +104.28.57.248/30 +104.28.57.252/31 +104.28.57.254/32 +104.28.58.0/28 +104.28.58.16/31 +104.28.58.18/32 +104.28.59.0/25 +104.28.59.128/27 +104.28.59.160/29 +104.28.59.168/31 +104.28.59.170/32 +104.28.60.0/27 +104.28.60.32/30 +104.28.60.38/31 +104.28.60.42/31 +104.28.60.44/30 +104.28.60.48/28 +104.28.60.64/27 +104.28.60.98/31 +104.28.60.100/30 +104.28.60.104/29 +104.28.60.112/28 +104.28.60.128/29 +104.28.60.136/30 +104.28.60.140/32 +104.28.60.143/32 +104.28.60.144/29 +104.28.60.152/30 +104.28.60.156/31 +104.28.60.160/31 +104.28.60.164/30 +104.28.60.168/31 +104.28.60.174/31 +104.28.60.178/31 +104.28.60.182/31 +104.28.60.184/31 +104.28.60.188/30 +104.28.60.192/28 +104.28.60.208/32 +104.28.60.215/32 +104.28.60.216/29 +104.28.60.224/28 +104.28.60.240/29 +104.28.60.248/30 +104.28.60.252/31 +104.28.60.254/32 +104.28.61.0/28 +104.28.61.16/29 +104.28.61.24/30 +104.28.61.28/32 +104.28.61.31/32 +104.28.61.32/27 +104.28.61.64/29 +104.28.61.72/30 +104.28.61.76/32 +104.28.61.79/32 +104.28.61.80/28 +104.28.61.96/28 +104.28.61.112/30 +104.28.61.116/31 +104.28.62.0/26 +104.28.62.64/27 +104.28.62.96/31 +104.28.62.98/32 +104.28.63.0/25 +104.28.63.128/26 +104.28.63.192/27 +104.28.63.224/29 +104.28.63.232/30 +104.28.63.236/31 +104.28.64.0/27 +104.28.64.32/28 +104.28.64.48/31 +104.28.64.54/31 +104.28.64.56/30 +104.28.64.60/31 +104.28.65.0/30 +104.28.65.4/31 +104.28.65.6/32 +104.28.65.11/32 +104.28.65.12/30 +104.28.65.16/28 +104.28.65.32/29 +104.28.65.40/31 +104.28.65.42/32 +104.28.65.45/32 +104.28.65.46/31 +104.28.65.48/28 +104.28.65.64/31 +104.28.65.66/32 +104.28.66.0/26 +104.28.66.64/27 +104.28.66.96/29 +104.28.66.104/31 +104.28.66.106/32 +104.28.66.112/31 +104.28.66.117/32 +104.28.66.118/31 +104.28.66.120/30 +104.28.66.124/31 +104.28.66.126/32 +104.28.66.129/32 +104.28.66.130/31 +104.28.66.132/30 +104.28.66.136/29 +104.28.66.144/28 +104.28.66.160/27 +104.28.66.192/27 +104.28.66.224/28 +104.28.66.240/32 +104.28.66.243/32 +104.28.66.244/30 +104.28.66.248/30 +104.28.66.252/31 +104.28.66.254/32 +104.28.67.0/29 +104.28.67.8/31 +104.28.67.10/32 +104.28.67.13/32 +104.28.67.14/31 +104.28.67.16/28 +104.28.67.32/27 +104.28.67.64/26 +104.28.67.128/26 +104.28.67.192/28 +104.28.67.208/29 +104.28.67.216/30 +104.28.67.220/31 +104.28.67.237/32 +104.28.67.238/31 +104.28.67.240/32 +104.28.67.243/32 +104.28.67.244/30 +104.28.67.248/31 +104.28.67.250/32 +104.28.67.253/32 +104.28.67.254/32 +104.28.68.2/31 +104.28.68.4/30 +104.28.68.8/31 +104.28.68.12/30 +104.28.68.16/31 +104.28.68.22/31 +104.28.68.24/29 +104.28.68.32/28 +104.28.68.48/30 +104.28.68.52/31 +104.28.68.56/29 +104.28.68.64/28 +104.28.68.80/29 +104.28.68.88/31 +104.28.68.90/32 +104.28.68.93/32 +104.28.68.94/31 +104.28.68.96/32 +104.28.68.101/32 +104.28.68.102/32 +104.28.68.105/32 +104.28.68.106/31 +104.28.68.108/30 +104.28.68.112/29 +104.28.68.120/30 +104.28.68.124/31 +104.28.68.128/27 +104.28.68.160/28 +104.28.68.176/30 +104.28.68.180/31 +104.28.68.182/32 +104.28.68.185/32 +104.28.68.186/31 +104.28.68.188/31 +104.28.68.190/32 +104.28.69.0/29 +104.28.69.8/30 +104.28.69.12/31 +104.28.69.14/32 +104.28.69.25/32 +104.28.69.26/31 +104.28.69.28/30 +104.28.69.32/27 +104.28.69.64/29 +104.28.69.74/31 +104.28.69.76/30 +104.28.69.80/29 +104.28.69.88/30 +104.28.69.92/31 +104.28.69.96/29 +104.28.69.104/31 +104.28.69.112/31 +104.28.69.117/32 +104.28.69.118/31 +104.28.69.120/30 +104.28.69.124/31 +104.28.69.126/32 +104.28.69.129/32 +104.28.69.130/31 +104.28.69.132/30 +104.28.69.136/29 +104.28.69.144/28 +104.28.69.160/27 +104.28.69.192/27 +104.28.69.224/28 +104.28.69.240/32 +104.28.69.243/32 +104.28.69.244/30 +104.28.69.248/30 +104.28.69.252/31 +104.28.69.254/32 +104.28.70.0/29 +104.28.70.8/31 +104.28.70.10/32 +104.28.70.13/32 +104.28.70.14/31 +104.28.70.16/28 +104.28.70.32/27 +104.28.70.64/26 +104.28.70.128/26 +104.28.70.192/28 +104.28.70.208/29 +104.28.70.216/30 +104.28.70.220/31 +104.28.70.237/32 +104.28.70.238/31 +104.28.70.240/32 +104.28.70.243/32 +104.28.70.244/30 +104.28.70.248/31 +104.28.70.250/32 +104.28.70.253/32 +104.28.70.254/32 +104.28.71.2/31 +104.28.71.4/30 +104.28.71.8/31 +104.28.71.12/30 +104.28.71.16/31 +104.28.71.22/31 +104.28.71.24/29 +104.28.71.32/28 +104.28.71.48/30 +104.28.71.52/31 +104.28.71.56/29 +104.28.71.64/28 +104.28.71.80/29 +104.28.71.88/31 +104.28.71.90/32 +104.28.71.93/32 +104.28.71.94/31 +104.28.71.96/32 +104.28.71.101/32 +104.28.71.102/32 +104.28.71.105/32 +104.28.71.106/31 +104.28.71.108/30 +104.28.71.112/29 +104.28.71.120/30 +104.28.71.124/31 +104.28.71.128/27 +104.28.71.160/28 +104.28.71.176/30 +104.28.71.180/31 +104.28.71.182/32 +104.28.71.185/32 +104.28.71.186/31 +104.28.71.188/31 +104.28.71.190/32 +104.28.72.0/30 +104.28.72.8/31 +104.28.72.14/31 +104.28.72.16/31 +104.28.72.20/30 +104.28.72.24/31 +104.28.72.28/30 +104.28.72.32/31 +104.28.72.36/31 +104.28.76.1/32 +104.28.76.2/31 +104.28.76.4/30 +104.28.76.8/29 +104.28.76.16/28 +104.28.76.32/30 +104.28.76.36/31 +104.28.76.42/31 +104.28.76.44/30 +104.28.76.48/29 +104.28.76.57/32 +104.28.76.58/31 +104.28.76.60/32 +104.28.76.63/32 +104.28.76.64/32 +104.28.76.69/32 +104.28.76.70/31 +104.28.76.72/29 +104.28.76.80/28 +104.28.76.96/27 +104.28.76.128/26 +104.28.76.192/27 +104.28.76.224/28 +104.28.76.240/29 +104.28.76.248/30 +104.28.76.252/31 +104.28.76.254/32 +104.28.77.2/31 +104.28.77.4/30 +104.28.77.8/29 +104.28.77.16/28 +104.28.77.32/27 +104.28.77.64/29 +104.28.77.72/30 +104.28.77.76/32 +104.28.77.79/32 +104.28.77.80/28 +104.28.77.96/27 +104.28.77.128/26 +104.28.77.192/30 +104.28.77.196/32 +104.28.77.199/32 +104.28.77.200/29 +104.28.77.208/29 +104.28.77.216/32 +104.28.78.2/31 +104.28.78.4/30 +104.28.78.8/29 +104.28.78.16/28 +104.28.78.32/30 +104.28.78.36/31 +104.28.78.42/31 +104.28.78.44/31 +104.28.78.46/32 +104.28.78.49/32 +104.28.78.50/31 +104.28.78.52/31 +104.28.78.54/32 +104.28.78.57/32 +104.28.78.58/31 +104.28.78.60/32 +104.28.78.63/32 +104.28.78.64/32 +104.28.78.69/32 +104.28.78.70/31 +104.28.78.72/29 +104.28.78.80/28 +104.28.78.96/27 +104.28.78.128/26 +104.28.78.192/27 +104.28.78.224/28 +104.28.78.240/29 +104.28.78.248/30 +104.28.78.252/31 +104.28.78.254/32 +104.28.79.2/31 +104.28.79.4/30 +104.28.79.8/29 +104.28.79.16/28 +104.28.79.32/27 +104.28.79.64/29 +104.28.79.72/30 +104.28.79.76/32 +104.28.79.79/32 +104.28.79.80/28 +104.28.79.96/27 +104.28.79.128/26 +104.28.79.192/30 +104.28.79.196/32 +104.28.79.199/32 +104.28.79.200/29 +104.28.79.208/29 +104.28.79.216/32 +104.28.80.0/30 +104.28.80.4/32 +104.28.80.6/31 +104.28.80.8/29 +104.28.80.16/28 +104.28.80.32/29 +104.28.80.40/31 +104.28.80.44/31 +104.28.80.48/28 +104.28.80.64/28 +104.28.80.80/31 +104.28.80.82/32 +104.28.80.90/31 +104.28.80.94/31 +104.28.80.98/31 +104.28.80.100/30 +104.28.80.104/29 +104.28.80.112/31 +104.28.80.116/30 +104.28.80.120/29 +104.28.80.128/29 +104.28.80.138/31 +104.28.80.140/30 +104.28.80.144/28 +104.28.80.160/28 +104.28.80.176/31 +104.28.80.178/32 +104.28.80.181/32 +104.28.80.182/31 +104.28.80.184/29 +104.28.80.192/29 +104.28.80.200/31 +104.28.80.202/32 +104.28.80.207/32 +104.28.80.208/32 +104.28.80.215/32 +104.28.80.216/32 +104.28.80.219/32 +104.28.80.220/31 +104.28.80.222/32 +104.28.80.227/32 +104.28.80.228/30 +104.28.80.232/29 +104.28.80.240/29 +104.28.80.248/30 +104.28.81.5/32 +104.28.81.6/31 +104.28.81.8/31 +104.28.81.10/32 +104.28.81.13/32 +104.28.81.14/31 +104.28.81.16/29 +104.28.81.26/31 +104.28.81.28/30 +104.28.81.32/30 +104.28.81.36/32 +104.28.81.39/32 +104.28.81.40/30 +104.28.81.44/31 +104.28.81.46/32 +104.28.81.49/32 +104.28.81.50/31 +104.28.81.52/30 +104.28.81.56/29 +104.28.81.64/29 +104.28.81.72/30 +104.28.81.76/31 +104.28.81.78/32 +104.28.81.81/32 +104.28.81.82/32 +104.28.81.85/32 +104.28.81.86/31 +104.28.81.88/29 +104.28.82.0/30 +104.28.82.4/31 +104.28.82.6/32 +104.28.82.9/32 +104.28.82.10/31 +104.28.82.12/30 +104.28.82.16/29 +104.28.82.24/30 +104.28.82.28/31 +104.28.82.32/31 +104.28.82.36/30 +104.28.82.40/29 +104.28.82.48/28 +104.28.82.64/27 +104.28.82.96/28 +104.28.82.112/32 +104.28.83.0/27 +104.28.83.32/29 +104.28.83.40/30 +104.28.83.44/32 +104.28.83.46/31 +104.28.83.48/28 +104.28.83.64/31 +104.28.83.68/30 +104.28.83.72/30 +104.28.83.76/31 +104.28.83.84/31 +104.28.83.89/32 +104.28.83.90/31 +104.28.83.92/30 +104.28.83.96/31 +104.28.83.98/32 +104.28.83.101/32 +104.28.83.102/31 +104.28.83.104/29 +104.28.83.112/28 +104.28.83.128/26 +104.28.83.192/27 +104.28.83.224/28 +104.28.83.240/30 +104.28.83.244/31 +104.28.83.246/32 +104.28.84.7/32 +104.28.84.8/31 +104.28.84.10/32 +104.28.84.13/32 +104.28.84.14/31 +104.28.84.16/30 +104.28.84.20/32 +104.28.84.23/32 +104.28.84.24/32 +104.28.84.27/32 +104.28.84.28/30 +104.28.84.32/31 +104.28.84.34/32 +104.28.84.37/32 +104.28.84.38/31 +104.28.84.40/31 +104.28.84.42/32 +104.28.84.47/32 +104.28.84.48/28 +104.28.84.64/29 +104.28.84.72/30 +104.28.84.76/32 +104.28.84.79/32 +104.28.84.80/30 +104.28.84.84/32 +104.28.84.89/32 +104.28.84.90/32 +104.28.84.93/32 +104.28.84.94/31 +104.28.84.96/29 +104.28.84.104/30 +104.28.84.110/31 +104.28.84.112/28 +104.28.84.128/29 +104.28.84.136/30 +104.28.84.140/32 +104.28.85.0/28 +104.28.85.16/30 +104.28.85.22/31 +104.28.85.26/31 +104.28.85.28/30 +104.28.85.32/27 +104.28.85.64/26 +104.28.85.128/26 +104.28.85.192/27 +104.28.85.224/28 +104.28.85.240/31 +104.28.86.0/27 +104.28.86.32/28 +104.28.86.48/30 +104.28.86.52/31 +104.28.86.54/32 +104.28.86.56/29 +104.28.86.64/26 +104.28.86.128/30 +104.28.86.132/31 +104.28.86.136/30 +104.28.87.0/29 +104.28.87.8/32 +104.28.87.10/31 +104.28.87.12/30 +104.28.87.16/29 +104.28.87.24/30 +104.28.87.28/32 +104.28.87.31/32 +104.28.87.32/28 +104.28.87.48/29 +104.28.87.56/30 +104.28.87.60/31 +104.28.87.64/29 +104.28.87.72/30 +104.28.87.76/32 +104.28.87.79/32 +104.28.87.80/32 +104.28.87.83/32 +104.28.87.84/30 +104.28.87.88/29 +104.28.87.96/28 +104.28.87.112/32 +104.28.87.115/32 +104.28.87.116/30 +104.28.87.120/31 +104.28.87.122/32 +104.28.88.0/28 +104.28.88.16/29 +104.28.88.26/31 +104.28.88.28/30 +104.28.88.32/29 +104.28.88.40/30 +104.28.88.44/32 +104.28.88.47/32 +104.28.88.48/28 +104.28.88.64/29 +104.28.88.72/30 +104.28.88.76/31 +104.28.88.80/29 +104.28.88.88/30 +104.28.88.92/31 +104.28.88.94/32 +104.28.88.97/32 +104.28.88.98/32 +104.28.88.101/32 +104.28.88.102/31 +104.28.88.104/29 +104.28.88.112/28 +104.28.88.128/29 +104.28.88.136/31 +104.28.88.140/30 +104.28.88.144/30 +104.28.89.0/28 +104.28.89.16/29 +104.28.89.24/31 +104.28.89.27/32 +104.28.89.28/30 +104.28.89.32/27 +104.28.89.64/27 +104.28.89.96/29 +104.28.89.104/32 +104.28.89.107/32 +104.28.89.108/31 +104.28.89.110/32 +104.28.90.0/27 +104.28.90.32/28 +104.28.90.48/29 +104.28.90.56/30 +104.28.90.62/31 +104.28.90.66/31 +104.28.90.68/30 +104.28.90.74/31 +104.28.90.76/31 +104.28.90.80/30 +104.28.90.84/31 +104.28.90.88/31 +104.28.91.0/27 +104.28.91.32/28 +104.28.91.51/32 +104.28.91.52/30 +104.28.91.56/29 +104.28.91.64/26 +104.28.91.128/27 +104.28.91.160/28 +104.28.91.176/29 +104.28.92.1/32 +104.28.92.2/31 +104.28.92.4/30 +104.28.92.8/29 +104.28.92.16/28 +104.28.92.32/28 +104.28.92.48/29 +104.28.92.63/32 +104.28.92.64/26 +104.28.92.128/26 +104.28.92.192/27 +104.28.92.224/28 +104.28.92.240/29 +104.28.92.248/30 +104.28.92.252/31 +104.28.92.254/32 +104.28.93.0/29 +104.28.93.8/30 +104.28.93.12/31 +104.28.94.2/31 +104.28.94.4/30 +104.28.94.8/29 +104.28.94.16/28 +104.28.94.32/28 +104.28.94.48/29 +104.28.94.63/32 +104.28.94.64/30 +104.28.94.70/31 +104.28.94.72/29 +104.28.94.80/28 +104.28.94.96/28 +104.28.94.114/31 +104.28.94.116/30 +104.28.94.120/29 +104.28.94.130/31 +104.28.94.134/31 +104.28.94.136/30 +104.28.94.142/31 +104.28.94.144/28 +104.28.94.160/27 +104.28.94.192/31 +104.28.94.194/32 +104.28.94.197/32 +104.28.94.198/31 +104.28.94.200/29 +104.28.94.208/28 +104.28.94.224/29 +104.28.94.232/30 +104.28.94.238/31 +104.28.94.240/29 +104.28.94.248/30 +104.28.94.252/31 +104.28.94.254/32 +104.28.95.0/29 +104.28.95.8/30 +104.28.95.12/32 +104.28.96.0/28 +104.28.96.16/29 +104.28.96.24/30 +104.28.96.30/31 +104.28.96.32/27 +104.28.96.64/29 +104.28.96.72/30 +104.28.96.76/32 +104.28.96.79/32 +104.28.96.80/28 +104.28.96.96/29 +104.28.96.104/30 +104.28.96.110/31 +104.28.96.112/29 +104.28.96.120/31 +104.28.96.122/32 +104.28.96.125/32 +104.28.96.126/32 +104.28.96.129/32 +104.28.96.130/31 +104.28.96.132/30 +104.28.96.136/29 +104.28.96.144/28 +104.28.96.160/31 +104.28.96.164/30 +104.28.96.168/29 +104.28.96.176/30 +104.28.97.0/26 +104.28.97.64/28 +104.28.97.80/29 +104.28.97.88/30 +104.28.97.92/32 +104.28.97.95/32 +104.28.97.96/27 +104.28.97.128/31 +104.28.98.0/26 +104.28.98.64/29 +104.28.98.72/31 +104.28.98.74/32 +104.28.98.76/30 +104.28.98.80/28 +104.28.98.96/28 +104.28.98.112/30 +104.28.99.0/26 +104.28.99.64/29 +104.28.99.72/31 +104.28.99.78/31 +104.28.99.83/32 +104.28.99.84/30 +104.28.99.88/30 +104.28.99.92/31 +104.28.99.94/32 +104.28.99.97/32 +104.28.99.98/31 +104.28.99.100/30 +104.28.99.104/29 +104.28.99.112/28 +104.28.99.128/26 +104.28.99.192/27 +104.28.99.224/28 +104.28.99.240/31 +104.28.99.242/32 +104.28.100.3/32 +104.28.100.4/31 +104.28.100.6/32 +104.28.100.9/32 +104.28.100.10/31 +104.28.100.12/30 +104.28.100.16/32 +104.28.100.19/32 +104.28.100.20/32 +104.28.100.23/32 +104.28.100.24/30 +104.28.100.28/31 +104.28.100.30/32 +104.28.100.33/32 +104.28.100.34/31 +104.28.100.36/31 +104.28.100.38/32 +104.28.100.43/32 +104.28.100.44/30 +104.28.100.48/28 +104.28.100.64/29 +104.28.100.72/32 +104.28.100.75/32 +104.28.100.76/30 +104.28.100.80/32 +104.28.100.85/32 +104.28.100.86/32 +104.28.100.89/32 +104.28.100.90/31 +104.28.100.92/30 +104.28.100.96/29 +104.28.100.106/31 +104.28.100.108/30 +104.28.101.0/27 +104.28.101.32/29 +104.28.101.40/31 +104.28.101.44/30 +104.28.101.48/29 +104.28.101.56/30 +104.28.101.62/31 +104.28.101.64/29 +104.28.101.78/31 +104.28.101.83/32 +104.28.101.84/30 +104.28.101.88/30 +104.28.101.92/31 +104.28.101.94/32 +104.28.101.97/32 +104.28.101.98/31 +104.28.101.100/30 +104.28.101.104/29 +104.28.101.112/28 +104.28.101.128/26 +104.28.101.192/27 +104.28.101.224/28 +104.28.101.240/31 +104.28.101.242/32 +104.28.102.3/32 +104.28.102.4/31 +104.28.102.6/32 +104.28.102.9/32 +104.28.102.10/31 +104.28.102.12/30 +104.28.102.16/32 +104.28.102.19/32 +104.28.102.20/32 +104.28.102.23/32 +104.28.102.24/30 +104.28.102.28/31 +104.28.102.30/32 +104.28.102.33/32 +104.28.102.34/31 +104.28.102.36/31 +104.28.102.38/32 +104.28.102.43/32 +104.28.102.44/30 +104.28.102.48/28 +104.28.102.64/29 +104.28.102.72/32 +104.28.102.75/32 +104.28.102.76/30 +104.28.102.80/32 +104.28.102.85/32 +104.28.102.86/32 +104.28.102.89/32 +104.28.102.90/31 +104.28.102.92/30 +104.28.102.96/29 +104.28.102.106/31 +104.28.102.108/30 +104.28.103.0/25 +104.28.103.128/29 +104.28.103.138/31 +104.28.103.140/30 +104.28.103.144/28 +104.28.103.160/27 +104.28.103.192/28 +104.28.103.208/29 +104.28.103.216/31 +104.28.104.0/25 +104.28.104.128/29 +104.28.104.138/31 +104.28.104.140/30 +104.28.104.144/28 +104.28.104.160/27 +104.28.104.192/28 +104.28.104.208/29 +104.28.104.216/31 +104.28.105.0/28 +104.28.105.16/32 +104.28.105.18/31 +104.28.105.22/31 +104.28.105.24/29 +104.28.105.32/30 +104.28.106.0/30 +104.28.106.6/31 +104.28.106.8/29 +104.28.106.16/29 +104.28.106.24/30 +104.28.106.28/32 +104.28.106.35/32 +104.28.106.36/32 +104.28.106.39/32 +104.28.106.40/29 +104.28.106.48/30 +104.28.106.52/31 +104.28.106.54/32 +104.28.106.62/31 +104.28.106.66/31 +104.28.106.70/31 +104.28.106.72/29 +104.28.106.80/30 +104.28.106.84/31 +104.28.106.88/29 +104.28.106.96/29 +104.28.106.104/30 +104.28.106.108/31 +104.28.106.112/28 +104.28.106.128/29 +104.28.106.136/30 +104.28.106.140/31 +104.28.106.144/30 +104.28.106.148/31 +104.28.106.152/29 +104.28.106.160/29 +104.28.106.172/31 +104.28.106.180/31 +104.28.106.184/30 +104.28.106.192/28 +104.28.106.208/31 +104.28.106.210/32 +104.28.106.219/32 +104.28.106.220/30 +104.28.106.224/32 +104.28.106.227/32 +104.28.106.228/30 +104.28.106.232/30 +104.28.106.236/31 +104.28.106.240/29 +104.28.106.248/31 +104.28.106.250/32 +104.28.106.253/32 +104.28.106.254/32 +104.28.107.0/30 +104.28.107.4/31 +104.28.107.8/29 +104.28.107.16/28 +104.28.107.32/30 +104.28.107.38/31 +104.28.107.42/31 +104.28.107.44/30 +104.28.107.48/31 +104.28.107.50/32 +104.28.108.0/29 +104.28.108.8/31 +104.28.108.10/32 +104.28.109.2/31 +104.28.109.4/30 +104.28.109.8/29 +104.28.109.16/28 +104.28.109.32/28 +104.28.109.48/29 +104.28.109.56/30 +104.28.109.60/32 +104.28.109.65/32 +104.28.109.66/32 +104.28.109.69/32 +104.28.109.70/31 +104.28.109.72/29 +104.28.109.80/28 +104.28.109.96/27 +104.28.109.128/26 +104.28.109.192/27 +104.28.109.224/28 +104.28.109.240/29 +104.28.109.248/30 +104.28.109.252/31 +104.28.109.254/32 +104.28.110.0/28 +104.28.110.16/30 +104.28.110.20/31 +104.28.110.22/32 +104.28.110.25/32 +104.28.110.26/31 +104.28.110.28/30 +104.28.110.32/27 +104.28.110.64/26 +104.28.110.128/31 +104.28.111.0/29 +104.28.111.8/30 +104.28.111.12/31 +104.28.111.14/32 +104.28.111.21/32 +104.28.111.22/31 +104.28.111.24/29 +104.28.111.32/27 +104.28.111.64/26 +104.28.111.128/26 +104.28.111.192/27 +104.28.111.224/28 +104.28.111.240/29 +104.28.111.248/30 +104.28.111.252/31 +104.28.111.254/32 +104.28.112.0/28 +104.28.113.0/26 +104.28.113.64/29 +104.28.113.72/30 +104.28.113.78/31 +104.28.113.80/28 +104.28.113.96/27 +104.28.113.128/26 +104.28.113.192/28 +104.28.114.0/27 +104.28.114.32/30 +104.28.114.36/32 +104.28.114.43/32 +104.28.114.44/32 +104.28.114.49/32 +104.28.114.50/31 +104.28.114.52/30 +104.28.114.56/29 +104.28.114.64/32 +104.28.115.0/26 +104.28.115.64/27 +104.28.115.96/31 +104.28.115.98/32 +104.28.116.0/25 +104.28.116.128/26 +104.28.116.192/31 +104.28.116.194/32 +104.28.117.0/28 +104.28.117.16/31 +104.28.117.18/32 +104.28.117.27/32 +104.28.117.28/30 +104.28.117.32/27 +104.28.117.64/29 +104.28.117.72/31 +104.28.117.76/30 +104.28.117.80/28 +104.28.117.98/31 +104.28.117.100/30 +104.28.117.104/30 +104.28.117.114/31 +104.28.117.119/32 +104.28.117.120/29 +104.28.117.128/32 +104.28.117.131/32 +104.28.117.132/30 +104.28.117.136/29 +104.28.117.144/28 +104.28.117.160/27 +104.28.117.192/27 +104.28.117.224/29 +104.28.117.232/30 +104.28.117.236/31 +104.28.117.238/32 +104.28.117.241/32 +104.28.117.242/31 +104.28.117.244/30 +104.28.117.248/30 +104.28.117.252/31 +104.28.117.254/32 +104.28.118.0/29 +104.28.118.8/32 +104.28.118.11/32 +104.28.118.12/30 +104.28.118.16/28 +104.28.118.32/27 +104.28.118.64/26 +104.28.118.128/26 +104.28.118.192/28 +104.28.118.208/29 +104.28.118.231/32 +104.28.118.232/31 +104.28.118.234/32 +104.28.118.237/32 +104.28.118.238/31 +104.28.118.240/30 +104.28.118.244/32 +104.28.118.247/32 +104.28.118.248/32 +104.28.118.251/32 +104.28.118.252/31 +104.28.118.254/32 +104.28.119.0/30 +104.28.119.6/31 +104.28.119.8/30 +104.28.119.16/28 +104.28.119.32/28 +104.28.119.50/31 +104.28.119.52/30 +104.28.119.56/29 +104.28.119.64/28 +104.28.119.80/30 +104.28.119.84/31 +104.28.119.86/32 +104.28.119.89/32 +104.28.119.90/31 +104.28.119.92/30 +104.28.119.96/27 +104.28.119.128/28 +104.28.119.144/29 +104.28.119.152/30 +104.28.119.156/32 +104.28.119.159/32 +104.28.119.160/30 +104.28.119.164/32 +104.28.120.0/29 +104.28.120.8/31 +104.28.120.10/32 +104.28.120.13/32 +104.28.120.14/31 +104.28.120.16/32 +104.28.120.27/32 +104.28.120.28/30 +104.28.120.32/27 +104.28.120.64/29 +104.28.120.72/31 +104.28.120.76/30 +104.28.120.80/28 +104.28.120.98/31 +104.28.120.100/30 +104.28.120.104/30 +104.28.120.114/31 +104.28.120.119/32 +104.28.120.120/29 +104.28.120.128/32 +104.28.120.131/32 +104.28.120.132/30 +104.28.120.136/29 +104.28.120.144/28 +104.28.120.160/27 +104.28.120.192/27 +104.28.120.224/29 +104.28.120.232/30 +104.28.120.236/31 +104.28.120.238/32 +104.28.120.241/32 +104.28.120.242/31 +104.28.120.244/30 +104.28.120.248/30 +104.28.120.252/31 +104.28.120.254/32 +104.28.121.0/29 +104.28.121.8/32 +104.28.121.11/32 +104.28.121.12/30 +104.28.121.16/28 +104.28.121.32/27 +104.28.121.64/26 +104.28.121.128/26 +104.28.121.192/28 +104.28.121.208/29 +104.28.121.231/32 +104.28.121.232/31 +104.28.121.234/32 +104.28.121.237/32 +104.28.121.238/31 +104.28.121.240/30 +104.28.121.244/32 +104.28.121.247/32 +104.28.121.248/32 +104.28.121.251/32 +104.28.121.252/31 +104.28.121.254/32 +104.28.122.0/30 +104.28.122.6/31 +104.28.122.8/30 +104.28.122.16/28 +104.28.122.32/28 +104.28.122.50/31 +104.28.122.52/30 +104.28.122.56/29 +104.28.122.64/28 +104.28.122.80/30 +104.28.122.84/31 +104.28.122.86/32 +104.28.122.89/32 +104.28.122.90/31 +104.28.122.92/30 +104.28.122.96/27 +104.28.122.128/28 +104.28.122.144/29 +104.28.122.152/30 +104.28.122.156/32 +104.28.122.159/32 +104.28.122.160/30 +104.28.122.164/32 +104.28.123.0/28 +104.28.123.16/30 +104.28.123.20/32 +104.28.123.24/29 +104.28.123.32/27 +104.28.123.64/26 +104.28.123.128/26 +104.28.123.192/28 +104.28.123.208/29 +104.28.123.216/31 +104.28.124.0/28 +104.28.124.16/30 +104.28.124.24/29 +104.28.124.32/27 +104.28.124.64/26 +104.28.124.128/26 +104.28.124.192/28 +104.28.124.208/29 +104.28.124.216/31 +104.28.125.0/26 +104.28.125.64/28 +104.28.125.80/29 +104.28.125.88/30 +104.28.125.92/31 +104.28.125.96/31 +104.28.126.2/31 +104.28.126.4/30 +104.28.126.8/29 +104.28.126.16/28 +104.28.126.32/28 +104.28.126.48/29 +104.28.126.63/32 +104.28.126.64/30 +104.28.126.70/31 +104.28.126.72/29 +104.28.126.80/28 +104.28.126.96/28 +104.28.126.112/31 +104.28.126.116/30 +104.28.126.120/30 +104.28.126.124/31 +104.28.126.128/31 +104.28.126.132/30 +104.28.126.138/31 +104.28.126.140/30 +104.28.126.144/28 +104.28.126.160/27 +104.28.126.192/28 +104.28.126.208/29 +104.28.126.216/30 +104.28.126.220/32 +104.28.126.223/32 +104.28.126.224/28 +104.28.126.240/29 +104.28.126.248/30 +104.28.126.252/31 +104.28.126.254/32 +104.28.127.0/27 +104.28.127.32/30 +104.28.127.38/31 +104.28.127.40/29 +104.28.127.48/28 +104.28.127.64/30 +104.28.128.6/31 +104.28.128.11/32 +104.28.128.12/30 +104.28.128.16/30 +104.28.128.20/32 +104.28.129.0/27 +104.28.129.32/30 +104.28.129.36/31 +104.28.129.38/32 +104.28.129.45/32 +104.28.129.46/32 +104.28.129.51/32 +104.28.129.52/30 +104.28.129.56/30 +104.28.129.60/32 +104.28.130.0/28 +104.28.130.16/32 +104.28.130.19/32 +104.28.130.20/30 +104.28.130.24/29 +104.28.130.32/28 +104.28.130.48/29 +104.28.130.56/30 +104.28.130.60/32 +104.28.130.63/32 +104.28.130.64/28 +104.28.130.80/30 +104.28.130.84/31 +104.28.130.86/32 +104.28.130.89/32 +104.28.130.90/31 +104.28.130.92/30 +104.28.130.96/29 +104.28.130.104/30 +104.28.130.114/31 +104.28.130.116/31 +104.28.130.122/31 +104.28.130.126/31 +104.28.130.128/31 +104.28.130.132/30 +104.28.130.136/29 +104.28.130.144/31 +104.28.130.154/31 +104.28.130.156/30 +104.28.130.160/29 +104.28.130.168/32 +104.28.130.171/32 +104.28.130.172/30 +104.28.130.176/28 +104.28.130.192/29 +104.28.131.0/28 +104.28.131.16/30 +104.28.131.24/29 +104.28.131.32/30 +104.28.131.36/31 +104.28.131.41/32 +104.28.131.42/32 +104.28.131.45/32 +104.28.131.46/32 +104.28.131.49/32 +104.28.131.50/31 +104.28.131.52/30 +104.28.131.56/29 +104.28.131.64/32 +104.28.131.67/32 +104.28.131.68/30 +104.28.131.72/29 +104.28.131.80/31 +104.28.131.82/32 +104.28.131.85/32 +104.28.131.86/31 +104.28.131.88/29 +104.28.131.96/29 +104.28.131.104/31 +104.28.131.112/31 +104.28.131.118/31 +104.28.131.120/31 +104.28.131.124/30 +104.28.131.128/28 +104.28.131.146/31 +104.28.131.148/31 +104.28.131.156/30 +104.28.131.160/29 +104.28.131.168/31 +104.28.131.170/32 +104.28.131.173/32 +104.28.131.174/31 +104.28.131.176/30 +104.28.131.180/32 +104.28.131.183/32 +104.28.131.184/29 +104.28.131.192/29 +104.28.131.200/32 +104.28.132.0/25 +104.28.132.128/27 +104.28.132.160/32 +104.28.133.0/25 +104.28.133.128/26 +104.28.133.192/27 +104.28.133.224/30 +104.28.133.228/32 +104.28.133.231/32 +104.28.133.232/29 +104.28.133.240/29 +104.28.133.248/30 +104.28.133.252/31 +104.28.133.254/32 +104.28.134.0/31 +104.28.135.0/26 +104.28.135.64/28 +104.28.135.80/29 +104.28.136.1/32 +104.28.136.2/31 +104.28.136.4/30 +104.28.136.8/29 +104.28.136.16/28 +104.28.136.32/27 +104.28.136.64/26 +104.28.136.128/25 +104.28.137.1/32 +104.28.137.2/31 +104.28.137.4/30 +104.28.137.8/29 +104.28.137.16/29 +104.28.137.24/30 +104.28.138.1/32 +104.28.138.2/31 +104.28.138.4/30 +104.28.138.8/29 +104.28.138.16/28 +104.28.138.32/27 +104.28.138.64/26 +104.28.138.128/28 +104.28.138.144/31 +104.28.139.1/32 +104.28.139.2/31 +104.28.139.4/30 +104.28.139.8/29 +104.28.139.16/28 +104.28.139.32/27 +104.28.139.64/26 +104.28.139.128/26 +104.28.139.192/27 +104.28.139.224/28 +104.28.139.240/29 +104.28.139.248/30 +104.28.139.252/31 +104.28.139.254/32 +104.28.140.1/32 +104.28.140.2/31 +104.28.140.4/30 +104.28.140.8/29 +104.28.140.16/28 +104.28.140.32/27 +104.28.140.64/26 +104.28.140.128/25 +104.28.141.1/32 +104.28.141.2/31 +104.28.141.4/30 +104.28.141.8/29 +104.28.141.16/28 +104.28.141.32/27 +104.28.141.64/26 +104.28.141.128/25 +104.28.142.1/32 +104.28.142.2/31 +104.28.142.4/30 +104.28.142.8/29 +104.28.142.16/28 +104.28.142.32/27 +104.28.142.64/26 +104.28.142.128/25 +104.28.143.1/32 +104.28.143.2/31 +104.28.143.4/30 +104.28.143.8/29 +104.28.143.16/28 +104.28.143.32/29 +104.28.143.40/30 +104.28.143.44/32 +104.28.143.48/28 +104.28.143.64/26 +104.28.143.128/26 +104.28.143.192/27 +104.28.143.224/28 +104.28.143.240/29 +104.28.143.248/30 +104.28.143.252/31 +104.28.143.254/32 +104.28.144.1/32 +104.28.144.2/31 +104.28.144.4/30 +104.28.144.8/29 +104.28.144.16/28 +104.28.144.32/27 +104.28.144.64/26 +104.28.144.128/25 +104.28.145.1/32 +104.28.145.2/31 +104.28.145.4/30 +104.28.145.8/29 +104.28.145.16/28 +104.28.145.32/27 +104.28.145.64/26 +104.28.145.128/25 +104.28.146.1/32 +104.28.146.2/31 +104.28.146.4/30 +104.28.146.8/29 +104.28.146.16/28 +104.28.146.32/27 +104.28.146.64/26 +104.28.146.128/25 +104.28.147.1/32 +104.28.147.2/31 +104.28.147.4/30 +104.28.147.8/29 +104.28.147.16/28 +104.28.147.32/27 +104.28.147.64/26 +104.28.147.128/25 +104.28.148.1/32 +104.28.148.2/31 +104.28.148.4/30 +104.28.148.8/29 +104.28.148.16/28 +104.28.148.32/27 +104.28.148.64/26 +104.28.148.128/25 +104.28.149.1/32 +104.28.149.2/31 +104.28.149.4/30 +104.28.149.8/29 +104.28.149.16/28 +104.28.149.32/27 +104.28.149.64/26 +104.28.149.128/25 +104.28.150.1/32 +104.28.150.2/31 +104.28.150.4/30 +104.28.150.8/29 +104.28.150.16/28 +104.28.150.32/27 +104.28.150.64/26 +104.28.150.128/25 +104.28.151.1/32 +104.28.151.2/31 +104.28.151.4/30 +104.28.151.8/29 +104.28.151.16/28 +104.28.151.32/27 +104.28.151.64/26 +104.28.151.128/26 +104.28.151.192/27 +104.28.151.224/28 +104.28.151.240/29 +104.28.151.248/30 +104.28.151.252/31 +104.28.151.254/32 +139.178.128.0/17 +140.248.0.0/23 +140.248.4.0/23 +140.248.6.0/26 +140.248.6.64/28 +140.248.6.80/31 +140.248.8.0/27 +140.248.8.32/30 +140.248.8.36/31 +140.248.10.0/28 +140.248.11.0/29 +140.248.11.8/31 +140.248.12.0/23 +140.248.14.0/27 +140.248.14.32/28 +140.248.16.0/28 +140.248.16.16/29 +140.248.16.24/31 +140.248.18.0/27 +140.248.19.0/29 +140.248.19.8/30 +140.248.20.0/24 +140.248.21.0/29 +140.248.24.0/26 +140.248.24.64/28 +140.248.24.80/29 +140.248.24.88/30 +140.248.24.92/31 +140.248.25.0/27 +140.248.25.32/28 +140.248.25.48/30 +140.248.26.0/24 +140.248.27.0/27 +140.248.27.32/28 +140.248.28.0/28 +140.248.28.16/30 +140.248.28.20/31 +140.248.29.0/29 +140.248.29.8/31 +140.248.30.0/24 +140.248.31.0/27 +140.248.31.32/28 +140.248.32.0/30 +140.248.32.4/31 +140.248.32.8/30 +140.248.32.12/31 +140.248.33.0/27 +140.248.33.32/28 +140.248.33.48/29 +140.248.33.56/31 +140.248.34.0/25 +140.248.34.132/30 +140.248.34.136/29 +140.248.34.144/28 +140.248.34.160/27 +140.248.34.192/27 +140.248.34.224/28 +140.248.34.240/30 +140.248.34.244/31 +140.248.36.0/25 +140.248.36.128/28 +140.248.36.144/31 +140.248.36.150/31 +140.248.36.152/29 +140.248.36.160/27 +140.248.36.192/26 +140.248.37.0/27 +140.248.37.32/29 +140.248.37.40/31 +140.248.37.44/30 +140.248.37.48/28 +140.248.37.64/28 +140.248.37.80/31 +140.248.38.0/27 +140.248.38.32/29 +140.248.38.40/30 +140.248.39.0/31 +140.248.40.0/25 +140.248.40.128/26 +140.248.40.192/28 +140.248.41.0/26 +140.248.41.64/28 +140.248.41.80/29 +140.248.41.88/30 +140.248.41.92/31 +140.248.42.0/25 +140.248.42.128/26 +140.248.42.192/27 +140.248.42.224/31 +140.248.42.228/30 +140.248.43.0/28 +140.248.43.16/30 +140.248.43.22/31 +140.248.43.24/29 +140.248.43.32/27 +140.248.43.64/26 +140.248.43.128/26 +140.248.43.192/27 +140.248.43.224/28 +140.248.43.240/29 +140.248.43.248/30 +140.248.43.252/31 +140.248.44.0/28 +140.248.44.16/29 +140.248.44.24/30 +140.248.44.28/31 +140.248.44.32/27 +140.248.44.64/26 +140.248.44.128/25 +140.248.45.0/24 +140.248.46.0/26 +140.248.46.64/27 +140.248.46.96/28 +140.248.46.112/29 +140.248.46.120/30 +140.248.46.124/31 +140.248.48.0/24 +140.248.49.0/28 +140.248.49.16/29 +144.178.0.0/18 +146.75.128.0/23 +146.75.130.0/28 +146.75.130.16/29 +146.75.130.24/30 +146.75.130.28/31 +146.75.132.0/25 +146.75.132.128/27 +146.75.132.160/28 +146.75.132.176/30 +146.75.132.180/31 +146.75.134.0/23 +146.75.136.0/24 +146.75.137.0/29 +146.75.146.0/28 +146.75.146.16/30 +146.75.146.22/31 +146.75.146.24/29 +146.75.146.32/27 +146.75.146.64/26 +146.75.146.128/25 +146.75.147.0/30 +146.75.148.0/23 +146.75.150.0/28 +146.75.150.16/30 +146.75.150.20/31 +146.75.152.0/24 +146.75.153.0/25 +146.75.153.128/28 +146.75.153.144/30 +146.75.153.148/31 +146.75.154.0/24 +146.75.155.0/28 +146.75.158.0/24 +146.75.159.0/27 +146.75.159.32/28 +146.75.160.0/25 +146.75.160.128/27 +146.75.160.160/28 +146.75.160.176/30 +146.75.160.180/31 +146.75.162.0/26 +146.75.162.64/27 +146.75.162.96/28 +146.75.162.112/31 +146.75.164.0/24 +146.75.165.0/27 +146.75.165.32/28 +146.75.165.48/29 +146.75.165.56/30 +146.75.165.60/31 +146.75.166.0/25 +146.75.166.128/28 +146.75.166.144/31 +146.75.166.192/31 +146.75.168.0/25 +146.75.168.128/26 +146.75.169.0/25 +146.75.169.132/30 +146.75.169.136/29 +146.75.169.144/28 +146.75.169.160/27 +146.75.169.192/27 +146.75.169.224/28 +146.75.169.240/30 +146.75.170.0/25 +146.75.170.128/26 +146.75.170.192/27 +146.75.170.224/28 +146.75.172.0/24 +146.75.173.0/27 +146.75.173.32/28 +146.75.174.0/25 +146.75.174.128/29 +146.75.174.136/30 +146.75.174.140/31 +146.75.175.0/26 +146.75.175.64/28 +146.75.175.80/29 +146.75.178.26/31 +146.75.178.28/31 +146.75.179.0/27 +146.75.179.32/28 +146.75.179.48/30 +146.75.180.0/27 +146.75.180.32/30 +146.75.180.40/29 +146.75.180.48/28 +146.75.180.64/29 +146.75.180.72/31 +146.75.182.0/26 +146.75.182.64/31 +146.75.183.0/30 +146.75.183.4/31 +146.75.184.0/25 +146.75.184.128/26 +146.75.184.192/27 +146.75.184.224/28 +146.75.185.0/25 +146.75.185.128/26 +146.75.185.192/31 +146.75.186.0/27 +146.75.186.32/28 +146.75.187.0/27 +146.75.187.32/28 +146.75.187.48/29 +146.75.187.56/30 +146.75.188.0/26 +146.75.188.64/30 +146.75.188.68/31 +146.75.189.0/27 +146.75.189.32/28 +146.75.189.48/31 +146.75.190.0/27 +146.75.190.32/28 +146.75.190.48/30 +146.75.191.0/27 +146.75.191.32/28 +146.75.191.48/30 +146.75.192.0/24 +146.75.193.0/27 +146.75.193.32/28 +146.75.195.0/24 +146.75.197.0/27 +146.75.197.32/29 +146.75.197.40/30 +146.75.197.44/31 +146.75.198.0/27 +146.75.198.32/29 +146.75.200.0/27 +146.75.200.32/30 +146.75.201.0/27 +146.75.201.32/30 +146.75.201.36/31 +146.75.202.0/29 +146.75.202.8/30 +146.75.202.12/31 +146.75.203.0/26 +146.75.203.64/28 +146.75.203.80/29 +146.75.205.0/27 +146.75.205.32/29 +146.75.205.40/31 +146.75.206.0/28 +146.75.206.16/29 +146.75.206.24/31 +146.75.207.0/26 +146.75.207.64/30 +146.75.207.68/31 +146.75.208.0/29 +146.75.208.8/30 +146.75.208.14/31 +146.75.208.16/28 +146.75.209.0/28 +146.75.209.16/31 +146.75.210.0/26 +146.75.210.64/31 +146.75.211.0/28 +146.75.211.16/30 +146.75.211.20/31 +146.75.212.0/26 +146.75.212.64/30 +146.75.212.68/31 +146.75.213.0/28 +146.75.213.16/29 +146.75.214.0/27 +146.75.214.32/29 +146.75.214.40/30 +146.75.214.44/31 +146.75.216.0/29 +146.75.216.8/31 +146.75.217.0/30 +146.75.218.0/29 +146.75.218.8/31 +146.75.219.0/29 +146.75.219.8/31 +146.75.220.0/28 +146.75.220.16/31 +146.75.221.0/29 +146.75.221.8/30 +146.75.222.0/23 +146.75.224.0/30 +146.75.232.0/23 +146.75.234.0/27 +146.75.234.32/28 +146.75.234.48/31 +146.75.236.0/23 +146.75.238.0/28 +146.75.238.16/29 +146.75.238.24/30 +146.75.238.28/31 +146.75.244.0/23 +146.75.246.0/28 +146.75.246.16/30 +146.75.246.20/31 +146.75.248.0/23 +146.75.250.0/27 +146.75.250.32/28 +146.75.252.0/23 +172.224.226.0/26 +172.224.226.64/28 +172.224.226.80/30 +172.224.226.88/29 +172.224.226.96/28 +172.224.226.112/29 +172.224.226.128/27 +172.224.227.0/26 +172.224.227.64/28 +172.224.227.80/29 +172.224.227.88/30 +172.224.228.24/31 +172.224.228.32/28 +172.224.228.64/26 +172.224.229.0/26 +172.224.229.64/29 +172.224.229.80/28 +172.224.229.96/28 +172.224.230.0/26 +172.224.230.64/27 +172.224.230.96/31 +172.224.230.104/29 +172.224.230.112/28 +172.224.230.128/25 +172.224.231.0/25 +172.224.231.128/26 +172.224.231.192/27 +172.224.231.224/28 +172.224.231.240/29 +172.224.232.0/27 +172.224.232.32/30 +172.224.232.36/31 +172.224.232.40/29 +172.224.232.48/28 +172.224.234.0/26 +172.224.234.64/29 +172.224.234.80/28 +172.224.234.96/27 +172.224.236.0/28 +172.224.236.16/29 +172.224.236.24/31 +172.224.236.32/27 +172.224.236.64/27 +172.224.237.0/24 +172.224.238.0/26 +172.224.238.64/28 +172.224.238.80/29 +172.224.238.88/30 +172.224.240.0/27 +172.224.240.32/29 +172.224.240.48/28 +172.224.240.64/28 +172.224.240.96/27 +172.224.240.128/27 +172.224.241.0/24 +172.224.242.0/25 +172.224.242.128/26 +172.224.242.192/28 +172.224.242.208/29 +172.224.242.216/30 +172.224.243.0/25 +172.224.243.128/29 +172.224.243.136/31 +172.224.244.0/29 +172.224.244.8/31 +172.224.246.0/27 +172.224.246.32/28 +172.224.246.48/29 +172.224.246.56/30 +172.224.246.60/31 +172.224.247.0/26 +172.224.247.64/27 +172.224.247.96/28 +172.224.247.112/30 +172.224.247.116/31 +172.224.248.0/26 +172.224.249.0/27 +172.224.249.32/28 +172.224.249.64/27 +172.224.250.0/25 +172.224.250.128/26 +172.224.250.192/31 +172.224.250.224/27 +172.224.252.0/30 +172.224.252.16/28 +172.224.254.0/27 +172.224.254.64/27 +172.225.0.0/27 +172.225.0.32/28 +172.225.0.64/27 +172.225.2.0/26 +172.225.4.0/25 +172.225.4.128/27 +172.225.4.160/28 +172.225.5.0/24 +172.225.6.0/26 +172.225.6.64/27 +172.225.6.96/29 +172.225.6.104/30 +172.225.6.108/31 +172.225.6.112/28 +172.225.7.0/24 +172.225.10.0/26 +172.225.10.64/28 +172.225.10.80/29 +172.225.10.88/30 +172.225.12.0/24 +172.225.13.0/26 +172.225.13.64/27 +172.225.13.96/29 +172.225.14.0/25 +172.225.14.128/28 +172.225.14.144/29 +172.225.14.152/31 +172.225.14.160/28 +172.225.14.192/26 +172.225.15.0/24 +172.225.16.0/24 +172.225.17.0/26 +172.225.17.64/27 +172.225.17.96/29 +172.225.18.0/23 +172.225.20.0/24 +172.225.21.0/26 +172.225.21.64/27 +172.225.21.96/29 +172.225.22.0/26 +172.225.22.64/28 +172.225.22.80/29 +172.225.24.0/24 +172.225.25.0/26 +172.225.25.64/27 +172.225.25.96/29 +172.225.26.0/24 +172.225.27.0/26 +172.225.27.64/28 +172.225.27.80/31 +172.225.27.96/27 +172.225.28.0/25 +172.225.28.128/26 +172.225.28.192/28 +172.225.28.208/31 +172.225.28.224/27 +172.225.29.0/24 +172.225.30.0/23 +172.225.32.0/23 +172.225.34.0/26 +172.225.34.64/27 +172.225.34.96/28 +172.225.34.128/25 +172.225.35.0/26 +172.225.35.64/29 +172.225.35.80/28 +172.225.35.96/30 +172.225.35.104/29 +172.225.35.112/28 +172.225.35.128/27 +172.225.36.0/25 +172.225.36.128/26 +172.225.36.192/27 +172.225.37.0/26 +172.225.37.80/28 +172.225.38.0/25 +172.225.38.128/31 +172.225.38.144/28 +172.225.38.160/27 +172.225.38.192/28 +172.225.40.0/23 +172.225.42.0/24 +172.225.43.0/25 +172.225.43.128/26 +172.225.43.192/29 +172.225.44.0/24 +172.225.46.0/25 +172.225.46.128/26 +172.225.46.192/27 +172.225.46.224/29 +172.225.46.232/30 +172.225.48.0/25 +172.225.48.128/27 +172.225.48.160/29 +172.225.48.168/31 +172.225.51.0/28 +172.225.51.64/26 +172.225.52.0/25 +172.225.52.128/26 +172.225.52.192/28 +172.225.52.208/29 +172.225.52.216/30 +172.225.52.224/27 +172.225.54.0/23 +172.225.56.0/26 +172.225.56.64/27 +172.225.57.0/26 +172.225.57.64/28 +172.225.57.80/31 +172.225.58.0/23 +172.225.60.0/25 +172.225.60.128/26 +172.225.60.192/27 +172.225.62.0/24 +172.225.63.0/26 +172.225.63.64/27 +172.225.63.96/28 +172.225.63.112/29 +172.225.63.128/27 +172.225.63.160/28 +172.225.63.192/27 +172.225.64.0/23 +172.225.66.0/24 +172.225.67.0/26 +172.225.67.64/27 +172.225.67.96/29 +172.225.68.0/24 +172.225.69.0/26 +172.225.69.64/27 +172.225.69.96/28 +172.225.69.112/30 +172.225.69.128/27 +172.225.70.0/23 +172.225.72.0/24 +172.225.73.16/28 +172.225.73.32/27 +172.225.73.64/26 +172.225.73.128/25 +172.225.74.0/25 +172.225.74.128/26 +172.225.74.192/28 +172.225.74.208/30 +172.225.74.212/31 +172.225.74.216/30 +172.225.74.224/27 +172.225.75.0/24 +172.225.76.0/22 +172.225.80.0/24 +172.225.82.0/24 +172.225.83.0/27 +172.225.83.32/29 +172.225.83.40/31 +172.225.83.48/28 +172.225.83.64/28 +172.225.84.0/25 +172.225.84.128/26 +172.225.84.192/28 +172.225.84.208/29 +172.225.84.216/30 +172.225.84.224/27 +172.225.86.0/25 +172.225.86.128/26 +172.225.86.192/28 +172.225.86.208/29 +172.225.86.216/31 +172.225.86.224/28 +172.225.86.240/29 +172.225.87.0/27 +172.225.87.32/28 +172.225.87.48/31 +172.225.88.0/24 +172.225.89.0/25 +172.225.89.128/26 +172.225.89.192/28 +172.225.89.208/29 +172.225.89.216/31 +172.225.89.224/28 +172.225.89.240/29 +172.225.90.0/23 +172.225.92.0/26 +172.225.92.64/28 +172.225.92.96/27 +172.225.92.128/25 +172.225.93.0/26 +172.225.93.64/27 +172.225.93.98/31 +172.225.93.100/30 +172.225.93.104/29 +172.225.93.112/28 +172.225.93.128/25 +172.225.94.0/26 +172.225.94.64/28 +172.225.94.80/29 +172.225.94.88/30 +172.225.96.0/25 +172.225.96.128/26 +172.225.96.192/27 +172.225.96.224/29 +172.225.96.232/30 +172.225.97.0/26 +172.225.97.64/27 +172.225.98.0/23 +172.225.100.0/25 +172.225.100.128/28 +172.225.100.144/29 +172.225.100.152/31 +172.225.103.0/27 +172.225.103.32/28 +172.225.103.48/29 +172.225.103.56/31 +172.225.104.0/25 +172.225.104.128/26 +172.225.104.192/27 +172.225.104.224/28 +172.225.104.240/29 +172.225.104.248/31 +172.225.105.0/28 +172.225.106.0/25 +172.225.106.128/29 +172.225.106.136/31 +172.225.108.0/24 +172.225.110.0/24 +172.225.111.0/25 +172.225.111.128/26 +172.225.111.192/30 +172.225.112.0/23 +172.225.114.0/26 +172.225.114.64/29 +172.225.116.0/24 +172.225.118.0/24 +172.225.119.0/26 +172.225.119.96/27 +172.225.119.128/25 +172.225.120.0/23 +172.225.122.0/24 +172.225.123.0/25 +172.225.123.128/26 +172.225.123.192/31 +172.225.124.0/25 +172.225.124.128/26 +172.225.124.192/27 +172.225.124.224/28 +172.225.124.240/31 +172.225.124.244/30 +172.225.126.0/23 +172.225.128.0/24 +172.225.129.0/25 +172.225.129.128/26 +172.225.130.0/24 +172.225.131.0/26 +172.225.131.64/27 +172.225.131.96/29 +172.225.132.0/24 +172.225.133.0/25 +172.225.133.128/27 +172.225.134.0/24 +172.225.135.0/27 +172.225.135.32/28 +172.225.135.48/29 +172.225.135.56/30 +172.225.135.64/27 +172.225.135.96/29 +172.225.135.112/28 +172.225.136.0/24 +172.225.137.0/25 +172.225.137.128/26 +172.225.137.192/27 +172.225.137.224/28 +172.225.137.240/30 +172.225.137.248/29 +172.225.138.0/24 +172.225.139.0/25 +172.225.139.128/26 +172.225.139.192/27 +172.225.139.224/30 +172.225.139.228/31 +172.225.140.0/24 +172.225.141.0/25 +172.225.141.128/27 +172.225.141.160/28 +172.225.142.0/27 +172.225.142.32/29 +172.225.142.48/28 +172.225.142.64/26 +172.225.142.128/27 +172.225.142.160/28 +172.225.144.0/24 +172.225.145.0/25 +172.225.145.128/29 +172.225.145.136/30 +172.225.145.144/28 +172.225.145.160/27 +172.225.152.0/27 +172.225.152.96/27 +172.225.154.0/25 +172.225.154.128/26 +172.225.154.192/27 +172.225.154.224/29 +172.225.154.232/30 +172.225.154.240/28 +172.225.155.0/27 +172.225.155.32/28 +172.225.155.48/31 +172.225.155.56/29 +172.225.155.64/28 +172.225.155.80/29 +172.225.156.0/25 +172.225.156.128/27 +172.225.156.160/28 +172.225.156.176/30 +172.225.156.192/27 +172.225.158.0/25 +172.225.158.128/26 +172.225.158.192/28 +172.225.158.208/29 +172.225.158.216/30 +172.225.158.224/29 +172.225.158.240/28 +172.225.159.0/26 +172.225.159.64/28 +172.225.160.0/24 +172.225.161.0/25 +172.225.161.128/26 +172.225.161.192/28 +172.225.161.224/27 +172.225.162.0/24 +172.225.163.0/26 +172.225.163.64/28 +172.225.163.80/30 +172.225.163.84/31 +172.225.163.88/29 +172.225.163.96/28 +172.225.164.0/31 +172.225.164.16/28 +172.225.164.32/27 +172.225.164.64/26 +172.225.164.128/26 +172.225.164.192/27 +172.225.165.0/24 +172.225.166.0/27 +172.225.167.0/26 +172.225.167.64/27 +172.225.167.96/28 +172.225.167.128/25 +172.225.168.0/25 +172.225.168.128/28 +172.225.168.144/31 +172.225.169.108/30 +172.225.169.112/28 +172.225.169.128/25 +172.225.171.0/26 +172.225.171.64/28 +172.225.171.80/30 +172.225.171.84/31 +172.225.171.96/27 +172.225.171.128/25 +172.225.172.0/25 +172.225.172.128/26 +172.225.172.192/28 +172.225.172.208/29 +172.225.172.224/27 +172.225.173.0/24 +172.225.176.0/24 +172.225.177.0/27 +172.225.177.32/28 +172.225.178.0/24 +172.225.179.0/26 +172.225.179.64/31 +172.225.179.80/28 +172.225.180.0/24 +172.225.181.0/25 +172.225.181.128/27 +172.225.181.160/28 +172.225.181.176/29 +172.225.181.184/30 +172.225.181.188/31 +172.225.181.192/26 +172.225.182.0/24 +172.225.183.0/28 +172.225.183.16/31 +172.225.183.24/29 +172.225.183.32/27 +172.225.183.64/26 +172.225.183.128/27 +172.225.183.160/28 +172.225.184.0/25 +172.225.184.128/27 +172.225.184.160/28 +172.225.184.176/29 +172.225.184.184/30 +172.225.184.192/27 +172.225.184.224/29 +172.225.184.240/28 +172.225.185.0/28 +172.225.185.16/31 +172.225.186.0/26 +172.225.186.64/30 +172.225.187.0/28 +172.225.187.32/27 +172.225.187.64/26 +172.225.187.128/26 +172.225.187.192/30 +172.225.188.0/23 +172.225.190.0/24 +172.225.191.0/25 +172.225.191.128/27 +172.225.191.192/26 +172.225.192.0/24 +172.225.193.0/26 +172.225.193.64/30 +172.225.193.72/29 +172.225.193.80/28 +172.225.193.96/27 +172.225.194.0/24 +172.225.195.0/28 +172.225.195.16/29 +172.225.195.24/30 +172.225.195.32/27 +172.225.195.64/29 +172.225.195.80/28 +172.225.195.96/28 +172.225.196.0/25 +172.225.196.128/28 +172.225.196.160/28 +172.225.196.176/29 +172.225.196.192/29 +172.225.197.0/26 +172.225.197.64/27 +172.225.198.0/25 +172.225.198.128/28 +172.225.198.144/29 +172.225.199.0/26 +172.225.199.64/27 +172.225.199.96/28 +172.225.199.112/30 +172.225.199.116/31 +172.225.200.0/24 +172.225.201.0/25 +172.225.201.128/28 +172.225.202.0/23 +172.225.204.0/24 +172.225.205.0/26 +172.225.205.64/27 +172.225.205.96/29 +172.225.206.0/27 +172.225.206.32/31 +172.225.206.40/29 +172.225.207.0/26 +172.225.207.64/27 +172.225.207.96/28 +172.225.207.128/27 +172.225.208.0/27 +172.225.208.32/28 +172.225.209.0/27 +172.225.209.32/28 +172.225.209.48/30 +172.225.209.64/27 +172.225.209.96/28 +172.225.210.0/25 +172.225.210.128/26 +172.225.210.192/27 +172.225.210.224/29 +172.225.211.0/28 +172.225.211.16/29 +172.225.211.32/27 +172.225.211.64/28 +172.225.212.0/28 +172.225.212.16/29 +172.225.212.24/31 +172.225.212.32/27 +172.225.212.64/26 +172.225.212.128/28 +172.225.212.144/29 +172.225.212.160/27 +172.225.212.192/26 +172.225.213.0/25 +172.225.213.128/27 +172.225.213.160/29 +172.225.214.0/24 +172.225.215.0/25 +172.225.215.128/26 +172.225.215.192/27 +172.225.215.224/30 +172.225.215.228/31 +172.225.215.232/29 +172.225.215.240/28 +172.225.216.0/24 +172.225.217.0/27 +172.225.217.32/28 +172.225.217.48/30 +172.225.217.64/27 +172.225.218.0/26 +172.225.218.64/27 +172.225.218.96/29 +172.225.218.104/31 +172.225.218.108/30 +172.225.218.112/28 +172.225.218.128/28 +172.225.219.0/26 +172.225.219.64/30 +172.225.220.0/23 +172.225.222.0/25 +172.225.222.128/27 +172.225.223.0/27 +172.225.223.32/28 +172.225.223.48/30 +172.225.223.64/27 +172.225.224.16/28 +172.225.224.32/27 +172.225.224.64/27 +172.225.224.96/28 +172.225.224.112/30 +172.225.224.116/31 +172.225.224.120/29 +172.225.224.128/28 +172.225.225.0/27 +172.225.225.32/28 +172.225.226.0/23 +172.225.228.0/25 +172.225.228.160/27 +172.225.228.192/26 +172.225.229.0/26 +172.225.229.64/29 +172.225.229.80/28 +172.225.229.112/28 +172.225.229.128/28 +172.225.230.0/24 +172.225.231.0/25 +172.225.231.128/27 +172.225.231.160/28 +172.225.231.176/29 +172.225.231.184/31 +172.225.231.192/28 +172.225.231.208/29 +172.225.231.224/28 +172.225.232.0/25 +172.225.232.128/29 +172.225.232.136/31 +172.225.233.0/26 +172.225.233.64/27 +172.225.233.96/28 +172.225.233.112/29 +172.225.233.128/26 +172.225.233.240/28 +172.225.234.0/26 +172.225.234.64/27 +172.225.234.96/28 +172.225.235.0/25 +172.225.235.128/26 +172.225.235.192/28 +172.225.235.208/30 +172.225.236.0/23 +172.225.238.0/26 +172.225.238.64/27 +172.225.238.96/28 +172.225.238.128/25 +172.225.239.0/25 +172.225.239.128/27 +172.225.239.160/28 +172.225.239.178/31 +172.225.239.180/30 +172.225.239.184/29 +172.225.239.192/28 +172.225.239.208/29 +172.225.239.216/30 +172.225.239.224/27 +172.225.240.0/25 +172.225.240.128/27 +172.225.240.160/28 +172.225.240.176/29 +172.225.240.184/30 +172.225.240.192/27 +172.225.240.224/29 +172.225.241.0/25 +172.225.241.128/27 +172.225.242.0/24 +172.225.243.0/25 +172.225.243.128/28 +172.225.243.144/30 +172.225.243.148/31 +172.225.243.160/28 +172.225.244.0/24 +172.225.245.0/26 +172.225.245.64/27 +172.225.245.96/29 +172.225.245.104/31 +172.225.246.0/24 +172.225.247.0/25 +172.225.247.128/26 +172.225.247.192/28 +172.225.247.208/29 +172.225.247.216/31 +172.225.247.224/27 +172.225.248.0/22 +172.225.252.0/24 +172.225.253.0/26 +172.225.253.64/31 +172.225.253.80/28 +172.225.253.96/27 +172.225.253.128/27 +172.225.254.0/26 +172.225.254.64/31 +172.225.254.72/29 +172.225.255.0/26 +172.225.255.64/28 +172.225.255.80/29 +172.225.255.88/30 +172.225.255.96/27 +172.225.255.128/26 +172.226.0.0/26 +172.226.0.64/28 +172.226.0.80/30 +172.226.0.88/29 +172.226.2.0/25 +172.226.2.128/26 +172.226.2.192/29 +172.226.2.200/30 +172.226.2.208/28 +172.226.3.0/24 +172.226.4.0/27 +172.226.4.32/30 +172.226.4.48/28 +172.226.4.64/27 +172.226.5.0/25 +172.226.5.128/29 +172.226.5.136/30 +172.226.5.144/28 +172.226.5.160/27 +172.226.5.192/26 +172.226.6.0/25 +172.226.6.128/29 +172.226.6.136/31 +172.226.7.0/25 +172.226.7.128/29 +172.226.7.136/31 +172.226.8.0/22 +172.226.12.0/24 +172.226.13.0/26 +172.226.13.64/27 +172.226.13.96/28 +172.226.13.112/29 +172.226.13.120/31 +172.226.13.124/31 +172.226.13.128/25 +172.226.14.0/27 +172.226.14.32/28 +172.226.14.48/29 +172.226.14.56/30 +172.226.15.0/27 +172.226.15.32/28 +172.226.15.48/30 +172.226.15.56/29 +172.226.16.0/24 +172.226.18.0/24 +172.226.19.0/25 +172.226.19.128/27 +172.226.20.0/24 +172.226.21.0/25 +172.226.21.128/27 +172.226.21.160/28 +172.226.22.0/24 +172.226.23.0/25 +172.226.23.128/27 +172.226.26.0/28 +172.226.26.16/29 +172.226.26.64/26 +172.226.29.0/27 +172.226.29.32/29 +172.226.29.40/30 +172.226.30.0/23 +172.226.32.0/25 +172.226.32.128/26 +172.226.32.192/28 +172.226.32.208/30 +172.226.33.0/25 +172.226.33.128/27 +172.226.34.0/28 +172.226.34.16/29 +172.226.36.0/25 +172.226.36.128/29 +172.226.36.136/30 +172.226.36.140/31 +172.226.36.144/28 +172.226.36.160/27 +172.226.36.192/27 +172.226.42.0/25 +172.226.42.128/29 +172.226.42.136/30 +172.226.42.140/31 +172.226.42.144/28 +172.226.42.160/27 +172.226.42.192/26 +172.226.43.0/24 +172.226.44.0/24 +172.226.45.0/25 +172.226.45.128/28 +172.226.45.144/29 +172.226.45.160/27 +172.226.45.192/26 +172.226.46.0/24 +172.226.47.0/27 +172.226.48.0/27 +172.226.48.32/31 +172.226.48.36/30 +172.226.48.40/29 +172.226.48.48/28 +172.226.48.64/28 +172.226.49.0/27 +172.226.49.32/28 +172.226.50.0/28 +172.226.50.16/31 +172.226.50.20/30 +172.226.50.24/29 +172.226.50.32/27 +172.226.52.32/27 +172.226.56.0/26 +172.226.56.64/27 +172.226.56.96/29 +172.226.56.104/31 +172.226.58.0/26 +172.226.58.64/27 +172.226.58.96/29 +172.226.58.104/31 +172.226.60.0/27 +172.226.60.32/29 +172.226.60.40/30 +172.226.62.0/28 +172.226.62.16/29 +172.226.64.0/28 +172.226.64.16/29 +172.226.66.0/24 +172.226.67.0/25 +172.226.67.128/26 +172.226.67.192/27 +172.226.67.224/30 +172.226.67.228/31 +172.226.67.232/29 +172.226.67.240/28 +172.226.68.0/23 +172.226.70.0/27 +172.226.77.0/27 +172.226.77.32/28 +172.226.77.64/26 +172.226.77.128/25 +172.226.78.0/27 +172.226.78.32/28 +172.226.78.48/29 +172.226.78.64/27 +172.226.78.96/28 +172.226.79.0/26 +172.226.80.0/28 +172.226.80.16/29 +172.226.80.24/30 +172.226.80.28/31 +172.226.81.0/24 +172.226.82.0/26 +172.226.82.64/28 +172.226.84.16/28 +172.226.84.32/27 +172.226.84.64/26 +172.226.84.128/28 +172.226.86.0/27 +172.226.86.32/28 +172.226.87.0/24 +172.226.88.0/28 +172.226.89.0/24 +172.226.90.0/30 +172.226.90.4/32 +172.226.92.0/30 +172.226.92.4/32 +172.226.93.0/25 +172.226.93.128/26 +172.226.93.192/28 +172.226.93.208/31 +172.226.93.224/27 +172.226.94.0/27 +172.226.94.32/31 +172.226.94.40/29 +172.226.96.0/27 +172.226.96.32/28 +172.226.98.0/27 +172.226.98.32/28 +172.226.98.48/30 +172.226.100.0/27 +172.226.100.32/28 +172.226.104.0/26 +172.226.104.64/28 +172.226.104.80/29 +172.226.104.88/30 +172.226.104.92/31 +172.226.104.96/28 +172.226.106.0/27 +172.226.106.32/28 +172.226.106.48/30 +172.226.106.64/26 +172.226.108.0/26 +172.226.108.64/30 +172.226.110.0/26 +172.226.110.64/30 +172.226.112.0/26 +172.226.112.64/28 +172.226.112.80/29 +172.226.112.88/30 +172.226.112.92/31 +172.226.112.96/28 +172.226.116.0/27 +172.226.116.32/28 +172.226.116.48/29 +172.226.116.56/31 +172.226.116.64/27 +172.226.118.0/27 +172.226.118.32/28 +172.226.120.0/27 +172.226.120.32/28 +172.226.120.48/30 +172.226.122.0/25 +172.226.122.128/27 +172.226.122.160/29 +172.226.122.168/30 +172.226.122.176/28 +172.226.122.192/27 +172.226.124.0/27 +172.226.124.32/28 +172.226.124.48/30 +172.226.126.0/27 +172.226.126.32/28 +172.226.128.0/27 +172.226.128.32/28 +172.226.128.48/30 +172.226.130.0/28 +172.226.130.16/29 +172.226.131.0/27 +172.226.131.32/28 +172.226.132.0/27 +172.226.132.32/29 +172.226.132.40/31 +172.226.132.48/29 +172.226.134.0/26 +172.226.134.64/28 +172.226.134.80/29 +172.226.134.88/30 +172.226.136.0/26 +172.226.136.64/27 +172.226.136.96/28 +172.226.136.112/30 +172.226.136.116/31 +172.226.137.0/26 +172.226.137.64/27 +172.226.137.96/28 +172.226.137.112/30 +172.226.137.116/31 +172.226.138.0/27 +172.226.138.32/28 +172.226.138.64/27 +172.226.140.0/26 +172.226.140.64/28 +172.226.140.80/29 +172.226.140.88/31 +172.226.140.96/28 +172.226.142.0/25 +172.226.142.128/26 +172.226.142.192/27 +172.226.142.224/30 +172.226.142.228/31 +172.226.142.240/28 +172.226.143.0/25 +172.226.143.128/28 +172.226.143.160/27 +172.226.144.0/24 +172.226.145.0/25 +172.226.145.128/26 +172.226.145.192/27 +172.226.145.224/30 +172.226.145.228/31 +172.226.146.0/27 +172.226.146.32/30 +172.226.146.36/31 +172.226.146.40/29 +172.226.146.48/28 +172.226.148.0/26 +172.226.148.64/27 +172.226.148.96/28 +172.226.148.128/27 +172.226.150.0/24 +172.226.151.0/25 +172.226.151.128/27 +172.226.152.0/24 +172.226.153.0/25 +172.226.153.128/27 +172.226.154.0/24 +172.226.155.0/25 +172.226.155.128/27 +172.226.156.0/27 +172.226.156.32/28 +172.226.156.64/26 +172.226.160.0/27 +172.226.160.32/28 +172.226.162.0/26 +172.226.162.64/28 +172.226.162.80/29 +172.226.163.0/26 +172.226.163.64/28 +172.226.163.80/29 +172.226.164.0/26 +172.226.166.0/25 +172.226.166.128/26 +172.226.166.192/31 +172.226.167.0/26 +172.226.167.64/28 +172.226.168.0/24 +172.226.169.0/25 +172.226.169.128/27 +172.226.170.0/24 +172.226.171.0/25 +172.226.171.128/27 +172.226.172.0/28 +172.226.174.0/23 +172.226.176.0/24 +172.226.177.0/26 +172.226.177.64/30 +172.226.177.68/31 +172.226.178.0/24 +172.226.179.0/26 +172.226.179.64/30 +172.226.179.68/31 +172.226.180.0/27 +172.226.180.32/28 +172.226.180.64/26 +172.226.180.128/27 +172.226.182.0/26 +172.226.182.64/28 +172.226.182.80/29 +172.226.182.88/30 +172.226.183.0/26 +172.226.183.64/28 +172.226.183.80/29 +172.226.183.88/30 +172.226.183.96/27 +172.226.183.128/26 +172.226.183.192/28 +172.226.184.0/25 +172.226.184.128/29 +172.226.184.136/31 +172.226.186.0/25 +172.226.186.128/29 +172.226.186.136/31 +172.226.188.0/22 +172.226.192.0/24 +172.226.193.0/26 +172.226.193.64/27 +172.226.193.96/29 +172.226.194.0/24 +172.226.195.0/25 +172.226.196.0/24 +172.226.197.0/25 +172.226.198.0/24 +172.226.199.0/25 +172.226.199.128/27 +172.226.200.0/24 +172.226.201.0/25 +172.226.202.0/24 +172.226.203.0/25 +172.226.204.0/24 +172.226.205.0/25 +172.226.206.0/26 +172.226.206.64/28 +172.226.206.80/29 +172.226.206.88/31 +172.226.206.96/28 +172.226.208.0/26 +172.226.210.0/24 +172.226.211.0/25 +172.226.211.128/26 +172.226.211.192/30 +172.226.211.200/29 +172.226.211.208/28 +172.226.212.0/25 +172.226.212.128/29 +172.226.212.136/30 +172.226.212.144/28 +172.226.212.160/27 +172.226.214.0/27 +172.226.214.32/28 +172.226.214.64/27 +172.226.216.0/26 +172.226.216.64/28 +172.226.216.80/29 +172.226.216.88/31 +172.226.216.96/28 +172.226.218.0/27 +172.226.218.32/28 +172.226.218.48/30 +172.226.218.52/31 +172.226.218.56/29 +172.226.220.0/26 +172.226.220.64/30 +172.226.220.68/31 +172.226.222.0/24 +172.226.226.0/27 +172.226.226.32/30 +172.226.226.36/31 +192.35.50.0/24 +194.126.240.0/24 +198.183.16.0/23 +204.179.120.0/24 +205.180.175.0/24 +2403:300::/32 +2606:54c0::/35 +2606:54c0:2000::/38 +2606:54c0:2400::/39 +2606:54c0:2600::/40 +2606:54c0:2700::/44 +2606:54c0:2710::/45 +2606:54c0:2730::/44 +2606:54c0:2740::/42 +2606:54c0:2780::/41 +2606:54c0:2800::/37 +2606:54c0:3000::/36 +2606:54c0:4000::/40 +2606:54c0:4100::/43 +2606:54c0:4120::/44 +2606:54c0:4148::/45 +2606:54c0:4150::/44 +2606:54c0:4160::/43 +2606:54c0:4180::/41 +2606:54c0:4200::/39 +2606:54c0:4400::/39 +2606:54c0:4600::/42 +2606:54c0:4640::/43 +2606:54c0:4660::/44 +2606:54c0:4670::/45 +2606:54c0:4680::/41 +2606:54c0:4700::/40 +2606:54c0:4800::/37 +2606:54c0:5000::/38 +2606:54c0:5400::/40 +2606:54c0:5500::/41 +2606:54c0:55a0::/43 +2606:54c0:55c0::/42 +2606:54c0:5600::/39 +2606:54c0:5800::/37 +2606:54c0:6000::/35 +2606:54c0:8000::/34 +2606:54c0:c000::/36 +2606:54c0:d000::/38 +2606:54c0:d400::/41 +2606:54c0:d480::/44 +2606:54c0:d490::/45 +2606:54c3::/55 +2606:54c3:0:200::/56 +2606:54c3:0:300::/57 +2606:54c3:0:380::/60 +2606:54c3:0:390::/62 +2606:54c3:0:394::/63 +2606:54c3:0:397::/64 +2606:54c3:0:398::/61 +2606:54c3:0:3a0::/59 +2606:54c3:0:3c0::/58 +2606:54c3:0:400::/55 +2606:54c3:0:600::/56 +2606:54c3:0:700::/57 +2606:54c3:0:780::/58 +2606:54c3:0:7c0::/62 +2606:54c3:0:7c4::/63 +2606:54c3:0:7c7::/64 +2606:54c3:0:7c8::/61 +2606:54c3:0:7d0::/60 +2606:54c3:0:7e0::/59 +2606:54c3:0:800::/59 +2606:54c3:0:820::/60 +2606:54c3:0:830::/62 +2606:54c3:0:834::/64 +2606:54c3:0:836::/63 +2606:54c3:0:838::/61 +2606:54c3:0:840::/58 +2606:54c3:0:880::/57 +2606:54c3:0:900::/57 +2606:54c3:0:980::/58 +2606:54c3:0:9c0::/59 +2606:54c3:0:9e0::/62 +2606:54c3:0:9e4::/64 +2606:54c3:0:9e6::/63 +2606:54c3:0:9e8::/61 +2606:54c3:0:9f0::/60 +2606:54c3:0:a00::/55 +2606:54c3:0:c00::/54 +2606:54c3:0:1000::/56 +2606:54c3:0:1100::/58 +2606:54c3:0:1140::/59 +2606:54c3:0:1160::/61 +2606:54c3:0:1168::/64 +2606:54c3:0:116a::/63 +2606:54c3:0:116c::/62 +2606:54c3:0:1170::/60 +2606:54c3:0:1180::/57 +2606:54c3:0:1200::/55 +2606:54c3:0:1400::/56 +2606:54c3:0:1500::/61 +2606:54c3:0:1508::/64 +2606:54c3:0:150a::/63 +2606:54c3:0:150c::/62 +2606:54c3:0:1510::/60 +2606:54c3:0:1520::/59 +2606:54c3:0:1540::/58 +2606:54c3:0:1580::/59 +2606:54c3:0:15a0::/62 +2606:54c3:0:15a4::/64 +2606:54c3:0:15a6::/63 +2606:54c3:0:15a8::/61 +2606:54c3:0:15b0::/60 +2606:54c3:0:15c0::/58 +2606:54c3:0:1600::/58 +2606:54c3:0:1640::/61 +2606:54c3:0:1648::/62 +2606:54c3:0:164c::/63 +2606:54c3:0:164e::/64 +2606:54c3:0:1650::/60 +2606:54c3:0:1660::/59 +2606:54c3:0:1680::/57 +2606:54c3:0:1700::/58 +2606:54c3:0:1740::/60 +2606:54c3:0:1750::/62 +2606:54c3:0:1755::/64 +2606:54c3:0:1756::/63 +2606:54c3:0:1758::/61 +2606:54c3:0:1760::/59 +2606:54c3:0:1780::/57 +2606:54c3:0:1800::/58 +2606:54c3:0:1840::/62 +2606:54c3:0:1844::/63 +2606:54c3:0:1846::/64 +2606:54c3:0:1848::/61 +2606:54c3:0:1850::/60 +2606:54c3:0:1860::/59 +2606:54c3:0:1880::/57 +2606:54c3:0:1900::/56 +2606:54c3:0:1a00::/58 +2606:54c3:0:1a40::/59 +2606:54c3:0:1a60::/60 +2606:54c3:0:1a70::/62 +2606:54c3:0:1a74::/64 +2606:54c3:0:1a76::/63 +2606:54c3:0:1a78::/61 +2606:54c3:0:1a80::/60 +2606:54c3:0:1a90::/61 +2606:54c3:0:1a98::/62 +2606:54c3:0:1a9c::/64 +2620:0:1b00::/47 +2620:0:1b02::/48 +2620:0:1b04::/47 +2620:149::/32 +2a01:b740::/32 +2a01:b747::/32 +2a02:26f7:b000:4000::/64 +2a02:26f7:b001:4000::/64 +2a02:26f7:b002:4000::/64 +2a02:26f7:b003:4000::/64 +2a02:26f7:b004:4000::/64 +2a02:26f7:b005:4000::/64 +2a02:26f7:b006:4000::/64 +2a02:26f7:b007:4000::/64 +2a02:26f7:b008:4000::/64 +2a02:26f7:b009:4000::/64 +2a02:26f7:b00a:4000::/64 +2a02:26f7:b00b:4000::/64 +2a02:26f7:b00c:4000::/64 +2a02:26f7:b00d:4000::/64 +2a02:26f7:b00e:4000::/64 +2a02:26f7:b00f:4000::/64 +2a02:26f7:b010:4000::/64 +2a02:26f7:b011:4000::/64 +2a02:26f7:b012:4000::/64 +2a02:26f7:b013:4000::/64 +2a02:26f7:b014:4000::/64 +2a02:26f7:b015:4000::/64 +2a02:26f7:b016:4000::/64 +2a02:26f7:b017:4000::/64 +2a02:26f7:b018:4000::/64 +2a02:26f7:b018:5380::/60 +2a02:26f7:b018:5390::/61 +2a02:26f7:b018:5398::/63 +2a02:26f7:b018:539a::/64 +2a02:26f7:b018:fff0::/64 +2a02:26f7:b019:4000::/64 +2a02:26f7:b020:4000::/64 +2a02:26f7:b021:4000::/64 +2a02:26f7:b022:4000::/64 +2a02:26f7:b023:4000::/64 +2a02:26f7:b040:4000::/64 +2a02:26f7:b041:4000::/64 +2a02:26f7:b042:4000::/64 +2a02:26f7:b043:4000::/64 +2a02:26f7:b044:4000::/64 +2a02:26f7:b045:4000::/64 +2a02:26f7:b046:4000::/64 +2a02:26f7:b047:4000::/64 +2a02:26f7:b048:4000::/64 +2a02:26f7:b049:4000::/64 +2a02:26f7:b04a:4000::/64 +2a02:26f7:b04b:4000::/64 +2a02:26f7:b04c:4000::/64 +2a02:26f7:b04d:4000::/64 +2a02:26f7:b04e:4000::/64 +2a02:26f7:b04f:4000::/64 +2a02:26f7:b050:4000::/64 +2a02:26f7:b051:4000::/64 +2a02:26f7:b052:4000::/64 +2a02:26f7:b053:4000::/64 +2a02:26f7:b054:4000::/64 +2a02:26f7:b055:4000::/64 +2a02:26f7:b056:4000::/64 +2a02:26f7:b057:4000::/64 +2a02:26f7:b058:4000::/64 +2a02:26f7:b059:4000::/64 +2a02:26f7:b05a:4000::/64 +2a02:26f7:b05b:4000::/64 +2a02:26f7:b05c:4000::/64 +2a02:26f7:b05d:4000::/64 +2a02:26f7:b05e:4000::/64 +2a02:26f7:b05f:4000::/64 +2a02:26f7:b060:4000::/64 +2a02:26f7:b061:4000::/64 +2a02:26f7:b062:4000::/64 +2a02:26f7:b063:4000::/64 +2a02:26f7:b064:4000::/64 +2a02:26f7:b065:4000::/64 +2a02:26f7:b066:4000::/64 +2a02:26f7:b067:4000::/64 +2a02:26f7:b068:4000::/64 +2a02:26f7:b069:4000::/64 +2a02:26f7:b06a:4000::/64 +2a02:26f7:b06b:4000::/64 +2a02:26f7:b06c:4000::/64 +2a02:26f7:b06d:4000::/64 +2a02:26f7:b06e:4000::/64 +2a02:26f7:b06f:4000::/64 +2a02:26f7:b070:4000::/64 +2a02:26f7:b071:4000::/64 +2a02:26f7:b072:4000::/64 +2a02:26f7:b073:4000::/64 +2a02:26f7:b074:4000::/64 +2a02:26f7:b075:4000::/64 +2a02:26f7:b076:4000::/64 +2a02:26f7:b077:4000::/64 +2a02:26f7:b078:4000::/64 +2a02:26f7:b079:4000::/64 +2a02:26f7:b07a:4000::/64 +2a02:26f7:b07b:4000::/64 +2a02:26f7:b07c:4000::/64 +2a02:26f7:b07d:4000::/64 +2a02:26f7:b07e:4000::/64 +2a02:26f7:b07f:4000::/64 +2a02:26f7:b080:4000::/64 +2a02:26f7:b081:4000::/64 +2a02:26f7:b082:4000::/64 +2a02:26f7:b083:4000::/64 +2a02:26f7:b084:4000::/64 +2a02:26f7:b085:4000::/64 +2a02:26f7:b086:4000::/64 +2a02:26f7:b087:4000::/64 +2a02:26f7:b088:4000::/64 +2a02:26f7:b089:4000::/64 +2a02:26f7:b08a:4000::/64 +2a02:26f7:b08b:4000::/64 +2a02:26f7:b0c0:4000::/64 +2a02:26f7:b0c1:4000::/64 +2a02:26f7:b0c2:4000::/64 +2a02:26f7:b0c3:4000::/64 +2a02:26f7:b0c4:4000::/64 +2a02:26f7:b0c5:4000::/64 +2a02:26f7:b0c6:4000::/64 +2a02:26f7:b0c7:4000::/64 +2a02:26f7:b0c8:4000::/64 +2a02:26f7:b0c9:4000::/64 +2a02:26f7:b0ca:4000::/64 +2a02:26f7:b0cb:4000::/64 +2a02:26f7:b0cc:4000::/64 +2a02:26f7:b0cd:4000::/64 +2a02:26f7:b0ce:4000::/64 +2a02:26f7:b0cf:4000::/64 +2a02:26f7:b0d0:4000::/64 +2a02:26f7:b0d1:4000::/64 +2a02:26f7:b0d2:4000::/64 +2a02:26f7:b0d3:4000::/64 +2a02:26f7:b0d4:4000::/64 +2a02:26f7:b0d5:4000::/64 +2a02:26f7:b0d6:4000::/64 +2a02:26f7:b0d7:4000::/64 +2a02:26f7:b0d8::/54 +2a02:26f7:b0d8:400::/58 +2a02:26f7:b0d8:440::/60 +2a02:26f7:b0d8:4000::/64 +2a02:26f7:b0d8:4e40::/60 +2a02:26f7:b0d9:4000::/64 +2a02:26f7:b0da::/54 +2a02:26f7:b0da:400::/58 +2a02:26f7:b0da:440::/60 +2a02:26f7:b0da:4000::/64 +2a02:26f7:b0da:4e40::/60 +2a02:26f7:b0da:fff0::/64 +2a02:26f7:b0db:4000::/64 +2a02:26f7:b0dc:4000::/64 +2a02:26f7:b0dd:4000::/64 +2a02:26f7:b0de:4000::/64 +2a02:26f7:b0df:4000::/64 +2a02:26f7:b100:4000::/64 +2a02:26f7:b101:4000::/64 +2a02:26f7:b102:4000::/64 +2a02:26f7:b103:4000::/64 +2a02:26f7:b104:4000::/64 +2a02:26f7:b105:4000::/64 +2a02:26f7:b106:4000::/64 +2a02:26f7:b107:4000::/64 +2a02:26f7:b108:4000::/64 +2a02:26f7:b109:4000::/64 +2a02:26f7:b10a:4000::/64 +2a02:26f7:b10b:4000::/64 +2a02:26f7:b10c:4000::/64 +2a02:26f7:b10d:4000::/64 +2a02:26f7:b10e:4000::/64 +2a02:26f7:b10f:4000::/64 +2a02:26f7:b110:4000::/64 +2a02:26f7:b111:4000::/64 +2a02:26f7:b112:4000::/64 +2a02:26f7:b113:4000::/64 +2a02:26f7:b114:4000::/64 +2a02:26f7:b115:4000::/64 +2a02:26f7:b116:4000::/64 +2a02:26f7:b117:4000::/64 +2a02:26f7:b118:4000::/64 +2a02:26f7:b119:4000::/64 +2a02:26f7:b11a:4000::/64 +2a02:26f7:b11b:4000::/64 +2a02:26f7:b11c::/52 +2a02:26f7:b11c:1000::/55 +2a02:26f7:b11c:1200::/57 +2a02:26f7:b11c:4000::/64 +2a02:26f7:b11c:7400::/56 +2a02:26f7:b11c:7500::/57 +2a02:26f7:b11c:7580::/58 +2a02:26f7:b11c:75c0::/59 +2a02:26f7:b11c:75e0::/62 +2a02:26f7:b11d:4000::/64 +2a02:26f7:b200:4000::/64 +2a02:26f7:b201:4000::/64 +2a02:26f7:b202:4000::/64 +2a02:26f7:b203:4000::/64 +2a02:26f7:b204:4000::/64 +2a02:26f7:b205:4000::/64 +2a02:26f7:b206:4000::/64 +2a02:26f7:b207:4000::/64 +2a02:26f7:b208:4000::/64 +2a02:26f7:b209:4000::/64 +2a02:26f7:b20a:4000::/64 +2a02:26f7:b20b:4000::/64 +2a02:26f7:b20c:4000::/64 +2a02:26f7:b20d:4000::/64 +2a02:26f7:b20e:4000::/64 +2a02:26f7:b20f:4000::/64 +2a02:26f7:b210:4000::/64 +2a02:26f7:b211:4000::/64 +2a02:26f7:b212:4000::/64 +2a02:26f7:b213:4000::/64 +2a02:26f7:b214:4000::/64 +2a02:26f7:b215:4000::/64 +2a02:26f7:b216:4000::/64 +2a02:26f7:b217:4000::/64 +2a02:26f7:b218:4000::/64 +2a02:26f7:b219:4000::/64 +2a02:26f7:b21a:4000::/64 +2a02:26f7:b21b:4000::/64 +2a02:26f7:b21c:4000::/64 +2a02:26f7:b21d:4000::/64 +2a02:26f7:b21e:4000::/64 +2a02:26f7:b21f:4000::/64 +2a02:26f7:b220:4000::/64 +2a02:26f7:b221:4000::/64 +2a02:26f7:b222:4000::/64 +2a02:26f7:b223:4000::/64 +2a02:26f7:b224:4000::/64 +2a02:26f7:b225:4000::/64 +2a02:26f7:b226:4000::/64 +2a02:26f7:b227:4000::/64 +2a02:26f7:b228:4000::/64 +2a02:26f7:b229:4000::/64 +2a02:26f7:b22a:4000::/64 +2a02:26f7:b22b:4000::/64 +2a02:26f7:b22c:4000::/64 +2a02:26f7:b22d:4000::/64 +2a02:26f7:b22e:4000::/64 +2a02:26f7:b22f:4000::/64 +2a02:26f7:b230:4000::/64 +2a02:26f7:b231:4000::/64 +2a02:26f7:b232:4000::/64 +2a02:26f7:b233:4000::/64 +2a02:26f7:b234:4000::/64 +2a02:26f7:b235:4000::/64 +2a02:26f7:b236:4000::/64 +2a02:26f7:b237:4000::/64 +2a02:26f7:b238:4000::/64 +2a02:26f7:b239:4000::/64 +2a02:26f7:b23a:4000::/64 +2a02:26f7:b23b:4000::/64 +2a02:26f7:b23c:4000::/64 +2a02:26f7:b23d:4000::/64 +2a02:26f7:b23e:4000::/64 +2a02:26f7:b23f:4000::/64 +2a02:26f7:b240:4000::/64 +2a02:26f7:b241:4000::/64 +2a02:26f7:b242:4000::/64 +2a02:26f7:b243:4000::/64 +2a02:26f7:b244:4000::/64 +2a02:26f7:b245:4000::/64 +2a02:26f7:b246:4000::/64 +2a02:26f7:b247:4000::/64 +2a02:26f7:b248:4000::/64 +2a02:26f7:b249:4000::/64 +2a02:26f7:b24a:4000::/64 +2a02:26f7:b24b:4000::/64 +2a02:26f7:b24c:4000::/64 +2a02:26f7:b24d:4000::/64 +2a02:26f7:b24e:4000::/64 +2a02:26f7:b24f:4000::/64 +2a02:26f7:b250:4000::/64 +2a02:26f7:b251:4000::/64 +2a02:26f7:b252:4000::/64 +2a02:26f7:b253:4000::/64 +2a02:26f7:b254:4000::/64 +2a02:26f7:b255:4000::/64 +2a02:26f7:b256:4000::/64 +2a02:26f7:b257:4000::/64 +2a02:26f7:b25c:4000::/64 +2a02:26f7:b25d:4000::/64 +2a02:26f7:b25e:4000::/64 +2a02:26f7:b25f:4000::/64 +2a02:26f7:b260:4000::/64 +2a02:26f7:b261:4000::/64 +2a02:26f7:b262:4000::/64 +2a02:26f7:b263:4000::/64 +2a02:26f7:b264:4000::/64 +2a02:26f7:b265:4000::/64 +2a02:26f7:b266:4000::/64 +2a02:26f7:b267:4000::/64 +2a02:26f7:b268:4000::/64 +2a02:26f7:b269:4000::/64 +2a02:26f7:b26a:4000::/64 +2a02:26f7:b26b:4000::/64 +2a02:26f7:b26c:4000::/64 +2a02:26f7:b26d:4000::/64 +2a02:26f7:b26e:4000::/64 +2a02:26f7:b26f:4000::/64 +2a02:26f7:b270:4000::/64 +2a02:26f7:b271:4000::/64 +2a02:26f7:b272:4000::/64 +2a02:26f7:b273:4000::/64 +2a02:26f7:b274:4000::/64 +2a02:26f7:b275:4000::/64 +2a02:26f7:b276:4000::/64 +2a02:26f7:b277:4000::/64 +2a02:26f7:b278:4000::/64 +2a02:26f7:b279:4000::/64 +2a02:26f7:b27a:4000::/64 +2a02:26f7:b27b:4000::/64 +2a02:26f7:b27c:4000::/64 +2a02:26f7:b27d:4000::/64 +2a02:26f7:b27e:4000::/64 +2a02:26f7:b27f:4000::/64 +2a02:26f7:b280:4000::/64 +2a02:26f7:b281:4000::/64 +2a02:26f7:b282:4000::/64 +2a02:26f7:b283:4000::/64 +2a02:26f7:b284:4000::/64 +2a02:26f7:b285:4000::/64 +2a02:26f7:b286:4000::/64 +2a02:26f7:b287:4000::/64 +2a02:26f7:b288:4000::/64 +2a02:26f7:b289:4000::/64 +2a02:26f7:b28a:4000::/64 +2a02:26f7:b28b:4000::/64 +2a02:26f7:b28c:4000::/64 +2a02:26f7:b28d:4000::/64 +2a02:26f7:b28e:4000::/64 +2a02:26f7:b28f:4000::/64 +2a02:26f7:b290:4000::/64 +2a02:26f7:b291:4000::/64 +2a02:26f7:b292:4000::/64 +2a02:26f7:b293:4000::/64 +2a02:26f7:b340:4000::/64 +2a02:26f7:b341:4000::/64 +2a02:26f7:b342:4000::/64 +2a02:26f7:b343:4000::/64 +2a02:26f7:b344:4000::/64 +2a02:26f7:b345:4000::/64 +2a02:26f7:b346:4000::/64 +2a02:26f7:b347:4000::/64 +2a02:26f7:b348:4000::/64 +2a02:26f7:b349:4000::/64 +2a02:26f7:b34a:4000::/64 +2a02:26f7:b34b:4000::/64 +2a02:26f7:b34c:4000::/64 +2a02:26f7:b34d:4000::/64 +2a02:26f7:b34e:4000::/64 +2a02:26f7:b34f:4000::/64 +2a02:26f7:b350:4000::/64 +2a02:26f7:b351:4000::/64 +2a02:26f7:b352:4000::/64 +2a02:26f7:b353:4000::/64 +2a02:26f7:b354:4000::/64 +2a02:26f7:b355:4000::/64 +2a02:26f7:b356:4000::/64 +2a02:26f7:b357:4000::/64 +2a02:26f7:b358:4000::/64 +2a02:26f7:b359:4000::/64 +2a02:26f7:b35a:4000::/64 +2a02:26f7:b35b:4000::/64 +2a02:26f7:b35c:4000::/64 +2a02:26f7:b35d:4000::/64 +2a02:26f7:b35e:4000::/64 +2a02:26f7:b35f:4000::/64 +2a02:26f7:b360:4000::/64 +2a02:26f7:b361:4000::/64 +2a02:26f7:b362:4000::/64 +2a02:26f7:b363:4000::/64 +2a02:26f7:b364:4000::/64 +2a02:26f7:b365:4000::/64 +2a02:26f7:b366:4000::/64 +2a02:26f7:b367:4000::/64 +2a02:26f7:b368:4000::/64 +2a02:26f7:b369:4000::/64 +2a02:26f7:b36a:4000::/64 +2a02:26f7:b36b:4000::/64 +2a02:26f7:b36c:4000::/64 +2a02:26f7:b36d:4000::/64 +2a02:26f7:b36e:4000::/64 +2a02:26f7:b36f:4000::/64 +2a02:26f7:b370:4000::/64 +2a02:26f7:b371:4000::/64 +2a02:26f7:b372:4000::/64 +2a02:26f7:b373:4000::/64 +2a02:26f7:b374:4000::/64 +2a02:26f7:b375:4000::/64 +2a02:26f7:b376:4000::/64 +2a02:26f7:b377:4000::/64 +2a02:26f7:b380::/51 +2a02:26f7:b380:2000::/55 +2a02:26f7:b380:2200::/57 +2a02:26f7:b380:2280::/59 +2a02:26f7:b380:22a0::/60 +2a02:26f7:b380:4000::/64 +2a02:26f7:b380:a000::/54 +2a02:26f7:b380:a400::/57 +2a02:26f7:b380:a480::/58 +2a02:26f7:b380:a4c0::/59 +2a02:26f7:b380:a4e0::/62 +2a02:26f7:b380:a4e4::/63 +2a02:26f7:b380:a4e7::/64 +2a02:26f7:b380:a4e8::/61 +2a02:26f7:b380:a4f0::/60 +2a02:26f7:b380:a500::/56 +2a02:26f7:b380:a600::/56 +2a02:26f7:b380:a700::/58 +2a02:26f7:b380:a740::/59 +2a02:26f7:b380:a760::/60 +2a02:26f7:b380:a770::/61 +2a02:26f7:b380:a778::/63 +2a02:26f7:b380:fff0::/64 +2a02:26f7:b381::/51 +2a02:26f7:b381:2000::/55 +2a02:26f7:b381:2200::/57 +2a02:26f7:b381:2280::/59 +2a02:26f7:b381:22a0::/60 +2a02:26f7:b381:4000::/64 +2a02:26f7:b381:a000::/54 +2a02:26f7:b381:a400::/57 +2a02:26f7:b381:a480::/58 +2a02:26f7:b381:a4c0::/59 +2a02:26f7:b381:a4e0::/62 +2a02:26f7:b381:a4e4::/63 +2a02:26f7:b381:a4e7::/64 +2a02:26f7:b381:a4e8::/61 +2a02:26f7:b381:a4f0::/60 +2a02:26f7:b381:a500::/56 +2a02:26f7:b381:a600::/56 +2a02:26f7:b381:a700::/58 +2a02:26f7:b381:a740::/59 +2a02:26f7:b381:a760::/60 +2a02:26f7:b381:a770::/61 +2a02:26f7:b381:a778::/63 +2a02:26f7:b381:fff0::/64 +2a02:26f7:b382::/51 +2a02:26f7:b382:2000::/55 +2a02:26f7:b382:2200::/57 +2a02:26f7:b382:2280::/59 +2a02:26f7:b382:22a0::/60 +2a02:26f7:b382:4000::/64 +2a02:26f7:b382:a000::/54 +2a02:26f7:b382:a400::/57 +2a02:26f7:b382:a480::/58 +2a02:26f7:b382:a4c0::/59 +2a02:26f7:b382:a4e0::/62 +2a02:26f7:b382:a4e4::/63 +2a02:26f7:b382:a4e7::/64 +2a02:26f7:b382:a4e8::/61 +2a02:26f7:b382:a4f0::/60 +2a02:26f7:b382:a500::/56 +2a02:26f7:b382:a600::/56 +2a02:26f7:b382:a700::/58 +2a02:26f7:b382:a740::/59 +2a02:26f7:b382:a760::/60 +2a02:26f7:b382:a770::/61 +2a02:26f7:b382:a778::/63 +2a02:26f7:b382:fff0::/64 +2a02:26f7:b383:4000::/64 +2a02:26f7:b384::/51 +2a02:26f7:b384:2000::/55 +2a02:26f7:b384:2200::/57 +2a02:26f7:b384:2280::/59 +2a02:26f7:b384:22a0::/60 +2a02:26f7:b384:4000::/64 +2a02:26f7:b384:a000::/54 +2a02:26f7:b384:a400::/57 +2a02:26f7:b384:a480::/58 +2a02:26f7:b384:a4c0::/59 +2a02:26f7:b384:a4e0::/62 +2a02:26f7:b384:a4e4::/63 +2a02:26f7:b384:a4e7::/64 +2a02:26f7:b384:a4e8::/61 +2a02:26f7:b384:a4f0::/60 +2a02:26f7:b384:a500::/56 +2a02:26f7:b384:a600::/56 +2a02:26f7:b384:a700::/58 +2a02:26f7:b384:a740::/59 +2a02:26f7:b384:a760::/60 +2a02:26f7:b384:a770::/61 +2a02:26f7:b384:a778::/63 +2a02:26f7:b384:fff0::/64 +2a02:26f7:b385::/51 +2a02:26f7:b385:2000::/55 +2a02:26f7:b385:2200::/57 +2a02:26f7:b385:2280::/59 +2a02:26f7:b385:22a0::/60 +2a02:26f7:b385:4000::/64 +2a02:26f7:b385:a000::/54 +2a02:26f7:b385:a400::/57 +2a02:26f7:b385:a480::/58 +2a02:26f7:b385:a4c0::/59 +2a02:26f7:b385:a4e0::/62 +2a02:26f7:b385:a4e4::/63 +2a02:26f7:b385:a4e7::/64 +2a02:26f7:b385:a4e8::/61 +2a02:26f7:b385:a4f0::/60 +2a02:26f7:b385:a500::/56 +2a02:26f7:b385:a600::/56 +2a02:26f7:b385:a700::/58 +2a02:26f7:b385:a740::/59 +2a02:26f7:b385:a760::/60 +2a02:26f7:b385:a770::/61 +2a02:26f7:b385:a778::/63 +2a02:26f7:b385:fff0::/64 +2a02:26f7:b386:4000::/64 +2a02:26f7:b387:4000::/64 +2a02:26f7:b388::/51 +2a02:26f7:b388:2000::/55 +2a02:26f7:b388:2200::/57 +2a02:26f7:b388:2280::/59 +2a02:26f7:b388:22a0::/60 +2a02:26f7:b388:4000::/64 +2a02:26f7:b388:a000::/54 +2a02:26f7:b388:a400::/57 +2a02:26f7:b388:a480::/58 +2a02:26f7:b388:a4c0::/59 +2a02:26f7:b388:a4e0::/62 +2a02:26f7:b388:a4e4::/63 +2a02:26f7:b388:a4e7::/64 +2a02:26f7:b388:a4e8::/61 +2a02:26f7:b388:a4f0::/60 +2a02:26f7:b388:a500::/56 +2a02:26f7:b388:a600::/56 +2a02:26f7:b388:a700::/58 +2a02:26f7:b388:a740::/59 +2a02:26f7:b388:a760::/60 +2a02:26f7:b388:a770::/61 +2a02:26f7:b388:a778::/63 +2a02:26f7:b388:fff0::/64 +2a02:26f7:b389::/51 +2a02:26f7:b389:2000::/55 +2a02:26f7:b389:2200::/57 +2a02:26f7:b389:2280::/59 +2a02:26f7:b389:22a0::/60 +2a02:26f7:b389:4000::/64 +2a02:26f7:b389:a000::/54 +2a02:26f7:b389:a400::/57 +2a02:26f7:b389:a480::/58 +2a02:26f7:b389:a4c0::/59 +2a02:26f7:b389:a4e0::/62 +2a02:26f7:b389:a4e4::/63 +2a02:26f7:b389:a4e7::/64 +2a02:26f7:b389:a4e8::/61 +2a02:26f7:b389:a4f0::/60 +2a02:26f7:b389:a500::/56 +2a02:26f7:b389:a600::/56 +2a02:26f7:b389:a700::/58 +2a02:26f7:b389:a740::/59 +2a02:26f7:b389:a760::/60 +2a02:26f7:b389:a770::/61 +2a02:26f7:b389:a778::/63 +2a02:26f7:b389:fff0::/64 +2a02:26f7:b38a:4000::/64 +2a02:26f7:b38b:4000::/64 +2a02:26f7:b38c::/51 +2a02:26f7:b38c:2000::/55 +2a02:26f7:b38c:2200::/57 +2a02:26f7:b38c:2280::/59 +2a02:26f7:b38c:22a0::/60 +2a02:26f7:b38c:4000::/64 +2a02:26f7:b38c:a000::/54 +2a02:26f7:b38c:a400::/57 +2a02:26f7:b38c:a480::/58 +2a02:26f7:b38c:a4c0::/59 +2a02:26f7:b38c:a4e0::/62 +2a02:26f7:b38c:a4e4::/63 +2a02:26f7:b38c:a4e7::/64 +2a02:26f7:b38c:a4e8::/61 +2a02:26f7:b38c:a4f0::/60 +2a02:26f7:b38c:a500::/56 +2a02:26f7:b38c:a600::/56 +2a02:26f7:b38c:a700::/58 +2a02:26f7:b38c:a740::/59 +2a02:26f7:b38c:a760::/60 +2a02:26f7:b38c:a770::/61 +2a02:26f7:b38c:a778::/63 +2a02:26f7:b38c:fff0::/64 +2a02:26f7:b38d:4000::/64 +2a02:26f7:b38e:4000::/64 +2a02:26f7:b38f:4000::/64 +2a02:26f7:b390:4000::/64 +2a02:26f7:b391:4000::/64 +2a02:26f7:b394:4000::/64 +2a02:26f7:b395:4000::/64 +2a02:26f7:b396:4000::/64 +2a02:26f7:b397:4000::/64 +2a02:26f7:b398:4000::/64 +2a02:26f7:b399:4000::/64 +2a02:26f7:b3c0:4000::/64 +2a02:26f7:b3c0:8000::/55 +2a02:26f7:b3c0:8200::/59 +2a02:26f7:b3c0:8220::/63 +2a02:26f7:b3c1:4000::/64 +2a02:26f7:b3c4:4000::/64 +2a02:26f7:b3c4:8000::/55 +2a02:26f7:b3c4:8200::/59 +2a02:26f7:b3c4:8220::/63 +2a02:26f7:b3c5:4000::/64 +2a02:26f7:b3c8:4000::/64 +2a02:26f7:b3c8:8000::/55 +2a02:26f7:b3c8:8200::/59 +2a02:26f7:b3c8:8220::/63 +2a02:26f7:b3c9:4000::/64 +2a02:26f7:b400:4000::/64 +2a02:26f7:b400:a000::/54 +2a02:26f7:b400:a400::/57 +2a02:26f7:b400:a480::/58 +2a02:26f7:b400:a4c0::/59 +2a02:26f7:b400:a4e0::/62 +2a02:26f7:b400:a4e4::/63 +2a02:26f7:b400:a4e7::/64 +2a02:26f7:b400:a4e8::/61 +2a02:26f7:b400:a4f0::/60 +2a02:26f7:b400:a500::/56 +2a02:26f7:b400:a600::/56 +2a02:26f7:b400:a700::/58 +2a02:26f7:b400:a740::/59 +2a02:26f7:b400:a760::/60 +2a02:26f7:b400:a770::/61 +2a02:26f7:b400:a778::/63 +2a02:26f7:b401:4000::/64 +2a02:26f7:b404:4000::/64 +2a02:26f7:b404:a000::/54 +2a02:26f7:b404:a400::/57 +2a02:26f7:b404:a480::/58 +2a02:26f7:b404:a4c0::/59 +2a02:26f7:b404:a4e0::/62 +2a02:26f7:b404:a4e4::/63 +2a02:26f7:b404:a4e7::/64 +2a02:26f7:b404:a4e8::/61 +2a02:26f7:b404:a4f0::/60 +2a02:26f7:b404:a500::/56 +2a02:26f7:b404:a600::/56 +2a02:26f7:b404:a700::/58 +2a02:26f7:b404:a740::/59 +2a02:26f7:b404:a760::/60 +2a02:26f7:b404:a770::/61 +2a02:26f7:b404:a778::/63 +2a02:26f7:b405:4000::/64 +2a02:26f7:b408:4000::/64 +2a02:26f7:b408:a000::/54 +2a02:26f7:b408:a400::/57 +2a02:26f7:b408:a480::/58 +2a02:26f7:b408:a4c0::/59 +2a02:26f7:b408:a4e0::/62 +2a02:26f7:b408:a4e4::/63 +2a02:26f7:b408:a4e7::/64 +2a02:26f7:b408:a4e8::/61 +2a02:26f7:b408:a4f0::/60 +2a02:26f7:b408:a500::/56 +2a02:26f7:b408:a600::/56 +2a02:26f7:b408:a700::/58 +2a02:26f7:b408:a740::/59 +2a02:26f7:b408:a760::/60 +2a02:26f7:b408:a770::/61 +2a02:26f7:b408:a778::/63 +2a02:26f7:b409:4000::/64 +2a02:26f7:b440:4000::/64 +2a02:26f7:b441:4000::/64 +2a02:26f7:b444:4000::/64 +2a02:26f7:b445:4000::/64 +2a02:26f7:b448:4000::/64 +2a02:26f7:b449:4000::/64 +2a02:26f7:b44c:4000::/64 +2a02:26f7:b44d:4000::/64 +2a02:26f7:b450:4000::/64 +2a02:26f7:b451:4000::/64 +2a02:26f7:b480:4000::/64 +2a02:26f7:b481:4000::/64 +2a02:26f7:b482:4000::/64 +2a02:26f7:b483:4000::/64 +2a02:26f7:b484:4000::/64 +2a02:26f7:b485:4000::/64 +2a02:26f7:b488:4000::/64 +2a02:26f7:b489:4000::/64 +2a02:26f7:b4c0:4000::/64 +2a02:26f7:b4c1:4000::/64 +2a02:26f7:b4c2:4000::/64 +2a02:26f7:b4c3:4000::/64 +2a02:26f7:b4c4:4000::/64 +2a02:26f7:b4c5:4000::/64 +2a02:26f7:b4c8:4000::/64 +2a02:26f7:b4c9:4000::/64 +2a02:26f7:b4cc:4000::/64 +2a02:26f7:b4cd:4000::/64 +2a02:26f7:b4d0:4000::/64 +2a02:26f7:b4d1:4000::/64 +2a02:26f7:b500:4000::/64 +2a02:26f7:b501:4000::/64 +2a02:26f7:b502:4000::/64 +2a02:26f7:b503:4000::/64 +2a02:26f7:b504:4000::/64 +2a02:26f7:b505:4000::/64 +2a02:26f7:b50c:4000::/64 +2a02:26f7:b50d:4000::/64 +2a02:26f7:b540:4000::/64 +2a02:26f7:b541:4000::/64 +2a02:26f7:b542:4000::/64 +2a02:26f7:b543:4000::/64 +2a02:26f7:b544:4000::/64 +2a02:26f7:b545:4000::/64 +2a02:26f7:b54c:4000::/64 +2a02:26f7:b54d:4000::/64 +2a02:26f7:b550:4000::/64 +2a02:26f7:b551:4000::/64 +2a02:26f7:b5c0:4000::/64 +2a02:26f7:b5c0:d580::/59 +2a02:26f7:b5c0:d5a0::/64 +2a02:26f7:b5c1:4000::/64 +2a02:26f7:b5c4:4000::/64 +2a02:26f7:b5c4:d580::/59 +2a02:26f7:b5c4:d5a0::/64 +2a02:26f7:b5c5:4000::/64 +2a02:26f7:b5c8:4000::/64 +2a02:26f7:b5c8:d580::/59 +2a02:26f7:b5c8:d5a0::/64 +2a02:26f7:b5c9:4000::/64 +2a02:26f7:b600::/54 +2a02:26f7:b600:4000::/64 +2a02:26f7:b600:db00::/63 +2a02:26f7:b600:db03::/64 +2a02:26f7:b600:db04::/62 +2a02:26f7:b600:db08::/63 +2a02:26f7:b600:db0b::/64 +2a02:26f7:b600:db0d::/64 +2a02:26f7:b600:db0e::/63 +2a02:26f7:b600:db10::/63 +2a02:26f7:b600:db14::/63 +2a02:26f7:b600:db18::/63 +2a02:26f7:b600:db1b::/64 +2a02:26f7:b600:db20::/64 +2a02:26f7:b600:db23::/64 +2a02:26f7:b600:db25::/64 +2a02:26f7:b600:db26::/63 +2a02:26f7:b600:db28::/64 +2a02:26f7:b600:db2a::/63 +2a02:26f7:b600:db2d::/64 +2a02:26f7:b600:db2f::/64 +2a02:26f7:b600:db31::/64 +2a02:26f7:b600:db32::/64 +2a02:26f7:b600:db36::/63 +2a02:26f7:b600:db3c::/63 +2a02:26f7:b600:db3e::/64 +2a02:26f7:b600:db40::/64 +2a02:26f7:b600:db44::/64 +2a02:26f7:b600:db47::/64 +2a02:26f7:b600:db49::/64 +2a02:26f7:b600:db4d::/64 +2a02:26f7:b600:db4e::/63 +2a02:26f7:b600:db50::/64 +2a02:26f7:b600:db52::/63 +2a02:26f7:b600:db54::/64 +2a02:26f7:b600:db57::/64 +2a02:26f7:b600:db58::/63 +2a02:26f7:b600:db5a::/64 +2a02:26f7:b600:db5d::/64 +2a02:26f7:b600:db5e::/63 +2a02:26f7:b601::/54 +2a02:26f7:b601:4000::/64 +2a02:26f7:b601:db00::/63 +2a02:26f7:b601:db03::/64 +2a02:26f7:b601:db04::/62 +2a02:26f7:b601:db08::/63 +2a02:26f7:b601:db0b::/64 +2a02:26f7:b601:db0d::/64 +2a02:26f7:b601:db0e::/63 +2a02:26f7:b601:db10::/63 +2a02:26f7:b601:db14::/63 +2a02:26f7:b601:db18::/63 +2a02:26f7:b601:db1b::/64 +2a02:26f7:b601:db20::/64 +2a02:26f7:b601:db23::/64 +2a02:26f7:b601:db25::/64 +2a02:26f7:b601:db26::/63 +2a02:26f7:b601:db28::/64 +2a02:26f7:b601:db2a::/63 +2a02:26f7:b601:db2d::/64 +2a02:26f7:b601:db2f::/64 +2a02:26f7:b601:db31::/64 +2a02:26f7:b601:db32::/64 +2a02:26f7:b601:db36::/63 +2a02:26f7:b601:db3c::/63 +2a02:26f7:b601:db3e::/64 +2a02:26f7:b601:db40::/64 +2a02:26f7:b601:db44::/64 +2a02:26f7:b601:db47::/64 +2a02:26f7:b601:db49::/64 +2a02:26f7:b601:db4d::/64 +2a02:26f7:b601:db4e::/63 +2a02:26f7:b601:db50::/64 +2a02:26f7:b601:db52::/63 +2a02:26f7:b601:db54::/64 +2a02:26f7:b601:db57::/64 +2a02:26f7:b601:db58::/63 +2a02:26f7:b601:db5a::/64 +2a02:26f7:b601:db5d::/64 +2a02:26f7:b601:db5e::/63 +2a02:26f7:b602:4000::/64 +2a02:26f7:b603:4000::/64 +2a02:26f7:b604::/54 +2a02:26f7:b604:4000::/64 +2a02:26f7:b604:db00::/63 +2a02:26f7:b604:db03::/64 +2a02:26f7:b604:db04::/62 +2a02:26f7:b604:db08::/63 +2a02:26f7:b604:db0b::/64 +2a02:26f7:b604:db0d::/64 +2a02:26f7:b604:db0e::/63 +2a02:26f7:b604:db10::/63 +2a02:26f7:b604:db14::/63 +2a02:26f7:b604:db18::/63 +2a02:26f7:b604:db1b::/64 +2a02:26f7:b604:db20::/64 +2a02:26f7:b604:db23::/64 +2a02:26f7:b604:db25::/64 +2a02:26f7:b604:db26::/63 +2a02:26f7:b604:db28::/64 +2a02:26f7:b604:db2a::/63 +2a02:26f7:b604:db2d::/64 +2a02:26f7:b604:db2f::/64 +2a02:26f7:b604:db31::/64 +2a02:26f7:b604:db32::/64 +2a02:26f7:b604:db36::/63 +2a02:26f7:b604:db3c::/63 +2a02:26f7:b604:db3e::/64 +2a02:26f7:b604:db40::/64 +2a02:26f7:b604:db44::/64 +2a02:26f7:b604:db47::/64 +2a02:26f7:b604:db49::/64 +2a02:26f7:b604:db4d::/64 +2a02:26f7:b604:db4e::/63 +2a02:26f7:b604:db50::/64 +2a02:26f7:b604:db52::/63 +2a02:26f7:b604:db54::/64 +2a02:26f7:b604:db57::/64 +2a02:26f7:b604:db58::/63 +2a02:26f7:b604:db5a::/64 +2a02:26f7:b604:db5d::/64 +2a02:26f7:b604:db5e::/63 +2a02:26f7:b605:4000::/64 +2a02:26f7:b608::/54 +2a02:26f7:b608:4000::/64 +2a02:26f7:b608:db00::/63 +2a02:26f7:b608:db03::/64 +2a02:26f7:b608:db04::/62 +2a02:26f7:b608:db08::/63 +2a02:26f7:b608:db0b::/64 +2a02:26f7:b608:db0d::/64 +2a02:26f7:b608:db0e::/63 +2a02:26f7:b608:db10::/63 +2a02:26f7:b608:db14::/63 +2a02:26f7:b608:db18::/63 +2a02:26f7:b608:db1b::/64 +2a02:26f7:b608:db20::/64 +2a02:26f7:b608:db23::/64 +2a02:26f7:b608:db25::/64 +2a02:26f7:b608:db26::/63 +2a02:26f7:b608:db28::/64 +2a02:26f7:b608:db2a::/63 +2a02:26f7:b608:db2d::/64 +2a02:26f7:b608:db2f::/64 +2a02:26f7:b608:db31::/64 +2a02:26f7:b608:db32::/64 +2a02:26f7:b608:db36::/63 +2a02:26f7:b608:db3c::/63 +2a02:26f7:b608:db3e::/64 +2a02:26f7:b608:db40::/64 +2a02:26f7:b608:db44::/64 +2a02:26f7:b608:db47::/64 +2a02:26f7:b608:db49::/64 +2a02:26f7:b608:db4d::/64 +2a02:26f7:b608:db4e::/63 +2a02:26f7:b608:db50::/64 +2a02:26f7:b608:db52::/63 +2a02:26f7:b608:db54::/64 +2a02:26f7:b608:db57::/64 +2a02:26f7:b608:db58::/63 +2a02:26f7:b608:db5a::/64 +2a02:26f7:b608:db5d::/64 +2a02:26f7:b608:db5e::/63 +2a02:26f7:b609:4000::/64 +2a02:26f7:b640:4000::/64 +2a02:26f7:b640:ce00::/63 +2a02:26f7:b640:ce02::/64 +2a02:26f7:b641:4000::/64 +2a02:26f7:b641:ce00::/63 +2a02:26f7:b641:ce02::/64 +2a02:26f7:b642:4000::/64 +2a02:26f7:b643:4000::/64 +2a02:26f7:b644:4000::/64 +2a02:26f7:b644:ce00::/63 +2a02:26f7:b644:ce02::/64 +2a02:26f7:b645:4000::/64 +2a02:26f7:b648:4000::/64 +2a02:26f7:b648:ce00::/63 +2a02:26f7:b648:ce02::/64 +2a02:26f7:b649:4000::/64 +2a02:26f7:b680:4000::/64 +2a02:26f7:b680:d160::/61 +2a02:26f7:b680:d168::/64 +2a02:26f7:b681:4000::/64 +2a02:26f7:b684:4000::/64 +2a02:26f7:b684:d160::/61 +2a02:26f7:b684:d168::/64 +2a02:26f7:b685:4000::/64 +2a02:26f7:b688:4000::/64 +2a02:26f7:b688:d160::/61 +2a02:26f7:b688:d168::/64 +2a02:26f7:b689:4000::/64 +2a02:26f7:b68c:4000::/64 +2a02:26f7:b68c:d160::/61 +2a02:26f7:b68c:d168::/64 +2a02:26f7:b68d:4000::/64 +2a02:26f7:b6c0::/54 +2a02:26f7:b6c0:400::/56 +2a02:26f7:b6c0:500::/60 +2a02:26f7:b6c0:4000::/64 +2a02:26f7:b6c0:4e00::/61 +2a02:26f7:b6c0:4e08::/62 +2a02:26f7:b6c0:4e0c::/64 +2a02:26f7:b6c0:4e0e::/63 +2a02:26f7:b6c0:4e10::/60 +2a02:26f7:b6c0:4e20::/62 +2a02:26f7:b6c0:4e25::/64 +2a02:26f7:b6c0:4e26::/63 +2a02:26f7:b6c0:4e28::/61 +2a02:26f7:b6c0:4e30::/62 +2a02:26f7:b6c0:4e34::/63 +2a02:26f7:b6c0:4e36::/64 +2a02:26f7:b6c0:4e38::/62 +2a02:26f7:b6c0:4e3d::/64 +2a02:26f7:b6c0:4e3e::/63 +2a02:26f7:b6c0:dd00::/63 +2a02:26f7:b6c0:dd03::/64 +2a02:26f7:b6c0:dd04::/62 +2a02:26f7:b6c0:dd08::/63 +2a02:26f7:b6c0:dd0a::/64 +2a02:26f7:b6c0:dd0c::/63 +2a02:26f7:b6c0:dd0e::/64 +2a02:26f7:b6c0:dd10::/62 +2a02:26f7:b6c0:dd14::/63 +2a02:26f7:b6c0:dd16::/64 +2a02:26f7:b6c0:dd18::/62 +2a02:26f7:b6c0:dd1d::/64 +2a02:26f7:b6c0:dd1e::/64 +2a02:26f7:b6c0:dd21::/64 +2a02:26f7:b6c0:dd22::/63 +2a02:26f7:b6c0:dd25::/64 +2a02:26f7:b6c0:dd26::/64 +2a02:26f7:b6c0:dd28::/63 +2a02:26f7:b6c1:4000::/64 +2a02:26f7:b6c4::/54 +2a02:26f7:b6c4:400::/56 +2a02:26f7:b6c4:500::/60 +2a02:26f7:b6c4:4000::/64 +2a02:26f7:b6c4:4e00::/61 +2a02:26f7:b6c4:4e08::/62 +2a02:26f7:b6c4:4e0c::/64 +2a02:26f7:b6c4:4e0e::/63 +2a02:26f7:b6c4:4e10::/60 +2a02:26f7:b6c4:4e20::/62 +2a02:26f7:b6c4:4e25::/64 +2a02:26f7:b6c4:4e26::/63 +2a02:26f7:b6c4:4e28::/61 +2a02:26f7:b6c4:4e30::/62 +2a02:26f7:b6c4:4e34::/63 +2a02:26f7:b6c4:4e36::/64 +2a02:26f7:b6c4:4e38::/62 +2a02:26f7:b6c4:4e3d::/64 +2a02:26f7:b6c4:4e3e::/63 +2a02:26f7:b6c4:dd00::/63 +2a02:26f7:b6c4:dd03::/64 +2a02:26f7:b6c4:dd04::/62 +2a02:26f7:b6c4:dd08::/63 +2a02:26f7:b6c4:dd0a::/64 +2a02:26f7:b6c4:dd0c::/63 +2a02:26f7:b6c4:dd0e::/64 +2a02:26f7:b6c4:dd10::/62 +2a02:26f7:b6c4:dd14::/63 +2a02:26f7:b6c4:dd16::/64 +2a02:26f7:b6c4:dd18::/62 +2a02:26f7:b6c4:dd1d::/64 +2a02:26f7:b6c4:dd1e::/64 +2a02:26f7:b6c4:dd21::/64 +2a02:26f7:b6c4:dd22::/63 +2a02:26f7:b6c4:dd25::/64 +2a02:26f7:b6c4:dd26::/64 +2a02:26f7:b6c4:dd28::/63 +2a02:26f7:b6c5:4000::/64 +2a02:26f7:b6c8::/54 +2a02:26f7:b6c8:400::/56 +2a02:26f7:b6c8:500::/60 +2a02:26f7:b6c8:4000::/64 +2a02:26f7:b6c8:4e00::/61 +2a02:26f7:b6c8:4e08::/62 +2a02:26f7:b6c8:4e0c::/64 +2a02:26f7:b6c8:4e0e::/63 +2a02:26f7:b6c8:4e10::/60 +2a02:26f7:b6c8:4e20::/62 +2a02:26f7:b6c8:4e25::/64 +2a02:26f7:b6c8:4e26::/63 +2a02:26f7:b6c8:4e28::/61 +2a02:26f7:b6c8:4e30::/62 +2a02:26f7:b6c8:4e34::/63 +2a02:26f7:b6c8:4e36::/64 +2a02:26f7:b6c8:4e38::/62 +2a02:26f7:b6c8:4e3d::/64 +2a02:26f7:b6c8:4e3e::/63 +2a02:26f7:b6c8:dd00::/63 +2a02:26f7:b6c8:dd03::/64 +2a02:26f7:b6c8:dd04::/62 +2a02:26f7:b6c8:dd08::/63 +2a02:26f7:b6c8:dd0a::/64 +2a02:26f7:b6c8:dd0c::/63 +2a02:26f7:b6c8:dd0e::/64 +2a02:26f7:b6c8:dd10::/62 +2a02:26f7:b6c8:dd14::/63 +2a02:26f7:b6c8:dd16::/64 +2a02:26f7:b6c8:dd18::/62 +2a02:26f7:b6c8:dd1d::/64 +2a02:26f7:b6c8:dd1e::/64 +2a02:26f7:b6c8:dd21::/64 +2a02:26f7:b6c8:dd22::/63 +2a02:26f7:b6c8:dd25::/64 +2a02:26f7:b6c8:dd26::/64 +2a02:26f7:b6c8:dd28::/63 +2a02:26f7:b6c9:4000::/64 +2a02:26f7:b6cc::/54 +2a02:26f7:b6cc:400::/56 +2a02:26f7:b6cc:500::/60 +2a02:26f7:b6cc:4000::/64 +2a02:26f7:b6cc:4e00::/61 +2a02:26f7:b6cc:4e08::/62 +2a02:26f7:b6cc:4e0c::/64 +2a02:26f7:b6cc:4e0e::/63 +2a02:26f7:b6cc:4e10::/60 +2a02:26f7:b6cc:4e20::/62 +2a02:26f7:b6cc:4e25::/64 +2a02:26f7:b6cc:4e26::/63 +2a02:26f7:b6cc:4e28::/61 +2a02:26f7:b6cc:4e30::/62 +2a02:26f7:b6cc:4e34::/63 +2a02:26f7:b6cc:4e36::/64 +2a02:26f7:b6cc:4e38::/62 +2a02:26f7:b6cc:4e3d::/64 +2a02:26f7:b6cc:4e3e::/63 +2a02:26f7:b6cc:dd00::/63 +2a02:26f7:b6cc:dd03::/64 +2a02:26f7:b6cc:dd04::/62 +2a02:26f7:b6cc:dd08::/63 +2a02:26f7:b6cc:dd0a::/64 +2a02:26f7:b6cc:dd0c::/63 +2a02:26f7:b6cc:dd0e::/64 +2a02:26f7:b6cc:dd10::/62 +2a02:26f7:b6cc:dd14::/63 +2a02:26f7:b6cc:dd16::/64 +2a02:26f7:b6cc:dd18::/62 +2a02:26f7:b6cc:dd1d::/64 +2a02:26f7:b6cc:dd1e::/64 +2a02:26f7:b6cc:dd21::/64 +2a02:26f7:b6cc:dd22::/63 +2a02:26f7:b6cc:dd25::/64 +2a02:26f7:b6cc:dd26::/64 +2a02:26f7:b6cc:dd28::/63 +2a02:26f7:b6cd:4000::/64 +2a02:26f7:b700:4000::/64 +2a02:26f7:b700:c120::/64 +2a02:26f7:b701:4000::/64 +2a02:26f7:b702:4000::/64 +2a02:26f7:b702:c120::/64 +2a02:26f7:b703:4000::/64 +2a02:26f7:b704:4000::/64 +2a02:26f7:b704:c120::/64 +2a02:26f7:b705:4000::/64 +2a02:26f7:b708:4000::/64 +2a02:26f7:b708:c120::/64 +2a02:26f7:b709:4000::/64 +2a02:26f7:b740:4000::/64 +2a02:26f7:b740:5380::/60 +2a02:26f7:b740:5390::/61 +2a02:26f7:b740:5398::/63 +2a02:26f7:b740:539a::/64 +2a02:26f7:b740:fff0::/64 +2a02:26f7:b741:4000::/64 +2a02:26f7:b744:4000::/64 +2a02:26f7:b744:5380::/60 +2a02:26f7:b744:5390::/61 +2a02:26f7:b744:5398::/63 +2a02:26f7:b744:539a::/64 +2a02:26f7:b744:fff0::/64 +2a02:26f7:b745:4000::/64 +2a02:26f7:b745:5380::/60 +2a02:26f7:b745:5390::/61 +2a02:26f7:b745:5398::/63 +2a02:26f7:b745:539a::/64 +2a02:26f7:b745:fff0::/64 +2a02:26f7:b746:4000::/64 +2a02:26f7:b746:5380::/60 +2a02:26f7:b746:5390::/61 +2a02:26f7:b746:5398::/63 +2a02:26f7:b746:539a::/64 +2a02:26f7:b746:fff0::/64 +2a02:26f7:b747:4000::/64 +2a02:26f7:b748:4000::/64 +2a02:26f7:b748:5380::/60 +2a02:26f7:b748:5390::/61 +2a02:26f7:b748:5398::/63 +2a02:26f7:b748:539a::/64 +2a02:26f7:b748:fff0::/64 +2a02:26f7:b74a:4000::/64 +2a02:26f7:b74c:fff0::/64 +2a02:26f7:b750:4000::/64 +2a02:26f7:b751:4000::/64 +2a02:26f7:b780::/53 +2a02:26f7:b780:800::/60 +2a02:26f7:b780:4000::/64 +2a02:26f7:b780:4dc0::/60 +2a02:26f7:b781:4000::/64 +2a02:26f7:b784::/53 +2a02:26f7:b784:800::/60 +2a02:26f7:b784:4000::/64 +2a02:26f7:b784:4dc0::/60 +2a02:26f7:b786::/53 +2a02:26f7:b786:800::/60 +2a02:26f7:b786:4000::/64 +2a02:26f7:b786:4dc0::/60 +2a02:26f7:b787:4000::/64 +2a02:26f7:b788::/53 +2a02:26f7:b788:800::/60 +2a02:26f7:b788:4000::/64 +2a02:26f7:b788:4dc0::/60 +2a02:26f7:b789:4000::/64 +2a02:26f7:b791:4000::/64 +2a02:26f7:b7c0:4000::/64 +2a02:26f7:b7c0:d260::/62 +2a02:26f7:b7c0:d265::/64 +2a02:26f7:b7c0:d266::/63 +2a02:26f7:b7c0:d268::/62 +2a02:26f7:b7c1:4000::/64 +2a02:26f7:b7c4:4000::/64 +2a02:26f7:b7c4:d260::/62 +2a02:26f7:b7c4:d265::/64 +2a02:26f7:b7c4:d266::/63 +2a02:26f7:b7c4:d268::/62 +2a02:26f7:b7c5:4000::/64 +2a02:26f7:b7c8:4000::/64 +2a02:26f7:b7c8:d260::/62 +2a02:26f7:b7c8:d265::/64 +2a02:26f7:b7c8:d266::/63 +2a02:26f7:b7c8:d268::/62 +2a02:26f7:b7c9:4000::/64 +2a02:26f7:b800:4000::/64 +2a02:26f7:b800:d320::/60 +2a02:26f7:b800:d330::/63 +2a02:26f7:b800:d332::/64 +2a02:26f7:b801:4000::/64 +2a02:26f7:b804:4000::/64 +2a02:26f7:b804:d320::/60 +2a02:26f7:b804:d330::/63 +2a02:26f7:b804:d332::/64 +2a02:26f7:b805:4000::/64 +2a02:26f7:b808:4000::/64 +2a02:26f7:b808:d320::/60 +2a02:26f7:b808:d330::/63 +2a02:26f7:b808:d332::/64 +2a02:26f7:b809:4000::/64 +2a02:26f7:b80c:4000::/64 +2a02:26f7:b80c:d320::/60 +2a02:26f7:b80c:d330::/63 +2a02:26f7:b80c:d332::/64 +2a02:26f7:b80d:4000::/64 +2a02:26f7:b840:4000::/64 +2a02:26f7:b840:5080::/58 +2a02:26f7:b840:ea00::/56 +2a02:26f7:b840:eb00::/61 +2a02:26f7:b840:eb08::/64 +2a02:26f7:b841:4000::/64 +2a02:26f7:b844:4000::/64 +2a02:26f7:b844:5080::/58 +2a02:26f7:b844:ea00::/56 +2a02:26f7:b844:eb00::/61 +2a02:26f7:b844:eb08::/64 +2a02:26f7:b845:4000::/64 +2a02:26f7:b848:4000::/64 +2a02:26f7:b848:5080::/58 +2a02:26f7:b848:ea00::/56 +2a02:26f7:b848:eb00::/61 +2a02:26f7:b848:eb08::/64 +2a02:26f7:b849:4000::/64 +2a02:26f7:b84c:4000::/64 +2a02:26f7:b84c:5080::/58 +2a02:26f7:b84c:ea00::/56 +2a02:26f7:b84c:eb00::/61 +2a02:26f7:b84c:eb08::/64 +2a02:26f7:b84d:4000::/64 +2a02:26f7:b850:4000::/64 +2a02:26f7:b850:5080::/58 +2a02:26f7:b850:ea00::/56 +2a02:26f7:b850:eb00::/61 +2a02:26f7:b850:eb08::/64 +2a02:26f7:b851:4000::/64 +2a02:26f7:b854:4000::/64 +2a02:26f7:b854:5080::/58 +2a02:26f7:b854:ea00::/56 +2a02:26f7:b854:eb00::/61 +2a02:26f7:b854:eb08::/64 +2a02:26f7:b855:4000::/64 +2a02:26f7:b880:4000::/64 +2a02:26f7:b880:d200::/62 +2a02:26f7:b880:d205::/64 +2a02:26f7:b880:d206::/63 +2a02:26f7:b880:d208::/63 +2a02:26f7:b881:4000::/64 +2a02:26f7:b884:4000::/64 +2a02:26f7:b884:d200::/62 +2a02:26f7:b884:d205::/64 +2a02:26f7:b884:d206::/63 +2a02:26f7:b884:d208::/63 +2a02:26f7:b885:4000::/64 +2a02:26f7:b888:4000::/64 +2a02:26f7:b888:d200::/62 +2a02:26f7:b888:d205::/64 +2a02:26f7:b888:d206::/63 +2a02:26f7:b888:d208::/63 +2a02:26f7:b889:4000::/64 +2a02:26f7:b88c:4000::/64 +2a02:26f7:b88c:d200::/62 +2a02:26f7:b88c:d205::/64 +2a02:26f7:b88c:d206::/63 +2a02:26f7:b88c:d208::/63 +2a02:26f7:b88d:4000::/64 +2a02:26f7:b8c0:4000::/64 +2a02:26f7:b8c0:cbe0::/63 +2a02:26f7:b8c1:4000::/64 +2a02:26f7:b8c4:4000::/64 +2a02:26f7:b8c4:cbe0::/63 +2a02:26f7:b8c5:4000::/64 +2a02:26f7:b8c8:4000::/64 +2a02:26f7:b8c8:cbe0::/63 +2a02:26f7:b8c9:4000::/64 +2a02:26f7:b900:4000::/64 +2a02:26f7:b900:c540::/64 +2a02:26f7:b901:4000::/64 +2a02:26f7:b902:4000::/64 +2a02:26f7:b902:c540::/64 +2a02:26f7:b903:4000::/64 +2a02:26f7:b904:4000::/64 +2a02:26f7:b904:c540::/64 +2a02:26f7:b905:4000::/64 +2a02:26f7:b908:4000::/64 +2a02:26f7:b908:c540::/64 +2a02:26f7:b909:4000::/64 +2a02:26f7:b940:4000::/64 +2a02:26f7:b941:4000::/64 +2a02:26f7:b944:4000::/64 +2a02:26f7:b945:4000::/64 +2a02:26f7:b948:4000::/64 +2a02:26f7:b949:4000::/64 +2a02:26f7:b980::/52 +2a02:26f7:b980:1000::/57 +2a02:26f7:b980:4000::/64 +2a02:26f7:b980:6000::/61 +2a02:26f7:b980:6008::/62 +2a02:26f7:b980:600c::/63 +2a02:26f7:b980:600f::/64 +2a02:26f7:b980:6010::/63 +2a02:26f7:b980:6013::/64 +2a02:26f7:b980:6014::/62 +2a02:26f7:b980:6018::/61 +2a02:26f7:b980:6020::/59 +2a02:26f7:b980:6040::/58 +2a02:26f7:b980:6080::/59 +2a02:26f7:b980:60a0::/60 +2a02:26f7:b980:60b0::/62 +2a02:26f7:b980:60b4::/64 +2a02:26f7:b980:60b6::/63 +2a02:26f7:b980:60b8::/61 +2a02:26f7:b980:60c0::/58 +2a02:26f7:b980:6100::/58 +2a02:26f7:b980:6140::/59 +2a02:26f7:b980:6160::/61 +2a02:26f7:b980:6168::/62 +2a02:26f7:b981:4000::/64 +2a02:26f7:b984::/52 +2a02:26f7:b984:1000::/57 +2a02:26f7:b984:4000::/64 +2a02:26f7:b984:6000::/61 +2a02:26f7:b984:6008::/62 +2a02:26f7:b984:600c::/63 +2a02:26f7:b984:600f::/64 +2a02:26f7:b984:6010::/63 +2a02:26f7:b984:6013::/64 +2a02:26f7:b984:6014::/62 +2a02:26f7:b984:6018::/61 +2a02:26f7:b984:6020::/59 +2a02:26f7:b984:6040::/58 +2a02:26f7:b984:6080::/59 +2a02:26f7:b984:60a0::/60 +2a02:26f7:b984:60b0::/62 +2a02:26f7:b984:60b4::/64 +2a02:26f7:b984:60b6::/63 +2a02:26f7:b984:60b8::/61 +2a02:26f7:b984:60c0::/58 +2a02:26f7:b984:6100::/58 +2a02:26f7:b984:6140::/59 +2a02:26f7:b984:6160::/61 +2a02:26f7:b984:6168::/62 +2a02:26f7:b985::/52 +2a02:26f7:b985:1000::/57 +2a02:26f7:b985:4000::/64 +2a02:26f7:b985:6000::/61 +2a02:26f7:b985:6008::/62 +2a02:26f7:b985:600c::/63 +2a02:26f7:b985:600f::/64 +2a02:26f7:b985:6010::/63 +2a02:26f7:b985:6013::/64 +2a02:26f7:b985:6014::/62 +2a02:26f7:b985:6018::/61 +2a02:26f7:b985:6020::/59 +2a02:26f7:b985:6040::/58 +2a02:26f7:b985:6080::/59 +2a02:26f7:b985:60a0::/60 +2a02:26f7:b985:60b0::/62 +2a02:26f7:b985:60b4::/64 +2a02:26f7:b985:60b6::/63 +2a02:26f7:b985:60b8::/61 +2a02:26f7:b985:60c0::/58 +2a02:26f7:b985:6100::/58 +2a02:26f7:b985:6140::/59 +2a02:26f7:b985:6160::/61 +2a02:26f7:b985:6168::/62 +2a02:26f7:b986:4000::/64 +2a02:26f7:b987:4000::/64 +2a02:26f7:b988::/52 +2a02:26f7:b988:1000::/57 +2a02:26f7:b988:4000::/64 +2a02:26f7:b988:6000::/61 +2a02:26f7:b988:6008::/62 +2a02:26f7:b988:600c::/63 +2a02:26f7:b988:600f::/64 +2a02:26f7:b988:6010::/63 +2a02:26f7:b988:6013::/64 +2a02:26f7:b988:6014::/62 +2a02:26f7:b988:6018::/61 +2a02:26f7:b988:6020::/59 +2a02:26f7:b988:6040::/58 +2a02:26f7:b988:6080::/59 +2a02:26f7:b988:60a0::/60 +2a02:26f7:b988:60b0::/62 +2a02:26f7:b988:60b4::/64 +2a02:26f7:b988:60b6::/63 +2a02:26f7:b988:60b8::/61 +2a02:26f7:b988:60c0::/58 +2a02:26f7:b988:6100::/58 +2a02:26f7:b988:6140::/59 +2a02:26f7:b988:6160::/61 +2a02:26f7:b988:6168::/62 +2a02:26f7:b989:4000::/64 +2a02:26f7:b98a::/52 +2a02:26f7:b98a:1000::/57 +2a02:26f7:b98a:4000::/64 +2a02:26f7:b98a:6000::/61 +2a02:26f7:b98a:6008::/62 +2a02:26f7:b98a:600c::/63 +2a02:26f7:b98a:600f::/64 +2a02:26f7:b98a:6010::/63 +2a02:26f7:b98a:6013::/64 +2a02:26f7:b98a:6014::/62 +2a02:26f7:b98a:6018::/61 +2a02:26f7:b98a:6020::/59 +2a02:26f7:b98a:6040::/58 +2a02:26f7:b98a:6080::/59 +2a02:26f7:b98a:60a0::/60 +2a02:26f7:b98a:60b0::/62 +2a02:26f7:b98a:60b4::/64 +2a02:26f7:b98a:60b6::/63 +2a02:26f7:b98a:60b8::/61 +2a02:26f7:b98a:60c0::/58 +2a02:26f7:b98a:6100::/58 +2a02:26f7:b98a:6140::/59 +2a02:26f7:b98a:6160::/61 +2a02:26f7:b98a:6168::/62 +2a02:26f7:b98b:4000::/64 +2a02:26f7:b98c::/52 +2a02:26f7:b98c:1000::/57 +2a02:26f7:b98c:4000::/64 +2a02:26f7:b98c:6000::/61 +2a02:26f7:b98c:6008::/62 +2a02:26f7:b98c:600c::/63 +2a02:26f7:b98c:600f::/64 +2a02:26f7:b98c:6010::/63 +2a02:26f7:b98c:6013::/64 +2a02:26f7:b98c:6014::/62 +2a02:26f7:b98c:6018::/61 +2a02:26f7:b98c:6020::/59 +2a02:26f7:b98c:6040::/58 +2a02:26f7:b98c:6080::/59 +2a02:26f7:b98c:60a0::/60 +2a02:26f7:b98c:60b0::/62 +2a02:26f7:b98c:60b4::/64 +2a02:26f7:b98c:60b6::/63 +2a02:26f7:b98c:60b8::/61 +2a02:26f7:b98c:60c0::/58 +2a02:26f7:b98c:6100::/58 +2a02:26f7:b98c:6140::/59 +2a02:26f7:b98c:6160::/61 +2a02:26f7:b98c:6168::/62 +2a02:26f7:b98d:4000::/64 +2a02:26f7:b990::/52 +2a02:26f7:b990:1000::/57 +2a02:26f7:b990:4000::/64 +2a02:26f7:b990:6000::/61 +2a02:26f7:b990:6008::/62 +2a02:26f7:b990:600c::/63 +2a02:26f7:b990:600f::/64 +2a02:26f7:b990:6010::/63 +2a02:26f7:b990:6013::/64 +2a02:26f7:b990:6014::/62 +2a02:26f7:b990:6018::/61 +2a02:26f7:b990:6020::/59 +2a02:26f7:b990:6040::/58 +2a02:26f7:b990:6080::/59 +2a02:26f7:b990:60a0::/60 +2a02:26f7:b990:60b0::/62 +2a02:26f7:b990:60b4::/64 +2a02:26f7:b990:60b6::/63 +2a02:26f7:b990:60b8::/61 +2a02:26f7:b990:60c0::/58 +2a02:26f7:b990:6100::/58 +2a02:26f7:b990:6140::/59 +2a02:26f7:b990:6160::/61 +2a02:26f7:b990:6168::/62 +2a02:26f7:b991:4000::/64 +2a02:26f7:b994::/52 +2a02:26f7:b994:1000::/57 +2a02:26f7:b994:4000::/64 +2a02:26f7:b994:6000::/61 +2a02:26f7:b994:6008::/62 +2a02:26f7:b994:600c::/63 +2a02:26f7:b994:600f::/64 +2a02:26f7:b994:6010::/63 +2a02:26f7:b994:6013::/64 +2a02:26f7:b994:6014::/62 +2a02:26f7:b994:6018::/61 +2a02:26f7:b994:6020::/59 +2a02:26f7:b994:6040::/58 +2a02:26f7:b994:6080::/59 +2a02:26f7:b994:60a0::/60 +2a02:26f7:b994:60b0::/62 +2a02:26f7:b994:60b4::/64 +2a02:26f7:b994:60b6::/63 +2a02:26f7:b994:60b8::/61 +2a02:26f7:b994:60c0::/58 +2a02:26f7:b994:6100::/58 +2a02:26f7:b994:6140::/59 +2a02:26f7:b994:6160::/61 +2a02:26f7:b994:6168::/62 +2a02:26f7:b995:4000::/64 +2a02:26f7:b9a0::/52 +2a02:26f7:b9a0:1000::/57 +2a02:26f7:b9a0:4000::/64 +2a02:26f7:b9a0:6000::/61 +2a02:26f7:b9a0:6008::/62 +2a02:26f7:b9a0:600c::/63 +2a02:26f7:b9a0:600f::/64 +2a02:26f7:b9a0:6010::/63 +2a02:26f7:b9a0:6013::/64 +2a02:26f7:b9a0:6014::/62 +2a02:26f7:b9a0:6018::/61 +2a02:26f7:b9a0:6020::/59 +2a02:26f7:b9a0:6040::/58 +2a02:26f7:b9a0:6080::/59 +2a02:26f7:b9a0:60a0::/60 +2a02:26f7:b9a0:60b0::/62 +2a02:26f7:b9a0:60b4::/64 +2a02:26f7:b9a0:60b6::/63 +2a02:26f7:b9a0:60b8::/61 +2a02:26f7:b9a0:60c0::/58 +2a02:26f7:b9a0:6100::/58 +2a02:26f7:b9a0:6140::/59 +2a02:26f7:b9a0:6160::/61 +2a02:26f7:b9a0:6168::/62 +2a02:26f7:b9a1:4000::/64 +2a02:26f7:b9a4::/52 +2a02:26f7:b9a4:1000::/57 +2a02:26f7:b9a4:4000::/64 +2a02:26f7:b9a4:6000::/61 +2a02:26f7:b9a4:6008::/62 +2a02:26f7:b9a4:600c::/63 +2a02:26f7:b9a4:600f::/64 +2a02:26f7:b9a4:6010::/63 +2a02:26f7:b9a4:6013::/64 +2a02:26f7:b9a4:6014::/62 +2a02:26f7:b9a4:6018::/61 +2a02:26f7:b9a4:6020::/59 +2a02:26f7:b9a4:6040::/58 +2a02:26f7:b9a4:6080::/59 +2a02:26f7:b9a4:60a0::/60 +2a02:26f7:b9a4:60b0::/62 +2a02:26f7:b9a4:60b4::/64 +2a02:26f7:b9a4:60b6::/63 +2a02:26f7:b9a4:60b8::/61 +2a02:26f7:b9a4:60c0::/58 +2a02:26f7:b9a4:6100::/58 +2a02:26f7:b9a4:6140::/59 +2a02:26f7:b9a4:6160::/61 +2a02:26f7:b9a4:6168::/62 +2a02:26f7:b9a5:4000::/64 +2a02:26f7:b9a8::/52 +2a02:26f7:b9a8:1000::/57 +2a02:26f7:b9a8:4000::/64 +2a02:26f7:b9a8:6000::/61 +2a02:26f7:b9a8:6008::/62 +2a02:26f7:b9a8:600c::/63 +2a02:26f7:b9a8:600f::/64 +2a02:26f7:b9a8:6010::/63 +2a02:26f7:b9a8:6013::/64 +2a02:26f7:b9a8:6014::/62 +2a02:26f7:b9a8:6018::/61 +2a02:26f7:b9a8:6020::/59 +2a02:26f7:b9a8:6040::/58 +2a02:26f7:b9a8:6080::/59 +2a02:26f7:b9a8:60a0::/60 +2a02:26f7:b9a8:60b0::/62 +2a02:26f7:b9a8:60b4::/64 +2a02:26f7:b9a8:60b6::/63 +2a02:26f7:b9a8:60b8::/61 +2a02:26f7:b9a8:60c0::/58 +2a02:26f7:b9a8:6100::/58 +2a02:26f7:b9a8:6140::/59 +2a02:26f7:b9a8:6160::/61 +2a02:26f7:b9a8:6168::/62 +2a02:26f7:b9a9:4000::/64 +2a02:26f7:b9ac::/52 +2a02:26f7:b9ac:1000::/57 +2a02:26f7:b9ac:4000::/64 +2a02:26f7:b9ac:6000::/61 +2a02:26f7:b9ac:6008::/62 +2a02:26f7:b9ac:600c::/63 +2a02:26f7:b9ac:600f::/64 +2a02:26f7:b9ac:6010::/63 +2a02:26f7:b9ac:6013::/64 +2a02:26f7:b9ac:6014::/62 +2a02:26f7:b9ac:6018::/61 +2a02:26f7:b9ac:6020::/59 +2a02:26f7:b9ac:6040::/58 +2a02:26f7:b9ac:6080::/59 +2a02:26f7:b9ac:60a0::/60 +2a02:26f7:b9ac:60b0::/62 +2a02:26f7:b9ac:60b4::/64 +2a02:26f7:b9ac:60b6::/63 +2a02:26f7:b9ac:60b8::/61 +2a02:26f7:b9ac:60c0::/58 +2a02:26f7:b9ac:6100::/58 +2a02:26f7:b9ac:6140::/59 +2a02:26f7:b9ac:6160::/61 +2a02:26f7:b9ac:6168::/62 +2a02:26f7:b9ad:4000::/64 +2a02:26f7:b9b0::/52 +2a02:26f7:b9b0:1000::/57 +2a02:26f7:b9b0:4000::/64 +2a02:26f7:b9b0:6000::/61 +2a02:26f7:b9b0:6008::/62 +2a02:26f7:b9b0:600c::/63 +2a02:26f7:b9b0:600f::/64 +2a02:26f7:b9b0:6010::/63 +2a02:26f7:b9b0:6013::/64 +2a02:26f7:b9b0:6014::/62 +2a02:26f7:b9b0:6018::/61 +2a02:26f7:b9b0:6020::/59 +2a02:26f7:b9b0:6040::/58 +2a02:26f7:b9b0:6080::/59 +2a02:26f7:b9b0:60a0::/60 +2a02:26f7:b9b0:60b0::/62 +2a02:26f7:b9b0:60b4::/64 +2a02:26f7:b9b0:60b6::/63 +2a02:26f7:b9b0:60b8::/61 +2a02:26f7:b9b0:60c0::/58 +2a02:26f7:b9b0:6100::/58 +2a02:26f7:b9b0:6140::/59 +2a02:26f7:b9b0:6160::/61 +2a02:26f7:b9b0:6168::/62 +2a02:26f7:b9b1:4000::/64 +2a02:26f7:b9b4::/52 +2a02:26f7:b9b4:1000::/57 +2a02:26f7:b9b4:4000::/64 +2a02:26f7:b9b4:6000::/61 +2a02:26f7:b9b4:6008::/62 +2a02:26f7:b9b4:600c::/63 +2a02:26f7:b9b4:600f::/64 +2a02:26f7:b9b4:6010::/63 +2a02:26f7:b9b4:6013::/64 +2a02:26f7:b9b4:6014::/62 +2a02:26f7:b9b4:6018::/61 +2a02:26f7:b9b4:6020::/59 +2a02:26f7:b9b4:6040::/58 +2a02:26f7:b9b4:6080::/59 +2a02:26f7:b9b4:60a0::/60 +2a02:26f7:b9b4:60b0::/62 +2a02:26f7:b9b4:60b4::/64 +2a02:26f7:b9b4:60b6::/63 +2a02:26f7:b9b4:60b8::/61 +2a02:26f7:b9b4:60c0::/58 +2a02:26f7:b9b4:6100::/58 +2a02:26f7:b9b4:6140::/59 +2a02:26f7:b9b4:6160::/61 +2a02:26f7:b9b4:6168::/62 +2a02:26f7:b9b5:4000::/64 +2a02:26f7:b9c0::/54 +2a02:26f7:b9c0:400::/56 +2a02:26f7:b9c0:4000::/64 +2a02:26f7:b9c0:45c0::/63 +2a02:26f7:b9c0:45c2::/64 +2a02:26f7:b9c1:4000::/64 +2a02:26f7:b9c4::/54 +2a02:26f7:b9c4:400::/56 +2a02:26f7:b9c4:4000::/64 +2a02:26f7:b9c4:45c0::/63 +2a02:26f7:b9c4:45c2::/64 +2a02:26f7:b9c5::/54 +2a02:26f7:b9c5:400::/56 +2a02:26f7:b9c5:4000::/64 +2a02:26f7:b9c5:45c0::/63 +2a02:26f7:b9c5:45c2::/64 +2a02:26f7:b9c6:4000::/64 +2a02:26f7:b9c7:4000::/64 +2a02:26f7:b9c8::/54 +2a02:26f7:b9c8:400::/56 +2a02:26f7:b9c8:4000::/64 +2a02:26f7:b9c8:45c0::/63 +2a02:26f7:b9c8:45c2::/64 +2a02:26f7:b9c9:4000::/64 +2a02:26f7:b9d0::/54 +2a02:26f7:b9d0:400::/56 +2a02:26f7:b9d0:4000::/64 +2a02:26f7:b9d0:45c0::/63 +2a02:26f7:b9d0:45c2::/64 +2a02:26f7:b9d1:4000::/64 +2a02:26f7:b9d4::/54 +2a02:26f7:b9d4:400::/56 +2a02:26f7:b9d4:4000::/64 +2a02:26f7:b9d4:45c0::/63 +2a02:26f7:b9d4:45c2::/64 +2a02:26f7:b9d5:4000::/64 +2a02:26f7:ba00:4000::/64 +2a02:26f7:ba01:4000::/64 +2a02:26f7:ba04:4000::/64 +2a02:26f7:ba05:4000::/64 +2a02:26f7:ba08:4000::/64 +2a02:26f7:ba09:4000::/64 +2a02:26f7:ba40:4000::/64 +2a02:26f7:ba40:cb40::/63 +2a02:26f7:ba41:4000::/64 +2a02:26f7:ba44:4000::/64 +2a02:26f7:ba44:cb40::/63 +2a02:26f7:ba45:4000::/64 +2a02:26f7:ba48:4000::/64 +2a02:26f7:ba48:cb40::/63 +2a02:26f7:ba49:4000::/64 +2a02:26f7:ba80:4000::/64 +2a02:26f7:ba80:c5c0::/64 +2a02:26f7:ba81:4000::/64 +2a02:26f7:ba84:4000::/64 +2a02:26f7:ba84:c5c0::/64 +2a02:26f7:ba85:4000::/64 +2a02:26f7:ba85:c5c0::/64 +2a02:26f7:ba86:4000::/64 +2a02:26f7:ba87:4000::/64 +2a02:26f7:ba88:4000::/64 +2a02:26f7:ba88:c5c0::/64 +2a02:26f7:ba89:4000::/64 +2a02:26f7:bac0::/54 +2a02:26f7:bac0:400::/55 +2a02:26f7:bac0:600::/59 +2a02:26f7:bac0:620::/60 +2a02:26f7:bac0:4000::/64 +2a02:26f7:bac0:6200::/58 +2a02:26f7:bac0:6240::/61 +2a02:26f7:bac0:6248::/63 +2a02:26f7:bac1:4000::/64 +2a02:26f7:bac2::/54 +2a02:26f7:bac2:400::/55 +2a02:26f7:bac2:600::/59 +2a02:26f7:bac2:620::/60 +2a02:26f7:bac2:4000::/64 +2a02:26f7:bac2:6200::/58 +2a02:26f7:bac2:6240::/61 +2a02:26f7:bac2:6248::/63 +2a02:26f7:bac3:4000::/64 +2a02:26f7:bac4::/54 +2a02:26f7:bac4:400::/55 +2a02:26f7:bac4:600::/59 +2a02:26f7:bac4:620::/60 +2a02:26f7:bac4:4000::/64 +2a02:26f7:bac4:6200::/58 +2a02:26f7:bac4:6240::/61 +2a02:26f7:bac4:6248::/63 +2a02:26f7:bac6:4000::/64 +2a02:26f7:bac8::/54 +2a02:26f7:bac8:400::/55 +2a02:26f7:bac8:600::/59 +2a02:26f7:bac8:620::/60 +2a02:26f7:bac8:4000::/64 +2a02:26f7:bac8:6200::/58 +2a02:26f7:bac8:6240::/61 +2a02:26f7:bac8:6248::/63 +2a02:26f7:bac9::/54 +2a02:26f7:bac9:400::/55 +2a02:26f7:bac9:600::/59 +2a02:26f7:bac9:620::/60 +2a02:26f7:bac9:4000::/64 +2a02:26f7:bac9:6200::/58 +2a02:26f7:bac9:6240::/61 +2a02:26f7:bac9:6248::/63 +2a02:26f7:baca:4000::/64 +2a02:26f7:bacb:4000::/64 +2a02:26f7:bacc::/54 +2a02:26f7:bacc:400::/55 +2a02:26f7:bacc:600::/59 +2a02:26f7:bacc:620::/60 +2a02:26f7:bacc:4000::/64 +2a02:26f7:bacc:6200::/58 +2a02:26f7:bacc:6240::/61 +2a02:26f7:bacc:6248::/63 +2a02:26f7:bacd:4000::/64 +2a02:26f7:bb00:4000::/64 +2a02:26f7:bb00:4240::/62 +2a02:26f7:bb00:4244::/64 +2a02:26f7:bb01:4000::/64 +2a02:26f7:bb02:4000::/64 +2a02:26f7:bb02:4240::/62 +2a02:26f7:bb02:4244::/64 +2a02:26f7:bb03:4000::/64 +2a02:26f7:bb04:4000::/64 +2a02:26f7:bb04:4240::/62 +2a02:26f7:bb04:4244::/64 +2a02:26f7:bb06:4000::/64 +2a02:26f7:bb08:4000::/64 +2a02:26f7:bb08:4240::/62 +2a02:26f7:bb08:4244::/64 +2a02:26f7:bb09:4000::/64 +2a02:26f7:bb40::/54 +2a02:26f7:bb40:400::/55 +2a02:26f7:bb40:600::/60 +2a02:26f7:bb40:4000::/64 +2a02:26f7:bb40:5600::/58 +2a02:26f7:bb40:5640::/61 +2a02:26f7:bb40:5648::/62 +2a02:26f7:bb40:564c::/63 +2a02:26f7:bb41:4000::/64 +2a02:26f7:bb42::/54 +2a02:26f7:bb42:400::/55 +2a02:26f7:bb42:600::/60 +2a02:26f7:bb42:4000::/64 +2a02:26f7:bb42:5600::/58 +2a02:26f7:bb42:5640::/61 +2a02:26f7:bb42:5648::/62 +2a02:26f7:bb42:564c::/63 +2a02:26f7:bb43:4000::/64 +2a02:26f7:bb44::/54 +2a02:26f7:bb44:400::/55 +2a02:26f7:bb44:600::/60 +2a02:26f7:bb44:4000::/64 +2a02:26f7:bb44:5600::/58 +2a02:26f7:bb44:5640::/61 +2a02:26f7:bb44:5648::/62 +2a02:26f7:bb44:564c::/63 +2a02:26f7:bb46:4000::/64 +2a02:26f7:bb48::/54 +2a02:26f7:bb48:400::/55 +2a02:26f7:bb48:600::/60 +2a02:26f7:bb48:4000::/64 +2a02:26f7:bb48:5600::/58 +2a02:26f7:bb48:5640::/61 +2a02:26f7:bb48:5648::/62 +2a02:26f7:bb48:564c::/63 +2a02:26f7:bb49:4000::/64 +2a02:26f7:bb80::/53 +2a02:26f7:bb80:800::/54 +2a02:26f7:bb80:c00::/56 +2a02:26f7:bb80:d00::/58 +2a02:26f7:bb80:d40::/60 +2a02:26f7:bb80:4000::/64 +2a02:26f7:bb80:6a00::/59 +2a02:26f7:bb80:6a20::/60 +2a02:26f7:bb80:6a30::/63 +2a02:26f7:bb80:6a33::/64 +2a02:26f7:bb80:6a34::/62 +2a02:26f7:bb80:6a38::/61 +2a02:26f7:bb80:6a40::/58 +2a02:26f7:bb80:6a80::/57 +2a02:26f7:bb80:6b00::/59 +2a02:26f7:bb80:6b20::/60 +2a02:26f7:bb80:6b30::/61 +2a02:26f7:bb80:6b38::/63 +2a02:26f7:bb81::/53 +2a02:26f7:bb81:800::/54 +2a02:26f7:bb81:c00::/56 +2a02:26f7:bb81:d00::/58 +2a02:26f7:bb81:d40::/60 +2a02:26f7:bb81:4000::/64 +2a02:26f7:bb81:6a00::/59 +2a02:26f7:bb81:6a20::/60 +2a02:26f7:bb81:6a30::/63 +2a02:26f7:bb81:6a33::/64 +2a02:26f7:bb81:6a34::/62 +2a02:26f7:bb81:6a38::/61 +2a02:26f7:bb81:6a40::/58 +2a02:26f7:bb81:6a80::/57 +2a02:26f7:bb81:6b00::/59 +2a02:26f7:bb81:6b20::/60 +2a02:26f7:bb81:6b30::/61 +2a02:26f7:bb81:6b38::/63 +2a02:26f7:bb82:4000::/64 +2a02:26f7:bb83:4000::/64 +2a02:26f7:bb84::/53 +2a02:26f7:bb84:800::/54 +2a02:26f7:bb84:c00::/56 +2a02:26f7:bb84:d00::/58 +2a02:26f7:bb84:d40::/60 +2a02:26f7:bb84:4000::/64 +2a02:26f7:bb84:6a00::/59 +2a02:26f7:bb84:6a20::/60 +2a02:26f7:bb84:6a30::/63 +2a02:26f7:bb84:6a33::/64 +2a02:26f7:bb84:6a34::/62 +2a02:26f7:bb84:6a38::/61 +2a02:26f7:bb84:6a40::/58 +2a02:26f7:bb84:6a80::/57 +2a02:26f7:bb84:6b00::/59 +2a02:26f7:bb84:6b20::/60 +2a02:26f7:bb84:6b30::/61 +2a02:26f7:bb84:6b38::/63 +2a02:26f7:bb87:4000::/64 +2a02:26f7:bb88::/53 +2a02:26f7:bb88:800::/54 +2a02:26f7:bb88:c00::/56 +2a02:26f7:bb88:d00::/58 +2a02:26f7:bb88:d40::/60 +2a02:26f7:bb88:4000::/64 +2a02:26f7:bb88:6a00::/59 +2a02:26f7:bb88:6a20::/60 +2a02:26f7:bb88:6a30::/63 +2a02:26f7:bb88:6a33::/64 +2a02:26f7:bb88:6a34::/62 +2a02:26f7:bb88:6a38::/61 +2a02:26f7:bb88:6a40::/58 +2a02:26f7:bb88:6a80::/57 +2a02:26f7:bb88:6b00::/59 +2a02:26f7:bb88:6b20::/60 +2a02:26f7:bb88:6b30::/61 +2a02:26f7:bb88:6b38::/63 +2a02:26f7:bb89:4000::/64 +2a02:26f7:bb8c::/53 +2a02:26f7:bb8c:800::/54 +2a02:26f7:bb8c:c00::/56 +2a02:26f7:bb8c:d00::/58 +2a02:26f7:bb8c:d40::/60 +2a02:26f7:bb8c:4000::/64 +2a02:26f7:bb8c:6a00::/59 +2a02:26f7:bb8c:6a20::/60 +2a02:26f7:bb8c:6a30::/63 +2a02:26f7:bb8c:6a33::/64 +2a02:26f7:bb8c:6a34::/62 +2a02:26f7:bb8c:6a38::/61 +2a02:26f7:bb8c:6a40::/58 +2a02:26f7:bb8c:6a80::/57 +2a02:26f7:bb8c:6b00::/59 +2a02:26f7:bb8c:6b20::/60 +2a02:26f7:bb8c:6b30::/61 +2a02:26f7:bb8c:6b38::/63 +2a02:26f7:bb8d::/53 +2a02:26f7:bb8d:800::/54 +2a02:26f7:bb8d:c00::/56 +2a02:26f7:bb8d:d00::/58 +2a02:26f7:bb8d:d40::/60 +2a02:26f7:bb8d:4000::/64 +2a02:26f7:bb8d:6a00::/59 +2a02:26f7:bb8d:6a20::/60 +2a02:26f7:bb8d:6a30::/63 +2a02:26f7:bb8d:6a33::/64 +2a02:26f7:bb8d:6a34::/62 +2a02:26f7:bb8d:6a38::/61 +2a02:26f7:bb8d:6a40::/58 +2a02:26f7:bb8d:6a80::/57 +2a02:26f7:bb8d:6b00::/59 +2a02:26f7:bb8d:6b20::/60 +2a02:26f7:bb8d:6b30::/61 +2a02:26f7:bb8d:6b38::/63 +2a02:26f7:bb8e:4000::/64 +2a02:26f7:bb8f:4000::/64 +2a02:26f7:bbc0::/54 +2a02:26f7:bbc0:400::/58 +2a02:26f7:bbc0:4000::/64 +2a02:26f7:bbc0:4200::/59 +2a02:26f7:bbc0:4220::/61 +2a02:26f7:bbc0:4228::/62 +2a02:26f7:bbc0:422c::/64 +2a02:26f7:bbc1:4000::/64 +2a02:26f7:bbc2::/54 +2a02:26f7:bbc2:400::/58 +2a02:26f7:bbc2:4000::/64 +2a02:26f7:bbc2:4200::/59 +2a02:26f7:bbc2:4220::/61 +2a02:26f7:bbc2:4228::/62 +2a02:26f7:bbc2:422c::/64 +2a02:26f7:bbc3:4000::/64 +2a02:26f7:bbc4::/54 +2a02:26f7:bbc4:400::/58 +2a02:26f7:bbc4:4000::/64 +2a02:26f7:bbc4:4200::/59 +2a02:26f7:bbc4:4220::/61 +2a02:26f7:bbc4:4228::/62 +2a02:26f7:bbc4:422c::/64 +2a02:26f7:bbc6:4000::/64 +2a02:26f7:bbc8::/54 +2a02:26f7:bbc8:400::/58 +2a02:26f7:bbc8:4000::/64 +2a02:26f7:bbc8:4200::/59 +2a02:26f7:bbc8:4220::/61 +2a02:26f7:bbc8:4228::/62 +2a02:26f7:bbc8:422c::/64 +2a02:26f7:bbc9:4000::/64 +2a02:26f7:bc00::/54 +2a02:26f7:bc00:400::/58 +2a02:26f7:bc00:440::/59 +2a02:26f7:bc00:4000::/64 +2a02:26f7:bc00:50c0::/59 +2a02:26f7:bc00:50e0::/63 +2a02:26f7:bc01:4000::/64 +2a02:26f7:bc02::/54 +2a02:26f7:bc02:400::/58 +2a02:26f7:bc02:440::/59 +2a02:26f7:bc02:4000::/64 +2a02:26f7:bc02:50c0::/59 +2a02:26f7:bc02:50e0::/63 +2a02:26f7:bc03:4000::/64 +2a02:26f7:bc04::/54 +2a02:26f7:bc04:400::/58 +2a02:26f7:bc04:440::/59 +2a02:26f7:bc04:4000::/64 +2a02:26f7:bc04:50c0::/59 +2a02:26f7:bc04:50e0::/63 +2a02:26f7:bc06:4000::/64 +2a02:26f7:bc08::/54 +2a02:26f7:bc08:400::/58 +2a02:26f7:bc08:440::/59 +2a02:26f7:bc08:4000::/64 +2a02:26f7:bc08:50c0::/59 +2a02:26f7:bc08:50e0::/63 +2a02:26f7:bc09:4000::/64 +2a02:26f7:bc40:4000::/64 +2a02:26f7:bc40:c780::/64 +2a02:26f7:bc41:4000::/64 +2a02:26f7:bc44:4000::/64 +2a02:26f7:bc44:c780::/64 +2a02:26f7:bc45:4000::/64 +2a02:26f7:bc48:4000::/64 +2a02:26f7:bc48:c780::/64 +2a02:26f7:bc49:4000::/64 +2a02:26f7:bc80:4000::/64 +2a02:26f7:bc80:cb80::/63 +2a02:26f7:bc81:4000::/64 +2a02:26f7:bc82:4000::/64 +2a02:26f7:bc82:cb80::/63 +2a02:26f7:bc83:4000::/64 +2a02:26f7:bc84:4000::/64 +2a02:26f7:bc84:cb80::/63 +2a02:26f7:bc85:4000::/64 +2a02:26f7:bc88:4000::/64 +2a02:26f7:bc88:cb80::/63 +2a02:26f7:bc89:4000::/64 +2a02:26f7:bcc0::/53 +2a02:26f7:bcc0:800::/56 +2a02:26f7:bcc0:900::/57 +2a02:26f7:bcc0:4000::/64 +2a02:26f7:bcc0:5e00::/58 +2a02:26f7:bcc0:5e40::/59 +2a02:26f7:bcc0:5e60::/60 +2a02:26f7:bcc0:5e70::/62 +2a02:26f7:bcc0:5e74::/63 +2a02:26f7:bcc0:5e77::/64 +2a02:26f7:bcc0:5e78::/61 +2a02:26f7:bcc0:5e80::/58 +2a02:26f7:bcc0:5ec0::/60 +2a02:26f7:bcc0:5ed0::/61 +2a02:26f7:bcc0:5ed8::/63 +2a02:26f7:bcc0:5edb::/64 +2a02:26f7:bcc0:5edc::/62 +2a02:26f7:bcc0:5ee0::/59 +2a02:26f7:bcc0:5f00::/59 +2a02:26f7:bcc0:5f20::/64 +2a02:26f7:bcc0:5f22::/63 +2a02:26f7:bcc0:5f24::/62 +2a02:26f7:bcc0:5f28::/61 +2a02:26f7:bcc0:5f30::/60 +2a02:26f7:bcc0:5f40::/63 +2a02:26f7:bcc0:5f42::/64 +2a02:26f7:bcc0:5f44::/62 +2a02:26f7:bcc0:5f48::/61 +2a02:26f7:bcc0:5f50::/60 +2a02:26f7:bcc0:5f60::/59 +2a02:26f7:bcc0:5f80::/63 +2a02:26f7:bcc0:5f82::/64 +2a02:26f7:bcc0:5f84::/62 +2a02:26f7:bcc0:5f88::/61 +2a02:26f7:bcc0:5f90::/61 +2a02:26f7:bcc0:5f99::/64 +2a02:26f7:bcc0:5f9a::/63 +2a02:26f7:bcc0:5f9c::/62 +2a02:26f7:bcc0:5fa0::/62 +2a02:26f7:bcc0:5fa4::/63 +2a02:26f7:bcc1:4000::/64 +2a02:26f7:bcc4::/53 +2a02:26f7:bcc4:800::/56 +2a02:26f7:bcc4:900::/57 +2a02:26f7:bcc4:4000::/64 +2a02:26f7:bcc4:5e00::/58 +2a02:26f7:bcc4:5e40::/59 +2a02:26f7:bcc4:5e60::/60 +2a02:26f7:bcc4:5e70::/62 +2a02:26f7:bcc4:5e74::/63 +2a02:26f7:bcc4:5e77::/64 +2a02:26f7:bcc4:5e78::/61 +2a02:26f7:bcc4:5e80::/58 +2a02:26f7:bcc4:5ec0::/60 +2a02:26f7:bcc4:5ed0::/61 +2a02:26f7:bcc4:5ed8::/63 +2a02:26f7:bcc4:5edb::/64 +2a02:26f7:bcc4:5edc::/62 +2a02:26f7:bcc4:5ee0::/59 +2a02:26f7:bcc4:5f00::/59 +2a02:26f7:bcc4:5f20::/64 +2a02:26f7:bcc4:5f22::/63 +2a02:26f7:bcc4:5f24::/62 +2a02:26f7:bcc4:5f28::/61 +2a02:26f7:bcc4:5f30::/60 +2a02:26f7:bcc4:5f40::/63 +2a02:26f7:bcc4:5f42::/64 +2a02:26f7:bcc4:5f44::/62 +2a02:26f7:bcc4:5f48::/61 +2a02:26f7:bcc4:5f50::/60 +2a02:26f7:bcc4:5f60::/59 +2a02:26f7:bcc4:5f80::/63 +2a02:26f7:bcc4:5f82::/64 +2a02:26f7:bcc4:5f84::/62 +2a02:26f7:bcc4:5f88::/61 +2a02:26f7:bcc4:5f90::/61 +2a02:26f7:bcc4:5f99::/64 +2a02:26f7:bcc4:5f9a::/63 +2a02:26f7:bcc4:5f9c::/62 +2a02:26f7:bcc4:5fa0::/62 +2a02:26f7:bcc4:5fa4::/63 +2a02:26f7:bcc5:4000::/64 +2a02:26f7:bcc8::/53 +2a02:26f7:bcc8:800::/56 +2a02:26f7:bcc8:900::/57 +2a02:26f7:bcc8:4000::/64 +2a02:26f7:bcc8:5e00::/58 +2a02:26f7:bcc8:5e40::/59 +2a02:26f7:bcc8:5e60::/60 +2a02:26f7:bcc8:5e70::/62 +2a02:26f7:bcc8:5e74::/63 +2a02:26f7:bcc8:5e77::/64 +2a02:26f7:bcc8:5e78::/61 +2a02:26f7:bcc8:5e80::/58 +2a02:26f7:bcc8:5ec0::/60 +2a02:26f7:bcc8:5ed0::/61 +2a02:26f7:bcc8:5ed8::/63 +2a02:26f7:bcc8:5edb::/64 +2a02:26f7:bcc8:5edc::/62 +2a02:26f7:bcc8:5ee0::/59 +2a02:26f7:bcc8:5f00::/59 +2a02:26f7:bcc8:5f20::/64 +2a02:26f7:bcc8:5f22::/63 +2a02:26f7:bcc8:5f24::/62 +2a02:26f7:bcc8:5f28::/61 +2a02:26f7:bcc8:5f30::/60 +2a02:26f7:bcc8:5f40::/63 +2a02:26f7:bcc8:5f42::/64 +2a02:26f7:bcc8:5f44::/62 +2a02:26f7:bcc8:5f48::/61 +2a02:26f7:bcc8:5f50::/60 +2a02:26f7:bcc8:5f60::/59 +2a02:26f7:bcc8:5f80::/63 +2a02:26f7:bcc8:5f82::/64 +2a02:26f7:bcc8:5f84::/62 +2a02:26f7:bcc8:5f88::/61 +2a02:26f7:bcc8:5f90::/61 +2a02:26f7:bcc8:5f99::/64 +2a02:26f7:bcc8:5f9a::/63 +2a02:26f7:bcc8:5f9c::/62 +2a02:26f7:bcc8:5fa0::/62 +2a02:26f7:bcc8:5fa4::/63 +2a02:26f7:bcc9:4000::/64 +2a02:26f7:bccc::/53 +2a02:26f7:bccc:800::/56 +2a02:26f7:bccc:900::/57 +2a02:26f7:bccc:4000::/64 +2a02:26f7:bccc:5e00::/58 +2a02:26f7:bccc:5e40::/59 +2a02:26f7:bccc:5e60::/60 +2a02:26f7:bccc:5e70::/62 +2a02:26f7:bccc:5e74::/63 +2a02:26f7:bccc:5e77::/64 +2a02:26f7:bccc:5e78::/61 +2a02:26f7:bccc:5e80::/58 +2a02:26f7:bccc:5ec0::/60 +2a02:26f7:bccc:5ed0::/61 +2a02:26f7:bccc:5ed8::/63 +2a02:26f7:bccc:5edb::/64 +2a02:26f7:bccc:5edc::/62 +2a02:26f7:bccc:5ee0::/59 +2a02:26f7:bccc:5f00::/59 +2a02:26f7:bccc:5f20::/64 +2a02:26f7:bccc:5f22::/63 +2a02:26f7:bccc:5f24::/62 +2a02:26f7:bccc:5f28::/61 +2a02:26f7:bccc:5f30::/60 +2a02:26f7:bccc:5f40::/63 +2a02:26f7:bccc:5f42::/64 +2a02:26f7:bccc:5f44::/62 +2a02:26f7:bccc:5f48::/61 +2a02:26f7:bccc:5f50::/60 +2a02:26f7:bccc:5f60::/59 +2a02:26f7:bccc:5f80::/63 +2a02:26f7:bccc:5f82::/64 +2a02:26f7:bccc:5f84::/62 +2a02:26f7:bccc:5f88::/61 +2a02:26f7:bccc:5f90::/61 +2a02:26f7:bccc:5f99::/64 +2a02:26f7:bccc:5f9a::/63 +2a02:26f7:bccc:5f9c::/62 +2a02:26f7:bccc:5fa0::/62 +2a02:26f7:bccc:5fa4::/63 +2a02:26f7:bccd:4000::/64 +2a02:26f7:bcd0::/53 +2a02:26f7:bcd0:800::/56 +2a02:26f7:bcd0:900::/57 +2a02:26f7:bcd0:4000::/64 +2a02:26f7:bcd0:5e00::/58 +2a02:26f7:bcd0:5e40::/59 +2a02:26f7:bcd0:5e60::/60 +2a02:26f7:bcd0:5e70::/62 +2a02:26f7:bcd0:5e74::/63 +2a02:26f7:bcd0:5e77::/64 +2a02:26f7:bcd0:5e78::/61 +2a02:26f7:bcd0:5e80::/58 +2a02:26f7:bcd0:5ec0::/60 +2a02:26f7:bcd0:5ed0::/61 +2a02:26f7:bcd0:5ed8::/63 +2a02:26f7:bcd0:5edb::/64 +2a02:26f7:bcd0:5edc::/62 +2a02:26f7:bcd0:5ee0::/59 +2a02:26f7:bcd0:5f00::/59 +2a02:26f7:bcd0:5f20::/64 +2a02:26f7:bcd0:5f22::/63 +2a02:26f7:bcd0:5f24::/62 +2a02:26f7:bcd0:5f28::/61 +2a02:26f7:bcd0:5f30::/60 +2a02:26f7:bcd0:5f40::/63 +2a02:26f7:bcd0:5f42::/64 +2a02:26f7:bcd0:5f44::/62 +2a02:26f7:bcd0:5f48::/61 +2a02:26f7:bcd0:5f50::/60 +2a02:26f7:bcd0:5f60::/59 +2a02:26f7:bcd0:5f80::/63 +2a02:26f7:bcd0:5f82::/64 +2a02:26f7:bcd0:5f84::/62 +2a02:26f7:bcd0:5f88::/61 +2a02:26f7:bcd0:5f90::/61 +2a02:26f7:bcd0:5f99::/64 +2a02:26f7:bcd0:5f9a::/63 +2a02:26f7:bcd0:5f9c::/62 +2a02:26f7:bcd0:5fa0::/62 +2a02:26f7:bcd0:5fa4::/63 +2a02:26f7:bcd1::/53 +2a02:26f7:bcd1:800::/56 +2a02:26f7:bcd1:900::/57 +2a02:26f7:bcd1:4000::/64 +2a02:26f7:bcd1:5e00::/58 +2a02:26f7:bcd1:5e40::/59 +2a02:26f7:bcd1:5e60::/60 +2a02:26f7:bcd1:5e70::/62 +2a02:26f7:bcd1:5e74::/63 +2a02:26f7:bcd1:5e77::/64 +2a02:26f7:bcd1:5e78::/61 +2a02:26f7:bcd1:5e80::/58 +2a02:26f7:bcd1:5ec0::/60 +2a02:26f7:bcd1:5ed0::/61 +2a02:26f7:bcd1:5ed8::/63 +2a02:26f7:bcd1:5edb::/64 +2a02:26f7:bcd1:5edc::/62 +2a02:26f7:bcd1:5ee0::/59 +2a02:26f7:bcd1:5f00::/59 +2a02:26f7:bcd1:5f20::/64 +2a02:26f7:bcd1:5f22::/63 +2a02:26f7:bcd1:5f24::/62 +2a02:26f7:bcd1:5f28::/61 +2a02:26f7:bcd1:5f30::/60 +2a02:26f7:bcd1:5f40::/63 +2a02:26f7:bcd1:5f42::/64 +2a02:26f7:bcd1:5f44::/62 +2a02:26f7:bcd1:5f48::/61 +2a02:26f7:bcd1:5f50::/60 +2a02:26f7:bcd1:5f60::/59 +2a02:26f7:bcd1:5f80::/63 +2a02:26f7:bcd1:5f82::/64 +2a02:26f7:bcd1:5f84::/62 +2a02:26f7:bcd1:5f88::/61 +2a02:26f7:bcd1:5f90::/61 +2a02:26f7:bcd1:5f99::/64 +2a02:26f7:bcd1:5f9a::/63 +2a02:26f7:bcd1:5f9c::/62 +2a02:26f7:bcd1:5fa0::/62 +2a02:26f7:bcd1:5fa4::/63 +2a02:26f7:bcd2:4000::/64 +2a02:26f7:bcd3:4000::/64 +2a02:26f7:bd00:4000::/64 +2a02:26f7:bd00:4c80::/61 +2a02:26f7:bd00:4c88::/62 +2a02:26f7:bd00:4c8c::/63 +2a02:26f7:bd01:4000::/64 +2a02:26f7:bd04:4000::/64 +2a02:26f7:bd04:4c80::/61 +2a02:26f7:bd04:4c88::/62 +2a02:26f7:bd04:4c8c::/63 +2a02:26f7:bd05:4000::/64 +2a02:26f7:bd08:4000::/64 +2a02:26f7:bd08:4c80::/61 +2a02:26f7:bd08:4c88::/62 +2a02:26f7:bd08:4c8c::/63 +2a02:26f7:bd09:4000::/64 +2a02:26f7:bd0c:4000::/64 +2a02:26f7:bd0c:4c80::/61 +2a02:26f7:bd0c:4c88::/62 +2a02:26f7:bd0c:4c8c::/63 +2a02:26f7:bd0d:4000::/64 +2a02:26f7:bd10:4000::/64 +2a02:26f7:bd10:4c80::/61 +2a02:26f7:bd10:4c88::/62 +2a02:26f7:bd10:4c8c::/63 +2a02:26f7:bd11:4000::/64 +2a02:26f7:bd14:4000::/64 +2a02:26f7:bd14:4c80::/61 +2a02:26f7:bd14:4c88::/62 +2a02:26f7:bd14:4c8c::/63 +2a02:26f7:bd15:4000::/64 +2a02:26f7:bd40:4000::/64 +2a02:26f7:bd40:4a00::/62 +2a02:26f7:bd41:4000::/64 +2a02:26f7:bd44:4000::/64 +2a02:26f7:bd44:4a00::/62 +2a02:26f7:bd45:4000::/64 +2a02:26f7:bd48:4000::/64 +2a02:26f7:bd48:4a00::/62 +2a02:26f7:bd49:4000::/64 +2a02:26f7:bd4c:4000::/64 +2a02:26f7:bd4c:4a00::/62 +2a02:26f7:bd4d:4000::/64 +2a02:26f7:bd50:4000::/64 +2a02:26f7:bd50:4a00::/62 +2a02:26f7:bd51:4000::/64 +2a02:26f7:bd80:4000::/64 +2a02:26f7:bd80:c4e0::/64 +2a02:26f7:bd81:4000::/64 +2a02:26f7:bd84:4000::/64 +2a02:26f7:bd84:c4e0::/64 +2a02:26f7:bd85:4000::/64 +2a02:26f7:bd88:4000::/64 +2a02:26f7:bd88:c4e0::/64 +2a02:26f7:bd89:4000::/64 +2a02:26f7:bd8c:4000::/64 +2a02:26f7:bd8c:c4e0::/64 +2a02:26f7:bd8d:4000::/64 +2a02:26f7:bd90:4000::/64 +2a02:26f7:bd90:c4e0::/64 +2a02:26f7:bd91:4000::/64 +2a02:26f7:bdc0:4000::/64 +2a02:26f7:bdc0:4800::/62 +2a02:26f7:bdc0:4804::/64 +2a02:26f7:bdc1:4000::/64 +2a02:26f7:bdc2:4000::/64 +2a02:26f7:bdc2:4800::/62 +2a02:26f7:bdc2:4804::/64 +2a02:26f7:bdc3:4000::/64 +2a02:26f7:bdc4:4000::/64 +2a02:26f7:bdc4:4800::/62 +2a02:26f7:bdc4:4804::/64 +2a02:26f7:bdc5:4000::/64 +2a02:26f7:bdc6:4000::/64 +2a02:26f7:bdc6:4800::/62 +2a02:26f7:bdc6:4804::/64 +2a02:26f7:bdc7:4000::/64 +2a02:26f7:bdc8:4000::/64 +2a02:26f7:bdc8:4800::/62 +2a02:26f7:bdc8:4804::/64 +2a02:26f7:bdc9:4000::/64 +2a02:26f7:bdca:4000::/64 +2a02:26f7:bdcc:4000::/64 +2a02:26f7:bdcc:4800::/62 +2a02:26f7:bdcc:4804::/64 +2a02:26f7:bdcd:4000::/64 +2a02:26f7:bdd0:4000::/64 +2a02:26f7:bdd0:4800::/62 +2a02:26f7:bdd0:4804::/64 +2a02:26f7:bdd4:4000::/64 +2a02:26f7:bdd4:4800::/62 +2a02:26f7:bdd4:4804::/64 +2a02:26f7:bdd5:4000::/64 +2a02:26f7:be00:4000::/64 +2a02:26f7:be00:d540::/59 +2a02:26f7:be01:4000::/64 +2a02:26f7:be04:4000::/64 +2a02:26f7:be04:d540::/59 +2a02:26f7:be05:4000::/64 +2a02:26f7:be08:4000::/64 +2a02:26f7:be08:d540::/59 +2a02:26f7:be09:4000::/64 +2a02:26f7:be0c:4000::/64 +2a02:26f7:be0c:d540::/59 +2a02:26f7:be0d:4000::/64 +2a02:26f7:be10:4000::/64 +2a02:26f7:be10:d540::/59 +2a02:26f7:be11:4000::/64 +2a02:26f7:be40:4000::/64 +2a02:26f7:be40:4540::/60 +2a02:26f7:be40:4550::/62 +2a02:26f7:be40:4554::/64 +2a02:26f7:be41:4000::/64 +2a02:26f7:be44:4000::/64 +2a02:26f7:be44:4540::/60 +2a02:26f7:be44:4550::/62 +2a02:26f7:be44:4554::/64 +2a02:26f7:be45:4000::/64 +2a02:26f7:be48:4000::/64 +2a02:26f7:be48:4540::/60 +2a02:26f7:be48:4550::/62 +2a02:26f7:be48:4554::/64 +2a02:26f7:be49:4000::/64 +2a02:26f7:be4c:4000::/64 +2a02:26f7:be4c:4540::/60 +2a02:26f7:be4c:4550::/62 +2a02:26f7:be4c:4554::/64 +2a02:26f7:be4d:4000::/64 +2a02:26f7:be50:4000::/64 +2a02:26f7:be50:4540::/60 +2a02:26f7:be50:4550::/62 +2a02:26f7:be50:4554::/64 +2a02:26f7:be51:4000::/64 +2a02:26f7:be80:4000::/64 +2a02:26f7:be80:43c0::/60 +2a02:26f7:be80:43d0::/61 +2a02:26f7:be80:43d8::/62 +2a02:26f7:be81:4000::/64 +2a02:26f7:be84:4000::/64 +2a02:26f7:be84:43c0::/60 +2a02:26f7:be84:43d0::/61 +2a02:26f7:be84:43d8::/62 +2a02:26f7:be85:4000::/64 +2a02:26f7:be88:4000::/64 +2a02:26f7:be88:43c0::/60 +2a02:26f7:be88:43d0::/61 +2a02:26f7:be88:43d8::/62 +2a02:26f7:be89:4000::/64 +2a02:26f7:be8c:4000::/64 +2a02:26f7:be8c:43c0::/60 +2a02:26f7:be8c:43d0::/61 +2a02:26f7:be8c:43d8::/62 +2a02:26f7:be8d:4000::/64 +2a02:26f7:be90:4000::/64 +2a02:26f7:be90:43c0::/60 +2a02:26f7:be90:43d0::/61 +2a02:26f7:be90:43d8::/62 +2a02:26f7:be91:4000::/64 +2a02:26f7:bec0:4000::/64 +2a02:26f7:bec0:42c0::/61 +2a02:26f7:bec0:42c8::/62 +2a02:26f7:bec0:42cc::/63 +2a02:26f7:bec0:42ce::/64 +2a02:26f7:bec1:4000::/64 +2a02:26f7:bec2:4000::/64 +2a02:26f7:bec2:42c0::/61 +2a02:26f7:bec2:42c8::/62 +2a02:26f7:bec2:42cc::/63 +2a02:26f7:bec2:42ce::/64 +2a02:26f7:bec3:4000::/64 +2a02:26f7:bec4:4000::/64 +2a02:26f7:bec4:42c0::/61 +2a02:26f7:bec4:42c8::/62 +2a02:26f7:bec4:42cc::/63 +2a02:26f7:bec4:42ce::/64 +2a02:26f7:bec5:4000::/64 +2a02:26f7:bec8:4000::/64 +2a02:26f7:bec8:42c0::/61 +2a02:26f7:bec8:42c8::/62 +2a02:26f7:bec8:42cc::/63 +2a02:26f7:bec8:42ce::/64 +2a02:26f7:bec9:4000::/64 +2a02:26f7:becc:4000::/64 +2a02:26f7:becc:42c0::/61 +2a02:26f7:becc:42c8::/62 +2a02:26f7:becc:42cc::/63 +2a02:26f7:becc:42ce::/64 +2a02:26f7:becd:4000::/64 +2a02:26f7:bed0:4000::/64 +2a02:26f7:bed0:42c0::/61 +2a02:26f7:bed0:42c8::/62 +2a02:26f7:bed0:42cc::/63 +2a02:26f7:bed0:42ce::/64 +2a02:26f7:bed1:4000::/64 +2a02:26f7:bf00:4000::/64 +2a02:26f7:bf00:c0a0::/64 +2a02:26f7:bf01:4000::/64 +2a02:26f7:bf02:4000::/64 +2a02:26f7:bf02:c0a0::/64 +2a02:26f7:bf03:4000::/64 +2a02:26f7:bf04:4000::/64 +2a02:26f7:bf04:c0a0::/64 +2a02:26f7:bf05:4000::/64 +2a02:26f7:bf08:4000::/64 +2a02:26f7:bf08:c0a0::/64 +2a02:26f7:bf09:4000::/64 +2a02:26f7:bf0c:4000::/64 +2a02:26f7:bf0c:c0a0::/64 +2a02:26f7:bf0d:4000::/64 +2a02:26f7:bf40:4000::/64 +2a02:26f7:bf40:4980::/62 +2a02:26f7:bf41:4000::/64 +2a02:26f7:bf42:4000::/64 +2a02:26f7:bf42:4980::/62 +2a02:26f7:bf43:4000::/64 +2a02:26f7:bf44:4000::/64 +2a02:26f7:bf44:4980::/62 +2a02:26f7:bf45:4000::/64 +2a02:26f7:bf46:4000::/64 +2a02:26f7:bf46:4980::/62 +2a02:26f7:bf47:4000::/64 +2a02:26f7:bf4c:4000::/64 +2a02:26f7:bf4c:4980::/62 +2a02:26f7:bf4d:4000::/64 +2a02:26f7:bf50:4000::/64 +2a02:26f7:bf50:4980::/62 +2a02:26f7:bf51:4000::/64 +2a02:26f7:bf80:4000::/64 +2a02:26f7:bf80:5500::/60 +2a02:26f7:bf80:5510::/64 +2a02:26f7:bf81:4000::/64 +2a02:26f7:bf82:4000::/64 +2a02:26f7:bf82:5500::/60 +2a02:26f7:bf82:5510::/64 +2a02:26f7:bf83:4000::/64 +2a02:26f7:bf84:4000::/64 +2a02:26f7:bf84:5500::/60 +2a02:26f7:bf84:5510::/64 +2a02:26f7:bf85:4000::/64 +2a02:26f7:bf86:4000::/64 +2a02:26f7:bf86:5500::/60 +2a02:26f7:bf86:5510::/64 +2a02:26f7:bf87:4000::/64 +2a02:26f7:bf8c:4000::/64 +2a02:26f7:bf8c:5500::/60 +2a02:26f7:bf8c:5510::/64 +2a02:26f7:bf8d:4000::/64 +2a02:26f7:bf90:4000::/64 +2a02:26f7:bf90:5500::/60 +2a02:26f7:bf90:5510::/64 +2a02:26f7:bf91:4000::/64 +2a02:26f7:bfc0:4000::/64 +2a02:26f7:bfc0:cea0::/62 +2a02:26f7:bfc1:4000::/64 +2a02:26f7:bfc2:4000::/64 +2a02:26f7:bfc2:cea0::/62 +2a02:26f7:bfc3:4000::/64 +2a02:26f7:bfc4:4000::/64 +2a02:26f7:bfc4:cea0::/62 +2a02:26f7:bfc5:4000::/64 +2a02:26f7:bfcc:4000::/64 +2a02:26f7:bfcc:cea0::/62 +2a02:26f7:bfcd:4000::/64 +2a02:26f7:c000::/54 +2a02:26f7:c000:400::/56 +2a02:26f7:c000:500::/57 +2a02:26f7:c000:580::/60 +2a02:26f7:c000:4000::/64 +2a02:26f7:c000:5c00::/58 +2a02:26f7:c000:5c40::/59 +2a02:26f7:c000:5c60::/61 +2a02:26f7:c000:5c68::/63 +2a02:26f7:c001:4000::/64 +2a02:26f7:c002::/54 +2a02:26f7:c002:400::/56 +2a02:26f7:c002:500::/57 +2a02:26f7:c002:580::/60 +2a02:26f7:c002:4000::/64 +2a02:26f7:c002:5c00::/58 +2a02:26f7:c002:5c40::/59 +2a02:26f7:c002:5c60::/61 +2a02:26f7:c002:5c68::/63 +2a02:26f7:c003:4000::/64 +2a02:26f7:c009::/54 +2a02:26f7:c009:400::/56 +2a02:26f7:c009:500::/57 +2a02:26f7:c009:580::/60 +2a02:26f7:c009:4000::/64 +2a02:26f7:c009:5c00::/58 +2a02:26f7:c009:5c40::/59 +2a02:26f7:c009:5c60::/61 +2a02:26f7:c009:5c68::/63 +2a02:26f7:c00b:4000::/64 +2a02:26f7:c00c::/54 +2a02:26f7:c00c:400::/56 +2a02:26f7:c00c:500::/57 +2a02:26f7:c00c:580::/60 +2a02:26f7:c00c:4000::/64 +2a02:26f7:c00c:5c00::/58 +2a02:26f7:c00c:5c40::/59 +2a02:26f7:c00c:5c60::/61 +2a02:26f7:c00c:5c68::/63 +2a02:26f7:c00d:4000::/64 +2a02:26f7:c010::/54 +2a02:26f7:c010:400::/56 +2a02:26f7:c010:500::/57 +2a02:26f7:c010:580::/60 +2a02:26f7:c010:4000::/64 +2a02:26f7:c010:5c00::/58 +2a02:26f7:c010:5c40::/59 +2a02:26f7:c010:5c60::/61 +2a02:26f7:c010:5c68::/63 +2a02:26f7:c011:4000::/64 +2a02:26f7:c014::/54 +2a02:26f7:c014:400::/56 +2a02:26f7:c014:500::/57 +2a02:26f7:c014:580::/60 +2a02:26f7:c014:4000::/64 +2a02:26f7:c014:5c00::/58 +2a02:26f7:c014:5c40::/59 +2a02:26f7:c014:5c60::/61 +2a02:26f7:c014:5c68::/63 +2a02:26f7:c015:4000::/64 +2a02:26f7:c018::/54 +2a02:26f7:c018:400::/56 +2a02:26f7:c018:500::/57 +2a02:26f7:c018:580::/60 +2a02:26f7:c018:4000::/64 +2a02:26f7:c018:5c00::/58 +2a02:26f7:c018:5c40::/59 +2a02:26f7:c018:5c60::/61 +2a02:26f7:c018:5c68::/63 +2a02:26f7:c019:4000::/64 +2a02:26f7:c040:4000::/64 +2a02:26f7:c040:cfc0::/62 +2a02:26f7:c040:cfc4::/63 +2a02:26f7:c041:4000::/64 +2a02:26f7:c042:4000::/64 +2a02:26f7:c042:cfc0::/62 +2a02:26f7:c042:cfc4::/63 +2a02:26f7:c043:4000::/64 +2a02:26f7:c048:4000::/64 +2a02:26f7:c048:cfc0::/62 +2a02:26f7:c048:cfc4::/63 +2a02:26f7:c049:4000::/64 +2a02:26f7:c04c:4000::/64 +2a02:26f7:c04c:cfc0::/62 +2a02:26f7:c04c:cfc4::/63 +2a02:26f7:c04d:4000::/64 +2a02:26f7:c050:4000::/64 +2a02:26f7:c050:cfc0::/62 +2a02:26f7:c050:cfc4::/63 +2a02:26f7:c051:4000::/64 +2a02:26f7:c080::/54 +2a02:26f7:c080:400::/56 +2a02:26f7:c080:4000::/64 +2a02:26f7:c080:40c0::/61 +2a02:26f7:c080:40c8::/64 +2a02:26f7:c081:4000::/64 +2a02:26f7:c082::/54 +2a02:26f7:c082:400::/56 +2a02:26f7:c082:4000::/64 +2a02:26f7:c082:40c0::/61 +2a02:26f7:c082:40c8::/64 +2a02:26f7:c083:4000::/64 +2a02:26f7:c084::/54 +2a02:26f7:c084:400::/56 +2a02:26f7:c084:4000::/64 +2a02:26f7:c084:40c0::/61 +2a02:26f7:c084:40c8::/64 +2a02:26f7:c085:4000::/64 +2a02:26f7:c088::/54 +2a02:26f7:c088:400::/56 +2a02:26f7:c088:4000::/64 +2a02:26f7:c088:40c0::/61 +2a02:26f7:c088:40c8::/64 +2a02:26f7:c089:4000::/64 +2a02:26f7:c08c::/54 +2a02:26f7:c08c:400::/56 +2a02:26f7:c08c:4000::/64 +2a02:26f7:c08c:40c0::/61 +2a02:26f7:c08c:40c8::/64 +2a02:26f7:c08d:4000::/64 +2a02:26f7:c0c0:4000::/64 +2a02:26f7:c0c0:c9a0::/64 +2a02:26f7:c0c1:4000::/64 +2a02:26f7:c0c4:4000::/64 +2a02:26f7:c0c4:c9a0::/64 +2a02:26f7:c0c5:4000::/64 +2a02:26f7:c0c8:4000::/64 +2a02:26f7:c0c8:c9a0::/64 +2a02:26f7:c0c9:4000::/64 +2a02:26f7:c100:4000::/64 +2a02:26f7:c101:4000::/64 +2a02:26f7:c104:4000::/64 +2a02:26f7:c105:4000::/64 +2a02:26f7:c108:4000::/64 +2a02:26f7:c109:4000::/64 +2a02:26f7:c140:4000::/64 +2a02:26f7:c140:d3c0::/61 +2a02:26f7:c140:d3c8::/62 +2a02:26f7:c140:d3cc::/63 +2a02:26f7:c140:d3ce::/64 +2a02:26f7:c140:d3d0::/62 +2a02:26f7:c140:d3d4::/63 +2a02:26f7:c140:d3d6::/64 +2a02:26f7:c141:4000::/64 +2a02:26f7:c144:4000::/64 +2a02:26f7:c144:d3c0::/61 +2a02:26f7:c144:d3c8::/62 +2a02:26f7:c144:d3cc::/63 +2a02:26f7:c144:d3ce::/64 +2a02:26f7:c144:d3d0::/62 +2a02:26f7:c144:d3d4::/63 +2a02:26f7:c144:d3d6::/64 +2a02:26f7:c145:4000::/64 +2a02:26f7:c148:4000::/64 +2a02:26f7:c148:d3c0::/61 +2a02:26f7:c148:d3c8::/62 +2a02:26f7:c148:d3cc::/63 +2a02:26f7:c148:d3ce::/64 +2a02:26f7:c148:d3d0::/62 +2a02:26f7:c148:d3d4::/63 +2a02:26f7:c148:d3d6::/64 +2a02:26f7:c149:4000::/64 +2a02:26f7:c14c:4000::/64 +2a02:26f7:c14c:d3c0::/61 +2a02:26f7:c14c:d3c8::/62 +2a02:26f7:c14c:d3cc::/63 +2a02:26f7:c14c:d3ce::/64 +2a02:26f7:c14c:d3d0::/62 +2a02:26f7:c14c:d3d4::/63 +2a02:26f7:c14c:d3d6::/64 +2a02:26f7:c14d:4000::/64 +2a02:26f7:c150:4000::/64 +2a02:26f7:c150:d3c0::/61 +2a02:26f7:c150:d3c8::/62 +2a02:26f7:c150:d3cc::/63 +2a02:26f7:c150:d3ce::/64 +2a02:26f7:c150:d3d0::/62 +2a02:26f7:c150:d3d4::/63 +2a02:26f7:c150:d3d6::/64 +2a02:26f7:c151:4000::/64 +2a02:26f7:c154:4000::/64 +2a02:26f7:c154:d3c0::/61 +2a02:26f7:c154:d3c8::/62 +2a02:26f7:c154:d3cc::/63 +2a02:26f7:c154:d3ce::/64 +2a02:26f7:c154:d3d0::/62 +2a02:26f7:c154:d3d4::/63 +2a02:26f7:c154:d3d6::/64 +2a02:26f7:c155:4000::/64 +2a02:26f7:c180:4000::/64 +2a02:26f7:c180:c4c0::/64 +2a02:26f7:c181:4000::/64 +2a02:26f7:c184:4000::/64 +2a02:26f7:c184:c4c0::/64 +2a02:26f7:c185:4000::/64 +2a02:26f7:c188:4000::/64 +2a02:26f7:c188:c4c0::/64 +2a02:26f7:c189:4000::/64 +2a02:26f7:c1c0::/54 +2a02:26f7:c1c0:400::/56 +2a02:26f7:c1c0:4000::/64 +2a02:26f7:c1c0:4500::/59 +2a02:26f7:c1c0:4520::/60 +2a02:26f7:c1c1:4000::/64 +2a02:26f7:c1c4::/54 +2a02:26f7:c1c4:400::/56 +2a02:26f7:c1c4:4000::/64 +2a02:26f7:c1c4:4500::/59 +2a02:26f7:c1c4:4520::/60 +2a02:26f7:c1c5:4000::/64 +2a02:26f7:c1c8::/54 +2a02:26f7:c1c8:400::/56 +2a02:26f7:c1c8:4000::/64 +2a02:26f7:c1c8:4500::/59 +2a02:26f7:c1c8:4520::/60 +2a02:26f7:c1c9:4000::/64 +2a02:26f7:c200:4000::/64 +2a02:26f7:c200:cd60::/63 +2a02:26f7:c200:cd62::/64 +2a02:26f7:c201:4000::/64 +2a02:26f7:c202:4000::/64 +2a02:26f7:c202:cd60::/63 +2a02:26f7:c202:cd62::/64 +2a02:26f7:c203:4000::/64 +2a02:26f7:c204:4000::/64 +2a02:26f7:c204:cd60::/63 +2a02:26f7:c204:cd62::/64 +2a02:26f7:c205:4000::/64 +2a02:26f7:c208:4000::/64 +2a02:26f7:c208:cd60::/63 +2a02:26f7:c208:cd62::/64 +2a02:26f7:c209:4000::/64 +2a02:26f7:c240:4000::/64 +2a02:26f7:c240:cac0::/63 +2a02:26f7:c241:4000::/64 +2a02:26f7:c244:4000::/64 +2a02:26f7:c244:cac0::/63 +2a02:26f7:c245:4000::/64 +2a02:26f7:c248:4000::/64 +2a02:26f7:c248:cac0::/63 +2a02:26f7:c249:4000::/64 +2a02:26f7:c280:4000::/64 +2a02:26f7:c280:4d00::/64 +2a02:26f7:c281:4000::/64 +2a02:26f7:c284:4000::/64 +2a02:26f7:c284:4d00::/64 +2a02:26f7:c285:4000::/64 +2a02:26f7:c288:4000::/64 +2a02:26f7:c288:4d00::/64 +2a02:26f7:c289:4000::/64 +2a02:26f7:c2c0:4000::/64 +2a02:26f7:c2c0:ce80::/62 +2a02:26f7:c2c1:4000::/64 +2a02:26f7:c2c4:4000::/64 +2a02:26f7:c2c4:ce80::/62 +2a02:26f7:c2c5:4000::/64 +2a02:26f7:c2c8:4000::/64 +2a02:26f7:c2c8:ce80::/62 +2a02:26f7:c2c9:4000::/64 +2a02:26f7:c304:4000::/64 +2a02:26f7:c304:4940::/60 +2a02:26f7:c304:4950::/62 +2a02:26f7:c304:4954::/63 +2a02:26f7:c305:4000::/64 +2a02:26f7:c308:4000::/64 +2a02:26f7:c308:4940::/60 +2a02:26f7:c308:4950::/62 +2a02:26f7:c308:4954::/63 +2a02:26f7:c309:4000::/64 +2a02:26f7:c30c:4000::/64 +2a02:26f7:c30c:4940::/60 +2a02:26f7:c30c:4950::/62 +2a02:26f7:c30c:4954::/63 +2a02:26f7:c30d:4000::/64 +2a02:26f7:c340:4000::/64 +2a02:26f7:c344::/52 +2a02:26f7:c344:1000::/54 +2a02:26f7:c344:1400::/56 +2a02:26f7:c344:4000::/64 +2a02:26f7:c344:8000::/55 +2a02:26f7:c344:8200::/59 +2a02:26f7:c344:8220::/63 +2a02:26f7:c344:fff0::/64 +2a02:26f7:c345:4000::/64 +2a02:26f7:c348::/52 +2a02:26f7:c348:1000::/54 +2a02:26f7:c348:1400::/56 +2a02:26f7:c348:4000::/64 +2a02:26f7:c348:8000::/55 +2a02:26f7:c348:8200::/59 +2a02:26f7:c348:8220::/63 +2a02:26f7:c348:fff0::/64 +2a02:26f7:c349::/52 +2a02:26f7:c349:1000::/54 +2a02:26f7:c349:1400::/56 +2a02:26f7:c349:4000::/64 +2a02:26f7:c349:8000::/55 +2a02:26f7:c349:8200::/59 +2a02:26f7:c349:8220::/63 +2a02:26f7:c349:fff0::/64 +2a02:26f7:c34a::/52 +2a02:26f7:c34a:1000::/54 +2a02:26f7:c34a:1400::/56 +2a02:26f7:c34a:4000::/64 +2a02:26f7:c34a:8000::/55 +2a02:26f7:c34a:8200::/59 +2a02:26f7:c34a:8220::/63 +2a02:26f7:c34a:fff0::/64 +2a02:26f7:c34b:4000::/64 +2a02:26f7:c34c::/52 +2a02:26f7:c34c:1000::/54 +2a02:26f7:c34c:1400::/56 +2a02:26f7:c34c:4000::/64 +2a02:26f7:c34c:8000::/55 +2a02:26f7:c34c:8200::/59 +2a02:26f7:c34c:8220::/63 +2a02:26f7:c34c:fff0::/64 +2a02:26f7:c34d::/52 +2a02:26f7:c34d:1000::/54 +2a02:26f7:c34d:1400::/56 +2a02:26f7:c34d:4000::/64 +2a02:26f7:c34d:8000::/55 +2a02:26f7:c34d:8200::/59 +2a02:26f7:c34d:8220::/63 +2a02:26f7:c34d:fff0::/64 +2a02:26f7:c350::/52 +2a02:26f7:c350:1000::/54 +2a02:26f7:c350:1400::/56 +2a02:26f7:c350:4000::/64 +2a02:26f7:c350:8000::/55 +2a02:26f7:c350:8200::/59 +2a02:26f7:c350:8220::/63 +2a02:26f7:c350:fff0::/64 +2a02:26f7:c351::/52 +2a02:26f7:c351:1000::/54 +2a02:26f7:c351:1400::/56 +2a02:26f7:c351:4000::/64 +2a02:26f7:c351:8000::/55 +2a02:26f7:c351:8200::/59 +2a02:26f7:c351:8220::/63 +2a02:26f7:c351:fff0::/64 +2a02:26f7:c352::/52 +2a02:26f7:c352:1000::/54 +2a02:26f7:c352:1400::/56 +2a02:26f7:c352:4000::/64 +2a02:26f7:c352:8000::/55 +2a02:26f7:c352:8200::/59 +2a02:26f7:c352:8220::/63 +2a02:26f7:c352:fff0::/64 +2a02:26f7:c353::/52 +2a02:26f7:c353:1000::/54 +2a02:26f7:c353:1400::/56 +2a02:26f7:c353:4000::/64 +2a02:26f7:c353:8000::/55 +2a02:26f7:c353:8200::/59 +2a02:26f7:c353:8220::/63 +2a02:26f7:c353:fff0::/64 +2a02:26f7:c354::/52 +2a02:26f7:c354:1000::/54 +2a02:26f7:c354:1400::/56 +2a02:26f7:c354:4000::/64 +2a02:26f7:c354:8000::/55 +2a02:26f7:c354:8200::/59 +2a02:26f7:c354:8220::/63 +2a02:26f7:c354:fff0::/64 +2a02:26f7:c355::/52 +2a02:26f7:c355:1000::/54 +2a02:26f7:c355:1400::/56 +2a02:26f7:c355:4000::/64 +2a02:26f7:c355:8000::/55 +2a02:26f7:c355:8200::/59 +2a02:26f7:c355:8220::/63 +2a02:26f7:c355:fff0::/64 +2a02:26f7:c356::/52 +2a02:26f7:c356:1000::/54 +2a02:26f7:c356:1400::/56 +2a02:26f7:c356:4000::/64 +2a02:26f7:c356:8000::/55 +2a02:26f7:c356:8200::/59 +2a02:26f7:c356:8220::/63 +2a02:26f7:c356:fff0::/64 +2a02:26f7:c357:4000::/64 +2a02:26f7:c358::/52 +2a02:26f7:c358:1000::/54 +2a02:26f7:c358:1400::/56 +2a02:26f7:c358:4000::/64 +2a02:26f7:c358:8000::/55 +2a02:26f7:c358:8200::/59 +2a02:26f7:c358:8220::/63 +2a02:26f7:c358:fff0::/64 +2a02:26f7:c359:4000::/64 +2a02:26f7:c35e:4000::/64 +2a02:26f7:c35f:4000::/64 +2a02:26f7:c360:4000::/64 +2a02:26f7:c361:4000::/64 +2a02:26f7:c362:4000::/64 +2a02:26f7:c363:4000::/64 +2a02:26f7:c364:4000::/64 +2a02:26f7:c365:4000::/64 +2a02:26f7:c368:4000::/64 +2a02:26f7:c369:4000::/64 +2a02:26f7:c384::/54 +2a02:26f7:c384:400::/58 +2a02:26f7:c384:440::/60 +2a02:26f7:c384:4000::/64 +2a02:26f7:c384:4e40::/60 +2a02:26f7:c384:fff0::/64 +2a02:26f7:c385:4000::/64 +2a02:26f7:c388::/54 +2a02:26f7:c388:400::/58 +2a02:26f7:c388:440::/60 +2a02:26f7:c388:4000::/64 +2a02:26f7:c388:4e40::/60 +2a02:26f7:c388:fff0::/64 +2a02:26f7:c389::/54 +2a02:26f7:c389:400::/58 +2a02:26f7:c389:440::/60 +2a02:26f7:c389:4000::/64 +2a02:26f7:c389:4e40::/60 +2a02:26f7:c389:fff0::/64 +2a02:26f7:c38a::/54 +2a02:26f7:c38a:400::/58 +2a02:26f7:c38a:440::/60 +2a02:26f7:c38a:4000::/64 +2a02:26f7:c38a:4e40::/60 +2a02:26f7:c38a:fff0::/64 +2a02:26f7:c38b:4000::/64 +2a02:26f7:c38c::/54 +2a02:26f7:c38c:400::/58 +2a02:26f7:c38c:440::/60 +2a02:26f7:c38c:4000::/64 +2a02:26f7:c38c:4e40::/60 +2a02:26f7:c38c:fff0::/64 +2a02:26f7:c38d:4000::/64 +2a02:26f7:c391::/54 +2a02:26f7:c391:400::/58 +2a02:26f7:c391:440::/60 +2a02:26f7:c391:4000::/64 +2a02:26f7:c391:4e40::/60 +2a02:26f7:c391:fff0::/64 +2a02:26f7:c393:4000::/64 +2a02:26f7:c394:4000::/64 +2a02:26f7:c395:4000::/64 +2a02:26f7:c3c0::/53 +2a02:26f7:c3c0:800::/56 +2a02:26f7:c3c0:4000::/64 +2a02:26f7:c3c0:5000::/59 +2a02:26f7:c3c0:5020::/60 +2a02:26f7:c3c0:5030::/63 +2a02:26f7:c3c0:5032::/64 +2a02:26f7:c3c1:4000::/64 +2a02:26f7:c3c4::/53 +2a02:26f7:c3c4:800::/56 +2a02:26f7:c3c4:4000::/64 +2a02:26f7:c3c4:5000::/59 +2a02:26f7:c3c4:5020::/60 +2a02:26f7:c3c4:5030::/63 +2a02:26f7:c3c4:5032::/64 +2a02:26f7:c3c5:4000::/64 +2a02:26f7:c3c8::/53 +2a02:26f7:c3c8:800::/56 +2a02:26f7:c3c8:4000::/64 +2a02:26f7:c3c8:5000::/59 +2a02:26f7:c3c8:5020::/60 +2a02:26f7:c3c8:5030::/63 +2a02:26f7:c3c8:5032::/64 +2a02:26f7:c3c9::/53 +2a02:26f7:c3c9:800::/56 +2a02:26f7:c3c9:4000::/64 +2a02:26f7:c3c9:5000::/59 +2a02:26f7:c3c9:5020::/60 +2a02:26f7:c3c9:5030::/63 +2a02:26f7:c3c9:5032::/64 +2a02:26f7:c3ca:4000::/64 +2a02:26f7:c3cb:4000::/64 +2a02:26f7:c3cc::/53 +2a02:26f7:c3cc:800::/56 +2a02:26f7:c3cc:4000::/64 +2a02:26f7:c3cc:5000::/59 +2a02:26f7:c3cc:5020::/60 +2a02:26f7:c3cc:5030::/63 +2a02:26f7:c3cc:5032::/64 +2a02:26f7:c3cd:4000::/64 +2a02:26f7:c3d0::/53 +2a02:26f7:c3d0:800::/56 +2a02:26f7:c3d0:4000::/64 +2a02:26f7:c3d0:5000::/59 +2a02:26f7:c3d0:5020::/60 +2a02:26f7:c3d0:5030::/63 +2a02:26f7:c3d0:5032::/64 +2a02:26f7:c3d1:4000::/64 +2a02:26f7:c3dc::/53 +2a02:26f7:c3dc:800::/56 +2a02:26f7:c3dc:4000::/64 +2a02:26f7:c3dc:5000::/59 +2a02:26f7:c3dc:5020::/60 +2a02:26f7:c3dc:5030::/63 +2a02:26f7:c3dc:5032::/64 +2a02:26f7:c3dd:4000::/64 +2a02:26f7:c3e0::/53 +2a02:26f7:c3e0:800::/56 +2a02:26f7:c3e0:4000::/64 +2a02:26f7:c3e0:5000::/59 +2a02:26f7:c3e0:5020::/60 +2a02:26f7:c3e0:5030::/63 +2a02:26f7:c3e0:5032::/64 +2a02:26f7:c3e1:4000::/64 +2a02:26f7:c3e4::/53 +2a02:26f7:c3e4:800::/56 +2a02:26f7:c3e4:4000::/64 +2a02:26f7:c3e4:5000::/59 +2a02:26f7:c3e4:5020::/60 +2a02:26f7:c3e4:5030::/63 +2a02:26f7:c3e4:5032::/64 +2a02:26f7:c3e7:4000::/64 +2a02:26f7:c400:4000::/64 +2a02:26f7:c400:f400::/55 +2a02:26f7:c400:f600::/61 +2a02:26f7:c400:f608::/62 +2a02:26f7:c400:f60c::/63 +2a02:26f7:c401:4000::/64 +2a02:26f7:c404:4000::/64 +2a02:26f7:c404:f400::/55 +2a02:26f7:c404:f600::/61 +2a02:26f7:c404:f608::/62 +2a02:26f7:c404:f60c::/63 +2a02:26f7:c405:4000::/64 +2a02:26f7:c408:4000::/64 +2a02:26f7:c408:f400::/55 +2a02:26f7:c408:f600::/61 +2a02:26f7:c408:f608::/62 +2a02:26f7:c408:f60c::/63 +2a02:26f7:c409:4000::/64 +2a02:26f7:c40c:4000::/64 +2a02:26f7:c40c:f400::/55 +2a02:26f7:c40c:f600::/61 +2a02:26f7:c40c:f608::/62 +2a02:26f7:c40c:f60c::/63 +2a02:26f7:c40d:4000::/64 +2a02:26f7:c410:4000::/64 +2a02:26f7:c410:f400::/55 +2a02:26f7:c410:f600::/61 +2a02:26f7:c410:f608::/62 +2a02:26f7:c410:f60c::/63 +2a02:26f7:c411:4000::/64 +2a02:26f7:c414:4000::/64 +2a02:26f7:c414:f400::/55 +2a02:26f7:c414:f600::/61 +2a02:26f7:c414:f608::/62 +2a02:26f7:c414:f60c::/63 +2a02:26f7:c415:4000::/64 +2a02:26f7:c418:4000::/64 +2a02:26f7:c418:f400::/55 +2a02:26f7:c418:f600::/61 +2a02:26f7:c418:f608::/62 +2a02:26f7:c418:f60c::/63 +2a02:26f7:c419:4000::/64 +2a02:26f7:c41c:4000::/64 +2a02:26f7:c41c:f400::/55 +2a02:26f7:c41c:f600::/61 +2a02:26f7:c41c:f608::/62 +2a02:26f7:c41c:f60c::/63 +2a02:26f7:c41d:4000::/64 +2a02:26f7:c420:4000::/64 +2a02:26f7:c420:f400::/55 +2a02:26f7:c420:f600::/61 +2a02:26f7:c420:f608::/62 +2a02:26f7:c420:f60c::/63 +2a02:26f7:c421:4000::/64 +2a02:26f7:c440:4000::/64 +2a02:26f7:c440:c860::/64 +2a02:26f7:c441:4000::/64 +2a02:26f7:c442:4000::/64 +2a02:26f7:c442:c860::/64 +2a02:26f7:c443:4000::/64 +2a02:26f7:c444:4000::/64 +2a02:26f7:c444:c860::/64 +2a02:26f7:c445:4000::/64 +2a02:26f7:c44c:4000::/64 +2a02:26f7:c44c:c860::/64 +2a02:26f7:c44d:4000::/64 +2a02:26f7:c480:4000::/64 +2a02:26f7:c480:cc80::/63 +2a02:26f7:c481:4000::/64 +2a02:26f7:c482:4000::/64 +2a02:26f7:c482:cc80::/63 +2a02:26f7:c483:4000::/64 +2a02:26f7:c484:4000::/64 +2a02:26f7:c484:cc80::/63 +2a02:26f7:c485:4000::/64 +2a02:26f7:c488:4000::/64 +2a02:26f7:c488:cc80::/63 +2a02:26f7:c489:4000::/64 +2a02:26f7:c48c:4000::/64 +2a02:26f7:c48c:cc80::/63 +2a02:26f7:c48d:4000::/64 +2a02:26f7:c490:4000::/64 +2a02:26f7:c490:cc80::/63 +2a02:26f7:c491:4000::/64 +2a02:26f7:c4c0:4000::/64 +2a02:26f7:c4c0:ce20::/63 +2a02:26f7:c4c0:ce22::/64 +2a02:26f7:c4c1:4000::/64 +2a02:26f7:c4c2:4000::/64 +2a02:26f7:c4c2:ce20::/63 +2a02:26f7:c4c2:ce22::/64 +2a02:26f7:c4c3:4000::/64 +2a02:26f7:c4c4:4000::/64 +2a02:26f7:c4c4:ce20::/63 +2a02:26f7:c4c4:ce22::/64 +2a02:26f7:c4c5:4000::/64 +2a02:26f7:c4c8:4000::/64 +2a02:26f7:c4c8:ce20::/63 +2a02:26f7:c4c8:ce22::/64 +2a02:26f7:c4c9:4000::/64 +2a02:26f7:c4cc:4000::/64 +2a02:26f7:c4cc:ce20::/63 +2a02:26f7:c4cc:ce22::/64 +2a02:26f7:c4cd:4000::/64 +2a02:26f7:c4d0:4000::/64 +2a02:26f7:c4d0:ce20::/63 +2a02:26f7:c4d0:ce22::/64 +2a02:26f7:c4d1:4000::/64 +2a02:26f7:c4d4:4000::/64 +2a02:26f7:c4d4:ce20::/63 +2a02:26f7:c4d4:ce22::/64 +2a02:26f7:c4d5:4000::/64 +2a02:26f7:c500:4000::/64 +2a02:26f7:c500:c320::/64 +2a02:26f7:c501:4000::/64 +2a02:26f7:c502:4000::/64 +2a02:26f7:c502:c320::/64 +2a02:26f7:c503:4000::/64 +2a02:26f7:c504:4000::/64 +2a02:26f7:c504:c320::/64 +2a02:26f7:c505:4000::/64 +2a02:26f7:c508:4000::/64 +2a02:26f7:c508:c320::/64 +2a02:26f7:c509:4000::/64 +2a02:26f7:c540:4000::/64 +2a02:26f7:c540:44c0::/62 +2a02:26f7:c540:44c4::/63 +2a02:26f7:c540:44c6::/64 +2a02:26f7:c541:4000::/64 +2a02:26f7:c542:4000::/64 +2a02:26f7:c542:44c0::/62 +2a02:26f7:c542:44c4::/63 +2a02:26f7:c542:44c6::/64 +2a02:26f7:c543:4000::/64 +2a02:26f7:c548:4000::/64 +2a02:26f7:c548:44c0::/62 +2a02:26f7:c548:44c4::/63 +2a02:26f7:c548:44c6::/64 +2a02:26f7:c549:4000::/64 +2a02:26f7:c54c:4000::/64 +2a02:26f7:c54c:44c0::/62 +2a02:26f7:c54c:44c4::/63 +2a02:26f7:c54c:44c6::/64 +2a02:26f7:c54d:4000::/64 +2a02:26f7:c550:4000::/64 +2a02:26f7:c550:44c0::/62 +2a02:26f7:c550:44c4::/63 +2a02:26f7:c550:44c6::/64 +2a02:26f7:c551:4000::/64 +2a02:26f7:c580:4000::/64 +2a02:26f7:c580:cd00::/63 +2a02:26f7:c580:cd02::/64 +2a02:26f7:c581:4000::/64 +2a02:26f7:c582:4000::/64 +2a02:26f7:c582:cd00::/63 +2a02:26f7:c582:cd02::/64 +2a02:26f7:c583:4000::/64 +2a02:26f7:c588:4000::/64 +2a02:26f7:c588:cd00::/63 +2a02:26f7:c588:cd02::/64 +2a02:26f7:c589:4000::/64 +2a02:26f7:c58c:4000::/64 +2a02:26f7:c58c:cd00::/63 +2a02:26f7:c58c:cd02::/64 +2a02:26f7:c58d:4000::/64 +2a02:26f7:c5c0::/54 +2a02:26f7:c5c0:400::/56 +2a02:26f7:c5c0:500::/57 +2a02:26f7:c5c0:4000::/64 +2a02:26f7:c5c0:4f80::/64 +2a02:26f7:c5c0:4f83::/64 +2a02:26f7:c5c0:4f84::/64 +2a02:26f7:c5c0:4f87::/64 +2a02:26f7:c5c0:4f88::/62 +2a02:26f7:c5c0:4f8c::/64 +2a02:26f7:c5c0:4f8e::/63 +2a02:26f7:c5c0:4f90::/63 +2a02:26f7:c5c0:4f92::/64 +2a02:26f7:c5c0:4f94::/63 +2a02:26f7:c5c0:4f98::/64 +2a02:26f7:c5c0:4f9b::/64 +2a02:26f7:c5c0:4f9d::/64 +2a02:26f7:c5c0:4f9e::/64 +2a02:26f7:c5c0:4fa0::/63 +2a02:26f7:c5c0:4fa4::/64 +2a02:26f7:c5c0:4fa6::/64 +2a02:26f7:c5c0:4fab::/64 +2a02:26f7:c5c0:4fae::/63 +2a02:26f7:c5c0:4fb0::/63 +2a02:26f7:c5c1:4000::/64 +2a02:26f7:c5c4::/54 +2a02:26f7:c5c4:400::/56 +2a02:26f7:c5c4:500::/57 +2a02:26f7:c5c4:4000::/64 +2a02:26f7:c5c4:4f80::/64 +2a02:26f7:c5c4:4f83::/64 +2a02:26f7:c5c4:4f84::/64 +2a02:26f7:c5c4:4f87::/64 +2a02:26f7:c5c4:4f88::/62 +2a02:26f7:c5c4:4f8c::/64 +2a02:26f7:c5c4:4f8e::/63 +2a02:26f7:c5c4:4f90::/63 +2a02:26f7:c5c4:4f92::/64 +2a02:26f7:c5c4:4f94::/63 +2a02:26f7:c5c4:4f98::/64 +2a02:26f7:c5c4:4f9b::/64 +2a02:26f7:c5c4:4f9d::/64 +2a02:26f7:c5c4:4f9e::/64 +2a02:26f7:c5c4:4fa0::/63 +2a02:26f7:c5c4:4fa4::/64 +2a02:26f7:c5c4:4fa6::/64 +2a02:26f7:c5c4:4fab::/64 +2a02:26f7:c5c4:4fae::/63 +2a02:26f7:c5c4:4fb0::/63 +2a02:26f7:c5c5::/54 +2a02:26f7:c5c5:400::/56 +2a02:26f7:c5c5:500::/57 +2a02:26f7:c5c5:4000::/64 +2a02:26f7:c5c5:4f80::/64 +2a02:26f7:c5c5:4f83::/64 +2a02:26f7:c5c5:4f84::/64 +2a02:26f7:c5c5:4f87::/64 +2a02:26f7:c5c5:4f88::/62 +2a02:26f7:c5c5:4f8c::/64 +2a02:26f7:c5c5:4f8e::/63 +2a02:26f7:c5c5:4f90::/63 +2a02:26f7:c5c5:4f92::/64 +2a02:26f7:c5c5:4f94::/63 +2a02:26f7:c5c5:4f98::/64 +2a02:26f7:c5c5:4f9b::/64 +2a02:26f7:c5c5:4f9d::/64 +2a02:26f7:c5c5:4f9e::/64 +2a02:26f7:c5c5:4fa0::/63 +2a02:26f7:c5c5:4fa4::/64 +2a02:26f7:c5c5:4fa6::/64 +2a02:26f7:c5c5:4fab::/64 +2a02:26f7:c5c5:4fae::/63 +2a02:26f7:c5c5:4fb0::/63 +2a02:26f7:c5c6:4000::/64 +2a02:26f7:c5c7:4000::/64 +2a02:26f7:c5c8::/54 +2a02:26f7:c5c8:400::/56 +2a02:26f7:c5c8:500::/57 +2a02:26f7:c5c8:4000::/64 +2a02:26f7:c5c8:4f80::/64 +2a02:26f7:c5c8:4f83::/64 +2a02:26f7:c5c8:4f84::/64 +2a02:26f7:c5c8:4f87::/64 +2a02:26f7:c5c8:4f88::/62 +2a02:26f7:c5c8:4f8c::/64 +2a02:26f7:c5c8:4f8e::/63 +2a02:26f7:c5c8:4f90::/63 +2a02:26f7:c5c8:4f92::/64 +2a02:26f7:c5c8:4f94::/63 +2a02:26f7:c5c8:4f98::/64 +2a02:26f7:c5c8:4f9b::/64 +2a02:26f7:c5c8:4f9d::/64 +2a02:26f7:c5c8:4f9e::/64 +2a02:26f7:c5c8:4fa0::/63 +2a02:26f7:c5c8:4fa4::/64 +2a02:26f7:c5c8:4fa6::/64 +2a02:26f7:c5c8:4fab::/64 +2a02:26f7:c5c8:4fae::/63 +2a02:26f7:c5c8:4fb0::/63 +2a02:26f7:c5c9:4000::/64 +2a02:26f7:c600:4000::/64 +2a02:26f7:c600:c8a0::/64 +2a02:26f7:c601:4000::/64 +2a02:26f7:c602:4000::/64 +2a02:26f7:c602:c8a0::/64 +2a02:26f7:c603:4000::/64 +2a02:26f7:c604:4000::/64 +2a02:26f7:c604:c8a0::/64 +2a02:26f7:c605:4000::/64 +2a02:26f7:c608:4000::/64 +2a02:26f7:c608:c8a0::/64 +2a02:26f7:c609:4000::/64 +2a02:26f7:c609:c8a0::/64 +2a02:26f7:c60a:4000::/64 +2a02:26f7:c60b:4000::/64 +2a02:26f7:c640::/54 +2a02:26f7:c640:4000::/64 +2a02:26f7:c640:4cc0::/60 +2a02:26f7:c640:4cd0::/62 +2a02:26f7:c640:4cd4::/64 +2a02:26f7:c640:4cd6::/63 +2a02:26f7:c640:4cd8::/61 +2a02:26f7:c640:4ce0::/59 +2a02:26f7:c640:d980::/60 +2a02:26f7:c640:d990::/62 +2a02:26f7:c640:d994::/64 +2a02:26f7:c641:4000::/64 +2a02:26f7:c644::/54 +2a02:26f7:c644:4000::/64 +2a02:26f7:c644:4cc0::/60 +2a02:26f7:c644:4cd0::/62 +2a02:26f7:c644:4cd4::/64 +2a02:26f7:c644:4cd6::/63 +2a02:26f7:c644:4cd8::/61 +2a02:26f7:c644:4ce0::/59 +2a02:26f7:c644:d980::/60 +2a02:26f7:c644:d990::/62 +2a02:26f7:c644:d994::/64 +2a02:26f7:c645::/54 +2a02:26f7:c645:4000::/64 +2a02:26f7:c645:4cc0::/60 +2a02:26f7:c645:4cd0::/62 +2a02:26f7:c645:4cd4::/64 +2a02:26f7:c645:4cd6::/63 +2a02:26f7:c645:4cd8::/61 +2a02:26f7:c645:4ce0::/59 +2a02:26f7:c645:d980::/60 +2a02:26f7:c645:d990::/62 +2a02:26f7:c645:d994::/64 +2a02:26f7:c646:4000::/64 +2a02:26f7:c647:4000::/64 +2a02:26f7:c648::/54 +2a02:26f7:c648:4000::/64 +2a02:26f7:c648:4cc0::/60 +2a02:26f7:c648:4cd0::/62 +2a02:26f7:c648:4cd4::/64 +2a02:26f7:c648:4cd6::/63 +2a02:26f7:c648:4cd8::/61 +2a02:26f7:c648:4ce0::/59 +2a02:26f7:c648:d980::/60 +2a02:26f7:c648:d990::/62 +2a02:26f7:c648:d994::/64 +2a02:26f7:c649:4000::/64 +2a02:26f7:c680::/54 +2a02:26f7:c680:400::/56 +2a02:26f7:c680:4000::/64 +2a02:26f7:c680:4c40::/63 +2a02:26f7:c681:4000::/64 +2a02:26f7:c684::/54 +2a02:26f7:c684:400::/56 +2a02:26f7:c684:4000::/64 +2a02:26f7:c684:4c40::/63 +2a02:26f7:c685:4000::/64 +2a02:26f7:c688::/54 +2a02:26f7:c688:400::/56 +2a02:26f7:c688:4000::/64 +2a02:26f7:c688:4c40::/63 +2a02:26f7:c689:4000::/64 +2a02:26f7:c68a::/54 +2a02:26f7:c68a:400::/56 +2a02:26f7:c68a:4000::/64 +2a02:26f7:c68a:4c40::/63 +2a02:26f7:c68b:4000::/64 +2a02:26f7:c690::/54 +2a02:26f7:c690:400::/56 +2a02:26f7:c690:4000::/64 +2a02:26f7:c690:4c40::/63 +2a02:26f7:c691:4000::/64 +2a02:26f7:c694::/54 +2a02:26f7:c694:400::/56 +2a02:26f7:c694:4000::/64 +2a02:26f7:c694:4c40::/63 +2a02:26f7:c695:4000::/64 +2a02:26f7:c6c0::/53 +2a02:26f7:c6c0:800::/56 +2a02:26f7:c6c0:900::/58 +2a02:26f7:c6c0:940::/59 +2a02:26f7:c6c0:4000::/64 +2a02:26f7:c6c0:49c0::/63 +2a02:26f7:c6c0:49c2::/64 +2a02:26f7:c6c0:49c4::/62 +2a02:26f7:c6c0:49c8::/61 +2a02:26f7:c6c0:49d0::/60 +2a02:26f7:c6c0:49e0::/60 +2a02:26f7:c6c0:49f0::/61 +2a02:26f7:c6c0:49f8::/63 +2a02:26f7:c6c2:4000::/64 +2a02:26f7:c6c4::/53 +2a02:26f7:c6c4:800::/56 +2a02:26f7:c6c4:900::/58 +2a02:26f7:c6c4:940::/59 +2a02:26f7:c6c4:4000::/64 +2a02:26f7:c6c4:49c0::/63 +2a02:26f7:c6c4:49c2::/64 +2a02:26f7:c6c4:49c4::/62 +2a02:26f7:c6c4:49c8::/61 +2a02:26f7:c6c4:49d0::/60 +2a02:26f7:c6c4:49e0::/60 +2a02:26f7:c6c4:49f0::/61 +2a02:26f7:c6c4:49f8::/63 +2a02:26f7:c6c5::/53 +2a02:26f7:c6c5:800::/56 +2a02:26f7:c6c5:900::/58 +2a02:26f7:c6c5:940::/59 +2a02:26f7:c6c5:4000::/64 +2a02:26f7:c6c5:49c0::/63 +2a02:26f7:c6c5:49c2::/64 +2a02:26f7:c6c5:49c4::/62 +2a02:26f7:c6c5:49c8::/61 +2a02:26f7:c6c5:49d0::/60 +2a02:26f7:c6c5:49e0::/60 +2a02:26f7:c6c5:49f0::/61 +2a02:26f7:c6c5:49f8::/63 +2a02:26f7:c6c6:4000::/64 +2a02:26f7:c6c7:4000::/64 +2a02:26f7:c6c8::/53 +2a02:26f7:c6c8:800::/56 +2a02:26f7:c6c8:900::/58 +2a02:26f7:c6c8:940::/59 +2a02:26f7:c6c8:4000::/64 +2a02:26f7:c6c8:49c0::/63 +2a02:26f7:c6c8:49c2::/64 +2a02:26f7:c6c8:49c4::/62 +2a02:26f7:c6c8:49c8::/61 +2a02:26f7:c6c8:49d0::/60 +2a02:26f7:c6c8:49e0::/60 +2a02:26f7:c6c8:49f0::/61 +2a02:26f7:c6c8:49f8::/63 +2a02:26f7:c6c9:4000::/64 +2a02:26f7:c700:4000::/64 +2a02:26f7:c700:c520::/64 +2a02:26f7:c701:4000::/64 +2a02:26f7:c704:4000::/64 +2a02:26f7:c704:c520::/64 +2a02:26f7:c705:4000::/64 +2a02:26f7:c708:4000::/64 +2a02:26f7:c708:c520::/64 +2a02:26f7:c709:4000::/64 +2a02:26f7:c740:4000::/64 +2a02:26f7:c740:c460::/64 +2a02:26f7:c741:4000::/64 +2a02:26f7:c744:4000::/64 +2a02:26f7:c744:c460::/64 +2a02:26f7:c745:4000::/64 +2a02:26f7:c745:c460::/64 +2a02:26f7:c746:4000::/64 +2a02:26f7:c747:4000::/64 +2a02:26f7:c748:4000::/64 +2a02:26f7:c748:c460::/64 +2a02:26f7:c749:4000::/64 +2a02:26f7:c780:4000::/64 +2a02:26f7:c780:d240::/61 +2a02:26f7:c780:d248::/62 +2a02:26f7:c781:4000::/64 +2a02:26f7:c784:4000::/64 +2a02:26f7:c784:d240::/61 +2a02:26f7:c784:d248::/62 +2a02:26f7:c785:4000::/64 +2a02:26f7:c785:d240::/61 +2a02:26f7:c785:d248::/62 +2a02:26f7:c786:4000::/64 +2a02:26f7:c787:4000::/64 +2a02:26f7:c788:4000::/64 +2a02:26f7:c788:d240::/61 +2a02:26f7:c788:d248::/62 +2a02:26f7:c789:4000::/64 +2a02:26f7:c7c0:4000::/64 +2a02:26f7:c7c0:cf21::/64 +2a02:26f7:c7c0:cf22::/63 +2a02:26f7:c7c1:4000::/64 +2a02:26f7:c7c2:4000::/64 +2a02:26f7:c7c2:cf21::/64 +2a02:26f7:c7c2:cf22::/63 +2a02:26f7:c7c3:4000::/64 +2a02:26f7:c7c4:4000::/64 +2a02:26f7:c7c4:cf21::/64 +2a02:26f7:c7c4:cf22::/63 +2a02:26f7:c7c5:4000::/64 +2a02:26f7:c7c8:4000::/64 +2a02:26f7:c7c8:cf21::/64 +2a02:26f7:c7c8:cf22::/63 +2a02:26f7:c7c9:4000::/64 +2a02:26f7:c7c9:cf21::/64 +2a02:26f7:c7c9:cf22::/63 +2a02:26f7:c7ca:4000::/64 +2a02:26f7:c7cb:4000::/64 +2a02:26f7:c800:4000::/64 +2a02:26f7:c800:ca40::/63 +2a02:26f7:c801:4000::/64 +2a02:26f7:c804:4000::/64 +2a02:26f7:c804:ca40::/63 +2a02:26f7:c805:4000::/64 +2a02:26f7:c805:ca40::/63 +2a02:26f7:c806:4000::/64 +2a02:26f7:c807:4000::/64 +2a02:26f7:c808:4000::/64 +2a02:26f7:c808:ca40::/63 +2a02:26f7:c809:4000::/64 +2a02:26f7:c844:4000::/64 +2a02:26f7:c844:c1a0::/64 +2a02:26f7:c845:4000::/64 +2a02:26f7:c848:4000::/64 +2a02:26f7:c848:c1a0::/64 +2a02:26f7:c849:4000::/64 +2a02:26f7:c84c:4000::/64 +2a02:26f7:c84c:c1a0::/64 +2a02:26f7:c84d:4000::/64 +2a02:26f7:c880::/53 +2a02:26f7:c880:800::/56 +2a02:26f7:c880:900::/57 +2a02:26f7:c880:980::/58 +2a02:26f7:c880:9c0::/59 +2a02:26f7:c880:4000::/64 +2a02:26f7:c880:7000::/56 +2a02:26f7:c880:7100::/58 +2a02:26f7:c880:7140::/59 +2a02:26f7:c880:7160::/60 +2a02:26f7:c880:7170::/61 +2a02:26f7:c880:7178::/62 +2a02:26f7:c880:717c::/63 +2a02:26f7:c881:4000::/64 +2a02:26f7:c884::/53 +2a02:26f7:c884:800::/56 +2a02:26f7:c884:900::/57 +2a02:26f7:c884:980::/58 +2a02:26f7:c884:9c0::/59 +2a02:26f7:c884:4000::/64 +2a02:26f7:c884:7000::/56 +2a02:26f7:c884:7100::/58 +2a02:26f7:c884:7140::/59 +2a02:26f7:c884:7160::/60 +2a02:26f7:c884:7170::/61 +2a02:26f7:c884:7178::/62 +2a02:26f7:c884:717c::/63 +2a02:26f7:c885:4000::/64 +2a02:26f7:c888::/53 +2a02:26f7:c888:800::/56 +2a02:26f7:c888:900::/57 +2a02:26f7:c888:980::/58 +2a02:26f7:c888:9c0::/59 +2a02:26f7:c888:4000::/64 +2a02:26f7:c888:7000::/56 +2a02:26f7:c888:7100::/58 +2a02:26f7:c888:7140::/59 +2a02:26f7:c888:7160::/60 +2a02:26f7:c888:7170::/61 +2a02:26f7:c888:7178::/62 +2a02:26f7:c888:717c::/63 +2a02:26f7:c889:4000::/64 +2a02:26f7:c88c::/53 +2a02:26f7:c88c:800::/56 +2a02:26f7:c88c:900::/57 +2a02:26f7:c88c:980::/58 +2a02:26f7:c88c:9c0::/59 +2a02:26f7:c88c:4000::/64 +2a02:26f7:c88c:7000::/56 +2a02:26f7:c88c:7100::/58 +2a02:26f7:c88c:7140::/59 +2a02:26f7:c88c:7160::/60 +2a02:26f7:c88c:7170::/61 +2a02:26f7:c88c:7178::/62 +2a02:26f7:c88c:717c::/63 +2a02:26f7:c88d::/53 +2a02:26f7:c88d:800::/56 +2a02:26f7:c88d:900::/57 +2a02:26f7:c88d:980::/58 +2a02:26f7:c88d:9c0::/59 +2a02:26f7:c88d:4000::/64 +2a02:26f7:c88d:7000::/56 +2a02:26f7:c88d:7100::/58 +2a02:26f7:c88d:7140::/59 +2a02:26f7:c88d:7160::/60 +2a02:26f7:c88d:7170::/61 +2a02:26f7:c88d:7178::/62 +2a02:26f7:c88d:717c::/63 +2a02:26f7:c88e:4000::/64 +2a02:26f7:c88f:4000::/64 +2a02:26f7:c894::/53 +2a02:26f7:c894:800::/56 +2a02:26f7:c894:900::/57 +2a02:26f7:c894:980::/58 +2a02:26f7:c894:9c0::/59 +2a02:26f7:c894:4000::/64 +2a02:26f7:c894:7000::/56 +2a02:26f7:c894:7100::/58 +2a02:26f7:c894:7140::/59 +2a02:26f7:c894:7160::/60 +2a02:26f7:c894:7170::/61 +2a02:26f7:c894:7178::/62 +2a02:26f7:c894:717c::/63 +2a02:26f7:c895:4000::/64 +2a02:26f7:c89c::/53 +2a02:26f7:c89c:800::/56 +2a02:26f7:c89c:900::/57 +2a02:26f7:c89c:980::/58 +2a02:26f7:c89c:9c0::/59 +2a02:26f7:c89c:4000::/64 +2a02:26f7:c89c:7000::/56 +2a02:26f7:c89c:7100::/58 +2a02:26f7:c89c:7140::/59 +2a02:26f7:c89c:7160::/60 +2a02:26f7:c89c:7170::/61 +2a02:26f7:c89c:7178::/62 +2a02:26f7:c89c:717c::/63 +2a02:26f7:c89d:4000::/64 +2a02:26f7:c8a0::/53 +2a02:26f7:c8a0:800::/56 +2a02:26f7:c8a0:900::/57 +2a02:26f7:c8a0:980::/58 +2a02:26f7:c8a0:9c0::/59 +2a02:26f7:c8a0:4000::/64 +2a02:26f7:c8a0:7000::/56 +2a02:26f7:c8a0:7100::/58 +2a02:26f7:c8a0:7140::/59 +2a02:26f7:c8a0:7160::/60 +2a02:26f7:c8a0:7170::/61 +2a02:26f7:c8a0:7178::/62 +2a02:26f7:c8a0:717c::/63 +2a02:26f7:c8a1:4000::/64 +2a02:26f7:c8a2::/53 +2a02:26f7:c8a2:800::/56 +2a02:26f7:c8a2:900::/57 +2a02:26f7:c8a2:980::/58 +2a02:26f7:c8a2:9c0::/59 +2a02:26f7:c8a2:4000::/64 +2a02:26f7:c8a2:7000::/56 +2a02:26f7:c8a2:7100::/58 +2a02:26f7:c8a2:7140::/59 +2a02:26f7:c8a2:7160::/60 +2a02:26f7:c8a2:7170::/61 +2a02:26f7:c8a2:7178::/62 +2a02:26f7:c8a2:717c::/63 +2a02:26f7:c8a3:4000::/64 +2a02:26f7:c8c0::/54 +2a02:26f7:c8c0:400::/58 +2a02:26f7:c8c0:4000::/64 +2a02:26f7:c8c0:4d40::/58 +2a02:26f7:c8c0:e800::/57 +2a02:26f7:c8c0:e880::/58 +2a02:26f7:c8c0:e8c0::/62 +2a02:26f7:c8c0:e8c4::/63 +2a02:26f7:c8c0:e8c6::/64 +2a02:26f7:c8c1:4000::/64 +2a02:26f7:c8c4::/54 +2a02:26f7:c8c4:400::/58 +2a02:26f7:c8c4:4000::/64 +2a02:26f7:c8c4:4d40::/58 +2a02:26f7:c8c4:e800::/57 +2a02:26f7:c8c4:e880::/58 +2a02:26f7:c8c4:e8c0::/62 +2a02:26f7:c8c4:e8c4::/63 +2a02:26f7:c8c4:e8c6::/64 +2a02:26f7:c8c5:4000::/64 +2a02:26f7:c8c8::/54 +2a02:26f7:c8c8:400::/58 +2a02:26f7:c8c8:4000::/64 +2a02:26f7:c8c8:4d40::/58 +2a02:26f7:c8c8:e800::/57 +2a02:26f7:c8c8:e880::/58 +2a02:26f7:c8c8:e8c0::/62 +2a02:26f7:c8c8:e8c4::/63 +2a02:26f7:c8c8:e8c6::/64 +2a02:26f7:c8c9:4000::/64 +2a02:26f7:c8cc::/54 +2a02:26f7:c8cc:400::/58 +2a02:26f7:c8cc:4000::/64 +2a02:26f7:c8cc:4d40::/58 +2a02:26f7:c8cc:e800::/57 +2a02:26f7:c8cc:e880::/58 +2a02:26f7:c8cc:e8c0::/62 +2a02:26f7:c8cc:e8c4::/63 +2a02:26f7:c8cc:e8c6::/64 +2a02:26f7:c8cd:4000::/64 +2a02:26f7:c8d0::/54 +2a02:26f7:c8d0:400::/58 +2a02:26f7:c8d0:4000::/64 +2a02:26f7:c8d0:4d40::/58 +2a02:26f7:c8d0:e800::/57 +2a02:26f7:c8d0:e880::/58 +2a02:26f7:c8d0:e8c0::/62 +2a02:26f7:c8d0:e8c4::/63 +2a02:26f7:c8d0:e8c6::/64 +2a02:26f7:c8d1:4000::/64 +2a02:26f7:c8d4::/54 +2a02:26f7:c8d4:400::/58 +2a02:26f7:c8d4:4000::/64 +2a02:26f7:c8d4:4d40::/58 +2a02:26f7:c8d4:e800::/57 +2a02:26f7:c8d4:e880::/58 +2a02:26f7:c8d4:e8c0::/62 +2a02:26f7:c8d4:e8c4::/63 +2a02:26f7:c8d4:e8c6::/64 +2a02:26f7:c8d5:4000::/64 +2a02:26f7:c8d8::/54 +2a02:26f7:c8d8:400::/58 +2a02:26f7:c8d8:4000::/64 +2a02:26f7:c8d8:4d40::/58 +2a02:26f7:c8d8:e800::/57 +2a02:26f7:c8d8:e880::/58 +2a02:26f7:c8d8:e8c0::/62 +2a02:26f7:c8d8:e8c4::/63 +2a02:26f7:c8d8:e8c6::/64 +2a02:26f7:c8d9::/54 +2a02:26f7:c8d9:400::/58 +2a02:26f7:c8d9:4000::/64 +2a02:26f7:c8d9:4d40::/58 +2a02:26f7:c8d9:e800::/57 +2a02:26f7:c8d9:e880::/58 +2a02:26f7:c8d9:e8c0::/62 +2a02:26f7:c8d9:e8c4::/63 +2a02:26f7:c8d9:e8c6::/64 +2a02:26f7:c8da:4000::/64 +2a02:26f7:c8db:4000::/64 +2a02:26f7:c900:4000::/64 +2a02:26f7:c900:d780::/58 +2a02:26f7:c900:d7c0::/63 +2a02:26f7:c900:d7c2::/64 +2a02:26f7:c901:4000::/64 +2a02:26f7:c904:4000::/64 +2a02:26f7:c904:d780::/58 +2a02:26f7:c904:d7c0::/63 +2a02:26f7:c904:d7c2::/64 +2a02:26f7:c905:4000::/64 +2a02:26f7:c908:4000::/64 +2a02:26f7:c908:d780::/58 +2a02:26f7:c908:d7c0::/63 +2a02:26f7:c908:d7c2::/64 +2a02:26f7:c909:4000::/64 +2a02:26f7:c940::/54 +2a02:26f7:c940:400::/56 +2a02:26f7:c940:500::/58 +2a02:26f7:c940:540::/60 +2a02:26f7:c940:4000::/64 +2a02:26f7:c940:4b40::/58 +2a02:26f7:c940:f800::/56 +2a02:26f7:c940:f900::/57 +2a02:26f7:c940:f980::/58 +2a02:26f7:c940:f9c0::/61 +2a02:26f7:c940:f9c8::/62 +2a02:26f7:c940:f9cc::/63 +2a02:26f7:c941:4000::/64 +2a02:26f7:c944::/54 +2a02:26f7:c944:400::/56 +2a02:26f7:c944:500::/58 +2a02:26f7:c944:540::/60 +2a02:26f7:c944:4000::/64 +2a02:26f7:c944:4b40::/58 +2a02:26f7:c944:f800::/56 +2a02:26f7:c944:f900::/57 +2a02:26f7:c944:f980::/58 +2a02:26f7:c944:f9c0::/61 +2a02:26f7:c944:f9c8::/62 +2a02:26f7:c944:f9cc::/63 +2a02:26f7:c945:4000::/64 +2a02:26f7:c948:4000::/64 +2a02:26f7:c949::/54 +2a02:26f7:c949:400::/56 +2a02:26f7:c949:500::/58 +2a02:26f7:c949:540::/60 +2a02:26f7:c949:4000::/64 +2a02:26f7:c949:4b40::/58 +2a02:26f7:c949:f800::/56 +2a02:26f7:c949:f900::/57 +2a02:26f7:c949:f980::/58 +2a02:26f7:c949:f9c0::/61 +2a02:26f7:c949:f9c8::/62 +2a02:26f7:c949:f9cc::/63 +2a02:26f7:c94c:4000::/64 +2a02:26f7:c94d::/54 +2a02:26f7:c94d:400::/56 +2a02:26f7:c94d:500::/58 +2a02:26f7:c94d:540::/60 +2a02:26f7:c94d:4000::/64 +2a02:26f7:c94d:4b40::/58 +2a02:26f7:c94d:f800::/56 +2a02:26f7:c94d:f900::/57 +2a02:26f7:c94d:f980::/58 +2a02:26f7:c94d:f9c0::/61 +2a02:26f7:c94d:f9c8::/62 +2a02:26f7:c94d:f9cc::/63 +2a02:26f7:c980:4000::/64 +2a02:26f7:c980:4600::/59 +2a02:26f7:c980:4620::/60 +2a02:26f7:c980:4630::/61 +2a02:26f7:c980:4638::/64 +2a02:26f7:c981:4000::/64 +2a02:26f7:c984:4000::/64 +2a02:26f7:c984:4600::/59 +2a02:26f7:c984:4620::/60 +2a02:26f7:c984:4630::/61 +2a02:26f7:c984:4638::/64 +2a02:26f7:c985:4000::/64 +2a02:26f7:c988:4000::/64 +2a02:26f7:c988:4600::/59 +2a02:26f7:c988:4620::/60 +2a02:26f7:c988:4630::/61 +2a02:26f7:c988:4638::/64 +2a02:26f7:c989:4000::/64 +2a02:26f7:c9c0::/53 +2a02:26f7:c9c0:800::/56 +2a02:26f7:c9c0:900::/57 +2a02:26f7:c9c0:980::/58 +2a02:26f7:c9c0:4000::/64 +2a02:26f7:c9c0:6400::/56 +2a02:26f7:c9c0:6500::/57 +2a02:26f7:c9c0:6580::/58 +2a02:26f7:c9c0:65c0::/60 +2a02:26f7:c9c0:65d0::/61 +2a02:26f7:c9c0:65d8::/62 +2a02:26f7:c9c0:65dc::/63 +2a02:26f7:c9c1:4000::/64 +2a02:26f7:c9c4::/53 +2a02:26f7:c9c4:800::/56 +2a02:26f7:c9c4:900::/57 +2a02:26f7:c9c4:980::/58 +2a02:26f7:c9c4:4000::/64 +2a02:26f7:c9c4:6400::/56 +2a02:26f7:c9c4:6500::/57 +2a02:26f7:c9c4:6580::/58 +2a02:26f7:c9c4:65c0::/60 +2a02:26f7:c9c4:65d0::/61 +2a02:26f7:c9c4:65d8::/62 +2a02:26f7:c9c4:65dc::/63 +2a02:26f7:c9c5:4000::/64 +2a02:26f7:c9c8::/53 +2a02:26f7:c9c8:800::/56 +2a02:26f7:c9c8:900::/57 +2a02:26f7:c9c8:980::/58 +2a02:26f7:c9c8:4000::/64 +2a02:26f7:c9c8:6400::/56 +2a02:26f7:c9c8:6500::/57 +2a02:26f7:c9c8:6580::/58 +2a02:26f7:c9c8:65c0::/60 +2a02:26f7:c9c8:65d0::/61 +2a02:26f7:c9c8:65d8::/62 +2a02:26f7:c9c8:65dc::/63 +2a02:26f7:c9c9:4000::/64 +2a02:26f7:c9cd::/53 +2a02:26f7:c9cd:800::/56 +2a02:26f7:c9cd:900::/57 +2a02:26f7:c9cd:980::/58 +2a02:26f7:c9cd:4000::/64 +2a02:26f7:c9cd:6400::/56 +2a02:26f7:c9cd:6500::/57 +2a02:26f7:c9cd:6580::/58 +2a02:26f7:c9cd:65c0::/60 +2a02:26f7:c9cd:65d0::/61 +2a02:26f7:c9cd:65d8::/62 +2a02:26f7:c9cd:65dc::/63 +2a02:26f7:c9cf:4000::/64 +2a02:26f7:c9d0::/53 +2a02:26f7:c9d0:800::/56 +2a02:26f7:c9d0:900::/57 +2a02:26f7:c9d0:980::/58 +2a02:26f7:c9d0:4000::/64 +2a02:26f7:c9d0:6400::/56 +2a02:26f7:c9d0:6500::/57 +2a02:26f7:c9d0:6580::/58 +2a02:26f7:c9d0:65c0::/60 +2a02:26f7:c9d0:65d0::/61 +2a02:26f7:c9d0:65d8::/62 +2a02:26f7:c9d0:65dc::/63 +2a02:26f7:c9d1:4000::/64 +2a02:26f7:c9d4::/53 +2a02:26f7:c9d4:800::/56 +2a02:26f7:c9d4:900::/57 +2a02:26f7:c9d4:980::/58 +2a02:26f7:c9d4:4000::/64 +2a02:26f7:c9d4:6400::/56 +2a02:26f7:c9d4:6500::/57 +2a02:26f7:c9d4:6580::/58 +2a02:26f7:c9d4:65c0::/60 +2a02:26f7:c9d4:65d0::/61 +2a02:26f7:c9d4:65d8::/62 +2a02:26f7:c9d4:65dc::/63 +2a02:26f7:c9d5:4000::/64 +2a02:26f7:ca00::/54 +2a02:26f7:ca00:400::/56 +2a02:26f7:ca00:500::/59 +2a02:26f7:ca00:520::/60 +2a02:26f7:ca00:4000::/64 +2a02:26f7:ca00:4340::/58 +2a02:26f7:ca00:df00::/58 +2a02:26f7:ca00:df40::/62 +2a02:26f7:ca00:df44::/63 +2a02:26f7:ca01:4000::/64 +2a02:26f7:ca04::/54 +2a02:26f7:ca04:400::/56 +2a02:26f7:ca04:500::/59 +2a02:26f7:ca04:520::/60 +2a02:26f7:ca04:4000::/64 +2a02:26f7:ca04:4340::/58 +2a02:26f7:ca04:df00::/58 +2a02:26f7:ca04:df40::/62 +2a02:26f7:ca04:df44::/63 +2a02:26f7:ca05::/54 +2a02:26f7:ca05:400::/56 +2a02:26f7:ca05:500::/59 +2a02:26f7:ca05:520::/60 +2a02:26f7:ca05:4000::/64 +2a02:26f7:ca05:4340::/58 +2a02:26f7:ca05:df00::/58 +2a02:26f7:ca05:df40::/62 +2a02:26f7:ca05:df44::/63 +2a02:26f7:ca06:4000::/64 +2a02:26f7:ca07:4000::/64 +2a02:26f7:ca08::/54 +2a02:26f7:ca08:400::/56 +2a02:26f7:ca08:500::/59 +2a02:26f7:ca08:520::/60 +2a02:26f7:ca08:4000::/64 +2a02:26f7:ca08:4340::/58 +2a02:26f7:ca08:df00::/58 +2a02:26f7:ca08:df40::/62 +2a02:26f7:ca08:df44::/63 +2a02:26f7:ca09:4000::/64 +2a02:26f7:ca0c::/54 +2a02:26f7:ca0c:400::/56 +2a02:26f7:ca0c:500::/59 +2a02:26f7:ca0c:520::/60 +2a02:26f7:ca0c:4000::/64 +2a02:26f7:ca0c:4340::/58 +2a02:26f7:ca0c:df00::/58 +2a02:26f7:ca0c:df40::/62 +2a02:26f7:ca0c:df44::/63 +2a02:26f7:ca0d:4000::/64 +2a02:26f7:ca40:4000::/64 +2a02:26f7:ca40:d400::/60 +2a02:26f7:ca40:d410::/61 +2a02:26f7:ca40:d418::/63 +2a02:26f7:ca41:4000::/64 +2a02:26f7:ca44:4000::/64 +2a02:26f7:ca44:d400::/60 +2a02:26f7:ca44:d410::/61 +2a02:26f7:ca44:d418::/63 +2a02:26f7:ca45:4000::/64 +2a02:26f7:ca48:4000::/64 +2a02:26f7:ca48:d400::/60 +2a02:26f7:ca48:d410::/61 +2a02:26f7:ca48:d418::/63 +2a02:26f7:ca49:4000::/64 +2a02:26f7:ca80::/54 +2a02:26f7:ca80:400::/56 +2a02:26f7:ca80:4000::/64 +2a02:26f7:ca80:4080::/58 +2a02:26f7:ca80:e200::/58 +2a02:26f7:ca80:e240::/59 +2a02:26f7:ca80:e260::/62 +2a02:26f7:ca80:e264::/64 +2a02:26f7:ca81:4000::/64 +2a02:26f7:ca84::/54 +2a02:26f7:ca84:400::/56 +2a02:26f7:ca84:4000::/64 +2a02:26f7:ca84:4080::/58 +2a02:26f7:ca84:e200::/58 +2a02:26f7:ca84:e240::/59 +2a02:26f7:ca84:e260::/62 +2a02:26f7:ca84:e264::/64 +2a02:26f7:ca85:4000::/64 +2a02:26f7:ca88::/54 +2a02:26f7:ca88:400::/56 +2a02:26f7:ca88:4000::/64 +2a02:26f7:ca88:4080::/58 +2a02:26f7:ca88:e200::/58 +2a02:26f7:ca88:e240::/59 +2a02:26f7:ca88:e260::/62 +2a02:26f7:ca88:e264::/64 +2a02:26f7:ca89:4000::/64 +2a02:26f7:ca8c::/54 +2a02:26f7:ca8c:400::/56 +2a02:26f7:ca8c:4000::/64 +2a02:26f7:ca8c:4080::/58 +2a02:26f7:ca8c:e200::/58 +2a02:26f7:ca8c:e240::/59 +2a02:26f7:ca8c:e260::/62 +2a02:26f7:ca8c:e264::/64 +2a02:26f7:ca8d::/54 +2a02:26f7:ca8d:400::/56 +2a02:26f7:ca8d:4000::/64 +2a02:26f7:ca8d:4080::/58 +2a02:26f7:ca8d:e200::/58 +2a02:26f7:ca8d:e240::/59 +2a02:26f7:ca8d:e260::/62 +2a02:26f7:ca8d:e264::/64 +2a02:26f7:ca8e:4000::/64 +2a02:26f7:ca8f:4000::/64 +2a02:26f7:cac0:4000::/64 +2a02:26f7:cac0:c760::/64 +2a02:26f7:cac1:4000::/64 +2a02:26f7:cac2:4000::/64 +2a02:26f7:cac2:c760::/64 +2a02:26f7:cac3:4000::/64 +2a02:26f7:cac4:4000::/64 +2a02:26f7:cac4:c760::/64 +2a02:26f7:cac5:4000::/64 +2a02:26f7:cac6:4000::/64 +2a02:26f7:cac6:c760::/64 +2a02:26f7:cac7:4000::/64 +2a02:26f7:cacc:4000::/64 +2a02:26f7:cacc:c760::/64 +2a02:26f7:cacd:4000::/64 +2a02:26f7:cad0:4000::/64 +2a02:26f7:cad0:c760::/64 +2a02:26f7:cad1:4000::/64 +2a02:26f7:cb00::/54 +2a02:26f7:cb00:400::/56 +2a02:26f7:cb00:500::/58 +2a02:26f7:cb00:4000::/64 +2a02:26f7:cb00:5280::/58 +2a02:26f7:cb00:52c0::/60 +2a02:26f7:cb00:52d0::/61 +2a02:26f7:cb00:52d8::/63 +2a02:26f7:cb01:4000::/64 +2a02:26f7:cb02::/54 +2a02:26f7:cb02:400::/56 +2a02:26f7:cb02:500::/58 +2a02:26f7:cb02:4000::/64 +2a02:26f7:cb02:5280::/58 +2a02:26f7:cb02:52c0::/60 +2a02:26f7:cb02:52d0::/61 +2a02:26f7:cb02:52d8::/63 +2a02:26f7:cb03:4000::/64 +2a02:26f7:cb04::/54 +2a02:26f7:cb04:400::/56 +2a02:26f7:cb04:500::/58 +2a02:26f7:cb04:4000::/64 +2a02:26f7:cb04:5280::/58 +2a02:26f7:cb04:52c0::/60 +2a02:26f7:cb04:52d0::/61 +2a02:26f7:cb04:52d8::/63 +2a02:26f7:cb05:4000::/64 +2a02:26f7:cb0c::/54 +2a02:26f7:cb0c:400::/56 +2a02:26f7:cb0c:500::/58 +2a02:26f7:cb0c:4000::/64 +2a02:26f7:cb0c:5280::/58 +2a02:26f7:cb0c:52c0::/60 +2a02:26f7:cb0c:52d0::/61 +2a02:26f7:cb0c:52d8::/63 +2a02:26f7:cb0d:4000::/64 +2a02:26f7:cb10::/54 +2a02:26f7:cb10:400::/56 +2a02:26f7:cb10:500::/58 +2a02:26f7:cb10:4000::/64 +2a02:26f7:cb10:5280::/58 +2a02:26f7:cb10:52c0::/60 +2a02:26f7:cb10:52d0::/61 +2a02:26f7:cb10:52d8::/63 +2a02:26f7:cb11:4000::/64 +2a02:26f7:cb40:4000::/64 +2a02:26f7:cb40:cf80::/62 +2a02:26f7:cb40:cf84::/64 +2a02:26f7:cb41:4000::/64 +2a02:26f7:cb44:4000::/64 +2a02:26f7:cb44:cf80::/62 +2a02:26f7:cb44:cf84::/64 +2a02:26f7:cb45:4000::/64 +2a02:26f7:cb48:4000::/64 +2a02:26f7:cb48:cf80::/62 +2a02:26f7:cb48:cf84::/64 +2a02:26f7:cb49:4000::/64 +2a02:26f7:cb80:4000::/64 +2a02:26f7:cb80:c480::/64 +2a02:26f7:cb81:4000::/64 +2a02:26f7:cb84:4000::/64 +2a02:26f7:cb84:c480::/64 +2a02:26f7:cb85:4000::/64 +2a02:26f7:cb88:4000::/64 +2a02:26f7:cb88:c480::/64 +2a02:26f7:cb89:4000::/64 +2a02:26f7:cbc0:4000::/64 +2a02:26f7:cbc0:c340::/64 +2a02:26f7:cbc1:4000::/64 +2a02:26f7:cbc2:4000::/64 +2a02:26f7:cbc2:c340::/64 +2a02:26f7:cbc3:4000::/64 +2a02:26f7:cbc4:4000::/64 +2a02:26f7:cbc4:c340::/64 +2a02:26f7:cbc5:4000::/64 +2a02:26f7:cbc6:4000::/64 +2a02:26f7:cbc6:c340::/64 +2a02:26f7:cbc7:4000::/64 +2a02:26f7:cbcc:4000::/64 +2a02:26f7:cbcc:c340::/64 +2a02:26f7:cbcd:4000::/64 +2a02:26f7:cc00:4000::/64 +2a02:26f7:cc00:cb00::/63 +2a02:26f7:cc01:4000::/64 +2a02:26f7:cc04:4000::/64 +2a02:26f7:cc04:cb00::/63 +2a02:26f7:cc05:4000::/64 +2a02:26f7:cc08:4000::/64 +2a02:26f7:cc08:cb00::/63 +2a02:26f7:cc09:4000::/64 +2a02:26f7:cc40:4000::/64 +2a02:26f7:cc40:c180::/64 +2a02:26f7:cc41:4000::/64 +2a02:26f7:cc42:4000::/64 +2a02:26f7:cc42:c180::/64 +2a02:26f7:cc43:4000::/64 +2a02:26f7:cc44:4000::/64 +2a02:26f7:cc44:c180::/64 +2a02:26f7:cc45:4000::/64 +2a02:26f7:cc4c:4000::/64 +2a02:26f7:cc4c:c180::/64 +2a02:26f7:cc4d:4000::/64 +2a02:26f7:cc50:4000::/64 +2a02:26f7:cc50:c180::/64 +2a02:26f7:cc51:4000::/64 +2a02:26f7:cc54:4000::/64 +2a02:26f7:cc54:c180::/64 +2a02:26f7:cc55:4000::/64 +2a02:26f7:cc80:4000::/64 +2a02:26f7:cc80:ca20::/63 +2a02:26f7:cc81:4000::/64 +2a02:26f7:cc82:4000::/64 +2a02:26f7:cc82:ca20::/63 +2a02:26f7:cc83:4000::/64 +2a02:26f7:cc84:4000::/64 +2a02:26f7:cc84:ca20::/63 +2a02:26f7:cc85:4000::/64 +2a02:26f7:cc88:4000::/64 +2a02:26f7:cc88:ca20::/63 +2a02:26f7:cc89:4000::/64 +2a02:26f7:cc8c:4000::/64 +2a02:26f7:cc8c:ca20::/63 +2a02:26f7:cc8d:4000::/64 +2a02:26f7:cc90:4000::/64 +2a02:26f7:cc90:ca20::/63 +2a02:26f7:cc91:4000::/64 +2a02:26f7:ccc0::/54 +2a02:26f7:ccc0:400::/56 +2a02:26f7:ccc0:4000::/64 +2a02:26f7:ccc0:4700::/59 +2a02:26f7:ccc0:4720::/60 +2a02:26f7:ccc0:4730::/63 +2a02:26f7:ccc1:4000::/64 +2a02:26f7:ccc2::/54 +2a02:26f7:ccc2:400::/56 +2a02:26f7:ccc2:4000::/64 +2a02:26f7:ccc2:4700::/59 +2a02:26f7:ccc2:4720::/60 +2a02:26f7:ccc2:4730::/63 +2a02:26f7:ccc3:4000::/64 +2a02:26f7:ccc4::/54 +2a02:26f7:ccc4:400::/56 +2a02:26f7:ccc4:4000::/64 +2a02:26f7:ccc4:4700::/59 +2a02:26f7:ccc4:4720::/60 +2a02:26f7:ccc4:4730::/63 +2a02:26f7:ccc5:4000::/64 +2a02:26f7:ccc8::/54 +2a02:26f7:ccc8:400::/56 +2a02:26f7:ccc8:4000::/64 +2a02:26f7:ccc8:4700::/59 +2a02:26f7:ccc8:4720::/60 +2a02:26f7:ccc8:4730::/63 +2a02:26f7:ccc9:4000::/64 +2a02:26f7:cccc::/54 +2a02:26f7:cccc:400::/56 +2a02:26f7:cccc:4000::/64 +2a02:26f7:cccc:4700::/59 +2a02:26f7:cccc:4720::/60 +2a02:26f7:cccc:4730::/63 +2a02:26f7:cccd:4000::/64 +2a02:26f7:ccd0::/54 +2a02:26f7:ccd0:400::/56 +2a02:26f7:ccd0:4000::/64 +2a02:26f7:ccd0:4700::/59 +2a02:26f7:ccd0:4720::/60 +2a02:26f7:ccd0:4730::/63 +2a02:26f7:ccd1:4000::/64 +2a02:26f7:cd00:4000::/64 +2a02:26f7:cd00:c2a0::/64 +2a02:26f7:cd01:4000::/64 +2a02:26f7:cd04:4000::/64 +2a02:26f7:cd04:c2a0::/64 +2a02:26f7:cd05:4000::/64 +2a02:26f7:cd08:4000::/64 +2a02:26f7:cd08:c2a0::/64 +2a02:26f7:cd09:4000::/64 +2a02:26f7:cd42::/52 +2a02:26f7:cd42:1000::/55 +2a02:26f7:cd42:1200::/57 +2a02:26f7:cd42:4000::/64 +2a02:26f7:cd42:7400::/56 +2a02:26f7:cd42:7500::/57 +2a02:26f7:cd42:7580::/58 +2a02:26f7:cd42:75c0::/59 +2a02:26f7:cd42:75e0::/62 +2a02:26f7:cd42:fff0::/64 +2a02:26f7:cd43:4000::/64 +2a02:26f7:cd46::/52 +2a02:26f7:cd46:1000::/55 +2a02:26f7:cd46:1200::/57 +2a02:26f7:cd46:4000::/64 +2a02:26f7:cd46:7400::/56 +2a02:26f7:cd46:7500::/57 +2a02:26f7:cd46:7580::/58 +2a02:26f7:cd46:75c0::/59 +2a02:26f7:cd46:75e0::/62 +2a02:26f7:cd46:fff0::/64 +2a02:26f7:cd47:4000::/64 +2a02:26f7:cd48::/52 +2a02:26f7:cd48:1000::/55 +2a02:26f7:cd48:1200::/57 +2a02:26f7:cd48:4000::/64 +2a02:26f7:cd48:7400::/56 +2a02:26f7:cd48:7500::/57 +2a02:26f7:cd48:7580::/58 +2a02:26f7:cd48:75c0::/59 +2a02:26f7:cd48:75e0::/62 +2a02:26f7:cd48:fff0::/64 +2a02:26f7:cd49:4000::/64 +2a02:26f7:cd4c::/52 +2a02:26f7:cd4c:1000::/55 +2a02:26f7:cd4c:1200::/57 +2a02:26f7:cd4c:4000::/64 +2a02:26f7:cd4c:7400::/56 +2a02:26f7:cd4c:7500::/57 +2a02:26f7:cd4c:7580::/58 +2a02:26f7:cd4c:75c0::/59 +2a02:26f7:cd4c:75e0::/62 +2a02:26f7:cd4c:fff0::/64 +2a02:26f7:cd4d:4000::/64 +2a02:26f7:cd50::/52 +2a02:26f7:cd50:1000::/55 +2a02:26f7:cd50:1200::/57 +2a02:26f7:cd50:4000::/64 +2a02:26f7:cd50:7400::/56 +2a02:26f7:cd50:7500::/57 +2a02:26f7:cd50:7580::/58 +2a02:26f7:cd50:75c0::/59 +2a02:26f7:cd50:75e0::/62 +2a02:26f7:cd50:fff0::/64 +2a02:26f7:cd51:4000::/64 +2a02:26f7:cd54::/52 +2a02:26f7:cd54:1000::/55 +2a02:26f7:cd54:1200::/57 +2a02:26f7:cd54:4000::/64 +2a02:26f7:cd54:7400::/56 +2a02:26f7:cd54:7500::/57 +2a02:26f7:cd54:7580::/58 +2a02:26f7:cd54:75c0::/59 +2a02:26f7:cd54:75e0::/62 +2a02:26f7:cd54:fff0::/64 +2a02:26f7:cd55::/52 +2a02:26f7:cd55:1000::/55 +2a02:26f7:cd55:1200::/57 +2a02:26f7:cd55:4000::/64 +2a02:26f7:cd55:7400::/56 +2a02:26f7:cd55:7500::/57 +2a02:26f7:cd55:7580::/58 +2a02:26f7:cd55:75c0::/59 +2a02:26f7:cd55:75e0::/62 +2a02:26f7:cd55:fff0::/64 +2a02:26f7:cd56:4000::/64 +2a02:26f7:cd57:4000::/64 +2a02:26f7:cd80:4000::/64 +2a02:26f7:cd80:4580::/63 +2a02:26f7:cd81:4000::/64 +2a02:26f7:cd82:4000::/64 +2a02:26f7:cd82:4580::/63 +2a02:26f7:cd83:4000::/64 +2a02:26f7:cd84:4000::/64 +2a02:26f7:cd84:4580::/63 +2a02:26f7:cd85:4000::/64 +2a02:26f7:cd88:4000::/64 +2a02:26f7:cd88:4580::/63 +2a02:26f7:cd89:4000::/64 +2a02:26f7:cd8c:4000::/64 +2a02:26f7:cd8c:4580::/63 +2a02:26f7:cd8d:4000::/64 +2a02:26f7:cdc0:4000::/64 +2a02:26f7:cdc0:c900::/64 +2a02:26f7:cdc1:4000::/64 +2a02:26f7:cdc4:4000::/64 +2a02:26f7:cdc4:c900::/64 +2a02:26f7:cdc5:4000::/64 +2a02:26f7:cdc8:4000::/64 +2a02:26f7:cdc8:c900::/64 +2a02:26f7:cdc9:4000::/64 +2a02:26f7:cdcc:4000::/64 +2a02:26f7:cdcc:c900::/64 +2a02:26f7:cdcd:4000::/64 +2a02:26f7:ce00:4000::/64 +2a02:26f7:ce00:d2c0::/62 +2a02:26f7:ce00:d2c4::/64 +2a02:26f7:ce00:d2c6::/63 +2a02:26f7:ce00:d2c8::/62 +2a02:26f7:ce00:d2cc::/63 +2a02:26f7:ce01:4000::/64 +2a02:26f7:ce04:4000::/64 +2a02:26f7:ce04:d2c0::/62 +2a02:26f7:ce04:d2c4::/64 +2a02:26f7:ce04:d2c6::/63 +2a02:26f7:ce04:d2c8::/62 +2a02:26f7:ce04:d2cc::/63 +2a02:26f7:ce05:4000::/64 +2a02:26f7:ce08:4000::/64 +2a02:26f7:ce08:d2c0::/62 +2a02:26f7:ce08:d2c4::/64 +2a02:26f7:ce08:d2c6::/63 +2a02:26f7:ce08:d2c8::/62 +2a02:26f7:ce08:d2cc::/63 +2a02:26f7:ce09:4000::/64 +2a02:26f7:ce0c:4000::/64 +2a02:26f7:ce0c:d2c0::/62 +2a02:26f7:ce0c:d2c4::/64 +2a02:26f7:ce0c:d2c6::/63 +2a02:26f7:ce0c:d2c8::/62 +2a02:26f7:ce0c:d2cc::/63 +2a02:26f7:ce0d:4000::/64 +2a02:26f7:ce40:4000::/64 +2a02:26f7:ce40:d060::/62 +2a02:26f7:ce40:d064::/63 +2a02:26f7:ce40:d066::/64 +2a02:26f7:ce41:4000::/64 +2a02:26f7:ce44:4000::/64 +2a02:26f7:ce44:d060::/62 +2a02:26f7:ce44:d064::/63 +2a02:26f7:ce44:d066::/64 +2a02:26f7:ce45:4000::/64 +2a02:26f7:ce48:4000::/64 +2a02:26f7:ce48:d060::/62 +2a02:26f7:ce48:d064::/63 +2a02:26f7:ce48:d066::/64 +2a02:26f7:ce49:4000::/64 +2a02:26f7:ce4c:4000::/64 +2a02:26f7:ce4c:d060::/62 +2a02:26f7:ce4c:d064::/63 +2a02:26f7:ce4c:d066::/64 +2a02:26f7:ce4d:4000::/64 +2a02:26f7:ce80:4000::/64 +2a02:26f7:ce80:d040::/62 +2a02:26f7:ce80:d044::/63 +2a02:26f7:ce80:d046::/64 +2a02:26f7:ce81:4000::/64 +2a02:26f7:ce88:4000::/64 +2a02:26f7:ce88:d040::/62 +2a02:26f7:ce88:d044::/63 +2a02:26f7:ce88:d046::/64 +2a02:26f7:ce89:4000::/64 +2a02:26f7:ce8c:4000::/64 +2a02:26f7:ce8c:d040::/62 +2a02:26f7:ce8c:d044::/63 +2a02:26f7:ce8c:d046::/64 +2a02:26f7:ce8d:4000::/64 +2a02:26f7:cec0:4000::/64 +2a02:26f7:cec0:cf00::/62 +2a02:26f7:cec0:cf04::/64 +2a02:26f7:cec1:4000::/64 +2a02:26f7:cec8:4000::/64 +2a02:26f7:cec8:cf00::/62 +2a02:26f7:cec8:cf04::/64 +2a02:26f7:cec9:4000::/64 +2a02:26f7:cec9:cf00::/62 +2a02:26f7:cec9:cf04::/64 +2a02:26f7:ceca:4000::/64 +2a02:26f7:cecb:4000::/64 +2a02:26f7:cecc:4000::/64 +2a02:26f7:cecc:cf00::/62 +2a02:26f7:cecc:cf04::/64 +2a02:26f7:cecd:4000::/64 +2a02:26f7:ced0:4000::/64 +2a02:26f7:ced0:cf00::/62 +2a02:26f7:ced0:cf04::/64 +2a02:26f7:ced1:4000::/64 +2a02:26f7:cf00:4000::/64 +2a02:26f7:cf00:d1a0::/61 +2a02:26f7:cf00:d1a8::/63 +2a02:26f7:cf01:4000::/64 +2a02:26f7:cf08:4000::/64 +2a02:26f7:cf08:d1a0::/61 +2a02:26f7:cf08:d1a8::/63 +2a02:26f7:cf09:4000::/64 +2a02:26f7:cf09:d1a0::/61 +2a02:26f7:cf09:d1a8::/63 +2a02:26f7:cf0a:4000::/64 +2a02:26f7:cf0b:4000::/64 +2a02:26f7:cf0c:4000::/64 +2a02:26f7:cf0c:d1a0::/61 +2a02:26f7:cf0c:d1a8::/63 +2a02:26f7:cf0d:4000::/64 +2a02:26f7:cf10:4000::/64 +2a02:26f7:cf10:d1a0::/61 +2a02:26f7:cf10:d1a8::/63 +2a02:26f7:cf11:4000::/64 +2a02:26f7:cf40:4000::/64 +2a02:26f7:cf40:cc00::/63 +2a02:26f7:cf41:4000::/64 +2a02:26f7:cf44:4000::/64 +2a02:26f7:cf44:cc00::/63 +2a02:26f7:cf45:4000::/64 +2a02:26f7:cf48:4000::/64 +2a02:26f7:cf48:cc00::/63 +2a02:26f7:cf49:4000::/64 +2a02:26f7:cf4c:4000::/64 +2a02:26f7:cf4c:cc00::/63 +2a02:26f7:cf4d:4000::/64 +2a02:26f7:cf80::/53 +2a02:26f7:cf80:800::/60 +2a02:26f7:cf80:4000::/64 +2a02:26f7:cf80:4a80::/58 +2a02:26f7:cf80:e300::/58 +2a02:26f7:cf80:e340::/59 +2a02:26f7:cf80:e360::/61 +2a02:26f7:cf80:e368::/62 +2a02:26f7:cf81:4000::/64 +2a02:26f7:cf84::/53 +2a02:26f7:cf84:800::/60 +2a02:26f7:cf84:4000::/64 +2a02:26f7:cf84:4a80::/58 +2a02:26f7:cf84:e300::/58 +2a02:26f7:cf84:e340::/59 +2a02:26f7:cf84:e360::/61 +2a02:26f7:cf84:e368::/62 +2a02:26f7:cf85:4000::/64 +2a02:26f7:cf88::/53 +2a02:26f7:cf88:800::/60 +2a02:26f7:cf88:4000::/64 +2a02:26f7:cf88:4a80::/58 +2a02:26f7:cf88:e300::/58 +2a02:26f7:cf88:e340::/59 +2a02:26f7:cf88:e360::/61 +2a02:26f7:cf88:e368::/62 +2a02:26f7:cf89:4000::/64 +2a02:26f7:cf8c::/53 +2a02:26f7:cf8c:800::/60 +2a02:26f7:cf8c:4000::/64 +2a02:26f7:cf8c:4a80::/58 +2a02:26f7:cf8c:e300::/58 +2a02:26f7:cf8c:e340::/59 +2a02:26f7:cf8c:e360::/61 +2a02:26f7:cf8c:e368::/62 +2a02:26f7:cf8d:4000::/64 +2a02:26f7:cf90::/53 +2a02:26f7:cf90:800::/60 +2a02:26f7:cf90:4000::/64 +2a02:26f7:cf90:4a80::/58 +2a02:26f7:cf90:e300::/58 +2a02:26f7:cf90:e340::/59 +2a02:26f7:cf90:e360::/61 +2a02:26f7:cf90:e368::/62 +2a02:26f7:cf91:4000::/64 +2a02:26f7:cf94::/53 +2a02:26f7:cf94:800::/60 +2a02:26f7:cf94:4000::/64 +2a02:26f7:cf94:4a80::/58 +2a02:26f7:cf94:e300::/58 +2a02:26f7:cf94:e340::/59 +2a02:26f7:cf94:e360::/61 +2a02:26f7:cf94:e368::/62 +2a02:26f7:cf95:4000::/64 +2a02:26f7:cfc0:4000::/64 +2a02:26f7:cfc0:d500::/60 +2a02:26f7:cfc0:d510::/61 +2a02:26f7:cfc0:d518::/62 +2a02:26f7:cfc0:d51c::/63 +2a02:26f7:cfc1:4000::/64 +2a02:26f7:cfc4:4000::/64 +2a02:26f7:cfc4:d500::/60 +2a02:26f7:cfc4:d510::/61 +2a02:26f7:cfc4:d518::/62 +2a02:26f7:cfc4:d51c::/63 +2a02:26f7:cfc5:4000::/64 +2a02:26f7:cfc8:4000::/64 +2a02:26f7:cfc8:d500::/60 +2a02:26f7:cfc8:d510::/61 +2a02:26f7:cfc8:d518::/62 +2a02:26f7:cfc8:d51c::/63 +2a02:26f7:cfc9:4000::/64 +2a02:26f7:cfcc:4000::/64 +2a02:26f7:cfcc:d500::/60 +2a02:26f7:cfcc:d510::/61 +2a02:26f7:cfcc:d518::/62 +2a02:26f7:cfcc:d51c::/63 +2a02:26f7:cfcd:4000::/64 +2a02:26f7:cfd0:4000::/64 +2a02:26f7:cfd0:d500::/60 +2a02:26f7:cfd0:d510::/61 +2a02:26f7:cfd0:d518::/62 +2a02:26f7:cfd0:d51c::/63 +2a02:26f7:cfd1:4000::/64 +2a02:26f7:d000:4000::/64 +2a02:26f7:d001:4000::/64 +2a02:26f7:d004:4000::/64 +2a02:26f7:d005:4000::/64 +2a02:26f7:d008:4000::/64 +2a02:26f7:d009:4000::/64 +2a02:26f7:d00c:4000::/64 +2a02:26f7:d00d:4000::/64 +2a02:26f7:d040:4000::/64 +2a02:26f7:d041:4000::/64 +2a02:26f7:d044:4000::/64 +2a02:26f7:d045:4000::/64 +2a02:26f7:d048:4000::/64 +2a02:26f7:d049:4000::/64 +2a02:26f7:d04c:4000::/64 +2a02:26f7:d04d:4000::/64 +2a02:26f7:d080:4000::/64 +2a02:26f7:d080:cd80::/63 +2a02:26f7:d080:cd82::/64 +2a02:26f7:d081:4000::/64 +2a02:26f7:d084:4000::/64 +2a02:26f7:d084:cd80::/63 +2a02:26f7:d084:cd82::/64 +2a02:26f7:d085:4000::/64 +2a02:26f7:d088:4000::/64 +2a02:26f7:d088:cd80::/63 +2a02:26f7:d088:cd82::/64 +2a02:26f7:d089:4000::/64 +2a02:26f7:d0c0:4000::/64 +2a02:26f7:d0c0:d440::/60 +2a02:26f7:d0c0:d450::/61 +2a02:26f7:d0c0:d458::/63 +2a02:26f7:d0c1:4000::/64 +2a02:26f7:d0c4:4000::/64 +2a02:26f7:d0c4:d440::/60 +2a02:26f7:d0c4:d450::/61 +2a02:26f7:d0c4:d458::/63 +2a02:26f7:d0c5:4000::/64 +2a02:26f7:d0c8:4000::/64 +2a02:26f7:d0c8:d440::/60 +2a02:26f7:d0c8:d450::/61 +2a02:26f7:d0c8:d458::/63 +2a02:26f7:d0c9:4000::/64 +2a02:26f7:d0cc:4000::/64 +2a02:26f7:d0cc:d440::/60 +2a02:26f7:d0cc:d450::/61 +2a02:26f7:d0cc:d458::/63 +2a02:26f7:d0cd:4000::/64 +2a02:26f7:d100:4000::/64 +2a02:26f7:d101:4000::/64 +2a02:26f7:d104:4000::/64 +2a02:26f7:d105:4000::/64 +2a02:26f7:d108:4000::/64 +2a02:26f7:d109:4000::/64 +2a02:26f7:d10c:4000::/64 +2a02:26f7:d10d:4000::/64 +2a02:26f7:d140::/52 +2a02:26f7:d140:1000::/54 +2a02:26f7:d140:1400::/55 +2a02:26f7:d140:1600::/56 +2a02:26f7:d140:4000::/64 +2a02:26f7:d140:8800::/53 +2a02:26f7:d140:9000::/57 +2a02:26f7:d140:9080::/59 +2a02:26f7:d140:90a0::/61 +2a02:26f7:d140:90a8::/62 +2a02:26f7:d140:90ac::/64 +2a02:26f7:d140:fff0::/64 +2a02:26f7:d141:4000::/64 +2a02:26f7:d142:4000::/64 +2a02:26f7:d143:4000::/64 +2a02:26f7:d144::/52 +2a02:26f7:d144:1000::/54 +2a02:26f7:d144:1400::/55 +2a02:26f7:d144:1600::/56 +2a02:26f7:d144:4000::/64 +2a02:26f7:d144:8800::/53 +2a02:26f7:d144:9000::/57 +2a02:26f7:d144:9080::/59 +2a02:26f7:d144:90a0::/61 +2a02:26f7:d144:90a8::/62 +2a02:26f7:d144:90ac::/64 +2a02:26f7:d144:fff0::/64 +2a02:26f7:d145:4000::/64 +2a02:26f7:d148::/52 +2a02:26f7:d148:1000::/54 +2a02:26f7:d148:1400::/55 +2a02:26f7:d148:1600::/56 +2a02:26f7:d148:4000::/64 +2a02:26f7:d148:8800::/53 +2a02:26f7:d148:9000::/57 +2a02:26f7:d148:9080::/59 +2a02:26f7:d148:90a0::/61 +2a02:26f7:d148:90a8::/62 +2a02:26f7:d148:90ac::/64 +2a02:26f7:d148:fff0::/64 +2a02:26f7:d149::/52 +2a02:26f7:d149:1000::/54 +2a02:26f7:d149:1400::/55 +2a02:26f7:d149:1600::/56 +2a02:26f7:d149:4000::/64 +2a02:26f7:d149:8800::/53 +2a02:26f7:d149:9000::/57 +2a02:26f7:d149:9080::/59 +2a02:26f7:d149:90a0::/61 +2a02:26f7:d149:90a8::/62 +2a02:26f7:d149:90ac::/64 +2a02:26f7:d149:fff0::/64 +2a02:26f7:d14a:4000::/64 +2a02:26f7:d14b:4000::/64 +2a02:26f7:d14c::/52 +2a02:26f7:d14c:1000::/54 +2a02:26f7:d14c:1400::/55 +2a02:26f7:d14c:1600::/56 +2a02:26f7:d14c:4000::/64 +2a02:26f7:d14c:8800::/53 +2a02:26f7:d14c:9000::/57 +2a02:26f7:d14c:9080::/59 +2a02:26f7:d14c:90a0::/61 +2a02:26f7:d14c:90a8::/62 +2a02:26f7:d14c:90ac::/64 +2a02:26f7:d14c:fff0::/64 +2a02:26f7:d14d:4000::/64 +2a02:26f7:d14e::/52 +2a02:26f7:d14e:1000::/54 +2a02:26f7:d14e:1400::/55 +2a02:26f7:d14e:1600::/56 +2a02:26f7:d14e:4000::/64 +2a02:26f7:d14e:8800::/53 +2a02:26f7:d14e:9000::/57 +2a02:26f7:d14e:9080::/59 +2a02:26f7:d14e:90a0::/61 +2a02:26f7:d14e:90a8::/62 +2a02:26f7:d14e:90ac::/64 +2a02:26f7:d14e:fff0::/64 +2a02:26f7:d14f:4000::/64 +2a02:26f7:d150::/52 +2a02:26f7:d150:1000::/54 +2a02:26f7:d150:1400::/55 +2a02:26f7:d150:1600::/56 +2a02:26f7:d150:4000::/64 +2a02:26f7:d150:8800::/53 +2a02:26f7:d150:9000::/57 +2a02:26f7:d150:9080::/59 +2a02:26f7:d150:90a0::/61 +2a02:26f7:d150:90a8::/62 +2a02:26f7:d150:90ac::/64 +2a02:26f7:d150:fff0::/64 +2a02:26f7:d151:4000::/64 +2a02:26f7:d154::/52 +2a02:26f7:d154:1000::/54 +2a02:26f7:d154:1400::/55 +2a02:26f7:d154:1600::/56 +2a02:26f7:d154:4000::/64 +2a02:26f7:d154:8800::/53 +2a02:26f7:d154:9000::/57 +2a02:26f7:d154:9080::/59 +2a02:26f7:d154:90a0::/61 +2a02:26f7:d154:90a8::/62 +2a02:26f7:d154:90ac::/64 +2a02:26f7:d154:fff0::/64 +2a02:26f7:d155::/52 +2a02:26f7:d155:1000::/54 +2a02:26f7:d155:1400::/55 +2a02:26f7:d155:1600::/56 +2a02:26f7:d155:4000::/64 +2a02:26f7:d155:8800::/53 +2a02:26f7:d155:9000::/57 +2a02:26f7:d155:9080::/59 +2a02:26f7:d155:90a0::/61 +2a02:26f7:d155:90a8::/62 +2a02:26f7:d155:90ac::/64 +2a02:26f7:d155:fff0::/64 +2a02:26f7:d156:4000::/64 +2a02:26f7:d157:4000::/64 +2a02:26f7:d158::/52 +2a02:26f7:d158:1000::/54 +2a02:26f7:d158:1400::/55 +2a02:26f7:d158:1600::/56 +2a02:26f7:d158:4000::/64 +2a02:26f7:d158:8800::/53 +2a02:26f7:d158:9000::/57 +2a02:26f7:d158:9080::/59 +2a02:26f7:d158:90a0::/61 +2a02:26f7:d158:90a8::/62 +2a02:26f7:d158:90ac::/64 +2a02:26f7:d158:fff0::/64 +2a02:26f7:d159::/52 +2a02:26f7:d159:1000::/54 +2a02:26f7:d159:1400::/55 +2a02:26f7:d159:1600::/56 +2a02:26f7:d159:4000::/64 +2a02:26f7:d159:8800::/53 +2a02:26f7:d159:9000::/57 +2a02:26f7:d159:9080::/59 +2a02:26f7:d159:90a0::/61 +2a02:26f7:d159:90a8::/62 +2a02:26f7:d159:90ac::/64 +2a02:26f7:d159:fff0::/64 +2a02:26f7:d15c::/52 +2a02:26f7:d15c:1000::/54 +2a02:26f7:d15c:1400::/55 +2a02:26f7:d15c:1600::/56 +2a02:26f7:d15c:4000::/64 +2a02:26f7:d15c:8800::/53 +2a02:26f7:d15c:9000::/57 +2a02:26f7:d15c:9080::/59 +2a02:26f7:d15c:90a0::/61 +2a02:26f7:d15c:90a8::/62 +2a02:26f7:d15c:90ac::/64 +2a02:26f7:d15c:fff0::/64 +2a02:26f7:d15d::/52 +2a02:26f7:d15d:1000::/54 +2a02:26f7:d15d:1400::/55 +2a02:26f7:d15d:1600::/56 +2a02:26f7:d15d:4000::/64 +2a02:26f7:d15d:8800::/53 +2a02:26f7:d15d:9000::/57 +2a02:26f7:d15d:9080::/59 +2a02:26f7:d15d:90a0::/61 +2a02:26f7:d15d:90a8::/62 +2a02:26f7:d15d:90ac::/64 +2a02:26f7:d15d:fff0::/64 +2a02:26f7:d15e::/52 +2a02:26f7:d15e:1000::/54 +2a02:26f7:d15e:1400::/55 +2a02:26f7:d15e:1600::/56 +2a02:26f7:d15e:4000::/64 +2a02:26f7:d15e:8800::/53 +2a02:26f7:d15e:9000::/57 +2a02:26f7:d15e:9080::/59 +2a02:26f7:d15e:90a0::/61 +2a02:26f7:d15e:90a8::/62 +2a02:26f7:d15e:90ac::/64 +2a02:26f7:d15e:fff0::/64 +2a02:26f7:d15f::/52 +2a02:26f7:d15f:1000::/54 +2a02:26f7:d15f:1400::/55 +2a02:26f7:d15f:1600::/56 +2a02:26f7:d15f:4000::/64 +2a02:26f7:d15f:8800::/53 +2a02:26f7:d15f:9000::/57 +2a02:26f7:d15f:9080::/59 +2a02:26f7:d15f:90a0::/61 +2a02:26f7:d15f:90a8::/62 +2a02:26f7:d15f:90ac::/64 +2a02:26f7:d15f:fff0::/64 +2a02:26f7:d160::/52 +2a02:26f7:d160:1000::/54 +2a02:26f7:d160:1400::/55 +2a02:26f7:d160:1600::/56 +2a02:26f7:d160:4000::/64 +2a02:26f7:d160:8800::/53 +2a02:26f7:d160:9000::/57 +2a02:26f7:d160:9080::/59 +2a02:26f7:d160:90a0::/61 +2a02:26f7:d160:90a8::/62 +2a02:26f7:d160:90ac::/64 +2a02:26f7:d160:fff0::/64 +2a02:26f7:d161::/52 +2a02:26f7:d161:1000::/54 +2a02:26f7:d161:1400::/55 +2a02:26f7:d161:1600::/56 +2a02:26f7:d161:4000::/64 +2a02:26f7:d161:8800::/53 +2a02:26f7:d161:9000::/57 +2a02:26f7:d161:9080::/59 +2a02:26f7:d161:90a0::/61 +2a02:26f7:d161:90a8::/62 +2a02:26f7:d161:90ac::/64 +2a02:26f7:d161:fff0::/64 +2a02:26f7:d162::/52 +2a02:26f7:d162:1000::/54 +2a02:26f7:d162:1400::/55 +2a02:26f7:d162:1600::/56 +2a02:26f7:d162:4000::/64 +2a02:26f7:d162:8800::/53 +2a02:26f7:d162:9000::/57 +2a02:26f7:d162:9080::/59 +2a02:26f7:d162:90a0::/61 +2a02:26f7:d162:90a8::/62 +2a02:26f7:d162:90ac::/64 +2a02:26f7:d162:fff0::/64 +2a02:26f7:d163:4000::/64 +2a02:26f7:d164::/52 +2a02:26f7:d164:1000::/54 +2a02:26f7:d164:1400::/55 +2a02:26f7:d164:1600::/56 +2a02:26f7:d164:4000::/64 +2a02:26f7:d164:8800::/53 +2a02:26f7:d164:9000::/57 +2a02:26f7:d164:9080::/59 +2a02:26f7:d164:90a0::/61 +2a02:26f7:d164:90a8::/62 +2a02:26f7:d164:90ac::/64 +2a02:26f7:d164:fff0::/64 +2a02:26f7:d165:4000::/64 +2a02:26f7:d168:4000::/64 +2a02:26f7:d169:4000::/64 +2a02:26f7:d16a:4000::/64 +2a02:26f7:d16b:4000::/64 +2a02:26f7:d16c:4000::/64 +2a02:26f7:d16d:4000::/64 +2a02:26f7:d180::/54 +2a02:26f7:d180:400::/58 +2a02:26f7:d180:440::/60 +2a02:26f7:d180:4000::/64 +2a02:26f7:d180:e000::/57 +2a02:26f7:d180:e080::/61 +2a02:26f7:d180:e088::/64 +2a02:26f7:d181:4000::/64 +2a02:26f7:d184::/54 +2a02:26f7:d184:400::/58 +2a02:26f7:d184:440::/60 +2a02:26f7:d184:4000::/64 +2a02:26f7:d184:e000::/57 +2a02:26f7:d184:e080::/61 +2a02:26f7:d184:e088::/64 +2a02:26f7:d185:4000::/64 +2a02:26f7:d188::/54 +2a02:26f7:d188:400::/58 +2a02:26f7:d188:440::/60 +2a02:26f7:d188:4000::/64 +2a02:26f7:d188:e000::/57 +2a02:26f7:d188:e080::/61 +2a02:26f7:d188:e088::/64 +2a02:26f7:d189:4000::/64 +2a02:26f7:d18c::/54 +2a02:26f7:d18c:400::/58 +2a02:26f7:d18c:440::/60 +2a02:26f7:d18c:4000::/64 +2a02:26f7:d18c:e000::/57 +2a02:26f7:d18c:e080::/61 +2a02:26f7:d18c:e088::/64 +2a02:26f7:d18d:4000::/64 +2a02:26f7:d190::/54 +2a02:26f7:d190:400::/58 +2a02:26f7:d190:440::/60 +2a02:26f7:d190:4000::/64 +2a02:26f7:d190:e000::/57 +2a02:26f7:d190:e080::/61 +2a02:26f7:d190:e088::/64 +2a02:26f7:d191:4000::/64 +2a02:26f7:d194::/54 +2a02:26f7:d194:400::/58 +2a02:26f7:d194:440::/60 +2a02:26f7:d194:4000::/64 +2a02:26f7:d194:e000::/57 +2a02:26f7:d194:e080::/61 +2a02:26f7:d194:e088::/64 +2a02:26f7:d195:4000::/64 +2a02:26f7:d198::/54 +2a02:26f7:d198:400::/58 +2a02:26f7:d198:440::/60 +2a02:26f7:d198:4000::/64 +2a02:26f7:d198:e000::/57 +2a02:26f7:d198:e080::/61 +2a02:26f7:d198:e088::/64 +2a02:26f7:d199:4000::/64 +2a02:26f7:d1c0:4000::/64 +2a02:26f7:d1c0:d2a0::/61 +2a02:26f7:d1c0:d2a8::/62 +2a02:26f7:d1c1:4000::/64 +2a02:26f7:d1c4:4000::/64 +2a02:26f7:d1c4:d2a0::/61 +2a02:26f7:d1c4:d2a8::/62 +2a02:26f7:d1c5:4000::/64 +2a02:26f7:d1c8:4000::/64 +2a02:26f7:d1c8:d2a0::/61 +2a02:26f7:d1c8:d2a8::/62 +2a02:26f7:d1c9:4000::/64 +2a02:26f7:d1cc:4000::/64 +2a02:26f7:d1cc:d2a0::/61 +2a02:26f7:d1cc:d2a8::/62 +2a02:26f7:d1cd:4000::/64 +2a02:26f7:d200:4000::/64 +2a02:26f7:d200:d020::/62 +2a02:26f7:d200:d024::/63 +2a02:26f7:d201:4000::/64 +2a02:26f7:d204:4000::/64 +2a02:26f7:d204:d020::/62 +2a02:26f7:d204:d024::/63 +2a02:26f7:d205:4000::/64 +2a02:26f7:d208:4000::/64 +2a02:26f7:d208:d020::/62 +2a02:26f7:d208:d024::/63 +2a02:26f7:d209:4000::/64 +2a02:26f7:d20c:4000::/64 +2a02:26f7:d20c:d020::/62 +2a02:26f7:d20c:d024::/63 +2a02:26f7:d20d:4000::/64 +2a02:26f7:d210:4000::/64 +2a02:26f7:d210:d020::/62 +2a02:26f7:d210:d024::/63 +2a02:26f7:d211:4000::/64 +2a02:26f7:d240::/54 +2a02:26f7:d240:4000::/64 +2a02:26f7:d240:d600::/59 +2a02:26f7:d240:d620::/60 +2a02:26f7:d240:d630::/61 +2a02:26f7:d241:4000::/64 +2a02:26f7:d242::/54 +2a02:26f7:d242:4000::/64 +2a02:26f7:d242:d600::/59 +2a02:26f7:d242:d620::/60 +2a02:26f7:d242:d630::/61 +2a02:26f7:d243:4000::/64 +2a02:26f7:d244::/54 +2a02:26f7:d244:4000::/64 +2a02:26f7:d244:d600::/59 +2a02:26f7:d244:d620::/60 +2a02:26f7:d244:d630::/61 +2a02:26f7:d245:4000::/64 +2a02:26f7:d248::/54 +2a02:26f7:d248:4000::/64 +2a02:26f7:d248:d600::/59 +2a02:26f7:d248:d620::/60 +2a02:26f7:d248:d630::/61 +2a02:26f7:d249:4000::/64 +2a02:26f7:d24c::/54 +2a02:26f7:d24c:4000::/64 +2a02:26f7:d24c:d600::/59 +2a02:26f7:d24c:d620::/60 +2a02:26f7:d24c:d630::/61 +2a02:26f7:d24d:4000::/64 +2a02:26f7:d250::/54 +2a02:26f7:d250:4000::/64 +2a02:26f7:d250:d600::/59 +2a02:26f7:d250:d620::/60 +2a02:26f7:d250:d630::/61 +2a02:26f7:d251:4000::/64 +2a02:26f7:d254::/54 +2a02:26f7:d254:4000::/64 +2a02:26f7:d254:d600::/59 +2a02:26f7:d254:d620::/60 +2a02:26f7:d254:d630::/61 +2a02:26f7:d255:4000::/64 +2a02:26f7:d258::/54 +2a02:26f7:d258:4000::/64 +2a02:26f7:d258:d600::/59 +2a02:26f7:d258:d620::/60 +2a02:26f7:d258:d630::/61 +2a02:26f7:d259:4000::/64 +2a02:26f7:d280:4000::/64 +2a02:26f7:d280:c9c0::/64 +2a02:26f7:d281:4000::/64 +2a02:26f7:d284:4000::/64 +2a02:26f7:d284:c9c0::/64 +2a02:26f7:d285:4000::/64 +2a02:26f7:d288:4000::/64 +2a02:26f7:d288:c9c0::/64 +2a02:26f7:d289:4000::/64 +2a02:26f7:d28c:4000::/64 +2a02:26f7:d28c:c9c0::/64 +2a02:26f7:d28d:4000::/64 +2a02:26f7:d2c0:4000::/64 +2a02:26f7:d2c0:cc60::/63 +2a02:26f7:d2c1:4000::/64 +2a02:26f7:d2c4:4000::/64 +2a02:26f7:d2c4:cc60::/63 +2a02:26f7:d2c5:4000::/64 +2a02:26f7:d2c8:4000::/64 +2a02:26f7:d2c8:cc60::/63 +2a02:26f7:d2c9:4000::/64 +2a02:26f7:d300:4000::/64 +2a02:26f7:d300:d180::/61 +2a02:26f7:d301:4000::/64 +2a02:26f7:d304:4000::/64 +2a02:26f7:d304:d180::/61 +2a02:26f7:d305:4000::/64 +2a02:26f7:d308:4000::/64 +2a02:26f7:d308:d180::/61 +2a02:26f7:d309:4000::/64 +2a02:26f7:d340:4000::/64 +2a02:26f7:d340:cee0::/62 +2a02:26f7:d341:4000::/64 +2a02:26f7:d348:4000::/64 +2a02:26f7:d348:cee0::/62 +2a02:26f7:d349:4000::/64 +2a02:26f7:d34c:4000::/64 +2a02:26f7:d34c:cee0::/62 +2a02:26f7:d34d:4000::/64 +2a02:26f7:d380:4000::/64 +2a02:26f7:d380:5040::/60 +2a02:26f7:d380:5050::/62 +2a02:26f7:d380:5054::/64 +2a02:26f7:d381:4000::/64 +2a02:26f7:d384:4000::/64 +2a02:26f7:d384:5040::/60 +2a02:26f7:d384:5050::/62 +2a02:26f7:d384:5054::/64 +2a02:26f7:d385:4000::/64 +2a02:26f7:d388:4000::/64 +2a02:26f7:d388:5040::/60 +2a02:26f7:d388:5050::/62 +2a02:26f7:d388:5054::/64 +2a02:26f7:d389:4000::/64 +2a02:26f7:d389:5040::/60 +2a02:26f7:d389:5050::/62 +2a02:26f7:d389:5054::/64 +2a02:26f7:d38a:4000::/64 +2a02:26f7:d38b:4000::/64 +2a02:26f7:d3c0:4000::/64 +2a02:26f7:d3c0:c680::/64 +2a02:26f7:d3c1:4000::/64 +2a02:26f7:d3c4:4000::/64 +2a02:26f7:d3c4:c680::/64 +2a02:26f7:d3c5:4000::/64 +2a02:26f7:d3c8:4000::/64 +2a02:26f7:d3c8:c680::/64 +2a02:26f7:d3c9:4000::/64 +2a02:26f7:d3c9:c680::/64 +2a02:26f7:d3ca:4000::/64 +2a02:26f7:d3cb:4000::/64 +2a02:26f7:d400:4000::/64 +2a02:26f7:d400:d1e0::/61 +2a02:26f7:d400:d1e8::/63 +2a02:26f7:d401:4000::/64 +2a02:26f7:d408:4000::/64 +2a02:26f7:d408:d1e0::/61 +2a02:26f7:d408:d1e8::/63 +2a02:26f7:d409:4000::/64 +2a02:26f7:d40c:4000::/64 +2a02:26f7:d40c:d1e0::/61 +2a02:26f7:d40c:d1e8::/63 +2a02:26f7:d40d:4000::/64 +2a02:26f7:d440:4000::/64 +2a02:26f7:d440:cf60::/62 +2a02:26f7:d440:cf64::/64 +2a02:26f7:d441:4000::/64 +2a02:26f7:d444:4000::/64 +2a02:26f7:d444:cf60::/62 +2a02:26f7:d444:cf64::/64 +2a02:26f7:d445:4000::/64 +2a02:26f7:d448:4000::/64 +2a02:26f7:d448:cf60::/62 +2a02:26f7:d448:cf64::/64 +2a02:26f7:d449:4000::/64 +2a02:26f7:d44c:4000::/64 +2a02:26f7:d44c:cf60::/62 +2a02:26f7:d44c:cf64::/64 +2a02:26f7:d44d:4000::/64 +2a02:26f7:d480:4000::/64 +2a02:26f7:d480:cba0::/63 +2a02:26f7:d481:4000::/64 +2a02:26f7:d488:4000::/64 +2a02:26f7:d488:cba0::/63 +2a02:26f7:d489:4000::/64 +2a02:26f7:d48c:4000::/64 +2a02:26f7:d48c:cba0::/63 +2a02:26f7:d48d:4000::/64 +2a02:26f7:d4c0:4000::/64 +2a02:26f7:d4c0:c5a0::/64 +2a02:26f7:d4c1:4000::/64 +2a02:26f7:d4c4:4000::/64 +2a02:26f7:d4c4:c5a0::/64 +2a02:26f7:d4c5:4000::/64 +2a02:26f7:d4c8:4000::/64 +2a02:26f7:d4c8:c5a0::/64 +2a02:26f7:d4c9:4000::/64 +2a02:26f7:d4c9:c5a0::/64 +2a02:26f7:d4ca:4000::/64 +2a02:26f7:d4cb:4000::/64 +2a02:26f7:d4cc:4000::/64 +2a02:26f7:d4cc:c5a0::/64 +2a02:26f7:d4cd:4000::/64 +2a02:26f7:d4d0:4000::/64 +2a02:26f7:d4d0:c5a0::/64 +2a02:26f7:d4d1:4000::/64 +2a02:26f7:d500:4000::/64 +2a02:26f7:d500:d0c0::/61 +2a02:26f7:d501:4000::/64 +2a02:26f7:d504:4000::/64 +2a02:26f7:d504:d0c0::/61 +2a02:26f7:d505:4000::/64 +2a02:26f7:d510:4000::/64 +2a02:26f7:d510:d0c0::/61 +2a02:26f7:d511:4000::/64 +2a02:26f7:d540:4000::/64 +2a02:26f7:d540:cb60::/63 +2a02:26f7:d541:4000::/64 +2a02:26f7:d544:4000::/64 +2a02:26f7:d544:cb60::/63 +2a02:26f7:d545:4000::/64 +2a02:26f7:d548:4000::/64 +2a02:26f7:d548:cb60::/63 +2a02:26f7:d549:4000::/64 +2a02:26f7:d54c:4000::/64 +2a02:26f7:d54c:cb60::/63 +2a02:26f7:d54d:4000::/64 +2a02:26f7:d550:4000::/64 +2a02:26f7:d550:cb60::/63 +2a02:26f7:d551:4000::/64 +2a02:26f7:d580:4000::/64 +2a02:26f7:d580:c4a0::/64 +2a02:26f7:d581:4000::/64 +2a02:26f7:d584:4000::/64 +2a02:26f7:d584:c4a0::/64 +2a02:26f7:d585:4000::/64 +2a02:26f7:d588:4000::/64 +2a02:26f7:d588:c4a0::/64 +2a02:26f7:d589:4000::/64 +2a02:26f7:d58c:4000::/64 +2a02:26f7:d58c:c4a0::/64 +2a02:26f7:d58d:4000::/64 +2a02:26f7:d5c0:4000::/64 +2a02:26f7:d5c0:ce60::/62 +2a02:26f7:d5c1:4000::/64 +2a02:26f7:d5c4:4000::/64 +2a02:26f7:d5c4:ce60::/62 +2a02:26f7:d5c5:4000::/64 +2a02:26f7:d5c8:4000::/64 +2a02:26f7:d5c8:ce60::/62 +2a02:26f7:d5c9:4000::/64 +2a02:26f7:d5c9:ce60::/62 +2a02:26f7:d5ca:4000::/64 +2a02:26f7:d5cb:4000::/64 +2a02:26f7:d600:4000::/64 +2a02:26f7:d600:c400::/64 +2a02:26f7:d601:4000::/64 +2a02:26f7:d608:4000::/64 +2a02:26f7:d608:c400::/64 +2a02:26f7:d609:4000::/64 +2a02:26f7:d60c:4000::/64 +2a02:26f7:d60c:c400::/64 +2a02:26f7:d60d:4000::/64 +2a02:26f7:d640:4000::/64 +2a02:26f7:d640:4840::/60 +2a02:26f7:d640:4850::/64 +2a02:26f7:d641:4000::/64 +2a02:26f7:d644:4000::/64 +2a02:26f7:d644:4840::/60 +2a02:26f7:d644:4850::/64 +2a02:26f7:d645:4000::/64 +2a02:26f7:d648:4000::/64 +2a02:26f7:d648:4840::/60 +2a02:26f7:d648:4850::/64 +2a02:26f7:d649:4000::/64 +2a02:26f7:d64c:4000::/64 +2a02:26f7:d64c:4840::/60 +2a02:26f7:d64c:4850::/64 +2a02:26f7:d64d:4000::/64 +2a02:26f7:d650:4000::/64 +2a02:26f7:d650:4840::/60 +2a02:26f7:d650:4850::/64 +2a02:26f7:d651:4000::/64 +2a02:26f7:d680:4000::/64 +2a02:26f7:d680:c3a0::/64 +2a02:26f7:d681:4000::/64 +2a02:26f7:d688:4000::/64 +2a02:26f7:d688:c3a0::/64 +2a02:26f7:d689:4000::/64 +2a02:26f7:d68c:4000::/64 +2a02:26f7:d68c:c3a0::/64 +2a02:26f7:d68d:4000::/64 +2a02:26f7:d6c0::/53 +2a02:26f7:d6c0:800::/54 +2a02:26f7:d6c0:c00::/55 +2a02:26f7:d6c0:e00::/56 +2a02:26f7:d6c0:f00::/57 +2a02:26f7:d6c0:f80::/59 +2a02:26f7:d6c0:4000::/64 +2a02:26f7:d6c0:6800::/56 +2a02:26f7:d6c0:6900::/57 +2a02:26f7:d6c0:6980::/59 +2a02:26f7:d6c1::/53 +2a02:26f7:d6c1:800::/54 +2a02:26f7:d6c1:c00::/55 +2a02:26f7:d6c1:e00::/56 +2a02:26f7:d6c1:f00::/57 +2a02:26f7:d6c1:f80::/59 +2a02:26f7:d6c1:4000::/64 +2a02:26f7:d6c1:6800::/56 +2a02:26f7:d6c1:6900::/57 +2a02:26f7:d6c1:6980::/59 +2a02:26f7:d6c2:4000::/64 +2a02:26f7:d6c3:4000::/64 +2a02:26f7:d6c4::/53 +2a02:26f7:d6c4:800::/54 +2a02:26f7:d6c4:c00::/55 +2a02:26f7:d6c4:e00::/56 +2a02:26f7:d6c4:f00::/57 +2a02:26f7:d6c4:f80::/59 +2a02:26f7:d6c4:4000::/64 +2a02:26f7:d6c4:6800::/56 +2a02:26f7:d6c4:6900::/57 +2a02:26f7:d6c4:6980::/59 +2a02:26f7:d6c5:4000::/64 +2a02:26f7:d6c6::/53 +2a02:26f7:d6c6:800::/54 +2a02:26f7:d6c6:c00::/55 +2a02:26f7:d6c6:e00::/56 +2a02:26f7:d6c6:f00::/57 +2a02:26f7:d6c6:f80::/59 +2a02:26f7:d6c6:4000::/64 +2a02:26f7:d6c6:6800::/56 +2a02:26f7:d6c6:6900::/57 +2a02:26f7:d6c6:6980::/59 +2a02:26f7:d6c7:4000::/64 +2a02:26f7:d6cc::/53 +2a02:26f7:d6cc:800::/54 +2a02:26f7:d6cc:c00::/55 +2a02:26f7:d6cc:e00::/56 +2a02:26f7:d6cc:f00::/57 +2a02:26f7:d6cc:f80::/59 +2a02:26f7:d6cc:4000::/64 +2a02:26f7:d6cc:6800::/56 +2a02:26f7:d6cc:6900::/57 +2a02:26f7:d6cc:6980::/59 +2a02:26f7:d6cd:4000::/64 +2a02:26f7:d6d0::/53 +2a02:26f7:d6d0:800::/54 +2a02:26f7:d6d0:c00::/55 +2a02:26f7:d6d0:e00::/56 +2a02:26f7:d6d0:f00::/57 +2a02:26f7:d6d0:f80::/59 +2a02:26f7:d6d0:4000::/64 +2a02:26f7:d6d0:6800::/56 +2a02:26f7:d6d0:6900::/57 +2a02:26f7:d6d0:6980::/59 +2a02:26f7:d6d1:4000::/64 +2a02:26f7:d700:4000::/64 +2a02:26f7:d700:d3e1::/64 +2a02:26f7:d700:d3e2::/63 +2a02:26f7:d700:d3e4::/62 +2a02:26f7:d700:d3e8::/63 +2a02:26f7:d700:d3ea::/64 +2a02:26f7:d700:d3ec::/63 +2a02:26f7:d700:d3ee::/64 +2a02:26f7:d700:d3f0::/61 +2a02:26f7:d700:d3f8::/64 +2a02:26f7:d701:4000::/64 +2a02:26f7:d704:4000::/64 +2a02:26f7:d704:d3e1::/64 +2a02:26f7:d704:d3e2::/63 +2a02:26f7:d704:d3e4::/62 +2a02:26f7:d704:d3e8::/63 +2a02:26f7:d704:d3ea::/64 +2a02:26f7:d704:d3ec::/63 +2a02:26f7:d704:d3ee::/64 +2a02:26f7:d704:d3f0::/61 +2a02:26f7:d704:d3f8::/64 +2a02:26f7:d705:4000::/64 +2a02:26f7:d708:4000::/64 +2a02:26f7:d708:d3e1::/64 +2a02:26f7:d708:d3e2::/63 +2a02:26f7:d708:d3e4::/62 +2a02:26f7:d708:d3e8::/63 +2a02:26f7:d708:d3ea::/64 +2a02:26f7:d708:d3ec::/63 +2a02:26f7:d708:d3ee::/64 +2a02:26f7:d708:d3f0::/61 +2a02:26f7:d708:d3f8::/64 +2a02:26f7:d709:4000::/64 +2a02:26f7:d709:d3e1::/64 +2a02:26f7:d709:d3e2::/63 +2a02:26f7:d709:d3e4::/62 +2a02:26f7:d709:d3e8::/63 +2a02:26f7:d709:d3ea::/64 +2a02:26f7:d709:d3ec::/63 +2a02:26f7:d709:d3ee::/64 +2a02:26f7:d709:d3f0::/61 +2a02:26f7:d709:d3f8::/64 +2a02:26f7:d70a:4000::/64 +2a02:26f7:d70b:4000::/64 +2a02:26f7:d740:4000::/64 +2a02:26f7:d740:4480::/64 +2a02:26f7:d741:4000::/64 +2a02:26f7:d744:4000::/64 +2a02:26f7:d744:4480::/64 +2a02:26f7:d745:4000::/64 +2a02:26f7:d748:4000::/64 +2a02:26f7:d748:4480::/64 +2a02:26f7:d749:4000::/64 +2a02:26f7:d74c:4000::/64 +2a02:26f7:d74c:4480::/64 +2a02:26f7:d74d:4000::/64 +2a02:26f7:d780:4000::/64 +2a02:26f7:d780:ca80::/63 +2a02:26f7:d781:4000::/64 +2a02:26f7:d784:4000::/64 +2a02:26f7:d784:ca80::/63 +2a02:26f7:d785:4000::/64 +2a02:26f7:d788:4000::/64 +2a02:26f7:d788:ca80::/63 +2a02:26f7:d789:4000::/64 +2a02:26f7:d78c:4000::/64 +2a02:26f7:d78c:ca80::/63 +2a02:26f7:d78d:4000::/64 +2a02:26f7:d7c0:4000::/64 +2a02:26f7:d7c0:c0c0::/64 +2a02:26f7:d7c1:4000::/64 +2a02:26f7:d7c4:4000::/64 +2a02:26f7:d7c4:c0c0::/64 +2a02:26f7:d7c5:4000::/64 +2a02:26f7:d7c8:4000::/64 +2a02:26f7:d7c8:c0c0::/64 +2a02:26f7:d7c9:4000::/64 +2a02:26f7:d800:4000::/64 +2a02:26f7:d800:4100::/60 +2a02:26f7:d800:4110::/62 +2a02:26f7:d800:4114::/64 +2a02:26f7:d801:4000::/64 +2a02:26f7:d804:4000::/64 +2a02:26f7:d804:4100::/60 +2a02:26f7:d804:4110::/62 +2a02:26f7:d804:4114::/64 +2a02:26f7:d805:4000::/64 +2a02:26f7:d808:4000::/64 +2a02:26f7:d808:4100::/60 +2a02:26f7:d808:4110::/62 +2a02:26f7:d808:4114::/64 +2a02:26f7:d809:4000::/64 +2a02:26f7:d809:4100::/60 +2a02:26f7:d809:4110::/62 +2a02:26f7:d809:4114::/64 +2a02:26f7:d80a:4000::/64 +2a02:26f7:d80b:4000::/64 +2a02:26f7:d840:4000::/61 +2a02:26f7:d841:4000::/64 +2a02:26f7:d844:4000::/61 +2a02:26f7:d845:4000::/64 +2a02:26f7:d848:4000::/61 +2a02:26f7:d849:4000::/64 +2a02:26f7:d84c:4000::/61 +2a02:26f7:d84d:4000::/61 +2a02:26f7:d84e:4000::/64 +2a02:26f7:d84f:4000::/64 +2a02:26f7:d850:4000::/61 +2a02:26f7:d851:4000::/64 +2a02:26f7:d880:4000::/64 +2a02:26f7:d880:4e80::/64 +2a02:26f7:d881:4000::/64 +2a02:26f7:d884:4000::/64 +2a02:26f7:d884:4e80::/64 +2a02:26f7:d885:4000::/64 +2a02:26f7:d888:4000::/64 +2a02:26f7:d888:4e80::/64 +2a02:26f7:d889:4000::/64 +2a02:26f7:d8c0:4000::/64 +2a02:26f7:d8c0:d380::/60 +2a02:26f7:d8c0:d390::/62 +2a02:26f7:d8c0:d394::/64 +2a02:26f7:d8c1:4000::/64 +2a02:26f7:d8c2:4000::/64 +2a02:26f7:d8c2:d380::/60 +2a02:26f7:d8c2:d390::/62 +2a02:26f7:d8c2:d394::/64 +2a02:26f7:d8c3:4000::/64 +2a02:26f7:d8c6:4000::/64 +2a02:26f7:d8c6:d380::/60 +2a02:26f7:d8c6:d390::/62 +2a02:26f7:d8c6:d394::/64 +2a02:26f7:d8c7:4000::/64 +2a02:26f7:d8c8:4000::/64 +2a02:26f7:d8c8:d380::/60 +2a02:26f7:d8c8:d390::/62 +2a02:26f7:d8c8:d394::/64 +2a02:26f7:d8c9:4000::/64 +2a02:26f7:d900:4000::/64 +2a02:26f7:d900:4b00::/60 +2a02:26f7:d900:4b10::/61 +2a02:26f7:d900:4b18::/64 +2a02:26f7:d901:4000::/64 +2a02:26f7:d908:4000::/64 +2a02:26f7:d908:4b00::/60 +2a02:26f7:d908:4b10::/61 +2a02:26f7:d908:4b18::/64 +2a02:26f7:d909:4000::/64 +2a02:26f7:d90c:4000::/64 +2a02:26f7:d90c:4b00::/60 +2a02:26f7:d90c:4b10::/61 +2a02:26f7:d90c:4b18::/64 +2a02:26f7:d90d:4000::/64 +2a02:26f7:d940::/54 +2a02:26f7:d940:400::/56 +2a02:26f7:d940:500::/60 +2a02:26f7:d940:4000::/64 +2a02:26f7:d940:4280::/58 +2a02:26f7:d940:d700::/63 +2a02:26f7:d940:d702::/64 +2a02:26f7:d941:4000::/64 +2a02:26f7:d944::/54 +2a02:26f7:d944:400::/56 +2a02:26f7:d944:500::/60 +2a02:26f7:d944:4000::/64 +2a02:26f7:d944:4280::/58 +2a02:26f7:d944:d700::/63 +2a02:26f7:d944:d702::/64 +2a02:26f7:d945:4000::/64 +2a02:26f7:d948::/54 +2a02:26f7:d948:400::/56 +2a02:26f7:d948:500::/60 +2a02:26f7:d948:4000::/64 +2a02:26f7:d948:4280::/58 +2a02:26f7:d948:d700::/63 +2a02:26f7:d948:d702::/64 +2a02:26f7:d949:4000::/64 +2a02:26f7:d94c::/54 +2a02:26f7:d94c:400::/56 +2a02:26f7:d94c:500::/60 +2a02:26f7:d94c:4000::/64 +2a02:26f7:d94c:4280::/58 +2a02:26f7:d94c:d700::/63 +2a02:26f7:d94c:d702::/64 +2a02:26f7:d94d:4000::/64 +2a02:26f7:d980::/54 +2a02:26f7:d980:400::/56 +2a02:26f7:d980:500::/59 +2a02:26f7:d980:4000::/64 +2a02:26f7:d980:4040::/58 +2a02:26f7:d980:ec00::/56 +2a02:26f7:d980:ed00::/58 +2a02:26f7:d980:ed40::/60 +2a02:26f7:d980:ed50::/61 +2a02:26f7:d980:ed58::/62 +2a02:26f7:d981:4000::/64 +2a02:26f7:d984::/54 +2a02:26f7:d984:400::/56 +2a02:26f7:d984:500::/59 +2a02:26f7:d984:4000::/64 +2a02:26f7:d984:4040::/58 +2a02:26f7:d984:ec00::/56 +2a02:26f7:d984:ed00::/58 +2a02:26f7:d984:ed40::/60 +2a02:26f7:d984:ed50::/61 +2a02:26f7:d984:ed58::/62 +2a02:26f7:d985:4000::/64 +2a02:26f7:d988::/54 +2a02:26f7:d988:400::/56 +2a02:26f7:d988:500::/59 +2a02:26f7:d988:4000::/64 +2a02:26f7:d988:4040::/58 +2a02:26f7:d988:ec00::/56 +2a02:26f7:d988:ed00::/58 +2a02:26f7:d988:ed40::/60 +2a02:26f7:d988:ed50::/61 +2a02:26f7:d988:ed58::/62 +2a02:26f7:d989:4000::/64 +2a02:26f7:d98c::/54 +2a02:26f7:d98c:400::/56 +2a02:26f7:d98c:500::/59 +2a02:26f7:d98c:4000::/64 +2a02:26f7:d98c:4040::/58 +2a02:26f7:d98c:ec00::/56 +2a02:26f7:d98c:ed00::/58 +2a02:26f7:d98c:ed40::/60 +2a02:26f7:d98c:ed50::/61 +2a02:26f7:d98c:ed58::/62 +2a02:26f7:d98d:4000::/64 +2a02:26f7:d9c0:4000::/64 +2a02:26f7:d9c0:c040::/64 +2a02:26f7:d9c1:4000::/64 +2a02:26f7:d9c2:4000::/64 +2a02:26f7:d9c2:c040::/64 +2a02:26f7:d9c3:4000::/64 +2a02:26f7:d9c4:4000::/64 +2a02:26f7:d9c4:c040::/64 +2a02:26f7:d9c5:4000::/64 +2a02:26f7:d9c8:4000::/64 +2a02:26f7:d9c8:c040::/64 +2a02:26f7:d9c9:4000::/64 +2a02:26f7:da00:4000::/64 +2a02:26f7:da00:cce0::/63 +2a02:26f7:da01:4000::/64 +2a02:26f7:da04:4000::/64 +2a02:26f7:da04:cce0::/63 +2a02:26f7:da05:4000::/64 +2a02:26f7:da08:4000::/64 +2a02:26f7:da08:cce0::/63 +2a02:26f7:da09:4000::/64 +2a02:26f7:da0c:4000::/64 +2a02:26f7:da0c:cce0::/63 +2a02:26f7:da0d:4000::/64 +2a02:26f7:da10:4000::/64 +2a02:26f7:da10:cce0::/63 +2a02:26f7:da11:4000::/64 +2a02:26f7:da40:4000::/64 +2a02:26f7:da40:ccc0::/63 +2a02:26f7:da41:4000::/64 +2a02:26f7:da44:4000::/64 +2a02:26f7:da44:ccc0::/63 +2a02:26f7:da45:4000::/64 +2a02:26f7:da48:4000::/64 +2a02:26f7:da48:ccc0::/63 +2a02:26f7:da49:4000::/64 +2a02:26f7:da80:4000::/64 +2a02:26f7:da80:cca0::/63 +2a02:26f7:da81:4000::/64 +2a02:26f7:da84:4000::/64 +2a02:26f7:da84:cca0::/63 +2a02:26f7:da85:4000::/64 +2a02:26f7:da88:4000::/64 +2a02:26f7:da88:cca0::/63 +2a02:26f7:da89:4000::/64 +2a02:26f7:da8c:4000::/64 +2a02:26f7:da8c:cca0::/63 +2a02:26f7:da8d:4000::/64 +2a02:26f7:db00:4000::/64 +2a02:26f7:db00:c7c0::/64 +2a02:26f7:db01:4000::/64 +2a02:26f7:db04:4000::/64 +2a02:26f7:db04:c7c0::/64 +2a02:26f7:db05:4000::/64 +2a02:26f7:db08:4000::/64 +2a02:26f7:db08:c7c0::/64 +2a02:26f7:db09:4000::/64 +2a02:26f7:db0c:4000::/64 +2a02:26f7:db0c:c7c0::/64 +2a02:26f7:db0d:4000::/64 +2a02:26f7:db10:4000::/64 +2a02:26f7:db10:c7c0::/64 +2a02:26f7:db11:4000::/64 +2a02:26f7:db40:4000::/64 +2a02:26f7:db40:cc40::/63 +2a02:26f7:db41:4000::/64 +2a02:26f7:db44:4000::/64 +2a02:26f7:db44:cc40::/63 +2a02:26f7:db45:4000::/64 +2a02:26f7:db48:4000::/64 +2a02:26f7:db48:cc40::/63 +2a02:26f7:db49:4000::/64 +2a02:26f7:db80:4000::/64 +2a02:26f7:db80:c700::/64 +2a02:26f7:db81:4000::/64 +2a02:26f7:db84:4000::/64 +2a02:26f7:db84:c700::/64 +2a02:26f7:db85:4000::/64 +2a02:26f7:db88:4000::/64 +2a02:26f7:db88:c700::/64 +2a02:26f7:db89:4000::/64 +2a02:26f7:db8c:4000::/64 +2a02:26f7:db8c:c700::/64 +2a02:26f7:db8d:4000::/64 +2a02:26f7:dbc0:4000::/64 +2a02:26f7:dbc0:d900::/58 +2a02:26f7:dbc0:d940::/60 +2a02:26f7:dbc0:d950::/64 +2a02:26f7:dbc1:4000::/64 +2a02:26f7:dbc4:4000::/64 +2a02:26f7:dbc4:d900::/58 +2a02:26f7:dbc4:d940::/60 +2a02:26f7:dbc4:d950::/64 +2a02:26f7:dbc5:4000::/64 +2a02:26f7:dbc8:4000::/64 +2a02:26f7:dbc8:d900::/58 +2a02:26f7:dbc8:d940::/60 +2a02:26f7:dbc8:d950::/64 +2a02:26f7:dbc9:4000::/64 +2a02:26f7:dbcc:4000::/64 +2a02:26f7:dbcc:d900::/58 +2a02:26f7:dbcc:d940::/60 +2a02:26f7:dbcc:d950::/64 +2a02:26f7:dbcd:4000::/64 +2a02:26f7:dbd0:4000::/64 +2a02:26f7:dbd0:d900::/58 +2a02:26f7:dbd0:d940::/60 +2a02:26f7:dbd0:d950::/64 +2a02:26f7:dbd1:4000::/64 +2a02:26f7:dc00:4000::/64 +2a02:26f7:dc00:cc20::/64 +2a02:26f7:dc01:4000::/64 +2a02:26f7:dc04:4000::/64 +2a02:26f7:dc04:cc20::/64 +2a02:26f7:dc05:4000::/64 +2a02:26f7:dc08:4000::/64 +2a02:26f7:dc08:cc20::/64 +2a02:26f7:dc09:4000::/64 +2a02:26f7:dc0c:4000::/64 +2a02:26f7:dc0c:cc20::/64 +2a02:26f7:dc0d:4000::/64 +2a02:26f7:dc10:4000::/64 +2a02:26f7:dc10:cc20::/64 +2a02:26f7:dc11:4000::/64 +2a02:26f7:dc40:4000::/64 +2a02:26f7:dc40:d4c0::/60 +2a02:26f7:dc40:d4d0::/63 +2a02:26f7:dc40:d4d3::/64 +2a02:26f7:dc40:d4d4::/62 +2a02:26f7:dc40:d4d8::/62 +2a02:26f7:dc41:4000::/64 +2a02:26f7:dc44:4000::/64 +2a02:26f7:dc44:d4c0::/60 +2a02:26f7:dc44:d4d0::/63 +2a02:26f7:dc44:d4d3::/64 +2a02:26f7:dc44:d4d4::/62 +2a02:26f7:dc44:d4d8::/62 +2a02:26f7:dc45:4000::/64 +2a02:26f7:dc48:4000::/64 +2a02:26f7:dc48:d4c0::/60 +2a02:26f7:dc48:d4d0::/63 +2a02:26f7:dc48:d4d3::/64 +2a02:26f7:dc48:d4d4::/62 +2a02:26f7:dc48:d4d8::/62 +2a02:26f7:dc49:4000::/64 +2a02:26f7:dc4c:4000::/64 +2a02:26f7:dc4c:d4c0::/60 +2a02:26f7:dc4c:d4d0::/63 +2a02:26f7:dc4c:d4d3::/64 +2a02:26f7:dc4c:d4d4::/62 +2a02:26f7:dc4c:d4d8::/62 +2a02:26f7:dc4d:4000::/64 +2a02:26f7:dc50:4000::/64 +2a02:26f7:dc50:d4c0::/60 +2a02:26f7:dc50:d4d0::/63 +2a02:26f7:dc50:d4d3::/64 +2a02:26f7:dc50:d4d4::/62 +2a02:26f7:dc50:d4d8::/62 +2a02:26f7:dc51:4000::/64 +2a02:26f7:dc80:4000::/64 +2a02:26f7:dc80:d880::/60 +2a02:26f7:dc80:d890::/61 +2a02:26f7:dc80:d898::/62 +2a02:26f7:dc80:d89c::/63 +2a02:26f7:dc80:d89e::/64 +2a02:26f7:dc80:d8a0::/60 +2a02:26f7:dc80:d8b0::/62 +2a02:26f7:dc80:d8b4::/63 +2a02:26f7:dc80:d8b7::/64 +2a02:26f7:dc80:d8b8::/61 +2a02:26f7:dc80:d8c0::/61 +2a02:26f7:dc80:d8c9::/64 +2a02:26f7:dc80:d8ca::/63 +2a02:26f7:dc80:d8cc::/62 +2a02:26f7:dc81:4000::/64 +2a02:26f7:dc84:4000::/64 +2a02:26f7:dc84:d880::/60 +2a02:26f7:dc84:d890::/61 +2a02:26f7:dc84:d898::/62 +2a02:26f7:dc84:d89c::/63 +2a02:26f7:dc84:d89e::/64 +2a02:26f7:dc84:d8a0::/60 +2a02:26f7:dc84:d8b0::/62 +2a02:26f7:dc84:d8b4::/63 +2a02:26f7:dc84:d8b7::/64 +2a02:26f7:dc84:d8b8::/61 +2a02:26f7:dc84:d8c0::/61 +2a02:26f7:dc84:d8c9::/64 +2a02:26f7:dc84:d8ca::/63 +2a02:26f7:dc84:d8cc::/62 +2a02:26f7:dc85:4000::/64 +2a02:26f7:dc88:4000::/64 +2a02:26f7:dc88:d880::/60 +2a02:26f7:dc88:d890::/61 +2a02:26f7:dc88:d898::/62 +2a02:26f7:dc88:d89c::/63 +2a02:26f7:dc88:d89e::/64 +2a02:26f7:dc88:d8a0::/60 +2a02:26f7:dc88:d8b0::/62 +2a02:26f7:dc88:d8b4::/63 +2a02:26f7:dc88:d8b7::/64 +2a02:26f7:dc88:d8b8::/61 +2a02:26f7:dc88:d8c0::/61 +2a02:26f7:dc88:d8c9::/64 +2a02:26f7:dc88:d8ca::/63 +2a02:26f7:dc88:d8cc::/62 +2a02:26f7:dc89:4000::/64 +2a02:26f7:dc8c:4000::/64 +2a02:26f7:dc8c:d880::/60 +2a02:26f7:dc8c:d890::/61 +2a02:26f7:dc8c:d898::/62 +2a02:26f7:dc8c:d89c::/63 +2a02:26f7:dc8c:d89e::/64 +2a02:26f7:dc8c:d8a0::/60 +2a02:26f7:dc8c:d8b0::/62 +2a02:26f7:dc8c:d8b4::/63 +2a02:26f7:dc8c:d8b7::/64 +2a02:26f7:dc8c:d8b8::/61 +2a02:26f7:dc8c:d8c0::/61 +2a02:26f7:dc8c:d8c9::/64 +2a02:26f7:dc8c:d8ca::/63 +2a02:26f7:dc8c:d8cc::/62 +2a02:26f7:dc8d:4000::/64 +2a02:26f7:dcc0::/54 +2a02:26f7:dcc0:400::/56 +2a02:26f7:dcc0:500::/60 +2a02:26f7:dcc0:4000::/64 +2a02:26f7:dcc0:4bc0::/58 +2a02:26f7:dcc0:e400::/58 +2a02:26f7:dcc0:e440::/59 +2a02:26f7:dcc0:e460::/60 +2a02:26f7:dcc0:e470::/62 +2a02:26f7:dcc1::/54 +2a02:26f7:dcc1:400::/56 +2a02:26f7:dcc1:500::/60 +2a02:26f7:dcc1:4000::/64 +2a02:26f7:dcc1:4bc0::/58 +2a02:26f7:dcc1:e400::/58 +2a02:26f7:dcc1:e440::/59 +2a02:26f7:dcc1:e460::/60 +2a02:26f7:dcc1:e470::/62 +2a02:26f7:dcc2:4000::/64 +2a02:26f7:dcc3:4000::/64 +2a02:26f7:dcc4::/54 +2a02:26f7:dcc4:400::/56 +2a02:26f7:dcc4:500::/60 +2a02:26f7:dcc4:4000::/64 +2a02:26f7:dcc4:4bc0::/58 +2a02:26f7:dcc4:e400::/58 +2a02:26f7:dcc4:e440::/59 +2a02:26f7:dcc4:e460::/60 +2a02:26f7:dcc4:e470::/62 +2a02:26f7:dcc5:4000::/64 +2a02:26f7:dcc8::/54 +2a02:26f7:dcc8:400::/56 +2a02:26f7:dcc8:500::/60 +2a02:26f7:dcc8:4000::/64 +2a02:26f7:dcc8:4bc0::/58 +2a02:26f7:dcc8:e400::/58 +2a02:26f7:dcc8:e440::/59 +2a02:26f7:dcc8:e460::/60 +2a02:26f7:dcc8:e470::/62 +2a02:26f7:dcc9:4000::/64 +2a02:26f7:dd00:4000::/64 +2a02:26f7:dd00:d000::/62 +2a02:26f7:dd00:d004::/63 +2a02:26f7:dd01:4000::/64 +2a02:26f7:dd04:4000::/64 +2a02:26f7:dd04:d000::/62 +2a02:26f7:dd04:d004::/63 +2a02:26f7:dd05:4000::/64 +2a02:26f7:dd08:4000::/64 +2a02:26f7:dd08:d000::/62 +2a02:26f7:dd08:d004::/63 +2a02:26f7:dd09:4000::/64 +2a02:26f7:dd40:4000::/64 +2a02:26f7:dd40:d3a0::/60 +2a02:26f7:dd40:d3b0::/62 +2a02:26f7:dd40:d3b4::/63 +2a02:26f7:dd41:4000::/64 +2a02:26f7:dd44:4000::/64 +2a02:26f7:dd44:d3a0::/60 +2a02:26f7:dd44:d3b0::/62 +2a02:26f7:dd44:d3b4::/63 +2a02:26f7:dd45:4000::/64 +2a02:26f7:dd48:4000::/64 +2a02:26f7:dd48:d3a0::/60 +2a02:26f7:dd48:d3b0::/62 +2a02:26f7:dd48:d3b4::/63 +2a02:26f7:dd49:4000::/64 +2a02:26f7:dd80:4000::/64 +2a02:26f7:dd80:cf40::/62 +2a02:26f7:dd80:cf44::/64 +2a02:26f7:dd81:4000::/64 +2a02:26f7:dd84:4000::/64 +2a02:26f7:dd84:cf40::/62 +2a02:26f7:dd84:cf44::/64 +2a02:26f7:dd85:4000::/64 +2a02:26f7:dd88:4000::/64 +2a02:26f7:dd88:cf40::/62 +2a02:26f7:dd88:cf44::/64 +2a02:26f7:dd89:4000::/64 +2a02:26f7:ddc0:4000::/64 +2a02:26f7:ddc0:cfe0::/62 +2a02:26f7:ddc0:cfe4::/63 +2a02:26f7:ddc1:4000::/64 +2a02:26f7:ddc4:4000::/64 +2a02:26f7:ddc4:cfe0::/62 +2a02:26f7:ddc4:cfe4::/63 +2a02:26f7:ddc5:4000::/64 +2a02:26f7:ddc8:4000::/64 +2a02:26f7:ddc8:cfe0::/62 +2a02:26f7:ddc8:cfe4::/63 +2a02:26f7:ddc9:4000::/64 +2a02:26f7:de00:4000::/64 +2a02:26f7:de00:d2e0::/61 +2a02:26f7:de00:d2e8::/62 +2a02:26f7:de00:d2ec::/63 +2a02:26f7:de00:d2ee::/64 +2a02:26f7:de01:4000::/64 +2a02:26f7:de04:4000::/64 +2a02:26f7:de04:d2e0::/61 +2a02:26f7:de04:d2e8::/62 +2a02:26f7:de04:d2ec::/63 +2a02:26f7:de04:d2ee::/64 +2a02:26f7:de05:4000::/64 +2a02:26f7:de08:4000::/64 +2a02:26f7:de08:d2e0::/61 +2a02:26f7:de08:d2e8::/62 +2a02:26f7:de08:d2ec::/63 +2a02:26f7:de08:d2ee::/64 +2a02:26f7:de09:4000::/64 +2a02:26f7:de0c:4000::/64 +2a02:26f7:de0c:d2e0::/61 +2a02:26f7:de0c:d2e8::/62 +2a02:26f7:de0c:d2ec::/63 +2a02:26f7:de0c:d2ee::/64 +2a02:26f7:de0d:4000::/64 +2a02:26f7:de10:4000::/64 +2a02:26f7:de10:d2e0::/61 +2a02:26f7:de10:d2e8::/62 +2a02:26f7:de10:d2ec::/63 +2a02:26f7:de10:d2ee::/64 +2a02:26f7:de11:4000::/64 +2a02:26f7:de40:4000::/64 +2a02:26f7:de40:48c0::/64 +2a02:26f7:de41:4000::/64 +2a02:26f7:de44:4000::/64 +2a02:26f7:de44:48c0::/64 +2a02:26f7:de45:4000::/64 +2a02:26f7:de48:4000::/64 +2a02:26f7:de48:48c0::/64 +2a02:26f7:de49:4000::/64 +2a02:26f7:de80:4000::/64 +2a02:26f7:de80:d680::/62 +2a02:26f7:de80:d684::/63 +2a02:26f7:de80:d686::/64 +2a02:26f7:de80:d688::/61 +2a02:26f7:de80:d690::/60 +2a02:26f7:de80:d6a0::/59 +2a02:26f7:de80:d6c0::/64 +2a02:26f7:de81:4000::/64 +2a02:26f7:de84:4000::/64 +2a02:26f7:de84:d680::/62 +2a02:26f7:de84:d684::/63 +2a02:26f7:de84:d686::/64 +2a02:26f7:de84:d688::/61 +2a02:26f7:de84:d690::/60 +2a02:26f7:de84:d6a0::/59 +2a02:26f7:de84:d6c0::/64 +2a02:26f7:de85:4000::/64 +2a02:26f7:de88:4000::/64 +2a02:26f7:de88:d680::/62 +2a02:26f7:de88:d684::/63 +2a02:26f7:de88:d686::/64 +2a02:26f7:de88:d688::/61 +2a02:26f7:de88:d690::/60 +2a02:26f7:de88:d6a0::/59 +2a02:26f7:de88:d6c0::/64 +2a02:26f7:de89:4000::/64 +2a02:26f7:de8c:4000::/64 +2a02:26f7:de8c:d680::/62 +2a02:26f7:de8c:d684::/63 +2a02:26f7:de8c:d686::/64 +2a02:26f7:de8c:d688::/61 +2a02:26f7:de8c:d690::/60 +2a02:26f7:de8c:d6a0::/59 +2a02:26f7:de8c:d6c0::/64 +2a02:26f7:de8d:4000::/64 +2a02:26f7:de90:4000::/64 +2a02:26f7:de90:d680::/62 +2a02:26f7:de90:d684::/63 +2a02:26f7:de90:d686::/64 +2a02:26f7:de90:d688::/61 +2a02:26f7:de90:d690::/60 +2a02:26f7:de90:d6a0::/59 +2a02:26f7:de90:d6c0::/64 +2a02:26f7:de91:4000::/64 +2a02:26f7:de94:4000::/64 +2a02:26f7:de94:d680::/62 +2a02:26f7:de94:d684::/63 +2a02:26f7:de94:d686::/64 +2a02:26f7:de94:d688::/61 +2a02:26f7:de94:d690::/60 +2a02:26f7:de94:d6a0::/59 +2a02:26f7:de94:d6c0::/64 +2a02:26f7:de95:4000::/64 +2a02:26f7:dec0:4000::/64 +2a02:26f7:dec0:4880::/63 +2a02:26f7:dec1:4000::/64 +2a02:26f7:dec4:4000::/64 +2a02:26f7:dec4:4880::/63 +2a02:26f7:dec5:4000::/64 +2a02:26f7:dec8:4000::/64 +2a02:26f7:dec8:4880::/63 +2a02:26f7:dec9:4000::/64 +2a02:26f7:decc:4000::/64 +2a02:26f7:decc:4880::/63 +2a02:26f7:decd:4000::/64 +2a02:26f7:ded0:4000::/64 +2a02:26f7:ded0:4880::/63 +2a02:26f7:ded1:4000::/64 +2a02:26f7:df00:4000::/64 +2a02:26f7:df00:d140::/61 +2a02:26f7:df00:d148::/64 +2a02:26f7:df01:4000::/64 +2a02:26f7:df04:4000::/64 +2a02:26f7:df04:d140::/61 +2a02:26f7:df04:d148::/64 +2a02:26f7:df05:4000::/64 +2a02:26f7:df08:4000::/64 +2a02:26f7:df08:d140::/61 +2a02:26f7:df08:d148::/64 +2a02:26f7:df09:4000::/64 +2a02:26f7:df40:4000::/64 +2a02:26f7:df40:4740::/61 +2a02:26f7:df40:4748::/64 +2a02:26f7:df41:4000::/64 +2a02:26f7:df44:4000::/64 +2a02:26f7:df44:4740::/61 +2a02:26f7:df44:4748::/64 +2a02:26f7:df45:4000::/64 +2a02:26f7:df48:4000::/64 +2a02:26f7:df48:4740::/61 +2a02:26f7:df48:4748::/64 +2a02:26f7:df49:4000::/64 +2a02:26f7:df4c:4000::/64 +2a02:26f7:df4c:4740::/61 +2a02:26f7:df4c:4748::/64 +2a02:26f7:df4d:4000::/64 +2a02:26f7:df80::/54 +2a02:26f7:df80:400::/58 +2a02:26f7:df80:440::/59 +2a02:26f7:df80:460::/60 +2a02:26f7:df80:4000::/64 +2a02:26f7:df80:5200::/60 +2a02:26f7:df80:5210::/61 +2a02:26f7:df80:5218::/62 +2a02:26f7:df81:4000::/64 +2a02:26f7:df84::/54 +2a02:26f7:df84:400::/58 +2a02:26f7:df84:440::/59 +2a02:26f7:df84:460::/60 +2a02:26f7:df84:4000::/64 +2a02:26f7:df84:5200::/60 +2a02:26f7:df84:5210::/61 +2a02:26f7:df84:5218::/62 +2a02:26f7:df85:4000::/64 +2a02:26f7:df88::/54 +2a02:26f7:df88:400::/58 +2a02:26f7:df88:440::/59 +2a02:26f7:df88:460::/60 +2a02:26f7:df88:4000::/64 +2a02:26f7:df88:5200::/60 +2a02:26f7:df88:5210::/61 +2a02:26f7:df88:5218::/62 +2a02:26f7:df89:4000::/64 +2a02:26f7:df8c::/54 +2a02:26f7:df8c:400::/58 +2a02:26f7:df8c:440::/59 +2a02:26f7:df8c:460::/60 +2a02:26f7:df8c:4000::/64 +2a02:26f7:df8c:5200::/60 +2a02:26f7:df8c:5210::/61 +2a02:26f7:df8c:5218::/62 +2a02:26f7:df8d:4000::/64 +2a02:26f7:dfc0::/54 +2a02:26f7:dfc0:400::/56 +2a02:26f7:dfc0:4000::/64 +2a02:26f7:dfc0:46c0::/59 +2a02:26f7:dfc0:46e0::/62 +2a02:26f7:dfc0:46e4::/63 +2a02:26f7:dfc0:46e7::/64 +2a02:26f7:dfc0:46e8::/61 +2a02:26f7:dfc0:46f0::/60 +2a02:26f7:dfc0:da80::/61 +2a02:26f7:dfc0:da89::/64 +2a02:26f7:dfc0:da8a::/63 +2a02:26f7:dfc0:da8c::/62 +2a02:26f7:dfc0:da90::/60 +2a02:26f7:dfc1:4000::/64 +2a02:26f7:dfc4::/54 +2a02:26f7:dfc4:400::/56 +2a02:26f7:dfc4:4000::/64 +2a02:26f7:dfc4:46c0::/59 +2a02:26f7:dfc4:46e0::/62 +2a02:26f7:dfc4:46e4::/63 +2a02:26f7:dfc4:46e7::/64 +2a02:26f7:dfc4:46e8::/61 +2a02:26f7:dfc4:46f0::/60 +2a02:26f7:dfc4:da80::/61 +2a02:26f7:dfc4:da89::/64 +2a02:26f7:dfc4:da8a::/63 +2a02:26f7:dfc4:da8c::/62 +2a02:26f7:dfc4:da90::/60 +2a02:26f7:dfc5:4000::/64 +2a02:26f7:dfc8::/54 +2a02:26f7:dfc8:400::/56 +2a02:26f7:dfc8:4000::/64 +2a02:26f7:dfc8:46c0::/59 +2a02:26f7:dfc8:46e0::/62 +2a02:26f7:dfc8:46e4::/63 +2a02:26f7:dfc8:46e7::/64 +2a02:26f7:dfc8:46e8::/61 +2a02:26f7:dfc8:46f0::/60 +2a02:26f7:dfc8:da80::/61 +2a02:26f7:dfc8:da89::/64 +2a02:26f7:dfc8:da8a::/63 +2a02:26f7:dfc8:da8c::/62 +2a02:26f7:dfc8:da90::/60 +2a02:26f7:dfc9:4000::/64 +2a02:26f7:dfcc::/54 +2a02:26f7:dfcc:400::/56 +2a02:26f7:dfcc:4000::/64 +2a02:26f7:dfcc:46c0::/59 +2a02:26f7:dfcc:46e0::/62 +2a02:26f7:dfcc:46e4::/63 +2a02:26f7:dfcc:46e7::/64 +2a02:26f7:dfcc:46e8::/61 +2a02:26f7:dfcc:46f0::/60 +2a02:26f7:dfcc:da80::/61 +2a02:26f7:dfcc:da89::/64 +2a02:26f7:dfcc:da8a::/63 +2a02:26f7:dfcc:da8c::/62 +2a02:26f7:dfcc:da90::/60 +2a02:26f7:dfcd::/54 +2a02:26f7:dfcd:400::/56 +2a02:26f7:dfcd:4000::/64 +2a02:26f7:dfcd:46c0::/59 +2a02:26f7:dfcd:46e0::/62 +2a02:26f7:dfcd:46e4::/63 +2a02:26f7:dfcd:46e7::/64 +2a02:26f7:dfcd:46e8::/61 +2a02:26f7:dfcd:46f0::/60 +2a02:26f7:dfcd:da80::/61 +2a02:26f7:dfcd:da89::/64 +2a02:26f7:dfcd:da8a::/63 +2a02:26f7:dfcd:da8c::/62 +2a02:26f7:dfcd:da90::/60 +2a02:26f7:dfce:4000::/64 +2a02:26f7:dfcf:4000::/64 +2a02:26f7:e000::/54 +2a02:26f7:e000:400::/56 +2a02:26f7:e000:4000::/64 +2a02:26f7:e000:4680::/58 +2a02:26f7:e000:dc00::/59 +2a02:26f7:e000:dc20::/62 +2a02:26f7:e001:4000::/64 +2a02:26f7:e004::/54 +2a02:26f7:e004:400::/56 +2a02:26f7:e004:4000::/64 +2a02:26f7:e004:4680::/58 +2a02:26f7:e004:dc00::/59 +2a02:26f7:e004:dc20::/62 +2a02:26f7:e005:4000::/64 +2a02:26f7:e008::/54 +2a02:26f7:e008:400::/56 +2a02:26f7:e008:4000::/64 +2a02:26f7:e008:4680::/58 +2a02:26f7:e008:dc00::/59 +2a02:26f7:e008:dc20::/62 +2a02:26f7:e009:4000::/64 +2a02:26f7:e040:4000::/64 +2a02:26f7:e040:cda0::/63 +2a02:26f7:e040:cda2::/64 +2a02:26f7:e041:4000::/64 +2a02:26f7:e042:4000::/64 +2a02:26f7:e042:cda0::/63 +2a02:26f7:e042:cda2::/64 +2a02:26f7:e043:4000::/64 +2a02:26f7:e044:4000::/64 +2a02:26f7:e044:cda0::/63 +2a02:26f7:e044:cda2::/64 +2a02:26f7:e045:4000::/64 +2a02:26f7:e048:4000::/64 +2a02:26f7:e048:cda0::/63 +2a02:26f7:e048:cda2::/64 +2a02:26f7:e049:4000::/64 +2a02:26f7:e04c:4000::/64 +2a02:26f7:e04c:cda0::/63 +2a02:26f7:e04c:cda2::/64 +2a02:26f7:e04d:4000::/64 +2a02:26f7:e080:4000::/64 +2a02:26f7:e080:c200::/64 +2a02:26f7:e081:4000::/64 +2a02:26f7:e084:4000::/64 +2a02:26f7:e084:c200::/64 +2a02:26f7:e085:4000::/64 +2a02:26f7:e088:4000::/64 +2a02:26f7:e088:c200::/64 +2a02:26f7:e089:4000::/64 +2a02:26f7:e08c:4000::/64 +2a02:26f7:e08c:c200::/64 +2a02:26f7:e08d:4000::/64 +2a02:26f7:e0c0:4000::/64 +2a02:26f7:e0c0:ce40::/63 +2a02:26f7:e0c0:ce43::/64 +2a02:26f7:e0c1:4000::/64 +2a02:26f7:e0c4:4000::/64 +2a02:26f7:e0c4:ce40::/63 +2a02:26f7:e0c4:ce43::/64 +2a02:26f7:e0c5:4000::/64 +2a02:26f7:e0c8:4000::/64 +2a02:26f7:e0c8:ce40::/63 +2a02:26f7:e0c8:ce43::/64 +2a02:26f7:e0c9:4000::/64 +2a02:26f7:e0cc:4000::/64 +2a02:26f7:e0cc:ce40::/63 +2a02:26f7:e0cc:ce43::/64 +2a02:26f7:e0cd:4000::/64 +2a02:26f7:e100:4000::/64 +2a02:26f7:e100:d480::/60 +2a02:26f7:e100:d490::/61 +2a02:26f7:e100:d498::/62 +2a02:26f7:e101:4000::/64 +2a02:26f7:e104:4000::/64 +2a02:26f7:e104:d480::/60 +2a02:26f7:e104:d490::/61 +2a02:26f7:e104:d498::/62 +2a02:26f7:e105:4000::/64 +2a02:26f7:e108:4000::/64 +2a02:26f7:e108:d480::/60 +2a02:26f7:e108:d490::/61 +2a02:26f7:e108:d498::/62 +2a02:26f7:e109:4000::/64 +2a02:26f7:e10c:4000::/64 +2a02:26f7:e10c:d480::/60 +2a02:26f7:e10c:d490::/61 +2a02:26f7:e10c:d498::/62 +2a02:26f7:e10d:4000::/64 +2a02:26f7:e140:4000::/64 +2a02:26f7:e140:c0e0::/64 +2a02:26f7:e141:4000::/64 +2a02:26f7:e144:4000::/64 +2a02:26f7:e144:c0e0::/64 +2a02:26f7:e145:4000::/64 +2a02:26f7:e148:4000::/64 +2a02:26f7:e148:c0e0::/64 +2a02:26f7:e149:4000::/64 +2a02:26f7:e14c:4000::/64 +2a02:26f7:e14c:c0e0::/64 +2a02:26f7:e14d:4000::/64 +2a02:26f7:e180:4000::/64 +2a02:26f7:e180:4180::/58 +2a02:26f7:e180:da00::/60 +2a02:26f7:e180:da10::/61 +2a02:26f7:e180:da18::/63 +2a02:26f7:e181:4000::/64 +2a02:26f7:e184:4000::/64 +2a02:26f7:e184:4180::/58 +2a02:26f7:e184:da00::/60 +2a02:26f7:e184:da10::/61 +2a02:26f7:e184:da18::/63 +2a02:26f7:e185:4000::/64 +2a02:26f7:e188:4000::/64 +2a02:26f7:e188:4180::/58 +2a02:26f7:e188:da00::/60 +2a02:26f7:e188:da10::/61 +2a02:26f7:e188:da18::/63 +2a02:26f7:e189:4000::/64 +2a02:26f7:e1c0:4000::/64 +2a02:26f7:e1c0:ca00::/63 +2a02:26f7:e1c1:4000::/64 +2a02:26f7:e1c4:4000::/64 +2a02:26f7:e1c4:ca00::/63 +2a02:26f7:e1c5:4000::/64 +2a02:26f7:e1c8:4000::/64 +2a02:26f7:e1c8:ca00::/63 +2a02:26f7:e1c9:4000::/64 +2a02:26f7:e200:4000::/64 +2a02:26f7:e200:cfa0::/62 +2a02:26f7:e200:cfa4::/63 +2a02:26f7:e201:4000::/64 +2a02:26f7:e204:4000::/64 +2a02:26f7:e204:cfa0::/62 +2a02:26f7:e204:cfa4::/63 +2a02:26f7:e205:4000::/64 +2a02:26f7:e208:4000::/64 +2a02:26f7:e208:cfa0::/62 +2a02:26f7:e208:cfa4::/63 +2a02:26f7:e209:4000::/64 +2a02:26f7:e240:4000::/64 +2a02:26f7:e240:d0e0::/61 +2a02:26f7:e240:d0e8::/64 +2a02:26f7:e241:4000::/64 +2a02:26f7:e244:4000::/64 +2a02:26f7:e244:d0e0::/61 +2a02:26f7:e244:d0e8::/64 +2a02:26f7:e245:4000::/64 +2a02:26f7:e248:4000::/64 +2a02:26f7:e248:d0e0::/61 +2a02:26f7:e248:d0e8::/64 +2a02:26f7:e249:4000::/64 +2a02:26f7:e280:4000::/64 +2a02:26f7:e280:c6e0::/64 +2a02:26f7:e281:4000::/64 +2a02:26f7:e282:4000::/64 +2a02:26f7:e282:c6e0::/64 +2a02:26f7:e283:4000::/64 +2a02:26f7:e284:4000::/64 +2a02:26f7:e284:c6e0::/64 +2a02:26f7:e285:4000::/64 +2a02:26f7:e288:4000::/64 +2a02:26f7:e288:c6e0::/64 +2a02:26f7:e289:4000::/64 +2a02:26f7:e2c0:4000::/64 +2a02:26f7:e2c0:c3c0::/64 +2a02:26f7:e2c1:4000::/64 +2a02:26f7:e2c2:4000::/64 +2a02:26f7:e2c2:c3c0::/64 +2a02:26f7:e2c3:4000::/64 +2a02:26f7:e2c4:4000::/64 +2a02:26f7:e2c4:c3c0::/64 +2a02:26f7:e2c5:4000::/64 +2a02:26f7:e2c8:4000::/64 +2a02:26f7:e2c8:c3c0::/64 +2a02:26f7:e2c9:4000::/64 +2a02:26f7:e340::/54 +2a02:26f7:e340:400::/56 +2a02:26f7:e340:500::/57 +2a02:26f7:e340:580::/59 +2a02:26f7:e340:4000::/64 +2a02:26f7:e340:5400::/58 +2a02:26f7:e340:5440::/60 +2a02:26f7:e340:5450::/62 +2a02:26f7:e341:4000::/64 +2a02:26f7:e342::/54 +2a02:26f7:e342:400::/56 +2a02:26f7:e342:500::/57 +2a02:26f7:e342:580::/59 +2a02:26f7:e342:4000::/64 +2a02:26f7:e342:5400::/58 +2a02:26f7:e342:5440::/60 +2a02:26f7:e342:5450::/62 +2a02:26f7:e343:4000::/64 +2a02:26f7:e344::/54 +2a02:26f7:e344:400::/56 +2a02:26f7:e344:500::/57 +2a02:26f7:e344:580::/59 +2a02:26f7:e344:4000::/64 +2a02:26f7:e344:5400::/58 +2a02:26f7:e344:5440::/60 +2a02:26f7:e344:5450::/62 +2a02:26f7:e345:4000::/64 +2a02:26f7:e348::/54 +2a02:26f7:e348:400::/56 +2a02:26f7:e348:500::/57 +2a02:26f7:e348:580::/59 +2a02:26f7:e348:4000::/64 +2a02:26f7:e348:5400::/58 +2a02:26f7:e348:5440::/60 +2a02:26f7:e348:5450::/62 +2a02:26f7:e349:4000::/64 +2a02:26f7:e34c::/54 +2a02:26f7:e34c:400::/56 +2a02:26f7:e34c:500::/57 +2a02:26f7:e34c:580::/59 +2a02:26f7:e34c:4000::/64 +2a02:26f7:e34c:5400::/58 +2a02:26f7:e34c:5440::/60 +2a02:26f7:e34c:5450::/62 +2a02:26f7:e34d:4000::/64 +2a02:26f7:e380:4000::/64 +2a02:26f7:e380:cec0::/62 +2a02:26f7:e381:4000::/64 +2a02:26f7:e384:4000::/64 +2a02:26f7:e384:cec0::/62 +2a02:26f7:e385:4000::/64 +2a02:26f7:e388:4000::/64 +2a02:26f7:e388:cec0::/62 +2a02:26f7:e389:4000::/64 +2a02:26f7:e38c:4000::/64 +2a02:26f7:e38c:cec0::/62 +2a02:26f7:e38d:4000::/64 +2a02:26f7:e3c0:4000::/64 +2a02:26f7:e3c0:c500::/64 +2a02:26f7:e3c1:4000::/64 +2a02:26f7:e3c2:4000::/64 +2a02:26f7:e3c2:c500::/64 +2a02:26f7:e3c3:4000::/64 +2a02:26f7:e3c4:4000::/64 +2a02:26f7:e3c4:c500::/64 +2a02:26f7:e3c5:4000::/64 +2a02:26f7:e3c8:4000::/64 +2a02:26f7:e3c8:c500::/64 +2a02:26f7:e3c9:4000::/64 +2a02:26f7:e400:4000::/64 +2a02:26f7:e400:cae0::/63 +2a02:26f7:e401:4000::/64 +2a02:26f7:e404:4000::/64 +2a02:26f7:e404:cae0::/63 +2a02:26f7:e405:4000::/64 +2a02:26f7:e408:4000::/64 +2a02:26f7:e408:cae0::/63 +2a02:26f7:e409:4000::/64 +2a02:26f7:e440:4000::/64 +2a02:26f7:e441:4000::/64 +2a02:26f7:e444:4000::/64 +2a02:26f7:e445:4000::/64 +2a02:26f7:e448:4000::/64 +2a02:26f7:e449:4000::/64 +2a02:26f7:e480::/53 +2a02:26f7:e480:800::/54 +2a02:26f7:e480:c00::/56 +2a02:26f7:e480:d00::/58 +2a02:26f7:e480:d40::/60 +2a02:26f7:e480:4000::/64 +2a02:26f7:e480:5700::/58 +2a02:26f7:e480:5740::/59 +2a02:26f7:e480:5760::/61 +2a02:26f7:e480:5768::/63 +2a02:26f7:e480:576a::/64 +2a02:26f7:e481:4000::/64 +2a02:26f7:e484::/53 +2a02:26f7:e484:800::/54 +2a02:26f7:e484:c00::/56 +2a02:26f7:e484:d00::/58 +2a02:26f7:e484:d40::/60 +2a02:26f7:e484:4000::/64 +2a02:26f7:e484:5700::/58 +2a02:26f7:e484:5740::/59 +2a02:26f7:e484:5760::/61 +2a02:26f7:e484:5768::/63 +2a02:26f7:e484:576a::/64 +2a02:26f7:e485:4000::/64 +2a02:26f7:e488::/53 +2a02:26f7:e488:800::/54 +2a02:26f7:e488:c00::/56 +2a02:26f7:e488:d00::/58 +2a02:26f7:e488:d40::/60 +2a02:26f7:e488:4000::/64 +2a02:26f7:e488:5700::/58 +2a02:26f7:e488:5740::/59 +2a02:26f7:e488:5760::/61 +2a02:26f7:e488:5768::/63 +2a02:26f7:e488:576a::/64 +2a02:26f7:e489:4000::/64 +2a02:26f7:e48c::/53 +2a02:26f7:e48c:800::/54 +2a02:26f7:e48c:c00::/56 +2a02:26f7:e48c:d00::/58 +2a02:26f7:e48c:d40::/60 +2a02:26f7:e48c:4000::/64 +2a02:26f7:e48c:5700::/58 +2a02:26f7:e48c:5740::/59 +2a02:26f7:e48c:5760::/61 +2a02:26f7:e48c:5768::/63 +2a02:26f7:e48c:576a::/64 +2a02:26f7:e48d:4000::/64 +2a02:26f7:e490::/53 +2a02:26f7:e490:800::/54 +2a02:26f7:e490:c00::/56 +2a02:26f7:e490:d00::/58 +2a02:26f7:e490:d40::/60 +2a02:26f7:e490:4000::/64 +2a02:26f7:e490:5700::/58 +2a02:26f7:e490:5740::/59 +2a02:26f7:e490:5760::/61 +2a02:26f7:e490:5768::/63 +2a02:26f7:e490:576a::/64 +2a02:26f7:e491:4000::/64 +2a02:26f7:e4c0:4000::/64 +2a02:26f7:e4c1:4000::/64 +2a02:26f7:e4c2:4000::/64 +2a02:26f7:e4c3:4000::/64 +2a02:26f7:e4c8:4000::/64 +2a02:26f7:e4c9:4000::/64 +2a02:26f7:e500::/53 +2a02:26f7:e500:800::/55 +2a02:26f7:e500:a00::/56 +2a02:26f7:e500:b00::/57 +2a02:26f7:e500:4000::/64 +2a02:26f7:e500:5800::/56 +2a02:26f7:e500:f000::/57 +2a02:26f7:e500:f080::/60 +2a02:26f7:e500:f090::/61 +2a02:26f7:e500:f098::/62 +2a02:26f7:e500:f09c::/63 +2a02:26f7:e500:f09e::/64 +2a02:26f7:e501:4000::/64 +2a02:26f7:e502::/53 +2a02:26f7:e502:800::/55 +2a02:26f7:e502:a00::/56 +2a02:26f7:e502:b00::/57 +2a02:26f7:e502:4000::/64 +2a02:26f7:e502:5800::/56 +2a02:26f7:e502:f000::/57 +2a02:26f7:e502:f080::/60 +2a02:26f7:e502:f090::/61 +2a02:26f7:e502:f098::/62 +2a02:26f7:e502:f09c::/63 +2a02:26f7:e502:f09e::/64 +2a02:26f7:e503:4000::/64 +2a02:26f7:e504::/53 +2a02:26f7:e504:800::/55 +2a02:26f7:e504:a00::/56 +2a02:26f7:e504:b00::/57 +2a02:26f7:e504:4000::/64 +2a02:26f7:e504:5800::/56 +2a02:26f7:e504:f000::/57 +2a02:26f7:e504:f080::/60 +2a02:26f7:e504:f090::/61 +2a02:26f7:e504:f098::/62 +2a02:26f7:e504:f09c::/63 +2a02:26f7:e504:f09e::/64 +2a02:26f7:e505:4000::/64 +2a02:26f7:e506::/53 +2a02:26f7:e506:800::/55 +2a02:26f7:e506:a00::/56 +2a02:26f7:e506:b00::/57 +2a02:26f7:e506:4000::/64 +2a02:26f7:e506:5800::/56 +2a02:26f7:e506:f000::/57 +2a02:26f7:e506:f080::/60 +2a02:26f7:e506:f090::/61 +2a02:26f7:e506:f098::/62 +2a02:26f7:e506:f09c::/63 +2a02:26f7:e506:f09e::/64 +2a02:26f7:e507:4000::/64 +2a02:26f7:e508::/53 +2a02:26f7:e508:800::/55 +2a02:26f7:e508:a00::/56 +2a02:26f7:e508:b00::/57 +2a02:26f7:e508:4000::/64 +2a02:26f7:e508:5800::/56 +2a02:26f7:e508:f000::/57 +2a02:26f7:e508:f080::/60 +2a02:26f7:e508:f090::/61 +2a02:26f7:e508:f098::/62 +2a02:26f7:e508:f09c::/63 +2a02:26f7:e508:f09e::/64 +2a02:26f7:e509:4000::/64 +2a02:26f7:e510::/53 +2a02:26f7:e510:800::/55 +2a02:26f7:e510:a00::/56 +2a02:26f7:e510:b00::/57 +2a02:26f7:e510:4000::/64 +2a02:26f7:e510:5800::/56 +2a02:26f7:e510:f000::/57 +2a02:26f7:e510:f080::/60 +2a02:26f7:e510:f090::/61 +2a02:26f7:e510:f098::/62 +2a02:26f7:e510:f09c::/63 +2a02:26f7:e510:f09e::/64 +2a02:26f7:e511:4000::/64 +2a02:26f7:e514::/53 +2a02:26f7:e514:800::/55 +2a02:26f7:e514:a00::/56 +2a02:26f7:e514:b00::/57 +2a02:26f7:e514:4000::/64 +2a02:26f7:e514:5800::/56 +2a02:26f7:e514:f000::/57 +2a02:26f7:e514:f080::/60 +2a02:26f7:e514:f090::/61 +2a02:26f7:e514:f098::/62 +2a02:26f7:e514:f09c::/63 +2a02:26f7:e514:f09e::/64 +2a02:26f7:e515:4000::/64 +2a02:26f7:e51c::/53 +2a02:26f7:e51c:800::/55 +2a02:26f7:e51c:a00::/56 +2a02:26f7:e51c:b00::/57 +2a02:26f7:e51c:4000::/64 +2a02:26f7:e51c:5800::/56 +2a02:26f7:e51c:f000::/57 +2a02:26f7:e51c:f080::/60 +2a02:26f7:e51c:f090::/61 +2a02:26f7:e51c:f098::/62 +2a02:26f7:e51c:f09c::/63 +2a02:26f7:e51c:f09e::/64 +2a02:26f7:e51d:4000::/64 +2a02:26f7:e524::/53 +2a02:26f7:e524:800::/55 +2a02:26f7:e524:a00::/56 +2a02:26f7:e524:b00::/57 +2a02:26f7:e524:4000::/64 +2a02:26f7:e524:5800::/56 +2a02:26f7:e524:f000::/57 +2a02:26f7:e524:f080::/60 +2a02:26f7:e524:f090::/61 +2a02:26f7:e524:f098::/62 +2a02:26f7:e524:f09c::/63 +2a02:26f7:e524:f09e::/64 +2a02:26f7:e525:4000::/64 +2a02:26f7:e528::/53 +2a02:26f7:e528:800::/55 +2a02:26f7:e528:a00::/56 +2a02:26f7:e528:b00::/57 +2a02:26f7:e528:4000::/64 +2a02:26f7:e528:5800::/56 +2a02:26f7:e528:f000::/57 +2a02:26f7:e528:f080::/60 +2a02:26f7:e528:f090::/61 +2a02:26f7:e528:f098::/62 +2a02:26f7:e528:f09c::/63 +2a02:26f7:e528:f09e::/64 +2a02:26f7:e529:4000::/64 +2a02:26f7:e52c::/53 +2a02:26f7:e52c:800::/55 +2a02:26f7:e52c:a00::/56 +2a02:26f7:e52c:b00::/57 +2a02:26f7:e52c:4000::/64 +2a02:26f7:e52c:5800::/56 +2a02:26f7:e52c:f000::/57 +2a02:26f7:e52c:f080::/60 +2a02:26f7:e52c:f090::/61 +2a02:26f7:e52c:f098::/62 +2a02:26f7:e52c:f09c::/63 +2a02:26f7:e52c:f09e::/64 +2a02:26f7:e52d:4000::/64 +2a02:26f7:e530::/53 +2a02:26f7:e530:800::/55 +2a02:26f7:e530:a00::/56 +2a02:26f7:e530:b00::/57 +2a02:26f7:e530:4000::/64 +2a02:26f7:e530:5800::/56 +2a02:26f7:e530:f000::/57 +2a02:26f7:e530:f080::/60 +2a02:26f7:e530:f090::/61 +2a02:26f7:e530:f098::/62 +2a02:26f7:e530:f09c::/63 +2a02:26f7:e530:f09e::/64 +2a02:26f7:e531:4000::/64 +2a02:26f7:e540:4000::/64 +2a02:26f7:e540:d300::/60 +2a02:26f7:e541:4000::/64 +2a02:26f7:e544:4000::/64 +2a02:26f7:e544:d300::/60 +2a02:26f7:e545:4000::/64 +2a02:26f7:e548:4000::/64 +2a02:26f7:e548:d300::/60 +2a02:26f7:e549:4000::/64 +2a02:26f7:e580:4000::/64 +2a02:26f7:e580:d080::/61 +2a02:26f7:e581:4000::/64 +2a02:26f7:e584:4000::/64 +2a02:26f7:e584:d080::/61 +2a02:26f7:e585:4000::/64 +2a02:26f7:e588:4000::/64 +2a02:26f7:e588:d080::/61 +2a02:26f7:e589:4000::/64 +2a02:26f7:e5c0:4000::/64 +2a02:26f7:e5c0:c6c0::/64 +2a02:26f7:e5c1:4000::/64 +2a02:26f7:e5c2:4000::/64 +2a02:26f7:e5c2:c6c0::/64 +2a02:26f7:e5c3:4000::/64 +2a02:26f7:e5c4:4000::/64 +2a02:26f7:e5c4:c6c0::/64 +2a02:26f7:e5c5:4000::/64 +2a02:26f7:e5c8:4000::/64 +2a02:26f7:e5c8:c6c0::/64 +2a02:26f7:e5c9:4000::/64 +2a02:26f7:e600:4000::/64 +2a02:26f7:e600:d120::/62 +2a02:26f7:e600:d125::/64 +2a02:26f7:e600:d126::/63 +2a02:26f7:e600:d128::/64 +2a02:26f7:e601:4000::/64 +2a02:26f7:e602:4000::/64 +2a02:26f7:e602:d120::/62 +2a02:26f7:e602:d125::/64 +2a02:26f7:e602:d126::/63 +2a02:26f7:e602:d128::/64 +2a02:26f7:e603:4000::/64 +2a02:26f7:e604:4000::/64 +2a02:26f7:e604:d120::/62 +2a02:26f7:e604:d125::/64 +2a02:26f7:e604:d126::/63 +2a02:26f7:e604:d128::/64 +2a02:26f7:e605:4000::/64 +2a02:26f7:e608:4000::/64 +2a02:26f7:e608:d120::/62 +2a02:26f7:e608:d125::/64 +2a02:26f7:e608:d126::/63 +2a02:26f7:e608:d128::/64 +2a02:26f7:e609:4000::/64 +2a02:26f7:e640:4000::/64 +2a02:26f7:e641:4000::/64 +2a02:26f7:e642:4000::/64 +2a02:26f7:e643:4000::/64 +2a02:26f7:e644:4000::/64 +2a02:26f7:e645:4000::/64 +2a02:26f7:e648:4000::/64 +2a02:26f7:e649:4000::/64 +2a02:26f7:e680:4000::/64 +2a02:26f7:e680:4f40::/63 +2a02:26f7:e680:4f42::/64 +2a02:26f7:e681:4000::/64 +2a02:26f7:e682:4000::/64 +2a02:26f7:e682:4f40::/63 +2a02:26f7:e682:4f42::/64 +2a02:26f7:e683:4000::/64 +2a02:26f7:e684:4000::/64 +2a02:26f7:e684:4f40::/63 +2a02:26f7:e684:4f42::/64 +2a02:26f7:e685:4000::/64 +2a02:26f7:e688:4000::/64 +2a02:26f7:e688:4f40::/63 +2a02:26f7:e688:4f42::/64 +2a02:26f7:e689:4000::/64 +2a02:26f7:e68c:4000::/64 +2a02:26f7:e68c:4f40::/63 +2a02:26f7:e68c:4f42::/64 +2a02:26f7:e68d:4000::/64 +2a02:26f7:e6c0:4000::/64 +2a02:26f7:e6c0:4f00::/64 +2a02:26f7:e6c1:4000::/64 +2a02:26f7:e6c2:4000::/64 +2a02:26f7:e6c2:4f00::/64 +2a02:26f7:e6c3:4000::/64 +2a02:26f7:e6c8:4000::/64 +2a02:26f7:e6c8:4f00::/64 +2a02:26f7:e6c9:4000::/64 +2a02:26f7:e6cc:4000::/64 +2a02:26f7:e6cc:4f00::/64 +2a02:26f7:e6cd:4000::/64 +2a02:26f7:e6d0:4000::/64 +2a02:26f7:e6d0:4f00::/64 +2a02:26f7:e6d1:4000::/64 +2a02:26f7:e700:4000::/64 +2a02:26f7:e700:4ec0::/59 +2a02:26f7:e700:4ee0::/60 +2a02:26f7:e700:4ef0::/63 +2a02:26f7:e700:4ef2::/64 +2a02:26f7:e701:4000::/64 +2a02:26f7:e702:4000::/64 +2a02:26f7:e702:4ec0::/59 +2a02:26f7:e702:4ee0::/60 +2a02:26f7:e702:4ef0::/63 +2a02:26f7:e702:4ef2::/64 +2a02:26f7:e703:4000::/64 +2a02:26f7:e704:4000::/64 +2a02:26f7:e704:4ec0::/59 +2a02:26f7:e704:4ee0::/60 +2a02:26f7:e704:4ef0::/63 +2a02:26f7:e704:4ef2::/64 +2a02:26f7:e705:4000::/64 +2a02:26f7:e706:4000::/64 +2a02:26f7:e706:4ec0::/59 +2a02:26f7:e706:4ee0::/60 +2a02:26f7:e706:4ef0::/63 +2a02:26f7:e706:4ef2::/64 +2a02:26f7:e707:4000::/64 +2a02:26f7:e70c:4000::/64 +2a02:26f7:e70c:4ec0::/59 +2a02:26f7:e70c:4ee0::/60 +2a02:26f7:e70c:4ef0::/63 +2a02:26f7:e70c:4ef2::/64 +2a02:26f7:e70d:4000::/64 +2a02:26f7:e740:4000::/64 +2a02:26f7:e740:c920::/64 +2a02:26f7:e741:4000::/64 +2a02:26f7:e742:4000::/64 +2a02:26f7:e742:c920::/64 +2a02:26f7:e743:4000::/64 +2a02:26f7:e744:4000::/64 +2a02:26f7:e744:c920::/64 +2a02:26f7:e745:4000::/64 +2a02:26f7:e74c:4000::/64 +2a02:26f7:e74c:c920::/64 +2a02:26f7:e74d:4000::/64 +2a02:26f7:e780:4000::/64 +2a02:26f7:e780:c7a0::/64 +2a02:26f7:e781:4000::/64 +2a02:26f7:e782:4000::/64 +2a02:26f7:e782:c7a0::/64 +2a02:26f7:e783:4000::/64 +2a02:26f7:e784:4000::/64 +2a02:26f7:e784:c7a0::/64 +2a02:26f7:e785:4000::/64 +2a02:26f7:e78c:4000::/64 +2a02:26f7:e78c:c7a0::/64 +2a02:26f7:e78d:4000::/64 +2a02:26f7:e7c0:4000::/64 +2a02:26f7:e7c0:4b80::/61 +2a02:26f7:e7c0:4b88::/62 +2a02:26f7:e7c0:4b8c::/63 +2a02:26f7:e7c0:4b8e::/64 +2a02:26f7:e7c1:4000::/64 +2a02:26f7:e7c2:4000::/64 +2a02:26f7:e7c2:4b80::/61 +2a02:26f7:e7c2:4b88::/62 +2a02:26f7:e7c2:4b8c::/63 +2a02:26f7:e7c2:4b8e::/64 +2a02:26f7:e7c3:4000::/64 +2a02:26f7:e7c4:4000::/64 +2a02:26f7:e7c4:4b80::/61 +2a02:26f7:e7c4:4b88::/62 +2a02:26f7:e7c4:4b8c::/63 +2a02:26f7:e7c4:4b8e::/64 +2a02:26f7:e7c5:4000::/64 +2a02:26f7:e7c8:4000::/64 +2a02:26f7:e7c8:4b80::/61 +2a02:26f7:e7c8:4b88::/62 +2a02:26f7:e7c8:4b8c::/63 +2a02:26f7:e7c8:4b8e::/64 +2a02:26f7:e7c9:4000::/64 +2a02:26f7:e7cc:4000::/64 +2a02:26f7:e7cc:4b80::/61 +2a02:26f7:e7cc:4b88::/62 +2a02:26f7:e7cc:4b8c::/63 +2a02:26f7:e7cc:4b8e::/64 +2a02:26f7:e7cd:4000::/64 +2a02:26f7:e7d0:4000::/64 +2a02:26f7:e7d0:4b80::/61 +2a02:26f7:e7d0:4b88::/62 +2a02:26f7:e7d0:4b8c::/63 +2a02:26f7:e7d0:4b8e::/64 +2a02:26f7:e7d1:4000::/64 +2a02:26f7:e7d4:4000::/64 +2a02:26f7:e7d4:4b80::/61 +2a02:26f7:e7d4:4b88::/62 +2a02:26f7:e7d4:4b8c::/63 +2a02:26f7:e7d4:4b8e::/64 +2a02:26f7:e7d5:4000::/64 +2a02:26f7:e800:4000::/64 +2a02:26f7:e800:4ac0::/61 +2a02:26f7:e801:4000::/64 +2a02:26f7:e802:4000::/64 +2a02:26f7:e802:4ac0::/61 +2a02:26f7:e803:4000::/64 +2a02:26f7:e804:4000::/64 +2a02:26f7:e804:4ac0::/61 +2a02:26f7:e805:4000::/64 +2a02:26f7:e808:4000::/64 +2a02:26f7:e808:4ac0::/61 +2a02:26f7:e809:4000::/64 +2a02:26f7:e80c:4000::/64 +2a02:26f7:e80c:4ac0::/61 +2a02:26f7:e80d:4000::/64 +2a02:26f7:e810:4000::/64 +2a02:26f7:e810:4ac0::/61 +2a02:26f7:e811:4000::/64 +2a02:26f7:e840:4000::/64 +2a02:26f7:e840:c580::/64 +2a02:26f7:e841:4000::/64 +2a02:26f7:e842:4000::/64 +2a02:26f7:e842:c580::/64 +2a02:26f7:e843:4000::/64 +2a02:26f7:e844:4000::/64 +2a02:26f7:e844:c580::/64 +2a02:26f7:e845:4000::/64 +2a02:26f7:e848:4000::/64 +2a02:26f7:e848:c580::/64 +2a02:26f7:e849:4000::/64 +2a02:26f7:e84c:4000::/64 +2a02:26f7:e84c:c580::/64 +2a02:26f7:e84d:4000::/64 +2a02:26f7:e850:4000::/64 +2a02:26f7:e850:c580::/64 +2a02:26f7:e851:4000::/64 +2a02:26f7:e880:4000::/64 +2a02:26f7:e880:c440::/64 +2a02:26f7:e881:4000::/64 +2a02:26f7:e882:4000::/64 +2a02:26f7:e882:c440::/64 +2a02:26f7:e883:4000::/64 +2a02:26f7:e888:4000::/64 +2a02:26f7:e888:c440::/64 +2a02:26f7:e889:4000::/64 +2a02:26f7:e88c:4000::/64 +2a02:26f7:e88c:c440::/64 +2a02:26f7:e88d:4000::/64 +2a02:26f7:e890:4000::/64 +2a02:26f7:e890:c440::/64 +2a02:26f7:e891:4000::/64 +2a02:26f7:e8c0:4000::/64 +2a02:26f7:e8c0:cb20::/63 +2a02:26f7:e8c1:4000::/64 +2a02:26f7:e8c2:4000::/64 +2a02:26f7:e8c2:cb20::/63 +2a02:26f7:e8c3:4000::/64 +2a02:26f7:e8c4:4000::/64 +2a02:26f7:e8c4:cb20::/63 +2a02:26f7:e8c5:4000::/64 +2a02:26f7:e8c8:4000::/64 +2a02:26f7:e8c8:cb20::/63 +2a02:26f7:e8c9:4000::/64 +2a02:26f7:e8cc:4000::/64 +2a02:26f7:e8cc:cb20::/63 +2a02:26f7:e8cd:4000::/64 +2a02:26f7:e8d0:4000::/64 +2a02:26f7:e8d0:cb20::/63 +2a02:26f7:e8d1:4000::/64 +2a02:26f7:e900:4000::/64 +2a02:26f7:e900:c360::/64 +2a02:26f7:e901:4000::/64 +2a02:26f7:e908:4000::/64 +2a02:26f7:e908:c360::/64 +2a02:26f7:e909:4000::/64 +2a02:26f7:e90c:4000::/64 +2a02:26f7:e90c:c360::/64 +2a02:26f7:e90d:4000::/64 +2a02:26f7:e910:4000::/64 +2a02:26f7:e910:c360::/64 +2a02:26f7:e911:4000::/64 +2a02:26f7:e914:4000::/64 +2a02:26f7:e914:c360::/64 +2a02:26f7:e915:4000::/64 +2a02:26f7:e940:4000::/64 +2a02:26f7:e940:cdc0::/63 +2a02:26f7:e940:cdc2::/64 +2a02:26f7:e941:4000::/64 +2a02:26f7:e942:4000::/64 +2a02:26f7:e942:cdc0::/63 +2a02:26f7:e942:cdc2::/64 +2a02:26f7:e943:4000::/64 +2a02:26f7:e944:4000::/64 +2a02:26f7:e944:cdc0::/63 +2a02:26f7:e944:cdc2::/64 +2a02:26f7:e945:4000::/64 +2a02:26f7:e948:4000::/64 +2a02:26f7:e948:cdc0::/63 +2a02:26f7:e948:cdc2::/64 +2a02:26f7:e949:4000::/64 +2a02:26f7:e94c:4000::/64 +2a02:26f7:e94c:cdc0::/63 +2a02:26f7:e94c:cdc2::/64 +2a02:26f7:e94d:4000::/64 +2a02:26f7:e980:4000::/64 +2a02:26f7:e980:c280::/64 +2a02:26f7:e981:4000::/64 +2a02:26f7:e982:4000::/64 +2a02:26f7:e982:c280::/64 +2a02:26f7:e983:4000::/64 +2a02:26f7:e988:4000::/64 +2a02:26f7:e988:c280::/64 +2a02:26f7:e989:4000::/64 +2a02:26f7:e98c:4000::/64 +2a02:26f7:e98c:c280::/64 +2a02:26f7:e98d:4000::/64 +2a02:26f7:e9c0:4000::/64 +2a02:26f7:e9c0:c260::/64 +2a02:26f7:e9c1:4000::/64 +2a02:26f7:e9c2:4000::/64 +2a02:26f7:e9c2:c260::/64 +2a02:26f7:e9c3:4000::/64 +2a02:26f7:e9c4:4000::/64 +2a02:26f7:e9c4:c260::/64 +2a02:26f7:e9c5:4000::/64 +2a02:26f7:e9cc:4000::/64 +2a02:26f7:e9cc:c260::/64 +2a02:26f7:e9cd:4000::/64 +2a02:26f7:ea00:4000::/64 +2a02:26f7:ea01:4000::/64 +2a02:26f7:ea02:4000::/64 +2a02:26f7:ea03:4000::/64 +2a02:26f7:ea04:4000::/64 +2a02:26f7:ea05:4000::/64 +2a02:26f7:ea40:4000::/64 +2a02:26f7:ea40:4400::/58 +2a02:26f7:ea40:d800::/61 +2a02:26f7:ea40:d808::/63 +2a02:26f7:ea41:4000::/64 +2a02:26f7:ea42:4000::/64 +2a02:26f7:ea42:4401::/64 +2a02:26f7:ea42:4402::/63 +2a02:26f7:ea42:4404::/62 +2a02:26f7:ea42:4408::/61 +2a02:26f7:ea42:4410::/60 +2a02:26f7:ea42:4420::/59 +2a02:26f7:ea42:d800::/61 +2a02:26f7:ea42:d808::/63 +2a02:26f7:ea43:4000::/64 +2a02:26f7:ea48:4000::/64 +2a02:26f7:ea48:4400::/58 +2a02:26f7:ea48:d800::/61 +2a02:26f7:ea48:d808::/63 +2a02:26f7:ea49:4000::/64 +2a02:26f7:ea4c:4000::/64 +2a02:26f7:ea4c:4401::/64 +2a02:26f7:ea4c:4402::/63 +2a02:26f7:ea4c:4404::/62 +2a02:26f7:ea4c:4408::/61 +2a02:26f7:ea4c:4410::/60 +2a02:26f7:ea4c:4420::/59 +2a02:26f7:ea4c:d800::/61 +2a02:26f7:ea4c:d808::/63 +2a02:26f7:ea4d:4000::/64 +2a02:26f7:ea80:4000::/64 +2a02:26f7:ea80:c1c0::/64 +2a02:26f7:ea81:4000::/64 +2a02:26f7:ea82:4000::/64 +2a02:26f7:ea82:c1c0::/64 +2a02:26f7:ea83:4000::/64 +2a02:26f7:ea88:4000::/64 +2a02:26f7:ea88:c1c0::/64 +2a02:26f7:ea89:4000::/64 +2a02:26f7:ea8c:4000::/64 +2a02:26f7:ea8c:c1c0::/64 +2a02:26f7:ea8d:4000::/64 +2a02:26f7:ea90:4000::/64 +2a02:26f7:ea90:c1c0::/64 +2a02:26f7:ea91:4000::/64 +2a02:26f7:eb00:4000::/64 +2a02:26f7:eb01:4000::/64 +2a02:26f7:eb04:4000::/64 +2a02:26f7:eb05:4000::/64 +2a02:26f7:eb08:4000::/64 +2a02:26f7:eb09:4000::/64 +2a02:26f7:eb40:4000::/64 +2a02:26f7:eb40:c100::/64 +2a02:26f7:eb41:4000::/64 +2a02:26f7:eb42:4000::/64 +2a02:26f7:eb42:c100::/64 +2a02:26f7:eb43:4000::/64 +2a02:26f7:eb48:4000::/64 +2a02:26f7:eb48:c100::/64 +2a02:26f7:eb49:4000::/64 +2a02:26f7:eb4c:4000::/64 +2a02:26f7:eb4c:c100::/64 +2a02:26f7:eb4d:4000::/64 +2a02:26f7:eb50:4000::/64 +2a02:26f7:eb50:c100::/64 +2a02:26f7:eb51:4000::/64 +2a02:26f7:eb80:4000::/64 +2a02:26f7:eb80:c020::/64 +2a02:26f7:eb81:4000::/64 +2a02:26f7:eb82:4000::/64 +2a02:26f7:eb82:c020::/64 +2a02:26f7:eb83:4000::/64 +2a02:26f7:eb84:4000::/64 +2a02:26f7:eb84:c020::/64 +2a02:26f7:eb85:4000::/64 +2a02:26f7:eb8c:4000::/64 +2a02:26f7:eb8c:c020::/64 +2a02:26f7:eb8d:4000::/64 +2a02:26f7:ebc0:4000::/64 +2a02:26f7:ebc0:c9e0::/63 +2a02:26f7:ebc1:4000::/64 +2a02:26f7:ebc2:4000::/64 +2a02:26f7:ebc2:c9e0::/63 +2a02:26f7:ebc3:4000::/64 +2a02:26f7:ebc4:4000::/64 +2a02:26f7:ebc4:c9e0::/63 +2a02:26f7:ebc5:4000::/64 +2a02:26f7:ebc8:4000::/64 +2a02:26f7:ebc8:c9e0::/63 +2a02:26f7:ebc9:4000::/64 +2a02:26f7:ebcc:4000::/64 +2a02:26f7:ebcc:c9e0::/63 +2a02:26f7:ebcd:4000::/64 +2a02:26f7:ec00:4000::/64 +2a02:26f7:ec00:d280::/61 +2a02:26f7:ec00:d288::/62 +2a02:26f7:ec01:4000::/64 +2a02:26f7:ec04:4000::/64 +2a02:26f7:ec04:d280::/61 +2a02:26f7:ec04:d288::/62 +2a02:26f7:ec05:4000::/64 +2a02:26f7:ec08:4000::/64 +2a02:26f7:ec08:d280::/61 +2a02:26f7:ec08:d288::/62 +2a02:26f7:ec09:4000::/64 +2a02:26f7:ec0c:4000::/64 +2a02:26f7:ec0c:d280::/61 +2a02:26f7:ec0c:d288::/62 +2a02:26f7:ec0d:4000::/64 +2a02:26f7:ec10:4000::/64 +2a02:26f7:ec10:d280::/61 +2a02:26f7:ec10:d288::/62 +2a02:26f7:ec11:4000::/64 +2a02:26f7:ec40::/53 +2a02:26f7:ec40:800::/54 +2a02:26f7:ec40:c00::/55 +2a02:26f7:ec40:e00::/56 +2a02:26f7:ec40:f00::/57 +2a02:26f7:ec40:f80::/58 +2a02:26f7:ec40:fc0::/59 +2a02:26f7:ec40:4000::/64 +2a02:26f7:ec40:6600::/55 +2a02:26f7:ec40:fc00::/57 +2a02:26f7:ec40:fc80::/60 +2a02:26f7:ec40:fc90::/61 +2a02:26f7:ec40:fc98::/62 +2a02:26f7:ec40:fc9c::/63 +2a02:26f7:ec40:fc9e::/64 +2a02:26f7:ec41:4000::/64 +2a02:26f7:ec44::/53 +2a02:26f7:ec44:800::/54 +2a02:26f7:ec44:c00::/55 +2a02:26f7:ec44:e00::/56 +2a02:26f7:ec44:f00::/57 +2a02:26f7:ec44:f80::/58 +2a02:26f7:ec44:fc0::/59 +2a02:26f7:ec44:4000::/64 +2a02:26f7:ec44:6600::/55 +2a02:26f7:ec44:fc00::/57 +2a02:26f7:ec44:fc80::/60 +2a02:26f7:ec44:fc90::/61 +2a02:26f7:ec44:fc98::/62 +2a02:26f7:ec44:fc9c::/63 +2a02:26f7:ec44:fc9e::/64 +2a02:26f7:ec45:4000::/64 +2a02:26f7:ec48::/53 +2a02:26f7:ec48:800::/54 +2a02:26f7:ec48:c00::/55 +2a02:26f7:ec48:e00::/56 +2a02:26f7:ec48:f00::/57 +2a02:26f7:ec48:f80::/58 +2a02:26f7:ec48:fc0::/59 +2a02:26f7:ec48:4000::/64 +2a02:26f7:ec48:6600::/55 +2a02:26f7:ec48:fc00::/57 +2a02:26f7:ec48:fc80::/60 +2a02:26f7:ec48:fc90::/61 +2a02:26f7:ec48:fc98::/62 +2a02:26f7:ec48:fc9c::/63 +2a02:26f7:ec48:fc9e::/64 +2a02:26f7:ec49:4000::/64 +2a02:26f7:ec4c::/53 +2a02:26f7:ec4c:800::/54 +2a02:26f7:ec4c:c00::/55 +2a02:26f7:ec4c:e00::/56 +2a02:26f7:ec4c:f00::/57 +2a02:26f7:ec4c:f80::/58 +2a02:26f7:ec4c:fc0::/59 +2a02:26f7:ec4c:4000::/64 +2a02:26f7:ec4c:6600::/55 +2a02:26f7:ec4c:fc00::/57 +2a02:26f7:ec4c:fc80::/60 +2a02:26f7:ec4c:fc90::/61 +2a02:26f7:ec4c:fc98::/62 +2a02:26f7:ec4c:fc9c::/63 +2a02:26f7:ec4c:fc9e::/64 +2a02:26f7:ec4d:4000::/64 +2a02:26f7:ec50::/53 +2a02:26f7:ec50:800::/54 +2a02:26f7:ec50:c00::/55 +2a02:26f7:ec50:e00::/56 +2a02:26f7:ec50:f00::/57 +2a02:26f7:ec50:f80::/58 +2a02:26f7:ec50:fc0::/59 +2a02:26f7:ec50:4000::/64 +2a02:26f7:ec50:6600::/55 +2a02:26f7:ec50:fc00::/57 +2a02:26f7:ec50:fc80::/60 +2a02:26f7:ec50:fc90::/61 +2a02:26f7:ec50:fc98::/62 +2a02:26f7:ec50:fc9c::/63 +2a02:26f7:ec50:fc9e::/64 +2a02:26f7:ec51:4000::/64 +2a02:26f7:ec54::/53 +2a02:26f7:ec54:800::/54 +2a02:26f7:ec54:c00::/55 +2a02:26f7:ec54:e00::/56 +2a02:26f7:ec54:f00::/57 +2a02:26f7:ec54:f80::/58 +2a02:26f7:ec54:fc0::/59 +2a02:26f7:ec54:4000::/64 +2a02:26f7:ec54:6600::/55 +2a02:26f7:ec54:fc00::/57 +2a02:26f7:ec54:fc80::/60 +2a02:26f7:ec54:fc90::/61 +2a02:26f7:ec54:fc98::/62 +2a02:26f7:ec54:fc9c::/63 +2a02:26f7:ec54:fc9e::/64 +2a02:26f7:ec55:4000::/64 +2a02:26f7:ec58::/53 +2a02:26f7:ec58:800::/54 +2a02:26f7:ec58:c00::/55 +2a02:26f7:ec58:e00::/56 +2a02:26f7:ec58:f00::/57 +2a02:26f7:ec58:f80::/58 +2a02:26f7:ec58:fc0::/59 +2a02:26f7:ec58:4000::/64 +2a02:26f7:ec58:6600::/55 +2a02:26f7:ec58:fc00::/57 +2a02:26f7:ec58:fc80::/60 +2a02:26f7:ec58:fc90::/61 +2a02:26f7:ec58:fc98::/62 +2a02:26f7:ec58:fc9c::/63 +2a02:26f7:ec58:fc9e::/64 +2a02:26f7:ec59:4000::/64 +2a02:26f7:ec5c::/53 +2a02:26f7:ec5c:800::/54 +2a02:26f7:ec5c:c00::/55 +2a02:26f7:ec5c:e00::/56 +2a02:26f7:ec5c:f00::/57 +2a02:26f7:ec5c:f80::/58 +2a02:26f7:ec5c:fc0::/59 +2a02:26f7:ec5c:4000::/64 +2a02:26f7:ec5c:6600::/55 +2a02:26f7:ec5c:fc00::/57 +2a02:26f7:ec5c:fc80::/60 +2a02:26f7:ec5c:fc90::/61 +2a02:26f7:ec5c:fc98::/62 +2a02:26f7:ec5c:fc9c::/63 +2a02:26f7:ec5c:fc9e::/64 +2a02:26f7:ec5d:4000::/64 +2a02:26f7:ec60::/53 +2a02:26f7:ec60:800::/54 +2a02:26f7:ec60:c00::/55 +2a02:26f7:ec60:e00::/56 +2a02:26f7:ec60:f00::/57 +2a02:26f7:ec60:f80::/58 +2a02:26f7:ec60:fc0::/59 +2a02:26f7:ec60:4000::/64 +2a02:26f7:ec60:6600::/55 +2a02:26f7:ec60:fc00::/57 +2a02:26f7:ec60:fc80::/60 +2a02:26f7:ec60:fc90::/61 +2a02:26f7:ec60:fc98::/62 +2a02:26f7:ec60:fc9c::/63 +2a02:26f7:ec60:fc9e::/64 +2a02:26f7:ec61:4000::/64 +2a02:26f7:ec64::/53 +2a02:26f7:ec64:800::/54 +2a02:26f7:ec64:c00::/55 +2a02:26f7:ec64:e00::/56 +2a02:26f7:ec64:f00::/57 +2a02:26f7:ec64:f80::/58 +2a02:26f7:ec64:fc0::/59 +2a02:26f7:ec64:4000::/64 +2a02:26f7:ec64:6600::/55 +2a02:26f7:ec64:fc00::/57 +2a02:26f7:ec64:fc80::/60 +2a02:26f7:ec64:fc90::/61 +2a02:26f7:ec64:fc98::/62 +2a02:26f7:ec64:fc9c::/63 +2a02:26f7:ec64:fc9e::/64 +2a02:26f7:ec65:4000::/64 +2a02:26f7:ec80:4000::/64 +2a02:26f7:ec80:c840::/64 +2a02:26f7:ec81:4000::/64 +2a02:26f7:ec84:4000::/64 +2a02:26f7:ec84:c840::/64 +2a02:26f7:ec85:4000::/64 +2a02:26f7:ec88:4000::/64 +2a02:26f7:ec88:c840::/64 +2a02:26f7:ec89:4000::/64 +2a02:26f7:ec8c:4000::/64 +2a02:26f7:ec8c:c840::/64 +2a02:26f7:ec8d:4000::/64 +2a02:26f7:ecc0:4000::/64 +2a02:26f7:ecc0:c7e0::/64 +2a02:26f7:ecc1:4000::/64 +2a02:26f7:ecc2:4000::/64 +2a02:26f7:ecc2:c7e0::/64 +2a02:26f7:ecc3:4000::/64 +2a02:26f7:ecc4:4000::/64 +2a02:26f7:ecc4:c7e0::/64 +2a02:26f7:ecc5:4000::/64 +2a02:26f7:eccc:4000::/64 +2a02:26f7:eccc:c7e0::/64 +2a02:26f7:eccd:4000::/64 +2a02:26f7:ed00:4000::/64 +2a02:26f7:ed00:cbc0::/63 +2a02:26f7:ed01:4000::/64 +2a02:26f7:ed02:4000::/64 +2a02:26f7:ed02:cbc0::/63 +2a02:26f7:ed03:4000::/64 +2a02:26f7:ed04:4000::/64 +2a02:26f7:ed04:cbc0::/63 +2a02:26f7:ed05:4000::/64 +2a02:26f7:ed0c:4000::/64 +2a02:26f7:ed0c:cbc0::/63 +2a02:26f7:ed0d:4000::/64 +2a02:26f7:ed40:4000::/64 +2a02:26f7:ed40:d5c0::/59 +2a02:26f7:ed40:d5e0::/61 +2a02:26f7:ed40:d5e8::/62 +2a02:26f7:ed40:d5ec::/64 +2a02:26f7:ed41:4000::/64 +2a02:26f7:ed42:4000::/64 +2a02:26f7:ed42:d5c0::/59 +2a02:26f7:ed42:d5e0::/61 +2a02:26f7:ed42:d5e8::/62 +2a02:26f7:ed42:d5ec::/64 +2a02:26f7:ed43:4000::/64 +2a02:26f7:ed48:4000::/64 +2a02:26f7:ed48:d5c0::/59 +2a02:26f7:ed48:d5e0::/61 +2a02:26f7:ed48:d5e8::/62 +2a02:26f7:ed48:d5ec::/64 +2a02:26f7:ed49:4000::/64 +2a02:26f7:ed4c:4000::/64 +2a02:26f7:ed4c:d5c0::/59 +2a02:26f7:ed4c:d5e0::/61 +2a02:26f7:ed4c:d5e8::/62 +2a02:26f7:ed4c:d5ec::/64 +2a02:26f7:ed4d:4000::/64 +2a02:26f7:ed80:4000::/64 +2a02:26f7:ed80:c600::/64 +2a02:26f7:ed81:4000::/64 +2a02:26f7:ed88:4000::/64 +2a02:26f7:ed88:c600::/64 +2a02:26f7:ed89:4000::/64 +2a02:26f7:ed8c:4000::/64 +2a02:26f7:ed8c:c600::/64 +2a02:26f7:ed8d:4000::/64 +2a02:26f7:edc0:4000::/64 +2a02:26f7:edc0:c560::/64 +2a02:26f7:edc1:4000::/64 +2a02:26f7:edc2:4000::/64 +2a02:26f7:edc2:c560::/64 +2a02:26f7:edc3:4000::/64 +2a02:26f7:edc4:4000::/64 +2a02:26f7:edc4:c560::/64 +2a02:26f7:edc5:4000::/64 +2a02:26f7:edc8:4000::/64 +2a02:26f7:edc8:c560::/64 +2a02:26f7:edc9:4000::/64 +2a02:26f7:ee00:4000::/64 +2a02:26f7:ee00:cde0::/63 +2a02:26f7:ee00:cde2::/64 +2a02:26f7:ee01:4000::/64 +2a02:26f7:ee08:4000::/64 +2a02:26f7:ee08:cde0::/63 +2a02:26f7:ee08:cde2::/64 +2a02:26f7:ee09:4000::/64 +2a02:26f7:ee0c:4000::/64 +2a02:26f7:ee0c:cde0::/63 +2a02:26f7:ee0c:cde2::/64 +2a02:26f7:ee0d:4000::/64 +2a02:26f7:ee40:4000::/64 +2a02:26f7:ee40:c2c0::/64 +2a02:26f7:ee41:4000::/64 +2a02:26f7:ee42:4000::/64 +2a02:26f7:ee42:c2c0::/64 +2a02:26f7:ee43:4000::/64 +2a02:26f7:ee44:4000::/64 +2a02:26f7:ee44:c2c0::/64 +2a02:26f7:ee45:4000::/64 +2a02:26f7:ee48:4000::/64 +2a02:26f7:ee48:c2c0::/64 +2a02:26f7:ee49:4000::/64 +2a02:26f7:ee80:4000::/64 +2a02:26f7:ee80:c240::/64 +2a02:26f7:ee81:4000::/64 +2a02:26f7:ee88:4000::/64 +2a02:26f7:ee88:c240::/64 +2a02:26f7:ee89:4000::/64 +2a02:26f7:ee8c:4000::/64 +2a02:26f7:ee8c:c240::/64 +2a02:26f7:ee8d:4000::/64 +2a02:26f7:eec0:4000::/64 +2a02:26f7:eec0:4440::/64 +2a02:26f7:eec0:4443::/64 +2a02:26f7:eec0:4446::/63 +2a02:26f7:eec0:4448::/62 +2a02:26f7:eec0:444c::/63 +2a02:26f7:eec1:4000::/64 +2a02:26f7:eec2:4000::/64 +2a02:26f7:eec2:4440::/64 +2a02:26f7:eec2:4443::/64 +2a02:26f7:eec2:4446::/63 +2a02:26f7:eec2:4448::/62 +2a02:26f7:eec2:444c::/63 +2a02:26f7:eec3:4000::/64 +2a02:26f7:eec4:4000::/64 +2a02:26f7:eec4:4440::/64 +2a02:26f7:eec4:4443::/64 +2a02:26f7:eec4:4446::/63 +2a02:26f7:eec4:4448::/62 +2a02:26f7:eec4:444c::/63 +2a02:26f7:eec5:4000::/64 +2a02:26f7:eecc:4000::/64 +2a02:26f7:eecc:4440::/64 +2a02:26f7:eecc:4443::/64 +2a02:26f7:eecc:4446::/63 +2a02:26f7:eecc:4448::/62 +2a02:26f7:eecc:444c::/63 +2a02:26f7:eecd:4000::/64 +2a02:26f7:ef00::/53 +2a02:26f7:ef00:800::/56 +2a02:26f7:ef00:900::/59 +2a02:26f7:ef00:920::/60 +2a02:26f7:ef00:4000::/64 +2a02:26f7:ef00:5900::/61 +2a02:26f7:ef00:5908::/63 +2a02:26f7:ef00:590d::/64 +2a02:26f7:ef00:590e::/64 +2a02:26f7:ef00:5910::/63 +2a02:26f7:ef00:5913::/64 +2a02:26f7:ef00:5914::/62 +2a02:26f7:ef00:5918::/64 +2a02:26f7:ef00:591b::/64 +2a02:26f7:ef00:591c::/62 +2a02:26f7:ef00:5921::/64 +2a02:26f7:ef00:5922::/64 +2a02:26f7:ef00:5927::/64 +2a02:26f7:ef00:5928::/64 +2a02:26f7:ef00:592a::/63 +2a02:26f7:ef00:592e::/63 +2a02:26f7:ef00:5930::/64 +2a02:26f7:ef00:5932::/63 +2a02:26f7:ef00:5934::/64 +2a02:26f7:ef00:5936::/64 +2a02:26f7:ef00:5939::/64 +2a02:26f7:ef00:593a::/63 +2a02:26f7:ef00:593c::/63 +2a02:26f7:ef00:5940::/63 +2a02:26f7:ef00:5942::/64 +2a02:26f7:ef00:5944::/63 +2a02:26f7:ef00:5946::/64 +2a02:26f7:ef00:5948::/64 +2a02:26f7:ef00:594b::/64 +2a02:26f7:ef00:594c::/64 +2a02:26f7:ef00:594e::/64 +2a02:26f7:ef00:5951::/64 +2a02:26f7:ef00:5953::/64 +2a02:26f7:ef00:5955::/64 +2a02:26f7:ef00:5957::/64 +2a02:26f7:ef00:595c::/64 +2a02:26f7:ef00:5960::/62 +2a02:26f7:ef00:5966::/63 +2a02:26f7:ef00:596c::/64 +2a02:26f7:ef00:596f::/64 +2a02:26f7:ef00:5973::/64 +2a02:26f7:ef00:5974::/63 +2a02:26f7:ef00:5976::/64 +2a02:26f7:ef00:5978::/64 +2a02:26f7:ef00:597a::/63 +2a02:26f7:ef00:597d::/64 +2a02:26f7:ef00:597e::/64 +2a02:26f7:ef00:5980::/64 +2a02:26f7:ef00:5982::/63 +2a02:26f7:ef00:5984::/64 +2a02:26f7:ef00:5988::/64 +2a02:26f7:ef00:598a::/63 +2a02:26f7:ef00:598c::/62 +2a02:26f7:ef00:5990::/64 +2a02:26f7:ef00:5992::/63 +2a02:26f7:ef00:5994::/63 +2a02:26f7:ef00:5999::/64 +2a02:26f7:ef00:599a::/64 +2a02:26f7:ef00:599e::/64 +2a02:26f7:ef00:59a2::/64 +2a02:26f7:ef00:59aa::/63 +2a02:26f7:ef00:59ac::/62 +2a02:26f7:ef00:59b1::/64 +2a02:26f7:ef00:59b3::/64 +2a02:26f7:ef00:59b9::/64 +2a02:26f7:ef00:59ba::/63 +2a02:26f7:ef00:59bc::/63 +2a02:26f7:ef00:59be::/64 +2a02:26f7:ef00:59c2::/63 +2a02:26f7:ef00:59c5::/64 +2a02:26f7:ef00:59cb::/64 +2a02:26f7:ef00:59cc::/63 +2a02:26f7:ef00:59cf::/64 +2a02:26f7:ef00:59d9::/64 +2a02:26f7:ef00:59da::/64 +2a02:26f7:ef00:59de::/63 +2a02:26f7:ef00:59e1::/64 +2a02:26f7:ef00:59e3::/64 +2a02:26f7:ef00:59e4::/64 +2a02:26f7:ef00:59e7::/64 +2a02:26f7:ef00:59e8::/64 +2a02:26f7:ef00:59eb::/64 +2a02:26f7:ef00:59ed::/64 +2a02:26f7:ef00:59ee::/63 +2a02:26f7:ef00:59f1::/64 +2a02:26f7:ef00:59f2::/63 +2a02:26f7:ef00:59f4::/63 +2a02:26f7:ef00:59f6::/64 +2a02:26f7:ef00:59f8::/63 +2a02:26f7:ef00:59fa::/64 +2a02:26f7:ef00:59fd::/64 +2a02:26f7:ef00:59ff::/64 +2a02:26f7:ef00:5a00::/64 +2a02:26f7:ef00:5a02::/63 +2a02:26f7:ef00:5a05::/64 +2a02:26f7:ef00:5a07::/64 +2a02:26f7:ef00:5a09::/64 +2a02:26f7:ef00:5a0a::/64 +2a02:26f7:ef00:5a0e::/63 +2a02:26f7:ef00:5a10::/62 +2a02:26f7:ef00:5a14::/64 +2a02:26f7:ef01:4000::/64 +2a02:26f7:ef02::/53 +2a02:26f7:ef02:800::/56 +2a02:26f7:ef02:900::/59 +2a02:26f7:ef02:920::/60 +2a02:26f7:ef02:4000::/64 +2a02:26f7:ef02:5900::/61 +2a02:26f7:ef02:5908::/63 +2a02:26f7:ef02:590d::/64 +2a02:26f7:ef02:590e::/64 +2a02:26f7:ef02:5910::/63 +2a02:26f7:ef02:5913::/64 +2a02:26f7:ef02:5914::/62 +2a02:26f7:ef02:5918::/64 +2a02:26f7:ef02:591b::/64 +2a02:26f7:ef02:591c::/62 +2a02:26f7:ef02:5921::/64 +2a02:26f7:ef02:5922::/64 +2a02:26f7:ef02:5927::/64 +2a02:26f7:ef02:5928::/64 +2a02:26f7:ef02:592a::/63 +2a02:26f7:ef02:592e::/63 +2a02:26f7:ef02:5930::/64 +2a02:26f7:ef02:5932::/63 +2a02:26f7:ef02:5934::/64 +2a02:26f7:ef02:5936::/64 +2a02:26f7:ef02:5939::/64 +2a02:26f7:ef02:593a::/63 +2a02:26f7:ef02:593c::/63 +2a02:26f7:ef02:5940::/63 +2a02:26f7:ef02:5942::/64 +2a02:26f7:ef02:5944::/63 +2a02:26f7:ef02:5946::/64 +2a02:26f7:ef02:5948::/64 +2a02:26f7:ef02:594b::/64 +2a02:26f7:ef02:594c::/64 +2a02:26f7:ef02:594e::/64 +2a02:26f7:ef02:5951::/64 +2a02:26f7:ef02:5953::/64 +2a02:26f7:ef02:5955::/64 +2a02:26f7:ef02:5957::/64 +2a02:26f7:ef02:595c::/64 +2a02:26f7:ef02:5960::/62 +2a02:26f7:ef02:5966::/63 +2a02:26f7:ef02:596c::/64 +2a02:26f7:ef02:596f::/64 +2a02:26f7:ef02:5973::/64 +2a02:26f7:ef02:5974::/63 +2a02:26f7:ef02:5976::/64 +2a02:26f7:ef02:5978::/64 +2a02:26f7:ef02:597a::/63 +2a02:26f7:ef02:597d::/64 +2a02:26f7:ef02:597e::/64 +2a02:26f7:ef02:5980::/64 +2a02:26f7:ef02:5982::/63 +2a02:26f7:ef02:5984::/64 +2a02:26f7:ef02:5988::/64 +2a02:26f7:ef02:598a::/63 +2a02:26f7:ef02:598c::/62 +2a02:26f7:ef02:5990::/64 +2a02:26f7:ef02:5992::/63 +2a02:26f7:ef02:5994::/63 +2a02:26f7:ef02:5999::/64 +2a02:26f7:ef02:599a::/64 +2a02:26f7:ef02:599e::/64 +2a02:26f7:ef02:59a2::/64 +2a02:26f7:ef02:59aa::/63 +2a02:26f7:ef02:59ac::/62 +2a02:26f7:ef02:59b1::/64 +2a02:26f7:ef02:59b3::/64 +2a02:26f7:ef02:59b9::/64 +2a02:26f7:ef02:59ba::/63 +2a02:26f7:ef02:59bc::/63 +2a02:26f7:ef02:59be::/64 +2a02:26f7:ef02:59c2::/63 +2a02:26f7:ef02:59c5::/64 +2a02:26f7:ef02:59cb::/64 +2a02:26f7:ef02:59cc::/63 +2a02:26f7:ef02:59cf::/64 +2a02:26f7:ef02:59d9::/64 +2a02:26f7:ef02:59da::/64 +2a02:26f7:ef02:59de::/63 +2a02:26f7:ef02:59e1::/64 +2a02:26f7:ef02:59e3::/64 +2a02:26f7:ef02:59e4::/64 +2a02:26f7:ef02:59e7::/64 +2a02:26f7:ef02:59e8::/64 +2a02:26f7:ef02:59eb::/64 +2a02:26f7:ef02:59ed::/64 +2a02:26f7:ef02:59ee::/63 +2a02:26f7:ef02:59f1::/64 +2a02:26f7:ef02:59f2::/63 +2a02:26f7:ef02:59f4::/63 +2a02:26f7:ef02:59f6::/64 +2a02:26f7:ef02:59f8::/63 +2a02:26f7:ef02:59fa::/64 +2a02:26f7:ef02:59fd::/64 +2a02:26f7:ef02:59ff::/64 +2a02:26f7:ef02:5a00::/64 +2a02:26f7:ef02:5a02::/63 +2a02:26f7:ef02:5a05::/64 +2a02:26f7:ef02:5a07::/64 +2a02:26f7:ef02:5a09::/64 +2a02:26f7:ef02:5a0a::/64 +2a02:26f7:ef02:5a0e::/63 +2a02:26f7:ef02:5a10::/62 +2a02:26f7:ef02:5a14::/64 +2a02:26f7:ef03:4000::/64 +2a02:26f7:ef04::/53 +2a02:26f7:ef04:800::/56 +2a02:26f7:ef04:900::/59 +2a02:26f7:ef04:920::/60 +2a02:26f7:ef04:4000::/64 +2a02:26f7:ef04:5900::/61 +2a02:26f7:ef04:5908::/63 +2a02:26f7:ef04:590d::/64 +2a02:26f7:ef04:590e::/64 +2a02:26f7:ef04:5910::/63 +2a02:26f7:ef04:5913::/64 +2a02:26f7:ef04:5914::/62 +2a02:26f7:ef04:5918::/64 +2a02:26f7:ef04:591b::/64 +2a02:26f7:ef04:591c::/62 +2a02:26f7:ef04:5921::/64 +2a02:26f7:ef04:5922::/64 +2a02:26f7:ef04:5927::/64 +2a02:26f7:ef04:5928::/64 +2a02:26f7:ef04:592a::/63 +2a02:26f7:ef04:592e::/63 +2a02:26f7:ef04:5930::/64 +2a02:26f7:ef04:5932::/63 +2a02:26f7:ef04:5934::/64 +2a02:26f7:ef04:5936::/64 +2a02:26f7:ef04:5939::/64 +2a02:26f7:ef04:593a::/63 +2a02:26f7:ef04:593c::/63 +2a02:26f7:ef04:5940::/63 +2a02:26f7:ef04:5942::/64 +2a02:26f7:ef04:5944::/63 +2a02:26f7:ef04:5946::/64 +2a02:26f7:ef04:5948::/64 +2a02:26f7:ef04:594b::/64 +2a02:26f7:ef04:594c::/64 +2a02:26f7:ef04:594e::/64 +2a02:26f7:ef04:5951::/64 +2a02:26f7:ef04:5953::/64 +2a02:26f7:ef04:5955::/64 +2a02:26f7:ef04:5957::/64 +2a02:26f7:ef04:595c::/64 +2a02:26f7:ef04:5960::/62 +2a02:26f7:ef04:5966::/63 +2a02:26f7:ef04:596c::/64 +2a02:26f7:ef04:596f::/64 +2a02:26f7:ef04:5973::/64 +2a02:26f7:ef04:5974::/63 +2a02:26f7:ef04:5976::/64 +2a02:26f7:ef04:5978::/64 +2a02:26f7:ef04:597a::/63 +2a02:26f7:ef04:597d::/64 +2a02:26f7:ef04:597e::/64 +2a02:26f7:ef04:5980::/64 +2a02:26f7:ef04:5982::/63 +2a02:26f7:ef04:5984::/64 +2a02:26f7:ef04:5988::/64 +2a02:26f7:ef04:598a::/63 +2a02:26f7:ef04:598c::/62 +2a02:26f7:ef04:5990::/64 +2a02:26f7:ef04:5992::/63 +2a02:26f7:ef04:5994::/63 +2a02:26f7:ef04:5999::/64 +2a02:26f7:ef04:599a::/64 +2a02:26f7:ef04:599e::/64 +2a02:26f7:ef04:59a2::/64 +2a02:26f7:ef04:59aa::/63 +2a02:26f7:ef04:59ac::/62 +2a02:26f7:ef04:59b1::/64 +2a02:26f7:ef04:59b3::/64 +2a02:26f7:ef04:59b9::/64 +2a02:26f7:ef04:59ba::/63 +2a02:26f7:ef04:59bc::/63 +2a02:26f7:ef04:59be::/64 +2a02:26f7:ef04:59c2::/63 +2a02:26f7:ef04:59c5::/64 +2a02:26f7:ef04:59cb::/64 +2a02:26f7:ef04:59cc::/63 +2a02:26f7:ef04:59cf::/64 +2a02:26f7:ef04:59d9::/64 +2a02:26f7:ef04:59da::/64 +2a02:26f7:ef04:59de::/63 +2a02:26f7:ef04:59e1::/64 +2a02:26f7:ef04:59e3::/64 +2a02:26f7:ef04:59e4::/64 +2a02:26f7:ef04:59e7::/64 +2a02:26f7:ef04:59e8::/64 +2a02:26f7:ef04:59eb::/64 +2a02:26f7:ef04:59ed::/64 +2a02:26f7:ef04:59ee::/63 +2a02:26f7:ef04:59f1::/64 +2a02:26f7:ef04:59f2::/63 +2a02:26f7:ef04:59f4::/63 +2a02:26f7:ef04:59f6::/64 +2a02:26f7:ef04:59f8::/63 +2a02:26f7:ef04:59fa::/64 +2a02:26f7:ef04:59fd::/64 +2a02:26f7:ef04:59ff::/64 +2a02:26f7:ef04:5a00::/64 +2a02:26f7:ef04:5a02::/63 +2a02:26f7:ef04:5a05::/64 +2a02:26f7:ef04:5a07::/64 +2a02:26f7:ef04:5a09::/64 +2a02:26f7:ef04:5a0a::/64 +2a02:26f7:ef04:5a0e::/63 +2a02:26f7:ef04:5a10::/62 +2a02:26f7:ef04:5a14::/64 +2a02:26f7:ef05:4000::/64 +2a02:26f7:ef0c::/53 +2a02:26f7:ef0c:800::/56 +2a02:26f7:ef0c:900::/59 +2a02:26f7:ef0c:920::/60 +2a02:26f7:ef0c:4000::/64 +2a02:26f7:ef0c:5900::/61 +2a02:26f7:ef0c:5908::/63 +2a02:26f7:ef0c:590d::/64 +2a02:26f7:ef0c:590e::/64 +2a02:26f7:ef0c:5910::/63 +2a02:26f7:ef0c:5913::/64 +2a02:26f7:ef0c:5914::/62 +2a02:26f7:ef0c:5918::/64 +2a02:26f7:ef0c:591b::/64 +2a02:26f7:ef0c:591c::/62 +2a02:26f7:ef0c:5921::/64 +2a02:26f7:ef0c:5922::/64 +2a02:26f7:ef0c:5927::/64 +2a02:26f7:ef0c:5928::/64 +2a02:26f7:ef0c:592a::/63 +2a02:26f7:ef0c:592e::/63 +2a02:26f7:ef0c:5930::/64 +2a02:26f7:ef0c:5932::/63 +2a02:26f7:ef0c:5934::/64 +2a02:26f7:ef0c:5936::/64 +2a02:26f7:ef0c:5939::/64 +2a02:26f7:ef0c:593a::/63 +2a02:26f7:ef0c:593c::/63 +2a02:26f7:ef0c:5940::/63 +2a02:26f7:ef0c:5942::/64 +2a02:26f7:ef0c:5944::/63 +2a02:26f7:ef0c:5946::/64 +2a02:26f7:ef0c:5948::/64 +2a02:26f7:ef0c:594b::/64 +2a02:26f7:ef0c:594c::/64 +2a02:26f7:ef0c:594e::/64 +2a02:26f7:ef0c:5951::/64 +2a02:26f7:ef0c:5953::/64 +2a02:26f7:ef0c:5955::/64 +2a02:26f7:ef0c:5957::/64 +2a02:26f7:ef0c:595c::/64 +2a02:26f7:ef0c:5960::/62 +2a02:26f7:ef0c:5966::/63 +2a02:26f7:ef0c:596c::/64 +2a02:26f7:ef0c:596f::/64 +2a02:26f7:ef0c:5973::/64 +2a02:26f7:ef0c:5974::/63 +2a02:26f7:ef0c:5976::/64 +2a02:26f7:ef0c:5978::/64 +2a02:26f7:ef0c:597a::/63 +2a02:26f7:ef0c:597d::/64 +2a02:26f7:ef0c:597e::/64 +2a02:26f7:ef0c:5980::/64 +2a02:26f7:ef0c:5982::/63 +2a02:26f7:ef0c:5984::/64 +2a02:26f7:ef0c:5988::/64 +2a02:26f7:ef0c:598a::/63 +2a02:26f7:ef0c:598c::/62 +2a02:26f7:ef0c:5990::/64 +2a02:26f7:ef0c:5992::/63 +2a02:26f7:ef0c:5994::/63 +2a02:26f7:ef0c:5999::/64 +2a02:26f7:ef0c:599a::/64 +2a02:26f7:ef0c:599e::/64 +2a02:26f7:ef0c:59a2::/64 +2a02:26f7:ef0c:59aa::/63 +2a02:26f7:ef0c:59ac::/62 +2a02:26f7:ef0c:59b1::/64 +2a02:26f7:ef0c:59b3::/64 +2a02:26f7:ef0c:59b9::/64 +2a02:26f7:ef0c:59ba::/63 +2a02:26f7:ef0c:59bc::/63 +2a02:26f7:ef0c:59be::/64 +2a02:26f7:ef0c:59c2::/63 +2a02:26f7:ef0c:59c5::/64 +2a02:26f7:ef0c:59cb::/64 +2a02:26f7:ef0c:59cc::/63 +2a02:26f7:ef0c:59cf::/64 +2a02:26f7:ef0c:59d9::/64 +2a02:26f7:ef0c:59da::/64 +2a02:26f7:ef0c:59de::/63 +2a02:26f7:ef0c:59e1::/64 +2a02:26f7:ef0c:59e3::/64 +2a02:26f7:ef0c:59e4::/64 +2a02:26f7:ef0c:59e7::/64 +2a02:26f7:ef0c:59e8::/64 +2a02:26f7:ef0c:59eb::/64 +2a02:26f7:ef0c:59ed::/64 +2a02:26f7:ef0c:59ee::/63 +2a02:26f7:ef0c:59f1::/64 +2a02:26f7:ef0c:59f2::/63 +2a02:26f7:ef0c:59f4::/63 +2a02:26f7:ef0c:59f6::/64 +2a02:26f7:ef0c:59f8::/63 +2a02:26f7:ef0c:59fa::/64 +2a02:26f7:ef0c:59fd::/64 +2a02:26f7:ef0c:59ff::/64 +2a02:26f7:ef0c:5a00::/64 +2a02:26f7:ef0c:5a02::/63 +2a02:26f7:ef0c:5a05::/64 +2a02:26f7:ef0c:5a07::/64 +2a02:26f7:ef0c:5a09::/64 +2a02:26f7:ef0c:5a0a::/64 +2a02:26f7:ef0c:5a0e::/63 +2a02:26f7:ef0c:5a10::/62 +2a02:26f7:ef0c:5a14::/64 +2a02:26f7:ef0d:4000::/64 +2a02:26f7:ef10::/53 +2a02:26f7:ef10:800::/56 +2a02:26f7:ef10:900::/59 +2a02:26f7:ef10:920::/60 +2a02:26f7:ef10:4000::/64 +2a02:26f7:ef10:5900::/61 +2a02:26f7:ef10:5908::/63 +2a02:26f7:ef10:590d::/64 +2a02:26f7:ef10:590e::/64 +2a02:26f7:ef10:5910::/63 +2a02:26f7:ef10:5913::/64 +2a02:26f7:ef10:5914::/62 +2a02:26f7:ef10:5918::/64 +2a02:26f7:ef10:591b::/64 +2a02:26f7:ef10:591c::/62 +2a02:26f7:ef10:5921::/64 +2a02:26f7:ef10:5922::/64 +2a02:26f7:ef10:5927::/64 +2a02:26f7:ef10:5928::/64 +2a02:26f7:ef10:592a::/63 +2a02:26f7:ef10:592e::/63 +2a02:26f7:ef10:5930::/64 +2a02:26f7:ef10:5932::/63 +2a02:26f7:ef10:5934::/64 +2a02:26f7:ef10:5936::/64 +2a02:26f7:ef10:5939::/64 +2a02:26f7:ef10:593a::/63 +2a02:26f7:ef10:593c::/63 +2a02:26f7:ef10:5940::/63 +2a02:26f7:ef10:5942::/64 +2a02:26f7:ef10:5944::/63 +2a02:26f7:ef10:5946::/64 +2a02:26f7:ef10:5948::/64 +2a02:26f7:ef10:594b::/64 +2a02:26f7:ef10:594c::/64 +2a02:26f7:ef10:594e::/64 +2a02:26f7:ef10:5951::/64 +2a02:26f7:ef10:5953::/64 +2a02:26f7:ef10:5955::/64 +2a02:26f7:ef10:5957::/64 +2a02:26f7:ef10:595c::/64 +2a02:26f7:ef10:5960::/62 +2a02:26f7:ef10:5966::/63 +2a02:26f7:ef10:596c::/64 +2a02:26f7:ef10:596f::/64 +2a02:26f7:ef10:5973::/64 +2a02:26f7:ef10:5974::/63 +2a02:26f7:ef10:5976::/64 +2a02:26f7:ef10:5978::/64 +2a02:26f7:ef10:597a::/63 +2a02:26f7:ef10:597d::/64 +2a02:26f7:ef10:597e::/64 +2a02:26f7:ef10:5980::/64 +2a02:26f7:ef10:5982::/63 +2a02:26f7:ef10:5984::/64 +2a02:26f7:ef10:5988::/64 +2a02:26f7:ef10:598a::/63 +2a02:26f7:ef10:598c::/62 +2a02:26f7:ef10:5990::/64 +2a02:26f7:ef10:5992::/63 +2a02:26f7:ef10:5994::/63 +2a02:26f7:ef10:5999::/64 +2a02:26f7:ef10:599a::/64 +2a02:26f7:ef10:599e::/64 +2a02:26f7:ef10:59a2::/64 +2a02:26f7:ef10:59aa::/63 +2a02:26f7:ef10:59ac::/62 +2a02:26f7:ef10:59b1::/64 +2a02:26f7:ef10:59b3::/64 +2a02:26f7:ef10:59b9::/64 +2a02:26f7:ef10:59ba::/63 +2a02:26f7:ef10:59bc::/63 +2a02:26f7:ef10:59be::/64 +2a02:26f7:ef10:59c2::/63 +2a02:26f7:ef10:59c5::/64 +2a02:26f7:ef10:59cb::/64 +2a02:26f7:ef10:59cc::/63 +2a02:26f7:ef10:59cf::/64 +2a02:26f7:ef10:59d9::/64 +2a02:26f7:ef10:59da::/64 +2a02:26f7:ef10:59de::/63 +2a02:26f7:ef10:59e1::/64 +2a02:26f7:ef10:59e3::/64 +2a02:26f7:ef10:59e4::/64 +2a02:26f7:ef10:59e7::/64 +2a02:26f7:ef10:59e8::/64 +2a02:26f7:ef10:59eb::/64 +2a02:26f7:ef10:59ed::/64 +2a02:26f7:ef10:59ee::/63 +2a02:26f7:ef10:59f1::/64 +2a02:26f7:ef10:59f2::/63 +2a02:26f7:ef10:59f4::/63 +2a02:26f7:ef10:59f6::/64 +2a02:26f7:ef10:59f8::/63 +2a02:26f7:ef10:59fa::/64 +2a02:26f7:ef10:59fd::/64 +2a02:26f7:ef10:59ff::/64 +2a02:26f7:ef10:5a00::/64 +2a02:26f7:ef10:5a02::/63 +2a02:26f7:ef10:5a05::/64 +2a02:26f7:ef10:5a07::/64 +2a02:26f7:ef10:5a09::/64 +2a02:26f7:ef10:5a0a::/64 +2a02:26f7:ef10:5a0e::/63 +2a02:26f7:ef10:5a10::/62 +2a02:26f7:ef10:5a14::/64 +2a02:26f7:ef11:4000::/64 +2a02:26f7:ef14::/53 +2a02:26f7:ef14:800::/56 +2a02:26f7:ef14:900::/59 +2a02:26f7:ef14:920::/60 +2a02:26f7:ef14:4000::/64 +2a02:26f7:ef14:5900::/61 +2a02:26f7:ef14:5908::/63 +2a02:26f7:ef14:590d::/64 +2a02:26f7:ef14:590e::/64 +2a02:26f7:ef14:5910::/63 +2a02:26f7:ef14:5913::/64 +2a02:26f7:ef14:5914::/62 +2a02:26f7:ef14:5918::/64 +2a02:26f7:ef14:591b::/64 +2a02:26f7:ef14:591c::/62 +2a02:26f7:ef14:5921::/64 +2a02:26f7:ef14:5922::/64 +2a02:26f7:ef14:5927::/64 +2a02:26f7:ef14:5928::/64 +2a02:26f7:ef14:592a::/63 +2a02:26f7:ef14:592e::/63 +2a02:26f7:ef14:5930::/64 +2a02:26f7:ef14:5932::/63 +2a02:26f7:ef14:5934::/64 +2a02:26f7:ef14:5936::/64 +2a02:26f7:ef14:5939::/64 +2a02:26f7:ef14:593a::/63 +2a02:26f7:ef14:593c::/63 +2a02:26f7:ef14:5940::/63 +2a02:26f7:ef14:5942::/64 +2a02:26f7:ef14:5944::/63 +2a02:26f7:ef14:5946::/64 +2a02:26f7:ef14:5948::/64 +2a02:26f7:ef14:594b::/64 +2a02:26f7:ef14:594c::/64 +2a02:26f7:ef14:594e::/64 +2a02:26f7:ef14:5951::/64 +2a02:26f7:ef14:5953::/64 +2a02:26f7:ef14:5955::/64 +2a02:26f7:ef14:5957::/64 +2a02:26f7:ef14:595c::/64 +2a02:26f7:ef14:5960::/62 +2a02:26f7:ef14:5966::/63 +2a02:26f7:ef14:596c::/64 +2a02:26f7:ef14:596f::/64 +2a02:26f7:ef14:5973::/64 +2a02:26f7:ef14:5974::/63 +2a02:26f7:ef14:5976::/64 +2a02:26f7:ef14:5978::/64 +2a02:26f7:ef14:597a::/63 +2a02:26f7:ef14:597d::/64 +2a02:26f7:ef14:597e::/64 +2a02:26f7:ef14:5980::/64 +2a02:26f7:ef14:5982::/63 +2a02:26f7:ef14:5984::/64 +2a02:26f7:ef14:5988::/64 +2a02:26f7:ef14:598a::/63 +2a02:26f7:ef14:598c::/62 +2a02:26f7:ef14:5990::/64 +2a02:26f7:ef14:5992::/63 +2a02:26f7:ef14:5994::/63 +2a02:26f7:ef14:5999::/64 +2a02:26f7:ef14:599a::/64 +2a02:26f7:ef14:599e::/64 +2a02:26f7:ef14:59a2::/64 +2a02:26f7:ef14:59aa::/63 +2a02:26f7:ef14:59ac::/62 +2a02:26f7:ef14:59b1::/64 +2a02:26f7:ef14:59b3::/64 +2a02:26f7:ef14:59b9::/64 +2a02:26f7:ef14:59ba::/63 +2a02:26f7:ef14:59bc::/63 +2a02:26f7:ef14:59be::/64 +2a02:26f7:ef14:59c2::/63 +2a02:26f7:ef14:59c5::/64 +2a02:26f7:ef14:59cb::/64 +2a02:26f7:ef14:59cc::/63 +2a02:26f7:ef14:59cf::/64 +2a02:26f7:ef14:59d9::/64 +2a02:26f7:ef14:59da::/64 +2a02:26f7:ef14:59de::/63 +2a02:26f7:ef14:59e1::/64 +2a02:26f7:ef14:59e3::/64 +2a02:26f7:ef14:59e4::/64 +2a02:26f7:ef14:59e7::/64 +2a02:26f7:ef14:59e8::/64 +2a02:26f7:ef14:59eb::/64 +2a02:26f7:ef14:59ed::/64 +2a02:26f7:ef14:59ee::/63 +2a02:26f7:ef14:59f1::/64 +2a02:26f7:ef14:59f2::/63 +2a02:26f7:ef14:59f4::/63 +2a02:26f7:ef14:59f6::/64 +2a02:26f7:ef14:59f8::/63 +2a02:26f7:ef14:59fa::/64 +2a02:26f7:ef14:59fd::/64 +2a02:26f7:ef14:59ff::/64 +2a02:26f7:ef14:5a00::/64 +2a02:26f7:ef14:5a02::/63 +2a02:26f7:ef14:5a05::/64 +2a02:26f7:ef14:5a07::/64 +2a02:26f7:ef14:5a09::/64 +2a02:26f7:ef14:5a0a::/64 +2a02:26f7:ef14:5a0e::/63 +2a02:26f7:ef14:5a10::/62 +2a02:26f7:ef14:5a14::/64 +2a02:26f7:ef15:4000::/64 +2a02:26f7:ef40:4000::/64 +2a02:26f7:ef40:d100::/61 +2a02:26f7:ef40:d108::/64 +2a02:26f7:ef41:4000::/64 +2a02:26f7:ef44:4000::/64 +2a02:26f7:ef44:d100::/61 +2a02:26f7:ef44:d108::/64 +2a02:26f7:ef45:4000::/64 +2a02:26f7:ef48:4000::/64 +2a02:26f7:ef48:d100::/61 +2a02:26f7:ef48:d108::/64 +2a02:26f7:ef49:4000::/64 +2a02:26f7:ef4c:4000::/64 +2a02:26f7:ef4c:d100::/61 +2a02:26f7:ef4c:d108::/64 +2a02:26f7:ef4d:4000::/64 +2a02:26f7:ef50:4000::/64 +2a02:26f7:ef50:d100::/61 +2a02:26f7:ef50:d108::/64 +2a02:26f7:ef51:4000::/64 +2a02:26f7:ef80:4000::/64 +2a02:26f7:ef80:d360::/60 +2a02:26f7:ef80:d370::/62 +2a02:26f7:ef80:d374::/64 +2a02:26f7:ef81:4000::/64 +2a02:26f7:ef82:4000::/64 +2a02:26f7:ef82:d360::/60 +2a02:26f7:ef82:d370::/62 +2a02:26f7:ef82:d374::/64 +2a02:26f7:ef83:4000::/64 +2a02:26f7:ef84:4000::/64 +2a02:26f7:ef84:d360::/60 +2a02:26f7:ef84:d370::/62 +2a02:26f7:ef84:d374::/64 +2a02:26f7:ef85:4000::/64 +2a02:26f7:ef8c:4000::/64 +2a02:26f7:ef8c:d360::/60 +2a02:26f7:ef8c:d370::/62 +2a02:26f7:ef8c:d374::/64 +2a02:26f7:ef8d:4000::/64 +2a02:26f7:efc0:4000::/64 +2a02:26f7:efc0:d1c0::/61 +2a02:26f7:efc0:d1c8::/63 +2a02:26f7:efc1:4000::/64 +2a02:26f7:efc8:4000::/64 +2a02:26f7:efc8:d1c0::/61 +2a02:26f7:efc8:d1c8::/63 +2a02:26f7:efc9:4000::/64 +2a02:26f7:efcc:4000::/64 +2a02:26f7:efcc:d1c0::/61 +2a02:26f7:efcc:d1c8::/63 +2a02:26f7:efcd:4000::/64 +2a02:26f7:f000:4000::/64 +2a02:26f7:f000:caa0::/63 +2a02:26f7:f001:4000::/64 +2a02:26f7:f008:4000::/64 +2a02:26f7:f008:caa0::/63 +2a02:26f7:f009:4000::/64 +2a02:26f7:f00c:4000::/64 +2a02:26f7:f00c:caa0::/63 +2a02:26f7:f00d:4000::/64 +2a02:26f7:f040:4000::/64 +2a02:26f7:f040:c140::/64 +2a02:26f7:f041:4000::/64 +2a02:26f7:f044:4000::/64 +2a02:26f7:f044:c140::/64 +2a02:26f7:f045:4000::/64 +2a02:26f7:f048:4000::/64 +2a02:26f7:f048:c140::/64 +2a02:26f7:f049:4000::/64 +2a02:26f7:f080:4000::/64 +2a02:26f7:f080:cd40::/64 +2a02:26f7:f080:cd42::/64 +2a02:26f7:f081:4000::/64 +2a02:26f7:f082:4000::/64 +2a02:26f7:f082:cd40::/64 +2a02:26f7:f082:cd42::/64 +2a02:26f7:f083:4000::/64 +2a02:26f7:f084:4000::/64 +2a02:26f7:f084:cd40::/64 +2a02:26f7:f084:cd42::/64 +2a02:26f7:f085:4000::/64 +2a02:26f7:f088:4000::/64 +2a02:26f7:f088:cd40::/64 +2a02:26f7:f088:cd42::/64 +2a02:26f7:f089:4000::/64 +2a02:26f7:f08c:4000::/64 +2a02:26f7:f08c:cd40::/64 +2a02:26f7:f08c:cd42::/64 +2a02:26f7:f08d:4000::/64 +2a02:26f7:f0c0:4000::/64 +2a02:26f7:f0c0:cd20::/63 +2a02:26f7:f0c0:cd22::/64 +2a02:26f7:f0c1:4000::/64 +2a02:26f7:f0c2:4000::/64 +2a02:26f7:f0c2:cd20::/63 +2a02:26f7:f0c2:cd22::/64 +2a02:26f7:f0c3:4000::/64 +2a02:26f7:f0c4:4000::/64 +2a02:26f7:f0c4:cd20::/63 +2a02:26f7:f0c4:cd22::/64 +2a02:26f7:f0c5:4000::/64 +2a02:26f7:f0cc:4000::/64 +2a02:26f7:f0cc:cd20::/63 +2a02:26f7:f0cc:cd22::/64 +2a02:26f7:f0cd:4000::/64 +2a02:26f7:f100:4000::/64 +2a02:26f7:f100:d220::/61 +2a02:26f7:f100:d228::/63 +2a02:26f7:f100:d22a::/64 +2a02:26f7:f101:4000::/64 +2a02:26f7:f108:4000::/64 +2a02:26f7:f108:d220::/61 +2a02:26f7:f108:d228::/63 +2a02:26f7:f108:d22a::/64 +2a02:26f7:f109:4000::/64 +2a02:26f7:f10c:4000::/64 +2a02:26f7:f10c:d220::/61 +2a02:26f7:f10c:d228::/63 +2a02:26f7:f10c:d22a::/64 +2a02:26f7:f10d:4000::/64 +2a02:26f7:f140:4000::/64 +2a02:26f7:f140:c000::/64 +2a02:26f7:f141:4000::/64 +2a02:26f7:f144:4000::/64 +2a02:26f7:f144:c000::/64 +2a02:26f7:f145:4000::/64 +2a02:26f7:f148:4000::/64 +2a02:26f7:f148:c000::/64 +2a02:26f7:f149:4000::/64 +2a02:26f7:f180:4000::/64 +2a02:26f7:f180:c980::/64 +2a02:26f7:f181:4000::/64 +2a02:26f7:f182:4000::/64 +2a02:26f7:f182:c980::/64 +2a02:26f7:f183:4000::/64 +2a02:26f7:f184:4000::/64 +2a02:26f7:f184:c980::/64 +2a02:26f7:f185:4000::/64 +2a02:26f7:f188:4000::/64 +2a02:26f7:f188:c980::/64 +2a02:26f7:f189:4000::/64 +2a02:26f7:f1c0:4000::/64 +2a02:26f7:f1c0:c960::/64 +2a02:26f7:f1c1:4000::/64 +2a02:26f7:f1c4:4000::/64 +2a02:26f7:f1c4:c960::/64 +2a02:26f7:f1c5:4000::/64 +2a02:26f7:f1c8:4000::/64 +2a02:26f7:f1c8:c960::/64 +2a02:26f7:f1c9:4000::/64 +2a02:26f7:f200:4000::/64 +2a02:26f7:f200:c940::/64 +2a02:26f7:f201:4000::/64 +2a02:26f7:f204:4000::/64 +2a02:26f7:f204:c940::/64 +2a02:26f7:f205:4000::/64 +2a02:26f7:f208:4000::/64 +2a02:26f7:f208:c940::/64 +2a02:26f7:f209:4000::/64 +2a02:26f7:f240:4000::/64 +2a02:26f7:f240:c8e0::/64 +2a02:26f7:f241:4000::/64 +2a02:26f7:f244:4000::/64 +2a02:26f7:f244:c8e0::/64 +2a02:26f7:f245:4000::/64 +2a02:26f7:f248:4000::/64 +2a02:26f7:f248:c8e0::/64 +2a02:26f7:f249:4000::/64 +2a02:26f7:f280:4000::/64 +2a02:26f7:f280:c8c0::/64 +2a02:26f7:f281:4000::/64 +2a02:26f7:f284:4000::/64 +2a02:26f7:f284:c8c0::/64 +2a02:26f7:f285:4000::/64 +2a02:26f7:f288:4000::/64 +2a02:26f7:f288:c8c0::/64 +2a02:26f7:f289:4000::/64 +2a02:26f7:f2c0:4000::/64 +2a02:26f7:f2c0:c880::/64 +2a02:26f7:f2c1:4000::/64 +2a02:26f7:f2c2:4000::/64 +2a02:26f7:f2c2:c880::/64 +2a02:26f7:f2c3:4000::/64 +2a02:26f7:f2c4:4000::/64 +2a02:26f7:f2c4:c880::/64 +2a02:26f7:f2c5:4000::/64 +2a02:26f7:f2c8:4000::/64 +2a02:26f7:f2c8:c880::/64 +2a02:26f7:f2c9:4000::/64 +2a02:26f7:f300:4000::/64 +2a02:26f7:f300:c720::/64 +2a02:26f7:f301:4000::/64 +2a02:26f7:f304:4000::/64 +2a02:26f7:f304:c720::/64 +2a02:26f7:f305:4000::/64 +2a02:26f7:f308:4000::/64 +2a02:26f7:f308:c720::/64 +2a02:26f7:f309:4000::/64 +2a02:26f7:f340:4000::/64 +2a02:26f7:f340:c6a0::/64 +2a02:26f7:f341:4000::/64 +2a02:26f7:f342:4000::/64 +2a02:26f7:f342:c6a0::/64 +2a02:26f7:f343:4000::/64 +2a02:26f7:f344:4000::/64 +2a02:26f7:f344:c6a0::/64 +2a02:26f7:f345:4000::/64 +2a02:26f7:f348:4000::/64 +2a02:26f7:f348:c6a0::/64 +2a02:26f7:f349:4000::/64 +2a02:26f7:f349:c6a0::/64 +2a02:26f7:f34a:4000::/64 +2a02:26f7:f34a:c6a0::/64 +2a02:26f7:f34b:4000::/64 +2a02:26f7:f34c:4000::/64 +2a02:26f7:f34c:c6a0::/64 +2a02:26f7:f34d:4000::/64 +2a02:26f7:f350:4000::/64 +2a02:26f7:f351:4000::/64 +2a02:26f7:f380:4000::/64 +2a02:26f7:f381:4000::/64 +2a02:26f7:f382:4000::/64 +2a02:26f7:f383:4000::/64 +2a02:26f7:f384:4000::/64 +2a02:26f7:f385:4000::/64 +2a02:26f7:f388:4000::/64 +2a02:26f7:f389:4000::/64 +2a02:26f7:f3c0:4000::/64 +2a02:26f7:f3c1:4000::/64 +2a02:26f7:f3c2:4000::/64 +2a02:26f7:f3c3:4000::/64 +2a02:26f7:f3c4:4000::/64 +2a02:26f7:f3c5:4000::/64 +2a02:26f7:f3c8:4000::/64 +2a02:26f7:f3c9:4000::/64 +2a02:26f7:f400::/54 +2a02:26f7:f400:400::/56 +2a02:26f7:f400:500::/57 +2a02:26f7:f400:580::/59 +2a02:26f7:f400:4000::/64 +2a02:26f7:f400:5300::/62 +2a02:26f7:f400:5304::/64 +2a02:26f7:f400:5307::/64 +2a02:26f7:f400:5308::/63 +2a02:26f7:f400:530a::/64 +2a02:26f7:f400:530c::/62 +2a02:26f7:f400:5310::/62 +2a02:26f7:f400:5314::/63 +2a02:26f7:f400:5317::/64 +2a02:26f7:f400:5318::/61 +2a02:26f7:f400:5320::/63 +2a02:26f7:f401:4000::/64 +2a02:26f7:f404::/54 +2a02:26f7:f404:400::/56 +2a02:26f7:f404:500::/57 +2a02:26f7:f404:580::/59 +2a02:26f7:f404:4000::/64 +2a02:26f7:f404:5300::/62 +2a02:26f7:f404:5304::/64 +2a02:26f7:f404:5307::/64 +2a02:26f7:f404:5308::/63 +2a02:26f7:f404:530a::/64 +2a02:26f7:f404:530c::/62 +2a02:26f7:f404:5310::/62 +2a02:26f7:f404:5314::/63 +2a02:26f7:f404:5317::/64 +2a02:26f7:f404:5318::/61 +2a02:26f7:f404:5320::/63 +2a02:26f7:f405:4000::/64 +2a02:26f7:f408::/54 +2a02:26f7:f408:400::/56 +2a02:26f7:f408:500::/57 +2a02:26f7:f408:580::/59 +2a02:26f7:f408:4000::/64 +2a02:26f7:f408:5300::/62 +2a02:26f7:f408:5304::/64 +2a02:26f7:f408:5307::/64 +2a02:26f7:f408:5308::/63 +2a02:26f7:f408:530a::/64 +2a02:26f7:f408:530c::/62 +2a02:26f7:f408:5310::/62 +2a02:26f7:f408:5314::/63 +2a02:26f7:f408:5317::/64 +2a02:26f7:f408:5318::/61 +2a02:26f7:f408:5320::/63 +2a02:26f7:f409:4000::/64 +2a02:26f7:f40c::/54 +2a02:26f7:f40c:400::/56 +2a02:26f7:f40c:500::/57 +2a02:26f7:f40c:580::/59 +2a02:26f7:f40c:4000::/64 +2a02:26f7:f40c:5300::/62 +2a02:26f7:f40c:5304::/64 +2a02:26f7:f40c:5307::/64 +2a02:26f7:f40c:5308::/63 +2a02:26f7:f40c:530a::/64 +2a02:26f7:f40c:530c::/62 +2a02:26f7:f40c:5310::/62 +2a02:26f7:f40c:5314::/63 +2a02:26f7:f40c:5317::/64 +2a02:26f7:f40c:5318::/61 +2a02:26f7:f40c:5320::/63 +2a02:26f7:f40d:4000::/64 +2a02:26f7:f440:4000::/64 +2a02:26f7:f441:4000::/64 +2a02:26f7:f444:4000::/64 +2a02:26f7:f445:4000::/64 +2a02:26f7:f448:4000::/64 +2a02:26f7:f449:4000::/64 +2a02:26f7:f480:4000::/64 +2a02:26f7:f480:c660::/64 +2a02:26f7:f481:4000::/64 +2a02:26f7:f484:4000::/64 +2a02:26f7:f484:c660::/64 +2a02:26f7:f485:4000::/64 +2a02:26f7:f488:4000::/64 +2a02:26f7:f488:c660::/64 +2a02:26f7:f489:4000::/64 +2a02:26f7:f4c0:4000::/64 +2a02:26f7:f4c0:c640::/64 +2a02:26f7:f4c1:4000::/64 +2a02:26f7:f4c4:4000::/64 +2a02:26f7:f4c4:c640::/64 +2a02:26f7:f4c5:4000::/64 +2a02:26f7:f4c8:4000::/64 +2a02:26f7:f4c8:c640::/64 +2a02:26f7:f4c9:4000::/64 +2a02:26f7:f500:4000::/64 +2a02:26f7:f500:c620::/64 +2a02:26f7:f501:4000::/64 +2a02:26f7:f504:4000::/64 +2a02:26f7:f504:c620::/64 +2a02:26f7:f505:4000::/64 +2a02:26f7:f508:4000::/64 +2a02:26f7:f508:c620::/64 +2a02:26f7:f509:4000::/64 +2a02:26f7:f540:4000::/64 +2a02:26f7:f541:4000::/64 +2a02:26f7:f542:4000::/64 +2a02:26f7:f543:4000::/64 +2a02:26f7:f544:4000::/64 +2a02:26f7:f545:4000::/64 +2a02:26f7:f548:4000::/64 +2a02:26f7:f549:4000::/64 +2a02:26f7:f580:4000::/64 +2a02:26f7:f581:4000::/64 +2a02:26f7:f582:4000::/64 +2a02:26f7:f583:4000::/64 +2a02:26f7:f584:4000::/64 +2a02:26f7:f585:4000::/64 +2a02:26f7:f588:4000::/64 +2a02:26f7:f589:4000::/64 +2a02:26f7:f5c0:4000::/64 +2a02:26f7:f5c1:4000::/64 +2a02:26f7:f5c2:4000::/64 +2a02:26f7:f5c3:4000::/64 +2a02:26f7:f5c4:4000::/64 +2a02:26f7:f5c5:4000::/64 +2a02:26f7:f5c8:4000::/64 +2a02:26f7:f5c9:4000::/64 +2a02:26f7:f600:4000::/64 +2a02:26f7:f600:c220::/64 +2a02:26f7:f601:4000::/64 +2a02:26f7:f604:4000::/64 +2a02:26f7:f604:c220::/64 +2a02:26f7:f605:4000::/64 +2a02:26f7:f608:4000::/64 +2a02:26f7:f608:c220::/64 +2a02:26f7:f609:4000::/64 +2a02:26f7:f60c:4000::/64 +2a02:26f7:f60c:c220::/64 +2a02:26f7:f60d:4000::/64 +2a02:26f7:f640:4000::/64 +2a02:26f7:f640:c160::/64 +2a02:26f7:f641:4000::/64 +2a02:26f7:f642:4000::/64 +2a02:26f7:f642:c160::/64 +2a02:26f7:f643:4000::/64 +2a02:26f7:f644:4000::/64 +2a02:26f7:f644:c160::/64 +2a02:26f7:f645:4000::/64 +2a02:26f7:f648:4000::/64 +2a02:26f7:f648:c160::/64 +2a02:26f7:f649:4000::/64 +2a02:26f7:f680:4000::/64 +2a02:26f7:f680:c060::/64 +2a02:26f7:f681:4000::/64 +2a02:26f7:f682:4000::/64 +2a02:26f7:f682:c060::/64 +2a02:26f7:f683:4000::/64 +2a02:26f7:f684:4000::/64 +2a02:26f7:f684:c060::/64 +2a02:26f7:f685:4000::/64 +2a02:26f7:f688:4000::/64 +2a02:26f7:f688:c060::/64 +2a02:26f7:f689:4000::/64 +2a02:26f7:f6c0::/51 +2a02:26f7:f6c0:2000::/55 +2a02:26f7:f6c0:2200::/57 +2a02:26f7:f6c0:2280::/59 +2a02:26f7:f6c0:22a0::/60 +2a02:26f7:f6c0:4000::/64 +2a02:26f7:f6c0:a000::/54 +2a02:26f7:f6c0:a400::/57 +2a02:26f7:f6c0:a480::/58 +2a02:26f7:f6c0:a4c0::/59 +2a02:26f7:f6c0:a4e0::/62 +2a02:26f7:f6c0:a4e4::/63 +2a02:26f7:f6c0:a4e7::/64 +2a02:26f7:f6c0:a4e8::/61 +2a02:26f7:f6c0:a4f0::/60 +2a02:26f7:f6c0:a500::/56 +2a02:26f7:f6c0:a600::/56 +2a02:26f7:f6c0:a700::/58 +2a02:26f7:f6c0:a740::/59 +2a02:26f7:f6c0:a760::/60 +2a02:26f7:f6c0:a770::/61 +2a02:26f7:f6c0:a778::/63 +2a02:26f7:f6c0:fff0::/64 +2a02:26f7:f6c1::/51 +2a02:26f7:f6c1:2000::/55 +2a02:26f7:f6c1:2200::/57 +2a02:26f7:f6c1:2280::/59 +2a02:26f7:f6c1:22a0::/60 +2a02:26f7:f6c1:4000::/64 +2a02:26f7:f6c1:a000::/54 +2a02:26f7:f6c1:a400::/57 +2a02:26f7:f6c1:a480::/58 +2a02:26f7:f6c1:a4c0::/59 +2a02:26f7:f6c1:a4e0::/62 +2a02:26f7:f6c1:a4e4::/63 +2a02:26f7:f6c1:a4e7::/64 +2a02:26f7:f6c1:a4e8::/61 +2a02:26f7:f6c1:a4f0::/60 +2a02:26f7:f6c1:a500::/56 +2a02:26f7:f6c1:a600::/56 +2a02:26f7:f6c1:a700::/58 +2a02:26f7:f6c1:a740::/59 +2a02:26f7:f6c1:a760::/60 +2a02:26f7:f6c1:a770::/61 +2a02:26f7:f6c1:a778::/63 +2a02:26f7:f6c1:fff0::/64 +2a02:26f7:f6c2:4000::/64 +2a02:26f7:f6c3:4000::/64 +2a02:26f7:f6c4::/51 +2a02:26f7:f6c4:2000::/55 +2a02:26f7:f6c4:2200::/57 +2a02:26f7:f6c4:2280::/59 +2a02:26f7:f6c4:22a0::/60 +2a02:26f7:f6c4:4000::/64 +2a02:26f7:f6c4:a000::/54 +2a02:26f7:f6c4:a400::/57 +2a02:26f7:f6c4:a480::/58 +2a02:26f7:f6c4:a4c0::/59 +2a02:26f7:f6c4:a4e0::/62 +2a02:26f7:f6c4:a4e4::/63 +2a02:26f7:f6c4:a4e7::/64 +2a02:26f7:f6c4:a4e8::/61 +2a02:26f7:f6c4:a4f0::/60 +2a02:26f7:f6c4:a500::/56 +2a02:26f7:f6c4:a600::/56 +2a02:26f7:f6c4:a700::/58 +2a02:26f7:f6c4:a740::/59 +2a02:26f7:f6c4:a760::/60 +2a02:26f7:f6c4:a770::/61 +2a02:26f7:f6c4:a778::/63 +2a02:26f7:f6c4:fff0::/64 +2a02:26f7:f6c5:4000::/64 +2a02:26f7:f6cc::/51 +2a02:26f7:f6cc:2000::/55 +2a02:26f7:f6cc:2200::/57 +2a02:26f7:f6cc:2280::/59 +2a02:26f7:f6cc:22a0::/60 +2a02:26f7:f6cc:4000::/64 +2a02:26f7:f6cc:a000::/54 +2a02:26f7:f6cc:a400::/57 +2a02:26f7:f6cc:a480::/58 +2a02:26f7:f6cc:a4c0::/59 +2a02:26f7:f6cc:a4e0::/62 +2a02:26f7:f6cc:a4e4::/63 +2a02:26f7:f6cc:a4e7::/64 +2a02:26f7:f6cc:a4e8::/61 +2a02:26f7:f6cc:a4f0::/60 +2a02:26f7:f6cc:a500::/56 +2a02:26f7:f6cc:a600::/56 +2a02:26f7:f6cc:a700::/58 +2a02:26f7:f6cc:a740::/59 +2a02:26f7:f6cc:a760::/60 +2a02:26f7:f6cc:a770::/61 +2a02:26f7:f6cc:a778::/63 +2a02:26f7:f6cc:fff0::/64 +2a02:26f7:f6cd::/51 +2a02:26f7:f6cd:2000::/55 +2a02:26f7:f6cd:2200::/57 +2a02:26f7:f6cd:2280::/59 +2a02:26f7:f6cd:22a0::/60 +2a02:26f7:f6cd:4000::/64 +2a02:26f7:f6cd:a000::/54 +2a02:26f7:f6cd:a400::/57 +2a02:26f7:f6cd:a480::/58 +2a02:26f7:f6cd:a4c0::/59 +2a02:26f7:f6cd:a4e0::/62 +2a02:26f7:f6cd:a4e4::/63 +2a02:26f7:f6cd:a4e7::/64 +2a02:26f7:f6cd:a4e8::/61 +2a02:26f7:f6cd:a4f0::/60 +2a02:26f7:f6cd:a500::/56 +2a02:26f7:f6cd:a600::/56 +2a02:26f7:f6cd:a700::/58 +2a02:26f7:f6cd:a740::/59 +2a02:26f7:f6cd:a760::/60 +2a02:26f7:f6cd:a770::/61 +2a02:26f7:f6cd:a778::/63 +2a02:26f7:f6cd:fff0::/64 +2a02:26f7:f6ce:4000::/64 +2a02:26f7:f6cf:4000::/64 +2a02:26f7:f6d0::/51 +2a02:26f7:f6d0:2000::/55 +2a02:26f7:f6d0:2200::/57 +2a02:26f7:f6d0:2280::/59 +2a02:26f7:f6d0:22a0::/60 +2a02:26f7:f6d0:4000::/64 +2a02:26f7:f6d0:a000::/54 +2a02:26f7:f6d0:a400::/57 +2a02:26f7:f6d0:a480::/58 +2a02:26f7:f6d0:a4c0::/59 +2a02:26f7:f6d0:a4e0::/62 +2a02:26f7:f6d0:a4e4::/63 +2a02:26f7:f6d0:a4e7::/64 +2a02:26f7:f6d0:a4e8::/61 +2a02:26f7:f6d0:a4f0::/60 +2a02:26f7:f6d0:a500::/56 +2a02:26f7:f6d0:a600::/56 +2a02:26f7:f6d0:a700::/58 +2a02:26f7:f6d0:a740::/59 +2a02:26f7:f6d0:a760::/60 +2a02:26f7:f6d0:a770::/61 +2a02:26f7:f6d0:a778::/63 +2a02:26f7:f6d0:fff0::/64 +2a02:26f7:f6d1:4000::/64 +2a02:26f7:f6d4::/51 +2a02:26f7:f6d4:2000::/55 +2a02:26f7:f6d4:2200::/57 +2a02:26f7:f6d4:2280::/59 +2a02:26f7:f6d4:22a0::/60 +2a02:26f7:f6d4:4000::/64 +2a02:26f7:f6d4:a000::/54 +2a02:26f7:f6d4:a400::/57 +2a02:26f7:f6d4:a480::/58 +2a02:26f7:f6d4:a4c0::/59 +2a02:26f7:f6d4:a4e0::/62 +2a02:26f7:f6d4:a4e4::/63 +2a02:26f7:f6d4:a4e7::/64 +2a02:26f7:f6d4:a4e8::/61 +2a02:26f7:f6d4:a4f0::/60 +2a02:26f7:f6d4:a500::/56 +2a02:26f7:f6d4:a600::/56 +2a02:26f7:f6d4:a700::/58 +2a02:26f7:f6d4:a740::/59 +2a02:26f7:f6d4:a760::/60 +2a02:26f7:f6d4:a770::/61 +2a02:26f7:f6d4:a778::/63 +2a02:26f7:f6d4:fff0::/64 +2a02:26f7:f6d5::/51 +2a02:26f7:f6d5:2000::/55 +2a02:26f7:f6d5:2200::/57 +2a02:26f7:f6d5:2280::/59 +2a02:26f7:f6d5:22a0::/60 +2a02:26f7:f6d5:4000::/64 +2a02:26f7:f6d5:a000::/54 +2a02:26f7:f6d5:a400::/57 +2a02:26f7:f6d5:a480::/58 +2a02:26f7:f6d5:a4c0::/59 +2a02:26f7:f6d5:a4e0::/62 +2a02:26f7:f6d5:a4e4::/63 +2a02:26f7:f6d5:a4e7::/64 +2a02:26f7:f6d5:a4e8::/61 +2a02:26f7:f6d5:a4f0::/60 +2a02:26f7:f6d5:a500::/56 +2a02:26f7:f6d5:a600::/56 +2a02:26f7:f6d5:a700::/58 +2a02:26f7:f6d5:a740::/59 +2a02:26f7:f6d5:a760::/60 +2a02:26f7:f6d5:a770::/61 +2a02:26f7:f6d5:a778::/63 +2a02:26f7:f6d5:fff0::/64 +2a02:26f7:f6d6:4000::/64 +2a02:26f7:f6d7:4000::/64 +2a02:26f7:f6d8::/51 +2a02:26f7:f6d8:2000::/55 +2a02:26f7:f6d8:2200::/57 +2a02:26f7:f6d8:2280::/59 +2a02:26f7:f6d8:22a0::/60 +2a02:26f7:f6d8:4000::/64 +2a02:26f7:f6d8:a000::/54 +2a02:26f7:f6d8:a400::/57 +2a02:26f7:f6d8:a480::/58 +2a02:26f7:f6d8:a4c0::/59 +2a02:26f7:f6d8:a4e0::/62 +2a02:26f7:f6d8:a4e4::/63 +2a02:26f7:f6d8:a4e7::/64 +2a02:26f7:f6d8:a4e8::/61 +2a02:26f7:f6d8:a4f0::/60 +2a02:26f7:f6d8:a500::/56 +2a02:26f7:f6d8:a600::/56 +2a02:26f7:f6d8:a700::/58 +2a02:26f7:f6d8:a740::/59 +2a02:26f7:f6d8:a760::/60 +2a02:26f7:f6d8:a770::/61 +2a02:26f7:f6d8:a778::/63 +2a02:26f7:f6d8:fff0::/64 +2a02:26f7:f6d9::/51 +2a02:26f7:f6d9:2000::/55 +2a02:26f7:f6d9:2200::/57 +2a02:26f7:f6d9:2280::/59 +2a02:26f7:f6d9:22a0::/60 +2a02:26f7:f6d9:4000::/64 +2a02:26f7:f6d9:a000::/54 +2a02:26f7:f6d9:a400::/57 +2a02:26f7:f6d9:a480::/58 +2a02:26f7:f6d9:a4c0::/59 +2a02:26f7:f6d9:a4e0::/62 +2a02:26f7:f6d9:a4e4::/63 +2a02:26f7:f6d9:a4e7::/64 +2a02:26f7:f6d9:a4e8::/61 +2a02:26f7:f6d9:a4f0::/60 +2a02:26f7:f6d9:a500::/56 +2a02:26f7:f6d9:a600::/56 +2a02:26f7:f6d9:a700::/58 +2a02:26f7:f6d9:a740::/59 +2a02:26f7:f6d9:a760::/60 +2a02:26f7:f6d9:a770::/61 +2a02:26f7:f6d9:a778::/63 +2a02:26f7:f6d9:fff0::/64 +2a02:26f7:f6da::/51 +2a02:26f7:f6da:2000::/55 +2a02:26f7:f6da:2200::/57 +2a02:26f7:f6da:2280::/59 +2a02:26f7:f6da:22a0::/60 +2a02:26f7:f6da:4000::/64 +2a02:26f7:f6da:a000::/54 +2a02:26f7:f6da:a400::/57 +2a02:26f7:f6da:a480::/58 +2a02:26f7:f6da:a4c0::/59 +2a02:26f7:f6da:a4e0::/62 +2a02:26f7:f6da:a4e4::/63 +2a02:26f7:f6da:a4e7::/64 +2a02:26f7:f6da:a4e8::/61 +2a02:26f7:f6da:a4f0::/60 +2a02:26f7:f6da:a500::/56 +2a02:26f7:f6da:a600::/56 +2a02:26f7:f6da:a700::/58 +2a02:26f7:f6da:a740::/59 +2a02:26f7:f6da:a760::/60 +2a02:26f7:f6da:a770::/61 +2a02:26f7:f6da:a778::/63 +2a02:26f7:f6da:fff0::/64 +2a02:26f7:f6db:4000::/64 +2a02:26f7:f6dc::/51 +2a02:26f7:f6dc:2000::/55 +2a02:26f7:f6dc:2200::/57 +2a02:26f7:f6dc:2280::/59 +2a02:26f7:f6dc:22a0::/60 +2a02:26f7:f6dc:4000::/64 +2a02:26f7:f6dc:a000::/54 +2a02:26f7:f6dc:a400::/57 +2a02:26f7:f6dc:a480::/58 +2a02:26f7:f6dc:a4c0::/59 +2a02:26f7:f6dc:a4e0::/62 +2a02:26f7:f6dc:a4e4::/63 +2a02:26f7:f6dc:a4e7::/64 +2a02:26f7:f6dc:a4e8::/61 +2a02:26f7:f6dc:a4f0::/60 +2a02:26f7:f6dc:a500::/56 +2a02:26f7:f6dc:a600::/56 +2a02:26f7:f6dc:a700::/58 +2a02:26f7:f6dc:a740::/59 +2a02:26f7:f6dc:a760::/60 +2a02:26f7:f6dc:a770::/61 +2a02:26f7:f6dc:a778::/63 +2a02:26f7:f6dc:fff0::/64 +2a02:26f7:f6dd:4000::/64 +2a02:26f7:f6e0::/51 +2a02:26f7:f6e0:2000::/55 +2a02:26f7:f6e0:2200::/57 +2a02:26f7:f6e0:2280::/59 +2a02:26f7:f6e0:22a0::/60 +2a02:26f7:f6e0:4000::/64 +2a02:26f7:f6e0:a000::/54 +2a02:26f7:f6e0:a400::/57 +2a02:26f7:f6e0:a480::/58 +2a02:26f7:f6e0:a4c0::/59 +2a02:26f7:f6e0:a4e0::/62 +2a02:26f7:f6e0:a4e4::/63 +2a02:26f7:f6e0:a4e7::/64 +2a02:26f7:f6e0:a4e8::/61 +2a02:26f7:f6e0:a4f0::/60 +2a02:26f7:f6e0:a500::/56 +2a02:26f7:f6e0:a600::/56 +2a02:26f7:f6e0:a700::/58 +2a02:26f7:f6e0:a740::/59 +2a02:26f7:f6e0:a760::/60 +2a02:26f7:f6e0:a770::/61 +2a02:26f7:f6e0:a778::/63 +2a02:26f7:f6e0:fff0::/64 +2a02:26f7:f6e1::/51 +2a02:26f7:f6e1:2000::/55 +2a02:26f7:f6e1:2200::/57 +2a02:26f7:f6e1:2280::/59 +2a02:26f7:f6e1:22a0::/60 +2a02:26f7:f6e1:4000::/64 +2a02:26f7:f6e1:a000::/54 +2a02:26f7:f6e1:a400::/57 +2a02:26f7:f6e1:a480::/58 +2a02:26f7:f6e1:a4c0::/59 +2a02:26f7:f6e1:a4e0::/62 +2a02:26f7:f6e1:a4e4::/63 +2a02:26f7:f6e1:a4e7::/64 +2a02:26f7:f6e1:a4e8::/61 +2a02:26f7:f6e1:a4f0::/60 +2a02:26f7:f6e1:a500::/56 +2a02:26f7:f6e1:a600::/56 +2a02:26f7:f6e1:a700::/58 +2a02:26f7:f6e1:a740::/59 +2a02:26f7:f6e1:a760::/60 +2a02:26f7:f6e1:a770::/61 +2a02:26f7:f6e1:a778::/63 +2a02:26f7:f6e1:fff0::/64 +2a02:26f7:f6e2:4000::/64 +2a02:26f7:f6e3:4000::/64 +2a02:26f7:f6e8::/51 +2a02:26f7:f6e8:2000::/55 +2a02:26f7:f6e8:2200::/57 +2a02:26f7:f6e8:2280::/59 +2a02:26f7:f6e8:22a0::/60 +2a02:26f7:f6e8:4000::/64 +2a02:26f7:f6e8:a000::/54 +2a02:26f7:f6e8:a400::/57 +2a02:26f7:f6e8:a480::/58 +2a02:26f7:f6e8:a4c0::/59 +2a02:26f7:f6e8:a4e0::/62 +2a02:26f7:f6e8:a4e4::/63 +2a02:26f7:f6e8:a4e7::/64 +2a02:26f7:f6e8:a4e8::/61 +2a02:26f7:f6e8:a4f0::/60 +2a02:26f7:f6e8:a500::/56 +2a02:26f7:f6e8:a600::/56 +2a02:26f7:f6e8:a700::/58 +2a02:26f7:f6e8:a740::/59 +2a02:26f7:f6e8:a760::/60 +2a02:26f7:f6e8:a770::/61 +2a02:26f7:f6e8:a778::/63 +2a02:26f7:f6e8:fff0::/64 +2a02:26f7:f6e9::/51 +2a02:26f7:f6e9:2000::/55 +2a02:26f7:f6e9:2200::/57 +2a02:26f7:f6e9:2280::/59 +2a02:26f7:f6e9:22a0::/60 +2a02:26f7:f6e9:4000::/64 +2a02:26f7:f6e9:a000::/54 +2a02:26f7:f6e9:a400::/57 +2a02:26f7:f6e9:a480::/58 +2a02:26f7:f6e9:a4c0::/59 +2a02:26f7:f6e9:a4e0::/62 +2a02:26f7:f6e9:a4e4::/63 +2a02:26f7:f6e9:a4e7::/64 +2a02:26f7:f6e9:a4e8::/61 +2a02:26f7:f6e9:a4f0::/60 +2a02:26f7:f6e9:a500::/56 +2a02:26f7:f6e9:a600::/56 +2a02:26f7:f6e9:a700::/58 +2a02:26f7:f6e9:a740::/59 +2a02:26f7:f6e9:a760::/60 +2a02:26f7:f6e9:a770::/61 +2a02:26f7:f6e9:a778::/63 +2a02:26f7:f6e9:fff0::/64 +2a02:26f7:f6ea:4000::/64 +2a02:26f7:f6eb:4000::/64 +2a02:26f7:f6ec::/51 +2a02:26f7:f6ec:2000::/55 +2a02:26f7:f6ec:2200::/57 +2a02:26f7:f6ec:2280::/59 +2a02:26f7:f6ec:22a0::/60 +2a02:26f7:f6ec:4000::/64 +2a02:26f7:f6ec:a000::/54 +2a02:26f7:f6ec:a400::/57 +2a02:26f7:f6ec:a480::/58 +2a02:26f7:f6ec:a4c0::/59 +2a02:26f7:f6ec:a4e0::/62 +2a02:26f7:f6ec:a4e4::/63 +2a02:26f7:f6ec:a4e7::/64 +2a02:26f7:f6ec:a4e8::/61 +2a02:26f7:f6ec:a4f0::/60 +2a02:26f7:f6ec:a500::/56 +2a02:26f7:f6ec:a600::/56 +2a02:26f7:f6ec:a700::/58 +2a02:26f7:f6ec:a740::/59 +2a02:26f7:f6ec:a760::/60 +2a02:26f7:f6ec:a770::/61 +2a02:26f7:f6ec:a778::/63 +2a02:26f7:f6ec:fff0::/64 +2a02:26f7:f6ed::/51 +2a02:26f7:f6ed:2000::/55 +2a02:26f7:f6ed:2200::/57 +2a02:26f7:f6ed:2280::/59 +2a02:26f7:f6ed:22a0::/60 +2a02:26f7:f6ed:4000::/64 +2a02:26f7:f6ed:a000::/54 +2a02:26f7:f6ed:a400::/57 +2a02:26f7:f6ed:a480::/58 +2a02:26f7:f6ed:a4c0::/59 +2a02:26f7:f6ed:a4e0::/62 +2a02:26f7:f6ed:a4e4::/63 +2a02:26f7:f6ed:a4e7::/64 +2a02:26f7:f6ed:a4e8::/61 +2a02:26f7:f6ed:a4f0::/60 +2a02:26f7:f6ed:a500::/56 +2a02:26f7:f6ed:a600::/56 +2a02:26f7:f6ed:a700::/58 +2a02:26f7:f6ed:a740::/59 +2a02:26f7:f6ed:a760::/60 +2a02:26f7:f6ed:a770::/61 +2a02:26f7:f6ed:a778::/63 +2a02:26f7:f6ed:fff0::/64 +2a02:26f7:f6ee::/51 +2a02:26f7:f6ee:2000::/55 +2a02:26f7:f6ee:2200::/57 +2a02:26f7:f6ee:2280::/59 +2a02:26f7:f6ee:22a0::/60 +2a02:26f7:f6ee:4000::/64 +2a02:26f7:f6ee:a000::/54 +2a02:26f7:f6ee:a400::/57 +2a02:26f7:f6ee:a480::/58 +2a02:26f7:f6ee:a4c0::/59 +2a02:26f7:f6ee:a4e0::/62 +2a02:26f7:f6ee:a4e4::/63 +2a02:26f7:f6ee:a4e7::/64 +2a02:26f7:f6ee:a4e8::/61 +2a02:26f7:f6ee:a4f0::/60 +2a02:26f7:f6ee:a500::/56 +2a02:26f7:f6ee:a600::/56 +2a02:26f7:f6ee:a700::/58 +2a02:26f7:f6ee:a740::/59 +2a02:26f7:f6ee:a760::/60 +2a02:26f7:f6ee:a770::/61 +2a02:26f7:f6ee:a778::/63 +2a02:26f7:f6ee:fff0::/64 +2a02:26f7:f6ef::/51 +2a02:26f7:f6ef:2000::/55 +2a02:26f7:f6ef:2200::/57 +2a02:26f7:f6ef:2280::/59 +2a02:26f7:f6ef:22a0::/60 +2a02:26f7:f6ef:4000::/64 +2a02:26f7:f6ef:a000::/54 +2a02:26f7:f6ef:a400::/57 +2a02:26f7:f6ef:a480::/58 +2a02:26f7:f6ef:a4c0::/59 +2a02:26f7:f6ef:a4e0::/62 +2a02:26f7:f6ef:a4e4::/63 +2a02:26f7:f6ef:a4e7::/64 +2a02:26f7:f6ef:a4e8::/61 +2a02:26f7:f6ef:a4f0::/60 +2a02:26f7:f6ef:a500::/56 +2a02:26f7:f6ef:a600::/56 +2a02:26f7:f6ef:a700::/58 +2a02:26f7:f6ef:a740::/59 +2a02:26f7:f6ef:a760::/60 +2a02:26f7:f6ef:a770::/61 +2a02:26f7:f6ef:a778::/63 +2a02:26f7:f6ef:fff0::/64 +2a02:26f7:f6f0::/51 +2a02:26f7:f6f0:2000::/55 +2a02:26f7:f6f0:2200::/57 +2a02:26f7:f6f0:2280::/59 +2a02:26f7:f6f0:22a0::/60 +2a02:26f7:f6f0:4000::/64 +2a02:26f7:f6f0:a000::/54 +2a02:26f7:f6f0:a400::/57 +2a02:26f7:f6f0:a480::/58 +2a02:26f7:f6f0:a4c0::/59 +2a02:26f7:f6f0:a4e0::/62 +2a02:26f7:f6f0:a4e4::/63 +2a02:26f7:f6f0:a4e7::/64 +2a02:26f7:f6f0:a4e8::/61 +2a02:26f7:f6f0:a4f0::/60 +2a02:26f7:f6f0:a500::/56 +2a02:26f7:f6f0:a600::/56 +2a02:26f7:f6f0:a700::/58 +2a02:26f7:f6f0:a740::/59 +2a02:26f7:f6f0:a760::/60 +2a02:26f7:f6f0:a770::/61 +2a02:26f7:f6f0:a778::/63 +2a02:26f7:f6f0:fff0::/64 +2a02:26f7:f6f1::/51 +2a02:26f7:f6f1:2000::/55 +2a02:26f7:f6f1:2200::/57 +2a02:26f7:f6f1:2280::/59 +2a02:26f7:f6f1:22a0::/60 +2a02:26f7:f6f1:4000::/64 +2a02:26f7:f6f1:a000::/54 +2a02:26f7:f6f1:a400::/57 +2a02:26f7:f6f1:a480::/58 +2a02:26f7:f6f1:a4c0::/59 +2a02:26f7:f6f1:a4e0::/62 +2a02:26f7:f6f1:a4e4::/63 +2a02:26f7:f6f1:a4e7::/64 +2a02:26f7:f6f1:a4e8::/61 +2a02:26f7:f6f1:a4f0::/60 +2a02:26f7:f6f1:a500::/56 +2a02:26f7:f6f1:a600::/56 +2a02:26f7:f6f1:a700::/58 +2a02:26f7:f6f1:a740::/59 +2a02:26f7:f6f1:a760::/60 +2a02:26f7:f6f1:a770::/61 +2a02:26f7:f6f1:a778::/63 +2a02:26f7:f6f1:fff0::/64 +2a02:26f7:f6f2::/51 +2a02:26f7:f6f2:2000::/55 +2a02:26f7:f6f2:2200::/57 +2a02:26f7:f6f2:2280::/59 +2a02:26f7:f6f2:22a0::/60 +2a02:26f7:f6f2:4000::/64 +2a02:26f7:f6f2:a000::/54 +2a02:26f7:f6f2:a400::/57 +2a02:26f7:f6f2:a480::/58 +2a02:26f7:f6f2:a4c0::/59 +2a02:26f7:f6f2:a4e0::/62 +2a02:26f7:f6f2:a4e4::/63 +2a02:26f7:f6f2:a4e7::/64 +2a02:26f7:f6f2:a4e8::/61 +2a02:26f7:f6f2:a4f0::/60 +2a02:26f7:f6f2:a500::/56 +2a02:26f7:f6f2:a600::/56 +2a02:26f7:f6f2:a700::/58 +2a02:26f7:f6f2:a740::/59 +2a02:26f7:f6f2:a760::/60 +2a02:26f7:f6f2:a770::/61 +2a02:26f7:f6f2:a778::/63 +2a02:26f7:f6f2:fff0::/64 +2a02:26f7:f6f3::/51 +2a02:26f7:f6f3:2000::/55 +2a02:26f7:f6f3:2200::/57 +2a02:26f7:f6f3:2280::/59 +2a02:26f7:f6f3:22a0::/60 +2a02:26f7:f6f3:4000::/64 +2a02:26f7:f6f3:a000::/54 +2a02:26f7:f6f3:a400::/57 +2a02:26f7:f6f3:a480::/58 +2a02:26f7:f6f3:a4c0::/59 +2a02:26f7:f6f3:a4e0::/62 +2a02:26f7:f6f3:a4e4::/63 +2a02:26f7:f6f3:a4e7::/64 +2a02:26f7:f6f3:a4e8::/61 +2a02:26f7:f6f3:a4f0::/60 +2a02:26f7:f6f3:a500::/56 +2a02:26f7:f6f3:a600::/56 +2a02:26f7:f6f3:a700::/58 +2a02:26f7:f6f3:a740::/59 +2a02:26f7:f6f3:a760::/60 +2a02:26f7:f6f3:a770::/61 +2a02:26f7:f6f3:a778::/63 +2a02:26f7:f6f3:fff0::/64 +2a02:26f7:f6f4::/51 +2a02:26f7:f6f4:2000::/55 +2a02:26f7:f6f4:2200::/57 +2a02:26f7:f6f4:2280::/59 +2a02:26f7:f6f4:22a0::/60 +2a02:26f7:f6f4:4000::/64 +2a02:26f7:f6f4:a000::/54 +2a02:26f7:f6f4:a400::/57 +2a02:26f7:f6f4:a480::/58 +2a02:26f7:f6f4:a4c0::/59 +2a02:26f7:f6f4:a4e0::/62 +2a02:26f7:f6f4:a4e4::/63 +2a02:26f7:f6f4:a4e7::/64 +2a02:26f7:f6f4:a4e8::/61 +2a02:26f7:f6f4:a4f0::/60 +2a02:26f7:f6f4:a500::/56 +2a02:26f7:f6f4:a600::/56 +2a02:26f7:f6f4:a700::/58 +2a02:26f7:f6f4:a740::/59 +2a02:26f7:f6f4:a760::/60 +2a02:26f7:f6f4:a770::/61 +2a02:26f7:f6f4:a778::/63 +2a02:26f7:f6f4:fff0::/64 +2a02:26f7:f6f5:4000::/64 +2a02:26f7:f6f8::/51 +2a02:26f7:f6f8:2000::/55 +2a02:26f7:f6f8:2200::/57 +2a02:26f7:f6f8:2280::/59 +2a02:26f7:f6f8:22a0::/60 +2a02:26f7:f6f8:4000::/64 +2a02:26f7:f6f8:a000::/54 +2a02:26f7:f6f8:a400::/57 +2a02:26f7:f6f8:a480::/58 +2a02:26f7:f6f8:a4c0::/59 +2a02:26f7:f6f8:a4e0::/62 +2a02:26f7:f6f8:a4e4::/63 +2a02:26f7:f6f8:a4e7::/64 +2a02:26f7:f6f8:a4e8::/61 +2a02:26f7:f6f8:a4f0::/60 +2a02:26f7:f6f8:a500::/56 +2a02:26f7:f6f8:a600::/56 +2a02:26f7:f6f8:a700::/58 +2a02:26f7:f6f8:a740::/59 +2a02:26f7:f6f8:a760::/60 +2a02:26f7:f6f8:a770::/61 +2a02:26f7:f6f8:a778::/63 +2a02:26f7:f6f8:fff0::/64 +2a02:26f7:f6f9::/51 +2a02:26f7:f6f9:2000::/55 +2a02:26f7:f6f9:2200::/57 +2a02:26f7:f6f9:2280::/59 +2a02:26f7:f6f9:22a0::/60 +2a02:26f7:f6f9:4000::/64 +2a02:26f7:f6f9:a000::/54 +2a02:26f7:f6f9:a400::/57 +2a02:26f7:f6f9:a480::/58 +2a02:26f7:f6f9:a4c0::/59 +2a02:26f7:f6f9:a4e0::/62 +2a02:26f7:f6f9:a4e4::/63 +2a02:26f7:f6f9:a4e7::/64 +2a02:26f7:f6f9:a4e8::/61 +2a02:26f7:f6f9:a4f0::/60 +2a02:26f7:f6f9:a500::/56 +2a02:26f7:f6f9:a600::/56 +2a02:26f7:f6f9:a700::/58 +2a02:26f7:f6f9:a740::/59 +2a02:26f7:f6f9:a760::/60 +2a02:26f7:f6f9:a770::/61 +2a02:26f7:f6f9:a778::/63 +2a02:26f7:f6f9:fff0::/64 +2a02:26f7:f6fa:4000::/64 +2a02:26f7:f6fb:4000::/64 +2a02:26f7:f6fc::/51 +2a02:26f7:f6fc:2000::/55 +2a02:26f7:f6fc:2200::/57 +2a02:26f7:f6fc:2280::/59 +2a02:26f7:f6fc:22a0::/60 +2a02:26f7:f6fc:4000::/64 +2a02:26f7:f6fc:a000::/54 +2a02:26f7:f6fc:a400::/57 +2a02:26f7:f6fc:a480::/58 +2a02:26f7:f6fc:a4c0::/59 +2a02:26f7:f6fc:a4e0::/62 +2a02:26f7:f6fc:a4e4::/63 +2a02:26f7:f6fc:a4e7::/64 +2a02:26f7:f6fc:a4e8::/61 +2a02:26f7:f6fc:a4f0::/60 +2a02:26f7:f6fc:a500::/56 +2a02:26f7:f6fc:a600::/56 +2a02:26f7:f6fc:a700::/58 +2a02:26f7:f6fc:a740::/59 +2a02:26f7:f6fc:a760::/60 +2a02:26f7:f6fc:a770::/61 +2a02:26f7:f6fc:a778::/63 +2a02:26f7:f6fc:fff0::/64 +2a02:26f7:f6fd:4000::/64 +2a02:26f7:f6fe:4000::/64 +2a02:26f7:f6ff:4000::/64 +2a02:26f7:f700:4000::/64 +2a02:26f7:f700:4d80::/62 +2a02:26f7:f700:4d84::/63 +2a02:26f7:f701:4000::/64 +2a02:26f7:f702:4000::/64 +2a02:26f7:f702:4d80::/62 +2a02:26f7:f702:4d84::/63 +2a02:26f7:f703:4000::/64 +2a02:26f7:f704:4000::/64 +2a02:26f7:f704:4d80::/62 +2a02:26f7:f704:4d84::/63 +2a02:26f7:f705:4000::/64 +2a02:26f7:f70c:4000::/64 +2a02:26f7:f70c:4d80::/62 +2a02:26f7:f70c:4d84::/63 +2a02:26f7:f70d:4000::/64 +2a02:26f7:f710:4000::/64 +2a02:26f7:f710:4d80::/62 +2a02:26f7:f710:4d84::/63 +2a02:26f7:f711:4000::/64 +2a02:26f7:f740:4000::/64 +2a02:26f7:f740:c820::/64 +2a02:26f7:f741:4000::/64 +2a02:26f7:f742:4000::/64 +2a02:26f7:f743:4000::/64 +2a02:26f7:f743:c820::/64 +2a02:26f7:f744:4000::/64 +2a02:26f7:f744:c820::/64 +2a02:26f7:f745:4000::/64 +2a02:26f7:f746:4000::/64 +2a02:26f7:f74c:4000::/64 +2a02:26f7:f74c:c820::/64 +2a02:26f7:f750:4000::/64 +2a02:26f7:f750:c820::/64 +2a02:26f7:f751:4000::/64 +2a02:26f7:f780:4000::/64 +2a02:26f7:f780:4640::/64 +2a02:26f7:f781:4000::/64 +2a02:26f7:f782:4000::/64 +2a02:26f7:f783:4000::/64 +2a02:26f7:f783:4640::/64 +2a02:26f7:f784:4000::/64 +2a02:26f7:f788:4000::/64 +2a02:26f7:f788:4640::/64 +2a02:26f7:f789:4000::/64 +2a02:26f7:f78c:4000::/64 +2a02:26f7:f78c:4640::/64 +2a02:26f7:f78d:4000::/64 +2a02:26f7:f790:4000::/64 +2a02:26f7:f790:4640::/64 +2a02:26f7:f794:4000::/64 +2a02:26f7:f794:4640::/64 +2a02:26f7:f795:4000::/64 +2a02:26f7:f798:4000::/64 +2a02:26f7:f798:4640::/64 +2a02:26f7:f799:4000::/64 +2a02:26f7:f7c0::/54 +2a02:26f7:f7c0:400::/56 +2a02:26f7:f7c0:500::/58 +2a02:26f7:f7c0:4000::/64 +2a02:26f7:f7c0:e100::/57 +2a02:26f7:f7c0:e180::/61 +2a02:26f7:f7c0:e188::/63 +2a02:26f7:f7c1:4000::/64 +2a02:26f7:f7c2::/54 +2a02:26f7:f7c2:400::/56 +2a02:26f7:f7c2:500::/58 +2a02:26f7:f7c2:4000::/64 +2a02:26f7:f7c2:e100::/57 +2a02:26f7:f7c2:e180::/61 +2a02:26f7:f7c2:e188::/63 +2a02:26f7:f7c3:4000::/64 +2a02:26f7:f7c4::/54 +2a02:26f7:f7c4:400::/56 +2a02:26f7:f7c4:500::/58 +2a02:26f7:f7c4:4000::/64 +2a02:26f7:f7c4:e100::/57 +2a02:26f7:f7c4:e180::/61 +2a02:26f7:f7c4:e188::/63 +2a02:26f7:f7c5:4000::/64 +2a02:26f7:f7cc::/54 +2a02:26f7:f7cc:400::/56 +2a02:26f7:f7cc:500::/58 +2a02:26f7:f7cc:4000::/64 +2a02:26f7:f7cc:e100::/57 +2a02:26f7:f7cc:e180::/61 +2a02:26f7:f7cc:e188::/63 +2a02:26f7:f7cd:4000::/64 +2a02:26f7:f7d0::/54 +2a02:26f7:f7d0:400::/56 +2a02:26f7:f7d0:500::/58 +2a02:26f7:f7d0:4000::/64 +2a02:26f7:f7d0:e100::/57 +2a02:26f7:f7d0:e180::/61 +2a02:26f7:f7d0:e188::/63 +2a02:26f7:f7d1:4000::/64 +2a02:26f7:f7d4::/54 +2a02:26f7:f7d4:400::/56 +2a02:26f7:f7d4:500::/58 +2a02:26f7:f7d4:4000::/64 +2a02:26f7:f7d4:e100::/57 +2a02:26f7:f7d4:e180::/61 +2a02:26f7:f7d4:e188::/63 +2a02:26f7:f7d5:4000::/64 +2a02:26f7:f7d8::/54 +2a02:26f7:f7d8:400::/56 +2a02:26f7:f7d8:500::/58 +2a02:26f7:f7d8:4000::/64 +2a02:26f7:f7d8:e100::/57 +2a02:26f7:f7d8:e180::/61 +2a02:26f7:f7d8:e188::/63 +2a02:26f7:f7d9:4000::/64 +2a02:26f7:f800:4000::/64 +2a02:26f7:f800:41c0::/63 +2a02:26f7:f800:41c2::/64 +2a02:26f7:f801:4000::/64 +2a02:26f7:f802:4000::/64 +2a02:26f7:f803:4000::/64 +2a02:26f7:f803:41c0::/63 +2a02:26f7:f803:41c2::/64 +2a02:26f7:f804:4000::/64 +2a02:26f7:f808:4000::/64 +2a02:26f7:f808:41c0::/63 +2a02:26f7:f808:41c2::/64 +2a02:26f7:f809:4000::/64 +2a02:26f7:f80c:4000::/64 +2a02:26f7:f80c:41c0::/63 +2a02:26f7:f80c:41c2::/64 +2a02:26f7:f80d:4000::/64 +2a02:26f7:f810:4000::/64 +2a02:26f7:f810:41c0::/63 +2a02:26f7:f810:41c2::/64 +2a02:26f7:f814:4000::/64 +2a02:26f7:f814:41c0::/63 +2a02:26f7:f814:41c2::/64 +2a02:26f7:f815:4000::/64 +2a02:26f7:f818:4000::/64 +2a02:26f7:f818:41c0::/63 +2a02:26f7:f818:41c2::/64 +2a02:26f7:f819:4000::/64 +2a02:26f7:f840:4000::/64 +2a02:26f7:f840:ca60::/63 +2a02:26f7:f841:4000::/64 +2a02:26f7:f842:4000::/64 +2a02:26f7:f842:ca60::/63 +2a02:26f7:f843:4000::/64 +2a02:26f7:f844:4000::/64 +2a02:26f7:f844:ca60::/63 +2a02:26f7:f845:4000::/64 +2a02:26f7:f84c:4000::/64 +2a02:26f7:f84c:ca60::/63 +2a02:26f7:f84d:4000::/64 +2a02:26f7:f850:4000::/64 +2a02:26f7:f850:ca60::/63 +2a02:26f7:f851:4000::/64 +2a02:26f7:f880:4000::/64 +2a02:26f7:f880:c080::/64 +2a02:26f7:f881:4000::/64 +2a02:26f7:f882:4000::/64 +2a02:26f7:f882:c080::/64 +2a02:26f7:f883:4000::/64 +2a02:26f7:f884:4000::/64 +2a02:26f7:f884:c080::/64 +2a02:26f7:f885:4000::/64 +2a02:26f7:f88c:4000::/64 +2a02:26f7:f88c:c080::/64 +2a02:26f7:f88d:4000::/64 +2a02:26f7:f890:4000::/64 +2a02:26f7:f890:c080::/64 +2a02:26f7:f891:4000::/64 +2a02:26f7:f8c0::/53 +2a02:26f7:f8c0:800::/58 +2a02:26f7:f8c0:840::/59 +2a02:26f7:f8c0:4000::/64 +2a02:26f7:f8c0:4c00::/58 +2a02:26f7:f8c0:e600::/57 +2a02:26f7:f8c0:e680::/59 +2a02:26f7:f8c0:e6a0::/60 +2a02:26f7:f8c0:e6b0::/61 +2a02:26f7:f8c0:e6b8::/62 +2a02:26f7:f8c1:4000::/64 +2a02:26f7:f8c4::/53 +2a02:26f7:f8c4:800::/58 +2a02:26f7:f8c4:840::/59 +2a02:26f7:f8c4:4000::/64 +2a02:26f7:f8c4:4c00::/58 +2a02:26f7:f8c4:e600::/57 +2a02:26f7:f8c4:e680::/59 +2a02:26f7:f8c4:e6a0::/60 +2a02:26f7:f8c4:e6b0::/61 +2a02:26f7:f8c4:e6b8::/62 +2a02:26f7:f8c5:4000::/64 +2a02:26f7:f8c8::/53 +2a02:26f7:f8c8:800::/58 +2a02:26f7:f8c8:840::/59 +2a02:26f7:f8c8:4000::/64 +2a02:26f7:f8c8:4c00::/58 +2a02:26f7:f8c8:e600::/57 +2a02:26f7:f8c8:e680::/59 +2a02:26f7:f8c8:e6a0::/60 +2a02:26f7:f8c8:e6b0::/61 +2a02:26f7:f8c8:e6b8::/62 +2a02:26f7:f8c9:4000::/64 +2a02:26f7:f8cc::/53 +2a02:26f7:f8cc:800::/58 +2a02:26f7:f8cc:840::/59 +2a02:26f7:f8cc:4000::/64 +2a02:26f7:f8cc:4c00::/58 +2a02:26f7:f8cc:e600::/57 +2a02:26f7:f8cc:e680::/59 +2a02:26f7:f8cc:e6a0::/60 +2a02:26f7:f8cc:e6b0::/61 +2a02:26f7:f8cc:e6b8::/62 +2a02:26f7:f8cd:4000::/64 +2a02:26f7:f8d0::/53 +2a02:26f7:f8d0:800::/58 +2a02:26f7:f8d0:840::/59 +2a02:26f7:f8d0:4000::/64 +2a02:26f7:f8d0:4c00::/58 +2a02:26f7:f8d0:e600::/57 +2a02:26f7:f8d0:e680::/59 +2a02:26f7:f8d0:e6a0::/60 +2a02:26f7:f8d0:e6b0::/61 +2a02:26f7:f8d0:e6b8::/62 +2a02:26f7:f8d1::/53 +2a02:26f7:f8d1:800::/58 +2a02:26f7:f8d1:840::/59 +2a02:26f7:f8d1:4000::/64 +2a02:26f7:f8d1:4c00::/58 +2a02:26f7:f8d1:e600::/57 +2a02:26f7:f8d1:e680::/59 +2a02:26f7:f8d1:e6a0::/60 +2a02:26f7:f8d1:e6b0::/61 +2a02:26f7:f8d1:e6b8::/62 +2a02:26f7:f8d2:4000::/64 +2a02:26f7:f8d3:4000::/64 +2a02:26f7:f8d4::/53 +2a02:26f7:f8d4:800::/58 +2a02:26f7:f8d4:840::/59 +2a02:26f7:f8d4:4000::/64 +2a02:26f7:f8d4:4c00::/58 +2a02:26f7:f8d4:e600::/57 +2a02:26f7:f8d4:e680::/59 +2a02:26f7:f8d4:e6a0::/60 +2a02:26f7:f8d4:e6b0::/61 +2a02:26f7:f8d4:e6b8::/62 +2a02:26f7:f8d5:4000::/64 +2a02:26f7:f8e0::/53 +2a02:26f7:f8e0:800::/58 +2a02:26f7:f8e0:840::/59 +2a02:26f7:f8e0:4000::/64 +2a02:26f7:f8e0:4c00::/58 +2a02:26f7:f8e0:e600::/57 +2a02:26f7:f8e0:e680::/59 +2a02:26f7:f8e0:e6a0::/60 +2a02:26f7:f8e0:e6b0::/61 +2a02:26f7:f8e0:e6b8::/62 +2a02:26f7:f8e1:4000::/64 +2a02:26f7:f8e2::/53 +2a02:26f7:f8e2:800::/58 +2a02:26f7:f8e2:840::/59 +2a02:26f7:f8e2:4000::/64 +2a02:26f7:f8e2:4c00::/58 +2a02:26f7:f8e2:e600::/57 +2a02:26f7:f8e2:e680::/59 +2a02:26f7:f8e2:e6a0::/60 +2a02:26f7:f8e2:e6b0::/61 +2a02:26f7:f8e2:e6b8::/62 +2a02:26f7:f8e3:4000::/64 +2a02:26f7:f900:4000::/64 +2a02:26f7:f900:c740::/64 +2a02:26f7:f901:4000::/64 +2a02:26f7:f904:4000::/64 +2a02:26f7:f904:c740::/64 +2a02:26f7:f905:4000::/64 +2a02:26f7:f908:4000::/64 +2a02:26f7:f908:c740::/64 +2a02:26f7:f909:4000::/64 +2a02:26f7:f90c:4000::/64 +2a02:26f7:f90c:c740::/64 +2a02:26f7:f90d:4000::/64 +2a02:26f7:f940::/54 +2a02:26f7:f940:400::/60 +2a02:26f7:f940:4000::/64 +2a02:26f7:f940:d340::/60 +2a02:26f7:f940:d350::/62 +2a02:26f7:f941:4000::/64 +2a02:26f7:f944::/54 +2a02:26f7:f944:400::/60 +2a02:26f7:f944:4000::/64 +2a02:26f7:f944:d340::/60 +2a02:26f7:f944:d350::/62 +2a02:26f7:f945:4000::/64 +2a02:26f7:f94c::/54 +2a02:26f7:f94c:400::/60 +2a02:26f7:f94c:4000::/64 +2a02:26f7:f94c:d340::/60 +2a02:26f7:f94c:d350::/62 +2a02:26f7:f94d:4000::/64 +2a02:26f7:f950::/54 +2a02:26f7:f950:400::/60 +2a02:26f7:f950:4000::/64 +2a02:26f7:f950:d340::/60 +2a02:26f7:f950:d350::/62 +2a02:26f7:f951:4000::/64 +2a02:26f7:f980::/53 +2a02:26f7:f980:4000::/64 +2a02:26f7:f980:4a40::/58 +2a02:26f7:f980:dc80::/59 +2a02:26f7:f980:dca0::/62 +2a02:26f7:f980:dca4::/63 +2a02:26f7:f981:4000::/64 +2a02:26f7:f982::/53 +2a02:26f7:f982:4000::/64 +2a02:26f7:f982:4a40::/58 +2a02:26f7:f982:dc80::/59 +2a02:26f7:f982:dca0::/62 +2a02:26f7:f982:dca4::/63 +2a02:26f7:f983:4000::/64 +2a02:26f7:f984::/53 +2a02:26f7:f984:4000::/64 +2a02:26f7:f984:4a40::/58 +2a02:26f7:f984:dc80::/59 +2a02:26f7:f984:dca0::/62 +2a02:26f7:f984:dca4::/63 +2a02:26f7:f985:4000::/64 +2a02:26f7:f988::/53 +2a02:26f7:f988:4000::/64 +2a02:26f7:f988:4a40::/58 +2a02:26f7:f988:dc80::/59 +2a02:26f7:f988:dca0::/62 +2a02:26f7:f988:dca4::/63 +2a02:26f7:f989:4000::/64 +2a02:26f7:f98c::/53 +2a02:26f7:f98c:4000::/64 +2a02:26f7:f98c:4a40::/58 +2a02:26f7:f98c:dc80::/59 +2a02:26f7:f98c:dca0::/62 +2a02:26f7:f98c:dca4::/63 +2a02:26f7:f98d:4000::/64 +2a02:26f7:f9c0:4000::/64 +2a02:26f7:f9c0:d0a0::/61 +2a02:26f7:f9c1:4000::/64 +2a02:26f7:f9c4:4000::/64 +2a02:26f7:f9c4:d0a0::/61 +2a02:26f7:f9c5:4000::/64 +2a02:26f7:f9c8:4000::/64 +2a02:26f7:f9c8:d0a0::/61 +2a02:26f7:f9c9:4000::/64 +2a02:26f7:fa00:4000::/64 +2a02:26f7:fa00:4900::/61 +2a02:26f7:fa00:4908::/64 +2a02:26f7:fa01:4000::/64 +2a02:26f7:fa02:4000::/64 +2a02:26f7:fa02:4900::/61 +2a02:26f7:fa02:4908::/64 +2a02:26f7:fa03:4000::/64 +2a02:26f7:fa04:4000::/64 +2a02:26f7:fa04:4900::/61 +2a02:26f7:fa04:4908::/64 +2a02:26f7:fa05:4000::/64 +2a02:26f7:fa08:4000::/64 +2a02:26f7:fa08:4900::/61 +2a02:26f7:fa08:4908::/64 +2a02:26f7:fa09:4000::/64 +2a02:26f7:fa40:4000::/64 +2a02:26f7:fa40:47c0::/62 +2a02:26f7:fa40:47c4::/64 +2a02:26f7:fa41:4000::/64 +2a02:26f7:fa44:4000::/64 +2a02:26f7:fa44:47c0::/62 +2a02:26f7:fa44:47c4::/64 +2a02:26f7:fa45:4000::/64 +2a02:26f7:fa48:4000::/64 +2a02:26f7:fa48:47c0::/62 +2a02:26f7:fa48:47c4::/64 +2a02:26f7:fa49:4000::/64 +2a02:26f7:fa80:4000::/64 +2a02:26f7:fa80:c380::/64 +2a02:26f7:fa81:4000::/64 +2a02:26f7:fa84:4000::/64 +2a02:26f7:fa84:c380::/64 +2a02:26f7:fa85:4000::/64 +2a02:26f7:fa88:4000::/64 +2a02:26f7:fa88:c380::/64 +2a02:26f7:fa89:4000::/64 +2a02:26f7:fac0::/54 +2a02:26f7:fac0:400::/56 +2a02:26f7:fac0:500::/58 +2a02:26f7:fac0:540::/59 +2a02:26f7:fac0:560::/60 +2a02:26f7:fac0:4000::/64 +2a02:26f7:fac0:4380::/58 +2a02:26f7:fac0:db80::/59 +2a02:26f7:fac0:dba0::/62 +2a02:26f7:fac1:4000::/64 +2a02:26f7:fac4::/54 +2a02:26f7:fac4:400::/56 +2a02:26f7:fac4:500::/58 +2a02:26f7:fac4:540::/59 +2a02:26f7:fac4:560::/60 +2a02:26f7:fac4:4000::/64 +2a02:26f7:fac4:4380::/58 +2a02:26f7:fac4:db80::/59 +2a02:26f7:fac4:dba0::/62 +2a02:26f7:fac5:4000::/64 +2a02:26f7:fac8::/54 +2a02:26f7:fac8:400::/56 +2a02:26f7:fac8:500::/58 +2a02:26f7:fac8:540::/59 +2a02:26f7:fac8:560::/60 +2a02:26f7:fac8:4000::/64 +2a02:26f7:fac8:4380::/58 +2a02:26f7:fac8:db80::/59 +2a02:26f7:fac8:dba0::/62 +2a02:26f7:fac9:4000::/64 +2a02:26f7:facc::/54 +2a02:26f7:facc:400::/56 +2a02:26f7:facc:500::/58 +2a02:26f7:facc:540::/59 +2a02:26f7:facc:560::/60 +2a02:26f7:facc:4000::/64 +2a02:26f7:facc:4380::/58 +2a02:26f7:facc:db80::/59 +2a02:26f7:facc:dba0::/62 +2a02:26f7:facd:4000::/64 +2a02:26f7:fad0::/54 +2a02:26f7:fad0:400::/56 +2a02:26f7:fad0:500::/58 +2a02:26f7:fad0:540::/59 +2a02:26f7:fad0:560::/60 +2a02:26f7:fad0:4000::/64 +2a02:26f7:fad0:4380::/58 +2a02:26f7:fad0:db80::/59 +2a02:26f7:fad0:dba0::/62 +2a02:26f7:fad1:4000::/64 +2a02:26f7:fb00::/54 +2a02:26f7:fb00:400::/56 +2a02:26f7:fb00:500::/60 +2a02:26f7:fb00:4000::/64 +2a02:26f7:fb00:4140::/63 +2a02:26f7:fb00:4142::/64 +2a02:26f7:fb00:4145::/64 +2a02:26f7:fb00:4146::/63 +2a02:26f7:fb00:4149::/64 +2a02:26f7:fb00:414a::/63 +2a02:26f7:fb00:414c::/64 +2a02:26f7:fb00:414e::/64 +2a02:26f7:fb00:4150::/64 +2a02:26f7:fb00:4152::/64 +2a02:26f7:fb00:4154::/63 +2a02:26f7:fb00:4157::/64 +2a02:26f7:fb00:4158::/64 +2a02:26f7:fb00:415a::/63 +2a02:26f7:fb00:415c::/63 +2a02:26f7:fb00:4161::/64 +2a02:26f7:fb00:4163::/64 +2a02:26f7:fb00:4164::/63 +2a02:26f7:fb00:4166::/64 +2a02:26f7:fb00:4168::/64 +2a02:26f7:fb01:4000::/64 +2a02:26f7:fb02::/54 +2a02:26f7:fb02:400::/56 +2a02:26f7:fb02:500::/60 +2a02:26f7:fb02:4000::/64 +2a02:26f7:fb02:4140::/63 +2a02:26f7:fb02:4142::/64 +2a02:26f7:fb02:4145::/64 +2a02:26f7:fb02:4146::/63 +2a02:26f7:fb02:4149::/64 +2a02:26f7:fb02:414a::/63 +2a02:26f7:fb02:414c::/64 +2a02:26f7:fb02:414e::/64 +2a02:26f7:fb02:4150::/64 +2a02:26f7:fb02:4152::/64 +2a02:26f7:fb02:4154::/63 +2a02:26f7:fb02:4157::/64 +2a02:26f7:fb02:4158::/64 +2a02:26f7:fb02:415a::/63 +2a02:26f7:fb02:415c::/63 +2a02:26f7:fb02:4161::/64 +2a02:26f7:fb02:4163::/64 +2a02:26f7:fb02:4164::/63 +2a02:26f7:fb02:4166::/64 +2a02:26f7:fb02:4168::/64 +2a02:26f7:fb03:4000::/64 +2a02:26f7:fb04::/54 +2a02:26f7:fb04:400::/56 +2a02:26f7:fb04:500::/60 +2a02:26f7:fb04:4000::/64 +2a02:26f7:fb04:4140::/63 +2a02:26f7:fb04:4142::/64 +2a02:26f7:fb04:4145::/64 +2a02:26f7:fb04:4146::/63 +2a02:26f7:fb04:4149::/64 +2a02:26f7:fb04:414a::/63 +2a02:26f7:fb04:414c::/64 +2a02:26f7:fb04:414e::/64 +2a02:26f7:fb04:4150::/64 +2a02:26f7:fb04:4152::/64 +2a02:26f7:fb04:4154::/63 +2a02:26f7:fb04:4157::/64 +2a02:26f7:fb04:4158::/64 +2a02:26f7:fb04:415a::/63 +2a02:26f7:fb04:415c::/63 +2a02:26f7:fb04:4161::/64 +2a02:26f7:fb04:4163::/64 +2a02:26f7:fb04:4164::/63 +2a02:26f7:fb04:4166::/64 +2a02:26f7:fb04:4168::/64 +2a02:26f7:fb05:4000::/64 +2a02:26f7:fb08::/54 +2a02:26f7:fb08:400::/56 +2a02:26f7:fb08:500::/60 +2a02:26f7:fb08:4000::/64 +2a02:26f7:fb08:4140::/63 +2a02:26f7:fb08:4142::/64 +2a02:26f7:fb08:4145::/64 +2a02:26f7:fb08:4146::/63 +2a02:26f7:fb08:4149::/64 +2a02:26f7:fb08:414a::/63 +2a02:26f7:fb08:414c::/64 +2a02:26f7:fb08:414e::/64 +2a02:26f7:fb08:4150::/64 +2a02:26f7:fb08:4152::/64 +2a02:26f7:fb08:4154::/63 +2a02:26f7:fb08:4157::/64 +2a02:26f7:fb08:4158::/64 +2a02:26f7:fb08:415a::/63 +2a02:26f7:fb08:415c::/63 +2a02:26f7:fb08:4161::/64 +2a02:26f7:fb08:4163::/64 +2a02:26f7:fb08:4164::/63 +2a02:26f7:fb08:4166::/64 +2a02:26f7:fb08:4168::/64 +2a02:26f7:fb09:4000::/64 +2a02:26f7:fb40:4000::/64 +2a02:26f7:fb41:4000::/64 +2a02:26f7:fb44:4000::/64 +2a02:26f7:fb45:4000::/64 +2a02:26f7:fb48:4000::/64 +2a02:26f7:fb49:4000::/64 +2a02:26f7:fb4c:4000::/64 +2a02:26f7:fb4d:4000::/64 +2a02:26f7:fb80:4000::/64 +2a02:26f7:fb80:c5e0::/64 +2a02:26f7:fb81:4000::/64 +2a02:26f7:fb84:4000::/64 +2a02:26f7:fb84:c5e0::/64 +2a02:26f7:fb85:4000::/64 +2a02:26f7:fb88:4000::/64 +2a02:26f7:fb88:c5e0::/64 +2a02:26f7:fb89:4000::/64 +2a02:26f7:fb8c:4000::/64 +2a02:26f7:fb8c:c5e0::/64 +2a02:26f7:fb8d:4000::/64 +2a02:26f7:fb90:4000::/64 +2a02:26f7:fb90:c5e0::/64 +2a02:26f7:fb91:4000::/64 +2a02:26f7:fbc0:4000::/64 +2a02:26f7:fbc1:4000::/64 +2a02:26f7:fbc2:4000::/64 +2a02:26f7:fbc3:4000::/64 +2a02:26f7:fbc4:4000::/64 +2a02:26f7:fbc5:4000::/64 +2a02:26f7:fbc8:4000::/64 +2a02:26f7:fbc9:4000::/64 +2a02:26f7:fbcc:4000::/64 +2a02:26f7:fbcd:4000::/64 +2a02:26f7:fc04:4000::/64 +2a02:26f7:fc04:4fc0::/61 +2a02:26f7:fc04:4fc8::/62 +2a02:26f7:fc04:4fcc::/63 +2a02:26f7:fc05:4000::/64 +2a02:26f7:fc08:4000::/64 +2a02:26f7:fc08:4fc0::/61 +2a02:26f7:fc08:4fc8::/62 +2a02:26f7:fc08:4fcc::/63 +2a02:26f7:fc09:4000::/64 +2a02:26f7:fc0c:4000::/64 +2a02:26f7:fc0c:4fc0::/61 +2a02:26f7:fc0c:4fc8::/62 +2a02:26f7:fc0c:4fcc::/63 +2a02:26f7:fc0d:4000::/64 +2a02:26f7:fc10:4000::/64 +2a02:26f7:fc10:4fc0::/61 +2a02:26f7:fc10:4fc8::/62 +2a02:26f7:fc10:4fcc::/63 +2a02:26f7:fc11:4000::/64 +2a02:26f7:fc14:4000::/64 +2a02:26f7:fc14:4fc0::/61 +2a02:26f7:fc14:4fc8::/62 +2a02:26f7:fc14:4fcc::/63 +2a02:26f7:fc15:4000::/64 +2a04:4e41:3b::/59 +2a04:4e41:3b:20::/63 +2a04:4e41:3b:22::/64 +2a04:4e41:100::/52 +2a04:4e41:101::/48 +2a04:4e41:120::/50 +2a04:4e41:121::/48 +2a04:4e41:140::/51 +2a04:4e41:141::/48 +2a04:4e41:180::/50 +2a04:4e41:180:4000::/51 +2a04:4e41:180:6000::/52 +2a04:4e41:181::/48 +2a04:4e41:182::/47 +2a04:4e41:184::/46 +2a04:4e41:188::/48 +2a04:4e41:1a0::/50 +2a04:4e41:1a1::/48 +2a04:4e41:1c0::/49 +2a04:4e41:1c0:8000::/50 +2a04:4e41:1c0:c000::/52 +2a04:4e41:1c1::/48 +2a04:4e41:1c2::/47 +2a04:4e41:1c4::/47 +2a04:4e41:1e0::/47 +2a04:4e41:200::/48 +2a04:4e41:201::/49 +2a04:4e41:201:8000::/50 +2a04:4e41:201:c000::/51 +2a04:4e41:202::/47 +2a04:4e41:204::/46 +2a04:4e41:208::/45 +2a04:4e41:210::/45 +2a04:4e41:218::/46 +2a04:4e41:280::/41 +2a04:4e41:300::/49 +2a04:4e41:301::/48 +2a04:4e41:302::/47 +2a04:4e41:380::/41 +2a04:4e41:400::/48 +2a04:4e41:401::/52 +2a04:4e41:402::/47 +2a04:4e41:404::/48 +2a04:4e41:480::/41 +2a04:4e41:500::/48 +2a04:4e41:501::/52 +2a04:4e41:502::/47 +2a04:4e41:504::/47 +2a04:4e41:580::/41 +2a04:4e41:600::/45 +2a04:4e41:608::/46 +2a04:4e41:60c::/47 +2a04:4e41:60e::/48 +2a04:4e41:60f::/49 +2a04:4e41:60f:8000::/51 +2a04:4e41:610::/46 +2a04:4e41:614::/48 +2a04:4e41:700::/40 +2a04:4e41:800::/48 +2a04:4e41:801::/49 +2a04:4e41:802::/47 +2a04:4e41:804::/46 +2a04:4e41:808::/45 +2a04:4e41:810::/46 +2a04:4e41:814::/47 +2a04:4e41:880::/41 +2a04:4e41:900::/40 +2a04:4e41:a00::/45 +2a04:4e41:a08::/46 +2a04:4e41:a0c::/47 +2a04:4e41:a0e::/48 +2a04:4e41:a0f::/49 +2a04:4e41:a0f:8000::/50 +2a04:4e41:a0f:c000::/51 +2a04:4e41:a0f:e000::/52 +2a04:4e41:b00::/40 +2a04:4e41:d00::/48 +2a04:4e41:d01::/51 +2a04:4e41:d02::/47 +2a04:4e41:d04::/47 +2a04:4e41:d80::/41 +2a04:4e41:e00::/47 +2a04:4e41:e02::/49 +2a04:4e41:e02:8000::/51 +2a04:4e41:e02:a000::/52 +2a04:4e41:f00::/40 +2a04:4e41:1000::/45 +2a04:4e41:1008::/48 +2a04:4e41:1009::/50 +2a04:4e41:1009:4000::/51 +2a04:4e41:1009:6000::/52 +2a04:4e41:1100::/40 +2a04:4e41:1200::/52 +2a04:4e41:1201::/48 +2a04:4e41:1220::/50 +2a04:4e41:1220:4000::/51 +2a04:4e41:1221::/48 +2a04:4e41:1222::/47 +2a04:4e41:1224::/47 +2a04:4e41:1240::/51 +2a04:4e41:1240:2000::/52 +2a04:4e41:1241::/48 +2a04:4e41:1242::/47 +2a04:4e41:1260::/50 +2a04:4e41:1260:4000::/51 +2a04:4e41:1261::/48 +2a04:4e41:1262::/47 +2a04:4e41:1264::/47 +2a04:4e41:1280::/50 +2a04:4e41:1281::/48 +2a04:4e41:1282::/47 +2a04:4e41:12a0::/49 +2a04:4e41:12a0:8000::/50 +2a04:4e41:12a0:c000::/51 +2a04:4e41:12a1::/48 +2a04:4e41:12a2::/47 +2a04:4e41:12a4::/46 +2a04:4e41:12a8::/45 +2a04:4e41:12b0::/48 +2a04:4e41:12c0::/52 +2a04:4e41:12c1::/48 +2a04:4e41:12c2::/47 +2a04:4e41:12c4::/46 +2a04:4e41:12c8::/45 +2a04:4e41:12d0::/46 +2a04:4e41:12e0::/49 +2a04:4e41:12e1::/48 +2a04:4e41:12e2::/47 +2a04:4e41:12e4::/47 +2a04:4e41:1300::/47 +2a04:4e41:1302::/48 +2a04:4e41:1303::/49 +2a04:4e41:1304::/46 +2a04:4e41:1308::/45 +2a04:4e41:1310::/44 +2a04:4e41:1320::/44 +2a04:4e41:1330::/47 +2a04:4e41:1332::/48 +2a04:4e41:1380::/41 +2a04:4e41:1400::/46 +2a04:4e41:1404::/48 +2a04:4e41:1405::/52 +2a04:4e41:1406::/47 +2a04:4e41:1408::/45 +2a04:4e41:1410::/44 +2a04:4e41:1420::/45 +2a04:4e41:1428::/47 +2a04:4e41:142a::/48 +2a04:4e41:1480::/41 +2a04:4e41:1500::/40 +2a04:4e41:1600::/47 +2a04:4e41:1602::/48 +2a04:4e41:1603::/49 +2a04:4e41:1603:8000::/52 +2a04:4e41:1604::/46 +2a04:4e41:1608::/45 +2a04:4e41:1610::/44 +2a04:4e41:1620::/45 +2a04:4e41:1628::/48 +2a04:4e41:1680::/41 +2a04:4e41:1700::/40 +2a04:4e41:1800::/46 +2a04:4e41:1804::/47 +2a04:4e41:1806::/51 +2a04:4e41:1807::/48 +2a04:4e41:1808::/45 +2a04:4e41:1810::/44 +2a04:4e41:1820::/43 +2a04:4e41:1840::/45 +2a04:4e41:1848::/48 +2a04:4e41:1880::/41 +2a04:4e41:1900::/41 +2a04:4e41:1a00::/48 +2a04:4e41:1a01::/51 +2a04:4e41:1a02::/47 +2a04:4e41:1a04::/46 +2a04:4e41:1a08::/48 +2a04:4e41:1a80::/41 +2a04:4e41:1b00::/49 +2a04:4e41:1b00:8000::/50 +2a04:4e41:1b80::/41 +2a04:4e41:1c00::/50 +2a04:4e41:1c00:4000::/52 +2a04:4e41:1c01::/48 +2a04:4e41:1c02::/48 +2a04:4e41:1d00::/40 +2a04:4e41:1e00::/47 +2a04:4e41:1e02::/48 +2a04:4e41:1e80::/41 +2a04:4e41:1f00::/48 +2a04:4e41:1f01::/52 +2a04:4e41:1f02::/47 +2a04:4e41:1f04::/47 +2a04:4e41:1f06::/48 +2a04:4e41:1f80::/41 +2a04:4e41:2000::/45 +2a04:4e41:2008::/48 +2a04:4e41:2009::/50 +2a04:4e41:2009:4000::/51 +2a04:4e41:2009:6000::/52 +2a04:4e41:2100::/40 +2a04:4e41:2200::/51 +2a04:4e41:2200:2000::/52 +2a04:4e41:2201::/48 +2a04:4e41:2300::/40 +2a04:4e41:2400::/47 +2a04:4e41:2402::/48 +2a04:4e41:2500::/40 +2a04:4e41:2600::/46 +2a04:4e41:2604::/47 +2a04:4e41:2606::/48 +2a04:4e41:2607::/49 +2a04:4e41:2608::/45 +2a04:4e41:2610::/47 +2a04:4e41:2612::/48 +2a04:4e41:2700::/40 +2a04:4e41:2800::/46 +2a04:4e41:2804::/47 +2a04:4e41:2806::/48 +2a04:4e41:2807::/49 +2a04:4e41:2808::/45 +2a04:4e41:2900::/40 +2a04:4e41:2a00::/45 +2a04:4e41:2a08::/46 +2a04:4e41:2a0c::/47 +2a04:4e41:2a0e::/48 +2a04:4e41:2a0f::/49 +2a04:4e41:2a0f:8000::/50 +2a04:4e41:2a0f:c000::/52 +2a04:4e41:2a10::/47 +2a04:4e41:2b00::/40 +2a04:4e41:2c00::/45 +2a04:4e41:2c08::/48 +2a04:4e41:2c09::/49 +2a04:4e41:2c09:8000::/50 +2a04:4e41:2c09:c000::/52 +2a04:4e41:2c0a::/47 +2a04:4e41:2c0c::/47 +2a04:4e41:2c0e::/49 +2a04:4e41:2c0e:8000::/51 +2a04:4e41:2c0e:a000::/52 +2a04:4e41:2d00::/40 +2a04:4e41:2e00::/45 +2a04:4e41:2e08::/48 +2a04:4e41:2e09::/49 +2a04:4e41:2e09:8000::/50 +2a04:4e41:2e09:c000::/52 +2a04:4e41:2e0a::/48 +2a04:4e41:2f00::/40 +2a04:4e41:3000::/44 +2a04:4e41:3010::/51 +2a04:4e41:3010:2000::/52 +2a04:4e41:3011::/48 +2a04:4e41:3012::/47 +2a04:4e41:3014::/46 +2a04:4e41:3100::/40 +2a04:4e41:3200::/45 +2a04:4e41:3208::/46 +2a04:4e41:320c::/47 +2a04:4e41:320e::/48 +2a04:4e41:320f::/49 +2a04:4e41:320f:8000::/50 +2a04:4e41:320f:c000::/52 +2a04:4e41:3210::/47 +2a04:4e41:3300::/40 +2a04:4e41:3400::/44 +2a04:4e41:3410::/50 +2a04:4e41:3410:4000::/51 +2a04:4e41:3411::/48 +2a04:4e41:3412::/47 +2a04:4e41:3414::/46 +2a04:4e41:3418::/48 +2a04:4e41:3500::/40 +2a04:4e41:3600::/44 +2a04:4e41:3610::/49 +2a04:4e41:3610:8000::/50 +2a04:4e41:3610:c000::/51 +2a04:4e41:3611::/48 +2a04:4e41:3612::/47 +2a04:4e41:3614::/46 +2a04:4e41:3618::/45 +2a04:4e41:3620::/45 +2a04:4e41:3628::/47 +2a04:4e41:362a::/48 +2a04:4e41:3700::/40 +2a04:4e41:3800::/45 +2a04:4e41:3808::/48 +2a04:4e41:3809::/50 +2a04:4e41:3809:4000::/51 +2a04:4e41:3809:6000::/52 +2a04:4e41:3900::/40 +2a04:4e41:3a00::/44 +2a04:4e41:3a10::/48 +2a04:4e41:3a11::/51 +2a04:4e41:3a11:2000::/52 +2a04:4e41:3a12::/47 +2a04:4e41:3a14::/46 +2a04:4e41:3a18::/45 +2a04:4e41:3a20::/44 +2a04:4e41:3a30::/45 +2a04:4e41:3a38::/46 +2a04:4e41:3b00::/40 +2a04:4e41:3c00::/46 +2a04:4e41:3c04::/47 +2a04:4e41:3c06::/48 +2a04:4e41:3c07::/50 +2a04:4e41:3c07:4000::/51 +2a04:4e41:3c07:6000::/52 +2a04:4e41:3d00::/40 +2a04:4e41:3e00::/44 +2a04:4e41:3e10::/49 +2a04:4e41:3e11::/48 +2a04:4e41:3e12::/47 +2a04:4e41:3e14::/46 +2a04:4e41:3e18::/45 +2a04:4e41:3e80::/41 +2a04:4e41:3f00::/40 +2a04:4e41:4100::/49 +2a04:4e41:4100:8000::/51 +2a04:4e41:4100:a000::/52 +2a04:4e41:4101::/48 +2a04:4e41:4102::/47 +2a04:4e41:4104::/46 +2a04:4e41:4108::/45 +2a04:4e41:4110::/46 +2a04:4e41:4114::/47 +2a04:4e41:4180::/41 +2a04:4e41:4200::/46 +2a04:4e41:4204::/47 +2a04:4e41:4206::/48 +2a04:4e41:4207::/49 +2a04:4e41:4208::/45 +2a04:4e41:4210::/47 +2a04:4e41:4212::/48 +2a04:4e41:4300::/40 +2a04:4e41:4400::/44 +2a04:4e41:4410::/51 +2a04:4e41:4410:2000::/52 +2a04:4e41:4411::/48 +2a04:4e41:4412::/47 +2a04:4e41:4414::/46 +2a04:4e41:4500::/40 +2a04:4e41:4600::/46 +2a04:4e41:4604::/47 +2a04:4e41:4606::/48 +2a04:4e41:4607::/49 +2a04:4e41:4607:8000::/50 +2a04:4e41:4607:c000::/52 +2a04:4e41:4608::/45 +2a04:4e41:4610::/46 +2a04:4e41:4614::/48 +2a04:4e41:4680::/41 +2a04:4e41:4700::/40 +2a04:4e41:4800::/48 +2a04:4e41:4801::/49 +2a04:4e41:4802::/47 +2a04:4e41:4804::/46 +2a04:4e41:4808::/45 +2a04:4e41:4810::/46 +2a04:4e41:4814::/47 +2a04:4e41:4880::/41 +2a04:4e41:4900::/40 +2a04:4e41:4a00::/44 +2a04:4e41:4a10::/50 +2a04:4e41:4a10:4000::/51 +2a04:4e41:4a11::/48 +2a04:4e41:4a12::/47 +2a04:4e41:4a14::/46 +2a04:4e41:4a18::/48 +2a04:4e41:4b00::/40 +2a04:4e41:4c00::/51 +2a04:4e41:4c00:2000::/52 +2a04:4e41:4c01::/48 +2a04:4e41:4c02::/47 +2a04:4e41:4c20::/48 +2a04:4e41:4c40::/50 +2a04:4e41:4c41::/48 +2a04:4e41:4c60::/51 +2a04:4e41:4c61::/48 +2a04:4e41:4c62::/47 +2a04:4e41:4c64::/48 +2a04:4e41:4c80::/49 +2a04:4e41:4c80:8000::/52 +2a04:4e41:4c81::/48 +2a04:4e41:4c82::/47 +2a04:4e41:4c84::/46 +2a04:4e41:4ca0::/48 +2a04:4e41:4ca1::/51 +2a04:4e41:4ca2::/47 +2a04:4e41:4ca4::/46 +2a04:4e41:4ca8::/45 +2a04:4e41:4cb0::/47 +2a04:4e41:4cb2::/48 +2a04:4e41:4cc0::/50 +2a04:4e41:4cc1::/48 +2a04:4e41:4ce0::/47 +2a04:4e41:4ce2::/52 +2a04:4e41:4ce3::/48 +2a04:4e41:4ce4::/48 +2a04:4e41:4d00::/49 +2a04:4e41:4d80::/41 +2a04:4e41:4e00::/44 +2a04:4e41:4e10::/45 +2a04:4e41:4e80::/41 +2a04:4e41:4f00::/41 +2a04:4e41:5000::/45 +2a04:4e41:5008::/48 +2a04:4e41:5009::/50 +2a04:4e41:5009:4000::/51 +2a04:4e41:5009:6000::/52 +2a04:4e41:5100::/40 +2a04:4e41:5200::/47 +2a04:4e41:5202::/50 +2a04:4e41:5202:4000::/51 +2a04:4e41:5203::/48 +2a04:4e41:5204::/46 +2a04:4e41:5208::/45 +2a04:4e41:5210::/44 +2a04:4e41:5220::/47 +2a04:4e41:5222::/48 +2a04:4e41:5280::/41 +2a04:4e41:5300::/40 +2a04:4e41:5400::/45 +2a04:4e41:5408::/48 +2a04:4e41:5409::/50 +2a04:4e41:5409:4000::/51 +2a04:4e41:5409:6000::/52 +2a04:4e41:5500::/40 +2a04:4e41:5600::/46 +2a04:4e41:5604::/48 +2a04:4e41:5605::/52 +2a04:4e41:5606::/47 +2a04:4e41:5608::/45 +2a04:4e41:5610::/44 +2a04:4e41:5620::/45 +2a04:4e41:5628::/47 +2a04:4e41:5680::/41 +2a04:4e41:5700::/40 +2a04:4e41:5800::/49 +2a04:4e41:5800:8000::/50 +2a04:4e41:5801::/48 +2a04:4e41:5802::/47 +2a04:4e41:5804::/46 +2a04:4e41:5808::/46 +2a04:4e41:5880::/41 +2a04:4e41:5900::/49 +2a04:4e41:5980::/41 +2a04:4e41:5a00::/46 +2a04:4e41:5a04::/47 +2a04:4e41:5a06::/48 +2a04:4e41:5a07::/50 +2a04:4e41:5a07:4000::/51 +2a04:4e41:5a07:6000::/52 +2a04:4e41:5b00::/40 +2a04:4e41:5c00::/47 +2a04:4e41:5c02::/49 +2a04:4e41:5c02:8000::/51 +2a04:4e41:5c02:a000::/52 +2a04:4e41:5d00::/40 +2a04:4e41:5e00::/47 +2a04:4e41:5e02::/49 +2a04:4e41:5e02:8000::/51 +2a04:4e41:5e03::/48 +2a04:4e41:5e04::/46 +2a04:4e41:5e08::/45 +2a04:4e41:5e10::/44 +2a04:4e41:5e20::/44 +2a04:4e41:5e30::/47 +2a04:4e41:5e80::/41 +2a04:4e41:5f00::/41 +2a04:4e41:6000::/48 +2a04:4e41:6001::/50 +2a04:4e41:6001:4000::/52 +2a04:4e41:6002::/47 +2a04:4e41:6004::/46 +2a04:4e41:6080::/41 +2a04:4e41:6100::/40 +2a04:4e41:6200::/48 +2a04:4e41:6201::/51 +2a04:4e41:6202::/47 +2a04:4e41:6204::/46 +2a04:4e41:6208::/48 +2a04:4e41:6280::/41 +2a04:4e41:6300::/48 +2a04:4e41:6301::/51 +2a04:4e41:6302::/47 +2a04:4e41:6304::/46 +2a04:4e41:6308::/48 +2a04:4e41:6380::/41 +2a04:4e41:6400::/46 +2a04:4e41:6404::/47 +2a04:4e41:6406::/48 +2a04:4e41:6407::/49 +2a04:4e41:6407:8000::/50 +2a04:4e41:6407:c000::/51 +2a04:4e41:6407:e000::/52 +2a04:4e41:6408::/45 +2a04:4e41:6500::/40 +2a04:4e41:6600::/46 +2a04:4e41:6604::/47 +2a04:4e41:6606::/48 +2a04:4e41:6607::/49 +2a04:4e41:6607:8000::/50 +2a04:4e41:6607:c000::/51 +2a04:4e41:6607:e000::/52 +2a04:4e41:6700::/40 +2a04:4e41:6800::/49 +2a04:4e41:6800:8000::/50 +2a04:4e41:6801::/48 +2a04:4e41:6802::/47 +2a04:4e41:6804::/46 +2a04:4e41:6808::/46 +2a04:4e41:680c::/47 +2a04:4e41:6880::/41 +2a04:4e41:6900::/47 +2a04:4e41:6902::/52 +2a04:4e41:6903::/48 +2a04:4e41:6904::/48 +2a04:4e41:6920::/47 +2a04:4e41:6922::/52 +2a04:4e41:6923::/48 +2a04:4e41:6924::/48 +2a04:4e41:6a00::/48 +2a04:4e41:6a01::/51 +2a04:4e41:6a02::/47 +2a04:4e41:6a04::/47 +2a04:4e41:6a06::/48 +2a04:4e41:6a80::/41 +2a04:4e41:6b00::/40 +2a04:4e41:6c00::/46 +2a04:4e41:6c04::/47 +2a04:4e41:6c06::/49 +2a04:4e41:6c06:8000::/50 +2a04:4e41:6c06:c000::/51 +2a04:4e41:6c06:e000::/52 +2a04:4e41:6c07:1000::/52 +2a04:4e41:6c07:2000::/51 +2a04:4e41:6d00::/40 +2a04:4e41:6e00::/46 +2a04:4e41:6e04::/47 +2a04:4e41:6e06::/48 +2a04:4e41:6e07::/50 +2a04:4e41:6e07:4000::/52 +2a04:4e41:6e08::/45 +2a04:4e41:6f00::/40 +2a04:4e41:7000::/44 +2a04:4e41:7010::/49 +2a04:4e41:7011::/48 +2a04:4e41:7012::/47 +2a04:4e41:7014::/46 +2a04:4e41:7018::/45 +2a04:4e41:7100::/40 +2a04:4e41:7200::/44 +2a04:4e41:7210::/49 +2a04:4e41:7211::/48 +2a04:4e41:7212::/47 +2a04:4e41:7214::/46 +2a04:4e41:7218::/45 +2a04:4e41:7300::/40 +2a04:4e41:7400::/47 +2a04:4e41:7402::/48 +2a04:4e41:7403::/49 +2a04:4e41:7403:8000::/52 +2a04:4e41:7404::/46 +2a04:4e41:7408::/45 +2a04:4e41:7410::/44 +2a04:4e41:7420::/45 +2a04:4e41:7428::/48 +2a04:4e41:7480::/41 +2a04:4e41:7500::/40 +2a04:4e41:7600::/47 +2a04:4e41:7602::/49 +2a04:4e41:7602:8000::/51 +2a04:4e41:7603::/48 +2a04:4e41:7604::/46 +2a04:4e41:7608::/45 +2a04:4e41:7610::/44 +2a04:4e41:7620::/44 +2a04:4e41:7630::/47 +2a04:4e41:7680::/41 +2a04:4e41:7700::/41 +2a04:4e41:7800::/49 +2a04:4e41:7800:8000::/51 +2a04:4e41:7800:a000::/52 +2a04:4e41:7801::/48 +2a04:4e41:7802::/47 +2a04:4e41:7804::/46 +2a04:4e41:7808::/45 +2a04:4e41:7810::/46 +2a04:4e41:7814::/47 +2a04:4e41:7880::/41 +2a09:bac2::/35 +2a09:bac2:2000::/38 +2a09:bac2:2400::/39 +2a09:bac2:2600::/40 +2a09:bac2:2700::/44 +2a09:bac2:2710::/45 +2a09:bac2:2730::/44 +2a09:bac2:2740::/42 +2a09:bac2:2780::/41 +2a09:bac2:2800::/37 +2a09:bac2:3000::/36 +2a09:bac2:4000::/40 +2a09:bac2:4100::/43 +2a09:bac2:4120::/44 +2a09:bac2:4148::/45 +2a09:bac2:4150::/44 +2a09:bac2:4160::/43 +2a09:bac2:4180::/41 +2a09:bac2:4200::/39 +2a09:bac2:4400::/39 +2a09:bac2:4600::/42 +2a09:bac2:4640::/43 +2a09:bac2:4660::/44 +2a09:bac2:4670::/45 +2a09:bac2:4680::/41 +2a09:bac2:4700::/40 +2a09:bac2:4800::/37 +2a09:bac2:5000::/38 +2a09:bac2:5400::/40 +2a09:bac2:5500::/41 +2a09:bac2:55a0::/43 +2a09:bac2:55c0::/42 +2a09:bac2:5600::/39 +2a09:bac2:5800::/37 +2a09:bac2:6000::/35 +2a09:bac2:8000::/34 +2a09:bac2:c000::/36 +2a09:bac2:d000::/38 +2a09:bac2:d400::/40 +2a09:bac2:d500::/42 +2a09:bac2:d540::/43 +2a09:bac2:d560::/45 +2a09:bac3::/35 +2a09:bac3:2000::/38 +2a09:bac3:2400::/39 +2a09:bac3:2600::/40 +2a09:bac3:2700::/44 +2a09:bac3:2710::/45 +2a09:bac3:2730::/44 +2a09:bac3:2740::/42 +2a09:bac3:2780::/41 +2a09:bac3:2800::/37 +2a09:bac3:3000::/36 +2a09:bac3:4000::/40 +2a09:bac3:4100::/43 +2a09:bac3:4120::/44 +2a09:bac3:4148::/45 +2a09:bac3:4150::/44 +2a09:bac3:4160::/43 +2a09:bac3:4180::/41 +2a09:bac3:4200::/39 +2a09:bac3:4400::/39 +2a09:bac3:4600::/42 +2a09:bac3:4640::/43 +2a09:bac3:4660::/44 +2a09:bac3:4670::/45 +2a09:bac3:4680::/41 +2a09:bac3:4700::/40 +2a09:bac3:4800::/37 +2a09:bac3:5000::/38 +2a09:bac3:5400::/40 +2a09:bac3:5500::/41 +2a09:bac3:55a0::/43 +2a09:bac3:55c0::/42 +2a09:bac3:5600::/39 +2a09:bac3:5800::/37 +2a09:bac3:6000::/35 +2a09:bac3:8000::/34 +2a09:bac3:c000::/36 +2a09:bac3:d000::/38 +2a09:bac3:d400::/40 +2a09:bac3:d500::/42 +2a09:bac3:d540::/43 +2a09:bac3:d560::/45 diff --git a/slips_files/organizations_info/facebook b/slips_files/organizations_info/facebook deleted file mode 100644 index cd202d501..000000000 --- a/slips_files/organizations_info/facebook +++ /dev/null @@ -1,536 +0,0 @@ -69.63.176.0/20 -66.220.144.0/20 -66.220.144.0/21 -69.63.184.0/21 -69.63.176.0/21 -74.119.76.0/22 -69.171.255.0/24 -173.252.64.0/18 -69.171.224.0/19 -69.171.224.0/20 -103.4.96.0/22 -173.252.64.0/19 -31.13.64.0/18 -31.13.24.0/21 -66.220.152.0/21 -69.171.239.0/24 -69.171.240.0/20 -31.13.64.0/19 -31.13.64.0/24 -31.13.65.0/24 -31.13.67.0/24 -31.13.68.0/24 -31.13.69.0/24 -31.13.70.0/24 -31.13.71.0/24 -31.13.72.0/24 -31.13.73.0/24 -31.13.74.0/24 -31.13.75.0/24 -31.13.76.0/24 -31.13.77.0/24 -31.13.96.0/19 -31.13.66.0/24 -173.252.96.0/19 -69.63.178.0/24 -31.13.78.0/24 -31.13.79.0/24 -31.13.80.0/24 -31.13.82.0/24 -31.13.83.0/24 -31.13.84.0/24 -31.13.85.0/24 -31.13.86.0/24 -31.13.87.0/24 -31.13.88.0/24 -31.13.89.0/24 -31.13.91.0/24 -31.13.92.0/24 -31.13.93.0/24 -31.13.94.0/24 -31.13.95.0/24 -31.13.81.0/24 -179.60.192.0/22 -179.60.192.0/24 -179.60.193.0/24 -179.60.194.0/24 -179.60.195.0/24 -185.60.216.0/22 -45.64.40.0/22 -185.60.216.0/24 -185.60.217.0/24 -185.60.218.0/24 -185.60.219.0/24 -129.134.0.0/16 -157.240.0.0/16 -157.240.8.0/24 -157.240.0.0/24 -157.240.1.0/24 -157.240.2.0/24 -157.240.3.0/24 -157.240.5.0/24 -157.240.6.0/24 -157.240.7.0/24 -157.240.9.0/24 -157.240.10.0/24 -157.240.16.0/24 -157.240.19.0/24 -157.240.11.0/24 -157.240.12.0/24 -157.240.13.0/24 -157.240.14.0/24 -157.240.15.0/24 -157.240.17.0/24 -157.240.18.0/24 -157.240.20.0/24 -157.240.21.0/24 -157.240.22.0/24 -157.240.23.0/24 -157.240.0.0/17 -69.171.250.0/24 -204.15.20.0/22 -157.240.192.0/24 -157.240.198.0/24 -102.132.96.0/20 -102.132.96.0/24 -102.132.97.0/24 -157.240.26.0/24 -157.240.27.0/24 -157.240.28.0/24 -157.240.29.0/24 -157.240.30.0/24 -129.134.28.0/24 -129.134.29.0/24 -157.240.208.0/24 -157.240.193.0/24 -157.240.194.0/24 -157.240.195.0/24 -157.240.197.0/24 -157.240.196.0/24 -157.240.200.0/24 -157.240.201.0/24 -157.240.203.0/24 -157.240.204.0/24 -157.240.205.0/24 -157.240.206.0/24 -157.240.207.0/24 -157.240.209.0/24 -157.240.210.0/24 -157.240.211.0/24 -157.240.212.0/24 -157.240.213.0/24 -157.240.214.0/24 -157.240.215.0/24 -157.240.216.0/24 -157.240.222.0/24 -129.134.30.0/24 -129.134.31.0/24 -129.134.30.0/23 -129.134.25.0/24 -129.134.26.0/24 -129.134.27.0/24 -102.132.99.0/24 -102.132.101.0/24 -129.134.64.0/24 -129.134.65.0/24 -129.134.66.0/24 -129.134.67.0/24 -157.240.219.0/24 -157.240.217.0/24 -157.240.218.0/24 -157.240.199.0/24 -129.134.127.0/24 -157.240.223.0/24 -157.240.192.0/18 -157.240.221.0/24 -157.240.220.0/24 -173.252.88.0/21 -129.134.68.0/24 -129.134.69.0/24 -129.134.70.0/24 -157.240.24.0/24 -157.240.25.0/24 -102.132.100.0/24 -157.240.31.0/24 -157.240.224.0/24 -129.134.71.0/24 -157.240.225.0/24 -157.240.226.0/24 -157.240.227.0/24 -129.134.0.0/17 -129.134.72.0/24 -129.134.73.0/24 -129.134.74.0/24 -185.89.218.0/24 -185.89.219.0/24 -185.89.218.0/23 -157.240.228.0/24 -157.240.229.0/24 -129.134.76.0/24 -129.134.75.0/24 -157.240.239.0/24 -157.240.240.0/24 -157.240.241.0/24 -157.240.231.0/24 -157.240.232.0/24 -157.240.233.0/24 -157.240.234.0/24 -157.240.235.0/24 -157.240.236.0/24 -129.134.77.0/24 -129.134.78.0/24 -129.134.79.0/24 -157.240.237.0/24 -157.240.238.0/24 -157.240.242.0/24 -185.89.219.0/24 -185.89.218.0/24 -185.89.218.0/23 -185.89.216.0/22 -147.75.208.0/20 -204.15.20.0/22 -69.63.176.0/20 -69.63.176.0/21 -69.63.184.0/21 -66.220.144.0/20 -69.63.176.0/20 -2620:0:1c00::/40 -2a03:2880::/32 -2a03:2880:fffe::/48 -2a03:2880:ffff::/48 -2620:0:1cff::/48 -2a03:2880:f001::/48 -2a03:2880:f003::/48 -2a03:2880:f004::/48 -2a03:2880:f005::/48 -2a03:2880:f006::/48 -2a03:2880:f007::/48 -2a03:2880:f008::/48 -2a03:2880:f00a::/48 -2a03:2880:f00c::/48 -2a03:2880:f00d::/48 -2a03:2880:f00e::/48 -2a03:2880:f00f::/48 -2a03:2880:f010::/48 -2a03:2880:f011::/48 -2a03:2880:f012::/48 -2a03:2880:f013::/48 -2a03:2880:f016::/48 -2a03:2880:f017::/48 -2a03:2880:f019::/48 -2a03:2880:f01b::/48 -2a03:2880:f01c::/48 -2a03:2880:f01f::/48 -2a03:2880:1000::/36 -2a03:2880:2000::/36 -2a03:2880:3000::/36 -2a03:2880:4000::/36 -2a03:2880:5000::/36 -2a03:2880:6000::/36 -2a03:2880:7000::/36 -2a03:2880:f021::/48 -2a03:2880:f023::/48 -2a03:2880:f024::/48 -2a03:2880:f027::/48 -2a03:2880:f028::/48 -2a03:2880:f029::/48 -2a03:2880:f02b::/48 -2a03:2880:f02c::/48 -2a03:2880:f02d::/48 -2a03:2880:f02e::/48 -2a03:2880:f02f::/48 -2a03:2880:f030::/48 -2a03:2880:f031::/48 -2a03:2880:f032::/48 -2a03:2880:f033::/48 -2a03:2880:f034::/48 -2a03:2880:f035::/48 -2a03:2880:f036::/48 -2a03:2880:f037::/48 -2a03:2880:f038::/48 -2a03:2880:f03a::/48 -2a03:2880:f03b::/48 -2a03:2880:f03d::/48 -2a03:2880:f03e::/48 -2a03:2880:f03f::/48 -2401:db00::/32 -2a03:2880::/36 -2a03:2880:f101::/48 -2a03:2880:f201::/48 -2a03:2880:f103::/48 -2a03:2880:f203::/48 -2a03:2880:f104::/48 -2a03:2880:f204::/48 -2a03:2880:f107::/48 -2a03:2880:f207::/48 -2a03:2880:f108::/48 -2a03:2880:f208::/48 -2a03:2880:f10a::/48 -2a03:2880:f20a::/48 -2a03:2880:f10d::/48 -2a03:2880:f20d::/48 -2a03:2880:f10e::/48 -2a03:2880:f20e::/48 -2a03:2880:f10f::/48 -2a03:2880:f20f::/48 -2a03:2880:f110::/48 -2a03:2880:f210::/48 -2a03:2880:f111::/48 -2a03:2880:f211::/48 -2a03:2880:f112::/48 -2a03:2880:f212::/48 -2a03:2880:f116::/48 -2a03:2880:f216::/48 -2a03:2880:f117::/48 -2a03:2880:f217::/48 -2a03:2880:f119::/48 -2a03:2880:f219::/48 -2a03:2880:f11f::/48 -2a03:2880:f21f::/48 -2a03:2880:f121::/48 -2a03:2880:f221::/48 -2a03:2880:f123::/48 -2a03:2880:f223::/48 -2a03:2880:f10c::/48 -2a03:2880:f20c::/48 -2a03:2880:f105::/48 -2a03:2880:f205::/48 -2a03:2880:f106::/48 -2a03:2880:f206::/48 -2a03:2880:f11b::/48 -2a03:2880:f21b::/48 -2a03:2880:f113::/48 -2a03:2880:f213::/48 -2a03:2880:f11c::/48 -2a03:2880:f21c::/48 -2a03:2880:f128::/48 -2a03:2880:f228::/48 -2a03:2880:f02a::/48 -2a03:2880:f12a::/48 -2a03:2880:f22a::/48 -2a03:2880:f12f::/48 -2a03:2880:f22f::/48 -2a03:2880:f124::/48 -2a03:2880:f127::/48 -2a03:2880:f129::/48 -2a03:2880:f12b::/48 -2a03:2880:f12c::/48 -2a03:2880:f12d::/48 -2a03:2880:f12e::/48 -2a03:2880:f130::/48 -2a03:2880:f131::/48 -2a03:2880:f132::/48 -2a03:2880:f133::/48 -2a03:2880:f134::/48 -2a03:2880:f135::/48 -2a03:2880:f136::/48 -2a03:2880:f137::/48 -2a03:2880:f138::/48 -2a03:2880:f13a::/48 -2a03:2880:f13b::/48 -2a03:2880:f13d::/48 -2a03:2880:f13e::/48 -2a03:2880:f13f::/48 -2a03:2880:f224::/48 -2a03:2880:f227::/48 -2a03:2880:f229::/48 -2a03:2880:f22b::/48 -2a03:2880:f22c::/48 -2a03:2880:f22d::/48 -2a03:2880:f22e::/48 -2a03:2880:f230::/48 -2a03:2880:f231::/48 -2a03:2880:f232::/48 -2a03:2880:f233::/48 -2a03:2880:f234::/48 -2a03:2880:f235::/48 -2a03:2880:f236::/48 -2a03:2880:f237::/48 -2a03:2880:f238::/48 -2a03:2880:f23a::/48 -2a03:2880:f23b::/48 -2a03:2880:f23d::/48 -2a03:2880:f23e::/48 -2a03:2880:f23f::/48 -2a03:2880:f0ff::/48 -2a03:2880:f1ff::/48 -2a03:2880:f2ff::/48 -2a03:2880:f044::/48 -2a03:2880:f144::/48 -2a03:2880:f244::/48 -2a03:2880:f042::/48 -2a03:2880:f043::/48 -2a03:2880:f045::/48 -2a03:2880:f046::/48 -2a03:2880:f047::/48 -2a03:2880:f048::/48 -2a03:2880:f04a::/48 -2a03:2880:f04c::/48 -2a03:2880:f04b::/48 -2a03:2880:f04d::/48 -2a03:2880:f259::/48 -2a03:2880:f258::/48 -2a03:2880:f257::/48 -2a03:2880:f256::/48 -2a03:2880:f255::/48 -2a03:2880:f254::/48 -2a03:2880:f253::/48 -2a03:2880:f252::/48 -2a03:2880:f250::/48 -2a03:2880:f24f::/48 -2a03:2880:f24d::/48 -2a03:2880:f24e::/48 -2a03:2880:f24c::/48 -2a03:2880:f24b::/48 -2a03:2880:f24a::/48 -2a03:2880:f248::/48 -2a03:2880:f247::/48 -2a03:2880:f246::/48 -2a03:2880:f245::/48 -2a03:2880:f243::/48 -2a03:2880:f242::/48 -2a03:2880:f241::/48 -2a03:2880:f240::/48 -2a03:2880:f159::/48 -2a03:2880:f158::/48 -2a03:2880:f157::/48 -2a03:2880:f156::/48 -2a03:2880:f155::/48 -2a03:2880:f154::/48 -2a03:2880:f153::/48 -2a03:2880:f152::/48 -2a03:2880:f150::/48 -2a03:2880:f14f::/48 -2a03:2880:f14e::/48 -2a03:2880:f14d::/48 -2a03:2880:f14c::/48 -2a03:2880:f14b::/48 -2a03:2880:f14a::/48 -2a03:2880:f148::/48 -2a03:2880:f147::/48 -2a03:2880:f146::/48 -2a03:2880:f145::/48 -2a03:2880:f143::/48 -2a03:2880:f142::/48 -2a03:2880:f141::/48 -2a03:2880:f140::/48 -2a03:2880:f059::/48 -2a03:2880:f058::/48 -2a03:2880:f057::/48 -2a03:2880:f056::/48 -2a03:2880:f055::/48 -2a03:2880:f054::/48 -2a03:2880:f053::/48 -2a03:2880:f052::/48 -2a03:2880:f050::/48 -2a03:2880:f04f::/48 -2a03:2880:f04e::/48 -2a03:2880:ff0b::/48 -2a03:2880:ff0c::/48 -2a03:2880:f040::/48 -2a03:2880:f041::/48 -2a03:2880:f0fc::/48 -2a03:2880:f0fd::/48 -2a03:2880:f0fc::/47 -2a03:2880:f1fc::/48 -2a03:2880:f1fd::/48 -2a03:2880:f1fc::/47 -2a03:2880:ff08::/48 -2a03:2880:ff09::/48 -2a03:2880:ff0a::/48 -2a03:2880:f05e::/48 -2a03:2880:f15e::/48 -2a03:2880:f25e::/48 -2620:0:1cfa::/48 -2a03:2880:f05b::/48 -2a03:2880:f05a::/48 -2a03:2880:f25a::/48 -2a03:2880:f15c::/48 -2a03:2880:f000::/36 -2a03:2880:f05d::/48 -2a03:2880:f25c::/48 -2a03:2880:f05c::/48 -2a03:2880:f260::/48 -2a03:2880:f060::/48 -2a03:2880:f160::/48 -2a03:2880:f15d::/48 -2a03:2880:f25b::/48 -2a03:2880:f25d::/48 -2a03:2880:f15b::/48 -2a03:2880:f15a::/48 -2a03:2880:f161::/48 -2a03:2880:f061::/48 -2a03:2880:f261::/48 -2a03:2881::/32 -2a03:2881::/48 -2a03:2881:1::/48 -2a03:2881:2::/48 -2a03:2881:3::/48 -2a03:2880:f162::/48 -2a03:2880:f262::/48 -2a03:2881:4000::/48 -2a03:2881:4003::/48 -2a03:2881:4001::/48 -2a03:2881:4002::/48 -2a03:2880:f065::/48 -2a03:2880:f163::/48 -2a03:2880:f066::/48 -2a03:2880:f263::/48 -2a03:2880:f264::/48 -2a03:2880:f164::/48 -2a03:2880:f067::/48 -2a03:2880:f165::/48 -2a03:2880:f265::/48 -2a03:2880:f068::/48 -2a03:2881:4004::/48 -2a03:2880:f06a::/48 -2a03:2880:f266::/48 -2a03:2880:f166::/48 -2a03:2880:f267::/48 -2a03:2880:f06b::/48 -2a03:2880:f167::/48 -2a03:2881:4006::/48 -2a03:2881:7::/48 -2a03:2881:9::/48 -2a03:2881:8::/48 -2a03:2881:4::/48 -2a03:2881:6::/48 -2a03:2881:5::/48 -2a03:2881:a::/48 -2a03:2880:f268::/48 -2a03:2880:f06d::/48 -2a03:2880:f168::/48 -2a03:2881:b::/48 -2a03:2881:c::/48 -2a03:2881:4007::/48 -2a03:2880:f269::/48 -2a03:2880:f169::/48 -2a03:2880:f06f::/48 -2a03:2880:f26a::/48 -2a03:2880:f16a::/48 -2a03:2880:f070::/48 -2a03:2881:d::/48 -2a03:2881:e::/48 -2a03:2880:f071::/48 -2a03:2880:f16b::/48 -2a03:2880:f26b::/48 -2a03:2881:4008::/48 -2a03:2881:10::/48 -2a03:2881:f::/48 -2a03:2881:11::/48 -2a03:2880:f26c::/48 -2a03:2880:f16c::/48 -2a03:2880:f073::/48 -2a03:2880:f16d::/48 -2a03:2880:f074::/48 -2a03:2880:f26d::/48 -2a03:2881:4009::/48 -2a03:2880:f26e::/48 -2a03:2880:f16e::/48 -2a03:2880:f076::/48 -2a03:2880:f16f::/48 -2a03:2880:f26f::/48 -2a03:2880:f077::/48 -2a03:2881:12::/48 -2a03:2881:13::/48 -2a03:83e0::/32 \ No newline at end of file diff --git a/slips_files/organizations_info/facebook_asn b/slips_files/organizations_info/facebook_asn index 08267cd72..ff2761ef5 100644 --- a/slips_files/organizations_info/facebook_asn +++ b/slips_files/organizations_info/facebook_asn @@ -1,6 +1,8 @@ -AS63293 -AS54115 +AS149642 AS32934 -FACEBOOK, US +AS34825 +AS54115 +AS63293 FACEBOOK-CORP, US FACEBOOK-OFFNET, US +FACEBOOK, US diff --git a/slips_files/organizations_info/facebook_domains b/slips_files/organizations_info/facebook_domains index 0c141c821..2215092f2 100644 --- a/slips_files/organizations_info/facebook_domains +++ b/slips_files/organizations_info/facebook_domains @@ -1,1937 +1,3054 @@ +# +000.000.000.000.wxmpperis-myaccount-cdn.assetswa19.www.prod.onavo.com +000.000.000.wxmpperis-myaccount-cdn.assetswa19.www.prod.onavo.com +0000770-web5145-ww2web1512.oculusvr.com +000.oculusvr.com +0013000001jrghkaan.oculusvr.com +0030040c4174200001010900242032033479873.oculusvr.com +0030040c41dd201108230641469221062864649.oculusvr.com +0030040c428c200001020711177020928763996.oculusvr.com +00700751660276579156441475255357568992208643555445.oculusvr.com +007tianmuweijiduchangnv.snr.whatsapp.net +007zhenrenzhucesongcaijin.snr.whatsapp.net +007zhenrenzuixinwangzhi.snr.whatsapp.net +00bljjcay-ntp01stg.oculusvr.com +00fcec3a2286fc94d327-a7db8765bb1f4840401927a90eca7e54.ssl.cf2.snr.whatsapp.net +00p.m.me +0-100-wn.m.me +010193.oculusvr.com +011int.tlsa.good.test.snr.whatsapp.net +0-150.snr.whatsapp.net +0-168-234-61.m.me +01694703783956984565834127796782920233865633901457.oculusvr.com +0171.snr.whatsapp.net +0-177.oculusvr.com +018071.oculusvr.com +0-180.snr.whatsapp.net +018-nma-932.snr.whatsapp.net +019080.oculusvr.com +019-smtp-out-1.oculusvr.com +024189.oculusvr.com +029236.oculusvr.com +031198.oculusvr.com +03my-od-4.m.me +03wcbc860b91kxglpj3c-gy2tenzsgmydmob8.snr.whatsapp.net +03wcbc860b91kxglpj3c-gy5tenzsgmydmob-7.snr.whatsapp.net +046ef6ea1-guydsobygu4dmna.snr.whatsapp.net +047201010.fburl.com +0494758e005bc4fd4.oculusvr.com +04.m.me +04w02a298821kxglpj3c-ge4toojugeydsmrw3.snr.whatsapp.net +04w02a298821kxglpj3c-ge4toojugeydsmrw5.snr.whatsapp.net +04w02a298821kxglpj3c-ge8toojugeydsmrw-7.snr.whatsapp.net +04w35f5a0341kxglpj3c-giztgmbsga9dmmrt7.snr.whatsapp.net +04w8e1016481kxglpj3c-gi3dkmryha5dqnjq-0.snr.whatsapp.net +04wa3530c891kxglpj3c-gi4tsmzqgq1danzu-4.snr.whatsapp.net +0-6e.m.me +07jzk31.m.me +0-ak.oculusvr.com +0.alpha.oculus.com +0-art.m.me +0ba2014.oculusvr.com +0cb-if00hlzvu.snr.whatsapp.net +0.discoverapp.com +0.facebook.co.id +0.facebooklogin.com +0.lite.facebook.co.id +0n.m.me +0.oculusvr.com +0xax.oculusvr.com +0yt.snr.whatsapp.net +0z41y6j-m7c6sm8yptgpc4qbtliisb3.snr.whatsapp.net +10000000.fburl.com +10000.snr.whatsapp.net +1000.m.me +1080pmovies4u.fburl.com +10961-gi4tamryhaydmma.snr.whatsapp.net +11-128.oculusvr.com +112.oculusvr.com +121bc.oculusvr.com +122-221.fburl.com +13wcbc860b91kxglpj3c-gy3tenzsgmydmob.snr.whatsapp.net +13www.oculusvr.com +14045ive.oculusvr.com +141.wk.pl +148-72.oculusvr.com +149-112xford1ww.prod.onavo.com +14.wk.pl +15-52.fburl.com +157rsgfiy0ifuyn7mlxux0n.snr.whatsapp.net +15.react.dev +15-www.wk.pl +16dandomain-controllererfig-lab.alpha.oculus.com +16.facebook.co.id +16.react.dev +17617-enoannaw.voicestesting.com +17.facebook.co.jp +17.react.dev +17.snr.whatsapp.net +181utodiscover.oculusvr.com +182-248.oculusvr.com +187b572b-8f39-477c-8836-2324aea9bded.voicestesting.com +18.facebook.co.id +18.react.dev +194-66ww.www.prod.onavo.com +199-55.oculusvr.com +19.react.dev +19.wk.pl +1c9-ry8dx10qs8c6zz.snr.whatsapp.net +1.componentkit.org +1.facebook.co.id +1.facebook.co.za +1ffe8522s9ic35dihgi6lqw9-wpengine.fquestions.com +1-hezdeojxheydc.snr.whatsapp.net +1h.m.me +1ld4jd4id3gaa.fb.je +1.m.me +1m.m.me +1.oculusvr.com +1www.oculusvr.com +1zn0gdvch4h-dw53lkdr5-gol1kq3ao.westlaw.com.skyline.snr.whatsapp.net +2000.snr.whatsapp.net +2008.snr.whatsapp.net +2011-p.m.me +2012www.facebook.co.za +2013zhenqianqipaiyouxipaimingive.oculusvr.com +2014.facebook.co.jp +2016.www.facebook.co.id +2016-www.oculusvr.com +20-https-kendo-cdn-telerik-com.0.discoverapp.com +20www.facebook.co.nz +20www.facebook.co.za +222100.oculusvr.com +222.fburl.com +222.oculusvr.com +227.fburl.com +22e68.live.oculusvr.com +232.wk.pl +235-219.oculusvr.com +239-69.fburl.com +23eras.fburl.com +245-79.oculusvr.com +2475.thefacebook.at +25252525252525252525252525252525252525252525252525252525252fwww.m.me +252525252525252525252525252525252525252525252525252fwww.m.me +2525252525252525252525252525252525252525252525252fwww.m.me +252525252525252525252525252525252525252525252fwww.m.me +2525252525252525252525252525252525252525252fwww.m.me +252525252525252525252525252525252525252fwww.m.me +25252525252525252525252525252525252fwww.m.me +2525252525252525252525252525252fwww.m.me +25252525252525252525252525252fwww.m.me +2525252525252525252525252fwww.m.me +25252525252525252525252fwww.m.me +252525252525252525252fwww.m.me +2525252525252525252fwww.m.me +25252525252525252fwww.m.me +252525252525252fwww.m.me +25252525252fwww.m.me +252525252fwww.m.me +2525252fwww.m.me +25252fwww.m.me +252f96252rwrw.m.me +252fm.facebook.co.id +252fwww.m.me +25e32wwwhg8688com.fburl.com +261d3.m.me +26cb5.m.me +26qxqnzch.snr.whatsapp.net +27l.m.me +28.snr.whatsapp.net +28u1bud.snr.whatsapp.net +29-0963w180586ce1kwii2nfb-gm4dimjr.a9876543210zyxwvutsrqpo.snr.whatsapp.net +2939f.thefacebook.at +2a7dcl57jlir4d3wdkicuc5opfzsrjr.media.snr.whatsapp.net +2a.facebook.co.za +2a-f.facebookdownloader.com +2c6fdw.tdumcrm.www.prod.onavo.com +2.componentkit.org +2dji34im2kiwsz70g9f6-ndsm3fi637.snr.whatsapp.net +2dv-d-7-bg05008ze.facebook.co.jp +2ezwda88cc3b1kd6w3m7c-ge4dqnjygaztomjw.snr.whatsapp.net +2fbrazil.4.alperen-pc34.www.prod.onavo.com +2.fburl.com +2fdeveloper.oculusvr.com +2fforums.oculusvr.com +2fshare.oculusvr.com +2fstatic.oculusvr.com +2ftickets.oculusvr.com +2fwww.m.me +2k-0sql-c2vzn.snr.whatsapp.net +2ka.voicestesting.com +2.m.me +2phetalia.fburl.com +2share.oculusvr.com +2t5ziax.snr.whatsapp.net +2www.oculusvr.com +3001.snr.whatsapp.net +3-0-1.snr.whatsapp.net +32665.mobi +333c2-kencyomae-matsuya-com-owa19.www.prod.onavo.com +333.oculusvr.com +33t21b7jxzyowa1-6.www.prod.onavo.com +358066071810884.m.me +360-total-security.voicestesting.com +366voixdunord.facebook.co.za +379717.oculusvr.com +38196533190735927137964423708919839438185324823671.oculusvr.com +39957.fburl.com +3.componentkit.org +3dlook.atmeta.com +3dm.facebook.co.id +3dnmb2vtbqzfq.wk.pl +3fb.fb.je +3l.m.me +3mabu.facebook.co.za +3.m.me +3www.oculusvr.com +41f4mobile.facebook.co.jp +41we0b5ea6e1kxglpj3c-geydcnjsge4ta.snr.whatsapp.net +420bate.fburl.com +434dc.oculusvr.com +46.m.me +49d3fd84f5e5c1349fff27d70cbaa31e.oculusvr.com +4developers.wk.pl +4hy.pg.www.prod.onavo.com +4.m.me +4www.oculusvr.com +4xd.m.me +4z.m.me +51.wk.pl +5433849.facebookdownloader.com +56890383535182208573678454610900416387096568889079.oculusvr.com +5730602795925504-fe1.oculusvr.com +-574.prod.oculus.com +574.prod.oculus.com +5765606242516992-fe4.oculusvr.com +577a79ed5920d5000fe448ce.snr.whatsapp.net +580combers.oculusvr.com +5b5ce79f5c1a068825b2e7d0ad006ad5.play.ht +5bl.m.me +5fblive.oculusvr.com +5.m.me +5pabrazil2.www.prod.onavo.com +6134www.facebook.co.nz +63w168cf6891kxglpj3c-giydgmjqhe4tqma.snr.whatsapp.net +63w44416df61kxglpj3c-g4ytamrrg44dimb.snr.whatsapp.net +63w739187d31kxglpj3c-gmytenrxgy4tgoa.snr.whatsapp.net +63w81c538d31kxglpj3c-gq2tkojrgyztgnc.snr.whatsapp.net +63wa61f508c1kxglpj3c-gq4dgnzyg43tsnc.snr.whatsapp.net +63wc39887561kxglpj3c-heytsmrygy3dmnc.snr.whatsapp.net +63wca7d97ff1kxglpj3c-g44tqmbygu2tqmb.snr.whatsapp.net +6464www1.latest.fbaddins.com +66s7.m.me +66s.m.me +6szculusvr.com.oculusvr.com +6teen.voicestesting.com +6x.m.me +7293touraisyun.voicestesting.com +74w00d34b5b1kxglpj3c-gmztqojzgizdcmbt.snr.whatsapp.net +74w21dd32ec1kjvcqdla-geytgnbxgqztsmjs.snr.whatsapp.net +74w558d4dec1kxglpj3c-gi2tembxgu2dmmrq.snr.whatsapp.net +74wdedc91091kxglpj3c-gi2dknjqhe3daoby.snr.whatsapp.net +75.facebook.co.za +7c77ef5055f7277265c20f59aac797ef5acd5727.oculusvr.com +7d6.m.me +7.fburl.com +7hjautodiscover.oculusvr.com +7ufeb12822.owa1-6.www.prod.onavo.com +82c-oculusvr.com.oculusvr.com +89542.wk.pl +8ch.m.me +8.fburl.com +8.m.me +8t.m.me +957brazil-4.www.prod.onavo.com +97.m.me +98750c72.fburl.com +99.m.me +9br2-yy8-9-vk4vk.blog.nepowa2.www.prod.onavo.com +9.fburl.com +9.m.me +9y.m.me +a30762a1808d2933b0e48da8ea5f9b4a5.facebook.co.za +a55555.oculusvr.com +a841695758.beta.oculus.com +aaa.oculusvr.com +aadrm.m.me +aalborgmaskinudlejning.facebook.co.za +aa.m.me +aarextiaokhiao.voicestesting.com +aasbridal-87.fburl.com +aasbridal.fburl.com +ab1.oculusvr.com +abdominal.facebook.co.za +abogadossantacruz.fburl.com +abomhamed.fburl.com +about.f8.net +about.facebookblueprint.com +about.facebook.co.id +about.facebook.co.ir +about.facebook.co.jp +aboutfacebook.com +about.facebook.co.nz +about.facebook.co.th +about.facebook.co.za +about.facebookdownloader.com +about.facebooklogin.com +about.facebook.net.au +about.facebook.net.nz +about.facebook.net.pk +about.facebookproxy.com +about.fb.je +about.fbstack.com +about.fburl.com +about.fquestions.com +about.fquestions.net +about.fquestions.org +about.freeb6.com +about.lightbox.ch +about.meta.ae +about.metaenterprise.com +about.m.me +about.oculus.asia +about.oculus.blog +about.oculus.business +about.oculus.chat +about.oculus.cloud +about.oculus.fi +about.oculus.in +about.oculus.network +about.oculus.news +about.oculus.surgery +about.oculus.university +about.oculusvr.com +about.thefacebook.at +about.thefacebook.de +about.voicestesting.com +about.whatsapp.am +about.whatsapp.me.uk +about.whatsapp.tw +about.wk.pl +abrexplorer.fburl.com +academy.manus.im +acceptance-m.facebook.co.za +access.f8.net +access.facebookblueprint.com +access.facebook.co.id +access.facebook.co.ir +access.facebook.co.jp +access.facebook.co.nz +access.facebook.co.th +access.facebook.co.za +access.facebookdownloader.com +access.facebooklogin.com +access.facebook.net.au +access.facebook.net.nz +access.facebook.net.pk +access.facebookproxy.com +access.fb.je +access.fbstack.com +access.fburl.com +access.fquestions.com +access.fquestions.net +access.fquestions.org +access.freeb6.com +access.lightbox.ch +access.meta.ae +access.metaenterprise.com +access.m.me +access.oculus.asia +access.oculus.business +access.oculus.chat +access.oculus.fi +access.oculus.gmbh +access.oculus.in +access.oculus.surgery +access.oculus.university +access.oculusvr.com +access.thefacebook.at +access.thefacebook.de +access.voicestesting.com +access.whatsapp.co.uk +access.whatsapp.in +access.whatsapp.org.uk +access.whatsapp.tw +access.wk.pl +acclaimeventservices.fburl.com +acc-media.fbts1-1.fna.whatsapp.net +account.f8.net +account.facebookblueprint.com +account.facebook.co.id +account.facebook.co.ir +account.facebook.co.jp +account.facebook.co.nz +account.facebook.co.th +account.facebook.co.za +account.facebookdownloader.com +account.facebookenterprise.com +account.facebooklogin.com +account.facebook.net.au +account.facebook.net.nz +account.facebook.net.pk +account.facebookproxy.com +account-fallback.oculus.com +account-fallback.whatsapp.com +account.fb.je +account.fbstack.com +account.fburl.com +account.fquestions.com +account.fquestions.net +account.fquestions.org +account.freeb6.com +accounting.snr.whatsapp.net +accountkit.com +account.lightbox.ch +account.limitless.ai +account.meta.ae +account.metaenterprise.com +account.m.me +account.oculus.blog +account.oculus.business +account.oculus.chat +account.oculus.cloud +account.oculus.com +account.oculus.fi +account.oculus.gmbh +account.oculus.in +account.oculus.network +account.oculus.news +account.oculus.surgery +account.oculus.university +account.oculusvr.com +accounts.play.ai +account.thefacebook.at +account.thefacebook.de +account.voicestesting.com +account.whatsapp.am +account.whatsapp.com +account.whatsapp.co.uk +account.whatsapp.in +account.whatsapp.me.uk +account.whatsapp.org.uk +account.whatsapp.tw +account.wk.pl +acerra.fburl.com +acgcasereports.fburl.com +acltnk.prod.oculus.com +acme-group.m.me +acqprint.thefacebook.at +acs-fallback.whatsapp.com +acs.whatsapp.com +activeedge.fburl.com +activerain.facebook.co.za +addictinggames78.fburl.com +addins.whatsapp.com +a.developer.oculusvr.com +ad.f8.net +ad.facebookblueprint.com +ad.facebook.co.id +ad.facebook.co.ir +ad.facebook.co.jp +ad.facebook.co.nz +ad.facebook.co.th +ad.facebook.co.za +ad.facebookdownloader.com +ad.facebooklogin.com +ad.facebook.net.au +ad.facebook.net.nz +ad.facebook.net.pk +ad.facebookproxy.com +ad.fb.je +ad.fbstack.com +ad.fburl.com +ad.fquestions.com +ad.fquestions.net +ad.fquestions.org +ad.freeb6.com +ad.lightbox.ch +ad.meta.ae +ad.metaenterprise.com +admin1.montevallo.fburl.thefacebook.com +admin1-sncvpn03.fburl.thefacebook.com +admin1-wagner.fburl.thefacebook.com +admin3.facebook.co.jp +admin-center.api.metastatus.com +admin.developer.oculusvr.com +administrator-www.wk.pl +admin-kinetics-frati.delta-simplycommunities-logs.latest.oculus.com +admin.oculusvr.com +admissions.fburl.com +ad.m.me +adm.prod.onavo.com +ad.oculus.asia +ad.oculus.blog +ad.oculus.chat +ad.oculus.cloud +ad.oculus.fi +ad.oculus.gmbh +ad.oculus.in +ad.oculus.network +ad.oculus.news +ad.oculus.surgery +ad.oculus.university +ad.oculusvr.com +adsd.fburl.com +adserver.oculus.de +ads.f8.net +ads.facebookblueprint.com +ads.facebook.co.id +ads.facebook.co.ir +ads.facebook.co.jp +ads.facebook.co.nz +ads.facebook.co.th +ads.facebook.co.za +ads.facebookdownloader.com +ads.facebooklogin.com +ads.facebook.net.au +ads.facebook.net.nz +ads.facebook.net.pk +ads.facebookproxy.com +ads.fb.je +ads.fbstack.com +ads.fburl.com +ads.fquestions.com +ads.fquestions.net +ads.fquestions.org +ads.freeb6.com +adsgo-web.fquestions.com +adsl-240-200.wk.pl +ads.lightbox.ch +ads-manager.api.metastatus.com +ads.meta.ae +ads.metaenterprise.com +ads.m.me +ads.oculus.asia +ads.oculus.blog +ads.oculus.business +ads.oculus.chat +ads.oculus.cloud +ads.oculus.fi +ads.oculus.gmbh +ads.oculus.news +ads.oculus.surgery +ads.oculus.university +ads.oculusvr.com +ads.thefacebook.at +ads-transparency.api.metastatus.com +ads.voicestesting.com +ads.whatsapp.co.uk +ads.whatsapp.in +ads.whatsapp.info +ads.whatsapp.me.uk +ads.whatsapp.org.uk +ads.whatsapp.tw +ads.wk.pl +ad.thefacebook.at +advertiseonfacebook.co.uk +advertiseonfacebook.net +ad.voicestesting.com +ad.whatsapp.am +ad.whatsapp.co.uk +ad.whatsapp.in +ad.whatsapp.me.uk +ad.whatsapp.org.uk +ad.whatsapp.tw +ad.wk.pl +aesthetics-astro.fburl.com +aesthetika.fburl.com +africaunmasked.thefacebook.at +agar-io-unofficial.fburl.com +ag-arttravel.wk.pl +ahrenwarner.fburl.com +ai-assistant.facebook.co.za +aicxsummit.kustomer.com +aidemos.atmeta.com +aihabitat.org +airasiatraveloguemalaysia.facebook.co.jp +airkoryo.fburl.com +airs.voicestesting.com +ais.facebook.co.th +ait.fburl.com +aiyukiaikawaii.voicestesting.com +ajax.emails.oculusvr.com +akali.facebook.co.jp +akamai-developers.wk.pl +aktion.oculus.de +alaabayoumionline.fburl.com +albanywgl.oculusvr.com +albemarle-mlpui.fburl.com +alb-test.rivosinc.com +aleks-melnikov.fburl.com +ales-puan.fburl.com +alexisrain.oculusvr.com +alida.atmeta.com +alienworkshop.facebook.co.jp +alkatreszekmindenautohoz.oculusvr.com +allder13culusvr.com.oculusvr.com +alliantcreditunion3.voicestesting.com +allnature.oculusvr.com +allterrain.oculusvr.com +alpha.voicestesting.com +alpha.whatsapp.org +alpha-www.wk.pl +altajskaya-oblast.fburl.com +altereiche.fburl.com +alumnos.fburl.com +amandastewart.oculusvr.com +amankarios1.oculusvr.com +amecfw-usexternal.fburl.com +americasouthandnorth.fburl.com +ameyamissioncarmel.fburl.com +a.m.me +amouradistance.fquestions.com +amrau1101.oculusvr.com +ams501vpn01.thefacebook.com +ams501vpn02.thefacebook.com +ams501vpn03.thefacebook.com +ams501vpn.thefacebook.com +analyte.oculusvr.com +anapamix.m.me +anarchia.comwww.oculusvr.com +anatasyatamara.facebook.co.id +anderson.oculusvr.com +andover.oculusvr.com +andresfamily.fburl.com +androidsgames.fburl.com +androidwww.facebook.co.za +angelswing.fburl.com +angkatigabelas.voicestesting.com +angraszklo.wk.pl +aniakubica.fburl.com +animals.mo.m.me +animestyle.oculusvr.com +annsuchen.oculusvr.com +anonimnyi-obosnui.voicestesting.com +anothermask.facebook.co.za +anow.voicestesting.com +answerofgod.oculusvr.com +answers-fallback.oculus.com +answers.fburl.com +answers.oculus.com +answers.oculusvr.com +antispam.facebook.co.th +antitwilight.fburl.com +antivirus-booster-and-cleaner.facebookdownloader.com +antivirus-extension.fburl.com +antivirus-free.fquestions.com +antivirusinternet-security.facebook.co.nz +antivirus.oculusvr.com +antiviruspre.snr.whatsapp.net +anuies-tic.fburl.com +a.oculusvr.com +aodudals.fburl.com +aomenbaijialetouzhujiqiao.oculusvr.com +aomenwangshangduboyulecheng.thefacebook.at +aomori.fburl.com +aov-monitor.fburl.com +apache-cdn.whatsapp.org +apache.www.prod.onavo.com +apacinnovation.atmeta.com +aphroditekarageorgiou.fburl.com +api7eng3singedimapd.facebook.co.id +api-assets.kustomer.com +api.developer.oculusvr.com +api-docs-developers.wk.pl +apidocs.kustomer.com +api.esmatlas.com +api-export-staging.m.me +api.f8.net +api.facebookblueprint.com +api.facebook.co.id +api.facebook.co.ir +api.facebook.co.jp +api.facebook.co.nz +api.facebook.co.th +api.facebook.co.za +api.facebookdownloader.com +api.facebooklogin.com +api.facebook.net.au +api.facebook.net.nz +api.facebook.net.pk +api.facebookproxy.com +api-fallback.whatsapp.com +api-fast-internal.limitless.ai +api.fbcdn.com +api.fb.je +api.fbstack.com +api.fburl.com +api.fbwifi.com +api.fquestions.com +api.fquestions.org +api.freeb6.com +api-internal.limitless.ai +api-internal.wit.ai +api.lightbox.ch +api.limitless.ai +api.llama.com +api.manus.ai +api.manus.im +api.meta.ae +api.meta.ai +api.metaenterprise.com +api.metastatus.com +api.m.me +api.oculus.blog +api.oculus.business +api.oculus.chat +api.oculus.cloud +api.oculus.com +api.oculus.fi +api.oculus.gmbh +api.oculus.in +api.oculus.network +api.oculus.news +api.oculus.surgery +api.oculus.university +api.oculusvr.com +api.openbanking.paypalcredit.metaenterprise.com +api.parse.com +api.shows.play.ai +api.thefacebook.at +api.thefacebook.de +api-video.thefacebook.com +api.voicestesting.com +api.whatsapp.com +api.whatsapp.co.uk +api.whatsapp.in +api.whatsapp.info +api.whatsapp.me.uk +api.whatsapp.net +api.whatsapp.org.uk +api.whatsapp.tw +api.wit.ai +api.wk.pl +aplpha.whatsapp.org +apollo-mod.oculusvr.com +appalachiantreks.fburl.com +app.atlassolutions.com +app-builder.manus.im +appcdn.bigboxvr.com +app.developer.oculusvr.com +appeals.oversightboard.com +app.facebookblueprint.com +app.facebook.co.id +app.facebook.co.ir +app.facebook.co.jp +app.facebook.co.nz +app.facebook.co.th +app.facebook.co.za +app.facebookdownloader.com +app.facebooklogin.com +app.facebook.net.au +app.facebook.net.nz +app.facebook.net.pk +app.facebookproxy.com +app.fb.je +app.fbstack.com +app.fburl.com +app.fquestions.com +app.fquestions.net +app.fquestions.org +app.freeb6.com +apphy.fburl.com +applicant.fburl.com +app.lightbox.ch +app.limitless.ai +applink.manus.im +applink.meta.ai +applink.threads.net +app.meta.ae +app.metaenterprise.com +app.m.me +app.oculus.asia +app.oculus.blog +app.oculus.business +app.oculus.chat +app.oculus.fi +app.oculus.in +app.oculus.news +app.oculus.surgery +app.oculus.university +app.oculusvr.com +app.oculusvr.com.oculusvr.com +app.play.ht +apps.f8.net +apps.facebookblueprint.com +apps.facebook.co.id +apps.facebook.co.ir +apps.facebook.co.jp +apps.facebook.co.nz +apps.facebook.co.th +apps.facebook.co.za +apps.facebookdownloader.com +apps.facebooklogin.com +apps.facebookmail.com +apps.facebook.net.au +apps.facebook.net.nz +apps.facebook.net.pk +apps.facebookproxy.com +apps.fbcdn.com +apps.fb.je +apps.fbstack.com +apps.fburl.com +apps.fquestions.com +apps.fquestions.net +apps.fquestions.org +apps.freeb6.com +appsgratis.whatsapp.org +apps.lightbox.ch +apps.meta.ae +apps.metaenterprise.com +apps.m.me +apps.oculus.asia +apps.oculus.blog +apps.oculus.chat +apps.oculus.cloud +apps.oculus.fi +apps.oculus.in +apps.oculus.network +apps.oculus.news +apps.oculus.surgery +apps.oculusvr.com +apps.thefacebook.at +apps.thefacebook.com +apps.thefacebook.de +apps.voicestesting.com +apps.whatsapp.am +apps.whatsapp.in +apps.whatsapp.me.uk +apps.whatsapp.org.uk +apps.whatsapp.tw +apps.wk.pl +app.thefacebook.at +app.thefacebook.de +app.voicestesting.com +app.whatsapp.am +app.whatsapp.co.uk +app.whatsapp.in +app.whatsapp.info +app.whatsapp.me.uk +app.whatsapp.org +app.whatsapp.org.uk +app.whatsapp.tw +app.wk.pl +aprendecoreano-dianaru.voicestesting.com +aprendemoscompartilhandoexp.fburl.com +april-developers.wk.pl +aps.voicestesting.com +archive.ax.dev +archive.f8.net +archive.facebookblueprint.com +archive.facebook.co.ir +archive.facebook.co.nz +archive.facebook.co.th +archive.facebook.co.za +archive.facebookdownloader.com +archive.facebooklogin.com +archive.facebook.net.au +archive.facebook.net.nz +archive.facebook.net.pk +archive.facebookproxy.com +archive.fb.je +archive.fbstack.com +archive.fburl.com +archive.fquestions.com +archive.fquestions.net +archive.fquestions.org +archive.freeb6.com +archive.lightbox.ch +archive.meta.ae +archive.metaenterprise.com +archive.m.me +archive.oculus.asia +archive.oculus.blog +archive.oculus.chat +archive.oculus.cloud +archive.oculus.fi +archive.oculus.gmbh +archive.oculus.in +archive.oculus.network +archive.oculus.news +archive.oculus.surgery +archive.oculus.university +archive.oculusvr.com +archive.reactnative.dev +archive.thefacebook.at +archive.thefacebook.de +archive.voicestesting.com +archive.whatsapp.info +archive.whatsapp.org.uk +archive.whatsapp.tw +archive.wk.pl +archiv.oculusvr.com +ardurra-pw-ws.facebook.co.nz +areapersonal.voicestesting.com +arestapratiwi.facebook.co.id +ar.facebookbrand.com +argentinasinvacunas.facebookdownloader.com +argentinasinvacunas.facebook.net.au +armature.biz +armature.com +armature.net +armentia.fburl.com +arnaplnc05web.wk.pl +a.r.oculusvr.com +ar.oculusvr.com +aroma-freedom-academy.fburl.com +arraayahgo.voicestesting.com +ar.react.dev +arteehistoriaepci.fburl.com +artesanias.voicestesting.com +artesdavotita.fburl.com +articlesonlaw.fburl.com +arttravel-alpha-od.wk.pl +arvr-axpanel.atmeta.com +arvr-researchcommunity.atmeta.com +arvr-researchpanel.atmeta.com +ar.whatsapp.org +ar.y.g.m.me +asd16888.fburl.com +a-selectwww-8.prod.onavo.com +asem.fburl.com +aservice.oculus.de +ash-mulesoftrtprd.thefacebook.com +ash-mulesoftrtuat.thefacebook.com +ashvpn01.thefacebook.com +ashvpn02.thefacebook.com +ashvpn03.thefacebook.com +ashvpn04.thefacebook.com +ashvpn05.thefacebook.com +ashvpn06.thefacebook.com +ashvpn.thefacebook.com +askep-hrlz.voicestesting.com +askfacebook.net +askfacebook.org +ask.sthefanie.zamora.husen.on.facebook.co.id +assets.facebookblueprint.com +assets.facebook.co.id +assets.facebook.co.ir +assets.facebook.co.jp +assets.facebook.co.nz +assets.facebook.co.th +assets.facebook.co.za +assets.facebookdownloader.com +assets.facebooklogin.com +assets.facebook.net.au +assets.facebook.net.nz +assets.facebook.net.pk +assets.facebookproxy.com +assets.fb.je +assets.fbstack.com +assets.fburl.com +assets.fquestions.com +assets.fquestions.net +assets.fquestions.org +assets.freeb6.com +assets.hermesengine.dev +assetsincubator-sharepoint.m.me +assets.kustomer.com +assets.lightbox.ch +assets.meta.ae +assets.metaenterprise.com +assets.m.me +assets.oculus.asia +assets.oculus.blog +assets.oculus.business +assets.oculus.chat +assets.oculus.fi +assets.oculus.gmbh +assets.oculus.in +assets.oculus.news +assets.oculus.surgery +assets.oculus.university +assets.oculusvr.com +assets.thefacebook.at +assets.thefacebook.de +assets.voicestesting.com +assets.whatsapp.am +assets.whatsapp.co.uk +assets.whatsapp.info +assets.whatsapp.me.uk +assets.whatsapp.org.uk +assets.whatsapp.tw +assets.wk.pl +assist.oculusvr.com +assurance-animaux-nice.fburl.com +astat.wk.pl +as.whatsapp.org +atdeveloper.oculusvr.com +atdmt2.com +ateam.oculusvr.com +athena20265.fburl.com +atl51.oculusvr.com +atlanta.emails.oculusvr.com +atlas1point.com +atlasbyfacebook.com +atlasbyfacebook.co.uk +atlasbyfacebook.net +atlasbyfacebook.org +atlasin-stream.com +atlasinstreamvideo.com +atlassolutions.com +atlassolutions.com.au +atlassolutions.co.uk +atmeta.com +atmosphere.oculusvr.com +at-od-fallback.oculus.com +at-od.llama.com +at-od.oculus.com +atol5elastic.wk.pl +atol5.wk.pl +atol.wk.pl +atpg.fburl.com +atscaleconference.com +ats-mab.oculusvr.com +attiministeriali.oculusvr.com +atts-api2proms.facebook.co.th +audience-network.api.metastatus.com +audiobox.metademolab.com +audiocortex.atmeta.com +audiocraft.metademolab.com +audioengineering.wavegroup.com +audiopostproduction.wavegroup.com +audi-tt.fburl.com +aulavirtual2016.fburl.com +ausbildung.oculus.de +ausdrjapan07d.facebook.co.za +auth.alpha.oculus.com +auth.beta.oculus.com +auth.developer.beta.oculus.com +auth.eu-central-1-live.oculusvr.com +auth.f8.net +auth.facebookblueprint.com +auth.facebook.co.id +auth.facebook.co.ir +auth.facebook.co.jp +auth.facebook.co.nz +auth.facebook.co.th +auth.facebook.co.za +auth.facebookdownloader.com +auth.facebookenterprise.com +auth.facebooklogin.com +auth.facebook.net.au +auth.facebook.net.nz +auth.facebook.net.pk +auth.facebookproxy.com +auth-fallback.oculus.com +auth.fb.je +auth.fbstack.com +auth.fquestions.com +auth.fquestions.net +auth.fquestions.org +auth.freeb6.com +auth.latest.oculus.com +auth.lightbox.ch +auth.meta.ae +auth.metaenterprise.com +auth.m.me +auth.oculus.asia +auth.oculus.blog +auth.oculus.business +auth.oculus.cloud +auth.oculus.com +auth.oculus.de +auth.oculus.fi +auth.oculus.gmbh +auth.oculus.in +auth.oculus.network +auth.oculus.news +auth.oculus.surgery +auth.oculus.university +auth.oculusvr.com +auth.play.ai +auth.play.ht +auth.prod.oculus.com +auth.thefacebook.at +auth.thefacebook.de +auth.voicestesting.com +auth.whatsapp.am +auth.whatsapp.co.uk +auth.whatsapp.in +auth.whatsapp.info +auth.whatsapp.me.uk +auth.whatsapp.org.uk +auth.whatsapp.tw +auth.wk.pl +autoblachen.wk.pl +autoconfig.developer.oculusvr.com +autoconfig.facebook.co.id +autoconfig.facebook.co.jp +autodealcluj.fburl.com +autodiscover-66g.oculusvr.com +autodiscover.atscaleconference.com +autodiscover.ausbildung.oculus.de +autodiscoverb58.oculusvr.com +autodiscover.beatsaber.com +autodiscover-bess.oculusvr.com +autodiscover.blog.oculus.de +autodiscover.brasil.oculus.de +autodiscover-bshsky.oculusvr.com +autodiscover-clzlseowkd.oculusvr.com +autodiscover.crl2.oculus.de +autodiscover.crl.oculus.de +autodiscover.crm.oculus.de +autodiscover-designfx.oculusvr.com +autodiscover.developer.oculusvr.com +autodiscover-developerz7igateway-oculusvr.oculusvr.com +autodiscover.equimine-corp.oculusvr.com +autodiscover.expo-days.oculus.de +autodiscover.f8.com +autodiscover.f8.net +autodiscover.facebookblueprint.com +autodiscover.facebook.co.id +autodiscover.facebook.co.ir +autodiscover.facebook.co.jp +autodiscover.facebook.co.nz +autodiscover.facebook.co.th +autodiscover.facebook.co.za +autodiscover.facebookdownloader.com +autodiscover.facebooklogin.com +autodiscover.facebook.net.au +autodiscover.facebook.net.nz +autodiscover.facebook.net.pk +autodiscover.facebookproxy.com +autodiscoverfather.oculusvr.com +autodiscover.fb.je +autodiscover.fbstack.com +autodiscover.fburl.com +autodiscover.fquestions.com +autodiscover.fquestions.net +autodiscover.fquestions.org +autodiscover.freeb6.com +autodiscover-freeweb.oculusvr.com +autodiscoveriampartners.oculusvr.com +autodiscover.iol.oculus.de +autodiscover-ipaywakemedical1.oculusvr.com +autodiscover.lemnis.tech +autodiscover-lesbianlife.oculusvr.com +autodiscover.lightbox.ch +autodiscover.mail.oculus.de +autodiscover.meta.ae +autodiscover.metaenterprise.com +autodiscover-milf.oculusvr.com +autodiscover.m.me +autodiscover.msqrd.com +autodiscover.oculus.asia +autodiscover.oculus.blog +autodiscover.oculus.business +autodiscover.oculus.chat +autodiscover.oculus.com +autodiscover.oculus.fi +autodiscover.oculus.gmbh +autodiscover.oculus.hk +autodiscover.oculus.in +autodiscover.oculus.info +autodiscover.oculus.network +autodiscover.oculus.news +autodiscover.oculus.surgery +autodiscover.oculus.university +autodiscover.oculusvr.com +autodiscover.online-show.oculus.de +autodiscover.oversightboard.com +autodiscoveroxfgsr02.oculusvr.com +autodiscover.readyatdawn.com +autodiscover.rfl.oculus.de +autodiscover.sanzaru.com +autodiscover-siphon.oculusvr.com +autodiscover.tel.oculus.de +autodiscover.termine.oculus.de +autodiscover.thefacebook.at +autodiscover.thefacebook.com +autodiscover.thefacebook.de +autodiscover.voicestesting.com +autodiscover-web13204.oculusvr.com +autodiscover-web3513.oculusvr.com +autodiscover.web6399.oculusvr.com +autodiscover.whatsapp.com +autodiscover.whatsapp.co.uk +autodiscover.whatsapp.in +autodiscover.whatsapp.info +autodiscover.whatsapp.me.uk +autodiscover.whatsapp.tw +autodiscover.wk.pl +autodiscoverwww-a.oculusvr.com +autodiscover-www.uag.oculusvr.com +autodiscovery.sheriff.wk.pl +autotempest.fburl.com +autowestrulate.voicestesting.com +aventurasnahistoria.voicestesting.com +a-vibe-positiva-solta-pelo-ar.voicestesting.com +awaji-mandai-jp.oculusvr.com +awakebrasil.thefacebook.at +awesomegames2664.fburl.com +aw.m.me +aww.oculusvr.com +ax.dev +axel.oculusvr.com +axian993.oculusvr.com +axis.facebook.co.id +ayo-sinau-ipa.voicestesting.com +azerice-turkce.fburl.com +azis49.facebook.co.id +azlanahmad55.fburl.com +az.react.dev +b1.oculusvr.com +b2b3-prod.oculusvr.com +b2b474bda57fdbc42d5bcdfd337eb31f.oculusvr.com +b2b-enotrwebdisk.facebook.co.za +b2btestadm.oculusvr.com +b5-info.facebook.co.jp +b7.oculusvr.com +baby-32-87.fburl.com +babybearmommy.fburl.com +baby-scool.fburl.com +backend.facebook.co.nz +backup1-9.oculusvr.com +backup.facebook.co.th +backupu6f2gkzw.m.me +badge.thefacebook.com +bahman.voicestesting.com +baijialemask.facebook.net.au +baijialeyulechengwangzhilive.oculusvr.com +baixinha-su.fburl.com +balletalert.voicestesting.com +banglanamazshikha.voicestesting.com +bangtanastrology.fburl.com +bankmp3.voicestesting.com +bapitzemburg.fburl.com +barbanguntidur.voicestesting.com +barbarella.fburl.com +barnettshaleexpo.fburl.com +bars.app +basic.fburl.com +bba.latest.fbaddins.com +bbc12inches4me.voicestesting.com +bbds.oculusvr.com +bbmsepsite.oculusvr.com +bbs.developer.oculusvr.com +bbs.facebook.co.th +bcho.voicestesting.com +bd77g99.39950761t.kustomer.com +b.developer.oculusvr.com +beanmachine.ai +beanmachine.org +beatsaber.com +beaver.clusto-pbr.oculusvr.com +bedhes5.oculusvr.com +ben-and-ed.fburl.com +benning-147-169-189-59.m.me +beratung.oculus.de +beritavideo4.fburl.com +bertorello.fburl.com +beskid.wk.pl +bestautopl.oculusvr.com +beta.developer.oculusvr.com +beta.f8.net +beta.facebookblueprint.com +beta.facebook.co.id +beta.facebook.co.ir +beta.facebook.co.jp +beta.facebook.co.nz +beta.facebook.co.th +beta.facebook.co.za +beta.facebookdownloader.com +betafacebook.info +beta.facebooklogin.com +beta.facebook.net.au +beta.facebook.net.nz +beta.facebook.net.pk +beta.facebookproxy.com +beta.fb.je +beta.fbstack.com +beta.fburl.com +beta.fquestions.com +beta.fquestions.net +beta.fquestions.org +beta.freeb6.com +beta.lightbox.ch +beta.meta.ae +beta.metaenterprise.com +beta.m.me +beta.oculus.blog +beta.oculus.business +beta.oculus.chat +beta.oculus.cloud +beta.oculus.fi +beta.oculus.in +beta.oculus.news +beta.oculus.surgery +beta.oculusvr.com +beta.thefacebook.at +beta.thefacebook.de +beta.voicestesting.com +beta.whatsapp.am +beta.whatsapp.co.uk +beta.whatsapp.in +beta.whatsapp.info +beta.whatsapp.me.uk +beta.whatsapp.org.uk +beta.whatsapp.tw +beta.wk.pl +b-fallback.whatsapp.com +b.fb.je +bg.react.dev +bgstack15.fburl.com +bhagavadgita-telugu.fburl.com +bhalobasharbrishti.oculusvr.com +biar.voicestesting.com +bibliothekbusbf.sch.sonder-gewerbegeb.greueltennispl.bolzpl.bolzpl.u.wk.pl +bibliotheque-numerique.thefacebook.at +biep.m.me +bigboxvr.com +bigtimebrother.fburl.com +billeradmin.fquestions.com +billing-developers.wk.pl +billing-www.wk.pl +biomaten.voicestesting.com +bistro.io +bizinfosystems-oculusvrlive.oculusvr.com +biz.oculusvr.com +blackdeath.facebook.co.za +black-mask1.freeb6.com +blackpeoplemoveforward.oculusvr.com +blackvirus.facebookdownloader.com +blinkist.latest.fbaddins.com +blockdmask.thefacebook.at +blog104.fburl.com +blog129.fburl.com +blog14.fburl.com +blog19.oculusvr.com +blog25.oculusvr.com +blog26.fburl.com +blog33.oculusvr.com +blog39.fburl.com +blog41.fburl.com +blog41.oculusvr.com +blog57.fburl.com +blog69.fburl.com +blog69.oculusvr.com +blog91.fburl.com +blog95.fburl.com +blog99.fburl.com +blog9.fburl.com +blog.developer.oculusvr.com +blogdoeduardoferreira.fburl.com +blog.endaga.com +blog.f8.net +blog.facebookblueprint.com +blog.facebook.co.id +blog.facebook.co.ir +blog.facebook.co.jp +blog.facebook.co.nz +blog.facebook.co.th +blog.facebook.co.za +blog.facebookdownloader.com +blog.facebooklogin.com +blog.facebook.net.au +blog.facebook.net.nz +blog.facebook.net.pk +blog.facebookproxy.com +blog-fallback.whatsapp.com +blog.fb.je +blog.fbstack.com +blog.fburl.com +blog.fquestions.com +blog.fquestions.net +blog.fquestions.org +blog.freeb6.com +bloggernossaturma.voicestesting.com +blog.lightbox.ch +blog.lightbox.com +blog.mapillary.com +blogmask.facebookdownloader.com +blog.meta.ae +blog.metaenterprise.com +blog.m.me +blog.oculus.business +blog.oculus.chat +blog.oculus.de +blog.oculus.fi +blog.oculus.in +blog.oculus.network +blog.oculus.news +blog.oculus.surgery +blog.oculusvr.com +blog.parse.com +blog.prod.oculus.com +blogs.fburl.com +blogs.oculusvr.com +blog.thefacebook.at +blog.thefacebook.de +blog.voicestesting.com +blog.whatsapp.com +blog.whatsapp.in +blog.whatsapp.info +blog.whatsapp.me.uk +blog.whatsapp.tw +blog.wk.pl +blooguy.fburl.com +bloomsbury.ai +bluerose1.fburl.com +bmall.voicestesting.com +b-m.facebook.co.id +b.m.me +bmmmunfcf.m.me +bmwofhawaii.fburl.com +bn.react.dev +board.facebook.co.jp +boards-developers.wk.pl +bog2014.fburl.com +bola.voicestesting.com +bolzpl.bolzpl.u.wk.pl +bolzpl.u.wk.pl +booking.oculusvr.com +boomerangfrominstagram.co +boomerangfrominstagram.com +boomerangfrominstagram.co.uk +boomerangfrominstagram.info +boomerangfrominstagram.jp +boomerangfrominstagram.me +boomerangfrominstagram.net +boomerangfrominstagram.org +boomerangfrominstagram.uk +botswanatourism.fburl.com +bounces.kustomer.com +bouquet.metademolab.com +box.facebook.co.th +boxmedia.ftlc1-1.fna.whatsapp.net +boyo.fburl.com +bpfilter.io +bpic.facebookdownloader.com +brasil-media.fhfa1-1.fna.whatsapp.net +brasil.oculus.de +brazil-0.mailwwworigin.prod.onavo.com +brazil-0.www.prod.onavo.com +brazil2.www.prod.onavo.com +brazil-4.www.prod.onavo.com +brazil5.www.prod.onavo.com +brazil.www.prod.onavo.com +brestskaya-oblast.oculusvr.com +brettandheidi.m.me +brightfield-dev.metaenterprise.com +br.oculusvr.com +brusky-prislusenstvi.fburl.com +bsr1000ive.oculusvr.com +bsr-files.facebook.co.za +btemptd.fburl.com +btfi.prod.fbaddins.com +bto.emails.oculusvr.com +btremotesupport-eu.thefacebook.com +btremotesupport.glbx.thefacebook.com +btremotesupport.thefacebook.com +btremotesupport-us.thefacebook.com +bu6s.oculusvr.com +buck2.build +buck.build +builder.developer.oculusvr.com +building8.fbthirdpartypixel.com +buildnumbers.fburl.com +bunbun.fburl.com +burberry42.oculusvr.com +buru.facebook.co.id +burytomorrow.fburl.com +busbf.sch.sonder-gewerbegeb.greueltennispl.bolzpl.bolzpl.u.wk.pl +business.alpha.oculus.com +business.apps.prod.beta.oculus.com +business.beta.oculus.com +business.business.alpha.oculus.com +business.business.business.alpha.oculus.com +business.business.cert.business.alpha.oculus.com +business.cert.business.alpha.oculus.com +business.facebookblueprint.com +business.facebook.co.id +business.facebook.co.ir +business.facebook.co.jp +business.facebook.co.nz +business.facebook.co.th +business.facebook.co.za +business.facebookdownloader.com +business.facebooklogin.com +business.facebook.net.au +business.facebook.net.nz +business.facebook.net.pk +business.facebookproxy.com +business-fallback.oculus.com +business.fb.je +business.fbstack.com +business.fburl.com +business.fquestions.com +business.fquestions.net +business.fquestions.org +business.freeb6.com +businessinsider.co.facebook.co.id +business.lightbox.ch +business.meta.ae +business.metaenterprise.com +business.m.me +business.oculus.blog +business.oculus.business +business.oculus.chat +business.oculus.com +business.oculus.fi +business.oculus.gmbh +business.oculus.in +business.oculus.news +business.oculus.university +business.oculusvr.com +businesspoint.fburl.com +business.prod.oculus.com +business.support.latest.oculus.com +business.thefacebook.at +business.thefacebook.de +business.voicestesting.com +business-w6.facebook.co.jp +business.whatsapp.am +business.whatsapp.com +Business.whatsapp.com +business.whatsapp.co.uk +business.whatsapp.info +business.whatsapp.me.uk +business.whatsapp.org.uk +business.wk.pl +bussshess.bussshess.alpha.oculus.com +butelkowy.oculusvr.com +butterflysoup.fburl.com +buy.facebookblueprint.com +buy.facebook.co.id +buy.facebook.co.ir +buy.facebook.co.jp +buy.facebook.co.nz +buy.facebook.co.th +buy.facebook.co.za +buy.facebookdownloader.com +buy.facebooklogin.com +buy.facebook.net.au +buy.facebook.net.nz +buy.facebook.net.pk +buy.facebookproxy.com +buy.fb.je +buy.fbstack.com +buy.fburl.com +buy.fquestions.com +buy.fquestions.net +buy.fquestions.org +buy.freeb6.com +buy.ig.me +buy.lightbox.ch +buy.meta.ae +buy.metaenterprise.com +buy.m.me +buy.oculus.asia +buy.oculus.blog +buy.oculus.business +buy.oculus.chat +buy.oculus.fi +buy.oculus.gmbh +buy.oculus.in +buy.oculus.network +buy.oculus.news +buy.oculus.surgery +buy.oculus.university +buy.oculusvr.com +buy.thefacebook.at +buy.thefacebook.de +buy.voicestesting.com +buy.whatsapp.am +buy.whatsapp.co.uk +buy.whatsapp.in +buy.whatsapp.info +buy.whatsapp.me.uk +buy.whatsapp.tw +buy.wk.pl +b.whatsapp.com +byanu.fburl.com +c2b08-123.fburl.com +c3.m.me +c64406.webpaypaymentgateway.fburl.com +c719-71-22.fburl.com +c7noticiasentretenimento.fburl.com +cable-106-121.wk.pl +cable-119-204.wk.pl +cachelib.com +cachelib.org +cache.oculusvr.com +cadernosdedanca.fburl.com +ca-es.developers.prod.oculus.com +caes-e-cia.m.me +ca.facebook.co.za +cah.m.me +calendar.camouflaj.com +calendar.facebookblueprint.com +calendar.facebook.co.id +calendar.facebook.co.jp +calendar.facebook.co.nz +calendar.facebook.co.th +calendar.facebook.co.za +calendar.facebookdownloader.com +calendar.facebooklogin.com +calendar.facebook.net.au +calendar.facebook.net.nz +calendar.facebook.net.pk +calendar.fb.je +calendar.fbstack.com +calendar.fburl.com +calendar.fquestions.com +calendar.fquestions.net +calendar.fquestions.org +calendar.freeb6.com +calendario.oculusvr.com +calendariopodismoveneto.fburl.com +calendar.kustomer.com +calendar.meta.ae +calendar.metaenterprise.com +calendar.m.me +calendar.oculus.blog +calendar.oculus.business +calendar.oculus.chat +calendar.oculus.fi +calendar.oculus.gmbh +calendar.oculus.in +calendar.oculus.network +calendar.oculus.news +calendar.oculusvr.com +calendar.sonicsinc.com +calendar.sonicsinc.net +calendar.thefacebook.at +calendar.thefacebook.de +calendar.twistedpixelgames.com +calendar.voicestesting.com +calendar.whatsapp.am +calendar.whatsapp.in +calendar.whatsapp.info +calendar.whatsapp.me.uk +calendar.whatsapp.org.uk +calendar.wk.pl +calibra.com +call-fallback.whatsapp.com +call.whatsapp.com +calrecycle.wk.pl +camouflaj.com +campaigntoolkit-dev.wk.pl +campinggoing.fburl.com +campus.wk.pl +candea.voicestesting.com +canosa-di-puglia.oculusvr.com +cantonstore.oculusvr.com +ca.oculus.de +cardiologist.m.me +cardiovascular.voicestesting.com +card.voicestesting.com +ca.react.dev +careeradvancement.oculusvr.com +career.freeb6.com +careers-ads-pipe.oculusvr.com +careers-agencystaffcandidate.oculusvr.com +careers-cachecreek.oculusvr.com +careers-carecentrix.oculusvr.com +careers-care-one.oculusvr.com +careers-deanfoods.voicestesting.com +careers.developer.oculusvr.com +careers-ecpiuniversity.voicestesting.com +careersen-baffinland.oculusvr.com +careers-fallback.oculus.com +careers-meridianhealth.oculusvr.com +careers.oculus.com +careers.oculusvr.com +careers-perrysicecream.fburl.com +careers-perrysicecream.oculusvr.com +careers-sysmex.voicestesting.com +careers-tracintermodal.oculusvr.com +careers-us.oculusvr.com +careers-wonderfulcitrus.fburl.com +carefirstcareers.fburl.com +carl830.fburl.com +carrefourpedagogique.fburl.com +cartafan.voicestesting.com +cartov1.fburl.com +casitadelrose.fburl.com +catalog.api.metastatus.com +catalog.facebook.co.jp +cat.oculus.de +cat-partenaire.fburl.com +cattalyse.fburl.com +cb.fb.je +cbs-wac01.fburl.com +cbuf.facebook.co.jp +ccapfile.m.me +ccaportalcdd-bts2.wk.pl +ccoera.voicestesting.com +ccoronacv.facebookdownloader.com +ccpsa01profiles.fburl.thefacebook.com +cd5.wk.pl +c.developer.oculusvr.com +cdn.developer.oculusvr.com +cdn.facebook.co.id +cdn.facebook.co.ir +cdn.facebook.co.jp +cdn.facebook.co.nz +cdn.facebook.co.th +cdn.facebook.co.za +cdn.facebookdownloader.com +cdn.facebooklogin.com +cdn.facebook.net.au +cdn.facebook.net.nz +cdn.facebook.net.pk +cdn.facebookproxy.com +cdn.fb.je +cdn.fbstack.com +cdn.fburl.com +cdn.fquestions.com +cdn.fquestions.net +cdn.fquestions.org +cdn.freeb6.com +cdninstagram.com +cdninstagram.net +cdn.lightbox.ch +cdn.meta.ae +cdn.metaenterprise.com +cdn.m.me +cdn.oculus.asia +cdn.oculus.business +cdn.oculus.fi +cdn.oculus.gmbh +cdn.oculus.in +cdn.oculus.network +cdn.oculus.news +cdn.oculus.surgery +cdn.oculus.university +cdn.oculusvr.com +cdn.thefacebook.at +cdn.thefacebook.de +cdn.voicestesting.com +cdn.whatsapp.am +cdn.whatsapp.co.uk +cdn.whatsapp.in +cdn.whatsapp.org.uk +cdn.whatsapp.tw +cdn.wk.pl +cdpstatus.reactnative.dev +cechjedrzejow.wk.pl +cedars.fburl.com +celebsunmasked.facebook.co.nz +cemu.voicestesting.com +cenfi.oculusvr.com +centennial.fburl.com +centralny--kln.oculusvr.com +centros.voicestesting.com +cert.business.alpha.oculus.com +cert.oculusvr.com +cf5.oculusvr.com +c.fb.je +cfg.facebook.co.th +cfgs.fburl.com +cggk.oculusvr.com +cgsrmyy.m.me +changchihte61.fburl.com +charmedfrog.m.me +chat1a.oculusvr.com +chat.f8.net +chat.facebookblueprint.com +chat.facebook.co.id +chat.facebook.co.jp +chat.facebook.co.nz +chat.facebook.co.th +chat.facebookdownloader.com +chat.facebooklogin.com +chat.facebook.net.au +chat.facebook.net.nz +chat.facebook.net.pk +chat.facebookproxy.com +chat-fallback.whatsapp.com +chat.fb.je +chat.fbstack.com +chat.fburl.com +chat.fquestions.com +chat.fquestions.net +chat.fquestions.org +chat.freeb6.com +chat.lightbox.ch +chat.meta.ae +chat.metaenterprise.com +chat.m.me +chat.oculus.asia +chat.oculus.blog +chat.oculus.business +chat.oculus.chat +chat.oculus.fi +chat.oculus.in +chat.oculus.surgery +chat.oculus.university +chat.oculusvr.com +chat.thefacebook.at +chat.thefacebook.de +chat.usage.m.facebook.co.id +chat.voicestesting.com +chat.whatsapp.com +chat.whatsapp.co.uk +chat.whatsapp.in +chat.whatsapp.info +chat.whatsapp.tw +chat.wk.pl +chayut4299.oculusvr.com +checkout1.fbpaytesting.com +checkout2.fbpaytesting.com +checkout.atmeta.com +checkout.limitless.ai +chee2.oculusvr.com +chefclodaghmckenna.facebook.co.za +chere.m.me +cherylmark.fburl.com +chhs.oculusvr.com +chhs.voicestesting.com +chiayuenmeng.facebook.co.jp +chiayuenmengronald.facebook.co.jp +china.facebook.co.jp +chinaunicom2018.fburl.com +chrisw0915.fburl.com +chriswalton37.wk.pl +chungchingoaingutinhocnhanh.fburl.com +cicbforeclosure.fburl.com +cidirequisitos.voicestesting.com +cieah.oculusvr.com +ci.fidr1-1.fna.whatsapp.net +cinyourrc.facebook.co.id +cisco.facebook.co.nz +cis.m.me +citadel.fburl.com +citrix.developer.oculusvr.com +citrix.facebook.co.th +cityfarm.voicestesting.com +city.fburl.com +city-pantry-1.oculusvr.com +citytech.fburl.com +cividale7155.fburl.com +cj.m.me +claims.oculusvr.com +claire2215.fburl.com +clarium-global-ssl-fastly-net.0.discoverapp.com +classsearch.fburl.com +classtingsupport.oculusvr.com +classyvision.ai +clas.voicestesting.com +clcr.m.me +cle.fburl.com +clerk.play.ai +click.dev.oculusvr.com +click.facebook-research.facebookmail.com +click.frl-research.facebookmail.com +click.mc.facebookmail.com +clickwebmail.oculusvr.com +client.freeb6.com +client.m.me +cloudash.fburl.com +cloud.developer.oculusvr.com +cloud.dev.oculusvr.com +cloud.facebook-research.facebookmail.com +cloud.frl-research.facebookmail.com +cloudfront-developers.wk.pl +cloudfront.facebook.co.jp +cloud.mc.facebookmail.com +cloud.workplace-research.facebookmail.com +clover.fburl.com +clue.freeb6.com +clusto-pbr.oculusvr.com +cmd-bitmap.wk.pl +cm.fburl.com +c.m.me +cmn.oculusvr.com +cms.oculusvr.com +cms-sc1.facebook.co.za +cms-www.wk.pl +cname.developer.oculusvr.com +cnhrapida.fburl.com +coatzacoalcos.fburl.com +cocovida.fquestions.com +coelang.fburl.com +co.facebook.co.id +co.id-0.facebook.co.id +co.id.0.facebook.co.id +co.id.facebook.co.id +co.id-wap.facebook.co.id +coles.voicestesting.com +collabsvcs-esbint-prod-iscc.prod.oculus.com +colocoloabonos.intern.fbaddins.com +columbusga.fburl.com +com1.ab1.oculusvr.com +com252f0.facebook.co.id +com252fdaftar.facebook.co.id +com252fdns252fm.facebook.co.id +com252fdns252fpendaftaran.facebook.co.id +com252fm.facebook.co.id +com252fm.facebooklogin.com +com252fwww.facebook.co.id +com252fwww.facebook.co.nz +com252fwwww.facebook.co.id +com3789.oculusvr.com +comaomenbocaiyule.dev.platform.oculusvr.com +comaspect-dp-jp.oculusvr.com +combers.oculusvr.com +com-bimobject.oculusvr.oculusvr.com +com-blogg.dig.oculusvr.com +comcharmhtr9651.oculusvr.com +com.d56.oculusvr.com +comdmv.oculusvr.com +com-ehm.oculusvr.com +com.f8.net +com.facebookblueprint.com +com.facebook.co.id +com.facebook.co.ir +com.facebook.co.jp +com.facebook.co.nz +com.facebook.co.th +com.facebook.co.za +com.facebookdownloader.com +com.facebooklogin.com +com.facebook.net.au +com.facebook.net.nz +com.facebook.net.pk +com.facebookproxy.com +com.fb.je +com.fbstack.com +com.fburl.com +com-file5.oculusvr.com +com.fog.oculusvr.com +com.fquestions.com +com.fquestions.net +com.fquestions.org +com.freeb6.com +comgdtest-028.oculusvr.com +com-goodboy.oculusvr.com +com.htmlm.facebooklogin.com +comjia.oculusvr.com +com.lightbox.ch +commercepartnerhub.com +com.meta.ae +com.metaenterprise.com +comm.facebooklogin.com +comm.htmlm.facebook.co.za +com.m.me +communications.oversightboard.com +communityforums.atmeta.com +communityforums-stage.atmeta.com +com-mydiw.oculusvr.com +com.oculus.asia +com.oculus.blog +com.oculus.business +com.oculus.chat +com.oculus.cloud +com.oculus.fi +com.oculus.in +com.oculus.network +com.oculus.news +com.oculus.university +com.oculusvr.com +comoinvestir.fburl.com +compilergym.ai +compilergym-api.metademolab.com +compilergym.com +compilergym.metademolab.com +componentkit.org +computer-virus-verwijderen.facebookdownloader.com +com-rewards.zappos.oculusvr.com +com.rookiegirl2.oculusvr.com +coms4153a.oculusvr.com +comsazan.oculusvr.com +comsems.oculusvr.com +com-store-e1df9.oculusvr.com +com-sub-97-36-4.oculusvr.com +comt3p.oculusvr.com +com.taban.oculusvr.com +com.taex.oculusvr.com +comtest-column.oculusvr.com +com.thefacebook.at +com.thefacebook.de +comune.facebook.co.th +comune.oculus.fi +com.vendooreast.fburl.thefacebook.com +com-vmt.oculusvr.com +com.voicestesting.com +comweb3767.oculusvr.com +com.web3795.oculusvr.com +com.whatsapp.am +com.whatsapp.co.uk +com.whatsapp.in +com.whatsapp.me.uk +com.whatsapp.tw +com.wk.pl +comwww.facebook.co.id +comwww.facebook.co.za +comwww.mileycyrus.oculusvr.com +comwwww.facebook.co.za +conciliacions.fburl.com +concursoquimica.fburl.com +conf2024.react.dev +config.f8.net +config.facebookblueprint.com +config.facebook.co.id +config.facebook.co.jp +config.facebook.co.nz +config.facebook.co.th +config.facebook.co.za +config.facebookdownloader.com +config.facebooklogin.com +config.facebook.net.au +config.facebook.net.nz +config.facebook.net.pk +config.facebookproxy.com +config.fb.je +config.fbstack.com +config.fburl.com +config.fquestions.com +config.fquestions.net +config.fquestions.org +config.freeb6.com +config.lightbox.ch +config.meta.ae +config.metaenterprise.com +config.m.me +config.oculus.asia +config.oculus.blog +config.oculus.business +config.oculus.chat +config.oculus.cloud +config.oculus.fi +config.oculus.in +config.oculus.news +config.oculus.surgery +config.oculusvr.com +config.thefacebook.at +config.thefacebook.de +config.voicestesting.com +config.whatsapp.co.uk +config.whatsapp.in +config.whatsapp.info +config.whatsapp.me.uk +config.whatsapp.tw +config.wk.pl +confluence-developers.wk.pl +confluencedevelopers.wk.pl +conf.react.dev +connect.f8.net +connect.facebookblueprint.com +connect-facebook-cell.com +connect-facebook-cell.net +connect-facebook-cell.org +connect.facebook.co.id +connect.facebook.co.ir +connect.facebook.co.jp +connect.facebook.co.nz +connect.facebook.co.th +connect.facebook.co.za +connect.facebookdownloader.com +connect.facebooklogin.com +connect-facebook-mobile.com +connect-facebook-mobile.net +connect-facebook-mobile.org +connect.facebook.net.au +connect.facebook.net.nz +connect.facebook.net.pk +connect.facebookproxy.com +connect.fb.je +connect.fbstack.com +connect.fburl.com +connect.fquestions.com +connect.fquestions.net +connect.fquestions.org +connect.freeb6.com +connect.lightbox.ch +connect.meta.ae +connect.metaenterprise.com +connect.m.me +connect.oculus.asia +connect.oculus.chat +connect.oculus.cloud +connect.oculus.fi +connect.oculus.gmbh +connect.oculus.in +connect.oculus.network +connect.oculus.surgery +connect.oculus.university +connect.oculusvr.com +connect.thefacebook.at +connect.thefacebook.de +connect.voicestesting.com +connect.whatsapp.am +connect.whatsapp.me.uk +connect.whatsapp.org.uk +connect.whatsapp.tw +connect.wk.pl +consolle.voicestesting.com +constructionsgarybotelho.fburl.com +consumatori.voicestesting.com +content.atmeta.com +content.kustomer.com +contentsystems.wk.pl +conteudopublicitario.voicestesting.com +control.gamma.ap-southeast-4.chronicle.security.aws.metaenterprise.com +control.gamma.eu-central-1.chronicle.security.aws.metaenterprise.com +controllable-agent.metademolab.com +controlpanel.facebook.co.jp +conversations.atmeta.com +core.whatsapp.org +corona88.fquestions.com +coronaangelica.facebook.co.nz +coronacapital.facebookdownloader.com +corona-de-tucson.fquestions.com +corona-pad1.fquestions.com +corona-pad2.facebook.co.za +corona-pad4.thefacebook.at +coronavirus.facebook.co.za +coronax.facebookdownloader.com +corp.tiaabankvoices-com.ousaemichan1.oculusvr.com +corp.wk.pl +cortex.atmeta.com +cortex-uat.atmeta.com +cosmicvirus.thefacebook.at +costofveneers.wk.pl +cotentinghislaine.fburl.com +cottonwoodheights.fburl.com +country925.oculusvr.com +covd.thefacebook.at +covid.fquestions.com +cowboychicken.fburl.com +co.zawww.facebook.co.za +cpanel.developer.oculusvr.com +cpanel.m.me +cpanel.oculus.fi +cpanel.oculusvr.com +cpanel.wavegroup.com +cpcalendars.oculus.fi +cpcalendars.wavegroup.com +cpcontacts.wavegroup.com +cp.developer.oculusvr.com +cqq8.latest.fbaddins.com +crashlogs.whatsapp.net +create-react-app.dev +createwithmetaai.atmeta.com +creative-akl1-1.cdninstagram.com +creative-ams2-1.cdninstagram.com +creative-ams.cdninstagram.com +creative-arn.cdninstagram.com +creative-atl3-1.cdninstagram.com +creative-atl.cdninstagram.com +creative-bcn1-1.cdninstagram.com +creative-bcn.cdninstagram.com +creative-ber1-1.cdninstagram.com +creative-bom.cdninstagram.com +creative-bos5-1.cdninstagram.com +creative-bru2-1.cdninstagram.com +creative.cdninstagram.com +creative-cgk1-1.cdninstagram.com +creative-cgk1-2.cdninstagram.com +creative-cgk.cdninstagram.com +creative-cph2-1.cdninstagram.com +creative-cpt1-1.cdninstagram.com +creative-cpt.cdninstagram.com +creative-dfw5-1.cdninstagram.com +creative-dfw5-2.cdninstagram.com +creative-dfw.cdninstagram.com +creative-dub4-1.cdninstagram.com +creative-dub.cdninstagram.com +creative-dus1-1.cdninstagram.com +creative-dus.cdninstagram.com +creative-eze1-1.cdninstagram.com +creative-eze.cdninstagram.com +creative-fco.cdninstagram.com +creative-fra3-1.cdninstagram.com +creative-fra.cdninstagram.com +creative-gig.cdninstagram.com +creative-gmp1-1.cdninstagram.com +creative-gru1-1.cdninstagram.com +creative-gru1-2.cdninstagram.com +creative-gru2-1.cdninstagram.com +creative-gru2-2.cdninstagram.com +creative-gru.cdninstagram.com +creative-gua1-1.cdninstagram.com +creative-ham3-1.cdninstagram.com +creative-hbe1-1.cdninstagram.com +creative-hbe.cdninstagram.com +creative-hel3-1.cdninstagram.com +creative-hel.cdninstagram.com +creative-hkg4-1.cdninstagram.com +creative-hkg4-2.cdninstagram.com +creative-iad3-2.cdninstagram.com +creative-iad.cdninstagram.com +creative-ist1-1.cdninstagram.com +creative-itm.cdninstagram.com +creative-jnb.cdninstagram.com +creative-lax3-1.cdninstagram.com +creative-lax3-2.cdninstagram.com +creative-lax.cdninstagram.com +creative-lhr8-1.cdninstagram.com +creative-lhr8-2.cdninstagram.com +creative-lhr.cdninstagram.com +creative-lim1-1.cdninstagram.com +creative-lis1-1.cdninstagram.com +creative-maa.cdninstagram.com +creative-mad1-1.cdninstagram.com +creative-mad2-1.cdninstagram.com +creative-man2-1.cdninstagram.com +creative-mct1-1.cdninstagram.com +creative-mct.cdninstagram.com +creative-mia.cdninstagram.com +creative-mrs2-1.cdninstagram.com +creative-mrs2-2.cdninstagram.com +creative-msp1-1.cdninstagram.com +creative-msp.cdninstagram.com +creative-muc2-1.cdninstagram.com +creative-mxp1-1.cdninstagram.com +creative-mxp2-1.cdninstagram.com +creative-mxp.cdninstagram.com +creative-nrt1-1.cdninstagram.com +creative-nrt1-2.cdninstagram.com +creative-nrt.cdninstagram.com +creative-ord5-2.cdninstagram.com +creative-ord.cdninstagram.com +creative-otp1-1.cdninstagram.com +creative-otp.cdninstagram.com +creative-pmo1-1.cdninstagram.com +creative-prg1-1.cdninstagram.com +creative-scl.cdninstagram.com +creative-sea.cdninstagram.com +creative-sin6-1.cdninstagram.com +creative-sin6-2.cdninstagram.com +creative-sin6-3.cdninstagram.com +creative-sjc3-1.cdninstagram.com +creative-sjc.cdninstagram.com +creative-sof1-1.cdninstagram.com +creative-sof1-2.cdninstagram.com +creative-sof.cdninstagram.com +creative-ssn1-1.cdninstagram.com +creative-syd2-1.cdninstagram.com +creative-tpe1-1.cdninstagram.com +creative-vie.cdninstagram.com +creative-yyz1-1.cdninstagram.com +creative-yyz.cdninstagram.com +creative-zrh1-1.cdninstagram.com +creative-zrh.cdninstagram.com +creator.beta.oculus.com +creator.creator.creator.creator.pl-pl.ak.prod.oculus.com +creator.developer.prod.oculus.com +creator.developers.prod.oculus.com +creator-fallback.oculus.com +creator.ms-my.es-es.fr-fr.prod.oculus.com +creator.oculus.com +creator.prod.oculus.com +creators-fallback.oculus.com +creators.oculus.com +crew-autodiscover.oculusvr.com +crgstg3.facebook.co.jp +criatividadedenamorada.fburl.com +crl2.oculus.de +crl.oculus.de +crm.developer.oculusvr.com +crm.oculus.de +crm.www.prod.onavo.com +cs-cz.prod.oculus.com +csgautodiscover.oculusvr.com +csg.oculusvr.com +cs.oculusvr.com +css.facebook.co.th +ctx02.enpure.m.me +ctx.api.metastatus.com +cubabies.fburl.com +cujae.fburl.com +culturalsilos.wk.pl +curlybirds.oculusvr.com +current.docusaurus.io +cutenudebabes.beta.oculus.com +cut.oculus.de +cutonala.fburl.com +cvs5.wk.pl +c.whatsapp.org +cwkl.voicestesting.com +cxnow.kustomer.com +cyber.whatsapp.org +cycle-sports.fburl.com +cyhwyyx.oculusvr.com +cz.oculus.de +d1.wk.pl +d3.m.me +d56.oculusvr.com +dabar.oculusvr.com +dabbetularz-dogruislam.oculusvr.com +dacebook.com +da-dk.facebookbrand.com +da-dk.facebook.comwww.facebook.co.id +daftar.facebook.co.id +damnhescute.oculusvr.com +dancer-in-the-light.oculusvr.com +danganronpa-timeline.fburl.com +daphne910.voicestesting.com +dara.latest.fbaddins.com +dashboard.beta.oculus.com +dashboard.developer0-developer-1.beta.oculus.com +dashboard-fallback.oculus.com +dashboardgraph1.graph7.beta.oculus.com +dashboard.oculus.com +dashboard.prod.oculus.com +data-authadminjenkins.m.me +datacenters.atmeta.com +data-collection-and-reports.voicestesting.com +datamaskin.fquestions.com +dataset-api-sam2.metademolab.com +data-transparency.api.metastatus.com +dax2ddk.facebook.comwww.facebook.co.id +daxiyangguojiyulecheng.facebook.co.za +dayowong.facebook.co.jp +db1.oculusvr.com +dbadmin01collnet.oculusvr.com +dbhps01temp-6120culusvr.com.oculusvr.com +dbinfo.oculusvr.com +db-legends.fburl.com +dcp-marketing-solutions.m.me +dcsutodiscover.oculusvr.com +deadessays.oculusvr.com +dealerdatsunterbaik.oculusvr.com +deal.oculusvr.com +deary.jersey.facebook.co.id +deathspellomega.fburl.com +decoraciondemabel.voicestesting.com +de.developer.oculusvr.com +dedmaxopka.fburl.com +deegree.facebookdownloader.com +deepak-sharma.fburl.com +dee.voicestesting.com +de.facebookbrand.com +de.facebook.co.jp +deletev9redirectvirus.facebook.co.nz +delta-simplycommunities-logs.latest.oculus.com +demi.oculusvr.com +demo.developer.oculusvr.com +demo.oculusvr.com +demotest.m.me +demo-www.wk.pl +denangelaprivitan.fburl.com +de.oculus.de +de.react.dev +descargalamega.voicestesting.com +design8883.oculusvr.com.oculusvr.com +desk123.voicestesting.com +de.thefacebook.com +detroitsgoodbreed.fburl.com +dev0.facebook.co.jp +dev1www.wk.pl +dev.account.limitless.ai +devadx.thefacebook.at +dev.aidemos.atmeta.com +dev.api-fast-internal.limitless.ai +dev.api-internal.limitless.ai +dev.api.limitless.ai +devapi.oculus.fi +dev.app.limitless.ai +dev.buck.build +dev.developer.oculusvr.com +dev.developers.limitless.ai +devdevelopers.wk.pl +developer0-developer-1.beta.oculus.com +developer-1.beta.oculus.com +developer2.beta.oculus.com +developer-admin.oculusvr.com +developer.alpha.oculus.com +developer.beta.oculus.com +developer.business.apps.prod.beta.oculus.com +developer.business.support.alpha.oculus.com +developer.creator.business.latest.oculus.com +developer.developer.latest.oculus.com +developer.developer.mn-mn.apps.prod.oculus.com +developerdevelopers.wk.pl +developer.facebookblueprint.com +developer.facebook.co.id +developer.facebook.co.ir +developer.facebook.co.jp +developer.facebook.co.nz +developer.facebook.co.th +developer.facebook.co.za +developer.facebookdownloader.com +developer.facebookenterprise.com +developer.facebooklogin.com +developer.facebook.net.au +developer.facebook.net.nz +developer.facebook.net.pk +developer.facebookproxy.com +developer.fa-ir.developers.prod.oculus.com +developer-fallback.oculus.com +developer.fb.je +developer.fbstack.com +developer.fburl.com +developer.fquestions.com +developer.fquestions.net +developer.fquestions.org +developer.freeb6.com +developer.kustomer.com +developer.latest.oculus.com +developer.lightbox.ch +developermail-125-10.wk.pl +developer.meta.ae +developer.metaenterprise.com +developer.m.me +developer.o.beta.oculus.com +developer.oculus.asia +developer.oculus.blog +developer.oculus.business +developer.oculus.chat +developer.oculus.cloud +developer.oculus.com +developer.oculus.fi +developer.oculus.gmbh +developer.oculus.in +developer.oculus.news +developer.oculus.surgery +developer.oculus.university +developer.oculusvr.com +developer.prod.oculus.com +developersaccounts.wk.pl +developers-alt.wk.pl +developersanalytics.wk.pl +developers-app.wk.pl +developersapril.wk.pl +developersauth.wk.pl +developersaws.wk.pl +developersbox.wk.pl +developerscms1.wk.pl +developers-cms.wk.pl +developerscms.wk.pl +developerscom.wk.pl +developers-data.wk.pl +developers-dec.wk.pl +developers-dev.wk.pl +developers-docs.wk.pl +developerselb.wk.pl +developersemail.wk.pl +developersengineering.wk.pl +developerservices.fburl.com +developers-europe.wk.pl +developersevelynn.wk.pl +developers.f8.net +developers.facebookblueprint.com +developers.facebook.co.id +developers.facebook.co.ir +developers.facebook.co.jp +developers.facebook.co.nz +developers.facebook.co.th +developers.facebook.co.za +developers.facebookdownloader.com +developers.facebooklogin.com +developers.facebook.net.au +developers.facebook.net.nz +developers.facebook.net.pk +developers.facebookproxy.com +developers-fallback.oculus.com +developers.fb.je +developers.fbstack.com +developers.fburl.com +developers-forum.wk.pl +developers.fquestions.com +developers.fquestions.net +developers.fquestions.org +developers.freeb6.com +developers-fw.wk.pl +developers-hkg.wk.pl +developershkg.wk.pl +developershwcdn.wk.pl +developers-hw.wk.pl +developers-ids.wk.pl +developers-korea.wk.pl +developers-kor.wk.pl +developers-k.wk.pl +developersk.wk.pl +developers-lax1.wk.pl +developers.lightbox.ch +developers.limitless.ai +developers-login.wk.pl +developersmarch.wk.pl +developers.mazbud.wk.pl +developers.meta.ae +developers.metaenterprise.com +developers.m.me +developers-m.wk.pl +developers-netherlands.wk.pl +developers-nov.wk.pl +developers.oculus.asia +developers.oculus.blog +developers.oculus.business +developers.oculus.com +developers.oculus.fi +developers.oculus.gmbh +developers.oculus.in +developers.oculus.surgery +developers.oculus.university +developers.oculusvr.com +developers-origin.wk.pl +developersorigin.wk.pl +developers-pl.wk.pl +developers-poland.wk.pl +developers-priv.wk.pl +developerspriv.wk.pl +developers.prod.oculus.com +developers-profiles.wk.pl +developersprofile.wk.pl +developers-promotion.wk.pl +developers-p.wk.pl +developers-redirector.wk.pl +developersrestricted.wk.pl +developers-restrict.wk.pl +developersrestrict.wk.pl +developerss3.wk.pl +developerssearch.wk.pl +developers-sept.wk.pl +developersservice.wk.pl +developers-stage.wk.pl +developers.staladam.wk.pl +developersswagger.wk.pl +developers-team.wk.pl +developerstesting1.wk.pl +developers.thefacebook.at +developers.thefacebook.de +developer.support.support.beta.oculus.com +developer.support.support.business.alpha.oculus.com +developer.support.support.support.beta.oculus.com +developers-vi.wk.pl +developers.voicestesting.com +developers-v.wk.pl +developers-w3.wk.pl +developers-web.wk.pl +developers.whatsapp.am +developers.whatsapp.co.uk +developers.whatsapp.in +developers.whatsapp.info +developers.whatsapp.me.uk +developers.whatsapp.org.uk +developers.whatsapp.tw +developers.wk.pl +developersw.wk.pl +developer.ta-in.developers.prod.oculus.com +developer.thefacebook.at +developer.thefacebook.de +developer.voicestesting.com +developer.whatsapp.am +developer.whatsapp.co.uk +developer.whatsapp.in +developer.whatsapp.org.uk +developer.whatsapp.tw +developer.wk.pl +developerwww.wk.pl +developer.zh-cn.latest.oculus.com +development.fburl.com +develop.oculusvr.com +dev.f8.net +dev.facebookblueprint.com +dev.facebook.co.th +dev.fbe2e.com +dev.fb.je +dev.fbstack.com +dev.fburl.com +dev.freeb6.com +devgreenpages.oculusvr.com +device1251482-03874849-local.oculusvr.com +device1314464-11096885.wk.pl +device1315513-6d3299b8-local.wk.pl +device1333604-e18ee59e.oculusvr.com +device1362748-f59d888f.wk.pl +device1399786-2bb0d411-local.wk.pl +device1400088-1ae6a121.m.me +device1457426-1519cc03.wk.pl +device1502461-40852034-local.m.me +device1517857-1aa6b4d5-local.m.me +device1649339-a40c880a-local.wk.pl +device1729256-5221301d.wk.pl +device1802618-a617c995-local.oculusvr.com +device1848664-d513474c-local.wk.pl +device1853705-1eb307a9.oculusvr.com +device1856826-6d9e668e.oculusvr.com +device1887489-c2a0dfbe-local.m.me +device1941137-bbc7337c.oculusvr.com +device1953274-01b2d789.oculusvr.com +device1962730-0bee6e41.m.me +device1991512-3c68649d-local.oculusvr.com +device2169518-8bf9005c.wk.pl +device2174476-eead6be2-local.wk.pl +device2210830-586d28e5.fburl.com +device2250516-57de116b.oculusvr.com +device2252816-03b46a52.oculusvr.com +device2344391-c896432c.wk.pl +device2356242-63d5734f-local.wk.pl +device2357368-c1f54842-local.wk.pl +device2375552-0a5b7284-local.wk.pl +device2376642-7440e67d-local.wk.pl +device2377123-fc5387d8.wk.pl +device2380391-a27e12ad-local.wk.pl +device2381277-de5b07f4.wk.pl +device2386795-54c18171-local.wk.pl +device2399748-42c95b79.fburl.com +device2401797-c0d7b37e.wk.pl +device2414467-c51427ab-local.wk.pl +device2420774-a2824787.wk.pl +device2425580-657476c3.wk.pl +device2432049-1bb68f20.wk.pl +device2434670-2eacc0d1.wk.pl +device2437717-0a75e450.wk.pl +device2443868-c221c2e3.wk.pl +device2446051-b2b0eabd-local.wk.pl +device2454089-7c17fba5-local.wk.pl +device2456454-3936b6d4-local.wk.pl +device2458320-175c8fef-local.wk.pl +device2467568-84514439.wk.pl +device2476692-cc75f79f.fburl.com +device2493777-44d2cb55.wk.pl +device2500950-1d0375f4-local.wk.pl +device2507374-ce9ae285-local.wk.pl +device2515668-8a81bc6b.oculusvr.com +device2523166-0b75e561-local.m.me +device2562853-2f9e0dd3-local.wk.pl +device2575270-294ae780-local.wk.pl +device2576596-84971865-local.wk.pl +device2586832-d70812f2-local.wk.pl +device2587795-4279d394.wk.pl +device2594110-61211488.wk.pl +device2594854-9daf98fd-local.wk.pl +device2605338-f539b34b.wk.pl +device2605810-bfcafd45.wk.pl +device2615012-fd612cd1.wk.pl +device2622280-4b6911d6.wk.pl +device2627864-52a07bb9-local.wk.pl +device2628572-53806ce3-local.wk.pl +device2628643-4572e897.wk.pl +device2629090-fc7ca8d1.wk.pl +device2633832-5b1cbe2a-local.wk.pl +device2635187-ab592be1-local.wk.pl +device2640366-3bc3cd00.wk.pl +device2651210-ec77a2fc.wk.pl +device2652393-24367545.wk.pl +device2664736-6e53c39b.wk.pl +device2679189-476f7300.wk.pl +device2695877-bf704294.wk.pl +device2787108-0feadfdd-local.wk.pl +device2789758-4c842d97.wk.pl +device2796530-cb3b8dca.wk.pl +device2819636-93490c45-local.wk.pl +device2827712-caad533f-local.wk.pl +device2868249-6fec0e09.fburl.com +device2900659-23562f85.wk.pl +device2907289-bc93696c-local.wk.pl +device2919890-5c83c2fc.oculusvr.com +device2938573-c6b2ffc5-local.wk.pl +device2946941-802bba96-local.fburl.com +device2948770-527d5d3d-local.wk.pl +device2959618-ede8245e.m.me +device2960148-590852aa-local.m.me +device2962307-ab01b889.oculusvr.com +device2963450-18e6496e-local.wk.pl +device2964307-f889b78e-fo.wk.pl +device2964307-f889b78e.wk.pl +device2965608-020b5353.oculusvr.com +device3009356-3d73b223.wk.pl +device3011202-e6c1587c-local.wk.pl +device3013749-6996f0f8-local.wk.pl +device3014757-f86e9c87.wk.pl +device3023853-18d11f1a.wk.pl +device3024060-0602b232-local.wk.pl +device3049286-1573b265.wk.pl +device3049364-abfb2590-local.wk.pl +device3054597-26d2413d.wk.pl +device3070304-953e249c-local.wk.pl +device3101517-9f97c668-local.wk.pl +device3109019-8455c599.oculusvr.com +device3123870-08072649-local.wk.pl +device3185894-ca43bad9.m.me +device3191229-8b480b8c-local.wk.pl +device3211104-5c8eaa8d.fburl.com +device3254503-e32d3619.oculusvr.com +device987709-193b02ff-local.fburl.com +dev.kustomer.com +dev.lightbox.ch +dev.limitless.ai +devloper.oculusvr.com +dev-masks.facebookdownloader.com +dev.meta.ae +dev.m.me +dev.oculus.asia +dev.oculus.chat +dev.oculus.cloud +dev.oculus.fi +dev.oculus.gmbh +dev.oculus.in +dev.oculus.network +dev.oculus.news +dev.oculus.surgery +dev.oculus.university +dev.reachtheworldonfacebook.com +dev.vad-api-internal.limitless.ai +dev.voicestesting.com +dev-web-fallback.whatsapp.com +dev-web.whatsapp.com +dev.whatsapp.co.uk +dev.whatsapp.in +dev.whatsapp.info +dev.whatsapp.me.uk +dev.whatsapp.org +dev.whatsapp.org.uk +dev.whatsapp.tw +dev.wk.pl +devworld7.facebook.co.jp +d.facebook.co.id +d.facebook.co.za +d.fb.je +dffm.oculusvr.com +dfw3.oculusvr.com +dgfip.fburl.com +dhcp-178-213.m.me +dhcp-33-144.wk.pl +dhcp.oculusvr.com +dhs.fburl.com +diablerieive.oculusvr.com +dialin.m.me +dialin.oculusvr.com +dic.voicestesting.com +dieuduturf.oculusvr.com +digi.m.me +digitalsecurity.atmeta.com +dig.oculusvr.com +dima.fburl.com +dinaapriliawati40ymail.com.facebook.co.id +dina.fburl.com +dinamico-123-151.wk.pl +dino.dev.metademolab.com +dinov2.metademolab.com +dinov3.metademolab.com +dirkyo0224.fburl.com +dir.oculusvr.com +discoverapp.com +disiliskiler.fburl.com +diskmaskinen.thefacebook.at +distancelearning.thefacebook.at +distancesdiscreet.fquestions.com +distrito-federal2.fburl.com +dit.whatsapp.net +diversitutti.fburl.com +divingmask.thefacebook.at +diyhandmadecraft.fburl.com +djka.fburl.com +dkonrmvpwgvafhugmxcp.m.me +dkxmvlf115.oculusvr.com.oculusvr.com +dl0.fburl.com +dl2.hhvm.com +dl.fbaipublicfiles.com +dl.fburl.com +dl.hhvm.com +dlw134-2.thefacebook.at +dlw210-1-autodiscover.oculusvr.com +_dmarc.developer.oculusvr.com +d.m.me +dmxx.oculusvr.com +dmz.facebook.co.jp +dmz.m.me +dnm.developer.oculusvr.com +dns192.oculusvr.com +dns1.developer.oculusvr.com +dns2.developer.oculusvr.com +dns.developer.oculusvr.com +dns.facebookblueprint.com +dns.facebook.co.id +dns.facebook.co.ir +dns.facebook.co.jp +dns.facebook.co.nz +dns.facebook.co.th +dns.facebook.co.za +dns.facebookdownloader.com +dns.facebooklogin.com +dns.facebook.net.au +dns.facebook.net.nz +dns.facebook.net.pk +dns.facebookproxy.com +dns.fb.je +dns.fbstack.com +dns.fburl.com +dns.fquestions.com +dns.fquestions.net +dns.fquestions.org +dns.freeb6.com +dns.lightbox.ch +dns.meta.ae +dns.metaenterprise.com +dns.oculus.asia +dns.oculus.blog +dns.oculus.business +dns.oculus.chat +dns.oculus.cloud +dns.oculus.fi +dns.oculus.gmbh +dns.oculus.in +dns.oculus.news +dns.oculusvr.com +dns.thefacebook.at +dns.thefacebook.de +dns.voicestesting.com +dns.whatsapp.am +dns.whatsapp.in +dns.whatsapp.info +dns.whatsapp.me.uk +dns.whatsapp.org +dns.whatsapp.org.uk +dns.whatsapp.tw +dns.wk.pl +docbox.voicestesting.com +docker.developer.oculusvr.com +docs.f8.net +docs.facebookblueprint.com +docs.facebook.co.id +docs.facebook.co.ir +docs.facebook.co.jp +docs.facebook.co.nz +docs.facebook.co.th +docs.facebook.co.za +docs.facebookdownloader.com +docs.facebooklogin.com +docs.facebook.net.au +docs.facebook.net.nz +docs.facebook.net.pk +docs.facebookproxy.com +docs.fb.je +docs.fbstack.com +docs.fburl.com +docs.fquestions.com +docs.fquestions.net +docs.fquestions.org +docs.freeb6.com +docs.hhvm.com +docs.kustomer.com +docs.lightbox.ch +docs.meta.ae +docs.metaenterprise.com +docs.m.me +docsnew.hhvm.com +docs.oculus.blog +docs.oculus.business +docs.oculus.chat +docs.oculus.cloud +docs.oculus.fi +docs.oculus.gmbh +docs.oculus.in +docs.oculus.network +docs.oculus.news +docs.oculus.surgery +docs.oculus.university +docs.oculusvr.com +docsold.hhvm.com +docs.parse.com +docs.play.ai +docs.play.ht +docs.sonicsinc.net +docs.thefacebook.at +docs.thefacebook.de +docs.twistedpixelgames.com +docs.voicestesting.com +docs.whatsapp.am +docs.whatsapp.co.uk +docs.whatsapp.in +docs.whatsapp.info +docs.whatsapp.me.uk +docs.whatsapp.org.uk +docs.whatsapp.tw +docs.wk.pl +document.oculusvr.com +documents.oculus.de +docusaurus.io +dodfe4.m.me +doingwhatmatters.voicestesting.com +dokkanlab.fburl.com +dokteradjie.oculusvr.com +dollarstreetfactors.dev.metademolab.com +dollarstreetfactors.metademolab.com +domains.facebook.co.nz +domain.whatsapp.org +domderrien.oculusvr.com +domyo21.voicestesting.com +dongquang.fquestions.com +dor.fburl.com +dotslash-cli.com +doubleleaf.fburl.com +doudou84.m.me +download.developer.oculusvr.com +download-funny-ringtones-free.voicestesting.com +download.manus.im +downpourinteractive.com +downtownunitedsc.fburl.com +dp1.fburl.com +dplyr.fburl.com +dpocontact.facebook.co.za +dragon-arn2-1.cdninstagram.com +dragon-arn.cdninstagram.com +dragon-atl3-1.cdninstagram.com +dragon-atl3-2.cdninstagram.com +dragon-atl.cdninstagram.com +dragon-ber1-1.cdninstagram.com +dragon-bog.cdninstagram.com +dragon-bom.cdninstagram.com +dragon-bos5-1.cdninstagram.com +dragon-bru2-1.cdninstagram.com +dragon-bru.cdninstagram.com +dragon-ccu1-1.cdninstagram.com +dragon-ccu.cdninstagram.com +dragon-cdg4-2.cdninstagram.com +dragon-cdg.cdninstagram.com +dragon.cdninstagram.com +dragon-cgk1-1.cdninstagram.com +dragon-cgk1-2.cdninstagram.com +dragon-cph2-1.cdninstagram.com +dragon-cpt1-1.cdninstagram.com +dragon-cpt.cdninstagram.com +dragon-dfw5-1.cdninstagram.com +dragon-dfw.cdninstagram.com +dragon-dus1-1.cdninstagram.com +dragon-dus.cdninstagram.com +dragon-eze1-1.cdninstagram.com +dragon-eze.cdninstagram.com +dragon-fco2-1.cdninstagram.com +dragon-for.cdninstagram.com +dragon-fra3-1.cdninstagram.com +dragon-fra.cdninstagram.com +dragon-gig.cdninstagram.com +dragon-gmp1-1.cdninstagram.com +dragon-gru1-1.cdninstagram.com +dragon-gru1-2.cdninstagram.com +dragon-gru2-1.cdninstagram.com +dragon-gua1-1.cdninstagram.com +dragon-ham3-1.cdninstagram.com +dragon-hbe1-1.cdninstagram.com +dragon-hbe.cdninstagram.com +dragon-hel3-1.cdninstagram.com +dragon-hel.cdninstagram.com +dragon-hkg4-1.cdninstagram.com +dragon-hkg4-2.cdninstagram.com +dragon-hou1-1.cdninstagram.com +dragon-iad3-1.cdninstagram.com +dragon-iad3-2.cdninstagram.com +dragon-iad.cdninstagram.com +dragon-ist1-1.cdninstagram.com +dragon-itm1-1.cdninstagram.com +dragon-itm.cdninstagram.com +dragon-lax3-1.cdninstagram.com +dragon-lax3-2.cdninstagram.com +dragon-lga3-1.cdninstagram.com +dragon-lga3-2.cdninstagram.com +dragon-lga.cdninstagram.com +dragon-lhr8-1.cdninstagram.com +dragon-lim1-1.cdninstagram.com +dragon-lim.cdninstagram.com +dragon-lis1-1.cdninstagram.com +dragon-lis.cdninstagram.com +dragon-mad1-1.cdninstagram.com +dragon-man2-1.cdninstagram.com +dragon-man.cdninstagram.com +dragon-mba.cdninstagram.com +dragon-mct1-1.cdninstagram.com +dragon-mct.cdninstagram.com +dragon-mia3-2.cdninstagram.com +dragon-mrs2-2.cdninstagram.com +dragon-mrs.cdninstagram.com +dragon-msp1-1.cdninstagram.com +dragon-msp.cdninstagram.com +dragon-muc2-1.cdninstagram.com +dragon-mxp1-1.cdninstagram.com +dragon-nrt.cdninstagram.com +dragon-ord5-1.cdninstagram.com +dragon-otp1-1.cdninstagram.com +dragon-prg1-1.cdninstagram.com +dragon-qro1-1.cdninstagram.com +dragon-qro1-2.cdninstagram.com +dragon-scl.cdninstagram.com +dragon-sea1-1.cdninstagram.com +dragon-sea.cdninstagram.com +dragon-sin6-1.cdninstagram.com +dragon-sin6-2.cdninstagram.com +dragon-sin.cdninstagram.com +dragon-sjc.cdninstagram.com +dragon-sof1-1.cdninstagram.com +dragon-sof1-2.cdninstagram.com +dragon-sof.cdninstagram.com +dragon-ssn1-1.cdninstagram.com +dragon-syd2-1.cdninstagram.com +dragon-syd.cdninstagram.com +dragon-tpe1-1.cdninstagram.com +dragon-tpe.cdninstagram.com +dragon-vie.cdninstagram.com +dragon-zrh1-1.cdninstagram.com +drariya.fburl.com +dreamfly.oculusvr.com +dresnick.oculusvr.com +drive.camouflaj.com +dr-khaled.fburl.com +dropdevelopers.wk.pl +droversrun.oculusvr.com +dr-web-anti-virus-light-free.fquestions.com +dsl-226-243.wk.pl +ds.oculus.de +dtc.projectaria.com +duckling.wit.ai +dungeonhero.oculusvr.com +duoepisode.voicestesting.com +durbin.oculusvr.com +duzhe2013txtxiazai.prod.fbaddins.com +dveloper.oculusvr.com +dwcho3004545.oculusvr.com +dwiedemann.m.me +d-www.wk.pl +dyn.developer.oculusvr.com +dz-news-dz.oculusvr.com +e5.m.me +eager.oculusvr.com +earphonefuzzyclub.fburl.com +ebzadm-p facebook.com -0-edge-chat.facebook.com -0.beta.facebook.com -0.facebook.com -1-edge-chat.facebook.com -2-edge-chat.facebook.com -3-edge-chat.facebook.com -4-edge-chat.facebook.com -5-edge-chat.facebook.com -6-edge-chat.facebook.com -a.ish.instagram.com -a.ns.facebook.com -a1qa.m.facebook.com -a3.sphotos.ak.fbcdn.net -abc.facebook.com -about.facebook.com -act.facebook.com -actcorp.m.facebook.com -ads.facebook.com -ae0.bb01.ams2.tfbnw.net -ae0.bb01.atl1.tfbnw.net -ae0.bb01.bos2.tfbnw.net -ae0.bb01.hkg1.tfbnw.net -ae0.bb01.hnd1.tfbnw.net -ae0.bb01.lhr2.tfbnw.net -ae0.bb01.lla1.tfbnw.net -ae0.bb01.mia1.tfbnw.net -ae0.bb01.nrt1.tfbnw.net -ae0.bb01.sin1.tfbnw.net -ae0.bb02.ams2.tfbnw.net -ae0.bb02.atl1.tfbnw.net -ae0.bb02.bos2.tfbnw.net -ae0.bb02.hkg1.tfbnw.net -ae0.bb02.lhr2.tfbnw.net -ae0.bb02.lla1.tfbnw.net -ae0.bb02.mia1.tfbnw.net -ae0.bb02.sin1.tfbnw.net -ae0.bb03.atn1.tfbnw.net -ae0.bb03.frc3.tfbnw.net -ae0.bb03.lla1.tfbnw.net -ae0.bb03.prn2.tfbnw.net -ae0.bb03.sjc1.tfbnw.net -ae0.bb04.atn1.tfbnw.net -ae0.bb04.frc3.tfbnw.net -ae0.bb04.lla1.tfbnw.net -ae0.bb04.prn2.tfbnw.net -ae0.bb04.sjc1.tfbnw.net -ae0.bb05.frc3.tfbnw.net -ae0.bb05.lla1.tfbnw.net -ae0.bb05.prn2.tfbnw.net -ae0.bb06.frc3.tfbnw.net -ae0.bb06.lla1.tfbnw.net -ae0.bb07.lla1.tfbnw.net -ae0.br01.arn2.tfbnw.net -ae0.br01.bru2.tfbnw.net -ae0.br01.cai1.tfbnw.net -ae0.br01.gru1.tfbnw.net -ae0.br01.mad1.tfbnw.net -ae0.br01.mrs1.tfbnw.net -ae0.br01.mxp1.tfbnw.net -ae0.br01.syd1.tfbnw.net -ae0.br01.tpe1.tfbnw.net -ae0.br01.vie1.tfbnw.net -ae0.dr01.prn2.tfbnw.net -ae0.dr01.snc1.tfbnw.net -ae0.dr02.prn2.tfbnw.net -ae0.dr02.snc1.tfbnw.net -ae0.dr03.ash3.tfbnw.net -ae0.dr03.prn2.tfbnw.net -ae0.dr04.ash3.tfbnw.net -ae0.dr04.prn2.tfbnw.net -ae0.lr01.ash3.tfbnw.net -ae0.lr02.ash3.tfbnw.net -ae0.pr01.ams2.tfbnw.net -ae0.pr01.ams3.tfbnw.net -ae0.pr01.dfw1.tfbnw.net -ae0.pr01.fra2.tfbnw.net -ae0.pr01.lhr2.tfbnw.net -ae0.pr01.mia1.tfbnw.net -ae0.pr02.dfw1.tfbnw.net -ae0.pr02.fra2.tfbnw.net -ae0.pr02.iad3.tfbnw.net -ae0.pr02.lax1.tfbnw.net -ae0.pr02.lga1.tfbnw.net -ae0.pr02.mia1.tfbnw.net -ae0.pr02.ord1.tfbnw.net -ae0.pr03.sjc1.tfbnw.net -ae0.pr04.sjc1.tfbnw.net -ae10.bb01.atl1.tfbnw.net -ae10.bb01.lhr2.tfbnw.net -ae10.bb01.lla1.tfbnw.net -ae10.bb01.mia1.tfbnw.net -ae10.bb01.sin1.tfbnw.net -ae10.bb02.atl1.tfbnw.net -ae10.bb02.hkg1.tfbnw.net -ae10.bb02.lhr2.tfbnw.net -ae10.bb02.lla1.tfbnw.net -ae10.bb02.mia1.tfbnw.net -ae10.bb02.sin1.tfbnw.net -ae10.bb03.atn1.tfbnw.net -ae10.bb03.frc3.tfbnw.net -ae10.bb03.lla1.tfbnw.net -ae10.bb03.sjc1.tfbnw.net -ae10.bb04.atn1.tfbnw.net -ae10.bb04.frc3.tfbnw.net -ae10.bb04.lla1.tfbnw.net -ae10.bb04.sjc1.tfbnw.net -ae10.bb05.lla1.tfbnw.net -ae10.bb06.frc3.tfbnw.net -ae10.bb06.lla1.tfbnw.net -ae10.br01.bru2.tfbnw.net -ae10.br01.kul1.tfbnw.net -ae10.br01.mad1.tfbnw.net -ae10.br01.mxp1.tfbnw.net -ae10.br01.tpe1.tfbnw.net -ae10.br02.vie1.tfbnw.net -ae10.dr01.frc1.tfbnw.net -ae10.dr02.frc1.tfbnw.net -ae10.dr02.prn1.tfbnw.net -ae10.dr05.prn1.tfbnw.net -ae10.dr06.prn1.tfbnw.net -ae10.pr01.atl1.tfbnw.net -ae10.pr01.dfw1.tfbnw.net -ae10.pr01.fra2.tfbnw.net -ae10.pr01.lax1.tfbnw.net -ae10.pr01.mia1.tfbnw.net -ae10.pr01.nrt1.tfbnw.net -ae10.pr01.sin1.tfbnw.net -ae10.pr02.atl1.tfbnw.net -ae10.pr02.fra2.tfbnw.net -ae10.pr02.sin1.tfbnw.net -ae11.bb01.ams2.tfbnw.net -ae11.bb01.atl1.tfbnw.net -ae11.bb01.lhr2.tfbnw.net -ae11.bb01.mia1.tfbnw.net -ae11.bb01.nrt1.tfbnw.net -ae11.bb01.sin1.tfbnw.net -ae11.bb02.ams2.tfbnw.net -ae11.bb02.atl1.tfbnw.net -ae11.bb02.hkg1.tfbnw.net -ae11.bb02.lhr2.tfbnw.net -ae11.bb02.mia1.tfbnw.net -ae11.bb02.sin1.tfbnw.net -ae11.bb03.atn1.tfbnw.net -ae11.bb03.frc3.tfbnw.net -ae11.bb03.prn2.tfbnw.net -ae11.bb03.sjc1.tfbnw.net -ae11.bb04.atn1.tfbnw.net -ae11.bb04.frc3.tfbnw.net -ae11.bb04.prn2.tfbnw.net -ae11.bb04.sjc1.tfbnw.net -ae11.bb05.lla1.tfbnw.net -ae11.bb06.frc3.tfbnw.net -ae11.bb06.lla1.tfbnw.net -ae11.br01.kul1.tfbnw.net -ae11.br01.mad1.tfbnw.net -ae11.br01.tpe1.tfbnw.net -ae11.br01.vie1.tfbnw.net -ae11.br02.mxp1.tfbnw.net -ae11.br02.vie1.tfbnw.net -ae11.dr01.atn1.tfbnw.net -ae11.dr01.frc1.tfbnw.net -ae11.dr01.snc1.tfbnw.net -ae11.dr02.atn1.tfbnw.net -ae11.dr02.frc1.tfbnw.net -ae11.dr02.snc1.tfbnw.net -ae11.dr03.atn1.tfbnw.net -ae11.dr03.frc1.tfbnw.net -ae11.dr04.atn1.tfbnw.net -ae11.dr04.frc1.tfbnw.net -ae11.pr01.atl1.tfbnw.net -ae11.pr01.dfw1.tfbnw.net -ae11.pr01.hkg1.tfbnw.net -ae11.pr01.lga1.tfbnw.net -ae11.pr01.lhr2.tfbnw.net -ae11.pr01.lhr3.tfbnw.net -ae11.pr01.ord1.tfbnw.net -ae11.pr02.atl1.tfbnw.net -ae11.pr02.cdg1.tfbnw.net -ae11.pr02.fra2.tfbnw.net -ae11.pr02.lax1.tfbnw.net -ae12.bb01.ams2.tfbnw.net -ae12.bb01.lhr2.tfbnw.net -ae12.bb01.mia1.tfbnw.net -ae12.bb01.nrt1.tfbnw.net -ae12.bb02.ams2.tfbnw.net -ae12.bb02.atl1.tfbnw.net -ae12.bb02.lhr2.tfbnw.net -ae12.bb02.mia1.tfbnw.net -ae12.bb03.atn1.tfbnw.net -ae12.bb03.frc3.tfbnw.net -ae12.bb03.prn2.tfbnw.net -ae12.bb03.sjc1.tfbnw.net -ae12.bb04.atn1.tfbnw.net -ae12.bb04.frc3.tfbnw.net -ae12.bb04.prn2.tfbnw.net -ae12.bb04.sjc1.tfbnw.net -ae12.bb05.lla1.tfbnw.net -ae12.bb06.frc3.tfbnw.net -ae12.bb06.lla1.tfbnw.net -ae12.br01.kul1.tfbnw.net -ae12.br01.mad1.tfbnw.net -ae12.br01.mxp1.tfbnw.net -ae12.br01.vie1.tfbnw.net -ae12.br02.mxp1.tfbnw.net -ae12.br02.vie1.tfbnw.net -ae12.dr01.atn1.tfbnw.net -ae12.dr01.frc1.tfbnw.net -ae12.dr01.snc1.tfbnw.net -ae12.dr02.atn1.tfbnw.net -ae12.dr02.frc1.tfbnw.net -ae12.dr02.snc1.tfbnw.net -ae12.dr03.atn1.tfbnw.net -ae12.dr03.frc1.tfbnw.net -ae12.dr04.atn1.tfbnw.net -ae12.dr04.frc1.tfbnw.net -ae12.pr01.ams2.tfbnw.net -ae12.pr01.ams3.tfbnw.net -ae12.pr01.atl1.tfbnw.net -ae12.pr01.hkg1.tfbnw.net -ae12.pr01.lga1.tfbnw.net -ae12.pr01.lhr2.tfbnw.net -ae12.pr01.mia1.tfbnw.net -ae12.pr01.ord1.tfbnw.net -ae12.pr01.sea1.tfbnw.net -ae12.pr01.sin1.tfbnw.net -ae12.pr02.atl1.tfbnw.net -ae12.pr02.sea1.tfbnw.net -ae13.bb01.atl1.tfbnw.net -ae13.bb01.lhr2.tfbnw.net -ae13.bb01.mia1.tfbnw.net -ae13.bb01.nrt1.tfbnw.net -ae13.bb01.sin1.tfbnw.net -ae13.bb02.lhr2.tfbnw.net -ae13.bb02.mia1.tfbnw.net -ae13.bb03.atn1.tfbnw.net -ae13.bb03.frc3.tfbnw.net -ae13.bb03.prn2.tfbnw.net -ae13.bb03.sjc1.tfbnw.net -ae13.bb04.atn1.tfbnw.net -ae13.bb04.frc3.tfbnw.net -ae13.bb04.prn2.tfbnw.net -ae13.bb04.sjc1.tfbnw.net -ae13.bb05.lla1.tfbnw.net -ae13.bb06.lla1.tfbnw.net -ae13.br01.mad1.tfbnw.net -ae13.br01.mxp1.tfbnw.net -ae13.br01.tpe1.tfbnw.net -ae13.br01.vie1.tfbnw.net -ae13.br02.mxp1.tfbnw.net -ae13.br02.vie1.tfbnw.net -ae13.dr01.atn1.tfbnw.net -ae13.dr01.frc1.tfbnw.net -ae13.dr02.atn1.tfbnw.net -ae13.dr02.frc1.tfbnw.net -ae13.dr03.atn1.tfbnw.net -ae13.dr03.frc1.tfbnw.net -ae13.dr04.atn1.tfbnw.net -ae13.dr04.frc1.tfbnw.net -ae13.dr05.prn1.tfbnw.net -ae13.pr01.ams2.tfbnw.net -ae13.pr01.atl1.tfbnw.net -ae13.pr01.cdg1.tfbnw.net -ae13.pr01.hkg1.tfbnw.net -ae13.pr01.iad3.tfbnw.net -ae13.pr01.lhr2.tfbnw.net -ae13.pr01.mia1.tfbnw.net -ae13.pr01.ord1.tfbnw.net -ae13.pr01.sea1.tfbnw.net -airasia.m.facebook.com -algar.m.facebook.com -allo.m.facebook.com -alpha-shv-03-ash5.facebook.com -alpha-shv-03-atn1.facebook.com -alpha-shv-03-lla1.facebook.com -alpha-shv-04-prn2.facebook.com -alpha-shv-09-frc1.facebook.com -alpha.vvv.facebook.com -an.facebook.com -api-read.facebook.com -api.facebook.com -api.instagram.com -apps.facebook.com -ar-ar.facebook.com -ar-ar.fr-fr.es-es.prod.facebook.com -ar-ar.vn-ni.connect.facebook.com -ash1.fbcdn.net -asos.m.facebook.com -asurion.m.facebook.com -atlas-shv-01-prn2.facebook.com -atlas-shv-04-lla1.facebook.com -atlas-shv-05-ash3.facebook.com -atlas-shv-06-ash2.facebook.com -atlas-shv-06-frc1.facebook.com -atlas-shv-07-lla1.facebook.com -atlas-shv-09-frc3.facebook.com -atlas-shv-13-prn1.facebook.com -atlas-www-shv-04-prn2.facebook.com -atlas-www-shv-07-ash4.facebook.com -atlas-www-shv-09-frc1.facebook.com -atlas.c10r.facebook.com -atlasalpha-shv-09-frc3.facebook.com -atlasinyour-shv-05-ash3.facebook.com -attachment.fbsbx.com -attachments.facebook.com -aura-11-01-snc7.facebook.com -autodiscover.instagram.com -axiata.m.facebook.com -axis.m.facebook.com -az-az.facebook.com -b-api.facebook.com -b-graph.facebook.com -b-m.facebook.com -b-www.facebook.com -b.i.instagram.com -b.ish.instagram.com -b.ns.facebook.com -badge.facebook.com -badges.instagram.com -bc.facebook.com -bd.m.facebook.com -beta-chat-01-05-ash3.facebook.com -beta-shv-03-atn1.facebook.com -beta-shv-03-lla1.facebook.com -beta-shv-04-prn2.facebook.com -beta-shv-09-frc1.facebook.com -beta.facebook.com -beta.vvv.facebook.com -betanet-shv-03-atn1.facebook.com -betanet-shv-03-lla1.facebook.com -betanet-shv-04-prn2.facebook.com -betanet-shv-09-frc1.facebook.com -bg-bg.facebook.com -bidder-shv-05-frc3.facebook.com -bidder-shv-10-frc1.facebook.com -bidv.m.facebook.com -bigzipfiles.facebook.com -black.instagram.com -black.ish.instagram.com -blog.facebook.com -blog.instagram.com -bn-in.facebook.com -boostcom.m.facebook.com -bs-ba.facebook.com -business.facebook.com -business.instagram.com -c.facebook.com -c.ish.instagram.com -ca-es.facebook.com -capiot.m.facebook.com -ccamatil.m.facebook.com -cdg2.fbcdn.net -channel-ecmp-05-ash3.facebook.com -channel-proxy-shv-04-frc3.facebook.com -channel-proxy-shv-06-ash2.facebook.com -channel-proxy-shv-07-ash2.facebook.com -channel-proxy-shv-13-prn1.facebook.com -channel-proxy-test-shv-07-ash2.facebook.com -channel-staging-ecmp-05-ash3.facebook.com -channel-testing-ecmp-05-ash3.facebook.com -check4.facebook.com -check6.facebook.com -clubmed.m.facebook.com -code.facebook.com -comfytrade.m.facebook.com -community.instagram.com -conectadosbancogalicia.m.facebook.com -connect.facebook.com -connect.facebook.net -connect.facebook.net.edgekey.net -cs-cz.facebook.com -csf.facebook.com -ct-m-fbx.fbsbx.com -d.facebook.com -d.ish.instagram.com -d.vvv.facebook.com -da-dk.facebook.com -danone.m.facebook.com -davivienda.m.facebook.com -de-de.facebook.com -deloitte.m.facebook.com -dev.vvv.facebook.com -developers.facebook.com -developers.instagram.com -dixonscarphone.m.facebook.com -dm.m.facebook.com -dns.facebook.com -dyi.www.instagram.com -e.ish.instagram.com -ed.facebook.com -edge-atlas-proxyprotocol-shv-01-ash5.facebook.com -edge-atlas-proxyprotocol-shv-03-ash5.facebook.com -edge-atlas-proxyprotocol-shv-07-ash4.facebook.com -edge-atlas-proxyprotocol-shv-07-frc3.facebook.com -edge-atlas-proxyprotocol-shv-09-frc1.facebook.com -edge-atlas-proxyprotocol-shv-12-frc1.facebook.com -edge-atlas-proxyprotocol-shv-12-frc3.facebook.com -edge-atlas-proxyprotocol-shv-13-frc1.facebook.com -edge-atlas-shv-01-ams2.facebook.com -edge-atlas-shv-01-ams3.facebook.com -edge-atlas-shv-01-ash5.facebook.com -edge-atlas-shv-01-atl1.facebook.com -edge-atlas-shv-01-bru2.facebook.com -edge-atlas-shv-01-cai1.facebook.com -edge-atlas-shv-01-cdg2.facebook.com -edge-atlas-shv-01-dfw1.facebook.com -edge-atlas-shv-01-fra3.facebook.com -edge-atlas-shv-01-gru1.facebook.com -edge-atlas-shv-01-hkg2.facebook.com -edge-atlas-shv-01-iad3.facebook.com -edge-atlas-shv-01-kul1.facebook.com -edge-atlas-shv-01-lax1.facebook.com -edge-atlas-shv-01-lga1.facebook.com -edge-atlas-shv-01-lhr3.facebook.com -edge-atlas-shv-01-mad1.facebook.com -edge-atlas-shv-01-mia1.facebook.com -edge-atlas-shv-01-mxp1.facebook.com -edge-atlas-shv-01-nrt1.facebook.com -edge-atlas-shv-01-ord1.facebook.com -edge-atlas-shv-01-sea1.facebook.com -edge-atlas-shv-01-sin1.facebook.com -edge-atlas-shv-01-sjc2.facebook.com -edge-atlas-shv-01-syd1.facebook.com -edge-atlas-shv-01-vie1.facebook.com -edge-atlas-shv-02-cai1.facebook.com -edge-atlas-shv-02-hkg2.facebook.com -edge-atlas-shv-03-ash5.facebook.com -edge-atlas-shv-03-atn1.facebook.com -edge-atlas-shv-03-hkg1.facebook.com -edge-atlas-shv-03-lla1.facebook.com -edge-atlas-shv-03-prn2.facebook.com -edge-atlas-shv-03-xdc1.facebook.com -edge-atlas-shv-04-hkg1.facebook.com -edge-atlas-shv-04-prn2.facebook.com -edge-atlas-shv-06-atn1.facebook.com -edge-atlas-shv-06-lla1.facebook.com -edge-atlas-shv-07-ash4.facebook.com -edge-atlas-shv-09-frc1.facebook.com -edge-atlas-shv-09-lla1.facebook.com -edge-atlas-shv-12-frc1.facebook.com -edge-atlas-shv-12-frc3.facebook.com -edge-atlas-shv-12-lla1.facebook.com -edge-atlas-shv-12-prn1.facebook.com -edge-atlas-shv-13-frc1.facebook.com -edge-atlas-shv-17-prn1.facebook.com -edge-atlas-shv-18-prn1.facebook.com -edge-chat.facebook.com -edge-liverail-shv-01-ams2.facebook.com -edge-liverail-shv-01-ams3.facebook.com -edge-liverail-shv-01-ash5.facebook.com -edge-liverail-shv-01-atl1.facebook.com -edge-liverail-shv-01-bru2.facebook.com -edge-liverail-shv-01-cai1.facebook.com -edge-liverail-shv-01-cdg2.facebook.com -edge-liverail-shv-01-dfw1.facebook.com -edge-liverail-shv-01-fra3.facebook.com -edge-liverail-shv-01-gru1.facebook.com -edge-liverail-shv-01-hkg2.facebook.com -edge-liverail-shv-01-iad3.facebook.com -edge-liverail-shv-01-kul1.facebook.com -edge-liverail-shv-01-lax1.facebook.com -edge-liverail-shv-01-lga1.facebook.com -edge-liverail-shv-01-lhr3.facebook.com -edge-liverail-shv-01-mad1.facebook.com -edge-liverail-shv-01-mia1.facebook.com -edge-liverail-shv-01-mxp1.facebook.com -edge-liverail-shv-01-nrt1.facebook.com -edge-liverail-shv-01-ord1.facebook.com -edge-liverail-shv-01-sea1.facebook.com -edge-liverail-shv-01-sin1.facebook.com -edge-liverail-shv-01-sjc2.facebook.com -edge-liverail-shv-01-syd1.facebook.com -edge-liverail-shv-01-tpe1.facebook.com -edge-liverail-shv-01-vie1.facebook.com -edge-liverail-shv-02-cai1.facebook.com -edge-liverail-shv-02-hkg2.facebook.com -edge-liverail-shv-03-ash5.facebook.com -edge-liverail-shv-03-atn1.facebook.com -edge-liverail-shv-03-hkg1.facebook.com -edge-liverail-shv-03-lla1.facebook.com -edge-liverail-shv-03-prn2.facebook.com -edge-liverail-shv-03-xdc1.facebook.com -edge-liverail-shv-04-hkg1.facebook.com -edge-liverail-shv-04-prn2.facebook.com -edge-liverail-shv-06-atn1.facebook.com -edge-liverail-shv-06-lla1.facebook.com -edge-liverail-shv-07-ash4.facebook.com -edge-liverail-shv-07-frc3.facebook.com -edge-liverail-shv-09-frc1.facebook.com -edge-liverail-shv-09-lla1.facebook.com -edge-liverail-shv-12-frc1.facebook.com -edge-liverail-shv-12-frc3.facebook.com -edge-liverail-shv-12-lla1.facebook.com -edge-liverail-shv-12-prn1.facebook.com -edge-liverail-shv-13-frc1.facebook.com -edge-liverail-shv-17-prn1.facebook.com -edge-liverail-shv-18-prn1.facebook.com -edge-mqtt-shv-01-ams2.facebook.com -edge-mqtt-shv-01-ams3.facebook.com -edge-mqtt-shv-01-ash5.facebook.com -edge-mqtt-shv-01-atl1.facebook.com -edge-mqtt-shv-01-bru2.facebook.com -edge-mqtt-shv-01-cai1.facebook.com -edge-mqtt-shv-01-cdg2.facebook.com -edge-mqtt-shv-01-dfw1.facebook.com -edge-mqtt-shv-01-fra3.facebook.com -edge-mqtt-shv-01-gru1.facebook.com -edge-mqtt-shv-01-hkg2.facebook.com -edge-mqtt-shv-01-iad3.facebook.com -edge-mqtt-shv-01-kul1.facebook.com -edge-mqtt-shv-01-lax1.facebook.com -edge-mqtt-shv-01-lga1.facebook.com -edge-mqtt-shv-01-lhr3.facebook.com -edge-mqtt-shv-01-mad1.facebook.com -edge-mqtt-shv-01-mia1.facebook.com -edge-mqtt-shv-01-mxp1.facebook.com -edge-mqtt-shv-01-nrt1.facebook.com -edge-mqtt-shv-01-ord1.facebook.com -edge-mqtt-shv-01-sea1.facebook.com -edge-mqtt-shv-01-sin1.facebook.com -edge-mqtt-shv-01-sjc2.facebook.com -edge-mqtt-shv-01-syd1.facebook.com -edge-mqtt-shv-01-tpe1.facebook.com -edge-mqtt-shv-01-vie1.facebook.com -edge-mqtt-shv-02-cai1.facebook.com -edge-mqtt-shv-02-hkg2.facebook.com -edge-mqtt-shv-03-ash5.facebook.com -edge-mqtt-shv-03-atn1.facebook.com -edge-mqtt-shv-03-hkg1.facebook.com -edge-mqtt-shv-03-lla1.facebook.com -edge-mqtt-shv-03-prn2.facebook.com -edge-mqtt-shv-03-xdc1.facebook.com -edge-mqtt-shv-04-hkg1.facebook.com -edge-mqtt-shv-04-prn2.facebook.com -edge-mqtt-shv-06-atn1.facebook.com -edge-mqtt-shv-06-lla1.facebook.com -edge-mqtt-shv-07-ash4.facebook.com -edge-mqtt-shv-07-frc3.facebook.com -edge-mqtt-shv-09-lla1.facebook.com -edge-mqtt-shv-12-frc1.facebook.com -edge-mqtt-shv-12-frc3.facebook.com -edge-mqtt-shv-12-lla1.facebook.com -edge-mqtt-shv-12-prn1.facebook.com -edge-mqtt-shv-13-frc1.facebook.com -edge-mqtt-shv-17-prn1.facebook.com -edge-mqtt-shv-18-prn1.facebook.com -edge-mqtt.facebook.com -edge-oculus-shv-01-lga3.fbcdn.net -edge-oculus-shv-01-mia3.fbcdn.net -edge-oculus-shv-01-sea1.fbcdn.net -edge-oculus-shv-01-sjc2.fbcdn.net -edge-oculus-shv-01-yyz1.fbcdn.net -edge-snaptu-http-p1-shv-01-ams3.facebook.com -edge-snaptu-http-p1-shv-01-atl1.facebook.com -edge-snaptu-http-p1-shv-01-bru2.facebook.com -edge-snaptu-http-p1-shv-01-cai1.facebook.com -edge-snaptu-http-p1-shv-01-cdg2.facebook.com -edge-snaptu-http-p1-shv-01-dfw1.facebook.com -edge-snaptu-http-p1-shv-01-fra3.facebook.com -edge-snaptu-http-p1-shv-01-gru1.facebook.com -edge-snaptu-http-p1-shv-01-iad3.facebook.com -edge-snaptu-http-p1-shv-01-kul1.facebook.com -edge-snaptu-http-p1-shv-01-lax1.facebook.com -edge-snaptu-http-p1-shv-01-lhr3.facebook.com -edge-snaptu-http-p1-shv-01-mad1.facebook.com -edge-snaptu-http-p1-shv-01-nrt1.facebook.com -edge-snaptu-http-p1-shv-01-ord1.facebook.com -edge-snaptu-http-p1-shv-01-sea1.facebook.com -edge-snaptu-http-p1-shv-01-syd1.facebook.com -edge-snaptu-http-p1-shv-02-cai1.facebook.com -edge-snaptu-tunnel-shv-01-ams3.facebook.com -edge-snaptu-tunnel-shv-01-ash5.facebook.com -edge-snaptu-tunnel-shv-01-atl1.facebook.com -edge-snaptu-tunnel-shv-01-bru2.facebook.com -edge-snaptu-tunnel-shv-01-cai1.facebook.com -edge-snaptu-tunnel-shv-01-cdg2.facebook.com -edge-snaptu-tunnel-shv-01-dfw1.facebook.com -edge-snaptu-tunnel-shv-01-fra3.facebook.com -edge-snaptu-tunnel-shv-01-gru1.facebook.com -edge-snaptu-tunnel-shv-01-hkg2.facebook.com -edge-snaptu-tunnel-shv-01-iad3.facebook.com -edge-snaptu-tunnel-shv-01-kul1.facebook.com -edge-snaptu-tunnel-shv-01-lax1.facebook.com -edge-snaptu-tunnel-shv-01-lhr3.facebook.com -edge-snaptu-tunnel-shv-01-mad1.facebook.com -edge-snaptu-tunnel-shv-01-nrt1.facebook.com -edge-snaptu-tunnel-shv-01-ord1.facebook.com -edge-snaptu-tunnel-shv-01-sea1.facebook.com -edge-snaptu-tunnel-shv-01-syd1.facebook.com -edge-snaptu-tunnel-shv-02-cai1.facebook.com -edge-sonar-mini-shv-01-bru2.fbcdn.net -edge-sonar-mini-shv-01-kul1.fbcdn.net -edge-sonar-mini-shv-01-lht6.fbcdn.net -edge-sonar-mini-shv-01-ord1.fbcdn.net -edge-sonar-mini-shv-01-ort2.fbcdn.net -edge-sonar-mini-shv-07-frc3.fbcdn.net -edge-sonar-shv-01-ams2.fbcdn.net -edge-sonar-shv-01-ams3.fbcdn.net -edge-sonar-shv-01-ash5.fbcdn.net -edge-sonar-shv-01-atl1.fbcdn.net -edge-sonar-shv-01-bru2.fbcdn.net -edge-sonar-shv-01-cai1.fbcdn.net -edge-sonar-shv-01-cdg2.fbcdn.net -edge-sonar-shv-01-dfw1.fbcdn.net -edge-sonar-shv-01-fra3.fbcdn.net -edge-sonar-shv-01-gru1.fbcdn.net -edge-sonar-shv-01-iad3.fbcdn.net -edge-sonar-shv-01-kul1.fbcdn.net -edge-sonar-shv-01-lax1.fbcdn.net -edge-sonar-shv-01-lga1.fbcdn.net -edge-sonar-shv-01-lhr3.fbcdn.net -edge-sonar-shv-01-mad1.fbcdn.net -edge-sonar-shv-01-mia1.fbcdn.net -edge-sonar-shv-01-mrs1.fbcdn.net -edge-sonar-shv-01-mxp1.fbcdn.net -edge-sonar-shv-01-nrt1.fbcdn.net -edge-sonar-shv-01-ord1.fbcdn.net -edge-sonar-shv-01-sea1.fbcdn.net -edge-sonar-shv-01-sin1.fbcdn.net -edge-sonar-shv-01-sjc2.fbcdn.net -edge-sonar-shv-01-syd1.fbcdn.net -edge-sonar-shv-01-tpe1.fbcdn.net -edge-sonar-shv-01-vie1.fbcdn.net -edge-sonar-shv-02-cai1.fbcdn.net -edge-sonar-shv-02-hkg2.fbcdn.net -edge-sonar-shv-03-ash5.fbcdn.net -edge-sonar-shv-03-atn1.fbcdn.net -edge-sonar-shv-03-hkg1.fbcdn.net -edge-sonar-shv-03-lla1.fbcdn.net -edge-sonar-shv-03-prn2.fbcdn.net -edge-sonar-shv-03-xdc1.fbcdn.net -edge-sonar-shv-04-hkg1.fbcdn.net -edge-sonar-shv-04-prn2.fbcdn.net -edge-sonar-shv-06-atn1.fbcdn.net -edge-sonar-shv-06-lla1.fbcdn.net -edge-sonar-shv-07-ash4.fbcdn.net -edge-sonar-shv-07-frc3.fbcdn.net -edge-sonar-shv-09-frc1.fbcdn.net -edge-sonar-shv-09-lla1.fbcdn.net -edge-sonar-shv-12-frc1.fbcdn.net -edge-sonar-shv-12-frc3.fbcdn.net -edge-sonar-shv-12-lla1.fbcdn.net -edge-sonar-shv-12-prn1.fbcdn.net -edge-sonar-shv-13-frc1.fbcdn.net -edge-sonar-shv-17-prn1.fbcdn.net -edge-sonar-shv-18-prn1.fbcdn.net -edge-star-shv-12-frc3.facebook.com -edge-video-shv-01-ams2.fbcdn.net -edge-video-shv-01-ams3.fbcdn.net -edge-video-shv-01-arn2.fbcdn.net -edge-video-shv-01-at13.fbcdn.net -edge-video-shv-01-atl3.fbcdn.net -edge-video-shv-01-bru2.fbcdn.net -edge-video-shv-01-cdg2.fbcdn.net -edge-video-shv-01-dft4.fbcdn.net -edge-video-shv-01-dfw1.fbcdn.net -edge-video-shv-01-dfw5.fbcdn.net -edge-video-shv-01-fra3.fbcdn.net -edge-video-shv-01-frt3.fbcdn.net -edge-video-shv-01-gru2.fbcdn.net -edge-video-shv-01-hkg3.fbcdn.net -edge-video-shv-01-iad3.fbcdn.net -edge-video-shv-01-kul1.fbcdn.net -edge-video-shv-01-kut2.fbcdn.net -edge-video-shv-01-lax3.fbcdn.net -edge-video-shv-01-lga1.fbcdn.net -edge-video-shv-01-lga3.fbcdn.net -edge-video-shv-01-lhr3.fbcdn.net -edge-video-shv-01-mia1.fbcdn.net -edge-video-shv-01-mia3.fbcdn.net -edge-video-shv-01-mrs1.fbcdn.net -edge-video-shv-01-nrt1.fbcdn.net -edge-video-shv-01-ord1.fbcdn.net -edge-video-shv-01-ort2.fbcdn.net -edge-video-shv-01-sea1.fbcdn.net -edge-video-shv-01-sin6.fbcdn.net -edge-video-shv-01-sit4.fbcdn.net -edge-video-shv-01-syd2.fbcdn.net -edge-video-shv-01-vie1.fbcdn.net -edge-video-shv-01-waw1.fbcdn.net -edge-video-shv-01-yyz1.fbcdn.net -edge-video-shv-02-dft4.fbcdn.net -edge-video-shv-02-sin6.fbcdn.net -edgeray-origin-shv-05-prn2.facebook.com -edgeray-origin-shv-07-lla1.facebook.com -edgeray-origin-shv-09-frc3.facebook.com -edgeray-origin-shv-11-frc3.facebook.com -edgeray-shv-01-ams2.facebook.com -edgeray-shv-01-ams3.facebook.com -edgeray-shv-01-atl1.facebook.com -edgeray-shv-01-bru2.facebook.com -edgeray-shv-01-cdg2.facebook.com -edgeray-shv-01-dfw1.facebook.com -edgeray-shv-01-fra3.facebook.com -edgeray-shv-01-gru1.facebook.com -edgeray-shv-01-iad3.facebook.com -edgeray-shv-01-kul1.facebook.com -edgeray-shv-01-lax1.facebook.com -edgeray-shv-01-lga1.facebook.com -edgeray-shv-01-lhr3.facebook.com -edgeray-shv-01-mad1.facebook.com -edgeray-shv-01-mia1.facebook.com -edgeray-shv-01-mxp1.facebook.com -edgeray-shv-01-ord1.facebook.com -edgeray-shv-01-sea1.facebook.com -edgeray-shv-01-sin1.facebook.com -edgeray-shv-01-sjc2.facebook.com -edgeray-shv-01-syd1.facebook.com -edgeray-shv-01-vie1.facebook.com -el-gr.facebook.com -elkjopnordic.m.facebook.com -en-gb.facebook.com -en-gb.latest.instagram.com -en-gb.th-th.fbjs.facebook.com -engineering.instagram.com -ent-a.xx.fbcdn.net -ent-b.xx.fbcdn.net -ent-c.xx.fbcdn.net -ent-d.xx.fbcdn.net -ent-e.xx.fbcdn.net -error.facebook.com -es-es.facebook.com -es-es.fbjs.facebook.com -es-la.es-es.de-de.fbjs.facebook.com -es-la.f.connect.facebook.com -es-la.facebook.com -es.facebook.com -et-ee.facebook.com -external-cdt1-1.xx.fbcdn.net -external-frt3-2.xx.fbcdn.net -external-hkg3-1.xx.fbcdn.net -external-iad3-1.xx.fbcdn.net -external-ort2-1.xx.fbcdn.net -external.fapa1-1.fna.fbcdn.net -external.fauh1-1.fna.fbcdn.net -external.fbkk10-1.fna.fbcdn.net -external.fbna1-1.fna.fbcdn.net -external.fbsb1-1.fna.fbcdn.net -external.fceb1-1.fna.fbcdn.net -external.fcmb1-1.fna.fbcdn.net -external.fdel11-1.fna.fbcdn.net -external.fdxb1-1.fna.fbcdn.net -external.ffor10-1.fna.fbcdn.net -external.fhan5-2.fna.fbcdn.net -external.fhfa1-1.fna.fbcdn.net -external.fhkg2-1.fna.fbcdn.net -external.fjnb1-1.fna.fbcdn.net -external.fkul10-1.fna.fbcdn.net -external.fkul8-1.fna.fbcdn.net -external.fmaa1-1.fna.fbcdn.net -external.fmex5-1.fna.fbcdn.net -external.fmnl10-1.fna.fbcdn.net -external.fpra1-1.fna.fbcdn.net -external.fqls1-1.fna.fbcdn.net -external.frec10-1.fna.fbcdn.net -external.fsdu10-1.fna.fbcdn.net -external.fsdu11-1.fna.fbcdn.net -external.fsea1-1.fna.fbcdn.net -external.fsjc1-2.fna.fbcdn.net -external.ftpa1-1.fna.fbcdn.net -external.fvit1-1.fna.fbcdn.net -f.ish.instagram.com -f6eec677a80kdno4pyq-kxornjlf1521512613-sonar.xz.fbcdn.net -f91858abe80k2geylvi-zhianuzp1521559729-sonar.xx.fbcdn.net -fa-ir.facebook.com -facebook-web-clients.appspot.com +facebook.at +facebook.be +facebook.biz +facebook.bs +facebook.ca +facebook.cl +facebook.co +facebook.com.ar +facebook.com.au +facebook.com.br +facebook.com.es +facebook.com.gt +facebook.com.mx +facebook.com.ng +facebook.com.ni +facebook.com.pl +facebook.com.sv +facebook.com.tw +facebook.com.ve facebook.de +facebook.dk +facebook.es facebook.fr -fb-lt.facebook.com +facebook.hn +facebook.ie +facebook.in +facebook.it +facebook.jp +facebook.lt +facebook.lv +facebook.net +facebook.nl +facebook.nowruz +facebook.org +facebook.pl +facebook.se +facebook.ug +facebook.us +facebook.vn +meta.com fb.com -fb.m.facebook.com fb.me -fb4708f8e80kdno4pyq-bigworkf1521512717-sonar.xz.fbcdn.net -fbcallback.wechat.com -fbcdn-creative-a.akamaihd.net -fbcdn-photos-a.akamaihd.net -fbcdn-photos-e-a.akamaihd.net -fbcdn-profile-a.akamaihd.net -fbcdn-sphotos-a-a.akamaihd.net -fbcdn-sphotos-a.akamaihd.net -fbcdn-sphotos-b-a.akamaihd.net -fbcdn-sphotos-c-a.akamaihd.net -fbcdn-sphotos-d-a.akamaihd.net -fbcdn-sphotos-e-a.akamaihd.net -fbcdn-sphotos-f-a.akamaihd.net -fbcdn-sphotos-g-a.akamaihd.net -fbcdn-sphotos-h-a.akamaihd.net -fbcdn-video-a-a.akamaihd.net -fbcdn-video-b-a.akamaihd.net -fbcdn-video-c-a.akamaihd.net -fbcdn-video-d-a.akamaihd.net -fbcdn-video-e-a.akamaihd.net -fbcdn-video-f-a.akamaihd.net -fbcdn-video-g-a.akamaihd.net -fbcdn-video-h-a.akamaihd.net -fbcdn-video-i-a.akamaihd.net -fbcdn-video-j-a.akamaihd.net -fbcdn-video-k-a.akamaihd.net -fbcdn-video-l-a.akamaihd.net -fbcdn-video-m-a.akamaihd.net -fbcdn-video-n-a.akamaihd.net -fbcdn-video-o-a.akamaihd.net -fbcdn-video-p-a.akamaihd.net -fbcdn-vthumb-a.akamaihd.net -fbcdn.com fbcdn.net -fbexternal-a.akamaihd.net fbsbx.com -fbstatic-a.akamaihd.net -fburl.com -fdda274d380ki4frcgi-rumjfjai1460158783-sonar.xx.fbcdn.net -fi-fi.facebook.com -flex.m.facebook.com -flynorra.m.facebook.com -fmel2-1.fbcdn.net -fna-fbcdn-shv-01-fmaa1.fbcdn.net -fna-fbcdn-shv-02-fdet1.fbcdn.net -fna-fbcdn-shv-02-fsnc1.fbcdn.net -fna-fbcdn-video-shv-01-ffjr1.fbcdn.net -fna.fbcdn.net -fpt.m.facebook.com -fr-ca.facebook.com -fr-fr.facebook.com -fr-fr.o.facebook.com -fr.facebook.com -free.beta.facebook.com -free.facebook.com -free.freebasics.com -free.internet.org freebasics.com -generalelectric.m.facebook.com -gingerhotels.m.facebook.com -gob.m.facebook.com -google.m.facebook.com -govtech.m.facebook.com -graph-video.facebook.com -graph.facebook.com -graph.instagram.com -grupoboticario.m.facebook.com -gu-in.facebook.com -h-ct-m-fbx.fbsbx.com.online-metrix.net -h.beta.facebook.com -h.facebook.com -hclinfosystems.m.facebook.com -he-il.facebook.com -help.instagram.com -help.latest.instagram.com -herningrideklub.netscontent-a-ams.xx.fbcdn.net -hi-in.facebook.com -hootsuite.m.facebook.com -hphotos-sea1.fbcdn.net -hr-hr.facebook.com -hs.facebook.com -hu-hu.facebook.com -huawei.facebook.com -hunu.m.facebook.com -hyperlapse.instagram.com -i.instagram.com -id-id.facebook.com -iictt.m.facebook.com -images.ak.instagram.com -info.internet.org -instagram-p15-shv-01-iad3.fbcdn.net -instagram-p3--shv-01-sit4.fbcdn.net -instagram-p3-shv-01-ams3.fbcdn.net -instagram-p3-shv-01-amt2.fbcdn.net -instagram-p3-shv-01-arn2.fbcdn.net -instagram-p3-shv-01-atl3.fbcdn.net -instagram-p3-shv-01-bru2.fbcdn.net -instagram-p3-shv-01-cdg2.fbcdn.net -instagram-p3-shv-01-cdt1.fbcdn.net -instagram-p3-shv-01-dft4.fbcdn.net -instagram-p3-shv-01-dfw1.fbcdn.net -instagram-p3-shv-01-fra3.fbcdn.net -instagram-p3-shv-01-frt3.fbcdn.net -instagram-p3-shv-01-hkg3.fbcdn.net -instagram-p3-shv-01-iad3.fbcdn.net -instagram-p3-shv-01-kut2.fbcdn.net -instagram-p3-shv-01-lax3.fbcdn.net -instagram-p3-shv-01-lga3.fbcdn.net -instagram-p3-shv-01-lhr3.fbcdn.net -instagram-p3-shv-01-mad1.fbcdn.net -instagram-p3-shv-01-mia1.fbcdn.net -instagram-p3-shv-01-mrs1.fbcdn.net -instagram-p3-shv-01-mxp1.fbcdn.net -instagram-p3-shv-01-nrt1.fbcdn.net -instagram-p3-shv-01-ord1.fbcdn.net -instagram-p3-shv-01-ort2.fbcdn.net -instagram-p3-shv-01-sea1.fbcdn.net -instagram-p3-shv-01-sin6.fbcdn.net -instagram-p3-shv-01-sit4.fbcdn.net -instagram-p3-shv-01-sjc2.fbcdn.net -instagram-p3-shv-01-sjc3.fbcdn.net -instagram-p3-shv-01-vie1.fbcdn.net -instagram-p3-shv-01-waw1.fbcdn.net -instagram-p3-shv-01-yyz1.fbcdn.net -instagram-p3-shv-02-dft4.fbcdn.net -instagram-p3-shv-02-frt3.fbcdn.net -instagram-p3-shv-02-fru2.fbcdn.net -instagram-p3-shv-02-lax3.fbcdn.net -instagram-p3-shv-02-ort2.fbcdn.net -instagram-p3-shv-02-sin6.fbcdn.net -instagram-p3-shv-03-dft4.fbcdn.net -instagram-p36-shv-01-mia1.fbcdn.net -instagram-p42-shv-01-iad3.fbcdn.net -instagram-p42-shv-01-lga3.fbcdn.net -instagram-shv-01-ams2.fbcdn.net -instagram-shv-01-ams3.fbcdn.net -instagram-shv-01-ash5.fbcdn.net -instagram-shv-01-atl1.fbcdn.net -instagram-shv-01-bru2.fbcdn.net -instagram-shv-01-cai1.fbcdn.net -instagram-shv-01-cdg2.fbcdn.net -instagram-shv-01-dfw1.fbcdn.net -instagram-shv-01-fra3.fbcdn.net -instagram-shv-01-gru1.fbcdn.net -instagram-shv-01-hkg2.fbcdn.net -instagram-shv-01-iad3.fbcdn.net -instagram-shv-01-kul1.fbcdn.net -instagram-shv-01-lax1.fbcdn.net -instagram-shv-01-lga1.fbcdn.net -instagram-shv-01-lhr3.fbcdn.net -instagram-shv-01-mad1.fbcdn.net -instagram-shv-01-mia1.fbcdn.net -instagram-shv-01-mxp1.fbcdn.net -instagram-shv-01-nrt1.fbcdn.net -instagram-shv-01-ord1.fbcdn.net -instagram-shv-01-sea1.fbcdn.net -instagram-shv-01-sin1.fbcdn.net -instagram-shv-01-sjc2.fbcdn.net -instagram-shv-01-syd1.fbcdn.net -instagram-shv-01-tpe1.fbcdn.net -instagram-shv-01-vie1.fbcdn.net -instagram-shv-02-cai1.fbcdn.net -instagram-shv-02-hkg2.fbcdn.net -instagram-shv-03-ash5.fbcdn.net -instagram-shv-03-atn1.fbcdn.net -instagram-shv-03-hkg1.fbcdn.net -instagram-shv-03-lla1.fbcdn.net -instagram-shv-03-prn2.fbcdn.net -instagram-shv-03-xdc1.fbcdn.net -instagram-shv-04-hkg1.fbcdn.net -instagram-shv-06-atn1.fbcdn.net -instagram-shv-06-lla1.fbcdn.net -instagram-shv-07-ash4.fbcdn.net -instagram-shv-07-frc3.fbcdn.net -instagram-shv-09-frc1.fbcdn.net -instagram-shv-09-lla1.fbcdn.net -instagram-shv-12-frc1.fbcdn.net -instagram-shv-12-frc3.fbcdn.net -instagram-shv-12-lla1.fbcdn.net -instagram-shv-12-prn1.fbcdn.net -instagram-shv-13-frc1.fbcdn.net -instagram-shv-17-prn1.fbcdn.net -instagram-shv-18-prn1.fbcdn.net -instagram.c10r.facebook.com +i.org instagram.com -instagram.facc1-1.fna.fbcdn.net -instagram.fada1-1.fna.fbcdn.net -instagram.fada1-10.fna.fbcdn.net -instagram.faep10-1.fna.fbcdn.net -instagram.fala1-1.fna.fbcdn.net -instagram.fala4-2.fna.fbcdn.net -instagram.fapa1-1.fna.fbcdn.net -instagram.faqa1-1.fna.fbcdn.net -instagram.fatl1-2.fna.fbcdn.net -instagram.fbey10-1.fna.fbcdn.net -instagram.fbfh10-1.fna.fbcdn.net -instagram.fbga1-1.fna.fbcdn.net -instagram.fbkk10-1.fna.fbcdn.net -instagram.fbkk11-1.fna.fbcdn.net -instagram.fbma1-1.fna.fbcdn.net -instagram.fbna1-1.fna.fbcdn.net -instagram.fbna1-2.fna.fbcdn.net -instagram.fbom10-1.fna.fbcdn.net -instagram.fbom11-1.fna.fbcdn.net -instagram.fbsb1-1.fna.fbcdn.net -instagram.fbsb10-1.fna.fbcdn.net -instagram.fbsb11-1.fna.fbcdn.net -instagram.fbtz1-10.fna.fbcdn.net -instagram.fcac1-1.fna.fbcdn.net -instagram.fcbb1-1.fna.fbcdn.net -instagram.fceb1-1.fna.fbcdn.net -instagram.fcgb1-1.fna.fbcdn.net -instagram.fcgh10-1.fna.fbcdn.net -instagram.fcgh11-1.fna.fbcdn.net -instagram.fcgh3-1.fna.fbcdn.net -instagram.fcgk10-1.fna.fbcdn.net -instagram.fcgk9-1.fna.fbcdn.net -instagram.fcmb1-1.fna.fbcdn.net -instagram.fcwb1-1.fna.fbcdn.net -instagram.fdac1-1.fna.fbcdn.net -instagram.fdel11-1.fna.fbcdn.net -instagram.fdla1-1.fna.fbcdn.net -instagram.fdpa1-1.fna.fbcdn.net -instagram.fdsa1-1.fna.fbcdn.net -instagram.fdub1-1.fna.fbcdn.net -instagram.fdxb1-1.fna.fbcdn.net -instagram.ffor10-1.fna.fbcdn.net -instagram.ffor11-1.fna.fbcdn.net -instagram.ffor20-1.fna.fbcdn.net -instagram.fgua1-1.fna.fbcdn.net -instagram.fgva1-1.fna.fbcdn.net -instagram.fgza1-1.fna.fbcdn.net -instagram.fhfa1-1.fna.fbcdn.net -instagram.fiev10-1.fna.fbcdn.net -instagram.fiev11-1.fna.fbcdn.net -instagram.fisb1-1.fna.fbcdn.net -instagram.fiza1-1.fna.fbcdn.net -instagram.fjed2-1.fna.fbcdn.net -instagram.fjib1-1.fna.fbcdn.net -instagram.fjnb1-1.fna.fbcdn.net -instagram.fjpa1-1.fna.fbcdn.net -instagram.fkhi10-1.fna.fbcdn.net -instagram.fkul10-1.fna.fbcdn.net -instagram.fkul11-1.fna.fbcdn.net -instagram.fkwi10-1.fna.fbcdn.net -instagram.fldb1-1.fna.fbcdn.net -instagram.flju2-1.fna.fbcdn.net -instagram.flpb1-1.fna.fbcdn.net -instagram.fmaa1-1.fna.fbcdn.net -instagram.fmdc1-1.fna.fbcdn.net -instagram.fmea1-1.fna.fbcdn.net -instagram.fmel2-1.fna.fbcdn.net -instagram.fmex10-1.fna.fbcdn.net -instagram.fmia1-1.fna.fbcdn.net -instagram.fmnl10-1.fna.fbcdn.net -instagram.fmnl4-3.fna.fbcdn.net -instagram.fpac1-1.fna.fbcdn.net -instagram.fpbc1-1.fna.fbcdn.net -instagram.fpbc2-1.fna.fbcdn.net -instagram.fper2-1.fna.fbcdn.net -instagram.fplu10-1.fna.fbcdn.net -instagram.fplu11-1.fna.fbcdn.net -instagram.fpoa1-1.fna.fbcdn.net -instagram.fpoa10-1.fna.fbcdn.net -instagram.fpoa11-1.fna.fbcdn.net -instagram.fppb1-1.fna.fbcdn.net -instagram.fpra1-1.fna.fbcdn.net -instagram.frec11-1.fna.fbcdn.net -instagram.frix3-1.fna.fbcdn.net -instagram.fsaw1-10.fna.fbcdn.net -instagram.fscl10-1.fna.fbcdn.net -instagram.fscl11-1.fna.fbcdn.net -instagram.fsdu10-1.fna.fbcdn.net -instagram.fsdu11-1.fna.fbcdn.net -instagram.fsea1-1.fna.fbcdn.net -instagram.fssa1-1.fna.fbcdn.net -instagram.fssa10-1.fna.fbcdn.net -instagram.fssa11-1.fna.fbcdn.net -instagram.fsub1-1.fna.fbcdn.net -instagram.fszb1-1.fna.fbcdn.net -instagram.ftpa1-1.fna.fbcdn.net -instagram.fvdc1-1.fna.fbcdn.net -instagram.fvga1-1.fna.fbcdn.net -instagram.fwaw3-1.fna.fbcdn.net -instagram.fyka1-1.fna.fbcdn.net -instagramstatic-a.akamaihd.net -instagramstatic-a.akamaihd.net.edgesuite.net -intern.facebook.com -internet.org -investor.fb.com -inyour.facebook.com -iphone.facebook.com -is-is.facebook.com -it-it.facebook.com -it.facebook.com -ja-jp.facebook.com -ja-ks.facebook.com -jetairways.m.facebook.com -k.connect.facebook.com -ka-ge.facebook.com -ko-kr.connect.facebook.com -ko-kr.facebook.com -kyivstar.m.facebook.com -l.facebook.com -l.instagram.com -landmarkgroup.m.facebook.com -latest.facebook.com -leclerc.m.facebook.com -lists.facebook.com -lithium.facebook.com -live-upload.instagram.com -live.fb.com -liverail.c10r.facebook.com -lm.facebook.com -lntecc.m.facebook.com -lntinfotech.m.facebook.com -logger.instagram.com -login.facebook.com -lookaside.facebook.com -lv-lv.facebook.com -m.facebook.com -m.instagram.com -m.me -mahindra.m.facebook.com -mail.thefacebook.com -maps.instagram.com -mbasic.facebook.com -meli.m.facebook.com +internalfb.com messenger.com -mia1.fbcdn.net -microsoft.m.facebook.com -mietra-de.m.facebook.com -miroglio.m.facebook.com -mm.m.facebook.com -mobile.beta.facebook.com -mobile.facebook.com -moelven.m.facebook.com -mqtt-ig-p4.facebook.com -mqtt-mini.facebook.com -mqtt-p4.facebook.com -mqtt.c10r.facebook.com -mqtt.facebook.com -mqtt.vvv.facebook.com -ms-my.facebook.com -mtouch.facebook.com -national.facebook.com -nb-no.facebook.com -ncontent.xx.fbcdn.net -newsec.facebook.com -newsroom.fb.com -nic.facebook.com -nike.m.facebook.com -nl-nl.facebook.com -nl.facebook.com -nokia.m.facebook.com -norcap.m.facebook.com -noroestecom.m.facebook.com -nova.facebook.com -ns1.facebook.com -ns2.facebook.com -ns3.facebook.com -nsa.facebook.com -ntp.facebook.com -o.beta.facebook.com -o.facebook.com -o.internet.org -ocbc.m.facebook.com -onepublicservice.m.facebook.com -onevedanta.m.facebook.com -orcart.facebook.com -origincache-ash.t.fbcdn.net -origincache-frc.t.fbcdn.net -origincache-kb6-shv-10-frc1.fbcdn.net -origincache-lla.fbcdn.net -origincache-prn.t.fbcdn.net -origincache-shv-04-ash5.fbcdn.net -origincache-tf.t.fbcdn.net -origincache-tl.t.fbcdn.net -origincache-xfa.fbcdn.net -origincache-xla.fbcdn.net -origincache-xtf.fbcdn.net -origincache-xtl.fbcdn.net -origincache-xx-shv-05-atn1.fbcdn.net -origincache-xx-shv-05-frc3.fbcdn.net -origincache-xx-shv-05-prn2.fbcdn.net -origincache-xx-shv-06-ash3.fbcdn.net -origincache-xx-shv-06-ash4.fbcdn.net -origincache-xx-shv-07-ash2.fbcdn.net -origincache-xx-shv-07-atn1.fbcdn.net -origincache-xx-shv-08-ash2.fbcdn.net -origincache-xx-shv-08-frc3.fbcdn.net -origincache-xx-shv-08-prn2.fbcdn.net -origincache-xx-shv-09-frc3.fbcdn.net -origincache-xx-shv-09-prn2.fbcdn.net -origincache-xx-shv-13-prn1.fbcdn.net -our.intern.facebook.com -pa-in.facebook.com -pacific.facebook.com -pernambucanas.m.facebook.com -phabricator.intern.facebook.com -photos-a-ord.xx.fbcdn.net -photos-a.xx.fbcdn.net -photos-b-ord.xx.fbcdn.net -photos-b.xx.fbcdn.net -photos-snc1.fbcdn.net -pixel.facebook.com -pl-pl.facebook.com -platform.foursquare.com -platform.instagram.com -postmaster.facebook.com -preprod.instagram.com -prod.facebook.com -profile-a-atl.xx.fbcdn.net -profile-a-dfw.xx.fbcdn.net -profile-a-iad.xx.fbcdn.net -profile-a-lax.xx.fbcdn.net -profile-a-lga.xx.fbcdn.net -profile-a-mia.xx.fbcdn.net -profile-a-ord.xx.fbcdn.net -profile-a-sea.xx.fbcdn.net -profile-a-sjc.xx.fbcdn.net -profile-a.xx.fbcdn.net -profile-b-dfw.xx.fbcdn.net -profile-b-iad.xx.fbcdn.net -profile-b-lga.xx.fbcdn.net -profile-b-mia.xx.fbcdn.net -profile-b-ord.xx.fbcdn.net -profile-b-sjc.xx.fbcdn.net -profile-b.xx.fbcdn.net -profile.ak.facebook.com.edgesuite.net -profile.ak.fbcdn.net -profile.xx.fbcdn.net -promis.facebook.com -pt-br.facebook.com -pt-pt.facebook.com -rcn.m.facebook.com -rdg.facebook.com -register.facebook.com -rema.m.facebook.com -research.facebook.com -ro-ro.connect.facebook.com -ro-ro.facebook.com -ru-ru.facebook.com -rupload.facebook.com -s-static.ak.facebook.com -s-static.ak.facebook.com.edgekey.net -s-static.facebook.com -sac-h-ct-m-fbx.fbsbx.com.online-metrix.net -savethechildren.m.facebook.com -scontent-1.2914.fna.fbcdn.net -scontent-2.2914.fna.fbcdn.net -scontent-a-ams.xx.fbcdn.net -scontent-a-atl.xx.fbcdn.net -scontent-a-cdg.xx.fbcdn.net -scontent-a-dfw.xx.fbcdn.net -scontent-a-fra.xx.fbcdn.net -scontent-a-gru.xx.fbcdn.net -scontent-a-iad.xx.fbcdn.net -scontent-a-lax.xx.fbcdn.net -scontent-a-lga.xx.fbcdn.net -scontent-a-lhr.xx.fbcdn.net -scontent-a-mad.xx.fbcdn.net -scontent-a-mia.xx.fbcdn.net -scontent-a-mxp.xx.fbcdn.net -scontent-a-ord.xx.fbcdn.net -scontent-a-pao.xx.fbcdn.net -scontent-a-sea.xx.fbcdn.net -scontent-a-sin.xx.fbcdn.net -scontent-a-sjc.xx.fbcdn.net -scontent-a-vie.xx.fbcdn.net -scontent-a.xx.fbcdn.net -scontent-ams.xx.fbcdn.net -scontent-ams3-1.cdninstagram.com -scontent-amt2-1.cdninstagram.com -scontent-amt2-1.xx.fbcdn.net -scontent-arn2-1.cdninstagram.com -scontent-arn2-1.xx.fbcdn.net -scontent-atl.xx.fbcdn.net -scontent-atl3-1.cdninstagram.com -scontent-b-ams.xx.fbcdn.net -scontent-b-atl.xx.fbcdn.net -scontent-b-cdg.xx.fbcdn.net -scontent-b-dfw.xx.fbcdn.net -scontent-b-fra.xx.fbcdn.net -scontent-b-gru.xx.fbcdn.net -scontent-b-hkg.xx.fbcdn.net -scontent-b-lax.xx.fbcdn.net -scontent-b-lga.xx.fbcdn.net -scontent-b-lhr.xx.fbcdn.net -scontent-b-mad.xx.fbcdn.net -scontent-b-mia.xx.fbcdn.net -scontent-b-mxp.xx.fbcdn.net -scontent-b-ord.xx.fbcdn.net -scontent-b-pao.xx.fbcdn.net -scontent-b-sea.xx.fbcdn.net -scontent-b-sin.xx.fbcdn.net -scontent-b-sjc.xx.fbcdn.net -scontent-b-vie.xx.fbcdn.net -scontent-b.xx.fbcdn.net -scontent-bom1-1.xx.fbcdn.net -scontent-c.xx.fbcdn.net -scontent-cdg.xx.fbcdn.net -scontent-cdg2-1.xx.fbcdn.net -scontent-cdt1-1.xx.fbcdn.net -scontent-d.xx.fbcdn.net -scontent-dfw.xx.fbcdn.net -scontent-dfw5-1.xx.fbcdn.net -scontent-e.xx.fbcdn.net -scontent-fra.xx.fbcdn.net -scontent-frt3-1.cdninstagram.com -scontent-frt3-1.xx.fbcdn.net -scontent-frt3-2.xx.fbcdn.net -scontent-frx5-1.xx.fbcdn.net -scontent-gru.xx.fbcdn.net -scontent-hkg3-1.xx.fbcdn.net -scontent-hkg3-2.xx.fbcdn.net -scontent-iad3-1.cdninstagram.com -scontent-iad3-1.xx.fbcdn.net -scontent-icn1-1.xx.fbcdn.net -scontent-lax.xx.fbcdn.net -scontent-lax3-1.xx.fbcdn.net -scontent-lax3-2.xx.fbcdn.net -scontent-lga.xx.fbcdn.net -scontent-lga3-1.xx.fbcdn.net -scontent-lhr.xx.fbcdn.net -scontent-lhr3-1.xx.fbcdn.net -scontent-lht6-1.xx.fbcdn.net -scontent-mia.xx.fbcdn.net -scontent-mxp.xx.fbcdn.net -scontent-nrt1-1.xx.fbcdn.net -scontent-ord.xx.fbcdn.net -scontent-ort2-1.cdninstagram.com -scontent-ort2-2.cdninstagram.com -scontent-otp1-1.xx.fbcdn.net -scontent-sea.xx.fbcdn.net -scontent-sea1-1.cdninstagram.com -scontent-sea1-1.xx.fbcdn.net -scontent-sin.xx.fbcdn.net -scontent-sit4-1.cdninstagram.com -scontent-sit4-1.xx.fbcdn.net -scontent-sjc.xx.fbcdn.net -scontent-sjc2-1.xx.fbcdn.net -scontent-sof1-1.xx.fbcdn.net -scontent-syd2-1.cdninstagram.com -scontent-syd2-1.xx.fbcdn.net -scontent-tpe1-1.xx.fbcdn.net -scontent-vie.xx.fbcdn.net -scontent-vie1-1.xx.fbcdn.net -scontent-waw1-1.xx.fbcdn.net -scontent.cdninstagram.com -scontent.facc1-1.fna.fbcdn.net -scontent.fada1-1.fna.fbcdn.net -scontent.fada1-10.fna.fbcdn.net -scontent.fams1-2.fna.fbcdn.net -scontent.fapa1-1.fna.fbcdn.net -scontent.faqa1-1.fna.fbcdn.net -scontent.fbga1-1.fna.fbcdn.net -scontent.fbkk10-1.fna.fbcdn.net -scontent.fbkk11-1.fna.fbcdn.net -scontent.fbkk2-2.fna.fbcdn.net -scontent.fbkk2-4.fna.fbcdn.net -scontent.fbkk5-2.fna.fbcdn.net -scontent.fbma1-1.fna.fbcdn.net -scontent.fbna1-1.fna.fbcdn.net -scontent.fbom10-1.fna.fbcdn.net -scontent.fbom11-1.fna.fbcdn.net -scontent.fbru2-1.fna.fbcdn.net -scontent.fbsb1-1.fna.fbcdn.net -scontent.fbsb11-1.fna.fbcdn.net -scontent.fbze1-1.fna.fbcdn.net -scontent.fcac1-1.fna.fbcdn.net -scontent.fcbb1-1.fna.fbcdn.net -scontent.fceb1-1.fna.fbcdn.net -scontent.fcgb1-1.fna.fbcdn.net -scontent.fcgh10-1.fna.fbcdn.net -scontent.fcgh11-1.fna.fbcdn.net -scontent.fcgk10-1.fna.fbcdn.net -scontent.fcha1-1.fna.fbcdn.net -scontent.fcia1-1.fna.fbcdn.net -scontent.fcmb1-1.fna.fbcdn.net -scontent.fcpq5-1.fna.fbcdn.net -scontent.fcwb1-1.fna.fbcdn.net -scontent.fdac1-1.fna.fbcdn.net -scontent.fdac24-1.fna.fbcdn.net -scontent.fdel10-1.fna.fbcdn.net -scontent.fdel11-1.fna.fbcdn.net -scontent.fdla1-1.fna.fbcdn.net -scontent.fdnk1-1.fna.fbcdn.net -scontent.fdpa1-1.fna.fbcdn.net -scontent.fdsa1-1.fna.fbcdn.net -scontent.fdxb1-1.fna.fbcdn.net -scontent.febb1-1.fna.fbcdn.net -scontent.feoh1-1.fna.fbcdn.net -scontent.ffco3-1.fna.fbcdn.net -scontent.ffor10-1.fna.fbcdn.net -scontent.ffor11-1.fna.fbcdn.net -scontent.ffru1-1.fna.fbcdn.net -scontent.fgdl5-1.fna.fbcdn.net -scontent.fgua1-1.fna.fbcdn.net -scontent.fhel1-1.fna.fbcdn.net -scontent.fhel2-1.fna.fbcdn.net -scontent.fhel5-1.fna.fbcdn.net -scontent.fhen1-1.fna.fbcdn.net -scontent.fhfa1-1.fna.fbcdn.net -scontent.fhkg10-1.fna.fbcdn.net -scontent.fhkg2-1.fna.fbcdn.net -scontent.fhkg4-2.fna.fbcdn.net -scontent.fiev1-1.fna.fbcdn.net -scontent.fiev10-1.fna.fbcdn.net -scontent.fiev11-1.fna.fbcdn.net -scontent.fiev6-1.fna.fbcdn.net -scontent.fiev8-1.fna.fbcdn.net -scontent.fisb1-1.fna.fbcdn.net -scontent.fisb5-1.fna.fbcdn.net -scontent.fjib1-1.fna.fbcdn.net -scontent.fjnb1-1.fna.fbcdn.net -scontent.fjnb3-1.fna.fbcdn.net -scontent.fjpa1-1.fna.fbcdn.net -scontent.fkgf1-1.fna.fbcdn.net -scontent.fkhi10-1.fna.fbcdn.net -scontent.fkul10-1.fna.fbcdn.net -scontent.fkul11-1.fna.fbcdn.net -scontent.fkul4-1.fna.fbcdn.net -scontent.fkul8-1.fna.fbcdn.net -scontent.fkwi10-1.fna.fbcdn.net -scontent.flim1-2.fna.fbcdn.net -scontent.flim10-1.fna.fbcdn.net -scontent.flis1-1.fna.fbcdn.net -scontent.flpb1-1.fna.fbcdn.net -scontent.flwo1-1.fna.fbcdn.net -scontent.fmaa1-1.fna.fbcdn.net -scontent.fmba1-1.fna.fbcdn.net -scontent.fmdc1-1.fna.fbcdn.net -scontent.fmea1-1.fna.fbcdn.net -scontent.fmex10-1.fna.fbcdn.net -scontent.fmex11-1.fna.fbcdn.net -scontent.fmex5-1.fna.fbcdn.net -scontent.fmex8-2.fna.fbcdn.net -scontent.fmga1-1.fna.fbcdn.net -scontent.fmia1-1.fna.fbcdn.net -scontent.fmla1-1.fna.fbcdn.net -scontent.fmnl10-1.fna.fbcdn.net -scontent.fmnl11-1.fna.fbcdn.net -scontent.fmnl4-4.fna.fbcdn.net -scontent.fmnl6-1.fna.fbcdn.net -scontent.fosl1-1.fna.fbcdn.net -scontent.fpac1-1.fna.fbcdn.net -scontent.fpbc1-1.fna.fbcdn.net -scontent.fpbc2-1.fna.fbcdn.net -scontent.fpfb1-1.fna.fbcdn.net -scontent.fphl2-2.fna.fbcdn.net -scontent.fplu10-1.fna.fbcdn.net -scontent.fplu11-1.fna.fbcdn.net -scontent.fpoa1-1.fna.fbcdn.net -scontent.fpoa10-1.fna.fbcdn.net -scontent.fpoa11-1.fna.fbcdn.net -scontent.fpra1-1.fna.fbcdn.net -scontent.fqls1-1.fna.fbcdn.net -scontent.fqpa1-1.fna.fbcdn.net -scontent.frec10-1.fna.fbcdn.net -scontent.frec11-1.fna.fbcdn.net -scontent.fria1-1.fna.fbcdn.net -scontent.fsaw1-10.fna.fbcdn.net -scontent.fscl10-1.fna.fbcdn.net -scontent.fscl11-1.fna.fbcdn.net -scontent.fsdu10-1.fna.fbcdn.net -scontent.fsdu11-1.fna.fbcdn.net -scontent.fsea1-1.fna.fbcdn.net -scontent.fsjc1-2.fna.fbcdn.net -scontent.fsjo1-1.fna.fbcdn.net -scontent.fsnc1-1.fna.fbcdn.net -scontent.fssa1-1.fna.fbcdn.net -scontent.fssa10-1.fna.fbcdn.net -scontent.fssa11-1.fna.fbcdn.net -scontent.fsst1-2.fna.fbcdn.net -scontent.fsub1-1.fna.fbcdn.net -scontent.fszb1-1.fna.fbcdn.net -scontent.ftbs1-1.fna.fbcdn.net -scontent.ftbs4-1.fna.fbcdn.net -scontent.ftpa1-1.fna.fbcdn.net -scontent.ftpa1-2.fna.fbcdn.net -scontent.ftpe3-2.fna.fbcdn.net -scontent.ftpe4-1.fna.fbcdn.net -scontent.ftpe7-3.fna.fbcdn.net -scontent.ftpe7-4.fna.fbcdn.net -scontent.ftun3-1.fna.fbcdn.net -scontent.fuln6-1.fna.fbcdn.net -scontent.fvca1-1.fna.fbcdn.net -scontent.fwaw5-1.fna.fbcdn.net -scontent.fwbw1-1.fna.fbcdn.net -scontent.fybz2-2.fna.fbcdn.net -scontent.fymy1-2.fna.fbcdn.net -scontent.xx.fbcdn.net -scotiabank.m.facebook.com -secure-media-snc1.fbcdn.net -secure-media.fbcdn.net -secure.facebook.com -secure.instagram.com -secure.latest.instagram.com -sitel.m.facebook.com -sk-sk.facebook.com -ski.m.facebook.com -snaptu-d-shv-05-frc3.facebook.com -snaptu-d-shv-10-frc1.facebook.com -snaptu-mini.facebook.com -snaptu-p1.facebook.com -snaptu-p2.facebook.com -softtech.m.facebook.com -sok.m.facebook.com -sonar-iad.xx.fbcdn.net -sonar.fbsb1-1.fna.fbcdn.net -sonar.fgua1-1.fna.fbcdn.net -sonar.fmaa1-1.fna.fbcdn.net -sonar.fqls1-1.fna.fbcdn.net -sonar.fsea1-1.fna.fbcdn.net -sonar.ftpa1-1.fna.fbcdn.net -sphotos-a-ams.xx.fbcdn.net -sphotos-a-atl.xx.fbcdn.net -sphotos-a-cdg.xx.fbcdn.net -sphotos-a-dfw.xx.fbcdn.net -sphotos-a-iad.xx.fbcdn.net -sphotos-a-lax.xx.fbcdn.net -sphotos-a-lga.xx.fbcdn.net -sphotos-a-lhr.xx.fbcdn.net -sphotos-a-mad.xx.fbcdn.net -sphotos-a-mia.xx.fbcdn.net -sphotos-a-mxp.xx.fbcdn.net -sphotos-a-ord.xx.fbcdn.net -sphotos-a-pao.xx.fbcdn.net -sphotos-a-sea.xx.fbcdn.net -sphotos-a-sjc.xx.fbcdn.net -sphotos-a-vie.xx.fbcdn.net -sphotos-a.ak.fbcdn.net -sphotos-a.xx.fbcdn.net -sphotos-b-ams.xx.fbcdn.net -sphotos-b-atl.xx.fbcdn.net -sphotos-b-cdg.xx.fbcdn.net -sphotos-b-dfw.xx.fbcdn.net -sphotos-b-iad.xx.fbcdn.net -sphotos-b-lax.xx.fbcdn.net -sphotos-b-lga.xx.fbcdn.net -sphotos-b-lhr.xx.fbcdn.net -sphotos-b-mad.xx.fbcdn.net -sphotos-b-mia.xx.fbcdn.net -sphotos-b-mxp.xx.fbcdn.net -sphotos-b-ord.xx.fbcdn.net -sphotos-b-pao.xx.fbcdn.net -sphotos-b-sea.xx.fbcdn.net -sphotos-b-sjc.xx.fbcdn.net -sphotos-b-vie.xx.fbcdn.net -sphotos-b.xx.fbcdn.net -sphotos-h.ak.fbcdn.net -sphotos.ak.fbcdn.net -sphotos.xx.fbcdn.net -sphotosbord.xx.fbcdn.net -sr-rs.facebook.com -srt.m.facebook.com -ssl.facebook.com -stanleyblackanddecker.m.facebook.com -star-mini.c10r.facebook.com -star.c10r.facebook.com -star.facebook.com -static.addtoany.com -static.ak.connect.facebook.com -static.ak.facebook.com -static.ak.facebook.com.edgesuite.net -static.ak.fbcdn.net -static.ak.instagram.com -static.facebook.com -static.fdel11-1.fna.fbcdn.net -static.fsea1-1.fna.fbcdn.net -static.hootsuite.com -static.xx.fbcdn.net -staticxx.facebook.com -stormberg.m.facebook.com -streaming-graph.facebook.com -sv-se.facebook.com -ta-in.facebook.com -te-in.facebook.com -teem.m.facebook.com -telegraph-ash.instagram.com -telenor.m.facebook.com -th-th.facebook.com -thefacebook.com -timbrasil.m.facebook.com -tl-ph.facebook.com -touch.facebook.com -tr-tr.facebook.com -tr.facebook.com -trocglobal.m.facebook.com -uk2group.m.facebook.com -unicreativearts.m.facebook.com -upload-ec2.instagram.com -upload.facebook.com -upload.instagram.com -ur-pk.facebook.com -ustglobal.m.facebook.com -v4help.facebook.com -venteprivee.m.facebook.com -vi-vn.connect.facebook.com -vi-vn.facebook.com -vi-vn.o.facebook.com -video-hkg3-1.xx.fbcdn.net -video-iad3-1.xx.fbcdn.net -video-sof1-1.xx.fbcdn.net -video.facc1-1.fna.fbcdn.net -video.fada1-10.fna.fbcdn.net -video.fapa1-1.fna.fbcdn.net -video.faqa1-1.fna.fbcdn.net -video.fbga1-1.fna.fbcdn.net -video.fbkk10-1.fna.fbcdn.net -video.fbru2-1.fna.fbcdn.net -video.fbsb1-1.fna.fbcdn.net -video.fcbb1-1.fna.fbcdn.net -video.fceb1-1.fna.fbcdn.net -video.fcgh10-1.fna.fbcdn.net -video.fcgh11-1.fna.fbcdn.net -video.fcmb1-1.fna.fbcdn.net -video.fdac1-1.fna.fbcdn.net -video.fdac24-1.fna.fbcdn.net -video.fdel11-1.fna.fbcdn.net -video.fdxb1-1.fna.fbcdn.net -video.fevn1-1.fna.fbcdn.net -video.ffjr1-3.fna.fbcdn.net -video.ffor10-1.fna.fbcdn.net -video.ffor11-1.fna.fbcdn.net -video.fhfa1-1.fna.fbcdn.net -video.fiev10-1.fna.fbcdn.net -video.fjpa1-1.fna.fbcdn.net -video.fkhi10-1.fna.fbcdn.net -video.flpb1-1.fna.fbcdn.net -video.fmaa1-1.fna.fbcdn.net -video.fmdc1-1.fna.fbcdn.net -video.fmex10-1.fna.fbcdn.net -video.fmia1-1.fna.fbcdn.net -video.fmla1-1.fna.fbcdn.net -video.fmnl10-1.fna.fbcdn.net -video.fphx1-1.fbcdn.net -video.fpoa1-1.fna.fbcdn.net -video.fpoa10-1.fna.fbcdn.net -video.fpoa11-1.fna.fbcdn.net -video.fpra1-1.fna.fbcdn.net -video.fria1-1.fna.fbcdn.net -video.fsaw1-10.fna.fbcdn.net -video.fscl10-1.fna.fbcdn.net -video.fscl11-1.fna.fbcdn.net -video.fsdu10-1.fna.fbcdn.net -video.fsdu11-1.fna.fbcdn.net -video.fsea1-1.fna.fbcdn.net -video.fsnc1-1.fna.fbcdn.net -video.fssa1-1.fna.fbcdn.net -video.fssa10-1.fna.fbcdn.net -video.ftpa1-1.fna.fbcdn.net -video.fvit1-1.fna.fbcdn.net -video.xx.fbcdn.net -vpn.tfbnw.net -vthumb.xx.fbcdn.net -vupload.facebook.com -w.facebook.com -watchdog.energized.pro -web.beta.facebook.com -web.facebook.com -webdav.facebook.com -white.instagram.com -white.ish.instagram.com -wooga.m.facebook.com -work-98949980.facebook.com -ww.facebook.com -www.connect.facebook.net -www.facebook.com -www.facebook.de -www.facebook.fr -www.fbcdn.com -www.fbcdn.net -www.graph.facebook.com -www.instagram.com -www.login.facebook.com -www.prod.facebook.com -www.s-static.ak.facebook.com -www.static.ak.connect.facebook.com -www.static.ak.fbcdn.net -www.thefacebook.com -www2.facebook.com -wwww.facebook.com -x.facebook.com -xx-fbcdn-ecmp-02-atl1.fbcdn.net -xx-fbcdn-ecmp-02-ord1.fbcdn.net -xx-fbcdn-ecmp-04-sjc1.fbcdn.net -xx-fbcdn-ecmp-05-iad1.fbcdn.net -xx-fbcdn-shv-01-ams2.fbcdn.net -xx-fbcdn-shv-01-ams3.fbcdn.net -xx-fbcdn-shv-01-amt2.fbcdn.net -xx-fbcdn-shv-01-arn2.fbcdn.net -xx-fbcdn-shv-01-ash5.fbcdn.net -xx-fbcdn-shv-01-atl1.fbcdn.net -xx-fbcdn-shv-01-atl3.fbcdn.net -xx-fbcdn-shv-01-bog1.fbcdn.net -xx-fbcdn-shv-01-bom1.fbcdn.net -xx-fbcdn-shv-01-bru2.fbcdn.net -xx-fbcdn-shv-01-cai1.fbcdn.net -xx-fbcdn-shv-01-cdg2.fbcdn.net -xx-fbcdn-shv-01-dft4.fbcdn.net -xx-fbcdn-shv-01-dfw1.fbcdn.net -xx-fbcdn-shv-01-dfw5.fbcdn.net -xx-fbcdn-shv-01-eze1.fbcdn.net -xx-fbcdn-shv-01-fra3.fbcdn.net -xx-fbcdn-shv-01-frt3.fbcdn.net -xx-fbcdn-shv-01-gru1.fbcdn.net -xx-fbcdn-shv-01-gru2.fbcdn.net -xx-fbcdn-shv-01-hkg1.fbcdn.net -xx-fbcdn-shv-01-hkg2.fbcdn.net -xx-fbcdn-shv-01-hkg3.fbcdn.net -xx-fbcdn-shv-01-iad3.fbcdn.net -xx-fbcdn-shv-01-icn1.fbcdn.net -xx-fbcdn-shv-01-kul1.fbcdn.net -xx-fbcdn-shv-01-kut2.fbcdn.net -xx-fbcdn-shv-01-lax1.fbcdn.net -xx-fbcdn-shv-01-lax3.fbcdn.net -xx-fbcdn-shv-01-lga1.fbcdn.net -xx-fbcdn-shv-01-lga3.fbcdn.net -xx-fbcdn-shv-01-lhr3.fbcdn.net -xx-fbcdn-shv-01-lht6.fbcdn.net -xx-fbcdn-shv-01-mad1.fbcdn.net -xx-fbcdn-shv-01-mia1.fbcdn.net -xx-fbcdn-shv-01-mia3.fbcdn.net -xx-fbcdn-shv-01-mrs1.fbcdn.net -xx-fbcdn-shv-01-mxp1.fbcdn.net -xx-fbcdn-shv-01-nrt1.fbcdn.net -xx-fbcdn-shv-01-ord1.fbcdn.net -xx-fbcdn-shv-01-ort2.fbcdn.net -xx-fbcdn-shv-01-scl1.fbcdn.net -xx-fbcdn-shv-01-sea1.fbcdn.net -xx-fbcdn-shv-01-sin1.fbcdn.net -xx-fbcdn-shv-01-sin6.fbcdn.net -xx-fbcdn-shv-01-sit4.fbcdn.net -xx-fbcdn-shv-01-sjc2.fbcdn.net -xx-fbcdn-shv-01-syd2.fbcdn.net -xx-fbcdn-shv-01-tpe1.fbcdn.net -xx-fbcdn-shv-01-vie1.fbcdn.net -xx-fbcdn-shv-01-waw1.fbcdn.net -xx-fbcdn-shv-01-yyz1.fbcdn.net -xx-fbcdn-shv-02-ams2.fbcdn.net -xx-fbcdn-shv-02-cai1.fbcdn.net -xx-fbcdn-shv-02-dft4.fbcdn.net -xx-fbcdn-shv-02-frt3.fbcdn.net -xx-fbcdn-shv-02-hkg1.fbcdn.net -xx-fbcdn-shv-02-hkg3.fbcdn.net -xx-fbcdn-shv-02-lax3.fbcdn.net -xx-fbcdn-shv-02-mia1.fbcdn.net -xx-fbcdn-shv-02-mia3.fbcdn.net -xx-fbcdn-shv-02-ord1.fbcdn.net -xx-fbcdn-shv-02-ort2.fbcdn.net -xx-fbcdn-shv-02-sin6.fbcdn.net -xx-fbcdn-shv-03-ash5.fbcdn.net -xx-fbcdn-shv-03-atn1.fbcdn.net -xx-fbcdn-shv-03-lax1.fbcdn.net -xx-fbcdn-shv-03-sin1.fbcdn.net -xx-fbcdn-shv-04-hkg1.fbcdn.net -xx-fbcdn-shv-04-lax1.fbcdn.net -xx-fbcdn-shv-04-prn2.fbcdn.net -xx-fbcdn-shv-04-sjc1.fbcdn.net -xx-fbcdn-shv-05-dfw1.fbcdn.net -xx-fbcdn-shv-05-iad1.fbcdn.net -xx-fbcdn-shv-05-mia1.fbcdn.net -xx-fbcdn-shv-06-dfw1.fbcdn.net -xx-fbcdn-shv-06-lga1.fbcdn.net -xx-fbcdn-shv-11-lhr3.fbcdn.net -xx-fbcdn6-shv-01-atl3.fbcdn.net -xx-fbcdn6-shv-01-lax3.fbcdn.net -z-1-external.fsea1-1.fna.fbcdn.net -z-1-scontent-sjc2-1.xx.fbcdn.net -z-1-scontent.fmaa1-1.fna.fbcdn.net -z-1-scontent.fpoa10-1.fna.fbcdn.net -z-1-scontent.xx.fbcdn.net -z-1-video.fpoa10-1.fna.fbcdn.net -z-1-video.fszb1-1.fna.fbcdn.net -z-1.c10r.facebook.com -z-1.facebook.com -z-m-api.facebook.com -z-m-fbcdn-mini-shv-01-ord1.fbcdn.net -z-m-fbcdn-shv-01-frt3.fbcdn.net -z-m-graph.facebook.com -z-m-scontent-ams.xx.fbcdn.net -z-m-scontent-amt.xx.fbcdn.net -z-m-scontent-arn.xx.fbcdn.net -z-m-scontent-atl.xx.fbcdn.net -z-m-scontent-bog.xx.fbcdn.net -z-m-scontent-bom.xx.fbcdn.net -z-m-scontent-bru.xx.fbcdn.net -z-m-scontent-cai.xx.fbcdn.net -z-m-scontent-cdg.xx.fbcdn.net -z-m-scontent-cdt.xx.fbcdn.net -z-m-scontent-dft.xx.fbcdn.net -z-m-scontent-eze.xx.fbcdn.net -z-m-scontent-frt.xx.fbcdn.net -z-m-scontent-gru.xx.fbcdn.net -z-m-scontent-hkg.xx.fbcdn.net -z-m-scontent-iad.xx.fbcdn.net -z-m-scontent-icn.xx.fbcdn.net -z-m-scontent-kut.xx.fbcdn.net -z-m-scontent-lax.xx.fbcdn.net -z-m-scontent-lga.xx.fbcdn.net -z-m-scontent-lhr.xx.fbcdn.net -z-m-scontent-lht.xx.fbcdn.net -z-m-scontent-mad.xx.fbcdn.net -z-m-scontent-mia.xx.fbcdn.net -z-m-scontent-mrs.xx.fbcdn.net -z-m-scontent-mxp.xx.fbcdn.net -z-m-scontent-nrt.xx.fbcdn.net -z-m-scontent-ort.xx.fbcdn.net -z-m-scontent-scl.xx.fbcdn.net -z-m-scontent-sin.xx.fbcdn.net -z-m-scontent-sit.xx.fbcdn.net -z-m-scontent-sjc.xx.fbcdn.net -z-m-scontent-sof.xx.fbcdn.net -z-m-scontent-syd.xx.fbcdn.net -z-m-scontent-tpe.xx.fbcdn.net -z-m-scontent-vie.xx.fbcdn.net -z-m-scontent-waw.xx.fbcdn.net -z-m-scontent-yyz.xx.fbcdn.net -z-m-scontent.fceb1-1.fna.fbcdn.net -z-m-scontent.fdac1-1.fna.fbcdn.net -z-m-scontent.fmex10-1.fna.fbcdn.net -z-m-scontent.xx.fbcdn.net -z-m-static-ams.xx.fbcdn.net -z-m-static-amt.xx.fbcdn.net -z-m-static-arn.xx.fbcdn.net -z-m-static-atl.xx.fbcdn.net -z-m-static-bog.xx.fbcdn.net -z-m-static-bom.xx.fbcdn.net -z-m-static-bru.xx.fbcdn.net -z-m-static-cai.xx.fbcdn.net -z-m-static-cdg.xx.fbcdn.net -z-m-static-cdt.xx.fbcdn.net -z-m-static-dft.xx.fbcdn.net -z-m-static-eze.xx.fbcdn.net -z-m-static-frt.xx.fbcdn.net -z-m-static-gru.xx.fbcdn.net -z-m-static-hkg.xx.fbcdn.net -z-m-static-iad.xx.fbcdn.net -z-m-static-icn.xx.fbcdn.net -z-m-static-kut.xx.fbcdn.net -z-m-static-lax.xx.fbcdn.net -z-m-static-lga.xx.fbcdn.net -z-m-static-lhr.xx.fbcdn.net -z-m-static-lht.xx.fbcdn.net -z-m-static-mad.xx.fbcdn.net -z-m-static-mia.xx.fbcdn.net -z-m-static-mrs.xx.fbcdn.net -z-m-static-mxp.xx.fbcdn.net -z-m-static-nrt.xx.fbcdn.net -z-m-static-ort.xx.fbcdn.net -z-m-static-scl.xx.fbcdn.net -z-m-static-sin.xx.fbcdn.net -z-m-static-sit.xx.fbcdn.net -z-m-static-sjc.xx.fbcdn.net -z-m-static-sof.xx.fbcdn.net -z-m-static-syd.xx.fbcdn.net -z-m-static-tpe.xx.fbcdn.net -z-m-static-vie.xx.fbcdn.net -z-m-static-waw.xx.fbcdn.net -z-m-static-yyz.xx.fbcdn.net -z-m-static.xx.fbcdn.net -z-m-video-ams.xx.fbcdn.net -z-m-video-amt.xx.fbcdn.net -z-m-video-arn.xx.fbcdn.net -z-m-video-atl.xx.fbcdn.net -z-m-video-bog.xx.fbcdn.net -z-m-video-bom.xx.fbcdn.net -z-m-video-bru.xx.fbcdn.net -z-m-video-cai.xx.fbcdn.net -z-m-video-cdg.xx.fbcdn.net -z-m-video-cdt.xx.fbcdn.net -z-m-video-dft.xx.fbcdn.net -z-m-video-eze.xx.fbcdn.net -z-m-video-frt.xx.fbcdn.net -z-m-video-gru.xx.fbcdn.net -z-m-video-hkg.xx.fbcdn.net -z-m-video-iad.xx.fbcdn.net -z-m-video-icn.xx.fbcdn.net -z-m-video-kut.xx.fbcdn.net -z-m-video-lax.xx.fbcdn.net -z-m-video-lga.xx.fbcdn.net -z-m-video-lhr.xx.fbcdn.net -z-m-video-lht.xx.fbcdn.net -z-m-video-mad.xx.fbcdn.net -z-m-video-mia.xx.fbcdn.net -z-m-video-mrs.xx.fbcdn.net -z-m-video-mxp.xx.fbcdn.net -z-m-video-nrt.xx.fbcdn.net -z-m-video-ort.xx.fbcdn.net -z-m-video-scl.xx.fbcdn.net -z-m-video-sin.xx.fbcdn.net -z-m-video-sit.xx.fbcdn.net -z-m-video-sjc.xx.fbcdn.net -z-m-video-sof.xx.fbcdn.net -z-m-video-syd.xx.fbcdn.net -z-m-video-tpe.xx.fbcdn.net -z-m-video-vie.xx.fbcdn.net -z-m-video-waw.xx.fbcdn.net -z-m-video-yyz.xx.fbcdn.net -z-m-www.facebook.com -z-m.c10r.facebook.com -z-m.facebook.com -z-p1-api.facebook.com -z-p1-graph.facebook.com -z-p1-upload.facebook.com -z-p1.facebook.com -z-p15.graph.instagram.com -z-p15.i.instagram.com -z-p3-api.facebook.com -z-p3-external.fmdc1-1.fna.fbcdn.net -z-p3-external.fsdu11-1.fna.fbcdn.net -z-p3-external.fsea1-1.fna.fbcdn.net -z-p3-graph.facebook.com -z-p3-rupload.facebook.com -z-p3-scontent-lax3-1.xx.fbcdn.net -z-p3-scontent.facc1-1.fna.fbcdn.net -z-p3-scontent.faqa1-1.fna.fbcdn.net -z-p3-scontent.fbga1-1.fna.fbcdn.net -z-p3-scontent.fbsb1-1.fna.fbcdn.net -z-p3-scontent.fbsb11-1.fna.fbcdn.net -z-p3-scontent.fcgh11-1.fna.fbcdn.net -z-p3-scontent.fdac1-1.fna.fbcdn.net -z-p3-scontent.fdxb1-1.fna.fbcdn.net -z-p3-scontent.ffor10-1.fna.fbcdn.net -z-p3-scontent.ffor11-1.fna.fbcdn.net -z-p3-scontent.fjpa1-1.fna.fbcdn.net -z-p3-scontent.fmga1-1.fna.fbcdn.net -z-p3-scontent.fmnl10-1.fna.fbcdn.net -z-p3-scontent.fpfb1-1.fna.fbcdn.net -z-p3-scontent.fplu11-1.fna.fbcdn.net -z-p3-scontent.frec11-1.fna.fbcdn.net -z-p3-scontent.fsdu10-1.fna.fbcdn.net -z-p3-scontent.fsdu11-1.fna.fbcdn.net -z-p3-scontent.fsea1-1.fna.fbcdn.net -z-p3-scontent.fsub1-1.fna.fbcdn.net -z-p3-scontent.ftpa1-1.fna.fbcdn.net -z-p3-upload.facebook.com -z-p3-video-vie1-1.xx.fbcdn.net -z-p3-video.flpb1-1.fna.fbcdn.net -z-p3-video.fpfb1-1.fna.fbcdn.net -z-p3-video.fsea1-1.fna.fbcdn.net -z-p3.facebook.com -z-p3.www.instagram.com -z-p4-api.facebook.com -z-p4-graph.facebook.com -z-p4-rupload.facebook.com -z-p4-upload.facebook.com -z-p4.facebook.com -z-p4.graph.instagram.com -z-p4.i.instagram.com -z-p4.upload.instagram.com -z-p4.www.instagram.com -z-p42.graph.instagram.com -z-upload.facebook.com -z.facebook.com -zero.beta.facebook.com -zero.facebook.com -zero.freebasics.com -zero.internet.org -zh-cn.connect.facebook.com -zh-cn.facebook.com -zh-hk.facebook.com -zh-tw.facebook.com +internet.org +workplace.com diff --git a/slips_files/organizations_info/facebook_ip_ranges b/slips_files/organizations_info/facebook_ip_ranges new file mode 100644 index 000000000..ff179cd8d --- /dev/null +++ b/slips_files/organizations_info/facebook_ip_ranges @@ -0,0 +1,81 @@ +31.13.24.0/21 +31.13.64.0/18 +45.64.40.0/22 +57.141.0.0/20 +57.141.16.0/22 +57.141.20.0/23 +57.144.0.0/14 +66.220.144.0/20 +69.63.176.0/20 +69.171.224.0/19 +74.119.76.0/22 +102.132.96.0/19 +102.221.188.0/22 +103.4.96.0/22 +129.134.0.0/16 +147.75.208.0/20 +157.240.0.0/16 +163.70.128.0/17 +163.77.128.0/17 +163.114.128.0/20 +173.252.64.0/18 +179.60.192.0/22 +185.60.216.0/22 +185.89.216.0/22 +189.233.203.0/24 +189.233.216.0/24 +189.247.40.0/24 +189.247.50.0/24 +189.247.71.0/24 +196.49.68.0/23 +199.201.64.0/22 +204.15.20.0/22 +2401:db00::/32 +2620:0:1c00::/40 +2620:10d:c090::/44 +2803:6080::/29 +2806:1050:cbff::/48 +2806:1090:cbff::/48 +2806:10a0:cbff::/48 +2a03:2880::/31 +2a03:2887:ff00::/48 +2a03:2887:ff02::/47 +2a03:2887:ff04::/46 +2a03:2887:ff08::/47 +2a03:2887:ff0a::/48 +2a03:2887:ff18::/47 +2a03:2887:ff1b::/48 +2a03:2887:ff1c::/46 +2a03:2887:ff20::/46 +2a03:2887:ff24::/47 +2a03:2887:ff27::/48 +2a03:2887:ff28::/45 +2a03:2887:ff30::/48 +2a03:2887:ff33::/48 +2a03:2887:ff35::/48 +2a03:2887:ff36::/47 +2a03:2887:ff38::/46 +2a03:2887:ff3f::/48 +2a03:2887:ff40::/46 +2a03:2887:ff44::/47 +2a03:2887:ff48::/46 +2a03:2887:ff4d::/48 +2a03:2887:ff4e::/47 +2a03:2887:ff50::/45 +2a03:2887:ff58::/47 +2a03:2887:ff5a::/48 +2a03:2887:ff5f::/48 +2a03:2887:ff60::/45 +2a03:2887:ff68::/46 +2a03:2887:ff6f::/48 +2a03:2887:ff70::/46 +2a03:83e0::/32 +2a10:f781:10:cee0::/64 +2c0f:ef78::/47 +2c0f:ef78:3::/48 +2c0f:ef78:5::/48 +2c0f:ef78:6::/48 +2c0f:ef78:9::/48 +2c0f:ef78:c::/46 +2c0f:ef78:10::/47 +2c0f:ef78:12::/48 diff --git a/slips_files/organizations_info/google b/slips_files/organizations_info/google deleted file mode 100644 index 60176cdf7..000000000 --- a/slips_files/organizations_info/google +++ /dev/null @@ -1,7808 +0,0 @@ -104.154.113.0/24 -74.125.250.0/24 -104.154.114.0/23 -104.154.116.0/22 -104.154.120.0/23 -104.154.128.0/17 -104.154.16.0/20 -104.154.32.0/19 -104.154.64.0/19 -104.154.96.0/20 -104.155.0.0/17 -104.155.128.0/18 -104.155.192.0/19 -104.155.224.0/20 -104.196.0.0/18 -104.196.128.0/17 -104.196.65.0/24 -104.196.66.0/23 -104.196.68.0/22 -104.196.96.0/19 -104.197.0.0/16 -104.198.0.0/16 -104.199.0.0/18 -104.199.128.0/18 -104.199.192.0/19 -104.199.224.0/20 -104.199.242.0/23 -104.199.244.0/22 -104.199.248.0/21 -104.199.66.0/23 -104.199.68.0/22 -104.199.72.0/21 -104.199.80.0/20 -104.199.96.0/19 -107.167.160.0/19 -107.178.208.0/20 -107.178.240.0/20 -108.59.80.0/20 -130.211.128.0/17 -130.211.16.0/20 -130.211.32.0/19 -130.211.4.0/22 -130.211.64.0/18 -130.211.8.0/21 -146.148.16.0/20 -146.148.2.0/23 -146.148.32.0/19 -146.148.4.0/22 -146.148.64.0/18 -146.148.8.0/21 -162.216.148.0/22 -162.222.176.0/21 -173.255.112.0/20 -192.158.28.0/22 -199.192.115.0/24 -199.223.232.0/22 -199.223.236.0/24 -23.236.48.0/20 -23.251.128.0/19 -2600:1901:1:1000::/52 -2600:1901:1:2000::/51 -2600:1901:1:4000::/50 -2600:1901:1:8000::/49 -2600:1901::/48 -34.100.128.0/17 -34.101.128.0/17 -34.101.18.0/24 -34.101.20.0/22 -34.101.24.0/22 -34.101.64.0/18 -34.102.0.0/16 -34.104.128.0/17 -34.104.27.0/24 -34.104.49.0/24 -34.104.50.0/23 -34.104.52.0/24 -34.104.58.0/23 -34.104.60.0/22 -34.104.64.0/18 -34.105.0.0/16 -34.106.0.0/15 -34.108.0.0/16 -34.110.128.0/17 -34.110.8.0/24 -34.111.0.0/16 -34.116.0.0/21 -34.116.128.0/17 -34.116.64.0/18 -34.117.0.0/16 -34.118.0.0/17 -34.120.0.0/14 -34.124.0.0/18 -34.124.112.0/20 -34.124.128.0/17 -34.125.0.0/16 -34.126.128.0/18 -34.126.192.0/19 -34.126.64.0/18 -34.127.0.0/17 -34.127.177.0/24 -34.127.178.0/23 -34.127.180.0/24 -34.127.186.0/23 -34.127.188.0/22 -34.129.0.0/16 -34.130.0.0/15 -34.132.0.0/14 -34.136.0.0/14 -34.140.0.0/15 -34.142.0.0/17 -34.145.0.0/16 -34.146.0.0/15 -34.148.0.0/14 -34.152.0.0/18 -34.157.0.0/21 -34.157.128.0/21 -34.157.144.0/20 -34.157.16.0/20 -34.157.164.0/22 -34.157.168.0/22 -34.157.176.0/20 -34.157.192.0/20 -34.157.36.0/22 -34.157.40.0/22 -34.157.48.0/20 -34.157.64.0/20 -34.159.0.0/16 -34.168.0.0/14 -34.172.0.0/15 -34.176.0.0/16 -34.64.128.0/17 -34.64.64.0/18 -34.65.0.0/16 -34.66.0.0/15 -34.68.0.0/14 -34.72.0.0/13 -34.80.0.0/12 -34.96.128.0/17 -34.96.64.0/18 -34.97.0.0/16 -34.98.128.0/21 -34.98.64.0/18 -35.184.0.0/15 -35.186.0.0/16 -35.187.0.0/17 -35.187.144.0/20 -35.187.160.0/19 -35.187.192.0/18 -35.188.0.0/15 -35.190.0.0/18 -35.190.112.0/20 -35.190.128.0/18 -35.190.192.0/19 -35.190.224.0/20 -35.190.64.0/19 -35.192.0.0/14 -35.196.0.0/15 -35.198.0.0/16 -35.199.0.0/17 -35.199.144.0/20 -35.199.160.0/19 -35.200.0.0/16 -35.201.0.0/19 -35.201.128.0/17 -35.201.41.0/24 -35.201.64.0/18 -35.202.0.0/16 -35.203.0.0/17 -35.203.128.0/18 -35.203.210.0/23 -35.203.212.0/22 -35.203.216.0/22 -35.203.232.0/21 -35.204.0.0/15 -35.206.128.0/17 -35.206.32.0/19 -35.206.64.0/18 -35.207.0.0/16 -35.208.0.0/13 -35.216.0.0/15 -35.219.0.0/17 -35.219.128.0/18 -35.220.0.0/20 -35.220.128.0/17 -35.220.16.0/21 -35.220.24.0/22 -35.220.31.0/24 -35.220.32.0/19 -35.220.64.0/18 -35.221.0.0/16 -35.222.0.0/15 -35.224.0.0/14 -35.228.0.0/16 -35.229.128.0/17 -35.229.16.0/20 -35.229.32.0/19 -35.229.64.0/18 -35.230.0.0/17 -35.230.128.0/18 -35.230.240.0/20 -35.231.0.0/16 -35.232.0.0/15 -35.234.0.0/16 -35.235.0.0/17 -35.235.216.0/21 -35.236.0.0/14 -35.240.0.0/15 -35.242.0.0/20 -35.242.128.0/17 -35.242.16.0/21 -35.242.24.0/22 -35.242.31.0/24 -35.242.32.0/19 -35.242.64.0/18 -35.243.0.0/20 -35.243.128.0/17 -35.243.32.0/20 -35.243.56.0/21 -35.243.64.0/18 -35.244.0.0/14 -8.34.208.0/20 -8.35.192.0/21 -108.177.8.0/21 -108.177.96.0/19 -130.211.0.0/22 -172.217.0.0/19 -216.239.33.128/25 -216.239.33.96/27 -216.239.34.0/23 -216.239.36.0/22 -216.239.40.0/21 -216.239.48.0/21 -216.239.56.0/23 -216.239.58.0/24 -216.239.59.0/25 -216.239.59.128/32 -64.233.173.193/32 -64.233.173.194/31 -64.233.173.196/30 -64.233.173.200/29 -64.233.173.208/28 -64.233.173.224/27 -64.68.90.0/24 -66.249.64.1/32 -66.249.64.128/25 -66.249.64.16/28 -66.249.64.2/31 -66.249.64.32/27 -66.249.64.4/30 -66.249.64.64/26 -66.249.64.8/29 -66.249.65.0/24 -66.249.66.0/23 -66.249.68.0/22 -66.249.72.0/21 -172.217.128.0/19 -172.217.160.0/20 -172.217.192.0/19 -172.217.32.0/20 -172.253.112.0/20 -172.253.56.0/21 -173.194.0.0/16 -2001:4860:4000::/36 -209.85.128.0/17 -216.239.32.0/19 -216.58.192.0/19 -2404:6800:4000::/36 -2607:f8b0:4000::/36 -2800:3f0:4000::/36 -2a00:1450:4000::/36 -2c0f:fb50:4000::/36 -35.190.247.0/24 -35.191.0.0/16 -64.233.160.0/19 -66.102.0.0/20 -66.249.80.0/20 -72.14.192.0/18 -74.125.0.0/16 -74.125.57.240/29 -216.239.44.0/24 -216.239.45.0/24 -23.251.128.0/23 -23.251.128.0/24 -23.251.129.0/24 -23.251.130.0/23 -23.251.130.0/24 -23.251.131.0/24 -23.251.132.0/23 -23.251.132.0/24 -23.251.133.0/24 -23.251.134.0/23 -23.251.134.0/24 -23.251.135.0/24 -23.251.136.0/23 -23.251.136.0/24 -23.251.137.0/24 -23.251.138.0/23 -23.251.138.0/24 -23.251.139.0/24 -23.251.140.0/23 -23.251.140.0/24 -23.251.141.0/24 -23.251.142.0/23 -23.251.142.0/24 -23.251.143.0/24 -23.251.144.0/23 -23.251.144.0/24 -23.251.145.0/24 -23.251.146.0/23 -23.251.146.0/24 -23.251.147.0/24 -23.251.148.0/23 -23.251.148.0/24 -23.251.149.0/24 -23.251.150.0/23 -23.251.150.0/24 -23.251.151.0/24 -23.251.152.0/23 -23.251.152.0/24 -23.251.153.0/24 -23.251.154.0/23 -23.251.154.0/24 -23.251.155.0/24 -23.251.156.0/23 -23.251.156.0/24 -23.251.157.0/24 -23.251.158.0/23 -23.251.158.0/24 -23.251.159.0/24 -104.154.0.0/23 -104.154.0.0/24 -104.154.1.0/24 -104.154.2.0/23 -104.154.2.0/24 -104.154.3.0/24 -104.154.4.0/23 -104.154.4.0/24 -104.154.5.0/24 -104.154.6.0/23 -104.154.6.0/24 -104.154.7.0/24 -104.154.8.0/23 -104.154.8.0/24 -104.154.9.0/24 -104.154.10.0/23 -104.154.10.0/24 -104.154.11.0/24 -104.154.12.0/23 -104.154.12.0/24 -104.154.13.0/24 -104.154.14.0/23 -104.154.14.0/24 -104.154.15.0/24 -104.154.16.0/23 -104.154.16.0/24 -104.154.17.0/24 -104.154.18.0/23 -104.154.18.0/24 -104.154.19.0/24 -104.154.20.0/23 -104.154.20.0/24 -104.154.21.0/24 -104.154.22.0/23 -104.154.22.0/24 -104.154.23.0/24 -104.154.24.0/23 -104.154.24.0/24 -104.154.25.0/24 -104.154.26.0/23 -104.154.26.0/24 -104.154.27.0/24 -104.154.28.0/23 -104.154.28.0/24 -104.154.29.0/24 -104.154.30.0/23 -104.154.30.0/24 -104.154.31.0/24 -104.154.32.0/23 -104.154.32.0/24 -104.154.33.0/24 -104.154.34.0/23 -104.154.34.0/24 -104.154.35.0/24 -104.154.36.0/23 -104.154.36.0/24 -104.154.37.0/24 -104.154.38.0/23 -104.154.38.0/24 -104.154.39.0/24 -104.154.40.0/23 -104.154.40.0/24 -104.154.41.0/24 -104.154.42.0/23 -104.154.42.0/24 -104.154.43.0/24 -104.154.44.0/23 -104.154.44.0/24 -104.154.45.0/24 -104.154.46.0/23 -104.154.46.0/24 -104.154.47.0/24 -104.154.48.0/23 -104.154.48.0/24 -104.154.49.0/24 -104.154.50.0/23 -104.154.50.0/24 -104.154.51.0/24 -104.154.52.0/23 -104.154.52.0/24 -104.154.53.0/24 -104.154.54.0/23 -104.154.54.0/24 -104.154.55.0/24 -104.154.56.0/23 -104.154.56.0/24 -104.154.57.0/24 -104.154.58.0/23 -104.154.58.0/24 -104.154.59.0/24 -104.154.60.0/23 -104.154.60.0/24 -104.154.61.0/24 -104.154.62.0/23 -104.154.62.0/24 -104.154.63.0/24 -104.154.64.0/23 -104.154.64.0/24 -104.154.65.0/24 -104.154.66.0/23 -104.154.66.0/24 -104.154.67.0/24 -104.154.68.0/23 -104.154.68.0/24 -104.154.69.0/24 -104.154.70.0/23 -104.154.70.0/24 -104.154.71.0/24 -104.154.72.0/23 -104.154.72.0/24 -104.154.73.0/24 -104.154.74.0/23 -104.154.74.0/24 -104.154.75.0/24 -104.154.76.0/23 -104.154.76.0/24 -104.154.77.0/24 -104.154.78.0/23 -104.154.78.0/24 -104.154.79.0/24 -104.154.80.0/23 -104.154.80.0/24 -104.154.81.0/24 -104.154.82.0/23 -104.154.82.0/24 -104.154.83.0/24 -104.154.84.0/23 -104.154.84.0/24 -104.154.85.0/24 -104.154.86.0/23 -104.154.86.0/24 -104.154.87.0/24 -104.154.88.0/23 -104.154.88.0/24 -104.154.89.0/24 -104.154.90.0/23 -104.154.90.0/24 -104.154.91.0/24 -104.154.92.0/23 -104.154.92.0/24 -104.154.93.0/24 -104.154.94.0/23 -104.154.94.0/24 -104.154.95.0/24 -104.154.96.0/23 -104.154.96.0/24 -104.154.97.0/24 -104.154.98.0/23 -104.154.98.0/24 -104.154.99.0/24 -104.154.100.0/23 -104.154.100.0/24 -104.154.101.0/24 -104.154.102.0/23 -104.154.102.0/24 -104.154.103.0/24 -104.154.104.0/23 -104.154.104.0/24 -104.154.105.0/24 -104.154.106.0/23 -104.154.106.0/24 -104.154.107.0/24 -104.154.108.0/23 -104.154.108.0/24 -104.154.109.0/24 -104.154.110.0/23 -104.154.110.0/24 -104.154.111.0/24 -104.154.112.0/23 -104.154.112.0/24 -104.154.114.0/24 -104.154.115.0/24 -104.154.116.0/23 -104.154.116.0/24 -104.154.117.0/24 -104.154.118.0/23 -104.154.118.0/24 -104.154.119.0/24 -104.154.120.0/24 -104.154.121.0/24 -104.154.122.0/23 -104.154.122.0/24 -104.154.123.0/24 -104.154.124.0/23 -104.154.124.0/24 -104.154.125.0/24 -104.154.126.0/23 -104.154.126.0/24 -104.154.127.0/24 -104.154.128.0/23 -104.154.128.0/24 -104.154.129.0/24 -104.154.130.0/23 -104.154.130.0/24 -104.154.131.0/24 -104.154.132.0/23 -104.154.132.0/24 -104.154.133.0/24 -104.154.134.0/23 -104.154.134.0/24 -104.154.135.0/24 -104.154.136.0/23 -104.154.136.0/24 -104.154.137.0/24 -104.154.138.0/23 -104.154.138.0/24 -104.154.139.0/24 -104.154.140.0/23 -104.154.140.0/24 -104.154.141.0/24 -104.154.142.0/23 -104.154.142.0/24 -104.154.143.0/24 -104.154.144.0/23 -104.154.144.0/24 -104.154.145.0/24 -104.154.146.0/23 -104.154.146.0/24 -104.154.147.0/24 -104.154.148.0/23 -104.154.148.0/24 -104.154.149.0/24 -104.154.150.0/23 -104.154.150.0/24 -104.154.151.0/24 -104.154.152.0/23 -104.154.152.0/24 -104.154.153.0/24 -104.154.154.0/23 -104.154.154.0/24 -104.154.155.0/24 -104.154.156.0/23 -104.154.156.0/24 -104.154.157.0/24 -104.154.158.0/23 -104.154.158.0/24 -104.154.159.0/24 -104.154.160.0/23 -104.154.160.0/24 -104.154.161.0/24 -104.154.162.0/23 -104.154.162.0/24 -104.154.163.0/24 -104.154.164.0/23 -104.154.164.0/24 -104.154.165.0/24 -104.154.166.0/23 -104.154.166.0/24 -104.154.167.0/24 -104.154.168.0/23 -104.154.168.0/24 -104.154.169.0/24 -104.154.170.0/23 -104.154.170.0/24 -104.154.171.0/24 -104.154.172.0/23 -104.154.172.0/24 -104.154.173.0/24 -104.154.174.0/23 -104.154.174.0/24 -104.154.175.0/24 -104.154.176.0/23 -104.154.176.0/24 -104.154.177.0/24 -104.154.178.0/23 -104.154.178.0/24 -104.154.179.0/24 -104.154.180.0/23 -104.154.180.0/24 -104.154.181.0/24 -104.154.182.0/23 -104.154.182.0/24 -104.154.183.0/24 -104.154.184.0/23 -104.154.184.0/24 -104.154.185.0/24 -104.154.186.0/23 -104.154.186.0/24 -104.154.187.0/24 -104.154.188.0/23 -104.154.188.0/24 -104.154.189.0/24 -104.154.190.0/23 -104.154.190.0/24 -104.154.191.0/24 -104.154.192.0/23 -104.154.192.0/24 -104.154.193.0/24 -104.154.194.0/23 -104.154.194.0/24 -104.154.195.0/24 -104.154.196.0/23 -104.154.196.0/24 -104.154.197.0/24 -104.154.198.0/23 -104.154.198.0/24 -104.154.199.0/24 -104.154.200.0/23 -104.154.200.0/24 -104.154.201.0/24 -104.154.202.0/23 -104.154.202.0/24 -104.154.203.0/24 -104.154.204.0/23 -104.154.204.0/24 -104.154.205.0/24 -104.154.206.0/23 -104.154.206.0/24 -104.154.207.0/24 -104.154.208.0/23 -104.154.208.0/24 -104.154.209.0/24 -104.154.210.0/23 -104.154.210.0/24 -104.154.211.0/24 -104.154.212.0/23 -104.154.212.0/24 -104.154.213.0/24 -104.154.214.0/23 -104.154.214.0/24 -104.154.215.0/24 -104.154.216.0/23 -104.154.216.0/24 -104.154.217.0/24 -104.154.218.0/23 -104.154.218.0/24 -104.154.219.0/24 -104.154.220.0/23 -104.154.220.0/24 -104.154.221.0/24 -104.154.222.0/23 -104.154.222.0/24 -104.154.223.0/24 -104.154.224.0/23 -104.154.224.0/24 -104.154.225.0/24 -104.154.226.0/23 -104.154.226.0/24 -104.154.227.0/24 -104.154.228.0/23 -104.154.228.0/24 -104.154.229.0/24 -104.154.230.0/23 -104.154.230.0/24 -104.154.231.0/24 -104.154.232.0/23 -104.154.232.0/24 -104.154.233.0/24 -104.154.234.0/23 -104.154.234.0/24 -104.154.235.0/24 -104.154.236.0/23 -104.154.236.0/24 -104.154.237.0/24 -104.154.238.0/23 -104.154.238.0/24 -104.154.239.0/24 -104.154.240.0/23 -104.154.240.0/24 -104.154.241.0/24 -104.154.242.0/23 -104.154.242.0/24 -104.154.243.0/24 -104.154.244.0/23 -104.154.244.0/24 -104.154.245.0/24 -104.154.246.0/23 -104.154.246.0/24 -104.154.247.0/24 -104.154.248.0/23 -104.154.248.0/24 -104.154.249.0/24 -104.154.250.0/23 -104.154.250.0/24 -104.154.251.0/24 -104.154.252.0/23 -104.154.252.0/24 -104.154.253.0/24 -104.154.254.0/23 -104.154.254.0/24 -104.154.255.0/24 -104.155.0.0/23 -104.155.0.0/24 -104.155.1.0/24 -104.155.2.0/23 -104.155.2.0/24 -104.155.3.0/24 -104.155.4.0/23 -104.155.4.0/24 -104.155.5.0/24 -104.155.6.0/23 -104.155.6.0/24 -104.155.7.0/24 -104.155.8.0/23 -104.155.8.0/24 -104.155.9.0/24 -104.155.10.0/23 -104.155.10.0/24 -104.155.11.0/24 -104.155.12.0/23 -104.155.12.0/24 -104.155.13.0/24 -104.155.14.0/23 -104.155.14.0/24 -104.155.15.0/24 -104.155.16.0/23 -104.155.16.0/24 -104.155.17.0/24 -104.155.18.0/23 -104.155.18.0/24 -104.155.19.0/24 -104.155.20.0/23 -104.155.20.0/24 -104.155.21.0/24 -104.155.22.0/23 -104.155.22.0/24 -104.155.23.0/24 -104.155.24.0/23 -104.155.24.0/24 -104.155.25.0/24 -104.155.26.0/23 -104.155.26.0/24 -104.155.27.0/24 -104.155.28.0/23 -104.155.28.0/24 -104.155.29.0/24 -104.155.30.0/23 -104.155.30.0/24 -104.155.31.0/24 -104.155.32.0/23 -104.155.32.0/24 -104.155.33.0/24 -104.155.34.0/23 -104.155.34.0/24 -104.155.35.0/24 -104.155.36.0/23 -104.155.36.0/24 -104.155.37.0/24 -104.155.38.0/23 -104.155.38.0/24 -104.155.39.0/24 -104.155.40.0/23 -104.155.40.0/24 -104.155.41.0/24 -104.155.42.0/23 -104.155.42.0/24 -104.155.43.0/24 -104.155.44.0/23 -104.155.44.0/24 -104.155.45.0/24 -104.155.46.0/23 -104.155.46.0/24 -104.155.47.0/24 -104.155.48.0/23 -104.155.48.0/24 -104.155.49.0/24 -104.155.50.0/23 -104.155.50.0/24 -104.155.51.0/24 -104.155.52.0/23 -104.155.52.0/24 -104.155.53.0/24 -104.155.54.0/23 -104.155.54.0/24 -104.155.55.0/24 -104.155.56.0/23 -104.155.56.0/24 -104.155.57.0/24 -104.155.58.0/23 -104.155.58.0/24 -104.155.59.0/24 -104.155.60.0/23 -104.155.60.0/24 -104.155.61.0/24 -104.155.62.0/23 -104.155.62.0/24 -104.155.63.0/24 -104.155.64.0/23 -104.155.64.0/24 -104.155.65.0/24 -104.155.66.0/23 -104.155.66.0/24 -104.155.67.0/24 -104.155.68.0/23 -104.155.68.0/24 -104.155.69.0/24 -104.155.70.0/23 -104.155.70.0/24 -104.155.71.0/24 -104.155.72.0/23 -104.155.72.0/24 -104.155.73.0/24 -104.155.74.0/23 -104.155.74.0/24 -104.155.75.0/24 -104.155.76.0/23 -104.155.76.0/24 -104.155.77.0/24 -104.155.78.0/23 -104.155.78.0/24 -104.155.79.0/24 -104.155.80.0/23 -104.155.80.0/24 -104.155.81.0/24 -104.155.82.0/23 -104.155.82.0/24 -104.155.83.0/24 -104.155.84.0/23 -104.155.84.0/24 -104.155.85.0/24 -104.155.86.0/23 -104.155.86.0/24 -104.155.87.0/24 -104.155.88.0/23 -104.155.88.0/24 -104.155.89.0/24 -104.155.90.0/23 -104.155.90.0/24 -104.155.91.0/24 -104.155.92.0/23 -104.155.92.0/24 -104.155.93.0/24 -104.155.94.0/23 -104.155.94.0/24 -104.155.95.0/24 -104.155.96.0/23 -104.155.96.0/24 -104.155.97.0/24 -104.155.98.0/23 -104.155.98.0/24 -104.155.99.0/24 -104.155.100.0/23 -104.155.100.0/24 -104.155.101.0/24 -104.155.102.0/23 -104.155.102.0/24 -104.155.103.0/24 -104.155.104.0/23 -104.155.104.0/24 -104.155.105.0/24 -104.155.106.0/23 -104.155.106.0/24 -104.155.107.0/24 -104.155.108.0/23 -104.155.108.0/24 -104.155.109.0/24 -104.155.110.0/23 -104.155.110.0/24 -104.155.111.0/24 -104.155.112.0/23 -104.155.112.0/24 -104.155.113.0/24 -104.155.114.0/23 -104.155.114.0/24 -104.155.115.0/24 -104.155.116.0/23 -104.155.116.0/24 -104.155.117.0/24 -104.155.118.0/23 -104.155.118.0/24 -104.155.119.0/24 -104.155.120.0/23 -104.155.120.0/24 -104.155.121.0/24 -104.155.122.0/23 -104.155.122.0/24 -104.155.123.0/24 -104.155.124.0/23 -104.155.124.0/24 -104.155.125.0/24 -104.155.126.0/23 -104.155.126.0/24 -104.155.127.0/24 -104.155.128.0/23 -104.155.128.0/24 -104.155.129.0/24 -104.155.130.0/23 -104.155.130.0/24 -104.155.131.0/24 -104.155.132.0/23 -104.155.132.0/24 -104.155.133.0/24 -104.155.134.0/23 -104.155.134.0/24 -104.155.135.0/24 -104.155.136.0/23 -104.155.136.0/24 -104.155.137.0/24 -104.155.138.0/23 -104.155.138.0/24 -104.155.139.0/24 -104.155.140.0/23 -104.155.140.0/24 -104.155.141.0/24 -104.155.142.0/23 -104.155.142.0/24 -104.155.143.0/24 -104.155.144.0/23 -104.155.144.0/24 -104.155.145.0/24 -104.155.146.0/23 -104.155.146.0/24 -104.155.147.0/24 -104.155.148.0/23 -104.155.148.0/24 -104.155.149.0/24 -104.155.150.0/23 -104.155.150.0/24 -104.155.151.0/24 -104.155.152.0/23 -104.155.152.0/24 -104.155.153.0/24 -104.155.154.0/23 -104.155.154.0/24 -104.155.155.0/24 -104.155.156.0/23 -104.155.156.0/24 -104.155.157.0/24 -104.155.158.0/23 -104.155.158.0/24 -104.155.159.0/24 -104.155.160.0/23 -104.155.160.0/24 -104.155.161.0/24 -104.155.162.0/23 -104.155.162.0/24 -104.155.163.0/24 -104.155.164.0/23 -104.155.164.0/24 -104.155.165.0/24 -104.155.166.0/23 -104.155.166.0/24 -104.155.167.0/24 -104.155.168.0/23 -104.155.168.0/24 -104.155.169.0/24 -104.155.170.0/23 -104.155.170.0/24 -104.155.171.0/24 -104.155.172.0/23 -104.155.172.0/24 -104.155.173.0/24 -104.155.174.0/23 -104.155.174.0/24 -104.155.175.0/24 -104.155.176.0/23 -104.155.176.0/24 -104.155.177.0/24 -104.155.178.0/23 -104.155.178.0/24 -104.155.179.0/24 -104.155.180.0/23 -104.155.180.0/24 -104.155.181.0/24 -104.155.182.0/23 -104.155.182.0/24 -104.155.183.0/24 -104.155.184.0/23 -104.155.184.0/24 -104.155.185.0/24 -104.155.186.0/23 -104.155.186.0/24 -104.155.187.0/24 -104.155.188.0/23 -104.155.188.0/24 -104.155.189.0/24 -104.155.190.0/23 -104.155.190.0/24 -104.155.191.0/24 -104.155.192.0/23 -104.155.192.0/24 -104.155.193.0/24 -104.155.194.0/23 -104.155.194.0/24 -104.155.195.0/24 -104.155.196.0/23 -104.155.196.0/24 -104.155.197.0/24 -104.155.198.0/23 -104.155.198.0/24 -104.155.199.0/24 -104.155.200.0/23 -104.155.200.0/24 -104.155.201.0/24 -104.155.202.0/23 -104.155.202.0/24 -104.155.203.0/24 -104.155.204.0/23 -104.155.204.0/24 -104.155.205.0/24 -104.155.206.0/23 -104.155.206.0/24 -104.155.207.0/24 -104.155.208.0/23 -104.155.208.0/24 -104.155.209.0/24 -104.155.210.0/23 -104.155.210.0/24 -104.155.211.0/24 -104.155.212.0/23 -104.155.212.0/24 -104.155.213.0/24 -104.155.214.0/23 -104.155.214.0/24 -104.155.215.0/24 -104.155.216.0/23 -104.155.216.0/24 -104.155.217.0/24 -104.155.218.0/23 -104.155.218.0/24 -104.155.219.0/24 -104.155.220.0/23 -104.155.220.0/24 -104.155.221.0/24 -104.155.222.0/23 -104.155.222.0/24 -104.155.223.0/24 -104.155.224.0/23 -104.155.224.0/24 -104.155.225.0/24 -104.155.226.0/23 -104.155.226.0/24 -104.155.227.0/24 -104.155.228.0/23 -104.155.228.0/24 -104.155.229.0/24 -104.155.230.0/23 -104.155.230.0/24 -104.155.231.0/24 -104.155.232.0/23 -104.155.232.0/24 -104.155.233.0/24 -104.155.234.0/23 -104.155.234.0/24 -104.155.235.0/24 -104.155.236.0/23 -104.155.236.0/24 -104.155.237.0/24 -104.155.238.0/23 -104.155.238.0/24 -104.155.239.0/24 -104.155.240.0/23 -104.155.240.0/24 -104.155.241.0/24 -104.155.242.0/23 -104.155.242.0/24 -104.155.243.0/24 -104.155.244.0/23 -104.155.244.0/24 -104.155.245.0/24 -104.155.246.0/23 -104.155.246.0/24 -104.155.247.0/24 -104.155.248.0/23 -104.155.248.0/24 -104.155.249.0/24 -104.155.250.0/23 -104.155.250.0/24 -104.155.251.0/24 -104.155.252.0/23 -104.155.252.0/24 -104.155.253.0/24 -104.155.254.0/23 -104.155.254.0/24 -104.155.255.0/24 -107.167.160.0/23 -107.167.160.0/24 -107.167.161.0/24 -107.167.162.0/23 -107.167.162.0/24 -107.167.163.0/24 -107.167.164.0/23 -107.167.164.0/24 -107.167.165.0/24 -107.167.166.0/23 -107.167.166.0/24 -107.167.167.0/24 -107.167.168.0/23 -107.167.168.0/24 -107.167.169.0/24 -107.167.170.0/23 -107.167.170.0/24 -107.167.171.0/24 -107.167.172.0/23 -107.167.172.0/24 -107.167.173.0/24 -107.167.174.0/23 -107.167.174.0/24 -107.167.175.0/24 -107.167.176.0/23 -107.167.176.0/24 -107.167.177.0/24 -107.167.178.0/23 -107.167.178.0/24 -107.167.179.0/24 -107.167.180.0/23 -107.167.180.0/24 -107.167.181.0/24 -107.167.182.0/23 -107.167.182.0/24 -107.167.183.0/24 -107.167.184.0/23 -107.167.184.0/24 -107.167.185.0/24 -107.167.186.0/23 -107.167.186.0/24 -107.167.187.0/24 -107.167.188.0/23 -107.167.188.0/24 -107.167.189.0/24 -107.167.190.0/23 -107.167.190.0/24 -107.167.191.0/24 -107.178.192.0/23 -107.178.192.0/24 -107.178.193.0/24 -107.178.194.0/23 -107.178.194.0/24 -107.178.195.0/24 -107.178.196.0/23 -107.178.196.0/24 -107.178.197.0/24 -107.178.198.0/23 -107.178.198.0/24 -107.178.199.0/24 -107.178.200.0/23 -107.178.200.0/24 -107.178.201.0/24 -107.178.202.0/23 -107.178.202.0/24 -107.178.203.0/24 -107.178.204.0/23 -107.178.204.0/24 -107.178.205.0/24 -107.178.206.0/23 -107.178.206.0/24 -107.178.207.0/24 -107.178.208.0/23 -107.178.208.0/24 -107.178.209.0/24 -107.178.210.0/23 -107.178.210.0/24 -107.178.211.0/24 -107.178.212.0/23 -107.178.212.0/24 -107.178.213.0/24 -107.178.214.0/23 -107.178.214.0/24 -107.178.215.0/24 -107.178.216.0/23 -107.178.216.0/24 -107.178.217.0/24 -107.178.218.0/23 -107.178.218.0/24 -107.178.219.0/24 -107.178.220.0/23 -107.178.220.0/24 -107.178.221.0/24 -107.178.222.0/23 -107.178.222.0/24 -107.178.223.0/24 -107.178.224.0/23 -107.178.224.0/24 -107.178.225.0/24 -107.178.226.0/23 -107.178.226.0/24 -107.178.227.0/24 -107.178.228.0/23 -107.178.228.0/24 -107.178.229.0/24 -107.178.230.0/23 -107.178.230.0/24 -107.178.231.0/24 -107.178.232.0/23 -107.178.232.0/24 -107.178.233.0/24 -107.178.234.0/23 -107.178.234.0/24 -107.178.235.0/24 -107.178.236.0/23 -107.178.236.0/24 -107.178.237.0/24 -107.178.238.0/23 -107.178.238.0/24 -107.178.239.0/24 -107.178.240.0/23 -107.178.240.0/24 -107.178.241.0/24 -107.178.242.0/23 -107.178.242.0/24 -107.178.243.0/24 -107.178.244.0/23 -107.178.244.0/24 -107.178.245.0/24 -107.178.246.0/23 -107.178.246.0/24 -107.178.247.0/24 -107.178.248.0/23 -107.178.248.0/24 -107.178.249.0/24 -107.178.250.0/23 -107.178.250.0/24 -107.178.251.0/24 -107.178.252.0/23 -107.178.252.0/24 -107.178.253.0/24 -107.178.254.0/23 -107.178.254.0/24 -107.178.255.0/24 -130.211.0.0/23 -130.211.0.0/24 -130.211.1.0/24 -130.211.2.0/23 -130.211.2.0/24 -130.211.3.0/24 -130.211.4.0/23 -130.211.4.0/24 -130.211.5.0/24 -130.211.6.0/23 -130.211.6.0/24 -130.211.7.0/24 -130.211.8.0/23 -130.211.8.0/24 -130.211.9.0/24 -130.211.10.0/23 -130.211.10.0/24 -130.211.11.0/24 -130.211.12.0/23 -130.211.12.0/24 -130.211.13.0/24 -130.211.14.0/23 -130.211.14.0/24 -130.211.15.0/24 -130.211.16.0/23 -130.211.16.0/24 -130.211.17.0/24 -130.211.18.0/23 -130.211.18.0/24 -130.211.19.0/24 -130.211.20.0/23 -130.211.20.0/24 -130.211.21.0/24 -130.211.22.0/23 -130.211.22.0/24 -130.211.23.0/24 -130.211.24.0/23 -130.211.24.0/24 -130.211.25.0/24 -130.211.26.0/23 -130.211.26.0/24 -130.211.27.0/24 -130.211.28.0/23 -130.211.28.0/24 -130.211.29.0/24 -130.211.30.0/23 -130.211.30.0/24 -130.211.31.0/24 -130.211.32.0/23 -130.211.32.0/24 -130.211.33.0/24 -130.211.34.0/23 -130.211.34.0/24 -130.211.35.0/24 -130.211.36.0/23 -130.211.36.0/24 -130.211.37.0/24 -130.211.38.0/23 -130.211.38.0/24 -130.211.39.0/24 -130.211.40.0/23 -130.211.40.0/24 -130.211.41.0/24 -130.211.42.0/23 -130.211.42.0/24 -130.211.43.0/24 -130.211.44.0/23 -130.211.44.0/24 -130.211.45.0/24 -130.211.46.0/23 -130.211.46.0/24 -130.211.47.0/24 -130.211.48.0/23 -130.211.48.0/24 -130.211.49.0/24 -130.211.50.0/23 -130.211.50.0/24 -130.211.51.0/24 -130.211.52.0/23 -130.211.52.0/24 -130.211.53.0/24 -130.211.54.0/23 -130.211.54.0/24 -130.211.55.0/24 -130.211.56.0/23 -130.211.56.0/24 -130.211.57.0/24 -130.211.58.0/23 -130.211.58.0/24 -130.211.59.0/24 -130.211.60.0/23 -130.211.60.0/24 -130.211.61.0/24 -130.211.62.0/23 -130.211.62.0/24 -130.211.63.0/24 -130.211.64.0/23 -130.211.64.0/24 -130.211.65.0/24 -130.211.66.0/23 -130.211.66.0/24 -130.211.67.0/24 -130.211.68.0/23 -130.211.68.0/24 -130.211.69.0/24 -130.211.70.0/23 -130.211.70.0/24 -130.211.71.0/24 -130.211.72.0/23 -130.211.72.0/24 -130.211.73.0/24 -130.211.74.0/23 -130.211.74.0/24 -130.211.75.0/24 -130.211.76.0/23 -130.211.76.0/24 -130.211.77.0/24 -130.211.78.0/23 -130.211.78.0/24 -130.211.79.0/24 -130.211.80.0/23 -130.211.80.0/24 -130.211.81.0/24 -130.211.82.0/23 -130.211.82.0/24 -130.211.83.0/24 -130.211.84.0/23 -130.211.84.0/24 -130.211.85.0/24 -130.211.86.0/23 -130.211.86.0/24 -130.211.87.0/24 -130.211.88.0/23 -130.211.88.0/24 -130.211.89.0/24 -130.211.90.0/23 -130.211.90.0/24 -130.211.91.0/24 -130.211.92.0/23 -130.211.92.0/24 -130.211.93.0/24 -130.211.94.0/23 -130.211.94.0/24 -130.211.95.0/24 -130.211.96.0/23 -130.211.96.0/24 -130.211.97.0/24 -130.211.98.0/23 -130.211.98.0/24 -130.211.99.0/24 -130.211.100.0/23 -130.211.100.0/24 -130.211.101.0/24 -130.211.102.0/23 -130.211.102.0/24 -130.211.103.0/24 -130.211.104.0/23 -130.211.104.0/24 -130.211.105.0/24 -130.211.106.0/23 -130.211.106.0/24 -130.211.107.0/24 -130.211.108.0/23 -130.211.108.0/24 -130.211.109.0/24 -130.211.110.0/23 -130.211.110.0/24 -130.211.111.0/24 -130.211.112.0/23 -130.211.112.0/24 -130.211.113.0/24 -130.211.114.0/23 -130.211.114.0/24 -130.211.115.0/24 -130.211.116.0/23 -130.211.116.0/24 -130.211.117.0/24 -130.211.118.0/23 -130.211.118.0/24 -130.211.119.0/24 -130.211.120.0/23 -130.211.120.0/24 -130.211.121.0/24 -130.211.122.0/23 -130.211.122.0/24 -130.211.123.0/24 -130.211.124.0/23 -130.211.124.0/24 -130.211.125.0/24 -130.211.126.0/23 -130.211.126.0/24 -130.211.127.0/24 -130.211.128.0/23 -130.211.128.0/24 -130.211.129.0/24 -130.211.130.0/23 -130.211.130.0/24 -130.211.131.0/24 -130.211.132.0/23 -130.211.132.0/24 -130.211.133.0/24 -130.211.134.0/23 -130.211.134.0/24 -130.211.135.0/24 -130.211.136.0/23 -130.211.136.0/24 -130.211.137.0/24 -130.211.138.0/23 -130.211.138.0/24 -130.211.139.0/24 -130.211.140.0/23 -130.211.140.0/24 -130.211.141.0/24 -130.211.142.0/23 -130.211.142.0/24 -130.211.143.0/24 -130.211.144.0/23 -130.211.144.0/24 -130.211.145.0/24 -130.211.146.0/23 -130.211.146.0/24 -130.211.147.0/24 -130.211.148.0/23 -130.211.148.0/24 -130.211.149.0/24 -130.211.150.0/23 -130.211.150.0/24 -130.211.151.0/24 -130.211.152.0/23 -130.211.152.0/24 -130.211.153.0/24 -130.211.154.0/23 -130.211.154.0/24 -130.211.155.0/24 -130.211.156.0/23 -130.211.156.0/24 -130.211.157.0/24 -130.211.158.0/23 -130.211.158.0/24 -130.211.159.0/24 -130.211.160.0/23 -130.211.160.0/24 -130.211.161.0/24 -130.211.162.0/23 -130.211.162.0/24 -130.211.163.0/24 -130.211.164.0/23 -130.211.164.0/24 -130.211.165.0/24 -130.211.166.0/23 -130.211.166.0/24 -130.211.167.0/24 -130.211.168.0/23 -130.211.168.0/24 -130.211.169.0/24 -130.211.170.0/23 -130.211.170.0/24 -130.211.171.0/24 -130.211.172.0/23 -130.211.172.0/24 -130.211.173.0/24 -130.211.174.0/23 -130.211.174.0/24 -130.211.175.0/24 -130.211.176.0/23 -130.211.176.0/24 -130.211.177.0/24 -130.211.178.0/23 -130.211.178.0/24 -130.211.179.0/24 -130.211.180.0/23 -130.211.180.0/24 -130.211.181.0/24 -130.211.182.0/23 -130.211.182.0/24 -130.211.183.0/24 -130.211.184.0/23 -130.211.184.0/24 -130.211.185.0/24 -130.211.186.0/23 -130.211.186.0/24 -130.211.187.0/24 -130.211.188.0/23 -130.211.188.0/24 -130.211.189.0/24 -130.211.190.0/23 -130.211.190.0/24 -130.211.191.0/24 -130.211.192.0/23 -130.211.192.0/24 -130.211.193.0/24 -130.211.194.0/23 -130.211.194.0/24 -130.211.195.0/24 -130.211.196.0/23 -130.211.196.0/24 -130.211.197.0/24 -130.211.198.0/23 -130.211.198.0/24 -130.211.199.0/24 -130.211.200.0/23 -130.211.200.0/24 -130.211.201.0/24 -130.211.202.0/23 -130.211.202.0/24 -130.211.203.0/24 -130.211.204.0/23 -130.211.204.0/24 -130.211.205.0/24 -130.211.206.0/23 -130.211.206.0/24 -130.211.207.0/24 -130.211.208.0/23 -130.211.208.0/24 -130.211.209.0/24 -130.211.210.0/23 -130.211.210.0/24 -130.211.211.0/24 -130.211.212.0/23 -130.211.212.0/24 -130.211.213.0/24 -130.211.214.0/23 -130.211.214.0/24 -130.211.215.0/24 -130.211.216.0/23 -130.211.216.0/24 -130.211.217.0/24 -130.211.218.0/23 -130.211.218.0/24 -130.211.219.0/24 -130.211.220.0/23 -130.211.220.0/24 -130.211.221.0/24 -130.211.222.0/23 -130.211.222.0/24 -130.211.223.0/24 -130.211.224.0/23 -130.211.224.0/24 -130.211.225.0/24 -130.211.226.0/23 -130.211.226.0/24 -130.211.227.0/24 -130.211.228.0/23 -130.211.228.0/24 -130.211.229.0/24 -130.211.230.0/23 -130.211.230.0/24 -130.211.231.0/24 -130.211.232.0/23 -130.211.232.0/24 -130.211.233.0/24 -130.211.234.0/23 -130.211.234.0/24 -130.211.235.0/24 -130.211.236.0/23 -130.211.236.0/24 -130.211.237.0/24 -130.211.238.0/23 -130.211.238.0/24 -130.211.239.0/24 -130.211.240.0/23 -130.211.240.0/24 -130.211.241.0/24 -130.211.242.0/23 -130.211.242.0/24 -130.211.243.0/24 -130.211.244.0/23 -130.211.244.0/24 -130.211.245.0/24 -130.211.246.0/23 -130.211.246.0/24 -130.211.247.0/24 -130.211.248.0/23 -130.211.248.0/24 -130.211.249.0/24 -130.211.250.0/23 -130.211.250.0/24 -130.211.251.0/24 -130.211.252.0/23 -130.211.252.0/24 -130.211.253.0/24 -130.211.254.0/23 -130.211.254.0/24 -130.211.255.0/24 -146.148.0.0/23 -146.148.0.0/24 -146.148.1.0/24 -146.148.2.0/24 -146.148.3.0/24 -146.148.4.0/23 -146.148.4.0/24 -146.148.5.0/24 -146.148.6.0/23 -146.148.6.0/24 -146.148.7.0/24 -146.148.8.0/23 -146.148.8.0/24 -146.148.9.0/24 -146.148.10.0/23 -146.148.10.0/24 -146.148.11.0/24 -146.148.12.0/23 -146.148.12.0/24 -146.148.13.0/24 -146.148.14.0/23 -146.148.14.0/24 -146.148.15.0/24 -146.148.16.0/23 -146.148.16.0/24 -146.148.17.0/24 -146.148.18.0/23 -146.148.18.0/24 -146.148.19.0/24 -146.148.20.0/23 -146.148.20.0/24 -146.148.21.0/24 -146.148.22.0/23 -146.148.22.0/24 -146.148.23.0/24 -146.148.24.0/23 -146.148.24.0/24 -146.148.25.0/24 -146.148.26.0/23 -146.148.26.0/24 -146.148.27.0/24 -146.148.28.0/23 -146.148.28.0/24 -146.148.29.0/24 -146.148.30.0/23 -146.148.30.0/24 -146.148.31.0/24 -146.148.32.0/23 -146.148.32.0/24 -146.148.33.0/24 -146.148.34.0/23 -146.148.34.0/24 -146.148.35.0/24 -146.148.36.0/23 -146.148.36.0/24 -146.148.37.0/24 -146.148.38.0/23 -146.148.38.0/24 -146.148.39.0/24 -146.148.40.0/23 -146.148.40.0/24 -146.148.41.0/24 -146.148.42.0/23 -146.148.42.0/24 -146.148.43.0/24 -146.148.44.0/23 -146.148.44.0/24 -146.148.45.0/24 -146.148.46.0/23 -146.148.46.0/24 -146.148.47.0/24 -146.148.48.0/23 -146.148.48.0/24 -146.148.49.0/24 -146.148.50.0/23 -146.148.50.0/24 -146.148.51.0/24 -146.148.52.0/23 -146.148.52.0/24 -146.148.53.0/24 -146.148.54.0/23 -146.148.54.0/24 -146.148.55.0/24 -146.148.56.0/23 -146.148.56.0/24 -146.148.57.0/24 -146.148.58.0/23 -146.148.58.0/24 -146.148.59.0/24 -146.148.60.0/23 -146.148.60.0/24 -146.148.61.0/24 -146.148.62.0/23 -146.148.62.0/24 -146.148.63.0/24 -146.148.64.0/23 -146.148.64.0/24 -146.148.65.0/24 -146.148.66.0/23 -146.148.66.0/24 -146.148.67.0/24 -146.148.68.0/23 -146.148.68.0/24 -146.148.69.0/24 -146.148.70.0/23 -146.148.70.0/24 -146.148.71.0/24 -146.148.72.0/23 -146.148.72.0/24 -146.148.73.0/24 -146.148.74.0/23 -146.148.74.0/24 -146.148.75.0/24 -146.148.76.0/23 -146.148.76.0/24 -146.148.77.0/24 -146.148.78.0/23 -146.148.78.0/24 -146.148.79.0/24 -146.148.80.0/23 -146.148.80.0/24 -146.148.81.0/24 -146.148.82.0/23 -146.148.82.0/24 -146.148.83.0/24 -146.148.84.0/23 -146.148.84.0/24 -146.148.85.0/24 -146.148.86.0/23 -146.148.86.0/24 -146.148.87.0/24 -146.148.88.0/23 -146.148.88.0/24 -146.148.89.0/24 -146.148.90.0/23 -146.148.90.0/24 -146.148.91.0/24 -146.148.92.0/23 -146.148.92.0/24 -146.148.93.0/24 -146.148.94.0/23 -146.148.94.0/24 -146.148.95.0/24 -146.148.96.0/23 -146.148.96.0/24 -146.148.97.0/24 -146.148.98.0/23 -146.148.98.0/24 -146.148.99.0/24 -146.148.100.0/23 -146.148.100.0/24 -146.148.101.0/24 -146.148.102.0/23 -146.148.102.0/24 -146.148.103.0/24 -146.148.104.0/23 -146.148.104.0/24 -146.148.105.0/24 -146.148.106.0/23 -146.148.106.0/24 -146.148.107.0/24 -146.148.108.0/23 -146.148.108.0/24 -146.148.109.0/24 -146.148.110.0/23 -146.148.110.0/24 -146.148.111.0/24 -146.148.112.0/23 -146.148.112.0/24 -146.148.113.0/24 -146.148.114.0/23 -146.148.114.0/24 -146.148.115.0/24 -146.148.116.0/23 -146.148.116.0/24 -146.148.117.0/24 -146.148.118.0/23 -146.148.118.0/24 -146.148.119.0/24 -146.148.120.0/23 -146.148.120.0/24 -146.148.121.0/24 -146.148.122.0/23 -146.148.122.0/24 -146.148.123.0/24 -146.148.124.0/23 -146.148.124.0/24 -146.148.125.0/24 -146.148.126.0/23 -146.148.126.0/24 -146.148.127.0/24 -173.255.112.0/23 -173.255.112.0/24 -173.255.113.0/24 -173.255.114.0/23 -173.255.114.0/24 -173.255.115.0/24 -173.255.116.0/23 -173.255.116.0/24 -173.255.117.0/24 -173.255.118.0/23 -173.255.118.0/24 -173.255.119.0/24 -173.255.120.0/23 -173.255.120.0/24 -173.255.121.0/24 -173.255.122.0/23 -173.255.122.0/24 -173.255.123.0/24 -173.255.124.0/23 -173.255.124.0/24 -173.255.125.0/24 -173.255.126.0/23 -173.255.126.0/24 -173.255.127.0/24 -104.132.0.0/16 -104.132.0.0/23 -104.132.0.0/24 -104.132.1.0/24 -104.132.2.0/23 -104.132.2.0/24 -104.132.3.0/24 -104.132.4.0/23 -104.132.4.0/24 -104.132.5.0/24 -104.132.6.0/23 -104.132.6.0/24 -104.132.7.0/24 -104.132.8.0/23 -104.132.8.0/24 -104.132.9.0/24 -104.132.10.0/23 -104.132.10.0/24 -104.132.11.0/24 -104.132.12.0/23 -104.132.12.0/24 -104.132.13.0/24 -104.132.14.0/23 -104.132.14.0/24 -104.132.15.0/24 -104.132.16.0/23 -104.132.16.0/24 -104.132.17.0/24 -104.132.18.0/23 -104.132.18.0/24 -104.132.19.0/24 -104.132.20.0/23 -104.132.20.0/24 -104.132.21.0/24 -104.132.22.0/23 -104.132.22.0/24 -104.132.23.0/24 -104.132.24.0/23 -104.132.24.0/24 -104.132.25.0/24 -104.132.26.0/23 -104.132.26.0/24 -104.132.27.0/24 -104.132.28.0/23 -104.132.28.0/24 -104.132.29.0/24 -104.132.30.0/23 -104.132.30.0/24 -104.132.31.0/24 -104.132.32.0/23 -104.132.32.0/24 -104.132.33.0/24 -104.132.34.0/23 -104.132.34.0/24 -104.132.35.0/24 -104.132.36.0/23 -104.132.36.0/24 -104.132.37.0/24 -104.132.38.0/23 -104.132.38.0/24 -104.132.39.0/24 -104.132.40.0/23 -104.132.40.0/24 -104.132.41.0/24 -104.132.42.0/23 -104.132.42.0/24 -104.132.43.0/24 -104.132.44.0/23 -104.132.44.0/24 -104.132.45.0/24 -104.132.46.0/23 -104.132.46.0/24 -104.132.47.0/24 -104.132.48.0/23 -104.132.48.0/24 -104.132.49.0/24 -104.132.50.0/23 -104.132.50.0/24 -104.132.51.0/24 -104.132.52.0/23 -104.132.52.0/24 -104.132.53.0/24 -104.132.54.0/23 -104.132.54.0/24 -104.132.55.0/24 -104.132.56.0/23 -104.132.56.0/24 -104.132.57.0/24 -104.132.58.0/23 -104.132.58.0/24 -104.132.59.0/24 -104.132.60.0/23 -104.132.60.0/24 -104.132.61.0/24 -104.132.62.0/23 -104.132.62.0/24 -104.132.63.0/24 -104.132.64.0/23 -104.132.64.0/24 -104.132.65.0/24 -104.132.66.0/23 -104.132.66.0/24 -104.132.67.0/24 -104.132.68.0/23 -104.132.68.0/24 -104.132.69.0/24 -104.132.70.0/23 -104.132.70.0/24 -104.132.71.0/24 -104.132.72.0/23 -104.132.72.0/24 -104.132.73.0/24 -104.132.74.0/23 -104.132.74.0/24 -104.132.75.0/24 -104.132.76.0/23 -104.132.76.0/24 -104.132.77.0/24 -104.132.78.0/23 -104.132.78.0/24 -104.132.79.0/24 -104.132.80.0/23 -104.132.80.0/24 -104.132.81.0/24 -104.132.82.0/23 -104.132.82.0/24 -104.132.83.0/24 -104.132.84.0/23 -104.132.84.0/24 -104.132.85.0/24 -104.132.86.0/23 -104.132.86.0/24 -104.132.87.0/24 -104.132.88.0/23 -104.132.88.0/24 -104.132.89.0/24 -104.132.90.0/23 -104.132.90.0/24 -104.132.91.0/24 -104.132.92.0/23 -104.132.92.0/24 -104.132.93.0/24 -104.132.94.0/23 -104.132.94.0/24 -104.132.95.0/24 -104.132.96.0/23 -104.132.96.0/24 -104.132.97.0/24 -104.132.98.0/23 -104.132.98.0/24 -104.132.99.0/24 -104.132.100.0/23 -104.132.100.0/24 -104.132.101.0/24 -104.132.102.0/23 -104.132.102.0/24 -104.132.103.0/24 -104.132.104.0/23 -104.132.104.0/24 -104.132.105.0/24 -104.132.106.0/23 -104.132.106.0/24 -104.132.107.0/24 -104.132.108.0/23 -104.132.108.0/24 -104.132.109.0/24 -104.132.110.0/23 -104.132.110.0/24 -104.132.111.0/24 -104.132.112.0/23 -104.132.112.0/24 -104.132.113.0/24 -104.132.114.0/23 -104.132.114.0/24 -104.132.115.0/24 -104.132.116.0/23 -104.132.116.0/24 -104.132.117.0/24 -104.132.118.0/23 -104.132.118.0/24 -104.132.119.0/24 -104.132.120.0/23 -104.132.120.0/24 -104.132.121.0/24 -104.132.122.0/23 -104.132.122.0/24 -104.132.123.0/24 -104.132.124.0/23 -104.132.124.0/24 -104.132.125.0/24 -104.132.126.0/23 -104.132.126.0/24 -104.132.127.0/24 -104.132.128.0/23 -104.132.128.0/24 -104.132.129.0/24 -104.132.130.0/23 -104.132.130.0/24 -104.132.131.0/24 -104.132.132.0/23 -104.132.132.0/24 -104.132.133.0/24 -104.132.134.0/23 -104.132.134.0/24 -104.132.135.0/24 -104.132.136.0/23 -104.132.136.0/24 -104.132.137.0/24 -104.132.138.0/23 -104.132.138.0/24 -104.132.139.0/24 -104.132.140.0/23 -104.132.140.0/24 -104.132.141.0/24 -104.132.142.0/23 -104.132.142.0/24 -104.132.143.0/24 -104.132.144.0/23 -104.132.144.0/24 -104.132.145.0/24 -104.132.146.0/23 -104.132.146.0/24 -104.132.147.0/24 -104.132.148.0/23 -104.132.148.0/24 -104.132.149.0/24 -104.132.150.0/23 -104.132.150.0/24 -104.132.151.0/24 -104.132.152.0/23 -104.132.152.0/24 -104.132.153.0/24 -104.132.154.0/23 -104.132.154.0/24 -104.132.155.0/24 -104.132.156.0/23 -104.132.156.0/24 -104.132.157.0/24 -104.132.158.0/23 -104.132.158.0/24 -104.132.159.0/24 -104.132.160.0/23 -104.132.160.0/24 -104.132.161.0/24 -104.132.162.0/23 -104.132.162.0/24 -104.132.163.0/24 -104.132.164.0/23 -104.132.164.0/24 -104.132.165.0/24 -104.132.166.0/23 -104.132.166.0/24 -104.132.167.0/24 -104.132.168.0/23 -104.132.168.0/24 -104.132.169.0/24 -104.132.170.0/23 -104.132.170.0/24 -104.132.171.0/24 -104.132.172.0/23 -104.132.172.0/24 -104.132.173.0/24 -104.132.174.0/23 -104.132.174.0/24 -104.132.175.0/24 -104.132.176.0/23 -104.132.176.0/24 -104.132.177.0/24 -104.132.178.0/23 -104.132.178.0/24 -104.132.179.0/24 -104.132.180.0/23 -104.132.180.0/24 -104.132.181.0/24 -104.132.182.0/23 -104.132.182.0/24 -104.132.183.0/24 -104.132.184.0/23 -104.132.184.0/24 -104.132.185.0/24 -104.132.186.0/23 -104.132.186.0/24 -104.132.187.0/24 -104.132.188.0/23 -104.132.188.0/24 -104.132.189.0/24 -104.132.190.0/23 -104.132.190.0/24 -104.132.191.0/24 -104.132.192.0/23 -104.132.192.0/24 -104.132.193.0/24 -104.132.194.0/23 -104.132.194.0/24 -104.132.195.0/24 -104.132.196.0/23 -104.132.196.0/24 -104.132.197.0/24 -104.132.198.0/23 -104.132.198.0/24 -104.132.199.0/24 -104.132.200.0/23 -104.132.200.0/24 -104.132.201.0/24 -104.132.202.0/23 -104.132.202.0/24 -104.132.203.0/24 -104.132.204.0/23 -104.132.204.0/24 -104.132.205.0/24 -104.132.206.0/23 -104.132.206.0/24 -104.132.207.0/24 -104.132.208.0/23 -104.132.208.0/24 -104.132.209.0/24 -104.132.210.0/23 -104.132.210.0/24 -104.132.211.0/24 -104.132.212.0/23 -104.132.212.0/24 -104.132.213.0/24 -104.132.214.0/23 -104.132.214.0/24 -104.132.215.0/24 -104.132.216.0/23 -104.132.216.0/24 -104.132.217.0/24 -104.132.218.0/23 -104.132.218.0/24 -104.132.219.0/24 -104.132.220.0/23 -104.132.220.0/24 -104.132.221.0/24 -104.132.222.0/23 -104.132.222.0/24 -104.132.223.0/24 -104.132.224.0/23 -104.132.224.0/24 -104.132.225.0/24 -104.132.226.0/23 -104.132.226.0/24 -104.132.227.0/24 -104.132.228.0/23 -104.132.228.0/24 -104.132.229.0/24 -104.132.230.0/23 -104.132.230.0/24 -104.132.231.0/24 -104.132.232.0/23 -104.132.232.0/24 -104.132.233.0/24 -104.132.234.0/23 -104.132.234.0/24 -104.132.235.0/24 -104.132.236.0/23 -104.132.236.0/24 -104.132.237.0/24 -104.132.238.0/23 -104.132.238.0/24 -104.132.239.0/24 -104.132.240.0/23 -104.132.240.0/24 -104.132.241.0/24 -104.132.242.0/23 -104.132.242.0/24 -104.132.243.0/24 -104.132.244.0/23 -104.132.244.0/24 -104.132.245.0/24 -104.132.246.0/23 -104.132.246.0/24 -104.132.247.0/24 -104.132.248.0/23 -104.132.248.0/24 -104.132.249.0/24 -104.132.250.0/23 -104.132.250.0/24 -104.132.251.0/24 -104.132.252.0/23 -104.132.252.0/24 -104.132.253.0/24 -104.132.254.0/23 -104.132.254.0/24 -104.132.255.0/24 -104.133.0.0/17 -104.133.0.0/23 -104.133.0.0/24 -104.133.1.0/24 -104.133.2.0/23 -104.133.2.0/24 -104.133.3.0/24 -104.133.4.0/23 -104.133.4.0/24 -104.133.5.0/24 -104.133.6.0/23 -104.133.6.0/24 -104.133.7.0/24 -104.133.8.0/23 -104.133.8.0/24 -104.133.9.0/24 -104.133.10.0/23 -104.133.10.0/24 -104.133.11.0/24 -104.133.12.0/23 -104.133.12.0/24 -104.133.13.0/24 -104.133.14.0/23 -104.133.14.0/24 -104.133.15.0/24 -104.133.16.0/23 -104.133.16.0/24 -104.133.17.0/24 -104.133.18.0/23 -104.133.18.0/24 -104.133.19.0/24 -104.133.20.0/23 -104.133.20.0/24 -104.133.21.0/24 -104.133.22.0/23 -104.133.22.0/24 -104.133.23.0/24 -104.133.24.0/23 -104.133.24.0/24 -104.133.25.0/24 -104.133.26.0/23 -104.133.26.0/24 -104.133.27.0/24 -104.133.28.0/23 -104.133.28.0/24 -104.133.29.0/24 -104.133.30.0/23 -104.133.30.0/24 -104.133.31.0/24 -104.133.32.0/23 -104.133.32.0/24 -104.133.33.0/24 -104.133.34.0/23 -104.133.34.0/24 -104.133.35.0/24 -104.133.36.0/23 -104.133.36.0/24 -104.133.37.0/24 -104.133.38.0/23 -104.133.38.0/24 -104.133.39.0/24 -104.133.40.0/23 -104.133.40.0/24 -104.133.41.0/24 -104.133.42.0/23 -104.133.42.0/24 -104.133.43.0/24 -104.133.44.0/23 -104.133.44.0/24 -104.133.45.0/24 -104.133.46.0/23 -104.133.46.0/24 -104.133.47.0/24 -104.133.48.0/23 -104.133.48.0/24 -104.133.49.0/24 -104.133.50.0/23 -104.133.50.0/24 -104.133.51.0/24 -104.133.52.0/23 -104.133.52.0/24 -104.133.53.0/24 -104.133.54.0/23 -104.133.54.0/24 -104.133.55.0/24 -104.133.56.0/23 -104.133.56.0/24 -104.133.57.0/24 -104.133.58.0/23 -104.133.58.0/24 -104.133.59.0/24 -104.133.60.0/23 -104.133.60.0/24 -104.133.61.0/24 -104.133.62.0/23 -104.133.62.0/24 -104.133.63.0/24 -104.133.64.0/23 -104.133.64.0/24 -104.133.65.0/24 -104.133.66.0/23 -104.133.66.0/24 -104.133.67.0/24 -104.133.68.0/23 -104.133.68.0/24 -104.133.69.0/24 -104.133.70.0/23 -104.133.70.0/24 -104.133.71.0/24 -104.133.72.0/23 -104.133.72.0/24 -104.133.73.0/24 -104.133.74.0/23 -104.133.74.0/24 -104.133.75.0/24 -104.133.76.0/23 -104.133.76.0/24 -104.133.77.0/24 -104.133.78.0/23 -104.133.78.0/24 -104.133.79.0/24 -104.133.80.0/23 -104.133.80.0/24 -104.133.81.0/24 -104.133.82.0/23 -104.133.82.0/24 -104.133.83.0/24 -104.133.84.0/23 -104.133.84.0/24 -104.133.85.0/24 -104.133.86.0/23 -104.133.86.0/24 -104.133.87.0/24 -104.133.88.0/23 -104.133.88.0/24 -104.133.89.0/24 -104.133.90.0/23 -104.133.90.0/24 -104.133.91.0/24 -104.133.92.0/23 -104.133.92.0/24 -104.133.93.0/24 -104.133.94.0/23 -104.133.94.0/24 -104.133.95.0/24 -104.133.96.0/23 -104.133.96.0/24 -104.133.97.0/24 -104.133.98.0/23 -104.133.98.0/24 -104.133.99.0/24 -104.133.100.0/23 -104.133.100.0/24 -104.133.101.0/24 -104.133.102.0/23 -104.133.102.0/24 -104.133.103.0/24 -104.133.104.0/23 -104.133.104.0/24 -104.133.105.0/24 -104.133.106.0/23 -104.133.106.0/24 -104.133.107.0/24 -104.133.108.0/23 -104.133.108.0/24 -104.133.109.0/24 -104.133.110.0/23 -104.133.110.0/24 -104.133.111.0/24 -104.133.112.0/23 -104.133.112.0/24 -104.133.113.0/24 -104.133.114.0/23 -104.133.114.0/24 -104.133.115.0/24 -104.133.116.0/23 -104.133.116.0/24 -104.133.117.0/24 -104.133.118.0/23 -104.133.118.0/24 -104.133.119.0/24 -104.133.120.0/23 -104.133.120.0/24 -104.133.121.0/24 -104.133.122.0/23 -104.133.122.0/24 -104.133.123.0/24 -104.133.124.0/23 -104.133.124.0/24 -104.133.125.0/24 -104.133.126.0/23 -104.133.126.0/24 -104.133.127.0/24 -104.134.128.0/17 -104.134.128.0/23 -104.134.128.0/24 -104.134.129.0/24 -104.134.130.0/23 -104.134.130.0/24 -104.134.131.0/24 -104.134.132.0/23 -104.134.132.0/24 -104.134.133.0/24 -104.134.134.0/23 -104.134.134.0/24 -104.134.135.0/24 -104.134.136.0/23 -104.134.136.0/24 -104.134.137.0/24 -104.134.138.0/23 -104.134.138.0/24 -104.134.139.0/24 -104.134.140.0/23 -104.134.140.0/24 -104.134.141.0/24 -104.134.142.0/23 -104.134.142.0/24 -104.134.143.0/24 -104.134.144.0/23 -104.134.144.0/24 -104.134.145.0/24 -104.134.146.0/23 -104.134.146.0/24 -104.134.147.0/24 -104.134.148.0/23 -104.134.148.0/24 -104.134.149.0/24 -104.134.150.0/23 -104.134.150.0/24 -104.134.151.0/24 -104.134.152.0/23 -104.134.152.0/24 -104.134.153.0/24 -104.134.154.0/23 -104.134.154.0/24 -104.134.155.0/24 -104.134.156.0/23 -104.134.156.0/24 -104.134.157.0/24 -104.134.158.0/23 -104.134.158.0/24 -104.134.159.0/24 -104.134.160.0/23 -104.134.160.0/24 -104.134.161.0/24 -104.134.162.0/23 -104.134.162.0/24 -104.134.163.0/24 -104.134.164.0/23 -104.134.164.0/24 -104.134.165.0/24 -104.134.166.0/23 -104.134.166.0/24 -104.134.167.0/24 -104.134.168.0/23 -104.134.168.0/24 -104.134.169.0/24 -104.134.170.0/23 -104.134.170.0/24 -104.134.171.0/24 -104.134.172.0/23 -104.134.172.0/24 -104.134.173.0/24 -104.134.174.0/23 -104.134.174.0/24 -104.134.175.0/24 -104.134.176.0/23 -104.134.176.0/24 -104.134.177.0/24 -104.134.178.0/23 -104.134.178.0/24 -104.134.179.0/24 -104.134.180.0/23 -104.134.180.0/24 -104.134.181.0/24 -104.134.182.0/23 -104.134.182.0/24 -104.134.183.0/24 -104.134.184.0/23 -104.134.184.0/24 -104.134.185.0/24 -104.134.186.0/23 -104.134.186.0/24 -104.134.187.0/24 -104.134.188.0/23 -104.134.188.0/24 -104.134.189.0/24 -104.134.190.0/23 -104.134.190.0/24 -104.134.191.0/24 -104.134.192.0/23 -104.134.193.0/24 -104.134.194.0/23 -104.134.194.0/24 -104.134.195.0/24 -104.134.196.0/23 -104.134.196.0/24 -104.134.197.0/24 -104.134.198.0/23 -104.134.198.0/24 -104.134.199.0/24 -104.134.200.0/23 -104.134.200.0/24 -104.134.201.0/24 -104.134.202.0/23 -104.134.202.0/24 -104.134.203.0/24 -104.134.204.0/23 -104.134.204.0/24 -104.134.205.0/24 -104.134.206.0/23 -104.134.206.0/24 -104.134.207.0/24 -104.134.208.0/23 -104.134.208.0/24 -104.134.209.0/24 -104.134.210.0/23 -104.134.210.0/24 -104.134.211.0/24 -104.134.212.0/23 -104.134.212.0/24 -104.134.213.0/24 -104.134.214.0/23 -104.134.214.0/24 -104.134.215.0/24 -104.134.216.0/23 -104.134.216.0/24 -104.134.217.0/24 -104.134.218.0/23 -104.134.218.0/24 -104.134.219.0/24 -104.134.220.0/23 -104.134.220.0/24 -104.134.221.0/24 -104.134.222.0/23 -104.134.222.0/24 -104.134.223.0/24 -104.134.224.0/23 -104.134.224.0/24 -104.134.225.0/24 -104.134.226.0/23 -104.134.226.0/24 -104.134.227.0/24 -104.134.228.0/23 -104.134.228.0/24 -104.134.229.0/24 -104.134.230.0/23 -104.134.230.0/24 -104.134.231.0/24 -104.134.232.0/23 -104.134.232.0/24 -104.134.233.0/24 -104.134.234.0/23 -104.134.234.0/24 -104.134.235.0/24 -104.134.236.0/23 -104.134.236.0/24 -104.134.237.0/24 -104.134.238.0/23 -104.134.238.0/24 -104.134.239.0/24 -104.134.240.0/23 -104.134.240.0/24 -104.134.241.0/24 -104.134.242.0/23 -104.134.242.0/24 -104.134.243.0/24 -104.134.244.0/23 -104.134.244.0/24 -104.134.245.0/24 -104.134.246.0/23 -104.134.246.0/24 -104.134.247.0/24 -104.134.248.0/23 -104.134.248.0/24 -104.134.249.0/24 -104.134.250.0/23 -104.134.250.0/24 -104.134.251.0/24 -104.134.252.0/23 -104.134.252.0/24 -104.134.253.0/24 -104.134.254.0/23 -104.134.254.0/24 -104.134.255.0/24 -113.197.106.0/24 -8.8.4.0/24 -8.8.8.0/24 -8.15.202.0/24 -8.34.208.0/21 -8.34.208.0/23 -8.34.208.0/24 -8.34.209.0/24 -8.34.210.0/23 -8.34.210.0/24 -8.34.211.0/24 -8.34.212.0/23 -8.34.212.0/24 -8.34.213.0/24 -8.34.214.0/23 -8.34.214.0/24 -8.34.215.0/24 -8.34.216.0/21 -8.34.216.0/23 -8.34.216.0/24 -8.34.217.0/24 -8.34.218.0/23 -8.34.218.0/24 -8.34.219.0/24 -8.34.220.0/23 -8.34.220.0/24 -8.34.221.0/24 -8.34.222.0/23 -8.34.222.0/24 -8.34.223.0/24 -8.35.192.0/23 -8.35.192.0/24 -8.35.193.0/24 -8.35.194.0/23 -8.35.194.0/24 -8.35.195.0/24 -8.35.196.0/23 -8.35.196.0/24 -8.35.197.0/24 -8.35.198.0/23 -8.35.198.0/24 -8.35.199.0/24 -8.35.200.0/21 -8.35.200.0/23 -8.35.200.0/24 -8.35.201.0/24 -8.35.202.0/23 -8.35.202.0/24 -8.35.203.0/24 -8.35.204.0/23 -8.35.204.0/24 -8.35.205.0/24 -8.35.206.0/23 -8.35.206.0/24 -8.35.207.0/24 -23.236.48.0/23 -23.236.48.0/24 -23.236.49.0/24 -23.236.50.0/23 -23.236.50.0/24 -23.236.51.0/24 -23.236.52.0/23 -23.236.52.0/24 -23.236.53.0/24 -23.236.54.0/23 -23.236.54.0/24 -23.236.55.0/24 -23.236.56.0/23 -23.236.56.0/24 -23.236.57.0/24 -23.236.58.0/23 -23.236.58.0/24 -23.236.59.0/24 -23.236.60.0/23 -23.236.60.0/24 -23.236.61.0/24 -23.236.62.0/23 -23.236.62.0/24 -23.236.63.0/24 -23.251.128.0/20 -23.251.144.0/20 -64.15.112.0/23 -64.15.112.0/24 -64.15.113.0/24 -64.15.114.0/23 -64.15.114.0/24 -64.15.115.0/24 -64.15.116.0/23 -64.15.116.0/24 -64.15.117.0/24 -64.15.118.0/23 -64.15.118.0/24 -64.15.119.0/24 -64.15.120.0/23 -64.15.120.0/24 -64.15.121.0/24 -64.15.122.0/23 -64.15.122.0/24 -64.15.123.0/24 -64.15.124.0/23 -64.15.124.0/24 -64.15.125.0/24 -64.15.126.0/23 -64.15.126.0/24 -64.15.127.0/24 -64.233.160.0/23 -64.233.160.0/24 -64.233.161.0/24 -64.233.162.0/23 -64.233.162.0/24 -64.233.163.0/24 -64.233.164.0/23 -64.233.164.0/24 -64.233.165.0/24 -64.233.166.0/23 -64.233.166.0/24 -64.233.167.0/24 -64.233.168.0/23 -64.233.168.0/24 -64.233.169.0/24 -64.233.170.0/23 -64.233.170.0/24 -64.233.171.0/24 -64.233.172.0/23 -64.233.172.0/24 -64.233.173.0/24 -64.233.174.0/23 -64.233.174.0/24 -64.233.175.0/24 -64.233.176.0/23 -64.233.176.0/24 -64.233.177.0/24 -64.233.178.0/23 -64.233.178.0/24 -64.233.179.0/24 -64.233.180.0/23 -64.233.180.0/24 -64.233.181.0/24 -64.233.182.0/23 -64.233.182.0/24 -64.233.183.0/24 -64.233.184.0/23 -64.233.184.0/24 -64.233.185.0/24 -64.233.186.0/23 -64.233.186.0/24 -64.233.187.0/24 -64.233.188.0/23 -64.233.188.0/24 -64.233.189.0/24 -64.233.190.0/23 -64.233.190.0/24 -64.233.191.0/24 -66.102.0.0/23 -66.102.0.0/24 -66.102.1.0/24 -66.102.2.0/23 -66.102.2.0/24 -66.102.3.0/24 -66.102.4.0/23 -66.102.4.0/24 -66.102.5.0/24 -66.102.6.0/23 -66.102.6.0/24 -66.102.7.0/24 -66.102.8.0/23 -66.102.8.0/24 -66.102.9.0/24 -66.102.10.0/23 -66.102.10.0/24 -66.102.11.0/24 -66.102.12.0/23 -66.102.12.0/24 -66.102.13.0/24 -66.102.14.0/23 -66.102.14.0/24 -66.102.15.0/24 -66.249.64.0/19 -66.249.64.0/23 -66.249.64.0/24 -66.249.66.0/24 -66.249.67.0/24 -66.249.68.0/23 -66.249.68.0/24 -66.249.69.0/24 -66.249.70.0/23 -66.249.70.0/24 -66.249.71.0/24 -66.249.72.0/23 -66.249.72.0/24 -66.249.73.0/24 -66.249.74.0/23 -66.249.74.0/24 -66.249.75.0/24 -66.249.76.0/23 -66.249.76.0/24 -66.249.77.0/24 -66.249.78.0/23 -66.249.78.0/24 -66.249.79.0/24 -66.249.80.0/23 -66.249.80.0/24 -66.249.81.0/24 -66.249.82.0/23 -66.249.82.0/24 -66.249.83.0/24 -66.249.84.0/23 -66.249.84.0/24 -66.249.85.0/24 -66.249.86.0/23 -66.249.86.0/24 -66.249.87.0/24 -66.249.88.0/23 -66.249.88.0/24 -66.249.89.0/24 -66.249.90.0/23 -66.249.90.0/24 -66.249.91.0/24 -66.249.92.0/23 -66.249.92.0/24 -66.249.93.0/24 -66.249.94.0/23 -66.249.94.0/24 -66.249.95.0/24 -72.14.192.0/23 -72.14.192.0/24 -72.14.193.0/24 -72.14.194.0/23 -72.14.194.0/24 -72.14.195.0/24 -72.14.196.0/23 -72.14.196.0/24 -72.14.197.0/24 -72.14.198.0/23 -72.14.198.0/24 -72.14.199.0/24 -72.14.200.0/23 -72.14.200.0/24 -72.14.201.0/24 -72.14.202.0/23 -72.14.202.0/24 -72.14.203.0/24 -72.14.204.0/23 -72.14.204.0/24 -72.14.205.0/24 -72.14.206.0/23 -72.14.206.0/24 -72.14.207.0/24 -72.14.208.0/23 -72.14.208.0/24 -72.14.209.0/24 -72.14.210.0/23 -72.14.210.0/24 -72.14.211.0/24 -72.14.212.0/23 -72.14.212.0/24 -72.14.213.0/24 -72.14.214.0/23 -72.14.214.0/24 -72.14.215.0/24 -72.14.216.0/23 -72.14.216.0/24 -72.14.217.0/24 -72.14.218.0/23 -72.14.218.0/24 -72.14.219.0/24 -72.14.220.0/23 -72.14.220.0/24 -72.14.221.0/24 -72.14.222.0/23 -72.14.222.0/24 -72.14.223.0/24 -72.14.224.0/23 -72.14.224.0/24 -72.14.225.0/24 -72.14.226.0/23 -72.14.226.0/24 -72.14.227.0/24 -72.14.228.0/23 -72.14.228.0/24 -72.14.229.0/24 -72.14.230.0/23 -72.14.230.0/24 -72.14.231.0/24 -72.14.232.0/23 -72.14.232.0/24 -72.14.233.0/24 -72.14.234.0/23 -72.14.234.0/24 -72.14.235.0/24 -72.14.236.0/23 -72.14.236.0/24 -72.14.237.0/24 -72.14.238.0/23 -72.14.238.0/24 -72.14.239.0/24 -72.14.240.0/23 -72.14.240.0/24 -72.14.241.0/24 -72.14.242.0/23 -72.14.242.0/24 -72.14.243.0/24 -72.14.244.0/23 -72.14.244.0/24 -72.14.245.0/24 -72.14.246.0/23 -72.14.246.0/24 -72.14.247.0/24 -72.14.248.0/23 -72.14.248.0/24 -72.14.249.0/24 -72.14.250.0/23 -72.14.250.0/24 -72.14.251.0/24 -72.14.252.0/23 -72.14.252.0/24 -72.14.253.0/24 -72.14.254.0/23 -72.14.254.0/24 -72.14.255.0/24 -74.125.0.0/23 -74.125.0.0/24 -74.125.1.0/24 -74.125.2.0/23 -74.125.2.0/24 -74.125.3.0/24 -74.125.4.0/23 -74.125.4.0/24 -74.125.5.0/24 -74.125.6.0/23 -74.125.6.0/24 -74.125.7.0/24 -74.125.8.0/23 -74.125.8.0/24 -74.125.9.0/24 -74.125.10.0/23 -74.125.10.0/24 -74.125.11.0/24 -74.125.12.0/23 -74.125.12.0/24 -74.125.13.0/24 -74.125.14.0/23 -74.125.14.0/24 -74.125.15.0/24 -74.125.16.0/23 -74.125.16.0/24 -74.125.17.0/24 -74.125.18.0/23 -74.125.18.0/24 -74.125.19.0/24 -74.125.20.0/23 -74.125.20.0/24 -74.125.21.0/24 -74.125.22.0/23 -74.125.22.0/24 -74.125.23.0/24 -74.125.24.0/23 -74.125.24.0/24 -74.125.25.0/24 -74.125.26.0/23 -74.125.26.0/24 -74.125.27.0/24 -74.125.28.0/23 -74.125.28.0/24 -74.125.29.0/24 -74.125.30.0/23 -74.125.30.0/24 -74.125.31.0/24 -74.125.32.0/23 -74.125.32.0/24 -74.125.33.0/24 -74.125.34.0/23 -74.125.34.0/24 -74.125.35.0/24 -74.125.36.0/23 -74.125.36.0/24 -74.125.37.0/24 -74.125.38.0/23 -74.125.38.0/24 -74.125.39.0/24 -74.125.40.0/23 -74.125.40.0/24 -74.125.41.0/24 -74.125.42.0/23 -74.125.42.0/24 -74.125.43.0/24 -74.125.44.0/23 -74.125.44.0/24 -74.125.45.0/24 -74.125.46.0/23 -74.125.46.0/24 -74.125.47.0/24 -74.125.48.0/23 -74.125.48.0/24 -74.125.49.0/24 -74.125.50.0/23 -74.125.50.0/24 -74.125.51.0/24 -74.125.52.0/23 -74.125.52.0/24 -74.125.53.0/24 -74.125.54.0/23 -74.125.54.0/24 -74.125.55.0/24 -74.125.56.0/23 -74.125.56.0/24 -74.125.57.0/24 -74.125.58.0/23 -74.125.58.0/24 -74.125.59.0/24 -74.125.60.0/23 -74.125.60.0/24 -74.125.61.0/24 -74.125.62.0/23 -74.125.62.0/24 -74.125.63.0/24 -74.125.64.0/23 -74.125.64.0/24 -74.125.65.0/24 -74.125.66.0/23 -74.125.66.0/24 -74.125.67.0/24 -74.125.68.0/23 -74.125.68.0/24 -74.125.69.0/24 -74.125.70.0/23 -74.125.70.0/24 -74.125.71.0/24 -74.125.72.0/23 -74.125.72.0/24 -74.125.73.0/24 -74.125.74.0/23 -74.125.74.0/24 -74.125.75.0/24 -74.125.76.0/23 -74.125.76.0/24 -74.125.77.0/24 -74.125.78.0/23 -74.125.78.0/24 -74.125.79.0/24 -74.125.80.0/23 -74.125.80.0/24 -74.125.81.0/24 -74.125.82.0/23 -74.125.82.0/24 -74.125.83.0/24 -74.125.84.0/23 -74.125.84.0/24 -74.125.85.0/24 -74.125.86.0/23 -74.125.86.0/24 -74.125.87.0/24 -74.125.88.0/23 -74.125.88.0/24 -74.125.89.0/24 -74.125.90.0/23 -74.125.90.0/24 -74.125.91.0/24 -74.125.92.0/23 -74.125.92.0/24 -74.125.93.0/24 -74.125.94.0/23 -74.125.94.0/24 -74.125.95.0/24 -74.125.96.0/23 -74.125.96.0/24 -74.125.97.0/24 -74.125.98.0/23 -74.125.98.0/24 -74.125.99.0/24 -74.125.100.0/23 -74.125.100.0/24 -74.125.101.0/24 -74.125.102.0/23 -74.125.102.0/24 -74.125.103.0/24 -74.125.104.0/23 -74.125.104.0/24 -74.125.105.0/24 -74.125.106.0/23 -74.125.106.0/24 -74.125.107.0/24 -74.125.108.0/23 -74.125.108.0/24 -74.125.109.0/24 -74.125.110.0/23 -74.125.110.0/24 -74.125.111.0/24 -74.125.112.0/23 -74.125.112.0/24 -74.125.113.0/24 -74.125.114.0/23 -74.125.114.0/24 -74.125.115.0/24 -74.125.116.0/23 -74.125.116.0/24 -74.125.117.0/24 -74.125.118.0/23 -74.125.118.0/24 -74.125.119.0/24 -74.125.120.0/23 -74.125.120.0/24 -74.125.121.0/24 -74.125.122.0/23 -74.125.122.0/24 -74.125.123.0/24 -74.125.124.0/23 -74.125.124.0/24 -74.125.125.0/24 -74.125.126.0/23 -74.125.126.0/24 -74.125.127.0/24 -74.125.128.0/23 -74.125.128.0/24 -74.125.129.0/24 -74.125.130.0/23 -74.125.130.0/24 -74.125.131.0/24 -74.125.132.0/23 -74.125.132.0/24 -74.125.133.0/24 -74.125.134.0/23 -74.125.134.0/24 -74.125.135.0/24 -74.125.136.0/23 -74.125.136.0/24 -74.125.137.0/24 -74.125.138.0/23 -74.125.138.0/24 -74.125.139.0/24 -74.125.140.0/23 -74.125.140.0/24 -74.125.141.0/24 -74.125.142.0/23 -74.125.142.0/24 -74.125.143.0/24 -74.125.144.0/23 -74.125.144.0/24 -74.125.145.0/24 -74.125.146.0/23 -74.125.146.0/24 -74.125.147.0/24 -74.125.148.0/23 -74.125.148.0/24 -74.125.149.0/24 -74.125.150.0/23 -74.125.150.0/24 -74.125.151.0/24 -74.125.152.0/23 -74.125.152.0/24 -74.125.153.0/24 -74.125.154.0/23 -74.125.154.0/24 -74.125.155.0/24 -74.125.156.0/23 -74.125.156.0/24 -74.125.157.0/24 -74.125.158.0/23 -74.125.158.0/24 -74.125.159.0/24 -74.125.160.0/23 -74.125.160.0/24 -74.125.161.0/24 -74.125.162.0/23 -74.125.162.0/24 -74.125.163.0/24 -74.125.164.0/23 -74.125.164.0/24 -74.125.165.0/24 -74.125.166.0/23 -74.125.166.0/24 -74.125.167.0/24 -74.125.168.0/23 -74.125.168.0/24 -74.125.169.0/24 -74.125.170.0/23 -74.125.170.0/24 -74.125.171.0/24 -74.125.172.0/23 -74.125.172.0/24 -74.125.173.0/24 -74.125.174.0/23 -74.125.174.0/24 -74.125.175.0/24 -74.125.176.0/23 -74.125.176.0/24 -74.125.177.0/24 -74.125.178.0/23 -74.125.178.0/24 -74.125.179.0/24 -74.125.180.0/23 -74.125.180.0/24 -74.125.181.0/24 -74.125.182.0/23 -74.125.182.0/24 -74.125.183.0/24 -74.125.184.0/23 -74.125.184.0/24 -74.125.185.0/24 -74.125.186.0/23 -74.125.186.0/24 -74.125.187.0/24 -74.125.188.0/23 -74.125.188.0/24 -74.125.189.0/24 -74.125.190.0/23 -74.125.190.0/24 -74.125.191.0/24 -74.125.192.0/23 -74.125.192.0/24 -74.125.193.0/24 -74.125.194.0/23 -74.125.194.0/24 -74.125.195.0/24 -74.125.196.0/23 -74.125.196.0/24 -74.125.197.0/24 -74.125.198.0/23 -74.125.198.0/24 -74.125.199.0/24 -74.125.200.0/23 -74.125.200.0/24 -74.125.201.0/24 -74.125.202.0/23 -74.125.202.0/24 -74.125.203.0/24 -74.125.204.0/23 -74.125.204.0/24 -74.125.205.0/24 -74.125.206.0/23 -74.125.206.0/24 -74.125.207.0/24 -74.125.208.0/23 -74.125.208.0/24 -74.125.209.0/24 -74.125.210.0/23 -74.125.210.0/24 -74.125.211.0/24 -74.125.212.0/23 -74.125.212.0/24 -74.125.213.0/24 -74.125.214.0/23 -74.125.214.0/24 -74.125.215.0/24 -74.125.216.0/23 -74.125.216.0/24 -74.125.217.0/24 -74.125.218.0/23 -74.125.218.0/24 -74.125.219.0/24 -74.125.220.0/23 -74.125.220.0/24 -74.125.221.0/24 -74.125.222.0/23 -74.125.222.0/24 -74.125.223.0/24 -74.125.224.0/23 -74.125.224.0/24 -74.125.225.0/24 -74.125.226.0/23 -74.125.226.0/24 -74.125.227.0/24 -74.125.228.0/23 -74.125.228.0/24 -74.125.229.0/24 -74.125.230.0/23 -74.125.230.0/24 -74.125.231.0/24 -74.125.232.0/23 -74.125.232.0/24 -74.125.233.0/24 -74.125.234.0/23 -74.125.234.0/24 -74.125.235.0/24 -74.125.236.0/23 -74.125.236.0/24 -74.125.237.0/24 -74.125.238.0/23 -74.125.238.0/24 -74.125.239.0/24 -74.125.240.0/23 -74.125.240.0/24 -74.125.241.0/24 -74.125.242.0/23 -74.125.242.0/24 -74.125.243.0/24 -74.125.244.0/23 -74.125.244.0/24 -74.125.245.0/24 -74.125.246.0/23 -74.125.246.0/24 -74.125.247.0/24 -74.125.248.0/23 -74.125.248.0/24 -74.125.249.0/24 -74.125.250.0/23 -74.125.250.0/24 -74.125.251.0/24 -74.125.252.0/23 -74.125.252.0/24 -74.125.253.0/24 -74.125.254.0/23 -74.125.254.0/24 -74.125.255.0/24 -104.154.0.0/15 -104.154.0.0/20 -104.154.32.0/20 -104.154.48.0/20 -104.154.64.0/20 -104.154.80.0/20 -104.154.112.0/20 -104.154.128.0/20 -104.154.144.0/20 -104.154.160.0/20 -104.154.176.0/20 -104.154.192.0/20 -104.154.208.0/20 -104.154.224.0/20 -104.154.240.0/20 -104.155.0.0/20 -104.155.16.0/20 -104.155.32.0/20 -104.155.48.0/20 -104.155.64.0/20 -104.155.80.0/20 -104.155.96.0/20 -104.155.112.0/20 -104.155.128.0/20 -104.155.144.0/20 -104.155.160.0/20 -104.155.176.0/20 -104.155.192.0/20 -104.155.208.0/20 -104.155.240.0/20 -104.196.0.0/14 -104.196.0.0/19 -104.196.0.0/20 -104.196.16.0/20 -104.196.32.0/19 -104.196.32.0/20 -104.196.48.0/20 -104.196.64.0/19 -104.196.64.0/20 -104.196.80.0/20 -104.196.96.0/20 -104.196.112.0/20 -104.196.128.0/19 -104.196.128.0/20 -104.196.144.0/20 -104.196.160.0/19 -104.196.160.0/20 -104.196.176.0/20 -104.196.192.0/19 -104.196.192.0/20 -104.196.208.0/20 -104.196.224.0/19 -104.196.224.0/20 -104.196.240.0/20 -104.197.0.0/19 -104.197.0.0/20 -104.197.16.0/20 -104.197.32.0/19 -104.197.32.0/20 -104.197.48.0/20 -104.197.64.0/19 -104.197.64.0/20 -104.197.80.0/20 -104.197.96.0/19 -104.197.96.0/20 -104.197.112.0/20 -104.197.128.0/19 -104.197.128.0/20 -104.197.144.0/20 -104.197.160.0/19 -104.197.160.0/20 -104.197.176.0/20 -104.197.192.0/19 -104.197.192.0/20 -104.197.208.0/20 -104.197.224.0/19 -104.197.224.0/20 -104.197.240.0/20 -104.198.0.0/19 -104.198.0.0/20 -104.198.16.0/20 -104.198.32.0/19 -104.198.32.0/20 -104.198.48.0/20 -104.198.64.0/19 -104.198.64.0/20 -104.198.80.0/20 -104.198.96.0/19 -104.198.96.0/20 -104.198.112.0/20 -104.198.128.0/19 -104.198.128.0/20 -104.198.144.0/20 -104.198.160.0/19 -104.198.160.0/20 -104.198.176.0/20 -104.198.192.0/19 -104.198.192.0/20 -104.198.208.0/20 -104.198.224.0/19 -104.198.224.0/20 -104.198.240.0/20 -104.199.0.0/19 -104.199.0.0/20 -104.199.16.0/20 -104.199.32.0/19 -104.199.32.0/20 -104.199.48.0/20 -104.199.64.0/19 -104.199.64.0/20 -104.199.96.0/20 -104.199.112.0/20 -104.199.128.0/19 -104.199.128.0/20 -104.199.144.0/20 -104.199.160.0/19 -104.199.160.0/20 -104.199.176.0/20 -104.199.192.0/20 -104.199.208.0/20 -104.199.224.0/19 -104.199.240.0/20 -107.167.160.0/20 -107.167.176.0/20 -107.178.192.0/18 -107.178.192.0/19 -107.178.192.0/20 -107.178.224.0/19 -107.178.224.0/20 -108.59.80.0/23 -108.59.80.0/24 -108.59.81.0/24 -108.59.82.0/23 -108.59.82.0/24 -108.59.83.0/24 -108.59.84.0/23 -108.59.84.0/24 -108.59.85.0/24 -108.59.86.0/23 -108.59.86.0/24 -108.59.87.0/24 -108.59.88.0/23 -108.59.88.0/24 -108.59.89.0/24 -108.59.90.0/23 -108.59.90.0/24 -108.59.91.0/24 -108.59.92.0/23 -108.59.92.0/24 -108.59.93.0/24 -108.59.94.0/23 -108.59.94.0/24 -108.59.95.0/24 -108.170.192.0/18 -108.170.192.0/23 -108.170.192.0/24 -108.170.193.0/24 -108.170.194.0/23 -108.170.194.0/24 -108.170.195.0/24 -108.170.196.0/23 -108.170.196.0/24 -108.170.197.0/24 -108.170.198.0/23 -108.170.198.0/24 -108.170.199.0/24 -108.170.200.0/23 -108.170.200.0/24 -108.170.201.0/24 -108.170.202.0/23 -108.170.202.0/24 -108.170.203.0/24 -108.170.204.0/23 -108.170.204.0/24 -108.170.205.0/24 -108.170.206.0/23 -108.170.206.0/24 -108.170.207.0/24 -108.170.208.0/23 -108.170.208.0/24 -108.170.209.0/24 -108.170.210.0/23 -108.170.210.0/24 -108.170.211.0/24 -108.170.212.0/23 -108.170.212.0/24 -108.170.213.0/24 -108.170.214.0/23 -108.170.214.0/24 -108.170.215.0/24 -108.170.216.0/23 -108.170.216.0/24 -108.170.217.0/24 -108.170.218.0/23 -108.170.218.0/24 -108.170.219.0/24 -108.170.220.0/23 -108.170.220.0/24 -108.170.221.0/24 -108.170.222.0/24 -108.170.223.0/24 -108.170.224.0/23 -108.170.224.0/24 -108.170.225.0/24 -108.170.226.0/23 -108.170.226.0/24 -108.170.227.0/24 -108.170.228.0/23 -108.170.228.0/24 -108.170.229.0/24 -108.170.230.0/23 -108.170.230.0/24 -108.170.231.0/24 -108.170.232.0/23 -108.170.232.0/24 -108.170.233.0/24 -108.170.234.0/23 -108.170.234.0/24 -108.170.235.0/24 -108.170.236.0/23 -108.170.236.0/24 -108.170.237.0/24 -108.170.238.0/23 -108.170.238.0/24 -108.170.239.0/24 -108.170.240.0/23 -108.170.240.0/24 -108.170.241.0/24 -108.170.242.0/23 -108.170.242.0/24 -108.170.243.0/24 -108.170.244.0/23 -108.170.244.0/24 -108.170.245.0/24 -108.170.246.0/23 -108.170.246.0/24 -108.170.247.0/24 -108.170.248.0/23 -108.170.248.0/24 -108.170.249.0/24 -108.170.250.0/23 -108.170.250.0/24 -108.170.251.0/24 -108.170.252.0/23 -108.170.252.0/24 -108.170.253.0/24 -108.170.254.0/23 -108.170.254.0/24 -108.170.255.0/24 -108.177.0.0/17 -108.177.0.0/23 -108.177.0.0/24 -108.177.1.0/24 -108.177.2.0/23 -108.177.2.0/24 -108.177.3.0/24 -108.177.4.0/23 -108.177.4.0/24 -108.177.5.0/24 -108.177.6.0/23 -108.177.6.0/24 -108.177.7.0/24 -108.177.8.0/23 -108.177.8.0/24 -108.177.9.0/24 -108.177.10.0/23 -108.177.10.0/24 -108.177.11.0/24 -108.177.12.0/23 -108.177.12.0/24 -108.177.13.0/24 -108.177.14.0/23 -108.177.14.0/24 -108.177.15.0/24 -108.177.18.0/23 -108.177.18.0/24 -108.177.19.0/24 -108.177.24.0/23 -108.177.24.0/24 -108.177.25.0/24 -108.177.26.0/23 -108.177.26.0/24 -108.177.27.0/24 -108.177.28.0/23 -108.177.28.0/24 -108.177.29.0/24 -108.177.30.0/23 -108.177.30.0/24 -108.177.31.0/24 -108.177.32.0/23 -108.177.32.0/24 -108.177.33.0/24 -108.177.34.0/23 -108.177.34.0/24 -108.177.35.0/24 -108.177.36.0/23 -108.177.36.0/24 -108.177.37.0/24 -108.177.38.0/23 -108.177.38.0/24 -108.177.39.0/24 -108.177.40.0/23 -108.177.40.0/24 -108.177.41.0/24 -108.177.42.0/23 -108.177.42.0/24 -108.177.43.0/24 -108.177.44.0/23 -108.177.44.0/24 -108.177.45.0/24 -108.177.46.0/23 -108.177.46.0/24 -108.177.47.0/24 -108.177.48.0/23 -108.177.48.0/24 -108.177.49.0/24 -108.177.50.0/23 -108.177.50.0/24 -108.177.51.0/24 -108.177.52.0/23 -108.177.52.0/24 -108.177.53.0/24 -108.177.54.0/23 -108.177.54.0/24 -108.177.55.0/24 -108.177.56.0/23 -108.177.56.0/24 -108.177.57.0/24 -108.177.58.0/23 -108.177.58.0/24 -108.177.59.0/24 -108.177.60.0/23 -108.177.60.0/24 -108.177.61.0/24 -108.177.62.0/23 -108.177.62.0/24 -108.177.63.0/24 -108.177.64.0/23 -108.177.64.0/24 -108.177.65.0/24 -108.177.66.0/23 -108.177.66.0/24 -108.177.67.0/24 -108.177.68.0/23 -108.177.68.0/24 -108.177.69.0/24 -108.177.70.0/23 -108.177.70.0/24 -108.177.71.0/24 -108.177.72.0/23 -108.177.72.0/24 -108.177.73.0/24 -108.177.74.0/23 -108.177.74.0/24 -108.177.75.0/24 -108.177.76.0/23 -108.177.76.0/24 -108.177.77.0/24 -108.177.78.0/23 -108.177.78.0/24 -108.177.79.0/24 -108.177.80.0/23 -108.177.80.0/24 -108.177.81.0/24 -108.177.82.0/23 -108.177.82.0/24 -108.177.83.0/24 -108.177.84.0/23 -108.177.84.0/24 -108.177.85.0/24 -108.177.86.0/23 -108.177.86.0/24 -108.177.87.0/24 -108.177.88.0/23 -108.177.88.0/24 -108.177.89.0/24 -108.177.90.0/23 -108.177.90.0/24 -108.177.91.0/24 -108.177.92.0/23 -108.177.92.0/24 -108.177.93.0/24 -108.177.94.0/23 -108.177.94.0/24 -108.177.95.0/24 -108.177.96.0/23 -108.177.96.0/24 -108.177.97.0/24 -108.177.98.0/23 -108.177.98.0/24 -108.177.99.0/24 -108.177.100.0/23 -108.177.100.0/24 -108.177.101.0/24 -108.177.102.0/23 -108.177.102.0/24 -108.177.103.0/24 -108.177.104.0/23 -108.177.104.0/24 -108.177.105.0/24 -108.177.106.0/23 -108.177.106.0/24 -108.177.107.0/24 -108.177.108.0/23 -108.177.108.0/24 -108.177.109.0/24 -108.177.110.0/23 -108.177.110.0/24 -108.177.111.0/24 -108.177.112.0/23 -108.177.112.0/24 -108.177.113.0/24 -108.177.114.0/23 -108.177.114.0/24 -108.177.115.0/24 -108.177.116.0/23 -108.177.116.0/24 -108.177.117.0/24 -108.177.118.0/23 -108.177.118.0/24 -108.177.119.0/24 -108.177.120.0/23 -108.177.120.0/24 -108.177.121.0/24 -108.177.122.0/23 -108.177.122.0/24 -108.177.123.0/24 -108.177.124.0/23 -108.177.124.0/24 -108.177.125.0/24 -108.177.126.0/23 -108.177.126.0/24 -108.177.127.0/24 -130.211.0.0/16 -130.211.0.0/19 -130.211.0.0/20 -130.211.32.0/20 -130.211.48.0/20 -130.211.64.0/19 -130.211.64.0/20 -130.211.80.0/20 -130.211.96.0/19 -130.211.96.0/20 -130.211.112.0/20 -130.211.128.0/19 -130.211.128.0/20 -130.211.144.0/20 -130.211.160.0/19 -130.211.160.0/20 -130.211.176.0/20 -130.211.192.0/19 -130.211.192.0/20 -130.211.208.0/20 -130.211.224.0/19 -130.211.224.0/20 -130.211.240.0/20 -142.250.0.0/15 -142.250.0.0/23 -142.250.0.0/24 -142.250.2.0/23 -142.250.4.0/23 -142.250.6.0/23 -142.250.8.0/23 -142.250.10.0/23 -142.250.12.0/23 -142.250.13.0/24 -142.250.14.0/23 -142.250.14.0/24 -142.250.15.0/24 -142.250.16.0/23 -142.250.16.0/24 -142.250.17.0/24 -142.250.18.0/23 -142.250.18.0/24 -142.250.19.0/24 -142.250.20.0/23 -142.250.20.0/24 -142.250.21.0/24 -142.250.22.0/23 -142.250.22.0/24 -142.250.23.0/24 -142.250.24.0/23 -142.250.24.0/24 -142.250.25.0/24 -142.250.26.0/23 -142.250.26.0/24 -142.250.27.0/24 -142.250.28.0/23 -142.250.28.0/24 -142.250.29.0/24 -142.250.30.0/23 -142.250.30.0/24 -142.250.31.0/24 -142.250.32.0/23 -142.250.32.0/24 -142.250.33.0/24 -142.250.34.0/23 -142.250.34.0/24 -142.250.35.0/24 -142.250.36.0/23 -142.250.36.0/24 -142.250.37.0/24 -142.250.38.0/23 -142.250.38.0/24 -142.250.39.0/24 -142.250.40.0/23 -142.250.40.0/24 -142.250.41.0/24 -142.250.42.0/23 -142.250.42.0/24 -142.250.43.0/24 -142.250.44.0/23 -142.250.44.0/24 -142.250.45.0/24 -142.250.46.0/23 -142.250.46.0/24 -142.250.47.0/24 -142.250.48.0/23 -142.250.48.0/24 -142.250.49.0/24 -142.250.50.0/23 -142.250.50.0/24 -142.250.51.0/24 -142.250.52.0/23 -142.250.52.0/24 -142.250.53.0/24 -142.250.54.0/23 -142.250.54.0/24 -142.250.55.0/24 -142.250.56.0/23 -142.250.56.0/24 -142.250.57.0/24 -142.250.58.0/23 -142.250.58.0/24 -142.250.59.0/24 -142.250.60.0/23 -142.250.60.0/24 -142.250.61.0/24 -142.250.62.0/23 -142.250.62.0/24 -142.250.63.0/24 -142.250.64.0/23 -142.250.64.0/24 -142.250.65.0/24 -142.250.66.0/23 -142.250.66.0/24 -142.250.67.0/24 -142.250.68.0/23 -142.250.68.0/24 -142.250.69.0/24 -142.250.70.0/23 -142.250.70.0/24 -142.250.71.0/24 -142.250.72.0/23 -142.250.72.0/24 -142.250.73.0/24 -142.250.74.0/23 -142.250.74.0/24 -142.250.75.0/24 -142.250.76.0/23 -142.250.76.0/24 -142.250.77.0/24 -142.250.78.0/23 -142.250.78.0/24 -142.250.79.0/24 -142.250.80.0/23 -142.250.80.0/24 -142.250.81.0/24 -142.250.82.0/23 -142.250.82.0/24 -142.250.83.0/24 -142.250.84.0/23 -142.250.84.0/24 -142.250.85.0/24 -142.250.86.0/23 -142.250.86.0/24 -142.250.87.0/24 -142.250.88.0/23 -142.250.88.0/24 -142.250.89.0/24 -142.250.90.0/23 -142.250.90.0/24 -142.250.91.0/24 -142.250.92.0/23 -142.250.92.0/24 -142.250.93.0/24 -142.250.94.0/23 -142.250.94.0/24 -142.250.95.0/24 -142.250.96.0/23 -142.250.96.0/24 -142.250.97.0/24 -142.250.98.0/23 -142.250.98.0/24 -142.250.99.0/24 -142.250.100.0/23 -142.250.100.0/24 -142.250.101.0/24 -142.250.102.0/23 -142.250.102.0/24 -142.250.103.0/24 -142.250.104.0/23 -142.250.104.0/24 -142.250.105.0/24 -142.250.106.0/23 -142.250.106.0/24 -142.250.107.0/24 -142.250.108.0/23 -142.250.108.0/24 -142.250.109.0/24 -142.250.110.0/23 -142.250.110.0/24 -142.250.111.0/24 -142.250.112.0/23 -142.250.112.0/24 -142.250.113.0/24 -142.250.114.0/23 -142.250.114.0/24 -142.250.115.0/24 -142.250.116.0/23 -142.250.116.0/24 -142.250.117.0/24 -142.250.118.0/23 -142.250.118.0/24 -142.250.119.0/24 -142.250.120.0/23 -142.250.120.0/24 -142.250.121.0/24 -142.250.122.0/23 -142.250.122.0/24 -142.250.123.0/24 -142.250.124.0/23 -142.250.124.0/24 -142.250.125.0/24 -142.250.126.0/23 -142.250.126.0/24 -142.250.127.0/24 -142.250.128.0/23 -142.250.128.0/24 -142.250.129.0/24 -142.250.130.0/23 -142.250.130.0/24 -142.250.131.0/24 -142.250.132.0/23 -142.250.132.0/24 -142.250.133.0/24 -142.250.134.0/23 -142.250.134.0/24 -142.250.135.0/24 -142.250.136.0/23 -142.250.136.0/24 -142.250.137.0/24 -142.250.138.0/23 -142.250.138.0/24 -142.250.139.0/24 -142.250.140.0/23 -142.250.140.0/24 -142.250.141.0/24 -142.250.142.0/23 -142.250.142.0/24 -142.250.143.0/24 -142.250.144.0/23 -142.250.144.0/24 -142.250.145.0/24 -142.250.146.0/23 -142.250.146.0/24 -142.250.147.0/24 -142.250.148.0/23 -142.250.148.0/24 -142.250.149.0/24 -142.250.150.0/23 -142.250.150.0/24 -142.250.151.0/24 -142.250.152.0/23 -142.250.152.0/24 -142.250.153.0/24 -142.250.154.0/23 -142.250.154.0/24 -142.250.155.0/24 -142.250.156.0/23 -142.250.156.0/24 -142.250.157.0/24 -142.250.158.0/23 -142.250.158.0/24 -142.250.159.0/24 -142.250.160.0/23 -142.250.160.0/24 -142.250.161.0/24 -142.250.162.0/23 -142.250.162.0/24 -142.250.163.0/24 -142.250.164.0/23 -142.250.164.0/24 -142.250.165.0/24 -142.250.166.0/23 -142.250.166.0/24 -142.250.167.0/24 -142.250.168.0/23 -142.250.168.0/24 -142.250.169.0/24 -142.250.170.0/23 -142.250.170.0/24 -142.250.171.0/24 -142.250.172.0/23 -142.250.172.0/24 -142.250.173.0/24 -142.250.174.0/23 -142.250.174.0/24 -142.250.175.0/24 -142.250.176.0/23 -142.250.176.0/24 -142.250.177.0/24 -142.250.178.0/23 -142.250.178.0/24 -142.250.179.0/24 -142.250.180.0/23 -142.250.180.0/24 -142.250.181.0/24 -142.250.182.0/23 -142.250.182.0/24 -142.250.183.0/24 -142.250.184.0/23 -142.250.184.0/24 -142.250.185.0/24 -142.250.186.0/23 -142.250.186.0/24 -142.250.187.0/24 -142.250.188.0/23 -142.250.188.0/24 -142.250.189.0/24 -142.250.190.0/23 -142.250.190.0/24 -142.250.191.0/24 -142.250.192.0/23 -142.250.192.0/24 -142.250.193.0/24 -142.250.194.0/23 -142.250.194.0/24 -142.250.195.0/24 -142.250.196.0/23 -142.250.196.0/24 -142.250.197.0/24 -142.250.198.0/23 -142.250.198.0/24 -142.250.199.0/24 -142.250.200.0/23 -142.250.200.0/24 -142.250.201.0/24 -142.250.202.0/23 -142.250.202.0/24 -142.250.203.0/24 -142.250.204.0/23 -142.250.204.0/24 -142.250.205.0/24 -142.250.206.0/23 -142.250.206.0/24 -142.250.207.0/24 -142.250.208.0/23 -142.250.208.0/24 -142.250.209.0/24 -142.250.210.0/23 -142.250.210.0/24 -142.250.211.0/24 -142.250.212.0/23 -142.250.212.0/24 -142.250.213.0/24 -142.250.214.0/23 -142.250.214.0/24 -142.250.215.0/24 -142.250.216.0/23 -142.250.216.0/24 -142.250.217.0/24 -142.250.218.0/23 -142.250.218.0/24 -142.250.219.0/24 -142.250.220.0/23 -142.250.220.0/24 -142.250.221.0/24 -142.250.222.0/23 -142.250.222.0/24 -142.250.223.0/24 -142.250.224.0/23 -142.250.224.0/24 -142.250.225.0/24 -142.250.226.0/23 -142.250.226.0/24 -142.250.227.0/24 -142.250.228.0/23 -142.250.228.0/24 -142.250.229.0/24 -142.250.230.0/23 -142.250.230.0/24 -142.250.231.0/24 -142.250.232.0/23 -142.250.232.0/24 -142.250.233.0/24 -142.250.234.0/23 -142.250.234.0/24 -142.250.235.0/24 -142.250.236.0/23 -142.250.236.0/24 -142.250.237.0/24 -142.250.238.0/23 -142.250.238.0/24 -142.250.239.0/24 -142.250.240.0/23 -142.250.240.0/24 -142.250.241.0/24 -142.250.242.0/23 -142.250.242.0/24 -142.250.243.0/24 -142.250.244.0/23 -142.250.244.0/24 -142.250.245.0/24 -142.250.246.0/23 -142.250.246.0/24 -142.250.247.0/24 -142.250.248.0/23 -142.250.248.0/24 -142.250.249.0/24 -142.250.250.0/23 -142.250.250.0/24 -142.250.251.0/24 -142.250.252.0/23 -142.250.252.0/24 -142.250.253.0/24 -142.250.254.0/23 -142.250.254.0/24 -142.250.255.0/24 -142.251.0.0/23 -142.251.1.0/24 -142.251.2.0/23 -142.251.2.0/24 -142.251.3.0/24 -142.251.4.0/23 -142.251.4.0/24 -142.251.5.0/24 -142.251.6.0/23 -142.251.6.0/24 -142.251.7.0/24 -142.251.8.0/23 -142.251.8.0/24 -142.251.9.0/24 -142.251.10.0/23 -142.251.10.0/24 -142.251.11.0/24 -142.251.12.0/23 -142.251.12.0/24 -142.251.13.0/24 -142.251.14.0/23 -142.251.14.0/24 -142.251.15.0/24 -142.251.16.0/23 -142.251.16.0/24 -142.251.17.0/24 -142.251.18.0/23 -142.251.18.0/24 -142.251.19.0/24 -142.251.20.0/23 -142.251.20.0/24 -142.251.21.0/24 -142.251.22.0/23 -142.251.22.0/24 -142.251.23.0/24 -142.251.24.0/23 -142.251.24.0/24 -142.251.25.0/24 -142.251.26.0/23 -142.251.26.0/24 -142.251.27.0/24 -142.251.28.0/23 -142.251.28.0/24 -142.251.29.0/24 -142.251.30.0/23 -142.251.30.0/24 -142.251.31.0/24 -142.251.32.0/23 -142.251.32.0/24 -142.251.33.0/24 -142.251.34.0/23 -142.251.34.0/24 -142.251.35.0/24 -142.251.36.0/23 -142.251.36.0/24 -142.251.37.0/24 -142.251.38.0/23 -142.251.38.0/24 -142.251.39.0/24 -142.251.40.0/23 -142.251.40.0/24 -142.251.41.0/24 -142.251.42.0/23 -142.251.42.0/24 -142.251.43.0/24 -142.251.44.0/23 -142.251.44.0/24 -142.251.45.0/24 -142.251.46.0/23 -142.251.46.0/24 -142.251.47.0/24 -142.251.48.0/23 -142.251.48.0/24 -142.251.49.0/24 -142.251.50.0/23 -142.251.50.0/24 -142.251.51.0/24 -142.251.52.0/23 -142.251.52.0/24 -142.251.53.0/24 -142.251.54.0/23 -142.251.54.0/24 -142.251.55.0/24 -142.251.56.0/23 -142.251.56.0/24 -142.251.57.0/24 -142.251.58.0/23 -142.251.58.0/24 -142.251.59.0/24 -142.251.60.0/23 -142.251.60.0/24 -142.251.61.0/24 -142.251.62.0/23 -142.251.62.0/24 -142.251.63.0/24 -142.251.64.0/23 -142.251.64.0/24 -142.251.65.0/24 -142.251.66.0/23 -142.251.66.0/24 -142.251.67.0/24 -142.251.68.0/23 -142.251.68.0/24 -142.251.69.0/24 -142.251.70.0/23 -142.251.70.0/24 -142.251.71.0/24 -142.251.72.0/23 -142.251.72.0/24 -142.251.73.0/24 -142.251.74.0/23 -142.251.74.0/24 -142.251.75.0/24 -142.251.76.0/23 -142.251.76.0/24 -142.251.77.0/24 -142.251.78.0/23 -142.251.78.0/24 -142.251.79.0/24 -142.251.80.0/23 -142.251.80.0/24 -142.251.81.0/24 -142.251.82.0/23 -142.251.82.0/24 -142.251.83.0/24 -142.251.84.0/23 -142.251.84.0/24 -142.251.85.0/24 -142.251.86.0/23 -142.251.86.0/24 -142.251.87.0/24 -142.251.88.0/23 -142.251.88.0/24 -142.251.89.0/24 -142.251.90.0/23 -142.251.90.0/24 -142.251.91.0/24 -142.251.92.0/23 -142.251.92.0/24 -142.251.93.0/24 -142.251.94.0/23 -142.251.94.0/24 -142.251.95.0/24 -142.251.96.0/23 -142.251.96.0/24 -142.251.97.0/24 -142.251.98.0/23 -142.251.98.0/24 -142.251.99.0/24 -142.251.100.0/23 -142.251.100.0/24 -142.251.101.0/24 -142.251.102.0/23 -142.251.102.0/24 -142.251.103.0/24 -142.251.104.0/23 -142.251.104.0/24 -142.251.105.0/24 -142.251.106.0/23 -142.251.106.0/24 -142.251.107.0/24 -142.251.108.0/23 -142.251.108.0/24 -142.251.109.0/24 -142.251.110.0/23 -142.251.110.0/24 -142.251.111.0/24 -142.251.112.0/23 -142.251.112.0/24 -142.251.113.0/24 -142.251.114.0/23 -142.251.114.0/24 -142.251.115.0/24 -142.251.116.0/23 -142.251.116.0/24 -142.251.117.0/24 -142.251.118.0/23 -142.251.118.0/24 -142.251.119.0/24 -142.251.120.0/23 -142.251.120.0/24 -142.251.121.0/24 -142.251.122.0/23 -142.251.122.0/24 -142.251.123.0/24 -142.251.124.0/23 -142.251.124.0/24 -142.251.125.0/24 -142.251.126.0/23 -142.251.126.0/24 -142.251.127.0/24 -142.251.128.0/23 -142.251.128.0/24 -142.251.129.0/24 -142.251.130.0/23 -142.251.130.0/24 -142.251.131.0/24 -142.251.132.0/23 -142.251.132.0/24 -142.251.133.0/24 -142.251.134.0/23 -142.251.134.0/24 -142.251.135.0/24 -142.251.136.0/23 -142.251.136.0/24 -142.251.137.0/24 -142.251.138.0/23 -142.251.138.0/24 -142.251.139.0/24 -142.251.140.0/23 -142.251.140.0/24 -142.251.141.0/24 -142.251.142.0/23 -142.251.142.0/24 -142.251.143.0/24 -142.251.144.0/23 -142.251.144.0/24 -142.251.145.0/24 -142.251.146.0/23 -142.251.146.0/24 -142.251.147.0/24 -142.251.148.0/23 -142.251.148.0/24 -142.251.149.0/24 -142.251.150.0/23 -142.251.150.0/24 -142.251.151.0/24 -142.251.152.0/23 -142.251.152.0/24 -142.251.153.0/24 -142.251.154.0/23 -142.251.154.0/24 -142.251.155.0/24 -142.251.156.0/23 -142.251.156.0/24 -142.251.157.0/24 -142.251.158.0/23 -142.251.158.0/24 -142.251.159.0/24 -142.251.160.0/23 -142.251.160.0/24 -142.251.161.0/24 -142.251.162.0/23 -142.251.162.0/24 -142.251.163.0/24 -142.251.164.0/23 -142.251.164.0/24 -142.251.165.0/24 -142.251.166.0/23 -142.251.166.0/24 -142.251.167.0/24 -142.251.168.0/23 -142.251.168.0/24 -142.251.169.0/24 -142.251.170.0/23 -142.251.170.0/24 -142.251.171.0/24 -142.251.172.0/23 -142.251.172.0/24 -142.251.173.0/24 -142.251.174.0/23 -142.251.174.0/24 -142.251.175.0/24 -142.251.176.0/23 -142.251.176.0/24 -142.251.177.0/24 -142.251.178.0/23 -142.251.178.0/24 -142.251.179.0/24 -142.251.180.0/23 -142.251.180.0/24 -142.251.181.0/24 -142.251.182.0/23 -142.251.182.0/24 -142.251.183.0/24 -142.251.184.0/23 -142.251.184.0/24 -142.251.185.0/24 -142.251.186.0/23 -142.251.186.0/24 -142.251.187.0/24 -142.251.188.0/23 -142.251.188.0/24 -142.251.189.0/24 -142.251.190.0/23 -142.251.190.0/24 -142.251.191.0/24 -142.251.192.0/23 -142.251.192.0/24 -142.251.193.0/24 -142.251.194.0/23 -142.251.194.0/24 -142.251.195.0/24 -142.251.196.0/23 -142.251.196.0/24 -142.251.197.0/24 -142.251.198.0/23 -142.251.198.0/24 -142.251.199.0/24 -142.251.200.0/23 -142.251.200.0/24 -142.251.201.0/24 -142.251.202.0/23 -142.251.202.0/24 -142.251.203.0/24 -142.251.204.0/23 -142.251.204.0/24 -142.251.205.0/24 -142.251.206.0/23 -142.251.206.0/24 -142.251.207.0/24 -142.251.208.0/23 -142.251.208.0/24 -142.251.209.0/24 -142.251.210.0/23 -142.251.210.0/24 -142.251.211.0/24 -142.251.212.0/23 -142.251.212.0/24 -142.251.213.0/24 -142.251.214.0/23 -142.251.214.0/24 -142.251.215.0/24 -142.251.216.0/23 -142.251.216.0/24 -142.251.217.0/24 -142.251.218.0/23 -142.251.218.0/24 -142.251.219.0/24 -142.251.220.0/23 -142.251.220.0/24 -142.251.221.0/24 -142.251.222.0/23 -142.251.222.0/24 -142.251.223.0/24 -142.251.224.0/23 -142.251.224.0/24 -142.251.225.0/24 -142.251.226.0/23 -142.251.226.0/24 -142.251.227.0/24 -142.251.228.0/23 -142.251.228.0/24 -142.251.229.0/24 -142.251.230.0/23 -142.251.230.0/24 -142.251.231.0/24 -142.251.232.0/23 -142.251.232.0/24 -142.251.233.0/24 -142.251.234.0/23 -142.251.234.0/24 -142.251.235.0/24 -142.251.236.0/23 -142.251.236.0/24 -142.251.237.0/24 -142.251.238.0/23 -142.251.238.0/24 -142.251.239.0/24 -142.251.240.0/23 -142.251.240.0/24 -142.251.241.0/24 -142.251.242.0/23 -142.251.242.0/24 -142.251.243.0/24 -142.251.244.0/23 -142.251.244.0/24 -142.251.245.0/24 -142.251.246.0/23 -142.251.246.0/24 -142.251.247.0/24 -142.251.248.0/23 -142.251.248.0/24 -142.251.249.0/24 -142.251.250.0/23 -142.251.250.0/24 -142.251.251.0/24 -142.251.252.0/23 -142.251.252.0/24 -142.251.253.0/24 -142.251.254.0/23 -142.251.254.0/24 -142.251.255.0/24 -146.148.0.0/17 -146.148.0.0/19 -146.148.0.0/20 -146.148.32.0/20 -146.148.48.0/20 -146.148.64.0/19 -146.148.64.0/20 -146.148.80.0/20 -146.148.96.0/19 -146.148.96.0/20 -146.148.112.0/20 -162.216.148.0/23 -162.216.148.0/24 -162.216.149.0/24 -162.216.150.0/23 -162.216.150.0/24 -162.216.151.0/24 -162.222.176.0/23 -162.222.176.0/24 -162.222.177.0/24 -162.222.178.0/23 -162.222.178.0/24 -162.222.179.0/24 -162.222.180.0/23 -162.222.180.0/24 -162.222.181.0/24 -162.222.182.0/23 -162.222.182.0/24 -162.222.183.0/24 -172.110.32.0/21 -172.110.32.0/23 -172.110.32.0/24 -172.110.33.0/24 -172.110.34.0/23 -172.110.34.0/24 -172.110.35.0/24 -172.110.36.0/23 -172.110.36.0/24 -172.110.37.0/24 -172.110.38.0/23 -172.110.38.0/24 -172.110.39.0/24 -172.217.0.0/16 -172.217.0.0/23 -172.217.0.0/24 -172.217.1.0/24 -172.217.2.0/23 -172.217.2.0/24 -172.217.3.0/24 -172.217.4.0/23 -172.217.4.0/24 -172.217.5.0/24 -172.217.6.0/23 -172.217.6.0/24 -172.217.7.0/24 -172.217.8.0/23 -172.217.8.0/24 -172.217.9.0/24 -172.217.10.0/23 -172.217.10.0/24 -172.217.11.0/24 -172.217.12.0/23 -172.217.12.0/24 -172.217.13.0/24 -172.217.14.0/23 -172.217.14.0/24 -172.217.15.0/24 -172.217.16.0/23 -172.217.16.0/24 -172.217.17.0/24 -172.217.18.0/23 -172.217.18.0/24 -172.217.19.0/24 -172.217.20.0/23 -172.217.20.0/24 -172.217.21.0/24 -172.217.22.0/23 -172.217.22.0/24 -172.217.23.0/24 -172.217.24.0/23 -172.217.24.0/24 -172.217.25.0/24 -172.217.26.0/23 -172.217.26.0/24 -172.217.27.0/24 -172.217.28.0/23 -172.217.28.0/24 -172.217.29.0/24 -172.217.30.0/23 -172.217.30.0/24 -172.217.31.0/24 -172.217.32.0/23 -172.217.32.0/24 -172.217.33.0/24 -172.217.34.0/23 -172.217.34.0/24 -172.217.35.0/24 -172.217.36.0/23 -172.217.36.0/24 -172.217.37.0/24 -172.217.38.0/23 -172.217.38.0/24 -172.217.39.0/24 -172.217.40.0/23 -172.217.40.0/24 -172.217.41.0/24 -172.217.42.0/23 -172.217.42.0/24 -172.217.43.0/24 -172.217.44.0/23 -172.217.44.0/24 -172.217.45.0/24 -172.217.46.0/23 -172.217.46.0/24 -172.217.47.0/24 -172.217.48.0/23 -172.217.48.0/24 -172.217.49.0/24 -172.217.50.0/23 -172.217.50.0/24 -172.217.51.0/24 -172.217.52.0/23 -172.217.52.0/24 -172.217.53.0/24 -172.217.54.0/23 -172.217.54.0/24 -172.217.55.0/24 -172.217.56.0/23 -172.217.56.0/24 -172.217.57.0/24 -172.217.58.0/23 -172.217.58.0/24 -172.217.59.0/24 -172.217.60.0/23 -172.217.60.0/24 -172.217.61.0/24 -172.217.62.0/23 -172.217.62.0/24 -172.217.63.0/24 -172.217.64.0/23 -172.217.64.0/24 -172.217.65.0/24 -172.217.66.0/23 -172.217.66.0/24 -172.217.67.0/24 -172.217.68.0/23 -172.217.68.0/24 -172.217.69.0/24 -172.217.70.0/23 -172.217.70.0/24 -172.217.71.0/24 -172.217.72.0/23 -172.217.72.0/24 -172.217.73.0/24 -172.217.74.0/23 -172.217.74.0/24 -172.217.75.0/24 -172.217.76.0/23 -172.217.76.0/24 -172.217.77.0/24 -172.217.78.0/23 -172.217.78.0/24 -172.217.79.0/24 -172.217.80.0/23 -172.217.80.0/24 -172.217.81.0/24 -172.217.82.0/23 -172.217.82.0/24 -172.217.83.0/24 -172.217.84.0/23 -172.217.84.0/24 -172.217.85.0/24 -172.217.86.0/23 -172.217.86.0/24 -172.217.87.0/24 -172.217.88.0/23 -172.217.88.0/24 -172.217.89.0/24 -172.217.90.0/23 -172.217.90.0/24 -172.217.91.0/24 -172.217.92.0/23 -172.217.92.0/24 -172.217.93.0/24 -172.217.94.0/23 -172.217.94.0/24 -172.217.95.0/24 -172.217.96.0/23 -172.217.96.0/24 -172.217.97.0/24 -172.217.98.0/23 -172.217.98.0/24 -172.217.99.0/24 -172.217.100.0/23 -172.217.100.0/24 -172.217.101.0/24 -172.217.102.0/23 -172.217.102.0/24 -172.217.103.0/24 -172.217.104.0/23 -172.217.104.0/24 -172.217.105.0/24 -172.217.106.0/23 -172.217.106.0/24 -172.217.107.0/24 -172.217.108.0/23 -172.217.108.0/24 -172.217.109.0/24 -172.217.110.0/23 -172.217.110.0/24 -172.217.111.0/24 -172.217.112.0/23 -172.217.112.0/24 -172.217.113.0/24 -172.217.114.0/23 -172.217.114.0/24 -172.217.115.0/24 -172.217.116.0/23 -172.217.116.0/24 -172.217.117.0/24 -172.217.118.0/23 -172.217.118.0/24 -172.217.119.0/24 -172.217.120.0/23 -172.217.120.0/24 -172.217.121.0/24 -172.217.122.0/23 -172.217.122.0/24 -172.217.123.0/24 -172.217.124.0/23 -172.217.124.0/24 -172.217.125.0/24 -172.217.126.0/23 -172.217.126.0/24 -172.217.127.0/24 -172.217.128.0/23 -172.217.128.0/24 -172.217.129.0/24 -172.217.130.0/23 -172.217.130.0/24 -172.217.131.0/24 -172.217.132.0/23 -172.217.132.0/24 -172.217.133.0/24 -172.217.134.0/23 -172.217.134.0/24 -172.217.135.0/24 -172.217.136.0/23 -172.217.136.0/24 -172.217.137.0/24 -172.217.138.0/23 -172.217.138.0/24 -172.217.139.0/24 -172.217.140.0/23 -172.217.140.0/24 -172.217.141.0/24 -172.217.142.0/23 -172.217.142.0/24 -172.217.143.0/24 -172.217.144.0/23 -172.217.144.0/24 -172.217.145.0/24 -172.217.146.0/23 -172.217.146.0/24 -172.217.147.0/24 -172.217.148.0/23 -172.217.148.0/24 -172.217.149.0/24 -172.217.150.0/23 -172.217.150.0/24 -172.217.151.0/24 -172.217.152.0/23 -172.217.152.0/24 -172.217.153.0/24 -172.217.154.0/23 -172.217.154.0/24 -172.217.155.0/24 -172.217.156.0/23 -172.217.156.0/24 -172.217.157.0/24 -172.217.158.0/23 -172.217.158.0/24 -172.217.159.0/24 -172.217.160.0/23 -172.217.160.0/24 -172.217.161.0/24 -172.217.162.0/23 -172.217.162.0/24 -172.217.163.0/24 -172.217.164.0/23 -172.217.164.0/24 -172.217.165.0/24 -172.217.166.0/23 -172.217.166.0/24 -172.217.167.0/24 -172.217.168.0/23 -172.217.168.0/24 -172.217.169.0/24 -172.217.170.0/23 -172.217.170.0/24 -172.217.171.0/24 -172.217.172.0/23 -172.217.172.0/24 -172.217.173.0/24 -172.217.174.0/23 -172.217.174.0/24 -172.217.175.0/24 -172.217.176.0/23 -172.217.176.0/24 -172.217.177.0/24 -172.217.178.0/23 -172.217.178.0/24 -172.217.179.0/24 -172.217.180.0/23 -172.217.180.0/24 -172.217.181.0/24 -172.217.182.0/23 -172.217.182.0/24 -172.217.183.0/24 -172.217.184.0/23 -172.217.184.0/24 -172.217.185.0/24 -172.217.186.0/23 -172.217.186.0/24 -172.217.187.0/24 -172.217.188.0/23 -172.217.188.0/24 -172.217.189.0/24 -172.217.190.0/23 -172.217.190.0/24 -172.217.191.0/24 -172.217.192.0/23 -172.217.192.0/24 -172.217.193.0/24 -172.217.194.0/23 -172.217.194.0/24 -172.217.195.0/24 -172.217.196.0/23 -172.217.196.0/24 -172.217.197.0/24 -172.217.198.0/23 -172.217.198.0/24 -172.217.199.0/24 -172.217.200.0/23 -172.217.200.0/24 -172.217.201.0/24 -172.217.202.0/23 -172.217.202.0/24 -172.217.203.0/24 -172.217.204.0/23 -172.217.204.0/24 -172.217.205.0/24 -172.217.206.0/23 -172.217.206.0/24 -172.217.207.0/24 -172.217.208.0/23 -172.217.208.0/24 -172.217.209.0/24 -172.217.210.0/23 -172.217.210.0/24 -172.217.211.0/24 -172.217.212.0/23 -172.217.212.0/24 -172.217.213.0/24 -172.217.214.0/23 -172.217.214.0/24 -172.217.215.0/24 -172.217.216.0/23 -172.217.216.0/24 -172.217.217.0/24 -172.217.218.0/23 -172.217.218.0/24 -172.217.219.0/24 -172.217.220.0/23 -172.217.220.0/24 -172.217.221.0/24 -172.217.222.0/23 -172.217.222.0/24 -172.217.223.0/24 -172.217.224.0/23 -172.217.224.0/24 -172.217.225.0/24 -172.217.226.0/23 -172.217.226.0/24 -172.217.227.0/24 -172.217.228.0/23 -172.217.228.0/24 -172.217.229.0/24 -172.217.230.0/23 -172.217.230.0/24 -172.217.231.0/24 -172.217.232.0/23 -172.217.232.0/24 -172.217.233.0/24 -172.217.234.0/23 -172.217.234.0/24 -172.217.235.0/24 -172.217.236.0/23 -172.217.236.0/24 -172.217.237.0/24 -172.217.238.0/23 -172.217.238.0/24 -172.217.239.0/24 -172.217.240.0/23 -172.217.240.0/24 -172.217.241.0/24 -172.217.242.0/23 -172.217.242.0/24 -172.217.243.0/24 -172.217.244.0/23 -172.217.244.0/24 -172.217.245.0/24 -172.217.246.0/23 -172.217.246.0/24 -172.217.247.0/24 -172.217.248.0/23 -172.217.248.0/24 -172.217.249.0/24 -172.217.250.0/23 -172.217.250.0/24 -172.217.251.0/24 -172.217.252.0/23 -172.217.252.0/24 -172.217.253.0/24 -172.217.254.0/23 -172.217.254.0/24 -172.217.255.0/24 -172.253.0.0/16 -172.253.0.0/23 -172.253.0.0/24 -172.253.1.0/24 -172.253.2.0/23 -172.253.2.0/24 -172.253.3.0/24 -172.253.4.0/23 -172.253.4.0/24 -172.253.5.0/24 -172.253.6.0/23 -172.253.6.0/24 -172.253.7.0/24 -172.253.8.0/23 -172.253.8.0/24 -172.253.9.0/24 -172.253.10.0/23 -172.253.10.0/24 -172.253.11.0/24 -172.253.12.0/23 -172.253.12.0/24 -172.253.13.0/24 -172.253.14.0/23 -172.253.14.0/24 -172.253.15.0/24 -172.253.16.0/23 -172.253.16.0/24 -172.253.17.0/24 -172.253.18.0/23 -172.253.18.0/24 -172.253.19.0/24 -172.253.20.0/23 -172.253.20.0/24 -172.253.21.0/24 -172.253.22.0/23 -172.253.22.0/24 -172.253.23.0/24 -172.253.24.0/23 -172.253.24.0/24 -172.253.25.0/24 -172.253.26.0/23 -172.253.26.0/24 -172.253.27.0/24 -172.253.28.0/23 -172.253.28.0/24 -172.253.29.0/24 -172.253.30.0/23 -172.253.30.0/24 -172.253.31.0/24 -172.253.32.0/23 -172.253.32.0/24 -172.253.33.0/24 -172.253.34.0/23 -172.253.34.0/24 -172.253.35.0/24 -172.253.36.0/23 -172.253.36.0/24 -172.253.37.0/24 -172.253.38.0/23 -172.253.38.0/24 -172.253.39.0/24 -172.253.40.0/23 -172.253.40.0/24 -172.253.41.0/24 -172.253.42.0/23 -172.253.42.0/24 -172.253.43.0/24 -172.253.44.0/23 -172.253.44.0/24 -172.253.45.0/24 -172.253.46.0/23 -172.253.46.0/24 -172.253.47.0/24 -172.253.48.0/23 -172.253.48.0/24 -172.253.49.0/24 -172.253.50.0/23 -172.253.50.0/24 -172.253.51.0/24 -172.253.52.0/23 -172.253.52.0/24 -172.253.53.0/24 -172.253.54.0/23 -172.253.54.0/24 -172.253.55.0/24 -172.253.56.0/23 -172.253.56.0/24 -172.253.57.0/24 -172.253.58.0/23 -172.253.58.0/24 -172.253.59.0/24 -172.253.60.0/23 -172.253.60.0/24 -172.253.61.0/24 -172.253.62.0/23 -172.253.62.0/24 -172.253.63.0/24 -172.253.64.0/23 -172.253.64.0/24 -172.253.65.0/24 -172.253.66.0/23 -172.253.66.0/24 -172.253.67.0/24 -172.253.68.0/23 -172.253.68.0/24 -172.253.69.0/24 -172.253.70.0/23 -172.253.70.0/24 -172.253.71.0/24 -172.253.72.0/23 -172.253.72.0/24 -172.253.73.0/24 -172.253.74.0/23 -172.253.74.0/24 -172.253.75.0/24 -172.253.76.0/23 -172.253.76.0/24 -172.253.77.0/24 -172.253.78.0/23 -172.253.78.0/24 -172.253.79.0/24 -172.253.80.0/23 -172.253.80.0/24 -172.253.81.0/24 -172.253.82.0/23 -172.253.82.0/24 -172.253.83.0/24 -172.253.84.0/23 -172.253.84.0/24 -172.253.85.0/24 -172.253.86.0/23 -172.253.86.0/24 -172.253.87.0/24 -172.253.88.0/23 -172.253.88.0/24 -172.253.89.0/24 -172.253.90.0/23 -172.253.90.0/24 -172.253.91.0/24 -172.253.92.0/23 -172.253.92.0/24 -172.253.93.0/24 -172.253.94.0/23 -172.253.94.0/24 -172.253.95.0/24 -172.253.96.0/23 -172.253.96.0/24 -172.253.97.0/24 -172.253.98.0/23 -172.253.98.0/24 -172.253.99.0/24 -172.253.100.0/23 -172.253.100.0/24 -172.253.101.0/24 -172.253.102.0/23 -172.253.102.0/24 -172.253.103.0/24 -172.253.104.0/23 -172.253.104.0/24 -172.253.105.0/24 -172.253.106.0/23 -172.253.106.0/24 -172.253.107.0/24 -172.253.108.0/23 -172.253.108.0/24 -172.253.109.0/24 -172.253.110.0/23 -172.253.110.0/24 -172.253.111.0/24 -172.253.112.0/23 -172.253.112.0/24 -172.253.113.0/24 -172.253.114.0/23 -172.253.114.0/24 -172.253.115.0/24 -172.253.116.0/23 -172.253.116.0/24 -172.253.117.0/24 -172.253.118.0/23 -172.253.118.0/24 -172.253.119.0/24 -172.253.120.0/23 -172.253.120.0/24 -172.253.121.0/24 -172.253.122.0/23 -172.253.122.0/24 -172.253.123.0/24 -172.253.124.0/23 -172.253.124.0/24 -172.253.125.0/24 -172.253.126.0/23 -172.253.126.0/24 -172.253.127.0/24 -172.253.128.0/23 -172.253.128.0/24 -172.253.129.0/24 -172.253.130.0/23 -172.253.130.0/24 -172.253.131.0/24 -172.253.132.0/23 -172.253.132.0/24 -172.253.133.0/24 -172.253.134.0/23 -172.253.134.0/24 -172.253.135.0/24 -172.253.136.0/23 -172.253.136.0/24 -172.253.137.0/24 -172.253.138.0/23 -172.253.138.0/24 -172.253.139.0/24 -172.253.140.0/23 -172.253.140.0/24 -172.253.141.0/24 -172.253.142.0/23 -172.253.142.0/24 -172.253.143.0/24 -172.253.144.0/23 -172.253.144.0/24 -172.253.145.0/24 -172.253.146.0/23 -172.253.146.0/24 -172.253.147.0/24 -172.253.148.0/23 -172.253.148.0/24 -172.253.149.0/24 -172.253.150.0/23 -172.253.150.0/24 -172.253.151.0/24 -172.253.152.0/23 -172.253.152.0/24 -172.253.153.0/24 -172.253.154.0/23 -172.253.154.0/24 -172.253.155.0/24 -172.253.156.0/23 -172.253.156.0/24 -172.253.157.0/24 -172.253.158.0/23 -172.253.158.0/24 -172.253.159.0/24 -172.253.160.0/23 -172.253.160.0/24 -172.253.161.0/24 -172.253.162.0/23 -172.253.162.0/24 -172.253.163.0/24 -172.253.164.0/23 -172.253.164.0/24 -172.253.165.0/24 -172.253.166.0/23 -172.253.166.0/24 -172.253.167.0/24 -172.253.168.0/23 -172.253.168.0/24 -172.253.169.0/24 -172.253.170.0/23 -172.253.170.0/24 -172.253.171.0/24 -172.253.172.0/23 -172.253.172.0/24 -172.253.173.0/24 -172.253.174.0/23 -172.253.174.0/24 -172.253.175.0/24 -172.253.176.0/23 -172.253.176.0/24 -172.253.177.0/24 -172.253.178.0/23 -172.253.178.0/24 -172.253.179.0/24 -172.253.180.0/23 -172.253.180.0/24 -172.253.181.0/24 -172.253.182.0/23 -172.253.182.0/24 -172.253.183.0/24 -172.253.184.0/23 -172.253.184.0/24 -172.253.185.0/24 -172.253.186.0/23 -172.253.186.0/24 -172.253.187.0/24 -172.253.188.0/23 -172.253.188.0/24 -172.253.189.0/24 -172.253.190.0/23 -172.253.190.0/24 -172.253.191.0/24 -172.253.192.0/23 -172.253.192.0/24 -172.253.193.0/24 -172.253.194.0/23 -172.253.194.0/24 -172.253.195.0/24 -172.253.196.0/23 -172.253.196.0/24 -172.253.197.0/24 -172.253.198.0/23 -172.253.198.0/24 -172.253.199.0/24 -172.253.200.0/23 -172.253.200.0/24 -172.253.201.0/24 -172.253.202.0/23 -172.253.202.0/24 -172.253.203.0/24 -172.253.204.0/23 -172.253.204.0/24 -172.253.205.0/24 -172.253.206.0/23 -172.253.206.0/24 -172.253.207.0/24 -172.253.208.0/23 -172.253.208.0/24 -172.253.209.0/24 -172.253.210.0/23 -172.253.210.0/24 -172.253.211.0/24 -172.253.212.0/23 -172.253.212.0/24 -172.253.213.0/24 -172.253.214.0/23 -172.253.214.0/24 -172.253.215.0/24 -172.253.216.0/23 -172.253.216.0/24 -172.253.217.0/24 -172.253.218.0/23 -172.253.218.0/24 -172.253.219.0/24 -172.253.220.0/23 -172.253.220.0/24 -172.253.221.0/24 -172.253.222.0/23 -172.253.222.0/24 -172.253.223.0/24 -172.253.224.0/23 -172.253.224.0/24 -172.253.225.0/24 -172.253.226.0/23 -172.253.226.0/24 -172.253.227.0/24 -172.253.228.0/23 -172.253.228.0/24 -172.253.229.0/24 -172.253.230.0/23 -172.253.230.0/24 -172.253.231.0/24 -172.253.232.0/23 -172.253.232.0/24 -172.253.233.0/24 -172.253.234.0/23 -172.253.234.0/24 -172.253.235.0/24 -172.253.236.0/23 -172.253.236.0/24 -172.253.237.0/24 -172.253.238.0/23 -172.253.238.0/24 -172.253.239.0/24 -172.253.240.0/23 -172.253.240.0/24 -172.253.241.0/24 -172.253.242.0/23 -172.253.242.0/24 -172.253.243.0/24 -172.253.244.0/23 -172.253.244.0/24 -172.253.245.0/24 -172.253.246.0/23 -172.253.246.0/24 -172.253.247.0/24 -172.253.248.0/23 -172.253.248.0/24 -172.253.249.0/24 -172.253.250.0/23 -172.253.250.0/24 -172.253.251.0/24 -172.253.252.0/23 -172.253.252.0/24 -172.253.253.0/24 -172.253.254.0/23 -172.253.254.0/24 -172.253.255.0/24 -173.194.0.0/23 -173.194.0.0/24 -173.194.1.0/24 -173.194.2.0/23 -173.194.2.0/24 -173.194.3.0/24 -173.194.4.0/23 -173.194.4.0/24 -173.194.5.0/24 -173.194.6.0/23 -173.194.6.0/24 -173.194.7.0/24 -173.194.8.0/23 -173.194.8.0/24 -173.194.9.0/24 -173.194.10.0/23 -173.194.10.0/24 -173.194.11.0/24 -173.194.12.0/23 -173.194.12.0/24 -173.194.13.0/24 -173.194.14.0/23 -173.194.14.0/24 -173.194.15.0/24 -173.194.16.0/23 -173.194.16.0/24 -173.194.17.0/24 -173.194.18.0/23 -173.194.18.0/24 -173.194.19.0/24 -173.194.20.0/23 -173.194.20.0/24 -173.194.21.0/24 -173.194.22.0/23 -173.194.22.0/24 -173.194.23.0/24 -173.194.24.0/23 -173.194.24.0/24 -173.194.25.0/24 -173.194.26.0/23 -173.194.26.0/24 -173.194.27.0/24 -173.194.28.0/23 -173.194.28.0/24 -173.194.29.0/24 -173.194.30.0/23 -173.194.30.0/24 -173.194.31.0/24 -173.194.32.0/23 -173.194.32.0/24 -173.194.33.0/24 -173.194.34.0/23 -173.194.34.0/24 -173.194.35.0/24 -173.194.36.0/23 -173.194.36.0/24 -173.194.37.0/24 -173.194.38.0/23 -173.194.38.0/24 -173.194.39.0/24 -173.194.40.0/23 -173.194.40.0/24 -173.194.41.0/24 -173.194.42.0/23 -173.194.42.0/24 -173.194.43.0/24 -173.194.44.0/23 -173.194.44.0/24 -173.194.45.0/24 -173.194.46.0/23 -173.194.46.0/24 -173.194.47.0/24 -173.194.48.0/23 -173.194.48.0/24 -173.194.49.0/24 -173.194.50.0/23 -173.194.50.0/24 -173.194.51.0/24 -173.194.52.0/23 -173.194.52.0/24 -173.194.53.0/24 -173.194.54.0/23 -173.194.54.0/24 -173.194.55.0/24 -173.194.56.0/23 -173.194.56.0/24 -173.194.57.0/24 -173.194.58.0/23 -173.194.58.0/24 -173.194.59.0/24 -173.194.60.0/23 -173.194.60.0/24 -173.194.61.0/24 -173.194.62.0/23 -173.194.62.0/24 -173.194.63.0/24 -173.194.64.0/23 -173.194.64.0/24 -173.194.65.0/24 -173.194.66.0/23 -173.194.66.0/24 -173.194.67.0/24 -173.194.68.0/23 -173.194.68.0/24 -173.194.69.0/24 -173.194.70.0/23 -173.194.70.0/24 -173.194.71.0/24 -173.194.72.0/23 -173.194.72.0/24 -173.194.73.0/24 -173.194.74.0/23 -173.194.74.0/24 -173.194.75.0/24 -173.194.76.0/23 -173.194.76.0/24 -173.194.77.0/24 -173.194.78.0/23 -173.194.78.0/24 -173.194.79.0/24 -173.194.80.0/23 -173.194.80.0/24 -173.194.81.0/24 -173.194.82.0/23 -173.194.82.0/24 -173.194.83.0/24 -173.194.84.0/23 -173.194.84.0/24 -173.194.85.0/24 -173.194.86.0/23 -173.194.86.0/24 -173.194.87.0/24 -173.194.88.0/23 -173.194.88.0/24 -173.194.89.0/24 -173.194.90.0/23 -173.194.90.0/24 -173.194.91.0/24 -173.194.92.0/23 -173.194.92.0/24 -173.194.93.0/24 -173.194.94.0/23 -173.194.94.0/24 -173.194.95.0/24 -173.194.96.0/23 -173.194.96.0/24 -173.194.97.0/24 -173.194.98.0/23 -173.194.98.0/24 -173.194.99.0/24 -173.194.100.0/23 -173.194.100.0/24 -173.194.101.0/24 -173.194.102.0/23 -173.194.102.0/24 -173.194.103.0/24 -173.194.104.0/23 -173.194.104.0/24 -173.194.105.0/24 -173.194.106.0/23 -173.194.106.0/24 -173.194.107.0/24 -173.194.108.0/23 -173.194.108.0/24 -173.194.109.0/24 -173.194.110.0/23 -173.194.110.0/24 -173.194.111.0/24 -173.194.112.0/23 -173.194.112.0/24 -173.194.113.0/24 -173.194.114.0/23 -173.194.114.0/24 -173.194.115.0/24 -173.194.116.0/23 -173.194.116.0/24 -173.194.117.0/24 -173.194.118.0/23 -173.194.118.0/24 -173.194.119.0/24 -173.194.120.0/23 -173.194.120.0/24 -173.194.121.0/24 -173.194.122.0/23 -173.194.122.0/24 -173.194.123.0/24 -173.194.124.0/23 -173.194.124.0/24 -173.194.125.0/24 -173.194.126.0/23 -173.194.126.0/24 -173.194.127.0/24 -173.194.128.0/23 -173.194.128.0/24 -173.194.129.0/24 -173.194.130.0/23 -173.194.130.0/24 -173.194.131.0/24 -173.194.132.0/23 -173.194.132.0/24 -173.194.133.0/24 -173.194.134.0/23 -173.194.134.0/24 -173.194.135.0/24 -173.194.136.0/23 -173.194.136.0/24 -173.194.137.0/24 -173.194.138.0/23 -173.194.138.0/24 -173.194.139.0/24 -173.194.140.0/23 -173.194.140.0/24 -173.194.141.0/24 -173.194.142.0/23 -173.194.142.0/24 -173.194.143.0/24 -173.194.144.0/23 -173.194.144.0/24 -173.194.145.0/24 -173.194.146.0/23 -173.194.146.0/24 -173.194.147.0/24 -173.194.148.0/23 -173.194.148.0/24 -173.194.149.0/24 -173.194.150.0/23 -173.194.150.0/24 -173.194.151.0/24 -173.194.152.0/23 -173.194.152.0/24 -173.194.153.0/24 -173.194.154.0/23 -173.194.154.0/24 -173.194.155.0/24 -173.194.156.0/23 -173.194.156.0/24 -173.194.157.0/24 -173.194.158.0/23 -173.194.158.0/24 -173.194.159.0/24 -173.194.160.0/23 -173.194.160.0/24 -173.194.161.0/24 -173.194.162.0/23 -173.194.162.0/24 -173.194.163.0/24 -173.194.164.0/23 -173.194.164.0/24 -173.194.165.0/24 -173.194.166.0/23 -173.194.166.0/24 -173.194.167.0/24 -173.194.168.0/23 -173.194.168.0/24 -173.194.169.0/24 -173.194.170.0/23 -173.194.170.0/24 -173.194.171.0/24 -173.194.172.0/23 -173.194.172.0/24 -173.194.173.0/24 -173.194.174.0/23 -173.194.174.0/24 -173.194.175.0/24 -173.194.176.0/23 -173.194.176.0/24 -173.194.177.0/24 -173.194.178.0/23 -173.194.178.0/24 -173.194.179.0/24 -173.194.180.0/23 -173.194.180.0/24 -173.194.181.0/24 -173.194.182.0/23 -173.194.182.0/24 -173.194.183.0/24 -173.194.184.0/23 -173.194.184.0/24 -173.194.185.0/24 -173.194.186.0/23 -173.194.186.0/24 -173.194.187.0/24 -173.194.188.0/23 -173.194.188.0/24 -173.194.189.0/24 -173.194.190.0/23 -173.194.190.0/24 -173.194.191.0/24 -173.194.192.0/23 -173.194.192.0/24 -173.194.193.0/24 -173.194.194.0/23 -173.194.194.0/24 -173.194.195.0/24 -173.194.196.0/23 -173.194.196.0/24 -173.194.197.0/24 -173.194.198.0/23 -173.194.198.0/24 -173.194.199.0/24 -173.194.200.0/23 -173.194.200.0/24 -173.194.201.0/24 -173.194.202.0/23 -173.194.202.0/24 -173.194.203.0/24 -173.194.204.0/23 -173.194.204.0/24 -173.194.205.0/24 -173.194.206.0/23 -173.194.206.0/24 -173.194.207.0/24 -173.194.208.0/23 -173.194.208.0/24 -173.194.209.0/24 -173.194.210.0/23 -173.194.210.0/24 -173.194.211.0/24 -173.194.212.0/23 -173.194.212.0/24 -173.194.213.0/24 -173.194.214.0/23 -173.194.214.0/24 -173.194.215.0/24 -173.194.216.0/23 -173.194.216.0/24 -173.194.217.0/24 -173.194.218.0/23 -173.194.218.0/24 -173.194.219.0/24 -173.194.220.0/23 -173.194.220.0/24 -173.194.221.0/24 -173.194.222.0/23 -173.194.222.0/24 -173.194.223.0/24 -173.194.224.0/23 -173.194.224.0/24 -173.194.225.0/24 -173.194.226.0/23 -173.194.226.0/24 -173.194.227.0/24 -173.194.228.0/23 -173.194.228.0/24 -173.194.229.0/24 -173.194.230.0/23 -173.194.230.0/24 -173.194.231.0/24 -173.194.232.0/23 -173.194.232.0/24 -173.194.233.0/24 -173.194.234.0/23 -173.194.234.0/24 -173.194.235.0/24 -173.194.236.0/23 -173.194.236.0/24 -173.194.237.0/24 -173.194.238.0/23 -173.194.238.0/24 -173.194.239.0/24 -173.194.240.0/23 -173.194.240.0/24 -173.194.241.0/24 -173.194.242.0/23 -173.194.242.0/24 -173.194.243.0/24 -173.194.244.0/23 -173.194.244.0/24 -173.194.245.0/24 -173.194.246.0/23 -173.194.246.0/24 -173.194.247.0/24 -173.194.248.0/23 -173.194.248.0/24 -173.194.249.0/24 -173.194.250.0/23 -173.194.250.0/24 -173.194.251.0/24 -173.194.252.0/23 -173.194.252.0/24 -173.194.253.0/24 -173.194.254.0/23 -173.194.254.0/24 -173.194.255.0/24 -192.158.28.0/23 -192.158.28.0/24 -192.158.29.0/24 -192.158.30.0/23 -192.158.30.0/24 -192.158.31.0/24 -192.178.0.0/23 -192.178.1.0/24 -192.178.2.0/23 -192.178.2.0/24 -192.178.3.0/24 -192.178.4.0/23 -192.178.4.0/24 -192.178.5.0/24 -192.178.6.0/23 -192.178.6.0/24 -192.178.7.0/24 -192.178.8.0/23 -192.178.8.0/24 -192.178.9.0/24 -192.178.10.0/23 -192.178.10.0/24 -192.178.11.0/24 -192.178.12.0/23 -192.178.12.0/24 -192.178.13.0/24 -192.178.14.0/23 -192.178.14.0/24 -192.178.15.0/24 -192.178.16.0/23 -192.178.16.0/24 -192.178.17.0/24 -192.178.18.0/23 -192.178.18.0/24 -192.178.19.0/24 -192.178.20.0/23 -192.178.20.0/24 -192.178.21.0/24 -192.178.22.0/23 -192.178.22.0/24 -192.178.23.0/24 -192.178.24.0/23 -192.178.24.0/24 -192.178.25.0/24 -192.178.26.0/23 -192.178.26.0/24 -192.178.27.0/24 -192.178.28.0/23 -192.178.28.0/24 -192.178.29.0/24 -192.178.30.0/23 -192.178.30.0/24 -192.178.31.0/24 -192.178.32.0/23 -192.178.32.0/24 -192.178.33.0/24 -192.178.34.0/23 -192.178.34.0/24 -192.178.35.0/24 -192.178.36.0/23 -192.178.36.0/24 -192.178.37.0/24 -192.178.38.0/23 -192.178.38.0/24 -192.178.39.0/24 -192.178.40.0/23 -192.178.40.0/24 -192.178.41.0/24 -192.178.42.0/23 -192.178.42.0/24 -192.178.43.0/24 -192.178.44.0/23 -192.178.44.0/24 -192.178.45.0/24 -192.178.46.0/23 -192.178.46.0/24 -192.178.47.0/24 -192.178.48.0/23 -192.178.48.0/24 -192.178.49.0/24 -192.178.50.0/23 -192.178.50.0/24 -192.178.51.0/24 -192.178.52.0/23 -192.178.52.0/24 -192.178.53.0/24 -192.178.54.0/23 -192.178.54.0/24 -192.178.55.0/24 -192.178.56.0/23 -192.178.56.0/24 -192.178.57.0/24 -192.178.58.0/23 -192.178.58.0/24 -192.178.59.0/24 -192.178.60.0/23 -192.178.60.0/24 -192.178.61.0/24 -192.178.62.0/23 -192.178.62.0/24 -192.178.63.0/24 -192.178.64.0/23 -192.178.64.0/24 -192.178.65.0/24 -192.178.66.0/23 -192.178.66.0/24 -192.178.67.0/24 -192.178.68.0/23 -192.178.68.0/24 -192.178.69.0/24 -192.178.70.0/23 -192.178.70.0/24 -192.178.71.0/24 -192.178.72.0/23 -192.178.72.0/24 -192.178.73.0/24 -192.178.74.0/23 -192.178.74.0/24 -192.178.75.0/24 -192.178.76.0/23 -192.178.76.0/24 -192.178.77.0/24 -192.178.78.0/23 -192.178.78.0/24 -192.178.79.0/24 -192.178.80.0/23 -192.178.80.0/24 -192.178.81.0/24 -192.178.82.0/23 -192.178.82.0/24 -192.178.83.0/24 -192.178.84.0/23 -192.178.84.0/24 -192.178.85.0/24 -192.178.86.0/23 -192.178.86.0/24 -192.178.87.0/24 -192.178.88.0/23 -192.178.88.0/24 -192.178.89.0/24 -192.178.90.0/23 -192.178.90.0/24 -192.178.91.0/24 -192.178.92.0/23 -192.178.92.0/24 -192.178.93.0/24 -192.178.94.0/23 -192.178.94.0/24 -192.178.95.0/24 -192.178.96.0/23 -192.178.96.0/24 -192.178.97.0/24 -192.178.98.0/23 -192.178.98.0/24 -192.178.99.0/24 -192.178.100.0/23 -192.178.100.0/24 -192.178.101.0/24 -192.178.102.0/23 -192.178.102.0/24 -192.178.103.0/24 -192.178.104.0/23 -192.178.104.0/24 -192.178.105.0/24 -192.178.106.0/23 -192.178.106.0/24 -192.178.107.0/24 -192.178.108.0/23 -192.178.108.0/24 -192.178.109.0/24 -192.178.110.0/23 -192.178.110.0/24 -192.178.111.0/24 -192.178.112.0/23 -192.178.112.0/24 -192.178.113.0/24 -192.178.114.0/23 -192.178.114.0/24 -192.178.115.0/24 -192.178.116.0/23 -192.178.116.0/24 -192.178.117.0/24 -192.178.118.0/23 -192.178.118.0/24 -192.178.119.0/24 -192.178.120.0/23 -192.178.120.0/24 -192.178.121.0/24 -192.178.122.0/23 -192.178.122.0/24 -192.178.123.0/24 -192.178.124.0/23 -192.178.124.0/24 -192.178.125.0/24 -192.178.126.0/23 -192.178.126.0/24 -192.178.127.0/24 -192.178.128.0/23 -192.178.128.0/24 -192.178.129.0/24 -192.178.130.0/23 -192.178.130.0/24 -192.178.131.0/24 -192.178.132.0/23 -192.178.132.0/24 -192.178.133.0/24 -192.178.134.0/23 -192.178.134.0/24 -192.178.135.0/24 -192.178.136.0/23 -192.178.136.0/24 -192.178.137.0/24 -192.178.138.0/23 -192.178.138.0/24 -192.178.139.0/24 -192.178.140.0/23 -192.178.140.0/24 -192.178.141.0/24 -192.178.142.0/23 -192.178.142.0/24 -192.178.143.0/24 -192.178.144.0/23 -192.178.144.0/24 -192.178.145.0/24 -192.178.146.0/23 -192.178.146.0/24 -192.178.147.0/24 -192.178.148.0/23 -192.178.148.0/24 -192.178.149.0/24 -192.178.150.0/23 -192.178.150.0/24 -192.178.151.0/24 -192.178.152.0/23 -192.178.152.0/24 -192.178.153.0/24 -192.178.154.0/23 -192.178.154.0/24 -192.178.155.0/24 -192.178.156.0/23 -192.178.156.0/24 -192.178.157.0/24 -192.178.158.0/23 -192.178.158.0/24 -192.178.159.0/24 -192.178.160.0/23 -192.178.160.0/24 -192.178.161.0/24 -192.178.162.0/23 -192.178.162.0/24 -192.178.163.0/24 -192.178.164.0/23 -192.178.164.0/24 -192.178.165.0/24 -192.178.166.0/23 -192.178.166.0/24 -192.178.167.0/24 -192.178.168.0/23 -192.178.168.0/24 -192.178.169.0/24 -192.178.170.0/23 -192.178.170.0/24 -192.178.171.0/24 -192.178.172.0/23 -192.178.172.0/24 -192.178.173.0/24 -192.178.174.0/23 -192.178.174.0/24 -192.178.175.0/24 -192.178.176.0/23 -192.178.176.0/24 -192.178.177.0/24 -192.178.178.0/23 -192.178.178.0/24 -192.178.179.0/24 -192.178.180.0/23 -192.178.180.0/24 -192.178.181.0/24 -192.178.182.0/23 -192.178.182.0/24 -192.178.183.0/24 -192.178.184.0/23 -192.178.184.0/24 -192.178.185.0/24 -192.178.186.0/23 -192.178.186.0/24 -192.178.187.0/24 -192.178.188.0/23 -192.178.188.0/24 -192.178.189.0/24 -192.178.190.0/23 -192.178.190.0/24 -192.178.191.0/24 -192.178.192.0/23 -192.178.192.0/24 -192.178.193.0/24 -192.178.194.0/23 -192.178.194.0/24 -192.178.195.0/24 -192.178.196.0/23 -192.178.196.0/24 -192.178.197.0/24 -192.178.198.0/23 -192.178.198.0/24 -192.178.199.0/24 -192.178.200.0/23 -192.178.200.0/24 -192.178.201.0/24 -192.178.202.0/23 -192.178.202.0/24 -192.178.203.0/24 -192.178.204.0/23 -192.178.204.0/24 -192.178.205.0/24 -192.178.206.0/23 -192.178.206.0/24 -192.178.207.0/24 -192.178.208.0/23 -192.178.208.0/24 -192.178.209.0/24 -192.178.210.0/23 -192.178.210.0/24 -192.178.211.0/24 -192.178.212.0/23 -192.178.212.0/24 -192.178.213.0/24 -192.178.214.0/23 -192.178.214.0/24 -192.178.215.0/24 -192.178.216.0/23 -192.178.216.0/24 -192.178.217.0/24 -192.178.218.0/23 -192.178.218.0/24 -192.178.219.0/24 -192.178.220.0/23 -192.178.220.0/24 -192.178.221.0/24 -192.178.222.0/23 -192.178.222.0/24 -192.178.223.0/24 -192.178.224.0/23 -192.178.224.0/24 -192.178.225.0/24 -192.178.226.0/23 -192.178.226.0/24 -192.178.227.0/24 -192.178.228.0/23 -192.178.228.0/24 -192.178.229.0/24 -192.178.230.0/23 -192.178.230.0/24 -192.178.231.0/24 -192.178.232.0/23 -192.178.232.0/24 -192.178.233.0/24 -192.178.234.0/23 -192.178.234.0/24 -192.178.235.0/24 -192.178.236.0/23 -192.178.236.0/24 -192.178.237.0/24 -192.178.238.0/23 -192.178.238.0/24 -192.178.239.0/24 -192.178.240.0/23 -192.178.240.0/24 -192.178.241.0/24 -192.178.242.0/23 -192.178.242.0/24 -192.178.243.0/24 -192.178.244.0/23 -192.178.244.0/24 -192.178.245.0/24 -192.178.246.0/23 -192.178.246.0/24 -192.178.247.0/24 -192.178.248.0/23 -192.178.248.0/24 -192.178.249.0/24 -192.178.250.0/23 -192.178.250.0/24 -192.178.251.0/24 -192.178.252.0/23 -192.178.252.0/24 -192.178.253.0/24 -192.178.254.0/23 -192.178.254.0/24 -192.178.255.0/24 -192.179.0.0/23 -192.179.0.0/24 -192.179.1.0/24 -192.179.2.0/23 -192.179.2.0/24 -192.179.3.0/24 -192.179.4.0/23 -192.179.4.0/24 -192.179.5.0/24 -192.179.6.0/23 -192.179.6.0/24 -192.179.7.0/24 -192.179.8.0/23 -192.179.8.0/24 -192.179.9.0/24 -192.179.10.0/23 -192.179.10.0/24 -192.179.11.0/24 -192.179.12.0/23 -192.179.12.0/24 -192.179.13.0/24 -192.179.14.0/23 -192.179.14.0/24 -192.179.15.0/24 -192.179.16.0/23 -192.179.16.0/24 -192.179.17.0/24 -192.179.18.0/23 -192.179.18.0/24 -192.179.19.0/24 -192.179.20.0/23 -192.179.20.0/24 -192.179.21.0/24 -192.179.22.0/23 -192.179.22.0/24 -192.179.23.0/24 -192.179.24.0/23 -192.179.24.0/24 -192.179.25.0/24 -192.179.26.0/23 -192.179.26.0/24 -192.179.27.0/24 -192.179.28.0/23 -192.179.28.0/24 -192.179.29.0/24 -192.179.30.0/23 -192.179.30.0/24 -192.179.31.0/24 -192.179.32.0/23 -192.179.32.0/24 -192.179.33.0/24 -192.179.34.0/23 -192.179.34.0/24 -192.179.35.0/24 -192.179.36.0/23 -192.179.36.0/24 -192.179.37.0/24 -192.179.38.0/23 -192.179.38.0/24 -192.179.39.0/24 -192.179.40.0/23 -192.179.40.0/24 -192.179.41.0/24 -192.179.42.0/23 -192.179.42.0/24 -192.179.43.0/24 -192.179.44.0/23 -192.179.44.0/24 -192.179.45.0/24 -192.179.46.0/23 -192.179.46.0/24 -192.179.47.0/24 -192.179.48.0/23 -192.179.48.0/24 -192.179.49.0/24 -192.179.50.0/23 -192.179.50.0/24 -192.179.51.0/24 -192.179.52.0/23 -192.179.52.0/24 -192.179.53.0/24 -192.179.54.0/23 -192.179.54.0/24 -192.179.55.0/24 -192.179.56.0/23 -192.179.56.0/24 -192.179.57.0/24 -192.179.58.0/23 -192.179.58.0/24 -192.179.59.0/24 -192.179.60.0/23 -192.179.60.0/24 -192.179.61.0/24 -192.179.62.0/23 -192.179.62.0/24 -192.179.63.0/24 -192.179.64.0/23 -192.179.64.0/24 -192.179.65.0/24 -192.179.66.0/23 -192.179.66.0/24 -192.179.67.0/24 -192.179.68.0/23 -192.179.68.0/24 -192.179.69.0/24 -192.179.70.0/23 -192.179.70.0/24 -192.179.71.0/24 -192.179.72.0/23 -192.179.72.0/24 -192.179.73.0/24 -192.179.74.0/23 -192.179.74.0/24 -192.179.75.0/24 -192.179.76.0/23 -192.179.76.0/24 -192.179.77.0/24 -192.179.78.0/23 -192.179.78.0/24 -192.179.79.0/24 -192.179.80.0/23 -192.179.80.0/24 -192.179.81.0/24 -192.179.82.0/23 -192.179.82.0/24 -192.179.83.0/24 -192.179.84.0/23 -192.179.84.0/24 -192.179.85.0/24 -192.179.86.0/23 -192.179.86.0/24 -192.179.87.0/24 -192.179.88.0/23 -192.179.88.0/24 -192.179.89.0/24 -192.179.90.0/23 -192.179.90.0/24 -192.179.91.0/24 -192.179.92.0/23 -192.179.92.0/24 -192.179.93.0/24 -192.179.94.0/23 -192.179.94.0/24 -192.179.95.0/24 -192.179.96.0/23 -192.179.96.0/24 -192.179.97.0/24 -192.179.98.0/23 -192.179.98.0/24 -192.179.99.0/24 -192.179.100.0/23 -192.179.100.0/24 -192.179.101.0/24 -192.179.102.0/23 -192.179.102.0/24 -192.179.103.0/24 -192.179.104.0/23 -192.179.104.0/24 -192.179.105.0/24 -192.179.106.0/23 -192.179.106.0/24 -192.179.107.0/24 -192.179.108.0/23 -192.179.108.0/24 -192.179.109.0/24 -192.179.110.0/23 -192.179.110.0/24 -192.179.111.0/24 -192.179.112.0/23 -192.179.112.0/24 -192.179.113.0/24 -192.179.114.0/23 -192.179.114.0/24 -192.179.115.0/24 -192.179.116.0/23 -192.179.116.0/24 -192.179.117.0/24 -192.179.118.0/23 -192.179.118.0/24 -192.179.119.0/24 -192.179.120.0/23 -192.179.120.0/24 -192.179.121.0/24 -192.179.122.0/23 -192.179.122.0/24 -192.179.123.0/24 -192.179.124.0/23 -192.179.124.0/24 -192.179.125.0/24 -192.179.126.0/23 -192.179.126.0/24 -192.179.127.0/24 -192.179.128.0/23 -192.179.128.0/24 -192.179.129.0/24 -192.179.130.0/23 -192.179.130.0/24 -192.179.131.0/24 -192.179.132.0/23 -192.179.132.0/24 -192.179.133.0/24 -192.179.134.0/23 -192.179.134.0/24 -192.179.135.0/24 -192.179.136.0/23 -192.179.136.0/24 -192.179.137.0/24 -192.179.138.0/23 -192.179.138.0/24 -192.179.139.0/24 -192.179.140.0/23 -192.179.140.0/24 -192.179.141.0/24 -192.179.142.0/23 -192.179.142.0/24 -192.179.143.0/24 -192.179.144.0/23 -192.179.144.0/24 -192.179.145.0/24 -192.179.146.0/23 -192.179.146.0/24 -192.179.147.0/24 -192.179.148.0/23 -192.179.148.0/24 -192.179.149.0/24 -192.179.150.0/23 -192.179.150.0/24 -192.179.151.0/24 -192.179.152.0/23 -192.179.152.0/24 -192.179.153.0/24 -192.179.154.0/23 -192.179.154.0/24 -192.179.155.0/24 -192.179.156.0/23 -192.179.156.0/24 -192.179.157.0/24 -192.179.158.0/23 -192.179.158.0/24 -192.179.159.0/24 -192.179.160.0/23 -192.179.160.0/24 -192.179.161.0/24 -192.179.162.0/23 -192.179.162.0/24 -192.179.163.0/24 -192.179.164.0/23 -192.179.164.0/24 -192.179.165.0/24 -192.179.166.0/23 -192.179.166.0/24 -192.179.167.0/24 -192.179.168.0/23 -192.179.168.0/24 -192.179.169.0/24 -192.179.170.0/23 -192.179.170.0/24 -192.179.171.0/24 -192.179.172.0/23 -192.179.172.0/24 -192.179.173.0/24 -192.179.174.0/23 -192.179.174.0/24 -192.179.175.0/24 -192.179.176.0/23 -192.179.176.0/24 -192.179.177.0/24 -192.179.178.0/23 -192.179.178.0/24 -192.179.179.0/24 -192.179.180.0/23 -192.179.180.0/24 -192.179.181.0/24 -192.179.182.0/23 -192.179.182.0/24 -192.179.183.0/24 -192.179.184.0/23 -192.179.184.0/24 -192.179.185.0/24 -192.179.186.0/23 -192.179.186.0/24 -192.179.187.0/24 -192.179.188.0/23 -192.179.188.0/24 -192.179.189.0/24 -192.179.190.0/23 -192.179.190.0/24 -192.179.191.0/24 -192.179.192.0/23 -192.179.192.0/24 -192.179.193.0/24 -192.179.194.0/23 -192.179.194.0/24 -192.179.195.0/24 -192.179.196.0/23 -192.179.196.0/24 -192.179.197.0/24 -192.179.198.0/23 -192.179.198.0/24 -192.179.199.0/24 -192.179.200.0/23 -192.179.200.0/24 -192.179.201.0/24 -192.179.202.0/23 -192.179.202.0/24 -192.179.203.0/24 -192.179.204.0/23 -192.179.204.0/24 -192.179.205.0/24 -192.179.206.0/23 -192.179.206.0/24 -192.179.207.0/24 -192.179.208.0/23 -192.179.208.0/24 -192.179.209.0/24 -192.179.210.0/23 -192.179.210.0/24 -192.179.211.0/24 -192.179.212.0/23 -192.179.212.0/24 -192.179.213.0/24 -192.179.214.0/23 -192.179.214.0/24 -192.179.215.0/24 -192.179.216.0/23 -192.179.216.0/24 -192.179.217.0/24 -192.179.218.0/23 -192.179.218.0/24 -192.179.219.0/24 -192.179.220.0/23 -192.179.220.0/24 -192.179.221.0/24 -192.179.222.0/23 -192.179.222.0/24 -192.179.223.0/24 -192.179.224.0/23 -192.179.224.0/24 -192.179.225.0/24 -192.179.226.0/23 -192.179.226.0/24 -192.179.227.0/24 -192.179.228.0/23 -192.179.228.0/24 -192.179.229.0/24 -192.179.230.0/23 -192.179.230.0/24 -192.179.231.0/24 -192.179.232.0/23 -192.179.232.0/24 -192.179.233.0/24 -192.179.234.0/23 -192.179.234.0/24 -192.179.235.0/24 -192.179.236.0/23 -192.179.236.0/24 -192.179.237.0/24 -192.179.238.0/23 -192.179.238.0/24 -192.179.239.0/24 -192.179.240.0/23 -192.179.240.0/24 -192.179.241.0/24 -192.179.242.0/23 -192.179.242.0/24 -192.179.243.0/24 -192.179.244.0/23 -192.179.244.0/24 -192.179.245.0/24 -192.179.246.0/23 -192.179.246.0/24 -192.179.247.0/24 -192.179.248.0/23 -192.179.248.0/24 -192.179.249.0/24 -192.179.250.0/23 -192.179.250.0/24 -192.179.251.0/24 -192.179.252.0/23 -192.179.252.0/24 -192.179.253.0/24 -192.179.254.0/23 -192.179.254.0/24 -192.179.255.0/24 -199.192.112.0/22 -199.192.112.0/23 -199.192.112.0/24 -199.192.114.0/23 -199.192.114.0/24 -199.223.232.0/21 -199.223.232.0/23 -199.223.232.0/24 -199.223.233.0/24 -199.223.234.0/23 -199.223.234.0/24 -199.223.235.0/24 -199.223.236.0/23 -199.223.237.0/24 -199.223.238.0/23 -199.223.238.0/24 -199.223.239.0/24 -207.223.160.0/20 -207.223.160.0/23 -207.223.160.0/24 -207.223.161.0/24 -207.223.162.0/23 -207.223.162.0/24 -207.223.163.0/24 -207.223.164.0/23 -207.223.164.0/24 -207.223.165.0/24 -207.223.166.0/23 -207.223.166.0/24 -207.223.167.0/24 -207.223.168.0/23 -207.223.168.0/24 -207.223.169.0/24 -207.223.170.0/23 -207.223.170.0/24 -207.223.171.0/24 -207.223.172.0/23 -207.223.172.0/24 -207.223.173.0/24 -207.223.174.0/23 -207.223.174.0/24 -207.223.175.0/24 -208.65.152.0/23 -208.65.152.0/24 -208.65.153.0/24 -208.65.154.0/23 -208.65.154.0/24 -208.65.155.0/24 -208.117.224.0/23 -208.117.224.0/24 -208.117.225.0/24 -208.117.226.0/23 -208.117.226.0/24 -208.117.227.0/24 -208.117.228.0/23 -208.117.228.0/24 -208.117.229.0/24 -208.117.230.0/23 -208.117.230.0/24 -208.117.231.0/24 -208.117.232.0/23 -208.117.232.0/24 -208.117.233.0/24 -208.117.234.0/23 -208.117.234.0/24 -208.117.235.0/24 -208.117.236.0/23 -208.117.236.0/24 -208.117.237.0/24 -208.117.238.0/23 -208.117.238.0/24 -208.117.239.0/24 -208.117.240.0/23 -208.117.240.0/24 -208.117.241.0/24 -208.117.242.0/23 -208.117.242.0/24 -208.117.243.0/24 -208.117.244.0/23 -208.117.244.0/24 -208.117.245.0/24 -208.117.246.0/23 -208.117.246.0/24 -208.117.247.0/24 -208.117.248.0/23 -208.117.248.0/24 -208.117.249.0/24 -208.117.250.0/23 -208.117.250.0/24 -208.117.251.0/24 -208.117.252.0/23 -208.117.252.0/24 -208.117.253.0/24 -208.117.254.0/23 -208.117.254.0/24 -208.117.255.0/24 -209.85.128.0/23 -209.85.128.0/24 -209.85.129.0/24 -209.85.130.0/23 -209.85.130.0/24 -209.85.131.0/24 -209.85.132.0/23 -209.85.132.0/24 -209.85.133.0/24 -209.85.134.0/23 -209.85.134.0/24 -209.85.135.0/24 -209.85.136.0/23 -209.85.136.0/24 -209.85.137.0/24 -209.85.138.0/23 -209.85.138.0/24 -209.85.139.0/24 -209.85.140.0/23 -209.85.140.0/24 -209.85.141.0/24 -209.85.142.0/23 -209.85.142.0/24 -209.85.143.0/24 -209.85.144.0/23 -209.85.144.0/24 -209.85.145.0/24 -209.85.146.0/23 -209.85.146.0/24 -209.85.147.0/24 -209.85.148.0/23 -209.85.148.0/24 -209.85.149.0/24 -209.85.150.0/23 -209.85.150.0/24 -209.85.151.0/24 -209.85.152.0/23 -209.85.152.0/24 -209.85.153.0/24 -209.85.154.0/23 -209.85.154.0/24 -209.85.155.0/24 -209.85.156.0/23 -209.85.156.0/24 -209.85.157.0/24 -209.85.158.0/23 -209.85.158.0/24 -209.85.159.0/24 -209.85.160.0/23 -209.85.160.0/24 -209.85.161.0/24 -209.85.162.0/23 -209.85.162.0/24 -209.85.163.0/24 -209.85.164.0/23 -209.85.164.0/24 -209.85.165.0/24 -209.85.166.0/23 -209.85.166.0/24 -209.85.167.0/24 -209.85.168.0/23 -209.85.168.0/24 -209.85.169.0/24 -209.85.170.0/24 -209.85.171.0/24 -209.85.172.0/23 -209.85.172.0/24 -209.85.173.0/24 -209.85.174.0/23 -209.85.174.0/24 -209.85.175.0/24 -209.85.176.0/24 -209.85.177.0/24 -209.85.178.0/23 -209.85.178.0/24 -209.85.179.0/24 -209.85.180.0/23 -209.85.180.0/24 -209.85.181.0/24 -209.85.182.0/23 -209.85.182.0/24 -209.85.183.0/24 -209.85.184.0/23 -209.85.184.0/24 -209.85.185.0/24 -209.85.186.0/23 -209.85.186.0/24 -209.85.187.0/24 -209.85.188.0/23 -209.85.188.0/24 -209.85.189.0/24 -209.85.190.0/23 -209.85.190.0/24 -209.85.191.0/24 -209.85.192.0/23 -209.85.192.0/24 -209.85.193.0/24 -209.85.194.0/23 -209.85.194.0/24 -209.85.195.0/24 -209.85.196.0/23 -209.85.196.0/24 -209.85.197.0/24 -209.85.198.0/23 -209.85.198.0/24 -209.85.199.0/24 -209.85.200.0/23 -209.85.200.0/24 -209.85.201.0/24 -209.85.202.0/23 -209.85.202.0/24 -209.85.203.0/24 -209.85.204.0/23 -209.85.204.0/24 -209.85.205.0/24 -209.85.206.0/23 -209.85.206.0/24 -209.85.207.0/24 -209.85.208.0/23 -209.85.208.0/24 -209.85.209.0/24 -209.85.210.0/23 -209.85.210.0/24 -209.85.211.0/24 -209.85.212.0/23 -209.85.212.0/24 -209.85.213.0/24 -209.85.214.0/23 -209.85.214.0/24 -209.85.215.0/24 -209.85.216.0/23 -209.85.216.0/24 -209.85.217.0/24 -209.85.218.0/23 -209.85.218.0/24 -209.85.219.0/24 -209.85.220.0/23 -209.85.220.0/24 -209.85.221.0/24 -209.85.222.0/23 -209.85.222.0/24 -209.85.223.0/24 -209.85.224.0/23 -209.85.224.0/24 -209.85.225.0/24 -209.85.226.0/23 -209.85.226.0/24 -209.85.227.0/24 -209.85.228.0/23 -209.85.228.0/24 -209.85.229.0/24 -209.85.230.0/23 -209.85.230.0/24 -209.85.231.0/24 -209.85.232.0/23 -209.85.232.0/24 -209.85.233.0/24 -209.85.234.0/23 -209.85.234.0/24 -209.85.235.0/24 -209.85.236.0/23 -209.85.236.0/24 -209.85.237.0/24 -209.85.238.0/23 -209.85.238.0/24 -209.85.239.0/24 -209.85.240.0/23 -209.85.240.0/24 -209.85.241.0/24 -209.85.242.0/23 -209.85.242.0/24 -209.85.243.0/24 -209.85.244.0/23 -209.85.244.0/24 -209.85.245.0/24 -209.85.246.0/23 -209.85.246.0/24 -209.85.247.0/24 -209.85.248.0/23 -209.85.248.0/24 -209.85.249.0/24 -209.85.250.0/23 -209.85.250.0/24 -209.85.251.0/24 -209.85.252.0/23 -209.85.252.0/24 -209.85.253.0/24 -209.85.254.0/23 -209.85.254.0/24 -209.85.255.0/24 -216.58.192.0/23 -216.58.192.0/24 -216.58.193.0/24 -216.58.194.0/23 -216.58.194.0/24 -216.58.195.0/24 -216.58.196.0/23 -216.58.196.0/24 -216.58.197.0/24 -216.58.198.0/23 -216.58.198.0/24 -216.58.199.0/24 -216.58.200.0/23 -216.58.200.0/24 -216.58.201.0/24 -216.58.202.0/23 -216.58.202.0/24 -216.58.203.0/24 -216.58.204.0/23 -216.58.204.0/24 -216.58.205.0/24 -216.58.206.0/23 -216.58.206.0/24 -216.58.207.0/24 -216.58.208.0/23 -216.58.208.0/24 -216.58.209.0/24 -216.58.210.0/23 -216.58.210.0/24 -216.58.211.0/24 -216.58.212.0/23 -216.58.212.0/24 -216.58.213.0/24 -216.58.214.0/23 -216.58.214.0/24 -216.58.215.0/24 -216.58.216.0/23 -216.58.216.0/24 -216.58.217.0/24 -216.58.218.0/23 -216.58.218.0/24 -216.58.219.0/24 -216.58.220.0/23 -216.58.220.0/24 -216.58.221.0/24 -216.58.222.0/23 -216.58.222.0/24 -216.58.223.0/24 -216.239.32.0/23 -216.239.32.0/24 -216.239.33.0/24 -216.239.34.0/24 -216.239.35.0/24 -216.239.36.0/23 -216.239.36.0/24 -216.239.37.0/24 -216.239.38.0/23 -216.239.38.0/24 -216.239.39.0/24 -216.239.40.0/23 -216.239.40.0/24 -216.239.41.0/24 -216.239.42.0/23 -216.239.42.0/24 -216.239.43.0/24 -216.239.44.0/23 -216.239.46.0/23 -216.239.46.0/24 -216.239.47.0/24 -216.239.48.0/23 -216.239.48.0/24 -216.239.49.0/24 -216.239.50.0/23 -216.239.50.0/24 -216.239.51.0/24 -216.239.52.0/23 -216.239.52.0/24 -216.239.53.0/24 -216.239.54.0/23 -216.239.54.0/24 -216.239.55.0/24 -216.239.56.0/24 -216.239.57.0/24 -216.239.58.0/23 -216.239.59.0/24 -216.239.60.0/23 -216.239.60.0/24 -216.239.61.0/24 -216.239.62.0/23 -216.239.62.0/24 -216.239.63.0/24 -45.121.228.0/24 -45.121.229.0/24 -45.121.230.0/24 -45.121.231.0/24 -103.62.64.0/24 -103.62.65.0/24 -103.62.66.0/24 -103.62.67.0/24 -74.114.24.0/21 -74.114.24.0/23 -74.114.24.0/24 -74.114.25.0/24 -74.114.26.0/23 -74.114.26.0/24 -74.114.27.0/24 -74.114.28.0/23 -74.114.28.0/24 -74.114.29.0/24 -74.114.30.0/23 -74.114.30.0/24 -74.114.31.0/24 -45.121.230.0/23 -103.62.66.0/23 -74.125.64.0/22 -108.170.192.0/21 -108.170.222.0/23 -199.192.113.0/24 -185.25.28.0/23 -35.192.0.0/12 -74.125.0.0/18 -35.206.0.0/15 -35.208.0.0/12 -35.224.0.0/12 -35.240.0.0/13 -35.224.0.0/19 -35.224.32.0/19 -35.224.64.0/19 -35.224.96.0/19 -35.224.128.0/19 -35.224.160.0/19 -35.224.192.0/19 -35.224.224.0/19 -35.225.0.0/19 -35.225.32.0/19 -35.225.64.0/19 -35.225.96.0/19 -35.225.128.0/19 -35.225.160.0/19 -35.225.192.0/19 -35.225.224.0/19 -35.226.0.0/19 -35.226.32.0/19 -35.226.64.0/19 -35.226.96.0/19 -35.226.128.0/19 -35.226.160.0/19 -35.226.192.0/19 -35.226.224.0/19 -35.227.0.0/19 -35.227.32.0/19 -35.227.64.0/19 -35.227.96.0/19 -35.227.128.0/17 -35.227.128.0/19 -35.227.160.0/19 -35.228.0.0/19 -35.228.32.0/19 -35.228.64.0/19 -35.228.96.0/19 -35.228.128.0/19 -35.228.160.0/19 -35.228.192.0/19 -35.228.224.0/19 -35.229.0.0/16 -35.229.0.0/19 -35.229.64.0/19 -35.229.96.0/19 -35.230.0.0/16 -35.230.192.0/19 -35.230.224.0/19 -35.231.128.0/19 -35.231.160.0/19 -35.231.192.0/19 -35.231.224.0/19 -35.232.0.0/19 -35.232.32.0/19 -35.232.64.0/19 -35.232.96.0/19 -35.232.128.0/19 -35.232.160.0/19 -35.232.192.0/19 -35.232.224.0/19 -35.233.0.0/19 -35.233.32.0/19 -35.233.64.0/19 -35.233.96.0/19 -35.233.128.0/19 -35.233.160.0/19 -35.233.192.0/19 -35.233.224.0/19 -35.234.0.0/19 -35.234.32.0/19 -35.234.64.0/19 -35.234.96.0/19 -35.234.128.0/19 -35.234.160.0/19 -35.234.192.0/19 -35.234.224.0/19 -35.235.0.0/19 -35.235.32.0/19 -35.235.64.0/19 -35.235.96.0/19 -35.235.128.0/19 -35.235.160.0/19 -35.235.192.0/19 -35.235.224.0/19 -35.236.0.0/19 -35.236.32.0/19 -35.236.64.0/19 -35.236.96.0/19 -35.236.128.0/19 -35.236.160.0/19 -35.236.192.0/19 -35.236.224.0/19 -35.237.0.0/19 -35.237.32.0/19 -35.237.64.0/19 -35.237.96.0/19 -35.237.128.0/19 -35.237.160.0/19 -35.237.192.0/19 -35.237.224.0/19 -35.238.0.0/19 -35.238.32.0/19 -35.238.64.0/19 -35.238.96.0/19 -35.238.128.0/19 -35.238.160.0/19 -35.238.192.0/19 -35.238.224.0/19 -35.239.0.0/19 -35.239.32.0/19 -35.239.64.0/19 -35.239.96.0/19 -35.239.128.0/19 -35.239.160.0/19 -35.239.192.0/19 -35.239.224.0/19 -35.240.0.0/19 -35.240.32.0/19 -35.240.64.0/19 -35.240.96.0/19 -35.240.128.0/19 -35.240.160.0/19 -35.240.192.0/19 -35.240.224.0/19 -35.241.0.0/19 -35.241.32.0/19 -35.241.64.0/19 -35.241.96.0/19 -35.241.128.0/19 -35.241.160.0/19 -35.241.192.0/19 -35.241.224.0/19 -35.242.0.0/19 -35.242.64.0/19 -35.242.96.0/19 -35.242.128.0/19 -35.242.160.0/19 -35.242.192.0/19 -35.242.224.0/19 -35.243.0.0/19 -35.243.32.0/19 -35.243.64.0/19 -35.243.96.0/19 -35.243.128.0/19 -35.243.160.0/19 -35.243.192.0/19 -35.243.224.0/19 -35.192.0.0/19 -35.192.32.0/19 -35.192.64.0/19 -35.192.96.0/19 -35.192.128.0/19 -35.192.160.0/19 -35.192.192.0/19 -35.192.224.0/19 -35.193.0.0/19 -35.193.32.0/19 -35.193.64.0/19 -35.193.96.0/19 -35.193.128.0/19 -35.193.160.0/19 -35.193.192.0/19 -35.193.224.0/19 -35.194.0.0/19 -35.194.32.0/19 -35.194.64.0/19 -35.194.96.0/19 -35.194.128.0/19 -35.194.160.0/19 -35.194.192.0/19 -35.194.224.0/19 -35.195.0.0/19 -35.195.32.0/19 -35.195.64.0/19 -35.195.96.0/19 -35.195.128.0/19 -35.195.160.0/19 -35.195.192.0/19 -35.195.224.0/19 -35.196.0.0/19 -35.196.32.0/19 -35.196.64.0/19 -35.196.96.0/19 -35.196.128.0/19 -35.196.160.0/19 -35.196.192.0/19 -35.196.224.0/19 -35.197.0.0/19 -35.197.32.0/19 -35.197.64.0/19 -35.197.96.0/19 -35.197.128.0/19 -35.197.160.0/19 -35.197.192.0/19 -35.197.224.0/19 -35.198.0.0/19 -35.198.32.0/19 -35.198.64.0/19 -35.198.96.0/19 -35.198.128.0/19 -35.198.160.0/19 -35.198.192.0/19 -35.198.224.0/19 -35.199.0.0/19 -35.199.64.0/19 -35.199.96.0/19 -35.199.128.0/19 -35.199.192.0/19 -35.199.224.0/19 -35.200.0.0/19 -35.200.32.0/19 -35.200.64.0/19 -35.200.96.0/19 -35.200.128.0/19 -35.200.160.0/19 -35.200.192.0/19 -35.200.224.0/19 -35.201.0.0/17 -35.201.32.0/19 -35.201.128.0/19 -35.201.160.0/19 -35.201.192.0/19 -35.201.224.0/19 -35.202.0.0/19 -35.202.32.0/19 -35.202.64.0/19 -35.202.96.0/19 -35.202.128.0/19 -35.202.160.0/19 -35.202.192.0/19 -35.202.224.0/19 -35.203.0.0/19 -35.203.32.0/19 -35.203.64.0/19 -35.203.96.0/19 -35.203.128.0/19 -35.203.160.0/19 -35.203.192.0/19 -35.203.224.0/19 -35.204.0.0/19 -35.204.32.0/19 -35.204.64.0/19 -35.204.96.0/19 -35.204.128.0/19 -35.204.160.0/19 -35.204.192.0/19 -35.204.224.0/19 -35.205.0.0/19 -35.205.32.0/19 -35.205.64.0/19 -35.205.96.0/19 -35.205.128.0/19 -35.205.160.0/19 -35.205.192.0/19 -35.205.224.0/19 -89.207.231.0/24 -34.64.0.0/10 -34.112.0.0/14 -35.199.32.0/19 -35.199.64.0/18 -35.199.128.0/17 -136.22.64.0/23 -136.22.86.0/23 -172.217.192.0/18 -216.58.192.0/22 -35.199.128.0/18 -35.200.0.0/14 -35.228.0.0/14 -35.232.0.0/14 -35.240.0.0/14 -66.249.80.0/22 -74.125.0.0/20 -74.125.44.0/22 -74.125.72.0/22 -74.125.152.0/21 -74.125.176.0/20 -173.194.0.0/19 -173.194.48.0/20 -173.194.96.0/21 -173.194.128.0/20 -173.194.144.0/20 -173.194.160.0/21 -173.194.176.0/20 -108.177.16.128/25 -108.177.16.128/26 -142.251.0.0/24 -209.85.176.0/23 -142.250.7.0/24 -192.178.0.0/24 -209.85.170.0/23 -142.250.3.0/24 -142.250.6.0/24 -142.250.8.0/24 -142.250.11.0/24 -193.186.4.0/24 -142.250.2.0/24 -142.250.4.0/24 -142.250.5.0/24 -142.250.9.0/24 -142.250.10.0/24 -142.250.12.0/24 -192.178.0.0/15 -142.250.1.0/24 -70.32.128.0/19 -172.217.56.0/21 -34.120.0.0/13 -172.217.224.0/19 -136.112.0.0/12 -34.64.0.0/14 -35.187.192.0/19 -34.76.0.0/14 -35.187.128.0/19 -35.189.64.0/19 -35.189.128.0/19 -34.64.0.0/11 -35.184.160.0/19 -35.186.0.0/19 -104.154.96.0/19 -35.220.0.0/14 -35.188.0.0/19 -34.124.0.0/14 -34.84.0.0/14 -35.188.192.0/19 -35.186.96.0/19 -35.189.0.0/19 -35.190.224.0/19 -35.184.0.0/13 -35.185.64.0/19 -35.190.160.0/19 -34.96.0.0/14 -104.154.160.0/19 -35.184.96.0/19 -35.184.192.0/19 -35.188.224.0/19 -34.116.0.0/14 -104.154.224.0/19 -35.185.224.0/19 -35.188.32.0/19 -35.184.0.0/19 -35.186.160.0/19 -35.189.96.0/19 -216.73.80.0/20 -35.187.32.0/19 -35.185.128.0/19 -35.187.64.0/19 -35.185.32.0/19 -35.186.128.0/19 -34.92.0.0/14 -34.104.0.0/14 -35.188.64.0/19 -35.190.0.0/16 -104.154.192.0/19 -35.184.64.0/19 -34.108.0.0/14 -35.189.192.0/19 -35.188.128.0/19 -35.189.224.0/19 -35.185.96.0/19 -104.155.96.0/19 -34.88.0.0/14 -35.190.128.0/19 -104.155.224.0/19 -35.188.160.0/19 -34.80.0.0/14 -35.184.32.0/19 -35.185.160.0/19 -35.187.224.0/19 -104.154.128.0/19 -35.188.96.0/19 -35.187.96.0/19 -66.249.64.0/20 -104.155.64.0/19 -208.81.188.0/22 -34.96.0.0/12 -35.185.0.0/19 -104.155.0.0/19 -34.72.0.0/14 -35.184.128.0/19 -104.154.0.0/19 -35.189.160.0/19 -35.185.192.0/19 -35.186.64.0/19 -35.186.32.0/19 -35.189.32.0/19 -35.187.0.0/19 -104.155.128.0/19 -35.184.224.0/19 -34.100.0.0/14 -104.155.32.0/19 -104.155.160.0/19 -104.134.92.0/24 -35.203.224.0/23 -35.214.128.0/17 -35.208.0.0/15 -35.212.0.0/17 -35.206.5.0/24 -35.207.128.0/18 -35.212.128.0/17 -35.219.192.0/24 -35.206.1.0/24 -35.217.0.0/18 -35.211.0.0/16 -35.213.192.0/18 -35.207.64.0/18 -35.215.128.0/18 -35.206.6.0/24 -35.206.128.0/18 -35.206.192.0/18 -35.215.64.0/18 -35.206.8.0/24 -35.206.9.0/24 -35.206.2.0/24 -35.206.4.0/24 -35.207.192.0/18 -35.217.128.0/17 -35.214.0.0/17 -35.215.0.0/18 -35.207.0.0/18 -35.213.128.0/18 -35.206.0.0/24 -35.215.192.0/18 -35.216.128.0/17 -35.206.3.0/24 -35.213.0.0/17 -35.210.0.0/16 -70.32.136.0/24 -35.217.64.0/18 -35.216.0.0/17 -35.206.7.0/24 -104.134.208.0/21 -208.68.108.0/24 -104.134.200.0/21 -70.32.153.0/24 -104.134.144.0/22 -34.98.146.0/23 -70.32.145.0/24 -108.177.22.0/24 -208.87.172.0/24 -70.32.158.0/24 -208.76.69.0/24 -208.76.68.0/23 -70.32.146.0/24 -70.32.144.0/23 -104.134.192.0/22 -104.134.180.0/22 -70.32.156.0/23 -70.32.129.0/24 -104.134.244.0/22 -70.32.150.0/23 -104.134.224.0/22 -104.134.224.0/21 -34.98.145.0/24 -34.98.150.0/24 -108.177.20.0/24 -104.134.176.0/21 -104.134.196.0/22 -104.134.152.0/22 -70.32.136.0/22 -199.36.154.0/23 -104.134.252.0/22 -70.32.144.0/20 -70.32.144.0/21 -70.32.128.0/22 -208.87.174.0/23 -70.32.155.0/24 -104.134.160.0/19 -34.98.148.0/23 -108.177.20.0/22 -108.177.17.0/24 -104.134.184.0/21 -70.32.151.0/24 -70.32.140.0/23 -70.32.150.0/24 -208.76.70.0/23 -34.98.144.0/24 -208.68.110.0/23 -104.134.240.0/20 -104.134.140.0/22 -70.32.132.0/23 -104.134.228.0/22 -70.32.147.0/24 -104.134.248.0/21 -104.134.188.0/22 -34.98.149.0/24 -70.32.137.0/24 -208.68.110.0/24 -104.134.160.0/22 -70.32.157.0/24 -104.134.240.0/21 -199.36.157.0/24 -208.87.172.0/22 -70.32.136.0/23 -104.134.164.0/22 -70.32.148.0/22 -208.87.172.0/23 -208.87.175.0/24 -70.32.140.0/22 -104.134.232.0/21 -199.36.156.0/24 -199.36.154.0/24 -34.98.146.0/24 -70.32.142.0/23 -208.87.174.0/24 -104.134.148.0/22 -104.134.184.0/22 -208.68.109.0/24 -104.134.136.0/21 -104.134.176.0/22 -70.32.146.0/23 -70.32.141.0/24 -208.68.108.0/23 -70.32.152.0/22 -70.32.134.0/23 -70.32.131.0/24 -70.32.158.0/23 -70.32.132.0/24 -104.134.152.0/21 -34.98.144.0/23 -70.32.152.0/24 -70.32.154.0/23 -70.32.139.0/24 -34.98.147.0/24 -70.32.156.0/22 -70.32.128.0/23 -104.134.216.0/22 -104.134.212.0/22 -104.134.192.0/21 -104.134.144.0/20 -70.32.128.0/20 -70.32.148.0/23 -34.98.151.0/24 -104.134.168.0/22 -70.32.142.0/24 -108.177.16.0/24 -34.98.150.0/23 -104.134.224.0/19 -104.134.168.0/21 -104.134.160.0/21 -70.32.156.0/24 -108.177.21.0/24 -70.32.152.0/21 -70.32.134.0/24 -70.32.130.0/24 -104.134.144.0/21 -70.32.152.0/23 -70.32.133.0/24 -34.98.144.0/22 -104.134.136.0/22 -104.134.208.0/20 -104.134.232.0/22 -208.68.111.0/24 -34.98.148.0/22 -208.76.68.0/24 -70.32.154.0/24 -108.177.20.0/23 -104.134.128.0/20 -104.134.128.0/22 -70.32.140.0/24 -104.134.128.0/18 -208.76.70.0/24 -208.68.108.0/22 -70.32.144.0/22 -104.134.128.0/21 -208.76.71.0/24 -70.32.159.0/24 -104.134.192.0/19 -70.32.138.0/24 -104.134.160.0/20 -70.32.143.0/24 -104.134.216.0/21 -70.32.128.0/24 -70.32.138.0/23 -70.32.149.0/24 -104.134.224.0/20 -199.36.155.0/24 -70.32.148.0/24 -70.32.135.0/24 -34.98.148.0/24 -104.134.204.0/22 -108.177.23.0/24 -104.134.220.0/22 -108.177.16.0/23 -108.177.22.0/23 -70.32.132.0/22 -70.32.136.0/21 -104.134.156.0/22 -104.134.240.0/22 -104.134.200.0/22 -104.134.236.0/22 -104.134.176.0/20 -34.98.144.0/21 -104.134.128.0/19 -70.32.128.0/21 -208.76.68.0/22 -70.32.130.0/23 -104.134.132.0/22 -70.32.144.0/24 -208.87.173.0/24 -104.134.192.0/18 -104.134.208.0/22 -104.134.248.0/22 -104.134.192.0/20 -104.134.172.0/22 -34.97.128.0/17 -34.96.0.0/17 -34.97.0.0/17 -34.127.192.0/18 -34.96.0.0/20 -34.128.0.0/10 -34.173.0.0/16 -34.163.0.0/16 -34.181.0.0/16 -34.184.0.0/16 -34.147.0.0/16 -34.166.0.0/16 -34.161.0.0/16 -34.151.0.0/16 -34.180.0.0/16 -34.182.0.0/16 -34.131.0.0/16 -34.162.0.0/16 -34.139.0.0/16 -34.168.0.0/16 -34.178.0.0/16 -34.138.0.0/16 -34.132.0.0/16 -34.157.0.0/16 -34.144.0.0/16 -34.187.0.0/16 -34.179.0.0/16 -34.188.0.0/16 -34.135.0.0/16 -34.175.0.0/16 -34.154.0.0/16 -34.134.0.0/16 -34.152.0.0/16 -34.158.0.0/16 -34.150.0.0/16 -34.160.0.0/16 -34.191.0.0/16 -34.174.0.0/16 -34.172.0.0/16 -34.170.0.0/16 -34.153.0.0/16 -34.190.0.0/16 -34.133.0.0/16 -34.130.0.0/16 -34.185.0.0/16 -34.183.0.0/16 -34.136.0.0/16 -34.149.0.0/16 -34.169.0.0/16 -34.140.0.0/16 -34.148.0.0/16 -34.137.0.0/16 -34.128.0.0/16 -34.142.0.0/16 -34.165.0.0/16 -34.146.0.0/16 -34.177.0.0/16 -34.156.0.0/16 -34.167.0.0/16 -34.186.0.0/16 -34.143.0.0/16 -34.141.0.0/16 -34.171.0.0/16 -34.164.0.0/16 -34.189.0.0/16 -34.155.0.0/16 -34.144.0.0/13 -34.184.0.0/14 -34.136.0.0/13 -34.152.0.0/13 -34.168.0.0/13 -34.128.0.0/13 -34.160.0.0/13 -34.176.0.0/13 -35.206.12.0/22 -104.134.192.0/24 -2401:fa00::/42 -2401:fa00:4::/48 -2401:fa00::/32 -2620:0:1000::/40 -2620:15c::/36 -2001:1900:2292::/48 -2001:4860::/32 -2404:6800::/32 -2600:1900::/28 -2600:1900::/35 -2600:1900:2000::/35 -2600:1900:4000::/35 -2600:1900:6000::/35 -2600:1900:8000::/35 -2600:1900:a000::/35 -2600:1900:c000::/35 -2600:1900:e000::/35 -2600:1901::/35 -2600:1901:2000::/35 -2600:1901:4000::/35 -2600:1901:6000::/35 -2600:1901:8000::/35 -2600:1901:a000::/35 -2600:1901:c000::/35 -2600:1901:e000::/35 -2600:1902::/35 -2600:1902:2000::/35 -2600:1902:4000::/35 -2600:1902:6000::/35 -2600:1902:8000::/35 -2600:1902:a000::/35 -2600:1902:c000::/35 -2600:1902:e000::/35 -2600:1903::/35 -2600:1903:2000::/35 -2600:1903:4000::/35 -2600:1903:6000::/35 -2600:1903:8000::/35 -2600:1903:a000::/35 -2600:1903:c000::/35 -2600:1903:e000::/35 -2600:1904::/35 -2600:1904:2000::/35 -2600:1904:4000::/35 -2600:1904:6000::/35 -2600:1904:8000::/35 -2600:1904:a000::/35 -2600:1904:c000::/35 -2600:1904:e000::/35 -2600:1905::/35 -2600:1905:2000::/35 -2600:1905:4000::/35 -2600:1905:6000::/35 -2600:1905:8000::/35 -2600:1905:a000::/35 -2600:1905:c000::/35 -2600:1905:e000::/35 -2600:1906::/35 -2600:1906:2000::/35 -2600:1906:4000::/35 -2600:1906:6000::/35 -2600:1906:8000::/35 -2600:1906:a000::/35 -2600:1906:c000::/35 -2600:1906:e000::/35 -2600:1907::/35 -2600:1907:2000::/35 -2600:1907:4000::/35 -2600:1907:6000::/35 -2600:1907:8000::/35 -2600:1907:a000::/35 -2600:1907:c000::/35 -2600:1907:e000::/35 -2600:1908::/35 -2600:1908:2000::/35 -2600:1908:4000::/35 -2600:1908:6000::/35 -2600:1908:8000::/35 -2600:1908:a000::/35 -2600:1908:c000::/35 -2600:1908:e000::/35 -2600:1909::/35 -2600:1909:2000::/35 -2600:1909:4000::/35 -2600:1909:6000::/35 -2600:1909:8000::/35 -2600:1909:a000::/35 -2600:1909:c000::/35 -2600:1909:e000::/35 -2600:190a::/35 -2600:190a:2000::/35 -2600:190a:4000::/35 -2600:190a:6000::/35 -2600:190a:8000::/35 -2600:190a:a000::/35 -2600:190a:c000::/35 -2600:190a:e000::/35 -2600:190b::/35 -2600:190b:2000::/35 -2600:190b:4000::/35 -2600:190b:6000::/35 -2600:190b:8000::/35 -2600:190b:a000::/35 -2600:190b:c000::/35 -2600:190b:e000::/35 -2600:190c::/35 -2600:190c:2000::/35 -2600:190c:4000::/35 -2600:190c:6000::/35 -2600:190c:8000::/35 -2600:190c:a000::/35 -2600:190c:c000::/35 -2600:190c:e000::/35 -2600:190d::/35 -2600:190d:2000::/35 -2600:190d:4000::/35 -2600:190d:6000::/35 -2600:190d:8000::/35 -2600:190d:a000::/35 -2600:190d:c000::/35 -2600:190d:e000::/35 -2600:190e::/35 -2600:190e:2000::/35 -2600:190e:4000::/35 -2600:190e:6000::/35 -2600:190e:8000::/35 -2600:190e:a000::/35 -2600:190e:c000::/35 -2600:190e:e000::/35 -2600:190f::/35 -2600:190f:2000::/35 -2600:190f:4000::/35 -2600:190f:6000::/35 -2600:190f:8000::/35 -2600:190f:a000::/35 -2600:190f:c000::/35 -2600:190f:e000::/35 -2607:f8b0::/32 -2620:120:e000::/40 -2800:3f0::/32 -2a00:1450::/32 -2c0f:fb50::/32 -2a00:79e0::/31 -2a00:79e0::/32 -2a00:79e1::/32 -2604:31C0::/32 -2607:f8b0:4000::/48 -2607:f8b0:480f::/48 -2404:6800:480e::/48 -2a00:1450:480e::/48 -2607:f8b0:480e::/48 -2a00:1450:4010::/48 -2607:f8b0:400c::/48 -2a00:1450:4006::/48 -2800:3f0:4002::/48 -2607:f8b0:4008::/48 -2404:6800:4003::/48 -2800:3f0:4003::/48 -2607:f8b0:4013::/48 -2404:6800:4002::/48 -2a00:1450:400b::/48 -2607:f8b0:4009::/48 -2a00:1450:401a::/48 -2607:f8b0:400f::/48 -2a00:1450:400a::/48 -2607:f8b0:400a::/48 -2607:f8b0:400b::/48 -2800:3f0:4005::/48 -2a00:1450:4003::/48 -2607:f8b0:4001::/48 -2404:6800:4005::/48 -2a00:1450:4018::/48 -2800:3f0:4004::/48 -2c0f:fb50:4002::/48 -2607:f8b0:4011::/48 -2a00:1450:4004::/48 -2404:6800:4004::/48 -2800:3f0:4001::/48 -2404:6800:4008::/48 -2a00:1450:4019::/48 -2a00:1450:4017::/48 -2a00:1450:4012::/48 -2607:f8b0:4012::/48 -2404:6800:4001::/48 -2a00:1450:401b::/48 -2404:f340::/32 -2607:f8b0:4014::/48 -2607:f8b0:4005::/48 -2a00:1450:4009::/48 -2607:f8b0:4010::/48 -2a00:1450:400e::/48 -2607:f8b0:4003::/48 -2a00:1450:400f::/48 -2a00:1450:400c::/48 -2404:6800:4009::/48 -2a00:1450:4002::/48 -2607:f8b0:400d::/48 -2607:f8b0:400e::/48 -2a00:1450:4014::/48 -2a00:1450:4011::/48 -2404:6800:4006::/48 -2a00:1450:4007::/48 -2607:f8b0:4002::/48 -2404:6800:4007::/48 -2607:f8b0:4004::/48 -2607:f8b0:4007::/48 -2a00:1450:4008::/48 -2a00:1450:4005::/48 -2a00:1450:4013::/48 -2a00:1450:4016::/48 -2c0f:fb50:4003::/48 -2607:f8b0:4015::/48 -2607:f8b0:4016::/48 -2a00:1450:4001::/48 -2a00:1450:400d::/48 -2607:f8b0:4006::/48 -2a00:1450:401c::/48 -2a00:1450:4015::/48 -2404:6800:400a::/48 -2001:4860:4864::/48 -2a00:79e1:380::/42 -2607:f8b0:1001::/48 -2620:33:c000::/48 -2600:1900::/31 -2600:1908::/29 -2600:1904::/30 -2a00:79e1:f00::/40 -2606:73c0::/32 \ No newline at end of file diff --git a/slips_files/organizations_info/google_asn b/slips_files/organizations_info/google_asn index 13cd0fcce..97f2eadb7 100644 --- a/slips_files/organizations_info/google_asn +++ b/slips_files/organizations_info/google_asn @@ -1,38 +1,58 @@ -AS6432 +AS139070 +AS139190 +AS13949 +AS151231 +AS15169 +AS16550 +AS16591 +AS19425 AS19448 +AS19527 +AS207192 +AS209504 +AS209519 +AS209539 +AS214609 +AS214611 +AS22577 AS22859 +AS24424 AS26684 AS26910 +AS32381 +AS33715 AS36039 +AS36040 +AS36383 +AS36384 +AS36385 +AS36411 +AS36492 +AS36520 +AS36561 AS36987 -AS55023 +AS394089 AS394507 AS394639 -AS396982 -AS41264 -AS45566 -AS16591 -AS16550 -AS207192 -AS36385 -AS24424 -AS139190 -AS36492 AS394699 AS395973 -AS36384 -AS139070 -AS19527 -AS15169 +AS396178 +AS396982 +AS40873 +AS41264 +AS43515 AS44384 -GOOGLE, US -GOOGLE-PRIVATE-CLOUD, US -GOOGLE-FIBER, US -GOOGLE-2, US -CNNIC-GOOGLECN-AP BEIJING GU XIANG INFORMATION TECHNOLOGY CO.,LTD., CN +AS45566 +AS55023 +AS6432 AS-GOOGLE-EDGE-INFRA, US +CNNIC-GOOGLECN-AP BEIJING GU XIANG INFORMATION TECHNOLOGY CO.,LTD., CN +GOOGLE-2, US +GOOGLE-AS, KE GOOGLE-CLOUD-2, US +GOOGLE-FIBER, US +GOOGLE-IT-RO-ISP, CH GOOGLE-IT, US +GOOGLE-PRIVATE-CLOUD, US +GOOGLE, US GOOGLEWIFI, US -GOOGLE-AS, KE -GOOGLE-IT-RO-ISP, CH diff --git a/slips_files/organizations_info/google_domains b/slips_files/organizations_info/google_domains index 6f0df0062..4efa398f6 100644 --- a/slips_files/organizations_info/google_domains +++ b/slips_files/organizations_info/google_domains @@ -1,778 +1,60 @@ -ggoogle.com -1000grausomeacessorios.site -100forno.site -100ndn.site -10tothe100.net -10tothe100.org -132kvwaterworkssubstation.site -13colonies.us -1-800-466-4411.biz -1-800-466-4411.com -1-800-466-4411.info -1-800-466-4411.net -1-800-466-4411.org +admob.fi +admob.no +admob.tw +android.com +appspot.com +blogger.com +blogspot.com +coral.ai +firebaseapp.com +ggpht.com google.ad -google.ae -google.al -google.am -google.as -google.at -google.az -google.ba -google.be -google.bf -google.bg -google.bi -google.bj -google.bs -google.bt -google.by -google.ca +google.ai google.cat -google.cd -google.cf -google.cg -google.ch -google.ci -google.cl -google.cm -google.cn -google.co.ao -google.co.bw -google.co.ck -google.co.cr -google.co.id -google.co.il google.co.in -google.co.jp -google.co.ke -google.co.kr -google.co.ls -google.co.ma -google.co.mz -google.co.nz -google.co.th -google.co.tz -google.co.ug -google.co.uk -google.co.uz -google.co.ve -google.co.vi -google.co.za -google.co.zm -google.co.zw google.com -google.com.af -google.com.ag google.com.ai -google.com.ar -google.com.au -google.com.bd -google.com.bh -google.com.bn -google.com.bo -google.com.br -google.com.bz -google.com.co -google.com.cu -google.com.cy -google.com.do google.com.ec -google.com.eg -google.com.et -google.com.fj -google.com.gh -google.com.gi -google.com.gt -google.com.hk -google.com.jm -google.com.kh -google.com.kw -google.com.lb -google.com.ly -google.com.mm -google.com.mt -google.com.mx -google.com.my -google.com.na google.com.nf -google.com.ng -google.com.ni -google.com.np -google.com.om -google.com.pa -google.com.pe -google.com.pg -google.com.ph -google.com.pk -google.com.pr -google.com.py -google.com.qa -google.com.sa -google.com.sb -google.com.sg -google.com.sl -google.com.sv -google.com.tj -google.com.tr google.com.tw google.com.ua -google.com.uy -google.com.vc -google.com.vn -google.cv -google.cz -google.de -google.dj -google.dk -google.dm -google.dz -google.ee -google.es +google.cx +google.ec google.fi -google.fm -google.fr -google.ga -google.ge -google.gg -google.gl -google.gm -google.gp -google.gr google.gy google.hn -google.hr google.ht -google.hu -google.ie -google.im -google.iq +google.in google.is -google.it -google.je -google.jo -google.kg -google.ki -google.kz -google.la -google.li -google.lk -google.lt -google.lu -google.lv -google.md -google.me -google.mg -google.mk -google.ml -google.mn -google.ms google.mu -google.mv -google.mw -google.ne +google.net +google.nf google.nl google.no -google.nr -google.nu +google.org google.pl -google.pn -google.ps -google.pt -google.ro -google.rs -google.ru -google.rw -google.sc -google.se -google.sh -google.si -google.sk -google.sm google.sn -google.so -google.sr -google.st -google.td -google.tg -google.tk -google.tl -google.tm -google.tn -google.to -google.tt -google.vg -google.vu -google.ws -1e100.net -466453.com -abc.xyz -admob.com -adsense.com -advertisercommunity.com -adwords.com -ai.google -android.com -blog.google -blogger.com -blogspot.com -capitalg.com -chrome.com -chromebook.com -chromecast.com -chromium.org -cobrasearch.com -com.google -domains.google -doubleclick.com -doubleclick.net -doubleclickbygoogle.com -duck.com -elgoog.im -feedburner.com -foofle.com -forms.gle -froogle.com -g.co -ggpht.com -gmail.com -gmodules.com -gogle.com -gogole.com -goo.gl -googel.com -googil.com -googl.com -google-analytics.com -google.ac -google.af -google.ag -google.ai -google.ao -google.ar -google.au -google.bd -google.bh -google.bn -google.bo -google.br -google.bw -google.bz -google.cc -google.ck -google.co -google.cr -google.cu -google.cx -google.cy -google.do -google.ec -google.eg -google.et -google.eu -google.fj -google.gf -google.gh -google.gi -google.gt -google.hk -google.id -google.il -google.in -google.io -google.jm -google.jp -google.ke -google.kh -google.kr -google.kw -google.lb -google.lc -google.ls -google.ly -google.ma -google.mm -google.mt -google.mx -google.my -google.mz -google.na -google.net -google.nf -google.ng -google.ni -google.np -google.nz -google.om -google.org -google.pa -google.pe -google.pg -google.ph -google.pk -google.pr -google.py -google.qa -google.sa -google.sb -google.sg -google.sl -google.sv -google.th -google.tj -google.tr google.tw -google.tz google.ua -google.ug -google.uk -google.us -google.uy google.uz -google.vc -google.ve -google.vi -google.vn -google.za -google.zm -google.zw -googleadservices.com -googleapis.com -googleapps.com -googlearth.com -googlebot.com -googlecode.com -googlecommerce.com -googlee.com -googleearth.com -googlemail.com -googlemaps.com -googlepagecreator.com -googlescholar.com -googlesource.com -googlesyndication.com -googletagmanager.com -googleusercontent.com -googlr.com -goolge.com -gooogle.com -gv.com +gstatic.net gvt1.com -keyhole.com -like.com -localguidesconnect.com -madewithcode.com -panoramio.com -picasa.com -urchin.com -waze.com -whatbrowser.org -withgoogle.com +gvt2.com www.google.ad -www.google.ae -www.google.al -www.google.am -www.google.as -www.google.at -www.google.az -www.google.ba -www.google.be -www.google.bf -www.google.bg -www.google.bi -www.google.bj -www.google.bs -www.google.bt -www.google.by -www.google.ca -www.google.cd -www.google.cf -www.google.cg -www.google.ch -www.google.ci -www.google.cl -www.google.cm -www.google.cn -www.google.co.ao -www.google.co.bw -www.google.co.ck -www.google.co.cr -www.google.co.id -www.google.co.il www.google.co.in -www.google.co.jp -www.google.co.ke -www.google.co.kr -www.google.co.ls -www.google.co.ma -www.google.co.mz -www.google.co.nz -www.google.co.th -www.google.co.tz -www.google.co.ug -www.google.co.uk -www.google.co.uz -www.google.co.ve -www.google.co.vi -www.google.co.za -www.google.co.zm -www.google.co.zw -www.google.com -www.google.com.af -www.google.com.ag www.google.com.ai -www.google.com.ar -www.google.com.au -www.google.com.bd -www.google.com.bh -www.google.com.bn -www.google.com.bo -www.google.com.br -www.google.com.bz -www.google.com.co -www.google.com.cu -www.google.com.cy -www.google.com.do www.google.com.ec -www.google.com.eg -www.google.com.et -www.google.com.fj -www.google.com.gh -www.google.com.gi -www.google.com.gt -www.google.com.hk -www.google.com.jm -www.google.com.kh -www.google.com.kw -www.google.com.lb -www.google.com.ly -www.google.com.mm -www.google.com.mt -www.google.com.mx -www.google.com.my -www.google.com.na www.google.com.nf -www.google.com.ng -www.google.com.ni -www.google.com.np -www.google.com.om -www.google.com.pa -www.google.com.pe -www.google.com.pg -www.google.com.ph -www.google.com.pk -www.google.com.pr -www.google.com.py -www.google.com.qa -www.google.com.sa -www.google.com.sb -www.google.com.sg -www.google.com.sl -www.google.com.sv -www.google.com.tj -www.google.com.tr www.google.com.tw www.google.com.ua -www.google.com.uy -www.google.com.vc -www.google.com.vn -www.google.cv -www.google.cz -www.google.de -www.google.dj -www.google.dk -www.google.dm -www.google.dz -www.google.ee -www.google.es www.google.fi -www.google.fm -www.google.fr -www.google.ga -www.google.ge -www.google.gg -www.google.gl -www.google.gm -www.google.gp -www.google.gr www.google.gy www.google.hn -www.google.hr www.google.ht -www.google.hu -www.google.ie -www.google.im -www.google.iq www.google.is -www.google.it -www.google.je -www.google.jo -www.google.kg -www.google.ki -www.google.kz -www.google.la -www.google.li -www.google.lk -www.google.lt -www.google.lu -www.google.lv -www.google.md -www.google.me -www.google.mg -www.google.mk -www.google.ml -www.google.mn -www.google.ms www.google.mu -www.google.mv -www.google.mw -www.google.ne www.google.nl www.google.no -www.google.nr -www.google.nu -www.google.pl -www.google.pn -www.google.ps -www.google.pt -www.google.ro -www.google.rs -www.google.ru -www.google.rw -www.google.sc -www.google.se -www.google.sh -www.google.si -www.google.sk -www.google.sm www.google.sn -www.google.so -www.google.sr -www.google.st -www.google.td -www.google.tg -www.google.tk -www.google.tl -www.google.tm -www.google.tn -www.google.to -www.google.tt -www.google.vg -www.google.vu -www.google.ws youtu.be -youtube-nocookie.com -youtube.com -youtubeeducation.com -youtubegaming.com -yt.be -ytimg.com -1-800-goog-411.biz -1800goog411.com -1-800-goog-411.info -1800goog411.net -1800goog411.org -1-800-goog-411.org -1800google411.com -1800google411.net -1800google411.org -185materiasdeconstrucao.site -1877goog411.com -1877goog411.net -1877goog411.org -1877google411.com -1877google411.net -1877google411.org -1p0g00g1e.com -1p0g00gle.com -1p0g0og1e.com -1p0go0g1e.com -1p0goog1e.com -1p0google.com -1pog0og1e.com -1pogo0g1e.com -1pogoog1e.com -1pogoogle.com -1stopshoptravels.site -20googles.com -2cgloogle.com -2cgoggle.com -2cgoogle.com -2cgoolge.com -2cgooogle.com -30wks.com -3bromenswear.site -3ne3cellpoint.site -411-goog.com -411goog.com -411google.net -411-goog.net -411goog.net -411-goog.org -411goog.org -4estacoes.site -51pphone.com -520google.com -52google.com -7427466391.com -7800eventos.site -7emeio.site -7squarerealtors.site -8004664411.biz -8004664411.info -8004664411.net -8004664411.org -800goog411.biz -800goog411.com -800goog411.info -800goog411.net -800goog411.org -800google411.com -800google411.net -800google411.org -877goog411.com -877goog411.net -877goog411.org -877google411.com -877google411.net -877google411.org -a1chineesecentre.site -a2zeventskdr.site -a2zmanpowerconsultant.site -aacmedia.site -aadaranatv.site -aadharsudharcenter.site -aarambh7starproperties.site -aaraventerprises.site -aarchsol.site -aaronsautomotive.site -aashaboyshostel.site -aashirwaadmobiles.site -aashirwadmotors.site -aayushcomputerstypingins.site -abcaluminium.site -abcomputers.site -abdullahswimmingpool.site -abhigyanstudio.site -abhilashopticalsandeyecarecentre.site -abhisekmotors.site -abhisheknotecounter.site -abidcards.site -aboboramania.site -about-google.com -abracadabraartigosreligiosos.site -abstara.site -acaartesanato.site -academiabarboza.site -academiabodyarmour.site -academiabycorpo.site -academiadaspedrasmarmoresegranitos.site -academiaestacaofitnessaju.site -academiaevolutiongym.site -academiafly.site -academiahalternativa.site -academiamavagym.site -academiaperfectforms.site -academiapowerhouse.site -academiapowerlife.site -academicofcomputereducationpachrukhiyabihar.site -acaicia.site -acaidothiago.site -acaimaissabor.site -acaiornelas.site -acaisaborilhasolteira.site -acaiteriaecybercafe.site -acaiverygood.site -acaizaoicarai.site -acaragedabaianacici.site -accountingtaxservices.site -aceepostos.site -acemaapodi.site -acgdistribuidoradebebidaslida.site -achaktample.site -achoumoveis.site -acmespot.com -acmespot.net -acmespot.org -acmewave.com -acmewave.net -acmewave.org -acmtourstravels.site -acmtourstravelstravelagency.site -acmuraleedharanassociatescharteredaccountants.site -aconstrutorasgs.site -acouguedobeto.site -acouguemagrio.site -acportasejanelas.site -actorarmankhan.site -acubeacademy.site -acucaredrpgjdhav.site -adarshshop.site -adarshtraders.site -addmob.org -ad-gadget.com -ad-gadgets.com -adityaplastics.site -adityatradersetapalli.site -adityautsavvatika.site -adityaxeroxgeneralstores.site -admingoogle.com -adnoidmarket.com -adrianacoiffeur.site -adrianamoscatel.site -adriananevesartesa.site -adr-inc.biz -adr-inc.com -adsbygoogle.net -adsbygoogle.org -adsbygooogle.com -adsbygoooogle.com -adsbygooooogle.com -adsbygoooooogle.com -adscapemedia.info -adscapemedia.net -adsence4video.com -adsence.com -adsenceforvideo.com -adsence.info -adsens.com -adsense-adviser.com -adsense-adviser.net -adsense-adviser.org -adsense-advisor.com -adsense-advisor.net -adsense-advisor.org -adsensecustomsearchads.com -adsensecustomsearchads.net -adsensecustomsearchads.org -adsensedirect.com -adsenseforgooglemaps.com -adservice.google.com -firehunt.com -g.cn -google.com.lc -googleadapis.l.google.com -googleanalytics.com -googleblog.com -googlegroups.com -googletagservices.com -googletranslate.com -googleweblight.com -googlezip.net -gstatic.com -gstatic.org -gstaticadssl.l.google.com -gvt2.com -gvt3.com -id.google.com -igoogle.com -imasdk.googleapis.com -localhost.com -mail-ads.google.com -metric.gstatic.com -pki.google -plus.google.com -plus.l.google.com -plus.sandbox.google.com -plusone.google.com -safebrowsing.googleapis.com +youtube.nl diff --git a/slips_files/organizations_info/google_ip_ranges b/slips_files/organizations_info/google_ip_ranges new file mode 100644 index 000000000..c6d23ccf6 --- /dev/null +++ b/slips_files/organizations_info/google_ip_ranges @@ -0,0 +1,143 @@ +8.8.4.0/24 +8.8.8.0/24 +8.15.202.0/24 +8.34.208.0/20 +8.35.192.0/20 +8.230.128.0/17 +8.231.0.0/19 +8.232.0.0/14 +8.236.0.0/15 +23.236.48.0/20 +23.251.128.0/19 +34.0.228.0/22 +34.0.232.0/21 +34.1.64.0/18 +34.2.64.0/21 +34.2.72.0/22 +34.2.78.0/23 +34.2.80.0/20 +34.2.112.0/20 +34.3.0.0/23 +34.3.3.0/24 +34.3.4.0/24 +34.3.8.0/21 +34.3.16.0/20 +34.3.48.0/20 +34.3.64.0/21 +34.3.72.0/22 +34.3.112.0/20 +34.4.0.0/20 +34.4.20.0/22 +34.4.100.0/23 +34.4.112.0/20 +34.4.192.0/18 +34.5.0.0/16 +34.13.64.0/22 +34.13.80.0/20 +34.13.96.0/20 +34.14.224.0/19 +34.34.192.0/20 +34.34.208.0/21 +34.34.224.0/19 +34.43.0.0/16 +34.50.128.0/20 +34.52.0.0/17 +34.64.0.0/10 +34.128.0.0/10 +35.184.0.0/13 +35.192.0.0/11 +35.224.0.0/12 +35.240.0.0/13 +45.121.228.0/22 +64.15.112.0/20 +64.68.90.0/24 +64.233.160.0/19 +66.102.0.0/20 +66.249.64.0/19 +70.32.128.0/19 +72.14.192.0/18 +74.114.24.0/21 +74.125.0.0/16 +89.207.231.0/24 +103.62.64.0/22 +104.132.0.0/16 +104.133.0.0/17 +104.134.92.0/24 +104.134.128.0/17 +104.154.0.0/15 +104.196.0.0/14 +104.237.160.0/19 +107.167.160.0/19 +107.178.192.0/18 +108.59.80.0/20 +108.170.192.0/18 +108.177.0.0/17 +113.197.106.0/24 +130.211.0.0/16 +136.22.2.0/23 +136.22.4.0/23 +136.22.8.0/22 +136.22.64.0/23 +136.22.86.0/23 +136.22.160.0/20 +136.22.176.0/21 +136.22.184.0/23 +136.22.186.0/24 +136.23.48.0/20 +136.23.64.0/18 +136.64.0.0/11 +136.112.0.0/12 +142.250.0.0/15 +146.148.0.0/17 +162.120.128.0/17 +162.216.148.0/22 +162.222.176.0/21 +172.110.32.0/21 +172.217.0.0/16 +172.253.0.0/16 +173.194.0.0/16 +173.255.112.0/20 +185.25.28.0/23 +192.104.160.0/23 +192.158.28.0/22 +192.178.0.0/15 +193.186.4.0/24 +199.36.154.0/23 +199.36.156.0/23 +199.192.112.0/22 +199.223.232.0/21 +207.175.0.0/16 +207.223.160.0/20 +208.65.152.0/22 +208.68.108.0/22 +208.76.68.0/22 +208.81.188.0/22 +208.87.172.0/22 +208.117.224.0/19 +209.85.128.0/17 +216.58.192.0/19 +216.73.80.0/20 +216.239.32.0/19 +216.252.220.0/22 +2001:1900:2292::/48 +2001:4860::/32 +2401:fa00::/32 +2404:6800::/32 +2404:f340::/32 +2600:1900::/28 +2604:31c0::/32 +2605:ef80::/32 +2606:40::/32 +2606:73c0::/32 +2607:1c0:241:40::/60 +2607:1c0:300::/40 +2607:f8b0::/32 +2620:0:1000::/40 +2620:33:c000::/48 +2620:11a:a000::/40 +2620:120:e000::/40 +2620:15c::/36 +2800:3f0::/32 +2a00:1450::/32 +2a00:79e0::/31 +2c0f:fb50::/32 diff --git a/slips_files/organizations_info/microsoft b/slips_files/organizations_info/microsoft deleted file mode 100644 index f62db8ee1..000000000 --- a/slips_files/organizations_info/microsoft +++ /dev/null @@ -1,2619 +0,0 @@ -20.180.0.0/16 -13.96.0.0/13 -52.96.38.0/24 -20.37.64.0/19 -20.45.64.0/20 -20.45.80.0/24 -20.46.32.0/24 -40.66.166.0/24 -40.95.238.0/23 -40.107.142.0/23 -40.123.192.0/19 -40.126.192.0/23 -52.105.196.0/23 -52.96.0.0/14 -104.47.19.0/24 -20.45.128.0/20 -40.107.18.0/23 -40.95.86.0/23 -52.98.16.0/22 -102.133.0.0/18 -102.133.112.0/28 -102.133.120.0/21 -102.133.128.0/18 -102.133.192.0/19 -102.133.224.0/20 -102.133.240.0/25 -102.133.240.128/26 -102.133.248.0/21 -102.133.64.0/19 -102.133.96.0/20 -102.37.0.0/20 -102.37.128.0/19 -102.37.16.0/21 -102.37.160.0/21 -102.37.192.0/18 -102.37.24.0/23 -102.37.26.0/26 -102.37.32.0/19 -102.37.64.0/20 -102.37.80.0/21 -102.37.96.0/19 -103.25.156.0/24 -103.255.140.0/23 -103.36.96.0/24 -104.208.0.0/16 -104.209.0.0/18 -104.209.128.0/17 -104.209.64.0/19 -104.210.0.0/20 -104.210.128.0/19 -104.210.176.0/20 -104.210.192.0/19 -104.210.32.0/19 -104.210.64.0/18 -104.211.0.0/16 -104.212.67.0/24 -104.212.68.0/24 -104.214.0.0/15 -104.40.0.0/14 -104.44.128.0/18 -104.44.88.0/21 -104.45.0.0/16 -104.46.0.0/20 -104.46.160.0/19 -104.46.192.0/19 -104.46.224.0/20 -104.46.24.0/21 -104.46.32.0/19 -104.46.64.0/18 -104.47.0.0/17 -104.47.128.0/18 -104.47.200.0/21 -104.47.208.0/21 -104.47.216.64/26 -104.47.218.0/23 -104.47.220.0/22 -104.47.224.0/20 -111.221.28.0/22 -111.221.78.0/23 -111.221.80.0/20 -111.221.96.0/20 -13.104.129.0/24 -13.104.144.0/20 -13.104.192.0/21 -13.104.208.0/20 -13.104.248.32/27 -13.104.248.64/26 -13.104.252.208/28 -13.104.252.224/28 -13.104.253.48/28 -13.104.254.128/28 -13.105.100.0/23 -13.105.102.0/25 -13.105.14.0/24 -13.105.16.0/23 -13.105.18.0/25 -13.105.18.160/27 -13.105.18.192/26 -13.105.19.0/24 -13.105.20.0/22 -13.105.24.0/22 -13.105.28.0/26 -13.105.28.128/25 -13.105.29.0/24 -13.105.36.0/23 -13.105.52.0/23 -13.105.60.0/23 -13.105.66.0/23 -13.105.74.0/23 -13.105.96.0/22 -13.106.38.142/32 -13.106.38.148/32 -13.106.54.19/32 -13.106.54.3/32 -13.106.57.181/32 -13.106.57.196/31 -13.107.12.0/23 -13.107.128.0/19 -13.107.15.0/24 -13.107.16.0/24 -13.107.18.0/23 -13.107.208.0/24 -13.107.21.0/24 -13.107.213.0/24 -13.107.219.0/24 -13.107.22.0/24 -13.107.224.0/24 -13.107.226.0/23 -13.107.228.0/23 -13.107.231.0/24 -13.107.245.0/24 -13.107.246.0/24 -13.107.253.0/24 -13.107.254.0/23 -13.107.3.0/24 -13.107.37.0/24 -13.107.38.0/23 -13.107.4.0/22 -13.107.40.0/24 -13.107.42.0/23 -13.107.48.0/24 -13.107.50.0/24 -13.107.52.0/24 -13.107.54.0/24 -13.107.56.0/24 -13.107.64.0/18 -13.107.9.0/24 -13.64.0.0/13 -13.72.192.0/18 -13.72.64.0/18 -13.73.0.0/18 -13.73.128.0/18 -13.73.192.0/20 -13.73.224.0/19 -13.73.96.0/19 -13.74.0.0/15 -13.76.0.0/16 -13.77.0.0/17 -13.77.128.0/18 -13.77.192.0/19 -13.78.0.0/15 -13.80.0.0/14 -13.84.0.0/15 -13.86.0.0/16 -13.87.0.0/18 -13.87.120.0/22 -13.87.124.0/25 -13.87.124.128/29 -13.87.124.136/31 -13.87.124.144/28 -13.87.124.160/27 -13.87.124.192/27 -13.87.125.0/24 -13.87.126.0/24 -13.87.127.224/27 -13.87.128.0/17 -13.87.64.0/19 -13.88.0.0/17 -13.88.128.0/18 -13.88.200.0/21 -13.88.208.0/20 -13.88.224.0/19 -13.89.0.0/16 -13.90.0.0/15 -13.92.0.0/14 -131.253.12.0/29 -131.253.12.16/28 -131.253.12.160/28 -131.253.12.192/27 -131.253.12.224/29 -131.253.12.240/28 -131.253.12.40/29 -131.253.12.48/29 -131.253.12.80/28 -131.253.13.0/26 -131.253.13.104/30 -131.253.13.128/27 -131.253.13.72/29 -131.253.13.80/29 -131.253.13.88/30 -131.253.13.96/29 -131.253.14.128/26 -131.253.14.16/28 -131.253.14.192/29 -131.253.14.208/28 -131.253.14.224/28 -131.253.14.248/29 -131.253.14.32/27 -131.253.14.4/30 -131.253.14.8/31 -131.253.14.96/27 -131.253.15.16/28 -131.253.15.192/26 -131.253.15.32/27 -131.253.15.8/29 -131.253.21.0/24 -131.253.24.0/28 -131.253.24.160/27 -131.253.24.192/26 -131.253.25.0/24 -131.253.27.0/24 -131.253.3.0/24 -131.253.33.0/24 -131.253.34.224/27 -131.253.35.128/25 -131.253.36.128/26 -131.253.36.224/27 -131.253.38.0/26 -131.253.38.128/26 -131.253.38.224/27 -131.253.40.0/27 -131.253.40.128/27 -131.253.40.160/28 -131.253.40.192/26 -131.253.40.32/28 -131.253.40.64/26 -131.253.41.0/24 -132.245.230.0/23 -134.170.192.0/21 -134.170.220.0/23 -134.170.222.0/24 -134.170.80.64/28 -137.116.0.0/18 -137.116.112.0/20 -137.116.128.0/17 -137.116.64.0/19 -137.116.96.0/22 -137.117.0.0/16 -137.135.0.0/16 -138.91.0.0/16 -147.243.0.0/16 -150.171.32.0/19 -157.55.10.160/29 -157.55.10.176/28 -157.55.10.192/26 -157.55.103.128/25 -157.55.103.32/27 -157.55.106.0/26 -157.55.106.128/25 -157.55.107.0/24 -157.55.108.0/22 -157.55.11.128/25 -157.55.115.0/25 -157.55.12.128/26 -157.55.12.64/26 -157.55.13.128/26 -157.55.13.64/26 -157.55.136.0/21 -157.55.151.0/28 -157.55.153.224/28 -157.55.154.128/25 -157.55.160.0/19 -157.55.192.0/21 -157.55.2.128/26 -157.55.200.0/22 -157.55.204.1/32 -157.55.204.128/25 -157.55.204.2/31 -157.55.204.33/32 -157.55.204.34/31 -157.55.208.0/21 -157.55.24.0/21 -157.55.248.0/21 -157.55.3.0/24 -157.55.37.0/24 -157.55.38.0/23 -157.55.48.0/24 -157.55.50.0/25 -157.55.51.224/28 -157.55.55.0/27 -157.55.55.100/30 -157.55.55.104/29 -157.55.55.136/29 -157.55.55.144/28 -157.55.55.160/28 -157.55.55.176/29 -157.55.55.200/29 -157.55.55.216/29 -157.55.55.228/30 -157.55.55.232/29 -157.55.55.240/28 -157.55.55.32/28 -157.55.60.224/27 -157.55.64.0/20 -157.55.7.128/26 -157.55.8.144/28 -157.55.8.64/26 -157.55.80.0/21 -157.56.117.64/27 -157.56.160.0/21 -157.56.176.0/21 -157.56.19.224/27 -157.56.2.0/23 -157.56.21.160/27 -157.56.21.192/27 -157.56.216.0/26 -157.56.24.160/27 -157.56.24.192/28 -157.56.28.0/22 -157.56.8.0/21 -157.56.80.0/25 -168.61.0.0/17 -168.61.128.0/25 -168.61.128.128/28 -168.61.128.160/27 -168.61.128.192/26 -168.61.129.0/25 -168.61.129.128/26 -168.61.129.208/28 -168.61.129.224/27 -168.61.130.128/25 -168.61.130.64/26 -168.61.131.0/26 -168.61.131.128/25 -168.61.132.0/26 -168.61.136.0/21 -168.61.144.0/20 -168.61.160.0/19 -168.61.208.0/20 -168.62.0.0/16 -168.63.0.0/18 -168.63.128.0/24 -168.63.129.0/28 -168.63.129.128/25 -168.63.129.32/27 -168.63.129.64/26 -168.63.130.0/23 -168.63.132.0/22 -168.63.136.0/21 -168.63.148.0/22 -168.63.152.0/22 -168.63.156.0/24 -168.63.160.0/19 -168.63.192.0/18 -168.63.64.0/20 -168.63.80.0/21 -168.63.88.0/23 -168.63.90.0/24 -168.63.91.0/26 -168.63.92.0/22 -168.63.96.0/19 -191.232.16.0/21 -191.232.160.0/19 -191.232.192.0/18 -191.232.32.0/19 -191.232.64.0/20 -191.233.0.0/19 -191.233.128.0/17 -191.233.32.0/20 -191.233.48.0/21 -191.233.64.0/18 -191.234.128.0/17 -191.234.16.0/20 -191.234.2.0/23 -191.234.32.0/19 -191.235.128.0/18 -191.235.192.0/19 -191.235.224.0/20 -191.235.240.0/21 -191.235.248.0/23 -191.235.250.0/25 -191.235.255.0/24 -191.235.32.0/19 -191.235.64.0/18 -191.236.0.0/16 -191.237.0.0/17 -191.237.128.0/18 -191.237.192.0/22 -191.237.196.0/24 -191.237.200.0/21 -191.237.208.0/20 -191.237.224.0/21 -191.237.232.0/22 -191.237.236.0/24 -191.237.238.0/24 -191.237.240.0/23 -191.237.248.0/21 -191.238.0.0/18 -191.238.128.0/21 -191.238.144.0/20 -191.238.160.0/19 -191.238.192.0/18 -191.238.64.0/22 -191.238.68.0/24 -191.238.70.0/23 -191.238.72.0/21 -191.238.80.0/21 -191.238.88.0/22 -191.238.92.0/23 -191.238.96.0/19 -191.239.0.0/17 -191.239.160.0/19 -191.239.192.0/22 -191.239.200.0/21 -191.239.208.0/20 -191.239.224.0/19 -193.149.64.0/19 -198.180.97.0/24 -199.30.16.0/24 -199.30.18.0/23 -199.30.20.0/24 -199.30.22.0/24 -199.30.24.0/23 -199.30.27.0/25 -199.30.27.144/28 -199.30.27.160/27 -199.30.28.128/25 -199.30.28.64/26 -199.30.29.0/24 -199.30.31.0/25 -199.30.31.192/26 -20.100.0.0/17 -20.100.128.0/18 -20.101.0.0/16 -20.102.0.0/15 -20.104.0.0/14 -20.108.0.0/15 -20.110.0.0/16 -20.111.0.0/18 -20.112.0.0/17 -20.112.128.0/19 -20.112.160.0/20 -20.112.176.0/21 -20.112.192.0/18 -20.113.0.0/16 -20.114.0.0/15 -20.116.0.0/14 -20.120.0.0/14 -20.124.0.0/16 -20.125.0.0/17 -20.126.0.0/15 -20.135.0.0/17 -20.135.128.0/18 -20.135.192.0/19 -20.135.224.0/20 -20.135.240.0/25 -20.135.242.0/23 -20.135.244.0/22 -20.136.0.0/23 -20.136.2.0/24 -20.143.0.0/22 -20.143.4.0/24 -20.150.0.0/15 -20.157.0.0/20 -20.157.104.0/22 -20.157.108.0/24 -20.157.128.0/18 -20.157.16.0/22 -20.157.20.0/24 -20.157.32.0/19 -20.157.96.0/21 -20.184.0.0/15 -20.186.0.0/16 -20.187.0.0/17 -20.187.128.0/18 -20.187.192.0/21 -20.187.224.0/19 -20.188.0.0/14 -20.192.0.0/15 -20.194.0.0/18 -20.194.128.0/17 -20.194.64.0/20 -20.194.80.0/21 -20.194.96.0/19 -20.195.0.0/17 -20.195.128.0/22 -20.195.136.0/21 -20.195.144.0/20 -20.195.160.0/19 -20.195.192.0/18 -20.196.0.0/14 -20.200.0.0/16 -20.201.0.0/17 -20.201.128.0/21 -20.201.136.0/22 -20.201.140.0/23 -20.201.142.0/24 -20.201.223.0/24 -20.201.224.0/23 -20.201.231.0/24 -20.202.0.0/19 -20.202.100.0/22 -20.202.120.0/22 -20.202.124.0/24 -20.202.140.0/22 -20.202.144.0/22 -20.202.148.0/23 -20.202.32.0/20 -20.202.48.0/23 -20.202.52.0/22 -20.202.56.0/21 -20.202.64.0/23 -20.202.80.0/22 -20.203.0.0/18 -20.203.128.0/17 -20.203.64.0/20 -20.203.80.0/21 -20.203.96.0/20 -20.204.0.0/16 -20.205.0.0/18 -20.205.128.0/20 -20.205.160.0/19 -20.205.192.0/18 -20.205.64.0/20 -20.205.80.0/21 -20.205.96.0/19 -20.206.0.0/16 -20.207.0.0/17 -20.207.128.0/18 -20.208.0.0/17 -20.208.128.0/20 -20.209.0.0/16 -20.21.0.0/17 -20.21.128.0/20 -20.21.144.0/21 -20.210.0.0/15 -20.212.0.0/16 -20.213.0.0/17 -20.213.128.0/18 -20.214.0.0/17 -20.22.0.0/15 -20.24.0.0/17 -20.36.0.0/15 -20.38.0.0/20 -20.38.128.0/19 -20.38.16.0/24 -20.38.160.0/20 -20.38.184.0/21 -20.38.196.0/22 -20.38.200.0/22 -20.38.208.0/22 -20.38.32.0/20 -20.38.64.0/18 -20.39.0.0/16 -20.40.0.0/15 -20.42.0.0/17 -20.42.128.0/19 -20.42.160.0/23 -20.42.168.0/21 -20.42.176.0/20 -20.42.192.0/18 -20.43.0.0/16 -20.44.0.0/14 -20.48.0.0/17 -20.48.128.0/18 -20.48.192.0/20 -20.48.224.0/19 -20.49.0.0/16 -20.50.0.0/18 -20.50.128.0/17 -20.50.64.0/20 -20.50.80.0/21 -20.50.96.0/19 -20.51.0.0/16 -20.52.0.0/18 -20.52.128.0/17 -20.52.64.0/20 -20.52.80.0/26 -20.52.80.64/27 -20.52.88.0/21 -20.52.96.0/19 -20.53.0.0/19 -20.53.128.0/17 -20.53.32.0/28 -20.53.40.0/21 -20.53.48.0/20 -20.53.64.0/18 -20.54.0.0/15 -20.56.0.0/13 -20.64.0.0/12 -20.80.0.0/14 -20.84.0.0/15 -20.86.0.0/16 -20.87.0.0/17 -20.88.0.0/15 -20.90.0.0/16 -20.91.0.0/18 -20.91.128.0/17 -20.92.0.0/15 -20.94.0.0/16 -20.95.0.0/18 -20.95.128.0/21 -20.95.192.0/21 -20.95.255.0/29 -20.95.64.0/19 -20.96.0.0/14 -202.89.233.64/27 -202.89.233.96/28 -202.89.235.128/25 -204.152.18.0/31 -204.152.18.32/27 -204.152.18.64/26 -204.152.18.8/29 -204.152.19.0/24 -204.231.197.0/24 -204.79.180.0/24 -204.79.197.0/24 -207.46.126.0/24 -207.46.128.0/19 -207.46.13.0/24 -207.46.193.192/28 -207.46.193.224/27 -207.46.198.128/25 -207.46.200.176/28 -207.46.200.96/27 -207.46.202.128/28 -207.46.205.0/24 -207.46.224.0/20 -207.46.50.128/28 -207.46.59.64/27 -207.46.63.128/25 -207.46.63.64/27 -207.46.67.160/27 -207.46.67.192/27 -207.46.72.0/27 -207.46.77.224/28 -207.46.87.0/24 -207.46.89.16/28 -207.46.95.32/27 -207.68.174.184/29 -207.68.174.208/28 -207.68.174.40/29 -207.68.174.48/29 -207.68.174.8/29 -209.240.212.0/23 -213.199.128.0/20 -213.199.169.0/24 -213.199.180.192/27 -213.199.180.32/28 -213.199.180.96/27 -213.199.183.0/24 -23.100.0.0/16 -23.101.0.0/19 -23.101.112.0/20 -23.101.128.0/17 -23.101.32.0/21 -23.101.48.0/20 -23.101.64.0/20 -23.101.80.0/21 -23.102.0.0/16 -23.103.64.32/27 -23.103.64.64/27 -23.96.0.0/16 -23.97.112.0/25 -23.97.112.128/28 -23.97.112.160/27 -23.97.112.192/26 -23.97.116.0/22 -23.97.120.0/21 -23.97.128.0/17 -23.97.48.0/20 -23.97.64.0/19 -23.97.96.0/20 -23.98.128.0/17 -23.98.32.0/20 -23.98.48.0/21 -23.98.56.0/24 -23.98.57.64/26 -23.98.64.0/18 -23.99.0.0/16 -2602:fd5e:1:2::/64 -2602:fd5e:1::/63 -2603:1000:100::/47 -2603:1000:103::/48 -2603:1000:104::/47 -2603:1000:3::/48 -2603:1000:4::/47 -2603:1000::/47 -2603:1006:1400::/63 -2603:1006:1401::/63 -2603:1006:1500:4::/64 -2603:1006:1500::/64 -2603:1006:2000::/48 -2603:1007:200::/48 -2603:1010:100::/40 -2603:1010:200::/47 -2603:1010:202::/48 -2603:1010:204::/47 -2603:1010:206::/48 -2603:1010:300::/47 -2603:1010:303::/48 -2603:1010:304::/47 -2603:1010:400::/47 -2603:1010:403::/48 -2603:1010:404::/47 -2603:1010:5::/48 -2603:1010:6::/47 -2603:1010::/46 -2603:1016:1400::/48 -2603:1016:2400::/46 -2603:1016:2500:4::/64 -2603:1016:2500:8::/64 -2603:1016:2500::/64 -2603:1016:2500:c::/64 -2603:1017::/48 -2603:1020:1000::/47 -2603:1020:1003::/48 -2603:1020:1004::/47 -2603:1020:100::/47 -2603:1020:103::/48 -2603:1020:104::/48 -2603:1020:1100::/47 -2603:1020:1103::/48 -2603:1020:1104::/46 -2603:1020:1200::/47 -2603:1020:1301::/48 -2603:1020:200::/46 -2603:1020:205::/48 -2603:1020:206::/47 -2603:1020:2::/48 -2603:1020:300::/47 -2603:1020:302::/48 -2603:1020:304::/47 -2603:1020:400::/47 -2603:1020:402::/48 -2603:1020:404::/47 -2603:1020:4::/47 -2603:1020:500::/47 -2603:1020:503::/48 -2603:1020:504::/48 -2603:1020:600::/47 -2603:1020:602::/48 -2603:1020:604::/47 -2603:1020:606::/48 -2603:1020:6::/48 -2603:1020:700::/47 -2603:1020:702::/48 -2603:1020:704::/47 -2603:1020:706::/48 -2603:1020:800::/47 -2603:1020:802::/48 -2603:1020:804::/47 -2603:1020:806::/48 -2603:1020:900::/47 -2603:1020:902::/48 -2603:1020:904::/47 -2603:1020:906::/48 -2603:1020::/47 -2603:1020:a00::/47 -2603:1020:a03::/48 -2603:1020:a04::/47 -2603:1020:b00::/47 -2603:1020:b03::/48 -2603:1020:b04::/47 -2603:1020:c00::/47 -2603:1020:c03::/48 -2603:1020:c04::/47 -2603:1020:d00::/47 -2603:1020:d03::/48 -2603:1020:d04::/47 -2603:1020:e00::/47 -2603:1020:e03::/48 -2603:1020:e04::/47 -2603:1020:f00::/47 -2603:1020:f03::/48 -2603:1020:f04::/47 -2603:1026:2400::/44 -2603:1026:2410::/47 -2603:1026:2412::/48 -2603:1026:2500:10::/64 -2603:1026:2500:14::/64 -2603:1026:2500:18::/64 -2603:1026:2500:1c::/64 -2603:1026:2500:20::/64 -2603:1026:2500:24::/64 -2603:1026:2500:28::/64 -2603:1026:2500:2c::/64 -2603:1026:2500:30::/64 -2603:1026:2500:34::/64 -2603:1026:2500:38::/64 -2603:1026:2500:3c::/64 -2603:1026:2500:4::/64 -2603:1026:2500:8::/64 -2603:1026:2500::/64 -2603:1026:2500:c::/64 -2603:1026:3000::/48 -2603:1026:900::/62 -2603:1027:1::/48 -2603:1030:1000::/47 -2603:1030:1002::/48 -2603:1030:1004::/47 -2603:1030:1006::/48 -2603:1030:100:20::/62 -2603:1030:100::/59 -2603:1030:101::/48 -2603:1030:103::/48 -2603:1030:104::/46 -2603:1030:108::/47 -2603:1030:10::/47 -2603:1030:12::/48 -2603:1030:208::/46 -2603:1030:20c::/47 -2603:1030:20e::/48 -2603:1030:210::/47 -2603:1030:212::/56 -2603:1030:213::/48 -2603:1030:301::/48 -2603:1030:302::/47 -2603:1030:400::/48 -2603:1030:401:200::/57 -2603:1030:401:280::/58 -2603:1030:401:2c0::/62 -2603:1030:401:2c4::/63 -2603:1030:401:2c6::/64 -2603:1030:401::/55 -2603:1030:402::/47 -2603:1030:405::/48 -2603:1030:406::/47 -2603:1030:408::/47 -2603:1030:40a:8::/63 -2603:1030:40a::/61 -2603:1030:40b::/48 -2603:1030:40c::/48 -2603:1030:40d:4000::/50 -2603:1030:40d:8000::/49 -2603:1030:40d::/60 -2603:1030:40e::/55 -2603:1030:40f::/48 -2603:1030:410::/48 -2603:1030:500::/47 -2603:1030:503::/48 -2603:1030:504::/47 -2603:1030:600::/46 -2603:1030:604::/47 -2603:1030:607::/48 -2603:1030:608::/47 -2603:1030:800::/48 -2603:1030:802::/47 -2603:1030:804:100::/57 -2603:1030:804:180::/59 -2603:1030:804:1a0::/61 -2603:1030:804:1a8::/64 -2603:1030:804::/56 -2603:1030:805::/48 -2603:1030:806::/47 -2603:1030:809::/48 -2603:1030:80a::/56 -2603:1030:80b::/48 -2603:1030:80c::/48 -2603:1030:8::/48 -2603:1030:9:100::/57 -2603:1030:9:180::/58 -2603:1030:9:1c0::/59 -2603:1030:9:1e0::/61 -2603:1030:9:1e8::/62 -2603:1030:9:1ec::/63 -2603:1030:9:1ee::/64 -2603:1030:9::/56 -2603:1030::/45 -2603:1030:a00::/46 -2603:1030:a04::/48 -2603:1030:a06::/47 -2603:1030:a08::/48 -2603:1030:a09::/56 -2603:1030:a0a::/48 -2603:1030:a::/47 -2603:1030:b00::/47 -2603:1030:b03::/48 -2603:1030:b04::/47 -2603:1030:b06::/48 -2603:1030:c00::/48 -2603:1030:c02::/47 -2603:1030:c04::/46 -2603:1030:d00::/47 -2603:1030:d::/48 -2603:1030:e01:2::/64 -2603:1030:e::/47 -2603:1030:f00::/47 -2603:1030:f02::/48 -2603:1030:f04::/47 -2603:1030:f06::/48 -2603:1030:f07::/56 -2603:1030:f08::/48 -2603:1036:120d::/48 -2603:1036:2400::/44 -2603:1036:2500:10::/64 -2603:1036:2500:14::/64 -2603:1036:2500:18::/63 -2603:1036:2500:1c::/64 -2603:1036:2500:20::/64 -2603:1036:2500:24::/64 -2603:1036:2500:28::/64 -2603:1036:2500:2c::/64 -2603:1036:2500:30::/64 -2603:1036:2500:34::/64 -2603:1036:2500:38::/64 -2603:1036:2500:4::/64 -2603:1036:2500:8::/64 -2603:1036:2500::/64 -2603:1036:2500:c::/64 -2603:1036:3000::/48 -2603:1036:903::/62 -2603:1036:9ff:ffff::/64 -2603:1036:d20::/64 -2603:1037:1::/48 -2603:1039:205::/48 -2603:1040:1001::/48 -2603:1040:1002::/47 -2603:1040:1004::/48 -2603:1040:100::/46 -2603:1040:104::/48 -2603:1040:1100::/47 -2603:1040:1103::/48 -2603:1040:1104::/48 -2603:1040:200::/46 -2603:1040:204::/48 -2603:1040:206::/47 -2603:1040:208::/48 -2603:1040:2::/48 -2603:1040:400::/46 -2603:1040:404::/48 -2603:1040:406::/47 -2603:1040:408::/48 -2603:1040:4::/47 -2603:1040:600::/46 -2603:1040:605::/48 -2603:1040:606::/47 -2603:1040:6::/48 -2603:1040:800::/46 -2603:1040:805::/48 -2603:1040:806::/47 -2603:1040:900::/47 -2603:1040:903::/48 -2603:1040:904::/47 -2603:1040::/47 -2603:1040:a00::/46 -2603:1040:a05::/48 -2603:1040:a06::/47 -2603:1040:b00::/47 -2603:1040:b03::/48 -2603:1040:b04::/47 -2603:1040:c00::/46 -2603:1040:c05::/48 -2603:1040:c06::/47 -2603:1040:d00::/47 -2603:1040:d03::/48 -2603:1040:d04::/48 -2603:1040:e00::/47 -2603:1040:e02::/48 -2603:1040:e04::/47 -2603:1040:e06::/48 -2603:1040:f00::/47 -2603:1040:f02::/48 -2603:1040:f04::/47 -2603:1040:f06::/48 -2603:1046:1400::/45 -2603:1046:1408::/46 -2603:1046:1500:10::/64 -2603:1046:1500:14::/64 -2603:1046:1500:18::/64 -2603:1046:1500:1c::/64 -2603:1046:1500:20::/64 -2603:1046:1500:24::/64 -2603:1046:1500:28::/64 -2603:1046:1500:2c::/64 -2603:1046:1500:30::/64 -2603:1046:1500:34::/64 -2603:1046:1500:38::/64 -2603:1046:1500:3c::/64 -2603:1046:1500:40::/64 -2603:1046:1500:4::/64 -2603:1046:1500:8::/64 -2603:1046:1500::/64 -2603:1046:1500:c::/64 -2603:1046:2000::/48 -2603:1047:1::/48 -2603:1050:100::/40 -2603:1050:1::/48 -2603:1050:211::/48 -2603:1050:214::/48 -2603:1050:2::/47 -2603:1050:300::/40 -2603:1050:400::/48 -2603:1050:402::/47 -2603:1050:404::/48 -2603:1050:5::/48 -2603:1050:6::/47 -2603:1056:1400::/46 -2603:1056:1500:4::/64 -2603:1056:1500::/64 -2603:1056:1500:c::/64 -2603:1056:2000::/48 -2603:1057:2::/48 -2603:1061:1000::/46 -2603:1061:1004:10::/61 -2603:1061:1004:18::/64 -2603:1061:1004::/60 -2603:1062:2::/56 -2603:10e1:100:2::1435:5552/128 -2603:10e1:100:2::144c:f22d/128 -2603:10e1:100:2::14c3:6100/128 -2603:10e1:100:2::287d:67fb/128 -2603:10e1:100:2::3368:a5a2/128 -2603:10e1:100:2::348b:476/128 -2603:10e1:100:2::34bf:e4f5/128 -2620:1ec:12::/47 -2620:1ec:21::/48 -2620:1ec:22::/48 -2620:1ec:26:2::/64 -2620:1ec:26::/63 -2620:1ec:27::/48 -2620:1ec:28::/47 -2620:1ec:34::/48 -2620:1ec:39::/48 -2620:1ec:3e::/47 -2620:1ec:40::/45 -2620:1ec:48::/46 -2620:1ec:4::/46 -2620:1ec:8f0::/44 -2620:1ec:900::/44 -2620:1ec:a92::/48 -2620:1ec:a::/47 -2620:1ec:bdf::/48 -2620:1ec:c11::/48 -2620:1ec:c::/47 -2a01:111:2003::/48 -2a01:111:202c::/46 -2a01:111:2050::/44 -2a01:111:20a::/48 -2a01:111:f100:1000::/62 -2a01:111:f100:1004::/63 -2a01:111:f100:2000::/51 -2a01:111:f100:4002::/64 -2a01:111:f100:5000::/52 -2a01:111:f100:6000::/64 -2a01:111:f100:7000::6fdd:5343/128 -2a01:111:f100:7000::6fdd:5431/128 -2a01:111:f100:9001::1761:91e4/128 -2a01:111:f100:9001::1761:9323/128 -2a01:111:f100:9001::1761:958a/128 -2a01:111:f100:9001::1761:9696/128 -2a01:111:f100:a000::/63 -2a01:111:f100:a002::/64 -2a01:111:f100:a004::/64 -2a01:111:f307:1790::f001:7a5/128 -2a01:111:f307:1793::a61/128 -2a01:111:f307:1794::a01/128 -2a01:111:f307:1794::a21/128 -2a01:111:f330:1790::a01/128 -2a01:111:f330:1790::a41/128 -2a01:111:f330:1793::a21/128 -2a01:111:f335:1792::a01/128 -2a01:111:f335:1792::a61/128 -2a01:111:f335:1792::f001:7a5/128 -2a01:111:f403::/48 -40.101.0.0/23 -40.112.128.0/17 -40.112.36.0/23 -40.112.38.192/26 -40.112.39.0/25 -40.112.39.128/26 -40.112.48.0/20 -40.112.64.0/18 -40.113.0.0/16 -40.114.0.0/15 -40.116.0.0/15 -40.118.0.0/16 -40.119.0.0/18 -40.119.100.0/26 -40.119.100.112/29 -40.119.100.64/27 -40.119.100.96/28 -40.119.104.0/21 -40.119.112.0/20 -40.119.128.0/17 -40.119.64.0/19 -40.119.96.0/22 -40.120.0.0/17 -40.121.0.0/16 -40.122.0.0/16 -40.123.0.0/17 -40.123.128.0/21 -40.123.136.0/24 -40.123.140.0/22 -40.123.144.0/24 -40.123.145.0/25 -40.123.145.128/26 -40.123.145.192/28 -40.123.145.208/29 -40.123.145.216/30 -40.123.145.220/31 -40.123.148.0/26 -40.123.148.64/29 -40.123.148.72/31 -40.123.152.0/21 -40.123.160.0/22 -40.123.192.0/18 -40.124.0.0/16 -40.125.0.0/17 -40.126.0.0/18 -40.126.128.0/17 -40.127.0.0/19 -40.127.128.0/17 -40.127.32.0/24 -40.127.64.0/19 -40.127.96.0/20 -40.64.0.0/17 -40.64.128.0/21 -40.65.0.0/16 -40.66.120.0/21 -40.66.32.0/19 -40.67.0.0/16 -40.68.0.0/16 -40.69.0.0/17 -40.69.128.0/18 -40.69.192.0/19 -40.70.0.0/18 -40.70.128.0/17 -40.70.64.0/20 -40.70.80.0/21 -40.70.88.0/28 -40.71.0.0/16 -40.74.0.0/16 -40.75.0.0/19 -40.75.128.0/17 -40.75.32.0/21 -40.75.64.0/18 -40.76.0.0/16 -40.77.0.0/17 -40.77.128.0/21 -40.77.136.0/24 -40.77.137.0/25 -40.77.137.128/26 -40.77.137.192/27 -40.77.138.0/23 -40.77.160.0/22 -40.77.164.0/23 -40.77.166.0/25 -40.77.166.128/28 -40.77.166.160/27 -40.77.166.192/26 -40.77.167.0/24 -40.77.168.0/22 -40.77.172.0/23 -40.77.174.0/24 -40.77.175.0/25 -40.77.175.128/26 -40.77.175.192/27 -40.77.175.240/28 -40.77.176.0/20 -40.77.192.0/21 -40.77.200.0/23 -40.77.202.0/24 -40.77.224.0/21 -40.77.232.0/22 -40.77.236.0/26 -40.77.236.128/26 -40.77.236.192/28 -40.77.236.224/27 -40.77.236.80/28 -40.77.236.96/27 -40.77.237.0/24 -40.77.240.0/22 -40.77.244.0/25 -40.77.245.0/24 -40.77.246.0/23 -40.77.248.0/22 -40.77.252.0/23 -40.77.254.0/26 -40.77.254.128/25 -40.77.254.64/27 -40.77.255.0/24 -40.78.0.0/17 -40.78.128.0/18 -40.78.192.0/20 -40.78.208.0/27 -40.78.208.32/30 -40.78.208.48/28 -40.78.208.64/28 -40.78.209.0/24 -40.78.210.0/23 -40.78.212.0/22 -40.78.216.0/21 -40.78.224.0/19 -40.79.0.0/21 -40.79.128.0/18 -40.79.16.0/20 -40.79.192.0/19 -40.79.232.0/21 -40.79.240.0/20 -40.79.32.0/20 -40.79.48.0/27 -40.79.48.32/28 -40.79.49.0/24 -40.79.56.0/21 -40.79.64.0/20 -40.79.8.0/27 -40.79.8.32/28 -40.79.8.64/27 -40.79.8.96/28 -40.79.80.0/21 -40.79.88.0/27 -40.79.88.32/28 -40.79.89.0/24 -40.79.9.0/24 -40.79.90.0/24 -40.79.91.0/28 -40.79.92.0/24 -40.79.93.0/28 -40.79.94.0/24 -40.79.95.0/28 -40.79.96.0/19 -40.80.0.0/18 -40.80.144.0/20 -40.80.160.0/24 -40.80.168.0/21 -40.80.176.0/20 -40.80.192.0/18 -40.80.64.0/19 -40.80.96.0/20 -40.81.0.0/16 -40.82.0.0/21 -40.82.116.0/22 -40.82.120.0/22 -40.82.128.0/17 -40.82.16.0/20 -40.82.32.0/21 -40.82.44.0/22 -40.82.48.0/22 -40.82.60.0/22 -40.82.64.0/20 -40.82.80.0/21 -40.82.92.0/22 -40.82.96.0/21 -40.83.0.0/16 -40.84.0.0/15 -40.86.0.0/16 -40.87.0.0/17 -40.87.128.0/19 -40.87.160.0/20 -40.87.176.0/23 -40.87.178.0/24 -40.87.179.0/25 -40.87.179.128/31 -40.87.180.0/24 -40.87.181.0/25 -40.87.181.128/26 -40.87.181.192/29 -40.87.181.200/31 -40.87.182.0/23 -40.87.184.0/21 -40.87.192.0/19 -40.87.224.0/20 -40.88.0.0/15 -40.90.128.0/17 -40.90.16.0/20 -40.90.64.0/22 -40.90.68.0/24 -40.90.70.0/23 -40.91.0.0/21 -40.91.12.0/25 -40.91.12.128/28 -40.91.12.160/27 -40.91.12.208/28 -40.91.12.240/28 -40.91.13.0/28 -40.91.13.128/27 -40.91.13.240/28 -40.91.13.64/27 -40.91.13.96/28 -40.91.14.0/24 -40.91.16.0/20 -40.91.160.0/19 -40.91.192.0/18 -40.91.32.0/22 -40.91.64.0/18 -40.93.0.0/20 -40.93.128.0/23 -40.93.16.0/23 -40.93.192.0/20 -40.93.208.0/22 -40.93.212.0/23 -40.93.214.0/24 -40.93.64.0/23 -40.96.255.0/24 -40.96.46.0/24 -40.96.50.0/24 -40.96.52.0/24 -40.96.55.0/24 -40.96.61.0/24 -40.96.63.0/24 -51.103.0.0/17 -51.103.128.0/18 -51.103.192.0/26 -51.103.200.0/21 -51.103.208.0/20 -51.103.224.0/19 -51.104.0.0/15 -51.107.0.0/16 -51.11.0.0/16 -51.116.0.0/16 -51.12.0.0/18 -51.12.104.0/26 -51.12.112.0/20 -51.12.128.0/17 -51.12.64.0/19 -51.12.96.0/21 -51.120.0.0/16 -51.124.0.0/16 -51.13.0.0/21 -51.13.128.0/18 -51.13.16.0/20 -51.13.32.0/19 -51.13.64.0/18 -51.132.0.0/16 -51.136.0.0/15 -51.138.0.0/17 -51.138.128.0/19 -51.138.160.0/21 -51.138.192.0/19 -51.140.0.0/16 -51.141.0.0/17 -51.141.128.0/24 -51.141.129.128/25 -51.141.129.64/26 -51.141.130.0/25 -51.141.134.0/23 -51.141.136.0/22 -51.141.156.0/22 -51.141.160.0/19 -51.141.192.0/18 -51.142.0.0/16 -51.143.0.0/17 -51.143.128.0/18 -51.143.192.0/21 -51.143.200.0/28 -51.143.201.0/24 -51.143.208.0/20 -51.143.224.0/19 -51.144.0.0/15 -52.100.0.0/16 -52.101.0.0/18 -52.101.128.0/21 -52.101.136.0/23 -52.101.64.0/20 -52.101.80.0/22 -52.102.128.0/20 -52.102.158.0/23 -52.102.160.0/22 -52.102.192.0/23 -52.103.0.0/20 -52.103.128.0/22 -52.103.132.0/23 -52.103.134.0/24 -52.103.136.0/21 -52.103.16.0/23 -52.103.160.0/22 -52.103.192.0/23 -52.103.32.0/22 -52.103.64.0/23 -52.108.0.0/21 -52.108.112.0/23 -52.108.115.0/24 -52.108.116.0/23 -52.108.118.0/24 -52.108.121.0/24 -52.108.122.0/23 -52.108.124.0/22 -52.108.128.0/23 -52.108.130.0/24 -52.108.132.0/22 -52.108.136.0/22 -52.108.16.0/20 -52.108.165.0/24 -52.108.166.0/23 -52.108.168.0/21 -52.108.176.0/20 -52.108.192.0/18 -52.108.32.0/19 -52.108.68.0/22 -52.108.72.0/21 -52.108.80.0/20 -52.108.96.0/20 -52.109.0.0/17 -52.109.128.0/19 -52.109.160.0/22 -52.109.164.0/23 -52.111.192.0/20 -52.111.208.0/23 -52.111.210.0/24 -52.111.224.0/19 -52.112.104.0/21 -52.112.112.0/21 -52.112.120.0/23 -52.112.122.0/24 -52.112.14.0/23 -52.112.144.0/20 -52.112.168.0/21 -52.112.17.0/24 -52.112.176.0/21 -52.112.18.0/23 -52.112.184.0/22 -52.112.190.0/23 -52.112.197.0/24 -52.112.200.0/21 -52.112.212.0/22 -52.112.216.0/21 -52.112.229.0/24 -52.112.230.0/23 -52.112.232.0/23 -52.112.236.0/23 -52.112.238.0/24 -52.112.24.0/21 -52.112.240.0/20 -52.112.40.0/21 -52.112.48.0/20 -52.112.71.0/24 -52.112.76.0/22 -52.112.83.0/24 -52.112.88.0/22 -52.112.93.0/24 -52.112.94.0/23 -52.112.97.0/24 -52.112.98.0/23 -52.113.10.0/23 -52.113.128.0/22 -52.113.13.0/24 -52.113.132.0/23 -52.113.134.0/24 -52.113.136.0/21 -52.113.14.0/23 -52.113.144.0/20 -52.113.16.0/20 -52.113.160.0/19 -52.113.192.0/23 -52.113.198.0/23 -52.113.200.0/21 -52.113.208.0/20 -52.113.224.0/19 -52.113.37.0/24 -52.113.40.0/21 -52.113.48.0/20 -52.113.70.0/23 -52.113.72.0/21 -52.113.83.0/24 -52.113.87.0/24 -52.113.88.0/21 -52.113.9.0/24 -52.113.96.0/19 -52.114.0.0/19 -52.114.112.0/21 -52.114.120.0/22 -52.114.128.0/19 -52.114.160.0/20 -52.114.176.0/21 -52.114.184.0/22 -52.114.192.0/21 -52.114.200.0/22 -52.114.214.0/23 -52.114.216.0/22 -52.114.224.0/24 -52.114.226.0/24 -52.114.228.0/24 -52.114.230.0/23 -52.114.232.0/23 -52.114.234.0/24 -52.114.236.0/24 -52.114.238.0/24 -52.114.240.0/23 -52.114.242.0/24 -52.114.244.0/24 -52.114.248.0/21 -52.114.32.0/20 -52.114.48.0/21 -52.114.56.0/22 -52.114.60.0/23 -52.114.64.0/19 -52.114.96.0/20 -52.115.0.0/21 -52.115.112.0/23 -52.115.128.0/18 -52.115.16.0/21 -52.115.192.0/19 -52.115.24.0/22 -52.115.32.0/19 -52.115.64.0/20 -52.115.8.0/22 -52.115.80.0/21 -52.115.88.0/22 -52.115.92.0/23 -52.115.96.0/20 -52.120.0.0/16 -52.121.0.0/21 -52.121.128.0/19 -52.121.16.0/20 -52.121.160.0/22 -52.121.164.0/23 -52.121.168.0/21 -52.121.176.0/22 -52.121.180.0/23 -52.121.32.0/19 -52.121.64.0/18 -52.123.0.0/22 -52.123.4.0/23 -52.125.128.0/21 -52.125.136.0/22 -52.125.140.0/23 -52.136.0.0/13 -52.146.0.0/15 -52.148.0.0/14 -52.152.0.0/13 -52.160.0.0/14 -52.164.0.0/16 -52.165.0.0/19 -52.165.104.0/25 -52.165.104.128/26 -52.165.128.0/17 -52.165.32.0/20 -52.165.48.0/28 -52.165.49.0/24 -52.165.56.0/21 -52.165.64.0/19 -52.165.96.0/21 -52.166.0.0/15 -52.168.0.0/13 -52.176.0.0/17 -52.176.128.0/19 -52.176.160.0/21 -52.176.176.0/20 -52.176.192.0/19 -52.176.224.0/23 -52.176.232.0/21 -52.176.240.0/20 -52.177.0.0/16 -52.178.0.0/15 -52.180.0.0/17 -52.180.128.0/19 -52.180.160.0/20 -52.180.176.0/21 -52.180.184.0/27 -52.180.184.32/28 -52.180.185.0/24 -52.182.128.0/17 -52.183.0.0/16 -52.184.0.0/17 -52.184.128.0/19 -52.184.160.0/21 -52.184.168.0/27 -52.184.168.128/28 -52.184.168.32/28 -52.184.168.80/28 -52.184.168.96/27 -52.184.169.0/24 -52.184.170.0/24 -52.184.176.0/20 -52.184.192.0/18 -52.185.0.0/19 -52.185.112.0/25 -52.185.120.0/21 -52.185.128.0/17 -52.185.32.0/20 -52.185.48.0/21 -52.185.56.0/25 -52.185.56.128/27 -52.185.56.160/28 -52.185.64.0/19 -52.185.96.0/20 -52.186.0.0/15 -52.188.0.0/14 -52.224.0.0/16 -52.225.0.0/17 -52.225.128.0/21 -52.225.136.0/26 -52.225.136.64/28 -52.225.137.0/24 -52.225.144.0/20 -52.225.160.0/19 -52.225.192.0/18 -52.226.0.0/16 -52.228.0.0/14 -52.232.0.0/15 -52.234.0.0/16 -52.235.0.0/17 -52.236.0.0/15 -52.238.0.0/18 -52.238.192.0/18 -52.239.0.0/17 -52.239.128.0/20 -52.239.144.0/22 -52.239.148.0/27 -52.239.148.128/25 -52.239.148.64/26 -52.239.149.0/24 -52.239.150.0/23 -52.239.152.0/21 -52.239.160.0/22 -52.239.164.0/24 -52.239.165.0/26 -52.239.165.160/27 -52.239.165.192/26 -52.239.167.0/24 -52.239.168.0/21 -52.239.176.128/25 -52.239.177.0/24 -52.239.178.0/23 -52.239.180.0/22 -52.239.184.0/22 -52.239.188.0/23 -52.239.190.0/24 -52.239.191.0/28 -52.239.192.0/21 -52.239.200.0/22 -52.239.205.0/24 -52.239.206.0/23 -52.239.208.0/20 -52.239.224.0/19 -52.240.0.0/15 -52.242.0.0/16 -52.243.32.0/19 -52.243.64.0/18 -52.245.16.0/20 -52.245.32.0/21 -52.245.40.0/22 -52.245.44.0/23 -52.245.46.0/25 -52.245.46.128/28 -52.245.46.160/27 -52.245.46.192/26 -52.245.48.0/20 -52.245.64.0/22 -52.245.68.0/24 -52.245.69.0/26 -52.245.69.144/28 -52.245.69.160/27 -52.245.69.192/26 -52.245.69.64/27 -52.245.69.96/28 -52.245.70.0/23 -52.245.72.0/21 -52.245.8.0/21 -52.245.80.0/20 -52.245.96.0/19 -52.246.0.0/17 -52.246.128.0/20 -52.246.152.0/21 -52.246.160.0/19 -52.246.192.0/18 -52.247.0.0/17 -52.247.192.0/18 -52.248.0.0/16 -52.249.0.0/18 -52.249.128.0/17 -52.249.64.0/19 -52.250.0.0/16 -52.251.0.0/17 -52.252.0.0/16 -52.253.0.0/17 -52.253.128.0/20 -52.253.148.0/22 -52.253.152.0/21 -52.253.160.0/19 -52.253.192.0/19 -52.253.224.0/20 -52.254.0.0/15 -52.96.11.0/24 -53.103.135.0/24 -53.103.136.0/21 -64.4.54.0/24 -64.4.8.0/24 -65.52.0.0/19 -65.52.104.0/24 -65.52.106.0/24 -65.52.108.0/22 -65.52.112.0/20 -65.52.128.0/17 -65.52.32.0/21 -65.52.48.0/20 -65.52.64.0/20 -65.54.19.128/27 -65.54.55.160/27 -65.54.55.224/27 -65.55.105.0/26 -65.55.105.160/27 -65.55.105.192/26 -65.55.105.96/27 -65.55.106.0/26 -65.55.106.128/25 -65.55.106.64/27 -65.55.107.0/28 -65.55.107.48/28 -65.55.107.64/26 -65.55.108.0/23 -65.55.110.0/24 -65.55.120.0/24 -65.55.144.0/23 -65.55.146.0/24 -65.55.207.0/24 -65.55.209.0/24 -65.55.210.0/24 -65.55.211.0/26 -65.55.212.0/27 -65.55.212.128/25 -65.55.213.0/27 -65.55.213.128/26 -65.55.213.64/26 -65.55.217.0/24 -65.55.218.0/23 -65.55.250.0/24 -65.55.252.0/24 -65.55.32.128/28 -65.55.32.192/27 -65.55.32.224/28 -65.55.33.176/28 -65.55.33.192/28 -65.55.35.192/27 -65.55.44.128/27 -65.55.44.16/28 -65.55.44.32/27 -65.55.44.64/26 -65.55.44.8/29 -65.55.51.0/24 -65.55.60.176/28 -104.210.16.0/21 -13.105.18.128/27 -13.72.0.0/18 -13.72.128.0/18 -13.73.208.0/20 -13.73.64.0/19 -13.77.224.0/19 -20.140.0.0/20 -20.140.128.0/19 -20.140.16.0/21 -20.140.160.0/21 -20.140.168.0/24 -20.140.176.0/20 -20.140.192.0/19 -20.140.224.0/21 -20.140.232.0/23 -20.140.240.0/20 -20.140.32.0/19 -20.140.64.0/20 -20.140.80.0/23 -20.140.88.0/21 -20.140.96.0/19 -20.141.0.0/20 -20.141.128.0/17 -20.141.16.0/21 -20.141.32.0/19 -20.141.64.0/18 -20.34.32.0/20 -20.34.48.0/22 -20.34.52.0/23 -20.35.248.0/26 -20.35.248.128/27 -20.35.248.192/26 -20.35.248.64/27 -20.35.248.96/28 -2001:489a:2202:2000::/63 -2001:489a:2202::/60 -2001:489a:2206:10::/63 -2001:489a:2206:20::/63 -2001:489a:2206:30::/63 -2001:489a:2206:8000::/63 -2001:489a:2206:8010::/63 -2001:489a:2206::/63 -2001:489a:3000::/46 -2001:489a:3100::/46 -2001:489a:3108::/47 -2001:489a:3200::/46 -2001:489a:3204::/47 -2001:489a:3300::/46 -2001:489a:3304::/47 -2001:489a:3400::/46 -2001:489a:3404::/47 -2001:489a:3500::/50 -2001:489a:3600::/47 -2001:489a:3602::/48 -2001:489a:3604::/47 -2001:489a:3606::/48 -23.103.191.0/24 -23.103.199.0/24 -23.103.204.0/22 -23.103.208.0/22 -23.97.0.0/19 -23.97.32.0/20 -40.112.38.0/25 -40.112.38.128/26 -40.112.40.0/21 -40.66.0.128/25 -40.66.1.0/24 -40.66.2.0/23 -40.66.4.0/24 -52.108.64.0/22 -52.115.248.0/21 -52.126.0.0/17 -52.126.128.0/18 -52.126.192.0/24 -52.126.194.0/23 -52.126.196.0/22 -52.126.200.0/21 -52.126.208.0/22 -52.126.212.0/23 -52.126.216.0/21 -52.126.224.0/24 -52.126.232.0/24 -52.126.234.0/23 -52.126.236.0/23 -52.126.240.0/20 -52.127.0.0/18 -52.127.104.0/29 -52.127.108.0/22 -52.127.112.0/21 -52.127.128.0/17 -52.127.64.0/19 -52.127.96.0/21 -52.180.192.0/18 -52.181.0.0/16 -52.182.0.0/17 -52.227.0.0/16 -52.235.128.0/17 -52.238.128.0/18 -52.238.64.0/18 -52.239.166.0/24 -52.239.176.0/25 -52.243.0.0/19 -52.243.128.0/17 -52.244.0.0/16 -52.245.0.0/21 -52.245.128.0/20 -52.245.144.0/27 -52.245.152.0/21 -52.245.160.0/19 -52.245.192.0/18 -52.246.144.0/22 -52.247.128.0/18 -52.249.96.0/19 -2a01:4180:2000::/40 -2a01:4180:2400::/40 -2a01:4180:4050:400::/64 -2a01:4180:4050:800::/64 -2a01:4180:4051:400::/64 -2a01:4180:4051:800::/64 -2a01:4180:c001:8::/61 -2a01:4180:c003:8::/61 -51.18.0.0/20 -51.18.16.0/22 -51.18.24.0/21 -51.18.32.0/20 -51.4.128.0/17 -51.4.32.0/19 -51.4.72.0/24 -51.4.80.0/27 -51.4.84.0/24 -51.4.86.64/26 -51.5.128.0/17 -51.5.72.0/24 -51.5.80.0/27 -51.5.84.0/24 -51.5.87.0/25 -51.8.0.0/17 -51.8.128.0/20 -51.8.144.128/25 -51.8.144.64/26 -51.8.145.0/24 -51.8.146.0/24 -51.8.147.0/25 -51.8.148.0/22 -51.8.152.0/21 -51.8.160.0/19 -51.8.192.0/18 -52.108.119.0/24 -52.108.120.0/24 -103.9.10.0/24 -139.217.0.0/19 -139.217.128.0/19 -139.217.160.0/26 -139.217.160.128/28 -139.217.160.64/27 -139.217.161.0/24 -139.217.162.0/24 -139.217.168.0/21 -139.217.176.0/20 -139.217.192.0/20 -139.217.208.0/22 -139.217.216.0/21 -139.217.224.0/19 -139.217.32.0/24 -139.217.33.0/26 -139.217.40.0/21 -139.217.48.0/20 -139.217.64.0/18 -139.219.0.0/20 -139.219.128.0/20 -139.219.144.0/24 -139.219.145.0/27 -139.219.146.0/24 -139.219.147.0/26 -139.219.148.0/28 -139.219.155.0/24 -139.219.156.0/22 -139.219.16.0/27 -139.219.160.0/19 -139.219.17.0/24 -139.219.192.0/18 -139.219.20.0/28 -139.219.24.0/22 -139.219.32.0/19 -139.219.64.0/18 -159.27.0.0/17 -159.27.128.0/27 -159.27.128.32/28 -159.27.128.48/31 -159.27.132.0/26 -159.27.132.64/29 -159.27.132.72/30 -159.27.132.76/31 -159.27.144.0/20 -159.27.192.0/18 -163.228.0.0/17 -163.228.128.0/19 -2404:7940:100::/47 -2404:7940:200::/47 -2404:7940:203::/48 -2404:7940:300::/47 -2404:7940:3::/48 -2404:7940::/47 -2406:e500:2000::/64 -2406:e500:2001::/48 -2406:e500:2002::/47 -2406:e500:2004::/47 -2406:e500:2100::/123 -2406:e500:2101::/48 -2406:e500:2102::/47 -2406:e500:2104::/47 -2406:e500:2200::/46 -2406:e500:2300::/46 -2406:e500:2400::/46 -2406:e500:2500:8::/62 -2406:e500:2500::/61 -2406:e500:2500:c::/64 -2406:e500:2501:10::/61 -2406:e500:2501:18::/63 -2406:e500:2501:1a::/64 -2406:e500:2501::/60 -2406:e500:2600::/46 -2406:e500:4400::/40 -2406:e500:4800::/63 -2406:e500:4801::/63 -2406:e500:4804::/63 -2406:e500:4805::/63 -2406:e500:4900::/64 -2406:e500:5500::/48 -2406:e500:c020::/44 -2406:e500:c120::/44 -40.125.128.0/17 -40.126.64.0/20 -40.126.88.0/23 -40.126.96.0/19 -40.72.0.0/18 -40.72.112.0/21 -40.72.127.0/24 -40.72.128.0/24 -40.72.136.0/21 -40.72.144.0/20 -40.72.160.0/19 -40.72.192.0/22 -40.72.196.0/23 -40.72.198.0/24 -40.72.200.0/21 -40.72.208.0/20 -40.72.224.0/19 -40.72.64.0/22 -40.72.68.0/24 -40.72.72.0/21 -40.72.80.0/20 -40.72.96.0/20 -40.73.0.0/19 -40.73.136.0/21 -40.73.144.0/23 -40.73.146.0/24 -40.73.147.0/27 -40.73.148.0/25 -40.73.148.128/26 -40.73.152.0/21 -40.73.162.0/23 -40.73.168.0/21 -40.73.176.0/20 -40.73.224.0/19 -40.73.32.0/20 -40.73.48.0/21 -40.73.56.0/22 -40.73.60.0/28 -40.73.61.0/24 -40.73.62.0/23 -40.73.64.0/18 -42.159.0.0/25 -42.159.0.128/27 -42.159.0.160/29 -42.159.0.192/29 -42.159.128.72/29 -42.159.129.48/28 -42.159.129.96/28 -42.159.130.0/27 -42.159.130.144/28 -42.159.130.32/28 -42.159.130.48/29 -42.159.132.0/22 -42.159.136.0/22 -42.159.140.0/26 -42.159.141.0/24 -42.159.142.0/23 -42.159.144.0/20 -42.159.16.0/26 -42.159.161.192/27 -42.159.164.0/24 -42.159.17.0/24 -42.159.176.0/25 -42.159.18.0/23 -42.159.180.0/22 -42.159.184.0/22 -42.159.191.240/28 -42.159.192.0/20 -42.159.20.0/22 -42.159.208.0/25 -42.159.210.0/23 -42.159.212.0/22 -42.159.216.0/21 -42.159.224.0/19 -42.159.24.0/21 -42.159.33.192/27 -42.159.35.128/26 -42.159.36.0/24 -42.159.4.0/22 -42.159.48.0/25 -42.159.63.240/28 -42.159.64.0/18 -42.159.8.0/21 -52.130.0.0/19 -52.130.128.0/21 -52.130.140.0/23 -52.130.144.0/20 -52.130.160.0/19 -52.130.192.0/18 -52.130.32.0/22 -52.130.40.0/21 -52.130.48.0/20 -52.130.64.0/18 -52.131.0.0/21 -52.131.128.0/22 -52.131.144.0/20 -52.131.16.0/20 -52.131.192.0/21 -52.131.208.0/20 -52.131.224.0/19 -52.131.32.0/20 -52.131.64.0/18 -52.131.8.0/22 -70.37.0.0/21 -70.37.12.0/32 -70.37.16.0/20 -70.37.160.0/21 -70.37.32.0/19 -70.37.64.0/18 -70.37.8.0/22 -94.245.104.0/21 -94.245.117.96/27 -94.245.118.0/27 -94.245.120.128/28 -94.245.122.0/24 -94.245.123.144/28 -94.245.123.176/28 -94.245.88.0/21 -102.37.0.0/16 -128.94.0.0/16 -135.149.0.0/16 -138.239.0.0/16 -143.64.0.0/16 -147.145.0.0/16 -148.7.0.0/16 -155.62.0.0/16 -158.158.0.0/16 -167.105.0.0/16 -169.138.0.0/16 -170.165.0.0/16 -23.103.160.0/20 -40.104.0.0/15 -192.100.104.0/21 -192.100.112.0/21 -192.100.120.0/21 -192.100.128.0/22 -194.41.16.0/20 -20.135.0.0/16 -20.136.0.0/16 -20.143.0.0/16 -20.152.0.0/16 -20.153.0.0/16 -20.157.0.0/16 -20.158.0.0/15 -20.33.0.0/16 -102.37.0.0/17 -102.37.128.0/17 -208.68.136.0/21 -131.253.8.0/24 -131.253.1.0/24 -204.95.96.0/20 -168.61.0.0/16 -208.84.3.0/24 -204.79.252.0/24 -199.74.210.0/24 -206.191.224.0/19 -206.138.168.0/21 -192.197.157.0/24 -64.4.0.0/18 -51.51.0.0/16 -216.32.180.0/22 -198.206.164.0/24 -199.60.28.0/24 -23.103.128.0/17 -131.253.61.0/24 -213.199.128.0/18 -168.62.0.0/15 -51.10.0.0/15 -207.68.128.0/18 -23.96.0.0/14 -216.220.208.0/20 -193.221.113.0/24 -70.37.128.0/18 -13.64.0.0/11 -13.104.0.0/14 -131.253.6.0/24 -65.52.0.0/14 -192.84.159.0/24 -198.49.8.0/24 -131.253.5.0/24 -208.84.1.0/24 -131.253.24.0/21 -66.119.144.0/20 -51.140.0.0/14 -198.200.130.0/24 -204.152.140.0/23 -192.48.225.0/24 -199.242.32.0/20 -51.103.0.0/16 -202.89.224.0/21 -51.53.0.0/16 -23.100.0.0/15 -94.245.64.0/18 -209.240.192.0/19 -131.253.62.0/23 -51.12.0.0/15 -134.170.0.0/16 -131.253.12.0/22 -199.30.16.0/20 -199.242.48.0/21 -199.103.90.0/23 -191.232.0.0/13 -104.40.0.0/13 -104.208.0.0/13 -199.103.122.0/24 -104.146.128.0/17 -131.253.32.0/20 -132.245.0.0/16 -51.138.0.0/16 -23.103.64.0/18 -131.253.128.0/17 -40.64.0.0/15 -40.66.0.0/17 -40.68.0.0/14 -40.74.0.0/15 -40.76.0.0/14 -40.80.0.0/12 -40.104.0.0/14 -40.108.128.0/17 -40.110.0.0/15 -40.112.0.0/13 -40.120.0.0/14 -40.127.0.0/16 -72.144.0.0/14 -72.152.0.0/14 -74.160.0.0/14 -74.176.0.0/14 -74.224.0.0/14 -74.240.0.0/14 -98.64.0.0/14 -108.140.0.0/14 -68.18.0.0/15 -68.154.0.0/15 -68.210.0.0/15 -68.218.0.0/15 -68.220.0.0/15 -70.152.0.0/15 -70.156.0.0/15 -74.234.0.0/15 -74.248.0.0/15 -98.70.0.0/15 -20.46.192.0/19 -20.46.144.0/20 -40.120.0.0/20 -40.119.160.0/19 -70.37.0.0/17 -204.79.179.0/24 -207.46.40.0/21 -208.76.46.0/24 -13.107.14.0/24 -20.0.0.0/11 -207.46.128.0/17 -204.79.135.0/24 -207.46.0.0/19 -199.103.90.0/24 -207.46.36.0/22 -208.84.2.0/24 -207.46.48.0/20 -204.79.195.0/24 -208.76.45.0/24 -209.185.240.0/24 -209.185.240.0/23 -208.84.4.0/24 -208.84.0.0/24 -207.46.64.0/18 -52.96.0.0/12 -20.160.0.0/12 -52.125.0.0/16 -52.112.0.0/14 -111.221.64.0/18 -52.224.0.0/11 -150.171.0.0/24 -20.36.0.0/14 -52.160.0.0/11 -102.133.0.0/16 -20.184.0.0/13 -150.171.254.0/24 -52.120.0.0/14 -150.171.0.0/16 -20.40.0.0/13 -102.133.0.0/17 -102.133.128.0/17 -157.56.0.0/16 -20.192.0.0/10 -20.48.0.0/12 -20.64.0.0/10 -157.55.0.0/16 -40.96.0.0/13 -111.221.16.0/21 -111.221.24.0/22 -111.221.29.0/24 -111.221.30.0/23 -20.46.32.0/19 -137.116.0.0/16 -192.84.161.0/24 -192.84.160.0/24 -40.123.224.0/20 -204.140.80.0/24 -91.225.248.0/24 -198.180.95.0/24 -52.239.232.0/24 -185.236.124.0/24 -185.209.209.0/24 -4.128.0.0/12 -4.144.0.0/12 -4.160.0.0/12 -4.176.0.0/12 -4.192.0.0/12 -4.208.0.0/12 -4.224.0.0/12 -4.240.0.0/12 -20.74.128.0/17 -20.196.0.0/18 -20.203.0.0/17 -113.197.67.0/24 -20.45.64.0/19 -204.79.181.0/24 -40.72.255.0/24 -204.231.194.0/24 -91.225.249.0/24 -167.220.240.0/22 -167.220.240.0/23 -167.220.240.0/24 -167.220.241.0/24 -167.220.242.0/23 -167.220.242.0/24 -167.220.243.0/24 -111.221.64.0/19 -111.221.64.0/20 -111.221.64.0/21 -111.221.64.0/22 -111.221.64.0/23 -111.221.64.0/24 -111.221.65.0/24 -111.221.66.0/23 -111.221.66.0/24 -111.221.67.0/24 -111.221.68.0/22 -111.221.68.0/23 -111.221.68.0/24 -111.221.69.0/24 -111.221.70.0/23 -111.221.70.0/24 -111.221.71.0/24 -111.221.72.0/21 -111.221.72.0/22 -111.221.72.0/23 -111.221.72.0/24 -111.221.73.0/24 -111.221.74.0/23 -111.221.74.0/24 -111.221.75.0/24 -111.221.76.0/22 -111.221.76.0/23 -111.221.76.0/24 -111.221.77.0/24 -111.221.78.0/24 -111.221.79.0/24 -111.221.80.0/21 -111.221.80.0/22 -202.89.224.0/22 -111.221.80.0/23 -111.221.80.0/24 -202.89.224.0/23 -202.89.224.0/24 -111.221.81.0/24 -202.89.225.0/24 -111.221.82.0/23 -202.89.226.0/23 -111.221.82.0/24 -111.221.83.0/24 -111.221.84.0/22 -202.89.226.0/24 -202.89.227.0/24 -111.221.84.0/23 -111.221.84.0/24 -202.89.228.0/22 -111.221.85.0/24 -202.89.228.0/23 -111.221.86.0/23 -111.221.86.0/24 -111.221.87.0/24 -202.89.228.0/24 -111.221.88.0/21 -202.89.229.0/24 -202.89.230.0/23 -111.221.88.0/22 -202.89.230.0/24 -111.221.88.0/23 -111.221.88.0/24 -202.89.231.0/24 -111.221.89.0/24 -111.221.90.0/23 -111.221.90.0/24 -111.221.91.0/24 -111.221.92.0/22 -111.221.92.0/23 -111.221.92.0/24 -111.221.93.0/24 -111.221.94.0/23 -111.221.94.0/24 -111.221.95.0/24 -111.221.96.0/19 -111.221.96.0/21 -111.221.96.0/22 -111.221.96.0/23 -111.221.96.0/24 -111.221.97.0/24 -111.221.98.0/23 -111.221.98.0/24 -111.221.99.0/24 -111.221.100.0/22 -111.221.100.0/23 -111.221.100.0/24 -111.221.101.0/24 -111.221.102.0/23 -111.221.102.0/24 -111.221.103.0/24 -111.221.104.0/21 -111.221.104.0/22 -111.221.104.0/23 -111.221.104.0/24 -111.221.105.0/24 -111.221.106.0/23 -111.221.106.0/24 -111.221.107.0/24 -111.221.108.0/22 -111.221.108.0/23 -111.221.108.0/24 -111.221.109.0/24 -111.221.110.0/23 -111.221.110.0/24 -111.221.111.0/24 -111.221.112.0/20 -111.221.112.0/21 -111.221.112.0/22 -111.221.112.0/23 -111.221.112.0/24 -111.221.113.0/24 -111.221.114.0/23 -111.221.114.0/24 -111.221.115.0/24 -111.221.116.0/22 -111.221.116.0/23 -111.221.116.0/24 -111.221.117.0/24 -111.221.118.0/23 -111.221.118.0/24 -111.221.119.0/24 -111.221.120.0/21 -111.221.120.0/22 -111.221.120.0/23 -111.221.120.0/24 -111.221.121.0/24 -111.221.122.0/23 -111.221.122.0/24 -111.221.123.0/24 -111.221.124.0/22 -111.221.124.0/23 -111.221.124.0/24 -111.221.125.0/24 -111.221.126.0/23 -111.221.126.0/24 -111.221.127.0/24 -101.28.252.0/24 -103.9.8.0/22 -112.25.33.0/24 -115.231.150.0/24 -123.150.49.0/24 -123.235.32.0/24 -125.65.247.0/24 -139.217.115.121/32 -139.217.118.25/32 -139.217.118.46/32 -139.217.118.54/32 -139.217.17.219/32 -139.217.19.156/32 -139.217.21.3/32 -139.217.228.95/32 -139.217.231.198/32 -139.217.231.208/32 -139.217.231.219/32 -139.217.25.244/32 -139.219.132.56/32 -139.219.133.182/32 -168.63.252.62/32 -171.107.84.0/24 -171.111.154.0/24 -175.6.10.0/24 -180.210.229.0/24 -180.210.232.0/24 -180.210.234.0/24 -182.50.87.0/24 -209.177.86.0/24 -209.177.90.0/24 -209.177.94.0/24 -211.90.28.0/24 -222.161.226.0/24 -23.236.126.0/24 -2406:e500:4000:2::/63 -2406:e500:4101:2::/64 -2406:e500:4420::/43 -2406:e500:4440::/43 -40.73.129.0/24 -40.73.132.0/24 -40.73.161.0/24 -40.73.164.128/25 -40.73.165.0/26 -40.73.248.0/21 -42.159.132.138/32 -42.159.132.73/32 -42.159.132.74/31 -42.159.133.17/32 -42.159.135.78/32 -42.159.162.0/26 -42.159.162.64/27 -42.159.162.96/28 -42.159.163.128/25 -42.159.164.0/22 -42.159.224.122/32 -42.159.233.91/32 -42.159.237.146/32 -42.159.238.120/32 -42.159.34.0/26 -42.159.34.64/27 -42.159.34.96/28 -42.159.38.0/23 -42.159.4.200/32 -42.159.4.225/32 -42.159.4.45/32 -42.159.4.50/32 -42.159.4.68/32 -42.159.40.0/24 -42.159.7.13/32 -42.159.7.156/32 -42.159.87.106/32 -42.159.92.96/32 -52.130.17.192/27 -52.130.18.32/27 -52.130.2.32/27 -52.130.3.64/27 -58.68.168.0/24 -65.52.98.231/32 -65.55.227.140/32 -65.55.69.140/32 -70.37.81.47/32 -13.107.128.0/22 -13.107.136.0/22 -13.107.140.6/32 -13.107.18.10/31 -13.107.18.15/32 -13.107.6.152/31 -13.107.6.171/32 -131.253.33.215/32 -150.171.32.0/22 -150.171.40.0/22 -20.190.128.0/18 -204.79.197.215/32 -2603:1006:1400::/40 -2603:1006::/40 -2603:1010:200::c7/128 -2603:1010:2::cb/128 -2603:1016:2400::/40 -2603:1016::/36 -2603:1020:200::682f:a0fd/128 -2603:1020:201:9::c6/128 -2603:1020:600::a1/128 -2603:1020:700::a2/128 -2603:1020:800:2::6/128 -2603:1020:900::8/128 -2603:1026:2400::/40 -2603:1026::/36 -2603:1027::/47 -2603:1030:1000::21a/128 -2603:1030:7::749/128 -2603:1030:800:5::bfee:ad3c/128 -2603:1030:f00::17/128 -2603:1036:2400::/40 -2603:1036::/36 -2603:1037::/47 -2603:1040:200::4f3/128 -2603:1040:401::762/128 -2603:1040:601::60f/128 -2603:1040:a01::1e/128 -2603:1040:c01::28/128 -2603:1040:e00:1::2f/128 -2603:1040:f00::1f/128 -2603:1046:1400::/40 -2603:1046::/36 -2603:1047::/47 -2603:1050:1::cd/128 -2603:1056:1400::/40 -2603:1056::/36 -2603:1057::/48 -2620:1ec:40::/42 -2620:1ec:4::152/127 -2620:1ec:6::/48 -2620:1ec:8f0::/46 -2620:1ec:8f8::/46 -2620:1ec:8fc::6/128 -2620:1ec:900::/46 -2620:1ec:908::/46 -2620:1ec:a92::152/127 -2620:1ec:a92::171/128 -2620:1ec:c::10/127 -2620:1ec:c::15/128 -2620:1ec:d::10/127 -2a01:111:200a:a::/64 -2a01:111:2035:8::/64 -2a01:111:f100:2000::a83e:3019/128 -2a01:111:f100:2002::8975:2d79/128 -2a01:111:f100:2002::8975:2da8/128 -2a01:111:f100:7000::6fdd:6cd5/128 -2a01:111:f100:a004::bfeb:88cf/128 -2a01:111:f400::/48 -2a01:111:f402::/47 -2a01:111:f406:1004::/64 -2a01:111:f406:1805::/64 -2a01:111:f406:1::/64 -2a01:111:f406:3404::/64 -2a01:111:f406:8000::/64 -2a01:111:f406:8801::/64 -2a01:111:f406:a003::/64 -2a01:111:f406:c00::/64 -40.107.0.0/16 -40.92.0.0/15 -52.238.106.116/32 -52.238.119.141/32 -52.238.78.88/32 -52.244.160.207/32 -52.244.203.72/32 -52.244.207.172/32 -52.244.223.198/32 -52.244.37.168/32 -52.247.150.191/32 -2001:df0:d8::/48 -2001:df0:d9::/48 -2a01:111:f000::/36 -2a01:111:4004::/48 -2a01:111:4000::/36 -2a01:111:2000::/36 -2001:df0:d7::/48 -2603:1000::/25 -2620:1ec::/36 -2620:0:30::/45 -2001:df0:7::/48 -2001:67c:1021::/48 -2404:f800::/32 -2801:80:1d0::/48 -2a01:111::/32 -2603:1061:6::/48 -2404:f801:8030::/48 -2620:1ec:25::/48 -2620:1ec:9::/48 -2603:1062:1::/48 \ No newline at end of file diff --git a/slips_files/organizations_info/microsoft_asn b/slips_files/organizations_info/microsoft_asn index b121483c9..0ec21a215 100644 --- a/slips_files/organizations_info/microsoft_asn +++ b/slips_files/organizations_info/microsoft_asn @@ -1,31 +1,33 @@ -AS3598 -AS5761 -AS6182 -AS6291 -AS6584 -AS8068 -AS8069 -AS8070 -AS8071 -AS8072 -AS8073 -AS8074 -AS8075 AS12076 +AS132348 AS13399 +AS13811 AS14271 AS14719 +AS14783 +AS17144 +AS17345 AS20046 +AS200517 +AS22692 AS23468 +AS25796 +AS26222 +AS30135 +AS30520 +AS30575 +AS31792 +AS32476 AS35106 -AS45139 -AS52985 -AS58862 -AS59067 +AS3598 +AS36006 AS395496 AS395524 AS395851 AS396463 +AS397096 +AS397466 +AS397996 AS398575 AS398656 AS398657 @@ -33,39 +35,68 @@ AS398658 AS398659 AS398660 AS398661 -MICROSOFT-CORP-AS -MICROSOFT-CORP-MSN-AS-SATURN -MICROSOFT-CORP-MSN-AS-4 -MICROSOFT-CORP-MSN-AS -MICROSOFT-GP-AS -MICROSOFT-CORP-MSN-AS-BLOCK -MICROSOFT +AS398961 +AS400572 +AS400573 +AS400574 +AS400575 +AS400576 +AS400577 +AS400578 +AS400579 +AS400580 +AS400581 +AS400582 +AS40066 +AS400884 +AS45139 +AS46182 +AS52985 +AS54396 +AS5761 +AS58862 +AS59067 +AS6182 +AS6194 +AS6291 +AS63245 +AS63314 +AS6584 +AS8068 +AS8069 +AS8070 +AS8071 +AS8072 +AS8073 +AS8074 +AS8075 AZURE-MICROSOFT-PEERING -MICROSOFT-CORP-BCENTRAL -MICROSOFT-BOS -MICROSOFT-CORP-XBOX-ONLINE -MICROSOFT-LIVE-MEETING -MICROSOFT-AS-AP MCCL-CHN -MMAISNET +MICROSOFT +MICROSOFT-AS-AP +MICROSOFT-AZURE-DEDICATED +MICROSOFT-AZURE-ORBITAL +MICROSOFT-BOS +MICROSOFT-CORP-AS +MICROSOFT-CORP-AS-BLOCK-MSIT +MICROSOFT-CORP-AS-BLOCK-MSIT2 MICROSOFT-CORP-AS-BLOCK-MSIT3 MICROSOFT-CORP-AS-BLOCK-MSIT4 -MICROSOFT-CORP-AS-BLOCK-MSIT2 -MICROSOFT-CORP-AS-BLOCK-MSIT -MICROSOFT-CORP-MSN-AS-4 +MICROSOFT-CORP-BCENTRAL +MICROSOFT-CORP-MSN-AS MICROSOFT-CORP-MSN-AS-2 -MSFT -MICROSOFT-GP-AS +MICROSOFT-CORP-MSN-AS-4 +MICROSOFT-CORP-MSN-AS-BLOCK +MICROSOFT-CORP-MSN-AS-SATURN +MICROSOFT-CORP-XBOX-ONLINE MICROSOFTEU +MICROSOFT-GP-AS +MICROSOFT-LIVE-MEETING MICROSOFT-TECHED-AS-AP -MSLI -MICROSOFT-CORP-BCENTRAL -MICROSOFT-BOS -MICROSOFT-AZURE-ORBITAL -MICROSOFT-AZURE-DEDICATED -MICROSOFT-CORP-XBOX-ONLINE +MMAISNET MS-DANGER +MSFT MSFT-30135 MSFT-30575 MSFT-32476 -MICROSOFT-CORP-MSN-AS-SATURN +MSLI diff --git a/slips_files/organizations_info/microsoft_domains b/slips_files/organizations_info/microsoft_domains index 1c4bff913..788a0ff44 100644 --- a/slips_files/organizations_info/microsoft_domains +++ b/slips_files/organizations_info/microsoft_domains @@ -1,1253 +1,101 @@ -microsoft.com -aadrm.com +003-1-d.outlook.com +003-1-d.prod.outlook.com account.live.com -account.office.net accounts.accesscontrol.windows.net -accounts.google.com -acompli.net -activation.sls.microsoft.com activity.windows.com -ad.atdmt.com adl.windows.com -admin.microsoft.com -admin.onedrive.com -admin.sharepoint.com -adminwebservice.microsoftonline.com -ajax.aspnetcdn.com -aka.ms -api.dropboxapi.com -api.login.yahoo.com -api.meetup.com -api.passwordreset.microsoftonline.com -apis.live.net -app.adjust.com -app.box.com appex-rf.msn.com appex.bing.com -apps.identrust.com -appsforoffice.microsoft.com -aria.microsoft.com -assets-yammer.com -assets.onestore.ms -attachments.office.net -auth.gfx.ms -becws.microsoftonline.com -bit.ly -blob.core.windows.net -afx.ms -akadns.net -aspnetcdn.com -bing-exp.com -bing-int.com +azure.com +azure.net +azureedge.net bing.com -bing.net -ceipmsn.com -cloudapp.net -codeplex.com -discoverbing.com -files-df.1drv.com -files.1drv.com -firstpartyapps.oaspapps.com -getmicrosoftkey.com -gfx-int.ms -gfx.ms -healthvault-ppe.co.uk -healthvault-ppe.com -healthvault.co.uk -healthvault.com -hotmail-int.com -hotmail.com -live-int.com -live-int.net -live-partner.com -live-ppe.net -live.com -live.fi -live.net -livefilestore-int.com -livefilestore.com -livemeeting.com -lync.com -mesh.com -mgmt.live -microsoft-int.com -microsoft.com.au -microsoft.com.tr -microsoft.fr -microsoftonline-int.com -microsoftonline-p-int.com -microsoftonline-p.com -microsoftonline-p.net -microsoftonline.com -microsoftonline.net -microsoftprime.com -microsoftstore.com -microsoftstore.com.br -microsoftstore.com.cn -microsoftstore.com.hk -microsofttranslator.com -microsoftvirtualacademy.com -modern.ie -msads.net -msgamestudios.com -msn-int.com -msn.cn -msn.co.jp -msn.com -msn.com.cn -msocdn.com -office-int.com -office-int.net -office.com -office.net -office365.com -officeppe.com -officeppe.net -onenote.com -onenote.net -outlook.com -pfx.ms -redmond.corp.microsoft.com -s-microsoft.com -s-msft.com -s-msn.com -sfx-df.ms -sfx-int.ms -sfx.ms -sharepoint.com -sharepointonline.com -skype.com -skype.net -skypeassets.com -surface.com -syncxp.net -trouter.io -virtualearth.net -visualstudio.com -vo.msecnd.net -windows-int.net -windows.com -windows.net -windowsmedia.com -windowsphone-int.com -windowsphone-int.net -windowsphone.com -windowsphone.net -windowssearch.com -windowsstore.com -windowsupdate.com -wlxrs.com -xbox.com -xboxlive.com -zune.net -003-1-d.outlook.com -003-1-d.prod.outlook.com -azdns-migration-ns-validation.cn -cloudapp-int.net -cloudapp-preview.com -cloudapp-preview.net -clouddatahub.net -cloudwebappproxy.net -community-stage.skype.com -download.cortana.cn.bing.com -download.microsoft.com -hdinsightservices.net -homeserver.com -hotmail.co.uk -iespdytst -iespdytst.redmond.corp.microsoft.com -ieta-wa-24 -insidersurveys.windows.com -microsoftcrmportals.com -microsoftcrmportalstest.com -microsoftkonacompute.net -microsoftprojecttokyo.com -microsoftstream.com -msappproxy.net -o365apps.net -outlook-int.com -pbiwebcontent.com -pod71084-pri.outlook.com -pod71084.outlook.com -powerbi.com -powerusers-staging.microsoft.com -powerusers.microsoft.com -remotewebaccess.com -stage-o365apps.net -telecommand.telemetry.microsoft.com -vortex-sandbox.data.microsoft.com -vsallin.net -vsassets.io -watson.telemetry.microsoft.com -www.insidersurveys.windows.com -za.microsoftstore.com +blob.core.windows.net broadcast.skype.com -by.uservoice.com c.bing.com -c.bing.net c.live.com -c1.microsoft.com -cacerts.digicert.com cdn.odc.officeapps.live.com -cdn.office.net -cdn.onenote.net -cdn.optimizely.com cdn.uci.officeapps.live.com -cdnprod.myanalytics.microsoft.com -cert.int-x3.letsencrypt.org -cl2.apple.com -clientconfig.microsoftonline-p.net -companymanager.microsoftonline.com -compass-ssl.microsoft.com -compliance.microsoft.com -config.office.net -connect.facebook.net -contentstorage.osi.office.net +clicktoattend.ca +cloud.microsoft +codeguru.pl +community-stage.skype.com cortana.ai -crl.globalsign.com -crl.globalsign.net -crl.identrust.com -crl.microsoft.com -crl3.digicert.com -crl4.digicert.com -d.docs.live.net -data.flurry.com -dc.services.visualstudio.com -device.login.microsoftonline.com -dgps.support.microsoft.com +customvision.ai directory.services.live.com -docs.live.net -docs.microsoft.com -ecn.dev.virtualearth.net +download.cortana.cn.bing.com enterpriseregistration.windows.net -entrust.net -eus-www.sway-cdn.com -eus-www.sway-extensions.com -events.data.microsoft.com -excelbingmap.firstpartyapps.oaspapps.com -files.sharepoint.com -flow.microsoft.com g.live.com -geotrust.com -go.microsoft.com -graph.facebook.com -graph.microsoft.com +github.com graph.windows.net -helpshift.com hip.live.com -hockeyapp.net -insertmedia.bing.office.net -isrg.trustid.ocsp.identrust.com -itunes.apple.com +hotmail.com +insidersurveys.windows.com keydelivery.mediaservices.windows.net -localytics.com -log.optimizely.com -login-us.microsoftonline.com +linkedin.com +live.ca +live.com +live.fr login.live.com -login.microsoft.com -login.microsoftonline-p.com -login.microsoftonline.com -login.windows-ppe.net login.windows.net -logincert.microsoftonline.com -loginex.microsoftonline.com -m.facebook.com -mail.google.com +luis.ai mail.protection.outlook.com -manage.microsoft.com -mem.gfx.ms -microsoftusercontent.com +microsoft.ai +microsoft.ca +microsoft.com +microsoft.com.tw +microsoft.in +microsoft.is +microsoft.mu +microsoft.nl +microsoft.sn +microsoft.tw +microsoft.uz +microsoftpartnerevents.ca +microsoftstore.ca +microsoftstore.co.in mlccdn.blob.core.windows.net -msauth.net -msauthimages.net -mscrl.microsoft.com -msdn.microsoft.com -msecnd.net -msedge.net -msftauth.net -msftauthimages.net -msftidentity.com -msidentity.com -mstea.ms -myanalytics-gcc.microsoft.com -myanalytics.microsoft.com -myfiles.sharepoint.com -nexus.microsoftonline-p.com -o15.officeredir.microsoft.com -o365weve.com -ocos-office365-s2s.msedge.net -ocsp.digicert.com -ocsp.globalsign.com -ocsp.int-x3.letsencrypt.org -ocsp.msocsp.com -ocsp2.globalsign.com -ocspx.digicert.com +msdnbrasil.com.br +msn.ca +msn.co.in +msn.com +msn.com.tw +msn.nl +msnmobile.in +office.com office.live.com -office15client.microsoft.com +office365.com officeapps.live.com -officecdn.microsoft.com -officecdn.microsoft.com.edgesuite.net -officeclient.microsoft.com -officepreviewredir.microsoft.com -officeredir.microsoft.com officespeech.platform.bing.com -omniroot.com -oneclient.sfx.ms online.office.com -onmicrosoft.com +onnxruntime.ai +outlook.com outlook.office.com outlook.office365.com -outlook.uservoice.com -outlookmobile.com -partnerservices.getmicrosoftkey.com -passwordreset.microsoftonline.com -peoplegraph.firstpartyapps.oaspapps.com -phonefactor.net platform.linkedin.com -play.google.com -policykeyservice.dc.ad.msft.net -portal.cloudappsecurity.com -powerapps.com -prod.firstpartyapps.oaspapps.com.akadns.net -prod.msocdn.com +pod71084-pri.outlook.com +pod71084.outlook.com protection.office.com protection.outlook.com -provisioningapi.microsoftonline.com -public-trust.com -r.office.microsoft.com r1.res.office365.com r3.res.office365.com r4.res.office365.com -s.ytimg.com -search.production.apac.trafficmanager.net -search.production.emea.trafficmanager.net -search.production.us.trafficmanager.net -secure.globalsign.com -secure.meetup.com -secure.skypeassets.com -security.microsoft.com -sfbassets.com -shellprod.msocdn.com signup.live.com -skypeforbusiness.com +skype.com smtp.office365.com -social.yahooapis.com -spoprod-a.akamaihd.net ssw.live.com -staffhub.ms -staffhub.uservoice.com +static.microsoft storage.live.com streaming.mediaservices.windows.net -suite.office.net -support.content.office.net -support.microsoft.com -svc.ms -sway.com -symcb.com -symcd.com -teams.microsoft.com -technet.microsoft.com -telemetryservice.firstpartyapps.oaspapps.com -tenor.com -tse1.mm.bing.net +technetbrasil.com.br users.storage.live.com -verisign.com -verisign.net -videocontent.osi.office.net -videoplayercdn.osi.office.net -view.atdmt.com -wikipedia.firstpartyapps.oaspapps.com +videoindexer.ai +windows.ca +windows.com +windows.net wns.windows.com -workplaceanalytics.cdn.office.net -wus-firstpartyapps.oaspapps.com -wus-www.sway-cdn.com -wus-www.sway-extensions.com -www.acompli.com +wss.pl www.bing.com -www.digicert.com -www.dropbox.com -www.evernote.com -www.google-analytics.com -www.googleapis.com -www.microsoft.com +www.insidersurveys.windows.com www.outlook.com -www.sway.com -yammer.com -yammerusercontent.com -1drv.com -a-msedge.net -a1856.g2.akamai.net -accessvb.com -account.microsoft.com -accounts.microsoft.com -adcentercommunity.com -adecn.com -adnxs.com -advertise-test.bingads.microsoft.com -advertise.bingads.microsoft.com -advertising.microsoft.com -advisor.net -afdogw.com -agent.microsoft.com -ailogiq.com -alerts.microsoft.com -answers-test.microsoft.com -answers.microsoft.com -anti-spamtools.org -api.microsoft.com -applications.microsoft.com -apps.microsoft.com -appsource.microsoft.com -aquantive.com -asia.microsoft.com -atdmt.com -atlassolutions.com -audible.com -autodiscover.microsoft.com -axis.microsoft.com -bbsindex.com -bcentral-int.com -bcentral-ppe.com -bcentral.com -bcentral.net -be-legal.ru -beta.microsoft.com -betaoneservices.com -billing.microsoft.com -bingads.microsoft.com -binginternal.com -bizspark.microsoft.com -blogs.microsoft.com -blogs.msdn.microsoft.com -blogs.technet.microsoft.com -boost.microsoft.com -brktx.com -build.microsoft.com -business.microsoft.com -c-msedge.net -c.microsoft.com -c2.microsoft.com -careers.microsoft.com -catalog.imagine.microsoft.com -catalog.microsoft.com -cfsinsider.com -choice.microsoft.com -cinemania.com -cinemanow.com -clearlead.com -clearleadtest.com -cloudapp.aria.akadns.net -clouddrive.com -clownoutbreak.com -cmt.research.microsoft.com -cmt2.research.microsoft.com -cmt3.research.microsoft.com -code.microsoft.com -codecs.microsoft.com -codesnippet.research.microsoft.com -codezonepremiere.com -com.mk -com.tn -commerce.microsoft.com -communication.microsoft.com -community.microsoft.com -connect.microsoft.com -courttv.com -crmlive-int.com -crmlive-ppe.com -crmlive.net -crmliveperf.com -crmlivetie2.com -ctest.microsoft.com -customers.microsoft.com -customerstest.microsoft.com -datacontract.org -dc-msedge.net -deepmatrix.com -deepmetrix.com -demdex.com -demdex.net -demo.microsoft.com -demos.microsoft.com -design-intelligence.com -dev.microsoft.com -developer.microsoft.com -developers.microsoft.com -device.microsoft.com -devices.microsoft.com -devicesupport-test.microsoft.com -devicesupport.microsoft.com -digitalrivercontent.net -directory.microsoft.com -directtaps.net -dns.microsoft.com -dnset.com -do.com -download.com -downloadgamecenter.net -downloadgamecenter.org -downloadgamescenter.com -downloadgamescenter.net -downloadgamescenter.org -drmlicense.one.microsoft.com -dyanmicslive.com -dyanmicslive.net -dyanmicslive.org -dynamicdns.biz -dynamics-int.com -dynamics-partner.com -dynamics-ppe.com -dynamics-preview.com -dynamics-spla.com -dynamics.biz -dynamics.com -dynamics.eu -dynamics.info -dynamicscontinuum.biz -dynamicscontinuum.info -dynamicscsplus.biz -dynamicscustomer.biz -dynamicscustomer.info -dynamicsdesignlogo.biz -dynamicsdesignlogo.info -dynamicsemployee.biz -dynamicsemployee.info -dynamicsexpensereport.biz -dynamicsexpensereport.info -dynamicslive-int.com -dynamicslive-ppe.com -dynamicslive-ppe.net -dynamicslive-ppe.org -dynamicslive.com -dynamicsnetapps.biz -dynamicsnetapps.info -dynamicsnetseries.biz -dynamicsnetseries.info -dynamicsnettools.biz -dynamicsnettools.info -dynamicsonline-int.com -dynamicsonline-ppe.com -dynamicsonline-preview.com -dynamicsonline.com -dynamicsorder.biz -dynamicsorder.info -dynamicsservicecenter.biz -dynamicsservicecenter.info -dynamicssite-int.com -dynamicssite-ppe.com -dynamicssite-preview.com -dynamicstimecard.biz -dynamicstimecard.info -dynamicsvendor.biz -dynamicsvendor.info -dynamicsview.biz -dynamicsview.info -dynssl.com -e-typedesign.co.uk -e.microsoft.com -earn.microsoft.com -edgesuite.net -education.microsoft.com -effectivemeasure.net -email.microsoft.com -email01.microsoft.com -email3.microsoft.com -emodio.com -entelechargement.com -enterprise.microsoft.com -erplive.com -esb.microsoft.com -eso.com -eugrantsadvisor.com -eugrantsadvisor.name -eugrantsadvisor.net -eugrantsadvisor.org -events.microsoft.com -example.microsoft.com -exchange.microsoft.com -exchangeyourcareer.com -exchangeyourcareer.net -exchangeyourcareer.org -exec.microsoft.com -expedia.com -expediapartner.com -expediapartners.com -expertzone.microsoft.com -explore.ms -facultyconnection.com -farolatino.com -fasttrack.microsoft.com -fedtest-int.com -fedtest.com -feeds.microsoft.com -flows.microsoft.com -flurry.com -footprintpredict.com -forms.microsoft.com -forums.microsoft.com -freepowerpoint.com -ftp.microsoft.com -fullaudio.com -fuse.microsoft.com -futuredecoded.microsoft.com -futurefed.com -g.microsoft.com -g3.microsoft.com -gallery.microsoft.com -games.microsoft.com -gateway.microsoft.com -getofficelive.co.za -go2.microsoft.com -gotyoursoul.com -gowindowslive.com -gowindowslive.net -gowindowslive.org -hardware-update.com -healthvolt.net -help.bing.microsoft.com -help.bingads.microsoft.com -home.microsoft.com -homeadvisor.com -i.microsoft.com -i2.microsoft.com -i3.microsoft.com -i4.microsoft.com -ia.microsoft.com -ia2.microsoft.com -ic-live.com -id.microsoft.com -ideawins-ppe.com -iechannelguide.com -iechannels.com -iegallery.com -ignite.microsoft.com -ilovemessenger.com -imagine-live.com -imagine-windowslive.com.br -imagine-wl.com.br -img-prod-cms-rt-microsoft-com.akamaized.net -img.microsoft.com -info.microsoft.com -info1.microsoft.com -innovateon-int.com -innovateonmicrosoftofficelive.com -innovateonofficelive.com -innovateonwindowshpcserver.com -innovateonwindowshpcserver2008.com -input.microsoft.com -installshield.com -intellitxt.com -iwsolve.partners.extranet.microsoft.com -java.microsoft.com -jimboiscool.trt -join.microsoft.com -licencje-microsoft.pl -licencjemicrosoft.eu -licensestore.jp -licensing.microsoft.com -listbot.com -live-func.net -live-ppe.com -live-str.com -live-tst.com -live-tst.net -live.ca -live.com.akadns.net -live.it -live365.com -liveatedu-ppe.com -liveatedu.com -liveexposupport.com -livenet.akadns.net -liveportal.com -livesearch.com.br -livestats.com -livestats.net -login.msa.akadns6.net -m.microsoft.com -m1-msedge.net -macrosoft.com.br -macrovision.com -mactopia.net -madingleymodel.com -madingleymodel.org -mail.microsoft.com -mail1.microsoft.com -mail2.microsoft.com -mail3.microsoft.com -mail4.microsoft.com -mail5.microsoft.com -marketing.microsoft.com -mbs.microsoft.com -mbs2.microsoft.com -mbs3.microsoft.com -mbsmobile.microsoft.com -mcp.microsoft.com -me.microsoft.com -member.microsoft.com -members.microsoft.com -mesh-int.com -mesh-ri.com -messenger.microsoft.com -messengerentucelu.com -mfncpfs.com -mgsindiegames.net -mgsindiegames.org -micronewsads.com -microsfot.com -microsft.akadns.net -microsft.com -microsft.com.akadns.net -microsft.com.br -microsft.net -microsoft-antipiracy.com -microsoft-appstore.com -microsoft-b.com -microsoft-bg.com -microsoft-careers.com -microsoft-certification.co.uk -microsoft-cortana.com -microsoft-entertainment-jobs.com -microsoft-hohm.com -microsoft-jdp.net -microsoft-news.com -microsoft-office-2010.com -microsoft-office-excel.com -microsoft-office.fr -microsoft-online-sales.com -microsoft-ppe.com -microsoft-press.com -microsoft-questions.com -microsoft-store-careers.com -microsoft-store-promo-code.com -microsoft-tst.com -microsoft.ae -microsoft.af -microsoft.ag -microsoft.ai -microsoft.akadns.net -microsoft.al -microsoft.am -microsoft.as -microsoft.at -microsoft.az -microsoft.ba -microsoft.be -microsoft.bi -microsoft.biz -microsoft.bs -microsoft.by -microsoft.bz -microsoft.ca -microsoft.cc -microsoft.cd -microsoft.ch -microsoft.cl -microsoft.cm -microsoft.cn -microsoft.co -microsoft.co.il -microsoft.co.uk -microsoft.com-c-3.edgekey.net.globalredir.akadns.net -microsoft.com.akadns.net -microsoft.com.ar -microsoft.com.br -microsoft.com.c.footprint.net -microsoft.com.edgesuite.net -microsoft.com.tw -microsoft.com.unistore.akadns.net -microsoft.cr -microsoft.cx -microsoft.cz -microsoft.de -microsoft.dj -microsoft.dk -microsoft.dm -microsoft.do -microsoft.ec -microsoft.ee -microsoft.es -microsoft.fi -microsoft.fm -microsoft.ge -microsoft.gg -microsoft.gl -microsoft.gm -microsoft.gp -microsoft.gr -microsoft.gs -microsoft.gt -microsoft.gy -microsoft.hn -microsoft.hr -microsoft.hu -microsoft.ie -microsoft.im -microsoft.in -microsoft.info -microsoft.io -microsoft.is -microsoft.it -microsoft.je -microsoft.jo -microsoft.jp -microsoft.kg -microsoft.kn -microsoft.kz -microsoft.la -microsoft.lc -microsoft.li -microsoft.lk -microsoft.lt -microsoft.lu -microsoft.lv -microsoft.ly -microsoft.ma -microsoft.md -microsoft.mn -microsoft.mp -microsoft.ms -microsoft.mu -microsoft.mv -microsoft.mw -microsoft.mx -microsoft.my -microsoft.net -microsoft.nf -microsoft.nl -microsoft.no -microsoft.org -microsoft.pa -microsoft.pe -microsoft.ph -microsoft.pk -microsoft.pl -microsoft.pn -microsoft.pr -microsoft.pt -microsoft.pw -microsoft.re -microsoft.ro -microsoft.ru -microsoft.rw -microsoft.sc -microsoft.se -microsoft.si -microsoft.sk -microsoft.sl -microsoft.sm -microsoft.sn -microsoft.so -microsoft.sr -microsoft.su -microsoft.sy -microsoft.tj -microsoft.tk -microsoft.tm -microsoft.tn -microsoft.tt -microsoft.tv -microsoft.tw -microsoft.ua -microsoft.ug -microsoft.uz -microsoft.vc -microsoft.vn -microsoft.ws -microsoftadvertising.com -microsoftauto.com.br -microsoftbiconference.com -microsoftbicustomercouncil.com -microsoftbusinesshub.com -microsoftc.com.br -microsoftclassifiedads.com -microsoftcloudpartner.com -microsoftcourseware.com -microsoftcourseware.net -microsoftcourseware.org -microsoftdynamicserp.biz -microsoftdynamicslive-int.com -microsoftdynamicslive-ppe.com -microsoftdynamicslive.com -microsoftdynamicslive.net -microsoftdynamicslive.org -microsofteai.com.br -microsoftelearning.com -microsoftencarta.net -microsoftencarta.org -microsoftequipt.com -microsofter.com.br -microsoftexpo.com -microsoftexpo.net -microsoftexpo.org -microsoftforefront.org -microsoftfrontpage.com -microsofthealthbeta.com -microsofthealthsolutions.com -microsofthotmail.com.br -microsofthyper-v.com.br -microsofthyper-vserver.com.br -microsoftinformatica.com.br -microsoftitacademy.com -microsoftlawportal.net -microsoftlicense.com -microsoftlicensereview.com -microsoftlicensestatement.com -microsoftlive.com.br -microsoftlivelabs.com.br -microsoftmediaroom.de -microsoftoffice.com -microsoftoffice365now.com -microsoftphotosynth.com.br -microsoftplayfx.com.br -microsoftportal.net -microsoftstore.it -microsoftstore.me -microsoftsupplychain.com -microsoftsurface.com.br -microsofttemplates.com -microsofttemplates.org -microsofttouch.fr -microsoftupdate.com -microsoftupdates.eu -microsoftvolumelicensing.com -microsoftwildcat.com -microsoftword.com.br -micrososft.com -micrsoftsmartcar.co.uk -mikrosoft.tv -military.microsoft.com -mixplay.tv -mobile.microsoft.com -mobilebeta.microsoft.com -mobileconfig.net -mobilepcpartners.com -moneycentral.com -moonport.com -movielink.com -mran.microsoft.com -ms-courseware.com -ms-courseware.net -ms-courseware.org -ms.akadns.net -ms.co.nz -msbpn.com -mscourseware.com -mscourseware.net -mscoursewareonline.com -mscoursewareonline.net -mscoursewareonline.org -mscrm.com -msdn.com -msdn1.microsoft.com -msdn2.microsoft.com -msdnevents.com -msdnlive.com -msecn.net -msecnd.com -msedulabs.com -msencarta.net -mseventseurope.com -msfdc.com -msft.com -msft.net -msftconnecttest.com -msftncsi.com -msftncsi.com.edgesuite.net -msftoffers.com -msftsrvcs.vo.llnwd.net -msftsrvcs.vo.llnwi.net -msgamebetas.com -msgamedev.com -msgames.net -msgamesinsider.com -msinsider.com -mslearning.com -mslit.com -mslivelabs-int.com -msmecrm.com -msn-ppe.com -msn.be -msn.ca -msn.ch -msn.co.id -msn.co.kr -msn.co.th -msn.co.uk -msn.com.akadns.net -msn.com.hk -msn.com.my -msn.com.ph -msn.com.sg -msn.com.tw -msn.de -msn.es -msn.fr -msn.la -msn.mm -msn.net -msn.nl -msn.se -msncompanion.com -msnencarta.com -msnexpo.com -msngamecenter.net -msngamecenter.org -msngamescenter.net -msngamescenter.org -msnmessenger.com -msnmobile.in -msnupdate.bz -msnusers.com -msocsp.com -mspchealth.com -msretech.com -mssandbox.com -msstudentlounge.com -msstudiosmedia.com -msteams.com -mswep.com -mswindows-update.com -mswindowsupdates.com -mtcdemos.net -musicgiants.com -musicmatch.com -musicnet.com -mva.microsoft.com -mvp.microsoft.com -my.microsoft.com -myapps.microsoft.com -myignite.microsoft.com -mywindowsmobile.co.uk -mywindowsmobile.com -mywindowsmobile.de -napster.com -natick.research.microsoft.com -navegaprotegido.org -navison.com -netgamesusa.com -netmeetingtools.com -news.microsoft.com -nflfeverinsider.com -nflfeverinsider.org -ngworldstats.com -no-ip.biz -novadose.net -nsatc.net -nuevomessenger2009.com -o365filtering.com -oaspapps.com -oberon-media.com -ocs.microsoft.com -ocsp.microsoft.com -od2.com -office -office.microsoft.com -office2010test.com -officecdn-microsoft-com.akamaized.net -officeformac.com -officelive.com -officelive.com.tw -officelive.mp -officelivecontent.com -omtrdc.net -onestore.ms -online.microsoft.com -osdinfra.net -owa.microsoft.com -parlano.com -partner.microsoft.com -partnermarketplace.com -passalong.com -passport.net -payment.microsoft.com -payplay.fm -phx.gbl -planningservices.partners.extranet.microsoft.com -playmsn.com -playout.se -poptang.com -powerapps.microsoft.com -powerbi.microsoft.com -premier.microsoft.com -privacy.microsoft.com -profile.microsoft.com -projectzerofriction.com -projectzerofriction.net -projectzerofriction.org -public.microsoft.com -puretracks.com -rdg.microsoft.com -rdst-internal.net -realtydesktop.net -referencesource.microsoft.com -referencesourcetest.microsoft.com -reflex.microsoft.com -register.microsoft.com -remote.microsoft.com -research.microsoft.com -riseofnationsinsider.com -rss.microsoft.com -rto.microsoft.com -s.microsoft.com -s2bprogram.com -sample.microsoft.com -sbp-int.com -schwancosmetics.cz -sclive-ppe.net -scroogled.com -search.microsoft.com -searchalliance.com -searchperks.com -secure.bingads.microsoft.com -sensormap.org -sertifikasi-microsoft.com -serving-sys.com -sharedview.com -shop.microsoft.com -sip.microsoft.com -skype-dns.akadns.net -skype-edf.akadns.net -skype-registar.akadns.net -skype.edf.akadns.net -skypeassets.net -skypedata.akadns.net -skyprod.akadns.net -smartpartnermarketing.microsoft.com -smtp.microsoft.com -social.microsoft.com -software.net -softwarewow.com -soundbuzz.com -soundsgood.com -source.microsoft.com -spohealth.com -sqlserverenergy.com -start.com -startwindowsmobile.com -stationq.com -store.microsoft.com -stores.microsoft.com -subscribenet.com -support-test.microsoft.com -support2.microsoft.com -survey.microsoft.com -taskmarket.com -technet2.microsoft.com -testconnectivity.microsoft.com -toolup.com -trafficmanager.net -training.microsoft.com -trymicrosoftoffice.com -ts.microsoft.com -update.microsoft.com -urge.com -v0cdn.net -vboxprod.com -video.microsoft.com -vidzone.tv -w-src.com -walmart.com -wbaltv.com -webgallery.microsoft.com -webtv.net -whymicrosoft.com -winaero.com -wind8apps.com -windonws.com.br -window7phone.com -windowphone7.com -windowphones.net -windows -windows-live.com.br -windows.ca -windows.com.akadns.net -windows.lu -windows.microsoft.com -windows07.com.br -windows2000.com.br -windows7download.com -windows8downloads.com -windows8downloadscdn.com -windowsdna.com.br -windowsembeddeddevices.com -windowsembeddedkit.com -windowsembeddedpartner.com -windowsembeddedpartner.net -windowsembeddedpartner.org -windowsembeddedpartners.com -windowsembeddedpartners.net -windowsembeddedpartners.org -windowsfilm.com.br -windowsfilms.com.br -windowsgamedeveloper.com -windowshomeserver.com.br -windowshyper-v.com.br -windowsinformatica.com.br -windowslive.com -windowslive.com.ph -windowslive.de -windowslive.fr -windowslive.la -windowslive.net -windowslive.nl -windowsliveexpo.com -windowslivegadgets.com -windowslivehelp.com -windowsliveid.com -windowsliveonecare.com -windowsliveplanet.com -windowslogo.org -windowsmarketplace.com -windowsmedia1.com -windowsmediacenter.com -windowsmediaguide.com -windowsmobile.es -windowsonecare.com -windowsonecare.nl -windowsonecarelive.com -windowsonecarelive.net -windowsonline.com.br -windowsphone.co.uk -windowsphone.cz -windowsphone.es -windowsphone.se -windowsphone6.com -windowsphone7.com -windowsphone7.net -windowsphones.net -windowsphones.org -windowsphoneseven.com -windowsphoneseven.net -windowspone.com -windowspowershell.org -windowsrestaurante.com.br -windowsserverfeedback.com -windowsserverhyper-v.com.br -windowsupdate.com.br -windowsupdate.com.c.footprint.net -windowsupdate.microsoft.com -windowsvissa.com -windowsvista.kz -windowsxp.com.br -windowsxp.nu -windowvista.com.br -windwosphone.com -wldrive.com.br -wmplugins.com -www-live.com -xbox.de -xbox360nextgennow.com xboxcanada.ca -xboxlive.com-c.edgekey.net -xboxlive.com-c.edgekey.net.globalredir.akadns.net -xboxlive.com.br -xboxrc.com -xmlsoap.org -xsnsports.com -xtngm-ppe.com -yahoobingnetwork.com -zone.com -zootycooninsider.com -zootycooninsider.net -zootycooninsider.org diff --git a/slips_files/organizations_info/microsoft_ip_ranges b/slips_files/organizations_info/microsoft_ip_ranges new file mode 100644 index 000000000..d896f7e51 --- /dev/null +++ b/slips_files/organizations_info/microsoft_ip_ranges @@ -0,0 +1,575 @@ +1.186.0.0/16 +4.128.0.0/9 +9.129.0.0/16 +9.130.0.0/15 +9.132.0.0/15 +9.135.0.0/16 +9.136.0.0/16 +9.140.0.0/15 +9.143.0.0/16 +9.145.0.0/16 +9.146.0.0/16 +9.149.0.0/16 +9.157.0.0/16 +9.158.0.0/15 +9.160.0.0/16 +9.163.0.0/16 +9.164.0.0/16 +9.166.0.0/15 +9.169.0.0/16 +9.173.0.0/16 +9.177.0.0/16 +9.185.0.0/16 +9.190.0.0/16 +9.192.0.0/15 +9.198.0.0/16 +9.205.0.0/16 +9.220.0.0/16 +9.223.0.0/16 +9.228.0.0/15 +9.231.0.0/16 +9.234.0.0/15 +9.248.0.0/16 +13.64.0.0/11 +13.96.0.0/13 +13.104.0.0/14 +13.117.0.0/16 +13.118.0.0/15 +13.123.0.0/16 +13.240.0.0/14 +20.0.0.0/11 +20.33.0.0/16 +20.34.0.0/15 +20.36.0.0/14 +20.40.0.0/13 +20.48.0.0/12 +20.64.0.0/10 +20.128.0.0/16 +20.130.0.0/16 +20.135.0.0/16 +20.136.0.0/16 +20.140.0.0/15 +20.143.0.0/16 +20.144.0.0/14 +20.150.0.0/15 +20.152.0.0/15 +20.157.0.0/16 +20.158.0.0/15 +20.160.0.0/11 +20.192.0.0/10 +23.96.0.0/13 +23.236.126.0/24 +31.80.0.0/13 +40.17.0.0/16 +40.21.0.0/16 +40.25.0.0/16 +40.33.0.0/16 +40.34.0.0/16 +40.47.0.0/16 +40.64.0.0/10 +40.146.0.0/16 +40.148.0.0/16 +40.155.0.0/16 +40.159.0.0/16 +40.162.0.0/16 +40.169.0.0/16 +40.170.0.0/15 +40.212.0.0/16 +40.218.0.0/16 +40.249.0.0/16 +40.253.0.0/16 +42.159.0.0/16 +48.160.0.0/11 +48.192.0.0/10 +50.20.0.0/18 +50.20.64.0/19 +50.20.128.0/18 +50.21.32.0/19 +50.85.0.0/16 +51.1.0.0/16 +51.4.0.0/15 +51.8.0.0/16 +51.10.0.0/15 +51.12.0.0/15 +51.18.0.0/16 +51.41.0.0/16 +51.42.0.0/15 +51.51.0.0/16 +51.53.0.0/16 +51.54.0.0/15 +51.56.0.0/14 +51.61.0.0/16 +51.103.0.0/16 +51.104.0.0/14 +51.109.0.0/16 +51.111.0.0/16 +51.115.0.0/16 +51.116.0.0/16 +51.120.0.0/16 +51.124.0.0/16 +51.126.0.0/16 +51.132.0.0/16 +51.135.0.0/16 +51.136.0.0/15 +51.138.0.0/16 +51.140.0.0/14 +51.144.0.0/15 +52.96.0.0/12 +52.112.0.0/14 +52.120.0.0/14 +52.125.0.0/16 +52.126.0.0/15 +52.130.0.0/15 +52.132.0.0/14 +52.136.0.0/13 +52.145.0.0/16 +52.146.0.0/15 +52.148.0.0/14 +52.152.0.0/13 +52.160.0.0/11 +52.224.0.0/11 +53.103.135.0/24 +53.103.136.0/21 +54.15.0.0/16 +54.18.0.0/16 +54.27.0.0/16 +54.29.0.0/16 +54.104.0.0/16 +54.119.0.0/16 +54.128.0.0/16 +54.133.0.0/16 +54.135.0.0/16 +54.139.0.0/16 +57.13.0.0/16 +57.16.0.0/14 +57.27.0.0/16 +57.33.0.0/16 +57.36.0.0/16 +57.41.0.0/16 +57.42.0.0/15 +57.44.0.0/15 +57.46.0.0/16 +57.49.0.0/16 +57.50.0.0/16 +57.52.0.0/16 +57.54.0.0/15 +57.61.0.0/16 +57.62.0.0/15 +57.150.0.0/15 +57.152.0.0/13 +57.160.0.0/12 +57.184.0.0/15 +57.192.0.0/16 +57.226.0.0/16 +57.239.0.0/16 +57.240.0.0/16 +57.243.0.0/16 +57.244.0.0/16 +58.68.168.0/24 +62.10.0.0/15 +64.4.0.0/18 +64.207.0.0/18 +64.236.0.0/16 +64.238.96.0/19 +65.52.0.0/14 +66.119.144.0/20 +66.180.96.0/19 +68.18.0.0/15 +68.154.0.0/15 +68.210.0.0/15 +68.218.0.0/15 +68.220.0.0/15 +68.240.0.0/13 +69.15.0.0/16 +69.93.0.0/16 +69.198.0.0/15 +70.37.0.0/17 +70.37.128.0/18 +70.152.0.0/15 +70.156.0.0/15 +72.16.128.0/17 +72.54.0.0/16 +72.144.0.0/14 +72.152.0.0/14 +74.7.0.0/16 +74.123.176.0/22 +74.144.0.0/12 +74.160.0.0/14 +74.176.0.0/14 +74.224.0.0/14 +74.234.0.0/15 +74.240.0.0/14 +74.248.0.0/15 +82.87.0.0/16 +82.171.0.0/16 +84.81.0.0/16 +84.222.0.0/15 +85.210.0.0/15 +85.212.0.0/16 +86.91.0.0/16 +91.190.216.0/21 +91.225.248.0/23 +94.245.64.0/18 +98.64.0.0/14 +98.70.0.0/15 +101.28.252.0/24 +102.37.0.0/16 +102.133.0.0/16 +103.9.8.0/22 +103.25.156.0/22 +103.36.96.0/22 +103.255.140.0/22 +104.40.0.0/13 +104.146.0.0/15 +104.208.0.0/13 +107.32.0.0/11 +108.140.0.0/14 +109.246.0.0/16 +111.221.16.0/20 +111.221.64.0/18 +112.25.33.0/24 +113.197.67.0/24 +115.231.150.0/24 +122.149.0.0/16 +123.150.49.0/24 +123.235.32.0/24 +124.252.0.0/16 +125.65.247.0/24 +128.24.0.0/16 +128.85.0.0/16 +128.94.0.0/16 +128.203.0.0/16 +128.251.0.0/16 +129.75.0.0/16 +129.135.0.0/16 +130.33.0.0/16 +130.107.0.0/16 +130.131.0.0/16 +130.213.0.0/16 +131.107.0.0/16 +131.145.0.0/16 +131.163.0.0/16 +131.189.0.0/16 +131.253.1.0/24 +131.253.3.0/24 +131.253.5.0/24 +131.253.6.0/24 +131.253.8.0/24 +131.253.12.0/22 +131.253.16.0/23 +131.253.18.0/24 +131.253.21.0/24 +131.253.22.0/23 +131.253.24.0/21 +131.253.32.0/20 +131.253.61.0/24 +131.253.62.0/23 +131.253.64.0/18 +131.253.128.0/17 +132.164.0.0/16 +132.196.0.0/16 +132.220.0.0/16 +132.245.0.0/16 +134.33.0.0/16 +134.112.0.0/16 +134.138.0.0/16 +134.149.0.0/16 +134.170.0.0/16 +134.177.0.0/16 +135.1.0.0/16 +135.3.0.0/16 +135.4.0.0/14 +135.13.0.0/16 +135.18.0.0/16 +135.85.0.0/16 +135.86.0.0/16 +135.88.0.0/16 +135.93.0.0/16 +135.111.0.0/16 +135.112.0.0/16 +135.114.0.0/15 +135.116.0.0/14 +135.120.0.0/15 +135.130.0.0/16 +135.149.0.0/16 +135.171.0.0/16 +135.183.0.0/16 +135.185.0.0/16 +135.220.0.0/15 +135.222.0.0/16 +135.224.0.0/12 +135.240.0.0/15 +135.243.0.0/16 +135.244.0.0/16 +135.246.0.0/15 +135.248.0.0/16 +135.253.0.0/16 +135.254.0.0/15 +137.116.0.0/15 +137.135.0.0/16 +137.162.0.0/16 +138.91.0.0/16 +138.105.0.0/16 +138.120.0.0/16 +138.196.0.0/16 +138.203.0.0/16 +138.213.0.0/16 +138.239.0.0/16 +138.242.0.0/16 +139.188.0.0/16 +139.217.0.0/16 +139.219.0.0/16 +141.251.0.0/16 +143.64.0.0/16 +143.209.0.0/16 +143.226.0.0/16 +143.241.0.0/16 +145.129.0.0/16 +145.130.0.0/16 +145.132.0.0/15 +145.176.0.0/12 +146.147.0.0/16 +147.145.0.0/16 +147.214.0.0/16 +147.243.0.0/16 +148.7.0.0/16 +148.53.0.0/16 +149.1.0.0/16 +149.175.0.0/16 +149.198.0.0/16 +149.204.0.0/16 +150.171.0.0/16 +150.206.0.0/16 +150.212.0.0/16 +150.242.48.0/22 +151.98.0.0/16 +151.129.0.0/16 +151.206.0.0/16 +152.138.0.0/16 +152.148.0.0/16 +155.62.0.0/16 +156.23.0.0/16 +157.31.0.0/16 +157.54.0.0/15 +157.56.0.0/14 +157.60.0.0/16 +157.81.0.0/16 +157.95.0.0/16 +157.172.0.0/16 +157.176.0.0/16 +157.252.0.0/16 +158.23.0.0/16 +158.24.0.0/16 +158.53.0.0/16 +158.158.0.0/16 +159.27.0.0/16 +159.128.0.0/16 +160.4.0.0/16 +160.207.0.0/16 +160.234.0.0/16 +161.66.0.0/16 +161.157.0.0/16 +161.220.0.0/16 +163.57.0.0/16 +163.228.0.0/16 +165.15.0.0/16 +165.17.0.0/16 +167.105.0.0/16 +167.162.0.0/16 +167.186.0.0/16 +167.220.0.0/16 +167.231.0.0/16 +168.61.0.0/16 +168.62.0.0/15 +169.138.0.0/16 +170.165.0.0/16 +171.107.84.0/24 +171.111.154.0/24 +172.128.0.0/10 +172.192.0.0/12 +172.208.0.0/13 +173.200.0.0/16 +174.132.0.0/16 +175.6.10.0/24 +180.210.229.0/24 +180.210.232.0/24 +180.210.234.0/24 +182.50.87.0/24 +185.209.209.0/24 +185.236.124.0/24 +191.232.0.0/13 +192.32.0.0/16 +192.48.225.0/24 +192.84.159.0/24 +192.84.160.0/23 +192.100.104.0/21 +192.100.112.0/20 +192.100.128.0/22 +192.133.61.0/24 +192.135.86.0/23 +192.135.88.0/24 +192.146.133.0/24 +192.153.251.0/24 +192.197.157.0/24 +192.237.67.0/24 +193.149.64.0/19 +193.221.113.0/24 +194.41.16.0/20 +194.69.96.0/19 +194.110.197.0/24 +194.238.128.0/17 +195.134.224.0/19 +198.49.8.0/24 +198.71.64.0/21 +198.71.72.0/22 +198.105.232.0/22 +198.137.97.0/24 +198.180.95.0/24 +198.180.97.0/24 +198.200.130.0/24 +198.206.164.0/24 +199.4.159.0/24 +199.30.16.0/20 +199.50.0.0/16 +199.60.28.0/24 +199.74.210.0/24 +199.103.90.0/23 +199.103.122.0/24 +199.118.0.0/16 +199.242.32.0/20 +199.242.48.0/21 +202.89.224.0/20 +204.13.120.0/21 +204.14.180.0/22 +204.79.135.0/24 +204.79.179.0/24 +204.79.180.0/23 +204.79.188.0/24 +204.79.195.0/24 +204.79.196.0/23 +204.79.252.0/24 +204.95.96.0/20 +204.140.80.0/24 +204.152.18.0/23 +204.152.140.0/23 +204.231.192.0/24 +204.231.194.0/23 +204.231.197.0/24 +204.231.198.0/23 +204.231.200.0/21 +204.231.208.0/20 +204.231.236.0/24 +205.174.224.0/20 +206.138.168.0/21 +206.191.224.0/19 +207.46.0.0/16 +207.68.128.0/18 +207.103.0.0/16 +208.68.136.0/21 +208.76.44.0/22 +208.84.0.0/21 +208.92.176.0/22 +208.94.120.0/21 +209.177.86.0/24 +209.177.90.0/24 +209.177.94.0/24 +209.185.240.0/23 +209.199.0.0/16 +209.240.192.0/19 +211.90.28.0/24 +212.132.0.0/19 +212.173.0.0/17 +212.207.0.0/16 +213.54.0.0/16 +213.199.128.0/18 +216.32.180.0/22 +216.220.208.0/20 +217.176.0.0/16 +217.177.96.0/19 +222.161.226.0/24 +2001:67c:1021::/48 +2001:df0:7::/48 +2001:df0:d7::/48 +2001:df0:d8::/47 +2001:489a:2202::/60 +2001:489a:2202:2000::/63 +2001:489a:2206::/63 +2001:489a:2206:10::/63 +2001:489a:2206:20::/63 +2001:489a:2206:30::/63 +2001:489a:2206:8000::/63 +2001:489a:2206:8010::/63 +2001:489a:3000::/46 +2001:489a:3100::/46 +2001:489a:3108::/47 +2001:489a:3200::/46 +2001:489a:3204::/47 +2001:489a:3300::/46 +2001:489a:3304::/47 +2001:489a:3400::/46 +2001:489a:3404::/47 +2001:489a:3500::/50 +2001:489a:3600::/47 +2001:489a:3602::/48 +2001:489a:3604::/47 +2001:489a:3606::/48 +2404:7940::/47 +2404:7940:3::/48 +2404:7940:100::/47 +2404:7940:200::/47 +2404:7940:203::/48 +2404:7940:300::/47 +2404:f800::/32 +2404:f801:8030::/48 +2406:e500:2000::/64 +2406:e500:2001::/48 +2406:e500:2002::/47 +2406:e500:2004::/47 +2406:e500:2100::/123 +2406:e500:2101::/48 +2406:e500:2102::/47 +2406:e500:2104::/47 +2406:e500:2200::/46 +2406:e500:2300::/46 +2406:e500:2400::/46 +2406:e500:2500::/61 +2406:e500:2500:8::/62 +2406:e500:2500:c::/64 +2406:e500:2501::/60 +2406:e500:2501:10::/61 +2406:e500:2501:18::/63 +2406:e500:2501:1a::/64 +2406:e500:2600::/46 +2406:e500:4000:2::/63 +2406:e500:4101:2::/64 +2406:e500:4400::/40 +2406:e500:4800::/63 +2406:e500:4801::/63 +2406:e500:4804::/63 +2406:e500:4805::/63 +2406:e500:4900::/64 +2406:e500:5500::/48 +2406:e500:c020::/44 +2406:e500:c120::/44 +2602:fd5e:1::/63 +2602:fd5e:1:2::/64 +2603:1000::/25 +2603:10e1:100:2::1435:5552/128 +2603:10e1:100:2::144c:f22d/128 +2603:10e1:100:2::14c3:6100/128 +2603:10e1:100:2::287d:67fb/128 +2603:10e1:100:2::3368:a5a2/128 +2603:10e1:100:2::348b:476/128 +2603:10e1:100:2::34bf:e4f5/128 +2620:0:30::/45 +2620:1ec::/36 +2801:80:1d0::/48 +2a01:111::/32 +2a01:4180:2000::/40 +2a01:4180:2400::/40 +2a01:4180:4050:400::/64 +2a01:4180:4050:800::/64 +2a01:4180:4051:400::/64 +2a01:4180:4051:800::/64 +2a01:4180:c001:8::/61 +2a01:4180:c003:8::/61 diff --git a/slips_files/organizations_info/twitter b/slips_files/organizations_info/twitter deleted file mode 100644 index 418037a52..000000000 --- a/slips_files/organizations_info/twitter +++ /dev/null @@ -1,114 +0,0 @@ -199.96.57.0/24 -199.16.156.0/22 -199.59.148.0/22 -192.133.76.0/22 -192.133.76.0/23 -199.96.59.0/24 -199.96.58.0/24 -199.96.63.0/24 -199.96.56.0/21 -103.252.112.0/22 -103.252.114.0/23 -185.45.4.0/23 -69.12.56.0/21 -104.244.42.0/24 -185.45.5.0/24 -185.45.4.0/24 -199.96.56.0/24 -202.160.128.0/22 -202.160.128.0/24 -202.160.129.0/24 -202.160.130.0/24 -202.160.131.0/24 -104.244.40.0/24 -104.244.41.0/24 -185.45.6.0/23 -192.44.68.0/23 -192.48.236.0/23 -199.96.56.0/23 -199.69.58.0/23 -199.96.60.0/23 -199.96.62.0/23 -192.44.68.0/24 -192.44.69.0/24 -103.252.112.0/23 -104.244.44.0/24 -104.244.45.0/24 -104.244.46.0/24 -104.244.47.0/24 -69.195.160.0/19 -209.237.192.0/19 -209.237.192.0/24 -209.237.193.0/24 -209.237.194.0/24 -209.237.195.0/24 -209.237.196.0/24 -209.237.197.0/24 -209.237.198.0/24 -209.237.199.0/24 -209.237.200.0/24 -209.237.201.0/24 -209.237.202.0/24 -209.237.203.0/24 -209.237.204.0/24 -209.237.205.0/24 -209.237.206.0/24 -209.237.207.0/24 -209.237.208.0/24 -209.237.209.0/24 -209.237.210.0/24 -209.237.211.0/24 -209.237.212.0/24 -209.237.213.0/24 -209.237.214.0/24 -209.237.215.0/24 -209.237.216.0/24 -209.237.217.0/24 -209.237.218.0/24 -209.237.219.0/24 -209.237.220.0/24 -209.237.221.0/24 -209.237.222.0/24 -209.237.223.0/24 -69.195.160.0/24 -69.195.161.0/24 -69.195.162.0/24 -69.195.163.0/24 -69.195.164.0/24 -69.195.165.0/24 -69.195.166.0/24 -69.195.167.0/24 -69.195.168.0/24 -69.195.169.0/24 -69.195.170.0/24 -69.195.171.0/24 -69.195.172.0/24 -69.195.173.0/24 -69.195.174.0/24 -69.195.175.0/24 -69.195.176.0/24 -69.195.177.0/24 -69.195.178.0/24 -69.195.179.0/24 -69.195.180.0/24 -69.195.181.0/24 -69.195.182.0/24 -69.195.183.0/24 -69.195.184.0/24 -69.195.185.0/24 -69.195.186.0/24 -69.195.187.0/24 -69.195.188.0/24 -69.195.189.0/24 -69.195.190.0/24 -69.195.191.0/24 -64.63.0.0/18 -104.244.43.0/24 -64.63.63.0/24 -64.63.62.0/24 -103.55.162.0/24 -64.63.32.0/24 -64.63.33.0/24 -2400:6680::/32 -2606:1f80::/32 -2a04:9d40::/29 \ No newline at end of file diff --git a/slips_files/organizations_info/twitter_asn b/slips_files/organizations_info/twitter_asn index ff9560f0b..6e310d2fd 100644 --- a/slips_files/organizations_info/twitter_asn +++ b/slips_files/organizations_info/twitter_asn @@ -1,7 +1,8 @@ AS13414 +AS208135 AS35995 AS54888 -AS208135 -TWITTER, US -TWITTER-NETWORK, US +AS63179 FLUEPKE-NET +TWITTER-NETWORK, US +TWITTER, US diff --git a/slips_files/organizations_info/twitter_domains b/slips_files/organizations_info/twitter_domains index c6465401c..1fdaefec5 100644 --- a/slips_files/organizations_info/twitter_domains +++ b/slips_files/organizations_info/twitter_domains @@ -1,116 +1,7 @@ twitter.com -0.twitter.com -2010.twitter.com -2011.twitter.com -2012.twitter.com -2013.twitter.com -2014.twitter.com -about.twitter.com -abs.twimg.com -access.twitter.com -ads.twitter.com -amp.twimg.com -analytics.twitter.com -api-test.twitter.com -api.twitter.com -api2.twitter.com -api4.twitter.com -app.tweet.twitter.com -apps.twitter.com -blog.twitter.com -brand.twitter.com -business.twitter.com -calendar.twitter.com -cards-dev.twitter.com -cards.twitter.com -cdn.syndication.twimg.com -cdn.syndication.twitter.com -click.e.twitter.com -content.twitter.com -d2rdfnizen5apl.cloudfront.net -dev-about.twitter.com -dev-blog.twitter.com -dev-brand.twitter.com -dev-business.twitter.com -dev-horizon.twitter.com -dev-jobs.twitter.com -dev-marketing.twitter.com -dev.twitter.com -dnt.twimg.com -download.twitter.com -ea.twimg.com -election.twitter.com -eng.twitter.com -engineering.twitter.com -events.twitter.com -firefox.twitter.com -g.twimg.com -g2.twimg.com -gu.twimg.com -hca.twimg.com -horizon.twitter.com -image-proxy-origin.twimg.com -images.tweet.twitter.com -info.twitter.com -jobs.twitter.com -jp.twimg.com -m.twitter.com -ma.twimg.com -ma0.twimg.com -ma1.twimg.com -ma2.twimg.com -ma3.twimg.com -mail.twitter.com -marketing.twitter.com -media.twitter.com -mobile.twitter.com -music.twitter.com -mux.twitter.com -mx.twitter.com -mx1.twitter.com -mx2.twitter.com -mx3.twitter.com -mx4.twitter.com -o.twimg.com -p.twimg.com -partnerstream1.twitter.com -partnerstream2.twitter.com -pay.twitter.com -pbs.twimg.com -pic.twitter.com -platform.twitter.com -pulse.twitter.com -r.twimg.com -s.ads-twitter.com -s.twimg.com -s.twitter.com -search.twitter.com -search2.twitter.com -sites.twitter.com -sitestream.twitter.com -sms.twitter.com -ssl2.twitter.com.edgekey.net -static.ads-twitter.com -static.twitter.com -status.twitter.com -stream.twitter.com -support.twitter.com -syndication-o.twimg.com -syndication.twimg.com -syndication.twitter.com +twimg.com t.co -tailfeather.twimg.com -td.twitter.com -ton.twimg.com -transparency.twitter.com -twimg0-0.akamaihd.net -upload.twitter.com -userstream.twitter.com -video.twitter.com -widgets.platform.twitter.com -widgets.twimg.com -www.ads-twitter.com -www.t.co -www.twitter.com -www2.twitter.com -www4.twitter.com +x.com +pscp.tv +tweetdeck.com +tellapart.com diff --git a/slips_files/organizations_info/twitter_ip_ranges b/slips_files/organizations_info/twitter_ip_ranges new file mode 100644 index 000000000..c35c48e25 --- /dev/null +++ b/slips_files/organizations_info/twitter_ip_ranges @@ -0,0 +1,22 @@ +8.25.194.0/23 +8.25.196.0/23 +64.63.0.0/18 +69.12.56.0/21 +69.195.160.0/19 +103.55.162.0/24 +103.252.112.0/22 +104.244.40.0/21 +185.45.4.0/22 +188.64.224.0/21 +192.44.68.0/23 +192.48.236.0/23 +192.133.76.0/22 +199.16.156.0/22 +199.59.148.0/22 +199.69.58.0/23 +199.96.56.0/21 +202.160.128.0/22 +209.237.192.0/19 +2400:6680::/32 +2606:1f80::/32 +2a04:9d40::/29 diff --git a/tests/common_test_utils.py b/tests/common_test_utils.py index dcc2271e7..5fac20966 100644 --- a/tests/common_test_utils.py +++ b/tests/common_test_utils.py @@ -1,11 +1,19 @@ # SPDX-FileCopyrightText: 2021 Sebastian Garcia # SPDX-License-Identifier: GPL-2.0-only +import sqlite3 +from contextlib import contextmanager +from importlib.util import find_spec from pathlib import Path +import fcntl import os import shutil import binascii import subprocess import base64 +import sys +import time +import socket +import threading from typing import ( Dict, Optional, @@ -13,11 +21,22 @@ from pathlib import PosixPath from unittest.mock import Mock import yaml +import redis IS_IN_A_DOCKER_CONTAINER = os.environ.get("IS_IN_A_DOCKER_CONTAINER", False) integration_tests_dir = "output/integration_tests/" alerts_file = "alerts.log" +INTEGRATION_TEST_PORT_START = 65000 +INTEGRATION_TEST_PORT_END = 65535 +_port_lock = threading.Lock() +_next_integration_test_port = INTEGRATION_TEST_PORT_START +_integration_test_port_counter_file = ( + Path(integration_tests_dir) / ".next-port" +) +_integration_test_port_lock_file = ( + Path(integration_tests_dir) / ".port-allocator.lock" +) # create the integration tests dir if not os.path.exists(integration_tests_dir): @@ -56,10 +75,14 @@ def modify_yaml_config( if changes: for key, value in changes.items(): - key: str - value: dict - if key in config: + if ( + key in config + and isinstance(config[key], dict) + and isinstance(value, dict) + ): config[key].update(value) + else: + config[key] = value with output_file.open("w", encoding="utf-8") as f: yaml.dump(config, f, default_flow_style=False, allow_unicode=True) @@ -88,10 +111,202 @@ def do_nothing(*args): def run_slips(cmd): """runs slips and waits for it to end""" slips = subprocess.Popen(cmd, stdin=subprocess.PIPE, shell=True) - return_code = slips.wait() + _, _ = slips.communicate(input=b"y\n") + return_code = slips.returncode return return_code +@contextmanager +def integration_test_port_file_lock(): + """ + Lock the shared integration-test port allocator across processes. + + :return: Yields while the allocator lock is held + """ + _integration_test_port_lock_file.touch(exist_ok=True) + with _integration_test_port_lock_file.open( + "r", encoding="utf-8" + ) as lock_file: + fcntl.flock(lock_file.fileno(), fcntl.LOCK_EX) + try: + yield + finally: + fcntl.flock(lock_file.fileno(), fcntl.LOCK_UN) + + +def get_next_integration_test_port_candidate() -> int: + """ + Read the next shared integration-test port candidate. + + :return: Next candidate port from the shared counter + """ + if not _integration_test_port_counter_file.exists(): + return max(_next_integration_test_port, INTEGRATION_TEST_PORT_START) + + counter_value = _integration_test_port_counter_file.read_text( + encoding="utf-8" + ).strip() + return int(counter_value or INTEGRATION_TEST_PORT_START) + + +def set_next_integration_test_port_candidate(next_port: int) -> None: + """ + Persist the next shared integration-test port candidate. + + :param next_port: Next port to hand out + :return: None + """ + global _next_integration_test_port + + _next_integration_test_port = next_port + _integration_test_port_counter_file.write_text( + str(next_port), encoding="utf-8" + ) + + +def is_integration_test_port_available(port: int) -> bool: + """ + Check whether a TCP port is currently available on localhost. + + :param port: TCP port to probe + :return: True when the port can be bound, otherwise False + """ + with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock: + sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) + try: + sock.bind(("127.0.0.1", port)) + except OSError: + return False + + return True + + +def find_available_integration_test_port(start_port: int) -> int: + """ + Find the next available integration-test port in the configured range. + + :param start_port: Port number to start scanning from + :return: First available TCP port in the integration-test range + :raises RuntimeError: When the configured integration-test range is exhausted + """ + for candidate in range(start_port, INTEGRATION_TEST_PORT_END + 1): + if is_integration_test_port_available(candidate): + return candidate + + raise RuntimeError( + "No free integration test ports remain in the 65000-65535 range." + ) + + +def get_available_integration_test_port() -> int: + """ + Return a free TCP port reserved from the integration test range. + + The allocator walks ports from 65000 upwards and verifies each candidate + by binding to it before returning it. Allocation is synchronized across + pytest-xdist workers through a shared lock file and counter file. + + :return: Available TCP port for an integration test + :raises RuntimeError: When the configured integration test port range is exhausted + """ + with _port_lock: + with integration_test_port_file_lock(): + candidate = get_next_integration_test_port_candidate() + port = find_available_integration_test_port(candidate) + set_next_integration_test_port_candidate(port + 1) + return port + + +def allocate_integration_test_port(test_name: str, port_label: str) -> int: + """ + Allocate and announce a free TCP port for an integration test. + + :param test_name: Pytest node id or other human-readable test identifier + :param port_label: Label describing how the port will be used + :return: Allocated TCP port + """ + port = get_available_integration_test_port() + print(f"[integration-test] {test_name} using {port_label} port {port}") + return port + + +def start_test_redis_server(redis_port: int) -> None: + """ + Ensure a Redis server is running for an integration test. + + :param redis_port: Redis port required by the integration test + :return: None + """ + client = redis.StrictRedis(host="localhost", port=redis_port, db=0) + try: + client.ping() + return + except redis.exceptions.ConnectionError: + pass + finally: + client.connection_pool.disconnect() + + if shutil.which("redis-server") is None: + import pytest + + pytest.skip("Missing integration runtime dependencies: redis-server") + + subprocess.check_call( + ["redis-server", "--port", str(redis_port), "--daemonize", "yes"] + ) + + deadline = time.time() + 5 + while time.time() < deadline: + client = redis.StrictRedis(host="localhost", port=redis_port, db=0) + try: + client.ping() + return + except redis.exceptions.ConnectionError: + time.sleep(0.1) + finally: + client.connection_pool.disconnect() + + raise RuntimeError( + f"Redis server did not become ready on integration test port {redis_port}." + ) + + +def close_test_redis_server(redis_port: int) -> bool: + """ + Flush and stop the Redis server used by an integration test. + + :param redis_port: Redis port used by the test + :return: True when a Redis server was reached and shutdown was attempted + """ + client = redis.StrictRedis(host="localhost", port=redis_port, db=0) + try: + client.ping() + except redis.exceptions.ConnectionError: + return False + + try: + client.flushall() + client.flushdb() + client.script_flush() + client.shutdown(save=False) + except redis.exceptions.ConnectionError: + return True + finally: + client.connection_pool.disconnect() + + return True + + +def get_slips_test_command(arguments): + """ + Build a Slips CLI command that uses the current Python interpreter. + + :param arguments: CLI arguments to pass to slips.py + :return: shell command string + """ + return f"{sys.executable} ./slips.py {arguments}" + + def get_random_uid(): return base64.b64encode(binascii.b2a_hex(os.urandom(9))).decode("utf-8") @@ -126,6 +341,41 @@ def create_output_dir(dirname) -> PosixPath: return path +def skip_if_missing_runtime_dependencies( + python_modules=None, binaries=None, require_zeek_or_bro=False +): + """ + Skip an integration test when required runtime dependencies are missing. + + :param python_modules: iterable of importable module names + :param binaries: iterable of executable names expected on PATH + :param require_zeek_or_bro: require either zeek or bro to exist + :return: None + """ + python_modules = python_modules or () + binaries = binaries or () + missing_dependencies = [] + + for module_name in python_modules: + if find_spec(module_name) is None: + missing_dependencies.append(module_name) + + for binary_name in binaries: + if shutil.which(binary_name) is None: + missing_dependencies.append(binary_name) + + if require_zeek_or_bro and not ( + shutil.which("zeek") or shutil.which("bro") + ): + missing_dependencies.append("zeek|bro") + + if missing_dependencies: + missing = ", ".join(missing_dependencies) + import pytest + + pytest.skip(f"Missing integration runtime dependencies: {missing}") + + def msgs_published_are_eq_msgs_received_by_each_module(db) -> bool: """ This functions checks that all modules received all msgs that were @@ -153,6 +403,22 @@ def check_for_text(txt, output_dir): return False +def get_label_count_from_output_db(output_dir, label): + """ + Return the number of flows stored with a given label in SQLite. + + :param output_dir: integration test output directory + :param label: flow label to count + :return: number of matching flows + """ + db_path = os.path.join(output_dir, "databases", "flows.sqlite") + with sqlite3.connect(db_path) as conn: + row = conn.execute( + "SELECT COUNT(*) FROM flows WHERE label = ?", (label,) + ).fetchone() + return int(row[0] or 0) + + def has_error_keywords(line): """ these keywords indicate that an error needs to diff --git a/tests/integration/config/iris_peer_config.yaml b/tests/integration/config/iris_peer_config.yaml deleted file mode 100644 index d1bf3e477..000000000 --- a/tests/integration/config/iris_peer_config.yaml +++ /dev/null @@ -1,15 +0,0 @@ -Identity: - GenerateNewKey: true - KeyFile: second.priv -PeerDiscovery: - DisableBootstrappingNodes: false - ListOfMultiAddresses: - - /ip4/127.0.0.1/udp/9010/quic 12D3KooWNKe9xFM85HkWsoGAy4pM3kXrZHGumJwQBBr9T4VzHtNR -Redis: - Host: 127.0.0.1 - Port: 6655 - Tl2NlChannel: iris_internal -Server: - DhtServerMode: 'true' - Host: null - Port: 9006 diff --git a/tests/integration/conftest.py b/tests/integration/conftest.py new file mode 100644 index 000000000..eecfd1f62 --- /dev/null +++ b/tests/integration/conftest.py @@ -0,0 +1,39 @@ +# SPDX-FileCopyrightText: 2021 Sebastian Garcia +# SPDX-License-Identifier: GPL-2.0-only +import importlib.util +import pytest +from tests.common_test_utils import ( + allocate_integration_test_port, + start_test_redis_server, +) + + +if importlib.util.find_spec("termcolor") is None: + pytest.skip( + "termcolor is required to run integration tests that invoke slips", + allow_module_level=True, + ) + + +@pytest.fixture +def integration_port_factory(request): + """ + Allocate free ports for an integration test from the shared high-port range. + + :param request: Pytest request object for the current test + :return: Callable that allocates and prints a labelled port + """ + + def allocate(port_label: str = "service") -> int: + """ + Allocate a free test port and print it for the current test. + + :param port_label: Label describing the allocated port + :return: Allocated TCP port + """ + port = allocate_integration_test_port(request.node.nodeid, port_label) + if "redis" in port_label.lower(): + start_test_redis_server(port) + return port + + return allocate diff --git a/tests/integration/test_config_files.py b/tests/integration/test_config_files.py deleted file mode 100644 index a4f2d0892..000000000 --- a/tests/integration/test_config_files.py +++ /dev/null @@ -1,189 +0,0 @@ -# SPDX-FileCopyrightText: 2021 Sebastian Garcia -# SPDX-License-Identifier: GPL-2.0-only -""" -This file tests 2 different config files other than slips' default config/slips.yaml -test/test.yaml and tests/test2.yaml -""" - -from slips.main import Main -from slips_files.common.input_type import InputType -from tests.common_test_utils import ( - is_evidence_present, - create_output_dir, - assert_no_errors, - check_for_text, - modify_yaml_config, -) -from tests.module_factory import ModuleFactory -import pytest -import shutil -import os - -alerts_file = "alerts.log" - - -def create_main_instance(input_information): - """returns an instance of Main() class in slips.py""" - main = Main(testing=True) - main.input_information = input_information - main.input_type = InputType.PCAP - main.line_type = False - return main - - -@pytest.mark.parametrize( - "pcap_path, expected_profiles, output_dir, redis_port", - [ - ( - "dataset/test7-malicious.pcap", - 290, - "test_configuration_file/", - 6667, - ) - ], -) -def test_conf_file(pcap_path, expected_profiles, output_dir, redis_port): - """ - In this test we're using tests/test.conf - """ - config_file = "tests/integration/test.yaml" - modify_yaml_config( - output_filename=config_file, - output_dir=os.getcwd(), - changes={ - "DisabledAlerts": { - "disabled_detections": ["ConnectionWithoutDNS"] - }, - "detection": {"evidence_detection_threshold": 0.1}, - "parameters": { - "analysis_direction": "all", - "delete_zeek_files": True, - "store_zeek_files_in_the_output_dir": False, - "label": "malicious", - "time_window_width": "only_one_tw", - "store_a_copy_of_zeek_files": True, - }, - "modules": { - "disable": [ - "template", - "ensembling", - "Flow ML Detection", - "Update Manager", - ] - }, - }, - ) - output_dir = create_output_dir(output_dir) - output_file = os.path.join(output_dir, "slips_output.txt") - command = ( - f"./slips.py " - f"-t -e 1 " - f"-f {pcap_path} " - f"-o {output_dir} " - f"-c {config_file} " - f"-P {redis_port} " - f"> {output_file} 2>&1" - ) - print("running slips ...") - # this function returns when slips is done - os.system(command) - print("Slip is done, checking for errors in the output dir.") - assert_no_errors(output_dir) - print("Comparing profiles with expected profiles") - database = ModuleFactory().create_db_manager_obj( - redis_port, output_dir=output_dir, start_redis_server=False - ) - profiles = database.get_profiles_len() - # expected_profiles is more than 50 because we're using direction = all - assert profiles > expected_profiles - print("Checking for a random evidence") - log_file = os.path.join(output_dir, alerts_file) - - # testing disabled_detections param in the configuration file - disabled_evidence = "a connection without DNS resolution" - assert is_evidence_present(log_file, disabled_evidence) is False - print("Testing time_window_width param.") - # testing time_window_width param in the configuration file - assert check_for_text("115740 days 17 hrs 46 mins 39 seconds", output_dir) - - print("Make sure slips didn't delete zeek files.") - # test delete_zeek_files param - zeek_output_dir = database.get_zeek_output_dir()[2:] - assert zeek_output_dir not in os.listdir() - print("Test storing a copy of zeek files.") - # test store_a_copy_of_zeek_files - assert "zeek_files" in os.listdir(output_dir) - print("Checking metadata directory") - # test metadata_dir - assert "metadata" in os.listdir(output_dir) - metadata_path = os.path.join(output_dir, "metadata") - for file in ("test.yaml", "whitelist.conf", "info.txt"): - print(f"checking if {file} in the metadata path {metadata_path}") - assert file in os.listdir(metadata_path) - - print("Checking malicious label count") - # test label=malicious - assert int(database.get_label_count("malicious")) > 370 - # test disable - for module in ["template", "Flow ML Detection"]: - print(f"Checking if {module} is disabled") - assert module in database.get_disabled_modules() - print("Deleting the output directory") - shutil.rmtree(output_dir) - os.remove(config_file) - - -@pytest.mark.parametrize( - "pcap_path, expected_profiles, output_dir, redis_port", - [ - ( - "dataset/test8-malicious.pcap ", - 1, - "pcap_test_conf2/", - 6668, - ) - ], -) -def test_conf_file2(pcap_path, expected_profiles, output_dir, redis_port): - """ - In this test we're using tests/test2.conf - """ - config_file = "tests/integration/test2.yaml" - modify_yaml_config( - output_filename=config_file, - output_dir=os.getcwd(), - changes={ - "detection": {"evidence_detection_threshold": 0.1}, - "parameters": { - "metadata_dir": False, - "store_zeek_files_in_the_output_dir": False, - }, - "modules": { - "disable": [ - "template", - "ensembling", - "Flow ML Detection", - "Update Manager", - ] - }, - }, - ) - - output_dir = create_output_dir(output_dir) - output_file = os.path.join(output_dir, "slips_output.txt") - command = ( - f"./slips.py " - f"-t -e 1 " - f"-f {pcap_path} " - f"-o {output_dir} " - f"-c {config_file} " - f"-P {redis_port} " - f"> {output_file} 2>&1" - ) - print("running slips ...") - os.system(command) - print("Slip is done, checking for errors in the output dir.") - assert_no_errors(output_dir) - print("Deleting the output directory") - shutil.rmtree(output_dir) - os.remove(config_file) diff --git a/tests/integration/test_config_files/__init__.py b/tests/integration/test_config_files/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/tests/integration/config/test.yaml b/tests/integration/test_config_files/config_test.yaml similarity index 96% rename from tests/integration/config/test.yaml rename to tests/integration/test_config_files/config_test.yaml index bfa905496..9c8f73957 100644 --- a/tests/integration/config/test.yaml +++ b/tests/integration/test_config_files/config_test.yaml @@ -1,4 +1,4 @@ -CESNET: +cesnet: configuration_file: config/warden.conf receive_alerts: false receive_delay: 86400 @@ -37,18 +37,18 @@ exporting_alerts: taxii_password: admin taxii_username: admin use_https: false -flowalerts: +flow_alerts: data_exfiltration_threshold: 500 entropy_threshold: 5 long_connection_threshold: 1500 pastebin_download_threshold: 700 ssh_succesful_detection_threshold: 4290 -flowmldetection: +flow_ml_detection: mode: test global_p2p: bootstrapping_modules: - - fidesModule - - irisModule + - fides + - iris bootstrapping_node: false iris_conf: config/iris_config.yaml use_global_p2p: false @@ -63,8 +63,8 @@ modules: disable: - template - ensembling - - Flow ML Detection - - Update Manager + - flow_ml_detection + - feeds_update_manager timeline_human_timestamp: true parameters: analysis_direction: all diff --git a/tests/integration/test_config_files/test.yaml b/tests/integration/test_config_files/test.yaml new file mode 100644 index 000000000..d44e29e3c --- /dev/null +++ b/tests/integration/test_config_files/test.yaml @@ -0,0 +1,143 @@ +Debug: + generate_performance_plots: false +DisabledAlerts: + disabled_detections: + - ConnectionWithoutDNS +Docker: + GID: 0 + UID: 0 +Profiling: + cpu_profiler_dev_mode_entries: 500000 + cpu_profiler_enable: false + cpu_profiler_mode: dev + cpu_profiler_multiprocess: true + cpu_profiler_output_limit: 20 + cpu_profiler_sampling_interval: 20 + memory_profiler_enable: false + memory_profiler_mode: live + memory_profiler_multiprocess: true +anomaly_detection_https: + adaptation_score_threshold: 2.0 + adwin_clock: 1 + adwin_delta: 0.01 + adwin_grace_period: 5 + adwin_min_window_length: 5 + baseline_alpha: 0.5 + drift_alpha: 0.05 + empirical_threshold_quantile: 0.995 + flow_zscore_threshold: 3.5 + hourly_zscore_threshold: 3.0 + ja3_min_variants_per_server: 3 + log_verbosity: 3 + max_small_flow_anomalies: 1 + min_baseline_points: 6 + suspicious_alpha: 0.005 + training_alpha: 1 + training_fit_method: welford + training_hours: 2 + use_adwin_drift: true +brute_force_detector: + ssh_attempt_threshold: 9 +cesnet: + configuration_file: config/warden.conf + receive_alerts: false + receive_delay: 86400 + send_alerts: false +detection: + evidence_detection_threshold: 0.1 + popup_alerts: false +exporting_alerts: + TAXII_server: localhost + collection_name: Alerts + direct_export: true + direct_export_max_workers: 12 + direct_export_retry_backoff: 0.5 + direct_export_retry_max: 0 + direct_export_retry_max_delay: 5.0 + direct_export_workers: 4 + discovery_path: /taxii2/ + export_to: [] + port: 1234 + push_delay: 3600 + sensor_name: sensor1 + slack_api_path: config/slack_bot_token_secret + slack_channel_name: proj_slips_alerting_module + taxii_password: changeme_before_installing_a_medallion_server + taxii_timeout: 10 + taxii_username: admin + taxii_version: 2 + use_https: false +flow_alerts: + data_exfiltration_threshold: 500 + entropy_threshold: 5 + long_connection_threshold: 1500 + pastebin_download_threshold: 700 + ssh_succesful_detection_threshold: 4290 +flow_ml_detection: + mode: test +global_p2p: + bootstrapping_modules: + - fides + - iris + bootstrapping_node: false + iris_conf: config/iris_config.yaml + use_global_p2p: false +local_p2p: + create_p2p_logfile: false + use_p2p: false +modules: + disable: + - template + - ensembling + - flow_ml_detection + - feeds_update_manager + timeline_human_timestamp: true +output: + logs: slips.log + stderr: errors.log + stdout: slips.log +parameters: + analysis_direction: all + client_ips: [] + debug: 0 + default_rotation_interval: 30sec + deletePrevdb: true + delete_zeek_files: true + export_format: json + export_labeled_flows: false + export_strato_letters: false + keep_rotated_files_for: 1 day + label: malicious + metadata_dir: true + pcapfilter: false + permanent_dir: permanent + rotation: true + store_a_copy_of_zeek_files: true + store_zeek_files_in_the_output_dir: false + tcp_inactivity_timeout: 60 + time_window_width: only_one_tw + verbose: 1 + wait_for_modules_to_finish: 10080 mins +threatintelligence: + RiskIQ_credentials_path: config/RiskIQ_credentials + TI_files_update_period: 86400 + download_path_for_remote_threat_intelligence: modules/threat_intelligence/remote_data_files/ + ja3_feeds: config/JA3_feeds.csv + local_threat_intelligence_files: config/local_ti_files/ + mac_db: https://maclookup.app/downloads/json-database/get-db + mac_db_update: 1209600 + riskiq_update_period: 604800 + ssl_feeds: config/SSL_feeds.csv + ti_files: config/TI_feeds.csv + wait_for_TI_to_finish: false +virustotal: + api_key_file: config/vt_api_key + virustotal_update_period: 259200 +web_interface: + port: 55000 +whitelists: + enable_local_whitelist: true + enable_online_whitelist: true + local_whitelist_path: config/whitelist.conf + online_whitelist: https://tranco-list.eu/download/X5QNN/10000 + online_whitelist_update_period: 86400 diff --git a/tests/integration/test_config_files/test2.yaml b/tests/integration/test_config_files/test2.yaml new file mode 100644 index 000000000..fd1649091 --- /dev/null +++ b/tests/integration/test_config_files/test2.yaml @@ -0,0 +1,142 @@ +Debug: + generate_performance_plots: false +DisabledAlerts: + disabled_detections: [] +Docker: + GID: 0 + UID: 0 +Profiling: + cpu_profiler_dev_mode_entries: 500000 + cpu_profiler_enable: false + cpu_profiler_mode: dev + cpu_profiler_multiprocess: true + cpu_profiler_output_limit: 20 + cpu_profiler_sampling_interval: 20 + memory_profiler_enable: false + memory_profiler_mode: live + memory_profiler_multiprocess: true +anomaly_detection_https: + adaptation_score_threshold: 2.0 + adwin_clock: 1 + adwin_delta: 0.01 + adwin_grace_period: 5 + adwin_min_window_length: 5 + baseline_alpha: 0.5 + drift_alpha: 0.05 + empirical_threshold_quantile: 0.995 + flow_zscore_threshold: 3.5 + hourly_zscore_threshold: 3.0 + ja3_min_variants_per_server: 3 + log_verbosity: 3 + max_small_flow_anomalies: 1 + min_baseline_points: 6 + suspicious_alpha: 0.005 + training_alpha: 1 + training_fit_method: welford + training_hours: 2 + use_adwin_drift: true +brute_force_detector: + ssh_attempt_threshold: 9 +cesnet: + configuration_file: config/warden.conf + receive_alerts: false + receive_delay: 86400 + send_alerts: false +detection: + evidence_detection_threshold: 0.1 + popup_alerts: false +exporting_alerts: + TAXII_server: localhost + collection_name: Alerts + direct_export: true + direct_export_max_workers: 12 + direct_export_retry_backoff: 0.5 + direct_export_retry_max: 0 + direct_export_retry_max_delay: 5.0 + direct_export_workers: 4 + discovery_path: /taxii2/ + export_to: [] + port: 1234 + push_delay: 3600 + sensor_name: sensor1 + slack_api_path: config/slack_bot_token_secret + slack_channel_name: proj_slips_alerting_module + taxii_password: changeme_before_installing_a_medallion_server + taxii_timeout: 10 + taxii_username: admin + taxii_version: 2 + use_https: false +flow_alerts: + data_exfiltration_threshold: 500 + entropy_threshold: 5 + long_connection_threshold: 1500 + pastebin_download_threshold: 700 + ssh_succesful_detection_threshold: 4290 +flow_ml_detection: + mode: test +global_p2p: + bootstrapping_modules: + - fides + - iris + bootstrapping_node: false + iris_conf: config/iris_config.yaml + use_global_p2p: false +local_p2p: + create_p2p_logfile: false + use_p2p: false +modules: + disable: + - template + - ensembling + - flow_ml_detection + - feeds_update_manager + timeline_human_timestamp: true +output: + logs: slips.log + stderr: errors.log + stdout: slips.log +parameters: + analysis_direction: out + client_ips: [] + debug: 0 + default_rotation_interval: 30sec + deletePrevdb: true + delete_zeek_files: false + export_format: json + export_labeled_flows: false + export_strato_letters: false + keep_rotated_files_for: 1 day + label: normal + metadata_dir: false + pcapfilter: false + permanent_dir: permanent + rotation: true + store_a_copy_of_zeek_files: false + store_zeek_files_in_the_output_dir: false + tcp_inactivity_timeout: 60 + time_window_width: 3600 + verbose: 1 + wait_for_modules_to_finish: 10080 mins +threatintelligence: + RiskIQ_credentials_path: config/RiskIQ_credentials + TI_files_update_period: 86400 + download_path_for_remote_threat_intelligence: modules/threat_intelligence/remote_data_files/ + ja3_feeds: config/JA3_feeds.csv + local_threat_intelligence_files: config/local_ti_files/ + mac_db: https://maclookup.app/downloads/json-database/get-db + mac_db_update: 1209600 + riskiq_update_period: 604800 + ssl_feeds: config/SSL_feeds.csv + ti_files: config/TI_feeds.csv + wait_for_TI_to_finish: false +virustotal: + api_key_file: config/vt_api_key + virustotal_update_period: 259200 +web_interface: + port: 55000 +whitelists: + enable_local_whitelist: true + enable_online_whitelist: true + local_whitelist_path: config/whitelist.conf + online_whitelist: https://tranco-list.eu/download/X5QNN/10000 + online_whitelist_update_period: 86400 diff --git a/tests/integration/test_config_files/test_config_files.py b/tests/integration/test_config_files/test_config_files.py new file mode 100644 index 000000000..1a9ef3d72 --- /dev/null +++ b/tests/integration/test_config_files/test_config_files.py @@ -0,0 +1,202 @@ +# SPDX-FileCopyrightText: 2021 Sebastian Garcia +# SPDX-License-Identifier: GPL-2.0-only +""" +This file tests 2 different config files other than slips' default config/slips.yaml +test/test.yaml and tests/test2.yaml +""" + +from tests.common_test_utils import ( + is_evidence_present, + create_output_dir, + assert_no_errors, + check_for_text, + close_test_redis_server, + get_label_count_from_output_db, + run_slips, + get_slips_test_command, + modify_yaml_config, + skip_if_missing_runtime_dependencies, +) +from tests.module_factory import ModuleFactory +import pytest +import shutil +import os +from pathlib import Path + +alerts_file = "alerts.log" +TEST_DIR = Path(__file__).resolve().parent + + +@pytest.mark.parametrize( + "pcap_path, expected_profiles, output_dir", + [ + ( + "dataset/test7-malicious.pcap", + 290, + "test_configuration_file/", + ) + ], +) +def test_conf_file( + pcap_path, expected_profiles, output_dir, integration_port_factory +): + """ + In this test we're using tests/test.conf + """ + skip_if_missing_runtime_dependencies( + python_modules=("termcolor",), + binaries=("redis-server",), + require_zeek_or_bro=True, + ) + redis_port = integration_port_factory("redis") + config_file = TEST_DIR / "test.yaml" + modify_yaml_config( + output_filename=config_file.name, + output_dir=TEST_DIR, + changes={ + "DisabledAlerts": { + "disabled_detections": ["ConnectionWithoutDNS"] + }, + "detection": {"evidence_detection_threshold": 0.1}, + "parameters": { + "analysis_direction": "all", + "delete_zeek_files": True, + "store_zeek_files_in_the_output_dir": False, + "label": "malicious", + "time_window_width": "only_one_tw", + "store_a_copy_of_zeek_files": True, + }, + "modules": { + "disable": [ + "template", + "ensembling", + "flow_ml_detection", + "feeds_update_manager", + ] + }, + }, + ) + output_dir = create_output_dir(output_dir) + success = False + try: + output_file = os.path.join(output_dir, "slips_output.txt") + command = get_slips_test_command( + f"-t -e 1 -f {pcap_path} -o {output_dir} -c {config_file} " + f"-P {redis_port}" + ) + command = f"{command} > {output_file} 2>&1" + print("running slips ...") + # this function returns when slips is done + run_slips(command) + print("Slip is done, checking for errors in the output dir.") + assert_no_errors(output_dir) + print("Comparing profiles with expected profiles") + database = ModuleFactory().create_db_manager_obj( + redis_port, output_dir=output_dir, start_redis_server=False + ) + profiles = database.get_profiles_len() + # expected_profiles is more than 50 because we're using direction = all + assert profiles > expected_profiles + print("Checking for a random evidence") + log_file = output_dir / "alerts" / alerts_file + + # testing disabled_detections param in the configuration file + disabled_evidence = "a connection without DNS resolution" + assert is_evidence_present(log_file, disabled_evidence) is False + print("Testing time_window_width param.") + # testing time_window_width param in the configuration file + assert check_for_text( + "115740 days 17 hrs 46 mins 39 seconds", output_dir + ) + + print("Make sure slips didn't delete zeek files.") + # test delete_zeek_files param + assert "zeek_files_test7-malicious" not in os.listdir() + print("Test storing a copy of zeek files.") + # test store_a_copy_of_zeek_files + assert "zeek_files" in os.listdir(output_dir) + print("Checking metadata directory") + # test metadata_dir + assert "metadata" in os.listdir(output_dir) + metadata_path = os.path.join(output_dir, "metadata") + for file in ("test.yaml", "whitelist.conf", "info.txt"): + print(f"checking if {file} in the metadata path {metadata_path}") + assert file in os.listdir(metadata_path) + + print("Checking malicious label count") + # test label=malicious + assert get_label_count_from_output_db(output_dir, "malicious") > 370 + # test disable + for module in ["template", "flow_ml_detection"]: + print(f"Checking if {module} is disabled") + assert check_for_text(module, output_dir) + success = True + finally: + if success: + close_test_redis_server(redis_port) + shutil.rmtree(output_dir) + os.remove(config_file) + + +@pytest.mark.parametrize( + "pcap_path, expected_profiles, output_dir", + [ + ( + "dataset/test8-malicious.pcap ", + 1, + "pcap_test_conf2/", + ) + ], +) +def test_conf_file2( + pcap_path, expected_profiles, output_dir, integration_port_factory +): + """ + In this test we're using tests/test2.conf + """ + skip_if_missing_runtime_dependencies( + python_modules=("termcolor",), + binaries=("redis-server",), + require_zeek_or_bro=True, + ) + redis_port = integration_port_factory("redis") + config_file = TEST_DIR / "test2.yaml" + modify_yaml_config( + output_filename=config_file.name, + output_dir=TEST_DIR, + changes={ + "detection": {"evidence_detection_threshold": 0.1}, + "parameters": { + "metadata_dir": False, + "store_zeek_files_in_the_output_dir": False, + }, + "modules": { + "disable": [ + "template", + "ensembling", + "flow_ml_detection", + "feeds_update_manager", + ] + }, + }, + ) + + output_dir = create_output_dir(output_dir) + success = False + try: + output_file = os.path.join(output_dir, "slips_output.txt") + command = get_slips_test_command( + f"-t -e 1 -f {pcap_path} -o {output_dir} -c {config_file} " + f"-P {redis_port}" + ) + command = f"{command} > {output_file} 2>&1" + print("running slips ...") + run_slips(command) + print("Slip is done, checking for errors in the output dir.") + assert_no_errors(output_dir) + success = True + finally: + if success: + close_test_redis_server(redis_port) + shutil.rmtree(output_dir) + os.remove(config_file) diff --git a/tests/integration/test_dataset.py b/tests/integration/test_dataset.py deleted file mode 100644 index 8034d1f5b..000000000 --- a/tests/integration/test_dataset.py +++ /dev/null @@ -1,181 +0,0 @@ -# SPDX-FileCopyrightText: 2021 Sebastian Garcia -# SPDX-License-Identifier: GPL-2.0-only -""" -This file tests all kinds of input in our dataset/ -It checks a random evidence and the total number of profiles in every file -""" - -from tests.common_test_utils import ( - run_slips, - is_evidence_present, - create_output_dir, - assert_no_errors, - msgs_published_are_eq_msgs_received_by_each_module, -) -from tests.module_factory import ModuleFactory -import pytest -import shutil -import os - -alerts_file = "alerts.log" - - -@pytest.mark.parametrize( - "binetflow_path, expected_profiles, expected_evidence, output_dir, redis_port", - [ - ( - "dataset/test4-malicious.binetflow", - 2, - "Horizontal port scan to port http-alt 81/tcp. From 192.168.2.12", - "test4/", - 6662, - ), - ( - "dataset/test3-mixed.binetflow", - 20, - "Horizontal port scan to port rdp 3389/tcp. From 46.166.151.160", - "test3/", - 6663, - ), - ( - "dataset/test2-malicious.binetflow", - 1, - "Long Connection.", - "test2/", - 6664, - ), - ( - "dataset/test5-mixed.binetflow", - 4, - "Long Connection", - "test5/", - 6655, - ), - # ( - # 'dataset/test11-portscan.binetflow', - # 0, - # 'ICMP scanning', - # 'test11/', - # 6669 - # ) - ], -) -def test_binetflow( - binetflow_path, - expected_profiles, - expected_evidence, - output_dir, - redis_port, -): - output_dir = create_output_dir(output_dir) - - output_file = os.path.join(output_dir, "slips_output.txt") - command = ( - f"./slips.py -e 1 -t " - f"-o {output_dir} " - f"-P {redis_port} " - f"-f {binetflow_path} " - f"> {output_file} 2>&1" - ) - # this function returns when slips is done - run_slips(command) - - assert_no_errors(output_dir) - - db = ModuleFactory().create_db_manager_obj( - redis_port, output_dir=output_dir, start_redis_server=False - ) - profiles = db.get_profiles_len() - assert profiles > expected_profiles - assert msgs_published_are_eq_msgs_received_by_each_module(db) - - log_file = os.path.join(output_dir, alerts_file) - assert is_evidence_present(log_file, expected_evidence) is True - shutil.rmtree(output_dir) - - -@pytest.mark.parametrize( - "suricata_path, output_dir, redis_port, expected_evidence", - [ - ( - "dataset/test6-malicious.suricata.json", - "test6/", - 6657, - [ - "Connection to unknown destination port", - "vertical port scan", - "Connecting to private IP", - ], - ) - ], -) -def test_suricata(suricata_path, output_dir, redis_port, expected_evidence): - output_dir = create_output_dir(output_dir) - output_file = os.path.join(output_dir, "slips_output.txt") - command = ( - f"./slips.py -e 1 -t " - f"-f {suricata_path} " - f"-o {output_dir} " - f"-P {redis_port} " - f"> {output_file} 2>&1" - ) - # this function returns when slips is done - run_slips(command) - - assert_no_errors(output_dir) - - db = ModuleFactory().create_db_manager_obj( - redis_port, output_dir=output_dir, start_redis_server=False - ) - profiles = db.get_profiles_len() - # todo the profiles should be way more than 10, maybe 76, but it varies - # each run, we need to sy why - assert profiles > 10 - assert msgs_published_are_eq_msgs_received_by_each_module(db) - - log_file = os.path.join(output_dir, alerts_file) - assert any(is_evidence_present(log_file, ev) for ev in expected_evidence) - shutil.rmtree(output_dir) - - -@pytest.mark.skipif( - "nfdump" not in shutil.which("nfdump"), reason="nfdump is not installed" -) -@pytest.mark.parametrize( - "nfdump_path, output_dir, redis_port", - [("dataset/test1-normal.nfdump", "test1/", 6656)], -) -def test_nfdump(nfdump_path, output_dir, redis_port): - """ - checks that slips is reading nfdump no issue, - the file is not malicious so there's no evidence that should be present - """ - output_dir = create_output_dir(output_dir) - - # expected_evidence = 'Connection to unknown destination port 902/TCP' - - output_file = os.path.join(output_dir, "slips_output.txt") - command = ( - f"./slips.py -e 1 -t " - f"-f {nfdump_path} " - f"-o {output_dir} " - f"-P {redis_port} " - f"> {output_file} 2>&1" - ) - # this function returns when slips is done - run_slips(command) - - db = ModuleFactory().create_db_manager_obj( - redis_port, output_dir=output_dir, start_redis_server=False - ) - profiles = db.get_profiles_len() - assert_no_errors(output_dir) - # make sure slips generated profiles for this file (can't - # put the number of profiles exactly because slips - # doesn't generate a const number of profiles per file) - assert profiles > 0 - assert msgs_published_are_eq_msgs_received_by_each_module(db) - - # log_file = os.path.join(output_dir, alerts_file) - # assert is_evidence_present(log_file, expected_evidence) == True - shutil.rmtree(output_dir) diff --git a/tests/integration/test_dataset/__init__.py b/tests/integration/test_dataset/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/tests/integration/test_dataset/test_dataset.py b/tests/integration/test_dataset/test_dataset.py new file mode 100644 index 000000000..010fe6a98 --- /dev/null +++ b/tests/integration/test_dataset/test_dataset.py @@ -0,0 +1,195 @@ +# SPDX-FileCopyrightText: 2021 Sebastian Garcia +# SPDX-License-Identifier: GPL-2.0-only +""" +This file tests all kinds of input in our dataset/ +It checks a random evidence and the total number of profiles in every file +""" + +from tests.common_test_utils import ( + run_slips, + is_evidence_present, + create_output_dir, + assert_no_errors, + close_test_redis_server, + get_slips_test_command, + skip_if_missing_runtime_dependencies, +) +from tests.module_factory import ModuleFactory +import pytest +import shutil +import os + +alerts_file = "alerts.log" + + +@pytest.mark.parametrize( + "binetflow_path, expected_profiles, expected_evidence, output_dir", + [ + ( + "dataset/test4-malicious.binetflow", + 2, + "Horizontal port scan to port http-alt 81/tcp. From 192.168.2.12", + "test4/", + ), + ( + "dataset/test3-mixed.binetflow", + 20, + "Horizontal port scan to port rdp 3389/tcp. From 46.166.151.160", + "test3/", + ), + ( + "dataset/test2-malicious.binetflow", + 1, + "Long Connection.", + "test2/", + ), + ( + "dataset/test5-mixed.binetflow", + 4, + "Long Connection", + "test5/", + ), + # ( + # 'dataset/test11-portscan.binetflow', + # 0, + # 'ICMP scanning', + # 'test11/', + # 6669 + # ) + ], +) +def test_binetflow( + binetflow_path, + expected_profiles, + expected_evidence, + output_dir, + integration_port_factory, +): + skip_if_missing_runtime_dependencies( + python_modules=("termcolor",), binaries=("redis-server",) + ) + redis_port = integration_port_factory("redis") + output_dir = create_output_dir(output_dir) + success = False + try: + output_file = os.path.join(output_dir, "slips_output.txt") + command = get_slips_test_command( + f"-e 1 -t -o {output_dir} -P {redis_port} -f {binetflow_path}" + ) + command = f"{command} > {output_file} 2>&1" + # this function returns when slips is done + run_slips(command) + + assert_no_errors(output_dir) + + database = ModuleFactory().create_db_manager_obj( + redis_port, output_dir=output_dir, start_redis_server=False + ) + profiles = database.get_profiles_len() + assert profiles > expected_profiles + + log_file = output_dir / "alerts" / alerts_file + assert is_evidence_present(log_file, expected_evidence) is True + success = True + finally: + if success: + close_test_redis_server(redis_port) + shutil.rmtree(output_dir) + + +@pytest.mark.parametrize( + "suricata_path, output_dir, expected_evidence", + [ + ( + "dataset/test6-malicious.suricata.json", + "test6/", + [ + "Connection to unknown destination port", + "vertical port scan", + "Connecting to private IP", + ], + ) + ], +) +def test_suricata( + suricata_path, + output_dir, + expected_evidence, + integration_port_factory, +): + skip_if_missing_runtime_dependencies( + python_modules=("termcolor",), binaries=("redis-server",) + ) + redis_port = integration_port_factory("redis") + output_dir = create_output_dir(output_dir) + success = False + try: + output_file = os.path.join(output_dir, "slips_output.txt") + command = get_slips_test_command( + f"-e 1 -t -f {suricata_path} -o {output_dir} -P {redis_port}" + ) + command = f"{command} > {output_file} 2>&1" + # this function returns when slips is done + run_slips(command) + + assert_no_errors(output_dir) + + database = ModuleFactory().create_db_manager_obj( + redis_port, output_dir=output_dir, start_redis_server=False + ) + profiles = database.get_profiles_len() + # todo the profiles should be way more than 10, maybe 76, but it varies + # each run, we need to sy why + assert profiles > 10 + + log_file = output_dir / "alerts" / alerts_file + assert any( + is_evidence_present(log_file, ev) for ev in expected_evidence + ) + success = True + finally: + if success: + close_test_redis_server(redis_port) + shutil.rmtree(output_dir) + + +@pytest.mark.skipif( + "nfdump" not in shutil.which("nfdump"), reason="nfdump is not installed" +) +@pytest.mark.parametrize( + "nfdump_path, output_dir", + [("dataset/test1-malicious.nfdump", "test1/")], +) +def test_nfdump(nfdump_path, output_dir, integration_port_factory): + """ + checks that slips is reading nfdump no issue, + the file is not malicious so there's no evidence that should be present + """ + skip_if_missing_runtime_dependencies( + python_modules=("termcolor",), binaries=("redis-server",) + ) + redis_port = integration_port_factory("redis") + output_dir = create_output_dir(output_dir) + success = False + try: + # expected_evidence = 'Connection to unknown destination port 902/TCP' + + output_file = os.path.join(output_dir, "slips_output.txt") + command = get_slips_test_command( + f"-e 1 -t -f {nfdump_path} -o {output_dir} -P {redis_port}" + ) + command = f"{command} > {output_file} 2>&1" + # this function returns when slips is done + run_slips(command) + + database = ModuleFactory().create_db_manager_obj( + redis_port, output_dir=output_dir, start_redis_server=False + ) + profiles = database.get_profiles_len() + assert_no_errors(output_dir) + assert profiles > 0 + success = True + finally: + if success: + close_test_redis_server(redis_port) + shutil.rmtree(output_dir) diff --git a/tests/integration/test_fides.py b/tests/integration/test_fides.py deleted file mode 100644 index 78ca1cc93..000000000 --- a/tests/integration/test_fides.py +++ /dev/null @@ -1,378 +0,0 @@ -""" -This file tests 2 different config files other than slips' default config/slips.yaml -test/test.yaml and tests/test2.yaml -""" - -import shutil -from pathlib import PosixPath - -import redis - -from modules.fidesModule.model.peer import PeerInfo -from modules.fidesModule.persistence.fides_sqlite_db import FidesSQLiteDB -from tests.common_test_utils import ( - create_output_dir, - assert_no_errors, -) -from tests.module_factory import ModuleFactory -import pytest -import os -import subprocess -import time -import sys -from unittest.mock import Mock -import modules.fidesModule.model.peer_trust_data as ptd - -# TODO -# from tests.common_test_utils import ( -# modify_yaml_config, -# ) - - -alerts_file = "alerts.log" - - -def ensure_redis_is_running(port): - redis_client = redis.StrictRedis(host="localhost", port=port, db=0) - try: - redis_client.ping() - return - except redis.exceptions.ConnectionError: - subprocess.check_call( - ["redis-server", "--port", str(port), "--daemonize", "yes"] - ) - - -def delete_file_if_exists(file_path): - if os.path.exists(file_path): - os.remove(file_path) - print(f"File '{file_path}' has been deleted.") - else: - print(f"File '{file_path}' does not exist.") - - -def countdown(seconds, message): - """ - counts down from the given number of seconds, printing a message each second. - """ - while seconds > 0: - sys.stdout.write( - f"\rSending {message} in {seconds} " - ) # overwrite the line - sys.stdout.flush() # ensures immediate output - time.sleep(1) # waits for 1 second - seconds -= 1 - sys.stdout.write(f"\rSending {message} now! \n") - - -def message_send(port): - # connect to redis database 0 - # channel = "fides2network" - channel = "network2fides" - message = """ - { - "type": "nl2tl_intelligence_response", - "version": 1, - "data": [ - { - "sender": { - "id": "peer1", - "organisations": ["org_123", "org_456"], - "ip": "192.168.1.1" - }, - "payload": { - "intelligence": { - "target": {"type": "server", "value": "192.168.1.10"}, - "confidentiality": {"level": 0.8}, - "score": 0.5, - "confidence": 0.95 - }, - "target": "stratosphere.org" - } - }, - { - "sender": { - "id": "peer2", - "organisations": ["org_789"], - "ip": "192.168.1.2" - }, - "payload": { - "intelligence": { - "target": {"type": "workstation", "value": "192.168.1.20"}, - "confidentiality": {"level": 0.7}, - "score": -0.85, - "confidence": 0.92 - }, - "target": "stratosphere.org" - } - } - ] - } - """ - redis_client = redis.StrictRedis(host="localhost", port=port, db=0) - # publish the message to the "network2fides" channel - redis_client.publish(channel, message) - - print(f"Test message published to channel '{channel}'.") - - -def message_receive(port): - import redis - import json - - # connect to redis database 0 - redis_client = redis.StrictRedis(host="localhost", port=port, db=0) - - # define a callback function to handle received messages - def message_handler(message): - if message["type"] == "message": # ensure it's a message type - data = message["data"].decode("utf-8") # decode byte data - print("Received message:") - print( - json.dumps(json.loads(data), indent=4) - ) # pretty-print JSON message - - # subscribe to the "fides2slips" channel - pubsub = redis_client.pubsub() - pubsub.subscribe("fides2network") - - print("Listening on the 'fides2network' channel. Waiting for messages...") - - # process one message - for message in pubsub.listen(): - message_handler(message) - break # exit after processing one message - - -def get_main_interface(): - try: - out = subprocess.check_output( - ["ip", "-o", "route", "show", "default"], text=True - ) - return out.split(" dev ")[1].split()[0] - except Exception: - return None - - -@pytest.mark.parametrize( - "path, output_dir, redis_port", - [ - ( - "dataset/test13-malicious-dhcpscan-zeek-dir", - "fides_test_conf_file2/", - 6644, - ) - ], -) -def test_conf_file2(path, output_dir, redis_port): - """ - In this test we're using tests/integration/config/fides_config.yaml as fides - config file - """ - ensure_redis_is_running(redis_port) - output_dir: PosixPath = create_output_dir(output_dir) - output_file = os.path.join(output_dir, "slips_output.txt") - command = [ - "./slips.py", - "-t", - "-g", - str(path), - # dummy interface required by -g - "-i", - str(get_main_interface()), - "-e", - "1", - "-o", - str(output_dir), - "-c", - "tests/integration/config/fides_config.yaml", - "-P", - str(redis_port), - ] - - print("running slips ...") - print(output_dir) - - # Open the log file in write mode - with open(output_file, "w") as log_file: - # Start the subprocess, redirecting stdout and stderr to the same file - process = subprocess.Popen( - command, # Replace with your command - stdout=log_file, - stderr=log_file, - ) - - print(f"Output and errors are logged in {output_file}") - countdown(40, "sigterm") - # send a SIGTERM to the process - os.kill(process.pid, 15) - print("SIGTERM sent. killing slips") - os.kill(process.pid, 9) - - message_receive(redis_port) - - print(f"Slips with PID {process.pid} was killed.") - - print("Slip is done, checking for errors in the output dir.") - assert_no_errors(output_dir) - print("Checking database") - db = ModuleFactory().create_db_manager_obj( - redis_port, output_dir=output_dir, start_redis_server=False - ) - # iris is supposed to be receiving this msg, that last thing fides does - # is send a msg to this channel for iris to receive it - assert db.get_msgs_received_at_runtime("Fides")["fides2network"] == "1" - assert db.get_msgs_received_at_runtime("Fides")["new_alert"] == "1" - print(db.get_msgs_received_at_runtime("Fides")) - - print("Deleting the output directory") - shutil.rmtree(output_dir, ignore_errors=True) - - -@pytest.mark.parametrize( - "path, output_dir, redis_port", - [ - ( - "dataset/test15-malicious-zeek-dir", - "fides_test_trust_recommendation_response/", - 6645, - ) - ], -) -def test_trust_recommendation_response(path, output_dir, redis_port): - """ - This test simulates a common situation in the global P2P system, where - Fides Module wanted to evaluate trust in an unknown peer and asked for - the opinion of other peers. - The known peers responded and Fides Module is processing the response. - Scenario: - - Fides did not know a peer whose ID is 'stratosphere.org' and have - asked for opinion of known peers: peer1 and peer2 - - The peers are responding in a message; see message in message_send() - - The message is processed + THE TEST ITSELF - - Preparation: - - Have a response to send to a correct channel (it would have been - done by Iris, here it is simulated) - - Inject peer1 and peer2 into the database - Fides Module must know - those peers, NOTE that Fides Module only asks for opinion from known - peers - - Run Slips (includes Fides Module) in a thread and wait for all - modules to start - - """ - ensure_redis_is_running(redis_port) - output_dir: PosixPath = create_output_dir(output_dir) - output_file = os.path.join(output_dir, "slips_output.txt") - command = [ - "./slips.py", - "-t", - "-g", - str(path), - # dummy interface required by -g - "-i", - str(get_main_interface()), - "-e", - "1", - "-o", - str(output_dir), - "-c", - "tests/integration/config/fides_config.yaml", - "-P", - str(redis_port), - ] - config_file_path = "modules/fidesModule/config/fides.conf.yml" - config_temp_path = "modules/fidesModule/config/fides.conf.yml.bak" - config_line = "database: 'fides_test_database.sqlite'\n" - shutil.copy(config_file_path, config_temp_path) - test_db = "fides_test_database.sqlite" - - try: - # Append the new line to the config - with open(config_file_path, "a") as file: - file.write(config_line) - - print("running slips ...") - print(output_dir) - - mock_logger = Mock() - mock_logger.print_line = Mock() - mock_logger.error = Mock() - print("Manipulating database") - fdb = FidesSQLiteDB(mock_logger, test_db) - fdb.store_peer_trust_data( - ptd.trust_data_prototype( - peer=PeerInfo( - id="peer1", - organisations=["org1", "org2"], - ip="192.168.1.1", - ), - has_fixed_trust=False, - ) - ) - fdb.store_peer_trust_data( - ptd.trust_data_prototype( - peer=PeerInfo( - id="peer2", organisations=["org2"], ip="192.168.1.2" - ), - has_fixed_trust=False, - ) - ) - - with open(output_file, "w") as log_file: - process = subprocess.Popen( - command, - stdout=log_file, - stderr=log_file, - ) - - print(f"Output and errors are logged in {output_file}") - - # these seconds are the time we wait for slips to start all the - # modules - countdown(60, "test message") - - # this msg simulates a msg sent by peers to the started - # slips instance - message_send(redis_port) - - # these 30s are the time we give slips to process the msg - countdown(30, "sigterm") - - # send a SIGTERM to the process - os.kill(process.pid, 15) - print("SIGTERM sent. killing slips") - os.kill(process.pid, 15) - - print(f"Slips with PID {process.pid} was killed.") - - print("Slip is done, checking for errors in the output dir.") - assert_no_errors(output_dir) - - print("Checking database") - db = ModuleFactory().create_db_manager_obj( - redis_port, output_dir=output_dir, start_redis_server=False - ) - - # assert db.get_msgs_received_at_runtime("Fides")["fides2network"] == "1" - - print("Checking Fides' data outlets") - assert fdb.get_peer_trust_data("peer1").service_history != [] - assert fdb.get_peer_trust_data("peer2").service_history != [] - assert fdb.get_peer_trust_data("peer1").service_history_size == 1 - assert fdb.get_peer_trust_data("peer2").service_history_size == 1 - assert db.get_cached_network_opinion( - "stratosphere.org", 200000000000, 200000000000 - ) == { - "target": "stratosphere.org", - "score": "0.0", - "confidence": "0.0", - } - - print("Deleting the output directory") - shutil.rmtree(output_dir) - finally: - # Restore the original file - os.remove(test_db) - shutil.move(config_temp_path, config_file_path) - print("Config file restored to original state.") diff --git a/tests/integration/test_fides/__init__.py b/tests/integration/test_fides/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/tests/integration/config/fides.conf.yml b/tests/integration/test_fides/fides.conf.yml similarity index 100% rename from tests/integration/config/fides.conf.yml rename to tests/integration/test_fides/fides.conf.yml diff --git a/tests/integration/config/fides_config.yaml b/tests/integration/test_fides/fides_config.yaml similarity index 98% rename from tests/integration/config/fides_config.yaml rename to tests/integration/test_fides/fides_config.yaml index 52d748df2..00618fd6f 100644 --- a/tests/integration/config/fides_config.yaml +++ b/tests/integration/test_fides/fides_config.yaml @@ -170,7 +170,7 @@ modules: # List of modules to ignore. By default we always ignore the template! do not remove it from the list # Names of other modules that you can disable (they all should be lowercase with no special characters): # threatintelligence, blocking, networkdiscovery, timeline, virustotal, - # rnnccdetection, flowmldetection, updatemanager + # rnnccdetection, flow_ml_detection, updatemanager disable: [template, updatemanager] # For each line in timeline file there is a timestamp. @@ -180,8 +180,8 @@ modules: ############################# -flowmldetection: - # The mode 'train' should be used to tell the flowmldetection module +flow_ml_detection: + # The mode 'train' should be used to tell the flow_ml_detection module # that the flows received are all for training. # A label should be provided in the [Parameters] section # mode : train @@ -206,7 +206,7 @@ virustotal: ############################# threatintelligence: - # by default, slips starts without the TI files, and runs the Update Manager in the background + # by default, slips starts without the TI files, and runs the feeds_update_manager in the background # if thi option is set to yes, slips will not start untill the update manager is done # and all TI files are loaded successfully # this is usefull if you want to ensure that slips doesn't miss the detection of any blacklisted IPs @@ -264,7 +264,7 @@ threatintelligence: update_period : 604800 ############################# -flowalerts: +flow_alerts: # we need a thrshold to determine a long connection. in slips by default is. long_connection_threshold : 1500 @@ -323,7 +323,7 @@ exporting_alerts: taxii_password : admin ############################# -CESNET: +cesnet: # Slips supports exporting and importing evidence in the IDEA format to/from warden servers. send_alerts : False diff --git a/tests/integration/test_fides/test_fides.py b/tests/integration/test_fides/test_fides.py new file mode 100644 index 000000000..0d08712f0 --- /dev/null +++ b/tests/integration/test_fides/test_fides.py @@ -0,0 +1,533 @@ +""" +This file tests 2 different config files other than slips' default config/slips.yaml +test/test.yaml and tests/test2.yaml +""" + +import json +import shutil +from pathlib import PosixPath, Path +import signal + +import redis + +from modules.fides.messaging.network_bridge import NetworkBridge +from modules.fides.model.peer import PeerInfo +from modules.fides.persistence.fides_sqlite_db import FidesSQLiteDB +from tests.common_test_utils import ( + create_output_dir, + assert_no_errors, + close_test_redis_server, + modify_yaml_config, +) +from tests.module_factory import ModuleFactory +import pytest +import os +import subprocess +import time +import sys +from unittest.mock import Mock +import modules.fides.model.peer_trust_data as ptd + +# TODO +# from tests.common_test_utils import ( +# modify_yaml_config, +# ) + + +alerts_file = "alerts.log" +TEST_DIR = Path(__file__).resolve().parent +FIDES_CONFIG_FILENAME = "fides_runtime.conf.yml" +SLIPS_CONFIG_FILENAME = "fides_runtime_slips.yaml" + + +def delete_file_if_exists(file_path): + if os.path.exists(file_path): + os.remove(file_path) + print(f"File '{file_path}' has been deleted.") + else: + print(f"File '{file_path}' does not exist.") + + +def countdown(seconds, message): + """ + counts down from the given number of seconds, printing a message each second. + """ + while seconds > 0: + sys.stdout.write( + f"\rSending {message} in {seconds} " + ) # overwrite the line + sys.stdout.flush() # ensures immediate output + time.sleep(1) # waits for 1 second + seconds -= 1 + sys.stdout.write(f"\rSending {message} now! \n") + + +def message_send(port): + # connect to redis database 0 + # channel = "fides2network" + channel = "network2fides" + message = """ + { + "type": "nl2tl_intelligence_response", + "data": [ + { + "sender": { + "id": "peer1", + "organisations": ["org_123", "org_456"], + "ip": "192.168.1.1" + }, + "payload": { + "intelligence": { + "target": {"type": "server", "value": "192.168.1.10"}, + "confidentiality": {"level": 0.8}, + "score": 0.5, + "confidence": 0.95 + }, + "target": "stratosphere.org" + } + }, + { + "sender": { + "id": "peer2", + "organisations": ["org_789"], + "ip": "192.168.1.2" + }, + "payload": { + "intelligence": { + "target": {"type": "workstation", "value": "192.168.1.20"}, + "confidentiality": {"level": 0.7}, + "score": -0.85, + "confidence": 0.92 + }, + "target": "stratosphere.org" + } + } + ] + } + """ + # Fides expects the network protocol version, not the Slips package version. + message = json.loads(message) + message.update({"version": NetworkBridge.version}) + message = json.dumps(message) + + redis_client = redis.StrictRedis(host="localhost", port=port, db=0) + # publish the message to the "network2fides" channel + redis_client.publish(channel, message) + + print(f"Test message published to channel '{channel}'.") + + +def message_receive(port): + import redis + import json + + # connect to redis database 0 + redis_client = redis.StrictRedis(host="localhost", port=port, db=0) + + # define a callback function to handle received messages + def message_handler(message): + if message["type"] == "message": # ensure it's a message type + data = message["data"].decode("utf-8") # decode byte data + print("Received message:") + print( + json.dumps(json.loads(data), indent=4) + ) # pretty-print JSON message + + # subscribe to the "fides2slips" channel + pubsub = redis_client.pubsub() + pubsub.subscribe("fides2network") + + print("Listening on the 'fides2network' channel. Waiting for messages...") + + # process one message + for message in pubsub.listen(): + message_handler(message) + break # exit after processing one message + + +def stop_process_group(process, process_name, timeout_seconds=15): + """ + Stop a spawned process group and wait for it to exit. + + Parameters: + process: subprocess.Popen instance to stop. + process_name: Human-readable name used in log messages. + timeout_seconds: Maximum number of seconds to wait after SIGTERM. + + Returns: + None + """ + if process.poll() is not None: + return + + process_group_id = os.getpgid(process.pid) + os.killpg(process_group_id, signal.SIGTERM) + print(f"SIGTERM sent to {process_name} process group {process_group_id}.") + + try: + process.wait(timeout=timeout_seconds) + return + except subprocess.TimeoutExpired: + pass + + if process.poll() is not None: + return + + os.killpg(process_group_id, signal.SIGKILL) + process.wait() + print(f"SIGKILL sent to {process_name} process group {process_group_id}.") + + +def wait_for_runtime_message_count( + redis_port: int, + output_dir: Path, + module_name: str, + channel: str, + expected_count: str, + timeout_seconds: int = 30, +) -> dict: + """ + Wait for a module runtime message counter to reach an expected value. + + Parameters: + redis_port: Redis port used by the running Slips instance. + output_dir: Output directory associated with the running test. + module_name: Module whose runtime counters are being checked. + channel: Runtime counter key to wait for. + expected_count: Expected counter value stored in Redis. + timeout_seconds: Maximum time to wait before failing. + + Returns: + dict: Latest runtime counters for the module. + """ + deadline = time.time() + timeout_seconds + latest_counters = {} + + while time.time() < deadline: + db = ModuleFactory().create_db_manager_obj( + redis_port, output_dir=output_dir, start_redis_server=False + ) + latest_counters = db.get_msgs_received_at_runtime(module_name) or {} + if latest_counters.get(channel) == expected_count: + return latest_counters + time.sleep(1) + + raise AssertionError( + f"Timed out waiting for {module_name} runtime counter " + f"{channel} to reach {expected_count}. Latest counters: " + f"{latest_counters}" + ) + + +def get_main_interface(): + try: + out = subprocess.check_output( + ["ip", "-o", "route", "show", "default"], text=True + ) + return out.split(" dev ")[1].split()[0] + except Exception: + return None + + +def get_runtime_config_dir(output_dir_name: str) -> Path: + """ + Return the runtime config directory for a Fides integration test. + + Parameters: + output_dir_name: Name of the Slips output directory for the test. + + Returns: + Path: Directory where generated runtime configs should be stored. + """ + return TEST_DIR / "runtime_configs" / output_dir_name + + +def create_runtime_fides_configs( + output_dir: Path, db_name: str +) -> tuple[Path, Path]: + """ + Create isolated Slips and Fides config files for an integration test. + + Parameters: + output_dir: Test output directory used to derive the runtime config + location. + db_name: Database filename to be created under the permanent directory. + + Returns: + tuple: Generated Slips config path and permanent DB path. + """ + config_dir = get_runtime_config_dir(output_dir.name) + config_dir.mkdir(parents=True, exist_ok=True) + + runtime_fides_config = modify_yaml_config( + input_path="modules/fides/config/fides.conf.yml", + output_dir=config_dir, + output_filename=FIDES_CONFIG_FILENAME, + changes={"database": db_name}, + ) + runtime_slips_config = modify_yaml_config( + input_path=str(TEST_DIR / "fides_config.yaml"), + output_dir=config_dir, + output_filename=SLIPS_CONFIG_FILENAME, + changes={ + "global_p2p": { + "fides_conf": str(runtime_fides_config), + } + }, + ) + + return runtime_slips_config, Path("permanent") / db_name + + +@pytest.mark.parametrize( + "path, output_dir", + [ + ( + "dataset/test13-malicious-dhcpscan-zeek-dir", + "fides_test_conf_file2/", + ) + ], +) +def test_conf_file2(path, output_dir, integration_port_factory): + """ + In this test we're using the local fides integration config file. + """ + redis_port = integration_port_factory("redis") + output_dir: PosixPath = create_output_dir(output_dir) + db_name = f"{output_dir.name}_fides_p2p_db.sqlite" + slips_config, test_db = create_runtime_fides_configs(output_dir, db_name) + output_file = os.path.join(output_dir, "slips_output.txt") + command = [ + sys.executable, + "./slips.py", + "-t", + "-g", + str(path), + # dummy interface required by -g + "-i", + str(get_main_interface()), + "-e", + "1", + "-o", + str(output_dir), + "-c", + str(slips_config), + "-P", + str(redis_port), + ] + success = False + process = None + try: + print("running slips using output dir...") + print(output_dir) + + # Open the log file in write mode + with open(output_file, "w") as log_file: + # Start the subprocess, redirecting stdout and stderr to the same file + process = subprocess.Popen( + command, # Replace with your command + stdout=log_file, + stderr=log_file, + start_new_session=True, + ) + + print(f"Output and errors are logged in {output_file}") + countdown(40, "sigterm") + runtime_counters = wait_for_runtime_message_count( + redis_port, + output_dir, + "fides", + "fides2network", + "1", + ) + stop_process_group(process, "fides slips") + + print(f"Slips with PID {process.pid} was killed.") + + print("Slips is done, checking for errors in the output dir.") + assert_no_errors(output_dir) + print("Checking database") + # db = ModuleFactory().create_db_manager_obj( + # redis_port, output_dir=output_dir, start_redis_server=False + # ) + # iris is supposed to be receiving this msg, that last thing fides does + # is send a msg to this channel for iris to receive it + assert runtime_counters["fides2network"] == "1" + assert runtime_counters["new_alert"] == "1" + print(runtime_counters) + success = True + finally: + if process is not None and process.poll() is None: + stop_process_group(process, "fides slips") + close_test_redis_server(redis_port) + if test_db.exists(): + test_db.unlink() + shutil.rmtree( + get_runtime_config_dir(output_dir.name), ignore_errors=True + ) + if success: + print("Deleting the output directory") + shutil.rmtree(output_dir, ignore_errors=True) + + +@pytest.mark.parametrize( + "path, output_dir", + [ + ( + "dataset/test15-malicious-zeek-dir", + "fides_test_trust_recommendation_response/", + ) + ], +) +def test_trust_recommendation_response( + path, output_dir, integration_port_factory +): + """ + This test simulates a common situation in the global P2P system, where + Fides Module wanted to evaluate trust in an unknown peer and asked for + the opinion of other peers. + The known peers responded and Fides Module is processing the response. + + Scenario: + - Fides did not know a peer whose ID is 'stratosphere.org' and have + asked for opinion of known peers: peer1 and peer2 + - The peers are responding in a message; see message in message_send() + - The message is processed + THE TEST ITSELF + + Preparation: + - Have a response to send to a correct channel (it would have been + done by Iris, here it is simulated) + - Inject peer1 and peer2 into the database - Fides Module must know + those peers, NOTE that Fides Module only asks for opinion from known + peers + - Run Slips (includes Fides Module) in a thread and wait for all + modules to start + """ + redis_port = integration_port_factory("redis") + output_dir: PosixPath = create_output_dir(output_dir) + db_name = f"{output_dir.name}_fides_test_database.sqlite" + print(f"db_name: {db_name}") + + slips_config, permanent_db = create_runtime_fides_configs( + output_dir, db_name + ) + print(f"slips_config: {slips_config} permanent_db: {permanent_db}") + + output_file = os.path.join(output_dir, "slips_output.txt") + print(f"output_file: {output_file}") + command = [ + sys.executable, + "./slips.py", + "-t", + "-g", + str(path), + # dummy interface required by -g + "-i", + str(get_main_interface()), + "-e", + "1", + "-o", + str(output_dir), + "-c", + str(slips_config), + "-P", + str(redis_port), + ] + # success = False + process = None + + print(f"command: {' '.join(command)}") + + # try: + print("running slips with output dir: ...") + print(output_dir) + + mock_logger = Mock() + mock_logger.print_line = Mock() + mock_logger.error = Mock() + print( + "Manipulating database: Inject peer1 and peer2 into the " + "database - Fides Module must know those peers" + ) + fdb = FidesSQLiteDB(mock_logger, str(permanent_db)) + fdb.store_peer_trust_data( + ptd.trust_data_prototype( + peer=PeerInfo( + id="peer1", + organisations=["org1", "org2"], + ip="192.168.1.1", + ), + has_fixed_trust=False, + ) + ) + fdb.store_peer_trust_data( + ptd.trust_data_prototype( + peer=PeerInfo( + id="peer2", organisations=["org2"], ip="192.168.1.2" + ), + has_fixed_trust=False, + ) + ) + + with open(output_file, "w") as log_file: + process = subprocess.Popen( + command, + stdout=log_file, + stderr=log_file, + start_new_session=True, + ) + + print(f"Output and errors are logged in {output_file}") + + # these seconds are the time we wait for slips to start all the + # modules + countdown(60, "test message") + + # this msg simulates a msg sent by peers to the started + # slips instance + message_send(redis_port) + + # these 30s are the time we give slips to process the msg + countdown(30, "sigterm") + stop_process_group(process, "fides slips") + + print(f"Slips with PID {process.pid} was killed.") + + print("Slips is done, checking for errors in the output dir.") + assert_no_errors(output_dir) + + print("Checking database") + db = ModuleFactory().create_db_manager_obj( + redis_port, output_dir=output_dir, start_redis_server=False + ) + + # assert db.get_msgs_received_at_runtime("fides")["fides2network"] == "1" + print("Checking Fides' data outlets") + + assert fdb.get_peer_trust_data("peer1").service_history != [] + assert fdb.get_peer_trust_data("peer2").service_history != [] + assert fdb.get_peer_trust_data("peer1").service_history_size == 1 + assert fdb.get_peer_trust_data("peer2").service_history_size == 1 + assert db.get_cached_network_opinion( + "stratosphere.org", 200000000000, 200000000000 + ) == { + "target": "stratosphere.org", + "score": "0.0", + "confidence": "0.0", + } + # success = True + # except: + # pass + + # finally: + # if process is not None and process.poll() is None: + # stop_process_group(process, "fides slips") + # close_test_redis_server(redis_port) + # if permanent_db.exists(): + # permanent_db.unlink() + # shutil.rmtree( + # get_runtime_config_dir(output_dir.name), ignore_errors=True + # ) + # if success: + # print("Deleting the output directory") + # shutil.rmtree(output_dir) diff --git a/tests/integration/test_iris.py b/tests/integration/test_iris.py deleted file mode 100644 index 5ff2c4d54..000000000 --- a/tests/integration/test_iris.py +++ /dev/null @@ -1,311 +0,0 @@ -""" -This file tests 2 different config files other than slips' default config/slips.yaml -test/test.yaml and tests/test2.yaml -""" - -import re -import shutil -from pathlib import PosixPath - -import redis - -from tests.common_test_utils import ( - create_output_dir, - assert_no_errors, - modify_yaml_config, -) -import pytest -import os -import subprocess -import time -import sys - -alerts_file = "alerts.log" - - -def countdown(seconds, message): - """ - counts down from the given number of seconds, printing a message each second. - """ - while seconds > 0: - sys.stdout.write( - f"\rSending {message} in {seconds} " - ) # overwrite the line - sys.stdout.flush() # ensures immediate output - time.sleep(1) # waits for 1 second - seconds -= 1 - sys.stdout.write(f"\rSending {message} now! \n") - - -def message_send(port, channel, message): - # connect to redis database 0 - redis_client = redis.StrictRedis(host="localhost", port=port, db=0) - - # publish the message to the "network2fides" channel - redis_client.publish(channel, message) - - print(f"Test message published to channel '{channel}'.") - - -message_alert_TL_NL = """{ - "type": "tl2nl_alert", - "version": 1, - "data": { - "payload": "https://www.youtube.com/watch?v=dQw4w9WgXcQ" - } -}""" - - -message_alert_NL_S = """{ - "type": "nl2tl_alert", - "version": 1, - "data": - "sender": "" - "payload": "https://www.youtube.com/watch?v=dQw4w9WgXcQ" -}""" - - -def check_strings_in_file(string_list, file_path): - # Check if the file exists - if not os.path.exists(file_path): - print(f"File {file_path} does not exist.") - return False - - # Open the file and read its content - try: - with open(file_path, "r") as file: - file_content = file.read() - - # Check if all strings in the list are present in the file content - for string in string_list: - if string not in file_content: - return False - return True - - except Exception as e: - print(f"Error reading file: {e}") - return False - - -@pytest.mark.parametrize( - "zeek_dir_path, output_dir, peer_output_dir, redis_port, peer_redis_port", - [ - ( - "dataset/test13-malicious-dhcpscan-zeek-dir", - "iris_integration_test/", - "peer_iris_integration_test/", - 6644, - 6655, - ) - ], -) -def test_messaging( - zeek_dir_path, output_dir, peer_output_dir, redis_port, peer_redis_port -): - """ - Tests whether Iris properly distributes an alert message generated by - Slips to the network (~other peers). - - First Slips instance is a general node in the network, its connection - string is generated and extracted from logs as a normal user would do, - in a very standard use case. - - The second instance of Slips acts as a normal-user-peer that joins the - network via the aforementioned Slips instance, - which extends the standard use case of connecting to such P2P network. - """ - # Two Slips instances are necessary to be run in this test. - # Prepare output dir for the main Slips instance. - # The logs of both beers will be clearly separated and kept intact. - output_dir: PosixPath = create_output_dir(output_dir) - output_file = os.path.join(output_dir, "slips_output.txt") - - # Prepare output dir for the main Slips instance. - # The logs of both beers will be clearly separated and kept intact. - output_dir_peer: PosixPath = create_output_dir(peer_output_dir) - output_file_peer = os.path.join(output_dir_peer, "slips_output.txt") - - # this will be used for the extraction of the connection string form the - # logs of iris running under the main Slips - log_file_first_iris = output_dir / "iris/iris_logs.txt" - log_file_second_iris = output_dir_peer / "iris/iris_logs.txt" - - # generate config of first peer - slips_iris_main_config_file = ( - "tests/integration/config/slips_iris_main.yaml" - ) - modify_yaml_config( - input_path="config/slips.yaml", - output_dir=os.path.dirname(slips_iris_main_config_file), - output_filename=os.path.basename(slips_iris_main_config_file), - changes={ - "global_p2p": {"use_global_p2p": True}, - "modules": {"disable": ["template", "updatemanager"]}, - }, - ) - - # that config file will be generated later to be able to add the first - # peer's id to it - iris_peer_config_file = "tests/integration/config/iris_peer_config.yaml" - - # generate config of second peer - iris_config_file = "tests/integration/config/iris_config.yaml" - modify_yaml_config( - input_path="config/slips.yaml", - output_dir=os.path.dirname(iris_config_file), - output_filename=os.path.basename(iris_config_file), - changes={ - "global_p2p": { - "use_global_p2p": True, - "iris_conf": iris_peer_config_file, - }, - "modules": {"disable": ["template", "updatemanager"]}, - }, - ) - - print("running slips ...") - with open(output_file, "w") as log_file: - with open(output_file_peer, "w") as iris_log_file: - # Start the subprocess, redirecting stdout and stderr - # to the same file - # command for the main Slips instance - command = [ - "./slips.py", - "-t", - "-g", - str(zeek_dir_path), - # dummy interface required by -g - "-i", - "eth0", - "-e", - "1", - "-o", - str(output_dir), - "-c", - slips_iris_main_config_file, # we're using the dafult peer - # config here - "-P", - str(redis_port), - ] - process = subprocess.Popen( - command, - stdout=log_file, - stderr=log_file, - ) - - # First peer (its Iris) needs to be ready and available for - # connections when the second peer tries to reach out to it. - countdown(20, "second peer") - # get the connection string from the first peer and give it - # to the second one so it is reachable - with open(log_file_first_iris, "r") as log: - for line in log: - match = re.search(r"connection string:\s+'(.+)'", line) - if match: - original_conn_string = match.group(1) - break - else: - # if it comes here make sure that port 9010 used by - # iris is free - # sudo lsof -i :9010 - # sudo kill -9 - print("No connection string found in log file.") - exit(1) - - # put the PeerID in the config file of the second peer's Iris - # the goal is for the second iris to be able to find the first - # iris/slips - modify_yaml_config( - input_path="config/iris_config.yaml", - output_dir=os.path.dirname(iris_peer_config_file), - output_filename=os.path.basename(iris_peer_config_file), - changes={ - "Redis": {"Port": 6655}, - "Server": {"Port": 9006}, - "PeerDiscovery": { - "ListOfMultiAddresses": [original_conn_string] - }, - "Identity": {"KeyFile": "second.priv"}, - }, - ) - # generate a second command for the second peer - peer_command = [ - "./slips.py", - "-t", - "-g", - str(zeek_dir_path), - # dummy interface required by -g - "-i", - "eth0", - "-e", - "1", - "-o", - str(output_dir_peer), - "-c", - iris_config_file, # we're not using the dafult peer config - # here - "-P", - str(peer_redis_port), - ] - peer_process = subprocess.Popen( - peer_command, stdout=iris_log_file, stderr=iris_log_file - ) - - print( - f"Output and errors of first peer are logged in" - f" {output_file}" - ) - - # let Slips properly and fully star with all of its parts and modules. - countdown(80, "Sending msg in fides2network") - # Sending a manual message to make sure there is an alert generated, because - # is is highly probable that both slips have covered their network captures - # before the infrastructure of P2P network was fully up and running - message_send( - redis_port, - message=message_alert_TL_NL, - channel="fides2network", - ) - - # these seconds are the time we give slips to process the msg - countdown(30, "Sending SIGTERM to the 2 peers") - # Kill em with kindness. - os.kill(process.pid, 15) - os.kill(peer_process.pid, 15) - print("SIGTERM sent.") - - print("Sending SIGKILL to the 2 instances of Slips + iris") - # Kill em. Without kindness. - os.kill(process.pid, 9) - print(f"Slips with PID {process.pid} was killed.") - - os.kill(peer_process.pid, 9) - print(f"Slips peer with PID {peer_process.pid} was killed.") - - print("Slips is done, checking for errors in the 2 output dirs.") - assert_no_errors(output_dir) - assert_no_errors(output_dir_peer) - - print("Checking for iris expected logs in the generated log file") - # make sure this string is there in the generated iris logs - # this is how we ensure that iris ran correctly - expected_log_entry = [ - "INFO iris protocols/alert.go:111 received p2p alert message" - ] - assert check_strings_in_file(expected_log_entry, log_file_second_iris) - - print("Deleting the output directories") - shutil.rmtree(output_dir) - shutil.rmtree(output_dir_peer) - os.remove("modules/irisModule/second.priv") - modify_yaml_config( - input_path="config/iris_config.yaml", - output_dir=os.path.dirname(iris_peer_config_file), - output_filename=os.path.basename(iris_peer_config_file), - changes={ - "Redis": {"Port": 6644}, - "Server": {"Port": 9010}, - "PeerDiscovery": {}, - "Identity": {"KeyFile": "private.key"}, - }, - ) diff --git a/tests/integration/test_iris/__init__.py b/tests/integration/test_iris/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/tests/integration/test_iris/peer1_config/iris.yaml b/tests/integration/test_iris/peer1_config/iris.yaml new file mode 100644 index 000000000..e623c0447 --- /dev/null +++ b/tests/integration/test_iris/peer1_config/iris.yaml @@ -0,0 +1,13 @@ +Identity: + GenerateNewKey: true +PeerDiscovery: + DisableBootstrappingNodes: true + ListOfMultiAddresses: [] +Redis: + Host: 127.0.0.1 + Port: 6644 + Tl2NlChannel: iris_internal +Server: + DhtServerMode: 'true' + Host: null + Port: 9010 diff --git a/tests/integration/config/slips_iris_main.yaml b/tests/integration/test_iris/peer1_config/slips.yaml similarity index 67% rename from tests/integration/config/slips_iris_main.yaml rename to tests/integration/test_iris/peer1_config/slips.yaml index b68632ca9..81977b53a 100644 --- a/tests/integration/config/slips_iris_main.yaml +++ b/tests/integration/test_iris/peer1_config/slips.yaml @@ -1,8 +1,5 @@ -CESNET: - configuration_file: config/warden.conf - receive_alerts: false - receive_delay: 86400 - send_alerts: false +Debug: + generate_performance_plots: false DisabledAlerts: disabled_detections: [] Docker: @@ -12,61 +9,95 @@ Profiling: cpu_profiler_dev_mode_entries: 500000 cpu_profiler_enable: false cpu_profiler_mode: dev - cpu_profiler_multiprocess: false + cpu_profiler_multiprocess: true cpu_profiler_output_limit: 20 cpu_profiler_sampling_interval: 20 memory_profiler_enable: false memory_profiler_mode: live memory_profiler_multiprocess: true +anomaly_detection_https: + adaptation_score_threshold: 2.0 + adwin_clock: 1 + adwin_delta: 0.01 + adwin_grace_period: 5 + adwin_min_window_length: 5 + baseline_alpha: 0.5 + drift_alpha: 0.05 + empirical_threshold_quantile: 0.995 + flow_zscore_threshold: 3.5 + hourly_zscore_threshold: 3.0 + ja3_min_variants_per_server: 3 + log_verbosity: 3 + max_small_flow_anomalies: 1 + min_baseline_points: 6 + suspicious_alpha: 0.005 + training_alpha: 1 + training_fit_method: welford + training_hours: 2 + use_adwin_drift: true +brute_force_detector: + ssh_attempt_threshold: 9 +cesnet: + configuration_file: config/warden.conf + receive_alerts: false + receive_delay: 86400 + send_alerts: false detection: evidence_detection_threshold: 0.25 popup_alerts: false exporting_alerts: TAXII_server: localhost - collection_name: collection-a - discovery_path: /services/discovery-a + collection_name: Alerts + direct_export: true + direct_export_max_workers: 12 + direct_export_retry_backoff: 0.5 + direct_export_retry_max: 0 + direct_export_retry_max_delay: 5.0 + direct_export_workers: 4 + discovery_path: /taxii2/ export_to: [] - inbox_path: /services/inbox-a - jwt_auth_path: /management/auth port: 1234 push_delay: 3600 sensor_name: sensor1 slack_api_path: config/slack_bot_token_secret slack_channel_name: proj_slips_alerting_module - taxii_password: admin + taxii_password: changeme_before_installing_a_medallion_server + taxii_timeout: 10 taxii_username: admin + taxii_version: 2 use_https: false -flowalerts: +flow_alerts: data_exfiltration_threshold: 500 entropy_threshold: 5 long_connection_threshold: 1500 pastebin_download_threshold: 700 ssh_succesful_detection_threshold: 4290 -flowmldetection: +flow_ml_detection: mode: test global_p2p: bootstrapping_modules: - - fidesModule - - irisModule + - fides + - iris bootstrapping_node: false - iris_conf: config/iris_config.yaml + iris_conf: tests/integration/test_iris/peer1_config/iris.yaml use_global_p2p: true local_p2p: create_p2p_logfile: false use_p2p: false -modes: - logsfile: slips.log - stderr: errors.log - stdout: slips.log modules: disable: - template - updatemanager timeline_human_timestamp: true +output: + logs: slips.log + stderr: errors.log + stdout: slips.log parameters: analysis_direction: out client_ips: [] debug: 0 + default_rotation_interval: 1day deletePrevdb: true delete_zeek_files: false export_format: json @@ -76,8 +107,8 @@ parameters: label: normal metadata_dir: true pcapfilter: false + permanent_dir: permanent rotation: true - rotation_period: 1day store_a_copy_of_zeek_files: false store_zeek_files_in_the_output_dir: true tcp_inactivity_timeout: 60 @@ -96,6 +127,8 @@ threatintelligence: ssl_feeds: config/SSL_feeds.csv ti_files: config/TI_feeds.csv wait_for_TI_to_finish: false +update: + auto_update_slips: false virustotal: api_key_file: config/vt_api_key virustotal_update_period: 259200 diff --git a/tests/integration/config/iris_config.yaml b/tests/integration/test_iris/peer2_config/iris.yaml similarity index 86% rename from tests/integration/config/iris_config.yaml rename to tests/integration/test_iris/peer2_config/iris.yaml index 76625208f..04dbe8198 100644 --- a/tests/integration/config/iris_config.yaml +++ b/tests/integration/test_iris/peer2_config/iris.yaml @@ -1,14 +1,15 @@ Identity: GenerateNewKey: true -Server: - Port: 9010 - Host: 0.0.0.0 - DhtServerMode: 'true' -Redis: - Host: 127.0.0.1 - Port: 6379 - Tl2NlChannel: iris_internal + KeyFile: private.key PeerDiscovery: DisableBootstrappingNodes: false ListOfMultiAddresses: - /dns/melchior.slips.stratosphere.fel.cvut.cz/udp/6437/quic 12D3KooWJJa9PpMFVP7s3TQs2sedypJXxtMVkphRhgkjGH9EYMfM +Redis: + Host: 127.0.0.1 + Port: 6644 + Tl2NlChannel: iris_internal +Server: + DhtServerMode: 'true' + Host: null + Port: 9010 diff --git a/tests/integration/test_iris/peer2_config/slips.yaml b/tests/integration/test_iris/peer2_config/slips.yaml new file mode 100644 index 000000000..0a03b12de --- /dev/null +++ b/tests/integration/test_iris/peer2_config/slips.yaml @@ -0,0 +1,142 @@ +Debug: + generate_performance_plots: false +DisabledAlerts: + disabled_detections: [] +Docker: + GID: 0 + UID: 0 +Profiling: + cpu_profiler_dev_mode_entries: 500000 + cpu_profiler_enable: false + cpu_profiler_mode: dev + cpu_profiler_multiprocess: true + cpu_profiler_output_limit: 20 + cpu_profiler_sampling_interval: 20 + memory_profiler_enable: false + memory_profiler_mode: live + memory_profiler_multiprocess: true +anomaly_detection_https: + adaptation_score_threshold: 2.0 + adwin_clock: 1 + adwin_delta: 0.01 + adwin_grace_period: 5 + adwin_min_window_length: 5 + baseline_alpha: 0.5 + drift_alpha: 0.05 + empirical_threshold_quantile: 0.995 + flow_zscore_threshold: 3.5 + hourly_zscore_threshold: 3.0 + ja3_min_variants_per_server: 3 + log_verbosity: 3 + max_small_flow_anomalies: 1 + min_baseline_points: 6 + suspicious_alpha: 0.005 + training_alpha: 1 + training_fit_method: welford + training_hours: 2 + use_adwin_drift: true +brute_force_detector: + ssh_attempt_threshold: 9 +cesnet: + configuration_file: config/warden.conf + receive_alerts: false + receive_delay: 86400 + send_alerts: false +detection: + evidence_detection_threshold: 0.25 + popup_alerts: false +exporting_alerts: + TAXII_server: localhost + collection_name: Alerts + direct_export: true + direct_export_max_workers: 12 + direct_export_retry_backoff: 0.5 + direct_export_retry_max: 0 + direct_export_retry_max_delay: 5.0 + direct_export_workers: 4 + discovery_path: /taxii2/ + export_to: [] + port: 1234 + push_delay: 3600 + sensor_name: sensor1 + slack_api_path: config/slack_bot_token_secret + slack_channel_name: proj_slips_alerting_module + taxii_password: changeme_before_installing_a_medallion_server + taxii_timeout: 10 + taxii_username: admin + taxii_version: 2 + use_https: false +flow_alerts: + data_exfiltration_threshold: 500 + entropy_threshold: 5 + long_connection_threshold: 1500 + pastebin_download_threshold: 700 + ssh_succesful_detection_threshold: 4290 +flow_ml_detection: + mode: test +global_p2p: + bootstrapping_modules: + - fides + - iris + bootstrapping_node: false + iris_conf: tests/integration/test_iris/peer2_config/iris.yaml + use_global_p2p: true +local_p2p: + create_p2p_logfile: false + use_p2p: false +modules: + disable: + - template + - updatemanager + timeline_human_timestamp: true +output: + logs: slips.log + stderr: errors.log + stdout: slips.log +parameters: + analysis_direction: out + client_ips: [] + debug: 0 + default_rotation_interval: 1day + deletePrevdb: true + delete_zeek_files: false + export_format: json + export_labeled_flows: false + export_strato_letters: false + keep_rotated_files_for: 1 day + label: normal + metadata_dir: true + pcapfilter: false + permanent_dir: permanent + rotation: true + store_a_copy_of_zeek_files: false + store_zeek_files_in_the_output_dir: true + tcp_inactivity_timeout: 60 + time_window_width: 3600 + verbose: 1 + wait_for_modules_to_finish: 10080 mins +threatintelligence: + RiskIQ_credentials_path: config/RiskIQ_credentials + TI_files_update_period: 86400 + download_path_for_remote_threat_intelligence: modules/threat_intelligence/remote_data_files/ + ja3_feeds: config/JA3_feeds.csv + local_threat_intelligence_files: config/local_ti_files/ + mac_db: https://maclookup.app/downloads/json-database/get-db + mac_db_update: 1209600 + riskiq_update_period: 604800 + ssl_feeds: config/SSL_feeds.csv + ti_files: config/TI_feeds.csv + wait_for_TI_to_finish: false +update: + auto_update_slips: false +virustotal: + api_key_file: config/vt_api_key + virustotal_update_period: 259200 +web_interface: + port: 55000 +whitelists: + enable_local_whitelist: true + enable_online_whitelist: true + local_whitelist_path: config/whitelist.conf + online_whitelist: https://tranco-list.eu/download/X5QNN/10000 + online_whitelist_update_period: 86400 diff --git a/tests/integration/test_iris/test_iris.py b/tests/integration/test_iris/test_iris.py new file mode 100644 index 000000000..b8eb4a91e --- /dev/null +++ b/tests/integration/test_iris/test_iris.py @@ -0,0 +1,643 @@ +""" +This file tests 2 different config files other than slips' default config/slips.yaml +test/test.yaml and tests/test2.yaml +""" + +import re +import signal +import shutil +from pathlib import PosixPath + +import redis + +from tests.common_test_utils import ( + create_output_dir, + assert_no_errors, + close_test_redis_server, + modify_yaml_config, +) +import pytest +import os +import subprocess +import time +import sys +from pathlib import Path + +alerts_file = "alerts.log" +TEST_DIR = Path(__file__).resolve().parent + + +def countdown(seconds, message): + """ + counts down from the given number of seconds, printing a message each second. + """ + while seconds > 0: + sys.stdout.write( + f"\rSending {message} in {seconds} " + ) # overwrite the line + sys.stdout.flush() # ensures immediate output + time.sleep(1) # waits for 1 second + seconds -= 1 + sys.stdout.write(f"\rSending {message} now! \n") + + +def message_send(port, channel, message): + # connect to redis database 0 + redis_client = redis.StrictRedis(host="localhost", port=port, db=0) + + # publish the message to the "network2fides" channel + redis_client.publish(channel, message) + + print(f"Test message published to channel '{channel}'.") + + +message_alert_TL_NL = """{ + "type": "tl2nl_alert", + "version": 1, + "data": { + "payload": "https://www.youtube.com/watch?v=dQw4w9WgXcQ" + } +}""" + + +message_alert_NL_S = """{ + "type": "nl2tl_alert", + "version": 1, + "data": + "sender": "" + "payload": "https://www.youtube.com/watch?v=dQw4w9WgXcQ" +}""" + + +def check_strings_in_file(string_list, file_path): + # Check if the file exists + if not os.path.exists(file_path): + print(f"File {file_path} does not exist.") + return False + + # Open the file and read its content + try: + with open(file_path, "r") as file: + file_content = file.read() + + # Check if all strings in the list are present in the file content + for string in string_list: + if string not in file_content: + return False + return True + + except Exception as e: + print(f"Error reading file: {e}") + return False + + +def wait_for_file(file_path, timeout_seconds): + """ + Wait until a file exists or the timeout elapses. + + Parameters: + file_path: Path to the expected file. + timeout_seconds: Maximum number of seconds to wait. + + Returns: + True if the file exists before the timeout, otherwise False. + """ + deadline = time.time() + timeout_seconds + while time.time() < deadline: + if os.path.exists(file_path): + return True + time.sleep(1) + return os.path.exists(file_path) + + +def get_default_interface(): + """ + Get the default network interface. + + Returns: + str: Name of the default network interface. + """ + with open("/proc/net/route") as f: + for line in f.readlines()[1:]: + fields = line.strip().split() + if fields[1] == "00000000": # default route + return fields[0] + + +def extract_connection_string(log_file_first_iris): + """ + Extract the first peer connection string from the Iris log file. + + Parameters: + log_file_first_iris: Path to the first peer Iris log file. + + Returns: + str: The extracted connection string. + """ + with open(log_file_first_iris, "r") as log: + for line in log: + match = re.search(r"connection string:\s+'(.+)'", line) + if match: + return match.group(1) + + print("No connection string found in log file.") + exit(1) + + +def assert_peer1_setup(peer1_slips_config, peer1_iris_config_path): + """ + Assert that the first peer config was generated as expected. + + Parameters: + peer1_slips_config: Path to the first peer Slips config. + peer1_iris_config_path: Relative path to the first peer Iris config. + + Returns: + None + """ + assert check_strings_in_file( + [f"iris_conf: {peer1_iris_config_path}"], + peer1_slips_config, + ) + + +def assert_peer2_setup( + peer2_slips_config, + peer2_iris_config, + peer2_iris_config_path, + connection_string, + peer_redis_port, + peer_server_port, + peer2_key_path, +): + """ + Assert that the second peer config was generated as expected. + + Parameters: + peer2_slips_config: Path to the second peer Slips config. + peer2_iris_config: Path to the second peer Iris config. + peer2_iris_config_path: Relative path to the second peer Iris config. + connection_string: Multiaddress used to connect to the first peer. + peer_redis_port: Redis port used by the second peer. + peer_server_port: Iris server port used by the second peer. + peer2_key_path: Relative path to the generated peer2 private key. + + Returns: + None + """ + assert check_strings_in_file( + [f"iris_conf: {peer2_iris_config_path}"], + peer2_slips_config, + ) + assert check_strings_in_file( + [ + f"Port: {peer_redis_port}", + f"Port: {peer_server_port}", + "DisableBootstrappingNodes: true", + f"KeyFile: {peer2_key_path}", + connection_string, + ], + peer2_iris_config, + ) + + +def prepare_peer_config_paths( + config_dir: Path, prefix: str +) -> tuple[Path, Path, Path]: + """ + Build runtime config paths for a test peer. + + Parameters: + config_dir: Directory where generated config files will be stored. + prefix: Prefix used to name the generated files. + + Returns: + tuple: Slips config path, Iris config path, and Iris config path relative to repo root. + """ + config_dir.mkdir(parents=True, exist_ok=True) + iris_config = config_dir / f"{prefix}_iris.yaml" + slips_config = config_dir / f"{prefix}_slips.yaml" + iris_config_path = Path(os.path.relpath(iris_config, Path.cwd())) + return slips_config, iris_config, iris_config_path + + +def get_runtime_config_dir(output_dir_name: str, peer_name: str) -> Path: + """ + Return the runtime config directory for an Iris integration-test peer. + + Parameters: + output_dir_name: Name of the peer output directory. + peer_name: Peer-specific prefix used by the test. + + Returns: + Path: Directory where generated runtime configs should be stored. + """ + return TEST_DIR / "runtime_configs" / output_dir_name / peer_name + + +def get_iris_relative_key_path(key_path: Path) -> str: + """ + Build a key path relative to the Iris module working directory. + + Parameters: + key_path: Path to the private key file to be generated by Iris. + + Returns: + str: Relative path from `modules/iris` to the key file. + """ + return os.path.relpath(key_path, Path("modules/iris")) + + +def assert_peer1_results(output_dir): + """ + Assert the first peer completed without runtime errors. + + Parameters: + output_dir: Output directory of the first peer. + + Returns: + None + """ + assert_no_errors(output_dir) + + +def assert_peer2_results(output_dir_peer, log_file_second_iris): + """ + Assert the second peer completed without runtime errors and started Iris. + + Parameters: + output_dir_peer: Output directory of the second peer. + log_file_second_iris: Path to the second peer Iris log file. + + Returns: + None + """ + assert_no_errors(output_dir_peer) + assert check_strings_in_file( + ["connection string:"], + log_file_second_iris, + ) + + +def prepare_and_start_peer1( + zeek_dir_path, + output_dir, + redis_port, + server_port, + default_interface, + log_file, +): + """ + Generate config for peer1, start it, and return startup metadata. + + Parameters: + zeek_dir_path: Zeek dataset path used by the test. + output_dir: Output directory for peer1. + redis_port: Redis port used by peer1. + server_port: Iris server port used by peer1. + default_interface: Interface required by Slips when using `-g`. + log_file: Open file handle used to capture peer1 output. + + Returns: + tuple: Peer1 process, Iris log path, and Slips config path. + """ + config_dir = get_runtime_config_dir(output_dir.name, "peer1") + ( + peer1_slips_config, + peer1_iris_config, + peer1_iris_config_path, + ) = prepare_peer_config_paths(config_dir, "peer1") + + modify_yaml_config( + input_path="config/iris_config.yaml", + output_dir=config_dir, + output_filename=peer1_iris_config.name, + changes={ + "Redis": {"Port": redis_port}, + "Server": {"Port": server_port}, + "PeerDiscovery": { + "DisableBootstrappingNodes": True, + "ListOfMultiAddresses": [], + }, + }, + ) + modify_yaml_config( + input_path="config/slips.yaml", + output_dir=config_dir, + output_filename=peer1_slips_config.name, + changes={ + "global_p2p": { + "use_global_p2p": True, + "iris_conf": str(peer1_iris_config_path), + }, + "modules": {"disable": ["template", "updatemanager"]}, + }, + ) + + command = [ + sys.executable, + "./slips.py", + "-t", + "-g", + str(zeek_dir_path), + "-i", + default_interface, + "-e", + "1", + "-o", + str(output_dir), + "-c", + str(peer1_slips_config), + "-P", + str(redis_port), + ] + + process = subprocess.Popen( + command, + stdout=log_file, + stderr=log_file, + start_new_session=True, + ) + log_file_first_iris = output_dir / "iris/iris_logs.txt" + return ( + process, + log_file_first_iris, + peer1_slips_config, + peer1_iris_config_path, + ) + + +def prepare_and_start_peer2( + zeek_dir_path, + output_dir_peer, + peer_redis_port, + peer_server_port, + default_interface, + connection_string, + log_file, +): + """ + Generate config for peer2, start it, and return startup metadata. + + Parameters: + zeek_dir_path: Zeek dataset path used by the test. + output_dir_peer: Output directory for peer2. + peer_redis_port: Redis port used by peer2. + peer_server_port: Iris server port used by peer2. + default_interface: Interface required by Slips when using `-g`. + connection_string: Multiaddress of peer1 used by peer2. + log_file: Open file handle used to capture peer2 output. + + Returns: + tuple: Peer2 process, Iris log path, Slips config path, and Iris config path. + """ + config_dir = get_runtime_config_dir(output_dir_peer.name, "peer2") + ( + peer2_slips_config, + peer2_iris_config, + peer2_iris_config_path, + ) = prepare_peer_config_paths(config_dir, "peer2") + peer2_key_path = output_dir_peer / "peer2.private.key" + peer2_key_path_for_iris = get_iris_relative_key_path(peer2_key_path) + + modify_yaml_config( + input_path="config/slips.yaml", + output_dir=config_dir, + output_filename=peer2_slips_config.name, + changes={ + "global_p2p": { + "use_global_p2p": True, + "iris_conf": str(peer2_iris_config_path), + }, + "modules": {"disable": ["template", "updatemanager"]}, + }, + ) + modify_yaml_config( + input_path="config/iris_config.yaml", + output_dir=config_dir, + output_filename=peer2_iris_config.name, + changes={ + "Redis": {"Port": peer_redis_port}, + "Server": {"Port": peer_server_port}, + "PeerDiscovery": { + "DisableBootstrappingNodes": True, + "ListOfMultiAddresses": [connection_string], + }, + "Identity": {"KeyFile": peer2_key_path_for_iris}, + }, + ) + + peer_command = [ + sys.executable, + "./slips.py", + "-t", + "-g", + str(zeek_dir_path), + "-i", + default_interface, + "-e", + "1", + "-o", + str(output_dir_peer), + "-c", + str(peer2_slips_config), + "-P", + str(peer_redis_port), + ] + peer_process = subprocess.Popen( + peer_command, + stdout=log_file, + stderr=log_file, + start_new_session=True, + ) + log_file_second_iris = output_dir_peer / "iris/iris_logs.txt" + return ( + peer_process, + log_file_second_iris, + peer2_slips_config, + peer2_iris_config, + peer2_iris_config_path, + peer2_key_path, + peer2_key_path_for_iris, + ) + + +def stop_process_group(process, process_name, timeout_seconds=15): + """ + Stop a spawned process group and wait for it to exit. + + Parameters: + process: subprocess.Popen instance to stop. + process_name: Human-readable name used in log messages. + timeout_seconds: Maximum number of seconds to wait after SIGTERM. + + Returns: + None + """ + if process.poll() is not None: + return + + process_group_id = os.getpgid(process.pid) + os.killpg(process_group_id, signal.SIGTERM) + print(f"SIGTERM sent to {process_name} process group {process_group_id}.") + + try: + process.wait(timeout=timeout_seconds) + return + except subprocess.TimeoutExpired: + pass + + if process.poll() is not None: + return + + os.killpg(process_group_id, signal.SIGKILL) + process.wait() + print(f"SIGKILL sent to {process_name} process group {process_group_id}.") + + +@pytest.mark.parametrize( + "zeek_dir_path, output_dir, peer_output_dir", + [ + ( + "dataset/test13-malicious-dhcpscan-zeek-dir", + "iris_integration_test/", + "peer_iris_integration_test/", + ) + ], +) +def test_messaging( + zeek_dir_path, + output_dir, + peer_output_dir, + integration_port_factory, +): + """ + Tests whether Iris properly distributes an alert message generated by + Slips to the network (~other peers). + + First Slips instance is a general node in the network, its connection + string is generated and extracted from logs as a normal user would do, + in a very standard use case. + + The second instance of Slips acts as a normal-user-peer that joins the + network via the aforementioned Slips instance, + which extends the standard use case of connecting to such P2P network. + """ + default_interface = get_default_interface() + redis_port = integration_port_factory("peer1 redis") + peer_redis_port = integration_port_factory("peer2 redis") + server_port = integration_port_factory("peer1 iris") + peer_server_port = integration_port_factory("peer2 iris") + + # Two Slips instances are necessary to be run in this test. + + # Prepare output dir for peer1 + output_dir: PosixPath = create_output_dir(output_dir) + output_file = os.path.join(output_dir, "slips_output.txt") + + # Prepare output dir for the peer2 + output_dir_peer: PosixPath = create_output_dir(peer_output_dir) + output_file_peer = os.path.join(output_dir_peer, "slips_output.txt") + peer2_key_path = None + success = False + try: + print("running slips ...") + with open(output_file, "w") as log_file: + with open(output_file_peer, "w") as iris_log_file: + ( + process, + log_file_first_iris, + peer1_slips_config, + peer1_iris_config_path, + ) = prepare_and_start_peer1( + zeek_dir_path=zeek_dir_path, + output_dir=output_dir, + redis_port=redis_port, + server_port=server_port, + default_interface=default_interface, + log_file=log_file, + ) + assert_peer1_setup(peer1_slips_config, peer1_iris_config_path) + + # First peer (its Iris) needs to be ready and available for + # connections when the second peer tries to reach out to it. + countdown(20, "second peer") + # get the connection string from the first peer and give it + # to the second one so it is reachable + assert wait_for_file(log_file_first_iris, 30), ( + "Expected Iris log file was not created: " + f"{log_file_first_iris}" + ) + original_conn_string = extract_connection_string( + log_file_first_iris + ) + + ( + peer_process, + log_file_second_iris, + peer2_slips_config, + peer2_iris_config, + peer2_iris_config_path, + peer2_key_path, + peer2_key_path_for_iris, + ) = prepare_and_start_peer2( + zeek_dir_path=zeek_dir_path, + output_dir_peer=output_dir_peer, + peer_redis_port=peer_redis_port, + peer_server_port=peer_server_port, + default_interface=default_interface, + connection_string=original_conn_string, + log_file=iris_log_file, + ) + assert_peer2_setup( + peer2_slips_config=peer2_slips_config, + peer2_iris_config=peer2_iris_config, + peer2_iris_config_path=peer2_iris_config_path, + connection_string=original_conn_string, + peer_redis_port=peer_redis_port, + peer_server_port=peer_server_port, + peer2_key_path=peer2_key_path_for_iris, + ) + + print( + f"Output and errors of first peer are logged in" + f" {output_file}" + ) + + # let Slips properly and fully star with all of its parts and modules. + countdown(80, "Sending msg in fides2network") + # Sending a manual message to make sure there is an alert generated, because + # is is highly probable that both slips have covered their network captures + # before the infrastructure of P2P network was fully up and running + message_send( + redis_port, + message=message_alert_TL_NL, + channel="fides2network", + ) + + # these seconds are the time we give slips to process the msg + countdown(30, "Sending SIGTERM to the 2 peers") + print("Stopping the 2 instances of Slips and waiting for exit") + stop_process_group(process, "peer1 slips") + stop_process_group(peer_process, "peer2 slips") + + print("Slips is done, checking for errors in the 2 output dirs.") + assert_peer1_results(output_dir) + assert_peer2_results(output_dir_peer, log_file_second_iris) + success = True + finally: + close_test_redis_server(redis_port) + close_test_redis_server(peer_redis_port) + if peer2_key_path is not None and peer2_key_path.exists(): + peer2_key_path.unlink() + shutil.rmtree( + TEST_DIR / "runtime_configs" / output_dir.name, ignore_errors=True + ) + shutil.rmtree( + TEST_DIR / "runtime_configs" / output_dir_peer.name, + ignore_errors=True, + ) + if success: + print("Deleting the output directories") + shutil.rmtree(output_dir) + shutil.rmtree(output_dir_peer) diff --git a/tests/integration/test_pcap_dataset.py b/tests/integration/test_pcap_dataset.py deleted file mode 100644 index c514a0079..000000000 --- a/tests/integration/test_pcap_dataset.py +++ /dev/null @@ -1,50 +0,0 @@ -# SPDX-FileCopyrightText: 2021 Sebastian Garcia -# SPDX-License-Identifier: GPL-2.0-only -from tests.common_test_utils import ( - run_slips, - is_evidence_present, - create_output_dir, - assert_no_errors, -) -from tests.module_factory import ModuleFactory -import pytest -import shutil -import os - -alerts_file = "alerts.log" - - -@pytest.mark.parametrize( - "pcap_path, expected_profiles, output_dir, expected_evidence, redis_port", - [ - ( - "dataset/test8-malicious.pcap", - 3, - "test8/", - "performing an arp scan", - 6665, - ), - ], -) -def test_pcap( - pcap_path, expected_profiles, output_dir, expected_evidence, redis_port -): - output_dir = create_output_dir(output_dir) - output_file = os.path.join(output_dir, "slips_output.txt") - command = ( - f"./slips.py -e 1 -t -f {pcap_path} -o {output_dir} " - f" -P {redis_port} > {output_file} 2>&1" - ) - # this function returns when slips is done - run_slips(command) - assert_no_errors(output_dir) - - db = ModuleFactory().create_db_manager_obj( - redis_port, output_dir=output_dir - ) - profiles = db.get_profiles_len() - assert profiles > expected_profiles - - log_file = os.path.join(output_dir, alerts_file) - assert is_evidence_present(log_file, expected_evidence) is True - shutil.rmtree(output_dir) diff --git a/tests/integration/test_pcap_dataset/__init__.py b/tests/integration/test_pcap_dataset/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/tests/integration/test_pcap_dataset/test_pcap_dataset.py b/tests/integration/test_pcap_dataset/test_pcap_dataset.py new file mode 100644 index 000000000..edc19192c --- /dev/null +++ b/tests/integration/test_pcap_dataset/test_pcap_dataset.py @@ -0,0 +1,61 @@ +# SPDX-FileCopyrightText: 2021 Sebastian Garcia +# SPDX-License-Identifier: GPL-2.0-only +from tests.common_test_utils import ( + run_slips, + is_evidence_present, + create_output_dir, + assert_no_errors, + close_test_redis_server, +) +from tests.module_factory import ModuleFactory +import pytest +import shutil +import os + +alerts_file = "alerts.log" + + +@pytest.mark.parametrize( + "pcap_path, expected_profiles, output_dir, expected_evidence", + [ + ( + "dataset/test8-malicious.pcap", + 3, + "test8/", + "performing an arp scan", + ), + ], +) +def test_pcap( + pcap_path, + expected_profiles, + output_dir, + expected_evidence, + integration_port_factory, +): + redis_port = integration_port_factory("redis") + output_dir = create_output_dir(output_dir) + success = False + try: + output_file = os.path.join(output_dir, "slips_output.txt") + command = ( + f"./slips.py -e 1 -t -f {pcap_path} -o {output_dir} " + f" -P {redis_port} > {output_file} 2>&1" + ) + # this function returns when slips is done + run_slips(command) + assert_no_errors(output_dir) + + db = ModuleFactory().create_db_manager_obj( + redis_port, output_dir=output_dir + ) + profiles = db.get_profiles_len() + assert profiles > expected_profiles + + log_file = output_dir / "alerts" / alerts_file + assert is_evidence_present(log_file, expected_evidence) is True + success = True + finally: + if success: + close_test_redis_server(redis_port) + shutil.rmtree(output_dir) diff --git a/tests/integration/test_portscans.py b/tests/integration/test_portscans.py deleted file mode 100644 index be0da3006..000000000 --- a/tests/integration/test_portscans.py +++ /dev/null @@ -1,101 +0,0 @@ -# SPDX-FileCopyrightText: 2021 Sebastian Garcia -# SPDX-License-Identifier: GPL-2.0-only -import pytest -import shutil -import os - -from tests.common_test_utils import ( - run_slips, - is_evidence_present, - create_output_dir, - assert_no_errors, -) -from tests.module_factory import ModuleFactory - -alerts_file = "alerts.log" - - -@pytest.mark.parametrize( - "path, output_dir, redis_port", - [ - ( - "dataset/port-scans/horizontal/conn.log", - "testing_horizontal_ps/", - 7894, - ) - ], -) -def test_horizontal(path, output_dir, redis_port): - """ - checks that slips is detecting horizontal ps no issue, - """ - output_dir = create_output_dir(output_dir) - - expected_evidence = ( - "Horizontal port scan to port http 80/tcp. From 10.0.2.112" - ) - - output_file = os.path.join(output_dir, "slips_output.txt") - command = ( - f"./slips.py -e 1 -t -f {path} " - f" -o {output_dir} " - f"-P {redis_port} > {output_file} 2>&1" - ) - # this function returns when slips is done - run_slips(command) - - database = ModuleFactory().create_db_manager_obj( - redis_port, output_dir=output_dir, start_redis_server=False - ) - - assert_no_errors(output_dir) - # make sure slips generated profiles for this file (can't - # put the number of profiles exactly because slips - # doesn't generate a const number of profiles per file) - profiles: int = database.get_profiles_len() - assert profiles > 0 - - log_file = os.path.join(output_dir, alerts_file) - assert is_evidence_present(log_file, expected_evidence) - - shutil.rmtree(output_dir) - - -@pytest.mark.parametrize( - "path, output_dir, redis_port", - [("dataset/port-scans/vertical/conn.log", "testing_vertical_ps/", 7895)], -) -def test_vertical(path, output_dir, redis_port): - """ - checks that slips is detecting horizontal ps no issue, - """ - output_dir = create_output_dir(output_dir) - - expected_evidence = ( - "vertical port scan to IP 45.33.32.156 from 192.168.1.9." - ) - - output_file = os.path.join(output_dir, "slips_output.txt") - command = ( - f"./slips.py -e 1 -t -f {path} " - f" -o {output_dir}" - f" -P {redis_port} > {output_file} 2>&1" - ) - # this function returns when slips is done - run_slips(command) - - database = ModuleFactory().create_db_manager_obj( - redis_port, output_dir=output_dir, start_redis_server=False - ) - assert_no_errors(output_dir) - - # make sure slips generated profiles for this file (can't - # put the number of profiles exactly because slips - # doesn't generate a const number of profiles per file) - profiles: int = database.get_profiles_len() - assert profiles > 0 - - log_file = os.path.join(output_dir, alerts_file) - assert is_evidence_present(log_file, expected_evidence) - - shutil.rmtree(output_dir) diff --git a/tests/integration/test_portscans/__init__.py b/tests/integration/test_portscans/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/tests/integration/test_portscans/test_portscans.py b/tests/integration/test_portscans/test_portscans.py new file mode 100644 index 000000000..9ec8e95b9 --- /dev/null +++ b/tests/integration/test_portscans/test_portscans.py @@ -0,0 +1,110 @@ +# SPDX-FileCopyrightText: 2021 Sebastian Garcia +# SPDX-License-Identifier: GPL-2.0-only +import pytest +import shutil +import os + +from tests.common_test_utils import ( + run_slips, + is_evidence_present, + create_output_dir, + assert_no_errors, + get_slips_test_command, + close_test_redis_server, + skip_if_missing_runtime_dependencies, +) +from tests.module_factory import ModuleFactory + +alerts_file = "alerts.log" + + +@pytest.mark.parametrize( + "path, output_dir", + [ + ( + "dataset/port-scans/horizontal/conn.log", + "testing_horizontal_ps/", + ) + ], +) +def test_horizontal(path, output_dir, integration_port_factory): + """ + checks that slips is detecting horizontal ps no issue, + """ + skip_if_missing_runtime_dependencies( + python_modules=("termcolor",), binaries=("redis-server",) + ) + redis_port = integration_port_factory("redis") + output_dir = create_output_dir(output_dir) + success = False + try: + expected_evidence = ( + "Horizontal port scan to port http 80/tcp. From 10.0.2.112" + ) + + output_file = os.path.join(output_dir, "slips_output.txt") + command = get_slips_test_command( + f"-e 1 -t -f {path} -o {output_dir} -P {redis_port}" + ) + command = f"{command} > {output_file} 2>&1" + # this function returns when slips is done + run_slips(command) + + assert_no_errors(output_dir) + database = ModuleFactory().create_db_manager_obj( + redis_port, output_dir=output_dir, start_redis_server=False + ) + profiles = database.get_profiles_len() + assert profiles > 0 + + log_file = output_dir / "alerts" / alerts_file + assert is_evidence_present(log_file, expected_evidence) + success = True + finally: + if success: + close_test_redis_server(redis_port) + shutil.rmtree(output_dir) + + +@pytest.mark.parametrize( + "path, output_dir", + [("dataset/port-scans/vertical/conn.log", "testing_vertical_ps/")], +) +def test_vertical(path, output_dir, integration_port_factory): + """ + checks that slips is detecting horizontal ps no issue, + """ + skip_if_missing_runtime_dependencies( + python_modules=("termcolor",), binaries=("redis-server",) + ) + redis_port = integration_port_factory("redis") + output_dir = create_output_dir(output_dir) + success = False + try: + expected_evidence = ( + "vertical port scan to IP 45.33.32.156 from 192.168.1.9." + ) + + output_file = os.path.join(output_dir, "slips_output.txt") + command = get_slips_test_command( + f"-e 1 -t -f {path} -o {output_dir} -P {redis_port}" + ) + command = f"{command} > {output_file} 2>&1" + # this function returns when slips is done + run_slips(command) + + assert_no_errors(output_dir) + + database = ModuleFactory().create_db_manager_obj( + redis_port, output_dir=output_dir, start_redis_server=False + ) + profiles = database.get_profiles_len() + assert profiles > 0 + + log_file = output_dir / "alerts" / alerts_file + assert is_evidence_present(log_file, expected_evidence) + success = True + finally: + if success: + close_test_redis_server(redis_port) + shutil.rmtree(output_dir) diff --git a/tests/integration/test_zeek_dataset/__init__.py b/tests/integration/test_zeek_dataset/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/tests/integration/test_zeek_dataset.py b/tests/integration/test_zeek_dataset/test_zeek_dataset.py similarity index 81% rename from tests/integration/test_zeek_dataset.py rename to tests/integration/test_zeek_dataset/test_zeek_dataset.py index 3606155c9..f207c3ca0 100644 --- a/tests/integration/test_zeek_dataset.py +++ b/tests/integration/test_zeek_dataset/test_zeek_dataset.py @@ -5,6 +5,7 @@ is_evidence_present, create_output_dir, assert_no_errors, + close_test_redis_server, ) from tests.module_factory import ModuleFactory import pytest @@ -118,23 +119,21 @@ @pytest.mark.parametrize( - "conn_log_path, expected_profiles, expected_evidence, output_dir, redis_port", + "conn_log_path, expected_profiles, expected_evidence, output_dir", [ ( "dataset/test9-mixed-zeek-dir/conn.log", 4, "non-HTTP established connection to port 80. " - "destination IP: 194.132.197.198", # the flows with uid + "destination IP: 194.132.197.198", # the flow with uid # CAwUdr34dVnyOwbUuj should trigger this "test9-conn_log_only/", - 6659, ), ( "dataset/test10-mixed-zeek-dir/conn.log", 5, "non-SSL established connection", "test10-conn_log_only/", - 6658, ), ], ) @@ -143,25 +142,31 @@ def test_zeek_conn_log( expected_profiles, expected_evidence, output_dir, - redis_port, + integration_port_factory, ): + redis_port = integration_port_factory("redis") output_dir = create_output_dir(output_dir) + success = False + try: + output_file = os.path.join(output_dir, "slips_output.txt") + command = ( + f"./slips.py -e 1 -t -f {conn_log_path} -o {output_dir} " + f"-P {redis_port} > {output_file} 2>&1" + ) + # this function returns when slips is done + run_slips(command) + assert_no_errors(output_dir) - output_file = os.path.join(output_dir, "slips_output.txt") - command = ( - f"./slips.py -e 1 -t -f {conn_log_path} -o {output_dir} " - f"-P {redis_port} > {output_file} 2>&1" - ) - # this function returns when slips is done - run_slips(command) - assert_no_errors(output_dir) + database = ModuleFactory().create_db_manager_obj( + redis_port, output_dir=output_dir + ) + profiles = database.get_profiles_len() + assert profiles > expected_profiles - database = ModuleFactory().create_db_manager_obj( - redis_port, output_dir=output_dir - ) - profiles = database.get_profiles_len() - assert profiles > expected_profiles - - log_file = os.path.join(output_dir, alerts_file) - assert is_evidence_present(log_file, expected_evidence) is True - shutil.rmtree(output_dir) + log_file = output_dir / "alerts" / alerts_file + assert is_evidence_present(log_file, expected_evidence) is True + success = True + finally: + if success: + close_test_redis_server(redis_port) + shutil.rmtree(output_dir) diff --git a/tests/module_factory.py b/tests/module_factory.py index d006a1a22..64d12f16a 100644 --- a/tests/module_factory.py +++ b/tests/module_factory.py @@ -1,6 +1,8 @@ # SPDX-FileCopyrightText: 2021 Sebastian Garcia # SPDX-License-Identifier: GPL-2.0-only import shutil +import importlib.util +import sys from contextlib import contextmanager from unittest.mock import ( patch, @@ -70,8 +72,10 @@ def create_db_manager_obj( conf.disabled_detections = Mock(return_value=[]) conf.get_tw_width_as_float = Mock(return_value=3600.0) conf.get_tw_width_in_seconds = Mock(return_value=3600) + conf.get_args = Mock(return_value=Mock(killall=False)) conf.client_ips = Mock(return_value=[]) conf.use_local_p2p = Mock(return_value=False) + conf.permanent_dir = Mock(return_value="permanent") conf.width = Mock(return_value=3600) with ( @@ -99,14 +103,23 @@ def create_db_manager_obj( ) db.print = Mock() - db.init_p2ptrust_db = Mock() + db.init_p2p_trust_db = Mock() # for easier access to redis db db.r = db.rdb.r assert db.get_used_redis_port() == port return db def create_main_obj(self): - from slips.main import Main + try: + from slips.main import Main + except ModuleNotFoundError: + module_spec = importlib.util.spec_from_file_location( + "slips_main_for_tests", os.path.join("slips", "main.py") + ) + module = importlib.util.module_from_spec(module_spec) + sys.modules[module_spec.name] = module + module_spec.loader.exec_module(module) + Main = module.Main """returns an instance of Main() class in slips.py""" main = Main(testing=True) @@ -134,8 +147,23 @@ def create_http_analyzer_obj(self, mock_db): return http_analyzer @patch(MODULE_DB_MANAGER, name="mock_db") - def create_fides_module_obj(self, mock_db): - from modules.fidesModule.fidesModule import FidesModule + def create_fides_obj(self, mock_db): + from modules.fides.fides import FidesModule + + db_path = os.path.join("permanent", "databases", "fides_p2p_db.sqlite") + config_path = os.path.join( + "modules", "fides", "config", "fides.conf.yml" + ) + + def get_permanent_database_path(_filename): + os.makedirs(os.path.dirname(db_path), exist_ok=True) + return db_path + + mock_db.return_value.get_permanent_database_path.side_effect = ( + get_permanent_database_path + ) + conf = Mock() + conf.read_configuration = Mock(return_value=config_path) fm = FidesModule( logger=self.logger, @@ -143,7 +171,7 @@ def create_fides_module_obj(self, mock_db): redis_port=6379, termination_event=Mock(), slips_args=Mock(), - conf=Mock(), + conf=conf, ppid=Mock(), bloom_filters_manager=Mock(), ) @@ -209,10 +237,10 @@ def create_checker_obj(self): @patch(MODULE_DB_MANAGER, name="mock_db") def create_go_director_obj(self, mock_db): - from modules.p2ptrust.trust.trustdb import TrustDB - from modules.p2ptrust.utils.go_director import GoDirector + from modules.p2p_trust.trust.trustdb import TrustDB + from modules.p2p_trust.utils.go_director import GoDirector - with patch("modules.p2ptrust.utils.utils.send_evaluation_to_go"): + with patch("modules.p2p_trust.utils.utils.send_evaluation_to_go"): go_director = GoDirector( logger=self.logger, trustdb=Mock(spec=TrustDB), @@ -228,14 +256,30 @@ def create_go_director_obj(self, mock_db): @patch(DB_MANAGER, name="mock_db") def create_daemon_object(self, mock_db): - from slips.daemon import Daemon + try: + from slips.daemon import Daemon + + daemon_module = "slips.daemon" + except ModuleNotFoundError: + module_spec = importlib.util.spec_from_file_location( + "slips_daemon_for_tests", os.path.join("slips", "daemon.py") + ) + module = importlib.util.module_from_spec(module_spec) + sys.modules[module_spec.name] = module + module_spec.loader.exec_module(module) + Daemon = module.Daemon + daemon_module = module_spec.name with ( - patch("slips.daemon.Daemon.read_pidfile", return_type=None), - patch("slips.daemon.Daemon.read_configuration"), + patch(f"{daemon_module}.Daemon.read_pidfile", return_value=None), + patch(f"{daemon_module}.Daemon.read_configuration"), patch("builtins.open", mock_open(read_data=None)), ): - daemon = Daemon(MagicMock()) + slips = MagicMock() + slips.args.stopdaemon = True + slips.args.is_slips_started_by_an_update = False + slips.args.output = "output" + daemon = Daemon(slips) daemon.stderr = "errors.log" daemon.stdout = "slips.log" daemon.stdin = "/dev/null" @@ -252,7 +296,7 @@ def dummy_acquire_flock(self): @patch("sqlite3.connect") def create_trust_db_obj(self, sqlite_mock): - from modules.p2ptrust.trust.trustdb import TrustDB + from modules.p2p_trust.trust.trustdb import TrustDB with ( patch("slips_files.common.abstracts.isqlite.ISQLite._init_flock"), @@ -274,7 +318,7 @@ def create_trust_db_obj(self, sqlite_mock): @patch(MODULE_DB_MANAGER, name="mock_db") def create_base_model_obj(self, mock_db): - from modules.p2ptrust.trust.base_model import BaseModel + from modules.p2p_trust.trust.base_model import BaseModel from slips_files.core.output import Output logger = Mock(spec=Output) @@ -362,7 +406,7 @@ def create_unblocker_obj(self, mock_db): @patch(MODULE_DB_MANAGER, name="mock_db") def create_flowalerts_obj(self, mock_db): - from modules.flowalerts.flowalerts import FlowAlerts + from modules.flow_alerts.flow_alerts import FlowAlerts flowalerts = FlowAlerts( logger=self.logger, @@ -378,10 +422,12 @@ def create_flowalerts_obj(self, mock_db): return flowalerts @patch(MODULE_DB_MANAGER, name="mock_db") - def create_bruteforcing_obj(self, mock_db): - from modules.bruteforcing.bruteforcing import Bruteforcing + def create_brute_force_detector_obj(self, mock_db): + from modules.brute_force_detector.brute_force_detector import ( + BruteforceDetector, + ) - bruteforcing = Bruteforcing( + brute_force_detector = BruteforceDetector( logger=self.logger, output_dir="dummy_output_dir", redis_port=6379, @@ -391,68 +437,68 @@ def create_bruteforcing_obj(self, mock_db): ppid=Mock(), bloom_filters_manager=Mock(), ) - bruteforcing.print = Mock() - return bruteforcing + brute_force_detector.print = Mock() + return brute_force_detector @patch(DB_MANAGER, name="mock_db") def create_dns_analyzer_obj(self, mock_db): - from modules.flowalerts.dns import DNS + from modules.flow_alerts.dns import DNS flowalerts = self.create_flowalerts_obj() return DNS(flowalerts.db, flowalerts=flowalerts) @patch(DB_MANAGER, name="mock_db") def create_notice_analyzer_obj(self, mock_db): - from modules.flowalerts.notice import Notice + from modules.flow_alerts.notice import Notice flowalerts = self.create_flowalerts_obj() return Notice(flowalerts.db, flowalerts=flowalerts) @patch(DB_MANAGER, name="mock_db") def create_smtp_analyzer_obj(self, mock_db): - from modules.flowalerts.smtp import SMTP + from modules.flow_alerts.smtp import SMTP flowalerts = self.create_flowalerts_obj() return SMTP(flowalerts.db, flowalerts=flowalerts) @patch(DB_MANAGER, name="mock_db") def create_ssl_analyzer_obj(self, mock_db): - from modules.flowalerts.ssl import SSL + from modules.flow_alerts.ssl import SSL flowalerts = self.create_flowalerts_obj() return SSL(flowalerts.db, flowalerts=flowalerts) @patch(DB_MANAGER, name="mock_db") def create_ssh_analyzer_obj(self, mock_db): - from modules.flowalerts.ssh import SSH + from modules.flow_alerts.ssh import SSH flowalerts = self.create_flowalerts_obj() return SSH(flowalerts.db, flowalerts=flowalerts) @patch(DB_MANAGER, name="mock_db") def create_downloaded_file_analyzer_obj(self, mock_db): - from modules.flowalerts.downloaded_file import DownloadedFile + from modules.flow_alerts.downloaded_file import DownloadedFile flowalerts = self.create_flowalerts_obj() return DownloadedFile(flowalerts.db, flowalerts=flowalerts) @patch(DB_MANAGER, name="mock_db") def create_tunnel_analyzer_obj(self, mock_db): - from modules.flowalerts.tunnel import Tunnel + from modules.flow_alerts.tunnel import Tunnel flowalerts = self.create_flowalerts_obj() return Tunnel(flowalerts.db, flowalerts=flowalerts) @patch(DB_MANAGER, name="mock_db") def create_conn_analyzer_obj(self, mock_db): - from modules.flowalerts.conn import Conn + from modules.flow_alerts.conn import Conn flowalerts = self.create_flowalerts_obj() return Conn(flowalerts.db, flowalerts=flowalerts) @patch(DB_MANAGER, name="mock_db") def create_software_analyzer_obj(self, mock_db): - from modules.flowalerts.software import Software + from modules.flow_alerts.software import Software flowalerts = self.create_flowalerts_obj() return Software(flowalerts.db, flowalerts=flowalerts) @@ -481,13 +527,12 @@ def create_input_obj( from slips_files.core.input import Input from slips_files.core.output import Output - zeek_tmp_dir = os.path.join(os.getcwd(), "zeek_dir_for_testing") input = Input( logger=Output(), output_dir="dummy_output_dir", redis_port=6379, termination_event=Mock(), - slips_args=Mock(), + slips_args=Mock(output="dummy_output_dir"), conf=Mock(), ppid=Mock(), bloom_filters_manager=Mock(), @@ -497,7 +542,6 @@ def create_input_obj( input_information=input_information, cli_packet_filter=None, zeek_or_bro=check_zeek_or_bro(), - zeek_dir=zeek_tmp_dir, line_type=line_type, is_profiler_done_event=Mock(), ) @@ -645,9 +689,11 @@ def create_spamhaus_obj(self, mock_db): @patch(MODULE_DB_MANAGER, name="mock_db") def create_update_manager_obj(self, mock_db): - from modules.update_manager.update_manager import UpdateManager + from modules.feeds_update_manager.feeds_update_manager import ( + FeedsUpdateManager, + ) - update_manager = UpdateManager( + update_manager = FeedsUpdateManager( logger=self.logger, output_dir="dummy_output_dir", redis_port=6379, @@ -723,7 +769,7 @@ def create_circllu_obj(self, mock_db): @patch(MODULE_DB_MANAGER, name="mock_db") def create_set_evidence_helper(self, mock_db): - from modules.flowalerts.set_evidence import SetEvidenceHelper + from modules.flow_alerts.set_evidence import SetEvidenceHelper """Create an instance of SetEvidenceHelper.""" set_evidence_helper = SetEvidenceHelper(mock_db) @@ -921,7 +967,7 @@ def fake_read_configuration(worker): conf=Mock(), ppid=Mock(), bloom_filters_manager=Mock(), - name="EvidenceHandlerWorker_Process_0", + name="evidence_handler_worker_process_0", evidence_queue=Mock(), evidence_logger_q=Mock(), ) @@ -933,11 +979,36 @@ def fake_read_configuration(worker): def create_evidence_loggr_obj(self): from slips_files.core.evidence_logger import EvidenceLogger - handler = EvidenceLogger( - logger_stop_signal=Mock(), - evidence_logger_q=Mock(), - output_dir="/tmp", - ) + conf = Mock() + conf.get_GID = Mock(return_value=0) + conf.get_UID = Mock(return_value=0) + conf.generate_performance_plots = Mock(return_value=False) + + logfile = Mock() + logfile.name = "alerts.log" + jsonfile = Mock() + jsonfile.name = "alerts.json" + + with ( + patch( + "slips_files.core.evidence_logger.ConfigParser", + return_value=conf, + ), + patch( + "slips_files.core.evidence_logger." + "utils.change_logfiles_ownership" + ), + patch.object( + EvidenceLogger, + "clean_file", + side_effect=[logfile, jsonfile], + ), + ): + handler = EvidenceLogger( + logger_stop_signal=Mock(), + evidence_logger_q=Mock(), + output_dir="/tmp", + ) return handler @patch(MODULE_DB_MANAGER, name="mock_db") @@ -984,9 +1055,9 @@ def create_symbol_handler_obj(self, mock_db): @patch(MODULE_DB_MANAGER, name="mock_db") def create_riskiq_obj(self, mock_db): - from modules.riskiq.riskiq import RiskIQ + from modules.risk_iq.risk_iq import RiskIQ - riskiq = RiskIQ( + risk_iq = RiskIQ( logger=self.logger, output_dir="dummy_output_dir", redis_port=6379, @@ -996,8 +1067,8 @@ def create_riskiq_obj(self, mock_db): ppid=Mock(), bloom_filters_manager=Mock(), ) - riskiq.db = mock_db - return riskiq + risk_iq.db = mock_db + return risk_iq @patch(MODULE_DB_MANAGER, name="mock_db") def create_timeline_object(self, mock_db): @@ -1075,8 +1146,8 @@ def create_process_manager_obj(self): # main_mock.conf.get_bootstrapping_setting.return_value = (False, []) main_mock.conf.is_bootstrapping_node.return_value = False main_mock.conf.get_bootstrapping_modules.return_value = [ - "fidesModule", - "irisModule", + "fides", + "iris", ] main_mock.conf.generate_performance_plots.return_value = False main_mock.input_type = InputType.PCAP diff --git a/tests/run_all_tests.sh b/tests/run_all_tests.sh index 73fc26e82..22a90bace 100755 --- a/tests/run_all_tests.sh +++ b/tests/run_all_tests.sh @@ -1,31 +1,20 @@ #!/bin/bash # clear the cache database ./slips.py -cc -# close all open redis servers -printf "0" | ./slips.py -k # run all unit tests, -n *5 means distribute tests on 5 different process # -s to see print statements as they are executed python3 -m pytest tests/unit/ --ignore="tests/integration" -n 7 -p no:warnings -vvvv -s -# Close all redis-servers opened by the unit tests -python3 tests/unit/destrctor.py - # clear cache before running the integration tests ./slips.py -cc -# close all open redis servers -printf "0" | ./slips.py -k - -# the command to run dataset tests is separated from the rest because it takes so much time, -# so it's better to know and fix the failing unit tests from the above -# command before running the dataset tests -# distribute on 3 workers only because every worker will be spawning 10+ processes +# auto-discover integration test +mapfile -t integration_tests < <(find tests/integration -type f -name 'test_*.py' | sort) -python3 -m pytest -s tests/integration/test_portscans.py -p no:warnings -vv -python3 -m pytest -s tests/integration/test_dataset.py -p no:warnings -vv -python3 -m pytest -s tests/integration/test_config_files.py -p no:warnings -vv +for test_file in "${integration_tests[@]}"; do + python3 -m pytest -s "$test_file" -n 3 -p no:warnings -vv +done -printf "0" | ./slips.py -k ./slips.py -cc diff --git a/tests/unit/destrctor.py b/tests/unit/destrctor.py deleted file mode 100644 index 58b5c956b..000000000 --- a/tests/unit/destrctor.py +++ /dev/null @@ -1,114 +0,0 @@ -# SPDX-FileCopyrightText: 2021 Sebastian Garcia -# SPDX-License-Identifier: GPL-2.0-only -""" -Close all redis-servers opened by the unit tests -""" - -import os -import redis - - -def get_pid_of_redis_server(port: int) -> str: - """ - Gets the pid of the redis server running on this port - Returns str(port) or false if there's no redis-server running on this port - """ - cmd = "ps aux | grep redis-server" - cmd_output = os.popen(cmd).read() - for line in cmd_output.splitlines(): - if str(port) in line: - pid = line.split()[1] - return pid - return False - - -def flush_redis_server(port: str = ""): - """ - Flush the redis server on this pid, only 1 param should be given, pid or port - :param pid: can be False if port is given - Gets the pid of the port is not given - """ - - # clear the server opened on this port - try: - # if connected := __database__.connect_to_redis_server(port): - # noinspection PyTypeChecker - # todo move this to the db - r = redis.StrictRedis( - host="localhost", - port=port, - db=0, - charset="utf-8", - socket_keepalive=True, - decode_responses=True, - retry_on_timeout=True, - health_check_interval=20, - ) - r.flushall() - r.flushdb() - r.script_flush() - return True - except (redis.exceptions.ConnectionError, RuntimeError): - # server already killed! - return False - - -def kill_redis_server(pid): - """ - Kill the redis server on this pid - """ - try: - pid = int(pid) - except ValueError: - # The server was killed before logging its PID - # the pid of it is 'not found' - return False - - # signal 0 is to check if the process is still running or not - # it returns 1 if the process used_redis_servers.txt exited - try: - # check if the process is still running - while os.kill(pid, 0) != 1: - # sigterm is 9 - os.kill(pid, 9) - except ProcessLookupError: - # ProcessLookupError: process already exited, sometimes this exception is raised - # but the process is still running, keep trying to kill it - return True - except PermissionError: - # PermissionError happens when the user tries to close redis-servers - # opened by root while he's not root, - # or when he tries to close redis-servers - # opened without root while he's root - return False - return True - - -if __name__ == "__main__": - redis_server_ports = [65531, 6380, 6381, 1234] - closed_servers = 0 - for redis_port in redis_server_ports: - # On modern systems, the netstat utility comes pre-installed, - # this can be done using psutil but it needs root on macos - redis_pid = get_pid_of_redis_server(redis_port) - if not redis_pid: - # server isn't started yet - continue - - # print(f'Redis port: {redis_port} is found using PID {redis_pid} ') - try: - flush_redis_server(str(redis_port)) - print(f"Flushed redis-server opened on port: {redis_port}") - kill_redis_server(redis_pid) - print(f"Killed redis-server on port {redis_port} PID: {redis_pid}") - closed_servers += 1 - except redis.exceptions.ConnectionError: - continue - - print(f"Closed {closed_servers} unused redis-servers") - - zeek_tmp_dir = os.path.join(os.getcwd(), "zeek_dir_for_testing") - try: - os.rmdir(zeek_tmp_dir) - except (FileNotFoundError, OSError): - pass diff --git a/tests/unit/managers/test_process_manager.py b/tests/unit/managers/test_process_manager.py index 7f5375372..a5f0b4cbe 100644 --- a/tests/unit/managers/test_process_manager.py +++ b/tests/unit/managers/test_process_manager.py @@ -1,5 +1,6 @@ # SPDX-FileCopyrightText: 2021 Sebastian Garcia # SPDX-License-Identifier: GPL-2.0-only +import json import pytest from unittest.mock import Mock, patch from managers.process_manager import ProcessManager @@ -10,7 +11,7 @@ @pytest.mark.parametrize( "input_type, input_information, cli_packet_filter, " - "zeek_or_bro, zeek_dir, line_type", + "zeek_or_bro, line_type", [ # Test case 1: pcap input ( @@ -18,13 +19,12 @@ "test.pcap", "tcp port 80", "zeek", - "/opt/zeek", "conn", ), # Test case 2: zeek input - (InputType.ZEEK, "test.log", "", "bro", "/opt/bro", "dns"), + (InputType.ZEEK, "test.log", "", "bro", "dns"), # Test case 3: stdin input - (InputType.STDIN, "-", "", "zeek", "/opt/zeek", "http"), + (InputType.STDIN, "-", "", "zeek", "http"), ], ) def test_start_input_process( @@ -32,7 +32,6 @@ def test_start_input_process( input_information, cli_packet_filter, zeek_or_bro, - zeek_dir, line_type, ): process_manager = ModuleFactory().create_process_manager_obj() @@ -40,7 +39,6 @@ def test_start_input_process( process_manager.main.input_information = input_information process_manager.main.args.pcapfilter = cli_packet_filter process_manager.main.zeek_bro = zeek_or_bro - process_manager.main.zeek_dir = zeek_dir process_manager.main.line_type = line_type process_manager.main.bloom_filters_man = Mock() @@ -67,10 +65,12 @@ def test_start_input_process( input_information=input_information, cli_packet_filter=cli_packet_filter, zeek_or_bro=zeek_or_bro, - zeek_dir=zeek_dir, line_type=line_type, is_profiler_done_event=process_manager.is_profiler_done_event, is_input_done_event=process_manager.is_input_done_event, + is_slips_live_updating_event=( + process_manager.is_slips_live_updating_event + ), ) mock_input_process.start.assert_called_once() process_manager.main.print.assert_called_once() @@ -79,6 +79,30 @@ def test_start_input_process( ) +@pytest.mark.parametrize( + "is_slips_started_by_an_update,expected_is_set", + [(True, False), (False, False)], +) +def test_init_sets_live_update_event_for_update_start( + is_slips_started_by_an_update, + expected_is_set, +): + """Test that ProcessManager starts with an unset live-update event.""" + main_mock = Mock() + main_mock.args.is_slips_started_by_an_update = ( + is_slips_started_by_an_update + ) + main_mock.conf.get_disabled_modules.return_value = [] + main_mock.conf.is_bootstrapping_node.return_value = False + main_mock.conf.get_bootstrapping_modules.return_value = [] + + process_manager = ProcessManager(main_mock) + + assert process_manager.is_slips_live_updating_event.is_set() is ( + expected_is_set + ) + + @pytest.mark.parametrize( "module_name, modules_to_ignore, expected", [ @@ -115,7 +139,7 @@ def test_print_disabled_modules(): [ # Test case 1: No pending modules, no additional print calls ([], 1), - # Test case 2: Pending modules without Update Manager, one additional print call + # Test case 2: Pending modules without feeds_update_manager, one additional print call ([Mock(name="Module1"), Mock(name="Module2")], 1), ], ) @@ -139,13 +163,13 @@ def test_warn_about_pending_modules(pending_modules, expected_print_calls): @pytest.mark.parametrize( "blocking_enabled, exporting_alerts_disabled, " "expected_kill_first, expected_kill_last", - [ # Testcase1: blocking enabled, Exporting Alerts enabled + [ # Testcase1: blocking enabled, exporting_alerts enabled (True, False, [1, 2], [3, 4, 5]), - # Testcase2: Blocking disabled, Exporting Alerts enabled + # Testcase2: blocking disabled, exporting_alerts enabled (False, False, [1, 2, 4], [3, 5]), - # Testcase3: Blocking enabled, Exporting Alerts disabled + # Testcase3: blocking enabled, exporting_alerts disabled (True, True, [1, 2, 5], [3, 4]), - # Testcase4: Blocking disabled, Exporting Alerts disabled + # Testcase4: blocking disabled, exporting_alerts disabled (False, True, [1, 2, 4, 5], [3]), # Testcase5: All enabled, some PIDs are None (True, False, [1, 2], [3, 4, 5]), @@ -161,15 +185,15 @@ def test_get_hitlist_in_order( process_manager.children = [ Mock(pid=1, name="Process1"), Mock(pid=2, name="Process2"), - Mock(pid=3, name="EvidenceHandler"), - Mock(pid=4, name="Blocking"), - Mock(pid=5, name="Exporting Alerts"), + Mock(pid=3, name="evidence_handler"), + Mock(pid=4, name="blocking"), + Mock(pid=5, name="exporting_alerts"), ] process_manager.main.db.get_pid_of = lambda x: { - "EvidenceHandler": 3, - "Blocking": 4, - "Exporting Alerts": 5, + "evidence_handler": 3, + "blocking": 4, + "exporting_alerts": 5, }.get(x) process_manager.main.args.blocking = blocking_enabled process_manager.main.db.get_disabled_modules = lambda: ( @@ -270,6 +294,16 @@ def test_get_analysis_time( (None, True, False), # Test case 2: Message doesn't contain "stop_slips" ({"data": "some_other_message"}, True, False), + # Test case 3: Wrapped plain-text messages should be decoded first + ( + { + "data": json.dumps( + {"text": "stop_slips", "version": "test-version"} + ) + }, + True, + True, + ), # Test case 3: Message contains # "stop_slips" but not intended for control channel ({"data": "stop_slips"}, False, False), @@ -471,7 +505,7 @@ def test_start_evidence_process(output_dir, redis_port): mock_evidence_process.start.assert_called_once() process_manager.main.print.assert_called_once() process_manager.main.db.store_pid.assert_called_once_with( - "EvidenceHandler", 13579 + "evidence_handler", 13579 ) @@ -485,7 +519,7 @@ def test_print_started_module(): ) mock_print.assert_called_once_with( - "\t\tStarting the module green_module_name " + "\t\tStarting green_module_name module " "(Test description) [PID green_module_name]", 1, 0, @@ -519,12 +553,13 @@ def test_start_update_manager( asyncio_called, ): process_manager = ModuleFactory().create_process_manager_obj() + process_manager.main.args.output = "output" mock_lock_instance = Mock() mock_lock.return_value.__enter__.return_value = mock_lock_instance mock_update_manager = Mock() with patch( - "managers.process_manager.UpdateManager", + "managers.process_manager.FeedsUpdateManager", return_value=mock_update_manager, ): process_manager.start_update_manager( diff --git a/tests/unit/managers/test_redis_manager.py b/tests/unit/managers/test_redis_manager.py index 55341c13f..3e20eb59c 100644 --- a/tests/unit/managers/test_redis_manager.py +++ b/tests/unit/managers/test_redis_manager.py @@ -7,7 +7,11 @@ import pytest from tests.module_factory import ModuleFactory -from managers.redis_manager import UserCancelledErr +from managers.redis_manager import ( + DEFAULT_REDIS_PORT, + RedisManager, + UserCancelledErr, +) from slips_files.common.input_type import InputType @@ -48,7 +52,7 @@ def test_log_redis_server_pid_normal_ports( ): redis_manager = ModuleFactory().create_redis_manager_obj() redis_manager.main.input_information = "input_info" - redis_manager.main.zeek_dir = "zeek_dir" + redis_manager.main.db.get_zeek_output_dir.return_value = "zeek_dir" redis_manager.main.args.output = "output_dir" redis_manager.main.args.daemon = is_daemon redis_manager.main.args.save = save_db @@ -101,7 +105,7 @@ def test_load_redis_db(redis_port, redis_pid, db_path, mock_db): mock_remove.assert_called_once_with(redis_port) mock_print.assert_called_once_with( f"{db_path} loaded successfully.\n" - f"Run ./kalipso.sh and choose port {redis_port}" + f"Run ./webinterface.sh and choose port {redis_port}" ) @@ -171,7 +175,9 @@ def test_check_redis_database(mock_db): mock_db.rcache.ping.return_value = True with ( - patch("managers.redis_manager.utils.is_port_in_use", return_value=False), + patch( + "managers.redis_manager.utils.is_port_in_use", return_value=False + ), patch("managers.redis_manager.RedisDB", return_value=mock_db), ): result = redis_manager.start_redis_cache_if_not_running() @@ -188,7 +194,9 @@ def test_check_redis_database_failure(mock_db): mock_db.rcache.ping.side_effect = redis.exceptions.ConnectionError with ( - patch("managers.redis_manager.utils.is_port_in_use", return_value=False), + patch( + "managers.redis_manager.utils.is_port_in_use", return_value=False + ), patch("managers.redis_manager.RedisDB", return_value=mock_db), pytest.raises(redis.exceptions.ConnectionError), ): @@ -203,8 +211,12 @@ def test_check_redis_database_uses_running_cache(mock_db): mock_db.rcache.ping.return_value = True with ( - patch("managers.redis_manager.utils.is_port_in_use", return_value=True), - patch("managers.redis_manager.RedisDB", return_value=mock_db) as mock_redis, + patch( + "managers.redis_manager.utils.is_port_in_use", return_value=True + ), + patch( + "managers.redis_manager.RedisDB", return_value=mock_db + ) as mock_redis, ): result = redis_manager.start_redis_cache_if_not_running() @@ -549,6 +561,7 @@ def test_get_redis_port( redis_manager = ModuleFactory().create_redis_manager_obj() redis_manager.main.args.port = args_port redis_manager.main.args.multiinstance = multiinstance + redis_manager.main.args.is_slips_started_by_an_update = False with ( patch.object( @@ -576,6 +589,36 @@ def test_get_redis_port( mock_terminate.assert_called() +@pytest.mark.parametrize( + "args_port, expected_port", + [ + ("32768", 32768), + (None, DEFAULT_REDIS_PORT), + ], +) +def test_get_redis_port_started_by_update(args_port, expected_port, mock_db): + redis_manager = RedisManager(Mock()) + redis_manager.main.args = Mock() + redis_manager.main.args.is_slips_started_by_an_update = True + redis_manager.main.args.port = args_port + + with ( + patch.object( + redis_manager, "_get_dbmanager_without_starting_a_new_server" + ) as mock_db_mgr, + patch.object(redis_manager, "confirm_server_altering") as mock_confirm, + patch.object( + redis_manager, "get_random_redis_port" + ) as mock_random_port, + ): + result = redis_manager.get_redis_port() + + assert result == expected_port + mock_db_mgr.assert_not_called() + mock_confirm.assert_not_called() + mock_random_port.assert_not_called() + + @pytest.mark.parametrize( "total1, total2, expected", [ diff --git a/tests/unit/managers/test_slips.py b/tests/unit/managers/test_slips.py index 6bc46bfaf..a6e383bb6 100644 --- a/tests/unit/managers/test_slips.py +++ b/tests/unit/managers/test_slips.py @@ -2,6 +2,8 @@ # SPDX-License-Identifier: GPL-2.0-only """Unit test for ../slips.py""" +from unittest.mock import patch + from tests.module_factory import ModuleFactory @@ -10,6 +12,7 @@ def test_load_modules(): proc_manager.modules_to_ignore = [ "template", "mldetection-1", + "fides", ] failed_to_load_modules = proc_manager.get_modules()[1] assert failed_to_load_modules == 0 @@ -48,4 +51,9 @@ def test_load_modules(): def test_clear_redis_cache_database(): redis_manager = ModuleFactory().create_redis_manager_obj() - assert redis_manager.clear_redis_cache_database() + + with patch("redis.StrictRedis") as mock_redis: + mock_redis_instance = mock_redis.return_value + + assert redis_manager.clear_redis_cache_database() + mock_redis_instance.flushdb.assert_called_once() diff --git a/tests/unit/managers/test_update_manager.py b/tests/unit/managers/test_update_manager.py new file mode 100644 index 000000000..3a243c6d9 --- /dev/null +++ b/tests/unit/managers/test_update_manager.py @@ -0,0 +1,301 @@ +# SPDX-FileCopyrightText: 2021 Sebastian Garcia +# SPDX-License-Identifier: GPL-2.0-only +from unittest.mock import Mock, patch + +import pytest +from git import GitCommandError + +from managers.update_manager import UpdateManager + + +def create_update_manager(): + """ + Create an UpdateManager with mocked external dependencies. + + Returns: + UpdateManager instance for unit tests. + """ + db = Mock() + db.is_running_non_stop.return_value = True + + conf = Mock() + conf.get_args.return_value = Mock( + is_slips_started_by_an_update=False, + multiinstance=False, + ) + conf.auto_update_slips.return_value = True + + with patch("managers.update_manager.ConfigParser", return_value=conf): + return UpdateManager( + database=db, + is_slips_live_updating_event=Mock(), + print_func=Mock(), + ) + + +@pytest.mark.parametrize( + "remote_url, expected_link", + [ + ( + "https://github.com/stratosphereips/StratosphereLinuxIPS.git", + "https://raw.githubusercontent.com/stratosphereips/" + "StratosphereLinuxIPS/master/update.json", + ), + ( + "git@github.com:stratosphereips/StratosphereLinuxIPS.git", + "https://raw.githubusercontent.com/stratosphereips/" + "StratosphereLinuxIPS/master/update.json", + ), + ("https://example.com/stratosphereips/StratosphereLinuxIPS.git", None), + ], +) +def test_get_master_update_json_link(remote_url, expected_link): + update_manager = create_update_manager() + repo = Mock() + repo.remote.return_value.url = remote_url + + with patch("managers.update_manager.Repo", return_value=repo): + assert update_manager._get_master_update_json_link() == expected_link + + +@pytest.mark.parametrize( + "update_json, expected_dependencies, expected_compatibility", + [ + ( + '{"has_new_dependencies": true, "backwards_compatible": false}', + True, + False, + ), + ( + "{\n" + ' "has_new_dependencies": false,\n' + ' "backwards_compatible": true,\n' + "}\n", + False, + True, + ), + ], +) +def test_update_json_flags( + update_json, expected_dependencies, expected_compatibility +): + update_manager = create_update_manager() + response = Mock() + response.read.return_value = update_json.encode("utf-8") + response.__enter__ = Mock(return_value=response) + response.__exit__ = Mock(return_value=None) + + with patch.object( + update_manager, + "_get_master_update_json_link", + return_value=( + "https://raw.githubusercontent.com/org/repo/master/update.json" + ), + ), patch( + "managers.update_manager.request.urlopen", return_value=response + ) as mock_urlopen: + assert ( + update_manager._new_version_has_new_dependencies() + == expected_dependencies + ) + assert ( + update_manager._is_new_version_backwards_compatible() + == expected_compatibility + ) + mock_urlopen.assert_called_once() + + +@pytest.mark.parametrize( + "update_payload, expected_dependencies, expected_compatibility", + [ + (None, True, False), + ("not-json", True, False), + ], +) +def test_update_json_fallbacks( + update_payload, + expected_dependencies, + expected_compatibility, +): + update_manager = create_update_manager() + + patches = [ + patch.object( + update_manager, + "_get_master_update_json_link", + return_value=( + "https://raw.githubusercontent.com/org/repo/master/update.json" + ), + ) + ] + + if update_payload is None: + patches.append( + patch( + "managers.update_manager.request.urlopen", + side_effect=OSError("network error"), + ) + ) + else: + response = Mock() + response.read.return_value = update_payload.encode("utf-8") + response.__enter__ = Mock(return_value=response) + response.__exit__ = Mock(return_value=None) + patches.append( + patch( + "managers.update_manager.request.urlopen", + return_value=response, + ) + ) + + with patches[0], patches[1]: + assert ( + update_manager._new_version_has_new_dependencies() + == expected_dependencies + ) + assert ( + update_manager._is_new_version_backwards_compatible() + == expected_compatibility + ) + + +def test_get_updated_slips_command_appends_update_flag(): + update_manager = create_update_manager() + process = Mock() + process.cmdline.return_value = ["python3", "slips.py", "-i", "eth0"] + + with patch("managers.update_manager.psutil.Process", return_value=process): + assert update_manager._get_updated_slips_command() == [ + "python3", + "slips.py", + "-i", + "eth0", + "-u", + ] + + +def test_get_updated_slips_command_passes_multiinstance_redis_port(): + update_manager = create_update_manager() + update_manager.args.multiinstance = True + update_manager.db.get_used_redis_port.return_value = 32768 + process = Mock() + process.cmdline.return_value = [ + "python3", + "slips.py", + "-m", + "-i", + "eth0", + ] + + with patch("managers.update_manager.psutil.Process", return_value=process): + assert update_manager._get_updated_slips_command() == [ + "python3", + "slips.py", + "-i", + "eth0", + "-u", + "-P", + "32768", + ] + + +def test_start_updated_slips_verison_starts_detached_process(): + update_manager = create_update_manager() + update_manager._get_updated_slips_command = Mock( + return_value=["python3", "slips.py", "-i", "eth0", "-u"] + ) + + with patch("managers.update_manager.subprocess.Popen") as popen: + process = update_manager.start_updated_slips_version() + + assert process == popen.return_value + popen.assert_called_once_with( + ["python3", "slips.py", "-i", "eth0", "-u"], + close_fds=True, + ) + + +def test_update_slips_starts_updated_process_before_stopping_current_slips(): + update_manager = create_update_manager() + calls = [] + update_manager.git_pull_master = Mock( + side_effect=lambda: calls.append("git_pull_master") + ) + update_manager.start_updated_slips_version = Mock( + side_effect=lambda: calls.append("start_updated_slips_verison") + ) + update_manager.is_slips_live_updating_event.set = Mock( + side_effect=lambda: calls.append("set_update_event") + ) + + update_manager.update_slips() + + update_manager.git_pull_master.assert_called_once() + update_manager.start_updated_slips_version.assert_called_once() + update_manager.is_slips_live_updating_event.set.assert_called_once() + assert calls == [ + "git_pull_master", + "start_updated_slips_verison", + "set_update_event", + ] + + +def test_update_slips_aborts_when_local_changes_block_checkout(): + """ + Ensure local checkout conflicts abort the update without stopping Slips. + + Returns: + None. + """ + update_manager = create_update_manager() + update_manager.cached_update_info = {"version": "1.2.3"} + git_error = GitCommandError( + "git checkout origin/master", + 1, + stderr=( + "error: Your local changes to the following files would be " + "overwritten by checkout:\n" + "\tconfig/slips.yaml\n" + "Please commit your changes or stash them before you switch " + "branches.\n" + "Aborting" + ), + ) + update_manager.git_pull_master = Mock(side_effect=git_error) + update_manager.start_updated_slips_version = Mock() + + update_manager.update_slips() + + update_manager.git_pull_master.assert_called_once() + update_manager.start_updated_slips_version.assert_not_called() + update_manager.is_slips_live_updating_event.set.assert_not_called() + update_manager.print.assert_called_once_with( + "Warning: Uncommitted changes to ['config/slips.yaml'] detected. " + "Aborting update to Slips v1.2.3, please update Slips manually." + ) + + +def test_update_slips_aborts_on_unrelated_git_errors(): + """ + Ensure unexpected git failures abort the update without crashing. + + Returns: + None. + """ + update_manager = create_update_manager() + git_error = GitCommandError( + "git checkout origin/master", + 128, + stderr="fatal: not a git repository", + ) + update_manager.git_pull_master = Mock(side_effect=git_error) + update_manager.start_updated_slips_version = Mock() + + update_manager.update_slips() + + update_manager.start_updated_slips_version.assert_not_called() + update_manager.is_slips_live_updating_event.set.assert_not_called() + update_manager.print.assert_called_once_with( + "Warning: Aborting Slips update because a git error occurred: " + f"{git_error}" + ) diff --git a/tests/unit/modules/anomaly_detection_https/test_anomaly_detection_https.py b/tests/unit/modules/anomaly_detection_https/test_anomaly_detection_https.py index 940ada8a6..ccbf1f16b 100644 --- a/tests/unit/modules/anomaly_detection_https/test_anomaly_detection_https.py +++ b/tests/unit/modules/anomaly_detection_https/test_anomaly_detection_https.py @@ -60,6 +60,11 @@ def test_https_anomaly_module_is_instantiable_and_subscribes_to_new_ssl( ) assert isinstance(module, AnomalyDetectionHTTPS) + assert module.output_dir == str(tmp_path / "anomaly_detection_https") + assert module.parent_output_dir == str(tmp_path) + assert module.operational_log_path == str( + tmp_path / "anomaly_detection_https" / "anomaly_detection_https.log" + ) module.subscribe_to_channels() diff --git a/tests/unit/modules/arp/test_arp_filter.py b/tests/unit/modules/arp/test_arp_filter.py index 221fe7b28..2a72978ce 100644 --- a/tests/unit/modules/arp/test_arp_filter.py +++ b/tests/unit/modules/arp/test_arp_filter.py @@ -40,7 +40,7 @@ def test_is_slips_peer(p2p_enabled, is_private, peer_trust, expected): ) def test_is_self_defense(ip, our_ips, blocking, has_poisoner, expected): db = Mock() - db.get_pids.return_value = {"ARP Poisoner": 123} if has_poisoner else {} + db.get_pids.return_value = {"arp_poisoner": 123} if has_poisoner else {} args = Mock() args.blocking = blocking diff --git a/tests/unit/modules/arp_poisoner/test_arp_poisoner.py b/tests/unit/modules/arp_poisoner/test_arp_poisoner.py index ae32255e6..5490bab8e 100644 --- a/tests/unit/modules/arp_poisoner/test_arp_poisoner.py +++ b/tests/unit/modules/arp_poisoner/test_arp_poisoner.py @@ -23,6 +23,58 @@ def test__is_time_to_repoison(poisoner): assert not poisoner._is_time_to_repoison(target) +@pytest.mark.parametrize( + "arp_scan_available, expected", + [(False, True), (True, False)], +) +def test_pre_main_stops_when_arp_scan_is_missing( + poisoner, arp_scan_available, expected +): + poisoner.arp_scan_bin_available = arp_scan_available + poisoner.print = MagicMock() + + assert poisoner.pre_main() is expected + + if expected: + poisoner.print.assert_called_once_with( + "The arp-scan tool is not installed. ARP poisoner module is " + "stopping.", + ) + else: + poisoner.print.assert_not_called() + + +@pytest.mark.parametrize( + "arp_scan_available, expected_channels", + [ + (False, {}), + ( + True, + { + "new_blocking": "new_blocking_subscription", + "tw_closed": "tw_closed_subscription", + }, + ), + ], +) +def test_subscribe_to_channels_depends_on_arp_scan( + poisoner, arp_scan_available, expected_channels +): + poisoner.arp_scan_bin_available = arp_scan_available + poisoner.db.subscribe = MagicMock( + side_effect=["new_blocking_subscription", "tw_closed_subscription"] + ) + + poisoner.subscribe_to_channels() + + assert poisoner.channels == expected_channels + + if arp_scan_available: + assert poisoner.db.subscribe.call_count == 2 + else: + poisoner.db.subscribe.assert_not_called() + + def test_is_broadcast_true(poisoner): assert poisoner.is_broadcast("192.168.1.255", "192.168.1.0/24") diff --git a/tests/unit/modules/blocking/test_blocking.py b/tests/unit/modules/blocking/test_blocking.py index 4c1c80f4a..19aab9e65 100644 --- a/tests/unit/modules/blocking/test_blocking.py +++ b/tests/unit/modules/blocking/test_blocking.py @@ -206,8 +206,16 @@ def test_main_blocking_logic(block, expected_block_called): @pytest.mark.parametrize( "last_closed_tw, msg_data, should_call", [ - ("tw1", "profileid_123_tw2", True), # new tw, should call update - ("tw2", "profileid_234_tw2", False), # same tw, no update + ( + "tw1", + json.dumps({"text": "profileid_123_tw2", "version": "1.0"}), + True, + ), + ( + "tw2", + json.dumps({"text": "profileid_234_tw2", "version": "1.0"}), + False, + ), ], ) def test_main_tw_closed_triggers_update(last_closed_tw, msg_data, should_call): diff --git a/tests/unit/modules/bruteforcing/test_bruteforcing.py b/tests/unit/modules/brute_force_detector/test_brute_force_detector.py similarity index 68% rename from tests/unit/modules/bruteforcing/test_bruteforcing.py rename to tests/unit/modules/brute_force_detector/test_brute_force_detector.py index 9075fb7ce..a2ae2defc 100644 --- a/tests/unit/modules/bruteforcing/test_bruteforcing.py +++ b/tests/unit/modules/brute_force_detector/test_brute_force_detector.py @@ -84,11 +84,11 @@ def drive_threshold(module, client_banner="SSH-2.0-OpenSSH_9.6p1"): return module.db.set_evidence.call_args[0][0] -def test_software_banner_increases_bruteforcing_confidence(): - plain_module = ModuleFactory().create_bruteforcing_obj() +def test_software_banner_increases_brute_force_detector_confidence(): + plain_module = ModuleFactory().create_brute_force_detector_obj() plain_evidence = drive_threshold(plain_module) - banner_module = ModuleFactory().create_bruteforcing_obj() + banner_module = ModuleFactory().create_brute_force_detector_obj() banner_module._handle_software(make_software_flow()) banner_evidence = drive_threshold( banner_module, client_banner="SSH-2.0-libssh2_1.11.0" @@ -100,34 +100,34 @@ def test_software_banner_increases_bruteforcing_confidence(): assert banner_evidence.dst_port == 902 -def test_bruteforcing_uses_sparse_bucketed_reporting(): - bruteforcing = ModuleFactory().create_bruteforcing_obj() - bruteforcing.db.get_port_info.return_value = "SSH" +def test_brute_force_detector_uses_sparse_bucketed_reporting(): + brute_force_detector = ModuleFactory().create_brute_force_detector_obj() + brute_force_detector.db.get_port_info.return_value = "SSH" for attempt in range(1, 25): - bruteforcing._handle_ssh( + brute_force_detector._handle_ssh( PROFILEID, TWID, make_ssh_flow(uid=f"uid-{attempt}"), ) - assert bruteforcing.db.set_evidence.call_count == 5 + assert brute_force_detector.db.set_evidence.call_count == 5 observed_attempt_counts = [ len(call_args[0][0].uid) - for call_args in bruteforcing.db.set_evidence.call_args_list + for call_args in brute_force_detector.db.set_evidence.call_args_list ] assert observed_attempt_counts == [9, 10, 12, 16, 24] def test_confidence_reaches_full_at_30_attempts(): - bruteforcing = ModuleFactory().create_bruteforcing_obj() - threshold_confidence = bruteforcing._calculate_confidence( - bruteforcing.ssh_attempt_threshold, + brute_force_detector = ModuleFactory().create_brute_force_detector_obj() + threshold_confidence = brute_force_detector._calculate_confidence( + brute_force_detector.ssh_attempt_threshold, "SSH-2.0-OpenSSH_9.6p1", "ssh.log", ) - full_confidence = bruteforcing._calculate_confidence( - bruteforcing.ssh_full_confidence_attempts, + full_confidence = brute_force_detector._calculate_confidence( + brute_force_detector.ssh_full_confidence_attempts, "SSH-2.0-OpenSSH_9.6p1", "ssh.log", ) @@ -135,34 +135,36 @@ def test_confidence_reaches_full_at_30_attempts(): assert threshold_confidence < 1.0 assert full_confidence == 1.0 - evidence = drive_threshold(bruteforcing) + evidence = drive_threshold(brute_force_detector) assert evidence.threat_level == ThreatLevel.MEDIUM def test_notice_confirmation_emits_zeek_evidence_and_confirms_future_alerts(): - bruteforcing = ModuleFactory().create_bruteforcing_obj() - drive_threshold(bruteforcing) - bruteforcing.db.set_evidence.reset_mock() + brute_force_detector = ModuleFactory().create_brute_force_detector_obj() + drive_threshold(brute_force_detector) + brute_force_detector.db.set_evidence.reset_mock() - bruteforcing._handle_notice(PROFILEID, TWID, make_notice_flow()) - zeek_evidence = bruteforcing.db.set_evidence.call_args[0][0] + brute_force_detector._handle_notice(PROFILEID, TWID, make_notice_flow()) + zeek_evidence = brute_force_detector.db.set_evidence.call_args[0][0] assert zeek_evidence.confidence == 1.0 assert zeek_evidence.threat_level == ThreatLevel.MEDIUM assert "Confirmed by Zeek notice.log." in zeek_evidence.description - bruteforcing.db.set_evidence.reset_mock() - bruteforcing._handle_ssh(PROFILEID, TWID, make_ssh_flow(uid="uid-10")) - confirmed_evidence = bruteforcing.db.set_evidence.call_args[0][0] + brute_force_detector.db.set_evidence.reset_mock() + brute_force_detector._handle_ssh( + PROFILEID, TWID, make_ssh_flow(uid="uid-10") + ) + confirmed_evidence = brute_force_detector.db.set_evidence.call_args[0][0] assert confirmed_evidence.confidence == 1.0 assert "Confirmed by Zeek notice.log." in confirmed_evidence.description def test_repeated_ssh_sessions_without_auth_attempts_still_trigger_detection(): - bruteforcing = ModuleFactory().create_bruteforcing_obj() - bruteforcing.db.get_port_info.return_value = "SSH" + brute_force_detector = ModuleFactory().create_brute_force_detector_obj() + brute_force_detector.db.get_port_info.return_value = "SSH" for attempt in range(20): - bruteforcing._handle_ssh( + brute_force_detector._handle_ssh( PROFILEID, TWID, make_ssh_flow( @@ -172,4 +174,4 @@ def test_repeated_ssh_sessions_without_auth_attempts_still_trigger_detection(): ), ) - assert bruteforcing.db.set_evidence.call_count == 4 + assert brute_force_detector.db.set_evidence.call_count == 4 diff --git a/tests/unit/modules/fidesModule/test_fides_bridge.py b/tests/unit/modules/fides/test_fides_bridge.py similarity index 74% rename from tests/unit/modules/fidesModule/test_fides_bridge.py rename to tests/unit/modules/fides/test_fides_bridge.py index 7661d7202..3184d08ad 100644 --- a/tests/unit/modules/fidesModule/test_fides_bridge.py +++ b/tests/unit/modules/fides/test_fides_bridge.py @@ -1,11 +1,12 @@ import pytest from unittest.mock import MagicMock -from modules.fidesModule.messaging.network_bridge import NetworkBridge -from modules.fidesModule.messaging.queue import Queue -from modules.fidesModule.messaging.message_handler import MessageHandler -from modules.fidesModule.messaging.network_bridge import NetworkMessage -from modules.fidesModule.model.aliases import PeerId, Target -from modules.fidesModule.model.threat_intelligence import ThreatIntelligence +from modules.fides.messaging.network_bridge import NetworkBridge +from modules.fides.messaging.queue import Queue +from modules.fides.messaging.message_handler import MessageHandler +from modules.fides.messaging.network_bridge import NetworkMessage +from modules.fides.model.aliases import PeerId, Target +from modules.fides.model.threat_intelligence import ThreatIntelligence +from slips_files.common.slips_utils import utils @pytest.fixture @@ -25,7 +26,7 @@ def mock_handler(): def test_initialization(network_bridge, mock_queue): assert network_bridge._NetworkBridge__queue == mock_queue - assert network_bridge.version == 1 + assert network_bridge.version == utils.get_current_version() def test_listen_success(network_bridge, mock_handler, mock_queue): @@ -36,7 +37,11 @@ def test_listen_success(network_bridge, mock_handler, mock_queue): mock_queue.listen.assert_called_once() # Simulate a valid message being received - message = '{"type": "test", "version": 1, "data": {}}' + message = ( + '{"type": "test", ' + f'"version": "{utils.get_current_version()}", ' + '"data": {}}' + ) callback = mock_queue.listen.call_args[0][0] callback(message) @@ -83,5 +88,9 @@ def test_send_exception_handling(network_bridge, mock_queue): mock_queue.send = MagicMock(side_effect=Exception("send failed")) with pytest.raises(Exception, match="send failed"): network_bridge._NetworkBridge__send( - NetworkMessage(type="test", version=1, data={}) + NetworkMessage( + type="test", + version=utils.get_current_version(), + data={}, + ) ) diff --git a/tests/unit/modules/fidesModule/test_fides_module.py b/tests/unit/modules/fides/test_fides_module.py similarity index 75% rename from tests/unit/modules/fidesModule/test_fides_module.py rename to tests/unit/modules/fides/test_fides_module.py index b91999e49..297c8a909 100644 --- a/tests/unit/modules/fidesModule/test_fides_module.py +++ b/tests/unit/modules/fides/test_fides_module.py @@ -1,5 +1,5 @@ """ -Unit tests for modules/fidesModule/fidesModule.py +Unit tests for modules/fides/fides.py The sqlite database used by and implemented in FidesModule has its own unit tests. You may find them here: .test_fides_sqlite_db.py @@ -15,7 +15,7 @@ @pytest.fixture def cleanup_database(): # name of the database created by Fides - db_name = "fides_p2p_db.sqlite" + db_name = os.path.join("permanent", "databases", "fides_p2p_db.sqlite") yield # Let the test run @@ -25,10 +25,10 @@ def cleanup_database(): def test_pre_main(mocker, cleanup_database): - fides_module = ModuleFactory().create_fides_module_obj() + fides = ModuleFactory().create_fides_obj() mocker.patch( "slips_files.common.slips_utils.Utils.drop_root_privs_permanently" ) - fides_module.subscribe_to_channels() - fides_module.pre_main() + fides.subscribe_to_channels() + fides.pre_main() utils.drop_root_privs_permanently.assert_called_once() diff --git a/tests/unit/modules/fidesModule/test_fides_queues.py b/tests/unit/modules/fides/test_fides_queues.py similarity index 98% rename from tests/unit/modules/fidesModule/test_fides_queues.py rename to tests/unit/modules/fides/test_fides_queues.py index 105510246..f2fa327e6 100644 --- a/tests/unit/modules/fidesModule/test_fides_queues.py +++ b/tests/unit/modules/fides/test_fides_queues.py @@ -1,7 +1,7 @@ import pytest from unittest.mock import MagicMock from threading import Thread -from modules.fidesModule.messaging.redis_simplex_queue import ( +from modules.fides.messaging.redis_simplex_queue import ( RedisSimplexQueue, RedisDuplexQueue, ) diff --git a/tests/unit/modules/fidesModule/test_fides_sqlite_db.py b/tests/unit/modules/fides/test_fides_sqlite_db.py similarity index 82% rename from tests/unit/modules/fidesModule/test_fides_sqlite_db.py rename to tests/unit/modules/fides/test_fides_sqlite_db.py index c1a7e33c6..e76de0500 100644 --- a/tests/unit/modules/fidesModule/test_fides_sqlite_db.py +++ b/tests/unit/modules/fides/test_fides_sqlite_db.py @@ -1,17 +1,17 @@ import pytest from unittest.mock import MagicMock -from modules.fidesModule.model.peer import PeerInfo -from modules.fidesModule.model.peer_trust_data import PeerTrustData -from modules.fidesModule.model.threat_intelligence import ( +from modules.fides.model.peer import PeerInfo +from modules.fides.model.peer_trust_data import PeerTrustData +from modules.fides.model.threat_intelligence import ( SlipsThreatIntelligence, ) -from modules.fidesModule.persistence.fides_sqlite_db import FidesSQLiteDB +from modules.fides.persistence.fides_sqlite_db import FidesSQLiteDB -from modules.fidesModule.model.recommendation_history import ( +from modules.fides.model.recommendation_history import ( RecommendationHistoryRecord, ) -from modules.fidesModule.model.service_history import ServiceHistoryRecord +from modules.fides.model.service_history import ServiceHistoryRecord @pytest.fixture @@ -76,6 +76,25 @@ def test_get_slips_threat_intelligence_by_target(db): def test_get_peer_trust_data(db): + db.store_peer_trust_data( + PeerTrustData( + info=PeerInfo( + id="peer-before", + organisations=["org0"], + ip="192.168.0.1", + ), + has_fixed_trust=False, + service_trust=0.1, + reputation=0.2, + recommendation_trust=0.3, + competence_belief=0.4, + integrity_belief=0.5, + initial_reputation_provided_by_count=1, + service_history=[], + recommendation_history=[], + ) + ) + # Create peer info and peer trust data peer_info = PeerInfo( id="peer123", organisations=["org1", "org2"], ip="192.168.0.10" @@ -121,6 +140,54 @@ def test_get_peer_trust_data(db): assert result.recommendation_history[0].satisfaction == 0.8 +def test_store_peer_trust_data_overwrites_existing_history(db): + """Ensure peer trust updates replace older rows for the same peer.""" + peer_info = PeerInfo( + id="peer123", organisations=["org1", "org2"], ip="192.168.0.10" + ) + + db.store_peer_trust_data( + PeerTrustData( + info=peer_info, + has_fixed_trust=False, + service_trust=0.1, + reputation=0.2, + recommendation_trust=0.3, + competence_belief=0.4, + integrity_belief=0.5, + initial_reputation_provided_by_count=1, + service_history=[], + recommendation_history=[], + ) + ) + + db.store_peer_trust_data( + PeerTrustData( + info=peer_info, + has_fixed_trust=False, + service_trust=0.7, + reputation=0.8, + recommendation_trust=0.9, + competence_belief=0.6, + integrity_belief=0.5, + initial_reputation_provided_by_count=2, + service_history=[ + ServiceHistoryRecord( + satisfaction=0.5, weight=0.9, timestamp=20.15 + ) + ], + recommendation_history=[], + ) + ) + + result = db.get_peer_trust_data("peer123") + + assert result is not None + assert result.service_trust == 0.7 + assert result.reputation == 0.8 + assert len(result.service_history) == 1 + + def test_get_connected_peers_1(db): # Create PeerInfo data for multiple peers peers = [ diff --git a/tests/unit/modules/flowalerts/test_conn.py b/tests/unit/modules/flow_alerts/test_conn.py similarity index 95% rename from tests/unit/modules/flowalerts/test_conn.py rename to tests/unit/modules/flow_alerts/test_conn.py index 5d6c520d8..15bdf76e7 100644 --- a/tests/unit/modules/flowalerts/test_conn.py +++ b/tests/unit/modules/flow_alerts/test_conn.py @@ -1,6 +1,6 @@ # SPDX-FileCopyrightText: 2021 Sebastian Garcia # SPDX-License-Identifier: GPL-2.0-only -"""Unit test for modules/flowalerts/conn.py""" +"""Unit test for modules/flow_alerts/conn.py""" from slips_files.core.flows.zeek import Conn from tests.module_factory import ModuleFactory @@ -163,7 +163,7 @@ def test_check_unknown_port( conn.db.is_ftp_port.return_value = mock_is_ftp_port port_belongs_mock = mocker.patch( - "modules.flowalerts.conn.Conn.port_belongs_to_an_org" + "modules.flow_alerts.conn.Conn.port_belongs_to_an_org" ) port_belongs_mock.return_value = mock_port_belongs_to_an_org @@ -352,7 +352,7 @@ def test_check_multiple_reconnection_attempts( """ conn = ModuleFactory().create_conn_analyzer_obj() mock_set_evidence = mocker.patch( - "modules.flowalerts.set_evidence." + "modules.flow_alerts.set_evidence." "SetEvidenceHelper.multiple_reconnection_attempts" ) conn.db.get_reconnections_for_tw.return_value = {} @@ -466,7 +466,7 @@ def test_check_data_upload( conn = ModuleFactory().create_conn_analyzer_obj() conn.is_ignored_ip_data_upload = Mock(return_value=ignored_ip) mock_set_evidence = mocker.patch( - "modules.flowalerts.set_evidence.SetEvidenceHelper.data_exfiltration" + "modules.flow_alerts.set_evidence.SetEvidenceHelper.data_exfiltration" ) conn.gateway = "192.168.1.1" flow = Conn( @@ -1235,3 +1235,51 @@ def test_check_connection_to_local_ip( ) conn.check_connection_to_local_ip(twid, flow) assert conn.set_evidence.conn_to_private_ip.call_count == expected_calls + + +@pytest.mark.parametrize( + "msg, expected_result", + [ + ( + { + "channel": "tw_closed", + "data": json.dumps( + { + "text": "profile_192.168.1.1_timewindow3", + "version": "test-version", + } + ), + }, + ("profile_192.168.1.1", "timewindow3"), + ), + ( + { + "channel": "tw_closed", + "data": json.dumps( + { + "text": json.dumps( + { + "text": "profile_192.168.1.1_timewindow3", + "version": "test-version", + } + ), + "version": "test-version", + } + ), + }, + ("profile_192.168.1.1", "timewindow3"), + ), + ( + { + "channel": "tw_closed", + "data": json.dumps( + {"text": "invalid_payload", "version": "test-version"} + ), + }, + None, + ), + ], +) +def test_parse_closed_tw_message(msg, expected_result): + conn = ModuleFactory().create_conn_analyzer_obj() + assert conn._parse_closed_tw_message(msg) == expected_result diff --git a/tests/unit/modules/flowalerts/test_dns.py b/tests/unit/modules/flow_alerts/test_dns.py similarity index 99% rename from tests/unit/modules/flowalerts/test_dns.py rename to tests/unit/modules/flow_alerts/test_dns.py index 2d9ba93f0..f1bdd0064 100644 --- a/tests/unit/modules/flowalerts/test_dns.py +++ b/tests/unit/modules/flow_alerts/test_dns.py @@ -1,6 +1,6 @@ # SPDX-FileCopyrightText: 2021 Sebastian Garcia # SPDX-License-Identifier: GPL-2.0-only -"""Unit test for modules/flowalerts/dns.py""" +"""Unit test for modules/flow_alerts/dns.py""" from dataclasses import asdict diff --git a/tests/unit/modules/flowalerts/test_downloaded_file.py b/tests/unit/modules/flow_alerts/test_downloaded_file.py similarity index 98% rename from tests/unit/modules/flowalerts/test_downloaded_file.py rename to tests/unit/modules/flow_alerts/test_downloaded_file.py index 3a8c29715..d6e2e9da5 100644 --- a/tests/unit/modules/flowalerts/test_downloaded_file.py +++ b/tests/unit/modules/flow_alerts/test_downloaded_file.py @@ -1,6 +1,6 @@ # SPDX-FileCopyrightText: 2021 Sebastian Garcia # SPDX-License-Identifier: GPL-2.0-only -"""Unit test for modules/flowalerts/download_file.py""" +"""Unit test for modules/flow_alerts/download_file.py""" from dataclasses import asdict from unittest.mock import Mock diff --git a/tests/unit/modules/flowalerts/test_notice.py b/tests/unit/modules/flow_alerts/test_notice.py similarity index 99% rename from tests/unit/modules/flowalerts/test_notice.py rename to tests/unit/modules/flow_alerts/test_notice.py index c2238b860..d63770b5d 100644 --- a/tests/unit/modules/flowalerts/test_notice.py +++ b/tests/unit/modules/flow_alerts/test_notice.py @@ -1,6 +1,6 @@ # SPDX-FileCopyrightText: 2021 Sebastian Garcia # SPDX-License-Identifier: GPL-2.0-only -"""Unit test for modules/flowalerts/notice.py""" +"""Unit test for modules/flow_alerts/notice.py""" from dataclasses import asdict from unittest.mock import Mock diff --git a/tests/unit/modules/flowalerts/test_set_evidence.py b/tests/unit/modules/flow_alerts/test_set_evidence.py similarity index 99% rename from tests/unit/modules/flowalerts/test_set_evidence.py rename to tests/unit/modules/flow_alerts/test_set_evidence.py index 929e14ba8..c2ce2836f 100644 --- a/tests/unit/modules/flowalerts/test_set_evidence.py +++ b/tests/unit/modules/flow_alerts/test_set_evidence.py @@ -669,6 +669,10 @@ def test_conn_without_dns(time_difference_hours, expected_confidence): args, _ = set_ev.db.set_evidence.call_args evidence = args[0] assert evidence.confidence == expected_confidence + assert ( + evidence.description + == "A connection without DNS resolution to Destination IP: 10.0.0.1" + ) @pytest.mark.parametrize( diff --git a/tests/unit/modules/flowalerts/test_smtp.py b/tests/unit/modules/flow_alerts/test_smtp.py similarity index 98% rename from tests/unit/modules/flowalerts/test_smtp.py rename to tests/unit/modules/flow_alerts/test_smtp.py index 5edbdbefe..f22b9553a 100644 --- a/tests/unit/modules/flowalerts/test_smtp.py +++ b/tests/unit/modules/flow_alerts/test_smtp.py @@ -1,6 +1,6 @@ # SPDX-FileCopyrightText: 2021 Sebastian Garcia # SPDX-License-Identifier: GPL-2.0-only -"""Unit test for modules/flowalerts/flowalerts.py""" +"""Unit test for modules/flow_alerts/flow_alerts.py""" from dataclasses import asdict diff --git a/tests/unit/modules/flowalerts/test_software.py b/tests/unit/modules/flow_alerts/test_software.py similarity index 99% rename from tests/unit/modules/flowalerts/test_software.py rename to tests/unit/modules/flow_alerts/test_software.py index df5e5aada..9a1471ad0 100644 --- a/tests/unit/modules/flowalerts/test_software.py +++ b/tests/unit/modules/flow_alerts/test_software.py @@ -1,6 +1,6 @@ # SPDX-FileCopyrightText: 2021 Sebastian Garcia # SPDX-License-Identifier: GPL-2.0-only -"""Unit test for modules/flowalerts/software.py""" +"""Unit test for modules/flow_alerts/software.py""" from slips_files.core.flows.zeek import Software from tests.module_factory import ModuleFactory diff --git a/tests/unit/modules/flowalerts/test_ssh.py b/tests/unit/modules/flow_alerts/test_ssh.py similarity index 95% rename from tests/unit/modules/flowalerts/test_ssh.py rename to tests/unit/modules/flow_alerts/test_ssh.py index ad7fb34ce..a85a349e5 100644 --- a/tests/unit/modules/flowalerts/test_ssh.py +++ b/tests/unit/modules/flow_alerts/test_ssh.py @@ -1,6 +1,6 @@ # SPDX-FileCopyrightText: 2021 Sebastian Garcia # SPDX-License-Identifier: GPL-2.0-only -"""Unit test for modules/flowalerts/ssh.py""" +"""Unit test for modules/flow_alerts/ssh.py""" from dataclasses import asdict @@ -50,10 +50,10 @@ async def test_check_successful_ssh( mocker.patch("asyncio.sleep", return_value=get_mock_coro(None)) mock_set_evidence_ssh_successful_by_zeek = mocker.patch( - "modules.flowalerts.ssh.SSH.set_evidence_ssh_successful_by_zeek" + "modules.flow_alerts.ssh.SSH.set_evidence_ssh_successful_by_zeek" ) mock_detect_slips = mocker.patch( - "modules.flowalerts.ssh.SSH.detect_successful_ssh_by_slips" + "modules.flow_alerts.ssh.SSH.detect_successful_ssh_by_slips" ) flow = SSH( starttime="1726655400.0", @@ -85,7 +85,7 @@ async def test_check_successful_ssh( assert mock_detect_slips.called == expected_called_slips -@patch("modules.flowalerts.ssh.ConfigParser") +@patch("modules.flow_alerts.ssh.ConfigParser") def test_read_configuration(mock_config_parser): mock_parser = mock_config_parser.return_value mock_parser.ssh_succesful_detection_threshold.return_value = 12345 diff --git a/tests/unit/modules/flowalerts/test_ssl.py b/tests/unit/modules/flow_alerts/test_ssl.py similarity index 97% rename from tests/unit/modules/flowalerts/test_ssl.py rename to tests/unit/modules/flow_alerts/test_ssl.py index a71fe1ac7..41872e3d6 100644 --- a/tests/unit/modules/flowalerts/test_ssl.py +++ b/tests/unit/modules/flow_alerts/test_ssl.py @@ -1,6 +1,6 @@ # SPDX-FileCopyrightText: 2021 Sebastian Garcia # SPDX-License-Identifier: GPL-2.0-only -"""Unit test for modules/flowalerts/ssl.py""" +"""Unit test for modules/flow_alerts/ssl.py""" from dataclasses import asdict from unittest.mock import ( @@ -47,7 +47,7 @@ def test_check_self_signed_certs( ): ssl = ModuleFactory().create_ssl_analyzer_obj() mock_set_evidence = mocker.patch( - "modules.flowalerts.set_evidence." + "modules.flow_alerts.set_evidence." "SetEvidenceHelper.self_signed_certificates" ) flow = SSL( @@ -99,10 +99,10 @@ def test_detect_malicious_ja3( ): ssl = ModuleFactory().create_ssl_analyzer_obj() mock_set_evidence_ja3 = mocker.patch( - "modules.flowalerts.set_evidence.SetEvidenceHelper.malicious_ja3" + "modules.flow_alerts.set_evidence.SetEvidenceHelper.malicious_ja3" ) mock_set_evidence_ja3s = mocker.patch( - "modules.flowalerts.set_evidence.SetEvidenceHelper.malicious_ja3s" + "modules.flow_alerts.set_evidence.SetEvidenceHelper.malicious_ja3s" ) ssl.db.get_all_blacklisted_ja3.return_value = { @@ -150,7 +150,7 @@ def test_detect_malicious_ja3( def test_detect_doh(mocker, is_doh, expected_calls): ssl = ModuleFactory().create_ssl_analyzer_obj() mock_set_evidence_doh = mocker.patch( - "modules.flowalerts.set_evidence.SetEvidenceHelper.doh" + "modules.flow_alerts.set_evidence.SetEvidenceHelper.doh" ) ssl.db.set_ip_info = Mock() flow = SSL( @@ -204,7 +204,7 @@ async def test_check_pastebin_download( ssl.pastebin_downloads_threshold = 12000 ssl.wait_for_new_flows_or_timeout = get_mock_coro(True) mock_set_evidence = mocker.patch( - "modules.flowalerts.set_evidence.SetEvidenceHelper.pastebin_download" + "modules.flow_alerts.set_evidence.SetEvidenceHelper.pastebin_download" ) flow = SSL( @@ -260,7 +260,7 @@ async def test_check_pastebin_download( def test_detect_incompatible_cn(mocker, subject, expected_call_count): ssl = ModuleFactory().create_ssl_analyzer_obj() mock_set_evidence = mocker.patch( - "modules.flowalerts.set_evidence.SetEvidenceHelper.incompatible_cn" + "modules.flow_alerts.set_evidence.SetEvidenceHelper.incompatible_cn" ) ssl.db.whitelist.organization_whitelist.is_ip_in_org.return_value = False diff --git a/tests/unit/modules/flowalerts/test_tunnel.py b/tests/unit/modules/flow_alerts/test_tunnel.py similarity index 94% rename from tests/unit/modules/flowalerts/test_tunnel.py rename to tests/unit/modules/flow_alerts/test_tunnel.py index 473ba49fa..7ca78b722 100644 --- a/tests/unit/modules/flowalerts/test_tunnel.py +++ b/tests/unit/modules/flow_alerts/test_tunnel.py @@ -1,6 +1,6 @@ # SPDX-FileCopyrightText: 2021 Sebastian Garcia # SPDX-License-Identifier: GPL-2.0-only -"""Unit test for modules/flowalerts/tunnel.py""" +"""Unit test for modules/flow_alerts/tunnel.py""" from dataclasses import asdict from unittest.mock import Mock @@ -30,7 +30,7 @@ def test_check_gre_tunnel(mocker, tunnel_type, expected_call_count): """ tunnel = ModuleFactory().create_tunnel_analyzer_obj() mock_set_evidence = mocker.patch( - "modules.flowalerts.set_evidence.SetEvidenceHelper.gre_tunnel" + "modules.flow_alerts.set_evidence.SetEvidenceHelper.gre_tunnel" ) flow = Tunnel( starttime="1726655400.0", @@ -61,7 +61,7 @@ def test_check_gre_tunnel(mocker, tunnel_type, expected_call_count): def test_check_gre_scan(mocker, tunnel_type, expected_call_count): tunnel = ModuleFactory().create_tunnel_analyzer_obj() mock_set_evidence = mocker.patch( - "modules.flowalerts.set_evidence.SetEvidenceHelper.gre_scan" + "modules.flow_alerts.set_evidence.SetEvidenceHelper.gre_scan" ) flow = Tunnel( starttime="1726655400.0", diff --git a/tests/unit/modules/ip_info/test_asn_info.py b/tests/unit/modules/ip_info/test_asn_info.py index a1f1058be..8622c78c9 100644 --- a/tests/unit/modules/ip_info/test_asn_info.py +++ b/tests/unit/modules/ip_info/test_asn_info.py @@ -4,6 +4,7 @@ from tests.module_factory import ModuleFactory import pytest +import dns.resolver from unittest.mock import Mock, patch, call import time import json @@ -84,6 +85,14 @@ def test_cache_ip_range(ip_address, expected_whois_info, expected_cached_data): assert result == expected_cached_data +def test_cache_ip_range_without_resolver_configuration(): + asn_info = ModuleFactory().create_asn_obj() + + with patch("ipwhois.IPWhois.lookup_rdap") as mock_lookup_rdap: + mock_lookup_rdap.side_effect = dns.resolver.NoResolverConfiguration + assert asn_info.cache_ip_range("8.8.8.8") is False + + @pytest.mark.parametrize( "ip_address, first_octet, cached_data, expected_result", [ diff --git a/tests/unit/modules/p2ptrust/trust/test_base_model.py b/tests/unit/modules/p2p_trust/trust/test_base_model.py similarity index 100% rename from tests/unit/modules/p2ptrust/trust/test_base_model.py rename to tests/unit/modules/p2p_trust/trust/test_base_model.py diff --git a/tests/unit/modules/p2ptrust/trust/test_go_director.py b/tests/unit/modules/p2p_trust/trust/test_go_director.py similarity index 98% rename from tests/unit/modules/p2ptrust/trust/test_go_director.py rename to tests/unit/modules/p2p_trust/trust/test_go_director.py index eb8ed9e92..e9337eaf7 100644 --- a/tests/unit/modules/p2ptrust/trust/test_go_director.py +++ b/tests/unit/modules/p2p_trust/trust/test_go_director.py @@ -556,11 +556,11 @@ def test_respond_to_message_request_with_info(): confidence = 0.8 with patch( - "modules.p2ptrust.utils." "go_director.get_ip_info_from_slips", + "modules.p2p_trust.utils." "go_director.get_ip_info_from_slips", return_value=(score, confidence), ) as mock_get_info: with patch( - "modules.p2ptrust." "utils.go_director." "send_evaluation_to_go" + "modules.p2p_trust." "utils.go_director." "send_evaluation_to_go" ) as mock_send_evaluation: go_director.respond_to_message_request(key, reporter) @@ -591,11 +591,11 @@ def test_respond_to_message_request_without_info(): confidence = None with patch( - "modules.p2ptrust.utils." "go_director.get_ip_info_from_slips", + "modules.p2p_trust.utils." "go_director.get_ip_info_from_slips", return_value=(score, confidence), ) as mock_get_info: with patch( - "modules.p2ptrust.utils." "go_director.send_evaluation_to_go" + "modules.p2p_trust.utils." "go_director.send_evaluation_to_go" ) as mock_send_evaluation: go_director.respond_to_message_request(key, reporter) diff --git a/tests/unit/modules/p2ptrust/trust/test_trustdb.py b/tests/unit/modules/p2p_trust/trust/test_trustdb.py similarity index 100% rename from tests/unit/modules/p2ptrust/trust/test_trustdb.py rename to tests/unit/modules/p2p_trust/trust/test_trustdb.py diff --git a/tests/unit/modules/riskiq/test_riskiq.py b/tests/unit/modules/risk_iq/test_risk_iq.py similarity index 85% rename from tests/unit/modules/riskiq/test_riskiq.py rename to tests/unit/modules/risk_iq/test_risk_iq.py index 1b6f3f621..ef83583ae 100644 --- a/tests/unit/modules/riskiq/test_riskiq.py +++ b/tests/unit/modules/risk_iq/test_risk_iq.py @@ -36,11 +36,11 @@ def test_get_passive_dns(mock_get, ip, api_response, expected_result): mock_response.status_code = 200 mock_response.text = json.dumps(api_response) - riskiq = ModuleFactory().create_riskiq_obj() - riskiq.riskiq_email = "test@example.com" - riskiq.riskiq_key = "testkey" + risk_iq = ModuleFactory().create_riskiq_obj() + risk_iq.riskiq_email = "test@example.com" + risk_iq.riskiq_key = "testkey" - result = riskiq.get_passive_dns(ip) + result = risk_iq.get_passive_dns(ip) assert result == expected_result mock_get.assert_called_once_with( @@ -68,7 +68,7 @@ def test_pre_main(email, key, expected_result, mock_db): with patch( "slips_files.common.slips_utils.utils.drop_root_privs_permanently" ): - riskiq = ModuleFactory().create_riskiq_obj() - riskiq.riskiq_email = email - riskiq.riskiq_key = key - assert riskiq.pre_main() == expected_result + risk_iq = ModuleFactory().create_riskiq_obj() + risk_iq.riskiq_email = email + risk_iq.riskiq_key = key + assert risk_iq.pre_main() == expected_result diff --git a/tests/unit/modules/rnn_cc_detection/test_rnn_cc_detection.py b/tests/unit/modules/rnn_cc_detection/test_rnn_cc_detection.py index 1a0f93d58..fbb32f544 100644 --- a/tests/unit/modules/rnn_cc_detection/test_rnn_cc_detection.py +++ b/tests/unit/modules/rnn_cc_detection/test_rnn_cc_detection.py @@ -40,7 +40,7 @@ def test_get_confidence(pre_behavioral_model, expected_confidence): ) def test_handle_tw_closed(msg_data, expected_profileid, expected_twid): cc_detection = ModuleFactory().create_rnn_detection_object() - msg = {"data": msg_data} + msg = {"data": json.dumps({"text": msg_data, "version": "test-version"})} with patch.object(cc_detection.letters_exporter, "export") as mock_export: cc_detection.handle_tw_closed(msg) diff --git a/tests/unit/modules/update_manager/test_update_file_manager.py b/tests/unit/modules/update_manager/test_update_file_manager.py index faa7bc84a..838ad74be 100644 --- a/tests/unit/modules/update_manager/test_update_file_manager.py +++ b/tests/unit/modules/update_manager/test_update_file_manager.py @@ -1,6 +1,6 @@ # SPDX-FileCopyrightText: 2021 Sebastian Garcia # SPDX-License-Identifier: GPL-2.0-only -"""Unit test for modules/update_manager/update_manager.py""" +"""Unit test for modules/feeds_update_manager/feeds_update_manager.py""" from tests.module_factory import ModuleFactory import json diff --git a/tests/unit/slips/test_daemon.py b/tests/unit/slips/test_daemon.py index d7c387739..b2ceeffb4 100644 --- a/tests/unit/slips/test_daemon.py +++ b/tests/unit/slips/test_daemon.py @@ -244,9 +244,63 @@ def test_is_running(pid, lock_side_effect, expected_result): daemon = ModuleFactory().create_daemon_object() daemon.pid = pid - with patch("exclusiveprocess.Lock") as mock_lock: + with patch.object(daemon, "is_pid_running", return_value=bool(pid)), patch( + "exclusiveprocess.Lock" + ) as mock_lock: mock_lock.return_value.__enter__.side_effect = lock_side_effect result = daemon._is_running() assert result == expected_result + + +@pytest.mark.parametrize( + "pid, expected_result", + [ + (12345, True), + (None, False), + ], +) +def test_is_pid_running(pid, expected_result): + daemon = ModuleFactory().create_daemon_object() + daemon.pid = pid + + with patch("os.kill") as mock_kill: + result = daemon.is_pid_running() + + assert result == expected_result + if expected_result: + mock_kill.assert_called_once_with(pid, 0) + else: + mock_kill.assert_not_called() + + +def test_is_running_removes_stale_pidfile(): + daemon = ModuleFactory().create_daemon_object() + daemon.pid = 12345 + + with patch.object( + daemon, "is_pid_running", return_value=False + ), patch.object(daemon, "delete_pidfile") as mock_delete_pidfile: + result = daemon._is_running() + + assert result is False + mock_delete_pidfile.assert_called_once() + + +def test_start_updates_slips_pid(): + daemon = ModuleFactory().create_daemon_object() + daemon.pid = None + + def mock_daemonize(): + daemon.pid = "23456" + + with patch.object( + daemon, "daemonize", side_effect=mock_daemonize + ), patch.object(daemon, "print"), patch("builtins.print"), patch( + "os.getpid", return_value=23456 + ): + daemon.start() + + assert daemon.slips.pid == 23456 + daemon.slips.start.assert_called_once() diff --git a/tests/unit/slips/test_main.py b/tests/unit/slips/test_main.py index eef002190..8c095e0a1 100644 --- a/tests/unit/slips/test_main.py +++ b/tests/unit/slips/test_main.py @@ -203,7 +203,7 @@ def test_print( text, verbose, debug, log_to_logfiles_only, expected_notification ): main = ModuleFactory().create_main_obj() - main.name = "Main" + main.name = "main" main.printer = Mock() main.printer.print = Mock() main.print(text, verbose, debug, log_to_logfiles_only) @@ -301,7 +301,8 @@ def test_delete_zeek_files_enabled(): main = ModuleFactory().create_main_obj() main.conf = MagicMock() main.conf.delete_zeek_files.return_value = True - main.zeek_dir = "zeek_dir" + main.db = MagicMock() + main.db.get_zeek_output_dir.return_value = "zeek_dir" with patch("shutil.rmtree") as mock_rmtree: main.delete_zeek_files() @@ -312,13 +313,32 @@ def test_delete_zeek_files_disabled(): main = ModuleFactory().create_main_obj() main.conf = MagicMock() main.conf.delete_zeek_files.return_value = False - main.zeek_dir = "zeek_dir" + main.db = MagicMock() + main.db.get_zeek_output_dir.return_value = "zeek_dir" with patch("shutil.rmtree") as mock_rmtree: main.delete_zeek_files() mock_rmtree.assert_not_called() +def test_store_zeek_dir_copy_reads_zeek_dir_from_db(): + main = ModuleFactory().create_main_obj() + main.conf = MagicMock() + main.conf.store_a_copy_of_zeek_files.return_value = True + main.db = MagicMock() + main.db.get_zeek_output_dir.return_value = "zeek_dir" + main.args.output = "output" + + with ( + patch.object(main, "was_running_zeek", return_value=True), + patch(f"{main.__class__.__module__}.copy_tree") as mock_copy_tree, + patch("builtins.print"), + ): + main.store_zeek_dir_copy() + + mock_copy_tree.assert_called_once_with("zeek_dir", "output/zeek_files") + + # TODO should be moved to utils unit tests after the PR is merged # def test_get_slips_version(): # main = ModuleFactory().create_main_obj() @@ -379,29 +399,6 @@ def test_check_zeek_or_bro_not_found(): mock_terminate.assert_called_once() -@pytest.mark.parametrize( - "store_in_output, expected_dir", - [ - # Test Case 1: Store Zeek files in the output directory - (True, "output/zeek_files"), - # Test Case 2: Use default directory for Zeek files - (False, "zeek_files_inputfile/"), - ], -) -def test_prepare_zeek_output_dir(store_in_output, expected_dir): - main = ModuleFactory().create_main_obj() - main.input_information = "/path/to/inputfile.pcap" - main.args = Mock() - main.args.output = "output" - main.conf = Mock() - main.conf.store_zeek_files_in_the_output_dir.return_value = store_in_output - - with patch("os.path.join", lambda *args: "/".join(args)): - main.prepare_zeek_output_dir() - - assert main.zeek_dir == expected_dir - - def test_terminate_slips_interactive(): main = ModuleFactory().create_main_obj() main.mode = "interactive" @@ -445,6 +442,7 @@ def main_obj(tmp_path): main = ModuleFactory().create_main_obj() main.args = MagicMock() main.args.output = str(tmp_path / "test_output") + main.args.is_slips_started_by_an_update = False return main @@ -488,7 +486,9 @@ def test_prepare_output_dir_without_o_flag( ): main = ModuleFactory().create_main_obj() main.args = MagicMock() - main.alerts_default_path = str(tmp_path) + main.args.is_slips_started_by_an_update = False + main.args.output = None + main.parent_output_dir = str(tmp_path) main.input_information = "/fake/input/wlp3s0" monkeypatch.setattr(sys, "argv", ["script.py"]) # No -o diff --git a/tests/unit/slips_files/common/abstracts/test_imodule.py b/tests/unit/slips_files/common/abstracts/test_imodule.py new file mode 100644 index 000000000..80d4ef9b8 --- /dev/null +++ b/tests/unit/slips_files/common/abstracts/test_imodule.py @@ -0,0 +1,49 @@ +# SPDX-FileCopyrightText: 2021 Sebastian Garcia +# SPDX-License-Identifier: GPL-2.0-only +import json + +from tests.module_factory import ModuleFactory +from slips_files.common.slips_utils import utils + + +def test_imodule_exposes_slips_version(): + ip_info = ModuleFactory().create_ip_info_obj() + + assert ip_info.slips_version == utils.get_slips_version() + + +def test_get_msg_discards_messages_with_different_version(): + ip_info = ModuleFactory().create_ip_info_obj() + ip_info.channels = {"new_ip": "channel_obj"} + ip_info.channel_tracker = ip_info.init_channel_tracker() + ip_info.db.get_message.return_value = { + "channel": "new_ip", + "data": json.dumps({"text": "1.2.3.4", "version": "0.0.0"}), + } + + msg = ip_info.get_msg("new_ip") + + assert msg is None + assert ip_info.channel_tracker["new_ip"]["msg_received"] is False + ip_info.db.incr_msgs_received_in_channel.assert_not_called() + + +def test_get_msg_accepts_messages_with_current_version(): + ip_info = ModuleFactory().create_ip_info_obj() + ip_info.channels = {"new_ip": "channel_obj"} + ip_info.channel_tracker = ip_info.init_channel_tracker() + message = { + "channel": "new_ip", + "data": json.dumps( + {"text": "1.2.3.4", "version": ip_info.slips_version} + ), + } + ip_info.db.get_message.return_value = message + + msg = ip_info.get_msg("new_ip") + + assert msg == message + assert ip_info.channel_tracker["new_ip"]["msg_received"] is True + ip_info.db.incr_msgs_received_in_channel.assert_called_once_with( + ip_info.name, "new_ip" + ) diff --git a/tests/unit/slips_files/common/test_output_paths.py b/tests/unit/slips_files/common/test_output_paths.py new file mode 100644 index 000000000..4da0e2171 --- /dev/null +++ b/tests/unit/slips_files/common/test_output_paths.py @@ -0,0 +1,33 @@ +"""Unit tests for output path helpers.""" + +from slips_files.common.output_paths import ( + DATABASES_DIRNAME, + get_databases_dir_path_inside_output_dir, + get_this_db_path_inside_output_dir, +) +from tests.module_factory import ModuleFactory + + +def test_get_databases_dir_path_inside_output_dir_creates_directory(tmp_path): + """The databases helper should create and return the output databases directory.""" + module_factory = ModuleFactory() + assert module_factory is not None + + databases_dir = get_databases_dir_path_inside_output_dir( + str(tmp_path / "output") + ) + + assert databases_dir.endswith(DATABASES_DIRNAME) + assert (tmp_path / "output" / DATABASES_DIRNAME).is_dir() + + +def test_get_output_sqlite_path_joins_filename_under_databases_dir(tmp_path): + """The sqlite path helper should return a path inside the databases directory.""" + module_factory = ModuleFactory() + assert module_factory is not None + + sqlite_path = get_this_db_path_inside_output_dir( + str(tmp_path / "output"), "test.db" + ) + + assert sqlite_path.endswith(f"{DATABASES_DIRNAME}/test.db") diff --git a/tests/unit/slips_files/common/test_slips_utils.py b/tests/unit/slips_files/common/test_slips_utils.py index faca6d669..4ba88c40e 100644 --- a/tests/unit/slips_files/common/test_slips_utils.py +++ b/tests/unit/slips_files/common/test_slips_utils.py @@ -27,6 +27,28 @@ def test_get_sha256_hash_from_nonexistent_file(): utils.get_sha256_hash_of_file_contents("nonexistent_file.txt") +def test_initialize_logfile_creates_file(tmp_path): + utils = ModuleFactory().create_utils_obj() + logfile = tmp_path / "logs" / "module.log" + + initialized = utils.initialize_logfile(str(logfile), False) + + assert initialized is True + assert logfile.exists() + assert logfile.read_text() == "" + + +def test_initialize_logfile_skips_file_when_started_by_update(tmp_path): + utils = ModuleFactory().create_utils_obj() + logfile = tmp_path / "module.log" + logfile.write_text("existing\n") + + initialized = utils.initialize_logfile(str(logfile), True) + + assert initialized is False + assert logfile.read_text() == "existing\n" + + @pytest.mark.parametrize( "filepath, expected_result", [ # Testcase 1: Supported file @@ -65,6 +87,29 @@ def test_get_sha256_hash_permission_error(): utils.get_sha256_hash_of_file_contents("restricted_file.txt") +@pytest.mark.parametrize( + "message, expected_payload", + [ + ({"data": "plain-text"}, "plain-text"), + ( + {"data": json.dumps({"text": "stop_slips", "version": "1.0"})}, + "stop_slips", + ), + ( + { + "data": json.dumps( + {"flow": {"uid": "abc"}, "profileid": "profile_1"} + ) + }, + {"flow": {"uid": "abc"}, "profileid": "profile_1"}, + ), + ], +) +def test_get_msg_payload(message, expected_payload): + utils = ModuleFactory().create_utils_obj() + assert utils.get_msg_payload(message) == expected_payload + + @pytest.mark.parametrize( "input_string, expected_output", [ # Testcase1: special chars @@ -84,6 +129,27 @@ def test_sanitize(input_string, expected_output): assert utils.sanitize(input_string) == expected_output +def test_get_ip_identification_as_str_skips_timestamp(): + utils = ModuleFactory().create_utils_obj() + ip_identification = { + "DNS_resolution": ["example.com"], + "SNI": "service.example.com", + "13.0.0.0/8": { + "AS": "Example ASN", + "timestamp": 1775911069.6800127, + }, + "timestamp": 1775911069.6800127, + } + + result = utils.get_ip_identification_as_str(ip_identification) + + assert result == ( + "example.com, SNI: service.example.com, 13.0.0.0/8: " + "AS: Example ASN, , " + ) + assert "timestamp" not in result + + @pytest.mark.parametrize( "ip, expected_val", [ @@ -167,6 +233,22 @@ def test_calculate_confidence(input_value, expected_output): assert utils.calculate_confidence(input_value) == expected_output +@pytest.mark.parametrize( + "score, expected_output", + [ + (0.80, "High"), + (0.95, "High"), + (0.55, "Medium"), + (0.79, "Medium"), + (0.54, "low"), + (0.0, "low"), + ], +) +def test_evidence_confidence_to_string(score, expected_output): + utils = ModuleFactory().create_utils_obj() + assert utils.evidence_confidence_to_string(score) == expected_output + + @pytest.mark.parametrize( "input_value, input_format, expected_output", [ diff --git a/tests/unit/slips_files/core/database/test_database.py b/tests/unit/slips_files/core/database/test_database.py index 8fd597d1a..9c195c2a0 100644 --- a/tests/unit/slips_files/core/database/test_database.py +++ b/tests/unit/slips_files/core/database/test_database.py @@ -10,6 +10,7 @@ import os from slips_files.core.flows.zeek import Conn +from slips_files.core.database.database_manager import DBManager from slips_files.core.database.redis_db.database import RedisDB from tests.module_factory import ModuleFactory @@ -146,11 +147,14 @@ def test_add_mac_addr_with_ipv6_association(): def test_get_the_other_ip_version(): db = ModuleFactory().create_db_manager_obj(6379, flush_db=True) - # profileid is ipv4 + profileid_ipv4 = "profile_192.168.250.250" ipv6 = "2001:0db8:85a3:0000:0000:8a2e:0370:7334" - db.set_ipv6_of_profile(profileid, ipv6) - # the other ip version is ipv6 - other_ip = json.loads(db.get_the_other_ip_version(profileid)) + + db.rdb.get_the_other_ip_version = Mock(return_value=ipv6) + + other_ip = db.get_the_other_ip_version(profileid_ipv4) + + db.rdb.get_the_other_ip_version.assert_called_once_with(profileid_ipv4) assert other_ip == ipv6 @@ -163,20 +167,37 @@ def test_setup_config_file_uses_isolated_path_and_preserves_save( ) monkeypatch.setattr(RedisDB, "_conf_file_template", str(template)) - monkeypatch.setattr(RedisDB, "output_dir", tmp_path) - monkeypatch.setattr(RedisDB, "redis_port", 6379) - monkeypatch.setattr(RedisDB, "args", Mock(save=False)) + monkeypatch.setattr(RedisDB, "output_dir", tmp_path, raising=False) + monkeypatch.setattr(RedisDB, "redis_port", 6379, raising=False) + monkeypatch.setattr(RedisDB, "args", Mock(save=False), raising=False) RedisDB._setup_config_file() expected_conf = ( - tmp_path / f"redis-server-port-{RedisDB.redis_port}-{os.getpid()}.conf" + tmp_path / "redis" / f"redis-server-port-{RedisDB.redis_port}.conf" ) assert RedisDB._conf_file == str(expected_conf) conf_contents = expected_conf.read_text(encoding="utf-8").splitlines() assert 'save ""' in conf_contents assert ( - f"logfile {tmp_path / f'redis-server-port-{RedisDB.redis_port}.log'}" + f"logfile {tmp_path / 'redis' / f'redis-server-port-{RedisDB.redis_port}.log'}" in conf_contents ) + + +def test_init_p2p_trust_db_uses_permanent_dir(tmp_path, monkeypatch): + db = ModuleFactory().create_db_manager_obj(6379) + monkeypatch.chdir(tmp_path) + db.init_p2p_trust_db = DBManager.init_p2p_trust_db.__get__(db, DBManager) + monkeypatch.setattr( + "slips_files.core.database.database_manager.get_this_filepath_inside_permanent_dir", + lambda filename: os.path.join("persistent_state", filename), + ) + + db_path = db.init_p2p_trust_db() + + assert db_path == os.path.join( + "persistent_state", "p2p_trust_runtime", "trustdb.db" + ) + assert os.path.isdir(os.path.join("persistent_state", "p2p_trust_runtime")) diff --git a/tests/unit/slips_files/core/helpers/test_bloom_filters_manager.py b/tests/unit/slips_files/core/helpers/test_bloom_filters_manager.py new file mode 100644 index 000000000..b88565f36 --- /dev/null +++ b/tests/unit/slips_files/core/helpers/test_bloom_filters_manager.py @@ -0,0 +1,32 @@ +# SPDX-FileCopyrightText: 2021 Sebastian Garcia +# SPDX-License-Identifier: GPL-2.0-only +from unittest.mock import Mock, patch + +from slips_files.core.helpers.bloom_filters_manager import BFManager + + +def test_init_whitelisted_orgs_bf_handles_large_org_subnet_lists(): + bf_manager = BFManager.__new__(BFManager) + bf_manager.org_filters = {} + bf_manager.db = Mock() + + domains = ["example.com", "example.org"] + asns = ["AS64500", "AS64501"] + org_ips = {f"10.{idx}.0.0/16": "test" for idx in range(250)} + + bf_manager.db.get_org_info.side_effect = lambda org, info_type: { + "domains": domains, + "asn": asns, + }[info_type] + bf_manager.db.get_org_ips.return_value = org_ips + + with patch( + "slips_files.core.helpers.bloom_filters_manager.utils.supported_orgs", + ["testorg"], + ): + bf_manager._init_whitelisted_orgs_bf() + + assert "testorg" in bf_manager.org_filters + assert "example.com" in bf_manager.org_filters["testorg"]["domains"] + assert "AS64500" in bf_manager.org_filters["testorg"]["asns"] + assert "10.249.0.0/16" in bf_manager.org_filters["testorg"]["first_octets"] diff --git a/tests/unit/slips_files/core/helpers/test_checker.py b/tests/unit/slips_files/core/helpers/test_checker.py index e24c1a6c5..ce2e45fc4 100644 --- a/tests/unit/slips_files/core/helpers/test_checker.py +++ b/tests/unit/slips_files/core/helpers/test_checker.py @@ -14,7 +14,6 @@ def test_clear_redis_cache(): checker.clear_redis_cache() checker.main.redis_man.clear_redis_cache_database.assert_called_once() assert checker.main.input_information == "" - assert checker.main.zeek_dir == "" checker.main.redis_man.log_redis_server_pid.assert_called_once_with( 6379, mock.ANY ) diff --git a/tests/unit/slips_files/core/helpers/whitelist/test_whitelist.py b/tests/unit/slips_files/core/helpers/whitelist/test_whitelist.py index a11f7da1d..998eb6837 100644 --- a/tests/unit/slips_files/core/helpers/whitelist/test_whitelist.py +++ b/tests/unit/slips_files/core/helpers/whitelist/test_whitelist.py @@ -33,29 +33,27 @@ def test_load_org_asn( assert asn in parsed_asn -@patch( - "slips_files.core.helpers.whitelist." - "whitelist_parser.WhitelistParser.load_org_ips" -) -def test_load_org_ips( - mock_load_org_ips, -): +def test_load_org_ips(): """ - Test load_org_IPs without modifying real files. + Test load_org_ips reads org IP ranges from the expected file. """ whitelist = ModuleFactory().create_whitelist_obj() - mock_load_org_ips.return_value = { - "34": ["34.64.0.0/10"], - "216": ["216.58.192.0/19"], - } - org_subnets = whitelist.parser.load_org_ips("google") # Call the method + whitelist.db.set_org_cidrs = MagicMock() + file_content = "34.64.0.0/10\n216.58.192.0/19\ninvalid\n" + + with patch( + "builtins.open", mock_open(read_data=file_content) + ) as mock_file: + org_subnets = whitelist.parser.load_org_ips("google") assert "34" in org_subnets assert "216" in org_subnets assert "34.64.0.0/10" in org_subnets["34"] assert "216.58.192.0/19" in org_subnets["216"] - - mock_load_org_ips.assert_called_once_with("google") + mock_file.assert_called_once_with( + "slips_files/organizations_info/google_ip_ranges" + ) + whitelist.db.set_org_cidrs.assert_called_once_with("google", org_subnets) @pytest.mark.parametrize( diff --git a/tests/unit/slips_files/core/input/test_dos_protector.py b/tests/unit/slips_files/core/input/test_dos_protector.py new file mode 100644 index 000000000..b406ccd8e --- /dev/null +++ b/tests/unit/slips_files/core/input/test_dos_protector.py @@ -0,0 +1,108 @@ +# SPDX-FileCopyrightText: 2021 Sebastian Garcia +# SPDX-License-Identifier: GPL-2.0-only +from unittest.mock import Mock, patch + +from slips_files.core.input.zeek.utils.dos_protector import DoSProtector + + +def make_protector(is_running_non_stop=True, flows_per_second=0): + db = Mock() + db.is_running_non_stop.return_value = is_running_non_stop + db.get_core_module_flows_per_second.return_value = flows_per_second + + input_process = Mock() + input_process.db = db + input_process.print = Mock() + + return DoSProtector(input_process), input_process, db + + +def test_get_input_flows_per_min_uses_db_value(): + protector, _, _ = make_protector(flows_per_second=7) + + assert protector._get_input_flows_per_min() == 420 + + +def test_get_sampling_ratio_returns_one_when_input_rate_is_missing(): + protector, _, db = make_protector(flows_per_second=3) + db.get_core_module_flows_per_second.return_value = None + + assert protector._get_sampling_ratio() == 1 + + +def test_should_run_returns_false_when_not_running_non_stop(): + protector, _, _ = make_protector(is_running_non_stop=False) + + assert protector._should_run() is False + + +def test_should_run_returns_true_while_sampling_window_is_active(): + protector, _, _ = make_protector(is_running_non_stop=True) + protector.flow_sampling_stop_time = 120 + + with patch( + "slips_files.core.input.zeek.utils.dos_protector.time.time", + return_value=100, + ): + assert protector._should_run() is True + + +def test_should_run_stops_sampling_and_prints_when_throughput_recovers(): + protector, input_process, _ = make_protector( + is_running_non_stop=True, flows_per_second=10 + ) + protector._is_now_sampling = True + + with patch( + "slips_files.core.input.zeek.utils.dos_protector.time.time", + return_value=100, + ): + assert protector._should_run() is False + + assert protector._is_now_sampling is False + input_process.print.assert_called_once() + assert ( + "Throughput is back to normal" in input_process.print.call_args[0][0] + ) + + +def test_get_number_of_flows_to_skip_updates_sampling_window_and_prints(): + protector, input_process, _ = make_protector( + is_running_non_stop=True, flows_per_second=50 + ) + protector.flows_per_min_threshold = 2000 + protector.sampling_time_window = 60 + + with ( + patch( + "slips_files.core.input.zeek.utils.dos_protector.time.time", + side_effect=[100, 100, 100, 100], + ), + patch( + "slips_files.core.input.zeek.utils.dos_protector.utils.convert_ts_format", + return_value="formatted-ts", + ), + ): + assert protector.get_number_of_flows_to_skip() == 449 + + assert protector.flow_sampling_stop_time == 160 + assert protector._is_now_sampling is True + input_process.print.assert_called_once() + assert "Slips started skipping flows due to high traffic" in ( + input_process.print.call_args[0][0] + ) + + +def test_print_skipping_flows_warning_extends_existing_sampling_window(): + protector, input_process, _ = make_protector() + protector._is_now_sampling = True + protector.flow_sampling_stop_time = 160 + + with patch( + "slips_files.core.input.zeek.utils.dos_protector.utils.convert_ts_format", + return_value="formatted-ts", + ): + protector.print_skipping_flows_warning(449, True) + + input_process.print.assert_called_once() + assert "still under high traffic" in input_process.print.call_args[0][0] diff --git a/tests/unit/slips_files/core/input/test_input.py b/tests/unit/slips_files/core/input/test_input.py index c89ba7eac..42e825aee 100644 --- a/tests/unit/slips_files/core/input/test_input.py +++ b/tests/unit/slips_files/core/input/test_input.py @@ -17,31 +17,28 @@ "input_type,input_information", [(InputType.PCAP, "dataset/test7-malicious.pcap")], ) -def test_handle_pcap_and_interface(tmp_path, input_type, input_information): - input = ModuleFactory().create_input_obj(input_information, input_type) - input.zeek_dir = tmp_path - handler = input.input_handlers[input_type] - input.is_running_non_stop = False +def test_handle_pcap_input(tmp_path, input_type, input_information): + input_process = ModuleFactory().create_input_obj( + input_information, input_type + ) + handler = input_process.input_handlers[input_type] + input_process.is_running_non_stop = False handler.file_remover.start = Mock() - # Mock attributes and methods used inside the function - input.zeek_utils.ensure_zeek_dir = Mock() - input.zeek_utils.init_zeek = Mock() - input.zeek_utils.read_zeek_files = Mock(return_value=7) + input_process.zeek_utils.create_zeek_output_dir = Mock( + return_value=str(tmp_path) + ) + input_process.zeek_utils.init_zeek = Mock() + input_process.zeek_utils.read_zeek_files = Mock(return_value=7) assert handler.run() is True - # Assert that the expected methods were called - input.zeek_utils.ensure_zeek_dir.assert_called_once() - input.zeek_utils.init_zeek.assert_called_once_with( - handler.observer, input.zeek_dir, input.given_path + input_process.zeek_utils.create_zeek_output_dir.assert_called_once() + input_process.zeek_utils.init_zeek.assert_called_once_with( + handler.observer, str(tmp_path), input_process.given_path ) - input.zeek_utils.read_zeek_files.assert_called_once() + input_process.zeek_utils.read_zeek_files.assert_called_once() handler.file_remover.start.assert_not_called() - assert input.lines == 7 - - # Clean up any directories created (safe guard) - if os.path.exists(input.zeek_dir): - shutil.rmtree(input.zeek_dir, ignore_errors=True) + assert input_process.lines == 7 @pytest.mark.parametrize( @@ -98,17 +95,35 @@ def test_handle_zeek_log_file(input_information, expected_output): @pytest.mark.parametrize( - "path, is_tabs, line_cached", + "contents, is_tabs, line_cached, expected_timestamp, expected_data_prefix", [ - ("dataset/test10-mixed-zeek-dir/conn.log", True, False), - ("dataset/test9-mixed-zeek-dir/conn.log", False, True), + ("#fields\tts\tuid\n", True, True, -1, "#fields"), + ( + '{"ts": 22.335172, "uid": "C6ce9q3xECAsonga21"}\n', + False, + True, + 22.335172, + None, + ), + ("#separator \\x09\n", True, False, None, None), ], ) -def test_cache_nxt_line_in_file(path: str, is_tabs: str, line_cached: bool): +def test_cache_nxt_line_in_file( + tmp_path, + contents: str, + is_tabs: str, + line_cached: bool, + expected_timestamp: float, + expected_data_prefix: str, +): """ :param line_cached: should slips cache the first line of this file or not """ + test_file = tmp_path / "conn.log" + test_file.write_text(contents, encoding="utf-8") + path = str(test_file) + input = ModuleFactory().create_input_obj(path, InputType.ZEEK_LOG_FILE) input.zeek_utils.cache_lines = {} input.zeek_utils.file_time = {} @@ -118,6 +133,11 @@ def test_cache_nxt_line_in_file(path: str, is_tabs: str, line_cached: bool): if line_cached: assert input.zeek_utils.cache_lines[path]["type"] == path assert input.zeek_utils.cache_lines[path]["data"] + assert input.zeek_utils.file_time[path] == expected_timestamp + if expected_data_prefix: + assert input.zeek_utils.cache_lines[path]["data"].startswith( + expected_data_prefix + ) @pytest.mark.parametrize( @@ -199,7 +219,7 @@ def test_reached_timeout( @pytest.mark.skipif( "nfdump" not in shutil.which("nfdump"), reason="nfdump is not installed" ) -@pytest.mark.parametrize("path", ["dataset/test1-normal.nfdump"]) +@pytest.mark.parametrize("path", ["dataset/test1-malicious.nfdump"]) def test_handle_nfdump(path): input = ModuleFactory().create_input_obj(path, InputType.NFDUMP) handler = input.input_handlers[InputType.NFDUMP] @@ -371,7 +391,7 @@ def test_give_profiler(line, input_type, expected_line, expected_input_type): assert line_sent["input_type"] == expected_input_type -def test_get_file_handle_existing_file(): +def test_get_file_handle_existing_file(tmp_path): """ Test that the get_file_handle method correctly returns the file handle for an existing file. @@ -379,16 +399,37 @@ def test_get_file_handle_existing_file(): input_process = ModuleFactory().create_input_obj( "", InputType.ZEEK_LOG_FILE ) - filename = "test_file.log" - with open(filename, "w") as f: + test_file = tmp_path / "test_file.log" + with open(test_file, "w") as f: f.write("test content") - file_handle = input_process.zeek_utils.get_file_handle(filename) + file_handle = input_process.zeek_utils.get_file_handle(str(test_file)) assert file_handle is not False - assert file_handle.name == filename + assert file_handle.name == str(test_file) file_handle.close() - os.remove(filename) + + +def test_main_sets_active_handler_and_runs_it(): + input_process = ModuleFactory().create_input_obj( + "", InputType.ZEEK_LOG_FILE + ) + mock_handler = Mock() + input_process.input_handlers[InputType.ZEEK_LOG_FILE] = mock_handler + + assert input_process.main() == 1 + assert input_process.active_handler == mock_handler + mock_handler.run.assert_called_once() + + +def test_main_returns_false_for_unknown_input_type(): + input_process = ModuleFactory().create_input_obj( + "", InputType.ZEEK_LOG_FILE + ) + input_process.input_type = "unsupported-input" + + assert input_process.main() is False + input_process.print.assert_called_once() def test_shutdown_gracefully_delegates_to_handler(): @@ -410,15 +451,13 @@ def test_zeek_log_file_shutdown_closes_handles(): "", InputType.ZEEK_LOG_FILE ) handler = input_process.input_handlers[InputType.ZEEK_LOG_FILE] - input_process.zeek_utils.open_file_handlers = { - "test_file.log": MagicMock() - } + mock_handle = MagicMock() + input_process.zeek_utils.open_file_handles = {"test_file.log": mock_handle} input_process.mark_self_as_done_processing = MagicMock() assert handler.shutdown_gracefully() is True - assert input_process.zeek_utils.open_file_handlers[ - "test_file.log" - ].close.called + mock_handle.close.assert_called_once() + assert input_process.zeek_utils.open_file_handles == {} input_process.mark_self_as_done_processing.assert_called_once() @@ -429,7 +468,7 @@ def test_close_all_handles(): ) mock_handle1 = MagicMock() mock_handle2 = MagicMock() - input_process.zeek_utils.open_file_handlers = { + input_process.zeek_utils.open_file_handles = { "file1": mock_handle1, "file2": mock_handle2, } @@ -472,17 +511,23 @@ def test_get_file_handle_non_existing_file(): assert file_handle is False -def test_ensure_zeek_dir_creates_dir(tmp_path): - """Test that ensure_zeek_dir creates the directory if missing.""" +def test_create_zeek_output_dir_creates_dir(tmp_path): + """Test that create_zeek_output_dir creates the directory if missing.""" input_process = ModuleFactory().create_input_obj( "", InputType.ZEEK_LOG_FILE ) - zeek_dir = tmp_path / "zeek_logs" - input_process.zeek_dir = str(zeek_dir) + input_process.given_path = str(tmp_path / "capture.pcap") + input_process.args.output = str(tmp_path / "output") + input_process.zeek_utils.is_running_non_stop = False + input_process.conf.store_zeek_files_in_the_output_dir.return_value = True - assert not os.path.exists(input_process.zeek_dir) - input_process.zeek_utils.ensure_zeek_dir() - assert os.path.exists(input_process.zeek_dir) + zeek_dir = input_process.zeek_utils.create_zeek_output_dir() + + assert zeek_dir == os.path.join(input_process.args.output, "zeek_files") + assert os.path.exists(zeek_dir) + input_process.db.set_input_metadata.assert_called_once_with( + {"zeek_dir": zeek_dir} + ) def test_check_if_time_to_del_rotated_files_deletes_old_files(): @@ -490,21 +535,19 @@ def test_check_if_time_to_del_rotated_files_deletes_old_files(): input_process = ModuleFactory().create_input_obj( "", InputType.ZEEK_LOG_FILE ) - input_process.keep_rotated_files_for = 0 - input_process.zeek_utils.time_rotated = 1 - input_process.zeek_utils.to_be_deleted = ["old1.log", "old2.log"] + input_process.zeek_utils.rotated_files_to_delete = [ + ("old1.log", 1.0), + ("old2.log", 1.0), + ] with ( - patch( - "slips_files.core.input.zeek.utils.zeek_input_utils.utils.convert_ts_format", - return_value=2, - ), + patch("time.time", return_value=2.0), patch("os.remove") as mock_remove, ): input_process.zeek_utils.check_if_time_to_del_rotated_files() assert mock_remove.call_count == 2 - assert input_process.zeek_utils.to_be_deleted == [] + assert input_process.zeek_utils.rotated_files_to_delete == [] @pytest.mark.parametrize( diff --git a/tests/unit/slips_files/core/input/test_interface_input.py b/tests/unit/slips_files/core/input/test_interface_input.py index b87f64eb7..f3a4c945d 100644 --- a/tests/unit/slips_files/core/input/test_interface_input.py +++ b/tests/unit/slips_files/core/input/test_interface_input.py @@ -10,7 +10,7 @@ def test_interface_input_runs_for_single_interface(tmp_path): input_process.args.interface = "eth0" input_process.args.access_point = False input_process.is_running_non_stop = False - input_process.zeek_utils.ensure_zeek_dir = MagicMock() + input_process.zeek_utils.create_zeek_output_dir = MagicMock() input_process.zeek_utils.init_zeek = MagicMock() input_process.zeek_utils.read_zeek_files = MagicMock(return_value=4) @@ -18,7 +18,7 @@ def test_interface_input_runs_for_single_interface(tmp_path): with patch("os.path.exists", return_value=True): assert handler.run() is True - input_process.zeek_utils.ensure_zeek_dir.assert_called_once() + input_process.zeek_utils.create_zeek_output_dir.assert_called_once() input_process.zeek_utils.init_zeek.assert_called_once() input_process.zeek_utils.read_zeek_files.assert_called_once() assert input_process.lines == 4 diff --git a/tests/unit/slips_files/core/input/test_pcap_input.py b/tests/unit/slips_files/core/input/test_pcap_input.py index b56ab41a9..536923040 100644 --- a/tests/unit/slips_files/core/input/test_pcap_input.py +++ b/tests/unit/slips_files/core/input/test_pcap_input.py @@ -11,14 +11,14 @@ def test_pcap_input_runs_through_zeek_utils(tmp_path): ) input_process.zeek_dir = str(tmp_path) input_process.is_running_non_stop = False - input_process.zeek_utils.ensure_zeek_dir = MagicMock() + input_process.zeek_utils.create_zeek_output_dir = MagicMock() input_process.zeek_utils.init_zeek = MagicMock() input_process.zeek_utils.read_zeek_files = MagicMock(return_value=3) handler = input_process.input_handlers[InputType.PCAP] assert handler.run() is True - input_process.zeek_utils.ensure_zeek_dir.assert_called_once() + input_process.zeek_utils.create_zeek_output_dir.assert_called_once() input_process.zeek_utils.init_zeek.assert_called_once() input_process.zeek_utils.read_zeek_files.assert_called_once() assert input_process.lines == 3 diff --git a/tests/unit/slips_files/core/input/test_zeek_file_remover.py b/tests/unit/slips_files/core/input/test_zeek_file_remover.py index f9d7b1b67..2a3f21ea9 100644 --- a/tests/unit/slips_files/core/input/test_zeek_file_remover.py +++ b/tests/unit/slips_files/core/input/test_zeek_file_remover.py @@ -2,6 +2,9 @@ # SPDX-License-Identifier: GPL-2.0-only import json from unittest.mock import MagicMock, patch + +import pytest + from tests.module_factory import ModuleFactory from slips_files.core.input.zeek.utils.zeek_file_remover import ZeekFileRemover from slips_files.common.input_type import InputType @@ -23,7 +26,23 @@ def test_zeek_file_remover_start_subscribes_once(): assert input_process.channels["remove_old_files"] == "chan" -def test_remove_old_zeek_files_closes_and_marks(): +def test_zeek_file_remover_start_uses_existing_subscription(): + input_process = ModuleFactory().create_input_obj( + "", InputType.ZEEK_LOG_FILE + ) + input_process.channels["remove_old_files"] = "existing-chan" + input_process.db.subscribe = MagicMock(return_value="new-chan") + remover = ZeekFileRemover(input_process, input_process.zeek_utils) + remover.thread.start = MagicMock() + + remover.start() + + input_process.db.subscribe.assert_called_once_with("remove_old_files") + remover.thread.start.assert_called_once() + assert input_process.channels["remove_old_files"] == "new-chan" + + +def test_remove_old_zeek_files_closes_and_schedules_cleanup(): input_process = ModuleFactory().create_input_obj( "", InputType.ZEEK_LOG_FILE ) @@ -33,17 +52,57 @@ def test_remove_old_zeek_files_closes_and_marks(): old_file = "/tmp/conn.2020-01-01.log" new_file = "/tmp/conn.log" - input_process.zeek_utils.open_file_handlers[new_file] = MagicMock() + mock_handle = MagicMock() + input_process.zeek_utils.open_file_handles[new_file] = mock_handle msg = {"data": json.dumps({"old_file": old_file, "new_file": new_file})} input_process.get_msg = MagicMock(return_value=msg) - with patch( - "slips_files.core.input.zeek.utils.zeek_file_remover.utils.convert_ts_format", - return_value=123.0, - ): + with patch("time.time", return_value=123.0): remover.remove_old_zeek_files() - assert input_process.zeek_utils.open_file_handlers.get(new_file) is None - assert old_file in input_process.zeek_utils.to_be_deleted - assert input_process.zeek_utils.time_rotated == 123.0 + mock_handle.close.assert_called_once() + assert input_process.zeek_utils.open_file_handles.get(new_file) is None + assert input_process.zeek_utils.rotated_files_to_delete == [ + (old_file, 123.0 + input_process.keep_rotated_files_for) + ] + + +@pytest.mark.parametrize("keep_rotated_files_for", [0, 5]) +def test_check_if_time_to_del_rotated_files_deletes_ready_files( + keep_rotated_files_for, +): + input_process = ModuleFactory().create_input_obj( + "", InputType.ZEEK_LOG_FILE + ) + input_process.keep_rotated_files_for = keep_rotated_files_for + input_process.zeek_utils.rotated_files_to_delete = [ + ("/tmp/conn.2020-01-01.log", 100.0 + keep_rotated_files_for) + ] + + with patch( + "slips_files.core.input.zeek.utils.zeek_input_utils.utils.convert_ts_format", + return_value=105.0, + ), patch("slips_files.core.input.zeek.utils.zeek_input_utils.os.remove"): + input_process.zeek_utils.check_if_time_to_del_rotated_files() + + assert input_process.zeek_utils.rotated_files_to_delete == [] + + +def test_process_rotation_message_deletes_unsupported_files_immediately(): + input_process = ModuleFactory().create_input_obj( + "", InputType.ZEEK_LOG_FILE + ) + remover = ZeekFileRemover(input_process, input_process.zeek_utils) + old_file = "/tmp/loaded_scripts.2020-01-01.log" + new_file = "/tmp/loaded_scripts.log" + + with patch( + "slips_files.core.input.zeek.utils.zeek_file_remover.os.remove" + ) as mock_remove: + remover.process_rotation_message( + {"old_file": old_file, "new_file": new_file} + ) + + mock_remove.assert_called_once_with(old_file) + assert input_process.zeek_utils.rotated_files_to_delete == [] diff --git a/tests/unit/slips_files/core/input/test_zeek_input_utils.py b/tests/unit/slips_files/core/input/test_zeek_input_utils.py index 61e0a9229..03fb56e8b 100644 --- a/tests/unit/slips_files/core/input/test_zeek_input_utils.py +++ b/tests/unit/slips_files/core/input/test_zeek_input_utils.py @@ -2,8 +2,11 @@ # SPDX-License-Identifier: GPL-2.0-only import json import pytest +from types import SimpleNamespace +from unittest.mock import Mock from tests.module_factory import ModuleFactory from slips_files.common.input_type import InputType +from slips_files.core.input.zeek.utils.zeek_input_utils import ZeekInputUtils @pytest.mark.parametrize( @@ -35,3 +38,65 @@ def test_get_ts_from_line_returns_timestamp_for_tabs(): ts, line = input_process.zeek_utils.get_ts_from_line("1.5\tfield\n") assert ts == 1.5 assert line == "1.5\tfield\n" + + +def test_read_zeek_files_drains_generated_lines_during_live_update(tmp_path): + test_file = tmp_path / "conn.log" + test_file.write_text( + "\n".join( + [ + json.dumps({"ts": 1, "uid": "flow-1"}), + json.dumps({"ts": 2, "uid": "flow-2"}), + "", + ] + ), + encoding="utf-8", + ) + live_update_event = Mock() + live_update_event.is_set.return_value = True + db = Mock() + db.is_running_non_stop.return_value = False + db.get_all_zeek_files.return_value = {str(test_file): "eth0"} + input_process = SimpleNamespace( + args=Mock(), + bro_timeout=100, + conf=Mock(), + db=db, + give_profiler=Mock(), + is_slips_live_updating_event=live_update_event, + is_zeek_tabs=False, + lines=0, + print=Mock(), + should_stop=Mock(return_value=True), + store_flows_read_per_second=Mock(), + ) + zeek_utils = ZeekInputUtils(input_process) + zeek_utils.shutdown_zeek_runtime = Mock() + get_flows_to_skip = Mock(return_value=0) + zeek_utils.dos_protector.get_number_of_flows_to_skip = get_flows_to_skip + + assert zeek_utils.read_zeek_files() == 2 + assert input_process.give_profiler.call_count == 2 + zeek_utils.shutdown_zeek_runtime.assert_called_once() + assert get_flows_to_skip.call_count >= 2 + + +@pytest.mark.parametrize( + "store_in_output, expected_dir", + [ + (True, "output/zeek_files"), + (False, "zeek_files_inputfile"), + ], +) +def test_create_zeek_output_dir(store_in_output, expected_dir): + input_process = ModuleFactory().create_input_obj( + "pcaps/inputfile.pcap", InputType.PCAP + ) + input_process.zeek_dir = None + input_process.args.output = "output" + input_process.zeek_utils.is_running_non_stop = False + input_process.conf.store_zeek_files_in_the_output_dir.return_value = ( + store_in_output + ) + + assert input_process.zeek_utils.create_zeek_output_dir() == expected_dir diff --git a/tests/unit/slips_files/core/test_evidence_handler.py b/tests/unit/slips_files/core/test_evidence_handler.py index e889a1613..070f1636b 100644 --- a/tests/unit/slips_files/core/test_evidence_handler.py +++ b/tests/unit/slips_files/core/test_evidence_handler.py @@ -55,14 +55,14 @@ def test_start_evidence_worker(mock_worker_cls): mock_worker_cls.assert_called_once_with( logger=handler.logger, - output_dir=handler.output_dir, + output_dir=handler.parent_output_dir, redis_port=handler.redis_port, termination_event=handler.termination_event, conf=handler.conf, ppid=handler.ppid, slips_args=handler.args, bloom_filters_manager=handler.bloom_filters, - name="EvidenceHandlerWorker_Process_7", + name="evidence_handler_worker_process_7", evidence_queue=handler.evidence_worker_queue, evidence_logger_q=handler.evidence_logger_q, ) diff --git a/tests/unit/slips_files/core/test_evidence_handler_worker.py b/tests/unit/slips_files/core/test_evidence_handler_worker.py index 4ad9a1fe4..2669e96bf 100644 --- a/tests/unit/slips_files/core/test_evidence_handler_worker.py +++ b/tests/unit/slips_files/core/test_evidence_handler_worker.py @@ -202,6 +202,45 @@ def test_add_alert_to_json_log_file( ) +@pytest.mark.parametrize( + "confidence, expected_output", + [ + (0.80, "High"), + (0.55, "Medium"), + (0.54, "low"), + ], +) +def test_add_evidence_to_json_log_file_maps_confidence_to_string( + confidence, expected_output +): + worker = ModuleFactory().create_evidence_handler_worker_obj() + worker.idmefv2.convert_to_idmef_event = Mock(return_value={"ID": "e1"}) + worker.evidence_logger_q.put = Mock() + worker.add_latency_to_csv = Mock() + evidence = Evidence( + evidence_type=EvidenceType.ARP_SCAN, + description="ARP scan detected", + attacker=Attacker( + direction=Direction.SRC, + ioc_type=IoCType.IP, + value="192.168.1.20", + ), + threat_level=ThreatLevel.INFO, + confidence=confidence, + profile=ProfileID("192.168.1.20"), + timewindow=TimeWindow(1), + uid=["uid1"], + timestamp="2024/10/04 15:45:30.123456+0000", + ) + + worker.add_evidence_to_json_log_file(evidence) + + logged_evidence = worker.evidence_logger_q.put.call_args[0][0]["to_log"] + note = logged_evidence["Note"] + assert '"confidence":' in note + assert f'"confidence": "{expected_output}"' in note + + def test_show_popup(): worker = ModuleFactory().create_evidence_handler_worker_obj() worker.notify = Mock() diff --git a/tests/unit/slips_files/core/test_profiler.py b/tests/unit/slips_files/core/test_profiler.py index 56af98abe..a101defab 100644 --- a/tests/unit/slips_files/core/test_profiler.py +++ b/tests/unit/slips_files/core/test_profiler.py @@ -1,11 +1,11 @@ # SPDX-FileCopyrightText: 2021 Sebastian Garcia # SPDX-License-Identifier: GPL-2.0-only -"""Unit test for slips_files/core/iperformance_profiler.py""" +"""Unit tests for the profiler core process.""" from unittest.mock import Mock, patch -from tests.module_factory import ModuleFactory import pytest +from tests.module_factory import ModuleFactory def mock_print(*args, **kwargs): @@ -136,3 +136,39 @@ def test_notify_observers_with_correct_message(): test_msg = {"action": "test_action"} profiler.notify_observers(test_msg) observer_mock.update.assert_called_once_with(test_msg) + + +@patch("slips_files.core.profiler.ProfilerWorker") +def test_start_profiler_worker_uses_parent_output_dir(mock_worker_cls): + profiler = ModuleFactory().create_profiler_obj() + worker = mock_worker_cls.return_value + profiler.profiler_child_processes = [] + profiler.workers = [] + profiler.profiler_queue = Mock() + profiler.input_handler_obj = Mock() + profiler.aid_queue = Mock() + profiler.aid_manager = Mock() + profiler.is_input_done_event = Mock() + + profiler.start_profiler_worker(7) + + mock_worker_cls.assert_called_once_with( + logger=profiler.logger, + output_dir=profiler.parent_output_dir, + redis_port=profiler.redis_port, + termination_event=profiler.termination_event, + conf=profiler.conf, + ppid=profiler.ppid, + slips_args=profiler.args, + bloom_filters_manager=profiler.bloom_filters, + name="profiler_worker_process_7", + profiler_queue=profiler.profiler_queue, + input_handler=profiler.input_handler_obj, + aid_queue=profiler.aid_queue, + aid_manager=profiler.aid_manager, + is_input_done_event=profiler.is_input_done_event, + ) + worker.start.assert_called_once() + assert profiler.profiler_child_processes == [worker] + assert profiler.workers == [] + profiler.db.increment_profiler_workers_started.assert_called_once() diff --git a/tests/unit/slips_files/core/test_profiler_worker.py b/tests/unit/slips_files/core/test_profiler_worker.py index 847771922..14f96f8fe 100644 --- a/tests/unit/slips_files/core/test_profiler_worker.py +++ b/tests/unit/slips_files/core/test_profiler_worker.py @@ -119,8 +119,8 @@ def test_get_slips_start_time_falls_back_to_now(mock_time): @pytest.mark.parametrize( "name, expected_prefix", [ - ("ProfilerWorker_Process_2", "profiler_worker_2"), - ("ProfilerWorker", "profilerworker"), + ("profiler_worker_process_2", "profiler_worker_2"), + ("profiler_worker", "profiler_worker"), ("mock_name", "mock_name"), ], ) @@ -604,7 +604,7 @@ def test_should_stop_always_returns_false(): def test_pre_main_updates_line_processor_cache(): profiler = ModuleFactory().create_profiler_worker_obj() - profiler.name = "ProfilerWorker_Process_2" + profiler.name = "profiler_worker_process_2" profiler.input_handler.line_processor_cache = {} profiler.db.get_line_processors.return_value = { "conn.log": json.dumps({"ts": 0}) diff --git a/tests/unit/slips_files/core/text_formatters/test_evidence_formatter.py b/tests/unit/slips_files/core/text_formatters/test_evidence_formatter.py index 3ec58af49..0a444294a 100644 --- a/tests/unit/slips_files/core/text_formatters/test_evidence_formatter.py +++ b/tests/unit/slips_files/core/text_formatters/test_evidence_formatter.py @@ -41,7 +41,7 @@ "converted_time IP 192.168.1.1 detected as malicious in timewindow 1" " (start 2023/07/01 12:00:00, stop 2023/07/01 12:05:00) " "given the following evidence:\n" - "\t- Detected Port scan detected threat level: medium. Interface: default.\n", + "\t- Detected Port scan detected Threat level: medium. Interface: default.\n", ), # testcase2: Multiple evidence ( @@ -76,8 +76,8 @@ "converted_time IP 192.168.1.1 detected as malicious in timewindow 1" " (start 2023/07/01 12:00:00, stop 2023/07/01 12:05:00) " "given the following evidence:\n" - "\t- Detected Port scan detected threat level: medium. Interface: default.\n" - "\t- Detected Malicious JA3 fingerprint threat level: high. Interface: default.\n", + "\t- Detected Port scan detected Threat level: medium. Interface: default.\n" + "\t- Detected Malicious JA3 fingerprint Threat level: high. Interface: default.\n", ), ], ) @@ -147,15 +147,15 @@ def test_line_wrap(input_text, expected_output): "threat_level, expected_description", [ # Testcase 1: INFO threat level - (ThreatLevel.INFO, "Original description threat level: info."), + (ThreatLevel.INFO, "Original description Threat level: info."), # Testcase 2: LOW threat level - (ThreatLevel.LOW, "Original description threat level: low."), + (ThreatLevel.LOW, "Original description Threat level: low."), # Testcase 3: MEDIUM threat level - (ThreatLevel.MEDIUM, "Original description threat level: medium."), + (ThreatLevel.MEDIUM, "Original description Threat level: medium."), # Testcase 4: HIGH threat level - (ThreatLevel.HIGH, "Original description threat level: high."), + (ThreatLevel.HIGH, "Original description Threat level: high."), # Testcase 5: CRITICAL threat level - (ThreatLevel.CRITICAL, "Original description threat level: critical."), + (ThreatLevel.CRITICAL, "Original description Threat level: critical."), ], ) def test_add_threat_level_to_evidence_description( diff --git a/update.json b/update.json new file mode 100644 index 000000000..1178023cc --- /dev/null +++ b/update.json @@ -0,0 +1,6 @@ +{ +"version": "1.1.20", +"release_date": "2026-04-30T14:39:56+03:00", +"backwards_compatible": true, +"has_new_dependencies": false, +} diff --git a/webinterface.sh b/webinterface.sh index 61ecc9dd9..3337bb977 100755 --- a/webinterface.sh +++ b/webinterface.sh @@ -1,2 +1,9 @@ #!/bin/bash -python3 -m webinterface.app + +set -e + +if [ -x ".venv/bin/python3" ]; then + .venv/bin/python3 -m webinterface.app +else + python3 -m webinterface.app +fi diff --git a/webinterface/analysis/analysis.py b/webinterface/analysis/analysis.py index de6c2cf76..b35957fb7 100644 --- a/webinterface/analysis/analysis.py +++ b/webinterface/analysis/analysis.py @@ -232,6 +232,8 @@ def set_timeline_flows(ip, timewindow): timestamp = value["starttime"] dt_obj = ts_to_date(timestamp, seconds=True) value["ts"] = dt_obj + value["origstate"] = value.get("origstate", "") + value["allbytes"] = value.get("allbytes", value.get("bytes", 0)) # limit duration decimals duration = float(value["dur"]) diff --git a/webinterface/analysis/static/js/analysis.js b/webinterface/analysis/static/js/analysis.js index 3aecb6138..0b8398f40 100644 --- a/webinterface/analysis/static/js/analysis.js +++ b/webinterface/analysis/static/js/analysis.js @@ -224,9 +224,16 @@ function initProfileTwListeners() { } if (childRowsProfile != null) { childRowsProfile.every(function ( rowIdx, tableLoop, rowLoop ) { - let profile_id = this.data().profile; + let rowData = this.data(); + if (!rowData || !rowData.profile) { + return; + } + + let profile_id = rowData.profile; let profile_id_dash = convertDotToDash(profile_id) - $("#" + profile_id_dash).DataTable().clear().destroy(); + if ($.fn.DataTable.isDataTable("#" + profile_id_dash)) { + $("#" + profile_id_dash).DataTable().clear().destroy(); + } this.child(addTableTWs(profile_id_dash)).show(); let table_tws = $("#" + profile_id_dash).DataTable(analysisSubTableDefs["tw"]); table_tws.ajax.url('/analysis/tws/' + profile_id).load(); @@ -234,7 +241,12 @@ function initProfileTwListeners() { this.nodes().to$().addClass('shown'); }); } - $($(active_tw_id).DataTable().row(active_timewindow_index).node()).addClass('row_selected'); + if (active_tw_id && $.fn.DataTable.isDataTable(active_tw_id)) { + let activeRow = $(active_tw_id).DataTable().row(active_timewindow_index).node(); + if (activeRow) { + $(activeRow).addClass('row_selected'); + } + } childRowsProfile = null; }); }); diff --git a/webinterface/templates/app.html b/webinterface/templates/app.html index 01be82de9..df6651c96 100644 --- a/webinterface/templates/app.html +++ b/webinterface/templates/app.html @@ -62,7 +62,7 @@